Initial commit of GNU Go v3.8.
authorAaron Taylor <ataylor@subgeniuskitty.com>
Tue, 18 May 2021 11:28:02 +0000 (04:28 -0700)
committerAaron Taylor <ataylor@subgeniuskitty.com>
Tue, 18 May 2021 11:28:02 +0000 (04:28 -0700)
2257 files changed:
AUTHORS [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
OSX [new file with mode: 0644]
README [new file with mode: 0644]
THANKS [new file with mode: 0644]
TODO [new file with mode: 0644]
WINDOWS [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
config.h.cmake [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config.vc [new file with mode: 0644]
config.vcin [new file with mode: 0644]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
depcomp [new file with mode: 0755]
doc/Makefile.am [new file with mode: 0644]
doc/Makefile.in [new file with mode: 0644]
doc/analyze.texi [new file with mode: 0644]
doc/api.texi [new file with mode: 0644]
doc/automake-1.4.patch [new file with mode: 0644]
doc/board.texi [new file with mode: 0644]
doc/cdfa.eps [new file with mode: 0644]
doc/cdfa.fig [new file with mode: 0644]
doc/cdfa.jpg [new file with mode: 0644]
doc/cdfa.pdf [new file with mode: 0644]
doc/cdfa.png [new file with mode: 0644]
doc/copying.texi [new file with mode: 0644]
doc/dfa.eps [new file with mode: 0644]
doc/dfa.fig [new file with mode: 0644]
doc/dfa.jpg [new file with mode: 0644]
doc/dfa.pdf [new file with mode: 0644]
doc/dfa.png [new file with mode: 0644]
doc/dfa.texi [new file with mode: 0644]
doc/dfa2.eps [new file with mode: 0644]
doc/dfa2.fig [new file with mode: 0644]
doc/dfa2.jpg [new file with mode: 0644]
doc/dfa2.pdf [new file with mode: 0644]
doc/dfa2.png [new file with mode: 0644]
doc/dragon.texi [new file with mode: 0644]
doc/eyes.texi [new file with mode: 0644]
doc/gnugo.6 [new file with mode: 0644]
doc/gnugo.info [new file with mode: 0644]
doc/gnugo.info-1 [new file with mode: 0644]
doc/gnugo.info-2 [new file with mode: 0644]
doc/gnugo.info-3 [new file with mode: 0644]
doc/gnugo.pod [new file with mode: 0644]
doc/gnugo.texi [new file with mode: 0644]
doc/gtp-commands.sed [new file with mode: 0644]
doc/gtp-commands.texi [new file with mode: 0644]
doc/gtp.texi [new file with mode: 0644]
doc/influence.texi [new file with mode: 0644]
doc/install.texi [new file with mode: 0644]
doc/introduction.texi [new file with mode: 0644]
doc/logo-32.eps [new file with mode: 0644]
doc/logo-32.jpg [new file with mode: 0644]
doc/logo-34.eps [new file with mode: 0644]
doc/logo-34.jpg [new file with mode: 0644]
doc/logo-34.pdf [new file with mode: 0644]
doc/logo-36.eps [new file with mode: 0644]
doc/logo-36.jpg [new file with mode: 0644]
doc/logo-36.pdf [new file with mode: 0644]
doc/montecarlo.texi [new file with mode: 0644]
doc/move_generation.texi [new file with mode: 0644]
doc/moyo.texi [new file with mode: 0644]
doc/newlogo.eps [new file with mode: 0644]
doc/newlogo.jpg [new file with mode: 0644]
doc/oldlogo.eps [new file with mode: 0644]
doc/oldlogo.jpg [new file with mode: 0644]
doc/overview.texi [new file with mode: 0644]
doc/owl.texi [new file with mode: 0644]
doc/path.eps [new file with mode: 0644]
doc/path.fig [new file with mode: 0644]
doc/path.jpg [new file with mode: 0644]
doc/path.pdf [new file with mode: 0644]
doc/path.png [new file with mode: 0644]
doc/patterns.texi [new file with mode: 0644]
doc/reading.texi [new file with mode: 0644]
doc/regression.texi [new file with mode: 0644]
doc/sgf.texi [new file with mode: 0644]
doc/sync-prod1.eps [new file with mode: 0644]
doc/sync-prod1.fig [new file with mode: 0644]
doc/sync-prod1.jpg [new file with mode: 0644]
doc/sync-prod1.pdf [new file with mode: 0644]
doc/sync-prod1.png [new file with mode: 0644]
doc/sync-prod2.eps [new file with mode: 0644]
doc/sync-prod2.fig [new file with mode: 0644]
doc/sync-prod2.jpg [new file with mode: 0644]
doc/sync-prod2.pdf [new file with mode: 0644]
doc/sync-prod2.png [new file with mode: 0644]
doc/texinfo.tex [new file with mode: 0644]
doc/using.texi [new file with mode: 0644]
doc/utils.texi [new file with mode: 0644]
engine/CMakeLists.txt [new file with mode: 0644]
engine/Makefile.am [new file with mode: 0644]
engine/Makefile.in [new file with mode: 0644]
engine/aftermath.c [new file with mode: 0644]
engine/board.c [new file with mode: 0644]
engine/board.dsp [new file with mode: 0644]
engine/board.h [new file with mode: 0644]
engine/boardlib.c [new file with mode: 0644]
engine/breakin.c [new file with mode: 0644]
engine/cache.c [new file with mode: 0644]
engine/cache.h [new file with mode: 0644]
engine/clock.c [new file with mode: 0644]
engine/clock.h [new file with mode: 0644]
engine/combination.c [new file with mode: 0644]
engine/dragon.c [new file with mode: 0644]
engine/endgame.c [new file with mode: 0644]
engine/engine.dsp [new file with mode: 0644]
engine/filllib.c [new file with mode: 0644]
engine/fuseki.c [new file with mode: 0644]
engine/genmove.c [new file with mode: 0644]
engine/globals.c [new file with mode: 0644]
engine/gnugo.h [new file with mode: 0644]
engine/handicap.c [new file with mode: 0644]
engine/hash.c [new file with mode: 0644]
engine/hash.h [new file with mode: 0644]
engine/influence.c [new file with mode: 0644]
engine/influence.h [new file with mode: 0644]
engine/interface.c [new file with mode: 0644]
engine/liberty.h [new file with mode: 0644]
engine/matchpat.c [new file with mode: 0644]
engine/montecarlo.c [new file with mode: 0644]
engine/move_reasons.c [new file with mode: 0644]
engine/move_reasons.h [new file with mode: 0644]
engine/movelist.c [new file with mode: 0644]
engine/optics.c [new file with mode: 0644]
engine/oracle.c [new file with mode: 0644]
engine/owl.c [new file with mode: 0644]
engine/persistent.c [new file with mode: 0644]
engine/printutils.c [new file with mode: 0644]
engine/readconnect.c [new file with mode: 0644]
engine/readconnect.h [new file with mode: 0644]
engine/reading.c [new file with mode: 0644]
engine/semeai.c [new file with mode: 0644]
engine/sgfdecide.c [new file with mode: 0644]
engine/sgffile.c [new file with mode: 0644]
engine/shapes.c [new file with mode: 0644]
engine/showbord.c [new file with mode: 0644]
engine/surround.c [new file with mode: 0644]
engine/unconditional.c [new file with mode: 0644]
engine/utils.c [new file with mode: 0644]
engine/value_moves.c [new file with mode: 0644]
engine/worm.c [new file with mode: 0644]
gnugo.dsw [new file with mode: 0644]
install-sh [new file with mode: 0755]
interface/CMakeLists.txt [new file with mode: 0644]
interface/GoImage/Stone.pm [new file with mode: 0644]
interface/Makefile.am [new file with mode: 0644]
interface/Makefile.in [new file with mode: 0644]
interface/big-xpms/bmoku1.xpm [new file with mode: 0644]
interface/big-xpms/bmoku2.xpm [new file with mode: 0644]
interface/big-xpms/bmoku3.xpm [new file with mode: 0644]
interface/big-xpms/bmoku4.xpm [new file with mode: 0644]
interface/big-xpms/bmoku5.xpm [new file with mode: 0644]
interface/big-xpms/bmoku6.xpm [new file with mode: 0644]
interface/big-xpms/bmoku7.xpm [new file with mode: 0644]
interface/big-xpms/bmoku8.xpm [new file with mode: 0644]
interface/big-xpms/bmoku9.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku1.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku2.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku3.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku4.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku5.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku6.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku7.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku8.xpm [new file with mode: 0644]
interface/big-xpms/bpmoku9.xpm [new file with mode: 0644]
interface/big-xpms/empty1.xpm [new file with mode: 0644]
interface/big-xpms/empty2.xpm [new file with mode: 0644]
interface/big-xpms/empty3.xpm [new file with mode: 0644]
interface/big-xpms/empty4.xpm [new file with mode: 0644]
interface/big-xpms/empty5.xpm [new file with mode: 0644]
interface/big-xpms/empty6.xpm [new file with mode: 0644]
interface/big-xpms/empty7.xpm [new file with mode: 0644]
interface/big-xpms/empty8.xpm [new file with mode: 0644]
interface/big-xpms/empty9.xpm [new file with mode: 0644]
interface/big-xpms/hoshi.xpm [new file with mode: 0644]
interface/big-xpms/wmoku1.xpm [new file with mode: 0644]
interface/big-xpms/wmoku2.xpm [new file with mode: 0644]
interface/big-xpms/wmoku3.xpm [new file with mode: 0644]
interface/big-xpms/wmoku4.xpm [new file with mode: 0644]
interface/big-xpms/wmoku5.xpm [new file with mode: 0644]
interface/big-xpms/wmoku6.xpm [new file with mode: 0644]
interface/big-xpms/wmoku7.xpm [new file with mode: 0644]
interface/big-xpms/wmoku8.xpm [new file with mode: 0644]
interface/big-xpms/wmoku9.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku1.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku2.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku3.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku4.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku5.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku6.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku7.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku8.xpm [new file with mode: 0644]
interface/big-xpms/wpmoku9.xpm [new file with mode: 0644]
interface/gmp.c [new file with mode: 0644]
interface/gmp.h [new file with mode: 0644]
interface/gnugo-big-xpms.el [new file with mode: 0644]
interface/gnugo-xpms.el [new file with mode: 0644]
interface/gnugo.dsp [new file with mode: 0644]
interface/gnugo.el [new file with mode: 0644]
interface/gtp.c [new file with mode: 0644]
interface/gtp.h [new file with mode: 0644]
interface/gtp_examples/2ptkgo.pl [new file with mode: 0644]
interface/gtp_examples/README [new file with mode: 0644]
interface/gtp_examples/gnugo.el [new file with mode: 0644]
interface/gtp_examples/gtp2_6 [new file with mode: 0644]
interface/gtp_examples/matcher_check [new file with mode: 0644]
interface/gtp_examples/metamachine.c [new file with mode: 0644]
interface/gtp_examples/sgf2tst [new file with mode: 0644]
interface/gtp_examples/ttgo.pm [new file with mode: 0644]
interface/gtp_examples/twogtp [new file with mode: 0644]
interface/gtp_examples/twogtp-a [new file with mode: 0644]
interface/gtp_examples/twogtp.pike [new file with mode: 0755]
interface/gtp_examples/twogtp.py [new file with mode: 0644]
interface/gtp_examples/vanilla.c [new file with mode: 0644]
interface/interface.h [new file with mode: 0644]
interface/main.c [new file with mode: 0644]
interface/make-xpms-file.el [new file with mode: 0644]
interface/play_ascii.c [new file with mode: 0644]
interface/play_gmp.c [new file with mode: 0644]
interface/play_gtp.c [new file with mode: 0644]
interface/play_solo.c [new file with mode: 0644]
interface/play_test.c [new file with mode: 0644]
interface/xpms/bmoku1.xpm [new file with mode: 0644]
interface/xpms/bmoku2.xpm [new file with mode: 0644]
interface/xpms/bmoku3.xpm [new file with mode: 0644]
interface/xpms/bmoku4.xpm [new file with mode: 0644]
interface/xpms/bmoku5.xpm [new file with mode: 0644]
interface/xpms/bmoku6.xpm [new file with mode: 0644]
interface/xpms/bmoku7.xpm [new file with mode: 0644]
interface/xpms/bmoku8.xpm [new file with mode: 0644]
interface/xpms/bmoku9.xpm [new file with mode: 0644]
interface/xpms/bpmoku1.xpm [new file with mode: 0644]
interface/xpms/bpmoku2.xpm [new file with mode: 0644]
interface/xpms/bpmoku3.xpm [new file with mode: 0644]
interface/xpms/bpmoku4.xpm [new file with mode: 0644]
interface/xpms/bpmoku5.xpm [new file with mode: 0644]
interface/xpms/bpmoku6.xpm [new file with mode: 0644]
interface/xpms/bpmoku7.xpm [new file with mode: 0644]
interface/xpms/bpmoku8.xpm [new file with mode: 0644]
interface/xpms/bpmoku9.xpm [new file with mode: 0644]
interface/xpms/empty1.xpm [new file with mode: 0644]
interface/xpms/empty2.xpm [new file with mode: 0644]
interface/xpms/empty3.xpm [new file with mode: 0644]
interface/xpms/empty4.xpm [new file with mode: 0644]
interface/xpms/empty5.xpm [new file with mode: 0644]
interface/xpms/empty6.xpm [new file with mode: 0644]
interface/xpms/empty7.xpm [new file with mode: 0644]
interface/xpms/empty8.xpm [new file with mode: 0644]
interface/xpms/empty9.xpm [new file with mode: 0644]
interface/xpms/hoshi.xpm [new file with mode: 0644]
interface/xpms/wmoku1.xpm [new file with mode: 0644]
interface/xpms/wmoku2.xpm [new file with mode: 0644]
interface/xpms/wmoku3.xpm [new file with mode: 0644]
interface/xpms/wmoku4.xpm [new file with mode: 0644]
interface/xpms/wmoku5.xpm [new file with mode: 0644]
interface/xpms/wmoku6.xpm [new file with mode: 0644]
interface/xpms/wmoku7.xpm [new file with mode: 0644]
interface/xpms/wmoku8.xpm [new file with mode: 0644]
interface/xpms/wmoku9.xpm [new file with mode: 0644]
interface/xpms/wpmoku1.xpm [new file with mode: 0644]
interface/xpms/wpmoku2.xpm [new file with mode: 0644]
interface/xpms/wpmoku3.xpm [new file with mode: 0644]
interface/xpms/wpmoku4.xpm [new file with mode: 0644]
interface/xpms/wpmoku5.xpm [new file with mode: 0644]
interface/xpms/wpmoku6.xpm [new file with mode: 0644]
interface/xpms/wpmoku7.xpm [new file with mode: 0644]
interface/xpms/wpmoku8.xpm [new file with mode: 0644]
interface/xpms/wpmoku9.xpm [new file with mode: 0644]
makevcdist.pl [new file with mode: 0755]
missing [new file with mode: 0755]
mkinstalldirs [new file with mode: 0755]
patterns/CMakeLists.txt [new file with mode: 0644]
patterns/Makefile.am [new file with mode: 0644]
patterns/Makefile.in [new file with mode: 0644]
patterns/README [new file with mode: 0644]
patterns/aa_attackpats.db [new file with mode: 0644]
patterns/aa_attackpats.dtr [new file with mode: 0644]
patterns/attack.db [new file with mode: 0644]
patterns/barriers.db [new file with mode: 0644]
patterns/compress_fuseki.c [new file with mode: 0644]
patterns/conn.db [new file with mode: 0644]
patterns/connections.c [new file with mode: 0644]
patterns/defense.db [new file with mode: 0644]
patterns/dfa-mkpat.h [new file with mode: 0644]
patterns/dfa.c [new file with mode: 0644]
patterns/dfa.dsp [new file with mode: 0644]
patterns/dfa.h [new file with mode: 0644]
patterns/endgame.db [new file with mode: 0644]
patterns/extract_fuseki.c [new file with mode: 0644]
patterns/eyes.db [new file with mode: 0644]
patterns/eyes.h [new file with mode: 0644]
patterns/fuseki.db [new file with mode: 0644]
patterns/fuseki.dsp [new file with mode: 0644]
patterns/fuseki13.dbz [new file with mode: 0644]
patterns/fuseki19.dbz [new file with mode: 0644]
patterns/fuseki9.dbz [new file with mode: 0644]
patterns/gnugo-db.el [new file with mode: 0644]
patterns/gogo.db [new file with mode: 0644]
patterns/gogo.sgf [new file with mode: 0644]
patterns/handicap.db [new file with mode: 0644]
patterns/helpers.c [new file with mode: 0644]
patterns/hoshi_keima.db [new file with mode: 0644]
patterns/hoshi_keima.sgf [new file with mode: 0644]
patterns/hoshi_other.db [new file with mode: 0644]
patterns/hoshi_other.sgf [new file with mode: 0644]
patterns/influence.db [new file with mode: 0644]
patterns/joseki.c [new file with mode: 0644]
patterns/joseki.dsp [new file with mode: 0644]
patterns/komoku.db [new file with mode: 0644]
patterns/komoku.sgf [new file with mode: 0644]
patterns/mc_mogo_classic.db [new file with mode: 0644]
patterns/mc_montegnu_classic.db [new file with mode: 0644]
patterns/mc_uniform.db [new file with mode: 0644]
patterns/mkeyes.c [new file with mode: 0644]
patterns/mkeyes.dsp [new file with mode: 0644]
patterns/mkmcpat.c [new file with mode: 0644]
patterns/mkmcpat.dsp [new file with mode: 0644]
patterns/mkpat.c [new file with mode: 0644]
patterns/mkpat.dsp [new file with mode: 0644]
patterns/mokuhazushi.db [new file with mode: 0644]
patterns/mokuhazushi.sgf [new file with mode: 0644]
patterns/oracle.db [new file with mode: 0644]
patterns/owl_attackpats.db [new file with mode: 0644]
patterns/owl_attackpats.dtr [new file with mode: 0644]
patterns/owl_defendpats.db [new file with mode: 0644]
patterns/owl_defendpats.dtr [new file with mode: 0644]
patterns/owl_vital_apats.db [new file with mode: 0644]
patterns/owl_vital_apats.dtr [new file with mode: 0644]
patterns/patterns.db [new file with mode: 0644]
patterns/patterns.dsp [new file with mode: 0644]
patterns/patterns.h [new file with mode: 0644]
patterns/patterns2.db [new file with mode: 0644]
patterns/sansan.db [new file with mode: 0644]
patterns/sansan.sgf [new file with mode: 0644]
patterns/takamoku.db [new file with mode: 0644]
patterns/takamoku.sgf [new file with mode: 0644]
patterns/transform.c [new file with mode: 0644]
patterns/uncompress_fuseki.c [new file with mode: 0644]
patterns/uncompress_fuseki.dsp [new file with mode: 0644]
regression/13x13.tst [new file with mode: 0644]
regression/13x13b.tst [new file with mode: 0644]
regression/13x13c.tst [new file with mode: 0644]
regression/9x9.tst [new file with mode: 0644]
regression/BREAKAGE [new file with mode: 0644]
regression/Makefile.am [new file with mode: 0644]
regression/Makefile.in [new file with mode: 0644]
regression/README [new file with mode: 0644]
regression/STS-RV_0.tst [new file with mode: 0644]
regression/STS-RV_1.tst [new file with mode: 0644]
regression/STS-RV_Misc.tst [new file with mode: 0644]
regression/STS-RV_e.tst [new file with mode: 0644]
regression/arb.tst [new file with mode: 0644]
regression/arend.tst [new file with mode: 0644]
regression/arend2.tst [new file with mode: 0644]
regression/arion.tst [new file with mode: 0644]
regression/atari_atari.tst [new file with mode: 0644]
regression/auto01.tst [new file with mode: 0644]
regression/auto02.tst [new file with mode: 0644]
regression/auto03.tst [new file with mode: 0644]
regression/auto04.tst [new file with mode: 0644]
regression/auto_handtalk.tst [new file with mode: 0644]
regression/benchmark/GnuGo-Aya.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-GORO.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-Go4.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-GoInt.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-GoeMate.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-Haruka.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-KCC.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-Katsunari.gtp [new file with mode: 0644]
regression/benchmark/GnuGo-Martha.gtp [new file with mode: 0644]
regression/benchmark/golois-gnugo.gtp [new file with mode: 0644]
regression/benchmark/great5-gnugo.gtp [new file with mode: 0644]
regression/benchmark/manyfaces-gnugo.gtp [new file with mode: 0644]
regression/blunder.tst [new file with mode: 0644]
regression/break_in.tst [new file with mode: 0644]
regression/breakage2tst.py [new file with mode: 0755]
regression/buzco.tst [new file with mode: 0644]
regression/capture.tst [new file with mode: 0644]
regression/century2002.tst [new file with mode: 0644]
regression/cgf2004.tst [new file with mode: 0644]
regression/connect.tst [new file with mode: 0644]
regression/connection.tst [new file with mode: 0644]
regression/dniwog.tst [new file with mode: 0644]
regression/ego.tst [new file with mode: 0644]
regression/endgame.tst [new file with mode: 0644]
regression/endgame1.tst [new file with mode: 0644]
regression/eval.sh [new file with mode: 0755]
regression/eval3.sh [new file with mode: 0755]
regression/filllib.tst [new file with mode: 0644]
regression/games/9handicap.sgf [new file with mode: 0644]
regression/games/9x9-1.sgf [new file with mode: 0644]
regression/games/9x9-2.sgf [new file with mode: 0644]
regression/games/9x9-3.sgf [new file with mode: 0644]
regression/games/9x9-4.sgf [new file with mode: 0644]
regression/games/9x9-5.sgf [new file with mode: 0644]
regression/games/9x9-6.sgf [new file with mode: 0644]
regression/games/CrazyStone1.sgf [new file with mode: 0644]
regression/games/CrazyStone2.sgf [new file with mode: 0644]
regression/games/FSF-neurogo.sgf [new file with mode: 0644]
regression/games/FSGCBot-dr.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_001.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_002.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_003.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_004.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_005.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_006.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_007.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_008.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_009.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_010.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_011.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_012.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C0_013.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_001.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_002.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_003.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_004.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_005.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_006.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_007.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_008.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_009.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_010.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_011.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_012.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_013.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_014.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_015.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_016.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_017.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_018.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_019.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_020.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_021.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_022.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_023.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_024.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_025.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_026.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_C1_027.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_001.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_002.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_003.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_004.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_005.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_006.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_007.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_008.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_009.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_010.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_011.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_012.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_013.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_014.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_015.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_016.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_017.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_018.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_019.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_020.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_021.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_022.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_023.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_024.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_025.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_026.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_027.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_028.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_029.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_030.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_031.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_032.sgf [new file with mode: 0644]
regression/games/STS-RV/Class01eProblems/_semeai_Ce_033.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_001.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_002.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_003.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_004.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_005.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_006.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_007.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_008.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_009.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_010.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_011.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_012.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_013.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_014.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_015.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_016.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_017.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_018.sgf [new file with mode: 0644]
regression/games/STS-RV/MiscProblems/_semeai_C9_019.sgf [new file with mode: 0644]
regression/games/STS-RV/README [new file with mode: 0644]
regression/games/STS-RV/STS-RV_CREDITS [new file with mode: 0644]
regression/games/STS-RV/STS-RV_README [new file with mode: 0644]
regression/games/TSa.sgf [new file with mode: 0644]
regression/games/ab1_fuseki.sgf [new file with mode: 0644]
regression/games/arb/dumonteil-1.sgf [new file with mode: 0644]
regression/games/arb/dumonteil-2.sgf [new file with mode: 0644]
regression/games/arb/dumonteil-3.sgf [new file with mode: 0644]
regression/games/arb/dumonteil-4.sgf [new file with mode: 0644]
regression/games/arb/dumonteil-5.sgf [new file with mode: 0644]
regression/games/arb/dumonteil-6.sgf [new file with mode: 0644]
regression/games/arb/game01.sgf [new file with mode: 0644]
regression/games/arb/game02.sgf [new file with mode: 0644]
regression/games/arb/game03.sgf [new file with mode: 0644]
regression/games/arb/game04.sgf [new file with mode: 0644]
regression/games/arend/constructed1.sgf [new file with mode: 0644]
regression/games/arend/constructed2.sgf [new file with mode: 0644]
regression/games/arend/constructed3.sgf [new file with mode: 0644]
regression/games/arend/constructed4.sgf [new file with mode: 0644]
regression/games/arend/constructed5.sgf [new file with mode: 0644]
regression/games/arend/constructed6.sgf [new file with mode: 0644]
regression/games/arend/exper1.sgf [new file with mode: 0644]
regression/games/arend/exper2.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo1.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo2.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo4.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo5.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo6.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo7.sgf [new file with mode: 0644]
regression/games/arend/gnugo-gnugo8.sgf [new file with mode: 0644]
regression/games/arion.sgf [new file with mode: 0644]
regression/games/atari-crash.sgf [new file with mode: 0755]
regression/games/atari_atari01.sgf [new file with mode: 0644]
regression/games/atari_atari02.sgf [new file with mode: 0644]
regression/games/atari_atari03.sgf [new file with mode: 0644]
regression/games/atari_atari04.sgf [new file with mode: 0644]
regression/games/atari_atari05.sgf [new file with mode: 0644]
regression/games/atari_atari06.sgf [new file with mode: 0644]
regression/games/atari_atari07.sgf [new file with mode: 0644]
regression/games/atari_atari08.sgf [new file with mode: 0644]
regression/games/atari_atari09.sgf [new file with mode: 0644]
regression/games/atari_atari10.sgf [new file with mode: 0644]
regression/games/auto_gen/auto001.sgf [new file with mode: 0644]
regression/games/auto_gen/auto002.sgf [new file with mode: 0644]
regression/games/auto_gen/auto003.sgf [new file with mode: 0644]
regression/games/auto_gen/auto004.sgf [new file with mode: 0644]
regression/games/auto_gen/auto005.sgf [new file with mode: 0644]
regression/games/auto_gen/auto006.sgf [new file with mode: 0644]
regression/games/auto_gen/auto007.sgf [new file with mode: 0644]
regression/games/auto_gen/auto008.sgf [new file with mode: 0644]
regression/games/auto_gen/auto009.sgf [new file with mode: 0644]
regression/games/auto_gen/auto010.sgf [new file with mode: 0644]
regression/games/auto_gen/auto011.sgf [new file with mode: 0644]
regression/games/auto_gen/auto012.sgf [new file with mode: 0644]
regression/games/auto_gen/auto013.sgf [new file with mode: 0644]
regression/games/auto_gen/auto014.sgf [new file with mode: 0644]
regression/games/auto_gen/auto015.sgf [new file with mode: 0644]
regression/games/auto_gen/auto016.sgf [new file with mode: 0644]
regression/games/auto_gen/auto017.sgf [new file with mode: 0644]
regression/games/auto_gen/auto018.sgf [new file with mode: 0644]
regression/games/auto_gen/auto019.sgf [new file with mode: 0644]
regression/games/auto_gen/auto020.sgf [new file with mode: 0644]
regression/games/auto_gen/auto021.sgf [new file with mode: 0644]
regression/games/auto_gen/auto022.sgf [new file with mode: 0644]
regression/games/bitti-gnug36.sgf [new file with mode: 0644]
regression/games/blunder1.sgf [new file with mode: 0644]
regression/games/blunder10.sgf [new file with mode: 0644]
regression/games/blunder11.sgf [new file with mode: 0644]
regression/games/blunder12.sgf [new file with mode: 0644]
regression/games/blunder13.sgf [new file with mode: 0644]
regression/games/blunder14.sgf [new file with mode: 0644]
regression/games/blunder15.sgf [new file with mode: 0644]
regression/games/blunder16.sgf [new file with mode: 0644]
regression/games/blunder17.sgf [new file with mode: 0644]
regression/games/blunder18.sgf [new file with mode: 0644]
regression/games/blunder19.sgf [new file with mode: 0644]
regression/games/blunder2.sgf [new file with mode: 0644]
regression/games/blunder20.sgf [new file with mode: 0644]
regression/games/blunder21.sgf [new file with mode: 0644]
regression/games/blunder22.sgf [new file with mode: 0644]
regression/games/blunder23.sgf [new file with mode: 0644]
regression/games/blunder24.sgf [new file with mode: 0644]
regression/games/blunder25.sgf [new file with mode: 0755]
regression/games/blunder3.sgf [new file with mode: 0644]
regression/games/blunder4.sgf [new file with mode: 0644]
regression/games/blunder5.sgf [new file with mode: 0644]
regression/games/blunder6.sgf [new file with mode: 0644]
regression/games/blunder7.sgf [new file with mode: 0644]
regression/games/blunder8.sgf [new file with mode: 0644]
regression/games/blunder9.sgf [new file with mode: 0644]
regression/games/boardspace/GNUGo-GoFigure0.1-200503171816.sgf [new file with mode: 0644]
regression/games/boardspace/GNUGo-GoFigure0.1-200503181316.sgf [new file with mode: 0644]
regression/games/boardspace/GNUGo-GoFigure0.1-200503181614.sgf [new file with mode: 0644]
regression/games/boardspace/GNUGo-GoFigure0.1-200503302359.sgf [new file with mode: 0644]
regression/games/boardspace/GoFigure0.1-GNUGo-200503211944.sgf [new file with mode: 0644]
regression/games/break_in.sgf [new file with mode: 0644]
regression/games/bretz.sgf [new file with mode: 0644]
regression/games/buzco1.sgf [new file with mode: 0644]
regression/games/century21-2002/gnugo-go4.sgf [new file with mode: 0644]
regression/games/century21-2002/gnugo-katsunari.sgf [new file with mode: 0644]
regression/games/century21-2002/gnugo-tsgo.sgf [new file with mode: 0644]
regression/games/century21-2002/goint-gnugo.sgf [new file with mode: 0644]
regression/games/century21-2002/golois-gnugo.sgf [new file with mode: 0644]
regression/games/century21-2002/great5-gnugo.sgf [new file with mode: 0644]
regression/games/century21-2002/manyfaces-gnugo.sgf [new file with mode: 0644]
regression/games/century21/README [new file with mode: 0644]
regression/games/century21/gnugo-aya.sgf [new file with mode: 0644]
regression/games/century21/gnugo-explorer.sgf [new file with mode: 0644]
regression/games/century21/gnugo-go4.sgf [new file with mode: 0644]
regression/games/century21/gnugo-gointellect.sgf [new file with mode: 0644]
regression/games/century21/gnugo-smartgo.sgf [new file with mode: 0644]
regression/games/century21/gnugo-wulu.sgf [new file with mode: 0644]
regression/games/cgf2001/aya.sgf [new file with mode: 0644]
regression/games/cgf2001/goro.sgf [new file with mode: 0644]
regression/games/cgf2001/haruka.sgf [new file with mode: 0644]
regression/games/cgf2001/image.sgf [new file with mode: 0644]
regression/games/cgf2001/katsunari.sgf [new file with mode: 0644]
regression/games/cgf2002/Aya.sgf [new file with mode: 0644]
regression/games/cgf2002/Caren.sgf [new file with mode: 0644]
regression/games/cgf2002/Image.sgf [new file with mode: 0644]
regression/games/cgf2002/gnu-and.sgf [new file with mode: 0644]
regression/games/cgf2002/gnu-har.sgf [new file with mode: 0644]
regression/games/cgf2002/kat-gnu.sgf [new file with mode: 0644]
regression/games/cgf2002/martha.sgf [new file with mode: 0644]
regression/games/cgf2002/shi-gnu.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-Aya.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-GORO.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-Go4.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-GoInt.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-GoeMate.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-Haruka.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-KCC.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-Katsunari.sgf [new file with mode: 0644]
regression/games/cgf2003/GnuGo-Martha.sgf [new file with mode: 0644]
regression/games/cgf2004/aya.sgf [new file with mode: 0644]
regression/games/cgf2004/caren.sgf [new file with mode: 0644]
regression/games/cgf2004/gargoyle.sgf [new file with mode: 0644]
regression/games/cgf2004/gorimutyu.sgf [new file with mode: 0644]
regression/games/cgf2004/goro.sgf [new file with mode: 0644]
regression/games/cgf2004/katsunari.sgf [new file with mode: 0644]
regression/games/cgf2004/martha.sgf [new file with mode: 0644]
regression/games/cgf2004/result.txt [new file with mode: 0644]
regression/games/cgf2004/shikosakugo.sgf [new file with mode: 0644]
regression/games/cgf2005/19x19/aya.sgf [new file with mode: 0644]
regression/games/cgf2005/19x19/caren.sgf [new file with mode: 0644]
regression/games/cgf2005/19x19/katsunari.sgf [new file with mode: 0644]
regression/games/cgf2005/19x19/shiko.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/aya1.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/aya2.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/caren1.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/caren2.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/katsunari1.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/katsunari2.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/shiko1.sgf [new file with mode: 0644]
regression/games/cgf2005/9x9/shiko2.sgf [new file with mode: 0644]
regression/games/cgos/13435.sgf [new file with mode: 0644]
regression/games/cgos/14198.sgf [new file with mode: 0644]
regression/games/cgos/25811.sgf [new file with mode: 0644]
regression/games/cgos/26449.sgf [new file with mode: 0644]
regression/games/cgos/30527.sgf [new file with mode: 0644]
regression/games/cgos/31446.sgf [new file with mode: 0644]
regression/games/cgos/37169.sgf [new file with mode: 0644]
regression/games/cgos/390115.sgf [new file with mode: 0644]
regression/games/cgos/403788.sgf [new file with mode: 0644]
regression/games/cgos/42896.sgf [new file with mode: 0644]
regression/games/cgos/471085.sgf [new file with mode: 0644]
regression/games/cgos/58273.sgf [new file with mode: 0644]
regression/games/cgos/60311.sgf [new file with mode: 0644]
regression/games/cgos/879.sgf [new file with mode: 0644]
regression/games/cgos/994.sgf [new file with mode: 0644]
regression/games/connection1.sgf [new file with mode: 0644]
regression/games/connection2.sgf [new file with mode: 0644]
regression/games/connection3.sgf [new file with mode: 0644]
regression/games/connection4.sgf [new file with mode: 0644]
regression/games/disaster.sgf [new file with mode: 0644]
regression/games/dniwog.sgf [new file with mode: 0644]
regression/games/doublecut.sgf [new file with mode: 0644]
regression/games/doublecut2.sgf [new file with mode: 0644]
regression/games/doubleko.sgf [new file with mode: 0644]
regression/games/dragon1.sgf [new file with mode: 0644]
regression/games/dublin1.sgf [new file with mode: 0644]
regression/games/dublin2.sgf [new file with mode: 0644]
regression/games/edge_defense1.sgf [new file with mode: 0644]
regression/games/egc2001/au-gg.sgf [new file with mode: 0644]
regression/games/egc2001/gg-dr.sgf [new file with mode: 0644]
regression/games/egc2001/gg-ga.sgf [new file with mode: 0644]
regression/games/egc2001/gg-ts.sgf [new file with mode: 0644]
regression/games/egc2001/gs-gg.sgf [new file with mode: 0644]
regression/games/egc2001/tg-gg.sgf [new file with mode: 0644]
regression/games/ego.sgf [new file with mode: 0644]
regression/games/ego2.sgf [new file with mode: 0644]
regression/games/ego3.sgf [new file with mode: 0644]
regression/games/endgame10.sgf [new file with mode: 0644]
regression/games/endgame11.sgf [new file with mode: 0644]
regression/games/endgame12.sgf [new file with mode: 0644]
regression/games/endgame13.sgf [new file with mode: 0644]
regression/games/endgame14.sgf [new file with mode: 0755]
regression/games/endgame2.sgf [new file with mode: 0644]
regression/games/endgame3.sgf [new file with mode: 0644]
regression/games/endgame4.sgf [new file with mode: 0644]
regression/games/endgame5.sgf [new file with mode: 0644]
regression/games/endgame6.sgf [new file with mode: 0644]
regression/games/endgame7.sgf [new file with mode: 0644]
regression/games/endgame8.sgf [new file with mode: 0644]
regression/games/endgame9.sgf [new file with mode: 0644]
regression/games/explorer.sgf [new file with mode: 0644]
regression/games/explorer2.sgf [new file with mode: 0644]
regression/games/eyes1.sgf [new file with mode: 0644]
regression/games/eyes2.sgf [new file with mode: 0644]
regression/games/eyes3.sgf [new file with mode: 0644]
regression/games/eyes_edge.sgf [new file with mode: 0644]
regression/games/filllib1.sgf [new file with mode: 0644]
regression/games/filllib10.sgf [new file with mode: 0644]
regression/games/filllib11.sgf [new file with mode: 0644]
regression/games/filllib12.sgf [new file with mode: 0644]
regression/games/filllib13.sgf [new file with mode: 0644]
regression/games/filllib14.sgf [new file with mode: 0644]
regression/games/filllib15.sgf [new file with mode: 0644]
regression/games/filllib16.sgf [new file with mode: 0644]
regression/games/filllib17.sgf [new file with mode: 0644]
regression/games/filllib18.sgf [new file with mode: 0644]
regression/games/filllib19.sgf [new file with mode: 0644]
regression/games/filllib2.sgf [new file with mode: 0644]
regression/games/filllib3.sgf [new file with mode: 0644]
regression/games/filllib4.sgf [new file with mode: 0644]
regression/games/filllib5.sgf [new file with mode: 0644]
regression/games/filllib6.sgf [new file with mode: 0644]
regression/games/filllib7.sgf [new file with mode: 0644]
regression/games/filllib8.sgf [new file with mode: 0644]
regression/games/filllib9.sgf [new file with mode: 0644]
regression/games/gg-040225.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-aya.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-daigo.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-goint.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-igoppi.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-katsu.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-kccigo.sgf [new file with mode: 0644]
regression/games/gifu2005/gnugo-nanasi.sgf [new file with mode: 0644]
regression/games/gifu2005/gostar-gnugo.sgf [new file with mode: 0644]
regression/games/gifu2005/mfg-gnugo.sgf [new file with mode: 0644]
regression/games/gifu2006/caren-gnugo.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-aya.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-gorimu.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-igoist.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-indigo.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-katsu.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-kccigo.sgf [new file with mode: 0644]
regression/games/gifu2006/gnugo-nanasi.sgf [new file with mode: 0644]
regression/games/gifu2006/shikou-gnugo.sgf [new file with mode: 0644]
regression/games/glop.sgf [new file with mode: 0644]
regression/games/golife.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar1.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar10.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar11.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar12.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar13.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar14.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar15.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar16.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar17.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar18.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar19.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar2.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar20.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar21.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar22.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar3.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar4.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar5.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar6.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar7.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar8.sgf [new file with mode: 0644]
regression/games/gunnar/gunnar9.sgf [new file with mode: 0644]
regression/games/gunnar/rbm-bobk-200303111815.sgf [new file with mode: 0644]
regression/games/gwe.sgf [new file with mode: 0644]
regression/games/hamete_joseki.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk1.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk10.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk11.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk12.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk13.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk14.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk15.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk17.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk18.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk19.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk2.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk20.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk21.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk22.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk23.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk24.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk25.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk26.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk27.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk3.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk4.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk5.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk6.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk7.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk8.sgf [new file with mode: 0644]
regression/games/handtalk/handtalk9.sgf [new file with mode: 0644]
regression/games/heikki/heikki01.sgf [new file with mode: 0644]
regression/games/iken-tobi.sgf [new file with mode: 0644]
regression/games/incident104.sgf [new file with mode: 0644]
regression/games/incident107.sgf [new file with mode: 0644]
regression/games/incident108b.sgf [new file with mode: 0644]
regression/games/incident114.sgf [new file with mode: 0644]
regression/games/incident118.sgf [new file with mode: 0644]
regression/games/incident121.sgf [new file with mode: 0644]
regression/games/incident144.sgf [new file with mode: 0644]
regression/games/incident153.sgf [new file with mode: 0644]
regression/games/incident156.sgf [new file with mode: 0644]
regression/games/incident161.sgf [new file with mode: 0644]
regression/games/incident165.sgf [new file with mode: 0644]
regression/games/incident169.sgf [new file with mode: 0644]
regression/games/incident185.sgf [new file with mode: 0644]
regression/games/incident186.sgf [new file with mode: 0644]
regression/games/incident187.sgf [new file with mode: 0644]
regression/games/incident189.sgf [new file with mode: 0644]
regression/games/incident198.sgf [new file with mode: 0644]
regression/games/incident199.sgf [new file with mode: 0644]
regression/games/incident2.sgf [new file with mode: 0644]
regression/games/incident201.sgf [new file with mode: 0644]
regression/games/incident209.sgf [new file with mode: 0644]
regression/games/incident211.sgf [new file with mode: 0644]
regression/games/incident218.sgf [new file with mode: 0644]
regression/games/incident221.sgf [new file with mode: 0644]
regression/games/incident223.sgf [new file with mode: 0644]
regression/games/incident225.sgf [new file with mode: 0644]
regression/games/incident231.sgf [new file with mode: 0644]
regression/games/incident234.sgf [new file with mode: 0644]
regression/games/incident235.sgf [new file with mode: 0644]
regression/games/incident236.sgf [new file with mode: 0644]
regression/games/incident237.sgf [new file with mode: 0644]
regression/games/incident238.sgf [new file with mode: 0644]
regression/games/incident239.sgf [new file with mode: 0644]
regression/games/incident240.sgf [new file with mode: 0644]
regression/games/incident246.sgf [new file with mode: 0644]
regression/games/incident248.sgf [new file with mode: 0644]
regression/games/incident251.sgf [new file with mode: 0644]
regression/games/incident252.sgf [new file with mode: 0644]
regression/games/incident253.sgf [new file with mode: 0644]
regression/games/incident254.sgf [new file with mode: 0644]
regression/games/incident256.sgf [new file with mode: 0644]
regression/games/incident258.sgf [new file with mode: 0644]
regression/games/incident261.sgf [new file with mode: 0644]
regression/games/incident262.sgf [new file with mode: 0644]
regression/games/incident263.sgf [new file with mode: 0644]
regression/games/incident267.sgf [new file with mode: 0644]
regression/games/incident269.sgf [new file with mode: 0644]
regression/games/incident272.sgf [new file with mode: 0644]
regression/games/incident278.sgf [new file with mode: 0644]
regression/games/incident287.sgf [new file with mode: 0644]
regression/games/incident290.sgf [new file with mode: 0644]
regression/games/incident291.sgf [new file with mode: 0644]
regression/games/incident297.sgf [new file with mode: 0644]
regression/games/incident42.sgf [new file with mode: 0644]
regression/games/incident55.sgf [new file with mode: 0644]
regression/games/incident59.sgf [new file with mode: 0644]
regression/games/incident64.sgf [new file with mode: 0644]
regression/games/incident66.sgf [new file with mode: 0644]
regression/games/incident67.sgf [new file with mode: 0644]
regression/games/incident72.sgf [new file with mode: 0644]
regression/games/incident73.sgf [new file with mode: 0644]
regression/games/incident74.sgf [new file with mode: 0644]
regression/games/incident79.sgf [new file with mode: 0644]
regression/games/incident80.sgf [new file with mode: 0644]
regression/games/incident82.sgf [new file with mode: 0644]
regression/games/incident84.sgf [new file with mode: 0644]
regression/games/incident85.sgf [new file with mode: 0644]
regression/games/incident91.sgf [new file with mode: 0644]
regression/games/incident92.sgf [new file with mode: 0644]
regression/games/incident93.sgf [new file with mode: 0644]
regression/games/incident94.sgf [new file with mode: 0644]
regression/games/incident96.sgf [new file with mode: 0644]
regression/games/incident97.sgf [new file with mode: 0644]
regression/games/jahy.sgf [new file with mode: 0644]
regression/games/joseki01.sgf [new file with mode: 0644]
regression/games/juka1.sgf [new file with mode: 0644]
regression/games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf [new file with mode: 0644]
regression/games/kgs/2004-04-10-Shun9137-GnuGoCVS.sgf [new file with mode: 0644]
regression/games/kgs/2004-04-28-R-dokuganryu-GnuGoCVS.sgf [new file with mode: 0644]
regression/games/kgs/20040507-GnuGoCVS-read.sgf [new file with mode: 0644]
regression/games/kgs/20040516-GoBucks-GnuGoCVS.sgf [new file with mode: 0644]
regression/games/kgs/20040517-siRNA-GnuGoCVS.sgf [new file with mode: 0644]
regression/games/kgs/20040525-fanfan-GnuGoBot.sgf [new file with mode: 0644]
regression/games/kgs/20050407-tfujii-GNU.sgf [new file with mode: 0644]
regression/games/kgs/20050408-GNU-mamassang.sgf [new file with mode: 0644]
regression/games/kgs/20050408-janine-GNU.sgf [new file with mode: 0644]
regression/games/kgs/20050408-wrf6041-GNU.sgf [new file with mode: 0644]
regression/games/kgs/Erro-TheGNUGo.sgf [new file with mode: 0644]
regression/games/kgs/GNU-HISOKA10.sgf [new file with mode: 0644]
regression/games/kgs/GNU-bassanio.sgf [new file with mode: 0644]
regression/games/kgs/GNU-goodluck.sgf [new file with mode: 0644]
regression/games/kgs/GNU-higher.sgf [new file with mode: 0644]
regression/games/kgs/GNU-ituyosi.sgf [new file with mode: 0644]
regression/games/kgs/GNU-ituyosi2.sgf [new file with mode: 0644]
regression/games/kgs/GNU-ivanho.sgf [new file with mode: 0644]
regression/games/kgs/GNU-marfan.sgf [new file with mode: 0644]
regression/games/kgs/GNU-merlenoir.sgf [new file with mode: 0644]
regression/games/kgs/GNU-minautore.sgf [new file with mode: 0644]
regression/games/kgs/GNU-namascae.sgf [new file with mode: 0644]
regression/games/kgs/GNU-roidesnems.sgf [new file with mode: 0644]
regression/games/kgs/GNU-tadf.sgf [new file with mode: 0644]
regression/games/kgs/GnuGoCVS-john.sgf [new file with mode: 0644]
regression/games/kgs/Hosbodar-GNU.sgf [new file with mode: 0644]
regression/games/kgs/JMBE-GNU.sgf [new file with mode: 0644]
regression/games/kgs/Kuksa-GNU.sgf [new file with mode: 0644]
regression/games/kgs/PsyDuck-GNU.sgf [new file with mode: 0644]
regression/games/kgs/SURARIN-yagr.sgf [new file with mode: 0644]
regression/games/kgs/TheGNUGo-Botkiller3.sgf [new file with mode: 0644]
regression/games/kgs/TheGNUGo-JVD.sgf [new file with mode: 0644]
regression/games/kgs/TheGNUGo-grasshoper.sgf [new file with mode: 0644]
regression/games/kgs/TheGNUGo-qsdf.sgf [new file with mode: 0644]
regression/games/kgs/TheGNUGo-rcsteppat.sgf [new file with mode: 0644]
regression/games/kgs/TheGNUGo-up.sgf [new file with mode: 0644]
regression/games/kgs/ben9992000-GNU.sgf [new file with mode: 0644]
regression/games/kgs/dogo-TheGNUGo.sgf [new file with mode: 0644]
regression/games/kgs/evand-TheGNUGo.sgf [new file with mode: 0644]
regression/games/kgs/geluba-yagr.sgf [new file with mode: 0644]
regression/games/kgs/haiku-GNU.sgf [new file with mode: 0644]
regression/games/kgs/koketto-GNU.sgf [new file with mode: 0644]
regression/games/kgs/llk-GNU.sgf [new file with mode: 0644]
regression/games/kgs/malitourne-yagr.sgf [new file with mode: 0644]
regression/games/kgs/maproom-gnugo3pt6.sgf [new file with mode: 0644]
regression/games/kgs/melonhead1-GNU.sgf [new file with mode: 0644]
regression/games/kgs/munchie-GNU.sgf [new file with mode: 0644]
regression/games/kgs/perler-GNU.sgf [new file with mode: 0644]
regression/games/kgs/sade-GNU.sgf [new file with mode: 0644]
regression/games/kgs/simat-TheGNUGo.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/ExBot-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/GNU-AyaBot.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/GNU-NeuroGo.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/GNU-viking5.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/IdiotBot-TheGNUGo.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/TheGNUGo-Dariush.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/TheGNUGo-HouseBot.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/TheGNUGo-SimpleBot.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/TheGNUGo-StoneCrazy.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/WeakBot50k-TheGNUGo.sgf [new file with mode: 0644]
regression/games/kgs/tournament10/tlsBot-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament11/CrazyStone-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament11/GNU-CrazyStone.sgf [new file with mode: 0644]
regression/games/kgs/tournament11/GNU-firstgo.sgf [new file with mode: 0644]
regression/games/kgs/tournament11/GNU-viking5-1.sgf [new file with mode: 0644]
regression/games/kgs/tournament11/GNU-viking5-2.sgf [new file with mode: 0644]
regression/games/kgs/tournament11/firstgo-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/CrazyStone-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/GNU-AyaBot.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/GNU-Dar51.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/GNU-ExBot.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/firstgo-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/indigoBot-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/tlsBot-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament8/viking5-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament9/Dar51-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament9/GNU-AyaBot.sgf [new file with mode: 0644]
regression/games/kgs/tournament9/gopp-GNU.sgf [new file with mode: 0644]
regression/games/kgs/tournament9/indigoBot-GNU.sgf [new file with mode: 0644]
regression/games/kgs/yagr-FKleolio.sgf [new file with mode: 0644]
regression/games/kgs/yagr-Kazik.sgf [new file with mode: 0644]
regression/games/kgs/yagr-Mythenmetz.2.sgf [new file with mode: 0644]
regression/games/kgs/yagr-Mythenmetz.sgf [new file with mode: 0644]
regression/games/kgs/yagr-Rayden.sgf [new file with mode: 0644]
regression/games/kgs/yagr-Sapojnik.sgf [new file with mode: 0644]
regression/games/kgs/yagr-awf.sgf [new file with mode: 0644]
regression/games/kgs/yagr-czarny.sgf [new file with mode: 0644]
regression/games/kgs/yagr-digibier.sgf [new file with mode: 0644]
regression/games/kgs/yagr-eddyy.sgf [new file with mode: 0644]
regression/games/kgs/yagr-gab9.2.sgf [new file with mode: 0644]
regression/games/kgs/yagr-gab9.sgf [new file with mode: 0644]
regression/games/kgs/yagr-hasenhirn.sgf [new file with mode: 0644]
regression/games/kgs/yagr-ituyosi.sgf [new file with mode: 0644]
regression/games/kgs/yagr-justre1.sgf [new file with mode: 0644]
regression/games/kgs/yagr-nigiri.sgf [new file with mode: 0644]
regression/games/kgs/yagr-r08ert.sgf [new file with mode: 0644]
regression/games/kgs/yagr-yudeta.sgf [new file with mode: 0644]
regression/games/kgs/yagr.sgf [new file with mode: 0644]
regression/games/kgs/yagr2.sgf [new file with mode: 0644]
regression/games/kgs/yagr3.sgf [new file with mode: 0644]
regression/games/kgs/yagr4.sgf [new file with mode: 0644]
regression/games/kgs/yagr5.sgf [new file with mode: 0644]
regression/games/kisei28_g7.sgf [new file with mode: 0644]
regression/games/ko1.sgf [new file with mode: 0644]
regression/games/ko2.sgf [new file with mode: 0644]
regression/games/ko3.sgf [new file with mode: 0644]
regression/games/ko4.sgf [new file with mode: 0644]
regression/games/ko5.sgf [new file with mode: 0644]
regression/games/ko6.sgf [new file with mode: 0644]
regression/games/ladder1.sgf [new file with mode: 0644]
regression/games/life1.sgf [new file with mode: 0644]
regression/games/life_and_death/comb1.sgf [new file with mode: 0644]
regression/games/life_and_death/eye1.sgf [new file with mode: 0644]
regression/games/life_and_death/invasion1.sgf [new file with mode: 0644]
regression/games/life_and_death/invasion2.sgf [new file with mode: 0644]
regression/games/life_and_death/invasion3.sgf [new file with mode: 0644]
regression/games/life_and_death/invasion4.sgf [new file with mode: 0644]
regression/games/life_and_death/ld1.sgf [new file with mode: 0644]
regression/games/life_and_death/ld10.sgf [new file with mode: 0644]
regression/games/life_and_death/ld11.sgf [new file with mode: 0644]
regression/games/life_and_death/ld12.sgf [new file with mode: 0644]
regression/games/life_and_death/ld13.sgf [new file with mode: 0644]
regression/games/life_and_death/ld14.sgf [new file with mode: 0644]
regression/games/life_and_death/ld15.sgf [new file with mode: 0644]
regression/games/life_and_death/ld16.sgf [new file with mode: 0644]
regression/games/life_and_death/ld17.sgf [new file with mode: 0644]
regression/games/life_and_death/ld18.sgf [new file with mode: 0644]
regression/games/life_and_death/ld19.sgf [new file with mode: 0644]
regression/games/life_and_death/ld2.sgf [new file with mode: 0644]
regression/games/life_and_death/ld20.sgf [new file with mode: 0644]
regression/games/life_and_death/ld3.sgf [new file with mode: 0644]
regression/games/life_and_death/ld4.sgf [new file with mode: 0644]
regression/games/life_and_death/ld5.sgf [new file with mode: 0644]
regression/games/life_and_death/ld6.sgf [new file with mode: 0644]
regression/games/life_and_death/ld7.sgf [new file with mode: 0644]
regression/games/life_and_death/ld8.sgf [new file with mode: 0644]
regression/games/life_and_death/ld9.sgf [new file with mode: 0644]
regression/games/life_and_death/ld9_variations.sgf [new file with mode: 0644]
regression/games/life_and_death/lunches.sgf [new file with mode: 0644]
regression/games/life_and_death/mixed1.sgf [new file with mode: 0644]
regression/games/life_and_death/mixed2.sgf [new file with mode: 0644]
regression/games/life_and_death/mixed3.sgf [new file with mode: 0644]
regression/games/life_and_death/mixed4.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod1.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod2.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod3.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod4.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod5.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod6.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod7.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod8.sgf [new file with mode: 0644]
regression/games/life_and_death/tripod9.sgf [new file with mode: 0644]
regression/games/lordofpi.sgf [new file with mode: 0644]
regression/games/manner.sgf [new file with mode: 0644]
regression/games/marginal.sgf [new file with mode: 0644]
regression/games/marginal_ko.sgf [new file with mode: 0644]
regression/games/me.sgf [new file with mode: 0644]
regression/games/mertin13x13/DAGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/DAGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/DAGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GAGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GAGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GAGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GHGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GHGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GHGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GIGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GIGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GIGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GMGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GMGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GMGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNDA1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNDA2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNDA3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGA1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGA2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGA3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGH1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGH2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGH3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGI1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGI2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGI3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGM1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGM2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGM3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGP1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGP3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGP5.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGX1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGX2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNGX3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNHT1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNHT2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNHT3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNMF1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNMF2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNMF3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNWL1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNWL2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GNWL3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GPGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GPGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/GPGN5.sgf [new file with mode: 0644]
regression/games/mertin13x13/GXGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/GXGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/GXGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/HTGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/HTGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/HTGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/MFGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/MFGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/MFGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/WLGN1.sgf [new file with mode: 0644]
regression/games/mertin13x13/WLGN2.sgf [new file with mode: 0644]
regression/games/mertin13x13/WLGN3.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-gointellect1.W+28.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-gointellect2.W+2.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-gointellect3.W+37.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-goliath1.W+11.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-goliath2.W+38.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-goliath3.B+16.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-katsunari1.B+21.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-katsunari2.B+66.sgf [new file with mode: 0644]
regression/games/mertin13x13/gnugo-katsunari3.B+13.sgf [new file with mode: 0644]
regression/games/mertin13x13/gointellect-gnugo1.B+14.sgf [new file with mode: 0644]
regression/games/mertin13x13/gointellect-gnugo2.W+8.sgf [new file with mode: 0644]
regression/games/mertin13x13/gointellect-gnugo3.B+1.sgf [new file with mode: 0644]
regression/games/mertin13x13/goliath-gnugo1.B+11.sgf [new file with mode: 0644]
regression/games/mertin13x13/goliath-gnugo2.W+9.sgf [new file with mode: 0644]
regression/games/mertin13x13/goliath-gnugo3.W+0.sgf [new file with mode: 0644]
regression/games/mertin13x13/katsunari-gnugo1.W+45.sgf [new file with mode: 0644]
regression/games/mertin13x13/katsunari-gnugo2.W+4.sgf [new file with mode: 0644]
regression/games/mertin13x13/katsunari-gnugo3.B+14.sgf [new file with mode: 0644]
regression/games/mf1.sgf [new file with mode: 0644]
regression/games/mfgg1.sgf [new file with mode: 0644]
regression/games/mfgg2.sgf [new file with mode: 0644]
regression/games/mfgg3.sgf [new file with mode: 0644]
regression/games/nando/auto001.sgf [new file with mode: 0644]
regression/games/nando/auto002.sgf [new file with mode: 0644]
regression/games/nando/auto003.sgf [new file with mode: 0644]
regression/games/nando/auto004.sgf [new file with mode: 0644]
regression/games/nando/auto005.sgf [new file with mode: 0644]
regression/games/nando/auto006.sgf [new file with mode: 0644]
regression/games/nando/auto007.sgf [new file with mode: 0644]
regression/games/nando/auto008.sgf [new file with mode: 0644]
regression/games/nando/auto009.sgf [new file with mode: 0644]
regression/games/nando/auto010.sgf [new file with mode: 0644]
regression/games/nando/auto011.sgf [new file with mode: 0644]
regression/games/nando/auto012.sgf [new file with mode: 0644]
regression/games/nando/auto013.sgf [new file with mode: 0644]
regression/games/nando/auto014.sgf [new file with mode: 0644]
regression/games/nando/auto015.sgf [new file with mode: 0644]
regression/games/nando/auto016.sgf [new file with mode: 0644]
regression/games/nando/auto017.sgf [new file with mode: 0644]
regression/games/nando/auto018.sgf [new file with mode: 0644]
regression/games/nando/auto019.sgf [new file with mode: 0644]
regression/games/nando/auto020.sgf [new file with mode: 0644]
regression/games/nando/auto021.sgf [new file with mode: 0644]
regression/games/nando/auto022.sgf [new file with mode: 0644]
regression/games/nando/auto023.sgf [new file with mode: 0644]
regression/games/nando/auto024.sgf [new file with mode: 0644]
regression/games/nando/auto025.sgf [new file with mode: 0644]
regression/games/nando/auto026.sgf [new file with mode: 0644]
regression/games/nando/auto027.sgf [new file with mode: 0644]
regression/games/nando/kisei27_g1.sgf [new file with mode: 0644]
regression/games/nando/meijin27_g1.sgf [new file with mode: 0644]
regression/games/nando/meijin27_g4.sgf [new file with mode: 0644]
regression/games/nando/meijin27_g5.sgf [new file with mode: 0644]
regression/games/net3.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas1.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas10.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas11.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas12.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas13.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas14.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas15.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas16.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas17.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas18.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas19.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas2.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas20.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas21.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas22.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas23.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas24.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas3.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas4.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas5.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas6.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas7.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas8.sgf [new file with mode: 0644]
regression/games/nicklas/nicklas9.sgf [new file with mode: 0644]
regression/games/niki.sgf [new file with mode: 0644]
regression/games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf [new file with mode: 0644]
regression/games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf [new file with mode: 0644]
regression/games/ninestones/emanuel-1.sgf [new file with mode: 0644]
regression/games/ninestones/emanuel-2.sgf [new file with mode: 0644]
regression/games/ninestones/halti-gnugo-3.3.9-200210111409.sgf [new file with mode: 0644]
regression/games/ninestones/ninestones1.sgf [new file with mode: 0644]
regression/games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf [new file with mode: 0644]
regression/games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf [new file with mode: 0644]
regression/games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf [new file with mode: 0644]
regression/games/nngs/GoFuN-gnugo-3.4-200308030626.sgf [new file with mode: 0644]
regression/games/nngs/GoFuN-gnugo-3.5.2gf1-200312230328.sgf [new file with mode: 0644]
regression/games/nngs/Jion-gnugo-3.3.2-200205241928.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf [new file with mode: 0644]
regression/games/nngs/Lazarus-gnugo-3.2-200205011927.sgf [new file with mode: 0644]
regression/games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf [new file with mode: 0644]
regression/games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf [new file with mode: 0644]
regression/games/nngs/ManyFaces4-gnugo-3.1.27-200203182101.sgf [new file with mode: 0644]
regression/games/nngs/ManyFaces4-gnugo-3.1.27-200203191159.sgf [new file with mode: 0644]
regression/games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf [new file with mode: 0644]
regression/games/nngs/Minori-gnugo-3.5.2gf1-200312161433.sgf [new file with mode: 0644]
regression/games/nngs/NE-gnugo-3.1.18-200201030545.sgf [new file with mode: 0644]
regression/games/nngs/ShaiHulud-gnugo-3.5.3-200401231947.sgf [new file with mode: 0644]
regression/games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf [new file with mode: 0644]
regression/games/nngs/abcd-gnugo-3.3.8-200209202043.sgf [new file with mode: 0644]
regression/games/nngs/aburry-gnugo-3.3.12-200212162212.sgf [new file with mode: 0644]
regression/games/nngs/bconwil-gnugo-3.3.11-200211182313.sgf [new file with mode: 0644]
regression/games/nngs/beedee-gnugo-3.5.3-200401140035.sgf [new file with mode: 0644]
regression/games/nngs/camel-gnugo-3.1.26-200202280809.sgf [new file with mode: 0644]
regression/games/nngs/camel-gnugo-3.1.26-200203022335.sgf [new file with mode: 0644]
regression/games/nngs/ccwills-gnugo-3.3.21-200306131816.sgf [new file with mode: 0644]
regression/games/nngs/ccwills-gnugo-3.4-200308231739.sgf [new file with mode: 0644]
regression/games/nngs/ccwills-gnugo-3.5.2-200312112026.sgf [new file with mode: 0644]
regression/games/nngs/ccwills-gnugo-3.5.3-200401100810.sgf [new file with mode: 0644]
regression/games/nngs/chuck-gnugo-3.5.2gf1-200312261847.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.3.11-200211151742.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.3.17-200303201727.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.3.21-200306130638.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.5.2-200312060932.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.5.2gf1-200312130817.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.5.2gf1-200312150903.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.5.2gf1-200312161910.sgf [new file with mode: 0644]
regression/games/nngs/evand-gnugo-3.5.2gf1-200401072036.sgf [new file with mode: 0644]
regression/games/nngs/gerula-gnugo-3.2-200205041756.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.15-goku-200112081829.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-Rufus-200201051408.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-Rufus-200201051411.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-Rufus-200201051823.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-Rufus-200201052349.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-bnh-200201061916.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-dermicha-200201041355.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-goku-200201042031.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-goku-200201042350.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-guestx-200201071151.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-jimm-200201050556.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-patch-200201081044.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.20-setenza-200201162038.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.20-setenza-200201172131.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.22-heeroy-200201252006.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.26-farrell-200203051803.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203061917.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203062215.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203070156.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203080451.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203090430.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203090538.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203100627.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203100711.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203131958.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-GoFuN-200203230525.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-Yuuki-200203131056.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-Yuuki-200203132324.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-guestn-200203061902.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-guestn-200203111825.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-guestn-200203121818.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-guestn-200203131735.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.27-wingjk-200203101039.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.29-coco-200203281540.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.29-coco-200203281929.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.29-merlin-200203281708.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.30-Poctim-200204040503.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.30-merlin-200204041428.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.30-morlvera-200204041921.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.31-niki-200204131518.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.34-guest1-200204242025.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.1.34-viking4-200204240801.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.2-merlin-200205071828.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-deye-200210211347.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-jimm-200210222018.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-niki-200210281349.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-rcde05-200210300235.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-tsuku-200210241808.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.10-viking4-200210261703.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.11-bconwil-200211202359.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.11-ccwills-200211031528.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.11-rcde05-200211090008.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.12-guest-200212171626.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.12-jimm-200211261724.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.16-ccwills-200302151826.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.16-ccwills-200303030550.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.16-rcde05-200302140458.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.16-rubus-200302281805.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.17-Wiedemann-200303251932.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.17-joshj-200304172202.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.17-ylamaki-200303262305.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.18-agh-200304291749.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.18-joshj-200304242104.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.18-spewnboy-200304291635.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.2-Programmer-200206021522.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.2-Zahlman-200205221717.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.2-mr23-200205120953.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.20-GoFuN-200306071813.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.21-joshj-200306270402.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.23-viking4-200307312134.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.6-evand-200208290255.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.6-xtc-200208301619.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-Joorin-200209251541.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-evand-200209090532.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-evand-200209122040.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-evand-200209130704.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-evand-200209170730.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-nailer-200209190045.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.8-viking4-200209250907.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.9-Ayoye-200209301535.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.9-joshj-200210181607.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.9-nailer-200210192227.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.9-nailer-200210192319.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.3.9-pogonyshev-200210142137.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.4-nailer-200308230714.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.4-viking4-200308191053.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.1-viking4-200309231039.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-G28-200312282240.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-Kiskol-200401021557.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-guest-200312260740.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-kisome-200312131322.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.3-dbr-200401121534.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.4-chpr-200403201748.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.5-liza-200404251738.sgf [new file with mode: 0644]
regression/games/nngs/gnugo-3.5.5-liza-200404251750.sgf [new file with mode: 0644]
regression/games/nngs/guestn-gnugo-3.3.17-200304200323.sgf [new file with mode: 0644]
regression/games/nngs/guestu-gnugo-3.3.19-200305131943.sgf [new file with mode: 0644]
regression/games/nngs/halti-gnugo-3.3.17-200303162357.sgf [new file with mode: 0644]
regression/games/nngs/huck-gnugo-3.3.6-200209060837.sgf [new file with mode: 0644]
regression/games/nngs/joshj-gnugo-3.3.16-200302232226.sgf [new file with mode: 0644]
regression/games/nngs/joshj-gnugo-3.3.2-200205310709.sgf [new file with mode: 0644]
regression/games/nngs/joshj-gnugo-3.5.2-200312100558.sgf [new file with mode: 0644]
regression/games/nngs/joshj-gnugo-3.5.2gf1-200312171536.sgf [new file with mode: 0644]
regression/games/nngs/juka-gnugo-3.1.16-200112142153.sgf [new file with mode: 0644]
regression/games/nngs/juka-gnugo-3.3.16-200302072106.sgf [new file with mode: 0644]
regression/games/nngs/juka-gnugo-3.3.16-200303031959.sgf [new file with mode: 0644]
regression/games/nngs/juka-gnugo-3.5.1-200309161948.sgf [new file with mode: 0644]
regression/games/nngs/jypower-gnugo-3.3.17-200304150031.sgf [new file with mode: 0644]
regression/games/nngs/jypower-gnugo-3.3.22-200307050519.sgf [new file with mode: 0644]
regression/games/nngs/kit-gnugo-3.3.21-200306181940.sgf [new file with mode: 0644]
regression/games/nngs/kumu-gnugo-3.2-200205070903.sgf [new file with mode: 0644]
regression/games/nngs/leftd-gnugo-3.3.12-200211292017.sgf [new file with mode: 0644]
regression/games/nngs/leftd-gnugo-3.3.16-200302072009.sgf [new file with mode: 0644]
regression/games/nngs/leftd-gnugo-3.3.16-200302252226.sgf [new file with mode: 0644]
regression/games/nngs/lindq-gnugo-3.3.4-200207051636.sgf [new file with mode: 0644]
regression/games/nngs/looknglass-ggl-200302271041.sgf [new file with mode: 0644]
regression/games/nngs/looknglass-gnugo-3.1.26-200203042158.sgf [new file with mode: 0644]
regression/games/nngs/makoops-gnugo-3.1.18-200201081434.sgf [new file with mode: 0644]
regression/games/nngs/niko-gnugo-3.3.11-200211201651.sgf [new file with mode: 0644]
regression/games/nngs/norate-ggl-200212301513.sgf [new file with mode: 0644]
regression/games/nngs/qly-gnugo-3.3.18-200305022134.sgf [new file with mode: 0644]
regression/games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf [new file with mode: 0644]
regression/games/nngs/ruud2d-gnugo-3.5.2gf1-200312292348.sgf [new file with mode: 0644]
regression/games/nngs/saphir-gnugo-3.3.12-200212031818.sgf [new file with mode: 0644]
regression/games/nngs/scf-gnugo-3.1.18-200201060027.sgf [new file with mode: 0644]
regression/games/nngs/silverado-gnugo-3.3.5-200208061810.sgf [new file with mode: 0644]
regression/games/nngs/silverado-gnugo-3.3.8-200209120723.sgf [new file with mode: 0644]
regression/games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf [new file with mode: 0644]
regression/games/nngs/sjfried-gnugo-3.5.2gf1-200312210441.sgf [new file with mode: 0644]
regression/games/nngs/speciman-gnugo-3.1.32-200204211014.sgf [new file with mode: 0644]
regression/games/nngs/speciman-gnugo-3.5.2-200312091734.sgf [new file with mode: 0644]
regression/games/nngs/takeda-gnugo-3.3.23-200307302010.sgf [new file with mode: 0644]
regression/games/nngs/takeda-gnugo-3.4-200308142205.sgf [new file with mode: 0644]
regression/games/nngs/theDoor-gnugo-3.3.11-200211130142.sgf [new file with mode: 0644]
regression/games/nngs/thor-gnugo-3.3.12-200212170003.sgf [new file with mode: 0644]
regression/games/nngs/tobyiii-gnugo-3.3.2-200206041432.sgf [new file with mode: 0644]
regression/games/nngs/tommmal-gnugo-3.4-200308200805.sgf [new file with mode: 0644]
regression/games/nngs/tommmal-gnugo-3.4-200309021655.sgf [new file with mode: 0644]
regression/games/nngs/tommmal-gnugo-3.5.1-200309081210.sgf [new file with mode: 0644]
regression/games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf [new file with mode: 0644]
regression/games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf [new file with mode: 0644]
regression/games/nngs/tommmal-gnugo-3.5.3-200401140719.sgf [new file with mode: 0644]
regression/games/nngs/uhu-gnugo-3.3.16-200302112129.sgf [new file with mode: 0644]
regression/games/nngs/uno-gnugo-3.3.16-200302050206.sgf [new file with mode: 0644]
regression/games/nngs/uno-gnugo-3.3.16-200302230528.sgf [new file with mode: 0644]
regression/games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf [new file with mode: 0644]
regression/games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf [new file with mode: 0644]
regression/games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf [new file with mode: 0644]
regression/games/nngs/wingjk-gnugo-3.3.17-200304070910.sgf [new file with mode: 0644]
regression/games/nodan-guno.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-19-ether-gnugo-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-19-gnugo-starofdonghwa-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-19-go4-gnugo-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-19-goint-gnugo-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-9-gnugo-magog-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-9-go4-gnugo-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game1-9-goint-gnugo-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game2-19-gnugo-go4-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game2-19-gnugo-goint-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game2-19-starofdonghwa-gnugo-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game2-9-gnugo-go4-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game2-9-gnugo-goint-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game2-9-magog-gnugo-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game3-9-go4-gnugo-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game3-9-goint-gnugo-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2002/game4-9-gnugo-go4-0-1.sgf [new file with mode: 0644]
regression/games/olympiad2002/game4-9-gnugo-goint-1-0.sgf [new file with mode: 0644]
regression/games/olympiad2003/aya_vs_gnugo.sgf [new file with mode: 0644]
regression/games/olympiad2003/explorer_vs_gnugo.sgf [new file with mode: 0644]
regression/games/olympiad2003/gnugo_vs_dariush.sgf [new file with mode: 0644]
regression/games/olympiad2003/gnugo_vs_goahead.sgf [new file with mode: 0644]
regression/games/olympiad2003/gnugo_vs_indigo.sgf [new file with mode: 0644]
regression/games/olympiad2003/gnugo_vs_jimmy.sgf [new file with mode: 0644]
regression/games/olympiad2003/gnugo_vs_neurogo.sgf [new file with mode: 0644]
regression/games/olympiad2003/go_intellect_vs_gnugo.sgf [new file with mode: 0644]
regression/games/olympiad2003/golois_vs_gnugo.sgf [new file with mode: 0644]
regression/games/olympiad2003/smartgo_vs_gnugo.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/gnu-ind.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/gnu-int.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/gnu-jim.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/gnu-mfg.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/ind-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/int-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/jim-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/19x19/mfg-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/ata-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/dbg-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-ata.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-dbg.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-ind.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-int-playoff.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-int.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-kin.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-mag.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-mfg.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/gnu-neu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/ind-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/int-gnu-playoff.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/int-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/kin-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/mag-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/mfg-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2004/9x9/neu-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/aya-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/crazystone-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gnu-aya.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gnu-crazystone.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gnu-gointellect-playoff.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gnu-gointellect.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gnu-indigo.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gnu-jimmy.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/gointellect-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/indigo-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/19x19/jimmy-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/ajago-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/akebono-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/atarist-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/aya-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/crazy-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-ajago.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-akebono.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-atarist.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-aya.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-crazy.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-int.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-jimmy.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-king.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-mango.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/gnu-neurogo.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/int-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/jimmy-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/king-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/mango-gnu.sgf [new file with mode: 0644]
regression/games/olympiad2006/9x9/neurogo-gnu.sgf [new file with mode: 0644]
regression/games/owl01.sgf [new file with mode: 0644]
regression/games/owl02.sgf [new file with mode: 0644]
regression/games/owl03.sgf [new file with mode: 0644]
regression/games/owl04.sgf [new file with mode: 0644]
regression/games/owl05.sgf [new file with mode: 0644]
regression/games/owl06.sgf [new file with mode: 0644]
regression/games/owl07.sgf [new file with mode: 0644]
regression/games/owl08.sgf [new file with mode: 0644]
regression/games/owl09.sgf [new file with mode: 0644]
regression/games/owl10.sgf [new file with mode: 0644]
regression/games/owl11.sgf [new file with mode: 0644]
regression/games/owl12.sgf [new file with mode: 0644]
regression/games/owl13.sgf [new file with mode: 0644]
regression/games/owl14.sgf [new file with mode: 0644]
regression/games/owl15.sgf [new file with mode: 0644]
regression/games/owl16.sgf [new file with mode: 0644]
regression/games/owl17.sgf [new file with mode: 0644]
regression/games/owl18.sgf [new file with mode: 0644]
regression/games/owl19.sgf [new file with mode: 0644]
regression/games/owl20.sgf [new file with mode: 0644]
regression/games/owl21.sgf [new file with mode: 0644]
regression/games/owl22.sgf [new file with mode: 0644]
regression/games/owl23.sgf [new file with mode: 0644]
regression/games/owl24.sgf [new file with mode: 0644]
regression/games/owl25.sgf [new file with mode: 0644]
regression/games/owl26.sgf [new file with mode: 0644]
regression/games/owl27.sgf [new file with mode: 0644]
regression/games/owl28.sgf [new file with mode: 0644]
regression/games/owl29.sgf [new file with mode: 0644]
regression/games/owl30.sgf [new file with mode: 0644]
regression/games/owl31.sgf [new file with mode: 0644]
regression/games/owl32.sgf [new file with mode: 0644]
regression/games/owl33.sgf [new file with mode: 0644]
regression/games/owl34.sgf [new file with mode: 0644]
regression/games/owl35.sgf [new file with mode: 0644]
regression/games/owl36.sgf [new file with mode: 0644]
regression/games/owl37.sgf [new file with mode: 0644]
regression/games/owl38.sgf [new file with mode: 0644]
regression/games/owl39.sgf [new file with mode: 0644]
regression/games/owl39a.sgf [new file with mode: 0644]
regression/games/owl40.sgf [new file with mode: 0644]
regression/games/owl41.sgf [new file with mode: 0644]
regression/games/owl42.sgf [new file with mode: 0644]
regression/games/owl43.sgf [new file with mode: 0644]
regression/games/owl44.sgf [new file with mode: 0644]
regression/games/owl45.sgf [new file with mode: 0644]
regression/games/owl46.sgf [new file with mode: 0644]
regression/games/owl47.sgf [new file with mode: 0644]
regression/games/owl48.sgf [new file with mode: 0644]
regression/games/owl49.sgf [new file with mode: 0644]
regression/games/owl50.sgf [new file with mode: 0644]
regression/games/owl51.sgf [new file with mode: 0644]
regression/games/owl52.sgf [new file with mode: 0644]
regression/games/owl53.sgf [new file with mode: 0644]
regression/games/owl54.sgf [new file with mode: 0644]
regression/games/owl55.sgf [new file with mode: 0644]
regression/games/paul.sgf [new file with mode: 0644]
regression/games/pending/README [new file with mode: 0644]
regression/games/pending/bubble.sgf [new file with mode: 0644]
regression/games/pending/guestxx.sgf [new file with mode: 0644]
regression/games/pending/ko6.sgf [new file with mode: 0644]
regression/games/pending/nightmare.sgf [new file with mode: 0644]
regression/games/pending/owl28.sgf [new file with mode: 0644]
regression/games/poka.sgf [new file with mode: 0644]
regression/games/pooo.sgf [new file with mode: 0644]
regression/games/reading01.sgf [new file with mode: 0644]
regression/games/reading02.sgf [new file with mode: 0644]
regression/games/reading03.sgf [new file with mode: 0644]
regression/games/reading04.sgf [new file with mode: 0644]
regression/games/reading05.sgf [new file with mode: 0644]
regression/games/reading06.sgf [new file with mode: 0644]
regression/games/reading07.sgf [new file with mode: 0644]
regression/games/reading08.sgf [new file with mode: 0644]
regression/games/reading09.sgf [new file with mode: 0644]
regression/games/reading10.sgf [new file with mode: 0644]
regression/games/reading11.sgf [new file with mode: 0644]
regression/games/reading12.sgf [new file with mode: 0644]
regression/games/reading13.sgf [new file with mode: 0644]
regression/games/reading14.sgf [new file with mode: 0644]
regression/games/reading15.sgf [new file with mode: 0644]
regression/games/reading16.sgf [new file with mode: 0644]
regression/games/reading17.sgf [new file with mode: 0644]
regression/games/reading18.sgf [new file with mode: 0644]
regression/games/reading19.sgf [new file with mode: 0644]
regression/games/reading20.sgf [new file with mode: 0644]
regression/games/reading21.sgf [new file with mode: 0644]
regression/games/reading22.sgf [new file with mode: 0644]
regression/games/reading23.sgf [new file with mode: 0644]
regression/games/reading24.sgf [new file with mode: 0644]
regression/games/reading25.sgf [new file with mode: 0644]
regression/games/reading26.sgf [new file with mode: 0644]
regression/games/reading27.sgf [new file with mode: 0644]
regression/games/reading28.sgf [new file with mode: 0644]
regression/games/reading29.sgf [new file with mode: 0644]
regression/games/reading30.sgf [new file with mode: 0644]
regression/games/reading31.sgf [new file with mode: 0644]
regression/games/reading32.sgf [new file with mode: 0644]
regression/games/reading33.sgf [new file with mode: 0644]
regression/games/reading34.sgf [new file with mode: 0644]
regression/games/reading35.sgf [new file with mode: 0644]
regression/games/reading36.sgf [new file with mode: 0644]
regression/games/reading37.sgf [new file with mode: 0644]
regression/games/reading38.sgf [new file with mode: 0644]
regression/games/reading39.sgf [new file with mode: 0644]
regression/games/reading40.sgf [new file with mode: 0644]
regression/games/reading41.sgf [new file with mode: 0644]
regression/games/reading42.sgf [new file with mode: 0644]
regression/games/reading43.sgf [new file with mode: 0644]
regression/games/reading44.sgf [new file with mode: 0644]
regression/games/reading45.sgf [new file with mode: 0644]
regression/games/reading46.sgf [new file with mode: 0644]
regression/games/reading47.sgf [new file with mode: 0644]
regression/games/reading48.sgf [new file with mode: 0644]
regression/games/rosebud.sgf [new file with mode: 0644]
regression/games/rosebud4.sgf [new file with mode: 0644]
regression/games/scoring/score1.sgf [new file with mode: 0644]
regression/games/scoring/score10.sgf [new file with mode: 0644]
regression/games/scoring/score11.sgf [new file with mode: 0644]
regression/games/scoring/score12.sgf [new file with mode: 0644]
regression/games/scoring/score13.sgf [new file with mode: 0644]
regression/games/scoring/score14.sgf [new file with mode: 0644]
regression/games/scoring/score15.sgf [new file with mode: 0644]
regression/games/scoring/score16.sgf [new file with mode: 0644]
regression/games/scoring/score17.sgf [new file with mode: 0644]
regression/games/scoring/score18.sgf [new file with mode: 0644]
regression/games/scoring/score19.sgf [new file with mode: 0644]
regression/games/scoring/score2.sgf [new file with mode: 0644]
regression/games/scoring/score20.sgf [new file with mode: 0644]
regression/games/scoring/score21.sgf [new file with mode: 0644]
regression/games/scoring/score22.sgf [new file with mode: 0644]
regression/games/scoring/score23.sgf [new file with mode: 0644]
regression/games/scoring/score24.sgf [new file with mode: 0644]
regression/games/scoring/score25.sgf [new file with mode: 0644]
regression/games/scoring/score26.sgf [new file with mode: 0644]
regression/games/scoring/score27.sgf [new file with mode: 0644]
regression/games/scoring/score28.sgf [new file with mode: 0644]
regression/games/scoring/score29.sgf [new file with mode: 0644]
regression/games/scoring/score3.sgf [new file with mode: 0644]
regression/games/scoring/score30.sgf [new file with mode: 0644]
regression/games/scoring/score31.sgf [new file with mode: 0644]
regression/games/scoring/score32.sgf [new file with mode: 0644]
regression/games/scoring/score33.sgf [new file with mode: 0644]
regression/games/scoring/score34.sgf [new file with mode: 0644]
regression/games/scoring/score35.sgf [new file with mode: 0644]
regression/games/scoring/score36.sgf [new file with mode: 0644]
regression/games/scoring/score37.sgf [new file with mode: 0644]
regression/games/scoring/score38.sgf [new file with mode: 0644]
regression/games/scoring/score39.sgf [new file with mode: 0644]
regression/games/scoring/score4.sgf [new file with mode: 0644]
regression/games/scoring/score40.sgf [new file with mode: 0644]
regression/games/scoring/score41.sgf [new file with mode: 0644]
regression/games/scoring/score42.sgf [new file with mode: 0644]
regression/games/scoring/score43.sgf [new file with mode: 0644]
regression/games/scoring/score44.sgf [new file with mode: 0644]
regression/games/scoring/score45.sgf [new file with mode: 0644]
regression/games/scoring/score46.sgf [new file with mode: 0644]
regression/games/scoring/score47.sgf [new file with mode: 0644]
regression/games/scoring/score48.sgf [new file with mode: 0644]
regression/games/scoring/score49.sgf [new file with mode: 0644]
regression/games/scoring/score5.sgf [new file with mode: 0644]
regression/games/scoring/score50.sgf [new file with mode: 0644]
regression/games/scoring/score51.sgf [new file with mode: 0644]
regression/games/scoring/score52.sgf [new file with mode: 0644]
regression/games/scoring/score53.sgf [new file with mode: 0644]
regression/games/scoring/score54.sgf [new file with mode: 0644]
regression/games/scoring/score55.sgf [new file with mode: 0644]
regression/games/scoring/score56.sgf [new file with mode: 0644]
regression/games/scoring/score57.sgf [new file with mode: 0644]
regression/games/scoring/score58.sgf [new file with mode: 0644]
regression/games/scoring/score6.sgf [new file with mode: 0644]
regression/games/scoring/score7.sgf [new file with mode: 0644]
regression/games/scoring/score8.sgf [new file with mode: 0644]
regression/games/scoring/score9.sgf [new file with mode: 0644]
regression/games/seki01.sgf [new file with mode: 0644]
regression/games/seki02.sgf [new file with mode: 0644]
regression/games/seki03.sgf [new file with mode: 0644]
regression/games/seki04.sgf [new file with mode: 0644]
regression/games/seki05.sgf [new file with mode: 0644]
regression/games/seki06.sgf [new file with mode: 0644]
regression/games/seki07.sgf [new file with mode: 0644]
regression/games/seki08.sgf [new file with mode: 0644]
regression/games/seki09.sgf [new file with mode: 0644]
regression/games/seki10.sgf [new file with mode: 0644]
regression/games/seki11.sgf [new file with mode: 0644]
regression/games/seki12.sgf [new file with mode: 0644]
regression/games/seki13.sgf [new file with mode: 0644]
regression/games/seki14.sgf [new file with mode: 0644]
regression/games/seki15.sgf [new file with mode: 0644]
regression/games/seki16.sgf [new file with mode: 0644]
regression/games/seki_exotics/README [new file with mode: 0644]
regression/games/seki_exotics/README-MANNER [new file with mode: 0644]
regression/games/seki_exotics/bent4.sgf [new file with mode: 0644]
regression/games/seki_exotics/bent4_2.sgf [new file with mode: 0644]
regression/games/seki_exotics/chosei.sgf [new file with mode: 0644]
regression/games/seki_exotics/doublebent4.sgf [new file with mode: 0644]
regression/games/seki_exotics/fourko.sgf [new file with mode: 0644]
regression/games/seki_exotics/junkan-ko.sgf [new file with mode: 0644]
regression/games/seki_exotics/onadare_ko.sgf [new file with mode: 0644]
regression/games/seki_exotics/onadare_ko2.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki1.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki2.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki3.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki_bent4.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki_challenge.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki_exotics.tgz [new file with mode: 0644]
regression/games/seki_exotics/seki_score.sgf [new file with mode: 0644]
regression/games/seki_exotics/seki_stupid.sgf [new file with mode: 0644]
regression/games/seki_exotics/threeko1.sgf [new file with mode: 0644]
regression/games/seki_exotics/threeko2.sgf [new file with mode: 0644]
regression/games/seki_exotics/threeko3.sgf [new file with mode: 0644]
regression/games/seki_exotics/twoko_dead.sgf [new file with mode: 0644]
regression/games/seki_exotics/twoko_live.sgf [new file with mode: 0644]
regression/games/seki_exotics/twoko_seki1.sgf [new file with mode: 0644]
regression/games/seki_exotics/twoko_seki2.sgf [new file with mode: 0644]
regression/games/seki_nakade1.sgf [new file with mode: 0644]
regression/games/seki_nakade2.sgf [new file with mode: 0644]
regression/games/self_play/354-34-1.sgf [new file with mode: 0644]
regression/games/self_play/354-34-2.sgf [new file with mode: 0644]
regression/games/self_play/354-34-3.sgf [new file with mode: 0644]
regression/games/self_play/selfplay1.sgf [new file with mode: 0644]
regression/games/semeai/infinity.sgf [new file with mode: 0644]
regression/games/semeai/match078.sgf [new file with mode: 0644]
regression/games/semeai/semeai10.sgf [new file with mode: 0644]
regression/games/semeai/semeai11.sgf [new file with mode: 0644]
regression/games/semeai/semeai12.sgf [new file with mode: 0644]
regression/games/semeai/semeai13.sgf [new file with mode: 0644]
regression/games/semeai/semeai14.sgf [new file with mode: 0644]
regression/games/semeai/semeai15.sgf [new file with mode: 0644]
regression/games/semeai/semeai16.sgf [new file with mode: 0644]
regression/games/semeai/semeai17.sgf [new file with mode: 0644]
regression/games/semeai/semeai18.sgf [new file with mode: 0644]
regression/games/semeai/semeai19.sgf [new file with mode: 0644]
regression/games/semeai/semeai20.sgf [new file with mode: 0644]
regression/games/semeai/semeai21.sgf [new file with mode: 0644]
regression/games/semeai/semeai22.sgf [new file with mode: 0644]
regression/games/semeai/semeai4.sgf [new file with mode: 0644]
regression/games/semeai/semeai5.sgf [new file with mode: 0644]
regression/games/semeai/semeai6.sgf [new file with mode: 0644]
regression/games/semeai/semeai7.sgf [new file with mode: 0644]
regression/games/semeai/semeai8.sgf [new file with mode: 0644]
regression/games/semeai/semeai9.sgf [new file with mode: 0644]
regression/games/semeai/semeaiko1.sgf [new file with mode: 0644]
regression/games/semeai1.sgf [new file with mode: 0644]
regression/games/semeai2.sgf [new file with mode: 0644]
regression/games/semeai3.sgf [new file with mode: 0644]
regression/games/splee.sgf [new file with mode: 0644]
regression/games/splee2.sgf [new file with mode: 0644]
regression/games/ssstator.sgf [new file with mode: 0644]
regression/games/strategy1.sgf [new file with mode: 0644]
regression/games/strategy10.sgf [new file with mode: 0644]
regression/games/strategy11.sgf [new file with mode: 0644]
regression/games/strategy12.sgf [new file with mode: 0644]
regression/games/strategy13.sgf [new file with mode: 0644]
regression/games/strategy14.sgf [new file with mode: 0644]
regression/games/strategy14a.sgf [new file with mode: 0644]
regression/games/strategy15.sgf [new file with mode: 0644]
regression/games/strategy16.sgf [new file with mode: 0644]
regression/games/strategy17.sgf [new file with mode: 0644]
regression/games/strategy18.sgf [new file with mode: 0644]
regression/games/strategy19.sgf [new file with mode: 0644]
regression/games/strategy2.sgf [new file with mode: 0644]
regression/games/strategy20.sgf [new file with mode: 0644]
regression/games/strategy21.sgf [new file with mode: 0644]
regression/games/strategy22.sgf [new file with mode: 0644]
regression/games/strategy23.sgf [new file with mode: 0644]
regression/games/strategy24.sgf [new file with mode: 0644]
regression/games/strategy25.sgf [new file with mode: 0644]
regression/games/strategy26.sgf [new file with mode: 0644]
regression/games/strategy27.sgf [new file with mode: 0644]
regression/games/strategy28.sgf [new file with mode: 0644]
regression/games/strategy29.sgf [new file with mode: 0644]
regression/games/strategy3.sgf [new file with mode: 0644]
regression/games/strategy30.sgf [new file with mode: 0644]
regression/games/strategy31.sgf [new file with mode: 0644]
regression/games/strategy32.sgf [new file with mode: 0644]
regression/games/strategy33.sgf [new file with mode: 0644]
regression/games/strategy34.sgf [new file with mode: 0644]
regression/games/strategy35.sgf [new file with mode: 0644]
regression/games/strategy36.sgf [new file with mode: 0644]
regression/games/strategy37.sgf [new file with mode: 0644]
regression/games/strategy38.sgf [new file with mode: 0644]
regression/games/strategy39.sgf [new file with mode: 0644]
regression/games/strategy4.sgf [new file with mode: 0644]
regression/games/strategy40.sgf [new file with mode: 0644]
regression/games/strategy41.sgf [new file with mode: 0644]
regression/games/strategy42.sgf [new file with mode: 0644]
regression/games/strategy43.sgf [new file with mode: 0644]
regression/games/strategy44.sgf [new file with mode: 0644]
regression/games/strategy45.sgf [new file with mode: 0644]
regression/games/strategy46.sgf [new file with mode: 0644]
regression/games/strategy47.sgf [new file with mode: 0644]
regression/games/strategy48.sgf [new file with mode: 0644]
regression/games/strategy49.sgf [new file with mode: 0644]
regression/games/strategy5.sgf [new file with mode: 0644]
regression/games/strategy50.sgf [new file with mode: 0644]
regression/games/strategy51.sgf [new file with mode: 0755]
regression/games/strategy6.sgf [new file with mode: 0644]
regression/games/strategy7.sgf [new file with mode: 0644]
regression/games/strategy8.sgf [new file with mode: 0644]
regression/games/strategy9.sgf [new file with mode: 0644]
regression/games/tactics01.sgf [new file with mode: 0644]
regression/games/tactics02.sgf [new file with mode: 0644]
regression/games/tactics03.sgf [new file with mode: 0644]
regression/games/tactics04.sgf [new file with mode: 0644]
regression/games/tactics05.sgf [new file with mode: 0644]
regression/games/tactics06.sgf [new file with mode: 0644]
regression/games/tactics07.sgf [new file with mode: 0644]
regression/games/tactics08.sgf [new file with mode: 0644]
regression/games/test3lose.sgf [new file with mode: 0644]
regression/games/test3win.sgf [new file with mode: 0644]
regression/games/test4lose.sgf [new file with mode: 0644]
regression/games/test4win.sgf [new file with mode: 0644]
regression/games/test5lose.sgf [new file with mode: 0644]
regression/games/test5win.sgf [new file with mode: 0644]
regression/games/tg-gg.sgf [new file with mode: 0644]
regression/games/tiny/2x2.sgf [new file with mode: 0644]
regression/games/tiny/3x3a.sgf [new file with mode: 0644]
regression/games/tiny/3x3b.sgf [new file with mode: 0644]
regression/games/tiny/4x4a.sgf [new file with mode: 0644]
regression/games/trevor/auto/a001.sgf [new file with mode: 0644]
regression/games/trevor/auto/a003.sgf [new file with mode: 0644]
regression/games/trevor/auto/a004.sgf [new file with mode: 0644]
regression/games/trevor/auto/a005.sgf [new file with mode: 0644]
regression/games/trevor/auto/a006.sgf [new file with mode: 0644]
regression/games/trevor/auto/a007.sgf [new file with mode: 0644]
regression/games/trevor/auto/a008.sgf [new file with mode: 0644]
regression/games/trevor/auto/a009.sgf [new file with mode: 0644]
regression/games/trevor/auto/a010.sgf [new file with mode: 0644]
regression/games/trevor/auto/a011.sgf [new file with mode: 0644]
regression/games/trevor/auto/a013.sgf [new file with mode: 0644]
regression/games/trevor/auto/a014.sgf [new file with mode: 0644]
regression/games/trevor/auto/a015.sgf [new file with mode: 0644]
regression/games/trevor/auto/a016.sgf [new file with mode: 0644]
regression/games/trevor/auto/a017.sgf [new file with mode: 0644]
regression/games/trevor/auto/a018.sgf [new file with mode: 0644]
regression/games/trevor/auto/a019.sgf [new file with mode: 0644]
regression/games/trevor/auto/a021.sgf [new file with mode: 0644]
regression/games/trevor/auto/a022.sgf [new file with mode: 0644]
regression/games/trevor/auto/a023.sgf [new file with mode: 0644]
regression/games/trevor/auto/a024.sgf [new file with mode: 0644]
regression/games/trevor/auto/a025.sgf [new file with mode: 0644]
regression/games/trevor/auto/a026.sgf [new file with mode: 0644]
regression/games/trevor/auto/a027.sgf [new file with mode: 0644]
regression/games/trevor/auto/a029.sgf [new file with mode: 0644]
regression/games/trevor/auto/a030.sgf [new file with mode: 0644]
regression/games/trevor/auto/a031.sgf [new file with mode: 0644]
regression/games/trevor/auto/a033.sgf [new file with mode: 0644]
regression/games/trevor/auto/a034.sgf [new file with mode: 0644]
regression/games/trevor/auto/a035.sgf [new file with mode: 0644]
regression/games/trevor/auto/a036.sgf [new file with mode: 0644]
regression/games/trevor/auto/a037.sgf [new file with mode: 0644]
regression/games/trevor/auto/a038.sgf [new file with mode: 0644]
regression/games/trevor/auto/a039.sgf [new file with mode: 0644]
regression/games/trevor/auto/a041.sgf [new file with mode: 0644]
regression/games/trevor/auto/b01.sgf [new file with mode: 0644]
regression/games/trevor/auto/b02.sgf [new file with mode: 0644]
regression/games/trevor/auto/b08.sgf [new file with mode: 0644]
regression/games/trevor/auto/b09.sgf [new file with mode: 0644]
regression/games/trevor/auto/b13.sgf [new file with mode: 0644]
regression/games/trevor/auto/b16.sgf [new file with mode: 0644]
regression/games/trevor/auto/b17.sgf [new file with mode: 0644]
regression/games/trevor/auto/b20.sgf [new file with mode: 0644]
regression/games/trevor/auto/b23.sgf [new file with mode: 0644]
regression/games/trevor/auto/b24.sgf [new file with mode: 0644]
regression/games/trevor/auto/b25.sgf [new file with mode: 0644]
regression/games/trevor/auto/b27.sgf [new file with mode: 0644]
regression/games/trevor/auto/b28.sgf [new file with mode: 0644]
regression/games/trevor/auto/b29.sgf [new file with mode: 0644]
regression/games/trevor/auto/b30.sgf [new file with mode: 0644]
regression/games/trevor/auto/b32.sgf [new file with mode: 0644]
regression/games/trevor/auto/b33.sgf [new file with mode: 0644]
regression/games/trevor/auto/b37.sgf [new file with mode: 0644]
regression/games/trevor/auto/b39.sgf [new file with mode: 0644]
regression/games/trevor/auto/b40.sgf [new file with mode: 0644]
regression/games/trevor/auto/b42.sgf [new file with mode: 0644]
regression/games/trevor/auto/b47.sgf [new file with mode: 0644]
regression/games/trevor/auto/b52.sgf [new file with mode: 0644]
regression/games/trevor/auto/b56.sgf [new file with mode: 0644]
regression/games/trevor/auto/b58.sgf [new file with mode: 0644]
regression/games/trevor/auto/b60.sgf [new file with mode: 0644]
regression/games/trevor/auto/b62.sgf [new file with mode: 0644]
regression/games/trevor/auto/b64.sgf [new file with mode: 0644]
regression/games/trevor/auto/b67.sgf [new file with mode: 0644]
regression/games/trevor/auto/b69.sgf [new file with mode: 0644]
regression/games/trevor/auto/b72.sgf [new file with mode: 0644]
regression/games/trevor/auto/b73.sgf [new file with mode: 0644]
regression/games/trevor/auto/b75.sgf [new file with mode: 0644]
regression/games/trevor/auto/b76.sgf [new file with mode: 0644]
regression/games/trevor/auto/b80.sgf [new file with mode: 0644]
regression/games/trevor/auto/b83.sgf [new file with mode: 0644]
regression/games/trevor/auto/b86.sgf [new file with mode: 0644]
regression/games/trevor/auto/b88.sgf [new file with mode: 0644]
regression/games/trevor/auto/b99.sgf [new file with mode: 0644]
regression/games/trevor/auto/c01.sgf [new file with mode: 0644]
regression/games/trevor/auto/c03.sgf [new file with mode: 0644]
regression/games/trevor/auto/c08.sgf [new file with mode: 0644]
regression/games/trevor/auto/c09.sgf [new file with mode: 0644]
regression/games/trevor/auto/c11.sgf [new file with mode: 0644]
regression/games/trevor/auto/c12.sgf [new file with mode: 0644]
regression/games/trevor/auto/c13.sgf [new file with mode: 0644]
regression/games/trevor/auto/c14.sgf [new file with mode: 0644]
regression/games/trevor/auto/c17.sgf [new file with mode: 0644]
regression/games/trevor/auto/c18.sgf [new file with mode: 0644]
regression/games/trevor/auto/c20.sgf [new file with mode: 0644]
regression/games/trevor/auto/c23.sgf [new file with mode: 0644]
regression/games/trevor/auto/c24.sgf [new file with mode: 0644]
regression/games/trevor/auto/c25.sgf [new file with mode: 0644]
regression/games/trevor/auto/c28.sgf [new file with mode: 0644]
regression/games/trevor/auto/c30.sgf [new file with mode: 0644]
regression/games/trevor/auto/c35.sgf [new file with mode: 0644]
regression/games/trevor/auto/c36.sgf [new file with mode: 0644]
regression/games/trevor/auto/c38.sgf [new file with mode: 0644]
regression/games/trevor/auto/c39.sgf [new file with mode: 0644]
regression/games/trevor/auto/c41.sgf [new file with mode: 0644]
regression/games/trevor/auto/c42.sgf [new file with mode: 0644]
regression/games/trevor/auto/c43.sgf [new file with mode: 0644]
regression/games/trevor/auto/c45.sgf [new file with mode: 0644]
regression/games/trevor/auto/c47.sgf [new file with mode: 0644]
regression/games/trevor/auto/c51.sgf [new file with mode: 0644]
regression/games/trevor/auto/c54.sgf [new file with mode: 0644]
regression/games/trevor/auto/c55.sgf [new file with mode: 0644]
regression/games/trevor/auto/c59.sgf [new file with mode: 0644]
regression/games/trevor/auto/c60.sgf [new file with mode: 0644]
regression/games/trevor/auto/c61.sgf [new file with mode: 0644]
regression/games/trevor/auto/c62.sgf [new file with mode: 0644]
regression/games/trevor/auto/c63.sgf [new file with mode: 0644]
regression/games/trevor/auto/c67.sgf [new file with mode: 0644]
regression/games/trevor/auto/c68.sgf [new file with mode: 0644]
regression/games/trevor/auto/c69.sgf [new file with mode: 0644]
regression/games/trevor/auto/c70.sgf [new file with mode: 0644]
regression/games/trevor/auto/c72.sgf [new file with mode: 0644]
regression/games/trevor/auto/c73.sgf [new file with mode: 0644]
regression/games/trevor/auto/c76.sgf [new file with mode: 0644]
regression/games/trevor/auto/c77.sgf [new file with mode: 0644]
regression/games/trevor/auto/c78.sgf [new file with mode: 0644]
regression/games/trevor/auto/c81.sgf [new file with mode: 0644]
regression/games/trevor/auto/c82.sgf [new file with mode: 0644]
regression/games/trevor/auto/c83.sgf [new file with mode: 0644]
regression/games/trevor/auto/c84.sgf [new file with mode: 0644]
regression/games/trevor/auto/c86.sgf [new file with mode: 0644]
regression/games/trevor/auto/c88.sgf [new file with mode: 0644]
regression/games/trevor/auto/c90.sgf [new file with mode: 0644]
regression/games/trevor/auto/c91.sgf [new file with mode: 0644]
regression/games/trevor/auto/c93.sgf [new file with mode: 0644]
regression/games/trevor/auto/c94.sgf [new file with mode: 0644]
regression/games/trevor/auto/c96.sgf [new file with mode: 0644]
regression/games/trevor/auto/d01.sgf [new file with mode: 0644]
regression/games/trevor/auto/d02.sgf [new file with mode: 0644]
regression/games/trevor/auto/d03.sgf [new file with mode: 0644]
regression/games/trevor/auto/d08.sgf [new file with mode: 0644]
regression/games/trevor/auto/d12.sgf [new file with mode: 0644]
regression/games/trevor/auto/d24.sgf [new file with mode: 0644]
regression/games/trevor/auto/d25.sgf [new file with mode: 0644]
regression/games/trevor/auto/d29.sgf [new file with mode: 0644]
regression/games/trevor/auto/d32.sgf [new file with mode: 0644]
regression/games/trevor/auto/d33.sgf [new file with mode: 0644]
regression/games/trevor/auto/d39.sgf [new file with mode: 0644]
regression/games/trevor/auto/d40.sgf [new file with mode: 0644]
regression/games/trevor/auto/d45.sgf [new file with mode: 0644]
regression/games/trevor/auto/d46.sgf [new file with mode: 0644]
regression/games/trevor/auto/d47.sgf [new file with mode: 0644]
regression/games/trevor/auto/d48.sgf [new file with mode: 0644]
regression/games/trevor/owl111a.sgf [new file with mode: 0644]
regression/games/trevor/trevor_01.sgf [new file with mode: 0644]
regression/games/trevor/trevor_02.sgf [new file with mode: 0644]
regression/games/trevor/trevor_03.sgf [new file with mode: 0644]
regression/games/trevor/trevor_04.sgf [new file with mode: 0644]
regression/games/trevor/trevor_05.sgf [new file with mode: 0644]
regression/games/trevor/trevor_06.sgf [new file with mode: 0644]
regression/games/trevor/trevor_07.sgf [new file with mode: 0644]
regression/games/trevor/trevor_08.sgf [new file with mode: 0644]
regression/games/trevor/trevor_09.sgf [new file with mode: 0644]
regression/games/trevor/trevor_10.sgf [new file with mode: 0644]
regression/games/trevor/trevor_11.sgf [new file with mode: 0644]
regression/games/trevor/trevor_12.sgf [new file with mode: 0644]
regression/games/trevor/trevor_13.sgf [new file with mode: 0644]
regression/games/trevor/trevor_14.sgf [new file with mode: 0644]
regression/games/trevor/trevor_15.sgf [new file with mode: 0644]
regression/games/trevor/trevor_16.sgf [new file with mode: 0644]
regression/games/trevor/trevor_17.sgf [new file with mode: 0644]
regression/games/trevor/trevor_18.sgf [new file with mode: 0644]
regression/games/trevor/trevor_19.sgf [new file with mode: 0644]
regression/games/trevor/trevor_20.sgf [new file with mode: 0644]
regression/games/trevor/trevor_21.sgf [new file with mode: 0644]
regression/games/trevor/trevor_22.sgf [new file with mode: 0644]
regression/games/trevor/trevor_23.sgf [new file with mode: 0644]
regression/games/trevor/trevor_24.sgf [new file with mode: 0644]
regression/games/trevor/trevor_25.sgf [new file with mode: 0644]
regression/games/trevor/trevor_26.sgf [new file with mode: 0644]
regression/games/trevor/trevor_27.sgf [new file with mode: 0644]
regression/games/trevor/trevor_28.sgf [new file with mode: 0644]
regression/games/trevor/trevor_29.sgf [new file with mode: 0644]
regression/games/trevor/trevor_30.sgf [new file with mode: 0644]
regression/games/trevor/trevor_31.sgf [new file with mode: 0644]
regression/games/trevor/trevor_32.sgf [new file with mode: 0644]
regression/games/trevor/trevor_33.sgf [new file with mode: 0644]
regression/games/trevor/trevor_34.sgf [new file with mode: 0644]
regression/games/trevor/trevor_35.sgf [new file with mode: 0644]
regression/games/trevor/trevor_36.sgf [new file with mode: 0644]
regression/games/trevor/trevor_37.sgf [new file with mode: 0644]
regression/games/trevor/trevor_38.sgf [new file with mode: 0644]
regression/games/trevor/trevor_39.sgf [new file with mode: 0644]
regression/games/trevor/trevor_40.sgf [new file with mode: 0644]
regression/games/trevor/trevor_40a.sgf [new file with mode: 0644]
regression/games/trevor/trevor_41.sgf [new file with mode: 0644]
regression/games/trevor/trevor_42.sgf [new file with mode: 0644]
regression/games/trevor/trevor_43.sgf [new file with mode: 0644]
regression/games/trevor/trevor_44.sgf [new file with mode: 0644]
regression/games/trevor/trevor_45.sgf [new file with mode: 0644]
regression/games/trevor/trevor_46.sgf [new file with mode: 0644]
regression/games/trevor/trevor_47.sgf [new file with mode: 0644]
regression/games/trevor/trevor_48.sgf [new file with mode: 0644]
regression/games/trevor/trevor_59.sgf [new file with mode: 0644]
regression/games/trevor/trevor_60.sgf [new file with mode: 0644]
regression/games/trevor/trevor_63.sgf [new file with mode: 0644]
regression/games/trevor/trevor_64.sgf [new file with mode: 0644]
regression/games/trevor/trevor_65.sgf [new file with mode: 0644]
regression/games/trevor/trevor_66.sgf [new file with mode: 0644]
regression/games/trevor/trevor_67.sgf [new file with mode: 0644]
regression/games/trevor/trevor_68.sgf [new file with mode: 0644]
regression/games/trevor/trevor_69.sgf [new file with mode: 0644]
regression/games/trevor/trevor_70.sgf [new file with mode: 0644]
regression/games/trevor/trevor_71.sgf [new file with mode: 0644]
regression/games/trevor/trevor_73.sgf [new file with mode: 0644]
regression/games/trevor/trevor_74.sgf [new file with mode: 0644]
regression/games/trevor/trevor_75.sgf [new file with mode: 0644]
regression/games/tso_igobot_2006-01-16.sgf [new file with mode: 0644]
regression/games/unconditional/benson_safe1.sgf [new file with mode: 0644]
regression/games/unconditional/benson_safe2.sgf [new file with mode: 0644]
regression/games/unconditional/benson_safe3.sgf [new file with mode: 0644]
regression/games/unconditional/benson_unsafe.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional1.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional2.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional3.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional4.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional5.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional6.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional7.sgf [new file with mode: 0644]
regression/games/unconditional/unconditional8.sgf [new file with mode: 0644]
regression/games/unfinished.sgf [new file with mode: 0644]
regression/games/vaughn.sgf [new file with mode: 0644]
regression/games/verybad.sgf [new file with mode: 0644]
regression/games/viking1.sgf [new file with mode: 0644]
regression/games/viking2.sgf [new file with mode: 0644]
regression/games/viking3.sgf [new file with mode: 0644]
regression/games/wing-yuhiko-gnugo.sgf [new file with mode: 0644]
regression/games/wormflaw.sgf [new file with mode: 0644]
regression/games/xxlin.sgf [new file with mode: 0644]
regression/gifu03.tst [new file with mode: 0644]
regression/gifu05.tst [new file with mode: 0644]
regression/global.tst [new file with mode: 0644]
regression/golife.tst [new file with mode: 0644]
regression/golois/Aya991113-1.sgf [new file with mode: 0644]
regression/golois/Aya991113-11.sgf [new file with mode: 0644]
regression/golois/Aya991113-12.sgf [new file with mode: 0644]
regression/golois/Aya991113-13.sgf [new file with mode: 0644]
regression/golois/Aya991113-2.sgf [new file with mode: 0644]
regression/golois/Aya991113-3.sgf [new file with mode: 0644]
regression/golois/Aya991113-6.sgf [new file with mode: 0644]
regression/golois/Aya991113-7.sgf [new file with mode: 0644]
regression/golois/Aya991113-8.sgf [new file with mode: 0644]
regression/golois/Aya991113-9.sgf [new file with mode: 0644]
regression/golois/Basique990715-1.sgf [new file with mode: 0644]
regression/golois/BiwakoFost97-1.sgf [new file with mode: 0644]
regression/golois/BiwakoFost97-2.sgf [new file with mode: 0644]
regression/golois/Connecter990424-1.sgf [new file with mode: 0644]
regression/golois/Connecter990424-2.sgf [new file with mode: 0644]
regression/golois/Connecter990426-1.sgf [new file with mode: 0644]
regression/golois/Connecter990426-2.sgf [new file with mode: 0644]
regression/golois/Connecter990427-1.sgf [new file with mode: 0644]
regression/golois/Connecter990428-1.sgf [new file with mode: 0644]
regression/golois/Connecter990430-1.sgf [new file with mode: 0644]
regression/golois/Connecter990430-2.sgf [new file with mode: 0644]
regression/golois/Connecter990430-3.sgf [new file with mode: 0644]
regression/golois/Connecter990501-1.sgf [new file with mode: 0644]
regression/golois/Connecter990502-1.sgf [new file with mode: 0644]
regression/golois/Connecter990621-1.sgf [new file with mode: 0644]
regression/golois/Connecter990628-1.sgf [new file with mode: 0644]
regression/golois/Connecter990628-2.sgf [new file with mode: 0644]
regression/golois/Connecter990630-1.sgf [new file with mode: 0644]
regression/golois/DeuxYeuxIndigoIng98.sgf [new file with mode: 0644]
regression/golois/DeuxYeuxManyFacesIng98.sgf [new file with mode: 0644]
regression/golois/GoAheadMarseille97.sgf [new file with mode: 0644]
regression/golois/GoMaster991113-1.sgf [new file with mode: 0644]
regression/golois/GoMaster991113-3.sgf [new file with mode: 0644]
regression/golois/GoMaster991113-4.sgf [new file with mode: 0644]
regression/golois/GoMaster991113-5.sgf [new file with mode: 0644]
regression/golois/GoStar991114-1.sgf [new file with mode: 0644]
regression/golois/GoStar991114-2.sgf [new file with mode: 0644]
regression/golois/Goemate990902-1.sgf [new file with mode: 0644]
regression/golois/Goemate990902-11.sgf [new file with mode: 0644]
regression/golois/Goemate990902-14.sgf [new file with mode: 0644]
regression/golois/Goemate990902-15.sgf [new file with mode: 0644]
regression/golois/Goemate990902-3.sgf [new file with mode: 0644]
regression/golois/Goemate990902-5.sgf [new file with mode: 0644]
regression/golois/Goemate990902-7.sgf [new file with mode: 0644]
regression/golois/Goemate990903-1.sgf [new file with mode: 0644]
regression/golois/Goemate990903-10.sgf [new file with mode: 0644]
regression/golois/Goemate990903-12.sgf [new file with mode: 0644]
regression/golois/Goemate990903-3.sgf [new file with mode: 0644]
regression/golois/Goemate990903-4.sgf [new file with mode: 0644]
regression/golois/Goemate990903-5.sgf [new file with mode: 0644]
regression/golois/Goemate990903-6.sgf [new file with mode: 0644]
regression/golois/Goemate990903-7.sgf [new file with mode: 0644]
regression/golois/Goemate990903-9.sgf [new file with mode: 0644]
regression/golois/Goemate990904-3.sgf [new file with mode: 0644]
regression/golois/Goemate990904-4.sgf [new file with mode: 0644]
regression/golois/Goemate990906-1.sgf [new file with mode: 0644]
regression/golois/Goemate990906-2.sgf [new file with mode: 0644]
regression/golois/Goemate990907-2.sgf [new file with mode: 0644]
regression/golois/Goemate990908-2.sgf [new file with mode: 0644]
regression/golois/Goemate990910-1.sgf [new file with mode: 0644]
regression/golois/Goemate990911-1.sgf [new file with mode: 0644]
regression/golois/Goemate990911-2.sgf [new file with mode: 0644]
regression/golois/Goemate990911-3.sgf [new file with mode: 0644]
regression/golois/Goemate991106-2.sgf [new file with mode: 0644]
regression/golois/Goemate991106-3.sgf [new file with mode: 0644]
regression/golois/Goemate991106-4.sgf [new file with mode: 0644]
regression/golois/Goemate991109-1.sgf [new file with mode: 0644]
regression/golois/Goemate991109-3.sgf [new file with mode: 0644]
regression/golois/Goemate991113-1.sgf [new file with mode: 0644]
regression/golois/Goemate991113-4.sgf [new file with mode: 0644]
regression/golois/Goemate991113-5.sgf [new file with mode: 0644]
regression/golois/Goemate991218-1.sgf [new file with mode: 0644]
regression/golois/Handtalk980802.sgf [new file with mode: 0644]
regression/golois/Handtalk980803-2.sgf [new file with mode: 0644]
regression/golois/Handtalk980819-1.sgf [new file with mode: 0644]
regression/golois/Handtalk980820-1.sgf [new file with mode: 0644]
regression/golois/Handtalk980820-2.sgf [new file with mode: 0644]
regression/golois/Handtalk980820-4.sgf [new file with mode: 0644]
regression/golois/Handtalk980820-5.sgf [new file with mode: 0644]
regression/golois/Handtalk980820-6.sgf [new file with mode: 0644]
regression/golois/Handtalk980820-7.sgf [new file with mode: 0644]
regression/golois/Handtalk980821-1.sgf [new file with mode: 0644]
regression/golois/Handtalk980821-2.sgf [new file with mode: 0644]
regression/golois/Handtalk980822-3.sgf [new file with mode: 0644]
regression/golois/Handtalk980822-4.sgf [new file with mode: 0644]
regression/golois/Handtalk980824-1.sgf [new file with mode: 0644]
regression/golois/Handtalk980826-1.sgf [new file with mode: 0644]
regression/golois/Handtalk980828-2.sgf [new file with mode: 0644]
regression/golois/Handtalk980828-3.sgf [new file with mode: 0644]
regression/golois/Indigo-Golois-991105-1.sgf [new file with mode: 0644]
regression/golois/Indigo-Golois-991105-2.sgf [new file with mode: 0644]
regression/golois/Indigo-Golois-991106-1.sgf [new file with mode: 0644]
regression/golois/Indigo-Golois-991106-2.sgf [new file with mode: 0644]
regression/golois/Indigo-Golois-991106-3.sgf [new file with mode: 0644]
regression/golois/Indigo20000718-2.sgf [new file with mode: 0644]
regression/golois/Indigo20000718-3.sgf [new file with mode: 0644]
regression/golois/Indigo991107-1.sgf [new file with mode: 0644]
regression/golois/Indigo991109-4.sgf [new file with mode: 0644]
regression/golois/Jimmy990621-1.sgf [new file with mode: 0644]
regression/golois/Jimmy990711-2.sgf [new file with mode: 0644]
regression/golois/Jimmy990711-4.sgf [new file with mode: 0644]
regression/golois/Jimmy990904-2.sgf [new file with mode: 0644]
regression/golois/Jimmy990904-3.sgf [new file with mode: 0644]
regression/golois/Jimmy990906-1.sgf [new file with mode: 0644]
regression/golois/Lanka991113-1.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0001.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0002.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0003.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0004.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0005.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0006.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0007.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0008.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0009.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup0010.sgf [new file with mode: 0644]
regression/golois/MeilleurCoup990428-1.sgf [new file with mode: 0644]
regression/golois/Neurogo97-1.sgf [new file with mode: 0644]
regression/golois/Neurogo97-3.sgf [new file with mode: 0644]
regression/golois/Prendre990424-1.sgf [new file with mode: 0644]
regression/golois/Prendre990430-1.sgf [new file with mode: 0644]
regression/golois/Prendre990502-1.sgf [new file with mode: 0644]
regression/golois/Prendre990630-1.sgf [new file with mode: 0644]
regression/golois/Vivre990630-2.sgf [new file with mode: 0644]
regression/golois/Vivre990630-3.sgf [new file with mode: 0644]
regression/golois/Vivre990630-4.sgf [new file with mode: 0644]
regression/golois/Vivre990706-1.sgf [new file with mode: 0644]
regression/golois/Vivre990706-2.sgf [new file with mode: 0644]
regression/golois/Vivre990706-3.sgf [new file with mode: 0644]
regression/golois/Vivre990706-4.sgf [new file with mode: 0644]
regression/golois/Vivre990706-5.sgf [new file with mode: 0644]
regression/golois/Vivre990710-1.sgf [new file with mode: 0644]
regression/golois/bug96.sgf [new file with mode: 0644]
regression/golois/connecter990614-1.sgf [new file with mode: 0644]
regression/golois/connecter990614-2.sgf [new file with mode: 0644]
regression/golois/knippel.sgf [new file with mode: 0644]
regression/golois/ko990604.sgf [new file with mode: 0644]
regression/golois/test.sgf [new file with mode: 0644]
regression/golois/test_prendre.sgf [new file with mode: 0644]
regression/golois/web000103.sgf [new file with mode: 0644]
regression/gunnar.tst [new file with mode: 0644]
regression/handtalk.tst [new file with mode: 0644]
regression/heikki.tst [new file with mode: 0644]
regression/joseki.tst [new file with mode: 0644]
regression/kgs.tst [new file with mode: 0644]
regression/lazarus.tst [new file with mode: 0644]
regression/ld_owl.tst [new file with mode: 0644]
regression/manyfaces.tst [new file with mode: 0644]
regression/manyfaces1.tst [new file with mode: 0644]
regression/nando.tst [new file with mode: 0644]
regression/neurogo.tst [new file with mode: 0644]
regression/newscore.tst [new file with mode: 0644]
regression/nicklas1.tst [new file with mode: 0644]
regression/nicklas2.tst [new file with mode: 0644]
regression/nicklas3.tst [new file with mode: 0644]
regression/nicklas4.tst [new file with mode: 0644]
regression/nicklas5.tst [new file with mode: 0644]
regression/niki.tst [new file with mode: 0644]
regression/ninestones.tst [new file with mode: 0644]
regression/nngs.tst [new file with mode: 0644]
regression/nngs1.tst [new file with mode: 0644]
regression/nngs2.tst [new file with mode: 0644]
regression/nngs3.tst [new file with mode: 0644]
regression/nngs4.tst [new file with mode: 0644]
regression/olympiad2004.tst [new file with mode: 0644]
regression/optics.tst [new file with mode: 0644]
regression/owl.tst [new file with mode: 0644]
regression/owl1.tst [new file with mode: 0644]
regression/reading.tst [new file with mode: 0644]
regression/regress.awk [new file with mode: 0644]
regression/regress.cmd [new file with mode: 0644]
regression/regress.pike [new file with mode: 0755]
regression/regress.pl [new file with mode: 0755]
regression/regress.plx [new file with mode: 0755]
regression/regress.sh [new file with mode: 0755]
regression/rosebud.tst [new file with mode: 0644]
regression/safety.tst [new file with mode: 0644]
regression/score.tst [new file with mode: 0644]
regression/score2.tst [new file with mode: 0644]
regression/seki.tst [new file with mode: 0644]
regression/semeai.tst [new file with mode: 0644]
regression/strategy.tst [new file with mode: 0644]
regression/strategy2.tst [new file with mode: 0644]
regression/strategy3.tst [new file with mode: 0644]
regression/strategy4.tst [new file with mode: 0644]
regression/strategy5.tst [new file with mode: 0644]
regression/tactics.tst [new file with mode: 0644]
regression/tactics1.tst [new file with mode: 0644]
regression/test.sh [new file with mode: 0755]
regression/thrash.tst [new file with mode: 0644]
regression/tiny.tst [new file with mode: 0644]
regression/trevor.tst [new file with mode: 0644]
regression/trevora.tst [new file with mode: 0644]
regression/trevorb.tst [new file with mode: 0644]
regression/trevorc.tst [new file with mode: 0644]
regression/trevord.tst [new file with mode: 0644]
regression/unconditional.tst [new file with mode: 0644]
regression/vie.tst [new file with mode: 0644]
regression/view.pike [new file with mode: 0644]
regression/viking.tst [new file with mode: 0644]
sgf/CMakeLists.txt [new file with mode: 0644]
sgf/Makefile.am [new file with mode: 0644]
sgf/Makefile.in [new file with mode: 0644]
sgf/sgf.dsp [new file with mode: 0644]
sgf/sgf_extras.def [new file with mode: 0644]
sgf/sgf_properties.def [new file with mode: 0644]
sgf/sgf_properties.h [new file with mode: 0644]
sgf/sgf_utils.c [new file with mode: 0644]
sgf/sgfgen.c [new file with mode: 0644]
sgf/sgfgen.dsp [new file with mode: 0644]
sgf/sgfnode.c [new file with mode: 0644]
sgf/sgftree.c [new file with mode: 0644]
sgf/sgftree.h [new file with mode: 0644]
stamp-h.in [new file with mode: 0644]
utils/CMakeLists.txt [new file with mode: 0644]
utils/Makefile.am [new file with mode: 0644]
utils/Makefile.in [new file with mode: 0644]
utils/README [new file with mode: 0644]
utils/getopt.c [new file with mode: 0644]
utils/getopt1.c [new file with mode: 0644]
utils/gg-getopt.h [new file with mode: 0644]
utils/gg_utils.c [new file with mode: 0644]
utils/gg_utils.h [new file with mode: 0644]
utils/random.c [new file with mode: 0644]
utils/random.h [new file with mode: 0644]
utils/utils.dsp [new file with mode: 0644]
utils/winsocket.c [new file with mode: 0644]
utils/winsocket.h [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..a6463d2
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,8 @@
+GNU Go authors (in chronological order of contribution) are Man Li, Wayne
+Iba, Daniel Bump, David Denholm, Gunnar Farneback, Nils Lohner, Jerome
+Dumonteil, Tommy Thorn, Nicklas Ekstrand, Inge Wallin, Thomas Traber,
+Douglas Ridgway, Teun Burgers, Tanguy Urvoy, Thien-Thi Nguyen, Heikki
+Levanto, Mark Vytlacil, Adriaan van Kessel, Wolfgang Manner, Jens Yllman,
+Don Dailey, Mans Ullerstam, Arend Bayer, Trevor Morris, Evan Berggren
+Daniel, Fernando Portela, Paul Pogonyshev, S.P. Lee, Stéphane Nicolet,
+Martin Holters, Grzegorz Leszczynski and Lee Fisher.
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..47cee59
--- /dev/null
@@ -0,0 +1,51 @@
+PROJECT(GNUGo)
+
+INCLUDE(CheckIncludeFiles)
+CHECK_INCLUDE_FILES(sys/times.h HAVE_SYS_TIMES_H)
+CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H)
+CHECK_INCLUDE_FILES("sys/time.h;time.h" TIME_WITH_SYS_TIME)
+CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES(curses.h HAVE_CURSES_H)
+CHECK_INCLUDE_FILES(glib.h HAVE_GLIB_H)
+CHECK_INCLUDE_FILES(ncurses/curses.h HAVE_NCURSES_CURSES_H)
+CHECK_INCLUDE_FILES(ncurses/term.h HAVE_NCURSES_TERM_H)
+CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILES(term.h HAVE_TERM_H)
+CHECK_INCLUDE_FILES(crtdbg.h HAVE_CRTDBG_H)
+CHECK_INCLUDE_FILES("winsock.h;io.h" HAVE_WINSOCK_IO_H)
+
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE(long SIZEOF_LONG)
+
+INCLUDE(CheckFunctionExists)
+CHECK_FUNCTION_EXISTS(times HAVE_TIMES)
+CHECK_FUNCTION_EXISTS(usleep HAVE_USLEEP)
+CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
+CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
+# FIXME: Probably necessary to add the glib library for this test to pass.
+CHECK_FUNCTION_EXISTS(g_vsnprintf HAVE_G_VSNPRINTF)
+
+SET(PRAGMAS "")
+IF(WIN32)
+    SET(PRAGMAS "#pragma warning(disable: 4244 4305)")
+ENDIF(WIN32)
+
+IF(MSVC80)
+    ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
+    ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
+ENDIF(MSVC80)
+
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake
+               ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
+# Make sure all files know about and can find config.h
+ADD_DEFINITIONS(-DHAVE_CONFIG_H)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+
+# Recurse into subdirectories.
+ADD_SUBDIRECTORY(utils)
+ADD_SUBDIRECTORY(sgf)
+ADD_SUBDIRECTORY(engine)
+ADD_SUBDIRECTORY(patterns)
+ADD_SUBDIRECTORY(interface)
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..61f1f17
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,7962 @@
+-------------------------------------------------------------------------
+-- ChangeLog
+-------------------------------------------------------------------------
+
+3.8 released February 17, 2009
+
+- added Wietze Brandsma to THANKS
+- revised config.vc
+- revised NEWS
+- restored missing mkmcpat.dsp, regress.cmd
+
+3.8rc1 released February 6, 2009
+
+- revisions to montecarlo.texi
+- revised .dsp files
+- Lee Fisher added to AUTHORS
+- WINDOWS doc and install.texi revised per Lee Fisher's changes
+- mkmcpat puts 16 items on a line instead of 8
+- (unsigned char) and (unsigned short) explicit typings
+- missing files added to EXTRA_DIST
+- copyrights updated to 2009
+
+3.7.13 released December 23, 2008
+
+- restore cmake files that were missing from the 3.7.12 tarball
+- bring copyright date to 2008
+- doc revision
+- be forgiving with replacement moves conflicting with unconditional analysis
+- accept --enable-socket-support even if configure test fails
+- add globals.c to mkmcpat for OS/X build
+
+3.7.12 released April 7, 2008
+
+- cmake configuration files for generating MSVC project files
+- minor doc revision
+- new options --mc-patterns, --mc-list-patterns, and --mc-load-patterns
+- tunable local patterns for Monte Carlo simulations
+- try harder to find the right move to make seki in find_moves_to_make_seki()
+- better heuristics to avoid calling semeai reading in
+  find_moves_to_make_seki() in hopeless cases
+- never amalgamate dragons over three-liberty strings and sometimes not
+  over two-liberty strings
+- send_two_return_one() moved from utils.c to board.c and reimplemented
+- new file engine/montecarlo.c
+- new options --monte-carlo and --mc-games-per-level to use Monte Carlo UCT
+  search on 9x9 and smaller boards
+- call check_boardsize() from play_gmp.c to avoid crashing on bad board sizes
+- new function check_boardsize()
+- bugfix in handling of foreground color with ncurses
+- orientation invariant board hashes added
+- tuning
+- add STS-RV semeai regression test suite
+- new and revised tests
+
+3.7.11 released November 1, 2007
+
+- gtp-commands.texi is not built automatically
+- updates texinfo.tex
+- minor doc revision
+- revised configure.in, aclocal.m4 and *Makefile.in for recent autotools
+- removed acconfig.h
+- don't play send-two-return-one in tactical reading attack moves
+- bugfix in reevaluate_ko_threats() to avoid a crash
+- more efficient aftermath moves
+- version 3 of GPL and update copyright for 2007
+- new static function remove_eye_filling_moves() in owl.c
+- semeai reading revisions
+- look more ambitiously for back-capturing moves in attack1()  
+- generate cut move reasons for cutting moves found during find_connections()
+- fix compilation with MAX_BOARD set to low boardsizes (>= 7 tested)
+- performance tuning in do_owl_analyze_semeai()
+- detect unconditionally meaningless moves
+- get_lively_stones() revised to be valid also for stackp>0
+- bugfix in compute_owl_escape_values()
+- moves can be marked as known_safe_moves by patterns
+- bugfix in compute_surroundings()
+- owl tuning
+- new and revised tests
+
+3.7.10 released May 21, 2006
+
+- gnugo.dsw and uncompress_fuseki.dsp revised
+- configure.in revised to improve socket support detection on windows
+- gameinfo_play_sgftree_rot() revised to fail gracefully
+- new static really_do_trymove() and is_superko_violation()   in board.c 
+- board hashes stored in the move history
+- is_legal() no longer depends on allow_suicide
+- new is_allowed_move() to determine legality for current suicide and ko rules 
+- new global variables suicide_rule and ko_rule
+- illegal moves replaced with passes near the end of do_genmove()
+- reevaluate_ko_threats() revised
+- under superko rules look for ko threats also if best move illegal
+- new options --forbid-suicide (default) and --allow-all-suicide
+- new options --simple-ko (default), --no-ko, --positional-superko, 
+  and --situational-superko 
+- is_allowed_move() used instead of is_legal() in play_gtp.c, play_ascii.c
+  and play_solo.c  
+- identify_thrashing_dragons() called earlier in make_dragons()
+- do not play self-atari while splitting eyespaces in aftermath_genmove()
+- in do_owl_attack(), don't consider send-two-return-one defender moves
+- send-two-return-one moves not tried in find_more_attack_and_defense_moves() 
+- send-two-return-one moves not tried in   find_worm_attacks_and_defenses()
+- string connection bonus for ko captures reduced in move_connects_strings()
+- maximum bonus from secondary move values limited to 0.4 points
+- more legality checking in fill_liberty()
+- detect_tactical_blunder() revised to avoid finding illegal defense moves
+- semeai.tst reordered
+- new option --limit-commands to regress.pike
+- new testfile 13x13c.tst
+- do not try to add an sgf circle for pass moves in replay_node()
+- new enum same_dragon_value in owl.c
+- new owl_defendpats.db classification "a" for connecting all friendly 
+  stones to the goal
+- owl tuning
+- influence tuning
+- tuning
+- new and revised tests
+
+3.7.9 released March 10, 2006
+
+- new GTP command advance_random_seed <games>
+- make update_random_seed() deterministic
+- fix assertion failure in semeai()
+- semeai attack and defense codes added to struct dragon_data2
+- in estimate_territorial_value(), let stones have influence strength also
+  when their safety depends on ko      
+- unify internal handling of limit_search and restricted_genmove
+- new function play_lib_n() in utils.c and autohelper functions
+  oplay_lib/xplay_lib
+- new static function modify_eyefilling_move() in owl.c
+- do not reset permeability around dead stones
+- do not consider moves playing into snapback in
+  do_find_more_owl_attack_and_defense_moves()
+- new function playing_into_snapback() in utils.c
+- only call do_find_more_owl_attack_and_defense_moves() when stackp==0
+- use .strategic_size in estimate_strategical_value()
+- new field .strategic_size in dragon_data2, includes bonus for weak neighbors
+- use gg_normalize_float2int() in valuate_combinable_pattern_chain() to
+  address platform dependencies
+- carefully select new owl goal origin
+- allow excess strategical value for some single-worm dragons
+- include played move in atari-atari blunder analysis
+- score.c removed from sources
+- owl tuning
+- tuning
+- new and revised tests
+
+3.7.8 released January 30, 2006
+
+- new global variable handicap
+- chinese scoring adds the number of handicap stones in addition to the
+  komi to white's score
+- include handicap in sgf headers
+- dead code removed from influence_evaluate_position() and the rest moved
+  to game_status()
+- metamachine enabled in ascii mode (as in GNU Go 3.6)
+- configure option oracle renamed metamachine (as in GNU Go 3.6)
+- new testfile gifu05.tst
+- don't try large scale attack if original owl reading was expensive
+- teach influence_score() about chinese rules
+- copyright notices updated for 2006
+- bugfix in unconditional status analysis
+- let --capture-all-dead and --play-out-aftermath be effective also when
+  playing out a game for scoring (e.g. --score finish)
+- semeai analysis turned off when there are a huge number of dragons
+- MAX_STRINGS value corrected
+- new assertions that the next_string pointer hasn't overflowed
+- hash flag bits and -H option removed
+- default size of reading cache set to a fixed number of entries instead
+  of a fixed amount of memory, improving platform independence
+- update information about valid boardsizes in gnugo.pod
+- bugfix for drawing 1x1 board in play_ascii.c
+- regress.pike can run multiple engines in parallel (-j option)
+- correction of color in order_moves() call in reading.c
+- doc revision, updated instruction for setting up HTML regression views
+- find_connection_moves() revised
+- GTP command dragon_data fixed to give well-formed output also on empty
+  board
+- update regress.pl and regress.plx to count connection nodes instead of
+  life nodes and expect reg_genmove instead of gg_genmove
+- remove gnugo_play_sgftree(), gnugo_genmove(), gameinfo_load_sgfheader(),
+  and gameinfo_play_move() from engine/interface.c
+- 1D conversion of gnugo_play_move()
+- new function get_sgfmove()
+- let semeai code pass if no riskless move was found
+- do not hardwire owl node limit for large scale attacks
+- remove many unneeded configure tests
+- READLINE compile (warning) fixes
+- complete rework of clock.c, using level adaption logic from play_gtp.c
+- use more tactical moves in do_owl_analyze_semeai()
+- unused function transform2() removed
+- report_worm() made static in worm.c
+- hashdata_to_string() revised for consistency between 32 and 64 bit platforms 
+- bugfixes in do_aftermath_genmove()
+- adjust readconnect node limit when starting search at higher stackp
+- new function get_depth_modification()
+- removed functions set_temporary_depth_values()/restore_depth_values()
+- always set dragon status to ALIVE if owl_status is UNCHECKED
+- correct C-code footer in uncompress_fuseki.c for all values of
+  NUM_HASHVALUES 
+- play_replay() and replay_node() partially rewritten
+- tuning
+- new and revised tests
+       
+3.7.7 released October 9, 2005
+
+- FSF address corrected in COPYING
+- large scale improvements
+- use signed char instead of char most of the time in the engine
+- string_to_location(), debug_influence_move(), and report_worm()
+  converted to 1D
+- get_level() removed from genmove.c
+- documentation update
+- remove long deprecated command hurry from play_ascii
+- use signed char in connected_components() in owl.c
+- rotation support for --decide_* options removed
+- remove trivial wrapper functions from engine/interface.c
+- patterns/transpat.c, patterns/patlib.c, and patterns/patlib.h removed
+- unused game records in regression/golois removed
+- makevcdist.pl updated and re-run
+- all Makefile.in regenerated
+- debugboard traces from Makefile and configure removed
+- endgame1.tst removed from distribution but not from CVS
+- cutstone.tst, semeai2.tst, and *_rot.tst removed
+- debugboard removed   
+- support for pattern based reading (EXPERIMENTAL_READING) removed
+- support for tree based pattern matching removed
+- view.pike: support multiple tests as argument
+- test revisions
+- consistently initialize global variables in globals.c (not main.c)
+- large scale code reorganized
+- fullboard support (-f option) remove from mkpat
+- atari_atari tuning
+- endgame tuning
+       
+3.7.6 released September 21, 2005
+
+- a few missing game records restored
+- revised patterns.dsp and new uncompress_fuseki.dsp
+
+3.7.5 released September 20, 2005
+
+- revision to patterns.dsp (but more revision needed before VC will compile)
+- send usage messages caused by bad input to stderr    
+- new, larger fuseki database added as compressed files
+- new files patterns/compress_fuseki.c and patterns/uncompress_fuseki.c
+- use a fullboard hash for fuseki database patterns
+- new array comulative_goal in local_owl_data
+- don't count former owl goal dragon stones towards escape measure
+- removed PROFILE_MATCHER
+- handle CRLF newlines correctly in view.pike  
+- new static function squeeze_moves() in reading.c
+- fix komaster problem
+- do not trust connection moves to be safe in
+  estimate_territorial_value() 
+- add random move value contributions also for pure ko threats
+- new and revised tests
+
+3.7.4 released June 12, 2005
+
+- copyright notices updated for 2005 and new FSF address
+- bugfix in find_backfilling_move in filllib.c
+- make fast_defense() aware of under-the-stones tesuji
+- make superstring_break_chain_moves() attack 3-liberty chains
+- unused code to compute genus removed from make_dragons()
+- owl tuning
+- atari-atari tuning
+- optics tuning
+- tuning
+- new and revised tests
+
+3.7.3 released March 22, 2005
+
+- special_rescue_moves() allows self atari moves which may set up a snapback
+- increase depth after filling liberties in endgame_find_backfilling_dame()
+- try harder to find safe backfilling moves in endgame_find_backfilling_dame()
+- revised heuristics to find a font file in view.pike
+- avoid crashing on bad engine paths when starting a new engine in view.pike
+- move_connects_strings() revised
+- outcommented patterns removed
+- ignore off board vertices in openregion() in fuseki.c
+- Revise diagonal value in topological_eye() to account for damezumari
+- owl tuning   
+- new and revised tests
+
+3.7.2 released January 20, 2005
+
+- gnugo.el: Grid display implemented
+- gnugo.el: SGF handling improved
+- gnugo.el: Undo and Redo related enhancements
+- gnugo.el: Primitive edit mode
+- gnugo.el: Regression view mode
+- Doc revision (Emacs mode in using.texi)
+- use print_numeric_influence() for printing escape influence
+- take neighbouring half/false eyes into account when estimating lunch value
+- do not trust strategic attack and defense moves to be safe when scoring
+- thrash_around_helper() returns false if fuseki is disabled
+- value_territory() revised to disable certain reductions of the territory
+  value when scoring
+- regress.pike revised so that previous output can be used as input
+  with -f to rerun tests with unexpected results
+- connection_value() revised
+- use influence-based score estimate instead of Bouzy's algorithm
+- new global variable white_score, black_score
+- should_resign() now depends on optimistic_score instead of average_score
+- added support for GTP over TCP/IP sockets on Windows
+- new static function all_own_neighbors_inessential() in aftermath.c
+- do_aftermath_genmove() revised
+- breakage2tst.py now produces command line for regress.pike
+- further revision of thrashing dragon heuristic
+- try harder to find backfilling moves in fill_liberty()
+- find_backfilling_move() in filllib.c revised
+- test_attack_either() revised
+- fixed anchor building of owl_attackpats.db repaired
+- thrashing dragon heuristics revised
+- readline support in ASCII mode
+- liberties and neighbors list broken out of string_data array in board.c
+  for speedup
+- new functions remove_double_blocks(), check_double_block() to improve
+  territorial evaluation at places where an intrusion is possible
+- stop using worm data at stackp==0 in does_attack() and does_defend()
+- concerns_noncritical_dragon() revised
+- MIN_BOARD reduced to 1
+- free memory allocated in a failed read of an sgf file
+- extract_fuseki revisions: statistics on outcomes,
+  popularity cutoffs based on unique players added to command line
+  parameters, tweaks and bugfixes in game selection
+- atari_atari moves considered blocking in estimate_territorial_value()
+- MAX_LIBERTIES reduced to 8
+- popgo() bugfix to repair sgf traces  
+- do_owl_analyze_semeai() revised
+- emacs variant of ascii interface removed
+- give less bonus to connection moves when scoring
+- influence tuning
+- owl tuning
+- tuning
+- new testsuite tiny.tst
+- new and revised tests
+       
+3.7.1 released November 23, 2004
+
+- new function send_two_return_one() in utils.c
+- don't consider send-two-return-one moves in
+  do_find_more_owl_attack_and_defense_moves() 
+- does_attack() made ko aware
+- new GTP commands does_attack and does_defend
+- sgfnode.c (readsgffile): Do not fclose stdin.
+- gtp.texi (GTP command reference): Add @cindex.
+- gtp-commands.sed: Use @verbatim. Tighten output. 
+- gtp-commands.sed: Move `Function' field into @item line, sans field name.
+- doc/ Makefile.am (gtp-commands.texi): Eliminate redundant use of cat(1).
+- revision of gtp-commands.sed
+- bugfix in main.c: remember to sgfFreeNode(gameinfo.game_record.root)
+- allow PASS_MOVE in trymove() and tryko()
+- do_trymove() and popgo() revised
+- 'printfsgf -' supported from GTP     
+- copyright notices added to xpm files
+- gnugo.el brought up to Thi's gnugo.el-2.2.8
+- new gtp_move_history() for use with gnugo.el
+- minor doc revision
+- capture_non_invincible_strings() and unconditional_life() moved from
+  utils.c to unconditional.c
+- resignation option reverted from GTP commands genmove_black and
+  genmove_white
+- new heuristic to reduce branching factor in connection reading.
+- resign rather than pass when all own stones seem dead
+- lively_dragon_exists() based on status rather than crude_status
+- potential_moves[] array converted to 1D
+- distance measures converted from floating to fixed point arithmetic
+  in connection reading code.
+- owl threats disabled as a command line option
+- EXIT_SUCCESS and EXIT_FAILURE used in transpat.c and sgfgen.c
+- revised interface to all genmove() type functions
+- new global variable depth_offset
+- only cache safe_move() results when reading depth is unmodified
+- revision of interface/emacs.el
+- new interface/xpms/*xpm, make-gnugo-xpms.el and gnugo-xpms.el
+- break_chain2_moves() revised
+- special_attack4_moves() revised
+- defend_secondary_chain_moves() revised and split into two functions
+- check_self_atari() in readconnect.c revised
+- devalue tactical defenses of owl critical dragons when there are
+  better owl defenses elsewhere 
+- find_moves_to_make_seki() extended to examine the case of dead stones
+  inside the eye of single-eyed dragons
+- added support for GTP communication over TCP/IP socket;  GNU Go can
+  both connect and listen
+- bugfix in break_in_goal_from_str(): check pos+delta on board
+- bugfix in sgfStartVariant
+- constrain thrashing dragons more often
+- hashing cleanups
+- missing files added to EXTRADIST in Makefile.* in doc/ and regression/
+- new file logo-36.pdf
+- DFA micro optimizations
+- Test results updated: cvs tag rel-3-7-1-pre-1
+- use int arrays instead of char arrays to mark eyes in
+  owl_determine_life() and dependent functions
+- added .eps-version of new logo
+- help string revised
+- warnings fixed
+- doc revisions
+- TODO revised
+- basic strategies to break mirror go implemented
+- matcher_check verbosity refined
+- new function are_neighbors()
+- 9x9 opening moves tuned
+- view.pike enhancement: switch to new test case
+- debugging enhancement: owl goal marked in sgf trees
+- new move reasons POTENTIAL_SEMEAI_ATTACK/DEFENSE to defer analysis of
+  possible semeai winning moves until move valuation
+- infrastructure to cut owl goal dragons
+- new owl pattern class C: threaten to cut owl goal dragon
+- view.pike enhancement: owl_does_defend/attack
+- crash in owl_hotspots() fixed
+- view.pike enhancement: directly start sgf viewer
+- remove special case of CLASS_C in matchpat.c
+- influence tuning
+- owl tuning
+- endgame tuning
+- tuning
+- implement persistent semeai caching
+- don't crash on some .sgf-files from kgs
+- NEWS updated
+- refer to 3.6 instead of 3.4 in docs
+- new and revised tests
+
+3.5.10 released August 7, 2004
+
+- move initalization of ..._vital_points to initialize_dragon_data()
+- persistent caches reorganized to share common code
+
+3.5.9 released July 18, 2004
+
+- bugfix in read_eye() 
+- bugfix in fast_defense()
+- improved printing of hashvalues
+- bugfix in atari_atari_blunder_size() 
+- new static function dump_board_sgf() in printutils.c
+- abortgo() no longer unwinds the stack but prints an sgf file
+- new and revised tests
+- doc revision
+
+3.5.8 released June 8, 2004
+
+- make `mkpat' detect duplicate pattern names
+- duplicate pattern names renamed
+- reduce DFA_MAX_MATCHED 20 times 
+- calculate actual maximum dfa with new dfa_calculate_max_matched_patterns()
+- remove unused configure option --experimental-semeai
+- add missing output to --options
+- new static function special_rescue4() called from defend2() in reading.c
+- fast_defense() now heuristically looks for neighbors to capture
+- don't restore random state in hash_init() and keyhash_init()
+- major `view.pike' revision, added new "single window" mode
+- break_chain2_moves() revised to generate more backfilling moves
+- atari_atari_blunder_size() now returns multiple defenses, better verified
+- remove %r support from gprintf, use result_to_string() instead
+- double_atari_chain2() revised to generate more moves
+- new argument recompute_dragons to owl_analyze_semeai_after_move()
+- owl_mark_dragon() and init_owl() revised
+- detect_tactical_blunder() revised
+- value of tactical blunders doubled to twice the effective size of the string
+- not a blunder if a string alive in seki is saved when outer liberties filled
+- normalize apos, bpos in do_owl_analyze_semeai
+- find_cuts() called from make_dragons() instead of make_domains()
+- new compute_new_dragons() and new static join_new_dragons() in dragon.c
+- new global array cutting_points[]
+- cut field removed from struct eye_data
+- INHIBIT_CONNECTION bit no longer used in the type field of struct eye_data
+- find_cuts() no longer allowed to modify eyespaces
+- bugfix in do_owl_analyze_semeai()
+- tuning
+- new and revised tests
+
+3.5.7 released May 27, 2004
+
+- minor revisions in score.c
+- regress.pike measures uncertainty of moves
+- global variable hashdata renamed to board_hash
+- hashdata_compare() function removed
+- fields in struct stats_data updated for new cache
+- initialization of Zobrist random numbers in hash.c and cache.c unified
+- new function hash_init_zobrist_array() in hash.c
+- hashdata_remainder() never uses more than the 32 lowest bits of hash value
+- hashdata_NULL, hashdata_clear(), and hashdata_init() macros removed
+- any number of MIN_HASHBITS can now be used
+- ROUTINE_COSTS revised
+- find_connection_moves() revised
+- always print copyright string on stdout
+- do not include "Version" in the --version output
+- old cache implementation removed
+- ignore inessential critical dragons in in dilate_erode()
+- TRACE_CACHED_RESULT* macros implemented for new caching scheme
+- old cache implementation commented out
+- new file engine/unconditional.c added
+- break-in reading tuned
+- safety checks improved for owl defense moves
+- bugfix in find_neighbor_dragons()
+- attribute "noreturn" for abortgo()
+- don't add child to root node in sgffile_printboard()
+- remove color parameter from examine_position(), compute_eyes_pessimistic()
+- new arrays white_vital_points and black_vital_points
+- read_eye() stores vital point in new arrays when add_moves == 1
+- new functions find_lunches(), revise_inessentiality(), eye_computations()
+  broken out of make_dragons()
+- VITAL_EYE_MOVE almost retired
+- fix bugs in recursive_break()
+- owl tuning
+- new and revised tests
+
+3.5.6 released April 23, 2004
+
+- new configure and runtime option large-scale
+- new change_owl_nodes()
+- gprintf supports %r
+- cleanup of patterns/*.sgf
+- revision of dragon_invincible()
+- suppress copyright notice in ASCII playing mode or with --version
+- copyright string shortened
+- new GTP commands move_probabilities and move_uncertainty
+- bugfix in unconditional_life()
+- owl_update_goal() overrides same_dragon == 0 in obvious cases
+- new and revised tests
+
+3.5.5 released April 15, 2004
+
+- moved TRACE_READ_RESULTS definition to hash.h
+- initialize lunch data for single owl move
+- bugfix in compute_eyes_pessimistic(): initialize chainlinks[]
+- improved sgf trace in trymove: location of tried move noted
+- complete conversion to new cache
+- add priority to reading results in new cache
+- kill unused hash_ng_init()
+- minor statistics improvements
+- enlarge owl goal when it has had lunch
+- komaster and kom_pos made static variables in board.c
+- edge_block_moves() proposes more moves
+- don't try to undo when stackp is not zero (GTP mode)
+- support for multiple engines in view.pike
+- more info about semeais in dragon_data2
+- double-check owl attack moves against dragons involved in semeai(s)
+- be less optimistic about large, but bulky eyespaces
+- support for 'make gnugo.pdf' and make 'gnugo.html' in doc/
+- slowest move statistics from regress.pike
+- update usages of time_report()
+- `twogtp.pike' can now use third engine (arbiter) to score games
+- breakin and readconnect fixes
+- first implementation of owl threat combinator--intended for improving
+  move ordering
+- pattern attributes (shape, followup etc.) are now stored in lists, not
+  in `pattern' structure
+- there is now a possibility to define virtually unlimited number of new
+  pattern attributes
+- common code of shapes_callback() and joseki_callback() is broken into
+  new static function handle_joseki_patterns()
+- new function do_find_more_owl_attack_and_defense_moves() broken out
+  of find_more_owl_attack_and_defense_moves()
+- induce_secondary_move_reasons() tries to upgrade induced reasons to
+  owl attacks/defenses with do_find_more_owl_attack_and_defense_moves()
+- strategical attack move reason is induced for saving certain worms
+  adjoining weak opponent dragons
+- major improvement of analyze_eyegraph functionality in optics.c
+- adjust min_level and max_level if --level is set outside their range
+- do not malloc() 0 bytes in pattern_list_build_heap()
+- aftermath_final_status() declaration moved from gnugo.h to liberty.h
+- bugfix in find_connection_moves()
+- bugfix in hashdata_init macro
+- caching enabled for unbranched owl nodes
+- comments added explaining heap in readconnect.c
+- provide links to html regression views from regress.sh
+- semeai analysis in make_dragons() postponed until after revision of
+  inessentiality 
+- identification of thrashing dragons in make_dragons() postponed
+  until after semeai analysis 
+- avoid overflow in reading_cache_init()
+- converted owl to use new cache implementation
+- owl tuning
+- new game records and test cases
+
+3.5.4 released January 23, 2004
+
+- copyright 2004 added to copyright notices
+- new static function capture_non_invincible_strings() broken out of 
+  unconditional_life()
+- unconditional_life() revised
+- new semeai_propose_eyespace_filling_move() tries to play inside eyeshapes
+- number_of_dragons initialized in initialize_dragon_data()
+- new option --gtp-dump-commands to dump all incoming GTP commands to file
+- new function and autohelper owl_lunch()
+- lunches_are_current field no longer reset in owl_safe_move()
+- don't claim levels higher than 10 are unsupported
+- new GTP command unconditional_status
+- estimate_lunch_eye_value() revised   
+- avoid calling owl_substantial() when not needed in aa_compute_status()
+- value_move_reasons() revised
+- special_rescue6_moves() revised
+- find_connection_moves() revised
+- computation of NUM_HASHVALUES corrected in hash.h
+- hashdata_to_string reimplemented
+- defend4() and special_rescue_moves() revised
+- avoid ko captures when filling outer liberties in semeai reading
+- adjust breakin_depth in modify_depth_values()
+- atari_atari tuning
+- endgame tuning
+- eye tuning
+- fuseki tuning
+- influence tuning
+- owl tuning
+- tuning
+- new test suite unconditional.tst
+- new game records and test cases
+
+3.5.3 released January 7, 2004
+
+- new GTP command kgs-genmove_cleanup
+- compute_crude_status() revised to consider dragons with big
+  territorial moyo value as alive
+- semeai moves considered safe in mark_changed_dragon
+- compare number of eyes when both colors pass in
+  do_owl_analyze_semeai() instead of always consider it a seki
+- do not use the attack point from owl if owl considers a dragon dead
+  but semeai revises it to critical
+- bugfix in break_through_helper() in reading.c
+- new static function close_enough_for_proper_semeai() in semeai.c
+- liberty_of_dragon() transformed into neighbor_of_dragon() in semeai.c
+- in semeai(), be more careful when considering two dragons involved
+  in a semeai
+- new static function max_lunch_eye_value() in value_moves.c
+- when restraining thrashing dragons, do not bother connecting
+  inessential strings which cannot provide an eye (in
+  estimate_strategical_value()) 
+- new autohelper function adjacent_to_stone_in_atari
+- new static bamboo_rescue_moves() in `reading.c'.
+- computation of safety and status values in make_dragons() revised to
+  more robustly handle invincible dragons
+- dragon_invincible() revised
+- detect_tactical_blunder() revised
+- owl stack management reimplemented
+- consider semeai worms adjacent to the outside as important in
+  owl_analyze_semeai_after_move()
+- additional semeai debug output
+- let stdout be unbuffered instead of line buffered in play_gtp()
+- if one dragon is considerably smaller than the other in a semeai,
+  prefer to get ko over seki in do_owl_analyze_semeai()
+- in a semeai, consider also the eyespaces including opponent semeai
+  worms in order to detect a definite lack of eyespace and to find
+  certain vital moves
+- off-by-one error in loops over semeai_worms[] corrected
+- don't allow "safe" common liberties to depend on ko in
+  do_owl_analyze_semeai() 
+- new static function find_moves_to_make_seki() in semeai.c
+- do semeai analysis for all pairs of critical/dead dragons except
+  when one is inessential, other exceptional cases removed from semeai()
+- defend4() generates superstring moves
+- semeai_move_reasons() revised
+- induce_secondary_move_reasons() revised; do not allow owl attack moves
+  to induce strategic defense of neighbors if involved in a semeai
+- connection_value() revised to never give points for connection to
+  inessential strings
+- get_influence() revised
+- list_move_reasons() revised and made global
+- new functions print_all_move_values() and prepare_move_influence_debugging()
+- delta_territory cache can be disabled in estimate_territorial_value()
+- new GTP commands all_move_values, eye_data, half_eye_data, move_reasons
+- GTP command influence replaced by initial_influence, move_influence, and
+  followup_influence
+- GTP command clear_cache now also clears the non-persistent cache
+- bugfix in corner_add_pattern() (mkpat.c): labels must be rotated too
+- spread_connection_distances() now delays expensive constraint evaluation,
+  storing pending evaluation on a heap
+- new function signed_mark_string()
+- computation of active area revised in store_persistent_connection_cache(), 
+  store_persistent_breakin_cache(), and store_persistent_owl_cache()
+- move_is_marked_unsafe() in move_reasons.h revised
+- modify_stupid_eye_vital_point() revised
+- influence tuning
+- fuseki tuning
+- eye tuning
+- endgame tuning
+- owl tuning
+- tuning
+- new test suite seki.tst
+- new game records and test cases
+
+3.5.2 released November 5, 2003
+
+- Cosmic GNU Go disabled by default.
+- report_dragon() revised
+- gtp_worm_data() revised
+- pattern tagging
+- regress.sh revised
+- regress.pike revised
+- attack2() revised
+- defend4() revised
+- slow sorting in get_next_move_from_list() is replaced with heap sorting
+- new static functions pattern_list_build_heap() and
+  pattern_list_get_next_pattern() in `engine/owl.c'
+- new command line option --no-cosmic-gnugo
+- remove global variables score, lower_bound, upper_bound
+- remove (level >= 8) condition for estimate_score() call
+- pass our_score instead of score to the move valuation functions
+- tuning
+- influence tuning
+- owl tuning
+- joseki tuning
+- new game records and test cases
+
+3.5.1 released September 4, 2003
+
+- semeai() revised to better handle certain cases of multiple simultaneous
+  semeais 
+- find additional semeai moves in semeai_reasons()
+- added more robust handling of .dtr files
+- removed option to build pre-rotated DFAs
+- unconditional_status in struct worm_data changed to enum dragon_status
+- final_status in the aftermath code changed to use enum dragon_status
+- enum dragon_status extended with BLACK_TERRITORY, WHITE_TERRITORY,
+  and DAME
+- new GTP command last_move
+- threaten_to_capture_helper() and pattern `Sente12' retired
+- no buffering on stdout in ascii mode
+- roadmap to engine files in overview.texi updated
+- move DEBUG_func to showbord.c
+- pattern tuning: remove "t" classification from various patterns
+- WHITE_BORDER, BLACK_BORDER, GRAY_BORDER retired 
+- colors and komaster state, safety values and dragon status, cache routine
+  ids are now "enum"
+- board library: remove all stuff that is not directly related to board
+  (and move it to the engine)
+- board library: new file board.h as public interface, new file boardlib.c
+  to collect global variable of the board library;
+- board library documentation updated to reflect changes
+- new function: hashdata_to_string()
+- small_semeai() and small_semeai_analyzer() removed
+- support for !experimental_semeai removed
+- old semeai() removed and new_semeai() renamed to semeai()
+- analyze_semeai(), add_appropriate_semeai_moves(), and liberty_of_dragon()
+  removed
+- old amalgamation (!experimental_connections) code and patterns removed
+- dragon_eye() removed
+- basic_cut_helper() and ugly_cutstone_helper() removed
+- komaster schemes 1-4 removed
+- komaster_is_empty() retired
+- komaster_to_string() revised
+- KOMASTER_TRACE functionality removed
+- new GTP command combination_defend
+- revised hash table scheme
+- new COSMIC_GNUGO function choose_best_strategy() sets tuning parameters
+- new global tuning parameters: minimum_value_weight, maximum_value_weight,
+  invasion_malus_weight, strategical_weight, territorial_weight,
+  attack_dragon_weight;
+- remove unneeded configure stuff, add -Wundef to SOME_WARNINGS
+- replace setlinebuf by setvbuf
+- add safety_hash field to delta territory cache, reenable this cache
+- cgi interface in interface/html directory removed
+- owl tuning
+- new game records and test cases
+
+3.4 released July 31, 2003
+
+- breakage2tst.py and gnugo-db.el added to EXTRA_DIST
+- wariuchi fuseki: invade between shimaris
+- new sgmp mode
+- regress.pike added to EXTRA_DIST
+- revision of copyright notices
+- warnings fixed on some platforms
+- doc revision
+
+3.3.23 released July 15, 2003
+
+- bugfix in show_dragons()
+- redistribution consistency checking disabled for stable release
+- gg_genmove replaced by reg_genmove almost everywhere in the regressions
+- twogtp.py and twogtp.pike added to gtp_examples/README
+- twogtp and twogtp-a made GTP version 2 compliant
+- break-in code turned off below level 10; other level cutoffs revised
+- support for ranges in sgf files
+- time summaries reported with --showtime in gmp mode
+- TODO revised.
+- clock_init_autolevel() retired
+- new global variables min_level and max_level
+- new options --min-level and --max-level
+- time handling implemented in play_gtp.c
+- speedup: move some functionality of update_liberties() to do_remove_string()
+- bugfix in do_play_move()
+- doc: delete most lists of functions
+- doc: remove move_generation.texi overview sections
+- doc: reorder
+- doc: Consistently use hierarchical structure instead of next/previous/up
+- tuning
+- owl tuning
+- eye tuning
+- doc: complete rewrite of first sections of overview.texi
+- doc: subsection on 1D board array moved to board.texi
+- doc: references to cavities in dragon amalgamation removed
+- new game records and test cases
+
+3.3.22 released June 28, 2003
+
+- break-in code turned off below level 9
+- VPATH modifications in regression/Makefile*
+- new function thrash_around_helper()
+- thrashing patterns in patterns.db
+- configure --enable-cosmic-gnugo produces a center-oriented engine
+- added cache for results of approxlib() and accuratelib()
+- new static functions do_approxlib() and do_accuratelib() in board.c
+- finish_sgftrace() will not free the trace tree if not written successfully
+- remove tabs from twogtp.py
+- twogtp.py checks that board is not empty before indexing it
+- active area for persistent breakin cache shrinked
+- new HIGH_LIBERTY_BIT2 in persistent caches, used by breakin cache
+- new function break_chain4_moves()
+- owl moves for non-critical dragons discarded
+- do_owl_analyze_semeai() revised
+- detect_owl_blunder() also looks for semeai defenses
+- estimate_strategical_value() revised
+- new function defend_secondary_chain_moves() in reading.c
+- new parameter be_aggressive to break_chain2_moves(),
+  break_chain2_defense_moves() and break_chain3_moves()
+- new depth value: break_chain_depth
+- defend2() no longer plays on self atari liberties
+- superstring_breakchain_moves() renamed superstring_break_chain_moves()
+- fix "no moves found" logic in various readconnect.c functions
+- new debug flag DEBUG_BREAKIN
+- "smaller goal" in breakin.c revised
+- be more careful when erasing territory after successful break-in
+- break-in move generation bug fix
+- endgame_find_backfilling_dame() revised
+- new global array forced_backfilling_moves[]
+- find_backfilling_move in filllib.c revised
+- disable revise_semeai() when doing_scoring
+- no bonus for attack or defense of dead potential cutstones when doing_scoring
+- reevaluate_ko_threats() revised to avoid playing losing ko threats
+- RTRACE and VTRACE retired
+- corrected format of AP property in sgf_write_header()
+- tuning
+- owl_tuning
+- new game records and test cases
+
+3.3.21 released June 3, 2003
+
+- revision of owl_strong_dragon()
+- extra care is now taken not to waste points on tiny ko threats
+- ko threats with large followups always preferred to large reverse followups
+- twogtp.py fixed to handle jigo in endgame contests
+- made --enable-experimental-break-in the default
+- compute_smaller_goal() makes the goal even smaller in the block_off case
+- persistent caching for break_in()/block_off()
+- inessential dragons handled differently in estimate_territorial_value()
+- use smaller goal area when trying to break into territories
+- semeai_trymove_and_recurse() propagetes back changes to &owla, &owlb
+- copy over old eye_data in do_owl_defend() if escape > MAX_ESCAPE
+- new configure option --experimental-break-in
+- load_and_score_sgf_file() revised
+- detect_tactical_blunder() revised
+- ko result codes no longer discarded in owl_analyze_semeai()
+- new_semeai() revised
+- decide_semeai() in sgfdecide.c revised
+- GTP command owl_analyze_semeai renamed to analyze_semeai
+- new function owl_analyze_semeai_after_move() and corresponding GTP
+  command analyze_semeai_after_move
+- gtp_owl_analyze_semeai() revised
+- new static function semeai_trymove_and_recurse() in owl.c
+- all owl_analyze_semeai regression test cases changed to analyze_semeai
+  and revised for new result format
+- bugfixes in breakin.c and block_off()
+- new helper functions goal_to_hashvalue(), xor_hashvalues()
+- new function get_read_result_hash_modified to enable calling functions
+  to use a modified hash value when storing/looking up results in cache
+- results for recursive_break() and recursive_block() now get cached
+- cast to avoid warnings
+- documentation revisions
+
+3.3.20 released June 3, 2003
+
+- hoshi.sgf split into hoshi_keima.sgf and hoshi_other.sgf
+- new functions recursive_break(), recursive_block() in readconnect.c:
+  decide whether a string can be connected to an arbitrary goal area
+- new functions break_in(), block_off(), frontends to the functions above
+- corresponding GTP commands break_in, block_off
+- new file breakin.c evaluates whether territories can be broken in
+- new command line --experimental-break-in to evaluate territory break-ins
+- retire move_safety check in value_moves.c for territorial move valuation
+- read_eye() revised
+- `num_defends' field of half_eye_data strtucture renamed `num_defenses'
+- maximum 15 points of territorial_value will get shape bonus
+- change of semantics for --seed option
+- new GTP command printsgf
+- debugboard repaired
+- TODO revised
+- new function partition_eyespaces()
+- new function owl_find_relevant_eyespaces()
+- cpu time support for regress.pike
+- broke new spread_connection_distances() out of compute_connection_distances()
+- new spread_connection_distances() tuned
+- t moves devalued to value 16
+- new function edge_distance() in board.c
+- CPU time reported by twogtp.py
+- new static function endgame_find_backfilling_dame() in endgame.c
+- new static function endgame_find_liberties() broken out of
+  endgame_analyze_worm_liberties()
+- new owl_mineye() and owl_maxeye() and corresponding autohelper functions
+- move_connects_strings revised not to try connecting invincible strings
+- ALL_MOVE move reasons no longer considered to guarantee a safe move
+- never give cutstone bonus for an inessential string
+- new test suite joseki.tst
+- do_push_owl() doesn't copy unnecessary fields of local_owl_data anymore
+- retire special meaning of owl pattern values 99 and 100
+- bugfix in revise_semeai()
+- find_half_and_false_eyes() bugfixed
+- improve_lunch_attack() revised
+- D219 pattern retired
+- new pattern action good_attack_threat overrides heuristics in value_moves.c
+- new global known_good_attack_threats[][]
+- new functions register_good_attack_threat(), is_known_good_attack_threat()
+- make delta territory cache aware of base influence recomputation
+- owl_find_lunches() revised
+- owl_determine_life() bugfixed
+- owl.c made completely 1D and other revisions
+- new GTP command analyze_eyegraph
+- new functions analyze_eyegraph(), evaluate_eyespace(), tactical_life(),
+  tactical_life_attack(), and tactical_life_defend() in optics.c
+- new functions set_/get_/update_/reuse_random_seed()
+- save and restore random_seed where it is set to zero in deterministic
+  GTP commands
+- adjust conection and semeai depth parameters according to levels
+- don't forget to switch exchange sgf_messages in order_moves()
+- influence tuning
+- tuning
+- joseki tuning
+- owl tuning
+- major eye tuning
+- atari_atari tuning
+- new tests and test revisions
+
+3.3.19 released April 28, 2003
+
+- change USE_BDIST to 1 in owl.c
+- who_wins() invokes silent_examine_position()
+- bugfix in do_owl_analyze_semeai()
+- global variable urgent retired
+- num_stones pointer in do_corner_matchpat() replaced with macro
+- joseki tuning
+- new game records and test cases
+
+3.3.18 released April 22, 2003
+
+- don't even try 'wrong' liberties in simple_ladder_attack()
+- major revision of do_owl_analyze_semeai()
+- do_owl_analyze_semeai tracks ko results and result certainty
+- semeai tactical phase deprecated
+- semeai_trymove() eliminated
+- semeai worms redefined
+- new r format character supported by vgprintf
+- uncertain semeais treated as critical
+- new function sgf_trace_semeai() in cache.c used by SGFTRACE_SEMEAI() macro
+- new dragon2 fields semeai_attack_certain and semeai_defense_certain
+- owl_estimate_life() revised for use in semeai reading
+- don't attack unconditionally dead stones, even if thrashing
+- never play on vertices which are unconditional territory for either player
+- bugfix in attack_either()
+- back-capturing added in attack1() and code restructured
+- new regression script regress.pike
+- hashtable_clear() doesn't clear already clean parts of the table
+- `stackp' pseudofield in Read_result renamed `remaining_depth'
+- endgame1.sgf removed from the distribution
+- play_move_no_history() revised to speed up undo
+- modify_eye_spaces(), remove_lunch(), and not_lunch_helper() removed
+- new function estimate_lunch_eye_value() broken out of sniff_lunch()
+- obvious_false_eye() moved from owl.c to optics.c
+- lunch invalidating patterns removed from conn.db together with
+  corresponding code in connections.c
+- semeai moves stored in dragon2 array
+- new functions collect_move_reasons(), semeai_move_reasons()
+- new prevent_attach_threat_helper() adds reverse followup value
+- DEBUG_TERRITORY made less confusing
+- handle suicides in do_commit_suicide(), not in do_play_move()
+- fix prisoner accounting in do_commit_suicide()
+- DEBUG_INFLUENCE made less noisy
+- bugfix in gnugo_estimate_score()
+- reevaluate_ko_threats() revised
+- new helper backfill_replace
+- revisions of twogtp.py
+- bugfix in play_move()
+- improved output files from scoring mode
+- traces added to find_double_threats()
+- semeai tracing improved
+- fix arraybound violation in corner_matchpat()
+- tuning
+- influence tuning
+- joseki tuning
+- owl tuning
+- atari_atari tuning
+- eye tuning
+- new and revised test cases
+
+3.3.17 released March 2, 2003
+
+- most superstring related move generation broken into new superstring_moves()
+- try (a bit) harder in attack_either()
+- semeai worms do not have to be adjacent but may instead share a liberty
+- only claim win for attacking a semeai worm if the attack is unconditional
+- moves to defend a semeai worm are marked as possibly connected to the dragon
+- liberty_of_goal() shall consider goal vertices where stones were captured
+- allow conditional ko capture in attack4()
+- new function is_corner_vertex() in board.c
+- mark_dragon() changed from static to global
+- global variable time_to_die removed
+- revision of new_semeai()
+- endgame move generator beginnings implemented in endgame.c
+- endgame() in ascii.c renamed ascii_endgame()
+- dragon_weak() moved to dragon.c
+- bugfix in owl_substantial()
+- merge superstring related tactical move generators into superstring_moves()
+- resigning of hopeless games implemented (over GTP and in replay mode)
+- ascii interface revised to support resignation
+- twogtp.py revised to support game resignations and endgame contests
+- ascii_endgame() renamed ascii_count()
+- new ascii_endgame() in play_ascii.c
+- new command-line option --resign-allowed
+- twogtp script updated to understand resignation
+- owl_* fields moved from struct dragon_data to struct dragon_data2
+- more trace output in do_atari_atari()
+- update_aa_goal() revised
+- new dfa builder implemented in dfa.c
+- dfa size reduction algorithm implemented
+- dfa transformation hints (.dtr) files added to repository
+- speed optimizations in cache.c
+- hashtable_unlink_closed_results() renamed hashnode_unlink_closed_results()
+- check for snapback/oiotoshi reactivated in check_self_atari()
+- joseki patterns are matched using corner matcher
+- symmetrical joseki patterns no longer match twice
+- antisuji joseki patterns are handled by callback now
+- goal_elements and callback_data added to all relevant databases to
+  drop unnecessary pattern elements
+- add missing break in main.c
+- do_owl_analyze_semeai doesn't crash on certain inconsistent eye results
+- bugfix in adjacent_to_nondead_stone()
+- unneeded fflush(stdout) flushed from patterns/connections.c
+- new tests
+- atari_atari tuning
+- joseki tuning
+- owl tuning
+- tuning
+- speed up scan_for_patterns()
+- remove DFA_SORT
+
+3.3.16 released January 29, 2003
+
+- redundant patterns removed from hoshi.c
+- killer move heuristic in reading.c
+- bugfix in evaluate_diagonal_intersection
+- do_owl_analyze_semeai doesn't crash on certain inconsistent eye results
+- new static functions mark_dragon() and identify_thrashing_dragons()
+  in dragon.c
+- dead friendly neighbors of a thrashing dragon also considered thrashing
+- new global array thrashing_stone[] to mark all thrashing dragons
+- drop move reasons in add_move_reason() when the lists become full
+- bugfix in value_move_reasons()
+- MAX_REASONS increased to 120
+- persistent connection cache implemented but disabled by default
+- bugfix in estimate_score
+- bugfix for unsigned char's concerning pessimistic_min
+- bugfix: estimate_score was called many places with parameters switched
+- don't crash reading a bogus sgf file
+- more reading functions use candidate move mechanism
+- new fast_defense() looks for fast ways to get liberties
+- switch strings sometimes in defend_both
+- atari_atari tuning
+- influence tuning
+- tuning
+- new tests and regressions
+- doc revision
+
+3.3.15 released January 12, 2003
+
+- evaluate_diagonal_intersection() tries additional moves to defend a diagonal
+- does_secure() made global and moved to reading.c
+- owl_add_move has a new parameter max_moves
+- --allpats works with semeai
+- defend_both() revised to require that both strings can be saved  without ko
+- adjacent_to_nondead_stone() in value_moves.c generalized
+- try harder in estimate_territorial_value() to detect when an
+  ATTACK_THREAT should not yield a followup value
+- do not use tactical defense threats as ko threats unless the move
+  itself is strategically safe
+- do not count strategical value for tactically critical dragons
+- small bonus to dame moves which have a cut or connect move reason
+- threaten_to_capture_helper() revised
+- new autohelper adjacent_to_defendable_stone_in_atari
+- new corner_point in owl.c
+- revision of improve_lunch_attack
+- surround code revised
+- surround code moved up in in make_dragons() and used to correct escape route 
+- new utility function square_dist() in board.c
+- new alternate gnugo.el in interface/gtp_examples
+- semeai nodes increased to 500
+- owla life accepted on escape in do_owl_analyze_semeai only if stackp>2
+- use status instead of owl_status in find_more_owl_attack_and_defense_moves
+- speed optimizations in board.c, particularly fastlib()
+- now possible to reduce MAX_BOARD and still get working GNU Go
+- mkpat now has amechanism for dropping patterns
+- corner database creation implemented
+- corner database pattern matcher implemented but not activated
+- bugfix in play_ascii.c: allow changing handicap/komi etc. in new games
+- fixed broken indentation in play_ascii.c
+- bugfix in gtp_known_command
+- new visible_along_edge() and autohelpers
+- influence tuning
+- tuning
+- eye tuning
+- new game records and regression tests
+- doc revision
+
+3.3.14 released January 1, 2003
+
+- life.c removed from the distribution
+- semeai module made standard
+- never decrement *eyemin to negative
+- unnecessary patval elements removed from some pattern databases
+- mkpat understands goal_elements and callback_data directives
+- new autohelper : owl_eye_size()
+- tuning
+- owl tuning
+- Copyright notices updated for 2003
+- code maintenance
+
+3.3.13 released December 22, 2002
+
+- new aa_ pattern A16
+- tactical move ordering tuned
+- complete rewrite of interface to influence.c
+- new macros INITIAL_INFLUENCE(color), OPPOSITE_INFLUENCE(color)
+- new functions compute_worm_influence(), get_lively_stones(),
+  compute_dragon_influence(), get_alive_stones(), set_dragon_strengths(),
+  mark_inessential_stones(), set_strength_data(), mark_changed_string()
+  to set up calls to compute_influence()
+- new gtp command clear_cache
+- new functions clear_persistent_owl_cache, clear_persistent_reading_cache
+- joseki preparations: mkpat cleaning
+- joseki preparations: some currently unused mkpat options changed
+- joseki preparations: autohelpers no longer take `patt' argument
+- set_value_helper() retired and replaced with inline code, generated by mkpat
+- structures for the coming joseki pattern matcher defined in patterns.h
+- use "territorial_influence" for pre-owl initial_influence
+- safety values WEAKLY_ALIVE and WEAK removed
+- use dragon2[].weakness or new field .weakness_pre_owl instead in most places
+- use crude_dragon_weakness() to decide whether owl analysis is needed
+- intersections with prisoners only contribute 1.0 to moyo_value
+- arrays worms[], dragons[] removed in worms.c and value_moves.c
+- new discard rule to enforce definiton of attack either/defend both reasons
+- cleanups and improvements in board.c
+- new function set_up_snapback_moves() in reading.c
+- defend1() and restricted_defend1() revised
+- TRACE macros and friends unified
+- matchpat.c converted to 1D
+- strategic bonus for connecting critical dragons out reintroduced
+- strategic effect on critical dragon ignored unless move has owl move reason
+- influence debug output enhanced
+- defense functions in reading.c reorganized
+- eye_vertex and eye_graph structures reorganized
+- mkeyes.c rewritten to conform the changes in eyes.h
+- adjacent() and buggy hadj() macros in optics.c retired
+- recognize_eye(), first_map() and next_map() simplified and sped up
+- new static reset_map() in optics.c
+- new autohelpers omoyo_opposite and xmoyo_opposite
+- CLASS_I added to CLASS_MOVE_REASONS in patterns.h
+- compactify_att() removes duplicates from attribute list in DFA
+- dfa_rt_t.next now stores offset to next state
+- new fucntion dfa_shuffle() to minimize jump sizes between DFA states
+- shorten generated pattern files to avoid too many lines warning
+- new GTP command restricted_genmove
+- new function genmove_restricted() in genmove.c
+- new parameter allowed_moves[] to do_genmove(), review_move_reasons(),
+  and find_best_move()
+- always call init_board() when reaching a new_position()
+- eyes.db revised
+- bugfixes in cut_connect_callback() in connections.c
+- tuning
+- owl tuning
+- influence tuning
+- connection tuning
+- new tests
+
+3.3.12 released November 20, 2002
+
+- optimization in do_play_move: don't check ko unnecessarily
+- revision of critical worms to inessential in make_dragons() revised
+- owl vital attack patterns now also used for owl defense
+- major revision of connection_value(), using new function
+  crude_dragon_weakness()
+- reading.c: new move for defend1(): try to set up snap back
+- reading.c: special_rescue4() generalized to hane_rescue_moves()
+- a connection move where amalgamtion is inhibited by cut_possible() may
+  induce further connection moves
+- new oracle.c and oracle.db
+- oracle is a second gnugo process communicating with the gtp by unix pipes
+- experimental alternative move generation --metamachine using oracle
+- demonstration pattern database using oracle
+- bugfix: gnugo_get_komi() returns float as it should
+- ..goal_list macros converted to functions in owl.c
+- bugfix in owl_determine_life()
+- new functions min_eye_threat() and max_eye_threat() in optics.c
+- somewhere() revised
+- new autohelper functions [ox]_alive_somewhere
+- autohelper functions [ox]_somewhere revised
+- major revision of find_connection_distances()
+- other revisions and tuning in readconnect.c
+- bugfix in find_defense: compare against fourlib_depth when appropriate
+- compiler warnings fixed
+- new struct dfa_rt_t allows different run-time DFA structure from build-time
+- optional #define USE_BDIST in owl.c for better rotational independance
+- new and revised tests
+- new eat_lunch_escape_bonus() called by sniff_lunch()
+- 'make all' does not cause build of extract_fuseki and debugboard
+- owl_determine_life is careful if saving a lunch attacks an eye
+- bugfix: typo in store_persistent_reading_cache()
+- major cleanup in influence.[ch]
+- pre-rotated pattern generation in mkpat. (-p option) implemented.
+- %2m added as valid syntax for gprintf
+- relabel rotation matrices in transform.c
+- bugfix in atari_atari_blunder_size: don't crash on inconsistent defense
+- autoharvesting of documentation from play_gtp.c
+- tuning
+- komoku and hoshi tuning
+- eye tuning
+- owl tuning
+
+3.3.11 released October 29, 2002
+
+- experimental connection code made default
+- configure --help cleanup
+- minor changes to twogtp*
+- revision of CB20 in conn.db
+- calls to accurate_approxlib() replaced by accuratelib()
+- owl_find_lunches() revised
+- owl tuning
+- eye tuning
+- new game records and regression tests
+
+3.3.10 released October 20, 2002
+
+- fastlib revised
+- new accuratelib intended to replace accurate_approxlib
+- incremental_self_atari merged into revised is_self_atari
+- accurate_approxlib moved to board.c
+- old sgftree is now freed on successful sgf loading
+- sgftrees are freed when sgf tracing is finished
+- sgffile_printsgf() revised
+- gtp_fixed_handicap revised
+- comments improved in play_gtp.c.
+- play_ascii() revised
+- combinations() revised
+- atari_atari() generates lots of defense moves and validates them
+- do_atari_atari() generates lots of potential defense moves
+- decide_combination() revised
+- YOUR_ATARI_ATARI_MOVE considered safe in examine_move_safety()
+- atari_atari tuning
+- new GTP commands attack_either and defend_both
+- optimization in compute_connection_distances()
+- owl code reorganization
+- new clear_owl_move_data() set_single_owl_move(), 
+- break out reading_limit_reached(), owl_estimate_life() 
+  from do_owl_attack/defend 
+- mode local_owl_node_counter global variable for owl.c
+- made long "if (pass == ...)" statements "switch (pass)" in owl.c
+- eliminated unnecessary variable "found_read_result" in owl.c
+- new strategic_effective_size()
+- computation of strategic effect is modified
+- new static read_eye() tries to improve recognize_eye() results
+- recognize_eye() sets vp->num_attacks/defenses to 0 when eye is found
+- new file surround.c
+- new is_surrounded(), does_surround() and surround_map()
+- new gtp functions is_surrounded, does_surround and surround_map
+- new autohelper macros is_surrounded, does_surround and surround_map
+- new command line option --decide-surrounded
+- new global variable gtp_version
+- new option --gtp_version
+- new function simple_showboard() in showbord.c
+- new function get_last_player() in board.c
+- gtp code revised for GTP version 2 and uses this by default
+- new function delete_persistent_reading_entry()
+- inconsistent results in attack_and_defend() resolved
+- compilation errors for EXPERIMENTAL_READING fixed
+- new experimental owl code is aware of tails getting captured
+- new move reasons OWL_ATTACK_MOVE_GAIN and OWL_DEFEND_MOVE_LOSS
+  with corresponding supporting code in value_moves.c and move_reasons.c
+- new move reason INVASION_MOVE
+- pattern class I (invasions) can now be used in patterns.db et al
+  and not only in influence patterns
+- remove EXPAND_TERRITORY_MOVE from strategic_penalty()
+- new static function do_find_break_chain2_efficient_moves() split off
+  from break_chain2_efficient_moves() and revised
+- superstring_breakchain() revised
+- speed optimization of compute_primary_domains()
+- countlib() calls eliminated in count_common_libs(), find_common_libs(),
+  and have_common_lib()
+- escape_value arrays changed from int to char
+- bugfix in code awarding strategical value for attacks/defenses of lunches
+- bugfix in ATTACK_THREAT handling in estimate_territorial_value()
+- bugfix in owl_substantial(); depth values modified correctly
+- depth consistency assertion added in do_genmove()
+- bugfix in mkpat.c
+- new static functions analyze_false_eye_territory(),
+  connected_to_eye(), and connected_to_eye_recurse() in dragon.c.
+- new global array false_eye_territory[]
+- critical dragons only consisting of inessential worms are revised
+  to be inessential
+- new function is_false_eye() in optics.c
+- new autohelper functions o_captures_something(),
+  x_captures_something(), false_eye_territory(), and false_eye()
+- owl_tuning
+- eye tuning
+- influence tuning
+- tuning
+- new game records and regression tests
+
+3.3.9 released September 29, 2002
+
+- new configure option experimental-owl-ext
+- code simplification in safe_move (use REVERSE_RESULT)
+- new randomness_scaling field in struct move_data and new scale_randomness()
+- moves matching Fj and Ft patterns get extra randomness
+- fuseki pattern tuning for kakaris in high handicap games
+- persistent cache code moved from reading.c and owl.c to new file persistent.c
+- speed optimization in order_moves() in reading.c
+- speed optimizations in fastlib(), count_common_libs(), find_common_libs()
+- duplicate lines removed from safety_to_string()
+- draw_active_area() functions in reading.c and owl.c unified
+- new ascii command: freehandicap <num>.
+- new function: ascii_free_handicap
+- report_worm(): print all attack, defense, threat points/codes
+- worm_data::defend_codes is now called defense_codes
+- enhanced result_to_string() with new return codes.
+- removed strategically_sound_defense()
+- mingw build searches for mingwex
+- pattern symmetry corrections in owl_defendpats.db and patterns2.db
+- bugfix in topological_eye()
+- don't spread any influence below INFLUENCE_CUTOFF
+- mark_safe_stones() distinguishes between SAFE_STONE and OWL_SAVED_STONE
+- detect_owl_blunder() calls owl_confirm_safety() if move may harm own eyes
+- bugfix and speedups in accumulate_influence()
+- bugfix in value_territory()
+- comment play_connect_n()
+- document play_connect_n() in the texinfo docs
+- bugfix in play_connect_n (trace output)
+- fix comment in find_double_threats()
+- break_chain2_moves() revised 
+- do_play_move() revised to improve performance
+- corrects quoting of special characters in regress.plx
+- sgffile_loadandprint() renamed to sgffile_printsgf() and revised
+- use EOF rather than -1 the code to read sgf files in sgfnode.c
+- major revision of code to write an sgf tree to file in sgfnode.c
+- set_depth_values() reorganized
+- new function find_half_and_false_eyes() in optics.c
+- blunder_size() code reorganized
+- new static detect_owl_blunder() and detect_tactical_blunder() in utils.c
+- for walking across dragons new first_worm_in_dragon(), next_worm_in_dragon()
+- new next_wormlist[]
+- mark_changed_dragon() revised using dragon loop
+- bugfix in fill_liberty()
+- filllib_confirm_safety() revised
+- make_dragon(): resolve inconsistent owl result by calling owl_does_defend()
+- add assert on inconsistent do_genmove result() in genmove()
+- life code completely disabled
+- global variables life and life_eyesize removed
+- options --life and --life-eyesize removed
+- new eye value scheme; all code handling eye values revised
+- new functions set_eyevalue(), min_eyes(), max_eyes(),
+  add_eyevalues(), eye_move_urgency(), eyevalue_to_string()
+- eyes.db revised for new eye value scheme and substantially extended
+- configure test for alarm removed
+- sigterm_handler() and volatile variable time_to_die removed
+- functions special_rescue(), special_rescue2() converted to .._moves()
+- break_chain2() removed; use new break_chain2_defense_moves() instead
+- defend2() and defend3() simplified
+- new reading codes GAIN/LOSS for later use in owl
+- more consistent use of WIN and REVERSE_RESULT() macros
+- new function sgffile_load_and_print()
+- new call convention for sgftree* functions
+- sgftreeCreateHeaderNode() revised
+- sgffile_debuginfo() renamed to sgffile_add_debuginfo()
+- new call convention for sgffile_output()
+- --color option effective in scoring mode
+- sgftree struct and functions consistently used in play_gmp(),
+  play_solo(), load_and_analyze_sgf_file(), and load_and_score_sgf_file()
+- new arrays close_worms[][], close_white_worms[][],
+  close_black_worms[][], number_close_worms[],
+  number_close_white_worms[], number_close_black_worms[]
+- compute_surrounding_moyo_sizes() revised
+- compute_surrounding_moyo_sizes() variant for experimental-connections option
+- new function influence_get_moyo_data()
+- tuning
+- owl tuning
+- new game records and regression tests
+
+3.3.8 released September 5, 2002
+
+- remove unneeded inclusion of stdlib.h in helpers.c
+- bugfix in matcher_check
+- URL's updated in documentation
+- tests updated
+
+3.3.7 released September 4, 2002
+
+- better ko tracking searching for additional worm attacks and defenses 
+  in find_more_attack_and_defense_moves() and make_worms()
+- new option --output-flags <flags>
+- output using sgf trees with -o option
+- cleaning and minor bugfixes in play ascii
+- sgf handling is disconnected from engine again
+- moved sgfAddDebugInfo -> sgffile_debuginfo, outputsgf -> sgffile_output
+- write "forced" as comment when this ascii mode command is used
+- sgftree_readfile does not change root node to NULL
+- new blunder_size(), atari_atari_blunder_size() compute the blunder size
+- remove vital_string logic in atari_atari code
+- remove allowed_blunder_size heuristic in review_move_reasons()
+- instead use blunder size more exactly in new function find_best_move()
+- bugfix in hashtable_partially_clear()
+- bugfix in gameinfo_play_sgftree_rot()
+- bugfix (reading uninitialized memory) in sniff_lunch()
+- bugfix (EXPERIMENTAL_CONNECTIONS) in cut_connect_callback()
+- bugfix (gameinfo_load_sgfheader) in play_ascii()
+- man page revised
+- new options --mirror and --mirror-limit
+- new global variables play_mirror_go and mirror_stones_limit
+- new static find_mirror_move(), test_symmetry_after_move() in genmove.c
+- Apply "B" cutting pattern from shapes.db only if connection code confirms
+- new function test_attack_either_move; gets invoked by patterns
+  instead of directly adding the attack-either move reason
+- new function mark_changed_dragon() in move_reasons.c
+- only mark owl defended stones as safe if also sufficiently tactically safe
+- matcher_check can analyze existing sgf files
+- twogtp-a kills processes
+- break_chain2_moves() revised
+- placehand() renamed to place_fixed_handicap()
+- new function place_free_handicap() in handicap.c with associated
+- static find_free_handicap_pattern(), free_handicap_callback() in handicap.c
+- new GTP command place_free_handicap
+- new pattern database handicap.db
+- new autohelper macros handicap_stones, total_handicap_stones for handicap.db
+- mkpat.c revised to avoid compiler warnings for constraints using no labels
+- new file engine/handicap.c
+- placehand() moved from genmove.c to handicap.c
+- bug fix in adjusted_worm_attack_value()
+- FIXME added regarding several EITHER_MOVE reasons
+- show_dragons() revised
+- tuning
+- influence tuning
+- connection tuning
+- owl tuning
+- revised tests, many new tests, new game files
+- added Evan Berggren Daniel to AUTHORS
+
+3.3.6 released August 13, 2002
+
+- extended_chainlinks() revised
+- MAX_REASONS increased from 80 to 100
+- modify_stupid_eye_vital_point() revised
+- new functions improve_lunch_attack() and improve_lunch_defense()
+- backfilling in do_owl_attack() when trying the defender's best move
+- sniff_lunch() revised
+- new experimental_connections contingent code in shapes_callback()
+- induce_secondary_move_reasons() revised
+- tuning
+- endgame tuning
+- owl tuning
+- request id no longer passed to callbacks in play_gtp.c
+- gtp_printid() renamed to gtp_start_response()
+- new preprocessing of command lines in gtp_main_loop()
+- GTP command dragon_status revised
+- bug fix in estimate_strategical_value: EITHER_MOVE negative values
+- j pattern value increased from 22.0 to 24.0
+- new gtp experimental_score for metamachine
+- new DEBUG_MISCELLANEOUS used only in find_eye_dragons
+- connection tuning
+- B patterns found by find_cuts inhibit C patterns by find_connections
+- new connection tests
+- strategic_penalty() adds negative strategical move value a bit more often
+- revise_thrashing_dragons() revised
+- tuning
+- owl tuning
+- new tests and game records
+
+3.3.5 released July 5, 2002
+
+- bugfix in break_through_helper()
+- bugfix in combinations()
+- reduced_init_owl() allocates bigger owl stack with --experimental-semeai
+- bugfixes in pop_owl(): don't crash if owl stack has moved
+- reduce reading depth by one in influence pattern matching
+- new struct reading_moves in reading.c
+- owl stack can now handle two local_owl_data structs
+- semeai code now uses owl stack
+- don't push owl data in owl_analyze_semeai below branch depth
+- Don't change critical dragons to dead due to semeai results
+- DEBUG_SEMEAI trace enhancements
+- semeai refinements
+- owl_phase now local variable in do_owl_analyze_semeai
+- bugfix in do_owl_defend(): computation of escape parameter
+- bugfix in play_ascii.c: don't crash on unusual boardsizes
+- dead stones with no neighbors are captured territory
+- improved debug traces in score.c
+- decide-dragon clears cache between owl attack and defend
+- influence pattern tuning
+- new tests and regressions
+
+3.3.4 released June 19, 2002
+
+- segment_regions also computes territorial value of regions if available
+- dragon2.moyo_size_pre_owl andmoyo_size_post_owl replace dragon2.moyo
+- new dragon2.moyo_territorial_value, weakness
+- strategic dragon evaluation rewritten, setting dragon2[].weakness
+- moved interpolate to gg_interpolate in gg_utils.c
+- new struct eyevalue
+- moves to connect two dragons which are both adjacent to a thrashing
+  dragon are appreciated by the move valuation
+- experimental connections off by default in VC build
+- tuning
+- influence tuning
+- connection tuning
+- eye tuning
+- joseki tuning
+- owl tuning
+- new tests and game records
+
+3.3.3 released June 4, 2002
+
+- new function owl_strong_dragon() and new autohelper with the same name
+- vital_chain() returns the max number of eyes
+- no amalgamation around eye spaces with experimental_connections enabled
+- eye spaces no longer modified by INHIBIT_CONNECTION with
+  experimental_connections enabled
+- bugfix in find_connection_moves()
+- pattern classes Y and W introduced in conn.db to identify patterns
+  which only applies with or without experimental_connections
+- patterns with class e in conn.db changed to class I to better
+  reflect current usage
+- connection tuning
+- improves DFA compile time by doing fewest possible large syncs 
+- experimental_influence command line and configure option removed
+- new flags dragons_known and is_territorial_influence in influence_data
+- struct local_owl_data for speedup only holds eye space of relevant color
+- owl_eyespace() and allies use only one eyespace
+- dfa doesn't report symmetric patterns multiple times
+- escape patterns in owl_defendpats.db given E classification
+- owl_determine_life() not called during escape attempt
+- only print debug output for eyes during owl reading if owl debug is on
+- better traces for unused owl patterns
+- --decide-connection also reports ko results
+- bugfix in load_and_score_sgf_file()
+- new test cases
+- edge_block and double_atari_chain2 renamed to *_moves
+- do_attack uses simple_ladder_attack when stackp > depth+10
+- give up simple_ladder_attack below 20 ply when we are komaster
+- unused caching code removed from attack? and defend?
+- macros used to make reading code readable
+- dragon field in struct eye_data removed
+- new function find_eye_dragons() in optics.c
+- dragon_invincible() and genus computation in make_dragons() revised
+- play_connect_n() uses string_connect() and disconnect()
+  unconditionally, no longer contingent on experimental_connections
+- default value for experimental_connections reset to 0
+- new command line option --decide-dragon-data
+- consistency checking of replacement patterns reenabled for unstable line
+- tuning
+- new tests and sgf files
+
+3.3.2 released May 6, 2002
+
+- Macro PATTERN_CHECK_ON_DEMAND retired
+- allpats options for owl shape moves repaired
+- new function extended_chainlinks() in board.c
+- connection and cut move reasons are relative to worms, not dragons
+- unused find_worm_pair() and related variables removed from move_reasons.c 
+- MAX_REASONS increased from 40 to 80
+- induce_secondary_move_reasons() reimplemented
+- tuning
+- new test case
+- fix warnings generated by regress.plx
+- doc revisions
+- add_block_territory_move() removed
+- BLOCK_TERRITORY_MOVE reason removed
+- compute_shape_factor() and move_connects_strings() moved to value_moves.c
+- move_reasons_confirm_safety() moved and renamed value_moves_confirm_safety()
+- b patterns changed to e in endgame.db, fuseki.db, patterns.db, patterns2.db
+- classification letters ordered consistently in pattern databases
+- find_backfilling_move() in filllib.c revised
+- new debug flag DEBUG_TOP_MOVES
+- environment variables GG_OPTIONS and GNUGO when (make)ing tests
+- top moves list maintained when moves are rejected
+- bugfixes in metamachine
+- regression revisions
+       
+3.2 released April 25, 2002
+
+- revision of copyright statements and THANKS
+- handtalk games moved to their own directory
+- correct move number reported in influence for illegal move error
+
+3.1.34 released April 20, 2002
+
+- "choose best anchor"-platform dependency patch in mkpat.c
+- bogus (int) conversion removed in get_next_move_from_list
+- 3.0 replaced by 3.2 in WINDOWS
+
+3.1.33 released April 19, 2002
+
+- regression/READING, STRATEGY and NICKLAS removed
+- makevcdist.pl, doc/gnugo-32.[jpg|eps]added to EXTRADIST
+- eval3.sh and semeai2.tst added to automake control
+- TODO list in texinfo updated
+- class field in struct pattern and class_mask in made unsigned int
+- input_FILE and output_FILE in mkpat.c explicitly initialized
+- tree based reading not compiled by default
+- consistency checking of replacement patterns disabled for the stable release
+- more Handtalk games in CVS
+- Jessie Annala THANKed
+- new function gg_normalize_float2int to address optics.c-platform dependency 
+- hash_init behaviour made independent of boardsize
+- output cleanup: --statistics, and EITHER_MOVE-trace
+- floats normalized in finish_pattern() in mkpat.c
+- put GNU Go's passes in permanent move history
+- assertion in compute_connection_distances corrected
+
+3.1.32 released April 13, 2002 
+       
+- new update_random_seed()
+- gtp_set_boardsize updates the random seed
+- reset engine updates the random seed
+- aftermath revisions
+- combination of --score aftermath and -o options more useful
+- dead function opponent_not_passing() removed from genmove.c
+- init_influence() and new_value_territory() revised
+- sgftree_printboard() made global
+- bugfix in owl_hotspots()
+- valuation of attack threats revised to allow more ko threats
+- bugfix in estimate_strategical_value()
+- solid string connection bonus revised to also favor cuts of opponent
+- play_gtp() starts with boardsize of board loaded with -l instead of 19
+- no warning by default for FF[1] sgf game records
+- bugfix in push_owl
+- corrected assertion in examine_cavity()
+- shadowed variables fixed in dragon.c
+- major aftermath code revisions
+- doing_scoring contingent revisions in influence_callback(), shapes(),
+  shapes_callback(), connection_value(), estimate_strategical_value(),
+  high_handicap_helper(), and reinforce_helper()
+- analyze_neighbor() in filllib.c revised
+- size of persistent owl cache increased from 100 to 150 entires
+- bugfix in owl_confirm_safety()
+- territorial value computed for tactical attacks of dead or defenseless stones
+- caching of recent compute_escape_influence() results
+- reading cache stores depth-stackp instead of stackp
+- infl_followup_value renamed influence_followup_value and initialized
+- initialize_dragon_data broken out of make_dragons
+- dragon_data initialized even on empty board
+- owl reasons ignores empty board positions
+- twogtp does not report duplicate scores unless they differ
+- new gtp get_random_seed, set_random_seed
+- tuning
+
+3.1.31 released April 4, 2002
+
+- boardsize field added to persistent caches in reading.c and owl.c
+- break_chain_efficient_moves() revised
+- new function reduced_init_owl() in owl.c
+- mark_dragon_hotspot_values() revised
+- revised handling of inessential stones in init_influence()
+- bugfix in strategic_penalty()
+- owl speedup: owl data immediately stored in owl_stack
+- bugfix in do_owl_defense()
+- attack() now always returns PASS as move if there is no attack
+- some ASSERTs removed in board.c.
+- revision in get_next_move_from_list
+- bugfix in find_connection_moves()
+- begin_sgftreedump() can take a NULL pointer parameter
+- new gtp command ladder_attack
+- unneeded include directories removed from sgf/Makefile.*
+- seed field removed from Gameinfo struct
+- new global variable random_seed
+- joseki tuning
+- Handtalk games in regression/games
+- doc revision
+
+3.1.30 released March 30, 2002
+
+- target sgf_properties.h not built by default
+- bugfixes in defend2(), special_rescue(), and special_rescue2()
+- MAX_INTRUSIONS doubled in size
+- intrusions beyond MAX_INTRUSION silently discarded
+- new connect_and_cut_helper2 autohelper macro
+- platform dependency resolved in store_persistent_reading_cache
+- EXP_J_VALUE increased to 35 in shapes.c
+- graph_ renamed to tree_ in mkpat.c & related files
+- a few FIXMEs addressed
+- tuning
+- influence tuning
+- new logo-32.jpg and logo-32.eps
+- newlogo.eps made smaller using level 2 postscript
+- doc revision
+
+3.1.29 released March 26, 2002
+
+- asymmetry in influence computation reduced
+- case added in strategic_penalty
+- simulation of ko threat + answer in sgf output reinstated in tryko()
+- new function gg_normalize_float() in gg_utils.c
+- platform dependency fixed in readconnect.c by using gg_normalize_float() 
+- scoring tweaks and optimizations
+- bugfix in gg_cputime()
+- new function influence_initial_territory to export territory valuation
+- negative strategic value added to invasion type moves
+- keima shape bonus removed in CB204b
+- tuning
+- influence tuning
+- code consistency cleanup
+- new tests in nngs1.tst
+- THANKS updated
+
+3.1.28 released March 24, 2002
+
+- hashing dependent on compiler switches, default 64 bit and no full position
+- default cache size set to 8
+- --stack option and showstack global variable removed
+- cache.o removed from libboard.a
+- unneeded include of dfa.h removed from patterns.h
+- compiler warnings fixed: dragon2_func prototyped, etc.
+- bugfix in confirm_safety() plus 1D conversion
+- komaster scheme 5 implemented and made default
+- update_aa_goal() in combination.c revised
+- heuristics to estimate cost of pattern constraint introduced
+- constraint cost used in owl callback for speedup
+- twogtp and twogtp-a close the sgf file if an engine crashes
+- twogtp-a had coordinates reversed
+- global variable last_moves[] removed
+- move history added to board state
+- static function undo_move() in board.c renamed to undo_trymove()
+- new global functions store_board(), restore_board(), undo_move(),
+  get_last_opponent_move(), and get_last_move() in board.c 
+- macros do_add_stone() and do_remove_stone() removed from board.c
+- Position struct removed
+- Gameinfo struct revised
+- new board_state struct
+- API functions gnugo_* work on an internal board state instead of on
+  an externally provided board state
+- board_size workaround in influence.c obsoleted and removed
+- revised order of operations in main.c; in particular playing up the
+  position specified by -l and -L options centralized
+- revised modes for --score option
+- all undo implementations in GTP, GMP, and ASCII interfaces replaced
+  by the new undo_move() function in the board code
+- Added several .h files to appropriate .dsp files
+- corrected gcc warnings & other cleanup in mkpat.c
+- komaster_to_string now takes 2 arguments
+- new KOMASTER_TRACE; set to log all komaster_trymove calls
+- dfa ise announced only as a debug message
+- copyright notices updated
+- DRAGON2 macro array bounds checking is not the default
+- tuning
+- test revision
+- doc revision
+- additional correct answers added to reading.tst
+
+3.1.27 released March 1, 2002
+
+- important bugfix in store_persistent_owl_cache()
+- bugfix in semeai_find_backfilling_move()
+- new command line option --debug-flags
+- new DEBUG_OWL_PERSISTENT_CACHE
+- owl.c:draw_active_area draws the owl point
+- new printutils.c:routine_to_string()
+- KOMASTER_SCHEME 4 introduced
+- Tree-based pattern matching introduced.
+- pattern-base reading code supports defense by pattern.
+- new command-line switches "(attack|defend)-by-pattern"
+- OPT enums re-based to 127, to avoid conflict w/ ASCII values.
+- reformatted transform.c to look like matrices.
+- DRAGON_WEAK implemented in a function and checks array bounds.
+- improved fastlib().
+- DRAGON2 macro checks array bounds.
+- bugfix in readconnect.c:moves_to_connect_in_three_moves()
+- for non-variadic, non-VC compilers, add trace_dummy assignment
+- new function init_owl() in owl.c
+- re-order conditions in revise_semeai to insure valid DRAGON2 data
+- organize include file order to facilitate pre-compiled headers.
+- use location_to_string in replay_node()
+- improve assertion in sgftreeAddComment()
+- removes a bogus "," from Pattern D305
+- read_attack.db tuning
+- new read_defend.db
+- VC builds uses precompiled headers
+- VC Release builds generate debug symbols
+- new '-s' option to regress.pl to control creation of sgf files.
+- instruct robots not to follow regress.plx links.
+- unexpected results page orders results correctly
+- defaults for config.vc(in) made same as 3.1.27 release.
+- new semeai test
+- doc revision
+
+3.1.26 released February 24, 2002
+
+- experimental influence, experimental and alternate connections are default
+- caching code revised to once more work with TRACE_READ_RESULT enabled
+- added EXPERIMENTAL_READING to config.vc(in)
+- updated makevcdist.pl
+- bugfix in owl.c:dump_pattern_list() 
+- alternative reorganized owl callback structure for substantial speed-up:
+- owl_shapes revised, new functions get_next_move_from_list() et al.
+- new function dump_pattern_list(...) for debugging
+- pattern cleanup
+- spelling fixes
+- verbosity revisions with alternate connections in readconnect.c
+- bugfix in close_bubbles()
+- bugfix in compute_owl_escape_values()
+- revised "stepped on a bug" message
+- bugfix in update_status in semeai.c
+- bugfix in estimate_time_by_move
+- replay added to debug helpstring
+- revised nonvariadic versions of TRACE and allies
+- increased MAXSTACK to MAX_BOARD*MAX_BOARD again
+- experimental influence taken down for initial influence when dragons unknown
+- doc revision
+
+3.1.25 released February 14, 2002
+
+- updated AUTHORS
+- command line option --options reports configure options
+- verbose reduced in readconnect.
+- do_genmove tries harder to restrain thrashing dragons.
+- DFA_SORT set to 0.
+- new gtp tryko.
+- new function fastlib() helper for approxlib family.
+- a pattern can now force the anchor point.
+- matchpat can be run forcing anchor to be in the goal.
+- simplification of UPDATE_SAVED_KO_RESULT
+- reduce overhead in non-variadic macro TRACE definitions
+- reduce MAXSTACK
+- EXPERIMENTAL_READING code much more interesting.
+- moved most of EXPERIMENTAL_READING code out of do_attack.
+- [ox]lib request only up to MAX_LIBERTIES liberties.
+- bugfix in reevaluate_ko_threats
+- floating point exceptions stopped in readconnect.c
+- experimental influence: yet another new_value_territory revision
+- experimental influence: fixed followup values really taken down (shapes.c)
+- experimental influence: pattern tuning
+- experimental influence: follow-up specific constraints for B patterns
+- experimental influence: new_value_territory revised (center correction)
+- experimental influence: most fixed follow-up values taken down
+- experimental influence: tuning, joseki values increased, some bugs fixed
+- experimental_influence ignored for escape influence
+- influential doc revision
+- edge_double_sente_helper is now autohelper
+- owl threat loop broken out
+- new global thrashing_dragon
+
+3.1.24 released February 3, 2002
+
+- cleanup of clock.c, filllib.c, fuseki.c, genmove.c, globals.c,
+  gnugo.h, hash.h, printutils.c, reading.c, showbord.c, utils.c,
+  worm.c
+- New function gfprintf in printutils.c
+- do_owl_analyze_semeai won't read below MAX_SEMEAI_DEPTH
+- AFFINE_TRANSFORM() macro
+- new (stub) function opponent_not_passing
+- new function sgffile_write_circle_mark
+- gg_cputime used for time statistics consistently.
+- alternate connection reading algorithm appended to readconnect.c
+- new option --alternate-connections toggles the connection reading algorithms
+- Zobrist hashing implemented in owl_analyze_semeai
+- do_owl_analyze_semeai no longer considers unsafe outside liberties
+- small_semeai reimplemented
+- make_worms takes the save_verbose parameter to allow a few traces
+- traces improved in decide_tactical_semeai
+- EXPERIMENTAL_READING code (pattern based) added.
+- added "tried" parameter to special_rescue
+- defend2-[CD] won't re-try moves (avoid cache check).
+- faster implementation of accurate_approxlib.
+- mkpat takes multiple -i parameters, outputs in binary
+- Visual C now uses _vsnprintf
+- revision of patterns/mkpat.dsp
+- sgf output tweeking.
+- bugfix in experimental influence: floating point exception cure
+- bugfix in regress.plx: handling of gtp worm_stones
+- tuning
+- owl tuning
+- connection tuning
+- test revision
+
+3.1.23 released January 28, 2002
+
+- configure option: alternate-connections
+- experimental influence: followup value computed in influence.c
+- experimental influence: new_value_territory revised
+- experimental influence: new handling for intrusion patterns
+- experimental influence: support for standard/experimental specific patterns
+- reevaluate_ko_threats now makes checks
+- new get_biggest_owl_target()
+- DEFEND_BOTH_MOVE reason taken down
+- new gtp functions get_komi and get_handicap
+- bugfix in gtp worm_stones: did not print newline if board empty
+- support for two strings and two results in cache.[ch]
+- simplified code to do cache lookup in reading.c and owl.c
+- bugfix in estimate_territorial_value()
+- bugfix in find_worm_threats()
+- readconnect finds connections through ponnuki
+- readconnect sgf improvements
+- bugfix in estimate_strategical_value(): ALL_MOVE worms were overvalued
+- VC build now DFA compliant
+- semeai module sets matcher status to ALIVE instead of ALIVE_IN_SEKI
+- regression html view enhancements
+- fix arraybound violation in compute_aa_values
+- constraint diagram checking moved to new check_constraint_diagram()
+- Invoke check_constraint_diagram *before* incrementing patno
+- atari_atari_find_defense_moves() revised
+- ATTACK_EITHER_MOVE taken down
+- new ALL_MOVE reason
+- new static find_all_data(), all_move_redundant() in move_reasons.c
+- new function add_all_move()
+- add_defend_both autohelper macro revised
+- tuning
+- influence tuning
+- owl tuning
+- hoshi tuning
+- new and revised tests 
+
+3.1.22 released January 20, 2002
+
+- find_backfilling_move() in filllib.c revised
+- dfa made standard
+- owl threat computation made optional (and not default)
+- comments added, cleanup around discard_redundant_move_reasons
+- new (unused) experimental influence configure and run time options
+- unsafe tactical moves now taken care by discard_redundant_move_reasons
+- FIXME added for reevaluate_ko_threats
+- atari_atari_attack_patterns() uses a goal array to limit search area
+- new functions compute_aa_values(), get_aa_value(), and update_aa_goal()
+- ko contingent defenses excluded in get_saved_worms(), get_saved_dragons()
+- valuation of atari_atari move reasons revised
+- recognize_eye() revised
+- spelling corrections
+- fflush() added a few places
+- owl tries tactical defense for small groups
+- owl logs number of variations per sub-tree in SGF file
+- [ox]play_(attack_either|defend_both) handles ko correctly.
+- added [ox]play_connect and dis_connect helpers
+- allow followup value if defense threat is contingent on ko.
+- only allow territory move values if move is deemed safe.
+- reduce cutstone values in case of ko.
+- debug printing in influence.c slightly restructured
+- new function influence_moyo_color_opposite()
+- one trace output reenabled in confirm_safety()
+- bugfix in sgftreeAddStone
+- bugfix in komaster_trymove
+- mascot in dragon.c
+- tuning
+- eye tuning
+- atari_atari tuning
+- connection tuning
+- fuseki tuning
+- owl tuning
+- test revisions
+
+3.1.21 released January 12, 2002
+
+- revision of compute_surrounding_moyo_sizes()
+- bugfix in pattern EE302
+- value_moves.c split from move_reasons.c
+
+3.1.20 released January 11, 2002
+
+- ko return codes from owl_does_attack() and owl_does_defend() handled
+  in analyze_semeai()
+- special_rescue2() generalized and reimplemented
+- bugfix in edge_clamp()
+- mkpat does consistency checking between the diagram and constraint diagram
+- new function connect_and_cut_helper() in helpers.c
+- least significant bit of move reason now denotes a threat
+- bugfix in add_attack_either_move
+- new move reason: EITHER_MOVE
+- disabled add_attack_either_move
+- removed redundant EITHER_MOVEs
+- minor cleanup in move_reasons.c
+- some cleanup in move_reasons.c
+- renamed some move reasons for name consistency
+- new function special_rescue6() in reading.c
+- defend3() revised
+- don't run compute_eyes on eye spaces not attached to a dragon
+- avoid giving followup values to non-sente threats in
+  threaten_to_capture_helper() and in estimate_territorial_value()
+- new test_gray_border() in board.c with assertions in genmove.c
+- xplay_attack_either returns WIN not 1
+- improved debugging and trace output
+- checking of sgf GM and FF properties revised
+- Makefile.in's converted using Automake 1.5
+- html view enhancements
+- tuning
+- influence tuning
+- owl tuning
+- fuseki tuning
+- performance tuning
+- test revisions
+
+3.1.19 released January 2, 2002
+
+- bugfix in aftermath_genmove()
+- bugfixes in the atari_atari code
+- obsolete atari_atari code removed
+- tuning
+- owl tuning
+- sgf2tst repair
+- regress.plx improvements
+       
+3.1.18 released December 23, 2001
+
+- 1D conversion of incremental.texi
+- new function dragon_looks_inessential() in dragon.c
+- adjusted_worm_attack_value() revised
+- indented debug output of secondary move values
+- new local struct aa_move in combinations.c
+- new pattern class 'c' for conditional moves in aa_attackspats.db
+- atari_atari() tries to attack smallest targets first
+- combinations() finds multiple defenses when opponent has a combination attack
+- new gtp commands owl_connection_defends and owl_substantial
+- mkpat checks that main diagram and constraint diagram have the same size 
+- mkpat stricter in parsing of classification field
+- new function gg_sort() in gg_utils.c
+- all calls to qsort() replaced by calls to gg_sort()
+- linear_eye_space() removed
+- make RTRACE and VTRACE variatic functions same as macros
+- debug output and valuation of attack on defenseless stones corrected
+- TODO revised
+- fixed value of J patterns no longer scaled with board_size
+- bugfix in owl_attackpats.db pattern D1137
+- assertion added in owl_escape_value()
+- bugfix in moves_to_connect_in_three_moves() in readconnect.c
+- support for all tactical worm points in debugboard
+- tuning
+- owl tuning
+- influence tuning
+- atari_atari tuning
+- test revisions
+
+3.1.17 released December 16, 2001
+
+- new configure and runtime options semeai-variations
+- new function semeai_trymove()
+- bugfix in catalog_goal
+- semeai revisions
+- warning avoided in dfa_avoid_string()
+- code cleanup
+- devalued attacking dead group bonus
+- corrected value to final_value in review_move_reasons()
+- value_territory() in influence.c revised
+- common debug code moved from compute_eyes(), compute_eyes_pessimistic() 
+  to print_eyes()
+- inactive support to test against linear_eyes() in compute_eyes_pessimistic()
+- MAXPATNO increased to 400 in mkeyes.c
+- naive_ladder() replaced by simple_ladder()
+- bugfixes in attack_threats()
+- new gtp commands reset_connection_node_counter, get_connection_node_counter
+- removed small valued lunch attacks and defenses in owl_determine_life()
+- new gtp commands owl_threaten_attack, owl_threaten_defense
+- better error reporting in mkpat.c
+- improved error reporting in owl.c
+- html regression view tweeks
+- new function second_order_liberty_of_string() in board.c
+- readconnect.c revised
+- take into account followup values if reverse_followup >= 1
+- try a little harder in attack_either
+- break_through_helper improved
+- tuning
+- owl tuning
+- eye tuning, adding many patterns with occupied margins
+- test revisions
+
+3.1.16 released December 9, 2001
+
+- readconnect revised
+- new board.c function breakchain3()
+- dsp and config.vc updates
+- new function influence_get_moyo_segmentation()
+- new function add_influence_source()
+- computations of moyo size surrounding a dragon changed
+- confirm_safety() takes two new parameters to tell which stones were saved
+- atari_atari_confirm_safety() revised
+- compute_aa_status() revised
+- new is_vital_string() in combinations.c tracks stones not to be sacrificed
+- generation of attack moves in do_atari_atari uses patterns
+- new pattern database pattern/aa_attackpats.db
+- atari_atari_find_defense_moves() improved
+- new functions get_saved_worms() and get_saved_dragons() in move_reasons.c
+- new function move_reasons_confirm_safety()
+- examine_move_safety() revised
+- new function decide_combination() in sgfdecide.c
+- new option --decide-combination
+- new experimental-combination configure option, and command line options
+- new gtp command aa_confirm_safety
+- bugfix in trymove()
+- 1D revisions and cleaning up
+- new file: engine/movelist.c
+- generalized handling of move lists and moved from worm.c
+- attack_threats() enhanced
+- AA_THREAT_DEPTH set to 3
+- find_worm_threats() uses attack_threats more
+- pessimistic_compute_eyes() tries harder to find a vital point
+- new atari_atari_find_attack_moves() and atari_atari_find_defense_moves()
+- do_atari_atari() restructured
+- experimental-semeai configure option
+- experimental_semeai command line option
+- new function new_semeai()
+- owl_analyze_semeai improvements
+- split USAGE_DEBUG in half due to VC limitation
+- removed final VC warning in dfa.c
+- revised trace in value_move_reasons()
+- regress.plx improvements
+- speedup in gtp_same_dragon
+- test revisions
+- 13x13 tests
+
+3.1.15 released November 30, 2001
+
+- new field value in struct half_eye_data
+- topological_eye(), evaluate_diagonal_intersection() take ko into account
+- improved debug output in compute_eyes() and compute_eyes_pessimistic()
+- add_half_eye() renamed add_false_eye
+- make_proper_eye_space() and remove_eyepoint() removed
+- owl_topological_eye() reimplemented to look up stored data
+- new function special_rescue5() in reading.c
+- defend2() and defend3() revised
+- new GTP commands list_stones and tactical_analyze_semeai()
+- new command line option --decide-tactical-semeai
+- support for marginal eye points with opponent stones in eyes.db
+- persistent caching added to owl_does_attack()
+- owl_does_defend() and owl_does_attack() now understand ko
+- owl_determine_life() revised
+- owl_analyze_semeai() revised
+- small_semeai() calls owl_analyze_semeai
+- new function silent_examine_position()
+- find_more_owl_attack_and_defense_moves() revised
+- ko valuation revised
+- cutting worms are never inessential
+- 1D revision of print_eye() in optics.c
+- compute_eyes_pessimistic() revised
+- bugfixes in evaluate_diagonal_intersection()
+- new gtp commands owl_analyze_semeai, owl_does_attack, and owl_does_defend
+- revision of owl_analyze_semeai()
+- new static catalog_goal in owl.c
+- sgfdecide functions made 1D
+- empty_corner_value adjusted to board size in fuseki()
+- removed tactical reading move pass from owl.c
+- contribution of (reverse) followup values revised in value_move_reasons
+- comments made 1D in owl.c
+- regress.pl now accepts "problem sets"
+- regress.plx includes "unexpected result" list
+- new gtp_example/sgf2tst.pl
+- changed warning to error in mkpat.c
+- minor change to regress.pl
+- atari_atari now considers general threat the first moves
+- new depth parameter aa_threat_depth
+- new function: atari_atari_succeeded
+- cleanup in atari_atari functions
+- compute_escape_influence now 1D
+- new function in reading.c: attack_threats
+- handling of tactical moves in worm.c no longer static
+- replaced abort() in mkeyes with fatal error messages
+- patterns.dsp and gnugo.dsw revised
+- tuning
+- influence tuning
+- connection_tuning
+- owl tuning
+- test revisions
+- new trevora tests
+- new semeai tests
+- doc revision
+
+3.1.14 released November 17, 2001
+
+- recognize_eye() revised
+- new function test_eyeshape() in optics.c
+- new gtp command test_eyeshape
+- vital and num_vital fields removed from struct eye_graph
+- mkeyes.c revised
+- non-territory patterns introduced in the influence code
+- revised formula for addition of followup_value
+- better trace output for followup_value and reverse_followup_value
+- typo fixed (whose_moyo for whose_area) in value_territory()
+- new debug flag DEBUG_TERRITORY
+- delta computation of territory, moyo, and area in influence.c restructured 
+- influence_value part of move valuation removed
+- new function is_edge_vertex() in board.c
+- guess_eye_space() revised
+- compute_eyes_pessimistic revised
+- do_owl_defend() revised
+- move stupid vital marginals from first to second line in owl_determine_life()
+- patterns.dsp doesn't reference invalid file
+- regress.pl deals with threads better on Win32
+- regress.plx supports view by category
+- updated regress.pl
+- add file & line numbers to more warnings in mkpat.c
+- comments in reading.c made 1D
+- DFA_ENABLE ifdefs removed
+- remove *.dfa stuff from makefiles keeping only DFA_FLAGS for mkpat.
+- configure --enable-dfa touches .db files.
+- bugfix in find_double_threats()
+- global_matchpat() renamed matchpat()
+- regression view includes node counts, SGF link, and -t output.
+- GTP echo_err added to allow echoing to STDERR.
+- atari_atari moved to combination.c
+- restricted_defend1 and restricted attack2 now public functions
+- in find_double_threats, make threat reasons into attack_either reasons
+- old disabled function remove_move_reason() now enabled
+- some simple cleaning
+- genmove now 1D
+- out of bounds array violation in showbord.c fixed.
+- regress.pl records sgf trace for owl_attack & owl_defend.
+- regress.plx provides access to sgf trace files if present.
+- tuning
+- connection tuning
+- eye tuning
+- owl tuning
+- influence tuning
+- revision of rot tests
+- ld_owl_life.tst removed
+- new and revised regression tests
+- Some tests in endgame.tst corrected.
+
+3.1.13 released November 6, 2001
+
+- new function are_neighbor_dragons()
+- verbose value reduced while running owl_reasons
+- influence code revised
+- function find_stones_saved_by_move() in move_reasons.c removed
+- find_more_owl_attack_and_defense_moves() revised
+- owl attacks induce strategical defenses of friendly neighbors
+- connection values revised
+- territorial value of attacks, defenses, owl attacks, and owl
+  defenses computed through influence function, not effective_size
+- bugfix in computing effects of min and max territory values
+- played stone not automatically in goal array in owl_does_defend(), 
+  owl_confirm_safety(), and owl_connection_defends()
+- gtp commands debug_influence, debug_move_influence, move_influence removed
+- cleanup in mkpat.c
+- malformed line warning turned into error in mkpat
+- 1D documentation revisions.
+- twogtp-a now give a (halfhearted) default to missing goprog.
+- twogtp-a works for VC builds now.
+- mkpat.c generates more useful errors.
+- mkpat.c forces output to have compile error if input also had errors.
+- comments in readconnect.c
+- snapback only looks at one liberty in readconnect.c
+- do_atari_atari confirms the *defense_point is safe before returning
+- atari_atari_confirm_safety initializes defense_point
+- trivial bugfix in move_reasons.c
+- important bugfix in semeai.c, could cause a crash
+- tuning
+- owl tuning
+- influence tuning
+- gtp_set_boardsize resets the engine and stack
+- new and revised regression tests
+- new command-line option --orientation
+- -l and decide-* options can be combined with --orientation
+- tuning and regression revisions
+- regress.plx revisions: total line, time display, command line hint
+
+3.1.12 released October 28, 2001
+
+- break_chain2_efficient_moves() and break_chain2_moves() revised
+- add_array() in readconnect.c simplified
+- bugfix in moves_to_connect_in_two_moves()
+- sgf traces turned off in quiescence_capture()
+- new fields owl_attack_code and owl_defense_code in struct dragon_data
+- revised definition of WEAK and WEAKLY_ALIVE dragons in make_dragons()
+- revised computation of size of surrounding moyo for a dragon
+- 1D revisions
+- add_attack_move() and relatives also take the result code as parameter 
+- new move reasons ATTACK_MOVE_GOOD_KO, ATTACK_MOVE_BAD_KO, and so on
+- move valuation distinguishes between attacks, defenses, owl attacks
+  and owl defenses with or without ko
+- connections tested as owl defenses when connecting out a critical dragon
+- revised valuation of threats and strategical attacks
+- compute_eyes_pessimistic() revised
+- owl_determine_life() revised
+- new static compute_aa_status() broken out of three atari_atari functions
+- tuning
+- connection tuning
+- owl tuning
+- joseki tuning
+- new and revised regression tests
+- new reorientation test suites
+- remove rot* subdirs from EXTRA_DIST
+- bugfix in score.c (typo from 1D conversion)
+- revisions to extract_fuseki: make partial board patterns
+- revised fuseki9.db
+- Corrected VC build error converting unsigned 64-bit long to double
+- regress.pl split into regress.pl & regress.plx
+- added -all, to have regress.pl parse Makefile.in for tstfile list.
+- html view has better marking of non gg_genmove positions.
+- New move generator: combinations() in new file combinations.c
+- double attack threats detected
+- better valuation of attacks on worms
+- general cleanups
+
+3.1.11 released October 21, 2001
+
+- tuning
+- owl tuning
+- eye tuning
+- new function owl_proper_eye() and autohelper with the same name
+- valuation of uncertain owl defense moves revised
+- evaluate_diagonal_intersection() revised
+- new pattern class b in owl_defendpats.db
+- handling of same_dragon field in struct owl_data revised
+- do_atari_atari() revised
+- bugfixes in make_worms()
+- 1D revisions all over the engine
+- new debug flag DEBUG_READING_CACHE
+- same_dragon() renamed is_same_dragon()
+- new gtp commands start_sgftrace and finish_sgftrace
+- new and revised regression tests
+- new gtp command top_moves
+- bugfix in draw_back
+- Add ON_BOARD1 assertions in liberty_of_string and neighbour_of_string
+- Use Win32 API to get CPU time usage for all Win32 builds, not just VC
+- Added a few scattered regression comments
+- Updated regress.pl to latest ever evolving version.
+- Adds several test cases and SGF files to trevor.tst & games/trevor/
+- reorientation code moved from gtp.c to play_gtp.c
+- owl_rot.tst uses reorientation code
+- fixed sscanf problem in (worm|dragon)_(stones|data)
+- allow dragon_stones to take color parameter, as well as coord.
+- revisions to capture.tst and vie.tst
+- further 1D revision in dragon.c
+- top_move functionality added to regress.pl
+- filllib.c and semeai.c made 1-dimensional
+- new gg_cputime in gg_utils.c
+- improved configuration for ncurses/{term,curses}.h
+- new and improved tests
+
+3.1.10 released October 14, 2001
+
+- portability fix for MINGW. Don't include crtdbg.h
+- rename connect to string_connect.
+- all move reason handling is 1D
+- owl goal and other date are 1D
+- new and revised test cases
+- bugfix in random.c
+- revision of readconnect.c
+- bugfix for Cygwin: gtp_dragon_data misreports invalid coordinate
+- revision of trevor.tst
+- bugfix in inv_rotate: use bs-1 instead of bs
+- new gtp function orientation
+- new gtp function query_orientation
+- in gtp_mprintf use gtp_print_vertex for the %m format specifier.
+- revision of regress.pl, Stone.pm
+- revision of engine/engine.dsp: remember readconnect.c
+- make gtp_loadsgf reorient gamerecords
+- make gtp_printvertices orient output points back
+- new function count_common_libs() in board.c
+- struct worm_data tracks all attack, defense, attack and defense threat points
+- remove_attack_move() and remove_defense_move() removed
+- attack_move_known(), defense_move_known(), attack_threat_move_known(),
+  and defense_threat_move_known() moved from move_reasons.c to worm.c
+- change_attack() and change_defense() moved from utils.c to worm.c
+- new functions change_attack_threat() and change_defense_threat() in worm.c
+- new function worm_reasons() in worm.c
+- trace messages in worm.c changed to DEBUG_WORMS messages
+- remove_opponent_attack_and_defense_moves() and
+  do_remove_false_attack_and_defense_moves() removed from move_reasons.c
+- NON_ATTACK_MOVE and NON_DEFEND_MOVE move reasons removed
+- try a little harder to find attack threats
+- attack.db and defense.db revised
+- indirect_helper() removed from helpers.c
+- tuning
+- minor owl tuning
+- new function have_common_lib() in board.c
+- new option --decide-connection
+- new function decideconnection() in sgfdecide.c
+- bugfixes in board.c, sgfdecide.c, and main.c
+- new IS_COLOR macro
+- comments moved from regression/STRATEGY to strategy.tst
+- time_report has a mintime parameter
+- many new tests in strategy4.tst
+- new regression/golois/*.sgf
+- new connect.tst global.tst vie.tst wolf.tst
+- new gtp function cputime
+
+3.1.9 released October 7, 2001
+
+- revised examine_move_safety heuristics
+- owl_determine_life() revised
+- new gtp functions connect and disconnect
+- naive_ladder() made global
+- warnings eliminated from readconnect.c
+- most functions in readconnect.c made static
+- add point reorientation functions
+- add some comments to dfa.c
+- bugfix and cleanup in naive_ladder()
+- new interface/GoImage/Stone.pm
+- struct eye_data arrays changed from 2D to 1D
+- 9x9 case revised in fuseki()
+- bugfix in goal detection in matchpat, don't accept empty goal vertices
+- bugfix in gtp_genmove()
+- new test cases in owl.tst
+- further 1D revisions in worm.c
+- find_lunch() moved from utils.c to worm.c
+- is_same_worm() converted to 1D
+- bugfix in list_move_reasons()
+- revised test case in niki.tst
+- tuning
+- owl tuning
+- connection tuning
+- new implementation of compute_primary_domains()
+- new eye pattern
+- bugfix in fuseki.c
+- cleanup and further 1D conversion in optics.c
+- sgf_decideeye doesn't require owl computation
+- 1D revisions in worm.c
+- is_worm_origin(), propagate_worms(), does_attack(), does_defend() are 1D
+- NNGS customization removed from ascii interface
+- gtp_worm_stones can be run with stackp>0 and can take a color argument
+- mkpat can take -i and -o options
+- MIN_BOARD is 5
+
+3.1.8 released October 1, 2001
+
+- defend2() revised
+- attack2() revised
+- break_chain2_moves() revised
+- connection_value() revised
+- most parts of move_reasons.c converted to 1D
+- domain calculation in optics.c now 1D
+- hash.c is more 1D
+- new function is_ko_point() in board.c
+- computation of cavities removed from worm.c
+- computation of caves removed from dragon.c
+- computation of inessential worms moved from make_dragons() to make_worms()
+- computation of ko points removed from make_worms()
+- printing of cutting stones removed from genmove.c
+- examine_cavity() simplified and made static
+- cavity_recurse() simplified
+- ko field removed from worm_data struct
+- border field removed from dragon_data struct
+- several fields moved from struct dragon_data to struct dragon_data2
+- false_margin field eliminated from struct eye_data
+- cleanup of sgf code
+- extended functionality of gtp commands dragon_stones and worm_stones
+- gtp_dragon_data returns a list of strings
+- new gtp functions dragon_stones and worm_stones
+- revision of extract_fuseki
+- revision of fuseki.c
+- bugfix in break_chain3
+- bugfix in special_attack4
+- warning fixed in mkpat
+- formatting errors fixed in decidestring and other places: use %1m
+- bugfix: trace in move_reasons.c
+- gtp_dragon_data() revised
+- new gtp functions dragon_stones and worm_stones
+- twogtp-a writes html
+- tuning
+- owl tuning
+- eye tuning
+- one new test case in reading.tst
+- new regression/games/trevor/* and unsorted tests mv'ed to trevor
+- new tests xxlin.tst
+- strategy4 target in regression/Makefile.am corrected
+- rotated tests revised
+- dsp files revised
+
+3.1.7 released September 24, 2001
+
+- heye[] is now stored as a 1-dimensional array
+- halfeye() is now called is_halfeye()
+- new macro for traversing all points: for_all_board()
+- atari_atari and helper functions now 1D
+- all goal functions in reading.c now 1D
+- calls to the goal functions in reading.c converted to 1D calling standards.
+- bufix in do_find_superstring()
+- bugfix in aftermath_genmove()
+- bugfix in hashdata_recalc()
+- bugfix in store_persistent_owl_cache()
+- assertions added to are_neighbor_strings()
+- analyze_neighbor() in filllib.c revised
+- alternative definition of ASSERT1 macro corrected
+- revised valuation of vital eye moves
+- colored legends with -T output
+- make internals of worm[][] 1-dimensional
+- make eye data 1-dimensional
+- new macros: PASS_MOVE and NO_MOVE
+- change_attack and change_defense are now 1-dimensional
+- worm handling in move_reasons.c is now 1-dimensional
+- dragon.c is now 1-dimensional
+- prefix struct option in getopt.c with gg_
+- prefix all occurences of optarg with gg_
+- improved color support in cygwin and VC++
+- brighter colors under VC++
+- increase BOARDSIZE by one
+- set MAX_BOARD to 19 for development versions
+- new functions readsgffilefuseki, gametreefuseki in sgfnode()
+- tuning
+- owl tuning
+- new strategy4.tst and unsorted.tst
+- new game record and new and revised filllib regression tests
+
+3.1.6 released September 15, 2001
+
+- limited pushing of p[][] allows one level of recursion in global_matchpat
+- bugfix in sgf_utils.c function get_moveX() and get_moveY()
+- new functions find_common_libs() and are_neighbor_strings() in board.c
+
+3.1.5 released September 15, 2001
+
+- board changed from 2D to 1D array representation
+- major revisions of board.c and reading.c
+- smaller revisions more or less anywhere
+
+3.1.4 released September 14, 2001
+
+- do_atari_atari tries harder to find defenses
+- confirm_atari_atari checks to see if tried move really causes the combination
+- changing a group's status from CRITICAL to DEAD does not satisfy atari_atari
+- bugfix in find_more_owl_attack_and_defense_moves()
+- new function start_timer() and time_report() in utils.c
+- showtime code cleaned up in dragon.c, genmove.c, and move_reasons.c
+- move numbers printed correctly in ascii interface
+- minor changes and cleanup in ascii interface
+- prefix getopt_long and the options struct with gg_
+- new functions sgfFreeNode and sgfFreeProperty
+- tuning
+- influence tuning
+
+3.1.3 released September 6, 2001
+
+- bugfix in the atari_atari code
+- obsolete sgf_dump facilities removed
+- remove_string removed from gnugo.h
+- add_replacement_move() in move_reasons.c revised
+- in value_move_reasons() ko threats are affected by shape values
+- tuning
+- don't call new_position for every stone when playing out an SGF tree.
+- new gtp engine metamachine in interface/gtp_examples
+- new gtp command query_boardsize
+
+3.1.2 released September 4, 2001
+
+- realloc space for owl stack if needed
+- new static functions push_owl and pop_owl
+- bugfix in move_reasons.c to avoid overcounting certain attacks
+- move replacement mechanism implemented in move_reasons.c
+- new autohelper action replace()
+- new game record and regression test
+- new tests and regressions
+
+3.1.1 released August 31, 2001
+
+- halfeyes valued slightly more guessing eye value for shapes not in eyes.db
+- all owl data stored in do_owl_attack() and do_owl_defend()
+- revised definition of inessential strings in owl_find_lunches()
+- confirm_safety() revised
+- owl tuning
+- global_matchpat() to perform pattern matching on the whole board.
+- removed scan loops from different files.
+- matchpat() made static
+- size test made one time for all the board.
+- reverse spiral implemented to compute the move's row in the spiral path.
+- bugfixes and improved trace output in atari_atari functions
+- bugfix in dragon.c: broken format crashed printworms option
+- bugfix in play_gtp.c: format needed extra newline
+- configure --enable-profile implemented
+- new game records and regressions
+- new gtp_example vanilla.c
+- missing subheadings added in doc/*texi
+- BREAKAGE reset
+
+3.0.0 released August 24, 2001
+
+- komi can be set from CGoban using the command line
+- play_gmp takes a Gameinfo * parameter
+- corrected bounds in small_semeai
+- simplified bounds check in double_atari
+- explicit cast to avert warning in play_gtp.c
+- doc revision
+
+2.7.256 released August 23, 2001
+
+- unused dragon.old_safety retired
+- bugfix in owl_determine_life: signed char mx
+- no long filenames in games/arb
+- variations eliminated in dublin1.sgf
+- one dublin1 test in connection.tst
+- doc revision
+
+2.7.255 released August 22, 2001
+
+- two declarations moved in liberty.h
+- dilate_erode, sgftree_printboard and resize_dfa are static
+- doc revision
+
+2.7.254 released August 21, 2001
+
+- MAXSTACK expanded
+- struct move_data renamed owl_move_data in owl.c
+- superstring_breakchain made static
+- bugfix in showboard: capture colors switched
+- stray | removed from manyfaces.tst
+- revised newlogo
+- Trevor Morris and Stephan Somogyi THANKed
+- initials cleaned and comments edited in patterns.db
+- doc revision
+
+2.7.253 released August 20, 2001
+
+- gtp_loadsgf modified to work on Mac OS X
+- DEFAULT_LEVEL 10 in config.vc and config.vcin
+- newlogo.jpg restored in doc/
+- gtp2_6 added to interface/gtp_examples/
+- doc revision
+
+2.7.252 released August 19, 2001
+
+- moved interface/gtp/ to interface/gtp_examples/
+- pragma disable 4244 4305 added to config.vc and config.vcin again
+- placehand does not place a stone if handicap == 1
+- gameinfo_play_sgftree default handicap is 0.5 if handicap != 0
+- regress.awk strips carriage returns for DOS compatibility
+- doc revision
+
+2.7.251 released August 18, 2001
+
+- moved the komi field from Gameinfo to Position
+- change usages of komi in various places
+- estimate_score no longer declared in gnugo.h
+- use gnugo_estimate_score in play_gmp, play_solo, play_ascii, debugboard
+- bugfix in gameinfo_load_sgfheader: initialize handicap
+- abortgo.sgf reference taken out of abortgo
+- gameinfo_play_sgftree does not place a stone if handicap 1
+- twogtp default handicap 0, not 1
+- twogtp declares file FF[4] not FF[3]
+- doc revision
+- win/ directory removed
+- WINDOWS revised again
+
+2.7.250 released August 17, 2001
+
+- bugfix in main.c: stray hyphen broke compile
+- bugfix in interface.c: reject weird handicaps
+- bugfix in double_atari: reject off board locations
+- bugfix in aftermath: reject off board locations
+- new WINDOWS
+- new logo
+- do_play_move made static
+- doc revision
+- pragma disable 4244 4305 added to config.vc and config.vcin
+- new command load <file name> in ascii mode.
+- reference of --autolevel in help massege.
+- fixed a bug in sgf file saving (to avoid strange handicap)
+
+2.7.249 released August 16, 2001
+
+- print_moyo color parameter eliminated
+- All FIXME's classified post 3.0
+- bugfix in owl_big_eyespace: check ON_BOARD(oi,oj)
+- bugfix in fill_liberty: check ON_BOARD
+- bugfix: initialize path in dfa matcher
+- moved dfa scan function and others from dfa.c to matchpat.c
+- moved dfa_fixup_for_size into dfa_compile_for_match.
+- cleanup of dfa code
+- removed heavy functions dfa_scan() and dfa_restart()
+- new function scan_for_pattern()
+- New warning in mkpat for DFA_MAX_MATCHED update.
+- a warning fixed in dfa.c
+- Any pattern db can use wired dfa's.
+- removed load_dfa() and save_dfa() functions.
+- removed -d option from mkpat.
+- removed unused values from dfa_t struct
+- sync_product uses a hash table instead of an huge array
+- new stucture test_array_t and new static functions in dfa.c 
+- DFA_MAX_BOARD set to 21
+- revision of all .dsp files
+- analyze.h removed from engine/Makefile.am
+- unused function dump_data removed from score.c       
+- bugfix in aftermath_genmove()
+- code cleanup
+- unchosen fuseki moves from fuseki database awarded a smaller value
+- filllib and aftermath moves also recorded with move_considered()
+- potential_moves array converted from int to float
+- PROFILE_PATTERNS disabled by default
+- computation of inessential strings in owl_find_lunches revised
+- is_worm_origin() moved from utils.c to worm.c
+- test mode option replaced by a replay option
+- code in play_test.c heavily rewritten
+- owl tuning
+- new gtp function top_moves
+- new game record and regression tests
+- doc revision
+- new tests tanguy.tst, dublin1.sgf and dublin2.sgf
+       
+2.7.248 released August 7, 2001
+
+- undo implemented in play_gtp
+- estimate_score renamed old_estimate_score
+- new_estimate_score renamed estimate_score
+- gtp commands new_score and prisoners renamed estimate_score and captures
+- default level set to 10
+- config.guess and config.sub removed from the distribution
+- moyo.c and analyze.c removed from the distribution
+- obsolete --moyo options retired
+- count_territory, evaluate_territory and remove_string removed
+- new function gnugo_estimate_score
+- doc revision
+- cleanup
+- minor tuning
+- Jens Yllman added to authors
+- patterns.dsp replaced
+- VC++ warnings addressed
+
+2.7.247 released August 2, 2001
+
+- aftermath_genmove() revised
+- bugfix in do_genmove(), no reinforcing moves while scoring
+- bugfix in estimate_territorial_value(), no reinforcing moves while scoring
+- bugfix in score.c, 19 replaced by board_size
+- bugfix in confirm_safety(), verbose not restored in two cases
+- values used by worm[][].conditional_status made more consistent
+- connection_value returns a higher value if we are ahead
+- status INESSENTIAL distrusted by connection_value if we are ahead
+- xcut autohelper macro rejects B pattern ! as well as *
+- connection tuning
+- score, upper_bound and lower_bound are made global variables
+- estimate_strategical_value takes score parameter
+- revision of score report in play_solo
+- new --showscore option
+- tuning
+- owl tuning
+- spelling mistake in regression/Makefile.am fixed
+- new regression test and game record
+- code cleanup in analyze.c
+- assert() changed to gg_assert() in extract_fuseki.c
+- mkpat and joseki add copyright notice to built files
+- verbose prints the score
+- bugfix in report_dragon: if dragon.id = -1 ignore dragon2
+- VC++ compatibility changes
+- DFAFLAGS is -D instead of -d
+- autolevel target is level 10, not 11
+- play_gmp uses new_score at game end
+- doc revision
+- revision of twogtp
+- new game records and connection tests
+
+2.7.246 released July 15, 2001
+
+- if ahead, owl_prevent_threat move reasons given real value
+- tuning
+- owl tuning
+- Chinese counting implemented
+- ascii mode revised
+- files gtp.c and gtp.h under X11 licensing
+- autolevel option activated
+- bugfix in matchpat.c
+- new #define GNUGO_PATH in config.h.in
+- fixed some problems with inclusion of dfa in pattern c files.
+- mkpat is now called with option -D instead of -d => no more binary dfa files.
+- in matchpat.c dfa_match_init do not try to load dfa's files anymore.
+- load_dfa() adapted to enable wired dfas
+- wired dfas
+- new macro gg_assert
+- change_dragon_status() replaced by change_matcher_status()
+- minor cleanup
+- atari_atari_try_combination turns down verbose
+- hyphenation of some command line options
+- project files *.dsp and *.dsw revised
+- color support revised
+- doc revision
+
+2.7.245 released July 5, 2001
+
+- aftermath code revised
+- new options --allow-suicide, --play-out-aftermath, --capture-all-dead
+- unused constant MAX_TRY removed from genmove.c
+- option --noinhibit removed
+- new function and autohelper max_eye_value()
+- new global doing_scoring affecting valuations while scoring
+- bugfix in valuation of attack_either and defend_both moves
+- neither black nor white used in colored displays
+- new gtp commands final_status, final_status_list, and protocol_version
+- gtp_playblack and gtp_playwhite revised
+- warning eliminated in debugboard/gui.c
+- fuseki9.db regenerated from a bigger set of games
+- new regression tests and game records
+- regressions/niki.tst included (omitted by mistake from 2.7.244)
+- new autohelper macro effective_size
+- copyright notice added to twogtp
+- depth values increased in owl_substantial
+- followup contribution cap lowered to tot_value
+- tuning
+- owl tuning
+- hyphens replace underscores in command line options
+- doc revision
+
+2.7.244 released July 1, 2001
+
+- followup values are calculated more carefully
+- attacks on uncertainly DEAD dragons are now called uncertain defense
+- confirm_safety less verbose
+- demotion of many fuseki patterns
+- tuning
+- owl tuning
+- reduction of j and t classes
+- new function atari_atari_try_combination and autohelper macros
+- TRACE_ATARI_ATARI replaced with DEBUG_ATARI_ATARI
+- Use double instead of timeval structs for clock time values
+- Removed a lot of heavy timeval functions from clock.c
+- new function clock_time_graph() for time/move/level stats
+- added more traces to clock functions
+- pushbutton does not complain when no initialisation is done
+- removed a lot of non used memory check in mkpat:
+- mkpat never rejects a pattern but complains if it makes the dfa big
+- the -d and -D option of mkpat do not require arguments
+- -m option is now alway used in Makefiles to save memory on owl pats
+- -r option eradicated from mkpat.
+- ignore trailing white space in input to mkeyes.c
+- remove @SET_MAKE@ from Makefile.am.
+- remove config.guess en config.sub from distribution
+- revision of coloring part of configure.in
+- play_ascii correctly marks the last stone played while GNU Go thinks
+- doc revision
+- new test nikki.tst
+
+2.7.243 released June 22, 2001
+
+- dragon.owl_status_certain split to owl_attack_certain, owl_defend_certain
+- new_estimate_score is run every move if level >= 8
+- if safely ahead, uncertain defensive moves are added
+- revision of certain connection values
+- WEAK safety value reduced
+- doc/gtp.texi revised
+- aftermath code revised
+- warnings eliminated in clock.c
+- on board assertions in same_dragon()
+- liberty filling code revised
+- value of empty corners reduced in fuseki.c
+- tweek in influence_callback()
+- more careful valuation of ko threats in value_move_reasons()
+- confirm_safety() call in review_move_reasons() avoids bad ko threats
+- more careful detection of disturbing moves in the persistent owl cache
+- new function owl_confirm_safety()
+- new function atari_atari_confirm_safety()
+- confirm_safety() and double_atari() revised
+- gtp_final_score() revised
+- new gtp commands fixed_handicap, level, name, and version
+- code cleanup
+- tuning
+- owl tuning
+- eye tuning
+- new helper backfill_helper() and autohelper function with same name
+- new function interface/twogtp
+
+2.7.242 released June 19, 2001
+
+- bonus for uncertain defense/attacks reduced
+- bugfix: defense threat move reasons not generated for illegal moves
+- tuning
+- owl tuning
+- more careful to get dragon.owl_status_certain right
+- dragon.owl_status_certain can affect dragon.safety
+- corrections to -m option
+- bugfix: OWL_DEFENSE_THREAT was reported incorrectly
+- adjective ``reliable'' disassociated from semeai()
+- bugfix in decidedragon: report uncertainty correctly
+- revision of gtp_report_uncertainty
+- ignore trailing whitespace in patterns
+- add prototype in dfa.h for print_c_dfa
+- some sgf files standardized
+
+2.7.241 released June 12, 2001
+
+- owl_attack and owl_defend return a certainty value
+- new field dragon.owl_status certain
+- new UNCERTAIN_OWL_ATTACK and UNCERTAIN_OWL_DEFEND move reasons
+- revisions and corrections to some gtp functions
+- tuning
+- owl tuning
+- reduced value of j patterns by one point
+- merged new_matchpat.c into matchpat.c
+- when no dfa file is found, use standard do_matchpat()
+- fixed a reference to nonexistent merged_board[][].
+- updated dfa matcher to merged_val optimization.
+- removed check_pattern() function.
+- dfa board preparation moved to dfa_match_init()
+- new constant DFA_MAX_MATCHED
+- assertion to check possible DFA_MAX_MATCHED overflows.
+- added --clock,--byo_time and --byo_period in --help listing.
+- new function print_c_dfa() in dfa.c
+- new option -D <memory> in mkpat.c puts the dfa into the binary
+- doc revision
+- new tests and regressions
+- corrections to old tests and regressions
+
+2.7.240 released June 12, 2001
+
+- new autohelper function macro owl_threatens
+- CAN_THREATEN_ATTACK and CAN_THREATEN_DEFENSE renumbered
+- status_to_string revised
+- gtp declarations sorted alphabetically
+- new gtp command "help" lists gtp commands
+- gtp command dragon_data revised
+- show_dragon revised
+- new function safety_to_string
+- tuning
+- owl tuning
+- game regression/games/pending ssstator.sgf added
+- last two moves cached in global last_moves_i, last_moves_j array
+- bugfix: sometimes owl_threat_status was wrongly UNCHECKED
+- when reading a file even passes are given to gnugo_play_move
+- OWL_PREVENT_THREAT reason valued more if opponent adds to a dead dragon
+- new vital owl attack pattern VA17
+- change ko_i and ko_j to board_ko_i and board_ko_j in new_matchpat.c
+- bugfixes in captured_territory() from score.c
+- new game records and regression tests
+- aftermath code revised
+- pure_threat_value increased from 0.0 to 0.4 in genmove()
+- new flag worthwhile_threat in the move[][] array used in move_reasons.c
+- new function add_worthwhile_threat_move() in move_reasons.c
+- new pattern classification W for worthwhile threats
+- bugfix in owl_does_defend()
+- active area computation in store_persistent_owl_cache() revised
+- bugfix in atari_atari code
+- print_regions() in score.c reimplemented
+- new game records and regression tests
+- doc revision
+
+2.7.239 released June 8, 2001
+
+- use gg_gettimeofday routines in stead of gettimeofday
+- make autoconf 2.50 script detect mingw32
+- include config.h in gnugo.h
+- new file score.c
+- new function new_estimate_score()
+- new gtp function gtp_new_score
+- fixed --score last and --score [movenum]
+- aftermath code revisions
+- new function same_string() in board.c
+- global variable threats_enabled renamed disable_threat_computation
+- new global variable disable_endgame_patterns
+- new function owl_hotspots() and reading_hotspots()
+- revision of induce_secondary_move_reasons()
+- connect_strings bonus revised
+- new functions edge_clamp() and edge_block() in reading.c
+- performance improvement in atari_atari() and do_atari_atari()
+- improved traces from the atari_atari functions
+- minor tweaking of move ordering parameters
+- performance improvement in superstring_add_string() in utils.c
+- tuning
+- owl tuning
+- new regression suites blunder.tst and newscore.tst
+- new and revised regression tests
+- new and revised game records
+- missing parameters supplied to is_illegal_ko_capture in value_moves
+- bugfix in fuseki
+- incorrectly dimensioned arrays fixed in gtp_all_legal
+- is_pass() moved to board.c
+- A number of FIXMEs addressed
+- minor cleanup
+
+2.7.238 released May 28, 2001
+
+- aftermath_genmove() revised
+- new global threats_enabled to disable computing worm and dragon threats
+- definition of WIN, KO_A, KO_B, LOSE, and CUT only in gnugo.h
+- minor optimizations in filllib.c and owl.c
+- better debug support for persistent owl cache
+- move order tuning in reading.c
+- neighbors of invincible worms excluded from active area in persistent cache
+- owl tuning
+- new game records and regression tests
+- new option --autolevel (not activated by default).
+- revision of clock.c and clock.h
+- broken return codes corrected
+- new gtp command worm_cutstone
+- doc revision
+
+2.7.237 released May 27, 2001
+
+- revised reading and owl return codes
+- incremental_board.c removed from engine/Makefile.am
+- parameters to chainlinks() and chainlinks2() revised
+- incremental_order_moves() counts stones in atari more accurately
+- superstring functions reimplemented
+- new function find_superstring_stones_and_liberties
+- optimization in owl_does_defend()
+- detection of insubstantial strings in owl_determine_life made more efficient
+- persistent reading cache size doubled from 50 to 100 entries
+- revisions in defend2() and defend3()
+- order_moves() revised
+- bugfix in break_through_helper
+- order_moves doesn't sort singleton lists
+- pure threat value in do_genmove set to zero
+- more stats with -b option
+- globals your_last_move_*, my_last_move_*, no_old_data_exists removed
+- superceded dragon data caching scheme taken down
+- new tests and regressions
+- new gtp command worm_cutstone
+- new testsuite cutstone.tst
+- new game record wormflaw.sgf
+- minor tuning
+- doc revisions
+- some FIXMEs addressed
+- debugboard now shows all worm and most dragon data
+- upgrade configure.in to work with autoconf version >= 2.50
+- new files config.guess and config.sub
+
+2.7.236 released May 17, 2001
+
+- shadowing and persistent caching of reading functions implemented
+- new function get_move_from_stack()
+- new functions draw_reading_shadow() and purge_persistent_reading_cache()
+- new function attack_and_defend()
+- new tests and regressions
+- fill_liberty() looks for ko back captures
+- minor tuning
+- bugfix in double_atari
+- bugfix in komaster_trymove: i - j confusion
+- new functions: gnugo_play_sgfnode and gnugo_play_sgftree
+- new functions: gameinfo_load_sgfheader and gameinfo_play_sgftree
+- renamed load_sgf_header, play_sgf_tree, sgfPlayNode and sgfPlayTree
+- sgfutils.c removed
+- removed incremental_board.c and sgfutils.c from engine/Makefile.am
+- renamed neighbor_of to neighbor_of_string
+- renamed liberty_of to liberty_of_string
+- minor cleanup of gnugo.h
+- doc revision
+- print more debugging info in worm.c
+- rewrite loop in worm.c with deltai and deltaj arrays
+- revision of play_test
+
+2.7.235 released May 5, 2001
+
+- aftermath code revised
+- owl reuse is off by default
+- function komaster_trymove() replaces move_allowed()
+- optimization in is_self_atari()
+- new function owl_big_eyespace() and corresponding autohelper function
+- new field unconditional_status in struct worm_data
+- new static function edge_closing backfill in reading.c
+- move ordering scores available outside order_moves()
+- attack4() rewritten
+- propose_edge_moves() revised
+- relative_break_chain() obsoleted and removed
+- move ordering scores written in sgf output file with variations
+- sgf output file records komaster
+- changed parameters to unconditional_life()
+- unconditional_life() now finds unconditional dead stones and territory
+- reinforce_helper() revised
+- tuning, owl tuning
+- tune_move_ordering() can write c code for inclusion
+- new and revised regression tests and game records
+- new global variable shadow[][]
+
+2.7.234 released May 4, 2001
+
+- komaster implementation corrected in owl.c
+- sgf traces now show komaster in -o output
+- bugfix: --no_owl_reuse was broke
+- bugfix in sgfutils.c which could crash on some files with IL property
+- IL property moved to the end of files reading16.sgf and reading20.sgf
+- variable length value for SGFproperty
+- numeric keypad can be used for cursor movement in debugboard
+- debugboard needs slightly smaller screen
+- debugboard shows data for both black and white eyes
+- new movement buttons for debugboard: ctrl-a and ctrl-e
+
+2.7.233 released April 29, 2001
+
+- revision of the komaster scheme
+- persistent owl caching
+- owl_attack is more cautious if an attack can produce a ko
+- parameters in acconfig.h sorted in order recommended by comments in file
+- config.vcin is once again brought in sync with the current config.h
+- bugfix in eyes.db
+- SGF IL property can set (board_ko_i, board_ko_j)
+- owl test 27 corrected
+- new tests manyfaces.tst
+- new directory regression/games/seki_exotics
+- doc revision
+
+2.7.232 released April 25, 2001
+
+- break_chain2_efficient_moves() revised
+- bugfixes in order_moves()
+- new tuning parameter safe_atari_score in order_moves()
+- bugfix in configure.in
+- spelling correction in gnugo.texi
+- same_dragon(), report_dragon() and ascii_report_dragon() moved to dragon.c 
+- speed improvements in filllib.c
+- corrected size of defend_not_adjacent_lib_score[] array in reading.c
+- bugfix and minor reorganization in review_move_reasons()
+- remove incremental_board.[ch] from engine/Makefile.am
+- hashtable_unlink_closed_results() can now remove read results selectively
+- remove incremental_board.[ch] from engine/Makefile.am
+- hashtable_unlink_closed_results() can now remove read results selectively
+- attack tuning
+- new GTP command: echo
+- attack tuning
+- tuning
+- endgame performance tuning
+- minor cleanup
+- commented some tests in NICKLAS test suite
+- bugfix in nicklas2.tst
+- SGF PL property handling in play_ascii.c corrected
+- revised order of inclusion of header files in interface/main.c
+- Chinese and Japanese rules were switched
+- new files "clock.h" and "clock.c" 
+- new global struct "clk" handeling the timers.
+- new global variable "clock_enabled" (set to 1 by --clock XXX).
+- new functions clock_isOver(), clock_isByoYomi(), clock_getTimeLeft()
+- new options --clock, --byo_time and --byo_period
+- compute the clock delta error
+- cleanup clock initialisation in main.c
+- new games and regressions in arb.tst
+- new games mfgg*.sgf and nightmare.sgf in regression/games/pending
+- macros abs, max and min renamed gg_abs, gg_max and gg_min
+
+2.7.231 released April 20, 2001
+
+- we do not reuse data unless 2 last moves are on the board
+- last moves are set by play_solo
+- extra level inserted between levels 6 and 7
+- nominal depth variables by mandated depth variables
+- revised handling of depth variables set at command line
+- new function set_depth_values()
+- get_location renamed string_to_location and moved
+- review_move_reasons tries harder not to return illegal moves
+- same_dragon() moved to board.c
+- redundant lunch timing removed from dragon.c
+- average move time computed by --showtime
+- atari_atari uses restricted_defend1 to find second move
+- tuning
+- aftermath code revised
+- new function aftermath_compute_score()
+- new debug flag DEBUG_AFTERMATH
+- new functions store_position(), restore_position() in engine/interface.c
+- who_wins() moved from moyo.c to utils.c and revised
+- superstring_breakchain() now considers ko
+- score computations consistently use positive values for white wins
+- gtp_loadsgf sets no_old_data_exists=1
+- new gtp command final_score()
+- scoring option --score aftermath now works properly
+- new regression file score.tst
+- add configure test for variadic #define
+- fix bug in configure test for __FUNCTION__
+- remove __ prefix from function prototypes in gg-getopt.h
+- new option --chinese_rules
+- new configure option --enable-chinese-rules
+- new functions ascii_report_dragon and report_dragon for use in gdb
+- new game records and test cases
+- minor doc revision
+
+2.7.230 released April 13, 2001
+
+- default default level is 8
+- default level can be set at configure or run time
+- default cache can be set to arbitrary value at configure time
+- revised ko handling
+- kothreat_needed no longer needed
+- aftermath uses genmove_conservative
+- tuning
+- owl tuning
+- influence tuning
+- systematic use of faster ON_BOARD macro
+- new function is_illegal_ko_capture()
+- does_capture_something() made public
+- new function genmove_conservative
+- improved --showtime information
+- minor revision of confirm_safety
+- print_top_moves() split out from review_move_reasons()
+- configure tests for keypad
+- malloc.h inclusions taken down
+- help string revised
+- new tests and regressions
+
+2.7.229 released April 9, 2001
+
+- caching of owl data implemented and reuse on later moves
+- showtime option shows information about owl reading time
+- new global variables my_last_move_i, my_last_move_j, no_old_data_exists
+- last_move_i, last_move_j renamed your_last_move_i, your_last_move_j
+- incremental_order_moves() revised
+- order_moves() revised
+- attack2() revised
+- bugfix in linear_eyes()
+- do_owl_attack() and do_owl_defend() revised and simplified
+- more robust topological eye analysis in owl_determine_life()
+- vital moves for multiple eyespaces recognized in owl_determine_life() 
+- sniff_lunch() revised
+- owl_eyespace() ignores eyespaces which do not yield a single eye
+- joseki.c revised
+- tuning, owl tuning, eye tuning
+- new takamoku joseki
+- new game record and test cases
+- test results updated
+
+2.7.228 released March 30, 2001
+
+- parameters kom_i and kom_j complement komaster field in many functions
+- routine_i_j_stackp renamed compressed_data
+- komaster added to cached compressed_data field
+- parameters ko_i and ko_j renamed board_ko_i and board_ko_j
+- GRAY is a synonym for GRAY_BORDER
+- incremental_board.* removed
+- incremental board functionality merged into board.c
+- revised komaster scheme in reading.c and owl.c
+- trick to avoid sorting corners in matchpat.c
+- mkpat -m now works in both dfa and non-dfa mode
+- compile_for_match() no longer calculates merged values
+- revised debug messages in influence.c and sgfnode.c
+- tuning
+- owl tuning
+- influence tuning
+- new game records and regression tests
+- test results updated
+
+2.7.227 released March 23, 2001
+
+- new file engine/aftermath.c
+- temporary option "--score aftermath"
+- "connect strings" bonus in move_reasons.c revised
+- bugfix in value_move_reasons
+- all vital owl attack pattern matches counted
+- bugfix in owl_determine_life(), a no longer valid shortcut disabled
+- dead code removed from owl_reasons()
+- break_chain2() revised
+- various FIXMEs addressed
+- try kos in play_break_through_n(), play_attack_defend_n(),
+  and play_attack_defend2_n()
+- bugfix in atari_atari
+- worm threats on second order liberties.
+- new transform.c
+- endgame tuning
+- tuning
+- eye tuning
+- owl tuning
+- new regression test cases and game records
+- more copyright messages updated
+- minor doc revision
+
+2.7.226 released March 21, 2001
+
+- bugfix in atari_atari
+- minor speedups in matchpat.c
+- looks for tactical ko theats
+- long USAGE string split in interface/main.c
+- removed main.c.zheng and interface.dsp from distribution
+- tuning
+- owl tuning
+- updated copyright messages
+
+2.7.225 released March 15, 2001
+
+- new move reasons: ATTACK_THREAT_MOVE and DEFEND_THREAT_MOVE
+- new functions compute_effective_worm_sizes() and
+  find_worm_attacks_and_defenses() split off from make_worms()
+- new function find_worm_threats(), called from make_worms()
+- redundant NULLs removed from attack.db, barriers.db, conn.db,
+  defense.db, endgame.db, fuseki19.db, fuseki9.db, and patterns2.db
+- extract_fuseki.c revised not to generate unnecessary NULL string
+- owl tuning
+- new and revised regression tests and game records
+
+2.7.224 released March 8, 2001
+
+- komaster status stored in reading cache
+- several functions in cache.c made static
+- new function incremental_order_moves() to support order_moves()
+- cleanup in topological_eye() and evaluate_diagonal_intersection()
+- improved traces in owl.c
+- semeai detecting code in owl_reasons() taken down
+- tuning
+- eye tuning
+- owl tuning
+- endgame tuning
+- new game record
+- new and revised regression test cases
+- endgame fix in move_reason.c
+- cleanup in helpers.c
+- tests for both sides in endgame.tst
+- estimate_score only if DEBUG_SCORING
+- revision of rotated tests and arb.tst
+- vc project files revised
+- Yin Zheng and Don Wagner added to acknowledgements
+
+2.7.223 released February 28, 2001
+
+- bugfix in play_move()
+- make_domains() distinguishes strictly between owl calls and others
+- bugfix in examine_position()
+- inessential worms excluded in one time in estimate_strategical value
+- false_margin() revised
+- inessential strings added in the owl code
+- MAXPATNO incresead in mkeyes.c
+- tuning
+- eye tuning
+- owl tuning
+- name collisions resolved in pattern databases
+- regression/READING revised
+- new and revised regression test cases
+- bugfix in regressions/Makefile*
+- revised nicklas* regressions
+
+2.7.222 released February 26, 2001
+
+- dead code removed from dfa.c, dfa.h, mkpat.c
+- o_somewhere and x_somewhere only check matcher_status if stackp==0
+- bugfix in atari_atari
+- bugfix in analyze_semeai
+- dragon.owl_status, status and matcher status initialized
+- tactically critical nakade stones reclassified as inessential
+- influence code revised
+- no strategical attack value for strongly alive dragons
+- hardwired values for J, j, and t patterns scaled with the board size
+- maximum values for j and t patterns disabled for boards < 17x17
+- tuning
+- influence tuning
+- owl tuning
+- endgame tuning
+- bugfix in mkpat.c, patterns of class c were unintentionally disabled
+- new game records
+- new and revised regression test cases
+- nonstandard SGF records and missing handicap stones fixed
+- Mathias Wagner thanked
+
+2.7.221 released February 19, 2001
+
+- restricted_attack2 and restricted_defend1 remember to set komaster
+- matcher_status only initialized to CRITICAL if owl code says so
+- bugfix in matchpat(), static variable properly reset
+- new debug messages in semeai.c
+- tuning
+- rotated tests updated
+- test results updated
+- new test reading 141
+
+2.7.220 released February 17, 2001
+
+- TODO revised
+- experimental influence based score estimation
+- scoring option in ascii interface uses the influence score estimate
+- test for tactically critical O worms restored from 2.7.218
+- atari_atari tries harder to find refutations
+- influence B patterns do not accept dead stones
+- revised connection values
+- bonus for moves which both owl defend/attack and connect/cut something
+- new autohelper for owl patterns; owl_eyespace()
+- defend_both() tries harder to find attackable splitting strings
+- class_mask[CRITICAL][color]=CLASS_O in new_matchpat
+- open dfa files in binary mode on MS-DOS and Windows
+- fix dfa error messages.
+- sgf code now understands PL[1] and PL[2]
+- new pattern class c, weak connections
+- tuning
+- owl tuning
+- influence tuning
+- eye tuning
+- new game records
+- new and revised regression tests
+- test results updated
+
+2.7.219 released February 13, 2001
+
+- redundant test for tactically critical O worms taken down in shapes_callback
+- fix bug in glib configuring
+- link dfa.c instead of include it.
+- extra parens in influence
+- add extra brackets to code1 macro in accumulate_influence
+- tuning
+- bugfix in mkpat.c: autohelper function halfeye() now works
+- gnits automake option removed
+- new test ego.sgf
+
+2.7.218 released February 7, 2001
+
+- O patterns reject CRITICAL friendly dragons
+- in make_worms() if worm.defend==PASS move not tried
+- in attack_callback() ignore strings with 5 liberties
+- default memory increased to 32Mb
+- configure supports 48MB and 64MB models
+- minor tuning
+- doc revision
+- vsnprintf error gives warning, not fatal error
+- duplicate owl test 186 renumbered
+
+2.7.217 released February 1, 2001
+
+- worm.c: only add defense move if worm.defend != PASS
+- find_defense returns PASS if string is alive as stands
+- defend1 pattern gets constraint
+- caching scheme revised so that the cache can be cleared on the fly
+- new debug flag DEBUG_READING_PERFORMANCE
+- only make requested dfa files (currently owl*dfa)
+- tuning
+- owl tuning
+- new game record dniwog.sgf
+
+2.7.216 released January 29, 2001
+
+- missing files generate_owl_dfa.sh and matchtest.sh in minipat2 restored
+- local_owl_node_counter initialized in owl_substantial
+
+2.7.215 released January 28, 2001
+
+- bugfix in analyze_semeai()
+- bugfix in find_attack_patterns()
+- new gtp command combination_attack
+- defend_against_atari_helper() revised
+- new regression test suite atari_atari.tst
+- STRATEGY revised
+- new regression tests and game records
+- reenable board printing on core dumps
+- bugfix in attack_callback: attack patterns are matched again
+- integrate rolled and unrolled versions of accumulate_influence
+- move invariant code out of loop in accumulate_influence
+- put patterns/minipat2 under automake control
+- include unistd.h in patterns/dfa.c for sleep function prototype
+- add pkgdata_DATA macro to patterns/Makefile.am
+- add macro DFAFLAGS
+- bugfix in dfa generation: borders constraints now always checked.
+- modification in patterns.h to avoid a warning: struct dfa *pdfa
+- add experimental check_pattern_light() function only checking
+- DEBUG_OWL_PERFORMANCE reports CPU times
+- vgprintf uses %.2f for %f
+- tuning
+- influence tuning
+- owl tuning
+- attack tuning
+- minor cleaning
+
+2.7.214 released January 21, 2001
+
+- combo attack and defend_both/attack_either can't both add to move value
+- bugfix in atari_atari()
+- eye tuning
+- owl tuning
+- READING revised
+- new and revised regression tests
+- test results updated (except nicklas*.tst)
+- doc revision
+
+2.7.213 released January 20, 2001
+
+- bigger moyo measure allowed for big dragons before owl code is disabled
+- compute_eyes_pessimistic() no longer consults the life code
+- cleanup of mkeyes.c
+- now possible to specify edge and corner vertices in eyes.db
+- mkeyes.c and recognize_eye() 
+- owl_substantial() revised
+- bugfix in special_rescue3()
+- loop unrolled in order_moves
+- revision of is_hoshi_point
+- bugfix in analyze_semeai(): don't try PASS moves
+- shape value in j or t pattern now modifies hard-wired value
+- atari_atari makes atari even if a chain is already in atari
+- environment variable $GNUGO_PATH used to load dfa files
+- fixup a Sun portability bug with enable-dfa
+- fixup for owl_vital_apats.db with enable-dfa
+- tuning
+- connection tuning
+- eye tuning
+- owl tuning
+- READING revised
+- new regression tests and game records
+
+2.7.212 released January 18, 2001
+
+- assertion added in is_ko()
+- revision of compute_eyes_pessimistic()
+- vital_apats consulted also by do_owl_defend
+- vital_apats only consulted if level >= 9
+- followup values reduced in two helpers
+- eye tuning
+- owl tuning
+- two new helpers finish_ko_helper() and squeeze_ko_helper()
+- portability patch for dfa in patterns.h
+- portability patch for cygwin in mkpat.c
+- test revisions
+
+2.7.211 released January 16, 2001
+
+- new file owl_vital_apats.db
+- vital_apats are consulted by do_owl_attack regardless of genus
+- new static variable match_found in owl.c
+- estimate_territorial_value() limits overvaluation of half point kos
+- changed order of min and max constraints in value_move_reasons()
+- analyze_semeai() revised
+- generic_walk made static in utils.c
+- tuning
+- owl tuning
+- eye tuning
+- READING and STRATEGY revised
+- new and revised regression test cases
+- new game records
+- rotated tests corrected
+
+2.7.210 released January 14, 2001
+
+- bugfix in reading.c: superstring liberty arrays needed more space
+- bugfix in owl_reasons which could cause a crash
+- bugfix in owl_threaten_attack(): return value was always 0
+- owl threatened groups are WEAKLY_ALIVE
+- value of connecting WEAK and WEAKLY_ALIVE groups increased
+- owl_threats not evaluated if level <= 7
+- tactical reading move order tuned
+- tuning
+- owl tuning
+- tuning of hoshi.sgf and sansan.sgf
+- new regression suites endgame.tst, viking.tst and strategy28.sgf
+- new tests in owl.tst and strategy2.tst
+- new regression game records
+- revision of rotated test suites
+
+2.7.209 released January 10, 2001
+
+- new parameter superstring_depth (default 7)
+- minor tuning of hoshi.sgf
+- tuning
+- owl tuning
+- connection tuning
+- renumbering of owl patterns
+- AB property added to handicap games in regression/games
+- one new owl test
+- doc revision
+
+2.7.208 released January 7, 2001
+
+- new reading function special_rescue3
+- break_chain2 and break_chain3 calls removed from defend2 and defend3
+- call edge reading function from attack2 and attack3
+- superstring_breakchain depth in defend2 changed to backfill2_depth
+- defend2 and defend3 try playing a liberty of the superstring
+- special_rescue3 called from defend3
+- break_chain2_moves tests for self atari
+- move ordering adds bonus for saved moves
+- doc revision
+- basic worm building extracted from make_worms.
+- new function: build_worms
+- estimate_territorial_value requires owl reasons with VITAL_EYE_MOVE
+- better reading at the edge
+- some fixes in debugboard
+- use same reading depths in debugboard as in gnugo
+- minor tuning
+
+2.7.207 released January 4, 2001
+
+- new function break_chain2_efficient_moves
+- revision of special_rescue()
+- revision of attack2(), attack3(), superstring_breakchain()
+- look harder for neighbors of attack moves in examine_move_safety()
+- compute_eyes_pessimistic tracks margins adjacent to margins
+- owl_find_lunches considers ko captures
+- owl_escape_value checks empty before returning -10
+- decision to handle tactically moved to semeai_analyzer
+- semeai analyzer adds move reasons instead of moving defense
+- tuning
+- owl tuning
+- influence tuning
+- revision of rotated tests
+
+2.7.206 released January 3, 2001
+
+- revision of print_influence and print_numeric_influence
+- value_move_reasons considers moves with min_territory>0
+- reversed level inequality fixed in review_move_reasons
+- is_legal replaced by safe_move call in semeai_analyzer
+- revision of proper_superstring_chainlinks() and superstring_recurse()
+- new patterns in barriers.db
+- general cleanup
+- tuning of seki patterns
+- comments about regression tests
+- doc revision
+- manpage revision
+- new file gnugo.pod
+
+2.7.205 released January 1, 2001
+
+- semeai analyzer looks for owl solution first
+- semeai analyzer not invoked for inessential dragons
+- owl patterns classified
+- bugfix in superstring_breakchain
+- minor tuning
+- new regessions arion.tst
+- revision of rotated tests
+- minor doc revision
+
+2.7.204 released December 26, 2000
+
+- superstring technology used in attack2, defend2
+- new static functions restricted_attack2, in_list in reading.c
+- libi, libj arrays sized 2 (formerly 3) in attack2
+- minimum standard joseki value raised to 27
+- hurry replaced by level
+- print_influence takes dragons_known parameter
+- obsolete code removed from optics.c
+- minor tuning
+- doc revision
+- doc/indigo2.sgf removed from distribution
+
+
+2.7.203 released December 21, 2000
+
+- owl status is checked also for dragons with high escape potential
+- new safety value WEAKLY_ALIVE for dragons which are owl alive by escape
+- fill_liberty() code revised
+- new function filllib_confirm_safety()
+- new debug flag DEBUG_FILLLIB and new debug traces in filllib.c
+- move valuation slightly revised
+- influence code revisions
+- maximum move values for standard joseki removed in shapes_callback()
+- tuning
+- owl tuning
+- influence tuning
+- new regression test suite filllib.tst
+- new tests and game records
+- doc revision
+- new superstring functions in utils.c
+- find_superstring_recurse() renamed superstring_recurse() and generalized
+- new superstring_breakchain() and restricted_defend1()
+- Separated the SGF library totally from the engine
+- integrated sgf_utils.h into sgftree.h
+- The Gameinfo struct expanded
+- movenum moved to the internals (from gnugo.h to liberty.h)
+- Some FIXMEs addressed
+- General minor cleanup
+
+2.7.202 released December 17, 2000
+
+- anisotropic attenuation removed from the influence function
+- attenuation and strength split into black and white in influence.c
+- new semantics for E class patterns in influence_callback()
+- new macro ASSERT_ON_BOARD defined in liberty.h
+- assertions added in optics.c, move_reasons.c, owl.c, and reading.c
+- minor revisions of valuation of defense and connect moves
+- bugfix in linear_eye_space()
+- bugfix in attack1()
+- warnings eliminated in main.c
+- workaround in influence.c for bug in main.c
+- bugfix in patterns/patterns.h
+- bugfix in mkpat for dfa
+- tuning
+- owl tuning
+- default owl_node_limit increased to 600
+- revisions of golife.tst, ld_owl.tst, and ld_owl_rot.tst
+- doc revisions
+
+2.7.201 released December 8, 2000
+
+- interface/interface.c removed from the distribution
+- legal(), suicide() and self_atari() renamed is_legal() etc.
+- New API function: gnugo_is_suicide.
+- interface/interface.c removed
+- playing options quiet is now a global variable
+- A number of FIXMEs addressed
+- bugfix in linear_eye_space
+- minor revision of komoku.sgf and hoshi.sgf
+- minor tuning
+- unnecessary NULLs removed in patterns.db
+- doc revision
+
+2.7.200 released November 30, 2000
+
+- serious bugfix in semeai()
+- bugfix in owl.c
+- bugfix in pattern ED58
+- bugfix in fill_liberty()
+- revision of rotated tests
+- new file regression/games/me.tst and 3 new strategy2 tests
+- test results updated
+
+2.7.199 released November 29, 2000
+
+- color support test restored to 2.7.193 condition in configure.in
+- missing doc/api.texi replaced
+- analyze_semeai is not called if an owl_substantial worm is en prise
+- minor tuning
+
+2.7.198 released November 28, 2000
+
+- bugfixes in owl.c
+- new patterns in eyes.db
+- tuning
+- owl tuning
+- minor revisions in analyze_semeai
+- revised and new regression tests
+- bugfix in dfa.c: gpout was not cleanly reset before synchronization
+- if DFA_SORT is set in new_matchpat then sort patterns before check_pattern
+- new stat functions update_pattern_stats(), display_pattern_stats(), 
+  reset_pattern_stat()
+- dfa_add_pattern is now able to add all transformations into the dfa
+- new functions for dfa_add_pattern: permut() and show_pattern_instance()
+- fixed some bugs in matcher.c, and matchtest.sh
+- removed some unused files.
+- option -tm forces the anchor to be in the center and adds all transformations
+- added little_owl.tst 
+- test results updated
+
+2.7.197 released November 27, 2000
+
+- old code removed from moyo.c
+- sgffile_decidestring() renamed decidestring() etc.
+- owl data structs in owl_attack, etc. made static
+- assertion changed in join_dragons
+- config.h included in interface.c and main.c
+- revisions to owl_analyze_semeai
+- show_dragons() lists worm lunches
+- assertion corrected in join_dragons()
+- new function find_more_owl_attack_and_defense_moves() in move_reasons.c
+- strategically_sound_defense() reimplemented
+- tuning
+- owl tuning
+- new file regression/READING reviewing failed reading tests
+- new tests in reading.tst and ld_owl.tst
+- new game records
+- test results updated
+
+2.7.196 released November 23, 2000
+
+- old definition of inessential worms restored
+- minor revision of owl_analyze_semeai
+- Small rearrangements in board.c
+- init_board() renamed to clear_board()
+- Some comments and rearrangements in gnugo.h
+- major cleanup in hash.h and hash.c
+- old definition of inessential worms restored
+- #include <config.h> restored in play_ascii.c, play_gtp.c and hash.c
+- new function owl_update_goal()
+- revisions of owl_does_defend(), owl_does_attack(),
+  owl_connection_defends(), and owl_threaten_defense()
+- bugfix in owl_threaten_attack()
+- doc revision
+
+2.7.195 released November 19, 2000
+
+- owl_analyze_semeai() complete (though still very buggy)
+- struct local_owl_data now has a color field
+- owl_find_lunches no longer has color parameter
+- two missing sgf files restored
+- config.h included again in matchpat.c and analyze.c
+
+2.7.194 released November 18, 2000
+
+- continued localization of owl
+- new struct local_owl_data for passing goal, boundary and lunches
+- new functions owl_update_boundary_marks() and owl_make_domains()
+- new function owl_topological_eye()
+- name restored in autohelper macro owl_topological_eye
+- get_coordinate globalized and moved to printutils.c
+- new --decidesemeai option
+- new function owl_analyze_semeai()
+- Removed all unnecessary inclusion of config.h
+- cleanup of worm.c
+- Error handing in main.c: get_coordinate()
+- shuffling of main.c
+- inclusion of cache.h removed from board.c
+- definition of inessential worms changed
+- dragons classified CRITICAL when owl_attack() and owl_defend() disagree
+- join_dragons() revised to choose origin consistently within dragons
+- dragon_ring() and dragon_eye() cleaned up and revised
+- clear_move_reasons() moved from genmove() to reset_engine()
+- revised and extended debug output from influence.c
+- strategically_sound_defense() revised
+- valuation of inessential dragons corrected
+- the owl code doesn't consider escape on the first move
+- filter out vital defense moves which are self ataris in owl_determine_eye()
+- bugfix in owl_shapes
+- bugfixes in owl_substantial()
+- attack2() revised
+- new function special_attack4() in reading.c
+- move ordering retuned
+- safe_move() again changed to return 3 for illegal ko captures
+- bugfix in shapes_callback()
+- gtp_loadsgf() now also calls reset_engine()
+- cut_connect_callback revised to deal with join_dragons() changes
+- tuning of barriers.db, influence.db, conn.db, and eyes.db
+- tuning
+- owl tuning
+- revision of joseki values
+- new game records and test cases
+- regression/STRATEGY revised
+- mkpat and mkeyes tolerate "\r" for Windows compatibility
+- Mingw32 and VC++ compatibility changes in configure.in and debugboard
+
+2.7.193 released November 14, 2000
+
+- owl_topological_eye autohelper macro replaced by topological_eye
+- owl goals and boundaries systematically localized
+- global owl_goal_color removed
+- now O patterns accept critical friendlies if * rescues tactically
+- matcher_status used in print_ascii_area (moyo.c)
+- new function matcher_status()
+- ascii mode save command fixed
+- fixme's addressed in play_ascii.c
+- tuning
+- two ld*sgf files had gotten overwritten by rotated versions--fixed
+- revision of test results
+
+2.7.192 released November 12, 2000
+
+- new on board assertions in move_reasons.c
+- increased safety value for strongly alive dragons
+- territory changes are counted for owl attacks and defenses
+- influence changes are counted for semeai moves
+- reverse followup values can never more than double the move value
+- bugfix in liberty_of_dragon(), check that vertex is empty
+- somewhere() function and corresponding autohelpers require that
+  found stone does not have status dead
+- play_attack and play_defend autohelpers return ko results
+- tuning of barriers.db, conn.db, endgame.db
+- owl tuning
+- tuning of patterns.db and patterns2.db
+- double_does_break_helper and wide_break_helper replaced by constraints
+- new helpers edge_double_sente_helper and defend_against_atari_helper
+- new autohelper defend_against_atari
+- new target all_batches in regression/Makefile.am
+- revision of rotated testsuite
+- updating of test results
+
+2.7.191 released November 10, 2000
+
+- bug fix in update_liberties: k<MAX_LIBERTIES
+- bug fix in owl_mark_boundary: don't look for neighbors if dragon.id == -1
+- bug fix in owl_does_attack: omit marking goal string
+- bug fix in semeai.c: several bj's should have been bi's
+- pattern ED70 taken down
+- bugfix in sgfgen
+- suppress owl traces during estimate_territorial_value()
+
+2.7.190 released November 7, 2000
+
+- effective_size reduced
+- minor revision of connection value
+- bug fixes in obvious_false_eye, do_owl_attack and do_owl_defend.
+- bug fixes in find_superstring_recurse and find_superstring_recurse
+- attack4 is more careful about ko
+- removed the copy of dfa.c from new_matchpat.c
+- new function dfa_add_pattern
+- 2 new helpers for dfa_add_pattern: range_check_ok &  show_pattern_instance
+- removed dead code from mkpat.c
+- testsuite revisions
+- tuning
+
+2.7.189 released November 4, 2000 
+
+- atari_atari tries to find irreducible combinations
+- loop ununrolled in do_atari_atari()
+- depths increased during atari_atari to avoid horizon effect
+- improved traces during atari_atari
+- joseki patterns do not have strategic attack bonus
+- joseki patterns have cap on valuation
+- dead code in influence.c removed
+- backfill2_depth in modify_depth_values(), etc.
+- autohelper functions revised to use matcher_status instead of status
+- owl reasons consults matcher status, taking semeai() into account
+- subtract one point from move value for a sacrifice play
+- tuning 
+- owl tuning
+- 'A' comment field in joseki db no longer case sensitive
+- new tests and game records
+
+2.7.188 released November 1, 2000
+
+- doc revisions
+- include gg_utils.h rather than gg_utils.c in analyze.c
+- new parameter stop_before_owl for make_dragons()
+- new target EXAMINE_DRAGONS_WITHOUT_OWL for examine_position()
+- matcher_status printed by show_dragons()
+- dragon_escape() revised
+- safe_move() calls in filllib.c reviewed
+- unnecessary line removed from incremental_remove_string()
+- temporary reduction of depth values during influence computation
+  disabled
+- obvious_false_eye() made public
+- semeai threat move reasons listed by list_move_reasons()
+- more move valuation details when using DEBUG_MOVE_REASONS debug bit
+- bug fixes in move valuation to avoid points being counted multiple
+  times for the same stones when they are defended or attacked
+  according to multiple sources (tactical reading, owl, semeai)
+- new function move_connects_strings() in move_reasons.c
+- shape bonus added for moves which connect multiple strings
+- revised set of function calls disabled by 'urgent' variable
+- do_owl_attack and do_owl_defend also try tactical attack/defense
+  moves
+- code simplification in do_owl_attack
+- DEBUG_OWL_PERFORMANCE traces added in owl_threaten_attack() and
+  owl_threaten_defense()
+- goal propagation in do_owl_defend() revised
+- owl_determine_life() revised
+- avoid unnecessary reading in owl_shapes_callback()
+- owl_mark_boundary() revised
+- FIXME added in owl_does_attack()
+- new static function one_two_point() in owl.c
+- sniff_lunch() revised
+- bugfixes in owl_escape_value()
+- atari_atari() revised
+- new function find_superstring() in utils.c
+- bugfix in examine_cavity() and examine_cavity_recurse()
+- a number of stackp==0 assertions added in worm.c and semeai.c
+- semantics of GTP command eval_eye changed
+- three new patterns in conn.db
+- new helper threaten_to_capture_helper()
+- new autohelper functions threaten_to_capture, obvious_false_oeye,
+  and obvious_false_xeye
+- komoku joseki revisions
+- tuning and owl tuning
+- comment added in regressions/STRATEGY
+- owl, ld_owl, strategy, and reading test suites revised and/or extended
+
+2.7.187 released October 31, 2000
+
+- bugfix in owl_reasons: do not pass PASS as a move reason
+- bugfix in small_semeai: missing popgo()
+- bugfix in pattern ED62: move could be off board
+- bugfix in make_dragons: typo for second_defendj
+- sethand.c removed
+- recordhand() renamed to sgffile_recordboard
+- sethand() removed.
+- placehand() moved to genmove.c
+- ON_BOARD assertions added in move_reasons.c
+- FIXME in analyze.c removed
+- initialize_engine() renamed reset_engine()
+- Reset verbose to correct value in examine_position()
+- description of change_dragon_status fixed.
+- doc revision
+- regress.awk tries to spot core dumps
+
+2.7.186 released October 28, 2000
+
+- tuning
+- we try to add only legal owl threat move reasons
+- bugfix: pattern 't' attribute was incompletely implemented
+- doc revision
+- fixed a compilation warning in new_matchpat.c
+- added an option -t to mkpat
+
+2.7.185 released October 28, 2000
+
+- white/black_points parameters split in evaluate_territory()
+- tuning
+- owl tuning
+- implementation supplied for owl_does_attack
+- trace level reduced when atari_atari runs
+- allpats overrides normal shortcuts when an urgent move is on the board
+- missing files restored in minipat2/
+- material added to and joice respelled in minipat2/README
+- revision of rotated tests
+
+2.7.184 released October 25, 2000
+
+- bugfix in owl_substantial: remember that owl_goal_color is global
+- but patterns/dfa.c is in EXTRADIST
+- configure works with or without --enable-dfa to create alternative versions
+- rotated patterns included for tests *
+- updated test results
+
+2.7.183 released October 24, 2000
+
+- new module atari_atari with global variable aa_depth
+- new atari_atari move reasons
+- new autohelper function has_aji()
+- value of move in empty corner reduced from 40 to 27
+- new owl function owl_substantial
+- owl_mark_boundary() split off from owl_mark_goal()
+- new function neighbor_of(), a frontend for incremental_neighbor_of()
+- tuning
+- minor owl tuning
+- safe_move() returns 0 in case of an illegal ko capture (as before 2.7.180)
+- use AC_SEARCH_LIBS to add -lm only when needed
+- curses test is moved outside the enable_color to accomodate debugboard
+- adds test for KEY_UP to the curses configuration
+- adjust interface/debugboard/main.c if KEY_UP unavailable
+- use AC_SEARCH_LIBS for detection of curses and termcap library
+- use AC_CACHE_CHECK macro for __function__ and KEY_UP detection
+- dfa.c and dfa.h are now in patterns/ not patterns/minipat2/
+- new_mkpat adds a dfa_t pointer when DFA_ENABLE is set to 1.
+- load_dfa(file_name, NULL) can return pointers to dfa_t struct
+- dfa compiles with less errors when -Wall
+- made more dfa functions static
+- new tests and game records
+
+2.7.182 released October 19, 2000
+
+- new move reason OWL_PREVENT_THREAT
+- attacking a dragon that can threaten life gets a small value
+- bugfix in recognize_eye
+- bugfix in "threat" move valuations: max should be min
+- init_gnugo() moved from board.c to interface.c
+- new tests and game files
+
+2.7.181 released October 18, 2000
+
+- bugfix in owl_attack: ko dealt with if original goal stone captured
+- matcher_status replaces dragon.status in examine_move_safety DEFEND case
+- extra newlines eliminated in traces in find_more_attack_and_defense_moves()
+- new tests
+
+2.7.180 released October 16, 2000
+
+- semeai_analyzer no longer called with tactically dead dragons
+- semeai_analyzer now called with owl critical dragons
+- new global variabls owl_distrust_depth and backfill2_depth
+- new static owl functions owl_add_move() and obvious_false_eye()
+- revision of sniff_lunch
+- vital_chain() moved to owl.c
+- separate move reasons for both dragons in semeai
+- new function add_semeai_threat()
+- semeais no longer enumerated for move reasons
+- owl tuning
+- eye tuning and revision of eyes.db
+- bugfix in owl_defendpat D51
+- revisions of most reading functions
+- break_chain_new() renamed break_chain_moves()
+- edge_attack() and edge_defend() unified in edge_attack_defend()
+- break_chain() removed
+- new function compute_eyes_pessimistic
+- looks for positions where eye code
+- evaluate_diagonal_intersections() takes new parameters (i,j)
+- MAX_LUNCHES increased to 10
+- option --enable-dfa sets DFA_ENABLED equal to 1
+- minor tuning
+- calls to TRACE made DEBUG in life.c
+- revision of STRATEGY
+- revision of minipat2/ (has own ChangeLog)
+- changes to config.vcin
+- changes to configure.in and gg_utils.in to make clean mingw build
+
+2.7.179 released October 12, 2000
+
+- node limits revised in initialize_engine()
+- traces corrected for owl threat reasons
+- bonus for owl threat move (not ko threat) reduced to 3 points
+- revision of patterns/minipat2/ (has own ChangeLog)
+- minor tuning
+- regression/REVIEW renamed STRATEGY and completed
+- new owl tests
+- test results updated
+
+2.7.178 released October 10, 2000
+
+- new global variables urgent and kothreat_needed
+- if a ko threat seems needed, GNU Go tries to make one
+- moves that threatens to kill or live are tried near end of game
+- if an urgent joseki move is found, some code is not executed
+- new dragon fields owl_threat_status, owl_second_attack, owl_second_defend
+- new functions owl_threaten_defense() and owl_threaten_attack()
+- new function look_for_kos()
+- tuning
+- new file regression/REVIEW
+
+2.7.177 released October 7, 2000
+
+- experimental directory patterns/minipat2
+- bugfixes and indentation fixups in owl.c
+- one new eye pattern
+- owl tuning
+- cleaning of some regression game records
+- new and revised regression tests
+- release date for 2.7.172 corrected in ChangeLog
+- Makefile.bump removed from distribution
+
+2.7.176 released October 6, 2000
+
+- modify_eye_spaces() replaces modify_eye_spaces1() and 2()
+- minor cleanup in optics.c
+- new eye pattern and cleanup in eyes.db
+- tuning
+- owl tuning
+
+2.7.175 released October 6, 2000
+
+- if configure --enable-dfa then new_matchpat.c replaces matchpat.c
+- tuning
+- owl tuning
+- only count trymove when we do create a new position
+- liberty_of() made incremental
+- singleton() replaced by countstone() calls
+- matchpat.c and new_matchpat.c: CRITICAL added to class masks
+- reformatting in new_patchpat.c and semeai.c
+- two new eye patterns
+- preliminary garbage taken out of .sgf files
+- ad hoc code in worm.c replaced by call to liberty_of()
+- gtp can set komi
+- new tests, including rotated versions of some old ones
+
+2.7.174 released October 3, 2000
+
+- tuning
+- owl tuning
+- new patterns and regressions
+- in somewhere() move_num replaced by move_num-1
+- bugfix in o_somewhere autohelper
+- revised handling of labels in joseki.c
+- strategy.tst split in two
+- proposed replacement engine/new_matchpat.c for matchpat.c 
+- in new_matchpat new function check_pattern() split from do_matchpat()
+- in new_matchpat arrays and_mask,val_mask and class_mask moved
+- new tests and game records
+- doc revision
+- fixme's updated and classified
+- THANKS revised
+
+2.7.173 released September 30, 2000
+
+- bugfix in attack1()
+- bugfix in semeai.c: dragon data updated correctly
+- revision of whose_moyo_restricted()
+- backfill depth increased to 12
+- value_moves() visits moves in standard lexicographical order
+- tuning
+- owl tuning
+- new game records and tests
+
+2.7.172 released September 27, 2000
+
+- new joseki classification t, some patterns downgraded
+- new chainlinks2(), draw_back(), special_attack3() break_chain_new()
+- calling convention for find_cap2() changed
+- edge_defend() returns untested candidate moves
+- break_chain() no longer returns which link was captured
+- edge_attack() now takes ko results into account
+- find_cap3() generalized
+- chain breaking moves and liberties are ordered in defensive functions
+- chain breaking moves, liberties and backfills ordered in attack2()
+- defense functions made more uniform
+- backfills tested in defend2()
+- code reshuffled in attack3()
+- order_moves() revised
+- backfill_depth increased to 10
+- reading_node_counter not incremented by break_chain() and relatives
+- new GTP command tune_move_ordering can set order_moves() parameters
+- new tests and game records
+- doc revision
+- typedef of row_of_eye_data moved to liberty.h
+
+2.7.171 [NOT RELEASED]
+
+2.7.170 released September 24, 2000
+
+- minor doc revision
+- bugfix in estimate_strategical_value()
+- reading code revisions for improved performance
+- do_find_defense() added to hash defaults
+- a few double kakari variations added to hoshi.sgf
+- tuning
+- joseki values promoted somewhat
+- new game record regression/games/reading10.sgf
+- one new test case in reading.tst
+- owl tests 122 and 123 include move number
+- neurogo.tst extended
+
+2.7.169 released September 22, 2000
+
+- modification to whose_moyo_restricted made default (still overrideable)
+- owl_attack tries defending lunch
+- owl node limit cut from 1000 to 500
+- new autohelper functions x_somewhere and o_somewhere
+- new function somewhere()
+- tuning
+- owl tuning
+- new test regression/neurogo.tst
+- dragon_invincible modified for portability
+- vgprintf calls replaced by fgprintf in printutils.c
+- on board assertion in owl_lively
+- colored dragon and owl display revamped
+- option --statistics works again.
+- cleanup of globals.c
+- gnugo.h checked for unused declarations
+- renumbering of hash bits
+- doc revision
+
+2.7.168 released September 20, 2000
+
+- if file "hurry" found on disk, hurry is read from it each move
+- new function get_hurry()
+- bugfix in examine_move_safety()
+- bugfix in compute_primary_domains()
+- minor tuning
+- new file regression/games/FSF-neurogo.sgf
+
+2.7.167 released September 19, 2000
+
+- reading code speedup
+- modification to whose_moyo_restricted contingent on --inhibit option
+- minor joseki variations (j classification) promoted to value 20
+- reviewing move reasons contingent on -w
+- trace format slightly more compact
+- minor change in hoshi.sgf
+- tuning
+- revision of test strategy 51 and new strategy test 79
+- UNUSED defined in utils/gg_utils.c
+
+2.7.166 released September 18, 2000
+
+- revised computation of size of moyo surrounding a dragon
+- improved workaround in induce_secondary_move_reasons()
+- examine_move_safety() made more accurate
+- move valuation improvements
+- owl_reasons() avoids adding owl attack reasons against nakade stones
+- owl_reasons() defends before attacking when there's a semeai
+- improved handling of ko attack codes in worm.c
+- new anchoring option in mkpat.c
+- bugfix in pattern matching of attack and defense patterns
+- tuning
+- new game record and regression tests
+- doc revision
+
+2.7.165 released September 14, 2000
+
+- semeai() updates matcher_status for unfriendly dragons alive by semeai
+- revised computation of size of moyo surrounding a dragon
+- tuning
+- owl tuning
+- new files in regression/games (strategy18, 19, 20 and owl11)
+- new and revised test cases in owl.tst and strategy.tst
+- configure test for availability of usleep()
+- select() replaces missing ment for usleep() in debugboard/main.c
+- embedded newlines in patterns/transpat.c replaced by explicit \n
+- explicit (int) casts to arguments of toupper and tolower
+
+2.7.164 released September 11, 2000
+
+- edge patterns in patterns.db and patterns2.db rotated to standard position
+- bugfix in move_reasons.c: too many dragon connections
+- dead code removed from dragon.c
+- PL[W] added to regression/games/owl10.sgf
+- location_set.* removed from engine/
+- target transpat is now EXTRA
+- doc revision
+
+2.7.163 released September 6, 2000
+
+- mouse code is renamed owl
+- new target transpat in patterns/
+- new files patlib.c, patlib.h and transpat.c
+- default cache size reduced to 16 M
+- owl_node_limit reduced from 10000 to 1000
+- new configure options --enable-large-model and --enable-small-model
+- Changelog entry for 2.7.162 added
+- ko result macros moved from reading.c to cache.c
+- ko handling in mouse.c simplified and made more strict
+- portability fix in hash.c, ULL suffix removed from small constants
+- doc revision
+- THANKS revised
+
+2.7.162 released September 5, 2000
+
+- minor change to hoshi.sgf
+- mouse code is somewhat ko aware
+- tuning
+- mouse tuning
+- new tests
+- new autohelper functions legal_xmove and legal_omove
+- AUTHORS and THANKS revised
+
+2.7.161 released September 1, 2000
+
+- mouse tuning
+
+2.7.160 released August 31, 2000
+
+- one new pattern in mouse_defendpats.db
+- hoshi.sgf revised
+- improved ko awareness in reading.c
+- loop ununrolled in attack2()
+- SGFTRACE calls added to break_chain(), break_chain2(), break_chain3(),
+  and relative_break_chain()
+- reading functions consistently return an illegal ko capture rather than
+  pass if it is the best way to win
+- bugfix in gtp_genmove_black() and gtp_genmove_white()
+- new files reading08.sgf and reading09.sgf in regression/games/
+- new reading tests
+
+2.7.159 released August 30, 2000
+
+- mouse tuning
+- tuning
+- new files jahy.sgf and reading07.sgf in regression/games/
+- new tests
+- Wolfgang Manner's hoshi.sgf
+- missing include added to cache.c
+- fuseki database turned on by default; option --fusekidb replaced by
+  option --nofusekidb
+- new option --nojosekidb to turn off joseki database
+- simplified code in defend1() and defend2()
+- new macros UPDATE_SAVED_KO_RESULT() and
+  UPDATE_SAVED_KO_RESULT_UNREVERSED() in reading.c to simplify keeping
+  track of moves leading to ko
+- better handling of ko results in various reading.c functions
+
+2.7.158 released August 27, 2000
+
+- tuning
+- cleanup of patterns.db and patterns2.db
+- mouse tuning
+- new files regression/games/mouse08.sgf and mouse09.sgf
+- new mouse tests
+
+2.7.157 released August 25, 2000
+
+- tuning
+- minor mouse tuning
+- revised awards for J and j patterns
+- new files reading06.sgf, mouse07.sgf, strategy14.sgf, strategy15.sgf,
+  and strategy16.sgf in regression/games/
+- new test cases
+- removed vitality report from debugboard gui
+- minor doc revision
+- keep track of lively dragons in dragon.c
+- bugfix in influence_callback()
+- bugfix in analyze_semeai()
+- dead code removed from helpers.c
+- new helper: reinforce_helper
+
+2.7.156 released August 23, 2000
+
+- bugfix in compute_primary_domains
+- revision of corner handling in compute_primary_domains 
+- minor deviation from documented algorithm fixed in compute_primary_domains 
+- attack1 returns 2 in case of a legal ko capture
+- cut_connect_callback accepts X stones safe by ko
+- basic_cut_helper accepts X stone safe by ko
+- followup_value and reverse_followup_value are no longer additive
+- unused symbols removed from move_reasons.c
+- tuning
+- new files strategy13.sgf and semeai1.sgf in regression/games/
+- new tests
+- semeai() rewritten for new move valuation scheme
+- semeai() called from make_dragons() rather than from genmove()
+- unused vitality field removed from struct dragon_data
+- attempt to identify inessential dragons
+- gtp commands debug_influence and debug_move_influence give more information
+- function liberty_of_dragon() made static to semeai.c
+- bugfix in mouse_determine_life()
+- strategically_sound_defense() revised
+- bugfix in estimate_strategical_value()
+- more careful handling of ko return codes in do_find_defense() and defend3()
+- defend2() no longer insists in finding best defense
+- regression/regress.awk revised
+       
+2.7.155 released August 21, 2000
+
+- bugfix in init_influence()
+- semicolon added after action lines in pattern database files
+- mkpat no longer adds semicolon after antisuji
+- induce_secondary_move_reasons() revised
+- dragon_safety() rewritten
+- review_move_reasons() lists top ten moves in trace outputs
+- new format %M in vgprintf
+- SGFTRACE calls added after edge_defend() and edge_attack() calls
+
+2.7.154 released August 21, 2000
+
+- new reading functions edge_defend and edge_attack
+- reading code smarter about moves on the first line
+- liberty_of renamed liberty_of_dragon
+- new function liberty_of
+- break_chain2 does not try filling liberties of attacked string
+- revision of order_moves
+- Joseki database turned back on
+- mkpat adds semicolon and newline after antisuji
+- substantial tuning of patterns.db
+- mouse tuning
+- new game regression/games/strategy12.sgf (no tests yet)
+
+2.7.153 released August 13, 2000
+
+- autohelper vitality() removed
+- autohelper weak() revised
+- struct dragon_data field safety renamed old_safety
+- new field invincible in struct worm_data
+- dragon_invincible() in dragon.c implemented
+- worm invincibility and dragon safety printed in show_dragons()
+- dragon safety values revised
+- init_influence() revised
+- connection_value2() in move_reasons.c reimplemented and renamed
+  connection_value()
+- dragon status used instead of dragon safety in showbord.c
+
+2.7.152 released August 10, 2000
+
+- bugfix in defend2()
+- bugfix in tryko()
+- new function sgf_trace() in cache.c and macro SGFTRACE() in cache.h
+- all --decide* options now save sgf trees in memory
+- SGFTRACE() calls in the reading and mouse code
+- bugfix in mouse_determine_life()
+- bugfix in interface/debugboard/main.c
+- bugfix in main.c
+- GTP command loadsgf now returns the color to play
+- new GTP command same_dragon
+- new test suite regression/connection.tst
+- new test cases in reading.tst, mouse.tst, strategy.tst, and nicklas.tst
+- five new game records in regression/games and regression/games/nicklas
+
+2.7.151 released August 9, 2000
+
+- regression framework revised, temporary .gtp and .res files no longer
+  needed
+- cleanup of patterns/patterns.db
+- experimental code for doing sgf dumps of reading variations in memory
+- cleanup of files in sgf/ directory
+- bugfixes in writing of sgf trees to file
+- global variable mouse removed, together with option --nomouse
+- patterns/patterns.c split into patterns/patterns.c and
+  patterns/josekidb.c so that the latter file contains the joseki database
+  files derived from the joseki sgf files
+- bugfix in mouse_defendpats.db
+- one new game record regression/games/reading04.sgf
+- one new test case in reading.tst
+
+2.7.150 released August 7, 2000
+
+- old escape route measure removed, together with option --old_escape
+- new field safety in struct dragon_data2
+- bugfix in influence code, tactically saved stones block influence
+- more restrictive definitions of moyo and area in the influence code
+- new function find_stones_saved_by_move() in move_reasons.c
+- bugfix in make_dragons(), status propagated to all intersections before
+  calling the mouse code
+- tuning
+- mouse tuning
+- several new game records
+- several new test cases in mouse.tst, strategy.tst, and nicklas.tst
+
+2.7.149 released August 3, 2000
+
+- revised handling of shape in move_reasons.c
+- tuning of patterns.db, patterns2.db, barriers.db, conn.db,
+  mouse_defendpats.db, komoku.sgf, mokuhazushi.sgf, and sansan.sgf
+- doc revision
+- goal dragon expanded with the whole string containing a new stone in
+  do_mouse_defend() 
+- new autohelper function mouse_goal_dragon and supporting code in mouse.c
+  and mkpat.c
+
+2.7.148 released August 2, 2000
+
+- tuning
+- influence values reduced
+- friendly influence is valued greater than unfriendly in moyo
+- bugfix in examine_move_safety() in move_reasons.c
+- bugfix in estimate_territorial_value() in move_reasons.c
+- unused sigterm_handler commented out from interface/main.c
+- stricter matching of certain commands in the ascii interface
+- new game records and tests
+
+2.7.147 released July 31, 2000
+
+- domains can no longer leak past a nikken tobi (2 space extension)
+- value used for fuseki database moves increased
+- new option --mouse_node_limit
+- nominal values for mouse reading parameters introduced
+- effects of --hurry option revised
+- the mouse reading is now interrupted when too many nodes have been
+  visited
+- bugfix in territorial valuation of vital eye points
+- bugfix in estimate_strategical_value(), avoid counting the same stones
+  twice
+
+2.7.146 released July 30, 2000
+
+- new move reason: reverse_followup, intended for reverse sente
+- reverse followup value added to a few patterns
+- interface/main.h removed
+- signal handlers made static
+- new tests
+- revised handling of -a option
+- revision of pattern CB207
+- parts of make_dragon() restructured
+- dragon_status() revised
+- escape influence computation revised
+- new field in dragon[][] array, matcher_status
+- matchpat() uses matcher_status
+- revise_semeai() revised to modify matcher_status
+- patterns/influence.db revised
+- new mouse defense patterns
+- tuning of patterns/patterns.db
+
+2.7.145 released July 29, 2000
+
+- TODO revised
+- one pattern revised in patterns/conn.db
+- one pattern revised in patterns/patterns.db
+- 7 new game records in regression/games/
+- 3 new mouse test cases
+- 20 new strategy test cases
+
+2.7.144 released July 28, 2000
+
+- new counter for number of trymoves/trykos similar to
+  reading_node_counter et al
+- new GTP commands clear_trymove_counter and get_trymove_counter
+- Tests for life and strategy enhanced with trymove_counter
+- goal functions attack(), find_defense(), attack_either(), defend_both(),
+  and break_through() collected together in reading.c
+- reading_node_counter incremented also in the break chain functions
+- doc/patterns.texi, doc/reading.texi, and doc/using.texi revised
+- territorial valuation of vital moves revised
+- bugfix in mkpat.c
+
+2.7.143 released July 27, 2000
+
+- regression/regress.awk and regression/eval.sh revised
+- reordering of some code in attack2 and attack3
+- fixmes addressed in reading.c
+- new reading functions find_cap3 and break_chain3
+- sgf variation count shifted in trymove
+- new file regression/games/net3
+- net3 regressions
+- N1 accepted for reading test 29
+- printing functions split off from utils.c to new file printutils.c
+- sgffile_decide* functions split off from sgffile.c to new file sgfdecide.c
+- new library libboard.a built in engine/
+- patterns/joseki.c rewritten from scratch
+- joseki database file patterns/*.sgf revised for new joseki compiler
+- show_dragons() revised to also show moyo and neighbor info
+- order_moves() revised
+- new joseki pattern classes added in patterns/patterns.h
+- shapes_callback() revised to deal with new joseki pattern classes
+
+2.7.142 released July 26, 2000
+
+- linker option -lm moved from various Makefile.am to configure.in
+- new variable branch_depth, defaulting to 13
+- default depth value increased from 14 to 16
+- defend3(), defend4(), attack3(), and attack4() revised to use
+  branch_depth
+- new option --branch_depth
+- one new pattern in patterns2.db
+- new file regression/games/strategy3.sgf
+- one new test case in regression/strategy.tst
+- new test suite regression/nicklas.tst
+- 7 new files regression/games/nicklas/nicklas*.sgf
+- new GTP command gg_genmove
+- contribution of randomness in move_reasons.c revised
+- one new pattern in conn.db
+
+2.7.141 released July 26, 2000
+
+- hash.h and hash.c split into hash.h/cache.h and hash.c/cache.c
+- common reading cache code in reading.c and mouse.c moved to
+  cache.c/cache.h
+- new functions reading_cache_init() and reading_cache_cleared() in
+  cache.c 
+- movehash variable no longer global
+- configure option --disable-hashing removed together with HASHING
+  preprocessor constant
+- double_atari_chain2() made static to reading.c
+- ATTACK() and DEFEND() macros in patterns/patterns.h renamed to avoid
+  name collision
+- pow() used to compute effect of shape value in move_reasons.c
+- optics.c now includes eyes.h rather than eyes.c
+- mkeyes.c revised to finish the graphs array with an all-zero entry
+- changed order in top level Makefile.am; engine is now compiled before
+  patterns
+- extract_fuseki program bugfixed and once more compiled by default
+- regress.awk and eval.sh in regression/ revised to deal with negated
+  tests 
+- new file regression/games/strategy2.sgf
+- three new tests in regression/strategy.tst
+
+2.7.140 released July 25, 2000
+
+- sniff_lunch() made static to mouse.c
+- private half_eye array for the mouse code
+- several functions take half_eye data as a parameter
+- regression/strategy.tst included for real
+
+2.7.139 released July 25, 2000
+
+- cleanup of reading.c
+- minor tuning
+- effective_size only looks to distance <= 3
+- debugboard displays dragon.safety as a string
+- new files regression/strategy.tst and regression/games/strategy1.sgf
+- doc revision
+- mouse code enabled by default
+- --mouse option replaced by --nomouse option
+- alternative escape route algorithm enabled by default
+- --alternative_escape option replaced by --old_escape option
+- obsolete option --style removed
+- new field moyo in struct dragon_data2
+- new function influence_get_moyo_size() in influence.c
+
+2.7.138 released July 21, 2000
+
+- bugfix in regression/regress.sh, VPATH build was broken
+- new function special_attack2() containing code broken out of attack2()
+- new function special_rescue2() containing code broken out of defend2()
+- more functions use order_moves()
+- all reading functions use the same parameter names (attacked/defended
+  string is (si, sj)). 
+- new debug bit DEBUG_MOUSE_PERFORMANCE
+- new debug outputs in mouse.c
+- bugfix in mouse_does_defend() and mouse_connection_defends()
+- new struct dragon_data2 in liberty.h
+- new static function compute_supplementary_dragon_data() in dragon.c
+
+2.7.137 released July 19, 2000
+
+- new file regression/regress.awk
+- regression/regress.sh revised
+- wrapper functions gg_vwprintw() and gg_wprintw() introduced in
+  interface/debugboard/ files
+- order_moves() in reading.c partially reimplemented
+- new function gtp_decode_color() in interface/gtp.c
+- new GTP commands boardsize, is_legal, all_legal, prisoners
+- new function position_force_to_globals() in engine/interface.c
+- gameinfo no longer used by the GTP functions
+- movenum updated by board functions
+
+2.7.136 released July 17, 2000
+
+- enhancement in ladder reading in attack2()
+- cleanup of half of reading.c
+- do_find_defense() and do_attack() now static
+- more logical numbering of the reading functions for hashing
+- new function order_moves() in reading.c
+- function order3() removed from reading.c
+- dead code (old versions of special_rescue()) removed from reading.c
+- defend2(), defend3(), and defend4() track break_chain save_codes
+- mouse pattern D13 devalued
+
+2.7.135 released July 17, 2000
+
+- statistics functions reset_reading_node_counter() and
+  get_reading_node_counter() in reading.c
+- corresponding new GTP commands reset_reading_node_counter and
+  get_reading_node_counter 
+- all regression test files report the total number of nodes visited by
+  the tactical reading 
+- corrected answers to two test cases in regression/mouse.tst
+
+2.7.134 released July 17, 2000
+
+- debug bits renumbered
+- doc/using.texi updated
+- tweaking of influence function for escape value computation
+- debug and trace outputs in mouse.c revised
+- debug outputs revised in reading.c
+- new pattern classification e in influence.db for patterns which get an
+  increased value during computation of escape influence
+- mouse tuning
+- tuning of patterns2.db
+- new files incident267.sgf, incident269.sgf, incident272.sgf,
+  incident278.sgf, and incident287.sgf in regression/games/
+- two new tests in regression/mouse.tst
+- three new tests in regression/reading.tst
+- bugfix in regression/eval.sh and regression/regress.sh
+
+2.7.133 released July 13, 2000
+
+- mouse tuning
+- improved trace messages in do_mouse_attack() and do_mouse_defend()
+- mouse_find_lunches() simplified
+- -lm added to LDADD in interface/Makefile.am
+- tuning of patterns.db
+- new file regression/games/incident263.sgf
+- five new test in regression/mouse.tst
+
+2.7.132 released July 12, 2000
+
+- interface/loadsgffile.c removed
+- library interface/libinterface.a removed
+- sgf/sgfkey.c and sgf/sgfkey.h removed
+- globals sgf_root and lastnode removed
+- new datatype: SGFTree
+- many sgfXXX functions now have their sgftreeXXX counterpart
+- sgf/ttsgf.h renamed to sgf/sgftree.h
+- sgf/ttsgf.c renamed to sgf/sgfnode.c
+- sgf/sgfana.h moved to engine/analyze.h
+- sgf/sgfana.c moved to engine/analyze.c
+- new file: sgf/sgftree.c
+- new file: engine/sgfutils.c
+
+2.7.131 released July 12, 2000
+
+- references to the escape2 field of struct dragon_data removed from
+  interface/debugboard/gui.c
+- new variables mouse_branch_depth and mouse_reading_depth
+- new options --mouse_branch and --mouse_reading
+- mouse reads only one node when stackp>mouse_branch_depth
+- reading terminates when stackp>mouse_reading_depth
+- doc revision
+- revised dragon_escape() to allow kosumi directly from dragon
+- revised effect of I class influence patterns when computing escape
+  influence 
+- find_influence_patterns() add influence barriers "manually" when
+  computing escape influence
+- dragon under consideration is now allowed to contribute influence during
+  computation of escape influence
+- mouse_find_lunches() made static to mouse.c
+- new autohelper function mouse_escape_value
+- 7 new patterns in mouse_defendpats.db, aiming at escape
+- new function mouse_connection_defends() in mouse.c
+- code revised in do_mouse_attack(), do_mouse_defend(), and
+  mouse_mark_dragon() 
+- mouse_mark_dragon now can take either one or two dragons
+- bugfix in do_mouse_attack(), two loop end conditions were off by one
+- bugfix in do_mouse_attack() and do_mouse_defend(), the second most
+  important move was removed when pattern of value 99 found, but not third
+  most important one
+- move_safety field of move_data struct initialized correctly in
+  move_reasons.c
+- examine_move_safety() revised
+- order of examine_move_safety() and induce_secondary_move_reasons() calls
+  reversed in review_move_reasons()
+- same_dragon() in utils.c revised to be able to deal with the "no dragon"
+  case, i.e. (-1, -1) coordinates
+- effective_move measure revised to never include intersections further
+  away than distance 4
+
+2.7.130 released July 11, 2000
+
+- escape2 field removed from dragon_data struct together with code to
+  compute it
+- patterns/escape.db removed
+- mouse status and if applicable attack and defense points printed by
+  show_dragons()
+- bugfix in compute_escape_influence() in influence.c
+- revised debug and trace messages in mouse.c
+- new function examine_move_safety() in move_reasons.c
+- strategically_sound_defense() revised
+- more restrictions on which move reasons induce a block/expand move reason
+
+2.7.129 released July 9, 2000
+
+- redundant assignments removed from mouse.c
+- reading cache cleared after examine_position() call in
+  sgffile_decidedragon() and sgffile_decideposition()
+- new file regression/games/incident262.sgf
+
+2.7.128 released July 8, 2000
+
+- obsolete declarations of black_domain and white_domain removed from
+  liberty.h 
+- dragon_escape() and compute_alternative_escape() in dragon.c revised
+- new function compute_escape_influence() in influence.c
+- new static functions compute_mouse_escape_values() and
+  mouse_escape_route() in mouse.c
+- if --alternative_escape option enabled, do_mouse_attack() and
+  do_mouse_defend() cut off reading if mouse_escape_route() report a
+  sufficiently high escape potential
+- redundant file interface/debugboard/loadsgffile.c really removed
+- removed remaining occurences of return code 2 in do_mouse_attack() and
+  do_mouse_defend()
+- new lunch pattern in patterns/conn.db
+
+2.7.127 released July 6, 2000
+
+- redundant file interface/debugboard/loadsgffile.c removed
+- parts of interface/play_solo.c moved into new file
+  interface/loadsgffile.c
+- new library interface/libinterface.a for use by interface/debugboard
+- new files sgf/sgfkey.c and sgf/sgfkey.h to handle new abstract type
+  sgfkey 
+- find_border() renamed to examine_cavity() in worm.c
+- static functions propagate_worm_recursive() and libertiesrec() removed
+  from worm.c
+- code in worm.c simplified and cleaned up
+- dragon genus initialized in make_dragons() instead of in make_worms()
+- new static functions dragon_escape() and compute_alternative_escape()
+  in dragon.c
+- new option --alternative_escape to enable new escape route measure
+- new file /regression/games/incident261.sgf
+- one new test in regression/mouse.tst
+
+2.7.126 released July 5, 2000
+
+- change in definition to higher order liberties
+
+2.7.125 released July 4, 2000
+
+- statistics functions reset_mouse_node_counter() and
+  get_mouse_node_counter() in mouse.c
+- corresponding new GTP commands reset_mouse_node_counter and
+  get_mouse_node_counter 
+- mouse.tst, ld_mouse.tst, and ld_mouse_life.tst reports the total number of
+  nodes visited by the mouse reading
+- bugfix in mouse_determine_life(), attack and defense points for lunches
+  were switched
+- constraints in some mouse patterns reordered for better performance
+- new files incident256.sgf and incident 258.sgf in regression/games
+- four new tests in regression/mouse.tst
+
+2.7.124 released July 1, 2000
+
+- tuning of mouse_defendpats.db
+- new files incident253.sgf and incident254.sgf in regression/games/
+- two new tests in regression/mouse.tst
+- restructured and corrected coordinate conversion code in play_ascii.c
+
+2.7.123 released June 27, 2000
+
+- one new pattern in mouse_attackpats.db
+- new file regression/games/life_and_death/ld18.sgf
+- two new test cases in regression/ld*.tst
+- bugfixes in life.c
+- new GTP commands debug_move_influence, influence, move_influence,
+  worm_data, and dragon_data
+- new function gtp_mprintf() in interface/gtp.c
+- new functions in influence.c to export influence data
+
+2.7.122 released June 22, 2000
+
+- partial implementation of debugboard eyes tab
+- black_domain[][] and white_domain[][] now static in optics.c
+- make_domains() restructured
+- xor() and unique_color() macros removed from showbord.c
+- support for boards smaller than 19x19 in debugboard
+- worm[][].attacki comparisons with -1 replaced everywhere with
+  comparisons of worm[][].attack_code with 0
+- likewise for worm[][].defendi and worm[][].defend_code
+- doc/dragon.texi revised
+- new GTP command debug_influence
+- code for debug printing restructured in influence.c
+
+2.7.121 released June 20, 2000
+
+- mouse option automatically enabled with decidedragon and decideposition
+  options 
+- matchpat() uses mouse status if available
+- new file regression/games/incident252.sgf
+- one new reading test
+
+2.7.120 released June 17, 2000
+
+- mouse lunches must have attack code 1
+- bugfix in tryko sgf output
+- many reading functions take komaster argument
+- many reading functions made static
+- new functions do_attack and do_find_defense (with komaster)
+- cleanup in reading.c
+- doc revision
+- pattern Eye1 in conn.db taken out
+
+2.7.119 released June 16, 2000
+
+- new function gg_vsnprintf in gg_utils.c
+- check in configure.in for vwprintf
+- gg_vsnprintf used as workaround if vwprintf unavailable
+- fcntl/read stuff removed from debugboard
+- display_board_cursor() call added at the end of display_refresh()
+- leaveok() call removed from display_init()
+- debugboard cursor can be controlled by arrow keys
+- COLOR_* renamed to GG_COLOR_* to avoid name collision when using
+  pdcurses
+- new file regression/games/life_and_death/ld17.sgf and new ld* test cases
+- non-options treated as filenames
+- new format strings %H and %C to vgprintf() and relatives
+- trymove() and tryko() write hash value together with node number to
+  output sgf file
+- new files incident248.sgf and incident251.sgf in regression/games
+- decideeye() moved from utils.c to sgffile.c and renamed
+  sgffile_decideeye() 
+- decideeye option now can write variations to an sgf file
+- life code revisions
+- utils.texi revised
+- bugfix in attack_callback() in worm.c
+
+2.7.118 released June 13, 2000
+
+- minor sniff_lunch revision
+- new mouse_attack pattern
+- new file regression/games/reading03.tst.
+- one new reading test
+- check for curses also in -lpdcurses
+- check for term.h and curses.h in AC_CHECK_HEADERS
+  instead of separate AC_CHECK_HEADER
+- new #define TERMINFO in config.h for the color
+  code in gg_utils.c, debugboard builds with pdcurses
+  on DJGPP despite the absence of term.h
+- workaround for the case when vwprintw is not available (as in pdcurses)
+  in display_message() in interface/debugboard/display.c
+- print the error message about too small screen after the screen has been
+  cleared in display_message()
+- use O_NONBLOCK as mask instead of FNDELAY since O_NONBLOCK
+  is more widely available
+- remove HAVE_STRING_H use
+- include <winsock.h> instead of <windows32/sockets.h> for mingw
+  included with new cygwin-1.1.1 release
+- cleanup of regression/Makefile.am
+- load_and_score_sgf_file() revised
+- life code revisions
+- default life eyesize increased from 8 to 10
+- bugfix in mouse_attack() and mouse_defend()
+- decideeye() in utils.c revised
+- terse option removed
+- function remove_string_and_mark() removed from board.c
+- distance and strategic_distance code removed
+
+2.7.117 released June 11, 2000
+
+- bugfix in regression/Makefile.am
+- countsize() renamed to countstones()
+- new function findstones()
+- life.c completely rewritten
+- regression/games/marginal.sgf extended
+- new life and optics tests
+- depth values no longer reduced while running make_domains()
+- revision of topological_eye()-calling code in dragon.c and mouse.c
+- doc/utils.texi revised
+
+2.7.116 released June 9, 2000
+
+- goal now static to mouse.c
+- mouse_attack() and mouse_defend() usage simplified
+- mouse_effective_defense replaced by mouse_does_defend
+- doc revision
+- debugboard: strings renamed to worms
+- debugboard now gives info about dragons
+- debugboard now has a help screen
+- color_to_string enhanced with eye colors also
+- new function status_to_string in utils.c
+- regression/Makefile.am revised so that make check also works with a
+  VPATH build 
+- STACK_SIZE revised and assertion added in incremental_board.c
+- recognize_eyes2() now returns 0 if the eyespace is too large to evaluate
+- assertion added in eyehash_index() in life.c
+- size of hash table in life.c corrected
+- new function location_set_get_size()
+- bugfix in hadj() macro in optics.c
+- gtp.c keeps track of the board size in a static variable
+- one new reading test
+
+2.7.115 released June 7, 2000
+
+- regression/Makefile.am prepared for VPATH build
+- compiling without curses works again, debugboard disabled in that case
+- assert that color is BLACK or WHITE in do_trymove()
+- pass move in minimize_eyes() scored and tested together with the other
+  legal moves
+- bugfix in maximize_eyes()
+- new GTP commands genmove_black and genmove_white
+- eyes1.sgf, eyes2.sgf, and eyes3.sgf in regression/games/ extended
+- new tests in optics.tst and life.tst
+
+2.7.114 released June 6, 2000
+
+- sniff_lunch revised and moved to mouse.c
+- mouse code classifies boundary strings
+- bugfix: mouse code was unsafe when stackp>0
+- new functions do_mouse_attack() and do_mouse_defend
+- more careful includes in interface/debugboard/display.c
+- bugfix in incremental_sloppy_self_atari()
+- regression shell scripts revised
+- global variable color_has_played eliminated
+- new function stones_on_board() in board.c
+- movenum no longer used in fuseki.c
+- examine_position() avoids recomputing data that are up to date
+- caching of mouse reading results is no longer using code 2 to indicate a
+  successful result for pass
+- new workaround for mangling of cached negative move coordinates
+- statistics functions reset_life_node_counter() and
+  get_life_node_counter() in life.c
+- corresponding new GTP commands reset_life_node_counter and
+  get_life_node_counter 
+- life.tst, ld_life.tst, and ld_mouse_life.tst reports the total number of
+  nodes visited by the life code
+- make_worms no longer returns anything
+- correct answer for mouse test 37 revised
+- temporary workaround in recognize_eye2(), chimeras are reported as one
+  and a half eye
+- maximize_eyes() and minimize_eyes() score and sort the moves to test
+- performance optimizations in maximize_eyes() and minimize_eyes(),
+  shortcut loops where possible unless all attack or defense moves are
+  asked for
+- bugfix in maximize_eyes(), check for marginality when counting eyes
+
+2.7.113 released June 5, 2000
+
+- mouse lunches are sniffed
+- sniff_lunch revised
+- bugfix in mouse_find_lunches
+- new global mouse_goal_color
+- bugfix in mouse_topological_eye autohelper
+- decidedragon messages corrected when tenuki wins
+- mouse tuning
+- new function location_to_string() in utils.c
+- new function position_examine_position() in engine/interface.c
+- new program debugboard located in interface/debugboard/
+- warning fixed in utils/gg_utils.c
+- comments about mapping of colors for linux console moved from showbord.c
+  to utils/gg_utils.c 
+- unused define -DBUILDING_GNUGO_ENGINE removed from engine/Makefile.am
+- config.h no longer included by moyo.c or showbord.c
+- new functions suicide() and self_atari() in board.c
+- a few approxlib() calls in reading.c replaced by suicide() and
+  self_atari()
+- new files incident59.sgf, incident74.sgf, and reading02.sgf in
+  regression/games 
+- new mouse and reading test cases
+
+2.7.112 released June 5, 2000
+
+- optimizations of false_margin()
+- safe_move() no longer called from make_domains() if mouse code enabled
+- call to modify_eye_spaces1() from make_domains() disabled if mouse code
+  enabled 
+- bugfix in attack2()
+- bugfix in break_chain2()
+- duplicate comment block removed from reading.c
+- new files incident169.sgf, incident246.sgf, incident91.sgf, and
+  reading01.sgf in regression/games
+- regression/games/life_and_death/ld11.sgf slightly revised
+- new mouse and reading test cases
+
+2.7.111 released June 4, 2000
+
+- comment added in attack4
+- mouse_attack and mouse_defend call make_domains when stackp==0
+- new files mouse04.sgf, incident185.sgf, incident186.sgf,
+  incident199.sgf, and incident225.sgf in regression/games/
+- new mouse and reading tests
+
+2.7.110 released June 3, 2000
+
+- init_color() in utils/gg_utils.c renamed to gg_init_color() to avoid
+  name collision with curses library function
+
+2.7.109 released June 3, 2000
+
+- HASH64 removed from configure.in and acconfig.h
+- config.vcin brought in sync with config.h.in
+- macro UCHAR_ALIAS replaced by char
+- curses initialization and drawing code moved from moyo.c and showbord.c
+  to utils/gg_utils.c
+- argument source_root removed from sgf_write_header
+- new files games/mouse02.sgf and games/mouse03.sgf
+- new tests, revised results
+- MAX_MOVES increased to 3 in mouse.c
+- attack4 tries a little harder
+- tuning of mouse patterns
+- life and death test cases 52-64 completed
+
+2.7.108 released June 1, 2000
+
+- mouse functions use a return code of 2 if tenuki works
+- Zobrist hashing extended to mouse_attack and mouse_defend
+- new function new_position() in board.c
+- warning fixed in life.c
+
+2.7.107 released May 31, 2000
+
+- random.c and random.h moved from engine/ to utils/
+- gg_snprintf() and gg_gettimeofday() moved to new file utils/gg_utils.c
+  and corresponding header file utils/gg_utils.h
+- new function gg_version() in utils/gg_utils.c
+- safe move cache implemented for mouse_shapes_callback
+- topological_eye autohelper function (taken down in 2.7.104) is back for mice
+- topological eye takes both eyespaces as parameters
+- 32 new life and death test cases, 1 new mouse test
+
+2.7.106 released May 30, 2000
+
+- tuning of mouse patterns
+- fuseki9.db rebuilt from a larger set of games
+- new game records and test cases
+
+2.7.105 released May 29, 2000
+
+- config.h only included by files which need it
+- one new mouse pattern
+- new test suite ld.tst with variations for --mouse and --life options;
+  added for real this time
+- new dedicated fullboard pattern matcher for use with the fuseki
+  databases
+- first move patterns in fuseki9.db and fuseki19.db no longer commented
+  out
+- missing borders added in fuseki9.db and fuseki19.db
+- number of preambles in mkpat.c reduced from three to one
+- mkpat.c revised to also handle patterns for fullboard matcher
+- bugfix in make_dragons(), lunches weren't propagated to the whole dragon
+- one new pattern in eyes.db
+- pattern Lunch2 in conn.db revised
+- regression/games/marginal.sgf revised
+- new optics and life regression test cases
+
+2.7.104 released May 28, 2000
+
+- topological_eye takes the eye_data as a parameter
+- newgoal removed from mouse_attack
+- mouse_attack wins if ALL strings of original dragon are taken
+- topological_eye autohelper function temporarily taken down
+- mouse apat A39 revised
+- make_dragons does not add_lunch if lunch already eaten
+- doc revision
+- new function false_marginal_eye in life.c
+- new eye pattern for 4 point linear eye with a false margin
+- Tests for life and optics restructured
+- New tests for false margins
+- config.h only included by files which need it, plus still liberty.h
+- new GTP command dragon_status
+- new test suite ld.tst with variations for --mouse and --life options
+- shell scripts in regression/ revised
+- new game records ld1.sgf -- ld8.sgf in regression/games/life_and_death
+
+2.7.103 released May 27, 2000
+
+- new fields height and width added to the pattern struct
+- bugfix in fixup_patterns_for_board_size() in matchpat.c; matching now
+  works correctly also when the board size changes between calls to
+  matchpat
+- bugfixes in does_attack() and does_defend() in utils.c
+- bugfix in false_margin() in optics.c
+
+2.7.102 released May 26, 2000
+
+- better documentation of life code in the source
+- life.c handles false marginals
+- new function: location_set_isempty() in location_set.c
+- regression/games/marginal.sgf revised
+- new optics and life tests
+
+2.7.101 released May 25, 2000
+
+- revised doc/gnugo-logo.jpg and doc/gnugo-logo.jpg
+- new tests in reading.tst and mouse.tst
+- bugfixes in test files
+
+2.7.100 released May 24, 2000
+
+- minimize_eyes and maximize_eyes simplified and bugfixed
+- better documentation of the hash table in life.c
+- some cleanup in life.c, optics.c
+- new format character 'x' in vgprintf (utils.c)
+- improved printing of pass moves when %m is used in vgprintf
+- default life_eyesize increased to 8
+- new eye tests
+
+2.7.99 released May 23, 2000
+
+- suffix rules for .gtp and .res in regression/Makefile
+- new regression files regression/*.tst
+- regression shell scripts revised
+- regression/expected removed
+- several new files in regression/games
+- several new regression tests
+- regression/ directory now under control of automake
+
+2.7.98 released May 22, 2000
+
+- false marginals are renamed false margins
+- eyespace search revised in mouse_determine_life
+- new file regression/expected
+- new targets in regression/Makefile
+- regression/games/false_marginal.sgf renamed regression/games/marginal.sgf
+- mouse tuning
+- several new files in regression/games
+- several new tests in regression/mouse.gtp, regression/eyes.gtp, and
+  regression/reading.gtp 
+- new GTP commands trymove, popgo, dump_stack, increase_depths, and
+  decrease_depths
+- new function gtp_decode_move() in interface/gtp.c
+- ko eyes assigned to a dragon so halfeye analysis is performed
+- old regression files in regression/obsolete/ removed
+
+2.7.97 released May 21, 2000
+
+- false marginals are detected during make_domains
+- new function false_marginal
+- new file regression/games/false_marginal.sgf
+- regression tests in regression/eyes reimplemented to use GTP
+- regression shell scripts revised
+- new targets in regression/Makefile to test optics and life code
+- new global variable position_number which is increased any time a real
+  move (not a trymove) is made or the board is permanently changed by some
+  other means
+- safe_move cache modified to use position_number instead of movenum
+- caches in moyo.c modified likewise
+- new function setup_board() in board.c
+- the functions in engine/interface.c no longer modifies the global board
+  on their own
+- new function gtp_finish_response in interface/gtp.c
+- new gtp command eval_eye
+
+2.7.96 released May 20, 2000
+
+- GTP documented
+- new file doc/gtp.texi
+- reading test suite extended
+- regression shell scripts revised
+- bugfix in gtp_loadsgf()
+- output from gtp_attack(), gtp_defend(), gtp_mouse_attack(), and
+  gtp_mouse_defend() revised
+
+2.7.95 released May 19, 2000
+
+- new interface: GTP, Go Text Protocol
+- new files in interface/: gtp.c, gtp.h, and play_gtp.c
+- old contents of regression/ moved to regression/obsolete/
+- new regression scripts and suits in regression/
+- doc/regression.texi revised
+
+2.7.94 released May 18, 2000
+
+- bugfixes in mouse.c
+
+2.7.93 released May 16, 2000
+
+- writesgf() split into sgf_write_header() and writesgf()
+
+2.7.92 released May 14, 2000
+
+- bugfix in utils.c, config.h included before using information from
+  configure tests
+
+2.7.91 released May 14, 2000
+
+- all functions in sgffile.c are now prefixed with sgffile_ instead of
+  sgf_ to separate them from functions which handle SGF trees
+- some minor cleanup in dragon.c
+- globals last_move_i, last_move_j made local to interface/play_ascii.c
+- functions save_state() and restore_state() removed together with
+  variables white_captured_backup and black_captured_backup.
+- move reasons are now sorted
+- inclusion of sys/time.h made contingent on HAVE_SYS_TIME_H in utils.c
+- inclusion of time.h and/or sys/time.h removed from hash.c and
+  interface/play_solo.c
+- one new pattern in eyes.db
+
+2.7.90 released May 12, 2000
+
+- bugfixes in play_gmp.c, play_solo.c, and play_test.c; gameinfo correctly
+  initialized
+- cleanup of play_gmp.c
+
+2.7.89 released May 10, 2000
+
+- bugfixes in main.c; decidestring, decidedragon, and decideeye options
+  work correctly again
+- new function color_to_string() in utils.c
+
+2.7.88 released May 9, 2000
+
+- minor tuning of mouse_attackpats.db
+- extended documentation of influence function
+- new function unconditional_life() in utils.c
+- MAX_STRINGS macro moved from incremental_board.h to liberty.h
+- unused variable removed from do_pass() in play_ascii.c
+
+2.7.87 released May 8, 2000
+
+- guess_mode_from_sgf_comment() removed
+- coordinates (-1, -1) are now always used for pass moves (rather than
+  (board_size, board_size))
+- obsolete and unused debug flags marked in gnugo.h
+- inclusion of sys/types.h removed from gmp.c
+- unused function str2short() removed from sgf_utils.c
+- cleanup of play_solo.c, play_test.c, and sgf_utils.c
+- bugfix: move number again passed from the interfaces to the engine
+
+2.7.86 released May 7, 2000
+
+- doc revision
+- more comments in the code for multiple diagonals of a halfeye
+- extended debug outputs in optics.c
+- bugfix in hash.c
+- new datataype Gameinfo
+- Gameinfo used everywhere in interface/*.c
+- Gameinfo used instead of Position in a few places otherwise
+- new function: position_recordhand()
+- board_size no longer public; moved from gnugo.h to liberty.h
+- several small functions removed from interface/interface.c
+- bugfix in regression/Makefile
+- bugfix in mkpat.c
+
+2.7.85 released May 5, 2000
+
+- bugfix in recognize_eye()
+
+2.7.84 released May 3, 2000
+
+- multiple vital eye moves in conjunction with topological halfeyes
+  supported in both optics and life code
+- compiler warnings fixed in interface/play_ascii.c and engine/interface.c
+- parameter names added to function prototypes in interface/interface.h
+
+2.7.83 released May 1, 2000
+
+- new functions in engine/interface.c
+- p[][], ko_i, ko_j, black_captured, white_captured moved from gnugo.h
+  to liberty.h, i.e. made local to the engine
+- attack() and find_defense() also made local to the engine
+- board handling functions removed from interface/interface.c
+- all interface functions in interface/interface.c now use the Position
+  datatype
+- sgfAddMoveFromTree() and sgfPlayTree() moved from sgfana.c to ttsgf.c
+- minor tuning of mouse_defendpats.db
+
+2.7.82 released April 30, 2000
+
+- new file engine/interface.c included for real this time
+- removed types SGFNodeP and SGFPropertyP
+- play_solo() and play_gmp() now plays on a Position.
+- get_moveXY moved from play_solo.c to sgf_utils.c
+- minor cleanup in a number of places
+- main.h moved from engine/ to interface/
+
+2.7.81 released April 28, 2000
+
+- new function sniff_lunch (unused and untested)
+- new function remove_string_and_mark
+- originate_eye now public
+- add_half_eye now takes half_eye array as an argument
+- doc revision
+- jump_out_helper() rewritten to use influence function rather than
+  strategic distance
+- matchpat_db() renamed to matchpat()
+- redundant autohelper function singleton() removed
+
+2.7.80 released April 27, 2000
+
+- bugfix in hash_rand()
+- obsolete -DBUILDING_GNUGO_ENGINE removed from patterns/Makefile.am
+- countlib2(), findlib2(), and approxlib2() renamed to countlib(),
+  findlib(), and approxlib() respectively
+- minor tuning of influence.db
+
+2.7.79 released April 26, 2000
+
+- count of hash collisions added to the --statistics option
+- new files random.c and random.h with an implementation of a twisted
+  GFSR random number generator
+- all calls to rand() or random() replaced by calls to the local random
+  number generator
+- test for random() removed from configure.in
+
+2.7.78 released April 25, 2000
+
+- sgf/sgf.c moved to the engine and renamed to sgffile.c
+- sgf/sgf.h removed; declarations moved to gnugo.h and liberty.h
+- removed a few declarations for non-existent functions from sgf_utils.h
+- analyzerflag moved to globals.c
+- new file: engine/interface.c
+- some functions for handling positions.
+- ttsgf_read.c and ttsgf_write.c integrated into ttsgf.c
+- bugfix in sgfPlayTree()
+- old approxlib() removed
+- bugfix in life.c
+- local random generator removed from hash.c
+- cleanup of hash.c
+- simplified typedefs in hash.h
+
+2.7.77 released April 24, 2000
+
+- doc of the colored influence displays added
+- new function hashdata_diff_dump() for use in assertions
+- local random generator in hash.c
+- revised types in hashing code
+- bugfix in semeai_analyzer()
+- order of engine/ and pattern/ builds changed back
+- extract_fuseki no longer built by default
+- bugfixes in extract_fuseki.c
+- tuning of influence.db
+- bugfixes in patterns.db
+
+2.7.76 released April 23, 2000
+
+- revised assertions in add_stone() and remove_stone()
+- declaration and initialization of color_has_played moved from interface/
+  to engine/
+- hashtable_clear no longer crashes if passed a NULL pointer
+- warning if hashtable allocation fails
+- new database matching step in the fuseki module
+- new experimental option --fusekidb to enable fuseki database matching
+- new program patterns/extract_fuseki.c which compiles a fuseki database
+  in patterns.db format from a collection of game records
+- new pattern databases fuseki9.db and fuseki19.db containing 9x9 and
+  19x19 fuseki databases respectively
+- bugfix in influence.c to stop a single stone from claiming the whole board
+- libengine is now built before the patterns/ subdirectory is compiled
+
+2.7.75 released April 20, 2000
+
+- recognize_eye() and recognize_eye2() looks for all vital eye points and
+  passes them to the move generation
+- eyes.db format extended for multiple vital moves and database revised
+- liberty counting functions in incremental_board.c restructured to agree
+  with the new corresponding functions in board.c
+- approxlib() and countlib() calls converted to countlib2(), findlib2(),
+  and approxlib2() calls
+- countlib() macro removed
+- accurate_approxlib() revised and accurate_countlib() macro removed
+- autohelper lib() can now be used for stackp>0
+- TODO revised
+
+2.7.74 released April 19, 2000
+
+- obsolete code removed from genmove()
+- board_t renamed to Intersection
+- new Position struct added in gnugo.h
+- print_influence() now prints everything to stderr
+
+2.7.73 released April 18, 2000
+
+- revised TODO
+- renamed static function compile_for_match_new() back to 
+  compile_for_match()
+- removed all external calls to compile_for_match()
+- minor cleanup in globals.c
+- don't regard marginal eye points as real eyes in the life code
+- neighbors to marginal eye points may be captured in the life code
+
+2.7.72 released April 13, 2000
+
+- old board code removed from board.c
+- new functions countlib2(), findlib2(), and approxlib2(), intended to
+  replace approxlib()
+
+2.7.71 released April 12, 2000
+
+- bugfixes in the hashing code, now CHECK_HASHING works again
+- pattern database code restructured, explicit calls to compile_for_match()
+  no longer needed
+- apats.db renamed to mouse_attackpats.db and dpats.db renamed to
+  mouse_defendpats.db 
+- minor cleanup of dragon.c, life.c, optics.c, and patterns/patterns.h
+- documentation of hashing added to doc/reading.texi
+- cleanup of filllib.c
+
+2.7.70 released April 10, 2000
+
+- doc revision
+- bug fix in fill_liberty
+- compiler warning fix
+- simplified implementation of double_threat()
+- improved trace messages in confirm_safety()
+- depth values increased during reading in confirm_safety()
+
+2.7.69 released April 9, 2000
+
+- bugfix in regression/eyes/test.sh
+- revision of confirm_safety
+- revision of review_move_reasons
+- new function double_atari
+- new function accurate_approxlib
+- accurate_countlib takes *libi, *libj as parameters
+- fill_liberty tries to avoid setting up double ataris
+- doc revision
+- load_and_analyze_sgf_file assumes color_has_played
+- bugfix in mouse_determine_life
+
+2.7.68 released April 7, 2000
+
+- New switch --terse for test output
+- Various minor cleanups
+- life.c much commented
+- regression tests for life code using --decideeye in regression/eyes
+
+2.7.67 released April 5, 2000
+
+- check for size of int and long in configure
+- configure option --enable-hash64
+- separate options --life and --life_eyesize <n>
+- reformatting of help string to fit 80 columns
+- bugfix in play_ascii.c
+- minor tuning of patterns.db
+
+2.7.66 released April 4, 2000
+
+- point of attack and point of defense considered separately by
+  compute_eyes(), recognize_eye(), topological_eye(), and half_eye_data
+- make_dragons() now take color to play as parameter
+- (defensei, defensej) renamed (defendi, defendj) in a number of places
+- minor tuning of patterns2.db
+
+2.7.65 released April 3, 2000
+
+- removed trailing ',' symbols in enums in main.c and gmp.c
+- extraneous declaration of deltai[] and deltaj[] removed from influence.c
+- bugfixes in the CHECK_HASHING code
+- bugfix in play_ascii.c, repeated save and load now works
+- compile_for_match() added in two places
+- keep track of attack and defense points of mouse_lunches
+- revision of mouse_find_lunches() and mouse_lively()
+- minor doc revision
+- aesthetic reformatting in eyes.db
+- declaration of incremental board functions moved from liberty.h to
+  incremental_board.h 
+- new function incremental_mark_string() in incremental_board.c
+- replaced mouse_mark_strings() with a generic mark_string() in board.c
+
+2.7.64 released April 2, 2000
+
+- updated DJGPP info
+- removed leading white space in windows.texi for more nicely formatted
+  info files
+- removed obsolete workaround for a texi2html missing feature.
+- added members defendi and defendj to struct eye_data
+- recognize_eye2 now returns point of defense as well as point
+  of attack for an eye
+- compute_eye now reports defense point as well as attack point
+- recognize_eye2 now considers if the boundary of the eye is
+  captured during eye reading
+- speed optimizations in recognize_eye2
+- 5 new functions in location_set.c
+- small bugfix in showbord.c
+- small bugfix(?) in main.c
+- small cleanup in dragon.c
+- new function mouse_effective_defense()
+- if the mouse code is enabled, strategically_sound_defense() invokes
+  mouse_effective_defense()
+       
+2.7.63 released April 2, 2000
+
+- new function attack1() to determine whether a string in atari can be
+  captured
+- snapback() made obsolete and removed
+       
+2.7.62 released April 1, 2000
+
+- bugfix in evaluate_diagonal_intersection()
+- evaluate_diagonal_intersection moved to optics.c and made static
+- new function topological_eye
+- new autohelper option topological_eye
+- doc revision
+- mouse tuning
+- hashvalue test whether matchpat is properly prepared for the board
+  position being matched
+- compile_for_match() added in a few places
+- modify_eye_spaces1() and find_cuts() not used when make_domains() is
+  called from the mouse code
+- minor bugfixes in life.c and board.c
+- minor tuning of patterns2.db
+       
+2.7.61 released March 31, 2000
+
+- bugfix in recognize_eyes2() so it can be used for stackp>0
+- reloading of files in ascii mode is documented
+- mouse code tries tenuki if no move of value >40 found
+- dpat revision
+- eye pattern 524 removed
+- obsolete fixme removed from patterns2.db
+- new function move_in_stack() in board.c
+- improved debug output in life.c
+- decideeye() disables trace outputs during make_worms() and make_dragons()
+       
+2.7.60 released March 30, 2000
+
+- doc revision
+- new option --life to enable the life code
+- new function initialize_engine() in genmove.c
+- bugfixes in sgf_decidedragon(), sgf_decideposition(), and decideeye()
+- modify_eye_spaces1() only called from make_domains() if stackp==0
+- loop unrolling in accumulate_influence enabled
+
+2.7.59 released March 29, 2000
+
+- new file life.c with eye reading code
+- new file location_set.c with a utility class that contains a set of
+  locations on the go board
+- bew file location_set.h with headers for location_set.c
+- bugfix in board.c which makes the allocation of hash nodes correct
+- separation of the examination step of genmove() into it's own
+  function, examine_position(), and calls to this function in a number of
+  places
+- some comments added in mouse.c plus some cleanup
+- new option --decideeye which tells the status of an eye
+- new function get_coordinate() in main.c
+- black_eye and white_eye passed as arguments to make_domains
+- private black_eye and white_eye arrays for mouse.c
+- eye pattern added to eyes.db
+- bugfix in unrolled accumulate_influence()
+- bugfix in move_reasons.c
+
+2.7.58 released March 28, 2000
+
+- loop unrolling in accumulate_influence(), initially disabled by default
+
+2.7.57 released March 27, 2000
+
+- doc revision
+- compile_for_match() called again after running mouse code from genmove()
+- mouse_genmove() removed from utils.c (was unused)
+- doc/MOUSE and doc/INFLUENCE removed from distribution, all material is
+  included in the Texinfo documentation
+- matchpat aborts if color==EMPTY
+- mouse_attack returns true if trymove captures
+- unnecessary test eschewed in mouse_find_lunches
+- corrected: debug flag set wrong in main.c with --mouse
+
+2.7.56 released March 25, 2000
+
+- optics.c: redefinition of lively for mousing
+- new functions mouse_find_lunches and mouse_lively
+- new DEBUG_MOUSE debug option
+- does_attack and does_defend no longer require stackp==0
+- new apats and dpats
+- doc revision
+- sethand.c: bugfix in placehand(), use add_stone() instead of
+  manipulating p[][] directly
+
+2.7.55 released March 25, 2000
+
+- initialize dragon.mouse_attack and dragon.mouse_defend
+- revaluation of joseki database
+- hashing code revised for 64 bit architectures
+- Makefile added to regression subdirectory and regress.sh revised
+- minor tuning of patterns.db
+- AUTHORS and doc/introduction.texi revised
+
+2.7.54 released March 23, 2000
+
+- revised eye patterns, prefer to play on marginal vital points
+- doc revision
+- introduction moved from incremental.c to texinfo
+- special value 99 implemented for apats and dpats
+- new apats and dpats
+- AUTHORS and doc/introduction.texi revised
+- accurate_countlib revised
+- slow_findlib() added in incremental_board.c so that
+  incremental_findlib() and incremental_countlib() can handle all cases
+
+2.7.53 released March 21, 2000
+
+- bugfixes and other revisions of the incremental board code
+- incremental board code enabled by default
+- new function accurate_countlib() in utils.c
+- a few countlib() calls replaced by accurate_countlib()
+- minor bugfix in connection_value2
+
+2.7.52 released March 19, 2000
+
+- bugfix: decidestring and decidedragons were getting depth 0
+- new apats and dpats
+- minor cleanup of join_dragon invocations
+- mouse code reports findings (temporary measure)
+- doc revision
+
+2.7.51 released March 18, 2000
+
+- doc revision
+- hurry >= 3 turns off some features
+- adjust configure.in, config.vc and sgf/ttsgf.c
+  to test for vsnprintf instead of snprintf
+- replace an embedded newline in a #defined
+  string in main.c with an explicit \n
+- remove trailing ',' characters in enum
+  declarations
+- include interface.h in sgf_utils.h so
+  that enum testmode is defined when declaring
+  guess_mode_from_sgf_comment.
+- bugfix in break_through_helper()
+
+2.7.50 released March 17, 2000
+
+- new option --showtime makes genmove report its time
+- new option --hurry decrements depth parameters
+- hurry can be set during ascii play
+- new global variables hurry and showtime
+- gg_gettimeofday made global
+- new global variables nominal_depth, nominal_backfill_depth,
+  nominal_fourlib_depth, and nominal_ko_depth
+
+2.7.49 released March 15, 2000
+
+- bugfix in make_dragons (--mouse could cause crash)
+- bugfix in mouse_determine_life
+- bugfix in vgprintf
+- new function vital_chain
+- new autohelper functions singleton and vital_chain
+- mouse tuning
+- new eye pattern
+- mouse code documented
+- string.h included in incremental_board.c to stop warning
+- sgf functions cleaned up by passing around a file handle instead of
+  sharing a global one
+- minor optimizations in break_chain() and relative_break_chain()
+- minor changes and more comments in incremental_board.c
+- stack implementation revised in incremental_board.h
+
+2.7.48 released March 14, 2000
+
+- new global variable mouse
+- new functions mouse_reasons, add_mouse_attack_move, add_mouse_defend_move
+- new option --mouse
+- support for loading a position from file and continue playing with the
+  ascii interface
+
+2.7.47 released March 13, 2000
+
+- singleton() moved from utils.c to board.c
+- new files incremental_board.c and incremental_board.h, supplying an
+  implementation of incremental board updates
+- support for incremental board updates added to board.c but still disabled
+- updateboard() made static to board.c
+- return type of pushgo() and popgo() changed to void
+- new function play_move() replaces updateboard() for use from interfaces
+
+2.7.46 released March 10, 2000
+
+- chainlinks() and chain() moved from reading.c to board.c
+- find_origin() moved from utils.c to board.c
+- count() made static to board.c
+
+2.7.45 released March 9, 2000
+
+- globals global_size, global_lib, global_libi, and global_libj eliminated
+- new function countsize() in board.c
+- tenuki (?) implemented for autohelpers
+- two autohelpers in patterns.db and one in dpats.db use tenuki
+- type omitted from findex entries
+- decideposition takes a color option
+- if (MOUSE) then showboard prints two diagrams
+- new apats and dpats
+- error messages in mkpat slightly revised
+- Martijn van der Kooij and NNGS are thanked
+- minor spelling corrections in Texinfo documentation
+- windows.texi revised
+
+2.7.44 released March 8, 2000
+
+- globals size, lib, libi, libj renamed global_size, global_lib,
+  global_libi, global_libj
+- new parameters to count(), approxlib(), and countlib() for passing
+  liberty locations
+- bug fixed in mouse_determine_life which could cause crash
+- new option --decideposition
+- showboard can display mouse_status
+- mouse_status computed in dragon.c
+- a few new apats and dpats
+- findex entries omit parameters
+- windows installation instructions added to Texinfo documentation
+
+2.7.43 released March 7, 2000
+
+- connection_value2() revised
+- type of potential_move array changed to int
+- updated VC project files
+
+2.7.42 released March 6, 2000
+
+- mouse goal array changed from int to char
+- C patterns implemented for mouse patterns
+- bugfix in mouse_defense: misplaced popgo() popped
+- new function goaldump for debugging
+- new function mouse_mark (like count but does not mark liberties)
+- new mouse patterns
+- cleanup of interface.c
+- pushgo() made static
+- pattern profiling output now computes the total number of hits and
+  reading nodes
+- O symmetry introduced in barriers.db
+
+2.7.41 released March 5, 2000
+
+- documentation revision
+- new file doc/influence.texi
+- move generation functions are documented in Texinfo
+- influence.c functions are documented in Texinfo
+- short section on Migration removed from move_generation.texi
+- new pattern profiling option --profile_patterns
+- minor tuning
+- new symmetry class 'O'
+- joseki pattern values reduced to a third
+
+2.7.40 released March 4, 2000
+
+- doc revision
+- tryko returns 0 if suicide is attempted
+- now --printsgf works with -L
+- implementation of trymove() and tryko() unified
+- minor optimization in attack_either()
+- cleanup of utils.c
+- experimental pattern CB327 in patterns.db
+
+2.7.39 released March 1, 2000
+
+- revision of patterns/apats.db and patterns.dpats.db
+- default depth values restored to 2.6 level
+- new functions set_temporary_depth_values() and restore_depth_values()
+  in utils.c
+- depth values temporarily decreased while computing influence
+- bugfix in tryko()
+
+2.7.38 released February 29, 2000
+
+- handle handicap stones in sgf files correctly
+- bugfix in mouse.c
+- trymove() replaced by tryko() in compute_move_influence
+
+2.7.37 released February 28, 2000
+
+- point to strings instead of copying them in mouse.c 
+- more than two moves per position can now be handled by the mouse code by
+  increasing the value of MAX_MOVES
+- B class patterns in dpats.db inhibit addition of the stone to the dragon
+- AUTHORS, THANKS, and doc/introduction.texi revised
+- two eye patterns revised
+- bugfix in sgfOverwritePropertyInt() in ttsgf.c
+- sethand() split into two halves to make it more flexible
+- play_ascii.c revised to deal correctly with handicap stones
+
+2.7.36 released February 27, 2000
+
+- dragon.c: serious bug fixed in topological eye evaluation
+- substantial revision of mouse.c
+- new patterns in apats.db and dpats.db
+- sgf.c: revision of decidedragon
+- doc expanded of certain autohelper functions
+- Jamal Hannah's typing Gnu acknowledged as logo source
+- documentation of influence function begun in doc/INFLUENCE
+
+2.7.35 released February 26, 2000
+
+- mouse_attack and mouse_defend avoid some duplicate eyespace evaluations
+- missing eye pattern in eyes.db
+- sgf_decidedragon correctly invoked from main.c
+- close sgf file before reopening it
+- do not close stdout in sgf_close_file
+- print_eye revised to give nice output also when stackp>0
+
+2.7.34 released February 25, 2000
+
+- experimental mouse code
+- gnugo.eps and gnugo.jpg renamed gnugo-logo.eps and gnugo-logo.jpg
+
+2.7.33 released February 23, 2000
+
+- VC project files and WINDOWS revised
+
+2.7.32 released February 22, 2000
+
+- reading cache cleared once it becomes full
+- -M option now takes float argument
+- -M 0 no longer causes a floating exception
+
+2.7.31 released February 21, 2000
+
+- VC project files adapted from 2.6
+- win/ directory with makefile brought over from 2.6
+- bugfix in main.c, optind replaced by gg_optind
+- WINDOWS revised
+- minor assorted cleanups
+
+2.7.30 released February 19, 2000
+
+- cleaned up code for debuginfluence option
+- general cleanup of main.c
+- minor tuning of patterns2.db
+- AUTHORS, THANKS, and README brought up to date with 2.6
+- TODO revised
+- Added news for 2.6 in NEWS
+- WINDOWS brought over from 2.6
+- year 2000 added in copyright notices everywhere
+- emacs interface added from 2.6
+- gnugo.jpg added from 2.6
+- gnugo.eps built by encapsulating gnugo.jpg into postscript level 2 using
+  jpeg2ps
+- Texinfo documentation merged with late changes from 2.6
+- various other late changes from 2.6 merged
+
+2.7.29 released February 11, 2000
+
+- tuning of barriers.db, endgame.db, and patterns.db
+- sprintf replaced by vsprintf in gg_snprintf
+- spelling corrections
+- TODO revised
+- unreachable code in hashdata_init() commented out
+- UNUSED and ON_BOARD macros moved to liberty.h
+- special_rescue() made more general
+- calls to special_rescue() also in defend3()
+
+2.7.28 released February 8, 2000
+
+- bugfix in break_through()
+- tuning of conn.db, influence.db, patterns.db, and patterns2.db
+- various minor fixes to eliminate warnings on certain platforms
+- opterr, optind, and optopt prefixed with gg_ to allow building with
+  profiling 
+       
+2.7.27 released February 6, 2000
+
+- copying.texi added for real this time
+- minor revision of patterns.texi
+- various code revisions in influence.c
+- new functions for segmenting connected regions of territory, moyo, and
+  area added to influence.c
+- -m option can take hexadecimal values
+- tuning of barriers.db, influence.db, conn.db, patterns.db, and
+  patterns2.db 
+- conn.db reorganized
+- retuning of joseki patterns
+- corner moves in fuseki.c retuned
+- minor revisions of move_reasons.c
+- workaround to avoid black characters on black background in showbord.c
+- we no longer add half eyes when eye.dragoni == -1
+       
+2.7.26 released January 31, 2000
+
+- endgame patterns split off from patterns.db to endgame.db and matched
+  separately
+- influence_delta_territory results cached
+- tuning of barriers.db, conn.db, patterns.db, and patterns2.db
+- new eye pattern from 2.5.63
+- new option --debuginfluence to help tuning influence function
+- listing of worms includes origins of corresponding dragons
+- bugfix in move_reasons.c; don't accept cuts or connections of one dragon
+  and itself
+
+2.7.25 released January 29, 2000
+
+- AUTHORS, INSTALL, and THANKS revised
+- GPL added to texinfo documentation
+- small_semeai() documented in texinfo documentation
+- autohelper call moved from matchpat() to callback
+- possible to pass auxiliary data through matchpat() to callback
+- DEPTH decreased from 14 to 12, BACKFILL_DEPTH from 8 to 6, and KO_DEPTH
+  from 8 to 6
+- new functions for drawing boards for debug output
+- symbolic names for colors
+- influence function implemented in influence.c and influence.h
+- new patterns to assist influence function in patterns/barriers.db and
+  patterns/influence.db
+- terri renamed to territory in a number of places
+- revised heuristics to decide when a tactical defense is strategically
+  sound, using influence values
+- territorial value estimated with influence_delta_territory() instead of
+  delta_terri() from moyo module
+- influence value estimated with influence module functions instead of
+  delta_moyo() from moyo module
+- secondary_value weighted down substantially in computation of total move
+  value
+- symbolic names for printmoyo values
+- local optimizations in shapes_callback() to avoid unnecessary reading
+- increased depth values when evaluating reading constraints disabled to
+  improve speed
+- new patterns in conn.db
+- local optimization in connections.c, don't evaluate autohelper if there
+  is nothing to amalgamate
+- autohelper functions xarea, oarea, xmoyo, omoyo, xterri, and oterri
+  changed to use functions from influence module
+- separate flag to mkpat to decide anchoring policy
+- tuning of patterns.db and patterns2.db
+
+2.7.24 released January 27, 2000
+
+- cleanup of the interface/ files
+- minor revision to doc/using.texi
+- doc/reading.texi updated from 2.5.62
+
+2.7.23 released January 26, 2000
+
+- removed inclusion of unistd.h where unnecessary
+- include io.h on platforms where unistd.h not available
+- remove unused files utils/long-options.[ch] utils/closeout.[ch], and
+  utils/error.h 
+- fixed getopt warnings by renaming the getopt in utils/ to gg-getopt
+- TODO revised
+- -M option repaired
+- bugfix in init_gnugo() in board.c; don't do everything twice
+- default size of reading cache increased from 8 MB to 32 MB
+- docs/ directory replaced by doc/ with texinfo documentation from 2.5.60
+- gnugo.6 man page moved from top directory to doc/
+- /docs/WINDOWS updated from 2.5.60 and moved to top directory
+
+2.7.22 released January 20, 2000
+
+- always use strtok in play_ascii.c and skip strsep
+- cleanup in configure.in
+- bugfix in play_solo.c
+- configure test for gettimeofday in interface/
+- HAVE___FUNCTION__ moved to the right position in acconfig.h
+- in configure.in, add -lwsock32 to $LIBS for the mingw32 environment
+  for the select call in gmp.c
+- include windows.h and windows32/sockets.h to get definitions for fd_set,
+  select and FD_* macros in gmp.c
+- incorrect "abort;" changed to "abort();" in several places
+- TODO item about converting documentation into texinfo marked as done
+
+2.7.21 released January 17, 2000
+
+- confirm_safety() called from review_move_reasons() in order to avoid
+  certain blunders
+- the search for lunches moved to the end of make_worms()
+
+2.7.20 released January 16, 2000
+
+- removed unused file utils/getdate.c from distribution
+- pattern Eye2 taken out from conn.db as workaround to a bug
+- only victims with attack code 1 or 2 are considered lunch
+- separation of interface into a public and a private part; liberty.h
+  split into gnugo.h for external interface and liberty.h for internal
+  interface
+- dragon_status() renamed to compute_dragon_status()
+- new function dragon_status() hiding dragon_data struct
+- default cached function is only attack()
+- new function is_worm_origin()
+- new function confirm_safety()
+- update the files getopt.c getopt1.c and getopt.h in utils/ to glibc-2.1.2
+- add a file README in the utils directory explaining where the getopt
+  files come from.
+- make utils the first subdirectory to compile
+- link in utils/libutils.a when linking mkpat.c
+
+2.7.19 released January 13, 2000
+
+- unsigned char changed into signed char in sgfana.c, ttsgf.c, and
+  ttsgf_write.c to eliminate DEC-cc warnings.
+
+2.7.18 released January 12, 2000
+
+- src directory renamed to engine
+
+2.7.17 released January 10, 2000
+
+- cleanup in moyo.c, eliminating DEC-cc compiler warnings
+- main.c moved from src/ to interface/
+- dragon.weak renamed dragon.safety
+
+2.7.16 released January 8, 2000
+
+- cleanup in configure.in
+- cleanup in make_proper_eye_space()
+- autohelper functions for modifying eyespace
+- more debug output for DEBUG_EYES
+- tuning
+- one new pattern in eyes.db
+
+2.7.15 released January 6, 2000
+
+- cleanup in configure.in
+- configure tests for random and alarm
+- embedded newline removed from a string in mkeyes.c
+- extra pair of braces to avoid ambiguous else in optics.c
+- compiler warning about snprintf eliminated from ttsgf.c
+- documentation about dragon.status and dragon.weak revised in docs/DRAGON
+- attack() is more cautious about snapbacks
+- dragon_status() revised to consider a missing case
+- docs/PATTERNS fully revised
+- slight revision of the definition of higher order liberties, in an attempt
+  to fix escape_route problem
+- reading depths increased with the number of explicitly placed stones
+  in autohelpers
+- minor cleanup in utils.c
+- patterns shuffled around in patterns.db and patterns2.db
+- two extra matching pattern steps to modify eyespaces, patterns temporarily
+  hosted in conn.db
+- not_lunch patterns moved to conn.db and matched together with eye space
+  modifying patterns
+- autohelpers can now also be used in conn.db patterns with no '*'
+- minor revision of escape.db
+- dont_attack_helper removed since it was no longer in use
+- remaining references to EXPERIMENTAL_MOVEGEN removed
+- bugfix in add_half_eye()
+- new function make_proper_eye_space() in optics.c for use from autohelpers
+- tuning
+
+2.7.14 released January 4, 2000
+
+- four vgprintf calls in utils.c changed to vprintf calls
+- variable sized arrays changed to fixed size in sgfana.c
+- declaration of board_size in ttsgf.h made consistent with liberty.h
+- removed embedded newlines in strings in mkeyes.c and main.c
+- escape.db patterns revised
+- bugfix in matchpat
+- revised heuristics for non-matched eye shapes
+- tuning
+
+2.7.13 released January 3, 2000
+
+- help debug prints default hash memory
+- decidestring reports even if verbose=0
+- print_eye() documented, prototype moved 
+- documentation in docs/PATTERNS partially updated to reflect changes
+  in pattern format
+- bugfix in mkpat.c
+- bugfix in getopt string
+- bugfixes in trace messages in shapes.c
+- new function dragon_status2() using new escape route measure in
+  the escape2 field (not yet in actual use)
+- new patterns in escape.db
+- tuning
+
+2.7.12 released January 2, 2000
+
+- configure option to revert to sprintf if neither snprintf or g_snprintf
+  found
+- command line option -M (--memory) to specify hashtable size
+- bugfixes in board.c
+
+2.7.11 released January 2, 2000
+
+- all remaining patterns in patterns.db adapted to new move generation scheme
+- format of ":" lines in pattern databases changed
+- joseki.c updated to produce new database format
+- patterns in conn.db can have action lines
+- three new autohelpers: dragonsize(), wormsize(), and potential_cutstone()
+- patterns are no longer sorted in mkpat and min weight optimization
+  removed from matchpat
+- updated documentation of autohelpers in docs/PATTERNS
+- value field in worm_data and dragon_data obsoleted and removed
+- obsolete section removed from docs/PATTERNS
+- obsolete pattern classes Q and q removed, remaining ones slightly reordered
+- B, C, a, d patterns work on up to five dragons (previously max two or one)
+- improved tunability of patterns, possible to specify min and max
+  territorial and total values
+- many helpers converted to constraints and removed
+- join_dragons() no longer need to be called with origins of dragons
+- wind assistance and moyo assistance functions obsoleted and removed
+- connection_value() and compute_score() obsoleted and removed
+- attack_either move reason rejected if one of the strings is defenseless
+- old style move values no longer used in move generation
+- shape value effect changed from additive to multiplicative
+- random contribution to move value decreased
+- tuning
+
+2.7.10 released December 28, 1999
+
+- changes from 2.5.47--2.5.52 merged into eyes.db
+- tuning
+- unused helpers and patterns removed
+- many patterns in patterns.db adapted to new move generation scheme
+- linear eyes of size 6 with one marginal eye fixed in eyes.db
+
+2.7.9 released December 27, 1999
+
+- bugfixes and cleanups in configure.in and various Makefile.am
+- bugfix in move valuation
+- bugfix in add_half_eye: remember to adjust marginal_neighbors
+- bugfix in defend1: consider case of 4 liberties after extend
+- breakchain2: try_harder to break chain
+- bugfix in singleton()
+
+2.7.8 released December 23, 1999
+
+- break_chain2 considers a few extra possibilities
+- stricter syntax checking in mkpat.c
+- bugfixes in pattern databases
+- caching of read results indexed also on stackp
+- warning eliminated in dragon.c
+- implementation of tracing of read results revised
+- one new pattern in escape.db
+- new escape route algorithm documented in docs/DRAGON
+
+2.7.7 released December 21, 1999
+
+- More verbose autoconf test for __FUNCTION__
+- bugfix and cleanup in patterns/Makefile.am
+- Split utils.c into board.c and utils.c
+- Cleanup of both files.
+- Fix a warning in fuseki.c
+- minor tuning
+- one new pattern in conn.db
+- improved trace messages for read results, contingent on TRACE_READ_RESULTS
+       
+2.7.6 released December 19, 1999
+
+- READ_RETURN0 macro redefined in reading.c
+- makes consistent the inequalities in reading.c
+- misspelling of "propagate" corrected
+- experimental implementation of new escape route algorithm
+- new file: patterns/escape.db
+- DEBUG_HEY (obsolete) replaced by DEBUG_ESCAPE
+- one new pattern in conn.db
+- new autohelpers: same_dragon and same_worm
+- minor tuning
+- bugfix in rr_set_result_ri_rj() macro
+- bugfix in compile_for_match()
+- don't allocate hash table space in find_defense if more than four liberties
+- bugfixes in defend3()
+- two compiler warnings eliminated in semeai.c
+- bugfixes in attack_callback() and defense_callback in worm.c
+
+2.7.5 released December 18, 1999
+
+- elimination of stackp<depth contingency in break_chain2 call from defend2
+- reordering of the nodes in break_chain2 for minor speedup
+- minor cleanup in reading.c (elimination of unnecessary braces)
+- bugfix in attack2
+- bugfix in moyo.c
+- minor tuning
+- cleanup and revised trace messages in shapes.c
+- old style C and B patterns taken out from patterns.db
+- debug messages converted to trace messages in move_reasons.c
+
+2.7.4 released December 17, 1999
+
+- caching of read results fully disabled when stackp>=depth
+- dead code cleaned away from reading.c
+
+2.7.3 released December 16, 1999
+
+- minor tuning
+- cleanup of patterns and helpers
+- cleanup of matchpat()
+- attack and defense patterns moved from patterns.db/patterns2.db to
+  new files attack.db and defense.db
+- attack and defense patterns matched during make_worms()
+- error message instead of segmentation fault when using -L without -l
+- testmode output modified
+- cleanup of ttsgf.c, ttsgf_read.c, and ttsgf_write.c
+- improved configure detection of snprintf
+- cleanup in Makefile.am and patterns/Makefile.am
+- configure tests for gcc specific macro __FUNCTION__
+- bugfix in sgf/Makefile.am
+- in break_chain, removed stackp<depth contingency
+- bug fix in break_chain2
+- two calls to naive_ladder removed
+- fixed two uses of DEPTH where depth was intended in reading.c
+- FIXME's in reading.c addressed
+
+2.7.2 released December 12, 1999
+
+- bugfixes in patterns/Makefile
+- cleanup of sgf.c, sgfgen.c, sgf_utils.c, and sgfana.c
+- bug fixed in small_semeai which could cause crash
+- remember to close file in play_gmp.c
+- Jago mentioned in README
+- All worm_data and dragon_data fields documented in DRAGON
+- code specific to old generation scheme cleaned away
+- file attdef.c removed
+- fuseki.c reverted to version 2.3.47 and slightly modified
+- cleanup of genmove.c
+
+2.7.1 released December 10, 1999
+
+- minor tuning
+- bugfix in defend4
+- cleanup of Makefile.am
+- minor tweak of move valuation
+
+2.5.46 released December 6, 1999
+
+- bugfix in autoconf test for glib-config
+- minor tuning
+- defend_both() tries a little harder to find an effective move
+- find_lunch() now also looks diagonally for food
+
+2.5.45 released December 2, 1999
+
+- minor tuning
+- bugfix in fill_liberty()
+- changed semantics for strategical defense in shapes()
+- reading.c: corrected a few places where the wrong return value was cached 
+
+2.5.44 released December 1, 1999
+
+- minor tuning
+- small tweak in move valuation
+- init_board() in joseki.c renamed to avoid collision
+- added assertion in filllib.c
+- removed assertions in vgprintf()
+- simplified handling of read result cache in reading.c
+- improved configuring for glib
+- AC_EXEEXT macro added for clean install on DOS/Windows
+
+2.5.43 released November 27, 1999
+
+- one new eye pattern
+- not_lunch_helper converted into an autohelper function
+- minor revision of hoshi.sgf
+- numerous old style patterns no longer considered by new move generation
+- tuning of patterns2.db
+- new reading function: naive_ladder()
+- docs/DRAGON updated with information about worm.cutstone2
+- further cleaning of liberty.h
+
+2.5.42 released November 24, 1999
+
+Makefile.am
+- added a dist-hook rule (see automake documentation)
+  to remove the built source from patterns.c from the
+  distribution prior to tar-zipping it.
+NEWS
+- added line containing version number. with the --gnits
+  option make dist checks for the presence of the version number
+patterns/Makefile.am
+- activated the BUILT_SOURCES macro for conn.c patterns.c eyes.c
+sgf/Makefile.am
+- removed $(srcdir) from BUILT_SOURCES macro. Otherwise
+  automake won't run. This apparently doesn't break VPATH
+  building.
+- added sgf_properties.h to noinst_HEADERS. Otherwise it isn't
+  added to the distribution.
+src/Makefile.am
+- added a noinst_HEADERS macro. Otherwise the headers don't go
+  into the distribution.
+
+2.5.41 released November 23, 1999
+
+- bugfix in defend2
+- cleanup of liberty.h
+- one new pattern in conn.db
+- move generation considers the strategical value of saving lunches
+- joseki patterns retuned
+- minor revisions of patterns.db
+- tuning of patterns2.db
+- ko stones considered dead
+- tweaks in move generation code
+- bugfix in make_worms()
+
+2.5.40 released November 21, 1999
+
+- empty SUBDIR macros removed
+- file- and directory names assigned to the EXTRA_DIST macros
+
+2.5.39 released November 21, 1999
+
+- default backfill_depth reduced to 8
+- bugfix in defend1
+- prioritization of moves in attack3 and defend3
+- bugfix in attack2
+- one new eye pattern
+- several new move reasons
+- several new pattern classes
+- maximum number of patterns increased to 3000 in mkpat.c
+- minor tuning of patterns.db
+- block/expand and fuseki patterns adapted to new move generation scheme
+- bugfixes and tweaking of move generation
+
+2.5.38 released November 14, 1999
+
+- bugfixes in the move valuation debug output
+- various tweaks to the move valuation
+- new move reasons: attack_either and defend_both (e.g. double atari)
+- minor tuning of patterns.db and patterns2.db
+- revised heuristics for dragon vitality
+- eliminated a compiler warning in reading.c
+- safe_move() now accepts moves that can only be captured with ko
+- patch to automake in docs/automake-1.4.patch
+
+2.5.37 released November 13, 1999
+
+- move valuation core rewritten
+- missing reasons added to list_move_reasons()
+- two new eye patterns
+- improved debug output in recognize_eye()
+- minor tuning
+- change_attack and change_defense modify worm.attack and worm.defend
+- attack2 and defend2 try a few extra possibilities
+- revised small_semeai
+
+2.5.36 released November 11, 1999
+
+- minor revision of docs/MOVE_GENERATION
+- "pass" ignored in nngs_endgame()
+- two new patterns in conn.db
+- minor tuning of patterns.db and patterns2.db
+- bugfix in make_worms()
+- minor code restructuring in move_reasons.c
+- some test code in moyo.c disabled
+- bugfixes and changes to --testmode
+
+2.5.35 released November 7, 1999
+
+- bugfix in break_through()
+- cleanup in moyo.c
+- cleanup in worm.c
+- revisions to docs/READING
+- bugfix in find_defense
+- revision of ko code in attack2 and break_chain2
+- two new find_lunch patterns
+
+2.5.34 released November 6, 1999
+
+- new function try_ko() based on trymove() takes an illegal ko
+- optimization: defend2 tries the move that gives more liberties first
+- ko modifications to break_chain, break_chain2, defend2 and attack3
+- new field ko_depth and -K (--kodepth) options
+- ko_depth and fourlib_depth set to 0 during make domains
+- numerous minor changes to ko reading
+- bugfix in updateboard
+- break_through() fully implemented
+- tuning of patterns2.db
+- one new connections pattern
+
+2.5.33 released November 5, 1999
+
+- new pattern class Q for patterns which should not be used with the new
+  move generation scheme
+- bugfix in fuseki.c
+- minor tuning of patterns.db and patterns2.db
+- retuning of cutting and connecting moves
+- shape value added also to old style moves
+- list_move_reasons() contingent on verbose rather than debug flag
+
+2.5.32 released November 3, 1999
+
+- temporary modification of depth values restructured
+- bugfix in fill_liberty()
+- minor tuning
+- one new connections pattern
+- one new eye pattern
+- new auxiliary reading function: break_through()
+- corresponding autohelper functions
+- sigterm_handler set in main() independently of any command line switches
+- command "defend" in ascii mode now works on any node
+
+2.5.31 released November 1, 1999
+
+- two new eye patterns
+- further revision of TODO
+- new file: docs/MOVE_GENERATION
+- the new move generation scheme has been made the default
+
+2.5.30 released October 31, 1999
+
+- defend1 and break_chain try harder to make a ko defense the last resort
+- small_semeai_analyzer ignores strings with 2 liberties
+- tweak in breakchain2 may yield a speedup
+- bugfix in is_ko
+- fourlib_depth++ in several places
+- does_defend() slightly rewritten parallel to does_attack
+- change_defense and change_attack adjust worm.codes
+- minor changes to patterns.db (mostly comments)
+- decidestring reports ko result
+- show_dragons() tells about ko status
+- README, TODO, INSTALL, and gnugo.6 revised
+- bugfixes in the makefiles to allow compilation in a separate directory
+- bugfix in conn.db to stop amalgamations over ko
+- debug message removed from induce_secondary_move_reasons()
+- retuned old style moves in the new move generation scheme
+
+2.5.29 released October 29, 1999
+
+- extended statistics collection
+- revisions of hoshi.sgf, conn.db, patterns.db, and patterns2.db
+- joseki.c changed to generate antisuji patterns for value 0 moves
+- more new move generation code
+- three helpers replaced by constraints
+- bugfix in defend_both()
+
+2.5.28 released October 26, 1999
+
+- revised eye patterns
+- revised connection patterns
+- more new move generation code
+- revision of patterns2.db continued
+- bugfixes in change_defense() and change_attack()
+
+2.5.27 released October 24, 1999
+
+- reading code now considers ko relationship
+- new worm fields attack_code and defend_code contain ko data
+- attacker and defender consider ko relationship
+- renaming and reordering of reading functions
+- revised eye patterns
+- bugfix in sgfana.c
+- minor tuning
+- more new move generation code
+
+2.5.26 released October 23, 1999
+
+- new connection pattern
+- antisuji and shape value patterns in patterns2.db
+- effective size measure implemented for worms and dragons
+- more new move generation code
+- support for %f in vgprintf()
+       
+2.5.25 released October 21, 1999
+
+- basicnet4 attacks by defending a boundary string
+- option -F enabled correctly
+- more new move generation code
+- partial revision of patterns2.db
+- bugfix in recognize_eye()
+- a few new patterns and major cleanup of eyes.db
+- new functions attack_either(), defend_both(), and play_attack_defend2_n()
+- new autohelper functions corresponding to attack_either and defend_both
+- documentation updated accordingly
+- one connection pattern taken out
+- minor tuning
+       
+2.5.24 released October 18, 1999
+
+- bugfix in caching of reading results
+- improvement in small_semeai()
+- minor tuning
+- new file: patterns2.db; intended for new move generation scheme
+- slight changes in shapes.c for new move generation
+
+2.5.23 released October 17, 1999
+
+- bugfixes in debug output
+- bugfix in sgf territory output
+- enhanced basicnet3()
+- always use worm origin in caching of reading results
+- revised eye patterns
+- trivial bugfix in nngs_endgame()
+
+2.5.22 released October 14, 1999
+
+- new eye patterns
+
+2.5.21 released October 12, 1999
+
+- minor tuning
+- cleanup of play_ascii.c
+- NNGS customization option in play_ascii()
+- one new eye pattern
+- small change in 9x9 fuseki play
+- more experimental move generation code
+- instructions for playing from Cgoban moved from INSTALL to README
+
+2.5.20 released October 10, 1999
+
+- tuning
+- 13 helpers replaced by constraints
+- action lines introduced in the patterns database to complement the
+  constraints
+- zero-valued joseki moves now generate antisuji moves (only effective in
+  the new move generation scheme)
+- more experimental move generation code
+- new file: src/move_reasons.c
+- bugfix in load_sgf_file()
+- many new eye patterns
+- cleanup in liberty.h and optics.c
+- new diagnostics in compute_eyes()
+- in basicnet4 we only consider safe attacking moves
+- speedup in basicnet4 for isolated stones and probably other strings  
+
+2.5.19 released October 9, 1999
+
+- new cutstone concept in the experimental move generation
+- minor tuning
+- bugfixes in fill_liberty()
+- bugfix in the handling of lunches
+- bugfix in the improvement of attack and defense points
+- stray patterns in eyes.db relocated
+- autoconf test for glib hopefully working properly
+- some remaining references to hey.db removed
+
+2.5.18 released October 7, 1999
+
+- reduced V_OBA in fuseki.c
+- minor tuning
+- more experimental move generation code
+- new patterns in eyes.db
+- bugfix in fill_liberty()
+- test legality and safety of move much earlier in shapes_callback()
+- autoconf test for glib so snprintf() can be replaced by g_snprintf
+  if unavailable
+- minor change in endgame() output to work around bug in NNGS connecting
+  program
+
+2.5.17 released October 5, 1999
+
+- cleanup of hash.h
+- new function in utils.c: find_origin()
+- attack() and find_defense() represent strings with their origins,
+  improving the efficiency of the caching strategy.
+- backfill depth decreased from 14 to 10
+- optimization and a little cleanup in make_worms()
+- bugfix in value_move_reasons()
+- three initializing functions tidied away from global view
+
+2.5.16 released October 4, 1999
+
+- one new eye pattern
+- more experimental move generation code
+- cleanup of main.h, worm.c, and matchpat.c
+- improved diagnostic error messages in moyo.c
+- bugfix in moyo.c
+- new numbering scheme for eyes.db
+- bugfix in small_semeai()
+- '*' can now be used as label in autohelper functions
+- minor tuning
+- backfill depth increased from 8 to 14.
+
+2.5.15 released October 3, 1999
+
+- new small_semeai() resolves semeais involving worms with 3 or 4 liberties
+- bugfix in only_atari_helper
+- no message in change_attack helper if both ti and worm[ai][aj].attacki==-1
+- minor changes in patterns.db (mostly comments)
+
+2.5.14 released October 1, 1999
+
+- small changes and cleaning in ttsgf_read.c
+- new experimental attacker/defender code
+- minor revisions of hoshi.sgf and patterns.db
+- removed unused function mark_defenses()
+
+2.5.13 released September 29, 1999
+
+- reading code tries to attack strings with 4 liberties
+- new function savestone4
+- help string: options --depth etc. are not debug options as they
+  affect playing strength so these are in main help string now
+- bugfix in dragon_status: dragons rescued by ko are not DEAD
+- continued cleaning of moyo.c
+- one new pattern in eyes.db
+       
+2.5.12 released September 28, 1999
+
+- tuning
+- bugfix in two_bird_helper
+- the last few helpers updated to use change_attack() and change_defense()
+- copyright messages in joseki sgf files replaced by a patterns/README
+       
+2.5.11 released September 26, 1999
+
+- tuning
+- revised "You stepped on a bug" message
+- new pattern in eyes.db
+- revised joseki in hoshi.db
+- komi initialized in main.c
+
+2.5.10 released September 22, 1999
+
+- important bugfix in moyo.c, fixing an indexing out of bounds error.
+- tuning
+
+2.5.9 released September 21, 1999
+
+- cleanup of showbord.c
+- hashitem renamed hashdata
+- tuning
+- more debug info in moyo.c
+
+2.5.8 released September 20, 1999
+
+- bugfix in fuseki.c to avoid passing if opponent plays on first line
+- tuning
+- error messages in moyo.c redirected to stderr
+
+2.5.7 released September 16, 1999
+
+- added src/utils to patterns/ Makefile includes
+- tuning
+- remember to add center stone in sgf file in sethand()
+
+2.5.6 released September 15, 1999
+
+- minor changes for Windows support
+
+2.5.5 released September 13, 1999
+
+- more informative renaming of variables in moyo.c
+- added #include "getopt.h" to mkpat.c
+- check setlinebuf(), if not available use setbuf() in play_ascii.c
+- check snprintf(), if not available redefine to g_snprintf() (glib)
+- new file docs/WINDOWS
+
+2.5.4 released September 12, 1999
+
+- bugfix with --analyze --score: analyze the correct move
+- make install now copies gnugo.6 to /usr/local/man/man6
+- we do not install mkpat, joseki, mkeyes or sgfgen
+- gnugo.6 moved to top directory
+- revisions to documentation
+- docs/structure.doc is eliminated
+- docs/BOUZY renamed MOYO
+- patterns/fuseki2.sgf is back in patterns/
+- suppression of many messages when running --quiet
+- bugfix in fuseki.c which could cause illegal moves
+- bugfix in fuseki.c: do not set i,j then return 0
+
+2.5.3 released September 10, 1999
+
+- bugfix in make_worms: typo in adjacent worm code
+- bugfix in trymove() and legal(): check ko color
+- tuning and cleanup of patterns.db
+- bugfix in filllib preventing rare illegal moves
+- bugfix in hashing code
+- MAX_HANDICAP set to 9
+
+2.5.2 released September 7, 1999
+
+- revision of --help
+- revision of documentation
+- separation of globals. New file src/globals.c
+- further revision of moyo.c: dilation revised
+- bugfix in filllib preventing rare illegal moves
+- tuning
+
+2.5.1 released September 3, 1999
+
+- delta_moyo_simple() checks for isolated groups like delta_moyo()
+- new function average_moyo_simple()
+- docs/BOUZY updated
+- reimplementation of erosion
+- patch to sgfana.c using multiple character names
+
+2.3.94 released September 3, 1999
+
+- Tuning
+- Renumbering and cleanup of patterns.db
+- Bug fix in linear_eye_space().
+- load_sgf_file() gets the right color to move at end of file
+- Various small corrections.
+- backfill_depth is now 8
+
+2.3.93 released September 2, 1999
+
+- bugfix in recognize_eye
+- bugfix in readlad1: use null pointers in readlad2 call
+- fill_liberty() rewritten recursively with backfilling
+- atari_save_helper replaced by constraint.
+- tuning
+- Previous change to moyo_assistance reimplemented correctly
+- sethand() places fixed handicap stones as traditional
+
+2.3.92 released September 1, 1999
+
+- Two new eye patterns
+- Bug fix in filllib.c, avoiding a possible assertion failure
+- Use delta_moyo_simple() in moyo assistance function
+- Tuning
+- gnugo complains about wrong boardsizes
+- avoids some warnings in sgfana.c
+- now -o in ascii mode works with handicap stones
+- bugfix in readlad2
+- bugfix in basicnet3
+- docs/OVERVIEW updated
+
+2.3.91 released August 27, 1999
+
+- warnings when compiling with ncurses are hopefully fixed
+- The connections code no longer amalgamates attackable worms
+- Bug fix in the topological halfeye code. 
+- uncovered a problem with halfeyes in the eyes code, documented in a FIXME
+- Minor tuning.
+- Bug fix in the linear eyes code.
+- Random bonus taken into account in the TRACE prints in shapes.
+- fill_liberty() completely rewritten
+- destroyer taken down
+
+2.3.90 released August 26, 1999
+
+- hey.db removed from distribution
+- we no longer give a point for a pass and compel white to pass last
+- play_solo.c and genmove.c: calls to snprintf changed to sprintf
+- revisions to documentation, and to NEWS, AUTHORS, README, INSTALL
+- partial cleanup of main.c
+- one new eye pattern
+- worm.cut field moved to eye_data structure and initialized properly.
+- Added endgame patterns to fix one non-finish bug
+- Replaced movenum by move_number() in play_solo.c.
+- Removed dead code from dragon.c and liberty.h
+- Minor cleanup in worm.c
+- One new cut pattern in conn.db
+- sente_hane1_helper replaced by constraint
+- Bugfix in computation of max weight in mkpat.c
+- Tuning
+
+2.3.89 released August 25, 1999
+
+- bugfix in eye_finder
+- one new eye pattern
+- gaminfo.seed is set
+- handicap stones added when not present. 
+  (Doesn't work with "-l filename --mode ascii")
+- revision to documentation
+- message about unimplemented commands removed from ascii help
+- One new connection pattern in conn.db.
+- Revised connect_under_helper and 
+- replaced safe_hane_helper by a constraint
+- Revised some joseki values in hoshi.sgf
+- Tuning of patterns.db.
+
+2.3.88 released August 23, 1999
+
+- board size bug fix in moyo.c
+- fuseki.c: 3-3 invasion deprecated in 9 stone fuseki
+- New joseki in hoshi.sgf (tsukenobi variation and one 3-3 invasion)
+- tuning
+
+2.3.87 released August 22, 1999
+
+- eye.esize-eye.msize>7 is alive in recognize_eye
+- several eye patterns added
+- dragon_status: escape_route bound for CRITICAL upped to 6
+- -o and --analyzerfile add handicap stones by AB,AW
+- in nonfile modes the handicap stones are added in sethand() 
+- sethand() checks for max handicap values and returns actually set stones 
+- reduced MAX_HANDICAP to 19
+- main.c checks for MAX_HANDICAP
+- sgf_close_file is called only once, when ending ascii mode with "quit"
+- GM property added in --analyzerfile
+- HA property added in --analyzerfile (in sethand())
+- defined MIN_BOARD 3 in liberty.h
+- help output shows MIN_BOARD, MAX_BOARD and MAX_HANDICAP
+- cleanup of shapes.c, optics.c and moyo.c
+
+2.3.86 released August 21, 1999
+
+- resolved: hashed functions shall be readlad2 and basicnet3
+- connection code patch to reconcile amalgamation and cutstone
+  classification (needs rewriting)
+- tuning
+- amalgamate over _dead_ ko positions
+- bugfix in not_lunch_helper
+- Changed semantics of play_attack_defend_n()
+- unused color parameter removed from get_read_result
+- no compiler warnings under GNU/Linux
+- man page docs/gnugo.6 added
+- convenient tcsh completion described in docs/MISC
+
+2.3.85 released August 20, 1999
+
+- configure option --disable-hashing now functional
+- values are not hashed when stackp>depth
+- cleanup of mkpat.c
+- cleanup of eyes.h
+- tuning
+- now prints number of eyes in analyzerfile with --analyze eyeinfo
+
+2.3.84 released August 18, 1999
+
+- tuning
+- cleanup of dragon.c
+- halfeyes.c removed from the distribution
+- configure option --disable-hashing sets HASHING to 0
+- sgf.c: avoid trying to close output file twice
+- eyes.db: code # has been changed to @ to avoid conflict with comments
+- Revised compute_eyes() and split off linear eyes to an own function.
+- Made return value from recognize_eye() more consistent.
+- New autohelper functions to identify eye space points: eye(),
+  proper_eye(), and marginal_eye()
+- Major revisions of endgame patterns, taking eye space into account
+- obsolete functions play_attack_defend2() to play_attack_defend8() removed
+
+2.3.83 released August 15, 1999
+
+- joseki.c upgraded to generate constraints in .db
+- 3 new autohelpers in mkpat.c: diff_moyo, area_space, area_stone
+- interface/play_test.c: bugfix when --testmode and --analyze are combined
+- CHECK_HASHING turned off
+
+2.3.82 released August 14, 1999
+
+- hash codes are now computed incrementally
+- bugfix in hash.c
+- reading.c: sacrifice only if stackp<backfill_depth to avoid slow reads
+- sgf.c and main.c: --decidestring works with small boards
+- cleanup of src/attdef.c
+- update: doc/MISC
+- play_ascii: new commands HELPDEBUG, GOTO, DEFEND, SHOWMOYO, SHOWTERRI, 
+  SHOWAREA, SHOWDRAGONS, SAVE, and LISTDRAGONS
+- play_ascii: command COMMENT now only writes to analyzerfile
+- analyze: new commands AREACOLOR, DEFENSE, MOYOVALUE, TERRICOLOR, TERRITORY, TERRIVALUE
+- abortgo saves abortgo.sgf independent of any -o or --analyzerfile
+
+2.3.81 released August 11, 1999
+
+- new function number_weak returns the number of weak groups
+- little tuning in hoshi.sgf
+- major update of all fuseki.c
+- change in --playstyle options, new fuseki become the default
+- added stone color NONE in liberty.h for use with set_computer_player()
+- new function capture in ascii mode 
+- new function last in ascii mode
+- bugfix: sethand does not set handicap stones to sgf tree any more
+- bugfix: testmode game with --analyze skips variations 
+- new sgfana.c with analyze functions and gnugo specific parts of ttsgf.c
+- new function sgfTriangle()
+- new function sgfMarkWorm()
+- bugfix: analyze function recommended switched off as default
+- new analyze function capture
+
+2.3.80 released August 10, 1999
+
+- Implement hashing for attack() and find_defense()
+- option -H = --hash allows user to specify which functions use hashing
+- cleanup of sethand.c
+- cleanup of semeai.c
+- option --playstyle <style>, replace old --fuseki and --fearless
+
+2.3.79 released August 10, 1999
+
+- hash.h: bugfix which caused reading errors in rr_set_result_ri_rj
+- reading.c: savestone2 looks for double ataris to chain when stackp>depth
+- updated docs/MISC: analyze functions
+- option --analyze works again (was temporarily off by accident)
+- option --analyze works in --testmode game, no variations tested
+- new analyze functions: moyocolor, recommended, eyeinfo, worminfo
+- bug fix in analyze function eyes
+- option --score last --analzyerfile saves the potential territory with TW,TB
+- option --statistics writes also to analyzerfile
+- abortgo() saves analyzerfile 
+- ttsgf.c: ttsgf_move_made() removed
+- play_solo.c: timing added to benchmark mode
+
+2.3.78 released August 7, 1999
+
+- hashing in basicnet3 and savestone3
+- bugfix in play_gmp.c: undo now seems to work!
+- sgf/sgf_utils.c: bugfixes in get_moveX and get_moveY
+- interface/play_solo.c: bugfix in get_moveXY
+
+2.3.77 released August 5, 1999
+
+- showbord.c: revised behavior of -E option
+- minor change in moyo.c to have it reinitialized when a game is reloaded
+- change in scoring system for compliancy with chinese & japanese style rules
+- ascii mode: save territory points to analyzerfile 
+- gmp mode: log game in sgf tree
+- gmp mode: undo implemented by replaying sgf tree
+- gmp mode: save result and territory points to analyzerfile
+- ttsgf.c: new function sgfOverwritePropertyInt()
+- ttsgf.c: new function sgfAddStone()
+- sethand.c: sets handicap stones to sgf tree
+- hash.diff removed from distribution
+
+2.3.76 released August 4, 1999
+
+- interface/html directory contains cgi interface
+- bugfix in optics.c: initialization of domains
+- bugfix in reading.c: some variations were being overlooked
+- hashing implemented in savestone2
+
+2.3.75 released August 2, 1999
+
+- mark illegal moves in --printsgf with IL property
+- Some new macros in hash.h
+- Use hashing in readlad2 
+- Some cleanup of worm.c
+- option -f rewritten : opening tuning, including oba moves
+- non fuseki part of old -f option became --fearless option
+
+2.3.74 released August 1, 1999
+
+- bugfixes in helpers.c. One of these could cause a crash
+- two connection patterns increased substantially
+- moved get_komi() and inc_movenumber() to liberty.h
+- play_ascii(): new commands to navigate the game tree in ascii mode
+- back command (undo) implemented in ascii mode! Newly placed
+  stones appear as variations in the sgf
+- play_ascii(): changed the compare length of some commands. Now q works
+  for quit, b for back and f for forward.
+- removed bug in play_ascii(): user pass after computer pass did not
+  display result.
+- fixed bug in helpanalyzer output
+- utils.c: added function intialize board() and removed remove_stone()
+- fixed the komi bug reported by Douglas in --analzyerfile
+
+2.3.73 This version may be released later
+
+2.3.72 released July 30, 1999
+
+- bugfix in updateboard ko handling
+- Moved obsolete documentation about reading.c to doc about utils.c
+- Expanded documentation about reading with hashing
+- minor tuning
+
+2.3.71 released July 29, 1999
+
+- bugfix in make_worms: moving point of defense
+- fixes to handling of ko after a pass
+- updatepassmove() removed
+- updateboard now handles pass moves.
+- KO handling by trymove is currently broke
+- play_ascii.c, play_gmp.c, play_solo.c updated accordingly.
+- revisions to ascii interface.
+- legal() now reports a pass move to be legal.
+- revision of one eye pattern
+- tuning to increase attention to connections
+- 2 new helpers
+- mkpat: weak autohelper option needed ==CRITICAL
+- modified worm values
+
+2.3.70 released July 28, 1999
+
+- Zobrist hashing implemented
+- new files src/hash.h and src/hash.c
+- readlad1 uses hashing
+- readlad2 does consider 2 stone sacrifices if stackp<backfill_depth
+- revised method of ko detection using
+- New file docs/HALFEYES describing the topology of false eyes and half eyes.
+- Halfeye detection rewritten from scratch according to docs/HALFEYES.
+- Revisions to connection code.
+- A small amount of tuning.
+- Dragon values changed when worm values are.
+- Designation of marginal eye spaces revised to consider if enemy has a safe move
+- Bugfix in worm.c
+
+2.3.69 released July 27, 1999
+
+- bug fix in connections.c
+- two false eye patterns added
+- one pattern added
+- readlad2 sorts liberties before plunging in to the read
+- readlad2 rejects sacrifices of more than one stone
+- bugfix in shapes.c
+- in worm.c we sometimes try point of attack for defense
+- removed the -b bug 
+- removed some warnings
+- ascii mode: new command comment writes one line comments to file
+- ascii mode: new command score displays terri_eval
+- ascii mode: new command dead  shows dead stones as lower letters
+- ascii mode: at end shows dead dragons, lets user toggle their state
+- ascii mode: REsult propterty is written to analyzerfile
+- new command line option helpanalyze
+- option --score end outputs territory points (TW,TB) to analyzerfile
+- utils.c: new function remove_stone
+- utils.c: new function change_dragon_status
+- main.c:  added shortcut for --help to the help message
+- ttsgf.c: reduced the memory consumption of the sgf structure
+- liberty.h: made the dragon structure public
+
+2.3.68 released July 26, 1999
+
+- Tuning, seki patterns.
+- New connection patterns.
+- Revision of connections code.
+- New helpers.
+- eye_finder() now considers shape's move as defender() and attacker() do
+- Cleaning up and bug fixes in attdef.c.
+- More debug messages for the eyes code.
+- Bug fixes in compute_eyes() and play_attack_defend_n().
+- Bug fix in shapes.c: TRACE was missing an argument
+- fixed testwind compiler warning
+
+2.3.67 released July 25, 1999
+
+- bugfix in attacker: depth was changing each move
+- A class patterns, analogous to the D class, implemented but not tested
+- B and C classes can now be used in the same pattern.
+- The meta_connect bonus now specified with a new field
+- doc/PATTERNS revised
+- the oplay_attack() and similar autohelper functions documented
+- meta_connect bonus removed from most patterns except block/expand
+- Weakness bonuses are now applied at a later time than they were.
+  Thus B and C patterns are treated the same as patterns using helpers
+- A 5,5 weakness bonus added to all cut/connect patterns 
+- diag_miai2 helper revised.
+- Some tuning.
+- shapes.c cleaned up.
+- revisions in interface/play_ascii.c
+- substantial revision in sgf/ttsgf.c
+- new option --analyzerfile (see docs/MISC)
+- docs/SCORING is renamed docs/MISC
+
+2.3.66 released July 23, 1999
+
+- make_worms: bugfix in resetting of worm.attack and worm.defend 
+- bugfix in does_defend
+- new autohelper macros
+- play_attack_defend_n can take an arbitrary number of parameters
+- function who_win renamed who_wins for grammatical reasons
+- play_gmp.c: if there is a handicap we assume komi=0.5
+- play_solo.c: captures not added a second time
+- new patterns in eyes.db
+- some tuning
+- sgf.c: pass is [tt] unless board_size>19
+- depth and backfill_depth are augmented in attacker() and defender()
+- bugfix in printsgf mode
+- sgf_printboard prints current board position to sgf file
+- LOAD_AND_PRINT mode: read file, output final position
+
+2.3.65 released July 21, 1999
+
+- dragon_eye does not amalgamate across an ikken tobi
+- play_ascii.c: change depth on the fly
+- new option --statistics
+- revision of various helpers and 2 new helpers
+- mkpat rewritten so constraints can now be on several lines.
+- New autohelper functions xplay_attack, oplay_attack, xplay_defend,
+  and oplay_defend, which take variable number of arguments.
+- New functions in utils.c to support the above.
+- tuning
+- bugfix in sethand.c
+- increased DEPTH to 14 and BACKFILL_DEPTH to 7
+- change_attack can sometimes reclassify dragons as DEAD
+- command line resetting of depth
+
+2.3.64 released July 20, 1999
+
+- reformatting of reading.c
+- bugfix in break_chain2
+- revised basicnet3: try harder to rescue boundary chains
+- revised basicnet3: remember moves tried to avoid redundant reading
+- bugfix in find_lunch: pick juciest worm
+- sgf property PL implemented in play_solo
+- revisions in play_solo.c and fuseki.c for small boards
+
+2.3.63 released July 19, 1999
+
+- delta_moyo, delta_terri work with either color
+- 2 new functions diff_terri and diff_moyo, 
+- cleanup of moyo.c
+- -f option revised
+- docs/BOUZY revised
+- new docs/SCORING
+- New autohelper functions.
+- New connection patterns and revisions of the connections matching code.
+- Bugfix to an eye pattern.
+- Much tuning.
+- Revised criterion for when to defend or attack a worm.
+- Extended the scope of destroyer().
+- Experimental worm and cut revaluation in light of dragon formations
+- Changed heuristics for eye values of non-matched eye shapes.
+- reordered arguments to does_attack() and does_defend()
+- bugfix in readlad2: backfill was turned off
+- default backfill_depth is now 5
+- -l and -o options can be - for stdin and stdout
+
+2.3.62 released July 17, 1999
+
+- New autohelper functions, xlib(), olib(), xcut(), and ocut().
+- Revised documentation for autohelper functions.
+- Connections database introduced. New files: connections.c and conn.db.
+- find_dragon_pairs() disabled, replaced by connection patterns.
+- Cutting patterns from the connection database can modify eye spaces.
+- Amalgamation in dragon_eye() no longer done over marginal eyes.
+- mkpat partially rewritten.
+- Minor correction to eyes.db.
+- Nakade helpers cleaned away.
+- Minor tuning,
+- two more nakade like patterns removed, EC63 again C   pattern.
+- Bug fix in attacker(): discount bad captures, not good ones
+- New function destroyer() to capture of strings that can't currently
+  be defended, but which could be after opponent backfilling
+- Some cleaning in genmove.c.
+- Attack points of non-defendable strings not moved in make_worms
+- defense points added for adjacent non-defendable strings so
+  dragon amalgamation won't confuse semeai()
+- new function read_sgf_header used by load_and_analyse_sgf_file
+- new function load_and_score_sgf_file
+- new option --score and new mode LOAD_AND_SCORE
+- new function evaluate_territory
+
+2.3.61 released July 15, 1999
+
+- nakade patterns are gone
+- only linear patterns are currently hand-coded
+- many new eye patterns
+- not_lunch_helper aids in hane/kill combinations
+- undid a change in 2.3.59: amalgamation on first line
+
+2.3.60 released July 15, 1999
+
+- TODO revised
+- copyright revised in interface/ files
+- new pattern in eyes.db
+- halfeyes: require O not dead
+- revision of detect_trap_helper
+- revision of one pattern in hey.db
+- new ko patterns
+- other minor changes
+- new functions does_attack and does_defend in utils.c
+- attacker and defender call these functions
+- copyright notice slightly changed in main.c
+- reformatting of worm.c
+- unwanted handicap printf removed from play_gmp.c
+
+2.3.59 released July 14, 1999
+
+- revision of docs/DRAGON
+- several new eye patterns
+- fair amount of tuning. Particularly, changes to diag_miai patterns
+- dragon.c: we don't amalgamate a dragon if it touches the eyeshape
+  only on the first line
+- COLOR_STACK_SIZE increased to 70
+- DEBUG used in optics.c
+
+2.3.58 released July 13, 1999
+
+- mkpat revised. Autohelper functions now can take multiple parameters.
+  First out is defend_against(a,b) which plays our own stone at a and
+  then checks whether the opponent can safely play at b.
+- some tuning of patterns.
+- new function defend_against() in utils.c
+- bugfix in compute_eyes(): missing returns
+- two new eye patterns
+- bugfix in add_half_eye
+- more refined testing of att_X case in halfeyes.c
+- halfeye: obsolete test that eye and halfeye are in distinct cavities omitted
+- halfeye: we check that * is a safe move for X
+- restored marginal test in throw_in_atari_helper (removed in 2.3.55)
+- superceded docs/GRAPHS removed from distribution
+- filllib.c reformatted
+
+2.3.57 released July 12, 1999
+
+- count and chain rewritten for speed
+- more graceful error message if no in file specified in testmode
+- eye pattern 10 needed a vital point
+- find_lunch and make_worms: a ko is not lunch
+
+2.3.56 released July 11, 1999
+
+- add_half_eye: when a half eye's vital point is in another eyeshape 
+  the eyeshapes are amalgamated. This is correct and stops some crashes
+- computer tries to compute the score at end of game
+- new function who_win in moyo.c
+- one chimera pattern included in eyes.db
+- bugfix in attdef.c: color in territory test
+- bugfix in showbord.c: display of capture count
+
+2.3.55 released July 9, 1999
+
+- integration of half eye and eye code
+- separate eye domains for black and white
+- revision of docs/EYES to document the algorithm
+- a couple of changes that will be undone in a later release:
+  temporary oversimplification of treatment of att_X in hey_callback
+  temporary oversimplification of throw_in_atari_helper
+- removal of one half eye pattern
+- experimental penalty for running inside enemy territory
+- bug fix in semeai.c
+- revision in showboard for -E option
+
+2.3.53 released July 8, 1999
+
+- reading.c: new function special_rescue finds certain saving moves
+- revisions to savestone2 including use of special_rescue
+- speedup in find_lunch
+- minor revisions to hey.db and eyes.db
+- bugfix in mkpat (this could cause compilation failure)
+- bug fix in make_dragons (ignore eyes when not relevant)
+
+2.3.52 released July 7, 1999
+
+- bugfix in setup_double_atari_helper (could cause crash)
+- minor tuning
+- revision make_domains: influence can't creep under third line stone
+- revision to find_lunch: if already eaten it's not lunch
+- revision in halfeyes.c vis a vis Pattern 12
+
+2.3.51 released July 6, 1999
+
+- revision of mkeyes
+- new function recognize_eye() for use by the reading code (unfinished)
+- revision of the -f option (move generator based on territory)
+- cleanup in helpers.c and replacement of helpers by constraints
+
+2.3.50 released July 4, 1999
+
+- gnugo -f implements search for big moves with delta_moyo>=12 
+- and delta_terri >=14. Such a move gets value 80. 
+- tuning
+- some work on false eye code
+- some work on the eye code
+- bugfix in double_atari_helper
+
+2.3.49 released July 2, 1999
+
+- Correction to sgf output from ascii interface.
+- Results of safe_move() are cached if stackp==0.
+- Helpers and some other code rewritten to use safe_move() 
+- Bugfixes in  block_attack_defend_helper and urgent_connect_helper
+- Reading bug fixed in savestone2().
+- tuning
+- autohelper options safe_xmove,safe_omove,xmoyo,omoyo,xarea,oarea,xterri,oterri
+- new function mkeyes to compile the eye database (unfinished)
+- docs/GRAPHS explains the approach to the eye code
+- revisions to eyes.db and eyes.h
+- in halfeyes.c we make an exception to the rule that X can't be captured
+- revisions to hey.db
+- dragons with one eye and lunch are CRITICAL
+- revisions to eye_finder to find such dragons
+- eyespaces are not connected through adjacent marginal eyes
+- various fields initialized in make_domains()
+- bugfixes in make_domains
+- bugfix in compute_eyes: sometimes found the wrong end of a linear space
+
+2.3.48 released June 29, 1999
+
+- experimental changes to fuseki.c
+- revisions to helpers and patterns
+- eye_finder() now calls sgf_move_considered()
+- revisions to compute_eyes: eye shapes of size 4
+- DEPTH is now 13, BACKFILL_DEPTH is 9
+- gnugo --help now prints defaults of depth and backfill_depth
+- bugfix in worm.c: some non-kos were incorrectly identified as ko
+
+2.3.47 released June 29, 1999
+
+- substantial speedup in chainlinks
+- minor tuning
+
+2.3.46 release June 28, 1999
+
+- tuning, new helpers and patterns
+- some half eye code restored to dragon.c
+- some further linear patterns in compute_eyes()
+- bugfix in savestone3
+- speedup in find_lunch: if stackp==0, we used cached info
+- in break_chain2 don't try certain foolish moves
+- speedup in basicnet3 (avoid unnecessary readlad1)
+
+2.3.45 released June 27, 1999
+
+- 3 new functions delta_terri_color, delta_moyo_color, delta_area_color
+- new board stack in moyo.c
+- BOUZY updated
+- bug fixes regarding half eyes in dragon.c and eyes.c
+- new code for some linear patterns
+- bugfix: dragons around a ko were getting amalgamated
+
+2.3.44 released June 25, 1999
+
+- bugfix in atari_save_helper (could cause crash)
+- revision to CD68 (could cause GNU to play out a ladder)
+- bugfix in dragon.c: incrementing msize wrongly
+- minor revisions to make_domains()
+- new functions int moyo_color(int m,int n) and int terri_color(int m,int n)
+  returning the color of the intersection as seen by terri & moyo modules
+- new function delta_moyo_simple() without meta_connect bonus, delta_moyo()
+  is now a wrapper to this one (should be a transparent modification)
+- diag_miai_helper uses the new moyo_color()
+
+2.3.43 released June 24, 1999
+
+- revisions to ascii interface
+- gnugo can resume adjourned games
+- gnugo plays through endgame phase of the ascii interface
+- much tuning
+- revisions to helpers and new helpers
+- in this version a weak group has between 0 and 20 points space
+- two half eye patterns are back. Half eyes still not working right
+- (incomplete) revision of eye code to deal with half eyes
+- bug fix in eyes.c regarding opponent stones within eyespace
+- tinkering with hoshi.sgf
+
+
+2.3.42 released June 23, 1999
+
+- weak groups now have between 4 and 20 liberties
+- diag_miai_helper won't recommend a move in opponent's territory
+- revisions to patterns/hoshi.sgf
+- mkpat.c: fields in NULL pattern at end of patterns.c corrected
+- mkpat.c: weak option added to pattern compiler
+- some tuning
+- dragon.c: error eye.msize was preventing us from finding false eyes
+- some code moved from eye.c to dragon.c to help finding false eyes
+- compute_eyes and propogate_eyes are now public functions
+- bugfix in shapes.c: obonus and xbonus should now work correctly
+- revisions to documentation
+
+2.3.41 released June 22, 1999
+
+- compute_eyes is partially written (without using matchpat)
+- revisions to computation of genus
+- openeyes is expunged
+- half eye database is invoked earlier
+- half eye database used only to find false eyes
+- bonus field split into obonus and xbonus
+- obonus and xbonus are applied to patterns involving weak groups
+- most EB patterns now have bonuses
+- 5 point bonus for patterns involving weak groups (2.3.38) is gone
+- some tuning
+- some bugfixes in eyes.c, dragons.c and semeai.c
+
+2.3.40 released June 21, 1999
+
+- substantial revisions and new code in dragon.c and eye.c
+- dragons around an eye shape are now amalgamated
+- delta_moyo looks in meta_connect for the tested move
+- Bug fixes for two helpers.
+- Minor tuning.
+- GNU now can read sgf files with missing final ")".
+- defender and the attacker try the move suggested by shapes()
+- The semeai player now prefers to play on mutual liberties if this
+  improves the liberty balance.
+
+2.3.39 released June 18, 1999
+
+- some tuning, new helper block_attack_defend_helper
+- eye code now fills out an array eye[][] with data
+- revision to eye algorithm
+- open eye spaces now have origins
+- bugfix with -E option
+- dead groups are now cyan in showboard (were white)
+
+2.3.38 released June 17, 1999
+
+- experimental bonus of 5 points to patterns involving a weak dragon
+- revision of patterns/hoshi.sgf: attachment variations deprecated
+- open eye shapes are now computed. Display these with gnugo -E
+- some tuning
+
+2.3.37 released June 16, 1999
+
+- weak groups no longer classed dragon.status==CRITICAL. Instead ...
+- new field dragon.weak
+- old worm.weak and dragon.weak renamed worm.lunch and dragon.lunch
+- weak groups (found by moyo) classed dragon.weak==CRITICAL
+- dragon.weak field not used by genmove but displayed by showboard
+- new helper wedge2_helper
+- tuning and other revisions to pattern database
+- src/eye.c code is now linked though not used by genmove
+- revisions to showboard to display eye domains if xo=1
+- int make_worms() (was void) returns 1 if board not empty
+- find_weak() renamed find_lunch()
+
+2.3.36 released June 15, 1999
+
+- weak groups are classed CRITICAL so they scrounge eyes
+- new function test_weak to find weak groups (in moyo.c)
+- revision to print_txt_color
+- bugfix in fill_liberties
+- revised docs/BOUZY
+- bugfix: find_defense no longer checks that strings can be attacked
+  which required some modifications, slowing us down a little
+- DEPTH reduced to 12
+
+2.3.35 released June 15, 1999
+
+- reading code is much faster now and hopefully also more accuracy. 
+- new function relative_break_chain() used in revised readlad2()
+- caching of moves eschewed in break_chain(), break_chain2() 
+  if return pointer is NULL
+- DEPTH increased from 10 to 13
+- new docs/READING explains using --decidestring -o with gdb
+- connect_under_helper() rewritten to use connection_value()
+- housecleaning in patterns.db
+
+2.3.34 released June 14, 1999
+
+- test for pass in play_solo.c corrected
+- tuning
+- new pattern classification: Edge Expansion
+- GNU tries in two ways to fill liberties (points in Chinese count)
+- before passing, DEAD opponent stones in semeai are reclassed
+  unknown, then shapes is rerun
+- if that doesn't work, new function fill_liberty() tries again
+- new field dragon.semeai, new function revise_semeai()
+- static_eval() is gone (superceded by moyo())
+- reading.c: new function savestone3()
+- reading.c: savestone2 no longer tries to find the best move since
+  we have ways to improve points of attack and defense
+- some code taken out of find_defense()
+- dump_stack() uses gprintf instead of TRACE and counts variation
+
+2.3.33 released June 12, 1999
+
+- new function meta_connect to test a move against area ownership 
+  (returns true when the move connects/disconnects meta groups)
+- area ownership now sees kosumi connections
+- minor changes in moyo.c data structures
+- in shape.c, added some bonus for meta_connect moves
+- in mkpat.c, some bonus added to maxwt for meta_connect moves
+- minor tuning
+- in readlad2() we consider throwins
+- Copyright updated (no longer says 2.0) in src/ and patterns/
+
+2.3.32 released June 11, 1999
+
+- substantial speedup of reading code
+- in savestone2, we try to find an easy saving move before reading
+- in savestone2, we don't try second move if first works
+- in readlad2, we postpone break_chain2 but not break_chain
+- option --decidestring -o now outputs variation numbers
+- bugfix in extend_to_kill_helper
+- embryonic src/eyes.c included in tar file
+
+2.3.31 released June 10, 1999
+
+- new globals last_move_i and last_move_j give the last move made. 
+  This is used to improve(?) ascii output.
+- fixed bug ascii play where the captured stones where added wrong
+- play_ascii and play_test start with move 0 like play_gmp
+- in ascii play the last move is now marked
+- bug fixed in ascii play when a pass is made
+       
+2.3.30 released June 9, 1999
+
+- reimplementation of of handicap in ascii without writing p[][]
+- new functions for saving/restoring game state without using stack
+- use inc_movenum instead of movenum++ in play_gmp and play_solo
+- revision to ko_important_helper: ko values cut in half
+- move_attack() and move_defense() renamed change_attack() and change_defense()
+- new komoku pattern
+- 2 new patterns
+
+2.3.29 released June 7, 1999
+
+- connection_value moved to src/util.c
+- alive11_helper modified
+- eschewing of kos by attacker() and defender(), dropped in 2.3.28 is back
+- edge_ko_important helper added
+- new sente_extend_helper, straight_connect_helper, block_to_kill_helper
+  extend_to_kill_helper, revise_value_helper
+- new half eye pattern
+- several new patterns and changes to patterns.db
+- moved some CC patterns from wrong section
+- now --color should work with ascii interface
+
+2.3.28 released June 6, 1999
+
+- bugfix (worm.c, shapes.c, helpers.c): propogate_worm not used with stackp>0
+- attacker() and defender() no longer eschew kos
+- unused sgfAddPlay is commented out (fixing a warning)
+- fixes to trace (indent is back, caves which are kos are reported correctly)
+- default backfill_depth is 7 (arrived at by trial and error)
+- option --decidestring no longer requires -o (useful with or without it)
+- in make_worms() code to improve worm.attack, worm.defend we now read
+  one step deeper in the stack to avoid horizon effect
+- initialization in propogate_worm() uses memset
+
+2.3.27 released June 5, 1999
+
+- new option -B [depth] should now work
+- default values of depth and backfill_depth are 10 and 5
+- new function mprintf which is similar to gprintf but writes to stdout
+- changed vgprintf to work with different outputs (i.e. stderr, stdout)
+- the testmode now write its output to stdout only (never stderr)
+- bugfix in backfire_helper
+
+2.3.26 released June 4, 1999
+
+- Backfill depth can now be set with -B [depth]
+- very minor revisions to patterns.db
+- reading.c: bc was not being initialized when stackp>0 (twice)
+
+2.3.25 released June 1, 1999
+
+- bug fix in new make_worm() code
+- connection_value gives a bonus if the connecting move makes 2 eyes
+- mystery pattern CB102 removed
+
+2.3.24 released May 30, 1999
+
+- tuning of joseki and patterns
+- revised definition of inessential worms --- require worm.weak==-1
+- new code in make_worms() to revise points of attack/defense
+- BACKFILL_DEPTH reduced to 4 due to increased slowness
+- basicnet4 included but turned off
+
+2.3.23 released May 29, 1999
+
+- asymmetry bug in moyo.c fixed: when init_moyo() is launched,
+  boardsize is not known
+- area computation and dilat algorithm bug
+- distribution includes reading.c.alt for the experimentally inclined
+- tuning and new helpers
+- dragon.c split into dragon.c and worm.c
+
+2.3.22 released May 27, 1999
+
+- disabled long jumps into enemy area without a secure connection
+- no center pattern can jump down to or along the second line
+- revision to the endgame patterns according to docs/ENDGAME
+- detect_trap_helper looks for moves attacking two groups at once
+- some other tuning
+- evaluate_game removed from the distribution
+- semeai will not recommend a move which leads to an immediate loss
+- bugfix in semeai: bestlib was not getting updated
+
+2.3.21 released May 27, 1999
+
+- Empty corner play moved to src/fuseki.c (new) and reimplemented
+- Embryos for 3-4, 3-3, 5-3, and 5-4 joseki databases in patterns/*.sgf
+- option -m [level] for debugging moyos
+- docs/EYES revised
+- bugfix in urgent_connect_helper
+- pattern revisions
+
+2.3.20 released May 26, 1999
+
+- readlad2 now tries backfilling. readlad2 and attack return 2 if
+  a backfill is found but no direct attacking move
+- new patterns
+- use of macros to simplify helpers
+- trymove: sgf --decidestring now gives more information
+- solves errors when MAX_DILAT != MOY_DILAT
+- now the area ownership uses 4 dilation, which seems better.
+- docs/ENDGAME added from Gunnar's email of May 18, 1999
+
+2.3.19 released May 24, 1999
+
+- edge block/expand patterns reordered
+- tuning
+- a new joseki
+- a new helper
+- Move evaluate_game functionality into play_test.c
+- It is now main.c that loads the sgf file into a tree.
+- If no playmode / testmode is supplied, look for a comment
+  of the form  C[testmode=...] in the root node. If found,
+  this sets the playmode / testmode.
+- Other interface fns take the tree, rather than filename, as param.
+- testmode is now a local variable, passed as param into play_test,
+  rather than setting into global state via set_testmode / get_testmode
+- Move the tests for acceptable sgf file (GM[1]FF[3/4]) into the
+  sgf reader, rather than in the user of the tree.
+- bugfix in hane_backfill_helper
+- semeai now attacks dragons of low vitality
+- semeai tries a little harder to choose a smart liberty
+
+2.3.18 released May 23, 1999
+
+- break_chain() and break_chain2() return 2 if saving move can be taken
+- savestone2() and find_defense() try harder not to make self-atari
+- find_defense() now considers tenuki
+- forgot to initialize adjsize and adjlib in chainlinks()
+
+2.3.17 released May 23, 1999
+
+- Complete reordering and some tuning of the fuseki patterns.
+- A little tuning elsewhere.
+- Documentation of the new features in the patterns.db format.
+- The -m option enhanced with another board with delta_moyo values.
+- chainlinks test now in basicnet3
+- delta_terri(int ti, int tj,int color) : the same as delta_moyo(),
+  but against the 5/21 evaluation
+- area ownership evaluation (using 5/0 algo), with wrapper functions :
+  area_stone(int m,int n), area_space(int m,int n)
+  area_color(int m,int n), area_tag(int m,int n)
+  set_area_tag(int m,int n,int tag)
+- the values are computed during make_moyo evaluation, use
+  "gnugo -m" to see how area are evaluated.
+- bugfix in play_test.c
+
+2.3.16 released May 22, 1999
+
+- Wind assistance complemented by moyo assistance.
+- Move dependent randomness replaced by pattern dependent randomness.
+- Format of patterns.db changed to accomodate new features mentioned above.
+- One new joseki line.
+- Jump out patterns retuned. They may still be somewhat out of tune
+  but in a new and different way. Or maybe they even work quite well.
+- Some tuning of fuseki patterns.
+- Caching of upower and mypower values from testwind.
+- Some functions moved from matchpat.c to shapes.c.
+
+2.3.15 released May 22, 1999
+
+- board-setup nodes were being ignored in test-mode
+- fixes a bug where moves annotated as bad (MA[]) were reported as good.
+- took ascii_showboard out of play_test.c.
+- end_sgfdump() tries to pop the stack before closing the file
+- DEPTH ramped all the way up to 10, the new reading code is so fast
+- evaluation of moves is moved to break_chain and break_chain2
+- simplification of readlad1, readlad2, savestone2, find_defense and basicnet3
+- a few annotated games against David Fotland's XGO added to regression/
+
+2.3.14 released May 21, 1999
+
+- documentational changes to helpers.c
+- minor changes in patterns.db
+- all jump_out_helper patterns changed to weight 60 for moyo heuristics
+- jump_out_helper() modified to use moyo heuristics
+- new function delta_moyo() run quite fastly, using the cache as proposed.
+  the result of this function go in global variables :
+  moyo_test[WHITE],moyo_test[BLACK] and the difference from precedent
+  moyo evaluation is in moyo_test[0]
+  delta_moyo returns what is expected : the difference from point of view
+  of "color" player, aka moyo_test[0]
+  the same for moyo_eval[3] and terri_eval[3]
+  so all the results are availables for later use. 
+  (see sources for details)
+- used #defines for the variables 5/21 and 5/10 (can be 4/10 too), see liberty.h
+
+
+2.3.13 released May 20, 1999
+
+- further revisions to ttsgf_read.c regarding file buffering
+- tuning, new patterns, helpers, half eye patterns
+
+2.3.12 released May 20, 1999
+
+- tuning
+- ttsgf_read.c: changed 
+
+2.3.11 released May 19, 1999
+
+- reading.c from 2.3.8 is restored
+- MAX_FILE_BUFFER increased to 150000 in ttsgf_read.c
+- tuning and a new joseki
+- hide most of liberty.h from non-src/ code.
+- src/ and patterns/ define BUILDING_GNUGO_ENGINE,
+  and are therefore allowed to see all the internal
+  symbols. Otherwise, code just sees a few functions,
+  and sees 'const' versions of the variables.
+- (liberty.h defines a macro PUBLIC_VARIABLE which expands
+  to  extern  for engine source files, and extern const
+  for others)
+- *NOTE* : we get many warnings about const violations,
+  where other modules write to these variables. In particular,
+  ascii_showboard makes temporary changes to p[][].
+  But it still compiles (with gcc at least). These interface 
+  violations were always there. Now they are visible.
+- Moved remove_string() and count_territory() from play_ascii
+  into src/utils : these need to be part of the engine
+  since they have intimate access to the state.
+- Did a bit of gratuitous changes with play_test.c
+  No functionality changes.
+- lost get_*_a and put_*_a interface functions.
+- make_dragons() is no longer predicated on movenum, but 
+  on existence of worms.
+- potential_moves[][] is now taken seriously : genmove()
+  clears it at the start of the move cycle, rather than
+  having sgf_move_made() clear it at some random time
+  after genmove has returned.
+- semeai criterion slightly changed: my dragon.vitality<0
+  and your dragon.status==DEAD.
+
+2.3.10 released May 18, 1999
+
+- hane_backfill_helper deprecated
+- semeai module now consults vitality field to initiate fighting
+- test mode did not pass movenum to engine code: fixed.
+  did away with the game_info entries for boardsize and move_number, 
+  made the interface use the engine's global variables instead.
+  Better solution is needed (see TODO)
+
+2.3.9 released May 17, 1999
+
+- play_solo.c: in load_sgf_file() we now use global movenum instead of mv
+- play_solo.c: white stones were loading as black (fixed)
+- new helpers, tuning, revisions to pattern database
+- mkpat.c: maxwt now takes bonus into account
+- reading.c: break_chain2 simplified
+
+2.3.8 released May 17, 1999
+
+- backfill.sgf added to regression/
+- color added to moyo.c
+- bugfix in moyo.c: captures were counted backwards
+- BOUZY added to docs/
+- bugfix in sente_hane_helper
+- joseki patterns are now type 's'
+- fix the board_size bug in test mode
+- reimplement load_sgf_file() in terms of the sgf parser : gives us
+  ability to read multiple AB[][]... for free
+- move load_sgf_file and load_and_analyse_sgf_file from sgf/ into
+  interface.  (Currently play_solo.c but that's temporary.)
+  Justification is that these fns have more to do with the engine
+  than with sgf files.
+- put in the emacs variable blocks into some of the files
+- remove some extern refs from .c files - according to David 
+  this is a bad practise
+- Remove a few remaining // comments, and disable // comments in 
+   GNUGO_SOME_WARNINGS
+- Reorganise the --help page, and add long options for most of the 
+   short ones. The --help is modelled after gnu tar.
+- Some files had #define _NO_PROTO to hide getopt() prototype, but 
+   these files were not doing option parsing, so  assume this is redundant.
+- interface game_info structure was used only in interface.c, so
+   moved the structure defn out of a public header file
+- The ttsgf_read.c code only offered to parse an sgf file which had 
+   already been read into a buffer. Moved a code fragment which appeared 
+   in two places to load the file then parse it into a readsgffile() 
+   function.
+- Prefixed all the symbols for long option names with OPT_, and mode 
+   names with MODE_to avoid namespace clashes. (DECIDE_STRING was being 
+   used as a mode and an option.)
+
+2.3.7 released May 15, 1999
+
+- Jerome's moyo mode (-m option)
+- new patterns and helpers, including backfill patterns CD47 and CD48
+- reading.c: trysafe in readlad2 has been removed
+- reading.c: in savestone2 if stackp==0 we first try to capture
+-  a surrounding string. This would lead to thrashing if we tried
+-  it at deeper levels
+- reading.c: bug fix in find_defense (Gunnar)
+- reading.c: in break_chain2 we omit harder attacks if string has
+-  3 liberties since this causes too many errors.
+- reading.c: in basicnet3 we test a little more the attack really works
+
+2.3.6 released May 15, 1999
+
+- bug fixes in patterns/
+
+2.3.5 released May 14, 1999
+
+- tuning, new helper
+- initialization in src/evaluate_game.c and interface/play_test.c
+
+2.3.4 released May 13, 1999
+
+- Nils' changes to main.c and src/Makefile.am
+- tuning, joseki revisions, new helper wedge_helper
+
+2.3.3 released May 12, 1999
+
+- find_weak eschewed in find_defense
+- change to allow build in a directory other than source
+- braces to joseki.c to avoid a warning about dangling else
+- added --testmode game to analyze games and see if it considered the moves
+- added docs/structure.doc describing program structure and APIs
+
+2.3.2 released May 12, 1999
+
+- missing library files restored in utils/Makefile.am
+- tuning, invasion under hoshi joseki
+- and a cosmetic bug fix in shapes.c.
+- patterns for endgame ko
+- bugfix in double_attack patterns
+
+2.3.1 released May 11, 1999
+
+- Joseki compiler and beginnings of a Joseki database
+- some tuning
+- Tweak sgf/Makefile.am to write generated sgf_properties to $(srcdir)/
+    note : this generates a warning at automake, but I think it is benign.
+- remove the GCC_OPTS from the Makefile.am's, and replace with either
+    @GNUGO_SOME_WARNINGS@ or @GNUGO_ALL_WARNINGS@.
+    This means we can centralise the choice of which warnings we enable,
+    rather than having to duplicate the list of warnings in each component.
+- Add code to configure.in to generate the above.  ALL_WARNINGS switches off use
+    of // comments  (via -Wp,-lang-c89 which runs preprocesser in ansi mode).
+    SOME_WARNINGS will do the same once all components have been cleaned up.
+    SOME_WARNINGS is intended for code over which we don't have full control (eg gmp.c)
+    and so we have to be more liberal in the diagnostics.
+- Removed from the build some of the stuff in utils/ which we do not (currently) use.
+- fixed clear_board() bug that caused segfaults
+- fixed game parameter handling in main() to use interface API
+- updated other interfaces to partially use interface API (no more
+   passing from main!)
+- removed // comments where they were not needed
+   They stil are in the tt* code, that needs to be revisited!!
+- patched sgfgen to use stdin and stdout- makes things easier
+
+2.1.25 released May 10, 1999
+
+- added --decidestring option for sgf debugging reading code
+- added regression directory: contains a few example test files
+- added --quiet option
+- added --testmode option: move, annotation, or both
+   This allows some flexibility in handling differently annotated files
+- added --infile and --outfile options
+- wrote play_test to handle regression testing
+- wrote sgfgen, a program to translate SGF definitions into a header file
+- added Tommy Thorn's code for SGF parsing and implemented tree parsing
+- updated ASCII interface to rely on interface routines- it works!
+- updated interfaces to handle new 'pass' based on int returned from genmove
+- made genmove return boardsize, boardsize coordinates for pass 
+- added interface specification and code-- we now have engine independence!
+- moved all SGF code into sgf directory
+
+2.1.23 released May 7, 1999
+
+- sgf debugging of reading code (from gdb only in this release)
+
+2.1.22 released May 6, 1999
+
+- renum target removed from pattern Makefile.am and Makefile.in
+- strategic_distance was being calculated incorrectly
+- revisions to pattern database
+- chainlinks now tabulates the size of adjacent worms in preparation
+     to trying to sorting them when stackp<depth
+- split out play_solo() into play_solo.c
+- moved interface routines (play*, gmp*, sgf*) into interfaces/ directory
+- combined play*.h into interface.h
+- renamed 'lib' directory to 'utils' to be consistent with other dir names
+- moved AUTOMAKE.README into docs
+
+2.1.21 released May 5, 1999
+
+- minor revisions to pattern database
+- adds tests for term.h and curses.h before defing CURSES
+- fixes a typo in helpers.c
+- fixes some hard-wired 18's in make_worms()
+- fixes what I believe to be a bug in scoping in make_worms
+- gratuitously moves some variable declarations around in make_worms
+- moved pattern files to patterns directory
+- pattern files and functions are now linked in as a library: libpatterns
+
+2.1.20 released May 5, 1999
+
+- configure options
+- main.c: LOAD_AND_ANALYZE mode
+
+2.1.19 released May 4, 1999
+
+- removed #include "../lib/getopt.h" from play_ascii.c - not needed
+- added some code to better handle config.h to main.c and play_ascii.c
+- added ascii_showboard() before the counting starts, useful after 'play 999'
+- added --mode option to main.c
+- changed how different play modes are started: now using switch()
+- removed -g option: use --mode instead
+- changed MAX_BOARD to 25 in liberty.h: try some bigger games!
+- changed sgf 'pass' to [tt] if boardsize>19, else [] (by SGF standard)
+- changed 'pass' moves to send board_size, board_size to sgf routines
+
+2.1.18 released May 3, 1999
+
+- play_ascii: playblack and playwhite are recognized as valid commands.
+- play_ascii: Correct use of strtok on Solaris (missing strsep)
+- ascii display and showboard now work as stated in the help command
+- ascii display doesn't draw the board twice if showboard is enabled.
+- ascii force was broken, is no longer.
+- added check for getopt.h to configure.in
+- fixed PLAY in play_ascii: need to check for two passes!
+- prettyfication in main.c: changed strcmp() usage
+- fixed seed printing in sgf.c
+- play_gmp: handicap was not being passed to sgf_write_game_info
+
+2.1.17 released May 2, 1999
+
+- added counting to ascii interface
+- Gunnar's reshuffled patterns
+- LDFLAGS = $(COLORLIB) in src/Makefile.am and src/Makefile.in
+
+2.1.16 released May 1, 1999
+
+- further revisions to ascii interface
+
+2.1.15 released May 1, 1999
+
+- further revisions to play_ascii and sgf.c
+- Gunnar's pattern classification in patterns.db
+- static evaluation of the board position
+
+2.1.13 released April 30, 1999
+
+- moved all sgf routines into sgf.c
+- changed pass value: from 19, 19 --> board_size, board_size
+- added sgf_open_file() sgf_close_file() and sgf_flush_file() to sgf.c
+- also added sgf_write_line() and sgf_write_game_info()
+- rewrote play_solo to use new sgf routines
+- absolutely no more build errors! (at least on Linux...)
+- renamed ascii.* play_ascii.*
+- moved play_gmp into play_gmp.c and added header file
+- added komi option (doesn't do anything yet, just parses it)
+
+2.1.12 released April 29, 1999
+
+- finished adding long options
+- color also works now (--handicap and --boardsize have been working)
+- needs a little cleanup with short options- some should become long
+- finished ASCII interface
+- can display any board size up to 25x25
+- has command line options and help
+- enhanced error messages
+- added 'switch' command to switch colors in the middle of play
+
+2.1.11 realeased April 29, 1999
+
+- Minor changes to the syntax of patterns.db and hey.db as a preparation
+  for restructuring of patterns.db. Documentation in PATTERNS updated.
+- moved ascii play code into ascii.c
+- copied showboard code for ascii play into ascii.c (ascii_showboard)
+- updated Makefile.am's to reflect changes
+- removed posix and error.c files from lib dir- not needed
+- added long option parsing; still need to add this to help menu
+- moved PATTERNS, DRAGON and OVERVIEW to /docs
+
+2.1.10 released April 28, 1999
+
+- incorporated more reorganizational patches
+
+2.1.9 released April 28, 1999
+
+- Automake-ized (NL)
+- Made code which moves dragon[m][n].borders contingent on !worm[m][n].ko
+- Set TRUST_GRID back to 1.
+
+--------------------------------------------------------------
+
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see    
+http://www.gnu.org/software/gnugo/ for more information.       
+                                                               
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+and 2008 by the Free Software Foundation.
+                                                               
+This program is free software; you can redistribute it and/or  
+modify it under the terms of the GNU General Public License as 
+published by the Free Software Foundation - version 3 or
+(at your option) any later version.          
+                                                               
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
+GNU General Public License in file COPYING for more details.   
+                                                               
+You should have received a copy of the GNU General Public      
+License along with this program; if not, write to the Free     
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,    
+Boston, MA 02111, USA.                                         
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..d5f4c36
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,146 @@
+                 GNU GO INSTALLATION INSTRUCTIONS
+
+Get the most recent tar file from ftp.gnu.org or a mirror (see
+http://www.gnu.org/order/ftp.html for a list).
+
+Untar the sources, change to the directory gnugo-3.6. Now do:
+
+        ./configure [OPTIONS]
+        make
+
+Several configure options will be explained below. You do not need to set
+these unless you are dissatisfied with GNU Go's performance or wish to vary
+the experimental options.
+
+   As an example,
+
+        ./configure --enable-level=9 --enable-cosmic-gnugo
+
+will make a binary in which the default level is 9, and the experimental
+"cosmic"' option is enabled. A list of all configure options can be obtained
+by running `./configure --help'. Further information about the experimental
+options can be found in the next section.
+
+   After running configure and make, you have now made a binary called
+`interface/gnugo'. Now (running as root) type
+
+        make install
+
+to install gnugo in `/usr/local/bin'.
+
+   There are different methods of using GNU Go. You may run it from the
+command line by just typing:
+
+        gnugo
+
+but it is nicer to run it using CGoban 1 (under X Window System) or Jago (on
+any platform with a Java Runtime Environment).
+
+   You can get the most recent version of CGoban 1 from 
+http://sourceforge.net/projects/cgoban1/. The earlier version
+1.12 is available from http://www.igoweb.org/~wms/comp/cgoban/index.html.
+The CGoban version number MUST be 1.9.1 at least or it won't work. CGoban 2
+will not work.
+
+   See the file README for instructions on how to run GNU Go from Cgoban, or
+for Jago.
+
+
+                          RAM CACHE
+
+By default, GNU Go makes a cache of 8 Megabytes in RAM for its
+internal use. The cache is used to store intermediate results during
+its analysis of the position.
+
+Increasing the cache size will often give a modest speed improvement.
+If your system has lots of RAM, consider increasing the cache
+size. But if the cache is too large, swapping will occur,
+causing hard drive accesses and degrading performance. If
+your hard drive seems to be running excessively your cache
+may be too large. On GNU/Linux systems, you may detect swapping
+using the program 'top'. Use the 'f' command to toggle SWAP
+display.
+
+You may override the size of the default cache at compile time 
+by running one of:
+
+   ./configure --enable-cache-size=n
+
+To set the cache size to n. For example
+
+   ./configure --enable-cache-size=48
+
+creates a cache of size 48. If you omit this, your default
+cache size will be 8. You must recompile and reinstall GNU Go
+after reconfiguring it by running make and make install.
+
+You may override the compile-time defaults by running gnugo with
+the option `--cache-size n', where n is the size (in megabytes) of 
+the cache you want, and `--level n' where n is the level desired.
+We will discuss setting these parameters next in detail.
+
+                        DEFAULT LEVEL
+
+GNU Go can play at different levels. Up to level 10 is
+supported. At level 10 GNU Go is much more accurate but takes
+an average of about 1.6 times longer to play than at level 8.
+
+The level can be set at run time using the --level option.
+If you don't set this, the default level will be used. You
+can set the default level with the configure option
+--enable-level=n. For example
+
+./configure --enable-level=9
+
+sets the default level to 9. If you omit this parameter,
+the compiler sets the default level to 10. We recommend
+using level 10 unless you find it too slow. If you decide
+you want to change the default you may rerun configure
+and recompile the program.
+
+                            DFA
+
+GNU Go has two versions of the pattern matcher. The default
+version uses a Discrete Finite Automaton (DFA). It can be
+disabled, giving the old matcher (which was the default in
+GNU Go 3.0) with './configure --disable-dfa'.
+
+                     EXPERIMENTAL OPTIONS
+
+--enable-experimental-semeai enables an experimental semeai
+module. This will result in an engine that is probably stronger 
+but slightly slower and less debugged. It is not guaranteed
+that the semeai code could not cause crashes in some situations.
+
+--enable-owl-threats will result in an engine that does more
+life and death analysis. It will be stronger but slower.
+
+There are other experimental options but we only mention these.
+
+                            WINDOWS
+
+Windows installation is described in a separate file, called WINDOWS.
+
+                           MACINTOSH
+
+If you have Mac OS X you can build GNU Go using Apple's compiler, 
+which is derived from GCC. We recommend adding the flag -no-cpp-precomp
+to CFLAGS.
+
+                          THE MANUAL
+
+You can obtain  a printed copy of the  manual by running 'make
+gnugo.ps' in  the doc/ directory, then  printing the resulting
+postscript file  @file{gnugo.ps}. The manual  contains a great
+deal of information about the algorithms of GNU Go. The first
+few sections serve as a user's manual.
+
+On platforms supporting info documentation, you can usually
+install the manual by executing `make install' (running as
+root) from the doc/ directory. The info documentation can
+be read conveniently from within Emacs by executing the
+command `Control-h i'.
+
+
+
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..bf1641e
--- /dev/null
@@ -0,0 +1,64 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = utils sgf engine patterns interface doc regression
+
+DISTCLEANFILES = *~
+
+EXTRA_DIST = gnugo.dsw config.vc makevcdist.pl WINDOWS OSX CMakeLists.txt config.h.cmake stamp-h.in
+
+maintainer-check:
+
+# Tag before making distribution.  Also, don't make a distribution if
+# checks fail.  Also, make sure the NEWS file is up-to-date.
+cvs-dist: maintainer-check
+       pkg=`echo "@PACKAGE@" | tr a-z A-Z`; \
+       ver=`echo "@VERSION@" | sed 's/\./_/g'`; \
+       tag="$$pkg-$$ver"; \
+       echo tag=$$tag; \
+       if cvs -n log -h README| grep -e $$tag > /dev/null; then \
+         echo "VERSION not new; not releasing" 1>&2; \
+         exit 1; \
+       else :; \
+       fi; \
+       cvs tag -c $$tag
+       $(MAKE) dist
+
+dist-hook:
+       cd $(distdir) \
+       && find . '(' -name '*.rej' -o -name '*.orig' ')' -exec rm '{}' ';'
+
+vpathcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck
+       -rm -rf $(distdir)
+       @banner="Successful VPATH build for $(distdir).tar.gz"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+
+acdir = m4
+@MAINT@aclocal-files: configure.in
+@MAINT@        echo 'acfiles = \' > $@-tmp
+@MAINT@        find $(acdir) -type f -name '*.m4' -print               \
+@MAINT@          | sed 's!^!$(top_srcdir)/!'                           \
+@MAINT@          | tr '\012' ' '                                       \
+@MAINT@          >> $@-tmp
+@MAINT@        echo >> $@-tmp
+@MAINT@        mv $@-tmp $@
+
+@MAINT@include aclocal-files
+
+@MAINT@# Override default rule to use --acdir option
+@MAINT@$(srcdir)/aclocal.m4: configure.in $(acfiles)
+@MAINT@        cd $(srcdir) && aclocal --acdir=$(acdir)
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..01561b6
--- /dev/null
@@ -0,0 +1,655 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+       $(srcdir)/config.vcin $(top_srcdir)/configure AUTHORS COPYING \
+       ChangeLog INSTALL NEWS THANKS TODO depcomp install-sh missing \
+       mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = config.vc
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-exec-recursive install-info-recursive \
+       install-recursive installcheck-recursive installdirs-recursive \
+       pdf-recursive ps-recursive uninstall-info-recursive \
+       uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIRS = utils sgf engine patterns interface doc regression
+DISTCLEANFILES = *~
+EXTRA_DIST = gnugo.dsw config.vc makevcdist.pl WINDOWS OSX CMakeLists.txt config.h.cmake stamp-h.in
+acdir = m4
+all: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+       @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+             cd $(srcdir) && $(AUTOMAKE) --gnu  \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+       @if test ! -f $@; then \
+         rm -f stamp-h1; \
+         $(MAKE) stamp-h1; \
+       else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+       cd $(top_srcdir) && $(AUTOHEADER)
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f config.h stamp-h1
+config.vc: $(top_builddir)/config.status $(srcdir)/config.vcin
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       mkdir $(distdir)
+       $(mkdir_p) $(distdir)/.
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test -d "$(distdir)/$$subdir" \
+           || $(mkdir_p) "$(distdir)/$$subdir" \
+           || exit 1; \
+           distdir=`$(am__cd) $(distdir) && pwd`; \
+           top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+           (cd $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$top_distdir" \
+               distdir="$$distdir/$$subdir" \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+       -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r $(distdir)
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && cd $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+       @cd $(distuninstallcheck_dir) \
+       && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+       check-am clean clean-generic clean-recursive ctags \
+       ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \
+       dist-shar dist-tarZ dist-zip distcheck distclean \
+       distclean-generic distclean-hdr distclean-recursive \
+       distclean-tags distcleancheck distdir distuninstallcheck dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-exec install-exec-am \
+       install-info install-info-am install-man install-strip \
+       installcheck installcheck-am installdirs installdirs-am \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-recursive mostlyclean mostlyclean-generic \
+       mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+       uninstall uninstall-am uninstall-info-am
+
+
+maintainer-check:
+
+# Tag before making distribution.  Also, don't make a distribution if
+# checks fail.  Also, make sure the NEWS file is up-to-date.
+cvs-dist: maintainer-check
+       pkg=`echo "@PACKAGE@" | tr a-z A-Z`; \
+       ver=`echo "@VERSION@" | sed 's/\./_/g'`; \
+       tag="$$pkg-$$ver"; \
+       echo tag=$$tag; \
+       if cvs -n log -h README| grep -e $$tag > /dev/null; then \
+         echo "VERSION not new; not releasing" 1>&2; \
+         exit 1; \
+       else :; \
+       fi; \
+       cvs tag -c $$tag
+       $(MAKE) dist
+
+dist-hook:
+       cd $(distdir) \
+       && find . '(' -name '*.rej' -o -name '*.orig' ')' -exec rm '{}' ';'
+
+vpathcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck
+       -rm -rf $(distdir)
+       @banner="Successful VPATH build for $(distdir).tar.gz"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+@MAINT@aclocal-files: configure.in
+@MAINT@        echo 'acfiles = \' > $@-tmp
+@MAINT@        find $(acdir) -type f -name '*.m4' -print               \
+@MAINT@          | sed 's!^!$(top_srcdir)/!'                           \
+@MAINT@          | tr '\012' ' '                                       \
+@MAINT@          >> $@-tmp
+@MAINT@        echo >> $@-tmp
+@MAINT@        mv $@-tmp $@
+
+@MAINT@include aclocal-files
+
+@MAINT@# Override default rule to use --acdir option
+@MAINT@$(srcdir)/aclocal.m4: configure.in $(acfiles)
+@MAINT@        cd $(srcdir) && aclocal --acdir=$(acdir)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..b6cbf3c
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,92 @@
+New in 3.8 (since 3.6)
+
+- many small improvements and tuning since 3.6
+- experimental Monte Carlo mode (9x9 only)
+- support for tiny boards
+- GPL v3
+
+New in 3.6 (since 3.4)
+
+- stronger than 3.4
+- many small improvements
+- GNU Go can now resign games
+- emacs mode can display the board graphically using xpms
+- basic knowledge of how to break out of mirror go
+
+New in 3.4 (since 3.2)
+
+- stronger than 3.2
+- new connection and semeai modules use lookahead
+- new break-in code
+- improvements to many parts of the program
+
+New in 3.2 (since 3.0)
+
+- stronger than 3.0
+- uses less RAM than 3.0
+- 1-dimensional board
+- experimental dynamic connection analysis
+- experimental reading semeai module
+- new influence function
+- stronger and more agressive
+- reads to find combinations
+- revised Zobrist hashing
+- new html views of the regressions, and many more tests
+
+New in 3.0 (since 2.6)
+
+- stronger than 2.6
+- new move generation scheme
+- new influence function
+- more accurate reading
+- board information maintained incrementally during reading
+- new "owl" and "life" modules for accurate life and death analysis
+- persistent caching of reading and owl results for speed
+- revised semeai module
+- experimental Deterministic Finite State Automaton (DFA) pattern matcher
+- new debugging tools
+- level option
+
+New in 2.6 (since 2.4)
+
+- stronger than 2.4
+- more portable code
+- Texinfo documentation
+- Emacs mode
+
+New in 2.4 (since 2.0)
+
+Enhancements for the user:
+
+- stronger: able to give GNU Go 2.0 a 5 stone handicap
+  - life and death evaluation drastically improved
+  - more efficient and accurate reading
+  - (small) joseki database
+  - takes influence and territory into account
+- Ascii interface as an alternative to CGoban
+- uses GNU configure
+- undo supported
+- man page
+
+Enhancements for the developer:
+
+- expanded pattern database
+- autohelpers for patterns
+- joseki library in Smart Go Format
+- fuseki module
+- backfilling and numerous other improvements to reading code
+- algorithms for estimating territory and influence
+- eye_finder module uses a static algorithm for life and death
+- eyeshape database
+- connection database
+- reading code uses Zobrist hashing and other speedups
+- greater modularity
+- documentation of key algorithms
+- expanded support for Smart Go Format
+- various debugging tools
+
+
+
+
+
+
diff --git a/OSX b/OSX
new file mode 100644 (file)
index 0000000..60d0251
--- /dev/null
+++ b/OSX
@@ -0,0 +1,9 @@
+If you have Mac OS X you can build GNU Go using Apple's compiler, which
+is derived from GCC. You will need Xcode.
+
+   One issue is that the configure test for socket support is too
+conservative. On OS/X, the configure test fails, but actually socket
+support exists. So if you want to be able to connect to the engine
+through tcp/ip (using gtp) you may `configure --enable-socket-support'.
+There will be an error message but you may build the engine and socket
+support should work.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..46cad14
--- /dev/null
+++ b/README
@@ -0,0 +1,244 @@
+                            GNU Go 
+
+This is GNU Go, a Go program. Development versions of GNU Go may be
+found at http://www.gnu.org/software/gnugo/devel.html. Consult TODO if
+you are interested in helping.
+
+
+                          Installation
+
+In short, './configure; make' will build GNU Go; optionally (running
+as root) 'make install' will put it into /usr/local/bin and also
+install the man page. You also will probably want to install CGoban.
+See INSTALL for details.
+
+
+                         Documentation
+
+User documentation can be obtained by running 'gnugo --help' or 'man
+gnugo' from any terminal.
+
+Texinfo documentation includes instructions for users as well as
+documentation of GNU Go's algorithms and functions for programmers and
+developers. Use an info reader or emacs to read the info files, or run
+`make gnugo.dvi' or `make gnugo.ps' in the doc/ directory to get
+printed documentation. You can also make html documentation from the
+Texinfo files. One method of making html documentation is to run the
+command 'makeinfo --html gnugo.texi' in the doc/ directory.
+
+
+
+Contact us at gnugo@gnu.org if you are interested in helping to
+develop this program.
+
+
+                    Running GNU Go via CGoban
+
+This is an extremely nice way to run GNU Go. CGoban provides a
+beautiful graphic user interface under X Window System.
+
+Start CGoban. When the CGoban Control panel comes up, select ``Go
+Modem''. You will get the Go Modem Protocol Setup. Choose one (or
+both) of the players to be ``Program,'' and fill out the box with the
+path to gnugo. After clicking OK, you get the Game Setup window.
+Choose ``Rules Set'' to be Japanese (otherwise handicaps won't work).
+Set the board size and handicap if you want. Click OK and you are
+ready to go.
+
+In the Go Modem Protocol Setup window, when you specify the path to
+GNU Go, you can give it command line options, such as --quiet to
+suppress most messages. Since the Go Modem Protocol preempts standard
+I/O other messages are sent to stderr, even if they are not error
+messages. These will appear in the terminal from which you started
+CGoban.
+
+If you want to play with a komi, you should bear in mind that
+the GMP does not have any provision for communicating the komi.
+Because of this misfeature, unless you set the komi at the command
+line GNU Go will have to guess it. It assumes the komi is 5.5 for
+even games, 0.5 for handicap games. If this is not what you want,
+you can specify the komi at the command line with the --komi
+option, in the Go Modem Protocol Setup window.  You have to set
+the komi again in the Game Setup window, which comes up next.
+
+Click OK and you are ready to go.
+
+Other command line options can be listed by typing 'gnugo --help' 
+-or- 'man gnugo' from any terminal, or by consulting the Texinfo
+documentation.
+
+
+                       Ascii Interface
+
+Even if you do not have CGoban installed you can play with GNU Go
+using its default Ascii interface. Simply type `gnugo' at the command
+line, and GNU Go will draw a board. Typing `help' will give a list of
+options. At the end of the game, pass twice, and GNU Go will prompt you
+through the counting. You and GNU Go must agree on the dead groups--you
+can toggle the status of groups to be removed, and when you are done,
+GNU Go will report the score.
+
+
+                    GNU Go mode in Emacs
+
+   You can run GNU Go from Emacs. This has the advantage that you place
+the stones using the cursor arrow keys.  This requires Emacs 20.4 or
+later. (Tested with Emacs 20.4. Does not work with 20.2.)
+
+   Load `interface/gnugo.el', either by `M-x load-file', or by adding a
+line
+
+     (autoload 'gnugo "gnugo" "GNU Go" t)
+
+in your `.emacs' file. Now you may start GNU Go by `M-x gnugo'. You
+will be prompted for command line options *note Invoking GNU Go::.
+Using these, you may set the handicap, board size, color and komi.
+
+   You can enter commands from the GNU Go ASCII interface after
+typing `:'. For example, to take a move back, type `:back', or
+to list all commands, type `:help'.
+
+   Here are the default keybindings:
+
+   * `Return' or `Space'
+          Select point as the next move.  An error is signalled for
+          invalid locations.  Illegal locations, on the other hand,
+          show up in the GNU Go Console buffer.
+
+   * `q' or `Q'
+          Quit. Both Board and Console buffers are deleted.
+
+   * `R'
+          Resign.
+
+   * `C-l'
+          Refresh.  Includes restoring default window configuration.
+
+   * `M-_'
+          Bury both Board and Console buffers (when the boss is near).
+
+   * `p'
+          Pass; i.e., select no location for your move.
+
+   * `:'
+          Extended command.  Type in a string to be passed directly to
+          the inferior GNU Go process."
+
+
+
+                    Running GNU Go via Jago
+
+Jago, like CGoban is a client capable of providing GNU Go with a
+graphical user interface. Unlike CGoban, it does not require
+X Window System, so it is an attractive alternative under Windows.
+You will need a Java Runtime Environment. Obtain Jago at
+http://www.rene-grothmann.de/jago and follow the links there for the
+Java Runtime Environment.
+
+
+                       Go Modem Protocol
+
+The Go Modem Protocol was developed by Bruce Wilcox with input from
+David Fotland, Anders Kierulf and others, according to the history in
+ftp://www.joy.ne.jp/welcome/igs/Go/programs/protocol.Z . Any Go
+program *should* use this protocol since it is standard. Since CGoban
+supports this protocol, the user interface for any Go program can be
+done entirely through CGoban. The programmer can concentrate on the
+real issues without worrying about drawing stones, resizing the board
+and other distracting issues.
+
+
+                         Options
+
+A few options are described here. A more complete list
+may be found in the Texinfo documentation, or by running
+gnugo --help.
+
+* `--help', `-h'.
+     Print a help message describing the options. This will also
+     tell you the defaults of various parameters, most importantly
+     the level and cache size. The default values of these
+     parameters can be set before compiling by `configure'.  If
+     you forget the defaults you can find out using `--help'.
+
+* `--level LEVEL'
+     GNU Go can play with different strengths and speeds. Level 10
+     is the default. Decreasing the level will make GNU Go faster
+     but less accurate in its reading.
+
+* `--quiet', `--silent'
+     Don't print copyright and other messages. Messages
+     specifically requested by other command line options, such as
+     `--trace', are not supressed.
+
+* `-l', `--infile FILENAME'
+     Load the named SGF file
+
+* `-L', `--until MOVE'
+     Stop loading just before the indicated move is played. MOVE
+     can be either the move number or location.
+
+* `-o', `--outfile FILENAME'
+     Write sgf output to file
+
+* `--mode MODE'
+     Force the playing mode ('ascii', 'gmp' or 'gtp'). The
+     default is ASCII, but if no terminal is detected GMP (Go
+     Modem Protocol) will be assumed. In practice this is usually
+     what you want, so you may never need this option.
+
+
+* `-M', `--cache-size MEGS'
+     Memory in megabytes used for hashing. The default size is 8
+     unless you configure gnugo with the command `configure
+     --enable-cache-size=SIZE' before compiling to make SIZE
+     the default.
+
+
+* `--chinese-rules'
+     Use Chinese counting.
+
+* `--japanese-rules'
+     Use Japanese Rules. This is the default unless you specify
+     `--enable-chinese-rules' as a configure option.
+
+* `--copyright': Display the copyright notice
+
+* `--version' or `-v': Print the version number
+
+* `--printsgf FILENAME': Create an SGF file containing a diagram of
+     the board. Useful with `-L' to create diagrams from games.
+
+
+
+
+                   Copyrights and License
+
+All files Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+2007, 2008 and 2009 by the Free Software Foundation except as noted below.
+
+All files are under the GNU General Public License, which may be
+found in the file COPYING, with the following exceptions.
+
+* The files interface/gtp.c and gtp.h are copyright 2001 by
+  the Free Software Foundation. In the interests of promoting 
+  the Go Text Protocol these two files are licensed under a less 
+  restrictive license than the GPL and are free for unrestricted use.
+  The GTP license appears in each file.
+
+* The files gmp.c and gmp.h are copyright Bill Shubert. These
+  are free for unrestricted use.
+
+* The files regression/golois/* and the tests vie.tst, connect.tst,
+  capture.tst and global.tst are copyright Tristan Cazenave and are
+  used with his permission
+
+* The SGF files in regression/games/handtalk are copyright Jessie Annala
+  and are used with permission.
+
+* The SGF files in regression/games/mertin13x13 are copyright Stefan
+  Mertin and are used with permission.
+
+* The remaining SGF files are either copyright by the FSF or are in
+  the public domain.
diff --git a/THANKS b/THANKS
new file mode 100644 (file)
index 0000000..cabb489
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,33 @@
+                      Acknowledgements
+
+We would like to thank Arthur Britto, David Doshay, Tim Hunt, Matthias Krings,
+Piotr Lakomy, Paul Leonard, Jean-Louis Martineau, Andreas Roever, Pierce
+Wetter, Joseph Piche, and Emanuele Cisbani for helpful correspondence.
+
+Thanks to everyone who stepped on a bug (and sent us a report)!
+
+Thanks to Gary Boos, Wietze Brandsma, Peter Gucwa, Martijn van der Kooij, Michael
+Margolis, Trevor Morris, Mans Ullerstam, Don Wagner, Yin Zheng for help
+with Visual C++.
+
+Thanks to Allan Crossman, Pierce Wetter, Stephan Somogyi and Mathias Wagner
+for help with Macintosh. And thanks to Marco Scheurer and Shigeru Mabuchi for
+helping us find various problems.
+
+Thanks to Jessie Annala for the Handtalk games, and to Stefan
+Mertin for the games from his 13x13 tournament.
+
+Thanks to Ricard Vilà for creating the STS-RV semeai regression test
+suite and to Emanuele Cisbani for helping to port it to GNU Go.
+
+Special thanks to Ebba Berggren for creating our logos, logo-34 and
+logo-36. Logo-34 is based on a design by Tanguy Urvoy and comments
+by Alan Crossman. The old GNU Go logo32 was adapted from Jamal
+Hannah's typing GNU: http://www.gnu.org/graphics/atypinggnu.html.
+
+We would like to thank Stuart Cracraft, Richard Stallman and Man Lung Li for
+their interest in making this program a part of GNU, William Shubert for
+writing CGoban and gmp.c, Rene Grothmann for Jago and Erik van Riper and his
+collaborators for NNGS.
+
+
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..99cdbbd
--- /dev/null
+++ b/TODO
@@ -0,0 +1,207 @@
+                     GNU Go Task List
+
+You can help make GNU Go the best Go program.
+
+This is a task-list for anyone who is interested in helping with GNU
+Go. If you want to work on such a project you should correspond with
+us until we reach a common vision of how the feature will work!
+
+A note about copyright. Before any code can be accepted as a part of
+the official release of GNU Go, the Free Software Foundation will want
+you to sign a copyright disclaimer. Of course you can work on a forked
+version without signing such a disclaimer. If you want your changes to
+the program to be incorporated into the version we distribute we need
+such a disclaimer. Please contact the GNU Go maintainers, Daniel Bump
+(bump@sporadic.stanford.edu) and Gunnar Farneback
+(gunnar@lysator.liu.se), to get more information and the papers to
+sign.
+
+Below is a list of things YOU could work on. We are already working on
+some of these tasks, but don't let that stop you. Please contact us or
+the person assigned to task for further discussion.
+
+//--------------------------------------------------------------
+// General
+//--------------------------------------------------------------
+
+ * If you can, send us bug FIXES as well as bug reports. If you see
+   some bad behavior, figure out what causes it, and what to do about
+   fixing it. And send us a patch! If you find an interesting bug and
+   cannot tell us how to fix it, we would be happy to have you tell us
+   about it anyway. Send us the sgf file (if possible) and attach
+   other relevant information, such as the GNU Go version number. In
+   cases of assertion failures and segmentation faults we probably
+   want to know what operating system and compiler you were using, in
+   order to determine if the problem is platform dependent.
+
+//--------------------------------------------------------------
+// smaller projects
+//--------------------------------------------------------------
+
+These issues are of tactical nature, i.e. they concern some specific
+feature or the infrastructure of the engine.  Some of these are quiet
+small, maybe doable in a day for an experienced GNU Go programmer.
+They might also be useful project to start with for a new project
+member.  Some of them are bigger and demand a deeper knowledge of the
+engine internals.  The issues are presented here in an approximate
+order of perceived difficulty.
+
+ * Add more checks in patterns/mkpat.c testing whether the main diagram and
+   the constraint diagram are consistent.
+
+ * Break out handling of movelists into its own file and generalize it.
+   This is started in 3.1.16. Move lists are used, among other places, 
+   in worms.c where it is used to store moves that capture, save, 
+   threaten to capture and threaten to save the worm.
+
+ * Implement move lists storing important moves for dragons and eyes
+   in the same way as it is used for worms.  Half eyes are already
+   halfway done.  The moves are stored, but not the attack and defend
+   codes (LOSE, KO_A, KO_B and WIN).
+
+ * Make the cache not waste storage on 64 bit systems.
+
+ * The dragon data is split into two arrays, dragon[] and dragon2[].
+   The dragon2 array only have one entry per dragon, in contrast to
+   the dragon array where all the data is stored once for every
+   intersection of the board.  Complete the conversion of eye_data,
+   half_eye_data, worm and dragon to use the same structure as the
+   dragon2 array.
+
+ * Support for ko in eyes.db and optics.c.
+
+ * Integrate the time handling code in play_gtp.c with the autolevel
+   code in clock.c. Alternatively, replace them both with something
+   better. Basing it on some solid system identification theory and/or
+   control theory wouldn't hurt.
+
+ * Write a script which plays through the joseki databases and checks
+   that the engine really generates a joseki move for all positions in
+   the databases. This would also be interesting to run with the
+   --nojosekidb option.
+
+
+//--------------------------------------------------------------
+// long term issues
+//--------------------------------------------------------------
+
+
+These issues are strategic in nature. They will help us to improve the
+playing strength of the program and/or enhance certain aspects of it.
+
+ * Extend the regression test suites.
+   See the texinfo manual in the doc directory for a description of
+   how to do this. In particular it would be useful with test suites
+   for common life and death problems. Currently second line groups, L
+   groups and the tripod shape are reasonably well covered, but there
+   is for example almost nothing on comb formations, carpenter's
+   square, and so on. Other areas where test suites would be most
+   welcome are fuseki, tesuji, and endgame.
+
+ * Tuning the pattern databases. These are under constant revision.  Tuning
+   them is a sort of art. It is not necessary to do any programming to do 
+   this since most of the patterns do not require helpers. We would like it if
+   a few more Dan level players would learn this skill.
+
+ * Extend and tune the Joseki database. It might be very useful to implement
+   a semi-automatic way of doing this. The current method based on sgf files
+   becomes difficult with existing tools.
+
+ * The semeai module is still in need of improvement. (This is underway.)
+
+ * GNU Go does not have a move generator that tries explicitly to build
+   moyos, or reduce/invade opponent's moyos. Such a move generator could
+   be built using the same type of code that is used in the owl life and
+   death reader, or the connection reader mentioned in point 5 above.
+
+ * A much improved combination module.  The combination module of
+   today only finds combinations of threats to capture enemy groups.
+   A more useful combination module would e.g. find combinations of
+   threats to capture a group or enter opponent territory.  It would
+   also be strong enough to find combinations of strategic moves and
+   more indirect threats (a threat to a threat).  Possibly it could
+   combine threats in AND-OR trees (DAGs?) that could be searched
+   using ordinary tree search algorithms.  (Revision of combination.c
+   is underway.)
+
+ * Speed up the tactical reading. GNU Go is reasonably accurate when
+   it comes to tactical reading, but not always very fast.  The main
+   problem is that too many ineffective moves are tested, leading to
+   strange variations that shouldn't need consideration.  To improve
+   one could refine the move generation heuristics in the reading.
+   Also, one should implement some more of the standard tree search
+   optimizations used in alpha-beta readers.
+
+ * Improve the heuristics for assessment of the safety of a
+   group. This might take into account number of eyes / half eyes,
+   moyo in corners, moyo along the edge, moyo in the center, proximity
+   to living friendly groups, weak opponent groups etc. It is of
+   particular interest to be able to accurately determine how a move
+   affects the safety of all groups on the board.
+
+
+//--------------------------------------------------------------
+// Ideas
+//--------------------------------------------------------------
+
+
+These are some ideas that have been floated on the mailing list.  Some
+of them are down-to-earth, and some are just blue sky ramblings.  They
+are presented here for inspiration.
+
+ * A good GUI.
+   A start is being made with GoThic, a goban widget based on the Qt
+   toolkit.  This is linked from the GNU Go development web page on
+   gnu.org. Other starts have been made based on GTK+, but so far
+   nothing more than a start has been attempted.
+
+ * A graphical pattern editor.
+   This would make it much easier for non-programmers to improve the
+   strength of GNU Go.  It could also be used as a debugging tool for
+   the programmers.  This project has the GUI as a prerequisite.
+   The challenge here is not to make a tool which makes it easier to
+   create patterns but to make it easier to overview and maintain the
+   database.
+
+ * Make the engine thread safe and use multiple CPUs on an SMP
+   machine.
+
+ * Making the engine use many machines loosely connected on the
+   internet or in a cluster.
+
+ * Think on the opponent's time.
+
+ * A global alpha-beta reader.  This would probably be very slow and
+   could only read 2 or 3 moves ahead.  Still it could find fatal
+   errors and improve the moves that GNU Go makes.
+
+ * A strategic module that identifies high-level goals and then gives
+   these goals to the rest of the engine.  It should be able to
+   identify if we are ahead in territory or thickness, if we should
+   play safe or if we should play daringly (e.g. if behind).  It
+   should also identify weak areas where we can attack or where we
+   should defend.  Maybe this module doesn't have to be written in C.
+   Maybe PROLOG, LISP or some other AI language would be better.
+
+ * A parameter that makes GNU Go play different styles.  Such styles
+   could be 'play for territory', 'play aggressively', 'play tricky
+   moves (hamete)', and so on.  It could be used to present human
+   users with different kinds of opponents or to tell GNU Go how to
+   play certain computer opponents in tournaments.
+
+ * Generalize representation and handling of threats so that we have a
+   graph representation of threats that can be searched to see how
+   different threats interact.
+
+ * An endgame module based on ideas from combinatorial game theory.
+   To be really useful this would have to deal with early endgame
+   positions.
+
+ * Fuseki tuning by hand is difficult. People who are interested
+   in doing machine learning experiments with GNU Go could try
+   working with fuseki. This may be one of the areas with most
+   potential for substantial and reasonably quick improvements.
+
+ * Create a paradigm for handling other types of ko (approach move ko,
+   multi-step ko, etc) and then write code that handles them. 
+
diff --git a/WINDOWS b/WINDOWS
new file mode 100644 (file)
index 0000000..0432d59
--- /dev/null
+++ b/WINDOWS
@@ -0,0 +1,183 @@
+               Building GNU Go on Windows Platforms
+
+==========================
+
+
+             BUILDING WITH OLDER VISUAL STUDIO
+
+The distribution directories contain some .dsp and .dsw files with
+GNU Go. These have been brought up to date in the sense that they
+should work if you have the older VC++ with Visual Studio 6
+but the distributed .dsp and .dsw files will only be of use with 
+older version of Visual Studio.
+
+In most cases (unless you are building in Cygwin) the preferred way 
+to build GNU Go on Windows platforms is to use CMake. CMake
+understands about many versions of Visual C/Visual Studio, and will
+generate project/solution files for the tools installed on your
+system. So even if you have Visual Studio 6 you may use CMake
+and dispense with the distributed .dsp and .dsw files.
+
+==========================
+
+         BUILDING WITH VISUAL STUDIO PROJECT FILES
+
+Before you compile the GNU Go source, you need to run CMake first, to 
+generate the build files you'll give to Visual Studio.
+
+From the cmd.exe command prompt, CD into the GNU Go source directory. 
+To confirm you're in the right place, you should see the file 
+'CMakeLists.txt' in the top-level directory of the GNU Go code (as well 
+as others in lower subdirectories).
+
+Direct CMake to generate the new Visual Studio build files by typing:
+
+    cmake CMakeLists.txt
+
+Compile the code by invoking the newly-created Solution file:
+
+    vcbuild GNUGo.sln
+
+This will take a few moments, as CMake generates 4 debug/retail targets:
+
+    debug
+    release
+    minsizerel
+    relwithdebinfo
+
+For each of these targets, Visual Studio is generating a version of 
+gnugo.exe:
+
+    interface\debug\gnugo.exe
+    interface\release\gnugo.exe
+    interface\minsizerel\gnugo.exe
+    interface\relwithdebinfo\gnugo.exe
+
+Additionally, there is an 'Install' target available, that will copy the 
+the gnugo.exe into the %ProgramFiles% directory. To do this, type:
+
+    vcbuild INSTALL.vcproj
+
+This should result in copying GNU/Go into:
+
+    "%ProgramFiles%\GNUGo\bin\gnugo.exe" --options
+
+In addition to command line use, CMake also has a GUI version. Users of 
+the Visual Studio GUI might prefer to use that.
+
+==========================
+
+              BUILDING WITH NMAKE MAKEFILES
+
+GNU Go will also build using NMake makefiles. Optionally, instead of 
+Visual Studio project/solution files, you may direct CMake to generate 
+NMake makefiles. To generate the makefiles:
+
+    cmake -G "NMake Makefiles" CMakeLists.txt
+
+The default rule for the makefile is 'all'. Use the 'help' rule to show 
+a list of available targets.
+
+    nmake -f Makefile help
+
+To compile GNU Go:
+
+    nmake -f Makefile all
+
+On some systems, GNU GO may fail to build when using NMake makefiles. It 
+only fails the first time run, run NMake again with the 'clean all' 
+targets, and it will compile the second and subsequent times.
+
+    nmake -f Makefile clean all
+
+Which will successfully generate a gnugo.exe.
+
+    interface\gnugo.exe --options
+
+==========================
+
+                 BUILDING WITH MINGW MAKEFILES:
+
+GNU Go can be built on Windows systems using MinGW.
+
+This development environment uses: the GCC compiler (gcc.exe, not 
+cl.exe), the Microsoft C runtime libraries (MSCRT, not GLibC), the GNU 
+Make build tool (mingw32-make.exe, not NMake), all from the Windows 
+shell (cmd.exe, not sh/bash).
+
+For CMake to work, in addition to the base MinGW installation, the C++ 
+compiler (g++.exe) and GNU Make (mingw32-make.exe) need to be installed. 
+This was tested using GCC v3, not the experimental v4. To debug, use 
+GDB, as the GCC-generated symbols won't work with NTSD/Windbg/Visual Studio.
+
+To create the makfiles, run CMake with the MinGW generator option:
+
+    cmake -G "MinGW Makefiles" CMakeLists.txt
+
+To build GNU Go, from a cmd.exe shell, run GNU Make (against the 
+newly-created 'Makefile' and it's default 'all' target):
+
+    mingw32-make
+    ..\interface\gnugo.exe --options
+
+==========================
+
+               BUILDING WITH MSYS MAKEFILES (MinGW)
+
+GNU Go can be built on Windows systems using MSYS.
+
+This development environment uses: the GCC compiler (gcc.exe, not 
+cl.exe), the Microsoft C runtime libraries (MSCRT, not GLibC), the GNU 
+Make build tool (make, not NMake), all from the GNU Bash (sh.exe, not 
+cmd.exe).
+
+To create the makfiles, run CMake with the MSYS generator option:
+
+    cmake -G "MSYS Makefiles" CMakeLists.txt
+
+Start MSYS's Bash shell, either clicking on a shortcut on from the 
+command line:
+
+    cd /d c:\msys\1.0
+    msys.bat
+
+To build GNU Go, from a Bash shell, run GNU Make (against the 
+newly-created 'Makefile' and it's default 'all' target):
+
+    make
+    ../interface/gnugo.exe --options
+
+To debug, use GDB, as the GCC-generated symbols won't work with 
+NTSD/Windbg/Visual Studio.
+
+==========================
+
+                      BUILDING ON CYGWIN
+
+With Cygwin, you should be able to 
+
+  tar zxvf gnugo-3.8.tar.gz
+  cd gnugo-3.8
+  env CC='gcc -mno-cygwin' ./configure
+  make
+
+==========================
+
+Testing on Windows:
+
+Regress.cmd is a simplified cmd.exe-centric port of the main gnugo Unix 
+shell script regress.sh. It can be used to help verify that the 
+generated binary might be operational. Read the script's comment header 
+for more information. For access to the full GNU Go tests, use Unix, not 
+Windows.
+
+To test:
+
+    cd regression
+    regress.cmd ..\interface\gnugo.exe
+
+==========================
+
+
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..b7a0e85
--- /dev/null
@@ -0,0 +1,891 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+        [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode is disabled by default
+  AC_ARG_ENABLE(maintainer-mode,
+[  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      USE_MAINTAINER_MODE=$enableval,
+      USE_MAINTAINER_MODE=no)
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/config.h.cmake b/config.h.cmake
new file mode 100644 (file)
index 0000000..c6a4e06
--- /dev/null
@@ -0,0 +1,131 @@
+/* Ruleset. Default Japanese */
+#define CHINESE_RULES 0
+
+/* Allow resignation. Default enabled */
+#define RESIGNATION_ALLOWED 1
+
+/* Default level (strength). Up to 10 supported */
+#define DEFAULT_LEVEL 10
+
+/* Center oriented influence. Disabled by default. */
+#define COSMIC_GNUGO 0
+
+/* Owl Node Limit. 1000 default. */
+#define OWL_NODE_LIMIT 1000
+
+/* Semeai Variations. 500 default */
+#define SEMEAI_NODE_LIMIT 500
+
+/* Default hash table size in megabytes */
+#define DEFAULT_MEMORY -1
+
+/* Compile support for GTP communication over TCP/IP channel. */
+#undef ENABLE_SOCKET_SUPPORT
+
+/* GAIN/LOSS codes. Disabled by default. */
+#define EXPERIMENTAL_OWL_EXT 0
+
+/* Large Scale Captures. Disabled by default. */
+#define LARGE_SCALE 0
+
+/* Oracle. Default not enabled. */
+#define ORACLE 0
+
+/* Owl Threats. 0 standard. */
+#define OWL_THREATS 0
+
+/* Break-in module. Enabled by default. */
+#define USE_BREAK_IN 1
+
+/* Connection module. Default experimental. */
+#define EXPERIMENTAL_CONNECTIONS 1
+
+/* Connection module. Default standard. */
+#define ALTERNATE_CONNECTIONS 1
+
+/* Define as 1 to use the grid optimisation, or 2 to run it in self-test mode
+   */
+#define GRID_OPT 1
+
+/* Define to use ansi escape sequences for color debugging */
+#undef ANSI_COLOR
+
+/* Define to 1 if you have the <curses.h> header file. */
+#cmakedefine HAVE_CURSES_H 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#cmakedefine HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the <glib.h> header file. */
+#cmakedefine HAVE_GLIB_H 1
+
+/* Define to 1 if you have the `g_vsnprintf' function. */
+#cmakedefine HAVE_G_VSNPRINTF 1
+
+/* Define to 1 if you have the <ncurses/curses.h> header file. */
+#cmakedefine HAVE_NCURSES_CURSES_H 1
+
+/* Define to 1 if you have the <ncurses/term.h> header file. */
+#cmakedefine HAVE_NCURSES_TERM_H 1
+
+/* Define to 1 if you have the <sys/times.h> header file. */
+#cmakedefine HAVE_SYS_TIMES_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#cmakedefine HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <term.h> header file. */
+#cmakedefine HAVE_TERM_H 1
+
+/* Define to 1 if you have the <crtdbg.h> header file. */
+#cmakedefine HAVE_CRTDBG_H 1
+
+/* Define to 1 if you have the <winsock.h> and <io.h> header files. */
+#cmakedefine HAVE_WINSOCK_IO_H 1
+
+/* Define to 1 if you have the `times' function. */
+#cmakedefine HAVE_TIMES 1
+
+/* Define if your compiler supports transparent unions */
+#undef HAVE_TRANSPARENT_UNIONS
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `usleep' function. */
+#cmakedefine HAVE_USLEEP 1
+
+/* Define if #define can take a variable number of arguments */
+#undef HAVE_VARIADIC_DEFINE
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#cmakedefine HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `_vsnprintf' function. */
+#cmakedefine HAVE__VSNPRINTF 1
+
+/* Enable GNU Readline support */
+#undef READLINE
+
+/* The size of a `long', as computed by sizeof. */
+#cmakedefine SIZEOF_LONG ${SIZEOF_LONG}
+
+/* Define to 1 if termcap/terminfo is available. */
+#undef TERMINFO
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#cmakedefine TIME_WITH_SYS_TIME 1
+
+/* Define special valgrind macros. */
+#undef USE_VALGRIND
+
+/* Version number of package */
+#define VERSION "3.8"
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+${PRAGMAS}
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..caca852
--- /dev/null
@@ -0,0 +1,167 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Connection module. Default standard. */
+#undef ALTERNATE_CONNECTIONS
+
+/* Define to use ansi escape sequences for color debugging */
+#undef ANSI_COLOR
+
+/* Ruleset. Default Japanese */
+#undef CHINESE_RULES
+
+/* Center oriented influence. Disabled by default. */
+#undef COSMIC_GNUGO
+
+/* Default level (strength). Up to 10 supported */
+#undef DEFAULT_LEVEL
+
+/* Default hash table size in megabytes */
+#undef DEFAULT_MEMORY
+
+/* Compile support for GTP communication over TCP/IP channel. */
+#undef ENABLE_SOCKET_SUPPORT
+
+/* Connection module. Default experimental. */
+#undef EXPERIMENTAL_CONNECTIONS
+
+/* GAIN/LOSS codes. Disabled by default. */
+#undef EXPERIMENTAL_OWL_EXT
+
+/* The concatenation of the strings "GNU ", and PACKAGE. */
+#undef GNU_PACKAGE
+
+/* Define as 1 to use the grid optimisation, or 2 to run it in self-test mode
+   */
+#undef GRID_OPT
+
+/* Define to 1 if you have the <curses.h> header file. */
+#undef HAVE_CURSES_H
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <glib.h> header file. */
+#undef HAVE_GLIB_H
+
+/* Define to 1 if you have the `g_vsnprintf' function. */
+#undef HAVE_G_VSNPRINTF
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <ncurses/curses.h> header file. */
+#undef HAVE_NCURSES_CURSES_H
+
+/* Define to 1 if you have the <ncurses/term.h> header file. */
+#undef HAVE_NCURSES_TERM_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/times.h> header file. */
+#undef HAVE_SYS_TIMES_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <term.h> header file. */
+#undef HAVE_TERM_H
+
+/* Define to 1 if you have the `times' function. */
+#undef HAVE_TIMES
+
+/* Define if your compiler supports transparent unions */
+#undef HAVE_TRANSPARENT_UNIONS
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `usleep' function. */
+#undef HAVE_USLEEP
+
+/* Define if #define can take a variable number of arguments */
+#undef HAVE_VARIADIC_DEFINE
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Large Scale Captures. Disabled by default. */
+#undef LARGE_SCALE
+
+/* Oracle. Default not enabled. */
+#undef ORACLE
+
+/* Owl Node Limit */
+#undef OWL_NODE_LIMIT
+
+/* Owl Threats. 0 standard. */
+#undef OWL_THREATS
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Enable GNU Readline support */
+#undef READLINE
+
+/* Allow resignation. Default enabled */
+#undef RESIGNATION_ALLOWED
+
+/* Semeai Variations. 500 default */
+#undef SEMEAI_NODE_LIMIT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if termcap/terminfo is available. */
+#undef TERMINFO
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Break-in module. Enabled by default. */
+#undef USE_BREAK_IN
+
+/* Define special valgrind macros. */
+#undef USE_VALGRIND
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
diff --git a/config.vc b/config.vc
new file mode 100644 (file)
index 0000000..8458ede
--- /dev/null
+++ b/config.vc
@@ -0,0 +1,82 @@
+/* This is the Microsoft Visual C++ version of config.h        *
+ * Replace the distributed config.h with this file             *
+ * See config.h.in for comments on the meanings of most of the *
+ * defines.  This file is autogenerated.  Do not modify it.    *
+ * See instead, the perl script makevcdist.pl                  */
+
+#define HAVE_CRTDBG_H 1
+#define HAVE_WINSOCK_IO_H 1
+#define HAVE__VSNPRINTF 1
+
+/* Connection module. Default standard. */
+#define ALTERNATE_CONNECTIONS 1
+
+/* Ruleset. Default Japanese */
+#define CHINESE_RULES 0
+
+/* Center oriented influence. Disabled by default. */
+#define COSMIC_GNUGO 0
+
+/* Default level (strength). Up to 10 supported */
+#define DEFAULT_LEVEL 10
+
+/* Default hash table size in megabytes */
+#define DEFAULT_MEMORY 8
+
+/* Compile support for GTP communication over TCP/IP channel. */
+#define ENABLE_SOCKET_SUPPORT 1
+
+/* Connection module. Default experimental. */
+#define EXPERIMENTAL_CONNECTIONS 1
+
+/* GAIN/LOSS codes. Disabled by default. */
+#define EXPERIMENTAL_OWL_EXT 0
+
+/* Define as 1 to use the grid optimisation, or 2 to run it in self-test mode
+   */
+#define GRID_OPT 1
+
+/* Large Scale Captures. Disabled by default. */
+#define LARGE_SCALE 0
+
+/* Oracle. Default not enabled. */
+#define ORACLE 0
+
+/* Owl Node Limit */
+#define OWL_NODE_LIMIT 1000
+
+/* Owl Threats. 0 standard. */
+#define OWL_THREATS 0
+
+/* Enable GNU Readline support */
+#define READLINE 0
+
+/* Allow resignation. Default enabled */
+#define RESIGNATION_ALLOWED 1
+
+/* Semeai Variations. 500 default */
+#define SEMEAI_NODE_LIMIT 500
+
+/* Break-in module. Enabled by default. */
+#define USE_BREAK_IN 1
+
+/* Define special valgrind macros. */
+#define USE_VALGRIND 0
+
+
+/* Version number of package */
+#define PACKAGE "gnugo"
+
+/* The concatenation of the strings "GNU ", and PACKAGE.  */
+#define GNU_PACKAGE "GNU " PACKAGE
+
+/* The number of bytes in a int.  */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long.  */
+#define SIZEOF_LONG 4
+
+/* Version number of package */
+#define VERSION "3.8"
+
+#pragma warning(disable: 4244 4305)
diff --git a/config.vcin b/config.vcin
new file mode 100644 (file)
index 0000000..6abb75b
--- /dev/null
@@ -0,0 +1,82 @@
+/* This is the Microsoft Visual C++ version of config.h        *
+ * Replace the distributed config.h with this file             *
+ * See config.h.in for comments on the meanings of most of the *
+ * defines.  This file is autogenerated.  Do not modify it.    *
+ * See instead, the perl script makevcdist.pl                  */
+
+#define HAVE_CRTDBG_H 1
+#define HAVE_WINSOCK_IO_H 1
+#define HAVE__VSNPRINTF 1
+
+/* Connection module. Default standard. */
+#define ALTERNATE_CONNECTIONS 1
+
+/* Ruleset. Default Japanese */
+#define CHINESE_RULES 0
+
+/* Center oriented influence. Disabled by default. */
+#define COSMIC_GNUGO 0
+
+/* Default level (strength). Up to 10 supported */
+#define DEFAULT_LEVEL 10
+
+/* Default hash table size in megabytes */
+#define DEFAULT_MEMORY 8
+
+/* Compile support for GTP communication over TCP/IP channel. */
+#define ENABLE_SOCKET_SUPPORT 1
+
+/* Connection module. Default experimental. */
+#define EXPERIMENTAL_CONNECTIONS 1
+
+/* GAIN/LOSS codes. Disabled by default. */
+#define EXPERIMENTAL_OWL_EXT 0
+
+/* Define as 1 to use the grid optimisation, or 2 to run it in self-test mode
+   */
+#define GRID_OPT 1
+
+/* Large Scale Captures. Disabled by default. */
+#define LARGE_SCALE 0
+
+/* Oracle. Default not enabled. */
+#define ORACLE 0
+
+/* Owl Node Limit */
+#define OWL_NODE_LIMIT 1000
+
+/* Owl Threats. 0 standard. */
+#define OWL_THREATS 0
+
+/* Enable GNU Readline support */
+#define READLINE 0
+
+/* Allow resignation. Default enabled */
+#define RESIGNATION_ALLOWED 1
+
+/* Semeai Variations. 500 default */
+#define SEMEAI_NODE_LIMIT 500
+
+/* Break-in module. Enabled by default. */
+#define USE_BREAK_IN 1
+
+/* Define special valgrind macros. */
+#define USE_VALGRIND 0
+
+
+/* Version number of package */
+#define PACKAGE "gnugo"
+
+/* The concatenation of the strings "GNU ", and PACKAGE.  */
+#define GNU_PACKAGE "GNU " PACKAGE
+
+/* The number of bytes in a int.  */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long.  */
+#define SIZEOF_LONG 4
+
+/* Version number of package */
+#define VERSION "@VERSION@"
+
+#pragma warning(disable: 4244 4305)
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..9ef956a
--- /dev/null
+++ b/configure
@@ -0,0 +1,7916 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61 for gnugo 3.8.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='gnugo'
+PACKAGE_TARNAME='gnugo'
+PACKAGE_VERSION='3.8'
+PACKAGE_STRING='gnugo 3.8'
+PACKAGE_BUGREPORT=''
+
+ac_unique_file="engine/dragon.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+MAINTAINER_MODE_TRUE
+MAINTAINER_MODE_FALSE
+MAINT
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+CPP
+RANLIB
+GREP
+EGREP
+glibconfig
+DFA_ENABLED_TRUE
+DFA_ENABLED_FALSE
+GCC_ONLY_TRUE
+GCC_ONLY_FALSE
+GCC_MAJOR_VERSION
+GCC_MINOR_VERSION
+GNU_GO_WARNINGS
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures gnugo 3.8 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/gnugo]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of gnugo 3.8:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer
+  --enable-color              use curses or ansi escape sequences for colored
+                                   debug output
+  --disable-color             do not try to generated colored debug output
+  --enable-grid-opt           enable the grid optimisation within the pattern
+                                matcher (default)
+  --enable-grid-opt=distrust  enable the grid optimisation in non-trusting mode
+  --disable-grid-opt          disable the grid optimisation
+  --enable-cache-size=n       reserve n MB RAM for caching (special value -1
+                               default, corresponding to 8-11 MB depending on
+                              platform)
+  --enable-level=n            n = default level (10 standard)
+  --enable-semeai-node-limit=n        n = semeai variations (500 standard)
+  --enable-owl-node-limit=n           n = owl node limit (1000 standard)
+  --disable-dfa               use old non-dfa pattern matcher
+  --enable-chinese-rules      use Chinese (area) counting
+  --disable-chinese-rules     use Japanese counting (default)
+  --enable-resignation-allowed       resign lost games (default)
+  --disable-resignation-allowed      never resign
+  --enable-metamachine               enable metamachine
+  --disable-metamachine              don't enable metamachine (default)
+  --enable-experimental-break-in     use the breakin module (default)
+  --disable-experimental-break-in    don't use the breakin module
+  --enable-experimental-owl-ext      use the experimental GAIN/LOSS codes
+  --disable-experimental-owl-ext     use standard owl module (default)
+  --enable-cosmic-gnugo              use center-oriented influence code
+  --disable-cosmic-gnugo             use standard influence code (default)
+  --enable-large-scale               look for large scale captures
+  --disable-large-scale              don't seek large scale captures (default)
+  --enable-experimental-connections  use experimental connection analysis
+                                         (default)
+  --disable-experimental-connections use standard connection analysis
+  --enable-alternate-connections     use alternate experimental connection
+                                         analysis
+  --disable-alternate-connections    use primary experimental connection
+                                         analysis (default)
+  --disable-socket-support           don't compile GTP over TCP/IP support
+  --enable-socket-support            compile TCP/IP support (default)
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-readline     try to use GNU Readline for command reading
+  --without-readline  do not use GNU Readline (default)
+  --with-curses       try to use curses for colored debugging output (default)
+  --without-curses    do not use curses for colored debugging output
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+gnugo configure 3.8
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gnugo $as_me 3.8, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+           break 3
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gnugo'
+ VERSION='3.8'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+GNU_PACKAGE="GNU $PACKAGE"
+cat >>confdefs.h <<_ACEOF
+#define GNU_PACKAGE "$GNU_PACKAGE"
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; }
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+
+# Check whether --with-readline was given.
+if test "${with_readline+set}" = set; then
+  withval=$with_readline;
+fi
+
+
+
+# Check whether --with-curses was given.
+if test "${with_curses+set}" = set; then
+  withval=$with_curses;
+fi
+
+
+# Check whether --enable-color was given.
+if test "${enable_color+set}" = set; then
+  enableval=$enable_color;
+fi
+
+
+
+# Check whether --enable-grid-opt was given.
+if test "${enable_grid_opt+set}" = set; then
+  enableval=$enable_grid_opt;
+fi
+
+
+default_cache_size=-1
+default_level=10
+default_semeai_node_limit=500
+default_owl_node_limit=1000
+
+# Check whether --enable-cache-size was given.
+if test "${enable_cache_size+set}" = set; then
+  enableval=$enable_cache_size;
+fi
+
+
+# Check whether --enable-level was given.
+if test "${enable_level+set}" = set; then
+  enableval=$enable_level;
+fi
+
+
+# Check whether --enable-semeai-node-limit was given.
+if test "${enable_semeai_node_limit+set}" = set; then
+  enableval=$enable_semeai_node_limit;
+fi
+
+
+# Check whether --enable-level was given.
+if test "${enable_level+set}" = set; then
+  enableval=$enable_level;
+fi
+
+
+# Check whether --enable-dfa was given.
+if test "${enable_dfa+set}" = set; then
+  enableval=$enable_dfa;  if test ${enableval} = no; then
+     dfa_c=
+   else
+     dfa_c=dfa
+   fi
+else
+   dfa_c=dfa
+fi
+
+
+# Check whether --enable-chinese-rules was given.
+if test "${enable_chinese_rules+set}" = set; then
+  enableval=$enable_chinese_rules;
+fi
+
+
+# Check whether --enable-resignation-allowed was given.
+if test "${enable_resignation_allowed+set}" = set; then
+  enableval=$enable_resignation_allowed;
+fi
+
+
+# Check whether --enable-metamachine was given.
+if test "${enable_metamachine+set}" = set; then
+  enableval=$enable_metamachine;
+fi
+
+
+# Check whether --enable-experimental-break-in was given.
+if test "${enable_experimental_break_in+set}" = set; then
+  enableval=$enable_experimental_break_in;
+fi
+
+
+# Check whether --enable-experimental-owl-ext was given.
+if test "${enable_experimental_owl_ext+set}" = set; then
+  enableval=$enable_experimental_owl_ext;
+fi
+
+
+# Check whether --enable-cosmic-gnugo was given.
+if test "${enable_cosmic_gnugo+set}" = set; then
+  enableval=$enable_cosmic_gnugo;
+fi
+
+
+# Check whether --enable-large-scale was given.
+if test "${enable_large_scale+set}" = set; then
+  enableval=$enable_large_scale;
+fi
+
+
+# Check whether --enable-experimental-connections was given.
+if test "${enable_experimental_connections+set}" = set; then
+  enableval=$enable_experimental_connections;
+fi
+
+
+# Check whether --enable-alternate-connections was given.
+if test "${enable_alternate_connections+set}" = set; then
+  enableval=$enable_alternate_connections;
+fi
+
+
+# Check whether --enable-socket-support was given.
+if test "${enable_socket_support+set}" = set; then
+  enableval=$enable_socket_support;
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for library containing pow" >&5
+echo $ECHO_N "checking for library containing pow... $ECHO_C" >&6; }
+if test "${ac_cv_search_pow+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pow ();
+int
+main ()
+{
+return pow ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_pow=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_pow+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_pow+set}" = set; then
+  :
+else
+  ac_cv_search_pow=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_pow" >&5
+echo "${ECHO_T}$ac_cv_search_pow" >&6; }
+ac_res=$ac_cv_search_pow
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for mingw32" >&5
+echo $ECHO_N "checking for mingw32... $ECHO_C" >&6; }
+if test "${ac_cv_mingw32+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return __MINGW32__
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_mingw32="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_mingw32="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_mingw32" >&5
+echo "${ECHO_T}$ac_cv_mingw32" >&6; }
+
+if test $ac_cv_mingw32 = yes;then
+    LIBS="$LIBS -lwsock32"
+    { echo "$as_me:$LINENO: checking for library containing vsnprintf" >&5
+echo $ECHO_N "checking for library containing vsnprintf... $ECHO_C" >&6; }
+if test "${ac_cv_search_vsnprintf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char vsnprintf ();
+int
+main ()
+{
+return vsnprintf ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' mingwex; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_vsnprintf=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_vsnprintf+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_vsnprintf+set}" = set; then
+  :
+else
+  ac_cv_search_vsnprintf=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_vsnprintf" >&5
+echo "${ECHO_T}$ac_cv_search_vsnprintf" >&6; }
+ac_res=$ac_cv_search_vsnprintf
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; }
+if test "${ac_cv_header_time+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_time=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_time=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+for ac_header in unistd.h sys/time.h sys/times.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+for ac_header in curses.h term.h ncurses/curses.h ncurses/term.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "$ac_cv_header_curses_h" = "yes";then
+   curses_header="curses.h"
+elif test "$ac_cv_header_ncurses_curses_h" = "yes";then
+   curses_header="ncurses/curses.h"
+else
+   curses_header="no"
+fi
+
+if test "$ac_cv_header_term_h" = "yes";then
+   term_header="term.h"
+elif test "$ac_cv_header_ncurses_term_h" = "yes";then
+   term_header="ncurses/term.h"
+else
+   term_header="no"
+fi
+
+{ echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6; }
+if test "${ac_cv_type_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+typedef long ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_long=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+   typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+   typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+   typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+   typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+   typedef long ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+   typedef long ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_long" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_long=0
+   fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+
+
+
+
+
+for ac_func in vsnprintf gettimeofday usleep times
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+if test $ac_cv_func_vsnprintf = no; then
+    # Extract the first word of "glib-config", so it can be a program name with args.
+set dummy glib-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_glibconfig+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$glibconfig"; then
+  ac_cv_prog_glibconfig="$glibconfig" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_glibconfig="yes"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_glibconfig" && ac_cv_prog_glibconfig="no"
+fi
+fi
+glibconfig=$ac_cv_prog_glibconfig
+if test -n "$glibconfig"; then
+  { echo "$as_me:$LINENO: result: $glibconfig" >&5
+echo "${ECHO_T}$glibconfig" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    if test $ac_cv_prog_glibconfig = yes;then
+       glib_cflags=`glib-config --cflags`
+       glib_libs=`glib-config --libs`
+       CPPFLAGS="$CPPFLAGS $glib_cflags"
+       LIBS="$LIBS $glib_libs"
+
+for ac_func in g_vsnprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_header in glib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+       if test $ac_cv_func_g_vsnprintf = no; then
+          { echo "$as_me:$LINENO: WARNING: GLib installation problem.
+          Continuing without GLib " >&5
+echo "$as_me: WARNING: GLib installation problem.
+          Continuing without GLib " >&2;}
+        fi
+    else
+          { echo "$as_me:$LINENO: WARNING: Neither vsnprintf nor GLib found. GNU Go is
+          compiled but it is safer to get GLib at
+          http://www.gtk.org/" >&5
+echo "$as_me: WARNING: Neither vsnprintf nor GLib found. GNU Go is
+          compiled but it is safer to get GLib at
+          http://www.gtk.org/" >&2;}
+    fi
+fi
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking for variadic cpp define" >&5
+echo $ECHO_N "checking for variadic cpp define... $ECHO_C" >&6; }
+if test "${gnugo_cv_cpp_variadic_define+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+#define zz(fmt,arg...) printf(fmt,##arg)
+int
+main ()
+{
+zz("Hello");zz("%s","Hello");zz("%s%s","Hello","World")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  gnugo_cv_cpp_variadic_define="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnugo_cv_cpp_variadic_define="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gnugo_cv_cpp_variadic_define" >&5
+echo "${ECHO_T}$gnugo_cv_cpp_variadic_define" >&6; }
+if test "$gnugo_cv_cpp_variadic_define" = "yes";then
+      cat >>confdefs.h <<\_ACEOF
+#define HAVE_VARIADIC_DEFINE 1
+_ACEOF
+
+fi
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether $CC supports transparent unions" >&5
+echo $ECHO_N "checking whether $CC supports transparent unions... $ECHO_C" >&6; }
+if test "${gnugo_cv_transparent_unions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+  struct {
+    union {
+      int x;
+      float y;
+    }
+  } A = { { .y = 0.0 } };
+  A.y = 1.0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  gnugo_cv_transparent_unions="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnugo_cv_transparent_unions="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gnugo_cv_transparent_unions" >&5
+echo "${ECHO_T}$gnugo_cv_transparent_unions" >&6; }
+
+if test "$gnugo_cv_transparent_unions" = "yes"; then
+       cat >>confdefs.h <<\_ACEOF
+#define HAVE_TRANSPARENT_UNIONS 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+tmp_color_result="none"
+
+if test "$with_curses" != no -a "$enable_color" != no ; then
+  tmp_color_result="none (curses failed)"
+
+
+        if test "$term_header" != "no" -a "$curses_header" != "no" ; then
+
+        { echo "$as_me:$LINENO: checking for library containing tparm" >&5
+echo $ECHO_N "checking for library containing tparm... $ECHO_C" >&6; }
+if test "${ac_cv_search_tparm+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tparm ();
+int
+main ()
+{
+return tparm ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' ncurses curses pdcurses termcap terminfo termlib; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_tparm=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_tparm+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_tparm+set}" = set; then
+  :
+else
+  ac_cv_search_tparm=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_tparm" >&5
+echo "${ECHO_T}$ac_cv_search_tparm" >&6; }
+ac_res=$ac_cv_search_tparm
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+    if test "$ac_cv_search_tparm" != "no" ; then
+      cat >>confdefs.h <<\_ACEOF
+#define TERMINFO 1
+_ACEOF
+
+    tmp_color_result="curses"
+    fi
+  fi
+fi
+
+if test "$with_curses" = no -a "$enable_color" != no ; then
+    cat >>confdefs.h <<\_ACEOF
+#define ANSI_COLOR 1
+_ACEOF
+
+  tmp_color_result="ANSI color"
+
+fi
+
+{ echo "$as_me:$LINENO: checking for color support" >&5
+echo $ECHO_N "checking for color support... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $tmp_color_result" >&5
+echo "${ECHO_T}$tmp_color_result" >&6; }
+
+
+
+
+
+if test "$with_readline" = yes ; then
+
+        { echo "$as_me:$LINENO: checking for library containing readline" >&5
+echo $ECHO_N "checking for library containing readline... $ECHO_C" >&6; }
+if test "${ac_cv_search_readline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char readline ();
+int
+main ()
+{
+return readline ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' termcap readline; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_search_readline=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_readline+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_readline+set}" = set; then
+  :
+else
+  ac_cv_search_readline=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_readline" >&5
+echo "${ECHO_T}$ac_cv_search_readline" >&6; }
+ac_res=$ac_cv_search_readline
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+    if test "$ac_cv_search_readline" != "no" ; then
+       cat >>confdefs.h <<\_ACEOF
+#define READLINE 1
+_ACEOF
+
+    else
+       cat >>confdefs.h <<\_ACEOF
+#define READLINE 0
+_ACEOF
+
+    fi
+else
+    cat >>confdefs.h <<\_ACEOF
+#define READLINE 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_grid_opt" = "distrust" ; then
+  cat >>confdefs.h <<\_ACEOF
+#define GRID_OPT 2
+_ACEOF
+
+else
+  if test "$enable_grid_opt" = "no" ; then
+    cat >>confdefs.h <<\_ACEOF
+#define GRID_OPT 0
+_ACEOF
+
+  else
+    cat >>confdefs.h <<\_ACEOF
+#define GRID_OPT 1
+_ACEOF
+
+  fi
+fi
+
+
+
+
+
+
+if test "$enable_cache_size" ; then
+   cat >>confdefs.h <<_ACEOF
+#define DEFAULT_MEMORY $enable_cache_size
+_ACEOF
+
+else
+   cat >>confdefs.h <<_ACEOF
+#define DEFAULT_MEMORY $default_cache_size
+_ACEOF
+
+fi
+
+
+
+
+
+
+if test "$enable_level" ; then
+   cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LEVEL $enable_level
+_ACEOF
+
+else
+   cat >>confdefs.h <<_ACEOF
+#define DEFAULT_LEVEL $default_level
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_owl_node_limit" ; then
+   cat >>confdefs.h <<_ACEOF
+#define OWL_NODE_LIMIT $enable_owl_node_limit
+_ACEOF
+
+else
+   cat >>confdefs.h <<_ACEOF
+#define OWL_NODE_LIMIT $default_owl_node_limit
+_ACEOF
+
+fi
+
+
+
+
+
+
+if test "$enable_semeai_node_limit" ; then
+   cat >>confdefs.h <<_ACEOF
+#define SEMEAI_NODE_LIMIT $enable_semeai_node_limit
+_ACEOF
+
+else
+   cat >>confdefs.h <<_ACEOF
+#define SEMEAI_NODE_LIMIT $default_semeai_node_limit
+_ACEOF
+
+fi
+
+
+
+
+if test "$enable_dfa" != "no"; then
+  DFA_ENABLED_TRUE=
+  DFA_ENABLED_FALSE='#'
+else
+  DFA_ENABLED_TRUE='#'
+  DFA_ENABLED_FALSE=
+fi
+
+
+rm -f \
+       patterns/owl_attackpat.c \
+       patterns/owl_defendpat.c \
+       patterns/owl_vital_apat.c
+
+
+
+
+
+
+if test "$enable_chinese_rules" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define CHINESE_RULES 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define CHINESE_RULES 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$disable_resignation_allowed" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define RESIGNATION_ALLOWED 0
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define RESIGNATION_ALLOWED 1
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_metamachine" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define ORACLE 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define ORACLE 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_experimental_break_in" = "no" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define USE_BREAK_IN 0
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define USE_BREAK_IN 1
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_experimental_owl_ext" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define EXPERIMENTAL_OWL_EXT 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define EXPERIMENTAL_OWL_EXT 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_cosmic_gnugo" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define COSMIC_GNUGO 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define COSMIC_GNUGO 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_large_scale" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define LARGE_SCALE 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define LARGE_SCALE 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_experimental_connections" = "no" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define EXPERIMENTAL_CONNECTIONS 0
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define EXPERIMENTAL_CONNECTIONS 1
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_alternate_connections" = "no" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define ALTERNATE_CONNECTIONS 0
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define ALTERNATE_CONNECTIONS 1
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_owl_threats" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define OWL_THREATS 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define OWL_THREATS 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$enable_valgrind" = "yes" ; then
+   cat >>confdefs.h <<\_ACEOF
+#define USE_VALGRIND 1
+_ACEOF
+
+else
+   cat >>confdefs.h <<\_ACEOF
+#define USE_VALGRIND 0
+_ACEOF
+
+fi
+
+
+
+
+
+if test "$ac_compiler_gnu" = "yes"; then
+  GCC_ONLY_TRUE=
+  GCC_ONLY_FALSE='#'
+else
+  GCC_ONLY_TRUE='#'
+  GCC_ONLY_FALSE=
+fi
+
+
+
+
+
+
+
+if test "$ac_compiler_gnu" = "yes"; then
+
+    GCC_MAJOR_VERSION=`echo __GNUC__ | $CC -E -xc - | tail -n 1`
+  GCC_MINOR_VERSION=`echo __GNUC_MINOR__ | $CC -E -xc - | tail -n 1`
+
+  GNU_GO_WARNINGS='-Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wundef'
+
+  if (test $GCC_MAJOR_VERSION -eq 3 && test $GCC_MINOR_VERSION -ge 4) || test $GCC_MAJOR_VERSION -gt 3; then
+    GNU_GO_WARNINGS="$GNU_GO_WARNINGS -Wdeclaration-after-statement"
+  fi
+
+else
+  GCC_MAJOR_VERSION=0
+  GCC_MINOR_VERSION=0
+  GNU_GO_WARNINGS=''
+fi
+
+
+
+
+
+
+if test "$enable_socket_support" != "no"; then
+  # Check for all required headers, macros, structures and functions
+  # at once.
+  { echo "$as_me:$LINENO: checking whether socket support can be compiled" >&5
+echo $ECHO_N "checking whether socket support can be compiled... $ECHO_C" >&6; }
+if test "${gnugo_cv_sockets_supported+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#if !defined(_WIN32) && !defined(_WIN32_WCE)
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#else  /* on Windows */
+#include <winsock.h>
+#endif /* on Windows */
+int
+main ()
+{
+  struct sockaddr_in A;
+  struct hostent *H;
+  A.sin_family = AF_INET;
+  A.sin_addr.s_addr = htonl(INADDR_ANY);
+  A.sin_port = htons(0);
+  gethostbyname(0);
+  socket(PF_INET, SOCK_STREAM, 0);
+  connect(0, 0, 0);
+  bind(0, 0, 0);
+  listen(0, 0);
+  accept(0, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  gnugo_cv_sockets_supported="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnugo_cv_sockets_supported="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gnugo_cv_sockets_supported" >&5
+echo "${ECHO_T}$gnugo_cv_sockets_supported" >&6; }
+
+  if test "$gnugo_cv_sockets_supported" = "yes"; then
+    cat >>confdefs.h <<\_ACEOF
+#define ENABLE_SOCKET_SUPPORT 1
+_ACEOF
+
+  else
+    if test "$enable_socket_support" = "yes"; then
+      { echo "$as_me:$LINENO: WARNING:
+*** Socket support was requested but does not pass configure test. ***
+*** Proceed only if you know what you are doing.                   ***" >&5
+echo "$as_me: WARNING:
+*** Socket support was requested but does not pass configure test. ***
+*** Proceed only if you know what you are doing.                   ***" >&2;}
+    cat >>confdefs.h <<\_ACEOF
+#define ENABLE_SOCKET_SUPPORT 1
+_ACEOF
+
+    fi
+  fi
+fi
+
+#AM_GNU_GETTEXT
+#AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
+
+
+ac_config_files="$ac_config_files Makefile interface/Makefile patterns/Makefile sgf/Makefile utils/Makefile engine/Makefile doc/Makefile regression/Makefile config.vc:config.vcin"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${DFA_ENABLED_TRUE}" && test -z "${DFA_ENABLED_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"DFA_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"DFA_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${GCC_ONLY_TRUE}" && test -z "${GCC_ONLY_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"GCC_ONLY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"GCC_ONLY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+       case $1 in
+        -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gnugo $as_me 3.8, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                  instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+gnugo config.status 3.8
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "interface/Makefile") CONFIG_FILES="$CONFIG_FILES interface/Makefile" ;;
+    "patterns/Makefile") CONFIG_FILES="$CONFIG_FILES patterns/Makefile" ;;
+    "sgf/Makefile") CONFIG_FILES="$CONFIG_FILES sgf/Makefile" ;;
+    "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+    "engine/Makefile") CONFIG_FILES="$CONFIG_FILES engine/Makefile" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "regression/Makefile") CONFIG_FILES="$CONFIG_FILES regression/Makefile" ;;
+    "config.vc") CONFIG_FILES="$CONFIG_FILES config.vc:config.vcin" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim
+MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim
+MAINT!$MAINT$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+CPP!$CPP$ac_delim
+RANLIB!$RANLIB$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+glibconfig!$glibconfig$ac_delim
+DFA_ENABLED_TRUE!$DFA_ENABLED_TRUE$ac_delim
+DFA_ENABLED_FALSE!$DFA_ENABLED_FALSE$ac_delim
+GCC_ONLY_TRUE!$GCC_ONLY_TRUE$ac_delim
+GCC_ONLY_FALSE!$GCC_ONLY_FALSE$ac_delim
+GCC_MAJOR_VERSION!$GCC_MAJOR_VERSION$ac_delim
+GCC_MINOR_VERSION!$GCC_MINOR_VERSION$ac_delim
+GNU_GO_WARNINGS!$GNU_GO_WARNINGS$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 91; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([  #]*\\)[^        ]*\\([  ]*'
+ac_dB='\\)[     (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+       t rset
+       :rset
+       s/^[     ]*#[    ]*define[       ][      ]*//
+       t ok
+       d
+       :ok
+       s/[\\&,]/\\&/g
+       s/^\('"$ac_word_re"'\)\(([^()]*)\)[      ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+       s/^\('"$ac_word_re"'\)[  ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[    #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:         sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:        sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:    sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[     ]*#[    ]*undef[        ][      ]*$ac_word_re[  ]*\$/b def
+/^[     ]*#[    ]*define[       ][      ]*$ac_word_re[(         ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`$as_dirname -- $ac_file ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X$ac_file : 'X\(//\)[^/]' \| \
+        X$ac_file : 'X\(//\)$' \| \
+        X$ac_file : 'X\(/\)' \| . 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+
+  esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..66ea5cd
--- /dev/null
@@ -0,0 +1,590 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl *****************************************************************
+dnl IMPORTANT: Don't forget to add corresponding output for --options
+dnl if you add a non-trivial configure option here.
+dnl *****************************************************************
+
+dnl this is to determine if the config script is running in the proper place
+dnl just give it one file relative to where it should be
+AC_INIT([gnugo], [3.8])
+AC_CONFIG_SRCDIR([engine/dragon.c])
+
+AM_CONFIG_HEADER(config.h)
+AC_PREREQ(2.52)dnl               dnl Minimum Autoconf version required.
+
+AH_TEMPLATE([PACKAGE],
+[Define to the name of the distribution.])
+
+AH_TEMPLATE([GNU_PACKAGE],
+[The concatenation of the strings "GNU ", and PACKAGE.])
+
+AH_TEMPLATE([VERSION],
+[Define to the version of the distribution.])
+
+dnl this defines VERSION and PACKAGE
+AM_INIT_AUTOMAKE
+GNU_PACKAGE="GNU $PACKAGE"
+AC_DEFINE_UNQUOTED(GNU_PACKAGE, "$GNU_PACKAGE")
+
+AM_MAINTAINER_MODE
+
+dnl See if user has expressed a preference for use of curses and/or color
+dnl These set variables $enable_color and $with_curses to "no" if disabled
+dnl "yes" if enabled, or undefined if not specified
+
+AC_ARG_WITH(readline,
+ [  --with-readline     try to use GNU Readline for command reading
+  --without-readline  do not use GNU Readline (default)])
+
+AC_ARG_WITH(curses,
+ [  --with-curses       try to use curses for colored debugging output (default)
+  --without-curses    do not use curses for colored debugging output])
+
+AC_ARG_ENABLE(color,
+ [  --enable-color              use curses or ansi escape sequences for colored
+                                   debug output
+  --disable-color             do not try to generated colored debug output])
+
+dnl and look to see if they want to disable the grid optimisation
+
+AC_ARG_ENABLE(grid-opt,
+ [  --enable-grid-opt           enable the grid optimisation within the pattern
+                                matcher (default)
+  --enable-grid-opt=distrust  enable the grid optimisation in non-trusting mode
+  --disable-grid-opt          disable the grid optimisation])
+
+default_cache_size=-1
+default_level=10
+default_semeai_node_limit=500
+default_owl_node_limit=1000
+
+AC_ARG_ENABLE(cache-size,
+  [  --enable-cache-size=n       reserve n MB RAM for caching (special value -1
+                               default, corresponding to 8-11 MB depending on
+                              platform)])
+
+AC_ARG_ENABLE(level,
+  [  --enable-level=n            n = default level (10 standard)])
+
+AC_ARG_ENABLE(semeai-node-limit,
+  [  --enable-semeai-node-limit=n        n = semeai variations (500 standard)])
+
+AC_ARG_ENABLE(level,
+  [  --enable-owl-node-limit=n           n = owl node limit (1000 standard)])
+
+AC_ARG_ENABLE(dfa,
+ [  --disable-dfa               use old non-dfa pattern matcher],
+ [ if test ${enableval} = no; then     
+     dfa_c=
+   else        
+     dfa_c=dfa
+   fi] ,
+ [ dfa_c=dfa ])
+
+AC_ARG_ENABLE(chinese-rules,
+ [  --enable-chinese-rules      use Chinese (area) counting
+  --disable-chinese-rules     use Japanese counting (default)])
+
+AC_ARG_ENABLE(resignation-allowed,
+ [  --enable-resignation-allowed       resign lost games (default)
+  --disable-resignation-allowed      never resign])
+
+AC_ARG_ENABLE(metamachine,
+ [  --enable-metamachine               enable metamachine
+  --disable-metamachine              don't enable metamachine (default)])
+
+AC_ARG_ENABLE(experimental-break-in,
+ [  --enable-experimental-break-in     use the breakin module (default)
+  --disable-experimental-break-in    don't use the breakin module])
+
+AC_ARG_ENABLE(experimental-owl-ext,
+ [  --enable-experimental-owl-ext      use the experimental GAIN/LOSS codes
+  --disable-experimental-owl-ext     use standard owl module (default)])
+
+AC_ARG_ENABLE(cosmic-gnugo,
+ [  --enable-cosmic-gnugo              use center-oriented influence code
+  --disable-cosmic-gnugo             use standard influence code (default)])
+
+AC_ARG_ENABLE(large-scale,
+ [  --enable-large-scale               look for large scale captures
+  --disable-large-scale              don't seek large scale captures (default)])
+
+AC_ARG_ENABLE(experimental-connections,
+ [  --enable-experimental-connections  use experimental connection analysis 
+                                         (default)
+  --disable-experimental-connections use standard connection analysis])
+
+AC_ARG_ENABLE(alternate-connections,
+ [  --enable-alternate-connections     use alternate experimental connection
+                                         analysis
+  --disable-alternate-connections    use primary experimental connection 
+                                         analysis (default)])
+
+AC_ARG_ENABLE(socket-support,
+ [  --disable-socket-support           don't compile GTP over TCP/IP support
+  --enable-socket-support            compile TCP/IP support (default)])
+
+AC_PROG_CC
+
+dnl for automake 1.4.x
+AC_EXEEXT
+
+dnl add -lm to library list since we use some
+dnl math functions such as pow and fabs
+
+AC_SEARCH_LIBS(pow,m)
+
+AC_CACHE_CHECK(
+       [for mingw32],
+       ac_cv_mingw32,
+       AC_TRY_COMPILE(,
+               [return __MINGW32__],
+               ac_cv_mingw32="yes",
+               ac_cv_mingw32="no")
+)
+
+if test $ac_cv_mingw32 = yes;then
+    LIBS="$LIBS -lwsock32"
+    AC_SEARCH_LIBS(vsnprintf, mingwex)
+fi
+
+AC_PROG_CPP
+AC_PROG_RANLIB
+
+dnl required since we use SUBDIRS in Makefile.am
+AC_PROG_MAKE_SET
+
+AC_HEADER_TIME
+
+AC_C_CONST
+
+AC_CHECK_HEADERS(unistd.h sys/time.h sys/times.h)
+AC_CHECK_HEADERS(curses.h term.h ncurses/curses.h ncurses/term.h)
+
+if test "$ac_cv_header_curses_h" = "yes";then
+   curses_header="curses.h"
+elif test "$ac_cv_header_ncurses_curses_h" = "yes";then
+   curses_header="ncurses/curses.h"
+else
+   curses_header="no"
+fi
+
+if test "$ac_cv_header_term_h" = "yes";then
+   term_header="term.h"
+elif test "$ac_cv_header_ncurses_term_h" = "yes";then
+   term_header="ncurses/term.h"
+else
+   term_header="no"
+fi
+
+AC_CHECK_SIZEOF(long,,[#include <stdio.h>])
+
+dnl vsnprintf not universally available
+dnl usleep not available in Unicos and mingw32
+AC_CHECK_FUNCS(vsnprintf gettimeofday usleep times)
+
+dnl if snprintf not available try to use g_snprintf from GLib
+if test $ac_cv_func_vsnprintf = no; then
+    AC_CHECK_PROG(glibconfig,glib-config,yes,no)
+    if test $ac_cv_prog_glibconfig = yes;then
+       glib_cflags=`glib-config --cflags`
+       glib_libs=`glib-config --libs`
+       CPPFLAGS="$CPPFLAGS $glib_cflags"
+       LIBS="$LIBS $glib_libs"
+       AC_CHECK_FUNCS(g_vsnprintf)
+       AC_CHECK_HEADERS(glib.h)
+       if test $ac_cv_func_g_vsnprintf = no; then
+          AC_MSG_WARN([GLib installation problem.
+          Continuing without GLib ])
+        fi
+    else
+          AC_MSG_WARN([Neither vsnprintf nor GLib found. GNU Go is
+          compiled but it is safer to get GLib at
+          http://www.gtk.org/])
+    fi
+fi
+dnl ------ variadic #define -----------------------
+
+AH_TEMPLATE([HAVE_VARIADIC_DEFINE],
+[Define if #define can take a variable number of arguments])
+
+AC_CACHE_CHECK(
+       [for variadic cpp define],
+       gnugo_cv_cpp_variadic_define,
+       AC_TRY_COMPILE(
+[#include <stdio.h>
+#define zz(fmt,arg...) printf(fmt,##arg)],
+               [zz("Hello");zz("%s","Hello");zz("%s%s","Hello","World")],
+               gnugo_cv_cpp_variadic_define="yes",
+               gnugo_cv_cpp_variadic_define="no")
+)
+if test "$gnugo_cv_cpp_variadic_define" = "yes";then
+      AC_DEFINE(HAVE_VARIADIC_DEFINE)
+fi
+
+dnl ------ transparent unions ---------------------
+
+AH_TEMPLATE([HAVE_TRANSPARENT_UNIONS],
+[Define if your compiler supports transparent unions])
+
+AC_CACHE_CHECK(
+       [whether $CC supports transparent unions],
+       gnugo_cv_transparent_unions,
+       AC_TRY_COMPILE([],
+[[  struct {
+    union {
+      int x;
+      float y;
+    }
+  } A = { { .y = 0.0 } };
+  A.y = 1.0;]],
+               gnugo_cv_transparent_unions="yes",
+               gnugo_cv_transparent_unions="no")
+)
+
+if test "$gnugo_cv_transparent_unions" = "yes"; then
+       AC_DEFINE(HAVE_TRANSPARENT_UNIONS)
+fi
+
+dnl -------- color debugging support -----------
+
+AH_TEMPLATE([TERMINFO],
+[Define to 1 if termcap/terminfo is available.])
+
+AH_TEMPLATE([ANSI_COLOR],
+[Define to use ansi escape sequences for color debugging])
+
+tmp_color_result="none"
+
+if test "$with_curses" != no -a "$enable_color" != no ; then
+  tmp_color_result="none (curses failed)"
+
+  dnl Do a separate test for curses and termcap
+  dnl DJGPP does have pdcurses, but not termcap
+
+  dnl make sure that both curses.h and term.h are available
+  dnl FIXME: better to actually figure out here what headers
+  dnl are really required
+  if test "$term_header" != "no" -a "$curses_header" != "no" ; then
+
+    dnl check for a working termcap library
+    AC_SEARCH_LIBS(tparm,ncurses curses pdcurses termcap terminfo termlib)
+
+    if test "$ac_cv_search_tparm" != "no" ; then
+      AC_DEFINE(TERMINFO)
+    tmp_color_result="curses"
+    fi
+  fi
+fi
+
+if test "$with_curses" = no -a "$enable_color" != no ; then
+  dnl we asked for color, but there is no termcap
+  AC_DEFINE(ANSI_COLOR)
+  tmp_color_result="ANSI color"
+
+fi
+
+AC_MSG_CHECKING(for color support)
+AC_MSG_RESULT($tmp_color_result)
+
+dnl -------- readline support -------------------
+
+AH_TEMPLATE([READLINE], [Enable GNU Readline support])
+
+if test "$with_readline" = yes ; then
+
+    dnl check for a working termcap and readline library
+    AC_SEARCH_LIBS(readline,termcap readline)
+
+    if test "$ac_cv_search_readline" != "no" ; then
+       AC_DEFINE(READLINE,1)
+    else
+       AC_DEFINE(READLINE,0)
+    fi
+else
+    AC_DEFINE(READLINE,0)
+fi
+
+dnl ---------- grid optimisation ------------
+
+AH_TEMPLATE([GRID_OPT],
+[Define as 1 to use the grid optimisation, or 2 to run it in self-test mode])
+
+if test "$enable_grid_opt" = "distrust" ; then
+  AC_DEFINE(GRID_OPT, 2)
+else
+  if test "$enable_grid_opt" = "no" ; then
+    AC_DEFINE(GRID_OPT, 0)
+  else
+    AC_DEFINE(GRID_OPT, 1)
+  fi
+fi
+
+
+dnl ------------ set cache size ----------
+
+AH_TEMPLATE([DEFAULT_MEMORY],
+[Default hash table size in megabytes])
+
+if test "$enable_cache_size" ; then
+   AC_DEFINE_UNQUOTED(DEFAULT_MEMORY, $enable_cache_size)
+else
+   AC_DEFINE_UNQUOTED(DEFAULT_MEMORY, $default_cache_size)
+fi
+
+
+dnl ------------ set default level  ----------
+
+AH_TEMPLATE([DEFAULT_LEVEL],
+[Default level (strength). Up to 10 supported])
+
+if test "$enable_level" ; then
+   AC_DEFINE_UNQUOTED(DEFAULT_LEVEL, $enable_level)
+else
+   AC_DEFINE_UNQUOTED(DEFAULT_LEVEL, $default_level)
+fi
+
+dnl ------------ set cache size ----------
+
+AH_TEMPLATE([OWL_NODE_LIMIT],
+[Owl Node Limit])
+
+if test "$enable_owl_node_limit" ; then
+   AC_DEFINE_UNQUOTED(OWL_NODE_LIMIT, $enable_owl_node_limit)
+else
+   AC_DEFINE_UNQUOTED(OWL_NODE_LIMIT, $default_owl_node_limit)
+fi
+
+
+dnl ------------ set semeai variations  ----------
+
+AH_TEMPLATE([SEMEAI_NODE_LIMIT],
+[Semeai Variations. 500 default])
+
+if test "$enable_semeai_node_limit" ; then
+   AC_DEFINE_UNQUOTED(SEMEAI_NODE_LIMIT, $enable_semeai_node_limit)
+else
+   AC_DEFINE_UNQUOTED(SEMEAI_NODE_LIMIT, $default_semeai_node_limit)
+fi
+
+dnl ------------ dfa -------------------
+
+AM_CONDITIONAL(DFA_ENABLED, test "$enable_dfa" != "no")
+
+dnl FIXME: Is there a more elegant approach for this?
+dnl force owl c files rebuild
+rm -f \
+       patterns/owl_attackpat.c \
+       patterns/owl_defendpat.c \
+       patterns/owl_vital_apat.c
+
+
+dnl ------------ Chinese Rules -------------------
+
+AH_TEMPLATE([CHINESE_RULES],
+[Ruleset. Default Japanese])
+
+if test "$enable_chinese_rules" = "yes" ; then
+   AC_DEFINE(CHINESE_RULES, 1)
+else
+   AC_DEFINE(CHINESE_RULES, 0)
+fi
+
+dnl ------------ Resignation allowed-------------------
+
+AH_TEMPLATE([RESIGNATION_ALLOWED],
+[Allow resignation. Default enabled])
+
+if test "$disable_resignation_allowed" = "yes" ; then
+   AC_DEFINE(RESIGNATION_ALLOWED, 0)
+else
+   AC_DEFINE(RESIGNATION_ALLOWED, 1)
+fi
+
+dnl ------------ Oracle enabled-------------------
+
+AH_TEMPLATE([ORACLE],
+[Oracle. Default not enabled.])
+
+if test "$enable_metamachine" = "yes" ; then
+   AC_DEFINE(ORACLE, 1)
+else
+   AC_DEFINE(ORACLE, 0)
+fi
+
+dnl ------------ Experimental Breakin enabled-------------------
+
+AH_TEMPLATE([USE_BREAK_IN],
+[Break-in module. Enabled by default.])
+
+if test "$enable_experimental_break_in" = "no" ; then
+   AC_DEFINE(USE_BREAK_IN, 0)
+else
+   AC_DEFINE(USE_BREAK_IN, 1)
+fi
+
+dnl ------------ Owl extensions ------------
+
+AH_TEMPLATE([EXPERIMENTAL_OWL_EXT],
+[GAIN/LOSS codes. Disabled by default.])
+
+if test "$enable_experimental_owl_ext" = "yes" ; then
+   AC_DEFINE(EXPERIMENTAL_OWL_EXT, 1)
+else
+   AC_DEFINE(EXPERIMENTAL_OWL_EXT, 0)
+fi
+
+dnl ------------ Cosmic Consciousness -------------------
+
+AH_TEMPLATE([COSMIC_GNUGO],
+[Center oriented influence. Disabled by default.])
+
+if test "$enable_cosmic_gnugo" = "yes" ; then
+   AC_DEFINE(COSMIC_GNUGO, 1)
+else
+   AC_DEFINE(COSMIC_GNUGO, 0)
+fi
+
+dnl ------------ Large Scale -------------------
+
+AH_TEMPLATE([LARGE_SCALE],
+[Large Scale Captures. Disabled by default.])
+
+if test "$enable_large_scale" = "yes" ; then
+   AC_DEFINE(LARGE_SCALE, 1)
+else
+   AC_DEFINE(LARGE_SCALE, 0)
+fi
+
+dnl ------------ Connections -------------------
+
+AH_TEMPLATE([EXPERIMENTAL_CONNECTIONS],
+[Connection module. Default experimental.])
+
+if test "$enable_experimental_connections" = "no" ; then
+   AC_DEFINE(EXPERIMENTAL_CONNECTIONS, 0)
+else
+   AC_DEFINE(EXPERIMENTAL_CONNECTIONS, 1)
+fi
+
+dnl ------------ Connections -------------------
+
+AH_TEMPLATE([ALTERNATE_CONNECTIONS],
+[Connection module. Default standard.])
+
+if test "$enable_alternate_connections" = "no" ; then
+   AC_DEFINE(ALTERNATE_CONNECTIONS, 0)
+else
+   AC_DEFINE(ALTERNATE_CONNECTIONS, 1)
+fi
+
+dnl ------------ Owl Threats -------------------
+
+AH_TEMPLATE([OWL_THREATS],
+[Owl Threats. 0 standard.])
+
+if test "$enable_owl_threats" = "yes" ; then
+   AC_DEFINE(OWL_THREATS, 1)
+else
+   AC_DEFINE(OWL_THREATS, 0)
+fi
+
+dnl ------------ additional valgrind macros ------
+
+AH_TEMPLATE([USE_VALGRIND],
+[Define special valgrind macros.])
+
+if test "$enable_valgrind" = "yes" ; then
+   AC_DEFINE(USE_VALGRIND, 1)
+else 
+   AC_DEFINE(USE_VALGRIND, 0)
+fi
+
+dnl  ----------- special-case use of gcc ---------
+
+dnl Not sure if we are supposed to be accessing this variable, but...
+
+AM_CONDITIONAL(GCC_ONLY, test "$ac_compiler_gnu" = "yes")
+
+dnl Now lines in Makefile.am can be prefixed @GCC_ONLY@.
+
+AC_SUBST(GCC_MAJOR_VERSION)
+AC_SUBST(GCC_MINOR_VERSION)
+AC_SUBST(GNU_GO_WARNINGS)
+
+if test "$ac_compiler_gnu" = "yes"; then
+
+  dnl M4 escaping of brackets
+  GCC_MAJOR_VERSION=`echo __GNUC__ | $CC -E -xc - | tail -n 1`
+  GCC_MINOR_VERSION=`echo __GNUC_MINOR__ | $CC -E -xc - | tail -n 1`
+
+  GNU_GO_WARNINGS='-Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wundef'
+
+  if (test $GCC_MAJOR_VERSION -eq 3 && test $GCC_MINOR_VERSION -ge 4) || test $GCC_MAJOR_VERSION -gt 3; then
+    GNU_GO_WARNINGS="$GNU_GO_WARNINGS -Wdeclaration-after-statement"
+  fi
+
+else
+  GCC_MAJOR_VERSION=0
+  GCC_MINOR_VERSION=0
+  GNU_GO_WARNINGS=''
+fi
+
+dnl FIXME: please add warnings for other compilers!
+
+
+AH_TEMPLATE([ENABLE_SOCKET_SUPPORT],
+[Compile support for GTP communication over TCP/IP channel.])
+
+if test "$enable_socket_support" != "no"; then
+  # Check for all required headers, macros, structures and functions
+  # at once.
+  AC_CACHE_CHECK(
+       [whether socket support can be compiled],
+       gnugo_cv_sockets_supported,
+       AC_TRY_LINK([#if !defined(_WIN32) && !defined(_WIN32_WCE)
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#else  /* on Windows */
+#include <winsock.h>
+#endif /* on Windows */],
+[[  struct sockaddr_in A;
+  struct hostent *H;
+  A.sin_family = AF_INET;
+  A.sin_addr.s_addr = htonl(INADDR_ANY);
+  A.sin_port = htons(0);
+  gethostbyname(0);
+  socket(PF_INET, SOCK_STREAM, 0);
+  connect(0, 0, 0);
+  bind(0, 0, 0);
+  listen(0, 0);
+  accept(0, 0, 0);]],
+       gnugo_cv_sockets_supported="yes",
+       gnugo_cv_sockets_supported="no"))
+
+  if test "$gnugo_cv_sockets_supported" = "yes"; then
+    AC_DEFINE(ENABLE_SOCKET_SUPPORT)
+  else
+    if test "$enable_socket_support" = "yes"; then
+      AC_MSG_WARN(
+[[
+*** Socket support was requested but does not pass configure test. ***
+*** Proceed only if you know what you are doing.                   ***]])
+    AC_DEFINE(ENABLE_SOCKET_SUPPORT)
+    fi
+  fi
+fi
+
+#AM_GNU_GETTEXT
+#AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
+
+dnl FIXME:
+dnl autoconf 2.50 recommends AC_CONFIG_FILES and AC_OUPUT
+dnl This however requires automake 1.4p2 or better
+
+AC_OUTPUT([Makefile interface/Makefile patterns/Makefile sgf/Makefile
+utils/Makefile engine/Makefile doc/Makefile regression/Makefile config.vc:config.vcin])
diff --git a/depcomp b/depcomp
new file mode 100755 (executable)
index 0000000..3d9838b
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,411 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  This file always lives in the current directory.
+  # Also, the AIX compiler puts `$object:' at the start of each line;
+  # $object doesn't have directory information.
+  stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  outname="$stripped.o"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 AIX compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+
+   tmpdepfile1="$object.d"
+   tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` 
+   if test "$libtool" = yes; then
+      "$@" -Wc,-MD
+   else
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2"
+      exit $stat
+   fi
+
+   if test -f "$tmpdepfile1"; then
+      tmpdepfile="$tmpdepfile1"
+   else
+      tmpdepfile="$tmpdepfile2"
+   fi
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a space and a tab in the [].
+      sed -e 's,^.*\.[a-z]*:[  ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  test -z "$dashmflag" && dashmflag=-M
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*) # this is libtool, let us make it quiet
+      for arg
+      do # cycle over the arguments
+        case "$arg" in
+       "--mode=compile")
+         # insert --quiet before "--mode=compile"
+         set fnord "$@" --quiet
+         shift # fnord
+         ;;
+       esac
+       set fnord "$@" "$arg"
+       shift # fnord
+       shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" $dashmflag | sed 's:^[^:]*\:[         ]*:'"$object"'\: :' > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  # X makedepend
+  (
+    shift
+    cleared=no
+    for arg in "$@"; do
+      case $cleared in no)
+        set ""; shift
+       cleared=yes
+      esac
+      case "$arg" in
+        -D*|-I*)
+         set fnord "$@" "$arg"; shift;;
+       -*)
+         ;;
+       *)
+         set fnord "$@" "$arg"; shift;;
+      esac
+    done
+    obj_suffix="`echo $object | sed 's/^.*\././'`"
+    touch "$tmpdepfile"
+    ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tail +3 "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*)
+      for arg
+      do # cycle over the arguments
+        case $arg in
+       "--mode=compile")
+         # insert --quiet before "--mode=compile"
+         set fnord "$@" --quiet
+         shift # fnord
+         ;;
+       esac
+       set fnord "$@" "$arg"
+       shift # fnord
+       shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" -E |
+    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*)
+      for arg
+      do # cycle over the arguments
+        case $arg in
+       "--mode=compile")
+         # insert --quiet before "--mode=compile"
+         set fnord "$@" --quiet
+         shift # fnord
+         ;;
+       esac
+       set fnord "$@" "$arg"
+       shift # fnord
+       shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" -E |
+    sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::   \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644 (file)
index 0000000..b333e6b
--- /dev/null
@@ -0,0 +1,64 @@
+## Process this file with automake to create Makefile.in
+AUTOMAKE_OPTIONS=no-dependencies
+
+info_TEXINFOS = gnugo.texi
+
+gnugo_TEXINFOS = analyze.texi api.texi board.texi copying.texi dfa.texi \
+                 dragon.texi eyes.texi gnugo.texi gtp.texi gtp-commands.texi \
+                 influence.texi introduction.texi move_generation.texi \
+                 moyo.texi overview.texi owl.texi patterns.texi \
+                 reading.texi regression.texi sgf.texi using.texi \
+                 utils.texi install.texi montecarlo.texi
+
+man_MANS = gnugo.6
+
+EPS = cdfa.eps dfa.eps dfa2.eps oldlogo.eps newlogo.eps \
+       path.eps sync-prod1.eps sync-prod2.eps logo-34.eps \
+       logo-32.eps logo-36.eps
+
+FIG = cdfa.fig dfa.fig dfa2.fig path.fig sync-prod1.fig sync-prod2.fig
+
+PNG = cdfa.png dfa.png dfa2.png path.png sync-prod1.png sync-prod2.png
+
+JPG = cdfa.jpg dfa.jpg dfa2.jpg oldlogo.jpg path.jpg sync-prod1.jpg \
+      sync-prod2.jpg newlogo.jpg logo-32.jpg logo-34.jpg logo-36.jpg
+
+PDF = cdfa.pdf dfa2.pdf dfa.pdf logo-34.pdf path.pdf sync-prod1.pdf \
+      sync-prod2.pdf logo-36.pdf
+
+EXTRA_DIST = automake-1.4.patch gnugo.6 gnugo.pod gtp-commands.sed \
+       $(EPS) $(FIG) $(PNG) $(JPG) $(PDF)
+
+CLEANFILES = *.log *.dvi *.aux *.vr *.tp *.ky *.pg *.cps *.fns *.toc \
+             *.fn *.cp *~
+
+TEXI2PDF = texi2pdf
+TEXI2HTML = texi2html
+
+gnugo.6: $(srcdir)/gnugo.pod
+       pod2man $(srcdir)/gnugo.pod --section 6 --release @VERSION@ > gnugo.6
+
+BUILT_SOURCES = gtp-commands.texi
+
+cmdsrc = $(srcdir)/../interface/play_gtp.c
+
+gnugo.pdf: gnugo.texi $(gnugo_TEXINFOS)
+       $(TEXI2PDF) $<
+
+gnugo.html: gnugo.texi $(gnugo_TEXINFOS)
+       $(TEXI2HTML) -split=chapter -nosec_nav -expand=tex $<
+
+## Rebuild gtp-commands.texi from play_gtp.c:
+
+gtp-commands:
+       sed -e '1r '$(srcdir)/gtp-commands.sed                          \
+           -e '/static struct gtp_command commands/,/^}/!d'            \
+           -e '/^ /!d' -e '/NULL/d'                                    \
+           -e 's/ *{"\(.*\)"[^a-z]*\(gtp_[a-z_]*\)}.*/s,\2,\1,g/'      \
+           $(cmdsrc) > TMP.sed
+       sed -f TMP.sed $(cmdsrc) > $(srcdir)/gtp-commands.texi
+       rm -f TMP.sed
+
+
+
+
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644 (file)
index 0000000..7de3881
--- /dev/null
@@ -0,0 +1,555 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = doc
+DIST_COMMON = $(gnugo_TEXINFOS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+depcomp =
+am__depfiles_maybe =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/gnugo.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = gnugo.dvi
+PDFS = gnugo.pdf
+PSS = gnugo.ps
+HTMLS = gnugo.html
+TEXINFOS = gnugo.texi
+TEXI2DVI = texi2dvi
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man6dir)"
+man6dir = $(mandir)/man6
+NROFF = nroff
+MANS = $(man_MANS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = no-dependencies
+info_TEXINFOS = gnugo.texi
+gnugo_TEXINFOS = analyze.texi api.texi board.texi copying.texi dfa.texi \
+                 dragon.texi eyes.texi gnugo.texi gtp.texi gtp-commands.texi \
+                 influence.texi introduction.texi move_generation.texi \
+                 moyo.texi overview.texi owl.texi patterns.texi \
+                 reading.texi regression.texi sgf.texi using.texi \
+                 utils.texi install.texi montecarlo.texi
+
+man_MANS = gnugo.6
+EPS = cdfa.eps dfa.eps dfa2.eps oldlogo.eps newlogo.eps \
+       path.eps sync-prod1.eps sync-prod2.eps logo-34.eps \
+       logo-32.eps logo-36.eps
+
+FIG = cdfa.fig dfa.fig dfa2.fig path.fig sync-prod1.fig sync-prod2.fig
+PNG = cdfa.png dfa.png dfa2.png path.png sync-prod1.png sync-prod2.png
+JPG = cdfa.jpg dfa.jpg dfa2.jpg oldlogo.jpg path.jpg sync-prod1.jpg \
+      sync-prod2.jpg newlogo.jpg logo-32.jpg logo-34.jpg logo-36.jpg
+
+PDF = cdfa.pdf dfa2.pdf dfa.pdf logo-34.pdf path.pdf sync-prod1.pdf \
+      sync-prod2.pdf logo-36.pdf
+
+EXTRA_DIST = automake-1.4.patch gnugo.6 gnugo.pod gtp-commands.sed \
+       $(EPS) $(FIG) $(PNG) $(JPG) $(PDF)
+
+CLEANFILES = *.log *.dvi *.aux *.vr *.tp *.ky *.pg *.cps *.fns *.toc \
+             *.fn *.cp *~
+
+TEXI2PDF = texi2pdf
+TEXI2HTML = texi2html
+BUILT_SOURCES = gtp-commands.texi
+cmdsrc = $(srcdir)/../interface/play_gtp.c
+all: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  doc/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+.texi.info:
+       restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+       am__cwd=`pwd` && cd $(srcdir) && \
+       rm -rf $$backupdir && mkdir $$backupdir && \
+       if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+         for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+           if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+         done; \
+       else :; fi && \
+       cd "$$am__cwd"; \
+       if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+        -o $@ $<; \
+       then \
+         rc=0; \
+         cd $(srcdir); \
+       else \
+         rc=$$?; \
+         cd $(srcdir) && \
+         $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+       fi; \
+       rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+       TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+       MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+       $(TEXI2DVI) $<
+
+.texi.pdf:
+       TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+       MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+       $(TEXI2PDF) $<
+
+.texi.html:
+       rm -rf $(@:.html=.htp)
+       if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+        -o $(@:.html=.htp) $<; \
+       then \
+         rm -rf $@; \
+         if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+           mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+       else \
+         if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+           rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+         exit 1; \
+       fi
+$(srcdir)/gnugo.info: gnugo.texi $(gnugo_TEXINFOS)
+gnugo.dvi: gnugo.texi $(gnugo_TEXINFOS)
+.dvi.ps:
+       TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+       $(DVIPS) -o $@ $<
+
+uninstall-info-am:
+       @$(PRE_UNINSTALL)
+       @if (install-info --version && \
+            install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+         list='$(INFO_DEPS)'; \
+         for file in $$list; do \
+           relfile=`echo "$$file" | sed 's|^.*/||'`; \
+           echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+           install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+         done; \
+       else :; fi
+       @$(NORMAL_UNINSTALL)
+       @list='$(INFO_DEPS)'; \
+       for file in $$list; do \
+         relfile=`echo "$$file" | sed 's|^.*/||'`; \
+         relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+         (if cd "$(DESTDIR)$(infodir)"; then \
+            echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+            rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+          else :; fi); \
+       done
+
+dist-info: $(INFO_DEPS)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       list='$(INFO_DEPS)'; \
+       for base in $$list; do \
+         case $$base in \
+           $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+         esac; \
+         if test -f $$base; then d=.; else d=$(srcdir); fi; \
+         base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+         for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+           if test -f $$file; then \
+             relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+             test -f $(distdir)/$$relfile || \
+               cp -p $$file $(distdir)/$$relfile; \
+           else :; fi; \
+         done; \
+       done
+
+mostlyclean-aminfo:
+       -rm -rf gnugo.aux gnugo.cp gnugo.cps gnugo.fn gnugo.fns gnugo.ky gnugo.kys \
+         gnugo.log gnugo.pg gnugo.pgs gnugo.tmp gnugo.toc gnugo.tp \
+         gnugo.tps gnugo.vr gnugo.vrs gnugo.dvi gnugo.pdf gnugo.ps \
+         gnugo.html
+
+maintainer-clean-aminfo:
+       @list='$(INFO_DEPS)'; for i in $$list; do \
+         i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+         echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+         rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+       done
+install-man6: $(man6_MANS) $(man_MANS)
+       @$(NORMAL_INSTALL)
+       test -z "$(man6dir)" || $(mkdir_p) "$(DESTDIR)$(man6dir)"
+       @list='$(man6_MANS) $(dist_man6_MANS) $(nodist_man6_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.6*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           6*) ;; \
+           *) ext='6' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man6dir)/$$inst'"; \
+         $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man6dir)/$$inst"; \
+       done
+uninstall-man6:
+       @$(NORMAL_UNINSTALL)
+       @list='$(man6_MANS) $(dist_man6_MANS) $(nodist_man6_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.6*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           6*) ;; \
+           *) ext='6' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f '$(DESTDIR)$(man6dir)/$$inst'"; \
+         rm -f "$(DESTDIR)$(man6dir)/$$inst"; \
+       done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-info
+check-am: all-am
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(INFO_DEPS) $(MANS)
+installdirs:
+       for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man6dir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-man
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+       @$(NORMAL_INSTALL)
+       test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       list='$(INFO_DEPS)'; \
+       for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+         esac; \
+         if test -f $$file; then d=.; else d=$(srcdir); fi; \
+         file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+         for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+                       $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+           if test -f $$ifile; then \
+             relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+             echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+             $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+           else : ; fi; \
+         done; \
+       done
+       @$(POST_INSTALL)
+       @if (install-info --version && \
+            install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+         list='$(INFO_DEPS)'; \
+         for file in $$list; do \
+           relfile=`echo "$$file" | sed 's|^.*/||'`; \
+           echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+           install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+         done; \
+       else : ; fi
+install-man: install-man6
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+       maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-info-am uninstall-man
+
+uninstall-man: uninstall-man6
+
+.PHONY: all all-am check check-am clean clean-generic dist-info \
+       distclean distclean-generic distdir dvi dvi-am html html-am \
+       info info-am install install-am install-data install-data-am \
+       install-exec install-exec-am install-info install-info-am \
+       install-man install-man6 install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-aminfo maintainer-clean-generic mostlyclean \
+       mostlyclean-aminfo mostlyclean-generic pdf pdf-am ps ps-am \
+       uninstall uninstall-am uninstall-info-am uninstall-man \
+       uninstall-man6
+
+
+gnugo.6: $(srcdir)/gnugo.pod
+       pod2man $(srcdir)/gnugo.pod --section 6 --release @VERSION@ > gnugo.6
+
+gnugo.pdf: gnugo.texi $(gnugo_TEXINFOS)
+       $(TEXI2PDF) $<
+
+gnugo.html: gnugo.texi $(gnugo_TEXINFOS)
+       $(TEXI2HTML) -split=chapter -nosec_nav -expand=tex $<
+
+gtp-commands:
+       sed -e '1r '$(srcdir)/gtp-commands.sed                          \
+           -e '/static struct gtp_command commands/,/^}/!d'            \
+           -e '/^ /!d' -e '/NULL/d'                                    \
+           -e 's/ *{"\(.*\)"[^a-z]*\(gtp_[a-z_]*\)}.*/s,\2,\1,g/'      \
+           $(cmdsrc) > TMP.sed
+       sed -f TMP.sed $(cmdsrc) > $(srcdir)/gtp-commands.texi
+       rm -f TMP.sed
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/analyze.texi b/doc/analyze.texi
new file mode 100644 (file)
index 0000000..533cbd1
--- /dev/null
@@ -0,0 +1,265 @@
+In this chapter we will discuss methods of finding
+out how GNU Go understands a given position. These
+methods will be of interest to anyone working on the
+program, or simply curious about its workings.
+
+In practice, most tuning of GNU Go is done in conjunction
+with maintaining the @file{regression/} directory
+(@pxref{Regression}).
+
+We assume that you have a game GNU Go played saved
+as an sgf file, and you want to know why it made a
+certain move.
+
+@menu
+* Traces::                     Analyzing traces in GNU Go 3.6
+* Output File::                        The Output File
+* Decide string::              Checking the reading code
+* Decide dragon::              Checking the owl code
+* GTP and GDB techniques::      GTP and GDB techniques
+* view.pike::                   Debugging on a Graphic Board
+* Scoring::                     Finding out the winner of the game
+* Colored Display::             Colored Display
+@end menu
+
+@node Traces
+@section Interpreting Traces
+@cindex traces
+@cindex tuning GNU Go
+
+A quick way to find out roughly the reason for a move is to run
+
+@example
+gnugo -l @var{filename} -t -L @var{move number}
+@end example
+
+(You may also want to add @option{--quiet} to suppress the copyright
+message.) In GNU Go 3.6, the moves together with their reasons are
+listed, followed by a numerical analysis of the values given to each
+move.
+
+If you are tuning (@pxref{Tuning}) you may want to add the @option{-a}
+option. This causes GNU Go to report all patterns matched, even ones
+that cannot affect the outcome of the move. The reasons for doing
+this is that you may want to modify a pattern already matched 
+instead of introducing a new one.
+
+If you use the @option{-w} option, GNU Go will report the statuses of
+worms and dragons around the board. This type of information is
+available by different methods, however (@pxref{view.pike},
+@pxref{Colored Display}).
+
+@node Output File
+@section The Output File
+@cindex output file
+
+If GNU Go is invoked with the option @option{-o filename} it will
+produce an output file. This option can be added at the command line
+in the Go Modem Protocol Setup Window of CGoban. The output file will
+show the locations of the moves considered and their weights. It is
+worth noting that by enlarging the CGoban window to its fullest size
+it can display 3 digit numbers. Dragons with status @code{DEAD} are
+labelled with an @samp{X}, and dragons with status @code{CRITICAL} are
+labelled with a @samp{!}.
+
+If you have a game file which is not commented this way, or
+which was produced by a non-current version of GNU Go you may
+ask GNU Go to produce a commented version by running:
+
+@example
+gnugo --quiet -l <old file> --replay <color> -o <new file>
+@end example
+
+@noindent
+Here <color> can be 'black,' 'white' or 'both'. The replay
+option will also help you to find out if your current version
+of GNU Go would play differently than the program that created
+the file.
+
+@node Decide string
+@section Checking the reading code
+@cindex decide-string
+
+The @option{--decide-string} option is used to check the tactical reading code
+(@pxref{Tactical Reading}). This option takes an argument, which is a location
+on the board in the usual algebraic notation (e.g. 
+@option{--decide-string C17}). This will tell you whether the reading code (in
+@file{engine/reading.c}) believes the string can be captured, and if so,
+whether it believes it can be defended, which moves it finds to attack or
+defend the move, how many nodes it searched in coming to these
+conclusions. Note that when GNU Go runs normally (not with
+@option{--decide-string}) the points of attack and defense are 
+computed when @code{make_worms()} runs and cached in
+@code{worm.attack} and @code{worm.defend}. 
+
+If used with an output file (@option{-o @var{filename}}) 
+@option{--decide-string} will produce a variation tree showing
+all the variations which are considered. This is a useful way
+of debugging the reading code, and also of educating yourself
+with the way it works. The variation tree can be displayed
+graphically using CGoban. 
+
+At each node, the comment contains some information. For example you
+may find a comment:
+
+@example
+
+attack4-B at D12 (variation 6, hash 51180fdf)
+break_chain D12: 0
+defend3 D12: 1 G12 (trivial extension)
+
+@end example
+
+This is to be interpreted as follows. The node in question
+was generated by the function @code{attack3()} in @file{engine/reading.c},
+which was called on the string at @code{D12}. The data in 
+parentheses tell you the values of @code{count_variations} and
+@code{hashdata.hashval}. 
+
+The second value (``hash'') you probably will not need to know
+unless you are debugging the hash code, and we will not discuss it.
+But the first value (``variation'') is useful when using the debugger
+@command{gdb}. You can first make an output file using
+the @option{-o} option, then walk through the reading with
+@command{gdb}, and to coordinate the SGF file with the debugger,
+display the value of @code{count_variations}. Specifically,
+from the debugger you can find out where you are as follows:
+
+@example
+(gdb) set dump_stack()
+B:D13 W:E12 B:E13 W:F12 B:F11  (variation 6)
+@end example
+
+If you place yourself right after the call to @code{trymove()}
+which generated the move in question, then the variation number
+in the SGF file should match the variation number displayed by
+@code{dump_stack()}, and the move in question will be the
+last move played (F11 in this example).
+
+This displays the sequence of moves leading up to the variation
+in question, and it also prints @code{count_variations-1}.
+
+The second two lines tell you that from this node, the function
+@code{break_chain()} was called at D12 and returned 0 meaning
+that no way was found of rescuing the string by attacking
+an element of the surrounding chain, and the function
+@code{defend3()} was called also at D12 and returned 1,
+meaning that the string can be defended, and that
+G12 is the move that defends it. If you have trouble
+finding the function calls which generate these comments,
+try setting @code{sgf_dumptree=1} and setting a breakpoint in
+@code{sgf_trace}.
+
+@node Decide dragon
+@section Checking the Owl Code
+@cindex decide-dragon
+
+You can similarly debug the Owl code using the option
+@option{--decide-dragon}. Usage is entirely similar to
+@option{--decide-string}, and it can be used similarly
+to produce variation trees. These should be typically
+much smaller than the variation trees produced by
+@option{--decide-string}.
+
+@node GTP and GDB techniques
+@section GTP and GDB techniques
+@cindex GDB
+@cindex GTP
+
+You can use the Go Text Protocol (@pxref{GTP}) to determine
+the statuses of dragons and other information needed for
+debugging. The GTP command @command{dragon_data P12} will list
+the dragon data of the dragon at @code{P12} and
+@command{worm_data} will list the worm data; other GTP
+commands may be useful as well.
+
+You can also conveniently get such information from GDB.
+A suggested @file{.gdbinit} file may be found in
+@xref{Debugging}. Assuming this file is loaded, you can
+list the dragon data with the command:
+
+@example
+(gdb) dragon P12
+@end example
+
+Similarly you can get the worm data with @command{worm P12}.
+
+@node view.pike
+@section Debugging on a Graphical Board
+@cindex debugging on a graphical board
+
+The quickest way to analyze most positions is to use the tool
+@file{view.pike} in the @file{regression} directory. It can be started
+with a testcase specified, e.g. @command{pike view.pike strategy:40} or
+at a move in an sgf file, e.g. @command{pike view.pike mistake.sgf:125}.
+When started it shows the position on a grapical board on which it also
+marks information like move values, dragon status, and so on. By
+clicking on the board further information about the valuation of moves,
+contents of various data structures, and other data can be made
+available.
+
+Specific information on how to use @file{view.pike} for influence tuning
+can be found in @xref{Influence Tuning}.
+
+@node Scoring
+@section Scoring the game
+@cindex scoring
+
+GNU Go can score the game. Normally GNU Go will report its opinion about
+the score at the end of the game, but if you want this information about
+a game stored in a file, use the @option{--score} option (@pxref{Invoking
+GNU Go}).
+
+@node  Colored Display
+@section Colored Display
+@cindex colored display
+
+Various colored displays of the board may be obtained in a color
+@command{xterm} or @command{rxvt} window. Xterm will only work if xterm is
+compiled with color support. If the colors are not displayed on your xterm,
+try @command{rxvt}.  You may also use the Linux console. The colored display
+will work best if the background color is black; if this is not the case you
+may want to edit your @file{.Xdefaults} file or add the options
+@option{-bg black -fg white} to @command{xterm} or @command{rxvt}.
+On Mac OS X put @command{setenv TERM xterm-color} in your @file{.tcshrc}
+file to enable color in the terminal.
+
+@subsection Dragon Display
+
+You can get a colored ASCII display of the board in which each dragon
+is assigned a different letter; and the different @code{matcher_status} values
+(@code{ALIVE}, @code{DEAD}, @code{UNKNOWN}, @code{CRITICAL}) have different
+colors. This is very handy for debugging. Actually two diagrams are generated.
+The reason for this is concerns the way the matcher status is computed.
+The dragon_status (@pxref{Dragons}) is computed first, then for some, but not
+all dragons, a more accurate owl status is computed. The matcher status is
+the owl status if available; otherwise it is the dragon_status. Both the
+dragon_status and the owl_status are displayed. The color scheme is as
+follows:
+
+@example
+green = alive
+cyan = dead
+red = critical
+yellow = unknown
+magenta = unchecked
+@end example
+
+To get the colored display, save a game in sgf format using CGoban, or using
+the @option{-o} option with GNU Go itself.
+
+Open an @command{xterm} or @command{rxvt} window. 
+
+Execute @command{gnugo -l [filename] -L [movenum] -T} to get the colored 
+display.
+
+Other useful colored displays may be obtained by using instead:
+
+@subsection Eye Space Display
+@cindex eye space display
+
+Instead of @option{-T}, try this with @option{-E}. This gives a colored
+display of the eyespaces, with marginal eye spaces marked @samp{!}
+(@pxref{Eyes}).
+
+
diff --git a/doc/api.texi b/doc/api.texi
new file mode 100644 (file)
index 0000000..8d98025
--- /dev/null
@@ -0,0 +1,426 @@
+If you want to write your own interface to GNU Go, or if you want to
+create a go application using the GNU Go engine, this chapter is of
+interest to you.
+
+First an overview: GNU Go consists of two parts: the GNU Go @i{engine}
+and a program (user interface) which uses this engine. These are linked
+together into one binary. The current program implements the following
+user modes:
+
+@itemize @bullet
+@item An interactive board playable on ASCII terminals
+@item solo play - GNU Go plays against itself
+@item replay - a mode which lets the user investigate moves in an existing
+SGF file.
+@item GMP - Go Modem Protocol, a protocol for automatic play between two
+computers.
+@item GTP - Go Text Protocol, a more general go protocol, @pxref{GTP}.
+@end itemize
+@cindex API
+
+The GNU Go engine can be used in other applications. For example, supplied
+with GNU Go is another program using the engine, called @file{debugboard},
+in the directory @file{interface/debugboard/}. The program debugboard lets the
+user load SGF files and can then interactively look at different properties of
+the position such as group status and eye status.
+
+The purpose of this Chapter is to show how to interface your own
+program such as @code{debugboard} with the GNU Go engine.
+
+Figure 1 describes the structure of a program using the GNU Go
+engine.
+
+@example
+@group
+                 +-----------------------------------+
+                 |                                   |
+                 |          Go application           |
+                 |                                   |
+                 +-----+----------+------+           |
+                 |     |          |      |           |
+                 |     |   Game   |      |           |
+                 |     | handling |      |           |
+                 |     |          |      |           |
+                 |     +----+-----+      |           |
+                 |   SGF    |    Move    |           |
+                 | handling | generation |           |
+                 |          |            |           |
+                 +----------+------------+-----------+
+                 |                                   |
+                 |           Board handling          |
+                 |                                   |
+                 +-----------------------------------+
+     
+        Figure 1: The structure of a program using the GNU Go engine
+
+@end group
+@end example
+
+The foundation is a library called @code{libboard.a} which provides 
+efficient handling of a go board with rule checks for moves, with
+incremental handling of connected strings of stones and with methods to
+efficiently hash go positions.
+
+On top of this, there is a library which helps the application use
+Smart Game Format (SGF) files, with complete handling of game trees in
+memory and in files. This library is called @code{libsgf.a}
+
+The main part of the code within GNU Go is the move generation
+library which given a position generates a move. This part of the
+engine can also be used to manipulate a go position, add or remove
+stones, do tactical and strategic reading and to query the engine for
+legal moves. These functions are collected into @code{libengine.a}.
+
+The game handling code helps the application programmer keep tracks
+of the moves in a game. Games can be saved to
+SGF files and then later be read back again. These are also within
+@code{libengine.a}. 
+
+The responsibility of the application is to provide the user with a
+user interface, graphical or not, and let the user interact with the
+engine.
+
+@menu
+* Getting Started::          How to use the engine in your program
+* Basic Data Structures::    Basic Data Structures in the Engine
+* The Board State::          The board_state `struct'
+* Positional Functions::     Functions which manipulate a Position
+@end menu
+
+@node Getting Started
+
+@section How to use the engine in your own program: getting started
+
+To use the GNU Go engine in your own program you must include
+the file @file{gnugo.h}. This file describes the whole public API. There is
+another file, @file{liberty.h}, which describes the internal interface within
+the engine. If you want to make a new module within the engine, e.g.  for
+suggesting moves you will have to include this file also. In this section we
+will only describe the public interface.
+
+@findex init_gnugo
+   Before you do anything else, you have to call the function
+@code{init_gnugo()}. This function initializes everything within the engine.
+It takes one parameter: the number of megabytes the engine can use for
+the internal hash table. In addition to this the engine will use a few
+megabytes for other purposes such as data describing groups (liberties,
+life status, etc), eyes and so on.
+
+@node Basic Data Structures
+@section Basic Data Structures in the Engine
+@cindex data structures
+@cindex position struct
+
+
+   There are some basic definitions in gnugo.h which are used
+everywhere. The most important of these are the numeric declarations of
+colors. Each intersection on the board is represented by one of these:
+
+@example
+@group
+
+     color              value
+     EMPTY                0
+     WHITE                1
+     BLACK                2
+
+@end group
+@end example
+
+There is a macro, @code{OTHER_COLOR(color)} which can be used to get the
+other color than the parameter. This macro can only be used on @code{WHITE}
+or @code{BLACK}, but not on @code{EMPTY}.
+@findex OTHER_COLOR
+
+GNU Go uses two different representations of the board, for
+most purposes a one-dimensional one, but for a few purposes a
+two dimensional one (@pxref{Libboard}). The one-dimensional
+board was introduced before GNU Go 3.2, while the two-dimensional
+board dates back to the ancestral program written by Man Lung Li
+before 1995. The API still uses the two-dimensional board, so
+the API functions have not changed much since GNU Go 3.0.
+
+@node The Board State
+
+@section The board_state struct
+@cindex board_state
+
+A basic data structure in the engine is the @code{board_state} struct. 
+This structure is internal to the engine and is defined in @file{liberty.h}.
+
+@example 
+@group
+
+     typedef unsigned char Intersection;
+     
+     struct board_state @{
+       int board_size;
+     
+       Intersection board[BOARDSIZE];
+       int board_ko_pos;
+       int black_captured;
+       int white_captured;
+     
+       Intersection initial_board[BOARDSIZE];
+       int initial_board_ko_pos;
+       int initial_white_captured;
+       int initial_black_captured;
+       int move_history_color[MAX_MOVE_HISTORY];
+       int move_history_pos[MAX_MOVE_HISTORY];
+       int move_history_pointer;
+     
+       float komi;
+       int move_number;
+     @};
+
+@end group
+@end example
+
+Here @code{Intersection} stores @code{EMPTY}, @code{WHITE} or
+@code{BLACK}. It is currently defined as an @code{unsigned char} to make
+it reasonably efficient in both storage and access time. The board state
+contains an array of @code{Intersection}'s representing the board.
+The move history is contained in the struct. Also contained in
+the struct is the location of a ko (@code{EMPTY}) if the last
+move was not a ko capture, the komi, the number of captures, and
+corresponding data for the initial position at the beginning
+of the move history.
+
+@node Positional Functions
+
+@section Functions which manipulate a Position
+
+All the functions in the engine that manipulate Positions have names
+prefixed by @code{gnugo_}. These functions still use the two-dimensional
+representation of the board (@pxref{The Board Array}). Here is a complete
+list, as prototyped in @file{gnugo.h}:
+
+@itemize
+@item @code{void init_gnugo(float memory)}
+@findex init_gnugo
+@quotation
+Initialize the gnugo engine. This needs to be called 
+once only.
+@end quotation
+@item @code{void gnugo_clear_board(int boardsize)}
+@findex gnugo_clear_board
+@quotation
+Clear the board.
+@end quotation
+@item @code{void gnugo_set_komi(float new_komi)}
+@findex gnugo_set_komi
+@quotation
+Set the komi.
+@end quotation
+@item @code{void gnugo_add_stone(int i, int j, int color)}
+@findex gnugo_add_stone
+@quotation
+Place a stone on the board
+@end quotation
+@item @code{void gnugo_remove_stone(int i, int j)}
+@findex gnugo_remove_stone
+@quotation
+Remove a stone from the board
+@end quotation
+@item @code{int gnugo_is_pass(int i, int j)}
+@findex gnugo_is_pass
+@quotation
+Return true if (i,j) is PASS_MOVE
+@end quotation
+@item @code{void gnugo_play_move(int i, int j, int color)}
+@findex gnugo_play_move
+@quotation
+Play a move and start the clock
+@end quotation
+@item @code{int gnugo_undo_move(int n)}
+@findex gnugo_undo_move
+@quotation
+Undo n permanent moves. Returns 1 if successful and 0 if it fails.
+If n moves cannot be undone, no move is undone.
+@end quotation
+@item @code{int gnugo_play_sgfnode(SGFNode *node, int to_move)}
+@findex gnugo_play_sgfnode
+@quotation
+Perform the moves and place the stones from the SGF node on the 
+board. Return the color of the player whose turn it is to move.
+@end quotation
+@item @code{int gnugo_play_sgftree(SGFNode *root, int *until, SGFNode **curnode)}
+@findex gnugo_play_sgftree
+@quotation
+Play the moves in ROOT UNTIL movenumber is reached.  Return the color of the
+player whose turn it is to move.  
+@end quotation
+@item @code{int gnugo_is_legal(int i, int j, int color)}
+@findex gnugo_is_legal
+@quotation
+Interface to @code{is_legal()}.
+@end quotation
+@item @code{int gnugo_is_suicide(int i, int j, int color)}
+@findex gnugo_is_suicide
+@quotation
+Interface to @code{is_suicide()}.
+@end quotation
+@item @code{int gnugo_placehand(int handicap)}
+@findex gnugo_placehand
+@quotation
+Interface to placehand. Sets up handicap pieces and
+returns the number of placed handicap stones.
+@end quotation
+@item @code{void gnugo_recordboard(SGFNode *root)}
+@findex gnugo_recordboard
+@quotation
+Interface to @code{sgffile_recordboard()}
+@end quotation
+@item @code{int gnugo_sethand(int handicap, SGFNode *node)}
+@findex gnugo_sethand
+@quotation
+Interface to placehand. Sets up handicap stones and
+returns the number of placed handicap stones, updating the sgf file
+@end quotation
+@item @code{float gnugo_genmove(int *i, int *j, int color, int *resign)}
+@findex gnugo_genmove
+@quotation
+Interface to @code{genmove()}.
+@end quotation
+@item @code{int gnugo_attack(int m, int n, int *i, int *j)}
+@findex gnugo_attack
+@quotation
+Interface to @code{attack()}.
+@end quotation
+@item @code{int gnugo_find_defense(int m, int n, int *i, int *j)}
+@findex gnugo_find_defense
+@quotation
+Interface to @code{find_defense()}.
+@end quotation
+@item @code{void gnugo_who_wins(int color, FILE *outfile)}
+@findex gnugo_who_wins
+@quotation
+Interface to @code{who_wins()}.
+@end quotation
+@item @code{float gnugo_estimate_score(float *upper, float *lower)}
+@findex gnugo_estimate_score
+@quotation
+Put upper and lower score estimates into @code{*upper}, @code{*lower} and
+return the average. A positive score favors white. In computing
+the upper bound, @code{CRITICAL} dragons are awarded to white; in
+computing the lower bound, they are awarded to black.
+@end quotation
+@item @code{void gnugo_examine_position(int color, int how_much)}
+@findex gnugo_examine_position
+@quotation
+Interface to @code{examine_position}.
+@end quotation
+@item @code{int gnugo_get_komi()}
+@findex gnugo_get_komi
+@quotation
+Report the komi.
+@end quotation
+@item @code{void gnugo_get_board(int b[MAX_BOARD][MAX_BOARD])}
+@findex gnugo_get_board
+@quotation
+Place the board into the @samp{b} array.
+@end quotation
+@item @code{int gnugo_get_boardsize()}
+@findex gnugo_get_boardsize
+@quotation
+Report the board size.
+@end quotation
+@item @code{int gnugo_get_move_number()}
+@findex gnugo_get_move_number
+@quotation
+Report the move number.
+@end quotation
+@end itemize
+
+@section Game handling
+
+The functions (in @pxref{Positional Functions}) are all that are needed to
+create a fully functional go program.  But to make the life easier for the
+programmer, there is a small set of functions specially designed for handling
+ongoing games.
+
+The data structure describing an ongoing game is the @code{Gameinfo}. It
+is defined as follows:
+
+@example
+@group
+
+typedef struct @{
+  int       handicap;
+
+  int       to_move;            /* whose move it currently is */
+  SGFTree   game_record;        /* Game record in sgf format. */
+
+  int       computer_player;    /* BLACK, WHITE, or EMPTY (used as BOTH) */
+
+  char      outfilename[128];   /* Trickle file */
+  FILE      *outfile;
+@} Gameinfo;
+
+@end group
+@end example
+
+The meaning of @code{handicap} should be obvious. @code{to_move} is the
+color of the side whose turn it is to move.
+
+The SGF tree @code{game_record} is used to store all the moves in the entire
+game, including a header node which contains, among other things, komi
+and handicap.
+
+If one or both of the opponents is the computer, the field
+@code{computer_player} is used. Otherwise it can be ignored.
+
+GNU Go can use a trickle file to continuously save all the moves of an
+ongoing game. This file can also contain information about internal
+state of the engine such as move reasons for various locations or move
+valuations. The name of this file should
+be stored in @code{outfilename} and the file pointer to the open file is
+stored in @code{outfile}. If no trickle file is used,
+@code{outfilename[0]} will contain a null character and @code{outfile}
+will be set to @code{NULL}.
+
+@subsection Functions which manipulate a Gameinfo
+
+All the functions in the engine that manipulate Gameinfos have names
+prefixed by @code{gameinfo_}.  Here is a complete list, as prototyped in
+@file{gnugo.h}:
+
+@itemize
+@item @code{void gameinfo_clear(Gameinfo *ginfo, int boardsize, float komi)}
+@findex gameinfo_clear
+@quotation
+Initialize the @code{Gameinfo} structure.
+@end quotation
+@item @code{void gameinfo_print(Gameinfo *ginfo)}
+@findex gameinfo_print
+@quotation
+Print a gameinfo.
+@end quotation
+@item @code{void gameinfo_load_sgfheader(Gameinfo *gameinfo, SGFNode *head)}
+@findex gameinfo_load_sgfheader
+@quotation
+Reads header info from sgf structure and sets the appropriate variables.
+@end quotation
+@item @code{void gameinfo_play_move(Gameinfo *ginfo, int i, int j, int color)}
+@findex gameinfo_play_move
+@quotation
+Make a move in the game. Return 1 if the move was legal. In that
+case the move is actually done. Otherwise return 0.
+@end quotation
+@item @code{int gameinfo_play_sgftree_rot(Gameinfo *gameinfo, SGFNode *head, const char *untilstr, int orientation)}
+@findex gameinfo_play_sgftree_rot
+@quotation
+Play the moves in an SGF tree. Walk the main variation, actioning the
+properties into the playing board. Returns the color of the next move to be
+made. Head is an sgf tree. Untilstr is an optional string of the form either
+'L12' or '120' which tells it to stop playing at that move or move
+number. When debugging, this is the location of the move being examined.
+@end quotation
+@item @code{int gameinfo_play_sgftree(Gameinfo *gameinfo, SGFNode *head, const char *untilstr)}
+@findex gameinfo_play_sgftree
+@quotation
+Same as previous function, using standard orientation.
+@end quotation
+@end itemize
+
+
diff --git a/doc/automake-1.4.patch b/doc/automake-1.4.patch
new file mode 100644 (file)
index 0000000..607c077
--- /dev/null
@@ -0,0 +1,11 @@
+--- automake.orig      Sat Jan 16 19:37:42 1999
++++ automake   Sat Oct 30 15:55:04 1999
+@@ -2367,7 +2367,7 @@
+       $output_rules .= "\t  d=\$(srcdir); \\\n";
+     }
+     $output_rules .= ("\t  if test -d \$\$d/\$\$file; then \\\n"
+-                    . "\t    cp -pr \$\$/\$\$file \$(distdir)/\$\$file; \\\n"
++                    . "\t    cp -pr \$\$d/\$\$file \$(distdir)/\$\$file; \\\n"
+                     . "\t  else \\\n"
+                     . "\t    test -f \$(distdir)/\$\$file \\\n"
+                     . "\t    || ln \$\$d/\$\$file \$(distdir)/\$\$file 2> /dev/null \\\n"
diff --git a/doc/board.texi b/doc/board.texi
new file mode 100644 (file)
index 0000000..64595cd
--- /dev/null
@@ -0,0 +1,573 @@
+@menu
+* Board Data Structures::      Board Data Structures
+* The Board Array::           One-dimensional board array
+* Incremental Board::          Incremental board data structures
+* Some Board Functions::       Explanation of some board functions
+@end menu
+
+The foundation of the GNU Go engine is a library of very efficient
+routines for handling go boards.  This board library, called
+@file{libboard}, can be used for those programs that only need a
+basic go board but no AI capability. One such program is
+@file{patterns/joseki.c}, which compiles joseki pattern
+databases from SGF files.
+
+If you want to use the board library in your own program, you need all
+the .c-files listed under libboard_SOURCES in engine/Makefile.am, and
+the files in the directories sgf/ and utils/. Then you should include
+engine/board.h in your code.
+
+The library consists of the following files:
+
+@itemize
+@item @file{board.h}
+@quotation
+The public interface to the board library.
+@end quotation
+
+@item @file{board.c}
+@quotation
+The basic board code. It uses incremental algorithms for keeping track
+of strings and liberties on the go board.
+@end quotation
+
+@item @file{boardlib.c}
+@quotation
+This contains all global variable of the board library.
+@end quotation
+
+@item @file{hash.c}
+@quotation
+Code for hashing go positions.
+@end quotation
+
+@item @file{sgffile.c}
+@quotation
+Implementation of output file in SGF format.
+@end quotation
+
+@item @file{printutils.c}
+@quotation
+Utilities for printing go boards and other things.
+@end quotation
+
+@end itemize
+
+To use the board library, you must include @file{liberty.h} just like
+when you use the whole engine, but of course you cannot use all the
+functions declared in it, i.e. the functions that are part of the
+engine, but not part of the board library.  You must link your
+application with @code{libboard.a}.
+
+@node Board Data Structures
+@section Board Data structures
+
+The basic data structures of the board correspond tightly to the
+@code{board_state} struct described in @xref{The Board State}. They are all
+stored in global variables for efficiency reasons, the most important of which
+are:
+
+@example
+@group
+
+int           board_size;
+Intersection  board[MAXSIZE];
+int           board_ko_pos;
+
+float         komi;
+int           white_captured;
+int           black_captured;
+
+Hash_data     hashdata;
+@end group
+@end example
+
+The description of the @code{Position} struct is applicable to these
+variables also, so we won't duplicate it here.  All these variables are
+globals for performance reasons.  Behind these variables, there are a
+number of other private data structures.  These implement incremental
+handling of strings, liberties and other properties 
+(@pxref{Incremental Board}). The variable @code{hashdata} contains information
+about the hash value for the current position (@pxref{Hashing}).
+
+These variables should never be manipulated directly, since they are
+only the front end for the incremental machinery. They can be read, but
+should only be written by using the functions described in the next
+section. If you write directly to them, the incremental data structures
+will become out of sync with each other, and a crash is the likely
+result. 
+
+@node The Board Array
+@section The Board Array
+
+GNU Go represents the board in a one-dimensional array called
+@code{board}. For some purposes a two dimensional indexing of the
+board by parameters @code{(i,j)} might be used.
+
+The @code{board} array includes out-of-board markers around the
+board. To make the relation to the old two-dimensional board
+representation clear, this figure shows how the 1D indices correspond
+to the 2D indices when MAX_BOARD is 7.
+
+@example
+@group
+  j  -1   0   1   2   3   4   5   6
+i +----------------------------------
+-1|   0   1   2   3   4   5   6   7
+ 0|   8   9  10  11  12  13  14  15
+ 1|  16  17  18  19  20  21  22  23
+ 2|  24  25  26  27  28  29  30  31
+ 3|  32  33  34  35  36  37  38  39
+ 4|  40  41  42  43  44  45  46  47
+ 5|  48  49  50  51  52  53  54  55
+ 6|  56  57  58  59  60  61  62  63
+ 7|  64  65  66  67  68  69  70  71  72
+@end group
+@end example
+
+To convert between a 1D index @code{pos} and a 2D index @code{(i,j)},
+the macros @code{POS}, @code{I}, and @code{J} are provided, defined as
+below:
+
+@example
+#define POS(i, j)    ((MAX_BOARD + 2) + (i) * (MAX_BOARD + 1) + (j))
+#define I(pos)       ((pos) / (MAX_BOARD + 1) - 1)
+#define J(pos)       ((pos) % (MAX_BOARD + 1) - 1)
+@end example
+
+All 1D indices not corresponding to points on the board have the out
+of board marker value @code{GRAY}. Thus if @code{board_size} and
+@code{MAX_BOARD} both are 7, this looks like
+
+@example
+@group
+  j  -1   0   1   2   3   4   5   6
+i +----------------------------------
+-1|   #   #   #   #   #   #   #   #
+ 0|   #   .   .   .   .   .   .   .
+ 1|   #   .   .   .   .   .   .   .
+ 2|   #   .   .   .   .   .   .   .
+ 3|   #   .   .   .   .   .   .   .
+ 4|   #   .   .   .   .   .   .   .
+ 5|   #   .   .   .   .   .   .   .
+ 6|   #   .   .   .   .   .   .   .
+ 7|   #   #   #   #   #   #   #   #   #
+@end group
+@end example
+
+The indices marked @samp{#} have value @code{GRAY}.
+If @code{MAX_BOARD} is 7 and @code{board_size} is only 5:
+
+@example
+@group
+  j  -1   0   1   2   3   4   5   6
+i +----------------------------------
+-1|   #   #   #   #   #   #   #   #
+ 0|   #   .   .   .   .   .   #   #
+ 1|   #   .   .   .   .   .   #   #
+ 2|   #   .   .   .   .   .   #   #
+ 3|   #   .   .   .   .   .   #   #
+ 4|   #   .   .   .   .   .   #   #
+ 5|   #   #   #   #   #   #   #   #
+ 6|   #   #   #   #   #   #   #   #
+ 7|   #   #   #   #   #   #   #   #   #
+@end group
+@end example
+
+Navigation on the board is done by the @code{SOUTH}, @code{WEST},
+@code{NORTH}, and @code{EAST} macros,
+
+@example
+#define NS           (MAX_BOARD + 1)
+#define WE           1
+#define SOUTH(pos)   ((pos) + NS)
+#define WEST(pos)    ((pos) - 1)
+#define NORTH(pos)   ((pos) - NS)
+#define EAST(pos)    ((pos) + 1)
+@end example
+
+There are also shorthand macros @code{SW}, @code{NW}, @code{NE},
+@code{SE}, @code{SS}, @code{WW}, @code{NN}, @code{EE} for two step
+movements.
+
+Any movement from a point on the board to an adjacent or diagonal
+vertex is guaranteed to produce a valid index into the board array, and
+the color found is GRAY if it is not on the board. To do explicit tests
+for out of board there are two macros
+
+@example
+#define ON_BOARD(pos) (board[pos] != GRAY)
+#define ON_BOARD1(pos) (((unsigned) (pos) < BOARDSIZE) && board[pos] != GRAY)
+@end example
+
+where the first one should be used in the algorithms and the second
+one is useful for assertion tests.
+
+The advantage of a one-dimensional board array is that it gives a
+significant performance advantage. We need only one variable to determine
+a board position, which means that many functions need less arguments. Also,
+often one computation is sufficient for 1D-coordinate where we would need
+two with two 2D-coordinates: If we, for example, want to have the
+coordinate of the upper right of @code{pos}, we can do this with
+@code{NORTH(EAST(pos))} instead of @code{(i+1, j-1)}.
+
+@strong{Important}: The 2D coordinate @code{(-1,-1)}, which is used for
+pass and sometimes to indicate no point, maps to the 1D coordinate
+@code{0}, not to @code{-1}. Instead of a plain @code{0}, use one of the
+macros @code{NO_MOVE} or @code{PASS_MOVE}.
+
+A loop over multiple directions is straightforwardly written:
+
+@example
+  for (k = 0; k < 4; k++) @{
+    int d = delta[k];
+    do_something(pos + d);
+  @}
+@end example
+
+The following constants are useful for loops over the entire board and
+allocation of arrays with a 1-1 mapping to the board.
+
+@example
+#define BOARDSIZE    ((MAX_BOARD + 2) * (MAX_BOARD + 1) + 1)
+#define BOARDMIN     (MAX_BOARD + 2)
+#define BOARDMAX     (MAX_BOARD + 1) * (MAX_BOARD + 1)
+@end example
+
+@code{BOARDSIZE} is the actual size of the 1D board array,
+@code{BOARDMIN} is the first index corresponding to a point on the
+board, and @code{BOARDMAX} is one larger than the last index corresponding to
+a point on the board. 
+
+Often one wants to traverse the board, carrying out some function
+at every vertex. Here are two possible ways of doing this:
+
+@example
+  int m, n;
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) @{
+      do_something(POS(m, n));
+    @}
+@end example
+
+Or:
+
+@example
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) @{
+    if (ON_BOARD(pos))
+      do_something(pos);
+  @}
+@end example
+
+
+@node Incremental Board
+@section Incremental Board data structures
+
+In addition to the global board state, the algorithms in @file{board.c}
+implement a method of incremental updates that keeps track of the
+following information for each string:
+
+@itemize @bullet
+@item The color of the string.
+@item Number of stones in the string.
+@item Origin of the string, i.e. a canonical reference point, defined
+to be the stone with smallest 1D board coordinate.
+@item A list of the stones in the string.
+@item Number of liberties.
+@item A list of the liberties. If there are too many liberties the list is
+truncated.
+@item The number of neighbor strings.
+@item A list of the neighbor strings.
+@end itemize
+
+The basic data structure is
+
+@example
+struct string_data @{
+  int color;                       /* Color of string, BLACK or WHITE */
+  int size;                        /* Number of stones in string. */
+  int origin;                      /* Coordinates of "origin", i.e. */
+                                   /* "upper left" stone. */
+  int liberties;                   /* Number of liberties. */
+  int libs[MAX_LIBERTIES];         /* Coordinates of liberties. */
+  int neighbors;                   /* Number of neighbor strings */
+  int neighborlist[MAXCHAIN];      /* List of neighbor string numbers. */
+  int mark;                        /* General purpose mark. */
+@};
+
+struct string_data string[MAX_STRINGS];
+@end example
+
+It should be clear that almost all information is stored in the
+@code{string} array. To get a mapping from the board coordinates to the
+@code{string} array we have
+
+@example
+static int string_number[BOARDMAX];
+@end example
+
+@noindent
+which contains indices into the @code{string} array. This information is only
+valid at nonempty vertices, however, so it is necessary to first
+verify that @code{board[pos] != EMPTY}.
+
+The @code{string_data} structure does not include an array of the stone
+coordinates. This information is stored in a separate array:
+
+@example
+static int next_stone[BOARDMAX];
+@end example
+
+This array implements cyclic linked lists of stones. Each vertex
+contains a pointer to another (possibly the same) vertex. Starting at
+an arbitrary stone on the board, following these pointers should
+traverse the entire string in an arbitrary order before coming back to
+the starting point. As for the 'string_number' array, this information
+is invalid at empty points on the board. This data structure has the
+good properties of requiring fixed space (regardless of the number of
+strings) and making it easy to add a new stone or join two strings.
+
+Additionally the code makes use of some work variables:
+
+@example
+static int ml[BOARDMAX];
+static int liberty_mark;
+static int string_mark;
+static int next_string;
+static int strings_initialized = 0;
+@end example
+
+The @code{ml} array and @code{liberty_mark} are used to "mark" liberties on
+the board, e.g. to avoid counting the same liberty twice. The convention is
+that if @code{ml[pos]} has the same value as @code{liberty_mark}, then
+@code{pos} is marked. To clear all marks it suffices to increase the value
+of @code{liberty_mark}, since it is never allowed to decrease.
+
+The same relation holds between the @code{mark} field of the @code{string_data}
+structure and @code{string_mark}. Of course these are used for marking
+individual strings.
+
+@code{next_string} gives the number of the next available entry in the
+@code{string} array. Then @code{strings_initialized} is set to one when
+all data structures are known to be up to date. Given an arbitrary board
+position in the @samp{board} array, this is done by calling
+@code{incremental_board_init()}. It is not necessary to call this
+function explicitly since any other function that needs the information
+does this if it has not been done.
+
+The interesting part of the code is the incremental update of the data
+structures when a stone is played and subsequently removed. To
+understand the strategies involved in adding a stone it is necessary
+to first know how undoing a move works. The idea is that as soon as
+some piece of information is about to be changed, the old value is
+pushed onto a stack which stores the value and its address. The stack
+is built from the following structures:
+
+@example
+struct change_stack_entry @{
+  int *address;
+  int value;
+@};
+
+struct change_stack_entry change_stack[STACK_SIZE];
+int change_stack_index;
+@end example
+
+@noindent
+and manipulated with the macros
+
+@example
+BEGIN_CHANGE_RECORD()
+PUSH_VALUE(v)
+POP_MOVE()
+@end example
+
+Calling @code{BEGIN_CHANGE_RECORD()} stores a null pointer in the address
+field to indicate the start of changes for a new move. As mentioned
+earlier @code{PUSH_VALUE()} stores a value and its corresponding address.
+Assuming that all changed information has been duly pushed onto the
+stack, undoing the move is only a matter of calling @code{POP_MOVE()},
+which simply assigns the values to the addresses in the reverse order
+until the null pointer is reached. This description is slightly
+simplified because this stack can only store 'int' values and we need
+to also store changes to the board. Thus we have two parallel stacks
+where one stores @code{int} values and the other one stores
+@code{Intersection} values.
+
+When a new stone is played on the board, first captured opponent
+strings, if any, are removed. In this step we have to push the board
+values and the @code{next_stone} pointers for the removed stones, and
+update the liberties and neighbor lists for the neighbors of the
+removed strings. We do not have to push all information in the
+'string' entries of the removed strings however. As we do not reuse
+the entries they will remain intact until the move is pushed and they
+are back in use.
+
+After this we put down the new stone and get three distinct cases:
+
+@enumerate
+@item The new stone is isolated, i.e. it has no friendly neighbor.
+@item The new stone has exactly one friendly neighbor.
+@item The new stone has at least two friendly neighbors.
+@end enumerate
+
+The first case is easiest. Then we create a new string by using the
+number given by @code{next_string} and increasing this variable. The string
+will have size one, @code{next_stone} points directly back on itself, the
+liberties can be found by looking for empty points in the four
+directions, possible neighbor strings are found in the same way, and
+those need also to remove one liberty and add one neighbor.
+
+In the second case we do not create a new string but extend the
+neighbor with the new stone. This involves linking the new stone into
+the cyclic chain, if needed moving the origin, and updating liberties
+and neighbors. Liberty and neighbor information also needs updating
+for the neighbors of the new stone.
+
+In the third case finally, we need to join already existing strings.
+In order not to have to store excessive amounts of information, we
+create a new string for the new stone and let it assimilate the
+neighbor strings. Thus all information about those can simply be left
+around in the 'string' array, exactly as for removed strings. Here it
+becomes a little more complex to keep track of liberties and neighbors
+since those may have been shared by more than one of the joined
+strings. Making good use of marks it all becomes rather
+straightforward anyway.
+
+The often used construction
+
+@example
+    pos = FIRST_STONE(s);
+    do @{
+        ...
+        pos = NEXT_STONE(pos);
+    @} while (!BACK_TO_FIRST_STONE(s, pos));
+@end example
+
+@noindent
+traverses the stones of the string with number @samp{s} exactly once,
+with @code{pos} holding the coordinates. In general @code{pos} is
+used as board coordinate and @samp{s} as an index into the
+@code{string} array or sometimes a pointer to an entry in the
+@code{string} array.
+
+@node Some Board Functions
+@section Some Board Functions
+
+@strong{Reading}, often called @strong{search} in computer game
+theory, is a fundamental process in GNU Go. This is the process
+of generating hypothetical future boards in order to determine
+the answer to some question, for example "can these stones live."
+Since these are hypothetical future positions, it is important
+to be able to undo them, ultimately returning to the present
+board. Thus a move stack is maintained during reading. When
+a move is tried, by the function @code{trymove}, or its
+variant @code{tryko}. This function pushes the current board
+on the stack and plays a move. The stack pointer @code{stackp},
+which keeps track of the position, is incremented. The function
+@code{popgo()} pops the move stack, decrementing @code{stackp} and
+undoing the last move made.
+
+Every successful @code{trymove()} must be matched with a @code{popgo()}.
+Thus the correct way of using this function is:
+
+@example
+@group
+
+  if (trymove(pos, color, ... )) @{
+       ...    [potentially lots of code here]
+       popgo();
+  @}   
+
+@end group
+@end example
+
+@noindent
+
+In case the move is a ko capture, the legality of the capture is subject to
+the komaster scheme (@pxref{Ko}).
+
+@itemize @bullet
+@item @code{int trymove(int pos, int color, const char *message)}
+@findex trymove
+@quotation
+Returns true if @code{(pos)} is a legal move for @code{color}. In that
+case, it pushes the board on the stack and makes the move, incrementing
+@code{stackp}. If the reading code is recording reading variations (as
+with @option{--decide-string} or with @option{-o}), the string
+@code{*message} will be inserted in the SGF file as a comment. The
+comment will also refer to the string at @code{str} if this is not
+@code{0}. The value of @code{str} can be NO_MOVE if it is not needed but
+otherwise the location of @code{str} is included in the comment.
+@end quotation
+@item @code{int tryko(int pos, int color, const char *message)}
+@findex tryko
+@quotation
+@code{tryko()} pushes the position onto the stack, and makes a move
+@code{pos} of @code{color}. The move is allowed even if it is an
+illegal ko capture. It is to be imagined that @code{color} has made an
+intervening ko threat which was answered and now the continuation is to
+be explored. Return 1 if the move is legal with the above
+caveat. Returns zero if it is not legal because of suicide.
+@end quotation
+
+@item @code{void popgo()}
+@findex popgo
+@quotation
+Pops the move stack. This function must (eventually) be called after a
+succesful @code{trymove} or @code{tryko} to restore the board
+position. It undoes all the changes done by the call to
+@code{trymove/tryko} and leaves the board in the same state as it was
+before the call.
+
+@strong{NOTE}: If @code{trymove/tryko} returns @code{0}, i.e. the tried
+move was not legal, you must @strong{not} call @code{popgo}.
+@end quotation
+
+@item @code{int komaster_trymove(int pos, int color, const char *message, int str, int *is_conditional_ko, int consider_conditional_ko)}
+@findex komaster_trymove
+@quotation
+Variation of @code{trymove}/@code{tryko} where ko captures (both
+conditional and unconditional) must follow a komaster scheme
+(@pxref{Ko}).
+@end quotation
+
+@end itemize
+
+As you see, @code{trymove()} plays a move which can be easily
+retracted (with @code{popgo()}) and it is call thousands of
+times per actual game move as GNU Go analyzes the board position.
+By contrast the function @code{play_move()} plays a move which
+is intended to be permanent, though it is still possible to
+undo it if, for example, the opponent retracts a move.
+
+@itemize @bullet
+@item @code{void play_move(int pos, int color)}
+@findex play_move
+@quotation
+Play a move. If you want to test for legality you should first call
+@code{is_legal()}. This function strictly follows the algorithm: 
+@enumerate
+@item Place a stone of given color on the board.
+@item If there are any adjacent opponent strings without liberties,
+remove them and increase the prisoner count. 
+@item If the newly placed stone is part of a string without liberties,
+remove it and increase the prisoner count.
+@end enumerate
+In spite of the name ``permanent move'', this move can (usually) be
+unplayed by @code{undo_move()}, but it is significantly more costly than
+unplaying a temporary move. There are limitations on the available
+move history, so under certain circumstances the move may not be
+possible to unplay at a later time.
+@end quotation
+@item @code{int undo_move(int n)}
+@findex undo_move
+@quotation
+Undo @samp{n} permanent moves. Returns 1 if successful and 0 if it fails.
+If @samp{n} moves cannot be undone, no move is undone.
+@end quotation
+@end itemize
+
+Other board functions are documented in @xref{Board Utilities}.
+
diff --git a/doc/cdfa.eps b/doc/cdfa.eps
new file mode 100644 (file)
index 0000000..4efdbf2
--- /dev/null
@@ -0,0 +1,930 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: cdfa.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Fri Jun 22 18:54:03 2001
+%%For: turvoy@semeai.irisa.fr (Tanguy Urvoy, DEA, Paragraphe)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 411 113
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 0.5000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-6.0 113.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 4750 m -1000 -1000 l 14886 -1000 l 14886 4750 l cp clip
+ 0.03000 0.03000 sc
+7.500 slw
+% Ellipse
+n 900 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6300 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4500 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 8100 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 9600 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 11100 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 12600 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 2700 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4500 2700 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6300 2700 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 9600 2700 300 300 0 360 DrawEllipse gs col21 s gr
+
+% Polyline
+gs  clippath
+5835 870 m 6000 900 l 5835 930 l 6015 930 l 6015 870 l cp
+clip
+n 4800 900 m 6000 900 l gs col0 s gr gr
+
+% arrowhead
+n 5835 870 m 6000 900 l 5835 930 l 5835 900 l 5835 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5859 990 m 6000 900 l 5900 1034 l 6031 912 l 5991 868 l cp
+clip
+n 4800 900 m 4802 902 l 4807 906 l 4815 914 l 4828 926 l 4846 942 l
+ 4869 963 l 4896 986 l 4926 1013 l 4958 1041 l 4992 1070 l
+ 5027 1099 l 5061 1127 l 5095 1154 l 5128 1178 l 5159 1201 l
+ 5188 1221 l 5216 1238 l 5242 1254 l 5267 1267 l 5291 1277 l
+ 5314 1286 l 5336 1292 l 5358 1297 l 5379 1299 l 5400 1300 l
+ 5421 1299 l 5442 1297 l 5464 1292 l 5486 1286 l 5509 1277 l
+ 5533 1267 l 5558 1254 l 5584 1238 l 5612 1221 l 5641 1201 l
+ 5672 1178 l 5705 1154 l 5739 1127 l 5773 1099 l 5808 1070 l
+ 5842 1041 l 5874 1013 l 5904 986 l 5931 963 l 5954 942 l
+ 5972 926 l 6000 900 l gs col0 s gr gr
+
+% arrowhead
+n 5859 990 m 6000 900 l 5900 1034 l 5879 1012 l 5859 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5900 758 m 6000 892 l 5859 802 l 5991 924 l 6031 880 l cp
+clip
+n 4800 892 m 4802 890 l 4807 886 l 4815 878 l 4828 866 l 4846 850 l
+ 4869 829 l 4896 806 l 4926 779 l 4958 751 l 4992 722 l
+ 5027 693 l 5061 665 l 5095 638 l 5128 614 l 5159 591 l
+ 5188 571 l 5216 554 l 5242 538 l 5267 525 l 5291 515 l
+ 5314 506 l 5336 500 l 5358 495 l 5379 493 l 5400 492 l
+ 5421 493 l 5442 495 l 5464 500 l 5486 506 l 5509 515 l
+ 5533 525 l 5558 538 l 5584 554 l 5612 571 l 5641 591 l
+ 5672 614 l 5705 638 l 5739 665 l 5773 693 l 5808 722 l
+ 5842 751 l 5874 779 l 5904 806 l 5931 829 l 5954 850 l
+ 5972 866 l 6000 892 l gs col0 s gr gr
+
+% arrowhead
+n 5900 758 m 6000 892 l 5859 802 l 5879 780 l 5900 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4035 870 m 4200 900 l 4035 930 l 4215 930 l 4215 870 l cp
+clip
+n 3000 900 m 4200 900 l gs col0 s gr gr
+
+% arrowhead
+n 4035 870 m 4200 900 l 4035 930 l 4035 900 l 4035 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4059 990 m 4200 900 l 4100 1034 l 4231 912 l 4191 868 l cp
+clip
+n 3000 900 m 3002 902 l 3007 906 l 3015 914 l 3028 926 l 3046 942 l
+ 3069 963 l 3096 986 l 3126 1013 l 3158 1041 l 3192 1070 l
+ 3227 1099 l 3261 1127 l 3295 1154 l 3328 1178 l 3359 1201 l
+ 3388 1221 l 3416 1238 l 3442 1254 l 3467 1267 l 3491 1277 l
+ 3514 1286 l 3536 1292 l 3558 1297 l 3579 1299 l 3600 1300 l
+ 3621 1299 l 3642 1297 l 3664 1292 l 3686 1286 l 3709 1277 l
+ 3733 1267 l 3758 1254 l 3784 1238 l 3812 1221 l 3841 1201 l
+ 3872 1178 l 3905 1154 l 3939 1127 l 3973 1099 l 4008 1070 l
+ 4042 1041 l 4074 1013 l 4104 986 l 4131 963 l 4154 942 l
+ 4172 926 l 4200 900 l gs col0 s gr gr
+
+% arrowhead
+n 4059 990 m 4200 900 l 4100 1034 l 4079 1012 l 4059 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4100 758 m 4200 892 l 4059 802 l 4191 924 l 4231 880 l cp
+clip
+n 3000 892 m 3002 890 l 3007 886 l 3015 878 l 3028 866 l 3046 850 l
+ 3069 829 l 3096 806 l 3126 779 l 3158 751 l 3192 722 l
+ 3227 693 l 3261 665 l 3295 638 l 3328 614 l 3359 591 l
+ 3388 571 l 3416 554 l 3442 538 l 3467 525 l 3491 515 l
+ 3514 506 l 3536 500 l 3558 495 l 3579 493 l 3600 492 l
+ 3621 493 l 3642 495 l 3664 500 l 3686 506 l 3709 515 l
+ 3733 525 l 3758 538 l 3784 554 l 3812 571 l 3841 591 l
+ 3872 614 l 3905 638 l 3939 665 l 3973 693 l 4008 722 l
+ 4042 751 l 4074 779 l 4104 806 l 4131 829 l 4154 850 l
+ 4172 866 l 4200 892 l gs col0 s gr gr
+
+% arrowhead
+n 4100 758 m 4200 892 l 4059 802 l 4079 780 l 4100 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2247 969 m 2400 900 l 2281 1018 l 2429 916 l 2395 867 l cp
+clip
+n 1200 900 m 1203 902 l 1209 906 l 1219 913 l 1235 924 l 1257 939 l
+ 1284 957 l 1315 978 l 1350 1000 l 1387 1024 l 1424 1047 l
+ 1461 1070 l 1498 1092 l 1533 1112 l 1566 1129 l 1598 1145 l
+ 1627 1159 l 1655 1170 l 1681 1180 l 1706 1187 l 1730 1193 l
+ 1754 1197 l 1777 1199 l 1800 1200 l 1823 1199 l 1846 1197 l
+ 1870 1193 l 1894 1187 l 1919 1180 l 1945 1170 l 1973 1159 l
+ 2002 1145 l 2034 1129 l 2067 1112 l 2102 1092 l 2139 1070 l
+ 2176 1047 l 2213 1024 l 2250 1000 l 2285 978 l 2316 957 l
+ 2343 939 l 2365 924 l 2400 900 l gs col0 s gr gr
+
+% arrowhead
+n 2247 969 m 2400 900 l 2281 1018 l 2264 993 l 2247 969 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+435 870 m 600 900 l 435 930 l 615 930 l 615 870 l cp
+clip
+n 225 900 m 600 900 l gs col0 s gr gr
+
+% arrowhead
+n 435 870 m 600 900 l 435 930 l 435 900 l 435 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7635 870 m 7800 900 l 7635 930 l 7815 930 l 7815 870 l cp
+clip
+n 6600 900 m 7800 900 l gs col0 s gr gr
+
+% arrowhead
+n 7635 870 m 7800 900 l 7635 930 l 7635 900 l 7635 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7659 990 m 7800 900 l 7700 1034 l 7831 912 l 7791 868 l cp
+clip
+n 6600 900 m 6602 902 l 6607 906 l 6615 914 l 6628 926 l 6646 942 l
+ 6669 963 l 6696 986 l 6726 1013 l 6758 1041 l 6792 1070 l
+ 6827 1099 l 6861 1127 l 6895 1154 l 6928 1178 l 6959 1201 l
+ 6988 1221 l 7016 1238 l 7042 1254 l 7067 1267 l 7091 1277 l
+ 7114 1286 l 7136 1292 l 7158 1297 l 7179 1299 l 7200 1300 l
+ 7221 1299 l 7242 1297 l 7264 1292 l 7286 1286 l 7309 1277 l
+ 7333 1267 l 7358 1254 l 7384 1238 l 7412 1221 l 7441 1201 l
+ 7472 1178 l 7505 1154 l 7539 1127 l 7573 1099 l 7608 1070 l
+ 7642 1041 l 7674 1013 l 7704 986 l 7731 963 l 7754 942 l
+ 7772 926 l 7800 900 l gs col0 s gr gr
+
+% arrowhead
+n 7659 990 m 7800 900 l 7700 1034 l 7679 1012 l 7659 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7700 758 m 7800 892 l 7659 802 l 7791 924 l 7831 880 l cp
+clip
+n 6600 892 m 6602 890 l 6607 886 l 6615 878 l 6628 866 l 6646 850 l
+ 6669 829 l 6696 806 l 6726 779 l 6758 751 l 6792 722 l
+ 6827 693 l 6861 665 l 6895 638 l 6928 614 l 6959 591 l
+ 6988 571 l 7016 554 l 7042 538 l 7067 525 l 7091 515 l
+ 7114 506 l 7136 500 l 7158 495 l 7179 493 l 7200 492 l
+ 7221 493 l 7242 495 l 7264 500 l 7286 506 l 7309 515 l
+ 7333 525 l 7358 538 l 7384 554 l 7412 571 l 7441 591 l
+ 7472 614 l 7505 638 l 7539 665 l 7573 693 l 7608 722 l
+ 7642 751 l 7674 779 l 7704 806 l 7731 829 l 7754 850 l
+ 7772 866 l 7800 892 l gs col0 s gr gr
+
+% arrowhead
+n 7700 758 m 7800 892 l 7659 802 l 7679 780 l 7700 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9135 870 m 9300 900 l 9135 930 l 9315 930 l 9315 870 l cp
+clip
+n 8400 900 m 9300 900 l gs col0 s gr gr
+
+% arrowhead
+n 9135 870 m 9300 900 l 9135 930 l 9135 900 l 9135 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+10635 870 m 10800 900 l 10635 930 l 10815 930 l 10815 870 l cp
+clip
+n 9900 900 m 10800 900 l gs col0 s gr gr
+
+% arrowhead
+n 10635 870 m 10800 900 l 10635 930 l 10635 900 l 10635 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+12135 870 m 12300 900 l 12135 930 l 12315 930 l 12315 870 l cp
+clip
+n 11400 900 m 12300 900 l gs col0 s gr gr
+
+% arrowhead
+n 12135 870 m 12300 900 l 12135 930 l 12135 900 l 12135 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2281 782 m 2400 900 l 2247 831 l 2395 933 l 2429 884 l cp
+clip
+n 1200 900 m 1203 898 l 1209 894 l 1219 887 l 1235 876 l 1257 861 l
+ 1284 843 l 1315 822 l 1350 800 l 1387 776 l 1424 753 l
+ 1461 730 l 1498 708 l 1533 688 l 1566 671 l 1598 655 l
+ 1627 641 l 1655 630 l 1681 620 l 1706 613 l 1730 607 l
+ 1754 603 l 1777 601 l 1800 600 l 1823 601 l 1846 603 l
+ 1870 607 l 1894 613 l 1919 620 l 1945 630 l 1973 641 l
+ 2002 655 l 2034 671 l 2067 688 l 2102 708 l 2139 730 l
+ 2176 753 l 2213 776 l 2250 800 l 2285 822 l 2316 843 l
+ 2343 861 l 2365 876 l 2400 900 l gs col0 s gr gr
+
+% arrowhead
+n 2281 782 m 2400 900 l 2247 831 l 2264 807 l 2281 782 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2210 2613 m 2359 2688 l 2193 2671 l 2406 2733 l 2423 2675 l cp
+clip
+n 900 1200 m 901 1202 l 902 1207 l 905 1217 l 909 1231 l 915 1252 l
+ 923 1278 l 932 1310 l 944 1348 l 957 1391 l 971 1438 l
+ 987 1488 l 1004 1540 l 1021 1592 l 1039 1645 l 1057 1697 l
+ 1075 1748 l 1093 1796 l 1111 1843 l 1128 1887 l 1146 1929 l
+ 1163 1968 l 1181 2005 l 1198 2039 l 1216 2071 l 1233 2101 l
+ 1251 2130 l 1270 2156 l 1289 2181 l 1309 2205 l 1329 2228 l
+ 1350 2250 l 1372 2271 l 1395 2291 l 1419 2311 l 1444 2330 l
+ 1470 2349 l 1499 2367 l 1529 2384 l 1561 2402 l 1595 2419 l
+ 1632 2437 l 1671 2454 l 1713 2472 l 1757 2489 l 1804 2507 l
+ 1852 2525 l 1903 2543 l 1955 2561 l 2008 2579 l 2060 2596 l
+ 2112 2613 l 2162 2629 l 2209 2643 l 2252 2656 l 2290 2668 l
+ 2322 2677 l 2348 2685 l 2369 2691 l 2400 2700 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 2210 2613 m 2359 2688 l 2193 2671 l 2201 2642 l 2210 2613 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+4035 2670 m 4200 2700 l 4035 2730 l 4215 2730 l 4215 2670 l cp
+clip
+n 3000 2700 m 4200 2700 l gs col0 s gr gr
+
+% arrowhead
+n 4035 2670 m 4200 2700 l 4035 2730 l 4035 2700 l 4035 2670 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4176 1309 m 4260 1164 l 4232 1330 l 4308 1121 l 4252 1101 l cp
+clip
+n 2925 2475 m 2927 2474 l 2931 2473 l 2940 2469 l 2952 2464 l 2970 2457 l
+ 2993 2448 l 3022 2437 l 3055 2424 l 3093 2408 l 3134 2391 l
+ 3177 2373 l 3223 2354 l 3269 2335 l 3315 2314 l 3361 2294 l
+ 3406 2274 l 3448 2255 l 3489 2235 l 3528 2216 l 3565 2197 l
+ 3599 2179 l 3632 2161 l 3662 2144 l 3690 2126 l 3717 2109 l
+ 3742 2091 l 3766 2074 l 3788 2056 l 3810 2038 l 3830 2019 l
+ 3850 2000 l 3870 1979 l 3890 1957 l 3909 1935 l 3927 1911 l
+ 3945 1886 l 3963 1860 l 3980 1832 l 3997 1802 l 4015 1770 l
+ 4032 1736 l 4050 1699 l 4068 1661 l 4086 1620 l 4104 1577 l
+ 4123 1533 l 4141 1487 l 4159 1441 l 4177 1395 l 4194 1350 l
+ 4210 1307 l 4225 1267 l 4238 1231 l 4249 1200 l 4258 1175 l
+ 4264 1155 l 4275 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 4176 1309 m 4260 1164 l 4232 1330 l 4204 1319 l 4176 1309 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+4099 1238 m 4243 1152 l 4138 1283 l 4306 1138 l 4267 1092 l cp
+clip
+n 2925 2475 m 2927 2473 l 2930 2469 l 2937 2462 l 2947 2451 l 2961 2436 l
+ 2979 2416 l 3001 2392 l 3026 2364 l 3055 2332 l 3086 2298 l
+ 3118 2263 l 3152 2226 l 3186 2189 l 3219 2152 l 3252 2117 l
+ 3284 2082 l 3315 2049 l 3344 2017 l 3372 1987 l 3399 1958 l
+ 3424 1931 l 3449 1906 l 3472 1881 l 3495 1858 l 3516 1835 l
+ 3538 1813 l 3559 1792 l 3579 1771 l 3600 1750 l 3621 1729 l
+ 3641 1709 l 3662 1688 l 3684 1668 l 3705 1647 l 3728 1625 l
+ 3751 1603 l 3776 1580 l 3801 1556 l 3828 1531 l 3856 1505 l
+ 3885 1478 l 3916 1450 l 3948 1421 l 3981 1391 l 4014 1360 l
+ 4048 1330 l 4082 1299 l 4114 1270 l 4145 1242 l 4174 1216 l
+ 4199 1193 l 4221 1173 l 4239 1157 l 4253 1144 l 4275 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 4099 1238 m 4243 1152 l 4138 1283 l 4118 1260 l 4099 1238 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+5907 1250 m 6045 1154 l 5950 1293 l 6107 1136 l 6064 1093 l cp
+clip
+n 4725 2475 m 6075 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 5907 1250 m 6045 1154 l 5950 1293 l 5929 1271 l 5907 1250 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+5862 2604 m 6000 2700 l 5837 2659 l 6001 2734 l 6026 2679 l cp
+clip
+n 4800 2700 m 4803 2699 l 4809 2696 l 4819 2691 l 4835 2684 l 4857 2674 l
+ 4884 2662 l 4915 2648 l 4950 2633 l 4987 2617 l 5024 2602 l
+ 5061 2586 l 5098 2572 l 5133 2559 l 5166 2547 l 5198 2537 l
+ 5227 2527 l 5255 2520 l 5281 2513 l 5306 2508 l 5330 2505 l
+ 5354 2502 l 5377 2500 l 5400 2500 l 5423 2500 l 5446 2502 l
+ 5470 2505 l 5494 2508 l 5519 2513 l 5545 2520 l 5573 2527 l
+ 5602 2537 l 5634 2547 l 5667 2559 l 5702 2572 l 5739 2586 l
+ 5776 2602 l 5813 2617 l 5850 2633 l 5885 2648 l 5916 2662 l
+ 5943 2674 l 5965 2684 l 6000 2700 l gs col0 s gr gr
+
+% arrowhead
+n 5862 2604 m 6000 2700 l 5837 2659 l 5850 2631 l 5862 2604 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5837 2741 m 6000 2700 l 5862 2796 l 6026 2721 l 6001 2666 l cp
+clip
+n 4800 2700 m 4803 2701 l 4809 2704 l 4819 2709 l 4835 2716 l 4857 2726 l
+ 4884 2738 l 4915 2752 l 4950 2767 l 4987 2783 l 5024 2798 l
+ 5061 2814 l 5098 2828 l 5133 2841 l 5166 2853 l 5198 2863 l
+ 5227 2873 l 5255 2880 l 5281 2887 l 5306 2892 l 5330 2895 l
+ 5354 2898 l 5377 2900 l 5400 2900 l 5423 2900 l 5446 2898 l
+ 5470 2895 l 5494 2892 l 5519 2887 l 5545 2880 l 5573 2873 l
+ 5602 2863 l 5634 2853 l 5667 2841 l 5702 2828 l 5739 2814 l
+ 5776 2798 l 5813 2783 l 5850 2767 l 5885 2752 l 5916 2738 l
+ 5943 2726 l 5965 2716 l 6000 2700 l gs col0 s gr gr
+
+% arrowhead
+n 5837 2741 m 6000 2700 l 5862 2796 l 5850 2769 l 5837 2741 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6330 3135 m 6300 3300 l 6270 3135 l 6270 3315 l 6330 3315 l cp
+clip
+n 6300 3000 m 6300 3300 l gs col0 s gr gr
+
+% arrowhead
+n 6330 3135 m 6300 3300 l 6270 3135 l 6300 3135 l 6330 3135 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7674 1182 m 7836 1142 l 7698 1236 l 7901 1146 l 7877 1091 l cp
+clip
+n 6525 2475 m 6526 2473 l 6527 2468 l 6531 2460 l 6536 2447 l 6542 2428 l
+ 6551 2405 l 6562 2376 l 6575 2343 l 6590 2306 l 6606 2266 l
+ 6623 2225 l 6641 2182 l 6659 2138 l 6677 2096 l 6696 2054 l
+ 6714 2014 l 6732 1976 l 6750 1939 l 6768 1905 l 6785 1873 l
+ 6803 1843 l 6820 1814 l 6837 1787 l 6855 1762 l 6873 1738 l
+ 6891 1714 l 6910 1692 l 6930 1671 l 6950 1650 l 6970 1631 l
+ 6990 1612 l 7012 1594 l 7034 1575 l 7058 1557 l 7083 1539 l
+ 7110 1520 l 7138 1502 l 7168 1482 l 7201 1463 l 7235 1443 l
+ 7272 1422 l 7311 1401 l 7352 1379 l 7394 1357 l 7439 1334 l
+ 7485 1311 l 7531 1288 l 7577 1265 l 7623 1243 l 7666 1222 l
+ 7707 1203 l 7745 1185 l 7778 1170 l 7807 1156 l 7830 1146 l
+ 7848 1137 l 7875 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 7674 1182 m 7836 1142 l 7698 1236 l 7686 1209 l 7674 1182 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+7840 1378 m 7933 1238 l 7895 1402 l 7983 1198 l 7928 1174 l cp
+clip
+n 6525 2475 m 6527 2474 l 6531 2473 l 6540 2470 l 6552 2466 l 6570 2461 l
+ 6594 2453 l 6622 2444 l 6655 2433 l 6693 2420 l 6734 2406 l
+ 6778 2391 l 6824 2375 l 6871 2359 l 6917 2342 l 6963 2325 l
+ 7008 2308 l 7051 2291 l 7093 2274 l 7132 2258 l 7169 2242 l
+ 7204 2226 l 7237 2210 l 7268 2195 l 7297 2179 l 7324 2163 l
+ 7350 2147 l 7375 2131 l 7398 2115 l 7420 2098 l 7442 2080 l
+ 7463 2063 l 7484 2043 l 7505 2022 l 7525 2000 l 7545 1978 l
+ 7564 1953 l 7584 1928 l 7603 1900 l 7622 1871 l 7642 1840 l
+ 7662 1806 l 7682 1770 l 7703 1732 l 7724 1692 l 7745 1650 l
+ 7767 1606 l 7789 1560 l 7811 1514 l 7832 1468 l 7852 1424 l
+ 7871 1381 l 7889 1341 l 7905 1306 l 7918 1275 l 7929 1250 l
+ 7937 1230 l 7950 1200 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 7840 1378 m 7933 1238 l 7895 1402 l 7868 1390 l 7840 1378 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+7704 1320 m 7844 1228 l 7745 1364 l 7907 1212 l 7865 1168 l cp
+clip
+n 6525 2475 m 7875 1200 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 7704 1320 m 7844 1228 l 7745 1364 l 7725 1342 l 7704 1320 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+12570 465 m 12600 300 l 12630 465 l 12630 285 l 12570 285 l cp
+clip
+n 12600 600 m 12600 300 l gs col0 s gr gr
+
+% arrowhead
+n 12570 465 m 12600 300 l 12630 465 l 12600 465 l 12570 465 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9179 2380 m 9271 2519 l 9135 2421 l 9289 2582 l 9332 2540 l cp
+clip
+n 8250 1200 m 8251 1202 l 8254 1206 l 8258 1214 l 8265 1226 l 8275 1243 l
+ 8287 1264 l 8302 1290 l 8319 1319 l 8338 1352 l 8358 1386 l
+ 8379 1422 l 8401 1458 l 8422 1494 l 8443 1529 l 8464 1563 l
+ 8484 1596 l 8504 1627 l 8522 1657 l 8540 1685 l 8558 1712 l
+ 8575 1737 l 8592 1762 l 8608 1785 l 8625 1808 l 8641 1831 l
+ 8658 1853 l 8675 1875 l 8691 1896 l 8708 1916 l 8725 1937 l
+ 8743 1959 l 8761 1980 l 8781 2003 l 8801 2026 l 8823 2051 l
+ 8846 2076 l 8870 2103 l 8896 2131 l 8924 2160 l 8953 2191 l
+ 8983 2223 l 9014 2256 l 9047 2289 l 9079 2323 l 9112 2357 l
+ 9143 2389 l 9173 2420 l 9201 2449 l 9226 2474 l 9247 2496 l
+ 9265 2514 l 9279 2528 l 9300 2550 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9179 2380 m 9271 2519 l 9135 2421 l 9157 2400 l 9179 2380 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9267 2344 m 9287 2509 l 9210 2361 l 9276 2573 l 9333 2555 l cp
+clip
+n 8325 1125 m 8327 1126 l 8331 1130 l 8338 1135 l 8348 1144 l 8363 1157 l
+ 8383 1173 l 8406 1193 l 8434 1216 l 8464 1242 l 8497 1271 l
+ 8531 1300 l 8567 1331 l 8602 1362 l 8637 1393 l 8671 1423 l
+ 8703 1453 l 8734 1482 l 8764 1509 l 8791 1536 l 8817 1561 l
+ 8841 1586 l 8863 1609 l 8884 1632 l 8904 1654 l 8923 1676 l
+ 8940 1698 l 8957 1719 l 8972 1741 l 8988 1763 l 9003 1786 l
+ 9018 1810 l 9033 1834 l 9047 1860 l 9061 1886 l 9075 1913 l
+ 9088 1942 l 9102 1973 l 9115 2005 l 9129 2040 l 9143 2076 l
+ 9158 2115 l 9172 2155 l 9187 2197 l 9202 2240 l 9216 2283 l
+ 9230 2326 l 9243 2367 l 9256 2406 l 9267 2442 l 9276 2473 l
+ 9284 2498 l 9290 2518 l 9300 2550 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9267 2344 m 9287 2509 l 9210 2361 l 9238 2352 l 9267 2344 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9583 2192 m 9590 2359 l 9525 2205 l 9574 2421 l 9633 2408 l cp
+clip
+n 9600 1200 m 9599 1203 l 9598 1209 l 9596 1219 l 9592 1235 l 9587 1257 l
+ 9581 1284 l 9574 1315 l 9567 1350 l 9559 1387 l 9551 1424 l
+ 9543 1461 l 9536 1498 l 9529 1533 l 9524 1566 l 9518 1598 l
+ 9514 1627 l 9510 1655 l 9507 1681 l 9504 1706 l 9502 1730 l
+ 9501 1754 l 9500 1777 l 9500 1800 l 9500 1823 l 9501 1846 l
+ 9502 1870 l 9504 1894 l 9507 1919 l 9510 1945 l 9514 1973 l
+ 9518 2002 l 9524 2034 l 9529 2067 l 9536 2102 l 9543 2139 l
+ 9551 2176 l 9559 2213 l 9567 2250 l 9574 2285 l 9581 2316 l
+ 9587 2343 l 9592 2365 l 9600 2400 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9583 2192 m 9590 2359 l 9525 2205 l 9554 2198 l 9583 2192 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9695 2214 m 9613 2360 l 9639 2195 l 9567 2404 l 9624 2424 l cp
+clip
+n 9600 1200 m 9601 1203 l 9603 1209 l 9607 1219 l 9612 1235 l 9620 1257 l
+ 9629 1284 l 9639 1315 l 9650 1350 l 9662 1387 l 9674 1424 l
+ 9685 1461 l 9696 1498 l 9706 1533 l 9715 1566 l 9723 1598 l
+ 9729 1627 l 9735 1655 l 9740 1681 l 9744 1706 l 9747 1730 l
+ 9749 1754 l 9750 1777 l 9750 1800 l 9750 1823 l 9749 1846 l
+ 9747 1870 l 9744 1894 l 9740 1919 l 9735 1945 l 9729 1973 l
+ 9723 2002 l 9715 2034 l 9706 2067 l 9696 2102 l 9685 2139 l
+ 9674 2176 l 9662 2213 l 9650 2250 l 9639 2285 l 9629 2316 l
+ 9620 2343 l 9612 2365 l 9600 2400 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9695 2214 m 9613 2360 l 9639 2195 l 9667 2204 l 9695 2214 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+10094 2397 m 9936 2453 l 10064 2345 l 9872 2457 l 9902 2508 l cp
+clip
+n 10950 1200 m 10949 1202 l 10948 1207 l 10945 1217 l 10940 1231 l 10934 1251 l
+ 10926 1277 l 10916 1307 l 10905 1342 l 10892 1381 l 10879 1422 l
+ 10865 1464 l 10850 1507 l 10835 1549 l 10820 1590 l 10805 1629 l
+ 10790 1667 l 10775 1702 l 10761 1735 l 10747 1767 l 10732 1796 l
+ 10718 1823 l 10703 1849 l 10689 1874 l 10674 1897 l 10658 1920 l
+ 10642 1941 l 10625 1962 l 10625 1963 l 10607 1983 l 10589 2003 l
+ 10570 2024 l 10549 2043 l 10527 2064 l 10504 2084 l 10478 2104 l
+ 10451 2126 l 10422 2147 l 10390 2170 l 10356 2193 l 10320 2218 l
+ 10282 2243 l 10242 2268 l 10201 2294 l 10160 2320 l 10118 2345 l
+ 10078 2370 l 10041 2392 l 10006 2413 l 9976 2431 l 9951 2445 l
+ 9931 2457 l 9900 2475 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 10094 2397 m 9936 2453 l 10064 2345 l 10079 2371 l 10094 2397 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9984 2340 m 9852 2443 l 9939 2300 l 9793 2466 l 9838 2506 l cp
+clip
+n 10950 1200 m 9825 2475 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9984 2340 m 9852 2443 l 9939 2300 l 9962 2320 l 9984 2340 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9100 2760 m 9261 2717 l 9125 2814 l 9326 2721 l 9301 2666 l cp
+clip
+n 9300 2700 m 9297 2699 l 9289 2696 l 9277 2692 l 9257 2686 l 9232 2677 l
+ 9202 2667 l 9167 2657 l 9130 2645 l 9093 2634 l 9056 2623 l
+ 9020 2614 l 8987 2606 l 8957 2599 l 8929 2593 l 8904 2590 l
+ 8881 2588 l 8861 2587 l 8844 2588 l 8828 2590 l 8813 2594 l
+ 8800 2600 l 8789 2606 l 8779 2614 l 8770 2622 l 8761 2632 l
+ 8754 2642 l 8747 2654 l 8741 2666 l 8736 2679 l 8733 2693 l
+ 8730 2707 l 8728 2721 l 8728 2736 l 8728 2750 l 8730 2764 l
+ 8733 2778 l 8736 2791 l 8741 2804 l 8747 2815 l 8754 2826 l
+ 8761 2836 l 8770 2844 l 8779 2851 l 8789 2858 l 8800 2863 l
+ 8813 2866 l 8828 2869 l 8844 2869 l 8861 2868 l 8881 2865 l
+ 8904 2860 l 8929 2853 l 8957 2844 l 8987 2833 l 9020 2821 l
+ 9056 2807 l 9093 2792 l 9130 2776 l 9167 2760 l 9202 2745 l
+ 9232 2731 l 9257 2720 l 9300 2700 l  cp gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9100 2760 m 9261 2717 l 9125 2814 l 9112 2787 l 9100 2760 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9295 3118 m 9364 2965 l 9353 3133 l 9408 2918 l 9350 2903 l cp
+clip
+n 9375 2925 m 9372 2926 l 9365 2929 l 9352 2935 l 9334 2942 l 9309 2953 l
+ 9280 2966 l 9248 2980 l 9213 2996 l 9178 3013 l 9144 3030 l
+ 9111 3046 l 9082 3062 l 9055 3077 l 9032 3092 l 9012 3106 l
+ 8995 3120 l 8980 3133 l 8969 3147 l 8960 3160 l 8954 3174 l
+ 8950 3188 l 8948 3202 l 8948 3216 l 8949 3232 l 8952 3247 l
+ 8957 3263 l 8964 3279 l 8972 3295 l 8981 3310 l 8992 3326 l
+ 9004 3340 l 9017 3354 l 9031 3367 l 9046 3379 l 9061 3389 l
+ 9076 3398 l 9091 3406 l 9106 3412 l 9121 3416 l 9135 3418 l
+ 9149 3418 l 9162 3416 l 9175 3413 l 9187 3407 l 9199 3399 l
+ 9210 3388 l 9221 3374 l 9232 3358 l 9243 3338 l 9254 3315 l
+ 9266 3288 l 9277 3257 l 9289 3224 l 9301 3187 l 9313 3148 l
+ 9325 3108 l 9336 3069 l 9347 3032 l 9356 2999 l 9363 2972 l
+ 9375 2925 l  cp gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9295 3118 m 9364 2965 l 9353 3133 l 9324 3125 l 9295 3118 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+9660 3200 m 9617 3038 l 9714 3175 l 9621 2974 l 9566 2999 l cp
+clip
+n 9600 3000 m 9599 3003 l 9596 3011 l 9592 3023 l 9586 3043 l 9577 3068 l
+ 9567 3098 l 9557 3133 l 9545 3170 l 9534 3207 l 9523 3244 l
+ 9514 3280 l 9506 3313 l 9499 3343 l 9493 3371 l 9490 3396 l
+ 9488 3419 l 9487 3439 l 9488 3456 l 9490 3472 l 9494 3487 l
+ 9500 3500 l 9506 3511 l 9514 3521 l 9522 3530 l 9532 3539 l
+ 9542 3546 l 9554 3553 l 9566 3559 l 9579 3564 l 9593 3567 l
+ 9607 3570 l 9621 3572 l 9636 3572 l 9650 3572 l 9664 3570 l
+ 9678 3567 l 9691 3564 l 9704 3559 l 9715 3553 l 9726 3546 l
+ 9736 3539 l 9744 3530 l 9751 3521 l 9758 3511 l 9763 3500 l
+ 9766 3487 l 9769 3472 l 9769 3456 l 9768 3439 l 9765 3419 l
+ 9760 3396 l 9753 3371 l 9744 3343 l 9733 3313 l 9721 3280 l
+ 9707 3244 l 9692 3207 l 9676 3170 l 9660 3133 l 9645 3098 l
+ 9631 3068 l 9620 3043 l 9600 3000 l  cp gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 9660 3200 m 9617 3038 l 9714 3175 l 9687 3188 l 9660 3200 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+10102 2905 m 9941 2855 l 10109 2846 l 9889 2818 l 9881 2878 l cp
+clip
+n 12600 1200 m 12599 1202 l 12598 1206 l 12595 1214 l 12590 1226 l 12583 1244 l
+ 12574 1267 l 12563 1296 l 12549 1331 l 12534 1372 l 12516 1417 l
+ 12496 1467 l 12475 1521 l 12452 1578 l 12428 1637 l 12404 1696 l
+ 12379 1757 l 12355 1817 l 12330 1876 l 12306 1934 l 12282 1990 l
+ 12258 2043 l 12235 2095 l 12213 2144 l 12192 2190 l 12171 2234 l
+ 12151 2275 l 12131 2314 l 12112 2351 l 12093 2385 l 12075 2418 l
+ 12057 2448 l 12039 2477 l 12021 2504 l 12004 2530 l 11986 2555 l
+ 11968 2578 l 11950 2600 l 11928 2625 l 11906 2649 l 11884 2672 l
+ 11861 2694 l 11837 2715 l 11813 2735 l 11788 2754 l 11763 2772 l
+ 11737 2789 l 11710 2805 l 11682 2821 l 11654 2835 l 11625 2849 l
+ 11596 2861 l 11566 2873 l 11536 2883 l 11506 2893 l 11475 2902 l
+ 11444 2910 l 11413 2917 l 11383 2923 l 11352 2929 l 11321 2934 l
+ 11290 2938 l 11260 2941 l 11230 2944 l 11199 2946 l 11169 2947 l
+ 11140 2949 l 11110 2949 l 11080 2950 l 11050 2950 l 11020 2950 l
+ 10989 2949 l 10958 2949 l 10926 2948 l 10893 2946 l 10859 2945 l
+ 10823 2943 l 10786 2940 l 10747 2937 l 10706 2934 l 10663 2930 l
+ 10617 2926 l 10570 2922 l 10520 2917 l 10468 2912 l 10414 2907 l
+ 10360 2901 l 10305 2895 l 10250 2889 l 10196 2883 l 10144 2878 l
+ 10096 2872 l 10052 2867 l 10013 2863 l 9980 2859 l 9953 2856 l
+ 9932 2854 l 9900 2850 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 10102 2905 m 9941 2855 l 10109 2846 l 10105 2876 l 10102 2905 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+10107 2805 m 9941 2775 l 10107 2745 l 9885 2745 l 9885 2805 l cp
+clip
+n 12600 1200 m 12599 1202 l 12597 1206 l 12593 1214 l 12586 1226 l 12577 1244 l
+ 12564 1267 l 12549 1295 l 12531 1328 l 12510 1366 l 12487 1408 l
+ 12462 1453 l 12435 1501 l 12407 1550 l 12379 1600 l 12350 1650 l
+ 12321 1699 l 12293 1747 l 12265 1794 l 12237 1838 l 12210 1881 l
+ 12184 1921 l 12159 1959 l 12134 1995 l 12110 2029 l 12086 2061 l
+ 12063 2091 l 12040 2119 l 12017 2146 l 11994 2171 l 11971 2195 l
+ 11948 2219 l 11924 2241 l 11900 2263 l 11874 2285 l 11847 2306 l
+ 11820 2327 l 11792 2348 l 11763 2368 l 11733 2388 l 11702 2407 l
+ 11671 2426 l 11638 2444 l 11605 2462 l 11571 2480 l 11536 2497 l
+ 11501 2513 l 11466 2529 l 11429 2545 l 11393 2560 l 11357 2574 l
+ 11320 2588 l 11284 2601 l 11247 2613 l 11211 2624 l 11176 2635 l
+ 11141 2646 l 11106 2655 l 11072 2664 l 11038 2673 l 11006 2681 l
+ 10974 2688 l 10942 2695 l 10911 2701 l 10880 2707 l 10850 2713 l
+ 10818 2718 l 10786 2723 l 10755 2728 l 10723 2732 l 10690 2737 l
+ 10657 2740 l 10623 2744 l 10588 2747 l 10552 2750 l 10514 2753 l
+ 10474 2756 l 10433 2758 l 10391 2760 l 10346 2762 l 10301 2764 l
+ 10255 2766 l 10208 2768 l 10162 2769 l 10118 2770 l 10076 2771 l
+ 10037 2772 l 10002 2773 l 9973 2774 l 9948 2774 l 9929 2775 l
+ 9900 2775 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 10107 2805 m 9941 2775 l 10107 2745 l 10107 2775 l 10107 2805 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+10109 2689 m 9941 2691 l 10097 2630 l 9879 2674 l 9891 2732 l cp
+clip
+n 12600 1200 m 12599 1201 l 12596 1204 l 12591 1209 l 12583 1217 l 12571 1228 l
+ 12556 1243 l 12536 1261 l 12512 1284 l 12485 1310 l 12453 1340 l
+ 12418 1373 l 12380 1409 l 12339 1448 l 12296 1488 l 12252 1529 l
+ 12206 1571 l 12160 1614 l 12114 1656 l 12068 1697 l 12023 1738 l
+ 11979 1777 l 11936 1815 l 11893 1852 l 11853 1887 l 11813 1921 l
+ 11775 1953 l 11738 1983 l 11702 2012 l 11667 2039 l 11633 2065 l
+ 11600 2089 l 11567 2113 l 11536 2135 l 11504 2156 l 11473 2176 l
+ 11442 2196 l 11412 2215 l 11381 2233 l 11350 2250 l 11317 2268 l
+ 11284 2285 l 11251 2302 l 11217 2318 l 11182 2334 l 11147 2349 l
+ 11110 2365 l 11073 2380 l 11034 2394 l 10993 2409 l 10951 2424 l
+ 10907 2438 l 10861 2453 l 10813 2468 l 10763 2483 l 10711 2498 l
+ 10657 2513 l 10602 2528 l 10545 2543 l 10487 2559 l 10429 2574 l
+ 10371 2588 l 10313 2603 l 10257 2616 l 10203 2630 l 10152 2642 l
+ 10104 2653 l 10061 2663 l 10023 2672 l 9990 2680 l 9963 2686 l
+ 9941 2691 l 9925 2695 l 9900 2700 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 10109 2689 m 9941 2691 l 10097 2630 l 10103 2659 l 10109 2689 l  cp gs col21 1.00 shd ef gr  col21 s
+% Polyline
+7.500 slw
+gs  clippath
+10000 3057 m 10095 3195 l 9957 3100 l 10114 3257 l 10157 3214 l cp
+clip
+n 9825 2925 m 10125 3225 l gs col21 s gr gr
+
+% arrowhead
+15.000 slw
+n 10000 3057 m 10095 3195 l 9957 3100 l 9979 3079 l 10000 3057 l  cp gs col21 1.00 shd ef gr  col21 s
+/Times-Bold ff 285.00 scf sf
+817 960 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5400 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3600 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+2625 945 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+4425 945 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6225 945 m
+gs 1 -1 sc (4) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7200 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7125 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7125 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8025 945 m
+gs 1 -1 sc (5) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8775 750 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+9525 975 m
+gs 1 -1 sc (6) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+10275 750 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11025 975 m
+gs 1 -1 sc (7) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11700 825 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+12525 975 m
+gs 1 -1 sc (8) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1725 1125 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1800 525 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1425 2175 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+2625 2775 m
+gs 1 -1 sc (9) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+4425 2775 m
+gs 1 -1 sc (A) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 2625 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6225 2775 m
+gs 1 -1 sc (B) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 2400 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5400 2775 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 3600 m
+gs 1 -1 sc (Pattern "XXo") col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3675 1950 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5100 1800 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3300 1800 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6525 1800 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7275 2025 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7050 1800 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11625 225 m
+gs 1 -1 sc (Pattern "????..X") col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8325 1950 m
+gs 1 -1 sc (O) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+8925 1575 m
+gs 1 -1 sc (X) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+9225 1875 m
+gs 1 -1 sc (O) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+9825 1875 m
+gs 1 -1 sc (X) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+10200 1800 m
+gs 1 -1 sc (O) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+10725 2100 m
+gs 1 -1 sc (.) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+9525 2775 m
+gs 1 -1 sc (0) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+8475 2775 m
+gs 1 -1 sc (O) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+8775 3600 m
+gs 1 -1 sc (X) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+9600 3750 m
+gs 1 -1 sc (.) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+11325 2100 m
+gs 1 -1 sc (O) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+11625 2325 m
+gs 1 -1 sc (.) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+12000 2850 m
+gs 1 -1 sc (X) col21 sh gr
+/Times-Bold ff 285.00 scf sf
+10200 3450 m
+gs 1 -1 sc (Error) col21 sh gr
+$F2psEnd
+rs
diff --git a/doc/cdfa.fig b/doc/cdfa.fig
new file mode 100644 (file)
index 0000000..58a0db0
--- /dev/null
@@ -0,0 +1,232 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+50.00
+Single
+-2
+1200 2
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 900 900 300 300 900 900 1200 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 6300 900 300 300 6300 900 6600 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4500 900 300 300 4500 900 4800 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 900 300 300 2700 900 3000 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 8100 900 300 300 8100 900 8400 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 9600 900 300 300 9600 900 9900 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 11100 900 300 300 11100 900 11400 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 12600 900 300 300 12600 900 12900 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 2700 300 300 2700 2700 3000 2700
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4500 2700 300 300 4500 2700 4800 2700
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 6300 2700 300 300 6300 2700 6600 2700
+1 3 0 1 21 7 100 0 -1 0.000 1 0.0000 9600 2700 300 300 9600 2700 9900 2700
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        4800 900 6000 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 900 5400 1500 6000 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 892 5400 292 6000 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        3000 900 4200 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        3000 900 3600 1500 4200 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        3000 892 3600 292 4200 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        1200 900 1800 1350 2400 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        225 900 600 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        6600 900 7800 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        6600 900 7200 1500 7800 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        6600 892 7200 292 7800 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        8400 900 9300 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        9900 900 10800 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        11400 900 12300 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        1200 900 1800 450 2400 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        900 1200 1200 2400 2400 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        3000 2700 4200 2700
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        2925 2475 3975 2100 4275 1125
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        2925 2475 3600 1725 4275 1125
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 2.00 60.00 165.00
+        4725 2475 6075 1125
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 2700 5400 2400 6000 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 2700 5400 3000 6000 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        6300 3000 6300 3300
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        6525 2475 6825 1575 7875 1125
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        6525 2475 7575 2175 7950 1200
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 2.00 60.00 165.00
+        6525 2475 7875 1200
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        12600 600 12600 300
+        0.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        8250 1200 8625 1875 9300 2550
+        0.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        8325 1125 9075 1725 9300 2550
+        0.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        9600 1200 9450 1800 9600 2400
+        0.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        9600 1200 9825 1800 9600 2400
+        0.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        10950 1200 10725 2025 9900 2475
+        0.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 2
+       1 1 2.00 60.00 165.00
+        10950 1200 9825 2475
+        0.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 4
+       1 1 2.00 60.00 165.00
+        9300 2700 8700 2475 8700 3000 9300 2700
+        0.000 1.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 4
+       1 1 2.00 60.00 165.00
+        9375 2925 8775 3150 9225 3600 9375 2925
+        0.000 1.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 4
+       1 1 2.00 60.00 165.00
+        9600 3000 9375 3600 9900 3600 9600 3000
+        0.000 1.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 4
+       1 1 2.00 60.00 165.00
+        12600 1200 12000 2850 11100 3000 9900 2850
+        0.000 1.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 4
+       1 1 2.00 60.00 165.00
+        12600 1200 12000 2400 10800 2775 9900 2775
+        0.000 1.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        12600 1200 11400 2400 9900 2700
+        0.000 1.000 0.000
+3 0 0 1 21 7 100 0 -1 0.000 0 1 0 2
+       1 1 2.00 60.00 165.00
+        9825 2925 10125 3225
+        0.000 0.000
+4 0 0 100 0 2 19 0.0000 4 195 135 817 960 1\001
+4 0 0 100 0 2 19 0.0000 4 45 75 5400 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 5325 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 5325 442 X\001
+4 0 0 100 0 2 19 0.0000 4 45 75 3600 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 3525 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 3525 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 2625 945 2\001
+4 0 0 100 0 2 19 0.0000 4 195 135 4425 945 3\001
+4 0 0 100 0 2 19 0.0000 4 195 135 6225 945 4\001
+4 0 0 100 0 2 19 0.0000 4 45 75 7200 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 7125 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 7125 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 8025 945 5\001
+4 0 0 100 0 2 19 0.0000 4 45 75 8775 750 .\001
+4 0 0 100 0 2 19 0.0000 4 195 135 9525 975 6\001
+4 0 0 100 0 2 19 0.0000 4 45 75 10275 750 .\001
+4 0 0 100 0 2 19 0.0000 4 195 135 11025 975 7\001
+4 0 0 100 0 2 19 0.0000 4 195 210 11700 825 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 12525 975 8\001
+4 0 0 100 0 2 19 0.0000 4 195 225 1725 1125 O\001
+4 0 0 100 0 2 19 0.0000 4 45 75 1800 525 .\001
+4 0 0 100 0 2 19 0.0000 4 195 210 1425 2175 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 2625 2775 9\001
+4 0 0 100 0 2 19 0.0000 4 195 210 4425 2775 A\001
+4 0 0 100 0 2 19 0.0000 4 195 210 3525 2625 X\001
+4 0 0 100 0 2 19 0.0000 4 195 195 6225 2775 B\001
+4 0 0 100 0 2 19 0.0000 4 195 225 5325 2400 O\001
+4 0 0 100 0 2 19 0.0000 4 45 75 5400 2775 .\001
+4 0 0 100 0 2 19 0.0000 4 195 1860 5325 3600 Pattern "XXo"\001
+4 0 0 100 0 2 19 0.0000 4 45 75 3675 1950 .\001
+4 0 0 100 0 2 19 0.0000 4 195 210 5100 1800 X\001
+4 0 0 100 0 2 19 0.0000 4 195 225 3300 1800 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 6525 1800 X\001
+4 0 0 100 0 2 19 0.0000 4 195 225 7275 2025 O\001
+4 0 0 100 0 2 19 0.0000 4 45 75 7050 1800 .\001
+4 0 0 100 0 2 19 0.0000 4 195 2205 11625 225 Pattern "????..X"\001
+4 0 21 100 0 2 19 0.0000 4 195 225 8325 1950 O\001
+4 0 21 100 0 2 19 0.0000 4 195 210 8925 1575 X\001
+4 0 21 100 0 2 19 0.0000 4 195 225 9225 1875 O\001
+4 0 21 100 0 2 19 0.0000 4 195 210 9825 1875 X\001
+4 0 21 100 0 2 19 0.0000 4 195 225 10200 1800 O\001
+4 0 21 100 0 2 19 0.0000 4 45 75 10725 2100 .\001
+4 0 21 100 0 2 19 0.0000 4 195 135 9525 2775 0\001
+4 0 21 100 0 2 19 0.0000 4 195 225 8475 2775 O\001
+4 0 21 100 0 2 19 0.0000 4 195 210 8775 3600 X\001
+4 0 21 100 0 2 19 0.0000 4 45 75 9600 3750 .\001
+4 0 21 100 0 2 19 0.0000 4 195 225 11325 2100 O\001
+4 0 21 100 0 2 19 0.0000 4 45 75 11625 2325 .\001
+4 0 21 100 0 2 19 0.0000 4 195 210 12000 2850 X\001
+4 0 21 100 0 2 19 0.0000 4 195 690 10200 3450 Error\001
diff --git a/doc/cdfa.jpg b/doc/cdfa.jpg
new file mode 100644 (file)
index 0000000..a9c629f
Binary files /dev/null and b/doc/cdfa.jpg differ
diff --git a/doc/cdfa.pdf b/doc/cdfa.pdf
new file mode 100644 (file)
index 0000000..0d2d6eb
Binary files /dev/null and b/doc/cdfa.pdf differ
diff --git a/doc/cdfa.png b/doc/cdfa.png
new file mode 100644 (file)
index 0000000..18cf23d
Binary files /dev/null and b/doc/cdfa.png differ
diff --git a/doc/copying.texi b/doc/copying.texi
new file mode 100644 (file)
index 0000000..fa485f3
--- /dev/null
@@ -0,0 +1,1272 @@
+The program GNU Go is distributed under the terms of the
+GNU General Public License (GPL). Its documentation is
+distributed under the terms of the GNU Free Documentation
+License (GFDL).
+
+@menu
+* GPL::            The GNU General Public License
+* GFDL::           The GNU Free Documentation License
+* GTP License::    The Go Text Protocol License
+@end menu
+
+@node GPL, GFDL, Copying, Copying
+@cindex licence, program (GPL)
+
+@section GNU GENERAL PUBLIC LICENSE
+@center Version 3, 29 June 2007
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. <http://fsf.org/>
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@unnumberedsec Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+@iftex
+@unnumberedsec TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center TERMS AND CONDITIONS
+@end ifinfo
+
+@enumerate 0
+@item
+DEFINITIONS
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@sp 1
+@item
+SOURCE CODE
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+@sp 1
+@item
+BASIC PERMISSIONS
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@sp 1
+@item
+PROTECTING USERS' LEGAL RIGHTS FROM ANTI-CIRCUMVENTION LAW
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+@sp 1
+@item
+CONVEYING VERBATIM COPIES
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@sp 1
+@item
+CONVEYING MODIFIED SOURCE VERSIONS
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@sp 1
+@item
+CONVEYING NON-SOURCE FORMS
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@sp 1
+@item
+ADDITIONAL TERMS
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+@sp 1
+@item
+TERMINATION
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@sp 1
+@item
+ACCEPTANCE NOT REQUIRED FOR HAVING COPIES
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@sp 1
+@item
+AUTOMATIC LICENSING OF DOWNSTREAM RECIPIENTS
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@sp 1
+@item
+PATENTS
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@sp 1
+@item
+NO SURRENDER OF OTHERS' FREEDOM
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+@sp 1
+@item
+USE WITH THE GNU AFFERO GENERAL PUBLIC LICENSE
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@sp 1
+@item
+REVISED VERSIONS OF THIS LICENSE
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@sp 1
+@item
+DISCLAIMER OF WARRANTY
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+@sp 1
+@item
+LIMITATION OF LIABILITY.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+@sp 1
+@item
+INTERPRETATION OF SECTIONS 15 AND 16
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@unnumberedsec How to Apply These Terms to your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+@node GFDL, GTP License, GPL, Copying
+@cindex licence, documentation (GFDL)
+
+@section GNU FREE DOCUMENTATION LICENSE
+
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.  If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.  A
+public wiki that anybody can edit is an example of such a server.  A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@node GTP License, , GFDL, Copying
+
+@section The Go Text Protocol License
+
+In order to facilitate the use of the Go Text Protocol, the two files
+@file{gtp.c} and @file{gtp.h} are licensed under the following terms.
+
+Copyright 2001 by the Free Software Foundation.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this file @file{gtp.x}, to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons to whom
+the Software is furnished to do so, provided that the above copyright
+notice(s) and this permission notice appear in all copies of the Software and
+that both the above copyright notice(s) and this permission notice appear in
+supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
diff --git a/doc/dfa.eps b/doc/dfa.eps
new file mode 100644 (file)
index 0000000..3b38a2a
--- /dev/null
@@ -0,0 +1,413 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: dfa.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Fri Jun 22 17:21:06 2001
+%%For: turvoy@semeai.irisa.fr (Tanguy Urvoy, DEA, Paragraphe)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 411 47
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 0.5000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-6.0 54.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 2800 m -1000 -1000 l 14886 -1000 l 14886 2800 l cp clip
+ 0.03000 0.03000 sc
+7.500 slw
+% Ellipse
+n 900 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6300 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4500 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 8100 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 9600 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 11100 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 12600 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs  clippath
+5835 870 m 6000 900 l 5835 930 l 6015 930 l 6015 870 l cp
+clip
+n 4800 900 m 6000 900 l gs col0 s gr gr
+
+% arrowhead
+n 5835 870 m 6000 900 l 5835 930 l 5835 900 l 5835 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5859 990 m 6000 900 l 5900 1034 l 6031 912 l 5991 868 l cp
+clip
+n 4800 900 m 4802 902 l 4807 906 l 4815 914 l 4828 926 l 4846 942 l
+ 4869 963 l 4896 986 l 4926 1013 l 4958 1041 l 4992 1070 l
+ 5027 1099 l 5061 1127 l 5095 1154 l 5128 1178 l 5159 1201 l
+ 5188 1221 l 5216 1238 l 5242 1254 l 5267 1267 l 5291 1277 l
+ 5314 1286 l 5336 1292 l 5358 1297 l 5379 1299 l 5400 1300 l
+ 5421 1299 l 5442 1297 l 5464 1292 l 5486 1286 l 5509 1277 l
+ 5533 1267 l 5558 1254 l 5584 1238 l 5612 1221 l 5641 1201 l
+ 5672 1178 l 5705 1154 l 5739 1127 l 5773 1099 l 5808 1070 l
+ 5842 1041 l 5874 1013 l 5904 986 l 5931 963 l 5954 942 l
+ 5972 926 l 6000 900 l gs col0 s gr gr
+
+% arrowhead
+n 5859 990 m 6000 900 l 5900 1034 l 5879 1012 l 5859 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5900 758 m 6000 892 l 5859 802 l 5991 924 l 6031 880 l cp
+clip
+n 4800 892 m 4802 890 l 4807 886 l 4815 878 l 4828 866 l 4846 850 l
+ 4869 829 l 4896 806 l 4926 779 l 4958 751 l 4992 722 l
+ 5027 693 l 5061 665 l 5095 638 l 5128 614 l 5159 591 l
+ 5188 571 l 5216 554 l 5242 538 l 5267 525 l 5291 515 l
+ 5314 506 l 5336 500 l 5358 495 l 5379 493 l 5400 492 l
+ 5421 493 l 5442 495 l 5464 500 l 5486 506 l 5509 515 l
+ 5533 525 l 5558 538 l 5584 554 l 5612 571 l 5641 591 l
+ 5672 614 l 5705 638 l 5739 665 l 5773 693 l 5808 722 l
+ 5842 751 l 5874 779 l 5904 806 l 5931 829 l 5954 850 l
+ 5972 866 l 6000 892 l gs col0 s gr gr
+
+% arrowhead
+n 5900 758 m 6000 892 l 5859 802 l 5879 780 l 5900 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4035 870 m 4200 900 l 4035 930 l 4215 930 l 4215 870 l cp
+clip
+n 3000 900 m 4200 900 l gs col0 s gr gr
+
+% arrowhead
+n 4035 870 m 4200 900 l 4035 930 l 4035 900 l 4035 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4059 990 m 4200 900 l 4100 1034 l 4231 912 l 4191 868 l cp
+clip
+n 3000 900 m 3002 902 l 3007 906 l 3015 914 l 3028 926 l 3046 942 l
+ 3069 963 l 3096 986 l 3126 1013 l 3158 1041 l 3192 1070 l
+ 3227 1099 l 3261 1127 l 3295 1154 l 3328 1178 l 3359 1201 l
+ 3388 1221 l 3416 1238 l 3442 1254 l 3467 1267 l 3491 1277 l
+ 3514 1286 l 3536 1292 l 3558 1297 l 3579 1299 l 3600 1300 l
+ 3621 1299 l 3642 1297 l 3664 1292 l 3686 1286 l 3709 1277 l
+ 3733 1267 l 3758 1254 l 3784 1238 l 3812 1221 l 3841 1201 l
+ 3872 1178 l 3905 1154 l 3939 1127 l 3973 1099 l 4008 1070 l
+ 4042 1041 l 4074 1013 l 4104 986 l 4131 963 l 4154 942 l
+ 4172 926 l 4200 900 l gs col0 s gr gr
+
+% arrowhead
+n 4059 990 m 4200 900 l 4100 1034 l 4079 1012 l 4059 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4100 758 m 4200 892 l 4059 802 l 4191 924 l 4231 880 l cp
+clip
+n 3000 892 m 3002 890 l 3007 886 l 3015 878 l 3028 866 l 3046 850 l
+ 3069 829 l 3096 806 l 3126 779 l 3158 751 l 3192 722 l
+ 3227 693 l 3261 665 l 3295 638 l 3328 614 l 3359 591 l
+ 3388 571 l 3416 554 l 3442 538 l 3467 525 l 3491 515 l
+ 3514 506 l 3536 500 l 3558 495 l 3579 493 l 3600 492 l
+ 3621 493 l 3642 495 l 3664 500 l 3686 506 l 3709 515 l
+ 3733 525 l 3758 538 l 3784 554 l 3812 571 l 3841 591 l
+ 3872 614 l 3905 638 l 3939 665 l 3973 693 l 4008 722 l
+ 4042 751 l 4074 779 l 4104 806 l 4131 829 l 4154 850 l
+ 4172 866 l 4200 892 l gs col0 s gr gr
+
+% arrowhead
+n 4100 758 m 4200 892 l 4059 802 l 4079 780 l 4100 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2235 870 m 2400 900 l 2235 930 l 2415 930 l 2415 870 l cp
+clip
+n 1200 900 m 2400 900 l gs col0 s gr gr
+
+% arrowhead
+n 2235 870 m 2400 900 l 2235 930 l 2235 900 l 2235 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2259 990 m 2400 900 l 2300 1034 l 2431 912 l 2391 868 l cp
+clip
+n 1200 900 m 1202 902 l 1207 906 l 1215 914 l 1228 926 l 1246 942 l
+ 1269 963 l 1296 986 l 1326 1013 l 1358 1041 l 1392 1070 l
+ 1427 1099 l 1461 1127 l 1495 1154 l 1528 1178 l 1559 1201 l
+ 1588 1221 l 1616 1238 l 1642 1254 l 1667 1267 l 1691 1277 l
+ 1714 1286 l 1736 1292 l 1758 1297 l 1779 1299 l 1800 1300 l
+ 1821 1299 l 1842 1297 l 1864 1292 l 1886 1286 l 1909 1277 l
+ 1933 1267 l 1958 1254 l 1984 1238 l 2012 1221 l 2041 1201 l
+ 2072 1178 l 2105 1154 l 2139 1127 l 2173 1099 l 2208 1070 l
+ 2242 1041 l 2274 1013 l 2304 986 l 2331 963 l 2354 942 l
+ 2372 926 l 2400 900 l gs col0 s gr gr
+
+% arrowhead
+n 2259 990 m 2400 900 l 2300 1034 l 2279 1012 l 2259 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2300 758 m 2400 892 l 2259 802 l 2391 924 l 2431 880 l cp
+clip
+n 1200 892 m 1202 890 l 1207 886 l 1215 878 l 1228 866 l 1246 850 l
+ 1269 829 l 1296 806 l 1326 779 l 1358 751 l 1392 722 l
+ 1427 693 l 1461 665 l 1495 638 l 1528 614 l 1559 591 l
+ 1588 571 l 1616 554 l 1642 538 l 1667 525 l 1691 515 l
+ 1714 506 l 1736 500 l 1758 495 l 1779 493 l 1800 492 l
+ 1821 493 l 1842 495 l 1864 500 l 1886 506 l 1909 515 l
+ 1933 525 l 1958 538 l 1984 554 l 2012 571 l 2041 591 l
+ 2072 614 l 2105 638 l 2139 665 l 2173 693 l 2208 722 l
+ 2242 751 l 2274 779 l 2304 806 l 2331 829 l 2354 850 l
+ 2372 866 l 2400 892 l gs col0 s gr gr
+
+% arrowhead
+n 2300 758 m 2400 892 l 2259 802 l 2279 780 l 2300 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+435 870 m 600 900 l 435 930 l 615 930 l 615 870 l cp
+clip
+n 225 900 m 600 900 l gs col0 s gr gr
+
+% arrowhead
+n 435 870 m 600 900 l 435 930 l 435 900 l 435 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7635 870 m 7800 900 l 7635 930 l 7815 930 l 7815 870 l cp
+clip
+n 6600 900 m 7800 900 l gs col0 s gr gr
+
+% arrowhead
+n 7635 870 m 7800 900 l 7635 930 l 7635 900 l 7635 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7659 990 m 7800 900 l 7700 1034 l 7831 912 l 7791 868 l cp
+clip
+n 6600 900 m 6602 902 l 6607 906 l 6615 914 l 6628 926 l 6646 942 l
+ 6669 963 l 6696 986 l 6726 1013 l 6758 1041 l 6792 1070 l
+ 6827 1099 l 6861 1127 l 6895 1154 l 6928 1178 l 6959 1201 l
+ 6988 1221 l 7016 1238 l 7042 1254 l 7067 1267 l 7091 1277 l
+ 7114 1286 l 7136 1292 l 7158 1297 l 7179 1299 l 7200 1300 l
+ 7221 1299 l 7242 1297 l 7264 1292 l 7286 1286 l 7309 1277 l
+ 7333 1267 l 7358 1254 l 7384 1238 l 7412 1221 l 7441 1201 l
+ 7472 1178 l 7505 1154 l 7539 1127 l 7573 1099 l 7608 1070 l
+ 7642 1041 l 7674 1013 l 7704 986 l 7731 963 l 7754 942 l
+ 7772 926 l 7800 900 l gs col0 s gr gr
+
+% arrowhead
+n 7659 990 m 7800 900 l 7700 1034 l 7679 1012 l 7659 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7700 758 m 7800 892 l 7659 802 l 7791 924 l 7831 880 l cp
+clip
+n 6600 892 m 6602 890 l 6607 886 l 6615 878 l 6628 866 l 6646 850 l
+ 6669 829 l 6696 806 l 6726 779 l 6758 751 l 6792 722 l
+ 6827 693 l 6861 665 l 6895 638 l 6928 614 l 6959 591 l
+ 6988 571 l 7016 554 l 7042 538 l 7067 525 l 7091 515 l
+ 7114 506 l 7136 500 l 7158 495 l 7179 493 l 7200 492 l
+ 7221 493 l 7242 495 l 7264 500 l 7286 506 l 7309 515 l
+ 7333 525 l 7358 538 l 7384 554 l 7412 571 l 7441 591 l
+ 7472 614 l 7505 638 l 7539 665 l 7573 693 l 7608 722 l
+ 7642 751 l 7674 779 l 7704 806 l 7731 829 l 7754 850 l
+ 7772 866 l 7800 892 l gs col0 s gr gr
+
+% arrowhead
+n 7700 758 m 7800 892 l 7659 802 l 7679 780 l 7700 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9135 870 m 9300 900 l 9135 930 l 9315 930 l 9315 870 l cp
+clip
+n 8400 900 m 9300 900 l gs col0 s gr gr
+
+% arrowhead
+n 9135 870 m 9300 900 l 9135 930 l 9135 900 l 9135 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+10635 870 m 10800 900 l 10635 930 l 10815 930 l 10815 870 l cp
+clip
+n 9900 900 m 10800 900 l gs col0 s gr gr
+
+% arrowhead
+n 10635 870 m 10800 900 l 10635 930 l 10635 900 l 10635 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+12135 870 m 12300 900 l 12135 930 l 12315 930 l 12315 870 l cp
+clip
+n 11400 900 m 12300 900 l gs col0 s gr gr
+
+% arrowhead
+n 12135 870 m 12300 900 l 12135 930 l 12135 900 l 12135 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+12630 1335 m 12600 1500 l 12570 1335 l 12570 1515 l 12630 1515 l cp
+clip
+n 12600 1200 m 12600 1500 l gs col0 s gr gr
+
+% arrowhead
+n 12630 1335 m 12600 1500 l 12570 1335 l 12600 1335 l 12630 1335 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Bold ff 285.00 scf sf
+817 960 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5400 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3600 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+2625 945 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1800 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1725 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1725 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+4425 945 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6225 945 m
+gs 1 -1 sc (4) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7200 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7125 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7125 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8025 945 m
+gs 1 -1 sc (5) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8775 750 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+9525 975 m
+gs 1 -1 sc (6) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+10275 750 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11025 975 m
+gs 1 -1 sc (7) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11700 825 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+12525 975 m
+gs 1 -1 sc (8) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11625 1800 m
+gs 1 -1 sc (Pattern "????..X") col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/dfa.fig b/doc/dfa.fig
new file mode 100644 (file)
index 0000000..fdae49f
--- /dev/null
@@ -0,0 +1,111 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+50.00
+Single
+-2
+1200 2
+6 225 225 13875 1800
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 900 900 300 300 900 900 1200 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 6300 900 300 300 6300 900 6600 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4500 900 300 300 4500 900 4800 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 900 300 300 2700 900 3000 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 8100 900 300 300 8100 900 8400 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 9600 900 300 300 9600 900 9900 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 11100 900 300 300 11100 900 11400 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 12600 900 300 300 12600 900 12900 900
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        4800 900 6000 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 900 5400 1500 6000 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 892 5400 292 6000 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        3000 900 4200 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        3000 900 3600 1500 4200 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        3000 892 3600 292 4200 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        1200 900 2400 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        1200 900 1800 1500 2400 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        1200 892 1800 292 2400 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        225 900 600 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        6600 900 7800 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        6600 900 7200 1500 7800 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        6600 892 7200 292 7800 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        8400 900 9300 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        9900 900 10800 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        11400 900 12300 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        12600 1200 12600 1500
+        0.000 0.000
+4 0 0 100 0 2 19 0.0000 4 195 135 817 960 1\001
+4 0 0 100 0 2 19 0.0000 4 45 75 5400 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 5325 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 5325 442 X\001
+4 0 0 100 0 2 19 0.0000 4 45 75 3600 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 3525 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 3525 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 2625 945 2\001
+4 0 0 100 0 2 19 0.0000 4 45 75 1800 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 1725 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 1725 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 4425 945 3\001
+4 0 0 100 0 2 19 0.0000 4 195 135 6225 945 4\001
+4 0 0 100 0 2 19 0.0000 4 45 75 7200 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 7125 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 7125 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 8025 945 5\001
+4 0 0 100 0 2 19 0.0000 4 45 75 8775 750 .\001
+4 0 0 100 0 2 19 0.0000 4 195 135 9525 975 6\001
+4 0 0 100 0 2 19 0.0000 4 45 75 10275 750 .\001
+4 0 0 100 0 2 19 0.0000 4 195 135 11025 975 7\001
+4 0 0 100 0 2 19 0.0000 4 195 210 11700 825 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 12525 975 8\001
+4 0 0 100 0 2 19 0.0000 4 195 2205 11625 1800 Pattern "????..X"\001
+-6
diff --git a/doc/dfa.jpg b/doc/dfa.jpg
new file mode 100644 (file)
index 0000000..3e59664
Binary files /dev/null and b/doc/dfa.jpg differ
diff --git a/doc/dfa.pdf b/doc/dfa.pdf
new file mode 100644 (file)
index 0000000..4101097
Binary files /dev/null and b/doc/dfa.pdf differ
diff --git a/doc/dfa.png b/doc/dfa.png
new file mode 100644 (file)
index 0000000..7c99ebc
Binary files /dev/null and b/doc/dfa.png differ
diff --git a/doc/dfa.texi b/doc/dfa.texi
new file mode 100644 (file)
index 0000000..6ffe358
--- /dev/null
@@ -0,0 +1,441 @@
+In this chapter, we describe the principles of the GNU Go DFA
+pattern matcher.  The aim of this system is to permit a fast
+pattern matching when it becomes time critical like in owl
+module (@ref{The Owl Code}). Since GNU Go 3.2, this is enabled
+by default. You can still get back the traditional pattern matcher
+by running @command{configure --disable-dfa} and then recompiling
+GNU Go. 
+
+Otherwise, a finite state machine called a Deterministic Finite
+State Automaton (@ref{What is a DFA}) will be built off line from the
+pattern database. This is used at runtime to speedup pattern matching
+(@ref{Pattern matching with DFA} and @ref{Incremental Algorithm}). The
+runtime speedup is at the cost of an increase in memory use and
+compile time.
+
+
+@menu
+* Introduction to the DFA::  Scanning the board along a path
+* What is a DFA:: A recall of language theory.
+* Pattern matching with DFA:: How to retrieve go patterns with a DFA?
+* Building the DFA:: Playing with explosives.
+* Incremental Algorithm:: The joy of determinism.
+* DFA Optimizations:: Some possible optimizations.
+@end menu
+
+
+@cindex pattern matching
+@cindex fast pattern matching
+@cindex pattern database
+@cindex finite state automaton
+@cindex automaton
+@cindex dfa
+@cindex dfa.h
+@cindex dfa.c
+@cindex matchpat.c
+@cindex product
+
+
+@node Introduction to the DFA
+@section Introduction to the DFA
+
+The general idea is as follows:
+
+For each intersection of the board, its neighbourhood is scanned following
+a predefined path.  The actual path used does not matter very much; GNU Go
+uses a spiral as shown below.
+
+@ifinfo
+@example
+  +---B--------------+
+  | C 4 A . . . . . .|
+  D 5 1 3 9 . . . . .|
+  E 6 2 8 . . X . . .|
+  | F 7 . . . . . . .|
+  | . +-> . . . . . .|
+  | . . . . . . . . .|
+  | . O . . . X . . .|
+  | . . . . . . . . .|
+  | . . . . . . . . .|
+  +------------------+
+@end example
+@end ifinfo
+@ifnotinfo
+@image{path}
+@end ifnotinfo
+
+In each step of the path, the pattern matcher jumps into a state
+determined by what it has found on the board so far. If we have
+successfully matched one or several patterns in this step, this state
+immediately tells us so (in its @dfn{attribute}).
+But the state also implicitly encodes which further patterns can still
+get matched: The information stored in the state contains in which state
+to jump next, depending on whether we find a black, white or empty
+intersection (or an intersection out of board) in the next step of the
+path. The state will also immediately tell us if we cannot find any
+further pattern (by telling us to jump into the @dfn{error} state).
+
+These sloppy explanations may become clearer with the definitions in
+the next section (@ref{What is a DFA}).
+
+Reading the board following a predefined path reduces
+the two dimentional pattern matching to a linear text searching problem.
+For example, this pattern
+
+@example
+?X?
+.O?
+?OO
+@end example
+
+@noindent
+scanned following the path
+
+@example
+ B
+C4A
+5139
+628
+ 7
+@end example
+
+@noindent
+gives the string @b{"OO?X.?*O*?*?"}
+where @b{"?"} means @b{'don't care'} and @b{"*"} means @b{'don't care, can
+even be out of board'}.
+
+So we can forget that we are dealing with two dimensional patterns and
+consider linear patterns.
+
+
+@node What is a DFA
+@section What is a DFA
+
+The acronym DFA means Deterministic Finite state Automaton
+(See @uref{http://www.eti.pg.gda.pl/~jandac/thesis/node12.html}
+or @cite{Hopcroft & Ullman "Introduction to Language Theory"}
+for more details).
+DFA are common tools in compilers design 
+(Read @cite{Aho, Ravi Sethi, Ullman "COMPILERS: Principles, Techniques and Tools"}
+for a complete introduction), a lot of
+powerfull text searching algorithm like @cite{Knuth-Morris-Pratt}
+or @cite{Boyer-Moore} algorithms are based on DFA's
+(See @uref{http://www-igm.univ-mlv.fr/~lecroq/string/} for a bibliography
+of pattern matching algorithms).
+
+Basically, 
+a DFA is a set of @dfn{states} connected by labeled @dfn{transitions}.
+The labels are the values read on the board,
+in GNU Go these values are EMPTY, WHITE, BLACK or OUT_BOARD, denoted
+respectively by '.','O','X' and '#'.
+
+
+The best way to represent a DFA is to draw its transition graph:
+the pattern @b{"????..X"} is recognized by the following DFA:
+
+@ifinfo
+@example
+@group
+   .,X,O     .,X,O    .,X,O    .,X,O     .      .      X
+[1]------>[2]----->[3]----->[4]----->[5]--->[6]--->[7]--->[8 OK!]
+Start
+@end group
+@end example
+@end ifinfo
+
+@ifnotinfo
+@image{dfa}
+@end ifnotinfo
+
+
+This means that
+starting from state [1], if you read '.','X' or 'O' on the board, 
+go to state [2] and so on until you reach state [5].
+From state [5], if you read '.', go to state [6]
+otherwise go to error state [0]. 
+And so on until you reach state [8].
+As soon as you reach state [8], 
+you recognize Pattern @b{"????..X"}
+
+Adding a pattern like @b{"XXo"} ('o' is a wildcard for not 'X')
+will transform directly the automaton 
+by synchronization product (@ref{Building the DFA}).
+Consider the following DFA:
+
+@ifinfo
+@example
+@group
+Start .,O   .,X,O    .,O,X   .,X,O      .      .       X
+[1]---->[2]----->[3]----->[4]------>[5]--->[6]---->[7]--->[8 OK!]
+ |                ^        ^         ^
+ |            .,O |        |         |
+ |            ----         |         |
+ |           |          X  |         |
+ |           |          ---    .,X,O |
+ |           |         |             |
+ |     X     |   X     | O,.         |
+  --------->[9]------>[A]--->[B OK!]-
+@end group
+@end example
+@end ifinfo
+
+@ifnotinfo
+@image{dfa2}
+@end ifnotinfo
+
+By adding a special @dfn{error} state and completing each state
+by a transition to error state when there is none, we transform
+easily a DFA in a @dfn{Complete Deterministic Finite state
+Automaton} (CDFA).  The synchronization product
+(@ref{Building the DFA}) is only possible on CDFA's.
+
+
+@ifinfo
+@example
+@group
+Start .,O   .,X,O    .,O,X   .,X,O      .      .       X
+[1]---->[2]----->[3]----->[4]------>[5]--->[6]---->[7]--->[8 OK!]
+ |                ^        ^         ^      |       |      |
+ |            .,O |        |         |      |       |      |
+ |            ----         |         |      |       |      |
+ |           |          X  |         |      |X,O    | .,O  |X,.,O
+ |           |          ---    .,X,O |      |       |      |
+ |           |         |             |      |       |      |
+ |     X     |   X     | O,.         |     \ /     \ /    \ /
+  --------->[9]------>[A]--->[B OK!]-      [0  Error state !]
+@end group
+@end example
+@end ifinfo
+@ifnotinfo
+@image{cdfa}
+@end ifnotinfo
+
+The graph of a CDFA is coded by an array of states:
+The 0 state is the "error" state and
+the start state is 1.
+
+@example
+@group
+----------------------------------------------------
+ state  |   .    |   O    |   X    |   #    |  att
+----------------------------------------------------
+      1 |      2 |      2 |      9 |      0 |
+      2 |      3 |      3 |      3 |      0 |
+      3 |      4 |      4 |      4 |      0 |
+      5 |      6 |      0 |      0 |      0 |
+      6 |      7 |      0 |      0 |      0 |
+      7 |      0 |      0 |      8 |      0 |
+      8 |      0 |      0 |      0 |      0 | Found pattern "????..X"
+      9 |      3 |      3 |      A |      0 |
+      A |      B |      B |      4 |      0 |
+      B |      5 |      5 |      5 |      0 | Found pattern "XXo"
+----------------------------------------------------
+@end group
+@end example
+
+To each state we associate an often empty
+list of attributes which is the  
+list of pattern indexes recognized when this state is reached.
+In '@file{dfa.h}' this is basically represented by two stuctures:
+
+@example
+@group
+@code{
+/* dfa state */
+typedef struct state
+@{
+  int next[4]; /* transitions for EMPTY, BLACK, WHITE and OUT_BOARD */
+  attrib_t *att;
+@}
+state_t;
+
+/* dfa */
+typedef struct dfa
+@{
+  attrib_t *indexes; /* Array of pattern indexes */
+  int maxIndexes;
+
+  state_t *states; /* Array of states */
+  int maxStates;
+@}
+dfa_t;}
+@end group
+@end example
+
+@node Pattern matching with DFA
+@section Pattern matching with DFA
+
+Recognizing with a DFA is very simple
+and thus very fast 
+(See '@code{scan_for_pattern()}' in the '@file{engine/matchpat.c}' file).
+
+
+Starting from the start state, we only need to read the board
+following the spiral path, jump from states to states following
+the transitions labelled by the values read on the board and
+collect the patterns indexes on the way.  If we reach the error
+state (zero), it means that no more patterns will be matched.
+The worst case complexity of this algorithm is o(m) where m is
+the size of the biggest pattern.
+
+Here is an example of scan:
+
+First we build a minimal DFA recognizing these patterns:
+@b{"X..X"}, @b{"X???"}, @b{"X.OX"} and @b{"X?oX"}.
+Note that wildcards like '?','o', or 'x' give multiple out-transitions.
+
+@example
+@group
+----------------------------------------------------
+ state  |   .    |   O    |   X    |   #    |  att
+----------------------------------------------------
+      1 |      0 |      0 |      2 |      0 |
+      2 |      3 |     10 |     10 |      0 |
+      3 |      4 |      7 |      9 |      0 |
+      4 |      5 |      5 |      6 |      0 |
+      5 |      0 |      0 |      0 |      0 |    2
+      6 |      0 |      0 |      0 |      0 |    4    2    1
+      7 |      5 |      5 |      8 |      0 |
+      8 |      0 |      0 |      0 |      0 |    4    2    3
+      9 |      5 |      5 |      5 |      0 |
+     10 |     11 |     11 |      9 |      0 |
+     11 |      5 |      5 |     12 |      0 |
+     12 |      0 |      0 |      0 |      0 |    4    2
+----------------------------------------------------
+@end group
+@end example
+
+We perform the scan of the string 
+@b{"X..XXO...."} starting from state 1:
+
+Current state:     1, substring to scan :@b{ X..XXO....}
+
+We read an 'X' value, so from state 1 we must go to
+state 2.
+
+Current state:     2, substring to scan : @b{..XXO....}
+
+We read a '.' value, so from state 2 we must go to
+state 3 and so on ...
+
+@example
+Current state:     3, substring to scan : .XXO....
+Current state:     4, substring to scan : XXO....
+Current state:     6, substring to scan : XO....
+Found pattern 4
+Found pattern 2
+Found pattern 1                 
+@end example
+
+After reaching state 6 where we match patterns
+1,2 and 4, there is no out-transitions so we stop the matching.
+To keep the same match order as in the standard algorithm, 
+the patterns indexes are collected in an array and sorted by indexes.
+
+@node Building the DFA
+@section Building the DFA
+
+The most flavouring point is the building of the minimal DFA 
+recognizing a given set of patterns.
+To perform the insertion of a new
+pattern into an already existing DFA one must completly rebuild
+the DFA: the principle is to build the minimal CDFA recognizing
+the new pattern to replace the original CDFA with its
+@dfn{synchronised product} by the new one.
+
+We first give a formal definition:
+Let @b{L} be the left CDFA and @b{R} be the right one.
+Let @b{B} be the @dfn{synchronised product} of @b{L} by @b{R}.
+Its states are the couples @b{(l,r)} where @b{l} is a state of @b{L} and 
+@b{r} is a state of @b{R}.
+The state @b{(0,0)} is the error state of @b{B} and the state
+@b{(1,1)} is its initial state.
+To each couple @b{(l,r)} we associate the union of patterns
+recognized in both @b{l} and @b{r}.
+The transitions set of @b{B} is the set of transitions
+@b{(l1,r1)---a--->(l2,r2)} for
+each symbol @b{'a'} such that both @b{l1---a--->l2} in @b{L} 
+and @b{r1---a--->r2} in @b{R}.
+
+The maximal number of states of @b{B} is the product of the
+number of states of @b{L} and @b{R} but almost all this states
+are non reachable from the initial state @b{(1,1)}.
+
+The algorithm used in function '@code{sync_product()}' builds
+the minimal product DFA only by keeping the reachable states.
+It recursively scans the product CDFA by following simultaneously
+the transitions of @b{L} and @b{R}. A hast table
+(@code{gtest}) is used to check if a state @b{(l,r)} has
+already been reached, the reachable states are remapped on
+a new DFA. The CDFA thus obtained is minimal and recognizes the
+union of the two patterns sets.
+
+@ifnotinfo
+For example these two CDFA's:
+
+
+@image{sync-prod1}
+
+Give by synchronization product the following one:
+
+
+@image{sync-prod2}
+@end ifnotinfo
+
+It is possible to construct a special pattern database that
+generates an "explosive" automaton: the size of the DFA is in
+the worst case exponential in the number of patterns it
+recognizes.  But it doesn't occur in pratical situations: 
+the DFA size tends to be @dfn{stable}.  By @dfn{stable} we mean that if we
+add a pattern which greatly increases the size of the DFA it
+also increases the chance that the next added pattern does not
+increase its size at all.  Nevertheless there are many ways to
+reduce the size of the DFA. Good compression methods are
+explained in @cite{Aho, Ravi Sethi, Ullman "COMPILERS:
+Principles, Techniques and Tools" chapter Optimization of
+DFA-based pattern matchers}.
+
+@node Incremental Algorithm
+@section Incremental Algorithm
+
+The incremental version of the DFA pattern matcher is not yet implemented
+in GNU Go but we explain here how it will work.
+By definition of a deterministic automaton, scanning the same
+string will reach the same states every time.
+
+Each reached state during pattern matching is stored in a stack
+@code{top_stack[i][j]} and @code{state_stack[i][j][stack_idx]}
+We use one stack by intersection @code{(i,j)}.  A precomputed reverse
+path list allows to know for each couple of board intersections
+@code{(x,y)} its position @code{reverse(x,y)} in the spiral scan path
+starting from @code{(0,0)}.
+
+When a new stone is put on the board at @code{(lx,ly)}, the only work
+of the pattern matcher is:
+
+@example
+@group
+@code{
+ for(each stone on the board at (i,j))
+    if(reverse(lx-i,ly-j) < top_stack[i][j])
+      @{
+         begin the dfa scan from the state
+         state_stack[i][j][reverse(lx-i,ly-j)];
+      @}
+}
+@end group
+@end example
+
+In most situations reverse(lx-i,ly-j) will be inferior to
+top_stack[i][j]. This should speedup a lot pattern matching.
+
+@node DFA Optimizations
+@section Some DFA Optimizations
+
+The DFA is constructed to minimize jumps in memory making some
+assumptions about the frequencies of the values: the EMPTY
+value is supposed to appear often on the board, so the the '.'
+transition are almost always successors in memory.  The
+OUT_BOARD are supposed to be rare, so '#' transitions will
+almost always imply a big jump.
+
diff --git a/doc/dfa2.eps b/doc/dfa2.eps
new file mode 100644 (file)
index 0000000..e008c0e
--- /dev/null
@@ -0,0 +1,622 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: dfa2.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Fri Jun 22 17:40:37 2001
+%%For: turvoy@semeai.irisa.fr (Tanguy Urvoy, DEA, Paragraphe)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 411 101
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 0.5000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-6.0 108.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 4600 m -1000 -1000 l 14886 -1000 l 14886 4600 l cp clip
+ 0.03000 0.03000 sc
+7.500 slw
+% Ellipse
+n 900 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6300 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4500 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 8100 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 9600 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 11100 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 12600 900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 2700 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4500 2700 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6300 2700 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs  clippath
+5835 870 m 6000 900 l 5835 930 l 6015 930 l 6015 870 l cp
+clip
+n 4800 900 m 6000 900 l gs col0 s gr gr
+
+% arrowhead
+n 5835 870 m 6000 900 l 5835 930 l 5835 900 l 5835 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5859 990 m 6000 900 l 5900 1034 l 6031 912 l 5991 868 l cp
+clip
+n 4800 900 m 4802 902 l 4807 906 l 4815 914 l 4828 926 l 4846 942 l
+ 4869 963 l 4896 986 l 4926 1013 l 4958 1041 l 4992 1070 l
+ 5027 1099 l 5061 1127 l 5095 1154 l 5128 1178 l 5159 1201 l
+ 5188 1221 l 5216 1238 l 5242 1254 l 5267 1267 l 5291 1277 l
+ 5314 1286 l 5336 1292 l 5358 1297 l 5379 1299 l 5400 1300 l
+ 5421 1299 l 5442 1297 l 5464 1292 l 5486 1286 l 5509 1277 l
+ 5533 1267 l 5558 1254 l 5584 1238 l 5612 1221 l 5641 1201 l
+ 5672 1178 l 5705 1154 l 5739 1127 l 5773 1099 l 5808 1070 l
+ 5842 1041 l 5874 1013 l 5904 986 l 5931 963 l 5954 942 l
+ 5972 926 l 6000 900 l gs col0 s gr gr
+
+% arrowhead
+n 5859 990 m 6000 900 l 5900 1034 l 5879 1012 l 5859 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5900 758 m 6000 892 l 5859 802 l 5991 924 l 6031 880 l cp
+clip
+n 4800 892 m 4802 890 l 4807 886 l 4815 878 l 4828 866 l 4846 850 l
+ 4869 829 l 4896 806 l 4926 779 l 4958 751 l 4992 722 l
+ 5027 693 l 5061 665 l 5095 638 l 5128 614 l 5159 591 l
+ 5188 571 l 5216 554 l 5242 538 l 5267 525 l 5291 515 l
+ 5314 506 l 5336 500 l 5358 495 l 5379 493 l 5400 492 l
+ 5421 493 l 5442 495 l 5464 500 l 5486 506 l 5509 515 l
+ 5533 525 l 5558 538 l 5584 554 l 5612 571 l 5641 591 l
+ 5672 614 l 5705 638 l 5739 665 l 5773 693 l 5808 722 l
+ 5842 751 l 5874 779 l 5904 806 l 5931 829 l 5954 850 l
+ 5972 866 l 6000 892 l gs col0 s gr gr
+
+% arrowhead
+n 5900 758 m 6000 892 l 5859 802 l 5879 780 l 5900 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4035 870 m 4200 900 l 4035 930 l 4215 930 l 4215 870 l cp
+clip
+n 3000 900 m 4200 900 l gs col0 s gr gr
+
+% arrowhead
+n 4035 870 m 4200 900 l 4035 930 l 4035 900 l 4035 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4059 990 m 4200 900 l 4100 1034 l 4231 912 l 4191 868 l cp
+clip
+n 3000 900 m 3002 902 l 3007 906 l 3015 914 l 3028 926 l 3046 942 l
+ 3069 963 l 3096 986 l 3126 1013 l 3158 1041 l 3192 1070 l
+ 3227 1099 l 3261 1127 l 3295 1154 l 3328 1178 l 3359 1201 l
+ 3388 1221 l 3416 1238 l 3442 1254 l 3467 1267 l 3491 1277 l
+ 3514 1286 l 3536 1292 l 3558 1297 l 3579 1299 l 3600 1300 l
+ 3621 1299 l 3642 1297 l 3664 1292 l 3686 1286 l 3709 1277 l
+ 3733 1267 l 3758 1254 l 3784 1238 l 3812 1221 l 3841 1201 l
+ 3872 1178 l 3905 1154 l 3939 1127 l 3973 1099 l 4008 1070 l
+ 4042 1041 l 4074 1013 l 4104 986 l 4131 963 l 4154 942 l
+ 4172 926 l 4200 900 l gs col0 s gr gr
+
+% arrowhead
+n 4059 990 m 4200 900 l 4100 1034 l 4079 1012 l 4059 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4100 758 m 4200 892 l 4059 802 l 4191 924 l 4231 880 l cp
+clip
+n 3000 892 m 3002 890 l 3007 886 l 3015 878 l 3028 866 l 3046 850 l
+ 3069 829 l 3096 806 l 3126 779 l 3158 751 l 3192 722 l
+ 3227 693 l 3261 665 l 3295 638 l 3328 614 l 3359 591 l
+ 3388 571 l 3416 554 l 3442 538 l 3467 525 l 3491 515 l
+ 3514 506 l 3536 500 l 3558 495 l 3579 493 l 3600 492 l
+ 3621 493 l 3642 495 l 3664 500 l 3686 506 l 3709 515 l
+ 3733 525 l 3758 538 l 3784 554 l 3812 571 l 3841 591 l
+ 3872 614 l 3905 638 l 3939 665 l 3973 693 l 4008 722 l
+ 4042 751 l 4074 779 l 4104 806 l 4131 829 l 4154 850 l
+ 4172 866 l 4200 892 l gs col0 s gr gr
+
+% arrowhead
+n 4100 758 m 4200 892 l 4059 802 l 4079 780 l 4100 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2247 969 m 2400 900 l 2281 1018 l 2429 916 l 2395 867 l cp
+clip
+n 1200 900 m 1203 902 l 1209 906 l 1219 913 l 1235 924 l 1257 939 l
+ 1284 957 l 1315 978 l 1350 1000 l 1387 1024 l 1424 1047 l
+ 1461 1070 l 1498 1092 l 1533 1112 l 1566 1129 l 1598 1145 l
+ 1627 1159 l 1655 1170 l 1681 1180 l 1706 1187 l 1730 1193 l
+ 1754 1197 l 1777 1199 l 1800 1200 l 1823 1199 l 1846 1197 l
+ 1870 1193 l 1894 1187 l 1919 1180 l 1945 1170 l 1973 1159 l
+ 2002 1145 l 2034 1129 l 2067 1112 l 2102 1092 l 2139 1070 l
+ 2176 1047 l 2213 1024 l 2250 1000 l 2285 978 l 2316 957 l
+ 2343 939 l 2365 924 l 2400 900 l gs col0 s gr gr
+
+% arrowhead
+n 2247 969 m 2400 900 l 2281 1018 l 2264 993 l 2247 969 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+435 870 m 600 900 l 435 930 l 615 930 l 615 870 l cp
+clip
+n 225 900 m 600 900 l gs col0 s gr gr
+
+% arrowhead
+n 435 870 m 600 900 l 435 930 l 435 900 l 435 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7635 870 m 7800 900 l 7635 930 l 7815 930 l 7815 870 l cp
+clip
+n 6600 900 m 7800 900 l gs col0 s gr gr
+
+% arrowhead
+n 7635 870 m 7800 900 l 7635 930 l 7635 900 l 7635 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7659 990 m 7800 900 l 7700 1034 l 7831 912 l 7791 868 l cp
+clip
+n 6600 900 m 6602 902 l 6607 906 l 6615 914 l 6628 926 l 6646 942 l
+ 6669 963 l 6696 986 l 6726 1013 l 6758 1041 l 6792 1070 l
+ 6827 1099 l 6861 1127 l 6895 1154 l 6928 1178 l 6959 1201 l
+ 6988 1221 l 7016 1238 l 7042 1254 l 7067 1267 l 7091 1277 l
+ 7114 1286 l 7136 1292 l 7158 1297 l 7179 1299 l 7200 1300 l
+ 7221 1299 l 7242 1297 l 7264 1292 l 7286 1286 l 7309 1277 l
+ 7333 1267 l 7358 1254 l 7384 1238 l 7412 1221 l 7441 1201 l
+ 7472 1178 l 7505 1154 l 7539 1127 l 7573 1099 l 7608 1070 l
+ 7642 1041 l 7674 1013 l 7704 986 l 7731 963 l 7754 942 l
+ 7772 926 l 7800 900 l gs col0 s gr gr
+
+% arrowhead
+n 7659 990 m 7800 900 l 7700 1034 l 7679 1012 l 7659 990 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7700 758 m 7800 892 l 7659 802 l 7791 924 l 7831 880 l cp
+clip
+n 6600 892 m 6602 890 l 6607 886 l 6615 878 l 6628 866 l 6646 850 l
+ 6669 829 l 6696 806 l 6726 779 l 6758 751 l 6792 722 l
+ 6827 693 l 6861 665 l 6895 638 l 6928 614 l 6959 591 l
+ 6988 571 l 7016 554 l 7042 538 l 7067 525 l 7091 515 l
+ 7114 506 l 7136 500 l 7158 495 l 7179 493 l 7200 492 l
+ 7221 493 l 7242 495 l 7264 500 l 7286 506 l 7309 515 l
+ 7333 525 l 7358 538 l 7384 554 l 7412 571 l 7441 591 l
+ 7472 614 l 7505 638 l 7539 665 l 7573 693 l 7608 722 l
+ 7642 751 l 7674 779 l 7704 806 l 7731 829 l 7754 850 l
+ 7772 866 l 7800 892 l gs col0 s gr gr
+
+% arrowhead
+n 7700 758 m 7800 892 l 7659 802 l 7679 780 l 7700 758 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9135 870 m 9300 900 l 9135 930 l 9315 930 l 9315 870 l cp
+clip
+n 8400 900 m 9300 900 l gs col0 s gr gr
+
+% arrowhead
+n 9135 870 m 9300 900 l 9135 930 l 9135 900 l 9135 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+10635 870 m 10800 900 l 10635 930 l 10815 930 l 10815 870 l cp
+clip
+n 9900 900 m 10800 900 l gs col0 s gr gr
+
+% arrowhead
+n 10635 870 m 10800 900 l 10635 930 l 10635 900 l 10635 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+12135 870 m 12300 900 l 12135 930 l 12315 930 l 12315 870 l cp
+clip
+n 11400 900 m 12300 900 l gs col0 s gr gr
+
+% arrowhead
+n 12135 870 m 12300 900 l 12135 930 l 12135 900 l 12135 870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+12630 1335 m 12600 1500 l 12570 1335 l 12570 1515 l 12630 1515 l cp
+clip
+n 12600 1200 m 12600 1500 l gs col0 s gr gr
+
+% arrowhead
+n 12630 1335 m 12600 1500 l 12570 1335 l 12600 1335 l 12630 1335 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2281 782 m 2400 900 l 2247 831 l 2395 933 l 2429 884 l cp
+clip
+n 1200 900 m 1203 898 l 1209 894 l 1219 887 l 1235 876 l 1257 861 l
+ 1284 843 l 1315 822 l 1350 800 l 1387 776 l 1424 753 l
+ 1461 730 l 1498 708 l 1533 688 l 1566 671 l 1598 655 l
+ 1627 641 l 1655 630 l 1681 620 l 1706 613 l 1730 607 l
+ 1754 603 l 1777 601 l 1800 600 l 1823 601 l 1846 603 l
+ 1870 607 l 1894 613 l 1919 620 l 1945 630 l 1973 641 l
+ 2002 655 l 2034 671 l 2067 688 l 2102 708 l 2139 730 l
+ 2176 753 l 2213 776 l 2250 800 l 2285 822 l 2316 843 l
+ 2343 861 l 2365 876 l 2400 900 l gs col0 s gr gr
+
+% arrowhead
+n 2281 782 m 2400 900 l 2247 831 l 2264 807 l 2281 782 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2210 2613 m 2359 2688 l 2193 2671 l 2406 2733 l 2423 2675 l cp
+clip
+n 900 1200 m 901 1202 l 902 1207 l 905 1217 l 909 1231 l 915 1252 l
+ 923 1278 l 932 1310 l 944 1348 l 957 1391 l 971 1438 l
+ 987 1488 l 1004 1540 l 1021 1592 l 1039 1645 l 1057 1697 l
+ 1075 1748 l 1093 1796 l 1111 1843 l 1128 1887 l 1146 1929 l
+ 1163 1968 l 1181 2005 l 1198 2039 l 1216 2071 l 1233 2101 l
+ 1251 2130 l 1270 2156 l 1289 2181 l 1309 2205 l 1329 2228 l
+ 1350 2250 l 1372 2271 l 1395 2291 l 1419 2311 l 1444 2330 l
+ 1470 2349 l 1499 2367 l 1529 2384 l 1561 2402 l 1595 2419 l
+ 1632 2437 l 1671 2454 l 1713 2472 l 1757 2489 l 1804 2507 l
+ 1852 2525 l 1903 2543 l 1955 2561 l 2008 2579 l 2060 2596 l
+ 2112 2613 l 2162 2629 l 2209 2643 l 2252 2656 l 2290 2668 l
+ 2322 2677 l 2348 2685 l 2369 2691 l 2400 2700 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 2210 2613 m 2359 2688 l 2193 2671 l 2201 2642 l 2210 2613 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+4035 2670 m 4200 2700 l 4035 2730 l 4215 2730 l 4215 2670 l cp
+clip
+n 3000 2700 m 4200 2700 l gs col0 s gr gr
+
+% arrowhead
+n 4035 2670 m 4200 2700 l 4035 2730 l 4035 2700 l 4035 2670 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4176 1309 m 4260 1164 l 4232 1330 l 4308 1121 l 4252 1101 l cp
+clip
+n 2925 2475 m 2927 2474 l 2931 2473 l 2940 2469 l 2952 2464 l 2970 2457 l
+ 2993 2448 l 3022 2437 l 3055 2424 l 3093 2408 l 3134 2391 l
+ 3177 2373 l 3223 2354 l 3269 2335 l 3315 2314 l 3361 2294 l
+ 3406 2274 l 3448 2255 l 3489 2235 l 3528 2216 l 3565 2197 l
+ 3599 2179 l 3632 2161 l 3662 2144 l 3690 2126 l 3717 2109 l
+ 3742 2091 l 3766 2074 l 3788 2056 l 3810 2038 l 3830 2019 l
+ 3850 2000 l 3870 1979 l 3890 1957 l 3909 1935 l 3927 1911 l
+ 3945 1886 l 3963 1860 l 3980 1832 l 3997 1802 l 4015 1770 l
+ 4032 1736 l 4050 1699 l 4068 1661 l 4086 1620 l 4104 1577 l
+ 4123 1533 l 4141 1487 l 4159 1441 l 4177 1395 l 4194 1350 l
+ 4210 1307 l 4225 1267 l 4238 1231 l 4249 1200 l 4258 1175 l
+ 4264 1155 l 4275 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 4176 1309 m 4260 1164 l 4232 1330 l 4204 1319 l 4176 1309 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+4099 1238 m 4243 1152 l 4138 1283 l 4306 1138 l 4267 1092 l cp
+clip
+n 2925 2475 m 2927 2473 l 2930 2469 l 2937 2462 l 2947 2451 l 2961 2436 l
+ 2979 2416 l 3001 2392 l 3026 2364 l 3055 2332 l 3086 2298 l
+ 3118 2263 l 3152 2226 l 3186 2189 l 3219 2152 l 3252 2117 l
+ 3284 2082 l 3315 2049 l 3344 2017 l 3372 1987 l 3399 1958 l
+ 3424 1931 l 3449 1906 l 3472 1881 l 3495 1858 l 3516 1835 l
+ 3538 1813 l 3559 1792 l 3579 1771 l 3600 1750 l 3621 1729 l
+ 3641 1709 l 3662 1688 l 3684 1668 l 3705 1647 l 3728 1625 l
+ 3751 1603 l 3776 1580 l 3801 1556 l 3828 1531 l 3856 1505 l
+ 3885 1478 l 3916 1450 l 3948 1421 l 3981 1391 l 4014 1360 l
+ 4048 1330 l 4082 1299 l 4114 1270 l 4145 1242 l 4174 1216 l
+ 4199 1193 l 4221 1173 l 4239 1157 l 4253 1144 l 4275 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 4099 1238 m 4243 1152 l 4138 1283 l 4118 1260 l 4099 1238 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+5907 1250 m 6045 1154 l 5950 1293 l 6107 1136 l 6064 1093 l cp
+clip
+n 4725 2475 m 6075 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 5907 1250 m 6045 1154 l 5950 1293 l 5929 1271 l 5907 1250 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+5862 2604 m 6000 2700 l 5837 2659 l 6001 2734 l 6026 2679 l cp
+clip
+n 4800 2700 m 4803 2699 l 4809 2696 l 4819 2691 l 4835 2684 l 4857 2674 l
+ 4884 2662 l 4915 2648 l 4950 2633 l 4987 2617 l 5024 2602 l
+ 5061 2586 l 5098 2572 l 5133 2559 l 5166 2547 l 5198 2537 l
+ 5227 2527 l 5255 2520 l 5281 2513 l 5306 2508 l 5330 2505 l
+ 5354 2502 l 5377 2500 l 5400 2500 l 5423 2500 l 5446 2502 l
+ 5470 2505 l 5494 2508 l 5519 2513 l 5545 2520 l 5573 2527 l
+ 5602 2537 l 5634 2547 l 5667 2559 l 5702 2572 l 5739 2586 l
+ 5776 2602 l 5813 2617 l 5850 2633 l 5885 2648 l 5916 2662 l
+ 5943 2674 l 5965 2684 l 6000 2700 l gs col0 s gr gr
+
+% arrowhead
+n 5862 2604 m 6000 2700 l 5837 2659 l 5850 2631 l 5862 2604 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5837 2741 m 6000 2700 l 5862 2796 l 6026 2721 l 6001 2666 l cp
+clip
+n 4800 2700 m 4803 2701 l 4809 2704 l 4819 2709 l 4835 2716 l 4857 2726 l
+ 4884 2738 l 4915 2752 l 4950 2767 l 4987 2783 l 5024 2798 l
+ 5061 2814 l 5098 2828 l 5133 2841 l 5166 2853 l 5198 2863 l
+ 5227 2873 l 5255 2880 l 5281 2887 l 5306 2892 l 5330 2895 l
+ 5354 2898 l 5377 2900 l 5400 2900 l 5423 2900 l 5446 2898 l
+ 5470 2895 l 5494 2892 l 5519 2887 l 5545 2880 l 5573 2873 l
+ 5602 2863 l 5634 2853 l 5667 2841 l 5702 2828 l 5739 2814 l
+ 5776 2798 l 5813 2783 l 5850 2767 l 5885 2752 l 5916 2738 l
+ 5943 2726 l 5965 2716 l 6000 2700 l gs col0 s gr gr
+
+% arrowhead
+n 5837 2741 m 6000 2700 l 5862 2796 l 5850 2769 l 5837 2741 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6330 3135 m 6300 3300 l 6270 3135 l 6270 3315 l 6330 3315 l cp
+clip
+n 6300 3000 m 6300 3300 l gs col0 s gr gr
+
+% arrowhead
+n 6330 3135 m 6300 3300 l 6270 3135 l 6300 3135 l 6330 3135 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+7674 1182 m 7836 1142 l 7698 1236 l 7901 1146 l 7877 1091 l cp
+clip
+n 6525 2475 m 6526 2473 l 6527 2468 l 6531 2460 l 6536 2447 l 6542 2428 l
+ 6551 2405 l 6562 2376 l 6575 2343 l 6590 2306 l 6606 2266 l
+ 6623 2225 l 6641 2182 l 6659 2138 l 6677 2096 l 6696 2054 l
+ 6714 2014 l 6732 1976 l 6750 1939 l 6768 1905 l 6785 1873 l
+ 6803 1843 l 6820 1814 l 6837 1787 l 6855 1762 l 6873 1738 l
+ 6891 1714 l 6910 1692 l 6930 1671 l 6950 1650 l 6970 1631 l
+ 6990 1612 l 7012 1594 l 7034 1575 l 7058 1557 l 7083 1539 l
+ 7110 1520 l 7138 1502 l 7168 1482 l 7201 1463 l 7235 1443 l
+ 7272 1422 l 7311 1401 l 7352 1379 l 7394 1357 l 7439 1334 l
+ 7485 1311 l 7531 1288 l 7577 1265 l 7623 1243 l 7666 1222 l
+ 7707 1203 l 7745 1185 l 7778 1170 l 7807 1156 l 7830 1146 l
+ 7848 1137 l 7875 1125 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 7674 1182 m 7836 1142 l 7698 1236 l 7686 1209 l 7674 1182 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+7840 1378 m 7933 1238 l 7895 1402 l 7983 1198 l 7928 1174 l cp
+clip
+n 6525 2475 m 6527 2474 l 6531 2473 l 6540 2470 l 6552 2466 l 6570 2461 l
+ 6594 2453 l 6622 2444 l 6655 2433 l 6693 2420 l 6734 2406 l
+ 6778 2391 l 6824 2375 l 6871 2359 l 6917 2342 l 6963 2325 l
+ 7008 2308 l 7051 2291 l 7093 2274 l 7132 2258 l 7169 2242 l
+ 7204 2226 l 7237 2210 l 7268 2195 l 7297 2179 l 7324 2163 l
+ 7350 2147 l 7375 2131 l 7398 2115 l 7420 2098 l 7442 2080 l
+ 7463 2063 l 7484 2043 l 7505 2022 l 7525 2000 l 7545 1978 l
+ 7564 1953 l 7584 1928 l 7603 1900 l 7622 1871 l 7642 1840 l
+ 7662 1806 l 7682 1770 l 7703 1732 l 7724 1692 l 7745 1650 l
+ 7767 1606 l 7789 1560 l 7811 1514 l 7832 1468 l 7852 1424 l
+ 7871 1381 l 7889 1341 l 7905 1306 l 7918 1275 l 7929 1250 l
+ 7937 1230 l 7950 1200 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 7840 1378 m 7933 1238 l 7895 1402 l 7868 1390 l 7840 1378 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+7.500 slw
+gs  clippath
+7704 1320 m 7844 1228 l 7745 1364 l 7907 1212 l 7865 1168 l cp
+clip
+n 6525 2475 m 7875 1200 l gs col0 s gr gr
+
+% arrowhead
+15.000 slw
+n 7704 1320 m 7844 1228 l 7745 1364 l 7725 1342 l 7704 1320 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Bold ff 285.00 scf sf
+817 960 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5400 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3600 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+2625 945 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+4425 945 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6225 945 m
+gs 1 -1 sc (4) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7200 825 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7125 1200 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7125 442 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8025 945 m
+gs 1 -1 sc (5) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+8775 750 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+9525 975 m
+gs 1 -1 sc (6) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+10275 750 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11025 975 m
+gs 1 -1 sc (7) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11700 825 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+12525 975 m
+gs 1 -1 sc (8) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+11625 1800 m
+gs 1 -1 sc (Pattern "????..X") col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1725 1125 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1800 525 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+1425 2175 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+2625 2775 m
+gs 1 -1 sc (9) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+4425 2775 m
+gs 1 -1 sc (A) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3525 2625 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6225 2775 m
+gs 1 -1 sc (B) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 2400 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5400 2775 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5325 3600 m
+gs 1 -1 sc (Pattern "XXo") col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3675 1950 m
+gs 1 -1 sc (.) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+5100 1800 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+3300 1800 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+6525 1800 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7275 2025 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Bold ff 285.00 scf sf
+7050 1800 m
+gs 1 -1 sc (.) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/dfa2.fig b/doc/dfa2.fig
new file mode 100644 (file)
index 0000000..fa9a4b6
--- /dev/null
@@ -0,0 +1,165 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+50.00
+Single
+-2
+1200 2
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 900 900 300 300 900 900 1200 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 6300 900 300 300 6300 900 6600 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4500 900 300 300 4500 900 4800 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 900 300 300 2700 900 3000 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 8100 900 300 300 8100 900 8400 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 9600 900 300 300 9600 900 9900 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 11100 900 300 300 11100 900 11400 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 12600 900 300 300 12600 900 12900 900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 2700 300 300 2700 2700 3000 2700
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4500 2700 300 300 4500 2700 4800 2700
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 6300 2700 300 300 6300 2700 6600 2700
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        4800 900 6000 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 900 5400 1500 6000 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 892 5400 292 6000 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        3000 900 4200 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        3000 900 3600 1500 4200 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        3000 892 3600 292 4200 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        1200 900 1800 1350 2400 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        225 900 600 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        6600 900 7800 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        6600 900 7200 1500 7800 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        6600 892 7200 292 7800 892
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        8400 900 9300 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        9900 900 10800 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        11400 900 12300 900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        12600 1200 12600 1500
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        1200 900 1800 450 2400 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        900 1200 1200 2400 2400 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        3000 2700 4200 2700
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        2925 2475 3975 2100 4275 1125
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        2925 2475 3600 1725 4275 1125
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 2.00 60.00 165.00
+        4725 2475 6075 1125
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 2700 5400 2400 6000 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 165.00
+        4800 2700 5400 3000 6000 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 165.00
+        6300 3000 6300 3300
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        6525 2475 6825 1575 7875 1125
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 2.00 60.00 165.00
+        6525 2475 7575 2175 7950 1200
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 2.00 60.00 165.00
+        6525 2475 7875 1200
+        0.000 0.000
+4 0 0 100 0 2 19 0.0000 4 195 135 817 960 1\001
+4 0 0 100 0 2 19 0.0000 4 45 75 5400 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 5325 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 5325 442 X\001
+4 0 0 100 0 2 19 0.0000 4 45 75 3600 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 3525 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 3525 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 2625 945 2\001
+4 0 0 100 0 2 19 0.0000 4 195 135 4425 945 3\001
+4 0 0 100 0 2 19 0.0000 4 195 135 6225 945 4\001
+4 0 0 100 0 2 19 0.0000 4 45 75 7200 825 .\001
+4 0 0 100 0 2 19 0.0000 4 195 225 7125 1200 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 7125 442 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 8025 945 5\001
+4 0 0 100 0 2 19 0.0000 4 45 75 8775 750 .\001
+4 0 0 100 0 2 19 0.0000 4 195 135 9525 975 6\001
+4 0 0 100 0 2 19 0.0000 4 45 75 10275 750 .\001
+4 0 0 100 0 2 19 0.0000 4 195 135 11025 975 7\001
+4 0 0 100 0 2 19 0.0000 4 195 210 11700 825 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 12525 975 8\001
+4 0 0 100 0 2 19 0.0000 4 195 2205 11625 1800 Pattern "????..X"\001
+4 0 0 100 0 2 19 0.0000 4 195 225 1725 1125 O\001
+4 0 0 100 0 2 19 0.0000 4 45 75 1800 525 .\001
+4 0 0 100 0 2 19 0.0000 4 195 210 1425 2175 X\001
+4 0 0 100 0 2 19 0.0000 4 195 135 2625 2775 9\001
+4 0 0 100 0 2 19 0.0000 4 195 210 4425 2775 A\001
+4 0 0 100 0 2 19 0.0000 4 195 210 3525 2625 X\001
+4 0 0 100 0 2 19 0.0000 4 195 195 6225 2775 B\001
+4 0 0 100 0 2 19 0.0000 4 195 225 5325 2400 O\001
+4 0 0 100 0 2 19 0.0000 4 45 75 5400 2775 .\001
+4 0 0 100 0 2 19 0.0000 4 195 1860 5325 3600 Pattern "XXo"\001
+4 0 0 100 0 2 19 0.0000 4 45 75 3675 1950 .\001
+4 0 0 100 0 2 19 0.0000 4 195 210 5100 1800 X\001
+4 0 0 100 0 2 19 0.0000 4 195 225 3300 1800 O\001
+4 0 0 100 0 2 19 0.0000 4 195 210 6525 1800 X\001
+4 0 0 100 0 2 19 0.0000 4 195 225 7275 2025 O\001
+4 0 0 100 0 2 19 0.0000 4 45 75 7050 1800 .\001
diff --git a/doc/dfa2.jpg b/doc/dfa2.jpg
new file mode 100644 (file)
index 0000000..1daed09
Binary files /dev/null and b/doc/dfa2.jpg differ
diff --git a/doc/dfa2.pdf b/doc/dfa2.pdf
new file mode 100644 (file)
index 0000000..92e703d
Binary files /dev/null and b/doc/dfa2.pdf differ
diff --git a/doc/dfa2.png b/doc/dfa2.png
new file mode 100644 (file)
index 0000000..728dc08
Binary files /dev/null and b/doc/dfa2.png differ
diff --git a/doc/dragon.texi b/doc/dragon.texi
new file mode 100644 (file)
index 0000000..943d37a
--- /dev/null
@@ -0,0 +1,894 @@
+@menu
+* Worms::                             Worms
+* Amalgamation::                      How two Worms are amalgamated.
+* Connection::                        Connections.
+* Half Eyes::                         Half Eyes and False Eyes.
+* Dragons::                           Union of WORMS.
+* Dragons in Color::                  Colored display of DRAGONS.
+@end menu
+
+Before considering its move, GNU Go collects some data in several
+arrays. Two of these arrays, called @code{worm} and @code{dragon}, are
+discussed in this document. Others are discussed in @xref{Eyes}.
+
+This information is intended to help evaluate the connectedness, eye
+shape, escape potential and life status of each group.
+
+Later routines called by @code{genmove()} will then have access to this
+information. This document attempts to explain the philosophy and
+algorithms of this preliminary analysis, which is carried out by the
+two routines @code{make_worm()} and @code{make_dragon()} in 
+@file{dragon.c}.
+
+@cindex dragon
+@cindex worm
+@cindex string
+A @dfn{worm} is a maximal set of stones on the board which are connected
+along the horizontal and vertical lines, and are of the same color.
+We often say @dfn{string} instead of worm.
+
+A @dfn{dragon} is a union of strings of the same color which will be
+treated as a unit. The dragons are generated anew at each move. If two strings
+are in the dragon, it is the computer's working hypothesis that they will live
+or die together and are effectively connected.
+
+The purpose of the dragon code is to allow the computer to formulate
+meaningful statements about life and death.  To give one example,
+consider the following situation:
+@example
+
+      OOOOO
+     OOXXXOO
+     OX...XO
+     OXXXXXO
+      OOOOO
+
+@end example
+
+The X's here should be considered a single group with one three-space
+eye, but they consist of two separate strings.  Thus we must
+amalgamate these two strings into a single dragon. Then the assertion
+makes sense, that playing at the center will kill or save the dragon,
+and is a vital point for both players. It would be difficult to
+formulate this statement if the X's are not perceived as a unit.
+
+The present implementation of the dragon code involves simplifying
+assumptions which can be refined in later implementations.
+
+@node Worms
+@section Worms
+@cindex worm
+
+The array @code{struct worm_data worm[MAX_BOARD]} collects information about
+the worms. We will give definitions of the various fields. Each field has
+constant value at each vertex of the worm. We will define each field.
+
+@example
+
+struct worm_data @{
+  int color;
+  int size;
+  float effective_size;
+  int origin;
+  int liberties;
+  int liberties2;
+  int liberties3;
+  int liberties4;
+  int lunch;
+  int cutstone;
+  int cutstone2;
+  int genus;
+  int inessential;
+  int invincible;
+  int unconditional_status;
+  int attack_points[MAX_TACTICAL_POINTS];
+  int attack_codes[MAX_TACTICAL_POINTS];
+  int defense_points[MAX_TACTICAL_POINTS];
+  int defend_codes[MAX_TACTICAL_POINTS];
+  int attack_threat_points[MAX_TACTICAL_POINTS];
+  int attack_threat_codes[MAX_TACTICAL_POINTS]; 
+  int defense_threat_points[MAX_TACTICAL_POINTS];
+  int defense_threat_codes[MAX_TACTICAL_POINTS];
+@};
+@end example
+
+@itemize @bullet
+@item @code{color}
+@quotation
+The color of the worm. 
+@end quotation
+@item @code{size}
+@quotation
+This field contains the cardinality of the worm.
+@end quotation
+@item @code{effective_size}
+@quotation
+@cindex effective size (worm)
+This is the number of stones in a worm plus the number
+of empty intersections that are at least as close to this worm as to any
+other worm. Intersections that are shared are counted with equal
+fractional values for each worm. This measures the direct territorial
+value of capturing a worm. @dfn{effective_size} is a floating point number.
+Only intersections at a distance of 4 or less are counted.
+@end quotation
+@item @code{origin}
+@quotation
+@cindex origin (worm)
+Each worm has a distinguished member, called its @dfn{origin}.
+The purpose of this field is to make it easy to determine when two vertices
+lie in the same worm: we compare their origin. Also if we wish to perform some
+test once for each worm, we simply perform it at the origin and ignore the
+other vertices. The origin is characterized by the test:
+@example
+worm[pos].origin == pos.
+@end example
+@end quotation
+@item @code{liberties}
+@item @code{liberties2}
+@item @code{liberties3}
+@item @code{liberties4}
+@quotation
+@cindex liberties (worm)
+@cindex liberties, higher order (worm)
+For a nonempty worm the field liberties is the number of liberties of the
+string. This is supplemented by @code{LIBERTIES2}, @code{LIBERTIES3} and
+@code{LIBERTIES4}, which are the number of second order, third order, and
+fourth order liberties, respectively.
+The definition of liberties of order >1 is adapted to the
+problem of detecting the shape of the surrounding
+empty space. In particular we want to be able to see if a group
+is loosely surrounded. A @dfn{liberty of order n} is an empty
+vertex which may be connected to the string by placing n
+stones of the same color on the board, but no fewer. The
+path of connection may pass through an intervening group
+of the same color. The stones placed at distance >1 may
+not touch a group of the opposite color. Connections through
+ko are not permitted. Thus in the following configuration:
+@example
+
+          .XX...    We label the     .XX.4.
+          XO....    liberties of     XO1234
+          XO....    order < 5 of     XO1234
+          ......    the O group:     .12.4.
+          .X.X..                     .X.X..
+
+@end example
+
+The convention that liberties of order >1 may not touch a
+group of the opposite color means that knight's moves and
+one space jumps are perceived as impenetrable barriers.
+This is useful in determining when the string is becoming
+surrounded.
+
+The path may also not pass through a liberty at distance
+1 if that liberty is flanked by two stones of the opposing color. This
+reflects the fact that the O stone is blocked from expansion to the
+left by the two X stones in the following situation:
+@example
+
+          X.
+          .O
+          X.
+
+@end example
+@cindex distance from liberty to dragon
+We say that n is the @dfn{distance} of the liberty of order n from the dragon.
+@end quotation
+@item @code{lunch}
+@quotation
+@cindex lunch (worm)
+If nonzero, @code{lunch} points to a boundary worm which can be easily
+captured.  (It does not matter whether or not the string can be
+defended.)
+@end quotation
+@end itemize
+
+We have two distinct notions of cutting stone, which we keep track
+of in the separate fields @code{worm.cutstone} and @code{worm.cutstone2}.
+We use currently use both concepts in parallel.
+
+@itemize
+@item @code{cutstone} 
+@quotation
+@cindex cutting stone
+This field is equal to 2 for cutting stones, 1 for potential cutting
+stones. Otherwise it is zero.  Definitions for this field: a @dfn{cutting
+stone} is one adjacent to two enemy strings, which do not have a liberty in
+common. The most common type of cutting string is in this situation:
+
+@example
+
+          XO
+          OX
+
+@end example
+@cindex cutting stone, potential
+@cindex potential cutting stone
+
+A @dfn{potential cutting stone} is adjacent to two enemy strings which do
+share a liberty. For example, X in:
+
+@example
+
+          XO
+          O.
+
+@end example
+
+For cutting strings we set @code{worm[].cutstone=2}. For
+potential cutting strings we set @code{worm[].cutstone=1}.
+@end quotation
+@item @code{cutstone2} 
+@quotation
+Cutting points are identified by the patterns in the connections
+database. Proper cuts are handled by the fact that attacking and
+defending moves also count as moves cutting or connecting the
+surrounding dragons.  The @code{cutstone2} field is set during 
+@code{find_cuts()}, called from @code{make_domains()}.
+@end quotation
+@findex find_cuts
+@findex make_domains
+@item @code{genus} 
+@quotation
+@cindex genus (worm)
+There are two separate notions of @dfn{genus} for worms and
+dragons. The dragon notion is more important, so
+@code{dragon[pos].genus} is a far more useful field than
+@code{worm[pos].genus}. Both fields are intended as approximations
+to the number of eyes. The @dfn{genus} of a string is the number
+of connected components of its complement, minus one. It is
+an approximation to the number of eyes of the string.
+@end quotation
+@item @code{inessential} 
+@quotation
+@cindex inessential string
+An @dfn{inessential} string is one which meets a
+criterion designed to guarantee that it has no life
+potential unless a particular surrounding string of the
+opposite color can be killed. More precisely an
+@dfn{inessential string} is a string S of genus zero,
+not adjacent to any opponent string which can be easily
+captured, and which has no edge liberties or second
+order liberties, and which satisfies the following
+further property: If the string is removed from the
+board, then the remaining cavity only borders worms of the
+opposite color.
+
+@end quotation
+@findex unconditional_life
+@item @code{invincible} 
+@quotation
+@cindex invincible worm
+An @dfn{invincible} worm is one which GNU Go thinks
+cannot be captured. Invincible worms are computed by the
+function @code{unconditional_life()} which tries to
+find those worms of the given color that can never be captured,
+even if the opponent is allowed an arbitrary number of consecutive
+moves.
+@end quotation
+@item unconditional_status
+@quotation
+Unconditional status is also set by the function
+@code{unconditional_life}. This is set @code{ALIVE} for stones which are
+invincible. Stones which can not be turned invincible even if the
+defender is allowed an arbitrary number of consecutive moves are given
+an unconditional status of @code{DEAD}. Empty points where the opponent
+cannot form an invincible worm are called unconditional territory. The
+unconditional status is set to @code{WHITE_TERRITORY} or
+@code{BLACK_TERRITORY} depending on who owns the territory. Finally, if
+a stone can be captured but is adjacent to unconditional territory of
+its own color, it is also given the unconditional status @code{ALIVE}.
+In all other cases the unconditional status is @code{UNKNOWN}.
+
+To make sense of these definitions it is important to notice that any
+stone which is alive in the ordinary sense (even if only in seki) can be
+transformed into an invincible group by some number of consecutive
+moves. Well, this is not entirely true because there is a rare class of
+seki groups not satisfying this condition. Exactly which these are is
+left as an exercise for the reader. Currently @code{unconditional_life},
+which strictly follows the definitions above, calls such seki groups
+unconditionally dead, which of course is a misfeature. It is possible to
+avoid this problem by making the algorithm slightly more complex, but
+this is left for a later revision.
+@end quotation
+@item @code{int attack_points[MAX_TACTICAL_POINTS]}
+@item @code{attack_codes[MAX_TACTICAL_POINTS]}
+@item @code{int defense_points[MAX_TACTICAL_POINTS];}
+@item @code{int defend_codes[MAX_TACTICAL_POINTS];}
+@quotation
+If the tactical reading code (@pxref{Tactical Reading}) finds that the
+worm can be attacked, @code{attack_points[0]} is a point of attack, and
+@code{attack_codes[0]} is the attack code, @code{WIN}, @code{KO_A} or 
+@code{KO_B}. If multiple attacks are known, @code{attack_points[k]} and
+@code{attack_codes[k]} are used. Similarly with the defense
+codes and defense points.
+@end quotation
+@item @code{int attack_threat_points[MAX_TACTICAL_POINTS];}
+@item @code{int attack_threat_codes[MAX_TACTICAL_POINTS];}
+@item @code{int defense_threat_points[MAX_TACTICAL_POINTS];}
+@item @code{int defense_threat_codes[MAX_TACTICAL_POINTS];}
+@quotation
+These are points that threaten to attack or defend a worm.
+@end quotation
+@end itemize
+
+The function @code{makeworms()} will generate data for all worms.
+
+@node  Amalgamation
+@section Amalgamation
+@cindex amalgamation of worms into dragons
+
+A dragon, we have said, is a group of stones which are treated as a
+unit. It is a working hypothesis that these stones will live or die
+together. Thus the program will not expect to disconnect an opponent's
+strings if they have been amalgamated into a single dragon.
+
+The function @code{make_dragons()} will amalgamate worms into dragons by
+maintaining separate arrays @code{worm[]} and @code{dragon[]} containing
+similar data. Each dragon is a union of worms. Just as the data maintained in
+@code{worm[]} is constant on each worm, the data in
+@code{dragon[]} is constant on each dragon.
+
+Amalgamation of worms in GNU Go proceeds as follows.
+First we amalgamate all boundary components of an eyeshape. Thus in
+the following example:
+
+@example
+
+.OOOO.       The four X strings are amalgamated into a 
+OOXXO.       single dragon because they are the boundary
+OX..XO       components of a blackbordered cave. The
+OX..XO       cave could contain an inessential string
+OOXXO.       with no effect on this amalgamation.
+XXX...       
+
+@end example
+@findex dragon_eye
+
+The code for this type of amalgamation is in the routine
+@code{dragon_eye()}, discussed further in EYES.
+
+Next, we amalgamate strings which seem uncuttable. We amalgamate dragons
+which either share two or more common liberties, or share one liberty
+into the which the opponent cannot play without being
+captured. (ignores ko rule).
+
+@example
+
+   X.    X.X     XXXX.XXX         X.O
+   .X    X.X     X......X         X.X
+                 XXXXXX.X         OXX
+
+@end example
+
+A database of connection patterns may be found in @file{patterns/conn.db}.
+
+@node  Connection
+@section Connection
+@cindex connections
+
+The fields @code{black_eye.cut} and @code{white_eye.cut} are set where the
+opponent can cut, and this is done by the B (break) class patterns in
+@file{conn.db}.  There are two important uses for this field, which can be
+accessed by the autohelper functions @code{xcut()} and @code{ocut()}. The
+first use is to stop amalgamation in positions like
+
+@example
+
+..X..
+OO*OO
+X.O.X
+..O..
+
+@end example
+
+@noindent
+where X can play at * to cut off either branch. What happens
+here is that first connection pattern CB1 finds the double cut
+and marks * as a cutting point. Later the C (connection) class
+patterns in conn.db are searched to find secure connections
+over which to amalgamate dragons.  Normally a diagonal
+connection would be deemed secure and amalgamated by connection
+pattern CC101, but there is a constraint requiring that neither of
+the empty intersections is a cutting point.
+@findex amalgamate_most_valuable_helper
+
+A weakness with this scheme is that X can only cut one connection, not
+both, so we should be allowed to amalgamate over one of the connections.
+This is performed by connection pattern CC401, which with the help of
+@code{amalgamate_most_valuable_helper()} decides which connection to
+prefer. 
+
+The other use is to simplify making alternative connection patterns to
+the solid connection. Positions where the diag_miai helper thinks a
+connection is necessary are marked as cutting points by connection
+pattern 12. Thus we can write a connection pattern like @code{CC6}:
+
+@example
+
+?xxx?     straight extension to connect
+XOO*?
+O...?
+
+:8,C,NULL
+
+?xxx?
+XOOb?
+Oa..?
+
+;xcut(a) && odefend_against(b,a)
+
+@end example
+
+@noindent
+where we verify that a move at @code{*} would stop the enemy from safely
+playing at the cutting point, thus defending against the cut.
+
+@node  Half Eyes
+@section Half Eyes and False Eyes
+@cindex half eye
+@cindex false eye
+
+A @dfn{half eye} is a place where, if the defender plays first, an eye
+will materialize, but where if the attacker plays first, no eye will
+materialize. A @dfn{false eye} is a vertex which is surrounded by a
+dragon yet is not an eye. Here is a half eye:
+
+@example
+@group
+
+XXXXX
+OO..X
+O.O.X
+OOXXX
+
+@end group
+@end example
+
+Here is a false eye:
+
+@example
+@group
+
+XXXXX
+XOO.X
+O.O.X
+OOXXX
+
+@end group
+@end example
+
+The "topological" algorithm for determining half and false eyes
+is described elsewhere (@pxref{Eye Topology}).
+
+The half eye data is collected in the dragon array. Before this is done,
+however, an auxiliary array called half_eye_data is filled with
+information. The field @code{type} is 0, or else @code{HALF_EYE} or 
+@code{FALSE_EYE} depending on which type is found; the fields
+@code{attack_point[]} point to up to 4 points to attack
+the half eye, and similarly @code{defense_point[]} gives points
+to defend the half eye.
+
+@example
+@group
+
+struct half_eye_data half_eye[MAX_BOARD];
+
+struct half_eye_data @{
+  float value;          /* Topological eye value */
+  int type;             /* HALF_EYE or FALSE_EYE */
+  int num_attacks;      /* Number of attacking points */
+  int attack_point[4];  /* The moves to attack a topological halfeye */
+  int num_defends;      /* Number of defending points */
+  int defense_point[4]; /* The moves to defend a topological halfeye */
+@};
+
+@end group
+@end example
+
+The array @code{struct half_eye_data half_eye[MAX_BOARD]} 
+contains information about half and false eyes.  If the type is
+@code{HALF_EYE} then up to four moves are recorded which can
+either attack or defend the eye. In rare cases the attack points
+could be different from the defense points.
+
+@node  Dragons
+@section Dragons
+@cindex dragons
+
+The array @code{struct dragon_data dragon[MAX_BOARD]}
+collects information about the dragons. We will give definitions of the
+various fields. Each field has constant value at each vertex of the
+dragon. (Fields will be discussed below.)
+
+@example
+
+struct dragon_data @{
+  int color;    /* its color                               */
+  int id;       /* the index into the dragon2 array        */
+  int origin;   /* the origin of the dragon. Two vertices  */
+                /* are in the same dragon iff they have    */
+                /* same origin.                            */
+  int size;     /* size of the dragon                      */
+  float effective_size; /* stones and surrounding spaces   */
+  int crude_status;     /* (ALIVE, DEAD, UNKNOWN, CRITICAL)*/
+  int status;           /* best trusted status             */
+@};
+
+extern struct dragon_data dragon[BOARDMAX];
+
+@end example
+
+Other fields attached to the dragon are contained in the @code{dragon_data2}
+struct array. (Fields will be discussed below.)
+
+@example
+
+struct dragon_data2 @{
+  int origin;
+  int adjacent[MAX_NEIGHBOR_DRAGONS];
+  int neighbors;
+  int hostile_neighbors;
+  int moyo_size;
+  float moyo_territorial_value;
+  int safety;
+  float weakness;
+  float weakness_pre_owl;
+  int escape_route;
+  struct eyevalue genus;
+  int heye;
+  int lunch;
+  int surround_status;
+  int surround_size;
+  int semeais;
+  int semeai_margin_of_safety;
+  int semeai_defense_point;
+  int semeai_defense_certain;  
+  int semeai_attack_point;
+  int semeai_attack_certain;
+  int owl_threat_status;
+  int owl_status;
+  int owl_attack_point;
+  int owl_attack_code;
+  int owl_attack_certain;
+  int owl_second_attack_point;
+  int owl_defense_point;
+  int owl_defense_code;
+  int owl_defense_certain;
+  int owl_second_defense_point;
+  int owl_attack_kworm;
+  int owl_defense_kworm;
+@};
+
+extern struct dragon_data2 *dragon2;
+
+@end example
+
+The difference between the two arrays is that the @code{dragon} array 
+is indexed by the board, and there is a copy of the dragon data 
+at every stone in the dragon, while there is only one copy of
+the dragon2 data. The dragons are numbered, and the @code{id} field
+of the dragon is a key into the dragon2 array. Two macros DRAGON
+and DRAGON2 are provided for gaining access to the two arrays.
+
+@example
+#define DRAGON2(pos) dragon2[dragon[pos].id]
+#define DRAGON(d) dragon[dragon2[d].origin]
+@end example
+
+Thus if you know the position @code{pos} of a stone in the dragon
+you can access the dragon array directly, for example accessing the
+origin with @code{dragon[pos].origin}. However if you need a field
+from the dragon2 array, you can access it using the DRAGON2 macro,
+for example you can access its neighor dragons by
+
+@example
+for (k = 0; k < DRAGON2(pos).neighbors; k++) @{
+  int d = DRAGON2(pos).adjacent[k];
+  int apos = dragon2[d].origin;
+  do_something(apos);
+@}
+@end example
+
+Similarly if you know the dragon number (which is @code{dragon[pos].id})
+then you can access the @code{dragon2} array directly, or you can
+access the @code{dragon} array using the DRAGON macro.
+
+Here are the definitions of each field in the @code{dragon} arrray.
+
+@itemize @bullet
+@item @code{color} 
+@quotation
+@cindex color (dragon)
+The color of the dragon.
+@end quotation
+@item @code{id}
+@cindex dragon number
+@quotation
+The dragon number, used as a key into the @code{dragon2} array.
+@end quotation
+@item origin
+@cindex dragon origin
+@quotation
+The origin of the dragon is a unique particular vertex
+of the dragon, useful for determining when two vertices belong
+to the same dragon. Before amalgamation the worm origins are
+copied to the dragon origins. Amalgamation of two dragons
+amounts to changing the origin of one.
+@end quotation
+@item size
+@cindex dragon size
+@quotation
+The number of stones in the dragon.
+@end quotation
+@item effective size
+@cindex effective size
+@quotation
+The sum of the effective sizes of the constituent worms.
+Remembering that vertices equidistant between two or more worms are
+counted fractionally in @code{worm.effective_size}, this equals the
+cardinality of the dragon plus the number of empty vertices which are
+nearer this dragon than any other.
+@end quotation
+@item crude_status
+@quotation
+(ALIVE, DEAD, UNKNOWN, CRITICAL). An early measure of the life
+potential of the dragon. It is computed before the owl code is
+run and is superceded by the status as soon as that becomes
+available.
+@end quotation
+@item status
+@cindex dragon status
+@quotation
+The dragon status is the best measure of the dragon's health.
+It is computed after the owl code is run, then revised again
+when the semeai code is run.
+@end quotation
+@end itemize
+
+Here are definitions of the fields in the @code{dragon2} array.
+
+@itemize @bullet
+@item origin
+@quotation
+The origin field is duplicated here.
+@end quotation
+@item adjacent
+@item @code{adjacent[MAX_NEIGHBOR_DRAGONS]}
+@cindex neighbor dragons
+@cindex adjacent dragons
+@findex find_neighbor_dragons
+@quotation
+Dragons of either color near the given one are called @dfn{neighbors}.
+They are computed by the function @code{find_neighbor_dragons()}.
+The @code{dragon2.adjacent} array gives the dragon numbers of
+these dragons.
+@end quotation
+@item @code{neighbors}
+@cindex neighbor dragons
+@cindex adjacent dragons
+@findex find_neighbor_dragons
+@quotation
+Dragons of either color near the given one are called @dfn{neighbors}.
+They are computed by the function @code{find_neighbor_dragons()}.
+The @code{dragon2.adjacent} array gives the dragon numbers of
+these dragons.
+@end quotation
+@item neighbors
+@quotation
+The number of neighbor dragons.
+@end quotation
+@item hostile_neighbors
+@quotation
+The number of neighbor dragons of the opposite color.
+@end quotation
+@item moyo_size
+@item float moyo_territorial_value
+@findex compute_surrounding_moyo_sizes
+@quotation
+The function @code{compute_surrounding_moyo_sizes()} assigns
+a size and a territorial value to the moyo around
+each dragon (@pxref{Territory and Moyo}). This is the 
+moyo size. They are recorded in these fields.
+@end quotation
+@item safety
+@cindex dragon safety
+@quotation
+The dragon safety can take on one of the values
+@itemize @minus
+@item TACTICALLY_DEAD - a dragon consisting of a single worm found dead by the
+reading code (very reliable)
+@item ALIVE - found alive by the owl or semeai code
+@item STRONGLY_ALIVE - alive without much question
+@item INVINCIBLE - definitively alive even after many tenukis
+@item ALIVE_IN_SEKI - determined to be seki by the semeai code
+@item CRITICAL - lives or dies depending on who moves first
+@item DEAD - found to be dead by the owl code
+@item INESSENTIAL - the dragon is unimportant (e.g. nakade stones) and dead
+@end itemize
+@end quotation
+@item weakness
+@item weakness_pre_owl
+@cindex dragon weakness
+@cindex weakness
+@quotation
+A floating point measure of the safety of a dragon. The dragon
+weakness is a number between 0. and 1., higher numbers for
+dragons in greater need of safety. The field @code{weakness_pre_owl}
+is a preliminary computation before the owl code is run.
+@end quotation
+@item escape_route
+@cindex dragon escape_route
+@cindex escape_route
+@findex compute_escape
+@quotation
+A measure of the dragon's potential to escape towards safety,
+in case it cannot make two eyes locally. Documentation
+may be found in @ref{Escape}.
+@end quotation
+@item struct eyevalue genus
+@cindex dragon genus
+@cindex genus
+@quotation
+The approximate number of eyes the dragon can be expected to
+get. Not guaranteed to be accurate. The eyevalue struct, which
+is used throughout the engine, is declared thus:
+@example
+
+struct eyevalue @{
+  unsigned char a; /* # of eyes if attacker plays twice */
+  unsigned char b; /* # of eyes if attacker plays first */
+  unsigned char c; /* # of eyes if defender plays first */
+  unsigned char d; /* # of eyes if defender plays twice */
+@};
+
+@end example
+@end quotation
+@item heye
+@quotation
+Location of a half eye attached to the dragon.
+@end quotation
+@item lunch
+@cindex dragon lunch
+@cindex lunch
+@quotation
+If nonzero, this is the location of a boundary string which
+can be captured. In contrast with worm lunches, a dragon
+lunch must be able to defend itself.
+@end quotation
+@item surround_status
+@item surround_size
+@cindex surround_status
+@cindex surround_size
+@cindex surround
+@quotation
+In estimating the safety of a dragon it is useful to know if
+it is @dfn{surrounded}. See @ref{Surrounded Dragons} and
+the comments in @file{surround.c} for more information about the
+algorithm.  Used in computing the escape_route, and also callable
+from patterns (currently used by CB258).  
+@end quotation
+@item semeais
+@item semeai_defense_point
+@item semeai_defense_certain
+@item semeai_attack_point
+@item semeai_attack_certain
+@cindex semeai
+@cindex semeai_defense_point
+@cindex semeai_defense_certain
+@cindex semeai_attack_point
+@cindex semeai_attack_certain
+@quotation
+If two dragons of opposite color both have the status CRITICAL
+or DEAD they are in a @dfn{semeai} (capturing race), and their
+status must be adjudicated by the function
+@code{owl_analyze_semeai()} in @file{owl.c}, which attempts to
+determine which is alive, which dead, or if the result is
+seki, and whether it is important who moves first. The
+function @file{new_semeai()} in @file{semeai.c} attempts
+to revise the statuses and to generate move reasons based
+on these results. The field @code{dragon2.semeais} is nonzero
+if the dragon is an element of a semeai, and equals the
+number of semeais (seldom more than one). The semeai defense
+and attack points are locations the defender or attacker
+must move to win the semeai. The field @code{semeai_margin_of_safety}
+is intended to indicate whether the semeai is close or not
+but currently this field is not maintained. The fields
+@code{semeai_defense_certain} and @code{semeai_attack_certain}
+indicate that the semeai code was able to finish analysis
+without running out of nodes.
+@end quotation
+@item owl_status
+@quotation
+This is a classification similar to @code{dragon.crude_status}, but
+based on the life and death reading in @file{owl.c}.
+The owl code (@pxref{The Owl Code}) is skipped for dragons
+which appear safe by certain heuristics. If the owl code
+is not run, the owl status is @code{UNCHECKED}.
+If @code{owl_attack()} determines that the dragon cannot be
+attacked, it is classified as @code{ALIVE}. Otherwise,
+@code{owl_defend()} is run, and if it can be defended it
+is classified as @code{CRITICAL}, and if not, as @code{DEAD}.
+@end quotation
+@item owl_attack_point
+@cindex owl_attack_point
+@quotation
+If the dragon can be attacked this is the point to attack the dragon.
+@end quotation
+@item owl_attack_code
+@cindex owl_attack_code
+@quotation
+The owl attack code, It can be WIN, KO_A, KO_B or 0 (@pxref{Return Codes}).
+@end quotation
+@item owl_attack_certain
+@cindex owl_attack_certain
+@quotation
+The owl reading is able to finish analyzing the attack
+without running out of nodes.
+@end quotation
+@item owl_second_attack_point
+@cindex owl_second_attack_point
+@quotation
+A second attack point.
+@end quotation
+@item owl_defense_point
+@cindex owl_defense_point
+@quotation
+If the dragon can be defended, this is the place to play.
+@end quotation
+@item owl_defense_code
+@cindex owl_defense_code
+@quotation
+The owl defense code, It can be WIN, KO_A, KO_B or 0 (@pxref{Return Codes}).
+@end quotation
+@item owl_defense_certain
+@cindex owl_defense_certain
+@quotation
+The owl code is able to finish analyzing the defense without
+running out of nodes.
+@end quotation
+@item owl_second_defense_point
+@cindex owl_second_defense_point
+@quotation
+A second owl defense point.
+@end quotation
+@end itemize
+
+@node Dragons in Color
+@section Colored Dragon Display
+@cindex colored display
+
+You can get a colored ASCII display of the board in which each dragon
+is assigned a different letter; and the different values of
+@code{dragon.status} values (@code{ALIVE}, @code{DEAD}, @code{UNKNOWN},
+@code{CRITICAL}) have different colors. This is very handy for debugging.
+A second diagram shows the values of @code{owl.status}. If this
+is @code{UNCHECKED} the dragon is displayed in White.
+
+Save a game in sgf format using CGoban, or using the @option{-o} option with
+GNU Go itself.
+
+Open an @command{xterm} or @command{rxvt} window. You may also use the Linux
+console.  Using the console, you may need to use ``SHIFT-PAGE UP'' to see the
+first diagram. Xterm will only work if it is compiled with color support---if
+you do not see the colors try @command{rxvt}. Make the background color black
+and the foreground color white.
+
+Execute:
+
+@command{gnugo -l [filename] -L [movenum] -T} to get the colored display.
+
+The color scheme: Green = @code{ALIVE}; Yellow = @code{UNKNOWN}; 
+Cyan = @code{DEAD} and Red = @code{CRITICAL}. Worms which have been
+amalgamated into the same dragon are labelled with the same letter.
+
+Other useful colored displays may be obtained by using instead:
+
+@itemize @bullet
+@item the option -E to display eye spaces (@pxref{Eyes}).
+@item the option -m 0x0180 to display territory, moyo and area 
+(@pxref{Territory and Moyo}).
+@end itemize
+
+The colored displays are documented elsewhere (@pxref{Colored Display}).
+
diff --git a/doc/eyes.texi b/doc/eyes.texi
new file mode 100644 (file)
index 0000000..6b6a9ee
--- /dev/null
@@ -0,0 +1,1140 @@
+The purpose of this Chapter is to describe the algorithm used in
+GNU Go to determine eyes.
+
+@menu
+* Local Games::                 Local games
+* Eye Space::                   Eye space
+* Eye Space as Local Game::     Eye space as local game
+* Eye Example::                 An example
+* Graphs::                      Underlying graphs
+* Eye Shape::                   Pattern matching
+* Eye Local Game Values::       Pattern matching
+* Eye Topology::                False eyes and half eyes
+* Eye Topology with Ko::        False eyes and half eyes with ko
+* False Margins::               False margins
+* Eye Functions::               Functions in @file{optics.c}
+@end menu
+
+@node Local Games
+@section Local games
+
+The fundamental paradigm of combinatorial game theory is that games
+can be added and in fact form a group. If @samp{G} and @samp{H} are
+games, then @samp{G+H} is a game in which each player on his turn
+has the option of playing in either move. We say that the game
+@samp{G+H} is the sum of the local games @samp{G} and @samp{H}.
+
+Each connected eyespace of a dragon affords a local game which yields
+a local game tree. The score of this local game is the number of eyes
+it yields. Usually if the players take turns and make optimal moves,
+the end scores will differ by 0 or 1. In this case, the local game may
+be represented by a single number, which is an integer or half
+integer. Thus if @samp{n(O)} is the score if @samp{O} moves first,
+both players alternate (no passes) and make alternate moves, and
+similarly @samp{n(X)}, the game can be represented by
+@samp{@{n(O)|n(X)@}}. Thus @{1|1@} is an eye, @{2|1@} is an eye plus a
+half eye, etc.
+
+The exceptional game @{2|0@} can occur, though rarely. We call
+an eyespace yielding this local game a CHIMERA.  The dragon
+is alive if any of the local games ends up with a score of 2
+or more, so @{2|1@} is not different from @{3|1@}. Thus @{3|1@} is
+NOT a chimera. 
+
+Here is an example of a chimera:
+
+@example
+@group
+XXXXX
+XOOOX
+XO.OOX
+XX..OX
+XXOOXX
+XXXXX
+@end group
+@end example
+
+@node Eye Space
+@section Eye spaces
+
+In order that each eyespace be assignable to a dragon,
+it is necessary that all the dragons surrounding it
+be amalgamated (@pxref{Amalgamation}). This is the
+function of @code{dragon_eye()}.
+
+An EYE SPACE for a black dragon is a collection of vertices
+adjacent to a dragon which may not yet be completely closed off,
+but which can potentially become eyespace. If an open eye space is
+sufficiently large, it will yield two eyes. Vertices at the edge
+of the eye space (adjacent to empty vertices outside the eye space)
+are called MARGINAL.
+
+Here is an example from a game:
+
+@example
+@group
+
+ |. X . X X . . X O X O 
+ |X . . . . . X X O O O
+ |O X X X X . . X O O O
+ |O O O O X . O X O O O
+ |. . . . O O O O X X O
+ |X O . X X X . . X O O
+ |X O O O O O O O X X O
+ |. X X O . O X O . . X
+ |X . . X . X X X X X X
+ |O X X O X . X O O X O
+
+@end group
+@end example
+
+Here the @samp{O} dragon which is surrounded in the center has open
+eye space. In the middle of this open eye space are three
+dead @samp{X} stones. This space is large enough that O cannot be
+killed. We can abstract the properties of this eye shape as follows.
+Marking certain vertices as follows:
+
+@example
+@group
+
+ |- X - X X - - X O X O 
+ |X - - - - - X X O O O
+ |O X X X X - - X O O O
+ |O O O O X - O X O O O
+ |! . . . O O O O X X O
+ |X O . X X X . ! X O O
+ |X O O O O O O O X X O
+ |- X X O - O X O - - X
+ |X - - X - X X X X X X
+ |O X X O X - X O O X O
+
+@end group
+@end example
+
+@noindent
+the shape in question has the form:
+
+@example
+@group
+
+!...
+  .XXX.!
+
+@end group
+@end example
+
+The marginal vertices are marked with an exclamation point (@samp{!}).
+The captured @samp{X} stones inside the eyespace are naturally marked @samp{X}.
+
+The precise algorithm by which the eye spaces are determined is
+somewhat complex. Documentation of this algorithm is in the
+comments in the source to the function @code{make_domains()} in
+@file{optics.c}.
+
+The eyespaces can be conveniently displayed using a colored 
+ascii diagram by running @command{gnugo -E}.
+
+@node Eye Space as Local Game
+@section The eyespace as local game
+
+In the abstraction, an eyespace consists of a set of vertices
+labelled:
+
+@example
+
+!  .  X
+
+@end example
+
+Tables of many eyespaces are found in the database
+@file{patterns/eyes.db}. Each of these may be thought of as a local
+game. The result of this game is listed after the eyespace in the form
+@code{:max,min}, where @code{max} is the number of eyes the pattern
+yields if @samp{O} moves first, while @code{min} is the number of eyes
+the pattern yields if @samp{X} moves first. The player who owns the eye
+space is denoted @samp{O} throughout this discussion. Since three eyes
+are no better than two, there is no attempt to decide whether the space
+yields two eyes or three, so max never exceeds 2. Patterns with min>1
+are omitted from the table.
+
+For example, we have:
+
+@example
+@group
+Pattern 548
+
+ x
+xX.!
+
+:0111
+
+@end group
+@end example
+
+Here notation is as above, except that @samp{x} means @samp{X} or 
+@code{EMPTY}.  The result of the pattern is not different if @samp{X} has
+stones at these vertices or not.
+
+We may abstract the local game as follows. The two players @samp{O}
+and @samp{X} take turns moving, or either may pass.
+
+RULE 1: @samp{O} for his move may remove any vertex marked @samp{!}
+or marked @samp{.}.
+
+RULE 2: @samp{X} for his move may replace a @samp{.} by an @samp{X}. 
+
+RULE 3: @samp{X} may remove a @samp{!}. In this case, each @samp{.}
+adjacent to the @samp{!} which is removed becomes a @samp{!} . If an
+@samp{X} adjoins the @samp{!} which is removed, then that @samp{X}
+and any which are connected to it are also removed. Any @samp{.} which
+are adjacent to the removed @samp{X}'s then become @samp{.}.
+
+Thus if @samp{O} moves first he can transform the eyeshape in
+the above example to:
+
+@example
+@group
+ ...            or      !...
+  .XXX.!                  .XXX.
+@end group
+@end example
+
+However if @samp{X} moves he may remove the @samp{!} and the @samp{.}s
+adjacent to the @samp{!} become @samp{!} themselves. Thus if @samp{X}
+moves first he may transform the eyeshape to:
+
+@example
+@group
+ !..           or    !..
+  .XXX.!              .XXX!
+@end group
+@end example
+
+NOTE: A nuance which is that after the @samp{X:1}, @samp{O:2}
+exchange below, @samp{O} is threatening to capture three X stones,
+hence has a half eye to the left of 2.  This is subtle, and there are
+other such subtleties which our abstraction will not capture. Some of
+these at least can be dealt with by a refinements of the scheme, but
+we will content ourselves for the time being with a simplified model.
+
+@example
+@group
+
+ |- X - X X - - X O X O 
+ |X - - - - - X X O O O
+ |O X X X X - - X O O O
+ |O O O O X - O X O O O
+ |1 2 . . O O O O X X O
+ |X O . X X X . 3 X O O
+ |X O O O O O O O X X O
+ |- X X O - O X O - - X
+ |X - - X - X X X X X X
+ |O X X O X - X O O X O
+
+@end group
+@end example
+
+We will not attempt to characterize the terminal states
+of the local game (some of which could be seki) or
+the scoring. 
+
+@node Eye Example
+@section An example
+
+Here is a local game which yields exactly one
+eye, no matter who moves first:
+
+@example
+@group
+
+!
+...
+...!
+
+@end group
+@end example
+
+Here are some variations, assuming @samp{O} moves first.
+
+@example
+@group
+!        (start position)
+...
+...!
+@end group
+
+
+@group
+...      (after @samp{O}'s move)
+...!
+@end group
+
+
+@group
+... 
+..!
+@end group
+
+
+@group
+... 
+..
+@end group
+
+
+@group
+.X.       (nakade)
+..
+@end group
+@end example
+
+Here is another variation:
+
+@example
+
+@group
+!         (start)
+...
+...!
+@end group
+
+
+@group
+!         (after @samp{O}'s move)
+. .
+...!
+@end group
+
+
+@group
+!         (after @samp{X}'s move)
+. .
+..X!
+@end group
+
+
+@group
+. .
+..X!
+@end group
+
+
+@group
+. !
+.!
+@end group
+@end example
+
+
+@node Graphs
+@section Graphs
+
+It is a useful observation that the local game associated
+with an eyespace depends only on the underlying graph, which
+as a set consists of the set of vertices, in which two elements
+are connected by an edge if and only if they are adjacent on
+the Go board. For example the two eye shapes:
+
+@example
+
+..
+ ..
+
+and
+
+....
+
+@end example
+
+@noindent
+though distinct in shape have isomorphic graphs, and consequently
+they are isomorphic as local games. This reduces the number of
+eyeshapes in the database @file{patterns/eyes.db}.
+
+A further simplification is obtained through our treatment of
+half eyes and false eyes. Such patterns are identified by the
+topological analysis (@pxref{Eye Topology}).
+
+A half eye is isomorphic to the pattern @code{(!.)} . To see this,
+consider the following two eye shapes:
+
+@example
+@group 
+XOOOOOO
+X.....O
+XOOOOOO
+
+@end group
+and:
+@group
+
+XXOOOOO
+XOa...O
+XbOOOOO
+XXXXXXX
+
+@end group
+@end example
+
+These are equivalent eyeshapes, with isomorphic local games @{2|1@}.
+The first has shape:
+
+@example
+
+!....
+
+@end example
+
+The second eyeshape has a half eye at @samp{a} which is taken when @samp{O} 
+or @samp{X} plays at @samp{b}. This is found by the topological
+criterion (@pxref{Eye Topology}).
+
+The graph of the eye_shape, ostensibly @samp{....} is modified by replacing
+the left @samp{.} by @samp{!.} during graph matching.
+
+
+A false eye is isomorphic to the pattern @code{(!)} . To see this,
+consider the following eye shape:
+
+@example
+
+XXXOOOOOO
+X.Oa....O
+XXXOOOOOO
+
+@end example
+
+This is equivalent to the two previous eyeshapes, with an isomorphic
+local game @{2|1@}.
+
+This eyeshape has a false eye at @samp{a}. This is also found by the
+topological criterion.
+
+The graph of the eye_shape, ostensibly @samp{.....} is modified by replacing
+the left @samp{.} by @samp{!}. This is made directly in the eye data,
+not only during graph matching.
+
+@node Eye Shape
+@section Eye shape analysis
+
+The patterns in @file{patterns/eyes.db} are compiled into graphs
+represented essentially by arrays in @file{patterns/eyes.c}.
+
+Each actual eye space as it occurs on the board is also
+compiled into a graph. Half eyes are handled as follows.
+Referring to the example 
+
+@example
+@group
+XXOOOOO
+XOa...O
+XbOOOOO
+XXXXXX
+@end group
+@end example
+
+@noindent
+repeated from the preceding discussion, the vertex at @samp{b} is
+added to the eyespace as a marginal vertex. The adjacency
+condition in the graph is a macro (in @file{optics.c}): two
+vertices are adjacent if they are physically adjacent, 
+or if one is a half eye and the other is its key point.
+
+In @code{recognize_eyes()}, each such graph arising from an actual eyespace is
+matched against the graphs in @file{eyes.c}.  If a match is found, the
+result of the local game is known. If a graph cannot be matched, its
+local game is assumed to be @{2|2@}.
+
+@node Eye Local Game Values
+@section Eye Local Game Values
+
+The game values in @file{eyes.db} are given in a simplified scheme which is
+flexible enough to represent most possibilities in a useful way.
+
+The colon line below the pattern gives the eye value of the matched
+eye shape. This consists of four digits, each of which is the number
+of eyes obtained during the following conditions:
+
+@enumerate
+@item The attacker moves first and is allowed yet another move because
+the defender plays tenuki.
+@item The attacker moves first and the defender responds locally.
+@item The defender moves first and the attacker responds locally.
+@item The defender moves first and is allowed yet another move because
+the attacker plays tenuki.
+@end enumerate
+
+The first case does @strong{not} necessarily mean that the attacker is
+allowed two consecutive moves. This is explained with an example
+later.
+
+Also, since two eyes suffice to live, all higher numbers also count
+as two.
+
+The following 15 cases are of interest:
+
+@itemize @bullet
+@item 0000 0 eyes.
+@item 0001 0 eyes, but the defender can threaten to make one eye.
+@item 0002 0 eyes, but the defender can threaten to make two eyes.
+@item 0011 1/2 eye, 1 eye if defender moves first, 0 eyes if attacker does.
+@item 0012 3/4 eyes, 3/2 eyes if defender moves first, 0 eyes if attacker does.
+@item 0022 1* eye, 2 eyes if defender moves first, 0 eyes if attacker does.
+@item 0111 1 eye, attacker can threaten to destroy the eye.
+@item 0112 1 eye, attacker can threaten to destroy the eye, defender can threaten to make another eye.
+@item 0122 5/4 eyes, 2 eyes if defender moves first, 1/2 eye if attacker does.
+@item 0222 2 eyes, attacker can threaten to destroy both.
+@item 1111 1 eye.
+@item 1112 1 eye, defender can threaten to make another eye.
+@item 1122 3/2 eyes, 2 eyes if defender moves first, 1 eye if attacker does.
+@item 1222 2 eyes, attacker can threaten to destroy one eye.
+@item 2222 2 eyes.
+@end itemize
+
+The 3/4, 5/4, and 1* eye values are the same as in Howard Landman's paper
+Eyespace Values in Go. Attack and defense points are only marked in
+the patterns when they have definite effects on the eye value,
+i.e. pure threats are not marked.
+
+Examples of all different cases can be found among the patterns in
+this file. Some of them might be slightly counterintuitive, so we
+explain one important case here. Consider
+
+@example
+@group
+Pattern 6141
+
+ X
+XX.@@x
+
+:1122
+@end group
+@end example
+
+which e.g. matches in this position:
+
+@example
+@group
+.OOOXXX
+OOXOXOO
+OXXba.O
+OOOOOOO
+@end group
+@end example
+
+Now it may look like @samp{X} could take away both eyes by playing @samp{a}
+followed by @samp{b}, giving 0122 as eye value. This is where the subtlety
+of the definition of the first digit in the eye value comes into
+play. It does not say that the attacker is allowed two consecutive
+moves but only that he is allowed to play "another move". The
+crucial property of this shape is that when @samp{X} plays at a to destroy
+(at least) one eye, @samp{O} can answer at @samp{b}, giving:
+
+@example
+@group
+
+.OOOXXX
+OO.OXOO
+O.cOX.O
+OOOOOOO
+
+@end group
+@end example
+
+Now @samp{X} has to continue at @samp{c} in order to keep @samp{O}
+at one eye. After this @samp{O} plays tenuki and @samp{X} cannot
+destroy the remaining eye by another move. Thus the eye value is
+indeed 1122.
+
+As a final note, some of the eye values indicating a threat depend
+on suicide to be allowed, e.g.
+
+@example
+@group
+
+Pattern 301
+X.X
+
+:1222
+
+@end group
+@end example
+
+We always assume suicide to be allowed in this database. It is easy
+enough to sort out such moves at a higher level when suicide is
+disallowed.
+
+@node Eye Topology
+@section Topology of Half Eyes and False Eyes
+
+A HALF EYE is a pattern where an eye may or may not materialize,
+depending on who moves first. Here is a half eye for @code{O}:
+
+@example
+@group
+
+   OOXX
+   O.O.
+   OO.X
+
+@end group
+@end example
+
+A FALSE EYE is an eye vertex which cannot become a proper eye. Here are
+two examples of false eyes for @code{O}:
+
+@example
+@group
+
+   OOX         OOX
+   O.O         O.OO
+   XOO         OOX
+
+@end group
+@end example
+
+We describe now the topological algorithm used to find half eyes
+and false eyes. In this section we ignore the possibility of ko.
+
+False eyes and half eyes can locally be characterized by the status of
+the diagonal intersections from an eye space. For each diagonal
+intersection, which is not within the eye space, there are three
+distinct possibilities:
+
+@itemize @bullet
+@item occupied by an enemy (@code{X}) stone, which cannot be captured.
+@item either empty and @code{X} can safely play there, or occupied
+   by an @code{X} stone that can both be attacked and defended.
+@item occupied by an @code{O} stone, an @code{X} stone that can be attacked
+   but not defended, or it's empty and @code{X} cannot safely play there.
+@end itemize
+
+We give the first possibility a value of two, the second a value of
+one, and the last a value of zero. Summing the values for the diagonal
+intersections, we have the following criteria:
+
+@itemize @bullet
+@item sum >= 4: false eye
+@item sum == 3: half eye
+@item sum <= 2: proper eye
+@end itemize
+
+If the eye space is on the edge, the numbers above should be decreased
+by 2. An alternative approach is to award diagonal points which are
+outside the board a value of 1. To obtain an exact equivalence we must
+however give value 0 to the points diagonally off the corners, i.e.
+the points with both coordinates out of bounds.
+
+The algorithm to find all topologically false eyes and half eyes is:
+
+For all eye space points with at most one neighbor in the eye space,
+evaluate the status of the diagonal intersections according to the
+criteria above and classify the point from the sum of the values.
+
+@node  Eye Topology with Ko
+@section Eye Topology with Ko
+
+
+This section extends the topological eye analysis to handle ko. We
+distinguish between a ko in favor of @samp{O} and one in favor of @samp{X}:
+
+@example
+@group
+.?O?   good for O
+OO.O
+O.O?
+XOX.
+.X..
+
+@end group
+@group
+.?O?   good for X
+OO.O
+OXO?
+X.X.
+.X..
+@end group
+@end example
+
+Preliminarily we give the former the symbolic diagonal value @code{a}
+and the latter the diagonal value @code{b}. We should clearly have
+@code{0 < a < 1 < b < 2}. Letting @code{e} be the topological eye value
+(still the sum of the four diagonal values), we want to have the
+following properties:
+
+@example
+e <= 2     - proper eye
+2 < e < 3  - worse than proper eye, better than half eye
+e = 3      - half eye
+3 < e < 4  - worse than half eye, better than false eye
+e >= 4     - false eye
+@end example
+
+In order to determine the appropriate values of @code{a} and @code{b} we
+analyze the typical cases of ko contingent topological eyes:
+
+@example
+@group
+      .X..      (slightly) better than proper eye
+(a)   ..OO          e < 2
+      OO.O
+      O.OO      e = 1 + a
+      XOX.
+      .X..
+
+@end group
+
+@group      
+      .X..      better than half eye, worse than proper eye
+(a')  ..OO      2 < e < 3
+      OO.O
+      OXOO      e = 1 + b
+      X.X.
+      .X..
+
+@end group
+      
+@group
+      .X..      better than half eye, worse than proper eye
+(b)   .XOO      2 < e < 3
+      OO.O
+      O.OO      e = 2 + a
+      XOX.
+      .X..
+
+@end group
+      
+@group
+      .X..      better than false eye, worse than half eye
+(b')  .XOO      3 < e < 4
+      OO.O
+      OXOO      e = 2 + b
+      X.X.
+      .X..
+
+@end group
+      
+@group
+      .X..
+      XOX.      (slightly) better than proper eye
+(c)   O.OO          e < 2
+      OO.O
+      O.OO      e = 2a
+      XOX.
+      .X..
+
+@end group
+      
+@group
+      .X..
+      XOX.      proper eye, some aji
+(c')  O.OO      e ~ 2
+      OO.O
+      OXOO      e = a + b
+      X.X.
+      .X..
+
+@end group
+      
+@group
+      .X..
+      X.X.      better than half eye, worse than proper eye
+(c'') OXOO      2 < e < 3
+      OO.O
+      OXOO      e = 2b
+      X.X.
+      .X..
+
+@end group
+      
+@group
+      .X...
+      XOX..     better than half eye, worse than proper eye
+(d)   O.O.X     2 < e < 3
+      OO.O.
+      O.OO.     e = 1 + 2a
+      XOX..
+      .X...
+
+@end group
+      
+@group
+      .X...
+      XOX..     half eye, some aji
+(d')  O.O.X     e ~ 3
+      OO.O.
+      OXOO.     e = 1 + a + b
+      X.X..
+      .X...
+
+@end group
+      
+@group
+      .X...
+      X.X..     better than false eye, worse than half eye
+(d'') OXO.X     3 < e < 4
+      OO.O.
+      OXOO.     e = 1 + 2b
+      X.X..
+      .X...
+
+@end group
+      
+@group
+      .X...
+      XOX..     better than false eye, worse than half eye
+(e)   O.OXX     3 < e < 4
+      OO.O.
+      O.OO.     e =  2 + 2a
+      XOX..
+      .X...
+
+@end group
+      
+@group
+      .X...
+      XOX..     false eye, some aji
+(e')  O.OXX     e ~ 4
+      OO.O.
+      OXOO.     e = 2 + a + b
+      X.X..
+      .X...
+
+@end group
+      
+@group
+      .X...
+      X.X..     (slightly) worse than false eye
+(e'') OXOXX     4 < e
+      OO.O.
+      OXOO.     e = 2 + 2b
+      X.X..
+      .X...
+
+@end group
+@end example      
+
+It may seem obvious that we should use
+@example
+(i)   a=1/2, b=3/2
+@end example
+but this turns out to have some drawbacks. These can be solved by
+using either of
+@example
+(ii)  a=2/3, b=4/3
+(iii) a=3/4, b=5/4
+(iv)  a=4/5, b=6/5
+
+@end example
+
+Summarizing the analysis above we have the following table for the
+four different choices of @code{a} and @code{b}.
+
+@example
+case    symbolic        a=1/2   a=2/3   a=3/4   a=4/5   desired
+        value           b=3/2   b=4/3   b=5/4   b=6/5   interval
+(a)     1+a             1.5     1.67    1.75    1.8         e < 2
+(a')    1+b             2.5     2.33    2.25    2.2     2 < e < 3
+(b)     2+a             2.5     2.67    2.75    2.8     2 < e < 3
+(b')    2+b             3.5     3.33    3.25    3.2     3 < e < 4
+(c)     2a              1       1.33    1.5     1.6         e < 2
+(c')    a+b             2       2       2       2           e ~ 2
+(c'')   2b              3       2.67    2.5     2.4     2 < e < 3
+(d)     1+2a            2       2.33    2.5     2.6     2 < e < 3
+(d')    1+a+b           3       3       3       3           e ~ 3
+(d'')   1+2b            4       3.67    3.5     3.4     3 < e < 4
+(e)     2+2a            3       3.33    3.5     3.6     3 < e < 4
+(e')    2+a+b           4       4       4       4           e ~ 4
+(e'')   2+2b            5       4.67    4.5     4.4     4 < e
+
+@end example
+
+We can notice that (i) fails for the cases (c''), (d), (d''), and (e).
+The other three choices get all values in the correct intervals. The
+main distinction between them is the relative ordering of (c'') and (d)
+(or analogously (d'') and (e)). If we do a more detailed analysis of
+these we can see that in both cases @samp{O} can secure the eye
+unconditionally if he moves first while @samp{X} can falsify it with ko
+if he moves first. The difference is that in (c''), @samp{X} has to make
+the first ko threat, while in (d), O has to make the first ko threat.
+Thus (c'') is better for O and ought to have a smaller topological eye
+value than (d). This gives an indication that (iv) is the better choice.
+
+We can notice that any value of @code{a}, @code{b} satisfying
+@code{a+b=2} and @code{3/4<a<1} would have the same qualities as choice
+(iv) according to the analysis above. One interesting choice is
+@code{a=7/8, b=9/8} since these allow exact computations with floating
+point values having a binary mantissa. The latter property is shared by
+@code{a=3/4} and @code{a=1/2}.
+
+When there are three kos around the same eyespace, things become
+more complex. This case is, however, rare enough that we ignore it.
+
+
+@node False Margins
+@section False Margins
+
+The following situation is rare but special enough to warrant separate
+attention:
+
+@example
+@group
+   OOOOXX
+   OXaX..
+   ------
+@end group
+@end example
+
+Here @samp{a} may be characterized by the fact that it is adjacent
+to O's eyespace, and it is also adjacent to an X group which cannot
+be attacked, but that an X move at 'a' results in a string with only
+one liberty. We call this a @dfn{false margin}. 
+
+For the purpose of the eye code, O's eyespace should be parsed
+as @code{(X)}, not @code{(X!)}.
+
+@node Eye Functions
+@section Functions in @file{optics.c}
+
+The public function @code{make_domains()} calls the function
+@code{make_primary_domains()} which is static in @file{optics.c}. It's purpose
+is to compute the domains of influence of each color, used in determining eye
+shapes. @strong{Note}: the term influence as used here is distinct from the
+influence in influence.c.
+
+For this algorithm the strings which are not lively are invisible. Ignoring
+these, the algorithm assigns friendly influence to
+
+@enumerate
+@item every vertex which is occupied by a (lively) friendly stone, 
+@item every empty vertex adjoining a (lively) friendly stone,
+@item every empty vertex for which two adjoining vertices (not
+on the first line) in the (usually 8) surrounding ones have friendly
+influence, with two CAVEATS explained below.
+@end enumerate
+
+Thus in the following diagram, @samp{e} would be assigned friendly influence
+if @samp{a} and @samp{b} have friendly influence, or @samp{a} and @samp{d}. It
+is not sufficent for @samp{b} and @samp{d} to have friendly influence, because
+they are not adjoining.
+
+@example
+       uabc
+        def
+        ghi
+@end example
+
+The constraint that the two adjoining vertices not lie on the first
+line prevents influence from leaking under a stone on the third line.
+
+The first CAVEAT alluded to above is that even if @samp{a} and @samp{b} have
+friendly influence, this does not cause @samp{e} to have friendly influence if
+there is a lively opponent stone at @samp{d}. This constraint prevents
+influence from leaking past knight's move extensions.
+
+The second CAVEAT is that even if @samp{a} and @samp{b} have friendly influence
+this does not cause @samp{e} to have influence if there are lively opponent
+stones at @samp{u} and at @samp{c}. This prevents influence from leaking past
+nikken tobis (two space jumps).  
+
+The corner vertices are handled slightly different.
+
+@example
+   +---
+   |ab
+   |cd
+@end example
+
+We get friendly influence at @samp{a} if we have friendly influence
+at @samp{b} or @samp{c} and no lively unfriendly stone at @samp{b}, @samp{c}
+or @samp{d}.
+
+Here are the public functions in @file{optics.c}, except some simple
+access functions used by autohelpers. The statically declared functions
+are documented in the source code.
+
+@itemize @bullet 
+@item @code{void make_domains(struct eye_data b_eye[BOARDMAX], struct eye_data w_eye[BOARDMAX], int owl_call)}
+@findex make_domains
+@quotation
+This function is called from @code{make_dragons()} and from
+@code{owl_determine_life()}. It marks the black and white domains
+(eyeshape regions) and collects some statistics about each one.
+@end quotation
+@item @code{void partition_eyespaces(struct eye_data eye[BOARDMAX], int color)}
+@findex partition_eyespaces
+@quotation
+Find connected eyespace components and compute relevant statistics.
+@end quotation
+@item @code{void propagate_eye(int origin, struct eye_data eye[BOARDMAX])}
+@findex propagate_eye
+@quotation
+propagate_eye(origin) copies the data at the (origin) to the
+rest of the eye (invariant fields only).
+@end quotation
+@item @code{int find_eye_dragons(int origin, struct eye_data eye[BOARDMAX], int eye_color, int dragons[], int max_dragons)}
+@findex find_eye_dragons
+@quotation
+Find the dragon or dragons surrounding an eye space. Up to
+max_dragons dragons adjacent to the eye space are added to
+the dragon array, and the number of dragons found is returned.
+@end quotation
+@item @code{void compute_eyes(int pos, struct eyevalue *value, int *attack_point, int *defense_point, struct eye_data eye[BOARDMAX], struct half_eye_data heye[BOARDMAX], int add_moves)}
+@findex compute_eyes
+@quotation
+Given an eyespace with origin @code{pos}, this function computes the
+minimum and maximum numbers of eyes the space can yield. If max and
+min are different, then vital points of attack and defense are also
+generated. If @code{add_moves == 1}, this function may add a move_reason for
+@code{color} at a vital point which is found by the function. If 
+@code{add_moves == 0}, set @code{color = EMPTY.}
+@end quotation
+@item @code{void compute_eyes_pessimistic(int pos, struct eyevalue *value, int *pessimistic_min, int *attack_point, int *defense_point, struct eye_data eye[BOARDMAX], struct half_eye_data heye[BOARDMAX])}
+@findex compute_eyes_pessimistic
+@quotation
+This function works like @code{compute_eyes()}, except that it also gives
+a pessimistic view of the chances to make eyes. Since it is intended
+to be used from the owl code, the option to add move reasons has
+been removed.
+@end quotation
+@item @code{void add_false_eye(int pos, struct eye_data eye[BOARDMAX], struct half_eye_data heye[BOARDMAX])}
+@findex add_false_eye
+@quotation
+turns a proper eyespace into a margin. 
+@end quotation
+@item @code{int is_eye_space(int pos)}
+@item @code{int is_proper_eye_space(int pos)}
+@findex is_proper_eye_space
+@findex is_eye_space
+@quotation
+These functions are used from constraints to identify eye spaces,
+primarily for late endgame moves.
+@end quotation
+@item @code{int max_eye_value(int pos)}
+@findex max_eye_value
+@quotation
+Return the maximum number of eyes that can be obtained from the
+eyespace at @code{(i, j)}. This is most useful in order to determine
+whether the eyespace can be assumed to produce any territory at
+all.
+@end quotation
+@item @code{int is_marginal_eye_space(int pos)}
+@item @code{int is_halfeye(struct half_eye_data heye[BOARDMAX], int pos)}
+@item @code{int is_false_eye(struct half_eye_data heye[BOARDMAX], int pos)}
+@findex is_marginal_eye_space
+@findex is_halfeye
+@findex is_false_eye
+@quotation
+These functions simply return information about an eyeshape that
+has already been analyzed. (They do no real work.)
+@end quotation
+@item @code{void find_half_and_false_eyes(int color, struct eye_data eye[BOARDMAX], struct half_eye_data heye[BOARDMAX], int find_mask[BOARDMAX])}
+@findex find_half_and_false_eyes
+@quotation
+Find topological half eyes and false eyes by analyzing the
+diagonal intersections, as described in the Texinfo
+documentation (Eyes/Eye Topology).
+@end quotation
+@item @code{float topological_eye(int pos, int color, struct eye_data my_eye[BOARDMAX],struct half_eye_data heye[BOARDMAX])}
+@findex topological_eye
+@quotation
+See Texinfo documentation (Eyes:Eye Topology). Returns:
+@itemize @bullet
+@item 2 or less if @code{pos} is a proper eye for @code{color};
+@item between 2 and 3 if the eye can be made false only by ko
+@item 3 if @code{pos} is a half eye;
+@item between 3 and 4 if the eye can be made real only by ko
+@item 4 or more if @code{pos} is a false eye.
+@end itemize
+Attack and defense points for control of the diagonals are stored
+in the @code{heye[]} array.
+@code{my_eye} is the eye space information with respect to @code{color}.
+@end quotation
+@item @code{int obvious_false_eye(int pos, int color)}
+@findex obvious_false_eye
+@quotation
+Conservative relative of @code{topological_eye()}. Essentially the same
+algorithm is used, but only tactically safe opponent strings on
+diagonals are considered. This may underestimate the false/half eye
+status, but it should never be overestimated.
+@end quotation
+@item @code{void set_eyevalue(struct eyevalue *e, int a, int b, int c, int d)}
+@findex set_eyevalue
+@quotation set parameters into the @code{struct eyevalue} as follows
+(@pxref{Eye Local Game Values}):
+@example
+struct eyevalue @{ /* number of eyes if: */
+  unsigned char a; /* attacker plays first twice */
+  unsigned char b; /* attacker plays first */
+  unsigned char c; /* defender plays first */
+  unsigned char d; /* defender plays first twice */
+@};
+@end example
+@end quotation
+@item @code{int min_eye_threat(struct eyevalue *e)}
+@findex min_eye_threat
+@quotation
+Number of eyes if attacker plays first twice (the threat of the first
+move by attacker).
+@end quotation
+@item @code{int min_eyes(struct eyevalue *e)}
+@findex min_eyes
+@quotation
+Number of eyes if attacker plays first followed by alternating play. 
+@end quotation
+@item @code{int max_eyes(struct eyevalue *e)}
+@findex max_eyes
+@quotation
+Number of eyes if defender plays first followed by alternating play. 
+@end quotation
+@item @code{int max_eye_threat(struct eyevalue *e)}
+@findex max_eye_threat
+@quotation
+Number of eyes if defender plays first twice (the threat of the first
+move by defender).
+@end quotation
+@item @code{void add_eyevalues(struct eyevalue *e1, struct eyevalue *e2, struct eyevalue *sum)}
+@findex add_eyevalues
+@quotation
+Add the eyevalues @code{*e1} and @code{*e2}, leaving the result in *sum. It is
+safe to let @code{sum} be the same as @code{e1} or @code{e2}.
+@end quotation
+@item @code{char * eyevalue_to_string(struct eyevalue *e)}
+@findex eyevalue_to_string
+@quotation
+Produces a string containing the eyevalue. @strong{Note}: the result string is
+stored in a statically allocated buffer which will be overwritten the next
+time this function is called.
+@end quotation
+@item @code{void test_eyeshape(int eyesize, int *eye_vertices)}
+@findex test_eyeshape
+/* Test whether the optics code evaluates an eyeshape consistently. */
+@item @code{int analyze_eyegraph(const char *coded_eyegraph, struct eyevalue *value, char *analyzed_eyegraph)}
+@findex analyze_eyegraph
+@quotation
+Analyze an eye graph to determine the eye value and vital moves.
+The eye graph is given by a string which is encoded with @samp{%} for
+newlines and @samp{O} for spaces. E.g., the eye graph
+
+@example
+  !
+ .X
+!...
+@end example
+       
+is encoded as @code{OO!%O.X%!...}. (The encoding is needed for the GTP
+interface to this function.) The result is an eye value and a (nonencoded)
+pattern showing the vital moves, using the same notation as eyes.db. In the
+example above we would get the eye value 0112 and the graph (showing ko threat
+moves)
+
+@example
+  @  
+ .X  
+!.*.
+@end example
+
+If the eye graph cannot be realized, 0 is returned, 1 otherwise.
+@end quotation
+@end itemize
diff --git a/doc/gnugo.6 b/doc/gnugo.6
new file mode 100644 (file)
index 0000000..f93aaca
--- /dev/null
@@ -0,0 +1,388 @@
+.\" Automatically generated by Pod::Man version 1.15
+.\" Fri Jan 13 15:56:30 2006
+.\"
+.\" Standard preamble:
+.\" ======================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Ip \" List item
+.br
+.ie \\n(.$>=3 .ne \\$3
+.el .ne 3
+.IP "\\$1" \\$2
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  | will give a
+.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used
+.\" to do unbreakable dashes and therefore won't be available.  \*(C` and
+.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<>
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr
+.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and
+.\" index entries marked with X<> in POD.  Of course, you'll have to process
+.\" the output yourself in some meaningful fashion.
+.if \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.\"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it
+.\" makes way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.bd B 3
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ======================================================================
+.\"
+.IX Title ".::gnugo 6"
+.TH .::gnugo 6 "3.7.7" "2006-01-10" "User Contributed Perl Documentation"
+.UC
+.SH "NAME"
+gnugo \- The \s-1GNU\s0 program to play the game of Go
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fBgnugo\fR
+[\fB\*(--boardsize <num\fR>]
+[\fB\*(--color <color\fR>]
+[\fB\*(--handicap <num\fR>]
+[\fB\*(--komi <num\fR>]
+[\fB\*(--quiet\fR]
+[\fB\-v, \-\-version\fR]
+[\fB\-h, \-\-help\fR]
+[\fB\*(--help debug\fR]
+[\fB\*(--copyright\fR]
+[\fB\*(--mode <mode\fR>]
+[\fB\*(--replay <color\fR>]
+[\fB\-l, \-\-infile <filename\fR>]
+[\fB\-L, \-\-until <move\fR>]
+[\fB\-o, \-\-outfile <filename\fR>]
+[\fB\*(--printsgf <filename\fR>]
+[\fB\-D, \-\-depth <num\fR>]
+[\fB\-B, \-\-backfill_depth <num\fR>]
+[\fB\*(--score [estimate|finish|aftermath]\fR ]
+[\fB\-a, \-\-allpats\fR]
+[\fB\-T, \-\-printboard\fR]
+[\fB\-d, \-\-debug <level\fR>]
+[\fB\-w, \-\-worms\fR]
+[\fB\-m, \-\-moyo <level\fR>]
+[\fB\-b, \-\-benchmark num\fR]
+[\fB\-t, \-\-trace\fR]
+[\fB\-r, \-\-seed num\fR]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\s-1GNU\s0 Go plays a game of Go against the user. It has many other features: it 
+can play against itself or another program, analyse and score a recorded 
+game. \s-1GNU\s0 Go is compliant with Go modem protocol, load and save game in
+the Smart Game format. 
+.PP
+\&\s-1GNU\s0 Go default is a simple alpha-numeric board display, but you can use
+a client such as \fBCGoban\fR.
+.Sh "The game of Go"
+.IX Subsection "The game of Go"
+Go is a game of strategy between two players usually played on a
+19x19 grid called \fBgoban\fR. The two players put black and white \fBstones\fR on
+the goban to enclose \fBterritory\fR. Go was invented about 4000 years ago in
+ancient China. Other names for this game are (Chinese) \fBWei Chi\fR, (Korean)
+\&\fBBaduk\fR and (Ing) \fBGoe\fR.
+.Sh "Playing a game in \s-1ASCII\s0 mode"
+.IX Subsection "Playing a game in ASCII mode"
+To start a game with default options, just invoke \*(L"gnugo\*(R". The board will be
+drawn at your terminal using \s-1ASCII\s0 letters.  In this mode, you can get help on
+available commands by the \fBh\fR key.  To play as Black with 4 stones handicap,
+with a 0.5 komi, recording the game in the file record.sgf:
+.PP
+.Vb 1
+\& gnugo --color black --handicap 4 --komi 0.5 -o record.sgf
+.Ve
+.Sh "Playing a game with CGoban"
+.IX Subsection "Playing a game with CGoban"
+CGoban is a general purpose client program by Bill Shubert for
+playing Go. It runs under X Window System with a beautiful resizeable
+graphic display. To use \s-1GNU\s0 Go under X Window System, obtain the
+most recent version of CGoban from Bill Shubert's web site
+.PP
+http://www.igoweb.org/~wms/comp/cgoban/index.html
+.PP
+Start CGoban. When the CGoban Control panel comes up, select `Go Modem.'
+You will get the Go Modem Protocol Setup. Choose one (or both) of the
+players to be ``Program,'' and fill out the box to the path to
+gnugo. After clicking \s-1OK\s0, you get the Game Setup window. Choose
+``Rules Set'' to be Japanese (otherwise handicaps won't work). Set the
+board size and handicap if you want. Click \s-1OK\s0 and you are ready to go.
+.PP
+In the Go Modem Protocol Setup window, when you specify the path
+to \s-1GNU\s0 Go, you can give it command line options, such as \-\-quiet
+to suppress most messages. Since the Go Modem Protocol preempts
+standard I/O, other messages are sent to stderr, even if they are
+not error messages. These will appear in the terminal from which
+you started CGoban. 
+.Sh "Scoring system"
+.IX Subsection "Scoring system"
+The game stops when both players pass. \s-1GNU\s0 Go will attempt to
+compute and report the score to you. It may occasionally make
+mistakes due to wrong evaluation of the status of a group. You
+can check the score as follows. In \s-1ASCII\s0 mode, at the end of
+the game, stones believed dead are marked in lower case letters,
+and you have the option of toggling their status before counting.
+Using CGoban, you may use CGoban's counting facility to count
+the game using either Japanese or Chinese rules.
+.Sh "Viewing a stored game"
+.IX Subsection "Viewing a stored game"
+gnugo \fB\-l\fR filename.sgf \-\-mode ascii
+.PP
+loads filename.sgf and lets you navigate through the game by using the
+commands \fIforward\fR, \fIback\fR, \fIgoto\fR and \fIlast\fR.
+It is not possible to navigate through variations in ascii mode.
+You may also use CGoban to view stored games. CGoban can navigate
+variations.
+.Sh "Documentation"
+.IX Subsection "Documentation"
+The files in the \fIdoc\fR directory contain detailed documentation about
+debugging options and internal program structure. Other documentation may
+be found in comments throughout the source code.
+.Sh "Go Modem Protocol"
+.IX Subsection "Go Modem Protocol"
+The Go Modem Protocol is a standard interface between Go programs and
+graphical display. 
+.PP
+The Go Modem Protocol was developed by Bruce Wilcox with input from
+David Fotland, Anders Kierulf and others. Any Go program *should*
+use this protocol since it is standard. Since CGoban supports this
+protocol, the user interface for any Go program can be done
+entirely through CGoban. Using the Go Modem Protocol, you can play
+with another computer running a different program (even on a
+different operating system) using a modem, a serial cable or over
+the internet if the other program also supports the protocol. You
+can also communicate with the Go servers using CGoban.
+.Sh "Smart Game Format"
+.IX Subsection "Smart Game Format"
+Games (with comments, variations and other features) can be
+stored in the Smart Game Format (\s-1SGF\s0). This format originated in
+Anders Kierulf's program Smart Go. Martin Muller and Arno
+Hollosi developed the current standard, which may be found
+at 
+.PP
+http://www.red-bean.com/sgf/
+.PP
+\&\s-1GNU\s0 Go supports the Smart Game Format.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+.Sh "Main options"
+.IX Subsection "Main options"
+\&\fB\*(--mode \f(BImode\fB\fR
+.PP
+force the playing mode (\fIascii'\fR, \fIgtp\fR or \fIgmp\fR). Default is 
+\&\s-1ASCII\s0. If no terminal is detected \s-1GMP\s0 (Go Modem Protocol) will be assumed.
+.PP
+\&\fB\*(--replay \f(BIcolor\fB\fR
+.PP
+replay the game generating moves for color, where color is \fIwhite\fR,
+\&\fIblack\fR, or \fIboth\fR. (requires \fB\-l\fR)
+.PP
+\&\fB\*(--quiet\fR
+.PP
+Don't print copyright and other informational messages.
+.PP
+\&\fB\-l, \-\-infile \f(BIfile\fB\fR
+.PP
+Load the \s-1SGF\s0 file (to score or analyze a recorded game).
+.PP
+\&\fB\-L, \-\-until \f(BImove\fB\fR
+.PP
+Stop loading just before \fImove\fR is played (e.g. 154 or L10).
+.PP
+\&\fB\-o, \-\-outfile \f(BIfile\fB\fR
+.PP
+Save the played game to \fIfile\fR in \s-1SGF\s0 format.
+.Sh "Game Options:"
+.IX Subsection "Game Options:"
+\&\fB\*(--boardsize \f(BInum\fB\fR
+.PP
+Set the board size to use (1\-19). Default is 19, other common formats are
+13 and 9.
+.PP
+\&\fB\*(--color \f(BIcolor\fB\fR
+.PP
+Choose your color (\fIblack\fR or \fIwhite\fR). Black plays first, White gets
+the komi compensation.
+.PP
+\&\fB\*(--handicap \f(BInum\fB\fR
+.PP
+Set the number of handicap stones.
+.PP
+\&\fB\*(--komi \f(BInum\fB\fR
+.PP
+Set the komi (points given to white player to compensate advantage of the 
+first move, usually 5.5 or 0.5). Default is 5.5.
+.Sh "Informative Output:"
+.IX Subsection "Informative Output:"
+\&\fB\-v, \-\-version\fR
+.PP
+Display the version of \s-1GNU\s0 Go. 
+.PP
+\&\fB\-h, \-\-help\fR
+.PP
+Display help message.
+.PP
+\&\fB\*(--help debug\fR
+.PP
+Display help about debugging options. 
+.PP
+\&\fB\*(--copyright\fR
+.PP
+Display copyright notice.
+.Sh "Debugging and advanced options:"
+.IX Subsection "Debugging and advanced options:"
+\&\fB\-T, \-\-printboard\fR
+.PP
+Show board each move.
+.PP
+\&\fB\*(--level \f(BInum\fB\fR
+.PP
+Level of play. (default 10; smaller=faster, weaker).
+.PP
+\&\fB\-b, \-\-benchmark \f(BInum\fB\fR
+.PP
+Benchmarking mode \- can be used with \fB\-l\fR.
+.PP
+\&\fB\-t, \-\-trace\fR
+.PP
+Verbose tracing (use twice or more to trace reading).
+.PP
+\&\fB\-r, \-\-seed \f(BInum\fB\fR
+.PP
+Set random number seed.
+.PP
+\&\fB\*(--score [\f(BIestimate|finish|aftermath\fB]\fR
+.PP
+Count or estimate territory of the input file. Usage:
+.PP
+\&\fBgnugo \-\-score estimate \-l filename\fR
+.PP
+Loads the \s-1SGF\s0 file and estimates the score by measuring the
+influence. Use with \fB\-L\fR if you want the estimate somewhere else than
+at the end of the file.
+.PP
+\&\fBgnugo \-\-score finish \-l filename\fR
+.PP
+Loads the \s-1SGF\s0 file and gnugo continues to play by itself up to the
+very end. Then the winner is determined by counting the territory.
+.PP
+\&\fBgnugo \-\-score aftermath \-l filename\fR
+.PP
+Similar to \fB\*(--score finish\fR except that a more accurate but slower
+algorithm is used to determine the final status of the groups.
+.PP
+If the option \fB\-o outputfilename\fR is provided, 
+the results will also be written as comment at the end of the output file.
+.PP
+\&\fB\*(--printsgf \f(BIoutfile\fB\fR
+.PP
+Load \s-1SGF\s0 file, output final position (requires \fB\-l\fR).
+.SH "BUGS"
+.IX Header "BUGS"
+If you find a bug, please send the \s-1SGF\s0 output file to gnugo@gnu.org
+together with a description of the bug.
diff --git a/doc/gnugo.info b/doc/gnugo.info
new file mode 100644 (file)
index 0000000..d3ef10f
--- /dev/null
@@ -0,0 +1,199 @@
+This is gnugo.info, produced by makeinfo version 4.11 from gnugo.texi.
+
+INFO-DIR-SECTION GNU games
+START-INFO-DIR-ENTRY
+* GNU Go: (gnugo).          The GNU Go program
+END-INFO-DIR-ENTRY
+
+\1f
+Indirect:
+gnugo.info-1: 187
+gnugo.info-2: 298286
+gnugo.info-3: 585384
+\1f
+Tag Table:
+(Indirect)
+Node: Top\7f187
+Node: Introduction\7f2429
+Node: About\7f2985
+Node: Copyright\7f4991
+Node: Authors\7f6383
+Node: Thanks\7f7125
+Node: Development\7f8457
+Node: Installation\7f10524
+Node: GNU/Linux and Unix\7f11105
+Node: Configure Options\7f12860
+Node: Ram Cache\7f13290
+Node: Default Level\7f14936
+Node: Other Options\7f15761
+Node: Windows and MS-DOS\7f19044
+Node: Macintosh\7f24802
+Node: User Guide\7f25397
+Node: Documentation\7f25997
+Node: CGoban\7f27978
+Node: Other Clients\7f29758
+Node: Ascii\7f32146
+Node: Emacs\7f33457
+Node: GMP and GTP\7f34790
+Node: Tournaments\7f35815
+Node: SGF Support\7f36427
+Node: Invoking GNU Go\7f36769
+Node: Overview\7f59822
+Node: Examining the Position\7f61077
+Node: Move Generators\7f64103
+Node: Move Valuation\7f68408
+Node: Detailed Sequence of Events\7f69330
+Node: Roadmap\7f72939
+Node: Coding Styles\7f84582
+Node: Navigating the Source\7f87635
+Node: Analyzing\7f88428
+Node: Traces\7f89429
+Node: Output File\7f90380
+Node: Decide string\7f91435
+Node: Decide dragon\7f94534
+Node: GTP and GDB techniques\7f94972
+Node: view.pike\7f95711
+Node: Scoring\7f96535
+Node: Colored Display\7f96896
+Node: Move Generation\7f98854
+Node: Move generation Intro\7f99224
+Node: Move Reasons\7f100943
+Node: Move Reason Details\7f103642
+Node: Attack and Defense\7f104454
+Node: Threats to Attack or Defend\7f105909
+Node: Multi Attack or Defense\7f106611
+Node: Cutting and Connecting\7f106992
+Node: Semeai\7f107977
+Node: Making eyes\7f108766
+Node: Antisuji moves\7f109392
+Node: Territorial moves\7f109796
+Node: Owl attack and defense\7f110330
+Node: Combination Attacks\7f111914
+Node: Valuation\7f112330
+Node: Territorial value\7f115377
+Node: Strategical value\7f116241
+Node: Shape factor\7f116829
+Node: Minimum Value\7f117790
+Node: Secondary Value\7f118459
+Node: Threats and Followup Value\7f118735
+Node: End Game\7f119649
+Node: Worms and Dragons\7f120030
+Node: Worms\7f122366
+Node: Amalgamation\7f132161
+Node: Connection\7f133860
+Node: Half Eyes\7f135693
+Node: Dragons\7f137482
+Node: Dragons in Color\7f148555
+Node: Eyes\7f150034
+Node: Local Games\7f150822
+Node: Eye Space\7f152186
+Node: Eye Space as Local Game\7f154271
+Node: Eye Example\7f157092
+Node: Graphs\7f157778
+Node: Eye Shape\7f159652
+Node: Eye Local Game Values\7f160639
+Node: Eye Topology\7f164228
+Node: Eye Topology with Ko\7f166346
+Node: False Margins\7f172276
+Node: Eye Functions\7f172884
+Node: Patterns\7f182133
+Node: Patterns Overview\7f183433
+Node: Pattern Classification\7f187147
+Node: Pattern Values\7f192559
+Node: Helper Functions\7f193544
+Node: Autohelpers and Constraints\7f196448
+Node: Autohelper Actions\7f198892
+Node: Autohelper Functions\7f201307
+Node: Attack and Defense DB\7f212631
+Node: Connections Database\7f213950
+Node: Connection Functions\7f216196
+Node: Tuning\7f218226
+Node: PM Implementation\7f226271
+Node: Symmetry & transformations\7f227654
+Node: Details\7f229542
+Node: Grid optimization\7f231775
+Node: Joseki Compiler\7f233290
+Node: Ladders in Joseki\7f236881
+Node: Corner Matcher\7f238821
+Node: Editing Patterns\7f243820
+Node: DFA\7f245121
+Node: Introduction to the DFA\7f246335
+Node: What is a DFA\7f248260
+Node: Pattern matching with DFA\7f252932
+Node: Building the DFA\7f255534
+Node: Incremental Algorithm\7f257866
+Node: DFA Optimizations\7f259052
+Node: Tactical Reading\7f259529
+Node: Reading Basics\7f260661
+Ref: Return Codes\7f262979
+Ref: Experimental Owl Extension\7f263604
+Ref: depthparams\7f264135
+Node: Hashing\7f267700
+Node: Hash Calculation\7f269226
+Node: Hash Organization\7f270756
+Node: Hash Structures\7f273370
+Node: Persistent Cache\7f276616
+Node: Ko\7f280124
+Node: A Ko Example\7f284328
+Node: Another Ko Example\7f286396
+Node: Alternate Komaster Schemes\7f288006
+Node: Superstrings\7f289761
+Node: Debugging\7f291105
+Node: Connection Reading\7f295598
+Node: Pattern Based Reading\7f296835
+Node: The Owl Code\7f298286
+Node: Combinations\7f303285
+Node: Influence\7f306331
+Node: Influential Concepts\7f307296
+Node: Territory and Moyo\7f309481
+Node: Influence Usage\7f310817
+Node: Influence and Territory\7f313698
+Node: Territorial Details\7f319583
+Node: The Influence Core\7f321572
+Node: The Influence Algorithm\7f324776
+Node: Permeability\7f327952
+Node: Escape\7f329501
+Node: Break Ins\7f332964
+Node: Surrounded Dragons\7f337404
+Node: Influential Patterns\7f340830
+Node: Influential Display\7f345235
+Node: Influence Tuning\7f348788
+Node: Monte Carlo Go\7f351497
+Node: Libboard\7f359172
+Node: Board Data Structures\7f360978
+Node: The Board Array\7f362402
+Node: Incremental Board\7f367612
+Node: Some Board Functions\7f375267
+Node: SGF\7f379917
+Node: API\7f383219
+Node: Getting Started\7f387212
+Node: Basic Data Structures\7f388208
+Node: The Board State\7f389352
+Node: Positional Functions\7f390806
+Node: Utility Functions\7f397396
+Node: General Utilities\7f397895
+Node: Print Utilities\7f413839
+Node: Board Utilities\7f417413
+Node: Influence Utilities\7f428544
+Node: GTP\7f431012
+Node: The Go Text Protocol\7f431482
+Node: Running in GTP mode\7f432643
+Node: GTP applications\7f434508
+Node: The Metamachine\7f436839
+Node: Adding new GTP commands\7f440640
+Node: GTP command reference\7f444573
+Node: Regression\7f475144
+Node: Regression Testing\7f476680
+Node: Test Suites\7f477489
+Node: Running the Regressions\7f479616
+Node: Running regress.pike\7f482404
+Node: Viewing with Emacs\7f484408
+Node: HTML Views\7f485164
+Node: Copying\7f488598
+Node: GPL\7f489073
+Node: GFDL\7f526318
+Node: GTP License\7f551444
+Node: Concept Index\7f553151
+Node: Functions Index\7f585384
+\1f
+End Tag Table
diff --git a/doc/gnugo.info-1 b/doc/gnugo.info-1
new file mode 100644 (file)
index 0000000..0184447
--- /dev/null
@@ -0,0 +1,8030 @@
+This is gnugo.info, produced by makeinfo version 4.11 from gnugo.texi.
+
+INFO-DIR-SECTION GNU games
+START-INFO-DIR-ENTRY
+* GNU Go: (gnugo).          The GNU Go program
+END-INFO-DIR-ENTRY
+
+\1f
+File: gnugo.info,  Node: Top,  Next: Introduction,  Up: (dir)
+
+GNU Go Documentation
+********************
+
+GNU Go
+******
+
+This manual documents `GNU Go', a Go program and its sources.  This is
+Edition 3.8 of the `GNU Go Program Documentation'
+
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 Free Software Foundation (http://www.fsf.org), Inc.
+
+   Permission is granted to make and distribute verbatim or modified
+copies of this manual is given provided that the terms of the GNU Free
+Documentation License (*note GFDL::, version 1.3 or any later version)
+are respected.
+
+   Permission is granted to make and distribute verbatim or modified
+copies of the program GNU Go is given provided the terms of the GNU
+General Public License (*note GPL::, version 3 or any later version)
+are respected.
+
+* Menu:
+
+User's manual
+* Introduction::                 What is GNU Go ?
+* Installation::                 Installing GNU Go
+* User Guide::                   Using GNU Go
+
+An introduction to the GNU Go engine
+* Overview::                     Overview of the GNU Go engine
+* Analyzing::                    Analyzing GNU Go's moves
+* Move Generation::              How GNU Go generates moves
+* Worms and Dragons::            Dragons and Worms
+* Eyes::                         Eyes and half eyes
+* Patterns::                     Pattern database
+* Tactical Reading::             Tactical and Connection Reading
+* Pattern Based Reading::        Pattern Based Reading: Owl and Combinations
+* Influence::                    Influence Function
+* Monte Carlo Go::               Monte Carlo GNU Go
+
+Infrastructure and Interfaces
+* Libboard::                     The basic go board library.
+* SGF::                          Handling SGF trees in memory
+* DFA::                          The DFA Pattern Matcher
+* Utility Functions::            `utils.c' and `printutils.c'
+* API::                          API to the GNU Go engine
+* GTP::                          The Go Text Protocol
+* Regression::                   Regression testing
+
+Appendices
+* Copying::                      Software and Documentation Licenses
+
+Indices
+* Concept Index::               Concept Index
+* Functions Index::             Functions Index
+
+\1f
+File: gnugo.info,  Node: Introduction,  Next: Installation,  Prev: Top,  Up: Top
+
+1 Introduction
+**************
+
+This is GNU Go 3.8, a Go program. Development versions of GNU Go may be
+found at `http://www.gnu.org/software/gnugo/devel.html'. Contact us at
+<gnugo@gnu.org> if you are interested in helping.
+
+* Menu:
+
+* About::                       About GNU Go and this Manual
+* Copyright::                   Copyright
+* Authors::                     The Authors of GNU Go
+* Thanks::                     Acknowledgements
+* Development::                 Developing GNU Go
+
+\1f
+File: gnugo.info,  Node: About,  Next: Copyright,  Up: Introduction
+
+1.1 About GNU Go and this Manual
+================================
+
+The challenge of Computer Go is not to *beat* the computer, but to
+*program* the computer.
+
+   In Computer Chess, strong programs are capable of playing at the
+highest level, even challenging such a player as Garry Kasparov. No Go
+program exists that plays at the same level as the strongest human
+players.
+
+   To be sure, existing Go programs are strong enough to be interesting
+as opponents, and the hope exists that some day soon a truly strong
+program can be written. This is especially true in view of the
+successes of Monte Carlo methods, and a general recent improvement of
+computer Go.
+
+   Before GNU Go, Go programs have always been distributed as binaries
+only. The algorithms in these proprietary programs are secret. No-one
+but the programmer can examine them to admire or criticise. As a
+consequence, anyone who wished to work on a Go program usually had to
+start from scratch. This may be one reason that Go programs have not
+reached a higher level of play.
+
+   Unlike most Go programs, GNU Go is Free Software. Its algorithms and
+source code are open and documented. They are free for any one to
+inspect or enhance. We hope this freedom will give GNU Go's descendents
+a certain competetive advantage.
+
+   Here is GNU Go's Manual. There are doubtless inaccuracies. The
+ultimate documentation is in the commented source code itself.
+
+   The first three chapters of this manual are for the general user.
+Chapter 3 is the User's Guide. The rest of the book is for programmers,
+or persons curious about how GNU Go works.  Chapter 4 is a general
+overview of the engine.  Chapter 5 introduces various tools for looking
+into the GNU Go engine and finding out why it makes a certain move, and
+Chapters 6-7 form a general programmer's reference to the GNU Go API.
+The remaining chapters are more detailed explorations of different
+aspects of GNU Go's internals.
+
+\1f
+File: gnugo.info,  Node: Copyright,  Next: Authors,  Prev: About,  Up: Introduction
+
+1.2 Copyrights
+==============
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 and 2008
+by the Free Software Foundation except as noted below.
+
+   All source files are distributed under the GNU General Public License
+(*note GPL::, version 3 or any later version), except `gmp.c', `gmp.h',
+`gtp.c', and `gtp.h'.
+
+   The files `gtp.c' and `gtp.h' are copyright the Free Software
+Foundation. In the interests of promoting the Go Text Protocol these
+two files are licensed under a less restrictive license than the GPL
+and are free for unrestricted use (*note GTP License::).
+
+   The two files `gmp.c' and `gmp.h' were placed in the public domain
+by William Shubert, their author, and are free for unrestricted use.
+
+   Documentation files (including this manual) are distributed under
+the GNU Free Documentation License (*note GFDL::, version 1.3 or any
+later version).
+
+   The files `regression/games/golois/*sgf' are copyright Tristan
+Cazenave and are included with his permission.
+
+   The SGF files in `regression/games/handtalk/' are copyright Jessie
+Annala and are used with permission.
+
+   The SGF files in `regression/games/mertin13x13/' are copyright Stefan
+Mertin and are used with permission.
+
+   The remaining SGF files are either copyright by the FSF or are in
+the public domain.
+
+\1f
+File: gnugo.info,  Node: Authors,  Next: Thanks,  Prev: Copyright,  Up: Introduction
+
+1.3 Authors
+===========
+
+GNU Go maintainers are Daniel Bump, Gunnar Farneback and Arend Bayer.
+GNU Go authors (in chronological order of contribution) are Man Li,
+Wayne Iba, Daniel Bump, David Denholm, Gunnar Farneba"ck, Nils Lohner,
+Jerome Dumonteil, Tommy Thorn, Nicklas Ekstrand, Inge Wallin, Thomas
+Traber, Douglas Ridgway, Teun Burgers, Tanguy Urvoy, Thien-Thi Nguyen,
+Heikki Levanto, Mark Vytlacil, Adriaan van Kessel, Wolfgang Manner, Jens
+Yllman, Don Dailey, Maans Ullerstam, Arend Bayer, Trevor Morris, Evan
+Berggren Daniel, Fernando Portela, Paul Pogonyshev, S.P. Lee and
+Stephane Nicolet, Martin Holters, Grzegorz Leszczynski and Lee Fisher.
+
+\1f
+File: gnugo.info,  Node: Thanks,  Next: Development,  Prev: Authors,  Up: Introduction
+
+1.4 Thanks
+==========
+
+We would like to thank Arthur Britto, David Doshay, Tim Hunt, Matthias
+Krings, Piotr Lakomy, Paul Leonard, Jean-Louis Martineau, Andreas
+Roever and Pierce Wetter for helpful correspondence.
+
+   Thanks to everyone who stepped on a bug (and sent us a report)!
+
+   Thanks to Gary Boos, Peter Gucwa, Martijn van der Kooij, Michael
+Margolis, Trevor Morris, Maans Ullerstam, Don Wagner and Yin Zheng for
+help with Visual C++.
+
+   Thanks to Alan Crossman, Stephan Somogyi, Pierce Wetter and Mathias
+Wagner for help with Macintosh. And thanks to Marco Scheurer and
+Shigeru Mabuchi for helping us find various problems.
+
+   Thanks to Jessie Annala for the Handtalk games.
+
+   Special thanks to Ebba Berggren for creating our logo, based on a
+design by Tanguy Urvoy and comments by Alan Crossman. The old GNU Go
+logo was adapted from Jamal Hannah's typing GNU:
+`http://www.gnu.org/graphics/atypinggnu.html'.  Both logos can be found
+in `doc/newlogo.*' and `doc/oldlogo.*'.
+
+   We would like to thank Stuart Cracraft, Richard Stallman and Man
+Lung Li for their interest in making this program a part of GNU,
+William Shubert for writing CGoban and gmp.c, Rene Grothmann for Jago
+and Erik van Riper and his collaborators for NNGS.
+
+\1f
+File: gnugo.info,  Node: Development,  Prev: Thanks,  Up: Introduction
+
+1.5 Development
+===============
+
+You can help make GNU Go the best Go program.
+
+   This is a task-list for anyone who is interested in helping with GNU
+Go. If you want to work on such a project you should correspond with us
+until we reach a common vision of how the feature will work!
+
+   A note about copyright. The Free Software Foundation has the
+copyright to GNU Go. For this reason, before any code can be accepted
+as a part of the official release of GNU Go, the Free Software
+Foundation will want you to sign a copyright assignment.
+
+   Of course you could work on a forked version without signing such a
+disclaimer. You can also distribute such a forked version of the
+program so long as you also distribute the source code to your
+modifications under the GPL (*note GPL::). But if you want your changes
+to the program to be incorporated into the version we distribute we
+need you to assign the copyright.
+
+   Please contact the GNU Go maintainers, Daniel Bump
+(<bump@sporadic.stanford.edu>) and Gunnar Farneba"ck
+(<gunnar@lysator.liu.se>), to get more information and the papers to
+sign.
+
+   Bug reports are very welcome, but if you can, send us bug FIXES as
+well as bug reports. If you see some bad behavior, figure out what
+causes it, and what to do about fixing it. And send us a patch! If you
+find an interesting bug and cannot tell us how to fix it, we would be
+happy to have you tell us about it anyway. Send us the sgf file (if
+possible) and attach other relevant information, such as the GNU Go
+version number. In cases of assertion failures and segmentation faults
+we probably want to know what operating system and compiler you were
+using, in order to determine if the problem is platform dependent.
+
+   If you want to work on GNU Go you should subscribe to the GNU Go
+development list. (http://lists.gnu.org/mailman/listinfo/gnugo-devel)
+Discussion of bugs and feedback from established developers about new
+projects or tuning the existing engine can be done on the list.
+
+\1f
+File: gnugo.info,  Node: Installation,  Next: User Guide,  Prev: Introduction,  Up: Top
+
+2 Installation
+**************
+
+You can get the most recent version of GNU Go ftp.gnu.org or a mirror
+(see `http://www.gnu.org/order/ftp.html' for a list).  You can read
+about newer versions and get other information at
+`http://www.gnu.org/software/gnugo/'.
+
+* Menu:
+
+* GNU/Linux and Unix::          GNU Linux and Unix Installation
+* Configure Options::           Configure Options
+* Windows and MS-DOS::          Windows Installation
+* Macintosh::                   Macintosh Installation
+
+\1f
+File: gnugo.info,  Node: GNU/Linux and Unix,  Next: Configure Options,  Up: Installation
+
+2.1 GNU/Linux and Unix
+======================
+
+Untar the sources, change to the directory gnugo-3.8. Now do:
+
+        ./configure [OPTIONS]
+        make
+
+   Several configure options will be explained in the next section. You
+do not need to set these unless you are dissatisfied with GNU Go's
+performance or wish to vary the experimental options.
+
+   As an example,
+
+        ./configure --enable-level=9 --enable-cosmic-gnugo
+
+will make a binary in which the default level is 9, and the experimental
+"cosmic"' option is enabled. A list of all configure options can be
+obtained by running `./configure --help'. Further information about the
+experimental options can be found in the next section (*note Configure
+Options::).
+
+   After running configure and make, you have now made a binary called
+`interface/gnugo'. Now (running as root) type
+
+        make install
+
+to install `gnugo' in `/usr/local/bin'.
+
+   There are different methods of using GNU Go. You may run it from the
+command line by just typing:
+
+        gnugo
+
+but it is nicer to run it using CGoban 1 (under X Window System),
+Quarry, Jago (on any platform with a Java Runtime Environment) or other
+client programs offering a GUI.
+
+   You can get the most recent version of CGoban 1 from
+`http://sourceforge.net/projects/cgoban1/'. The earlier version 1.12 is
+available from `http://www.igoweb.org/~wms/comp/cgoban/index.html'.
+The CGoban version number MUST be 1.9.1 at least or it won't work.
+CGoban 2 will not work.
+
+   *Note CGoban::, for instructions on how to run GNU Go from Cgoban, or
+*Note Other Clients::, for Jago or other clients.
+
+   Quarry is available at `http://home.gna.org/quarry/'.
+
+\1f
+File: gnugo.info,  Node: Configure Options,  Next: Windows and MS-DOS,  Prev: GNU/Linux and Unix,  Up: Installation
+
+2.2 Configure Options
+=====================
+
+There are three options which you should consider configuring,
+particularly if you are dissatisfied with GNU Go's performance.
+
+* Menu:
+
+* Ram Cache::                 Ram Cache
+* Default Level::             Default Level
+* Other Options::             Other Options
+
+\1f
+File: gnugo.info,  Node: Ram Cache,  Next: Default Level,  Up: Configure Options
+
+2.2.1 Ram Cache
+---------------
+
+By default, GNU Go makes a cache of about 8 Megabytes in RAM for its
+internal use. The cache is used to store intermediate results during
+its analysis of the position. More precisely the default cache size is
+350000 entries, which translates to 8.01 MB on typical 32 bit platforms
+and 10.68 MB on typical 64 bit platforms.
+
+   Increasing the cache size will often give a modest speed improvement.
+If your system has lots of RAM, consider increasing the cache size. But
+if the cache is too large, swapping will occur, causing hard drive
+accesses and degrading performance. If your hard drive seems to be
+running excessively your cache may be too large. On GNU/Linux systems,
+you may detect swapping using the program 'top'. Use the 'f' command to
+toggle SWAP display.
+
+   You may override the size of the default cache at compile time by
+running one of:
+
+        ./configure --enable-cache-size=n
+
+to set the cache size to `n' megabytes. For example
+
+        ./configure --enable-cache-size=32
+
+creates a cache of size 32 megabytes. If you omit this, your default
+cache size will be 8-11 MB as discussed above. Setting cache size
+negative also gives the default size. You must recompile and reinstall
+GNU Go after reconfiguring it by running `make' and `make install'.
+
+   You may override the compile-time defaults by running `gnugo' with
+the option `--cache-size n', where `n' is the size in megabytes of the
+cache you want, and `--level' where n is the level desired.  We will
+discuss setting these parameters next in detail.
+
+\1f
+File: gnugo.info,  Node: Default Level,  Next: Other Options,  Prev: Ram Cache,  Up: Configure Options
+
+2.2.2 Default Level
+-------------------
+
+GNU Go can play at different levels. Up to level 10 is supported. At
+level 10 GNU Go is much more accurate but takes an average of about 1.6
+times longer to play than at level 8.
+
+   The level can be set at run time using the `--level' option.  If you
+don't set this, the default level will be used. You can set the default
+level with the configure option `--enable-level=n'. For example
+
+     ./configure --enable-level=9
+
+sets the default level to 9. If you omit this parameter, the compiler
+sets the default level to 10. We recommend using level 10 unless you
+find it too slow. If you decide you want to change the default you may
+rerun configure and recompile the program.
+
+\1f
+File: gnugo.info,  Node: Other Options,  Prev: Default Level,  Up: Configure Options
+
+2.2.3 Other Options
+-------------------
+
+Anything new in the engine is generally tested as an experimental option
+which can be turned on or off at compile time or run time. Some
+"experimental" options such as the break-in code are no longer
+experimental but are enabled by default.
+
+   This section can be skipped unless you are interested in the
+experimental options.
+
+   Moreover, some configure options were removed from the stable
+release. For example it is known that the owl extension code can cause
+crashes, so the configure option -enable-experimental-owl-ext was
+disabled for 3.8.
+
+   The term "default" must be clarified, since there are really two
+sets of defaults at hand, runtime defaults specified in `config.h' and
+compile time default values for the runtime defaults, contained in
+`configure' (which is created by editing `configure.in' then running
+`autoconf'. For example we find in `config.h'
+
+     /* Center oriented influence. Disabled by default. */
+     #define COSMIC_GNUGO 0
+
+     /* Break-in module. Enabled by default. */
+     #define USE_BREAK_IN 1
+
+   This means that the experimental cosmic option, which causes GNU Go
+to play a center-oriented game (and makes the engine weaker) is
+disabled by default, but that the break-in module is used. These are
+defaults which are used when GNU Go is run without command line
+options. They can be overridden with the run time options:
+
+     gnugo --cosmic-gnugo --without-break-in
+
+   Alternatively you can configure GNU Go as follows:
+
+     ./configure --enable-cosmic-gnugo --disable-experimental-break-in
+
+   then recompile GNU Go. This changes the defaults in `config.h', so
+that you do not have to pass any command line options to GNU Go at run
+time to get the experimental owl extension turned on and the
+experimental break-in code turned off.
+
+   If you want to find out what experimental options were compiled into
+your GNU Go binary you can run `gnugo --options' to find out. Here is a
+list of experimental options in GNU Go.
+
+   * `experimental-break-in'. Experimental break-in code (*note Break
+     Ins::). You should not need to configure this because the break in
+     code is enabled by default in level 10, and is turned off at level
+     9. If you don't want the breakin code just play at level 9.
+
+   * `cosmic-gnugo'. An experimental style which plays a center
+     oriented game and has a good winning rate against standard GNU Go,
+     though it makes GNU Go weaker against other opponents.
+
+   * `large-scale'. Attempt to make large-scale captures.  See:
+
+     `http://lists.gnu.org/archive/html/gnugo-devel/2003-07/msg00209.html'
+
+     for the philosophy of this option. This option makes the engine
+     slower.
+
+   * `metamachine'. Enables the metamachine, which allows you to run
+     the engine in an experimental mode whereby it forks a new `gnugo'
+     process which acts as an "oracle." Has no effect unless combined
+     with the `--metamachine' run-time option.
+
+   Other options are not experimental, and can be changed as configure
+or runtime options.
+
+   * `chinese-rules' Use Chinese (area) counting.
+
+   * `resignation-allowed' Allow GNU Go to resign games.  This is on by
+     default.
+
+\1f
+File: gnugo.info,  Node: Windows and MS-DOS,  Next: Macintosh,  Prev: Configure Options,  Up: Installation
+
+2.3 Compiling GNU Go on Microsoft platforms
+===========================================
+
+2.3.1 Building with older visual studio
+---------------------------------------
+
+The distribution directories contain some .dsp and .dsw files with GNU
+Go. These have been brought up to date in the sense that they should
+work if you have the older VC++ with Visual Studio 6 but the
+distributed .dsp and .dsw files will only be of use with older version
+of Visual Studio.
+
+   In most cases (unless you are building in Cygwin) the preferred way
+to build GNU Go on Windows platforms is to use CMake. CMake understands
+about many versions of Visual C/Visual Studio, and will generate
+project/solution files for the tools installed on your system. So even
+if you have Visual Studio 6 you may use CMake and dispense with the
+distributed .dsp and .dsw files.
+
+2.3.2 Building with Visual Studio project files
+-----------------------------------------------
+
+Before you compile the GNU Go source, you need to run CMake first, to
+generate the build files you'll give to Visual Studio.
+
+   From the cmd.exe command prompt, CD into the GNU Go source directory.
+To confirm you're in the right place, you should see the file
+'CMakeLists.txt' in the top-level directory of the GNU Go code (as well
+as others in lower subdirectories).
+
+   Direct CMake to generate the new Visual Studio build files by typing:
+
+         cmake CMakeLists.txt
+
+   Compile the code by invoking the newly-created Solution file:
+
+         vcbuild GNUGo.sln
+
+   This will take a few moments, as CMake generates 4 debug/retail
+targets:
+
+         debug
+         release
+         minsizerel
+         relwithdebinfo
+
+   For each of these targets, Visual Studio is generating a version of
+gnugo.exe:
+
+         interface\debug\gnugo.exe
+         interface\release\gnugo.exe
+         interface\minsizerel\gnugo.exe
+         interface\relwithdebinfo\gnugo.exe
+
+   Additionally, there is an 'Install' target available, that will copy
+the the gnugo.exe into the %ProgramFiles% directory. To do this, type:
+
+         vcbuild INSTALL.vcproj
+
+   This should result in copying GNU/Go into:
+
+         "%ProgramFiles%\GNUGo\bin\gnugo.exe" --options
+
+   In addition to command line use, CMake also has a GUI version. Users
+of the Visual Studio GUI might prefer to use that.
+
+2.3.3 Building with Nmake makefiles
+-----------------------------------
+
+GNU Go will also build using NMake makefiles. Optionally, instead of
+Visual Studio project/solution files, you may direct CMake to generate
+NMake makefiles. To generate the makefiles:
+
+         cmake -G "NMake Makefiles" CMakeLists.txt
+
+   The default rule for the makefile is 'all'. Use the 'help' rule to
+show a list of available targets.
+
+         nmake -f Makefile help
+
+   To compile GNU Go:
+
+         nmake -f Makefil, all
+
+   One sysand 2009 tems, GNU GO may fail to build when using NMake
+makefiles.  only fails the first time run, run NMake again with the
+'clean all' targets, and it will compile the second and subsequent
+times.
+
+         nmake -f Makefile clean all
+
+   Which will successfully generate a gnugo.exe.
+
+         interface\gnugo.exe --options
+
+2.3.4 Building with MinGW Makefiles
+-----------------------------------
+
+GNU Go can be built on Windows systems using MinGW.
+
+   This development environment uses: the GCC compiler (gcc.exe, not
+cl.exe), the Microsoft C runtime libraries (MSCRT, not GLibC), the GNU
+Make build tool (`mingw32-make.exe', not NMake), all from the Windows
+shell (`cmd.exe', not sh/bash).
+
+   For CMake to work, in addition to the base MinGW installation, the
+C++ compiler (g++.exe) and GNU Make (mingw32-make.exe) need to be
+installed.  This was tested using GCC v3, not the experimental v4. To
+debug, use GDB, as the GCC-generated symbols won't work with
+NTSD/Windbg/Visual Studio.
+
+   To create the makfiles, run CMake with the MinGW generator option:
+
+         cmake -G "MinGW Makefiles" CMakeLists.txt
+
+   To build GNU Go, from a cmd.exe shell, run GNU Make (against the
+newly-created 'Makefile' and it's default 'all' target):
+
+         mingw32-make
+         ..\interface\gnugo.exe --options
+
+2.3.5 Building with MSYS makefiles (MinGW)
+------------------------------------------
+
+GNU Go can be built on Windows systems using MSYS.
+
+   This development environment uses: the GCC compiler (gcc.exe, not
+cl.exe), the Microsoft C runtime libraries (MSCRT, not GLibC), the GNU
+Make build tool (make, not NMake), all from the GNU Bash (sh.exe, not
+cmd.exe).
+
+   To create the makfiles, run CMake with the MSYS generator option:
+
+         cmake -G "MSYS Makefiles" CMakeLists.txt
+
+   Start MSYS's Bash shell, either clicking on a shortcut on from the
+command line:
+
+         cd /d c:\msys\1.0
+         msys.bat
+
+   To build GNU Go, from a Bash shell, run GNU Make (against the
+newly-created 'Makefile' and it's default 'all' target):
+
+         make
+         ../interface/gnugo.exe --options
+
+   To debug, use GDB, as the GCC-generated symbols won't work with
+NTSD/Windbg/Visual Studio.
+
+2.3.6 Building on cygwin
+------------------------
+
+With Cygwin, you should be able to
+
+       tar zxvf gnugo-3.8.tar.gz
+       cd gnugo-3.8
+       env CC='gcc -mno-cygwin' ./configure
+       make
+
+2.3.7 Testing on Windows:
+-------------------------
+
+`regression/regress.cmd' is a simplified cmd.exe-centric port of the
+main gnugo Unix shell script regress.sh. It can be used to help verify
+that the generated binary might be operational. Read the script's
+comment header for more information. For access to the full GNU Go
+tests, use Unix, not Windows.
+
+   To test:
+
+         cd regression
+         regress.cmd ..\interface\gnugo.exe
+
+\1f
+File: gnugo.info,  Node: Macintosh,  Prev: Windows and MS-DOS,  Up: Installation
+
+2.4 Macintosh
+=============
+
+If you have Mac OS X you can build GNU Go using Apple's compiler, which
+is derived from GCC. You will need Xcode.
+
+   One issue is that the configure test for socket support is too
+conservative. On OS/X, the configure test fails, but actually socket
+support exists. So if you want to be able to connect to the engine
+through tcp/ip (using gtp) you may `configure --enable-socket-support'.
+There will be an error message but you may build the engine and socket
+support should work.
+
+\1f
+File: gnugo.info,  Node: User Guide,  Next: Overview,  Prev: Installation,  Up: Top
+
+3 Using GNU Go
+**************
+
+* Menu:
+
+* Documentation::            Getting Documentation
+* CGoban::                   Running GNU Go with CGoban
+* Other Clients::            Other Clients
+* Ascii::                    The Ascii Interface
+* Emacs::                    GNU Go mode in Emacs
+* GMP and GTP::              The Go Modem Protocol and Go Text Protocol
+* Tournaments::              Computer Tournaments
+* SGF Support::              The Smart Game Format
+* Invoking GNU Go::          Command line options
+
+\1f
+File: gnugo.info,  Node: Documentation,  Next: CGoban,  Up: User Guide
+
+3.1 Getting Documentation
+=========================
+
+You can obtain a printed copy of the manual by running `make gnugo.pdf'
+in the `doc/'directory, then printing the resulting file. The manual
+contains a great deal of information about the algorithms of GNU Go.
+
+   On platforms supporting info documentation, you can usually install
+the manual by executing `make install' (running as root) from the
+`doc/' directory. This will create a file called `gnugo.info' (and a
+few others) and copy them into a system directory such as
+`/usr/local/share/info'. You may then add them to your info directory
+tree with the command `install-info --info-file=[path to gnugo.info]
+--info-dir=[path to dir]'.  The info documentation can be read
+conveniently from within Emacs by executing the command `Control-h i'.
+
+   Documentation in `doc/' consists of a man page `gnugo.6', the info
+files `gnugo.info', `gnugo.info-1', ... and the Texinfo files from
+which the info files are built. The Texinfo documentation contains this
+User's Guide and extensive information about the algorithms of GNU Go,
+for developers.
+
+   If you want a typeset copy of the Texinfo documentation, you can
+`make gnugo.dvi', `make gnugo.ps', or `make gnugo.pdf' in the `doc/'
+directory. (`make gnugo.pdf' only works after you have converted all
+.eps-files in the doc/ directory to .pdf files, e.g. with the utility
+epstopdf.)
+
+   You can make an HTML version with the command `makeinfo --html
+gnugo.texi'. If you have `texi2html', better HTML documentation may be
+obtained by `make gnugo.html' in the `doc/' directory.
+
+   User documentation can be obtained by running `gnugo --help' or `man
+gnugo' from any terminal, or from the Texinfo documentation.
+
+   Documentation for developers is in the Texinfo documentation, and in
+comments throughout the source. Contact us at <gnugo@gnu.org> if you are
+interested in helping to develop this program.
+
+\1f
+File: gnugo.info,  Node: CGoban,  Next: Other Clients,  Prev: Documentation,  Up: User Guide
+
+3.2 Running GNU Go via CGoban
+=============================
+
+There are two different programs called CGoban, both written by William
+Shubert. In this documentation, CGoban means CGoban 1.x, the older
+program. You should get a copy with version number 1.12 or higher.
+
+   CGoban is an extremely nice way to run GNU Go. CGoban provides a
+beautiful graphic user interface under X Window System.
+
+   Start CGoban. When the CGoban Control panel comes up, select "Go
+Modem". You will get the Go Modem Protocol Setup. Choose one (or both)
+of the players to be "Program," and fill out the box with the path to
+`gnugo'. After clicking OK, you get the Game Setup window.  Choose
+"Rules Set" to be Japanese (otherwise handicaps won't work).  Set the
+board size and handicap if you want.
+
+   If you want to play with a komi, you should bear in mind that the
+GMP does not have any provision for communicating the komi.  Because of
+this misfeature, unless you set the komi at the command line GNU Go
+will have to guess it. It assumes the komi is 5.5 for even games, 0.5
+for handicap games. If this is not what you want, you can specify the
+komi at the command line with the `--komi' option, in the Go Modem
+Protocol Setup window.  You have to set the komi again in the Game
+Setup window, which comes up next.
+
+   Click OK and you are ready to go.
+
+   In the Go Modem Protocol Setup window, when you specify the path to
+GNU Go, you can give it command line options, such as `--quiet' to
+suppress most messages. Since the Go Modem Protocol preempts standard
+I/O other messages are sent to stderr, even if they are not error
+messages. These will appear in the terminal from which you started
+CGoban.
+
+\1f
+File: gnugo.info,  Node: Other Clients,  Next: Ascii,  Prev: CGoban,  Up: User Guide
+
+3.3 Other Clients
+=================
+
+In addition to CGoban (*note CGoban::) there are a number of other good
+clients that are capable of running GNU Go. Here are the ones that we
+are aware of that are Free Software. This list is part of a larger list
+of free Go programs that is maintained at
+`http://www.gnu.org/software/gnugo/free_go_software.html'.
+
+   * Quarry (`http://home.gna.org/quarry/') is a GPL'd client that
+     supports GTP.  Works under GNU/Linux and requires GTK+ 2.x and
+     librsvg 2.5.  Supports GNU Go as well as other engines.  Can play
+     not only Go, but also a few other board games.
+
+   * qGo (`http://sourceforge.net/projects/qgo/') is a full featured
+     Client for playing on the servers, SGF viewing/editing, and GNU Go
+     client written in C++ for GNU/Linux, Windows and Mac OS X.  Can
+     play One Color Go. Licensed GPL and QPL.
+
+   * ccGo (`http://ccdw.org/~cjj/prog/ccgo/') is a GPL'd client written
+     in C++ capable of playing with GNU Go, or on IGS.
+
+   * RubyGo (`http://rubygo.rubyforge.org/') is a GPL'd client by J.-F.
+     Menon for IGS written in the scripting language Ruby.  RubyGo is
+     capable of playing with GNU Go using the GTP.
+
+   * Dingoui (`http://dingoui.sourceforge.net/') is a free GMP client
+     written in GTK+ which can run GNU Go.
+
+   * Jago (`http://www.rene-grothmann.de/jago/') is a GPL'd Java client
+     which works for both Microsoft Windows and X Window System.
+
+   * Sente Software's FreeGoban
+     (`http://www.sente.ch/software/goban/freegoban.html') is a
+     well-liked user interface for GNU Go (and potentially other
+     programs) distributed under the GPL.
+
+   * Mac GNU Go
+     (`http://www1.u-netsurf.ne.jp/~future/HTML/macgnugo.html') is a
+     front end for GNU Go 3.2 with both English and Japanese versions.
+     License is GPL.
+
+   * Quickiego (`http://www.geocities.com/secretmojo/QuickieGo/') is a
+     Mac interface to GNU Go 2.6.
+
+   * Gogui (`http://sourceforge.net/projects/gogui/') from Markus
+     Enzenberger is a Java workbench that allows you to play with a gtp
+     (`http://www.lysator.liu.se/~gunnar/gtp') engine such as GNU Go.
+     Licence is GPL. Gogui does not support gmp or play on servers but
+     is potentially very useful for programmers working on GNU Go or
+     other engines.
+
+\1f
+File: gnugo.info,  Node: Ascii,  Next: Emacs,  Prev: Other Clients,  Up: User Guide
+
+3.4 Ascii Interface
+===================
+
+Even if you do not have any client program, you can play with GNU Go
+using its default Ascii interface. Simply type `gnugo' at the command
+line, and GNU Go will draw a board. Typing `help' will give a list of
+options. At the end of the game, pass twice, and GNU Go will prompt you
+through the counting. You and GNU Go must agree on the dead groups--you
+can toggle the status of groups to be removed, and when you are done,
+GNU Go will report the score.
+
+   You can save the game at any point using the `save FILENAME'
+command. You can reload the game from the resulting SGF file with the
+command `gnugo -l FILENAME --mode ascii'. Reloading games is not
+supported when playing with CGoban. However you can use CGoban to save
+a file, then reload it in ascii mode.
+
+   You may play games with a time limit against GNU Go in ascii mode.
+For this, the Canadian time control system is used. (See
+`http://en.wikipedia.org/wiki/Byoyomi' and
+`http://senseis.xmp.net/?CanadianByoyomi'.)  That is, you have a main
+time to be followed by byo-yomi periods. After the main time is
+exhausted you have a certain number of moves to be made in a certain
+number of seconds.  (*note Invoking GNU Go::)
+
+\1f
+File: gnugo.info,  Node: Emacs,  Next: GMP and GTP,  Prev: Ascii,  Up: User Guide
+
+3.5 GNU Go mode in Emacs
+========================
+
+You can run GNU Go from Emacs. This has the advantage that you place
+the stones using the cursor arrow keys or with the mouse, and you can
+have a nice graphical display of the board within emacs.
+
+   You will need the file `interface/gnugo.el'. There is a version of
+this distributed with GNU Go but it only works with Emacs 21. Most
+Emacsen are Emacs 22 however.  Therefore you should get the latest
+version of gnugo.el by Thien-Thi Nguyen, which you can find at
+`http://www.gnuvola.org/software/j/gnugo/' or
+`http://www.emacswiki.org/emacs/gnugo.el'.
+
+   You will also need some xpm files for the graphical display. You can
+either use those distributed by Thien-Thi Nguyen (at the first URL
+above) or those distributed with GNU Go, either the file
+`interface/gnugo-xpms.el' or (for high resolution displays)
+`interface/gnugo-big-xpms.el'.
+
+   Load the file `interface/gnugo.el' and `interface/gnugo-xpms.el'.
+You may do this using the Emacs `M-x load-file' command.
+
+   When you start a game with `M-x gnugo', you will first see an ascii
+board. However typing `i' toggles a graphical board display which is
+very nice.  This is a pleasant way to play GNU Go. You may get help by
+typing `C-x m'.
+
+\1f
+File: gnugo.info,  Node: GMP and GTP,  Next: Tournaments,  Prev: Emacs,  Up: User Guide
+
+3.6 The Go Modem Protocol and Go Text Protocol
+==============================================
+
+The Go Modem Protocol (GMP) was developed by Bruce Wilcox with input
+from David Fotland, Anders Kierulf and others, according to the history
+in `http://www.britgo.org/tech/gmp.html'.
+
+   Any Go program _should_ support this protocol since it is a
+standard. Since CGoban supports this protocol, the user interface for
+any Go program can be done entirely through CGoban. The programmer can
+concentrate on the real issues without worrying about drawing stones,
+resizing the board and other distracting issues.
+
+   GNU Go 3.0 introduced a new protocol, the Go Text Protocol (*note
+GTP::) which we hope can serve the functions currently used by the GMP.
+The GTP is becoming increasingly adopted by other programs as a method
+of interprocess communication, both by computer programs and by
+clients. Still the GMP is widely used in tournaments.
+
+\1f
+File: gnugo.info,  Node: Tournaments,  Next: SGF Support,  Prev: GMP and GTP,  Up: User Guide
+
+3.7 Computer Go Tournaments
+===========================
+
+Computer Tournaments currently use the Go Modem Protocol.  The current
+method followed in such tournaments is to connect the serial ports of
+the two computers by a "null modem" cable.  If you are running
+GNU/Linux it is convenient to use CGoban.  If your program is black,
+set it up in the Go Modem Protocol Setup window as usual. For White,
+select "Device" and set the device to `/dev/cua0' if your serial port
+is COM1 and `/dev/cua1' if the port is COM2.
+
+\1f
+File: gnugo.info,  Node: SGF Support,  Next: Invoking GNU Go,  Prev: Tournaments,  Up: User Guide
+
+3.8 Smart Game Format
+=====================
+
+The Smart Game Format (SGF), is the standard format for storing Go
+games.  GNU Go supports both reading and writing SGF files. The SGF
+specification (FF[4]) is at: `http://www.red-bean.com/sgf/'
+
+\1f
+File: gnugo.info,  Node: Invoking GNU Go,  Prev: SGF Support,  Up: User Guide
+
+3.9 Invoking GNU Go: Command line options
+=========================================
+
+3.9.1 Some basic options
+------------------------
+
+   * `--help', `-h'
+
+          Print a help message describing the options. This will also
+          tell you the defaults of various parameters, most importantly
+          the level and cache size. The default values of these
+          parameters can be set before compiling by `configure'.  If
+          you forget the defaults you can find out using `--help'.
+
+   * `--boardsize SIZE'
+
+          Set the board size
+
+   * `--komi NUM'
+
+          Set the komi
+
+   * `--level LEVEL' 
+
+          GNU Go can play with different strengths and speeds. Level 10
+          is the default. Decreasing the level will make GNU Go faster
+          but less accurate in its reading.
+
+   * `--quiet', `--silent'
+
+          Don't print copyright and other messages. Messages
+          specifically requested by other command line options, such as
+          `--trace', are not supressed.
+
+   * `-l', `--infile FILENAME'
+
+          Load the named SGF file. GNU Go will generate a move for the
+          player who is about to move. If you want to override this and
+          generate a move for the other player you may add the option
+          `--color <COLOR>' where <COLOR> is `black' or `white'.
+
+   * `-L', `--until MOVE'
+
+          Stop loading just before the indicated move is played. MOVE
+          can be either the move number or location.
+
+   * `-o', `--outfile FILENAME'
+
+          Write sgf output to file
+
+   * `-O', `--output-flags FLAGS'
+
+          Add useful information to the sgf file. Flags can be 'd', 'v'
+          or both (i.e. 'dv'). If 'd' is specified, dead and critical
+          dragons are marked in the sgf file. If 'v' is specified, move
+          valuations around the board are indicated.
+
+   * `--mode MODE'
+
+          Force the playing mode ('ascii', 'emacs,' 'gmp' or 'gtp').
+          The default is ASCII, but if no terminal is detected GMP (Go
+          Modem Protocol) will be assumed. In practice this is usually
+          what you want, so you may never need this option.
+
+   * `--resign-allowed'
+
+          GNU Go will resign games if this option is enabled. This is
+          the default unless you build the engine with the configure
+          option `--disable-resignation-allowed'. Unfortunately the Go
+          Modem Protocol has no provision for passing a resignation, so
+          this option has no effect in GMP mode.
+
+   * `--never-resign'
+
+          GNU Go will not resign games.
+
+   * `--resign-allowed'
+
+          GNU Go will resign lost games. This is the default.
+
+3.9.2 Monte Carlo Options
+-------------------------
+
+GNU Go can play Monte Carlo Go on a 9x9 board.  (Not available for
+larger boards.) It makes quite a strong engine. Here are the command
+line options.
+
+   * `--monte-carlo'
+
+          Use Monte Carlo move generation (9x9 or smaller).
+
+   * `--mc-games-per-level <number>'
+
+          Number of Monte Carlo simulations per level. Default 8000.
+          Thus at level 10, GNU Go simulates 80,000 games in order to
+          generate a move.
+
+   * `--mc-list-patterns'
+
+          list names of builtin Monte Carlo patterns
+
+   * `--mc-patterns <name>'
+
+          Choose a built in Monte Carlo pattern database. The argument
+          can be `mc_mogo_classic', `mc_montegnu_classic' or
+          `mc_uniform'.
+
+   * `--mc-load-patterns <filename>'
+
+          read Monte Carlo patterns from file
+
+3.9.3 Other general options
+---------------------------
+
+   * `-M', `--cache-size MEGS'
+
+          Memory in megabytes used for caching of read results. The
+          default size is 8 unless you configure gnugo with the command
+          `configure --enable-cache-size=SIZE' before compiling to make
+          SIZE the default (*note Installation::). GNU Go stores
+          results of its reading calculations in a hash table (*note
+          Hashing::). If the hash table is filled, it is emptied and
+          the reading continues, but some reading may have to be
+          repeated that was done earlier, so a larger cache size will
+          make GNU Go run faster, provided the cache is not so large
+          that swapping occurs. Swapping may be detected on GNU/Linux
+          machines using the program `top'. However, if you have ample
+          memory or if performance seems to be a problem you may want
+          to increase the size of the cache using this option.
+
+   * `--chinese-rules'
+
+          Use Chinese rules. This means that the Chinese or Area
+          Counting is followed. It may affect the score of the game by
+          one point in even games, more if there is a handicap (since
+          in Chinese Counting the handicap stones count for Black) or
+          if either player passes during the game.
+
+   * `--japanese-rules'
+
+          Use Japanese Rules. This is the default unless you specify
+          `--enable-chinese-rules' as a configure option.
+
+   * `--play-out-aftermath'
+
+   * `--capture-all-dead'
+
+          These options cause GNU Go to play out moves that are usually
+          left unplayed after the end of the game. Such moves lose
+          points under Japanese rules but not Chinese rules.  With
+          `--play-out-aftermath', GNU Go may play inside its territory
+          in order to reach a position where it considers every group
+          demonstrably alive or dead. The option `--capture-all-dead'
+          causes GNU Go to play inside its own territory to remove dead
+          stones.
+
+   * `--forbid-suicide'
+
+          Do not allow suicide moves (playing a stone so that it ends
+          up without liberties and is therefore immediately removed).
+          This is the default.
+
+   * `--allow-suicide'
+
+          Allow suicide moves, except single-stone suicide. The latter
+          would not change the board at all and pass should be used
+          instead.
+
+   * `--allow-all-suicide'
+
+          Allow suicide moves, including single-stone suicide. This is
+          only interesting in exceptional cases. Normally the
+          `--allow-suicide' option should be used instead.
+
+   * `--simple-ko'
+
+          Do not allow an immediate recapture of a ko so that the
+          previous position is recreated. Repetition of earlier
+          positions than that are allowed. This is default.
+
+   * `--no-ko'
+
+          Allow all kinds of board repetition.
+
+   * `--positional-superko'
+
+          Forbid repetition of any earlier board position. This only
+          applies to moves on the board; passing is always allowed.
+
+   * `--situational-superko'
+
+          Forbid repetition of any earlier board position with the same
+          player to move. This only applies to moves on the board;
+          passing is always allowed.
+
+   * `--copyright': Display the copyright notice
+
+   * `--version' or `-v': Print the version number
+
+   * `--printsgf FILENAME':
+
+          Create an SGF file containing a diagram of the board. Useful
+          with `-l' and `-L' to create a diagram of the board from
+          another sgf file. Illegal moves are indicated with the private
+          `IL' property.  This property is not used in the FF4 SGF
+          specification, so we are free to preempt it.
+
+   * `--options'
+
+          Print which experimental configure options were compiled into
+          the program (*note Other Options::).
+
+   * `--orientation N'
+
+          Combine with `-l'. The Go board can be oriented in 8 different
+          ways, counting reflections and rotations of the position;
+          this option selects an orientation (default 0). The parameter
+          `n' is an integer between 0 and 7.
+
+3.9.4 Other options affecting strength and speed
+------------------------------------------------
+
+   * `--level AMOUNT' 
+
+          The higher the level, the deeper GNU Go reads. Level 10 is
+          the default.  If GNU Go plays too slowly on your machine, you
+          may want to decrease it.
+
+This single parameter `--level' is the best way of choosing whether to
+play stronger or faster. It controls a host of other parameters which
+may themselves be set individually at the command line.  The default
+values of these parameters may be found by running `gnugo --help'.
+
+   Unless you are working on the program you probably don't need the
+remaining options in this category. Instead, just adjust the single
+variable `--level'. The following options are of use to developers
+tuning the program for performance and accuracy. For completeness, here
+they are.
+
+   * `-D', `--depth DEPTH' 
+
+          Deep reading cutoff. When reading beyond this depth (default
+          16) GNU Go assumes that any string which can obtain 3
+          liberties is alive. Thus GNU Go can read ladders to an
+          arbitrary depth, but will miss other types of capturing moves.
+
+   * `-B', `--backfill-depth DEPTH'
+
+          Deep reading cutoff. Beyond this depth (default 12) GNU Go
+          will no longer try backfilling moves in its reading.
+
+   * `--backfill2-depth DEPTH'
+
+          Another depth controlling how deeply GNU Go looks for
+          backfilling moves. The moves tried below `backfill2_depth'
+          are generally more obscure and time intensive than those
+          controlled by `backfill_depth', so this parameter has a lower
+          default.
+
+   * `-F', `--fourlib-depth DEPTH'
+
+          Deep reading cutoff. When reading beyond this depth (default
+          7) GNU Go assumes that any string which can obtain 4
+          liberties is alive.
+
+   * `-K', `--ko-depth DEPTH'
+
+          Deep reading cutoff. Beyond this depth (default 8) GNU Go no
+          longer tries very hard to analyze kos.
+
+   * `--branch-depth DEPTH'
+
+          This sets the `branch_depth', typically a little below the
+          `depth'. Between `branch_depth' and `depth', attacks on
+          strings with 3 liberties are considered but branching is
+          inhibited, so fewer variations are considered.  Below this
+          depth (default 13), GNU Go still tries to attack strings with
+          only 3 liberties, but only tries one move at each node.
+
+   * `--break-chain-depth DEPTH'
+
+          Set the `break_chain_depth'. Beyond this depth, GNU Go
+          abandons some attempts to defend groups by trying to capture
+          part of the surrounding chain.
+
+   * `--aa-depth DEPTH'
+
+          The reading function `atari_atari' looks for combinations
+          beginning with a series of ataris, and culminating with some
+          string having an unexpected change in status (e.g. alive to
+          dead or critical). This command line optio sets the parameter
+          `aa_depth' which determines how deeply this function looks
+          for combinations.
+
+   * `--superstring-depth'
+
+          A superstring (*note Superstrings::) is an amalgamation of
+          tightly strings. Sometimes the best way to attack or defend a
+          string is by attacking or defending an element of the
+          superstring.  Such tactics are tried below
+          `superstring_depth' and this command line option allows this
+          parameter to be set.
+
+   The preceeding options are documented with the reading code (*note
+Reading Basics::).
+
+   * `--owl-branch' Below this depth Owl only considers one move.
+     Default 8.
+
+   * `--owl-reading' Below this depth Owl assumes the dragon has
+     escaped.  Default 20.
+
+   * `--owl-node-limit'
+
+          If the number of variations exceeds this limit, Owl assumes
+          the dragon can make life. Default 1000. We caution the user
+          that increasing `owl_node_limit' does not necessarily
+          increase the strength of the program.
+
+   * `--owl-node-limit N'
+
+          If the number of variations exceeds this limit, Owl assumes
+          the dragon can make life. Default 1000.  We caution the user
+          that increasing `owl_node_limit' does not necessarily
+          increase the strength of the program.
+
+   * `--owl-distrust N'
+
+          Below this limit some owl reading is truncated.
+
+3.9.5 Ascii mode options
+------------------------
+
+   * `--color COLOR'
+
+          Choose your color ('black' or 'white').
+
+   * `--handicap NUMBER'
+
+          Choose the number of handicap stones (0-9)
+
+For more information about the following clock options see *Note
+Ascii::.
+
+   * `--clock SECONDS'
+
+          Initialize the timer.
+
+   * `--byo-time SECONDS'
+
+          Number of seconds per (Canadian) byo-yomi period
+
+   * `--byo-period STONES'
+
+          Number of stones per (Canadian) byo-yomi period
+
+3.9.6 Development options
+-------------------------
+
+   * `--replay COLOR'
+
+          Replay all moves in a game for either or both colors. If used
+          with the `-o' option the game record is annotated with move
+          values. This option requires `-l FILENAME'. The color can be:
+             * white: replay white moves only
+
+             * black: replay black moves only
+
+             * both: replay all moves
+          When the move found by genmove differs from the move in the
+          sgf file the values of both moves are reported thus:
+
+               Move 13 (white): GNU Go plays C6 (20.60) - Game move F4 (20.60)
+
+          This option is useful if one wants to confirm that a change
+          such as a speedup or other optimization has not affected the
+          behavior of the engine. Note that when several moves have the
+          same top value (or nearly equal) the move generated is not
+          deterministic (though it can be made deterministic by
+          starting with the same random seed). Thus a few deviations
+          from the move in the sgf file are to be expected. Only if the
+          two reported values differ should we conclude that the engine
+          plays differently from the engine which generated the sgf
+          file.  *Note Regression::.
+
+   * `-a', `--allpats'
+
+          Test all patterns, even those smaller in value than the
+          largest move found so far. This should never affect GNU Go's
+          final move, and it will make it run slower. However this can
+          be very useful when "tuning" GNU Go. It causes both the
+          traces and the output file (`-o') to be more informative.
+
+   * `-T', `--printboard': colored display of dragons.
+
+          Use rxvt, xterm or Linux Console. (*note Colored Display::)
+
+   * `--showtime'
+
+          Print timing information to stderr.
+
+   * `-E', `--printeyes': colored display of eye spaces
+
+          Use rxvt, xterm or Linux Console. (*note Colored Display::)
+
+   * `-d', `--debug LEVEL'
+
+          Produce debugging output. The debug level is given in
+          hexadecimal, using the bits defined in the following table
+          from `engine/gnugo.h'. A list of these may be produced using
+          `--debug-flags'. Here they are in hexadecimal:
+
+                 DEBUG_INFLUENCE             0x0001
+                 DEBUG_EYES                  0x0002
+                 DEBUG_OWL                   0x0004
+                 DEBUG_ESCAPE                0x0008
+                 DEBUG_MATCHER               0x0010
+                 DEBUG_DRAGONS               0x0020
+                 DEBUG_SEMEAI                0x0040
+                 DEBUG_LOADSGF               0x0080
+                 DEBUG_HELPER                0x0100
+                 DEBUG_READING               0x0200
+                 DEBUG_WORMS                 0x0400
+                 DEBUG_MOVE_REASONS          0x0800
+                 DEBUG_OWL_PERFORMANCE       0x1000
+                 DEBUG_LIFE                  0x2000
+                 DEBUG_FILLLIB               0x4000
+                 DEBUG_READING_PERFORMANCE   0x8000
+                 DEBUG_SCORING               0x010000
+                 DEBUG_AFTERMATH             0x020000
+                 DEBUG_ATARI_ATARI           0x040000
+                 DEBUG_READING_CACHE         0x080000
+                 DEBUG_TERRITORY             0x100000
+                 DEBUG_OWL_PERSISTENT_CACHE  0X200000
+                 DEBUG_TOP_MOVES             0x400000
+                 DEBUG_MISCELLANEOUS         0x800000
+                 DEBUG_ORACLE_STREAM         0x1000000
+
+          These debug flags are additive. If you want to turn on both
+          dragon and worm debugging you can use `-d0x420'.
+
+   * `--debug-flags'
+
+          Print the list of debug flags
+
+   * `-w', `--worms'
+
+          Print more information about worm data.
+
+   * `-m', `--moyo LEVEL'
+
+          moyo debugging, show moyo board. The LEVEL is fully
+          documented elsewhere (*note Influential Display::).
+
+   * `-b', `--benchmark NUMBER'
+
+          benchmarking mode - can be used with `-l'. Causes GNU Go to
+          play itself repeatedly, seeding the start of the game with a
+          few random moves. This method of testing the program is
+          largely superceded by use of the `twogtp' program.
+
+   * `-S', `--statistics'
+
+          Print statistics (for debugging purposes).
+
+   * `-t', `--trace'
+
+          Print debugging information. Use twice for more detail.
+
+   * `-r', `--seed SEED'
+
+          Set random number seed. This can be used to guarantee that
+          GNU Go will make the same decisions on multiple runs through
+          the same game. If `seed' is zero, GNU Go will play a
+          different game each time.
+
+   * `--decide-string LOCATION'
+
+          Invoke the tactical reading code (*note Tactical Reading:: to
+          decide whether the string at LOCATION can be captured, and if
+          so, whether it can be defended. If used with `-o', this will
+          produce a variation tree in SGF.
+
+   * `--decide-owl LOCATION'
+
+          Invoke the owl code (*note The Owl Code::) to decide whether
+          the dragon at LOCATION can be captured, and whether it can be
+          defended. If used with `-o', this will produce a variation
+          tree in SGF.
+
+   * `--decide-connection LOCATION1/LOCATION2'
+
+          Decide whether dragons at LOCATION1 and LOCATION2 can be
+          connected.  Useful in connection with `-o' to write the
+          variations to an SGF file.
+
+   * `--decide-dragon-data LOCATION'
+
+          Print complete information about the status of the dragon at
+          LOCATION.
+
+   * `--decide-semeai LOCATION1/LOCATION2'
+
+          At LOCATION1 and LOCATION2 are adjacent dragons of the
+          opposite color. Neither is aliveby itself, and their fate
+          (alive, dead or seki) depends on the outcome of a semeai
+          (capturing race).  Decide what happens.  Useful in connection
+          with `-o' to write the variations to an SGF file.
+
+   * `--decide-tactical-semeai LOCATION1/LOCATION2'
+
+          Similar to `--decide-semeai', except that moves proposed by
+          the owl code are not considered.
+
+   * `--decide-position'
+
+          Try to attack and defend every dragon with dragon.escape<6. If
+          used with `-o', writes the variations to an sgf file.
+
+   * `--decide-eye LOCATION'
+
+          Evaluates the eyespace at LOCATION and prints a report. You
+          can get more information by adding `-d0x02' to the command
+          line.  (*note Eye Local Game Values::.)
+
+   * `--decide-surrounded LOCATION'
+
+          A dragon is _surrounded_ if it is contained in the convex
+          hull of its unfriendly neighbor dragons. This does not mean
+          that it cannot escape, but it is often a good indicator that
+          the dragon is under attack. This option draws the convex hull
+          of the neighbor dragons and decides whether the dragon at
+          LOCATION is surrounded.
+
+   * `--decide-combination'
+
+          Calls the function `atari_atari' to decide whether there
+          exist combinations on the board.
+
+   * `--score METHOD'
+
+          Requires `-l' to specify which game to score and `-L' if you
+          want to score anywhere else than at the end of the game
+          record.  METHOD can be "estimate", "finish", or "aftermath".
+          "finish" and "aftermath" are appropriate when the game is
+          complete, or nearly so, and both try to supply an accurate
+          final score. Notice that if the game is not already finished
+          it will be played out, which may take quite a long time if
+          the game is far from complete. The "estimate" method may be
+          used to get a quick estimate during the middle of the game.
+          Any of these options may be combined with `--chinese-rules'
+          if you want to use Chinese (Area) counting.
+
+          If the option `-o OUTPUTFILENAME' is provided, the result
+          will also be written as a comment in the output file. For the
+          "finish" and "aftermath" scoring algorithms, the selfplayed
+          moves completing the game are also stored.
+
+             * finish
+
+                    Finish the game by selfplaying until two passes,
+                    then determine the status of all stones and compute
+                    territory.
+
+             * aftermath
+
+                    Finish the game by selfplaying until two passes,
+                    then accurately determine status of all stones by
+                    playing out the "aftermath", i.e.  playing on until
+                    all stones except ones involved in seki have become
+                    either unconditionally (in the strongest sense)
+                    alive or unconditionally dead (or captured). Slower
+                    than `--score finish', and while these algorithms
+                    usually agree, if they differ, `--score aftermath'
+                    is most likely to be correct.
+
+   * `--score aftermath --capture-all-dead --chinese-rules'
+
+          This combination mandates *Tromp-Taylor* scoring. The
+          Tromp-Taylor ruleset requires the game to be played out until
+          all dead stones are removed, then uses area (Chinese) scoring.
+          The option `--capture-all-dead' requires the aftermath code
+          to finish capturing all dead stones.
+
+3.9.7 Experimental options
+--------------------------
+
+Most of these are available as configure options and are described in
+*note Other Options::.
+
+   * `--options'
+
+          Print which experimental configure options were compiled into
+          the program.
+
+   * `--with-break-in'
+
+   * `--without-break-in'
+
+          Use or do not use the experimental break-in code. This option
+          has no effect at level 9 or below. The break in code is
+          enabled by default at level 10, and the only difference
+          between levels 9 and level 10 is that the break in code is
+          disabled at level 9.
+
+   * `--cosmic-gnugo'
+
+          Use center oriented influence.
+
+   * `--nofusekidb'
+
+          Turn off the fuseki database.
+
+   * `--nofuseki'
+
+          Turn off fuseki moves entirely
+
+   * `--nojosekidb'
+
+          Turn off the joseki database.
+
+   * `--mirror'
+
+          Try to play mirror go.
+
+   * `--mirror-limit N'
+
+          Stop mirroring when N stones are on the board.
+
+\1f
+File: gnugo.info,  Node: Overview,  Next: Analyzing,  Prev: User Guide,  Up: Top
+
+4 GNU Go engine overview
+************************
+
+This chapter is an overview of the GNU Go internals. Further
+documentation of how any one module or routine works may be found in
+later chapters or comments in the source files.
+
+   GNU Go starts by trying to understand the current board position as
+good as possible. Using the information found in this first phase, and
+using additional move generators, a list of candidate moves is
+generated.  Finally, each of the candidate moves is valued according to
+its territorial value (including captures or life-and-death effects),
+and possible strategical effects (such as strengthening a weak group).
+
+   Note that while GNU Go does, of course, do a lot of reading to
+analyze possible captures, life and death of groups etc., it does not
+(yet) have a fullboard lookahead.
+
+* Menu:
+
+* Examining the Position::             Gathering Information
+* Move Generators::                    Selecting Candidate Moves
+* Move Valuation::                     Selecting the best Move
+* Detailed Sequence of Events::                Outline of `genmove()'.
+* Roadmap::                            Description of the different files.
+* Coding Styles::                      Coding conventions.
+* Navigating the Source::              Navigating the Source.
+
+\1f
+File: gnugo.info,  Node: Examining the Position,  Next: Move Generators,  Up: Overview
+
+4.1 Gathering Information
+=========================
+
+This is by far the most important phase in the move generation.
+Misunderstanding life-and-death situations can cause gross mistakes.
+Wrong territory estimates will lead to inaccurate move valuations.  Bad
+judgement of weaknesses of groups make strategic mistakes likely.
+
+   This information gathering is done by the function
+`examine_position()'.  It first calls `make_worms()'.
+
+   Its first steps are very simple: it identifies sets of directly
+connected stones, called "worms", and notes their sizes and their
+number of liberties.
+
+   Soon after comes the most important step of the worm analysis: the
+tactical reading code (*note Tactical Reading::) is called for every
+worm. It tries to read out which worms can be captured directly, giving
+up as soon as a worm can reach 5 liberties. If a worm can be captured,
+the engine of course looks for moves defending against this capture.
+Also, a lot of effort is made to find virtually all moves that achieve
+the capture or defense of a worm.
+
+   After knowing which worms are tactically stable, we can make a first
+picture of the balance of power across the board: the *note Influence::
+code is called for the first time.
+
+   This is to aid the next step, the analysis of dragons. By a "dragon"
+we mean a group of stones that cannot be disconnected.
+
+   Naturally the first step in the responsible function `make_dragons()'
+is to identify these dragons, i.e. determine which worms cannot be
+disconnected from each other. This is partly done by patterns, but in
+most cases the specialized readconnect code is called. This module does
+a minimax search to determine whether two given worms can be connected
+with, resp. disconnected from each other.
+
+   Then we compute various measures to determine how strong or weak any
+given dragon is:
+   * A crude estimate of the number of eyes is made.
+
+   * The results of the influence computations is used to see which
+     dragons are adjacent to own territory or a moyo.
+
+   * A guess is made for the potential to escape if the dragon got
+     under attack.
+
+   For those dragons that are considered weak, a life and death analysis
+is made (*note The Owl Code::). If two dragons next to each other are
+found that are both not alive, we try to resolve this situation with
+the semeai module.
+
+   For a more detailed reference of the worm and dragon analysis (and
+explanations of the data structures used to store the information), see
+*Note Worms and Dragons::.
+
+   The influence code is then called second time to make a detailed
+analysis of likely territory. Of course, the life-and-death status of
+dragons are now taken into account.
+
+   The territorial results of the influence module get corrected by the
+break-in module. This specifically tries to analyze where an opponent
+could break into an alleged territory, with sequences that would be too
+difficult to see for the influence code.
+
+\1f
+File: gnugo.info,  Node: Move Generators,  Next: Move Valuation,  Prev: Examining the Position,  Up: Overview
+
+4.2 Move Generators
+===================
+
+Once we have found out all about the position it is time to generate
+the best move. Moves are proposed by a number of different modules
+called "move generators". The move generators themselves do not set the
+values of the moves, but enumerate justifications for them, called
+"move reasons". The valuation of the moves comes last, after all moves
+and their reasons have been generated.
+
+   For a list and explanation of move reasons used in GNU Go, and how
+they are evaluated, see *Note Move Generation::.
+
+   There are a couple of move generators that only extract data found in
+the previous phase, examining the position:
+
+   * `worm_reasons()' 
+
+          Moves that have been found to capture or defend a worm are
+          proposed as candidates.
+
+   * `owl_reasons()' 
+
+          The status of every dragon, as it has been determined by the
+          owl code (*note The Owl Code::) in the previous phase, is
+          reviewed. If the status is critical, the killing or defending
+          move gets a corresponding move reason.
+
+   * `semeai_move_reasons()' 
+
+          Similarly as `owl_reasons', this function proposes moves
+          relevant for semeais.
+
+   * `break_in_move_reasons()'
+
+          This suggests moves that have been found to break into
+          opponent's territory by the break-in module.
+
+   The following move generators do additional work:
+
+   * `fuseki()' 
+
+          Generate a move in the early fuseki, either in an empty
+          corner of from the fuseki database.
+
+   * `shapes()' 
+
+          This is probably the most important move generator.  It finds
+          patterns from `patterns/patterns.db',
+          `patterns/patterns2.db', `patterns/fuseki.db', and the joseki
+          files in the current position.  Each pattern is matched in
+          each of the 8 possible orientations obtainable by rotation and
+          reflection. If the pattern matches, a so called "constraint"
+          may be tested which makes use of reading to determine if the
+          pattern should be used in the current situation.  Such
+          constraints can make demands on number of liberties of
+          strings, life and death status, and reading out ladders, etc.
+          The patterns may call helper functions, which may be hand
+          coded (in `patterns/helpers.c') or autogenerated.
+
+          The patterns can be of a number of different classes with
+          different goals.  There are e.g. patterns which try to attack
+          or defend groups, patterns which try to connect or cut
+          groups, and patterns which simply try to make good shape. (In
+          addition to the large pattern database called by `shapes()',
+          pattern matching is used by other modules for different tasks
+          throughout the program. *Note Patterns::, for a complete
+          documentation of patterns.)
+
+   * `combinations()' 
+
+          See if there are any combination threats or atari sequences
+          and either propose them or defend against them.
+
+   * `revise_thrashing_dragon()' 
+
+          This module does not directly propose move: If we are clearly
+          ahead, and the last move played by the opponent is part of a
+          dead dragon, we want to attack that dragon again to be on the
+          safe side. This is done be setting the status of this
+          "thrashing dragon" to unkown and repeating the shape move
+          generation and move valution.
+
+   * `endgame_shapes()' 
+
+          If no move is found with a value greater than 6.0, this
+          module matches a set of extra patterns which are designed for
+          the endgame.  The endgame patterns can be found in
+          `patterns/endgame.db'.
+
+   * `revise_semeai()' 
+
+          If no move is found, this module changes the status of
+          opponent groups involved in a semeai from `DEAD' to
+          `UNKNOWN'.  After this, genmove runs `shapes' and
+          `endgame_shapes' again to see if a new move turns up.
+
+   * `fill_liberty()' 
+
+          Fill a common liberty. This is only used at the end of the
+          game. If necessary a backfilling or backcapturing move is
+          generated.
+
+\1f
+File: gnugo.info,  Node: Move Valuation,  Next: Detailed Sequence of Events,  Prev: Move Generators,  Up: Overview
+
+4.3 Move Valuation
+==================
+
+After the move generation modules have run, each proposed candidate
+move goes through a detailed valuation by the function
+`review_move_reasons'. This invokes some analysis to try to turn up
+other move reasons that may have been missed.
+
+   The most important value of a move is its territorial effect.  *note
+Influence and Territory:: explains in detail how this is determined.
+
+   This value is modified for all move reasons that cannot be expressed
+directly in terms of territory, such as combination attacks (where it
+is not clear which of several strings will get captured), strategical
+effects, connection moves, etc.  A large set heuristics is necessary
+here, e.g. to avoid duplication of such values. This is explained in
+more detail in *note Valuation::.
+
+\1f
+File: gnugo.info,  Node: Detailed Sequence of Events,  Next: Roadmap,  Prev: Move Valuation,  Up: Overview
+
+4.4 Detailed Sequence of Events
+===============================
+
+First comes the sequence of events when `examine_position()' is run
+from `genmove()'. This is for reference only.
+
+`purge_persistent_caches()'
+`make_worms()':
+  `compute_effective_sizes()'
+  `compute_unconditional_status()'
+  `find_worm_attacks_and_defenses()':
+    for each attackable worm:
+      set `worm.attack'
+      `change_attack()' to add the attack point
+    `find_attack_patterns()' to find a few more attacks
+    for each defensible worm:
+      set `worm.attack'
+      `change_defense()' to add the defense point
+    `find_defense_patterns()' to find a few more defense moves
+    find additional attacks and defenses by testing all
+      immediate liberties
+  find higher order liberties (for each worm)
+  find cutting stones (for each worm)
+  improve attacks and defenses: if capturing a string defends
+    another friendly string, or kills an unfriendly one, we
+    add points of defense or attack. Make repairs if adjacent
+    strings can both be attacked but not defended.
+  find worm lunches
+  find worm threats
+  identify inessential worms (such as nakade stones)
+`compute_worm_influence()':
+  `find_influence_patterns()'
+  `value_influence()'
+  `segment_influence()'
+`make_dragons()':
+  `find_cuts()'
+  `find_connections()'
+  `make_domains()' (determine eyeshapes)
+  `find_lunches()' (adjacent strings that can be captured)
+  `find_half_and_false_eyes()'
+  `eye_computations()': Compute the value of each eye space.
+    Store its attack and defense point.
+  `analyze_false_eye_territory()'
+  for each dragon `compute_dragon_genus()'
+  for each dragon `compute_escape()' and set escape route data
+  `resegment_initial_influence()'
+  `compute_refined_dragon_weaknesses()' (called again after owl)
+  for each dragon `compute_crude_status()'
+  `find_neighbor_dragons()'
+  for each dragon compute surround status
+  for each weak dragon run `owl_attack()' and `owl_defend()'
+    to determine points of attack and defense
+  for each dragon compute dragon.status
+  for each thrashing dragon compute owl threats
+  for each dragon compute dragon.safety
+  `revise_inessentiality()'
+  `semeai()':
+    for every semeai, run `owl_analyze_semeai()'
+    `find_moves_to_make_seki()'
+  `identify_thrashing_dragons()'
+  `compute_dragon_influence()':
+    `compute_influence()'
+    `break_territories()' (*note Break Ins::)
+  `compute_refined_dragon_weaknesses()'
+
+   Now a summary of the sequence of events during the move generation
+and selection phases of `genmove()', which take place after the
+information gathering phase has been completed:
+
+`estimate_score()'
+`choose_strategy()'
+`collect_move_reasons()':
+  `worm_reasons()': for each attack and defense point add a move reason
+  `semeai_reasons()': for each dragon2.semeai point add a move reason
+  `owl_reasons()': for each owl attack and defense point add a move reason
+  `break_in_reasons()': for each breakin found add a move reason
+`fuseki()'
+`break_mirror_go()'
+`shapes()': match patterns around the board (*note Patterns Overview::)
+`combinations()': look for moves with a double meaning and other tricks
+  `find_double_threats()'
+  `atari_atari()'
+`review_move_reasons()'
+if ahead and there is a thrashing dragon, consider it
+  alive and reconsider the position
+`endgame_shapes()'
+`endgame()'
+if no move found yet, revisit any semeai, change status of dead opponent
+  to alive, then run `shapes()' and `endgame_shapes()' again
+if no move found yet, run `fill_liberty()'
+
+\1f
+File: gnugo.info,  Node: Roadmap,  Next: Coding Styles,  Prev: Detailed Sequence of Events,  Up: Overview
+
+4.5 Roadmap
+===========
+
+The GNU Go engine is contained in two directories, `engine/' and
+`patterns/'. Code related to the user interface, reading and writing of
+Smart Game Format files, and testing are found in the directories
+`interface/', `sgf/', and `regression/'. Code borrowed from other GNU
+programs is contained in `utils/'. That directory also includes some
+code developed within GNU Go which is not go specific. Documentation is
+in `doc/'.
+
+   In this document we will describe some of the individual files
+comprising the engine code in `engine/' and `patterns/'. In `interface/'
+we mention two files:
+
+   * `gmp.c'
+
+          This is the Go Modem Protocol interface (courtesy of William
+          Shubert and others). This takes care of all the details of
+          exchanging setup and moves with Cgoban, or any other driving
+          program recognizing the Go Modem Protocol.
+
+   * `main.c'
+
+          This contains `main()'. The `gnugo' target is thus built in
+          the `interface/' directory.
+
+4.5.1 Files in `engine/'
+------------------------
+
+In `engine/' there are the following files:
+
+   * `aftermath.c'
+
+          Contains algorithms which may be called at the end of the
+          game to generate moves that will generate moves to settle the
+          position, if necessary playing out a position to determine
+          exactly the status of every group on the board, which GNU Go
+          can get wrong, particularly if there is a seki. This module is
+          the basis for the most accurate scoring algorithm available
+          in GNU Go.
+
+   * `board.c'
+
+          This file contains code for the maintenance of the board.
+          For example it contains the important function `trymove()'
+          which tries a move on the board, and `popgo()' which removes
+          it by popping the move stack. At the same time vital
+          information such as the number of liberties for each string
+          and their location is updated incrementally.
+
+   * `breakin.c'
+
+          Code to detect moves which can break into supposed territory
+          and moves to prevent this.
+
+   * `cache.c' and `cache.h'
+
+          As a means of speeding up reading, computed results are
+          cached so that they can be quickly reused if the same
+          position is encountered through e.g. another move ordering.
+          This is implemented using a hash table.
+
+   * `clock.c' and `clock.h'
+
+          Clock code, including code allowing GNU Go to automatically
+          adjust its level in order to avoid losing on time in
+          tournaments.
+
+   * `combination.c'
+
+          When something can (only) be captured through a series of
+          ataris or other threats we call this a combination attack.
+          This file contains code to find such attacks and moves to
+          prevent them.
+
+   * `dragon.c'
+
+          This contains `make_dragons()'. This function is executed
+          before the move-generating modules `shapes()' `semeai()' and
+          the other move generators but after `make_worms()'. It tries
+          to connect worms into dragons and collect important
+          information about them, such as how many liberties each has,
+          whether (in GNU Go's opinion) the dragon can be captured, if
+          it lives, etc.
+
+   * `endgame.c'
+
+          Code to find certain types of endgame moves.
+
+   * `filllib.c'
+
+          Code to force filling of dame (backfilling if necessary) at
+          the end of the game.
+
+   * `fuseki.c'
+
+          Generates fuseki (opening) moves from a database. Also
+          generates moves in empty corners.
+
+   * `genmove.c'
+
+          This file contains `genmove()' and its supporting routines,
+          particularly `examine_position()'.
+
+   * `globals.c'
+
+          This contains the principal global variables used by GNU Go.
+
+   * `gnugo.h'
+
+          This file contains declarations forming the public interface
+          to the engine.
+
+   * `hash.c' and `hash.h'
+
+          Hashing code implementing Zobrist hashing. (*note Hashing::)
+          The code in `hash.c' provides a way to hash board positions
+          into compact descriptions which can be efficiently compared.
+          The caching code in `cache.c' makes use of the board hashes
+          when storing and retrieving read results.
+
+   * `influence.c' and `influence.h'.
+
+          This code determines which regions of the board are under the
+          influence of either player.  (*note Influence::)
+
+   * `liberty.h'
+
+          Header file for the engine. The name "liberty" connotes
+          freedom (*note Copying::).
+
+   * `matchpat.c'
+
+          This file contains the pattern matcher `matchpat()', which
+          looks for patterns at a particular board location. The actual
+          patterns are in the `patterns/' directory. The function
+          `matchpat()' is called by every module which does pattern
+          matching, notably `shapes'.
+
+   * `move_reasons.c' and `move_reasons.h'
+
+          Code for keeping track of move reasons.
+
+   * `movelist.c'
+
+          Supporting code for lists of moves.
+
+   * `optics.c'
+
+          This file contains the code to recognize eye shapes,
+          documented in *Note Eyes::.
+
+   * `oracle.c'
+
+          Code to fork off a second GNU Go process which can be used to
+          simulate reading with top level information (e.g. dragon
+          partitioning) available.
+
+   * `owl.c'
+
+          This file does life and death reading. Move generation is
+          pattern based and the code in `optics.c' is used to evaluate
+          the eyespaces for vital moves and independent life. A dragon
+          can also live by successfully escaping. Semeai reading along
+          the same principles is also implemented in this file.
+
+   * `persistent.c'
+
+          Persistent cache which allows reuse of read results at a
+          later move or with additional stones outside an active area,
+          which are those intersections thought to affect the read
+          result.
+
+   * `printutils.c'
+
+          Print utilities.
+
+   * `readconnect.c' and `readconnect.h'
+
+          This file contains code to determine whether two strings can
+          be connected or disconnected.
+
+   * `reading.c'
+
+          This file contains code to determine whether any given string
+          can be attacked or defended. *Note Tactical Reading::, for
+          details.
+
+   * `semeai.c'
+
+          This file contains `semeai()', the module which detects
+          dragons in semeai. To determine the semeai results the semeai
+          reading in `owl.c' is used.
+
+   * `sgfdecide.c'
+
+          Code to generate sgf traces for various types of reading.
+
+   * `shapes.c'
+
+          This file contains `shapes()', the module called by
+          `genmove()' which tries to find moves which match a pattern
+          (*note Patterns::).
+
+   * `showbord.c'
+
+          This file contains `showboard()', which draws an ASCII
+          representation of the board, depicting dragons (stones with
+          same letter) and status (color). This was the primary
+          interface in GNU Go 1.2, but is now a debugging aid.
+
+   * `surround.c'
+
+          Code to determine whether a dragon is surrounded and to find
+          moves to surround with or break out with.
+
+   * `utils.c'
+
+          An assortment of utilities, described in greater detail below.
+
+   * `value_moves.c'
+
+          This file contains the code which assigns values to every move
+          after all the move reasons are generated. It also tries to
+          generate certain kinds of additional move reasons.
+
+   * `worm.c'
+
+          This file contains `make_worms()', code which is run at the
+          beginning of each move cycle, before the code in `dragon.c',
+          to determine the attributes of every string. These attributes
+          are things like liberties, wether the string can be captured
+          (and how), etc
+
+4.5.2 Files in `patterns/'
+--------------------------
+
+The directory `patterns/' contains files related to pattern matching.
+Currently there are several types of patterns. A partial list:
+
+   * move generation patterns in `patterns.db' and `patterns2.db'
+
+   * move generation patterns in files `hoshi.db' etc. which are
+     automatically build from the files `hoshi.sgf' etc. These comprise
+     our small Joseki library.
+
+   * patterns in `owl_attackpats.db', `owl_defendpats.db' and
+     `owl_vital_apats.db'. These generate moves for the owl code (*note
+     The Owl Code::).
+
+   * Connection patterns in `conn.db' (*note Connections Database::)
+
+   * Influence patterns in `influence.db' and `barriers.db' (*note
+     Influence::)
+
+   * eye patterns in `eyes.db' (*note Eyes::).
+
+   The following list contains, in addition to distributed source files
+some intermediate automatically generated files such as `patterns.c'.
+These are C source files produced by "compiling" various pattern
+databases, or in some cases (such as `hoshi.db') themselves
+automatically generated pattern databases produced by "compiling"
+joseki files in Smart Game Format.
+
+   * `conn.db'
+
+          Database of connection patterns.
+
+   * `conn.c'
+
+          Automatically generated file, containing connection patterns
+          in form of struct arrays, compiled by `mkpat' from `conn.db'.
+
+   * `eyes.c'
+
+          Automatically generated file, containing eyeshape patterns in
+          form of struct arrays, compiled by `mkpat' from `eyes.db'.
+
+   * `eyes.h'
+
+          Header file for `eyes.c'.
+
+   * `eyes.db'
+
+          Database of eyeshape patterns. *Note Eyes::, for details.
+
+   * `helpers.c'
+
+          These are helper functions to assist in evaluating moves by
+          matchpat.
+
+   * `hoshi.sgf'
+
+          Smart Game Format file containing 4-4 point openings
+
+   * `hoshi.db'
+
+          Automatically generated database of 4-4 point opening
+          patterns, make by compiling `hoshi.sgf'
+
+   * `joseki.c'
+
+          Joseki compiler, which takes a joseki file in Smart Game
+          Format, and produces a pattern database.
+
+   * `komoku.sgf'
+
+          Smart Game Format file containing 3-4 point openings
+
+   * `komoku.db'
+
+          Automatically generated database of 3-4 point opening
+          patterns, make by compiling `komoku.sgf'
+
+   * `mkeyes.c'
+
+          Pattern compiler for the eyeshape databases. This program
+          takes `eyes.db' as input and produces `eyes.c' as output.
+
+   * `mkpat.c'
+
+          Pattern compiler for the move generation and connection
+          databases. Takes the file `patterns.db' together with the
+          autogenerated Joseki pattern files `hoshi.db', `komoku.db',
+          `sansan.db', `mokuhadzushi.db', `takamoku.db' and produces
+          `patterns.c', or takes `conn.db' and produces `conn.c'.
+
+   * `mokuhazushi.sgf'
+
+          Smart Game Format file containing 5-3 point openings
+
+   * `mokuhazushi.db'
+
+          Pattern database compiled from mokuhadzushi.sgf
+
+   * `sansan.sgf'
+
+          Smart Game Format file containing 3-3 point openings
+
+   * `sansan.db'
+
+          Pattern database compiled from `sansan.sgf'
+
+   * `takamoku.sgf'
+
+          Smart Game Format file containing 5-4 point openings
+
+   * `takamoku.db'
+
+          Pattern database compiled from takamoku.sgf.
+
+   * `patterns.c'
+
+          Pattern data, compiled from patterns.db by mkpat.
+
+   * `patterns.h'
+
+          Header file relating to the pattern databases.
+
+   * `patterns.db' and `patterns2.db'
+
+          These contain pattern databases in human readable form.
+
+
+\1f
+File: gnugo.info,  Node: Coding Styles,  Next: Navigating the Source,  Prev: Roadmap,  Up: Overview
+
+4.6 Coding styles and conventions
+=================================
+
+4.6.1 Coding Conventions
+------------------------
+
+Please follow the coding conventions at:
+`http://www.gnu.org/prep/standards_toc.html'
+
+   Please preface every function with a brief description of its usage.
+
+   Please help to keep this Texinfo documentation up-to-date.
+
+4.6.2 Tracing
+-------------
+
+A function `gprintf()' is provided. It is a cut-down `printf',
+supporting only `%c', `%d', `%s', and without field widths, etc. It
+does, however, add some useful facilities:
+
+   * `%m'
+
+          Takes two parameters, and displays a formatted board
+          co-ordinate.
+
+   * indentation
+
+          Trace messages are automatically indented to reflect the
+          current stack depth, so it is clear during read-ahead when it
+          puts a move down or takes one back.
+
+   * "outdent"
+
+          As a workaround, `%o' at the beginning of the: format string
+          suppresses the indentation.
+
+   Normally `gprintf()' is wrapped in one of the following:
+
+   `TRACE(fmt, ...)':
+
+     Print the message if the 'verbose' variable > 0.  (verbose is set
+     by `-t' on the command line)
+
+   `DEBUG(flags, fmt, ...)':
+
+     While `TRACE' is intended to afford an overview of what GNU Go is
+     considering, `DEBUG' allows occasional in depth study of a module,
+     usually needed when something goes wrong. `flags' is one of the
+     `DEBUG_*' symbols in `engine/gnugo.h'.  The `DEBUG' macro tests to
+     see if that bit is set in the `debug' variable, and prints the
+     message if it is.  The debug variable is set using the `-d'
+     command-line option.
+
+   The variable `verbose' controls the tracing. It can equal 0 (no
+trace), 1, 2, 3 or 4 for increasing levels of tracing. You can set the
+trace level at the command line by `-t' for `verbose=1', `-t -t' for
+`verbose=2', etc. But in practice if you want more verbose tracing than
+level 1 it is better to use GDB to reach the point where you want the
+tracing; you will often find that the variable `verbose' has been
+temporarily set to zero and you can use the GDB command `set var
+verbose=1' to turn the tracing back on.
+
+4.6.3 Assertions
+----------------
+
+Related to tracing are assertions. Developers are strongly encouraged
+to pepper their code with assertions to ensure that data structures are
+as they expect. For example, the helper functions make assertions about
+the contents of the board in the vicinity of the move they are
+evaluating.
+
+   `ASSERT()' is a wrapper around the standard C `assert()' function.
+In addition to the test, it takes an extra pair of parameters which are
+the co-ordinates of a "relevant" board position. If an assertion fails,
+the board position is included in the trace output, and `showboard()'
+and `popgo()' are called to unwind and display the stack.
+
+4.6.4 FIXME
+-----------
+
+We have adopted the convention of putting the word FIXME in comments to
+denote known bugs, etc.
+
+\1f
+File: gnugo.info,  Node: Navigating the Source,  Prev: Coding Styles,  Up: Overview
+
+4.7 Navigating the Source
+=========================
+
+If you are using Emacs, you may find it fast and convenient to use
+Emacs' built-in facility for navigating the source. Switch to the root
+directory `gnugo-3.6/' and execute the command:
+
+     find . -print|grep "\.[ch]$" | xargs etags
+
+   This will build a file called `gnugo-3.6/TAGS'. Now to find any GNU
+Go function, type `M-.' and enter the command which you wish to find,
+or just `RET' if the cursor is at the name of the function sought.
+
+   The first time you do this you will be prompted for the location of
+the TAGS table.  Enter the path to `gnugo-3.6/TAGS', and henceforth you
+will be able to find any function with a minimum of keystrokes.
+
+\1f
+File: gnugo.info,  Node: Analyzing,  Next: Move Generation,  Prev: Overview,  Up: Top
+
+5 Analyzing GNU Go's moves
+**************************
+
+In this chapter we will discuss methods of finding out how GNU Go
+understands a given position. These methods will be of interest to
+anyone working on the program, or simply curious about its workings.
+
+   In practice, most tuning of GNU Go is done in conjunction with
+maintaining the `regression/' directory (*note Regression::).
+
+   We assume that you have a game GNU Go played saved as an sgf file,
+and you want to know why it made a certain move.
+
+* Menu:
+
+* Traces::                     Analyzing traces in GNU Go 3.6
+* Output File::                        The Output File
+* Decide string::              Checking the reading code
+* Decide dragon::              Checking the owl code
+* GTP and GDB techniques::      GTP and GDB techniques
+* view.pike::                   Debugging on a Graphic Board
+* Scoring::                     Finding out the winner of the game
+* Colored Display::             Colored Display
+
+\1f
+File: gnugo.info,  Node: Traces,  Next: Output File,  Up: Analyzing
+
+5.1 Interpreting Traces
+=======================
+
+A quick way to find out roughly the reason for a move is to run
+
+     gnugo -l FILENAME -t -L MOVE NUMBER
+
+   (You may also want to add `--quiet' to suppress the copyright
+message.) In GNU Go 3.6, the moves together with their reasons are
+listed, followed by a numerical analysis of the values given to each
+move.
+
+   If you are tuning (*note Tuning::) you may want to add the `-a'
+option. This causes GNU Go to report all patterns matched, even ones
+that cannot affect the outcome of the move. The reasons for doing this
+is that you may want to modify a pattern already matched instead of
+introducing a new one.
+
+   If you use the `-w' option, GNU Go will report the statuses of worms
+and dragons around the board. This type of information is available by
+different methods, however (*note view.pike::, *note Colored Display::).
+
+\1f
+File: gnugo.info,  Node: Output File,  Next: Decide string,  Prev: Traces,  Up: Analyzing
+
+5.2 The Output File
+===================
+
+If GNU Go is invoked with the option `-o filename' it will produce an
+output file. This option can be added at the command line in the Go
+Modem Protocol Setup Window of CGoban. The output file will show the
+locations of the moves considered and their weights. It is worth noting
+that by enlarging the CGoban window to its fullest size it can display
+3 digit numbers. Dragons with status `DEAD' are labelled with an `X',
+and dragons with status `CRITICAL' are labelled with a `!'.
+
+   If you have a game file which is not commented this way, or which
+was produced by a non-current version of GNU Go you may ask GNU Go to
+produce a commented version by running:
+
+     gnugo --quiet -l <old file> --replay <color> -o <new file>
+
+Here <color> can be 'black,' 'white' or 'both'. The replay option will
+also help you to find out if your current version of GNU Go would play
+differently than the program that created the file.
+
+\1f
+File: gnugo.info,  Node: Decide string,  Next: Decide dragon,  Prev: Output File,  Up: Analyzing
+
+5.3 Checking the reading code
+=============================
+
+The `--decide-string' option is used to check the tactical reading code
+(*note Tactical Reading::). This option takes an argument, which is a
+location on the board in the usual algebraic notation (e.g.
+`--decide-string C17'). This will tell you whether the reading code (in
+`engine/reading.c') believes the string can be captured, and if so,
+whether it believes it can be defended, which moves it finds to attack
+or defend the move, how many nodes it searched in coming to these
+conclusions. Note that when GNU Go runs normally (not with
+`--decide-string') the points of attack and defense are computed when
+`make_worms()' runs and cached in `worm.attack' and `worm.defend'.
+
+   If used with an output file (`-o FILENAME') `--decide-string' will
+produce a variation tree showing all the variations which are
+considered. This is a useful way of debugging the reading code, and
+also of educating yourself with the way it works. The variation tree
+can be displayed graphically using CGoban.
+
+   At each node, the comment contains some information. For example you
+may find a comment:
+
+
+     attack4-B at D12 (variation 6, hash 51180fdf)
+     break_chain D12: 0
+     defend3 D12: 1 G12 (trivial extension)
+
+   This is to be interpreted as follows. The node in question was
+generated by the function `attack3()' in `engine/reading.c', which was
+called on the string at `D12'. The data in parentheses tell you the
+values of `count_variations' and `hashdata.hashval'.
+
+   The second value ("hash") you probably will not need to know unless
+you are debugging the hash code, and we will not discuss it.  But the
+first value ("variation") is useful when using the debugger `gdb'. You
+can first make an output file using the `-o' option, then walk through
+the reading with `gdb', and to coordinate the SGF file with the
+debugger, display the value of `count_variations'. Specifically, from
+the debugger you can find out where you are as follows:
+
+     (gdb) set dump_stack()
+     B:D13 W:E12 B:E13 W:F12 B:F11  (variation 6)
+
+   If you place yourself right after the call to `trymove()' which
+generated the move in question, then the variation number in the SGF
+file should match the variation number displayed by `dump_stack()', and
+the move in question will be the last move played (F11 in this example).
+
+   This displays the sequence of moves leading up to the variation in
+question, and it also prints `count_variations-1'.
+
+   The second two lines tell you that from this node, the function
+`break_chain()' was called at D12 and returned 0 meaning that no way
+was found of rescuing the string by attacking an element of the
+surrounding chain, and the function `defend3()' was called also at D12
+and returned 1, meaning that the string can be defended, and that G12
+is the move that defends it. If you have trouble finding the function
+calls which generate these comments, try setting `sgf_dumptree=1' and
+setting a breakpoint in `sgf_trace'.
+
+\1f
+File: gnugo.info,  Node: Decide dragon,  Next: GTP and GDB techniques,  Prev: Decide string,  Up: Analyzing
+
+5.4 Checking the Owl Code
+=========================
+
+You can similarly debug the Owl code using the option
+`--decide-dragon'. Usage is entirely similar to `--decide-string', and
+it can be used similarly to produce variation trees. These should be
+typically much smaller than the variation trees produced by
+`--decide-string'.
+
+\1f
+File: gnugo.info,  Node: GTP and GDB techniques,  Next: view.pike,  Prev: Decide dragon,  Up: Analyzing
+
+5.5 GTP and GDB techniques
+==========================
+
+You can use the Go Text Protocol (*note GTP::) to determine the
+statuses of dragons and other information needed for debugging. The GTP
+command `dragon_data P12' will list the dragon data of the dragon at
+`P12' and `worm_data' will list the worm data; other GTP commands may
+be useful as well.
+
+   You can also conveniently get such information from GDB.  A
+suggested `.gdbinit' file may be found in *Note Debugging::. Assuming
+this file is loaded, you can list the dragon data with the command:
+
+     (gdb) dragon P12
+
+   Similarly you can get the worm data with `worm P12'.
+
+\1f
+File: gnugo.info,  Node: view.pike,  Next: Scoring,  Prev: GTP and GDB techniques,  Up: Analyzing
+
+5.6 Debugging on a Graphical Board
+==================================
+
+The quickest way to analyze most positions is to use the tool
+`view.pike' in the `regression' directory. It can be started with a
+testcase specified, e.g. `pike view.pike strategy:40' or at a move in
+an sgf file, e.g. `pike view.pike mistake.sgf:125'.  When started it
+shows the position on a grapical board on which it also marks
+information like move values, dragon status, and so on. By clicking on
+the board further information about the valuation of moves, contents of
+various data structures, and other data can be made available.
+
+   Specific information on how to use `view.pike' for influence tuning
+can be found in *Note Influence Tuning::.
+
+\1f
+File: gnugo.info,  Node: Scoring,  Next: Colored Display,  Prev: view.pike,  Up: Analyzing
+
+5.7 Scoring the game
+====================
+
+GNU Go can score the game. Normally GNU Go will report its opinion about
+the score at the end of the game, but if you want this information about
+a game stored in a file, use the `--score' option (*note Invoking GNU
+Go::).
+
+\1f
+File: gnugo.info,  Node: Colored Display,  Prev: Scoring,  Up: Analyzing
+
+5.8 Colored Display
+===================
+
+Various colored displays of the board may be obtained in a color
+`xterm' or `rxvt' window. Xterm will only work if xterm is compiled
+with color support. If the colors are not displayed on your xterm, try
+`rxvt'.  You may also use the Linux console. The colored display will
+work best if the background color is black; if this is not the case you
+may want to edit your `.Xdefaults' file or add the options `-bg black
+-fg white' to `xterm' or `rxvt'.  On Mac OS X put `setenv TERM
+xterm-color' in your `.tcshrc' file to enable color in the terminal.
+
+5.8.1 Dragon Display
+--------------------
+
+You can get a colored ASCII display of the board in which each dragon
+is assigned a different letter; and the different `matcher_status'
+values (`ALIVE', `DEAD', `UNKNOWN', `CRITICAL') have different colors.
+This is very handy for debugging. Actually two diagrams are generated.
+The reason for this is concerns the way the matcher status is computed.
+The dragon_status (*note Dragons::) is computed first, then for some,
+but not all dragons, a more accurate owl status is computed. The
+matcher status is the owl status if available; otherwise it is the
+dragon_status. Both the dragon_status and the owl_status are displayed.
+The color scheme is as follows:
+
+     green = alive
+     cyan = dead
+     red = critical
+     yellow = unknown
+     magenta = unchecked
+
+   To get the colored display, save a game in sgf format using CGoban,
+or using the `-o' option with GNU Go itself.
+
+   Open an `xterm' or `rxvt' window.
+
+   Execute `gnugo -l [filename] -L [movenum] -T' to get the colored
+display.
+
+   Other useful colored displays may be obtained by using instead:
+
+5.8.2 Eye Space Display
+-----------------------
+
+Instead of `-T', try this with `-E'. This gives a colored display of
+the eyespaces, with marginal eye spaces marked `!' (*note Eyes::).
+
+\1f
+File: gnugo.info,  Node: Move Generation,  Next: Worms and Dragons,  Prev: Analyzing,  Up: Top
+
+6 Move generation
+*****************
+
+* Menu:
+
+* Move generation Intro::      Introduction.
+* Move Reasons::               Generation of move reasons.
+* Move Reason Details::                Detailed Descriptions of Move Reasons
+* Valuation::                  Valuating the moves
+* End Game::                   Endgame move generation
+
+\1f
+File: gnugo.info,  Node: Move generation Intro,  Next: Move Reasons,  Up: Move Generation
+
+6.1 Introduction
+================
+
+GNU Go 3.0 introduced a move generation scheme substantially different
+from earlier versions. In particular, it was different from the method
+of move generation in GNU Go 2.6.
+
+   In the old scheme, various move generators suggested different moves
+with attached values. The highest such value then decided the move.
+There were two important drawbacks with this scheme:
+
+   * Efficient multipurpose moves could only be found by patterns which
+     explicitly looked for certain combinations, such as a simultaneous
+     connection and cut. There was also no good way to e.g. choose among
+     several attacking moves.
+
+   * The absolute move values were increasingly becoming harder to tune
+     with the increasing number of patterns. They were also fairly
+     subjective and the tuning could easily break in unexpected ways
+     when something changed, e.g. the worm valuation.
+
+   The basic idea of the new move generation scheme is that the various
+move generators suggest reasons for moves, e.g. that a move captures
+something or connects two strings, and so on. When all reasons for the
+different moves have been found, the valuation starts. The primary
+advantages are
+
+   * The move reasons are objective, in contrast to the move values in
+     the old scheme. Anyone can verify whether a suggested move reason
+     is correct.
+
+   * The centralized move valuation makes tuning easier. It also allows
+     for style dependent tuning, e.g. how much to value influence
+     compared to territory. Another possibility is to increase the value
+     of safe moves in a winning position.
+
+\1f
+File: gnugo.info,  Node: Move Reasons,  Next: Move Reason Details,  Prev: Move generation Intro,  Up: Move Generation
+
+6.2 Generation of move reasons
+==============================
+
+Each move generator suggests a number of moves.  It justifies each move
+suggestion with one or move "move reasons".  These move reasons are
+collected at each intersection where the moves are suggested for later
+valuation. Here is a partial list of of move reasons considered by GNU
+Go. (The complete list may be found in `move_reasons.h'.)
+
+`ATTACK_MOVE'
+`DEFEND_MOVE'
+     Attack or defend a worm.
+
+`ATTACK_THREAT_MOVE'
+`DEFEND_THREAT_MOVE'
+     Threaten to attack or defend a worm.
+
+`EITHER_MOVE'
+     A move that either achieves one goal or another (at the moment
+     this only used for attacks on worms).
+
+`ALL_MOVE'
+     At the moment this is used for a move that defends two worms
+     threatened by a double attack.
+
+`CONNECT_MOVE'
+`CUT_MOVE'
+     Connect or cut two worms.
+
+`ANTISUJI_MOVE'
+     Declare an antisuji or forbidden move.
+
+`SEMEAI_MOVE'
+`SEMEAI_THREAT'
+     Win or threaten to win a semeai.
+
+`EXPAND_TERRITORY_MOVE'
+
+`EXPAND_MOYO_MOVE'
+     Move expanding our territory/moyo. These reasons are at the moment
+     treated identically.
+
+`VITAL_EYE_MOVE'
+     A vital point for life and death.
+
+`STRATEGIC_ATTACK_MOVE'
+`STRATEGIC_DEFEND_MOVE'
+     Moves added by 'a' and 'd' class patterns (*note Pattern
+     Classification::) which (perhaps intangibly) attack or defend a
+     dragon.
+
+`OWL_ATTACK_MOVE'
+`OWL_DEFEND_MOVE'
+     An owl attack or defense move.
+
+`OWL_ATTACK_THREAT'
+`OWL_DEFEND_THREAT'
+     A threat to owl attack or defend a group.
+
+`OWL_PREVENT_THREAT'
+     A move to remove an owl threat.
+
+`UNCERTAIN_OWL_ATTACK'
+`UNCERTAIN_OWL_DEFENSE'
+     An uncertain owl attack or defense. This means that the owl code
+     could not decide the outcome, because the owl node limit was
+     reached.
+
+`MY_ATARI_ATARI_MOVE'
+     A move that starts a chain of ataris, eventually leading to a
+     capture.
+
+`YOUR_ATARI_ATARI_MOVE'
+     A move that if played by the opponent starts a chain of ataris for
+     the opponent, leading to capture, which is also a safe move for
+     us. Preemptively playing such a move almost always defends the
+     threat.
+
+   The attack and defend move types can have a suffix to denote moves
+whose result depends on a ko, e.g. `OWL_ATTACK_MOVE_GOOD_KO'. Here
+`..._GOOD_KO' and `..._BAD_KO' correspond to `KO_A' and `KO_B' as
+explained in *note Ko::.  See `engine/move_reasons.h' for the full of
+move reasons.
+
+   *NOTICE:* Some of these are reasons for *not* playing a move.
+
+   More detailed discussion of these move reasons will be found in the
+next section.
+
+\1f
+File: gnugo.info,  Node: Move Reason Details,  Next: Valuation,  Prev: Move Reasons,  Up: Move Generation
+
+6.3 Detailed Descriptions of various Move Reasons
+=================================================
+
+* Menu:
+
+* Attack and Defense::             Worm Attack and Defense
+* Threats to Attack or Defend::    Worm Threats
+* Multi Attack or Defense::        Combined Attacks and Defenses
+* Cutting and Connecting::         Cutting and Connecting moves
+* Semeai::                         Semeai winning moves
+* Making eyes::                    Vital eye moves
+* Antisuji moves::                 Never play these!
+* Territorial moves::              Block or expand territory
+* Owl attack and defense::         Owl Attack and Defense
+* Combination Attacks::            Coordinated threats such as double ataris
+
+\1f
+File: gnugo.info,  Node: Attack and Defense,  Next: Threats to Attack or Defend,  Up: Move Reason Details
+
+6.3.1 Attacking and defending moves
+-----------------------------------
+
+A move which tactically captures a worm is called an "attack move" and a
+move which saves a worm from being tactically captured is called a
+"defense move". It is understood that a defense move can only exist if
+the worm can be captured, and that a worm without defense only is
+attacked by moves that decrease the liberty count or perform necessary
+backfilling.
+
+   It is important that all moves which attack or defend a certain
+string are found, so that the move generation can make an informed
+choice about how to perform a capture, or find moves which capture
+and/or defend several worms.
+
+   Attacking and defending moves are first found in `make_worms' while
+it evaluates the tactical status of all worms, although this step only
+gives one attack and defense (if any) move per worm. Immediately after,
+still in `make_worms', all liberties of the attacked worms are tested
+for additional attack and defense moves. More indirect moves are found
+by `find_attack_patterns' and `find_defense_patterns', which match the
+A (attack) and D (defense) class patterns in `patterns/attack.db' and
+`patterns/defense.db' As a final step, all moves which fill some
+purpose at all are tested whether they additionally attacks or defends
+some worm. (Only unstable worms are analyzed.)
+
+\1f
+File: gnugo.info,  Node: Threats to Attack or Defend,  Next: Multi Attack or Defense,  Prev: Attack and Defense,  Up: Move Reason Details
+
+6.3.2 Threats to Attack or Defend
+---------------------------------
+
+A threat to attack a worm, but where the worm can be defended is used as
+a secondary move reason.  This move reason can enhance the value of a
+move so that it becomes sente.  A threatening move without any other
+justification can also be used as a ko threat.  The same is true for a
+move that threatens defense of a worm, but where the worm can still be
+captured if the attacker doesn't tenuki.
+
+   Threats found by the owl code are called *owl threats* and they have
+their own owl reasons.
+
+\1f
+File: gnugo.info,  Node: Multi Attack or Defense,  Next: Cutting and Connecting,  Prev: Threats to Attack or Defend,  Up: Move Reason Details
+
+6.3.3 Multiple attack or defense moves
+--------------------------------------
+
+Sometimes a move attacks at least one of a number of worms or
+simultaneously defends all of several worms. These moves are noted by
+their own move reasons.
+
+\1f
+File: gnugo.info,  Node: Cutting and Connecting,  Next: Semeai,  Prev: Multi Attack or Defense,  Up: Move Reason Details
+
+6.3.4 Cutting and connecting moves
+----------------------------------
+
+Moves which connect two distinct dragons are called `connecting moves'.
+Moves which prevent such connections are called "cutting moves". Cutting
+and connecting moves are primarily found by pattern matching, the `C'
+and `B' class patterns.
+
+   A second source of cutting and connecting moves comes from the attack
+and defense of cutting stones. A move which attacks a worm
+automatically counts as a connecting move if there are multiple dragons
+adjacent to the attacked worm. Similarly a defending move counts as a
+cutting move. The action taken when a pattern of this type is found is
+to induce a connect or cut move reason.
+
+   When a cut or connect move reason is registered, the involved dragons
+are of course stored. Thus the same move may cut and/or connect several
+pairs of dragons.
+
+\1f
+File: gnugo.info,  Node: Semeai,  Next: Making eyes,  Prev: Cutting and Connecting,  Up: Move Reason Details
+
+6.3.5 Semeai winning moves
+--------------------------
+
+A move which is necessary to win a capturing race is called a "semeai
+move". These are similar to attacking moves, except that they involve
+the simultaneous attack of one worm and the defense of another. As for
+attack and defense moves, it's important that all moves which win a
+semeai are found, so an informed choice can be made between them.
+
+   Semeai move reasons should be set by the semeai module. However this
+has not been implemented yet. One might also wish to list moves which
+increase the lead in a semeai race (removes ko threats) for use as
+secondary move reasons. Analogously if we are behind in the race.
+
+\1f
+File: gnugo.info,  Node: Making eyes,  Next: Antisuji moves,  Prev: Semeai,  Up: Move Reason Details
+
+6.3.6 Making or destroying eyes
+-------------------------------
+
+A move which makes a difference in the number of eyes produced from an
+eye space is called an "eye move". It's not necessary that the eye is
+critical for the life and death of the dragon in question, although it
+will be valued substantially higher if this is the case. As usual it's
+important to find all moves that change the eye count.
+
+   (This is part of what eye_finder was doing. Currently it only finds
+one vital point for each unstable eye space.)
+
+\1f
+File: gnugo.info,  Node: Antisuji moves,  Next: Territorial moves,  Prev: Making eyes,  Up: Move Reason Details
+
+6.3.7 Antisuji moves
+--------------------
+
+Moves which are locally inferior or for some other reason must not be
+played are called "antisuji moves". These moves are generated by pattern
+matching. Care must be taken with this move reason as the move under no
+circumstances will be played.
+
+\1f
+File: gnugo.info,  Node: Territorial moves,  Next: Owl attack and defense,  Prev: Antisuji moves,  Up: Move Reason Details
+
+6.3.8 Territorial moves
+-----------------------
+
+Any move that increases territory gets a move reason. This is the expand
+territory move reason. That move reason is added by the `e' patterns in
+`patterns/patterns.db'. Similarly the `E' patterns attempt to generate
+or mitigate a moyo, which is a region of influence not yet secure
+territory, yet valuable. Such a pattern sets the "expand moyo" move
+reason.
+
+\1f
+File: gnugo.info,  Node: Owl attack and defense,  Next: Combination Attacks,  Prev: Territorial moves,  Up: Move Reason Details
+
+6.3.9 Attacking and Defending Dragons
+-------------------------------------
+
+Just as the tactical reading code tries to determine when a worm can be
+attacked or defended, the owl code tries to determine when a dragon can
+get two eyes and live. The function `owl_reasons()' generates the
+corresponding move reasons.
+
+   The owl attack and owl defense move reasons are self explanatory.
+
+   The owl attack threat reason is generated if owl attack on an
+opponent's dragon fails but the owl code determines that the dragon can
+be killed with two consecutive moves. The killing moves are stored in
+`dragon[pos].owl_attack_point' and
+`dragon[pos].owl_second_attack_point'.
+
+   Similarly if a friendly dragon is dead but two moves can revive it,
+an owl defense threat move reason is generated.
+
+   The prevent threat reasons are similar but with the colors reversed:
+if the opponent has an attack threat move then a move which removes the
+threat gets a prevent threat move reason.
+
+   The owl uncertain move reasons are generated when the owl code runs
+out of nodes. In order to prevent the owl code from running too long, a
+cap is put on the number of nodes one owl read can generate. If this is
+exceeded, the reading is cut short and the result is cached as usual,
+but marked uncertain.  In this case an owl uncertain move reason may be
+generated.  For example, if the owl code finds the dragon alive but is
+unsure, a move to defend may still be generated.
+
+\1f
+File: gnugo.info,  Node: Combination Attacks,  Prev: Owl attack and defense,  Up: Move Reason Details
+
+6.3.10 Combination Attacks
+--------------------------
+
+The function `atari_atari' tries to find a sequence of ataris
+culminating in an unexpected change of status of any opponent string,
+from `ALIVE' to `CRITICAL'. Once such a sequence of ataris is found, it
+tries to shorten it by rejecting irrelevant moves.
+
+\1f
+File: gnugo.info,  Node: Valuation,  Next: End Game,  Prev: Move Reason Details,  Up: Move Generation
+
+6.4 Valuation of suggested moves
+================================
+
+At the end of the move generation process, the function
+`value_move_reasons()' tries to assign values to the moves for the
+purpose of selecting the best move. The single purpose of the move
+valuation is to try to rank the moves so that the best move gets the
+highest score. In principle these values could be arbitrary, but in
+order to make it easier to evaluate how well the valuation performs,
+not to mention simplify the tuning, we try to assign values which are
+consistent with the usual methods of counting used by human Go players,
+as explained for example in _The Endgame_ by Ogawa and Davies.
+
+   Moves are valued with respect to four different criteria. These are
+
+   * territorial value
+
+   * strategical value
+
+   * shape value,
+
+   * secondary value.
+
+   All of these are floats and should be measured in terms of actual
+points.
+
+   The territorial value is the total change of expected territory
+caused by this move. This includes changes in the status of groups if
+the move is an attack or a defense move.
+
+   Beginning with GNU Go 3.0, the influence function plays an important
+role in estimating territory (*note Influence and Territory::). It is
+used to make a guess at each intersection how likely it is that it will
+become black or white territory. The territorial value sums up the
+changes in these valuations.
+
+   Strategical value is a measure of the effect the move has on the
+safety of all groups on the board. Typically cutting and connecting
+moves have their main value here. Also edge extensions, enclosing moves
+and moves towards the center have high strategical value. The
+strategical value should be the sum of a fraction of the territorial
+value of the involved dragons. The fraction is determined by the change
+in safety of the dragon.
+
+   Shape value is a purely local shape analysis. An important role of
+this measure is to offset mistakes made by the estimation of
+territorial values. In open positions it's often worth sacrificing a
+few points of (apparent) immediate profit to make good shape. Shape
+value is implemented by pattern matching, the Shape patterns.
+
+   Secondary value is given for move reasons which by themselves are not
+sufficient to play the move. One example is to reduce the number of
+eyes for a dragon that has several or to attack a defenseless worm.
+
+   When all these values have been computed, they are summed, possibly
+weighted (secondary value should definitely have a small weight), into
+a final move value. This value is used to decide the move.
+
+* Menu:
+
+* Territorial value::            How much territory does a move gain
+* Strategical value::             Strategical gains from a move
+* Shape factor::                 Local shape
+* Minimum Value::                 Minimum value
+* Secondary Value::               Other, more indirect, gains from a move
+* Threats and Followup Value::    Valuation of attack and defense threats
+
+\1f
+File: gnugo.info,  Node: Territorial value,  Next: Strategical value,  Up: Valuation
+
+6.4.1 Territorial Value
+-----------------------
+
+The algorithm for computing territorial value is in the function
+`estimate_territorial_value'. As the name suggests, it seeks to
+estimate the change in territory.
+
+   It considers all groups that are changed from alive to death or
+vice-versa due to this move. Also, it makes an assumption whether the
+move should be considered safe. If so, the influence module is called:
+The function `influence_delta_territory' estimates the territorial
+effect of both the stone played and of the changes of group status'.
+
+   The result returned by the influence module is subject to a number of
+corrections. This is because some move reasons cannot be evaluated by a
+single call to the influence function, such as moves depending on a ko.
+
+\1f
+File: gnugo.info,  Node: Strategical value,  Next: Shape factor,  Prev: Territorial value,  Up: Valuation
+
+6.4.2 Strategical Value
+-----------------------
+
+Strategical defense or attack reasons are assigned to any move which
+matches a pattern of type `a' or `d'. These are moves which in some
+(often intangible) way tend to help strengthen or weaken a dragon. Of
+course strengthening a dragon which is already alive should not be
+given much value, but when the move reason is generated it is not
+necessary to check its status or safety. This is done later, during the
+valuation phase.
+
+\1f
+File: gnugo.info,  Node: Shape factor,  Next: Minimum Value,  Prev: Strategical value,  Up: Valuation
+
+6.4.3 Shape Factor
+------------------
+
+In the value field of a pattern (*note Pattern Values::) one may
+specify a shape value.
+
+   This is used to compute the shape factor, which multiplies the score
+of a move. We take the largest positive contribution to shape and add 1
+for each additional positive contribution found.  Then we take the
+largest negative contribution to shape, and add 1 for each additional
+negative contribution. The resulting number is raised to the power 1.05
+to obtain the shape factor.
+
+   The rationale behind this complicated scheme is that every shape
+point is very significant. If two shape contributions with values (say)
+5 and 3 are found, the second contribution should be devalued to 1.
+Otherwise the engine is too difficult to tune since finding multiple
+contributions to shape can cause significant overvaluing of a move.
+
+\1f
+File: gnugo.info,  Node: Minimum Value,  Next: Secondary Value,  Prev: Shape factor,  Up: Valuation
+
+6.4.4 Minimum Value
+-------------------
+
+A pattern may assign a minimum (and sometimes also a maximum) value.
+For example the Joseki patterns have values which are prescribed in
+this way, or ones with a `value' field.  One prefers not to use this
+approach but in practice it is sometimes needed.
+
+   In the fuseki, there are often several moves with identical minimum
+value. GNU Go chooses randomly between such moves, which ensures some
+indeterminacy of GNU Go's play. Later in the game, GNU Go's genuine
+valuation of such a move is used as a secondary criterion.
+
+\1f
+File: gnugo.info,  Node: Secondary Value,  Next: Threats and Followup Value,  Prev: Minimum Value,  Up: Valuation
+
+6.4.5 Secondary Value
+---------------------
+
+Secondary move reasons are weighed very slightly. Such a move can tip
+the scales if all other factors are equal.
+
+\1f
+File: gnugo.info,  Node: Threats and Followup Value,  Prev: Secondary Value,  Up: Valuation
+
+6.4.6 Threats and Followup Value
+--------------------------------
+
+Followup value refers to value which may acrue if we get two moves in a
+row in a local area. It is assigned for moves that threaten to attack
+or defend a worm or dragon. Also, since GNU Go 3.2 the influence module
+makes an assessment of the possible purely territorial followup moves.
+In cases where these two heuristics are not sufficient we add patterns
+with a `followup_value' autohelper macro.
+
+   Usually, the followup value gives only a small contribution; e.g. if
+it the followup value is very large, then GNU Go treats the move as
+sente by doubling its value.  However, if the largest move on the board
+is a ko which we cannot legally take, then such a move becomes
+attractive as a ko threat and the full followup value is taken into
+account.
+
+\1f
+File: gnugo.info,  Node: End Game,  Prev: Valuation,  Up: Move Generation
+
+6.5 End Game
+============
+
+Endgame moves are generated just like any other move by GNU Go. In fact,
+the concept of endgame does not exist explicitly, but if the largest
+move initially found is worth 6 points or less, an extra set of patterns
+in `endgame.db' is matched and the move valuation is redone.
+
+\1f
+File: gnugo.info,  Node: Worms and Dragons,  Next: Eyes,  Prev: Move Generation,  Up: Top
+
+7 Worms and Dragons
+*******************
+
+* Menu:
+
+* Worms::                             Worms
+* Amalgamation::                      How two Worms are amalgamated.
+* Connection::                        Connections.
+* Half Eyes::                         Half Eyes and False Eyes.
+* Dragons::                           Union of WORMS.
+* Dragons in Color::                  Colored display of DRAGONS.
+
+   Before considering its move, GNU Go collects some data in several
+arrays. Two of these arrays, called `worm' and `dragon', are discussed
+in this document. Others are discussed in *Note Eyes::.
+
+   This information is intended to help evaluate the connectedness, eye
+shape, escape potential and life status of each group.
+
+   Later routines called by `genmove()' will then have access to this
+information. This document attempts to explain the philosophy and
+algorithms of this preliminary analysis, which is carried out by the
+two routines `make_worm()' and `make_dragon()' in `dragon.c'.
+
+   A "worm" is a maximal set of stones on the board which are connected
+along the horizontal and vertical lines, and are of the same color.  We
+often say "string" instead of worm.
+
+   A "dragon" is a union of strings of the same color which will be
+treated as a unit. The dragons are generated anew at each move. If two
+strings are in the dragon, it is the computer's working hypothesis that
+they will live or die together and are effectively connected.
+
+   The purpose of the dragon code is to allow the computer to formulate
+meaningful statements about life and death.  To give one example,
+consider the following situation:
+
+           OOOOO
+          OOXXXOO
+          OX...XO
+          OXXXXXO
+           OOOOO
+
+   The X's here should be considered a single group with one three-space
+eye, but they consist of two separate strings.  Thus we must amalgamate
+these two strings into a single dragon. Then the assertion makes sense,
+that playing at the center will kill or save the dragon, and is a vital
+point for both players. It would be difficult to formulate this
+statement if the X's are not perceived as a unit.
+
+   The present implementation of the dragon code involves simplifying
+assumptions which can be refined in later implementations.
+
+\1f
+File: gnugo.info,  Node: Worms,  Next: Amalgamation,  Up: Worms and Dragons
+
+7.1 Worms
+=========
+
+The array `struct worm_data worm[MAX_BOARD]' collects information about
+the worms. We will give definitions of the various fields. Each field
+has constant value at each vertex of the worm. We will define each
+field.
+
+
+     struct worm_data {
+       int color;
+       int size;
+       float effective_size;
+       int origin;
+       int liberties;
+       int liberties2;
+       int liberties3;
+       int liberties4;
+       int lunch;
+       int cutstone;
+       int cutstone2;
+       int genus;
+       int inessential;
+       int invincible;
+       int unconditional_status;
+       int attack_points[MAX_TACTICAL_POINTS];
+       int attack_codes[MAX_TACTICAL_POINTS];
+       int defense_points[MAX_TACTICAL_POINTS];
+       int defend_codes[MAX_TACTICAL_POINTS];
+       int attack_threat_points[MAX_TACTICAL_POINTS];
+       int attack_threat_codes[MAX_TACTICAL_POINTS];
+       int defense_threat_points[MAX_TACTICAL_POINTS];
+       int defense_threat_codes[MAX_TACTICAL_POINTS];
+     };
+
+   * `color'
+
+          The color of the worm.
+
+   * `size'
+
+          This field contains the cardinality of the worm.
+
+   * `effective_size'
+
+          This is the number of stones in a worm plus the number of
+          empty intersections that are at least as close to this worm
+          as to any other worm. Intersections that are shared are
+          counted with equal fractional values for each worm. This
+          measures the direct territorial value of capturing a worm.
+          "effective_size" is a floating point number.  Only
+          intersections at a distance of 4 or less are counted.
+
+   * `origin'
+
+          Each worm has a distinguished member, called its "origin".
+          The purpose of this field is to make it easy to determine
+          when two vertices lie in the same worm: we compare their
+          origin. Also if we wish to perform some test once for each
+          worm, we simply perform it at the origin and ignore the other
+          vertices. The origin is characterized by the test:
+               worm[pos].origin == pos.
+
+   * `liberties'
+
+   * `liberties2'
+
+   * `liberties3'
+
+   * `liberties4'
+
+          For a nonempty worm the field liberties is the number of
+          liberties of the string. This is supplemented by
+          `LIBERTIES2', `LIBERTIES3' and `LIBERTIES4', which are the
+          number of second order, third order, and fourth order
+          liberties, respectively.  The definition of liberties of
+          order >1 is adapted to the problem of detecting the shape of
+          the surrounding empty space. In particular we want to be able
+          to see if a group is loosely surrounded. A "liberty of order
+          n" is an empty vertex which may be connected to the string by
+          placing n stones of the same color on the board, but no
+          fewer. The path of connection may pass through an intervening
+          group of the same color. The stones placed at distance >1 may
+          not touch a group of the opposite color. Connections through
+          ko are not permitted. Thus in the following configuration:
+
+                         .XX...    We label the     .XX.4.
+                         XO....    liberties of     XO1234
+                         XO....    order < 5 of     XO1234
+                         ......    the O group:     .12.4.
+                         .X.X..                     .X.X..
+
+          The convention that liberties of order >1 may not touch a
+          group of the opposite color means that knight's moves and one
+          space jumps are perceived as impenetrable barriers.  This is
+          useful in determining when the string is becoming surrounded.
+
+          The path may also not pass through a liberty at distance 1 if
+          that liberty is flanked by two stones of the opposing color.
+          This reflects the fact that the O stone is blocked from
+          expansion to the left by the two X stones in the following
+          situation:
+
+                         X.
+                         .O
+                         X.
+          We say that n is the "distance" of the liberty of order n
+          from the dragon.
+
+   * `lunch'
+
+          If nonzero, `lunch' points to a boundary worm which can be
+          easily captured.  (It does not matter whether or not the
+          string can be defended.)
+
+   We have two distinct notions of cutting stone, which we keep track
+of in the separate fields `worm.cutstone' and `worm.cutstone2'.  We use
+currently use both concepts in parallel.
+
+   * `cutstone'
+
+          This field is equal to 2 for cutting stones, 1 for potential
+          cutting stones. Otherwise it is zero.  Definitions for this
+          field: a "cutting stone" is one adjacent to two enemy
+          strings, which do not have a liberty in common. The most
+          common type of cutting string is in this situation:
+
+
+                         XO
+                         OX
+          
+          A "potential cutting stone" is adjacent to two enemy strings
+          which do share a liberty. For example, X in:
+
+
+                         XO
+                         O.
+
+          For cutting strings we set `worm[].cutstone=2'. For potential
+          cutting strings we set `worm[].cutstone=1'.
+
+   * `cutstone2'
+
+          Cutting points are identified by the patterns in the
+          connections database. Proper cuts are handled by the fact
+          that attacking and defending moves also count as moves
+          cutting or connecting the surrounding dragons.  The
+          `cutstone2' field is set during `find_cuts()', called from
+          `make_domains()'.
+     
+   * `genus'
+
+          There are two separate notions of "genus" for worms and
+          dragons. The dragon notion is more important, so
+          `dragon[pos].genus' is a far more useful field than
+          `worm[pos].genus'. Both fields are intended as approximations
+          to the number of eyes. The "genus" of a string is the number
+          of connected components of its complement, minus one. It is
+          an approximation to the number of eyes of the string.
+
+   * `inessential'
+
+          An "inessential" string is one which meets a criterion
+          designed to guarantee that it has no life potential unless a
+          particular surrounding string of the opposite color can be
+          killed. More precisely an "inessential string" is a string S
+          of genus zero, not adjacent to any opponent string which can
+          be easily captured, and which has no edge liberties or second
+          order liberties, and which satisfies the following further
+          property: If the string is removed from the board, then the
+          remaining cavity only borders worms of the opposite color.
+
+     
+   * `invincible'
+
+          An "invincible" worm is one which GNU Go thinks cannot be
+          captured. Invincible worms are computed by the function
+          `unconditional_life()' which tries to find those worms of the
+          given color that can never be captured, even if the opponent
+          is allowed an arbitrary number of consecutive moves.
+
+   * unconditional_status
+
+          Unconditional status is also set by the function
+          `unconditional_life'. This is set `ALIVE' for stones which are
+          invincible. Stones which can not be turned invincible even if
+          the defender is allowed an arbitrary number of consecutive
+          moves are given an unconditional status of `DEAD'. Empty
+          points where the opponent cannot form an invincible worm are
+          called unconditional territory. The unconditional status is
+          set to `WHITE_TERRITORY' or `BLACK_TERRITORY' depending on
+          who owns the territory. Finally, if a stone can be captured
+          but is adjacent to unconditional territory of its own color,
+          it is also given the unconditional status `ALIVE'.  In all
+          other cases the unconditional status is `UNKNOWN'.
+
+          To make sense of these definitions it is important to notice
+          that any stone which is alive in the ordinary sense (even if
+          only in seki) can be transformed into an invincible group by
+          some number of consecutive moves. Well, this is not entirely
+          true because there is a rare class of seki groups not
+          satisfying this condition. Exactly which these are is left as
+          an exercise for the reader. Currently `unconditional_life',
+          which strictly follows the definitions above, calls such seki
+          groups unconditionally dead, which of course is a misfeature.
+          It is possible to avoid this problem by making the algorithm
+          slightly more complex, but this is left for a later revision.
+
+   * `int attack_points[MAX_TACTICAL_POINTS]'
+
+   * `attack_codes[MAX_TACTICAL_POINTS]'
+
+   * `int defense_points[MAX_TACTICAL_POINTS];'
+
+   * `int defend_codes[MAX_TACTICAL_POINTS];'
+
+          If the tactical reading code (*note Tactical Reading::) finds
+          that the worm can be attacked, `attack_points[0]' is a point
+          of attack, and `attack_codes[0]' is the attack code, `WIN',
+          `KO_A' or `KO_B'. If multiple attacks are known,
+          `attack_points[k]' and `attack_codes[k]' are used. Similarly
+          with the defense codes and defense points.
+
+   * `int attack_threat_points[MAX_TACTICAL_POINTS];'
+
+   * `int attack_threat_codes[MAX_TACTICAL_POINTS];'
+
+   * `int defense_threat_points[MAX_TACTICAL_POINTS];'
+
+   * `int defense_threat_codes[MAX_TACTICAL_POINTS];'
+
+          These are points that threaten to attack or defend a worm.
+
+   The function `makeworms()' will generate data for all worms.
+
+\1f
+File: gnugo.info,  Node: Amalgamation,  Next: Connection,  Prev: Worms,  Up: Worms and Dragons
+
+7.2 Amalgamation
+================
+
+A dragon, we have said, is a group of stones which are treated as a
+unit. It is a working hypothesis that these stones will live or die
+together. Thus the program will not expect to disconnect an opponent's
+strings if they have been amalgamated into a single dragon.
+
+   The function `make_dragons()' will amalgamate worms into dragons by
+maintaining separate arrays `worm[]' and `dragon[]' containing similar
+data. Each dragon is a union of worms. Just as the data maintained in
+`worm[]' is constant on each worm, the data in `dragon[]' is constant
+on each dragon.
+
+   Amalgamation of worms in GNU Go proceeds as follows.  First we
+amalgamate all boundary components of an eyeshape. Thus in the
+following example:
+
+
+     .OOOO.       The four X strings are amalgamated into a
+     OOXXO.       single dragon because they are the boundary
+     OX..XO       components of a blackbordered cave. The
+     OX..XO       cave could contain an inessential string
+     OOXXO.       with no effect on this amalgamation.
+     XXX...
+   
+   The code for this type of amalgamation is in the routine
+`dragon_eye()', discussed further in EYES.
+
+   Next, we amalgamate strings which seem uncuttable. We amalgamate
+dragons which either share two or more common liberties, or share one
+liberty into the which the opponent cannot play without being captured.
+(ignores ko rule).
+
+
+        X.    X.X     XXXX.XXX         X.O
+        .X    X.X     X......X         X.X
+                      XXXXXX.X         OXX
+
+   A database of connection patterns may be found in `patterns/conn.db'.
+
+\1f
+File: gnugo.info,  Node: Connection,  Next: Half Eyes,  Prev: Amalgamation,  Up: Worms and Dragons
+
+7.3 Connection
+==============
+
+The fields `black_eye.cut' and `white_eye.cut' are set where the
+opponent can cut, and this is done by the B (break) class patterns in
+`conn.db'.  There are two important uses for this field, which can be
+accessed by the autohelper functions `xcut()' and `ocut()'. The first
+use is to stop amalgamation in positions like
+
+
+     ..X..
+     OO*OO
+     X.O.X
+     ..O..
+
+where X can play at * to cut off either branch. What happens here is
+that first connection pattern CB1 finds the double cut and marks * as a
+cutting point. Later the C (connection) class patterns in conn.db are
+searched to find secure connections over which to amalgamate dragons.
+Normally a diagonal connection would be deemed secure and amalgamated
+by connection pattern CC101, but there is a constraint requiring that
+neither of the empty intersections is a cutting point.  
+
+   A weakness with this scheme is that X can only cut one connection,
+not both, so we should be allowed to amalgamate over one of the
+connections.  This is performed by connection pattern CC401, which with
+the help of `amalgamate_most_valuable_helper()' decides which
+connection to prefer.
+
+   The other use is to simplify making alternative connection patterns
+to the solid connection. Positions where the diag_miai helper thinks a
+connection is necessary are marked as cutting points by connection
+pattern 12. Thus we can write a connection pattern like `CC6':
+
+
+     ?xxx?     straight extension to connect
+     XOO*?
+     O...?
+
+     :8,C,NULL
+
+     ?xxx?
+     XOOb?
+     Oa..?
+
+     ;xcut(a) && odefend_against(b,a)
+
+where we verify that a move at `*' would stop the enemy from safely
+playing at the cutting point, thus defending against the cut.
+
+\1f
+File: gnugo.info,  Node: Half Eyes,  Next: Dragons,  Prev: Connection,  Up: Worms and Dragons
+
+7.4 Half Eyes and False Eyes
+============================
+
+A "half eye" is a place where, if the defender plays first, an eye will
+materialize, but where if the attacker plays first, no eye will
+materialize. A "false eye" is a vertex which is surrounded by a dragon
+yet is not an eye. Here is a half eye:
+
+
+     XXXXX
+     OO..X
+     O.O.X
+     OOXXX
+
+   Here is a false eye:
+
+
+     XXXXX
+     XOO.X
+     O.O.X
+     OOXXX
+
+   The "topological" algorithm for determining half and false eyes is
+described elsewhere (*note Eye Topology::).
+
+   The half eye data is collected in the dragon array. Before this is
+done, however, an auxiliary array called half_eye_data is filled with
+information. The field `type' is 0, or else `HALF_EYE' or `FALSE_EYE'
+depending on which type is found; the fields `attack_point[]' point to
+up to 4 points to attack the half eye, and similarly `defense_point[]'
+gives points to defend the half eye.
+
+
+     struct half_eye_data half_eye[MAX_BOARD];
+
+     struct half_eye_data {
+       float value;          /* Topological eye value */
+       int type;             /* HALF_EYE or FALSE_EYE */
+       int num_attacks;      /* Number of attacking points */
+       int attack_point[4];  /* The moves to attack a topological halfeye */
+       int num_defends;      /* Number of defending points */
+       int defense_point[4]; /* The moves to defend a topological halfeye */
+     };
+
+   The array `struct half_eye_data half_eye[MAX_BOARD]' contains
+information about half and false eyes.  If the type is `HALF_EYE' then
+up to four moves are recorded which can either attack or defend the
+eye. In rare cases the attack points could be different from the
+defense points.
+
+\1f
+File: gnugo.info,  Node: Dragons,  Next: Dragons in Color,  Prev: Half Eyes,  Up: Worms and Dragons
+
+7.5 Dragons
+===========
+
+The array `struct dragon_data dragon[MAX_BOARD]' collects information
+about the dragons. We will give definitions of the various fields. Each
+field has constant value at each vertex of the dragon. (Fields will be
+discussed below.)
+
+
+     struct dragon_data {
+       int color;    /* its color                               */
+       int id;       /* the index into the dragon2 array        */
+       int origin;   /* the origin of the dragon. Two vertices  */
+                     /* are in the same dragon iff they have    */
+                     /* same origin.                            */
+       int size;     /* size of the dragon                      */
+       float effective_size; /* stones and surrounding spaces   */
+       int crude_status;     /* (ALIVE, DEAD, UNKNOWN, CRITICAL)*/
+       int status;           /* best trusted status             */
+     };
+
+     extern struct dragon_data dragon[BOARDMAX];
+
+   Other fields attached to the dragon are contained in the
+`dragon_data2' struct array. (Fields will be discussed below.)
+
+
+     struct dragon_data2 {
+       int origin;
+       int adjacent[MAX_NEIGHBOR_DRAGONS];
+       int neighbors;
+       int hostile_neighbors;
+       int moyo_size;
+       float moyo_territorial_value;
+       int safety;
+       float weakness;
+       float weakness_pre_owl;
+       int escape_route;
+       struct eyevalue genus;
+       int heye;
+       int lunch;
+       int surround_status;
+       int surround_size;
+       int semeais;
+       int semeai_margin_of_safety;
+       int semeai_defense_point;
+       int semeai_defense_certain;
+       int semeai_attack_point;
+       int semeai_attack_certain;
+       int owl_threat_status;
+       int owl_status;
+       int owl_attack_point;
+       int owl_attack_code;
+       int owl_attack_certain;
+       int owl_second_attack_point;
+       int owl_defense_point;
+       int owl_defense_code;
+       int owl_defense_certain;
+       int owl_second_defense_point;
+       int owl_attack_kworm;
+       int owl_defense_kworm;
+     };
+
+     extern struct dragon_data2 *dragon2;
+
+   The difference between the two arrays is that the `dragon' array is
+indexed by the board, and there is a copy of the dragon data at every
+stone in the dragon, while there is only one copy of the dragon2 data.
+The dragons are numbered, and the `id' field of the dragon is a key
+into the dragon2 array. Two macros DRAGON and DRAGON2 are provided for
+gaining access to the two arrays.
+
+     #define DRAGON2(pos) dragon2[dragon[pos].id]
+     #define DRAGON(d) dragon[dragon2[d].origin]
+
+   Thus if you know the position `pos' of a stone in the dragon you can
+access the dragon array directly, for example accessing the origin with
+`dragon[pos].origin'. However if you need a field from the dragon2
+array, you can access it using the DRAGON2 macro, for example you can
+access its neighor dragons by
+
+     for (k = 0; k < DRAGON2(pos).neighbors; k++) {
+       int d = DRAGON2(pos).adjacent[k];
+       int apos = dragon2[d].origin;
+       do_something(apos);
+     }
+
+   Similarly if you know the dragon number (which is `dragon[pos].id')
+then you can access the `dragon2' array directly, or you can access the
+`dragon' array using the DRAGON macro.
+
+   Here are the definitions of each field in the `dragon' arrray.
+
+   * `color'
+
+          The color of the dragon.
+
+   * `id' 
+
+          The dragon number, used as a key into the `dragon2' array.
+
+   * origin 
+
+          The origin of the dragon is a unique particular vertex of the
+          dragon, useful for determining when two vertices belong to
+          the same dragon. Before amalgamation the worm origins are
+          copied to the dragon origins. Amalgamation of two dragons
+          amounts to changing the origin of one.
+
+   * size 
+
+          The number of stones in the dragon.
+
+   * effective size 
+
+          The sum of the effective sizes of the constituent worms.
+          Remembering that vertices equidistant between two or more
+          worms are counted fractionally in `worm.effective_size', this
+          equals the cardinality of the dragon plus the number of empty
+          vertices which are nearer this dragon than any other.
+
+   * crude_status
+
+          (ALIVE, DEAD, UNKNOWN, CRITICAL). An early measure of the life
+          potential of the dragon. It is computed before the owl code is
+          run and is superceded by the status as soon as that becomes
+          available.
+
+   * status 
+
+          The dragon status is the best measure of the dragon's health.
+          It is computed after the owl code is run, then revised again
+          when the semeai code is run.
+
+   Here are definitions of the fields in the `dragon2' array.
+
+   * origin
+
+          The origin field is duplicated here.
+
+   * adjacent
+
+   * `adjacent[MAX_NEIGHBOR_DRAGONS]' 
+
+          Dragons of either color near the given one are called
+          "neighbors".  They are computed by the function
+          `find_neighbor_dragons()'.  The `dragon2.adjacent' array
+          gives the dragon numbers of these dragons.
+
+   * `neighbors' 
+
+          Dragons of either color near the given one are called
+          "neighbors".  They are computed by the function
+          `find_neighbor_dragons()'.  The `dragon2.adjacent' array
+          gives the dragon numbers of these dragons.
+
+   * neighbors
+
+          The number of neighbor dragons.
+
+   * hostile_neighbors
+
+          The number of neighbor dragons of the opposite color.
+
+   * moyo_size
+
+   * float moyo_territorial_value 
+
+          The function `compute_surrounding_moyo_sizes()' assigns a
+          size and a territorial value to the moyo around each dragon
+          (*note Territory and Moyo::). This is the moyo size. They are
+          recorded in these fields.
+
+   * safety 
+
+          The dragon safety can take on one of the values
+             - TACTICALLY_DEAD - a dragon consisting of a single worm
+               found dead by the reading code (very reliable)
+
+             - ALIVE - found alive by the owl or semeai code
+
+             - STRONGLY_ALIVE - alive without much question
+
+             - INVINCIBLE - definitively alive even after many tenukis
+
+             - ALIVE_IN_SEKI - determined to be seki by the semeai code
+
+             - CRITICAL - lives or dies depending on who moves first
+
+             - DEAD - found to be dead by the owl code
+
+             - INESSENTIAL - the dragon is unimportant (e.g. nakade
+               stones) and dead
+
+   * weakness
+
+   * weakness_pre_owl 
+
+          A floating point measure of the safety of a dragon. The dragon
+          weakness is a number between 0. and 1., higher numbers for
+          dragons in greater need of safety. The field
+          `weakness_pre_owl' is a preliminary computation before the
+          owl code is run.
+
+   * escape_route 
+
+          A measure of the dragon's potential to escape towards safety,
+          in case it cannot make two eyes locally. Documentation may be
+          found in *note Escape::.
+
+   * struct eyevalue genus 
+
+          The approximate number of eyes the dragon can be expected to
+          get. Not guaranteed to be accurate. The eyevalue struct, which
+          is used throughout the engine, is declared thus:
+
+               struct eyevalue {
+                 unsigned char a; /* # of eyes if attacker plays twice */
+                 unsigned char b; /* # of eyes if attacker plays first */
+                 unsigned char c; /* # of eyes if defender plays first */
+                 unsigned char d; /* # of eyes if defender plays twice */
+               };
+
+   * heye
+
+          Location of a half eye attached to the dragon.
+
+   * lunch 
+
+          If nonzero, this is the location of a boundary string which
+          can be captured. In contrast with worm lunches, a dragon
+          lunch must be able to defend itself.
+
+   * surround_status
+
+   * surround_size 
+
+          In estimating the safety of a dragon it is useful to know if
+          it is "surrounded". See *note Surrounded Dragons:: and the
+          comments in `surround.c' for more information about the
+          algorithm.  Used in computing the escape_route, and also
+          callable from patterns (currently used by CB258).
+
+   * semeais
+
+   * semeai_defense_point
+
+   * semeai_defense_certain
+
+   * semeai_attack_point
+
+   * semeai_attack_certain 
+
+          If two dragons of opposite color both have the status CRITICAL
+          or DEAD they are in a "semeai" (capturing race), and their
+          status must be adjudicated by the function
+          `owl_analyze_semeai()' in `owl.c', which attempts to
+          determine which is alive, which dead, or if the result is
+          seki, and whether it is important who moves first. The
+          function `new_semeai()' in `semeai.c' attempts to revise the
+          statuses and to generate move reasons based on these results.
+          The field `dragon2.semeais' is nonzero if the dragon is an
+          element of a semeai, and equals the number of semeais (seldom
+          more than one). The semeai defense and attack points are
+          locations the defender or attacker must move to win the
+          semeai. The field `semeai_margin_of_safety' is intended to
+          indicate whether the semeai is close or not but currently
+          this field is not maintained. The fields
+          `semeai_defense_certain' and `semeai_attack_certain' indicate
+          that the semeai code was able to finish analysis without
+          running out of nodes.
+
+   * owl_status
+
+          This is a classification similar to `dragon.crude_status', but
+          based on the life and death reading in `owl.c'.  The owl code
+          (*note The Owl Code::) is skipped for dragons which appear
+          safe by certain heuristics. If the owl code is not run, the
+          owl status is `UNCHECKED'.  If `owl_attack()' determines that
+          the dragon cannot be attacked, it is classified as `ALIVE'.
+          Otherwise, `owl_defend()' is run, and if it can be defended it
+          is classified as `CRITICAL', and if not, as `DEAD'.
+
+   * owl_attack_point 
+
+          If the dragon can be attacked this is the point to attack the
+          dragon.
+
+   * owl_attack_code 
+
+          The owl attack code, It can be WIN, KO_A, KO_B or 0 (*note
+          Return Codes::).
+
+   * owl_attack_certain 
+
+          The owl reading is able to finish analyzing the attack
+          without running out of nodes.
+
+   * owl_second_attack_point 
+
+          A second attack point.
+
+   * owl_defense_point 
+
+          If the dragon can be defended, this is the place to play.
+
+   * owl_defense_code 
+
+          The owl defense code, It can be WIN, KO_A, KO_B or 0 (*note
+          Return Codes::).
+
+   * owl_defense_certain 
+
+          The owl code is able to finish analyzing the defense without
+          running out of nodes.
+
+   * owl_second_defense_point 
+
+          A second owl defense point.
+
+\1f
+File: gnugo.info,  Node: Dragons in Color,  Prev: Dragons,  Up: Worms and Dragons
+
+7.6 Colored Dragon Display
+==========================
+
+You can get a colored ASCII display of the board in which each dragon
+is assigned a different letter; and the different values of
+`dragon.status' values (`ALIVE', `DEAD', `UNKNOWN', `CRITICAL') have
+different colors. This is very handy for debugging.  A second diagram
+shows the values of `owl.status'. If this is `UNCHECKED' the dragon is
+displayed in White.
+
+   Save a game in sgf format using CGoban, or using the `-o' option with
+GNU Go itself.
+
+   Open an `xterm' or `rxvt' window. You may also use the Linux
+console.  Using the console, you may need to use "SHIFT-PAGE UP" to see
+the first diagram. Xterm will only work if it is compiled with color
+support--if you do not see the colors try `rxvt'. Make the background
+color black and the foreground color white.
+
+   Execute:
+
+   `gnugo -l [filename] -L [movenum] -T' to get the colored display.
+
+   The color scheme: Green = `ALIVE'; Yellow = `UNKNOWN'; Cyan = `DEAD'
+and Red = `CRITICAL'. Worms which have been amalgamated into the same
+dragon are labelled with the same letter.
+
+   Other useful colored displays may be obtained by using instead:
+
+   * the option -E to display eye spaces (*note Eyes::).
+
+   * the option -m 0x0180 to display territory, moyo and area (*note
+     Territory and Moyo::).
+
+   The colored displays are documented elsewhere (*note Colored
+Display::).
+
+\1f
+File: gnugo.info,  Node: Eyes,  Next: Patterns,  Prev: Worms and Dragons,  Up: Top
+
+8 Eyes and Half Eyes
+********************
+
+The purpose of this Chapter is to describe the algorithm used in GNU Go
+to determine eyes.
+
+* Menu:
+
+* Local Games::                 Local games
+* Eye Space::                   Eye space
+* Eye Space as Local Game::     Eye space as local game
+* Eye Example::                 An example
+* Graphs::                      Underlying graphs
+* Eye Shape::                   Pattern matching
+* Eye Local Game Values::       Pattern matching
+* Eye Topology::                False eyes and half eyes
+* Eye Topology with Ko::        False eyes and half eyes with ko
+* False Margins::               False margins
+* Eye Functions::               Functions in `optics.c'
+
+\1f
+File: gnugo.info,  Node: Local Games,  Next: Eye Space,  Up: Eyes
+
+8.1 Local games
+===============
+
+The fundamental paradigm of combinatorial game theory is that games can
+be added and in fact form a group. If `G' and `H' are games, then `G+H'
+is a game in which each player on his turn has the option of playing in
+either move. We say that the game `G+H' is the sum of the local games
+`G' and `H'.
+
+   Each connected eyespace of a dragon affords a local game which yields
+a local game tree. The score of this local game is the number of eyes
+it yields. Usually if the players take turns and make optimal moves,
+the end scores will differ by 0 or 1. In this case, the local game may
+be represented by a single number, which is an integer or half integer.
+Thus if `n(O)' is the score if `O' moves first, both players alternate
+(no passes) and make alternate moves, and similarly `n(X)', the game
+can be represented by `{n(O)|n(X)}'. Thus {1|1} is an eye, {2|1} is an
+eye plus a half eye, etc.
+
+   The exceptional game {2|0} can occur, though rarely. We call an
+eyespace yielding this local game a CHIMERA.  The dragon is alive if
+any of the local games ends up with a score of 2 or more, so {2|1} is
+not different from {3|1}. Thus {3|1} is NOT a chimera.
+
+   Here is an example of a chimera:
+
+     XXXXX
+     XOOOX
+     XO.OOX
+     XX..OX
+     XXOOXX
+     XXXXX
+
+\1f
+File: gnugo.info,  Node: Eye Space,  Next: Eye Space as Local Game,  Prev: Local Games,  Up: Eyes
+
+8.2 Eye spaces
+==============
+
+In order that each eyespace be assignable to a dragon, it is necessary
+that all the dragons surrounding it be amalgamated (*note
+Amalgamation::). This is the function of `dragon_eye()'.
+
+   An EYE SPACE for a black dragon is a collection of vertices adjacent
+to a dragon which may not yet be completely closed off, but which can
+potentially become eyespace. If an open eye space is sufficiently
+large, it will yield two eyes. Vertices at the edge of the eye space
+(adjacent to empty vertices outside the eye space) are called MARGINAL.
+
+   Here is an example from a game:
+
+
+      |. X . X X . . X O X O
+      |X . . . . . X X O O O
+      |O X X X X . . X O O O
+      |O O O O X . O X O O O
+      |. . . . O O O O X X O
+      |X O . X X X . . X O O
+      |X O O O O O O O X X O
+      |. X X O . O X O . . X
+      |X . . X . X X X X X X
+      |O X X O X . X O O X O
+
+   Here the `O' dragon which is surrounded in the center has open eye
+space. In the middle of this open eye space are three dead `X' stones.
+This space is large enough that O cannot be killed. We can abstract the
+properties of this eye shape as follows.  Marking certain vertices as
+follows:
+
+
+      |- X - X X - - X O X O
+      |X - - - - - X X O O O
+      |O X X X X - - X O O O
+      |O O O O X - O X O O O
+      |! . . . O O O O X X O
+      |X O . X X X . ! X O O
+      |X O O O O O O O X X O
+      |- X X O - O X O - - X
+      |X - - X - X X X X X X
+      |O X X O X - X O O X O
+
+the shape in question has the form:
+
+
+     !...
+       .XXX.!
+
+   The marginal vertices are marked with an exclamation point (`!').
+The captured `X' stones inside the eyespace are naturally marked `X'.
+
+   The precise algorithm by which the eye spaces are determined is
+somewhat complex. Documentation of this algorithm is in the comments in
+the source to the function `make_domains()' in `optics.c'.
+
+   The eyespaces can be conveniently displayed using a colored ascii
+diagram by running `gnugo -E'.
+
+\1f
+File: gnugo.info,  Node: Eye Space as Local Game,  Next: Eye Example,  Prev: Eye Space,  Up: Eyes
+
+8.3 The eyespace as local game
+==============================
+
+In the abstraction, an eyespace consists of a set of vertices labelled:
+
+
+     !  .  X
+
+   Tables of many eyespaces are found in the database
+`patterns/eyes.db'. Each of these may be thought of as a local game.
+The result of this game is listed after the eyespace in the form
+`:max,min', where `max' is the number of eyes the pattern yields if `O'
+moves first, while `min' is the number of eyes the pattern yields if
+`X' moves first. The player who owns the eye space is denoted `O'
+throughout this discussion. Since three eyes are no better than two,
+there is no attempt to decide whether the space yields two eyes or
+three, so max never exceeds 2. Patterns with min>1 are omitted from the
+table.
+
+   For example, we have:
+
+     Pattern 548
+
+      x
+     xX.!
+
+     :0111
+
+   Here notation is as above, except that `x' means `X' or `EMPTY'.
+The result of the pattern is not different if `X' has stones at these
+vertices or not.
+
+   We may abstract the local game as follows. The two players `O' and
+`X' take turns moving, or either may pass.
+
+   RULE 1: `O' for his move may remove any vertex marked `!' or marked
+`.'.
+
+   RULE 2: `X' for his move may replace a `.' by an `X'.
+
+   RULE 3: `X' may remove a `!'. In this case, each `.' adjacent to the
+`!' which is removed becomes a `!' . If an `X' adjoins the `!' which is
+removed, then that `X' and any which are connected to it are also
+removed. Any `.' which are adjacent to the removed `X''s then become
+`.'.
+
+   Thus if `O' moves first he can transform the eyeshape in the above
+example to:
+
+      ...            or      !...
+       .XXX.!                  .XXX.
+
+   However if `X' moves he may remove the `!' and the `.'s adjacent to
+the `!' become `!' themselves. Thus if `X' moves first he may transform
+the eyeshape to:
+
+      !..           or    !..
+       .XXX.!              .XXX!
+
+   NOTE: A nuance which is that after the `X:1', `O:2' exchange below,
+`O' is threatening to capture three X stones, hence has a half eye to
+the left of 2.  This is subtle, and there are other such subtleties
+which our abstraction will not capture. Some of these at least can be
+dealt with by a refinements of the scheme, but we will content
+ourselves for the time being with a simplified model.
+
+
+      |- X - X X - - X O X O
+      |X - - - - - X X O O O
+      |O X X X X - - X O O O
+      |O O O O X - O X O O O
+      |1 2 . . O O O O X X O
+      |X O . X X X . 3 X O O
+      |X O O O O O O O X X O
+      |- X X O - O X O - - X
+      |X - - X - X X X X X X
+      |O X X O X - X O O X O
+
+   We will not attempt to characterize the terminal states of the local
+game (some of which could be seki) or the scoring.
+
+\1f
+File: gnugo.info,  Node: Eye Example,  Next: Graphs,  Prev: Eye Space as Local Game,  Up: Eyes
+
+8.4 An example
+==============
+
+Here is a local game which yields exactly one eye, no matter who moves
+first:
+
+
+     !
+     ...
+     ...!
+
+   Here are some variations, assuming `O' moves first.
+
+     !        (start position)
+     ...
+     ...!
+
+
+     ...      (after `O''s move)
+     ...!
+
+
+     ...
+     ..!
+
+
+     ...
+     ..
+
+
+     .X.       (nakade)
+     ..
+
+   Here is another variation:
+
+
+     !         (start)
+     ...
+     ...!
+
+
+     !         (after `O''s move)
+     . .
+     ...!
+
+
+     !         (after `X''s move)
+     . .
+     ..X!
+
+
+     . .
+     ..X!
+
+
+     . !
+     .!
+
+\1f
+File: gnugo.info,  Node: Graphs,  Next: Eye Shape,  Prev: Eye Example,  Up: Eyes
+
+8.5 Graphs
+==========
+
+It is a useful observation that the local game associated with an
+eyespace depends only on the underlying graph, which as a set consists
+of the set of vertices, in which two elements are connected by an edge
+if and only if they are adjacent on the Go board. For example the two
+eye shapes:
+
+
+     ..
+      ..
+
+     and
+
+     ....
+
+though distinct in shape have isomorphic graphs, and consequently they
+are isomorphic as local games. This reduces the number of eyeshapes in
+the database `patterns/eyes.db'.
+
+   A further simplification is obtained through our treatment of half
+eyes and false eyes. Such patterns are identified by the topological
+analysis (*note Eye Topology::).
+
+   A half eye is isomorphic to the pattern `(!.)' . To see this,
+consider the following two eye shapes:
+
+     XOOOOOO
+     X.....O
+     XOOOOOO
+     and:
+
+     XXOOOOO
+     XOa...O
+     XbOOOOO
+     XXXXXXX
+
+   These are equivalent eyeshapes, with isomorphic local games {2|1}.
+The first has shape:
+
+
+     !....
+
+   The second eyeshape has a half eye at `a' which is taken when `O' or
+`X' plays at `b'. This is found by the topological criterion (*note Eye
+Topology::).
+
+   The graph of the eye_shape, ostensibly `....' is modified by
+replacing the left `.' by `!.' during graph matching.
+
+   A false eye is isomorphic to the pattern `(!)' . To see this,
+consider the following eye shape:
+
+
+     XXXOOOOOO
+     X.Oa....O
+     XXXOOOOOO
+
+   This is equivalent to the two previous eyeshapes, with an isomorphic
+local game {2|1}.
+
+   This eyeshape has a false eye at `a'. This is also found by the
+topological criterion.
+
+   The graph of the eye_shape, ostensibly `.....' is modified by
+replacing the left `.' by `!'. This is made directly in the eye data,
+not only during graph matching.
+
+\1f
+File: gnugo.info,  Node: Eye Shape,  Next: Eye Local Game Values,  Prev: Graphs,  Up: Eyes
+
+8.6 Eye shape analysis
+======================
+
+The patterns in `patterns/eyes.db' are compiled into graphs represented
+essentially by arrays in `patterns/eyes.c'.
+
+   Each actual eye space as it occurs on the board is also compiled
+into a graph. Half eyes are handled as follows.  Referring to the
+example
+
+     XXOOOOO
+     XOa...O
+     XbOOOOO
+     XXXXXX
+
+repeated from the preceding discussion, the vertex at `b' is added to
+the eyespace as a marginal vertex. The adjacency condition in the graph
+is a macro (in `optics.c'): two vertices are adjacent if they are
+physically adjacent, or if one is a half eye and the other is its key
+point.
+
+   In `recognize_eyes()', each such graph arising from an actual
+eyespace is matched against the graphs in `eyes.c'.  If a match is
+found, the result of the local game is known. If a graph cannot be
+matched, its local game is assumed to be {2|2}.
+
+\1f
+File: gnugo.info,  Node: Eye Local Game Values,  Next: Eye Topology,  Prev: Eye Shape,  Up: Eyes
+
+8.7 Eye Local Game Values
+=========================
+
+The game values in `eyes.db' are given in a simplified scheme which is
+flexible enough to represent most possibilities in a useful way.
+
+   The colon line below the pattern gives the eye value of the matched
+eye shape. This consists of four digits, each of which is the number of
+eyes obtained during the following conditions:
+
+  1. The attacker moves first and is allowed yet another move because
+     the defender plays tenuki.
+
+  2. The attacker moves first and the defender responds locally.
+
+  3. The defender moves first and the attacker responds locally.
+
+  4. The defender moves first and is allowed yet another move because
+     the attacker plays tenuki.
+
+   The first case does *not* necessarily mean that the attacker is
+allowed two consecutive moves. This is explained with an example later.
+
+   Also, since two eyes suffice to live, all higher numbers also count
+as two.
+
+   The following 15 cases are of interest:
+
+   * 0000 0 eyes.
+
+   * 0001 0 eyes, but the defender can threaten to make one eye.
+
+   * 0002 0 eyes, but the defender can threaten to make two eyes.
+
+   * 0011 1/2 eye, 1 eye if defender moves first, 0 eyes if attacker
+     does.
+
+   * 0012 3/4 eyes, 3/2 eyes if defender moves first, 0 eyes if
+     attacker does.
+
+   * 0022 1* eye, 2 eyes if defender moves first, 0 eyes if attacker
+     does.
+
+   * 0111 1 eye, attacker can threaten to destroy the eye.
+
+   * 0112 1 eye, attacker can threaten to destroy the eye, defender can
+     threaten to make another eye.
+
+   * 0122 5/4 eyes, 2 eyes if defender moves first, 1/2 eye if attacker
+     does.
+
+   * 0222 2 eyes, attacker can threaten to destroy both.
+
+   * 1111 1 eye.
+
+   * 1112 1 eye, defender can threaten to make another eye.
+
+   * 1122 3/2 eyes, 2 eyes if defender moves first, 1 eye if attacker
+     does.
+
+   * 1222 2 eyes, attacker can threaten to destroy one eye.
+
+   * 2222 2 eyes.
+
+   The 3/4, 5/4, and 1* eye values are the same as in Howard Landman's
+paper Eyespace Values in Go. Attack and defense points are only marked
+in the patterns when they have definite effects on the eye value, i.e.
+pure threats are not marked.
+
+   Examples of all different cases can be found among the patterns in
+this file. Some of them might be slightly counterintuitive, so we
+explain one important case here. Consider
+
+     Pattern 6141
+
+      X
+     XX.@x
+
+     :1122
+
+   which e.g. matches in this position:
+
+     .OOOXXX
+     OOXOXOO
+     OXXba.O
+     OOOOOOO
+
+   Now it may look like `X' could take away both eyes by playing `a'
+followed by `b', giving 0122 as eye value. This is where the subtlety
+of the definition of the first digit in the eye value comes into play.
+It does not say that the attacker is allowed two consecutive moves but
+only that he is allowed to play "another move". The crucial property of
+this shape is that when `X' plays at a to destroy (at least) one eye,
+`O' can answer at `b', giving:
+
+
+     .OOOXXX
+     OO.OXOO
+     O.cOX.O
+     OOOOOOO
+
+   Now `X' has to continue at `c' in order to keep `O' at one eye.
+After this `O' plays tenuki and `X' cannot destroy the remaining eye by
+another move. Thus the eye value is indeed 1122.
+
+   As a final note, some of the eye values indicating a threat depend
+on suicide to be allowed, e.g.
+
+
+     Pattern 301
+
+     X.X
+
+     :1222
+
+   We always assume suicide to be allowed in this database. It is easy
+enough to sort out such moves at a higher level when suicide is
+disallowed.
+
+\1f
+File: gnugo.info,  Node: Eye Topology,  Next: Eye Topology with Ko,  Prev: Eye Local Game Values,  Up: Eyes
+
+8.8 Topology of Half Eyes and False Eyes
+========================================
+
+A HALF EYE is a pattern where an eye may or may not materialize,
+depending on who moves first. Here is a half eye for `O':
+
+
+        OOXX
+        O.O.
+        OO.X
+
+   A FALSE EYE is an eye vertex which cannot become a proper eye. Here
+are two examples of false eyes for `O':
+
+
+        OOX         OOX
+        O.O         O.OO
+        XOO         OOX
+
+   We describe now the topological algorithm used to find half eyes and
+false eyes. In this section we ignore the possibility of ko.
+
+   False eyes and half eyes can locally be characterized by the status
+of the diagonal intersections from an eye space. For each diagonal
+intersection, which is not within the eye space, there are three
+distinct possibilities:
+
+   * occupied by an enemy (`X') stone, which cannot be captured.
+
+   * either empty and `X' can safely play there, or occupied    by an
+     `X' stone that can both be attacked and defended.
+
+   * occupied by an `O' stone, an `X' stone that can be attacked    but
+     not defended, or it's empty and `X' cannot safely play there.
+
+   We give the first possibility a value of two, the second a value of
+one, and the last a value of zero. Summing the values for the diagonal
+intersections, we have the following criteria:
+
+   * sum >= 4: false eye
+
+   * sum == 3: half eye
+
+   * sum <= 2: proper eye
+
+   If the eye space is on the edge, the numbers above should be
+decreased by 2. An alternative approach is to award diagonal points
+which are outside the board a value of 1. To obtain an exact
+equivalence we must however give value 0 to the points diagonally off
+the corners, i.e.  the points with both coordinates out of bounds.
+
+   The algorithm to find all topologically false eyes and half eyes is:
+
+   For all eye space points with at most one neighbor in the eye space,
+evaluate the status of the diagonal intersections according to the
+criteria above and classify the point from the sum of the values.
+
+\1f
+File: gnugo.info,  Node: Eye Topology with Ko,  Next: False Margins,  Prev: Eye Topology,  Up: Eyes
+
+8.9 Eye Topology with Ko
+========================
+
+This section extends the topological eye analysis to handle ko. We
+distinguish between a ko in favor of `O' and one in favor of `X':
+
+     .?O?   good for O
+     OO.O
+     O.O?
+     XOX.
+     .X..
+     .?O?   good for X
+     OO.O
+     OXO?
+     X.X.
+     .X..
+
+   Preliminarily we give the former the symbolic diagonal value `a' and
+the latter the diagonal value `b'. We should clearly have `0 < a < 1 <
+b < 2'. Letting `e' be the topological eye value (still the sum of the
+four diagonal values), we want to have the following properties:
+
+     e <= 2     - proper eye
+     2 < e < 3  - worse than proper eye, better than half eye
+     e = 3      - half eye
+     3 < e < 4  - worse than half eye, better than false eye
+     e >= 4     - false eye
+
+   In order to determine the appropriate values of `a' and `b' we
+analyze the typical cases of ko contingent topological eyes:
+
+           .X..      (slightly) better than proper eye
+     (a)   ..OO          e < 2
+           OO.O
+           O.OO      e = 1 + a
+           XOX.
+           .X..
+
+           .X..      better than half eye, worse than proper eye
+     (a')  ..OO      2 < e < 3
+           OO.O
+           OXOO      e = 1 + b
+           X.X.
+           .X..
+
+           .X..      better than half eye, worse than proper eye
+     (b)   .XOO      2 < e < 3
+           OO.O
+           O.OO      e = 2 + a
+           XOX.
+           .X..
+
+           .X..      better than false eye, worse than half eye
+     (b')  .XOO      3 < e < 4
+           OO.O
+           OXOO      e = 2 + b
+           X.X.
+           .X..
+
+           .X..
+           XOX.      (slightly) better than proper eye
+     (c)   O.OO          e < 2
+           OO.O
+           O.OO      e = 2a
+           XOX.
+           .X..
+
+           .X..
+           XOX.      proper eye, some aji
+     (c')  O.OO      e ~ 2
+           OO.O
+           OXOO      e = a + b
+           X.X.
+           .X..
+
+           .X..
+           X.X.      better than half eye, worse than proper eye
+     (c'') OXOO      2 < e < 3
+           OO.O
+           OXOO      e = 2b
+           X.X.
+           .X..
+
+           .X...
+           XOX..     better than half eye, worse than proper eye
+     (d)   O.O.X     2 < e < 3
+           OO.O.
+           O.OO.     e = 1 + 2a
+           XOX..
+           .X...
+
+           .X...
+           XOX..     half eye, some aji
+     (d')  O.O.X     e ~ 3
+           OO.O.
+           OXOO.     e = 1 + a + b
+           X.X..
+           .X...
+
+           .X...
+           X.X..     better than false eye, worse than half eye
+     (d'') OXO.X     3 < e < 4
+           OO.O.
+           OXOO.     e = 1 + 2b
+           X.X..
+           .X...
+
+           .X...
+           XOX..     better than false eye, worse than half eye
+     (e)   O.OXX     3 < e < 4
+           OO.O.
+           O.OO.     e =  2 + 2a
+           XOX..
+           .X...
+
+           .X...
+           XOX..     false eye, some aji
+     (e')  O.OXX     e ~ 4
+           OO.O.
+           OXOO.     e = 2 + a + b
+           X.X..
+           .X...
+
+           .X...
+           X.X..     (slightly) worse than false eye
+     (e'') OXOXX     4 < e
+           OO.O.
+           OXOO.     e = 2 + 2b
+           X.X..
+           .X...
+
+   It may seem obvious that we should use
+     (i)   a=1/2, b=3/2
+   but this turns out to have some drawbacks. These can be solved by
+using either of
+     (ii)  a=2/3, b=4/3
+     (iii) a=3/4, b=5/4
+     (iv)  a=4/5, b=6/5
+
+   Summarizing the analysis above we have the following table for the
+four different choices of `a' and `b'.
+
+     case    symbolic        a=1/2   a=2/3   a=3/4   a=4/5   desired
+             value           b=3/2   b=4/3   b=5/4   b=6/5   interval
+     (a)     1+a             1.5     1.67    1.75    1.8         e < 2
+     (a')    1+b             2.5     2.33    2.25    2.2     2 < e < 3
+     (b)     2+a             2.5     2.67    2.75    2.8     2 < e < 3
+     (b')    2+b             3.5     3.33    3.25    3.2     3 < e < 4
+     (c)     2a              1       1.33    1.5     1.6         e < 2
+     (c')    a+b             2       2       2       2           e ~ 2
+     (c'')   2b              3       2.67    2.5     2.4     2 < e < 3
+     (d)     1+2a            2       2.33    2.5     2.6     2 < e < 3
+     (d')    1+a+b           3       3       3       3           e ~ 3
+     (d'')   1+2b            4       3.67    3.5     3.4     3 < e < 4
+     (e)     2+2a            3       3.33    3.5     3.6     3 < e < 4
+     (e')    2+a+b           4       4       4       4           e ~ 4
+     (e'')   2+2b            5       4.67    4.5     4.4     4 < e
+
+   We can notice that (i) fails for the cases (c"), (d), (d"), and (e).
+The other three choices get all values in the correct intervals. The
+main distinction between them is the relative ordering of (c") and (d)
+(or analogously (d") and (e)). If we do a more detailed analysis of
+these we can see that in both cases `O' can secure the eye
+unconditionally if he moves first while `X' can falsify it with ko if
+he moves first. The difference is that in (c"), `X' has to make the
+first ko threat, while in (d), O has to make the first ko threat.  Thus
+(c") is better for O and ought to have a smaller topological eye value
+than (d). This gives an indication that (iv) is the better choice.
+
+   We can notice that any value of `a', `b' satisfying `a+b=2' and
+`3/4<a<1' would have the same qualities as choice (iv) according to the
+analysis above. One interesting choice is `a=7/8, b=9/8' since these
+allow exact computations with floating point values having a binary
+mantissa. The latter property is shared by `a=3/4' and `a=1/2'.
+
+   When there are three kos around the same eyespace, things become
+more complex. This case is, however, rare enough that we ignore it.
+
+\1f
+File: gnugo.info,  Node: False Margins,  Next: Eye Functions,  Prev: Eye Topology with Ko,  Up: Eyes
+
+8.10 False Margins
+==================
+
+The following situation is rare but special enough to warrant separate
+attention:
+
+        OOOOXX
+        OXaX..
+        ------
+
+   Here `a' may be characterized by the fact that it is adjacent to O's
+eyespace, and it is also adjacent to an X group which cannot be
+attacked, but that an X move at 'a' results in a string with only one
+liberty. We call this a "false margin".
+
+   For the purpose of the eye code, O's eyespace should be parsed as
+`(X)', not `(X!)'.
+
+\1f
+File: gnugo.info,  Node: Eye Functions,  Prev: False Margins,  Up: Eyes
+
+8.11 Functions in `optics.c'
+============================
+
+The public function `make_domains()' calls the function
+`make_primary_domains()' which is static in `optics.c'. It's purpose is
+to compute the domains of influence of each color, used in determining
+eye shapes. *Note*: the term influence as used here is distinct from the
+influence in influence.c.
+
+   For this algorithm the strings which are not lively are invisible.
+Ignoring these, the algorithm assigns friendly influence to
+
+  1. every vertex which is occupied by a (lively) friendly stone,
+
+  2. every empty vertex adjoining a (lively) friendly stone,
+
+  3. every empty vertex for which two adjoining vertices (not on the
+     first line) in the (usually 8) surrounding ones have friendly
+     influence, with two CAVEATS explained below.
+
+   Thus in the following diagram, `e' would be assigned friendly
+influence if `a' and `b' have friendly influence, or `a' and `d'. It is
+not sufficent for `b' and `d' to have friendly influence, because they
+are not adjoining.
+
+            uabc
+             def
+             ghi
+
+   The constraint that the two adjoining vertices not lie on the first
+line prevents influence from leaking under a stone on the third line.
+
+   The first CAVEAT alluded to above is that even if `a' and `b' have
+friendly influence, this does not cause `e' to have friendly influence
+if there is a lively opponent stone at `d'. This constraint prevents
+influence from leaking past knight's move extensions.
+
+   The second CAVEAT is that even if `a' and `b' have friendly influence
+this does not cause `e' to have influence if there are lively opponent
+stones at `u' and at `c'. This prevents influence from leaking past
+nikken tobis (two space jumps).
+
+   The corner vertices are handled slightly different.
+
+        +---
+        |ab
+        |cd
+
+   We get friendly influence at `a' if we have friendly influence at
+`b' or `c' and no lively unfriendly stone at `b', `c' or `d'.
+
+   Here are the public functions in `optics.c', except some simple
+access functions used by autohelpers. The statically declared functions
+are documented in the source code.
+
+   * `void make_domains(struct eye_data b_eye[BOARDMAX], struct
+     eye_data w_eye[BOARDMAX], int owl_call)' 
+
+          This function is called from `make_dragons()' and from
+          `owl_determine_life()'. It marks the black and white domains
+          (eyeshape regions) and collects some statistics about each
+          one.
+
+   * `void partition_eyespaces(struct eye_data eye[BOARDMAX], int
+     color)' 
+
+          Find connected eyespace components and compute relevant
+          statistics.
+
+   * `void propagate_eye(int origin, struct eye_data eye[BOARDMAX])' 
+
+          propagate_eye(origin) copies the data at the (origin) to the
+          rest of the eye (invariant fields only).
+
+   * `int find_eye_dragons(int origin, struct eye_data eye[BOARDMAX],
+     int eye_color, int dragons[], int max_dragons)' 
+
+          Find the dragon or dragons surrounding an eye space. Up to
+          max_dragons dragons adjacent to the eye space are added to
+          the dragon array, and the number of dragons found is returned.
+
+   * `void compute_eyes(int pos, struct eyevalue *value, int
+     *attack_point, int *defense_point, struct eye_data eye[BOARDMAX],
+     struct half_eye_data heye[BOARDMAX], int add_moves)' 
+
+          Given an eyespace with origin `pos', this function computes
+          the minimum and maximum numbers of eyes the space can yield.
+          If max and min are different, then vital points of attack and
+          defense are also generated. If `add_moves == 1', this
+          function may add a move_reason for `color' at a vital point
+          which is found by the function. If `add_moves == 0', set
+          `color = EMPTY.'
+
+   * `void compute_eyes_pessimistic(int pos, struct eyevalue *value,
+     int *pessimistic_min, int *attack_point, int *defense_point,
+     struct eye_data eye[BOARDMAX], struct half_eye_data
+     heye[BOARDMAX])' 
+
+          This function works like `compute_eyes()', except that it
+          also gives a pessimistic view of the chances to make eyes.
+          Since it is intended to be used from the owl code, the option
+          to add move reasons has been removed.
+
+   * `void add_false_eye(int pos, struct eye_data eye[BOARDMAX], struct
+     half_eye_data heye[BOARDMAX])' 
+
+          turns a proper eyespace into a margin.
+
+   * `int is_eye_space(int pos)'
+
+   * `int is_proper_eye_space(int pos)' 
+
+          These functions are used from constraints to identify eye
+          spaces, primarily for late endgame moves.
+
+   * `int max_eye_value(int pos)' 
+
+          Return the maximum number of eyes that can be obtained from
+          the eyespace at `(i, j)'. This is most useful in order to
+          determine whether the eyespace can be assumed to produce any
+          territory at all.
+
+   * `int is_marginal_eye_space(int pos)'
+
+   * `int is_halfeye(struct half_eye_data heye[BOARDMAX], int pos)'
+
+   * `int is_false_eye(struct half_eye_data heye[BOARDMAX], int pos)' 
+
+          These functions simply return information about an eyeshape
+          that has already been analyzed. (They do no real work.)
+
+   * `void find_half_and_false_eyes(int color, struct eye_data
+     eye[BOARDMAX], struct half_eye_data heye[BOARDMAX], int
+     find_mask[BOARDMAX])' 
+
+          Find topological half eyes and false eyes by analyzing the
+          diagonal intersections, as described in the Texinfo
+          documentation (Eyes/Eye Topology).
+
+   * `float topological_eye(int pos, int color, struct eye_data
+     my_eye[BOARDMAX],struct half_eye_data heye[BOARDMAX])' 
+
+          See Texinfo documentation (Eyes:Eye Topology). Returns:
+             * 2 or less if `pos' is a proper eye for `color';
+
+             * between 2 and 3 if the eye can be made false only by ko
+
+             * 3 if `pos' is a half eye;
+
+             * between 3 and 4 if the eye can be made real only by ko
+
+             * 4 or more if `pos' is a false eye.
+          Attack and defense points for control of the diagonals are
+          stored in the `heye[]' array.  `my_eye' is the eye space
+          information with respect to `color'.
+
+   * `int obvious_false_eye(int pos, int color)' 
+
+          Conservative relative of `topological_eye()'. Essentially the
+          same algorithm is used, but only tactically safe opponent
+          strings on diagonals are considered. This may underestimate
+          the false/half eye status, but it should never be
+          overestimated.
+
+   * `void set_eyevalue(struct eyevalue *e, int a, int b, int c, int d)' 
+
+          set parameters into the `struct eyevalue' as follows: (*note
+          Eye Local Game Values::):
+               struct eyevalue { /* number of eyes if: */
+                 unsigned char a; /* attacker plays first twice */
+                 unsigned char b; /* attacker plays first */
+                 unsigned char c; /* defender plays first */
+                 unsigned char d; /* defender plays first twice */
+               };
+
+   * `int min_eye_threat(struct eyevalue *e)' 
+
+          Number of eyes if attacker plays first twice (the threat of
+          the first move by attacker).
+
+   * `int min_eyes(struct eyevalue *e)' 
+
+          Number of eyes if attacker plays first followed by
+          alternating play.
+
+   * `int max_eyes(struct eyevalue *e)' 
+
+          Number of eyes if defender plays first followed by
+          alternating play.
+
+   * `int max_eye_threat(struct eyevalue *e)' 
+
+          Number of eyes if defender plays first twice (the threat of
+          the first move by defender).
+
+   * `void add_eyevalues(struct eyevalue *e1, struct eyevalue *e2,
+     struct eyevalue *sum)' 
+
+          Add the eyevalues `*e1' and `*e2', leaving the result in
+          *sum. It is safe to let `sum' be the same as `e1' or `e2'.
+
+   * `char * eyevalue_to_string(struct eyevalue *e)' 
+
+          Produces a string containing the eyevalue. *Note*: the result
+          string is stored in a statically allocated buffer which will
+          be overwritten the next time this function is called.
+
+   * `void test_eyeshape(int eyesize, int *eye_vertices)' /* Test
+     whether the optics code evaluates an eyeshape consistently. */
+
+   * `int analyze_eyegraph(const char *coded_eyegraph, struct eyevalue
+     *value, char *analyzed_eyegraph)' 
+
+          Analyze an eye graph to determine the eye value and vital
+          moves.  The eye graph is given by a string which is encoded
+          with `%' for newlines and `O' for spaces. E.g., the eye graph
+
+                 !
+                .X
+               !...
+
+          is encoded as `OO!%O.X%!...'. (The encoding is needed for the
+          GTP interface to this function.) The result is an eye value
+          and a (nonencoded) pattern showing the vital moves, using the
+          same notation as eyes.db. In the example above we would get
+          the eye value 0112 and the graph (showing ko threat moves)
+
+
+                .X
+               !.*.
+
+          If the eye graph cannot be realized, 0 is returned, 1
+          otherwise.
+
+\1f
+File: gnugo.info,  Node: Patterns,  Next: Tactical Reading,  Prev: Eyes,  Up: Top
+
+9 The Pattern Code
+******************
+
+* Menu:
+
+* Patterns Overview::             Overview of the pattern database.
+* Pattern Classification::        The classification field
+* Pattern Values::                The value field
+* Helper Functions::              Helper Functions
+* Autohelpers and Constraints::   Automatic generation of helper functions.
+* Autohelper Actions::            Autohelper Actions
+* Autohelper Functions::          Autohelper Functions
+* Attack and Defense DB::         The Attack and defense moves database.
+* Connections Database::          The connection database.
+* Connection Functions::          Functions in `connections.c'
+* Tuning::                        Tuning the pattern database.
+* PM Implementation::             Implementation.
+* Symmetry & transformations::    Symmetry and transformations.
+* Details::                       Details of implementation.
+* Grid optimization::             The ``grid'' optimization.
+* Joseki Compiler::               The joseki compiler.
+* Ladders in Joseki::             Example: ladders in joseki.
+* Corner Matcher::                A special matcher for joseki patterns.
+* Editing Patterns::              Emacs major mode for pattern files.
+
+\1f
+File: gnugo.info,  Node: Patterns Overview,  Next: Pattern Classification,  Up: Patterns
+
+9.1 Overview
+============
+
+Several pattern databases are in the patterns directory.  This chapter
+primarily discusses the patterns in `patterns.db', `patterns2.db', and
+the pattern files `hoshi.db' etc.  which are compiled from the SGF
+files `hoshi.sgf' (*note Joseki Compiler::). There is no essential
+difference between these files, except that the ones in `patterns.db'
+and `patterns2.db' are hand written. They are concatenated before being
+compiled by `mkpat' into `patterns.c'. The purpose of the separate file
+`patterns2.db' is that it is handy to move patterns into a new
+directory in the course of organizing them. The patterns in
+`patterns.db' are more disorganized, and are slowly being moved to
+`patterns2.db'.
+
+   During the execution of `genmove()', the patterns are matched in
+`shapes.c' in order to find move reasons.
+
+   The same basic pattern format is used by `attack.db', `defense.db',
+`conn.db', `apats.db' and `dpats.db'.  However these patterns are used
+for different purposes. These databases are discussed in other parts of
+this documentation. The patterns in `eyes.db' are entirely different
+and are documented elsewhere (*note Eyes::).
+
+   The patterns described in the databases are ascii representations, of
+the form:
+
+   Pattern EB112
+
+
+       ?X?.?       jump under
+       O.*oo
+       O....
+       o....
+       -----
+
+       :8,ed,NULL
+
+   Here `O' marks a friendly stone, `X' marks an enemy stone, `.' marks
+an empty vertex, `*' marks O's next move, `o' marks a square either
+containing `O' or empty but not `X'. (The symbol `x', which does not
+appear in this pattern, means `X' or `.'.) Finally `?' Indicates a
+location where we don't care what is there, except that it cannot be
+off the edge of the board.
+
+   The line of `-''s along the bottom in this example is the edge of the
+board itself--this is an edge pattern. Corners can also be indicated.
+Elements are not generated for `?' markers, but they are not completely
+ignored - see below.
+
+   The line beginning `:' describes various attributes of the pattern,
+such as its symmetry and its class. Optionally, a function called a
+"helper" can be provided to assist the matcher in deciding whether to
+accept move. Most patterns do not require a helper, and this field is
+filled with NULL.
+
+   The matcher in `matchpat.c' searches the board for places where this
+layout appears on the board, and the callback function
+`shapes_callback()' in `shapes.c' registers the appropriate move
+reasons.
+
+   After the pattern, there is some supplementary information in the
+format:
+
+       :trfno, classification, [values], helper_function
+
+   Here trfno represents the number of transformations of the pattern to
+consider, usually `8' (no symmetry, for historical reasons), or one of
+`|', `\', `/', `-', `+', `X', where the line represents the axis of
+symmetry. (E.g. `|' means symmetrical about a vertical axis.)
+
+   The above pattern could equally well be written on the left edge:
+
+
+       |oOO?
+       |...X
+       |..*?
+       |..o.
+       |..o?
+
+       :8,ed,NULL
+
+   The program `mkpat' is capable of parsing patterns written this way,
+or for that matter, on the top or right edges, or in any of the four
+corners. As a matter of convention all the edge patterns in
+`patterns.db' are written on the bottom edge or in the lower left
+corners. In the `patterns/' directory there is a program called
+`transpat' which can rotate or otherwise transpose patterns.  This
+program is not built by default--if you think you need it, `make
+transpat' in the `patterns/' directory and consult the usage remarks at
+the beginning of `patterns/transpat.c'.
+
+\1f
+File: gnugo.info,  Node: Pattern Classification,  Next: Pattern Values,  Prev: Patterns Overview,  Up: Patterns
+
+9.2 Pattern Attributes
+======================
+
+The attribute field in the `:' line of a pattern consists of a sequence
+of zero or more of the following characters, each with a different
+meaning. The attributes may be roughly classified as "constraints",
+which determine whether or not the pattern is matched, and "actions",
+which describe what is to be done when the pattern is matched, typically
+to add a move reason.
+
+9.2.1 Constraint Pattern Attributes
+-----------------------------------
+
+   * `s'
+
+          Safety of the move is not checked.  This is appropriate for
+          sacrifice patterns. If this classification is omitted, the
+          matcher requires that the stone played cannot be trivially
+          captured. Even with s classification, a check for legality is
+          made, though.
+
+   * `n'
+
+          In addition to usual check that the stone played cannot be
+          trivially captured, it is also confirmed that an opponent
+          move here could not be captured.
+
+   * `O'
+
+          It is checked that every friendly (`O') stone of the pattern
+          belongs to a dragon which has status (*note Dragons::)
+          `ALIVE' or `UNKNOWN'. The `CRITICAL' matcher status is
+          excluded. It is possible for a string to have `ALIVE' status
+          and still be tactically critical, since it might be
+          amalgamated into an ALIVE dragon, and the matcher status is
+          constant on the dragon.  Therefore, an additional test is
+          performed: if the pattern contains a string which is
+          tactically critical, and if `*' does not rescue it, the
+          pattern is rejected.
+
+   * `o'
+
+          It is checked that every friendly (`O') stone of the pattern
+          belongs to a dragon which is classified as `DEAD' or
+          `UNKNOWN'.
+
+   * `X'
+
+          It is checked that every opponent (`X') stone of the pattern
+          belongs to a dragon with status `ALIVE', `UNKNOWN' or
+          `CRITICAL'. Note that there is an asymmetry with `O'
+          patterns, where `CRITICAL' dragons are rejected.
+
+   * `x'
+
+          It is checked that every opponent (`X') stone of the pattern
+          belongs to a dragon which is classified as `DEAD' or `UNKNOWN'
+
+9.2.2 Action Attributes
+-----------------------
+
+   * `C'
+
+          If two or more distinct O dragons occur in the pattern, the
+          move is given the move reasons that it connects each pair of
+          dragons. An exception is made for dragons where the underlying
+          worm can be tactically captured and is not defended by the
+          considered move.
+
+   * `c'
+
+          Add strategical defense move reason for all our dragons and a
+          small shape bonus. This classification is appropriate for
+          weak connection patterns.
+
+   * `B'
+
+          If two or more distinct `X' dragons occur in the pattern, the
+          move is given the move reasons that it cuts each pair of
+          dragons.
+
+   * `e'
+
+          The move makes or secures territory.
+
+   * `E'
+
+          The move attempts increase influence and create/expand a moyo.
+
+   * `d'
+
+          The move strategically defends all O dragons in the pattern,
+          except those that can be tactically captured and are not
+          tactically defended by this move. If any O dragon should
+          happen to be perfectly safe already, this only reflects in
+          the move reason being valued to zero.
+
+   * `a'
+
+          The move strategically attacks all `X' dragons in the pattern.
+
+   * `J'
+
+          Standard joseki move. Unless there is an urgent move on the
+          board these moves are made as soon as they can be.  This is
+          equivalent to adding the `d' and `a' classifications together
+          with a minimum accepted value of 27.
+
+   * `F'
+
+          This indicates a fuseki pattern. This is only effective
+          together with either the `j' or `t' classification, and is
+          used to ensure indeterministic play during fuseki.
+
+   * `j'
+
+          Slightly less urgent joseki move. These moves will be made
+          after those with the `J' classification. This adds the `e'
+          and `E' classifications. If the move has the `F'
+          classification, it also gets a fixed value of 20.1, otherwise
+          it gets a minimum accepted value of 20. (This makes sure that
+          GNU Go chooses randomly between different moves that have
+          `jF' as classification.)
+
+   * `t'
+
+          Minor joseki move (tenuki OK). This is equivalent to adding
+          the `e' and `E' classifications together with either a fixed
+          value of 15.07 (if the move has `F' classification) or a
+          minimum value of 15 (otherwise).
+
+   * `U'
+
+          Urgent joseki move (never tenuki). This is equivalent to the
+          `d' and `a' classifications together with a shape bonus of 15
+          and a minimum accepted value of 40.
+
+A commonly used class is `OX' (which rejects pattern if either side has
+dead stones). The string `-' may be used as a placeholder. (In fact any
+characters other than the above and `,' are ignored.)
+
+   The types `o' and `O' could conceivably appear in a class, meaning it
+applies only to `UNKNOWN'. `X' and `x' could similarly be used together.
+All classes can be combined arbitrarily.
+
+\1f
+File: gnugo.info,  Node: Pattern Values,  Next: Helper Functions,  Prev: Pattern Classification,  Up: Patterns
+
+9.3 Pattern Attributes
+======================
+
+The second and following fields in the `:' line of a pattern are
+optional and of the form `value1(x),value2(y),...'. The available set
+of values are as follows.
+
+   * `terri(x)' 
+
+          Forces the territorial value of the move to be at least x.
+
+   * `minterri(x)' 
+
+          Forces the territorial value of the move to be at least x.
+
+   * `maxterri(x)' 
+
+          Forces the territorial value of the move to be at most x.
+
+   * `value(x)' 
+
+          Forces the final value of the move to be at least x.
+
+   * `minvalue(x)', `maxvalue(x)' 
+
+          Forces the final value of the move to be at least/most x.
+
+   * `shape(x)' 
+
+          Adds x to the move's shape value.
+
+   * `followup(x)' 
+
+          Adds x to the move's followup value.
+
+   The meaning of these values is documented in *Note Move Generation::.
+
+\1f
+File: gnugo.info,  Node: Helper Functions,  Next: Autohelpers and Constraints,  Prev: Pattern Values,  Up: Patterns
+
+9.4 Helper Functions
+====================
+
+Helper functions can be provided to assist the matcher in deciding
+whether to accept a pattern, register move reasons, and setting various
+move values. The helper is supplied with the compiled pattern entry in
+the table, and the (absolute) position on the board of the `*' point.
+
+   One difficulty is that the helper must be able to cope with all the
+possible transformations of the pattern. To help with this, the OFFSET
+macro is used to transform relative pattern coordinates to absolute
+board locations.
+
+   The actual helper functions are in `helpers.c'. They are declared in
+`patterns.h'.
+
+   As an example to show how to write a helper function, we consider a
+hypothetical helper called `wedge_helper'. Such a helper used to exist,
+but has been replaced by a constraint. Due to its simplicity it's still
+a good example. The helper begins with a comment:
+
+     /*
+
+     ?O.           ?Ob
+     .X*           aX*
+     ?O.           ?Oc
+
+     :8,C,wedge_helper
+     */
+
+   The image on the left is the actual pattern. On the right we've taken
+this image and added letters to label `apos', `bpos', and `cpos'. The
+position of *, the point where GNU Go will move if the pattern is
+adopted, is passed through the parameter `move'.
+
+     int
+     wedge_helper(ARGS)
+     {
+       int apos, bpos, cpos;
+       int other = OTHER_COLOR(color);
+       int success = 0;
+
+       apos = OFFSET(0, -2);
+       bpos = OFFSET(-1, 0);
+       cpos = OFFSET(1, 0);
+
+       if (TRYMOVE(move, color)) {
+         if (TRYMOVE(apos, other)) {
+           if (board[apos] == EMPTY || attack(apos, NULL))
+             success = 1;
+           else if (TRYMOVE(bpos, color)) {
+             if (!safe_move(cpos, other))
+               success = 1;
+             popgo();
+           }
+           popgo();
+         }
+         popgo();
+       }
+
+       return success;
+     }
+
+   The `OFFSET' lines tell GNU Go the positions of the three stones at
+`a', `b', and `c'. To decide whether the pattern guarantees a
+connection, we do some reading. First we use the `TRYMOVE' macro to
+place an `O' at `move' and let `X' draw back to `a'. Then we ask
+whether `O' can capture these stones by calling `attack()'. The test if
+there is a stone at `a' before calling `attack()' is in this position
+not really necessary but it's good practice to do so, because if the
+attacked stone should happen to already have been captured while
+placing stones, GNU Go would crash with an assertion failure.
+
+   If this attack fails we let `O' connect at `b' and use the
+`safe_move()' function to examine whether a cut by `X' at `c' could be
+immediately captured. Before we return the result we need to remove the
+stones we placed from the reading stack. This is done with the function
+`popgo()'.
+
+\1f
+File: gnugo.info,  Node: Autohelpers and Constraints,  Next: Autohelper Actions,  Prev: Helper Functions,  Up: Patterns
+
+9.5 Autohelpers and Constraints
+===============================
+
+In addition to the hand-written helper functions in `helpers.c', GNU Go
+can automatically generate helper functions from a diagram with labels
+and an expression describing a constraint. The constraint diagram,
+specifying the labels, is placed below the `:' line and the constraint
+expression is placed below the diagram on line starting with a `;'.
+Constraints can only be used to accept or reject a pattern. If the
+constraint evaluates to zero (false) the pattern is rejected, otherwise
+it's accepted (still conditioned on passing all other tests of course).
+To give a simple example we consider a connection pattern.
+
+
+     Pattern Conn311
+
+     O*.
+     ?XO
+
+     :8,C,NULL
+
+     O*a
+     ?BO
+
+     ;oplay_attack_either(*,a,a,B)
+
+   Here we have given the label `a' to the empty spot to the right of
+the considered move and the label `B' to the `X' stone in the pattern.
+In addition to these, `*' can also be used as a label. A label may be
+any lowercase or uppercase ascii letter except `OoXxt'. By convention
+we use uppercase letters for `X' stones and lowercase for `O' stones
+and empty intersections. When labeling a stone that's part of a larger
+string in the pattern, all stones of the string should be marked with
+the label. (These conventions are not enforced by the pattern compiler,
+but to make the database consistent and easy to read they should be
+followed.)
+
+   The labels can now be used in the constraint expression. In this
+example we have a reading constraint which should be interpreted as
+"Play an `O' stone at `*' followed by an `X' stone at `a'. Accept the
+pattern if `O' now can capture either at `a' or at `B' (or both
+strings)."
+
+   The functions that are available for use in the constraints are
+listed in the section `Autohelpers Functions' below. Technically the
+constraint expression is transformed by mkpat into an automatically
+generated helper function in `patterns.c'. The functions in the
+constraint are replaced by C expressions, often functions calls. In
+principle any valid C code can be used in the constraints, but there is
+in practice no reason to use anything more than boolean and arithmetic
+operators in addition to the autohelper functions.  Constraints can
+span multiple lines, which are then concatenated.
+
+\1f
+File: gnugo.info,  Node: Autohelper Actions,  Next: Autohelper Functions,  Prev: Autohelpers and Constraints,  Up: Patterns
+
+9.6 Autohelper Actions
+======================
+
+As a complement to the constraints, which only can accept or reject a
+pattern, one can also specify an action to perform when the pattern has
+passed all tests and finally has been accepted.
+
+   Example:
+
+
+     Pattern EJ4
+
+     ...*.     continuation
+     .OOX.
+     ..XOX
+     .....
+     -----
+
+     :8,Ed,NULL
+
+     ...*.     never play a here
+     .OOX.
+     .aXOX
+     .....
+     -----
+
+     >antisuji(a)
+
+   The line starting with `>' is the action line. In this case it tells
+the move generation that the move at a should not be considered,
+whatever move reasons are found by other patterns. The action line uses
+the labels from the constraint diagram. Both constraint and action can
+be used in the same pattern. If the action only needs to refer to `*',
+no constraint diagram is required. Like constraints, actions can span
+multiple lines.
+
+   Here is a partial list of the autohelper macros which are typically
+called from action lines. This list is not complete. If you cannot find
+an autohelper macro in an action line in this list, consult `mkpat.c' to
+find out what function in the engine is actually called. If no macro
+exists which does what you want, you can add macros by editing the list
+in `mkpat.c'.
+
+   * `antisuji(a);'
+
+          Mark `a' as an antisuji, that is, a move that must never be
+          played.
+
+   * `replace(a,*)'
+
+          This is appropriate if the move at `*' is definitely better
+          than the move at `a'. The macro adds a point redistribution
+          rule. Any points which are assigned to `a' during the move
+          generation by any move reason are redistributed to `*'.
+
+   * `prevent_attack_threat(a)'
+
+          Add a reverse followup value because the opponent's move here
+          would threaten to capture `a'.
+
+   * `threaten_to_save(a)'
+
+          Add a followup value because the move at `*' threatens to
+          rescue the dead string at `a'.
+
+   * `defend_against_atari(a)'
+
+          Estimate the value of defending the string `a' which can be
+          put into atari and add this as a reverse followup value.
+
+   * `add_defend_both_move(a,b);'
+
+
+   * `add_cut_move(c,d);'
+
+          Add to the move reasons that the move at `*' threatens to cut
+          `c' and `d'.
+
+\1f
+File: gnugo.info,  Node: Autohelper Functions,  Next: Attack and Defense DB,  Prev: Autohelper Actions,  Up: Patterns
+
+9.7 Autohelper Functions
+========================
+
+The autohelper functions are translated into C code by the program in
+`mkpat.c'. To see exactly how the functions are implemented, consult
+the autohelper function definitions in that file. Autohelper functions
+can be used in both constraint and action lines.
+
+
+     `lib(x)'
+     `lib2(x)'
+     `lib3(x)'
+     `lib4(x)'
+
+   Number of first, second, third, and fourth order liberties of a worm
+respectively. *Note Worms and Dragons::, the documentation on worms for
+definitions.
+
+
+     `xlib(x)'
+     `olib(x)'
+
+   The number of liberties that an enemy or own stone, respectively,
+would obtain if played at the empty intersection `x'.
+
+     `xcut(x)'
+     `ocut(x)'
+
+   Calls `cut_possible' (*note General Utilities::) to determine
+whether `X' or `O' can cut at the empty intersection `x'.
+
+     `ko(x)'
+
+   True if `x' is either a stone or an empty point involved in a ko
+position.
+
+     `status(x)'
+
+   The matcher status of a dragon. status(x) returns an integer that
+can have the values `ALIVE', `UNKNOWN', `CRITICAL', or `DEAD' (*note
+Worms and Dragons::).
+
+     `alive(x)'
+     `unknown(x)'
+     `critical(x)'
+     `dead(x)'
+
+   Each function true if the dragon has the corresponding matcher
+status and false otherwise (*note Worms and Dragons::).
+
+     `status(x)'
+
+   Returns the status of the dragon at `x' (*note Worms and Dragons::).
+
+     `genus(x)'
+
+   The number of eyes of a dragon. It is only meaningful to compare this
+value against 0, 1, or 2.
+
+
+     `xarea(x)'
+     `oarea(x)'
+     `xmoyo(x)'
+     `omoyo(x)'
+     `xterri(x)'
+     `oterri(x)'
+
+   These functions call `whose_territory()', `whose_moyo()' and
+`whose_area()' (*note Territory and Moyo::). For example `xarea(x)'
+evaluates to true if `x' is either a living enemy stone or an empty
+point within the opponent's "area". The function `oarea(x)' is
+analogous but with respect to our stones and area.  The main difference
+between area, moyo, and terri is that area is a very far reaching kind
+of influence, moyo gives a more realistic estimate of what may turn in
+to territory, and terri gives the points that already are believed to
+be secure territory.
+
+     `weak(x)'
+
+   True for a dragon that is perceived as weak.
+
+
+     `attack(x)'
+     `defend(x)'
+
+   Results of tactical reading. `attack(x)' is true if the worm can be
+captured, `defend(x)' is true if there also is a defending move. Please
+notice that `defend(x)' will return false if there is no attack on the
+worm.
+
+
+     `safe_xmove(x)'
+     `safe_omove(x)'
+
+   True if an enemy or friendly stone, respectively, can safely be
+played at `x'. By safe it is understood that the move is legal and that
+it cannot be captured right away.
+
+
+     `legal_xmove(x)'
+     `legal_omove(x)'
+
+   True if an enemy or friendly stone, respectively, can legally be
+played at x.
+
+
+     o_somewhere(x,y,z, ...)
+     x_somewhere(x,y,z, ...)
+
+   True if O (respectively X) has a stone at one of the labelled
+vertices.  In the diagram, these vertices should be marked with a `?'.
+
+
+     odefend_against(x,y)
+     xdefend_against(x,y)
+
+   True if an own stone at `x' would stop the enemy from safely playing
+at `y', and conversely for the second function.
+
+
+     `does_defend(x,y)'
+     `does_attack(x,y)'
+
+   True if a move at `x' defends/attacks the worm at `y'. For defense a
+move of the same color as `y' is tried and for attack a move of the
+opposite color.
+
+
+     `xplay_defend(a,b,c,...,z)'
+     `oplay_defend(a,b,c,...,z)'
+     `xplay_attack(a,b,c,...,z)'
+     `oplay_attack(a,b,c,...,z)'
+
+   These functions make it possible to do more complex reading
+experiments in the constraints. All of them work so that first the
+sequence of moves `a',`b',`c',... is played through with alternating
+colors, starting with `X' or `O' as indicated by the name. Then it is
+tested whether the worm at `z' can be attacked or defended,
+respectively. It doesn't matter who would be in turn to move, a worm of
+either color may be attacked or defended. For attacks the opposite
+color of the string being attacked starts moving and for defense the
+same color starts. The defend functions return true if the worm cannot
+be attacked in the position or if it can be attacked but also defended.
+The attack functions return true if there is a way to capture the worm,
+whether or not it can also be defended. If there is no stone present at
+`z' after the moves have been played, it is assumed that an attack has
+already been successful or a defense has already failed.  If some of
+the moves should happen to be illegal, typically because it would have
+been suicide, the following moves are played as if nothing has happened
+and the attack or defense is tested as usual. It is assumed that this
+convention will give the relevant result without requiring a lot of
+special cases.
+
+   The special label `?' can be used to represent a tenuki.  Thus
+`oplay_defend(a,?,b,c)' tries moves by `O' at `a' and `b', as if `X'
+plays the second move in another part of the board, then asks if `c'
+can be defended. The tenuki cannot be the first move of the sequence,
+nor does it need to be: instead of `oplay_defend(?,a,b,c)' you can use
+`xplay_defend(a,b,c)'.
+
+     `xplay_defend_both(a,b,c,...,y,z)'
+     `oplay_defend_both(a,b,c,...,y,z)'
+     `xplay_attack_either(a,b,c,...,y,z)'
+     `oplay_attack_either(a,b,c,...,y,z)'
+
+   These functions are similar to the previous ones. The difference is
+that the last *two* arguments denote worms to be attacked or defended
+simultaneously. Obviously `y' and `z' must have the same color. If
+either location is empty, it is assumed that an attack has been
+successful or a defense has failed. The typical use for these functions
+is in cutting patterns, where it usually suffices to capture either
+cutstone.
+
+   The function `xplay_defend_both' plays alternate moves beginning
+with an `X' at `a'. Then it passes the last two arguments to
+`defend_both' in `engine/utils.c'. This function checks to determine
+whether the two strings can be simultaneously defended.
+
+   The function `xplay_attack_either' plays alternate moves beginning
+with an `X' move at `a'. Then it passes the last two arguments to
+`attack_either' in `engine/utils.c'. This function looks for a move
+which captures at least one of the two strings. In its current
+implementation `attack_either' only looks for uncoordinated attacks and
+would thus miss a double atari.
+
+     `xplay_connect(a,b,c,...,y,z)'
+     `oplay_connect(a,b,c,...,y,z)'
+     `xplay_disconnect(a,b,c,...,y,z)'
+     `oplay_disconnect(a,b,c,...,y,z)'
+
+   The function `xplay_connect(a,b,c,...,y,z)' begins with an `X' move
+at `a', then an `O' move at `b', and so forth, then finally calls
+`string_connect()' to determine whether `x' and `y' can be connected.
+The other functions are similar (*note Connection Reading::).
+
+
+     `xplay_break_through(a,b,c,...,x,y,z)'
+     `oplay_break_through(a,b,c,...,x,y,z)'
+
+   These functions are used to set up a position like
+
+
+     .O.    .y.
+     OXO    xXz
+
+and `X' aims at capturing at least one of `x', `y', and `z'. If this
+succeeds `1' is returned. If it doesn't, `X' tries instead to cut
+through on either side and if this succeeds, `2' is returned. Of course
+the same shape with opposite colors can also be used.
+
+   Important notice: `x', `y', and `z' must be given in the order they
+have in the diagram above, or any reflection and/or rotation of it.
+
+     seki_helper(x)
+
+   Checks whether the string at `x' can attack any surrounding string.
+If so, return false as the move to create a seki (probably) wouldn't
+work.
+
+     threaten_to_save(x)
+
+   Calls `add_followup_value' to add as a move reason a conservative
+estimate of the value of saving the string `x' by capturing one opponent
+stone.
+
+     area_stone(x)
+
+   Returns the number of stones in the area around `x'.
+
+     area_space(x)
+
+   Returns the amount of space in the area around `x'.
+
+     `eye(x)'
+     `proper_eye(x)'
+     `marginal_eye(x)'
+
+   True if `x' is an eye space for either color, a non-marginal eye
+space for either color, or a marginal eye space for either color,
+respectively.
+
+     `antisuji(x)'
+
+   Tell the move generation that `x' is a substandard move that never
+should be played.
+
+     same_dragon(x,y)
+     same_worm(x,y)
+
+   Return true if `x' and `y' are the same dragon or worm respectively.
+
+     `dragonsize(x)'
+     `wormsize(x)'
+
+   Number of stones in the indicated dragon or worm.
+
+     `add_connect_move(x,y)'
+     `add_cut_move(x,y)'
+     `add_attack_either_move(x,y)'
+     `add_defend_both_move(x,y)'
+
+   Explicitly notify the move generation about move reasons for the move
+in the pattern.
+
+     `halfeye(x)'
+
+   Returns true if the empty intersection at `x' is a half eye.
+
+     `remove_attack(x)'
+
+   Inform the tactical reading that a supposed attack does in fact not
+work.
+
+     `potential_cutstone(x)'
+
+   True if `cutstone2' field from worm data is larger than one. This
+indicates that saving the worm would introduce at least two new cutting
+points.
+
+     `not_lunch(x,y)'
+
+   Prevents the misreporting of `x' as lunch for `y'.  For example, the
+following pattern tells GNU Go that even though the stone at `a' can be
+captured, it should not be considered "lunch" for the dragon at `b',
+because capturing it does not produce an eye:
+
+     XO|          ba|
+     O*|          O*|
+     oo|          oo|
+     ?o|          ?o|
+
+     > not_lunch(a,b)
+
+     `vital_chain(x)'
+
+   Calls `vital_chain' to determine whether capturing the stone at `x'
+will result in one eye for an adjacent dragon. The current
+implementation just checks that the stone is not a singleton on the
+first line.
+
+     `amalgamate(x,y)'
+
+   Amalgamate (join) the dragons at `x' and `y' (*note Worms and
+Dragons::).
+
+     `amalgamate_most_valuable(x,y,z)'
+
+   Called when `x', `y', `z' point to three (preferably distinct)
+dragons, in situations such as this:
+
+
+     .O.X
+     X*OX
+     .O.X
+
+   In this situation, the opponent can play at `*', preventing the
+three dragons from becoming connected. However `O' can decide which cut
+to allow. The helper amalgamates the dragon at `y' with either `x' or
+`z', whichever is largest.
+
+     make_proper_eye(x)
+
+   This autohelper should be called when `x' is an eyespace which is
+misidentified as marginal. It is reclassified as a proper eyespace
+(*note Eye Space::).
+
+     remove_halfeye(x)
+
+   Remove a half eye from the eyespace. This helper should not be run
+after `make_dragons' is finished, since by that time the eyespaces have
+already been analyzed.
+
+     remove_eyepoint(x)
+
+   Remove an eye point. This function can only be used before the
+segmentation into eyespaces.
+
+     `owl_topological_eye(x,y)'
+
+   Here `x' is an empty intersection which may be an eye or half eye
+for some dragon, and `y' is a stone of the dragon, used only to
+determine the color of the eyespace in question. Returns the sum of the
+values of the diagonal intersections, relative to `x', as explained in
+*Note Eye Topology::, equal to 4 or more if the eye at `x' is false, 3
+if it is a half eye, and 2 if it is a true eye.
+
+     `owl_escape_value(x)'
+
+   Returns the escape value at `x'. This is only useful in owl attack
+and defense patterns.
+
+\1f
+File: gnugo.info,  Node: Attack and Defense DB,  Next: Connections Database,  Prev: Autohelper Functions,  Up: Patterns
+
+9.8 Attack and Defense Database
+===============================
+
+The patterns in `attack.db' and `defense.db' are used to assist the
+tactical reading in finding moves that attacks or defends worms. The
+matching is performed during `make_worms()', at the time when the
+tactical status of all worms is decided. None of the classes described
+above are useful in these databases, instead we have two other classes.
+
+`D'
+     For each `O' worm in the pattern that can be tactically captured
+     (`worm[m][n].attack_code != 0'), the move at `*' is tried. If it
+     is found to defend the stone, this is registered as a reason for
+     the move `*' and the defense point of the worm is set to `*'.
+
+`A'
+     For each `X' worm in the pattern, it's tested whether the move at
+     `*' captures the worm. If that is the case, this is registered as
+     a reason for the move at `*'. The attack point of the worm is set
+     to `*' and if it wasn't attacked before, a defense is searched for.
+
+   Furthermore, `A' patterns can only be used in `attack.db' and `D'
+patterns only in `defense.db'. Unclassified patterns may appear in
+these databases, but then they must work through actions to be
+effective.
+
+\1f
+File: gnugo.info,  Node: Connections Database,  Next: Connection Functions,  Prev: Attack and Defense DB,  Up: Patterns
+
+9.9 The Connections Database
+============================
+
+The patterns in `conn.db' are used for helping `make_dragons()'
+amalgamate worms into dragons and to some extent for modifying eye
+spaces.  The patterns in this database use the classifications `B',
+`C', and `e'. `B' patterns are used for finding cutting points, where
+amalgamation should not be performed, `C' patterns are used for finding
+existing connections, over which amalgamation is to be done, and `e'
+patterns are used for modifying eye spaces and reevaluating lunches.
+There are also some patterns without classification, which use action
+lines to have an impact. These are matched together with the `C'
+patterns. Further details and examples can be found in *Note Worms and
+Dragons::.
+
+   We will illustrate these databases by example. In this situation:
+
+     XOO
+     O.O
+     ...
+   `X' cannot play safely at the cutting point, so the `O' dragons are
+to be amalgamated. Two patterns are matched here:
+
+     Pattern CC204
+
+     O
+     .
+     O
+
+     :+,C
+
+     O
+     A
+     O
+
+     ;!safe_xmove(A) && !ko(A) && !xcut(A)
+
+     Pattern CC205
+
+     XO
+     O.
+
+     :\,C
+
+     AO
+     OB
+
+     ;attack(A) || (!safe_xmove(B) && !ko(B) && !xcut(B))
+
+   The constraints are mostly clear. For example the second pattern
+should not be matched if the `X' stone cannot be attacked and `X' can
+play safely at `B', or if `B' is a ko. The constraint `!xcut(B)' means
+that connection has not previously been inhibited by `find_cuts'. For
+example consider this situation:
+
+
+     OOXX
+     O.OX
+     X..O
+     X.OO
+   The previous pattern is matched here twice, yet `X' can push in and
+break one of the connections. To fix this, we include a pattern:
+
+     Pattern CB11
+
+     ?OX?
+     O!OX
+     ?*!O
+     ??O?
+
+     :8,B
+
+     ?OA?
+     OaOB
+     ?*bO
+     ??O?
+
+     ; !attack(A) && !attack(B) && !xplay_attack(*,a,b,*) && !xplay_attack(*,b,a,*)
+
+   After this pattern is found, the `xcut' autohelper macro will return
+true at any of the points `*', `a' and `b'. Thus the patterns `CB204'
+and `CB205' will not be matched, and the dragons will not be
+amalgamated.
+
+\1f
+File: gnugo.info,  Node: Connection Functions,  Next: Tuning,  Prev: Connections Database,  Up: Patterns
+
+9.10 Connections Functions
+==========================
+
+Here are the public functions in `connections.c'.
+
+   * `static void cut_connect_callback(int m, int n, int color,
+     struct pattern *pattern, int ll, void *data)' 
+
+          Try to match all (permutations of) connection patterns at
+          `(m,n)'.  For each match, if it is a B pattern, set cutting
+          point in worm data structure and make eye space marginal for
+          the connection inhibiting entries of the pattern. If it is a
+          `C' pattern, amalgamate the dragons in the pattern.
+
+   * `void find_cuts(void)' 
+
+          Find cutting points which should inhibit amalgamations and
+          sever the adjacent eye space. This goes through the
+          connection database consulting only patterns of type B. When
+          such a function is found, the function `cut_connect_callback'
+          is invoked.
+
+   * `void find_connections(void)' 
+
+          Find explicit connection patterns and amalgamate the involved
+          dragons.  This goes through the connection database
+          consulting patterns except those of type B, E or e. When such
+          a function is found, the function `cut_connect_callback' is
+          invoked.
+
+   * void modify_eye_spaces1(void) 
+
+          Find explicit connection patterns and amalgamate the involved
+          dragons.  This goes through the connection database
+          consulting only patterns of type E (*note Connections
+          Database::). When such a function is found, the function
+          `cut_connect_callback' is invoked.
+
+   * void modify_eye_spaces1(void) 
+
+          Find explicit connection patterns and amalgamate the involved
+          dragons.  This goes through the connection database
+          consulting only patterns of type e (*note Connections
+          Database::). When such a function is found, the function
+          `cut_connect_callback' is invoked.
+
+\1f
+File: gnugo.info,  Node: Tuning,  Next: PM Implementation,  Prev: Connection Functions,  Up: Patterns
+
+9.11 Tuning the Pattern databases
+=================================
+
+Since the pattern databases, together with the valuation of move
+reasons, decide GNU Go's personality, much time can be devoted to
+"tuning" them. Here are some suggestions.
+
+   If you want to experiment with modifying the pattern database, invoke
+with the `-a' option. This will cause every pattern to be evaluated,
+even when some of them may be skipped due to various optimizations.
+
+   You can obtain a Smart Game Format (SGF) record of your game in at
+least two different ways. One is to use CGoban to record the game. You
+can also have GNU Go record the game in Smart Game Format, using the
+`-o' option. It is best to combine this with `-a'. Do not try to read
+the SGF file until the game is finished and you have closed the game
+window. This does not mean that you have to play the game out to its
+conclusion. You may close the CGoban window on the game and GNU Go will
+close the SGF file so that you can read it.
+
+   If you record a game in SGF form using the `-o' option, GNU Go will
+add labels to the board to show all the moves it considered, with their
+values. This is an extremely useful feature, since one can see at a
+glance whether the right moves with appropriate weights are being
+proposed by the move generation.
+
+   First, due to a bug of unknown nature, it occasionally happens that
+GNU Go will not receive the `SIGTERM' signal from CGoban that it needs
+to know that the game is over. When this happens, the SGF file ends
+without a closing parenthesis, and CGoban will not open the file. You
+can fix the file by typing:
+
+
+      echo ")" >>[filename]
+
+at the command line to add this closing parenthesis. Or you could add
+the ) using an editor.
+
+   Move values exceeding 99 (these should be rare) can be displayed by
+CGoban but you may have to resize the window in order to see all three
+digits. Grab the lower right margin of the CGoban window and pull it
+until the window is large. All three digits should be visible.
+
+   If you are playing a game without the `-o' option and you wish to
+analyze a move, you may still use CGoban's "Save Game" button to get an
+SGF file. It will not have the values of the moves labelled, of course.
+
+   Once you have a game saved in SGF format, you can analyze any
+particular move by running:
+
+
+       gnugo -l [filename] -L [move number] -t -a -w
+
+to see why GNU Go made that move, and if you make changes to the
+pattern database and recompile the program, you may ask GNU Go to
+repeat the move to see how the behavior changes. If you're using emacs,
+it's a good idea to run GNU Go in a shell in a buffer (M-x shell) since
+this gives good navigation and search facilities.
+
+   Instead of a move number, you can also give a board coordinate to
+`-L' in order to stop at the first move played at this location. If you
+omit the `-L' option, the move after those in the file will be
+considered.
+
+   If a bad move is proposed, this can have several reasons. To begin
+with, each move should be valued in terms of actual points on the
+board, as accurately as can be expected by the program. If it's not,
+something is wrong. This may have two reasons. One possibility is that
+there are reasons missing for the move or that bogus reasons have been
+found. The other possibility is that the move reasons have been
+misevaluated by the move valuation functions. Tuning of patterns is
+with a few exceptions a question of fixing the first kind of problems.
+
+   If there are bogus move reasons found, search through the trace
+output for the pattern that is responsible. (Some move reasons, e.g.
+most tactical attack and defense, do not originate from patterns. If no
+pattern produced the bogus move reason, it is not a tuning problem.)
+Probably this pattern was too general or had a faulty constraint. Try
+to make it more specific or correct bugs if there were any. If the
+pattern and the constraint looks right, verify that the tactical
+reading evaluates the constraint correctly. If not, this is either a
+reading bug or a case where the reading is too complicated for GNU Go.
+
+   If a connecting move reason is found, but the strings are already
+effectively connected, there may be missing patterns in `conn.db'.
+Similarly, worms may be incorrectly amalgamated due to some too general
+or faulty pattern in `conn.db'. To get trace output from the matching
+of patterns in `conn.db' you need to add a second `-t' option.
+
+   If a move reason is missing, there may be a hole in the database. It
+could also be caused by some existing pattern being needlessly
+specific, having a faulty constraint, or being rejected due to a
+reading mistake. Unless you are familiar with the pattern databases, it
+may be hard to verify that there really is a pattern missing. Look
+around the databases to try to get a feeling for how they are
+organized. (This is admittedly a weak point of the pattern databases,
+but the goal is to make them more organized with time.) If you decide
+that a new pattern is needed, try to make it as general as possible,
+without allowing incorrect matches, by using proper classification from
+among snOoXx and constraints. The reading functions can be put to good
+use. The reason for making the patterns as general as they can be is
+that we need a smaller number of them then, which makes the database
+much easier to maintain. Of course, if you need too complicated
+constraints, it's usually better to split the pattern.
+
+   If a move has the correct set of reasons but still is misevaluated,
+this is usually not a tuning problem. There are, however, some
+possibilities to work around these mistakes with the use of patterns.
+In particular, if the territorial value is off because `delta_terri()'
+give strange results, the (min)terri and maxterri values can be set by
+patterns as a workaround. This is typically done by the endgame
+patterns, where we can know the (minimum) value fairly well from the
+pattern. If it should be needed, (min)value and maxvalue can be used
+similarly. These possibilities should be used conservatively though,
+since such patterns are likely to become obsolete when better (or at
+least different) functions for e.g. territory estimation are being
+developed.
+
+   In order to choose between moves with the same move reasons, e.g.
+moves that connect two dragons in different ways, patterns with a
+nonzero shape value should be used. These should give positive shape
+values for moves that give good shape or good aji and negative values
+for bad shape and bad aji. Notice that these values are additive, so
+it's important that the matches are unique.
+
+   Sente moves are indicated by the use of the pattern followup value.
+This can usually not be estimated very accurately, but a good rule is
+to be rather conservative. As usual it should be measured in terms of
+actual points on the board. These values are also additive so the same
+care must be taken to avoid unintended multiple matches.
+
+   You can also get a visual display of the dragons using the `-T'
+option. The default GNU Go configuration tries to build a version with
+color support using either curses or the ansi escape sequences. You are
+more likely to find color support in rxvt than xterm, at least on many
+systems, so we recommend running:
+
+       gnugo -l [filename] -L [move number] -T
+
+in an rxvt window. If you do not see a color display, and if your host
+is a GNU/Linux machine, try this again in the Linux console.
+
+   Worms belonging to the same dragon are labelled with the same
+letters.  The colors indicate the value of the field `dragon.safety',
+which is set in `moyo.c'.
+
+Green:  GNU Go thinks the dragon is alive
+Yellow: Status unknown
+Blue:   GNU Go thinks the dragon is dead
+Red:    Status critical (1.5 eyes) or weak by the algorithm
+        in `moyo.c'
+
+   If you want to get the same game over and over again, you can
+eliminate the randomness in GNU Go's play by providing a fixed random
+seed with the `-r' option.
+
+\1f
+File: gnugo.info,  Node: PM Implementation,  Next: Symmetry & transformations,  Prev: Tuning,  Up: Patterns
+
+9.12 Implementation
+===================
+
+The pattern code in GNU Go is fairly straightforward conceptually, but
+because the matcher consumes a significant part of the time in choosing
+a move, the code is optimized for speed. Because of this there are
+implementation details which obscure things slightly.
+
+   In GNU Go, the ascii `.db' files are precompiled into tables (see
+`patterns.h') by a standalone program `mkpat.c', and the resulting `.c'
+files are compiled and linked into the main GNU Go executable.
+
+   Each pattern is compiled to a header, and a sequence of elements,
+which are (notionally) checked sequentially at every position and
+orientation of the board. These elements are relative to the pattern
+'anchor' (or origin).  One `X' or `O' stone is (arbitrarily) chosen to
+represent the origin of the pattern. (We cannot dictate one or the
+other since some patterns contain only one colour or the other.)  All
+the elements are in co-ordinates relative to this position. So a
+pattern matches "at" board position `(m,n,o)' if the the pattern anchor
+stone is on `(m,n)', and the other elements match the board when the
+pattern is transformed by transformation number `o'. (See below for the
+details of the transformations, though these should not be necessary)
+
+\1f
+File: gnugo.info,  Node: Symmetry & transformations,  Next: Details,  Prev: PM Implementation,  Up: Patterns
+
+9.13 Symmetry and transformations
+=================================
+
+In general, each pattern must be tried in each of 8 different
+permutations, to reflect the symmetry of the board. But some patterns
+have symmetries which mean that it is unnecessary (and therefore
+inefficient) to try all eight. The first character after the `:' can be
+one of `8',`|',`\',`/', `X', `-', `+', representing the axes of
+symmetry. It can also be `O', representing symmetry under 180 degrees
+rotation.
+
+transformation   I    -    |     .     \    l    r     /
+                ABC  GHI  CBA   IHG   ADG  CFI  GDA   IFC
+                DEF  DEF  FED   FED   BEH  BEH  HEB   HEB
+                GHI  ABC  IHG   CBA   CFI  ADG  IFC   GDA
+
+                 a    b    c     d     e    f    g     h
+
+   Then if the pattern has the following symmetries, the following are
+true:
+
+
+     |  c=a, d=b, g=e, h=f
+     -  b=a, c=d, e=f, g=h
+     \  e=a, g=b, f=c, h=d
+     /  h=a, f=b, g=c, e=d
+     O  a=d, b=c, e=h, f=g
+     X  a=d=e=h, b=c=f=g
+     +  a=b=c=d, e=f=g=h
+
+   We can choose to use transformations a,d,f,g as the unique
+transformations for patterns with either `|', `-', `\', or `/' symmetry.
+
+   Thus we choose to order the transformations a,g,d,f,h,b,e,c and
+choose first 2 for `X' and `+', the first 4 for `|', `-', `/', and `\',
+the middle 4 for `O', and all 8 for non-symmetrical patterns.
+
+   Each of the reflection operations (e-h) is equivalent to reflection
+about one arbitrary axis followed by one of the rotations (a-d).  We
+can choose to reflect about the axis of symmetry (which causes no net
+change) and can therefore conclude that each of e-h is equivalent to
+the reflection (no-op) followed by a-d.  This argument therefore
+extends to include `-' and `/' as well as `|' and `\'.
+
+\1f
+File: gnugo.info,  Node: Details,  Next: Grid optimization,  Prev: Symmetry & transformations,  Up: Patterns
+
+9.14 Implementation Details
+===========================
+
+  1. An entry in the pattern header states whether the anchor is an `X'
+     or an `O'. This helps performance, since all transformations can be
+     rejected at once if the anchor stone does not match. (Ideally, we
+     could just define that the anchor is always `O' or always `X', but
+     some patterns contain no `O' and some contain no `X'.)
+
+  2. The pattern header contains the size of the pattern (ie the
+     co-ordinates of the top left and bottom right elements) relative to
+     the anchor. This allows the pattern can be rejected quickly if
+     there is not room for the pattern to fit around the anchor stone
+     in a given orientation (ie it is too near the edge of the board).
+     The bounding box information must first be transformed like the
+     elements before it can be tested, and after transforming, we need
+     to work out where the top-left and bottom-right corners are.
+
+  3. The edge constraints are implemented by notionally padding the
+     pattern with rows or columns of `?' until it is exactly 19 (or
+     whatever the current board size is) elements wide or high. Then the
+     pattern is quickly rejected by (ii) above if it is not at the
+     edge. So the example pattern above is compiled as if it was written
+
+
+          "example"
+          .OO????????????????
+          *XX????????????????
+          o??????????????????
+          :8,80
+
+  4. The elements in a pattern are sorted so that non-space elements
+     are checked before space elements. It is hoped that, for most of
+     the game, more squares are empty, and so the pattern can be more
+     quickly rejected doing it this way.
+
+  5. The actual tests are performed using an 'and-compare' sequence.
+     Each board position is a 2-bit quantity.  %00 for empty, %01 for
+     `O', %10 for `X'.  We can test for an exact match by and-ing with
+     %11 (no-op), then comparing with 0, 1 or 2. The test for `o' is the
+     same as a test for 'not-X', ie not %10. So and with %01 should
+     give 0 if it matches. Similarly `x' is a test that bit 0 is not
+     set.
+
+
+\1f
+File: gnugo.info,  Node: Grid optimization,  Next: Joseki Compiler,  Prev: Details,  Up: Patterns
+
+9.15 The "Grid" Optimization
+============================
+
+The comparisons between pattern and board are performed as 2-bit
+bitwise operations. Therefore they can be performed in parallel,
+16-at-a-time on a 32-bit machine.
+
+   Suppose the board is layed out as follows :
+
+
+      .X.O....OO
+      XXXXO.....
+      .X..OOOOOO
+      X.X.......
+      ....X...O.
+
+which is internally stored internally in a 2d array (binary)
+
+
+      00 10 00 01 00 00 00 00 01 01
+      10 10 10 10 01 00 00 00 00 00
+      00 10 00 00 01 01 01 01 01 01
+      10 00 10 00 00 00 00 00 00 00
+      00 00 00 00 10 00 00 00 01 00
+
+we can compile this to a composite array in which each element stores
+the state of a 4x4 grid of squares :
+
+
+      ????????  ????????  ???????? ...
+      ??001000  00100001  10000100
+      ??101010  10101010  10101001
+      ??001000  00100000  10000001
+
+      ??001000  00100001  ...
+      ??101010  10101010
+      ??001000  00100000
+      ??001000  10001000
+
+     ...
+
+      ??100010  ...
+      ??000000
+      ????????
+      ????????
+
+   Where '??' is off the board.
+
+   We can store these 32-bit composites in a 2d merged-board array,
+substituting the illegal value %11 for '??'.
+
+   Similarly, for each pattern, mkpat produces appropriate 32-bit
+and-value masks for the pattern elements near the anchor. It is a
+simple matter to test the pattern with a similar test to (5) above, but
+for 32-bits at a time.
+
+\1f
+File: gnugo.info,  Node: Joseki Compiler,  Next: Ladders in Joseki,  Prev: Grid optimization,  Up: Patterns
+
+9.16 The Joseki Compiler
+========================
+
+GNU Go includes a joseki compiler in `patterns/joseki.c'. This processes
+an SGF file (with variations) and produces a sequence of patterns which
+can then be fed back into mkpat. The joseki database is currently in
+files in `patterns/' called `hoshi.sgf', `komoku.sgf', `sansan.sgf',
+`mokuhazushi.sgf' and `takamoku.sgf'.  This division can be revised
+whenever need arises.
+
+   The SGF files are transformed into the pattern database `.db' format
+by the program in `joseki.c'. These files are in turn transformed into C
+code by the program in `mkpat.c' and the C files are compiled and linked
+into the GNU Go binary.
+
+   Not every node in the SGF file contributes a pattern. The nodes which
+contribute patterns have the joseki in the upper right corner, with the
+boundary marked with a square mark and other information to determine
+the resulting pattern marked in the comments.
+
+   The intention is that the move valuation should be able to choose
+between the available variations by normal valuation. When this fails
+the primary workaround is to use shape values to increase or decrease
+the value. It is also possible to add antisuji variations to forbid
+popular suboptimal moves. As usual constraints can be used, e.g. to
+condition a variation on a working ladder.
+
+   The joseki format has the following components for each SGF node:
+
+   * A square mark (`SQ' or `MA' property) to decide how large part of
+     the board should be included in the pattern.
+
+   * A move (`W' or `B' property) with the natural interpretation.  If
+     the square mark is missing or the move is a pass, no pattern is
+     produced for the node.
+
+   * Optional labels (`LB' property), which must be a single letter
+     each.  If there is at least one label, a constraint diagram will be
+     produced with these labels.
+
+   * A comment (`C' property). As the first character it should have
+     one of the following characters to decide its classification:
+        - `U' - urgent move
+
+        - `S' or `J' - standard move
+
+        - `s' or `j' - lesser joseki
+
+        - `T' - trick move
+
+        - `t' - minor joseki move (tenuki OK)
+
+        - `0' - antisuji (`A' can also be used)
+     The rest of the line is ignored, as is the case of the letter. If
+     neither of these is found, it's assumed to be a standard joseki
+     move.
+
+     In addition to this, rows starting with the following characters
+     are recognized:
+        - `#' - Comments. These are copied into the patterns file,
+          above the diagram.
+
+        - `;' - Constraints. These are copied into the patterns file,
+          below the constraint diagram.
+
+        - `>' - Actions. These are copied into the patterns file, below
+          the constraint diagram.
+
+        - `:' - Colon line. This is a little more complicated, but the
+          colon line of the produced patterns always start out with
+          ":8,s" for transformation number and sacrifice pattern class
+          (it usually isn't a sacrifice, but it's pointless spending
+          time checking for tactical safety). Then a joseki pattern
+          class character is appended and finally what is included on
+          the colon line in the comment for the SGF node.
+
+   Example: If the comment in the SGF file looks like
+
+     F
+     :C,shape(3)
+     ;xplay_attack(A,B,C,D,*)
+
+the generated pattern will have a colon line
+
+     :8,sjC,shape(3)
+
+and a constraint
+
+     ;xplay_attack(A,B,C,D,*)
+
+\1f
+File: gnugo.info,  Node: Ladders in Joseki,  Next: Corner Matcher,  Prev: Joseki Compiler,  Up: Patterns
+
+9.17 Ladders in Joseki
+======================
+
+As an example of how to use autohelpers with the Joseki compiler, we
+consider an example where a Joseki is bad if a ladder fails. Assume we
+have the taisha and are considering connecting on the outside with the
+pattern
+
+     --------+
+     ........|
+     ........|
+     ...XX...|
+     ...OXO..|
+     ...*O...|
+     ....X...|
+     ........|
+     ........|
+
+   But this is bad unless we have a ladder in our favor. To check this
+we add a constraint which may look like
+
+     --------+
+     ........|
+     ........|
+     ...XX...|
+     ...OXO..|
+     ...*OAC.|
+     ....DB..|
+     ........|
+     ........|
+
+     ;oplay_attack(*,A,B,C,D)
+
+   In order to accept the pattern we require that the constraint on the
+semicolon line evaluates to true. This particular constraint has the
+interpretation "Play with alternating colors, starting with `O', on the
+intersections `*', `A', `B', and `C'. Then check whether the stone at
+`D' can be captured." I.e. play to this position
+
+     --------+
+     ........|
+     ........|
+     ...XX...|
+     ...OXO..|
+     ...OOXX.|
+     ....XO..|
+     ........|
+     ........|
+
+and call `attack()' to see whether the lower `X' stone can be captured.
+This is not limited to ladders, but in this particular case the reading
+will of course involve a ladder.
+
+   The constraint diagram above with letters is how it looks in the
+`.db' file. The joseki compiler knows how to create these from labels in
+the SGF node. `Cgoban' has an option to create one letter labels, but
+this ought to be a common feature for SGF editors.
+
+   Thus in order to implement this example in SGF, one would add labels
+to the four intersections and a comment:
+
+     ;oplay_attack(*,A,B,C,D)
+
+   The appropriate constraint (autohelper macro) will then be added to
+the Joseki `.db' file.
+
+\1f
+File: gnugo.info,  Node: Corner Matcher,  Next: Editing Patterns,  Prev: Ladders in Joseki,  Up: Patterns
+
+9.18 Corner Matcher
+===================
+
+GNU Go uses a special matcher for joseki patterns.  It has certain
+constraints on the patterns it can match, but is much faster and takes
+far less space to store patterns than the standard matcher.
+
+   Patterns used with corner matcher have to qualify the following
+conditions:
+
+   * They must be matchable only at a corner of the board (hence the
+     name of the matcher).
+
+   * They can consist only of `O', `X' and `.' elements.
+
+   * Of all pattern values (*note Pattern Values::), corner matcher only
+     support `shape(x)'.  This is not because the matcher cannot handle
+     other values in principle, just they are currently not used in
+     joseki databases.
+
+   Corner matcher was specifically designed for joseki patterns and
+they of course satisfy all the conditions above.  With some
+modifications corner matcher could be used for fuseki patterns as well,
+but fullboard matcher does its work just fine.
+
+   The main idea of the matcher is very same to the one of DFA matcher
+(*note Pattern matching with DFA::): check all available patterns at
+once, not a single pattern at a time.  A modified version of DFA
+matcher could be used for joseki pattern matching, but its database
+would be very large.  Corner matcher capitalizes on the fact that there
+are relatively few stones in each such pattern.
+
+   Corner pattern database is organized into a tree.  Nodes of the tree
+are called "variations".  Variations represent certain sets of stones
+in a corner of the board.  Root variation corresponds to an empty
+corner and a step down the tree is equivalent to adding a stone to the
+corner.  Each variation has several properties:
+
+   - stone position relative to the corner,
+
+   - a flag determining whether the stone color must be equal to the
+     first matched stone color,
+
+   - number of stones in the corner area (see below) of the variation
+     stone.
+
+   By corner area we define a rectangle which corners are the current
+corner of the board and the position of the stone (inclusive).  For
+instance, if the current board corner is A19 then corner area of a
+stone at C18 consists of A18, A19, B18, B19, C18 and C19.
+
+   Variation which is a direct child of the root variation matches if
+there is any stone at the variation position and the stone is alone in
+its corner area.
+
+   Variation at a deeper level of the tree matches if there is a stone
+of specified color in variation position and the number of stones in its
+corner area is equal to the number specified in variation structure.
+
+   When a certain variation matches, all its children has to be checked
+recursively for a match.
+
+   All leaf variations and some inner ones have patterns attached to
+them.  For a pattern to match, it is required that its _parent_
+variation matches.  In addition, it is checked that pattern is being
+matched for the appropriate color (using its variation "stone color"
+field) and that the number of stones in the area where the pattern is
+being matched is indeed equal to the number of stones in the pattern.
+The "stone position" property of the pattern variation determines the
+move suggested by the pattern.
+
+   Consider this joseki pattern which has four stones:
+
+     ------+
+     ......|
+     ......|
+     .O*...|
+     .XXO..|
+     ......|
+     ......|
+
+   To encode it for the corner matcher, we have to use five variations,
+each next being a child of previous:
+
+Tree level   Position   Color     Number of stones
+1            R16        "same"    1
+2            P17        "same"    1
+3            Q16        "other"   2
+4            P16        "other"   4
+5            Q17        "same"    1
+
+   The fifth variation should have an attached pattern.  Note that the
+stone color for the fifth variation is "same" because the first matched
+stone for this pattern is `O' which stands for the stones of the player
+to whom moves are being suggested with `*'.
+
+   The tree consists of all variations for all patterns combined
+together.  Variations for each patterns are sorted to allow very quick
+tree branch rejection and at the same time keep the database small
+enough.  More details can be found in comments in file `mkpat.c'
+
+   Corner matcher resides in `matchpat.c' in two functions:
+`corner_matchpat()' and `do_corner_matchpat()'.  The former computes
+`num_stones[]' array which holds number of stones in corner areas of
+different intersections of the board for all possible transformations.
+`corner_matchpat()' also matches top-level variations.
+`do_corner_matchpat()' is responsible for recursive matching on the
+variation tree and calling callback function upon pattern match.
+
+   Tree-like database for corner matcher is generated by `mkpat'
+program.  Database generator consists of several functions, most
+important are: `corner_best_element()', `corner_variation_new()',
+`corner_follow_variation()' and `corner_add_pattern()'.
+
+\1f
+File: gnugo.info,  Node: Editing Patterns,  Prev: Corner Matcher,  Up: Patterns
+
+9.19 Emacs Mode for Editing Patterns
+====================================
+
+If you use GNU Emacs (XEmacs might work too), you can try a special
+mode for editing GNU Go pattern databases.  The mode resides in
+`patterns/gnugo-db.el'.
+
+   Copy the file to `emacs/site-lisp' directory.  You can then load the
+mode with `(require 'gnugo-db)'.  It makes sense to put this line into
+your configuration file (`~/.emacs').  You can either use
+`gnugo-db-mode' command to switch to pattern editing mode, or use the
+following code snippet to make Emacs do this automatically upon opening
+a file with `.db' suffix:
+
+       (setq auto-mode-alist
+             (append
+              auto-mode-alist
+              '(("\\.db\\'" . gnugo-db-mode))))
+
+   Pattern editing mode provides the following features:
+
+   - highlighting of keywords (`Pattern', `goal_elements' and
+     `callback_data') and comments,
+
+   - making paragraphs equal to patterns (`M-h', `M-{', `M-}' and
+     others operate on patterns),
+
+   - commands for pattern creation with automatic name selection (`C-c
+     C-p') and copying main diagram to constraint diagram (`C-c C-c'),
+
+   - automated indentation of constraints and side comments (pattern
+     descriptions).
+
+\1f
+File: gnugo.info,  Node: DFA,  Next: Utility Functions,  Prev: SGF,  Up: Top
+
+10 The DFA pattern matcher
+**************************
+
+In this chapter, we describe the principles of the GNU Go DFA pattern
+matcher.  The aim of this system is to permit a fast pattern matching
+when it becomes time critical like in owl module (*note The Owl
+Code::). Since GNU Go 3.2, this is enabled by default. You can still
+get back the traditional pattern matcher by running `configure
+--disable-dfa' and then recompiling GNU Go.
+
+   Otherwise, a finite state machine called a Deterministic Finite
+State Automaton (*note What is a DFA::) will be built off line from the
+pattern database. This is used at runtime to speedup pattern matching
+(*note Pattern matching with DFA:: and *note Incremental Algorithm::).
+The runtime speedup is at the cost of an increase in memory use and
+compile time.
+
+* Menu:
+
+* Introduction to the DFA::  Scanning the board along a path
+* What is a DFA:: A recall of language theory.
+* Pattern matching with DFA:: How to retrieve go patterns with a DFA?
+* Building the DFA:: Playing with explosives.
+* Incremental Algorithm:: The joy of determinism.
+* DFA Optimizations:: Some possible optimizations.
+
+\1f
+File: gnugo.info,  Node: Introduction to the DFA,  Next: What is a DFA,  Up: DFA
+
+10.1 Introduction to the DFA
+============================
+
+The general idea is as follows:
+
+   For each intersection of the board, its neighbourhood is scanned
+following a predefined path.  The actual path used does not matter very
+much; GNU Go uses a spiral as shown below.
+
+       +---B--------------+
+       | C 4 A . . . . . .|
+       D 5 1 3 9 . . . . .|
+       E 6 2 8 . . X . . .|
+       | F 7 . . . . . . .|
+       | . +-> . . . . . .|
+       | . . . . . . . . .|
+       | . O . . . X . . .|
+       | . . . . . . . . .|
+       | . . . . . . . . .|
+       +------------------+
+
+   In each step of the path, the pattern matcher jumps into a state
+determined by what it has found on the board so far. If we have
+successfully matched one or several patterns in this step, this state
+immediately tells us so (in its "attribute").  But the state also
+implicitly encodes which further patterns can still get matched: The
+information stored in the state contains in which state to jump next,
+depending on whether we find a black, white or empty intersection (or
+an intersection out of board) in the next step of the path. The state
+will also immediately tell us if we cannot find any further pattern (by
+telling us to jump into the "error" state).
+
+   These sloppy explanations may become clearer with the definitions in
+the next section (*note What is a DFA::).
+
+   Reading the board following a predefined path reduces the two
+dimentional pattern matching to a linear text searching problem.  For
+example, this pattern
+
+     ?X?
+     .O?
+     ?OO
+
+scanned following the path
+
+      B
+     C4A
+     5139
+     628
+      7
+
+gives the string "OO?X.?*O*?*?"  where "?" means 'don't care' and "*"
+means 'don't care, can even be out of board'.
+
+   So we can forget that we are dealing with two dimensional patterns
+and consider linear patterns.
+
+\1f
+File: gnugo.info,  Node: What is a DFA,  Next: Pattern matching with DFA,  Prev: Introduction to the DFA,  Up: DFA
+
+10.2 What is a DFA
+==================
+
+The acronym DFA means Deterministic Finite state Automaton (See
+`http://www.eti.pg.gda.pl/~jandac/thesis/node12.html' or `Hopcroft &
+Ullman "Introduction to Language Theory"' for more details).  DFA are
+common tools in compilers design (Read `Aho, Ravi Sethi, Ullman
+"COMPILERS: Principles, Techniques and Tools"' for a complete
+introduction), a lot of powerfull text searching algorithm like
+`Knuth-Morris-Pratt' or `Boyer-Moore' algorithms are based on DFA's
+(See `http://www-igm.univ-mlv.fr/~lecroq/string/' for a bibliography of
+pattern matching algorithms).
+
+   Basically, a DFA is a set of "states" connected by labeled
+"transitions".  The labels are the values read on the board, in GNU Go
+these values are EMPTY, WHITE, BLACK or OUT_BOARD, denoted respectively
+by '.','O','X' and '#'.
+
+   The best way to represent a DFA is to draw its transition graph: the
+pattern "????..X" is recognized by the following DFA:
+
+        .,X,O     .,X,O    .,X,O    .,X,O     .      .      X
+     [1]------>[2]----->[3]----->[4]----->[5]--->[6]--->[7]--->[8 OK!]
+     Start
+
+   This means that starting from state [1], if you read '.','X' or 'O'
+on the board, go to state [2] and so on until you reach state [5].
+From state [5], if you read '.', go to state [6] otherwise go to error
+state [0].  And so on until you reach state [8].  As soon as you reach
+state [8], you recognize Pattern "????..X"
+
+   Adding a pattern like "XXo" ('o' is a wildcard for not 'X') will
+transform directly the automaton by synchronization product (*note
+Building the DFA::).  Consider the following DFA:
+
+     Start .,O   .,X,O    .,O,X   .,X,O      .      .       X
+     [1]---->[2]----->[3]----->[4]------>[5]--->[6]---->[7]--->[8 OK!]
+      |                ^        ^         ^
+      |            .,O |        |         |
+      |            ----         |         |
+      |           |          X  |         |
+      |           |          ---    .,X,O |
+      |           |         |             |
+      |     X     |   X     | O,.         |
+       --------->[9]------>[A]--->[B OK!]-
+
+   By adding a special "error" state and completing each state by a
+transition to error state when there is none, we transform easily a DFA
+in a "Complete Deterministic Finite state Automaton" (CDFA).  The
+synchronization product (*note Building the DFA::) is only possible on
+CDFA's.
+
+     Start .,O   .,X,O    .,O,X   .,X,O      .      .       X
+     [1]---->[2]----->[3]----->[4]------>[5]--->[6]---->[7]--->[8 OK!]
+      |                ^        ^         ^      |       |      |
+      |            .,O |        |         |      |       |      |
+      |            ----         |         |      |       |      |
+      |           |          X  |         |      |X,O    | .,O  |X,.,O
+      |           |          ---    .,X,O |      |       |      |
+      |           |         |             |      |       |      |
+      |     X     |   X     | O,.         |     \ /     \ /    \ /
+       --------->[9]------>[A]--->[B OK!]-      [0  Error state !]
+
+   The graph of a CDFA is coded by an array of states: The 0 state is
+the "error" state and the start state is 1.
+
+     ----------------------------------------------------
+      state  |   .    |   O    |   X    |   #    |  att
+     ----------------------------------------------------
+           1 |      2 |      2 |      9 |      0 |
+           2 |      3 |      3 |      3 |      0 |
+           3 |      4 |      4 |      4 |      0 |
+           5 |      6 |      0 |      0 |      0 |
+           6 |      7 |      0 |      0 |      0 |
+           7 |      0 |      0 |      8 |      0 |
+           8 |      0 |      0 |      0 |      0 | Found pattern "????..X"
+           9 |      3 |      3 |      A |      0 |
+           A |      B |      B |      4 |      0 |
+           B |      5 |      5 |      5 |      0 | Found pattern "XXo"
+     ----------------------------------------------------
+
+   To each state we associate an often empty list of attributes which
+is the list of pattern indexes recognized when this state is reached.
+In '`dfa.h'' this is basically represented by two stuctures:
+
+     `
+     /* dfa state */
+     typedef struct state
+     {
+       int next[4]; /* transitions for EMPTY, BLACK, WHITE and OUT_BOARD */
+       attrib_t *att;
+     }
+     state_t;
+
+     /* dfa */
+     typedef struct dfa
+     {
+       attrib_t *indexes; /* Array of pattern indexes */
+       int maxIndexes;
+
+       state_t *states; /* Array of states */
+       int maxStates;
+     }
+     dfa_t;'
+
+\1f
+File: gnugo.info,  Node: Pattern matching with DFA,  Next: Building the DFA,  Prev: What is a DFA,  Up: DFA
+
+10.3 Pattern matching with DFA
+==============================
+
+Recognizing with a DFA is very simple and thus very fast (See
+'`scan_for_pattern()'' in the '`engine/matchpat.c'' file).
+
+   Starting from the start state, we only need to read the board
+following the spiral path, jump from states to states following the
+transitions labelled by the values read on the board and collect the
+patterns indexes on the way.  If we reach the error state (zero), it
+means that no more patterns will be matched.  The worst case complexity
+of this algorithm is o(m) where m is the size of the biggest pattern.
+
+   Here is an example of scan:
+
+   First we build a minimal DFA recognizing these patterns: "X..X",
+"X???", "X.OX" and "X?oX".  Note that wildcards like '?','o', or 'x'
+give multiple out-transitions.
+
+     ----------------------------------------------------
+      state  |   .    |   O    |   X    |   #    |  att
+     ----------------------------------------------------
+           1 |      0 |      0 |      2 |      0 |
+           2 |      3 |     10 |     10 |      0 |
+           3 |      4 |      7 |      9 |      0 |
+           4 |      5 |      5 |      6 |      0 |
+           5 |      0 |      0 |      0 |      0 |    2
+           6 |      0 |      0 |      0 |      0 |    4    2    1
+           7 |      5 |      5 |      8 |      0 |
+           8 |      0 |      0 |      0 |      0 |    4    2    3
+           9 |      5 |      5 |      5 |      0 |
+          10 |     11 |     11 |      9 |      0 |
+          11 |      5 |      5 |     12 |      0 |
+          12 |      0 |      0 |      0 |      0 |    4    2
+     ----------------------------------------------------
+
+   We perform the scan of the string "X..XXO...." starting from state 1:
+
+   Current state:     1, substring to scan : X..XXO....
+
+   We read an 'X' value, so from state 1 we must go to state 2.
+
+   Current state:     2, substring to scan : ..XXO....
+
+   We read a '.' value, so from state 2 we must go to state 3 and so on
+...
+
+     Current state:     3, substring to scan : .XXO....
+     Current state:     4, substring to scan : XXO....
+     Current state:     6, substring to scan : XO....
+     Found pattern 4
+     Found pattern 2
+     Found pattern 1
+
+   After reaching state 6 where we match patterns 1,2 and 4, there is
+no out-transitions so we stop the matching.  To keep the same match
+order as in the standard algorithm, the patterns indexes are collected
+in an array and sorted by indexes.
+
+\1f
+File: gnugo.info,  Node: Building the DFA,  Next: Incremental Algorithm,  Prev: Pattern matching with DFA,  Up: DFA
+
+10.4 Building the DFA
+=====================
+
+The most flavouring point is the building of the minimal DFA
+recognizing a given set of patterns.  To perform the insertion of a new
+pattern into an already existing DFA one must completly rebuild the
+DFA: the principle is to build the minimal CDFA recognizing the new
+pattern to replace the original CDFA with its "synchronised product" by
+the new one.
+
+   We first give a formal definition: Let L be the left CDFA and R be
+the right one.  Let B be the "synchronised product" of L by R.  Its
+states are the couples (l,r) where l is a state of L and r is a state
+of R.  The state (0,0) is the error state of B and the state (1,1) is
+its initial state.  To each couple (l,r) we associate the union of
+patterns recognized in both l and r.  The transitions set of B is the
+set of transitions (l1,r1)--a-->(l2,r2) for each symbol 'a' such that
+both l1--a-->l2 in L and r1--a-->r2 in R.
+
+   The maximal number of states of B is the product of the number of
+states of L and R but almost all this states are non reachable from the
+initial state (1,1).
+
+   The algorithm used in function '`sync_product()'' builds the minimal
+product DFA only by keeping the reachable states.  It recursively scans
+the product CDFA by following simultaneously the transitions of L and
+R. A hast table (`gtest') is used to check if a state (l,r) has already
+been reached, the reachable states are remapped on a new DFA. The CDFA
+thus obtained is minimal and recognizes the union of the two patterns
+sets.
+
+   It is possible to construct a special pattern database that
+generates an "explosive" automaton: the size of the DFA is in the worst
+case exponential in the number of patterns it recognizes.  But it
+doesn't occur in pratical situations: the DFA size tends to be
+"stable".  By "stable" we mean that if we add a pattern which greatly
+increases the size of the DFA it also increases the chance that the
+next added pattern does not increase its size at all.  Nevertheless
+there are many ways to reduce the size of the DFA. Good compression
+methods are explained in `Aho, Ravi Sethi, Ullman "COMPILERS:
+Principles, Techniques and Tools" chapter Optimization of DFA-based
+pattern matchers'.
+
+\1f
+File: gnugo.info,  Node: Incremental Algorithm,  Next: DFA Optimizations,  Prev: Building the DFA,  Up: DFA
+
+10.5 Incremental Algorithm
+==========================
+
+The incremental version of the DFA pattern matcher is not yet
+implemented in GNU Go but we explain here how it will work.  By
+definition of a deterministic automaton, scanning the same string will
+reach the same states every time.
+
+   Each reached state during pattern matching is stored in a stack
+`top_stack[i][j]' and `state_stack[i][j][stack_idx]' We use one stack
+by intersection `(i,j)'.  A precomputed reverse path list allows to
+know for each couple of board intersections `(x,y)' its position
+`reverse(x,y)' in the spiral scan path starting from `(0,0)'.
+
+   When a new stone is put on the board at `(lx,ly)', the only work of
+the pattern matcher is:
+
+     `
+      for(each stone on the board at (i,j))
+         if(reverse(lx-i,ly-j) < top_stack[i][j])
+           {
+              begin the dfa scan from the state
+              state_stack[i][j][reverse(lx-i,ly-j)];
+           }
+     '
+
+   In most situations reverse(lx-i,ly-j) will be inferior to
+top_stack[i][j]. This should speedup a lot pattern matching.
+
+\1f
+File: gnugo.info,  Node: DFA Optimizations,  Prev: Incremental Algorithm,  Up: DFA
+
+10.6 Some DFA Optimizations
+===========================
+
+The DFA is constructed to minimize jumps in memory making some
+assumptions about the frequencies of the values: the EMPTY value is
+supposed to appear often on the board, so the the '.'  transition are
+almost always successors in memory.  The OUT_BOARD are supposed to be
+rare, so '#' transitions will almost always imply a big jump.
+
+\1f
+File: gnugo.info,  Node: Tactical Reading,  Next: Pattern Based Reading,  Prev: Patterns,  Up: Top
+
+11 Tactical reading
+*******************
+
+The process of visualizing potential moves done by you and your
+opponent to learn the result of different moves is called "reading".
+GNU Go does three distinct types of reading: "tactical reading" which
+typically is concerned with the life and death of individual strings,
+"Owl reading" which is concerned with the life and death of dragons,
+and "connection reading".  In this Chapter, we document the tactical
+reading code, which is in `engine/reading.c'.
+
+* Menu:
+
+* Reading Basics::               Reading Basics
+* Hashing::                      Hashing of positions
+* Persistent Cache::             Persistent Reading Cache
+* Ko::                           Ko handling
+* A Ko Example::                 A Ko Example
+* Another Ko Example::           Another Ko Example
+* Alternate Komaster Schemes::   Alternate Komaster Schemes
+* Superstrings::                 Superstrings
+* Debugging::                    Debugging the reading code
+* Connection Reading::           Connection Reading
+
+\1f
+File: gnugo.info,  Node: Reading Basics,  Next: Hashing,  Up: Tactical Reading
+
+11.1 Reading Basics
+===================
+
+What we call _Tactical Reading_ is the analysis whether there is a
+direct capture of a single string, or whether there is a move to prevent
+such a direct capture.
+
+   If the reading module finds out that the string can get captured,
+this answer should (usually) be trusted. However, if it says it can be
+defended, this does not say as much. It is often the case that such a
+string has no chance to make a life, but that it cannot be captured
+within the horizon (and the cutoff heuristics) of the tactical reading.
+
+   The tactical reading is done by the functions in `engine/reading.c'.
+It is a minimax search that declares win for the attacker once he can
+physically take the string off board, whereas the defense is considered
+successful when the string has sufficiently many liberties. A string
+with five liberties is always considered alive. At higher depth within
+the search tree even fewer liberties cause GNU Go to give up the attack,
+*Note depthparams::.
+
+   The reading code makes use of a stack onto which board positions can
+be pushed. The parameter `stackp' is zero if GNU Go is examining the
+true board position; if it is higher than zero, then GNU Go is
+examining a hypothetical position obtained by playing several moves.
+
+   The most important public reading functions are `attack' and
+`find_defense'. These are wrappers for functions `do_attack' and
+`do_find_defense' which are declared statically in `reading.c'. The
+functions `do_attack' and `do_find_defense' call each other recursively.
+
+11.1.1 Organization of the reading code
+---------------------------------------
+
+The function `do_attack' and `do_find_defense' are wrappers themselves
+and call `attack1', `attack2', `attack3' or `attack4' resp.  `defend1',
+`defend1', `defend1' or `defend1' depending on the number of liberties.
+
+   These are fine-tuned to generate and try out the moves in an
+efficient order. They generate a few moves themselves (mostly direct
+liberties of the string), and then call helper functions called
+`..._moves' which suggest less obvious moves. Which of these functions
+get called depends on the number of liberties and of the current search
+depth.
+
+11.1.2 Return Codes
+-------------------
+
+The return codes of the reading (and owl) functions and owl can be `0',
+`KO_B', `KO_A' or `WIN'. Each reading function determines whether a
+particular player (assumed to have the move) can solve a specific
+problem, typically attacking or defending a string.
+
+   A return code of `WIN' means success, 0 failure, while `KO_A' and
+`KO_B' are success conditioned on ko. A function returns `KO_A' if the
+position results in ko and that the player to move will get the first
+ko capture (so the opponent has to make the first ko threat). A return
+code of `KO_B' means that the player to move will have to make the
+first ko threat.
+
+   If GNU Go is compiled with the configure option
+`--enable-experimental-owl-ext' then the owl functions also have
+possible return codes of `GAIN' and `LOSS'. A code of `GAIN' means that
+the attack (or defense) does not succeed, but that in the process of
+trying to attack or defend, an opponent's worm is captured. A code of
+`LOSS' means that the attack or defense succeeds, but that another
+friendly worm dies during the attack or defense.
+
+11.1.3 Reading cutoff and depth parameters
+------------------------------------------
+
+Depth of reading is controlled by the parameters `depth' and
+`branch_depth'. The `depth' has a default value `DEPTH' (in
+`liberty.h'), which is set to 16 in the distribution, but it may also
+be set at the command line using the `-D' or `--depth' option.  If
+`depth' is increased, GNU Go will be stronger and slower. GNU Go will
+read moves past depth, but in doing so it makes simplifying assumptions
+that can cause it to miss moves.
+
+   Specifically, when `stackp > depth', GNU Go assumes that as soon as
+the string can get 3 liberties it is alive. This assumption is
+sufficient for reading ladders.
+
+   The `branch_depth' is typically set a little below `depth'.  Between
+`branch_depth' and `depth', attacks on strings with 3 liberties are
+considered, but branching is inhibited, so fewer variations are
+considered.
+
+   %%Currently the reading code does not try to defend a string by
+%attacking a boundary string with more than two liberties. Because %of
+this restriction, it can make oversights. A symptom of this is %two
+adjacent strings, each having three or four liberties, each %classified
+as `DEAD'. To resolve such situations, a function %`small_semeai()' (in
+`engine/semeai.c') looks for such %pairs of strings and corrects their
+classification.
+
+   The `backfill_depth' is a similar variable with a default 12. Below
+this depth, GNU Go will try "backfilling" to capture stones.  For
+example in this situation:
+
+
+     .OOOOOO.    on the edge of the board, O can capture X but
+     OOXXXXXO    in order to do so he has to first play at a in
+     .aObX.XO    preparation for making the atari at b. This is
+     --------    called backfilling.
+
+   Backfilling is only tried with `stackp <= backfill_depth'. The
+parameter `backfill_depth' may be set using the `-B' option.
+
+   The `fourlib_depth' is a parameter with a default of only 7.  Below
+this depth, GNU Go will try to attack strings with four liberties. The
+`fourlib_depth' may be set using the `-F' option.
+
+   The parameter `ko_depth' is a similar cutoff. If `stackp<ko_depth',
+the reading code will make experiments involving taking a ko even if it
+is not legal to do so (i.e., it is hypothesized that a remote ko threat
+is made and answered before continuation).  This parameter may be set
+using the `-K' option.
+
+   * `int attack(int str, int *move)' 
+
+          Determines if the string at `str' can be attacked, and if so,
+          `*move' returns the attacking move, unless `*movei' is a null
+          pointer. (Use null pointers if you are interested in the
+          result of the attack but not the attacking move itself.)
+          Returns `WIN', if the attack succeeds, 0 if it fails, and
+          `KO_A' or `KO_B' if the result depends on ko *note Return
+          Codes::.
+     
+   * `find_defense(int str, int *move)'
+
+          Attempts to find a move that will save the string at `str'. It
+          returns true if such a move is found, with `*move' the
+          location of the saving move (unless `*move' is a null
+          pointer). It is not checked that tenuki defends, so this may
+          give an erroneous answer if `!attack(str)'.  Returns `KO_A'
+          or `KO_B' if the result depends on ko *Note Return Codes::.
+     
+   * `safe_move(int str, int color)' :
+
+          The function `safe_move(str, color)' checks whether a move at
+          `str' is illegal or can immediately be captured. If
+          `stackp==0' the result is cached. If the move only can be
+          captured by a ko, it's considered safe. This may or may not
+          be a good convention.
+
+\1f
+File: gnugo.info,  Node: Hashing,  Next: Persistent Cache,  Prev: Reading Basics,  Up: Tactical Reading
+
+11.2 Hashing of Positions
+=========================
+
+To speed up the reading process, we note that a position can be reached
+in several different ways.  In fact, it is a very common occurrence
+that a previously checked position is rechecked, often within the same
+search but from a different branch in the recursion tree.
+
+   This wastes a lot of computing resources, so in a number of places,
+we store away the current position, the function we are in, and which
+worm is under attack or to be defended.  When the search for this
+position is finished, we also store away the result of the search and
+which move made the attack or defense succeed.
+
+   All this data is stored in a hash table, sometimes also called a
+transposition table, where Go positions are the key and results of the
+reading for certain functions and groups are the data. You can increase
+the size of the Hash table using the `-M' or `--memory' option *note
+Invoking GNU Go::.
+
+   The hash table is created once and for all at the beginning of the
+game by the function `hashtable_new()'. Although hash memory is thus
+allocated only once in the game, the table is reinitialized at the
+beginning of each move by a call to `hashtable_clear()' from
+`genmove()'.
+
+* Menu:
+
+* Hash Calculation::            Calculation of the hash value
+* Hash Organization::           Organization of the hash table
+* Hash Structures::             Structures in `hash.h'
+
+\1f
+File: gnugo.info,  Node: Hash Calculation,  Next: Hash Organization,  Up: Hashing
+
+11.2.1 Calculation of the hash value
+------------------------------------
+
+The hash algorithm is called Zobrist hashing, and is a standard
+technique for go and chess programming. The algorithm as used by us
+works as follows:
+
+  1. First we define a "go position".  This positions consists of
+        * the actual board, i.e. the locations and colors of the stones
+
+        * A "ko point", if a ko is going on.  The ko point is defined as
+          the empty point where the last single stone was situated
+          before it was captured.
+
+     It is not necessary to specify the color to move (white or black)
+     as part of the position. The reason for this is that read results
+     are stored separately for the various reading functions such as
+     `attack3', and it is implicit in the calling function which player
+     is to move.
+
+  2. For each location on the board we generate random numbers:
+        * A number which is used if there is a white stone on this
+          location
+
+        * A number which is used if there is a black stone on this
+          location
+
+        * A number which is used if there is a ko on this location
+
+     These random numbers are generated once at initialization time and
+     then used throughout the life time of the hash table.
+
+  3. The hash key for a position is the XOR of all the random numbers
+     which are applicable for the position (white stones, black stones,
+     and ko position).
+
+\1f
+File: gnugo.info,  Node: Hash Organization,  Next: Hash Structures,  Prev: Hash Calculation,  Up: Hashing
+
+11.2.2 Organization of the hash table
+-------------------------------------
+
+The hash table consists of 3 parts:
+
+   * An area which contains so called "Hash Nodes". Each hash node
+     contains:
+        - A go position as defined above.
+
+        - A computed hash value for the position
+
+        - A pointer to Read Results (see below)
+
+        - A pointer to another hash node.
+
+   * An area with so called Read Results.  These are used to store
+     which function was called in the go position, which string was
+     under attack or to be defended, and the result of the reading.
+
+     Each Read Result contains:
+        - the function ID (an int between 0 and 255), the position of
+          the string under attack and a depth value, which is used to
+          determine how deep the search was when it was made, packed
+          into one 32 bit integer.
+
+        - The result of the search (a numeric value) and a position to
+          play to get the result packed into one 32 bit integer.
+
+        - A pointer to another Read Result.
+
+   * An array of pointers to hash nodes.  This is the hash table proper.
+
+
+   When the hash table is created, these 3 areas are allocated using
+`malloc()'.  When the hash table is populated, all contents are taken
+from the Hash nodes and the Read results. No further allocation is done
+and when all nodes or results are used, the hash table is full.
+Nothing is deleted from the hash table except when it is totally
+emptied, at which point it can be used again as if newly initialized.
+
+   When a function wants to use the hash table, it looks up the current
+position using `hashtable_search()'. If the position doesn't already
+exist there, it can be entered using
+
+   `hashtable_enter_position()'.
+
+   Once the function has a pointer to the hash node containing a
+function, it can search for a result of a previous search using
+`hashnode_search()'.  If a result is found, it can be used, and if not,
+a new result can be entered after a search using `hashnode_new_result()'.
+
+   Hash nodes which hash to the same position in the hash table
+(collisions) form a simple linked list.  Read results for the same
+position, created by different functions and different attacked or
+defended strings also form a linked list.
+
+   This is deemed sufficiently efficient for now, but the representation
+of collisions could be changed in the future.  It is also not
+determined what the optimum sizes for the hash table, the number of
+positions and the number of results are.
+
+\1f
+File: gnugo.info,  Node: Hash Structures,  Prev: Hash Organization,  Up: Hashing
+
+11.2.3 Hash Structures
+----------------------
+
+The basic hash structures are declared in `engine/hash.h' and
+`engine/cache.c'
+
+     typedef struct hashposition_t {
+       Compacttype  board[COMPACT_BOARD_SIZE];
+       int          ko_pos;
+     } Hashposition;
+
+   Represents the board and optionally the location of a ko, which is
+an illegal move. The player whose move is next is not recorded.
+
+     typedef struct {
+       Hashvalue     hashval;
+       Hashposition  hashpos;
+     } Hash_data;
+
+   Represents the return value of a function (`hashval') and the board
+state (`hashpos').
+
+     typedef struct read_result_t {
+       unsigned int data1;
+       unsigned int data2;
+
+       struct read_result_t *next;
+     } Read_result;
+
+   The data1 field packs into 32 bits the following fields:
+
+
+     komaster:  2 bits (EMPTY, BLACK, WHITE, or GRAY)
+     kom_pos : 10 bits (allows MAX_BOARD up to 31)
+     routine :  4 bits (currently 10 different choices)
+     str1    : 10 bits
+     stackp  :  5 bits
+
+   The data2 field packs into 32 bits the following fields:
+
+
+     status :   2 bits (0 free, 1 open, 2 closed)
+     result1:   4 bits
+     result2:   4 bits
+     move   :  10 bits
+     str2   :  10 bits
+
+   The `komaster' and `(kom_pos)' field are documented in *Note Ko::.
+
+   When a new result node is created, 'status' is set to 1 'open'.
+This is then set to 2 'closed' when the result is entered. The main use
+for this is to identify open result nodes when the hashtable is
+partially cleared. Another potential use for this field is to identify
+repeated positions in the reading, in particular local double or triple
+kos.
+
+     typedef struct hashnode_t {
+       Hash_data            key;
+       Read_result        * results;
+       struct hashnode_t  * next;
+     } Hashnode;
+
+   The hash table consists of hash nodes.  Each hash node consists of
+The hash value for the position it holds, the position itself and the
+actual information which is purpose of the table from the start.
+
+   There is also a pointer to another hash node which is used when the
+nodes are sorted into hash buckets (see below).
+
+     typedef struct hashtable {
+       size_t         hashtablesize;   /* Number of hash buckets */
+       Hashnode    ** hashtable;       /* Pointer to array of hashnode lists */
+
+       int            num_nodes;       /* Total number of hash nodes */
+       Hashnode     * all_nodes;       /* Pointer to all allocated hash nodes. */
+       int            free_node;       /* Index to next free node. */
+
+       int            num_results;     /* Total number of results */
+       Read_result  * all_results;     /* Pointer to all allocated results. */
+       int            free_result;     /* Index to next free result. */
+     } Hashtable;
+
+   The hash table consists of three parts:
+
+   * The hash table proper: a number of hash buckets with collisions
+     being handled by a linked list.
+
+   * The hash nodes.  These are allocated at creation time and are
+     never removed or reallocated in the current implementation.
+
+   * The results of the searches.  Since many different searches can be
+     done in the same position, there should be more of these than hash
+     nodes.
+
+\1f
+File: gnugo.info,  Node: Persistent Cache,  Next: Ko,  Prev: Hashing,  Up: Tactical Reading
+
+11.3 Persistent Reading Cache
+=============================
+
+Some calculations can be safely saved from move to move. If the
+opponent's move is not close to our worm or dragon, we do not have to
+reconsider the life or death of that group on the next move. So the
+result is saved in a persistent cache. Persistent caches are used for
+are used in the engine for several types of read results.
+
+   * Tactical reading
+
+   * Owl reading
+
+   * Connection reading
+
+   * Breakin code
+
+   In this section we will discuss the persistent caching of tactical
+reading but the same principles apply to the other persistent caches.
+
+   Persistent caching is an important performance feature. However it
+can lead to mistakes and debugging problems--situations where GNU Go
+generates the right move during debugging but plays a wrong move during
+a game. If you suspect a persistent cache effect you may try loading
+the sgf file with the `--replay' option and see if the mistake is
+repeated (*note Invoking GNU Go::).
+
+   The function `store_persistent_cache()' is called only by `attack'
+and `find_defense', never from their static recursive counterparts
+`do_attack' and `do_defend'.  The function
+`store_persistent_reading_cache()' attempts to cache the most expensive
+reading results. The function `search_persistent_reading_cache'
+attempts to retrieve a result from the cache.
+
+   If all cache entries are occupied, we try to replace the least useful
+one. This is indicated by the score field, which is initially the
+number of nodes expended by this particular reading, and later
+multiplied by the number of times it has been retrieved from the cache.
+
+   Once a (permanent) move is made, a number of cache entries
+immediately become invalid.  These are cleaned away by the function
+`purge_persistent_reading_cache().' To have a criterion for when a
+result may be purged, the function `store_persistent_cache()' computes
+the "reading shadow" and "active area". If a permanent move is
+subsequently played in the active area, the cached result is
+invalidated. We now explain this algorithm in detail.
+
+   The "reading shadow" is the concatenation of all moves in all
+variations, as well as locations where an illegal move has been tried.
+
+   Once the read is finished, the reading shadow is expanded to the
+"active area" which may be cached. The intention is that as long as no
+stones are played in the active area, the cached value may safely be
+used.
+
+   Here is the algorithm used to compute the active area.  This
+algorithm is in the function `store_persistent_reading_cache()'.  The
+most expensive readings so far are stored in the persistent cache.
+
+   * The reading shadow and the string under attack are marked with the
+     character `1'. We also include the successful move, which is most
+     often a part of the reading shadow, but sometimes not, for example
+     with the function `attack1()'.
+
+   * Next the reading shadow is expanded by marking strings and empty
+     vertices adjacent to the area marked `1' with the character `2'.
+
+   * Next vertices adjacent to empty vertices marked `2' are labelled
+     with the character `3'.
+
+   * Next all vertices adjacent to previously marked vertices. These are
+     marked `-1' instead of the more logical `4' because it is slightly
+     faster to code this way.
+
+   * If the stack pointer is >0 we add the moves already played from the
+     moves stack with mark 4.
+
+\1f
+File: gnugo.info,  Node: Ko,  Next: A Ko Example,  Prev: Persistent Cache,  Up: Tactical Reading
+
+11.4 Ko Handling
+================
+
+The principles of ko handling are the same for tactical reading and owl
+reading.
+
+   We have already mentioned (*note Reading Basics::) that GNU Go uses
+a return code of `KO_A' or `KO_B' if the result depends on ko. The
+return code of `KO_B' means that the position can be won provided the
+player whose move calls the function can come up with a sufficiently
+large ko threat. In order to verify this, the function must simulate
+making a ko threat and having it answered by taking the ko even if it
+is illegal. We call such an experimental taking of the ko a
+"conditional" ko capture.
+
+   Conditional ko captures are accomplished by the function `tryko()'.
+This function is like `trymove()' except that it does not require
+legality of the move in question.
+
+   The static reading functions, and the global functions `do_attack'
+and `do_find_defense' consult parameters `komaster', `kom_pos', which
+are declared static in `board.c'. These mediate ko captures to prevent
+the occurrence of infinite loops. During reading, the komaster values
+are pushed and popped from a stack.
+
+   Normally `komaster' is `EMPTY' but it can also be `BLACK', `WHITE',
+`GRAY_BLACK', `GRAY_WHITE' or `WEAK_KO'. The komaster is set to `color'
+when `color' makes a conditional ko capture. In this case `kom_pos' is
+set to the location of the captured ko stone.
+
+   If the opponent is komaster, the reading functions will not try to
+take the ko at `kom_pos'. Also, the komaster is normally not allowed to
+take another ko. The exception is a nested ko, characterized by the
+condition that the captured ko stone is at distance 1 both vertically
+and horizontally from `kom_pos', which is the location of the last
+stone taken by the komaster. Thus in this situation:
+
+
+              .OX
+              OX*X
+             OmOX
+              OO
+
+   Here if `m' is the location of `kom_pos', then the move at `*' is
+allowed.
+
+   The rationale behind this rule is that in the case where there are
+two kos on the board, the komaster cannot win both, and by becoming
+komaster he has already chosen which ko he wants to win. But in the
+case of a nested ko, taking one ko is a precondition to taking the
+other one, so we allow this.
+
+   If the komaster's opponent takes a ko, then both players have taken
+one ko. In this case `komaster' is set to `GRAY_BLACK' or `GRAY_WHITE'
+and after this further ko captures are even further restricted.
+
+   If the ko at `kom_pos' is filled, then the komaster reverts to
+`EMPTY'.
+
+   In detail, the komaster scheme is as follows. Color `O' is to move.
+This scheme is known as scheme 5 since in versions of GNU Go through
+3.4, several different schemes were included.
+
+   * 1. Komaster is EMPTY.
+        - 1a. Unconditional ko capture is allowed.
+
+               Komaster remains EMPTY if previous move was not a ko
+               capture.  Komaster is set to WEAK_KO if previous move
+               was a ko capture and kom_pos is set to the old value of
+               board_ko_pos.
+
+        - 1b) Conditional ko capture is allowed.
+
+               Komaster is set to O and kom_pos to the location of the
+               ko, where a stone was just removed.
+
+   * 2. Komaster is O:
+        - 2a) Only nested ko captures are allowed. Kom_pos is moved to
+          the new removed stone.
+
+        - 2b) If komaster fills the ko at kom_pos then komaster reverts
+          to EMPTY.
+
+   * 3. Komaster is X:
+
+          Play at kom_pos is not allowed. Any other ko capture is
+          allowed. If O takes another ko, komaster becomes GRAY_X.
+
+   * 4. Komaster is GRAY_O or GRAY_X:
+
+          Ko captures are not allowed. If the ko at kom_pos is filled
+          then the komaster reverts to EMPTY.
+
+   * 5. Komaster is WEAK_KO:
+        - 5a) After a non-ko move komaster reverts to EMPTY.
+
+        - 5b) Unconditional ko capture is only allowed if it is nested
+          ko capture.
+
+               Komaster is changed to WEAK_X and kom_pos to the old
+               value of board_ko_pos.
+
+        - 5c) Conditional ko capture is allowed according to the rules
+          of 1b.
+
+\1f
+File: gnugo.info,  Node: A Ko Example,  Next: Another Ko Example,  Prev: Ko,  Up: Tactical Reading
+
+11.5 A Ko Example
+=================
+
+To see the komaster scheme in action, consider this position from the
+file `regressions/games/life_and_death/tripod9.sgf'.  We recommend
+studying this example by examining the variation file produced by the
+command:
+
+       gnugo -l tripod9.sgf --decide-dragon C3 -o vars.sgf
+
+   In the lower left hand corner, there are kos at A2 and B4.  Black is
+unconditionally dead because if W wins either ko there is nothing B can
+do.
+
+
+      8 . . . . . . . .
+      7 . . O . . . . .
+      6 . . O . . . . .
+      5 O O O . . . . .
+      4 O . O O . . . .
+      3 X O X O O O O .
+      2 . X X X O . . .
+      1 X O . . . . . .
+        A B C D E F G H
+
+   This is how the komaster scheme sees this. B (i.e. X) starts by
+taking the ko at B4. W replies by taking the ko at A1. The board looks
+like this:
+
+
+      8 . . . . . . . .
+      7 . . O . . . . .
+      6 . . O . . . . .
+      5 O O O . . . . .
+      4 O X O O . . . .
+      3 X . X O O O O .
+      2 O X X X O . . .
+      1 . O . . . . . .
+        A B C D E F G H
+
+   Now any move except the ko recapture (currently illegal) at A1 loses
+for B, so B retakes the ko and becomes komaster.  The board looks like
+this:
+
+
+      8 . . . . . . . .         komaster: BLACK
+      7 . . O . . . . .         kom_pos: A2
+      6 . . O . . . . .
+      5 O O O . . . . .
+      4 O X O O . . . .
+      3 X . X O O O O .
+      2 . X X X O . . .
+      1 X O . . . . . .
+        A B C D E F G H
+
+   W takes the ko at B3 after which the komaster is `GRAY' and ko
+recaptures are not allowed.
+
+
+      8 . . . . . . . .         komaster: GRAY
+      7 . . O . . . . .         kom_pos: B4
+      6 . . O . . . . .
+      5 O O O . . . . .
+      4 O . O O . . . .
+      3 X O X O O O O .
+      2 . X X X O . . .
+      1 X O . . . . . .
+        A B C D E F G H
+
+   Since B is not allowed any ko recaptures, there is nothing he can do
+and he is found dead. Thus the komaster scheme produces the correct
+result.
+
+\1f
+File: gnugo.info,  Node: Another Ko Example,  Next: Alternate Komaster Schemes,  Prev: A Ko Example,  Up: Tactical Reading
+
+11.6 Another Ko Example
+=======================
+
+We now consider an example to show why the komaster is reset to `EMPTY'
+if the ko is resolved in the komaster's favor. This means that the ko
+is filled, or else that is becomes no longer a ko and it is illegal for
+the komaster's opponent to play there.
+
+   The position resulting under consideration is in the file
+`regressions/games/ko5.sgf'.  This is the position:
+
+      . . . . . . O O 8
+      X X X . . . O . 7
+      X . X X . . O . 6
+      . X . X X X O O 5
+      X X . X . X O X 4
+      . O X O O O X . 3
+      O O X O . O X X 2
+      . O . X O X X . 1
+      F G H J K L M N
+
+   We recommend studying this example by examining the variation file
+produced by the command:
+
+     gnugo -l ko5.sgf --quiet --decide-string L1 -o vars.sgf
+
+   The correct resolution is that H1 attacks L1 unconditionally while K2
+defends it with ko (code `KO_A').
+
+   After Black (X) takes the ko at K3, white can do nothing but retake
+the ko conditionally, becoming komaster. B cannot do much, but in one
+variation he plays at K4 and W takes at H1. The following position
+results:
+
+      . . . . . . O O 8
+      X X X . . . O . 7
+      X . X X . . O . 6
+      . X . X X X O O 5
+      X X . X X X O X 4
+      . O X O O O X . 3
+      O O X O . O X X 2
+      . O O . O X X . 1
+      F G H J K L M N
+
+   Now it is important the `O' is no longer komaster. Were `O' still
+komaster, he could capture the ko at N3 and there would be no way to
+finish off B.
+
+\1f
+File: gnugo.info,  Node: Alternate Komaster Schemes,  Next: Superstrings,  Prev: Another Ko Example,  Up: Tactical Reading
+
+11.7 Alternate Komaster Schemes
+===============================
+
+The following alternate schemes have been proposed. It is assumed that
+`O' is the player about to move.
+
+11.7.1 Essentially the 2.7.232 scheme.
+--------------------------------------
+
+   * Komaster is EMPTY.
+        - Unconditional ko capture is allowed. Komaster remains EMPTY.
+
+        - Conditional ko capture is allowed. Komaster is set to O and
+          `kom_pos' to the location of the ko, where a stone was just
+          removed.
+
+   * Komaster is O:
+        - Conditional ko capture is not allowed.
+
+        - Unconditional ko capture is allowed. Komaster parameters
+          unchanged.
+
+   * Komaster is X:
+        - Conditional ko capture is not allowed.
+
+        - Unconditional ko capture is allowed except for a move at
+          `kom_pos'. Komaster parameters unchanged.
+
+11.7.2 Revised 2.7.232 version
+------------------------------
+
+   * Komaster is EMPTY.
+        - Unconditional ko capture is allowed. Komaster remains EMPTY.
+
+        - Conditional ko capture is allowed. Komaster is set to `O' and
+          `kom_pos' to the location of the ko, where a stone was just
+          removed.
+
+   * Komaster is `O':
+        - Ko capture (both kinds) is allowed only if after playing the
+          move, `is_ko(kom_pos, X)' returns false. In that case,
+          `kom_pos' is updated to the new ko position, i.e. the stone
+          captured by this move.
+
+   * Komaster is `X':
+        - Conditional ko capture is not allowed.
+
+        - Unconditional ko capture is allowed except for a move at
+          `kom_pos'. Komaster parameters unchanged.
+
+\1f
+File: gnugo.info,  Node: Superstrings,  Next: Debugging,  Prev: Alternate Komaster Schemes,  Up: Tactical Reading
+
+11.8 Superstrings
+=================
+
+A _superstring_ is an extended string, where the extensions are through
+the following kinds of connections:
+
+  1. Solid connections (just like ordinary string).
+            OO
+
+  2. Diagonal connection or one space jump through an intersection
+     where an opponent move would be suicide or self-atari.
+            ...
+            O.O
+            XOX
+            X.X
+
+  3. Bamboo joint.
+            OO
+            ..
+            OO
+
+  4. Diagonal connection where both adjacent intersections are empty.
+            .O
+            O.
+
+  5. Connection through adjacent or diagonal tactically captured stones.
+     Connections of this type are omitted when the superstring code is
+     called from `reading.c', but included when the superstring code is
+     called from `owl.c'.
+
+   Like a dragon, a superstring is an amalgamation of strings, but it is
+a much tighter organization of stones than a dragon, and its purpose is
+different. Superstrings are encountered already in the tactical reading
+because sometimes attacking or defending an element of the superstring
+is the best way to attack or defend a string. This is in contrast with
+dragons, which are ignored during tactical reading.
+
+\1f
+File: gnugo.info,  Node: Debugging,  Next: Connection Reading,  Prev: Superstrings,  Up: Tactical Reading
+
+11.9 Debugging the reading code
+===============================
+
+The reading code searches for a path through the move tree to determine
+whether a string can be captured. We have a tool for investigating this
+with the `--decidestring' option. This may be run with or without an
+output file.
+
+   Simply running
+
+
+     `gnugo -t -l [input file name] -L [movenumber] --decidestring [location]'
+
+will run `attack()' to determine whether the string can be captured.
+If it can, it will also run `find_defense()' to determine whether or
+not it can be defended. It will give a count of the number of
+variations read. The `-t' is necessary, or else GNU Go will not report
+its findings.
+
+   If we add `-o OUTPUT FILE' GNU Go will produce an output file with
+all variations considered. The variations are numbered in comments.
+
+   This file of variations is not very useful without a way of
+navigating the source code. This is provided with the GDB source file,
+listed at the end. You can source this from GDB, or just make it your
+GDB init file.
+
+   If you are using GDB to debug GNU Go you may find it less confusing
+to compile without optimization. The optimization sometimes changes the
+order in which program steps are executed. For example, to compile
+`reading.c' without optimization, edit `engine/Makefile' to remove the
+string `-O2' from the file, touch `engine/reading.c' and make. Note
+that the Makefile is automatically generated and may get overwritten
+later.
+
+   If in the course of reading you need to analyze a result where a
+function gets its value by returning a cached position from the hashing
+code, rerun the example with the hashing turned off by the command line
+option `--hash 0'. You should get the same result. (If you do not,
+please send us a bug report.) Don't run `--hash 0' unless you have a
+good reason to, since it increases the number of variations.
+
+   With the source file given at the end of this document loaded, we
+can now navigate the variations. It is a good idea to use cgoban with a
+small `-fontHeight', so that the variation window takes in a big
+picture. (You can resize the board.)
+
+   Suppose after perusing this file, we find that variation 17 is
+interesting and we would like to find out exactly what is going on here.
+
+   The macro 'jt n' will jump to the n-th variation.
+
+
+     (gdb) set args -l [filename] -L [move number] --decidestring [location]
+     (gdb) tbreak main
+     (gdb) run
+     (gdb) jt 17
+
+will then jump to the location in question.
+
+   Actually the attack variations and defense variations are numbered
+separately. (But `find_defense()' is only run if `attack()' succeeds,
+so the defense variations may or may not exist.) It is redundant to
+have to tbreak main each time. So there are two macros avar and dvar.
+
+
+     (gdb) avar 17
+
+restarts the program, and jumps to the 17-th attack variation.
+
+
+     (gdb) dvar 17
+
+jumps to the 17-th defense variation. Both variation sets are found in
+the same sgf file, though they are numbered separately.
+
+   Other commands defined in this file:
+
+
+
+     `dump' will print the move stack.
+     `nv' moves to the next variation
+     `ascii i j' converts (i,j) to ascii
+
+     #######################################################
+     ###############      .gdbinit file      ###############
+     #######################################################
+
+     # this command displays the stack
+
+     define dump
+     set dump_stack()
+     end
+
+     # display the name of the move in ascii
+
+     define ascii
+     set gprintf("%o%m\n",$arg0,$arg1)
+     end
+
+     # display the all information about a dragon
+
+     define dragon
+     set ascii_report_dragon("$arg0")
+     end
+
+     define worm
+     set ascii_report_worm("$arg0")
+     end
+
+     # move to the next variation
+
+     define nv
+     tbreak trymove
+     continue
+     finish
+     next
+     end
+
+     # move forward to a particular variation
+
+     define jt
+     while (count_variations < $arg0)
+     nv
+     end
+     nv
+     dump
+     end
+
+     # restart, jump to a particular attack variation
+
+     define avar
+     delete
+     tbreak sgffile_decidestring
+     run
+     tbreak attack
+     continue
+     jt $arg0
+     end
+
+     # restart, jump to a particular defense variation
+
+     define dvar
+     delete
+     tbreak sgffile_decidestring
+     run
+     tbreak attack
+     continue
+     finish
+     next 3
+     jt $arg0
+     end
+
+\1f
+File: gnugo.info,  Node: Connection Reading,  Prev: Debugging,  Up: Tactical Reading
+
+11.10 Connection Reading
+========================
+
+GNU Go does reading to determine if strings can be connected.  The
+algorithms for this are in `readconnect.c'. As with the reading code,
+the connection code is not pattern based.
+
+   The connection code is invoked by the engine through the functions:
+
+   * `int string_connect(int str1, int str2, int *move)' 
+
+          Returns `WIN' if `str1' and `str2' can be connected.
+
+   * `int disconnect(int str1, int str2, int *move)' 
+
+          Returns `WIN' if `str1' and `str2' can be disconnected.
+
+   To see the connection code in action, you may try the following
+example.
+
+     gnugo --quiet -l connection3.sgf --decide-connection M3/N7 -o vars.sgf
+
+   (The file `connection3.sgf' is in `regression/games'.)  Examine the
+sgf file produced by this to see what kind of reading is done by the
+functions `string_connect()' and `string_disconnect()', which are
+called by the function `decide_connection'.
+
+   One use of the connection code is used is through the autohelper
+macros `oplay_connect', `xplay_connect', `oplay_disconnect' and
+`xplay_disconnect' which are used in the connection databases.
+
+\1f
+File: gnugo.info,  Node: Pattern Based Reading,  Next: Influence,  Prev: Tactical Reading,  Up: Top
+
+12 Pattern Based Reading
+************************
+
+In the tactical reading code in `reading.c', the code generating the
+moves which are tried are all hand coded in C, for efficiency. There is
+much to be said for another type of reading, in which the moves to be
+tried are generated from a pattern database.
+
+   GNU Go does three main types of pattern based reading. First, there
+is the OWL code (Optics with Limit Negotiation) which attempts to read
+out to a point where the code in `engine/optics.c' (*note Eyes::) can
+be used to evaluate it.  Like the tactical reading code, a persistent
+cache is employed to maintain some of the owl data from move to move.
+This is an essential speedup without which GNU Go would play too slowly.
+
+   Secondly, there is the `engine/combination.c' which attempts to find
+combinations--situations where a series of threats eventually
+culminates in one that cannot be parried.
+
+   Finally there is the semeai module. A *semeai* is a capturing race
+between two adjacent DEAD or CRITICAL dragons of opposite colors. The
+principal function, `owl_analyze_semeai()' is contained in `owl.c'.
+Due to the complex nature of semeais, the results of this function are
+more frequently wrong than the usual owl code.
+
+* Menu:
+
+* The Owl Code::                Life and death reading
+* Combinations::                Combinations
+
diff --git a/doc/gnugo.info-2 b/doc/gnugo.info-2
new file mode 100644 (file)
index 0000000..6435f26
--- /dev/null
@@ -0,0 +1,6826 @@
+This is gnugo.info, produced by makeinfo version 4.11 from gnugo.texi.
+
+INFO-DIR-SECTION GNU games
+START-INFO-DIR-ENTRY
+* GNU Go: (gnugo).          The GNU Go program
+END-INFO-DIR-ENTRY
+
+\1f
+File: gnugo.info,  Node: The Owl Code,  Next: Combinations,  Up: Pattern Based Reading
+
+12.1 The Owl Code
+=================
+
+The life and death code in `optics.c', described elsewhere (*note
+Eyes::), works reasonably well as long as the position is in a
+"terminal position", which we define to be one where there are no moves
+left which can expand the eye space, or limit it. In situations where
+the dragon is surrounded, yet has room to thrash around a bit making
+eyes, a simple application of the graph-based analysis will not work.
+Instead, a bit of reading is needed to reach a terminal position.
+
+   The defender tries to expand his eyespace, the attacker to limit it,
+and when neither finds an effective move, the position is evaluated. We
+call this type of life and death reading "Optics With
+Limit-negotiation" (OWL). The module which implements it is in
+`engine/owl.c'.
+
+   There are two reasonably small databases
+`patterns/owl_defendpats.db' and `patterns/owl_attackpats.db' of
+expanding and limiting moves. The code in `owl.c' generates a small
+move tree, allowing the attacker only moves from `owl_attackpats.db',
+and the defender only moves from `owl_defendpats.db'. In addition to
+the moves suggested by patterns, vital moves from the eye space
+analysis are also tested.
+
+   A third database, `owl_vital_apats.db' includes patterns which
+override the eyespace analysis done by the optics code. Since the
+eyeshape graphs ignore the complications of shortage of liberties and
+cutting points in the surrounding chains, the static analysis of
+eyespace is sometimes wrong. The problem is when the optics code says
+that a dragon definitely has 2 eyes, but it isn't true due to shortage
+of liberties, so the ordinary owl patterns never get into play.  In
+such situations `owl_vital_apats.db' is the only available measure to
+correct mistakes by the optics. Currently the patterns in
+`owl_vital_apats.db' are only matched when the level is 9 or greater.
+
+   The owl code is tuned by editing these three pattern databases,
+principally the first two.
+
+   A node of the move tree is considered `terminal' if no further moves
+are found from `owl_attackpats.db' or `owl_defendpats.db', or if the
+function `compute_eyes_pessimistic()' reports that the group is
+definitely alive. At this point, the status of the group is evaluated.
+The functions `owl_attack()' and `owl_defend()', with usage similar to
+`attack()' and `find_defense()', make use of the owl pattern databases
+to generate the move tree and decide the status of the group.
+
+   The function `compute_eyes_pessimistic()' used by the owl code is
+very conservative and only feels certain about eyes if the eyespace is
+completely closed (i.e. no marginal vertices).
+
+   The maximum number of moves tried at each node is limited by the
+parameter `MAX_MOVES' defined at the beginning of `engine/owl.c'. The
+most most valuable moves are tried first, with the following
+restrictions:
+
+   * If `stackp > owl_branch_depth' then only one move is tried per
+     variation.
+
+   * If `stackp > owl_reading_depth' then the reading terminates, and
+     the situation is declared a win for the defender (since deep
+     reading may be a sign of escape).
+
+   * If the node count exceeds `owl_node_limit', the reading also
+     terminates with a win for the defender.
+
+   * Any pattern with value 99 is considered a forced move: no other
+     move is tried, and if two such moves are found, the function
+     returns false. This is only relevant for the attacker.
+
+   * Any pattern in `patterns/owl_attackpats.db' and
+     `patterns/owl_defendpats.db' with value 100 is considered a win: if
+     such a pattern is found by `owl_attack' or `owl_defend', the
+     function returns true. This feature must be used most carefully.
+
+   The functions `owl_attack()' and `owl_defend()' may, like `attack()'
+and `find_defense()', return an attacking or defending move through
+their pointer arguments. If the position is already won, `owl_attack()'
+may or may not return an attacking move. If it finds no move of
+interest, it will return `PASS', that is, `0'. The same goes for
+`owl_defend()'.
+
+   When `owl_attack()' or `owl_defend()' is called, the dragon under
+attack is marked in the array `goal'.  The stones of the dragon
+originally on the board are marked with goal=1; those added by
+`owl_defend()' are marked with goal=2. If all the original strings of
+the original dragon are captured, `owl_attack()' considers the dragon
+to be defeated, even if some stones added later can make a live group.
+
+   Only dragons with small escape route are studied when the functions
+are called from `make_dragons()'.
+
+   The owl code can be conveniently tested using the `--decide-owl
+LOCATION' option. This should be used with `-t' to produce a useful
+trace, `-o' to produce an SGF file of variations produced when the life
+and death of the dragon at LOCATION is checked, or both.
+`--decide-position' performs the same analysis for all dragons with
+small escape route.
+
+\1f
+File: gnugo.info,  Node: Combinations,  Prev: The Owl Code,  Up: Pattern Based Reading
+
+12.2 Combination reading
+========================
+
+It may happen that no single one of a set of worms can be killed, yet
+there is a move that guarantees that at least one can be captured.  The
+simplest example is a double atari.  The purpose of the code in
+`combination.c' is to find such moves.
+
+   For example, consider the following situation:
+
+
+     +---------
+     |....OOOOX
+     |....OOXXX
+     |..O.OXX..
+     |.OXO.OX..
+     |.OX..OO..
+     |.XXOOOXO.
+     |..*XXOX..
+     |....XOX..
+     |.XX..X...
+     |X........
+
+   Every `X' stone in this position is alive. However the move at `*'
+produces a position in which at least one of four strings will get
+captured. This is a _combination_.
+
+   The driving function is called `atari_atari' because typically a
+combination involves a sequence of ataris culminating in a capture,
+though sometimes the moves involved are not ataris. For example in the
+above example, the first move at `*' is _not_ an atari, though after
+`O' defends the four stones above, a sequence of ataris ensues
+resulting in the capture of some string.
+
+   Like the owl functions `atari_atari' does pattern-based reading. The
+database generating the attacking moves is `aa_attackpats.db'. One
+danger with this function is that the first atari tried might be
+irrelevant to the actual combination.  To detect this possibility, once
+we've found a combination, we mark that first move as forbidden, then
+try again. If no combination of the same size or larger turns up, then
+the first move was indeed essential.
+
+   * `void combinations(int color)' 
+
+          Generate move reasons for combination attacks and defenses
+          against them. This is one of the move generators called from
+          genmove().
+
+   * `int atari_atari(int color, int *attack_move, char
+     defense_moves[BOARDMAX], int save_verbose)' 
+
+          Look for a combination for `color'. For the purpose of the
+          move generation, returns the size of the smallest of the
+          worms under attack.
+
+   * `int atari_atari_confirm_safety(int color, int move, int *defense,
+     int minsize, const char saved_dragons[BOARDMAX], const char
+     saved_worms[BOARDMAX])' 
+
+          Tries to determine whether a move is a blunder.  Wrapper
+          around atari_atari_blunder_size. Check whether a combination
+          attack of size at least `minsize' appears after move at
+          `move' has been made.  The arrays `saved_dragons[]' and
+          `saved_worms[]' should be one for stones belonging to dragons
+          or worms respectively, which are supposedly saved by `move'.
+
+   * `int atari_atari_blunder_size(int color, int move, int *defense,
+     const char safe_stones[BOARDMAX])' 
+
+          This function checks whether any new combination attack
+          appears after move at (move) has been made, and returns its
+          size (in points).  `safe_stones' marks which of our stones
+          are supposedly safe after this move.
+
+\1f
+File: gnugo.info,  Node: Influence,  Next: Monte Carlo Go,  Prev: Pattern Based Reading,  Up: Top
+
+13 Influence Function
+*********************
+
+* Menu:
+
+* Influential Concepts::        Conceptual Outline of Influence
+* Territory and Moyo::         Territory, Moyo and Area
+* Influence Usage::            Where influence gets used in the engine
+* Influence and Territory::     Influence and Territory
+* Territorial Details::                Details of the Territory Valuation
+* The Influence Core::          The Core of the Influence Function
+* The Influence Algorithm::     The algorithm of `accumlate_influence()'
+* Permeability::                Permeability
+* Escape::                      Escape
+* Break Ins::                   Break Ins
+* Surrounded Dragons::          Surrounded Dragons
+* Influential Patterns::       Patterns used by the Influence module
+* Influential Display::         Colored display and debugging of influence
+* Influence Tuning::            Influence tuning with view.pike
+
+\1f
+File: gnugo.info,  Node: Influential Concepts,  Next: Territory and Moyo,  Up: Influence
+
+13.1 Conceptual Outline of Influence
+====================================
+
+We define call stones "lively" if they cannot be tactically attacked,
+or if they have a tactical defense and belong to the player whose turn
+it is. Similarly, stones that cannot be strategically attacked (in the
+sense of the life-and-death analysis), or that have a strategical
+defense and belong to the player to move, are called "alive".  If we
+want to use the influence function before deciding the strategical
+status, all lively stones count as alive.
+
+   Every alive stone on the board works as an influence source, with
+influence of its color radiating outwards in all directions. The
+strength of the influence declines exponentially with the distance from
+the source.
+
+   Influence can only flow unhindered if the board is empty, however.
+All lively stones (regardless of color) act as influence barriers, as do
+connections between enemy stones that can't be broken through. For
+example the one space jump counts as a barrier unless either of the
+stones can be captured. Notice that it doesn't matter much if the
+connection between the two stones can be broken, since in that case
+there would come influence from both directions anyway.
+
+   From the influence of both colors we compute a territorial value
+between -1.0 and +1.0 for each intersection, which can be seen as the
+likely hood of it becoming territory for either color.
+
+   In order to avoid finding bogus territory, we add extra influence
+sources at places where an invasion can be launched, e.g. at 3-3 under
+a handicap stone, in the middle of wide edge extensions and in the
+center of large open spaces anywhere. Similarly we add extra influence
+sources where intrusions can be made into what otherwise looks as solid
+territory, e.g. monkey jumps. These intrusions depend on whose turn we
+assume it to be.
+
+   All these extra influence sources, as well as connections, are
+controlled by a pattern database, which consists of the two files
+patterns/influence.db and patterns/barriers.db. The details are
+explained in *note Influential Patterns::.
+
+\1f
+File: gnugo.info,  Node: Territory and Moyo,  Next: Influence Usage,  Prev: Influential Concepts,  Up: Influence
+
+13.2 Territory, Moyo and Area
+=============================
+
+Using the influence code, empty regions of the board are partitioned in
+three ways. A vertex may be described as White or Black's "territory",
+"moyo" or "area". The functions `whose_territory()', `whose_moyo()' and
+`whose_area()' will return a color, or EMPTY if it belongs to one
+player or the other in one of these classifications.
+
+   * Territory
+
+          Those parts of the board which are expected to materialize as
+          actual points for one player or the other at the end of the
+          game are considered "territory".
+
+   * Moyo
+
+          Those parts of the board which are either already territory
+          or more generally places where a territory can easily
+          materialize if the opponent neglects to reduce are considered
+          "moyo".  "moyo".
+
+   * Area
+
+          Those parts of the board where one player or the other has a
+          stronger influence than his opponent are considered "area".
+
+   Generally territory is moyo and moyo is area. To get a feeling for
+these concepts, load an sgf file in a middle game position with the
+option `-m 0x0180' and examine the resulting diagrams (*note
+Influential Display::).
+
+\1f
+File: gnugo.info,  Node: Influence Usage,  Next: Influence and Territory,  Prev: Territory and Moyo,  Up: Influence
+
+13.3 Where influence gets used in the engine
+============================================
+
+The information obtained from the influence computation is used in a
+variety of places in the engine, and the influence module is called
+several times in the process of the move generation. The details of the
+influence computation vary according to the needs of the calling
+function.
+
+   After GNU Go has decided about the tactical stability of strings, the
+influence module gets called the first time. Here all lively stones act
+as an influence source of default strength 100. The result is stored in
+the variables `initial_influence' and `initial_opposite_influence', and
+it is used as an important information for guessing the strength of
+dragons. For example, a dragon that is part of a moyo of size 25 is
+immediately considered alive.  For dragons with a smaller moyo size, a
+life-and-death analysis will be done by the owl code (see *note Pattern
+Based Reading::). A dragon with a moyo size of only 5 will be
+considered weak, even if the owl code has decided that it cannot be
+killed.
+
+   As a tool for both the owl code and the strength estimate of dragons,
+an "escape" influence gets computed for each dragon (*note Escape::).
+
+   Once all dragons have been evaluated, the influence module is called
+again and the variables `initial_influence' and
+`initial_opposite_influence' get overwritten. Of course, the dragon
+status', which are available now, are taken into account. Stones
+belonging to a dead dragon will not serve as an influence source, and
+the strengths of other stones get adjusted according to the strength of
+their respective dragon.
+
+   The result of this run is the most important tool for move
+evaluation. All helper functions of patterns as explained in *note
+Patterns:: that refer to influence results (e. g. `olib(*)' etc.)
+actually use these results. Further, `initial_influence' serves as the
+reference for computing the territorial value of a move. That is, from
+the influence strengths stored in `initial_influence', a territory
+value is assigned to each intersection. This value is supposed to
+estimate the likelyhood that this intersection will become white or
+black territory.
+
+   Then, for each move that gets considered in the function
+`value_moves', the influence module is called again via the function
+`compute_move_influence' to assess the likely territorial balance after
+this move, and the result is compared with the state before that move.
+
+   An additional influence computation is done in order to compute the
+followup value of a move. Some explainations are in *note Territorial
+Details::.
+
+   Some of the public functions from `influence.c' which are used
+throughout the engine are listed in *note Influence Utilities::.
+
+\1f
+File: gnugo.info,  Node: Influence and Territory,  Next: Territorial Details,  Prev: Influence Usage,  Up: Influence
+
+13.4 Influence and Territory
+============================
+
+In this section we consider how the influence function is used to
+estimate territory in the function `estimate_territorial_value()'.
+
+   A move like `*' by `O' below is worth one point:
+
+     OXXX.
+     OX.XX
+     O*a.X
+     OX.XX
+     OXXX.
+
+   This is evaluated by the influence function in the following way: We
+first assign territory under the assumption that X moves first in all
+local positions in the original position;  then we reassing territory,
+again under the assumption that `X' moves first in all local positions,
+but after we let `O' make the move at `*'. These two territory
+assignments are compared and the difference gives the territorial value
+of the move.
+
+   Technically, the assumption that `X' plays first everywhere is
+implemented via an asymmetric pattern database in `barriers.db'.  What
+exactly is a safe connection that stops hostile influence from passing
+through is different for `O' and `X'; of course such a connection has
+to be tighter for stones with color `O'. Also, additional intrusion
+influence sources are added for `X' in places where `X' stones have
+natural followup moves.
+
+   In this specific example above, the asymmetry (before any move has
+been made) would turn out as follows: If `X' is in turn to move, the
+white influence would get stopped by a barrier at `*', leaving 4 points
+of territory for `X'.  However, if `O' was next to move, then a
+followup move for the white stones at the left would be assumed in the
+form of an extra ("intrusion") influence source at `*'. This would get
+stopped at `a', leaving three points of territory.
+
+   Returning to the valuation of a move by `O' at `*', we get a value
+of 1 for the move at `*'.  However, of course this move is sente once
+it is worth playing, and should therefore (in miai counting) be awarded
+an effective value of 2. Hence we need to recognize the followup value
+of a move. GNU Go 3.0 took care of this by using patterns in
+`patterns.db' that enforced an explicit followup value. Versions from
+3.2 on instead compute a seperate followup influence to each move
+considered. In the above example, an intrusion source will be added at
+`a' as a followup move to `*'. This destroys all of Black's territory
+and hence gives a followup value of 3.
+
+   The pattern based followup value are still needed at some places,
+however.
+
+   To give another example, consider this position where we want to
+estimate the value of an `O' move at `*':
+
+     OOOXXX
+     ..OX..
+     ..OX..
+     ...*..
+     ------
+
+   Before the move we assume `X' moves first in the local position (and
+that `O' has to connect), which gives territory like this (lower case
+letter identify territory for each player):
+
+     OOOXXX
+     ooOXxx
+     o.OXxx
+     o...xx
+     ------
+
+   Then we let `O' make the move at `*' and assume `X' moves first
+again next.  The territory then becomes (`X' is also assumed to have to
+connect):
+
+     OOOXXX
+     ooOXxx
+     ooOX.x
+     oo.O.x
+     ------
+
+   We see that this makes a difference in territory of 4, which is what
+influence_delta_territory() should report. Then again, we have followup
+value, and here also a reverse followup value. The reverse followup
+value, which in this case will be so high that the move is treated as
+reverse sente, is added by an explicit pattern. Other sources for
+followup or reverse followup values are threats to capture a rescue a
+string of stones.  See the code and comments in the function
+`value_move_reaons' for how followup and reverse followup values are
+used to adjust the effective move value.
+
+   To give an example of territorial value where something is captured,
+consider the `O' move at `*' here,
+
+     XXXXXXXO
+     X.OOOOXO
+     X.O..O*O
+     --------
+
+   As before we first let the influence function determine territory
+assuming X moves first, i.e. with a captured group:
+
+     XXXXXXXO
+     XxyyyyXO
+     Xxyxxy.O
+     --------
+
+   Here `y' indicates `X' territory + captured stone, i.e. these count
+for two points. After the `O' move at `*' we instead get
+
+     XXXXXXXO
+     X.OOOOXO
+     X.OooOOO
+     --------
+
+   and we see that `X' has 16 territory fewer and `O' has two territory
+more, for a total difference of 18 points.
+
+   That the influence function counts the value of captured stones was
+introduced in GNU Go 3.2. Previously this was instead done using the
+effective_size heuristic. The effective size is the number of stones
+plus the surrounding empty spaces which are closer to this string or
+dragon than to any other stones. Here the `O' string would thus have
+effective size 6 (number of stones) + 2 (interior eye) + 2*0.5 (the two
+empty vertices to the left of the string, split half each with the
+surrounding X string) + 1*0.33 (the connection point, split between
+three strings) = 9.33. As noted this value was doubled, giving 18.67
+which is reasonably close to the correct value of 18. The effective size
+heuristic is still used in certain parts of the move valuation where we
+can't easily get a more accurate value from the influence function (e.
+g. attacks depending on a ko, attack threats).
+
+   Note that this section only describes the territorial valuation of a
+move.  Apart from that, GNU Go uses various heuristics in assigning a
+strategical value (weakening and strengthening of other stones on the
+board) to a move.  Also, the influence function isn't quite as well
+tuned as the examples above may seem to claim. But it should give a
+fairly good idea of how the design is intended.
+
+   Another matter is that so far we have only considered the change in
+secure territory. GNU Go 3.2 and later versions use a revised
+heuristic, which is explained in the next section, to assign probable
+territory to each player.
+
+\1f
+File: gnugo.info,  Node: Territorial Details,  Next: The Influence Core,  Prev: Influence and Territory,  Up: Influence
+
+13.5 Details of the Territory Valuation
+=======================================
+
+This section explains how GNU Go assigns a territorial value to an
+intersection once the white and black influence have been computed.
+The intention is that an intersection that has a chance of xx% of
+becoming white territory is counted as 0.xx points of territory for
+white, and similar for black.
+
+   The algorithm in the function `new_value_territory' goes roughly as
+follows:
+
+   If `wi' is the white influence at a point, and `bi' the black
+influence, then ` value = ( (wi-bi)/ (wi+bi) )^3' (positive values
+indicates likley white territory, negative stand for black territory)
+turns out to be very simple first guess that is still far off, but
+reasonable enough to be useful.
+
+   This value is then suspect a number of corrections. Assume that this
+first guess resulted in a positive value.
+
+   If both `bi' and `wi' are small, it gets reduced. What exactly is
+"small" depends on whether the intersection is close to a corner or an
+edge of the board, since it is easier to claim territory in the corner
+than in the center.
+
+   Then the value at each intersection is degraded to the minimum value
+of its neighbors. This can be seen as a second implementation of the
+proverb saying that there is no territory in the center of the board.
+This step substantially reduces the size of spheres of territory that
+are open at several sides.
+
+   Finally, there are a number of patterns that explicitly forbid GNU
+Go to count territory at some intersections. This is used e. g. for
+false eyes that will eventually have to be filled in. Also, points for
+prisoners are added.
+
+   To fine tune this scheme, some revisions have been made to the
+influence computations that are relevant for territorial evaluation.
+This includes a reduced default attenuation and some revised pattern
+handling.
+
+\1f
+File: gnugo.info,  Node: The Influence Core,  Next: The Influence Algorithm,  Prev: Territorial Details,  Up: Influence
+
+13.6 The Core of the Influence Function
+=======================================
+
+The basic influence radiation process can efficiently be implemented as
+a breadth first search for adjacent and more distant points, using a
+queue structure.
+
+   Influence barriers can be found by pattern matching, assisted by
+reading through constraints and/or helpers. Wall structures, invasion
+points and intrusion points can be found by pattern matching as well.
+
+   When influence is computed, the basic idea is that there are a number
+of influence sources on the board, whose contributions are summed to
+produce the influence values. For the time being we can assume that the
+living stones on the board are the influence sources, although this is
+not the whole story.
+
+   The function `compute_influence()' contains a loop over the board,
+and for each influence source on the board, the function
+`accumulate_influence()' is called. This is the core of the influence
+function. Before we get into the details, this is how the influence
+field from a single isolated influence source of strength 100 turns out
+(with an attenuation of 3.0):
+
+       0  0  0  0  0  0  0  0  0  0  0
+       0  0  0  0  1  1  1  0  0  0  0
+       0  0  0  1  2  3  2  1  0  0  0
+       0  0  1  3  5 11  5  3  1  0  0
+       0  1  2  5 16 33 16  5  2  1  0
+       0  1  3 11 33  X 33 11  3  1  0
+       0  1  2  5 16 33 16  5  2  1  0
+       0  0  1  3  5 11  5  3  1  0  0
+       0  0  0  1  2  3  2  1  0  0  0
+       0  0  0  0  1  1  1  0  0  0  0
+       0  0  0  0  0  0  0  0  0  0  0
+
+   These values are in reality floating point numbers but have been
+rounded down to the nearest integer for presentation. This means that
+the influence field does not stop when the numbers become zeroes.
+
+   Internally `accumulate_influence()' starts at the influence source
+and spreads influence outwards by means of a breadth first propagation,
+implemented in the form of a queue. The order of propagation and the
+condition that influence only is spread outwards guarantee that no
+intersection is visited more than once and that the process terminates.
+In the example above, the intersections are visited in the following
+order:
+
+       +  +  +  +  +  +  +  +  +  +  +
+       + 78 68 66 64 63 65 67 69 79  +
+       + 62 46 38 36 35 37 39 47 75  +
+       + 60 34 22 16 15 17 23 43 73  +
+       + 58 32 14  6  3  7 19 41 71  +
+       + 56 30 12  2  0  4 18 40 70  +
+       + 57 31 13  5  1  8 20 42 72  +
+       + 59 33 21 10  9 11 24 44 74  +
+       + 61 45 28 26 25 27 29 48 76  +
+       + 77 54 52 50 49 51 53 55 80  +
+       +  +  +  +  +  +  +  +  +  +  +
+
+   The visitation of intersections continues in the same way on the
+intersections marked '`+' and further outwards. In a real position
+there will be stones and tight connections stopping the influence from
+spreading to certain intersections. This will disrupt the diagram
+above, but the main property of the propagation still remains, i.e. no
+intersection is visited more than once and after being visited no more
+influence will be propagated to the intersection.
+
+\1f
+File: gnugo.info,  Node: The Influence Algorithm,  Next: Permeability,  Prev: The Influence Core,  Up: Influence
+
+13.7 The Influence Algorithm
+============================
+
+Let `(m, n)' be the coordinates of the influence source and `(i, j)'
+the coordinates of a an intersection being visited during propagation,
+using the same notation as in the `accumulate_influence()' function.
+Influence is now propagated to its eight closest neighbors, including
+the diagonal ones, according to the follow scheme:
+
+   For each of the eight directions `(di, dj)', do:
+
+  1. Compute the scalar product `di*(i-m) + dj*(j-n)' between the
+     vectors `(di,dj)' and `(i,j) - (m,n)'
+
+  2. If this is negative or zero, the direction is not outwards and we
+     continue with the next direction. The exception is when we are
+     visiting the influence source, i.e. the first intersection, when
+     we spread influence in all directions anyway.
+
+  3. If `(i+di, j+dj)' is outside the board or occupied we also
+     continue with the next direction.
+
+  4. Let S be the strength of the influence at `(i, j)'. The influence
+     propagated to `(i+di, j+dj)' from this intersection is given by
+     `P*(1/A)*D*S', where the three different kinds of damping are:
+
+        * The permeability `P', which is a property of the board
+          intersections. Normally this is one, i.e. unrestricted
+          propagation, but to stop propagation through e.g. one step
+          jumps, the permeability is set to zero at such intersections
+          through pattern matching. This is further discussed below.
+
+        * The attenuation `A', which is a property of the influence
+          source and different in different directions. By default this
+          has the value 3 except diagonally where the number is twice
+          as much. By modifying the attenuation value it is possible to
+          obtain influence sources with a larger or a smaller effective
+          range.
+
+        * The directional damping `D', which is the squared cosine of
+          the angle between `(di,dj)' and `(i,j) - (m,n)'. The idea is
+          to stop influence from "bending" around an interfering stone
+          and get a continuous behavior at the right angle cutoff. The
+          choice of the squared cosine for this purpose is rather
+          arbitrary, but has the advantage that it can be expressed as a
+          rational function of `m', `n', `i', `j', `di', and `dj',
+          without involving any trigonometric or square root
+          computations. When we are visiting the influence source we
+          let by convention this factor be one.
+
+   Influence is typically contributed from up to three neighbors
+"between" this intersection and the influence source. These values are
+simply added together. As pointed out before, all contributions will
+automatically have been made before the intersection itself is visited.
+
+   When the total influence for the whole board is computed by
+`compute_influence()', `accumulate_influence()' is called once for each
+influence source. These invocations are totally independent and the
+influence contributions from the different sources are added together.
+
+\1f
+File: gnugo.info,  Node: Permeability,  Next: Escape,  Prev: The Influence Algorithm,  Up: Influence
+
+13.8 Permeability
+=================
+
+The permeability at the different points is initially one at all empty
+intersections and zero at occupied intersections. To get a useful
+influence function we need to modify this, however. Consider the
+following position:
+
+     |......
+     |OOOO..
+     |...O..
+     |...a.X   ('a' empty intersection)
+     |...O..
+     |...OOO
+     |.....O
+     +------
+
+   The corner is of course secure territory for `O' and clearly the `X'
+stone has negligible effect inside this position. To stop `X' influence
+from leaking into the corner we use pattern matching (pattern
+Barrier1/Barrier2 in `barriers.db') to modify the permeability for `X'
+at this intersection to zero. `O' can still spread influence through
+this connection.
+
+   Another case that needs to be mentioned is how the permeability
+damping is computed for diagonal influence radiation. For horizontal
+and vertical radiation we just use the permeability (for the relevant
+color) at the intersection we are radiating from. In the diagonal case
+we additionally multiply with the maximum permeability at the two
+intersections we are trying to squeeze between. The reason for this can
+be found in the diagram below:
+
+     |...X    |...X
+     |OO..    |Oda.
+     |..O.    |.bc.
+     |..O.    |..O.
+     +----    +----
+
+   We don't want `X' influence to be spread from `a' to `b', and since
+the permeability at both c and d is zero, the rule above stops this.
+
+\1f
+File: gnugo.info,  Node: Escape,  Next: Break Ins,  Prev: Permeability,  Up: Influence
+
+13.9 Escape
+===========
+
+One application of the influence code is in computing the
+`dragon.escape_route' field. This is computed by the function
+`compute_escape()' as follows.  First, every intersection is assigned
+an escape value, ranging between 0 and 4, depending on the influence
+value of the opposite color.
+
+   The `escape_route' field is modified by the code in `surround.c'
+(*note Surrounded Dragons::). It is divided by two for weakly surrounded
+dragons, and set to zero for surrounded ones.
+
+   In addition to assiging an escape value to empty vertices, we also
+assign an escape value to friendly dragons. This value can range from 0
+to 6 depending on the status of the dragon, with live dragons having
+value 6.
+
+   Then we sum the values of the resulting influence escape values over
+the intersections (including friendly dragons) at distance 4, that is,
+over those intersections which can be joined to the dragon by a path of
+length 4 (and no shorter path) not passing adjacent to any unfriendly
+dragon. In the following example, we sum the influence escape value
+over the four vertices labelled '4'.
+
+
+        . . . . . . . . .    . . . . . . . . .
+        . . . . . X . . O    . . . . . X . . O
+        . . X . . . . . O    . . X . 2 . 4 . O
+        X . . . . . . . .    X . . 1 1 2 3 4 .
+        X O . O . . . . O    X O 1 O 1 2 3 4 O
+        X O . O . . . . .    X O 1 O 1 . 4 . .
+        X O . . . X . O O    X O 1 . . X . . O
+        . . . X . . . . .    . 1 . X . . . . .
+        X . . . . X . . .    X . . . . X . . .
+        . . . . . . . . .    . . . . . . . . .
+
+   Since the dragon is trying to reach safety, the reader might wonder
+why `compute_influence()' is called with the opposite color of the
+dragon contemplating escape.  To explain this point, we first remind
+the reader why there is a color parameter to `compute_influence()'.
+Consider the following example position:
+
+          ...XX...
+          OOO..OOO
+          O......O
+          O......O
+          --------
+
+   Whether the bottom will become O territory depends on who is in turn
+to play. This is implemented with the help of patterns in barriers.db,
+so that X influence is allowed to leak into the bottom if X is in turn
+to move but not if O is. There are also "invade" patterns which add
+influence sources in sufficiently open parts of the board which are
+handled differently depending on who is in turn to move.
+
+   In order to decide the territorial value of an O move in the third
+line gap above, influence is first computed in the original position
+with the opponent (i.e. X) in turn to move. Then the O stone is played
+to give:
+
+
+          ...XX...
+          OOO.OOOO
+          O......O
+          O......O
+          --------
+
+   Now influence is computed once more, also this time with X in turn to
+move. The difference in territory (as computed from the influence
+values) gives the territorial value of the move.
+
+   Exactly how influence is computed for use in the escape route
+estimation is all ad hoc. But it makes sense to assume the opponent
+color in turn to move so that the escape possibilities aren't
+overestimated. After we have made a move in the escape direction it is
+after all the opponent's turn.
+
+   The current escape route mechanism seems good enough to be useful
+but is not completely reliable. Mostly it seems to err on the side of
+being too optimistic.
+
+\1f
+File: gnugo.info,  Node: Break Ins,  Next: Surrounded Dragons,  Prev: Escape,  Up: Influence
+
+13.10 Break Ins
+===============
+
+The code in `breakin.c' break-ins into territories that require deeper
+tactical reading and are thus impossible to detect for the influence
+module. It gets run after the influence module and revises its
+territory valuations.
+
+   The break-in code makes use of two public functions in
+`readconnect.c',
+
+   * int break_in(int str, const char goal[BOARDMAX], int *move) 
+
+          Returns WIN if `str' can connect to the area `goal[]' (which
+          may or may not contain stones), if the string's owner gets
+          the first move.
+
+   * int block_off(int str, const char goal[BOARDMAX], int *move) 
+
+          Returns WIN if `str' cannot connect to the area `goal[]'
+          (which may or may not contain stones), if the other color
+          moves first.
+
+   These functions are public front ends to their counterparts
+`recursive_break_in' and `recursive_block_off', which call each other
+recursively.
+
+   The procedure is as follows: We look at all big (>= 10) territory
+regions as detected by the influence code. Using the computation of
+connection distances from readconnect.c, we compute all nearby vertices
+of this territory. We look for the closest safe stones belonging to the
+opponent.
+
+   For each such string `str' we call
+
+   * `break_in(str, territory)' if the opponent is assumed to be next
+     to move,
+
+   * `block_off(str, territory)' if the territory owner is next.
+
+   If the break in is successful resp. the blocking unsuccessful, we
+shrink the territory, and see whether the opponent can still break in.
+We repeat this until the territory is shrunk so much that the opponent
+can no longer reach it.
+
+   To see the break in code in action run GNU Go on the file
+`regression/games/break_in.sgf' with the option `-d0x102000'. Among the
+traces you will find:
+
+       Trying to break in from D7 to:
+     E9 (1)  F9 (1)  G9 (1)  E8 (1)  F8 (1)  G8 (1)
+     H8 (1)  G7 (1)  H7 (1)  J7 (1)  H6 (1)  J6 (1)
+     H5 (1)  J5 (1)  H4 (1)  J4 (1)  H3 (1)  J3 (1)
+     H2 (1)  J2 (1)
+     block_off D7, result 0 PASS (355, 41952 nodes, 0.73 seconds)
+     E9 (1)  F9 (1)  G9 (1)  E8 (1)  F8 (1)  G8 (1)
+     H8 (1)  G7 (1)  H7 (1)  J7 (1)  H6 (1)  J6 (1)
+     H5 (1)  J5 (1)  H4 (1)  J4 (1)  H3 (1)  J3 (1)
+     H2 (1)  J2 (1)
+     B:F4
+       Erasing territory at E8 -b.
+       Erasing territory at G3 -b.
+       Now trying to break to smaller goal:
+     F9 (1)  G9 (1)  F8 (1)  G8 (1)  H8 (1)  G7 (1)
+     H7 (1)  J7 (1)  H6 (1)  J6 (1)  H5 (1)  J5 (1)
+     H4 (1)  J4 (1)  H3 (1)  J3 (1)  H2 (1)  J2 (1)
+
+   This means that the function `break_in' is called with the goal
+marked 'a' in the following diagram. The code attempts to find out
+whether it is possible to connect into this area from the string at
+`D7'.
+
+        A B C D E F G H J
+      9 . . . . a a a . . 9
+      8 . . . . a a a a . 8
+      7 . . . X O O a a a 7
+      6 . . . X X X O a a 6
+      5 . . . . + . . a a 5
+      4 . . . X . . O a a 4
+      3 . . . . X . . a a 3
+      2 . . . . . . O a a 2
+      1 . . . . . . . . . 1
+        A B C D E F G H J
+
+   A breakin is found, so the goal is shrunk by removing `E9' and `J2',
+then break_in is called again.
+
+   In order to see what reading is actually done in order to do this
+break in, you may load GNU Go in gtp mode, then issue the commands:
+
+     loadsgf break_in.sgf
+     = black
+
+     start_sgftrace
+     =
+
+     break_in D7 E9 F9 G9 E8 F8 G8 H8 G7 H7 J7 H6 J6 H5 J5 H4 J4 H3 J3 H2 J2
+     = 1 E8
+
+     finish_sgftrace vars.sgf
+     =
+
+     start_sgftrace
+     =
+
+     break_in D7 F9 G9 F8 G8 H8 G7 H7 J7 H6 J6 H5 J5 H4 J4 H3 J3 H2 J2
+     = 1 G7
+
+     finish_sgftrace vars1.sgf
+
+   This will produce two sgf files containing the variations caused by
+these calls to the breakin code. The second file, `vars1.sgf' will
+contain quite a few variations.
+
+   The break in code makes a list of break ins which are found.  When
+it is finished, the function `add_expand_territory_move' is called for
+each break in, adding a move reason.
+
+   The break in code is slow, and only changes a few moves by the engine
+per game. Nevertheless we believe that it contributes substantially to
+the strength of the program. The break in code is enabled by default in
+GNU Go 3.6 at level 10, and disabled at level 9. In fact, this is the
+*only* difference between levels 9 and 10 in GNU Go 3.6.
+
+\1f
+File: gnugo.info,  Node: Surrounded Dragons,  Next: Influential Patterns,  Prev: Break Ins,  Up: Influence
+
+13.11 Surrounded Dragons
+========================
+
+When is a dragon surrounded?
+
+   As has been pointed out by Bruce Wilcox, the geometric lines
+connecting groups of the opposite color are often important. It is very
+hard to prevent the escape of this `O' dragon:
+
+     ..........
+     .....O....
+     .X.......X
+     .X...O...X
+     ..........
+     ..........
+     ----------
+
+   On the other hand, this dragon is in grave danger:
+
+     ..........
+     ..........
+     .X.......X
+     .....O....
+     .X.......X
+     .X...O...X
+     ..........
+     ..........
+     ----------
+
+   The difference between these two positions is that in the first, the
+`O' dragon crosses the line connecting the top two `X' stones.
+
+   Code in `surround.c' implements a test for when a dragon is
+surrounded.  The idea is to compute the convex hull of the _surround
+set_, that is, the set stones belonging to unfriendly neighbor dragons.
+If the dragon is contained within that hull. If it is, it is said to be
+_surrounded_.
+
+   In practice this scheme is modified slightly. The implementation
+uses various algorithms to compute distances and hostile stones are
+discarded from the surround set when a pair other hostile ones can be
+found which makes the considered one useless. For example, in the
+following position the bottom `O' stone would get discarded.
+
+     O.X.O
+     .....
+     .O.O.
+     .....
+     ..O..
+
+   Also, points are added to the surround set below stones on the
+second and third lines. This should account for the edge being a
+natural barrier.
+
+   In order to compute distances between corners of the convex hull a
+sorting by angle algorithm has been implemented. If the distance
+between a pair enclosing stones is large, the surround status gets
+decreased to `WEAKLY_SURROUNDED', or even 0 for very large ones.
+
+   The sorting by angle must be explained. A small diagram will
+probably help :
+
+     .O.O.
+     O...O
+     ..X..
+     O...O
+     .O.O.
+
+   The sorting algorithm will generate this:
+
+     .4.5.
+     3...6
+     ..X..
+     2...7
+     .1.8.
+
+   That is, the points are sorted by ascending order of the measure of
+the angle S-G-O, where S is SOUTH, G the (approximated) gravity center
+of the goal, and O the position of the considered hostile stones.
+
+   The necessity of such sorting appears when one tries to measure
+distances between enclosing stones without sorting them, just by using
+directly the existing left and right corners arrays. In some positions,
+the results will be inconsistent. Imagine, for example a position where
+for instance the points 1,2,3,4,6 and 7 were in the left arrary,
+leaving only 5 and 8 in the right array. Because of the large distance
+between 5 and 8, the dragon would have declared weak surrounded or not
+surrounded at all. Such cases are rare but frequent enough to require
+the angle sorting.
+
+   The following position:
+
+     O.X.O
+     .....
+     .O.O.
+
+   This is "more" surrounded than the following position:
+
+     O.XXXXXX.O
+     ..........
+     .O......O.
+
+   In the second case, the surround status would be lowered to
+`WEAKLY_SURROUNDED'.
+
+   The surround code is used to modify the escape_route field in the
+dragon2 data array. When a dragon is WEAKLY_SURROUNDED, the
+escape_route is divided by 2. If the dragon is SURROUNDED, escape_route
+is simply set to 0.
+
+\1f
+File: gnugo.info,  Node: Influential Patterns,  Next: Influential Display,  Prev: Surrounded Dragons,  Up: Influence
+
+13.12 Patterns used by the Influence module
+===========================================
+
+This section explains the details of the pattern databases used for the
+influence computation.
+
+   First, we have the patterns in `influence.db', which get matched
+symmetrically for both colors.
+
+   * `E'
+
+          These patterns add extra influence sources close to some
+          shapes like walls.  This tries to reflect their extra
+          strength. These patterns are not used in the influence
+          computations relevant for territory valuations, but they are
+          useful for getting a better estimate of strengths of groups.
+
+   * `I'
+
+          These patterns add extra influence sources at typical
+          invasion points.  Usually they are of small strength. If they
+          additionally have the class `s', the extra influence source
+          is added for both colors. Otherwise, only the player assumed
+          to be next to move gets the benefit.
+
+   The patterns in `barriers.db' get matched only for `O' being the
+player next to move.
+
+   * `A'
+
+          Connections between `X' stones that stop influence of `O'.
+          They have to be tight enough that `O' cannot break through,
+          even though he is allowed to move first.
+
+   * `D'
+
+          Connections between `O' stones that stop influence of `X'. The
+          stones involved can be more loosely connected than those in
+          `A' patterns.
+
+   * `B'
+
+          These indicate positions of followup moves for the `O' stone
+          marked with `Q' in the pattern. They are used to reduce the
+          territory e. g.  where a monkey jump is possible. Also, they
+          are used in the computation of the followup influence, if the
+          `Q' stone was the move played (or a stone saved by the move
+          played).
+
+   * `t'
+
+          These patterns indicate intersections where one color will
+          not be able to get territory, for example in a false eye. The
+          points are set with a call to the helper non_oterritory or
+          non_xterritory in the action of the pattern.
+
+   The intrusion patterns (`B') are more powerful than the description
+above might suggest. They can be very helpful in identifying weak shapes
+(by adding an intrusion source for the opponent where he can break
+through).  A negative inference for this is that a single bad `B'
+pattern, e. g.  one that has a wrong constraint, typically causes 5 to
+10 `FAIL's in the regression test suite.
+
+   Influence Patterns can have autohelper constraints as usual. As for
+the constraint attributes, there are (additionally to the usual ones
+`O', `o', `X' and `x'), attributes `Y' and `FY'. A pattern marked with
+`Y' will only be used in the influence computations relevant for the
+territory valuation, while `FY' patterns only get used in the other
+influence computations.
+
+   The action of an influence pattern is at the moment only used for
+non-territory patterns as mentioned above, and as a workaround for a
+problem with `B' patterns in the followup influence.
+
+   To see why this workaround is necessary, consider the follwoing
+situation:
+
+
+     ..XXX
+     .a*.O
+     .X.O.
+     ..XXO
+
+   (Imagine that there is `X' territory on the left.)
+
+   The move by `O' at `*' has a natural followup move at `a'.  So, in
+the computation of the followup influence for `*', there would be an
+extra influence source for `O' at `a' which would destroy a lot of
+black territory on the left. This would give a big followup value, and
+in effect the move `*' would be treated as sente.
+
+   But of course it is gote, since `X' will answer at `a', which both
+stops the possible intrusion and  threatens to capture `*'. This
+situation is in fact quite common.
+
+   Hence we need an additional constraint that can tell when an
+intrusion pattern can be used in followup influence. This is done by
+misusing the action line: An additional line
+
+     >return <condition>;
+
+   gets added to the pattern. The `condition' should be true if the
+intrusion cannot be stopped in sente. In the above example, the relevant
+intrusion pattern will have an action line of the form
+
+     >return (!xplay_attack(a,b));
+
+   where `b' refers to the stone at `*'. In fact, almost all
+followup-specific constraints look similar to this.
+
+\1f
+File: gnugo.info,  Node: Influential Display,  Next: Influence Tuning,  Prev: Influential Patterns,  Up: Influence
+
+13.13 Colored display and debugging of influence
+================================================
+
+There are various ways to obtain detailed information about the
+influence computations. Colored diagrams showing influence are possible
+from a colored xterm or rxvt window.
+
+   There are two options controlling when to generate diagrams:
+
+   * `-m 0x08' or `-m 8'
+
+          Show diagrams for the initial influence computation. This is
+          done twice, the first time before `make_dragons()' is run and
+          the second time after. The difference is that dead dragons
+          are taken into account the second time. Tactically captured
+          worms are taken into account both times.
+
+   * `--debug-influence LOCATION'
+
+          Show influence diagrams after the move at the given location.
+          An important limitation of this option is that it's only
+          effective for moves that the move generation is considering.
+
+   The other options control which diagrams should be generated in these
+situations. You have to specify at least one of the options above and
+at least one of the options below to generate any output.
+
+   * The options below must be combined with one of the two previous
+ones, or the diagram will not be printed. For example to print the
+influence diagram, you may combine 0x08 and 0x010, and use the option
+`-m 0x018'.*
+
+   * `-m 0x010' or `-m 16'
+
+          Show colored display of territory/moyo/area regions.
+             - territory: cyan
+
+             - moyo: yellow
+
+             - area: red
+          This feature is very useful to get an immediate impression of
+          the influence regions as GNU Go sees them.
+
+   * `-m 0x20' or `-m 32'
+
+          Show numerical influence values for white and black. These
+          come in two separate diagrams, the first one for white, the
+          second one for black. Notice that the influence values are
+          represented by floats and thus have been rounded in these
+          diagrams.
+
+   * `-m 0x40' or `-m 64'
+
+          This generates two diagrams showing the permeability for
+          black and white influence on the board.
+
+   * `-m 0x80' or `-m 128'
+
+          This shows the strength of the influence sources for black
+          and white across the board. You will see sources at each
+          lively stone (with strength depending on the strength of this
+          stone), and sources contributed by patterns.
+
+   * `-m 0x100' or `-m 256'
+
+          This shows the attenuation with which the influence sources
+          spread influence across the board. Low attenuation indicates
+          far-reaching influence sources.
+
+   * `-m 0x200' or `-m 512'
+
+          This shows the territory valuation of GNU Go. Each
+          intersection is shown with a value between -1.0 and +1.0 (or
+          -2 resp. +2 if there is a dead stone on this intersection).
+          Positive values indicate territory for white. A value of -0.5
+          thus indicates a point where black has a 50% chance of
+          getting territory.
+
+   Finally, there is the debug option `-d 0x1' which turns on on
+`DEBUG_INFLUENCE'. This gives a message for each influence pattern that
+gets matched. Unfortunately, these are way too many messages making it
+tedious to navigate the output. However, if you discover an influence
+source with `-m 0x80' that looks wrong, the debug output can help you
+to quickly find out the responsible pattern.
+
+\1f
+File: gnugo.info,  Node: Influence Tuning,  Prev: Influential Display,  Up: Influence
+
+13.14 Influence Tuning with `view.pike'
+=======================================
+
+A useful program in the regression directory is `view.pike'.  To run
+it, you need Pike, which you may download from
+`http://pike.ida.liu.se/'.
+
+   The test case `endgame:920' fails in GNU Go 3.6. We will explain how
+to fix it.
+
+   Start by firing up view.pike on testcase endgame:920, e.g. by running
+`pike view.pike endgame:920' in the regression directory.
+
+   We see from the first view of move values that filling dame at P15 is
+valued highest with 0.17 points while the correct move at C4 is valued
+slightly lower with 0.16. The real problem is of course that C4 is
+worth a full point and thus should be valued about 1.0.
+
+   Now click on C4 to get a list of move reasons and move valuation
+information. Everything looks okay except that change in territory is
+0.00 rather than 1.00 as it ought to be.
+
+   We can confirm this by choosing the "delta territory for..." button
+and again clicking C4. Now B5 should have been marked as one point of
+change in territory, but it's not.
+
+   Next step is to enter the influence debug tool. Press the "influence"
+button, followed by "black influence, dragons known," and "territory
+value." This shows the expected territory if black locally moves first
+everywhere (thus "black influence"). Here we can see that B5 is
+incorrectly considered as 1.0 points of white territory.
+
+   We can compare this with the territory after a white move at C4
+(still assuming that black locally moves first everywhere after that) by
+pressing "after move influence for..." and clicking C4. This looks
+identical, as expected since delta territory was 0, but here it is
+correct that B5 is 1.0 points of territory for white.
+
+   The most straightforward solution to this problem is to add a
+non-territory pattern, saying that white can't get territory on B5 if
+black moves first. The nonterritory patterns are in `barriers.db'.
+
+     Pattern Nonterritory56
+
+     ...
+     X.O
+     ?O.
+
+     :8,t
+
+     eac
+     XbO
+     ?Od
+
+     ;oplay_attack(a,b,c,d,d)
+
+     >non_xterritory(e);
+
+   In these patterns it's always assumed that `O' moves first and thus
+it says that `X' can't get territory at `B5' (`e' in the pattern). Now
+we need to be a bit careful however since after `O' plays at `a' and
+`X' cuts in at `b', it may well happen that `O' needs to defend around
+`d', allowing `X' to cut at `c', possibly making the nonterritory
+assumption invalid. It's difficult to do this entirely accurate, but
+the constraint above is fairly conservative and should guarantee that
+`a' is safe in most, although not all, cases.
+
+\1f
+File: gnugo.info,  Node: Monte Carlo Go,  Next: Libboard,  Prev: Influence,  Up: Top
+
+14 Monte Carlo Go
+*****************
+
+In Monte Carlo Go the engine plays random games to the end, generating
+moves from a pattern database within the context of the algorithm UCT
+(upper confidence bounds applied to trees).  This algorithm allowed the
+program MoGo (`http://www.lri.fr/~gelly/MoGo.htm', to become the first
+computer program to defeat a professional while taking a 9 stone
+handicap (`http://senseis.xmp.net/?MoGo').
+
+   GNU Go 3.8 can play 9x9 Go with the option `--monte-carlo' using the
+UCT algorithm.  For command line options, see *Note Invoking GNU Go::.
+
+   During reading, the engine makes incremental updates of local 3x3
+neighborhood, suicide status, self-atari status, and number of stones
+captured, for each move.
+
+   GNU Go's simulations (Monte Carlo games) are pattern generated.  The
+random playout move generation is distributed strictly proportional to
+move values computed by table lookup from a local context consisting of
+3x3 neighborhood, opponent suicide status, own and opponent self-atari
+status, number of stones captured by own and opponent move, and
+closeness to the previous move. Let's call this local context simply "a
+pattern" and the table "pattern values" or simply "patterns".
+
+   There are three built-in databases that you can select using the
+option `--mc-patterns <name>', where `<name>' is one of
+
+   * `mc_montegnu_classic'
+
+   * `mc_mogo_classic'
+
+   * `mc_uniform'
+
+   The first of these is an approximation of the previous random move
+generation algorithm. The `mogo_classic' pattern values is an
+approximation of the simulation policy used by early versions of MoGo,
+as published in the report odification of UCT with Patterns in
+Monte-Carlo Go (http://hal.inria.fr/inria-00117266) RR-6062, by Sylvain
+Gelly, Yizao Wang, Rémi Munos, and Olivier Teytaud. The uniform pattern
+values is the so called "light" playout which chooses uniformly between
+all legal moves except single point proper eyes.
+
+   If you're not satisfied with these you can also tune your own
+pattern values with a pattern database file and load it at runtime with
+`--mc-load-patterns <name>' adding your own pattern database.
+
+   Let's start with the uniform pattern values. Those are defined by the
+file `patterns/mc_uniform.db', which looks like this:
+
+
+     oOo
+     O*O
+     oO?
+
+     :0
+
+     oOo
+     O*O
+     ---
+
+     :0
+
+     |Oo
+     |*O
+     +--
+
+     :0
+
+   Patterns are always exactly 3x3 in size with the move at the center
+point. The symbols are the usual for GNU Go pattern databases:
+
+     * move
+     O own stone (i.e. the same color as the color to move)
+     o own stone or empty
+     X opponent stone
+     x opponent stone or empty
+     ? own stone, opponent stone, or empty
+     | vertical edge
+     - horizontal edge
+     + corner
+
+   There's also a new symbol:
+
+     % own stone, opponent stone, empty, or edge
+
+   After the pattern comes a line starting with a colon. In all these
+patterns it says that the pattern has a move value of 0, i.e. must not
+be played. Unmatched patterns have a default value of 1. When all move
+values are zero for both players, the playout will stop. Including the
+three patterns above is important because otherwise the playouts would
+be likely to go on indefinitely, or as it actually happens be
+terminated at a hard-coded limit of 600 moves. Also place these
+patterns at the top of the database because when multiple patterns
+match, the first one is used, regardless of the values.
+
+   When using only these patterns you will probably notice that it plays
+rather heavy, trying hard to be solidly connected. This is because
+uniform playouts are badly biased with a high probability of non-solid
+connections being cut apart. To counter this you could try a pattern
+like
+
+     ?X?
+     O*O
+     x.?
+
+     :20,near
+
+   to increase the probability that the one-point jump is reinforced
+when threatened. Here we added the property "near", which means that the
+pattern only applies if the previous move was played "near" this move.
+Primarily "near" means within the surrounding 3x3 neighborhood but it
+also includes certain cases of liberties of low-liberty strings
+adjacent to the previous move, e.g. the move to extend out of an atari
+created by the previous move. You have to read the source to find out
+the exact rules for nearness.
+
+   We could also be even more specific and say
+
+     ?X?
+     O*O
+     x.?
+
+     :20,near,osafe,xsafe
+
+   to exclude the cases where this move is a self atari (osafe) or would
+be a self-atari for the opponent (xsafe).
+
+   It may also be interesting to see the effect of capturing stones. A
+catch-all pattern for captures would be
+
+     ?X%
+     ?*%
+     %%%
+
+     :10,ocap1,osafe
+     :20,ocap2
+     :30,ocap3
+
+   where we have used multiple colon lines to specify different move
+values depending on the number of captured stones; value 10 for a
+single captured stone, value 20 for two captured stones, and value 30
+for three or more captured stones. Here we also excluded self-atari
+moves in the case of 1 captured stone in order to avoid getting stuck
+in triple-ko in the playouts (there's no superko detection in the
+playouts).
+
+   The full set of pattern properties is as follows:
+
+`near'
+     The move is "near" the previous move.
+
+`far'
+     The move is not "near" the previous move.
+
+`osafe'
+     The move is not a self-atari.
+
+`ounsafe'
+     The move is a self-atari.
+
+`xsafe'
+     The move would not be a self-atari for the opponent.
+
+`xunsafe'
+     The move would be a self-atari for the opponent.
+
+`xsuicide'
+     The move would be suicide for the opponent
+
+`xnosuicide'
+     The move would not be suicide for the opponent.
+
+`ocap0'
+     The move captures zero stones.
+
+`ocap1'
+     The move captures one stone.
+
+`ocap2'
+     The move captures two stones.
+
+`ocap3'
+     The move captures three or more stones.
+
+`ocap1+'
+     The move captures one or more stones.
+
+`ocap1-'
+     The move captures at most one stone.
+
+`ocap2+'
+     The move captures two or more stones.
+
+`ocap2-'
+     The move captures at most two stones.
+
+`xcap0'
+     An opponent move would capture zero stones.
+
+`xcap1'
+     An opponent move would capture one stone.
+
+`xcap2'
+     An opponent move would capture two stones.
+
+`xcap3'
+     An opponent move would capture three or more stones.
+
+`xcap1+'
+     An opponent move would capture one or more stones.
+
+`xcap1-'
+     An opponent move would capture at most one stone.
+
+`xcap2+'
+     An opponent move would capture two or more stones.
+
+`xcap2-'
+     An opponent move would capture at most two stones.
+
+   These can be combined arbitrarily but all must be satisfied for the
+pattern to take effect. If contradictory properties are combined, the
+pattern will never match.
+
+14.0.1 Final Remarks
+--------------------
+
+   * Move values are unsigned 32-bit integers. To avoid overflow in
+     computations it is highly recommended to keep the values below
+     10000000 or so.
+
+   * There is no speed penalty for having lots of patterns in the
+     database. The average time per move is approximately constant
+     (slightly dependent on how often stones are captured or become low
+     on liberties) and the time per game mostly depends on the average
+     game length.
+
+   * For more complex pattern databases, see
+     `patterns/mc_montegnu_classic.db' and
+     `patterns/mc_mogo_classic.db'.
+
+   Nobody really knows how to tune the random playouts to get as strong
+engine as possible. Please play with this and report any interesting
+findings, especially if you're able to make it substantially stronger
+than the `montegnu_classic' patterns.
+
+\1f
+File: gnugo.info,  Node: Libboard,  Next: SGF,  Prev: Monte Carlo Go,  Up: Top
+
+15 The Board Library
+********************
+
+* Menu:
+
+* Board Data Structures::      Board Data Structures
+* The Board Array::           One-dimensional board array
+* Incremental Board::          Incremental board data structures
+* Some Board Functions::       Explanation of some board functions
+
+   The foundation of the GNU Go engine is a library of very efficient
+routines for handling go boards.  This board library, called
+`libboard', can be used for those programs that only need a basic go
+board but no AI capability. One such program is `patterns/joseki.c',
+which compiles joseki pattern databases from SGF files.
+
+   If you want to use the board library in your own program, you need
+all the .c-files listed under libboard_SOURCES in engine/Makefile.am,
+and the files in the directories sgf/ and utils/. Then you should
+include engine/board.h in your code.
+
+   The library consists of the following files:
+
+   * `board.h'
+
+          The public interface to the board library.
+
+   * `board.c'
+
+          The basic board code. It uses incremental algorithms for
+          keeping track of strings and liberties on the go board.
+
+   * `boardlib.c'
+
+          This contains all global variable of the board library.
+
+   * `hash.c'
+
+          Code for hashing go positions.
+
+   * `sgffile.c'
+
+          Implementation of output file in SGF format.
+
+   * `printutils.c'
+
+          Utilities for printing go boards and other things.
+
+
+   To use the board library, you must include `liberty.h' just like
+when you use the whole engine, but of course you cannot use all the
+functions declared in it, i.e. the functions that are part of the
+engine, but not part of the board library.  You must link your
+application with `libboard.a'.
+
+\1f
+File: gnugo.info,  Node: Board Data Structures,  Next: The Board Array,  Up: Libboard
+
+15.1 Board Data structures
+==========================
+
+The basic data structures of the board correspond tightly to the
+`board_state' struct described in *Note The Board State::. They are all
+stored in global variables for efficiency reasons, the most important
+of which are:
+
+
+     int           board_size;
+     Intersection  board[MAXSIZE];
+     int           board_ko_pos;
+
+     float         komi;
+     int           white_captured;
+     int           black_captured;
+
+     Hash_data     hashdata;
+
+   The description of the `Position' struct is applicable to these
+variables also, so we won't duplicate it here.  All these variables are
+globals for performance reasons.  Behind these variables, there are a
+number of other private data structures.  These implement incremental
+handling of strings, liberties and other properties (*note Incremental
+Board::). The variable `hashdata' contains information about the hash
+value for the current position (*note Hashing::).
+
+   These variables should never be manipulated directly, since they are
+only the front end for the incremental machinery. They can be read, but
+should only be written by using the functions described in the next
+section. If you write directly to them, the incremental data structures
+will become out of sync with each other, and a crash is the likely
+result.
+
+\1f
+File: gnugo.info,  Node: The Board Array,  Next: Incremental Board,  Prev: Board Data Structures,  Up: Libboard
+
+15.2 The Board Array
+====================
+
+GNU Go represents the board in a one-dimensional array called `board'.
+For some purposes a two dimensional indexing of the board by parameters
+`(i,j)' might be used.
+
+   The `board' array includes out-of-board markers around the board. To
+make the relation to the old two-dimensional board representation
+clear, this figure shows how the 1D indices correspond to the 2D
+indices when MAX_BOARD is 7.
+
+       j  -1   0   1   2   3   4   5   6
+     i +----------------------------------
+     -1|   0   1   2   3   4   5   6   7
+      0|   8   9  10  11  12  13  14  15
+      1|  16  17  18  19  20  21  22  23
+      2|  24  25  26  27  28  29  30  31
+      3|  32  33  34  35  36  37  38  39
+      4|  40  41  42  43  44  45  46  47
+      5|  48  49  50  51  52  53  54  55
+      6|  56  57  58  59  60  61  62  63
+      7|  64  65  66  67  68  69  70  71  72
+
+   To convert between a 1D index `pos' and a 2D index `(i,j)', the
+macros `POS', `I', and `J' are provided, defined as below:
+
+     #define POS(i, j)    ((MAX_BOARD + 2) + (i) * (MAX_BOARD + 1) + (j))
+     #define I(pos)       ((pos) / (MAX_BOARD + 1) - 1)
+     #define J(pos)       ((pos) % (MAX_BOARD + 1) - 1)
+
+   All 1D indices not corresponding to points on the board have the out
+of board marker value `GRAY'. Thus if `board_size' and `MAX_BOARD' both
+are 7, this looks like
+
+       j  -1   0   1   2   3   4   5   6
+     i +----------------------------------
+     -1|   #   #   #   #   #   #   #   #
+      0|   #   .   .   .   .   .   .   .
+      1|   #   .   .   .   .   .   .   .
+      2|   #   .   .   .   .   .   .   .
+      3|   #   .   .   .   .   .   .   .
+      4|   #   .   .   .   .   .   .   .
+      5|   #   .   .   .   .   .   .   .
+      6|   #   .   .   .   .   .   .   .
+      7|   #   #   #   #   #   #   #   #   #
+
+   The indices marked `#' have value `GRAY'.  If `MAX_BOARD' is 7 and
+`board_size' is only 5:
+
+       j  -1   0   1   2   3   4   5   6
+     i +----------------------------------
+     -1|   #   #   #   #   #   #   #   #
+      0|   #   .   .   .   .   .   #   #
+      1|   #   .   .   .   .   .   #   #
+      2|   #   .   .   .   .   .   #   #
+      3|   #   .   .   .   .   .   #   #
+      4|   #   .   .   .   .   .   #   #
+      5|   #   #   #   #   #   #   #   #
+      6|   #   #   #   #   #   #   #   #
+      7|   #   #   #   #   #   #   #   #   #
+
+   Navigation on the board is done by the `SOUTH', `WEST', `NORTH', and
+`EAST' macros,
+
+     #define NS           (MAX_BOARD + 1)
+     #define WE           1
+     #define SOUTH(pos)   ((pos) + NS)
+     #define WEST(pos)    ((pos) - 1)
+     #define NORTH(pos)   ((pos) - NS)
+     #define EAST(pos)    ((pos) + 1)
+
+   There are also shorthand macros `SW', `NW', `NE', `SE', `SS', `WW',
+`NN', `EE' for two step movements.
+
+   Any movement from a point on the board to an adjacent or diagonal
+vertex is guaranteed to produce a valid index into the board array, and
+the color found is GRAY if it is not on the board. To do explicit tests
+for out of board there are two macros
+
+     #define ON_BOARD(pos) (board[pos] != GRAY)
+     #define ON_BOARD1(pos) (((unsigned) (pos) < BOARDSIZE) && board[pos] != GRAY)
+
+   where the first one should be used in the algorithms and the second
+one is useful for assertion tests.
+
+   The advantage of a one-dimensional board array is that it gives a
+significant performance advantage. We need only one variable to
+determine a board position, which means that many functions need less
+arguments. Also, often one computation is sufficient for 1D-coordinate
+where we would need two with two 2D-coordinates: If we, for example,
+want to have the coordinate of the upper right of `pos', we can do this
+with `NORTH(EAST(pos))' instead of `(i+1, j-1)'.
+
+   *Important*: The 2D coordinate `(-1,-1)', which is used for pass and
+sometimes to indicate no point, maps to the 1D coordinate `0', not to
+`-1'. Instead of a plain `0', use one of the macros `NO_MOVE' or
+`PASS_MOVE'.
+
+   A loop over multiple directions is straightforwardly written:
+
+       for (k = 0; k < 4; k++) {
+         int d = delta[k];
+         do_something(pos + d);
+       }
+
+   The following constants are useful for loops over the entire board
+and allocation of arrays with a 1-1 mapping to the board.
+
+     #define BOARDSIZE    ((MAX_BOARD + 2) * (MAX_BOARD + 1) + 1)
+     #define BOARDMIN     (MAX_BOARD + 2)
+     #define BOARDMAX     (MAX_BOARD + 1) * (MAX_BOARD + 1)
+
+   `BOARDSIZE' is the actual size of the 1D board array, `BOARDMIN' is
+the first index corresponding to a point on the board, and `BOARDMAX'
+is one larger than the last index corresponding to a point on the board.
+
+   Often one wants to traverse the board, carrying out some function at
+every vertex. Here are two possible ways of doing this:
+
+       int m, n;
+       for (m = 0; m < board_size; m++)
+         for (n = 0; n < board_size; n++) {
+           do_something(POS(m, n));
+         }
+
+   Or:
+
+       int pos;
+       for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+         if (ON_BOARD(pos))
+           do_something(pos);
+       }
+
+\1f
+File: gnugo.info,  Node: Incremental Board,  Next: Some Board Functions,  Prev: The Board Array,  Up: Libboard
+
+15.3 Incremental Board data structures
+======================================
+
+In addition to the global board state, the algorithms in `board.c'
+implement a method of incremental updates that keeps track of the
+following information for each string:
+
+   * The color of the string.
+
+   * Number of stones in the string.
+
+   * Origin of the string, i.e. a canonical reference point, defined to
+     be the stone with smallest 1D board coordinate.
+
+   * A list of the stones in the string.
+
+   * Number of liberties.
+
+   * A list of the liberties. If there are too many liberties the list
+     is truncated.
+
+   * The number of neighbor strings.
+
+   * A list of the neighbor strings.
+
+   The basic data structure is
+
+     struct string_data {
+       int color;                       /* Color of string, BLACK or WHITE */
+       int size;                        /* Number of stones in string. */
+       int origin;                      /* Coordinates of "origin", i.e. */
+                                        /* "upper left" stone. */
+       int liberties;                   /* Number of liberties. */
+       int libs[MAX_LIBERTIES];         /* Coordinates of liberties. */
+       int neighbors;                   /* Number of neighbor strings */
+       int neighborlist[MAXCHAIN];      /* List of neighbor string numbers. */
+       int mark;                        /* General purpose mark. */
+     };
+
+     struct string_data string[MAX_STRINGS];
+
+   It should be clear that almost all information is stored in the
+`string' array. To get a mapping from the board coordinates to the
+`string' array we have
+
+     static int string_number[BOARDMAX];
+
+which contains indices into the `string' array. This information is only
+valid at nonempty vertices, however, so it is necessary to first verify
+that `board[pos] != EMPTY'.
+
+   The `string_data' structure does not include an array of the stone
+coordinates. This information is stored in a separate array:
+
+     static int next_stone[BOARDMAX];
+
+   This array implements cyclic linked lists of stones. Each vertex
+contains a pointer to another (possibly the same) vertex. Starting at
+an arbitrary stone on the board, following these pointers should
+traverse the entire string in an arbitrary order before coming back to
+the starting point. As for the 'string_number' array, this information
+is invalid at empty points on the board. This data structure has the
+good properties of requiring fixed space (regardless of the number of
+strings) and making it easy to add a new stone or join two strings.
+
+   Additionally the code makes use of some work variables:
+
+     static int ml[BOARDMAX];
+     static int liberty_mark;
+     static int string_mark;
+     static int next_string;
+     static int strings_initialized = 0;
+
+   The `ml' array and `liberty_mark' are used to "mark" liberties on
+the board, e.g. to avoid counting the same liberty twice. The
+convention is that if `ml[pos]' has the same value as `liberty_mark',
+then `pos' is marked. To clear all marks it suffices to increase the
+value of `liberty_mark', since it is never allowed to decrease.
+
+   The same relation holds between the `mark' field of the `string_data'
+structure and `string_mark'. Of course these are used for marking
+individual strings.
+
+   `next_string' gives the number of the next available entry in the
+`string' array. Then `strings_initialized' is set to one when all data
+structures are known to be up to date. Given an arbitrary board
+position in the `board' array, this is done by calling
+`incremental_board_init()'. It is not necessary to call this function
+explicitly since any other function that needs the information does
+this if it has not been done.
+
+   The interesting part of the code is the incremental update of the
+data structures when a stone is played and subsequently removed. To
+understand the strategies involved in adding a stone it is necessary to
+first know how undoing a move works. The idea is that as soon as some
+piece of information is about to be changed, the old value is pushed
+onto a stack which stores the value and its address. The stack is built
+from the following structures:
+
+     struct change_stack_entry {
+       int *address;
+       int value;
+     };
+
+     struct change_stack_entry change_stack[STACK_SIZE];
+     int change_stack_index;
+
+and manipulated with the macros
+
+     BEGIN_CHANGE_RECORD()
+     PUSH_VALUE(v)
+     POP_MOVE()
+
+   Calling `BEGIN_CHANGE_RECORD()' stores a null pointer in the address
+field to indicate the start of changes for a new move. As mentioned
+earlier `PUSH_VALUE()' stores a value and its corresponding address.
+Assuming that all changed information has been duly pushed onto the
+stack, undoing the move is only a matter of calling `POP_MOVE()', which
+simply assigns the values to the addresses in the reverse order until
+the null pointer is reached. This description is slightly simplified
+because this stack can only store 'int' values and we need to also
+store changes to the board. Thus we have two parallel stacks where one
+stores `int' values and the other one stores `Intersection' values.
+
+   When a new stone is played on the board, first captured opponent
+strings, if any, are removed. In this step we have to push the board
+values and the `next_stone' pointers for the removed stones, and update
+the liberties and neighbor lists for the neighbors of the removed
+strings. We do not have to push all information in the 'string' entries
+of the removed strings however. As we do not reuse the entries they
+will remain intact until the move is pushed and they are back in use.
+
+   After this we put down the new stone and get three distinct cases:
+
+  1. The new stone is isolated, i.e. it has no friendly neighbor.
+
+  2. The new stone has exactly one friendly neighbor.
+
+  3. The new stone has at least two friendly neighbors.
+
+   The first case is easiest. Then we create a new string by using the
+number given by `next_string' and increasing this variable. The string
+will have size one, `next_stone' points directly back on itself, the
+liberties can be found by looking for empty points in the four
+directions, possible neighbor strings are found in the same way, and
+those need also to remove one liberty and add one neighbor.
+
+   In the second case we do not create a new string but extend the
+neighbor with the new stone. This involves linking the new stone into
+the cyclic chain, if needed moving the origin, and updating liberties
+and neighbors. Liberty and neighbor information also needs updating for
+the neighbors of the new stone.
+
+   In the third case finally, we need to join already existing strings.
+In order not to have to store excessive amounts of information, we
+create a new string for the new stone and let it assimilate the
+neighbor strings. Thus all information about those can simply be left
+around in the 'string' array, exactly as for removed strings. Here it
+becomes a little more complex to keep track of liberties and neighbors
+since those may have been shared by more than one of the joined
+strings. Making good use of marks it all becomes rather straightforward
+anyway.
+
+   The often used construction
+
+         pos = FIRST_STONE(s);
+         do {
+             ...
+             pos = NEXT_STONE(pos);
+         } while (!BACK_TO_FIRST_STONE(s, pos));
+
+traverses the stones of the string with number `s' exactly once, with
+`pos' holding the coordinates. In general `pos' is used as board
+coordinate and `s' as an index into the `string' array or sometimes a
+pointer to an entry in the `string' array.
+
+\1f
+File: gnugo.info,  Node: Some Board Functions,  Prev: Incremental Board,  Up: Libboard
+
+15.4 Some Board Functions
+=========================
+
+*Reading*, often called *search* in computer game theory, is a
+fundamental process in GNU Go. This is the process of generating
+hypothetical future boards in order to determine the answer to some
+question, for example "can these stones live."  Since these are
+hypothetical future positions, it is important to be able to undo them,
+ultimately returning to the present board. Thus a move stack is
+maintained during reading. When a move is tried, by the function
+`trymove', or its variant `tryko'. This function pushes the current
+board on the stack and plays a move. The stack pointer `stackp', which
+keeps track of the position, is incremented. The function `popgo()'
+pops the move stack, decrementing `stackp' and undoing the last move
+made.
+
+   Every successful `trymove()' must be matched with a `popgo()'.  Thus
+the correct way of using this function is:
+
+
+       if (trymove(pos, color, ... )) {
+            ...    [potentially lots of code here]
+            popgo();
+       }
+
+In case the move is a ko capture, the legality of the capture is
+subject to the komaster scheme (*note Ko::).
+
+   * `int trymove(int pos, int color, const char *message)' 
+
+          Returns true if `(pos)' is a legal move for `color'. In that
+          case, it pushes the board on the stack and makes the move,
+          incrementing `stackp'. If the reading code is recording
+          reading variations (as with `--decide-string' or with `-o'),
+          the string `*message' will be inserted in the SGF file as a
+          comment. The comment will also refer to the string at `str'
+          if this is not `0'. The value of `str' can be NO_MOVE if it
+          is not needed but otherwise the location of `str' is included
+          in the comment.
+
+   * `int tryko(int pos, int color, const char *message)' 
+
+          `tryko()' pushes the position onto the stack, and makes a move
+          `pos' of `color'. The move is allowed even if it is an
+          illegal ko capture. It is to be imagined that `color' has
+          made an intervening ko threat which was answered and now the
+          continuation is to be explored. Return 1 if the move is legal
+          with the above caveat. Returns zero if it is not legal
+          because of suicide.
+
+   * `void popgo()' 
+
+          Pops the move stack. This function must (eventually) be
+          called after a succesful `trymove' or `tryko' to restore the
+          board position. It undoes all the changes done by the call to
+          `trymove/tryko' and leaves the board in the same state as it
+          was before the call.
+
+          *NOTE*: If `trymove/tryko' returns `0', i.e. the tried move
+          was not legal, you must *not* call `popgo'.
+
+   * `int komaster_trymove(int pos, int color, const char *message, int
+     str, int *is_conditional_ko, int consider_conditional_ko)' 
+
+          Variation of `trymove'/`tryko' where ko captures (both
+          conditional and unconditional) must follow a komaster scheme
+          (*note Ko::).
+
+
+   As you see, `trymove()' plays a move which can be easily retracted
+(with `popgo()') and it is call thousands of times per actual game move
+as GNU Go analyzes the board position.  By contrast the function
+`play_move()' plays a move which is intended to be permanent, though it
+is still possible to undo it if, for example, the opponent retracts a
+move.
+
+   * `void play_move(int pos, int color)' 
+
+          Play a move. If you want to test for legality you should
+          first call `is_legal()'. This function strictly follows the
+          algorithm:
+            1. Place a stone of given color on the board.
+
+            2. If there are any adjacent opponent strings without
+               liberties, remove them and increase the prisoner count.
+
+            3. If the newly placed stone is part of a string without
+               liberties, remove it and increase the prisoner count.
+               In spite of the name "permanent move", this move can
+          (usually) be unplayed by `undo_move()', but it is
+          significantly more costly than unplaying a temporary move.
+          There are limitations on the available move history, so under
+          certain circumstances the move may not be possible to unplay
+          at a later time.
+
+   * `int undo_move(int n)' 
+
+          Undo `n' permanent moves. Returns 1 if successful and 0 if it
+          fails.  If `n' moves cannot be undone, no move is undone.
+
+   Other board functions are documented in *Note Board Utilities::.
+
+\1f
+File: gnugo.info,  Node: SGF,  Next: DFA,  Prev: Libboard,  Up: Top
+
+16 Handling SGF trees in memory
+*******************************
+
+"SGF" - Smart Game Format - is a file format which is used for storing
+game records for a number of different games, among them chess and go.
+The format is a framework with special adaptions to each game. This is
+not a description of the file format standard. Too see the exact
+definition of the file format, see `http://www.red-bean.com/sgf/'.
+
+   GNU Go contains a library to handle go game records in the SGF
+format in memory and to read and write SGF files. This library -
+`libsgf.a' - is in the `sgf' subdirectory. To use the SGF routines,
+include the file `sgftree.h'.
+
+   Each game record is stored as a tree of "nodes", where each node
+represents a state of the game, often after some move is made. Each node
+contains zero or more "properties", which gives meaning to the node.
+There can also be a number of "child nodes" which are different
+variations of the game tree. The first child node is the main variation.
+
+   Here is the definition of `SGFNode', and `SGFProperty', the data
+structures which are used to encode the game tree.
+
+
+     typedef struct SGFProperty_t {
+       struct SGFProperty_t *next;
+       short  name;
+       char   value[1];
+     } SGFProperty;
+
+     typedef struct SGFNode_t {
+       SGFProperty      *props;
+       struct SGFNode_t *parent;
+       struct SGFNode_t *child;
+       struct SGFNode_t *next;
+     } SGFNode;
+
+   Each node of the SGF tree is stored in an `SGFNode' struct. It has a
+pointer to a linked list of properties (see below) called `props'. It
+also has a pointer to a linked list of children, where each child is a
+variation which starts at this node. The variations are linked through
+the `next' pointer and each variation continues through the `child'
+pointer. Each and every node also has a pointer to its parent node (the
+`parent' field), except the top node whose parent pointer is `NULL'.
+
+   An SGF property is encoded in the `SGFPoperty' struct. It is linked
+in a list through the `next' field.  A property has a `name' which is
+encoded in a short int.  Symbolic names of properties can be found in
+`sgf_properties.h'.
+
+   Some properties also have a value, which could be an integer, a
+floating point value, a character or a string. These values can be
+accessed or set through special functions.
+
+16.1 The SGFTree datatype
+=========================
+
+Sometimes we just want to record an ongoing game or something similarly
+simple and not do any sofisticated tree manipulation.  In that case we
+can use the simplified interface provided by `SGFTree' below.
+
+
+     typedef struct SGFTree_t {
+       SGFNode *root;
+       SGFNode *lastnode;
+     } SGFTree;
+
+   An `SGFTree' contains a pointer to the root node of an SGF tree and
+a pointer to the node that we last accessed. Most of the time this will
+be the last move of an ongoing game.
+
+   Most of the functions which manipulate an `SGFTree' work exactly
+like their `SGFNode' counterparts, except that they work on the current
+node of the tree.
+
+   All the functions below that take arguments `tree' and `node' will
+work on:
+
+  1. `node' if non-`NULL'
+
+  2. `tree->lastnode' if non-`NULL'
+
+  3. The current end of the game tree.
+        in that order.
+
+\1f
+File: gnugo.info,  Node: API,  Next: GTP,  Prev: Utility Functions,  Up: Top
+
+17 Application Programmers Interface to GNU Go
+**********************************************
+
+If you want to write your own interface to GNU Go, or if you want to
+create a go application using the GNU Go engine, this chapter is of
+interest to you.
+
+   First an overview: GNU Go consists of two parts: the GNU Go engine
+and a program (user interface) which uses this engine. These are linked
+together into one binary. The current program implements the following
+user modes:
+
+   * An interactive board playable on ASCII terminals
+
+   * solo play - GNU Go plays against itself
+
+   * replay - a mode which lets the user investigate moves in an
+     existing SGF file.
+
+   * GMP - Go Modem Protocol, a protocol for automatic play between two
+     computers.
+
+   * GTP - Go Text Protocol, a more general go protocol, *note GTP::.
+   
+   The GNU Go engine can be used in other applications. For example,
+supplied with GNU Go is another program using the engine, called
+`debugboard', in the directory `interface/debugboard/'. The program
+debugboard lets the user load SGF files and can then interactively look
+at different properties of the position such as group status and eye
+status.
+
+   The purpose of this Chapter is to show how to interface your own
+program such as `debugboard' with the GNU Go engine.
+
+   Figure 1 describes the structure of a program using the GNU Go
+engine.
+
+                      +-----------------------------------+
+                      |                                   |
+                      |          Go application           |
+                      |                                   |
+                      +-----+----------+------+           |
+                      |     |          |      |           |
+                      |     |   Game   |      |           |
+                      |     | handling |      |           |
+                      |     |          |      |           |
+                      |     +----+-----+      |           |
+                      |   SGF    |    Move    |           |
+                      | handling | generation |           |
+                      |          |            |           |
+                      +----------+------------+-----------+
+                      |                                   |
+                      |           Board handling          |
+                      |                                   |
+                      +-----------------------------------+
+
+             Figure 1: The structure of a program using the GNU Go engine
+
+   The foundation is a library called `libboard.a' which provides
+efficient handling of a go board with rule checks for moves, with
+incremental handling of connected strings of stones and with methods to
+efficiently hash go positions.
+
+   On top of this, there is a library which helps the application use
+Smart Game Format (SGF) files, with complete handling of game trees in
+memory and in files. This library is called `libsgf.a'
+
+   The main part of the code within GNU Go is the move generation
+library which given a position generates a move. This part of the
+engine can also be used to manipulate a go position, add or remove
+stones, do tactical and strategic reading and to query the engine for
+legal moves. These functions are collected into `libengine.a'.
+
+   The game handling code helps the application programmer keep tracks
+of the moves in a game. Games can be saved to SGF files and then later
+be read back again. These are also within `libengine.a'.
+
+   The responsibility of the application is to provide the user with a
+user interface, graphical or not, and let the user interact with the
+engine.
+
+* Menu:
+
+* Getting Started::          How to use the engine in your program
+* Basic Data Structures::    Basic Data Structures in the Engine
+* The Board State::          The board_state `struct'
+* Positional Functions::     Functions which manipulate a Position
+
+\1f
+File: gnugo.info,  Node: Getting Started,  Next: Basic Data Structures,  Up: API
+
+17.1 How to use the engine in your own program: getting started
+===============================================================
+
+To use the GNU Go engine in your own program you must include the file
+`gnugo.h'. This file describes the whole public API. There is another
+file, `liberty.h', which describes the internal interface within the
+engine. If you want to make a new module within the engine, e.g.  for
+suggesting moves you will have to include this file also. In this
+section we will only describe the public interface.
+
+   Before you do anything else, you have to call the function
+`init_gnugo()'. This function initializes everything within the engine.
+It takes one parameter: the number of megabytes the engine can use for
+the internal hash table. In addition to this the engine will use a few
+megabytes for other purposes such as data describing groups (liberties,
+life status, etc), eyes and so on.
+
+\1f
+File: gnugo.info,  Node: Basic Data Structures,  Next: The Board State,  Prev: Getting Started,  Up: API
+
+17.2 Basic Data Structures in the Engine
+========================================
+
+There are some basic definitions in gnugo.h which are used everywhere.
+The most important of these are the numeric declarations of colors.
+Each intersection on the board is represented by one of these:
+
+
+          color              value
+          EMPTY                0
+          WHITE                1
+          BLACK                2
+
+   There is a macro, `OTHER_COLOR(color)' which can be used to get the
+other color than the parameter. This macro can only be used on `WHITE'
+or `BLACK', but not on `EMPTY'.  
+
+   GNU Go uses two different representations of the board, for most
+purposes a one-dimensional one, but for a few purposes a two
+dimensional one (*note Libboard::). The one-dimensional board was
+introduced before GNU Go 3.2, while the two-dimensional board dates
+back to the ancestral program written by Man Lung Li before 1995. The
+API still uses the two-dimensional board, so the API functions have not
+changed much since GNU Go 3.0.
+
+\1f
+File: gnugo.info,  Node: The Board State,  Next: Positional Functions,  Prev: Basic Data Structures,  Up: API
+
+17.3 The board_state struct
+===========================
+
+A basic data structure in the engine is the `board_state' struct.  This
+structure is internal to the engine and is defined in `liberty.h'.
+
+
+          typedef unsigned char Intersection;
+
+          struct board_state {
+            int board_size;
+
+            Intersection board[BOARDSIZE];
+            int board_ko_pos;
+            int black_captured;
+            int white_captured;
+
+            Intersection initial_board[BOARDSIZE];
+            int initial_board_ko_pos;
+            int initial_white_captured;
+            int initial_black_captured;
+            int move_history_color[MAX_MOVE_HISTORY];
+            int move_history_pos[MAX_MOVE_HISTORY];
+            int move_history_pointer;
+
+            float komi;
+            int move_number;
+          };
+
+   Here `Intersection' stores `EMPTY', `WHITE' or `BLACK'. It is
+currently defined as an `unsigned char' to make it reasonably efficient
+in both storage and access time. The board state contains an array of
+`Intersection''s representing the board.  The move history is contained
+in the struct. Also contained in the struct is the location of a ko
+(`EMPTY') if the last move was not a ko capture, the komi, the number
+of captures, and corresponding data for the initial position at the
+beginning of the move history.
+
+\1f
+File: gnugo.info,  Node: Positional Functions,  Prev: The Board State,  Up: API
+
+17.4 Functions which manipulate a Position
+==========================================
+
+All the functions in the engine that manipulate Positions have names
+prefixed by `gnugo_'. These functions still use the two-dimensional
+representation of the board (*note The Board Array::). Here is a
+complete list, as prototyped in `gnugo.h':
+
+   * `void init_gnugo(float memory)' 
+
+          Initialize the gnugo engine. This needs to be called once
+          only.
+
+   * `void gnugo_clear_board(int boardsize)' 
+
+          Clear the board.
+
+   * `void gnugo_set_komi(float new_komi)' 
+
+          Set the komi.
+
+   * `void gnugo_add_stone(int i, int j, int color)' 
+
+          Place a stone on the board
+
+   * `void gnugo_remove_stone(int i, int j)' 
+
+          Remove a stone from the board
+
+   * `int gnugo_is_pass(int i, int j)' 
+
+          Return true if (i,j) is PASS_MOVE
+
+   * `void gnugo_play_move(int i, int j, int color)' 
+
+          Play a move and start the clock
+
+   * `int gnugo_undo_move(int n)' 
+
+          Undo n permanent moves. Returns 1 if successful and 0 if it
+          fails.  If n moves cannot be undone, no move is undone.
+
+   * `int gnugo_play_sgfnode(SGFNode *node, int to_move)' 
+
+          Perform the moves and place the stones from the SGF node on
+          the board. Return the color of the player whose turn it is to
+          move.
+
+   * `int gnugo_play_sgftree(SGFNode *root, int *until, SGFNode
+     **curnode)' 
+
+          Play the moves in ROOT UNTIL movenumber is reached.  Return
+          the color of the player whose turn it is to move.
+
+   * `int gnugo_is_legal(int i, int j, int color)' 
+
+          Interface to `is_legal()'.
+
+   * `int gnugo_is_suicide(int i, int j, int color)' 
+
+          Interface to `is_suicide()'.
+
+   * `int gnugo_placehand(int handicap)' 
+
+          Interface to placehand. Sets up handicap pieces and returns
+          the number of placed handicap stones.
+
+   * `void gnugo_recordboard(SGFNode *root)' 
+
+          Interface to `sgffile_recordboard()'
+
+   * `int gnugo_sethand(int handicap, SGFNode *node)' 
+
+          Interface to placehand. Sets up handicap stones and returns
+          the number of placed handicap stones, updating the sgf file
+
+   * `float gnugo_genmove(int *i, int *j, int color, int *resign)' 
+
+          Interface to `genmove()'.
+
+   * `int gnugo_attack(int m, int n, int *i, int *j)' 
+
+          Interface to `attack()'.
+
+   * `int gnugo_find_defense(int m, int n, int *i, int *j)' 
+
+          Interface to `find_defense()'.
+
+   * `void gnugo_who_wins(int color, FILE *outfile)' 
+
+          Interface to `who_wins()'.
+
+   * `float gnugo_estimate_score(float *upper, float *lower)' 
+
+          Put upper and lower score estimates into `*upper', `*lower'
+          and return the average. A positive score favors white. In
+          computing the upper bound, `CRITICAL' dragons are awarded to
+          white; in computing the lower bound, they are awarded to
+          black.
+
+   * `void gnugo_examine_position(int color, int how_much)' 
+
+          Interface to `examine_position'.
+
+   * `int gnugo_get_komi()' 
+
+          Report the komi.
+
+   * `void gnugo_get_board(int b[MAX_BOARD][MAX_BOARD])' 
+
+          Place the board into the `b' array.
+
+   * `int gnugo_get_boardsize()' 
+
+          Report the board size.
+
+   * `int gnugo_get_move_number()' 
+
+          Report the move number.
+
+17.5 Game handling
+==================
+
+The functions (in *note Positional Functions::) are all that are needed
+to create a fully functional go program.  But to make the life easier
+for the programmer, there is a small set of functions specially
+designed for handling ongoing games.
+
+   The data structure describing an ongoing game is the `Gameinfo'. It
+is defined as follows:
+
+
+     typedef struct {
+       int       handicap;
+
+       int       to_move;            /* whose move it currently is */
+       SGFTree   game_record;        /* Game record in sgf format. */
+
+       int       computer_player;    /* BLACK, WHITE, or EMPTY (used as BOTH) */
+
+       char      outfilename[128];   /* Trickle file */
+       FILE      *outfile;
+     } Gameinfo;
+
+   The meaning of `handicap' should be obvious. `to_move' is the color
+of the side whose turn it is to move.
+
+   The SGF tree `game_record' is used to store all the moves in the
+entire game, including a header node which contains, among other
+things, komi and handicap.
+
+   If one or both of the opponents is the computer, the field
+`computer_player' is used. Otherwise it can be ignored.
+
+   GNU Go can use a trickle file to continuously save all the moves of
+an ongoing game. This file can also contain information about internal
+state of the engine such as move reasons for various locations or move
+valuations. The name of this file should be stored in `outfilename' and
+the file pointer to the open file is stored in `outfile'. If no trickle
+file is used, `outfilename[0]' will contain a null character and
+`outfile' will be set to `NULL'.
+
+17.5.1 Functions which manipulate a Gameinfo
+--------------------------------------------
+
+All the functions in the engine that manipulate Gameinfos have names
+prefixed by `gameinfo_'.  Here is a complete list, as prototyped in
+`gnugo.h':
+
+   * `void gameinfo_clear(Gameinfo *ginfo, int boardsize, float komi)' 
+
+          Initialize the `Gameinfo' structure.
+
+   * `void gameinfo_print(Gameinfo *ginfo)' 
+
+          Print a gameinfo.
+
+   * `void gameinfo_load_sgfheader(Gameinfo *gameinfo, SGFNode *head)' 
+
+          Reads header info from sgf structure and sets the appropriate
+          variables.
+
+   * `void gameinfo_play_move(Gameinfo *ginfo, int i, int j, int color)' 
+
+          Make a move in the game. Return 1 if the move was legal. In
+          that case the move is actually done. Otherwise return 0.
+
+   * `int gameinfo_play_sgftree_rot(Gameinfo *gameinfo, SGFNode *head,
+     const char *untilstr, int orientation)' 
+
+          Play the moves in an SGF tree. Walk the main variation,
+          actioning the properties into the playing board. Returns the
+          color of the next move to be made. Head is an sgf tree.
+          Untilstr is an optional string of the form either 'L12' or
+          '120' which tells it to stop playing at that move or move
+          number. When debugging, this is the location of the move
+          being examined.
+
+   * `int gameinfo_play_sgftree(Gameinfo *gameinfo, SGFNode *head,
+     const char *untilstr)' 
+
+          Same as previous function, using standard orientation.
+
+\1f
+File: gnugo.info,  Node: Utility Functions,  Next: API,  Prev: DFA,  Up: Top
+
+18 Utility Functions
+********************
+
+In this Chapter, we document some of the utilities which may be called
+from the GNU Go engine.
+
+* Menu:
+
+* General Utilities::              Utilities from `engine/utils.c'
+* Print Utilities::                Utilities from `engine/printutils.c'
+* Board Utilities::                Utilities from `engine/board.c'
+* Influence Utilities::                   Utilities from `engine/influence.c'
+
+\1f
+File: gnugo.info,  Node: General Utilities,  Next: Print Utilities,  Up: Utility Functions
+
+18.1 General Utilities
+======================
+
+Utility functions from `engine/utils.c'. Many of these functions
+underlie autohelper functions (*note Autohelper Functions::).
+
+   * `void change_dragon_status(int dr, int status)' 
+
+          Change the status of all the stones in the dragon at `dr'.
+
+   * `int defend_against(int move, int color, int apos)' 
+
+          Check whether a move at `move' stops the enemy from playing
+          at (apos).
+
+   * `int cut_possible(int pos, int color)'
+
+          Returns true if `color' can cut at `pos', or if connection
+          through `pos' is inhibited. This information is collected by
+          `find_cuts()', using the B patterns in the connections
+          database.
+
+   * `int does_attack(int move, int str)' 
+
+          returns true if the move at `move' attacks `str'. This means
+          that it captures the string, and that `str' is not already
+          dead.
+
+   * `int does_defend(int move, int str)' 
+
+          `does_defend(move, str)' returns true if the move at `move'
+          defends `str'. This means that it defends the string, and that
+          `str' can be captured if no defense is made.
+
+   * `int somewhere(int color, int last_move, ...)' 
+
+          Example: `somewhere(WHITE, 2, apos, bpos, cpos)'.  Returns
+          true if one of the vertices listed satisfies
+          `board[pos]==color'. Here num_moves is the number of moves
+          minus one.  If the check is true the dragon is not allowed to
+          be dead. This check is only valid if `stackp==0'.
+
+   * `int visible_along_edge(int color, int apos, int bpos)'
+
+          Search along the edge for the first visible stone. Start at
+          apos and move in the direction of bpos. Return 1 if the first
+          visible stone is of the given color. It is required that apos
+          and bpos are at the same distance from the edge.
+
+   * `int test_symmetry_after_move(int move, int color, int strict)' 
+
+          Is the board symmetric (or rather antisymmetric) with respect
+          to mirroring in tengen after a specific move has been played?
+          If the move is PASS_MOVE, check the current board.  If strict
+          is set we require that each stone is matched by a stone of
+          the opposite color at the mirrored vertex. Otherwise we only
+          require that each stone is matched by a stone of either color.
+
+   * `int play_break_through_n(int color, int num_moves, ...)' 
+
+          The function `play_break_through_n()' plays a sequence of
+          moves, alternating between the players and starting with
+          color. After having played through the sequence, the three
+          last coordinate pairs gives a position to be analyzed by
+          `break_through()', to see whether either color has managed to
+          enclose some stones and/or connected his own stones. If any
+          of the three last positions is empty, it's assumed that the
+          enclosure has failed, as well as the attempt to connect. If
+          one or more of the moves to play turns out to be illegal for
+          some reason, the rest of the sequence is played anyway, and
+          `break_through()' is called as if nothing special happened.
+          Like `break_through()', this function returns 1 if the
+          attempt to break through was succesful and 2 if it only
+          managed to cut through.
+
+   * `int play_attack_defend_n(int color, int do_attack, int num_moves,
+     ...)'
+
+   * `int play_attack_defend2_n(int color, int do_attack, int
+     num_moves, ...)' 
+
+          The function `play_attack_defend_n()' plays a sequence of
+          moves, alternating between the players and starting with
+          `color'. After having played through the sequence, the last
+          coordinate pair gives a target to attack or defend, depending
+          on the value of do_attack.  If there is no stone present to
+          attack or defend, it is assumed that it has already been
+          captured. If one or more of the moves to play turns out to be
+          illegal for some reason, the rest of the sequence is played
+          anyway, and attack/defense is tested as if nothing special
+          happened. Conversely, `play_attack_defend2_n()' plays a
+          sequence of moves, alternating between the players and
+          starting with `color'. After having played through the
+          sequence, the two last coordinate pairs give two targets to
+          simultaneously attack or defend, depending on the value of
+          do_attack. If there is no stone present to attack or defend,
+          it is assumed that it has already been captured. If one or
+          more of the moves to play turns out to be illegal for some
+          reason, the rest of the sequence is played anyway, and
+          attack/defense is tested as if nothing special happened.  A
+          typical use of these functions is to set up a ladder in an
+          autohelper and see whether it works or not.
+
+   * `int play_connect_n(int color, int do_connect, int num_moves, ...)' 
+
+          Plays a sequence of moves, alternating between the players
+          and starting with `color'. After having played through the
+          sequence, the two last coordinates give two targets that
+          should be connected or disconnected, depending on the value
+          of do_connect. If there is no stone present to connect or
+          disconnect, it is assumed that the connection has failed. If
+          one or more of the moves to play turns out to be illegal for
+          some reason, the rest of the sequence is played anyway, and
+          connection/disconnection is tested as if nothing special
+          happened.  Ultimately the connection is decided by the
+          functions `string_connect' and `disconnect' (*note Connection
+          Reading::).
+
+   * `void set_depth_values(int level)' 
+
+          It is assumed in reading a ladder if `stackp >= depth' that
+          as soon as a bounding stone is in atari, the string is safe.
+          Similar uses are made of the other depth parameters such as
+          `backfill_depth' and so forth. In short, simplifying
+          assumptions are made when `stackp' is large. Unfortunately
+          any such scheme invites the "horizon effect," in which a
+          stalling move is perceived as a win, by pushing the
+          refutation past the "horizon"--the value of `stackp' in which
+          the reading assumptions are relaxed. To avoid the depth it is
+          sometimes necessary to increase the depth parameters. This
+          function can be used to set the various reading depth
+          parameters. If `mandated_depth_value' is not -1 that value is
+          used; otherwise the depth values are set as a function of
+          level. The parameter `mandated_depth_value' can be set at the
+          command line to force a particular value of depth; normally
+          it is -1.
+
+   * `void modify_depth_values(int n)' 
+
+          Modify the various tactical reading depth parameters. This is
+          typically used to avoid horizon effects. By temporarily
+          increasing the depth values when trying some move, one can
+          avoid that an irrelevant move seems effective just because
+          the reading hits a depth limit earlier than it did when
+          reading only on relevant moves.
+
+   * `void increase_depth_values(void)' 
+
+          `modify_depth_values(1)'.
+
+   * `void decrease_depth_values(void)' 
+
+          `modify_depth_values(-1)'.
+
+   * `void restore_depth_values()' 
+
+          Sets `depth' and so forth to their saved values.
+
+   * `void set_temporary_depth_values(int d, int b, int b2, int bc, int
+     ss, int br, int f, int k)'
+
+          Explicitly set the depth values. This function is currently
+          never called.
+
+   * `int confirm_safety(int move, int color, int *defense_point, char
+     safe_stones[BOARDMAX])' 
+
+          Check that the move at color doesn't involve any kind of
+          blunder, regardless of size.
+
+   * `float blunder_size(int move, int color, int *defense_point, char
+     safe_stones[BOARDMAX])' 
+
+          This function will detect some blunders. If the move reduces
+          the number of liberties of an adjacent friendly string, there
+          is a danger that the move could backfire, so the function
+          checks that no friendly worm which was formerly not
+          attackable becomes attackable, and it checks that no opposing
+          worm which was not defendable becomes defendable.  It returns
+          the estimated size of the blunder, or 0.0 if nothing bad has
+          happened.  The array `safe_stones[]' contains the stones that
+          are supposedly safe after `move'. It may be `NULL'. For use
+          when called from `fill_liberty()', this function may
+          optionally return a point of defense, which, if taken, will
+          presumably make the move at `move' safe on a subsequent turn.
+
+   * `int double_atari(int move, int color, float *value, char
+     safe_stones[BOARDMAX])' 
+
+          Returns true if a move by (color) fits the following shape:
+                   X*        (O=color)
+                   OX
+          capturing one of the two `X' strings. The name is a slight
+          misnomer since this includes attacks which are not
+          necessarily double ataris, though the common double atari is
+          the most important special case. If `safe_stones != NULL',
+          then only attacks on stones marked as safe are tried. The
+          value of the double atari attack is returned in value (unless
+          value is `NULL'), and the attacked stones are marked unsafe.
+
+   * `void unconditional_life(int unconditional_territory[BOARDMAX],
+     int color)' 
+
+          Find those worms of the given color that can never be
+          captured, even if the opponent is allowed an arbitrary number
+          of consecutive moves. The coordinates of the origins of these
+          worms are written to the worm arrays and the number of
+          non-capturable worms is returned.  The algorithm is to cycle
+          through the worms until none remains or no more can be
+          captured. A worm is removed when it is found to be
+          capturable, by letting the opponent try to play on all its
+          liberties. If the attack fails, the moves are undone. When no
+          more worm can be removed in this way, the remaining ones are
+          unconditionally alive.  After this, unconditionally dead
+          opponent worms and unconditional territory are identified. To
+          find these, we continue from the position obtained at the end
+          of the previous operation (only unconditionally alive strings
+          remain for color) with the following steps:
+
+            1. Play opponent stones on all liberties of the
+               unconditionally alive strings except where illegal.
+               (That the move order may determine exactly which
+               liberties can be played legally is not important. Just
+               pick an arbitrary order).
+
+            2. Recursively extend opponent strings in atari, except
+               where this would be suicide.
+
+            3. Play an opponent stone anywhere it can get two empty
+               neighbors. (I.e. split big eyes into small ones).
+
+            4. an opponent stone anywhere it can get one empty
+               neighbor. (I.e. reduce two space eyes to one space eyes.)
+               Remaining opponent strings in atari and remaining
+               liberties of the unconditionally alive strings
+               constitute the unconditional territory.  Opponent
+               strings from the initial position placed on
+               unconditional territory are unconditionally dead.  On
+               return, `unconditional_territory[][]' is 1 where color
+               has unconditionally alive stones, 2 where it has
+               unconditional territory, and 0 otherwise.
+
+   * `void who_wins(int color, FILE *outfile)'
+
+          Score the game and determine the winner
+
+   * `void find_superstring(int str, int *num_stones, int *stones)' 
+
+          Find the stones of an extended string, where the extensions
+          are through the following kinds of connections:
+            1. Solid connections (just like ordinary string).
+                        OO
+
+            2. Diagonal connection or one space jump through an
+               intersection where an opponent move would be suicide or
+               self-atari.
+                        ...
+                        O.O
+                        XOX
+                        X.X
+
+            3. Bamboo joint.
+                        OO
+                        ..
+                        OO
+
+            4. Diagonal connection where both adjacent intersections
+               are empty.
+                        .O
+                        O.
+
+            5. Connection through adjacent or diagonal tactically
+               captured stones.  Connections of this type are omitted
+               when the superstring code is called from reading.c, but
+               included when the superstring code is called from owl.c
+
+   * `void find_superstring_liberties(int str, int *num_libs, int
+     *libs, int liberty_cap)' 
+
+          This function computes the superstring at `str' as described
+          above, but omitting connections of type 5. Then it constructs
+          a list of liberties of the superstring which are not already
+          liberties of `str'.  If `liberty_cap' is nonzero, only
+          liberties of substrings of the superstring which have fewer
+          than `liberty_cap' liberties are generated.
+
+   * `void find_proper_superstring_liberties(int str, int *num_libs,
+     int *libs, int liberty_cap)' 
+
+          This function is the same as find_superstring_liberties, but
+          it omits those liberties of the string `str', presumably
+          since those have already been treated elsewhere.  If
+          `liberty_cap' is nonzero, only liberties of substrings of the
+          superstring which have at most `liberty_cap' liberties are
+          generated.
+
+   * `void find_superstring_stones_and_liberties(int str, int
+     *num_stones, int *stones, int *num_libs, int *libs, int
+     liberty_cap)' 
+
+          This function computes the superstring at `str' as described
+          above, but omitting connections of type 5. Then it constructs
+          a list of liberties of the superstring which are not already
+          liberties of `str'. If liberty_cap is nonzero, only liberties
+          of substrings of the superstring which have fewer than
+          liberty_cap liberties are generated.
+
+   * `void superstring_chainlinks(int str, int *num_adj, int
+     adjs[MAXCHAIN], int liberty_cap)' 
+
+          analogous to chainlinks, this function finds boundary chains
+          of the superstring at `str', including those which are
+          boundary chains of `str' itself. If `liberty_cap != 0', only
+          those boundary chains with `<= liberty_cap' liberties are
+          reported.
+
+   * `void proper_superstring_chainlinks(int str, int *num_adj, int
+     adjs[MAXCHAIN], int liberty_cap)' 
+
+          analogous to chainlinks, this function finds boundary chains
+          of the superstring at `str', omitting those which are
+          boundary chains of `str' itself. If `liberty_cap != 0', only
+          those boundary chains with `<= liberty_cap' liberties are
+          reported.
+
+   * `void start_timer(int n)' 
+
+          Start a timer. GNU Go has four internal timers available for
+          assessing the time spent on various tasks.
+
+   * `double time_report(int n, const char *occupation, int move,
+     double mintime)' 
+
+          Report time spent and restart the timer. Make no report if
+          elapsed time is less than mintime.
+
+\1f
+File: gnugo.info,  Node: Print Utilities,  Next: Board Utilities,  Prev: General Utilities,  Up: Utility Functions
+
+18.2 Print Utilities
+====================
+
+Functions in `engine/printutils.c' do formatted printing similar to
+`printf' and its allies.  The following formats are recognized:
+
+   * `%c', `%d', `%f', `%s', `%x'
+
+          These have their usual meaning in formatted output, printing
+          a character, integer, float, string or hexadecimal,
+          respectively.
+
+   * `%o'
+
+          `Outdent.' Normally output is indented by `2*stackp' spaces,
+          so that the depth can be seen at a glance in traces. At the
+          beginning of a format, this `%o' inhibits the indentation.
+
+   * `%H'
+
+          Print a hashvalue.
+
+   * `%C'
+
+          Print a color as a string.
+
+   * `%m', `%2m' (synonyms)
+
+          Takes 2 integers and writes a move, using the two dimensional
+          board representation (*note The Board Array::)
+
+   * `%1m'
+
+          Takes 1 integers and writes a move, using the one dimensional
+          board representation (*note The Board Array::)
+
+   We list the non statically declared functions in `printutils.c'.
+
+   * `void gfprintf(FILE *outfile, const char *fmt, ...)' 
+
+          Formatted output to `outfile'.
+
+   * `int gprintf(const char *fmt, ...)' 
+
+          Formatted output to stderr. Always returns 1 to allow use in
+          short-circuit logical expressions.
+
+   * `int mprintf(const char *fmt, ...)' 
+
+          Formatted output to stdout.
+
+   * `DEBUG(level, fmt, args...)' 
+
+          If `level & debug', do formatted output to stderr. Otherwise,
+          ignore.
+
+   * `void abortgo(const char *file, int line, const char *msg, int
+     pos)' 
+
+          Print debugging output in an error situation, then exit.
+
+   * `const char * color_to_string(int color)' 
+
+          Convert a color value to a string
+
+   * `const char * location_to_string(int pos)' 
+
+          Convert a location to a string
+
+   * `void location_to_buffer(int pos, char *buf)' 
+
+          Convert a location to a string, writing to a buffer.
+
+   * `int string_to_location(int boardsize, char *str, int *m, int *n)' 
+
+          Get the `(m, n)' coordinates in the standard GNU Go
+          coordinate system from the string `str'.  This means that `m'
+          is the nth row from the top and `n' is the column. Both
+          coordinates are between 0 and `boardsize-1', inclusive.
+          Return 1 if ok, otherwise return 0;
+
+   * `int is_hoshi_point(int m, int n)' True if the coordinate is a
+     hoshi point.
+
+   * `void draw_letter_coordinates(FILE *outfile)' Print a line with
+     coordinate letters above the board.
+
+   * `void simple_showboard(FILE *outfile)' 
+
+          Bare bones version of `showboard(0)'. No fancy options, no
+          hint of color, and you can choose where to write it.
+
+   The following functions are in `showbord.c'. Not all public
+functions in that file are listed here.
+
+   * `void showboard(int xo)' 
+
+          Show go board.
+               xo=0:      black and white XO board for ascii game
+               xo=1:      colored dragon display
+               xo=2:      colored eye display
+               xo=3:      colored owl display
+               xo=4:      colored matcher status display
+
+   * `const char * status_to_string(int status)' 
+
+          Convert a status value to a string.
+
+   * `const char * safety_to_string(int status)' 
+
+          Convert a safety value to a string.
+
+   * `const char * result_to_string(int result)' 
+
+          Convert a read result to a string
+
+\1f
+File: gnugo.info,  Node: Board Utilities,  Next: Influence Utilities,  Prev: Print Utilities,  Up: Utility Functions
+
+18.3 Board Utilities
+====================
+
+The functions documented in this section are from `board.c'. Other
+functions in `board.c' are described in *Note Some Board Functions::.
+
+   * `void store_board(struct board_state *state)' 
+
+          Save board state.
+
+   * `void restore_board(struct board_state *state)' 
+
+          Restore a saved board state.
+
+   * `void clear_board(void)' 
+
+          Clear the internal board.
+
+   * `void dump_stack(void)' 
+
+          for use under GDB prints the move stack.
+
+   * `void add_stone(int pos, int color)' 
+
+          Place a stone on the board and update the board_hash. This
+          operation destroys all move history.
+
+   * `void remove_stone(int pos)' 
+
+          Remove a stone from the board and update the board_hash. This
+          operation destroys the move history.
+
+   * `int is_pass(int pos)' 
+
+          Test if the move is a pass or not.  Return 1 if it is.
+
+   * `int  is_legal(int pos, int color)' 
+
+          Determines whether the move `color' at `pos' is legal.
+
+   * `int  is_suicide(int pos, int color)' 
+
+          Determines whether the move `color' at `pos' would be a
+          suicide.  This is the case if
+            1. There is no neighboring empty intersection.
+
+            2. There is no neighboring opponent string with exactly one
+               liberty.
+
+            3. There is no neighboring friendly string with more than
+               one liberty.
+
+   * `int is_illegal_ko_capture(int pos, int color)' 
+
+          Determines whether the move `color' at `pos' would be an
+          illegal ko capture.
+
+   * `int is_edge_vertex(int pos)' 
+
+          Determine whether vertex is on the edge.
+
+   * `int edge_distance(int pos)' 
+
+          Distance to the edge.
+
+   * `int is_corner_vertex(int pos)' 
+
+          Determine whether vertex is a corner.
+
+   * `int get_komaster()' 
+
+   * `int get_kom_pos()' 
+
+          Public functions to access the variable `komaster' and
+          `kom_pos', which are static in `board.c'.
+
+   Next we come to `countlib()' and its allies, which address the
+problem of determining how many liberties a string has. Although
+`countlib()' addresses this basic question, other functions can often
+get the needed information more quickly, so there are a number of
+different functions in this family.
+
+   * `int countlib(int str)' 
+
+          Count the number of liberties of the string at `pos'. There
+          must be a stone at this location.
+
+   * `int findlib(int str, int maxlib, int *libs)' 
+
+          Find the liberties of the string at `str'. This location must
+          not be empty. The locations of up to maxlib liberties are
+          written into `libs[]'. The full number of liberties is
+          returned.  If you want the locations of all liberties,
+          whatever their number, you should pass `MAXLIBS' as the value
+          for `maxlib' and allocate space for `libs[]' accordingly.
+
+   * `int fastlib(int pos, int color, int ignore_captures)' 
+
+          Count the liberties a stone of the given color would get if
+          played at `pos'. The intent of this function is to be as fast
+          as possible, not necessarily complete. But if it returns a
+          positive value (meaning it has succeeded), the value is
+          guaranteed to be correct. Captures are ignored based if the
+          `ignore_captures' field is nonzero. The location `pos' must
+          be empty.  The function fails if there are more than two
+          neighbor strings of the same color.  In this case, the return
+          value is -1.  Captures are handled in a very limited way, so
+          if ignore_capture is 0, and a capture is required, it will
+          often return -1.
+
+   * `int approxlib(int pos, int color, int maxlib, int *libs)' 
+
+          Find the liberties a stone of the given color would get if
+          played at `pos', ignoring possible captures of opponent
+          stones.  The location `pos' must be empty. If `libs != NULL',
+          the locations of up to `maxlib' liberties are written into
+          `libs[]'. The counting of liberties may or may not be halted
+          when `maxlib' is reached. The number of liberties found is
+          returned, which may be less than the total number of
+          liberties if `maxlib' is small. If you want the number or the
+          locations of all liberties, however many they are, you should
+          pass `MAXLIBS' as the value for maxlib and allocate space for
+          `libs[]' accordingly.
+
+   * `int accuratelib(int pos, int color, int maxlib, int *libs)' 
+
+          Find the liberties a stone of the given color would get if
+          played at `pos'. This function takes into consideration all
+          captures. Its return value is exact in that sense it counts
+          all the liberties, unless `maxlib' allows it to stop earlier.
+          The location `pos' must be empty. If `libs != NULL', the
+          locations of up to `maxlib' liberties are written into
+          `libs[]'. The counting of liberties may or may not be halted
+          when `maxlib' is reached. The number of found liberties is
+          returned.  This function guarantees that liberties which are
+          not results of captures come first in `libs[]' array. To find
+          whether all the liberties starting from a given one are
+          results of captures, one may use `if (board[libs[k]] !=
+          EMPTY)' construction.  If you want the number or the
+          locations of all liberties, however many they are, you should
+          pass `MAXLIBS' as the value for `maxlib' and allocate space
+          for `libs[]' accordingly.
+
+   Next we have some general utility functions.
+
+   * `int count_common_libs(int str1, int str2)' 
+
+          Find the number of common liberties of the two strings.
+
+   * `int find_common_libs(int str1, int str2, int maxlib, int *libs)' 
+
+          Find the common liberties of the two strings. The locations
+          of up to `maxlib' common liberties are written into `libs[]'.
+          The full number of common liberties is returned.  If you want
+          the locations of all common liberties, whatever their number,
+          you should pass `MAXLIBS' as the value for `maxlib' and
+          allocate space for `libs[]' accordingly.
+
+   * `int have_common_lib(int str1, int str2, int *lib)' 
+
+          Determine whether two strings have at least one common
+          liberty.  If they do and `lib != NULL', one common liberty is
+          returned in `*lib'.
+
+   * `int countstones(int str)' 
+
+          Report the number of stones in a string.
+
+   * `int findstones(int str, int maxstones, int *stones)' 
+
+          Find the stones of the string at `str'. The location must not
+          be empty. The locations of up to maxstones stones are written
+          into `stones[]'. The full number of stones is returned.
+
+   * `int  chainlinks(int str, int adj[MAXCHAIN])' 
+
+          This very useful function returns (in the `adj' array) the
+          chains surrounding the string at `str'. The number of chains
+          is returned.
+
+   * `int chainlinks2(int str, int adj[MAXCHAIN], int lib)' 
+
+          Returns (in `adj' array) those chains surrounding the string
+          at `str', which has exactly `lib' liberties. The number of
+          such chains is returned.
+
+   * `int chainlinks3(int str, int adj[MAXCHAIN], int lib)' 
+
+          Returns (in `adj' array) the chains surrounding the string at
+          `str', which have less or equal `lib' liberties.  The number
+          of such chains is returned.
+
+   * `int extended_chainlinks(int str, int adj[MAXCHAIN], int
+     both_colors)' 
+
+          Returns (in the `adj' array) the opponent strings being
+          directly adjacent to `str' or having a common liberty with
+          `str'. The number of such strings is returned.  If the
+          both_colors parameter is true, also own strings sharing a
+          liberty are returned.
+
+   * `int find_origin(int str)' 
+
+          Find the origin of a string, i.e. the point with the smallest
+          1D board coordinate. The idea is to have a canonical
+          reference point for a string.
+
+   * `int is_self_atari(int pos, int color)' 
+
+          Determine whether a move by color at `pos' would be a self
+          atari, i.e. whether it would get more than one liberty. This
+          function returns true also for the case of a suicide move.
+
+   * `int liberty_of_string(int pos, int str)' 
+
+          Returns true if `pos' is a liberty of the string at `str'.
+
+   * `int second_order_liberty_of_string(int pos, int str)' 
+
+          Returns true if `pos' is a second order liberty of the string
+          at str.
+
+   * `int neighbor_of_string(int pos, int str)' 
+
+          Returns true if `pos' is adjacent to the string at `str'.
+
+   * `int has_neighbor(int pos, int color)' 
+
+          Returns true if `pos' has a neighbor of `color'.
+
+   * `int same_string(int str1, int str2)' 
+
+          Returns true if `str1' and `str2' belong to the same string.
+
+   * `int adjacent_strings(int str1, int str2)' 
+
+          Returns true if the strings at `str1' and `str2' are adjacent.
+
+   * `int is_ko(int pos, int color, int *ko_pos)' 
+
+          Return true if the move `pos' by `color' is a ko capture
+          (whether capture is legal on this move or not). If so, and if
+          `ko_pos' is not a `NULL' pointer, then `*ko_pos' returns the
+          location of the captured ko stone.  If the move is not a ko
+          capture, `*ko_pos' is set to 0.  A move is a ko capture if
+          and only if
+            1. All neighbors are opponent stones.
+
+            2. The number of captured stones is exactly one.
+
+   * `int is_ko_point(int pos)' 
+
+          Return true if `pos' is either a stone, which if captured
+          would give ko, or if `pos' is an empty intersection adjacent
+          to a ko stone.
+
+   * `int does_capture_something(int pos, int color)' 
+
+          Returns 1 if at least one string is captured when color plays
+          at `pos'.
+
+   * `void mark_string(int str, char mx[BOARDMAX], char mark)' 
+
+          For each stone in the string at pos, set `mx' to value mark.
+          If some of the stones in the string are marked prior to
+          calling this function, only the connected unmarked stones
+          starting from pos are guaranteed to become marked. The rest
+          of the string may or may not become marked. (In the current
+          implementation, it will.)
+
+   * `int move_in_stack(int pos, int cutoff)' 
+
+          Returns true if at least one move has been played at pos at
+          deeper than level `cutoff' in the reading tree.
+
+   * `int stones_on_board(int color)' 
+
+          Return the number of stones of the indicated color(s) on the
+          board.  This only counts stones in the permanent position,
+          not stones placed by `trymove()' or `tryko()'. Use
+          `stones_on_board(BLACK | WHITE)' to get the total number of
+          stones on the board.
+
+\1f
+File: gnugo.info,  Node: Influence Utilities,  Prev: Board Utilities,  Up: Utility Functions
+
+18.4 Utilities from `engine/influence.c'
+========================================
+
+We will only list here a portion of the public functions in
+`influence.c'.  The influence code is invoked through the function
+`compute_influence' (*note Influence Usage::). It is invoked as follows.
+
+   * `void compute_influence(int color, const char
+     safe_stones[BOARDMAX], const float strength[BOARDMAX], struct
+     influence_data *q, int move, const char *trace_message)' 
+
+          Compute the influence values for both colors.  The caller must
+             - set up the `board[]' state
+
+             - mark safe stones with `INFLUENCE_SAFE_STONE', dead
+               stones with 0
+
+             - mark stones newly saved by a move with
+               `INFLUENCE_SAVED_STONE' (this is relevant if the
+               influence_data *q is reused to compute a followup value
+               for this move).
+          Results will be stored in q.  `move' has no effects except
+          toggling debugging. Set it to -1 for no debug output at all
+          (otherwise it will be controlled by the `-m' command line
+          option). It is assumed that `color' is in turn to move. (This
+          affects the barrier patterns (class A, D) and intrusions
+          (class B)). Color
+
+   Other functions in `influence.c' are of the nature of utilities
+which may be useful throughout the engine. We list the most useful ones
+here.
+
+   * `void influence_mark_non_territory(int pos, int color)' 
+
+          Called from actions for `t' patterns in `barriers.db'.  Marks
+          `pos' as not being territory for `color'.
+
+   * `int whose_territory(const struct influence_data *q, int pos)' 
+
+          Return the color of the territory at `pos'. If it's territory
+          for neither color, `EMPTY' is returned.
+
+   * `int whose_moyo(const struct influence_data *q, int pos)' 
+
+          Return the color who has a moyo at `pos'. If neither color
+          has a moyo there, `EMPTY' is returned. The definition of moyo
+          in terms of the influences is totally ad hoc.
+
+   * `int whose_area(const struct influence_data *q, int pos)' 
+
+          Return the color who has dominating influence ("area") at
+          `pos'.  If neither color dominates the influence there, EMPTY
+          is returned.  The definition of area in terms of the
+          influences is totally ad hoc.
+
+\1f
+File: gnugo.info,  Node: GTP,  Next: Regression,  Prev: API,  Up: Top
+
+19 The Go Text Protocol
+***********************
+
+* Menu:
+
+* The Go Text Protocol::          The Go Text Protocol
+* Running in GTP mode::           Running GNU Go in GTP mode
+* GTP applications::              GTP applications
+* The Metamachine::               The Metamachine
+* Adding new GTP commands::       Adding new GTP commands
+* GTP command reference::         Details on every GTP command
+
+\1f
+File: gnugo.info,  Node: The Go Text Protocol,  Next: Running in GTP mode,  Up: GTP
+
+19.1 The Go Text Protocol
+=========================
+
+GNU Go 3.0 introduced a new interface, the Go Text Protocol, abbreviated
+GTP. The intention was to make an interface that is better suited for
+machine-machine communication than the ascii interface and simpler, more
+powerful, and more flexible than the Go Modem Protocol.
+
+   There are two versions of the protocol. Version 1 was used with GNU
+Go 3.0 and 3.2. GNU Go 3.4 and later versions use protocol version 2.
+The specification of GTP version 2 is available at
+`http://www.lysator.liu.se/~gunnar/gtp/'. GNU Go 3.4 is the reference
+implementation for GTP version 2, but all but the most common commands
+are to be regarded as private extensions of the protocol.
+
+   The GTP has a variety of applications. For GNU Go the first use was
+in regression testing (*note Regression::), followed by communication
+with the NNGS go server and for automated test games against itself and
+other programs. Now there are also many graphical user interfaces
+available supporting GTP, as well as bridges to other Go servers than
+NNGS.
+
+\1f
+File: gnugo.info,  Node: Running in GTP mode,  Next: GTP applications,  Prev: The Go Text Protocol,  Up: GTP
+
+19.2 Running GNU Go in GTP mode
+===============================
+
+To start GNU Go in GTP mode, simply invoke it with the option `--mode
+gtp'. You will not get a prompt or any other output to start with but
+GNU Go is silently waiting for GTP commands.
+
+   A sample GTP session may look as follows:
+
+     virihaure 462% ./gnugo --mode gtp
+     1 boardsize 7
+     =1
+
+     2 clear_board
+     =2
+
+     3 play black D5
+     =3
+
+     4 genmove white
+     =4 C3
+
+     5 play black C3
+     ?5 illegal move
+
+     6 play black E3
+     =6
+
+     7 showboard
+     =7
+        A B C D E F G
+      7 . . . . . . . 7
+      6 . . . . . . . 6
+      5 . . + X + . . 5
+      4 . . . + . . . 4
+      3 . . O . X . . 3
+      2 . . . . . . . 2     WHITE (O) has captured 0 stones
+      1 . . . . . . . 1     BLACK (X) has captured 0 stones
+        A B C D E F G
+
+     8 quit
+     =8
+
+   Commands are given on a single line, starting by an optional identity
+number, followed by the command name and its arguments.
+
+   If the command is successful, the response starts by an equals sign
+(`='), followed by the identity number of the command (if any) and then
+the result. In this example all results were empty strings except for
+command 4 where the answer was the white move at C3, and command 7
+where the result was a diagram of the current board position. The
+response ends by two consecutive newlines.
+
+   Failing commands are signified by a question mark (`?') instead of
+an equals sign, as in the response to command 5.
+
+   The detailed specification of the protocol can be found at
+`http://www.lysator.liu.se/~gunnar/gtp/'. The available commands in GNU
+Go may always be listed using the command `list_commands'.  They are
+also documented in *Note GTP command reference::.
+
+\1f
+File: gnugo.info,  Node: GTP applications,  Next: The Metamachine,  Prev: Running in GTP mode,  Up: GTP
+
+19.3 GTP applications
+=====================
+
+GTP is an asymmetric protocol involving two parties which we call
+controller and engine. The controller sends all commands and the engine
+only responds to these commands. GNU Go implements the engine end of the
+protocol.
+
+   With the source code of GNU Go is also distributed a number of
+applications implementing the controller end. Among the most
+interesting of these are:
+
+   * `regression/regress.awk'
+
+          Script to run regressions. The script sends GTP commands to
+          set up and evaluate positions to the engine and then analyzes
+          the responses from the engine. More information about GTP
+          based regression testing can be found in the regression
+          chapter (*note Regression::).
+
+   * `regression/regress.pl'
+
+          Perl script to run regressions, giving output which together
+          with the CGI script `regression/regress.plx' generates HTML
+          views of the regressions.
+
+   * `regression/regress.pike'
+
+          Pike script to run regressions. More feature-rich and
+          powerful than `regress.awk'.
+
+   * `regression/view.pike'
+
+          Pike script to examine a single regression testcase through a
+          graphical board. This gives an easy way to inspect many of
+          the GNU Go internals.
+
+   * `interface/gtp_examples/twogtp'
+
+          Perl script to play two engines against each other. The script
+          essentially sets up both engines with desired boardsize,
+          handicap, and komi, then relays moves back and forth between
+          the engines.
+
+   * `interface/gtp_examples/twogtp-a'
+
+          An alternative Perl implementation of twogtp.
+
+   * `interface/gtp_examples/twogtp.py'
+
+          Implementation of twogtp in Python. Has more features than
+          the Perl variants.
+
+   * `interface/gtp_examples/twogtp.pike'
+
+          Implementation of twogtp in Pike. Has even more features than
+          the Python variant.
+
+   * `interface/gtp_examples/2ptkgo.pl'
+
+          Variation of twogtp which includes a graphical board.
+
+   More GTP applications, including bridges to go servers and graphical
+user interfaces, are listed at `http://www.lysator.liu.se/~gunnar/gtp/'.
+
+\1f
+File: gnugo.info,  Node: The Metamachine,  Next: Adding new GTP commands,  Prev: GTP applications,  Up: GTP
+
+19.4 The Metamachine
+====================
+
+An interesting application of the GTP is the concept of using GNU Go as
+an "Oracle" that can be consulted by another process. This could be
+another computer program that asks GNU Go to generate future board
+positions, then evaluate them.
+
+   David Doshay at the University of California at Santa Cruz has done
+interesting experiments with a parallel engine, known as SlugGo, that
+is based on GNU Go.  These are described in
+`http://lists.gnu.org/archive/html/gnugo-devel/2004-08/msg00060.html'.
+
+   The "Metamachine" experiment is a more modest approach using the GTP
+to communicate with a GNU Go process that is used as an oracle. The
+following scheme is used.
+
+   * The GNU Go "oracle" is asked to generate its top moves using the
+     GTP `top_moves' commands.
+
+   * Both moves are tried and `estimate_score' is called from the
+     resulting board position.
+
+   * The higher scoring position is selected as the engine's move.
+
+   This scheme does not produce a stronger engine, but it is
+suggestive, and the SlugGo experiment seems to show that a more
+elaborate scheme along the same lines could produce a stronger engine.
+
+   Two implementations are distributed with GNU Go. Both make use of
+`fork' and `pipe' system calls, so they require a Unix-like
+environment.  The Metamachine has been tested under GNU/Linux.
+
+   *Important:* If the Metamachine terminates normally, the GNU Go
+process will be killed. However there is a danger that something will
+go wrong. When you are finished running the Metamachine, it is a good
+idea to run `ps -A|grep gnugo' or `ps -aux|grep gnugo' to make sure
+there are no unterminated processes. (If there are, just kill them.)
+
+19.4.1 The Standalone Metamachine
+---------------------------------
+
+In `interface/gtp_examples/metamachine.c' is a standalone
+implementation of the Metamachine. Compile it with `cc -o metamachine
+metamachine.c' and run it. It forks a `gnugo' process with which it
+communicates through the GTP, to use as an oracle.
+
+   The following scheme is followed:
+
+                  stdin             pipe a
+       GTP client ----> Metamachine -----> GNU Go
+                  <----             <-----
+                 stdout             pipe b
+
+   Most commands issued by the client are passed along verbatim to GNU
+Go by the Metamachine. The exception is gg_genmove, which is
+intercepted then processed differently, as described above. The client
+is unaware of this, and only knows that it issued a gg_genmove command
+and received a reply.  Thus to the the Metamachine appears as an
+ordinary GTP engine.
+
+   Usage: no arguments gives normal GTP behavior.  `metamachine
+--debug' sends diagnostics to stderr.
+
+19.4.2 GNU Go as a Metamachine
+------------------------------
+
+Alternatively, you may compile GNU Go with the configure option
+`--enable-metamachine'. This causes the file `oracle.c' to be compiled,
+which contains the Metamachine code. This has no effect on the engine
+unless you run GNU Go with the runtime option `--metamachine'. Thus you
+must use both the configure and the runtime option to get the
+Metamachine.
+
+   This method is better than the standalone program since you have
+access to GNU Go's facilities. For example, you can run the Metamachine
+with CGoban or in Ascii mode this way.
+
+   You can get traces by adding the command line `-d0x1000000'. In
+debugging the Metamachine, a danger is that any small oversight in
+designing the program can cause the forked process and the controller
+to hang, each one waiting for a response from the other. If this seems
+to happen it is useful to know that you can attach `gdb' to a running
+process and find out what it is doing.
+
+\1f
+File: gnugo.info,  Node: Adding new GTP commands,  Next: GTP command reference,  Prev: The Metamachine,  Up: GTP
+
+19.5 Adding new GTP commands
+============================
+
+The implementation of GTP in GNU Go is distributed over three files,
+`interface/gtp.h', `interface/gtp.c', and `interface/play_gtp.c'. The
+first two implement a small library of helper functions which can be
+used also by other programs. In the interest of promoting the GTP they
+are licensed with minimal restrictions (*note GTP License::). The
+actual GTP commands are implemented in `play_gtp.c', which has
+knowledge about the engine internals.
+
+   To see how a simple but fairly typical command is implemented we
+look at `gtp_countlib()' (a GNU Go private extension command):
+
+     static int
+     gtp_countlib(char *s)
+     {
+       int i, j;
+       if (!gtp_decode_coord(s, &i, &j))
+         return gtp_failure("invalid coordinate");
+
+       if (BOARD(i, j) == EMPTY)
+         return gtp_failure("vertex must not be empty");
+
+       return gtp_success("%d", countlib(POS(i, j)));
+     }
+
+   The arguments to the command are passed in the string `s'. In this
+case we expect a vertex as argument and thus try to read it with
+`gtp_decode_coord()' from `gtp.c'.
+
+   A correctly formatted response should start with either `=' or `?',
+followed by the identity number (if one was sent), the actual result,
+and finally two consecutive newlines. It is important to get this
+formatting correct since the controller in the other end relies on it.
+Naturally the result itself cannot contain two consecutive newlines but
+it may be split over several lines by single newlines.
+
+   The easiest way to generate a correctly formatted response is with
+one of the functions `gtp_failure()' and `gtp_success()', assuming that
+their formatted output does not end with a newline.
+
+   Sometimes the output is too complex for use with gtp_success, e.g. if
+we want to print vertices, which gtp_success() does not support. Then
+we have to fall back to the construction in e.g.  `gtp_genmove()':
+
+     static int
+     gtp_genmove(char *s)
+     {
+       [...]
+       gtp_start_response(GTP_SUCCESS);
+       gtp_print_vertex(i, j);
+       return gtp_finish_response();
+     }
+
+   Here `gtp_start_response()' writes the equal sign and the identity
+number while `gtp_finish_response()' adds the final two newlines.  The
+next example is from `gtp_list_commands()':
+
+     static int
+     gtp_list_commands(char *s)
+     {
+       int k;
+       UNUSED(s);
+
+       gtp_start_response(GTP_SUCCESS);
+
+       for (k = 0; commands[k].name != NULL; k++)
+         gtp_printf("%s\n", commands[k].name);
+
+       gtp_printf("\n");
+       return GTP_OK;
+     }
+
+   As we have said, the response should be finished with two newlines.
+Here we have to finish up the response ourselves since we already have
+one newline in place from the last command printed in the loop.
+
+   In order to add a new GTP command to GNU Go, the following pieces of
+code need to be inserted in `play_gtp.c':
+  1. A function declaration using the `DECLARE' macro in the list
+     starting at line 68.
+
+  2. An entry in the `commands[]' array starting at line 200.
+
+  3. An implementation of the function handling the command.
+
+   Useful helper functions in `gtp.c'/`gtp.h' are:
+   * `gtp_printf()' for basic formatted printing.
+
+   * `gtp_mprintf()' for printing with special format codes for
+     vertices and colors.
+
+   * `gtp_success()' and `gtp_failure()' for simple responses.
+
+   * `gtp_start_response()' and `gtp_end_response()' for more complex
+     responses.
+
+   * `gtp_print_vertex()' and `gtp_print_vertices()' for printing one
+     or multiple vertices.
+
+   * `gtp_decode_color()' to read in a color from the command arguments.
+
+   * `gtp_decode_coord()' to read in a vertex from the command
+     arguments.
+
+   * `gtp_decode_move()' to read in a move, i.e. color plus vertex,
+     from the command arguments.
+
+\1f
+File: gnugo.info,  Node: GTP command reference,  Prev: Adding new GTP commands,  Up: GTP
+
+19.6 GTP command reference
+==========================
+
+This section lists the GTP commands implemented in GNU Go along with
+some information about each command. Each entry in the list has the
+following fields:
+
+   * Function: What this command does.
+
+   * Arguments: What other information, if any, this command requires.
+     Typical values include "none" or "vertex" or "integer" (there are
+     others).
+
+   * Fails: Circumstances which cause this command to fail.
+
+   * Returns: What is displayed after the "=" and before the two
+     newlines.  Typical values include "nothing" or "a move coordinate"
+     or some status string (there are others).
+
+   * Status: How this command relates to the standard GTP version 2
+     commands. If nothing else is specified it is a GNU Go private
+     extension.
+
+   Without further ado, here is the big list (in no particular order).
+
+   Note: if new commands are added by editing `interface/play_gtp.c'
+this list could become incomplete. You may rebuild this list in
+`doc/gtp-commands.texi' with the command `make gtp-commands' in the
+`doc/' directory. This may require GNU sed.
+
+   * quit: Quit
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * protocol_version: Report protocol version.
+     Arguments: none
+     Fails:     never
+     Returns:   protocol version number
+
+     Status:    GTP version 2 standard command.
+      
+
+   * name: Report the name of the program.
+     Arguments: none
+     Fails:     never
+     Returns:   program name
+
+     Status:    GTP version 2 standard command.
+      
+
+   * version: Report the version number of the program.
+     Arguments: none
+     Fails:     never
+     Returns:   version number
+
+     Status:    GTP version 2 standard command.
+      
+
+   * boardsize: Set the board size to NxN and clear the board.
+     Arguments: integer
+     Fails:     board size outside engine's limits
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * query_boardsize: Find the current boardsize
+     Arguments: none
+     Fails:     never
+     Returns:   board_size
+      
+
+   * clear_board: Clear the board.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * orientation: Set the orienation to N and clear the board
+     Arguments: integer
+     Fails:     illegal orientation
+     Returns:   nothing
+      
+
+   * query_orientation: Find the current orientation
+     Arguments: none
+     Fails:     never
+     Returns:   orientation
+      
+
+   * komi: Set the komi.
+     Arguments: float
+     Fails:     incorrect argument
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * get_komi: Get the komi
+     Arguments: none
+     Fails:     never
+     Returns:   Komi
+      
+
+   * black: Play a black stone at the given vertex.
+     Arguments: vertex
+     Fails:     invalid vertex, illegal move
+     Returns:   nothing
+
+     Status:    Obsolete GTP version 1 command.
+      
+
+   * playwhite: Play a white stone at the given vertex.
+     Arguments: vertex
+     Fails:     invalid vertex, illegal move
+     Returns:   nothing
+
+     Status:    Obsolete GTP version 1 command.
+      
+
+   * play: Play a stone of the given color at the given vertex.
+     Arguments: color, vertex
+     Fails:     invalid vertex, illegal move
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * fixed_handicap: Set up fixed placement handicap stones.
+     Arguments: number of handicap stones
+     Fails:     invalid number of stones for the current boardsize
+     Returns:   list of vertices with handicap stones
+
+     Status:    GTP version 2 standard command.
+      
+
+   * place_free_handicap: Choose free placement handicap stones and put
+     them on the board.
+     Arguments: number of handicap stones
+     Fails:     invalid number of stones
+     Returns:   list of vertices with handicap stones
+
+     Status:    GTP version 2 standard command.
+      
+
+   * set_free_handicap: Put free placement handicap stones on the board.
+     Arguments: list of vertices with handicap stones
+     Fails:     board not empty, bad list of vertices
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * get_handicap: Get the handicap
+     Arguments: none
+     Fails:     never
+     Returns:   handicap
+      
+
+   * loadsgf: Load an sgf file, possibly up to a move number or the
+     first occurence of a move.
+     Arguments: filename + move number, vertex, or nothing
+     Fails:     missing filename or failure to open or parse file
+     Returns:   color to play
+
+     Status:    GTP version 2 standard command.
+      
+
+   * color: Return the color at a vertex.
+     Arguments: vertex
+     Fails:     invalid vertex
+     Returns:   "black", "white", or "empty"
+      
+
+   * list_stones: List vertices with either black or white stones.
+     Arguments: color
+     Fails:     invalid color
+     Returns:   list of vertices
+      
+
+   * countlib: Count number of liberties for the string at a vertex.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   Number of liberties.
+      
+
+   * findlib: Return the positions of the liberties for the string at a
+     vertex.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   Sorted space separated list of vertices.
+      
+
+   * accuratelib: Determine which liberties a stone of given color will
+     get if played at given vertex.
+     Arguments: move (color + vertex)
+     Fails:     invalid color, invalid vertex, occupied vertex
+     Returns:   Sorted space separated list of liberties
+      
+
+   * accurate_approxlib: Determine which liberties a stone of given
+     color will get if played at given vertex.
+     Arguments: move (color + vertex)
+     Fails:     invalid color, invalid vertex, occupied vertex
+     Returns:   Sorted space separated list of liberties
+
+     Supposedly identical in behavior to the above function and
+     can be retired when this is confirmed.
+      
+
+   * is_legal: Tell whether a move is legal.
+     Arguments: move
+     Fails:     invalid move
+     Returns:   1 if the move is legal, 0 if it is not.
+      
+
+   * all_legal: List all legal moves for either color.
+     Arguments: color
+     Fails:     invalid color
+     Returns:   Sorted space separated list of vertices.
+      
+
+   * captures: List the number of captures taken by either color.
+     Arguments: color
+     Fails:     invalid color
+     Returns:   Number of captures.
+      
+
+   * last_move: Return the last move.
+     Arguments: none
+     Fails:     no previous move known
+     Returns:   Color and vertex of last move.
+      
+
+   * move_history: Print the move history in reverse order
+     Arguments: none
+     Fails:     never
+     Returns:   List of moves played in reverse order in format:
+                color move (one move per line)
+      
+
+   * invariant_hash: Return the rotation/reflection invariant board
+     hash.
+     Arguments: none
+     Fails:     never
+     Returns:   Invariant hash for the board as a hexadecimal number.
+      
+
+   * invariant_hash_for_moves: Return the rotation/reflection invariant
+     board hash obtained by playing all the possible moves for the
+          given color.
+     Arguments: color
+     Fails:     invalid color
+     Returns:   List of moves + invariant hash as a hexadecimal number,
+                one pair of move + hash per line.
+      
+
+   * trymove: Play a stone of the given color at the given vertex.
+     Arguments: move (color + vertex)
+     Fails:     invalid color, invalid vertex, illegal move
+     Returns:   nothing
+      
+
+   * tryko: Play a stone of the given color at the given vertex,
+     allowing illegal ko capture.
+     Arguments: move (color + vertex)
+     Fails:     invalid color, invalid vertex, illegal move
+     Returns:   nothing
+      
+
+   * popgo: Undo a trymove or tryko.
+     Arguments: none
+     Fails:     stack empty
+     Returns:   nothing
+
+   * clear_cache: clear the caches.
+     Arguments: none.
+     Fails:     never.
+     Returns:   nothing.
+      
+
+   * attack: Try to attack a string.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code followed by attack point if attack code nonzero.
+      
+
+   * attack_either: Try to attack either of two strings
+     Arguments: two vertices
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code against the strings.  Guarantees there
+                exists a move which will attack one of the two
+                with attack_code, but does not return the move.
+      
+
+   * defend: Try to defend a string.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   defense code followed by defense point if defense code nonzero.
+      
+
+   * does_attack: Examine whether a specific move attacks a string
+     tactically.
+     Arguments: vertex (move), vertex (dragon)
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code
+      
+
+   * does_defend: Examine whether a specific move defends a string
+     tactically.
+     Arguments: vertex (move), vertex (dragon)
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code
+      
+
+   * ladder_attack: Try to attack a string strictly in a ladder.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code followed by attack point if attack code nonzero.
+      
+
+   * increase_depths: Increase depth values by one.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * decrease_depths: Decrease depth values by one.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * owl_attack: Try to attack a dragon.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code followed by attack point if attack code nonzero.
+      
+
+   * owl_defend: Try to defend a dragon.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   defense code followed by defense point if defense code nonzero.
+      
+
+   * owl_threaten_attack: Try to attack a dragon in 2 moves.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code followed by the two attack points if
+                attack code nonzero.
+      
+
+   * owl_threaten_defense: Try to defend a dragon with 2 moves.
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   defense code followed by the 2 defense points if
+                defense code nonzero.
+      
+
+   * owl_does_attack: Examine whether a specific move attacks a dragon.
+     Arguments: vertex (move), vertex (dragon)
+     Fails:     invalid vertex, empty vertex
+     Returns:   attack code
+      
+
+   * owl_does_defend: Examine whether a specific move defends a dragon.
+     Arguments: vertex (move), vertex (dragon)
+     Fails:     invalid vertex, empty vertex
+     Returns:   defense code
+      
+
+   * owl_connection_defends: Examine whether a connection defends
+     involved dragons.
+     Arguments: vertex (move), vertex (dragon1), vertex (dragon2)
+     Fails:     invalid vertex, empty vertex
+     Returns:   defense code
+      
+
+   * defend_both: Try to defend both of two strings
+     Arguments: two vertices
+     Fails:     invalid vertex, empty vertex
+     Returns:   defend code for the strings.  Guarantees there
+                exists a move which will defend both of the two
+                with defend_code, but does not return the move.
+      
+
+   * owl_substantial: Determine whether capturing a string gives a
+     living dragon
+     Arguments: vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   1 if dragon can live, 0 otherwise
+      
+
+   * analyze_semeai: Analyze a semeai
+     Arguments: dragona, dragonb
+     Fails:     invalid vertices, empty vertices
+     Returns:   semeai defense result, semeai attack result, semeai move
+      
+
+   * analyze_semeai_after_move: Analyze a semeai after a move have been
+     made.
+     Arguments: color, vertex, dragona, dragonb
+     Fails:     invalid vertices
+     Returns:   semeai defense result, semeai attack result, semeai move
+      
+
+   * tactical_analyze_semeai: Analyze a semeai, not using owl
+     Arguments: dragona, dragonb
+     Fails:     invalid vertices, empty vertices
+     Returns:   status of dragona, dragonb assuming dragona moves first
+      
+
+   * connect: Try to connect two strings.
+     Arguments: vertex, vertex
+     Fails:     invalid vertex, empty vertex, vertices of different colors
+     Returns:   connect result followed by connect point if successful.
+      
+
+   * disconnect: Try to disconnect two strings.
+     Arguments: vertex, vertex
+     Fails:     invalid vertex, empty vertex, vertices of different colors
+     Returns:   disconnect result followed by disconnect point if successful.
+      
+
+   * break_in: Try to break from string into area.
+     Arguments: vertex, vertices
+     Fails:     invalid vertex, empty vertex.
+     Returns:   result followed by break in point if successful.
+      
+
+   * block_off: Try to block string from area.
+     Arguments: vertex, vertices
+     Fails:     invalid vertex, empty vertex.
+     Returns:   result followed by block point if successful.
+
+   * eval_eye: Evaluate an eye space
+     Arguments: vertex
+     Fails:     invalid vertex
+     Returns:   Minimum and maximum number of eyes. If these differ an
+                attack and a defense point are additionally returned.
+                If the vertex is not an eye space or not of unique color,
+                a single -1 is returned.
+
+   * dragon_status: Determine status of a dragon.
+     Arguments: optional vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   status ("alive", "critical", "dead", or "unknown"),
+                attack point, defense point. Points of attack and
+                defense are only given if the status is critical.
+                If no vertex is given, the status is listed for all
+                dragons, one per row in the format "A4: alive".
+
+     FIXME: Should be able to distinguish between life in seki
+            and independent life. Should also be able to identify ko.
+
+   * same_dragon: Determine whether two stones belong to the same
+     dragon.
+     Arguments: vertex, vertex
+     Fails:     invalid vertex, empty vertex
+     Returns:   1 if the vertices belong to the same dragon, 0 otherwise
+
+   * unconditional_status: Determine the unconditional status of a
+     vertex.
+     Arguments: vertex
+     Fails:     invalid vertex
+     Returns:   unconditional status ("undecided", "alive", "dead",
+                "white_territory", "black_territory"). Occupied vertices can
+                be undecided, alive, or dead. Empty vertices can be
+                undecided, white territory, or black territory.
+
+   * combination_attack: Find a move by color capturing something
+     through a combination attack.
+     Arguments: color
+     Fails:     invalid color
+     Returns:   Recommended move, PASS if no move found
+
+   * combination_defend: If color can capture something through a
+     combination attack, list moves by the opponent of color
+     to defend against this attack.
+     Arguments: color
+     Fails:     invalid color
+     Returns:   Recommended moves, PASS if no combination attack found.
+
+   * aa_confirm_safety: Run atari_atari_confirm_safety().
+     Arguments: move, optional int
+     Fails:     invalid move
+     Returns:   success code, if failure also defending move
+      
+
+   * genmove_black: Generate and play the supposedly best black move.
+     Arguments: none
+     Fails:     never
+     Returns:   a move coordinate or "PASS"
+
+     Status:    Obsolete GTP version 1 command.
+      
+
+   * genmove_white: Generate and play the supposedly best white move.
+     Arguments: none
+     Fails:     never
+     Returns:   a move coordinate or "PASS"
+
+     Status:    Obsolete GTP version 1 command.
+      
+
+   * genmove: Generate and play the supposedly best move for either
+     color.
+     Arguments: color to move
+     Fails:     invalid color
+     Returns:   a move coordinate or "PASS" (or "resign" if resignation_allowed)
+
+     Status:    GTP version 2 standard command.
+      
+
+   * reg_genmove: Generate the supposedly best move for either color.
+     Arguments: color to move
+     Fails:     invalid color
+     Returns:   a move coordinate (or "PASS")
+
+     Status:    GTP version 2 standard command.
+      
+
+   * gg_genmove: Generate the supposedly best move for either color.
+     Arguments: color to move, optionally a random seed
+     Fails:     invalid color
+     Returns:   a move coordinate (or "PASS")
+
+     This differs from reg_genmove in the optional random seed.
+      
+
+   * restricted_genmove: Generate the supposedly best move for either
+     color from a choice of allowed vertices.
+     Arguments: color to move, allowed vertices
+     Fails:     invalid color, invalid vertex, no vertex listed
+     Returns:   a move coordinate (or "PASS")
+      
+
+   * kgs-genmove_cleanup: Generate and play the supposedly best move
+     for either color, not passing until all dead opponent stones have
+     been removed.
+     Arguments: color to move
+     Fails:     invalid color
+     Returns:   a move coordinate (or "PASS")
+
+     Status:    KGS specific command.
+
+     A similar command, but possibly somewhat different, will likely be added
+     to GTP version 3 at a later time.
+      
+
+   * level: Set the playing level.
+     Arguments: int
+     Fails:     incorrect argument
+     Returns:   nothing
+
+   * undo: Undo one move
+     Arguments: none
+     Fails:     If move history is too short.
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+
+   * gg-undo: Undo a number of moves
+     Arguments: optional int
+     Fails:     If move history is too short.
+     Returns:   nothing
+
+   * time_settings: Set time allowance
+     Arguments: int main_time, int byo_yomi_time, int byo_yomi_stones
+     Fails:     syntax error
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+
+   * time_left: Report remaining time
+     Arguments: color color, int time, int stones
+     Fails:     syntax error
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * final_score: Compute the score of a finished game.
+     Arguments: Optional random seed
+     Fails:     never
+     Returns:   Score in SGF format (RE property).
+
+     Status:    GTP version 2 standard command.
+      
+
+   * final_status: Report the final status of a vertex in a finished
+     game.
+     Arguments: Vertex, optional random seed
+     Fails:     invalid vertex
+     Returns:   Status in the form of one of the strings "alive", "dead",
+                "seki", "white_territory", "black_territory", or "dame".
+      
+
+   * final_status_list: Report vertices with a specific final status in
+     a finished game.
+     Arguments: Status in the form of one of the strings "alive", "dead",
+                "seki", "white_territory", "black_territory", or "dame".
+                An optional random seed can be added.
+     Fails:     missing or invalid status string
+     Returns:   Vertices having the specified status. These are split with
+                one string on each line if the vertices are nonempty (i.e.
+                for "alive", "dead", and "seki").
+
+     Status:    GTP version 2 standard command.
+                However, "dame", "white_territory", and "black_territory"
+                are private extensions.
+
+   * estimate_score: Estimate the score
+     Arguments: None
+     Fails:     never
+     Returns:   upper and lower bounds for the score
+
+   * experimental_score: Estimate the score, taking into account which
+     player moves next
+     Arguments: Color to play
+     Fails:     Invalid color
+     Returns:   Score.
+
+     This function generates a move for color, then adds the
+     value of the move generated to the value of the position.
+     Critical dragons are awarded to the opponent since the
+     value of rescuing a critical dragon is taken into account
+     in the value of the move generated.
+      
+
+   * reset_life_node_counter: Reset the count of life nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+
+     Note: This function is obsolete and only remains for backwards
+     compatibility.
+      
+
+   * get_life_node_counter: Retrieve the count of life nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   number of life nodes
+
+     Note: This function is obsolete and only remains for backwards
+     compatibility.
+      
+
+   * reset_owl_node_counter: Reset the count of owl nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * get_owl_node_counter: Retrieve the count of owl nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   number of owl nodes
+      
+
+   * reset_reading_node_counter: Reset the count of reading nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * get_reading_node_counter: Retrieve the count of reading nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   number of reading nodes
+      
+
+   * reset_trymove_counter: Reset the count of trymoves/trykos.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * get_trymove_counter: Retrieve the count of trymoves/trykos.
+     Arguments: none
+     Fails:     never
+     Returns:   number of trymoves/trykos
+      
+
+   * reset_connection_node_counter: Reset the count of connection nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * get_connection_node_counter: Retrieve the count of connection
+     nodes.
+     Arguments: none
+     Fails:     never
+     Returns:   number of connection nodes
+      
+
+   * test_eyeshape: Test an eyeshape for inconsistent evaluations
+     Arguments: Eyeshape vertices
+     Fails:     Bad vertices
+     Returns:   Failure reports on stderr.
+      
+
+   * analyze_eyegraph: Compute an eyevalue and vital points for an eye
+     graph
+     Arguments: Eyeshape encoded in string
+     Fails:     Bad eyeshape, analysis failed
+     Returns:   Eyevalue, vital points
+      
+
+   * cputime: Returns elapsed CPU time in seconds.
+     Arguments: none
+     Fails:     never
+     Returns:   Total elapsed (user + system) CPU time in seconds.
+      
+
+   * showboard: Write the position to stdout.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+
+     Status:    GTP version 2 standard command.
+      
+
+   * dump_stack: Dump stack to stderr.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * initial_influence: Return information about the initial influence
+     function.
+     Arguments: color to move, what information
+     Fails:     never
+     Returns:   Influence data formatted like:
+
+       0.51   1.34   3.20   6.60   9.09   8.06   1.96   0.00   0.00
+       0.45   1.65   4.92  12.19  17.47  15.92   4.03   0.00   0.00
+                       .
+                       .
+                       .
+       0.00   0.00   0.00   0.00   0.00 100.00  75.53  41.47  23.41
+
+     The available choices of information are:
+
+     white_influence (float)
+     black_influence (float)
+     white_strength (float)
+     black_strength (float)
+     white_attenuation (float)
+     black_attenuation (float)
+     white_permeability (float)
+     black_permeability (float)
+     territory_value (float)
+     influence_regions (int)
+     non_territory (int)
+
+     The encoding of influence_regions is as follows:
+      4 white stone
+      3 white territory
+      2 white moyo
+      1 white area
+      0 neutral
+     -1 black area
+     -2 black moyo
+     -3 black territory
+     -4 black stone
+      
+
+   * move_influence: Return information about the influence function
+     after a move.
+     Arguments: move, what information
+     Fails:     never
+     Returns:   Influence data formatted like for initial_influence.
+      
+
+   * move_probabilities: List probabilities of each move being played
+     (when non-zero). If no previous genmove command has been issued,
+     the result            of this command will be meaningless.
+     Arguments: none
+     Fails:     never
+     Returns:   Move, probabilty pairs, one per row.
+      
+
+   * move_uncertainty: Return the number of bits of uncertainty in the
+     move. If no previous genmove command has been issued, the result
+             of this command will be meaningless.
+     Arguments: none
+     Fails:     never
+     Returns:   bits of uncertainty
+      
+
+   * followup_influence: Return information about the followup
+     influence after a move.
+     Arguments: move, what information
+     Fails:     never
+     Returns:   Influence data formatted like for initial_influence.
+      
+
+   * worm_data: Return the information in the worm data structure.
+     Arguments: optional vertex
+     Fails:     never
+     Returns:   Worm data formatted like:
+
+     A19:
+     color           black
+     size            10
+     effective_size  17.83
+     origin          A19
+     liberties       8
+     liberties2      15
+     liberties3      10
+     liberties4      8
+     attack          PASS
+     attack_code     0
+     lunch           B19
+     defend          PASS
+     defend_code     0
+     cutstone        2
+     cutstone2       0
+     genus           0
+     inessential     0
+     B19:
+     color           white
+     .
+     .
+     .
+     inessential     0
+     C19:
+     ...
+
+     If an intersection is specified, only data for this one will be returned.
+      
+
+   * worm_stones: List the stones of a worm
+     Arguments: the location, "BLACK" or "WHITE"
+     Fails:     if called on an empty or off-board location
+     Returns:   list of stones
+      
+
+   * worm_cutstone: Return the cutstone field in the worm data
+     structure.
+     Arguments: non-empty vertex
+     Fails:     never
+     Returns:   cutstone
+      
+
+   * dragon_data: Return the information in the dragon data structure.
+     Arguments: optional intersection
+     Fails:     never
+     Returns:   Dragon data formatted in the corresponding way to worm_data.
+      
+
+   * dragon_stones: List the stones of a dragon
+     Arguments: the location
+     Fails:     if called on an empty or off-board location
+     Returns:   list of stones
+      
+
+   * eye_data: Return the information in the eye data structure.
+     Arguments: color, vertex
+     Fails:     never
+     Returns:   eye data fields and values, one pair per row
+      
+
+   * half_eye_data: Return the information in the half eye data
+     structure.
+     Arguments: vertex
+     Fails:     never
+     Returns:   half eye data fields and values, one pair per row
+      
+
+   * start_sgftrace: Start storing moves executed during reading in an
+     sgf tree in memory.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+
+     Warning: You had better know what you're doing if you try to use this
+              command.
+      
+
+   * finish_sgftrace: Finish storing moves in an sgf tree and write it
+     to file.
+     Arguments: filename
+     Fails:     never
+     Returns:   nothing
+
+     Warning: You had better know what you're doing if you try to use this
+              command.
+      
+
+   * printsgf: Dump the current position as a static sgf file to
+     filename, or as output if filename is missing or "-"
+     Arguments: optional filename
+     Fails:     never
+     Returns:   nothing if filename, otherwise the sgf
+      
+
+   * tune_move_ordering: Tune the parameters for the move ordering in
+     the tactical reading.
+     Arguments: MOVE_ORDERING_PARAMETERS integers
+     Fails:     incorrect arguments
+     Returns:   nothing
+      
+
+   * echo: Echo the parameter
+     Arguments: string
+     Fails:     never
+     Returns:   nothing
+      
+
+   * echo_err: Echo the parameter to stdout AND stderr
+     Arguments: string
+     Fails:     never
+     Returns:   nothing
+      
+
+   * help: List all known commands
+     Arguments: none
+     Fails:     never
+     Returns:   list of known commands, one per line
+
+     Status:    GTP version 2 standard command.
+      
+
+   * known_command: Tell whether a command is known.
+     Arguments: command name
+     Fails:     never
+     Returns:   "true" if command exists, "false" if not
+
+     Status:    GTP version 2 standard command.
+      
+
+   * report_uncertainty: Turn uncertainty reports from owl_attack and
+     owl_defend on or off.
+     Arguments: "on" or "off"
+     Fails:     invalid argument
+     Returns:   nothing
+      
+
+   * get_random_seed: Get the random seed
+     Arguments: none
+     Fails:     never
+     Returns:   random seed
+      
+
+   * set_random_seed: Set the random seed
+     Arguments: integer
+     Fails:     invalid data
+     Returns:   nothing
+      
+
+   * advance_random_seed: Advance the random seed by a number of games.
+     Arguments: integer
+     Fails:     invalid data
+     Returns:   New random seed.
+      
+
+   * is_surrounded: Determine if a dragon is surrounded
+     Arguments: vertex (dragon)
+     Fails:     invalid vertex, empty vertex
+     Returns:   1 if surrounded, 2 if weakly surrounded, 0 if not
+      
+
+   * does_surround: Determine if a move surrounds a dragon
+     Arguments: vertex (move), vertex (dragon)
+     Fails:     invalid vertex, empty (dragon, nonempty (move)
+     Returns:   1 if (move) surrounds (dragon)
+
+   * surround_map: Report the surround map for dragon at a vertex
+     Arguments: vertex (dragon), vertex (mapped location)
+     Fails:     invalid vertex, empty dragon
+     Returns:   value of surround map at (mapped location), or -1 if
+                dragon not surrounded.
+      
+
+   * set_search_diamond: limit search, and establish a search diamond
+     Arguments: pos
+     Fails:     invalid value
+     Returns:   nothing
+      
+
+   * reset_search_mask: unmark the entire board for limited search
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+      
+
+   * limit_search: sets the global variable limit_search
+     Arguments: value
+     Fails:     invalid arguments
+     Returns:   nothing
+      
+
+   * set_search_limit: mark a vertex for limited search
+     Arguments: position
+     Fails:     invalid arguments
+     Returns:   nothing
+      
+
+   * draw_search_area: Draw search area. Writes to stderr.
+     Arguments: none
+     Fails:     never
+     Returns:   nothing
+
+\1f
+File: gnugo.info,  Node: Regression,  Next: Copying,  Prev: GTP,  Up: Top
+
+20 Regression testing
+*********************
+
+The standard purpose of regression testing is to avoid getting the same
+bug twice. When a bug is found, the programmer fixes the bug and adds a
+test to the test suite. The test should fail before the fix and pass
+after the fix. When a new version is about to be released, all the tests
+in the regression test suite are run and if an old bug reappears, this
+will be seen quickly since the appropriate test will fail.
+
+   The regression testing in GNU Go is slightly different. A typical
+test case involves specifying a position and asking the engine what
+move it would make. This is compared to one or more correct moves to
+decide whether the test case passes or fails. It is also stored whether
+a test case is expected to pass or fail, and deviations in this status
+signify whether a change has solved some problem and/or broken something
+else. Thus the regression tests both include positions highlighting some
+mistake being done by the engine, which are waiting to be fixed, and
+positions where the engine does the right thing, where we want to detect
+if a change breaks something.
+
+* Menu:
+
+* Regression Testing::          Regression Testing in GNU Go
+* Test Suites::                 Test Suites
+* Running the Regressions::     Running the Regression Tests
+* Running regress.pike::        Running regress.pike
+* Viewing with Emacs::          Viewing tests with Emacs
+* HTML Views::                  HTML Views
+
+\1f
+File: gnugo.info,  Node: Regression Testing,  Next: Test Suites,  Up: Regression
+
+20.1 Regression testing in GNU Go
+=================================
+
+Regression testing is performed by the files in the `regression/'
+directory. The tests are specified as GTP commands in files with the
+suffix `.tst', with corresponding correct results and expected
+pass/fail status encoded in GTP comments following the test. To run a
+test suite the shell scripts `test.sh', `eval.sh', and `regress.sh' can
+be used. There are also Makefile targets to do this. If you `make
+all_batches' most of the tests are run. The Pike script `regress.pike'
+can also be used to run all tests or a subset of the tests.
+
+   Game records used by the regression tests are stored in the
+directory `regression/games/' and its subdirectories.
+
+\1f
+File: gnugo.info,  Node: Test Suites,  Next: Running the Regressions,  Prev: Regression Testing,  Up: Regression
+
+20.2 Test suites
+================
+
+The regression tests are grouped into suites and stored in files as GTP
+commands. A part of a test suite can look as follows:
+     # Connecting with ko at B14 looks best. Cutting at D17 might be
+     # considered. B17 (game move) is inferior.
+     loadsgf games/strategy25.sgf 61
+     90 gg_genmove black
+     #? [B14|D17]
+
+     # The game move at P13 is a suicidal blunder.
+     loadsgf games/strategy25.sgf 249
+     95 gg_genmove black
+     #? [!P13]
+
+     loadsgf games/strategy26.sgf 257
+     100 gg_genmove black
+     #? [M16]*
+
+   Lines starting with a hash sign, or in general anything following a
+hash sign, are interpreted as comments by the GTP mode and thus ignored
+by the engine. GTP commands are executed in the order they appear, but
+only those on numbered lines are used for testing. The comment lines
+starting with `#?' are magical to the regression testing scripts and
+indicate correct results and expected pass/fail status. The string
+within brackets is matched as a regular expression against the response
+from the previous numbered GTP command. A particular useful feature of
+regular expressions is that by using `|' it is possible to specify
+alternatives. Thus `B14|D17' above means that if either `B14' or `D17'
+is the move generated in test case 90, it passes. There is one
+important special case to be aware of. If the correct result string
+starts with an exclamation mark, this is excluded from the regular
+expression but afterwards the result of the matching is negated. Thus
+`!P13' in test case 95 means that any move except `P13' is accepted as
+a correct result.
+
+   In test case 100, the brackets on the `#?' line is followed by an
+asterisk. This means that the test is expected to fail. If there is no
+asterisk, the test is expected to pass. The brackets may also be
+followed by a `&', meaning that the result is ignored. This is
+primarily used to report statistics, e.g. how many tactical reading
+nodes were spent while running the test suite.
+
+\1f
+File: gnugo.info,  Node: Running the Regressions,  Next: Running regress.pike,  Prev: Test Suites,  Up: Regression
+
+20.3 Running the Regression Tests
+=================================
+
+`./test.sh blunder.tst' runs the tests in `blunder.tst' and prints the
+results of the commands on numbered lines, which may look like:
+
+     1 E5
+     2 F9
+     3 O18
+     4 B7
+     5 A4
+     6 E4
+     7 E3
+     8 A3
+     9 D9
+     10 J9
+     11 B3
+     12 C6
+     13 C6
+
+   This is usually not very informative, however. More interesting is
+`./eval.sh blunder.tst' which also compares the results above against
+the correct ones in the test file and prints a report for each test on
+the form:
+
+     1 failed: Correct '!E5', got 'E5'
+     2 failed: Correct 'C9|H9', got 'F9'
+     3 PASSED
+     4 failed: Correct 'B5|C5|C4|D4|E4|E3|F3', got 'B7'
+     5 PASSED
+     6 failed: Correct 'D4', got 'E4'
+     7 PASSED
+     8 failed: Correct 'B4', got 'A3'
+     9 failed: Correct 'G8|G9|H8', got 'D9'
+     10 failed: Correct 'G9|F9|C7', got 'J9'
+     11 failed: Correct 'D4|E4|E5|F4|C6', got 'B3'
+     12 failed: Correct 'D4', got 'C6'
+     13 failed: Correct 'D4|E4|E5|F4', got 'C6'
+
+   The result of a test can be one of four different cases:
+
+   * `passed': An expected pass
+
+     This is the ideal result.
+
+   * `PASSED': An unexpected pass
+
+     This is a result that we are hoping for when we fix a bug. An old
+     test case that used to fail is now passing.
+
+   * `failed': An expected failure
+
+     The test failed but this was also what we expected, unless we were
+     trying to fix the particular mistake highlighted by the test case.
+     These tests show weaknesses of the GNU Go engine and are good
+     places to search if you want to detect an area which needs
+     improvement.
+
+   * `FAILED': An unexpected failure
+
+     This should nominally only happen if something is broken by a
+     change. However, sometimes GNU Go passes a test, but for the wrong
+     reason or for a combination of wrong reasons.  When one of these
+     reasons is fixed, the other one may shine through so that the test
+     suddenly fails. When a test case unexpectedly fails, it is
+     necessary to make a closer examination in order to determine
+     whether a change has broken something.
+
+
+   If you want a less verbose report, `./regress.sh . blunder.tst' does
+the same thing as the previous command, but only reports unexpected
+results. The example above is compressed to
+
+     3 unexpected PASS!
+     5 unexpected PASS!
+     7 unexpected PASS!
+
+   For convenience the tests are also available as makefile targets. For
+example, `make blunder' runs the tests in the blunder test suite by
+executing `eval.sh blunder.tst'. `make all_batches' runs all test
+suites in a sequence using the `regress.sh' script.
+
+\1f
+File: gnugo.info,  Node: Running regress.pike,  Next: Viewing with Emacs,  Prev: Running the Regressions,  Up: Regression
+
+20.4 Running regress.pike
+=========================
+
+A more powerful way to run regressions is with the script
+`regress.pike'. This requires that you have Pike
+(`http://pike.ida.liu.se') installed.
+
+   Executing `./regress.pike' without arguments will run all testsuites
+that `make all_batches' would run. The difference is that unexpected
+results are reported immediately when they have been found (instead of
+after the whole file has been run) and that statistics of time
+consumption and node usage is presented for each test file and in total.
+
+   To run a single test suite do e.g. `./regress.pike nicklas3.tst' or
+`./regress.pike nicklas3'. The result may look like:
+     nicklas3                                 2.96    614772    3322      469
+     Total nodes: 614772 3322 469
+     Total time: 2.96 (3.22)
+     Total uncertainty: 0.00
+   The numbers here mean that the test suite took 2.96 seconds of
+processor time and 3.22 seconds of real time. The consumption of
+reading nodes was 614772 for tactical reading, 3322 for owl reading,
+and 469 for connection reading. The last line relates to the
+variability of the generated moves in the test suite, and 0 means that
+none was decided by the randomness contribution to the move valuation.
+Multiple testsuites can be run by e.g. `./regress.pike owl ld_owl owl1'.
+
+   It is also possible to run a single testcase, e.g. `./regress.pike
+strategy:6', a number of testcases, e.g. `./regress.pike
+strategy:6,23,45', a range of testcases, e.g. `./regress.pike
+strategy:13-15' or more complex combinations e.g. `./regress.pike
+strategy:6,13-15,23,45 nicklas3:602,1403'.
+
+   There are also command line options to choose what engine to run,
+what options to send to the engine, to turn on verbose output, and to
+use a file to specify which testcases to run. Run `./regress.pike
+--help' for a complete and up to date list of options.
+
+\1f
+File: gnugo.info,  Node: Viewing with Emacs,  Next: HTML Views,  Prev: Running regress.pike,  Up: Regression
+
+20.5 Viewing tests with Emacs
+=============================
+
+To get a quick regression view, you may use the graphical display mode
+available with Emacs (*note Emacs::). You will want the cursor in the
+regression buffer when you enter `M-x gnugo', so that GNU Go opens in
+the correct directory. A good way to be in the right directory is to
+open the window of the test you want to investigate. Then you can cut
+and past GTP commands directly from the test to the minibuffer, using
+the `:' command from Emacs. Although Emacs mode does not have a
+coordinate grid, you may get an ascii board with the coordinate grid
+using `: showboard' command.
+
+\1f
+File: gnugo.info,  Node: HTML Views,  Prev: Viewing with Emacs,  Up: Regression
+
+20.6 HTML Regression Views
+==========================
+
+Extremely useful HTML Views of the regression tests may be produced
+using two perl scripts `regression/regress.pl' and
+`regression/regress.plx'.
+
+  1. The driver program (regress.pl) which:
+        * Runs the regression tests, invoking GNU Go.
+
+        * Captures the trace output, board position, and pass/fail
+          status, sgf output, and dragon status information.
+
+  2. The interface to view the captured output (regress.plx) which:
+        * Never invokes GNU Go.
+
+        * Displays the captured output in helpful formats (i.e. HTML).
+
+20.6.1 Setting up the HTML regression Views
+-------------------------------------------
+
+There are many ways configuring Apache to permit CGI scripts, all of
+them are featured in Apache documentation, which can be found at
+`http://httpd.apache.org/docs/2.0/howto/cgi.html'
+
+   Below you will find one example.
+
+   This documentation assumes an Apache 2.0 included in Fedora Core
+distribution, but it should be fairly close to the config for other
+distributions.
+
+   First, you will need to configure Apache to run CGI scripts in the
+directory you wish to serve the html views from. In
+`/etc/httpd/conf/httpd.conf' there should be a line:
+
+   `DocumentRoot "/var/www/html"'
+
+   Search for a line `<Directory "/path/to/directory">', where
+`/path/to/directory' is the same as provided in `DocumentRoot', then
+add `ExecCGI' to list of `Options'.  The whole section should look like:
+
+     <Directory "/var/www/html">
+     ...
+         Options ... ExecCGI
+     ...
+     </Directory>
+
+   This allows CGI scripts to be executed in the directory used by
+regress.plx.  Next, you need to tell Apache that `.plx' is a CGI script
+ending. Your `httpd.conf' file should contain a line:
+
+   `AddHandler cgi-script ...'
+
+   If there isn't already, add it; add `.plx' to the list of extensions,
+so line should look like:
+
+   `AddHandler cgi-script ... .plx'
+
+   You will also need to make sure you have the necessary modules
+loaded to run CGI scripts; mod_cgi and mod_mime should be sufficient.
+Your `httpd.conf' should have the relevant `LoadModule cgi_module
+modules/mod_cgi.so' and `LoadModule mime_module modules/mod_mime.so'
+lines; uncomment them if necessary.
+
+   Next, you need to put a copy of `regress.plx' in the `DocumentRoot'
+directory `/var/www/html' or it subdirectories where you plan to serve
+the html views from.
+
+   You will also need to install the Perl module GD
+(`http://search.cpan.org/dist/GD/'), available from CPAN.
+
+   Finally, run `regression/regress.pl' to create the xml data used to
+generate the html views (to do all regression tests run
+`regression/regress.pl -a 1'); then, copy the `html/' directory to the
+same directory as `regress.plx' resides in.
+
+   At this point, you should have a working copy of the html regression
+views.
+
+   Additional notes for Debian users: The Perl GD module can be
+installed by `apt-get install libgd-perl'. It may suffice to add this to
+the apache2 configuration:
+
+     <Directory "/var/www/regression">
+       Options +ExecCGI
+       AddHandler cgi-script .plx
+       RedirectMatch ^/regression$ /regression/regress.plx
+     </Directory>
+
+   and then make a link from `/var/www/regression' to the GNU Go
+regression directory. The `RedirectMatch' statement is only needed to
+set up a shorter entry URL.
+
+\1f
+File: gnugo.info,  Node: Copying,  Next: Concept Index,  Prev: Regression,  Up: Top
+
+Appendix A Copying
+******************
+
+The program GNU Go is distributed under the terms of the GNU General
+Public License (GPL). Its documentation is distributed under the terms
+of the GNU Free Documentation License (GFDL).
+
+* Menu:
+
+* GPL::            The GNU General Public License
+* GFDL::           The GNU Free Documentation License
+* GTP License::    The Go Text Protocol License
+
+\1f
+File: gnugo.info,  Node: GPL,  Next: GFDL,  Prev: Copying,  Up: Copying
+
+A.1 GNU GENERAL PUBLIC LICENSE
+==============================
+
+                        Version 3, 29 June 2007
+
+     Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+Preamble
+========
+
+The GNU General Public License is a free, copyleft license for software
+and other kinds of works.
+
+   The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program-to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+   When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+   To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+   For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+   Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+   For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+   Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+   Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+   The precise terms and conditions for copying, distribution and
+modification follow.
+
+                         TERMS AND CONDITIONS
+  0. DEFINITIONS
+
+     "This License" refers to version 3 of the GNU General Public
+     License.
+
+     "Copyright" also means copyright-like laws that apply to other
+     kinds of works, such as semiconductor masks.
+
+     "The Program" refers to any copyrightable work licensed under this
+     License.  Each licensee is addressed as "you".  "Licensees" and
+     "recipients" may be individuals or organizations.
+
+     To "modify" a work means to copy from or adapt all or part of the
+     work in a fashion requiring copyright permission, other than the
+     making of an exact copy.  The resulting work is called a "modified
+     version" of the earlier work or a work "based on" the earlier work.
+
+     A "covered work" means either the unmodified Program or a work
+     based on the Program.
+
+     To "propagate" a work means to do anything with it that, without
+     permission, would make you directly or secondarily liable for
+     infringement under applicable copyright law, except executing it
+     on a computer or modifying a private copy.  Propagation includes
+     copying, distribution (with or without modification), making
+     available to the public, and in some countries other activities as
+     well.
+
+     To "convey" a work means any kind of propagation that enables other
+     parties to make or receive copies.  Mere interaction with a user
+     through a computer network, with no transfer of a copy, is not
+     conveying.
+
+     An interactive user interface displays "Appropriate Legal Notices"
+     to the extent that it includes a convenient and prominently visible
+     feature that (1) displays an appropriate copyright notice, and (2)
+     tells the user that there is no warranty for the work (except to
+     the extent that warranties are provided), that licensees may
+     convey the work under this License, and how to view a copy of this
+     License.  If the interface presents a list of user commands or
+     options, such as a menu, a prominent item in the list meets this
+     criterion.
+
+
+  1. SOURCE CODE
+
+     The "source code" for a work means the preferred form of the work
+     for making modifications to it.  "Object code" means any non-source
+     form of a work.
+
+     A "Standard Interface" means an interface that either is an
+     official standard defined by a recognized standards body, or, in
+     the case of interfaces specified for a particular programming
+     language, one that is widely used among developers working in that
+     language.
+
+     The "System Libraries" of an executable work include anything,
+     other than the work as a whole, that (a) is included in the normal
+     form of packaging a Major Component, but which is not part of that
+     Major Component, and (b) serves only to enable use of the work
+     with that Major Component, or to implement a Standard Interface
+     for which an implementation is available to the public in source
+     code form.  A "Major Component", in this context, means a major
+     essential component (kernel, window system, and so on) of the
+     specific operating system (if any) on which the executable work
+     runs, or a compiler used to produce the work, or an object code
+     interpreter used to run it.
+
+     The "Corresponding Source" for a work in object code form means all
+     the source code needed to generate, install, and (for an executable
+     work) run the object code and to modify the work, including
+     scripts to control those activities.  However, it does not include
+     the work's System Libraries, or general-purpose tools or generally
+     available free programs which are used unmodified in performing
+     those activities but which are not part of the work.  For example,
+     Corresponding Source includes interface definition files
+     associated with source files for the work, and the source code for
+     shared libraries and dynamically linked subprograms that the work
+     is specifically designed to require, such as by intimate data
+     communication or control flow between those subprograms and other
+     parts of the work.
+
+     The Corresponding Source need not include anything that users can
+     regenerate automatically from other parts of the Corresponding
+     Source.
+
+     The Corresponding Source for a work in source code form is that
+     same work.
+
+
+  2. BASIC PERMISSIONS
+
+     All rights granted under this License are granted for the term of
+     copyright on the Program, and are irrevocable provided the stated
+     conditions are met.  This License explicitly affirms your unlimited
+     permission to run the unmodified Program.  The output from running
+     a covered work is covered by this License only if the output,
+     given its content, constitutes a covered work.  This License
+     acknowledges your rights of fair use or other equivalent, as
+     provided by copyright law.
+
+     You may make, run and propagate covered works that you do not
+     convey, without conditions so long as your license otherwise
+     remains in force.  You may convey covered works to others for the
+     sole purpose of having them make modifications exclusively for
+     you, or provide you with facilities for running those works,
+     provided that you comply with the terms of this License in
+     conveying all material for which you do not control copyright.
+     Those thus making or running the covered works for you must do so
+     exclusively on your behalf, under your direction and control, on
+     terms that prohibit them from making any copies of your
+     copyrighted material outside their relationship with you.
+
+     Conveying under any other circumstances is permitted solely under
+     the conditions stated below.  Sublicensing is not allowed; section
+     10 makes it unnecessary.
+
+
+  3. PROTECTING USERS' LEGAL RIGHTS FROM ANTI-CIRCUMVENTION LAW
+
+     No covered work shall be deemed part of an effective technological
+     measure under any applicable law fulfilling obligations under
+     article 11 of the WIPO copyright treaty adopted on 20 December
+     1996, or similar laws prohibiting or restricting circumvention of
+     such measures.
+
+     When you convey a covered work, you waive any legal power to forbid
+     circumvention of technological measures to the extent such
+     circumvention is effected by exercising rights under this License
+     with respect to the covered work, and you disclaim any intention
+     to limit operation or modification of the work as a means of
+     enforcing, against the work's users, your or third parties' legal
+     rights to forbid circumvention of technological measures.
+
+
+  4. CONVEYING VERBATIM COPIES
+
+     You may convey verbatim copies of the Program's source code as you
+     receive it, in any medium, provided that you conspicuously and
+     appropriately publish on each copy an appropriate copyright notice;
+     keep intact all notices stating that this License and any
+     non-permissive terms added in accord with section 7 apply to the
+     code; keep intact all notices of the absence of any warranty; and
+     give all recipients a copy of this License along with the Program.
+
+     You may charge any price or no price for each copy that you convey,
+     and you may offer support or warranty protection for a fee.
+
+
+  5. CONVEYING MODIFIED SOURCE VERSIONS
+
+     You may convey a work based on the Program, or the modifications to
+     produce it from the Program, in the form of source code under the
+     terms of section 4, provided that you also meet all of these
+     conditions:
+
+     a) The work must carry prominent notices stating that you modified
+        it, and giving a relevant date.
+
+     b) The work must carry prominent notices stating that it is
+     released under this License and any conditions added under section
+        7.  This requirement modifies the requirement in section 4 to
+      "keep intact all notices".
+
+     c) You must license the entire work, as a whole, under this
+     License to anyone who comes into possession of a copy.  This
+     License will therefore apply, along with any applicable section 7
+       additional terms, to the whole of the work, and all its parts,
+      regardless of how they are packaged.  This License gives no
+     permission to license the work in any other way, but it does not
+      invalidate such permission if you have separately received it.
+
+     d) If the work has interactive user interfaces, each must display
+       Appropriate Legal Notices; however, if the Program has
+     interactive     interfaces that do not display Appropriate Legal
+     Notices, your     work need not make them do so.
+
+     A compilation of a covered work with other separate and independent
+     works, which are not by their nature extensions of the covered
+     work, and which are not combined with it such as to form a larger
+     program, in or on a volume of a storage or distribution medium, is
+     called an "aggregate" if the compilation and its resulting
+     copyright are not used to limit the access or legal rights of the
+     compilation's users beyond what the individual works permit.
+     Inclusion of a covered work in an aggregate does not cause this
+     License to apply to the other parts of the aggregate.
+
+
+  6. CONVEYING NON-SOURCE FORMS
+
+     You may convey a covered work in object code form under the terms
+     of sections 4 and 5, provided that you also convey the
+     machine-readable Corresponding Source under the terms of this
+     License, in one of these ways:
+
+     a) Convey the object code in, or embodied in, a physical product
+      (including a physical distribution medium), accompanied by the
+     Corresponding Source fixed on a durable physical medium
+     customarily used for software interchange.
+
+     b) Convey the object code in, or embodied in, a physical product
+      (including a physical distribution medium), accompanied by a
+     written offer, valid for at least three years and valid for as
+     long as you offer spare parts or customer support for that product
+        model, to give anyone who possesses the object code either (1) a
+        copy of the Corresponding Source for all the software in the
+     product that is covered by this License, on a durable physical
+     medium customarily used for software interchange, for a price no
+      more than your reasonable cost of physically performing this
+     conveying of source, or (2) access to copy the     Corresponding
+     Source from a network server at no charge.
+
+     c) Convey individual copies of the object code with a copy of the
+       written offer to provide the Corresponding Source.  This
+     alternative is allowed only occasionally and noncommercially, and
+       only if you received the object code with such an offer, in
+     accord     with subsection 6b.
+
+     d) Convey the object code by offering access from a designated
+     place (gratis or for a charge), and offer equivalent access to the
+        Corresponding Source in the same way through the same place at
+     no     further charge.  You need not require recipients to copy the
+        Corresponding Source along with the object code.  If the place
+     to     copy the object code is a network server, the Corresponding
+     Source     may be on a different server (operated by you or a
+     third party)     that supports equivalent copying facilities,
+     provided you maintain     clear directions next to the object code
+     saying where to find the     Corresponding Source.  Regardless of
+     what server hosts the     Corresponding Source, you remain
+     obligated to ensure that it is     available for as long as needed
+     to satisfy these requirements.
+
+     e) Convey the object code using peer-to-peer transmission, provided
+        you inform other peers where the object code and Corresponding
+       Source of the work are being offered to the general public at no
+        charge under subsection 6d.
+
+     A separable portion of the object code, whose source code is
+     excluded from the Corresponding Source as a System Library, need
+     not be included in conveying the object code work.
+
+     A "User Product" is either (1) a "consumer product", which means
+     any tangible personal property which is normally used for
+     personal, family, or household purposes, or (2) anything designed
+     or sold for incorporation into a dwelling.  In determining whether
+     a product is a consumer product, doubtful cases shall be resolved
+     in favor of coverage.  For a particular product received by a
+     particular user, "normally used" refers to a typical or common use
+     of that class of product, regardless of the status of the
+     particular user or of the way in which the particular user
+     actually uses, or expects or is expected to use, the product.  A
+     product is a consumer product regardless of whether the product
+     has substantial commercial, industrial or non-consumer uses,
+     unless such uses represent the only significant mode of use of the
+     product.
+
+     "Installation Information" for a User Product means any methods,
+     procedures, authorization keys, or other information required to
+     install and execute modified versions of a covered work in that
+     User Product from a modified version of its Corresponding Source.
+     The information must suffice to ensure that the continued
+     functioning of the modified object code is in no case prevented or
+     interfered with solely because modification has been made.
+
+     If you convey an object code work under this section in, or with,
+     or specifically for use in, a User Product, and the conveying
+     occurs as part of a transaction in which the right of possession
+     and use of the User Product is transferred to the recipient in
+     perpetuity or for a fixed term (regardless of how the transaction
+     is characterized), the Corresponding Source conveyed under this
+     section must be accompanied by the Installation Information.  But
+     this requirement does not apply if neither you nor any third party
+     retains the ability to install modified object code on the User
+     Product (for example, the work has been installed in ROM).
+
+     The requirement to provide Installation Information does not
+     include a requirement to continue to provide support service,
+     warranty, or updates for a work that has been modified or
+     installed by the recipient, or for the User Product in which it
+     has been modified or installed.  Access to a network may be denied
+     when the modification itself materially and adversely affects the
+     operation of the network or violates the rules and protocols for
+     communication across the network.
+
+     Corresponding Source conveyed, and Installation Information
+     provided, in accord with this section must be in a format that is
+     publicly documented (and with an implementation available to the
+     public in source code form), and must require no special password
+     or key for unpacking, reading or copying.
+
+
+  7. ADDITIONAL TERMS
+
+     "Additional permissions" are terms that supplement the terms of
+     this License by making exceptions from one or more of its
+     conditions.  Additional permissions that are applicable to the
+     entire Program shall be treated as though they were included in
+     this License, to the extent that they are valid under applicable
+     law.  If additional permissions apply only to part of the Program,
+     that part may be used separately under those permissions, but the
+     entire Program remains governed by this License without regard to
+     the additional permissions.
+
+     When you convey a copy of a covered work, you may at your option
+     remove any additional permissions from that copy, or from any part
+     of it.  (Additional permissions may be written to require their own
+     removal in certain cases when you modify the work.)  You may place
+     additional permissions on material, added by you to a covered work,
+     for which you have or can give appropriate copyright permission.
+
+     Notwithstanding any other provision of this License, for material
+     you add to a covered work, you may (if authorized by the copyright
+     holders of that material) supplement the terms of this License
+     with terms:
+
+     a) Disclaiming warranty or limiting liability differently from the
+        terms of sections 15 and 16 of this License; or
+
+     b) Requiring preservation of specified reasonable legal notices or
+        author attributions in that material or in the Appropriate Legal
+        Notices displayed by works containing it; or
+
+     c) Prohibiting misrepresentation of the origin of that material, or
+        requiring that modified versions of such material be marked in
+       reasonable ways as different from the original version; or
+
+     d) Limiting the use for publicity purposes of names of licensors or
+        authors of the material; or
+
+     e) Declining to grant rights under trademark law for use of some
+      trade names, trademarks, or service marks; or
+
+     f) Requiring indemnification of licensors and authors of that
+     material by anyone who conveys the material (or modified versions
+     of     it) with contractual assumptions of liability to the
+     recipient, for     any liability that these contractual
+     assumptions directly impose on     those licensors and authors.
+
+     All other non-permissive additional terms are considered "further
+     restrictions" within the meaning of section 10.  If the Program as
+     you received it, or any part of it, contains a notice stating that
+     it is governed by this License along with a term that is a further
+     restriction, you may remove that term.  If a license document
+     contains a further restriction but permits relicensing or
+     conveying under this License, you may add to a covered work
+     material governed by the terms of that license document, provided
+     that the further restriction does not survive such relicensing or
+     conveying.
+
+     If you add terms to a covered work in accord with this section, you
+     must place, in the relevant source files, a statement of the
+     additional terms that apply to those files, or a notice indicating
+     where to find the applicable terms.
+
+     Additional terms, permissive or non-permissive, may be stated in
+     the form of a separately written license, or stated as exceptions;
+     the above requirements apply either way.
+
+
+  8. TERMINATION
+
+     You may not propagate or modify a covered work except as expressly
+     provided under this License.  Any attempt otherwise to propagate or
+     modify it is void, and will automatically terminate your rights
+     under this License (including any patent licenses granted under
+     the third paragraph of section 11).
+
+     However, if you cease all violation of this License, then your
+     license from a particular copyright holder is reinstated (a)
+     provisionally, unless and until the copyright holder explicitly and
+     finally terminates your license, and (b) permanently, if the
+     copyright holder fails to notify you of the violation by some
+     reasonable means prior to 60 days after the cessation.
+
+     Moreover, your license from a particular copyright holder is
+     reinstated permanently if the copyright holder notifies you of the
+     violation by some reasonable means, this is the first time you have
+     received notice of violation of this License (for any work) from
+     that copyright holder, and you cure the violation prior to 30 days
+     after your receipt of the notice.
+
+     Termination of your rights under this section does not terminate
+     the licenses of parties who have received copies or rights from
+     you under this License.  If your rights have been terminated and
+     not permanently reinstated, you do not qualify to receive new
+     licenses for the same material under section 10.
+
+
+  9. ACCEPTANCE NOT REQUIRED FOR HAVING COPIES
+
+     You are not required to accept this License in order to receive or
+     run a copy of the Program.  Ancillary propagation of a covered work
+     occurring solely as a consequence of using peer-to-peer
+     transmission to receive a copy likewise does not require
+     acceptance.  However, nothing other than this License grants you
+     permission to propagate or modify any covered work.  These actions
+     infringe copyright if you do not accept this License.  Therefore,
+     by modifying or propagating a covered work, you indicate your
+     acceptance of this License to do so.
+
+
+ 10. AUTOMATIC LICENSING OF DOWNSTREAM RECIPIENTS
+
+     Each time you convey a covered work, the recipient automatically
+     receives a license from the original licensors, to run, modify and
+     propagate that work, subject to this License.  You are not
+     responsible for enforcing compliance by third parties with this
+     License.
+
+     An "entity transaction" is a transaction transferring control of an
+     organization, or substantially all assets of one, or subdividing an
+     organization, or merging organizations.  If propagation of a
+     covered work results from an entity transaction, each party to that
+     transaction who receives a copy of the work also receives whatever
+     licenses to the work the party's predecessor in interest had or
+     could give under the previous paragraph, plus a right to
+     possession of the Corresponding Source of the work from the
+     predecessor in interest, if the predecessor has it or can get it
+     with reasonable efforts.
+
+     You may not impose any further restrictions on the exercise of the
+     rights granted or affirmed under this License.  For example, you
+     may not impose a license fee, royalty, or other charge for
+     exercise of rights granted under this License, and you may not
+     initiate litigation (including a cross-claim or counterclaim in a
+     lawsuit) alleging that any patent claim is infringed by making,
+     using, selling, offering for sale, or importing the Program or any
+     portion of it.
+
+
+ 11. PATENTS
+
+     A "contributor" is a copyright holder who authorizes use under this
+     License of the Program or a work on which the Program is based.
+     The work thus licensed is called the contributor's "contributor
+     version".
+
+     A contributor's "essential patent claims" are all patent claims
+     owned or controlled by the contributor, whether already acquired or
+     hereafter acquired, that would be infringed by some manner,
+     permitted by this License, of making, using, or selling its
+     contributor version, but do not include claims that would be
+     infringed only as a consequence of further modification of the
+     contributor version.  For purposes of this definition, "control"
+     includes the right to grant patent sublicenses in a manner
+     consistent with the requirements of this License.
+
+     Each contributor grants you a non-exclusive, worldwide,
+     royalty-free patent license under the contributor's essential
+     patent claims, to make, use, sell, offer for sale, import and
+     otherwise run, modify and propagate the contents of its
+     contributor version.
+
+     In the following three paragraphs, a "patent license" is any
+     express agreement or commitment, however denominated, not to
+     enforce a patent (such as an express permission to practice a
+     patent or covenant not to sue for patent infringement).  To
+     "grant" such a patent license to a party means to make such an
+     agreement or commitment not to enforce a patent against the party.
+
+     If you convey a covered work, knowingly relying on a patent
+     license, and the Corresponding Source of the work is not available
+     for anyone to copy, free of charge and under the terms of this
+     License, through a publicly available network server or other
+     readily accessible means, then you must either (1) cause the
+     Corresponding Source to be so available, or (2) arrange to deprive
+     yourself of the benefit of the patent license for this particular
+     work, or (3) arrange, in a manner consistent with the requirements
+     of this License, to extend the patent license to downstream
+     recipients.  "Knowingly relying" means you have actual knowledge
+     that, but for the patent license, your conveying the covered work
+     in a country, or your recipient's use of the covered work in a
+     country, would infringe one or more identifiable patents in that
+     country that you have reason to believe are valid.
+
+     If, pursuant to or in connection with a single transaction or
+     arrangement, you convey, or propagate by procuring conveyance of, a
+     covered work, and grant a patent license to some of the parties
+     receiving the covered work authorizing them to use, propagate,
+     modify or convey a specific copy of the covered work, then the
+     patent license you grant is automatically extended to all
+     recipients of the covered work and works based on it.
+
+     A patent license is "discriminatory" if it does not include within
+     the scope of its coverage, prohibits the exercise of, or is
+     conditioned on the non-exercise of one or more of the rights that
+     are specifically granted under this License.  You may not convey a
+     covered work if you are a party to an arrangement with a third
+     party that is in the business of distributing software, under
+     which you make payment to the third party based on the extent of
+     your activity of conveying the work, and under which the third
+     party grants, to any of the parties who would receive the covered
+     work from you, a discriminatory patent license (a) in connection
+     with copies of the covered work conveyed by you (or copies made
+     from those copies), or (b) primarily for and in connection with
+     specific products or compilations that contain the covered work,
+     unless you entered into that arrangement, or that patent license
+     was granted, prior to 28 March 2007.
+
+     Nothing in this License shall be construed as excluding or limiting
+     any implied license or other defenses to infringement that may
+     otherwise be available to you under applicable patent law.
+
+
+ 12. NO SURRENDER OF OTHERS' FREEDOM
+
+     If conditions are imposed on you (whether by court order,
+     agreement or otherwise) that contradict the conditions of this
+     License, they do not excuse you from the conditions of this
+     License.  If you cannot convey a covered work so as to satisfy
+     simultaneously your obligations under this License and any other
+     pertinent obligations, then as a consequence you may not convey it
+     at all.  For example, if you agree to terms that obligate you to
+     collect a royalty for further conveying from those to whom you
+     convey the Program, the only way you could satisfy both those
+     terms and this License would be to refrain entirely from conveying
+     the Program.
+
+
+ 13. USE WITH THE GNU AFFERO GENERAL PUBLIC LICENSE
+
+     Notwithstanding any other provision of this License, you have
+     permission to link or combine any covered work with a work licensed
+     under version 3 of the GNU Affero General Public License into a
+     single combined work, and to convey the resulting work.  The terms
+     of this License will continue to apply to the part which is the
+     covered work, but the special requirements of the GNU Affero
+     General Public License, section 13, concerning interaction through
+     a network will apply to the combination as such.
+
+
+ 14. REVISED VERSIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish revised and/or new
+     versions of the GNU General Public License from time to time.
+     Such new versions will be similar in spirit to the present
+     version, but may differ in detail to address new problems or
+     concerns.
+
+     Each version is given a distinguishing version number.  If the
+     Program specifies that a certain numbered version of the GNU
+     General Public License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that numbered version or of any later version published by the
+     Free Software Foundation.  If the Program does not specify a
+     version number of the GNU General Public License, you may choose
+     any version ever published by the Free Software Foundation.
+
+     If the Program specifies that a proxy can decide which future
+     versions of the GNU General Public License can be used, that
+     proxy's public statement of acceptance of a version permanently
+     authorizes you to choose that version for the Program.
+
+     Later license versions may give you additional or different
+     permissions.  However, no additional obligations are imposed on any
+     author or copyright holder as a result of your choosing to follow a
+     later version.
+
+
+ 15. DISCLAIMER OF WARRANTY
+
+     THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+     COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE
+     RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+     SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+     NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+
+ 16. LIMITATION OF LIABILITY.
+
+     IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+     AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+     FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+     CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+     THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+     BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+     PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+     PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+     THE POSSIBILITY OF SUCH DAMAGES.
+
+
+ 17. INTERPRETATION OF SECTIONS 15 AND 16
+
+     If the disclaimer of warranty and limitation of liability provided
+     above cannot be given local legal effect according to their terms,
+     reviewing courts shall apply local law that most closely
+     approximates an absolute waiver of all civil liability in
+     connection with the Program, unless a warranty or assumption of
+     liability accompanies a copy of the Program in return for a fee.
+
+
+How to Apply These Terms to your New Programs
+=============================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+   To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+   <one line to give the program's name and a brief idea of what it
+does.>     Copyright (C) <year>  <name of author>
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     GNU
+General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   Also add information on how to contact you by electronic and paper
+mail.
+
+   If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+   <program>  Copyright (C) <year>  <name of author>     This program
+comes with ABSOLUTELY NO WARRANTY; for details type `show w'.      This
+is free software, and you are welcome to redistribute it     under
+certain conditions; type `show c' for details.
+
+   The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an "about box".
+
+   You should also get your employer (if you work as a programmer) or
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  For more information on this, and how to apply and follow
+the GNU GPL, see <http://www.gnu.org/licenses/>.
+
+   The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use the
+GNU Lesser General Public License instead of this License.  But first,
+please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+\1f
+File: gnugo.info,  Node: GFDL,  Next: GTP License,  Prev: GPL,  Up: Copying
+
+A.2 GNU FREE DOCUMENTATION LICENSE
+==================================
+
+                     Version 1.3, 3 November 2008
+
+     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+     `http://fsf.org/'
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     The "publisher" means any person or entity that distributes copies
+     of the Document to the public.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included in an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided under this License.  Any attempt
+     otherwise to copy, modify, sublicense, or distribute it is void,
+     and will automatically terminate your rights under this License.
+
+     However, if you cease all violation of this License, then your
+     license from a particular copyright holder is reinstated (a)
+     provisionally, unless and until the copyright holder explicitly
+     and finally terminates your license, and (b) permanently, if the
+     copyright holder fails to notify you of the violation by some
+     reasonable means prior to 60 days after the cessation.
+
+     Moreover, your license from a particular copyright holder is
+     reinstated permanently if the copyright holder notifies you of the
+     violation by some reasonable means, this is the first time you have
+     received notice of violation of this License (for any work) from
+     that copyright holder, and you cure the violation prior to 30 days
+     after your receipt of the notice.
+
+     Termination of your rights under this section does not terminate
+     the licenses of parties who have received copies or rights from
+     you under this License.  If your rights have been terminated and
+     not permanently reinstated, receipt of a copy of some or all of
+     the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.  If the Document specifies that a proxy
+     can decide which future versions of this License can be used, that
+     proxy's public statement of acceptance of a version permanently
+     authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+     World Wide Web server that publishes copyrightable works and also
+     provides prominent facilities for anybody to edit those works.  A
+     public wiki that anybody can edit is an example of such a server.
+     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+     site means any set of copyrightable works thus published on the MMC
+     site.
+
+     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+     license published by Creative Commons Corporation, a not-for-profit
+     corporation with a principal place of business in San Francisco,
+     California, as well as future copyleft versions of that license
+     published by that same organization.
+
+     "Incorporate" means to publish or republish a Document, in whole or
+     in part, as part of another Document.
+
+     An MMC is "eligible for relicensing" if it is licensed under this
+     License, and if all works that were first published under this
+     License somewhere other than this MMC, and subsequently
+     incorporated in whole or in part into the MMC, (1) had no cover
+     texts or invariant sections, and (2) were thus incorporated prior
+     to November 1, 2008.
+
+     The operator of an MMC Site may republish an MMC contained in the
+     site under CC-BY-SA on the same site at any time before August 1,
+     2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.3
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+       Texts.  A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: gnugo.info,  Node: GTP License,  Prev: GFDL,  Up: Copying
+
+A.3 The Go Text Protocol License
+================================
+
+In order to facilitate the use of the Go Text Protocol, the two files
+`gtp.c' and `gtp.h' are licensed under the following terms.
+
+   Copyright 2001 by the Free Software Foundation.
+
+   Permission is hereby granted, free of charge, to any person
+obtaining a copy of this file `gtp.x', to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so,
+provided that the above copyright notice(s) and this permission notice
+appear in all copies of the Software and that both the above copyright
+notice(s) and this permission notice appear in supporting documentation.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+   Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+\1f
+File: gnugo.info,  Node: Concept Index,  Next: Functions Index,  Prev: Copying,  Up: Top
+
+Concept Index
+*************
+
+\0\b[index\0\b]
+* Menu:
+
+* aa_confirm_safety:                     GTP command reference.
+                                                             (line  492)
+* accurate_approxlib:                    GTP command reference.
+                                                             (line  207)
+* accuratelib:                           GTP command reference.
+                                                             (line  200)
+* adjacent dragons:                      Dragons.            (line  145)
+* advance_random_seed:                   GTP command reference.
+                                                             (line  960)
+* all_legal:                             GTP command reference.
+                                                             (line  223)
+* amalgamation of worms into dragons:    Amalgamation.       (line    6)
+* analyze_eyegraph:                      GTP command reference.
+                                                             (line  710)
+* analyze_semeai:                        GTP command reference.
+                                                             (line  400)
+* analyze_semeai_after_move:             GTP command reference.
+                                                             (line  406)
+* API:                                   API.                (line   26)
+* area:                                  Territory and Moyo. (line    6)
+* ascii description of shapes:           Patterns Overview.  (line   27)
+* ascii interface:                       Ascii.              (line    6)
+* ascii mode:                            Invoking GNU Go.    (line  336)
+* attack:                                GTP command reference.
+                                                             (line  288)
+* attack shapes database:                Patterns Overview.  (line    6)
+* attack_either:                         GTP command reference.
+                                                             (line  294)
+* autohelper actions:                    Autohelper Actions. (line    6)
+* Autohelpers:                           Autohelpers and Constraints.
+                                                             (line    6)
+* automaton:                             DFA.                (line   29)
+* black:                                 GTP command reference.
+                                                             (line  111)
+* block_off:                             GTP command reference.
+                                                             (line  437)
+* board_state:                           The Board State.    (line    6)
+* boardsize:                             GTP command reference.
+                                                             (line   63)
+* break_in:                              GTP command reference.
+                                                             (line  431)
+* cache:                                 Invoking GNU Go.    (line  119)
+* cache-size:                            Invoking GNU Go.    (line  119)
+* captures:                              GTP command reference.
+                                                             (line  229)
+* CGoban:                                CGoban.             (line    6)
+* clear_board:                           GTP command reference.
+                                                             (line   77)
+* clear_cache:                           GTP command reference.
+                                                             (line  284)
+* color:                                 GTP command reference.
+                                                             (line  175)
+* color (dragon):                        Dragons.            (line   98)
+* colored display <1>:                   Dragons in Color.   (line    6)
+* colored display:                       Colored Display.    (line    6)
+* combination_attack:                    GTP command reference.
+                                                             (line  479)
+* combination_defend:                    GTP command reference.
+                                                             (line  485)
+* command line options:                  Invoking GNU Go.    (line    6)
+* connect:                               GTP command reference.
+                                                             (line  419)
+* connection shapes database <1>:        Connections Database.
+                                                             (line    6)
+* connection shapes database:            Patterns Overview.  (line    6)
+* connections:                           Connection.         (line    6)
+* connections database:                  Connections Database.
+                                                             (line    6)
+* corner matcher:                        Corner Matcher.     (line    6)
+* countlib:                              GTP command reference.
+                                                             (line  187)
+* cputime:                               GTP command reference.
+                                                             (line  717)
+* cutting stone:                         Worms.              (line  124)
+* cutting stone, potential:              Worms.              (line  133)
+* data structures:                       Basic Data Structures.
+                                                             (line    6)
+* debugging on a graphical board:        view.pike.          (line    6)
+* debugging options:                     Invoking GNU Go.    (line  415)
+* Debugging the reading code:            Debugging.          (line    6)
+* decide-dragon:                         Decide dragon.      (line    6)
+* decide-string:                         Decide string.      (line    6)
+* decrease_depths:                       GTP command reference.
+                                                             (line  334)
+* defence shapes database:               Patterns Overview.  (line    6)
+* defend:                                GTP command reference.
+                                                             (line  302)
+* defend_both:                           GTP command reference.
+                                                             (line  385)
+* depth:                                 Invoking GNU Go.    (line  242)
+* Depth of reading:                      Tactical Reading.   (line    6)
+* description of shapes:                 Patterns Overview.  (line   27)
+* dfa:                                   DFA.                (line   29)
+* dfa.c:                                 DFA.                (line   29)
+* dfa.h:                                 DFA.                (line   29)
+* disconnect:                            GTP command reference.
+                                                             (line  425)
+* distance from liberty to dragon:       Worms.              (line  109)
+* does_attack:                           GTP command reference.
+                                                             (line  308)
+* does_defend:                           GTP command reference.
+                                                             (line  315)
+* does_surround:                         GTP command reference.
+                                                             (line  972)
+* dragon:                                Worms and Dragons.  (line   27)
+* dragon escape_route:                   Dragons.            (line  207)
+* dragon genus:                          Dragons.            (line  213)
+* dragon lunch:                          Dragons.            (line  230)
+* dragon number:                         Dragons.            (line  100)
+* dragon origin:                         Dragons.            (line  104)
+* dragon safety:                         Dragons.            (line  176)
+* dragon size:                           Dragons.            (line  112)
+* dragon status:                         Dragons.            (line  131)
+* dragon weakness:                       Dragons.            (line  199)
+* dragon_data:                           GTP command reference.
+                                                             (line  854)
+* dragon_status:                         GTP command reference.
+                                                             (line  452)
+* dragon_stones:                         GTP command reference.
+                                                             (line  860)
+* dragons:                               Dragons.            (line    6)
+* draw_search_area:                      GTP command reference.
+                                                             (line 1008)
+* dump_stack:                            GTP command reference.
+                                                             (line  731)
+* echo:                                  GTP command reference.
+                                                             (line  913)
+* echo_err:                              GTP command reference.
+                                                             (line  919)
+* editing pattern database:              Editing Patterns.   (line    6)
+* editing patterns:                      Editing Patterns.   (line    6)
+* effective size:                        Dragons.            (line  116)
+* effective size (worm):                 Worms.              (line   48)
+* eliminate the randomness:              Tuning.             (line  155)
+* emacs mode:                            Emacs.              (line    6)
+* escape_route:                          Dragons.            (line  207)
+* estimate_score:                        GTP command reference.
+                                                             (line  621)
+* eval_eye:                              GTP command reference.
+                                                             (line  444)
+* experimental_score:                    GTP command reference.
+                                                             (line  626)
+* eye shapes database:                   Patterns Overview.  (line    6)
+* eye space display:                     Colored Display.    (line   48)
+* eye_data:                              GTP command reference.
+                                                             (line  866)
+* false eye:                             Half Eyes.          (line    6)
+* fast pattern matching:                 DFA.                (line   29)
+* final_score:                           GTP command reference.
+                                                             (line  589)
+* final_status:                          GTP command reference.
+                                                             (line  597)
+* final_status_list:                     GTP command reference.
+                                                             (line  605)
+* findlib:                               GTP command reference.
+                                                             (line  193)
+* finish_sgftrace:                       GTP command reference.
+                                                             (line  889)
+* finite state automaton:                DFA.                (line   29)
+* fixed_handicap:                        GTP command reference.
+                                                             (line  135)
+* FIXME:                                 Coding Styles.      (line   83)
+* followup_influence:                    GTP command reference.
+                                                             (line  799)
+* format of the pattern database:        Patterns Overview.  (line   27)
+* formatted printing:                    Print Utilities.    (line    6)
+* GDB <1>:                               Debugging.          (line   30)
+* GDB:                                   GTP and GDB techniques.
+                                                             (line    6)
+* generation of helper functions:        Autohelpers and Constraints.
+                                                             (line    6)
+* genmove:                               GTP command reference.
+                                                             (line  512)
+* genmove_black:                         GTP command reference.
+                                                             (line  496)
+* genmove_white:                         GTP command reference.
+                                                             (line  504)
+* genus:                                 Dragons.            (line  213)
+* genus (worm):                          Worms.              (line  155)
+* get_connection_node_counter:           GTP command reference.
+                                                             (line  697)
+* get_handicap:                          GTP command reference.
+                                                             (line  160)
+* get_komi:                              GTP command reference.
+                                                             (line  105)
+* get_life_node_counter:                 GTP command reference.
+                                                             (line  646)
+* get_owl_node_counter:                  GTP command reference.
+                                                             (line  661)
+* get_random_seed:                       GTP command reference.
+                                                             (line  948)
+* get_reading_node_counter:              GTP command reference.
+                                                             (line  673)
+* get_trymove_counter:                   GTP command reference.
+                                                             (line  685)
+* gg-undo:                               GTP command reference.
+                                                             (line  571)
+* gg_genmove:                            GTP command reference.
+                                                             (line  529)
+* GMP:                                   GMP and GTP.        (line    6)
+* GNU Go's GDB commands:                 Debugging.          (line   82)
+* go position:                           Hash Calculation.   (line   10)
+* grid optimization:                     Details.            (line    6)
+* GTP <1>:                               GTP and GDB techniques.
+                                                             (line    6)
+* GTP:                                   GMP and GTP.        (line    6)
+* GTP command reference:                 GTP command reference.
+                                                             (line    6)
+* half eye:                              Half Eyes.          (line    6)
+* half_eye_data:                         GTP command reference.
+                                                             (line  872)
+* Hash node:                             Hash Organization.  (line    8)
+* Hashing of positions:                  Hashing.            (line    6)
+* help:                                  GTP command reference.
+                                                             (line  925)
+* helper functions in pattern matching:  Helper Functions.   (line    6)
+* how GNU Go learns new joseki:          Joseki Compiler.    (line    6)
+* How to debug the reading code:         Debugging.          (line    6)
+* implementation of pattern matching <1>: Corner Matcher.    (line    6)
+* implementation of pattern matching:    PM Implementation.  (line    6)
+* increase_depths:                       GTP command reference.
+                                                             (line  328)
+* inessential string:                    Worms.              (line  165)
+* initial_influence:                     GTP command reference.
+                                                             (line  737)
+* installation:                          GNU/Linux and Unix. (line    6)
+* invariant_hash:                        GTP command reference.
+                                                             (line  248)
+* invariant_hash_for_moves:              GTP command reference.
+                                                             (line  255)
+* invincible worm:                       Worms.              (line  178)
+* invoking GNU Go:                       Invoking GNU Go.    (line    6)
+* is_legal:                              GTP command reference.
+                                                             (line  217)
+* is_surrounded:                         GTP command reference.
+                                                             (line  966)
+* jago:                                  Other Clients.      (line    6)
+* joseki <1>:                            Corner Matcher.     (line    6)
+* joseki:                                Joseki Compiler.    (line    6)
+* kgs-genmove_cleanup:                   GTP command reference.
+                                                             (line  544)
+* known_command:                         GTP command reference.
+                                                             (line  933)
+* komi:                                  GTP command reference.
+                                                             (line   97)
+* ladder_attack:                         GTP command reference.
+                                                             (line  322)
+* last_move:                             GTP command reference.
+                                                             (line  235)
+* level <1>:                             GTP command reference.
+                                                             (line  557)
+* level:                                 Invoking GNU Go.    (line  225)
+* level of play:                         Invoking GNU Go.    (line   25)
+* liberties (worm):                      Worms.              (line   74)
+* liberties, higher order (worm):        Worms.              (line   74)
+* licence, documentation (GFDL):         GFDL.               (line    3)
+* licence, program (GPL):                GPL.                (line    3)
+* limit_search:                          GTP command reference.
+                                                             (line  996)
+* list_stones:                           GTP command reference.
+                                                             (line  181)
+* loadsgf:                               GTP command reference.
+                                                             (line  166)
+* lunch:                                 Dragons.            (line  230)
+* lunch (worm):                          Worms.              (line  114)
+* matchpat.c:                            DFA.                (line   29)
+* Monte Carlo Go:                        Monte Carlo Go.     (line    6)
+* move generation:                       Move Generators.    (line    6)
+* move generators:                       Move Generators.    (line    6)
+* move reasons <1>:                      Move Reasons.       (line    6)
+* move reasons:                          Move Generators.    (line    6)
+* move_history:                          GTP command reference.
+                                                             (line  241)
+* move_influence:                        GTP command reference.
+                                                             (line  776)
+* move_probabilities:                    GTP command reference.
+                                                             (line  783)
+* move_uncertainty:                      GTP command reference.
+                                                             (line  791)
+* moyo:                                  Territory and Moyo. (line    6)
+* name:                                  GTP command reference.
+                                                             (line   47)
+* neighbor dragons:                      Dragons.            (line  145)
+* orientation:                           GTP command reference.
+                                                             (line   85)
+* origin (worm):                         Worms.              (line   58)
+* output file:                           Output File.        (line    6)
+* owl_attack:                            GTP command reference.
+                                                             (line  340)
+* owl_attack_certain:                    Dragons.            (line  296)
+* owl_attack_code:                       Dragons.            (line  291)
+* owl_attack_point:                      Dragons.            (line  286)
+* owl_connection_defends:                GTP command reference.
+                                                             (line  378)
+* owl_defend:                            GTP command reference.
+                                                             (line  346)
+* owl_defense_certain:                   Dragons.            (line  314)
+* owl_defense_code:                      Dragons.            (line  309)
+* owl_defense_point:                     Dragons.            (line  305)
+* owl_does_attack:                       GTP command reference.
+                                                             (line  366)
+* owl_does_defend:                       GTP command reference.
+                                                             (line  372)
+* owl_second_attack_point:               Dragons.            (line  301)
+* owl_second_defense_point:              Dragons.            (line  319)
+* owl_substantial:                       GTP command reference.
+                                                             (line  393)
+* owl_threaten_attack:                   GTP command reference.
+                                                             (line  352)
+* owl_threaten_defense:                  GTP command reference.
+                                                             (line  359)
+* pattern attributes:                    Pattern Classification.
+                                                             (line    6)
+* pattern database <1>:                  DFA.                (line   29)
+* pattern database:                      Patterns Overview.  (line    6)
+* pattern matching <1>:                  DFA.                (line   29)
+* pattern matching:                      Patterns Overview.  (line    6)
+* pattern matching optimization:         Details.            (line    6)
+* pattern overview:                      Patterns Overview.  (line    6)
+* pattern.c:                             Patterns Overview.  (line    6)
+* pattern.h:                             Patterns Overview.  (line    6)
+* persistent cache:                      Persistent Cache.   (line    6)
+* place_free_handicap:                   GTP command reference.
+                                                             (line  143)
+* play:                                  GTP command reference.
+                                                             (line  127)
+* playwhite:                             GTP command reference.
+                                                             (line  119)
+* popgo:                                 GTP command reference.
+                                                             (line  277)
+* position:                              Hash Calculation.   (line   10)
+* position struct:                       Basic Data Structures.
+                                                             (line    6)
+* potential cutting stone:               Worms.              (line  133)
+* printsgf:                              GTP command reference.
+                                                             (line  899)
+* product:                               DFA.                (line   29)
+* protocol_version:                      GTP command reference.
+                                                             (line   39)
+* qGo:                                   Other Clients.      (line    6)
+* quarry:                                Other Clients.      (line    6)
+* query_boardsize:                       GTP command reference.
+                                                             (line   71)
+* query_orientation:                     GTP command reference.
+                                                             (line   91)
+* quit:                                  GTP command reference.
+                                                             (line   33)
+* Read result:                           Hash Organization.  (line    8)
+* Reading code:                          Tactical Reading.   (line    6)
+* Reading code debugging tools:          Debugging.          (line    6)
+* reading DEPTH:                         Tactical Reading.   (line    6)
+* Reading optimisation:                  Hashing.            (line    6)
+* Reading process:                       Tactical Reading.   (line    6)
+* reading return codes:                  Reading Basics.     (line   51)
+* reading shadow:                        Persistent Cache.   (line   50)
+* reading.c <1>:                         Reading Basics.     (line  122)
+* reading.c:                             Tactical Reading.   (line    6)
+* reading.h:                             Tactical Reading.   (line    6)
+* reg_genmove:                           GTP command reference.
+                                                             (line  521)
+* report_uncertainty:                    GTP command reference.
+                                                             (line  941)
+* reset_connection_node_counter:         GTP command reference.
+                                                             (line  691)
+* reset_life_node_counter:               GTP command reference.
+                                                             (line  637)
+* reset_owl_node_counter:                GTP command reference.
+                                                             (line  655)
+* reset_reading_node_counter:            GTP command reference.
+                                                             (line  667)
+* reset_search_mask:                     GTP command reference.
+                                                             (line  990)
+* reset_trymove_counter:                 GTP command reference.
+                                                             (line  679)
+* restricted_genmove:                    GTP command reference.
+                                                             (line  537)
+* return codes:                          Reading Basics.     (line   51)
+* same_dragon:                           GTP command reference.
+                                                             (line  464)
+* scoring:                               Scoring.            (line    6)
+* semeai:                                Dragons.            (line  254)
+* semeai_attack_certain:                 Dragons.            (line  254)
+* semeai_attack_point:                   Dragons.            (line  254)
+* semeai_defense_certain:                Dragons.            (line  254)
+* semeai_defense_point:                  Dragons.            (line  254)
+* set_free_handicap:                     GTP command reference.
+                                                             (line  152)
+* set_random_seed:                       GTP command reference.
+                                                             (line  954)
+* set_search_diamond:                    GTP command reference.
+                                                             (line  984)
+* set_search_limit:                      GTP command reference.
+                                                             (line 1002)
+* SGF (Smart Game Format):               SGF Support.        (line    6)
+* SGF files in memory:                   SGF.                (line    6)
+* shape attributes:                      Pattern Classification.
+                                                             (line    6)
+* showboard:                             GTP command reference.
+                                                             (line  723)
+* Smart Game Format:                     SGF Support.        (line    6)
+* Speedup of reading process:            Hashing.            (line    6)
+* start_sgftrace:                        GTP command reference.
+                                                             (line  879)
+* string:                                Worms and Dragons.  (line   27)
+* superstring:                           General Utilities.  (line  249)
+* surround:                              Dragons.            (line  238)
+* surround_map:                          GTP command reference.
+                                                             (line  979)
+* surround_size:                         Dragons.            (line  238)
+* surround_status:                       Dragons.            (line  238)
+* symmetry and transformations:          Symmetry & transformations.
+                                                             (line    6)
+* symmetry and transformations of shapes: Symmetry & transformations.
+                                                             (line    6)
+* tactical_analyze_semeai:               GTP command reference.
+                                                             (line  413)
+* teaching josekis to GNU Go:            Joseki Compiler.    (line    6)
+* territory:                             Territory and Moyo. (line    6)
+* test_eyeshape:                         GTP command reference.
+                                                             (line  704)
+* The Go Modem Protocol and Go Text Protocol: GMP and GTP.   (line    6)
+* the joseki compiler:                   Joseki Compiler.    (line    6)
+* time_left:                             GTP command reference.
+                                                             (line  583)
+* time_settings:                         GTP command reference.
+                                                             (line  576)
+* timers:                                General Utilities.  (line  328)
+* traces:                                Traces.             (line    6)
+* Transposition table:                   Hashing.            (line    6)
+* Trying hypothetical moves:             Tactical Reading.   (line    6)
+* tryko:                                 GTP command reference.
+                                                             (line  270)
+* trymove:                               GTP command reference.
+                                                             (line  264)
+* tune_move_ordering:                    GTP command reference.
+                                                             (line  906)
+* tuning GNU Go:                         Traces.             (line    6)
+* tuning the pattern database:           Tuning.             (line    6)
+* tuning the shapes database:            Tuning.             (line    6)
+* UCT algorithm:                         Monte Carlo Go.     (line    6)
+* unconditional_status:                  GTP command reference.
+                                                             (line  470)
+* undo:                                  GTP command reference.
+                                                             (line  564)
+* Usage of the stack in reading:         Tactical Reading.   (line    6)
+* version:                               GTP command reference.
+                                                             (line   55)
+* weakness:                              Dragons.            (line  199)
+* worm <1>:                              Worms.              (line    6)
+* worm:                                  Worms and Dragons.  (line   27)
+* worm_cutstone:                         GTP command reference.
+                                                             (line  847)
+* worm_data:                             GTP command reference.
+                                                             (line  806)
+* worm_stones:                           GTP command reference.
+                                                             (line  841)
+* Zobrist hashing algorithm:             Hashing.            (line    6)
+
diff --git a/doc/gnugo.info-3 b/doc/gnugo.info-3
new file mode 100644 (file)
index 0000000..d489898
Binary files /dev/null and b/doc/gnugo.info-3 differ
diff --git a/doc/gnugo.pod b/doc/gnugo.pod
new file mode 100644 (file)
index 0000000..76e219f
--- /dev/null
@@ -0,0 +1,263 @@
+
+=head1 NAME
+
+gnugo - The GNU program to play the game of Go
+
+=head1 SYNOPSIS
+
+B<gnugo>
+[B<--boardsize <num>>]
+[B<--color <color>>]
+[B<--handicap <num>>]
+[B<--komi <num>>]
+[B<--quiet>]
+[B<-v, --version>]
+[B<-h, --help>]
+[B<--help debug>]
+[B<--copyright>]
+[B<--mode <mode>>]
+[B<--replay <color>>]
+[B<-l, --infile <filename>>]
+[B<-L, --until <move>>]
+[B<-o, --outfile <filename>>]
+[B<--printsgf <filename>>]
+[B<-D, --depth <num>>]
+[B<-B, --backfill_depth <num>>]
+[B<--score [estimate|finish|aftermath]> ]
+[B<-a, --allpats>]
+[B<-T, --printboard>]
+[B<-d, --debug <level>>]
+[B<-w, --worms>]
+[B<-m, --moyo <level>>]
+[B<-b, --benchmark num>]
+[B<-t, --trace>]
+[B<-r, --seed num>]
+
+=head1 DESCRIPTION
+
+GNU Go plays a game of Go against the user. It has many other features: it 
+can play against itself or another program, analyse and score a recorded 
+game. GNU Go is compliant with Go modem protocol, load and save game in
+the Smart Game format. 
+
+GNU Go default is a simple alpha-numeric board display, but you can use
+a client such as B<CGoban>.
+
+=head2 The game of Go
+
+Go is a game of strategy between two players usually played on a
+19x19 grid called B<goban>. The two players put black and white B<stones> on
+the goban to enclose B<territory>. Go was invented about 4000 years ago in
+ancient China. Other names for this game are (Chinese) B<Wei Chi>, (Korean)
+B<Baduk> and (Ing) B<Goe>.
+
+=head2 Playing a game in ASCII mode
+
+To start a game with default options, just invoke "gnugo". The board will be
+drawn at your terminal using ASCII letters.  In this mode, you can get help on
+available commands by the B<h> key.  To play as Black with 4 stones handicap,
+with a 0.5 komi, recording the game in the file record.sgf:
+
+ gnugo --color black --handicap 4 --komi 0.5 -o record.sgf
+
+=head2 Playing a game with CGoban
+
+CGoban is a general purpose client program by Bill Shubert for
+playing Go. It runs under X Window System with a beautiful resizeable
+graphic display. To use GNU Go under X Window System, obtain the
+most recent version of CGoban from Bill Shubert's web site
+
+http://www.igoweb.org/~wms/comp/cgoban/index.html
+
+Start CGoban. When the CGoban Control panel comes up, select `Go Modem.'
+You will get the Go Modem Protocol Setup. Choose one (or both) of the
+players to be ``Program,'' and fill out the box to the path to
+gnugo. After clicking OK, you get the Game Setup window. Choose
+``Rules Set'' to be Japanese (otherwise handicaps won't work). Set the
+board size and handicap if you want. Click OK and you are ready to go.
+
+In the Go Modem Protocol Setup window, when you specify the path
+to GNU Go, you can give it command line options, such as --quiet
+to suppress most messages. Since the Go Modem Protocol preempts
+standard I/O, other messages are sent to stderr, even if they are
+not error messages. These will appear in the terminal from which
+you started CGoban. 
+
+=head2 Scoring system
+
+The game stops when both players pass. GNU Go will attempt to
+compute and report the score to you. It may occasionally make
+mistakes due to wrong evaluation of the status of a group. You
+can check the score as follows. In ASCII mode, at the end of
+the game, stones believed dead are marked in lower case letters,
+and you have the option of toggling their status before counting.
+Using CGoban, you may use CGoban's counting facility to count
+the game using either Japanese or Chinese rules.
+
+=head2 Viewing a stored game
+
+gnugo B<-l> filename.sgf --mode ascii
+
+loads filename.sgf and lets you navigate through the game by using the
+commands I<forward>, I<back>, I<goto> and I<last>.
+It is not possible to navigate through variations in ascii mode.
+You may also use CGoban to view stored games. CGoban can navigate
+variations.
+
+=head2 Documentation
+
+The files in the F<doc> directory contain detailed documentation about
+debugging options and internal program structure. Other documentation may
+be found in comments throughout the source code.
+
+=head2 Go Modem Protocol
+
+The Go Modem Protocol is a standard interface between Go programs and
+graphical display. 
+
+The Go Modem Protocol was developed by Bruce Wilcox with input from
+David Fotland, Anders Kierulf and others. Any Go program *should*
+use this protocol since it is standard. Since CGoban supports this
+protocol, the user interface for any Go program can be done
+entirely through CGoban. Using the Go Modem Protocol, you can play
+with another computer running a different program (even on a
+different operating system) using a modem, a serial cable or over
+the internet if the other program also supports the protocol. You
+can also communicate with the Go servers using CGoban.
+
+=head2 Smart Game Format
+
+Games (with comments, variations and other features) can be
+stored in the Smart Game Format (SGF). This format originated in
+Anders Kierulf's program Smart Go. Martin Muller and Arno
+Hollosi developed the current standard, which may be found
+at 
+
+http://www.red-bean.com/sgf/
+
+GNU Go supports the Smart Game Format.
+
+=head1 OPTIONS
+
+=head2 Main options
+
+B<--mode I<mode>>
+
+force the playing mode (I<ascii'>, I<gtp> or I<gmp>). Default is 
+ASCII. If no terminal is detected GMP (Go Modem Protocol) will be assumed.
+
+B<--replay I<color>>
+
+replay the game generating moves for color, where color is I<white>,
+I<black>, or I<both>. (requires B<-l>)
+
+B<--quiet>
+
+Don't print copyright and other informational messages.
+
+B<-l, --infile I<file>>
+
+Load the SGF file (to score or analyze a recorded game).
+
+B<-L, --until I<move>>
+
+Stop loading just before I<move> is played (e.g. 154 or L10).
+
+B<-o, --outfile I<file>>
+
+Save the played game to I<file> in SGF format.
+
+=head2 Game Options: 
+
+B<--boardsize I<num>>
+
+Set the board size to use (1-19). Default is 19, other common formats are
+13 and 9.
+
+B<--color I<color>>
+
+Choose your color (I<black> or I<white>). Black plays first, White gets
+the komi compensation.
+
+B<--handicap I<num>>
+
+Set the number of handicap stones.
+
+B<--komi I<num>>
+
+Set the komi (points given to white player to compensate advantage of the 
+first move, usually 5.5 or 0.5). Default is 5.5.
+
+=head2 Informative Output:
+
+B<-v, --version>
+
+Display the version of GNU Go. 
+
+B<-h, --help>
+
+Display help message.
+
+B<--help debug>
+
+Display help about debugging options. 
+
+B<--copyright>
+
+Display copyright notice.
+
+=head2 Debugging and advanced options:
+
+B<-T, --printboard>
+
+Show board each move.
+
+B<--level I<num>>
+
+Level of play. (default 10; smaller=faster, weaker).
+
+B<-b, --benchmark I<num>>
+
+Benchmarking mode - can be used with B<-l>.
+
+B<-t, --trace>
+
+Verbose tracing (use twice or more to trace reading).
+
+B<-r, --seed I<num>>
+
+Set random number seed.
+
+B<--score [I<estimate|finish|aftermath>]>
+
+Count or estimate territory of the input file. Usage:
+
+B<gnugo --score estimate -l filename>
+
+Loads the SGF file and estimates the score by measuring the
+influence. Use with B<-L> if you want the estimate somewhere else than
+at the end of the file.
+
+B<gnugo --score finish -l filename>
+
+Loads the SGF file and gnugo continues to play by itself up to the
+very end. Then the winner is determined by counting the territory.
+
+B<gnugo --score aftermath -l filename>
+
+Similar to B<--score finish> except that a more accurate but slower
+algorithm is used to determine the final status of the groups.
+
+If the option B<-o outputfilename> is provided, 
+the results will also be written as comment at the end of the output file.
+
+B<--printsgf I<outfile>>
+
+Load SGF file, output final position (requires B<-l>).
+
+=head1 BUGS
+
+If you find a bug, please send the SGF output file to gnugo@gnu.org
+together with a description of the bug.
+
+=cut
diff --git a/doc/gnugo.texi b/doc/gnugo.texi
new file mode 100644 (file)
index 0000000..6c9e614
--- /dev/null
@@ -0,0 +1,238 @@
+\input texinfo @c -*-Texinfo-*-
+@c %**start of header
+@setfilename gnugo.info
+@settitle GNU Go Documentation
+@c %**end of header
+
+@dircategory GNU games
+@direntry
+* GNU Go: (gnugo).          The GNU Go program
+@end direntry
+
+@set EDITION 3.8
+@set VERSION 3.8
+
+@finalout
+@titlepage
+@subtitle Documentation for the GNU Go Project
+@subtitle Edition @value{EDITION}
+@subtitle February, 2009
+@vskip 0pt plus 1filll
+@image{logo-36}
+@vskip 0pt plus 1filll
+@author By Arend Bayer, Daniel Bump, Evan Berggren Daniel, 
+@author David Denholm, Jerome Dumonteil, Gunnar Farneb@"ack,
+@author Paul Pogonyshev, Thomas Traber, Tanguy Urvoy, Inge Wallin
+
+@sp 1
+@page
+@title{GNU Go 3.8}
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 @uref{http://www.fsf.org,Free Software Foundation}, Inc.
+@sp 2
+
+This is Edition @value{EDITION} of @cite{The GNU Go Project documentation}, @*
+for the @value{VERSION} version of the GNU Go program.
+
+@sp 2
+Published by the Free Software Foundation Inc @*
+51 Franklin Street, Fifth Floor @* 
+Boston, MA  02110-1301 @*
+USA @*
+Tel: 617-542-5942 @*
+
+Permission is granted to make and distribute verbatim
+or modified copies of this manual is given provided
+that the terms of the GNU Free Documentation License
+(@pxref{GFDL}, version 1.3 or any later version) are respected.
+
+Permission is granted to make and distribute verbatim
+or modified copies of the program GNU Go is given provided
+the terms of the GNU General Public License (@pxref{GPL},
+version 3 or any later version) are respected.
+
+@end titlepage
+
+@contents
+
+@node Top
+@top
+@ifinfo
+@unnumbered GNU Go
+
+This manual documents @code{GNU Go}, a Go program and its sources.
+This is Edition @value{EDITION} of the @cite{GNU Go Program Documentation}
+
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 @uref{http://www.fsf.org,Free Software Foundation}, Inc.
+     
+Permission is granted to make and distribute verbatim
+or modified copies of this manual is given provided
+that the terms of the GNU Free Documentation License
+(@pxref{GFDL}, version 1.3 or any later version) are respected.
+
+Permission is granted to make and distribute verbatim
+or modified copies of the program GNU Go is given provided
+the terms of the GNU General Public License (@pxref{GPL},
+version 3 or any later version) are respected.
+
+@end ifinfo
+
+@menu
+User's manual
+* Introduction::                 What is GNU Go ?
+* Installation::                 Installing GNU Go 
+* User Guide::                   Using GNU Go
+
+An introduction to the GNU Go engine
+* Overview::                     Overview of the GNU Go engine
+* Analyzing::                    Analyzing GNU Go's moves
+* Move Generation::              How GNU Go generates moves
+* Worms and Dragons::            Dragons and Worms
+* Eyes::                         Eyes and half eyes
+* Patterns::                     Pattern database
+* Tactical Reading::             Tactical and Connection Reading
+* Pattern Based Reading::        Pattern Based Reading: Owl and Combinations
+* Influence::                    Influence Function
+* Monte Carlo Go::               Monte Carlo GNU Go
+
+Infrastructure and Interfaces
+* Libboard::                     The basic go board library.
+* SGF::                          Handling SGF trees in memory
+* DFA::                          The DFA Pattern Matcher
+* Utility Functions::            @file{utils.c} and @file{printutils.c}
+* API::                          API to the GNU Go engine
+* GTP::                          The Go Text Protocol
+* Regression::                   Regression testing
+
+Appendices
+* Copying::                      Software and Documentation Licenses
+
+Indices
+* Concept Index::               Concept Index
+* Functions Index::             Functions Index
+
+@end menu
+
+@node    Introduction
+@chapter Introduction
+
+@include introduction.texi
+
+@node Installation
+@chapter Installation
+
+@include install.texi
+
+@node User Guide
+@chapter Using GNU Go
+
+@include using.texi
+
+@node  Overview
+@chapter GNU Go engine overview
+
+@include overview.texi
+
+@node  Analyzing
+@chapter Analyzing GNU Go's moves
+
+@include analyze.texi
+
+
+@node Move Generation
+@chapter Move generation
+
+@include move_generation.texi
+
+@node Worms and Dragons
+@chapter Worms and Dragons
+
+@include dragon.texi
+
+@node Eyes
+@chapter Eyes and Half Eyes
+
+@include eyes.texi
+
+@node Patterns
+@chapter The Pattern Code
+
+@include patterns.texi
+
+@node DFA
+@chapter The DFA pattern matcher
+
+@include dfa.texi
+
+@node Tactical Reading
+@chapter Tactical reading
+
+@include reading.texi
+
+@node Pattern Based Reading
+@chapter Pattern Based Reading
+
+@include owl.texi
+
+@node Influence
+@chapter Influence Function
+
+@include influence.texi
+
+@node Monte Carlo Go
+@chapter Monte Carlo Go
+@include montecarlo.texi
+
+@node Libboard
+@chapter The Board Library
+
+@include board.texi
+
+@node SGF
+@chapter Handling SGF trees in memory
+
+@include sgf.texi
+
+@node API
+@chapter Application Programmers Interface to GNU Go
+
+@include api.texi
+
+@node Utility Functions
+@chapter Utility Functions
+
+@include utils.texi
+
+@node GTP
+@chapter The Go Text Protocol
+
+@include gtp.texi
+
+@node Regression
+@chapter Regression testing
+
+@include regression.texi
+
+@node Copying
+@appendix Copying
+
+@include copying.texi
+
+@c ------------------------
+@c *  END OF THE DOCUMENT *
+@c ------------------------
+
+
+@node  Concept Index
+@unnumbered Concept Index
+
+@printindex cp
+
+@node  Functions Index
+@unnumbered Functions Index
+
+@printindex fn
+
+@bye
diff --git a/doc/gtp-commands.sed b/doc/gtp-commands.sed
new file mode 100644 (file)
index 0000000..00bac16
--- /dev/null
@@ -0,0 +1,35 @@
+# Look for function headers.
+/\* Function: /,/^{/!d
+
+# Remove cruft.
+/^static int/d
+/^{/d
+/^ \*\//d
+s/(char.*)//g
+
+# Hold comment lines, deleting them from pattern space for now.
+/.\*/{
+ s/^..//
+ s/^ //
+ H
+ d
+}
+
+# When we see the function name, merge hold space, in the process
+# generating proper texinfo @cindex, @item and @example formatting.
+# As a bonus, the `Function' field is moved to the @item line.
+# We use repeated `x' commands instead of the simpler `i' to avoid
+# requiring a `d' (which would render this script non-composable).
+/^gtp_/{
+ s/\(.*\)/@cindex \1 GTP command\n@item \1/
+ x
+ s/^\(.\)Function: *\(.*\)\(Arguments:\)/: \2@example\1\3/
+ s/\n *\(.*.@example\)/ \1/g
+ s/$/\n@end example/
+ H
+ s/.*//
+ x
+ s/\n//2
+}
+
+# gtp-commands.sed ends here
diff --git a/doc/gtp-commands.texi b/doc/gtp-commands.texi
new file mode 100644 (file)
index 0000000..4dee1ed
--- /dev/null
@@ -0,0 +1,1106 @@
+@cindex quit
+@item quit: Quit
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex protocol_version
+@item protocol_version: Report protocol version.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   protocol version number
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex name
+@item name: Report the name of the program.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   program name
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex version
+@item version: Report the version number of the program.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   version number
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex boardsize
+@item boardsize: Set the board size to NxN and clear the board.
+@verbatim
+Arguments: integer
+Fails:     board size outside engine's limits
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex query_boardsize
+@item query_boardsize: Find the current boardsize
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   board_size
+@end verbatim
+@cindex clear_board
+@item clear_board: Clear the board.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex orientation
+@item orientation: Set the orienation to N and clear the board
+@verbatim
+Arguments: integer
+Fails:     illegal orientation
+Returns:   nothing
+@end verbatim
+@cindex query_orientation
+@item query_orientation: Find the current orientation
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   orientation
+@end verbatim
+@cindex komi
+@item komi: Set the komi.
+@verbatim
+Arguments: float
+Fails:     incorrect argument
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex get_komi
+@item get_komi: Get the komi
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   Komi 
+@end verbatim
+@cindex black
+@item black: Play a black stone at the given vertex.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, illegal move
+Returns:   nothing
+
+Status:    Obsolete GTP version 1 command.
+@end verbatim
+@cindex playwhite
+@item playwhite: Play a white stone at the given vertex.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, illegal move
+Returns:   nothing
+
+Status:    Obsolete GTP version 1 command.
+@end verbatim
+@cindex play
+@item play: Play a stone of the given color at the given vertex.
+@verbatim
+Arguments: color, vertex
+Fails:     invalid vertex, illegal move
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex fixed_handicap
+@item fixed_handicap: Set up fixed placement handicap stones.
+@verbatim
+Arguments: number of handicap stones
+Fails:     invalid number of stones for the current boardsize
+Returns:   list of vertices with handicap stones
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex place_free_handicap
+@item place_free_handicap: Choose free placement handicap stones and put them on the board.
+@verbatim
+Arguments: number of handicap stones
+Fails:     invalid number of stones
+Returns:   list of vertices with handicap stones
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex set_free_handicap
+@item set_free_handicap: Put free placement handicap stones on the board.
+@verbatim
+Arguments: list of vertices with handicap stones
+Fails:     board not empty, bad list of vertices
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex get_handicap
+@item get_handicap: Get the handicap
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   handicap
+@end verbatim
+@cindex loadsgf
+@item loadsgf: Load an sgf file, possibly up to a move number or the first occurence of a move.           
+@verbatim
+Arguments: filename + move number, vertex, or nothing
+Fails:     missing filename or failure to open or parse file
+Returns:   color to play
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex color
+@item color: Return the color at a vertex.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex
+Returns:   "black", "white", or "empty"
+@end verbatim
+@cindex list_stones
+@item list_stones: List vertices with either black or white stones.
+@verbatim
+Arguments: color
+Fails:     invalid color
+Returns:   list of vertices
+@end verbatim
+@cindex countlib
+@item countlib: Count number of liberties for the string at a vertex.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   Number of liberties.
+@end verbatim
+@cindex findlib
+@item findlib: Return the positions of the liberties for the string at a vertex.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   Sorted space separated list of vertices.
+@end verbatim
+@cindex accuratelib
+@item accuratelib: Determine which liberties a stone of given color will get if played at given vertex.
+@verbatim
+Arguments: move (color + vertex)
+Fails:     invalid color, invalid vertex, occupied vertex
+Returns:   Sorted space separated list of liberties
+@end verbatim
+@cindex accurate_approxlib
+@item accurate_approxlib: Determine which liberties a stone of given color will get if played at given vertex.
+@verbatim
+Arguments: move (color + vertex)
+Fails:     invalid color, invalid vertex, occupied vertex
+Returns:   Sorted space separated list of liberties
+
+Supposedly identical in behavior to the above function and
+can be retired when this is confirmed.
+@end verbatim
+@cindex is_legal
+@item is_legal: Tell whether a move is legal.
+@verbatim
+Arguments: move
+Fails:     invalid move
+Returns:   1 if the move is legal, 0 if it is not.
+@end verbatim
+@cindex all_legal
+@item all_legal: List all legal moves for either color.
+@verbatim
+Arguments: color
+Fails:     invalid color
+Returns:   Sorted space separated list of vertices.
+@end verbatim
+@cindex captures
+@item captures: List the number of captures taken by either color.
+@verbatim
+Arguments: color
+Fails:     invalid color
+Returns:   Number of captures.
+@end verbatim
+@cindex last_move
+@item last_move: Return the last move.
+@verbatim
+Arguments: none
+Fails:     no previous move known
+Returns:   Color and vertex of last move.
+@end verbatim
+@cindex move_history
+@item move_history: Print the move history in reverse order
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   List of moves played in reverse order in format: 
+           color move (one move per line)
+@end verbatim
+@cindex invariant_hash
+@item invariant_hash: Return the rotation/reflection invariant board hash.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   Invariant hash for the board as a hexadecimal number.
+@end verbatim
+@cindex invariant_hash_for_moves
+@item invariant_hash_for_moves: Return the rotation/reflection invariant board hash obtained by playing all the possible moves for the
+           given color.
+@verbatim
+Arguments: color
+Fails:     invalid color
+Returns:   List of moves + invariant hash as a hexadecimal number,
+           one pair of move + hash per line.
+@end verbatim
+@cindex trymove
+@item trymove: Play a stone of the given color at the given vertex.
+@verbatim
+Arguments: move (color + vertex)
+Fails:     invalid color, invalid vertex, illegal move
+Returns:   nothing
+@end verbatim
+@cindex tryko
+@item tryko: Play a stone of the given color at the given vertex,  allowing illegal ko capture.
+@verbatim
+Arguments: move (color + vertex)
+Fails:     invalid color, invalid vertex, illegal move
+Returns:   nothing
+@end verbatim
+@cindex popgo
+@item popgo: Undo a trymove or tryko.
+@verbatim
+Arguments: none
+Fails:     stack empty
+Returns:   nothing
+@end verbatim
+
+@cindex clear_cache
+@item clear_cache: clear the caches.
+@verbatim
+Arguments: none.
+Fails:     never.
+Returns:   nothing.
+@end verbatim
+@cindex attack
+@item attack: Try to attack a string.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   attack code followed by attack point if attack code nonzero.
+@end verbatim
+@cindex attack_either
+@item attack_either: Try to attack either of two strings
+@verbatim
+Arguments: two vertices
+Fails:     invalid vertex, empty vertex
+Returns:   attack code against the strings.  Guarantees there
+           exists a move which will attack one of the two
+           with attack_code, but does not return the move.
+@end verbatim
+@cindex defend
+@item defend: Try to defend a string.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   defense code followed by defense point if defense code nonzero.
+@end verbatim
+@cindex does_attack
+@item does_attack: Examine whether a specific move attacks a string tactically.
+@verbatim
+Arguments: vertex (move), vertex (dragon)
+Fails:     invalid vertex, empty vertex
+Returns:   attack code
+@end verbatim
+@cindex does_defend
+@item does_defend: Examine whether a specific move defends a string tactically.
+@verbatim
+Arguments: vertex (move), vertex (dragon)
+Fails:     invalid vertex, empty vertex
+Returns:   attack code
+@end verbatim
+@cindex ladder_attack
+@item ladder_attack: Try to attack a string strictly in a ladder.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   attack code followed by attack point if attack code nonzero.
+@end verbatim
+@cindex increase_depths
+@item increase_depths: Increase depth values by one.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex decrease_depths
+@item decrease_depths: Decrease depth values by one.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex owl_attack
+@item owl_attack: Try to attack a dragon.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   attack code followed by attack point if attack code nonzero.
+@end verbatim
+@cindex owl_defend
+@item owl_defend: Try to defend a dragon.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   defense code followed by defense point if defense code nonzero.
+@end verbatim
+@cindex owl_threaten_attack
+@item owl_threaten_attack: Try to attack a dragon in 2 moves.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   attack code followed by the two attack points if
+           attack code nonzero.
+@end verbatim
+@cindex owl_threaten_defense
+@item owl_threaten_defense: Try to defend a dragon with 2 moves.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   defense code followed by the 2 defense points if
+           defense code nonzero.
+@end verbatim
+@cindex owl_does_attack
+@item owl_does_attack: Examine whether a specific move attacks a dragon.
+@verbatim
+Arguments: vertex (move), vertex (dragon)
+Fails:     invalid vertex, empty vertex
+Returns:   attack code
+@end verbatim
+@cindex owl_does_defend
+@item owl_does_defend: Examine whether a specific move defends a dragon.
+@verbatim
+Arguments: vertex (move), vertex (dragon)
+Fails:     invalid vertex, empty vertex
+Returns:   defense code
+@end verbatim
+@cindex owl_connection_defends
+@item owl_connection_defends: Examine whether a connection defends involved dragons.
+@verbatim
+Arguments: vertex (move), vertex (dragon1), vertex (dragon2)
+Fails:     invalid vertex, empty vertex
+Returns:   defense code
+@end verbatim
+@cindex defend_both
+@item defend_both: Try to defend both of two strings
+@verbatim
+Arguments: two vertices
+Fails:     invalid vertex, empty vertex
+Returns:   defend code for the strings.  Guarantees there
+           exists a move which will defend both of the two
+           with defend_code, but does not return the move.
+@end verbatim
+@cindex owl_substantial
+@item owl_substantial: Determine whether capturing a string gives a living dragon
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex, empty vertex
+Returns:   1 if dragon can live, 0 otherwise
+@end verbatim
+@cindex analyze_semeai
+@item analyze_semeai: Analyze a semeai
+@verbatim
+Arguments: dragona, dragonb
+Fails:     invalid vertices, empty vertices
+Returns:   semeai defense result, semeai attack result, semeai move
+@end verbatim
+@cindex analyze_semeai_after_move
+@item analyze_semeai_after_move: Analyze a semeai after a move have been made.
+@verbatim
+Arguments: color, vertex, dragona, dragonb
+Fails:     invalid vertices
+Returns:   semeai defense result, semeai attack result, semeai move
+@end verbatim
+@cindex tactical_analyze_semeai
+@item tactical_analyze_semeai: Analyze a semeai, not using owl
+@verbatim
+Arguments: dragona, dragonb
+Fails:     invalid vertices, empty vertices
+Returns:   status of dragona, dragonb assuming dragona moves first
+@end verbatim
+@cindex connect
+@item connect: Try to connect two strings.
+@verbatim
+Arguments: vertex, vertex
+Fails:     invalid vertex, empty vertex, vertices of different colors
+Returns:   connect result followed by connect point if successful.
+@end verbatim
+@cindex disconnect
+@item disconnect: Try to disconnect two strings.
+@verbatim
+Arguments: vertex, vertex
+Fails:     invalid vertex, empty vertex, vertices of different colors
+Returns:   disconnect result followed by disconnect point if successful.
+@end verbatim
+@cindex break_in
+@item break_in: Try to break from string into area.
+@verbatim
+Arguments: vertex, vertices
+Fails:     invalid vertex, empty vertex.
+Returns:   result followed by break in point if successful.
+@end verbatim
+@cindex block_off
+@item block_off: Try to block string from area.
+@verbatim
+Arguments: vertex, vertices
+Fails:     invalid vertex, empty vertex.
+Returns:   result followed by block point if successful.
+@end verbatim
+
+@cindex eval_eye
+@item eval_eye: Evaluate an eye space
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex
+Returns:   Minimum and maximum number of eyes. If these differ an
+           attack and a defense point are additionally returned.
+           If the vertex is not an eye space or not of unique color,
+           a single -1 is returned.
+@end verbatim
+
+@cindex dragon_status
+@item dragon_status: Determine status of a dragon.
+@verbatim
+Arguments: optional vertex
+Fails:     invalid vertex, empty vertex
+Returns:   status ("alive", "critical", "dead", or "unknown"),
+           attack point, defense point. Points of attack and
+           defense are only given if the status is critical.
+           If no vertex is given, the status is listed for all
+           dragons, one per row in the format "A4: alive".
+
+FIXME: Should be able to distinguish between life in seki
+       and independent life. Should also be able to identify ko.
+@end verbatim
+
+@cindex same_dragon
+@item same_dragon: Determine whether two stones belong to the same dragon.
+@verbatim
+Arguments: vertex, vertex
+Fails:     invalid vertex, empty vertex
+Returns:   1 if the vertices belong to the same dragon, 0 otherwise
+@end verbatim
+
+@cindex unconditional_status
+@item unconditional_status: Determine the unconditional status of a vertex.
+@verbatim
+Arguments: vertex
+Fails:     invalid vertex
+Returns:   unconditional status ("undecided", "alive", "dead",
+           "white_territory", "black_territory"). Occupied vertices can
+           be undecided, alive, or dead. Empty vertices can be
+           undecided, white territory, or black territory.
+@end verbatim
+
+@cindex combination_attack
+@item combination_attack: Find a move by color capturing something through a combination attack.
+@verbatim
+Arguments: color
+Fails:     invalid color
+Returns:   Recommended move, PASS if no move found
+@end verbatim
+
+@cindex combination_defend
+@item combination_defend: If color can capture something through a combination attack, list moves by the opponent of color
+           to defend against this attack.
+@verbatim
+Arguments: color
+Fails:     invalid color
+Returns:   Recommended moves, PASS if no combination attack found.
+@end verbatim
+
+@cindex aa_confirm_safety
+@item aa_confirm_safety: Run atari_atari_confirm_safety().
+@verbatim
+Arguments: move, optional int
+Fails:     invalid move
+Returns:   success code, if failure also defending move
+@end verbatim
+@cindex genmove_black
+@item genmove_black: Generate and play the supposedly best black move.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   a move coordinate or "PASS"
+
+Status:    Obsolete GTP version 1 command.
+@end verbatim
+@cindex genmove_white
+@item genmove_white: Generate and play the supposedly best white move.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   a move coordinate or "PASS"
+
+Status:    Obsolete GTP version 1 command.
+@end verbatim
+@cindex genmove
+@item genmove: Generate and play the supposedly best move for either color.
+@verbatim
+Arguments: color to move
+Fails:     invalid color
+Returns:   a move coordinate or "PASS" (or "resign" if resignation_allowed)
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex reg_genmove
+@item reg_genmove: Generate the supposedly best move for either color.
+@verbatim
+Arguments: color to move
+Fails:     invalid color
+Returns:   a move coordinate (or "PASS")
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex gg_genmove
+@item gg_genmove: Generate the supposedly best move for either color.
+@verbatim
+Arguments: color to move, optionally a random seed
+Fails:     invalid color
+Returns:   a move coordinate (or "PASS")
+
+This differs from reg_genmove in the optional random seed.
+@end verbatim
+@cindex restricted_genmove
+@item restricted_genmove: Generate the supposedly best move for either color from a choice of allowed vertices.
+@verbatim
+Arguments: color to move, allowed vertices
+Fails:     invalid color, invalid vertex, no vertex listed
+Returns:   a move coordinate (or "PASS")
+@end verbatim
+@cindex kgs-genmove_cleanup
+@item kgs-genmove_cleanup: Generate and play the supposedly best move for either color, not passing until all dead opponent stones have been removed.
+@verbatim
+Arguments: color to move
+Fails:     invalid color
+Returns:   a move coordinate (or "PASS")
+
+Status:    KGS specific command.
+
+A similar command, but possibly somewhat different, will likely be added
+to GTP version 3 at a later time.
+@end verbatim
+@cindex level
+@item level: Set the playing level.
+@verbatim
+Arguments: int
+Fails:     incorrect argument
+Returns:   nothing
+@end verbatim
+
+@cindex undo
+@item undo: Undo one move
+@verbatim
+Arguments: none
+Fails:     If move history is too short.
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+
+@cindex gg-undo
+@item gg-undo: Undo a number of moves
+@verbatim
+Arguments: optional int
+Fails:     If move history is too short.
+Returns:   nothing
+@end verbatim
+
+@cindex time_settings
+@item time_settings: Set time allowance
+@verbatim
+Arguments: int main_time, int byo_yomi_time, int byo_yomi_stones
+Fails:     syntax error
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+
+@cindex time_left
+@item time_left: Report remaining time
+@verbatim
+Arguments: color color, int time, int stones
+Fails:     syntax error
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex final_score
+@item final_score: Compute the score of a finished game.
+@verbatim
+Arguments: Optional random seed
+Fails:     never
+Returns:   Score in SGF format (RE property).
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex final_status
+@item final_status: Report the final status of a vertex in a finished game.
+@verbatim
+Arguments: Vertex, optional random seed
+Fails:     invalid vertex
+Returns:   Status in the form of one of the strings "alive", "dead",
+           "seki", "white_territory", "black_territory", or "dame".
+@end verbatim
+@cindex final_status_list
+@item final_status_list: Report vertices with a specific final status in a finished game.
+@verbatim
+Arguments: Status in the form of one of the strings "alive", "dead",
+           "seki", "white_territory", "black_territory", or "dame".
+           An optional random seed can be added.
+Fails:     missing or invalid status string
+Returns:   Vertices having the specified status. These are split with
+           one string on each line if the vertices are nonempty (i.e.
+           for "alive", "dead", and "seki").
+
+Status:    GTP version 2 standard command.
+           However, "dame", "white_territory", and "black_territory"
+           are private extensions.
+@end verbatim
+
+@cindex estimate_score
+@item estimate_score: Estimate the score
+@verbatim
+Arguments: None
+Fails:     never
+Returns:   upper and lower bounds for the score
+@end verbatim
+
+@cindex experimental_score
+@item experimental_score: Estimate the score, taking into account which player moves next
+@verbatim
+Arguments: Color to play
+Fails:     Invalid color
+Returns:   Score.
+
+This function generates a move for color, then adds the
+value of the move generated to the value of the position.
+Critical dragons are awarded to the opponent since the
+value of rescuing a critical dragon is taken into account
+in the value of the move generated.
+@end verbatim
+@cindex reset_life_node_counter
+@item reset_life_node_counter: Reset the count of life nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+
+Note: This function is obsolete and only remains for backwards
+compatibility.
+@end verbatim
+@cindex get_life_node_counter
+@item get_life_node_counter: Retrieve the count of life nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   number of life nodes
+
+Note: This function is obsolete and only remains for backwards
+compatibility.
+@end verbatim
+@cindex reset_owl_node_counter
+@item reset_owl_node_counter: Reset the count of owl nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex get_owl_node_counter
+@item get_owl_node_counter: Retrieve the count of owl nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   number of owl nodes
+@end verbatim
+@cindex reset_reading_node_counter
+@item reset_reading_node_counter: Reset the count of reading nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex get_reading_node_counter
+@item get_reading_node_counter: Retrieve the count of reading nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   number of reading nodes
+@end verbatim
+@cindex reset_trymove_counter
+@item reset_trymove_counter: Reset the count of trymoves/trykos.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex get_trymove_counter
+@item get_trymove_counter: Retrieve the count of trymoves/trykos.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   number of trymoves/trykos
+@end verbatim
+@cindex reset_connection_node_counter
+@item reset_connection_node_counter: Reset the count of connection nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex get_connection_node_counter
+@item get_connection_node_counter: Retrieve the count of connection nodes.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   number of connection nodes
+@end verbatim
+@cindex test_eyeshape
+@item test_eyeshape: Test an eyeshape for inconsistent evaluations
+@verbatim
+Arguments: Eyeshape vertices
+Fails:     Bad vertices
+Returns:   Failure reports on stderr.
+@end verbatim
+@cindex analyze_eyegraph
+@item analyze_eyegraph: Compute an eyevalue and vital points for an eye graph
+@verbatim
+Arguments: Eyeshape encoded in string
+Fails:     Bad eyeshape, analysis failed
+Returns:   Eyevalue, vital points
+@end verbatim
+@cindex cputime
+@item cputime: Returns elapsed CPU time in seconds.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   Total elapsed (user + system) CPU time in seconds.
+@end verbatim
+@cindex showboard
+@item showboard: Write the position to stdout.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex dump_stack
+@item dump_stack: Dump stack to stderr.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex initial_influence
+@item initial_influence: Return information about the initial influence function.
+@verbatim
+Arguments: color to move, what information
+Fails:     never
+Returns:   Influence data formatted like:
+
+  0.51   1.34   3.20   6.60   9.09   8.06   1.96   0.00   0.00 
+  0.45   1.65   4.92  12.19  17.47  15.92   4.03   0.00   0.00 
+                  .
+                  .
+                  .
+  0.00   0.00   0.00   0.00   0.00 100.00  75.53  41.47  23.41
+
+The available choices of information are:
+
+white_influence (float)
+black_influence (float)
+white_strength (float)
+black_strength (float)
+white_attenuation (float)
+black_attenuation (float)
+white_permeability (float)
+black_permeability (float)
+territory_value (float)
+influence_regions (int)
+non_territory (int)
+
+The encoding of influence_regions is as follows:
+ 4 white stone
+ 3 white territory
+ 2 white moyo
+ 1 white area
+ 0 neutral
+-1 black area
+-2 black moyo
+-3 black territory
+-4 black stone
+@end verbatim
+@cindex move_influence
+@item move_influence: Return information about the influence function after a move.
+@verbatim
+Arguments: move, what information
+Fails:     never
+Returns:   Influence data formatted like for initial_influence.
+@end verbatim
+@cindex move_probabilities
+@item move_probabilities: List probabilities of each move being played (when non-zero). If no previous genmove command has been issued, the result
+           of this command will be meaningless.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   Move, probabilty pairs, one per row.
+@end verbatim
+@cindex move_uncertainty
+@item move_uncertainty: Return the number of bits of uncertainty in the move. If no previous genmove command has been issued, the result
+           of this command will be meaningless.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   bits of uncertainty
+@end verbatim
+@cindex followup_influence
+@item followup_influence: Return information about the followup influence after a move.
+@verbatim
+Arguments: move, what information
+Fails:     never
+Returns:   Influence data formatted like for initial_influence.
+@end verbatim
+@cindex worm_data
+@item worm_data: Return the information in the worm data structure.
+@verbatim
+Arguments: optional vertex
+Fails:     never
+Returns:   Worm data formatted like:
+
+A19:
+color           black
+size            10
+effective_size  17.83
+origin          A19
+liberties       8
+liberties2      15
+liberties3      10
+liberties4      8
+attack          PASS
+attack_code     0
+lunch           B19
+defend          PASS
+defend_code     0
+cutstone        2
+cutstone2       0
+genus           0
+inessential     0
+B19:
+color           white
+.
+.
+.
+inessential     0
+C19:
+...
+
+If an intersection is specified, only data for this one will be returned.
+@end verbatim
+@cindex worm_stones
+@item worm_stones: List the stones of a worm
+@verbatim
+Arguments: the location, "BLACK" or "WHITE"
+Fails:     if called on an empty or off-board location
+Returns:   list of stones
+@end verbatim
+@cindex worm_cutstone
+@item worm_cutstone: Return the cutstone field in the worm data structure.
+@verbatim
+Arguments: non-empty vertex
+Fails:     never
+Returns:   cutstone
+@end verbatim
+@cindex dragon_data
+@item dragon_data: Return the information in the dragon data structure.
+@verbatim
+Arguments: optional intersection
+Fails:     never
+Returns:   Dragon data formatted in the corresponding way to worm_data.
+@end verbatim
+@cindex dragon_stones
+@item dragon_stones: List the stones of a dragon
+@verbatim
+Arguments: the location
+Fails:     if called on an empty or off-board location
+Returns:   list of stones
+@end verbatim
+@cindex eye_data
+@item eye_data: Return the information in the eye data structure.
+@verbatim
+Arguments: color, vertex
+Fails:     never
+Returns:   eye data fields and values, one pair per row
+@end verbatim
+@cindex half_eye_data
+@item half_eye_data: Return the information in the half eye data structure.
+@verbatim
+Arguments: vertex
+Fails:     never
+Returns:   half eye data fields and values, one pair per row
+@end verbatim
+@cindex start_sgftrace
+@item start_sgftrace: Start storing moves executed during reading in an sgf tree in memory. 
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+
+Warning: You had better know what you're doing if you try to use this
+         command.
+@end verbatim
+@cindex finish_sgftrace
+@item finish_sgftrace: Finish storing moves in an sgf tree and write it to file. 
+@verbatim
+Arguments: filename
+Fails:     never
+Returns:   nothing
+
+Warning: You had better know what you're doing if you try to use this
+         command.
+@end verbatim
+@cindex printsgf
+@item printsgf: Dump the current position as a static sgf file to filename, or as output if filename is missing or "-" 
+@verbatim
+Arguments: optional filename
+Fails:     never
+Returns:   nothing if filename, otherwise the sgf
+@end verbatim
+@cindex tune_move_ordering
+@item tune_move_ordering: Tune the parameters for the move ordering in the tactical reading.
+@verbatim
+Arguments: MOVE_ORDERING_PARAMETERS integers
+Fails:     incorrect arguments
+Returns:   nothing
+@end verbatim
+@cindex echo
+@item echo: Echo the parameter
+@verbatim
+Arguments: string
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex echo_err
+@item echo_err: Echo the parameter to stdout AND stderr
+@verbatim
+Arguments: string
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex help
+@item help: List all known commands
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   list of known commands, one per line
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex known_command
+@item known_command: Tell whether a command is known.
+@verbatim
+Arguments: command name
+Fails:     never
+Returns:   "true" if command exists, "false" if not
+
+Status:    GTP version 2 standard command.
+@end verbatim
+@cindex report_uncertainty
+@item report_uncertainty: Turn uncertainty reports from owl_attack and owl_defend on or off.
+@verbatim
+Arguments: "on" or "off"
+Fails:     invalid argument
+Returns:   nothing
+@end verbatim
+@cindex get_random_seed
+@item get_random_seed: Get the random seed
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   random seed
+@end verbatim
+@cindex set_random_seed
+@item set_random_seed: Set the random seed
+@verbatim
+Arguments: integer
+Fails:     invalid data
+Returns:   nothing
+@end verbatim
+@cindex advance_random_seed
+@item advance_random_seed: Advance the random seed by a number of games.
+@verbatim
+Arguments: integer
+Fails:     invalid data
+Returns:   New random seed.
+@end verbatim
+@cindex is_surrounded
+@item is_surrounded: Determine if a dragon is surrounded
+@verbatim
+Arguments: vertex (dragon)
+Fails:     invalid vertex, empty vertex
+Returns:   1 if surrounded, 2 if weakly surrounded, 0 if not
+@end verbatim
+@cindex does_surround
+@item does_surround: Determine if a move surrounds a dragon
+@verbatim
+Arguments: vertex (move), vertex (dragon)
+Fails:     invalid vertex, empty (dragon, nonempty (move)
+Returns:   1 if (move) surrounds (dragon)
+@end verbatim
+
+@cindex surround_map
+@item surround_map: Report the surround map for dragon at a vertex
+@verbatim
+Arguments: vertex (dragon), vertex (mapped location)
+Fails:     invalid vertex, empty dragon
+Returns:   value of surround map at (mapped location), or -1 if
+           dragon not surrounded.
+@end verbatim
+@cindex set_search_diamond
+@item set_search_diamond: limit search, and establish a search diamond
+@verbatim
+Arguments: pos
+Fails:     invalid value
+Returns:   nothing
+@end verbatim
+@cindex reset_search_mask
+@item reset_search_mask: unmark the entire board for limited search
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
+@cindex limit_search
+@item limit_search: sets the global variable limit_search
+@verbatim
+Arguments: value
+Fails:     invalid arguments
+Returns:   nothing
+@end verbatim
+@cindex set_search_limit
+@item set_search_limit: mark a vertex for limited search
+@verbatim
+Arguments: position
+Fails:     invalid arguments
+Returns:   nothing
+@end verbatim
+@cindex draw_search_area
+@item draw_search_area: Draw search area. Writes to stderr.
+@verbatim
+Arguments: none
+Fails:     never
+Returns:   nothing
+@end verbatim
diff --git a/doc/gtp.texi b/doc/gtp.texi
new file mode 100644 (file)
index 0000000..a51ec98
--- /dev/null
@@ -0,0 +1,396 @@
+             
+@menu
+* The Go Text Protocol::          The Go Text Protocol
+* Running in GTP mode::           Running GNU Go in GTP mode
+* GTP applications::              GTP applications
+* The Metamachine::               The Metamachine
+* Adding new GTP commands::       Adding new GTP commands
+* GTP command reference::         Details on every GTP command
+@end menu
+
+@node The Go Text Protocol
+@section The Go Text Protocol
+
+GNU Go 3.0 introduced a new interface, the Go Text Protocol, abbreviated
+GTP. The intention was to make an interface that is better suited for
+machine-machine communication than the ascii interface and simpler, more
+powerful, and more flexible than the Go Modem Protocol.
+
+There are two versions of the protocol. Version 1 was used with GNU Go
+3.0 and 3.2. GNU Go 3.4 and later versions use protocol version 2. The
+specification of GTP version 2 is available at
+@url{http://www.lysator.liu.se/~gunnar/gtp/}. GNU Go 3.4 is the
+reference implementation for GTP version 2, but all but the most common
+commands are to be regarded as private extensions of the protocol.
+
+The GTP has a variety of applications. For GNU Go the first use was in
+regression testing (@pxref{Regression}), followed by communication with
+the NNGS go server and for automated test games against itself and other
+programs. Now there are also many graphical user interfaces available
+supporting GTP, as well as bridges to other Go servers than NNGS.
+
+@node Running in GTP mode
+@section Running GNU Go in GTP mode
+
+To start GNU Go in GTP mode, simply invoke it with the option
+@option{--mode gtp}. You will not get a prompt or any other output to
+start with but GNU Go is silently waiting for GTP commands.
+
+A sample GTP session may look as follows:
+
+@example
+virihaure 462% ./gnugo --mode gtp
+1 boardsize 7
+=1
+
+2 clear_board
+=2
+
+3 play black D5
+=3
+
+4 genmove white
+=4 C3
+
+5 play black C3
+?5 illegal move
+
+6 play black E3
+=6
+
+7 showboard
+=7
+   A B C D E F G
+ 7 . . . . . . . 7
+ 6 . . . . . . . 6
+ 5 . . + X + . . 5
+ 4 . . . + . . . 4
+ 3 . . O . X . . 3
+ 2 . . . . . . . 2     WHITE (O) has captured 0 stones
+ 1 . . . . . . . 1     BLACK (X) has captured 0 stones
+   A B C D E F G
+
+8 quit
+=8
+
+@end example
+
+Commands are given on a single line, starting by an optional identity
+number, followed by the command name and its arguments.
+
+If the command is successful, the response starts by an equals sign
+(@samp{=}), followed by the identity number of the command (if any) and
+then the result. In this example all results were empty strings except
+for command 4 where the answer was the white move at C3, and command 7
+where the result was a diagram of the current board position. The
+response ends by two consecutive newlines.
+
+Failing commands are signified by a question mark (@samp{?}) instead of
+an equals sign, as in the response to command 5.
+
+The detailed specification of the protocol can be found at
+@url{http://www.lysator.liu.se/~gunnar/gtp/}. The available commands in
+GNU Go may always be listed using the command @command{list_commands}.
+They are also documented in @xref{GTP command reference}.
+
+
+@node GTP applications
+@section GTP applications
+
+GTP is an asymmetric protocol involving two parties which we call
+controller and engine. The controller sends all commands and the engine
+only responds to these commands. GNU Go implements the engine end of the
+protocol.
+
+With the source code of GNU Go is also distributed a number of
+applications implementing the controller end. Among the most interesting of
+these are:
+
+@itemize
+@item @file{regression/regress.awk}
+@quotation
+Script to run regressions. The script sends GTP commands to set up and
+evaluate positions to the engine and then analyzes the responses from
+the engine. More information about GTP based regression testing can be
+found in the regression chapter (@pxref{Regression}).
+@end quotation
+@item @file{regression/regress.pl}
+@quotation
+Perl script to run regressions, giving output which together with the
+CGI script @file{regression/regress.plx} generates HTML views of the
+regressions.
+@end quotation
+@item @file{regression/regress.pike}
+@quotation
+Pike script to run regressions. More feature-rich and powerful than
+@file{regress.awk}.
+@end quotation
+@item @file{regression/view.pike}
+@quotation
+Pike script to examine a single regression testcase through a graphical
+board. This gives an easy way to inspect many of the GNU Go internals.
+@end quotation
+@item @file{interface/gtp_examples/twogtp}
+@quotation
+Perl script to play two engines against each other. The script
+essentially sets up both engines with desired boardsize, handicap, and
+komi, then relays moves back and forth between the engines.
+@end quotation
+@item @file{interface/gtp_examples/twogtp-a}
+@quotation
+An alternative Perl implementation of twogtp.
+@end quotation
+@item @file{interface/gtp_examples/twogtp.py}
+@quotation
+Implementation of twogtp in Python. Has more features than the Perl
+variants.
+@end quotation
+@item @file{interface/gtp_examples/twogtp.pike}
+@quotation
+Implementation of twogtp in Pike. Has even more features than the Python
+variant.
+@end quotation
+@item @file{interface/gtp_examples/2ptkgo.pl}
+@quotation
+Variation of twogtp which includes a graphical board.
+@end quotation
+@end itemize
+
+More GTP applications, including bridges to go servers and graphical
+user interfaces, are listed at
+@url{http://www.lysator.liu.se/~gunnar/gtp/}.
+
+@node The Metamachine
+@section The Metamachine
+
+An interesting application of the GTP is the concept of
+using GNU Go as an ``Oracle'' that can be consulted by another
+process. This could be another computer program that asks GNU Go
+to generate future board positions, then evaluate them.
+
+David Doshay at the University of California at Santa Cruz has done
+interesting experiments with a parallel engine, known as SlugGo, that is based
+on GNU Go.  These are described in
+@url{http://lists.gnu.org/archive/html/gnugo-devel/2004-08/msg00060.html}.
+
+The ``Metamachine'' experiment is a more modest approach using the GTP to
+communicate with a GNU Go process that is used as an oracle. The following
+scheme is used.
+
+@itemize @bullet
+@item The GNU Go ``oracle'' is asked to generate its top moves using
+the GTP @code{top_moves} commands.
+@item Both moves are tried and @code{estimate_score} is called
+from the resulting board position.
+@item The higher scoring position is selected as the engine's move.
+@end itemize
+
+This scheme does not produce a stronger engine, but it is
+suggestive, and the SlugGo experiment seems to show that a
+more elaborate scheme along the same lines could produce
+a stronger engine.
+
+Two implementations are distributed with GNU Go. Both make use of
+@command{fork} and @command{pipe} system calls, so they require a Unix-like
+environment.  The Metamachine has been tested under GNU/Linux.
+
+@strong{Important:} If the Metamachine terminates normally, the GNU Go
+process will be killed. However there is a danger that
+something will go wrong. When you are finished running the
+Metamachine, it is a good idea to run @command{ps -A|grep gnugo}
+or @command{ps -aux|grep gnugo} to make sure there are no
+unterminated processes. (If there are, just kill them.)
+
+@subsection The Standalone Metamachine
+
+In @file{interface/gtp_examples/metamachine.c} is a standalone
+implementation of the Metamachine. Compile it with
+@command{cc -o metamachine metamachine.c} and run it. It forks
+a @code{gnugo} process with which it communicates through the
+GTP, to use as an oracle. 
+
+The following scheme is followed:
+
+@example
+             stdin             pipe a
+  GTP client ----> Metamachine -----> GNU Go
+             <----             <-----
+            stdout             pipe b
+@end example
+
+Most commands issued by the client are passed along
+verbatim to GNU Go by the Metamachine. The exception
+is gg_genmove, which is intercepted then processed differently,
+as described above. The client is unaware of this, and only
+knows that it issued a gg_genmove command and received a reply.
+Thus to the the Metamachine appears as an ordinary GTP engine.
+
+Usage: no arguments gives normal GTP behavior.
+@command{metamachine --debug} sends diagnostics to stderr.
+
+@subsection GNU Go as a Metamachine
+
+Alternatively, you may compile GNU Go with the configure option
+@option{--enable-metamachine}. This causes the file
+@code{oracle.c} to be compiled, which contains the Metamachine
+code. This has no effect on the engine unless you run GNU
+Go with the runtime option @option{--metamachine}. Thus
+you must use both the configure and the runtime option
+to get the Metamachine.
+
+This method is better than the standalone program since
+you have access to GNU Go's facilities. For example, you
+can run the Metamachine with CGoban or in Ascii mode this
+way.
+
+You can get traces by adding the command line
+@option{-d0x1000000}. In debugging the Metamachine, a danger is
+that any small oversight in designing the program can cause the
+forked process and the controller to hang, each one waiting for
+a response from the other. If this seems to happen it is useful
+to know that you can attach @code{gdb} to a running process and
+find out what it is doing.
+
+@node Adding new GTP commands
+@section Adding new GTP commands
+
+The implementation of GTP in GNU Go is distributed over three files,
+@file{interface/gtp.h}, @file{interface/gtp.c}, and
+@file{interface/play_gtp.c}. The first two implement a small library of
+helper functions which can be used also by other programs. In the
+interest of promoting the GTP they are licensed with minimal
+restrictions (@pxref{GTP License}). The actual GTP commands are
+implemented in @file{play_gtp.c}, which has knowledge about the engine
+internals. 
+
+To see how a simple but fairly typical command is implemented we look at
+@code{gtp_countlib()} (a GNU Go private extension command):
+
+@example
+static int
+gtp_countlib(char *s)
+@{
+  int i, j;
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  return gtp_success("%d", countlib(POS(i, j)));
+@}
+@end example
+
+The arguments to the command are passed in the string @code{s}. In this
+case we expect a vertex as argument and thus try to read it with
+@code{gtp_decode_coord()} from @file{gtp.c}.
+
+A correctly formatted response should start with either @samp{=} or
+@samp{?}, followed by the identity number (if one was sent), the actual
+result, and finally two consecutive newlines. It is important to get
+this formatting correct since the controller in the other end relies on
+it. Naturally the result itself cannot contain two consecutive newlines
+but it may be split over several lines by single newlines.
+
+The easiest way to generate a correctly formatted response is with one
+of the functions @code{gtp_failure()} and @code{gtp_success()}, assuming
+that their formatted output does not end with a newline. 
+
+Sometimes the output is too complex for use with gtp_success, e.g. if
+we want to print vertices, which gtp_success() does not
+support. Then we have to fall back to the construction in e.g.
+@code{gtp_genmove()}:
+
+@example
+static int
+gtp_genmove(char *s)
+@{
+  [...]
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(i, j);
+  return gtp_finish_response();
+@}
+@end example
+
+Here @code{gtp_start_response()} writes the equal sign and the identity
+number while @code{gtp_finish_response()} adds the final two newlines.
+The next example is from @code{gtp_list_commands()}:
+
+@example
+static int
+gtp_list_commands(char *s)
+@{
+  int k;
+  UNUSED(s);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  for (k = 0; commands[k].name != NULL; k++)
+    gtp_printf("%s\n", commands[k].name);
+
+  gtp_printf("\n");
+  return GTP_OK;
+@}
+@end example
+
+As we have said, the response should be finished with two newlines.
+Here we have to finish up the response ourselves since we already have
+one newline in place from the last command printed in the loop.
+
+In order to add a new GTP command to GNU Go, the following pieces of
+code need to be inserted in @file{play_gtp.c}:
+@enumerate
+@item A function declaration using the @code{DECLARE} macro in the list
+starting at line 68.
+@item An entry in the @code{commands[]} array starting at line 200.
+@item An implementation of the function handling the command.
+@end enumerate
+
+Useful helper functions in @file{gtp.c}/@file{gtp.h} are:
+@itemize
+@item @code{gtp_printf()} for basic formatted printing.
+@item @code{gtp_mprintf()} for printing with special format codes for
+vertices and colors.
+@item @code{gtp_success()} and @code{gtp_failure()} for simple responses.
+@item @code{gtp_start_response()} and @code{gtp_end_response()} for more
+complex responses.
+@item @code{gtp_print_vertex()} and @code{gtp_print_vertices()} for
+printing one or multiple vertices.
+@item @code{gtp_decode_color()} to read in a color from the command arguments.
+@item @code{gtp_decode_coord()} to read in a vertex from the command arguments.
+@item @code{gtp_decode_move()} to read in a move, i.e. color plus
+vertex, from the command arguments. 
+@end itemize
+
+
+@node GTP command reference
+@section GTP command reference
+@cindex GTP command reference
+
+This section lists the GTP commands implemented in GNU Go along with
+some information about each command. Each entry in the list has the
+following fields:
+
+@itemize @bullet
+@item Function: What this command does.
+@item Arguments: What other information, if any, this command requires.
+Typical values include @dfn{none} or @dfn{vertex} or @dfn{integer} (there
+are others).
+@item Fails: Circumstances which cause this command to fail.
+@item Returns: What is displayed after the @dfn{=} and before the two
+newlines.  Typical values include @dfn{nothing} or @dfn{a move coordinate}
+or some status string (there are others).
+@item Status: How this command relates to the standard GTP version 2
+commands. If nothing else is specified it is a GNU Go private extension.
+@end itemize
+
+Without further ado, here is the big list (in no particular order).
+
+Note: if new commands are added by editing @file{interface/play_gtp.c} this
+list could become incomplete. You may rebuild this list in
+@file{doc/gtp-commands.texi} with the command @command{make gtp-commands}
+in the @file{doc/} directory. This may require GNU sed.
+
+@itemize @bullet
+@include gtp-commands.texi
+@end itemize
diff --git a/doc/influence.texi b/doc/influence.texi
new file mode 100644 (file)
index 0000000..8716a84
--- /dev/null
@@ -0,0 +1,1153 @@
+@menu
+* Influential Concepts::        Conceptual Outline of Influence
+* Territory and Moyo::         Territory, Moyo and Area
+* Influence Usage::            Where influence gets used in the engine
+* Influence and Territory::     Influence and Territory
+* Territorial Details::                Details of the Territory Valuation
+* The Influence Core::          The Core of the Influence Function
+* The Influence Algorithm::     The algorithm of @code{accumlate_influence()}
+* Permeability::                Permeability
+* Escape::                      Escape
+* Break Ins::                   Break Ins
+* Surrounded Dragons::          Surrounded Dragons
+* Influential Patterns::       Patterns used by the Influence module
+* Influential Display::         Colored display and debugging of influence
+* Influence Tuning::            Influence tuning with view.pike
+@end menu
+
+@node Influential Concepts
+@section Conceptual Outline of Influence
+
+We define call stones @dfn{lively} if they cannot be tactically
+attacked, or if they have a tactical defense and belong to the player
+whose turn it is. Similarly, stones that cannot be strategically attacked
+(in the sense of the life-and-death analysis), or that have a strategical
+defense and belong to the player to move, are called @dfn{alive}.
+If we want to use the influence function before deciding the strategical
+status, all lively stones count as alive.
+
+Every alive stone on the board works as an influence source, with
+influence of its color radiating outwards in all directions. The
+strength of the influence declines exponentially with the distance
+from the source.
+
+Influence can only flow unhindered if the board is empty, however. All
+lively stones (regardless of color) act as influence barriers, as do
+connections between enemy stones that can't be broken through. For
+example the one space jump counts as a barrier unless either of the
+stones can be captured. Notice that it doesn't matter much if the
+connection between the two stones can be broken, since in that case
+there would come influence from both directions anyway.
+
+From the influence of both colors we compute a territorial value between
+-1.0 and +1.0 for each intersection, which can be seen as the likely hood
+of it becoming territory for either color.
+
+In order to avoid finding bogus territory, we add extra influence
+sources at places where an invasion can be launched, e.g. at 3-3 under
+a handicap stone, in the middle of wide edge extensions and in the
+center of large open spaces anywhere. Similarly we add extra influence
+sources where intrusions can be made into what otherwise looks as
+solid territory, e.g. monkey jumps. These intrusions depend on whose
+turn we assume it to be.
+
+All these extra influence sources, as well as connections, are controlled
+by a pattern database, which consists of the two files patterns/influence.db
+and patterns/barriers.db. The details are explained in
+@ref{Influential Patterns}.
+
+@node Territory and Moyo
+@section Territory, Moyo and Area
+@cindex territory
+@cindex moyo
+@cindex area
+
+Using the influence code, empty regions of the board are partitioned
+in three ways. A vertex may be described as White or Black's 
+@dfn{territory}, @dfn{moyo} or @dfn{area}. The functions
+@code{whose_territory()}, @code{whose_moyo()} and @code{whose_area()}
+will return a color, or EMPTY if it belongs to one player or the
+other in one of these classifications.
+
+@itemize @bullet
+@item Territory
+@quotation
+Those parts of the board which are expected to materialize
+as actual points for one player or the other at the end of
+the game are considered @dfn{territory}.
+@end quotation
+@item Moyo
+@quotation
+Those parts of the board which are either already territory or more generally
+places where a territory can easily materialize if the opponent neglects to
+reduce are considered @dfn{moyo}.
+@dfn{moyo}.
+@end quotation
+@item Area
+@quotation
+Those parts of the board where one player or the other has a
+stronger influence than his opponent are considered @dfn{area}.
+@end quotation
+@end itemize
+
+Generally territory is moyo and moyo is area. To get a feeling
+for these concepts, load an sgf file in a middle game position
+with the option @option{-m 0x0180} and examine the resulting
+diagrams (@pxref{Influential Display}).
+
+@node Influence Usage
+@section Where influence gets used in the engine
+
+The information obtained from the influence computation is used in a variety
+of places in the engine, and the influence module is called several times
+in the process of the move generation. The details of the influence
+computation vary according to the needs of the calling function.
+
+After GNU Go has decided about the tactical stability of strings, the
+influence module gets called the first time. Here all lively stones act
+as an influence source of default strength 100. The result is stored in
+the variables @code{initial_influence} and @code{initial_opposite_influence},
+and it is used as an important information for guessing the strength of
+dragons. For example, a dragon that is part of a moyo of size 25 is
+immediately considered alive.  For dragons with a smaller moyo size, a
+life-and-death analysis will be done by the owl code (see @ref{Pattern Based
+Reading}). A dragon with a moyo size of only 5 will be considered weak, even
+if the owl code has decided that it cannot be killed.
+
+As a tool for both the owl code and the strength estimate of dragons,
+an "escape" influence gets computed for each dragon (@pxref{Escape}).
+
+Once all dragons have been evaluated, the influence module is called again
+and the variables @code{initial_influence} and
+@code{initial_opposite_influence} get overwritten. Of course, the dragon
+status', which are available now, are taken into account. Stones belonging
+to a dead dragon will not serve as an influence source, and the strengths of
+other stones get adjusted according to the strength of their respective
+dragon.
+
+The result of this run is the most important tool for move evaluation. All
+helper functions of patterns as explained in @ref{Patterns} that
+refer to influence results (e. g. @code{olib(*)} etc.) actually use these
+results. Further, @code{initial_influence} serves as the reference for
+computing the territorial value of a move. That is, from the influence
+strengths stored in @code{initial_influence}, a territory value is
+assigned to each intersection. This value is supposed to estimate the
+likelyhood that this intersection will become white or black territory.
+
+Then, for each move that gets considered in the function @code{value_moves},
+the influence module is called again via the function
+@code{compute_move_influence} to assess the likely territorial balance after
+this move, and the result is compared with the state before that move.
+
+An additional influence computation is done in order to compute the followup
+value of a move. Some explainations are in @ref{Territorial Details}.
+
+Some of the public functions from @file{influence.c} which are used
+throughout the engine are listed in @ref{Influence Utilities}.
+
+@node Influence and Territory
+@section Influence and Territory
+
+In this section we consider how the influence function is used to
+estimate territory in the function @code{estimate_territorial_value()}.
+
+A move like @samp{*} by @samp{O} below is worth one point:
+
+@example
+OXXX.
+OX.XX
+O*a.X
+OX.XX
+OXXX.
+@end example
+
+This is evaluated by the influence function in the following way:
+We first assign territory under the assumption that X moves first in all
+local positions in the original position;  then we reassing territory,
+again under the assumption that @samp{X} moves first in all local positions,
+but after we let @samp{O} make the move at @samp{*}. These two
+territory assignments are compared and the difference gives the
+territorial value of the move.
+
+Technically, the assumption that @samp{X} plays first everywhere is
+implemented via an asymmetric pattern database in @code{barriers.db}.
+What exactly is a safe connection that stops hostile influence from
+passing through is different for @samp{O} and @samp{X}; of course such a
+connection has to be tighter for stones with color @samp{O}. Also,
+additional intrusion influence sources are added for @samp{X} in places
+where @samp{X} stones have natural followup moves.
+
+In this specific example above, the asymmetry (before any move has been made)
+would turn out as follows: If @samp{X} is in turn to move, the white influence
+would get stopped by a barrier at @samp{*}, leaving 4 points of territory
+for @samp{X}.  However, if @samp{O} was next to move, then a followup move
+for the white stones at the left would be assumed in the form of an extra
+("intrusion") influence source at @samp{*}. This would get stopped at
+@samp{a}, leaving three points of territory.
+
+Returning to the valuation of a move by @samp{O} at @samp{*}, we get a
+value of 1 for the move at @samp{*}.
+However, of course this move is sente once it is worth playing, and should
+therefore (in miai counting) be awarded an effective value of 2. Hence we
+need to recognize the followup value of a move. GNU Go 3.0 took care of
+this by using patterns in @code{patterns.db} that enforced an explicit
+followup value. Versions from 3.2 on instead compute a seperate followup
+influence to each move considered. In the above example, an intrusion source
+will be added at @samp{a} as a followup move to @samp{*}. This destroys all of
+Black's territory and hence gives a followup value of 3.
+
+The pattern based followup value are still needed at some places, however.
+
+To give another example, consider this position where we want to
+estimate the value of an @samp{O} move at @samp{*}:
+
+@example
+OOOXXX
+..OX..
+..OX..
+...*..
+------
+@end example
+
+Before the move we assume @samp{X} moves first in the local position (and
+that @samp{O} has to connect), which gives territory like this (lower case
+letter identify territory for each player):
+
+@example
+OOOXXX
+ooOXxx
+o.OXxx
+o...xx
+------
+@end example
+
+Then we let @samp{O} make the move at @samp{*} and assume
+@samp{X} moves first again next.  The territory then becomes (@samp{X}
+is also assumed to have to connect):
+
+@example
+OOOXXX
+ooOXxx
+ooOX.x
+oo.O.x
+------
+@end example
+
+We see that this makes a difference in territory of 4, which is what
+influence_delta_territory() should report. Then again, we have followup
+value, and here also a reverse followup value. The reverse followup value,
+which in this case will be so high that the move is treated as reverse
+sente, is added by an explicit pattern. Other sources for followup or
+reverse followup values are threats to capture a rescue a string of stones.
+See the code and comments in the function @code{value_move_reaons} for how
+followup and reverse followup values are used to adjust the effective 
+move value.
+
+To give an example of territorial value where something is captured,
+consider the @samp{O} move at @samp{*} here,
+
+@example
+XXXXXXXO
+X.OOOOXO
+X.O..O*O
+--------
+@end example
+
+As before we first let the influence function determine territory
+assuming X moves first, i.e. with a captured group:
+
+@example
+XXXXXXXO
+XxyyyyXO
+Xxyxxy.O
+--------
+@end example
+
+Here @samp{y} indicates @samp{X} territory + captured stone,
+i.e. these count for two points. After the @samp{O} move at @samp{*} we
+instead get
+
+@example
+XXXXXXXO
+X.OOOOXO
+X.OooOOO
+--------
+@end example
+
+and we see that @samp{X} has 16 territory fewer and @samp{O}
+has two territory more, for a total difference of 18 points.
+
+That the influence function counts the value of captured stones was
+introduced in GNU Go 3.2. Previously this was instead done using the
+effective_size heuristic. The effective size is the number of
+stones plus the surrounding empty spaces which are closer to
+this string or dragon than to any other stones. Here the @samp{O}
+string would thus have effective size 6 (number of stones) + 2
+(interior eye) + 2*0.5 (the two empty vertices to the left of
+the string, split half each with the surrounding X string) +
+1*0.33 (the connection point, split between three strings) =
+9.33. As noted this value was doubled, giving 18.67 which is
+reasonably close to the correct value of 18. The effective size
+heuristic is still used in certain parts of the move valuation
+where we can't easily get a more accurate value from the
+influence function (e. g. attacks depending on a ko, attack threats).
+
+Note that this section only describes the territorial valuation of a move.
+Apart from that, GNU Go uses various heuristics in assigning a strategical
+value (weakening and strengthening of other stones on the board) to a move.
+Also, the influence function isn't quite as well tuned as the examples above
+may seem to claim. But it should give a fairly good idea of how the design
+is intended.
+
+Another matter is that so far we have only considered the change in secure
+territory. GNU Go 3.2 and later versions use a revised heuristic, which
+is explained in the next section, to assign probable territory to each
+player.
+
+@node Territorial Details
+@section Details of the Territory Valuation
+
+This section explains how GNU Go assigns a territorial value to an
+intersection once the white and black influence have been computed.
+The intention is that an intersection that has a chance of xx% of
+becoming white territory is counted as 0.xx points of territory for
+white, and similar for black.
+
+The algorithm in the function @code{new_value_territory} goes roughly
+as follows:
+
+If @code{wi} is the white influence at a point, and @code{bi} the black
+influence, then @code{ value = ( (wi-bi)/ (wi+bi) )^3} (positive values
+indicates likley white territory, negative stand for black territory)
+turns out to be very simple first guess that is still far off, but
+reasonable enough to be useful.
+
+This value is then suspect a number of corrections. Assume that this first
+guess resulted in a positive value.
+
+If both @code{bi} and @code{wi} are small, it gets reduced. What exactly is
+"small" depends on whether the intersection is close to a corner or an edge
+of the board, since it is easier to claim territory in the corner than in
+the center.
+
+Then the value at each intersection is degraded to the minimum value of
+its neighbors. This can be seen as a second implementation of the proverb
+saying that there is no territory in the center of the board. This step
+substantially reduces the size of spheres of territory that are open at
+several sides.
+
+Finally, there are a number of patterns that explicitly forbid GNU Go to
+count territory at some intersections. This is used e. g. for false eyes that
+will eventually have to be filled in. Also, points for prisoners are added.
+
+To fine tune this scheme, some revisions have been made to the influence
+computations that are relevant for territorial evaluation. This includes
+a reduced default attenuation and some revised pattern handling.
+
+@node The Influence Core
+@section The Core of the Influence Function
+
+The basic influence radiation process can efficiently be implemented
+as a breadth first search for adjacent and more distant points, using
+a queue structure.
+
+Influence barriers can be found by pattern matching, assisted by
+reading through constraints and/or helpers. Wall structures, invasion
+points and intrusion points can be found by pattern matching as well.
+
+When influence is computed, the basic idea is that there are a number
+of influence sources on the board, whose contributions are summed to
+produce the influence values. For the time being we can assume that
+the living stones on the board are the influence sources, although
+this is not the whole story.
+
+The function @code{compute_influence()} contains a loop over the
+board, and for each influence source on the board, the function
+@code{accumulate_influence()} is called. This is the core of the
+influence function. Before we get into the details, this is how
+the influence field from a single isolated influence source of
+strength 100 turns out (with an attenuation of 3.0):
+
+@example
+  0  0  0  0  0  0  0  0  0  0  0
+  0  0  0  0  1  1  1  0  0  0  0
+  0  0  0  1  2  3  2  1  0  0  0
+  0  0  1  3  5 11  5  3  1  0  0
+  0  1  2  5 16 33 16  5  2  1  0
+  0  1  3 11 33  X 33 11  3  1  0
+  0  1  2  5 16 33 16  5  2  1  0
+  0  0  1  3  5 11  5  3  1  0  0
+  0  0  0  1  2  3  2  1  0  0  0
+  0  0  0  0  1  1  1  0  0  0  0
+  0  0  0  0  0  0  0  0  0  0  0
+@end example
+
+These values are in reality floating point numbers but have been
+rounded down to the nearest integer for presentation. This means that
+the influence field does not stop when the numbers become zeroes.
+
+Internally @code{accumulate_influence()} starts at the influence source and
+spreads influence outwards by means of a breadth first propagation,
+implemented in the form of a queue. The order of propagation and the
+condition that influence only is spread outwards guarantee that no
+intersection is visited more than once and that the process
+terminates. In the example above, the intersections are visited in the
+following order:
+
+@example
+  +  +  +  +  +  +  +  +  +  +  +
+  + 78 68 66 64 63 65 67 69 79  +
+  + 62 46 38 36 35 37 39 47 75  +
+  + 60 34 22 16 15 17 23 43 73  +
+  + 58 32 14  6  3  7 19 41 71  +
+  + 56 30 12  2  0  4 18 40 70  +
+  + 57 31 13  5  1  8 20 42 72  +
+  + 59 33 21 10  9 11 24 44 74  +
+  + 61 45 28 26 25 27 29 48 76  +
+  + 77 54 52 50 49 51 53 55 80  +
+  +  +  +  +  +  +  +  +  +  +  +
+@end example
+
+The visitation of intersections continues in the same way on the
+intersections marked '@samp{+} and further outwards. In a real
+position there will be stones and tight connections stopping the
+influence from spreading to certain intersections. This will
+disrupt the diagram above, but the main property of the
+propagation still remains, i.e. no intersection is visited more
+than once and after being visited no more influence will be
+propagated to the intersection.
+
+@node The Influence Algorithm
+@section The Influence Algorithm
+
+Let @code{(m, n)} be the coordinates of the influence source and
+@code{(i, j)} the coordinates of a an intersection being visited
+during propagation, using the same notation as in the
+@code{accumulate_influence()} function.  Influence is now propagated to
+its eight closest neighbors, including the diagonal ones,
+according to the follow scheme:
+
+For each of the eight directions @code{(di, dj)}, do:
+
+@enumerate 
+@item 
+Compute the scalar product @code{di*(i-m) + dj*(j-n)}
+between the vectors @code{(di,dj)} and @code{(i,j) - (m,n)}
+@item If this is negative or zero, the direction is not outwards and
+we continue with the next direction. The exception is when we
+are visiting the influence source, i.e. the first intersection,
+when we spread influence in all directions anyway.
+@item If @code{(i+di, j+dj)} is outside the board or occupied we
+also continue with the next direction.
+@item Let S be the strength of the influence at @code{(i, j)}. The influence
+propagated to @code{(i+di, j+dj)} from this intersection is given by
+@code{P*(1/A)*D*S}, where the three different kinds of damping are:
+
+@itemize @bullet
+@item The permeability @samp{P}, which is a property of the board
+intersections. Normally this is one, i.e. unrestricted
+propagation, but to stop propagation through e.g. one step
+jumps, the permeability is set to zero at such intersections
+through pattern matching. This is further discussed below.
+@item The attenuation @samp{A}, which is a property of the influence
+source and different in different directions. By default this has the
+value 3 except diagonally where the number is twice as much. By
+modifying the attenuation value it is possible to obtain influence
+sources with a larger or a smaller effective range.
+@item The directional damping @samp{D}, which is the squared cosine of the
+angle between @code{(di,dj)} and @code{(i,j) - (m,n)}. The idea is to
+stop influence from "bending" around an interfering stone and
+get a continuous behavior at the right angle cutoff. The
+choice of the squared cosine for this purpose is rather
+arbitrary, but has the advantage that it can be expressed as a
+rational function of @samp{m}, @samp{n}, @samp{i}, @samp{j},
+@samp{di}, and @samp{dj}, without involving any trigonometric or
+square root computations. When we are visiting the influence
+source we let by convention this factor be one.
+@end itemize
+@end enumerate
+
+Influence is typically contributed from up to three neighbors
+"between" this intersection and the influence source. These values are
+simply added together. As pointed out before, all contributions will
+automatically have been made before the intersection itself is
+visited.
+
+When the total influence for the whole board is computed by
+@code{compute_influence()}, @code{accumulate_influence()} is
+called once for each influence source. These invocations are
+totally independent and the influence contributions from the
+different sources are added together.
+
+@node Permeability
+@section Permeability
+
+The permeability at the different points is initially one at all empty
+intersections and zero at occupied intersections. To get a useful
+influence function we need to modify this, however. Consider the
+following position:
+
+@example
+|......
+|OOOO..
+|...O..
+|...a.X   ('a' empty intersection)
+|...O..
+|...OOO
+|.....O
++------
+@end example
+
+The corner is of course secure territory for @samp{O} and clearly
+the @samp{X} stone has negligible effect inside this position. To
+stop @samp{X} influence from leaking into the corner we use pattern
+matching (pattern Barrier1/Barrier2 in @file{barriers.db}) to modify the
+permeability for @samp{X} at this intersection to zero. @samp{O} can still
+spread influence through this connection.
+
+Another case that needs to be mentioned is how the permeability
+damping is computed for diagonal influence radiation. For horizontal
+and vertical radiation we just use the permeability (for the relevant
+color) at the intersection we are radiating from. In the diagonal case
+we additionally multiply with the maximum permeability at the two
+intersections we are trying to squeeze between. The reason for this
+can be found in the diagram below:
+
+@example
+|...X    |...X    
+|OO..    |Oda.
+|..O.    |.bc.
+|..O.    |..O.
++----    +----
+@end example
+
+We don't want @samp{X} influence to be spread from @samp{a} to
+@samp{b}, and since the permeability at both c and d is zero, the
+rule above stops this.
+
+@node Escape
+@section Escape
+
+One application of the influence code is in computing the
+@code{dragon.escape_route} field. This is computed by the function
+@code{compute_escape()} as follows.  First, every intersection is
+assigned an escape value, ranging between 0 and 4, depending on
+the influence value of the opposite color.
+
+The @code{escape_route} field is modified by the code in @file{surround.c}
+(@pxref{Surrounded Dragons}). It is divided by two for weakly surrounded
+dragons, and set to zero for surrounded ones.
+
+In addition to assiging an escape value to empty vertices,
+we also assign an escape value to friendly dragons. This
+value can range from 0 to 6 depending on the status of 
+the dragon, with live dragons having value 6.
+
+Then we sum the values of the resulting influence escape values
+over the intersections (including friendly dragons) at distance 4,
+that is, over those intersections which can be joined to the
+dragon by a path of length 4 (and no shorter path) not passing
+adjacent to any unfriendly dragon. In the following example, we
+sum the influence escape value over the four vertices labelled
+'4'.
+
+@example
+   
+   . . . . . . . . .    . . . . . . . . .
+   . . . . . X . . O    . . . . . X . . O
+   . . X . . . . . O    . . X . 2 . 4 . O
+   X . . . . . . . .    X . . 1 1 2 3 4 .
+   X O . O . . . . O    X O 1 O 1 2 3 4 O
+   X O . O . . . . .    X O 1 O 1 . 4 . .
+   X O . . . X . O O    X O 1 . . X . . O
+   . . . X . . . . .    . 1 . X . . . . .
+   X . . . . X . . .    X . . . . X . . .
+   . . . . . . . . .    . . . . . . . . .
+
+@end example
+
+Since the dragon is trying to reach safety, the reader might
+wonder why @code{compute_influence()} is called with the opposite
+color of the dragon contemplating escape.  To explain this point,
+we first remind the reader why there is a color parameter to
+@code{compute_influence()}. Consider the following example position:
+@example
+
+     ...XX...
+     OOO..OOO
+     O......O
+     O......O
+     --------
+
+@end example
+
+Whether the bottom will become O territory depends on who is in turn
+to play. This is implemented with the help of patterns in barriers.db,
+so that X influence is allowed to leak into the bottom if X is in turn
+to move but not if O is. There are also ``invade'' patterns which add
+influence sources in sufficiently open parts of the board which are
+handled differently depending on who is in turn to move.
+
+In order to decide the territorial value of an O move in the third
+line gap above, influence is first computed in the original position
+with the opponent (i.e. X) in turn to move. Then the O stone is played
+to give:
+
+@example
+
+     ...XX...
+     OOO.OOOO
+     O......O
+     O......O
+     --------
+
+@end example
+
+Now influence is computed once more, also this time with X in turn to
+move. The difference in territory (as computed from the influence
+values) gives the territorial value of the move.
+
+Exactly how influence is computed for use in the escape route
+estimation is all ad hoc. But it makes sense to assume the opponent
+color in turn to move so that the escape possibilities aren't
+overestimated. After we have made a move in the escape direction
+it is after all the opponent's turn.
+
+The current escape route mechanism seems good enough to be useful
+but is not completely reliable. Mostly it seems to err on the side of
+being too optimistic.
+
+@node Break Ins
+@section Break Ins
+
+The code in @file{breakin.c} break-ins into territories that require
+deeper tactical reading and are thus impossible to detect for the
+influence module. It gets run after the influence module and revises
+its territory valuations.
+
+The break-in code makes use of two public functions in @file{readconnect.c},
+
+@itemize @bullet
+@item int break_in(int str, const char goal[BOARDMAX], int *move)
+@findex break_in
+@quotation
+Returns WIN if @code{str} can connect to the area @code{goal[]} (which may or
+may not contain stones), if the string's owner gets the first move.
+@end quotation
+@item int block_off(int str, const char goal[BOARDMAX], int *move)
+@findex block_off
+@quotation
+Returns WIN if @code{str} cannot connect to the area @code{goal[]} (which may
+or may not contain stones), if the other color moves first.
+@end quotation
+@end itemize
+
+These functions are public front ends to their counterparts
+@code{recursive_break_in} and @code{recursive_block_off}, which
+call each other recursively.
+
+The procedure is as follows: We look at all big (>= 10) territory regions
+as detected by the influence code. Using the computation of
+connection distances from readconnect.c, we compute all nearby vertices
+of this territory. We look for the closest safe stones belonging to
+the opponent. 
+
+For each such string @code{str} we call
+
+@itemize @bullet
+@item @code{break_in(str, territory)} if the opponent is assumed to be next to move,
+@item @code{block_off(str, territory)} if the territory owner is next.
+@end itemize
+
+If the break in is successful resp. the blocking unsuccessful, we
+shrink the territory, and see whether the opponent can still break in.
+We repeat this until the territory is shrunk so much that the opponent
+can no longer reach it.
+
+To see the break in code in action run GNU Go on the file
+@file{regression/games/break_in.sgf} with the option @code{-d0x102000}. Among
+the traces you will find:
+
+@example
+  Trying to break in from D7 to:
+E9 (1)  F9 (1)  G9 (1)  E8 (1)  F8 (1)  G8 (1)  
+H8 (1)  G7 (1)  H7 (1)  J7 (1)  H6 (1)  J6 (1)
+H5 (1)  J5 (1)  H4 (1)  J4 (1)  H3 (1)  J3 (1)
+H2 (1)  J2 (1)    
+block_off D7, result 0 PASS (355, 41952 nodes, 0.73 seconds)
+E9 (1)  F9 (1)  G9 (1)  E8 (1)  F8 (1)  G8 (1)
+H8 (1)  G7 (1)  H7 (1)  J7 (1)  H6 (1)  J6 (1)
+H5 (1)  J5 (1)  H4 (1)  J4 (1)  H3 (1)  J3 (1)
+H2 (1)  J2 (1)    
+B:F4 
+  Erasing territory at E8 -b.
+  Erasing territory at G3 -b.
+  Now trying to break to smaller goal:
+F9 (1)  G9 (1)  F8 (1)  G8 (1)  H8 (1)  G7 (1)
+H7 (1)  J7 (1)  H6 (1)  J6 (1)  H5 (1)  J5 (1)
+H4 (1)  J4 (1)  H3 (1)  J3 (1)  H2 (1)  J2 (1)    
+@end example
+
+This means that the function @code{break_in} is called with the goal
+marked 'a' in the following diagram. The code attempts to find out
+whether it is possible to connect into this area from the string
+at @code{D7}.
+
+@example
+   A B C D E F G H J
+ 9 . . . . a a a . . 9
+ 8 . . . . a a a a . 8
+ 7 . . . X O O a a a 7
+ 6 . . . X X X O a a 6
+ 5 . . . . + . . a a 5
+ 4 . . . X . . O a a 4
+ 3 . . . . X . . a a 3
+ 2 . . . . . . O a a 2
+ 1 . . . . . . . . . 1
+   A B C D E F G H J
+@end example
+
+A breakin is found, so the goal is shrunk by removing
+@code{E9} and @code{J2}, then break_in is called again.
+
+In order to see what reading is actually done in order to
+do this break in, you may load GNU Go in gtp mode, then
+issue the commands:
+
+@example
+loadsgf break_in.sgf 
+= black
+
+start_sgftrace
+= 
+
+break_in D7 E9 F9 G9 E8 F8 G8 H8 G7 H7 J7 H6 J6 H5 J5 H4 J4 H3 J3 H2 J2
+= 1 E8
+
+finish_sgftrace vars.sgf
+= 
+
+start_sgftrace
+= 
+
+break_in D7 F9 G9 F8 G8 H8 G7 H7 J7 H6 J6 H5 J5 H4 J4 H3 J3 H2 J2
+= 1 G7
+
+finish_sgftrace vars1.sgf
+@end example
+
+This will produce two sgf files containing the variations caused
+by these calls to the breakin code. The second file, @file{vars1.sgf}
+will contain quite a few variations.
+
+The break in code makes a list of break ins which are found.
+When it is finished, the function @code{add_expand_territory_move}
+is called for each break in, adding a move reason.
+
+The break in code is slow, and only changes a few moves by the engine
+per game. Nevertheless we believe that it contributes substantially
+to the strength of the program. The break in code is enabled by default 
+in GNU Go 3.6 at level 10, and disabled at level 9. In fact, this is the
+@strong{only} difference between levels 9 and 10 in GNU Go 3.6.
+
+@node Surrounded Dragons
+@section Surrounded Dragons
+
+When is a dragon surrounded?
+
+As has been pointed out by Bruce Wilcox, the geometric lines connecting groups
+of the opposite color are often important. It is very hard to prevent the
+escape of this @samp{O} dragon:
+
+@example
+..........
+.....O....
+.X.......X
+.X...O...X
+..........
+..........
+----------
+@end example
+
+On the other hand, this dragon is in grave danger:
+
+@example
+..........
+..........
+.X.......X
+.....O....
+.X.......X
+.X...O...X
+..........
+..........
+----------
+@end example
+
+The difference between these two positions is that in the first, the @samp{O}
+dragon crosses the line connecting the top two @samp{X} stones.
+
+Code in @file{surround.c} implements a test for when a dragon is surrounded.
+The idea is to compute the convex hull of the @emph{surround set}, that is,
+the set stones belonging to unfriendly neighbor dragons. If the dragon is
+contained within that hull. If it is, it is said to be @emph{surrounded}.
+
+In practice this scheme is modified slightly. The implementation uses various
+algorithms to compute distances and hostile stones are discarded from the 
+surround set when a pair other hostile ones can be found which makes the
+considered one useless. For example, in the following position
+the bottom @samp{O} stone would get discarded.
+
+@example
+O.X.O  
+.....
+.O.O.
+.....
+..O..
+@end example
+
+Also, points are added to the surround set below stones on the
+second and third lines. This should account for the edge being a
+natural barrier.
+
+In order to compute distances between corners of the convex hull
+a sorting by angle algorithm has been implemented. If the distance
+between a pair enclosing stones is large, the surround status gets
+decreased to @code{WEAKLY_SURROUNDED}, or even 0 for very large ones.
+
+The sorting by angle must be explained. A small diagram will probably help :
+
+@example
+.O.O.
+O...O
+..X..
+O...O
+.O.O.
+@end example
+
+The sorting algorithm will generate this:
+
+@example
+.4.5.
+3...6
+..X..
+2...7
+.1.8.
+@end example
+
+That is, the points are sorted by ascending order of the measure of the
+angle S-G-O, where S is SOUTH, G the (approximated) gravity center of
+the goal, and O the position of the considered hostile stones.
+
+The necessity of such sorting appears when one tries to measure distances
+between enclosing stones without sorting them, just by using directly the
+existing left and right corners arrays. In some positions, the results will
+be inconsistent. Imagine, for example a position where for instance the points
+1,2,3,4,6 and 7 were in the left arrary, leaving only 5 and 8 in the right
+array. Because of the large distance between 5 and 8, the dragon would have
+declared weak surrounded or not surrounded at all. Such cases are rare but 
+frequent enough to require the angle sorting.
+
+The following position:
+
+@example
+O.X.O
+.....
+.O.O.
+@end example      
+
+This is "more" surrounded than the following position:
+
+@example
+O.XXXXXX.O
+..........
+.O......O.
+@end example
+
+In the second case, the surround status would be lowered to
+@code{WEAKLY_SURROUNDED}.
+
+The surround code is used to modify the escape_route field
+in the dragon2 data array. When a dragon is WEAKLY_SURROUNDED,
+the escape_route is divided by 2. If the dragon is SURROUNDED,
+escape_route is simply set to 0.
+
+
+@node Influential Patterns
+@section Patterns used by the Influence module
+
+This section explains the details of the pattern databases used for
+the influence computation.
+
+First, we have the patterns in @file{influence.db}, which get matched
+symmetrically for both colors.
+
+@itemize
+@item @samp{E}
+@quotation
+These patterns add extra influence sources close to some shapes like walls.
+This tries to reflect their extra strength. These patterns are not used
+in the influence computations relevant for territory valuations, but they
+are useful for getting a better estimate of strengths of groups.
+@end quotation
+@item @samp{I}
+@quotation
+These patterns add extra influence sources at typical invasion points. 
+Usually they are of small strength. If they additionally have the class
+@samp{s}, the extra influence source is added for both colors. Otherwise,
+only the player assumed to be next to move gets the benefit.
+@end quotation
+@end itemize 
+
+The patterns in @file{barriers.db} get matched only for @samp{O}
+being the player next to move.
+
+@itemize
+@item @samp{A}
+@quotation
+Connections between @samp{X} stones that stop influence of @samp{O}. They
+have to be tight enough that @samp{O} cannot break through, even though
+he is allowed to move first.
+@end quotation
+@item @samp{D}
+@quotation
+Connections between @samp{O} stones that stop influence of @samp{X}. The
+stones involved can be more loosely connected than those in @samp{A}
+patterns.
+@end quotation
+@item @samp{B}
+@quotation
+These indicate positions of followup moves for the @samp{O} stone marked
+with @samp{Q} in the pattern. They are used to reduce the territory e. g.
+where a monkey jump is possible. Also, they are used in the computation
+of the followup influence, if the @samp{Q} stone was the move played
+(or a stone saved by the move played).
+@end quotation
+@item @samp{t}
+@quotation
+These patterns indicate intersections where one color will not be able
+to get territory, for example in a false eye. The points are set with
+a call to the helper non_oterritory or non_xterritory in the action of
+the pattern.
+@end quotation
+@end itemize 
+
+The intrusion patterns (@samp{B}) are more powerful than the description
+above might suggest. They can be very helpful in identifying weak shapes
+(by adding an intrusion source for the opponent where he can break through).
+A negative inference for this is that a single bad @samp{B} pattern, e. g.
+one that has a wrong constraint, typically causes 5 to 10 @code{FAIL}s in
+the regression test suite.
+
+Influence Patterns can have autohelper constraints as usual. As for
+the constraint attributes, there are (additionally to the usual
+ones @samp{O}, @samp{o}, @samp{X} and @samp{x}),
+attributes @samp{Y} and @samp{FY}. A pattern marked with @samp{Y} will
+only be used in the influence computations relevant for the territory
+valuation, while @samp{FY} patterns only get used in the other influence
+computations.
+
+The action of an influence pattern is at the moment only used for
+non-territory patterns as mentioned above, and as a workaround for a
+problem with @samp{B} patterns in the followup influence.
+
+To see why this workaround is necessary, consider the follwoing situation:
+
+@example
+
+..XXX
+.a*.O
+.X.O.
+..XXO
+
+@end example
+
+(Imagine that there is @samp{X} territory on the left.)
+
+The move by @samp{O} at @samp{*} has a natural followup move at @samp{a}.
+So, in the computation of the followup influence for @samp{*}, there would
+be an extra influence source for @samp{O} at @samp{a} which would destroy
+a lot of black territory on the left. This would give a big followup value,
+and in effect the move @samp{*} would be treated as sente. 
+
+But of course it is gote, since @samp{X} will answer at @samp{a}, which
+both stops the possible intrusion and  threatens to capture @samp{*}. This
+situation is in fact quite common.
+
+Hence we need an additional constraint that can tell when an intrusion
+pattern can be used in followup influence. This is done by misusing the
+action line: An additional line
+
+@example
+>return <condition>;
+@end example
+
+gets added to the pattern. The @code{condition} should be true if the
+intrusion cannot be stopped in sente. In the above example, the relevant
+intrusion pattern will have an action line of the form
+
+@example
+>return (!xplay_attack(a,b));
+@end example
+
+where @samp{b} refers to the stone at @samp{*}. In fact, almost all 
+followup-specific constraints look similar to this.
+
+
+@node Influential Display
+@section Colored display and debugging of influence
+
+There are various ways to obtain detailed information about the influence
+computations. Colored diagrams showing influence are possible from
+a colored xterm or rxvt window. 
+
+There are two options controlling when to generate diagrams:
+
+@itemize @bullet
+@item @option{-m 0x08} or @option{-m 8}
+@quotation
+Show diagrams for the initial influence computation. This is done
+twice, the first time before @code{make_dragons()} is run and the second time
+after. The difference is that dead dragons are taken into account the
+second time. Tactically captured worms are taken into account both
+times. 
+@end quotation
+@item @option{--debug-influence @var{location}}
+@quotation
+Show influence diagrams after the move at the given location. An
+important limitation of this option is that it's only effective for
+moves that the move generation is considering.
+@end quotation
+@end itemize
+
+The other options control which diagrams should be generated in these
+situations. You have to specify at least one of the options above and
+at least one of the options below to generate any output.
+
+@strong{
+The options below must be combined with one of the two previous
+ones, or the diagram will not be printed. For example to print
+the influence diagram, you may combine 0x08 and 0x010, and use
+the option @option{-m 0x018}.}
+
+@itemize @bullet
+@item @option{-m 0x010} or @option{-m 16}
+@quotation
+Show colored display of territory/moyo/area regions.
+@itemize @minus
+@item territory: cyan
+@item moyo: yellow
+@item area: red
+@end itemize
+This feature is very useful to get an immediate impression of the influence
+regions as GNU Go sees them.
+@end quotation
+@item @option{-m 0x20} or @option{-m 32}
+@quotation
+Show numerical influence values for white and black. These come in
+two separate diagrams, the first one for white, the second one for
+black. Notice that the influence values are represented by floats and
+thus have been rounded in these diagrams.
+@end quotation
+@item @option{-m 0x40} or @option{-m 64}
+@quotation
+This generates two diagrams showing the permeability for black and white
+influence on the board.
+@end quotation
+@item @option{-m 0x80} or @option{-m 128}
+@quotation
+This shows the strength of the influence sources for black and white 
+across the board. You will see sources at each lively stone (with strength
+depending on the strength of this stone), and sources contributed by
+patterns.
+@end quotation
+@item @option{-m 0x100} or @option{-m 256}
+@quotation
+This shows the attenuation with which the influence sources spread
+influence across the board. Low attenuation indicates far-reaching
+influence sources.
+@end quotation
+@item @option{-m 0x200} or @option{-m 512}
+@quotation
+This shows the territory valuation of GNU Go. Each intersection is
+shown with a value between -1.0 and +1.0 (or -2 resp. +2 if there is
+a dead stone on this intersection). Positive values indicate territory
+for white. A value of -0.5 thus indicates a point where black has a
+50% chance of getting territory.
+@end quotation
+@end itemize
+
+Finally, there is the debug option @option{-d 0x1} which turns on
+on @code{DEBUG_INFLUENCE}. This gives a message for each influence pattern
+that gets matched. Unfortunately, these are way too many messages making
+it tedious to navigate the output. However, if you discover an influence
+source with @option{-m 0x80} that looks wrong, the debug output can
+help you to quickly find out the responsible pattern.
+
+@node Influence Tuning
+@section Influence Tuning with @code{view.pike}
+
+A useful program in the regression directory is @code{view.pike}.
+To run it, you need Pike, which you may download from
+@url{http://pike.ida.liu.se/}.
+
+The test case @file{endgame:920} fails in GNU Go 3.6. We will
+explain how to fix it.
+
+Start by firing up view.pike on testcase endgame:920, e.g. by running
+@command{pike view.pike endgame:920} in the regression directory.
+
+We see from the first view of move values that filling dame at P15 is
+valued highest with 0.17 points while the correct move at C4 is valued
+slightly lower with 0.16. The real problem is of course that C4 is
+worth a full point and thus should be valued about 1.0.
+
+Now click on C4 to get a list of move reasons and move valuation
+information. Everything looks okay except that change in territory is
+0.00 rather than 1.00 as it ought to be.
+
+We can confirm this by choosing the ``delta territory for...'' button
+and again clicking C4. Now B5 should have been marked as one point of
+change in territory, but it's not.
+
+Next step is to enter the influence debug tool. Press the ``influence''
+button, followed by ``black influence, dragons known,'' and ``territory
+value.'' This shows the expected territory if black locally moves first
+everywhere (thus ``black influence''). Here we can see that B5 is
+incorrectly considered as 1.0 points of white territory.
+
+We can compare this with the territory after a white move at C4 (still
+assuming that black locally moves first everywhere after that) by
+pressing ``after move influence for...'' and clicking C4. This looks
+identical, as expected since delta territory was 0, but here it is
+correct that B5 is 1.0 points of territory for white.
+
+The most straightforward solution to this problem is to add a
+non-territory pattern, saying that white can't get territory on B5 if
+black moves first. The nonterritory patterns are in @file{barriers.db}.
+
+@example
+Pattern Nonterritory56
+
+...
+X.O
+?O.
+
+:8,t
+
+eac
+XbO
+?Od
+
+;oplay_attack(a,b,c,d,d)
+
+>non_xterritory(e);
+@end example
+
+In these patterns it's always assumed that @samp{O} moves first and thus it
+says that @samp{X} can't get territory at @code{B5} (@samp{e} in the
+pattern). Now we need to be a bit careful however since after @samp{O} plays
+at @samp{a} and @samp{X} cuts in at @samp{b}, it may well happen that @samp{O}
+needs to defend around @samp{d}, allowing @samp{X} to cut at @samp{c}, possibly
+making the nonterritory assumption invalid. It's difficult to do this entirely
+accurate, but the constraint above is fairly conservative and should guarantee
+that @samp{a} is safe in most, although not all, cases.
diff --git a/doc/install.texi b/doc/install.texi
new file mode 100644 (file)
index 0000000..095613b
--- /dev/null
@@ -0,0 +1,456 @@
+
+You can get the most recent version of GNU Go ftp.gnu.org or a mirror
+(see @url{http://www.gnu.org/order/ftp.html} for a list).  You can read
+about newer versions and get other information at
+@url{http://www.gnu.org/software/gnugo/}. 
+
+@menu
+* GNU/Linux and Unix::          GNU Linux and Unix Installation
+* Configure Options::           Configure Options
+* Windows and MS-DOS::          Windows Installation
+* Macintosh::                   Macintosh Installation
+@end menu
+
+@node GNU/Linux and Unix, Configure Options, ,Installation
+@section GNU/Linux and Unix
+@cindex installation
+
+Untar the sources, change to the directory gnugo-3.8. Now do:
+
+@example
+   ./configure [OPTIONS]
+   make
+@end example
+
+Several configure options will be explained in the next section. You do not
+need to set these unless you are dissatisfied with GNU Go's performance or
+wish to vary the experimental options.
+
+As an example,
+
+@example
+   ./configure --enable-level=9 --enable-cosmic-gnugo
+@end example
+
+@noindent
+will make a binary in which the default level is 9, and the experimental
+``cosmic''' option is enabled. A list of all configure options can be
+obtained by running @command{./configure --help}. Further information
+about the experimental options can be found in the next section
+(@pxref{Configure Options}).
+
+After running configure and make, you have now made a binary called
+@file{interface/gnugo}. Now (running as root) type
+
+@example
+   make install
+@end example
+
+@noindent
+to install @file{gnugo} in @file{/usr/local/bin}.
+
+There are different methods of using GNU Go. You may run it from the
+command line by just typing:
+
+@example
+   gnugo
+@end example
+
+@noindent
+but it is nicer to run it using CGoban 1 (under X Window System), 
+Quarry, Jago (on any platform with a Java Runtime Environment) or other
+client programs offering a GUI.
+
+You can get the most recent version of CGoban 1 from 
+@url{http://sourceforge.net/projects/cgoban1/}. The earlier version
+1.12 is available from @url{http://www.igoweb.org/~wms/comp/cgoban/index.html}.
+The CGoban version number MUST be 1.9.1 at least or it won't work. CGoban 2
+will not work.
+
+@xref{CGoban}, for instructions on how to run GNU Go from Cgoban, or
+@xref{Other Clients}, for Jago or other clients.
+
+Quarry is available at @url{http://home.gna.org/quarry/}.
+
+@node Configure Options
+@section Configure Options
+
+There are three options which you should consider configuring,
+particularly if you are dissatisfied with GNU Go's performance.
+
+@menu
+* Ram Cache::                 Ram Cache
+* Default Level::             Default Level
+* Other Options::             Other Options
+@end menu
+
+@node Ram Cache
+@subsection Ram Cache
+
+By default, GNU Go makes a cache of about 8 Megabytes in RAM for its
+internal use. The cache is used to store intermediate results during
+its analysis of the position. More precisely the default cache size is
+350000 entries, which translates to 8.01 MB on typical 32 bit
+platforms and 10.68 MB on typical 64 bit platforms.
+
+Increasing the cache size will often give a modest speed improvement.
+If your system has lots of RAM, consider increasing the cache
+size. But if the cache is too large, swapping will occur,
+causing hard drive accesses and degrading performance. If
+your hard drive seems to be running excessively your cache
+may be too large. On GNU/Linux systems, you may detect swapping
+using the program 'top'. Use the 'f' command to toggle SWAP
+display.
+
+You may override the size of the default cache at compile time 
+by running one of:
+
+@example
+   ./configure --enable-cache-size=n
+@end example
+
+@noindent
+to set the cache size to @code{n} megabytes. For example
+
+@example
+   ./configure --enable-cache-size=32
+@end example
+
+@noindent
+creates a cache of size 32 megabytes. If you omit this, your default
+cache size will be 8-11 MB as discussed above. Setting cache size
+negative also gives the default size. You must recompile and reinstall
+GNU Go after reconfiguring it by running @command{make} and
+@command{make install}.
+
+You may override the compile-time defaults by running @file{gnugo}
+with the option @option{--cache-size n}, where @code{n} is the size in
+megabytes of the cache you want, and @option{--level} where n is the
+level desired.  We will discuss setting these parameters next in
+detail.
+
+@node Default Level
+@subsection Default Level
+
+GNU Go can play at different levels. Up to level 10 is
+supported. At level 10 GNU Go is much more accurate but takes
+an average of about 1.6 times longer to play than at level 8.
+
+The level can be set at run time using the @option{--level} option.
+If you don't set this, the default level will be used. You
+can set the default level with the configure option
+@option{--enable-level=n}. For example
+
+@example
+./configure --enable-level=9
+@end example
+
+@noindent
+sets the default level to 9. If you omit this parameter,
+the compiler sets the default level to 10. We recommend
+using level 10 unless you find it too slow. If you decide
+you want to change the default you may rerun configure
+and recompile the program.
+
+@node Other Options
+@subsection Other Options
+
+Anything new in the engine is generally tested as an experimental option
+which can be turned on or off at compile time or run time. Some
+``experimental'' options such as the break-in code are no longer
+experimental but are enabled by default.
+
+This section can be skipped unless you are interested in the
+experimental options.
+
+Moreover, some configure options were removed from the stable
+release. For example it is known that the owl extension code
+can cause crashes, so the configure option --enable-experimental-owl-ext
+was disabled for 3.8.
+
+The term ``default'' must be clarified, since there
+are really two sets of defaults at hand, runtime defaults
+specified in @file{config.h} and compile time default
+values for the runtime defaults, contained in @file{configure}
+(which is created by editing @file{configure.in} then running
+@command{autoconf}. For example we find in @file{config.h}
+
+@example
+/* Center oriented influence. Disabled by default. */
+#define COSMIC_GNUGO 0
+
+/* Break-in module. Enabled by default. */
+#define USE_BREAK_IN 1
+@end example
+
+This means that the experimental cosmic option, which causes
+GNU Go to play a center-oriented game (and makes the engine
+weaker) is disabled by default, but that the break-in module
+is used. These are defaults which are used when GNU Go is
+run without command line options. They can be overridden
+with the run time options:
+
+@example
+gnugo --cosmic-gnugo --without-break-in
+@end example
+
+Alternatively you can configure GNU Go as follows:
+
+@example
+./configure --enable-cosmic-gnugo --disable-experimental-break-in
+@end example
+
+then recompile GNU Go. This changes the defaults in @file{config.h},
+so that you do not have to pass any command line options to GNU Go
+at run time to get the experimental owl extension turned on and
+the experimental break-in code turned off.
+
+If you want to find out what experimental options were compiled into your GNU
+Go binary you can run @command{gnugo --options} to find out. Here is a list
+of experimental options in GNU Go.
+
+@itemize @bullet
+@item @code{experimental-break-in}. Experimental break-in code
+(@pxref{Break Ins}). You should not need to configure this because
+the break in code is enabled by default in level 10, and is turned
+off at level 9. If you don't want the breakin code just play at
+level 9.
+@item @code{cosmic-gnugo}. An experimental style which plays a center
+oriented game and has a good winning rate against standard GNU Go,
+though it makes GNU Go weaker against other opponents.
+@item @code{large-scale}. Attempt to make large-scale captures.
+See:
+
+@url{http://lists.gnu.org/archive/html/gnugo-devel/2003-07/msg00209.html}
+
+for the philosophy of this option. This option makes the engine slower.
+@item @code{metamachine}. Enables the metamachine, which allows
+you to run the engine in an experimental mode whereby it forks
+a new @code{gnugo} process which acts as an ``oracle.'' Has no
+effect unless combined with the @option{--metamachine} run-time
+option.
+@end itemize
+
+Other options are not experimental, and can be changed as
+configure or runtime options.
+
+@itemize @bullet
+@item @code{chinese-rules} Use Chinese (area) counting.
+@item @code{resignation-allowed} Allow GNU Go to resign games.
+This is on by default.
+@end itemize
+
+@node Windows and MS-DOS, Macintosh, Configure Options, Installation
+@section Compiling GNU Go on Microsoft platforms
+
+@subsection Building with older visual studio
+
+The distribution directories contain some .dsp and .dsw files with
+GNU Go. These have been brought up to date in the sense that they
+should work if you have the older VC++ with Visual Studio 6
+but the distributed .dsp and .dsw files will only be of use with 
+older version of Visual Studio.
+
+In most cases (unless you are building in Cygwin) the preferred way 
+to build GNU Go on Windows platforms is to use CMake. CMake
+understands about many versions of Visual C/Visual Studio, and will
+generate project/solution files for the tools installed on your
+system. So even if you have Visual Studio 6 you may use CMake
+and dispense with the distributed .dsp and .dsw files.
+
+@subsection Building with Visual Studio project files
+
+Before you compile the GNU Go source, you need to run CMake first, to 
+generate the build files you'll give to Visual Studio.
+
+From the cmd.exe command prompt, CD into the GNU Go source directory. 
+To confirm you're in the right place, you should see the file 
+'CMakeLists.txt' in the top-level directory of the GNU Go code (as well 
+as others in lower subdirectories).
+
+Direct CMake to generate the new Visual Studio build files by typing:
+
+@example
+    cmake CMakeLists.txt
+@end example
+
+Compile the code by invoking the newly-created Solution file:
+
+@example
+    vcbuild GNUGo.sln
+@end example
+
+This will take a few moments, as CMake generates 4 debug/retail targets:
+
+@example
+    debug
+    release
+    minsizerel
+    relwithdebinfo
+@end example
+
+For each of these targets, Visual Studio is generating a version of 
+gnugo.exe:
+
+@example
+    interface\debug\gnugo.exe
+    interface\release\gnugo.exe
+    interface\minsizerel\gnugo.exe
+    interface\relwithdebinfo\gnugo.exe
+@end example
+
+Additionally, there is an 'Install' target available, that will copy the 
+the gnugo.exe into the %ProgramFiles% directory. To do this, type:
+
+@example
+    vcbuild INSTALL.vcproj
+@end example
+
+This should result in copying GNU/Go into:
+
+@example
+    "%ProgramFiles%\GNUGo\bin\gnugo.exe" --options
+@end example
+
+In addition to command line use, CMake also has a GUI version. Users of 
+the Visual Studio GUI might prefer to use that.
+
+@subsection Building with Nmake makefiles
+
+GNU Go will also build using NMake makefiles. Optionally, instead of 
+Visual Studio project/solution files, you may direct CMake to generate 
+NMake makefiles. To generate the makefiles:
+
+@example
+    cmake -G "NMake Makefiles" CMakeLists.txt
+@end example
+
+The default rule for the makefile is 'all'. Use the 'help' rule to show 
+a list of available targets.
+
+@example
+    nmake -f Makefile help
+@end example
+
+To compile GNU Go:
+
+@example
+    nmake -f Makefil, all
+@end example
+
+One sysand 2009 tems, GNU GO may fail to build when using NMake makefiles. 
+only fails the first time run, run NMake again with the 'clean all' 
+targets, and it will compile the second and subsequent times.
+
+@example
+    nmake -f Makefile clean all
+@end example
+
+Which will successfully generate a gnugo.exe.
+
+@example
+    interface\gnugo.exe --options
+@end example
+
+@subsection Building with MinGW Makefiles
+
+GNU Go can be built on Windows systems using MinGW.
+
+This development environment uses: the GCC compiler (gcc.exe, not 
+cl.exe), the Microsoft C runtime libraries (MSCRT, not GLibC), the GNU 
+Make build tool (@code{mingw32-make.exe}, not NMake), all from the Windows 
+shell (@code{cmd.exe}, not sh/bash).
+
+For CMake to work, in addition to the base MinGW installation, the C++ 
+compiler (g++.exe) and GNU Make (mingw32-make.exe) need to be installed. 
+This was tested using GCC v3, not the experimental v4. To debug, use 
+GDB, as the GCC-generated symbols won't work with NTSD/Windbg/Visual Studio.
+
+To create the makfiles, run CMake with the MinGW generator option:
+
+@example
+    cmake -G "MinGW Makefiles" CMakeLists.txt
+@end example
+
+To build GNU Go, from a cmd.exe shell, run GNU Make (against the 
+newly-created 'Makefile' and it's default 'all' target):
+
+@example
+    mingw32-make
+    ..\interface\gnugo.exe --options
+@end example
+
+@subsection Building with MSYS makefiles (MinGW)
+
+GNU Go can be built on Windows systems using MSYS.
+
+This development environment uses: the GCC compiler (gcc.exe, not 
+cl.exe), the Microsoft C runtime libraries (MSCRT, not GLibC), the GNU 
+Make build tool (make, not NMake), all from the GNU Bash (sh.exe, not 
+cmd.exe).
+
+To create the makfiles, run CMake with the MSYS generator option:
+
+@example
+    cmake -G "MSYS Makefiles" CMakeLists.txt
+@end example
+
+Start MSYS's Bash shell, either clicking on a shortcut on from the 
+command line:
+
+@example
+    cd /d c:\msys\1.0
+    msys.bat
+@end example
+
+To build GNU Go, from a Bash shell, run GNU Make (against the 
+newly-created 'Makefile' and it's default 'all' target):
+
+@example
+    make
+    ../interface/gnugo.exe --options
+@end example
+
+To debug, use GDB, as the GCC-generated symbols won't work with 
+NTSD/Windbg/Visual Studio.
+
+@subsection Building on cygwin
+
+With Cygwin, you should be able to 
+
+@example
+  tar zxvf gnugo-3.8.tar.gz
+  cd gnugo-3.8
+  env CC='gcc -mno-cygwin' ./configure
+  make
+@end example
+
+@subsection Testing on Windows:
+
+@file{regression/regress.cmd} is a simplified cmd.exe-centric port of the main
+gnugo Unix shell script regress.sh. It can be used to help verify that the
+generated binary might be operational. Read the script's comment header for
+more information. For access to the full GNU Go tests, use Unix, not Windows.
+
+To test:
+
+@example
+    cd regression
+    regress.cmd ..\interface\gnugo.exe
+@end example
+
+@node Macintosh
+@section Macintosh
+
+If you have Mac OS X you can build GNU Go using Apple's compiler, 
+which is derived from GCC. You will need Xcode.
+
+One issue is that the configure test for socket support is
+too conservative. On OS/X, the configure test fails, but
+actually socket support exists. So if you want to be able
+to connect to the engine through tcp/ip (using gtp) you
+may @command{configure --enable-socket-support}.  There
+will be an error message but you may build the engine
+and socket support should work.
+
+
diff --git a/doc/introduction.texi b/doc/introduction.texi
new file mode 100644 (file)
index 0000000..5f4ece4
--- /dev/null
@@ -0,0 +1,177 @@
+
+This is GNU Go 3.8, a Go program. Development versions of GNU Go may be
+found at @url{http://www.gnu.org/software/gnugo/devel.html}. Contact
+us at @email{gnugo@@gnu.org} if you are interested in helping.
+
+@menu
+* About::                       About GNU Go and this Manual
+* Copyright::                   Copyright
+* Authors::                     The Authors of GNU Go
+* Thanks::                     Acknowledgements
+* Development::                 Developing GNU Go
+@end menu
+
+@node About
+@section About GNU Go and this Manual
+
+The challenge of Computer Go is not to @strong{beat} the computer,
+but to @strong{program} the computer. 
+
+In Computer Chess, strong programs are capable of playing at the highest
+level, even challenging such a player as Garry Kasparov. No Go program
+exists that plays at the same level as the strongest human players.
+
+To be sure, existing Go programs are strong enough to be interesting
+as opponents, and the hope exists that some day soon a truly
+strong program can be written. This is especially true in view
+of the successes of Monte Carlo methods, and a general recent
+improvement of computer Go.
+
+Before GNU Go, Go programs have always been distributed as binaries
+only. The algorithms in these proprietary programs are secret. No-one
+but the programmer can examine them to admire or criticise. As a
+consequence, anyone who wished to work on a Go program usually had to
+start from scratch. This may be one reason that Go programs have not
+reached a higher level of play.
+
+Unlike most Go programs, GNU Go is Free Software. Its algorithms and
+source code are open and documented. They are free for any one to
+inspect or enhance. We hope this freedom will give GNU Go's descendents
+a certain competetive advantage.
+
+Here is GNU Go's Manual. There are doubtless inaccuracies. The ultimate
+documentation is in the commented source code itself.
+
+The first three chapters of this manual are for the general
+user. Chapter 3 is the User's Guide. The rest of the book is for
+programmers, or persons curious about how GNU Go works.  Chapter 4 is a
+general overview of the engine.  Chapter 5 introduces various tools for
+looking into the GNU Go engine and finding out why it makes a certain
+move, and Chapters 6--7 form a general programmer's reference to the GNU
+Go API. The remaining chapters are more detailed explorations of
+different aspects of GNU Go's internals.
+
+@node    Copyright
+@section Copyrights
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+and 2008 by the Free Software Foundation except as noted below.
+
+All source files are distributed under the GNU General Public License
+(@pxref{GPL}, version 3 or any later version), except @file{gmp.c},
+@file{gmp.h}, @file{gtp.c}, and @file{gtp.h}.
+
+The files @file{gtp.c} and @file{gtp.h} are copyright the Free Software
+Foundation. In the interests of promoting the Go Text Protocol these
+two files are licensed under a less restrictive license than the GPL
+and are free for unrestricted use (@pxref{GTP License}).
+
+The two files @file{gmp.c} and @file{gmp.h} were placed in the public domain
+by William Shubert, their author, and are free for unrestricted use.
+
+Documentation files (including this manual) are distributed under
+the GNU Free Documentation License (@pxref{GFDL}, version 1.3 or any later
+version).
+
+The files @file{regression/games/golois/*sgf} are copyright Tristan
+Cazenave and are included with his permission.
+
+The SGF files in @file{regression/games/handtalk/} are copyright Jessie Annala
+and are used with permission.
+
+The SGF files in @file{regression/games/mertin13x13/} are copyright Stefan
+Mertin and are used with permission.
+
+The remaining SGF files are either copyright by the FSF or are in the public domain.
+
+
+
+
+@node    Authors
+@section Authors
+
+GNU Go maintainers are Daniel Bump, Gunnar Farneback and Arend
+Bayer. GNU Go authors (in chronological order of contribution)
+are Man Li, Wayne Iba, Daniel Bump, David Denholm, Gunnar
+Farneb@"ack, Nils Lohner, Jerome Dumonteil, Tommy Thorn,
+Nicklas Ekstrand, Inge Wallin, Thomas Traber, Douglas Ridgway,
+Teun Burgers, Tanguy Urvoy, Thien-Thi Nguyen, Heikki Levanto,
+Mark Vytlacil, Adriaan van Kessel, Wolfgang Manner, Jens
+Yllman, Don Dailey, M@aa{}ns Ullerstam, Arend Bayer, Trevor
+Morris, Evan Berggren Daniel, Fernando Portela, Paul
+Pogonyshev, S.P. Lee and Stephane Nicolet, Martin Holters,
+Grzegorz Leszczynski and Lee Fisher.
+
+@node Thanks
+@section Thanks
+
+We would like to thank Arthur Britto, David Doshay, Tim Hunt, Matthias Krings,
+Piotr Lakomy, Paul Leonard, Jean-Louis Martineau, Andreas Roever and Pierce
+Wetter for helpful correspondence.
+
+Thanks to everyone who stepped on a bug (and sent us a report)!
+
+Thanks to Gary Boos, Peter Gucwa, Martijn van der Kooij, Michael
+Margolis, Trevor Morris, M@aa{}ns Ullerstam, Don Wagner and Yin Zheng for help
+with Visual C++.
+
+Thanks to Alan Crossman, Stephan Somogyi, Pierce Wetter and Mathias Wagner
+for help with Macintosh. And thanks to Marco Scheurer and Shigeru Mabuchi for
+helping us find various problems.
+
+Thanks to Jessie Annala for the Handtalk games.
+
+Special thanks to Ebba Berggren for creating our logo, based on a
+design by Tanguy Urvoy and comments by Alan Crossman. The old
+GNU Go logo was adapted from Jamal Hannah's typing GNU:
+@url{http://www.gnu.org/graphics/atypinggnu.html}.
+Both logos can be found in @file{doc/newlogo.*} and @file{doc/oldlogo.*}.
+
+We would like to thank Stuart Cracraft, Richard Stallman and Man Lung Li for
+their interest in making this program a part of GNU, William Shubert for
+writing CGoban and gmp.c, Rene Grothmann for Jago and Erik van Riper and his
+collaborators for NNGS.
+
+
+@node Development
+@section Development
+
+You can help make GNU Go the best Go program.
+
+This is a task-list for anyone who is interested in helping with GNU
+Go. If you want to work on such a project you should correspond with
+us until we reach a common vision of how the feature will work!
+
+A note about copyright. The Free Software Foundation has the copyright
+to GNU Go. For this reason, before any code can be accepted as a part of
+the official release of GNU Go, the Free Software Foundation will want
+you to sign a copyright assignment. 
+
+Of course you could work on a forked version without signing
+such a disclaimer. You can also distribute such a forked version of the
+program so long as you also distribute the source code to your
+modifications under the GPL (@pxref{GPL}). But if you want
+your changes to the program to be incorporated into the
+version we distribute we need you to assign the copyright.
+
+Please contact the GNU Go maintainers, Daniel Bump
+(@email{bump@@sporadic.stanford.edu}) and Gunnar Farneb@"ack
+(@email{gunnar@@lysator.liu.se}), to get more information and the
+papers to sign.
+
+Bug reports are very welcome, but if you can, send us bug FIXES as well as bug
+reports. If you see some bad behavior, figure out what causes it, and what to
+do about fixing it. And send us a patch! If you find an interesting bug and
+cannot tell us how to fix it, we would be happy to have you tell us about it
+anyway. Send us the sgf file (if possible) and attach other relevant
+information, such as the GNU Go version number. In cases of assertion failures
+and segmentation faults we probably want to know what operating system and
+compiler you were using, in order to determine if the problem is platform
+dependent.
+
+If you want to work on GNU Go you should subscribe to the 
+@uref{http://lists.gnu.org/mailman/listinfo/gnugo-devel,
+GNU Go development list.} Discussion of bugs and feedback
+from established developers about new projects or tuning
+the existing engine can be done on the list.
+
diff --git a/doc/logo-32.eps b/doc/logo-32.eps
new file mode 100644 (file)
index 0000000..95f2870
--- /dev/null
@@ -0,0 +1,1047 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.11 by Peter Kirchgessner
+%%Title: /home/bump/freedom/gnugo-3.1.30/doc/logo-32.eps
+%%CreationDate: Sat Mar 30 08:19:57 2002
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 386 340
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228 14.173228 translate
+% Translate to begin of first scanline
+0.000000 325.000000 translate
+371.000000 -325.000000 scale
+% Image geometry
+371 325 8
+% Transformation matrix
+[ 371 0 0 325 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData:        77231 ASCII Bytes
+image
+RJQp_*;Ajep&Fm]q#'[Do`+R^qXF7Zs7?$]qY^9gqY>^=QMR$G!U]X\rttJ"nETN4nbiF[g[Y%5
+o_&+Zp@n@Yqu$>BqNUiEq>p-]rr3i7qtoa[s8Cj,lMpGDoD&%JnFuVMq>1!cJbkW-RJQs`)trae
+md]rCf[9-ep#kQ5lK\6Dn*BW<p%S:ZqgnU.qO.0]mdTuMrttb.s82N^o(2YUqrd&7s7bpLo(2SM
+qYU/@qN^oFqYpL4o?E1X$RqkNs5r>0naP`)o_nUUmI9]=p\OmdJbk]/RJJ#mo)A[hg7ig;&ciA'
+MU_[Zkk"B6o(2A=nFQDMqYU/@qNguGqB,_0nFut_m+H=i!#R*h)I:AIrUJq3oCVJ?oCi"Vqtks@
+QMR$G+8km.qtT^Ss*mTI!!!TQ0>lB,s7#@So_&(Zqt9RSqgnU0qO%+#p\=[]nF?>8D&<ib!<>7i
++E5*qr;>%8q#($`p%S?7qNguGqB#G*q>U3Xm.120N\M/,$P*4;-#V`Bs53;<qY^3cq18C-qO.0u
+p@\7]q<[>4oDcWL',E"s-P?CoF6)cUmdg/Pr.4^/qO.1%p@\7]q<[>4eGfL?rtZUT!#P\94nIn9
+nalGLr;HNgJbk]/RJJ$#pA+^`md0N>l/LP!!!aqQ,S:>Pqr@_Np%.nRr;6;@qNguFqAo>*r:odO
+q=aU`j8WQp(((Tk!+OX*o`+^Wo(MtXJbkZ.RJJ!&p\=X\nb)qZk5O$%ZN(FH!%.cNl/r$Gqsj.I
+q>5a>Q28W!rql`nrVZ`orqf%[rVl6`s7l9crqH0`rVlcnrVlWhqu$?fq"OF\s7Z*`rqH9hs7,LM
+qXs+QrVEaq!#5kA&ol@sp#tQ+p\k*irr7QGQMSMqs8)rsqtg*^rq8SPrVcNbq>0m^qu-Kkqtp<f
+qtp<hqtg-^s8VierVlThs8M`cq=<Xis69R`.N&3l!BI1Rq<deAo_SL^q>0u>qNh!"qXO@ds82Qe
+qtTp]rVQTj!;ZTjs8;oo-i*c@q>($hq=XU_rr<#rmHOZ$\af_J&HiSMf)P0rq"OX_qY'RTq18C.
+qT8U5qZ-Klq#pKdq"jsert"krs8Vujqu-Bcp\FX[p\Xpc.f92Cr;?Eequ6NhrVl`fmcE3Pqu=cO
+CD6b"<G/,ss68G2q>:'ao^qnTJbk]/anl&9#lOSrq>'g\qY^?l62^WUo_&4`r;$6gq"++OqY9d[
+q"OOXqY^?kq"=F[r;$*VpAP$gq#16h]l!fM1'!-bkkG#Mo'GQ3p\=LUpA=l@qNh!"qEOrVqtg*^
+p@\7XqYBjTm-4!4p[@M@q"O[XmdKlHqY0^VoCDPJqu6Tdn+Q\Tp%@qMrr;o_jQ;Ls$ihDSL%50B%
+-HR?p#tl9p\=OZrVqHFQMS`"s7f=^p%.bDnFH2Ep\"%Bkj/6Cf#ltCnbM\=lh12Rq=O7HmdTlEr
+;H'Jo_\@Po)JR[o@TaM8,rW,AWb$mn`8rti8X1rnEofBqtp6erIOg2qT8U6oM+oGn*TH,kj7m7q
+YL!\m/QgtYgMk)p[72.p&=seo'bu4mdg/Mr9WS:qXj7GinEMorlTdg(FD1L9`=kgkNMO;s75UOm
+I^;Tr;$-`Jbk]/iVNQLs8)`lrqZTjrqfdlqu-Hfp\FaaqYTU9p]'LPf%p3$\bXP.jj7RP50`?Ue
+a3+qpAaaLnb2P<jm)C*lMpS6rU,S?!!=fY&HN%=25L9O^WHNUpA<Fpp@7eCo_eagr;6DCqNh!:q
+>g?gq>pKhqt_E3q"t$fq"OU^qtL'co)JaUn#_l?kg]Y2nGgt.aoGQCs#'0CmIKo/nFcVQp\+F]s
+7u?ASo[L;!rrrB!!#2hZi:!ff`2!5d,k<-l29];nb;t\r;-<gJbk]/dJ?r>qu-Hfp\Faco`+shr
+r))Z=$69>nc/15p[?np'0h!9s3:?2qtfj_s8;cjp[RV=jJuT<&cr%5$Q0K_O7MN!nET<=s2&/fM
+3YKOp>#34qY^9eq"jr?qNh!:qYpBlqYp<iqu?Nlq'>b4rVZHbq>C6`rr;KTo^66."omfcmbR.#q
+=X-Q9IJQo[H[>_rt"8Ni9C"9r:U$gPmIF)%LW+6)R'1`s5V8(>6"X4#oWdY(Tk@4qY^<gp@e=\J
+bk]/iVNTP$iBesq=sa_r;6?eq>U.[qu-Hfp\Fa^o)&1@kP=mH&HMjrs7Q'9s7Q<JYQ/S&s3L'*p
+$hbVq=4+Vs8;KTk[sks*WlBB$m$c!ScA<Pl-lG2)\4.n(]FCAXO@.Fr;HKcpA+Z<qNh!:qIfg+r
+;6<bp\+Ubr;6<bp\+CZrVZHbq>BgSq=!A9s6:L,$0;-dq"+O4YO:NP!!1C)o^r1Xn+u\@hVRG_l
+fRZ>/H?=f!"&]+!t##qT<\En1BImr!<<`G$pK(=qt9^[r;?BcqYc!AQMTS:s8HU-qt^$\pAY'hq
+t^$\pA"O`r:p$^r:KaYmHsr@XoJG4VuQ/Ui8Wr"s/Y".&9iO!li6nYs8VfZlLOlQs5oe*$Q/pE&
+L[tn!!!'G*An0()'oat)#sXSJD'tYeFE;2rquWir.4^1qVh9`s8Muoq=jUUs8Muoq=jUUq"t$fq
+"OU^qu-?WoDd6U#S%2HldYn's7_%jan<"A/h-DGrq5m^ho;4+8h:hj/gCAs$4-\8!!!H.(B=pK+
+qXeT"VDRi#nVdUs4,0ime$GWrquZkJbk]/iVFDdq>0s`q"FC\p[IbOs8VucnGhYLlMg;Grq\n[o
+'/.6+94q&f@d(RrQ6Gps2Q,k#heJ*s4F28%KHP1!!WQ7%hTEc$jHe6!W`9'%L<%Z!%efs&-,A:i
+W&rKrojU]q>1$eqgnU.qVh8Nq>U4Vq=jRRs7u3Uq>U6`mc`B_li6\BnauA@q!$fm#m^Mms8SLgs
+4YCR&C]ka!"\>Ns7#c\/d24^"T\i3"U>>@#R(,,rrW3#%g`UI!#?=M!!u"b[ERXtp\t0rp%J1Wq
+tks@PksA8rVJnVp@IkTq==(Lq"4%Ts6TU9s7QE]o'Yi9jOtmp$ig@=lkqt)s8!oZY5_W5!1<-'?
+;<-i!!3c>!so/5!sJl3!WE'>!<N6$"q1nT+$3/(@`RL*q!dP9o^:Z,o(DeSqtks@Q29J9rqo4^q
+=aFMq=O1Go_%eCht$=;oD[b#o_.qKqW-$=!#$%HDuNd0A's1)K.bgO&-X6)G:<nF$NLDF"p##8"
+pYD>#6b21!WE'<"UPJ>!?B,KqY'(OqXs1;nc&FSmI0Z?q>1!cJbk]/iVNQN&Gl4ro^_M>mdTi?o
+C;kPlIc+9.K8u6q"k$M`W?,Q(^qt.QtHECs*Ce+jn;S`)IEIM"98i1#n?q8#R1P4#U0HV":+u-"
+:bnE!!$d"iQ_Dbe*$)cn+Zk^rpB1GpA+R^qgnU0qVh97q"ad_q=s[Vlg4*2oCVYGjPfj\l.5V!n
+auMLs5C`n)Zg-U!#eKY"Y-F\WrR<t!!<3)#6QUn%06\?!!!<"!ZhUI!!a#C"9B+4I&N=Ys8;Wks
+8;Q]mcEs/p%\C\qgnU/qVh9-p%J1VqYL$_mI9`?o^_PAf&ll-s8M`So^q\Gs5qH-&HE1J!!";i)
+a9IGG:ISb)$:6k/H,VR#QOu4!!3N&!$)+@!!WQ+$6(\48?SoYoDdh;p%SCas7l9\q"jmbJbkW-i
+VGh1o_/+Wqtp6[o_8+PnF#]DSI,ZqdI$H#p[RkTmb&E`$o.eq$OI1@*$,tP!!!WG//As#'Ee[B!
+!*?+#n$_6qu@f?!rr<("98E51njqX761Cks6T:HoDARenbDqVr;?GCqNUj@q?m,rq=sd^r;H6]r
+VlgTrql`jo]5B=j6#S$>&daHBT/YPhuDj=lR`)H!"'nT!=fG:!tPAU'.Y7BFWpu$$O?n="9S]"!
+<*#t!#bqE$-_r0!tYFmipua9q"FCRpAFg`q"X[^r.4^1qWI_Sq*OrTqu?]pq=O1Clb2igjPT5%E
+-]=ds3<PB.1JOfg$n>-RR7ku!!s\I)A``A!!aDBg&L*k+92BB$j[(C"pG,3"8i/t!W<!)!s]-6s
+4nbRTB?.Q%K#eal0Rs<qt^$^q>:)@qNh!AqYL$fs#p/Im-F!)s3f6Ts31L?%0.h4M>P26>SR5`<
+ESM`Qt)(E$5!7Q)GDdh)=mk.eG&u9&c`%R"pP56"9S`-p]:<n)?U3N"5)P8N`lD?k3MR0p\b'kr
+;6<bq"agbJbk]/l2(GUs8"bOq"OLToC;>@p%nU@q>]^Gi;"lg*D%u/s4W32'`][c@E7@,GtSJE,
+7=l2F=Rq4rrC:Cr9&#.'DDM,"9/H&!WN-"!W<!:!s],4b0?1!+.WB(p%J4Yq!dPGqt^$^q>:)@q
+Nh!Bq@*/pqYL$^p%.YAnalDPp+Q<m_oCp:ld,Y4*@:af<jpoDVfN%B+&U8,o`+OHq<IqF^f*FD2
+uhgehSoNt"qUM0rriT0!s/K'!!3#u)?U3N-8PVEp`tjLq![J6o_A%Dr;6<bq"agbJbk]/l2!@5q
+"jmap@@_Jp\+1Gl/^ges3j(lbh^&6IKBKM!=oS?1h"r7s0-&7"so;bqu>m8p%e:9[ssJ;rtH1L!
+>#D<"pP;;#RCY>"U"l-!!!&u!#bqE#lm5(s3g*2OnA22mIC#Ps8;ciq"X[^r.4^1qW[hbpA"L]q
+Y'IIrqc9TlMfs3g%,0[8cU5'LthsMGs)cG*?5e)$SQkis5pb1=EChKpA`>5kOc?*O'NM8!#Q=K#
+6tM?#mq%J#R:P;!s&B%!W<!:!s],e!%f^:<aRu6kPtSMhr<u"qt^$^q>:)@qNh!BqE4KHqu$<`n
+Eg#Emd'62qu?]3fDkDIOXM26K;.Q%P'qKi!!5%Z!Aeb[n)EH]LVK:jj8\g>-NjE20`Wg)!!NH-"
+9o):rWrf8#6b21!!!&u!#bqE#ll"d"TSXE@lAb^qXs1Js8;ciq"X[^r.4^1qW[iOnb2kYqXEV'm
+eQhLf[]6dhqS2#iNJ(b(*fRMaS3`I<`TD,%jV,r2s8HCs88R"S,^Ogr)sIS#R^VK!!!o;#S%LZ!
+#Yb]%1s=#!"BA8!#>S;"pbMN"98T4&kSXK4nJ!jrV#FNqYpBoqYBo;qXOFXr;Zd+r:osVo()PMq
+>1!drVaJ,l2"6Jp\Xmao'5<-k2>V+s6S7jf&Qf-qrGkY0E;5,f(n_%p?9\SA2b8+&HFh1^#&e[s
+*uL.!#GVO!!Xkb.Sp*[#7(MJ.f]eV!!!BP!<<B.rW<-%rW*f;"onW29Ad>]!<<)ohsgC7q"ad`q
+YBo;qXOFXquQcorVHp!rVZTiq=jRSoY11dqJZ*&qYL$\na>E(rVu,^=WgUSDT:H-k5Y1JI=XBl/
+?.1Is8(1"s6Tc`]7kf1RDQ.<%290b4TGO5"99)8!#eL%BQUc5`Qd)MC^VNh!%A'T"9S],!<E<''
+c[_cmeTU3eE?khq!dkHpA"I[q>#U<nbW(Zrql`lrql`q"oeJuqYBs$qW[kTq+CGVp@d_:o(;PBl
+fb[B59CUm:8ImhmHEuO5l^mA_>+&os68%>s60.2gt4h!"Yp/[*YB4h!+G-&Ckq]\s5a1=jll.4^
+d&&,"9&9=!<WH/#7(YQ'*&"g\Y.WI:X/q+s6oFHo_/(Zq18D4qYC'hq[NAqo^VA9p%A(Tqu-No^
+A@'is7uZhs7p4*o%;OXp[m^YjSRTUISWH6Ls3TfmI')`E%*ED`RWoHs7H<Tp.lhP)@?r[":tPI)
+T)A9!"VW\pA`kAj8]/Cs7NVs+<LRa!WrQ/"pYD8!!bXq!#>ORec>%3l1Y/GnauPMrqV-AnbW(Wr
+qHoro^M53m-O01oC_kQ^A@*jrqZQgs7ZTKk4nrU@IW=!j8[0-=Z$mHL:5A&fAPW7J/]T(bhrHgi
+Utt*X&1GP!!!<R)[I&V--4e5)(mN<s7bXRnGV\CoBGE<!<<*-$4$h=!W`91#64`,5Rb]Urs@]_o
+'-/Eo_/(UqYBr<qXOFXoa(-\p\FXZo^_hSpqHUhqJZ-'q>'gZo^_SNs6eI`h=1I9p\==DqZ!"S9
+a!kCs8U%5qnur+:laYos4=@`-3=/K)A)rL08BM_KF.\e!#!<Nk4\TEqs)u,rr5nZ*#8qj#mUV8!
+!!N0!?hXI!0uF@AUjORl1=ZEq>1!bq=oO;nbW(P#Oq?Zq>'dVnG`@`rP&-mqGHt]q>0p[na?5@k
+O/9Jp#uG)aoC`"kO/As]^>`?@o7lVe,S)#nuT"DY2K?d%0-nH-Q,"\l(f!p.2`I.!#C7Pjo=Atj
+Q>t3gl<6b!WWB-rW`?,&HDh4!!!KG!fat$+R8C^s8)TkquZ`jpjr;3qYBRio(;YLoBk`$l0@X)o
+Ci!nqWReUqbd4cp[n(WjPT7qs0gY[kZpLf!<WHM-6?l+b/<<)P)Qm&s+#"6jQ4Uu_8<[mXhNlJL
+G/lV%0R(G!!F*/r93YHs6'FQkP#Vs%fmmd!!a&;rW)ou'*87?#n''-`Xgnps5a"RrVZHbq>L3iq
+Z$AYq@`]'r;6?cpA+IVp\FX[p@n@Yrr)itoCW%T%/0Stq>C9mrVccrk4S`R')q1rnc/X\lh:2Fq
+=sa^rVcTeq=r83kkb>V1&C_?o^h/Ds82Dr,\'nfB4lor5pJK`%KHJQ+TOE1a2:\#!cXEiGt9G<2
+D[oW*#fRj!$<'c#8%II!=o>#`:i3Ho&SQus$.b7!!EQ0!<i]4"U"]('*AFE$5!87?a07ap\4O^q
+tTp^rVZNkq3_!cqu$BhqY9das8N#srsA])s82Tbp%7kTrVmZ3r;?0Tm-F*.md0uOnF,9*lMKc0n
+GE1a!;lcls82loq"`53kkb>VD#3u%o^hJMlI+e"-AYl'M,B=+4s_j1$lpbs$n2lLH"JH]+CL:hD
+*KC#4?ktg.MiF$*\@j+#o+-X!!iSMnc/+Os82ire/AGk/g16'!WWQ8!<`E(!!*-)#7(n`*K#FJl
+i6VOqYL!^qu?KfR/.'br;?Hgq"FR`qu6F+qt'@InFQMVs7Z3^q"=1ElML;Hp\Xt*q#Bd^o]H/Ak
+jnN=l080Fqtg-bqu"J1kkb>V0`(V>o^h,<n*9bn&J,cZ0`Y@&Xk;h:pVH+oo=`_qT.p<_!!!iW)
+$p<K%1E4H)%6BC4UD5r&eP<L#7"Q7jRW?$s0_Clh>d$'DZCFX!"&l0!!30$!!*0*#6bq_/i<Ism
+d]uFq=sa_s7c9_q"a`Oq@<E#r;6?cp@e:Wq=jUWq>UBsr:TRKnb`>0r;$'Zo^VA6jl,Ighu;j;s
+8W)urqQ0]s8W#qr;-3`r;ZTicMHc$s8,jnq=jOQnEg2Tn*s<\%LXK]#T*OC!)'B&_Z/Q\]SK8`!
+#HLd!!a#F%1<=>!"]bG";Mgd#mCG;#R(D?#R]%Ms6J25q#BaAqrmO*$4m[S#QOi+!Wi9#(]jdC!
+!"#>%JAHPnFZMNp\=Xcp%A%Qq"^6P&c;M(qtg*]qYpNpqt^0ime-SWs!RR5nalMLoBtf2q>0^Nn
++-/Nq>^HAk1@uPs7YF2lKe-=r;-0]qu=\4kkb>V,5V-0o^i+Fr91uspZAKD72GqH#qmY+"Xj?T2
+P,OD!!"JVr;['+#7(P;!<NK)!$hpa#m^\8!!3<2%g3>U@/n^UqUt<&rqu<dlno+T(BsjE#6Fr)!
+#G\='*&[[#g%Mpnb)\Pp@e=[oCV_Lq"^6P1&LnHqtg*]oD&:\o^__Rf]Df)rVZZps8Dors8DHJs
+8M,qPAF,e-5Z^_2#q9TOMLGdrsAZ#lLOcIp\"C_q=r83kkb>V,l7?2o^hS3qXW)7ir@a4iW&0Aa
+gJprU:fRXkm8X:#SSKa#9WmE"p4u4#QOi+quHa!*ru?B"q(k?&.oW8ec4Y/nb3"De+E0`&c`sT!
+#,D7!W2p7!<NB('ED#QmIU&Iq"=:Qq==.Lp%S:Yqj@3iqu$BhqY9dLnb2S@l0e6Dru(IbaM,9lZ
+a[QVUkWbV1E?u8$jH\<.T:!*r;[<.7&T,3mJYo,p\X^Xq#1$]cMHc$s8+;Bq=jOQrUom_r:d5hi
+r@L!n,;h,UXQWik-b3h/gV;6$NM"D"T\T,"TeQ%-NjVT!!No6!<N6'#R^qG)%lqOs5)r=e)UK!l
+h:7t+93Sc!#GV;!W2p7!<=&B!XTDhqt9^Zq"41Mp[RhGp%S:Yqj@4Dqu$BhqY9dPp&"ORmIL,7k
+igjH^qdjt]uA.1Tla430F7^b'Ft<N(cF\?!#H\)!$nH<o'?>-jn8NGp%SC[oZm<tqYpC<qtTjTn
+^.=1kPtP?s4IA/mJQ;Ii:cm6U!r.%"<\Qn"p"](!q-+"!<WK1#RLhE#np@`rn.&*rr4JHh>d$p+
+rgS%!!WZ3!s&E)"U>hE!!rc.-Xb0lg[j%poBuGLp\+@VqYQZV:Aateqtg*]qu-<^r;5*ICelN$'
+`\4F!rr<)$k<RH$ig83$O%U`!'(#J3XQZ'%i#'E4d!S4kl86ob5^B!nFZPPp\"7Ur;6<bq"agbf
+)"Y-rqmo9q"=4Js5ikNf['0hlgk(bVaXuQ,s#^_Xks7!&e50KlMq:n!sJl6#RLJY(]\LRs8VZqg%
+57*lMHgJrW!$7%Kce3!#bk@"pG,6#R1MI,&>[-mcWm.l1FZBp\=OZq3_!pqu$BhqY9daqXO+HaC
+GG]!WW9=.inZmq>`/g*>fb%"TSaHj**LM!rs2F#TGK,!'B5kq!c0#g]-L/pA"CSoCi"Xqt^$^q>
+:*@qW[kUr$)%5p%%Y4lhpSXs6kAF&Kq-?Dn<!ns5O(C=9&=-#R1D5!UTk,!<NB-"pY_?'G^ZsX6
+Iats7,[JgAgR*s"YJm&c2PH!<`Q+#mpY6%LW7SE6#Wkr:o(7nFQDMq=s]OqG-qcr;6?cpAb!ZmH
+MAl!X8cK*WQ0H!t5G="UYbP&HW1;!!m4]mFf;]/-$#\!##S;$lB'M/sQD&o)J7[l1auIo^MDDqY
+^6dq"X[^r7:`/qYpC<qtTjTnc/XRm+beX>EXiss3CZ4mb[uif"(i9-jpFm%1<FF!q-+.!<N?+"U
+,>K!!b%[3Too!gZJP9g[sq.ntI-0qu@];!X&Z2"UP;3!"0GO"<:T`n+#K!kj7m7qYKsZR/.d!r;
+?Hgq"FXcq!@A8ft5-o-U8mb%KHS4!<NB&">9`e$P*VX2nI03!!"nc!!rWD'*&Ii&HDg2Gl-"jmJ
+m"Wp@7P=p%nU`q=sa\qu#%Al2(DW,l@B0o'uD5`9mSc&0Pt9dJq\qp](3$s5Jtj!!!K?&J5KZ"9
+IrkrrN-$rrY1[+p.f`!%-CUr9`J1lKe9AmFBr'!"'/;"9eu7#7(SA!W`B(!"^IW*b^/Ys6&Y1m.
+0oIqY0ZMqB5\5r;6?cpAP$gn+H_\nZPJ<5nsA'!!W]:$O?k8!$`N`!%Mkahs]5]9ElIb#o"!R!!
+WE//hWZalMp24g@t@7nEoZ:qu$?eq"X[^r7:`/qYpC:qtTjTn_sNJfr3R'q#B=@j5fRrgu-G]Xo
+JV>,mand$4$e'!;QX5!!Nl6!!Y#94N7@#d*r$ph!4q(=o]lL"pb,6)@-NN!WWB8$312I(^M)]4O
+O*,mI9`Aq>'g[R/.m$r;?Hgq"Fafq=XRL[<eU[e!D9Z"98E'#n7=R&/5$C/.`(7!#.X:!"],>%0
+.j^!!!f?!"o85,Bi>Ms6oLLoC;;=pA=dbq=sa\qu#%Al2(DW,5_0.o'ub9jo>5NqX3;2o^'53@S
+gq+:;.nP)#s^>!s8T*mf<=fquAY[!!*<)%LrI?7\BGPs8U-gqZ#[,&g@;\#RLhD"TeZ(":,8?%h
+B$X!/Hfqs8UsJp%J.Tq"a`QqCMOAr;6?cpA4dcp@m[MEW?e$((MN7%g`RK!WW3$#8@XM#lk54(^
+D2a'dX^r!!<lS#mC5-(E3>S8o++gnE]N5oCDMIqY^6dq"X[^r7:`/qYpC4qtTjTn^7C,h>ci_ld
+WEa91PPop\F^e%g`4B!WE'%!<NB-#4V]n!Vud9$igAI!!#P-!`81Janjfks2<.]2@g9&#RLb@!r
+`08%L2t8,ps*_!7pH8ZK;,^q"OLVq"jlTqEb#Vr;6?cp@/+^p%&%Zo(i:G\X%J\LML9i/J8-d"U
+YM@&d/1F#65P?#nI"L%0-e;!!ir9$mGZa"ot@;gudqmrq$NkqY^6dq"X[^r7:`.qB#A*s8M]^pA
+4g[n,:XG&hkQ*mH+Aap\t6o0)tte$/beA!<ic<%1WjJ$5"&W_Z/Qod/X'birB,\1&q:p!WX;C)\
+)iJ$31(_N!^NOj7<$;o^Vn[mH=M;q?R'"rVQEbp@\7X*VB4.rqQ0\qrd\0.4#EF#64`.$O[+<!!
+EE,!WiDs!#Ge?!$DFFba729s7,+DlhL/Mr:fsbs7t7Bl1uFup\=^`nEfVng=,$Zen>[@4e'ardd
+PND9d22'"Q'1Z!r`<%"TJWA.3p!"[CcJ5mAKIRmd1!4&HEar+932crW!WF,S_:hh09/[\GtCKr;
+?'Ts7bs\RJQs_"oS8nq"FFWq&SejoC2&-k3;L0krEP[!"o85"9o#3!!!-)!s/N)oDfRE%0`DPs8
+2!Iq"k$jp&"[\p\t0ff)"Y-+8u!/r:oXAl1Y/FLG'fjfBE7rs1H.FKJb.X!$2OK!oX+[!s8H%1'
+7af$OQk6%MF*Hq>]I8lM+FY%KHqG#m;(F(Ba^<!<<<nmHTm,0_jo4r;Z<Lq>^3`RJI0frVZQgq"
+OLXpAk3lru(Y)oCM>Ks0^lB!#Z"F!s/K(!WiK-!s/N)o`,^3$3^Do1S+:-s7>+HnFZVTp@nObpt
+#<+qB,Y0q#'sUl0R<8M5'D;hnH:V?<%N4H(t?h!"(+Z#mB2e!!3'!1B\'u(B>?n3=c0;KWkEoht
+R*IdMt4n!!+5K&-*4X(*FP+&Lrj)=9+iMrojCVj7<6IoU5RUquuuoqYBp]q=Yj%p@e.KmHa&as5
+X.FPo0Q,#6b53!W`<)"9S],!VZR1!Wri2!<<*+/'e1pmeHhVoD8=VpAFm`f)"Y-*rG[+rr)KYo`
++sVnas7o/-$*0UZ_[5V$n:M.NJL$huE`XrW",E#nRgO$ih%P-3+/UFFWBOkM"cH('#BU0a'01&d
+&+8%0?D-$o/JAb5]fbs6B+QqY-ESrql`lrqZB`rq6<b)"mLjnGh8Cak`*_"U>;>#6Y#,"9\f.!W
+hup('4dB#oEX\&SSoDh>c^=oD/7Tp&+a^f)"V,(A7J&rq>sXn^*7l/gt)6s8V?_k_+-drW!'A!<
+<`:i;`l]!rW*R!<X>d!WW3\%MUc##Sq^[k5Xl`/(_Z<gV,cu!rrfF(+MHd!!Nu8dJq>`s75gXp\
+U*Lq=jac(B4@1s7bgUr=T;?$4@.C!!!-)!s/N)p&Gj7!X/T=!#,DBM>uK*_Z03%q=F7UqtAV;l1
+uM!pA"Xbo'Z&Jl`+YQ$S[+urQ5)jC18;&#8n-T!WW8[!!<?+!Wi3!*!@Dp"sEsI!rsW6OoP0liW
+(aRfC\('%NZ2`%M&I<%Ls'T(B_SAh#.3FqYBg`RJHpZqt^<iq=u'(naGu=oBti!kl()Nli/jO$O
+I%@!WW3'"9S],!VZQt";1\H!!3'!%L-nPhXp(4nbDnNo_SIXf)"Y-+8ts.r:o[ClCUia6EB&2s8
+Th5d+0Qi$315E!!*u<%H.9g!<NE'"u-8a%0dFF!#ttP.p5c47KA0eonreGrQXL)o`(j1!#ZdX(]
+jj@%0r6toDe^\s8;NgRJQpYs8)`lq>)-3rqcKhqXa+:s5s@WoDb?p%L<+9!!<B-"9S],!VQL/&H
+EsS"V1hB!=c6$o`)i!p\=@OqYTs:qW[hsp@\4Zo?EM5D9_JDnF?81b5_Hp'*&@O#m^b>!s-jN.f
+f_V#7;t's15j[?jM_%s5*e-roa<''ak!Q!"0qM('4VDqtU3Tp&F^\nVR,Aq\o>,p@IhEqZ$H^m.
+1"+DufqQ!rru;"9S],!VZTo!W)j5%fd;!'sdl,q#Bj9s6TU^q=sXTp%\F_hYQL5*WGp2s8W&^fD
+ka>s6T:UipO6N!!!oQ!!if6"TneS!%J!O"pY/C('!Frk2tS-ID5a]f)NS?9*5G"&c_nC!#,Y@3p
+c_@kPYATs+pOMqZZfho^_SFrq6otq>97(E?#Dq!WiK-!s/N)o`4pkrrNuJ"q)7V;WQj1s81jVme
+?_Up\4CUq>1$GqW[hss82K^q>C3hnE0TImJm&g!#[.##7D7`#6k>7!WgaM.ff_V#87R\i8a1fhZ
+*TU`&F@*Q]74P!!iQ9"9o8<#m15@iVDp%rqc'_oSNGEq]#J1qY0[TqXsFOq>9sZs8U"p!"028"9
+\f.!Whro*<?3E"U5/;('"IE!5RggpAX1Rn+-5Gp\=U^qYL$EqW[h_p\=OUmciosp\+Ud&EUu'!!
+ErM#64`4"U,#2!WgaM.ff_V#7(;Ff`1XDj2T=NI<GR7N)j!h!"/c4"V:h?!!!B6lh'Z4s7PRTmt
+gf[qu$Bhq=jR^s82Wdo^M;4ki5YH!=Sr2"9S],!VHF5!WrT2#RLJA!!iu5MX10)r87JCn*ouDqY
+gBjqY8qDl1u+bp\k*fp\=UYh;&&1:D+g3)?Bg=rW)s#rrW3$df:m!!sSu2!#F)aqu?!Ms0Mb+YQ
+,7U+pS>[!!<E0!!*'"((SdAnbE.]n,N0=q>gElr##;+p\Y!jrq#OHp$:iAThYRl"U"r1!WiDq!!
+NE+"U>;>rW!WF!=:`ks5j:@q>0[Op%S@^rr)`ihYQL5rq@-"o_8=aq#C'Gl6-->!!!HE$igGKq#
+T"G.ff_V#87(NaR\B_g$[eug#W3##QOi.#6Fr2"q1VE('"X@EJ`]Gnb2MQrJ::iqu$Ekr;-6Yqu
+?]gnG*%Po`+$S"Uu.K"9S],!VHF5!<NB-"pP52!"],@!)M^ps6ogap@e:Wqu$Ekr;>FJl1u1nq"
+*tBmHj00s10R2!#Ge^#ljr+"p=`&rW1OL&ci(=#7CMGgA1^Irr;35s3S+prW!63!WW]>!#,tT-2
+mlM-qN4dh=U:0r.t1Mqu$Hl(]=1%q#($ap\b'Jq=+.>"VhaT"9S],!VHHk!WN3;#RLJ8!Wi`:E,
+P77nbVkUqtp6dqu$HnhYQL5s83Q0s8W&ek5=&-&J+q"!!!*2&.&F6!<3)M!%S'P"pYD<(Zk,Tm+
+hO$s5s@]!'M,+'`e:P&c`(;!$;1F.P*FHs53kToDa[D*VoU1rr2loqu?Tiq>:*bp"BB&o(2nn"U
+"r1!WiDs!<3)s!#G_O!!!u=56([#d,O'Pm/R(_qY9mas8UsPl1tqjp\4[anF6;@s'GaL&HDpS!!
+33)#Q4rV!=/]*qXs=>rk8@,_#GM^)uqeq#oWdc"@Nq1!$VDD>P[:YrU^$cJbg2Xq>0s`q"F@Trq
+>XI!@RpN"V_UM!Y#>'!<30:!sAc5$4A'YOT3)TrUfaXrquQcqu>OLl1thfp\=abnaZD?miVuB`W
+5u>)$:!E"U4re.e`Z9s7H?Ds7,CNJ3s_F%i5HL!"T/3!!Z2i""#t_`;f&tnbn%8(\mh&qYBp[o`
++[Ik5QAP!"K,>$NL5:!V$0h!Yb_?#R_%`&QI*Vp]'%@q>C-bp\Opcr9!k?q@<K!q#1*^o(D@a!%
+.sN%*/DL"9SQ&.KKYV$C[CLo^`%Fs7-$Ls5<1)*!QX(%0.:P))b]>\F2.gB_K[Mg&C13Jbg/Wq>
+0s`q"F@MlJ1Lu(EO#!!WrT+!"&&n'`e@>#Rh.F(CP$Yp]'@Ip\O^[p\Fa_roX(Aq@EN"q"t!aoC
+;3_!%o&g&HTuR!<WB%!#5SB$o$]*k5=K:irAZDir@j7bX"HBrW!NL&NRQ'kO&2.m)K(fs53_Crd
+jn^q"ad_q=s[Ug[">#lN.JR%KHP9!!!6*mJm^t":,AE!#P\QSDiu:o_&1W!VlKdr9!k=q@38sr;
+?6Sq&BVH&cr+>aT);ArW"GM#S.S6lMBK>o_ndhmJ$&;pAaOYs5F8#*rl:<p]'XYs69RKrTi\>pA
+al<qA8r&qYL$_p@RVEqu?*k$"=2@#8$q9"UFGq'EJ:?$4@I\#6?16f`1U8oCVbNp\+FXk5+?=&,
+H+uq#16dkl1i5!!<6%'#jo&!X/oA'3FJqjT#/Ts8VHas5F"FqS21J"U?OX+aj=Qir&iVi:Q1)kP
+t2QjFR.Dq"ad_q=s[Us7kdNn/;IR)$1'X"98T1nGrRi'`\79"9o,F!"05:lb`Jio'l5Dp\+4Sp?
+)59q@EAuqY0sgpZ:0@+TMKH!"R*N0*)+U"9eu7#]TP<lgauFpAa[Zs6BXVqZ$TgNr]Ca0>@>`q"
+FI^lMp8OrVlTal@JdJq"ad_q=s[Ur:8_3iY;HX4V.Z'#6P/2nGiRm"9&<6!WrQ*!!<`3N-EbCnF
+#f=p\"(Ppu_G;q@32sqY0sgpu@YL":P87`rQ,ArrahS!<<+=q>]m>s7l3_p$r(XoDeLUm*#;2#X
+4I?h>dBCrqufnm.12:s7lVFqA/l%qYL$_p@RkMo(prD!l/%[!!<K5#Oh^0"p=u.!!!$$!#PqF!!
+*_#o^D/8p%S+JhYQL5&,u7pr:fXZkZA]&$3gJ4"N:?c!<`W5I/<L(s6fpdrVH9arVQ3Qq<6no!/
+HKho^qhMp@n@WJbo3=(]4%(qY^3^n+kr9qkt>5rf@6f!!`i2!U0S"$O?e6!":)/mf3.3s82Q^mJ
+-VSpA=gMqW[heqtKjaq=ajY5R[W&#QOl+aT);ArW"/D!sJp[rq#UYnc/LbqY9pcr:]X[mJ,7Dl0
+/$:p%A%Qp\=N7qYBt&qt^'ar;-'Ss5<qEOW#;6U^dn8#mobp(C^cY!rrH7)6E5oipHL!l0J$=p%
+/"VpZD>:q@*/pq>^9ip%'F/!"oUX!%.jM!<<-%!sF8VnF6JNs7lKeq>:-hq=XOKs2)>Hs6'(Jp@
+e7Uq"]L;q>(j'q>'mbqXj7Vj8\:T1ed5A$k31B#Nl('#71\A!WW9)B\rdho`++Kl1=]Anb;kPk5
++?=&,6&!s7ZKDh\Q7o'*\F:!Qb<g"U"l-!!*-'J,ep-qYL0aqYBsar;?Hgh!+jZe*5iJp@e7Tq"
+a`:qY9n#qt^'ar;-'Sr9aIU3,X0/\c;d3rWM?`!!E-&%iqS?o_J:HnETZAo^_eRp?)59q@E<"q#
+Bm_VR.3B"qUe8!sH^G,m=DQ!<<-%"*+A,q""C[p\FX]qYBsar86u8mdKi,s7Z3]q"a`:qY0h%qt
+^'ar;-'Sn+c,H't(%2cN!qI!s&Yg!#,G;#RUq>DV;l+mJcYCp\adYqY^0OqW[hep&=U^n,%3X)[
+-HU!!!3*aT*[j!W`9%!WrR/s69OJrqQ?bqYL!Zo_87]pY#TFs5j:Tq"X[]qYU/@qYBt'qt^'ar;
+-'SlhoE4%Hl+7mKWn+"TSek!#>kE!<<6-#R:>cNd(Ncs6K+JrV6*arT3n?q@<&mn,;eT:KA52!t
+,/4$-3)H!WE'D!<WK16MfpGj8ScPq"jj[nF,uDs81aPpA=4>q"X[\qYU0fJbo3=(Amq'qY^3^n+
+?D*diA#Ls8<-)'*J:AkPtem"98K-#6b#+%3$\@g@!MXpA=RUqYU'MqW[hdmeQ5Kp&@->%0-A8"U
+GIR!$_LI#7*-Ykl9Q>p&Fg`qXj1@nFlDMs8Vfcs7c<`q>0sbr;;-Bq>(m(q>'mbqXj7Vn_(#qmf
+3=^!!!N0!"@rh'E\XL"TTqQ!$fhis7#:Fq"+(Nq=WnHl1tqbnbrLTrtZsc"9JT(!!*/@!$hRH!<
+<*>s3pr6s8VHSp\FCIo)&I`q=sa\qu$Hgq>:*fqt^#Dq?Qrpq"agbqY9ma(]XI1p@S(Us8V6ECP
+D'MkO&<d!!NE1#O)3h"9SQ&&d8UP'`]3Y7-ssQnc/FRqu?Kik5+<<%eT\umdpu*"U"o.!<<-$`;
+h+`!WrQ4rU9dOj7)p9m-a]Lrp]"GqYBp]q>:*er;HWorVZPLq?Qooq>'pbqYBm`$i9Ylp\Fa[q<
+0*2li-nb!$D1?!=/no!!*3(rW!Q6#n.1A*<7:bhr4,$s8W&pq=s+Kl1tkeq"spZed)E^"9S]+!Q
+P0?!WE'>!<i`:-,ZDArVu]Ts7#=HqXjCVr;6<bp\=R\rVlcq!WN%KqYC!gq>U4'q=s[Vkl9lImF
+(CTn,O(2#lk7p!!*0'rW!Q6#RUP>(]XVA\(gK?r;ZZhrV,INl2(GW$i9VpZO$U6!sA].!QP0f!s
+&B%!<rrD!/cs)rV-'`oBu8Jn)*U6r;-6`p@n@Wr;HWps8MupM>@JPqY^6dq"jpaqZ$:(q>:*coB
+t]4`=)_+s8D9a!!`T,%Hmd.!W`9$!<WK1!"0)?!$.R%qWRSOpA+a`k5+?=%JTl!p&C!`!!36*"U
+"nI!%.jL!!!$($kND=Bup#Bp[m_8p](*QkP"cJp\+=Tq"aa^qu$BhqY?!E#P\,pr:p!]rV?:%p\
++=Wr;#jGs6P_3lc/qnqB5_:!=fJ$!<3*"!##A7!sAc/!"o>5F85e0p@n:[s7kaQl1tkZs8DKfA/
+57I!X/c3!lk9@!WE'D!<i`:)]SiFRa10Zs8)-Mp](6ip@e1Pp@nC[q"ad`qtg-`M>@JMqu?Whp%
+eX_q%WMnp\O[QjmUoCW;5QTo9:-n!tPk'!;Z^,$ig87"9:Endf'46r;ZNbk5+?=%IO2qm/K6`!r
+rB+#6k:J!##A7!sAT4!!!NbJ?dVemcE[2s8W)h$hX/gr;HKhr;HTlqhY(Ro_\[fp@J+[q=k^%p$
+qYKp[.%oj?@X+1`$-)"U#5V''0,m!WE'0#65;8!Xf-8B&<CDs8V?Zk5+?=%I=&okkZS:!!!'(#6
+k:K!$2.B!<<*/&IS[E!!WEuX8Dq`l0RU&nF?,DqYgHlrVc`srVVNK#P@onrq>sZs7uF+rV#^Lp@
+dn7Nk>?%.1$4e!$;[N#QOiKk5YPa!Wi6"%KdpU!@@d_!O_=Hs8V'Xk5+WE(&[t*q=jUUo^DG@r:
+C0o#6b><#R:IN!$qXI!WrQ.#7LtH%i?,p#673,VuPuWjT#8Pq9o;qp@n@Xqu$Elq>0j\"o8#kqu
+$BVqU,6?q>^<jqt^*gq>U6iq^(q4rqPpIoDS^_jQcd?nc.\Ds8V]-B,)L&"98E&%iP`[#6b21gA
+hie!sSu5<r1GJmJ-SYo]bZ6rr2<]nbNdoqtg-_p@\(Nq"=UP$O$t<#6G)4!lY-C!<N<)"9eZ')Z
+pKW"9nif[_;_*o],u-s8Dufs7c9_q>1!dr;$3_q;hD2q!n:\pAOa]rVlWhqBPe,n*p#IdJa+Co]
+t,OqYBjSi3dGY"U55>$OdFO#R:P;!s.-V&ci(=#7N*9l/:J!rql?Tme-JTmJ?AL'DqY%q"FCQoC
+hqRpXBQR$O?t@!rW/?!$2.B!WrQ.!<iT,#7qCN%gN(Y&TOKDmJl/*lMoB*p\ssdq<n+Yq>^6SqV
+hD;qt^$_q'Gt7o^D5<p\Y!gp[dh?qu?]LRVPG@$31&/$kX*\"TSc3"U"l-gAhW_!sSu?!3lL_k5
+X`=rpp6bq"jmUqX=7lq=jUToCMVEpZesf!!W]5!r`0#!X$IC*<?3C!sA`4$OR+I'bh&V(Bt0G&N
+?!?jo=!(s7tjRp\F[]qu?Nmq#L3hpZ_P5rUKaar;ZZoqZ$BcqZ$Bkq#C(7q>0jTlKe-BlJCXss8
+D90ULtt\!!!*:&e>?S!s&B%"U,#2!Wh$U'*/1>#9<eSl0.U6jRDd8p\"7Ur9jFOqZ$@&q"FCPo(
+)MDqr*P@!!WW1!WE'"!X-OD*<?3C!sA`,"9JQ*$jm%D)?h*!)$C@u?fUS?o`+=Xo`+Uap&OjWqY
+g3fpZ_P5p[S+[p]^Ecp%7kIq>^Kk+Skg,p@\+Nr;ZHPjRN9Cs8VrGa.H?T#QP,A%1jNo%gW(6!!
+3'$rrW3$gAhlf!sSuX!XaPAo'#l<oCr"PpA+XSqXOCoq=s^Xo^hYDr:BsEEt&*V!s8E$!<E8B!!
+`N+!WrQ.!!3'!)@-NI$P!.>!!!3')?=:Iip,Lqn*ol=p%J.Tq>0p^#P@]^p@n@Xq<@b7rpfgarr
+rE"qtg-`q=Xda)Ys1%p%7kKr;ZNUjQuU9cJdf,%KHeA!!!'&r;[$'"9o&6!s89!h#Iia!sSu8%f
+fE*r8@>Arpp6bq"jmUqXOCsq"OLToCDG@rUU!?>7CQ=!!!$$!Wg7?,QRrJ!sA`."p=o.$OHe5"V
+<!b!$2.Q'.LlnrpBaOm-aE9p\FU\q=P!_o(2PKq>:*SqVhGDq#:9rrVQHeq"a;)qtg-_p%7kHs8
+;W`o'Y`&s3^`DMZ<_n#mpb7!"0GR!!!*+#R1A3quH]sh#J&g!sSu1(BZM]h;[_so^2)>qu#jXnb
+O!qp\+:Oo'u5GmJkL)#lk,/!!*0)!lY-c!<N<)"9\],!<<**"ooSB!!`K(1B7D+"u#-/s7#7;m-
+sZAqY^0cq=Fp[n+-,FqY^?WqVgo5p]pB[nF#Z.l0.s:,5_64p\".Knc/IRnbW%De`Z#IGlRgf!!
+!H>"9Ac1!!ic1rVus""8`)u!Sm_g!<WN2"W[[FR@37/s7GR@p&=sXqXF=kq"=7Lo_81[irA]R#6
+Ft;!%\B[!WWE8!"oP<!!!<:"oni?+94R`r9N5+nbiF^m/-h_p@7bMrr;lnrVZTmrsnP]me6P>m.
+L,Ns8;Q]q>:0trV?3Zo_/(WrS.>[rqZ3VrTX@Qo)IqMrVc]o+8u-.p&FFPs8W&lq>^KhmJm4Pg\
+0A$n@)7"%2o?L%K-J1"TJT%!<*#r!<3)V!#,G9"U524!$)%_-cl#Wh#H@5s69LMqXF=_q=jR]oE
+b-ik5F6=!s&J5!!E?+!!EE'!$DFN"98N5'EA4X'+6F'Vu6SicdM+Ts8)3HlhLMUnFZPUrt"qsn,
+2q[iUQpIr;?Efqu6Tp&+8oUo(2GBnGE(Wp@IhCmcj<Ao_e@clg!d%nbN1a$hF>akP=KEp\+=Ro`
+"G+o(Uf2mJ6,/qt9LOqu-6Vp$(W=rRS?31D0Zh&J,3N"U"r,!W`B+oDnjkh>e5j!sAf4)uprY%f
+gk?q<J"-q"sOYmeZDK%Jfemo^VGNmJOj&!!*,/!!**&rW!'%#ndgSrW"S`#QP_I!!P,I]`7Qks8
+Vf^qZ$N`kj%[.o_/%Qo'P]?kl9<'rU0(InE]N:qtKUUrrN)tj8]/SqtL*i2Z3FJqtp?_s6f+Enc
+/:To^hYDnF-DRjRha)s8;KVm-scFo^;5Gr;>(ETHsRE&dJXU%0-P6rW!9+!sJr8"pG,3!Wr/uh>
+e2i!sAc3)?:3R"TUCSmdU,"n,;tIqXOClq>1!cq"4%ArUg)`$NL7<!&ar\!!EE.(C(!A!!*TD',
+2?+!!a8D'``mAs6AnIp?)8Ps8;BNlga`=kiCppp%eRAs6K^bpAY(,rVlisrV5mPnaPu5l0-pYi8
+`tbm-a-&rqcZjrqHu^kO80Cr;-3VlgjT=qXaXXrUqE-l1G#U^AR?gn*]]<p$qDBp&Eg]s,mBb+=
+.?p#mgS7!rW*0":#5>#6b22!!!*'!WiB'h#J/j!WiH,":P86&d/IMkN_O(ir8uOp[7nJq@<>tqt
+p0\n*KfGs*tmd"LnFs#m1/:"TTPC*Xi#M"9])K!$VXT#6Q+L!#R_6`VfW%s7ksJp\jmVqsrt3l1
+"EAp!p0B,!7"q.krq?1+t@=6N0=[69m[r7R]^35X%:lks>>*3&33B0.nk@5<qM#5X%=h0I/2.3&
+W0<0JP@@2`WlF1H<eSh>[HKp%7nLoC)#@bQ$.uHnYO+%1E.8rr`?(!WE'&!X/f3!s8B#rriK-!s
+/M\!<*$!!r`94$NgeK!#bj%q"Wh=s8VZcmeZDK%/K\lo^VGAs8,n<!!g"66j*Yn)#sXh"98K;+r
+((X#6GGE'+"XH%j;_h!]"Mkm+:e-s6Sb7s7u?Zp%\4Giqi\B;_55t^T+]V_7[@o`NZYU\@VRLr4
+M:/s3+Ebb/hWC`QQ32YcFk1[*[(&]Z.k:_8*n)`5fsAbIkD5n*U/8q"aa\p\"+GmJ6#6Jkc:G"U
+"f*!X8W)!<<-%"9eu7#7CkG#R:P;"U>58"9JV]!;Q[,!!`c6!$D8,mJl,:oCVYOmeZGL!r;T`rq
+$KhnGi#3'EAFA\,\Jo!#bh>G]"`:$QUQ6(`sXu$Om[Y!"&].$j[":%QA'oh=BX]m/QnSo_A@ZlJ
+D+3@#/Cas7>s\rr36%qtf^Ko(DeWq$6<Unb)_Vs8V?_s8N9%r;-6`p\jjpqY^?mbMq(@p#uGFr:
+BpY*V8qIU<NVnnFZGKp@RqFnFHUG'EA+<#6b/0"UG>3!!iT0$4I:K#7h@D%fZtA#R:P;!s.9Z!!
+E*"&-2b3!!3-8$5'!3meGc8rpoLRnG3Xip%.bHp\F=YkS"=($OF6B9F:b6!#j5Ns.h.F!X8Z*!<
+OYQ!#GVD+rC:[(*<b]!ub(7oDegIr:B7@o_A(HmH6:\[f5LLqt9LLoBtSgo(2MHo^hVBr;?Hgq=
+s.I8,W8\q"F@Oo'Yu5ho;FBCl,pRrr;3^n,NFdqtTmWoA'@^L]?cAq!IVDo^hYEo]FX=!#Zp]"T
+SW*!!!E<"TST0%M0*W#Q4c("9o#9#R:M8!T*nV"9/H%!=oA@!"&]+%ff8irVtaSs5rbGnbNdjrV
+>jHp%Rq6s6'Rq$31CS!!`N0$jQbS!!*!!rrW0%!Xf,6rW!D<YlDU&!"oeB,81Lj!WE'Y#ljr6*"
+N#L'bp^&[eB[pki;L=o(MtGq<Itogr]THnac#/lh:AYrVZ]^eE5rUs8V'NjT"T>s69:qs8)?Vo(
+W(]o(`7I[@;kYIEp@0hZ*W7rVlX5p[[qN`RK/^s6BRWp&FLCrqu0[s)/#D&-rRR!r`0<!s]&8!"
+BPL%gidH%LN=>#o=^."98N4!!!8V!#GeA!W`9%!WsYHh>cd8s7ZKlr;?NkqY9d\nbNdir;,pNp%
+@bAl-g"K"onhK!!WN0!s8N="T&2u!WN0""%s7<gXWn.o<rcn!=Jl-#o+6f"on]>"onWR/-$(d*A
+Bp7g&L%#q!dh>k5Y)C+3iO5nG`IfqXN_)g=Y]SgZ/>6p[6>as6BXSp?V8>rq69as7cHi0DY80hX
+B3E()pV6BbLKGs8)']r;-3^oC;GGq#%]_s6BCTr:p!XrpTm*`DmBZ&,lP3#n.=R#Q=]'%K6>?%N
+,Qn"Y=>]`QGZa%fcY;!!!2T!#>Y<!<<-%!sB@`[/]ssqsj[aqtp<hqt9gUq@E8qqXjCQo^2@RV%
+*Y/#m89L#6P,0!"/r@!;Qg4!rrH*%LCJ(o_nCFmal_#1*dD4qu?d'$Np;,/f,-#!$m?boD.kEq!
+@,:n&R94ptbuJgZ@ttoC`+_r;?Tpl/M+!l2UeAmcO3:naZYM4S/4<p@n=Gm-sT:nEoQ7pXXaXER
+"9g;$iTUq<./@q=jRRoCDGLoAM7WlM1DZnbN%Tk3Z_P(Bb6S!!3'!*!$0F#7_IQ!%/3U#R$Fms8
+;Zbna#BZ!s&W,!!V!T!!3'!$3:54#7#*YoDeCWrqcWks82lqpA4=U&,#_oq=jURmIb+0$ig8@!Q
+Y6F#64`3!"o;2#6+l+"A]:*"TSW)]!)/)i8=,*n#oeW)ZTjD%L`UC#ppbs$SMbm!"9_M.>QgXlK
+nNIpZ^V+9(W)7s6B+IrVcQcp\Ck9>Wa'0`rFrpm,[m%o)J7Ts78MJp@n@XqYg?hp[n+QqtTO5Y]
+*/]!#^$ThUM)qs7?$^q>0sZl0R$j+Lgh2s8)?\oBu@4'F"O<$j6eC!"]PCrW!c9!u_.p7;6iLQh
+g1=o(`%Ys!%UG$3C22e,U-_":#27)B@$!m/$bUq"ssbqYgHfqXOClq"OU^qXsCJqE%7Z!WWtU!!
+ii4!W`K9!s&H"!)EXr"98c/`4GU,p%dk;qu?]pm+'.dRse<j!<<*)!rri9!!*o:!'HY>q=OCSs7
+5,lAcMP]pu;>Pq=saUl/>2N&K;/k(B?nKlMCPVp[dqQ?MF6iq>1!dr:p0fq=3h;mJlSOs8Vc^kM
+H7:s7Z-Nf^JY8rVuoiiW%p;4J;N:mIC5Kn+Qc0!##YK%Kd%H!"B/7":5D=!#@5hjT"*XXSqhbrV
+>U.eL:P"%LN@De,U-_":#2=!!'A*nFHVOq#($aq"t*bqXOClr:fs`qXa7Mr[0T8$31[Y!(mJ&"T
+URn#7:eE#6k>7!s/H+!Xf"G\Fo1Qq#9jMp$h\CfuUXgF&sq+)''+c"TT2G!!!61&8:5+s7"kEp%
+)%As5<#7lL4'(oD\ajr>#82$3V.f!8IPMn,34Unb`7^rqeD+lhUSXp%%\Ri8=/!q#C6]ouH:Uo^
+h86q>9p`s7P7KmJg[RrpT@Bs7Z-ck5Z,/rWE9&#S$_4)[-WZ#64a0hXoEm!3Z@rm.:&Ks8P"_!"
+KD@"kWeT!WE'4!<WK1$igR&s8;'HoD/@_p@S1\pA4=U%fc=tqt]dPq<8M7"qL\C`rI=c#R19^'a
+tZc%h/mR#m^\8"oni-\?+0Zs7#R?kl:&EoB,B<s#9T'cH;G8"99,S+;+_b&-+kWS_Ebiq;qQ%b4
+F`_s6]jdqtTs\p%0CU,T-dd!A[RQmd''+s8VWc?iL$%qtg*^p[e4Yp?Ui(mbRO8n[Y0E@U?:ms7
+,(;s7?'Wk3W!<i9ft!J84WFs6TdWqt+\/&dSI;"98W9!uMjg#lt8J.$<*=hXfkW[/'+Xs8M37ge
+SR`#R(20!SIGh!s/K'!<N?+#S@>TnGhhFo_\[do^VYRpA4=U%fc=rqY9RNr6,-K!"Ju;a8cVP!!
+<E*\fD:c"p=u.quBFp!t>=M\_$lPfDkm:mJ?k^kN)C;r9XI`i9C9`D-.MW('FUB!!!c=NVVu>f_
+5LEm/?YXjR)L/n*0*,q4<@:2c+"Hi3rZjm/QS<s7-"krr)`ip\".KqsDb1MgpJETBlB+"W2WnFX
+-sKip5Fdp\F++hXpL$nGh^>;r6j?me6&Dh#J2j)@-il$jI%A!!WZ1%mGie[/]UNmc#I]rpB%Krp
+]=N@N>FLrVup"f`2fl"9JT(!<N?)(B?,4s7ZKcr;Z`en+?MNqYBt(oD/Fcq"44Ps7YURmJl/3C)
+d3^$NL//cN"^]!WiH,"98f0#6<G%$5<mK*WQZR!"8c+70E\ak4/KFhWOq=k48-;p\4@OnE]H/na
+lGJpsm>21]SBu$j?hP04"V"lF8VLg>q]%g\(I=m-FHHqYBU"q9T*=s7c9eq#:*YqHiads7YI8rV
+TM%*ruBa%PS%39Ls$>m%.&lP32fEeahi%m/QJ5s8DQXjrN71s8U^Nh_l>P%07(A'*oHU%fchD%n
+3o(p$(H.s8V^:U&XHJr:9FQms>-=!!WE3%G:^^"9SQ&&d8UP"UP//_=$1[nFuePnau\VpA4U](\
+RV&r:osZqXFF_rUBjZj@^'b#R182!RC`t!<N<)"9\o8":"qK^&eEP%gr@A*u5"[!rr<'p%e(Vr9
+3ABs7#OKp%\@Yp\+U\r:hoEpTZ(^!$;1@&-)eAQdYl!1@5&@lL4-/p@[nEq"F(Gp"BAgqW@2<p%
+J.Tq>'OV?iKfss82'Js8Q.#!Z`p@!"T)0k!U\6"WUfkl2U)Dq;qYVj8/'@o]l51m2=ZppAa:*Yn
+@<B)#t3R+:JVX!&"<P>L*9Eme#]2q!dY\UAsZQrq,gWn='Rk"9ni-"k`kV"9SQ&&d/LL!!E9%M"
+K[+mdp,AmI0]ApA4U](ARb'q=jX[rp]FWp[[_Jj!"R*"98N1c2\FW!WiH,"9no3!s$=?-5Zdp#Q
+"K6#6Ou:nc/(Us7PdLq"jILo_81\qD\0Bp%._BmHsfAoKOZ&(]b:"!"olBq>YJKd-q"mjo=lDp\
+4R`n`&Bkk5Wm$kk+E9oC_kRqYTgZ3WAgNs820Os2&1S!"BVR#n&B*Vb.71"oqnIiW%fahu!9*oD
+QW)rSde2q('=Po()1AQP'`-#Sn0S!$VLH-NF,hNV)eooDS+Bo&'!BZ2a:bs7Z-^o!eZ3%06\6!S
+IGR!s8H%&d/II!!3614oadHoCV\Gn*TW;pA4R\(&@Xup%\Ibs6'+Jqq1l&"onf1!!WnX!%J!N!W
+rQ.!!!*$"5X!6QPBW4/H>bS!!!0-#T;"Oo(W(Zo^MPOnac;EpAXeFp%7hEmd09)nD33%;*P6o%g
+N(M+!I_=4M9q4l1+KHr;6?is8V]PhsBe2hY6U;n*ol>p\F^anbP0>o_8:Xm-jfMoX]BR4>g(VhY
+=hYs6n(lot^(Y_o0!CQ,<S$p%RtDrojAhJ8tVUiEBau&HVh1,RbY)!!4BnW5%cgj8],LlhKH=)n
+c.6nGW%Qr:S&0#7^_H!!V$U(BOU;!!*0*#6k>=)@-<3rVZHaq"F7Kq"FR[qA/u'p%.kNq>:3crq
+$'Ss-`og%LN1?%*ei+!<N<)"9\f,"TSi,g@5#8'*&IA"t'EQ!!EQALlV&sp%eIZp@\.Po^hYDna
+QAMr:hu?s75paWOFYd'*&IJ$32XX"4.#>p](6\s8;Zgr:ogKrV?*cipuO&n*oo@p\OgdnbQVfp@
+nFXnalPCrnl)qr:'ad_8-*@`Ua&jp&=uU+?q8t4Y6Xbn,MMLo_83T/O]X=^C_1\#nI:A!sf8K!!
++@Nrqt^Ss6AtKp@&%Gs$<RVj6QL2o_eC5(]t<L(]Xip!<3*"!##A7!sB#8#Ta!0mH4HAo(i(Nnb
+DhSq>(m(p[dtJp%7e(s8VBDrq.iK"V;1E":<?R.KKSP!sA`:#7q(Rs1A=2XGJ8.'a+[J#64c,"u
+n:!nFZAJrqc-]q=aFMrpVl>p@n@XqYU0\oDe^RrL!g.!&=cZ!"927MUq1bnFln[p%%bFlK[m=nE
+fl4p%[nFo_%tSqu$E_qHs0tqu$Bhqu$KonE']MioBk"s7'f:I04>3YIp])f`1:"s*PQW`W,u*q!
+ZW2*r5hi!snuC)@6ia'`\LE>eB>%p@&%PfAZQ#nGhkMEd%3;lM'f;p[IQT$53OW!!LpSq>h*6!!
+3o9Uug;-mHX?<mHjQ?qYBt'q=X:Ko^hJ5dJW8#bim:O'*JXR!WWGM!+c04!WrQ.&-<^]-i`*(s7
+ZK"?tpGW$OQk<"U,JBe+!>+n,<7TrquTcp%A(So_%nNp\4IXjQ?C(pAX/?!rs>A!"0;T#</='hr
+")+oC;JImc*C$p#kf;oDJXaq"aa^qu$EknbW:`-i<c<rr)`Up%@tQmcO2jl`_Z8"VDdU"%-qb((
+L>!*YJSnc0G?'q>Te9$Ou"R58+kV)&E;R!#m1f?E<eimdpJWm-XiGp?_bHlE=(bm.'r@mIBE4S-
+fc4$Io.U!WE'0"98N4!*8:Er9EG;q=!_GpA4U](\mXmo(;J9iVrVus3f#n',^cP%g)e7!m^it!<
+N<)"9]#2*#U^3s4QJhs5]0#)$C-O!=]JK%gg/Ds7#1Hs7?9hqt^'brqcZpr[7aBlMpDCqiD%#%0
+.1h&c_n@U>#/4qq1B.qu?6HkP>/Os8Vuks7H9frVc9_>ke$fp%\I^pAas^rVlBRn*p@r!>HFP+s
+IQu'E:<6&h>1U0.t]QhX(:*p%g6Kbh3L7!!rW9$T%td#B#FFs8VHHk32R;lL=B-q=Nk.7fW/Vrp
+]4>j6aJ]"UNTX!W`?'rW!H1!!ro:-1:X0m-+9Fo^i(UqYBt&p%.\@n+$&Do^^?+k42=R"pP;:"T
+m!MB*&)6!!*-("p"]R!/g+=jmV-unClfd!!!?+.KBJi#\O,9huE02s7lEer;?Hfq#1-gqt^$^p\
+apaq=sOFi?\p?!#c=Z$3283BmB.FaSP;firB&3q"XUWp@n@Yqu?]qrVZNgq=4;iqtg0ap\+:Qp\
++4HlKn*:cfrpg!!"bS,le=.lL<TdXl@+IgsQ/Vl20K?oe/P9rr=DH%Nl2n$ii;Z]X62gmdp;Qqt
+g3fmJlYOqUY-hhX^^CkjS$=lJMXD!!j/D!<N-!rrL^O%13(G(%VCps7Y^Mq=X[ZqYBsup@\%InF
+?&>k2>q4EM3O9rWiQ1"U!'N0*2.S!!*-("pk8K!6OH^s8W&ts7QEHE!I3[,6.]S!$q?qrVc0Snb
+DqWr;?Hfq#:0jqYp:%p@\.TrVcQbJ,p;`$31VC!WE',%>*@7s3CZEea`\=rUpWoq>:*hrr)clqY
+L$XqE+TNqYBp\p@e+Np@RkBnati@qPeUM=uLeXS'LBemebN6iUZR#s6/eCi:QD<@Z9mY*u>ap!"
+T&RMX16@*:NOqqt^!]qX"7No_[_F1#C"OlMp/;puq-DC_-LFrrN&urrLdQ%fu_<!!EA@bNo3,n+
+?2<p\+IZq>g0eoaCE_nF-D*s24mr!#,>>!XT&5cN#U"!<<*#!X&]6!%J?Qo%!d"eE,i;g>9%@*!
+-iU!X8W)jNRYnlMBiAq>:*fqt^$dq>^<jq^1q*o(Mt\s8D*t72$%/'*]*b%4E/B=1e.Ls8UU@s6
+9.Ip%S:Zr;QZpquHW[qHWjkq"OOPo_J=UnaQ)0q<.e8p=f2bmf2n@m.gJCs7,sYjo=E;rp91ESt
+B'K3t;St%8)#>`r5r4p@R/0o_A4SoCVbDs7#:HnG"B8NVr,BpuD;As2`t5!<<B#!SIGS!WWW-!"
+"XHj8T)Lp%%MFpA4U]&+K/_p\4@Pnc.>28,rZ))ZC-H$3p[Z!(d4m!!!$$"9nr8==="GmHjlAr;
+Z<\s8NTB!!NQ5#6b7EkPsT-rVH<bqu$Bhq=s^Zq"agbr;HKbnaZ5Do^VrcNYW$2$31,/r;[E>I.
+d=*ea`[unFH2Dq"jmcr;HNWqYg4Co_84Wo^_VGqXVu4g@F/$o)/7GlhpS@kl:)Bm,7Qnrr)Q[n_
+2;-dBdb5=dn$lrr4P9e)pW"o(DbNoC;DDnc/1=nb)5c<E8V`kPsE=nc/X_#6G;F!<E6(!s/K(f)
+Q6g!!N@4B&rg_meQ_PrV$*`q@Dr]oCr(Vp\*hM\/?7f*!#sF!XT&5cN"mc!<<*#!X&]3!.\kQrV
+taEioft$k3_dt#QOl(#<W2+GQ6mkoC`.Yq>:*fqt^$]q"X[^r;?NnqXsFMnaGi=Yf?tK'EA+P)[
+??X$n6#NlgEErs6K^ToCi"ZqZ-Kkq<@bQqcrshnF?5MrV,dZnEJZ`rTrM.rVuWTlhg;IoBlABo^
+DG=l0mO1mJVNU=Jbien_iQtlhLMZoC_kNnaQ/Do(ht=p&3th%O_;@lMU8Pk3r-"$ipt@!!*0*"T
+neV!"B8;#QZtOnc&.Fqu?HgpA4U]"RbdNpA"X_#MB&h&cr4:"oSW+"U!'N0*2.S!!*-("qCX)^$
+tOgp&FdZs8Vf]oQ^WC!sS`0!":FYiqWN=s7lEer;?Hfq#:*hqYp@+s82Tdq>'^Ro_%T)!#YeL!!
+3N.&,lPCChhl-lLXr:oC_qVr;-3^p\4IXq<Rkgqu$BjrVuilo^MGIs7#RYm/I#\qYT[IrVuBQoC
+)AJqYBparUoRRp$D>>#hK%+s8)'Tm/Q,1s8Vc[iq2s=p%%\IqXX"Kmf3=B+92TFci;f#m-=-2g0
+G"!!!!'(#6tD6f)Q9^#64l-&KC<@q!S"UnauPOq>(j$p\"1Np%J.E`ZkTd#QPS>!<N?*!m^j"!W
+`9$!<NB.$9ur&nb2&Dq>0XOqt04G^BFrT#6525":sAZq>BRPq"agbr;6<brql`lrqS5FqYC$dqX
+j4Us88E0(CCuc!u:k?$S<+u!/p=-md/Ntq"t$fq=X=Pp@n@XqYL*ZqI]R"qYU3hrr2ior;$$Yq#
+1$^pXJ0\o]Yr?qu??QlM'o?r;$'\o(r@Vs8V`[s$a3mfCJq)q#C<SlMC8Nrq,jVp\".NqZ$<Mr:
+g6]^_I.UUt>D$s5s%Lkjch"&Hi(8"pbJ=!nRGP":P84"oo"[pAXg^oBl>HqYBsus8D`bnaZ2Aku%
+lh*#JYXrW!$$!W`>K!+u?6!!!$$"9njgs6]%Mebo.@oBZ/Fo`+(U$Q06N(]b$_Z2a7`nalPOqu$
+Bhq=spdr;6<bq"O[^q>'gWlJhj&pAI5b!sK&5-jK_P)up-B,^%f3g].$Dr;QWhoC)AFp@n@YqYT
+gZB)2<"r;HWps7cEjs82Qbq!\"Uq=smcq"=L[p%J:\q#'gbqtBdNp\jOUs6nkFDfYREl2UVXo(D
+MKqsX7Tkk+TCp@S+Xs8LsTq>/j=!"Jucp!<[(m.^&#q#:<u*WQ6G#mge;f)Q9_!WWH;!"H-ms8M
+i_n,N+Xq>(Wos6B:Dps&j3&c`CG*<6Am!!*0&quBFl&I]'["ooAI!<;9_lg<d5q"F=Kn*fc9rr<
+0B,6/)R!"+,Lqu?0`pA"L]r;?Hgq"agbr;6<bqYg9]o(i4YqWcr;j:)M7"UY_J"TAB;)up$VP5k
+:Rs7,d]qY^6Wq"t!cp@S(SiVNBDq>1'b6hg6Dnb2A=oD8LW[k[OSj8\r?o'Q2Os7c-ZrVH<_p%A
+(Ur;--ajR`&*!!*?*`;e`phZ)sBpu2u'"TSW3$3^G3#2&te!W`9$!<NB.Qg*u=k5P8GpA4U]%IE
+fMoCVkAiS57S$igpd!!*-%qu?]tr;[30!s\ifs7k[Tp%\RdoelC4n*B6;";D@Z!#Pn?#\!B$q==
+1Oq"jmcr;6?cq>:*fqt^$^rVQ3Wq"XI\mGmj(";(V=rW!lF)^HaE!>>W)chd4\mJm%Ws8V`_pA+
+LVo_&"<qYBj\qFC5Pp\FX[p\+COo'u8KlF/#4oBH;Om.0T=s8Mcbp\jsap\"4RqYU'^rTEY?K)c
+#m!.+\*lf%^(qYTVF&-Dq9#6tA5!X.0V%fub3!!*-(#&inus60%Qp@e@Yq@2objn&HBs.#\p%gr
+@FcN!tI!W<"4!WrfH!<NuK!#1dfs1JC%p&Fd^qu$9]mHO<c.K]eR+U%iU5P"^Cs7H$[qYU3gqtg
+*`qu$Bhq=s[]r:KRRoBbo>q!uoaVm9u))[$6H!!!fQ$NNf.ea<D:lfS!9kND@,q>0m\q>B4Jq=j
+^]7e?<IqYU3gqtTaUoBl;Ab7sR.oDe^UoC2MQr:fjYrVH?ap@e7VqXsX`lKdhT!!!rG,iSdns7,
+4ArUtsS!X]/7!WrQ,fDlE`!<<*#!X&]hnaZSJk5YAQqYBsurVQ$Us69PU:'2(:!"9,8d/X1K!WE
+'4!WrT-$NL/4"oqKXkPr*mo],`Drqo^lq=aLS.l%/3!?2"=&/sQpli6MKq"jmcr;6?cq>:*fqt^
+$Zqu$-Yo^M&7s7,?060&"Fk/4I0[^)pUo!XS,bbXFrh9+p\p[%qKo_SOar;Q`TqYBp^q?-HdqYU
+9i*;fI#qY9OVs6:BWf_bXEnFZ;Gqtg'\q>C*bq=sp_*q]7-mcj(<!<<H4!0$sCs7GUBqt\/G!YG
+\<!!<B+fDlE`!<<*#!X&]Fmd]rKjo>/MqYBsus8DTaqW[Ma&c`IR!"029d/\(d!<<*#!sJo2!rr
+]8)^2urlMo`9s5F"Tq"4.JpA4dR-7]*1!"T&0$in/cjo=fCq"jmcr;6?cq>:*fqt^$Zqu$-Yo^M
+&4s3^a[Qf6cgl/h*sp\Xj1s8VWhqXsm`r;Q`nk1f"^n+Z\Tq>:*KqYBp^q>gElr#>P0q"FLRqYK
+URs7\:Uf`1[@oCqqPq=s^Yq>C6g,Ph-/p@\(Qrpo@E4p)5o!rsM)^$>XhkP=c72?ONs!!!*)!n[
+J`!W`9$!<NB.&)-[Cs6]jWpA4U]%f>tkp[Ik,"TSN3%fc\9ciF(HD#aS<"U>;J%gj9_865?SjRr
+?0s69RXoBb])me-G50K&qG!"/l;'*+l)nc/O\q"jmcr;6?cq>:*fqt^$\r;?3Xp@IY(oABR:fCS
+h*o_J7Ljl#(klhgP'pA]Lu3^Q;XgAg?ql1+H>oCMV5qYBs_qAK2.r;6?bp%/1Sq"Nt<p[;[>irA
+N@p&"OYrq7f9qY^3dqtp3`o^hkPq=O+P/-Zdg"W%0CPNi,BkPXiCC'"_I!s/Q-!n[J`!W`9$!<N
+B.&[M<"s7Q3WpA4U]%e]A`puDC[$3LG6#64`,ciF"FCBFbH$3L>5$NPd2hXKRqs5*_Kq>0gSm-<
+s+n`XLt#mpYE"r%^PL4&jss7Z6aqu$BhqY9m`r;?Hfq"XgboCD\OoBc#Im/XlQq!RkSrV#aKnGi%
+?s7bpAIr7\J9MVtpqW-u7q"OFPo?mD)p@n@Xq=jUUs7,dVl0J$0S3c`DlgXZJqY0[TpA+U`qYU3
+gqY0UOqtBXSo`$$>#QbAM!,Gj1rUoIUo(A[W!<`W4"9JW-f`2Na!<<*#!X&]=K)b3;p[ItOqYBs
+op%.nQg&I?J#RLA/!=0"Z!<*"8!WrW5$NLDJ)^=M(r;Z?fs6B:WnGiOdp[dnBm/NWK'EA.N"pkA
+3@oMp_qtBg]qu$BhqY9m`r;?Hfq"jsco()VSq#B(Jf+IE@q"=@RoC2/7m`tjkl/=>s:mQ:=cW!<
+DqX!hOs8MlipsJp?nac>HrV/VWmdg2Co`"R!*rYp!mJ6eZp[n(NqYU3equ$Bgp[dnRp$_VKru27
+F&J"jJ+;<K$nEg2Ko#(M.!t#A=!<NJY!"T,3!!!$$"9o9Ds6fOOl2UJRq>(Qop#PQ2mr8F2!sA`
+/!p9R`!W)lm!^6Sd!<<*'!rrT,&-)eW";D^R!*dV8meZ_Qp@e7UqY^-]p%n^gp[8(Ke3+-=#65&
+5!#HpHs7#FUq!.nYn,<4ar;ZX)oDJU\nFun\s7k.!'D_M)rq$6bqYpC7s5EFmd/tuWs4RGPmf7n
+!nFc\Tp@J"Ss8MrnqYU3hl2(GUrqcWk:\4G_p$)MVmeHh^o^_nYq#C*]q=jCIp"peYf)PI(r:K[
+Up\F[_r:p-dr;$!QlM(>YjQHD(!t5/N";DOMO7;Aps4$K:)&ike'Ft0D!S7;d!<N<)"9]Ags8V6
+Sk4efNq=sa\qu$Hiq>(R!r9EqElsB_o!sA`/!p9R_!W2rn!?hFF!<<*(!rru7'bgWL!?;sm8ZV:
+RlfIp9p@e7UqY^9frqIE+oC)_Pqg0dn"98f2!$DC8o(),Cp$MPPp\OgcrqeYIr;?*Po_\Oajl<4
+EkPFo@p&"UZp&"dQp&F=IB.c%iN.32t7dTU/nFlVMp%eRcrVZQir;Q`\qY^-fq$lraqu?Kes8)9
+^qsj.Prr5.YpA"CPoD@GmdCJo<j8&??p@nCZqu$6cr;?B`n*L)Fjl6=?9EP8&+TMKj!"5muo)It
+Es'B7=!t#A8#1`bh!<N<)"9\oHqtfgToDeacq=sa\qu$Hiq>(QurTsCQmRmN]!sA`/!p9RZ!VcX
+Y!s&B%#6b)D!#-@P!t5_I(NRshnbi"Rp\+=Tq"jpgrqc6Sm-sZ9jo;tm'aXjF!<snOjmD^+lLOQ
+6q>^-`q\K#+q<dG9p\44Ei,tRWlga?9s8DQYq>UC0o%rs7j1BPf;PphGp&F.=nFZDJqu66eo)eR
+XpttpBm.C>Xkir'5r;Zfpn`&+!rV--_oCr:K6E$.9nETf@p%J.UqYU3dqYU0cp$qJHnG)YPmna]
+$#7gn:'d=N6me#H4p@>#p!!!*(!"d]]'`e@;!sA`-%.EcdnGN7_qt^$^q>:*hqYBsso_7VMp[pN
+H!WrQ.!s7QarrN-$rr`#r6j!Gi!!ic/#m^e:$5j9U!$S*:rq?0>q"OLUp\=U_rr)Z^kNDC4mF;0
+qJ3=YM!!<BG!35qfn`9B>k4eoEq>'m`qtpBj2ZEI9k3hj2jo<e0W;kZLnb;qWp@\7]qs`qOlMpn
+OYFA@a\E`MMkN_O,o_/(Uo'u8@o_84Zl2(G[s8N&ss83?+qXjUYjQ$48o&o#spAY(Tq=jgap%A4
+QCk6a!q"FLTp%J.UqYU3eqYU0cp@IhDp]'pViEm#p!!"&X-:.],b4X0Up@65n!!!0&!#3ua'`e@
+;!sA`7%H?mWkkt&Mqt^$^q>:*hqYBssoD%SMp\5p6!WrQ.!s7Qa"T\Z,"9eu(!(6ni!!*E4!!"#
+>!$DCE/X)FNs5N;Cm.g>Kp@n@Yr;$3_n*''0s8UmIp:?,T3<KBa$jTl4o(_MHrTEnSm.^8Lq>1!
+fr%@s@l0%O*m-+K'/@kfDs82N\p&"abp%n(Fs4-8bd'E*5s7--hkjS$2oCV\Gnbr4bqYgHol2(G
+Y/c>MBq>'g]s7u'[qt0pana?)Kr:B4IoCi4`p$q\IQs!M^qu$'Xp%J.UqYU3iq]kt5p\"1Yp\3V
+Gs,dNt('#F^_qZL]K`CK1m.oQ-%KR"=!"[W\'`e@;!sA`>&'OPDl2C2Nqt^$^q>:*hqY9mqrTjL
+Tp':^$!sA`/!p'Cc!<NB-"par*B)i#7!!3N8!<=#<%jV,]L]@#@maUM$s7l?^p@n@Yr:fsYo'c,
+Cr;,F5qXa!OYTX&J!#uiso_.nPp[7eSn+HDKq"jmcr;6Bam-O<5l1aH"%clmRs8Vf\oDS^cnGi@
+Kp!!I9rr2p,qruAcs7l9Zo_%kFlgt,H"7u6]q<@`Vq=s^Xp%.bFmf3+Ms8V-Bm-3m1qY0a]o^VV
+QrUfUOoXut8lgal=o_%qPq>1!dr;6?dq=s^Yp@SCIqu=rG!"1uch#HP'!'C5XoAocBhc'^j!!!;
+U!#5M9!WrQ.$O`g)rpp*dr;6<bq"agbrqcEd%/oDinbE.l!WrQ.!s7Qa"T\]/"pYG0"VC_:!WW<
+2$NgeK!#6+cLsX`>rVpU'g\CO:p@n@Yr;6<ap\FUVn`92qn,NF9s&&h*!#GfMq<IeIlh1&Ep@S%
+Op\F^arV63^nFHAFkPqWl/-"f/rr)T_p&"^`oBu8Cr9XI[gWJUMp&4p[a8G`*p%\:OlgjT8n*fc
+:oBH*.r;6?cp@\(LmJlVGs3H4C4=CgI(/V78r:T[Vq=OCZq;2l$h<+Y'o_%qPq>1!dr;6?dq#:(
+2m-4QEldbUMs5DT!gY)W,%h?"So'YfBhm*Ir!!36*f)PmR!WiK'":b]gq!IkRs8;ciq"X[^r;QQ
+gq@3&iiW&HI!#G\="9\f.jT#Gb!sJo8$2FdT!!33%":YbB(_$KK!."V/jRhQ\hX^LBq"OLUp\=U
+_s82Wis8;EMkPsf+m.IdcGlS]^#R_:DhYQTsq>0IToCV_Mq>:*gpA"@QpA=LEs+u,6s8D$Yq"ad
+^p\+@VoBc,Lq<[YOs8D?Zg%jV%r:opXqYKjOs8Muoqu$Ekl2(AY(B+1-qY'^Fp&9pa$NL/4"99T
+ib5_>0rq&5Ks8V`s"kMZ4p%7qNp\F[_r;HQiq=sd^qu>=4mI8@"pA=ggs60(NkX,>Q<:9e;p$28
+W"onl/$J,7[!<N<)rWE]<D#3&ao)/F_q=sa\qu$Hiq>(NqiVWTHq#CX"!s]&5jo>Yg!<<*#!X&]
+/r;[c<"U>#>#6GJ;!"fqV!?2$Hs5DJmp$hVRr9=%Vs',0cp&+IVqu-B_lK.C(qYBXFkj"*,#q5i
+S'@u@3p&F+Nf_5+:r;QZlq"FIYqYC0kn_F.gA;eh4n,E@cnb3"Un,NFeq;:]6gAh0;guJ)-s8Mu
+pkMYankP+u>$L7*QqYp<eqY^<krVoFap\b'jpAOOWs7lTnp&4pWq;(Q1s82KSs6uib!!X&b-NF-
+Zk5P5Np%J(Kmciji'@ZjRrV?3\pA4[^p\=X`qY'ORp\+7MrpUlso'l5Bo^V8/iKFX1!<:m$s5O%
+Y$N^;6!!*-!!<3)U!<30#!!X'Up[S%Ps7Z<bq@*Ddp\Xa`!!3-&#6t@n!"8o0!!!$$"9oDM&e"m
+@!+u]B!"Kk]('=OWP(Dfhhq@AgmI:&KkOA6DqXa7OrqH0[o^VD;m-O99p[mtCm_oY9!u)(GFS>+
+^q<@23qtBg^r;?Ecp%\@UoD8L\kPdk4T&TeDli6h]s8M<Qs4?W4oD\dZnFHSY#3Xb)r8mJ@rr3M
+tp&"RYo^hbMq>'m`qu$ElrXo,*q>C9mr;5pTr:B^^mf3=drr3;gfDk[5s8Tth55kO-!ujXnjS\i
+Ip%S4QnGi5f3Ks:8s7uB\pA4^`p\=X`qY'RTq#9n,oCDGAnF#f;o^hS<kf=b]07X#`n`0Ec%g!O
+I!!*-!!<3)U!"/i1!<<*-B_V/mnc/=Zq>(O"me$ANq?$]t!s]&5joBf2!<<*#!X&]C*$6(0"T\W
+."9\])',:KI30+$tn`9W/nau27p@IG1me-8Do(`7]p@.D5mIKr?nalJNq=X:G2?3_(&-*s7g?eY
+1iqW$8p%\C[q=aIVq"*qHrql3N%jf<bs8M?Lo_7J.s8UdPs7bp?mJlM;mIU2Srt55(lg!3RhV7)
+js8Dffp%A(Srq^I.r;?Nlq>:*fqYC$fs7ZEkq#(0]h=gm;jQZ^Eg].'6qu>@/hnc4h^=_uUqY0X
+Tq"a[Vs8S[C7JuuTq"F@RqY^3bq"t$ep\":WoCVbNp@RnDn+$&Dp@RnDl_ORq'\h@<s8RW^!#tt
+Oq#T=PrrEH.!s8`0>kn0dlMpSSq>(Nup%%qLn-B!o!s]&5joB?%!<<*#!X&]:&/?*')%m>a!"BV
+B#9=:F\b6!Xna$5Eq"O7Eo^_;4n+?;Eo_JL_p@7P<nb;qVp%.qVrqQ$JD%?U]%KIGkL&L]?o_%G
+<oCi"Uq"F@TqY'IOr;#g8!\*^*l2UY[r;ZTZs8V9F*ouPbp\+XWs6nk,p#iK$5!18:/k:N:naQ#
+9nb)_UrVHKi'DM;"rV#XIq#C0is7lHhmem+boD\blg=ZB(o(`7Pq;:E&jl#:fmJ-AGpA4^`q!n@
+;e.MZTkkFcApA4abq=sjcqtTp]qssFTqtg$Vme-;Jq"OLRo(;r.1B:D2r:fdG'EAOA'`e=:!s8T
+*!T*nW!=Jl.":#;7;YU.YjT"rMq>(NiqXF:HjU_Lo!s]&5jo@%9!<<*#!X&]2!<WlU-6<d,!!sS
+F%S:EFs8V38s7G[SrVQ9Zp@[tIpA"FWp\FacpKRFgqYL6hp\=[bp@$t7#S@%K!$hanr93;Cnb)D
+BpA"IYp@\1Xr:fs]oB4RA/GJ;hqtC'QpAaj1h#IE=k5Xf0s7Z<drVu]8C`<?Y"p+c.3f3.dl0Ig
+2qYpHirV:@+pA+XWj5]S*me$;@md]8qm-3Heo(DD@bI,dgh!b9akl:PLoDJX_p%7tTrVZNQp%A:
+amJlJFo^heQrVZNdqYg?fq"js]pA4^aq"+"Qr;6<ao^_MMjfl5p$-MbpcMn=j#QOl*!<WK/!s.6
+Y%0HV2!!Wi=!)iRin)XKAqYBsrm/?,>mH5Mr!!<H2"6KRp!W`9$!<NB."onW-(EaY1'E%n<+)7S
+*r;?3Tna$#MquHTmq#L0fqu-@upA+Xcs8Dfhs8Mljq=sXRo#UkG!#>PL"V9P]hZ*!>nFQAMqtg-
+_pAY*fp@n(=\4SXAm.g&/ipc!fs8VKMs4co,kjmg*jQ5_,s4_)b&K;Pu"TTihoCDD?nb)_Trq^^
+3q"XUXqXX7Up#Frnr9j1Om-jN)qu?NmpAaIHW49[ls8Vu)r;Zcel07Ksq=aLUqu6Nim.^/P#0Qu
+>p%.bIqu6Qkp\OjdqYC'hp\F^aqt]pVs8Mrlp@IhDqp4c_!#/6/s6TIi&-ERL!!3</#6b1d!"K#
+4!WW3+&Hi):p%\%>rq?3aq@)rog$e_20aRg^#6t@n!!iW,!!!$$"9o#."*Xt[(*"\O&-=P.V7t^
+Ns8VWDli6_Rq>C3gqYU3fqYU3gqtg*aqu-Hiq"OX_r;$'YpA+aI!YknG!"0t\LB$f9oC2;Bq"t$
+gqtg'crUfXQp$ZsRAaB!giooM(p=93C_5h3b]W^)ig?eFnf\Z)KG8:Je!!"_\'hFVbp@RqIp%\C
+\qYL$_p\+=XmHsiLlf@F4o(`1Sp%dkGl+-iIdS1c66n86_HiF$lp[@VDp%SC]q"FL\rVQE`rUBb
+EWW2M\o()JNrr2iiqYgBiqYgHnq]kt5q=s^^qt]sYo^h\Km+9<M+UPa6s6F%t!#6%F!X8o9"p3Z
+^%KZe8!!!??!!m--nac)GpA4R\$ieK<s8P:h!!<H2"6KS>!W`9$!<NB.!!N]3!!*ia3*\^&OS&S
+@qsa:ImI^DDnaZ;MrqlNgq=s^[r;HTkqtg-`rV'[jq#'s[oD/Fdm3*Ji!!O)E!#>P6i;`*5p%eR
+drr)cir;#dIp&"S>XJ5agp=oW%qsEn(3rj;D?ZH3.cEm62s8Vris7k]u[\0M+Zc`=>o'l/=p%eL
+^qYL!]p@\)rr9EPFs7GXJqX*nLmd]u4j8\*8='o(Ns7lQRRPCc:n*T`Ep?CuCr;-0`r;HNfp&FO
+]BUAJNo^_PFqu?Znp\OjeqtpBmrr)]hq"X[]q"OIRo_%qPs5V3#YSKbM4R;Cc+92BB!!3?2#mLI
+g!"K&7!WW3-('"e[oBc,>rV$*ep_!8lmc`d4e,B=']*/9E$4$e;h>eVu!X&`7$k<dbT9-)=p]'g
+UmI0oOrVZ]nq"47SqYBmUqZ$MCr;69^o'l\MAL.<u!!"#U!0l%6i;`H@oCr1^qtU$]nFu)8s7H`
+W`rGu4iW&\spP=qfh<t:8ld(GF']n-2n*f2aht-mHnDi<bpAa(5nG3(_qt^!]q"jmcrVc*Zh>c^
+1e"L_mVV&i@s8Dr[i6$3n=i/qjg<$-%bQ%&2kpGojn+->Sqt^'aq=O.Uh=:971@jf0q"FL^s8;W
+hqtp6cq=sa^qu6Hkq&B>0p\4LZp@@bFki;\K!%7ifrNcJS&c`.@!s.3X!<`K'!"oGB%L`Gap@[k
+Iq#($bq"X[^r;QQmp_*Dtp$h>4s4-UG?5*AC$4-q@"5X#!!<NB.#n%1P,;p7rkjSQ,na>uDq!mt
+RrqlHaqYg?]qZ$M"r;69^o'l\MSdPW."U>87#X%_Op%n7LoCr4`s8;fio(_J=s5F@Uir/3>kkXE
+Ap,HSDs5hT!huCLm*7OZVqu?K]p&FINp@Rh>mI:/UrVH9\naH5Iq"ad`r;?Qo4lMYP,nW?L!!!t
+&qXrk/kkb>ML`I*R!!$DKs4mSHo_A4PoD/=[q"ag`p$r(=o^TC2n*p8Lo(2YRqtU*fqu6Hjqu-@
+1nacALrVH-Ps8UaOs6gsL"V.^8#$_-L#6k82h#IHY!r`04":5J?!.FJ2n+QVUqt^$^q>:*hq@r]
+!qYL![na?)Ms'0@L)up9N"p>"a!$;4C!sJo9$Od:M!9*h0n+cPHp\XXNnb`@bq>'sgrqu<_rqoa
+mq=aFMqs`JC#lkVH!!`l6f_,79q"FFXrr;rmrqc?amd:%i(B=F/h>?[0lKIB*OK>_Hk3W!%irW`
+OrUog[rV-$^k3_m=p@%;0rV?-Wo(W(^rqJtYqYL*dq:u#'WW3V=!!!WC/>D^frVuEAl/Qjc!!`W
+,Cr-/6s7l<aqXjIXq=jUXqtp-Zro3b<fELC2s82N`qYpNpqtpBjrr)`ks83i0o_&"Wr:omJqWRt
+!ruqFs!86gGA.BUb"p4n^!!*0'rW!Q6#RUS4N:?K/p\Xmcq=sa\qu$Hi'__=uqtp0]oB5UV%g3"
+?!!`]3!s79Y*WZ<F"pYG@!%0(!s6eqIrV-$`qtBd`s82Tdqu-KjnbW4];u-.Zo'PrH!>b_I!WX5
+@(NB6?p&G!fqu-HeoDSR^q=NqOP<T$Hp#Gu>nG<1[e\2#uYlF`jEZBU8mdf`2o()/6o(;PEnF,l
+;o]tf,lgXcNs8D`kq%W_Qqq0(/,6/o3'*&8koDdn?o^D>Ks"!pFdHBKWiUZ@%oCheLrV6*Zq"t!
+bp&41TjnJu*rq5sXq"jmbqYU0fr;HWorqcZlrqufr)>Edsqu?]apAaR=p3n(`.Wj'XK`D)X"p4n
+^!#G\;!!!$%"U>23Vt'NOpA+X`q=sa\qu$Hi'__=ur;?Ecp&ESI"TTDV)[-?H!Wh'V*<?6F"U5/
+G&K1YNs5rMDna,rHr;-?iq=XFVqtg*VqG7"bq=jRRl1k9D5Rn#!$5EOn%F*Grqt^$`rVcTdqYBs
+]q;qWdHLLS$p&+1PnDW%"l2O:S!";t$])Vd0oCMbSo^),HrV5sPnFcYUo^r.Ss7?<arV6?c63$*
+8j4ANq3<0$q99\6+ht$.+s7Y:$k4dHrir&T>p[@A2nal8AqtTmXq"t!bp&+O]kl3!1s5`G6p%J%
+ImecnYr;ZL7q"ad`r;?Toq=j^\p[n=OhVeG2mV4EU"h2=D!"B/;!s.3XrrN-"'*/.:":bg[o_\7
+Pp\apaq"X[^r;QO$pA"L^qt]sXg3s#D(&e45!s&H(g&N)n!WrN-,6/,P+P6;Up?Lf-oCDMJr:op
+Vq"jg\nbW:]s8!B(p\"1Ks7DM1)?g*K!"BhHF.`I$4n87Es8W#ho_7tUiVtmDjQlI<qWRt;s8:p
+Oh#IENs5a"Mnc/%Oq>UEinFlnVp@e@]rVH6]q"t!dq=X@Yp^d,mp@\+Co^i"IjSe';s7uZo$23r
+Wo(Mt\s8)!Zs%qtHqY'LVoC;PIn*p)Ip\+CZqtK^Xs7>XX@X7n7me?YVq"OL[r;6?dq"XUTo_%q
+Pq>0sPmIgDVp?:>ls2"Kpir$:U!#T+YY::(g"p4n]!;Z^,&eO'qrUodTr;6<bq"agbrq[3"q"jm
+ap[dqT@Kdb^!"o_BrW1[PrrN-$(C1!])usgTs6f:DnEAisqu6HcpA+X`q=4=]pepqaq=s[VqYTU
+,cNjd\#652;!%gFuo'u8Cq>:!\mI0]9s5!\jf]r(srqPaXs5*_SgAf"\lKe-+s1&+*q=F7Tq=F4
+So^hbPs8VocmI9cDr;Q\:q=saZp@\(Mm.gDSm,n?Iipua.jOiMmpAOdMj7<6MfCen(ipd!Jr:T[
+Vp[RhMr;$-`qtg!Uo)IeAoV+kHnFcVQq"XjgrVZNep@RtIn*ol=o_/%SiT0:op%.J.huE!Af]Vi
+!s+CA$3L9pM#6k82gAq3RrW!H<%e9,gp@J"Uqt^$^q>:*hq@WGrq>0mZnaHBG!$_IR"TSQ(eH#U
+M(B>Hq!$F,tlg4?Fq;^&hs8W#mq>C6jqsjMYp\=R\q=s^WrUT+;qZ$s3#9s3U"rI@"rV?0[p%%J
+4l0Ip-s4dPVkk+o>o_%PJr7q>Eir&iRs7H<jf)O8"s7,FIrVH0Wqt0=FpA=a_rUP1)p%S4Vq"XR
+Uo^h\JmJ-SYhZ)^6s7Ys^s8;iinbN4bmdC,OrT4(Zp%dqFmHsQ>oCi1_qt^'aq=O.Cs4R&+ascN
+>m-Eiql1P)Tr;-0[naGo5mI0T:o_/"GkMY7[nFuh7o]#&qs6T3Ya8c3f0a8!j"p4n\!!30&!WE'
+0#7:+lr:]dWr;6<bq"agbrqcTl$iBbnp&?TD-3+#O"9&9'!<WK0#M9"l!sohF.[u:eo(2SJlKn9
+@oBl&Br;-*^qZ$@KqYU3hrr;ijq"OR\rr;ldhq.`@!$)=d!X'Gl'YX"jjQPLojneNIp[@tKXX!!
+#oAo'/r:'OX#Pe&ep%A%Qq!n%WoEFp]p\=R\q=XRXq>'RRs7B%Yp@n@XqY9gYp%A%Qq#C0in,<7
+dq"NkLo)J4ZoDJCZr:]OGp@7PJo^2,4qu>")s5)Q!qt:!Np<;Xgo)-UB"W0''!!!95#6=f+!oO%
+o"9SW("U>,9+91j1n*^5Nq"ad_qu$BkqZ$6tp\+:NnF#sX#8dFH&cMb6!<N?)!WgsSrrW]1#QP!
+&.dI'6g?\2!mJd+gr;-6drV?0epbhmDqu$Bjp%J1Vq"=7Kmeu\HrA=Qr%0-AMNObGHn\ahip](9
+bm/6SLnaDc:nc&LUnc/Xcq=XRWnb<(Ys7uZj!;lTdq>'j`nb<(Ys7uZj!rMfhrVHQi5QC?Ah;I]
+$jmqj6g%=S-nbi1Xr:]OGpA+ITli$kJ]\MKGl1OECj5p<os8UaO^\[um&c`@@0)u(["p+i/#2fI
+s"9SW("U>,9:&=,Pp@\I\q"ad_qu$BkqZ$Etr;6?bp%/-Pr;['3!!!$%"9\bW!#Gb<!!WE+-NIf
+(s4-u?s7YjPqt]mWrr;fks7lWi!;c]l0D5,;rVH0Rkl:\Kr;VF(14@4Cs5]nfDKT%!d.Qc*lfn*
+6qs!KcET?HRioKY%lM9uUo_/+Xqt]sXnb<%Zs7uZhq=j^\q>0XUrqcZjrqI0#q"jpdqY9dar9F(
+Hs&A^Is8V-Xs"F<Fq>BsRme65GnE9*0p?Vb1nV1.,3M!8Oo#q'us2E.PpQcL.$46b5!sJf/":3o
+c('F^>!!NT0%%?nRnGN.[q"X[]qYU3grqcTm&cDM#pA`PH(D[8d('"=:"U+tZ!#G_;!t5AJ+92D
+*s5O(<p]'^Rp@\%LqZ$3brqnGGr;Q]np[[e5q9J-ooA0H1ma!Zk%PeRq$'1/DdI$Pnna6A@m6bi
+FMMm+?NK8njKa*?lO,o6UL%0g$M26qAKnP)2q1S9mnUs)_Lkg_=KS+o.KSYPELkL>(I;+dfI2$^
+YiqVL4s6TFVq"aj]mI']9oC;kTf]rJ3lgb#ooQ=V$#t\@8i5Ycr%D2W?&/tTN!!3B0!<EA^!#>\
+>!!!0-!t!`WmcOB?pA"FYqYL*er;QQkpB^H`naG#b,6\\W!!NE-"pG)1f`2fm!=T56$4-b@HKFJ
+lg>qr,s8;]hq=X7Qp&=sgr<W;sq=jUVp\3>>s!-dran5K1l=C\1*WQ0\DcHbph>d6?kl:,>01^G
+?JUW'"Jq!ND#C:fMKnY,,HLZ7cIXQWkH?ja[q0DLWnTdoZI=6HgH$FRWH$t3nI<g!_I:S7JANPK
+^h"gC;s5s.Tq"aj]mI']Jrn-W:q#C<<ec-=tI:?_9&k[&Cs4#Qbn\bA[8,s51"9T#=!!!&X!#>\
+>!!!0-!s.i\n)*d-p\=OZqYL*er;QNmq>U4!q"F=MqYu*T*?-O[#5eZ)#2&tm!<<Q/!!rW>!B-&
+&s8Vi\q=3e>q>U9aq>C9ls8;rqrqe);p%%S?nFQ>Ip=n?Ts5!!_/-#kq#oEXX*BPGEmb7L6p#u8
+Hm6DQb!;Q^%!<WK1#6b21nH8aprrrB)q#gErq#p3irW`B+rWG^m"9o,;"p=uI'EB*Q$m:A)p](9
+es7QEiq"aj]mI'\os7u]kcE'_cDZCLjak$LjZ\=A=<WC/&o`)AHi;aK*#6YPJ!<<2Z!#>\>!!!0
+-!u9e[lJqL(qtTs^qYL*er;QNmrr2p2rVQBam-po&3rf7$'G(WV!s8Z0f`2ci!"8i1'`oT[!&(4
+Jo_e4<ioB7kpA4R^s8!9%q"OLUp%S1Qo^_J<m/HVUs!$W1'a#0S/e.jf.gZ2<5jIOsn+QSDo(hQ
+e!!`]7$k!=F#2K:Z!WN5s!;QZW!<3*"!WW5t!W<!\"oo)tg!]BSpY>H-q>C$`r:]OGp?KUi/J8%
+/'djthIA6cB,`Vi,k5Qb>rVu6ROoPH-9Ge!:&ekKL#N,Rt"9SW("U>-6hXKk'qsF7Tq"ad_qu$B
+kqYg1&p[n%Gs5X.0j!=[W*uPUp!<<-&f`2g$!=f)5'EAdc"TUprOkK9tq>9jOkj7m9mJll9p%7k
+HnaZMSrr2cclfS6%]3?3g!"T&b!"T&;%KHb<LSO1rs7YpZna6/8OT5C^!XAo1pAb3r!W<!!!<_]
+h!s&H*"Si&n!Ta:b!<N?+!s8E$5lq,k!!X#8%R0FXo]Z>?s7uEeq"aj]mI']JRP_#7aRoMtkF4p
+NibaN2Rc*>i8I>k/&MgcUmJi%\"9K5R#m:^q!#>\>!!!0-"/>)\o)JaWpA"FYqYL*er;QO7qYU3
+gqtg*]k5Xf+rie3r!%n7$(]Y$L!!N?&%LiLGqZ-WskQ(Vcrr>4g$O.:\%Kuh@H2mO)n,!%XoCW(
+\p$qVFo^h\Blgt,Us7k@:p?q>>l.)au!!OP^"UYeB"995Y!!!i9kNW!G%I<BRo_J+YEsr$M#RL[
++!'^Mb!<`B3/c,2@mJlMPnG;qTqYKpNg<R&).4HjSf(o@!ec0=m=F?t_jStf*s1uY@V>t4%bl=7
+7%fceL"Tdif!<WB#!"]/2%KZY4"Vh%-mdg/HnFZ\QqB,S2r;?Hgq"F"OgsZ#?5l_62'aY?V%fd(
+E%2fKQ!"So,rW23_rri?%'aP0O!!WQ0$lrs%kN;43s8;KZkOABJs#0]FjR2d6kMP=bs8VfUk4J]
+RWDX!%!rr<+"9Jo1!!E9A!#XAOo'lD>lLafJpA].>!!3E3"J,TT!WW6(!"COVp&=CZmJlbSq=sa
+]qtKRCs(E!k)ghUncfb>j>r_o?KhhZ>FtqV>s/NR@7W7;IJIOUSrVup5kl:_c!W2p/!<<?)!<N6
+X%f,ekqXs4Bp@e>)qYU3gqtg*]r;ZEWs8T)`2#nTr'b(]W%fcS="98N(q#T[Zrri?%)[HfU!!`Q
+*$P4RWgXXp9lg!g)o(;P@k2bk!p\k+Fr;6H[nb).UB,gm]!!!]R&dJXc)BK7q$ihFOBANFQlh:&
+<p%J=Ws)A;E!s]&5ScCqU!!*3&%5%GJqXFOTs7ZEhq=aRZqtTjaq#:<o2^T@I4&YhQeboJa,1l=
+1H+<nPr8*B7,b+gb";M(Y*!PO+!<N<#!"f87!rr<*#68p>q=aRZp$M2@pA-*3qu$BhqY9dUmeHJ
+Ar9gqY*ruim!!O);"V1Y7&fL`P!s/N)!TjC^"TJH-#R^h>'+"XC"9&9C##D&Rq#('erqu?Lk48N
+Kl.k=io%_0nN*JCa$5"Wj"T8<A!sfkL!WX#O!!#.&kPt)Ap\XLUp%RtSEXVpM#6k7$!'^Mb!<`B
+3/c,)3oD81Zqu-Njp\"4NmHODpo"!QVXoJE`8La\Do=6smI[l<6!(TS:p;2Kj!!"_R,S(:`!tOP
+q!<N<$!"o>8"Tn`)$j[9YU@RgFq=sORs7Z:1qYU3gqtg*]s5s%SgYMPdmuIGj%KH_<!"g7_!!*K
+,"Tnl0!WhE`rri?%+p\P\!#,kB$kNXN+q+GO'fTQO`nU1ds7Z!Qqq\`QMet^!rW"JQ#QOi3)]0(
+i!<N6$%fcS1)&r`(JH+O+m.0iCq>BgQl2#K7!<`T1!<<*#T`>W*!!*3&%5%GKo(VeSq>U<hrqS)
+>o'#',i:-*e;5W'alMhrAs3(G2!9K]q($o(o'FK"U/M&ad!#u:T!!a)"!#G\;!!!$%"U>)/!=],
+amH*s0o_SCTpAaj_-2RN:r;6?cpAaCKs7l-`p[mf"&-*(a!tGD5!$)UN":#,7"9JVd!<33%!"&u
+>"oo/>!!io;(&e17"UG/-!%J3a%1*7F!!!$%!!!-/0dR_P$NL/0!!!0=+WC^f'+>]a!s9-A]`6a
+Wmf!"irUTF@q/d5N"9o#.!!!+p!'UGa!<`B3/c,22rUBjYs8)KaqYpNmo^2\Hn`0ZI!<;oQci4"
+,k-F>>s0hq-j/r43rsA`;"998=!WXGY%d3om!>PS8!X/f7!sSr9!G_*$r:p*dq![_JpA-*3qu$B
+hqY9dVj6HC.nb;M3s(q`?)BBG!3YMK9,6.]L#6k>6!TjC^"TJHC#R^h>$NU52!!!-8#64i/!!!-
+=&I/:9!=9;F&etiS!!!?'!!EN:$mH#V!$)(K!WWc4!!!dVkl9c5oDedgpA=OUme^u3!sJi1rVup
+$T`@:Y!!*3&%5%GQnc/"Vn,N+Xq"Xads8DfNo[Ea2jslnfs7Y@N`ju-!!71]!&C^!ts-j!N$4m4
+<'IX:u!!j8&!;up3!sT#<!=K)<&\@3(r;$3fq!dhLpA-*3qu$BhqY9dVs8ViSm/-_Ps/?/D"99)
+8Z`4]>#lkJB#R:M8!TjC^"TJHs#R^h>"98T<!WW?)!!!0/"98K)!<<3-#mUSB!rr<&#mUP@(DHr
+P%1N:<!!!oZ$j$_=!#$D06WpGbo'>T0oC);?q=sm[rG;Z>"U+u,!!!.q!'UGa!<`B3/c,D8s6K^
+Os7H?gp@S+Vr;5jIs1871Bfc:[o!k_=2#l_\s4Hm)Zg@_274nZP!#5_M"ooYJ&Ej,n!>GS;"pkY
+;$NpkcqWRnNo(N"Xo_AI[qC2C@r;6<bq"OXWo_J=SoD/7Xe1VOQ!XJf+bN_t+!"gV#"on]A'*&:
+@r;Zs'#mUV8qu@$0"T\T'!<<*&!WE'%":GeD"9&9%!sJf&!r`0%"UPG;qZ-X(#ltV<!!<W7!<E9
+#!$DFR&I(6+!"lp0d.RG+jSef4o'c#:n+5^r!<`N-!WiCo!(-hh!rrQLs8M6^kl:PTq>UBlqtTg
+Rn+ubHn`9Gm1S1uOs5"PG[DO!Ms6M)*g$%0"fJ6A-#lt29$OR+A!t#>>"9JK%"TeZ+$k*45!<3*
+"!!<6'!X&E)()7NR\b5F]n+ubNs7u6co^hYEoCr.]rqcWks8)`j(\dLlqYU!\rr9k8/IW6l*\-+
+.o)"eb)?'U;&JG3D!!EoV+W(Rb!!EB.$4IFC!##MC%M&O@#Rh(F!!!6."U,,9!!)fq4TYWa!!*-%
+!"f_M$OI%A"995k89Cuckk+5tag7RuKMrTcI+&&gs7Q3Um/$SLq"+(Knau!u!<`N-!WiCo!"K)3
+!rrQLs8M6^kl:PTq>U:Cqt]sWna#W5qX"7ZLJqC*s7f\^<j9fr^/G=;df4_@s29d="p=u.!<`Q0
+"Si$&#lt#,!<<0/quH]srr=&?!WiH,":>8=@,M"Un*]o:lM:2Gs7c6Zo_&"VrVlZmq>^<jq]b_&
+nbN+Xq>^H-s%3A)!#BJNZKA[sb1k!J((_2`#9k&u"8r3""o//u#6G)4!WE'"$3gD/!X92PrW!$$
+"U5&'!#YtE!s/N-#R^k;!!NK*&1G]qs829_r9F+Vrr4,>p$_q@aSl/6eCsZ`nb;\Rs82Wdq"=@E
+K`D5Y!s/N)ScCbQ!<W<,+ohQ*s60L[q"ad_qtp6bp@\4Yrr;BXs2P0r`P1g@qb>YLqqdItpsl8`
+qr31@"99DS#5eK"#5n]1$j-J2!<<*)q#UKq*<?3C!sA`,!$I'bs6TCOs7Z!^qX=.Sq=s^Yq>1!f
+qAK&&q"agbr;H<XnG)hOp&"=Ol>6V1-NHWXrVuoR%qHCT!$2dW$NUA:$OR%;!<*6)#6au*!<NN*
+$4%"K!!!-2%grO=!!E<&!!<]*!'C>f#RC_E%0QY7)]fkQ>EQbdnF?GTo&8d#p\FRTn([mBmFh(1
+s8(gKrp9I\q#:0gp\3m)!!EE,!WiCo!"f;6!rrQLs8M6^kl:PTq=j^]rqe/?q#CBns6eqHiWBP'
+r;Yij#LWCmg6nh^q>Ufks-:J%+:%uJ!"0DP%f$)6$3gbG$j$D/!s8T+!<N-!)Z^!A!sA`/!$-42
+q=Et:q=aF[s7#RVqtp6cq>C(:p\=OZqu$Bjq"!tKp$V5<k5Y3W$ii0pe+Wgbg\U43s7aQo:`9B:
+qZ-Wsr;Zg!rWN#s!Y#G;rW!6*"9Sc7%gE"6$MXT'!sf/6rW!3>%NI`AK?+#grqQWfnFle[+oCs$
+m.ou9p\a.1i;;^2roiqQoDedfq"X'+!!EE,!WiCo!"f;6!rrQLs8M6^kl:PTq=j[\rqmr:qXX=H
+s8)*^ofn?6rmC?*'6jKCeEZVWs5qVjs"$/P#5/$"!sT&?%K6A-!WN-(!<iW0!s/N%!#5M9!WrQ.
+)Zg!hMX1<9h"'gknFuVSr;-Qlq>($drqZTjrVIH(oCqnDlgX!#rtH.I)JJF9k5X!3fCZ?&rr3Js
+b,9Jo5p6[C$ka!W#R:82(^13V'+tfe(a'4p$474T(`WVX!"KG<!!`6#(C(3M!<<*.(BQXdo)Ja^
+o`+ILq>9[NqYp*gp%\F`ruC+co`+ads7l-Zq<d\Ip&Fsfq"X'+!!EE,!WiCo!'UJc!rrQLs8M6^
+kl:PTq>'marVcZkqsaIIrr;Whn[rcuf(&,*RV`#5df8Y+nb`@'kTLrQ!"BJR().>h$2t)*!t?(X
+$kO'd*%(sq"U"l-r;[i=!WiH,"9o):!@!Qns7H?jio97ns7Z6`qtp6cq#:-hqu?Nlq*t>Vp%nLT
+nb227WW3V3"N9N]s5s@,p@\Ico]P`Cp>FukhU&ZnEEt+B*"iVb#7(;5&frJ`;e1]]e+EFm\Xm(Z
+#mUqG!r)p3%LN7;%Q%aQiTKRlj5TCtiTp7;s!Rg>s8Mrlp\"1Nr;ZfLh:2,foD\RWq"4.Wr;$3_
+pZR81"9\f.!Wekm9*51s!!a\IrojCGs82Tequ$ElrVZNfo`+O[s7#R=j45[Ds8U\FDP@+1Uj`l(
+7@_R\!)4p`!!3E1!!!$)"9eu7#mq(L"98H.#6"T+#R:P;!s/?#*<?3C!sA`,!>bt@."nPMs8VZW
+mI0oAoCi"VqYBmbqC2C@r;6<bq"Oa]p\k'cq#9X["pbPS#4MTde,T@+i8W\^p\!k9mI^AUrVliq
+&-)OtlK@F"nacAElJ^^hq>UC&qt0CFm-p2q&.T!H!;Qg^%gN(=.s&c2oDejfp%eL[m/R(Hiqi]J
+p%J1Vq=jOQqWn1Os6'F^mf3.Qs7u-`q=j[Wp?.)/"9\f.!Wekm<!*.'!!a\IrojCGs82Ter;HWo
+rVZNfk5XuCrU9@Ai;+G\ZTp;iqu=:s91#)ERQWQ#s7u6QqXN.6DF,s*-nRDJ<b-,kJVTPcQZu_/
+#m^b>!s/?#*<?3C!sA`J!!!</'-%"!_t!L#rqQK\nFZMPqYBmbqDS6Iq=s^Xp%A.UrpBCYqsa@U
+(+K;*!;l3=o`+4BpYt`0jknqSl0[p(kN_R.nE]o6s7ZKQrVZ[OrquZis7u3Nl0Rs5g<rt$'-7,^
+'ES77(*!\^#ojfq7&f\UkNVC*p\+1GnF?,Cp\F^arVm?+rVcZnqtKdVq>L?iqYpC(qYBp_q"XOU
+k_&p="9S],!M09$!s&K(#9j-Hkl9lHqtU!_qZ$RYlMpnElMelD(tc>s*_lLCs5c6KqGq8S-Bn'!
+lL"WLkI>t:3]ArW5"AOYC2euXR&#b'JkHFN!rs#8!!E#s(C16M"U,)8#]Jr,m(`#_s8W#jq#(-e
+oD\UcqZ$Bjpa,t5qY'IOnb2F\'`e:E"S_r]pAaLQs82flp$qPCp\Opdmd'HBrr51Rpt=ueo'u,7
+mdK]:oCMqVoBtu5nauk]X&i"P#R(22#6Or+$Q&jlE1bAJs6o:?n+-/Fo^_MAoC_kRqu$Hj!W)Wk
+p`9;/q"FIXqu-<cqYU-bq"OX[q"=@EKE),X!s/N)ScB6&!<W<,+ohQ*s60L[q"aa^-ia21q=j.P
+p<<%1+[8>(p[eDR@6FM5s7bX9q#9^Cm+pmpmcW^!q#9guoCr.^s6JV7qs3e<^fVQu%jhl#%J9]7
+!<`W54aF^?p@dG2qYBp_rVZKarqcWjs82fn48nU?s7PmZrmG*r!"TARjo+Q6mc!I(l2(5Mp%7qN
+p\+@XrVZ9LguRf$oDeaek3_U*nFH5Ep%e@To)A.ko!I*Ms6#S&!!!'.#R2#$;==G`"8MWfrVl=&
+o(2PKq=*qGp%S:Zr;6Bfq>'g[p\FX^p_EJqq"aa\p\+IYq"=@EKE),X!s/N)ScB6&!<W<,+ohQ*
+s60L[q"aa^s8OSEs7-!d`H"?HHJnhrd_@4u#lio3p"&d8n)!7(s7>sZp[dqIp\=LSnF$;C%f,Sg
+rUp-gj+msK"Ub;2p]1<q'a"UF$kO$Q'PQq0s7PgJo_SRbqYBsdqCVO>qu$Els8VlcoD\1Hp;N:/
+-NF\c'"Ri5qt]s_qsa1IoCMPBn*^)Fm-3p4r;Zfe$LIBWqtg0bq"OLUrV'1_o^hYRpAY*UhsTsH
+Yc"_Hj7E&rf%f?Ll1Y/Np@\"Ho_JLUnalGJq>:*irr2lor;6Bbp\=RZp\"1Mo_/%Sp\+:Vq"XOU
+k_&p="9S],!M09$!s&K(#9j-Hkl9lHqtU!_q>gEls!.4:nSJGAo_c>WmA_('o)Gupfu)b;nDWC#
+rU]m[o^_P@m-4NL!<2ur&,u"]lgF33nE%7^"q:h@%ep&'"V_.I$kEpb!!";oX8i4\n,*._q"aje
+qDS0Gqu$Els8Vloo^Ul-i*BUg)A<)X!/]h1p$MAJr;?<aq>0p]o^h\KqYKpSkiCjak5+W0j8JZN
+o`+Lao(MhWq(qd<oB4-Rs6Sn@l2U;1j7iTRp&G!fs8VcTjnSZGoC)5Fs7#RMp%S:Zr;QZnr;6Bf
+qY'p_)><aonac;Ep\=OXp\O[[p%IU&!!EE,!WiCo!"K)3!rrQLs8M6^kl:PTq>'k&p@n=\nG_-/
+3&!oh7M5\`kJkX4pA=F[s!@@5s8VfYnaGr<qu?]pmdK];p%J.So_.qOrV,aLfDl3i#S%OPo)K@'
+!WW3/)?YE3aPcCZrVQBdrVlZmqZ$Hlr#tY2n+>rGm4Us0&0(Z^!G:6fp>G#slhU>OqYL$_p@RqP
+rr5=WlK%s@lhp2JqZ#sNnFQALqu$3`q>0s`p\+XVq>^-^s8Voip@IkFnF6GEiTU"5rVcHcq=O+D
+p]'aQoC_kRqu$Hg!Vc<ep&Fb*p@RtInaQ,@pA"I[q>'m^q"=@EKE),X!s/N)ScB6&!<W<,+ohQ*
+s60L[q"aa^&HD^ro^r1IHT;'97Qg_Q?\/4V.J*91c0O?Pqu??_s8;]dp%@tImeQ_Wrr2loqsF+H
+nbqq8n'D%=!WW>s!!!&s!"]/^)?^BI:qHYdl14WFq>1!fqYp?kq>U..p&*tPq>^"30a%^r!#5bp
+[-mhYq"aU_p@e1OrUUj*rp&.biVWYhW)YQ'NO?jto(DeTrr<#rq>U3sq!IeQn*fu<pAY'k"TAB#
+oD/@b-M-0eq"sdQmI^AHnalGJq>:*bq"OLUp%7nQp[mtDn*ol=p%S=[rqm6%q"XOUk_&p="9S],
+!M09$!s&K(#9j-Hkl9lHqtU!_qBGk;n+m"\qTugug;&p9s0r$ag#_qUs8W#nrr;odo)8@\rqucs
+rVlfr')_S!o`+RTs7PRTaoE@c"VC_<q#CBurWE<,#71e;!"9YI.or&%l0Rs7qtg*eqDnHLq=s^X
+p%A@`i;`?0cispZ!!<oD!!"g8^X)B@m/R"[q"OLUp\=(Hp>N8s3>hfB%38I>s75jUrq??c#lFJo
+q"X^`rU^$g,5_35q>^Bdq#10bmeHhYlfn-Aq=+.Up[7A<qXF%Hp%S:Zrqufn+o;$1q#'pXmd0?1
+o(;YNqu-NnrVH<ap%IU&!!EE,!WiCo!"K)3!rrQLs8M6^kl:PTq>'k9jo+WGs6B4Lli4cTqu#UQ
+oDS.Xrqb[TrquK\q#CBfqYgEio^VMFr;Q]q')qe'n,2M8s6o%KXT0+:!"T&4o`,X+"UGJ9'`\UA
+&eHkelKIX/r;--dqA0,1rVQEbp@\ITs5r5=WrN\2"<.UN&cMkY(f6XJkNC^amcr9'Kkj'o'F#'J
++!(Ob!$f/Vs5WD/lL=TJs8MNa('"1(qZ$Tgr9jRVq#BjYs8;]dmHXHCs!IR2l1XW6o)/Odpu^l1
+p&4pdm/627s5NkKp](9_r9X--!!NT5"n_lk!r2g$"U"l-!!*-'kQ(V`"p+l/"9\`+rW<'$nGko[
+"9JT(!<N?1!='2;#:00>p\+=Xs8Vufs8Vogs8VlmqY9m_q=O1VmcO'9o&\a'k2,P+s8MZ_p%\Ia
+r:][Sp\F^cr&FTPqt^'aq=O.Nq"OOVp%@s4!"oeB('4I:":#2:"9\l.'EA::li6I[N^OKl$NLB.
+4TFO7qu$9hqZ$O8r;6<bp@eOOrV#CGT)oB#"UkJ8#mCY<!!<]E%L;tB*"*&V!WWH*#RhjX)[df/
+`eN*N^&A!0q=j[Xo'Z&E8,)oUo(W1_o)A.YpA+aYqYB[Ts8V]Zp[7J9jl,Cqs8Dutqsrt.g[t@B
+qX*G5qu?]YmaqL8kOA62q<.3q!!*3,"98E&"8Mrm!Vlcu"9S](!!*-'kQ(P^rW;rtrrV]j!WrK)
+rVus"!r`0/!<<?Mp@\+Np%n[dq>U9k"8;cor;?Qtp$qJ>p\b%7r8cPnq>^Knq=j[]rVlWhqu$?f
+q"Oaaq>'p`o^M_Pp@\CU$\A@))#t'P&.&UG!W2p5%KHY4dIZ_os7#49VF2C($LmNas7l'^qEOuX
+r;6<bp\+XMqZ#pAR0j'/#lk,6":P83"U"f*!X98F!WW3-(a0=g"TT5F'+"XA[A3d%qu?<ZnauYS
+qY9UW)>sL3q"t*kp\O4Pn+-MFp&Fg\s8W#ns601Us!IUAs6TFWs8;lrs8;WfrUT"4qr@_Us7H?b
+rUKaRs6fH/#6Y8;"o\Ms!Vl`j!WW9"!!*-'q#U9kpAsjcn,`Fe3WT9p!s&Z-%k75GoCDSNqtg-f
+p@S:_qt'=Sq"==Ro^D)As8V?<h;$Mrl2Ue_s8DQdq=jUVp\F^`rqm]2q"=:Xqt^*cqY'IWq=X=J
+nF?'g!!rW,!!<&u)ZpBW&c_t6"9l-up!`Wth<:7R!s9S2nc/X`o`"^er#kn5qYBp]qsX=[mH1;Q
+!#uFJ%hJjV$P=0j&J,Zs$O?k4!#H=U#lk2A!sogKk3h9]l,;Q>jQuU>s8VWc6i?o\qYL-eq#'OU
+n+-MHpXnZtl/h-li8sG)rV#XAk5YJSjk85@jn[rmnG;\Bp?;DAoDe=7qZ$Tcs7Gr3!"')A#Q4Yu
+!r2ik!W<!"!<WK#!r2il!ri;u!!!&r!:^-f!!30&"T8<5"!R11oC;VRqY9pcoCDeUoCDeUrs&Jt
+ddR/,q#::"rqc<Zp\FOPoD/Cc"T.ugq"apc+8P[)rVH?dr;?<\rVH3VmdKZ9Xq2EM,6/,P&.8[E
+!W2p4"TSarlMpe^rUBjeg$aoYs6/kEq>^Hjrql`lrqR9$rUfgKq8NdB('agS'*/OP$jd+?r;[lA
+#n.7N#6Y#,#ltPU!#/&jrr:^)s8VWXmI9cAp%%YL%f#bkp\"+Jo`+O_o_8CYrr3H"li7"HV0630
+,8(=e!r`0-!tcS#-P\4GZ/Y9Hrr3`+gAh3Go)JCAr:9B%!!NT6#6Fl+"Si,h!!`Q+!!!$%"UFi)
+q#L3lrrMus!s8T+!W<#g!rN$S!<WH)!!il2%Q".aoC;_Xq"O^drr<#qp&4pNjlu=0q"4%?q=W\'
+mH2[bi84&&o_/=_rr39&qu6WcoChtUrqdN0qYC$erV?-`q=X=Jnac:1',:Kh!#Z1B!#btB!<iH)
+!!&&;s3gJseF)GPrqb[TjQH:4s8MljqA8`&mI0B@jrk9C!!!W?!!E?'!!3K<%12t5)Zg-I#RLnP
+!X'SH?MW[^ec5C/lM^SRp\Oa\o^VburqlWnqt'IXrTs=FmeuPJbNIT2(]Y".TpqUXeFWY=-2mlB
+n(>V5]nAKO!$4IPg&L4)s8VKbnD4'7oRI8K!!EH/#7D(<"8N#o!<!!%":#5@q#gEmq#gWs$3:21
+"9\l4"U"o/rW)Hjr;[c;"9o)<&/PrZ'/9:_naHASo^_nNr;ZK[o(;JOrsnksn*9#VccsYhqu?]\
+o)AY,j4rqsq=En3kkG,FnFQDNr;HTlqYC$frqlWfs7R-!o^8uZ?UFeu!"oS<!!j,M'+"d?!!8P>
+o)8RrqWd)-qX=IMpAa^UrqZWjqt_')o`+%InG`2U3sYfn%L*%:#mCA2!WE'@%13:B":#>G.3BB.
+!%987mbmiss6/kMq=aLVrVuornbOI0qu-QlnFHPQkOR]tpZV5:EZ@K9bieuUg#MZ%r:/q0lLk/V
++nk?Uo`+mYjNk77:sdtRcKs<`pZqkKl\$;Z!X8i4"pth8"Si5s":#,7"U55>%1`1:q#L3nrr<K0
+"9o,<$4-tC"p=u.!:^3j!WrQ0#n-Y2+:T@Br9NVAqX3\Cj7Dm(kOIB=FC%-S%gWCF,U=HH$NpA/
+'-/hmBWpe&kj7^"hr!\jn+$&Eq>U41r;-6es8W#loCi"XrVQEap\k-`k/PEFH<iEE"o\K<":Y>I
+"i9<kimd&XipZpAl14]Bs8VW\rqcWis8)`l2u*=.s7Z$_D.4"U'b1BU"onW)!s/T1$31)/"UGJF%
+fcYC&eI;qrP\`Rs7,XZjo,&Mp\FXYoC;Z(nE]N6m,-dis76*Vo)J=\oi)*$^W4[sqYU6hqt^*cq
+u?]pp@S1[ruLk"q>STo:F(52s53S=pA+:Zi7)oj$4I=L!rr<&q#pKtq$?s)":,>C%h\U?q#L3nr
+r<K0"UGJF%LWUM#6b53!q?Em"&B%(#R_(E!!!EI6;RRTk2c1.kiVHqo^Uo-qpUa]Aipq;$Pjg?4
+\SU/'EeXH0KhL?d,_jpm/?t[mcis,o_/%Sp\+=YqYC'hs8Dc_o_\Xf.Jro$p[7qWmD+:)?nr8r#
+7_=G&caO%m/?tahspa2q>]OQs8V`ds7H?jqD\9Jr;?Hgq"FFKkOSZQg8hD3!##P:";_CH!!!'*#
+6Y2>#64`6%KJ6j!s=%bg&L+*s82E\qYTgZ0)58=qYBp[o]u2Fna#]@s5rJDf'N"I.T\X@pZhbEk
+Nh?plga`Eq#($cq"FCQrpq3'p\++<h:%H&1k>5ukh>e!q#CBncK"Tis5*b"ci!eB$i^&$rr;uqq
+Y9aTo)A7[o)J4jlLj<>orJ,Fq"jLGkk"9,q=+FQ#4V0RoCV\=rpjRgi9(("s3TiufD,=0l07R+r
+;Zfqr;6Bhrr<#ppA4g_k2Yk/p&EG=iOo*Es7,RIk5,&8gAeK]/-$J]G,W^Ko'YQ$m.:&Lp[RY1V
+O"6-('?TfT]skcs7G:@pAaXZjT"<:qZ$RHr:p!Zp\=IQmdBW;oC;D<jkeY9`4`Ida4]G4nc/Xbn
+a#K/pAFsiqY0^Xq>L.JqYU3gqtg*]m.pYRmI0W9fO5'f$3pY5!WrT4$O?b5!!`f8#n."<$ih_ak
+PtSSn+QPIo(r=SqAoA,qYL$_p@S%NpA+IUpA4gLmJ6_=Tf!#Ks60IXrVnbOp\=OVo(_nJn*fi@q
+"O=ElgOQDqt&WeCff?Ts7QE^n`elti;`Z8s7*g92?Es`"9JT)!q61"#QPYq8_="=p\<nBnbDJHo
+G$oho_%qPq"X[]s8Vukr;Q>b0EVg[!!**&qu@oA!X'&=!<WK5+?,Y8p#uG7m.UCtrq,j__WfHs1
+B8cZs82fq,lIB3q""@Yp%%\Gq"jpgs8;oi`/V)'!64WTs8MB[l1jK/s82Wgs8OVHq"FFUq#C6dq
+"t$fqZ$Tnr;HTjp[@M>q"O:KqXX4InalJLqYg?gq=sd`qAfA/r;?Hgq"F%Rs7b[@rr<#(4obQh"
+9JQ)#6tD2!#GqD!t,YQ)^YP+Vq(CncH,hVo'GrHs7u3]?hjHnqYBp[o_\.JrVuNYo\ed0qLC1%!
+!(?ncMuV9jR)9umIU/MqZ$TkoCDSNrV#dJm.'lKrUn$@>R>e3s4?Psq"jIZr:'CHs6i`$!!i`1!
+sT#:#6=l."U>>A%/^D1#nIb"%L2tE>LWK=s5*eBs7#aX,l7E8r;?'GoC_;@p;u5a)#tK`)$(3V$
+OI"?!s/Q+!<E6("UG#,6j*Yq#nnVXiUZims5s@'s6/&6n,I/oCB+>#f\5f\iRZZEn*^5Rq"+(Jp%
+S4Pjk/D[s8Tk6ZNIq#puV)HhuDm4q#C0d/cYeGq"OLVp[.8.k3;6ul0@HnkO/$<q#'gWrVu`gqW
+I28q"t!cq=j[\qu$?hqD\9Jr;?Hgq"FFWq"4=Xp?L5bM]r?1!!EH1#6Fl*":PP9!!E<&!#4n<o'
+#Z?s8Vfgp[RkQrqZ*\*r,R-qYBp[o_Ih?r;>pIq>]->G7YiD-UB/Hm/R+<rr4kPp%%P8jmhj0na
+lMPrUBO[s8VN=`m[3R%fdIjg$8V6rql<`h<ah%rTFIm$O6_5!!<E0"TAB@!X&]4#QXr-!WrN-"9
+8N*((qZAlh]oHec4h4nau_Xr"oD"rr23_s/V4],6/>V#lt)0"U5,5!s8?"#6=o,!soDE"9&9;FQ
+2rZc2ZeYoDejOikdQF`j,R)rr)!Or;HX=rU0+Eq"ss]mcj*5s8VrMe(t'(XGT>Bf)P.7g&Lp@nb
+DqVs8)inq#0ses8W&rruV".n*]fBqu#mDjRE!>oCM56oD/=^qYBdWqYgElqu-@KqYU3gqtg*]qY
+0OMqu?0>s7LsP#U9o]!s]/<!Wi]A&I8aX%L!Ltc*$g?s7bm)m/$b[p%RqO=8;UfqYBp[o_.bEqt
+KFHs6/4VV],U9"98Fgq;qYVp#G#hj6H.)n`/j'q>UEorr;i_l0e?Hs0W^N%N-9:]<_/1p#PH=n,
+NFEipHjK"pkJ:":#2<#Q+]'"TJK;!WrQ/"pPY?!!WQ+!8R>3s3q#1s7#aYr:q!*m/-P<s7;JR!'
+^kn!!!3'!!<-&4p(if!<<*#!sJlD%Kc\2$Psid;""2Tkj7g=p>b5ss7BLqs6K49s7FRsnG2qWp?
+:,nn+QYVq=F(GqWubmrr3N#_#L,c:B0tNnClUrlMLDQqZ$=3q=saZp@dk:jQ,Lhl0&*HqtU$drr
+)fcm.9u@l0.j?oa:Eeq"aRUqYgElqu-@3qYU3gqtg*]p%nIOlgjfDb5_L*,6.c]!!!0-"U"`*rr
+<]:*D2=.q;_M9gX5Tll2:S]p@\4MqBu(6qYL$_p@S+SqYL!]q"aki!!`lP-7U)X"=Y`_[*SdPrq
+Z9Zmcs`M%J]8Li9U.-b_ne#-iaVQ!&uYNPii#;m/R+^rU].9%KI"E$P*^R"pP>;"U,#1!<E0'"9
+f#9#mq%L!!!KO%jgrCli#T;li6JJq&/u%p\+=Mk3_?fn_KCn!##>7#Rq"C"U"l-rW)s$rW<9,#7
+(M;rW">P$O6Z$mdpJTht6iks50K.)ZUMaT^r-8`W,N)qXa=Xs8Vrjp%7tSrr3c2rVuTJcct_SRn
+O%s!4(qjo$RKtr;$0b$ha5gq>'dYp&G'hqu6U:rp]79jll$rlML2Cq"aIIn,N=[oC;JIqY0d]qu
+$?hqD\9Jr;?Hgq"F=Sp$(W-q"`n3p\jU#>6#]Z$O$_A%M/d_0LB9Aj8]/Gp>>oJgXPios8)Eaqt
+]dY-M[E5qYBp[o_&+Uo)/OZe=7lg%0Z_7$igG2-8GQ8&gf1o=aHF7rj4GeXeM#5Hs]Dl%0QtO*!
+Hiq$jm7J#lm`"r;Yd9e_Bp"nEi49+TMoe'F4[="9S`-!<N)u'`nI@"pbJ7%2T!T!&hmmp%[bEpA
+X[ZqAT8-qYBp\p@eC`rV-3hm)?CT&IK!g$NLSA"oJ?r!W`<%!<WK0$5+'c',1ZO"bH4's7#CEs3
+KMB,U*7T"=jIN^ZtXnn+utKhr3hfrqlK`pA+[es5;f3pY><=lD-]G/d3:=Pj[u"s6oRVq>)]7p%
+S:Xq"F@MmHNp'n*]Q6naH#Aq"OFGl0e<?o(;n[r:opUp%S:\r;-6aq>C(AqYU3gqtg*]q!mP/nb
+V_/s6o^Si:I!5>XBSB%NdDf@A)TYs8W&ciTU=!s6/JArrr5go`"mcnbP-<q>0s`q"F@Mp[75Bs6
+-RA!"8i3!$_RU!%ABX%g2qA#6Fo."9SW)!s],=#6Y)<$3^M7"9&9A#65;:"onW+%m7E&o_\Las8
+V3\Ifp,\'-\M-!!*B'#Q=uF!!*-("pbMB!$Efm&0dVDqYg*Xnc&I[q><GTr;6?dq"OOLqt0:RqW
+-;o@2oRR'bCQ_&.8^I#R_+I#6k>9#RUqQ&dA=9%hoI+gAg"*irA`Bic,\5!"]&/$3ChS0meA\g\
+LmDrq%<'pA=jfp[IMEs8;<H_IEWY!!3rS!(?kiTu$'es7$'aqBGM&p\FX[p%8+ToCM\Oq"FU\q>
+:3lr:ogQq#1!Vo)8C[q#:$fp]gctqY0^Xq>L0bqZ$@@q"OOVpAORFk3_j9pA+^fs7l3Yq>^KmoB
+PH"kjA6Hp[@\Iq=aOVq"X[Rq??]kqu$Elrr4%nj8/E9s&oO0#RUkC"9Ji8$4ICU&J>9O!s/N+"U
+=c*rr=DM$4I:K#6tA5!sJl3!>YY^V#BHUp&F.Rk4S>#IhVtb!!E<+%fue1!!rZ-!!ET9#mUY>rW
+!6IMgGEtmI0Z?q>U9]qA0,+p%\=RpAOWu;$mgA!"/c,"U4u-!<*'&"U>;9rW#[q'd""f!!n_es4
+RG5s8D5U&c`UG%fd7R#Qk&,!Ws2U+YH)`D0^_hJTH*nJSJIX+:%rI!<<?*!!!$&!<=JI+O]*%oD
+SOYpAP!dqZ$Bdq=Y'fq"X[^r;?NhqZ$<op\+=Ro^qkRq>1-js8=DEqtp6is82K[oD&7Sp%eFXp@
+n@Wq>'aTo(MtKqu?EZoD&.Tp\4IYq<[tXqu6L"roND:p\FeC!Wr?'!!<#t!s/T/"n;^J!!*60$O
+R+B#6Y)1"U5)1)#tJ(r9sXTqVqG-i8BNY&/--6*XMfI!!3H9%1!"6!#5M9!!*<67iVLDS>#u?oC
+V\JpA"IZnbO.'p[e+NmI'ZA`a/oN'+b9V&eu#d"9JZ5"o\L"$5OWj!WW3$%4t>ks7+kDe+2>mL(
+4:n!"'2K%g`CA!sJo0"Vr[Z?#Ot4IX#[LJU1ll.hVpc"U5,F&.8mX&eGKu"<<Esq=t!ep%A4[p@
+nO]q>'a`q>^<jqt^*gq#C'jp@\+NpA4U]s8N&s/,];AqY0mcp$1Z(na5]2o(`(Wp[[tNp\+C\s6
+ojbp[RnOq"OOXq"ad_qsO=\q>U-up[@\Fqt]Ic"U"l-!!*!!%KZ_8"pYD>!!39-"p=u-q#_rE!s
+T&<#6Y)4!s&H-#6b/A$3Eloq#Bsao`+OYs4$S)8cShl'Fas@*<QNP"p4l.#n@=I$Q18k(/C+edf
+7hmp\".Lp%S:Pq@ii#nal87kjJ0Eo9D6V)Zg!?"9eZ'0`_@\#6b,.!#l7F#q9)C^?kLMk5XE?_:
+M3d%0ct>&e>BW"pG2:$3USB%h8pL!!!-#!$V^Q!#Q1J!!N];$3gS4!!3<,!YH%K/*-a!nbVnMq>
+'XQq"ag_p\t'iqYp<dq?Qikq"OLUp%A%Tq"k$d,P_$-p@dtHp$q;-jQ>sulgaiNqXsLTq"F=Lo_
+7nQrqH$YqYp9iq#gKjqu$!\-i<c9q"OLTp%%\LrUn[V"q:nE!s/Q."pbJ@$4@7O%0-A3#6tD4!;
+Q]r"oefS"p=r,"TeZ*"pbD8";(VPkjeNCm-FW9pAaIYs6e$p>:gX)+rLgf!<3*9#RgtB%3[N[^A%
+[-fDkmIp[dqFp%eRVqAoD&nFZ;:lL4c?n`nTLUeVL6&.AgI!W`N8',(iZrW#\*<28IQs8;o^iUQ
+s=s*Abh&f1Q]"9f&9"U"r4#RLJ2"UGA:!!!<7$O$kP&dJF;!!*<4$3q%M$O[CR%hJgW!!%oRmH4
+9;oD&(Kn+?GRq=k3nr;?Hfq"XUYqZ$?oq"OOVp@e@XqZ$@Bq"OOVpA4OVq"ss]n+cPFpAP$fo_A
+=]qXsCLo^r([p@S4Yp\=R[qYU0fr:0V"qtg-`p\+:Qo^ht[jckT+%LWLE!WiK.rW3$#rWE0#"U#
+&8"98Gt!r`Bl"U"l,!!E<&!X8o8"9BD@!SH)ln+H>Djmr*#m.B>mmJm45SUkol:-^j$4B?$>OfQ
+b!s7uTbh;?<;iq;p4nFH>Ps7,qUo^D;Dp[ReIs3fEgr;ZfJkh3\@H<EHe+!W<u<I(:MrU&@kiU-
+'ss6oROnF5]T+93Gt!#H%D!<E0#!<NB,!!!$)$kX0hr;\&C#6t80!!*6/#Qt,5#mgkC$4IFR'`n
+afnG_nPoCDYLn*]fCr;$*mrVZTjq=saZp\Opc"8MWbp@e@YqZ$Qpr<N8tqtg?gp%n[f+Sbm2qYU
+6iqY'^^s8W&pr;QEfr:]j^r:]s_qYU3grVc0\s7uZh$i0Jis4VL*!XT)7!V69p!X&W-!!)fq-3a
+VV!s/K'!!<3$!X8r:"UQ.R!7JmIj8]/Onc/XXnauk]n']YMrVmH.qtK^PoCD>5j5fLpnFHALrr3
+9&naZ,=p%eUenbNskmd^/Np%A1YoDejKalWQln*foHqu6oqlg"'=lL4EFrt+kXo'cSSo(V5G#QY
+tR!"9S:!!3N5!r)`q!WE0)!X&Z2"U"N"&-EIL%NYW+s7?$Vo(VnJnFl\Tq>($es8)`jq>1-gs7u
+inq"XUWqYC!frr;p3r;6Bfq"OLVqY^9gq"t'ir;-9epA=jh')hh0q#1-ap\t-bqYL*dr;HTnmeZ
+t\rqm3"q=+(@O*:a4"pP23rW)p"quZBg!X/].rW3!"rr=JL"pkP>$k*@Hgr]*KkOIKlq=X:Ln*B
+)tq#CBhh;RPco_A7XgY:WMpAY(&n+652g$.u#o()DFp\F[_nbP9<nFQPSo^_bImc<d8rpTCRo^2
+#6naPqmhsgC3mHj9:oB"cgoC:r.lMU\Zp>uD`'aP!D!"f84!<*#s!"o;7#7M1X!<E6)!s&K.!Wr
+Q-!WE'7"UPSF#RLtT#QPAI!7(0&p[ReKq"++Pq>'mdq>^<jqt^'nr;6Bfq>'g\pA4R\s7n5@p\4
+CTp\b'hp%8.]o(i=cq=jddp\Y!jqtKgYq>L3aq#C<dqYL*er;HWonbNgmqYU3hrr<#jr9E_M_4;
+,ErX/l8"98E&!W)it!Wi6"!<E8t!<3-i!<<*#!sAZ*!!*<2#mLS6!"S8Fs75j_mHs`;o(M\Rr9i
+h@q"4R^oBko5p%eU^oCi+[n`TH7r:TX\mcO07p\=OXp@[tP4nnO>qtfjNo&KcKj72d0s7YsKme-
+JSq=jmgrq5jWs7#XLm.:5Nk4e68rUemj"U5_B$Q9!N!!36*"9S\s!!!'!!!!)t!!E?-!!!*"!"f
+>A"oo;:&C9V.p@7_LqXsR[q=sd^#P\#gq>:*frV?<iquuuoqYBp]pA2>r*V]@*qu$BhqXja`eb@
+SP"99#6&J+pM!!<<+"9S_g!"fA7":G20!WW36!&=N.s6fFIrpUQko_&4\p$hD;nalYTqYBmZp%8
+7O'^tSapA"IYp\".JnF,o<oC_kRqYU*b5Q(ESq"X[^r;66ZnauSNp[\"Srr2ffo(;VLq"XUVo_\
+L\p\".Knb`1Xp%%S=m.^P>qtKm9!>GMJ!!*r;#5\E#!V$0i!W)is"o\K?!sSo2!<<-=!6*4_o_%
+tRq"OIRpA"L]r;?HBqRQJ&q>^:(q=jRRn+ZeAs60JT$4HnI(C1?*!!!*!!#l"U'EBKmFn"etlgs
+]<nac>Gp\js^o'l2Ap@nO\rqZNd'DVJ's82Zgq"F@Oo()DEp%S:Yqt^(Pr;6<bq"agbqtK[Pp%\
+=VnFQGQr:omQp\=R\qYBp\qtg-_p%7kHqtg*]o^_PAn+c&FoD@2@!=o>6!!*H(!<*#h!<*#s!!!
+*"!#bk?"9]27!rr\gjSSWDp\=OXp@\.SqYU3gqpkPOq@r_uoC22@q#Bg_ir=TE!!WE'!rs&7!ri
+B%"RuKf!@RpN$NpG7#lk8P&&IW)kOA3<o^qhMq"ajap[n+Oq>9jXp\=U^r;HKkq%<N&s8W&qqtg
+-_p@e+Mp%J1Vp\Gs/qt^$^q>:*ep[e"Nq=s[Po(VtUp[[eLqu$Ekr;6Ki*VoL(p%7kPqYBp\p@e
+1KnF?PBr7h8P*WQ3@!#kq6!V$0c!WN-"!WE'9!sT28"98`-kPt5Kp\=OXp@\.SqYU3gqpkPRqA8
+u(qYBmYo'uMKrq-3EqmI1=&-)\8!#GJ4!W`?)nGr@d-iaeg!t,YD!#YbIlM0StqtTpZp@n@Yqtg
+-`p\=U`s7c<`q>1!dr:^-_!quBarqd*"q=saZp@\+Pp\=RYqC2@>q=sa\qu$?cp%A.Wq"F:Oq"j
+j^p%%qTr;HTlqYC!aq=s^Xp%A.Vqt^g$o)8UFqr/5.('"UP!"o24rrW3$m/[.errW3&*WQ3C!<<
+*$#65J>'*/'fs7Z3^q>'g[p@e:Xqu$BhebZiQ(&.M"qtp6cq"!nKpAa@Vlp_6h"rJWK!;Q[.%Mf
+$E#nddl!!?^+r8$f;q"Xj_!r;`krqI!!qY^?mrVZTjqYBp]p%87T!VQ3cq#C*fpAameq#C0aqCM
+RAq=sa\qu$<cp@nI]q=XLXqu$Bhq=jXYqYU0dq"OX]q>'g\p\4LZqYL*gr"]8&s8UmSnlAs%!!j
+P[!"9#7"9S]+m/SC4!WrQ/"T\Z,!WW6(#QbD7&4$9_rqH3`qYL$_p\+CYqu$BhebZiQ+8>R,r;H
+QkqtBXRn+Gr5n@qj(!"U1U!!rl5!<<-&"n;Tg""sWa!!!]6!$;2>i;`E0s6]UUp@e7VqY^*_q>1
+!dr;HZqrVZNfq"OX\q"OOXqYU-`!;?6aq>)32qt^$^q>:*dq"OU_rV?-_qu$Ekr;6?bq"ad_q=s
+^Yq>U6iq\B,!qtK4Ps/VhB$ih"^!"0#9"U"l-m/SC4!X&Z2#7(G5!X8r:"qL\8)n>VAl1k)Nqtp
+6cq"FLZqu$BhebZiQ!VlKiqAT2(pAOp]l0dupjSuhi0HL<*&JYof#R1J=$Ln,l"<%7M"UZ+I"CH
+#Ns8;EYs604Np%A%Qq>0j[q>U6jq#LBlr;QQurr)`jqYU3hr;$0brqZBd&,c>#q"X[^r;$-_qu6
+Tjp&=gfqu-?qqu$Ekr;6?iq>:$eq>U.(qXaUVo)JLLgjCCJ":bM;#R:P;!s.ch,QRuN"pYDF"on
+Z4&e+sN+V9)$nGhhLq>1!cqYBp[q"jmcr;5%@[e^g9p[n"Eq>9gNqu?-]s8UNZAH2lA%LN@*!;Q
+aM',poO#R",upuV#;q>9IEp@\(Mp%J1Vp@n@Xq=s^Xq>'marVlisrVQHdq"adcqu6NmrVl]nqZ$
+Beq@EN$q=sa\qu$9bq>C9lq=XRY!W;oprr`5tq>($drqd`4q>'g[p\+=[r;ZEdq<@qZau]S'!@I
+mS#R:M8!UTk4!<WK1#RM4N!!*WJ%g)f8*qfO%kl1AQqu$Bhq=s[YqYU3gqpkPRqBl"5qu$Bhq=s
+map\+=Ro'jcXs6"P>!"'JA!!<K,"W%7A!!!'&!W<!D!X8r;#QOl0#mUV8!<<*''Fl@Bp?_,2md]
+l:m.'Z<p%S:Yqk<j&qtBURqYTsRnD/$`'`eLc!!!*0#64`0qu?d!#nZn6(B=L?"9AN+#R:h>$31
+\D'`h?;s5En5s2OoGqC248qu$Bhq=ss^mI0fFn`]`1oCBG34rjV'#oaln!!!6.!s/N)!!!-'qZ%
+]A#n%"@!soK*)up75P0iafmHa0/o'u/=oCV_Mq>0u]qA&eup%S4RoC;ja3tDVt!#lLQ!XfPDr;Z
+j!!r`3!!ri;t!##MC#mLA0!?rd4!<@Q(i8i5as5:on\b[ECq>:*fqt^$dn`K-2qs`VFkNDj?h6r
+893#2Jo%3-Gg!!E<*#RV"="<dsT$4I+D"TSN'%2]'`;hrNqs6TCIlg+$2o^h\Hp%J1VSbaK)p%%
+\IqTJp-_JsfW#655J#lju5%giOH$ka0\!s8T*qu@'7"onlA(CpWq%L;t5#t0UCo`*S3o`+a,qRQ
+GJq"agbr;6<bqXWt?p%\(ArT<JEq"k$gs42i\(EF.h%LrmP!VcX:!s\o.!!*NJ,Ug(hs8Vcbm+1
+t'mHj?8p\4@Rp@n@XT)/Kb&GGS]p]&M%r;YaAZ!n+G"pb,-!"Jf*"9AT,!Wi3!!!W?%!<i]+!"B
+V^5WY.bs2b#qs5;o:`qm7B:&+P]r;?Hfq"=CWp[n(LpA++Kp>b94s8)`diSi=Q9E5(t#6kDA&J,
+Nc$3UG:%M9L1A#.cHp>t;igu\/(qtp'Tmdg,KqY0aZq"a`XqA]>1rV,gNq#CBMp%@n?qTb^($5F
+s'!!!$(#Qt#*!s8T*!W2rs!>>G6!sK,63eZ_Vp\FdQs5*2DnF4Ho\b[QGq>:*fqt^$Zqu?ZhoD&
+@bnFuqRp%R\9p%7V7d#19u%1`d>!"92L!!"!>SC-Nas7uKirsAAjqtK[QpA4[_q>$`\+8l*7q"4
+7Sr;Y[Sp@6H.s*#gj!!`K('*&(B&.JpN#l=]'!uD:P#m1/-"q;=^8<MWajlQ18s5`2>s7+,*\bZ
+s6q>:*fqt^$^qu-Hhq>:0jnbN.`0^eo:n`K*0p$1r0hSZ(DH['jfL51PFT<-r,iTp46p$VVHo(2
+,)n,N7Yp%S@^r;$9erqW8a)#jF-q>1!ap@%8Gs7kjRq>^KIR8+M"#7LJ1+pJ/M!<N?+"U>;="9J
+W3)([p@FeI4`s8)3^p%IeGr9XI``qm7B48AXKr;?Hfq#1$^q#16jq#:$dqs<qSp@S:_q!RVGs7Q
+<irU]LMqt9aYmc<Epp[\+Zs8Muss7#[Vrr2p'qYBm[qYpNmq#:0iqZ$AbqEP#Vp\Fjhq==I`jn7
+^7n`S'es6J%PZ^,Q#)$LEc'at*D!sJr;$Oe!o-V8`hcedj]n,MPImJ?2Lrq6<Hs5q>tWVZVk.Ji
+l6oC;DCo'Yc*lL!Hai90V(q=sdZo'c&<pA*b0k3D@'oCVSEpA+Ubr/(7trVQ?]o(2MIk3MU6rVu
+lqo()5/d'fO,JUMloMOq,gbgbV>p\b!gq="Xhrq,RBn+Zb"qPj>iq^2.4o^__Mp[dh>mdgDUq>1
+'hqtTaOmd0<-mdU8VqtK[KlKJ$=qu6KnqhY(Or;-0\oD\:hlL"09q"OIQiTBV'rVlg-n*TH,n+Q
+b\s82<Kk3Vg?q==jdp@RtJpA+U*qPj>kq^qaCqY0[TqYU0boCDPJs8W&pqt]mRp@e7Sp%.bDqtp
+6dq=s^YrVlfrrquWgM>I8J(&7Oqna>c4nFQ;Dna5ZBs8Dcep%A%VrsJ]#q=OCUq>'dXoD/(blgO
+NCrVcWh`qlY10)PSEqt^!Zqu$Bfp%8"ToC;;>o_.tKq"jsgr;$!Tm-X<7q>L?nqYU3hrVZNfM>A
+Uoq"a^Xna,N2oCV\Hna>c7nEfE'lL"'0nalGHo^_P.jmi6JrV,mYpBU$QpAFsiqt\8.W;6Mkrqn
+8Bq=j[\qtTgUp\O:DmIBuMrqu9Wp\FXWn*BfEp\+:PoCDMFp\F^ar;2?I$MX>kq=aCHlLacCrqH
+Hd#Oh0RpA4^ds8M["p\Fdfs8D][kN;.'qY9^bp@nC"qPa6@qu$Ekr;-6_q"a[VoCr.RnaQ/Fqtg
+*Yp%eO`qY'O\rquWfp@S"Ho(DeSrqqWLs7d'!q"OIQnb;eQq>1$frVZ[.qY'OUp@@_Cp%n[bq=a
+IPo_%tSp'1Hlq=s^Zq8N3/q>pKkrr!Q/qtKp_q"==UrVH9\o_/"MnFubWrVmH.p@e:Wqu-Nop%S
+:Zr;?HhM#%APq"OOXq>1!eq?Qorro`S8p&"Xds83'!s8V9Nqu6Trq==@WqYC3f`ql\2%f-#"rr2
+loqtU$bqY0a]rr<#rs8</tp@7_Hq"k!f!;ZWhrV$QprVlfpr;-5Gq?m/sq"OOZrr;rpqu6EkqZ$
+Qur;-6bqYpBkr;ZX!qZ$Qho'l8Gq"tBhpA4dgrVH?0qP!ccquuuoqYBp]JbjropA1KZs83&tqYL
+$_pjr9mqY'cZqZ$Hsqtg0bq"TF:Jbo*:U&+fe"oJ/mq=s`9qLSM:qP!ccquuuoqYBp]JbjropA1
+KZs83&tqYL$_pjr9mqY'cZqZ$Hsqtg0bq"TF:Jbo*:U&+fe"oJ/mq=s`9qLSM:qSE"Aq>:*hrr)
+clp%S:Zr;?Hgs8MigrqK%Yqu$Bfp\4L]q>1!cqYL$`q"agbr;6<bqYU0cp\4O_rr)clqu$Elp&"
+dfp[n:]qY9pdrqZ<`p\FadrqlKaqtp?krr)`kq>)*0r;6?fr;Q`hq"sp^p%S:Sp\k-lrq5[Mo_/
++Yr;Qs"rVZNgq;M2Mqu6Nmr>5;0s82]nqsEqKrr)T`q>^6cqu$Bhq=sd^rqZTjrqciurqlH_rpp
+Bhp@e7Tq>1!&qS;q.qu$Hl.K')?q"=4Mq#:<`o(;_Ts8W)rr;6?cq>:-jqtBa[rVZNeq>1!cqYB
+pcq\K&'q>:-fqYBp]q>1!cq=sd_qtg-dqYp:'q"ag[p@nCZqYBsaqu$Ekr;6BeqZ$Kmq]bt:rV?
+<eq"==Urr;oio(2VRrr;uqq=jOPnc&Odr;6?eq;M2Lqu$@#o)/L\o_\X`s8W#orVlg%q>0sbqtg
+0bq>(*eqt^m$kNM7$p&"dhp@nC[qtg*^^A>YA)#O70rVZNfs8Mokq>1$gp%S=\r;69`rVZZk'`7
+h,s8;Q_qZ$Qlq"ad`qtg-`rVZZk,5_<:r;6?dq>1!ds7l0XrVucdr;69^p%\F^q"XUXq"jpfq>:
+!a!;uZi$2j\qp%J:_q>:0jrrN)qr;$?gs8Duq!;kXLq>1?hrr;`aq#:9tp$D)<q=a@Cq@EW*r;-
+0\o^hkRr;QZlq"DGu_"n'.rqmT/q=jRXrr<#ona-,MrquTeq"jscq"XacrBL,TrVcWiqu$3`q>0
+s`q"Odbq=sjbr;6Klr;6BhrVl`io_/1[q=XFWqY'X[r:p<kqt^$`rVuclqYBs`qtp3cs82io&c;
+G#q"XacrVH<cr:9RZrr)]lp]^NkrVlisrVPFIs8;oos8)ck#Q+Gqp@\.RpA4dpr;6?eq>'m`qt^
+*fqu?Nlq#p<]p\OjfrrW/sqmlR=qHj'sr;6<ap$_GDq"a[Unb2eTq"FL_s8;W`p%n[dqWmtWs8)
+?[qtBdZq>'g[pAXm\pA4^aq"jg\p@e7VqXjR\qXsLTqsF1Vp\=ddo)J^cp@S"Mp\apap\4L\r:p
+*oqu$Bhq=jRPq#::"qY0^Zq"*k9m.^MZ"oeAloC22Hq;(oIr#P\2q=s^Yq=F(IqtfsRnG*%`rV6
+'Zr;6<bq"agbq>1-h(&Rk(q=sa]qtp6bo^M;KrV6$Wp\b'*qSE%.qd'-sqY0[TrVH9^q#:<nqu6
+TinEofBq=F(Fq>L3bkk>&Vq!dkLp%J.Tq"OLTrV#dPq"sjYoCDD>n*oo>nbE+\oC2GOlhLDMp&G
+$^q=jRQnF,f5r;-0\p%S=\q>)B4qY^<iq"4.GpAP$iq"=:Kq>^Kop@IqLp%7kHnaQ#Ap\=OZhYR
+9M*W,^.p\+:[p@J1]s8DuTlLt#Clg4->qt^!\q>:-dq?R#ur;6<bp\+Rc$iBVclhpPMnacDOs1\
+?GqYg9nq=aIOrr*c5qXs@FkjeKDnEK6*p@%;6p\ajZp%7hHrq&2Ap%J.Tq"OLTqt'1BpA+FOoCD
+G@nF?)@p%S7Up%A%QnGE%Hm/I%\o(2MHp%7kHrVH6[o_/.[q>)K6qY^<iq"+"HpA"@Qo(DeEp&=
+p]lfmd$lgF?:q>C3bp@n@XqYL*Jq@`c)qt^![p%8:[p@IM+li6eXrqud$rquQbpA"Rbq>1-j$N0
+esq"FF;ip676rr3/jnFH8Hq7QR?qYp@MqYBjVn`K<:rUSXUXLHC6o_A7\s7PdBlh1/Mo)J:@j7)
+p>nFZDJq"XUVo_J%Bm.C)FmJ?YWpEBA/qt9IMq>C!WpAXdEj88lVnFQGQs8W)srVH6ZoCi%Zq>)
+K6qYgEkp[[bJp[dh<me6Y[n^=eD]A`efr;6Bfq>'gYp%J.TqYL*JqB,\6qt^!Zo^hYBlI`\K_<(
+4MhV[Shp\+Xbq"==Tr;ZTh(]XL5qt^![p&G$cleBOmZ/k3@qYg<coY11<q?$]dp&4nmmd'k[@LX
+ar!#5J@3df$?mFV+*s5!2-rU8'-95OY.jS/]Siniqiq<Z]4oP0W*_mIsXCZk6Ys87:eR]WTg\u<
+rGI`M0;q<ISNc;MU"TXhaN\Gtg`s7uNkr$D7:qYBp]nbpW1s8(04<&,F7(]aU:-Cir`s7"hDqX+
++YnEp&JrVmQ1rVZQlr;-<hrquZgq"ad_qu$BfqB,Y8lh(/UoYPoA&-)kX#66ZF])VZdhuE0<r;Q
+Whp\4L[+91a'n,)+gs8T[3@K6EQ3"?gkjlu@'p@\1VrVlclq8W9IqD\HPrVc!4m/O)/3XPie#nR
+mQ""tZ/Gk^V)m.f`Cp[\6e!XU`ldI[.`hu<TQs7l'@s5,R=!!W?%,V[a6nGU0m&HrRX#ndIL!"X
+nNoDej`nqmJY!<s2G!-%?*qWmtRs83E)qYL$_q"saKs88*g.0p"R!"g56(BObKf(8>0p?VPSo^D
+VMrqHotqYL*drVZQir;HQjrqZ3_+8Ps5q<*`:'`\4?&fV8[(B=L]BAELdnF?5LrVH<aq>'k*qt0
+FYs8)cLShpEV#T<[C*WR3]T(`3Qq"adcqZ6Qh`qmOJ#j_Njk5,,!JeJ%_'f$71!"0AM"TSW)!2A
+ZVs5!DEqt.;q!'*5ps8UX;s8;$Rqt]4AqkJ*G!$_h<UAt2cq>%OB.fp.[#8mqBK$jVsnF#<9_h1
+M\&/I*lg&M*Nq"k$g%K$"uq=sabs7sKq*YnbT$kj3p,S0q[('FV#ZKgE@l1b5Oo(r@[rqQKgq>:
+0frqZThq>)3!mJm4b>U'4V2AcDo&-r@T&fNE^oDe=Pq"sp_p\OjaqAT>4lMp5?m9ou1'flX,%3c
+5m!!"U@s8;flq>U-hq8N3HqGHPXo^2\IC]Fns9H!m27=')6!!XGQ!"1BWs8V'Gp$_Co$kWIA2Tu
+.#rqQ'MmIpSQo)JUC:(\'FOm)i#l1"?Fl?s6X!#Yb<Vs*R9k1&nhrr3>M$4?hcqZ#C0k54uNs84
+qTqYL$_q!e=9>8@2P"pbeS*CFON64Enp#65[/s7tsOrq#^ZqYpKmr;-6aq"agbqt^'ar;-9cq=s
+s`q>)35mJlnP/-lO`!"En4-3+AQ*t0;-dHLW)q>:!^p\Y!cq?[,gp#G1n$S4OA!"gLo!!",Z"9:
+L&s8Diip%A%R`VRFI:&j>As5$ZV'IO(b-@Y=]s4mYH?NU91%01P.n+cq_fD<_l!Y>nK6+m6naSG
+l2o\fcLpZ^U4#mD!as8DKfs4./LR03lt"rRs2s7Pp\rsITMlM1D[#:TWPp\t3gqZ$I)qtg0bq"X
+7(IP1[0!<Es[h#@<slc*um#7pk@IK0?6nG)GAs8D`fq>'m`qtp*`rVZHaq>L9erV--a&c_M&oCX
+=.'a1>ts8Uo5)ZUTO!",[_n+cbVqY0d_s7uL5n,E1LrVntu!!!%Ts8TuK!<iQ8%3UT*r;$'Yo_/
++X`qmOJ?iB!]qhPX\)uppPcfb5crT387rj!(87f[`"nb2\Vo'Oa'!!3K0#=.;Kh!b72s5<bBkOS
+Y!'EeZSkhbY!g]%6QYR;`f#9a91qW6`.jlc[%p"TKH*ZQg%kjJ3;g%kLEr&srRqYBp]s+qL+!"]
+,RdII8)jR`EMk+tTP!%j#Xs6oFNmd^8OlKms0p%eL`o_SRbp@J(Xo_%nNp\=R[q>)3$qYgEn3rf
+YJiU$U>etX<1+X6t'?1QkHqYgBhqY^BhqAAc&s6fpe'.=V2JD'eVbP=-u!"BJA6L=FFo`Op_q>8
+2._>6dhlhn.J*[h!g.!stRs76-gs5`%dAcMf5JH,Q;g].<8d0:<c!"oY@FQWVeh<at;q;^f8s)J
+)?!5%Xks8Vclm,bMQ%Kuh7!:p*g&Fo/fq#BXZ!!romqXsmTs8Voks83-!qYL$_pshM+!&=QkMuW
+eLnbrLfo_YUT(^gO^s8VNYrq5pXmdKW6o(2MHp@J.\r:KRSrpfRNp%S:Zr;$12n,MnGktV3bU]:
+5Pk5YH&!!4&=+X@$eo_JOerqlWlq>)*+s7lB]r#Z:H!7glEkM?/f"pkM<!"%iWnauSO_tq4G?iT
+0JNW9&9!rulmmf2VQqsOLWs8%Be,T([jnc/"VnbgE-(B=[\!#GWZr;HQng%F_+s7>c#(B=KWqY9
+jUq#BXWg&M<i&HDk3qsj.RqZ#mMo)J^i*<SIgm/Po>o(i.^r&srRqYBp];uda8$ij>jfBE&0qY9
+m`oDb$e!%ions6]O[r:]aCs8W#lo^M87o(i=`o^VYSmdK`=p\Ogeq>(uis5*&>WcXNeqXsmLir=
+6''`]6s-3*i5q>UBqr;6BeqB#2,jo=?5;#hd`s3U$1p>N@b!!!ZH!oE82oD&4\qo/ERqIfg)qY^
+?in`g(jrr<K>!##@brV-3Ap\Xpcq"XF9]V;RQn,N=Yp&"cm!#,DN'`\@c!+Ps#m/QY:s8VEbC'j
+qB]_VKrp&"OWr2^)(!<NT4mf*+Ss7uKerqH9e":bPgs6f^Zqt^'a5QB[:s7Ps^nGk9D#QOk=p[\
+(Pn*g#GoCN"Q_3LD+li5f9mJ-)KlL<iWn,M4Lg>M8eiS"#+iV*<Gh#HC6p%S;'q=saZp@dYEs8U
+IGhhNre'fZ2(s7Q*_qXa=Ur:p*a+8>I's8VK/Xg#hFgAfn"qpGHH.0]bnc1CJpoD&4[pr<0PqIf
+Qqo_%tNm,\*(T)f0)#RNBTq"4UIr;P[9m.p\]qsj(Ks8Vc[nbE.%!!*0:!tl7J'd/hBoC)_Es8(
+pYBaXnB]D29op&"OWr2^)(!<NT4mf*+Ss7uKerqH9e":bPgs6f^Zqt^'a5QC?Ts7?!^PQ2Bt!"1
+@7rV-6doCD\Oo'ub[r9s:Xs8LpUs46PklJ;L2<r`4*!$)%o^Am]doD&.]mf2JLo(Vu$q=saZp@d
+ACnc.e/s#:_n(B>&mqt'CSqXsR\rV--a!W2]lp_remkh5X`s7H!apkB#0!!!]5nauDBo_JC\pr<
+0PqA9)+qYU0co'PfB-jKnY)?>Tmn*^5Dqu-No9`+MNkMuF9qY'LNp\am8!!!WP!#?OS'`]VnlgX
+r8nb;DMD$g7E\b>plpA=XXr2^)(!<NT4mf*+Ss7uKerqH9e":bPgs6f^Zqt^'arr5+MpAOe;$ig
+P5%".jJq#:6cp%nLUiTg"-rVuZWmIC5VjlQ./Zm?S1"VV:Z!"KbE-]%<mpuDDNqsjFPp\Gp+q"X
+UWpAXO9s8Mio"<AL>!+5H]rpBCSp\Fjgp\FXhq"jm^p%\Od(@^Sgg&Ld77K=A-!#c[7p@IkJq>C
+*a`qmgRrVg=*qY0XFli7+s!#G[Ps6/eKn+6DKp\=FOmdK]5mI9fFr;6<[`rH2T59U:H(]Y?W+h[
+gLhrjn/s)\MJ!k7h!o_84Wp&(lq!W`?0#4DKfo)JO]qYp6cqudK40`US:qYU*aqEOfNs6T[]m/R
+t'$kE?Yp@e+RqXsRZqt0g]n*TiJo\o!5lh^Y7s1qM3#64`K#Qt/D()[Z=I+S5JqtKXYp\4FY*Vo
+L*p\+=\j72j+oVhll!<>R%i:[-7oD/4Zs8VihqB,8%rVl]gp%JFAs7kCLla.]5!%7jLP25m*oCi%
+YqY8),ancqLp\=LUoCDG?ZiC(A!!NngrpK:UnF6>AnbN1_rr5Ibp@e:Vp$qd_"q1KOL+30A!$`9
+[>L*-<n,;YLH3ONS[IX4gq"jdYr2^)(!<NT4mf*+Ss7uKerqH9e":bPgs6f^Zqt^$`54A7>s7+&
+.&HN(a!<)*UlLOZ?p&+^[s8Vf]p](9ko`+4Lp[b.K!#6mo@a3BbV+(Fq!"L0Sp[.MAmf31[p\Gp
++q"XUWp=''9s5^L0!&,!7ZiBIan*0H>q>:3lp\F[cp)Wr*r:]L;ir@R/p"8b%!=];Y"ukK?q=jR
+VqY^3a`qmgR(\mn*qY'RTq>>FR!"o;4,jP=(pAXp]rr)jirV#[Ds7u'FkjJ*<s/H2-!0Z>t#QP2
+3&JY:FjSo#RhsGss#Qh=$qtKm^q"=Qd"p+f,$3oqtqssd_q>1*bqYUI+">KlDq>1!aq>*>Unb<(
+Zm"59<"TU+Ss5F"Anb)MHqtfmPp%@eAo'u#Am.gV2rtYSV!!$*iroa=?__DDs+TMhns6TIQrr)Q
+bq?cumq"OLUp%eY'rW!$>FC"53rs@HVmIg;Lq>^Hgq>)35qt0IPp\"(V]):p:s&'sE(D$R.d+86
+oq"FL[r;-0-qT8R6rVlh,qYC'hs&'L@!!N?\oD8IVpAb!bn*KE3qu?Tgn*TE(l0nEHs0)J+!0-R
+-?j6l:!#tt=IF%B^j7J<2$3IL#qY9m_q"=Qd"p+f,$3oqtqssd_q>1*bqYUI+">KlDq>1!aq>*>
+Uq#(0[q+(Vg#65\Ns5a+Hp\X^ZqY'@Qs8W)oq!mPEiV!62U]:Jt+Z-\.kO[X)k^<g@!!!gOs5<h
+ToDeIWqAoD,q"OLUl-B><*#T.b))]Rsj8\*<o(i.TpAOsaq>)35rqlE\o_\[Us/c7XAlSgG"<S8
+Hs4Hc<qY0d^r;-0-qT8RWpA4^_oCDYRs$Zo0!!`Khq=jaKmJm%Ps82?Wq>L'VnG*"_6MgEKp::5
+.%=$A%cV=Kk!rt.X#E@I;oDb6Z$NdR"qY9m^q"=Qd"p+f,$3oqtqssd_q>1*bqYUI+">KlDq>1!
+aq>*>Mqu-QWs!\*T$O-hgrT<YEs8Vulq=NtCq"XLTr;-!apuLK8!$):E#r:WBg&L0us1JCH!#GV
+Jrm:TCl2UJOqAoD,q"OLUlDQQO!"],7!?<SOq"a+-pA=^XoDAI\q>)3'rVuojn+?VZ_Z/9-)uq>
+n!*@M/li7"`qY9m`r;-0-qT8SHq#16kp[n4XrZ_^d!$),!nc/"Es7Z9cqWmkTs8;0]huE\joAor
+Ks18=5!.3Vko@H))&I&jU!tUn#jPcs9'b@tLq"".UqtC#b!rrN.%h%t.s6opZrVQ?hrTat)!BKT
+HpA+LVq>*>Um/QSRrtPqG!!iQqs75IKs7l9_s8VZMo_ReOir@fds4I@m$5NUA%Rg<ehuE$2mf*_
+-!$)(U_#O&pr;ZEaqEjuOpA"Obs7tDFH?`IH!!!'++L_<js7PaQs7Q6gp[n1VrVcQbo(`7bqY0p
+dq!S1-l2W%/3<3R9mdL,Sq"ssbqYg60qT8SHq>C9kp\"=Ys!%pX!"B,cmf2tPs7PpWjO:uQa7&c
+tnFPDOs7Q?Vs18=6!.NqulhA.+#pfR%(]YbdrS_r$%LTf?r:]sbq=jok#R(>5%067ts7lTbqY0d
+bo(rY""?Z2Sq"jdXq>([&m/QGJr?i*X!"8ids7ZEYrr4M@inh2keEl>tmf2pis68B>!#Hg\&SqC
+Bm/QYRo)C<K!##>?JaiC3p\b'eqEb)XqY0^Vp%J1\e,TBjNYN!:&HFZ6s8Vf[q#C$`s7cKhq"==
+SqY^$\q"Xacr:p<&kT9m,)ZYf;q"aCQqXXUarr3'!rVX\3aSHqTrquQbq"k"G#lkP;"t/p-s82T
+cl1G#-FU8$N&cD\2:XAJ.s$"$s"9=&:q"4U_U)<qV%0m.=0t[@F!!NM9q#C0drV60e[L!6@!t,,
+/kl:\^oCqkPs5j7\#6[0\s8)Zho_J>'s6]jPp%_#c"98r4*<5R/rVPC<s7!d<,m4ha')hkQ;9](
+?495Qb#7d@!rV6Eas6fnl!<EW0$pj4Rs7Q-dq>1'f6MgKNo]Q8Os8V?35QM-1!!%KJlM']@s7H-
+epAFg`q"X[^rV?'Uq#1*apZq\Y)ZpHYN:ZoCoC;PKo_JC`s8W)q`VR^QBD_W)qt^$^q>XOs!YGJ
+6+S=mtqY'sSnbqI;5U6dd%k&+rReQXUpAVZ+"TX;Dr;Q<Ys*>/7!!"\h!(G/-$j$OBqZ$Bdq"aa
+Z\cW9>#7LV4k5YAVp\4:Ws5<nW"TURPs8)]kp\FYMs6p!Xp[r/##lk;5$Mio[s7Ob)s8UZ&9EY=
+q&f(d!PKimq$6'6O!sHF(pAFXPrTF33!!s)?(bGIPs7c<cq>(0cp\Xsi62pfWn+br)jSt\N!"UL
+]0D=]+meQnTq>^-[p\b'krqcBgq=jd_p%.nB4ocWK!9*GFn*0B<q"=:Lo_84Zq=aI#qT8R7rVQQ
+i@/9QnOT6*u&-*X,nbr%Us7GgIp$fqX"9AK*!<CCEnb2t]])r6<L[P04nGCr1UAtK6!!3628Qm#
+7"MFX3p[dtRqX(rr$31JE!<;QeoD&4\p\Y!PrrE<(2spP;r;HEe)ZTC.qYToG!"8i.#Rf;RoC)_
+Ts823]m+5q]qu@i=o'bW>&c`CA!6aTqrpT:RlMlhD$jR+R3WJ+8r;Z<_qB,8"q"t$fqYC0Os8;]
+Ys3MMd!#,e@df9.3q>^*^s7H<c,l.<6r;HBerVQB_nEFTd#9!Thkl:\SnbiF[n+,u=p%S7Up@ZH%
+anc\MqtU!ar;$'XaT*=](]Y2BrUT1Os%r=Hn,N0p!"KAA&I\I8jlc77])r3:L@+s+s6SM?m99Z:
+!!!o@#T*OE"M=O1p%%\Or9D<&%fd(P!8@>HlhL;Ur:U!Yi!T\p54A@>qYgBgqEOuNs8Doi]Dr??
+!"]a2rqu0`nFPu,s8W(d$4[dn/1L2\rVm?;!"&]1_"@'pnb3"Ws*t(U!!E=&ptY<8s6od[rq/\O
+oC;89s5EeRr9="=#o!UE$37p9qXF@]o_8@Vs8)9Om.LDYlM:DPqYf<Z!?r]fV>nm2rqQ0\p@7bM
+p%A%Qq"jmc`qmgR(]XC,q#(*dp$_>`'Eo'K#t4gViW&?Gp\t1dla$Qr!<<6&s8W#ss8KV4"9=,?
+qYBpHs68_H8J)XH"pkbC!!*,0pAXdZp\FgWg'ASs%2Al/s7u$Zo)J^Tp&D0/!Zb#1rUT^\rV?:S
+rpp!^q>'4_&-r7I#!i.cp@R&%o^DhKs2"mI!!!K/mJcbG&-WUh!"Ge)li6STq>^J)"pt>6!.!r!
+p@nFUq>(3hp\".VnN['JoDeCYp&>-q+pJAY^uG7]qZ$3^rpogUnF,o?qu>pZqsOF_[oXOM%?]i4
+s46c6o^D8@p@J"NoCDMIr;Xe5anfZMqtKm`rV?*Ss"+Eg"ptD3s5Di7hZ*H;me#hh"rdOT'EJ1-
+p@[nR])i*8K'<"0gAh*1s7kO_1_B^%!WXAD!4;Csq"js_s7GOh,6/&e!+Q!)nGheRro<JIM\uLH
+>6"WnpA4[^qEP#Lp@@nRru;dg!"8i-n+>oFq>^K[rqt`j!#GV8.feu:qWfO;%0-A<N;r#<o)7tT
+rCdY1!=T!qkl:\Rn+lbT7el`Oq"t*ki9]@ij8\3?.KCh0!!(.9qsjR`o_8=SiTg1;s8;HRoDe^Q
+rr/#a$NL4Z[K#1bpAb0ep\O@6oC2,3m.0rM`qmgRrV^7'q"=:NhnB'j'J]Y&DsmQ'n,NFaqYU3E
+!!!0+#lt#"o(;_W\./KP<WD.Xr;-'RlgF?.5R//,!$24C"1e'unG*%Nh#H:c7K=VB#T`L9j7r0:
+oD8LM:G;hMg[sb.li6\SqHa'jmeZt[e$'!.!!j/:C?>3Bnc/.<p]'s3!!*?<!!)!X`rB<E('O[U
+ERXpes7#=HrtP_N%KI7"nFc)Hrpp$cqt^!Zo^hGDs5X.9hspa<j88!*s/#i9!"o831$8!'jn/TJ
+jmrHIkPs/uo)Ik@r;Z!\m7REk#qu>Rr8@&7mIT]+ltK;hr;#dMrVuf8qT8U5rFGj'q"F@[nCf5m
+!#cUQ$C1Ye`oR'\s8CKU$m5NQ#QXo!oC_qMU&tf6JFr:*p%%\Go'>E;SKS7]!!"/B!kJ""o(`7Z
+qYBNU!#c.D%1K;omf37cpAFou!<<-5h>$^DmJm"XqL&&0p&+jfm+ioe&f:ZT-_'htnF5iBs8D*(
+"VM"E!!W#kn+*^`*s)HC7a_1heE["h`>KgC!!6-fqX="Qrq66fqt^![p%7eSs4R#Ds5!_Tq#BUJ
+l>Qe=!%JF7jo>ATn)j*=pUNs$!,AG3n+lJCpuqFf/H?>%6f@8/rt"l's8V]?9jdPgp[7PJs80h4
+anl&8Ac;Q(q=aLYqtshZ'bgX%!][OGs8UOIpAFj6#QOi+"p"\to_84^ZiC:1L[5!<o^DGNr9rV>
+s,@a'$igq@!4_e$p%eUes6BX\![@[F+UW;>s8Kh%s6d.0()dQdn+ZSVkkb>TqAJr#qtg']r;VWS
+$m,HM!\LA@s6\Y)l0%r^rW!N7!!E8_rTs),('#KX/@b`Wp\t0n^_m%N="'sEs6'FRs7cHhqtg*^
+p@\"@r;XsSh#?O+mJ6\[_BT+#!#Z#pm.1&Oq=+4[\3BsB(D6c(p@S@Rq=jQC'F+UB&3;[(4W5b'
+0/l!I!.4;1o^;5Dr5JNSqZ$Hmr+#X"p\+.?s0$Yk!WW3(%S(-[o_8.2i:4Ah%28jJ!<;idp\Y!%
+#pKe!lg4ZKpA+agq!d8BmX>]I&-W%7\G-$uq>C9bo)J*8"p+lS!"Eb]qu>FNmsY]G&2h?)nEKc1
+o`+a`@JBWqp$V8Bs6Xh,#n-eT!#q$LhtmBOs5L=(&dfEb'`IUbs7MZg!$;1K;Qoutf^>b!#oko=
+DrCKli;`9Fq#('eqYBp\p]'4Fs&TjiGM2Hbs5U\&!!j\\!#s/^h>[*HruBgD'Jg$q!$7c_s8VN_
+s7]n'((_E+&/bHc!"oe>!!qTSo();?pA+O(qT&F[qu$?fq"Og?rq<Q>!%\*i!"Tu.8>jPAX(j$_
+&-)e;!<;fbpA46^rW"u7s8DusqY0[Wr;Z9Bp%3tC!#GhB\G#suq>0XUrq,%H2B2]<$ih)!I_aoX
+',2B'+Ai%:l/hg4oD\R^)uKI)o^h\Ho`*&]!"&]F'EB:<Bt)0UMF^2K'E%o4r;YaUn`r@N!!!*E
+Eod8_s+LFU!!!VIp$2G4s7?*^r;?HhqYL$`rT`q(*rlKF8TCl2BJ0r+#m2CcHM%7#s7uHfq;@)M
+!$!g!!0ZFCroWhPniQmgr;[KL!#H+I#m1PA!!)T\nF6&Ap%J4$qT8SHq>1!dr;6<bs6fp_kGC6>
+'J'4a%h\jZ%0-e:!!P%n"pk;0p[[tNjf'")$n:<!q>'aRlgO]Mn,MnTpN$<H%gfc<rV60`kPtSC
+q>[g!#QY5;*rl9J)$'^?!%)UJrqu-Ps8Vccq"d2Jo_AFcqt9I@Xt:>%!$;s[!!")_#m;7Z!!j)U
+'at$@q<n:_SQ$O;#QOi1-78d$$6fa=M#I),pZ_MOo_J=[8,(j;lq\$&#QOi9(CpTJ*<cEsCZ=pa
+r:g6inGN<P!$EBa#QV6[q#'RUr:`&Q'FYKX"!mpL#ljr,%grjls7GdLp\FLUqo8KSqIfU!qY^9g
+qYBFRs6K^bW&=VU&-2b2)AF+j"W.Xo*rlTU!<;c^nan=<!#ttN)@6-1n*]`=qY]XYrosIABaYdg
+\FKFhp\==Zqsj^Xs/U,Q!!!Q<(_-NV)A!pX]'/hYq"OggpA"I[*;TC)qYpNmq!ISNWEqUc%h8^I
+!rr<5)ZTjU'E\76*qf('mJlV@YYH>O$ig8F/Kc5;!"u:2qtoRRpZ2ABrVQNj8,qEFs+gs]!&b;l
+!"^.N"<TI<a8bVqrp]a`q#CAs/-%4I!!(=Es8;fpp\Hl`#65G<!$VCJ%Mo<O!!!Tckk=K8qu-6^
+rl4fVqIfQtqYU3fqYBpHq#BgFh>bCn!&#c$)ZU!G,pYq$b#o)^!WVl^n+'$V-qG%f(c2*]mIL5U
+rUp3EqZ#dN_C?W?\F91ap\=dOq>^*\s8(,dB.4Al&.T!H&O^m4kl:GQs7>RNp&Fja62UTXq=X@O
+p?VDHs1MrK%1E4H&c`F[!#9YIemT4,2s'8hs5i8?p#hN.*tAnq!!WEl^?5=mf`1OBs4758rqlTl
+r;QXbs5X.Bd?JGU!!")@!>YYV:ThV8q>^3bs7#LOnaGYdJcGdRmeHJEo)/OOnMCgX!$D7A&-2b2
+#lk2>"[Q\pp[IbQs7c6e`qmOJ5PY*Qr;$!QlKRl[E&p-M3,4D`h!FY1s82i^s6'FRs69C[qXNq1
+d/*S6q"agcrqZEgq=3S"dD!iap&=jZlhUAis8(KGB0@q(:kH[Ys8W)skjJ3ErrN#kq>*>Sr;6<a
+p%7kJlg"<Gqp_if:bNn:99@BXg>;K%p"ILes8Mojo^_PGs8CH7E,0X=eDp#ho'u8Mq==+Nqtg$^
+q?$0To`"k>k0IsJ4"s!:QaHJ[p\=OZqYL*dqYBjVnF$,LrVH6[p%\.QrVuljmH=<=&,Q+qna5T'
+jS&9=o_%qQq8W9IqD%dAr;?B`n*Js,qr?K&s8:mEr;ZKVjQ$%2me5u@o_R_Aq=="FnEKW=o^qkP
+qYU-err3?$oC)5?o(;\QrVlWh!;?Bk')qq2rVuohj4rY\mIBrLs8Mojq>*>Sr;6<ap@\(Qo'Q#D
+qXNb<o)A[hq<m\Nn`fWAq=F+8jQGn"p%eIQr;ZfkoD\dUo)&Icq"=:Vq"==TqYL!_qChmEnaZ>I
+o'HDVo^;8Hs8Vfep\=R[qYL*dqYBmWnF$#Gqt]pWpA"CWqYL$]o'cDJs83)tq=jRSoC`+T"82Eb
+qo8KKq@rc%qtp3^na>uIs8Vuoq=O:Oq"t'irt"hmo]bu6p@R_Co^;,>qu$H_#P%EYq"jXUq#:*r
+q=t!hp$_>>q#1$b(ZX`Hmd'-&m.U2Jp%A1]s7H$[qYU0dq>'mer!WDuq"OLTo_%qLo(N(_'(k>I
+k3)+%s7GXEnacJTrVc`prVlodm/?5^l0.p?s8Mfan*fi?q>0p^qY^0c(B=C,n*flErp9">nac,/
+h=p[=q"ad_rVI<*p[n%Go(DePp%7tRq=s[Vp%J.Tq=jp]s7Hcnp\4IToCMVJq>C32qS2n,q]kq1
+oC;PAlL+*)kj8?EnaQ5Hp[n4Hr8[_;qXXIZqXj:Kq"t'[$1[W\q>9s]p%.bRnH\RRoC_eKo'uPP
+rr3W-q>C9mhW42(s8W&lqtg-aq"a[\s83K+qYBp\pZqJMrV6!Wq=F1Mr;HX.mHa67p$V;Bs8Mlg
+o'Yi.s8W)rrt"\np\"(FnFPu<r;QNdqYp<e-h@'3rV6'[qt^!\q>UEnqtTs^q>1!cr;-<fqY9dU
+o'l8Ep@S"Oqu6<hpB(0eqt^!loCV\JpA"FYrq$?dp\Ojg`qmOJrqcutq=jRSrUB4Mr;Ri;p@\7V
+n`fl<s60LJrUg$drr)W`o_A+Po_%tSr;HWp%/]kqq"aFOqZ$Tpq=aX\')1n[kjJ->qZ$Tjp%J+O
+nG`C_rqHNjqt^*gr;ZZoqZ$?tnFZPTrV?$Og?nn>.e`AumdU&Ps7Q$\o()DEp@n@WmHs?2o(;VJ
+pA+U^p\4Ralh(,Sq=jabq>)`/p&G'hp%A+[r:KLKoCV\Mq>'maqu$BgqYU0cp\"1Ko_8+Qp%\FS
+o_A@_r;-3`r;Zcq#PRi`pA"L_rl4fNq@if(qYBs^p\4^drVuokmHX3/nFuq^s8!<#rUg*]r:fsZ
+r;Zfkp\k!crqQ]orVlisrquirrr33%qt^$_qu$9dr;R#smcX?:oC_tZrs/Q%qtg-bqu$9dq>2*1
+q=F7Us8Moos8VWMlhpe\p\+IZo_AIarVlTl'DqOtp\XphrV?3`r:9OVqYBp_r;$1BpA+U\oCMeX
+s8Mrps8W#lq>0sbr;?NlqYL*dqYBmYp%\C[p\+F\o(DkXs8Dfgq>('j"9/8sqYg3nq"ORZqu"J1
+_>4<4qtg-`rqQW^pAY'k1&^nIs8MrloBbW6r:U*_rq?0_p%eXep@nUerVZNfqYL*^p@n@YqYU0h
+qtKaSp%\F[q>p0^r;R-'o_JLdr:K@>qtp9gq>1*fr;7i?rV-![rVuo\p](3fr;6-dp@7eJnau_P
+p@RtHn*]T,l0S!:rr3N%q>C0cp%J.Wq"==TqYL!_q@!?&qtKdXr;Z?ZpA=jhrqcZl'E%h-rqcKg
+r;6?cp\OgerV?3`r;HHkqZ$HgqZ$?jp]'seo`G*iqYp6iq8N3HqD%sHqYBp^qYTg]rpfFOrV6*]
+qu$Ekrr;Wjmf2\SnG3+[q>U6[o`+sjr;$-^q"X[]rqlrrq"OFTqu6Trrr)Zh#5e>pp$_AArqZop
+o'Z&Fs7lHgrr)rsr;$3hqu6Nmr>>G2s8Mlfo^r1`r:0FZs7u]hp](9jo^i"[rVc^)s8McfrVlQ[
+nb<"^s8N#t#5Ri\p\Xg\q>(-jrr)j8qtU3iq=sd^q"=L[qu$Bjrr2`iqu$Bgq=spfrsS\uq>C9k
+q"44Rr;ZThrqd-%rVc`ps8Mrlq"OOX`qk8_JbkE'JbjroNr">'JbkE'JbjroNr">'JbkE'J,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/doc/logo-32.jpg b/doc/logo-32.jpg
new file mode 100644 (file)
index 0000000..505f5df
Binary files /dev/null and b/doc/logo-32.jpg differ
diff --git a/doc/logo-34.eps b/doc/logo-34.eps
new file mode 100644 (file)
index 0000000..c33ab1a
--- /dev/null
@@ -0,0 +1,1200 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.12 by Peter Kirchgessner
+%%Title: /home/bump/freedom/gnugo-3.3.22/doc/logo-34-comp.ps
+%%CreationDate: Tue Jul  1 12:47:03 2003
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 386 340
+%%EndComments
+%%BeginPreview: 256 224 1 224
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000c00000000000000000000000000000000000000000000
+% 00000000000000000003e0000000000000000000000000000000000000000000
+% 00000000000000000003e0000000000000000000000000000000000000000000
+% 00000000000000000001fc000000000000000000000000000000000000000000
+% 00000000000000000000fe000000000000000000000000000000000000000000
+% 000000000000000000007e000000000000000000000000000000000000000000
+% 000000000000000000007c000000000000000000000000000000000000000000
+% 800000000000000000003c000000000000000000000000000000000000000000
+% 0000000000000000000078000000000000000000000000000000000000000000
+% 8000000000000000000078000000000000000000000000000000000000000000
+% 00000000000000000001e0000000000000000000000000000000000000000000
+% 80000000000000000003c0000000000000000000000000000000000000000000
+% 8000000000000400000f00000000000000000000000000000000000000000000
+% 0000000000000c0000fe00000000000000000000000000000000000000000000
+% 80000000000603000ff034000000000000000000000000000000000000000000
+% 000000000006030007f0fe000000000000000000000000000000000000000000
+% 00000000000603001ff5fc000000000000000000000000000000000000000000
+% 80000000000e05800ffff8000000000000000000000000000000000000000000
+% 80000000000e0981fffff9000000000000000000000000000000000000000000
+% 00000000000e0d87ffffe0000000000000000000000000000000000000000000
+% 80000000000e4d9fffff80000000000000000000000000000000000000000000
+% 00000000000f68fffffe00000000000000000000000000000000000000000000
+% 80000000000ff2fffffd00000000000000000000000000000000000000000000
+% 00000000380ffffffffd80000000000000000000000000000000000000000000
+% 80000000160fffbffffc80000000000000000000000000000000000000000000
+% 8000000073e5fe3ffffc40000000000000000000000000000000000000000000
+% 0000000079e7ee3ffffcc0000000000000000000000000000000000000000000
+% 000000023c380e3ffffe40000000000000000000000000000000000000000000
+% 80000001c7e101ffffffe0000000000000000000000000000000000000000000
+% 8000000062f843ffffffd8000000000000000000000000000000000000000000
+% 00000000383f0fffffffd8000000000000000000000000000000000000000000
+% 8000003c1c019ffe0fffd8000000000000000000000000000000000000000000
+% 00000000e0c07fb803ffe0000000000000000000000000000000000000000000
+% 80000001c0c07fb803ffe0000000000000000000000000000000000000000000
+% 00000000170bfcf807ffe4000000000000000000000000000000000000000000
+% 80000007f05003fc07fffc000000000000000000000000000000000000000000
+% 8000001afffbfffc07fffa000000000000000000000000000000000000000000
+% 0000001f007ffffe00fffe000000000000000000000000000000000000000000
+% 0000001fe0fffffe00fffe000000000000000000000000000000000000000000
+% 8000000013ffffff00ffff000000000000000000000000097fde000000000000
+% 8000000003ffffff007fff00000000000000000000000010ffde000000000000
+% 00000001f3ffffff803fffc00000000000000000000007fffe7fc00000000000
+% 8000001f07ffffff803fffc00000000000000000000007fffcefc00000000000
+% 000000300fffffffc01fffe00000000000000000000001fffa7ff00000000000
+% 800000401fffffffe01ffff000000000000000000000027ffffff00000000000
+% 000000071ffffffff80fffc000000000000000000000002ffffffc0000000000
+% 800000183ffffffffc0fffb0000000000000000000000003fffffd0000000000
+% 800000183ffffffffc4fffb0000000000000000000000002fffffd0000000000
+% 00000107bfffffffff03ffd0000000000000000000000000ffffff0000000000
+% 0000001c3fffffffffc3fff8000000000000000000000000ffffff8000000000
+% 800000f0ffffffffffe31ff80000000000000000000000007fffffc000000000
+% 80000180ffffffffffdc07fc0000000000000000000000003fffffc000000000
+% 00000007ffffffffffc307fc0000000000000000000000001ffffff000000000
+% 8000001fffffffffffc157fc0000000000000000000000000ffffff000000000
+% 0000003fffffffffffc0bffc0000000000000000000000000ffffff800000000
+% 8000003fffffffffffc07ffc00000000000000000000000007fffff800000000
+% 000000ffffffffffffc03ffe00000000000000000000000007fffffe00000000
+% 800000ffffffffffffc23ffe00000000000000000000000007fffffe00000000
+% 800000ffffffffffffc03ff600000000000000000000000007fffffe00000000
+% 000001ffffffffffff801fc400000000000000000000000007ffffff00000000
+% 000001ffffffffffff8007c000000000000000000000000007ffffff80000000
+% 800001ffffffffffff80038000000000000000000000000007ffffffc0000000
+% 800001ffffffffffff00030000000000000000000000000007ffffffc0000000
+% 000001ffffffffffff8002000000000000000000000000000effffffe0000000
+% 800001ffffffffffff0000000000000000000000000000000efffffff0000000
+% 000003ffffffffffff80000000000000000000000000000008fffffff0000000
+% 800005ffffffffffff80000000000000000000000000000008fffffff4000000
+% 000007ffffffffffff80000000000000000000000000000008fffffffc000000
+% 800007ffffffffffff80000000000000000000000000000008fffffffc000000
+% 800007ffffffffffff80000000000000000000000000000000fffffffc000000
+% 000007ffffffffffff80000000000000000000000000000000ffffffff000000
+% 000007ffffffffffffc0000000000000000000000000000010fffffffe000000
+% 800007fffffffffffff800000000000000000000000000001fffffffff800000
+% 800007fffffffffffffc00000000000000000000000000001fffffffff800000
+% 000007ffffffffffffff0000000000000000000000000000ffffffffffc00000
+% 800007ffffffffffffffc000000000000000000000000003ffffffffffc00000
+% 00000ffffffffffffffff80000000000000000000000001fffffffffffe00000
+% 80000ffffffffffffffff80000000000000000000000007fffffffffffe00000
+% 00000ffffffffffffffff80000000000000000000000007fffffffffffe00000
+% 80000ffffffffffffffffe000000000000000000000001fffffffffffff00000
+% 80000fffffffffffffffff000000000000000000000003fffffffffffff80000
+% 00001fffffffffffffffffc00000000000000000000007fffffffffffff80000
+% 00000ffffffffffffffffff0001fffffffffffffff000ffffffffffffff80000
+% 80001ffffffffffffff7fffe001000000000000001001ffffffffffffffe0000
+% 80001ffffffffffffff1ffff000000000000002001001ffffffffffffffe0000
+% 00001ffffffffffffff07fffc0000000000000d800807ffff1fffffffffe0000
+% 80003ffffffffffffff03fffe0000000000000cc0080ffff81ffffffffff0000
+% 00003ffffffffffffff400fff0200fe0000000000080fffc81ffffffffff0000
+% 80003ffffffffffffff0017ff8200fe0000000000080fffc81ffffffffff0000
+% 00003ffffffffffffff4000ff8200fe00000007000c1fff081ffffffffff8000
+% 80007fffffffffffbff00000fe20000000007ec80043ffc081ffffffffff8000
+% 80007fffffffffffbff00000fe60000000007ef80043ff8080ffffffffff8000
+% 00007fffffffffffbff000007f40000000003c00a067ff0080ffffffffff8000
+% 0000ffffffffffff9ff800003fc0000000000003f027fe0080ffffffffff8000
+% 8000ffffffffffff83fc00001fe00000000000fdf02ff80040ffffffffffc000
+% 8000ffffffffffff81fc00001fe00000000000fdf02ff000407fffffffffc000
+% 0003ffffffffffff00fc000007fc0000000000a0002fe000407fffffffffc000
+% 8003ffffffffffff00fc000007fc000000000000001f4000603fffffffffc000
+% 0003ffffffffffff00fc000007fe00000000000000150000603fffffffffe000
+% 8007fffffffffffe00fe000003fe00000000000000100000603fffffffffe000
+% 0007fffffffffffe007e000001ff80000000000000100000601fffffffffe000
+% 800ffffffffffffc007f000001ffc0000000000000000000f01fffffffffe000
+% 800ffffffffffffc007f000001ffc0000000000000100000f01ffffffffff000
+% 001ffffffffffff8007f0000010040000000000000000000f01ffffffffff000
+% 001ffffffffffff8007f0000010000000000000000000000f81ffffffffff000
+% 801fffffffffffe8007f800000000f000000000000080000fe0ffffffffff000
+% 803fffffffffffe0003f0000000035800000000000080000fe0ffffffffff800
+% 003fffffffffffc0003f800002003b800000000000080000fe0ffffffffff800
+% 803fffffffffff80001f800002000a000000000000080000ff07fffffffff800
+% 003fffffffffff80001f8000020004000000000000080000fe07fffffffff800
+% 803ffffffffffe000003c0000200000000000000000400007187fffffffff800
+% 003ffffffffffc000003e0000200000000000001f80400000183fffffffff800
+% 803ffffffffffc000003e0000600000000000001f804000001c3fffffffff800
+% 803ffffffffff4000003e0000400000000000001f804000000e3fffffffff800
+% 003fffffffffe0000003f0000400007e00000000000200000061fffffffff800
+% 003fffffffffc0000001f8000400007e00000000000200000021fffffffff800
+% 803fffffffff00000001f8000c03407e0000003e000200000031fffffffff800
+% 803ffffffffe00000001f80008054000000000c1000200000018fffffffff800
+% 00fffffffffe00000000fc00081c30000007f03e00010000001cfffffffff800
+% 80fffffffffe00000000fc00080830000003e03e00010000001cfffffffff800
+% 01fffffffffe00000000fe001804d0000003e00000010000001efffffffff800
+% 81ffffffffff00000000fe0010000000000000000001000000067ffffffff800
+% 81ffffffffff800000007f001000000000000000000000000007fffffffff800
+% 01ffffffffff800000007f001000000000000000000000000003fffffffff800
+% 81ffffffffffc00000007c003000000000000000000000000001fffffffff800
+% 01fffffffffff000000007e02ab6b6daab6b55b6aaaf80000bc0fffffffff000
+% 81ffffffffffe000000007f03555555555555aaab55540000ba2fffffffff000
+% 00fffffffffff40000003fe03fffffffffffffffffff0003f6103ffffffff000
+% 807ffffffffffc000000ffd01fffffffffffffffffff00040b1e3fffffffe000
+% 003ffffffffffe000003ffc03fffffffffffffffffff00030ea1bfffffffe000
+% 001fffffffffff00000fffc03fffffffffffffffffff0003f181bfffffffe000
+% 800fffffffffffc0007fffc03fffffffffffffffffff000011b87fffffffc000
+% 8007ffffffffffffffffff803fffffffffffffffffff00008881ffffffffc000
+% 0007ffffffffffffffffff003fffffffffffffffffff00008a83ffffffff8000
+% 8003cffffffffffffffffe001fffffffffffffffffff00004692ffffffff8000
+% 0003c7ffffffffffffe038003fffffffffffffffffff000066267fffffff8000
+% 8003c1ffffffffffff0000003fffffffffffffffffff000020247fffffff0000
+% 0003807ffffffffffc0000001fffffffffffffffffff00002100ffffffff8000
+% 80070000fff83fffc00000003fffffffffffffffffff00001139ffffffffc000
+% 0007000000000fff800000003fffffffffffffffffff0000162707f57ffff000
+% 8007000000000fff800000001fffffffffffffffffff0000162e07dabfffe000
+% 000f0000000023f8000000003fffffffffffffffffff000030c000000ffff800
+% 000f000000000000000000001fffffffffffffffffff0000618000000ffffe00
+% 801f800000000000000000003fffffffffffffffffff00007f0000000fffff00
+% 801f80003c000000000000001fffffffffffffffffff0000000000000fffff00
+% 001ff03ff0000000000000003fffffffffffffffffff0000000000001fff8fc0
+% 803fffffe0000000000000003fffffffffffffffffff0000000000001fff80c0
+% 001fffffc2000000000000001fffffffffffffffffff0000000000000fffc040
+% 801fffffc000000000fff8003fffffffffffffffffff0000000000001fff8000
+% 001fffffc0000000070007c03fffffffffffffffffff00000000000007ffc000
+% 801fffff800000001c0000a03fffffffffffffffffff0017ffe00000007f8000
+% 000ffffe00000000300000300000000000000000000000780038000000000000
+% 8007fff800000000e000003401fffffe000003fffff001800003800000000000
+% 0007fff000000001f000003c01fffffe000003fffff802000000800000000000
+% 8003ffe000000003fe0001fe01fffffe000007fffff80e80000bc00000000000
+% 0000ffc000000007fff4bfff01fffffe000003fffff01f800003c00000000000
+% 8000000000000007ffffffff00fffff8000001fffff03fffdbfff00000000000
+% 8000000000000007ffffffff807ffff8000001fffff01fff55fff80000000000
+% 0000000000000007ffffffff800fffc00000003fff00fffffffff80000000000
+% 800000000000001fffffffff80017a0000000003f000fffffffffc0000000000
+% 0000000000000017ffffffff80000000000000000000fffffffffc0000000000
+% 8000000000000007ffffffff80000000000000000000fffffffffc0000000000
+% 0000000000000007ffffffff80000000000000000000fffffffffc0000000000
+% 8000000000000007ffffffff00000000000000000000fffffffffc0000000000
+% 0000000000000007ffffffff00000000000000000000fffffffffc0000000000
+% 8000000000000003ffffffff000000000000000000007ffffffff80000000000
+% 0000000000000001fffffffe000000000000000000001ffffffff00000000000
+% 8000000000000000fffffff8000000000000000000001ffffffff00000000000
+% 00000000000000007ffffff0000000000000000000001fffffffc00000000000
+% 80000000000000000fffff800000000000000000000003ffffff800000000000
+% 000000000000000000fffc000000000000000000000001fffffe000000000000
+% 800000000000000001fffc000000000000000000000001fffffe000000000000
+% 00000000000000000000000000000000000000000000000fffc0000000000000
+% 8000000000000000000000000000000000000000000000005400000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 000000000001f0c000000000000000007c200000000000000000000000000000
+% 000000000007acc1fc0fe3fe1fc00001d6200000000000000000000000000000
+% 80000000000604c0bc0fc17417800003836000000001f8000018000000000000
+% 80000000001c03c01e0100300200000600e00000000206000018000000000000
+% 00000000001801c00e0180300200000e00e00000000406000018000000000000
+% 80000000003000c0070100700200001800600000000d06000018000000000000
+% 00000000007000c0030180300200001800600000000407000018000000000000
+% 80000000007000c003c100300200003800200000000c86000018000000000000
+% 00000000006000c001c180300200003800200000000406000018000000000000
+% 8000000000e0000000c100300200007800001ce0000006000018000000000000
+% 8000000000e0000000e18030020000780000182000000c000018000000000000
+% 000000000060000020f100300200007800003030000058000010000000000000
+% 0000000000e00000003100300200007800007030000018000030000000000000
+% 8000000000e0000000398030020000380000603800000c000020000000000000
+% 80000000006007c0001d00300200003803f06038000006000064000000000000
+% 00000000007001c0001d80300200003800e06038000006000067000000000000
+% 80000000007001c0200f00300200001800e07038000e07000046000000000000
+% 00000000007001c0000f80300600001800e06038000e07000087000000000000
+% 80000000001801c0000700380400000e00e03030000c06030186000000000000
+% 00000000001c03c0200380380400000600e03030000c06030107000000000000
+% 80000000000606c0fc03800c1800000383601c6000000c0307be000000000000
+% 800000000007ecc1fc01000770000001fe000fc000031803040fc00000000000
+% 000000000001f80000000003c00000007c0002000001f0000007400000000000
+% 0000000000000000000000000000000000000000000000000007000000000000
+% 8000000000000000000000000000000000000000000000000006000000000000
+% 8000000000000000000000000000000000000000000000000007000000000000
+% 0000000000000000000000000000000000000000000000000006000000000000
+% 8000000000000000000000000000000000000000000000000006000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+% 8000000000000000000000000000000000000000000000000000000000000000
+% 0000000000000000000000000000000000000000000000000000000000000000
+%%EndPreview
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228 14.173228 translate
+% Translate to begin of first scanline
+0.000000 325.000000 translate
+371.000000 -325.000000 scale
+% Image geometry
+371 325 8
+% Transformation matrix
+[ 371 0 0 325 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData:        71613 ASCII Bytes
+image
+R.q`up[IG3nG)_Lo_%Y8m.p&Bo]u#Gqs3nIp\=RZp\076QM?mC)XI"mrqZ-Plg4$*m.^MIf'`5*
+o'uGHnalGIrqQNfJbYQ+RJ6mQo(MnYp_<PcpAa^9d,k;sn+-5Elg466oC_kWp]1&>pm1]Cp`KP2
+m,[3jn+?"obj##mioTdpkOnQ5jmDR.o_/%Sq"K@7QM?mC*9c\Vq#C?dm/?kWo'l8Dp@[J(o)%q>
+kjIs2p%O%4PPCR@*;TL/m`:,E#VD\FptO`qn*T2snbW"JlKms/o_*k2PPCR@*Tuhbs7O^+E?,Sl
+$93X]q:Ofsn*fi<n*BB1oChp0pltQAp`98&lgOWDm,)b$!$`rr(L+i<p?^f'naYo2n+68IJbYK)
+RJ7lsnau\Pn+$:#56q>l%2^M)dHC;ikPXc=q#'pWmdp7*pm1]Cp`K2"o_\CMme5OU*uG%b!'CW8
+EkD5Cp!)suqt]jQo_F(5QM?mC+8,3tqtKF@nG:Og/e'cP%fcSXC=rC]g$A5(q=aISq18=,pmLn!
+p%%hSp?C])m/OC5%2(&h/JnI$DVsgFl0n?Aq"OOYJbYQ+RJ7cpo(N"Tl/h6_oDe4R)^,1d*rl:(
+m-4B4n+6;KrqV-?QM?mC+8,3tqtKF@nG2"shY[?^-3,D,%8$6Or:'4GoCi"VqLSF-pmLn!p%%bP
+p[.DBoBZ2/qdg9M%29f_A_5,hp[dkBoCr+XJbYQ+RJ7lsnau\Pn+$;Oht5F`[f?dN!%\;Uk2cL<
+p$V5;pA4Z;pm1]sq#:*gq#C*gq#:$epcn!9r:TXUp[IeJq>0p_qYU'^p\F^_p[dhJq=*hGp[RtT
+p[.AAp[7/>q#@1\!Y,_@(j"$qnE/TinFubSqYYp>QMAJpr:g6e&bu+no^qbHq"aXVp\=ITp\FXa
+pb;O=p\4L\qY9aSqYTmTq>'[XqtT^Pp@%"hpYPT@0I-W&!'$hDp$D>8n+HJMp@e63pm1]sq#:!`
+p]($gp]'pmr:TXSq=jX[q#0sep+Z18p\4IZqt^!\qtp-^qtp-[p\4CXr:K46s3J7J!%nc^$X1dR
+khl.,p\O[Wo()F(pm1]sq"aXep%J1Wqu6LXqX<hHr:fm]qY0XSp%@tJq=aLTq"jj_qYBp\q>C*`
+qYBdMjknY7q=_d>G9$Z9;.Q?`r8QDrp\=RXo'l5CJbYQ+aS>`.rq8kWq>0s`q"=:NmdTuJp\+IZ
+o^MAAp@RqMo^_SGq"aa^p%%eOq=aILnb)\OpA"RY\T%WM0F<QbiUZj=mcW[#o(DYGo(Dg0pm1]r
+pau76p%7kHo(r4Yp[dh;k3_g5m-=*6p\41Bm.0oEoCVS@md]uFq>'LFo(VhIrpUs%rVGj;gkJB5
+!$k^%lh:>Pjl>n&kiqL*o^qhOqgnO.prW;,p@\(KnF#Z0nac;Cna5W)kkXi"aklOUo^(]'o(i+S
+na>]-mIKuGq<R24p[[_>rUTCDf;!+R"T]3?JA:.:h;I2FiTp"#kjJ-=q"OR[JbYQ+anS[(oC;;9
+lKIElkNqa2p@\+?qsM2#c04B^l/UpsqYKsUm-!Qtnb)YPl/_=-na,Ytf&?K#a+@8,)_bl!r:]jL
+k3`$AmHO'(nG)qYq"ON6pm1^5p]1'fpAamep]1'fpAakNq"aXXq=jIPq=a[_l.GA!kP*QYpA)#a
+ce..%?=Q";jQY.Vq<7;Bm-!a)m,d9kmd'<@mb%F$KhqmQ,ZYWY!#7A`p$]T5qtfdQdG"<_m-*p3
+qYBm[JbYN*iV<?Fs7cTir:g6ds7o^hp\FRSo_J.Oqt97Kror78P4%b`s6].Kbam,^>P.dajSnQ7
+mc*j3q=sUQp%\OXnBdG?9+h:+&./C=3aAoSrnH!!s5D5\qt/qCk4A!2p\FUXp\BC8QMBG6rqHHf
+rqZQfs7lQg<qc:`p[[tPp$__Uo_8.CT2[c;io^4*fCACaeI4B\li5#snb2VBq=s^Xo^VA9jP-Y?
+-Op1X!YHLl'Sto<na>Gur;3g+Ee]^WVX)t(o_81Vp%8"SJbYQ+iV3KJp\=[^!quB`qtW2Ep\FRS
+o_J7LpA+"<n)n7%!VtaIm,.:+o]=r(9d80dZ/b9Jq"in)i9Bn2qtTp\P8"!-%LE79!#hU&d.H8@
+W`]K*)$_&^()`sYhtd-Fq"41OqLSF-pu2!\p@n@Xq=s^Yp@n@Xq=s^Yq=aRYp[[tPp$_SDhW4:s
+6k04qo)J4EcM?o#i4f8,h#GOYnFH#>rV#aOp\FFJle,kM"<@gL$P41%%@?YTl0Hup:DF<[!#P\9
+"/jH?q>0s_o^heQJbYQ+iV7'Zp\=RZp@RtMp\=RZp@RtPp@nCWo(;bJnb2;,nG)#`"p`uaqtBLV
+b-(3iq?./Eh=0n0oBl/9jP8PMk2bLgU+cQZ%KHn>!!Wl48t)pZQ7N+F%g2kP)%AQJqt9OPp\FUW
+o_804pm1^6p]1'fp]U?`nF$&MpfmLbnF$,Gp\FRSo_J"Kp$(Z:k,JC]#+>8Ho]YAonGf??Fp2l8
+pu_SMo_SCRl0.U1r;GK21_g]+!"pmr$31&1+<!9K!#Qjb!Z)(A*dc-1f?`jTp\FUXp\BC8QMBG6
+!;HKf"SVESm.^MS>5%OTm.pALq=jIPq==7Ok3MrfC^(+H?0BK-m.g+"HbT9]"sY\df(\e,psm'D
+Ce#oe"tgf!!!!3.!Wi?7!#P\C!Z;[Z!<WiL)?pq2k53B:q<7;@qYBm[JbYN*iV<BG?2!p]nG)SB
+o(r@_p\""QhtH=5o'lAEp]'dH1B8X"7dARRU"K"P,ROFg*!cr(k26*jTK*J^#Qau,!!irC&.JmJ
+!<<-#!!*9-!@e(*%1=-U:U\sOqsEM,kP+`Mp&Oi<pltR1pgX!joC25Gp$hPHq=a@Cimc`Gr:B(=
+o'Gi>lJX<"%KJZirgTh^f>9fd`7>_,&`MXCkj4ci#QP58!!<3$!sSu7"9JT(!<<*#"pbG6(E3>S%
+nT0sb22@Np\apZoCVbNpOW+(pu2#JqEk#Qp%%S=qtBRMo^qY=o`+.Mh#?g=n+#Z.o&JCJ&J"mGY
+2C9Y]DM=R*1Hn-&ce!Vd99$g)?9dJ"TS],!!!$$!WE*!!WN-9!<ri:%Mq-%@Um4'qY'@?lgX,lm
+-aH;rqHKfJbYQ+iV<HL6M^ELo'bu=o'c)>oC)"plgOl?o@hX_o^;2?i6Dr8)&E9mo2J.ec.>L4.
+)tul!?fL,,mbh+!!Ec6!!WK*!sA`.rW"#B!<<*&"pG)2)7f&*m,7p>oBGE,qtKC>lgXTBq=s]8p
+m1^3pgj-loC259m-O33oC;;ImHW<op&FaUp%%hPhST?o&etm6]9Hk,_Z+bW4kfU%?lr\T"U4r5!
+!Wl4!!WH*"9o&5!WW3'!<<0*"p"].B].dopY+$TkND'uqYB^GlgXTBq=s]8pm1^6pg`shp@n:Ro
+^h;2lgOE9o'kAkq:+EJm-F-4nb2h9^]52Q!"JuQ7j\<cS$K0sFFO9#!!ii4//nip"pt>1#QOi*!
+sA],!!!-&!!<B.!s041H`<R]p[dkKqXj7El/D!so(E"W!;D'>QMBG6"7YjPpAO_:lg4'/naPu5e
+)BunrqZ3Lo(28>q;]U((B=pV"TT\g)E3J0GVs@a(C:Kn0E(qU#64o5!!E].!!!&u!$)+A!<N9($
+l:J%8Yi<Mli5i+nauVVrqQ'Uo_/%RJbYK)iV5Y)n+-/Hq>0sVnac8?mHWp7PmIdld-^>sp$;)Bl
+.-^U$nVGp#m:P;)B9PD!!s&H-Og^i+T_`L!!EN,#7^b5!WE'<!<N6%!WW3%'e,UO?T^@H_tWHan
+*foFp$2;Grq6?dJbYK)l1k;SrqJVOqYTaRqYU*`qY^<_o\Sm5g>_;g>A7=EBSN5Fg%j>$i[t9G!
+=ftJ!t,;>!!rWQ(EjV0D]o?!$j6S3o)K@'!!!$"!!3AImIUAcqUj`to)8+Ynq$Rrq!%PRq>C$fq
+)eBIq=O+?lKbb<s4H&cqK.)(jo;qQ+Y3scIG+/Tq2@WT%KHhU!u).N/-?.q"4d2'g*-Ls!X\u1!
+<Min(BFL9!<<*$##5'>+=il7s7l?\mcilrk^iMhpuD/LpH/3Gp$h;2kir#j^t\e%r_!=n+Y/QP]
+OG%Y!$G0CkPplUK16Ci!$NCa.1HmG&H0rEs$mP!$6]HP!<Mrqr;lou'EJ16!X8q`c`Dn&p!r!]l
+gjcFqYGd<Nqhl662('Jq=s^WoC)2=o()DEp!NF3ip5@e/3kRU/ogg=M,G#f/QuT!ht_Le$NM=Z$
+m]g7&dJ@9[/'7MD@[Ea!!*,o!;uru!#,G6!!3?)aifjo*guornacJQq!@!kpl>.6pd"NGq"a^Xo
+'l&7nFH2BnaH+o]tW\0kKjY<,UNKm:pSm3V/6A9,>uY(kl:8=oB#N&Z=#\/6N,Wggqj$p#nm@=!
+<3*"!ri<"!<*$!!#,G6!!3?K/cNKR/;hpPn)s!-q"!^$pl>.6pd"KFq>0mYnEfl?nEoQ(iS<Vra
+>Z</cb8mk"98l3!Wi?YB$g,KU0.I#*.H6&s6&J<p%Qe3GCKPdp[T%!!"T,0!X8`0"U5&1!W<#u!
+WN-6!<<*$"p$u+rPmt"P4S,+kj7s=s+0s*q!%Q;oC_qUq"4">r:TI@k2kU\e`c_38cU,!M:qgEF
+#"1;*>]1j"=e]Ws5U4t>B-S@jT!*fiVC!'LK>-%!#6+F!=/`/"U55="U"o)!#GY9!!*'"!X:Ua2
+)AfJ=$4IZq"j7/guX+^Nqhl69(MZNqY9[Lkkjr8jlu7+pA2PIs6a3R-PeglTBGg-G]48q"Z$,Y2
+JA05i9]'GZ_"M\rp2fZ"p-_7!\XZV"98E&!X&]5#mLP8qu@N6!!!$"!!3?+.2`*d!-2C%HHu9Uj
+mE%upl>.6peL/Eq"sjSiS!GfqsN+dk5=5jrp&IFK-V*XTCU+s_Ndkk"98`M!$<lLbh)FYTjFA`a
+5-;l"<e3Z!#>\;,6J)V%M&Rc!%%gT'.*\g$N:&)!>P\?#7ge8#7hJ>R!h!bkK`tmi:m$Brq_3@k
+P,Saq"OFOnF#`:p%A%Rq>'m$q!%QLmdg/Mq!dG'n`Jcop\3dse'6\Js8CcdJh$g&/'[eZmd];VL
+LW%I!#>Q$E4FNuiV8*P"ooA<'`\[k&27&`&-;n8(GPq"$NgG?-O0V`rW2uu(BFU<$46b>4jCeG!
+<;cZhsgL7p%S7Wq18>(p]1'fq#:'pqYBp\p%7hFn\4e_pep_Vq"jdWmHNNnq>B6M?S#5gC;/6ji
+;`A>H[e'h.A4i.s819sro3pP[Y0$%PJ+)#$Od@a3rfI+$31SA!$4^%@W&Kt_oUE9A-sO]"YTiV!
+W<!5!WW3:.1ZX@s%P&bg],stnaH#>p@j.5k4f#Pq"Xd_#Q+Anq"OLToY1+bpeLPWq"a^Xo'tT!n
+FZ;<k2`b03Z/GW8X]SVl/Uj163dWR^$kpWqWl5&rSd4sf[W@i!%J9T*#]n!"(U?9DLV!Es5!M2k
+2tq&ZonQo!r;m5!X&]E$NL5tZC94+:s&atoB,E-nauPLJb\F'&,H"pp%%S<lL=?7o_/(UqS)ahp
+]1'fphBKrp%87Kf@K*TnE@IFqq95B9gJc6`k0pkmGQ?/,q5h2e(XWqnGVbH:`L&['*nRE$NLt^c
+h0g/'1:OBp=8cor;>RSn?<$9*!66E!s/K)"9eu0#<iIp)"5Dg!9sCEn,)J>nauPLJb\^/p\,-jo
+^V>5kN_@!n+$#Bp:g=dq#C'epLj0jo%E'or;H<SjM'=B_QR#q%5!.8`pq[9e^&af,+HO#rp&A-e
+bGt5+9qlH#pUMp&ca)qbt0<5-L_!'htHF1j6,jpjo>J`!!WW2!s/K)!s95<"TUt-^Vp!XgA:C+r
+pTCKp@j.5meHSK!;-9a!qc$Pq=hVul1f,eo_/%QoC22=qY90ra4]n\nFQ5<kP4n>PtD3GM"q"fp
+@uL42b8PVdf7=[%k%qu!#QFN!A&j&c%6H+(B>,`o\f3/oCh7tlLb*R2]*86"pG)0!!!$$!!aYI!
+s"b:r*4O<p#to;p%S7Wq18>0q"a=anac>Fo^VA9q>($drqjG)l1e'DoC_kOo'P`6lK%4&q=<bDb
+JO;>mc<R0a1:C)D-]qcTZd&Xs6?\hbc9J*!t#&8"=Y*K_V:Uo""bDm%0IQ%iSOOgg>LoZs3605&
+-;n3!X8Z*!!*-$!r`0/&JkG&]r!(;kNMO3q"apcJb\^/q<AL\o();:kMb:Zk3;7$oC_gkpuqKRp
+A"LXnF,rGi8<V^qlABFk#+PQ$ig8K,T1$"`jjdlP)l]rr-`)&iS_eg^:gh]VmbF/JhI?M$Ng_A!
+!<p'p@@_Mqqq,:j7=5n$j[pc!!*H/!!<9"!#PeC#s\j1$eO\CfD5:>p[dtKq"ssbqYBrRp]C3bq
+>U.Lp$qhKmd^&Ip$_SHp\F[^q>'UNmdBW;p%A%TrquN`q"rn>rqZ6]j8\EBs6Se5o^DMIp\F[]p
+$p&skkJ6Qq"j^Rn+,B/qXsBd-"0S[?#"Xf4sW*V#QOrY,m,Z&be$Rl#'?,nF[[`./h0=?)BBUp!
+!!`="V2%B!"9.n`9H%)lf-L\r&bYp!!!<-!X&Q)!<`H%!#YkC#S[89>HmbXn+6;MqY0XTp\=R[q
+YL$`R.paWq"apa!VQ!Yp_<W%p[n"Fn*g)JqYU0dq"O1AkiV"+j;7Ufm-*<ulMKQ$lLXrRrV6-\p
+\=R[p[uQ$kkJ9Rq"j^Rn+,]AiQp\p-$iHeKNNju2'4=p#8o8s%4DQ<J7U&Y+_QjkB0.=e2)mNI+
+;+ka)D2@!"qhIK!!E;=jo=T3qYC0karUWf0HU<)#64o0!!`Q+rW!Z6"9fAW*.`M;ir8?:q>:!^p
+@n4Pq#:*iq3^pYp\=R`pbDI3o(W%Wo^_\OlKdg(nFc\YmI0W:nEoN*p@IhHq>L<jqYT[Ykl'f&p
+Z^c,p$LbpqtU3e`q\cm=n_Xep@.PAjR;3gouI[V)$)Jo>(!C#gAgKPm/Q7[d(Pl%!#u%?'c@Vc!
+!E]=!"]nQ!!!$%"T\`9%0?M2!*K3UnGLW/Xlf0.s6\T[!"fS?$3U>5!s/N&!#Ye=!uD_(0(eAmm
+.'fFq"FLYnFH8IqYL$`RJ6jXq"apa3VDq4pA+IRnauVSr;66Ym-F$4qY^9fq"OOPnaZ&3j5AeXl
+J(skp&F^[q=sURp&"daq>'gYp%\C'puqKVpA"LXnF,r9kPtMFj@]po#9*XS+92fM;5^b=pt+cCL
+f+HX)&3kd!so5;"p4i+%M/dH&K);f!WiN/!<NH*$HAM3iQ:c\s6/G<kNI[/$O6qE!WW<)!W`?"!
+##DV!"S\Qp$VABo^h_Mr9j(GpA"X_RJ6jXq"apa3;)h9q"a^Zp\=RIme?VTq"X^SnF5u<n*TK%m
+J$ADl07U)qt0p^bMC^mm/?>+h<*top\O[Wo(BuskkHk*q"j^Rn+-A7qrblsiS1Am5nX/>$6pkt#
+p]KW1Rrn>!!Ob`!!!**#6tD7!<<*#rW!'-$O-h=rW!f;"pkDE@9roRr;5+3j7N'0s5H!D!"T86"
+T&6!!#H%F)As"*IeiO*o^_PCpA==JnalGJq>-NS!r)KcrqJMHnalDGo^qbIp"&*ip@e1Pp\=LXq
+tp$Kh>R$)]THu.8KeuR!'16nQ'8oGqtg-aq!%;Bq"+"Hp\FO.puqK"pA"LXnF,r6h=^0aqUPW!r
+875:o?"5L]qD[cjOY(h!!a;e!!j\C!%J*Q":#;A"TSN)!s&B%":#24(D%J2bOaoqnE]o,cKO_K'
+`]*Q!"f53!;uru!#G_;!"o9,+lMn_p@\"Go(;JAn*oo@q"gER!r)KcrqJMHn`oW9o'GW/oD8F`n
+(Ymq\?E*B\@&&`CHaBj%0m"9!!XfJB?CD^!!3NsUZ(P)p=na$p[dnGp\FF+puqKRpA"LXnF,rJn
+aQ/Gor.Z;rRC!"lg<#mdBL=EXo/5G+;Oqa#8dLG!W`E,!<<0'!!!$"!!a8>!s8Q*"pY;>*"W+Ks
+3g!'dFeEdl0nYf-35:l!#u(>!;lj6"Vq=D$k"]anFZMNo^M><o'u2:nFQGPRJ6jXq"apa3VDq+o
+DJ@Kk3r0'ioJn?_S3dm\%T_pU3'4,0+@me&IegH(,SD5!u)\)!$Im,o]GhnhXC11o(;bRn]ppnp
+`fG,qY'FIo$IEri:d-%q:YDik4n-6j72O'SBg.f"<SKl"o\K%!pfn,!sJl2&ISnAa7n9`g\:RAp
+=8a$/05`4,le,O!WE*!!Z1qQ!!!?/!$kpqm*tUWo'GlBq=O.Fp\FQOp]C3bq>U./p$qbOp@J1We
+Ym%N-5mU!!#bh;!<WK.!WWZ8!<*!A*=;dKlfgG9(BY6^!!#$@`ms2N\,!Z8f_=_%p\4:LoZd0pp
+`fG,qY'FIo(^o)p!_"KqW6l8Z_Kli2^gY#EiIXk((UfX!WE'!!pfn%!X&Z7!$N6_FSGY(lLE]us
+5EDCPbS-W!YY_=r;cft('OaC#mCA@,AYX(kMPIokO7s1n+6DRR.paWq"apa'D:nkp@7Y@`*`WN!
+!!0A.ieTm!W)jD(*+>4"pP&7Gi<L14p1j&#65Pt)$!+GeF)_Aqpt`'mdp2GnF,tnpuqK"pA"LXn
+F,r&h>d$Ds5\H<)'f2GBsk4PqpPE*A,m#@!s/K'!!*/k!!!&u!#Ye=!tkSL)?;%SmEY(tlL*i`q
+<Hu>2&lT5qZ-Ws(]j[A#Qb&5#65HY`NoF<q:=`qn+$,Kq=C$L!r)KcrqJbOnbW%Nm,bf]!!NHF+
+oqZQ!XT)8"pthQ'EJ=:"V,!`jk6O61]Rf)!"T28&J5*V1l_Lsme?2JmIKrDo'Pf7c1pMt+85L+p
+@.PAs7ts@e4^QVN/6'[aS"Z[jSdEQ\,\$1#6"i0"p=u.nGrRir;ciu2[^T*#:K^6kOS#pirAJqn
+`B3(S/i+E!!!$$!W`<'"9\o3!!!99&cj+YC?"^DgudtnoCr%OlC%DKp\=R`p^m,gp\aaLkipU+[
+RDB#,S1Oa!<*!G!!rf?%9bNm`r?#=2$3ja!#H1H"XP,g!3UtJ`V8*^p%J(JlK[oapuqK!pA"LXn
+F,r>hR`+MM%1Y<Em4R,rp':@W;+r*3"#ls$OdCL"Tn/nrW2lr2Br5&,lf45g@F=[kN)"0p$:/U%
+KHe@!!<B.!s/Q.#64f2!rrfY!$5O"f`1!mk3VX0p\=@FRJ6jXq"apa5kX[ArV5aKs8DAh9.`.<!
+!rW1#n%+H"98ET*WQ0BB2[LFbt(AC'e'Y)$jd:J!Y6e7Pa1,*le^:co^qV:lLE-okkH7nq"j^Rn
++,3*ptqe"qWe+4k1SAGleLUPYcIg)$QTKO#Qb24!Up*g!W2pV"Tnr4!!X`87()g`e(4HehWb"#<
+raWN!!EQ5"9AT.!!!08$NL8I+9rbc9Zul$kNq[-pA=[WRJ6jXq"apa(A74mqY'FLjKNs.[`"(L!
+!`Q*!XB,ErX^FW!s98M/c[1V,6/>V&-`+[#64u>!!!r<$RB]Gq=s(=nFH&6m.0ttpuqJnpA"LXn
+F,rFdG"WloCqJ#me#bSG[sQ^gdeS!!%@gKrrW3$k5[CG!!!9*#7LS46C[N8m/4KAmJ>kb(+9._"
+UYP=!!3<(!XK/A$4."O!/-Tgr;+q3naQ#=qYZ`U!r)KcrqI3#nalSOna5)/EW@")'b)3+#R^qBr
+;\5J%1*"9!"9,L";qC_+X6sh!"onG!!*-%('">$C%g]\k3MO+mdB`CcM6Vu+SPU,p@.PAc1geUr
+8>rbbd8Q^6(#XYq#1=(#lk>5!s8B#!!29`2A6&n+92C<)?W[mm*,(Po_l><qBlIR!!N`:!rr<(!
+"B57"<JTj2@8*ro<-p?qYBdPnFubQRJ6jXq"apa61sd6qu6'Ko_7kNqVJTDH#\FP?:HFY"TSN*#
+mq1I!"o88$NM%E!#btC"p4o5$3^P[!>>V=Tt&b6kjS'2nFcY'q!%Pqp@@kPq=3kAqY]^IrR,6e/
+g[7TfDiGMndkdI!sJu;huGY9!X&Z2#7(;@%M>bRrn6qns7=(^!rr<]!rseU!$2+V&HDe7!!:`8!
+?BJ@p\F:JnG<.Jir5A@!;HKf"8;<Rm.pGln+?GPp@@bEj7h4S,nLpo!<NB-"U"2nrrEi7,R=CfQ
+.=7]lKJ!(p[e.Pn*p,KpX]-(p`9)!oD/+Ikj-:<eDg8I@M'>0Pg/pHkfM@L*[D:"hZ*WWquH`t0
+-hk_0rM>Ns6c`JqW.&E0bap.*>\]"&-W%7(F0S/6IU;^1:7#7kP4l@n+lG8pR1dVp\spip[mtCq
+=YEcmd]f5ki_-pnDHBG!!!c7!WE-#!UTk%"<J!UQ?E,ui9'h-qu63]p$_DEqY/S9l1c@oo(2VJl
+K.3rs588R+`Z#pr8.:Z\tt!C/cYnb!s/Y]!&=TX"U5M<"r%bmg%OXihrXf9;\T3B#6Y,Y!#u4D!
+XSi35j7Bf:d41,s7u]_j7<!6n<s%Vp@n@Xq"F@Oq=5'jq"XRRn*]Z,rqE_V4THSg!#G\:#n$k94
+u/StkP"K#oC)8Ep@.SGq=`D7l1c=no(2YLm-!W\X+[&*r7AH`N*/sdRX(P+,6/2s!t!c`1]dge%
+1iOb,<#o/-%Mon`ng+[lI$M2+TV]c&J5!S(`FV<%MUXXMH9kEg@aS*oAK$5o^8.B#PRoeq>'g[p
+\F:XnH/4Ili-,QchZ>pjcpea!;ure!#G_;$31&,!t?m*q#BXJp@\"Np@.VHq=N85l1c=no(;eRn
+EfT?o&fN9[TY'Z$@AH%r7%>I+:T_D!"n#e+p%oT%1iOG!#>ea!"0-FGME/Sf%MYj!$MLq"t'cr$
+ig;2rW!E6""Os9`UqCHq;pu<p%"OG!quB`r;$0W!qPmMrU0^Q%/ecQ`7^(L!<N?+"9S#l(BFL@!
+!jGC)%UGih:Vb_qsjCRnaZAKo@E^$p`K5#o_SCRmI9MhOA[MN=fqN"k5F=kEsi?U!#>e>&d.(m!
+<N<$!&=QW"<SKb"op[t#WDhc(3o35r9kdTdDYe3]/1c;!"05O1IE;c"V1UYrl4L*mI9iApR1gUp
+]($fq>'Rmq=s^Yq>'dXrV$9[jSSZ`"o\]-"Tnep!#G\?!XJlF!Yk\MK^daa]`7Nqp@7\Ip[Zo1l
+1c=no(;bPmcs3<i1sm6#r$njmD/bC@pL2l!YPh?#m9)crrMrr/d<F2!$2+?#Qc/4M=g_QjT%!Mf
+'24t$5X0T%LrL?!"'\K$OX?*g%G11p@e(QRJ?^Ss7cTiq=YNmn*]]8nE]8ii:cU4m/8gM$3p_:r
+W2Nh"To26(B=^>!"KENs4d)$q!e"No()PKn^dL"p`9)!oCqqDk3.t"&jiPPkkb7cqoR#1-4'\S+
+92Hbh#RHU!!<-%0,+C!!!",L$m&e\N'RH%C@IJco_QSgo^hgN,6/Pu!?hFS!!*:^s7#sZn+uhLq
+3^pWp\smdpAk!`q%i_uq"aXPl/DNss75RQPRn6.!rr<%!q?7,!>,;[!!`u6!!*=oQgFa]nFlSHo
+(VkIf(eM))Y*Inp$'P]Bk,?Xqs<eCgWoceL)g7&('XpEbQ'"!-l;WfZ>3eSI'<J"s2Y#ms(MlM!
+>keI+TN,Z!*]*js5`YJn+6%*p_W]"q=s[Tn*TcBqXs:Cnb7]U#QP\G!#"Mr(CC-\.hf2cjn8Z?e
+,/.rrqQ0UmI'TArSI>5q#C.+qYg3Oe,8RsroN/9e`!K"!!"#X!!NK,b5`k(')C\eh;?d%L:?RJc
+MYE,9`tk*'*&"C!"]A846lV8j7WEArqD9E#P\#hq"OCLmeuY`o(2SNh9Kp\%LW:=li@"c(CUW[&
+.)Crh=:I9h#HI)q=F4Ko(2PLq;1o1p_ihunFHDNp$_2Aq<.eN>m(uf'*o'`(BX^>r;Zfud/YO'&
+J!USlf$[nquF,VUq2PAP:-D@!=Sr3%0R"<!#+;am,7X/kPXh+p_NW!q=s^Vo'l;AmdTiAp%/+V^
+,5ls$gRd2!<N?/('+C@"hs-enb1l=kjJ'1nFZJNq"OL=q!%Pkn+?8?ki_$bmdg5EnD:oG!!a&G"
+onZ0!<N-!rrLLI-O0_aear>&jhJY@IWbO/L.kGR!"Ju5!tP_@!!!?5kO@j&rTrJ<l%SmGp\"1Lq
+Y9aTnaGl3jlYAu"98f1nGiOir;[`;!sJ]:!!`r5Ms'luo\0'.n*oc8p%\C[q"ES>l1c(]o_S@Up%
+7hIdEqdj9+WL4)ZTj=!!!&t!<*#H!%.jK'%6gSrp/kKW"T0<#Sn:!!<<E+!<`N*!!E9;%F*8fp&
+FUIs71m=s7[-!p%J7Zp[IP:nE8s1Rn3S^"7Z?k!W<!7!WrT+!rs&>%6CQihtl1$q!mhDoC_kQrq
+YFGl1c(aoCD>;o_A4Ys75.2.KCOj!t>tS!!X>=!<*#H!%&3Y&]jG#kg\hOpYY6@70<Ml!<<-$!!
+3E/$5`pS!-!kSo'Pr7rIO_Tq!I_Mq=F+Kqs!PKhP12X%I='.!<N?+!<<c5%KK&Q]_psbr:0:NrU
+p<fq>/tCl1c"coBk]%l0%'fppD:o!$)+h%0-A3"igTQ#QbRdq=jp\q<#csag!8n!#5e?!"B26&I
+o9r"TSNN9%i^emI0W?M>.)Hr:p<f&+B/cq=jUXqq1?%p>#l]&F9Dr!=o;@!!iT,$OLQakiqO.mI
+f'*l1b8Orq@*%q!Hu;gR/Tb!^$G_!tH"S!!!/D!%/'X'A)a>l.bpkrnd8E!)*e+&HVtO&ci4>!$
+DCN-Rgk5rRgc9n+hh8!;ZTg!;ZWj%f,nqqYBgSeG7kmo)K+"kPuA5!!*l95QCd+bi7^MkkXuKqY
+U-ap@R5:l1be`nFHGOnF?A=oN2)<('"KY!!E<(!sJl-"ss`Ys7GdBi:sn[mCWB<!#5]!!"U:T(]
+Z]@!WseO:fR#Dr9j1Sr.4VZq"OOXq=jLLo)&%?n,t3E!!<cC!<EE+nGrOh'ESCB#n%p[N;L9GqX
+O+Mr;60WoCq,:kkGVYo_\ISnbD53-jg(W"N1<?!WN3K!&l_+p\F^Srmq&8l1T]t'*&=O!!!'-!!
+<3(<fI)'37c%Cht?L3JbU#Up\4IYp[dkNoASX*(b#Fj!sf/4":4Dq'`e@="pkYW%8Xn8lhK'"o_
+J=UoC_q9q!%P`qY'X[q=F+Jj2D*I!!!_S!!!&t!%@sO'p4aFp@.k9qs*k5s4QFq)$9jn%fdFS&N
++0;\_o2ZA`h&2fD4_'JbU#Up\4IYp[dk?kM"kf&fD&f!<<0$"UOJq'*/1>#mpkK%Vtt-ro*87p@
+e.MpA"IGq!%P`r;$-aq=X7Gj)G&L%g*Qf!<3-#!%S'Q#736Bj5TmrnD![(mb.H^s26iU-isPV(C
+E.-o\Js3Om'IXh=]Runb.P/(\mb!q"a[Un([-pn`g)]1^sEb"T\W.!UTk#!X/f8!#5JUPM5X)md
+]rAo()GIq>'1Jl1k;U%/K\np@.A;*XE/c!<U=BrrObQ!X&c;%Qs1Ug]-X:p%n%Jl/_%#kOef+"q
+hpW!a>'il1P)2pZ2,1j6ZF6mXb-Lq"OOXq=jLLkOnTKm03i%$315=!rrB*m/Re#!sSu@&de[`h:
+h\po()>?n+#uEp#c&5p^[/rp%J1Njo5E(!"/l/%`n](!<<*#!s]/B:\+A;rUK^_qs!qQh#HX7\_
+ks=!$VRnI.cO\melk=mcNs"r:BR;JbU&Vp\4IYp[dkLn_s!('EiFn"pYYB!!!/l!!!&u!"o>8"V
+:_B#Qir#oCDG@n*]W4n+lM9q!%Pap%e@Qp%e.;fEiQ'"U5,CaT);Ar;\;K"9rW;pu:c5n+-;?oD
+dqNnFl8Ln;%8L!%PGFpA4%Kp[@q@p@e=Tn)T&p(ARXuq"a[Un+lA'l/*!POuO'U#mLA1n,NIj!W
+<!1!<NB*!"0-iFOTaImHj6/n*p/Fk4n39%eKJhnau\JiK+-D'`\48a8c5C!rDsFDtie_jnnZ>qX
+a1So^2YGp#sN^$3<;OnCm^;kPsoFqWI>CjnJ?DJbU#Up\4IYp[dkFp[7e."p_k@)up!D"U"5o!<
+N<"!!30()Z9XB$C^AJlKdj,naZGOk4n39&,5S_p$q;FkuAW%"TeZ*!Q5!<!?_Gdq"<_?n+ZJNp\
+":Vp[@;=l/UJ!M2^*YnaGl6o(Mm1q"a\$p\FXZp\=:Bo@is5VA'+.PQ2$j!s\f-kl;M+#Qt,/%j
+NmmrqX_:p%7b=p%n=Pq>9pKq!%P`p[dtMoC2YF4V%N#"on\F!!!&u!<*!@I/ER#q=FCVqY0^XqY
+9UHs6B4)D<'[LnaQ#9nauSOJb]'9(\db$p\4IQkka!4k`-Dun=Tmn!!NT.!pK^b#o*[H!!<ZGVW
+dI$lgWfokOSB;nFlYLk4n39%e]PfqXjLMm3)N3&I8@;a8l2?r;[l>Jc,$*qt9XXq=jXYqYBgSn`
+9Y^\,?']mdKZ9o_*k2p\5R!q>'dZq!mSJh#H;B01b</":G86"p"bh!!EE/#R(8.!"WSlr;?*bjn
+.[(p$_>@p@@A@l1bb\q"=LRq9de.!!<f;!!:4A!WiB'qu?tLq!%8Ap$h_Sq#C."p\*7uqn^P9gt
+D)`o(Da.q"FIup\FXZp\=:Bq<%G<1hh7"\Gu^3!<N;b!#>S<"U"o/!Z\!+lLjZ0mcO'5nF-&EoB
+,i4p^Zlio(_VGV61R7!t552"ipZF!W`?"!$?.QkOS0<n+ZSOq"OLUp\<V2mH<a&hYcg3o_81Wq"
+K@7q=ka"q>'dZq!mS8o&Tc`Yc%$8!<<-#!!;?a(BOU;!<WK1#68Sk\c:den*0K?oCD\Qp?)/7p^
+clgmJ#r=FaFo,!sel,#6DpHrW2rt+9>^>lh0Q?nbMqSq"=1HoCr(PfD>4?i:lg6pA"IZq"K@7q=
+ka"q>'dZq!mS4pXT!Fim.A[#6>&1!<qZe!=B#0!<*$1!&]dVq;))7lLt)HoD8CZk4n39%dirRq!
+I]M:_3X1#QOo4a8c2@r;cft)FX,_o\fZ<p\+CVo'G]2o_e@<p[I\4h=gR:rV-BeJb]'9(AIY#p\
+4IQkje8ne.qK<qXOso$3L>8kPtbn"TSN("8r3/+X>+WlI4tgq"!tLq=WnFl1bbToB5r=p,k;>!!
+N]1":E$HrrF&?1[ON!fD4q.pA"@Nl0%F(l1P)To'68@q=sa_pOW,8p_W]#q=jXYn`]i:f<QUcq=
+jRf!!r]-#m0>k(BXX;!so;<!%A3S*m"*Sm,dd1n*]lCo&f`3p]p9WqYT7O$Q6VX!!3'!&JY8kmc
+XNFl0@s<o^)#?rV60dq>pBcJb]':q=kd#p@RnDnb2kXhWS9sl1!j'!"o88!X8\i!!*0&rW!Q4"U
+>\@)$*1cs7,RWp$28Kp\EtHl1k;Ms7lcXn-BT<!"o;6!XJJ]s5Mhup$_56pAF^QjS\fPpOW)>q#
+:*gp]1-cp_Wf&p[n"Go(;)0lmT7-s8)U!('Od?"Tmog!<N<$!"o>9"q(ML!%+Mmh=((5p\+@SoB
+,i3q#C'kp$:'3"M=^Q!<icS^mj6Uqsi_Em,md.mHsTCq"F@Oo_/$1p]pQgq=s^Yq"aa\!;?Ed')
+(tfnE0c@!9DGaeE?l>$jZh=kPtVb!WE'3!X&Z-"q^h?<ik0IlLt5LoD%h;q!%PXq>0dSoWAP8!$
+)(?!!*?7!f;s!rUB@OmHF!3leCS%qY0UNnFH8HJbTKCq"a^Yp%S:Xp_WDgoCr+Wo^Cc)_?KnerU
+T7^!!EB(%0GborrN*!&ci(;!!<Q8!$@@!puh)?n+H\Ok4n39#5.odmehbM^&T,R!!!$*%00C?`V
+&`ko&Sp&rq>C0kkOi@mdBW<JbTNGo_84Wp%.nQq=t!X&+TDkq=3_Ggl"AV`:`Ea/H#PL%0Phprr
+N-"rrN-$%gE":&HDiMp%n:Ln*g,Po]Gr5p]g-`o]lH\'>"5_!<icM*WSQm_r]tZp#tT/q"O@PoC
+22:o(Mm1p]pB`qY9[Pp%eFY(A77go_8"BhriR8U\EdJmYVh]!Y#JAjT,2Z%h&FC$ig8iZd&4=kO
+e`FoB,i4p]fmZo]H02'>"5_!<N<&$ig8:/qU4Oi90%Zp](6`naGr:o_A96p]p?_qY9XNo_J:W(@
+pn_o^V(ueDNc1D(HG&(B=F@(CgNKk5bG]rr<Q6!##A6$P-6Jf(@hnqr[P5q!%PXir/Q1r>uT`!!
+!'!!#GtR$3C5.%00%to`"1=k2>atn*ooAq>5a<#OqH`q"!nGq>'e%p$V,3o'tr#N4K!%-ia>X";
+MIK#64lFk5bG]rW!B0+92Qg!#>[=kg]D&h<"G%p_!8sqt]jQnFGr5m.g&N!!30%rW3'#^Ao/U#R
+CYD'bq2\#!]_rn*Bf.p%n.LbPg)\nb2tW!VuT^q#:*Mpu2&=p]p`oq=s^Xp@n=Vs7u]ks8+#2q#
+'mRl1"K@n`&[+q!e.;meZeH]OMWn%Klb3!XokL"U!3R%T;uKs6'1Tq=*S2nFubQmeH>I#5@riq"
++"ErUC6ik6;%n!<E6'!<Ke4)ZpHT!rrH[YdXGlmc!oir;$6Rqsa7Qq>'g]qXO=cp%J+Rq"ad_l1
+j61nb<+Trp^*]o_%qQq#C0iqZ$@9q"OOVna5`7pX8U2q=EXlaRo)nleJa\0F.jf$O[1E#mCG5e,
+U!_.+I/1ec5C;n*0-,pA"CMq!n+qp\FXYo'l/=oCDPEd0Km\!WiB'!!!$#^]5DX!WW<1$3C>8!%
+8e$TC_FCe_K?fc0Oolp\4CRp%IqN!;?9`l1j65nbE%T!r)Kcq=Xjaq>U4:q"=:Vp[RS7mIU)Kp@
+7P9lgt/Vd[+cD.guCY!XB5H#6=f,!Wi6"!!1aQ%LrWGs5;W2ht$7'mI9cBmJ-2G"8DN]o)A+bo'
+Z,2YQY(2!Wr<#rrKq9*sN#W":,MI"TT5>%fdA+Ms&god-LW#k3ha0o'l,:naZAZqtg-_o^_PAl1
+j63nb<7bqt^![rq6*^s7u]k-2@0(nG)bLlfI="qW$Gmme?V@_O=s`$NL/1'aY$H"pFu,!W`?#!<
+3)Q!!aPFC#\FBpYPl;!q>gTmJ-2G&GGbenaQ&:o^;D+Ns5Xg!Wi3!!!0n9*s;cN!<`c:!=KSG*Z
+lF+$\)R:kNM@5lg4'/n*]T3naZAZq=s^WoCDD?l1j6,nG!+[p%.bRnbMtZq&]>)oC22=q"aC<i9
+^@4o`+X7]p)J>$31>D&/?At"oJ?#"oJB"!SIGX,6/:*kO7a3rU0gWoChSHnb<^lp$qP@naQ#BnG
+:UU$3US7!P8=R!<WB'!=/o1%L2t9!!**#)ZXIGj65:blg=01n+$&Dq=sdZ#Oh0Po(;VKpUBqspB
+(-cqYBP!qYBmYoC;>=n+QSJk2GLno?5nCFV4Z\$3C2/"9&9*"98E(!rr<'quH]sf`2Kj%KK?'o\
+f?3n*TN3o_7bJnb<Xjp$hD<naPuAmeY(2$3LLC!$;4E!WW<0#QXo+(*Nk^(BtNd.(o-Kl1sN-mI
+'K7p\Xd]q==jWm-aB7pA"IJpu2&;q#:!hq"aa]kTBZrp%%V@nF?/Bo'u58jPTd_p\oXI!#5hK"9
+8E0(E38QrriH)!!1FH%MoI3kgSDNp@%82nFlYOmeH>I&c)(fmI0T7me,l>_+Ot4!WW6"!PJIS!<
+<*##R:>U!!!6(#V#fW,lfIQnc%k7k3;4!nb;qVq"aFbm-X92o(;YMl1j6#nb<7Wn*TH*roj1I-i
+<]1nF#c8o(qk@n+cS8d,a!/Gm"*f"98oD"T\r9!!NB'!s/H&"47)Z#o3XDR?m"-q=*S2nFubQme
+H>I%f,hhn*fc<p@[M8oDo!s\,\f$!!*')$iq"B"9er9%gW.8&LIKDfC\@_k4&-Dq""(Sp$V5<p@
+n:Vp\4IZqtp3Whs0V-h<*qlp%J%InFZSPq#:'op\+:Mo(;\OrqbjQ55=sMqYBmZqtp<hq=O.Bp?
+D><mJ?/Cq"OIRo_/+Xq"XLNs6]7OrqQ*YqtfgEo`+%$n'V0uW_Wm-(^U0Fq#LEqrW!!#!X$gM%g
+)eM!$Nc&q"<D=g&Lg.q<n%Ip^QuinaQ&<o(qP<huEc]\,\l!!so)6"98Q)"U>#-!tH%H#TXNk2d
+qs6rUS1Pj8ArKki(b!rV#UJp%eO^o^(c=n,M/8q>^<bp%7qPqY^<Wlg=0?n-JLWp@\%Hm-3]tn,
+i1NnG_kWnF?M@%-d0OqYpE_qs<M:m/?nS,P(Bon*T\umcO-(i:ZU,o(`%Nkj@Nks7XjAK0'hK!"
+BAA"Sr*"!<N<#!<3)I!"TeG('5!OGjtCir64X%m/$/FnG!Lfp@RqFmd9r>o"b>,"9H"4:&tM$!!
+!'$!XfPI!WW3$(^g<X%0-qn7'lmajnAW=nFlbSn*9<2mI9];n*K<&ptl%rl1!iqnE]<'n+,r6p@
+n@Xq=s^Xp%J.Uq>0p_l1YP[p@IeCnalGLq"Od\,51d$me?,3mHXH5mdT`7m-*U1puLl(j8\f>lK
+R^.p@.A8rppQDrL"i0#n7%B%h&F=qu?m$!X&T,!WE'!!W2rs!SIG`)upET!rt4Jm-aSjkP"H=me
+H5F%/9D`m-=B:qO\)p!Wok3:'(D!!!3r@!<<*&$P![Y(*ES`&dTNZK@9egkP4`+q"ss\lfd^,na
+5MuiTTn1r7_26qZ#p^s8;`ir;69]naZ,;m-3ZngYC]Hk32'pl0/<IqY9g`p,:X`lLarNqYBF@n+
+$&DnF5l7nac8@n*]Q'n,N<qoB#B*lKn'2mHO?3s4FdTN;s,%+q+GW$i0i,!<NE-!Wi&rrW1[P%h
+epL%Kd+Pg?@qhh"CR5nF$)>p^HohnEfH0p&B@Q!<</2!<39f!#,S<*rm5h!W`<%"UtGY%0uq6*<
+?-U3,l\/rTa=Mk3)7.o^DMBkMkRgp&"!pThlso+!r?c0/+t./1j-d5moqA4?Gkq5sILn3&g(e(+
+h-m0J=t*-9!qH5!D+k3]8T8-o*\<r@8@//ho1@,W%L+n'q15oC;hK'(+uHq9&TaWHgB'#7qFK!!
+*6*qZ-Ws!sJf/!W<#u!W<#u!SIG`#mCYB"!@T.o(Cr.rVH!UmeH;H%eo\ho'l)7m.UHT(]j[=\H
+#2'"p#eJ!%e9Q!"0SU!WW<0%flq@!"9,g'`\7dBWU7AlMphHhsLI:o'l5An`o04s,gA:YJn>WYd
+qEX\\,_YXg#1A\[oD_\G`u$\2VCIb0.rH^Uq\.]<\Q?Y-?<qZ*qHccGdW8^V@V(b07E(,j".fht
+?^9oC;;9l0.g%k^lG/!!N6#rrN&u!!3!!!XT,;qum-(!Wi6"!!1^Prs/Q($6K78jo=<2nFQ8Kme
+H;H%eoVcnF5u=nFZAu'`nF?\,]8-!$;1GF(cd.#8\U-)]]^p!<s/R"UY55#mgS3&iaKnfBhDFk5
+G#Dn+?GKk1T;&>(pDMq=!nJqu-Kip\*n=nFQDMqYTI?mIBlEqYTOO)Z0I2rVQ?\nFu_Qp\4CSou
+u1AkjIX.mdfo<rp]sX.eiKVTuQ<Mm.0c>naGl4md'e5'`e:;!s/H&!X/`.!!!$%"U5,5!sf/;rW
+WK1#R(>4df9j\!WW<3#83O$me5K,q=*hInb<Xjp@@\@nFZGIoBHJi!<`\=!"B/@!$2+cbNJ\h0`
+h=VrW#(c/-u:g!"C7g!!!TF#64`@:nQkLnCIC%jQQ4/mGmBe1=rl4kiDF-nF,f/h:1fYmdKW4mH
+jQ?p\+:Po'#UAqYBpZoC;;;l0@Kf_kDQqN4@=1qWIG3qYL*cp[dk?h"Y<9r8.JKmI0Q6n*ff=hp
+3,>*[Lde!!<<'!!WT,!!3<0#m^\;!W`9$!<E6("pG+Y!"T,6!XB#3&HGD`q>8\6r7p`8nb<Xbq"
+<t;nF,Prr9jV!!WWSL!<3*'$jQbZ!<*&u!WN3s#mUJ3!!'R8qS,At&e4pc'FFsE!!!$+!!!3=&H
+DnK'`^A'n+ub=hXgd7nFYl:iVsD?_#;XLl0%3onFl\Rq#BI)iSE>fqV1]%qWRSGnbE+Z4S\[Fp@
+eCXnaH#@q>0OPrT(>QIp%'<dH'$]rRUoCq=sRMo(]rEIiA@KqXX1PkMc73lLjsf!<<Z<#S?n6"T
+\Z,":Gh@#7qFK"9nu2#S\=(!<<60!!!)Q!!33&!W2p()unRdj7`N?q"Xg^s7Z0]nb<Xbp\+"?nF
+,Q.iR\&@!!35B!!NB'!#5M7rW2uurrGmq!<EK:(td<InF*`+/cc.V!!a/S&I/CA%0QY>.Nnd"%j
+<YtK[g%^n+H)9kMc=*m2XI(lg"BDq=X+5f[\O8iRZucr9ECdeG\V,l1"!.meQGRq>^:Nq=X7DgZ
+d(%%MrH,BH.)Lp@IGGqY9dVnEo`<o_H6SrTEnJp[n%FqX"0q\PiqG%fu_3#mq"E!r`09%0-M2&/
+YWl">"8[^r3RR%0-D5!!!-&f`;!Pr;[*($H'%Fp\FgVqY0[Xnb<U`p%IqEna>W8VkjG$!"6jJrr
+W3#!so/?!rW*t!<N<)!sAZ2#nP;$m.g,3k0%c\2C&h:!s8Q(!!ET4!WrN*!#-"F!%*9Mnb)57p?
+^l3mD^g/p=TE=fAZ)cn*p)NrV$3ek25Cgjn&?*khbe"naZYH,4=phnac87lgF93mHWp%n^DkLD9
+MdY:CriToAJd)p@\"GrpLa#n`(tNkOniLnG)\GiT"B;)?^ER!!!$"!<*!;!soDC!%AHZ#Qfq]q=
+jUTnE]9U!rrH)!<iPX!!!&u!<*!*!,,p/s7H3_p@nO\!VuTcq!n+hnauMHoC;86p1.qA"994Y!!
+`W4!<EW0&Hr"3;?6h$#R1;2!!'L2rT`1llMotF:c8se!!`o?%0I"[('>4/!seu>)[Rm>g[s[nqt
+TgHi0Qgss3^l.m.:)Np[e"LWHM5t**0iMeb/4`l/M:1nbE.R?1RU[p@n@Wq=jOPo(DeKlJ/R^8L
+XZ_EgbJ-nGW1Pp%\:Tp$_&,eEe6`m-slAnb)81m"Z2V!!!3)"UYD>"p+c)!<WKF!&?lNCBfpnmd
+'B8pA+Y-!rrN/!X&SS!<3'2!Wa;_a8>,nrq,s\q=jXZr:]pUq#Bpoo_8(Lmd9d.64*hq)ohpb"T
+eZ+$46b8!Wi)srrYjt_7Aglnb))/p@nR[jjV5WQ?c4P!rrH)!!!H4!!a>@!'?\=q=F.Drp/Q_>l
+4'Bpu2)Gq=sULk2AcJ&f1f`(^*=Mm.U;Jq!R\I?M4$dq"ad`r:9OUp$_22m/#o6s7u0LhV%nqs6
+fUGdHgN'qu$B\htZ%+4.c33m-+97kN`!o!"K>E#QP,=!!NE)":5A<!#@8eh"oVBV"X<LqtK1"b9
+6ug$OHk9dfBCK&-<1=!Nc:clh9rDq>'aWq"sd[nb<Ufo(2YNna>uC,;'T7!>icV?3:B6!'Ubj$k
+!@G"9JT(!!*'&":)cRmHO!5rp](9m-a&e`NP26:aZkr*sr#V!>5hA!!*<@B\rXcldkn$o1b):gt
+hemkND.#q#($b(BFL?!XBJZ!RL`Blgk&Fnb<+YqY2u(kk=oKoC;DKgXk`^rVu]\n%R<%oCC`(pA
++@Tr:/S;jnW>@qX!S2rpT=Kg&V`s#6Y#,#7^V5!X&Z/rW!^AfB_.c!3Q7gkjnQAp&-NN!"927!!
+1aQ!!3#urW*N:!sY"ip?(Z2pA4RUnb)_Oq!n+hq==(Np[IYFjU`CB#65=V!+#j1#RLQe'aG-T#m
+^_<"9Sc0!!<3$[]RmOrpK14i;`39n)`j3s7Z'<ah!9j$31nY)%coS%0AMGQdkNXp#Gcka7&-Ms6
+9@Tq"F=LnF7SM-Q*-h"tj!Pk3Csjp[J#dq=s^Xp%7kHo(MkLkMbOfg@G:0Z^$&IA#mrUkMY_*nb
+2G3kk4K'l0.8ZB^P0\lM9iBmqN+@#64`)!!E]8(`!Va!!XDrQ.+=5nDYq)o&f03qW62S8J_@4#6
+4`,f`;!Pr;[B0";1rLlhp&9nb2hRna>rApA"1Q&,Yqfq"O7Hq8r[E"U"f6"3CNJ#64f1"19$RrW
+3'#rW3'%rW#Up!sQHJdJ`:Sp&<q.oD8(<ipus<jn\Z6nb9_5<Y5?J#QOu.!##Wpo^2G&li?eHr9
+"%6m.']:lK[m5Q@VOV7qeCPY5,6[rpT"?nb?Jfq=s[TnaQ#BlHQ8aI"I?Ik4O6-'md<(,6=%hlI
+k7kp#jiXmd]<+r8sDGguS;!mcjW*!#5JM$P*pW!<W?&!s/H45(pJIrSl>rhB%gZlf@[6o'uWa+o
+h]I!!3DY!!33&!W)j,)?;M6p[S4PpA4LOm-jW@q"a\$o(`1]p$hJAqs<8;kPElsA0:j]$31)/a8
+fNU!!!/WH3t5n!$2+K"9Jl0!<E6(n)s9=nCljtpYGB0nF5u<o(2,2mI0T:o^pMB+t3L2#mCD3(*
+QNM_WeT]qq'KYrn-f9o]bZ8rV?6S_=PqNlMU;Ip%J.Tq>'RU?ha!Yq=*;%p[V,h)#sXR$SDh,5?
+_C3k*/jcS([<2ch?8fj7_iurqc-Hj;Hb#q!u]-fJ"'@#lkS='`o9U#m1A7#stlhn`\iuqYfq(U\
+F'Eqsj.GkApV(!"8i<#MB(X!s/B$&cr4A!<E<*\aA#?mITu>mIBlCpA"IY(\@G!qXsCMp$h\Nq!
+.hEj$sa_#mC;2"3:Hm$ipD0c*@BN%29KV&/l)`!<E0#"n2*Lp\!\3q#'[MnFH5Fp%7nFnFH5Erq
+8#EnuF/U!$M=B&c`"GN6V*]1$&'.iofFgnF5c2o^_8=o[`rbo\f0-o(2PJq"adVpg3jipAXdJlM
+UZb!!ODr-NFJRs5?Et?O@iZCZbEJkk!<uq<[b?qrI&8g[#d3]C>^Td&@Q\!uV(R%3#9T!!4eS!*
+@5;p$2).m.9Q.$)7+Un+uVGp[4:K#Qb21"P<\T!Wi9#&cr1?!WiK+KC[jtlL+-,l0Id,pA"IY(\
+ROtp@InLqXNnIn*TB4iZSC("onW."3:HO#6=o,bO?hs!!iW/!!`E&rrEc5&F9;ZoD%nCnbN1Mmd
+p2Kq"=7WmkaD!lg"<9mmJN')$:9t"VDDHo)!9>dH(,\iVVs0naZ;Gm+p:Wh>>Lfk3q^*nFH8Hq>
+0XV?2O<gr:]CBqn$2H!"'2D#Qm3'Va:Rr!ruS@ir.]^iqWE+qsVJmo\fSupFF(Hmd98/N"QO!%1
+s9S"TSo:)?9d`N:?>flM'T.nD3O8X7kcGq!mtPo!SN*#65%]!!*-%rW!Q4"9ec*!<bFXirAH8md
+9?*mI9iEq=kd#p@\%Jo_A=_hsKh*g%a5)!!<K,!=AnL!+#^/!!M3UKpNJR""4?S%KHM0"U5mhhX
+C%/p[RS=q!IP?oCV\Gnac5>md03#jQbIWSkhNS#7(b=%2U@kIQP.*eDfudp\4CTq>C*WiRR2Tps
+es)o'5Q/nauSOqXO><p@7\Ho',K5r:%1B=ZJ66)UnVcn,;Uhkk2^]j1;k,N0L^Ep[.VGlM0H<>C
+UG`khT?G%hed?,S:k-!<=EkV8)B_hZ!9<l1Ws2)792&me6)<p[H0&":G2F!!CmSrrN*!&ci(;"9
+AT;$N0,Zq=X@Po^MDEpA"FX(%q.enauPKo'H,>qX"3K!!!B9!!3MK!$VFG#lkD,cf=@c*<6`R!#
+YkA!!WQ<Ko5Ehnb2\Hn*or>n,D\UmdKiIp+l:3oD@nBoVSoL!##>I"pFu_!<pF?n+6SNli-_Qp\
+=CKl1Y)LptbN0kj.U'nauSOqXO>@p@@eHo'Yu=m/,_gn+5fDrj0QAl+$EahX:(6P8l\7BfdaD/*
+ciar9j1LR4^]&qmd=S!"0&<!!<--+ohroZM4+MqZ#X>p[meMir;99o]5</m-j]<dM`/t!#ttAf`
+;$QrrE'"rrN];":-1Okj7:+oC;PJnF62Gq"XV!o^M>>o'l%jqYo^<qs?'C!Y#Y?!XZpJ?OI)O!#
+GL;s7rII.0^Cb!=/o1"98E\0'2HhoCr.WnG2bImHa--nEoZ6o_81YqsNkOoB?%8"<@P$%0-G="o
+s+ulg=$)qt]gOnEoE%mJ?GCnE0<6lgXE7oC_kQq=44^qt^!\rqKOinbhP-r:f(-nDaE.>A\KaBQ
+gGcUIW`3injW_'r\h;s6'+AbQ/[SomHiK$Pa9X$O[[L!<ui3lM^8;q!-Adp\3qOjmmD3mbm="m-
+j]<j&H9p!Yj,aquI<0!!4)>VWQA$l/qL+l07d4q"XV!oC25=n*/lYq<$tbkK*`;!s]89!=6aH=:
+PHL%41hrmelGKU/PJ9!X/i0#QOi9"4?E.n*^&MnbW(To^h\Hp$:u5nalGIp>Fs&iq*-*63I9+!!
+!E5'F?Fbdb<RIqX<e>o'5,mnEo/sn+$&Ip@\FYrqGpWs8$!ppA"R_ptb<)nFc,/o@rE32#n:$(B
+=t;CY'.4!.c6p!"-m0qt':ClKJ]agtapu)']n1!!E9<)Fd]-na5W/p\!\4r:BRAqW[1E:\3]8p?
+h8;kjFW>$3CJ7ec>XLqu@-3!*/(8p#b<'o'#</pA"IY(\dOinF>o,h"gWbr5d'c(Dd)Q#lt#2!Q
+b<b$31h\1\^priR\%aN/SMP!!WE5"pPP@_Wq*dj72p4qYL3g2u<@Fq"aa\p\+7Nrq5COmI'Y+#n
+m@E'-@S`!XPOUl1k/+lKn0=mbd*tq<IYPrpogSqYBs^q#:$Xq#C"moC2DJq"+IXo_SCMjll"*_Z
+1Vi"WATp!"Aia)\4GF+#,7sqUXg*iU6@g#Kk[+"Tf#2&.C2l!"`gtb45AliT0.mpZCl3hY-F#gI
+(u/o_Rt>l/(m;"9SW(#R&`Zr;lou%g*(>!X9q9pA=+:p%e%Dq=aUZp^Zi_mHj3-nau8=ch?>^:&
++bh!QY6]!\FD8k5*s*i9]d`hNIs?&-+?`!uV5Ds7+Y6jlZ@50)YP=q"jm^oCqtPp\++=h]<1;!#
+?:Z"99Z-B6rn=antDcj8AMsp%S+Lo(;\Nrq6Hgq"aaSq#C/"q"F=KmHjB5n*B3&nb:2jdLcH\2u
+kH/&;B35g"3CY\^oNXpY"d-hu2gh4g=qd,QJ8m'G:oV3gmI`chQYkq#'s^q>B=Piq<)uln7,bq=
+it4me5Z%!!3-)'+FpA!<N<'eGp$e!=BG(qX47Mjmi'7p\+CXp]C'XnGVbdn(la`rbS&5!!EH/!s
+&B%!Qb<`"oo\Gb2V@TqsFC_nG_-b!#5P^!!3]3,PBUWp?D,8q=jscrqIo<q=jRRo(;_SqY'H,!Y
+kbD!>#PA$31/>K$jSk`Uj&VkPt;Ko'u;DrqQNf!;QQh!VlEZq#C.oq"F@NnF#c8oC;89nFPN:nX
+aT1?9*:WQc\IWmJ,-'f^J7_s5`A;ht-#/?&%\H)BT^p!!rWPLZ87,q=s7Fq"j^Uo_.AEjmi-,oI
+n\0roX.CnGMD;<bE$HquH`tec63_!"8i1"2N"AqtB@Fn*0E:q"a\"o(2JDna>c0o?dKK"$HVu$4
+7(E!s-FB*sDcs%JK&9r7oTQhTFF%XT0+>('"@>!!(uts6AnIlhU;Xp%S:YrqJ2Co'u8Bq>:!^i"
+J9c$ignF!YPt`&Lpn]m)A_sdd6qpnaQ&>p\Oa^q"X[]q>'g[mJ'o[p%.bBoCr"NnF,i+o\TVtmF
+:C@k5"K+lLt,:s601Hh>#puqs*_<R[I"83XcGt%o@>4]CGpkn*AKjo(VnLn*]]/s6/\=mIDR'M>
+HB/p"T<3r4pc$!rrJO!"T25$NU>0NK)ljq!R\?l1=WDq=kcon+-,Co'c#Hg?VE4#T"0^$4-q?!<
+</A!$2PJ.JWW$i;`<BrT`_FoEu01"p+i,!=60ip##'2oD//6oCr.Yq"FO]p[dkBnaZ)7s&"L`%1
+*@A!!`K-!WX!\q=s=(m/5`,n*fc<q"spep]^Kiq>'g[nb?Jcq"aa\q"OLRpA"CRnF6#Cm)f:^nC
+[^-q"3_3p@I>)puh,1g[3bhqXX(@f#nuaWbH6TQJBd\qu#R&j8&34nauGAmHs?/rTrJ1n`LZe;=
+a/1s3CN1p[RbY!"BRe!"B/7"or1Aiq;p0p@n.RpA"IY([:;Uo_/"Oo],YK'GLNb!!NQ2"9JT)!l
+k9\H"ug?rn-JiiU5mekjC/1!!!*$!!*[JrSco0n+cZ:oCr.Yq"FO]qY'LLnF,],n>O;3!##D6)\
+E&N('PmtiT]LPlMTfDn*ff?qYU']p@n@Wq>'g[nb?Jcq"aa^q=sa]qY0UMn+?DPnE9W;k1%rXl.
+tIqrUAb,oBu5>lLaH4mdTH"mG\-8mX&\TV>'HIi8j1co)JOQmdT`7mdKZ3o^Cc/ptunn*rY$UqW
+Ie:lL<U8!##Xa!"B#2"TUVDnGDb?q>Ks[pA"IY'C5&So(D_NpXB.N&H`7?"p"`+!r`3#!m(Ea#6
+gL)o'#l<q![\JrUT=GEWc@B"98Q)"sa0+pAX4Hq=k'bp\F[bpal7;p\"7Sp[dkAm-?;)('YKS!!
+WND!!!+6B[m(DoD%23nauVQq=X:KoC_kFpg3^iq>'m_q"Xa_p@7P=pAFIJpuVJKs7Q$Hk4ST=l0
+dj,p@n:Tq>'[Ko^Uu1nIO(JcM-qpmc+'#kPb8Hl.taomdBQ6oCV>4o'?,Kfc:%sq98]hrTNA5le
+k_E')hk5!<N<'f)PjR!s/B$#o"-Drq5XQq!RYFq"a^bo_n=ioCV(Q+q"A]!#GV9!Wi9#!!11A*s
+Y3WjR_]qrVH?ZnFuA4la?s!$O?_B!<EM[n+HYCnG2hZq>U.FqYBmYq"OOYqY0OGqXsKK(DI&i%g
+3RH#6Z.[!s4/8iplB\oCVbPqtTaLmdTf>pA"IZnb<.Zq#:(sq"OOUp\4=Mnb)_OoCC8_h!s[snF
+uhNk3;R,n+u_Jp$hVNmeZtJk5.HFo[W=%m-aoGi9'_'o_J%In*]W6o_/%Kj7i0AmD'AH!i=H:g@
+a1fr8[Ib#n.(>!!39+!nRD_!<iK(!<`E0dI6l$p@.>;pA"IY'E.e$naGo7nEE[N!$2pV#Qb&0!l
+P'[OoOb5q9S[(qX3P:nF$/3"pPeN!#GbG'!_Auo^;;Gp^$fnpA"L]p[e1ZpFGq*jk]pgme]-W!!
+36(-j0MM,QJ#K,]1s"gA:L9q"jm]n*03+nFQAKq>'LSs7mQ-p\+=LoD&+SoCV_?p]($[q"jaUqY
+g-XoD\GPoDeLQoB5Q;l1Y/>eG*KnmdfQ7rpfUOn+cV@nFl&;naGr;p%S4VjSS]Eg7nWW!''DkqW
+Hu-pWi[7!!!c7!<WK/!s.!R%Klh9#7gkGX5!CCp$D#CpA"IY&+]V[p#tnjp[f7%$3D"E$I/YL!@
+\`h%MB$I%LiF3nGM/+k4S<7m-<m%mdU/T$P=H\'EA.;F8>V2lhp;GrqHQjq"OUZ0DGA=naQ;Lp@
+d\)q;VMb)?9pM%0ce4!?2.C%>FfRn+u>:q"OUXjS&BDp@@bGpYkoCnbMq[pAXePp@RqFo'#?*p&
+F<`.eWYps75LBkjeKDna>uCq"=.Dmdg,LqXO=<n*u8<!tbOKs4R%trT=%Rh\Qn-!!<E0"9HgK#F
+"?5r8IJHkk=fIp^cWZht-C0kLe6"!=SrA!!U[Kr;lcq,mFMT!']lCiUZF0rUKCHn*TH)kO\on"V
+:YR!!!4-p%S4Ko^VVRp]C9dp\FS;p%eCQnFcMFqrcu0lN.q(#m(),$Q13<%KI"A6d>N$cfk6#pA
+Y$[nFQ>Fo'u>EiV<6;q=k6co(2MHo^hYIrTuH9jKfp#nDsWAm-X*/q=sOLoD&+Ro'l/>p%\:Npu
+1T,I/sBh"a9\!khu3qpA*l:%0?M0rW1:E#AWPiroikKnb2bRp^cZWhspR3rKrf\$Om(I!WpaLqu
+Qcs.1-n!!YQ7K&sVMM_#E]nq"4:Sp[mq=k49K<!!WEF!Wi`jn+?,Cmd]uLp]C9dp\FS:o(VnKn+
+,u4kj\?:eL.)p?pGP0!!<9&'c.8Y8$'u"rV5L5nEo,km.'fEp@\.;q"aIUpd+B<oC_hOp\+CPoC
+;/=lGjM*iU-O:mdBK6q=sROp%nIXp%.bFoCMVDq;gc(BE/#R$mO=!lh^23mJ67%$3153b5_c(m-
+jf?ir8ZFq"a[qp\!\?r9+#M9*Ge6!"K26d/X7N!W`?#!%@sZ!!!61!)_M4pUp@gkjeKEqYBmYo'
+uE".f]tX(B=LG(u=69qrmSCrqHQjq"OUZ0C\]0naGu6jQZ^2jG#kNrqbNdX/iJ0Y/]e:P0Lt@ip
+bXAi;N!"rT`qKrVZQhqr.>GpA+Ibo_%tWq*"NHnbDhFp\Ntcf[fciq!deCo_A1QoCr.Wq"OLSo'
+u5Anb_S6kYV<[&.&>ms5EkGjlZ@2]bLMW#m1/-rW1CH#864fnFt]9o_/(Up^[8umI^/8lk:'5$j
+cn@#1*>O!s/N&!%S'O!!*'0#8eVuq<7\,nb2#<p[n"En+-2JlQ@JR('"aC!Xo(D_W:RVnb)nV!r
+;Wcq=lW4p@n+GnEf5tp<<)=P2+m\l/q-nnFcRorVZ!Xq==@Sp\+CTj4<#Hlh(&Mq"OOAq"ad]q#
+1",p\"1OnG)bCnb_c/Xk*@<p[[nIp%J(Mo_A=_q'#P,oC22@oDA"?lT5.Y!Wi?Ohn.tClf.^4j>
+?oI#m1/-rW1CH#7];SkPaB;nb2bRp^[#ime#o8d/j:K#6b/3"OI,L!Wi9#/-,kW&-iO\#!l/Uo&
+B90jSS*=na5N#jm)C/gF=uZ'EAF>$5!94SaH@Hnb)nV!r;Wcq=lN3p\44Ho'knule;A'e+!1omI
+]u4h:p`Qjn&#cnbI,_3BouTe,S@_jmM^1rp\>1*qo@&p@\%Hn+cAEoAes$k?rGjqWd_Dp%J(Mo(
+2PLrq[`4q"F=Kn+ZDJo',Zo"Vh"=(]gb'kP=T+q=4#f!!NJJ!!a.Ep>l8?q=F=Tq=kKgnF6,/qQ
+L,'$31)2!!38M!!!&u!%\3V#Qau-"os1)g@!qhptbZ2p[dn@ki_0qmG_Gc#71AA!"BG@K6?h\r:
+0IZp]C9dp\FS;p%eCQnFcMFnE^&5!5[=]kjeNGoBkr7rU8hIp?:+O?p-qJ8uVd[ioon'oC;>?iV
+<6Cq=m8HoCV_JoCDGImITu3k3hDt5k"I/nFQDKo^M>>p%\@ZqYBmZo^_PInFQ59p)F8F!X0AEA6
+SHsn)O<5n<s@X!<*#E!!Wmer8mbDnFcSPp^cf`oCgc7Q3[[,!!!9)!t!0O/-?+`!!<fH-0j@YqX
+"%ViUca1qYBpZna5W*pQqNd!!=&<"9SX9;X`lFnb)nV!r;Wcq=lT:qtT^Np\OU\ci2/rmdg/CoC
+D>6k32*Fs3frb3<3$=GItjm7'uUPnbDtVp\3V@q=j^["7YmRpAXeMpA+(Gq<mbJo<ob:o]#<1q"
+XILmdToEq>:$`p\"1Mo(_YAnETfa#6P;9!"9_Zg\(!qrpB!`"98N."p=tQ!!`R6s5ib<kkk)Kq=
+t!Z"lSe9lXpUN!<3*"!'(&f":>25'+G?g!!6BEmHaB;o'c&=p\FUWoCM_Sqt'.Qk/f^o!!iQ-#6
+5>]g]$X)s7>CLpZV;FrV8MLp\++Oq![M;p\FdWf[^T+rV,gMnFZPQq"=[DjiP[J-J%tCq>KFUL#
+VRnq"O=Inb)eUq=jXYq>'1Js7uZj:[\)Ul/qg?lhLMYna?/Kp@n+Ip@Re>n_4l@cM?nbp[R_Ao(
+MnTq"ORZq=X7BkO&-=iSs5g!"],J#SdjMMXg#^s2a7"%hB!K$5*@>#giVW%jh/QhsK:ipA"IY#P
+n/Wo'YaE!R:]F!WN-<!>>GH)Zp'D(DmlVV!%@4htHX0n+6;Lq"jdbohk>Klhg,>GU`^s!!`T.*Y
+@c3m-+06m.L/Fp%S7Vq>'g[p[n=Xmcs<9q>0(2VHW0[nE]W<p\"1QqW%#Cj6pP.3$jK-+WO#6h<
+=:uo^_SGrqQ`mp\4IYqW[eTq>^6ip]'q_n*p#Fp\":UmITl2kk"ZGqXj@Oo^D8Ah^$CQna,6/na
+Gu<pA+OZp\=R[p@7J4rUK%3p\IPb!tHCQ$nVGbX7GQRjm;bC?3gN6$igD5d/XCS(\ILho'cJLq"
+a[hqYTLNnEWR%!<*#j!;Z^W&-*=[!rrQ7"r;.$k3_m/p@@\@oCr(UrVQ?YlKIR%jk]sG;@s*5"o
+niT!:'+?l0.X,lh12Ep@n=\q#:"GqXs.9mITu;jkY$FlKI^$o)&7Qn+H\Tr9;l+p=?TrJ4uN<aR
+]2fkO%g1o_A@TnaZ,=oCVb8peLJJnGiLPk5+N?rVQBZi6V;mo(DYEnb;65V3C95lM'i;nFH;Kq=
+s^Zq=s[SmHXK9nF?>=;@<I0'a4RR+;nq[o&KH8n=dSt!!3<(&'k4[$L%$UmeH_Rq"a[io_.DCo(
+"[@i;iiXo)SdkHN4'K!s&N8#lkDN#ljrMT)JKUo[W[+n*flBq=sj`p$Cc#m.KDaqqQWZ&cr%6"!
+@TKqX!V.nFY`/rT3\Ep@n@Wp\4CUnDrQlmHi^0b>>)5e+W5$p\+4Lp%nCOiq;F5p?JcF9VoD_lg
+3`sm-jK:p@n.KnaZ5Cp?;98p@n=WqYU3gq"=.LpZ19,q<d+qjn&<Dq"""Mp@.SEmqI2kmdp)Dna
+Gu<pA+OZp\4IXp@Ib?o(2YFo\j3W!#,ML%4==?7`4`CnF>qfnc/Xo!WWt^!!``8g?eh#p$h\Mq=
+k3dp#H#@ocO@q!<3)u!<3)q!,hl>!<<0)"9AK@"99GM!%EqkdJ)GUqW@MBn*flBq=sXUo'>E#nb
+W18mddoB82g\T!"B?=o^DD7p%RJ5qVh#:p%J.Tq"OLUn)WKmlfd=-cR-3sh#@'=n+$/Jp[dqBk5
+WT[dEnZNn,)JMrS@J@"RkmNnF$8L"8M`jrTX+RpJ:MQs7GXOp$V_PnEf]@q![D:n+-;Mna5i8P>
+tQMoD7nFn*ooAq>'g[p\=OXo^_MGo'P<2qMk_!('#+Qa3Z+SIf8Krl1Eg!&-*(=!#!WY#7V'Zmf
+)>@mIp>Mp]^NTs6fOdhuE`Xr;Zm"!X&5u70*Gk!!3B0!<s,='d!DjJc4s)kK`#cqY'LKn+6;Lq"
++(Hmd0B6q"`e'q=3I>X<IfJ!#63]oCVVKp$;2Bkj\-6p%S4Zp`B"jlL40'n_D_*jPon4r:B7Cq#
+'mTq>'(7`r#f2s8Mm(kJuHWp[n"Go'l#0nbqqYo(2P=pfI=fp[n%FmHj$8oBcMPgt_/VkjS'1o_
+e4GnbDnLmI9VT/hlJSqWID;nFH;Kq=s^Yq"XUWo^hJ<p#>c@a]AHU6_<!2g,]3oq=X7?o^^[3!"
+/c,#Q`<Q"pt[3oD%hOp%\=W#5R6XmJ6efg].BW"9nT$IfTWQ!!3E2!>,P='+lR@bL5SNs8;`\f_
+4n)n+6;Lq"FCPo_%nImc*H_mem+0r_ih)!"T*;p?D>Blh'o?o'c)=o_/%Sq"FIRmdTl:jSYj^-i
+W*"q"aROnb)YLo&o]9p$;VFgV__/p%SFD`qoE"o(;M?kjRs,m-O--n*0UKq=s^Wo'l,9l1XK7rP
+j>.3[bUG'MPM#p$hJDp$hMFo[j]egYhtlnaGu<pA+OZp\4IXp\+:QkiVg3ldYF@r7f]ggXH0$&.
+YtMmI0'/fW>8\!!E9*d/XCR#(lO4p\=d^q"a[inFPH8n,EA$g].BX"U=c&IfTWQ!!<N5!?)1F!!
+I`FlJM$gc.VIWrq>pOn+6;Lq"sj[q>9sTjl-6uiT0.+rcnJY"9]#FpY>H,iV<36q<m_Bo_/%Sq"
+"(Jn+$)<i;8(V=8_^Oo_%qPo^VGCp[IY@r;5a@rqcWZo$[$gqYKmUo(MbGlMLGQp\4IYq<@\RpA
+amepaGt0nDs62L):*p!X8Z*,^[]2oC)8@nFZYTm/[48g&::-n*ooAq>'gbp]("4p\+=ZgZe%f_Z
+'0%q>0mNmJQ*4!*E1Yq9A?go*YU"$NLL\!!`N/D=uZWn,)hRq=k3hjnSQ;p](?J!!*3'rW#:e"9
+ef<!rrf5!#64X!$;3Hqqf`_na5lGq<7SMrqZ-QnFZ2?p\=INkMk[np\=:Ck3%j,&L7>V'@,Iolh
+T?1g%5"<q)\<Fp%7kLp%A1Xldu&S>D:K!l1t5OmdU&?k4S`GoA8Zsf_bI+g#)5mr;?Qij4`VTiq
+)?qjlYgrp&=adq/Q3(p@eCYo^_bRp[@qGpAO^]rp]XWkjmHlkl(5?m.L%D"9SW</L1;tBA<:Vna
+Gu9m-3cn1_S@9o_J:Rmd^&Jp@.nSq=O.Cn+,u;n*fc8nac2?oCD>5infdt4pq54ch?Au!"&`2!<
+E0#!<N<'h>dWY!WiE%!!WK9D"@,joC_nSp]pQToCheS"9R6V":btS$Np>-HO'TO%iZ?&!<=4$LZ
+IdRfBMejmeHJ;mIBlAnF,rBoCMM@mHWoum-jQ<na5]0_%-PN'b1=goBYE/k3)%'p%J1Vq"F@Np\
+4=MpA4==p-:R)i;`6,q"O[cp#P?5d,OZgr;Z<UmeZtYin3DiiTfb&s7bX@q"=4Hmf`1Qp@n@]q+
+USXp\=LVp%\F[p@IM;p@%VHkjnK@s8;cQdJr_'q>@NP2@'9_#8opoh>-a6nac8?mJ?<R1QV;*rq
+H!Onb;nSo(`%Vp$qM@o^D;KnJ^ocn*BB0nF,`-ji8/Y0m*3TjkfJJ#lknE!WE*!!Sd\S!WE'(":
+A`3oCD;EpA"IY#P[NPp\"Fj!SIHb&JlB&%0QY2!WW9%!"oqF!'cJ;h!a.jipQ@%lLOH*j65n!md
+ToGp@@S5k321#oC;;=o(2GAj#-l;+Vau,gXYQbqW%>AnFQAKq"=1GqY9XLo(htEkRJfUlhL57jn
+8E-h>dL^eFNS.lJ^n!iTB@jo(`%Rn)rc]d+R"-rVZKao'l5Bp@n@Xq>0p^q"=@Vq=jUWq>BaVrU
+fj\m+:_+l.t1dqV(]<iV*<&gt0??Upeb@s7c0Uo(D_LoDSTRJ3`u-0_Y/.md^&Kq"4=Uq=jLOo_
+7eCoCVYEmHa$&md]l<n*TG/!##peiqN<KILlK#!#O5errN*!#QY/2>kI^Tjn\WFq=k0do'uPFmK
+qMG9F2+>()Rbr#mpYC'EA:Q$;@trrn$N!r9s=Nm-F00kiM'rn*ooAqXsCGl0@[,pA"7Jnb2bMmb
+hgi!##tF*H-N(q>0LJm-O66q"T%*nEouFo^D>Eo]t63..??\rq,gUqs*&3r7^#gj8/90s6'=Eg#
+2>XWH(9e-QXg-JB70Glg*s.pA+IXq>'m_q"XLTq>0[Im.:8Kq>U']q<RtVqs++ZpXdmdq<IPGkj
+d<cki1L\l07m3nF?5Iq"F"Lf%(lQrqtpKn*]`?qtg'[q"a^Xp%S=Nnb)YMo'GT.n+$DK&b>J^pa
+e6):##R6nDG,i$ih-r!!!'!!!r]0#QRlspZCB/pA"IY#OV<Uq<?fG"5*Yu!rr?2)^#t-&HE:Z!"
+22+\GZ$Ug&17'q"jaTn+-&;nFH2MoNLt`nF?)@p%J1VqY'OSqYB^Jhjk/b!##AT#:T?5iqVO&lg
+OK?q"=1Fo(VnLo(;D4dMFJ-j5Tt,q;^iAlcI`UroN/6m,Rs>p\+=Xou:_b!!NH)!!>9;lMg!flg
+a]Fp\=R[q"XUWp@S(Rmbm!dp$(r;lKdioio]+Ig?nLtn]nSlm+UM"al`Ntn*frFoC25=p%eFXht
+6O?!:9aInF#c9p\Oa^o_84Xp\+CZnFQALq"*q=p\4CTo^_M?q:`!Y!!U+(eB7Uq(]X]i!!!'!!!
+i]5#QRiqp>t0(q"a[il1sE4l/3Ecf`2<_!!!-7)AWeu"9&95*G1nqp@RhAmH!p9q=s[Vp%J(Xq>
+^6hpKm@\pA4[_q"OUZq"aa[na5kc!"T&G!=]#=f'V/gjneB6o_A7Vo^_MGq"4.JmH(]C2WO#mmb
+d'igYD]*ki;0]kiq3phsf[bjnSl+@K6uY)A<>U-ZSeLnF#c9pAF]*p\".Kq!deHn))m[p?M/?lg
+=0!p&4=Ymeu/)Vms:cq"s?Vq>0jSkN1jhp%%VBpA"FVkk+B@!Q>$-n*fc;pA+R\oCi%Wp\+CYoC
+_kRq"=4Hqtg*\o'l)7qp"EP#S0Q'qrR/Q#65SE!!!$$!Wh-X%KQV2!!*<5"TV]qoBG<0pA"IY#O
+qQ<mIBTo%+tV*"9SZ*":Gk[,UX0-0QEbrf^&S:n(m1+p%7qPq=sa\qYBp]rqUF+p%J1Vq"F=Mp\
+FXZo^h_Jr7qMi#R^_;)@V,hlgaW=nFH8Iq>'g[o(_tKmdfr:Ed_T^meYl&h>cZbr:.4p@VN?Rbl
+>uHmGQFFl-OMg#m:5/$kl$iq"F=KnFQAKq>'gZo^_M>q!./<p-e*&kkjlCqsj:Nk3h9<r6NAU+=
+BN&"<`'aq>9RBmIBZ:r;$$Wo_81Vp@.hBoJE9<lgO?5oC_kRq==7UqY0[Vq"FI]p`T>)p@n:Qo'
+l)8mIfeq]2B^VZ-r[;?iU0E&HDe4"9\e`!"T)3!s&B'#nI%@@digTlLjlGq=k3kq8VUnr&"l7!(
+mA!!<<*6-T"jh2j!D%kP4]@iTBe1jm_a0q"jd\qtBaVp\F^_q>:$_o^VD<me6GOp$_ACrq>Rs*>
+AJ\%N>Bip&*bGi:?O6q#1&)pA+CJlLO`F1T@,EnakE3f^S%mdQ7MUCfYH_28H]pl1t>No(hb/`3
+Z,5YcG_?naGl4n+6;Mq>'gZoC2/6pZCT3rUB(@o]bi:lg=0!g&Kdp<EiSBpA"7BO$9?6lfIR6pu
+U]7r;$'[)u9@*p@%eEr+hMcg[Ob(o_%qQq==7Uq=jOSp\agdq%ihsnF,f4mdKW:ji@.t)*SlthX
+Au3$N:#/!<WK/!s.<[%flb7!<<0.&-*)Omd9W6o_/%rp%\:OmH`omq9np1f!P__$OHt<!!!$$hu
+NcX*!-6J#mqE-Q`f?9rpo@:lLt/Op\=[Zn+$2Mp[RbJrqSePo'br?l"2%<)ZU-Y(''NHqq(`9na
+Z8Iqt^!]o^VP5n+QD`gr]Kgptki;c0C:G2UCLbnDq?<1C`R"i9T]5h9t'Er:fR8g#2B!gYqJkqY
+U*_o(DhTq"ORZkO@"$j6XpXDI03m]%$cLpZ^b[DC/>oeFqP<Rhrp@lfRBunF#f?q"OOYqY'CAq:
+>'.W@.?$q"=:Qq=sUOrVHNh!r2TerqQKe(Amjto(;SFn*KGuj8N6_.0RccX8k!ufDkpS!WE'+!X
+/f7!IOJ,lga`Cp_WStp[[e@lK%]hk?;++!!W`7"9AK&!<V3[rW*u?"9o,=+tXnqk3V`rm-F07p$
+_DEq=jRTp\=OXnG*%Z>PRp`n*U,BS-]E-"pG)2#X%G@n+Z>?n+6APqY9p\o^h55p>QGEiUuF0jm
+q^7lp"`=s5Lo[i;^Lk'[Q=>pA4FJn+l/6o'u)1kNMg?q=jLMmHaE=qYL$_pd"ZTp[m1(.jY`l#6
+4oDNq_boiTBe4jbb]+*rlUSC[BaMoCDVJnF6/Gp@e7Vp[RVFf^nOB'^tD`o^VJDp@\%Tq>U0fq>
+L()mdK`@qY9UHs81FDp=:)r!"l(-"ChE`f`2$S!WE'*!X&]/!.aS,m.'cD'(bkmp%.eElL+]L<F
+lFN!sSl0r;Zfui;iiX*!-3G#7(bD!8IA,k48*5p%S"AmeHSQq=s[Wq"sOTBDM>roC))Bn(@[P!"
+f53#7(CXo)/+PoCDPKq=aFWq"OCGmIn=1p%e(3q<[J0kgcJdSZgl+l2TAe$<H$XnaZALo^_\7l1
+4Q>m,m@(p@@Y>nFZGJq"jj^p\=RPe,Rps!#5tD!&YT0.A-=do_n45l/$R`!=Al.Cpj;uqXjCRp@
+7\Ip@RtLq"XLOpttl/eH"V#q=aFPpA+U_q=sg^)#E[gnb)bTp$q27kOlpn.0)C/fBQ7<#o2+n!<
+N<$!"&c1"TSO_mdBK4p\+@onb2eQp\=FMiTFY[#QOo+!Wi3!!!2$Yr;dc;"9eu0,pZpsle_O7oC
+DSHnFQMPq"OLVp[@kWp\sr-p@IeAlL4NM)upTO!Zh=REVStir;$'[p\+1Gqt^'Yna#k347iC:i;
+)a,pAO^1[16ZMs6Yk[)gbc`mHEg&n*0'&oC;87lKn$3kN:pjmIU2RpA"IYp%7qNpsAce`ucK*1F
+<n<#(uLBhs9h"mIpPZ-MRGah;@AImHEg(o'l5Gp%.bGp\=LTq<@h:mf:Q.mdK];p@n:SrqQEes7
+cQgs7uZj(A74eo_A7WkOSW:fCO;/"Yb#DE.Iulf`;$QrW!9+!sA]+VXF!BnFcMM&+K;hq>'m\nG
+LN7"TTDR+o20=!T=%V!=f/6";Vsu!3#qXhYHR%mf)ncq>9jSo(`+VoC;Tip@n@Wp[n"EjS&L64q%
+\s$5W[j(X17jq"FCSq>'aUp\4IOp?;-XG3A>]nbD;>l/U+ij7H#B!"N70[eo.\mI'T?nEB64qtB
+OGmIL#Jn*ff;o'u2:p%J.QnaQ)>q;U]!e9Z$r!!"qt9T.HlfBqeip?L/UiT/GPiq3-7o'GQ'md]
+`7p\".KoCr%So_J.UjSg@"rnlf'nal;<lMCAVq>U0hoH!Vup\=R[p@RtKp@[qAq=NG!s7kM^/H?
+$^^81iFf`;$QrrE'"rrNE5#fH3)nF#i?p^Q`dqYBp]o^:4W!#lm\q#LEqi;ar$!<E0#!<N?J!"o
+Ye`Ur?`kMtjsnF?5Mo^;5Dr:f^Nq#C'fpjVu0naGoFo8J/3!!!3'$5W\aRcNr*n+6ARr;,pRp$2
+A7oJNl3kO&6Aj8.a-pt+i\p\F=Yg%+k0qt]gTqYg-Tnbr"Ko_JF^p$hSGq>:$_o'c8Fp%%S=mdT
+6'n+u>.pYl/Io(i:`p?gu/oD&=bo]Pi<rpf@Llg=H:nGi,ImdKfAo^hbNq"4+Kqs`nJ?Zl2)lLX
+fGp@IhNq>'gZp%7nFnF?)Ap%J.@l1+THoB"]^p;?7^hu("L$l`ZaV]Z2p!;lj&%Lq1`p[RV=p@o
+0fpA4RYp@.>>BEoIk!"BP>!;llV!!*-%r;ciu(CgNb-NITRr9<J5mcNHkpA4LSo_84Wp$qfXp%J
+.Tp[n%Gq"EppbmFUU!<<H2!&$_%nF#`7p%S.Ml0Rs%qr72\e`lPeqt&kFqq(99f_rbWkhb^WrNu
+7dp$hMGp[RbGn*]`>qtp$QmI0Z?q"a^apH\HCmd0?0nGE+\kM6+0f]_bdhULBSnbMqEjmMsCe*u
+hohX(%7q==(Kp$_DCp\+=Tq=jFGmJc)6m[co:mIBiJodKV4q=s[Uo'l,9lg*s+nFH2Chr3bdo'k
+l%c2ZW"eD'H`qge_s3g0g"!;uru!!`l?l0nB;m-jZC'(GVjp\"1Hk4_jU+TN#U!<<*#r;ls"i;`
+l[!Vud3-Op,2/GePknGDq<e)C)sq>'gZpA"LSpf-q[p\=LUo'lM>hrt(?%LN7Y!!roJ!:0LTo'l
+/9kMkUen)F9'nc@kDqrRJ@k5+l&qsEG7q=aXOs7jS3b5;)(l14`Hna?2AkN;.&p\47Kn*]TBm/Q
+lup[dk@mdTW,oC_q1q;h5Kp$VeYp\4OQnbi.ElMC,Mh=pO7pZCo.lL=E7o(i(Tp\F[Zn*&s5f(.
+h@.-KjZkN(Xbn+QMLo^_J;lKRNrlKms.nabr)gtUiTo_@55h!!Geh<M)c#m><&!=IEYr;lou#6b
+A"m.^,=nFlYUpC-cfo'lB/!$VgO!sJ`(!!30&"5!Sh!Y#eM+eF_dmI0]<jQ#V#nE]N8q=aCQq#:
+*hqCh[>p@S%Oq"jjThq.?6!$qa_!s05f(:WkekN(LeiV`-CoB>l9WZU6hmbm-uqXF=U#Pn)an*f
+i@q=3tRnc\UYq"jmXnG2nMnG_uLo_/(VqtB^RnaZ2CpA=gYkP"cQs6\b;mJ-,KmJ$AMp[ID2nF5
+c>o'#9!qtn=^o[hj\rU][9o$?:Zq>/!<";<9o!!*9/!n@8U"![O)s6JhCpA"[Xs7-Ndmd09)?iq
+,J&JY0FquPIN(BadF$ig9(/)g=!eE6,hl1k)Nq=jUXq>'RYq#:(Bn+$#Ao^_M?kk"-/oeljm&-)
+\\MRJl>mC_fSo_S@Ml1so=md$*,lLjf4l2(DOq<n=Mqs=CMna?JPrUp<eq"aaSq=aXZna?JPrUp
+Bgq"aXWrUp3a47_pugu.;sip?+(g[=D$me?JNp[ID2nF5l7kO\`/\(0:6kk!^+g>i.^q"N)/ZMX
+OM'*/XF-NF5P!n@8U##OpPqXj:RpA"[]')2+moC;>IScAfl!t5>8!s/K(ec6Kg!!!?-!%7hYaT'
+NSo`+CDnG)bKnb<%Qpb2+,pA"@OlK7j@jSAe,/1GqVs6/"0BP)Ki_9;N8r8d)4nG)2/D/8+pkhb
+4`mcO?6#O_-Uq>'aSmd]fPrVZNfq"OOXq=4:Vq=sLM:]:4fq=s^Yq"FLZqtp6bpA+RLrUp1io$[
+@3i;<HJq=jXYp[ID2nF?2@k2kstkPiH\LL<+uTrIt]a8GB*]>a4,NtW-1"TSN'!W`9$!SIGX$(L
+SJmJ?PMpA"U^%J]Yho)HrF(_m2\'*/-_!#Ge=!"&r?,6e.0rS.#%nFPl2oCVSBoCqtTqt^6g/,/
+W$ki(sJh<jRXpugbV.0CGC$NLQoMtYHZna5c1roW6/CP7S%JV&c;L&$3'J:iZ:N/3+:nUC[rKnF
+u.rdafonUU.Z"GVV_Jq<oO7t-#BLPLP6IWK[FN,s:QDhm0?i;<B5me?JNp[ID2nEK?,r9r.tq>K
+OE!%7)M?nMUR=L[%rq>1'$qZ%0H!!<3$!sAT(!SIGX#1rY6i:cd3pA"[Zs7?TfnF#\`aW:Qoc2\
+Xd"U,,2#7C_EFkl0Vf%o`kq"==Sp[[_InGiCcqZ$Bkpb2I<p@IkFnF5$/o`*n:amSm&m9gG)+9V
+]^BheWXfDkR5kPji.0L^;:I<g*dI<t[6"abZHIXQS4Gli>=H2`'_H22[[Gk$%\H[9u:GlN%ZFa/
+:`IscK`H?WkQ?",RCDq4OFp@[D8p\4IWnEB-+q"3%up@81Q^W$3X=+4di/dk'cVu=3KkioSD1fF
+Yh#ljr0#QXo+fDl-?oBFrtmdg)Hs7R#up@\%InF6I%$5OL4/-Z4Yr;ZfufDlZf#7(;;!"B2nNTC
+->mcX60kj.m:p$heOs7u]i1&(D7p$hD9lKdj,o(;@sd*hsGi+XbG";VFb!?;n:+8OpIqY0UEq"*
+Q5)#sX;!<</p!<3)u!<3)d!!30&!r2id!UKeY!<N<&!!<B.!rr<='*''R#oe\qm/?VEp$D_Qp\=
+LPkiqT\s760_bG.HOFoW?m`6e2OTmi+(;YJW'nGfW2f`Vs"!WWQ:!rrDU!!X.om-!9plh1&Oq\/
+i$p@Rk;UFnD(!uMU[#m:8/!!1[O'a+aE*!.,\!]$CEme6#/j5T.an+?>Lq)A$?p%7hFnaQ&:n*]
+T/lKS38q>0[;=VV&M""+c_%k%qg4[J5jjmDR3m-s`2D?Bq@!X/`/!<`,t!<WE%!<E6(nGiOiqu?
+`u!r2id!V$-i!W2p"!<N6%r;o7c!!E<&('"e5gXPZWn([3noCr"Sp[ID2nDLoM/fOd9$kj=MK:W
+AL*e+-^f`*$&p%@>/Pl(K&9b[[0%MAsG"PEbZ=krN2n+Pu<p]1!dp(R)hnF-;.r6X%K!%8a$%L3%
+8!!1aQ(D7&V!!"#>)]K+a3XV,,o()GFmH3Nsp%dhOngs>#n*]T1qYU0do^(Yqqp_uU*>\\d#;,u
+d!"]M<$35UHm,Rs/kkX`4p?.\=!!EB,!!!&o!;uru!:^*i!WW9!!;QZc!:^*i!WW9!!(R(k!<<*
+#!<N?*"r[IC60e46kPF99o'Q2Gq"O:Al1"V;1S![Qo(Db1O$jB&Cl:*6j5\]W!XSl;1U5lsqh#[
+e!"]kN!=.9X#FsrRmf*+Eo(Mh[p\=R`p_ibpjS7TlrhhFi!&ss,&c`IF!!iT*#RCG9huHdY!!!*
+-#6>SM#mLA9FSkLhmJQhHlM0rDoBbi7o'Pf.l0e<DqY/P'na#N1jjUD(!!FD["9T8:"U5GR"TT5
+CioKt2qs!M?o(;GHE!H@F"pG)0!<]"q4TYT`!WWQQqXF1Ap?28AqY^6eq!mFpag1Op/L@FCq#AO
+jokO_3I@__0s-##-^qf<.")UKLs-Efr!!<ts!;lj.!!<E.!<io4n*TW;oBl#?p@n^`q"apa)>3O
+_nC6%da%67?*#B"m":G2B"U,PM!!!Me!*0+#!!<N4!<E0#"pu8Z_WTe;qZ$3SnE9B=qYC!^n_i^
+&mGQ[Qj7r<5hr!bnpnUao!!`K(!<`B.!!!$'(]YZ-j6c.'l/qL)p@J3&#QOo0"9JQ(!hfTY!WW3%
+!"("Jnb2;ClM9uEqt^$^p[d_4pfS2R)g_@ebNSTK>!rAKIol*0F>DJ;rN*.05@<*jJ.<q>!X/Q7
+k5bG]rVus'!r`0+1Ca$JoCh_<kjJ0>!r)KcrqIB(nbE(Ol2UUU6Snc[!#,\K$4[%9%LNFJ#5eK#
+!U'Lf!<<*%#mUM0!)!Y0-;<@CakZ7Kl0Rp2n)E'Wk3_g:rVufjp@dnBnD^cg,le;Q!#-If"p,e[
+)@ZoX#9EqWea_nenaP]1nb2VQEX)RF!s8Q(!!/bn4ot]a!WWQQqXX=Jq!\"Kp&"OWp%S7To`+7V
+"9:J&%Ko1!p\s"?#[/[sk&tdQrTaC?LfZ+*qK)uV#n[sUkQ(M]r;[<3!!3-#HURMsoCh_<kjJ0>
+!r)KcrqI?'naH)InDj0(Y)XY+#TEaN&HDqF#QP>NqZ-TrkPu"l!!!*-#6>#<"TSZ.rW"#P9V1&3
+p@\.Vqsin6o)/FKf%f]_g;11S=uR<&$m5TK!$).G(^0pA'GCHJ4MBSMm-O<7nb;VGme1Q'!!*-&
+SH(kU!!!'#$7,K;o()PIq"=@Wp[dtHnEfB2d.=s,!3#Y_L/f_hVrkTJ)L7p3*rnYtNUjc6X8i;Z
+!#c7L!!!Dk!!<<)!<N)u%0?M;!Xlr;n*TZ=o^;5Ap]C3bq>U..p$qS3o_$epq<-mu!#H+F$NL8?
+)\;uO$3L;0r;ciukQ!OB!!!*-#6=i:$31;A#m;al!!!`m@"6,GmJH\Jm-Xi.Z'L,[58je-!!il2
+!=g%c%g2k5!<<K+!#?Fj#UFung%ak(oC;YRnEf?0E!u^H!Ls-%!WW3%!"("JmdKc=q"FOYp@\FW
+.duNWk1oUbfiYT6aQ;t,C%]sTR/kd*aW9PHPna^N9I)SZ&c`XQ#64c5kl:be!Wi9#!<E9$!"9G>
+-0OC[nFQJMnalYOp]C3bq>U./p$r(?li-DDqsEt2+q=Sb+ohrR!!+)R!!iZ.!W;uu!U'Ln!<<*%
+#mUJ2%0uq:$O[ID!'CAd!!!'#!!Wc9":#D<!sAZ*!!<E[,T%'t!!!-%!=9J])%6NT'GCWU";+bH
+s46Q&qY9aWq!RG0olLb5!'^Mb!!3--,l7#tp$VYHqY0UQp%eL[n`p&Cp=0!/!;uWG_Z'_lg8=13
+orIohhPg1nn/232$ih"F#6GeS%0>\n!<N<$!"o;8"U"i,%09bsrVH9ar:oaLp@e7_p\=R`p`/ts
+o]#$'nFH,0htLda"rna!"[!q.*?kLe"U"ne!#Ye;!!<N4!<EK0!!30$!Y5VA!WW3%#:LDorW!T;
+'F,-^$ig8/$31/0!!*B9$RZMa!#bnI!"028!<<mSiVMNumeZ_Qnb2MBm.YK,!La!Q!WW3%!"("J
+p$VS=q!@eJp@S"OqY^0_g@iYYoA_j$g@t7%#L'CNdf@/_f+uctec1U05l_N"!"p7[&HE1Okl:\a
+r;[H4"pb>8"9oFHjSAZHq>C$Vn+QJM!r)KcrqIK+naH;MmH3g.o&p"Q!##b@('(M5('"pH!sSo2
+irBPi!!!*-#6=f,!!Nl>!!W?%4Tbij!WW<&!!j#>!WiT.!!!0."T\f=%flY;#lk,/"WSTl!!E9/%
+i7;r<MoHYm-<s.mdKZ?pA"1OC&e:'!'UGa!!3--,l7?,q<.J8p$hnRnaQ/Dq"X"9ot((u?8M9Fl
+F!<!47h,QmG%.mY2o/k4Wah6!"oAE"998D%-%=#!s],5#RCMXs6TCJnFZSPo(DtTpbD^BpA"L]p
+[e4Onb)SEo(`%Vcn,S:#lk#'a5^5/!=gFl!WWB9%06e;!!!'$":>23qZ$a)"TeZ(r;lis$3CMF!
+!39(!!*3+pAd&R#7(P:!<r].!!<K3!tYP7"UG,/!rr?'!!!$*%g=d$!#iE1ddHhojn/'(md'6/m
+d]=h!LEdQ"98K(*r5Tqq<7YLq"a[Zq>'dVmd0]@mHip.bqYWgp\rJQ0W_u4l2'WdR+^NW!8f2)"
+UY>:$OR(>!<EB."9JW%!!<9,"p45n(BFmN6Fcd[mHjK5nGN"JqsWt@n*oo@pAXgeq>U.=qYBmYo
+C)5EqXsLVosXT?"VUkS1?%3\n<@Q)"oncB('FUB!!Eu],o6gc!!NB+"pkYGr;[90#71\:!XTAI#
+Qb#,!rW5q!!*-%r;ciu"UbVC$4$_4!%&@17rtc_k47fl`N>J_JP$^aI*M][q=!n@lh0uCp[@VAm
+dT7h".'!H"98K(*r5Tqq<7YLq"aXXq>'dWnF#Q.mdfT?nUFG>deW937THM*bHk=Ps3C@e-NC3*(
+]XR;r;Zj""T/6,!<N<3#mCG6!X&bu!#>eD&7<fZki_0uk2l7,meZMEnF5u?pAOagp%S:YrqI`6m
+d0K?r:fmZrjMhq!Y>AJB_8UgZ1l5b_.Xbq$ipST)\3)N!!***qZ6]s#mCG6!sA]+!"K54!!361'
+)V_2!<N>u!&ju\!!!$'#n$n:!!3-#$mNaXrUB1MpuM;Jqtp6_n*9c"_Y=*&d*qOLm-sN>s8;Q_o
+^D>1K*7M@%g2k6!?V(3l1sQ=q"X[XpAXh6p@IhHq"X^Imesj#0>kB`s7/S-\bOgEf]^kQ&bk(,`
+sMha&d\X=!!NB+!s/K(rVus&!qlWn!VZR/+bJeNlL=?>na6/EkjA-<o^h\Iq"k!b2=pS>qY9d[r
+:01Dp\==KoCh_:D$'tb!'n?up@nL?gfkj#!Yu:K!rr?+%1W[H!=9&;"p4o)!#5P=#RLeC!!!35&
+./F<"p>#0!!!-1p]*2Q!sT&>$k3CA#o=Es2-?3\ip-"/q<cnkiTg"*mci9qr9Do"q"sXDm.0E3s
+7Z9`q""%;K*.G?4Tk`d!?V(3l1sQ=q"X[Wp%S7Vp\+:XrqH?PhtZ%0$G?**gq!L-pWV'XVSr3.!
+;#]?`;hFn!rrE1&JZ&V!!WW4$4RCJ!rDus!Vl^3"999VcM@,!kP+W<r:oOAqt^!Zp%S:ZrqIi3p
+\Xg^pA+X]o'l8@lKR`mq=%;j!&,,0n+OiQnETiKn][%f*!H0>!!3'!!!3#u!W`?)q>^Qt%gW%5#
+m(82!t#MC!!!?#!!<<-#6Xr*0+A7+3*1XIs7c9`p[IM>rr)`jqYBaIi;)[(n+,;dg%O\#o]PW<n
+G2nVp%@Eu!LEdD"98K(*r5Tqq<7YLq"aUVp\=RZq"O4HkkO]2rUN+)oDHl&m14+4i6:<Oe,SIAl
+Mi@f*sVZDrrW3#rrN]5"UGGD%0?M1!s8Q)!s&H$!<3)q!#H@M!%<ERrU/A+lJV%"nbDqUq"OOXq
+>1*c"82EaqYp7Tq>9gRnaG]*mc!(''Gg`dA`s*Mp<`igl^c;qs7PBhUNg66+UnV^$k<XL!WW6&"
+:#;F&J>m'-j^+a$kO'f)ZB^<#RUY-!!3<."o\KU$PWY'Q0/,DmHjZ<n+Q>8l1aN1nFcYTq=jdDi
+opF5qu6?]p@dqBoC2PMqXsOCJsHBK"98K(*r5Tqq<7YLq"aXXp\=^_-gp]lq>KaUmB1:^f'2GsO
+_+Ekc2ZqnlM:Cqi?o9F!"9AO'c%Jr&GZ;5'+P?W%MTm.!s/N%!!!&q!<3-4"9Km.kPjZDp>4Zgm
+eueNpAXjep\spfq>U.]qYBmYp[[kJp$_>?mc'r@((:2VjkTL_s2+0grq5L7mJ?J8hqci&Xc@=),
+Tda1#6kD>!!a)R+u2\lKqluap"HgE>VHB_"pY5)!&k/e!<<Q`?\-tklKdKfk4.'^n+cq_r:faRp
+\4@Po()MKrQj'AnaGuCq"=CQn+QMMq"++<JcV2<%0QY4!?V(3l1sQ=q"X[`q#1"5nGhtOrTrn0f
+[1o's7=W3Bor)dP'Igd7@_.V!)YC!!!39)rW)ou&-E(A$4RIF!!EQ5!rr<)"9S/p('+sN!&]P.b
+4P`$kiqI/mI9cCq=jRRrqIu@q=aU[qtK^Pn+6JUp\"@Cq#^[()?BF.o$%%*gYq5RjQlF,jlG_(q
+t^6d+nt[-p?h#&k3MI)o'khuhWst3q>:'_mHEd!OY6h@$3pY.!&k)`!!Xoj_"dBmr:ojRp\XFXp
+Yk**qs<eCp\"(Dm-aZ5r9O@<oD%PFp$qtQm/$JNp@.V4Jc_8=$j6P3!?V(3l1sQ=q"XX[3oBi"n
+G;PBkiMg_l)m6**rGoAmm9F/Sr#il6iZo@kl1(uTl!1L,Uk?)6Vq'$D0U\rRZVbr7g9,!oDf[Q!
+!!B-$5EPd^?kIeq"=OKmIL#Ip[dnRpcA0Cp%7hFn*g,Do^2,Fp[%\G%jCuo!;>X/n,;D4o]5E'i
+7coBkO%Kqj5fV"nE9B*rTsL<pAXm`qYp@XqYC$^n*0$"mIAfP<WEgS!=]SC!!EuS%0-hV((`m2l
+hoi*l0\$1mHO-1nF#lBq=X=MpA"I[q=s^XoCDJEpA"X_%/^#$q"=FXq!dk9KE7D>%0QY4!?V(3l
+1sQ=q"X[[pceE/q>]:5qS^5pd^iBq8GBLki%YT0>%]$&MsgQ,iVE0(Z?],%1,CdJ5tkHoD2Eh2T
+Sn\U9+q:1!>b_@!r2ft"p>#,!"f87Eo6fT^$,"_qtg!Wq#1!VrqQBbs7St_oCVY?me$#0YnRBE$
+4?.qk4&-,mJlhUp[RY<nFcSPoBYT-qY^*`n+G5mf^A%dkNV@$n*oi@o^D,2lgF9?q4pq_1'@XT!
+#l4W!&85Q_XIBhl0@U&nac2;nF?#9o(`%RqYL3g"o7odqtg*dpAk!fp'g`mq=aCSq=sIMjb*Z$!
+"B&2!WaA<q!%V<q=sa\p\6o7p%7MEn'0ns*]Z8cmdBm.=[N&0p@-kln+c5,j5/tfmH*Boo^;/7m
+d^#JrorA2pZUu+^f2!]%NGZc$i'c&!WE'4!<WK11i]o%nabQ#o_/%Qq"sjWrqQNgrqZQi*;Ajhq
+X3hPoYk,[!##>Lh>?O)leUXkk4n]Eo^i(Q'^kSdp\417cJId_n,N=_jQPjomI'uB!qPmNrU(NkW
+7^e9hi]_q!='#?$QD'%o)&F[nalJIrU29+o(;VEnaPu;q"aUXq>'g\p@\(Rq>0p^p\+:No(2PKp
+@IeKq=sIMjb*Z$!"B&2!WaA<q!%V<q=sa\q=m/Lrq?-Sq#@sJ5mDbes6A+;-9_t6hp(H8nc/%2i
+:?m9oC_bFn+$)Bna>`-kND"$me?VMqu#Q4%gE7J!"8K#%flb9#R_(A'5-CprTrY0nc&:bqYBjap
+]1-dpa,M"lLjB.pUZV.,6\_^'=ml2q"F=SqXX.Go(2D>lKJ!6lfIC(rqm?%o]b]+md0ZAp\+:Oo
+'u2<rph`4n*^/OqX`h*jR'FZVldbelh&QMeDB9Kn+uYInaGl7p%e+InF#lBq=XCQp@n=\p_WMmo
+_.tMo'u5=nauPKoC2PNq!dk9KE7D>%0QY4!?V(3l1sQ=q"X[\pa>_2r;,^Vk\(*(m/F`Qkb]5#m
+JF-cd`L)*nDN*gp@@kGmd06&jl?=9')D=sp?:W%lg!p+jg,*j#7(;<p&Gd-!sJr;$Q9-L,qPkcs
+5*,;qY9m^rV-BgqY2f;qW[D(khK9K!#64K#6BS;mdB<,p\F[Wp%\@WoBtr7o^qY@m,d'[h;\+qj
+l#Ornbr#5naQ&=o_/"No'k,Ripu<nlKJ99hr=5+rUp!Vo)8RUio'G#oBto1oD7tHnF#lBq=X[\s
+7mN.mI'K6o()>@nF5u?p\=FPq"a^So&YN*QN.Ht!!30Bq=s4MkkY#Kq>'e:nFQ2Al2&t"1bMEb4
+W">ZikW(Zp&!kNs7l0Wq"F.<mHa*-p\ascl0Id,o)A4kmI9W9p[RP7dKT^Z#RM(FoDnml&-;h4$
+5WtqaiE0#p%\:Vq>($bs7lThrq^p.qr[J7qrK@p!":"N&cc(ip[[5%kiqa5pA"FWo^_M=p&"RYn
+`f!3qs!k?p[eFKl0\!3p@n@Sp%S7Up@RtVn+?JFnb`+Vo^MA@oC)#=kM>.ao(`.Qo^qV:l1+Q<n
+aPu;q"aUXp\".JnF,i8nF,i8nac;@n."s]q>0jXq"a^So&YN*QN.Ht!!30Bq=s4MkkY#Kq>'e9p
+@[\?o`!ou5QMW`1B7YUJGB*3pA+$dki(_!qXEqJqY'OMn*K9"o()GGrUp`bna5c>lJ:aV"9nr.#
+7(#(rrMus%l,+.$34)9pYP-'oC_nSpAXjap]'q\lhBE:o`+5"-OL+p"qh.lZKLrJp\==Zp%7hFn
+F?&>s7ka+dGONn\"?GL/VgC>mI'N:pA"IZqYL$`q"OOVn*9B4mHs?)mIL#Jq>U+.p%eL_r;#d?n
++?AFlKI^2nF?#9o(`%Rp\".Imf)Sip[mtBm-X<6n*oo@q>0mZq"a^So&YN*QN.Ht!!30Bq=s4Mk
+kY#Kq>'e:p%mqIrqH$.\BNO;RH"1Hpt"'WoZdF1q"FR`q<m\Ep\=RZp\+@Vqtp6cq>U."n,)VDs
+6ekB`WHeT!"/i/q#CX%!W`9%!sJo.!"9\N/6%_lkj.X-q=sR\pc%s@p%7hFn*g&Ki;Mm"blA+R!
+!!E0"9C62\'+(*k4JKDoC;>ApA!S6oA?is3=u98#T?Y)s6fmY#kRTUmd:#Pqt^0b7f*#Wp\Oa[q
+Y9g[q=jCDp\adLjm`!7me-DJm-4!4nF?#9o(`%RqYBmZp@n@XqtBLCkNV@%mdK]=q>0mZq"a^So
+&YN*QN.Ht!!30Bq=s4MkkY#Kq>'e8kk=06roEJ?jSugCrUeh=o(V>Dp\*P=p@RkAo_eOSp%\@Vn
+aGu<qYL!dpCI&plLsH(q!$Z7YQ,IC!YG)+!!3'!'*/4A$3:hC$igbI1$Rrdl14]GnG`1_p\sqLp
+@@Y<q<7Y4f)M`M'*&=X#6P>6!!4*:Q-/%FfAGcPcDcG265pO;&ca0j!rrBS[dX7NkN;!qo_A4Un
+b<str;$!Yr;#jUlhU)Cs6fXUqY9OBkj\?CrV7r9n*0H4lg=<>qYB"0mIU,Lo'#o6i;_I*p$28Jl
+LjK8JcPiP!WiB&!!2*[rrM'Y!!3$"!!2He!!3$"495Wd"Ub>6*r#0onF6,JqXs=TrpoORqt'OUq
+"ss_nETc6k3r-<k1odog?/52q==+MqYU-_o'c,>o_/:Z!;HEe(A@:bp\+4Jn*fc9JcHVp!#5_=!
+<N?*r;mc9#QY/1nal1RLG]AS&-)l02t#Ypq#Ba\p]1'fpcJ6BnF$26p?pf+Sc]<""q(G3"p,,6!
+!<W?#QP&6#R:M7!!!9)$j[gW)$2'+\ph\u\+TUlo^qhKnEf]?8,)iQo(;bOn+c8GnalbJp@n.Mr
+;,dAkN_<mhV7&Yqt9a]q=3S"ddd)0p?CW)qtKmBi6;/nip?@%o]5:a!!!$$!W`9%!V$0b!TF+Z!
+W)lp!UBa`!Eog1!=/c6+S5*ln*p#Hq=XIXqY9pcq=+@[q>1$eqt]XFlKn*:qYKm]oAS<ZnG)qWp%
+.eLqY^']p\=LVo^hnRq"aa[na6/GoC229nF;/;-l3*q"pkVA"T&07#6G#.dI-Aps6Jb/U-KUs&*
+E<Ro(_\Qp_rl#q"a^Yo^hq<oDIb0QNdL%#lk#/!XSi,!W2p>%L<(8!=K_e#QkM9%1*^U!"H&us8
+)6bnaGr;pA"@Qnb>NJqY9dYqt]mWl1XK3q<7AJoC)JPq"XgNoDejdo_AFHmeQk\qu$Hgo_/(IhW
+4@es82ZYq=+:Mq=":Il[/d:"9\f-jo>A^iW/rYg]08A!!!0($6S[,nF,rBq"OLVo'uJPq=<qJo^
+;&0ki_(&s82'8f@/!_jo,&Jqu?ThoC),;pA"I_qAoD+p%%YKq"X[\p[[eLp[[b=mI0Rh!"8i3!!
+!$#rW!l?#n@LH"Te]+WpTB$l/:@QN[+]2,387dnFlGPp`oM,q"aa\p\4@Fo)._4U&tB8%fd"H!=
+fAE&eblk(``ti"9JK%(BG-Z&-)hC#S7cPiof%Bhmq\'j6H41q=+1Yp]'qNq"OLVlLsQ1pZM%oiT
+T:Zki^g]lLX];kMb=uqX<CodF?hEjl#\(mH<m!p$;2Gkh#Y)q<\.On9k<A"pG+j!!!&Z!<*#S!#
+bk<!<W<-+Rf$nn+HMNp@n:MnG)hMnb<%]rVlg9r:nb)o^MJOrq-!XnaZ8EnE]`<o_A=\p[e+Qrq
+IN.p%8(Tp\=RZo^V_Lna5Z/mI-tp'*B9`#QP8="TAK%!#>Y;!!SALqXFOSli6S+k`(8ajm2O5oD
+\Ldp@n@[q%W;knF>W3^BafV$NLhN!"95B#Qt2,!$24I$4-n<!!!$0!tH4L'M7BaqpX$oo'5K(m.
+'];n+$0CoCDJDo'u8AqsF4HmeZ8ArVuEJo`*U3C/d&1%gW7;!rr<'%2^34%45MahXL=?r;Yp2r;
+>pMp?p].n*kT&"9\f.!<E6)nGr@cqZ-Wsi;`l[!W2ot!V$-i!W2qC!<N<-&e>'T/,]54me?SNoD
+&"Pq>0dSp]&guip61,n*B<1mbls_gro9HhXL=0n+lnYqYBs`q>'LLoChtTqYL$^p@nCXp%.hHnE
+oT/mI#QF%0.1G&J#$G!!!$%!<<3'!!!%Pj7Lpbf[Ap?h"^Wrqr6`/p[\=YrqHHfrqRAurT`\/rn
+\b.$NL5>#lk,0!!!$)$OmOC!#kq?!WrrB%KQ_S"^(?Ur6P</k3)O4oCVbMoC)5E5Pk0NqY9[Sq=
+j.Fkiqg)o#0J9JKY".3MN%7Z-r(<rr2loqtB7'`Rh\P3sPa'3.K0PiU6C:jnS2qp$hL$$2t#+!<
+N?-#j)*i!<N?+"m,gb!<iN,!sJc-rVus"!q?6k!Wi9#8c]"t"q;:W!=^=Cq<[D?q=*hFlh:/Dlg
+F3*s8Vuko^:r'aNDTHg@G4>mI'cLo\SBfq=X1<iTBY*lKn$4p\Odaq=jUWq>'dXrUBmWrpM5pYa
+Sue!sJZB%g<">%M9<X!rrH(QJ(O!rr)]bjP8bim/?>9o'u8Lq#'mdpc/*@qqpi*qsm<:$31GA!W
+`?-"98E&!W`9.#6Or+!<`WR)%luN-S)spg$@8ejlud<o^hePqY0XPpdb2Uq"sgTnFuS:nDrd)kO
+RhT+%_p@htk^LhX1.6m,6[ZmeH\Pm,Z[_qX`q0caX$TaOo7eiRdquk5FZ0JJeUo!s&E("UFPtq#
+UKq"T\Z-"pbOu!"Ar1"9o):#R1A3!!*-'nGn%@!W`9%!sT#3!!<3$&g6$(kN2:-l0%TpnF5Gumb
+>3_;`Gd+!rr<E+<2%$!<<*$)([pcY2Ss6lK[Hcgue+mmI9`?p@n=Wp\"7Tq=s[Qo(;YMp@IkJq>
+]aA^;$aa:b<7^!WrN/"9]AB_qse6c.hOElh9f2me6;Cp@.SNp]:0arq?Bd&GZ(pfCnY'qIs1J!#
+5e?#6ar)!WiN2rW!o>":#5?!!3cK&3<5Q\Gs&6oC;k2p@IhFp%@kCnb>W@kiqHshV[Mmlh9W2qs
+XFR9`SD.]>j^@q"jpcqY9g\qu$6\o(MtTq=!J<prA+Z-$m`0eaW/%p$;P4drcQ9#mLG2!!*2l!;
+Qs$!!NB*"UGGCk5Yqm"9o,=$OI%@!WW6'"RuIY"9SZ)!X&`7#64`/))jkRoAectn`Acthsp*ikk
+3;dJS%%`#RD"\/icEj/eA$a'ehI%FO&s]g$/A3oBPT-n*ooIo/ZC3q"OITq"jg\nFQDOr;-0\hs
+Bass5LkMLh8OV!!!64!sJuT'CG5bptY67lgX`-qY]jRp&F[RrqHQhq"apa'D:nblfRR3qUVdN0)
+u^t!!O,C"TAE#!Z(h?"onW-#Qlpg!!.AVder+mp@IbCpA+4Qs7]=aq=jLLkOJ<;m-jWCf\HASkj
+lV>9L5lZir@fhk2k[emIU)Ir;69]nF#f9o'u5>nESudcB/`!FS#Fif'qturV,m+g[sk1htY:3q>
+'mcq$[&pq"XUVoC;><n*p>H&b,8Mmbmp-V>\s>p%%>5m-Ws2nH8%@m-aiA&+9&WmI&rnr8[e"f(
+dSeqYo_YlgOK@qtBaXp\=R\qY'USo'52lj8\TIe+q_0qUPT3kjRO%qqfd"Z<\s\)+nkBal;aRiS
+WedpA"7HkinRtWG`IW0gD,oa5d!og@=V,meGQ9h"gaFp](%>oBbuAnEoQ-mI0N3lK7'\e]Y_9Yd
+VO%hW!u%q=a@EkNVI-q"XRSnacDLrqHQhq"apa&bY\Xo_@h9l0IQ`?O$Q9!rr?#"9/K@!s&B%!<
+i`7#6Y)9!&J3@s75RFoCVP@o^;MSpItAXp[dkEo(;\Mo()GQg?\P,fUau.n,;D=p\=ddq=X@No'
+u2>na>c0mIKuDnE]B-o_A7Qeob\4e)p]&s6fC>fAtZcqVCo2[:M>q!<3'#!!2rs!!3'!rrN&u%L
+iCU0h0@bqt9^FoBc/9q=FXT)"I1go_%nRq>:'`p\=FAQ8&OY!"K#4!s8H&!<WK&!WN3O!t>M;!<
+W]L.ZhpGk5X5umIA-hn+$4eiRE<1!%#hgnFlhZp[n1Pn+H>Drp^lsoD/"Ps8ME!LTUX`^%&]1oB
+Yo*o]PB7p%eC_p](%0oBl#@qt^!\q>:'crV?0\q"aXUlfmg.oBku=mI1&E$M*i`q"aa\p@e:Yrq
+HQhq"apa&,#JVq#0X>kP,#OY<r9i"nr!5$NU56%M'@%!?e)^o&.Ksp\47GnFubQnG*%X<VZCaoC
+)JAmJ6VIlgWN[qXo4d#lk"K`Q@u,\_uQ0k3DI.p%84Zp@@bFp\XLIkiqO.q"aB`B29=\K_*UKh=
+^[7s8DBYjo=O:(B=U?!<NE/"p>).!s8]3$4Qh=&dS^I)^bsp!"N/UqsXC:puqVCp%BC"q"adSjR
+D[!oC9f]>9a+`&JP3O#R:M8!<<*#o`-<@$PFPPipZKbs4[IiqrZE,jn`UW@K6/ceCWpHgX4O1lK
+\6@p%&(N([pbJfAlAos0_cr%)[ktlgXf(s5ibArqQ7@p\F[XmI'W1jl5=^kND!jinr_Zo(`+Xo(
+)VRp@It:kjeHEqYBsYpA+R\q"adcp]C3bq>U.&p$qVHoBu2DnDhsLMC&T5!!NE)r;[Z;#n6k7"U
+"f*&*L[sjQZ47rUfgUnF6/In+cqW,l%30oC)>8l1ao8kOnZ"TQ^k`-7MA@Q/quAd/<k>p[n"Bk2
+H=/-1UR!q"j:Fq>^<UdD+7#$5NU`0@o:ap&4aSnCZagj8.mC":,&-!!33)!rDs#!X&Z.!r`6!!"
+K58&e,d:kP"'4dJ)SsmJ6Mqqtg*^p\=R\q<IhOjSnnRNrTsu%1ipM!!*-"!WrH'!Wi/urs&K.!<
+iN'!'PG_o&n6ngt(T`s4lAC2,_/fp>#B;kjeBApA4a]lfmj0q"O=CjQQI<qX`7WhZ*/>Ldt+^oB
+c+up@RnEq"Q*.pA"LWmdBZCq"FCUq>'gWmHEd%p&"^Rj5TJ!oC280l1+NIq$?ibo(VtTp\+@\p]
+C3bq>U.Dp$qbLnaH5Mmb.U(GmFEj'*A7:!s/N,#R_:Q$5!aR'.;&0p\"@Mho4jOq=X:Lq"jLTs7
+]4^q=jLLn*BH;oB>WBjOqA=('"=:#lpC]j8&N?gYC]JlgO?2jQQ(*qYU-as7l$HlgaZBW>#=D(*
+4U!Z0qS`insIkrU\Otl2gqgrW**&!s8Vo!"ThK!!WK)"l8b0o[!3fqs=.R"8_igp\jdnq<@YDhY
+?B#W!>*hrVup!rVus"!r`9'!W`?"!(I>$!<<--&f1^KkkF]/l1+]8g"kE_m9BYklKm:(k/66Hp%
+@qFiR6iQnb;hNn*BKCk/Q6UrqPols-t`3s6St9f$jW]q=s_<p@S(Tp[IV@kiUpcjlY^es82N`q"
+ssbq!I>8oBk`&n+#u>nacDLmdg,Jq"OLVrqHQhq"apa&bY\aqYBOBn+H=ks7hX)!!aM?!!!'!!#
+,GN8;OeLgAKOQf^&Ouo)&1PoD&4Pq#C(fq"a[Un*ouEq"=7Op[_\k"9p,(+Whg:,qqE^a8>Z(o'
+u/5kPY>Zs82?Jh;%/^l,ABC'/]as!!<B+4!'C;rpJeEqX=1CiT:^P'*JRL$jZt="oSW."U"l-"o
+\W<"U55>%0-A;)\"7ao]c##p#c/>p@oX%p@RqFm,[Hlf]q(PScKf7!!WN*!s8Q(!!**%quB=i!W
+iH*!!!*-$OQl'j6lp<h=pZbs3m<h,QJ=\U@8-2^ARBlqY'RWrVQ9ZnaZ2Equ6<er;-'>^q/S)K2
+;[[!57Opm`YUeq"4CW0D"c,q>'XOnbr=Zp\F[^q<@&&jlksljS/03o_%Y<m/$MKmd'93q"+4TqY
+Bp^qYp6kp\=R`pbDI3o(Vb<ip?@4g>2<!oYFi6*>Ae[!!E]B!Za'\>FF7Gs5NY%s7b-on+QSMo(
+DhTnG*%X<;?:`oC)2Bo^;AMmF%4J"ptJ5$j?V8!$*uu'+uN?4B?QcUopi$Whl5HJ9P0b-4L(`&J
+tKU)@HWI!X/R!U@eH=f?W(Es68Z,!$_IK%h/U@!!2]l&d&=C!"BYD%feDsp[Rq<o^M\Gq=km&q"
+aa[oC)&?r;#pWroh4p(C^KY)%loT"p4`'!!2ut8c\tq$P![X&.JaB#CYgnq<R81r6Ec/-6i[]![
+n.CZ/bQQlLt&?hr!MXqY0XPo(DhUpY4X&n_3.*nZG+W-Nk5,O6>i`o]bi9q=lW5n+-;Np$qV=ki
+V!ikih4!md0B3oC2/2kNqg4n+$5OqY'IIn+?DMq>'gZpA"Oap]C3bq>U.;p$qhHj591smFhO$m.
+90"rUWlL+Ue\o.lgq3k5+rQp#P2qqpbB+h#@-Rp[RkNqt]aVs7[T0q=jLLm.0H"nG_=I1&q[^$3
+qmX'EC0+!"&o2"p=i)rW3B,!X/l;#6Fl1"9&<#"!I^G$3:\F!!WK/$T>9eo(VnPrUnq>Fp%sQ&f
+_bt!sAr5rW4#@"pbP:!!!$%#7Ct@,V&j3-Bn<#p%.P@p%InNpi#m$qu$9^md'35nETiGjONa.+T
+_fT%KR(K#Qt55#RUP4!<NB.#7(qO"TST2%1Fc6r7^f%s5rV)E>JTT$j$G1!X]PtG]U^VoChYAoC
+hYDpA"CQlf\!7q!?YJCB+J>!$rH^:]LQe^uFSTm/$PQ0CS;uq>9mVo(i"NoCV_Ko`"^]p\F[\p$
+_DCq=Eq?p\=RZp%.eKq=saYoC;DFq>U0bpb2C:q"F:In+$,<io0+jo'uGLr;$!To(;nXp?q)%i8
+Nnlq=3b;o_7Y;nb)YOq"O=R!;ZKd$2)m.r9rYB<s/^+"ptJ7!=9&>$4@7O%Ia?%!X&]4"p>#,!<
+3*"!&sus!%+*.hYHR8htl@"l%=?o!WW<*!!!9+"9ei,!!3B-"pkP<!<<-#!=C$-GPUjolgOH>q>
+0sXp_<Sso(MeIo(_U_:C%:5!"T&0!WiE#!$MFK#6Y&-!!F#X&HDe@OnSV&q;D8FlC/1^)?:$J%h
+&[FrW"VQ()S)C5?;QDK84nrH&-r`=[=2;!!!$$"T\T'!WrH'/H@';i8*nto^MGJqt9UWq=sdU#P
+7]eqY9d[r;$*mq=aCJmI0T:pA"IY(\db%qY9g\qYL!ZnF#f<q![_CoCV\Jp&=^tp%.eKq<I\Mo'
+Gl>q!IP@pAXgep[@nVq>U3to]#$)o(2N+!!!'!!ri<!!!30&"7Q9p!<`T2"Tnf)!<3*"!$2.U!Y
+otUl2C&BhY,XZh2IL)&g8_G#QOu-!XK,="8r36!s/H&"Ud^9!#(`hr7:<)nFH5Fp[Ir$qt0FNo'
+>W2mCum4!"KD='GM2k$3^J2&IJO=!!EfK%0ZY18dd%:_tNQRo$d*\p4j"U%fcbC%1<CC!<E6(!!
+Eo^5?M`GF*M\;DLH\;2^T(;!!*0(%h&dQ%1WdR*!mI8oC;DJp@7_Kq"""Mq=sdS"82EaqYp6iq>
+'djq=jOOn*fc9pA"IY0DG;=qY9g\qXF1Pn`Srrmcs$"mIg;Lo^D>Ao^qkSrpBLXo^;;Eq!mtKq"
+aa\p[S%Up]'plnF#]5p\EqWq#LBqrrW<*"U4Aq#6=o0"9S]+!;Z^N$jcu,p%/4Pq!S1LpA`P'N(
+jWZ!tP\<!s8]4$4-k;!=&r:!sfVc!#n^lnB_*Yo^i(P!qZ*Ynb<UjoC2>>kN1srs6>b,*Z4YP5Q
+V&l"pG,4"WRpO%4teG[d<8<k4dd2^!'.U!<`K)#mpqA!s/N+"9Sc2#RCY>"Teo3!!3Z>!##\?!!
+*6-"9SQ&'*/.8!!X,@/`HQln+lSFp%7\?o_J:XnGrCap]LBgp\":U"nqTZnF,f=q"a\7p\=OWo'
+c&;lL+0.jl#(Vmcip%p\X^TnFH/?n*]]9nG)kOn+?AJp%J1[q#U9bnb<gmp@\(KnaGr7nalPHe\
+;(g"Tnf,rW)m&rsA]4mf3=grW<'!rrF2A!<WE)!ttYVl0J*3kN)6qo)7YIq!#ka==Fsu,T$jb!#
+5VB"Tf#O/qUCnnc-f1o_8"Jn*ff>nG"$tnF,r;l0%C-kj7EV`g]X7%h&aL"Tnc+"q(hG"TABS)H
+NNer;ZTii8X.smehBL$kNpO&HDh9"Tnf,!WrQ*!<WH,!<<*'$OR"A&.]!JrW!3,#6k88"pG/7rW
+`r6)?9f#oB5*0oC2AAlg+*:q"aUgr;$']qYU$Yp@ndbp%%S=pA"IY*;B7'p@@\@nb;\GoC_bDkk
+O`9nbN(TmeQ_Vq"4OTs7cfgn+?>Fq"Xg`n+[Rjp@\(KnaGr;n+6S<P(`rB"p>#+!;lou!rrJl!<
+3*!!'^Jc!<<0)"9AKA!!h3,kiD4#mGdO$f];DTf&lr)ad[`t>"LtB4$$DQG`AQ<kPk8Qpt=H<jQ
+#q)nF#c:p\F@S:@RW<o_%\@oD?k[lh(5NcKNlkR!)On/JfBR2cFsn\btdEd+[[Hj8.p.nE]N#)^
+PJ,(]kQ\!s/N)!!!$$!rr<(#RqC^(]XU=!!!'%r;[$'"U+u/#mpP;&IT$O(]Xsukk!m3oC2>?lg
++*:q"aakr;$']qYU$Yq=k3hq"aa[o^VACq"a\4p\F[^q"OU\rV,mVrVuZ^rV?0\q>'[Op\FabqY
+9j]oD&(MnFlSGrqYpUqtL-a$MX&Yr7,[o!!EB*p&P*nkl<pK!Wi?'#6k21(^:#g_;a8Gr:9=Vqs
+3Y9r;Pm*cfFm"qY9dWo^VD=md&uni8j+emJ-,Iq#C*ZnaQ&<o_81Opc%X,me?MJo(VhEq>B!gi;
+W<8lg=<=q"O[_p[IM9p]'IBme-V[mFUairV#dUgAhK_*=`&W$jHM.rrE0-"p4]&!s8Z/"8r<"!!
+**%r;ciurr<W4"UY\D*!"dlmeHABo^hJ;oC;SUq>U-kqYBmYq=k3hq"aa\p@IkKq"a[qp\F[^q"
+OU\p@RtJp%J+PrV7-%p@\(Io_A7Wp@e7TqY9XPq"XFZq#C'iq"aaSq#:*gqZ$:!lgj"nFTDXL"9
+JT)!!)lurrhilrrMus495Nc!!3E2!<rl6#MI#`i8O"Wiq;m2nEoK!i:$^FnCQIUl0\$6pY+?Xkj
+nQGq<mbGhV.#Uo'l2?oCW%Tnb>'4mI9oHo'l8=l/:h)q<I;:m,mEpmHj)^gZn=rk2G7fmGcjYn*
+fE%k5+oLp"0TQ(C:9K!!iZ"!!E?.%20NV!!!'!!!!&q!#G\?#6tD9#R^n=$k`Qdna,o;nb;eJnb
+)_Qq=b!ap\F[bp]1-cp]1'ep]C3`p@e:Wpa>h2q"F:In+#uCq=a=Hp&+FTqYBjWpA+:Pq"aXTo(
+)VSq=F7Tq==IX!r2Tenb<+[qY1QmrTWYB_4M)C$4-q@!s/2t!!2TirrMus561if!!<N5!=/Z*%H
+Pk8l0S3*jn%g+nF6;Mm,md2pA4RVmHEj+q=jILo_J4Ghsp+,lLFi9g$nP'p%@tKo'uK5oC2>Gp[
+7>6hZ*9,mdTK:o^1l-nbDqSnb;tWoC2DKm.0`7nG)S8oB>c:n(G;W!$D7N*WZWG!W<!"!s/N&!"
+/f/!<<*$!rr?)!!*!!)?9d=!!*0(!<E</#65;8)TL[qo'c,EqXjCRq=sd[#P7]eqY9d[r;$-cp]
+(!gq=aTop_WPqq>'g[p\=7VqU"][f`qNb#87UJ"TnK#kl;e-!!!3*!!*-('EC)df)Omsmd]i8lg
+=0<p[RV8m-jNEq#pHboC;;KknNINn+#uCp@\"Gmd091naGo8oD&4Qq#9janM9_/p[7SFqYKpUmd
+'?6q"XLMlhgJKnF#c8o(VqRoBki,l1"]3p@7n*"VUkD!!<o8"5s7Z!W3!2!!E9F!63%UoC)5Dp[
+R_Dnb)nV!r;Wcf(cfN(\RS!q"4+GnET`Ch#6@.7LKG'%hf9S!T=%X!ri6<!=TS@,8,.bkk4$)n+
+#o9mdTcCp[[b>mdgAL"nhT`p\+=[nJ(QdpA"L[q"OIPnF,f8nF,l;p%\CRp]U6[nF?,Loe,V#p%
+\=TnEfc=p\=OXo^hqSp%%V@nF?8Jq"4(Cm-X04kPXiIfE2*]"TSN-%,M!^!>5GD!!3<:iSOD#md
+^&Gna>r;p&=^fq=s^8ppp/3p\FXYna,Q+nb)_?r8@<r'*J15!<a)6!<*#_!!<T;!s&<%*"<_p^?
+b=KmI]u<n+$#Ao_J7RnaZ5Dp[RhHpA"X_rq$otp\F[`qYBp[o^hVCn*ol=p%S:Ynb<Xho'c)@q"
+F:En+6;JoC)#@q&]D.p\".JnF-,Hq=aFMnal5:n,MPJg&M*e!!33%(&J"1!V$0h!VHF*!=B&3!!
+i;UqsWtDp\47Hn+$)Mp]C9dpX],Mp_if#q=jLLmHsT;p?_S/o</`+"pY>7!##A6r;Zj!!pK\0!Y
+>_A$P!CG)?:B4q;p6)q=O+Co(MkQp\+:Pp%J1Wo^qkOrqI6&naQ&<o(2PJq"OLToCDG@mdTiAq#
+:*Zp_!>nmd^&Jp@.J=o_8+PnEp&IrVHHf*;K7!nF$&Gq=s[VpA"LMp&*M;g_:bB!!s2@%gW"4rW
+2NhrW2Tj&/P<V!<:IHn+$)Hq=X:Hnb)nV!r;Wcf(cfN)>*\!q=jRTp@%;9nG;AIk<0C[%NcVi!!
+33!!!!&a!$MRW!!!WH&K^uS@JB]NjnS]Emd9T>q>'^Vp@n@Xq>0j[rqHTip@[tTn,i.NoD\@koC
+DG@nF,l;p%\C[q>'RU3VrC;o(i1VnF?,Eq>'dVnalGKqYL![oD/4YqY9aSnFlYRq=jUXqZ#jSp=
+B');Hjh8$60c\'*/.4!<3)i!<3)u!<3'"!r`07!WrK(!"],D6N#j9o(DhTqYBgTnb)nV!r;Wcf(
+cfN+7o4%qY9g[q=O+Cm.'9(m]]Oi!"KeN!s]#5!s/N+"R#h6#QP)G!rs>B:"K74gA:+.o'c#:p%
+\CTo_/(Uq=saZp\=RZq"OLVp\jdip\=CPoCDJOnH/@Uq#:*iq=+.sq=aFQq>0dSp@n@YqY9gYna
+uSOq=jOOq"apc*Vf="pA"IYp@\.Sqs!eFiW&_NRkb0J'Gg`\!s/N%!!!&i!!!&u!#u"@!sSf,!<
+rf4!"&]++gge=ht6aAq>'p`o^VVRp]C9dpX],Mp]U9aq=sX^o,%?!nEB-!fAut6;_8jh"qh:M#6
+b23"9drh%g!(@%2AjO?Z)qEq![VGjSnZKmi:lkqXO1Nq"a^Yp%S7Vq>'g\p\Xg_q"X[\qY0a_pA
+adiq"aa^qYBsUq#C'kq"a^Xo(i+]p*f\1q"OLUq"aa^qYBs^p@n@Vo^h_Jq!IhJnG`.Ae9N5<":
+bS;"U"ni!#u%C"UbG5!=B8@!!sVNHM6_$j7`?Gp@e@Zp@7hTp]C9dpX],Mp`&u&q=aCHlg+<=nE
+fcDjnAQ?e$36b!"0&;"9JK%!!2<a+;GIg!"''9kOmj#nbN.Jkj7d.n*TT9q=+"Lq"a[VoD&:["o
+.icq=s^`pAam_qZ$HmqZ$B[pcA0Eq>'gZo^r"Uq"OOXq>1$cq"OOXqY^-`q>'m`qtp*]q"F=Lo(
+2\Lr:TgWkkY1m63I8p*<69I"6TY(!sJl="TST4&.&=><Z(6'o&BZBqt]jTq>9mUp&=^fq=s^8pp
+'Sop\sq$p@@Y<b2<$ID%QaX'a"FB#QOuEqu@0-!<<0%!<NE0$4?k7!<*$!!"/r1#S@=`K(7sdlg
+4W:!:5jC&+\I\"q1JH+9MTD#7:P5"9&?#!!*E@r;cZprr<Z4":"r8!"T2?!ZD>5A+ACSh"etbZ1
+n=nrqI9'o^M;2i:$6PFZ:*9!Y6=m%06G6"TnT%rrN0$qu@N7"ptV="Ul&=*rl^=N6(GPl0%9rmd
+g"4p^d)pYs]--!!=2O!!!*/$jln5!X&]/r;cZpr;ciu&-)_3!$!:$!!7Pkhr2`TpYs3fZ1o./p\
+=RZp@RtVio'S,h62Q,3>VYq%3?bm!"K)9$k<:>"9o):$4Hn9"TAB5#8."V8:ek\s6&n;jlPk$q>
+6<L(\Rh#W-3SD#65&C$ig8/$3gP5$5!dS!rW/u!#H+Q#RLkI#Qu:_"on`,3e?>bs46,ns7+,(Z1
+o:3p\=R[q"OO_l0.g7q>C$^c$qPd)\E&\%1!(8!$D=C!!**#!!39)!!!05)^HlAi;NH?n`SBpmc
+`p*q>C,Pp^m)ks6\b6X'Pu1!!`f3!!EB&!!<6'!<W6$p](s/!s&B+!"U#56BL4+dc]3]m/-h&pp
+'Sqp@n@[q%*2jrVu?PpA=RYm+g@?N^s$J,67uX',2/p%L3(=#87k(?CoX6p"eKXdbF3cp\=@Knb
+E%Yp6#+dp\OjcmHF;dR7dnr+WLdh!X/i8!rr<%q#LErrW*W5"9f2;21F?>n,N+?nDaKJqX2AuZ2
+"=ms7lTh)ZBC,rU]UPm-4'0lflfU7Lp%@#QXo*!<<-%rW!fA&-)bM;3oGdk5>&Orr2]_meQVNq"
+t!ao8r_RqXj[OeGnuO1'RUV#S-n8#nIIM"9n`(rrN-$(C^`W!WW3'#6bi6PMY?Th=:7>q=aRTou
+?d3q#'mdp_ru.p%7tNrr;`hp[$r)o^Lo*jOV&=LjF2mJc:<@N1-U$h;.2^o^M,4o(2/%g$&A/q>
+'maqY9cHp_N_roD\UWq!\"He=BPV":#SF!!!$%!WE'>!<N?,"pP&-!=9Pl3^dqZb4GT.mecSGpA
+asRo`)r+YkS4mrq?Bd3;E4As8V`bq=+%PqXa%>o_S+OqtTaMn+62DnE/WdlLaE6qu-<`q#'RQqY
+L*eqtTs^qYL!^qYQEM2uiLLp[/"IrqcZii6T<@NbUlr!XB5I$ig8/!sJo8#n\"'8TgcIg#Depq=
+=RUq"=U^o)87]n](?Tpjr51q#Bdsm,?0mQ%aX3G'Sb-Wjg'rh<X_/q6g!Kpjr51p]p?[p%S7Wq"
+Xg]$hsGmqt0UWqYL!\oX=OGpjr51p_Wu.q"44Pq>9p^rVlcko^Mn[qt^$^q>.PpJbXfknbE+X'_
+qFrp%A%Qp\=U_rVlE[o()GJqu4&!JbXfknb<Xcp%eOcs8Mulp[n%HoC_kTq#C)spjr3kq!n+qrq
+lK_naQ&<r;HWprr)`jq>1!dqt^!Z[ePFKJb\d1(]!h!pA"Obs6oLMp\FX[p[n.Qq"ad_q6p'Lpj
+r51p_WYuq"aa\p@\F_q=jXZqu$Bhq=s^Yq"_Anq=jFUJbXfkanX`hq=jFTJbXfkanX`gq=fI8Jb
+YQ+JbXfkNqe2#JbY9#l1oo*Jb[@^hYI!CnbRh3Jb[@^hYR'Dnb[n4Jb[@^hYRBJp\=a`s7l$Xs7
+lTfl1be`q"X[[p\+:Sq"ad_q=s^]q#:$fq#:!gq>7)brqHEc'*%q,p\+@Wqt0[]qtTm[qt9[Wrq
+QNfM>.;Nq"XUXq"W\@!quB`rqZThmeQnXrqG[P&,5koq=s^Xp%eCVp%A%Rq>U-gq#:*fp&k!]q"
+^i_rqHEc&bl"lp%J1Wr:Tg[q=jUVp\+@[q#C)Fp]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hpZ_Gep\
+=OZq"OLTqY0XPnauSPp@e7Tq#:'hp&4L`p@kHZrqHEcs7?9_!VQ0cp\sjop\+7Mp\=OZq=s^YM>
+.;Nq"XUXq"W\@!quB`rqZThmeQnXrqG[P&,5koq=s^Xp%\:RoCMVKq"j[ip%J%LoChqRpS[fcp\
+ORsp%.bEqY0XTq"XILp\=OZq=s^YM>.;Nq"XUXq"W\@!quB`rqZThmeQnXrqG[P$2=5iq=s^Xp%
+J+Xp]'psp\+=QoCDGAp\".Mq"jiaq#:$epAO^qp@RtIqtTjXq>'[Pp%J.Zq#C)Fp]gQhq"OOXpt
+b`Ip@n@]q>^6Xq>^6hpZ_Gop\=OZq"OLTp%J1Vq=s[Vp\+:PoCDG@q"=4Mq>C)dq#:$epAab"p%
+J.Tq"aa\p\4IWp%.bGo_/%Sq"KX?#5S&hp\4IXh>%-Gp\=a`s7l$Xs7lTfl1bPYq"X[[p\+:Rqt
+0s_q=P!eoC2>Gqtg#aq#:$epAae!o^h_Kq>0^Up\4@Qo_%Y@nauPLL\M)Lq"XUXq"W\@!quB`rq
+ZThmeQnXrqG[P+8>R*q=s^Xp%S.MnF6#Ap[e%MpA"I[qtBRInFueSoV_K`p\sk&qY9aSnac>Gn+
+6;IoC;GGlg=03p%S7WM>.;Nq"XUXq"W\@!quB`rqZThmeQnXrqGsX!VcBgq>^5'p\jFUs5<YLm.
+C5CYCAYA"TU&eORW;>oD`B/p?;PNp%mnPrp]gVq#B[Ps5j:XmeHh>p&+@Yp\Fd`o_\I]q>^<eq"
+"(Pp[\7Np&"dXpA".Wq<7SFs7lHZnGiOVq!n=Js8D0\pA"C_q>U47q"FCRpAFsjn,;nO[Xh!P%g
+41\Pk4qKs5Jf,q==C[p@S%9p`B8-q=jUWq"a7Um/?D@s8D'Zp%eXJrq$$en+-MQo^V\es7Z$`r8
+I\Ps8;H[s7Z-_l1bJYq"XUXq"W\@!quB`rqZThmeQnXrqGsX!VcBgq.f^!p[eF<n,N1]lMm"g(]
+Ygk@sE>J"[:Q(s/mG3rT<kMq#CBXD?p@P$3U>7548%@roi;0s6B@_!'`q,9dr.(1%=W2pOWJI3A
+sAu6Rjo!!^H_HnbrFa!"(#[5scG<!`nF_o'uMTm.pDWqYC*b+o2!/oDeC>nERY%*WQn*>?6D9&N
+\S,r1b&po'Q/Ip\4LAp`B8-q=jRVq"sjRs4mYIm\/%GqX=.Xh#HR(rr;QXs7,jol1XfBrr:`Re,
+TI>o'c;9p]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hp[@nWq.od"p@eIDq>]OBlhX0T"qmg)q>^'dk0
+HL*]]hEY4RVb<n+l/Gs/g$T?oeDj"TXPZf(8q$qu,OS?Y:G]&J,79C8Cn#p$8i!>AG/X!!<jQB5
+En1h>dN<nR$8V!"],G;hK/Zqs".Wo_81V-i<c7p%A(Ur;6!DkPtQF#m;9Xp@%MNlMndu!3GuR%R
+9OPp%eCYqV_,iq>0p\p%J.Ip"oH@Q?NK9!!49O_YNp(nF62Fq>L!Vp^crqs7,IH;%c=9q"=7Vs8
+;-V#5S&hp\4IXh>%-Gp\=a`s7l$Xs7lTfm.b>hp%8:As5!_NU_3Y<8GDZGrnRM.s75\j!'gVo8+
+-<Tl1b2Mq"41Xn&,29!s&MRr;ZK`q=XREq"3j+!!0V0p[%DGqsNbIs7q<[!!ZKmr;Z6Ts7YXOoC
+Dq>HNFMmrUTLYkj/9=li6eU"8_ifpAOY+m,n?JRK+-(:Aa#Hs5NS;a6`>N!+l326i$BLq=sd]iV
+4Mhq>0m[o_%tXs7FT2!*J+PoD`):"c!'Srq>mMqZ#pPp^d,mq#0XE"98G+o_S.Qp$1f:#5S&hp\
+4IXh>%-Gp\=a`s7l$Xs7lTfmJ(Jkp%7kGs6BXO[fZU9>lXTroDAREq#9sapI5o)!_<:do^V_Vn*
+0B2mcD@rG5r*Q8G2*/s6TR]mH!U2q'0M:s4[GAl1"WCkjA/Q"TSaJq"!D,q>B^Is8UmIp$Ec4iV
+`B@q"XIJoDJF[pa5b1q>'aUmd0iEbd7NT!eL1IrVPXTrV6Ekk4_dV'`^Prp\=LXqV_,jp\FX[p%
+.hLqr6Nf.HL?\rT`eDf`2">mIooEr9O.Snb<Xmme$PMpAc9<_!UmbpA"IJp]gQhq"OOXptb`Ip@
+n@]q>^6Xq>^6hp[.`kp@\%Jp]'(LcN"@l9`OS>o`*k;s8V*Yi:QRU"UI6\p%J.Ulh'iHqu?8s!6
+d8"'*4I"r;Z-^m/H>NiVk][s7cEjs68\Bs75UJ^&S0BIJ*C(s75IQqt'UQi9gJ"HhHJ"m,\!?me
+ZtUq=l-+p\F[\oBkers3grn!`f*^qWIhWec5%,lM0H5('"V#pAX[cq"spHp`K8+q=jOQoC_,CC_
+GS"j8JTEo)J]Z$5&ito^hnKrqZ*Z&,l8&qsOIa!s$C(qY1$fs69:_q=saZp\=O>q#^9aq#:*hq!
+RtXq#:$Uph]]uo^_P0s6K.n%KZY1de!,2q>('hl2T`Brna7L&if"JqtTd\s6Sq7r:[5prj<=<!Z
+]_`nFuqIkP+Z9s$9BZl1ji@r;ZERnc&O#!<<+4lM:2MlMpVHs6oRSs7&$Fs5!#@m-aTIrp]j]pa
+5\.q>0m[o'l&>6N@/qs6f^Vs4mSCiW&3>s7>`e!!kU[p@RqMqr%5kp\=RYo^_VGq9B<"m-+K;qs
+4:EkOeuY1ZAAro_SUWnb<Xan,N1RrrrH'iqNKGq<I&*p]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hp[
+7fmp\+7MnGV_BUAtH5Nns[6qV_#GkkY5Xs5WtDnJq`ks7u6blL=fHrV,pPZ2jpi;ZI4/Abu&lli
+6YPqtT;=LZ8@3nbD\GpA+[[jK8[i$ZQ(ClMpJAp@\%Rmel/D6uD_qoBcDOkPbGBrV?6fp\jk0q>
+-3R$il+PlL491p[/"Knb;k=s7P\1!($Y`q"+4To\oQep\=RYo^_SFrJM$Sl\K?Rq"4LTs7JG[!5
+\=!s6T=Snb<Xpn+u\Bncf-soDA7Hs8W)_p]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hp[@nVp\sjuqs
+sFd!!*A[p[n"Fo(D_Mq"Xj_rq7_""u,`Ms6Td_p&"@TpA2-#qV(QC!!3;%r:][ZpZ_\LpHETlqY
+'d]p]n20"TWH8o(;bN#Oh<Z6ZE&"r:0PHr9jFLqs3_MrXSu/$K1CMnac;EpA"I[nb2YKs7V3J47
+rODo`+4Rp[n1Tq"ORZnc.qTs5X+So(2_QqtBIXpA"[`)Yj!sl\B$Jqoo,Eq>'"LqtN>V!-J81me
+d%Pnb<Xhp@\IRrr<9^q>(!TrqcBRp]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hp[@nVp\sjun,K'^!!
+kUSq"=4Jo_/%Rq"Xj_rq7_F%7's^qY9d]p&"CVpA2,rs7ZDI&HMkZhr4M)s8MofpHETlqY'd]p]
+n,-"9<?8oCi"S#P%N_6ZE"uqsjGGp[J4Wrp91LU&bH&5OeC?p%J+Rp\=OZn,<"[o'=4"8bM]KqY
+BOTp&FUGq"j^ar:p!Lp\k*Xrq>sQq#C*[q=jscrV.<)oC;W_J_'kgH"ZdKs7>R@7KE[;lL4N@oC
+h_L&,6+mp%tm$!(ceUrp]p]pZ_GWq=saZp\=O>q#^9aq#:*hq!RtXq#:$Vq#:$ep($Ki4TGNkJ,
+T3:oCM\Nq>U0gp\sk6h[DUHlLY&FqXsdYq"FQj!;ulimS3c_!-8,0nbDY?o_1Ohq"j^\q=k3"!<
+W=?qXsXZq?QWeq*T)tp%n4R&,,Soq"jFTmlCFS"bcaJo_J80o`+R`nE'QT4SACBp%%nNoBGiGrT
+`S;s475:lLb#QqXa7Kp&G']q=ssb*;K7"o'u76(]X$hIr=uMh>ca>1'.HCnG*%YoDe@U&,Q1ooD
+3\@"DdPrs7Z?^pZ_GWq=saZp\=O>q#^9aq#:*hq!RtXq#:$Vq#:$ep(@,Z"p4i0^\@U!p%A+VqY
+Bp]rqHEc-iYYbrVZQmrqc9bp%e=XZNp1!nbB7*!!E;Ao_@hQrq,qKEVTD(qYBmkY5eV(Du9;)q>
+(<hq>*HrqXj:P%f>hnnFQ2Mg'.T\!5J3ur:g0b-iEl2q#0LX,W,8pq<RGJn+5`Bs5EnUhoW:@Xn
+i"]mI0K5qt'FZp\FS&p\=RZp@\+Ps32-_euoIbr9s[Rs55C5!5ed8o`=[Ynb<XmmecnMH2n>Do^
+)PPq"":Gp]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hp[@nVp\sjurgs/q!!)ESq=jUWq>0s`q"Xj_rq
+7`0E-gU5n*9N?o_eFZpA)!#o)ALQokOO-#:K$=m/I"VpHETlqY'd]p]mu&!W[0:p\O^]#5@uj6>
+cPjnG#6Io_.kKo_YWg$31(mna68GoCV_Mq"aa`p%dtSmIbjOqt0aVmJlhJs8;*KpT$1\#s0(+51
+TB%q!ItQlMUDPp`K2(q>'aXq>9[RO=q.QOmDB6jn7m%&I1_hr:0ISp@e%O&,G_lq"J.r!7(E-qY
+BdTrTX(]q=saZp\=O>q#^9aq#:*hq!RtXq#:$Vq#:$dp'kd?"TSQ&nG)bOp\F[]rqQKerq6Kpl1
+=cHrr4)8o_nL[p\D&ro)AITs3s+3(]]<ds5E\DpHETlqY'd]p]mu&!W[0:p\O[[#5\-^D#*`!nb
+>?IpA4^ap$d/*#64f)p[8%No(2MIq"ad[o)J%OlL<ikrSdVQnaZVLpuq\RDu^>hq>%a]'**sRs6
+K@Xo)84Vp`K/&qY9aUq#'[^s3%,5fDPI.s7Q>4!#3$EjmrHJqu-'[&+fhlmJe(9!:K^Qp\=CSrT
+X(]q=saZp\=O>q#^9aq#:*hq!RtXq#:$Vq#:$ep(?k0"98N(r:fsZp%S:Yq"FLXrqHEc-ggI(m,
+RX)meHGQp\X^\YlOIgp@IbQX;:jL&&&#4s7H%LEVTD(qYBmkYQ+_)Du98(q=k3hqY3?mqXsaUpc
+nTJr;ZQbo4J%)"U+Z!o_\:Qp%J.Tq>'gTs7Z$Np](9gkk4uNl2UPJmGrs$*ROHYkP,"N!!R`5na
+leRrq6*^+8,F*p@.PBp\<k.qs!kTn*0WHnU(<:M=U]%n,;hRo^V\eo`+FMo`,UjqXsIQq=aX\l1
+bJYq"XUXq"W\@!quB`rqZThmeQnXrqGmVrqHEc&bU\T!!iSmr:]gVpA+R[pA"F^p\sk6s5EVIqu
+?]pq"+IYqtKoj!W;BcnE0NG8e_I3<mgs,o_1Ohq"j^\q=k3"!<W=?qtBg\q$6ZipcrZlpAFIU&,
+5enq=!qTEWQ4K!9F%Qq>'e5s6]:To_/7Ki:6j9m/H>Io_ABN!!ebJqq:uKf`,O`!5/!rqsF:Tq=
+l'*q>0aNlL"01q!IhJp!UO^Z]?gD$CLPXs75pWo)J.Ip^[#lrmLrNPPO\>p%nL\p?D>Vq=saZp\
+=O>q#^9aq#:*hq!RtXq#:$Wq#C%Uq"jgYn+C>o!!NB!q"==Rp\=R\qZ$*[p\s@UlL4NHmJ?eRq=
+sLUo_S@YYQ4LroD/"No^="*!!fXpq<e2K;uH7Ws8D^;p\+:PYlt+2A,l/kq=s^Xp%J+RoD88JAb
+lAmp\+7Qq"a^Yq=k!`p\t%No(?f!#R:A0s4dSQnac_Yn*^)Ds7QEfnbD\HrU'=Hq=aj^qV2DY$h
+*]bp&G$^n_sNK/bAc3s7uBaq#:!cpDE]&qrIJKlb<H$!X&Z@meZ_>r;6KhnGN%Np^cloir>5C#2
+A/;oBuSWlM]uB#5S&hp\4IXh>%-Gp\=a`s7l$Xs7lTfnG*%W&bu4to^DEc!rrH*oD.tJoCMVRoe
+5CqoCMeOs60LPr;?$Ws7lBZq=OOYq60kpqt'XTp%89h!"B57o&Kc?976L6j8AlN$hsAfoW\Gt"_
+n#3q#'mcp(-QjoL!Kcp&=^Zo_/(Uq"FLX&,,bor:KJp!!!9)nFl,BoD\A4q#16kq>^6]n+?DGp&
+FOSrVuTYp%a%;"?cJJrpp!do^qMi"UC^krUT7Pq=sj]s7R8qo`+sUl2TK/oVPY#!3#G`jRi-?oD
+eR\q#C.)q"OLTo^r"UlLQt>3:chDmecnSj8J6;#5S&hp\4IXh>%-Gp\=a`s7l$Xs7lTfnG!LfpA
+"IXo^V^(!s/T/mJ?YP0DPS:qtB^Xp?DSCjSSuGo(_bNo_S@YYQ4LroD/"No_7it!!!d0s4-iqB(
+l&squ-:7p\+:PZN't,D#<r#p%J1Vq=jRSnc.c>G4Xtup\+7Qq"a^Yq=m2Pp[n:Xp?m;1!"B1qoD
+\=Kr;,^Fqt&S,jn&!7p\"ICq""4Yi9^L8p`]e@EW#A,n+cnWpA%&c!);h[o^2\Sp`K>,q"OLUp%
+A@Np\F@Vp&G'^p$5-r!4;djq=XUXs6odY(]*t&p@RtInbhbHfDku8rSdG=nDjQHpZ_GWq=saZp\
+=O>q#^9aq#:*hq!RtXq#:$Xq#:!qq"OLSo(o*]"TS\arV6?c0_YO8$NL/3!!WE)$P*5Qm/QkNq=
+OOYq60kpqt'XTp%7VJj:Dk4!1Nca5A'TYs7-'_,PUp)oX=f&"*!u*o^qkPqYL![oD\XF6?N+poC
+qtNpA"IYpA+JJr:os]p%e6T!!!B3hY$p<mf!(Ome5_["p,YD!!!'4%L)rKnc/O[n`Kub!0[-PrT
+j1Uq=aeq#QZ+3pAb-aq=km)q=s^Xp%7nIp@n:Mn_*0ts7l9e!"&_Ns7ZHf!WDH^q#C-lq"OIRrp
+pWcs.KK2j7W<?o)J(Vs6f.H#5S&hp\4IXh>%-Gp\=a`s7l$Xs7lTfnb<Xhq"XUWp%7nMc3OUS!l
+Od2oDS54o]Np,Q=;-B!"]HJ[--T1q!n1PqY9lj!;ZN`q=F:OrqZ&V!WWNIp>AAjjo4oMp`oP,p%
+5cq"U9&Ep\=@Qq"jj^p@S@UmmLj^s604No_/(Uq"FOYs7llor9jI\eHPpP1W/kRn+?>Ho_JFTii
+oPc@PRra!XX4Ng\TO_s7+#1%fiR(q"sCNqYKj]D?'kIlgFfPm.pDuqYBp\p@\(Ml2U/Cq>9sdmI
+]r<olgBG;uYqRoDAO]p%\L[&+K;f7L"/:o@\SHkl:)<ros1^q=saZp\=O>q#^9aq#:*hq!RtXq#
+:$Xp^d,oq=jRRo_%kE70`esM>.#@r:L$^/`cX*s.Ko+!(cnSl2UeYnbMhRq"_,oq>9dZoC_bTmH
+ad7'*&G=s!W3\qXjgdp`oP,p%5]o!<[3;qY^!Yp\FX[p@\(Jr]=u\s6fXTo_/(Uq"FOY2u!.Es6
+BO^p-Ai^!0-O4pAamVo(VqUr:fdWeW^UN$odMMrV-$as73Ap!X,n1o(h_Mp\FLUDuK_:r;QBip\
+FRfq=saZp@eLY(B<Lfs7c*NnGiF^oqqci#ib.Fo_JC[nb<XfqSE4ClgFUl!"+q_o_8CMp]gQhq"
+OOXptb`Ip@n@]q>^6Xq>^6hp[S#Kp\FXZo^_YKp%bBe!X^sXo_%nNp@n@Wqu?WUiU<rM"V*N]s6
+JkIq!n1PqY9lj!;ZN`q=F:On+uYBed;N[!9uI\s7,gVrV-cpp@\'k#ljs4qXs[`pAFXqp%%MlPO
+82?p\+7Qq"a^Yq=m2Kq"XmRr:g/_$N^GukOAHMqXa7Io(;\JmIgLr!rrBqs6&V*s7bpP`rQ/DV>
+p#Zo`"IYq"/G.!!*&tq"=X^q"sgcp)!YW`l7$5p&FRUjn&B$(((,:q=j[Wp\"@W(]!k$p\4CTp%
+[lY!GMN!pM9j5DXd]+lfn0Kq=saZp\=O>q#^9aq#:*hq!RtXq#:$Xpdb)SqY0UPo_8"OlMpni!9
+EV<nac;Dp%@M3s75^Q_?p8K5P+R@s75sTq=OOYq60kpqt'XTp%8:Vp]'Mo!"';<4_40`nbW4Z,P
+Up)oZ@pN!*Ap`o_8(Qp%J.Tq>^$4!58F"q"OLSpA"IYpA+JJq=jR^l29uEj9Pek"k`PFnb;nSpA
++IQp\O.=Y5f.<0DFW/n+u;IoButh!/pmIq=t![qY^#("98Ssp&4XXq=ss_rV%-'gHGT=MuWVAs6
+B7QnGN=h#ZgffqXaOXp_Wf&q"FCPo'uA+""`6dr9/G-!cIi)q"O%J#5S&hp\4IXh>%-Gp\=a`s7
+l$Xs7lTfl1dL-s57Ys"TaeYs8V?]n,N.ZlM'rNhREOg!B0l>qt'XUr:p$`l2IRbm/QbMs7bpTrV
+u3LrsBD>!Wd<@pA"=Zp`&u$p%7cO!!+Y<rp0O_m/-YCqXa"NOTb4Gp\XLU5PP!Mq"=:Pp@r>/"T
+Xtbnb;ALoC2MOo]>l8p9al)!&OZ5s8VHYpZhbc!"Xn7s82-Ns8)]a5lqEDo_nCQs7uHiq*k)Qp@
+e1P_[ZYH4Se::s69%Ql1t\d%qj_uo_%nRq#B^Qq"=[`nc/(Xq<n7WlV%;Vp?V)@@gE0VqsaFYs7
+c-\qtKaWnb<=aq"XUXq"W\@!quB`rqZThmeQnXrqG[P5P=sSs![sK''nBDs5<\;r:g$Zs4dFJ%f
+d#$p$r(Pr:B^Yp\FI]UB(5\q<\.Ks7u!Rm/QsZ!!WEAAaK9hqu-:,p\+:Ps&oa6!;PjXnFHGNs8
+Vrarr4E,kl15EpcnNKqY9aUp%J(Y!!WT7i;`TElf\<>iq`?Dq"_$'%1bo)n+5lFrUBjT?O-Wms7
+,1MlMfT/r$i*TLA1N8r:Kg[s7m?'p\+=RosFc&%o)rrmdL2UfDWhj!%t8Ip@J%Yo^;5Ks7PmEoD
+J%Ns5<bEj0\kjk5"uDrb;H6D?'A!iV2j1p%e@Uq=44aq=saZp\=O>q#^9aq#:*hq!RtXq#:$Ppc
+nWTiW$+c,Qh'Hr:'admJHGAs7Q*Xe,Tg]/*cs.kPtS3gAh33oXb2'qY9mWk54c:r9X+7s'>[7(1
+@17q>1'b)u'(!oZ[=;";,53pAa[_k2Q.%s7!-%XS2Mgs7,kKp\F[\p%7qNi;^7r)urLgn`g)Rp$
+MeSo^M;.`rZ5K3TC):k5Y,Iq<uT/"Y7pmo'Z23s7Y4J!$'tkp%/4Lq=t!c7JQWNp@\+I"X5A6kP
+"ZHp=0*AAJY=Vj8\96n,2YJo@Zi>mJQGHjT"ECrVtq!'B]5Mqsip!'+8^Sm.UALnF6,Hq"OUSp]
+gQhq"OOXptb`Ip@n@]q>^6Xq>^6hpZ_H;p%e4Ro<\K"!E&(QpupZ9rV,ISn`3aS"9:RVnb2G>qu
+$H_f_5?8!6P8rrq$0Tlh(5JlfS0.)ZTkWs5O(ErV.?+p@\(Pp3@SW)"m=qlLF?<s7#^U2al^)rq
+-$VpcnNKqY9aUp%J=Jn[8E'#&ro.lf[4&qV^N9r:k.0*s+jmrqlHblMTlDmsG*8^$l!lkl9lF=;
+CsorpfmYs7H-^s7lclp\+=[ofbo9s8VZbqu>[Us2\":$$#S/jnnK7oD[JO!"^mRo_SUEs7OLr)$%
+DNhuE]3s'>[.D"m;bo_A.Sq"a^Zp[S"_q=saZp\=O>q#^9aq#:*hq!RtXq#:$PpcmsAs7$'STc3
+tMGj,1^s5;f(q;D/-!C?kg;ZH"Ts5<;0m.9iK`$PIql2Ue=p[[nIn+cn^huB_[$\7R1s6KXY)u'
+(!o`!bJAd/6VqW.\Us8W#le4hL8nE^,LnF?9<p\F[\p%7qNs69:FU)3k2J)fqqpAaRZrT`(F!(R
+#":B0\?s7u3Xs5rkO-jL=LfDG=9g=?o>=7#YJs7uKjq=t!c5PY!Hp@\+LXT4RMs6]IHnFGr3#6H
+a;nFlDKqsa7E[1<9<#dWs[oDS=ZrBq)3#llA/CX_Zl$NXr;s7>CFpAXggq=s^Sp]gQhq"OOXptb
+`Ip@n@]q>^6Xq>^6hpZ_H;s5s:DiVri"3<B1>NW&DHqX4CHNrV<-F9F#_p?hkNr:BOFQ<,1/+93
+^<VZ6\]s7tsOp$2P>s).m;rVuHgrV.?+p@\(KoDeN$$NO#Pp"ng,n$G.cU]:)Ws7H?]pcnNKqY9
+aUp%ISHp$_pr1(""4TE!U/s7Gj8Q6&TnCB,[RqW@hLq=4FTo\]Zs#rM/0oBtZW!+F.Pn*L)LnGi
+=Zs7o+Yp\+=Rp%7ct)63GpqtC!U`=N+`k5XoMp$;YQlMna,!<NVKs5s@CiT((@=C#ccIQ\MQ3'I
+?RET$62`oum`o_&%Wq=44aq=saZp\=O>q#^9aq#:*hq!RtXq#:$PpcnZUj8]/6q>^J6#9j-h@UW
+r+1+N?<s7YYl:?MT@n,MqXdVfHu":>,8#mUI"mJ$Y\nFc&%s6egf12-^firAuP)u'(!o_ngBl2I
+pf%1?0nK2O9K,LlbAlhpA:rpfbJp\F[\p%7qNs5Ek8ptl$j%1N:SG'R/+CEEUbo]Pmk>i,MVq!\
+"OlgXQHh"c0u#$l%1"s&QZs7>gQp%n4Qq=t!c7JQWNp@\+UlK`s#A<tU1\UXYn<qtJCo^qh@n,;
+P;h1,S>SaYnE_#=;S"K:bgm.B`;oo_ZQ!!P,I0`qO>n+QDHqY^0Zp]gQhq"OOXptb`Ip@n@]q>^
+6Xq>^6hpZ_H.p?VbCp&F4FmJZRCCa/o[&-Y3rh=]P!mebl<p%\1Hk5Y5KlMp8Iq!n"Mm/R%BoCq
+SMrs@]Zq#B[WkPtGPrV.?+p@\(UeG]4-li35@#ljuA7ZI9(o(;tOp&F^TpcnNKqY9aUp%InFmJ-
+_UkPt:JC(LCG'*/D\g\g14qqqD5o_%nQp\3kNn+$ANo\-!?FaTqDs7YsIq>]m_q=aXZs7o+Yp\+
+=Rp$_b9roISn!!!6:B#a-1r9F7?qYB(Lq<.eGo'PQ=m,A!/kPb5Kqt'R^mf2eNq,f!E%l&0qf^&
+8.q"FR]p[S"_q=saZp\=O>q#^9aq#:*hq!RtXq#:$@q"aUYq!%JAq"aU_oDeFbp%J+RiV<6AnbD
+qQanQ,4o_8.Tp%._Dp^c`Zo(;YKo^d,*!dXP9nEKrHs7lThnb<=aq"XUXq"W\@!quB`rqZThmeQ
+nXrqG+@q=j^[l1a`Cq=jm^s7ZTiq>'"Eq=jFSq=i#+#PIieqYL![o^V\Yqtg-`rV$V<!!$^,q>1
+!_p\jmeq=44aq=saZp\=O>q#^9aq#:*hq!RtXq#:$@q"ad^q!%YFq"aadq#:*gq>gEOq"adVq"a
+d-p]gQkr;6?cp[S"irVQB_o_%tRHk$Kts7H'bp\X^cq=44aq=saZp\=O>q#^9aq#:*hq!RtXq#:
+$@q"ad^q!%YFq!n4>q"adVq"ad.p]:3erqc`mq=+.ip@\(Mp%J1W@/pFAs75j^l1bJYq"XUXq"W
+\@!quB`rqZThmeQnXrqG+@q>'j]l1slEo_IA=q>'RUq>&)+r;#jW&,,bnqYU-bpi$?>Du]V*p$)
+5Uq=saZp\=O>q#^9aq#:*hq!RtXq#:#Up]1-hq#:!fp5/SCp[._ep\=U]q"4+EHij@knGW1Sq>9
+pep[S"_q=saZp\=O>q#^9aq#:*hq!RtXq#:#Uq#:'lq"OOVp5&MBpB(-cq=47[pCHujo'l)7FTV
+c/i;N]Sq>(!as7c'Y#5S&hp\4IXh>%-Gp\=a`s7l$Xs7lTfg%bC=q=s4MnbDqUrqZZkq#:$Hq"a
+aUq"aa(p]C9fqXO=kqt^!Zp%J1Wb@+uFpAadSrqZThrqGsX#5S&hp\4IXh>%-Gp\=a`s7l$Xs7l
+TfJbXfk#PRrhqY9[Mlf%UCq=saZp\=O>q#^9aq#:*hq!RtXq#:#=pjr2FpA"L\q=aCKiV3WQq"X
+UXq"W\@!quB`rqZThmeQnXrqD!=JbTKEq"ad_q=s^Cp]gQhq"OOXptb`Ip@n@]q>^6Xq>^6hpOW
+*jp]1*gq>U3jqr.;Sq=saZp\=O>q#^9aq#:*hq!RtXq#:#=pjr2@qYC-c!r;]iiV3WQq"XUXq"W
+\@J,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/doc/logo-34.jpg b/doc/logo-34.jpg
new file mode 100644 (file)
index 0000000..5f3a0c0
Binary files /dev/null and b/doc/logo-34.jpg differ
diff --git a/doc/logo-34.pdf b/doc/logo-34.pdf
new file mode 100644 (file)
index 0000000..476b356
Binary files /dev/null and b/doc/logo-34.pdf differ
diff --git a/doc/logo-36.eps b/doc/logo-36.eps
new file mode 100644 (file)
index 0000000..8f9aa3c
--- /dev/null
@@ -0,0 +1,2101 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (logo-36.eps)
+%%CreationDate: (Mon Aug 30 08:52:17 2004)
+%%BoundingBox: 0 0 323 203
+%%HiResBoundingBox: 0 0 323 203
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 1
+%%EndComments
+
+%%BeginDefaults
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image.  The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/DirectClassPacket
+{
+  %
+  % Get a DirectClass packet.
+  %
+  % Parameters:
+  %   red.
+  %   green.
+  %   blue.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile color_packet readhexstring pop pop
+  compression 0 eq
+  {
+    /number_pixels 3 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add 3 mul def
+  } ifelse
+  0 3 number_pixels 1 sub
+  {
+    pixels exch color_packet putinterval
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+  %
+  % Display a DirectClass image.
+  %
+  systemdict /colorimage known
+  {
+    columns rows 8
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { DirectClassPacket } false 3 colorimage
+  }
+  {
+    %
+    % No colorimage operator;  convert to grayscale.
+    %
+    columns rows 8
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { GrayDirectClassPacket } image
+  } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+  %
+  % Get a DirectClass packet;  convert to grayscale.
+  %
+  % Parameters:
+  %   red
+  %   green
+  %   blue
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile color_packet readhexstring pop pop
+  color_packet 0 get 0.299 mul
+  color_packet 1 get 0.587 mul add
+  color_packet 2 get 0.114 mul add
+  cvi
+  /gray_packet exch def
+  compression 0 eq
+  {
+    /number_pixels 1 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add def
+  } ifelse
+  0 1 number_pixels 1 sub
+  {
+    pixels exch gray_packet put
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+  %
+  % Get a PseudoClass packet;  convert to grayscale.
+  %
+  % Parameters:
+  %   index: index into the colormap.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile byte readhexstring pop 0 get
+  /offset exch 3 mul def
+  /color_packet colormap offset 3 getinterval def
+  color_packet 0 get 0.299 mul
+  color_packet 1 get 0.587 mul add
+  color_packet 2 get 0.114 mul add
+  cvi
+  /gray_packet exch def
+  compression 0 eq
+  {
+    /number_pixels 1 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add def
+  } ifelse
+  0 1 number_pixels 1 sub
+  {
+    pixels exch gray_packet put
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+  %
+  % Get a PseudoClass packet.
+  %
+  % Parameters:
+  %   index: index into the colormap.
+  %   length: number of pixels minus one of this color (optional).
+  %
+  currentfile byte readhexstring pop 0 get
+  /offset exch 3 mul def
+  /color_packet colormap offset 3 getinterval def
+  compression 0 eq
+  {
+    /number_pixels 3 def
+  }
+  {
+    currentfile byte readhexstring pop 0 get
+    /number_pixels exch 1 add 3 mul def
+  } ifelse
+  0 3 number_pixels 1 sub
+  {
+    pixels exch color_packet putinterval
+  } for
+  pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+  %
+  % Display a PseudoClass image.
+  %
+  % Parameters:
+  %   class: 0-PseudoClass or 1-Grayscale.
+  %
+  currentfile buffer readline pop
+  token pop /class exch def pop
+  class 0 gt
+  {
+    currentfile buffer readline pop
+    token pop /depth exch def pop
+    /grays columns 8 add depth sub depth mul 8 idiv string def
+    columns rows depth
+    [
+      columns 0 0
+      rows neg 0 rows
+    ]
+    { currentfile grays readhexstring pop } image
+  }
+  {
+    %
+    % Parameters:
+    %   colors: number of colors in the colormap.
+    %   colormap: red, green, blue color packets.
+    %
+    currentfile buffer readline pop
+    token pop /colors exch def pop
+    /colors colors 3 mul def
+    /colormap colors string def
+    currentfile colormap readhexstring pop pop
+    systemdict /colorimage known
+    {
+      columns rows 8
+      [
+        columns 0 0
+        rows neg 0 rows
+      ]
+      { PseudoClassPacket } false 3 colorimage
+    }
+    {
+      %
+      % No colorimage operator;  convert to grayscale.
+      %
+      columns rows 8
+      [
+        columns 0 0
+        rows neg 0 rows
+      ]
+      { GrayPseudoClassPacket } image
+    } ifelse
+  } ifelse
+} bind def
+
+/DisplayImage
+{
+  %
+  % Display a DirectClass or PseudoClass image.
+  %
+  % Parameters:
+  %   x & y translation.
+  %   x & y scale.
+  %   label pointsize.
+  %   image label.
+  %   image columns & rows.
+  %   class: 0-DirectClass or 1-PseudoClass.
+  %   compression: 0-none or 1-RunlengthEncoded.
+  %   hex color packets.
+  %
+  gsave
+  /buffer 512 string def
+  /byte 1 string def
+  /color_packet 3 string def
+  /pixels 768 string def
+
+  currentfile buffer readline pop
+  token pop /x exch def
+  token pop /y exch def pop
+  x y translate
+  currentfile buffer readline pop
+  token pop /x exch def
+  token pop /y exch def pop
+  currentfile buffer readline pop
+  token pop /pointsize exch def pop
+  /Times-Roman findfont pointsize scalefont setfont
+  x y scale
+  currentfile buffer readline pop
+  token pop /columns exch def
+  token pop /rows exch def pop
+  currentfile buffer readline pop
+  token pop /class exch def pop
+  currentfile buffer readline pop
+  token pop /compression exch def pop
+  class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+  grestore
+} bind def
+%%EndProlog
+%%Page:  1 1
+%%PageBoundingBox: 0 0 323 203
+userdict begin
+DisplayImage
+0 0
+323 203
+12.000000
+323 203
+1
+1
+1
+8
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF7FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFFFFFEF2F0F60FFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFEF2F5EEF2E60FEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEEF2F5EFFFFEF2E5FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFEF2E60FFFEFFFFEF2E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFF02F60FFFEFFFFFFFFEF2F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEF02F5EFFFEFFFFFFFEFFFFEF305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFEF2F5EFFFEFFFFFFFFFFFFFFFFEF2F5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+EF2F5FFFFFFFFFFFFEFFFFFFFFFFFEEF2F5FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFEF2F
+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0305EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEF2F5EFF
+FFFEFFFFFFFFFFFEFFFFFFFFFFFFFEF0305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5EFFFFFF
+FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFEE305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2E60FFFEFFFFFF
+FFFEFFFFFFFEFFFFFEFFFFFFFFFFFFEF305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02F60FFFEFFFFFFFFFE
+FFFFFEFFFFFEFEFFFFFFFFFFFFFFFFEF305FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF02F5EFFFEFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFFFFEE2F5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2F5EFFFEFFFFFFFEFFFFFFFFFF
+FFFFFFFEFFFFFFFEFFFFFFFFFFFFFFF0305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5FFFFFFFFFFFFEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFEF2F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0305EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEF2F5EFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFFFFFFFFFEF0305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5EFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFEF2E60FFFEFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFEFFFFFFFFFFFFEF305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFF02F60FFFEFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFEFFFFFFFFFFFFFFFFEF305FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEF02F5EFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFFFFEE2F5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFEF2F5EFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFEFFFFFFFFFFFFFFF0305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEEF2F5FFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF
+FFFFEF2F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0305EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF
+EF2F5EFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFFFFFFFFFEF0305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F
+5EFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2E60FF
+FEFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFEFFFFFFFFFFFFEF305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02F60FFFEFF
+FFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFEFFFFFFFFFFFFFFFFEF305FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF02F5EFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFFFFEE2F5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2F5EFFFEFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFEFFFFFFFFFFFFFFF0305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFE
+FFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5FFFFFFFFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFEFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFDFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFEF2F5FFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0305EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFF
+FFFFFFFFFFFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEF2F5EFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFFFFFFFFFEF0305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFEFFFFFFFEFFFEFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFF
+FFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5EFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF
+FFFEFFFEFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFF
+FFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2E60FFFEFFFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFEFFFFFFFFFFFFEF305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+FFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFEFFFEFFFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFEFFFFFFFFFEFFFEFFFFFEFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFF02F60FFFEFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFEFFFFFFFFFFFFFFFFEF305FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFEFFFFFFFFFEFFEFBF9E7F6E3F3F403E0F000F3F3F3F406F7F8FBFDF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFEF02F5EFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFFFFEE2F5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEC0BF8E
+7F7F6F3F3E3F3E407F807E9FBFCFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFEFAF7F3F0F003F4F7E7FBFBFBFBFDFFFDFBFBFBFBF7F7F4F40000F
+3F6FAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFEF2F5EFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFEFFFFFFFFFFFFFFF0305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEAF7F3F1F0000000100
+01000000000000000000000000012F4F7FBFEFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFEFFFFFF
+FFFFFFFFFFAF6F2F003F7FAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFAF
+7F3F001F6FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEEF2F5FFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F5FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFEFFFFFFFFEE9E5F1F0000000000000000000000
+0000000000000000000000000000000000002F6FAFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFAF600F1D6FBFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEBF6F2F0F5FAFFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEFFFFFFFFEF2F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0305EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFFE08F3000000100010001000000000000000000
+0000000000000000000000000000000000000100004F9FF0FFFFFFFEFFFFFFFFFFFFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFDE700F
+1E8FDFFFFFFFFFFEFFFFD0FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFDE8F1F0E70DEFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEFFFFEF2F5EFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFFFFFFFFFEF0305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFEFFFFFEFFFFFEFFFFFE9F400100010000000000000000000000000000000000
+000000000000000000000000000000000000020000000F5FBEFFFFFFFFFFFFFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFBE4F005ECFFF
+FFFFFFFFFFFEFFFFFF004FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF
+FFFFFEFFFFFFCE5F0F40BFFFFEFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEEF2F5EFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFEFFFFFFFFFFDF6F0F0000000000000000000001000000000000000000000000
+0000000000000000000000000000000000000000000000011E9FEFFEFFFFFFFFFFFFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE3F0F7EEFFFFFFEFF
+FFFFFFFEFFFEFFCF0F603FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFFFF
+FFFFFEFFFFFFFEEF7F1F3FBEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+EF2E60FFFEFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFEFFFFFFFFFFFFEF305FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEFFFFFFFFFFDF5F000000000000000000010000000000000000000000000000000000
+000000000000000000000000000000000100000000000000000F80EEFFFFFFFFFEFEFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFBF3F1F9EFFFFFFFFFFFFFFFF
+FFFEFFFFFFFF7E5FEE20AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFF
+CF8F7F809EDFFFFEFF9E1F3FC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02F
+60FFFEFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFEFFFFFFFFFFFFFFFFEF305FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFDF5F000100000100000100000100000000000000000000000000000000000000
+00000000000000000000000001000100000000000000000000000F7FEFFFFEFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE500F7EFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF1FBFFF7F6EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFF8F01
+006F7E4F005FEFFFFFFF8E0E3FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF02F5EFF
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFFFFEE2F5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFEF6F000000000001000000000000000100000000000000000000000000000000000000
+0000000000000000000000000101000000010000000000000000000FA0FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF7F106FEFFFFEFFFFFFFFFFFFFFFEFFFEFF
+FFFFFF9E1FFEFFBF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFDF5F
+0F8FFFDF4F2FEFFFFFFFEF6E007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2F5EFFFEFF
+FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFEFFFFFFFFFFFFFFF0305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
+0F0000000000000001000000000000000001000000000000000000000000000000000000
+0000000000000000000000000000000100000001000000010000000030CEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFCF2F2FCEFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFE
+FFFF1F9FFFFEA03EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBF
+1F5EFFFF5F2FFFFFFFFFFFD03F2FCFFFFFFFFFFFFFFEFEFFFEFFFFFFEF2F5FFFFFFFFFFF
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF2F60FEFFFFFEFFFFFFFFFFFFFFFFFFFFDF3F0000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000016FF0FEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFEFFFFFEFF7E007FFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFEFEFFFF
+9F1FFFFEFF6F80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
+305EFFFF2F80FFFFFFFEFEFF8F0F7FFFFFFFFFFFFEFFFFFFFFFFF02F5FFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF02F60FEFFFFFFFEFFFFFFFFFEFFFE8F0F00000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000100011ED0FFFFFFFEFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFEF3E2FCFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFFFEF01F
+AFFEFFFE2EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
+0FC0FFC00FEFFFFEFFFFFEFFCF2F2EE0FFFFFFFFFEFFFFFEF02E60FFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFFFFFFFFFEEF2F5FFFFFFFFFFEFFFFFFFFEF5000000000000100
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000100000000007FFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFBF0F4FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF7E3FFE
+FFFFDF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
+4FFFFE409EFFFFFEFFFFFFFFFE6F0EBFFFFFFFFFFFFFEF2F5FFFFFFFFFFFFFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF305FFFFEFEFFFEFFFFCF1E000000000001000100
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000100000000003FF0FEFFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF9E002F7EFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFDF0FCFFFFE
+FF6E60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDF00
+FFFF9F4FFFFFFFFFFFFFFFFFFEA00F9EFFFFFFFFF02F5EFFFFFFFFFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFEFFFFFFFFFEFFEF2F5FFFFFFFFFFE9F000200000000000001000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000001FCFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5F0FCE7F7EFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFEFFFFFF505FFFFEFFFF
+0FCFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFE1FBF
+FFDE00FFFEFFFEFFFEFFFFFFFECF105EFFFFEF305FFFFEFFFFFFFFFEFFFFFEFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFEFFFFFFFFFFFFFFFFEF2F5FFFFFFF700000000100000000000000010000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000001000000000011AEFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF5F2FDFFFAE40FFFFFFFFFEFFFEFFFFFEFFFFFEFFFFFFFFFFFEBF0EEFFFFFFF9F2F
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF4F9FFF
+FF0EDFFFFFFFFFFFFFFEFFFFFFEF2F5FEE305FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFFFFEF2FA0FF5F00000100000100000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000001000000000001010000009FFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+EF5F2FEFFFFFDF00EFFFFFFEFFFFCF8FEEFFFFFEFFFEFFFFFFFFFF3F7FFFFFFFFF209EFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7F7FFFFF
+3FBFFFFFFFFFFFFFFFFEFFFFFFEF2F005FFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFEFFFFFFFFFFFEFFEFEF3F000000000000000100000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000010000010000008FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF3F
+30EFFFFFFFFF3F80FEFFFFFF6F0F404FFFFFFFFFFFFFFEFFFF9F1FFEFFFFFFBF1FFFFFFF
+FFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFFFFFFFFFFFFFFF7F60FFFF3F
+BFFFFFFFFFFFFFFFFFFFFFFFFFEF2F2FEFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2F0100000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000001005FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF602EEF
+FFFFFFFEFFCF00B1FFFE5F2FDFFF00FFFFFFEF8F7FDFEF6F009FFFFEFFFF4F7FFFFFFFFF
+FFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFEFFC03FFFFF3FBF
+FFFEFFFFFFFFFFFFFFFFFFFFFEF02F2FFFFFFEFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEFFFFFEFFFFFFFFFFFFFEEF2F00000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000100000001005FFFFFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFFF5F2EEFFFFF
+FFFEFFFFFF9F0E2F1F2FEFFFFF00FEFFAE0E5F1F8F2F0F1EFFFFFFFEEF00BEFFFFFFFFFF
+FFFFFEFFFEFFFFFFFFFEFFFEFFFFFFFFFEFFFFFEFFFEFFFFFFFFFFFFFFBE3FFFFF609FFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFF02F5EFEFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFEFFFFFF4F000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000001000000000001009FFFFEFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFE6F30EFFFFEFFFF
+FFFFFFFFFFEFBFBFFFFFFFFF00FF9E10AFFE7F005F3F9EFFFFFEFF8F00FFFFEE6FAFFFFF
+FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFF9F3EFFFF7E80FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFEF2F60FEFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFFFE5F0000010000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000001000000000001009FFFFEFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEA00ECFFFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF009F0FCFFFFFCF5FCF0FF0FFFEFFFF4F01FEBF2000AFFEFFBE
+3FDFFEFFFFFFFEFEFEFFFEFEFFFFFFFEFFFFFFFEFFFFFFFFFFFFFF7F7FFFFF7F7FFEFFFE
+FFFFFFFFFFFFFFFFFFFFFFFEFFEE0F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFFFFFEFEFF7F00000100000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000010000000000000000BFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFCF00CFFFFFFFFFFFFFFFFF
+FFFFFEFFFFFFFFFFFFFF1F0FCFFFFFFFFFFE705EFEFFFFFFFF20005F0F9F00EFEF4E004F
+FFFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFFFEFFFF4F9EFFFE7F7FFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCF0FBEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+FFFFFEFFFF9E000000000101000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000001000000000000000FCFFFFFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEF0F9FFFFFFFFFFFFEFFFFFEFF
+FFFFFFFEFFFFFFFEFFBFEFFFFEFFFEFFFF2EB0FFFFFFFFFF007F6EE0FF1F4F0F5F6F6EFF
+FFFED0CFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFEE00DFFEFF7F7FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFEFFFE9F0FEFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FEFFFFCE1000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000010001010001000000002FEFFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F5FFFFFFFFFFFFFFFFFFEFFFFFF
+FFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFF00EFFFFFFFFFFE0FDFFFFEFFAFA0DFFFBF003F2F
+010F3FFFEFBFBF7FBFFFFFFFFFFFFFFFAF7F7FA0EEFFFE5F5FFFFFFE7F7FFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFEFFFFFFFF5F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFEF1F000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000010000000000005FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF802EF0FEFFFFFFFFFFFEFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFDF0FFFFFFFFFFFFF4F7FFFFFFFFFFFFFFFFFDFBFBFEF
+7F0F1E003F3F3E100F5F807F7F9F2F207F7F3F014F4E0FEFFEFFFF5F7FFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFEF2F7FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+500000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000010000000000000000000000000000010000000000010000000000
+0000000000000001000000000000000000000000000000000000000000009FFFFEFEFFFF
+FEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFD000D0FFFFFFFFFEFFFEFFFFFEFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFEFFFECF0FBFFFFFFFFFFFFFFFEF9F4F012F
+8FCFFFFFFFFFFFCF7F0F004F007FFEFFFFFFDF7F80EFFFFFFFFF3FBFFEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFD000CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000010000010000000000010100000000000100000000
+00000000000000000000000000000000000000000000000000000000000FE0FFFFFFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F7FFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFDF0FFFFFFEFFFFFFFFAF1060AFBEBF9F702E004F90DEFEFF
+FFFFFFFFFFFFFFFFEF4E006FFFFEFFFFFFFEFFFFFFFFFFFFFE1FD0FFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFEFFFF802EFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE00F0000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000001000100000100000000000000000000000100000000000001000000000000
+00010000000100000000000000000000000000000000000000000001003EFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFEFFFFFFFFFFFF902FFFFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFEFF00DFFFFFFFFFFFFEFFEE8F3F3F3F507EB0EFFFFEFFFFFFFF
+FFFEFFFFFFFFFFFFFF5E3FFEFFFFFFFFFFFEFFFEFEFFFEE000FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFFFFFEFFFD307FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF4F00000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000001000001000000000000000100000000002E3F3F400001000002000000000001
+00000000000100000000000000000000000000000000000000000001008FFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFDF0F4FB0FFFFFFFFFFFFFEFFFFFEFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFE4F80FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFF
+FFFFFFFFFFFFFFFFEF1F9FFFFFFFFFFEFFFFFFFFFEFF9E4FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFEFFCE0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAE010001000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000100010000010000001F507FBFCFFFFFDFBEBFCFFFFFDFB07E3E000000000001
+000000000000000000000000000000000000000000000000000100000FEFFFFEFFFFFFFF
+FFFFFFFFFFFEFFFFFEFFFFFF5F0001002FCFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFC00EF0FFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFEFFFFFFFFFF
+FFFFFEFFFFFFFFFF9F1F9EEFFFFFFFFFFEFFFEFFFF2F9FFFFEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF6F4FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFEE1F00010000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00010000000001000E509FDFFFBF7E5F3F00000000000000003F5E9FDFEFA04E00000000
+000000010000000000000000000000000000000000000000000100015FFFFFFEFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFBE0000000000007EFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF507FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFFFEFFFF
+FFFFFFFFFFFFFFFE1F00005FDEFFFFFFFFFFFEB01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FEFFFFFEFFFFFFFFFFFFF00FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF7F000000010000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000001F6EBFFFCE7F3E00000000000000000000000000000000001F6ED0EE90200100
+00000000000000000000000000000000000000000000000000010000BFFFFEFEFFFEFFFF
+FFFFFFFEFFFEFFFFFE3F000000000000012ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFEFBF8F3F4F9FEFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFEFFFEFFFF
+FEFFFFFFFFFFFF5F000000005EEFFEFFFFCF0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF7F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE0F00000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+2F8ECFEFAF5F0F00000000000000000100010001000100000000000000002F9FFF9F1F00
+0001000000000000000000000000000000000000000000000001003FFFFFFFFEFFFFFFFF
+FFFEFFFFFFFFFFBF000000000000000000003F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF3F0000000F7FEFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFEFFFFFF
+FFFFFFFFFFFF7F00000100000F8FFFBF0F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFEF1FC0FFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F010001000000000000000000
+00000000000000000000000000000000000000010000000000010001000000004F9FDEE0
+9F4F00000000000000010000000000010000000000000000000000000000000F8FFF7E00
+000000000000010000000000000000000000000000000000000000BFFFFFFFFEFFFFFFFF
+FFFEFFFEFFFF3F0100000000000000000000001F9FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFF2F000000000010AEFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFEFFFE
+FFFFFEFFFF6E000000000100001F01AFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFA03EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFDE000001000000000000000000000F
+3F809EBEC0FFFFFFFFFFFFCFBEBF8F807F403F3F3F0F00000F403E607FBFFECF7E2F0000
+00000000000000010000010000000000000000000000000000000000000000001FBFCF2F
+00000000000001000000000000000000000000000000000000003FFFFFFEFFFFFFFFFFFF
+FFFEFFFFBE0000000000000000000000000100000F7FF0FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFE000000000000000050EFFFFFFFFFFFFFFEFFFEFFFFFEFFFEFFFFFFFE
+FFFFFFEE0F010000000000000000BFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFEF0FBFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F00000000000000000100005FB0FEBF
+8E703F3F0F00000000003F3F3F7F7F8FBFBEBFD0FFFFFFFFBFBFAF7F4F0F000100000000
+0000000000000000000001000100010001000000000000000000000000000100007FEF4F
+0001000100000000000000000000000000000000000000000000BEFFFFFFFFFFFFFFFFFF
+FFFFFF600000000000000000000000000000010000005FADEFFFFFFFFEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF00000000000100000020CFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFD
+FFEF2F000000000000000000001FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFF804FFFFFFFFFFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFFEF0F00000100000000000060E0DF6E0F0001
+000100000000000000000100010000000100000100000000000000000000000000000000
+00000000000000000000000001000100010000000000000000000100000001000060FF5F
+000100000001000000000000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFE
+FFDF000000000000000000000000000000000100000000001F3E3F3F3F3F3F3F3F3F3F3F
+3F5E7F7F7FFF000000010000000000000FAFFFEEFFFFFFFFFFFFFFFFFFFFFEFFFFFEF09F
+0F0000000000000000000100019EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEEF00DFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFFFF8F00000000000000005FDFDF5E010000000000
+000000000000000001000000000000000001000000000000000000000000000001000000
+0000010000000001000000000000010000000000000000000000000001000001004EFF3F
+00010000000000000000000000000000000000000000000000CFFFFEFFFFFFFFFFFFFFFF
+7E0000000000000000000000000000000001000000000000000000000000000000000000
+00000100FF0F00000000000000010000009FCF0F3F60807FBFBFBFC0BEC0906E3F000001
+0000000000010001000000003FFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFDFFFE5F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF1F0001000001004FE0FFFFBEC0BF8F7F4F1E0000
+000000000000000000000100000000000001000000000000000000000000000000010000
+0001000100000000000000000000000000000000000000000100010000000001015EEF1F
+0000000000000000000000000000000000000000000000005FFFFFFFFFFFFFFFFFFFFF1F
+000000000000000000000000000000000000000000010000010000000000000000000000
+000001BF3F0000000001000000010000009FCF7F4F000000000000000000010000000001
+000100000001000100010000DFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFEFFFFFFFFBF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFEFFFFFEFFFFAF000000000100017F7F4F3F3F3F3F7F8FBFEFEEAE6F
+1E0000000100010000000100000000000000000001000000010000000000010000010000
+0000000000012F2F010000010000000000000000000000000000000001000000007FBF00
+00000000000000000000000000000000000000010000000FEFFEFFFFFFFFFFFFFFCF0000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00009F7F000000000000000000000001009FFFFF1F000000000000000100000000000001
+000000000000000100000090FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+FFFFFEFFFFFF1EAFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFEFEFF5E0000000000000000000000000000000000002F6EAFEF
+CF8F1F000000000000000000000000000100000000010000010000000000010000000000
+000000003FFFFFDF5F000001000100000000000000000000000000000000000000DF5F00
+01000000000000000000000000000000000000000000019EFFFFFFFFFFFFFEFF5E010000
+000000000000000000000000000000000000000000000000000000000000000000000100
+014FDF0000000000000000000000000000CFFF7F00000000000000000000000000010000
+010000000000000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF6F5EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFEF00000000000000000000000000000000000000000100004E
+9FEFCF700E01000000000001000100010000000000000100000000000000000000000000
+01000000CFFFFFFFAF00000000000000000000000000000000000000000000005FDF0001
+000000000000000000000000000000000000000000004FFFFFFFFFFFFEFFFF2000010000
+000000000000000000000000000000000000000000000000000000000000000000000100
+00E05E010000010000000001000001011FFFBF0000000100010001000000000100000001
+0000000000000000000FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFCE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFEFF9E00000000000000000000000000000000000001000000000000
+004FAFFFB04F000000010000000000010001000000000000000000000000000000000100
+0000000F9FEFFFBF000100010000000000000000000000000000000001000000DE3F0000
+00000000000000000000000000000000000000010001DFFFFFFFFFFFFFCE000100000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+4FF01F010001000001000000010000009FDF000000000000000000000001000000000000
+000000000000000000EFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1FBEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFEFFFEFFFF4F0000000000000000000000000000000000000000010000000000
+01000E6FDFDF7F0F01000001000100000000000000000000000000000000000000000100
+010001000000010000000000000000000000000000000000000000000100007F9F010000
+000000000000000000000000000000000001000000A0FFFFFFFFFFFF8001000100000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+9FCF0E0100010000000000000000004FFF000000010000001F5F7E3F0000010001000000
+0000000000000001BEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF6F6FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFE10000000000000000000000000000000000000000000010001000000
+000000013EAFFEA03F010001000000000001000000000000000000000000000000000000
+0000000000000100000000000000000000000000000000000000010000001FFF0F000000
+00000000000000000000000000000100000001004FFFFFFFFFFFFF3F0000000000000000
+000000000000000000000000000000000000000000000000000000000000010000010000
+9FEF3E01000000010100000100008FFF0000000000108FEEAF8FDFDF4F00000000000000
+00000000000000AFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFAE2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFBF0000000000000000000000000000000000000000010100010000010000
+00000001001F80DFDF6F0F00000000000100010000000000000000000001000000000001
+000000000000000100000000000000000000000000000000000000010000AF5F00000000
+0000000000000000000000000000010000010000FFFFFFFFFFFF00000100000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+5FEFAF2E00010000000000002FEFEF010000000FCFBE100000004FEE8F01000000000000
+0000000000007FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF00EFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF70000000000000000000000000000000000000010000000000000000000001
+000100010000014FAFFF9F3F000000000100000000000000000000000000010001000000
+00000100000100000000000000000000000000000000000001000000005FDF0000000000
+00000000000000000000000001000000000000BFFFFFFFFFBE0000000000000000000000
+000000000000000000000000000000000000000000000000000000000100000000000001
+0F7FE0DE9F703F3F3F5F9EFFFFBF000000008FC000000100000030EE5E00010000000000
+00000000017FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FE3FB0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFE2F00000000000000000000000000000000000000000000010001000000000000
+00010000000000001F7FDFDF6F0F00000000010000000000000000000000010001000000
+0000000000000000000000000000000000000000000000000000000000DF3F0000000000
+00000000000000000000000000000000010080FFFFFFFF7F000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000100
+004FFFFFFEFFFFFFFFFFFFFFBF0000001FEF0F000000000000002FFF1F00000000000000
+0000000080FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+6F7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000004FAFFF9F3F000000000000000000000000000000010000000000
+000000000000000000000000000000000000000000000000000100007FD0000000000000
+00000000000000000000000100000000003FFFFFFFFF4F01000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+8FFFFFFFFFFFFFFFFFFFFFBF0000007F9F0000000000000000009F9F0000000000000001
+0000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
+3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFBF00000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000011E7FEEC03F0001000000000000000000000000000100000000
+0000000000000000000000000000000000000000000000000000000FCF6E000000000000
+0100000000000000000000000000000000FFFFFFFF200001000100010000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000100D0
+FFFEFFFFFFFFFFFFFFFFBE000000BF5F0000004F500000010020FF1F0000010001000000
+000080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE10
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+8F0000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000105FDFBF3F01000000000000000000000101000100000000
+0000000000000000000000000000000000000000000000010000002EEF7F000000000100
+00000000010000000000000000000000CFFFFFFF00000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000010000FFFF
+FFFFFFFFFEFFFFFFFFBF000000BF4000005FFFFFBF100000009F7F000000000000000001
+004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF00FF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000010000000000005FEFBF1F000002000000000001000001000000000000
+00000000000000000000000000000000000000010001010000000030CECF3F0000000000
+000000000200000000000000000000AFFFFFBF0000000001000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000001FEFFFE
+FFFFFFFFFFFFFFFFCF000000BF3F00012EFFFFFEAF0000003FDF00000000000000000000
+30FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2FBFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F00
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000100000F7EFF80000000000001000000000100000000000000
+000000000000000000000000000000000000000101000001000000017EEFBF2F00000000
+01000100010000000000000000007FFFFF9F000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000013EFFFFFFFE
+FFFFFFFFFFFFFFFF000000907F000001AFFFFFFF3F000001DE5E01000000000000000100
+F0FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3FAFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000001000000010000002FCFCF0F0100000000010001000000000000000000
+000000000000000000000000000000000000000000010001000000000F7FEF8F0F000000
+000000000000000000000000004FFFFF7F00000000010000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000003FFFFEFFFFFE
+FFFEFFFEFFFFFF3F00005FCF0000000FBFFEFF8E00000051EF0F000000000100000000AF
+FFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000100000001000000000000009EF02E0000010000000000000000000000000000
+00000000000000000000000000000000000000000000000001000000001FBFCF0E010000
+0100000000000000000000003FFFFF6F0001000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000FEFFFFFFFFFF
+FFFFFFFFFFFF8F000100E05F0000000080DE7F01000000A0CE0F00000000000000015FFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F80FFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBF0001000100
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000100000000000000000000015EEF2F0000010001000000000000000000000000
+0000000000000000000000000000000000000000010000000000000000009FCF0E000000
+00000000000000000000000FFFFF3F010001010000010000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF
+FFFFFFFFFFDE0000013FFF7F1F1F3F4F0000000001000FBFCF00000001000000000FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F4FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF000001000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000100000000000000005FEF1F0000000000000000000000000000000000
+0000000000000000000000000000000001000100000000000000000000009FCF0E000000
+0000000000000000000001FFFF3E00000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000100BFFFFFFFFFFFFFFF
+FFFFFFFFFF4E0000013FAEEFEFBF9E500000000100000030000000000000000000AFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000001000000008FCF000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000BF9F00000000
+00000000000000000000FFFF3E0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFF
+FFFFFFFFBE0000000000000000000000000000000000000000000000000000005EFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E0000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000100D06F000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000010EF4F00010001
+000000000000000000BFFF1F000100000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000002FFFFEFFFFFFFFFFFFFF
+FFFFFFFF4F000001000001000100000001000000010000000001000000000000EEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE80000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000010000003FF000000001000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000004FEF0F00010000
+0000000000000000BFFE0000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000010100E0FFFFFFFFFFFFFFFFFF
+FFFFFFEF0F00000001000100000000000100010000010000000000010100019FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF7F00000100000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000001000001CF4F00000001000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000001AEAF0000000000
+00000000000000BFFF000000000001000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000017EFFFEFFFFFFFFFFFFFFFF
+FFFFFFBE00000100000001000000000000000001000001000000000000003FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000010000000000708E0000010000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000FEF4F0101000000
+000000000000BFFF00000001000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA00000000100000000000000000000000100000000000000000001DFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7F000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000001000000000001003FBF000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000004EEF100000000000
+0000000000C0FF2F00000000010000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000019EFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA0000000000000000100000001000100000000000000000000009FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF7F00000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000100000000000040BF00010001000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000001009F9E010000000000
+00000000BFFF3F0000000100010000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000001FEFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFA00000000100000001000000010000000000000000000000014EFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF3FFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F0000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000003EBF0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000EF03F000000000000
+000000BFFF3F000001000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000007FFFFFFFFFFEFFFEFFFFFFFFFF
+FFFEFFBE10000001000000000000000000000000000000000000000FFEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC03FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000040BF000000000000000000000100000000000000000000000000
+0000000000000000000000000000000000000000000000000000007FBE00000001000000
+0100BFFF3F00000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000FEFFFFEFFFFFFFFFFFFFFFFFFFE
+FFFFFFEF3E00000100000000000000000000000000000000000000CFFFFFFEFEFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E50FFFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFE9000010000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000003FBE00000100000000000001000100000000000000000000000000
+00000000000000000000000000000000000000000001000000000EF03F00000000000000
+00DFFF6F0000000100010000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000100005FFEFFFFFEFFFFFFFFFFFFFFFFFF
+FEFFFEFF7F0000000001000000000000000000000000010001008FFFFFFFFFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFBF0000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000003FC00001000000000000000000000100000000000000000000000000
+00000000000000000000000000000000000000010000010001007FBF0000000100000000
+FFFF80000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000010000000100BFFFFEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBF0F0000000000000000000000000000010000000050FFFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E80FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF000100000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000040CE000101000001000000000001000000000000000000000000000000
+000000000000000000000000000000000000000100000000000FEF2000000001000000FF
+FFAE01000100000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000100000000002FFFFFFEFEFFFFFFFFFEFFFFFFFFFE
+FFFFFFFECF0F0000010000000000000000000000000000010FFFFFFEFFFFFEFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDF01000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000EEF4F000000000000010000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000008F9E0000000100002FFFFE
+C00000000100000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000001000000010001007FFFFFFFFFFFFFFEFFFFFFFFFEFFFF
+FFFEFFFFCE10000000000000000000000000000000000001CFFFFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFE30BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000AFFE70000000000100010000000000000000000000000000000000000000
+0000000000000000000000000000000000010000000000001FFF1F00000000003FFFFFFF
+000100000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000100000100000000000FDFFEFFFEFFFFFFFEFFFFFFFFFFFFFE
+FFFFFFFFCF0100000000000000000000000001000001008FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFF2F0100000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000BFFFFFBF3F0000000100000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000010000009E7E00000001006FFEFFFF30
+000100000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000014FFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF
+FFFFFFFF7F00000000000000000001000000010000004EFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFCF20FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFF3F000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000001EEFFFFFFFFBF5000000001000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000100003FEF0F000000008FFFFFFF4F00
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FEFFFFEF00000000000000000000000000000000000FFFFFFFFFFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF9F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF7F00000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000FFFEFFFFFFFFFEFFBF7F4F3F000000000000000000000000000000000100000000
+0000000000000000000000000000000000000000000001BE5F00000001BFFFFFFE900000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000012EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFF4F0000000000000000000000000000000001DEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFF6F7FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFAF0000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+003FFFFFFFFFFFFFFFFFFEFEFFFEFFFFDEBFBF8E805F3F00000101000000000000010000
+0000000000000000000000000000000000000000000060E000000100EFFFFFFFBF000100
+010000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000010000019FFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF
+FFFE8F0000000000000000000000000000000000B0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFE2FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFDF000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+8FFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFCF8F3000010000000000010000
+00000000000000000000000000000000000000000100DE4000001FFFFFFFFEFF00000000
+010000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000001001FFEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF
+FFBF00000000000000000000000000000000007FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFEF00FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFFFF20000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000CF
+FFFFFFFFFFFFFFFEFFFFFFFFFEFFFEFFFFFDFFFFFEFFFFFFFEE05E010000000001000000
+00000000000000000000000000000000000000000080AF00015EFFFFFFFFFE3E00000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000B0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+BF00000000000000000000000000000000003FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFAE3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFEFF5F00000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000FFFF
+FFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFEFFFFFFFFFFFFFEFFFFFFDF5F0000000000000000
+00000000000000000000000000000000000000010FFF1F00A0FFFFFFFFFF8F0000010000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000003EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
+000000000000000000000000000000000030FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF5F7FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFE9F0001000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000003FFFFFFF
+FFFFFFFEFFFEFFFFFFFFFFFFFFFEFFFFFEFFFFFFFEFFFEFEFFFEFFBE1F01000000000000
+0000000000000000000000000000000000000000A07F00DFFFFFFFFEFFCE000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000005FDF1EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000
+0000000000000000000000000000000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF1FCFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFEDE010000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000005FFFFEFFFF
+FFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF4F00010000000000
+000000000000000000000000000000000000003EF01FFFFFFFFFFFFFFF1F000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000005FDFFFFF9F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFBF0000
+00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFCF1FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF2E000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000007FFFFFFEFFFF
+FEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFF5F00000000000000
+00000000000000000000000000000100000000CECFFFFFFFFFFFFFFF6F01000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000010F5FDFFFFFFFFEFF1F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F000000
+000000000000000000000000000000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF6F6FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF6F00000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000AFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F00000000010000
+0100020000000000000000000000000000005FFFFFFFFFFFFFFFFECF0000000000000000
+000000000000000000000000000000000000000000000000000000000000000100000000
+000000010F7FEFFFFFFFFFFEFFFFAE0FEFFEFFFFFFFFFFFFFFFFFFFFFFFFFF6000000000
+0000000000000000000000000000BFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+20CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFEFFFFFFCF0000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000C0FFFEFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F00010000000000
+01000000000000000000000000000100011FFFFFFFFFFFFFFFFFFF2F0100000000000000
+000000000000000000000000000000000000000000000000000000010000000000000100
+00016EEFFFFFFEFEFFFFFFFFFEFF4F4FFFFFFFFFFFFFFFFFFEFFFFFFFFFF2F0000000000
+00000000000000000000000001BEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFB01F
+FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFEFFFFFE2F0002000000000001000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000BFFFFFFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F00000000000001
+0000000000000000000000000000010070FEFFFFFFFFFFFFFEFF8F000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000000F
+CEFFFFFFFEFFFFFFFFFFFEFFFFEF2E80FEFFFFFFFFFFFEFFFFFEFFFEFF00000000000000
+000000000000000000000000C0FFFEFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF4E90FE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFEFFFF8F000001000000000100000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000EFFFFFFFFEFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF2F00000000000000
+000000000000000000000000000000CEFFFFFFFFFFFFFFFFFEF00F000000000000000000
+0000000000000000000000000000000000000000000000000000000001000000012EF0FE
+FFFFFFFFFFFFFEFFFFFFFFFEFFD00E6FFFFFFFFFFFFFFFFEFFFEFFAE0000000000000000
+0000000000000000000000DFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDF00EEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFEF00010000000001000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000FFFFFEFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDF0F00000000010001
+000000000000000000000000002FFFFFFFFFFFFFFFFFFFFFFE5F00000000000000000000
+000000000000000000000000000000000000000000000000000000010000002EEFFFFFFF
+FFFFFFFFFFFFFFFEFFFEFFFFFED02F5FEFFFFFFEFFFFFFFFFFFF6F010000000000000000
+00000000000000000001FFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFEFF705EFFFEFEFF
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF
+FEFFFFFE5F00000001000001000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000FEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEAF0000000000000000
+0000000000000000010000009FFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000
+00000000000000000000000000000000000000000000000000010000000FF0FFFEFFFEFF
+FFFFFFFFFEFFFFFEFFFFFFFFFFEF302FEEFFFEFFFFFFFFFFFE1F00000000000000000000
+00000000000000001FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFF00EE0FEFFFFFFFF
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF
+FFFFFEBF0000000001000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000FEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF6E0101000100000100
+000000000000000001000FFFFEFFFFFFFFFFFFFFFFFFFFFF5F0000000000000000000000
+0000000000000000000000000000000000000000000000000000000FD0FEFEFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFEFFFFFE5F2FEFFFFFFFFFFFFEBF000000000000000000000000
+000000000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E40FFFFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFF3F0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000FFFFFFFFFFFEFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEF1F0001000000000000
+0000000000000100007FFFFFFFFFFFFFFFFFFFFFFEFFFFDF000000000000000000000000
+0000000000000000000000000000000000000000000000000100AFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFEFFFFFF5F3FFFFFFFFFFFFF5F00000000010000000000000000
+0000000000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEF0FBEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFBF000000000100000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000001000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF000001000000000100
+000000000000000FEFFFFFFFFEFFFFFFFFFFFFFFFFFFFF5F000000000000010000000000
+00000000000000000000000000000000000000000000000070FFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFEF2F7FFFFFFFFFE0000000000100010000000000000000
+0000000000CFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF7F3FFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF3F010000000100000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F000001000100000001
+0000000000017FFEFFFFFFFFFFFFFFFFFEFFFFFFFFFFDF00000100000000000000000000
+000000000000000000000000000000000000000000002FFEFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFCF0F9FFFFFFF4F00000000000000000001000000000000
+0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF0EDFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FEBF00000001000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000013FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFDF0F000001000000000000
+000000000EF0FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF6F00000001000100000000000000
+00000000000000000000000000000000000000000EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFAE0F9FFEAF000000000001000001000000000000000000
+00003EFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F5FFFFEFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FF3E00000001000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000013FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF8000000000000001000000
+01000081FEFFFEFFFFFFFFFFFFFFFFFFFEFFFEFFFFEF0F00000000000000000000000000
+000000000000000000000000000000000000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFC01F2F0000000000010000010000000100000000000000
+0030FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0FEEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+D00000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000001003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF1F01000100000000000000
+001FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF9F0001000000000000000000000000
+00000000000000000000000000000000013FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFFFFFFFFFEFFBFDF6F000000000100001FDF00000000000000000000
+00FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFEF208EFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+6F0001000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF0000010000000100000101
+AFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF3F0000000000000000000000000000
+00000000000000000000000000000000D0FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEF0F0000010000007F9F0000000000000000000001
+BFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFF6F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
+100001000000000000000000000000000000000000000000000000000000000000000000
+00000000000000010000010001007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F0000010001000001003FFE
+FFFFFFFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFEDF0F0000000000000000000000000000
+00000000000000000000000000006FFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFFFFFEFFFEBFBF7F0000000000007F8F00000000000000000000009F
+FEFFFEFFFFFFFFFFFFFFFFFFFFFFBF0FDFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFAF
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF00000000000000000FDFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E000000000000000001000000000000
+0000000000000000000001000FEFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF2FFF2000000000003FEF2F00000000000100000000BFFF
+FFFFFFFFFFFFFFFFFFFFFEFFEF1E8FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFF4F
+000000000001000100000000000000000000000000000000000000000000000000000000
+0000000000000000010000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F000001000000008FFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F000100000000000000000000000000
+00000000000000000000009FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF5F7FBF0000000000005FFF5F000000010000000010FEFFFF
+FFFFFFFFFFFEFFFFFEFFFF4F50FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFEE0F
+000000010001000000000000000000000000000000000000000000000000000000000000
+00000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE1001000000003FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFEE2F000200000000000100000000000000
+0000000000000100002FFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFDF11DD6F0000010000003FFF3F000000000100007FFFFFFFFF
+FFFFFFFFFFFFFEFFFF7F1FEFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFBE00
+000000000100000000000000000000000000000000000000000000000000000000000000
+00000000000001000000AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E010000010FEFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFCF0F000000000000000000000000000000
+0000000000000100BFFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFE7E40FE5F0000000100016FDF0000010000003FFFFEFFFFFFFF
+FEFFFFFFFEFFFFB00FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFF7F00
+000001000000000000000000000000000000000000000000000000000000000000000000
+000000000100000100BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFEF0F000000BFFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFAF00000000000000000000000000000000
+0000000100003EFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFEF4FBFFFFFF00EE0FF7F010000000000DF3F000000004FEFFFFFFFFFFEFFFF
+FEFFFFFFFFCE0FA0FFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF4F01
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF7F00007EFFFEFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFE9F00000001000100000000000000000000
+0000000001CFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFF9F0F0F6FFFFF6F7FFFFFDF5F000100008F9F00001F9FFEFFFFFFFFFFFFFEFFFF
+FFFFFFDF108FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFEF2D01
+000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000001BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFEF0F1FFFFEFFFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F00000001000001000000000000000000
+0100005FFFFEFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF7F7FDF3E1F9FB03FFFFFFFFFEEC0BECFFEFF9EBFFFFEFFFFFFFFFFFEFFFFFFFEFF
+FFEF2F5FFFFFFEFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD00E00
+000001000000000000000000000000000000000000000000000000000000000000000000
+000100000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF7F9FFFFFFEFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F00000100010000000000000000000000
+000FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7F7EFFFF9E3F005FFFFFFFFFFFFFFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFEF
+2F5FFEFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFCF0F00
+000000000000000000000000000000000000000000000000000000000000000000000000
+0001000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFF7FEFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF5F01000000000000000000000000000001
+7FFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFFFFFFFFFFFF
+FF7F7FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF2F5F
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD00F00
+000000000100000100000000000000000000000000000000000000000000000000000000
+00000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF9F10EFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F00010000000000010000000000010DEF
+FFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFEFFFFFFFFFFFFFFFF80EDFFFFFEFEFFCECFFFFF
+AE40FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFEFFFFDF2F4FFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFF9F0000
+010001000001000100000000000000000000000000000000000000000000000000000000
+000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFEFFFFFEFFFECF10BEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF5F000100010000000000000000009FFEFF
+FFFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFF3E30EFFFFFFFDF000F4EEFE0
+0FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFECF0F3F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEB00F00
+000000000001000000000000000000000000000000000000000000000000000000000000
+0100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFF00F9EFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F00000001000000000000002FFEFFFEFF
+FFFFFFFFFFFEFEFFFFFFFFFEFFFFFEFFFEFFFFFFFEFFFF400F6FFFFFFF6F5FEF4F0F5F00
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFAE0F9FFE9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FCECF0F01
+000000000000000000000000000000000000000000000000000000000000000000000100
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFEF2F5FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F00000000000000010000BFFFFFFFFFFF
+FFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFFFFFFFFFFFF3FA010BEFFFF2FB0FEFFCF7F5EFF
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFF7F0FAFFFFFFF9F10CEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFCF0E00
+000000010000000000000000000000000000000000000000000000000000000100000001
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFEF2F60FEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFCF0F000001010000005FFFFFFFFFFFFFFF
+FFFFFFFEFFFEFFFEFFFFFFFEFFFFFFFFFEFFFFFFFF3FBE8F2FEFE000FFFFFFFFFFFFFFFF
+FFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFEF4F2FCFFFFFFFFFFF9E10CFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00FCFFFFFFFEF3000
+000000000000000000000000000000000000000000000000000000000100000000010EFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFEF2F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFFFFEF3E01000000000FDFFFFFFEFFFEFFFFFF
+6F6FFFFEFFFE80A0FEFFFFFFFF8E2FEFFFFFFFFF3FBFFF3F5F6E4FFEFFFEFFFFFFFFFEFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFBF0F4FEFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA00ED0FFFFFEFFFFEF5F00
+00000000000000000000000000000000000000000000000000000000010001000040FFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFCF1F5FFFFEFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF8E0F0000009FFFFFFFFFFEFFFEFF6F2F
+2F5FFFFEFF1F00CFFFFFFFFE1F2F3FFFFFFFFF2EBFFEEF3F1FDFFFFFFFFFFFFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEF6F0FA0FFFFFFFFFFFFFEFEFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FD0FFFFFFFFFFFFFFFF8F00
+00000000000000000000000000000000000000000000000000000000010000003FFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFAF0F8FFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF3F005FFFFFFFFFFFFFD000BF00DFEF
+0EAFFFAF1F8F0FEFFFFFAF1FEF1F8FFFFFFF00EFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFEFFFFBE1F3FDFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFEFFFFFFFFFFFFFFFFCF2F
+000000000000000001000000000000000000000000000000000000000000005FFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFFFFFFFFFFFFFFFF
+6F0FB0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFAF103EDFFFFFFFFF5F10005FFFFFAF
+0FEF6F6FFF5F2FEEFF5E70FFCF0F9EFF9E2FFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFEFFFFFFFFFEFFE04E0F9FFFFFFFFFFFFEFFFFFFFFFFFFFFFEFF9F0FCFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFDFFFF6F
+0000000000000000000000000000000000000000000000000000010000007FFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFEFFD02E2F
+DFFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE800061DFFFEF00CF10CEFFFFFF4F
+4F2FAFFFFF2F5FEF10CEFFFFAF102F00C0FEFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF
+FFFEFFFEFFFEFFFFFEF06F006FEFFFFFFEFFFFFEFFFFFFFEFFFFFFFEFFFEFF9F0FCFFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E10CFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFCF
+2F000100000000010000000000010000000000000000000001000000007FFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F0080FFFF
+FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFEDF5E107F6F4FFFFFFFFEFFFFEF2F
+00F0FFFFEE2F1F3FFFFFFFFFEEBFE0FEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF
+FFFEFFFFFFFFEF7F0F5EE0FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF9F0FCFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFEFFFFFFFEFFFEFEFF
+8F0E0001000000010000000000010000000000000000000000000000C0FFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFB01E3FD0FFFFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFEFEFFFFFFDF5F003FE0FFFFFFFEFFFFEE7F
+FFFFFFFFDF4FEFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFE
+FFFFFEDF60005FDFFFFFFFFFFFFEFFFFFFFFFEFFFEFFFEFFFEFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF9E10CEFFFEFFFEFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFF
+EE7000010000000000000001000000000000000000000001000100BFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFC03F1F9FFFFFFFFFFFFFFF
+FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFEFFDF6F0F3F9FFFFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF
+9E3F0F5FDFFFFFFFFFFEFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF9F10CFFFFFFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FEDF5F0000000000000000000000000000000000000000000100BFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFAE400F80EFFEFFFEFEFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFEFFFFFFFFEE9F2F0F60AFFFFEFFFFFF
+FEFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFB05E0F2F
+9FEFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF9E0FCEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FEFFDF6F100000000000000000000000000000000001000000EFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF8F1E1F9FEFFFFEFFFEFFFFFFFFFFFFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFEDF8F300F4F9FDEFFFF
+FEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9E4F0F1E70DEFFFF
+FFFFFFFEFFFFFFFFFFFFFFFEFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF9F10CEFFFFFEFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFFFFFF
+FEFFFFEF9F30000000000000000000000000000000000100FFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF5F004FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF8F4F0F1F4F80
+BFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFEFBF8F4F200F4E8FDEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF9F0FCFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFCE6F1F000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFEFFFEFFEEA05F0F2F8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFCF8F5F3F
+000F3F4F7F7E8FBFBFBFBFBFC0BF8F7F7F4E400F00405D90CFFFFFFFFFFFFEFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF9F0FCFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFECF6F2F000000000000000000000001CEFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFEFFFFEFAF702E013F8FDFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFE
+DFC09F7F7F5F3F3F3F403E3F3F5F7F7F9FBFDFFEFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFEFF9F0FCFFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF9E10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFFFFDF9F702F01010000000000009FFFFFFEFFFEFFFFFFFFFEFFFFFEBF
+AF804F1F003F6FAFEFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFEFFFF
+FEFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFEFFFFFFFFFEFFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF9F0FCFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
+0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FEFFFFFFFEFFFFFFFFFFFFFFFECF9F7E603E2F000F3F7F7F7F7F807E7F3F3F3F00002F3F
+7F9FD0FEFFFFFFFEFFFFFFFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFEFF
+FFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E10CE
+FFFEFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFCFBF7F7F7F7F7D807FAEBFBFEFFFFFFFFF
+FFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFEFFFEFFFFFFFE
+FEFFFFFEFFFEFFFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFEFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F10CFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF
+FFFFFFFFFEFFFFFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFF
+FFFFFEFEFFFEFFFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFFEFFFF
+FFFFFFFEFFFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E0FCEFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFEFFFFFFFFFEFFFFFFFFFF
+FEFFFFFEFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F10CEFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF
+FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFEFFFEFFFFFFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF9F0FCFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFEFF9F0FCFFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E10CFFFFFFFFEFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF9F0FCFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E10CEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFF9E0FCEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFF9F10CEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFF9F0FCFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF9F0FCFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFEFF9F0FCFFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFF9E10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF9F0FCFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FF9E10CEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
+10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E0FCE
+FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F10CEFFFF
+FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF9F0FCFFFFF
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFEFF9F0FCFFFFE
+FFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E10CFFFFFFFFEFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF9F0FCFFFFE
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E10CEFFFEFFFEFFFEFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E0FCEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F10CEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF9F0FCFFFFF
+FFFEFFFFFFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFEFFFEFF9F0FCFFFFE
+FFFEFFFFFFFFFFFFFF9E10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF9F0FCFFFFE
+FFFFFFFFFFFFFF9F0FCEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFF9E10CEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FCFFFFF
+FFFFFF9F10CFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF9F0FCFFFFF
+FF9E0FCEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9F0FCFFF9F
+10CEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0F7F0FCF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0FCFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFend
+%%PageTrailer
+%%Trailer
+%%EOF
diff --git a/doc/logo-36.jpg b/doc/logo-36.jpg
new file mode 100644 (file)
index 0000000..04dfba1
Binary files /dev/null and b/doc/logo-36.jpg differ
diff --git a/doc/logo-36.pdf b/doc/logo-36.pdf
new file mode 100644 (file)
index 0000000..5882faf
Binary files /dev/null and b/doc/logo-36.pdf differ
diff --git a/doc/montecarlo.texi b/doc/montecarlo.texi
new file mode 100644 (file)
index 0000000..f017f86
--- /dev/null
@@ -0,0 +1,266 @@
+@cindex Monte Carlo Go
+@cindex UCT algorithm
+In Monte Carlo Go the engine plays random games to the
+end, generating moves from a pattern database within
+the context of the algorithm UCT (upper confidence
+bounds applied to trees).  This algorithm allowed the
+program MoGo (@uref{http://www.lri.fr/~gelly/MoGo.htm}, 
+to become the first computer program to defeat a
+professional while taking a 9 stone handicap
+(@uref{http://senseis.xmp.net/?MoGo}).
+
+GNU Go 3.8 can play 9x9 Go with the option
+@option{--monte-carlo} using the UCT algorithm.
+For command line options, see @xref{Invoking GNU Go}.
+
+During reading, the engine makes incremental updates
+of local 3x3 neighborhood, suicide status, self-atari
+status, and number of stones captured, for each move.
+
+GNU Go's simulations (Monte Carlo games) are pattern generated.
+The random playout move generation is distributed
+strictly proportional to move values computed by table
+lookup from a local context consisting of 3x3
+neighborhood, opponent suicide status, own and
+opponent self-atari status, number of stones captured
+by own and opponent move, and closeness to the
+previous move. Let's call this local context simply "a
+pattern" and the table "pattern values" or simply
+"patterns".
+
+There are three built-in databases that you can select
+using the option @option{--mc-patterns <name>}, where
+@option{<name>} is one of
+
+@itemize
+@item @command{mc_montegnu_classic}
+@item @command{mc_mogo_classic}
+@item @command{mc_uniform}
+@end itemize
+
+The first of these is an approximation of the previous random move
+generation algorithm. The @command{mogo_classic} pattern values is an
+approximation of the simulation policy used by early versions of MoGo,
+as published in the report @uref{http://hal.inria.fr/inria-00117266,
+odification of UCT with Patterns in Monte-Carlo Go}
+RR-6062, by Sylvain Gelly, Yizao Wang, Rémi Munos, and
+Olivier Teytaud. The uniform pattern values is the so
+called "light" playout which chooses uniformly between
+all legal moves except single point proper eyes.
+
+If you're not satisfied with these you can also tune your own
+pattern values with a pattern database file and load it at runtime
+with @option{--mc-load-patterns <name>} adding your own
+pattern database.
+
+Let's start with the uniform pattern values. Those are defined by the
+file @file{patterns/mc_uniform.db}, which looks like this:
+
+@example
+
+oOo
+O*O
+oO?
+
+:0
+
+oOo
+O*O
+---
+
+:0
+
+|Oo
+|*O
++--
+
+:0
+@end example
+
+Patterns are always exactly 3x3 in size with the move at the center
+point. The symbols are the usual for GNU Go pattern databases:
+
+@example
+* move
+O own stone (i.e. the same color as the color to move)
+o own stone or empty
+X opponent stone
+x opponent stone or empty
+? own stone, opponent stone, or empty
+| vertical edge
+- horizontal edge
++ corner
+@end example
+
+There's also a new symbol:
+
+@example
+% own stone, opponent stone, empty, or edge
+@end example
+
+After the pattern comes a line starting with a colon. In all these
+patterns it says that the pattern has a move value of 0, i.e. must not
+be played. Unmatched patterns have a default value of 1. When all move
+values are zero for both players, the playout will stop. Including the
+three patterns above is important because otherwise the playouts would
+be likely to go on indefinitely, or as it actually happens be
+terminated at a hard-coded limit of 600 moves. Also place these
+patterns at the top of the database because when multiple patterns
+match, the first one is used, regardless of the values.
+
+When using only these patterns you will probably notice that it plays
+rather heavy, trying hard to be solidly connected. This is because
+uniform playouts are badly biased with a high probability of non-solid
+connections being cut apart. To counter this you could try a pattern
+like
+
+@example
+?X?
+O*O
+x.?
+
+:20,near
+@end example
+
+to increase the probability that the one-point jump is reinforced when
+threatened. Here we added the property "near", which means that the
+pattern only applies if the previous move was played "near" this move.
+Primarily "near" means within the surrounding 3x3 neighborhood but it
+also includes certain cases of liberties of low-liberty strings
+adjacent to the previous move, e.g. the move to extend out of an atari
+created by the previous move. You have to read the source to find out
+the exact rules for nearness.
+
+We could also be even more specific and say
+
+@example
+?X?
+O*O
+x.?
+
+:20,near,osafe,xsafe
+@end example
+
+to exclude the cases where this move is a self atari (osafe) or would
+be a self-atari for the opponent (xsafe).
+
+It may also be interesting to see the effect of capturing stones. A
+catch-all pattern for captures would be
+
+@example
+?X%
+?*%
+%%%
+
+:10,ocap1,osafe
+:20,ocap2
+:30,ocap3
+@end example
+
+where we have used multiple colon lines to specify different move
+values depending on the number of captured stones; value 10 for a
+single captured stone, value 20 for two captured stones, and value 30
+for three or more captured stones. Here we also excluded self-atari
+moves in the case of 1 captured stone in order to avoid getting stuck
+in triple-ko in the playouts (there's no superko detection in the
+playouts).
+
+The full set of pattern properties is as follows:
+
+@ftable @code
+@item near
+The move is "near" the previous move.
+
+@item far
+The move is not "near" the previous move.
+
+@item osafe
+The move is not a self-atari.
+
+@item ounsafe
+The move is a self-atari.
+
+@item xsafe
+The move would not be a self-atari for the opponent.
+
+@item xunsafe
+The move would be a self-atari for the opponent.
+
+@item xsuicide
+The move would be suicide for the opponent
+
+@item xnosuicide
+The move would not be suicide for the opponent.
+
+@item ocap0
+The move captures zero stones.
+
+@item ocap1
+The move captures one stone.
+
+@item ocap2
+The move captures two stones.
+
+@item ocap3
+The move captures three or more stones.
+
+@item ocap1+
+The move captures one or more stones.
+
+@item ocap1-
+The move captures at most one stone.
+
+@item ocap2+
+The move captures two or more stones.
+
+@item ocap2-
+The move captures at most two stones.
+
+@item xcap0
+An opponent move would capture zero stones.
+
+@item xcap1
+An opponent move would capture one stone.
+
+@item xcap2
+An opponent move would capture two stones.
+
+@item xcap3
+An opponent move would capture three or more stones.
+
+@item xcap1+
+An opponent move would capture one or more stones.
+
+@item xcap1-
+An opponent move would capture at most one stone.
+
+@item xcap2+
+An opponent move would capture two or more stones.
+
+@item xcap2-
+An opponent move would capture at most two stones.
+@end ftable
+
+These can be combined arbitrarily but all must be satisfied for the
+pattern to take effect. If contradictory properties are combined, the
+pattern will never match.
+
+@subsection Final Remarks
+
+@itemize
+@item  Move values are unsigned 32-bit integers. To avoid overflow in
+computations it is highly recommended to keep the values below
+10000000 or so.
+@item There is no speed penalty for having lots of patterns in the
+database. The average time per move is approximately constant
+(slightly dependent on how often stones are captured or become low
+on liberties) and the time per game mostly depends on the average
+game length.
+@item For more complex pattern databases, see
+@file{patterns/mc_montegnu_classic.db} and @file{patterns/mc_mogo_classic.db}.
+@end itemize
+
+Nobody really knows how to tune the random playouts to get as strong
+engine as possible. Please play with this and report any interesting
+findings, especially if you're able to make it substantially stronger
+than the @file{montegnu_classic} patterns.
diff --git a/doc/move_generation.texi b/doc/move_generation.texi
new file mode 100644 (file)
index 0000000..5429070
--- /dev/null
@@ -0,0 +1,460 @@
+
+@menu
+* Move generation Intro::      Introduction.
+* Move Reasons::               Generation of move reasons.
+* Move Reason Details::                Detailed Descriptions of Move Reasons
+* Valuation::                  Valuating the moves
+* End Game::                   Endgame move generation
+@end menu
+
+@node Move generation Intro
+@section Introduction
+
+GNU Go 3.0 introduced a move generation scheme substantially different
+from earlier versions. In particular, it was different from the method of move
+generation in GNU Go 2.6.
+
+In the old scheme, various move generators suggested different moves with
+attached values. The highest such value then decided the move. There were two
+important drawbacks with this scheme:
+
+@itemize @bullet
+@item 
+Efficient multipurpose moves could only be found by patterns which
+explicitly looked for certain combinations, such as a simultaneous
+connection and cut. There was also no good way to e.g. choose among
+several attacking moves.
+
+@item
+The absolute move values were increasingly becoming harder to tune with
+the increasing number of patterns. They were also fairly subjective and
+the tuning could easily break in unexpected ways when something changed,
+e.g. the worm valuation.
+@end itemize
+
+The basic idea of the new move generation scheme is that the various
+move generators suggest reasons for moves, e.g. that a move captures
+something or connects two strings, and so on. When all reasons for the
+different moves have been found, the valuation starts. The primary
+advantages are
+
+@itemize @bullet
+@item
+The move reasons are objective, in contrast to the move values in
+the old scheme. Anyone can verify whether a suggested move reason is
+correct.
+
+@item
+The centralized move valuation makes tuning easier. It also allows
+for style dependent tuning, e.g. how much to value influence
+compared to territory. Another possibility is to increase the value
+of safe moves in a winning position.
+@end itemize
+
+
+@node Move Reasons
+@section Generation of move reasons
+@cindex move reasons
+
+Each move generator suggests a number of moves.  It justifies each move
+suggestion with one or move @dfn{move reasons}.  These move reasons
+are collected at each intersection where the moves are suggested for
+later valuation. Here is a partial list of of move reasons considered by GNU
+Go. (The complete list may be found in @file{move_reasons.h}.)
+
+@table @code
+@item ATTACK_MOVE
+@itemx DEFEND_MOVE
+Attack or defend a worm.
+@item ATTACK_THREAT_MOVE
+@itemx DEFEND_THREAT_MOVE
+Threaten to attack or defend a worm.
+@item EITHER_MOVE
+A move that either achieves one goal or another (at the moment this only
+used for attacks on worms).
+@item ALL_MOVE
+At the moment this is used for a move that defends two worms threatened
+by a double attack.
+@item CONNECT_MOVE
+@itemx CUT_MOVE
+Connect or cut two worms.
+@item ANTISUJI_MOVE
+Declare an antisuji or forbidden move.
+@item SEMEAI_MOVE
+@itemx SEMEAI_THREAT
+Win or threaten to win a semeai.
+@item EXPAND_TERRITORY_MOVE
+@item EXPAND_MOYO_MOVE
+Move expanding our territory/moyo. These reasons are at the moment
+treated identically.
+@item VITAL_EYE_MOVE
+A vital point for life and death.
+@item STRATEGIC_ATTACK_MOVE
+@itemx STRATEGIC_DEFEND_MOVE
+Moves added by 'a' and 'd' class patterns (@pxref{Pattern Classification})
+which (perhaps intangibly) attack or defend a dragon.
+@item OWL_ATTACK_MOVE
+@itemx OWL_DEFEND_MOVE
+An owl attack or defense move.
+@item OWL_ATTACK_THREAT
+@itemx OWL_DEFEND_THREAT
+A threat to owl attack or defend a group.
+@item OWL_PREVENT_THREAT
+A move to remove an owl threat.
+@item UNCERTAIN_OWL_ATTACK
+@itemx UNCERTAIN_OWL_DEFENSE
+An uncertain owl attack or defense. This means that the owl code could
+not decide the outcome, because the owl node limit was reached.
+@item MY_ATARI_ATARI_MOVE
+A move that starts a chain of ataris, eventually leading to a
+capture.
+@item YOUR_ATARI_ATARI_MOVE
+A move that if played by the opponent starts a chain of ataris for the
+opponent, leading to capture, which is also a safe move for us. Preemptively
+playing such a move almost always defends the threat.
+@end table
+
+The attack and defend move types can have a suffix to denote moves whose
+result depends on a ko, e.g. @code{OWL_ATTACK_MOVE_GOOD_KO}. Here
+@code{..._GOOD_KO} and @code{..._BAD_KO} correspond to @code{KO_A} and
+@code{KO_B} as explained in @ref{Ko}.
+See @file{engine/move_reasons.h} for the full of move reasons.
+
+@strong{NOTICE:} Some of these are reasons for @strong{not} playing a move.
+
+More detailed discussion of these move reasons will be found in the
+next section.
+
+@node Move Reason Details
+@section Detailed Descriptions of various Move Reasons
+
+@menu
+* Attack and Defense::             Worm Attack and Defense
+* Threats to Attack or Defend::    Worm Threats
+* Multi Attack or Defense::        Combined Attacks and Defenses
+* Cutting and Connecting::         Cutting and Connecting moves
+* Semeai::                         Semeai winning moves
+* Making eyes::                    Vital eye moves
+* Antisuji moves::                 Never play these!
+* Territorial moves::              Block or expand territory
+* Owl attack and defense::         Owl Attack and Defense
+* Combination Attacks::            Coordinated threats such as double ataris
+@end menu
+
+@node Attack and Defense
+@subsection Attacking and defending moves
+
+A move which tactically captures a worm is called an @dfn{attack move} and a
+move which saves a worm from being tactically captured is called a
+@dfn{defense move}. It is understood that a defense move can only exist if
+the worm can be captured, and that a worm without defense only is
+attacked by moves that decrease the liberty count or perform necessary
+backfilling.
+
+It is important that all moves which attack or defend a certain string
+are found, so that the move generation can make an informed choice
+about how to perform a capture, or find moves which capture and/or
+defend several worms.
+
+Attacking and defending moves are first found in @code{make_worms} while it
+evaluates the tactical status of all worms, although this step only
+gives one attack and defense (if any) move per worm. Immediately
+after, still in @code{make_worms}, all liberties of the attacked worms are
+tested for additional attack and defense moves. More indirect moves
+are found by @code{find_attack_patterns} and @code{find_defense_patterns},
+which match the A (attack) and D (defense) class patterns in
+@file{patterns/attack.db} and @file{patterns/defense.db} As a final step, all
+moves which fill some purpose at all are tested whether they additionally
+attacks or defends some worm. (Only unstable worms are analyzed.)
+
+@node Threats to Attack or Defend
+@subsection Threats to Attack or Defend
+
+A threat to attack a worm, but where the worm can be defended is used as
+a secondary move reason.  This move reason can enhance the value of a
+move so that it becomes sente.  A threatening move without any other
+justification can also be used as a ko threat.  The same is true for a
+move that threatens defense of a worm, but where the worm can still be
+captured if the attacker doesn't tenuki.
+
+Threats found by the owl code are called @strong{owl threats} and they
+have their own owl reasons.
+
+@node Multi Attack or Defense
+@subsection Multiple attack or defense moves
+
+Sometimes a move attacks at least one of a number of worms or
+simultaneously defends all of several worms. These moves are noted
+by their own move reasons.
+
+@node Cutting and Connecting
+@subsection Cutting and connecting moves
+
+Moves which connect two distinct dragons are called @code{connecting moves}.
+Moves which prevent such connections are called @dfn{cutting moves}. Cutting
+and connecting moves are primarily found by pattern matching, the @code{C}
+and @code{B} class patterns.
+
+A second source of cutting and connecting moves comes from the attack
+and defense of cutting stones. A move which attacks a worm
+automatically counts as a connecting move if there are multiple
+dragons adjacent to the attacked worm. Similarly a defending move
+counts as a cutting move. The action taken when a pattern of
+this type is found is to induce a connect or cut move reason.
+
+When a cut or connect move reason is registered, the involved dragons
+are of course stored. Thus the same move may cut and/or connect
+several pairs of dragons.
+
+@node Semeai
+@subsection Semeai winning moves
+
+A move which is necessary to win a capturing race is called a @dfn{semeai
+move}. These are similar to attacking moves, except that they involve
+the simultaneous attack of one worm and the defense of another. As for
+attack and defense moves, it's important that all moves which win a
+semeai are found, so an informed choice can be made between them.
+
+Semeai move reasons should be set by the semeai module. However this
+has not been implemented yet. One might also wish to list moves
+which increase the lead in a semeai race (removes ko threats) for use
+as secondary move reasons. Analogously if we are behind in the race.
+
+@node  Making eyes
+@subsection Making or destroying eyes
+
+A move which makes a difference in the number of eyes produced from an
+eye space is called an @dfn{eye move}. It's not necessary that the eye is
+critical for the life and death of the dragon in question, although it
+will be valued substantially higher if this is the case. As usual it's
+important to find all moves that change the eye count.
+
+(This is part of what eye_finder was doing. Currently it only finds
+one vital point for each unstable eye space.)
+
+@node  Antisuji moves
+@subsection Antisuji moves
+
+Moves which are locally inferior or for some other reason must not be
+played are called @dfn{antisuji moves}. These moves are generated by pattern
+matching. Care must be taken with this move reason as the move under
+no circumstances will be played.
+
+@node Territorial moves
+@subsection Territorial moves
+
+Any move that increases territory gets a move reason. This is the expand
+territory move reason. That move reason is added by the @samp{e}
+patterns in @file{patterns/patterns.db}. Similarly the @samp{E} patterns
+attempt to generate or mitigate a moyo, which is a region of influence
+not yet secure territory, yet valuable. Such a pattern sets the ``expand
+moyo'' move reason.
+
+@node Owl attack and defense
+@subsection Attacking and Defending Dragons
+@findex owl_reasons
+
+Just as the tactical reading code tries to determine when a worm
+can be attacked or defended, the owl code tries to determine
+when a dragon can get two eyes and live. The function @code{owl_reasons()}
+generates the corresponding move reasons.
+
+The owl attack and owl defense move reasons are self explanatory.
+
+The owl attack threat reason is generated if owl attack on an
+opponent's dragon fails but the owl code determines that the
+dragon can be killed with two consecutive moves. The killing
+moves are stored in @code{dragon[pos].owl_attack_point}
+and @code{dragon[pos].owl_second_attack_point}.
+
+Similarly if a friendly dragon is dead but two moves can revive it,
+an owl defense threat move reason is generated.
+
+The prevent threat reasons are similar but with the colors
+reversed: if the opponent has an attack threat move then a
+move which removes the threat gets a prevent threat move
+reason.
+
+The owl uncertain move reasons are generated when the owl
+code runs out of nodes. In order to prevent the owl code from
+running too long, a cap is put on the number of nodes one owl
+read can generate. If this is exceeded, the reading is cut
+short and the result is cached as usual, but marked uncertain.
+In this case an owl uncertain move reason may be generated.
+For example, if the owl code finds the dragon alive but is
+unsure, a move to defend may still be generated.
+
+@node Combination Attacks
+@subsection Combination Attacks
+@findex atari_atari
+
+The function @code{atari_atari} tries to find a sequence of ataris
+culminating in an unexpected change of status of any opponent string,
+from @code{ALIVE} to @code{CRITICAL}. Once such a sequence of ataris
+is found, it tries to shorten it by rejecting irrelevant moves.
+
+@node Valuation
+@section Valuation of suggested moves
+@findex value_move_reasons()
+
+At the end of the move generation process, the function
+@code{value_move_reasons()} tries to assign values to the
+moves for the purpose of selecting the best move. The
+single purpose of the move valuation is to try to rank
+the moves so that the best move gets the highest
+score. In principle these values could be arbitrary,
+but in order to make it easier to evaluate how well the
+valuation performs, not to mention simplify the tuning,
+we try to assign values which are consistent with the
+usual methods of counting used by human Go players,
+as explained for example in @emph{The Endgame} by Ogawa
+and Davies.
+
+Moves are valued with respect to four different criteria. These are
+
+@itemize @bullet
+@item territorial value
+@item strategical value
+@item shape value,
+@item secondary value. 
+@end itemize
+
+All of these are floats and should be measured in terms of actual
+points.
+
+The territorial value is the total change of expected territory caused
+by this move. This includes changes in the status of groups if the move
+is an attack or a defense move.
+
+Beginning with GNU Go 3.0, the influence function plays an important role
+in estimating territory (@pxref{Influence and Territory}). It is used
+to make a guess at each intersection how likely it is that it will become
+black or white territory. The territorial value sums up the changes
+in these valuations.
+
+Strategical value is a measure of the effect the move has on the
+safety of all groups on the board. Typically cutting and connecting
+moves have their main value here. Also edge extensions, enclosing
+moves and moves towards the center have high strategical value. The
+strategical value should be the sum of a fraction of the territorial
+value of the involved dragons. The fraction is determined by the
+change in safety of the dragon.
+
+Shape value is a purely local shape analysis. An
+important role of this measure is to offset mistakes made by the
+estimation of territorial values. In open positions it's
+often worth sacrificing a few points of (apparent) immediate profit to
+make good shape. Shape value is implemented by pattern matching, the
+Shape patterns.
+
+Secondary value is given for move reasons which by themselves are not
+sufficient to play the move. One example is to reduce the number of
+eyes for a dragon that has several or to attack a defenseless worm.
+
+When all these values have been computed, they are summed, possibly
+weighted (secondary value should definitely have a small weight), into
+a final move value. This value is used to decide the move.
+
+@menu
+* Territorial value::            How much territory does a move gain
+* Strategical value::             Strategical gains from a move
+* Shape factor::                 Local shape
+* Minimum Value::                 Minimum value
+* Secondary Value::               Other, more indirect, gains from a move
+* Threats and Followup Value::    Valuation of attack and defense threats
+@end menu
+
+@node Territorial value
+@subsection Territorial Value
+@findex estimate_territorial_value
+
+The algorithm for computing territorial value is in the function
+@code{estimate_territorial_value}. As the name suggests, it seeks
+to estimate the change in territory.
+
+It considers all groups that are changed from alive to death or vice-versa
+due to this move. Also, it makes an assumption whether the move should be
+considered safe. If so, the influence module is called:  The function
+@code{influence_delta_territory} estimates the territorial effect of
+both the stone played and of the changes of group status'.
+
+The result returned by the influence module is subject to a number of
+corrections. This is because some move reasons cannot be evaluated by a
+single call to the influence function, such as moves depending on a ko.
+
+@node Strategical value
+@subsection Strategical Value
+
+Strategical defense or attack reasons are assigned to any move
+which matches a pattern of type @samp{a} or @samp{d}. These are
+moves which in some (often intangible) way tend to help
+strengthen or weaken a dragon. Of course strengthening a
+dragon which is already alive should not be given much value,
+but when the move reason is generated it is not necessary
+to check its status or safety. This is done later, during
+the valuation phase.
+
+@node Shape factor
+@subsection Shape Factor
+
+In the value field of a pattern (@pxref{Pattern Values}) one may
+specify a shape value. 
+
+This is used to compute the shape factor, which multiplies the
+score of a move. We take the largest positive contribution to
+shape and add 1 for each additional positive contribution
+found.  Then we take the largest negative contribution to
+shape, and add 1 for each additional negative contribution. The
+resulting number is raised to the power 1.05 to obtain the
+shape factor.
+
+The rationale behind this complicated scheme is that every
+shape point is very significant. If two shape contributions
+with values (say) 5 and 3 are found, the second contribution
+should be devalued to 1. Otherwise the engine is too difficult
+to tune since finding multiple contributions to shape can cause
+significant overvaluing of a move.
+
+@node Minimum Value
+@subsection Minimum Value
+
+A pattern may assign a minimum (and sometimes also a maximum) 
+value. For example the Joseki patterns have values which are
+prescribed in this way, or ones with a @code{value} field.
+One prefers not to use this approach but in practice it is
+sometimes needed.
+
+In the fuseki, there are often several moves with identical minimum
+value. GNU Go chooses randomly between such moves, which ensures
+some indeterminacy of GNU Go's play. Later in the game, GNU Go's
+genuine valuation of such a move is used as a secondary criterion.
+
+@node Secondary Value
+@subsection Secondary Value
+
+Secondary move reasons are weighed very slightly. Such a move
+can tip the scales if all other factors are equal.
+
+@node Threats and Followup Value
+@subsection Threats and Followup Value
+
+Followup value refers to value which may acrue if we get two
+moves in a row in a local area. It is assigned for moves that threaten
+to attack or defend a worm or dragon. Also, since GNU Go 3.2 the influence
+module makes an assessment of the possible purely territorial followup
+moves.  In cases where these two heuristics are not sufficient we
+add patterns with a @code{followup_value} autohelper macro.
+
+Usually, the followup value gives only a small contribution; e.g. if
+it the followup value is very large, then GNU Go treats the move as sente by
+doubling its value.  However, if the largest move on the board is a ko
+which we cannot legally take, then such a move becomes attractive as a ko
+threat and the full followup value is taken into account.
+
+@node End Game
+@section End Game
+
+Endgame moves are generated just like any other move by GNU Go. In fact,
+the concept of endgame does not exist explicitly, but if the largest
+move initially found is worth 6 points or less, an extra set of patterns
+in @file{endgame.db} is matched and the move valuation is redone.
diff --git a/doc/moyo.texi b/doc/moyo.texi
new file mode 100644 (file)
index 0000000..9ad65d0
--- /dev/null
@@ -0,0 +1,257 @@
+
+@menu
+* Moyo history::               History of @file{moyo.c} and @file{score.c}
+* Bouzy::                       Bouzy's algorithm
+@end menu
+
+The file @file{score.c} contains alternative algorithms for the
+computation of Territory and Moyos. These algorithms are used in
+@code{estimate_score()} but apart from that are generally
+@strong{not} used in the rest of the engine since the concepts of
+Territory, Moyo and Area were reimplemented using the influence
+code (@pxref{Territory and Moyo}). The function @code{estimate_score()},
+which is the only way this code is used in the engine, could
+easily be replaced with a function such as
+@code{influence_score()} based on the influence code.
+
+@node Moyo history
+@section Moyo history
+
+In GNU Go 2.6 extensive use was made of an algorithm from
+Bruno Bouzy's dissertation, which is available at:
+@url{ftp://www.joy.ne.jp/welcome/igs/Go/computer/bbthese.ps.Z}
+This algorithm starts with the characteristic function of the
+live groups on the board and performs @samp{n} operations
+called dilations, then @samp{m} operations called erosions.
+If n=5 and m=21 this is called the 5/21 algorithm.
+
+The Bouzy 5/21 algorithm is interesting in that it corresponds
+reasonably well to the human concept of territory.  This
+algorithm is still used in GNU Go 3.6 in the function
+@code{estimate_score}. Thus we associate the 5/21 algorithm
+with the word @dfn{territory}. Similarly we use words
+@dfn{moyo} and @dfn{area} in reference to the 5/10
+and 4/0 algorithms, respectively.
+
+The principle defect of the algorithm is that it is not
+tunable. The current method of estimating moyos and territory
+is in @file{influence.c} (@pxref{Influence}). The territory,
+moyo and area concepts have been reimplemented using the
+influence code.
+
+The Bouzy algorithm is briefly reimplemented in the file
+@file{scoring.c} and is used by GNU Go 3.6 in estimating
+the score.
+
+Not all features of the old @file{moyo.c} from
+GNU Go 2.6 were reimplemented---particularly the deltas were
+not---but the reimplementation may be more readable.
+
+@node Bouzy
+@section Bouzy's 5/21 algorithm
+
+Bouzy's algorithm was inspired by prior work of Zobrist and ideas from
+computer vision for determining territory. This algorithm is based on two
+simple operations, DILATION and EROSION. Applying dilation 5 times and erosion
+21 times determines the territory.
+
+To get a feeling for the algorithm, take a position in the early
+middle game and try the colored display using the @option{-m 1} option
+in an RXVT window. The regions considered territory by this algorithm
+tend to coincide with the judgement of a strong human player.
+
+Before running the algorithm, dead stones (@code{dragon.status==0}) 
+must be "removed."
+
+Referring to page 86 of Bouzy's thesis, we start with a function
+taking a high value (ex : +128 for black, -128 for white) on stones on
+the goban, 0 to empty intersections. We may iterate the following
+operations:
+
+@dfn{dilation}: for each intersection of the goban, if the intersection
+is @code{>= 0}, and not adjacent to a @code{< 0} one, then add to the intersection
+the number of adjacent >0 intersections. The same for other color : if
+the intersection is @code{<= 0}, and not adjacent to a @code{> 0} one, then subtract
+the number of @code{< 0} intersections.
+
+@dfn{erosion}: for each intersection @code{> 0} (or @code{< 0}), subtract (or
+add) the number of adjacent @code{<= 0} (or @code{>= 0}) intersection. Stop at zero.  The
+algorithm is just : 5 dilations, then 21 erosions. The number of erosions
+should be 1+n(n-1) where n=number of dilation, since this permit to have an
+isolated stone to give no territory. Thus the couple 4/13 also works, but it
+is often not good, for example when there is territory on the 6th line.
+
+For example, let us start with a tobi. 
+
+@example
+
+           128    0    128   
+
+@end example
+
+1 dilation :
+
+@example
+@group
+
+            1          1 
+
+       1   128    2   128   1
+
+            1          1
+
+@end group
+@end example
+            
+2 dilations :
+
+@example
+@group
+
+            1          1
+
+       2    2     3    2    2
+
+   1   2   132    4   132   2   1
+
+       2    2     3    2    2
+              
+            1          1
+
+@end group
+@end example
+
+3 dilations :
+
+@example
+@group
+
+            1          1
+
+       2    2     3    2    2
+     
+   2   4    6     6    6    4   2
+
+1  2   6   136    8   136   6   2   1
+
+   2   4    6     6    6    4   2
+
+       2    2     3    2    2
+
+            1          1
+
+@end group
+@end example
+
+and so on...
+
+Next, with the same example 
+
+3 dilations and 1 erosion :
+
+
+@example
+@group
+
+             2     2     2
+
+    0   4    6     6     6    4
+
+0   2   6   136    8    136   6    2
+
+    0   4    6     6     6    4
+
+             2     2     2
+
+@end group
+@end example
+
+
+3 dilations and 2 erosions :
+
+@example
+@group
+
+                 1
+
+      2    6     6     6    2
+
+      6   136    8    136   6
+
+      2    6     6     6    2
+      
+                 1
+
+@end group
+@end example
+
+3 dil. / 3 erosions :
+
+
+@example
+@group
+
+           5     6     5
+
+      5   136    8    136   5
+      
+           5     6     5
+           
+@end group
+@end example
+           
+3/4 :
+
+
+@example
+@group
+
+          3     5     3 
+          
+      2  136    8    136   2          
+           
+          3     5     3
+          
+@end group
+@end example
+          
+3/5 :
+
+@example
+@group
+
+          1     4     1
+
+         136    8    136
+          
+          1     4     1
+          
+@end group
+@end example
+
+3/6 :
+
+@example
+@group
+
+                3
+         
+         135    8    135
+         
+                3
+
+@end group
+@end example
+
+3/7 :
+
+@example
+@group
+
+         132    8    132
+         
+@end group
+@end example
+
+We interpret this as a 1 point territory.
+
diff --git a/doc/newlogo.eps b/doc/newlogo.eps
new file mode 100644 (file)
index 0000000..fd2a105
--- /dev/null
@@ -0,0 +1,1427 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.11 by Peter Kirchgessner
+%%Title: /home/bump/freedom/gnugo-3.1.30/doc/newlogo.eps
+%%CreationDate: Sat Mar 30 08:22:50 2002
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 298 284
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228 14.173228 translate
+% Translate to begin of first scanline
+0.000000 269.000000 translate
+283.000000 -269.000000 scale
+% Image geometry
+283 269 8
+% Transformation matrix
+[ 283 0 0 269 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 283 string def
+/gstr 283 string def
+/bstr 283 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData:        77729 ASCII Bytes
+colorimage
+XoAD#rVllsrr2utJcE[gJ,~>
+XoAD#rVllsrr2utJcE[gJ,~>
+XoAD#rVllsrr2utJcE[gJ,~>
+Y5\M$qu6`ss8ITL_uG5~>
+Y5\M$qu6`ss8ITL_uG5~>
+Y5\M$qu6`ss8ITL_uG5~>
+Z2Y$#05n&_s8Mus"9/?#rdk*gs*t~>
+Z2Y$#05n&_s8Mus"9/?#rdk*gs*t~>
+Z2Y$#05n&_s8Mus"9/?#rdk*gs*t~>
+Yl=]qrW!!QORE)I!<.QL_uG5~>
+Yl=]qrW!!QORE)I!<.QL_uG5~>
+Yl=]qrW!!QORE)I!<.QL_uG5~>
+YQ"Tpqu?b)hgtgCs*t~>
+YQ"Tpqu?b)hgtgCs*t~>
+YQ"Tpqu?b)hgtgCs*t~>
+YQ"Y&T_e]kJ,fQJJcE[gJ,~>
+YQ"Y&T_e]kJ,fQJJcE[gJ,~>
+YQ"Y&T_e]kJ,fQJJcE[gJ,~>
+XoAWf!!!$"!!-GXs2+ed~>
+XoAWf!!!$"!!-GXs2+ed~>
+XoAWf!!!$"!!-GXs2+ed~>
+XoAG$;#:4mIt@X;s*t~>
+XoAG$;#:4mIt@X;s*t~>
+XoAG$;#:4mIt@X;s*t~>
+XT&=i&,lP3!<>@ardk*gs*t~>
+XT&=i&,lP3!<>@ardk*gs*t~>
+XT&=i&,lP3!<>@ardk*gs*t~>
+Y5\q0s8R!;!!*'";#^LoJcEaiJ,~>
+Y5\q0s8R!;!!*'";#^LoJcEaiJ,~>
+Y5\q0s8R!;!!*'";#^LoJcEaiJ,~>
+X8`17rW)s!!3^tR_uG5~>
+X8`17rW)s!!3^tR_uG5~>
+X8`17rW)s!!3^tR_uG5~>
+XoAJ%s*stI!+1<W_Z,,~>
+XoAJ%s*stI!+1<W_Z,,~>
+XoAJ%s*stI!+1<W_Z,,~>
+Z2Xh'rr3'!n/qW0!AEnms2+ed~>
+Z2Xh'rr3'!n/qW0!AEnms2+ed~>
+Z2Xh'rr3'!n/qW0!AEnms2+ed~>
+XT&8rrW!",mf%e;_Z,,~>
+XT&8rrW!",mf%e;_Z,,~>
+XT&8rrW!",mf%e;_Z,,~>
+Y5\^p:B:FqJ,Y$!_#Jo~>
+Y5\^p:B:FqJ,Y$!_#Jo~>
+Y5\^p:B:FqJ,Y$!_#Jo~>
+YQ"dA*WQ0oc[l,1s*t~>
+YQ"dA*WQ0oc[l,1s*t~>
+YQ"dA*WQ0oc[l,1s*t~>
+ec,^Ms8Moq!RU?5rrE&trrE&irrq:e!!!R[JcEC_J,~>
+ec,^Ms8Moq!RU?5rrE&trrE&irrq:e!!!R[JcEC_J,~>
+ec,^Ms8Moq!RU?5rrE&trrE&irrq:e!!!R[JcEC_J,~>
+g&D0Rs8W)qrrrE%s%j6qqu7W7s8N&urr<#ts8W)fO=pSe?NC-,?f1n`rr;urrrE%Ls2G"g~>
+g&D0Rs8W)qrrrE%s%j6qqu7W7s8N&urr<#ts8W)fO=pSe?NC-,?f1n`rr;urrrE%Ls2G"g~>
+g&D0Rs8W)qrrrE%s%j6qqu7W7s8N&urr<#ts8W)fO=pSe?NC-,?f1n`rr;urrrE%Ls2G"g~>
+eGfN?rr33%s8W)&!)WXo#6+Z&rr;usrVuos"0`79!W<!#5L9B/rr3-#s8N&tJcEXfJ,~>
+eGfN?rr33%s8W)&!)WXo#6+Z&rr;usrVuos"0`79!W<!#5L9B/rr3-#s8N&tJcEXfJ,~>
+eGfN?rr33%s8W)&!)WXo#6+Z&rr;usrVuos"0`79!W<!#5L9B/rr3-#s8N&tJcEXfJ,~>
+ec,Zb:]CA!rr;utru_<Xr;QcrrVllsrr3#u?i0m7!<Abls8N&urkEr4^q[Y2JcE[gJ,~>
+ec,Zb:]CA!rr;utru_<Xr;QcrrVllsrr3#u?i0m7!<Abls8N&urkEr4^q[Y2JcE[gJ,~>
+ec,Zb:]CA!rr;utru_<Xr;QcrrVllsrr3#u?i0m7!<Abls8N&urkEr4^q[Y2JcE[gJ,~>
+fDcE]s'?iJs8N&ts8W([!+5d*rVuos#64]&s8N%*q#CDurr3&gILuAV!7$/q`;b>~>
+fDcE]s'?iJs8N&ts8W([!+5d*rVuos#64]&s8N%*q#CDurr3&gILuAV!7$/q`;b>~>
+fDcE]s'?iJs8N&ts8W([!+5d*rVuos#64]&s8N%*q#CDurr3&gILuAV!7$/q`;b>~>
+f`)6Vs6gL!n,NFerVm)k!!(sWs8Mlp!ri57rW!<,!!!$"!"RBTYT<iB!!Akns8ITL`rCP~>
+f`)6Vs6gL!n,NFerVm)k!!(sWs8Mlp!ri57rW!<,!!!$"!"RBTYT<iB!!Akns8ITL`rCP~>
+f`)6Vs6gL!n,NFerVm)k!!(sWs8Mlp!ri57rW!<,!!!$"!"RBTYT<iB!!Akns8ITL`rCP~>
+f)GiU!!0;$rrqols'Phgqu6Zqr;QbHp](?r%U]#3!1ncA_Z,,~>
+f)GiU!!0;$rrqols'Phgqu6Zqr;QbHp](?r%U]#3!1ncA_Z,,~>
+f)GiU!!0;$rrqols'Phgqu6Zqr;QbHp](?r%U]#3!1ncA_Z,,~>
+f)GhZ!!$s8rro("rkJLfqu6lHIm6.>59KLt!!3#u!=tfRs2"_c~>
+f)GhZ!!$s8rro("rkJLfqu6lHIm6.>59KLt!!3#u!=tfRs2"_c~>
+f)GhZ!!$s8rro("rkJLfqu6lHIm6.>59KLt!!3#u!=tfRs2"_c~>
+jo5>[oD]=C!!"_QrilG&i#r(!*rs[errKl!kl:`KhgtgCs*t~>
+jo5>[oD]=C!!"_QrilG&i#r(!*rs[errKl!kl:`KhgtgCs*t~>
+jo5>[oD]=C!!"_QrilG&i#r(!*rs[errKl!kl:`KhgtgCs*t~>
+kl1_`s8Mlp!<2rs!ri5gr;[>bs$,HArueQGO8tFBs*sD9"T]]05CVPgrrE%Ls2=qf~>
+kl1_`s8Mlp!<2rs!ri5gr;[>bs$,HArueQGO8tFBs*sD9"T]]05CVPgrrE%Ls2=qf~>
+kl1_`s8Mlp!<2rs!ri5gr;[>bs$,HArueQGO8tFBs*sD9"T]]05CVPgrrE%Ls2=qf~>
+hu<]UqYpQ0r;[@Xs%m,'s'T77mf5$@?N:,o!!4hRrr2p"rr<#tJcEXfJ,~>
+hu<]UqYpQ0r;[@Xs%m,'s'T77mf5$@?N:,o!!4hRrr2p"rr<#tJcEXfJ,~>
+hu<]UqYpQ0r;[@Xs%m,'s'T77mf5$@?N:,o!!4hRrr2p"rr<#tJcEXfJ,~>
+g&D-Qs1eL4$kM6H!7:b=+TMFK!'ffM"9JQghVj%c]`3K~>
+g&D-Qs1eL4$kM6H!7:b=+TMFK!'ffM"9JQghVj%c]`3K~>
+g&D-Qs1eL4$kM6H!7:b=+TMFK!'ffM"9JQghVj%c]`3K~>
+kl1_`s8Muss6p'hrr2p4rr;u4!!!$"!"V9o5JE`iIr?D/!!2Kf#QXo9hf,4fs8Mus!ri6!JcEai
+J,~>
+kl1_`s8Muss6p'hrr2p4rr;u4!!!$"!"V9o5JE`iIr?D/!!2Kf#QXo9hf,4fs8Mus!ri6!JcEai
+J,~>
+kl1_`s8Muss6p'hrr2p4rr;u4!!!$"!"V9o5JE`iIr?D/!!2Kf#QXo9hf,4fs8Mus!ri6!JcEai
+J,~>
+l2Lb_qYp`G&9-V.rr)ishu3TU!Vucr!W)is!U]pk&((<;?iL')!<.QL_>f#~>
+l2Lb_qYp`G&9-V.rr)ishu3TU!Vucr!W)is!U]pk&((<;?iL')!<.QL_>f#~>
+l2Lb_qYp`G&9-V.rr)ishu3TU!Vucr!W)is!U]pk&((<;?iL')!<.QL_>f#~>
+i;WqP!!#9grr3-#s#pD`rVup!qu?p%!)@J5!!2Ng"T\V\s3M;QrrW3"rdk*hs*t~>
+i;WqP!!#9grr3-#s#pD`rVup!qu?p%!)@J5!!2Ng"T\V\s3M;QrrW3"rdk*hs*t~>
+i;WqP!!#9grr3-#s#pD`rVup!qu?p%!)@J5!!2Ng"T\V\s3M;QrrW3"rdk*hs*t~>
+j8]-u%cIBF@/p9MORW;McOKpUq>^dC0Ac`t%flY2mJmJgs8OdFs8W)srrE%Ls2G"g~>
+j8]-u%cIBF@/p9MORW;McOKpUq>^dC0Ac`t%flY2mJmJgs8OdFs8W)srrE%Ls2G"g~>
+j8]-u%cIBF@/p9MORW;McOKpUq>^dC0Ac`t%flY2mJmJgs8OdFs8W)srrE%Ls2G"g~>
+n,ECepAY\$!!"[En_ep?!"WJrs6jkZrW!*d?S<Ji%fZJ0?N:,s!!!&u!!C"9T-4"1!<.QL`W(G~>
+n,ECepAY\$!!"[En_ep?!"WJrs6jkZrW!*d?S<Ji%fZJ0?N:,s!!!&u!!C"9T-4"1!<.QL`W(G~>
+n,ECepAY\$!!"[En_ep?!"WJrs6jkZrW!*d?S<Ji%fZJ0?N:,s!!!&u!!C"9T-4"1!<.QL`W(G~>
+nGiLequ6iH_>jM\&H)S7@'K[8?k<<(Y5SA0rr;ud0V:)hs8U@F!!3#urrE-#!W2rt!=8`,!!!$b
+rr4X4rVllsJcEXfJ,~>
+nGiLequ6iH_>jM\&H)S7@'K[8?k<<(Y5SA0rr;ud0V:)hs8U@F!!3#urrE-#!W2rt!=8`,!!!$b
+rr4X4rVllsJcEXfJ,~>
+nGiLequ6iH_>jM\&H)S7@'K[8?k<<(Y5SA0rr;ud0V:)hs8U@F!!3#urrE-#!W2rt!=8`,!!!$b
+rr4X4rVllsJcEXfJ,~>
+kPkeV0L3JSn6Z4p!#?Z,i;^#h%j@&(s8W)urp[12^]+95*rQ'=!WE'!!W2p,!<<*#!!!$"!29G?
+&>4US^]/f~>
+kPkeV0L3JSn6Z4p!#?Z,i;^#h%j@&(s8W)urp[12^]+95*rQ'=!WE'!!W2p,!<<*#!!!$"!29G?
+&>4US^]/f~>
+kPkeV0L3JSn6Z4p!#?Z,i;^#h%j@&(s8W)urp[12^]+95*rQ'=!WE'!!W2p,!<<*#!!!$"!29G?
+&>4US^]/f~>
+m/I(brr3E+s6r8R5f!EWJ04gmrW!3hTCDlrE'RghrVm*$YCD$d57d_n!!3'!!!3#u!!3#u!!3#u
+$3;8G5[Y/^rr<#tJcE[gJ,~>
+m/I(brr3E+s6r8R5f!EWJ04gmrW!3hTCDlrE'RghrVm*$YCD$d57d_n!!3'!!!3#u!!3#u!!3#u
+$3;8G5[Y/^rr<#tJcE[gJ,~>
+m/I(brr3E+s6r8R5f!EWJ04gmrW!3hTCDlrE'RghrVm*$YCD$d57d_n!!3'!!!3#u!!3#u!!3#u
+$3;8G5[Y/^rr<#tJcE[gJ,~>
+kPktis8S,k!'e:!rm?3]rW!B.&7N?RrnsHBs8MLo&,ZD-!W;uu!WE'!&,cJ0!<</t!!`N)!+:=a
+s8N#t!<.QL`rCP~>
+kPktis8S,k!'e:!rm?3]rW!B.&7N?RrnsHBs8MLo&,ZD-!W;uu!WE'!&,cJ0!<</t!!`N)!+:=a
+s8N#t!<.QL`rCP~>
+kPktis8S,k!'e:!rm?3]rW!B.&7N?RrnsHBs8MLo&,ZD-!W;uu!WE'!&,cJ0!<</t!!`N)!+:=a
+s8N#t!<.QL`rCP~>
+nG`Rhs8Mcm"n7$R!'nC!rscbo:a#f=+G&JMs8S]$nGiY5!!!&m!!b4IhuN6Gs8ITL`;b>~>
+nG`Rhs8Mcm"n7$R!'nC!rscbo:a#f=+G&JMs8S]$nGiY5!!!&m!!b4IhuN6Gs8ITL`;b>~>
+nG`Rhs8Mcm"n7$R!'nC!rscbo:a#f=+G&JMs8S]$nGiY5!!!&m!!b4IhuN6Gs8ITL`;b>~>
+n,ECerr3/k5S-23d/EtJn:2V]5f!9s#OoQkE'U)b?i'g9!<<WP+$O(m^VJaq^OH4`!<</t!!rZ+
+!'pSa:lt_VJcEXfJ,~>
+n,ECerr3/k5S-23d/EtJn:2V]5f!9s#OoQkE'U)b?i'g9!<<WP+$O(m^VJaq^OH4`!<</t!!rZ+
+!'pSa:lt_VJcEXfJ,~>
+n,ECerr3/k5S-23d/EtJn:2V]5f!9s#OoQkE'U)b?i'g9!<<WP+$O(m^VJaq^OH4`!<</t!!rZ+
+!'pSa:lt_VJcEXfJ,~>
+mJd1crr32lTO8<R@'KV0"JA![5f!0p"7IoD!WE''!<<*qmr!XMrr=/4!!]_.TJ6EGrdk*fs*t~>
+mJd1crr32lTO8<R@'KV0"JA![5f!0p"7IoD!WE''!<<*qmr!XMrr=/4!!]_.TJ6EGrdk*fs*t~>
+mJd1crr32lTO8<R@'KV0"JA![5f!0p"7IoD!WE''!<<*qmr!XMrr=/4!!]_.TJ6EGrdk*fs*t~>
+mJd1cqYq#/E$-9Bd/X+Fi,Bf(_#+-4mk=Y?!!3'!"WtJJ:&mQXs8W'#s8N&5p&G<u!!!T"n,V?s
+s7uZprlb=l~>
+mJd1cqYq#/E$-9Bd/X+Fi,Bf(_#+-4mk=Y?!!3'!"WtJJ:&mQXs8W'#s8N&5p&G<u!!!T"n,V?s
+s7uZprlb=l~>
+mJd1cqYq#/E$-9Bd/X+Fi,Bf(_#+-4mk=Y?!!3'!"WtJJ:&mQXs8W'#s8N&5p&G<u!!!T"n,V?s
+s7uZprlb=l~>
+mf*:dqu6ZqrVm&JO>&DNnc&OjZ!Tf4rr3PT%flY2!<<*ATDsr_!<<,grr3'!s8N#t!'gA]!!2ut
+#6=f);#a@Srdk(Nrr;uqrrE&Bs*t~>
+mf*:dqu6ZqrVm&JO>&DNnc&OjZ!Tf4rr3PT%flY2!<<*ATDsr_!<<,grr3'!s8N#t!'gA]!!2ut
+#6=f);#a@Srdk(Nrr;uqrrE&Bs*t~>
+mf*:dqu6ZqrVm&JO>&DNnc&OjZ!Tf4rr3PT%flY2!<<*ATDsr_!<<,grr3'!s8N#t!'gA]!!2ut
+#6=f);#a@Srdk(Nrr;uqrrE&Bs*t~>
+nG`Lfrr3*"s8W)trrE&rrrh8R:LLC*rt"UlOPe@p!!!$"!&(#FT-!n1!MBAfrrgXY!!!&s!"&`,
+!!*'#Yb3]Mre1=OrqucrrlP1j~>
+nG`Lfrr3*"s8W)trrE&rrrh8R:LLC*rt"UlOPe@p!!!$"!&(#FT-!n1!MBAfrrgXY!!!&s!"&`,
+!!*'#Yb3]Mre1=OrqucrrlP1j~>
+nG`Lfrr3*"s8W)trrE&rrrh8R:LLC*rt"UlOPe@p!!!$"!&(#FT-!n1!MBAfrrgXY!!!&s!"&`,
+!!*'#Yb3]Mre1=OrqucrrlP1j~>
+mf*:dqu6\H&H)SF+$kF]i;^$3T`:ZlcMu5*^VIV!i9u^LrVup!rW!$rs8W)rrr=/:!!!&t!!NB'
+&`<ZZK`;&O_>f#~>
+mf*:dqu6\H&H)SF+$kF]i;^$3T`:ZlcMu5*^VIV!i9u^LrVup!rW!$rs8W)rrr=/:!!!&t!!NB'
+&`<ZZK`;&O_>f#~>
+mf*:dqu6\H&H)SF+$kF]i;^$3T`:ZlcMu5*^VIV!i9u^LrVup!rW!$rs8W)rrr=/:!!!&t!!NB'
+&`<ZZK`;&O_>f#~>
+nG`LfrVm5>+^]_-It1?\5=,5J#p=2k^`WVaY^eq856*A8!!!'!!"T)1!8meUs8N&ur[n1(!!2lq
+!!3#us%i`ire(4Nrknbd~>
+nG`LfrVm5>+^]_-It1?\5=,5J#p=2k^`WVaY^eq856*A8!!!'!!"T)1!8meUs8N&ur[n1(!!2lq
+!!3#us%i`ire(4Nrknbd~>
+nG`LfrVm5>+^]_-It1?\5=,5J#p=2k^`WVaY^eq856*A8!!!'!!"T)1!8meUs8N&ur[n1(!!2lq
+!!3#us%i`ire(4Nrknbd~>
+mf*[os8LsW!!*'B:ls*%s8Tk=?iU0.!!!&u!!!&l!"3`Fs8N&ts8W)us$-J_!!2lq"9AK&0Md9"
+!<2ut!<1(>J,~>
+mf*[os8LsW!!*'B:ls*%s8Tk=?iU0.!!!&u!!!&l!"3`Fs8N&ts8W)us$-J_!!2lq"9AK&0Md9"
+!<2ut!<1(>J,~>
+mf*[os8LsW!!*'B:ls*%s8Tk=?iU0.!!!&u!!!&l!"3`Fs8N&ts8W)us$-J_!!2lq"9AK&0Md9"
+!<2ut!<1(>J,~>
+nc&Ugr;Qs"TFh/(!r`0%&5eP9rr3&'!!3'!!!2lq!!3#u#6=f*!!!$1n,!%lrr9_6!!*'"!<<*#
+q#CE_Jc>`Lrr2utao?k~>
+nc&Ugr;Qs"TFh/(!r`0%&5eP9rr3&'!!3'!!!2lq!!3#u#6=f*!!!$1n,!%lrr9_6!!*'"!<<*#
+q#CE_Jc>`Lrr2utao?k~>
+nc&Ugr;Qs"TFh/(!r`0%&5eP9rr3&'!!3'!!!2lq!!3#u#6=f*!!!$1n,!%lrr9_6!!*'"!<<*#
+q#CE_Jc>`Lrr2utao?k~>
+l2LkTOAI(r!!<d/J._JT!!2Zk!,ql:!<2rs!ri3anGiT_re:@Td#`340`:tQ5]>#os*t~>
+l2LkTOAI(r!!<d/J._JT!!2Zk!,ql:!<2rs!ri3anGiT_re:@Td#`340`:tQ5]>#os*t~>
+l2LkTOAI(r!!<d/J._JT!!2Zk!,ql:!<2rs!ri3anGiT_re:@Td#`340`:tQ5]>#os*t~>
+l2Lhas8N#trP/Nns8Oe7!!(pOrrBh4!!NB'!<<*#qZ$ULP5bR^s8Ke=^VR_%T7LB8q>^b-cN!qG
+!&24arrrE%rr<#th>`!~>
+l2Lhas8N#trP/Nns8Oe7!!(pOrrBh4!!NB'!<<*#qZ$ULP5bR^s8Ke=^VR_%T7LB8q>^b-cN!qG
+!&24arrrE%rr<#th>`!~>
+l2Lhas8N#trP/Nns8Oe7!!(pOrrBh4!!NB'!<<*#qZ$ULP5bR^s8Ke=^VR_%T7LB8q>^b-cN!qG
+!&24arrrE%rr<#th>`!~>
+kl1Y^qZ$T2"4(od!Tj@^5PkB^rr<!_qu?j#!!*'#qZ$V)Q2^p$?m,FK!!3#u!!3#u!!3#u!akt7
+rW!'%!!#jbq>UTss8N&thZ&*~>
+kl1Y^qZ$T2"4(od!Tj@^5PkB^rr<!_qu?j#!!*'#qZ$V)Q2^p$?m,FK!!3#u!!3#u!!3#u!akt7
+rW!'%!!#jbq>UTss8N&thZ&*~>
+kl1Y^qZ$T2"4(od!Tj@^5PkB^rr<!_qu?j#!!*'#qZ$V)Q2^p$?m,FK!!3#u!!3#u!!3#u!akt7
+rW!'%!!#jbq>UTss8N&thZ&*~>
+nG`Lfqu7''s8Tlr@6br3O3l86!!*+\r;Qcrrr2u5qZ$Zu!!2ut!s&B%@$gln@/'^%!W;uu!W2p!
+@/jU3!!E<&!$KYarrW3"rn[U)~>
+nG`Lfqu7''s8Tlr@6br3O3l86!!*+\r;Qcrrr2u5qZ$Zu!!2ut!s&B%@$gln@/'^%!W;uu!W2p!
+@/jU3!!E<&!$KYarrW3"rn[U)~>
+nG`Lfqu7''s8Tlr@6br3O3l86!!*+\r;Qcrrr2u5qZ$Zu!!2ut!s&B%@$gln@/'^%!W;uu!W2p!
+@/jU3!!E<&!$KYarrW3"rn[U)~>
+nGiOfrVm,lTMPV#:ls'&rr=bP!!!&^!!*,HqYpWrs$$;[!!3#u!!3'!!W`:/RK!<81&1eL!W<!)
+!<<-#!H6lq^^pAD!!3#u!>)L2rrE&Rs*t~>
+nGiOfrVm,lTMPV#:ls'&rr=bP!!!&^!!*,HqYpWrs$$;[!!3#u!!3'!!W`:/RK!<81&1eL!W<!)
+!<<-#!H6lq^^pAD!!3#u!>)L2rrE&Rs*t~>
+nGiOfrVm,lTMPV#:ls'&rr=bP!!!&^!!*,HqYpWrs$$;[!!3#u!!3'!!W`:/RK!<81&1eL!W<!)
+!<<-#!H6lq^^pAD!!3#u!>)L2rrE&Rs*t~>
+nc&sqs8W)un:2WXOO3k(!2&6N!s&BDn,<7drr2otch[YA!=8`,!!!$"!!*(-rr2utSGr`]Y[ARS
+p](9prW!(.d/X(uqu?]tqu?bjrqcZprnd[*~>
+nc&sqs8W)un:2WXOO3k(!2&6N!s&BDn,<7drr2otch[YA!=8`,!!!$"!!*(-rr2utSGr`]Y[ARS
+p](9prW!(.d/X(uqu?]tqu?bjrqcZprnd[*~>
+nc&sqs8W)un:2WXOO3k(!2&6N!s&BDn,<7drr2otch[YA!=8`,!!!$"!!*(-rr2utSGr`]Y[ARS
+p](9prW!(.d/X(uqu?]tqu?bjrqcZprnd[*~>
+nGiOfs8N,Xd/O%Orr<#ts7!h=&-:bj!s&BTn+lt`?hXO#!WE'!!WE'!5lUc`rgs,pcsVC?YYP6"
+p](X%!!"')*WQ0@!!2lq!2.mBJ,~>
+nGiOfs8N,Xd/O%Orr<#ts7!h=&-:bj!s&BTn+lt`?hXO#!WE'!!WE'!5lUc`rgs,pcsVC?YYP6"
+p](X%!!"')*WQ0@!!2lq!2.mBJ,~>
+nGiOfs8N,Xd/O%Orr<#ts7!h=&-:bj!s&BTn+lt`?hXO#!WE'!!WE'!5lUc`rgs,pcsVC?YYP6"
+p](X%!!"')*WQ0@!!2lq!2.mBJ,~>
+nc&UgrVllsrr3H,s8KfQ;/bB3!!!$"!TO.]!A<j<rr`8X!!2ut"9AK'!!<*!!=th%rrE%hrs8+4
+1&q=T!<</s!!!&n!!!&q!!8hnrqucrrnd[*~>
+nc&UgrVllsrr3H,s8KfQ;/bB3!!!$"!TO.]!A<j<rr`8X!!2ut"9AK'!!<*!!=th%rrE%hrs8+4
+1&q=T!<</s!!!&n!!!&q!!8hnrqucrrnd[*~>
+nc&UgrVllsrr3H,s8KfQ;/bB3!!!$"!TO.]!A<j<rr`8X!!2ut"9AK'!!<*!!=th%rrE%hrs8+4
+1&q=T!<</s!!!&n!!!&q!!8hnrqucrrnd[*~>
+mJd[qs8N&tZ!\,NYl=[\!!2!X"9AK&0CJ]:!+5<t"!8$"rgWoqrr<#ts3S!"JU`2IqZ$^!!!!&s
+!!!&o!!&\Ds*t~>
+mJd[qs8N&tZ!\,NYl=[\!!2!X"9AK&0CJ]:!+5<t"!8$"rgWoqrr<#ts3S!"JU`2IqZ$^!!!!&s
+!!!&o!!&\Ds*t~>
+mJd[qs8N&tZ!\,NYl=[\!!2!X"9AK&0CJ]:!+5<t"!8$"rgWoqrr<#ts3S!"JU`2IqZ$^!!!!&s
+!!!&o!!&\Ds*t~>
+li.=M?k>#bnGiOfs$,3;">A+$s8N#t!8mGL#lt%PSe09Krr;tbrrE&srr>:_!!!&b!!Anos8LdQ
+J,~>
+li.=M?k>#bnGiOfs$,3;">A+$s8N#t!8mGL#lt%PSe09Krr;tbrrE&srr>:_!!!&b!!Anos8LdQ
+J,~>
+li.=M?k>#bnGiOfs$,3;">A+$s8N#t!8mGL#lt%PSe09Krr;tbrrE&srr>:_!!!&b!!Anos8LdQ
+J,~>
+n,NFe$h8-YDrCZqrnsDV5hH&;&>/k"!+5C!"],0uO!3tWrs8W(rr<#g%fcXp!!*\Yrr2uth>`!~>
+n,NFe$h8-YDrCZqrnsDV5hH&;&>/k"!+5C!"],0uO!3tWrs8W(rr<#g%fcXp!!*\Yrr2uth>`!~>
+n,NFe$h8-YDrCZqrnsDV5hH&;&>/k"!+5C!"],0uO!3tWrs8W(rr<#g%fcXp!!*\Yrr2uth>`!~>
+mJdQe_>aK7Y](^-OjFX<!!!&R!!,jarVllSr;Zfuq>^[@5$sBnJWp*=rr<#tYlFb)kl:esnGiLC
+s*t~>
+mJdQe_>aK7Y](^-OjFX<!!!&R!!,jarVllSr;Zfuq>^[@5$sBnJWp*=rr<#tYlFb)kl:esnGiLC
+s*t~>
+mJdQe_>aK7Y](^-OjFX<!!!&R!!,jarVllSr;Zfuq>^[@5$sBnJWp*=rr<#tYlFb)kl:esnGiLC
+s*t~>
+li.7<?k3fVd/X)BrW!!#!!1gS!W`gmrr3#u?iC$+4tum7#lt#,!!!$As8W(crseu-s8N&ts)7u=
+!!*'#li7#NgAc[~>
+li.7<?k3fVd/X)BrW!!#!!1gS!W`gmrr3#u?iC$+4tum7#lt#,!!!$As8W(crseu-s8N&ts)7u=
+!!*'#li7#NgAc[~>
+li.7<?k3fVd/X)BrW!!#!!1gS!W`gmrr3#u?iC$+4tum7#lt#,!!!$As8W(crseu-s8N&ts)7u=
+!!*'#li7#NgAc[~>
+n,EUks.;OV:pBou!0@$X!!1aQ&-3=aTDnlJ!'f??s1^5f!!2rs!<LQ4rrW3"rr2oun0%]1!!2?b
+!.`i(J,~>
+n,EUks.;OV:pBou!0@$X!!1aQ&-3=aTDnlJ!'f??s1^5f!!2rs!<LQ4rrW3"rr2oun0%]1!!2?b
+!.`i(J,~>
+n,EUks.;OV:pBou!0@$X!!1aQ&-3=aTDnlJ!'f??s1^5f!!2rs!<LQ4rrW3"rr2oun0%]1!!2?b
+!.`i(J,~>
+nc&gms1f^2ORN2K!ri4mq#CBqg&M=bTKj';hOsfH"TG"o!!2rs!0EHF!<2or!5R[r!5[IjJ,~>
+nc&gms1f^2ORN2K!ri4mq#CBqg&M=bTKj';hOsfH"TG"o!!2rs!0EHF!<2or!5R[r!5[IjJ,~>
+nc&gms1f^2ORN2K!ri4mq#CBqg&M=bTKj';hOsfH"TG"o!!2rs!0EHF!<2or!5R[r!5[IjJ,~>
+nc&^\E,ab3rr\no!!1OK#!i4g^L.)7qu7#<!!*'"!<<*#!.^C8!<2fo!It4:!!NB'!!*T"h>`!~>
+nc&^\E,ab3rr\no!!1OK#!i4g^L.)7qu7#<!!*'"!<<*#!.^C8!<2fo!It4:!!NB'!!*T"h>`!~>
+nc&^\E,ab3rr\no!!1OK#!i4g^L.)7qu7#<!!*'"!<<*#!.^C8!<2fo!It4:!!NB'!!*T"h>`!~>
+nc&XJrqcWsi(j=Rd/X.WrVlrG%q#87!)N@i!)SXS!C$VP!!!&u!!**ch>`!~>
+nc&XJrqcWsi(j=Rd/X.WrVlrG%q#87!)N@i!)SXS!C$VP!!!&u!!**ch>`!~>
+nc&XJrqcWsi(j=Rd/X.WrVlrG%q#87!)N@i!)SXS!C$VP!!!&u!!**ch>`!~>
+lMgmX;#UFp!RLiFrri>J%q#A9NrT4[!!30$!WE'!&<-Vjn1Oh,!!30$Ol$+g~>
+lMgmX;#UFp!RLiFrri>J%q#A9NrT4[!!30$!WE'!&<-Vjn1Oh,!!30$Ol$+g~>
+lMgmX;#UFp!RLiFrri>J%q#A9NrT4[!!30$!WE'!&<-Vjn1Oh,!!30$Ol$+g~>
+mJm4c"CV<2!!1II!s&B&rqud!ck'L`!Vl]q!WE'!^lA?qrpVW0!!!&t!!30$d/<nDroO01~>
+mJm4c"CV<2!!1II!s&B&rqud!ck'L`!Vl]q!WE'!^lA?qrpVW0!!!&t!!30$d/<nDroO01~>
+mJm4c"CV<2!!1II!s&B&rqud!ck'L`!Vl]q!WE'!^lA?qrpVW0!!!&t!!30$d/<nDroO01~>
+n,E^ns8S/]!!!$"!RC`Hdf01E"OI\[!!2ip!W`:PO8f4Zrr2tkl2V%i!!!$Ss8W)Xs*t~>
+n,E^ns8S/]!!!$"!RC`Hdf01E"OI\[!!2ip!W`:PO8f4Zrr2tkl2V%i!!!$Ss8W)Xs*t~>
+n,E^ns8S/]!!!$"!RC`Hdf01E"OI\[!!2ip!W`:PO8f4Zrr2tkl2V%i!!!$Ss8W)Xs*t~>
+mf*@fn.>Nu!!1FH!W`;JrVm!!s8Tn6!!E<&!<<0"!!<6%!C)PC!rhWhmJm4frVup!rW!.Arr;ut
+s8M0\J,~>
+mf*@fn.>Nu!!1FH!W`;JrVm!!s8Tn6!!E<&!<<0"!!<6%!C)PC!rhWhmJm4frVup!rW!.Arr;ut
+s8M0\J,~>
+mf*@fn.>Nu!!1FH!W`;JrVm!!s8Tn6!!E<&!<<0"!!<6%!C)PC!rhWhmJm4frVup!rW!.Arr;ut
+s8M0\J,~>
+mJd0;rVup!qu?]tdJs:Hrr30$s8N#t5l:T`!<<0"!!30$5`5U0!!!&p!!'gns*t~>
+mJd0;rVup!qu?]tdJs:Hrr30$s8N#t5l:T`!<<0"!!30$5`5U0!!!&p!!'gns*t~>
+mJd0;rVup!qu?]tdJs:Hrr30$s8N#t5l:T`!<<0"!!30$5`5U0!!!&p!!'gns*t~>
+mJd50!!17C!$M4>!<2ut!5SR6!s&B%!WE'$&[27$N;itYrupe1!!2lq!?gn2rrE&\s*t~>
+mJd50!!17C!$M4>!<2ut!5SR6!s&B%!WE'$&[27$N;itYrupe1!!2lq!?gn2rrE&\s*t~>
+mJd50!!17C!$M4>!<2ut!5SR6!s&B%!WE'$&[27$N;itYrupe1!!2lq!?gn2rrE&\s*t~>
+mf*9krVup!r;Zm"!!:UL!0I3[!ri6!rVlkjq#CP*nGa)=MZ3Z1m/R1g!!3#u!W`:?ir=N~>
+mf*9krVup!r;Zm"!!:UL!0I3[!ri6!rVlkjq#CP*nGa)=MZ3Z1m/R1g!!3#u!W`:?ir=N~>
+mf*9krVup!r;Zm"!!:UL!0I3[!ri6!rVlkjq#CP*nGa)=MZ3Z1m/R1g!!3#u!W`:?ir=N~>
+mf*At!!!&D!!!T'rrQ".!WE')+Q3;"rm:]FrfI-[rr2ou!&*^>!!2or!<Ksqs*t~>
+mf*At!!!&D!!!T'rrQ".!WE')+Q3;"rm:]FrfI-[rr2ou!&*^>!!2or!<Ksqs*t~>
+mf*At!!!&D!!!T'rrQ".!WE')+Q3;"rm:]FrfI-[rr2ou!&*^>!!2or!<Ksqs*t~>
+mf*80aT)B<s8Mfn"9/>I&H2Y0E.n5m!.QZ`!!+53rr2utkl6/~>
+mf*80aT)B<s8Mfn"9/>I&H2Y0E.n5m!.QZ`!!+53rr2utkl6/~>
+mf*80aT)B<s8Mfn"9/>I&H2Y0E.n5m!.QZ`!!+53rr2utkl6/~>
+nG`OgdEDRo!<<-#JH#<C#QFc'YQ+Y7n;%#Irr<!!N^)S)!-%c6!<2BcJ,~>
+nG`OgdEDRo!<<-#JH#<C#QFc'YQ+Y7n;%#Irr<!!N^)S)!-%c6!<2BcJ,~>
+nG`OgdEDRo!<<-#JH#<C#QFc'YQ+Y7n;%#Irr<!!N^)S)!-%c6!<2BcJ,~>
+n,EKN!!!&C!!%TCrrrE%rVur&L]7SXs8Tn8^jkAE!l4j8rr2utli2J~>
+n,EKN!!!&C!!%TCrrrE%rVur&L]7SXs8Tn8^jkAE!l4j8rr2utli2J~>
+n,EKN!!!&C!!%TCrrrE%rVur&L]7SXs8Tn8^jkAE!l4j8rr2utli2J~>
+nc&^js'PoM!!%NBrrrE%s1eZ.KDu%X!<7N/!!rZKnGiLfs8N&tmJh\~>
+nc&^js'PoM!!%NBrrrE%s1eZ.KDu%X!<7N/!!rZKnGiLfs8N&tmJh\~>
+nc&^js'PoM!!%NBrrrE%s1eZ.KDu%X!<7N/!!rZKnGiLfs8N&tmJh\~>
+n,EG3!!14B!eC=MpAY3n^orIl#6+Z&J1pr;kPtS`qu?_Jr;Qits8MHdJ,~>
+n,EG3!!14B!eC=MpAY3n^orIl#6+Z&J1pr;kPtS`qu?_Jr;Qits8MHdJ,~>
+n,EG3!!14B!eC=MpAY3n^orIl#6+Z&J1pr;kPtS`qu?_Jr;Qits8MHdJ,~>
+nG`LXrVup!bQ%YEIt@XnrrE&trrZ)9s1[Fl!79p/J,~>
+nG`LXrVup!bQ%YEIt@XnrrE&trrZ)9s1[Fl!79p/J,~>
+nG`LXrVup!bQ%YEIt@XnrrE&trrZ)9s1[Fl!79p/J,~>
+nG`L'`rH3mrr;ukrrW3"reCFWrr<!@Yl;H%!!!&s!!4kSrosH5~>
+nG`L'`rH3mrr;ukrrW3"reCFWrr<!@Yl;H%!!!&s!!4kSrosH5~>
+nG`L'`rH3mrr;ukrrW3"reCFWrr<!@Yl;H%!!!&s!!4kSrosH5~>
+nG`K>`rH*IpAY-lJcGcM"RlE[s8V!W!0@-Z!<2?bJ,~>
+nG`K>`rH*IpAY-lJcGcM"RlE[s8V!W!0@-Z!<2?bJ,~>
+nG`K>`rH*IpAY-lJcGcM"RlE[s8V!W!0@-Z!<2?bJ,~>
+nG`Jbr;Zfuc2[nH!'l,8oD\iq0E2"0!!*Yhl2Q8~>
+nG`Jbr;Zfuc2[nH!'l,8oD\iq0E2"0!!*Yhl2Q8~>
+nG`Jbr;Zfuc2[nH!'l,8oD\iq0E2"0!!*Yhl2Q8~>
+nG`JBrVup!c2\%L!!"2As8N#t!<.QLr;Qlus);oUs53kY!Drd\s*t~>
+nG`JBrVup!c2\%L!!"2As8N#t!<.QLr;Qlus);oUs53kY!Drd\s*t~>
+nG`JBrVup!c2\%L!!"2As8N#t!<.QLr;Qlus);oUs53kY!Drd\s*t~>
+nGiCd!!1FH"9AK'!!)ip!<.QLr;QdO^]+8i!!'h"s*t~>
+nGiCd!!1FH"9AK'!!)ip!<.QLr;QdO^]+8i!!'h"s*t~>
+nGiCd!!1FH"9AK'!!)ip!<.QLr;QdO^]+8i!!'h"s*t~>
+nc&U:qZ$Tsbl@qK_#OE6s8ITLqu6m"nGrUgs8UpU"!IUCrpB`9~>
+nc&U:qZ$Tsbl@qK_#OE6s8ITLqu6m"nGrUgs8UpU"!IUCrpB`9~>
+nc&U:qZ$Tsbl@qK_#OE6s8ITLqu6m"nGrUgs8UpU"!IUCrpB`9~>
+nc&TnrVup!aoDGCDuTb=rr<#tJcGZJ"g:/js8N&T!!*+Nli2J~>
+nc&TnrVup!aoDGCDuTb=rr<#tJcGZJ"g:/js8N&T!!*+Nli2J~>
+nc&TnrVup!aoDGCDuTb=rr<#tJcGZJ"g:/js8N&T!!*+Nli2J~>
+nc&T>_uKl^TCMo3s8)a"rc+&!s6lT9!!*Ygm/MS~>
+nc&T>_uKl^TCMo3s8)a"rc+&!s6lT9!!*Ygm/MS~>
+nc&T>_uKl^TCMo3s8)a"rc+&!s6lT9!!*Ygm/MS~>
+nc&\f!!!'!!!!&D!"&`,!"Y7ls8W)urdk+LrrX@7O"]5f!<HTps*t~>
+nc&\f!!!'!!!!&D!"&`,!"Y7ls8W)urdk+LrrX@7O"]5f!<HTps*t~>
+nc&\f!!!'!!!!&D!"&`,!"Y7ls8W)urdk+LrrX@7O"]5f!<HTps*t~>
+nc&SCqu?]t`W-#_TRm.ArrMV_qu?]th>dWY!!'h%s*t~>
+nc&SCqu?]t`W-#_TRm.ArrMV_qu?]th>dWY!!'h%s*t~>
+nc&SCqu?]t`W-#_TRm.ArrMV_qu?]th>dWY!!'h%s*t~>
+q#:?nqu=>0!AM=grrE%UrrE&srrq>"&-)\2h#IW[!!!$"!'orOJ,~>
+q#:?nqu=>0!AM=grrE%UrrE&srrq>"&-)\2h#IW[!!!$"!'orOJ,~>
+q#:?nqu=>0!AM=grrE%UrrE&srrq>"&-)\2h#IW[!!!$"!'orOJ,~>
+p\t6mrVllU^]4?8r;Zk+n;RDIrqucs^et%1!!1dR!!3#u!5SU6!<2QhJ,~>
+p\t6mrVllU^]4?8r;Zk+n;RDIrqucs^et%1!!1dR!!3#u!5SU6!<2QhJ,~>
+p\t6mrVllU^]4?8r;Zk+n;RDIrqucs^et%1!!1dR!!3#u!5SU6!<2QhJ,~>
+p&>-ns8TmL!!!&u!!*Y8MuNqZs8UG3qu?g"!!!&U!!rZ+!!*'"5l^l`nc++~>
+p&>-ns8TmL!!!&u!!*Y8MuNqZs8UG3qu?g"!!!&U!!rZ+!!*'"5l^l`nc++~>
+p&>-ns8TmL!!!&u!!*Y8MuNqZs8UG3qu?g"!!!&U!!rZ+!!*'"5l^l`nc++~>
+o`#!ls+%f`rrN&u"`XM@s8W(_rrrE%rr;Iqr;Zm"!!2ut!!1^P!3kqlJ,~>
+o`#!ls+%f`rrN&u"`XM@s8W(_rrrE%rr;Iqr;Zm"!!2ut!!1^P!3kqlJ,~>
+o`#!ls+%f`rrN&u"`XM@s8W(_rrrE%rr;Iqr;Zm"!!2ut!!1^P!3kqlJ,~>
+pAY-lrr2t<^An67rVup!rW!!Rnc"UL"cj2p!<</u!!!&R!!30$!WE'$+TDE?o)F4~>
+pAY-lrr2t<^An67rVup!rW!!Rnc"UL"cj2p!<</u!!!&R!!30$!WE'$+TDE?o)F4~>
+pAY-lrr2t<^An67rVup!rW!!Rnc"UL"cj2p!<</u!!!&R!!30$!WE'$+TDE?o)F4~>
+p\t6mrVlj_]`8$5qZ$XMn<*_On5&u_!s&B%!S7;O!VucrU&P&lrq-5@~>
+p\t6mrVlj_]`8$5qZ$XMn<*_On5&u_!s&B%!S7;O!VucrU&P&lrq-5@~>
+p\t6mrVlj_]`8$5qZ$XMn<*_On5&u_!s&B%!S7;O!VucrU&P&lrq-5@~>
+pAY9ps8W'0^&S38!!3#u!s&BUn<EqSrm2eb!!!&s!!<6%!!1jT!!3'!"9B)'s8MWiJ,~>
+pAY9ps8W'0^&S38!!3#u!s&BUn<EqSrm2eb!!!&s!!<6%!!1jT!!3'!"9B)'s8MWiJ,~>
+pAY9ps8W'0^&S38!!3#u!s&BUn<EqSrm2eb!!!&s!!<6%!!1jT!!3'!"9B)'s8MWiJ,~>
+p\t6mrr2uf]Dqp4q#CFLi0aNIrr<"l&GlG-!RLfH!W;uuJH#QKrq6;A~>
+p\t6mrr2uf]Dqp4q#CFLi0aNIrr<"l&GlG-!RLfH!W;uuJH#QKrq6;A~>
+p\t6mrr2uf]Dqp4q#CFLi0aNIrr<"l&GlG-!RLfH!W;uuJH#QKrq6;A~>
+p\t6mrr2u6^&S-6p](Et!!-KcrVllsq#:?nnG`Lfa8Z/=p&>'lU%eTf!R(NE&Ff8jJ,~>
+p\t6mrr2u6^&S-6p](Et!!-KcrVllsq#:?nnG`Lfa8Z/=p&>'lU%eTf!R(NE&Ff8jJ,~>
+p\t6mrr2u6^&S-6p](Et!!-KcrVllsq#:?nnG`Lfa8Z/=p&>'lU%eTf!R(NE&Ff8jJ,~>
+q#:?nrr3#uOM1\p!WE'!!VcWr!FOgbrrE&trrE&trs8W(s8N&ucp'hp5QF+J5QjA<5X@Wj5QO/8
+nj!3Srr<#trVllsrr2tmp](Bs!!!&H!!<6%!0QjPJ,~>
+q#:?nrr3#uOM1\p!WE'!!VcWr!FOgbrrE&trrE&trs8W(s8N&ucp'hp5QF+J5QjA<5X@Wj5QO/8
+nj!3Srr<#trVllsrr2tmp](Bs!!!&H!!<6%!0QjPJ,~>
+q#:?nrr3#uOM1\p!WE'!!VcWr!FOgbrrE&trrE&trs8W(s8N&ucp'hp5QF+J5QjA<5X@Wj5QO/8
+nj!3Srr<#trVllsrr2tmp](Bs!!!&H!!<6%!0QjPJ,~>
+pAY6ns8R&O!!!&s!!<6%!!3'!!s&C0d/<nFrr;uprri=n6GLA8_#M7M^];4M^]M?e_;E$1^VR_#
+pV6mI^ELtsrs#.s!<<-#!W)is!W;uu!WE'!!S.5S!?hFAs8M`lJ,~>
+pAY6ns8R&O!!!&s!!<6%!!3'!!s&C0d/<nFrr;uprri=n6GLA8_#M7M^];4M^]M?e_;E$1^VR_#
+pV6mI^ELtsrs#.s!<<-#!W)is!W;uu!WE'!!S.5S!?hFAs8M`lJ,~>
+pAY6ns8R&O!!!&s!!<6%!!3'!!s&C0d/<nFrr;uprri=n6GLA8_#M7M^];4M^]M?e_;E$1^VR_#
+pV6mI^ELtsrs#.s!<<-#!W)is!W;uu!WE'!!S.5S!?hFAs8M`lJ,~>
+q#CBnrr2s`^An;-5l1N]!Vl^!!<<-b_>aH6!<2fo!H3MbrrE&prrE&CrrGrhr;Qcrr;QbipAbO$
+!!*'"!<<-#!!1LJ!2/r`J,~>
+q#CBnrr2s`^An;-5l1N]!Vl^!!<<-b_>aH6!<2fo!H3MbrrE&prrE&CrrGrhr;Qcrr;QbipAbO$
+!!*'"!<<-#!!1LJ!2/r`J,~>
+q#CBnrr2s`^An;-5l1N]!Vl^!!<<-b_>aH6!<2fo!H3MbrrE&prrE&CrrGrhr;Qcrr;QbipAbO$
+!!*'"!<<-#!!1LJ!2/r`J,~>
+oD\e&^AnAOs1^8d!!!&s!!!&s!!>L%s8Dor!<2rs!\hFhq>UHorVllsh>[Y_J:N-srq??oIrYMf
+rVm$"s8N&6rVup!oDejlr;Zfuec5jS!!#7`rq6;A~>
+oD\e&^AnAOs1^8d!!!&s!!!&s!!>L%s8Dor!<2rs!\hFhq>UHorVllsh>[Y_J:N-srq??oIrYMf
+rVm$"s8N&6rVup!oDejlr;Zfuec5jS!!#7`rq6;A~>
+oD\e&^AnAOs1^8d!!!&s!!!&s!!>L%s8Dor!<2rs!\hFhq>UHorVllsh>[Y_J:N-srq??oIrYMf
+rVm$"s8N&6rVup!oDejlr;Zfuec5jS!!#7`rq6;A~>
+o`"pL^&S>Prr;tj&H2Y0!V69mE<#q5rrE/hr;Qlts8W)prrE&Vrs*KbEIVp=Yl=Cs%)G1.rr;ut
+rr;utn.>Hs!!3'!!!2or"YYA/^X'[G!!<6%!T3PLJ,~>
+o`"pL^&S>Prr;tj&H2Y0!V69mE<#q5rrE/hr;Qlts8W)prrE&Vrs*KbEIVp=Yl=Cs%)G1.rr;ut
+rr;utn.>Hs!!3'!!!2or"YYA/^X'[G!!<6%!T3PLJ,~>
+o`"pL^&S>Prr;tj&H2Y0!V69mE<#q5rrE/hr;Qlts8W)prrE&Vrs*KbEIVp=Yl=Cs%)G1.rr;ut
+rr;utn.>Hs!!3'!!!2or"YYA/^X'[G!!<6%!T3PLJ,~>
+p\tErs8T;'!Pe[8_#=97n:;/M!!!&r!!!&t!!&,VrrKnWq>UHorr2utrr3'!s8M!W##J^Ss1g=M
+pAY9a!<<)urr3*"s8Ppo!!!&t!!!&r!!\Mas8N&ts4@;O!W;uuE:j0\~>
+p\tErs8T;'!Pe[8_#=97n:;/M!!!&r!!!&t!!&,VrrKnWq>UHorr2utrr3'!s8M!W##J^Ss1g=M
+pAY9a!<<)urr3*"s8Ppo!!!&t!!!&r!!\Mas8N&ts4@;O!W;uuE:j0\~>
+p\tErs8T;'!Pe[8_#=97n:;/M!!!&r!!!&t!!&,VrrKnWq>UHorr2utrr3'!s8M!W##J^Ss1g=M
+pAY9a!<<)urr3*"s8Ppo!!!&t!!!&r!!\Mas8N&ts4@;O!W;uuE:j0\~>
+q#:?nrr2tK^&S/Krr3-#s8V"bq>^Qt!!2or!202g"-?pjrqud&rr<#fOC:CNORV0-#2il3!&/un
+p&>.;_#OH6rVll%nGiZ!TE)b)rrN*Pe,TI[o`'F~>
+q#:?nrr2tK^&S/Krr3-#s8V"bq>^Qt!!2or!202g"-?pjrqud&rr<#fOC:CNORV0-#2il3!&/un
+p&>.;_#OH6rVll%nGiZ!TE)b)rrN*Pe,TI[o`'F~>
+q#:?nrr2tK^&S/Krr3-#s8V"bq>^Qt!!2or!202g"-?pjrqud&rr<#fOC:CNORV0-#2il3!&/un
+p&>.;_#OH6rVll%nGiZ!TE)b)rrN*Pe,TI[o`'F~>
+o`"nVbQ%\u!!2cn!5SC0#LL8kJ5@?g!Vl]r!MK>i!FV#errE&srr=2@!!30$0]N-4rr2otrpg!j
+@?CNgrVm#i%fcS1pAbBu0[Tj8!5JF2!'g;[!!1gS!3l.rJ,~>
+o`"nVbQ%\u!!2cn!5SC0#LL8kJ5@?g!Vl]r!MK>i!FV#errE&srr=2@!!30$0]N-4rr2otrpg!j
+@?CNgrVm#i%fcS1pAbBu0[Tj8!5JF2!'g;[!!1gS!3l.rJ,~>
+o`"nVbQ%\u!!2cn!5SC0#LL8kJ5@?g!Vl]r!MK>i!FV#errE&srr=2@!!30$0]N-4rr2otrpg!j
+@?CNgrVm#i%fcS1pAbBu0[Tj8!5JF2!'g;[!!1gS!3l.rJ,~>
+pAY0ms2tBEO9#=^r;[$&!!!$"!5JO5!<2ip!<2ut"Q>tL!!2rs!<JkkrrFghqYpZss8NW-!!!Se
+rrfNUJUc)CrrE&trr`7^@/g*(!-%i9!!2lq!.b(K!l+fNr;Qfs5Q(Q`!<</Y!!!&t!!$C*rrW3"
+rql_G~>
+pAY0ms2tBEO9#=^r;[$&!!!$"!5JO5!<2ip!<2ut"Q>tL!!2rs!<JkkrrFghqYpZss8NW-!!!Se
+rrfNUJUc)CrrE&trr`7^@/g*(!-%i9!!2lq!.b(K!l+fNr;Qfs5Q(Q`!<</Y!!!&t!!$C*rrW3"
+rql_G~>
+pAY0ms2tBEO9#=^r;[$&!!!$"!5JO5!<2ip!<2ut"Q>tL!!2rs!<JkkrrFghqYpZss8NW-!!!Se
+rrfNUJUc)CrrE&trr`7^@/g*(!-%i9!!2lq!.b(K!l+fNr;Qfs5Q(Q`!<</Y!!!&t!!$C*rrW3"
+rql_G~>
+p\t<os1ceY!s&D;+S>^9_#OE-rrE&srrM%cq#CSlrr<#f!;ld#rr<#ts7)3M5QQu9k5Q+AJUi95
+nGdGMJ:MSMYlF_&s8N#prslgus8W)urnmbW!!*'"!W2p(!>**Hs8N&V!5SL3")e/>!SIGU!<<*2
+rr2otrqcYF~>
+p\t<os1ceY!s&D;+S>^9_#OE-rrE&srrM%cq#CSlrr<#f!;ld#rr<#ts7)3M5QQu9k5Q+AJUi95
+nGdGMJ:MSMYlF_&s8N#prslgus8W)urnmbW!!*'"!W2p(!>**Hs8N&V!5SL3")e/>!SIGU!<<*2
+rr2otrqcYF~>
+p\t<os1ceY!s&D;+S>^9_#OE-rrE&srrM%cq#CSlrr<#f!;ld#rr<#ts7)3M5QQu9k5Q+AJUi95
+nGdGMJ:MSMYlF_&s8N#prslgus8W)urnmbW!!*'"!W2p(!>**Hs8N&V!5SL3")e/>!SIGU!<<*2
+rr2otrqcYF~>
+pAY0mJ]e#o_1;F`!!2rsq>UHoq#:Krs8V%3rW!3)!!!%ms8Tkgq>UHorVllsj8T+!qu@!6i';;?
+s3Nu\qu6ZqrVm$"rrE)urr2spqu?d!!!3#u!AO$@rrW0#^AIp1J,K?I!SdY[!<<-#!3lM&q#>j~>
+pAY0mJ]e#o_1;F`!!2rsq>UHoq#:Krs8V%3rW!3)!!!%ms8Tkgq>UHorVllsj8T+!qu@!6i';;?
+s3Nu\qu6ZqrVm$"rrE)urr2spqu?d!!!3#u!AO$@rrW0#^AIp1J,K?I!SdY[!<<-#!3lM&q#>j~>
+pAY0mJ]e#o_1;F`!!2rsq>UHoq#:Krs8V%3rW!3)!!!%ms8Tkgq>UHorVllsj8T+!qu@!6i';;?
+s3Nu\qu6ZqrVm$"rrE)urr2spqu?d!!!3#u!AO$@rrW0#^AIp1J,K?I!SdY[!<<-#!3lM&q#>j~>
+p&>(I!!1CG#6=h?n.>X#!W2p!!<<]+rrE&qrs/Q's8N#tn1ahA!!3'!"JGdG@K-0(!<2rs!ri6!
+jSo9W!!3#us3LpF&-3k\nGW@erqud!rr<!P^]+65_=[d.@/9g)!5SX6rVlu'!!!'!!!!&W!"/f-
+!!*'"E;on:s8MoqJ,~>
+p&>(I!!1CG#6=h?n.>X#!W2p!!<<]+rrE&qrs/Q's8N#tn1ahA!!3'!"JGdG@K-0(!<2rs!ri6!
+jSo9W!!3#us3LpF&-3k\nGW@erqud!rr<!P^]+65_=[d.@/9g)!5SX6rVlu'!!!'!!!!&W!"/f-
+!!*'"E;on:s8MoqJ,~>
+p&>(I!!1CG#6=h?n.>X#!W2p!!<<]+rrE&qrs/Q's8N#tn1ahA!!3'!"JGdG@K-0(!<2rs!ri6!
+jSo9W!!3#us3LpF&-3k\nGW@erqud!rr<!P^]+65_=[d.@/9g)!5SX6rVlu'!!!'!!!!&W!"/f-
+!!*'"E;on:s8MoqJ,~>
+q>UQrs8VT2!"&2pYQ4_(!<<*#rW!$Bs8W)trrE&srrE&trrE&prrMUCr;[0*!!&ZfT`>&ks8N#t
+!ri6!i;X#NO?Z&r:r*)1!<2ut#QFb^T7N*OrquctraC?Vrr?F*!!!&r!!&\krrE&rrrGC"qu6rJ
+!!*'#!<<*#i;`r\!!!'!!!aYHrr;uts8MusJ,~>
+q>UQrs8VT2!"&2pYQ4_(!<<*#rW!$Bs8W)trrE&srrE&trrE&prrMUCr;[0*!!&ZfT`>&ks8N#t
+!ri6!i;X#NO?Z&r:r*)1!<2ut#QFb^T7N*OrquctraC?Vrr?F*!!!&r!!&\krrE&rrrGC"qu6rJ
+!!*'#!<<*#i;`r\!!!'!!!aYHrr;uts8MusJ,~>
+q>UQrs8VT2!"&2pYQ4_(!<<*#rW!$Bs8W)trrE&srrE&trrE&prrMUCr;[0*!!&ZfT`>&ks8N#t
+!ri6!i;X#NO?Z&r:r*)1!<2ut#QFb^T7N*OrquctraC?Vrr?F*!!!&r!!&\krrE&rrrGC"qu6rJ
+!!*'#!<<*#i;`r\!!!'!!!aYHrr;uts8MusJ,~>
+p\tBqTE"rmblIbC!,qi:!!2rs!2&ub!<2]l"47Y[!W<!$!>*WXrr)j#rr;uts8LmT"9/?#rql^%
+rr9/56%E>c0Ceu?"JAWls53eU#QXo+!!*'#&A\5D!<2rs!`5Ngqu6X,e,TON!8mbT!<2orJ,~>
+p\tBqTE"rmblIbC!,qi:!!2rs!2&ub!<2]l"47Y[!W<!$!>*WXrr)j#rr;uts8LmT"9/?#rql^%
+rr9/56%E>c0Ceu?"JAWls53eU#QXo+!!*'#&A\5D!<2rs!`5Ngqu6X,e,TON!8mbT!<2orJ,~>
+p\tBqTE"rmblIbC!,qi:!!2rs!2&ub!<2]l"47Y[!W<!$!>*WXrr)j#rr;uts8LmT"9/?#rql^%
+rr9/56%E>c0Ceu?"JAWls53eU#QXo+!!*'#&A\5D!<2rs!`5Ngqu6X,e,TON!8mbT!<2orJ,~>
+q>UQrs8Oaq!!sbIs8N%\&-)\2qu?aQrp'L`T_SQfU&+fhrW3&urVlrus8M'Y!<2ut#iL505[^8b
+J3a)5!C;hFrrg[ks8S2Z!!!'!!!30Td.[J?J:IFq!+4CZ!!2ut!s+M`rqZSE~>
+q>UQrs8Oaq!!sbIs8N%\&-)\2qu?aQrp'L`T_SQfU&+fhrW3&urVlrus8M'Y!<2ut#iL505[^8b
+J3a)5!C;hFrrg[ks8S2Z!!!'!!!30Td.[J?J:IFq!+4CZ!!2ut!s+M`rqZSE~>
+q>UQrs8Oaq!!sbIs8N%\&-)\2qu?aQrp'L`T_SQfU&+fhrW3&urVlrus8M'Y!<2ut#iL505[^8b
+J3a)5!C;hFrrg[ks8S2Z!!!'!!!30Td.[J?J:IFq!+4CZ!!2ut!s+M`rqZSE~>
+rVllsr;Qc4aoDE<r;QfeE;T\<!<<,Xl2L`[qu?g"!!&Y;rrV*h!W<!(;"-^]5X7%7i;<NV!:^"B
+rVup!r;ZssnGiOfq#:B!?i'd&T@*]>;>:*@~>
+rVllsr;Qc4aoDE<r;QfeE;T\<!<<,Xl2L`[qu?g"!!&Y;rrV*h!W<!(;"-^]5X7%7i;<NV!:^"B
+rVup!r;ZssnGiOfq#:B!?i'd&T@*]>;>:*@~>
+rVllsr;Qc4aoDE<r;QfeE;T\<!<<,Xl2L`[qu?g"!!&Y;rrV*h!W<!(;"-^]5X7%7i;<NV!:^"B
+rVup!r;ZssnGiOfq#:B!?i'd&T@*]>;>:*@~>
+p\t=[!<</F!!%NFrrA,W!!E=As8W)brrM$hrW!-'!!*'#@/g-)!<1gS!<2lq!7:]F$ip>.;#gRA
+_8*kds8Mrr$UMQ-!!!$"!!*'"JGfEIrr2otrr)itn1X_>"9/>h!WE'#!<</R!!Nr6s8N&tr;V9~>
+p\t=[!<</F!!%NFrrA,W!!E=As8W)brrM$hrW!-'!!*'#@/g-)!<1gS!<2lq!7:]F$ip>.;#gRA
+_8*kds8Mrr$UMQ-!!!$"!!*'"JGfEIrr2otrr)itn1X_>"9/>h!WE'#!<</R!!Nr6s8N&tr;V9~>
+p\t=[!<</F!!%NFrrA,W!!E=As8W)brrM$hrW!-'!!*'#@/g-)!<1gS!<2lq!7:]F$ip>.;#gRA
+_8*kds8Mrr$UMQ-!!!$"!!*'"JGfEIrr2otrr)itn1X_>"9/>h!WE'#!<</R!!Nr6s8N&tr;V9~>
+q>UKpTZ[<C!<Bq8rr;uts8N$`rW)s!!<=8.rri?$s*t.G!!Ha0s8N#PrrE&qrsI\'5X/)=rr;ut
+rqHEoDh.lb!!+7Ync&\6mf3:brrN*qdJs9orVllsrVqB~>
+q>UKpTZ[<C!<Bq8rr;uts8N$`rW)s!!<=8.rri?$s*t.G!!Ha0s8N#PrrE&qrsI\'5X/)=rr;ut
+rqHEoDh.lb!!+7Ync&\6mf3:brrN*qdJs9orVllsrVqB~>
+q>UKpTZ[<C!<Bq8rr;uts8N$`rW)s!!<=8.rri?$s*t.G!!Ha0s8N#PrrE&qrsI\'5X/)=rr;ut
+rqHEoDh.lb!!+7Ync&\6mf3:brrN*qdJs9orVllsrVqB~>
+!WW/srrW2H&,ZD-!RLfJ&c_k0rrE&trrV*Y!WE'&!<D'Xs8MBb!UpWp!!H^/s8W)PrrW3"rqcWp
+rr2otrqucrrr)j+rh2UV&-;h3&:j9Ms8MWi"@/UZs8Mus!1qU=!0I!UJ,~>
+!WW/srrW2H&,ZD-!RLfJ&c_k0rrE&trrV*Y!WE'&!<D'Xs8MBb!UpWp!!H^/s8W)PrrW3"rqcWp
+rr2otrqucrrr)j+rh2UV&-;h3&:j9Ms8MWi"@/UZs8Mus!1qU=!0I!UJ,~>
+!WW/srrW2H&,ZD-!RLfJ&c_k0rrE&trrV*Y!WE'&!<D'Xs8MBb!UpWp!!H^/s8W)PrrW3"rqcWp
+rr2otrqucrrr)j+rh2UV&-;h3&:j9Ms8MWi"@/UZs8Mus!1qU=!0I!UJ,~>
+qYpTc&GuM.!RC`G@/^**rr2p$rr4YP!!3'!!0I3[!<2?b"/,\p!Vud#@K-<,rr;uRrrE&nrrE&h
+rs.Ems3Ye*T^_^U!<2rs!<2ut!WZ'rrVlrus6nA9!)WIjJ,~>
+qYpTc&GuM.!RC`G@/^**rr2p$rr4YP!!3'!!0I3[!<2?b"/,\p!Vud#@K-<,rr;uRrrE&nrrE&h
+rs.Ems3Ye*T^_^U!<2rs!<2ut!WZ'rrVlrus6nA9!)WIjJ,~>
+qYpTc&GuM.!RC`G@/^**rr2p$rr4YP!!3'!!0I3[!<2?b"/,\p!Vud#@K-<,rr;uRrrE&nrrE&h
+rs.Ems3Ye*T^_^U!<2rs!<2ut!WZ'rrVlrus6nA9!)WIjJ,~>
+qYpV(!!14B!5SL3"TJH#s,d0Z!W`9tl2Lh`ruq+:!+>g+!<1gS!ri6!pAY-lrr3'!s8Mlp!>48h
+rrE&srrW3"rqcWprr2p+rp]sgnGiLfs8N&t:X]:F+TMH;s*t~>
+qYpV(!!14B!5SL3"TJH#s,d0Z!W`9tl2Lh`ruq+:!+>g+!<1gS!ri6!pAY-lrr3'!s8Mlp!>48h
+rrE&srrW3"rqcWprr2p+rp]sgnGiLfs8N&t:X]:F+TMH;s*t~>
+qYpV(!!14B!5SL3"TJH#s,d0Z!W`9tl2Lh`ruq+:!+>g+!<1gS!ri6!pAY-lrr3'!s8Mlp!>48h
+rrE&srrW3"rqcWprr2p+rp]sgnGiLfs8N&t:X]:F+TMH;s*t~>
+qu6f7!!*'#bQ%Vcr;QcrrVm6(^]=E8!<<-#s8MHd!<2rs!5J4-"(;-.rnRMTrr;uorrE&rrrE&q
+rs/Q's8G9fs8N#t!<2ip!<2ip"oeP;!!.TGrr\no!!1UM!9!hU!<2utJ,~>
+qu6f7!!*'#bQ%Vcr;QcrrVm6(^]=E8!<<-#s8MHd!<2rs!5J4-"(;-.rnRMTrr;uorrE&rrrE&q
+rs/Q's8G9fs8N#t!<2ip!<2ip"oeP;!!.TGrr\no!!1UM!9!hU!<2utJ,~>
+qu6f7!!*'#bQ%Vcr;QcrrVm6(^]=E8!<<-#s8MHd!<2rs!5J4-"(;-.rnRMTrr;uorrE&rrrE&q
+rs/Q's8G9fs8N#t!<2ip!<2ip"oeP;!!.TGrr\no!!1UM!9!hU!<2utJ,~>
+!WW/trr?HJ!!&\bs8)cu!Pna7l2L`[p&G,%rm:ZFrr)isrqHEqIt7S!rq??lrqZQrTE"s7qYpQ`
+dJs<QrqcYF~>
+!WW/trr?HJ!!&\bs8)cu!Pna7l2L`[p&G,%rm:ZFrr)isrqHEqIt7S!rq??lrqZQrTE"s7qYpQ`
+dJs<QrqcYF~>
+!WW/trr?HJ!!&\bs8)cu!Pna7l2L`[p&G,%rm:ZFrr)isrqHEqIt7S!rq??lrqZQrTE"s7qYpQ`
+dJs<QrqcYF~>
+!WW/urrDQ0!!FG6s8W)prrN-!qu?d!!.X;6"9/?"nGE7d!W)isE5qnXrr2p%rr92fs8W)hrrE&s
+rr@TK!!&YgrrN*`df9Auq>Ys~>
+!WW/urrDQ0!!FG6s8W)prrN-!qu?d!!.X;6"9/?"nGE7d!W)isE5qnXrr2p%rr92fs8W)hrrE&s
+rr@TK!!&YgrrN*`df9Auq>Ys~>
+!WW/urrDQ0!!FG6s8W)prrN-!qu?d!!.X;6"9/?"nGE7d!W)isE5qnXrr2p%rr92fs8W)hrrE&s
+rr@TK!!&YgrrN*`df9Auq>Ys~>
+#6+Z%rr8Vlbl@tL!!!%ms8W)qrrE&trr=eQ!!<6%!'ooN$3'u)rr:=f^gJ;[!!&\hrr`9#s8L=D
+"TJH$huNcV!<2Ed!.b%K![%IArVlotO4+(062pl`!<2utJ,~>
+#6+Z%rr8Vlbl@tL!!!%ms8W)qrrE&trr=eQ!!<6%!'ooN$3'u)rr:=f^gJ;[!!&\hrr`9#s8L=D
+"TJH$huNcV!<2Ed!.b%K![%IArVlotO4+(062pl`!<2utJ,~>
+#6+Z%rr8Vlbl@tL!!!%ms8W)qrrE&trr=eQ!!<6%!'ooN$3'u)rr:=f^gJ;[!!&\hrr`9#s8L=D
+"TJH$huNcV!<2Ed!.b%K![%IArVlotO4+(062pl`!<2utJ,~>
+r;QanblA(O!!*'Rs8W)us8Dfo!WGC]!<<'!rp]pfrqucsT2>Oe$1G[FOFVkc^qemGrrrE%ruf\f
+mf*Xns$-Pa!<Abls8N#t"5X%Y!S.5N&H;\0rr)kI~>
+r;QanblA(O!!*'Rs8W)us8Dfo!WGC]!<<'!rp]pfrqucsT2>Oe$1G[FOFVkc^qemGrrrE%ruf\f
+mf*Xns$-Pa!<Abls8N#t"5X%Y!S.5N&H;\0rr)kI~>
+r;QanblA(O!!*'Rs8W)us8Dfo!WGC]!<<'!rp]pfrqucsT2>Oe$1G[FOFVkc^qemGrrrE%ruf\f
+mf*Xns$-Pa!<Abls8N#t"5X%Y!S.5N&H;\0rr)kI~>
+s8N3#s8N\Q!!9t9rq69l0*1qM!5S('!<2lq!H<V[rr`9#s8L+>"TD8js8MNf"9/?#5lCZ`&+BJs
+!ri3Pec5dQ!!)!Ss*t~>
+s8N3#s8N\Q!!9t9rq69l0*1qM!5S('!<2lq!H<V[rr`9#s8L+>"TD8js8MNf"9/?#5lCZ`&+BJs
+!ri3Pec5dQ!!)!Ss*t~>
+s8N3#s8N\Q!!9t9rq69l0*1qM!5S('!<2lq!H<V[rr`9#s8L+>"TD8js8MNf"9/?#5lCZ`&+BJs
+!ri3Pec5dQ!!)!Ss*t~>
+rVllDc2[hFr;Zh:rVllrqu6Zqrr37#!!!$"!<E1]n,EIgs8N#t#Q?Els8W)urqcX!muLmB:k.HJ
+rrE&trr`9#IrOuY!<2or!rbFcr;ZhIrr3*"s8S/0!!*,8qYu'~>
+rVllDc2[hFr;Zh:rVllrqu6Zqrr37#!!!$"!<E1]n,EIgs8N#t#Q?Els8W)urqcX!muLmB:k.HJ
+rrE&trr`9#IrOuY!<2or!rbFcr;ZhIrr3*"s8S/0!!*,8qYu'~>
+rVllDc2[hFr;Zh:rVllrqu6Zqrr37#!!!$"!<E1]n,EIgs8N#t#Q?Els8W)urqcX!muLmB:k.HJ
+rrE&trr`9#IrOuY!<2or!rbFcr;ZhIrr3*"s8S/0!!*,8qYu'~>
+s8N3#s,[9,!!<6%!&4'F"9/?#T`+ok!WE'!;==Gcrr;usrtPP(rr<#ts8N#trr<#f&O;DmTO8>H
+bl7\Brr30$_*J&#rq-3lrr;usrr>:]!!*Z"r;QlV!!!&P!!E<&JH,WHs*t~>
+s8N3#s,[9,!!<6%!&4'F"9/?#T`+ok!WE'!;==Gcrr;usrtPP(rr<#ts8N#trr<#f&O;DmTO8>H
+bl7\Brr30$_*J&#rq-3lrr;usrr>:]!!*Z"r;QlV!!!&P!!E<&JH,WHs*t~>
+s8N3#s,[9,!!<6%!&4'F"9/?#T`+ok!WE'!;==Gcrr;usrtPP(rr<#ts8N#trr<#f&O;DmTO8>H
+bl7\Brr30$_*J&#rq-3lrr;usrr>:]!!*Z"r;QlV!!!&P!!E<&JH,WHs*t~>
+rr3#uEQ\=_&E**Y!UpZt!!"/+rrKnXqu6Zqr;Qi6+Rf:/!C21\rrE&qrs%rms8N&urqHEorr;us
+rri<d!!!'!!!$F+rr`9#rufek!)WOlJ,~>
+rr3#uEQ\=_&E**Y!UpZt!!"/+rrKnXqu6Zqr;Qi6+Rf:/!C21\rrE&qrs%rms8N&urqHEorr;us
+rri<d!!!'!!!$F+rr`9#rufek!)WOlJ,~>
+rr3#uEQ\=_&E**Y!UpZt!!"/+rrKnXqu6Zqr;Qi6+Rf:/!C21\rrE&qrs%rms8N&urqHEorr;us
+rri<d!!!'!!!$F+rr`9#rufek!)WOlJ,~>
+rVlpa!!1CG!W`;:o)Agks8T>"!!)QSrrJ3io`#.]+CK_<+X#agrrE&qrrF7XrVllsp&>$krr2s`
+rVup!rVurUr;Qe8!S%/M0`(g"~>
+rVlpa!!1CG!W`;:o)Agks8T>"!!)QSrrJ3io`#.]+CK_<+X#agrrE&qrrF7XrVllsp&>$krr2s`
+rVup!rVurUr;Qe8!S%/M0`(g"~>
+rVlpa!!1CG!W`;:o)Agks8T>"!!)QSrrJ3io`#.]+CK_<+X#agrrE&qrrF7XrVllsp&>$krr2s`
+rVup!rVurUr;Qe8!S%/M0`(g"~>
+rr3#u5i;VG!<<*#!!2]l!<Jkms8W)mrrE&srrR->!W;uu_>XB6rq-3jrr)it@$($\"ocl1J:PH2
+rrE&CrrHMhnc&UgrVlk)qu?d@!)NOm!703r!W`9$qYu'~>
+rr3#u5i;VG!<<*#!!2]l!<Jkms8W)mrrE&srrR->!W;uu_>XB6rq-3jrr)it@$($\"ocl1J:PH2
+rrE&CrrHMhnc&UgrVlk)qu?d@!)NOm!703r!W`9$qYu'~>
+rr3#u5i;VG!<<*#!!2]l!<Jkms8W)mrrE&srrR->!W;uu_>XB6rq-3jrr)it@$($\"ocl1J:PH2
+rrE&CrrHMhnc&UgrVlk)qu?d@!)NOm!703r!W`9$qYu'~>
+rVtmX!s&B%!Vucr!W)j#!<<-#!20>k!<2Ng"9/>:5lL`a!H@u:!<2Ng!ramip&>$ko)A^hhZ!TT
+o)AiS@/p9+o)B@%s8JYk!<<+-i;`nns8W)urufqo"9AK'!8m\RJ,~>
+rVtmX!s&B%!Vucr!W)j#!<<-#!20>k!<2Ng"9/>:5lL`a!H@u:!<2Ng!ramip&>$ko)A^hhZ!TT
+o)AiS@/p9+o)B@%s8JYk!<<+-i;`nns8W)urufqo"9AK'!8m\RJ,~>
+rVtmX!s&B%!Vucr!W)j#!<<-#!20>k!<2Ng"9/>:5lL`a!H@u:!<2Ng!ramip&>$ko)A^hhZ!TT
+o)AiS@/p9+o)B@%s8JYk!<<+-i;`nns8W)urufqo"9AK'!8m\RJ,~>
+s8N3#rr<)S!!30$!W)j'!<<+Mrr<#ts8MZj!<2rs#2fL^!<<]#rVllso)Adjn,W7`!<2`m"9/?#
+rr)iurr;uQrrE&krrp1lrr<#tnG`g`0E<f!s8HC+5lCW^?do&U_>F7_~>
+s8N3#rr<)S!!30$!W)j'!<<+Mrr<#ts8MZj!<2rs#2fL^!<<]#rVllso)Adjn,W7`!<2`m"9/?#
+rr)iurr;uQrrE&krrp1lrr<#tnG`g`0E<f!s8HC+5lCW^?do&U_>F7_~>
+s8N3#rr<)S!!30$!W)j'!<<+Mrr<#ts8MZj!<2rs#2fL^!<<]#rVllso)Adjn,W7`!<2`m"9/?#
+rr)iurr;uQrrE&krrp1lrr<#tnG`g`0E<f!s8HC+5lCW^?do&U_>F7_~>
+rVtpY!W`9%qZ$TsrVup!q#CDfrr2utnG`LfrVlmp!WE'!JGfEIrpp'i^bG*S!<2ut!ri6!h>[`Z
+J04gl&7G#&rrW9$s8M`l"9/?#rr)iurr;usrr_0Z!5SR5!3aoQ!<I]Is*t~>
+rVtpY!W`9%qZ$TsrVup!q#CDfrr2utnG`LfrVlmp!WE'!JGfEIrpp'i^bG*S!<2ut!ri6!h>[`Z
+J04gl&7G#&rrW9$s8M`l"9/?#rr)iurr;usrr_0Z!5SR5!3aoQ!<I]Is*t~>
+rVtpY!W`9%qZ$TsrVup!q#CDfrr2utnG`LfrVlmp!WE'!JGfEIrpp'i^bG*S!<2ut!ri6!h>[`Z
+J04gl&7G#&rrW9$s8M`l"9/?#rr)iurr;usrr_0Z!5SR5!3aoQ!<I]Is*t~>
+rr2utrVup!k5YJ_qZ$Tsp](Et!!&_lqu6Zqp&>$kqu6k]!<<0$&F]Vu!<2Wj"TJH$IphsL!<2rs
+!<2ut!<2ut!<2rs!ri6!iVs"A!!!'!!!#jjrrb$ls8W)hrrE&rs8W'$s8INK5lL]`rXdT[!.XnG
+J,~>
+rr2utrVup!k5YJ_qZ$Tsp](Et!!&_lqu6Zqp&>$kqu6k]!<<0$&F]Vu!<2Wj"TJH$IphsL!<2rs
+!<2ut!<2ut!<2rs!ri6!iVs"A!!!'!!!#jjrrb$ls8W)hrrE&rs8W'$s8INK5lL]`rXdT[!.XnG
+J,~>
+rr2utrVup!k5YJ_qZ$Tsp](Et!!&_lqu6Zqp&>$kqu6k]!<<0$&F]Vu!<2Wj"TJH$IphsL!<2rs
+!<2ut!<2ut!<2rs!ri6!iVs"A!!!'!!!#jjrrb$ls8W)hrrE&rs8W'$s8INK5lL]`rXdT[!.XnG
+J,~>
+!<2utrr<$"k5YJ_qZ$Tsq#CNu!!!V'mf*:dr;Qs"s8UsW!WE'"JH#$;!rbugmf*Cgs8W)srrE&R
+rs.I)!!!$#&$bp0"(6ZYrq??nrr;ujrr_^$!3cA$!)D&E!J17Js*t~>
+!<2utrr<$"k5YJ_qZ$Tsq#CNu!!!V'mf*:dr;Qs"s8UsW!WE'"JH#$;!rbugmf*Cgs8W)srrE&R
+rs.I)!!!$#&$bp0"(6ZYrq??nrr;ujrr_^$!3cA$!)D&E!J17Js*t~>
+!<2utrr<$"k5YJ_qZ$Tsq#CNu!!!V'mf*:dr;Qs"s8UsW!WE'"JH#$;!rbugmf*Cgs8W)srrE&R
+rs.I)!!!$#&$bp0"(6ZYrq??nrr;ujrr_^$!3cA$!)D&E!J17Js*t~>
+"98B#s8Duu!TX4^&O.uC!!*\Yq>UHop&>$kq>UF:r;Zs3nGiLep&>3ps8N$@d.I><rq??lrn@AV
+rr9d-OMLD\rrJfinG`LfpAYAZ!>"Vurr8V@!!@`Ns8N#tJ,~>
+"98B#s8Duu!TX4^&O.uC!!*\Yq>UHop&>$kq>UF:r;Zs3nGiLep&>3ps8N$@d.I><rq??lrn@AV
+rr9d-OMLD\rrJfinG`LfpAYAZ!>"Vurr8V@!!@`Ns8N#tJ,~>
+"98B#s8Duu!TX4^&O.uC!!*\Yq>UHop&>$kq>UF:r;Zs3nGiLep&>3ps8N$@d.I><rq??lrn@AV
+rr9d-OMLD\rrJfinG`LfpAYAZ!>"Vurr8V@!!@`Ns8N#tJ,~>
+rVt^S!['`^qZ$^!!&3@/rrE&`rrW3"EVoe:JFEL=n,W.]!ri6!rr2utrr32l@3>ON0S'0&!<1gS
+!ri6!pAY0?+S#I3rq-3p+954:s8Lm*!!#:]s*t~>
+rVt^S!['`^qZ$^!!&3@/rrE&`rrW3"EVoe:JFEL=n,W.]!ri6!rr2utrr32l@3>ON0S'0&!<1gS
+!ri6!pAY0?+S#I3rq-3p+954:s8Lm*!!#:]s*t~>
+rVt^S!['`^qZ$^!!&3@/rrE&`rrW3"EVoe:JFEL=n,W.]!ri6!rr2utrr32l@3>ON0S'0&!<1gS
+!ri6!pAY0?+S#I3rq-3p+954:s8Lm*!!#:]s*t~>
+"onT%rr<)V!!3]s&GuM2;"4MbroF(ZYl"J%&Ff;k#6+Z&YX&6fqu6Zqp&>'l;#:4mOS&PQrqHEm
+rqcZp^]<<\rrE,hjSo=s!!'5%rr=_O!!30$!Sm_V!C6P^J,~>
+"onT%rr<)V!!3]s&GuM2;"4MbroF(ZYl"J%&Ff;k#6+Z&YX&6fqu6Zqp&>'l;#:4mOS&PQrqHEm
+rqcZp^]<<\rrE,hjSo=s!!'5%rr=_O!!30$!Sm_V!C6P^J,~>
+"onT%rr<)V!!3]s&GuM2;"4MbroF(ZYl"J%&Ff;k#6+Z&YX&6fqu6Zqp&>'l;#:4mOS&PQrqHEm
+rqcZp^]<<\rrE,hjSo=s!!'5%rr=_O!!30$!Sm_V!C6P^J,~>
+s8N6$s$-Pbh#II0+T;?@E8UZqrql`t!J(1?rrW1ME;fe:rr)j#d#`g/Yl=S#"TJFo!!3'!!>48h
+rrE&drrE&rrs/$i!&$S;+gCtG!<2Wj"$a$iroO.b56)5_s8RQLrVup!gAh;+s8MusJ,~>
+s8N6$s$-Pbh#II0+T;?@E8UZqrql`t!J(1?rrW1ME;fe:rr)j#d#`g/Yl=S#"TJFo!!3'!!>48h
+rrE&drrE&rrs/$i!&$S;+gCtG!<2Wj"$a$iroO.b56)5_s8RQLrVup!gAh;+s8MusJ,~>
+s8N6$s$-Pbh#II0+T;?@E8UZqrql`t!J(1?rrW1ME;fe:rr)j#d#`g/Yl=S#"TJFo!!3'!!>48h
+rrE&drrE&rrs/$i!&$S;+gCtG!<2Wj"$a$iroO.b56)5_s8RQLrVup!gAh;+s8MusJ,~>
+rVlj_gAhBXE%h9bro*kZrr<!aqu?a/nFZ_arr<!`T`4ff#>kt<Ir6k^chm_Krpd4DJAM6bs8MNf
+!ri6!qYpUo@.=0q!h]P_r;Qcrp\t;6JH"[1#QEWn!)NUo^XrMg!<@ZLr;V9~>
+rVlj_gAhBXE%h9bro*kZrr<!aqu?a/nFZ_arr<!`T`4ff#>kt<Ir6k^chm_Krpd4DJAM6bs8MNf
+!ri6!qYpUo@.=0q!h]P_r;Qcrp\t;6JH"[1#QEWn!)NUo^XrMg!<@ZLr;V9~>
+rVlj_gAhBXE%h9bro*kZrr<!aqu?a/nFZ_arr<!`T`4ff#>kt<Ir6k^chm_Krpd4DJAM6bs8MNf
+!ri6!qYpUo@.=0q!h]P_r;Qcrp\t;6JH"[1#QEWn!)NUo^XrMg!<@ZLr;V9~>
+rr3#'&_[3g!MH[ss8LpU!Ik.L!!33%JG&pGrr;ut&E*Ne"o\K$O>$)$rrIQloD\gio`#3rs8VSm
+J:Olnrr3H,s8R$lYlF^LJ._8Mrq$-jTKhK:#QB5R!O2V(&(^d]JG]@s~>
+rr3#'&_[3g!MH[ss8LpU!Ik.L!!33%JG&pGrr;ut&E*Ne"o\K$O>$)$rrIQloD\gio`#3rs8VSm
+J:Olnrr3H,s8R$lYlF^LJ._8Mrq$-jTKhK:#QB5R!O2V(&(^d]JG]@s~>
+rr3#'&_[3g!MH[ss8LpU!Ik.L!!33%JG&pGrr;ut&E*Ne"o\K$O>$)$rrIQloD\gio`#3rs8VSm
+J:Olnrr3H,s8R$lYlF^LJ._8Mrq$-jTKhK:#QB5R!O2V(&(^d]JG]@s~>
+s8N1?!!!&W!!!&u!!*]$rVm$"s8N&tkl1kds8Kh7!!3'!!>+blrrM$hq>U_MDuTe:rr:=UrVlls
+pAY-lp&>*m_%?PF!t_^:rr)j$JM.!'%oL^Crrh6ks8W)]rs8W(ru_:On,H28!!.ZMr;V9~>
+s8N1?!!!&W!!!&u!!*]$rVm$"s8N&tkl1kds8Kh7!!3'!!>+blrrM$hq>U_MDuTe:rr:=UrVlls
+pAY-lp&>*m_%?PF!t_^:rr)j$JM.!'%oL^Crrh6ks8W)]rs8W(ru_:On,H28!!.ZMr;V9~>
+s8N1?!!!&W!!!&u!!*]$rVm$"s8N&tkl1kds8Kh7!!3'!!>+blrrM$hq>U_MDuTe:rr:=UrVlls
+pAY-lp&>*m_%?PF!t_^:rr)j$JM.!'%oL^Crrh6ks8W)]rs8W(ru_:On,H28!!.ZMr;V9~>
+"94G_!WE'!!S[SS;#L=nroO.[rr2ou&-;\/!e:7Lp&>)t5lUW[#iH5#^Ylkf%Y=WZ!<2fo!<2ut
+!<2`m"9/?#OT#4_!<<+MrqZQorpTjjrr<!/i;Vd:"i13>;#c't!!'8#s*t~>
+"94G_!WE'!!S[SS;#L=nroO.[rr2ou&-;\/!e:7Lp&>)t5lUW[#iH5#^Ylkf%Y=WZ!<2fo!<2ut
+!<2`m"9/?#OT#4_!<<+MrqZQorpTjjrr<!/i;Vd:"i13>;#c't!!'8#s*t~>
+"94G_!WE'!!S[SS;#L=nroO.[rr2ou&-;\/!e:7Lp&>)t5lUW[#iH5#^Ylkf%Y=WZ!<2fo!<2ut
+!<2`m"9/?#OT#4_!<<+MrqZQorpTjjrr<!/i;Vd:"i13>;#c't!!'8#s*t~>
+!9!hV!W`9%hZ*WWqu?i's8W)Xrri?$s%iap!!304n+?VbEIe)hrr<#trr38]E'Ot":r*,1rr3-#
+s8N&tnG`mqs8N&fJ1ps'0S&ZjrrE&trrE&drr`9#5d95I#@IN3^V9aK!SRMS_#F93J,~>
+!9!hV!W`9%hZ*WWqu?i's8W)Xrri?$s%iap!!304n+?VbEIe)hrr<#trr38]E'Ot":r*,1rr3-#
+s8N&tnG`mqs8N&fJ1ps'0S&ZjrrE&trrE&drr`9#5d95I#@IN3^V9aK!SRMS_#F93J,~>
+!9!hV!W`9%hZ*WWqu?i's8W)Xrri?$s%iap!!304n+?VbEIe)hrr<#trr38]E'Ot":r*,1rr3-#
+s8N&tnG`mqs8N&fJ1ps'0S&ZjrrE&trrE&drr`9#5d95I#@IN3^V9aK!SRMS_#F93J,~>
+!0Gh5$3:,-!!!T#rr<#tiVrn?r;Zp#!!.TArrGEiqu6Zqq#:?nrr2utqYpQpn,ECeq>UHorr3*"
+s8W)qrrE&hrrR^iro3q]n.5RamfD,B!W`;jqu;0~>
+!0Gh5$3:,-!!!T#rr<#tiVrn?r;Zp#!!.TArrGEiqu6Zqq#:?nrr2utqYpQpn,ECeq>UHorr3*"
+s8W)qrrE&hrrR^iro3q]n.5RamfD,B!W`;jqu;0~>
+!0Gh5$3:,-!!!T#rr<#tiVrn?r;Zp#!!.TArrGEiqu6Zqq#:?nrr2utqYpQpn,ECeq>UHorr3*"
+s8W)qrrE&hrrR^iro3q]n.5RamfD,B!W`;jqu;0~>
+!'em3!-$lr"9/?#d/!_C&b,c!!<2ip!W_ciXT&@+5lUBT!<2ip!<2ut!<2uts8E+o!!$BZ!!**#
+qYu'~>
+!'em3!-$lr"9/?#d/!_C&b,c!!<2ip!W_ciXT&@+5lUBT!<2ip!<2ut!<2uts8E+o!!$BZ!!**#
+qYu'~>
+!'em3!-$lr"9/?#d/!_C&b,c!!<2ip!W_ciXT&@+5lUBT!<2ip!<2ut!<2uts8E+o!!$BZ!!**#
+qYu'~>
+"$chd!Rq)O_#OH6j8T;^s8NW1!WE'#!<A5ZrrW3"rr2p#cQN8frilD,rr;uU!<<&lrr`9#s8N#t
+"TJH#s8Mrr"TJH$r]o*9!W`9dqYu'~>
+"$chd!Rq)O_#OH6j8T;^s8NW1!WE'#!<A5ZrrW3"rr2p#cQN8frilD,rr;uU!<<&lrr`9#s8N#t
+"TJH#s8Mrr"TJH$r]o*9!W`9dqYu'~>
+"$chd!Rq)O_#OH6j8T;^s8NW1!WE'#!<A5ZrrW3"rr2p#cQN8frilD,rr;uU!<<&lrr`9#s8N#t
+"TJH#s8Mrr"TJH$r]o*9!W`9dqYu'~>
+!+>d+!!1UM"X*=6s8W&YrsA]);#gRs!&&lLp&>,f;?$Qtrri?$rufYYrr`9#s8Moq!<2or"oeP[
+&-)b1!!!&U!!%$8s*t~>
+!+>d+!!1UM"X*=6s8W&YrsA]);#gRs!&&lLp&>,f;?$Qtrri?$rufYYrr`9#s8Moq!<2or"oeP[
+&-)b1!!!&U!!%$8s*t~>
+!+>d+!!1UM"X*=6s8W&YrsA]);#gRs!&&lLp&>,f;?$Qtrri?$rufYYrr`9#s8Moq!<2or"oeP[
+&-)b1!!!&U!!%$8s*t~>
+!hTGndf9CL:Yu*[Nt>]knGi!>5X808rqcWtE.@ofrilD+rr<#t:n[F[!<2lq#EM]#J&)*arqucs
+Nrdu8"9AK&T`4igJ,~>
+!hTGndf9CL:Yu*[Nt>]knGi!>5X808rqcWtE.@ofrilD+rr<#t:n[F[!<2lq#EM]#J&)*arqucs
+Nrdu8"9AK&T`4igJ,~>
+!hTGndf9CL:Yu*[Nt>]knGi!>5X808rqcWtE.@ofrilD+rr<#t:n[F[!<2lq#EM]#J&)*arqucs
+Nrdu8"9AK&T`4igJ,~>
+!V$`J!!A>_s8LmT!T7A`!!@3?s8Mrr"YaA9J:N-RJ-:@PJ3\)ErrE&rrs8^EIrI%P@DMpBrVlj^
+rVup"g].?$qYu'~>
+!V$`J!!A>_s8LmT!T7A`!!@3?s8Mrr"YaA9J:N-RJ-:@PJ3\)ErrE&rrs8^EIrI%P@DMpBrVlj^
+rVup"g].?$qYu'~>
+!V$`J!!A>_s8LmT!T7A`!!@3?s8Mrr"YaA9J:N-RJ-:@PJ3\)ErrE&rrs8^EIrI%P@DMpBrVlj^
+rVup"g].?$qYu'~>
+!WR\r!!'7`rrE&srrM%cqZ$^!5lUc[rrYLd!!02%"T\TGT)\f_rt,20^lVqX!$Dcds8Uu+%m][`
+rrMX$g&M0cs8MoqJ,~>
+!WR\r!!'7`rrE&srrM%cqZ$^!5lUc[rrYLd!!02%"T\TGT)\f_rt,20^lVqX!$Dcds8Uu+%m][`
+rrMX$g&M0cs8MoqJ,~>
+!WR\r!!'7`rrE&srrM%cqZ$^!5lUc[rrYLd!!02%"T\TGT)\f_rt,20^lVqX!$Dcds8Uu+%m][`
+rrMX$g&M0cs8MoqJ,~>
+s8N*Q!Rh#N!<<\Wk5YJ\"TSK$i*lB\"$lndrqucsIfZMK!'g)T)=V&F+$Vt3&:fiR?f1n`mp@d<
+s8N&uci=+'!!30$?hs_P~>
+s8N*Q!Rh#N!<<\Wk5YJ\"TSK$i*lB\"$lndrqucsIfZMK!'g)T)=V&F+$Vt3&:fiR?f1n`mp@d<
+s8N&uci=+'!!30$?hs_P~>
+s8N*Q!Rh#N!<<\Wk5YJ\"TSK$i*lB\"$lndrqucsIfZMK!'g)T)=V&F+$Vt3&:fiR?f1n`mp@d<
+s8N&uci=+'!!30$?hs_P~>
+"98AZ&C:CX&>8.b!rfu#qu?p%!!!$"!.b(K!<2rs!.XtJ!!0/$!'g,U"TFK8i;W`U$,8\9Y@%mE
+s6j=o!!GQ[s8SbI!!*+nq>Ys~>
+"98AZ&C:CX&>8.b!rfu#qu?p%!!!$"!.b(K!<2rs!.XtJ!!0/$!'g,U"TFK8i;W`U$,8\9Y@%mE
+s6j=o!!GQ[s8SbI!!*+nq>Ys~>
+"98AZ&C:CX&>8.b!rfu#qu?p%!!!$"!.b(K!<2rs!.XtJ!!0/$!'g,U"TFK8i;W`U$,8\9Y@%mE
+s6j=o!!GQ[s8SbI!!*+nq>Ys~>
+rr3#G&C^[[!WE'"!J'kC!<2`m"TJH$TJ?'=!9!\Q!.UpI!'g,U"odF&5G.ECrt(e5TYMZLN\Kr%
+i1D*!s8SbN!!NB'!<<,irVllsrr7K~>
+rr3#G&C^[[!WE'"!J'kC!<2`m"TJH$TJ?'=!9!\Q!.UpI!'g,U"odF&5G.ECrt(e5TYMZLN\Kr%
+i1D*!s8SbN!!NB'!<<,irVllsrr7K~>
+rr3#G&C^[[!WE'"!J'kC!<2`m"TJH$TJ?'=!9!\Q!.UpI!'g,U"odF&5G.ECrt(e5TYMZLN\Kr%
+i1D*!s8SbN!!NB'!<<,irVllsrr7K~>
+s8N3#s3M>R!!!&u!<3)V!!30T_#"'4rr;umrs/Q'd;KTs!!2cn!+>d*!<2rs!.UpI!'g/V*<-!;
+i"-t100asds3D4K&DqtE_#FB6mkBj]T-3.o"p"])!!-L,rr2utrVqB~>
+s8N3#s3M>R!!!&u!<3)V!!30T_#"'4rr;umrs/Q'd;KTs!!2cn!+>d*!<2rs!.UpI!'g/V*<-!;
+i"-t100asds3D4K&DqtE_#FB6mkBj]T-3.o"p"])!!-L,rr2utrVqB~>
+s8N3#s3M>R!!!&u!<3)V!!30T_#"'4rr;umrs/Q'd;KTs!!2cn!+>d*!<2rs!.UpI!'g/V*<-!;
+i"-t100asds3D4K&DqtE_#FB6mkBj]T-3.o"p"])!!-L,rr2utrVqB~>
+r;Qc3p](9pr;Zm"!!23^#lt#+!<<*#!(!d^rrE&rrs?DZ+9;HB!<E0$r;Zg!r;[!4i;WcVrqucr
+J#E>I5PG*prr;uts0!U8^q_X3s8UCU&\jqK%<0(sJ$8eN!!2*[!!3'!"2Y$;rql_G~>
+r;Qc3p](9pr;Zm"!!23^#lt#+!<<*#!(!d^rrE&rrs?DZ+9;HB!<E0$r;Zg!r;[!4i;WcVrqucr
+J#E>I5PG*prr;uts0!U8^q_X3s8UCU&\jqK%<0(sJ$8eN!!2*[!!3'!"2Y$;rql_G~>
+r;Qc3p](9pr;Zm"!!23^#lt#+!<<*#!(!d^rrE&rrs?DZ+9;HB!<E0$r;Zg!r;[!4i;WcVrqucr
+J#E>I5PG*prr;uts0!U8^q_X3s8UCU&\jqK%<0(sJ$8eN!!2*[!!3'!"2Y$;rql_G~>
+rr30$s8S2]!VZQo!T="Y!W)j%!=qtg^u57lrr32]^S#O1!!;us!!3#u!W`9%rW!"]s8Mrr"9/?#
+J#E>I5P"gnrr53&rr;I@J,fM?!5ICk^gB8j?qp\%!<<*#irB/^!$M:9s*t~>
+rr30$s8S2]!VZQo!T="Y!W)j%!=qtg^u57lrr32]^S#O1!!;us!!3#u!W`9%rW!"]s8Mrr"9/?#
+J#E>I5P"gnrr53&rr;I@J,fM?!5ICk^gB8j?qp\%!<<*#irB/^!$M:9s*t~>
+rr30$s8S2]!VZQo!T="Y!W)j%!=qtg^u57lrr32]^S#O1!!;us!!3#u!W`9%rW!"]s8Mrr"9/?#
+J#E>I5P"gnrr53&rr;I@J,fM?!5ICk^gB8j?qp\%!<<*#irB/^!$M:9s*t~>
+r;Qp!s$-PbrVup0q#CBqjo>A^oDepn!!3#u!!2fo!!2cn"CV9/s8Mlp!.UpI!'g)T(&n75h[e*6
+rm1Z%s8NVVrZBJds5+@@!!&Ycs*t~>
+r;Qp!s$-PbrVup0q#CBqjo>A^oDepn!!3#u!!2fo!!2cn"CV9/s8Mlp!.UpI!'g)T(&n75h[e*6
+rm1Z%s8NVVrZBJds5+@@!!&Ycs*t~>
+r;Qp!s$-PbrVup0q#CBqjo>A^oDepn!!3#u!!2fo!!2cn"CV9/s8Mlp!.UpI!'g)T(&n75h[e*6
+rm1Z%s8NVVrZBJds5+@@!!&Ycs*t~>
+qu6`s^]FB6!h^)*h>dZZ!!*'#m/R+ep&G'nr;ZsSnGiOfq>UGEVuQf^p&>$krVmN0Im<r4s+!?6
+rrE*!5J[<u5S*_l!!2'Z!'pM_!<2lqJ,~>
+qu6`s^]FB6!h^)*h>dZZ!!*'#m/R+ep&G'nr;ZsSnGiOfq>UGEVuQf^p&>$krVmN0Im<r4s+!?6
+rrE*!5J[<u5S*_l!!2'Z!'pM_!<2lqJ,~>
+qu6`s^]FB6!h^)*h>dZZ!!*'#m/R+ep&G'nr;ZsSnGiOfq>UGEVuQf^p&>$krVmN0Im<r4s+!?6
+rrE*!5J[<u5S*_l!!2'Z!'pM_!<2lqJ,~>
+rr3K-s8N&t+92BB!9!BC!!2'Z!!2Ti!!3'!!!2or!!3#u!!3'!!!3#u!\j-CpAY,BVuQf^oD\gi
+rr3]#&&A5FnINFL0E;&)^]2%YmnWoaiW')^!!*,Irr2usqYu'~>
+rr3K-s8N&t+92BB!9!BC!!2'Z!!2Ti!!3'!!!2or!!3#u!!3'!!!3#u!\j-CpAY,BVuQf^oD\gi
+rr3]#&&A5FnINFL0E;&)^]2%YmnWoaiW')^!!*,Irr2usqYu'~>
+rr3K-s8N&t+92BB!9!BC!!2'Z!!2Ti!!3'!!!2or!!3#u!!3'!!!3#u!\j-CpAY,BVuQf^oD\gi
+rr3]#&&A5FnINFL0E;&)^]2%YmnWoaiW')^!!*,Irr2usqYu'~>
+s8N)ur;R("!!*'2s8N&&+3"9k&5[nm_!qB^_8!4):_5>Mr;QcrqYpPFVuQf^o)A^hrr3R[;#gRp
+J5>*qhbPs+s'L9U^Y]"m!<A5Ss*t~>
+s8N)ur;R("!!*'2s8N&&+3"9k&5[nm_!qB^_8!4):_5>Mr;QcrqYpPFVuQf^o)A^hrr3R[;#gRp
+J5>*qhbPs+s'L9U^Y]"m!<A5Ss*t~>
+s8N)ur;R("!!*'2s8N&&+3"9k&5[nm_!qB^_8!4):_5>Mr;QcrqYpPFVuQf^o)A^hrr3R[;#gRp
+J5>*qhbPs+s'L9U^Y]"m!<A5Ss*t~>
+rVllsrr3+O!<<+-r;Qei0`D%P!VHEo!<</p!!!&s!!NB'!<<*#o`,%)@'K;'s7#X[!.UpI!'foO
+'CPqZs8VQghZ)JnhZ*TthZ'bZ!T*kYJH,WJrrW3"rr)kI~>
+rVllsrr3+O!<<+-r;Qei0`D%P!VHEo!<</p!!!&s!!NB'!<<*#o`,%)@'K;'s7#X[!.UpI!'foO
+'CPqZs8VQghZ)JnhZ*TthZ'bZ!T*kYJH,WJrrW3"rr)kI~>
+rVllsrr3+O!<<+-r;Qei0`D%P!VHEo!<</p!!!&s!!NB'!<<*#o`,%)@'K;'s7#X[!.UpI!'foO
+'CPqZs8VQghZ)JnhZ*TthZ'bZ!T*kYJH,WJrrW3"rr)kI~>
+rr2utrVm!c!!!SgqYpWDEA..g!!2rs!!3'!!!3#u!!2ut!!2rs!s&B%!WE')!<<-$!!".7nGW@e
+rq??lrq$-iJ#E>I5OJIT?]b9es$*1Us8W)srr@!6!!!'!!!!&d!!!'!!!]+rs8N&urqueH~>
+rr2utrVm!c!!!SgqYpWDEA..g!!2rs!!3'!!!3#u!!2ut!!2rs!s&B%!WE')!<<-$!!".7nGW@e
+rq??lrq$-iJ#E>I5OJIT?]b9es$*1Us8W)srr@!6!!!'!!!!&d!!!'!!!]+rs8N&urqueH~>
+rr2utrVm!c!!!SgqYpWDEA..g!!2rs!!3'!!!3#u!!2ut!!2rs!s&B%!WE')!<<-$!!".7nGW@e
+rq??lrq$-iJ#E>I5OJIT?]b9es$*1Us8W)srr@!6!!!'!!!!&d!!!'!!!]+rs8N&urqueH~>
+!WW/rrrWf4!H@i6s8E5\TO0AQ!!3#u!!2ut%06G0!!!$"!<<*#!!!&r!!!&t!!E<&!'mdcrrE&m
+rrE&grr@PI!!#7NrrK;grr3+PJ,fQJrr33%s54@f!!2ip!!3#u!!2Zk!!3#u"9G.ps8MlpJ,~>
+!WW/rrrWf4!H@i6s8E5\TO0AQ!!3#u!!2ut%06G0!!!$"!<<*#!!!&r!!!&t!!E<&!'mdcrrE&m
+rrE&grr@PI!!#7NrrK;grr3+PJ,fQJrr33%s54@f!!2ip!!3#u!!2Zk!!3#u"9G.ps8MlpJ,~>
+!WW/rrrWf4!H@i6s8E5\TO0AQ!!3#u!!2ut%06G0!!!$"!<<*#!!!&r!!!&t!!E<&!'mdcrrE&m
+rrE&grr@PI!!#7NrrK;grr3+PJ,fQJrr33%s54@f!!2ip!!3#u!!2Zk!!3#u"9G.ps8MlpJ,~>
+s8NE(s8N&uYQ+\(dI[ABrr9`qE'Q\b!"'i7@">K.rr;Jm?iC$*!V??r+2IpUs8W)srrE&]rr@PI
+!!#7Nrt=2hs8VRbNrT.J?9`qCY9-"p0DPSJ!W2ot!W;uu!VHEm!W;uuT_SP;~>
+s8NE(s8N&uYQ+\(dI[ABrr9`qE'Q\b!"'i7@">K.rr;Jm?iC$*!V??r+2IpUs8W)srrE&]rr@PI
+!!#7Nrt=2hs8VRbNrT.J?9`qCY9-"p0DPSJ!W2ot!W;uu!VHEm!W;uuT_SP;~>
+s8NE(s8N&uYQ+\(dI[ABrr9`qE'Q\b!"'i7@">K.rr;Jm?iC$*!V??r+2IpUs8W)srrE&]rr@PI
+!!#7Nrt=2hs8VRbNrT.J?9`qCY9-"p0DPSJ!W2ot!W;uu!VHEm!W;uuT_SP;~>
+qYpO\rW)co!<2`m!ri6!rr2utrr2utrVllsr;QfD0_k\K!W<!!+JAT2!<2Ed!<2`m!.UpI!'foO
+&H;\0s1^6Pn,ND`5d5c(5bS)U"5ptF62WtRE.EIiO2-g,+RT45JH,WKs8N#tJ,~>
+qYpO\rW)co!<2`m!ri6!rr2utrr2utrVllsr;QfD0_k\K!W<!!+JAT2!<2Ed!<2`m!.UpI!'foO
+&H;\0s1^6Pn,ND`5d5c(5bS)U"5ptF62WtRE.EIiO2-g,+RT45JH,WKs8N#tJ,~>
+qYpO\rW)co!<2`m!ri6!rr2utrr2utrVllsr;QfD0_k\K!W<!!+JAT2!<2Ed!<2`m!.UpI!'foO
+&H;\0s1^6Pn,ND`5d5c(5bS)U"5ptF62WtRE.EIiO2-g,+RT45JH,WKs8N#tJ,~>
+#64]&rr<#6rW!$$rr;ums8W)srrE&srrE&prrE&srsA])s8N&t?N:',qu@3-!&(#Fs8N#trr2rs
+s8MTh!<2Wj!.UpI!'flN"Ps/E&!-_i"(*bOrq69mrr;ups8W)urrMUCp](9pqZ$g$!!$F,rr2lr
+J,~>
+#64]&rr<#6rW!$$rr;ums8W)srrE&srrE&prrE&srsA])s8N&t?N:',qu@3-!&(#Fs8N#trr2rs
+s8MTh!<2Wj!.UpI!'flN"Ps/E&!-_i"(*bOrq69mrr;ups8W)urrMUCp](9pqZ$g$!!$F,rr2lr
+J,~>
+#64]&rr<#6rW!$$rr;ums8W)srrE&srrE&prrE&srsA])s8N&t?N:',qu@3-!&(#Fs8N#trr2rs
+s8MTh!<2Wj!.UpI!'flN"Ps/E&!-_i"(*bOrq69mrr;ups8W)urrMUCp](9pqZ$g$!!$F,rr2lr
+J,~>
+qu6X]r;c]o!<2ut!<2ips8Moq!<2Zk%0$;,Yoj#H!<<*3@)2[>!<2lq!<2Ng!<2]l!.UpI!'flN%
+poisn,E@U:GD;;s8N&trr)isrr)j!rVuosrr2utr;Qbio)JakrW!!#!+5X'J,~>
+qu6X]r;c]o!<2ut!<2ips8Moq!<2Zk%0$;,Yoj#H!<<*3@)2[>!<2lq!<2Ng!<2]l!.UpI!'flN%
+poisn,E@U:GD;;s8N&trr)isrr)j!rVuosrr2utr;Qbio)JakrW!!#!+5X'J,~>
+qu6X]r;c]o!<2ut!<2ips8Moq!<2Zk%0$;,Yoj#H!<<*3@)2[>!<2lq!<2Ng!<2]l!.UpI!'flN%
+poisn,E@U:GD;;s8N&trr)isrr)j!rVuosrr2utr;Qbio)JakrW!!#!+5X'J,~>
+r;Qc3qu?`3o)A^hq#:?nq#:?nqu6m"s3SQ3^sMoW!<2or!<2Ng!<2Wj!.UpI!'foO$st[Vs8VP[%
+oDcqs8MHd#QFc'rr<#t_!V1)!<=hCrVqB~>
+r;Qc3qu?`3o)A^hq#:?nq#:?nqu6m"s3SQ3^sMoW!<2or!<2Ng!<2Wj!.UpI!'foO$st[Vs8VP[%
+oDcqs8MHd#QFc'rr<#t_!V1)!<=hCrVqB~>
+r;Qc3qu?`3o)A^hq#:?nq#:?nqu6m"s3SQ3^sMoW!<2or!<2Ng!<2Wj!.UpI!'foO$st[Vs8VP[%
+oDcqs8MHd#QFc'rr<#t_!V1)!<=hCrVqB~>
+s8N6$s8QF,r;Zh:o`"pjgA_0PlMgk`nc&T=VuQf^mf*N"+&5Tr!("E`rrrE%s8N&6lMpr=nG`H<~>
+s8N6$s8QF,r;Zh:o`"pjgA_0PlMgk`nc&T=VuQf^mf*N"+&5Tr!("E`rrrE%s8N&6lMpr=nG`H<~>
+s8N6$s8QF,r;Zh:o`"pjgA_0PlMgk`nc&T=VuQf^mf*N"+&5Tr!("E`rrrE%s8N&6lMpr=nG`H<~>
+rr3'!rt551!s&B&d-pu>i1OF2E<#t;kl1bas8N#nrrE&lrrW3"rpp'hJ#E>I5OJISd%HH7nc%_O
+!<2or#JgB@!!*'"!VcWs!<<*#rW!$SnGiN=~>
+rr3'!rt551!s&B&d-pu>i1OF2E<#t;kl1bas8N#nrrE&lrrW3"rpp'hJ#E>I5OJISd%HH7nc%_O
+!<2or#JgB@!!*'"!VcWs!<<*#rW!$SnGiN=~>
+rr3'!rt551!s&B&d-pu>i1OF2E<#t;kl1bas8N#nrrE&lrrW3"rpp'hJ#E>I5OJISd%HH7nc%_O
+!<2or#JgB@!!*'"!VcWs!<<*#rW!$SnGiN=~>
+rVllEq>^R._#F?5!ri6!r;Qp!d#_'IrVupPj8T5\s8W)qrr`9#rr2Zl!ri6!oD\f?VuQf^li-ta
+j8],Xs8N,7!V$-l!<<*#rW!!RnGe"~>
+rVllEq>^R._#F?5!ri6!r;Qp!d#_'IrVupPj8T5\s8W)qrr`9#rr2Zl!ri6!oD\f?VuQf^li-ta
+j8],Xs8N,7!V$-l!<<*#rW!!RnGe"~>
+rVllEq>^R._#F?5!ri6!r;Qp!d#_'IrVupPj8T5\s8W)qrr`9#rr2Zl!ri6!oD\f?VuQf^li-ta
+j8],Xs8N,7!V$-l!<<*#rW!!RnGe"~>
+rVll5q>^X!!(!7'rVm#I^lNG"rVup!rVus1hrF_:rr)isrr2p!rr;uYrr@PI!!#7.rs&K&s8N&u
+JGT<H!VcWtnc$=c:]17o5lZ?~>
+rVll5q>^X!!(!7'rVm#I^lNG"rVup!rVus1hrF_:rr)isrr2p!rr;uYrr@PI!!#7.rs&K&s8N&u
+JGT<H!VcWtnc$=c:]17o5lZ?~>
+rVll5q>^X!!(!7'rVm#I^lNG"rVup!rVus1hrF_:rr)isrr2p!rr;uYrr@PI!!#7.rs&K&s8N&u
+JGT<H!VcWtnc$=c:]17o5lZ?~>
+"TSK$s+0nE!!3#u!!2or$3:,,!<BA(rr<#tk5PM^s8Moq!<2Ti!ri6!o`"o@VuQf^li-tair9#X
+rr3(N!!!&l!".*Qrr<#fTeHHH^jl~>
+"TSK$s+0nE!!3#u!!2or$3:,,!<BA(rr<#tk5PM^s8Moq!<2Ti!ri6!o`"o@VuQf^li-tair9#X
+rr3(N!!!&l!".*Qrr<#fTeHHH^jl~>
+"TSK$s+0nE!!3#u!!2or$3:,,!<BA(rr<#tk5PM^s8Moq!<2Ti!ri6!o`"o@VuQf^li-tair9#X
+rr3(N!!!&l!".*Qrr<#fTeHHH^jl~>
+rVll4qu?]tq#Cj*!!!$"!!*'#!!*'"OT#1Zro*kWrr)isrpp'hrq$-iJ#E>I5O/7Kro*k[rr7KK
+!V69kU&+cji1TRi~>
+rVll4qu?]tq#Cj*!!!$"!!*'#!!*'"OT#1Zro*kWrr)isrpp'hrq$-iJ#E>I5O/7Kro*k[rr7KK
+!V69kU&+cji1TRi~>
+rVll4qu?]tq#Cj*!!!$"!!*'#!!*'"OT#1Zro*kWrr)isrpp'hrq$-iJ#E>I5O/7Kro*k[rr7KK
+!V69kU&+cji1TRi~>
+rr3#u_YsN8!VcWs!<<-$r;Zfur;Zh*rVm!!s8W)\rrW3"rr)j#i37`.57mVj#!bClOO4"+pAY,B
+VuQf^m/I4fs8N&tjSoG`s8Tk7!!2]l!.jnEJ,~>
+rr3#u_YsN8!VcWs!<<-$r;Zfur;Zh*rVm!!s8W)\rrW3"rr)j#i37`.57mVj#!bClOO4"+pAY,B
+VuQf^m/I4fs8N&tjSoG`s8Tk7!!2]l!.jnEJ,~>
+rr3#u_YsN8!VcWs!<<-$r;Zfur;Zh*rVm!!s8W)\rrW3"rr)j#i37`.57mVj#!bClOO4"+pAY,B
+VuQf^m/I4fs8N&tjSoG`s8Tk7!!2]l!.jnEJ,~>
+rVlot&bH&'!Vucu!<<+-g&D?9E$,-FJ"OL6q>U]7^j]*%&5]V*rr@PI!!#7Orrpcb_8*kUiVs&[
+s1iS=oDelAp]#a~>
+rVlot&bH&'!Vucu!<<+-g&D?9E$,-FJ"OL6q>U]7^j]*%&5]V*rr@PI!!#7Orrpcb_8*kUiVs&[
+s1iS=oDelAp]#a~>
+rVlot&bH&'!Vucu!<<+-g&D?9E$,-FJ"OL6q>U]7^j]*%&5]V*rr@PI!!#7Orrpcb_8*kUiVs&[
+s1iS=oDelAp]#a~>
+"onT%s8HF%!!!&m!!30$0]E$3rql]un8JA7YknA"rq??pi/Sm4d/EtErr2p$J,fQM!!2or!!0J-
+!'gG^!<2ut!<2ut#JcF/5S3tr0E"*B%KHJ_5_-)ss8W)^rsA])s1j_'5QCcbr;ZjAd/3hCrr2qJ~>
+"onT%s8HF%!!!&m!!30$0]E$3rql]un8JA7YknA"rq??pi/Sm4d/EtErr2p$J,fQM!!2or!!0J-
+!'gG^!<2ut!<2ut#JcF/5S3tr0E"*B%KHJ_5_-)ss8W)^rsA])s1j_'5QCcbr;ZjAd/3hCrr2qJ~>
+"onT%s8HF%!!!&m!!30$0]E$3rql]un8JA7YknA"rq??pi/Sm4d/EtErr2p$J,fQM!!2or!!0J-
+!'gG^!<2ut!<2ut#JcF/5S3tr0E"*B%KHJ_5_-)ss8W)^rsA])s1j_'5QCcbr;ZjAd/3hCrr2qJ~>
+rVlot_#"*6!<<*#r;ciur;Zp#!+Gl\rrkY`huE`Um/I6N&((@Vrquctrr;uprrW3"rmq)Nrr;u[
+rrW3"rr2otrr)j(rr<#5?k=DeOMB]IrsHNFIm3oeORW;Mrr2otrp]pkrr;uts8N#t#k5UF^VK@=
+s8Mus!<2rsJ,~>
+rVlot_#"*6!<<*#r;ciur;Zp#!+Gl\rrkY`huE`Um/I6N&((@Vrquctrr;uprrW3"rmq)Nrr;u[
+rrW3"rr2otrr)j(rr<#5?k=DeOMB]IrsHNFIm3oeORW;Mrr2otrp]pkrr;uts8N#t#k5UF^VK@=
+s8Mus!<2rsJ,~>
+rVlot_#"*6!<<*#r;ciur;Zp#!+Gl\rrkY`huE`Um/I6N&((@Vrquctrr;uprrW3"rmq)Nrr;u[
+rrW3"rr2otrr)j(rr<#5?k=DeOMB]IrsHNFIm3oeORW;Mrr2otrp]pkrr;uts8N#t#k5UF^VK@=
+s8Mus!<2rsJ,~>
+s8N)urr36h!!*'#!!!$#p](Bs!!$B^rsSi+s6tO]rr;uts8Moq!ri6!rVllsrr2utrr3"K;=skk
+n1F_A!UTjk5k+dQs8N#`rrLIXl2UgWrVmE-s8N&urr<#f:_%C#rr;usrrE&mrs/Q's/nQtYl=Y%
+!<2Bc!<2lq!<2cn!<2ipJ,~>
+s8N)urr36h!!*'#!!!$#p](Bs!!$B^rsSi+s6tO]rr;uts8Moq!ri6!rVllsrr2utrr3"K;=skk
+n1F_A!UTjk5k+dQs8N#`rrLIXl2UgWrVmE-s8N&urr<#f:_%C#rr;usrrE&mrs/Q's/nQtYl=Y%
+!<2Bc!<2lq!<2cn!<2ipJ,~>
+s8N)urr36h!!*'#!!!$#p](Bs!!$B^rsSi+s6tO]rr;uts8Moq!ri6!rVllsrr2utrr3"K;=skk
+n1F_A!UTjk5k+dQs8N#`rrLIXl2UgWrVmE-s8N&urr<#f:_%C#rr;usrrE&mrs/Q's/nQtYl=Y%
+!<2Bc!<2lq!<2cn!<2ipJ,~>
+r;Qiti">nf!!2ut!W`9%r;Zs$OT5=ZiVs2_s8W)7+92qurr3'!s8Moq!<2lq!ri6!rVm$s!'oKB
+rr2p!rr;usrrc[0!!!&e!!E=Arr;ucrrrE%s8ML2mJm4fqu?i's8W)trrE&srrPGmnG`FfrV-?l
+rr<!*rr<#ts8ThEYlF_%rrE&crrE&qrrW3"rr)isrr2otrr)kI~>
+r;Qiti">nf!!2ut!W`9%r;Zs$OT5=ZiVs2_s8W)7+92qurr3'!s8Moq!<2lq!ri6!rVm$s!'oKB
+rr2p!rr;usrrc[0!!!&e!!E=Arr;ucrrrE%s8ML2mJm4fqu?i's8W)trrE&srrPGmnG`FfrV-?l
+rr<!*rr<#ts8ThEYlF_%rrE&crrE&qrrW3"rr)isrr2otrr)kI~>
+r;Qiti">nf!!2ut!W`9%r;Zs$OT5=ZiVs2_s8W)7+92qurr3'!s8Moq!<2lq!ri6!rVm$s!'oKB
+rr2p!rr;usrrc[0!!!&e!!E=Arr;ucrrrE%s8ML2mJm4fqu?i's8W)trrE&srrPGmnG`FfrV-?l
+rr<!*rr<#ts8ThEYlF_%rrE&crrE&qrrW3"rr)isrr2otrr)kI~>
+qYpQ"rW!!#!!2ut!!3'!!WaFjrVllshu<\Lr;[$4O8o4Zs8N#t!<2ip!<2or$i[mo!!!$1d/X+F
+rqucrnGE7d!UTje!UTgdrr)isU$2O[!<?!srql^#rpa>;s8W)tr;R!#s8W)us8Mrr$i^2+rr<"j
+5Oe^Qrp9XbrVc`rrq??lrql_G~>
+qYpQ"rW!!#!!2ut!!3'!!WaFjrVllshu<\Lr;[$4O8o4Zs8N#t!<2ip!<2or$i[mo!!!$1d/X+F
+rqucrnGE7d!UTje!UTgdrr)isU$2O[!<?!srql^#rpa>;s8W)tr;R!#s8W)us8Mrr$i^2+rr<"j
+5Oe^Qrp9XbrVc`rrq??lrql_G~>
+qYpQ"rW!!#!!2ut!!3'!!WaFjrVllshu<\Lr;[$4O8o4Zs8N#t!<2ip!<2or$i[mo!!!$1d/X+F
+rqucrnGE7d!UTje!UTgdrr)isU$2O[!<?!srql^#rpa>;s8W)tr;R!#s8W)us8Mrr$i^2+rr<"j
+5Oe^Qrp9XbrVc`rrq??lrql_G~>
+!WW/rrrfP:!!!&p!!*X\rr2utjo>A[qu6YHr;[$&!!!O9YODDh!<2`m$GM!D!!!$"!!*)7r;R!#
+s8Tk7!!2Bc!<E2crr`9#s+'G9!!3'!!<GIarrE&trrfS<!<B>&rrE&rs8W'!s8M`l#la9g!$K,W
+s8MBb!<2or!<2ut!<2ZkJ,~>
+!WW/rrrfP:!!!&p!!*X\rr2utjo>A[qu6YHr;[$&!!!O9YODDh!<2`m$GM!D!!!$"!!*)7r;R!#
+s8Tk7!!2Bc!<E2crr`9#s+'G9!!3'!!<GIarrE&trrfS<!<B>&rrE&rs8W'!s8M`l#la9g!$K,W
+s8MBb!<2or!<2ut!<2ZkJ,~>
+!WW/rrrfP:!!!&p!!*X\rr2utjo>A[qu6YHr;[$&!!!O9YODDh!<2`m$GM!D!!!$"!!*)7r;R!#
+s8Tk7!!2Bc!<E2crr`9#s+'G9!!3'!!<GIarrE&trrfS<!<B>&rrE&rs8W'!s8M`l#la9g!$K,W
+s8MBb!<2or!<2ut!<2ZkJ,~>
+!ri6!qu6]U@/'^.%tO0Lrr;uts8M-["oeQ$s8Sbb!"g;;Dh!e_^V7ItT7;>d0)ttQr;ZfurVus2
+ch[S@&H2Y0!UTjf!?_:?!<2Ng!<2rs!RUr7!!!'!!"WK:s8N&urr7KK!<<-#?f(e^!ri6!r;Qcr
+q>UQrs.CJ4!!/blm/I(bq>UHorVlrus8MlpJ,~>
+!ri6!qu6]U@/'^.%tO0Lrr;uts8M-["oeQ$s8Sbb!"g;;Dh!e_^V7ItT7;>d0)ttQr;ZfurVus2
+ch[S@&H2Y0!UTjf!?_:?!<2Ng!<2rs!RUr7!!!'!!"WK:s8N&urr7KK!<<-#?f(e^!ri6!r;Qcr
+q>UQrs.CJ4!!/blm/I(bq>UHorVlrus8MlpJ,~>
+!ri6!qu6]U@/'^.%tO0Lrr;uts8M-["oeQ$s8Sbb!"g;;Dh!e_^V7ItT7;>d0)ttQr;ZfurVus2
+ch[S@&H2Y0!UTjf!?_:?!<2Ng!<2rs!RUr7!!!'!!"WK:s8N&urr7KK!<<-#?f(e^!ri6!r;Qcr
+q>UQrs.CJ4!!/blm/I(bq>UHorVlrus8MlpJ,~>
+rr2utqYpr]J3Ydh0L0T]s8W)QrrrD[&-)\2nGiOiqu?m$!!!$"!Vl]q1&CnNrf?=E!s&D+roa:]
+;!@r^&E*TfrVlk*q#C[RO2(_prr<#tqYp`us51"e+8Ps;T^)RWrqcWrrr;uls*t~>
+rr2utqYpr]J3Ydh0L0T]s8W)QrrrD[&-)\2nGiOiqu?m$!!!$"!Vl]q1&CnNrf?=E!s&D+roa:]
+;!@r^&E*TfrVlk*q#C[RO2(_prr<#tqYp`us51"e+8Ps;T^)RWrqcWrrr;uls*t~>
+rr2utqYpr]J3Ydh0L0T]s8W)QrrrD[&-)\2nGiOiqu?m$!!!$"!Vl]q1&CnNrf?=E!s&D+roa:]
+;!@r^&E*TfrVlk*q#C[RO2(_prr<#tqYp`us51"e+8Ps;T^)RWrqcWrrr;uls*t~>
+ao;A?r;Qb)fDkuGrr2fp!0QOH!hfSmrr2utli."T:[7u]&CLLW"9/?#T_JKe!WE'#00aCNIfrP3%
+fcY0!!!&s!!U1<s8N&tgAc[~>
+ao;A?r;Qb)fDkuGrr2fp!0QOH!hfSmrr2utli."T:[7u]&CLLW"9/?#T_JKe!WE'#00aCNIfrP3%
+fcY0!!!&s!!U1<s8N&tgAc[~>
+ao;A?r;Qb)fDkuGrr2fp!0QOH!hfSmrr2utli."T:[7u]&CLLW"9/?#T_JKe!WE'#00aCNIfrP3%
+fcY0!!!&s!!U1<s8N&tgAc[~>
+aSu8>rVlm0!SIGQ;#C7urr<#65QLib!W2ot!VcWq5g]N1"9/?#rosF`THO46rrM]k"E<l0s8N#t
+!T4O]!!!&t!!!&r!!<6%!!3'!!!3#u";()&s8L^OJ,~>
+aSu8>rVlm0!SIGQ;#C7urr<#65QLib!W2ot!VcWq5g]N1"9/?#rosF`THO46rrM]k"E<l0s8N#t
+!T4O]!!!&t!!!&r!!<6%!!3'!!!3#u";()&s8L^OJ,~>
+aSu8>rVlm0!SIGQ;#C7urr<#65QLib!W2ot!VcWq5g]N1"9/?#rosF`THO46rrM]k"E<l0s8N#t
+!T4O]!!!&t!!!&r!!<6%!!3'!!!3#u";()&s8L^OJ,~>
+`r?,>s2!7d!ri6!qYpZscu:0(!!!&u!!FEad/X+CrrE&brrE&rrroW&&HDe3q#LEq!\f`*r;Zfr
+!rlX/o`+smqu?]trW!$$!!!&o!!rZ+!<@ZMs8N&tg])d~>
+`r?,>s2!7d!ri6!qYpZscu:0(!!!&u!!FEad/X+CrrE&brrE&rrroW&&HDe3q#LEq!\f`*r;Zfr
+!rlX/o`+smqu?]trW!$$!!!&o!!rZ+!<@ZMs8N&tg])d~>
+`r?,>s2!7d!ri6!qYpZscu:0(!!!&u!!FEad/X+CrrE&brrE&rrroW&&HDe3q#LEq!\f`*r;Zfr
+!rlX/o`+smqu?]trW!$$!!!&o!!rZ+!<@ZMs8N&tg])d~>
+aSuDBs8W([ec5`trql]qrqud+i37`N5X@V"5B).Wi;`fUrs&K&s8N#trp]pfrq?@#d@c"u5<qFu
+5_,!4nG<.brr2p!&-)b+!!!&p!<3)q!<3)r!!30Drn%1#~>
+aSuDBs8W([ec5`trql]qrqud+i37`N5X@V"5B).Wi;`fUrs&K&s8N#trp]pfrq?@#d@c"u5<qFu
+5_,!4nG<.brr2p!&-)b+!!!&p!<3)q!<3)r!!30Drn%1#~>
+aSuDBs8W([ec5`trql]qrqud+i37`N5X@V"5B).Wi;`fUrs&K&s8N#trp]pfrq?@#d@c"u5<qFu
+5_,!4nG<.brr2p!&-)b+!!!&p!<3)q!<3)r!!30Drn%1#~>
+`;]gfec5lis8N&urr2otrpKddrqcWprp]pfrr)isrql]qrql]qrql]qrqud!rr;ut_!qC)!W<!"
+!<<0"!!!&r!!rZ+!!*'#!!)!Wf`-I~>
+`;]gfec5lis8N&urr2otrpKddrqcWprp]pfrr)isrql]qrql]qrql]qrqud!rr;ut_!qC)!W<!"
+!<<0"!!!&r!!rZ+!!*'#!!)!Wf`-I~>
+`;]gfec5lis8N&urr2otrpKddrqcWprp]pfrr)isrql]qrql]qrql]qrqud!rr;ut_!qC)!W<!"
+!<<0"!!!&r!!rZ+!!*'#!!)!Wf`-I~>
+aSuGCs8N&&!S7;PnG`@c!<2or!<2ors8N#t"TJH$rr2iq!ri6!mf*:dr;Qcrrr3*"s8W)rrrE&s
+rrE&srrE#srrW3"_!:t&!<<*#nc/^l!5SU6!<1aQJ,~>
+aSuGCs8N&&!S7;PnG`@c!<2or!<2ors8N#t"TJH$rr2iq!ri6!mf*:dr;Qcrrr3*"s8W)rrrE&s
+rrE&srrE#srrW3"_!:t&!<<*#nc/^l!5SU6!<1aQJ,~>
+aSuGCs8N&&!S7;PnG`@c!<2or!<2ors8N#t"TJH$rr2iq!ri6!mf*:dr;Qcrrr3*"s8W)rrrE&s
+rrE&srrE#srrW3"_!:t&!<<*#nc/^l!5SU6!<1aQJ,~>
+`W#u<i7@r1+TMH8rrW3"rr2otrqcWprql]qroj@grr;uts8N&ts8Mlp!<2rs!<2rs"oeQ$s8Tn-
+!!30$!VcWp!WE'$!<<*#q#CX#!!'h7rr;uPs*t~>
+`W#u<i7@r1+TMH8rrW3"rr2otrqcWprql]qroj@grr;uts8N&ts8Mlp!<2rs!<2rs"oeQ$s8Tn-
+!!30$!VcWp!WE'$!<<*#q#CX#!!'h7rr;uPs*t~>
+`W#u<i7@r1+TMH8rrW3"rr2otrqcWprql]qroj@grr;uts8N&ts8Mlp!<2rs!<2rs"oeQ$s8Tn-
+!!30$!VcWp!WE'$!<<*#q#CX#!!'h7rr;uPs*t~>
+_uB]jfDknjqYpQpr;Qcrqu6ZqrVllshu<]Uo`"pjr;Qp!s8N&tqu6Z3oDepn!!2ut!W`9%qZ$Ts
+o`,*@s8W)Ps*t~>
+_uB]jfDknjqYpQpr;Qcrqu6ZqrVllshu<]Uo`"pjr;Qp!s8N&tqu6Z3oDepn!!2ut!W`9%qZ$Ts
+o`,*@s8W)Ps*t~>
+_uB]jfDknjqYpQpr;Qcrqu6ZqrVllshu<]Uo`"pjr;Qp!s8N&tqu6Z3oDepn!!2ut!W`9%qZ$Ts
+o`,*@s8W)Ps*t~>
+a8ZACs8N%k!!3'!!!2or!s&B%!U0Rai26MSnGN=e!WE'!!T3qX&D$l3~>
+a8ZACs8N%k!!3'!!!2or!s&B%!U0Rai26MSnGN=e!WE'!!T3qX&D$l3~>
+a8ZACs8N%k!!3'!!!2or!s&B%!U0Rai26MSnGN=e!WE'!!T3qX&D$l3~>
+_Z'^'!!!&s!!NB'!<<*#oDepn!!2rs#6=gTs8W)uri,nt;#:4m!T*kW@+P@.~>
+_Z'^'!!!&s!!NB'!<<*#oDepn!!2rs#6=gTs8W)uri,nt;#:4m!T*kW@+P@.~>
+_Z'^'!!!&s!!NB'!<<*#oDepn!!2rs#6=gTs8W)uri,nt;#:4m!T*kW@+P@.~>
+_uBf;n1ae@!W`9%rVup!nc/XjqZ$TsrW!%.s8W(rrr`89!<N&t!!23^rrN*!!8lB-J,~>
+_uBf;n1ae@!W`9%rVup!nc/XjqZ$TsrW!%.s8W(rrr`89!<N&t!!23^rrN*!!8lB-J,~>
+_uBf;n1ae@!W`9%rVup!nc/XjqZ$TsrW!%.s8W(rrr`89!<N&t!!23^rrN*!!8lB-J,~>
+`r?&<rr3'!n1aS:!s&B%!V??l!Vuct@K6?+rrW3"ri,ntE;]e:!WN-"!Ta:_!<A53s*t~>
+`r?&<rr3'!n1aS:!s&B%!V??l!Vuct@K6?+rrW3"ri,ntE;]e:!WN-"!Ta:_!<A53s*t~>
+`r?&<rr3'!n1aS:!s&B%!V??l!Vuct@K6?+rrW3"ri,ntE;]e:!WN-"!Ta:_!<A53s*t~>
+_uBl=s8VRRrVup!rW!'%!!!$#pAbBu!!!$"!<N-!!HA&;rrE&srrE&#s8W)urrFeSr;ZfuiW'!e
+rmh%!~>
+_uBl=s8VRRrVup!rW!'%!!!$#pAbBu!!!$"!<N-!!HA&;rrE&srrE&#s8W)urrFeSr;ZfuiW'!e
+rmh%!~>
+_uBl=s8VRRrVup!rW!'%!!!$#pAbBu!!!$"!<N-!!HA&;rrE&srrE&#s8W)urrFeSr;ZfuiW'!e
+rmh%!~>
+`;^)As8W)urf@Zf!!!&j!!!&s!!FF[s8W)srr`9#s8K%u"oe$V!!!&\!!NB'!+>j+ec1.~>
+`;^)As8W)urf@Zf!!!&j!!!&s!!FF[s8W)srr`9#s8K%u"oe$V!!!&\!!NB'!+>j+ec1.~>
+`;^)As8W)urf@Zf!!!&j!!!&s!!FF[s8W)srr`9#s8K%u"oe$V!!!&\!!NB'!+>j+ec1.~>
+_Z'o@s8N&un8Jp>qZ$Tsn,NM3Jc>HEs8E'!ri#hsE8U^!JH,WKrmq+"~>
+_Z'o@s8N&un8Jp>qZ$Tsn,NM3Jc>HEs8E'!ri#hsE8U^!JH,WKrmq+"~>
+_Z'o@s8N&un8Jp>qZ$Tsn,NM3Jc>HEs8E'!ri#hsE8U^!JH,WKrmq+"~>
+]Dhs%O"fo#"&P]krq69kriZ8$rqcWq^`__=!Wb"%rr2utec1.~>
+]Dhs%O"fo#"&P]krq69kriZ8$rqcWq^`__=!Wb"%rr2utec1.~>
+]Dhs%O"fo#"&P]krq69kriZ8$rqcWq^`__=!Wb"%rr2utec1.~>
+\Gl`jOAHMh!W2ot!W<!$!?Y^Cn<EqSrh(D,!!!'!!!!&r!!30CT[3Xg~>
+\Gl`jOAHMh!W2ot!W<!$!?Y^Cn<EqSrh(D,!!!'!!!!&r!!30CT[3Xg~>
+\Gl`jOAHMh!W2ot!W<!$!?Y^Cn<EqSrh(D,!!!'!!!!&r!!30CT[3Xg~>
+[/U3s^nC[W"bD/RJ?ZffrrE%[rrKB$qZ$Zu!!2cn"V>(Ws8W)rrrE&Ls*t~>
+[/U3s^nC[W"bD/RJ?ZffrrE%[rrKB$qZ$Zu!!2cn"V>(Ws8W)rrrE&Ls*t~>
+[/U3s^nC[W"bD/RJ?ZffrrE%[rrKB$qZ$Zu!!2cn"V>(Ws8W)rrrE&Ls*t~>
+[f6L0s8N&tqYpZss8W(]rrE&rrr_bqDa='t!!3'!!^M:?b5Zt~>
+[f6L0s8N&tqYpZss8W(]rrE&rrr_bqDa='t!!3'!!^M:?b5Zt~>
+[f6L0s8N&tqYpZss8W(]rrE&rrr_bqDa='t!!3'!!^M:?b5Zt~>
+\GlR.rVllsrr3*"s8W&qrrE%Wrs&K&s8Lrl_#8ccOMJ[$rVlrus8Mlps8LULJ,~>
+\GlR.rVllsrr3*"s8W&qrrE%Wrs&K&s8Lrl_#8ccOMJ[$rVlrus8Mlps8LULJ,~>
+\GlR.rVllsrr3*"s8W&qrrE%Wrs&K&s8Lrl_#8ccOMJ[$rVlrus8Mlps8LULJ,~>
+\c2g3s8N&tqYpQpq>UNqs8JGd!ri6!rr2utr;Qcrq>UHorVllsp\t6meGk%~>
+\c2g3s8N&tqYpQpq>UNqs8JGd!ri6!rr2utr;Qcrq>UHorVllsp\t6meGk%~>
+\c2g3s8N&tqYpQpq>UNqs8JGd!ri6!rr2utr;Qcrq>UHorVllsp\t6meGk%~>
+\GlR.r;Qits8IoU"9/?#rql]qrqQKnrr2otrr2otrql]srr;uJs*t~>
+\GlR.r;Qits8IoU"9/?#rql]qrqQKnrr2otrr2otrql]srr;uJs*t~>
+\GlR.r;Qits8IoU"9/?#rql]qrqQKnrr2otrr2otrql]srr;uJs*t~>
+[f6F.s8Mus!<.lU!<2lq!<2Zk!<2ut"oeQ%rr;usrri?$rr;uKs*t~>
+[f6F.s8Mus!<.lU!<2lq!<2Zk!<2ut"oeQ%rr;usrri?$rr;uKs*t~>
+[f6F.s8Mus!<.lU!<2lq!<2Zk!<2ut"oeQ%rr;usrri?$rr;uKs*t~>
+Y5\S&s8Mlp!</5_!<2rs!<2Zk!<2ut!<2ip"oeQ$s8W)Ks*t~>
+Y5\S&s8Mlp!</5_!<2rs!<2Zk!<2ut!<2ip"oeQ$s8W)Ks*t~>
+Y5\S&s8Mlp!</5_!<2rs!<2Zk!<2ut!<2ip"oeQ$s8W)Ks*t~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+f`(sNdJj4Gqu6Zqq>UHomf*:dn,EIgs8Mrr!<2Zk"9/?#rfI/1~>
+f`(sNdJj4Gqu6Zqq>UHomf*:dn,EIgs8Mrr!<2Zk"9/?#rfI/1~>
+f`(sNdJj4Gqu6Zqq>UHomf*:dn,EIgs8Mrr!<2Zk"9/?#rfI/1~>
+h>[QUs8Mrr!<2ip!<2]l!<2or!<2'Z!<2or!ri6!oD\gih#@HTs8IoUJ,~>
+h>[QUs8Mrr!<2ip!<2]l!<2or!<2'Z!<2or!ri6!oD\gih#@HTs8IoUJ,~>
+h>[QUs8Mrr!<2ip!<2]l!<2or!<2'Z!<2or!ri6!oD\gih#@HTs8IoUJ,~>
+fDc'Ss8W)us8Mrr!<2ut!<2lq!<1sW"9/?#rqucrrpp'jrr;ucrrW3"rql]qrqucrrqQKqrr<#t
+PlH7~>
+fDc'Ss8W)us8Mrr!<2ut!<2lq!<1sW"9/?#rqucrrpp'jrr;ucrrW3"rql]qrqucrrqQKqrr<#t
+PlH7~>
+fDc'Ss8W)us8Mrr!<2ut!<2lq!<1sW"9/?#rqucrrpp'jrr;ucrrW3"rql]qrqucrrqQKqrr<#t
+PlH7~>
+hZ!]Ws8W)prs/PMnc-r8s8Moq!<2uts8N&u!<2?b!<2Qh!<2Ti"9/?#rp'L`rr2otrqQKqcg^t]
+r;QcrP5g%~>
+hZ!]Ws8W)prs/PMnc-r8s8Moq!<2uts8N&u!<2?b!<2Qh!<2Ti"9/?#rp'L`rr2otrqQKqcg^t]
+r;QcrP5g%~>
+hZ!]Ws8W)prs/PMnc-r8s8Moq!<2uts8N&u!<2?b!<2Qh!<2Ti"9/?#rp'L`rr2otrqQKqcg^t]
+r;QcrP5g%~>
+h>\/fs8W)us59MW*rl9O+9;HB&3tdFrrW3"rr)iuY;";hrrKs@qYpQpr;Qlus8W)grrW28i:-aH
+rr2otrr)j3rr<#VTO8iA!"^7Q!!*WqIfKEIs8J>aJ,~>
+h>\/fs8W)us59MW*rl9O+9;HB&3tdFrrW3"rr)iuY;";hrrKs@qYpQpr;Qlus8W)grrW28i:-aH
+rr2otrr)j3rr<#VTO8iA!"^7Q!!*WqIfKEIs8J>aJ,~>
+h>\/fs8W)us59MW*rl9O+9;HB&3tdFrrW3"rr)iuY;";hrrKs@qYpQpr;Qlus8W)grrW28i:-aH
+rr2otrr)j3rr<#VTO8iA!"^7Q!!*WqIfKEIs8J>aJ,~>
+gA_;k?k<;=rVup/rVup!rVuq+rVllsrVlt<!!#j`rrhh!!!)NcrrE&trs.Ii&-1&Vs8Mcms8E0$
+O:VG#nc&^js8W)rrr`8:?kE59!"o21!!3'!"(;-.rfmG5~>
+gA_;k?k<;=rVup/rVup!rVuq+rVllsrVlt<!!#j`rrhh!!!)NcrrE&trs.Ii&-1&Vs8Mcms8E0$
+O:VG#nc&^js8W)rrr`8:?kE59!"o21!!3'!"(;-.rfmG5~>
+gA_;k?k<;=rVup/rVup!rVuq+rVllsrVlt<!!#j`rrhh!!!)NcrrE&trs.Ii&-1&Vs8Mcms8E0$
+O:VG#nc&^js8W)rrr`8:?kE59!"o21!!3'!"(;-.rfmG5~>
+hu=Gjs8K8f!<<*B?uVdRs5;7sE'YS>rqZQt?iU3-!9!>G"],1!!Pn^2rrMUsrW!$3s8W)mrr`9#
+s"OEP!+>*l!q<EZrW!?M?uVdSro)4sE'PP<OT0h~>
+hu=Gjs8K8f!<<*B?uVdRs5;7sE'YS>rqZQt?iU3-!9!>G"],1!!Pn^2rrMUsrW!$3s8W)mrr`9#
+s"OEP!+>*l!q<EZrW!?M?uVdSro)4sE'PP<OT0h~>
+hu=Gjs8K8f!<<*B?uVdRs5;7sE'YS>rqZQt?iU3-!9!>G"],1!!Pn^2rrMUsrW!$3s8W)mrr`9#
+s"OEP!+>*l!q<EZrW!?M?uVdSro)4sE'PP<OT0h~>
+hZ!i<0`V4S+HZ*frrW3"rqZR"^]4B8!<>@arpg!jDu]n=q#:>urVus"JF`^@n0%]1!.aD8!T5[2
+!!4:)mtC^k~>
+hZ!i<0`V4S+HZ*frrW3"rqZR"^]4B8!<>@arpg!jDu]n=q#:>urVus"JF`^@n0%]1!.aD8!T5[2
+!!4:)mtC^k~>
+hZ!i<0`V4S+HZ*frrW3"rqZR"^]4B8!<>@arpg!jDu]n=q#:>urVus"JF`^@n0%]1!.aD8!T5[2
+!!4:)mtC^k~>
+kl1Y^q>UVk&-)\AJF3@>rr<#f0`1nNORW8PTE"sFq#:Tu5QCcqnGiLZrr@TK!!%Q:rs&Iq&-)_B
+JCOT!ro!eVrr2otrquctrr;uRs*t~>
+kl1Y^q>UVk&-)\AJF3@>rr<#f0`1nNORW8PTE"sFq#:Tu5QCcqnGiLZrr@TK!!%Q:rs&Iq&-)_B
+JCOT!ro!eVrr2otrquctrr;uRs*t~>
+kl1Y^q>UVk&-)\AJF3@>rr<#f0`1nNORW8PTE"sFq#:Tu5QCcqnGiLZrr@TK!!%Q:rs&Iq&-)_B
+JCOT!ro!eVrr2otrquctrr;uRs*t~>
+l2Lncs8N&trVm%/!<<*rd-L]8rr<"L!!3#u#@RT3rr;utrqQKs^]4?gs8Mlp"Q07\!2/i]!.b%K
+!.aJ:!+>d+!Dq.krs8W(s8N&ts8W)qrrE&trrE&ZrrE&trrE&[s*t~>
+l2Lncs8N&trVm%/!<<*rd-L]8rr<"L!!3#u#@RT3rr;utrqQKs^]4?gs8Mlp"Q07\!2/i]!.b%K
+!.aJ:!+>d+!Dq.krs8W(s8N&ts8W)qrrE&trrE&ZrrE&trrE&[s*t~>
+l2Lncs8N&trVm%/!<<*rd-L]8rr<"L!!3#u#@RT3rr;utrqQKs^]4?gs8Mlp"Q07\!2/i]!.b%K
+!.aJ:!+>d+!Dq.krs8W(s8N&ts8W)qrrE&trrE&ZrrE&trrE&[s*t~>
+kl2+ks8N&urp`5R!!.WMrpB^prVuoss*t+M!!*'#!5JL4!<2`m!7:]F!<2ip"o_m0!!2$IrrB>'
+!!%Q<rrMUSrW!(Orr<#td/O+Fqu6ZqrVllsnG`[ks8W)urqZQrrr<#tj8XW~>
+kl2+ks8N&urp`5R!!.WMrpB^prVuoss*t+M!!*'#!5JL4!<2`m!7:]F!<2ip"o_m0!!2$IrrB>'
+!!%Q<rrMUSrW!(Orr<#td/O+Fqu6ZqrVllsnG`[ks8W)urqZQrrr<#tj8XW~>
+kl2+ks8N&urp`5R!!.WMrpB^prVuoss*t+M!!*'#!5JL4!<2`m!7:]F!<2ip"o_m0!!2$IrrB>'
+!!%Q<rrMUSrW!(Orr<#td/O+Fqu6ZqrVllsnG`[ks8W)urqZQrrr<#tj8XW~>
+l2M"fs8W)us7.iB!!&\SrrrCp!!",qrW!'DnGiOfp&>6t!$M:@rr;usrs/$*!!.$<s8N#t!<2]l
+!5JL5!.j_@$NC(p0E;(RT`>&kci4+Hs8W)qrrE&trrE&irrE&trrE&mrs&K&s8N&uroO01~>
+l2M"fs8W)us7.iB!!&\SrrrCp!!",qrW!'DnGiOfp&>6t!$M:@rr;usrs/$*!!.$<s8N#t!<2]l
+!5JL5!.j_@$NC(p0E;(RT`>&kci4+Hs8W)qrrE&trrE&irrE&trrE&mrs&K&s8N&uroO01~>
+l2M"fs8W)us7.iB!!&\SrrrCp!!",qrW!'DnGiOfp&>6t!$M:@rr;usrs/$*!!.$<s8N#t!<2]l
+!5JL5!.j_@$NC(p0E;(RT`>&kci4+Hs8W)qrrE&trrE&irrE&trrE&mrs&K&s8N&uroO01~>
+kPkkfs8MLP!!*(mroj@jrVun;!!*))5QLib0D#2IrX]&os8Mrr#QB5R!"f21rr2otrq69o_>sW:
+OSAbTrr2p)rr;IQ!!!%ls8W)trrE&Crs4^:JAAt:YX"9.rr`9#s8M*ZJ,~>
+kPkkfs8MLP!!*(mroj@jrVun;!!*))5QLib0D#2IrX]&os8Mrr#QB5R!"f21rr2otrq69o_>sW:
+OSAbTrr2p)rr;IQ!!!%ls8W)trrE&Crs4^:JAAt:YX"9.rr`9#s8M*ZJ,~>
+kPkkfs8MLP!!*(mroj@jrVun;!!*))5QLib0D#2IrX]&os8Mrr#QB5R!"f21rr2otrq69o_>sW:
+OSAbTrr2p)rr;IQ!!!%ls8W)trrE&Crs4^:JAAt:YX"9.rr`9#s8M*ZJ,~>
+jSoI8!!!%=s8W)\rs$gn!!*#u+T;?AU&O]a"[;u@rr;uqrs0_I!.b+Ks8W)irrDQf!!%QCrrE&s
+rs=2U!<@->rr2rsbl7^J+Su-@!<@]Mrr2uto)Asos8W)Wi5"jZrrE&Ys*t~>
+jSoI8!!!%=s8W)\rs$gn!!*#u+T;?AU&O]a"[;u@rr;uqrs0_I!.b+Ks8W)irrDQf!!%QCrrE&s
+rs=2U!<@->rr2rsbl7^J+Su-@!<@]Mrr2uto)Asos8W)Wi5"jZrrE&Ys*t~>
+jSoI8!!!%=s8W)\rs$gn!!*#u+T;?AU&O]a"[;u@rr;uqrs0_I!.b+Ks8W)irrDQf!!%QCrrE&s
+rs=2U!<@->rr2rsbl7^J+Su-@!<@]Mrr2uto)Asos8W)Wi5"jZrrE&Ys*t~>
+l2M(hs8N&&!<<-Cn`0WYJ,fR8s8VO1!!!Sgs8M`l!^H`Nrr39's8W)6!!*)8rr2utoD]!ns"FKS
+OnSeXrr<#tYl4V'+Ro4,!<1RL"oeQ$s8ULC!<3'#!5JL4!<2Zk'E8%2s7"?"!!!$2:n[=Xs8N&u
+roO01~>
+l2M(hs8N&&!<<-Cn`0WYJ,fR8s8VO1!!!Sgs8M`l!^H`Nrr39's8W)6!!*)8rr2utoD]!ns"FKS
+OnSeXrr<#tYl4V'+Ro4,!<1RL"oeQ$s8ULC!<3'#!5JL4!<2Zk'E8%2s7"?"!!!$2:n[=Xs8N&u
+roO01~>
+l2M(hs8N&&!<<-Cn`0WYJ,fR8s8VO1!!!Sgs8M`l!^H`Nrr39's8W)6!!*)8rr2utoD]!ns"FKS
+OnSeXrr<#tYl4V'+Ro4,!<1RL"oeQ$s8ULC!<3'#!5JL4!<2Zk'E8%2s7"?"!!!$2:n[=Xs8N&u
+roO01~>
+k5PVS+92Bai;<NSrosFbJ,fR6rr2u6rVupPo`"tX!'pD\!+>d+"47)Jrp]pi5QCgMoD]!`+92Ba
+i;*BQrm:ZLn6r!:^n?5W!!"_?rrW28+T)3>!WE''YlFb&s8N#[s*t~>
+k5PVS+92Bai;<NSrosFbJ,fR6rr2u6rVupPo`"tX!'pD\!+>d+"47)Jrp]pi5QCgMoD]!`+92Ba
+i;*BQrm:ZLn6r!:^n?5W!!"_?rrW28+T)3>!WE''YlFb&s8N#[s*t~>
+k5PVS+92Bai;<NSrosFbJ,fR6rr2u6rVupPo`"tX!'pD\!+>d+"47)Jrp]pi5QCgMoD]!`+92Ba
+i;*BQrm:ZLn6r!:^n?5W!!"_?rrW28+T)3>!WE''YlFb&s8N#[s*t~>
+k5PF3rVuq;lMgk`qu6j!s1eU7&H2V3J,fTMJ+`gC5l`V8rrW6%!+>0n"$cke62CN\rqucrJGoNN
+JcGcLir9#XoD\gio)Aoe!<<,Hs8MZj!<2ut!UsLr!":PI5VN0=!!!SGs8N#Ys*t~>
+k5PF3rVuq;lMgk`qu6j!s1eU7&H2V3J,fTMJ+`gC5l`V8rrW6%!+>0n"$cke62CN\rqucrJGoNN
+JcGcLir9#XoD\gio)Aoe!<<,Hs8MZj!<2ut!UsLr!":PI5VN0=!!!SGs8N#Ys*t~>
+k5PF3rVuq;lMgk`qu6j!s1eU7&H2V3J,fTMJ+`gC5l`V8rrW6%!+>0n"$cke62CN\rqucrJGoNN
+JcGcLir9#XoD\gio)Aoe!<<,Hs8MZj!<2ut!UsLr!":PI5VN0=!!!SGs8N#Ys*t~>
+kl1_`s$6P`!9!#>!ri6!rr;uu$N^;-rr<"*!!"bQrqucrrr)iu563J8rrh6k!<Bq&rri<d!!,@V
+rr>@a!!2$Wli-tap\t<os8Mfns8MQg"lKpl!0I3KrrqmW!>'1rrVm)++9;HB&F\WYJ,~>
+kl1_`s$6P`!9!#>!ri6!rr;uu$N^;-rr<"*!!"bQrqucrrr)iu563J8rrh6k!<Bq&rri<d!!,@V
+rr>@a!!2$Wli-tap\t<os8Mfns8MQg"lKpl!0I3KrrqmW!>'1rrVm)++9;HB&F\WYJ,~>
+kl1_`s$6P`!9!#>!ri6!rr;uu$N^;-rr<"*!!"bQrqucrrr)iu563J8rrh6k!<Bq&rri<d!!,@V
+rr>@a!!2$Wli-tap\t<os8Mfns8MQg"lKpl!0I3KrrqmW!>'1rrVm)++9;HB&F\WYJ,~>
+l2Ltes3L`H!)_qZ!<2ut!<2ut!WW6$rVm*$n/q]2&E!6^!Y>>rqu6gr!<<`3rpB^f5QCdLo`"p;
+rW!%.s8W)krrW3"rpp'nrr<#ts8W)qrrE&hrs&K&ricA&1&V%Orq$-l;#h-SqYpSi+8u6AOT5=@
+s*t~>
+l2Ltes3L`H!)_qZ!<2ut!<2ut!WW6$rVm*$n/q]2&E!6^!Y>>rqu6gr!<<`3rpB^f5QCdLo`"p;
+rW!%.s8W)krrW3"rpp'nrr<#ts8W)qrrE&hrs&K&ricA&1&V%Orq$-l;#h-SqYpSi+8u6AOT5=@
+s*t~>
+l2Ltes3L`H!)_qZ!<2ut!<2ut!WW6$rVm*$n/q]2&E!6^!Y>>rqu6gr!<<`3rpB^f5QCdLo`"p;
+rW!%.s8W)krrW3"rpp'nrr<#ts8W)qrrE&hrs&K&ricA&1&V%Orq$-l;#h-SqYpSi+8u6AOT5=@
+s*t~>
+kPk[8!<E1Mli-tapAYX(!!)Ths8N&ti%P-21&h1NrrE&ts8N'!Oo54_huE`X@/fZq!<2ut"$Zed
+5Pb<Zrr)isJc5WPJcG`Lrp9Xdrr;usrrE&rrs8+e:bVk\:iXkOrr`9#+9DHA#!e:/rr<#tpAYE7
+!!&_ms8N&trr3#ud/F"F&E<_?~>
+kPk[8!<E1Mli-tapAYX(!!)Ths8N&ti%P-21&h1NrrE&ts8N'!Oo54_huE`X@/fZq!<2ut"$Zed
+5Pb<Zrr)isJc5WPJcG`Lrp9Xdrr;usrrE&rrs8+e:bVk\:iXkOrr`9#+9DHA#!e:/rr<#tpAYE7
+!!&_ms8N&trr3#ud/F"F&E<_?~>
+kPk[8!<E1Mli-tapAYX(!!)Ths8N&ti%P-21&h1NrrE&ts8N'!Oo54_huE`X@/fZq!<2ut"$Zed
+5Pb<Zrr)isJc5WPJcG`Lrp9Xdrr;usrrE&rrs8+e:bVk\:iXkOrr`9#+9DHA#!e:/rr<#tpAYE7
+!!&_ms8N&trr3#ud/F"F&E<_?~>
+kPkZM!<<,(nG`Lfq>UHoqZ$Qq"!@RCrr)is^]"370`V.Ks8N'!JGfEIYl4V(^]4<#rrXAD!($AZ
+$NC))5l^ocZ2ak'o`"pjrr3-#s8N&trr2usrVm$"s8R$Lq#CM9rr;uirrM(SqZ$g$!+><qs8Mcm
+!^Hc_qu7$&s8N&uJ,fTM_>`NqJ,~>
+kPkZM!<<,(nG`Lfq>UHoqZ$Qq"!@RCrr)is^]"370`V.Ks8N'!JGfEIYl4V(^]4<#rrXAD!($AZ
+$NC))5l^ocZ2ak'o`"pjrr3-#s8N&trr2usrVm$"s8R$Lq#CM9rr;uirrM(SqZ$g$!+><qs8Mcm
+!^Hc_qu7$&s8N&uJ,fTM_>`NqJ,~>
+kPkZM!<<,(nG`Lfq>UHoqZ$Qq"!@RCrr)is^]"370`V.Ks8N'!JGfEIYl4V(^]4<#rrXAD!($AZ
+$NC))5l^ocZ2ak'o`"pjrr3-#s8N&trr2usrVm$"s8R$Lq#CM9rr;uirrM(SqZ$g$!+><qs8Mcm
+!^Hc_qu7$&s8N&uJ,fTM_>`NqJ,~>
+kPtP^!WiB$mJm4%!T:`l^]NHorr)j#+92Dgs8Mrr!.b%K!0I$V"98Hes8N#t!2'5j!Pn^$rr[3?
+!<Dfm"o\K&!!3)irrE&trr`8:^u51,!8m\R&@!>X!'l\9iK,,_!!%T>s8M`l"4/\%!Vl]q5kY-[
+YQ+[]rr2otrr)iurr;Ke!!%N/s*t~>
+kPtP^!WiB$mJm4%!T:`l^]NHorr)j#+92Dgs8Mrr!.b%K!0I$V"98Hes8N#t!2'5j!Pn^$rr[3?
+!<Dfm"o\K&!!3)irrE&trr`8:^u51,!8m\R&@!>X!'l\9iK,,_!!%T>s8M`l"4/\%!Vl]q5kY-[
+YQ+[]rr2otrr)iurr;Ke!!%N/s*t~>
+kPtP^!WiB$mJm4%!T:`l^]NHorr)j#+92Dgs8Mrr!.b%K!0I$V"98Hes8N#t!2'5j!Pn^$rr[3?
+!<Dfm"o\K&!!3)irrE&trr`8:^u51,!8m\R&@!>X!'l\9iK,,_!!%T>s8M`l"4/\%!Vl]q5kY-[
+YQ+[]rr2otrr)iurr;Ke!!%N/s*t~>
+kl1YQrVup1mJd;c!!!$#rVupPqu?Zr!<M]hrrE&srsrN<!<COIs8N&ts8Duu62pl`"S%!B!$LV-
+"TEoO!!2io#6+Ym!!!$2rVllsp&>-ns8Ppl!!4kSrr2p&d/X1JJH,ZKrr2s_rVup`rr2utq#:Rq
+!<@&S^lUhZ!!(C>rrQ!s+TDE@rr2otrr)lr!!$uus*t~>
+kl1YQrVup1mJd;c!!!$#rVupPqu?Zr!<M]hrrE&srsrN<!<COIs8N&ts8Duu62pl`"S%!B!$LV-
+"TEoO!!2io#6+Ym!!!$2rVllsp&>-ns8Ppl!!4kSrr2p&d/X1JJH,ZKrr2s_rVup`rr2utq#:Rq
+!<@&S^lUhZ!!(C>rrQ!s+TDE@rr2otrr)lr!!$uus*t~>
+kl1YQrVup1mJd;c!!!$#rVupPqu?Zr!<M]hrrE&srsrN<!<COIs8N&ts8Duu62pl`"S%!B!$LV-
+"TEoO!!2io#6+Ym!!!$2rVllsp&>-ns8Ppl!!4kSrr2p&d/X1JJH,ZKrr2s_rVup`rr2utq#:Rq
+!<@&S^lUhZ!!(C>rrQ!s+TDE@rr2otrr)lr!!$uus*t~>
+kl1eT+92BPmJd8"!!!T/!!"_Ms8Duu_"dp30)ttpqZ$Qq$:+Xkrr<!p!!#:`mJd7es.TDlp&>0a
+*rl9PmJd8"!!!T/!!"_PrrrD[&-*97qYpTd+T;?DnGiLfrqZToJ,msorrnK<!!*)HpAY2%!+>['
+!<2orrVuqKj8XW~>
+kl1eT+92BPmJd8"!!!T/!!"_Ms8Duu_"dp30)ttpqZ$Qq$:+Xkrr<!p!!#:`mJd7es.TDlp&>0a
+*rl9PmJd8"!!!T/!!"_PrrrD[&-*97qYpTd+T;?DnGiLfrqZToJ,msorrnK<!!*)HpAY2%!+>['
+!<2orrVuqKj8XW~>
+kl1eT+92BPmJd8"!!!T/!!"_Ms8Duu_"dp30)ttpqZ$Qq$:+Xkrr<!p!!#:`mJd7es.TDlp&>0a
+*rl9PmJd8"!!!T/!!"_PrrrD[&-*97qYpTd+T;?DnGiLfrqZToJ,msorrnK<!!*)HpAY2%!+>['
+!<2orrVuqKj8XW~>
+kPtP^!<Ec"rrrE%rr<#UrVupQqu?Zr!<L"2rrBk6!!,@Sr;Qg@!'pM_"Rls&!C5rM"+L=O!;-<k
+!!304rp'Ldi;`lY0`D"R:]LK'q#:>erVur6mf*@fruh:@!5SL3!<2rs!^Ha9qYpQpr;Z`r!Kd<A
+s*t~>
+kPtP^!<Ec"rrrE%rr<#UrVupQqu?Zr!<L"2rrBk6!!,@Sr;Qg@!'pM_"Rls&!C5rM"+L=O!;-<k
+!!304rp'Ldi;`lY0`D"R:]LK'q#:>erVur6mf*@fruh:@!5SL3!<2rs!^Ha9qYpQpr;Z`r!Kd<A
+s*t~>
+kPtP^!<Ec"rrrE%rr<#UrVupQqu?Zr!<L"2rrBk6!!,@Sr;Qg@!'pM_"Rls&!C5rM"+L=O!;-<k
+!!304rp'Ldi;`lY0`D"R:]LK'q#:>erVur6mf*@fruh:@!5SL3!<2rs!^Ha9qYpQpr;Z`r!Kd<A
+s*t~>
+kPkVa!<=80rrE&srrYId!!)or"qUbGi;`iVqu6m"O8o:]0^nu?#7pl$rr2rt_#=<6JaWO<rr2p(
+J,fTMrr<#ts8Mrr$NC&+!<=8BrVuosn,E^ns$6Vc!<<&uhu3TUi;!<Wi;ioYYlF_%o`#*os8N&u
+OT#4[_#434rr2p#rr4)A@/U$)rr)j$rr;uu!>",Ks*t~>
+kPkVa!<=80rrE&srrYId!!)or"qUbGi;`iVqu6m"O8o:]0^nu?#7pl$rr2rt_#=<6JaWO<rr2p(
+J,fTMrr<#ts8Mrr$NC&+!<=8BrVuosn,E^ns$6Vc!<<&uhu3TUi;!<Wi;ioYYlF_%o`#*os8N&u
+OT#4[_#434rr2p#rr4)A@/U$)rr)j$rr;uu!>",Ks*t~>
+kPkVa!<=80rrE&srrYId!!)or"qUbGi;`iVqu6m"O8o:]0^nu?#7pl$rr2rt_#=<6JaWO<rr2p(
+J,fTMrr<#ts8Mrr$NC&+!<=8BrVuosn,E^ns$6Vc!<<&uhu3TUi;!<Wi;ioYYlF_%o`#*os8N&u
+OT#4[_#434rr2p#rr4)A@/U$)rr)j$rr;uu!>",Ks*t~>
+kPkYd!!*)Hmf*:drVm!d!!*Z1rr36&rt#/@s8W)nrr>pq!!bdgs8N$p!<E)u!20;k"+^FOrpB^c
+JGoQKrrE&trrE&qs8N'#!<CL3rsSfk!!!W1s8S/\!&=KQ!<2lq"TAB$!T<tW!<2Kf!5SR6!:TX]
+"$cke_"n!9rr;ut!<?R.roF*0~>
+kPkYd!!*)Hmf*:drVm!d!!*Z1rr36&rt#/@s8W)nrr>pq!!bdgs8N$p!<E)u!20;k"+^FOrpB^c
+JGoQKrrE&trrE&qs8N'#!<CL3rsSfk!!!W1s8S/\!&=KQ!<2lq"TAB$!T<tW!<2Kf!5SR6!:TX]
+"$cke_"n!9rr;ut!<?R.roF*0~>
+kPkYd!!*)Hmf*:drVm!d!!*Z1rr36&rt#/@s8W)nrr>pq!!bdgs8N$p!<E)u!20;k"+^FOrpB^c
+JGoQKrrE&trrE&qs8N'#!<CL3rsSfk!!!W1s8S/\!&=KQ!<2lq"TAB$!T<tW!<2Kf!5SR6!:TX]
+"$cke_"n!9rr;ut!<?R.roF*0~>
+kPkN9rVuq\n,ECer;Qsd!!#:as8N#trr<$"r;Qcrqu6iW!!*'#OT,7]:B1t)rrpaL!!/blli-s8
+rW)Tj"Y]rW!0I3FrsD!k!C-V`s*t(L&,cG-rr2ouro*hV!7:<:!<2or"-3E^&Gc>+rr2p#OT5@m
+d.dPBO8o9"rr2utk5Tr~>
+kPkN9rVuq\n,ECer;Qsd!!#:as8N#trr<$"r;Qcrqu6iW!!*'#OT,7]:B1t)rrpaL!!/blli-s8
+rW)Tj"Y]rW!0I3FrsD!k!C-V`s*t(L&,cG-rr2ouro*hV!7:<:!<2or"-3E^&Gc>+rr2p#OT5@m
+d.dPBO8o9"rr2utk5Tr~>
+kPkN9rVuq\n,ECer;Qsd!!#:as8N#trr<$"r;Qcrqu6iW!!*'#OT,7]:B1t)rrpaL!!/blli-s8
+rW)Tj"Y]rW!0I3FrsD!k!C-V`s*t(L&,cG-rr2ouro*hV!7:<:!<2or"-3E^&Gc>+rr2p#OT5@m
+d.dPBO8o9"rr2utk5Tr~>
+kPk]O!<<+MrpTjerr2p#r]pMb@/g03rr;uu!<E0"rqufrrr2p.^^gGG!20Al5QD>prr2qJrW!#8
+s8MEc!WIWK!;ld(rr<#ts8W'a!!*(Ml2LiN!!$I,rrA2\!!)N`rs$gM!$M=Arq??lrr2otrr2p"
+?i^8#q#:X!s8VNf!<<_ir;R$$s8UFW!!(p9s*t~>
+kPk]O!<<+MrpTjerr2p#r]pMb@/g03rr;uu!<E0"rqufrrr2p.^^gGG!20Al5QD>prr2qJrW!#8
+s8MEc!WIWK!;ld(rr<#ts8W'a!!*(Ml2LiN!!$I,rrA2\!!)N`rs$gM!$M=Arq??lrr2otrr2p"
+?i^8#q#:X!s8VNf!<<_ir;R$$s8UFW!!(p9s*t~>
+kPk]O!<<+MrpTjerr2p#r]pMb@/g03rr;uu!<E0"rqufrrr2p.^^gGG!20Al5QD>prr2qJrW!#8
+s8MEc!WIWK!;ld(rr<#ts8W'a!!*(Ml2LiN!!$I,rrA2\!!)N`rs$gM!$M=Arq??lrr2otrr2p"
+?i^8#q#:X!s8VNf!<<_ir;R$$s8UFW!!(p9s*t~>
+kPkO$rVup?l2Ll_!!!VHr;Qj"!"eYurrE&qrrW3"JGoNQ&^UK-!!3)urr@TK!!,@am/I4I%fcS`
+rr2utqu6cts8R';!!4kSrp0Rh5QCcq_#OG-rVuqLqu?]q#6-ph!0I6[o)A^hrr3)Y!!#=ars&K&
+s8LtR_#=95E;fh<&"rh"#2_*7!-%u;j8XW~>
+kPkO$rVup?l2Ll_!!!VHr;Qj"!"eYurrE&qrrW3"JGoNQ&^UK-!!3)urr@TK!!,@am/I4I%fcS`
+rr2utqu6cts8R';!!4kSrp0Rh5QCcq_#OG-rVuqLqu?]q#6-ph!0I6[o)A^hrr3)Y!!#=ars&K&
+s8LtR_#=95E;fh<&"rh"#2_*7!-%u;j8XW~>
+kPkO$rVup?l2Ll_!!!VHr;Qj"!"eYurrE&qrrW3"JGoNQ&^UK-!!3)urr@TK!!,@am/I4I%fcS`
+rr2utqu6cts8R';!!4kSrp0Rh5QCcq_#OG-rVuqLqu?]q#6-ph!0I6[o)A^hrr3)Y!!#=ars&K&
+s8LtR_#=95E;fh<&"rh"#2_*7!-%u;j8XW~>
+kPkP?rVus1d-Uc9rr54`!It"HrW!)Zrr<#trr3'!s8N#t!V%lC!!I<A5QCf_rrdiQ!!#:Nrs$7l
+!<<-#T_8<bhu3TX&CCIVm/I/Q!!/2\rrq<]!!*)Hrr2utrr34a!!!W"s8W)lrrE&srs8W(5QCiC
+s8N#srrg.K!<?O+rsq?p!!*'2J\^cZJIhe]@/f-bJ,~>
+kPkP?rVus1d-Uc9rr54`!It"HrW!)Zrr<#trr3'!s8N#t!V%lC!!I<A5QCf_rrdiQ!!#:Nrs$7l
+!<<-#T_8<bhu3TX&CCIVm/I/Q!!/2\rrq<]!!*)Hrr2utrr34a!!!W"s8W)lrrE&srs8W(5QCiC
+s8N#srrg.K!<?O+rsq?p!!*'2J\^cZJIhe]@/f-bJ,~>
+kPkP?rVus1d-Uc9rr54`!It"HrW!)Zrr<#trr3'!s8N#t!V%lC!!I<A5QCf_rrdiQ!!#:Nrs$7l
+!<<-#T_8<bhu3TX&CCIVm/I/Q!!/2\rrq<]!!*)Hrr2utrr34a!!!W"s8W)lrrE&srs8W(5QCiC
+s8N#srrg.K!<?O+rsq?p!!*'2J\^cZJIhe]@/f-bJ,~>
+k5PE8rVup`n,ECerVlkZrW)iqrVur6rVllsq#:?`r;Ztn5QDARrr2u6rVup@mJd6L!!3#u!5SL3
+!<2lq!&4BP!'oiL#`o&e!<<)us,d0Z$p_&4iU=!)!!*YWs8M]k!<2lq"4.#J?i'd'5QUia!5JL4
+!)`Rm"T\T'+Me!UrrE&Zs*t~>
+k5PE8rVup`n,ECerVlkZrW)iqrVur6rVllsq#:?`r;Ztn5QDARrr2u6rVup@mJd6L!!3#u!5SL3
+!<2lq!&4BP!'oiL#`o&e!<<)us,d0Z$p_&4iU=!)!!*YWs8M]k!<2lq"4.#J?i'd'5QUia!5JL4
+!)`Rm"T\T'+Me!UrrE&Zs*t~>
+k5PE8rVup`n,ECerVlkZrW)iqrVur6rVllsq#:?`r;Ztn5QDARrr2u6rVup@mJd6L!!3#u!5SL3
+!<2lq!&4BP!'oiL#`o&e!<<)us,d0Z$p_&4iU=!)!!*YWs8M]k!<2lq"4.#J?i'd'5QUia!5JL4
+!)`Rm"T\T'+Me!UrrE&Zs*t~>
+k5PFSr;ZiErVllsqu6`ss8Mio#4E''&+BPtrr3(N!<Bq+rs(4X!!*'2!+>d*!Pea8!!(C7rs3!5
+!!!Q2!!'4prrA_j!!(C;rrE&prsJ6-!"eZ!rr<"K&GlG5!<<*2JFNU=rqQKnrql^!rr:n1!&=?M
+"oe%"!!+eNrrI'MrVup!rVut,d,+eQ~>
+k5PFSr;ZiErVllsqu6`ss8Mio#4E''&+BPtrr3(N!<Bq+rs(4X!!*'2!+>d*!Pea8!!(C7rs3!5
+!!!Q2!!'4prrA_j!!(C;rrE&prsJ6-!"eZ!rr<"K&GlG5!<<*2JFNU=rqQKnrql^!rr:n1!&=?M
+"oe%"!!+eNrrI'MrVup!rVut,d,+eQ~>
+k5PFSr;ZiErVllsqu6`ss8Mio#4E''&+BPtrr3(N!<Bq+rs(4X!!*'2!+>d*!Pea8!!(C7rs3!5
+!!!Q2!!'4prrA_j!!(C;rrE&prsJ6-!"eZ!rr<"K&GlG5!<<*2JFNU=rqQKnrql^!rr:n1!&=?M
+"oe%"!!+eNrrI'MrVup!rVut,d,+eQ~>
+jo5U:!!*'2d/O(Equ6`ss8Mfn"X!dF!Pn^5rr\l)!5J+)"Rls'!!3'!$'>/drr3K0!!&,[rr`9#
+s8Mlp%K?C356([K_2nWt!7Cf?rr`9#s+((K!YE`XrVuosr;Qits8Mrr!WF2?!!'h4rrV\_5lL`d
+&3rOCnG`FfrpTjki#i%Sn,NCarri?$?r6@lrrE&trs.JdJ5B$=J^E3PJ,~>
+jo5U:!!*'2d/O(Equ6`ss8Mfn"X!dF!Pn^5rr\l)!5J+)"Rls'!!3'!$'>/drr3K0!!&,[rr`9#
+s8Mlp%K?C356([K_2nWt!7Cf?rr`9#s+((K!YE`XrVuosr;Qits8Mrr!WF2?!!'h4rrV\_5lL`d
+&3rOCnG`FfrpTjki#i%Sn,NCarri?$?r6@lrrE&trs.JdJ5B$=J^E3PJ,~>
+jo5U:!!*'2d/O(Equ6`ss8Mfn"X!dF!Pn^5rr\l)!5J+)"Rls'!!3'!$'>/drr3K0!!&,[rr`9#
+s8Mlp%K?C356([K_2nWt!7Cf?rr`9#s+((K!YE`XrVuosr;Qits8Mrr!WF2?!!'h4rrV\_5lL`d
+&3rOCnG`FfrpTjki#i%Sn,NCarri?$?r6@lrrE&trs.JdJ5B$=J^E3PJ,~>
+jo5A.&H2Y4&CCIWrq-3jrr2p#?iU3-YPeD&&-)]lnc&W`&H2Y<!J'\>rr<"k!!!$"Yl4V%rql^)
+rkLc!!"bh'rdb%L!J'eA#13q^!!!SWqu?]qqu6`ss8N#t!)`^q!O2S#rr`9#s8Mlp"9/?#rV?Hn
+rql^!TF_,H_>aH6!<2Ed!<2or!<1jTJ,~>
+jo5A.&H2Y4&CCIWrq-3jrr2p#?iU3-YPeD&&-)]lnc&W`&H2Y<!J'\>rr<"k!!!$"Yl4V%rql^)
+rkLc!!"bh'rdb%L!J'eA#13q^!!!SWqu?]qqu6`ss8N#t!)`^q!O2S#rr`9#s8Mlp"9/?#rV?Hn
+rql^!TF_,H_>aH6!<2Ed!<2or!<1jTJ,~>
+jo5A.&H2Y4&CCIWrq-3jrr2p#?iU3-YPeD&&-)]lnc&W`&H2Y<!J'\>rr<"k!!!$"Yl4V%rql^)
+rkLc!!"bh'rdb%L!J'eA#13q^!!!SWqu?]qqu6`ss8N#t!)`^q!O2S#rr`9#s8Mlp"9/?#rV?Hn
+rql^!TF_,H_>aH6!<2Ed!<2or!<1jTJ,~>
+jSoJ3!!!$"!Dr:arr`9#rr2fp"+bqe+T29?Z2O\,mf<CgJH,WArr`9#rdjtI!3lD$#7gh8!&4HQ
+rqZQp^bG`f!J'\=rrdiP!<>FbrrE&lrs-mN!!*'";"4Ja#6+Z&rr<#trVltMImG4U!!'8&rrW3"
+rq??lrq??lrr)j)i.)pM!)N+`s8N&tqu6Zqqu6ZqdJn^~>
+jSoJ3!!!$"!Dr:arr`9#rr2fp"+bqe+T29?Z2O\,mf<CgJH,WArr`9#rdjtI!3lD$#7gh8!&4HQ
+rqZQp^bG`f!J'\=rrdiP!<>FbrrE&lrs-mN!!*'";"4Ja#6+Z&rr<#trVltMImG4U!!'8&rrW3"
+rq??lrq??lrr)j)i.)pM!)N+`s8N&tqu6Zqqu6ZqdJn^~>
+jSoJ3!!!$"!Dr:arr`9#rr2fp"+bqe+T29?Z2O\,mf<CgJH,WArr`9#rdjtI!3lD$#7gh8!&4HQ
+rqZQp^bG`f!J'\=rrdiP!<>FbrrE&lrs-mN!!*'";"4Ja#6+Z&rr<#trVltMImG4U!!'8&rrW3"
+rq??lrq??lrr)j)i.)pM!)N+`s8N&tqu6Zqqu6ZqdJn^~>
+kPk_bs8N&U;>gJ!+2RqqYe\$Q^]M8J0`:tO!W<!!;"4G`"Mb!;!J'kC!<2rs!UgU!!!*,Yr;QbI
+rW!!#5i;S@"oeQ%n8LYl!!kjIs8W)us*t.L!!(@9rsI[[!<<-#+Me"qZ2VNC^VIW]0)u%L!!?'e
+rr2Ee!<)fp!<2or#2gX)!<<^nq>UQrs8W)trr`9#s8Mus!<1LJJ,~>
+kPk_bs8N&U;>gJ!+2RqqYe\$Q^]M8J0`:tO!W<!!;"4G`"Mb!;!J'kC!<2rs!UgU!!!*,Yr;QbI
+rW!!#5i;S@"oeQ%n8LYl!!kjIs8W)us*t.L!!(@9rsI[[!<<-#+Me"qZ2VNC^VIW]0)u%L!!?'e
+rr2Ee!<)fp!<2or#2gX)!<<^nq>UQrs8W)trr`9#s8Mus!<1LJJ,~>
+kPk_bs8N&U;>gJ!+2RqqYe\$Q^]M8J0`:tO!W<!!;"4G`"Mb!;!J'kC!<2rs!UgU!!!*,Yr;QbI
+rW!!#5i;S@"oeQ%n8LYl!!kjIs8W)us*t.L!!(@9rsI[[!<<-#+Me"qZ2VNC^VIW]0)u%L!!?'e
+rr2Ee!<)fp!<2or#2gX)!<<^nq>UQrs8W)trr`9#s8Mus!<1LJJ,~>
+ir9)K0EM+P!"nl(s$-[:Ye]`(rrfM+!<Ah_rrN+\r;ZoGs8N#t(#U27!<<*2J?[D9^i1@q!!-KC
+rr;usrrN+[rW!'4dJj1Fq>UHorr3'!n1ab?!"eo*#QXo+5<sb(_!q.!!<2He#QFc'rr<#td/F"F
+61b*Zrr;utrqucrrquctrr;uPs*t~>
+ir9)K0EM+P!"nl(s$-[:Ye]`(rrfM+!<Ah_rrN+\r;ZoGs8N#t(#U27!<<*2J?[D9^i1@q!!-KC
+rr;usrrN+[rW!'4dJj1Fq>UHorr3'!n1ab?!"eo*#QXo+5<sb(_!q.!!<2He#QFc'rr<#td/F"F
+61b*Zrr;utrqucrrquctrr;uPs*t~>
+ir9)K0EM+P!"nl(s$-[:Ye]`(rrfM+!<Ah_rrN+\r;ZoGs8N#t(#U27!<<*2J?[D9^i1@q!!-KC
+rr;usrrN+[rW!'4dJj1Fq>UHorr3'!n1ab?!"eo*#QXo+5<sb(_!q.!!<2He#QFc'rr<#td/F"F
+61b*Zrr;utrqucrrquctrr;uPs*t~>
+k5PM^s8N#t!h_4Jqu?]trW!*U?\#r-nGW@erqcWtrh'dPi:HsKrr)j&rkL2uT`4ukrr2ounLsb>
+!!2ut"<cY&s8Mus$3'sD!!#:1s8W)srrE&trrE&prrJcHq#C^%!&.f1^qfI>rr2otrq??nrr;uf
+rs8W(rr<#ti5!_3rrE&mrrE&prrE&Ps*t~>
+k5PM^s8N#t!h_4Jqu?]trW!*U?\#r-nGW@erqcWtrh'dPi:HsKrr)j&rkL2uT`4ukrr2ounLsb>
+!!2ut"<cY&s8Mus$3'sD!!#:1s8W)srrE&trrE&prrJcHq#C^%!&.f1^qfI>rr2otrq??nrr;uf
+rs8W(rr<#ti5!_3rrE&mrrE&prrE&Ps*t~>
+k5PM^s8N#t!h_4Jqu?]trW!*U?\#r-nGW@erqcWtrh'dPi:HsKrr)j&rkL2uT`4ukrr2ounLsb>
+!!2ut"<cY&s8Mus$3'sD!!#:1s8W)srrE&trrE&prrJcHq#C^%!&.f1^qfI>rr2otrq??nrr;uf
+rs8W(rr<#ti5!_3rrE&mrrE&prrE&Ps*t~>
+jo5G^s8W)trrN,HrkJW_hn\aZrrE&srrE&srrE&ss8VTXrrW3"rr2otd/O%Frr2p#rr<#g;#((m
+5X3'`rrE&prro&m_#OH6o`"pjqYpQBrkJ`bi5+p_s8MTh!<2fo!<2Ng!<2or!<2Ed!<2Ti!<1aQ
+J,~>
+jo5G^s8W)trrN,HrkJW_hn\aZrrE&srrE&srrE&ss8VTXrrW3"rr2otd/O%Frr2p#rr<#g;#((m
+5X3'`rrE&prro&m_#OH6o`"pjqYpQBrkJ`bi5+p_s8MTh!<2fo!<2Ng!<2or!<2Ed!<2Ti!<1aQ
+J,~>
+jo5G^s8W)trrN,HrkJW_hn\aZrrE&srrE&srrE&ss8VTXrrW3"rr2otd/O%Frr2p#rr<#g;#((m
+5X3'`rrE&prro&m_#OH6o`"pjqYpQBrkJ`bi5+p_s8MTh!<2fo!<2Ng!<2or!<2Ed!<2Ti!<1aQ
+J,~>
+U&P,lrr3<(s3P^M?U8(]^OcF7s*t~>
+U&P,lrr3<(s3P^M?U8(]^OcF7s*t~>
+U&P,lrr3<(s3P^M?U8(]^OcF7s*t~>
+Qi@'brr2usJcF:#J,~>
+Qi@'brr2usJcF:#J,~>
+Qi@'brr2usJcF:#J,~>
+P5bO]JcF=$J,~>
+P5bO]JcF=$J,~>
+P5bO]JcF=$J,~>
+U&P,lrVm$"s8W)trr2utJcF7"J,~>
+U&P,lrVm$"s8W)trr2utJcF7"J,~>
+U&P,lrVm$"s8W)trr2utJcF7"J,~>
+T`5#kr;QcrJcF$qJ,~>
+T`5#kr;QcrJcF$qJ,~>
+T`5#kr;QcrJcF$qJ,~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+Rf<BeJcF$qJ,~>
+Rf<BeJcF$qJ,~>
+Rf<BeJcF$qJ,~>
+R/[0cJcF*sJ,~>
+R/[0cJcF*sJ,~>
+R/[0cJcF*sJ,~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+JcC<$k5Tr~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/doc/newlogo.jpg b/doc/newlogo.jpg
new file mode 100644 (file)
index 0000000..6c44372
Binary files /dev/null and b/doc/newlogo.jpg differ
diff --git a/doc/oldlogo.eps b/doc/oldlogo.eps
new file mode 100644 (file)
index 0000000..0ee5b3a
--- /dev/null
@@ -0,0 +1,319 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: jpeg2ps V1.8 by Thomas Merz
+%%Title: gnugo.jpg
+%%CreationDate: Thu May 25 23:30:57 2000
+%%BoundingBox: 20 20 575 481
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+%%EndProlog
+%%Page: 1 1
+/languagelevel where {pop languagelevel 2 lt}{true} ifelse {
+  (JPEG file 'gnugo.jpg' needs PostScript Level 2!\n) dup print flush
+  /Helvetica findfont 20 scalefont setfont 100 100 moveto show showpage stop
+} if
+save
+/RawData currentfile /ASCII85Decode filter def
+/Data RawData << >> /DCTDecode filter def
+20 20 translate
+555.00 460.29 scale
+/DeviceGray setcolorspace
+{ << /ImageType 1
+     /Width 293
+     /Height 243
+     /ImageMatrix [ 293 0 0 -243 0 243 ]
+     /DataSource Data
+     /BitsPerComponent 8
+     /Decode [0 1]
+  >> image
+  Data closefile
+  RawData flushfile
+  showpage
+  restore
+} exec
+s4IA0!"_al8O`[\!<<*#!!*'"s4[N@!"&r9#mUYA#m^hF$OR:Q)%[;g%M'Tr(D7T
+2+=8BZ+<r'Y/NGL5.Q/e$,;MYB2EO&e5X6YM7S?068i]+$4o`:t$O?b(!@7aI&HM
+jL!#tt>!!36'!<E0#zz"U4u0":"u6s24n=&-)_5!s8Q."9J]0%1EUE!!*-'"98T;
+"qi(6#88:I;.1.oEIeje,=5;%(,KE?Jeo[Y2a^MbP-M=!dGY?hATi]ZPG4hZ_8I]
+X7RpEX<b?Gr_Z/<i#QXr+!'^JWC/U:m.8!L&V(##n^YZ^*[Ouma8s[@;Xm_%u\[2
+C#U(j;_1$)RqeuH,mgN$l[*t#g^,7Y8*CRfXt$-,i<Hs_"Me+2M&jeCib95lZ(Ob
+7BUE.W8(b62bjalA"P9J'#DKt,R!;N_>QLa=>B*-#2^8lCnM.8!L&V(##7Pbfg$k
+B9gJA2M3-[YJ21BsOrW]F:;?V]OA'WUA6:Q>&.Wp<c$CgFg"$4l(de%%e_=#<8ia
+AjtTM'I)\2ra\>7SJe_p2lFO"Vfm=+4b"rbp3=O>X1L.[p0I)2:8OaN.CGj_GrpY
+8)i5k*-TT1foeT4iBJ]'r+i0L&lY9=qqk0#XP`h\mjGh=&q*dj.Vl&coM`E>ub%.
+lG6Z/e/:.B1kE,/oPL;&fM!6a:"!&2qB;/%oORI0<'.+&<2"$-KC6CAs6g&U&VOE
+6Gr<F_/<LT&4U\Q`+BYl2Y*\6u+e*X+#76kN>Kh*feMpb@rLo&ibe[2LP@AU#(jM
+*2KD1L-p0Ig(1SB[dU3),ka,/$6A=0^=5b6Eg_s,D&&Sngfo&p5*S6PF8m?PAkZq
+gXtdjdmufc$\cHfD+MuKp#=RE6Sfs\pocUQ.iD!>W$s4j"Egko]tlUr7(MVtD^Hu
+,F\T?)b"?q%BA0jPriWPAF;<LW[dq5hVN+R6#J*\oI/6h0.8!L&V(##7Pbfg$iOI
+-Q$rZCFjNVoA=_DDGO4?W!<UD#[PH8.t%E54'V5MiX`+<g4p'Bq!^(0VorrB4%p,
+L1AS[D,"/%dSi0t0Vlk<$YJ!L&e?HDP,CIU9GIV'/*U!=+2eR&Za2EQB_:[,_%qb
+;>3;PnH]a0.LMqbi9q.Rqg\WHcDI/[:Is:B2Cg,^+GZ+Ph*Y1:F?;o;*j5+&i7fr
+13q]Koi9$2];<7._]iB[d)3/!P$=$LW"K+NI)!Fhl!=/UoXCT5Oi)2\H;%BXBsnm
+XMGhro&!S&S77u=3`OWj"kiA_P&2KNHUk+*6P'VO,cPk6Xkt][nXMT74_<KC>P)/
+1D=HVAu1&2kST%U5%?pA>lmQK^rct;/s/Obc1'=W3o-O64L3<1,2iha7P#48FtXe
+HG$db:4ZYEm8c*L%9"9)Xim_*(?.7)jXYQi59K/IiqDXHD"o0q@2a<'I"r:Hut)<
+D#Rj&s*)75[[Zap8t;%0G1-uH^/fe'K-MbN&J'XT,16pG5V`JV1R"CK#J)L`X3oq
+QM1OBEj=V*h"19?h!;*-=(paJ@CRF7*[#K<,Y%5?D->cuS1Ajl#8ue%<R%8sBcZ2
+2(P0(An.2*@ALU5LPbfg$;O"7_%pE<4V321`^klYk7U?C';p0/q8QHI!6;irecTH
+O629a*UNnPa&*jr8rZp%74-+"I*=n<la*BmcZ[Vb$Vc0:d!Ve/Ab_*V><ZQ6uL"q
+SlQOuW[NY"!St35o_$:<+^C@>B'6+LuL!5+,)\"[u#(._m'M$!6apX``>Z:t%@-:
+mU4k4?!n8h_=o8XXYQW!VuQ`c#;(V5C(a[)u?9n&fZteM%iKP6Jb$C[4/tFck<u=
+5$jYX>t.Ai^m/jPf#B%\+b:dH.4Y\LG(MmCW[oRfA+pPfBneo'%CCYI#rs@8hR[E
+'Y$6PbQRJ^npl*@U85X*^"XbGR*#dEAdg"V!cU!7'40S&?<nh"2b]LrIC'kH&NGI
+$AY86H#c9%42;t$q+Kf%acgdVWlfAAH%Y9LHq8q5Y-3SW3r]A/_qAF3$FC/CF5YC
+h>[+%l1[h:b#Ld3dm)re``DYRV#jjH8_!i-UoJYXVZ]dVm@Aa@fGQmjHG,IjuI8"
+H7X-[3,uT.t^XkOWJY1RFg(H/E,bM[c<?,VA,0teX(F^U_65Zq.?e[aN_jAM=8;j
+>:rO/K(B7M.rRP%8!S6qPbfg$;O""Z[5IqPTho0%US:cBio6GbbDRf9G)WP<5I-F
+43V98<)BS,@ad^oOQ;VX[Vd`Z]Vr9ruPrIM-*N.Df4V(@=@2b$DICdMKm6&>[.Op
+sM)cB_h7dYmZ+SFoo7d5&_cHahHFJ_?WfMkc<$PHmHOGnhAVrTsMJ_%27q^'\bIE
+H:KmEZI;_H+Hm3YW-(O.[4HUodRsFr%3dk;P@i-+4mf$5MBXPUIOB3di_\VAs_N&
+lfs8p_XL,`o'!9f"*;&;PWZH=E\q$<;?i/Pc,iBA<e5^U^g@"TW"6hT'87$aLYF9
+,:F5^8TC%trZP<l4BBXKY)b?rMgWT%m?=(G]5D+_;X#2g(,D-s]i_7+O1SQQh]XT
+mdOS4j/"M\/oAi4&&%Lbs=OB$]AOh$a99`p7.>1B^lf`1l8kN-Y!W,ku;l];fF_k
+nJ0&7l3@GW#R6]!ggZR93]%br*bl7nn^=''&g)m\Dc4%`^Ee&#/^[cK5RTRm[qB5
+[n,*amL+XOU1TD6c!CWGYu#VO<K`%fVmGS>9X4,H"dh)!YjV*&t&aWLj86/](_+0
+<"t6e3N4s3E@UrPbfg$;O"".c1Q5'Bs-"Yp!S2D7CGlY_^\O_/R+&]5(ge6I0&u@
+r4%_[N4'uZHYXHr2\6Zd&%-]F][L`^L8/Lc.3:Shn5bj?*L;:S,n!c0]+P<JPn1<
+N^oJ4)9h<csm4tT\Enk-3\\u@(V;U?`glD#KDs<5X<KW$!b:#]$D*gK*,t@rFP'J
+prPbfg+=8V',4)7gK-rYs*2Ua7U/iqrN64uFU79FZLmE6;o6RCEpFafDq9$DNjri
+7J1$k<WUT=nCW[%r5K!*-m%4arY<I^6;0ZonIWM@,+#hG;AEK9WK%KH=ou9ASL;>
+4FI!7EQR(1t3!8FZ^:$P+dR?@OcD_V.-I,l-Z?ih="B8Y1t@!8kS,,,K*QOT*pOu
+!9^'%60X8`m/I&\Ht0'VhUULj-5E%kPf6GAYU&cF"!%+VH_"H8>iS&IFN(59mkjN
+u\LolJ.HfDW&9'P*.Qaq+6dY<k>AX&OH$2GQ[X:KMYZY4cP^r<qiBu)XC1`^,.8!
+L&Xp_)K/XG,gl\k">.k)rOc^'('8N6dO%RHB6>^8oQ_LC6J-jb^YkQmENJc7Y.a;
+f`%F.Cg>/Vg\b2\Y]U2_,=39c^;fE-Nr?"+fDN%r@b8jD?\6D:1;Z;I#>Akbl(S&
+j&Olm(*"(&k^Y9M<W>$Br*7N;O((/Z`5m`e&LE`Z5#ieOl:ITiPgjSOl7ABO]/`i
+]R'gYl12u]gI$W:ASrpcPU(OQPDZMIoKsF.DbJX),%]2I.UM+*L6KbaB`>0^e;eU
+A9k>+m6)@Z<hd\/%BLdcgKLD*HC]h_*Nhk^8Om11qf^M>\EPH2!S/Du<'&9oWcru
+Zbcn?7b=T)6JNtjSXproQ=A2NWj76r5V6YS"p3'm@Ar=XEUXXQkA4kEJ6YGJLEN*
+Pf%(ZA4^=0d??+m`sC(*ka1`ss)6.>JhrBNjH)Q:#@=.F"kAa36HBo?Y*GlEB.lA
+OW5hS7VERmSoZsM#gM<`sH&Y$68*lkKq<&mr7q7WLJPEPqqS!<Pk5%l@f`p$Bq;8
+8lCnUCKaq6;TMH1.OleG!S!<4>AHa9>K\t)-"B\ShBq+sJj(d9n6];rOE(spp!,Q
+%
+rCTtPV(##eei-[4<[&]g-@FEB%N^,6\9<Mu)->P(XO`39.n"/X,Qt@i!@dd7.R)q
+SrCp<s</kChpH$US*K!Ee$6pa"O>c9o-Iol/Sj(bP<#*kO=Dnib10qEl@MBNE%'<
+48OjNM^"T?SYB1,p-QQB,$3cjiA]p2?[j5HgFecAC_C<9)aW#M&2e!?6.B&;Gh9q
+3fB3YpZIfUT#:<*K/k[]B_,g@*La']dQ!DHUK\1.ncqqGj-C3^(akH'$kna*AWYE
+?Ke)I_:R%-p^a15Uo;a;&LV1'sadIq!R@HZauaXd[Yk3A+>A7N\UP6`#oPI*:ELA
+-QJScZL`+3[j!niEL0K;gPAm.UlgaZ4KElZ8lCnR7\t7p=+3o-K&YO@a@l8_cq)&
+ePct\c0<+3VY9L+X7rBOWAV;A,>"D"tTO8oc?iU@KV(##7Pbh;qBR9[YYHBf%5GY
+dB0co&EV[+n(3.4s$;G)-/Eb]es?&an=go_cq/i7^Q)i"TAn:UC7"ak$26*TU3IB
+coC=_)`P&ousmB.)4tR[C:4XXtZp`?cXPW8LWBqS,cZ[5RFKeqJa.P:aG"mP@bC\
+qc\HN@ZZhU_Kp6&>4=\7p=YEf-O5f3Br5,*E,jegke+F>J3co^6Rm-l2=6@PqQ&"
+p@Tobms(#7gpJ/rjHQsCOE'`ZeC6S1Rnq@A\Je(/LV6kq'#Z[q+\Fg];iR!"qpjQ
+'g'OM(U>S>T._AA*+<D)SofsdLA09+!<39q.>sV*2'SQSq8B;qH"B>f`2'&5p7\?
+1,-HU4VFfG<,9QI::d`FT\a,[iY4`T[BV(##:?WpdtgEB%qg-A['ki%R2D;cOOE;
+ona.Hf%#N+TZnY*ap=/Ag9NCN(#T*I6P1`L`mcgAlXOG*JgP9#XlnCO61err<5mk
+!Z9md)9M;$5i)jfN(3/aM-+[]2*WG:QUo-@8J3Oq/!74Flg9TETf,0o/<tPUV!rt
+[6t,:8dG3nY=(2dd<:fJ>aXc=ieQhO_7`A1;5jrBWJfT,?+NiYR8"IH7o>k2H\9R
+DKRV;m,qR*)VPZ3&#neOBqeisb<@&o@I[/QD#,%<n='\_q8N8l`\he0!5/&=sW;^
+8#A>?KsH]&\5N%(n3Jsis10hEVc.T3^I[<G!QBK4AiQr<9%YkA0Y1mZVIB9#dm:Z
+YGM(A'PfpMC2n`EFlufi>:g9esV=Eg5^3meKW6\Ap^S'fg-_Q8rnVk=pqSR`^lML
+el)fHIJiQ;F'N]7g'<OF\#[n?'=uge\:+^YOe.BPWU\PoP26t5*[p#g9*P0>#+A=
+_'Hqn7oo%=J<@Gggg_Sn>-4-8;kTl@kGWUAg6k_e)!AL<-PXsoj]_;!VCKqsGXb<
+^9"@+E]M$SbibEe(W;FQ./b[R=gGp4J83oS_)$d*:oH<bu!hj^1i`);.m.XLt]NN
+f1a]F\*3A%g*Pb*;LqUMU1V(3X&V.g&0,h,mI>3H/OZNeuVpQQ?)A,4=FN"K-+;O
+"".($0b&<Qira9p8AmE&.?Om8#BZH;^"0>R1I@YB?FXd]HPu%b7h$3rR@_,""dF+
+f@LEJ3`<:D[?F>K:92GW=f.1'(#Q)Na]J<dn!Um.PaWW6NiYc[/RW;4\$V%QA;Y#
+[+OSfSO%0d%m]aNBjYtc$6POP5HRk-RcUS?(2d1Vrr<ua>J:k.Iq_Ls3V3XDc_7P
+>HTm'6`6$N7j^4j[K`t(G9.2d9fZJRa+&6Rk#1We/hTL9`Yu#`"_^RkL_R3!1Xm;
+KH,rZR\TIKZP`!%Q+^a`-W2\)FeeK-LY&lB[8fh.K.UnJqSW:E_*F\ZQ&SPaa`<r
+8jpnR9LT7=SbXoQLWDM/?r,Jhion[o$Cl?F/q/=5c2tirIuqa`]=dgPKN5EM\bP>
+Or)MGiQ!UV/7-.A\R6]LK#]ScR0<;"RTgZOjb@CF.Q8)E(+j5l-3Ps,=]Om`QOXE
+.WUZDlZg55=XrVLXDJ(8?V9b<(k0RJcJJ2_Upa]^N\K>Wc?&7+V,_..!Iun^bpc8
+]CF+H8YEmF<N!>Y6"*)AOG89(<oN-[c-T-"IdZgc8BG7"U^meR4Pg@"RQn04i?sh
+3cNc5TBT.VU>fl)pc[`3k,@>M%^U^j:&H2F3pm%l.';Q(M_>c!9I:KZ3lgWRmN_l
+A`UpBanHJp?1^Vl/7Mp.[Vce#YOb[Q$V0+M@!h<9&`S<25u`!0aNY;O"21XdGMT=
+L-[)_j>e",tW7A;W;)ld(6m^p)[kuTq8Pmj&dk[XcQJhLr]lu(b7db53/6+F&H!O
+J%inNf$B;G]gStS[*(feIDbWL"3cs62HtP%p>oX=$d&<8oFgUQDBgBfdSHP-5%g=
+NJTc`iBl7-e8!\nTeWsGIg8nol*=oPdRqu[hOsdWX9UR>%?<C(pK`&A$1,DpW<J&
+m6h`PY0O:X#\W=Q:kV6d^*;=;4INQ!,m3U9od.niYklZV$X-<?+tTZUK%ZG4;Kk`
+QX-8Sqd(4qm'7c,.S1\*;P&LMDhoYZ>"*$7\s'HBfo>T?a.`c1eSh?eLfi((1CFo
+9/;@7"7'2+4@3,.8!YmkY0c>8;/I0O!UVXicB]LTn5)m-EI*;b^"MVgF"PPFe.VZ
+Ga+GH"<R]"Gp&l#5':V:.ht^1^Yo];ZDM1`K4'WT@7-9YpHVX+Pn-8k,^\(mPbfg
+2Wc\29SO#7o4XW8!A?R=bk.GA`d,:"3'qU9Jk"eV4C=NgAg+B&Ugd]qOn8HHXguW
+QfjXF>8lD4^,3Bsreoh&,pp@WX\T8?:&rOl%/c'K-4YS)^u>A</.HLR(rk!oZQF_
+QbfQIT`hT#l<i5!/MNfPUq"?W'qin<.jbf#KYs+'cpL;VEsfUJ-W.UaeE%JV2"&8
+dQX:cq`0$@Tm6g$GtZd.R^6;;TaDaKOA]sEQ**)FECV@O`I!:7F(=cO=!Rs3sk_p
+[!\eo:G+G,hUHUa<u7OoW/XC]eZqU+f8/gpbphDie3(bgj.9uegC@]i6'1)2MUhD
+;67'.j,n]</:eAfnP#CKhF.@21Ng>%jr`-[S>CE[2WUo3QU`c`qdqBb$V=XKm9h!
+_eQE0?*Sh-8Qc%7SU+YP3f9;.ZhR*S)5<QOhjU=j$\5Ds3SXNPq4r,V-1A/1r<eV
+'5\cg)`ZUiXR`+^Z!Z?%)VSD82t2bd^m,W,B,oX_`.@!&kHg'ER.Q,`[,M#*?/OA
+(/Z,.=:3g<?bq@a]n'mQ?2`Zlmd1CV(#@_ba3FdC%g5^?sC#=9PM"QW;"@:/L[7A
+cZk$5#-ZOQ6gC_ne%/lGF?=\:A?!8[K!W;pqP\u>W:%tgbF2'p8%6W68XNPfA/<_
+*.7EZGJ!(F.eS1j/9$mKjUIT=uh*Wa%P,B:&#tb18,a22N+.LtgW\*XmUla^pJsW
+WE:F#Ze'>a9"a-k]8g!-5f<,:ck[YoEnG'V)2fG"*$-X[eOB]g6,X%M?jEbeSfdL
+;F<VV?/0.8$gD#M3XlW`#+C.]I4`!:5Y+G+RU#nVKh)`33lJ%K;X@&$?NMhQ=<'^
+u/7.]ratmkuiK?,a,Ie?2.rq3Z0G=E1h[2_Q'WmSlVhp`7)9ua.gN\$'=Y8lO>\d
+8]jZT!@3gf*1h5kC?)1uoR/Z6pf<u0;l`snj?@Un=,^\eEI]OLFGh@'g-bSriukY
+;Ybim9;$pj@o#Sk^jCA.r-S%MfA6WNI_V^D0)N0aG#U@)WMBo/hrjGBY#H`(H3N6
+fp,5GbLauW9451Fd)Ne"*]iWmtb79=Uhf=nneet0/3L2W$Z)FMBqYf*>M3ugi..6
+b6EETenHVruk'&=dq4B2tfo<o32a6_Qjh0Ic8Y2)@j&PcFGg[i<&;]>R2<pYj;tK
+Q*Zm@;,i3O=E`CE>NsJ^>lFBio@KHguiS9K9*HU6Bt<ta5`_p=HTk<M-QNKm&Y0m
+G/$T+rQ2*oAsB,AQ)ioB<,)eQQrDXl&8i9ge"!r%'TduY*WhR%^P=#8m'bXX+f8)
+%
+RR0=Pg->s0)up!'>H(5Q:$&3dB.V2>BR)=2/Iikf`0D%,H\7:UC/U;"0YUcSlc8J
+&W3829MenWFm`T+OmaC)/LDe1YjHSV2j7S28=L=[2JZ*-0dMd-heftJVA$$\JQ&G
+mC5.ah82/T1!ZW6a!R,+H+#Y<2*F+M6ph)Lt?kuC[SV.Psg.8%QY4#AP0drK:VQ)
+QZgN0l]WeU(ON#P)!pWo6RJbp]4<jfUCq34<"^R+fCTG8;)>rr>G/cE7k]m\A>kr
+AsOIh*^cd0*5:-%3=c[%pbs'i:Z_%c75q8[?[ogc*H<+,Y(eO'S[n[pGq;GYQ=TZ
+e[@ZJYY(4;Xk]C6LCOmMa\tVucu0"D4&gVIE`Lk"C?Lg^Ud\KAOAq;q&>sOQ4L/_
+n8lD\CQ%+SSI5Q'u3.rbSQM3Z.T^m,nrr>d#IW]A$.\WM5o$aOK\@&:kDc04X;Tc
+<!E.NuFUlV/`*SN-3Lh!oAJ<o/"R[2F&S3c0;B\n-#o&oC<H@Jr<S#@Z;02NX>-R
+Ea+Zr37F#u9CnOqsjWc8q#[X)2=P<Gbkj]3WTUh&[%M4F(^RpHhF\[c;*t<Tp!i*
+;^)LJejG6b"j.4f"S+U;O"",<;eMI26Z\;>SOC^M#%AIQIgrlC&QS$V,V8o4tj:f
+;r/!m7u&+kk`mH3+5X$,<#2OJ]482o:sbK_-+o%qOKXpF/Dt0nEhi9,A[>"RC@-/
++"n]sN>Dcn!EKI@CO#hq1*EY>\Zn)?XOhhdanX<*<hI9\o&=o2Q3@]Ho;UVJt+ZT
+lTJu(&6,7%()aiCU.(V?3l?+h8P=Q"WKFF1Mm`%,qR8Kf,6<LoggiCQ.OS5eX8</
+XK%G+"TRH)N='r!-9(X\mYK!`eZ?P+;AX\2uH4<9C6HJs,Nt80EpX(d.fuN,&#X;
+Q?2!fU$qIb<u`.;0kPsLl<M,(VA7YoDk&%b!>f8VQ?,-0D9(G)!*h$D(@$i$#N'3
+;LQC@Uh^]7ZGP-Q5/>FNMbFMr&_p2TfpZ&hBi<*_Pc[#gcQdR&lRbbMPa3FVBY.G
+"X%T(@9QDf)+V!f`+/2Ya:Td6lX]5_bHS`(RO*:<*=c@gh;\">33#78CW/QjtPCR
+nWSRm)V8%Mp+QM4AkbF<E!\LjI6iDX,*m3t.!62?QDpXO$3n94-KU:mG]+VX3CoG
++h^CQ>N7XgKa-M'QT((uqUh&jIC`&gO,>cMK5!PU6:ZRsQIi.8\))g_j38]<Xmgl
+INAcLSgoJm/2-I1rG5kBP=c,,Q^4[,iaoldVPXAOL$d&m7\ilalh_"0hP?.V(#$9
+1B.>qg@V>biA)sD]YAKBP`UA@<OS/fdm/C^NG<rFWYU*J33/$>DQ%GCBKCFJel%f
+D99@SG?nK^PUSj[r[FCX]Yu*-$fZ@*,QNiQ+cSg(<JeG/,g]G(c.^>YJ(A=P1/kL
+`LPPC'`gNh9)3O-='EdA@kU4%)grMC?#B:"/m)oC?%&<I2E_R+u(Ilea;F2LA#[3
+gffh!AlAPY$6Bpsed^8b_^*rTfNL`Z.I1QR0lCR;d=B@&kd2UnA.nnQ5QfM,K^p(
+"kA!D2&u596FtM.3>:RVAZipI^$a;mM:-L+MB5B(8%#YQG7":0M9"LN]F*41l[)E
+\\!2hR&Q%l$:8oHV-ZdLH/7qZeP>oEnY(rn<g/(3R!0"CpIu.hiT+qIOPa?%7iZ.
+YneeE%LK@W$)o\:_Ydl2o00$h3;WDIT9$`ka#OUhU8m"DZV%eR_8L33o3g3ff0@m
+2)MFG,>$=_F=;]\7F+FAWS^S(;(2qN40frXq+Q%h(%@JJ,*FFo*0<o>mMP`19t);
+KJtBBrL4&bWl/[`XLb6b0SQ;V?2HV:EM(B]u+<?pPoffDLb3kdm5/I!4Hqbnb;`_
+e`SC%SB@NE<(['&A<WY'k!s.ooWRk@bE2d1,S[d0(0,[L)Y2I+3AA73;Nucp4]P!
+H@nRHD6QW4b&tP=2UlF).X=*T(8@\r]F5qU*e'C=&EBK)2C#X16S5.AO$E[H\(3!
+2V(##7WLs(Ua8Z-WrrD1rk=V`<Z(60A<T[VD5:-P<.L/pTS\%@P-J[l']3EnE6?u
+od<\U="cXMY7rKU0*<Bg]T,'')+0<`5tB5IP9GBB'$*Q_&?@Sl#GH$\L.5G1B#NM
+rClL0VI9EMX:%:_Wpp9u0gK.eOHP>gn(G`=4D,#"i6#85.,b^aTMO&]btJZ]8cr9
+#l)qMW:Wfc'G852beZ@92,QgNPF\P*IPu3h$"OlRM*]-OHa[:du(r\8s0K.o;`<g
+h_,AE6Z'iFZYhEWi+]W02n89#Weo[`ohhYYg1#4(>?;hU[[cd9hF=lZEufno=8hY
+sB9U@`*#c=fBjNNp*-U,epQ1XelIF;7-,pK`n$)R?24Se45UAY>nu7UUELhF)[l%
+MlM]K3&*E4F_4HrI*l;NhXB7LIS"-]<k6X=C&=jbYF6F5F7R0>"+$5j9f-+jtcW?
+</pKa`AZ5>0+bWU;g)"fc[/BqQ>;='\FaY+rX%'X&)Ug>M79Ohe"KXY4O<pd#rWk
+uHa-):7E(YB&AbM:drO,Ro87k1'u9/,0t^ggR"d!pf?\V(<%Xh]]CDFXp&I'tIj*
+l,QK@g?ja-lL[E*.URST`r''2hc+eH+V(1SpSA!-D$j,:<SlQ/XL=H_pA7NSmsoS
+oL.?O8?Pd$a]AR-FC8Qg2$#2tRA-U)!;kBJ`S9n=;.8!L&V(#BfJ*FR/?btXtc!9
+L54YegrFc*kC73@^"X(=WTFX/Oub@XZ%m"`\VBT/adkLKGY8G>61a#-/8VKI!o;f
+TED[+jMDD@N9G\GSToKReT,#299DiCG"@i,d0M'fUHI2]g^dcrO^0[\Y5FjhO@H7
+7#+S,_!&KEL^F%*gO0L;7.I?NM`@(g+:fqM)3T6!,ZN:df=J74s^VIJ2fD6YN.ai
+MRbSbYj@4&&=PjDgp^6%+6R;(;m<"(!YZ.*Ua;DqV5,Kd.0'DE=%+Q1;S:k/]&]D
+jHOV:uVfhJAiP[CC(a3c2mTR0RQ%^^jSk$If6-tai\@K2@U?-Q[j)6o[NA@:O$<e
+H:H39e/cdK:GKlL@'/Gpp@Hpm;'D=LcM)qNpiSG<.?Ed6W9[BHon(A):m(?fXsLk
+OX,EKkG.%qLrZT^k3lZ!=l[>^\E./6\$K95/h#_^4K)[(N@f-cdH&anjRG<gmH@E
+9(VqPCG'559We1U"p@9`?a@j"To"bf*iU.\oV.kfO'J_IDSl.]/i<0,t_jH'Vm+u
+42se%9mSs3PbhuVV(3:L<BPbKFoMH\o`"pJ%9t>^/N8fq22XZgpX'N,YVT>6e6-V
+!QW/X);@6=-OcU)[CMe@HgPhFDlO2Jj?(-ONZeNr[PUd%W+7bJ1kL-JY@noA=G"/
+TQ$C$2lWD5)cS6=p<A*cC0$B*E5<5!@KTf<[`Tuf)+Kat/#YT$Zn'pD\`;O""-]+
+H37U>6WG;/D,^Y$?AS!9$r[5jCg"o2P*8KkcPCR]9"q9K&&Dg!I*f6YD+dK@$fpl
+/<]ZY3Y51O)^PVV7&^m(R-!Mkj>12k6#LV4?,;@I0\2p*jk3:[IVPeUUSu'_dRQn
+d\8e)]2Zq7!h3Pb-`G,_H,Ahs0"%=J?oN(^$<n;/),n!;>Z.,]&29iTFMU*,"4'*
+f<47d<_Y"6g0Qa,6.T['r8MZ%9PIVt?Z(1gEGY^V+l]pnqBMoL!=rMO5,=<u$c_:
+VCI_qfqHFclWnCU&HBhA7KUmGHc16]aC[%[,p7G*eQ/uia@f*==Yd4'M(C<&`9Xf
+-14f%+HjX9F@7#4E!g"2.oPPam%J@1N80X6W]-NBqHr"f;um]\i7agduAFcQ=nWK
+b(=@;O"",8lDYqrnOZ+q?6fuhA')f<DQ?h!5JJDrY?mX!ER?@]VR%E/N7r.-mcC7
+d4`//*!E%MCh2_^8Zu-oL8n=jCCM_7EFBFjqs^1X1PIl@Zfj=m)>C1c.8#9(hB'+
+3X\k>t.M]d8@8DK!2YIK>#kU)XhPTO;Z+_l)h_%cF[Ubp+KpP$FHiF*%;At7b4f>
+3uG%5KSr+?oBLD0en.S0X$OmAUQ<C+%dM*Be7.i`m^\nn>3Tqj.qjb1#+;OhW"H=
+n*%l\`*Yf!9HC?8HDV^8(p[3heU@Tih,7LH53^?SOE3W0[YA[58TPUcP0)o%I5O=
+XqHWZ9/KPi@=KkY)->n,@n,sAc&QfmFrLB%/[P^5ERhJrLUR%@W]V,;9/DH!=Ma(
+!",lY`Caq2"emTPGJZiuGsP)CpAs]Q-hc,=BC9PEmVigj7!:oMQBtfo\W)iI7=;#
+'Ga%EA[E3p,>j_eO?s[*F.A`uS?q0T_i&Cgairic_p&)Da:PEJ%,(-8]\KDN?=\e
+Y(&ind4j#*^uAqr5Q)/PT@A,>%TC/WkXQmc-c:&VT*L@,lD(i2fY='.k0V%b+OI[
+KUbrr?$q)P"4m/bbL5i1qYo2uIG@n@I$>=q?H;l7,8fV(#DFL3m'fI4VK2qe%D/8
+ucU!ST1`34Pu$gab83IPc>4iK%6ISG*@&?F%p!\D7QYLPsfj+M-_pR8DDH9-jnX=
+^"r&%:moL-V7(<[='K8WEuDt;C_BJQGu!cgo3&]k4YM;;,1Z23mj`8Z]`L#<HdU/
+<\0l/)3@#O&Zg&L4OcHC:\Sj[[f9i\5Hpjq'`cCD17iP>aJjrL,X51MO%dOibD=X
+*Z_&P&'Kb*!CDc_a@Ib*o'jRHh473QPmAU)uq*$f0r'j[#P\`uV\(78^q!%DVcm]
+rO>1`G]<97n`BbE'>(lMWn`f,Z_gHKT7>.Eh'IK&imR2M+qjPbBN.,Rj5(/(3ZZ(
+O\5Z^UkB<K+9KsKggb9H,c).^i%#N60At''=3ZG$0AbSQ926""\(hCrrCrr<DuZG
+/T8Z(GHJ*>@i4X"_Ff;%0i_r=#IKF-2bbk\ZPkW;](?;(XiS*U<)19O5meLiktrW
+UOWbA1X3.pq74p:a;,sZ8<1U#a(!k1b8?3s=/Z$47ph7o'mm:RsUn,E(/gUGsY.i
+bSQ^N:bT(R[:OI6mbKWPBTk%fo/'SlII_+mUN\]@AE'HN.BD.%K`9$3$UI<\J.2!
+Q>89u',Z5T<\FOkiJ/c`$$o]"XZhQdXUuW<F_"&K4+V-i*XhaF;\/iY9On%6WI[f
+?g=;%B"/CO#t450X!$rLk.VZin\c`N]s$_='+O\`oRqJJl.Ou>k;<GX,PZ5ceDu5
+Vm]]!6+G&_`fQmF]5DRHFVseSRFZU=Ua3YgB;%=PTn5A4O4A4m'PI56`C<>JY$5P
+YN:a!Md2dA.lZ+]i4Ul9LW=GmK"Up?0KmO`PdZgS.UEb8'G6`3e?)<4'DRb2cX%b
+(IV@gF>lIZ%9C26QD!/eWXf2dc,^(^X"$35Z35o^t]Y"?tu-X9m&(jaRQC"_CthD
+(:U]b#@Z\2B%`PddCb1::]k1XdaV.:<#rCb,83I@!W2[-F5@R#,7n$f:K4>+AfPh
++AsgT0GBt\EHXGFHuAoD(R)(8M76D0XVSG,m>Rmo3.o4GG_*-7$QFfpK@\BaaM3]
+IYh6aX$&md)`)]m6K0TYa)EU?ZQU1@_l6I1<'L<^ps]F^-F&;\j0O/okB/03(k+h
+6^*G6BVOU1;5RQ^QH6.^^m/s_,3!650BM%KbVFl[@!_$urN12sZ)M_6rXoK2JR/:
+<t[%AWj^CgJG)P_0c.%R!TKmKuX2VXWeN83,q--&YH!ga*e4&heHH5$#@[`6g@a:
+I&Pgg\0+a;rc"Td[G*7=HBL;>HK9@iSQD92nHn;W22H)7F"p@G&DXYbJ@#b*A!-X
+QT%XH8hB*@3=u\J+RHXBj*8I'^N1t^C#,4QWe71jCaMq4"%mkF\^ES;)0LpZ_XJu
+!"Gfo)f[/iEhR"D1R$j/PPW(mhP:\!bmh=GjlJ-'@<VqYN2R?ea[mb,>h::m?-YB
+J,M=DY-[-3;nS)F?5lI2u"m;LaT5%QWIX^Z-G71/Y@?=*`/@'fd3?0qYO?>ZbB>o
+asgkON;dc(hdO@%q8WVd?g3R2BI"7T"r*/Ojnb_[VbUIeXc85__2+d?P*YF[8X^W
+5dB!;a+56]A;W?."$&q1Qb(rrAXpCTY8`)FAq[F(O0IJf&KUe7=^*atT?84*>Did
+@#buL;[,^@?b#)KJqP-U^r;tJ-B%h8lD]*eH\0+^RfJq(l8+5Vi%h/Wk(!UQE'#<
+m(3&n!.o*j<2D$9;O"",=<nAJ_"Y!!4r]#1[o9]YTEToK]gbe$K4mi\>2ibg[b4_
+THS'n/oP"a>&/3G=Eg*,oU"(pt-fL>en#`QSj^klbha2Td<blT'OGOk_aJRORKYq
+X0Uuqn+"FW`ha&qZP<orPTWEZQ/?8e^PcZn2=KuSJ;nVeOrl-sQ6obRMGFdYDLTn
+XJA&cm7Y;IH#?TC.\bG_&RtS"8!ki_a0?-=gHnf,Yq:#m1EsOpeF6l/Cd:RF2bH&
+?GKcjYhB<Xan?"V?g(Nmhb<4LXN);G$B*OK$CG,G_e?7)/L[EeFc%Pn"i<c"`1G%
+^-"41*e4*bWcjW'.]$YSfm9^s">B@J<n^PT71\a>WE64`_>-"F>,b+lPbfg$<-@p
+1$VjkI\QiCm*L,XFk#q7I8!u5.O/^Cpgpa(=A5&B,pj7G"Ps/ZN@fX*A?n4ERDmj
+GU6]n+X$ILoso*mCr(5mg`LD7)7`@V#h(9De,k-[hVpm-c'lZLWr?>3&/@G,J".t
+IpB,sWkr8C*Et>s#)+f,@OlRl](@G\KmO[@HtE'_lWp`d/_AnngGg>:kk/LT4:N0
+6#$,W"MZlGXcXE<.&6Q@#DU2T%#,N!SJ:D;m/Jq_TM;Tp=-O%!"r7lQiK,r*-9Q3
+eskL,q\.tk1K]sh6Di;(V]?I4V#)3K^7hrqqoQS1Oo:?'chs63:*RlCfNBJb2NgZ
+.<pE_R18D^H\J!b5L(H,L?!'Ek4iuqfgXg4EHIU:rPpYLu/@LUoB^AWPQ[#SWrr>
+HUWG7E2H[2YKM9T4mZqQS*KggnE^6#.a`33p@_!20I4fd6d1o2[u@8L$>3k(,Ge.
+ho_e6/hh.\WLFk;?-:!/KWq4d(]3dZgRW8lCnW&+.s5qX:Y*9#un>Di"ek;UhNj-
+eJQobggJs=g&LrRJ73T;."/ZPU!ltQ)D\F,?C:NZX6k+=c%+0W2Q9/I?_I/8]a.B
+&YFBIlWZO+,fJL,KuYK4=mm'q;Oim1&tT*B=Sic$+g#5O7asd<+fWKn5$XnZ,t$.
+bn#p>m@^Ortmk/dN17h%jQ+n=L*.:B&G/fEX.-P+b/MP$G'&,q`8q);0._0]K2S$
+-m529GMgkJVDgXY+/=ZJRl3)D!*HMZ-<Qd&[06:LV%S)q=J2#D$2]TMKfI*_D'!;
+!AJL8D9BI1:REbrMbJ\%fHZ,V;#CJBA?91QF9BX;:OAM_nKNTS*U7.OmCXD&m@3H
+K*`W`JYrrY>;!!&&:-;U_5FA3_4(:NEVS'Z+CUYl[=J=!Bng)\J`^<.KKVrfi>;:
+"(gq_rQVh?&l98E[l96?#H.nl!VT'`$g*ncl:Z/*h4b/7Tg<?_;+AM)5TlkS3$tA
+9h3r&)']u:0[f6>4Zq3WF]!^oh^moiC<k;1nWb.YZm5nMSj<,!1'iiPE9^M"HrY6
++H!7Xoeq3?$&FmDesR)N[%XABJ%P`S2p7:rf^bu":3m/>1;'q&+aV&(PZ.6pbI>t
+81rq&K#jrrACE`4=d44jaUAB:qlX-qJ&<.iJ8E>CW\:`1SL:Xe"T<Ii^E<Wq<^Vq
+b"F"__9>a49[#M(h@r*3$3J?50nR?CILU5a50LZP^ik=UgYZBk_/-B5(7m*<Q]i3
+mnYE7PkLlM>>=tMF$Y!&"m4WYIDQ?pXTX3,i(#7gl1t2`U?X.N>O:#9kSL^N6C]"
+K1#-*dJA<,Xq-3^YlX->;&<4!?"pnX]@`N>KY+)kq%0#PYX9A]f3?ke%bpc7b1JE
+:7rGV]90`M,>C?J3cp2U*4[9rH]?iL,F>k1$k3`h9bDTs94$d,XB)fcTgHf[3A(K
+6FD$!,C`Q@6L?A;KWf6YP^&[bYh!A)(1E+kS2i$#$AuV]c!>Hqm2>GCNS&[15pN<
+K;HB92HRpgp]"nPd6C:dK^X9?$#,Q"psXWXda3Naqa%WTLlW1'@qiJ*XZOn._ut`
+-c/BGQ9h^D5.PRkGdkJR"]3flL*jc7F>(:&-Ye/Q'l=o&`]WfH>TKjaMfopm@7>3
+Q37AH:kbobNXX>J'^ci`uGW=XAMWW<QNA%7!W4H*$<OtkKc6>p`T'\!s;ha-M]Fi
+Y>N;6OZ*Mpes,Wh3o(<r:Yj[*QgSK!I!QDA#DOqm/B[ujL2Af]D"Y=c(UTIoJK[O
+JQoL``?_.6[Mtm;Bd\f:h74h5)u7nT)#K(5H7PC"jN(^D<(MH_dSSJjre;&X&o]h
+-I5XY8Nf5QL4HVb^5i&AQaF+iRF.[nT!\HYFqjX8#p+QXg`MX<heptOrKA4"YT^F
+P^oOf,7+Hr3VWALFeAFh2ce`+qmoDI)Wbm&GpNkWZoEXM5ml6O:Q7P<pL*A/bOg$
+P[ct?FC!"*p+\5L(ECKsY,S!9RH3*K`4Y_:QN?RKqr"@Cm\5$9GZTHR"XDjGKGfW
+L;5X&<2%#U;$&___%h\,6h=@<DFOJ/0m+[cq1%=*tnKr/c,;Sck6C_#7'VGL6bdZ
+UL$(DIQ"NtE4"^a+7&)s",/Rlom#:guG)PA7Q(9XUkUJ-;].:2k6Z#X<dOELEAl6
+Yb.[\O;2ER!4>(FK]^]VGp;E8!sK.E,ji!oWG\B]i2<rm`:l5Ljmq-=Aa3#HQss]
+aiG^/=6"J.d]I]iR'=YDgG3EY3;IhAUKJJU8EF0,6_X4QgQ&=+eN^mK(;k0S(b\P
+de=eHQ^]VRI'9r%-bW5!H04pZA/sGXr?-6r$4PF[&D(W0T,t^c`3T(E4p6rYKFbu
+ZgmeV@TGB\):\)/J;H[6c/&k3R#g3dW"4T2:RB%9rl:"e[,T6Z%[n/PZ48S1RkUc
+3r:m6#iraiPOo_9H)a>,!=ObGB'AW,K?Aab5Jo4ST8#Uo,MS?TeWR"6]qD?V^<S*
+N^i5]9j'5m;dXoA2<?UD0s,Z=$epNX(Q*;T;es$Q`W"eVWeXaM"9@g\#3qAM(-a,
+&q'<;.cWdCeXE?!TC&2P5NX'O9jK2JR@Tr6C!rT:.a9!ST360QP+YdLaZLYKdQ9/
+1j/%`q4]K2heGZE!%aAp0'tQG9`G7OS8N7S5T0H4gQP.,]O4s6N6=9h3P/r]VLec
+k0:cE7;9W+^Zl[:bk_mA#S.i`(K8e!]-ARQ`29%'l?fepfodM$PIPf0dVA:&q@=?
+m3q.IS2U&4l@O253"!\mMNT#e+"IWll_W+,2GQUoDsN(rD+p_HY)&*0^2!bnXm(6
+i9*:`gsKU?+$9^>S+9EkE5iPfDs'=q2%6*a#-#/DYT]tY"b9=lul$r>7S:$pPC#0
+`s7]PJ$u#)NYbE/MqaQ9g=Sep)Kd2o/kT>uV!\L7,64<VPK0LbT$OSrFHrmu9TIg
+N6Fe]2-RIj4D"rh'IVm-<,6t*ncTG<tZ<`pdG"(o;:Z7=#&OX8&EY!k.[e8o?O1d
+AUL@&I#)OYXj1a1X$W`(ZNn2l2!Lecg;nT14Kl4q%W,dX??AZ[7?-:oiE>20Hh8k
+<-):WcH=5L$106Y+\d]/u!fdnbU;8m=]=9=n6_g3^dbC-3oF#:/phg:4NPQFpE`9
+:^EYgqthBgX=FXb3qF"KXNe%5Un%Po8c#r\pH*Z2_@+h-ekgZP00D]Vj"C8Y:3?^
+OuW*g;0k`(?L.ib1trJ2>Y*;$m9Q83;NdR5L@Mm*Tu[>n'mJ2*APU\*3,i!gUe6O
+)#YA,hb*#\d:SqkOZi**@c_R\oqohGe.bs?JD.1Aa*Qh`FA#B\YUFt8(mh]&4m^C
+chRa(!IW8T%:8SR+IUh=Zb8HV)(>r0H>crX=1'2Dd!aDQ+S4N,EcT(BQe\PeZfV+
+7BiZ/s"hGc<2.Nr9Jnl3l,*&]7ZUamP8?OKTQ&#slWQ5jO@>HE8+jW<[&/gFqOQW
+a&c+`Ml'7O9u%hNdS-4ql8$2T"A1<;L_QuTdFkcPYf9^;s@u8:t`t9G76AjF34%l
+J@4VNB4:/D<N=[hC?FmNnFo_/U<,q/,t@qc+F3V*SP3b2/U+YsSMp3dh]7M/+Jl.
+u-bSl3"*mJZ"\0t'j3K`g%6L?Rp7BNIqK_CR-;3W+@Dp8,?euEYTuVfd1X6=!("!
+C[?/\?%f8kMUk#tk@ji'mWa_[eF$VHH_J>.%U0IrGaK"O1>of>Karr<hLbtOab9>
+IBg#=?:"NWCBDe(VBABcGM>b=C>f&K_Ht[5S^imus!>]37r6Glr$M?BnNKO(Z%1l
+#V/ulU,R3F[8b^>Z_=m`^gHUC&Xs?5J5nK)`dou#j+?'fVrX-Qa>q\pp7eS."%i&
+[7'H;S963V:ZkXJV(#$U.l=(O8liBb<LfT;f#gmTV(#%45pUMY<2D$GXO<?0/-"9
+~>
+%%EOF
diff --git a/doc/oldlogo.jpg b/doc/oldlogo.jpg
new file mode 100644 (file)
index 0000000..9680f84
Binary files /dev/null and b/doc/oldlogo.jpg differ
diff --git a/doc/overview.texi b/doc/overview.texi
new file mode 100644 (file)
index 0000000..50f73ad
--- /dev/null
@@ -0,0 +1,844 @@
+
+This chapter is an overview of the GNU Go internals. Further 
+documentation of how any one module or routine works may be found in
+later chapters or comments in the source files.
+
+GNU Go starts by trying to understand the current board position as
+good as possible. Using the information found in this first phase, and
+using additional move generators, a list of candidate moves is generated.
+Finally, each of the candidate moves is valued according to its territorial
+value (including captures or life-and-death effects), and possible
+strategical effects (such as strengthening a weak group).
+
+Note that while GNU Go does, of course, do a lot of reading to analyze
+possible captures, life and death of groups etc., it does not (yet) have
+a fullboard lookahead.
+
+@menu
+* Examining the Position::             Gathering Information
+* Move Generators::                    Selecting Candidate Moves
+* Move Valuation::                     Selecting the best Move
+* Detailed Sequence of Events::                Outline of @code{genmove()}.
+* Roadmap::                            Description of the different files.
+* Coding Styles::                      Coding conventions.
+* Navigating the Source::              Navigating the Source.
+@end menu
+
+
+@node Examining the Position
+@section Gathering Information
+
+This is by far the most important phase in the move generation. 
+Misunderstanding life-and-death situations can cause gross mistakes.
+Wrong territory estimates will lead to inaccurate move valuations. 
+Bad judgement of weaknesses of groups make strategic mistakes likely.
+
+This information gathering is done by the function @code{examine_position()}.
+It first calls @code{make_worms()}.
+
+Its first steps are very simple: it identifies sets of directly connected
+stones, called @dfn{worms}, and notes their sizes and their number of
+liberties.
+
+Soon after comes the most important step of the worm analysis:
+the tactical reading code (@pxref{Tactical Reading}) is called for every
+worm. It tries to read
+out which worms can be captured directly, giving up as soon as a worm
+can reach 5 liberties. If a worm can be captured, the engine of course
+looks for moves defending against this capture. Also, a lot of effort
+is made to find virtually all moves that achieve the capture or defense
+of a worm.
+
+After knowing which worms are tactically stable, we can make a first
+picture of the balance of power across the board: the @ref{Influence}
+code is called for the first time.
+
+This is to aid the next step, the analysis of dragons. By a @dfn{dragon}
+we mean a group of stones that cannot be disconnected.
+
+Naturally the first step in the responsible function @code{make_dragons()}
+is to identify these dragons, i.e. determine which worms cannot be
+disconnected from each other. This is partly done by patterns, but
+in most cases the specialized readconnect code 
+@comment FIXME: Put in cross-ref here once Connection is documented 
+is called. This module does a minimax search to determine whether two
+given worms can be connected with, resp. disconnected from each other.
+
+Then we compute various measures to determine how strong or weak any given
+dragon is: 
+@itemize @bullet
+@item A crude estimate of the number of eyes is made.
+@item The results of the influence computations is used to see which dragons
+are adjacent to own territory or a moyo.
+@item A guess is made for the potential to escape if the dragon got
+under attack.
+@end itemize
+
+For those dragons that are considered weak, a life and death analysis
+is made (@pxref{The Owl Code}). If two dragons next to each other are found
+that are both not alive, we try to resolve this situation with the semeai
+module.
+
+For a more detailed reference of the worm and dragon analysis (and
+explanations of the data structures used to store the information),
+see @xref{Worms and Dragons}.
+
+The influence code is then called second time to make a detailed analysis
+of likely territory. Of course, the life-and-death status of dragons are
+now taken into account.
+
+The territorial results of the influence module get corrected by the break-in
+module. This specifically tries to analyze where an opponent could break
+into an alleged territory, with sequences that would be too difficult to
+see for the influence code.
+
+
+@node Move Generators
+@section Move Generators
+@cindex move generation
+@cindex move generators
+@cindex move reasons
+
+Once we have found out all about the position it is time to generate
+the best move. Moves are proposed by a number of different modules
+called @dfn{move generators}. The move generators themselves
+do not set the values of the moves, but enumerate justifications for
+them, called @dfn{move reasons}. The valuation of the moves comes
+last, after all moves and their reasons have been generated.
+
+For a list and explanation of move reasons used in GNU Go, and how they
+are evaluated, see @xref{Move Generation}.
+
+There are a couple of move generators that only extract data found in
+the previous phase, examining the position:
+
+@itemize @bullet
+@item @code{worm_reasons()}
+@findex worm_reasons
+@quotation
+Moves that have been found to capture or defend a worm are proposed as
+candidates.
+@end quotation
+
+@item @code{owl_reasons()}
+@findex owl_reasons
+@quotation
+The status of every dragon, as it has been determined by the owl code
+(@pxref{The Owl Code}) in the previous phase, is reviewed. If the status
+is critical, the killing or defending move gets a corresponding move
+reason.
+@end quotation
+
+@item @code{semeai_move_reasons()}
+@findex semeai
+@quotation
+Similarly as @code{owl_reasons}, this function proposes moves relevant
+for semeais.
+@end quotation
+
+@item @code{break_in_move_reasons()}
+@quotation
+This suggests moves that have been found to break into opponent's territory
+by the break-in module.
+@end quotation
+@end itemize
+
+The following move generators do additional work:
+
+@itemize @bullet
+
+@item @code{fuseki()}
+@findex fuseki
+@quotation
+Generate a move in the early fuseki, either in an empty corner of from
+the fuseki database.
+@end quotation
+
+@item @code{shapes()}
+@findex shapes
+@quotation
+This is probably the most important move generator.
+It finds patterns from @file{patterns/patterns.db},
+@file{patterns/patterns2.db}, @file{patterns/fuseki.db}, and the joseki
+files in the current position.  Each pattern is matched in each
+of the 8 possible orientations obtainable by rotation and
+reflection. If the pattern matches, a so called "constraint"
+may be tested which makes use of reading to determine if the
+pattern should be used in the current situation.  Such
+constraints can make demands on number of liberties of
+strings, life and death status, and reading out ladders,
+etc. The patterns may call helper functions, which may
+be hand coded (in @file{patterns/helpers.c}) or 
+autogenerated.
+
+The patterns can be of a number of different classes
+with different goals.  There are e.g. patterns which
+try to attack or defend groups, patterns which try to
+connect or cut groups, and patterns which simply try
+to make good shape. (In addition to the large pattern
+database called by @code{shapes()}, pattern matching
+is used by other modules for different tasks throughout
+the program. @xref{Patterns}, for a complete documentation 
+of patterns.)
+@end quotation
+
+@item @code{combinations()}
+@findex atari_atari
+@quotation
+See if there are any combination threats or atari sequences and either
+propose them or defend against them.
+@end quotation
+
+@item @code{revise_thrashing_dragon()}
+@findex revise_thrashing_dragon
+@quotation
+This module does not directly propose move: If we are clearly ahead,
+and the last move played by the opponent is part of a dead dragon, we
+want to attack that dragon again to be on the safe side. This is done
+be setting the status of this @dfn{thrashing dragon} to unkown and
+repeating the shape move generation and move valution.
+@end quotation
+
+@item @code{endgame_shapes()}
+@findex endgame_shapes
+@quotation
+If no move is found with a value greater than 6.0, this module matches a
+set of extra patterns which are designed for the endgame.  The endgame
+patterns can be found in @file{patterns/endgame.db}.
+@end quotation
+
+@item @code{revise_semeai()}
+@findex revise_semeai
+@quotation
+If no move is found, this module changes the status of opponent groups
+involved in a semeai from @code{DEAD} to @code{UNKNOWN}.  After this,
+genmove runs @code{shapes} and @code{endgame_shapes} again to see if a
+new move turns up.
+@end quotation
+
+@item @code{fill_liberty()}
+@findex fill_liberty
+@quotation
+Fill a common liberty. This is only used at the end
+of the game. If necessary a backfilling or backcapturing 
+move is generated.
+@end quotation
+@end itemize
+
+@node Move Valuation
+@section Move Valuation
+
+After the move generation modules have run, each proposed candidate
+move goes through a detailed valuation by the function
+@code{review_move_reasons}. This invokes some analysis to try to turn
+up other move reasons that may have been missed.
+
+The most important value of a move is its territorial effect.
+@pxref{Influence and Territory} explains in detail how this is determined.
+
+This value is modified for all move reasons that cannot be expressed
+directly in terms of territory, such as combination attacks (where it
+is not clear which of several strings will get captured), strategical
+effects, connection moves, etc.  A large set heuristics is necessary
+here, e.g. to avoid duplication of such values. This is explained in
+more detail in @ref{Valuation}.
+
+
+@node Detailed Sequence of Events
+@section Detailed Sequence of Events
+
+First comes the sequence of events when
+@code{examine_position()} is run from @code{genmove()}. This
+is for reference only.
+
+@format
+@code{purge_persistent_caches()}
+@code{make_worms()}:
+  @code{compute_effective_sizes()}
+  @code{compute_unconditional_status()}
+  @code{find_worm_attacks_and_defenses()}:      
+    for each attackable worm:
+      set @code{worm.attack}
+      @code{change_attack()} to add the attack point
+    @code{find_attack_patterns()} to find a few more attacks
+    for each defensible worm:
+      set @code{worm.attack}
+      @code{change_defense()} to add the defense point
+    @code{find_defense_patterns()} to find a few more defense moves
+    find additional attacks and defenses by testing all
+      immediate liberties
+  find higher order liberties (for each worm)
+  find cutting stones (for each worm)
+  improve attacks and defenses: if capturing a string defends
+    another friendly string, or kills an unfriendly one, we
+    add points of defense or attack. Make repairs if adjacent 
+    strings can both be attacked but not defended.
+  find worm lunches
+  find worm threats
+  identify inessential worms (such as nakade stones)
+@code{compute_worm_influence()}:
+  @code{find_influence_patterns()}
+  @code{value_influence()}
+  @code{segment_influence()}
+@code{make_dragons()}:
+  @code{find_cuts()}
+  @code{find_connections()}
+  @code{make_domains()} (determine eyeshapes)
+  @code{find_lunches()} (adjacent strings that can be captured)
+  @code{find_half_and_false_eyes()}
+  @code{eye_computations()}: Compute the value of each eye space. 
+    Store its attack and defense point.
+  @code{analyze_false_eye_territory()}
+  for each dragon @code{compute_dragon_genus()}
+  for each dragon @code{compute_escape()} and set escape route data
+  @code{resegment_initial_influence()}
+  @code{compute_refined_dragon_weaknesses()} (called again after owl)
+  for each dragon @code{compute_crude_status()}
+  @code{find_neighbor_dragons()}
+  for each dragon compute surround status
+  for each weak dragon run @code{owl_attack()} and @code{owl_defend()} 
+    to determine points of attack and defense
+  for each dragon compute dragon.status
+  for each thrashing dragon compute owl threats
+  for each dragon compute dragon.safety
+  @code{revise_inessentiality()}
+  @code{semeai()}:
+    for every semeai, run @code{owl_analyze_semeai()}
+    @code{find_moves_to_make_seki()}
+  @code{identify_thrashing_dragons()}
+  @code{compute_dragon_influence()}:
+    @code{compute_influence()}
+    @code{break_territories()} (@pxref{Break Ins})
+  @code{compute_refined_dragon_weaknesses()}
+@end format
+
+Now a summary of the sequence of events during the
+move generation and selection phases of @code{genmove()}, which 
+take place after the information gathering phase has been completed:
+
+@format
+@code{estimate_score()}
+@code{choose_strategy()}
+@code{collect_move_reasons()}:
+  @code{worm_reasons()}: for each attack and defense point add a move reason
+  @code{semeai_reasons()}: for each dragon2.semeai point add a move reason
+  @code{owl_reasons()}: for each owl attack and defense point add a move reason
+  @code{break_in_reasons()}: for each breakin found add a move reason
+@code{fuseki()}
+@code{break_mirror_go()}
+@code{shapes()}: match patterns around the board (@pxref{Patterns Overview})
+@code{combinations()}: look for moves with a double meaning and other tricks
+  @code{find_double_threats()}
+  @code{atari_atari()}
+@code{review_move_reasons()}
+if ahead and there is a thrashing dragon, consider it 
+  alive and reconsider the position
+@code{endgame_shapes()}
+@code{endgame()}
+if no move found yet, revisit any semeai, change status of dead opponent
+  to alive, then run @code{shapes()} and @code{endgame_shapes()} again
+if no move found yet, run @code{fill_liberty()}
+@end format
+
+@node Roadmap
+@section Roadmap
+
+The GNU Go engine is contained in two directories, @file{engine/} and
+@file{patterns/}. Code related to the user interface, reading and
+writing of Smart Game Format files, and testing are found in the
+directories @file{interface/}, @file{sgf/}, and @file{regression/}. Code
+borrowed from other GNU programs is contained in @file{utils/}. That
+directory also includes some code developed within GNU Go which is not
+go specific. Documentation is in @file{doc/}.
+
+In this document we will describe some of the individual files comprising
+the engine code in @file{engine/} and @file{patterns/}. In @file{interface/} 
+we mention two files:
+
+@itemize
+@item @file{gmp.c}
+@quotation
+This is the Go Modem Protocol interface (courtesy of 
+William Shubert and others). This takes care of all the 
+details of exchanging setup and moves with Cgoban, or any 
+other driving program recognizing the Go Modem Protocol.
+@end quotation
+@item @file{main.c}
+@quotation
+This contains @code{main()}. The @file{gnugo} target is
+thus built in the @file{interface/} directory.
+@end quotation
+@end itemize
+
+@subsection Files in @file{engine/}
+
+In @file{engine/} there are the following files:
+
+@itemize @bullet
+@item @file{aftermath.c}
+@quotation
+Contains algorithms which may be called at the end of the game to generate
+moves that will generate moves to settle the position, if necessary playing
+out a position to determine exactly the status of every group on the board,
+which GNU Go can get wrong, particularly if there is a seki. This module is
+the basis for the most accurate scoring algorithm available in GNU Go.
+@end quotation
+@item @file{board.c}
+@quotation
+@findex trymove
+@findex popgo
+@findex is_legal
+This file contains code for the maintenance of the board.  For example
+it contains the important function @code{trymove()} which tries a move
+on the board, and @code{popgo()} which removes it by popping the move
+stack. At the same time vital information such as the number of
+liberties for each string and their location is updated incrementally. 
+@end quotation
+@item @file{breakin.c}
+@quotation
+Code to detect moves which can break into supposed territory and moves
+to prevent this.
+@end quotation
+@item @file{cache.c} and @file{cache.h}
+@quotation
+As a means of speeding up reading, computed results are cached so that
+they can be quickly reused if the same position is encountered through
+e.g. another move ordering. This is implemented using a hash table.
+@end quotation
+@item @file{clock.c} and @file{clock.h}
+@quotation
+Clock code, including code allowing GNU Go to automatically
+adjust its level in order to avoid losing on time in tournaments.
+@end quotation
+@item @file{combination.c}
+@quotation
+When something can (only) be captured through a series of ataris or
+other threats we call this a combination attack. This file contains code
+to find such attacks and moves to prevent them.
+@end quotation
+@item @file{dragon.c}
+@quotation
+This contains @code{make_dragons()}. This function is executed before
+the move-generating modules @code{shapes()} @code{semeai()} and the
+other move generators but after @code{make_worms()}. It tries to connect
+worms into dragons and collect important information about them, such as
+how many liberties each has, whether (in GNU Go's opinion) the dragon
+can be captured, if it lives, etc.
+@end quotation
+@item @file{endgame.c}
+@quotation
+Code to find certain types of endgame moves.
+@end quotation
+@item @file{filllib.c}
+@quotation 
+Code to force filling of dame (backfilling if necessary)
+at the end of the game.
+@end quotation
+@item @file{fuseki.c}
+@quotation
+Generates fuseki (opening) moves from a database. Also generates moves
+in empty corners.
+@end quotation
+@item @file{genmove.c}
+@quotation
+This file contains @code{genmove()} and its supporting
+routines, particularly @code{examine_position()}. 
+@end quotation
+@item @file{globals.c}
+@quotation
+This contains the principal global variables used by GNU Go.
+@end quotation
+@item @file{gnugo.h}
+@quotation
+This file contains declarations forming the public interface to
+the engine.
+@end quotation
+@item @file{hash.c} and @file{hash.h}
+@quotation
+Hashing code implementing Zobrist hashing. (@pxref{Hashing}) The code in
+@file{hash.c} provides a way to hash board positions into compact descriptions
+which can be efficiently compared. The caching code in @file{cache.c}
+makes use of the board hashes when storing and retrieving read results.
+@end quotation
+@item @file{influence.c} and @file{influence.h}.
+@quotation
+This code determines which regions of the board are under the
+influence of either player.
+(@pxref{Influence})
+@end quotation
+@item @file{liberty.h}
+@quotation
+Header file for the engine. The name ``liberty'' connotes
+freedom (@pxref{Copying}).
+@end quotation
+@item @file{matchpat.c}
+@quotation
+This file contains the pattern matcher @code{matchpat()}, which looks for
+patterns at a particular board location. The actual patterns are in
+the @file{patterns/} directory. The function @code{matchpat()} is
+called by every module which does pattern matching, notably @code{shapes}.
+@end quotation
+@item @file{move_reasons.c} and @file{move_reasons.h}
+@quotation
+Code for keeping track of move reasons.
+@end quotation
+@item @file{movelist.c}
+@quotation 
+Supporting code for lists of moves.
+@end quotation
+@item @file{optics.c}
+@quotation 
+This file contains the code to recognize eye shapes,
+documented in @xref{Eyes}.
+@end quotation
+@item @file{oracle.c}
+@quotation 
+Code to fork off a second GNU Go process which can be used to simulate
+reading with top level information (e.g. dragon partitioning) available.
+@end quotation
+@item @file{owl.c}
+@quotation
+This file does life and death reading. Move generation is pattern based
+and the code in @file{optics.c} is used to evaluate the eyespaces for
+vital moves and independent life. A dragon can also live by successfully
+escaping. Semeai reading along the same principles is also implemented
+in this file.
+@end quotation
+@item @file{persistent.c}
+@quotation
+Persistent cache which allows reuse of read results at a later move or
+with additional stones outside an active area, which are those
+intersections thought to affect the read result.
+@end quotation
+@item @file{printutils.c}
+@quotation
+Print utilities.
+@end quotation
+@item @file{readconnect.c} and @file{readconnect.h}
+@quotation 
+This file contains code to determine whether two strings can be
+connected or disconnected.
+@end quotation
+@item @file{reading.c}
+@quotation 
+This file contains code to determine whether any given
+string can be attacked or defended. @xref{Tactical Reading},
+for details.
+@end quotation
+@item @file{semeai.c}
+@quotation 
+This file contains @code{semeai()}, the module which detects dragons
+in semeai. To determine the semeai results the semeai reading in
+@file{owl.c} is used.
+@end quotation
+@item @file{sgfdecide.c}
+@quotation 
+Code to generate sgf traces for various types of reading.
+@end quotation
+@item @file{shapes.c}
+@quotation 
+This file contains @code{shapes()}, the module called by @code{genmove()}
+which tries to find moves which match a pattern (@pxref{Patterns}).
+@end quotation
+@item @file{showbord.c}
+@quotation 
+This file contains @code{showboard()}, which draws an ASCII
+representation of the board, depicting dragons (stones 
+with same letter) and status (color). This was the 
+primary interface in GNU Go 1.2, but is now a debugging 
+aid.
+@end quotation
+@item @file{surround.c}
+@quotation 
+Code to determine whether a dragon is surrounded and to find moves to
+surround with or break out with.
+@end quotation
+@item @file{utils.c}
+@quotation
+An assortment of utilities, described in greater detail below.
+@end quotation
+@item @file{value_moves.c}
+@quotation 
+This file contains the code which assigns values to every move
+after all the move reasons are generated. It also tries to generate
+certain kinds of additional move reasons.
+@end quotation
+@item @file{worm.c}
+@quotation 
+This file contains @code{make_worms()}, code which is run at the
+beginning of each move cycle, before the code in @file{dragon.c}, to
+determine the attributes of every string. These attributes are things
+like liberties, wether the string can be captured (and how), etc
+@end quotation
+@end itemize
+
+@subsection Files in @file{patterns/}
+
+The directory @file{patterns/} contains files related to pattern matching.
+Currently there are several types of patterns. A partial list:
+
+@itemize @bullet
+@item move generation patterns in @file{patterns.db} and @file{patterns2.db}
+@item move generation patterns in files @file{hoshi.db} etc. which are
+automatically build from the files @file{hoshi.sgf} etc. These comprise
+our small Joseki library.
+@item patterns in @file{owl_attackpats.db}, @file{owl_defendpats.db}
+and @file{owl_vital_apats.db}. These generate moves for the owl
+code (@pxref{The Owl Code}).
+@item Connection patterns in @file{conn.db} (@pxref{Connections Database})
+@item Influence patterns in @file{influence.db} and @file{barriers.db}
+(@pxref{Influence})
+@item eye patterns in @file{eyes.db} (@pxref{Eyes}).
+@end itemize
+
+The following list contains, in addition to distributed source files 
+some intermediate automatically generated files such as @file{patterns.c}.
+These are C source files produced by "compiling" various pattern
+databases, or in some cases (such as @file{hoshi.db}) themselves 
+automatically generated pattern databases produced by "compiling"
+joseki files in Smart Game Format.
+
+@itemize @bullet
+
+@item @file{conn.db} 
+@quotation 
+Database of connection patterns.
+@end quotation
+
+@item @file{conn.c} 
+@quotation 
+Automatically generated file, containing connection
+patterns in form of struct arrays, compiled by @command{mkpat}
+from @file{conn.db}.
+@end quotation
+
+@item @file{eyes.c} 
+@quotation 
+Automatically generated file, containing eyeshape
+patterns in form of struct arrays, compiled by @command{mkpat} 
+from @file{eyes.db}.
+@end quotation
+
+@item @file{eyes.h} 
+@quotation 
+Header file for @file{eyes.c}.
+@end quotation
+
+@item @file{eyes.db} 
+@quotation 
+Database of eyeshape patterns. @xref{Eyes}, for
+details.
+@end quotation
+
+@item @file{helpers.c} 
+@quotation 
+These are helper functions to assist in evaluating
+moves by matchpat.
+@end quotation
+
+@item @file{hoshi.sgf} 
+@quotation 
+Smart Game Format file containing 4-4 point openings
+@end quotation
+
+@item @file{hoshi.db} 
+@quotation 
+Automatically generated database of 4-4 point opening
+patterns, make by compiling @file{hoshi.sgf}
+@end quotation
+
+@item @file{joseki.c} 
+@quotation 
+Joseki compiler, which takes a joseki file in
+Smart Game Format, and produces a pattern database.
+@end quotation
+
+@item @file{komoku.sgf}
+@quotation  
+Smart Game Format file containing 3-4 point openings
+@end quotation
+
+@item @file{komoku.db} 
+@quotation 
+Automatically generated database of 3-4 point opening
+patterns, make by compiling @file{komoku.sgf}
+@end quotation
+
+@item @file{mkeyes.c} 
+@quotation 
+Pattern compiler for the eyeshape databases. This
+program takes @file{eyes.db} as input and produces @file{eyes.c}
+as output.
+@end quotation
+
+@item @file{mkpat.c} 
+@quotation 
+Pattern compiler for the move generation and connection
+databases. Takes the file @file{patterns.db} together with
+the autogenerated Joseki pattern files @file{hoshi.db}, @file{komoku.db},
+@file{sansan.db}, @file{mokuhadzushi.db}, @file{takamoku.db} and produces 
+@file{patterns.c}, or takes @file{conn.db} and produces @file{conn.c}.
+@end quotation
+
+@item @file{mokuhazushi.sgf} 
+@quotation 
+Smart Game Format file containing 5-3 point openings
+@end quotation
+
+@item @file{mokuhazushi.db}
+@quotation 
+Pattern database compiled from mokuhadzushi.sgf
+@end quotation
+
+@item @file{sansan.sgf} 
+@quotation 
+Smart Game Format file containing 3-3 point openings
+@end quotation
+
+@item @file{sansan.db} 
+@quotation 
+Pattern database compiled from @file{sansan.sgf}
+@end quotation
+
+@item @file{takamoku.sgf} 
+@quotation 
+Smart Game Format file containing 5-4 point openings
+@end quotation
+
+@item @file{takamoku.db} 
+@quotation 
+Pattern database compiled from takamoku.sgf.
+@end quotation
+
+@item @file{patterns.c} 
+@quotation 
+Pattern data, compiled from patterns.db by mkpat.
+@end quotation
+
+@item @file{patterns.h} 
+@quotation 
+Header file relating to the pattern databases.
+@end quotation
+
+@item @file{patterns.db} and @file{patterns2.db}
+@quotation 
+These contain pattern databases in human readable form.  
+@end quotation
+
+@end itemize
+
+
+@node Coding Styles
+@section Coding styles and conventions
+              
+@subsection Coding Conventions
+
+Please follow the coding conventions at:
+@url{http://www.gnu.org/prep/standards_toc.html}
+
+Please preface every function with a brief description
+of its usage.
+
+Please help to keep this Texinfo documentation up-to-date.
+
+@subsection Tracing
+
+A function @code{gprintf()} is provided. It is a cut-down
+@code{printf}, supporting only @code{%c}, @code{%d},
+@code{%s}, and without field widths, etc. It does, however,
+add some useful facilities:
+
+@itemize @bullet
+@item @code{%m} 
+@quotation
+Takes two parameters, and displays a formatted board co-ordinate.
+@end quotation
+@item indentation
+@quotation
+Trace messages are automatically indented to reflect
+the current stack depth, so it is clear during read-ahead
+when it puts a move down or takes one back.
+@end quotation
+@item "outdent"
+@quotation As a workaround, @code{%o} at the beginning of the
+format string suppresses the indentation.
+@end quotation
+@end itemize
+
+Normally @code{gprintf()} is wrapped in one of the following:
+
+@code{TRACE(fmt, ...)}: 
+@quotation
+Print the message if the 'verbose' variable > 0.
+(verbose is set by @command{-t} on the command line)
+@end quotation
+
+@code{DEBUG(flags, fmt, ...)}: 
+@quotation
+While @code{TRACE} is intended to afford an overview
+of what GNU Go is considering, @code{DEBUG} allows occasional
+in depth study of a module, usually needed when something
+goes wrong. @code{flags} is one of the @code{DEBUG_*} symbols in
+@file{engine/gnugo.h}.  The @code{DEBUG} macro tests to
+see if that bit is set in the @code{debug} variable, and prints
+the message if it is.  The debug variable is set using the
+@command{-d} command-line option.  
+@end quotation
+
+The variable @code{verbose} controls the tracing. It
+can equal 0 (no trace), 1, 2, 3 or 4 for increasing
+levels of tracing. You can set the trace level at
+the command line by @option{-t} for @code{verbose=1}, 
+@option{-t -t} for @code{verbose=2}, etc. But in
+practice if you want more verbose tracing than level
+1 it is better to use GDB to reach the point where
+you want the tracing; you will often find that the
+variable @code{verbose} has been temporarily set to zero
+and you can use the GDB command @command{set var verbose=1}
+to turn the tracing back on.
+
+@subsection Assertions
+
+Related to tracing are assertions. Developers are strongly encouraged
+to pepper their code with assertions to ensure that data structures
+are as they expect. For example, the helper functions make assertions
+about the contents of the board in the vicinity of the move they
+are evaluating.
+
+@code{ASSERT()} is a wrapper around the standard C @code{assert()}
+function. In addition to the test, it takes an extra pair of parameters
+which are the co-ordinates of a "relevant" board position. If an
+assertion fails, the board position is included in the trace output, and
+@code{showboard()} and @code{popgo()} are called to unwind and display
+the stack.
+
+@subsection FIXME
+@cindex FIXME
+
+We have adopted the convention of putting the word FIXME
+in comments to denote known bugs, etc.
+
+@node Navigating the Source
+@section Navigating the Source
+
+If you are using Emacs, you may find it fast and convenient to use
+Emacs' built-in facility for navigating the source. Switch to the
+root directory @file{gnugo-3.6/} and execute the command:
+
+@example
+find . -print|grep "\.[ch]$" | xargs etags
+@end example
+
+This will build a file called @file{gnugo-3.6/TAGS}. Now to
+find any GNU Go function, type @command{M-.} and enter the
+command which you wish to find, or just @command{RET} if 
+the cursor is at the name of the function sought. 
+
+The first time you do this you will be prompted for the location
+of the TAGS table.  Enter the path to @file{gnugo-3.6/TAGS}, and
+henceforth you will be able to find any function with a minimum
+of keystrokes. 
+
+
+
+
diff --git a/doc/owl.texi b/doc/owl.texi
new file mode 100644 (file)
index 0000000..9dac498
--- /dev/null
@@ -0,0 +1,225 @@
+In the tactical reading code in @file{reading.c}, the 
+code generating the moves which are tried are all hand
+coded in C, for efficiency. There is much to be said for
+another type of reading, in which the moves to be tried are
+generated from a pattern database.
+
+GNU Go does three main types of pattern based reading. First,
+there is the OWL code (Optics with Limit Negotiation) which
+attempts to read out to a point where the code in
+@file{engine/optics.c} (@pxref{Eyes}) can be used to evaluate
+it.  Like the tactical reading code, a persistent cache is
+employed to maintain some of the owl data from move to
+move. This is an essential speedup without which GNU Go would
+play too slowly.
+
+Secondly, there is the @file{engine/combination.c} which
+attempts to find combinations---situations where a series
+of threats eventually culminates in one that cannot be
+parried.
+
+Finally there is the semeai module. A @strong{semeai} is
+a capturing race between two adjacent DEAD or CRITICAL
+dragons of opposite colors. The principal function,
+@code{owl_analyze_semeai()} is contained in @file{owl.c}.
+Due to the complex nature of semeais, the results of
+this function are more frequently wrong than the usual
+owl code.
+
+@menu
+* The Owl Code::                Life and death reading
+* Combinations::                Combinations
+@end menu
+
+@node The Owl Code
+@section The Owl Code
+
+The life and death code in @file{optics.c}, described elsewhere
+(@pxref{Eyes}), works reasonably well as long as the position is in a
+@dfn{terminal position}, which we define to be one where there are no
+moves left which can expand the eye space, or limit it. In situations
+where the dragon is surrounded, yet has room to thrash around a bit
+making eyes, a simple application of the graph-based analysis will not
+work. Instead, a bit of reading is needed to reach a terminal position.
+
+The defender tries to expand his eyespace, the attacker to limit
+it, and when neither finds an effective move, the position is
+evaluated. We call this type of life and death reading
+@dfn{Optics With Limit-negotiation} (OWL). The module which
+implements it is in @file{engine/owl.c}.
+
+There are two reasonably small databases
+@file{patterns/owl_defendpats.db} and @file{patterns/owl_attackpats.db}
+of expanding and limiting moves. The code in @file{owl.c} generates a
+small move tree, allowing the attacker only moves from
+@file{owl_attackpats.db}, and the defender only moves from
+@file{owl_defendpats.db}. In addition to the moves suggested by
+patterns, vital moves from the eye space analysis are also tested.
+
+A third database, @file{owl_vital_apats.db} includes patterns which
+override the eyespace analysis done by the optics code. Since the
+eyeshape graphs ignore the complications of shortage of liberties and
+cutting points in the surrounding chains, the static analysis of
+eyespace is sometimes wrong. The problem is when the optics code says
+that a dragon definitely has 2 eyes, but it isn't true due to 
+shortage of liberties, so the ordinary owl patterns never get into play.
+In such situations @file{owl_vital_apats.db} is the only available measure
+to correct mistakes by the optics. Currently the patterns in
+@file{owl_vital_apats.db} are only matched when the level is 9 or
+greater.
+
+The owl code is tuned by editing these three pattern databases,
+principally the first two.
+
+@findex owl_attack
+@findex owl_defend
+@findex compute_eyes_pessimistic
+A node of the move tree is considered @code{terminal} if no further moves 
+are found from @file{owl_attackpats.db} or @file{owl_defendpats.db}, or if
+the function @code{compute_eyes_pessimistic()} reports that the group is
+definitely alive. At this point, the status of the group is evaluated.
+The functions @code{owl_attack()} and @code{owl_defend()}, with
+usage similar to @code{attack()} and @code{find_defense()}, make
+use of the owl pattern databases to generate the move tree and decide
+the status of the group.
+
+The function @code{compute_eyes_pessimistic()} used by the owl
+code is very conservative and only feels certain about eyes if the
+eyespace is completely closed (i.e. no marginal vertices). 
+
+The maximum number of moves tried at each node is limited by
+the parameter @code{MAX_MOVES} defined at the beginning of
+@file{engine/owl.c}. The most most valuable moves are
+tried first, with the following restrictions:
+
+@itemize @bullet
+@item
+If @code{stackp > owl_branch_depth} then only one move is tried per
+variation. 
+@item
+If @code{stackp > owl_reading_depth} then the reading terminates,
+and the situation is declared a win for the defender (since
+deep reading may be a sign of escape).
+@item
+If the node count exceeds @code{owl_node_limit}, the reading also
+terminates with a win for the defender.
+@item
+Any pattern with value 99 is considered a forced move: no
+other move is tried, and if two such moves are found, the function
+returns false. This is only relevant for the attacker.
+@item
+Any pattern in @file{patterns/owl_attackpats.db} and 
+@file{patterns/owl_defendpats.db} with value 100 is considered a win: if
+such a pattern is found by @code{owl_attack} or @code{owl_defend}, the
+function returns true. This feature must be used most carefully.
+@end itemize
+
+The functions @code{owl_attack()} and @code{owl_defend()} may, like
+@code{attack()} and @code{find_defense()}, return an attacking or
+defending move through their pointer arguments. If the position is
+already won, @code{owl_attack()} may or may not return an attacking
+move. If it finds no move of interest, it will return @code{PASS}, that
+is, @code{0}. The same goes for @code{owl_defend()}.
+
+When @code{owl_attack()} or @code{owl_defend()} is called,
+the dragon under attack is marked in the array @code{goal}.
+The stones of the dragon originally on the board are marked
+with goal=1; those added by @code{owl_defend()} are marked
+with goal=2. If all the original strings of the original dragon 
+are captured, @code{owl_attack()} considers the dragon to be defeated,
+even if some stones added later can make a live group.
+
+Only dragons with small escape route are studied when the
+functions are called from @code{make_dragons()}.
+
+The owl code can be conveniently tested using the 
+@option{--decide-owl @var{location}} option. This should be used with 
+@option{-t} to produce a useful trace, @option{-o} to produce
+an SGF file of variations produced when the life and death of
+the dragon at @var{location} is checked, or both. 
+@option{--decide-position} performs the same analysis for all
+dragons with small escape route. 
+
+@node Combinations
+@section Combination reading
+
+It may happen that no single one of a set of worms can be killed,
+yet there is a move that guarantees that at least one can be captured. 
+The simplest example is a double atari.  The purpose of the code in
+@file{combination.c} is to find such moves.
+
+For example, consider the following situation:
+
+@example
+
++---------
+|....OOOOX
+|....OOXXX
+|..O.OXX..
+|.OXO.OX..
+|.OX..OO..
+|.XXOOOXO.
+|..*XXOX..
+|....XOX..
+|.XX..X...
+|X........
+
+@end example
+
+Every @samp{X} stone in this position is alive. However the move
+at @samp{*} produces a position in which at least one of four
+strings will get captured. This is a @emph{combination}.
+
+The driving function is called @code{atari_atari} because typically
+a combination involves a sequence of ataris culminating in a capture,
+though sometimes the moves involved are not ataris. For example in
+the above example, the first move at @samp{*} is @emph{not} an
+atari, though after @samp{O} defends the four stones above, a
+sequence of ataris ensues resulting in the capture of some
+string.
+
+Like the owl functions @code{atari_atari} does pattern-based
+reading. The database generating the attacking moves is
+@file{aa_attackpats.db}. One danger with this function is
+that the first atari tried might be irrelevant to the actual
+combination.  To detect this possibility, once we've found a
+combination, we mark that first move as forbidden, then try
+again. If no combination of the same size or larger turns
+up, then the first move was indeed essential.
+
+@itemize @bullet
+@item @code{void combinations(int color)}
+@findex combinations
+@quotation
+Generate move reasons for combination attacks and defenses against
+them. This is one of the move generators called from genmove().
+@end quotation
+@item @code{int atari_atari(int color, int *attack_move, char defense_moves[BOARDMAX], int save_verbose)}
+@findex atari_atari
+@quotation
+Look for a combination for @code{color}. For the purpose of
+the move generation, returns the size of the smallest of the
+worms under attack.
+@end quotation
+@item @code{int atari_atari_confirm_safety(int color, int move, int *defense, int minsize, const char saved_dragons[BOARDMAX], const char saved_worms[BOARDMAX])}
+@findex atari_atari_confirm_safety
+@quotation
+Tries to determine whether a move is a blunder.  Wrapper
+around atari_atari_blunder_size. Check whether a combination
+attack of size at least @code{minsize} appears after move at
+@code{move} has been made.  The arrays @code{saved_dragons[]} and
+@code{saved_worms[]} should be one for stones belonging to dragons
+or worms respectively, which are supposedly saved by @code{move}.
+@end quotation
+@item @code{int atari_atari_blunder_size(int color, int move, int *defense, const char safe_stones[BOARDMAX])}
+@findex atari_atari_blunder_size
+@quotation
+This function checks whether any new combination attack appears after
+move at (move) has been made, and returns its size (in points).
+@code{safe_stones} marks which of our stones are supposedly safe
+after this move.
+@end quotation
+@end itemize
+
+
+
diff --git a/doc/path.eps b/doc/path.eps
new file mode 100644 (file)
index 0000000..5020087
--- /dev/null
@@ -0,0 +1,177 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: path.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Jun 19 15:53:05 2001
+%%For: turvoy@semeai.irisa.fr (Tanguy Urvoy, DEA, Paragraphe)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 199 172
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-90.0 199.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 4312 m -1000 -1000 l 5812 -1000 l 5812 4312 l cp clip
+ 0.06000 0.06000 sc
+7.500 slw
+% Ellipse
+n 3000 1800 150 150 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
+
+% Ellipse
+n 2700 2700 150 150 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
+
+% Ellipse
+n 3900 2700 150 150 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Ellipse
+n 3900 1500 150 150 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Ellipse
+n 2700 1500 150 150 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+n 2400 900 m 2400 3300 l gs col0 s gr 
+% Polyline
+n 2700 3300 m 2700 900 l gs col0 s gr 
+% Polyline
+n 3000 900 m 3000 3300 l gs col0 s gr 
+% Polyline
+n 3300 900 m 3300 3300 l gs col0 s gr 
+% Polyline
+n 3300 900 m 3300 900 l 3300 1050 l gs col0 s gr 
+% Polyline
+n 3600 900 m 3600 3300 l gs col0 s gr 
+% Polyline
+n 3900 3300 m 3900 900 l gs col0 s gr 
+% Polyline
+n 4200 900 m 4200 3300 l gs col0 s gr 
+% Polyline
+n 4500 900 m 4500 3300 l gs col0 s gr 
+% Polyline
+n 4800 3000 m 2100 3000 l gs col0 s gr 
+% Polyline
+n 4800 2700 m 2100 2700 l gs col0 s gr 
+% Polyline
+n 4800 2400 m 2100 2400 l gs col0 s gr 
+% Polyline
+n 4800 2100 m 2100 2100 l gs col0 s gr 
+% Polyline
+n 4800 1800 m 2100 1800 l gs col0 s gr 
+% Polyline
+n 4800 1500 m 2100 1500 l gs col0 s gr 
+% Polyline
+n 2100 900 m 4800 900 l 4800 3300 l 2100 3300 l cp gs col0 s gr 
+% Polyline
+n 4800 1200 m 2100 1200 l gs col0 s gr 
+% Polyline
+15.000 slw
+gs  clippath
+3216 2099 m 3428 1971 l 3301 2184 l 3514 1971 l 3429 1886 l cp
+clip
+n 1800 1800 m 2700 2700 l 3450 1950 l gs col8 s gr gr
+
+% arrowhead
+n 3216 2099 m 3428 1971 l 3301 2184 l 3258 2142 l 3216 2099 l  cp gs col8 1.00 shd ef gr  col8 s
+% Polyline
+n 2700 1500 m 2700 1800 l 3000 1500 l 2700 1200 l 2400 1500 l 2400 1800 l
+ 2700 2100 l 3300 1500 l 2700 900 l 2100 1500 l 2100 1800 l
+ 2700 2400 l 3600 1500 l 2700 600 l 1800 1500 l 1800 1800 l gs col8 s gr 
+/Times-Roman ff 240.00 scf sf
+2850 600 m
+gs 1 -1 sc (out) col8 sh gr
+/Times-Roman ff 240.00 scf sf
+1500 1350 m
+gs 1 -1 sc (out) col8 sh gr
+$F2psEnd
+rs
diff --git a/doc/path.fig b/doc/path.fig
new file mode 100644 (file)
index 0000000..eb959cd
--- /dev/null
@@ -0,0 +1,57 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+60.00
+Single
+-2
+1200 2
+1 3 0 1 0 7 100 0 20 0.000 1 0.0000 3000 1800 150 150 3000 1800 3150 1800
+1 3 0 1 0 7 100 0 20 0.000 1 0.0000 2700 2700 150 150 2700 2700 2850 2700
+1 3 0 1 0 0 100 0 20 0.000 1 0.0000 3900 2700 150 150 3900 2700 4050 2700
+1 3 0 1 0 0 100 0 20 0.000 1 0.0000 3900 1500 150 150 3900 1500 4050 1500
+1 3 0 1 0 0 100 0 20 0.000 1 0.0000 2700 1500 150 150 2700 1500 2850 1500
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        2400 900 2400 3300
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        2700 3300 2700 900
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        3000 900 3000 3300
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        3300 900 3300 3300
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+        3300 900 3300 900 3300 1050
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        3600 900 3600 3300
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        3900 3300 3900 900
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4200 900 4200 3300
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4500 900 4500 3300
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 3000 2100 3000
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 2700 2100 2700
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 2400 2100 2400
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 2100 2100 2100
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 1800 2100 1800
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 1500 2100 1500
+2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+        2100 900 4800 900 4800 3300 2100 3300 2100 900
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+        4800 1200 2100 1200
+2 1 0 2 8 0 100 0 -1 0.000 0 0 -1 1 0 3
+       1 1 2.00 120.00 240.00
+        1800 1800 2700 2700 3450 1950
+2 1 0 2 8 0 100 0 -1 0.000 0 0 -1 0 0 16
+        2700 1500 2700 1800 3000 1500 2700 1200 2400 1500 2400 1800
+        2700 2100 3300 1500 2700 900 2100 1500 2100 1800 2700 2400
+        3600 1500 2700 600 1800 1500 1800 1800
+4 0 8 100 0 0 16 0.0000 4 150 315 2850 600 out\001
+4 0 8 100 0 0 16 0.0000 4 150 315 1500 1350 out\001
diff --git a/doc/path.jpg b/doc/path.jpg
new file mode 100644 (file)
index 0000000..ac9aacd
Binary files /dev/null and b/doc/path.jpg differ
diff --git a/doc/path.pdf b/doc/path.pdf
new file mode 100644 (file)
index 0000000..2d12177
Binary files /dev/null and b/doc/path.pdf differ
diff --git a/doc/path.png b/doc/path.png
new file mode 100644 (file)
index 0000000..04e981c
Binary files /dev/null and b/doc/path.png differ
diff --git a/doc/patterns.texi b/doc/patterns.texi
new file mode 100644 (file)
index 0000000..929cade
--- /dev/null
@@ -0,0 +1,1924 @@
+@menu
+* Patterns Overview::             Overview of the pattern database.
+* Pattern Classification::        The classification field
+* Pattern Values::                The value field
+* Helper Functions::              Helper Functions
+* Autohelpers and Constraints::   Automatic generation of helper functions.
+* Autohelper Actions::            Autohelper Actions
+* Autohelper Functions::          Autohelper Functions
+* Attack and Defense DB::         The Attack and defense moves database.
+* Connections Database::          The connection database.
+* Connection Functions::          Functions in @file{connections.c}
+* Tuning::                        Tuning the pattern database.
+* PM Implementation::             Implementation.
+* Symmetry & transformations::    Symmetry and transformations.
+* Details::                       Details of implementation.
+* Grid optimization::             The ``grid'' optimization.
+* Joseki Compiler::               The joseki compiler.
+* Ladders in Joseki::             Example: ladders in joseki.
+* Corner Matcher::                A special matcher for joseki patterns.
+* Editing Patterns::              Emacs major mode for pattern files.
+@end menu
+
+@node Patterns Overview
+@section Overview
+
+@cindex pattern overview
+@cindex pattern matching
+@cindex pattern database
+@cindex eye shapes database
+@cindex defence shapes database
+@cindex attack shapes database
+@cindex connection shapes database
+@cindex pattern.h
+@cindex pattern.c
+
+Several pattern databases are in the patterns directory.  This chapter
+primarily discusses the patterns in @file{patterns.db}, @file{patterns2.db},
+and the pattern files @file{hoshi.db} etc.  which are compiled from the SGF
+files @file{hoshi.sgf} (@pxref{Joseki Compiler}). There is no essential
+difference between these files, except that the ones in @file{patterns.db} and
+@file{patterns2.db} are hand written. They are concatenated before being
+compiled by @code{mkpat} into @file{patterns.c}. The purpose of the separate
+file @file{patterns2.db} is that it is handy to move patterns into a new
+directory in the course of organizing them. The patterns in @file{patterns.db}
+are more disorganized, and are slowly being moved to @file{patterns2.db}.
+
+During the execution of @code{genmove()}, the patterns are matched in
+@file{shapes.c} in order to find move reasons.
+
+The same basic pattern format is used by @file{attack.db}, @file{defense.db},
+@file{conn.db}, @file{apats.db} and @file{dpats.db}.  However these patterns
+are used for different purposes. These databases are discussed in other parts
+of this documentation. The patterns in @file{eyes.db} are entirely different
+and are documented elsewhere (@pxref{Eyes}).
+
+@cindex format of the pattern database
+@cindex description of shapes
+@cindex ascii description of shapes
+
+The patterns described in the databases are ascii representations, of
+the form:
+
+Pattern EB112
+
+@example
+
+  ?X?.?       jump under
+  O.*oo
+  O....
+  o....
+  -----
+  
+  :8,ed,NULL
+@end example
+
+Here @samp{O} marks a friendly stone, @samp{X} marks an enemy stone, @samp{.} marks
+an empty vertex, @samp{*} marks O's next move, @samp{o} marks a square either
+containing @samp{O} or empty but not @samp{X}. (The symbol @samp{x}, which does not
+appear in this pattern, means @samp{X} or @samp{.}.) Finally @samp{?} Indicates a
+location where we don't care what is there, except that it cannot be
+off the edge of the board.
+
+The line of @samp{-}'s along the bottom in this example is the edge of the
+board itself---this is an edge pattern. Corners can also be indicated.
+Elements are not generated for @samp{?} markers, but they are not
+completely ignored - see below.
+        
+The line beginning @samp{:} describes various attributes of the pattern, such
+as its symmetry and its class. Optionally, a function called a
+``helper'' can be provided to assist the matcher in deciding whether
+to accept move. Most patterns do not require a helper, and this field
+is filled with NULL.
+
+@findex shapes_callback
+The matcher in @file{matchpat.c} searches the board for places where this
+layout appears on the board, and the callback function
+@code{shapes_callback()} in @file{shapes.c} registers the appropriate move
+reasons.
+
+After the pattern, there is some supplementary information in the format:
+@example
+
+  :trfno, classification, [values], helper_function
+
+@end example
+
+Here trfno represents the number of transformations of the pattern to
+consider, usually @samp{8} (no symmetry, for historical reasons), or one of 
+@samp{|}, @samp{\}, @samp{/}, @samp{-}, @samp{+}, @samp{X}, where the line 
+represents the axis of symmetry. (E.g. @samp{|} means symmetrical about a
+vertical axis.)
+
+The above pattern could equally well be written on the left edge:
+
+@example
+
+  |oOO?
+  |...X
+  |..*?
+  |..o.
+  |..o?
+
+  :8,ed,NULL
+@end example
+
+The program @code{mkpat} is capable of parsing patterns written this
+way, or for that matter, on the top or right edges, or in any
+of the four corners. As a matter of convention all the edge patterns 
+in @file{patterns.db} are written on the bottom edge or in the lower left
+corners. In the @file{patterns/} directory there is a program called
+@code{transpat} which can rotate or otherwise transpose patterns.
+This program is not built by default---if you think you need it,
+@code{make transpat} in the @file{patterns/} directory and
+consult the usage remarks at the beginning of @file{patterns/transpat.c}.
+
+@node  Pattern Classification
+@section Pattern Attributes
+
+@cindex pattern attributes
+@cindex shape attributes
+
+The attribute field in the @samp{:} line of a pattern consists of a sequence
+of zero or more of the following characters, each with a different
+meaning. The attributes may be roughly classified as @dfn{constraints},
+which determine whether or not the pattern is matched, and @dfn{actions},
+which describe what is to be done when the pattern is matched, typically
+to add a move reason.
+
+@subsection Constraint Pattern Attributes
+
+@itemize
+@item @samp{s}
+@quotation
+Safety of the move is not checked.  This is appropriate for sacrifice
+patterns. If this classification is omitted, the matcher requires that the
+stone played cannot be trivially captured. Even with s classification, a check
+for legality is made, though.
+@end quotation
+@item @samp{n}
+@quotation
+In addition to usual check that the stone played cannot be
+trivially captured, it is also confirmed that an opponent
+move here could not be captured.
+@end quotation
+@item @samp{O}
+@quotation
+It is checked that every friendly (@samp{O}) stone of the pattern belongs to a
+dragon which has status (@pxref{Dragons}) @code{ALIVE} or
+@code{UNKNOWN}. The @code{CRITICAL} matcher status is excluded. It is possible
+for a string to have @code{ALIVE} status and still be tactically
+critical, since it might be amalgamated into an ALIVE dragon, and the matcher
+status is constant on the dragon.  Therefore, an additional test is performed:
+if the pattern contains a string which is tactically critical, and if @samp{*}
+does not rescue it, the pattern is rejected.
+@end quotation
+@item @samp{o}
+@quotation
+It is checked that every friendly (@samp{O}) stone of the pattern
+belongs to a dragon which is classified as @code{DEAD} or @code{UNKNOWN}.
+@end quotation
+@item @samp{X}
+@quotation
+It is checked that every opponent (@samp{X}) stone of the pattern
+belongs to a dragon with status @code{ALIVE}, @code{UNKNOWN} or 
+@code{CRITICAL}. Note that there is an asymmetry with @samp{O} patterns, where
+@code{CRITICAL} dragons are rejected.
+@end quotation
+@item @samp{x}
+@quotation
+It is checked that every opponent (@samp{X}) stone of the pattern
+belongs to a dragon which is classified as @code{DEAD} or @code{UNKNOWN}
+@end quotation
+@end itemize
+
+@subsection Action Attributes
+
+@itemize
+@item @samp{C}
+@quotation
+If two or more distinct O dragons occur in the pattern, the
+move is given the move reasons that it connects each pair of
+dragons. An exception is made for dragons where the underlying
+worm can be tactically captured and is not defended by the
+considered move.
+@end quotation
+@item @samp{c}
+@quotation
+Add strategical defense move reason for all our
+dragons and a small shape bonus. This classification is
+appropriate for weak connection patterns.
+@end quotation
+@item @samp{B}
+@quotation
+If two or more distinct @samp{X} dragons occur in the pattern, the
+move is given the move reasons that it cuts each pair of
+dragons.
+@end quotation
+@item @samp{e}
+@quotation
+The move makes or secures territory.
+@end quotation
+@item @samp{E}
+@quotation
+The move attempts increase influence and create/expand a moyo.
+@end quotation
+@item @samp{d}
+@quotation
+The move strategically defends all O dragons in the pattern,
+except those that can be tactically captured and are not
+tactically defended by this move. If any O dragon should
+happen to be perfectly safe already, this only reflects in
+the move reason being valued to zero.
+@end quotation
+@item @samp{a}
+@quotation
+The move strategically attacks all @samp{X} dragons in the pattern.
+@end quotation
+@item @samp{J}
+@quotation
+Standard joseki move. Unless there is an urgent move on the board these moves
+are made as soon as they can be.  This is equivalent to adding the @samp{d}
+and @samp{a} classifications together with a minimum accepted value of 27.
+@end quotation
+@item @samp{F}
+@quotation
+This indicates a fuseki pattern. This is only effective together with
+either the @samp{j} or @samp{t} classification, and is used to ensure
+indeterministic play during fuseki.
+@end quotation
+@item @samp{j}
+@quotation
+Slightly less urgent joseki move. These moves will be made after those
+with the @samp{J} classification. This adds the
+@samp{e} and @samp{E} classifications. If the move has the @samp{F} 
+classification, it also gets a fixed value of 20.1, otherwise it
+gets a minimum accepted value of 20. (This makes sure that GNU Go chooses
+randomly between different moves that have @samp{jF} as classification.)
+@end quotation
+@item @samp{t}
+@quotation
+Minor joseki move (tenuki OK). This is equivalent to adding the @samp{e} and
+@samp{E} classifications together with either a fixed value of 15.07 (if
+the move has @samp{F} classification) or a minimum value of 15 (otherwise).
+@end quotation
+@item @samp{U}
+@quotation
+Urgent joseki move (never tenuki). This is equivalent to the @samp{d} and
+@samp{a} classifications together with a shape bonus of 15 and a minimum
+accepted value of 40.  
+@end quotation
+@end itemize
+
+A commonly used class is @code{OX} (which rejects pattern if either side
+has dead stones). The string @samp{-} may be used as a placeholder. (In
+fact any characters other than the above and @samp{,} are ignored.)
+
+The types @samp{o} and @samp{O} could conceivably appear in a class, meaning it 
+applies only to @code{UNKNOWN}. @samp{X} and @samp{x} could similarly be used together.
+All classes can be combined arbitrarily.
+
+@node  Pattern Values
+@section Pattern Attributes
+
+The second and following fields in the @samp{:} line of a pattern
+are optional and of the form @code{value1(x),value2(y),...}. The available set
+of values are as follows.
+
+@itemize @bullet
+@item @code{terri(x)}
+@findex terri
+@quotation
+Forces the territorial value of the move to be at least x.
+@end quotation
+@item @code{minterri(x)}
+@findex minterri
+@quotation
+Forces the territorial value of the move to be at least x.
+@end quotation
+@item @code{maxterri(x)}
+@findex maxterri
+@quotation
+Forces the territorial value of the move to be at most x.
+@end quotation
+@item @code{value(x)}
+@findex value
+@quotation
+Forces the final value of the move to be at least x.
+@end quotation
+@item @code{minvalue(x)}, @code{maxvalue(x)}
+@findex minvalue
+@findex maxvalue
+@quotation
+Forces the final value of the move to be at least/most x.
+@end quotation
+@item @code{shape(x)}
+@findex shape
+@quotation
+Adds x to the move's shape value.
+@end quotation
+@item @code{followup(x)}
+@findex followup
+@quotation
+Adds x to the move's followup value.
+@end quotation
+@end itemize
+
+The meaning of these values is documented in @xref{Move Generation}.
+
+@node  Helper Functions
+@section Helper Functions
+
+@cindex helper functions in pattern matching
+
+Helper functions can be provided to assist the matcher in deciding
+whether to accept a pattern, register move reasons, and setting
+various move values. The helper is supplied with the compiled pattern
+entry in the table, and the (absolute) position on the board of the
+@samp{*} point.
+
+One difficulty is that the helper must be able to cope with all the
+possible transformations of the pattern. To help with this, the OFFSET
+macro is used to transform relative pattern coordinates to absolute
+board locations.
+
+The actual helper functions are in @file{helpers.c}. They are declared
+in @file{patterns.h}.
+
+As an example to show how to write a helper function, we consider
+a hypothetical helper called @code{wedge_helper}. Such a helper
+used to exist, but has been replaced by a constraint. Due to
+its simplicity it's still a good example. The helper begins with a
+comment:
+
+@example
+/*
+
+?O.           ?Ob
+.X*           aX*
+?O.           ?Oc
+
+:8,C,wedge_helper
+*/
+@end example
+
+The image on the left is the actual pattern. On the right we've taken
+this image and added letters to label @code{apos}, @code{bpos}, and
+@code{cpos}. The position of *, the point where GNU Go will move if the
+pattern is adopted, is passed through the parameter @code{move}.
+
+@example
+int 
+wedge_helper(ARGS)
+@{
+  int apos, bpos, cpos;
+  int other = OTHER_COLOR(color);
+  int success = 0;
+  
+  apos = OFFSET(0, -2);
+  bpos = OFFSET(-1, 0);
+  cpos = OFFSET(1, 0);
+
+  if (TRYMOVE(move, color)) @{
+    if (TRYMOVE(apos, other)) @{
+      if (board[apos] == EMPTY || attack(apos, NULL))
+        success = 1;
+      else if (TRYMOVE(bpos, color)) @{
+        if (!safe_move(cpos, other))
+          success = 1;
+        popgo();
+      @}
+      popgo();
+    @}
+    popgo();
+  @}
+  
+  return success;
+@}
+
+@end example
+
+The @code{OFFSET} lines tell GNU Go the positions of the three stones at
+@samp{a}, @samp{b}, and @samp{c}. To decide whether the pattern
+guarantees a connection, we do some reading. First we use the
+@code{TRYMOVE} macro to place an @samp{O} at @samp{move} and let
+@samp{X} draw back to @samp{a}. Then we ask whether @samp{O} can capture
+these stones by calling @code{attack()}. The test if there is a stone at
+@samp{a} before calling @code{attack()} is in this position not really
+necessary but it's good practice to do so, because if the attacked stone
+should happen to already have been captured while placing stones, GNU Go
+would crash with an assertion failure.
+
+If this attack fails we let @samp{O} connect at @samp{b} and use the
+@code{safe_move()} function to examine whether a cut by @samp{X} at
+@samp{c} could be immediately captured. Before we return the result we
+need to remove the stones we placed from the reading stack. This is done
+with the function @code{popgo()}.
+
+@node  Autohelpers and Constraints
+@section Autohelpers and Constraints
+
+@cindex generation of helper functions
+@cindex Autohelpers
+
+In addition to the hand-written helper functions in @file{helpers.c}, GNU Go
+can automatically generate helper functions from a diagram with labels
+and an expression describing a constraint. The constraint diagram,
+specifying the labels, is placed below the @samp{:} line and the constraint
+expression is placed below the diagram on line starting with a @samp{;}.
+Constraints can only be used to accept or reject a pattern. If the
+constraint evaluates to zero (false) the pattern is rejected,
+otherwise it's accepted (still conditioned on passing all other tests
+of course). To give a simple example we consider a connection pattern.
+
+@example
+
+Pattern Conn311
+
+O*.
+?XO
+
+:8,C,NULL
+
+O*a
+?BO
+
+;oplay_attack_either(*,a,a,B)
+
+@end example
+
+Here we have given the label @samp{a} to the empty spot to the right of
+the considered move and the label @samp{B} to the @samp{X} stone in the
+pattern. In addition to these, @samp{*} can also be used as a label. A
+label may be any lowercase or uppercase ascii letter except @code{OoXxt}. By
+convention we use uppercase letters for @samp{X} stones and lowercase for @samp{O}
+stones and empty intersections. When labeling a stone that's part of a
+larger string in the pattern, all stones of the string should be marked
+with the label. (These conventions are not enforced by the pattern
+compiler, but to make the database consistent and easy to read they
+should be followed.)
+
+The labels can now be used in the constraint expression. In this example
+we have a reading constraint which should be interpreted as "Play an
+@samp{O} stone at @samp{*} followed by an @samp{X} stone at
+@samp{a}. Accept the pattern if @samp{O} now can capture either at
+@samp{a} or at @samp{B} (or both strings)."
+
+The functions that are available for use in the constraints are listed
+in the section `Autohelpers Functions' below. Technically the
+constraint expression is transformed by mkpat into an automatically
+generated helper function in @file{patterns.c}. The functions in the
+constraint are replaced by C expressions, often functions calls. In
+principle any valid C code can be used in the constraints, but there
+is in practice no reason to use anything more than boolean and
+arithmetic operators in addition to the autohelper functions.
+Constraints can span multiple lines, which are then concatenated.
+
+@node  Autohelper Actions
+@section Autohelper Actions
+
+@cindex autohelper actions
+
+As a complement to the constraints, which only can accept or reject a
+pattern, one can also specify an action to perform when the pattern
+has passed all tests and finally has been accepted.
+
+Example:
+
+@example
+
+Pattern EJ4
+
+...*.     continuation
+.OOX.
+..XOX
+.....
+-----
+
+:8,Ed,NULL
+
+...*.     never play a here
+.OOX.
+.aXOX
+.....
+-----
+
+>antisuji(a)
+
+@end example
+
+The line starting with @samp{>} is the action line. In this case it tells
+the move generation that the move at a should not be considered,
+whatever move reasons are found by other patterns. The action line
+uses the labels from the constraint diagram. Both constraint and
+action can be used in the same pattern. If the action only needs to
+refer to @samp{*}, no constraint diagram is required. Like constraints,
+actions can span multiple lines.
+
+Here is a partial list of the autohelper macros which are typically
+called from action lines. This list is not complete. If you cannot find an
+autohelper macro in an action line in this list, consult @file{mkpat.c} to
+find out what function in the engine is actually called. If no
+macro exists which does what you want, you can add macros by
+editing the list in @file{mkpat.c}.
+
+@itemize
+@item @code{antisuji(a);}
+@quotation
+Mark @samp{a} as an antisuji, that is, a move that must never
+be played.
+@end quotation
+@item @code{replace(a,*)}
+@quotation
+This is appropriate if the move at @samp{*} is definitely better
+than the move at @samp{a}. The macro adds a point redistribution rule. Any 
+points which are assigned to @samp{a} during the move generation
+by any move reason are redistributed to @samp{*}.
+@end quotation
+@item @code{prevent_attack_threat(a)}
+@quotation
+Add a reverse followup value because the opponent's move here
+would threaten to capture @samp{a}.
+@end quotation
+@item @code{threaten_to_save(a)}
+@quotation
+Add a followup value because the move at @samp{*} threatens to
+rescue the dead string at @samp{a}.
+@end quotation
+@item @code{defend_against_atari(a)}
+@quotation
+Estimate the value of defending the string @samp{a} which can be put into
+atari and add this as a reverse followup value.
+@end quotation
+@item @code{add_defend_both_move(a,b);}
+@quotation
+@end quotation
+@item @code{add_cut_move(c,d);}
+@quotation
+Add to the move reasons that the move at @samp{*} threatens to cut
+@samp{c} and @samp{d}.
+@end quotation
+@end itemize
+
+@node  Autohelper Functions
+@section Autohelper Functions
+
+The autohelper functions are translated into C code by the program in
+@file{mkpat.c}. To see exactly how the functions are implemented,
+consult the autohelper function definitions in that file. Autohelper
+functions can be used in both constraint and action lines.
+
+@example
+
+@code{lib(x)}
+@code{lib2(x)}
+@code{lib3(x)}
+@code{lib4(x)}
+
+@end example
+
+Number of first, second, third, and fourth order liberties of a worm
+respectively. @xref{Worms and Dragons}, the documentation on worms for
+definitions.
+
+@example
+
+@code{xlib(x)}
+@code{olib(x)}
+
+@end example
+
+The number of liberties that an enemy or own stone, respectively,
+would obtain if played at the empty intersection @samp{x}.
+
+@example
+@code{xcut(x)}
+@code{ocut(x)}
+@end example
+
+Calls @code{cut_possible} (@pxref{General Utilities}) to determine
+whether @samp{X} or @samp{O} can cut at the empty intersection @samp{x}. 
+
+@example
+@code{ko(x)}
+@end example
+
+True if @samp{x} is either a stone or an empty point involved in a ko
+position.
+
+@example
+@code{status(x)}
+@end example 
+
+The matcher status of a dragon. status(x) returns an integer that can have the
+values @code{ALIVE}, @code{UNKNOWN}, @code{CRITICAL}, or @code{DEAD}
+(@pxref{Worms and Dragons}).
+
+@example
+@code{alive(x)}
+@code{unknown(x)}
+@code{critical(x)}
+@code{dead(x)}
+@end example
+
+Each function true if the dragon has the corresponding matcher status and
+false otherwise (@pxref{Worms and Dragons}).
+
+@example
+@code{status(x)}
+@end example
+
+Returns the status of the dragon at @samp{x} (@pxref{Worms and Dragons}).
+
+@example
+@code{genus(x)}
+@end example
+
+The number of eyes of a dragon. It is only meaningful to compare this
+value against 0, 1, or 2.
+
+@example
+
+@code{xarea(x)}
+@code{oarea(x)}
+@code{xmoyo(x)}
+@code{omoyo(x)}
+@code{xterri(x)}
+@code{oterri(x)}
+
+@end example
+
+These functions call @code{whose_territory()}, @code{whose_moyo()}
+and @code{whose_area()} (@pxref{Territory and Moyo}). For example
+@code{xarea(x)} evaluates to true if @samp{x} is either a living enemy stone
+or an empty point within the opponent's ``area''. The function @code{oarea(x)}
+is analogous but with respect to our stones and area.  The main difference
+between area, moyo, and terri is that area is a very far reaching kind of
+influence, moyo gives a more realistic estimate of what may turn in to
+territory, and terri gives the points that already are believed to be secure
+territory.
+
+@example
+@code{weak(x)}
+@end example
+
+True for a dragon that is perceived as weak.
+
+@example
+
+@code{attack(x)}
+@code{defend(x)}
+
+@end example
+
+Results of tactical reading. @code{attack(x)} is true if the worm can be
+captured, @code{defend(x)} is true if there also is a defending move. Please
+notice that @code{defend(x)} will return false if there is no attack on the
+worm.
+
+@example
+
+@code{safe_xmove(x)}
+@code{safe_omove(x)}
+
+@end example
+
+True if an enemy or friendly stone, respectively, can safely be played at
+@samp{x}. By safe it is understood that the move is legal and that it cannot
+be captured right away.
+
+@example
+
+@code{legal_xmove(x)}
+@code{legal_omove(x)}
+
+@end example
+
+True if an enemy or friendly stone, respectively, can legally be played at x.
+
+@example
+
+o_somewhere(x,y,z, ...)
+x_somewhere(x,y,z, ...)
+
+@end example
+
+True if O (respectively X) has a stone at one of the labelled vertices.
+In the diagram, these vertices should be marked with a @samp{?}.
+
+@example
+
+odefend_against(x,y)
+xdefend_against(x,y)
+
+@end example
+
+True if an own stone at @samp{x} would stop the enemy from safely playing at
+@samp{y}, and conversely for the second function.
+
+@example
+
+@code{does_defend(x,y)}
+@code{does_attack(x,y)}
+
+@end example
+
+True if a move at @samp{x} defends/attacks the worm at @samp{y}. For 
+defense a move of the same color as @samp{y} is tried and for attack a move of
+the opposite color.
+
+@example
+
+@code{xplay_defend(a,b,c,...,z)}
+@code{oplay_defend(a,b,c,...,z)}
+@code{xplay_attack(a,b,c,...,z)}
+@code{oplay_attack(a,b,c,...,z)}
+
+@end example
+
+These functions make it possible to do more complex reading
+experiments in the constraints. All of them work so that first the
+sequence of moves @samp{a},@samp{b},@samp{c},... is played through with
+alternating colors, starting with @samp{X} or @samp{O} as indicated by
+the name. Then it is tested whether the worm at @samp{z} can be attacked or
+defended, respectively. It doesn't matter who would be in turn to move,
+a worm of either color may be attacked or defended. For attacks the
+opposite color of the string being attacked starts moving and for
+defense the same color starts. The defend functions return true if the
+worm cannot be attacked in the position or if it can be attacked but
+also defended.  The attack functions return true if there is a way to
+capture the worm, whether or not it can also be defended. If there is no
+stone present at @samp{z} after the moves have been played, it is assumed that
+an attack has already been successful or a defense has already failed.
+If some of the moves should happen to be illegal, typically because it
+would have been suicide, the following moves are played as if nothing
+has happened and the attack or defense is tested as usual. It is assumed
+that this convention will give the relevant result without requiring a
+lot of special cases.
+
+The special label @samp{?} can be used to represent a tenuki.
+Thus @code{oplay_defend(a,?,b,c)} tries moves by @samp{O} at @samp{a} and
+@samp{b}, as if @samp{X} plays the second move in another part of
+the board, then asks if @samp{c} can be defended. The tenuki cannot
+be the first move of the sequence, nor does it need to be:
+instead of @code{oplay_defend(?,a,b,c)} you can use
+@code{xplay_defend(a,b,c)}.
+
+@example
+@code{xplay_defend_both(a,b,c,...,y,z)}
+@code{oplay_defend_both(a,b,c,...,y,z)}
+@code{xplay_attack_either(a,b,c,...,y,z)}
+@code{oplay_attack_either(a,b,c,...,y,z)}
+
+@end example
+
+These functions are similar to the previous ones. The difference is
+that the last *two* arguments denote worms to be attacked or defended
+simultaneously. Obviously @samp{y} and @samp{z} must have the same color. If either
+location is empty, it is assumed that an attack has been successful or
+a defense has failed. The typical use for these functions is in
+cutting patterns, where it usually suffices to capture either
+cutstone.
+
+The function @code{xplay_defend_both} plays alternate moves
+beginning with an @samp{X} at @samp{a}. Then it passes the last
+two arguments to @code{defend_both} in
+@file{engine/utils.c}. This function checks to determine
+whether the two strings can be simultaneously defended.
+
+The function @code{xplay_attack_either} plays alternate
+moves beginning with an @samp{X} move at @samp{a}. Then it passes
+the last two arguments to @code{attack_either} in
+@file{engine/utils.c}. This function looks for a move
+which captures at least one of the two strings. In its
+current implementation @code{attack_either} only looks
+for uncoordinated attacks and would thus miss a double
+atari.
+
+@example
+@code{xplay_connect(a,b,c,...,y,z)}
+@code{oplay_connect(a,b,c,...,y,z)}
+@code{xplay_disconnect(a,b,c,...,y,z)}
+@code{oplay_disconnect(a,b,c,...,y,z)}
+
+@end example
+
+The function @code{xplay_connect(a,b,c,...,y,z)} begins
+with an @samp{X} move at @samp{a}, then an @samp{O}
+move at @samp{b}, and so forth, then finally calls
+@code{string_connect()} to determine whether
+@samp{x} and @samp{y} can be connected. The other
+functions are similar (@pxref{Connection Reading}).
+
+@example
+
+@code{xplay_break_through(a,b,c,...,x,y,z)}
+@code{oplay_break_through(a,b,c,...,x,y,z)}
+
+@end example
+
+These functions are used to set up a position like
+
+@example
+
+.O.    .y.
+OXO    xXz
+
+@end example
+
+@noindent
+and @samp{X} aims at capturing at least one of @samp{x}, @samp{y}, and
+@samp{z}. If this succeeds @samp{1} is returned. If it doesn't, @samp{X}
+tries instead to cut through on either side and if this succeeds,
+@samp{2} is returned. Of course the same shape with opposite colors can
+also be used.
+
+Important notice: @samp{x}, @samp{y}, and @samp{z} must be given in the
+order they have in the diagram above, or any reflection and/or rotation
+of it.
+
+@example
+seki_helper(x)
+@end example
+
+Checks whether the string at @samp{x} can attack any surrounding
+string. If so, return false as the move to create a seki (probably)
+wouldn't work.
+
+@example
+threaten_to_save(x)
+@end example
+
+Calls @code{add_followup_value} to add as a move reason a conservative
+estimate of the value of saving the string @samp{x} by capturing one opponent
+stone.
+
+@example
+area_stone(x)
+@end example
+
+Returns the number of stones in the area around @samp{x}.
+
+@example
+area_space(x)
+@end example
+
+Returns the amount of space in the area around @samp{x}.
+
+@example
+@code{eye(x)}
+@code{proper_eye(x)}
+@code{marginal_eye(x)}
+@end example
+
+True if @samp{x} is an eye space for either color, a non-marginal eye space
+for either color, or a marginal eye space for either color,
+respectively.
+
+@example
+@code{antisuji(x)}
+@end example
+
+Tell the move generation that @samp{x} is a substandard move that never should
+be played.
+
+@example
+same_dragon(x,y)
+same_worm(x,y)
+@end example
+
+Return true if @samp{x} and @samp{y} are the same dragon or worm respectively.
+
+@example
+@code{dragonsize(x)}
+@code{wormsize(x)}
+@end example
+
+Number of stones in the indicated dragon or worm.
+
+@example
+@code{add_connect_move(x,y)}
+@code{add_cut_move(x,y)}
+@code{add_attack_either_move(x,y)}
+@code{add_defend_both_move(x,y)}
+@end example
+
+Explicitly notify the move generation about move reasons for the move
+in the pattern.
+
+@example
+@code{halfeye(x)}
+@end example
+
+Returns true if the empty intersection at @samp{x} is a half eye.
+
+@example
+@code{remove_attack(x)}
+@end example
+
+Inform the tactical reading that a supposed attack does in fact not
+work.
+
+@example
+@code{potential_cutstone(x)}
+@end example
+
+True if @code{cutstone2} field from worm data is larger than one. This
+indicates that saving the worm would introduce at least two new
+cutting points.
+
+@example
+@code{not_lunch(x,y)}
+@end example
+
+Prevents the misreporting of @samp{x} as lunch for @samp{y}.
+For example, the following pattern tells GNU Go that even
+though the stone at @samp{a} can be captured, it should not
+be considered ``lunch'' for the dragon at @samp{b}, because
+capturing it does not produce an eye:
+
+@example
+XO|          ba|
+O*|          O*|
+oo|          oo|
+?o|          ?o|
+
+> not_lunch(a,b)
+@end example
+
+@example
+@code{vital_chain(x)}
+@end example
+
+Calls @code{vital_chain} to determine whether capturing
+the stone at @samp{x} will result in one eye for an adjacent
+dragon. The current implementation just checks that the stone
+is not a singleton on the first line.
+
+@example
+@code{amalgamate(x,y)}
+@end example
+
+Amalgamate (join) the dragons at @samp{x} and @samp{y} (@pxref{Worms and Dragons}).
+
+@example
+@code{amalgamate_most_valuable(x,y,z)}
+@end example
+
+Called when @samp{x}, @samp{y}, @samp{z} point to three (preferably distinct)
+dragons, in situations such as this:
+
+@example
+
+.O.X
+X*OX
+.O.X
+
+@end example
+
+In this situation, the opponent can play at @samp{*}, preventing
+the three dragons from becoming connected. However @samp{O}
+can decide which cut to allow. The helper amalgamates the
+dragon at @samp{y} with either @samp{x} or @samp{z}, 
+whichever is largest.
+
+@example
+make_proper_eye(x)
+@end example
+
+This autohelper should be called when @samp{x} is an eyespace
+which is misidentified as marginal. It is reclassified as
+a proper eyespace (@pxref{Eye Space}).
+
+@example
+remove_halfeye(x)
+@end example
+
+Remove a half eye from the eyespace. This helper should not be run after
+@code{make_dragons} is finished, since by that time the eyespaces have
+already been analyzed.
+
+@example
+remove_eyepoint(x)
+@end example
+
+Remove an eye point. This function can only be used before the
+segmentation into eyespaces.
+
+@example
+@code{owl_topological_eye(x,y)}
+@end example
+
+Here @samp{x} is an empty intersection which may be an
+eye or half eye for some dragon, and @samp{y} is a 
+stone of the dragon, used only to determine the color
+of the eyespace in question. Returns the sum of the values
+of the diagonal intersections, relative to @samp{x}, as
+explained in @xref{Eye Topology}, equal to 4 or more if the
+eye at @samp{x} is false, 3 if it is a half eye, and 2 if it
+is a true eye. 
+
+@example
+@code{owl_escape_value(x)}
+@end example
+
+Returns the escape value at @samp{x}. This is only useful in owl
+attack and defense patterns.
+
+@node  Attack and Defense DB
+@section Attack and Defense Database
+
+The patterns in @file{attack.db} and @file{defense.db} are used to assist the
+tactical reading in finding moves that attacks or defends worms. The
+matching is performed during @code{make_worms()}, at the time when the
+tactical status of all worms is decided. None of the classes described
+above are useful in these databases, instead we have two other
+classes.
+
+@table @samp
+@item D
+For each @samp{O} worm in the pattern that can be tactically captured
+(@code{worm[m][n].attack_code != 0}), the move at @samp{*} is
+tried. If it is found to defend the stone, this is registered as a
+reason for the move @samp{*} and the defense point of the worm is set to
+@samp{*}.
+@item A
+For each @samp{X} worm in the pattern, it's tested whether the move
+at @samp{*} captures the worm. If that is the case, this is
+registered as a reason for the move at @samp{*}. The attack point of
+the worm is set to @samp{*} and if it wasn't attacked before, a
+defense is searched for.
+@end table
+
+Furthermore, @samp{A} patterns can only be used in @file{attack.db} and
+@samp{D} patterns only in @file{defense.db}. Unclassified patterns may
+appear in these databases, but then they must work through actions to be
+effective.
+
+@node  Connections Database
+@section The Connections Database
+
+@cindex connections database
+@cindex connection shapes database
+
+The patterns in @file{conn.db} are used for helping @code{make_dragons()}
+amalgamate worms into dragons and to some extent for modifying eye spaces.
+The patterns in this database use the classifications @samp{B}, 
+@samp{C}, and @samp{e}. @samp{B} patterns are used for finding cutting points,
+where amalgamation should not be performed, @samp{C} patterns are used for
+finding existing connections, over which amalgamation is to be done, and 
+@samp{e} patterns are used for modifying eye spaces and reevaluating lunches.
+There are also some patterns without classification, which use action lines to
+have an impact. These are matched together with the @samp{C} patterns. Further
+details and examples can be found in @xref{Worms and Dragons}.
+
+We will illustrate these databases by example. In this situation:
+
+@example
+XOO
+O.O
+...
+@end example
+@noindent
+@samp{X} cannot play safely at the cutting point, so the @samp{O} dragons
+are to be amalgamated. Two patterns are matched here:
+
+@example
+Pattern CC204
+
+O
+.
+O
+
+:+,C
+
+O
+A
+O
+
+;!safe_xmove(A) && !ko(A) && !xcut(A)
+
+Pattern CC205
+
+XO
+O.
+
+:\,C
+
+AO
+OB
+
+;attack(A) || (!safe_xmove(B) && !ko(B) && !xcut(B))
+@end example
+
+The constraints are mostly clear. For example the second
+pattern should not be matched if the @samp{X} stone cannot
+be attacked and @samp{X} can play safely at @samp{B}, or
+if @samp{B} is a ko. The constraint @code{!xcut(B)} means
+that connection has not previously been inhibited by 
+@code{find_cuts}. For example consider this situation:
+
+@example
+
+OOXX
+O.OX
+X..O
+X.OO
+@end example
+@noindent
+The previous pattern is matched here twice, yet @samp{X} can push
+in and break one of the connections. To fix this, we include
+a pattern:
+
+@example
+Pattern CB11
+
+?OX?
+O!OX
+?*!O
+??O?
+
+:8,B
+
+?OA?
+OaOB
+?*bO
+??O?
+
+; !attack(A) && !attack(B) && !xplay_attack(*,a,b,*) && !xplay_attack(*,b,a,*)
+@end example
+
+After this pattern is found, the @code{xcut} autohelper macro will return
+true at any of the points @samp{*}, @samp{a} and @samp{b}. Thus the
+patterns @code{CB204} and @code{CB205} will not be matched, and the dragons will
+not be amalgamated.
+
+@node Connection Functions
+@section Connections Functions
+
+Here are the public functions in @file{connections.c}.
+
+@itemize @bullet
+@item @code{static void cut_connect_callback(int m, int n, int color, 
+        struct pattern *pattern, int ll, void *data)}
+@findex cut_connect_callback
+@quotation
+Try to match all (permutations of) connection patterns at @code{(m,n)}.
+For each match, if it is a B pattern, set cutting point in worm
+data structure and make eye space marginal for the connection
+inhibiting entries of the pattern. If it is a @samp{C} pattern, amalgamate
+the dragons in the pattern.
+@end quotation
+@item @code{void find_cuts(void)}
+@findex find_cuts
+@quotation
+Find cutting points which should inhibit amalgamations and sever
+the adjacent eye space. This goes through the connection database
+consulting only patterns of type B. When such a function is found,
+the function @code{cut_connect_callback} is invoked.
+@end quotation
+@item @code{void find_connections(void)}
+@findex find_connections
+@quotation 
+Find explicit connection patterns and amalgamate the involved dragons.
+This goes through the connection database consulting patterns except those of
+type B, E or e. When such a function is found, the function
+@code{cut_connect_callback} is invoked.
+@end quotation
+@item void modify_eye_spaces1(void)
+@findex modify_eye_spaces1
+@quotation 
+Find explicit connection patterns and amalgamate the involved dragons.
+This goes through the connection database consulting only patterns
+of type E (@pxref{Connections Database}). When such a function is found, the
+function @code{cut_connect_callback} is invoked.  
+@end quotation
+@item void modify_eye_spaces1(void)
+@findex modify_eye_spaces1
+@quotation 
+Find explicit connection patterns and amalgamate the involved dragons.
+This goes through the connection database consulting only patterns
+of type e (@pxref{Connections Database}). When such a function is found, the
+function @code{cut_connect_callback} is invoked.  
+@end quotation
+@end itemize
+
+@node  Tuning
+@section Tuning the Pattern databases
+
+@cindex tuning the pattern database
+@cindex tuning the shapes database
+
+Since the pattern databases, together with the valuation of move
+reasons, decide GNU Go's personality, much time can be devoted to
+``tuning'' them. Here are some suggestions.
+
+If you want to experiment with modifying the pattern database, invoke
+with the @option{-a} option. This will cause every pattern to be evaluated,
+even when some of them may be skipped due to various optimizations.
+
+You can obtain a Smart Game Format (SGF) record of your game in at least
+two different ways. One is to use CGoban to record the game. You can
+also have GNU Go record the game in Smart Game Format, using the @option{-o}
+option. It is best to combine this with @option{-a}. Do not try to read the SGF
+file until the game is finished and you have closed the game
+window. This does not mean that you have to play the game out to its
+conclusion. You may close the CGoban window on the game and GNU Go
+will close the SGF file so that you can read it.
+
+If you record a game in SGF form using the @option{-o} option, GNU Go will add
+labels to the board to show all the moves it considered, with their
+values. This is an extremely useful feature, since one can see at a
+glance whether the right moves with appropriate weights are being
+proposed by the move generation.
+
+First, due to a bug of unknown nature, it occasionally happens
+that GNU Go will not receive the @code{SIGTERM} signal from CGoban that it
+needs to know that the game is over. When this happens, the SGF file
+ends without a closing parenthesis, and CGoban will not open the
+file. You can fix the file by typing:
+
+@example
+
+ echo ")" >>[filename]  
+
+@end example
+
+@noindent
+at the command line to add this closing parenthesis. Or you could
+add the ) using an editor.
+
+Move values exceeding 99 (these should be rare) can be displayed by
+CGoban but you may have to resize the window in order to see all three
+digits. Grab the lower right margin of the CGoban window and pull it
+until the window is large. All three digits should be visible.
+
+If you are playing a game without the @option{-o} option and you wish to
+analyze a move, you may still use CGoban's ``Save Game'' button to get
+an SGF file. It will not have the values of the moves labelled, of
+course.
+
+Once you have a game saved in SGF format, you can analyze any
+particular move by running:
+
+@example
+
+  gnugo -l [filename] -L [move number] -t -a -w
+
+@end example
+
+@noindent
+to see why GNU Go made that move, and if you make changes to the
+pattern database and recompile the program, you may ask GNU Go to
+repeat the move to see how the behavior changes. If you're using
+emacs, it's a good idea to run GNU Go in a shell in a buffer (M-x
+shell) since this gives good navigation and search facilities.
+
+Instead of a move number, you can also give a board coordinate to @option{-L}
+in order to stop at the first move played at this location. If you
+omit the @option{-L} option, the move after those in the file will be
+considered. 
+
+If a bad move is proposed, this can have several reasons. To begin
+with, each move should be valued in terms of actual points on the
+board, as accurately as can be expected by the program. If it's not,
+something is wrong. This may have two reasons. One possibility is that
+there are reasons missing for the move or that bogus reasons have been
+found. The other possibility is that the move reasons have been
+misevaluated by the move valuation functions. Tuning of patterns is
+with a few exceptions a question of fixing the first kind of problems.
+
+If there are bogus move reasons found, search through the trace output
+for the pattern that is responsible. (Some move reasons, e.g. most
+tactical attack and defense, do not originate from patterns. If no
+pattern produced the bogus move reason, it is not a tuning problem.)
+Probably this pattern was too general or had a faulty constraint. Try
+to make it more specific or correct bugs if there were any. If the
+pattern and the constraint looks right, verify that the tactical
+reading evaluates the constraint correctly. If not, this is either a
+reading bug or a case where the reading is too complicated for GNU Go.
+
+If a connecting move reason is found, but the strings are already
+effectively connected, there may be missing patterns in @file{conn.db}.
+Similarly, worms may be incorrectly amalgamated due to some too
+general or faulty pattern in @file{conn.db}. To get trace output from the
+matching of patterns in @file{conn.db} you need to add a second
+@option{-t} option.
+
+If a move reason is missing, there may be a hole in the database. It
+could also be caused by some existing pattern being needlessly
+specific, having a faulty constraint, or being rejected due to a
+reading mistake. Unless you are familiar with the pattern databases,
+it may be hard to verify that there really is a pattern missing. Look
+around the databases to try to get a feeling for how they are
+organized. (This is admittedly a weak point of the pattern databases,
+but the goal is to make them more organized with time.) If you decide
+that a new pattern is needed, try to make it as general as possible,
+without allowing incorrect matches, by using proper classification
+from among snOoXx and constraints. The reading functions can be put to
+good use. The reason for making the patterns as general as they can be
+is that we need a smaller number of them then, which makes the
+database much easier to maintain. Of course, if you need too
+complicated constraints, it's usually better to split the pattern.
+
+If a move has the correct set of reasons but still is misevaluated,
+this is usually not a tuning problem. There are, however, some
+possibilities to work around these mistakes with the use of patterns.
+In particular, if the territorial value is off because @code{delta_terri()}
+give strange results, the (min)terri and maxterri values can be set by
+patterns as a workaround. This is typically done by the endgame
+patterns, where we can know the (minimum) value fairly well from the
+pattern. If it should be needed, (min)value and maxvalue can be used
+similarly. These possibilities should be used conservatively though,
+since such patterns are likely to become obsolete when better (or at
+least different) functions for e.g. territory estimation are being
+developed.
+
+In order to choose between moves with the same move reasons, e.g.
+moves that connect two dragons in different ways, patterns with a
+nonzero shape value should be used. These should give positive shape
+values for moves that give good shape or good aji and negative values
+for bad shape and bad aji. Notice that these values are additive, so
+it's important that the matches are unique.
+
+Sente moves are indicated by the use of the pattern followup value.
+This can usually not be estimated very accurately, but a good rule is
+to be rather conservative. As usual it should be measured in terms of
+actual points on the board. These values are also additive so the same
+care must be taken to avoid unintended multiple matches.
+
+You can also get a visual display of the dragons using the @option{-T}
+option. The default GNU Go configuration tries to build a
+version with color support using either curses or the
+ansi escape sequences. You are more likely to find color
+support in rxvt than xterm, at least on many systems, so
+we recommend running:
+
+@example
+  gnugo -l [filename] -L [move number] -T
+@end example
+
+@noindent
+in an rxvt window. If you do not see a color display,
+and if your host is a GNU/Linux machine, try this again
+in the Linux console.
+
+Worms belonging to the same dragon are labelled with the same letters.
+The colors indicate the value of the field @code{dragon.safety}, which
+is set in @file{moyo.c}.
+
+@format
+Green:  GNU Go thinks the dragon is alive
+Yellow: Status unknown
+Blue:   GNU Go thinks the dragon is dead
+Red:    Status critical (1.5 eyes) or weak by the algorithm
+        in @file{moyo.c}
+@end format
+
+@cindex eliminate the randomness
+
+If you want to get the same game over and over again, you can
+eliminate the randomness in GNU Go's play by providing a fixed
+random seed with the @option{-r} option.
+
+
+@node PM Implementation
+@section Implementation
+
+@cindex implementation of pattern matching
+
+The pattern code in GNU Go is fairly straightforward conceptually, but
+because the matcher consumes a significant part of the time in
+choosing a move, the code is optimized for speed. Because of this
+there are implementation details which obscure things slightly.
+
+
+In GNU Go, the ascii @file{.db} files are precompiled into tables (see
+@file{patterns.h}) by a standalone program @file{mkpat.c}, and the resulting 
+@file{.c} files are compiled and linked into the main GNU Go executable.
+
+Each pattern is compiled to a header, and a sequence of elements,
+which are (notionally) checked sequentially at every position and
+orientation of the board. These elements are relative to the pattern
+'anchor' (or origin).  One @samp{X} or @samp{O} stone is (arbitrarily) chosen to
+represent the origin of the pattern. (We cannot dictate one or the
+other since some patterns contain only one colour or the other.)  All
+the elements are in co-ordinates relative to this position. So a
+pattern matches "at" board position @code{(m,n,o)} if the the pattern anchor
+stone is on @code{(m,n)}, and the other elements match the board when the
+pattern is transformed by transformation number @samp{o}. (See below for
+the details of the transformations, though these should not be
+necessary)
+
+
+@node  Symmetry & transformations, Details, PM Implementation, Patterns
+@section Symmetry and transformations
+
+@cindex symmetry and transformations
+@cindex symmetry and transformations of shapes
+
+In general, each pattern must be tried in each of 8 different
+permutations, to reflect the symmetry of the board. But some
+patterns have symmetries which mean that it is unnecessary
+(and therefore inefficient) to try all eight. The first
+character after the @samp{:} can be one of @samp{8},@samp{|},@samp{\},@samp{/},
+@samp{X}, @samp{-}, @samp{+}, representing the axes of symmetry. It can also
+be @samp{O}, representing symmetry under 180 degrees rotation.
+
+@format
+transformation   I    -    |     .     \    l    r     /
+                ABC  GHI  CBA   IHG   ADG  CFI  GDA   IFC
+                DEF  DEF  FED   FED   BEH  BEH  HEB   HEB
+                GHI  ABC  IHG   CBA   CFI  ADG  IFC   GDA
+
+                 a    b    c     d     e    f    g     h
+@end format
+
+Then if the pattern has the following symmetries, the
+following are true:
+
+@example
+
+|  c=a, d=b, g=e, h=f
+-  b=a, c=d, e=f, g=h
+\  e=a, g=b, f=c, h=d
+/  h=a, f=b, g=c, e=d
+O  a=d, b=c, e=h, f=g
+X  a=d=e=h, b=c=f=g
++  a=b=c=d, e=f=g=h
+
+@end example
+
+We can choose to use transformations a,d,f,g as the unique
+transformations for patterns with either @samp{|}, @samp{-}, @samp{\}, or
+@samp{/} symmetry.
+
+Thus we choose to order the transformations a,g,d,f,h,b,e,c and choose
+first 2 for @samp{X} and @samp{+}, the first 4 for @samp{|}, @samp{-},
+@samp{/}, and @samp{\}, the middle 4 for @samp{O}, and all 8 for
+non-symmetrical patterns.
+
+Each of the reflection operations (e-h) is equivalent to reflection
+about one arbitrary axis followed by one of the rotations (a-d).  We
+can choose to reflect about the axis of symmetry (which causes no
+net change) and can therefore conclude that each of e-h is
+equivalent to the reflection (no-op) followed by a-d.  This argument
+therefore extends to include @samp{-} and @samp{/} as well as @samp{|}
+and @samp{\}.
+
+@node  Details
+@section Implementation Details
+
+@cindex pattern matching optimization
+@cindex grid optimization
+
+@enumerate
+@item An entry in the pattern header states whether the anchor is an @samp{X} or
+an @samp{O}. This helps performance, since all transformations can be
+rejected at once if the anchor stone does not match. (Ideally, we
+could just define that the anchor is always @samp{O} or always @samp{X}, but some
+patterns contain no @samp{O} and some contain no @samp{X}.)
+
+@item The pattern header contains the size of the pattern (ie the
+co-ordinates of the top left and bottom right elements) relative to
+the anchor. This allows the pattern can be rejected quickly if there
+is not room for the pattern to fit around the anchor stone in a given
+orientation (ie it is too near the edge of the board).  The bounding
+box information must first be transformed like the elements before it
+can be tested, and after transforming, we need to work out where the
+top-left and bottom-right corners are.
+
+@item The edge constraints are implemented by notionally padding the
+pattern with rows or columns of @samp{?} until it is exactly 19 (or
+whatever the current board size is) elements wide or high. Then the
+pattern is quickly rejected by (ii) above if it is not at the edge. So
+the example pattern above is compiled as if it was written
+
+
+@example
+
+"example"
+.OO????????????????
+*XX????????????????
+o??????????????????
+:8,80
+
+@end example
+
+@item The elements in a pattern are sorted so that non-space
+elements are checked before space elements. It is hoped that,
+for most of the game, more squares are empty, and so the
+pattern can be more quickly rejected doing it this way.
+
+@item The actual tests are performed using an 'and-compare'
+sequence. Each board position is a 2-bit quantity.
+%00 for empty, %01 for @samp{O}, %10 for @samp{X}.
+We can test for an exact match by and-ing with %11 (no-op),
+then comparing with 0, 1 or 2. The test for @samp{o} is the
+same as a test for 'not-X', ie not %10. So and with %01
+should give 0 if it matches. Similarly @samp{x} is a test that
+bit 0 is not set.
+
+@end enumerate
+
+@node Grid optimization
+@section The ``Grid'' Optimization
+
+The comparisons between pattern and board are performed as 2-bit
+bitwise operations. Therefore they can be performed in parallel,
+16-at-a-time on a 32-bit machine.
+
+Suppose the board is layed out as follows :
+
+@example
+
+ .X.O....OO
+ XXXXO.....
+ .X..OOOOOO
+ X.X.......
+ ....X...O.
+
+@end example
+
+@noindent
+which is internally stored internally in a 2d array (binary)
+
+@example
+
+ 00 10 00 01 00 00 00 00 01 01
+ 10 10 10 10 01 00 00 00 00 00
+ 00 10 00 00 01 01 01 01 01 01
+ 10 00 10 00 00 00 00 00 00 00
+ 00 00 00 00 10 00 00 00 01 00
+
+@end example
+
+@noindent
+we can compile this to a composite array in which each element
+stores the state of a 4x4 grid of squares :
+
+@example
+
+ ????????  ????????  ???????? ...
+ ??001000  00100001  10000100
+ ??101010  10101010  10101001
+ ??001000  00100000  10000001
+
+ ??001000  00100001  ...
+ ??101010  10101010
+ ??001000  00100000
+ ??001000  10001000 
+
+...
+
+ ??100010  ...
+ ??000000
+ ????????
+ ????????
+
+@end example
+
+Where '??' is off the board.
+
+We can store these 32-bit composites in a 2d merged-board array,
+substituting the illegal value %11 for '??'.
+
+Similarly, for each pattern, mkpat produces appropriate 32-bit and-value
+masks for the pattern elements near the anchor. It is a simple matter
+to test the pattern with a similar test to (5) above, but for 32-bits
+at a time.
+
+@node  Joseki Compiler
+@section The Joseki Compiler
+
+@cindex joseki
+@cindex how GNU Go learns new joseki
+@cindex the joseki compiler
+@cindex teaching josekis to GNU Go
+
+GNU Go includes a joseki compiler in @file{patterns/joseki.c}. This processes
+an SGF file (with variations) and produces a sequence of patterns
+which can then be fed back into mkpat. The joseki database is currently in files
+in @file{patterns/} called @file{hoshi.sgf}, @file{komoku.sgf}, @file{sansan.sgf}, 
+@file{mokuhazushi.sgf} and @file{takamoku.sgf}.  This division can be revised
+whenever need arises.
+
+The SGF files are transformed into the pattern database @file{.db} format by
+the program in @file{joseki.c}. These files are in turn transformed into C
+code by the program in @file{mkpat.c} and the C files are compiled and linked
+into the GNU Go binary.
+
+Not every node in the SGF file contributes a pattern. The nodes which
+contribute patterns have the joseki in the upper right corner, with
+the boundary marked with a square mark and other information to determine
+the resulting pattern marked in the comments.
+
+The intention is that the move valuation should be able to choose
+between the available variations by normal valuation. When this fails
+the primary workaround is to use shape values to increase or decrease
+the value. It is also possible to add antisuji variations to forbid
+popular suboptimal moves. As usual constraints can be used, e.g. to
+condition a variation on a working ladder.
+
+The joseki format has the following components for each SGF node:
+
+@itemize @bullet
+@item
+A square mark (@code{SQ} or @code{MA} property) to decide how large part of the
+board should be included in the pattern.
+@item A move (@samp{W} or @samp{B} property) with the natural interpretation.
+If the square mark is missing or the move is a pass, no pattern is
+produced for the node.
+@item Optional labels (@code{LB} property), which must be a single letter each.
+If there is at least one label, a constraint diagram will be
+produced with these labels.
+@item A comment (@samp{C} property). As the first character it should have one of the
+following characters to decide its classification:
+@itemize @minus
+@item @samp{U} - urgent move
+@item @samp{S} or @samp{J} - standard move
+@item @samp{s} or @samp{j} - lesser joseki
+@item @samp{T} - trick move
+@item @samp{t} - minor joseki move (tenuki OK)
+@item @samp{0} - antisuji (@samp{A} can also be used)
+@end itemize
+The rest of the line is ignored, as is the case of the letter. If neither of
+these is found, it's assumed to be a standard joseki move.
+
+In addition to this, rows starting with the following characters are
+recognized:
+@itemize @minus
+@item @samp{#} - Comments. These are copied into the patterns file, above the diagram.
+@item @samp{;} - Constraints. These are copied into the patterns file, below the
+constraint diagram.
+@item  @samp{>} - Actions. These are copied into the patterns file, below the
+constraint diagram.
+@item @samp{:} - Colon line. This is a little more complicated, but the colon
+line of the produced patterns always start out with ":8,s" for
+transformation number and sacrifice pattern class (it usually
+isn't a sacrifice, but it's pointless spending time checking for
+tactical safety). Then a joseki pattern class character is
+appended and finally what is included on the colon line in the
+comment for the SGF node.
+@end itemize
+@end itemize
+
+Example: If the comment in the SGF file looks like
+
+@example
+F
+:C,shape(3)
+;xplay_attack(A,B,C,D,*)
+@end example
+
+@noindent
+the generated pattern will have a colon line
+
+@example
+:8,sjC,shape(3)
+@end example
+
+@noindent
+and a constraint
+
+@example
+;xplay_attack(A,B,C,D,*)
+@end example
+
+@node Ladders in Joseki
+@section Ladders in Joseki
+
+As an example of how to use autohelpers with the
+Joseki compiler, we consider an example where a Joseki
+is bad if a ladder fails. Assume we have the taisha and are
+considering connecting on the outside with the pattern
+
+@example
+--------+
+........|
+........|
+...XX...|
+...OXO..|
+...*O...|
+....X...|
+........|
+........|
+@end example
+
+But this is bad unless we have a ladder in our favor. To check this we
+add a constraint which may look like
+
+@example
+--------+
+........|
+........|
+...XX...|
+...OXO..|
+...*OAC.|
+....DB..|
+........|
+........|
+
+;oplay_attack(*,A,B,C,D)
+@end example
+
+In order to accept the pattern we require that the constraint on the
+semicolon line evaluates to true. This particular constraint has the
+interpretation "Play with alternating colors, starting with @samp{O}, 
+on the intersections @samp{*}, @samp{A}, @samp{B}, and @samp{C}. Then check
+whether the stone at @samp{D} can be captured." I.e. play to this position
+
+@example
+--------+
+........|
+........|
+...XX...|
+...OXO..|
+...OOXX.|
+....XO..|
+........|
+........|
+@end example
+
+@noindent
+and call @code{attack()} to see whether the lower @samp{X} stone can be
+captured.  This is not limited to ladders, but in this particular case the
+reading will of course involve a ladder. 
+
+The constraint diagram above with letters is how it looks in the @file{.db}
+file. The joseki compiler knows how to create these from labels in
+the SGF node. @file{Cgoban} has an option to create one letter labels,
+but this ought to be a common feature for SGF editors.
+
+Thus in order to implement this example in SGF, one would add labels
+to the four intersections and a comment:
+
+@example
+;oplay_attack(*,A,B,C,D)
+@end example
+
+The appropriate constraint (autohelper macro) will then be added
+to the Joseki @file{.db} file.
+
+@node Corner Matcher
+@section Corner Matcher
+
+@cindex implementation of pattern matching
+@cindex joseki
+@cindex corner matcher
+
+GNU Go uses a special matcher for joseki patterns.  It has certain constraints
+on the patterns it can match, but is much faster and takes far less space to
+store patterns than the standard matcher.
+
+Patterns used with corner matcher have to qualify the following conditions:
+
+@itemize @bullet
+@item They must be matchable only at a corner of the board (hence the name of
+the matcher).
+@item They can consist only of @samp{O}, @samp{X} and @samp{.} elements.
+@item Of all pattern values (@pxref{Pattern Values}), corner matcher only
+support @code{shape(x)}.  This is not because the matcher cannot handle other
+values in principle, just they are currently not used in joseki databases.
+@end itemize
+
+Corner matcher was specifically designed for joseki patterns and they of
+course satisfy all the conditions above.  With some modifications corner
+matcher could be used for fuseki patterns as well, but fullboard matcher
+does its work just fine.
+
+The main idea of the matcher is very same to the one of DFA matcher
+(@pxref{Pattern matching with DFA}): check all available patterns at once,
+not a single pattern at a time.  A modified version of DFA matcher could be
+used for joseki pattern matching, but its database would be very large.
+Corner matcher capitalizes on the fact that there are relatively few
+stones in each such pattern.
+
+Corner pattern database is organized into a tree.  Nodes of the tree are
+called ``variations''.  Variations represent certain sets of stones in a
+corner of the board.  Root variation corresponds to an empty corner and a
+step down the tree is equivalent to adding a stone to the corner.  Each
+variation has several properties:
+
+@itemize @minus
+@item stone position relative to the corner,
+@item a flag determining whether the stone color must be equal to the first
+matched stone color,
+@item number of stones in the corner area (see below) of the variation stone.
+@end itemize
+
+By corner area we define a rectangle which corners are the current corner of
+the board and the position of the stone (inclusive).  For instance, if the
+current board corner is A19 then corner area of a stone at C18 consists
+of A18, A19, B18, B19, C18 and C19.
+
+Variation which is a direct child of the root variation matches if there
+is any stone at the variation position and the stone is alone in its
+corner area.
+
+Variation at a deeper level of the tree matches if there is a stone of
+specified color in variation position and the number of stones in its
+corner area is equal to the number specified in variation structure.
+
+When a certain variation matches, all its children has to be checked
+recursively for a match.
+
+All leaf variations and some inner ones have patterns attached to them.
+For a pattern to match, it is required that its @emph{parent} variation
+matches.  In addition, it is checked that pattern is being matched for
+the appropriate color (using its variation ``stone color'' field) and
+that the number of stones in the area where the pattern is being matched
+is indeed equal to the number of stones in the pattern.  The ``stone
+position'' property of the pattern variation determines the move suggested
+by the pattern.
+
+Consider this joseki pattern which has four stones:
+
+@example
+------+
+......|
+......|
+.O*...|
+.XXO..|
+......|
+......|
+@end example
+
+To encode it for the corner matcher, we have to use five variations,
+each next being a child of previous:
+
+@multitable {Tree level} {Position} {``other''} {Number of stones}
+@item Tree level @tab Position @tab Color @tab Number of stones
+@item 1 @tab R16 @tab ``same'' @tab 1
+@item 2 @tab P17 @tab ``same'' @tab 1
+@item 3 @tab Q16 @tab ``other'' @tab 2
+@item 4 @tab P16 @tab ``other'' @tab 4
+@item 5 @tab Q17 @tab ``same'' @tab 1
+@end multitable
+
+The fifth variation should have an attached pattern.  Note that the stone
+color for the fifth variation is ``same'' because the first matched stone
+for this pattern is @samp{O} which stands for the stones of the player
+to whom moves are being suggested with @samp{*}.
+
+The tree consists of all variations for all patterns combined together.
+Variations for each patterns are sorted to allow very quick tree branch
+rejection and at the same time keep the database small enough.  More
+details can be found in comments in file @file{mkpat.c}
+
+Corner matcher resides in @file{matchpat.c} in two functions:
+@code{corner_matchpat()} and @code{do_corner_matchpat()}.  The former computes
+@code{num_stones[]} array which holds number of stones in corner areas of
+different intersections of the board for all possible transformations.
+@code{corner_matchpat()} also matches top-level variations.
+@code{do_corner_matchpat()} is responsible for recursive matching on the
+variation tree and calling callback function upon pattern match.
+
+Tree-like database for corner matcher is generated by @code{mkpat} program.
+Database generator consists of several functions, most important are:
+@code{corner_best_element()}, @code{corner_variation_new()},
+@code{corner_follow_variation()} and @code{corner_add_pattern()}.
+
+@node Editing Patterns
+@section Emacs Mode for Editing Patterns
+
+@cindex editing patterns
+@cindex editing pattern database
+
+If you use GNU Emacs (XEmacs might work too), you can try a special
+mode for editing GNU Go pattern databases.  The mode resides in
+@file{patterns/gnugo-db.el}.
+
+Copy the file to @file{emacs/site-lisp} directory.  You can then load
+the mode with @code{(require 'gnugo-db)}.  It makes sense to put this
+line into your configuration file (@file{~/.emacs}).  You can either
+use @command{gnugo-db-mode} command to switch to pattern editing mode,
+or use the following code snippet to make Emacs do this automatically
+upon opening a file with @file{.db} suffix:
+
+@example
+       (setq auto-mode-alist
+             (append
+              auto-mode-alist
+              '(("\\.db\\'" . gnugo-db-mode))))
+@end example
+
+Pattern editing mode provides the following features:
+
+@itemize @minus
+@item
+highlighting of keywords (@code{Pattern}, @code{goal_elements} and
+@code{callback_data}) and comments,
+
+@item
+making paragraphs equal to patterns (@kbd{M-h}, @kbd{M-@{}, @kbd{M-@}}
+and others operate on patterns),
+
+@item
+commands for pattern creation with automatic name selection (@kbd{C-c
+C-p}) and copying main diagram to constraint diagram (@kbd{C-c C-c}),
+
+@item
+automated indentation of constraints and side comments (pattern
+descriptions).
+@end itemize
diff --git a/doc/reading.texi b/doc/reading.texi
new file mode 100644 (file)
index 0000000..f93c876
--- /dev/null
@@ -0,0 +1,1153 @@
+@cindex Reading code
+@cindex Reading process
+@cindex Trying hypothetical moves
+@cindex Usage of the stack in reading
+@cindex reading DEPTH
+@cindex Depth of reading
+@cindex reading.c
+@cindex reading.h
+
+The process of visualizing potential moves done by you and your
+opponent to learn the result of different moves is called
+"reading". GNU Go does three distinct types of reading: @dfn{tactical
+reading} which typically is concerned with the life and death of
+individual strings, @dfn{Owl reading} which is concerned
+with the life and death of dragons, and @dfn{connection reading}.
+In this Chapter, we document
+the tactical reading code, which is in @file{engine/reading.c}.
+
+@menu
+* Reading Basics::               Reading Basics
+* Hashing::                      Hashing of positions
+* Persistent Cache::             Persistent Reading Cache
+* Ko::                           Ko handling
+* A Ko Example::                 A Ko Example
+* Another Ko Example::           Another Ko Example
+* Alternate Komaster Schemes::   Alternate Komaster Schemes
+* Superstrings::                 Superstrings
+* Debugging::                    Debugging the reading code
+* Connection Reading::           Connection Reading
+@end menu
+
+@node Reading Basics
+@section Reading Basics
+
+What we call @emph{Tactical Reading} is the analysis whether there is
+a direct capture of a single string, or whether there is a move to prevent
+such a direct capture.
+
+If the reading module finds out that the string can get captured, this
+answer should (usually) be trusted. However, if it says it can be defended,
+this does not say as much. It is often the case that such a string has
+no chance to make a life, but that it cannot be captured within the
+horizon (and the cutoff heuristics) of the tactical reading.
+
+The tactical reading is done by the functions in @file{engine/reading.c}.
+It is a minimax search that declares win for the attacker once he can
+physically take the string off board, whereas the defense is considered
+successful when the string has sufficiently many liberties. A string with
+five liberties is always considered alive. At higher depth within the
+search tree even fewer liberties cause GNU Go to give up the attack,
+@xref{depthparams}.
+
+The reading code makes use of a stack onto which board positions can
+be pushed. The parameter @code{stackp} is zero if GNU Go is
+examining the true board position; if it is higher than zero, then
+GNU Go is examining a hypothetical position obtained by playing
+several moves.
+
+The most important public reading functions are @code{attack} and
+@code{find_defense}. These are wrappers for functions @code{do_attack} and
+@code{do_find_defense} which are declared statically in @file{reading.c}. The
+functions @code{do_attack} and @code{do_find_defense} call each other
+recursively.
+
+@subsection Organization of the reading code
+
+The function @code{do_attack} and @code{do_find_defense} are wrappers
+themselves and call @code{attack1}, @code{attack2}, @code{attack3} or
+@code{attack4} resp.  @code{defend1}, @code{defend1}, @code{defend1}
+or @code{defend1} depending on the number of liberties.
+
+These are fine-tuned to generate and try out the moves in an efficient
+order. They generate a few moves themselves (mostly direct liberties
+of the string), and then call helper functions called @code{..._moves} 
+which suggest less obvious moves. Which of these functions get called
+depends on the number of liberties and of the current search depth.
+
+@subsection Return Codes
+@anchor{Return Codes}
+@cindex return codes
+@cindex reading return codes
+
+The return codes of the reading (and owl) functions and owl can
+be @code{0}, @code{KO_B}, @code{KO_A} or @code{WIN}. Each reading
+function determines whether a particular player (assumed to have the
+move) can solve a specific problem, typically attacking or defending
+a string.
+
+A return code of @code{WIN} means success, 0 failure, while @code{KO_A} and
+@code{KO_B} are success conditioned on ko. A function returns @code{KO_A}
+if the position results in ko and that the player to move
+will get the first ko capture (so the opponent has to make the
+first ko threat). A return code of @code{KO_B} means that the player
+to move will have to make the first ko threat.
+
+@anchor{Experimental Owl Extension}
+If GNU Go is compiled with the configure option
+@option{--enable-experimental-owl-ext} then the owl functions also have
+possible return codes of @code{GAIN} and @code{LOSS}. A code of @code{GAIN}
+means that the attack (or defense) does not succeed, but that in the process
+of trying to attack or defend, an opponent's worm is captured. A code
+of @code{LOSS} means that the attack or defense succeeds, but that another
+friendly worm dies during the attack or defense.
+
+@subsection Reading cutoff and depth parameters
+@anchor{depthparams}
+
+Depth of reading is controlled by the parameters @code{depth}
+and @code{branch_depth}. The @code{depth} has a default value
+@code{DEPTH} (in @file{liberty.h}), which is set to 16 in the
+distribution, but it may also be set at the command line using
+the @option{-D} or @option{--depth} option.  If @code{depth} is
+increased, GNU Go will be stronger and slower. GNU Go will read
+moves past depth, but in doing so it makes simplifying
+assumptions that can cause it to miss moves.
+
+Specifically, when @code{stackp > depth}, GNU Go assumes that as
+soon as the string can get 3 liberties it is alive. This
+assumption is sufficient for reading ladders.
+
+The @code{branch_depth} is typically set a little below @code{depth}.
+Between @code{branch_depth} and @code{depth}, attacks on strings with
+3 liberties are considered, but branching is inhibited, so fewer
+variations are considered.
+
+%@findex small_semeai
+%Currently the reading code does not try to defend a string by
+%attacking a boundary string with more than two liberties. Because
+%of this restriction, it can make oversights. A symptom of this is
+%two adjacent strings, each having three or four liberties, each
+%classified as @code{DEAD}. To resolve such situations, a function
+%@code{small_semeai()} (in @file{engine/semeai.c}) looks for such
+%pairs of strings and corrects their classification.
+
+The @code{backfill_depth} is a similar variable with a default 12. Below
+this depth, GNU Go will try "backfilling" to capture stones.
+For example in this situation:
+
+@example
+@group
+
+.OOOOOO.    on the edge of the board, O can capture X but
+OOXXXXXO    in order to do so he has to first play at a in
+.aObX.XO    preparation for making the atari at b. This is
+--------    called backfilling.
+
+@end group
+@end example
+
+Backfilling is only tried with @code{stackp <= backfill_depth}. The
+parameter @code{backfill_depth} may be set using the @option{-B}
+option.
+
+The @code{fourlib_depth} is a parameter with a default of only 7.
+Below this depth, GNU Go will try to attack strings with
+four liberties. The @code{fourlib_depth} may be set using the
+@option{-F} option.
+
+The parameter @code{ko_depth} is a similar cutoff. If
+@code{stackp<ko_depth}, the reading code will make experiments
+involving taking a ko even if it is not legal to do so (i.e., it
+is hypothesized that a remote ko threat is made and answered
+before continuation).  This parameter may be set using the
+@option{-K} option.
+
+@cindex reading.c
+
+@itemize @bullet
+@item @code{int attack(int str, int *move)}
+@findex attack
+@quotation
+Determines if the string at @code{str} can
+be attacked, and if so, @code{*move} returns the attacking move,
+unless @code{*movei} is a null pointer. (Use null pointers if
+you are interested in the result of the attack but not the
+attacking move itself.) Returns @code{WIN}, if the attack succeeds,
+0 if it fails, and @code{KO_A} or @code{KO_B} if the result depends on ko
+@ref{Return Codes}.
+@end quotation
+@findex find_defense
+@item @code{find_defense(int str, int *move)}
+@quotation 
+Attempts to find a move that will save the string at @code{str}. It
+returns true if such a move is found, with @code{*move} the location
+of the saving move (unless @code{*move} is a null pointer). It is not
+checked that tenuki defends, so this may give an erroneous answer if
+@code{!attack(str)}.  Returns @code{KO_A} or @code{KO_B} if the
+result depends on ko @xref{Return Codes}. 
+@end quotation
+@findex safe_move
+@item @code{safe_move(int str, int color)} :
+@quotation
+The function @code{safe_move(str, color)} checks whether a move at
+@code{str} is illegal or can immediately be captured. If @code{stackp==0}
+the result is cached. If the move only can be captured by a ko, it's
+considered safe. This may or may not be a good convention.
+@end quotation
+@end itemize
+
+@node Hashing
+@section Hashing of Positions
+
+@cindex Hashing of positions
+@cindex Reading optimisation
+@cindex Speedup of reading process
+@cindex Zobrist hashing algorithm
+@cindex Transposition table
+
+To speed up the reading process, we note that a position can be
+reached in several different ways.  In fact, it is a very common
+occurrence that a previously checked position is rechecked, often
+within the same search but from a different branch in the recursion
+tree. 
+
+This wastes a lot of computing resources, so in a number of places, we
+store away the current position, the function we are in, and which worm
+is under attack or to be defended.  When the search for this position
+is finished, we also store away the result of the search and which
+move made the attack or defense succeed.
+
+All this data is stored in a hash table, sometimes also called a
+transposition table, where Go positions are the key and results of the
+reading for certain functions and groups are the data. You can increase
+the size of the Hash table using the @option{-M} or @option{--memory}
+option @pxref{Invoking GNU Go}.
+
+The hash table is created once and for all at the beginning of
+the game by the function @code{hashtable_new()}. Although hash
+memory is thus allocated only once in the game, the table is
+reinitialized at the beginning of each move by a call to
+@code{hashtable_clear()} from @code{genmove()}.
+
+@menu
+* Hash Calculation::            Calculation of the hash value
+* Hash Organization::           Organization of the hash table
+* Hash Structures::             Structures in @file{hash.h}
+@end menu
+
+@node Hash Calculation
+@subsection Calculation of the hash value
+
+The hash algorithm is called Zobrist hashing, and is a standard
+technique for go and chess programming. The algorithm as used by us
+works as follows:
+
+@cindex go position
+@cindex position
+
+@enumerate
+@item First we define a @dfn{go position}.  This positions consists of
+@itemize @bullet
+@item the actual board, i.e. the locations and colors of the stones
+@item A @dfn{ko point}, if a ko is going on.  The ko point is defined as
+the empty point where the last single stone was situated before
+it was captured.
+@end itemize
+
+It is not necessary to specify the color to move (white or black)
+as part of the position. The reason for this is that read results
+are stored separately for the various reading functions such as
+@code{attack3}, and it is implicit in the calling function which
+player is to move.
+
+@item For each location on the board we generate random numbers:
+@itemize @bullet
+@item A number which is used if there is a white stone on this location
+@item A number which is used if there is a black stone on this location
+@item A number which is used if there is a ko on this location
+@end itemize
+
+These random numbers are generated once at initialization time and
+then used throughout the life time of the hash table.
+
+@item The hash key for a position is the XOR of all the random numbers
+which are applicable for the position (white stones, black stones, and
+ko position).
+@end enumerate
+
+@node Hash Organization
+@subsection Organization of the hash table
+
+The hash table consists of 3 parts:
+
+@cindex Hash node
+@cindex Read result
+
+@itemize @bullet
+@item An area which contains so called @dfn{Hash Nodes}. Each hash node
+contains:
+@itemize @minus
+@item A go position as defined above.
+@item A computed hash value for the position
+@item A pointer to Read Results (see below)
+@item A pointer to another hash node.
+@end itemize
+
+@item An area with so called Read Results.  These are used to store
+which function was called in the go position, which string was
+under attack or to be defended, and the result of the reading.
+
+Each Read Result contains: 
+@itemize @minus
+@item the function ID (an int between 0 and 255), the position of the
+string under attack and a depth value, which is used to
+determine how deep the search was when it was made, packed into
+one 32 bit integer. 
+@item The result of the search (a numeric value) and a position to
+play to get the result packed into one 32 bit integer. 
+@item A pointer to another Read Result.
+@end itemize
+
+@item An array of pointers to hash nodes.  This is the hash table
+proper.
+
+@end itemize
+
+When the hash table is created, these 3 areas are allocated using
+@code{malloc()}.  When the hash table is populated, all contents are taken
+from the Hash nodes and the Read results. No further allocation is
+done and when all nodes or results are used, the hash table is full.
+Nothing is deleted from the hash table except when it is totally
+emptied, at which point it can be used again as if newly initialized.
+
+@findex hashtable_search
+When a function wants to use the hash table, it looks up the current
+position using @code{hashtable_search()}. If the position doesn't already
+exist there, it can be entered using
+
+@findex hashtable_enter_position
+@code{hashtable_enter_position()}.  
+
+@findex hashtable_enter_position
+Once the function has a pointer to the hash node containing a
+function, it can search for a result of a previous search using
+@code{hashnode_search()}.  If a result is found, it can be used, and
+if not, a new result can be entered after a search using 
+@findex hashnode_new_result
+@code{hashnode_new_result()}.
+
+Hash nodes which hash to the same position in the hash table
+(collisions) form a simple linked list.  Read results for the same
+position, created by different functions and different attacked or
+defended strings also form a linked list.
+
+This is deemed sufficiently efficient for now, but the representation
+of collisions could be changed in the future.  It is also not
+determined what the optimum sizes for the hash table, the number of
+positions and the number of results are.
+
+@node Hash Structures
+@subsection Hash Structures
+
+The basic hash structures are declared in @file{engine/hash.h} and
+@file{engine/cache.c}
+
+@example
+typedef struct hashposition_t @{
+  Compacttype  board[COMPACT_BOARD_SIZE];
+  int          ko_pos;
+@} Hashposition;
+@end example
+
+Represents the board and optionally the location of a ko,
+which is an illegal move. The player whose move is next
+is not recorded.
+
+@example
+typedef struct @{
+  Hashvalue     hashval;
+  Hashposition  hashpos;
+@} Hash_data;
+@end example
+
+Represents the return value of a function (@code{hashval}) and
+the board state (@code{hashpos}).
+
+@example
+typedef struct read_result_t @{
+  unsigned int data1;  
+  unsigned int data2;
+
+  struct read_result_t *next;
+@} Read_result;
+@end example
+
+The data1 field packs into 32 bits the following fields:
+
+@example
+
+komaster:  2 bits (EMPTY, BLACK, WHITE, or GRAY)
+kom_pos : 10 bits (allows MAX_BOARD up to 31)
+routine :  4 bits (currently 10 different choices)
+str1    : 10 bits
+stackp  :  5 bits
+
+@end example
+
+The data2 field packs into 32 bits the following fields:
+
+@example
+
+status :   2 bits (0 free, 1 open, 2 closed)
+result1:   4 bits
+result2:   4 bits
+move   :  10 bits
+str2   :  10 bits
+
+@end example
+
+The @code{komaster} and @code{(kom_pos)} field are
+documented in @xref{Ko}.
+
+When a new result node is created, 'status' is set to 1 'open'.
+This is then set to 2 'closed' when the result is entered. The main
+use for this is to identify open result nodes when the hashtable is
+partially cleared. Another potential use for this field is to
+identify repeated positions in the reading, in particular local
+double or triple kos.
+
+@example
+typedef struct hashnode_t @{
+  Hash_data            key;
+  Read_result        * results;
+  struct hashnode_t  * next;
+@} Hashnode;
+@end example
+
+The hash table consists of hash nodes.  Each hash node consists of
+The hash value for the position it holds, the position itself and
+the actual information which is purpose of the table from the start.
+
+There is also a pointer to another hash node which is used when
+the nodes are sorted into hash buckets (see below).
+
+@example
+typedef struct hashtable @{
+  size_t         hashtablesize;        /* Number of hash buckets */
+  Hashnode    ** hashtable;    /* Pointer to array of hashnode lists */
+
+  int            num_nodes;    /* Total number of hash nodes */
+  Hashnode     * all_nodes;    /* Pointer to all allocated hash nodes. */
+  int            free_node;    /* Index to next free node. */
+
+  int            num_results;  /* Total number of results */
+  Read_result  * all_results;  /* Pointer to all allocated results. */
+  int            free_result;  /* Index to next free result. */
+@} Hashtable;
+@end example
+
+The hash table consists of three parts:
+
+@itemize @bullet
+@item The hash table proper: a number of hash buckets with collisions
+being handled by a linked list.
+@item The hash nodes.  These are allocated at creation time and are 
+never removed or reallocated in the current implementation.
+@item The results of the searches.  Since many different searches can
+be done in the same position, there should be more of these than
+hash nodes.
+@end itemize
+
+@node Persistent Cache
+@section Persistent Reading Cache
+
+@cindex persistent cache
+@findex store_persistent_reading_cache
+@findex purge_persistent_reading_cache
+@findex purge_persistent_connection_cache
+@findex purge_persistent_breakin_cache
+@findex purge_persistent_owl_cache
+
+@findex search_persistent_reading_cache
+@findex store_persistent_reading_cache
+
+Some calculations can be safely saved from move to move. If the
+opponent's move is not close to our worm or dragon, we do not have to
+reconsider the life or death of that group on the next move. So
+the result is saved in a persistent cache. Persistent caches are used for
+are used in the engine for several types of read results.
+
+@itemize @bullet
+@item Tactical reading
+@item Owl reading
+@item Connection reading
+@item Breakin code
+@end itemize
+
+In this section we will discuss the persistent caching of tactical
+reading but the same principles apply to the other persistent caches.
+
+Persistent caching is an important performance feature. However it
+can lead to mistakes and debugging problems---situations where GNU
+Go generates the right move during debugging but plays a wrong move
+during a game. If you suspect a persistent cache effect you may
+try loading the sgf file with the @option{--replay} option and see if the
+mistake is repeated (@pxref{Invoking GNU Go}).
+
+The function @code{store_persistent_cache()} is called only
+by @code{attack} and @code{find_defense}, never from their
+static recursive counterparts @code{do_attack} and @code{do_defend}.
+The function @code{store_persistent_reading_cache()} attempts to
+cache the most expensive reading results. The function
+@code{search_persistent_reading_cache} attempts to retrieve a
+result from the cache.
+
+If all cache entries are occupied, we try to replace the least useful
+one. This is indicated by the score field, which is initially the
+number of nodes expended by this particular reading, and later
+multiplied by the number of times it has been retrieved from the
+cache.
+
+Once a (permanent) move is made, a number of cache entries immediately become
+invalid.  These are cleaned away by the function
+@code{purge_persistent_reading_cache().} To have a criterion
+for when a result may be purged, the function 
+@code{store_persistent_cache()} computes the
+@dfn{reading shadow} and @dfn{active area}. If a permanent
+move is subsequently played in the active area, the cached
+result is invalidated. We now explain this algorithm in detail.
+
+@cindex reading shadow
+
+The @dfn{reading shadow} is the concatenation of all moves in all
+variations, as well as locations where an illegal move has been tried.
+
+Once the read is finished, the reading shadow is expanded
+to the @dfn{active area} which may be cached. The 
+intention is that as long as no stones are played in the
+active area, the cached value may safely be used.
+
+Here is the algorithm used to compute the active area.
+This algorithm is in the function @code{store_persistent_reading_cache()}.
+The most expensive readings so far are stored in the persistent cache.
+
+@itemize @bullet
+@item
+The reading shadow and the string under attack are marked
+with the character @samp{1}. We also include the successful
+move, which is most often a part of the reading shadow, but
+sometimes not, for example with the function @code{attack1()}.
+
+@item
+Next the reading shadow is expanded by marking strings and
+empty vertices adjacent to the area marked @samp{1} with
+the character @samp{2}.
+
+@item
+Next vertices adjacent to empty vertices marked @samp{2} are
+labelled with the character @samp{3}.
+
+@item
+Next all vertices adjacent to previously marked vertices. These are
+marked @samp{-1} instead of the more logical @samp{4} because it
+is slightly faster to code this way.
+
+@item
+If the stack pointer is >0 we add the moves already played from the
+moves stack with mark 4.
+@end itemize
+
+@node Ko
+@section Ko Handling
+
+The principles of ko handling are the same for tactical reading and
+owl reading.
+
+We have already mentioned (@pxref{Reading Basics}) that GNU Go
+uses a return code of @code{KO_A} or @code{KO_B} if the result depends on
+ko. The return code of @code{KO_B} means that the position can be won
+provided the player whose move calls the function can come up
+with a sufficiently large ko threat. In order to verify this,
+the function must simulate making a ko threat and having it
+answered by taking the ko even if it is illegal. We call such an
+experimental taking of the ko a @dfn{conditional} ko capture.
+
+Conditional ko captures are accomplished by the function @code{tryko()}.
+This function is like @code{trymove()} except that
+it does not require legality of the move in question.
+
+The static reading functions, and the global functions @code{do_attack}
+and @code{do_find_defense} consult parameters @code{komaster},
+@code{kom_pos}, which are declared static in @file{board.c}. These mediate ko
+captures to prevent the occurrence of infinite loops. During
+reading, the komaster values are pushed and popped from a stack.
+
+Normally @code{komaster} is @code{EMPTY} but it can also be
+@samp{BLACK}, @samp{WHITE}, @code{GRAY_BLACK}, @code{GRAY_WHITE} or
+@code{WEAK_KO}. The komaster is set to @code{color} when @code{color} makes a
+conditional ko capture. In this case @code{kom_pos} is set to the location of
+the captured ko stone.
+
+If the opponent is komaster, the reading functions will not try to
+take the ko at @code{kom_pos}. Also, the komaster is normally not
+allowed to take another ko. The exception is a nested ko, characterized
+by the condition that the captured ko stone is at distance 1 both
+vertically and horizontally from @code{kom_pos}, which is the location
+of the last stone taken by the komaster. Thus in this situation:
+
+@example
+
+         .OX
+         OX*X
+        OmOX
+         OO
+
+@end example
+
+Here if @samp{m} is the location of @code{kom_pos}, then the move at 
+@samp{*} is allowed.
+
+The rationale behind this rule is that in the case where there are
+two kos on the board, the komaster cannot win both, and by becoming
+komaster he has already chosen which ko he wants to win. But in the
+case of a nested ko, taking one ko is a precondition to taking the
+other one, so we allow this.
+
+If the komaster's opponent takes a ko, then both players have taken one ko. In
+this case @code{komaster} is set to @code{GRAY_BLACK} or @code{GRAY_WHITE} and
+after this further ko captures are even further restricted.
+
+If the ko at @code{kom_pos} is filled, then the komaster reverts to
+@code{EMPTY}.
+
+In detail, the komaster scheme is as follows. Color @samp{O} is to move.
+This scheme is known as scheme 5 since in versions of GNU Go through
+3.4, several different schemes were included.
+
+@itemize @bullet
+@item 1. Komaster is EMPTY.
+@itemize @minus
+@item 1a. Unconditional ko capture is allowed.
+@quotation
+Komaster remains EMPTY if previous move was not a ko capture.
+Komaster is set to WEAK_KO if previous move was a ko capture
+and kom_pos is set to the old value of board_ko_pos.
+@end quotation
+@item 1b) Conditional ko capture is allowed.
+@quotation
+Komaster is set to O and kom_pos to the location of the ko, where a stone was
+just removed.
+@end quotation
+@end itemize
+@item 2. Komaster is O:
+@itemize @minus
+@item 2a) Only nested ko captures are allowed. Kom_pos is moved to the
+new removed stone.
+@item 2b) If komaster fills the ko at kom_pos then komaster reverts to
+EMPTY.
+@end itemize
+@item 3. Komaster is X:
+@quotation
+Play at kom_pos is not allowed. Any other ko capture
+is allowed. If O takes another ko, komaster becomes GRAY_X.
+@end quotation
+@item  4. Komaster is GRAY_O or GRAY_X:
+@quotation
+Ko captures are not allowed. If the ko at kom_pos is
+filled then the komaster reverts to EMPTY.
+@end quotation
+@item 5. Komaster is WEAK_KO:
+@itemize @minus
+@item 5a) After a non-ko move komaster reverts to EMPTY.
+@item 5b) Unconditional ko capture is only allowed if it is nested ko capture.
+@quotation
+Komaster is changed to WEAK_X and kom_pos to the old value of
+board_ko_pos.
+@end quotation
+@item 5c) Conditional ko capture is allowed according to the rules of 1b.
+@end itemize
+@end itemize
+
+@node A Ko Example
+@section A Ko Example
+
+To see the komaster scheme in action, consider this position
+from the file @file{regressions/games/life_and_death/tripod9.sgf}.
+We recommend studying this example by examining the variation file
+produced by the command:
+
+@example
+  gnugo -l tripod9.sgf --decide-dragon C3 -o vars.sgf
+@end example
+
+In the lower left hand corner, there are kos at A2 and B4.
+Black is unconditionally dead because if W wins either ko 
+there is nothing B can do.
+
+@example
+@group
+
+ 8 . . . . . . . .
+ 7 . . O . . . . .
+ 6 . . O . . . . .
+ 5 O O O . . . . .
+ 4 O . O O . . . .
+ 3 X O X O O O O .
+ 2 . X X X O . . .
+ 1 X O . . . . . .
+   A B C D E F G H
+
+@end group
+@end example
+
+This is how the komaster scheme sees this. B (i.e. X) starts by 
+taking the ko at B4. W replies by taking the ko at A1. The board 
+looks like this:
+
+@example
+@group
+
+ 8 . . . . . . . .
+ 7 . . O . . . . .
+ 6 . . O . . . . .
+ 5 O O O . . . . .
+ 4 O X O O . . . .
+ 3 X . X O O O O .
+ 2 O X X X O . . .
+ 1 . O . . . . . .
+   A B C D E F G H
+
+@end group
+@end example
+
+Now any move except the ko recapture (currently illegal)
+at A1 loses for B, so B retakes the ko and becomes komaster.
+The board looks like this:
+
+@example
+@group
+
+ 8 . . . . . . . .         komaster: BLACK
+ 7 . . O . . . . .         kom_pos: A2
+ 6 . . O . . . . .
+ 5 O O O . . . . .
+ 4 O X O O . . . .
+ 3 X . X O O O O .
+ 2 . X X X O . . .
+ 1 X O . . . . . .
+   A B C D E F G H
+
+@end group
+@end example
+
+W takes the ko at B3 after which the komaster is @code{GRAY} and
+ko recaptures are not allowed.
+
+@example
+@group
+
+ 8 . . . . . . . .         komaster: GRAY
+ 7 . . O . . . . .         kom_pos: B4
+ 6 . . O . . . . .
+ 5 O O O . . . . .
+ 4 O . O O . . . .
+ 3 X O X O O O O .
+ 2 . X X X O . . .
+ 1 X O . . . . . .
+   A B C D E F G H
+
+@end group
+@end example
+
+Since B is not allowed any ko recaptures, there is nothing
+he can do and he is found dead. Thus the komaster scheme
+produces the correct result.
+
+
+@node Another Ko Example
+@section Another Ko Example
+
+We now consider an example to show why the komaster is reset
+to @code{EMPTY} if the ko is resolved in the komaster's favor. This
+means that the ko is filled, or else that is becomes no longer
+a ko and it is illegal for the komaster's opponent to play
+there.
+
+The position resulting under consideration is in the file
+@file{regressions/games/ko5.sgf}.  This is the position:
+
+@example
+@group
+ . . . . . . O O 8
+ X X X . . . O . 7
+ X . X X . . O . 6
+ . X . X X X O O 5
+ X X . X . X O X 4
+ . O X O O O X . 3
+ O O X O . O X X 2
+ . O . X O X X . 1
+ F G H J K L M N
+@end group
+@end example
+
+We recommend studying this example by
+examining the variation file produced by the command:
+
+@example
+gnugo -l ko5.sgf --quiet --decide-string L1 -o vars.sgf
+@end example
+
+The correct resolution is that H1 attacks L1 unconditionally while K2
+defends it with ko (code @code{KO_A}).
+
+After Black (X) takes the ko at K3, white can do nothing
+but retake the ko conditionally, becoming komaster. B cannot
+do much, but in one variation he plays at K4 and W takes
+at H1. The following position results:
+
+@example
+@group
+ . . . . . . O O 8
+ X X X . . . O . 7
+ X . X X . . O . 6
+ . X . X X X O O 5
+ X X . X X X O X 4
+ . O X O O O X . 3
+ O O X O . O X X 2
+ . O O . O X X . 1
+ F G H J K L M N
+@end group
+@end example
+
+Now it is important the @samp{O} is no longer komaster. Were @samp{O}
+still komaster, he could capture the ko at N3 and there would be
+no way to finish off B.
+
+
+@node Alternate Komaster Schemes
+@section Alternate Komaster Schemes
+
+The following alternate schemes have been proposed. It is assumed
+that @samp{O} is the player about to move.
+
+@subsection Essentially the 2.7.232 scheme.
+
+@itemize @bullet
+@item Komaster is EMPTY.
+@itemize @minus
+@item Unconditional ko capture is allowed. Komaster remains EMPTY.
+@item Conditional ko capture is allowed. Komaster is set to O and
+@code{kom_pos} to the location of the ko, where a stone was
+just removed.
+@end itemize
+@item Komaster is O:
+@itemize @minus
+@item Conditional ko capture is not allowed.
+@item Unconditional ko capture is allowed. Komaster parameters unchanged.
+@end itemize
+@item Komaster is X:
+@itemize @minus
+@item Conditional ko capture is not allowed.
+@item Unconditional ko capture is allowed except for a move at 
+@code{kom_pos}. Komaster parameters unchanged.
+@end itemize
+@end itemize
+
+@subsection Revised 2.7.232 version
+
+@itemize @bullet
+@item Komaster is EMPTY.
+@itemize @minus
+@item Unconditional ko capture is allowed. Komaster remains EMPTY.
+@item Conditional ko capture is allowed. Komaster is set to @samp{O} and
+@code{kom_pos} to the location of the ko, where a stone was
+just removed.
+@end itemize
+@item Komaster is @samp{O}:
+@itemize @minus
+@item Ko capture (both kinds) is allowed only if after playing the move,
+@code{is_ko(kom_pos, X)} returns false. In that case, 
+@code{kom_pos} is updated to the new ko position, i.e. the stone
+captured by this move.
+@end itemize
+@item Komaster is @samp{X}:
+@itemize @minus
+@item Conditional ko capture is not allowed.
+@item Unconditional ko capture is allowed except for a move at 
+@code{kom_pos}. Komaster parameters unchanged.
+@end itemize
+@end itemize
+
+@node Superstrings
+@section Superstrings
+
+A @emph{superstring} is an extended string, where the extensions are
+through the following kinds of connections:
+
+@enumerate
+@item Solid connections (just like ordinary string).
+@example
+  OO
+@end example
+@item Diagonal connection or one space jump through an intersection
+where an opponent move would be suicide or self-atari.
+@example
+@group
+  ...
+  O.O
+  XOX
+  X.X
+@end group
+@end example
+@item Bamboo joint.
+@example
+@group
+  OO
+  ..
+  OO
+@end group
+@end example
+@item Diagonal connection where both adjacent intersections are empty.
+@example
+@group
+  .O
+  O.
+@end group
+@end example
+@item Connection through adjacent or diagonal tactically captured stones.
+Connections of this type are omitted when the superstring code is
+called from @file{reading.c}, but included when the superstring code is
+called from @file{owl.c}.
+@end enumerate
+
+Like a dragon, a superstring is an amalgamation of strings, but it is
+a much tighter organization of stones than a dragon, and its purpose
+is different. Superstrings are encountered already in the tactical
+reading because sometimes attacking or defending an element of the
+superstring is the best way to attack or defend a string. This is
+in contrast with dragons, which are ignored during tactical reading.
+
+@node Debugging
+@section Debugging the reading code
+
+@cindex How to debug the reading code
+@cindex Debugging the reading code
+@cindex Reading code debugging tools
+
+The reading code searches for a path through the move tree to
+determine whether a string can be captured. We have a tool for
+investigating this with the @option{--decidestring} option. This may
+be run with or without an output file.
+
+Simply running 
+
+@example
+
+@command{gnugo -t -l [input file name] -L [movenumber] --decidestring [location]}
+
+@end example
+
+@noindent
+will run @code{attack()} to determine whether the string can be captured.
+If it can, it will also run @code{find_defense()} to determine whether or
+not it can be defended. It will give a count of the number of
+variations read. The @option{-t} is necessary, or else GNU Go will not
+report its findings.
+
+If we add @option{-o @var{output file}} GNU Go will produce
+an output file with all variations considered. The variations are
+numbered in comments.
+
+This file of variations is not very useful without a way of
+navigating the source code. This is provided with the GDB
+source file, listed at the end. You can source this from GDB,
+or just make it your GDB init file.
+
+@cindex GDB
+
+If you are using GDB to debug GNU Go you may find it less
+confusing to compile without optimization. The optimization
+sometimes changes the order in which program steps are
+executed. For example, to compile @file{reading.c} without optimization,
+edit @file{engine/Makefile} to remove the string @code{-O2} from
+the file, touch @file{engine/reading.c} and make. Note that the
+Makefile is automatically generated and may get overwritten
+later.
+
+If in the course of reading you need to analyze a result where
+a function gets its value by returning a cached position from
+the hashing code, rerun the example with the hashing turned off
+by the command line option @option{--hash 0}. You should get the same
+result. (If you do not, please send us a bug report.) Don't
+run @option{--hash 0} unless you have a good reason to, since it 
+increases the number of variations. 
+
+With the source file given at the end of this document loaded,
+we can now navigate the variations. It is a good idea to use
+cgoban with a small @option{-fontHeight}, so that the
+variation window takes in a big picture. (You can resize the
+board.)
+
+Suppose after perusing this file, we find that variation 17 is
+interesting and we would like to find out exactly what is
+going on here. 
+
+The macro 'jt n' will jump to the n-th variation.
+
+@example
+
+(gdb) set args -l [filename] -L [move number] --decidestring [location]
+(gdb) tbreak main
+(gdb) run
+(gdb) jt 17
+
+@end example
+
+@noindent
+will then jump to the location in question. 
+
+Actually the attack variations and defense variations are numbered
+separately. (But @code{find_defense()} is only run if @code{attack()} succeeds,
+so the defense variations may or may not exist.) It is redundant to
+have to tbreak main each time. So there are two macros avar and dvar.
+
+@example
+
+(gdb) avar 17
+
+@end example
+
+@noindent
+restarts the program, and jumps to the 17-th attack variation.
+
+@example
+
+(gdb) dvar 17
+
+@end example
+
+@noindent
+jumps to the 17-th defense variation. Both variation sets are
+found in the same sgf file, though they are numbered separately.
+
+Other commands defined in this file:
+
+@example
+
+@cindex GNU Go's GDB commands 
+
+@command{dump} will print the move stack.
+@command{nv} moves to the next variation
+@command{ascii i j} converts (i,j) to ascii
+
+#######################################################
+###############      .gdbinit file      ###############
+#######################################################
+
+# this command displays the stack
+
+define dump
+set dump_stack()
+end
+
+# display the name of the move in ascii
+
+define ascii
+set gprintf("%o%m\n",$arg0,$arg1)
+end
+
+# display the all information about a dragon
+
+define dragon
+set ascii_report_dragon("$arg0")
+end
+
+define worm
+set ascii_report_worm("$arg0")
+end
+
+# move to the next variation
+
+define nv
+tbreak trymove
+continue
+finish
+next
+end
+
+# move forward to a particular variation
+
+define jt
+while (count_variations < $arg0)
+nv
+end
+nv
+dump
+end
+
+# restart, jump to a particular attack variation
+
+define avar
+delete
+tbreak sgffile_decidestring
+run
+tbreak attack
+continue
+jt $arg0
+end
+
+# restart, jump to a particular defense variation
+
+define dvar
+delete
+tbreak sgffile_decidestring
+run
+tbreak attack
+continue
+finish
+next 3
+jt $arg0
+end
+
+@end example
+
+@node Connection Reading
+@section Connection Reading
+
+GNU Go does reading to determine if strings can be connected.  The algorithms
+for this are in @file{readconnect.c}. As with the reading code, the connection
+code is not pattern based.
+
+The connection code is invoked by the engine through the functions:
+
+@itemize
+@item @code{int string_connect(int str1, int str2, int *move)}
+@findex string_connect
+@quotation
+Returns @code{WIN} if @code{str1} and @code{str2} can be connected. 
+@end quotation
+@item @code{int disconnect(int str1, int str2, int *move)}
+@findex disconnect
+@quotation
+Returns @code{WIN} if @code{str1} and @code{str2} can be disconnected. 
+@end quotation
+@end itemize
+
+To see the connection code in action, you may try the
+following example.
+
+@example
+gnugo --quiet -l connection3.sgf --decide-connection M3/N7 -o vars.sgf
+@end example
+
+(The file @file{connection3.sgf} is in @file{regression/games}.)
+Examine the sgf file produced by this to see what kind of reading
+is done by the functions @code{string_connect()} and
+@code{string_disconnect()}, which are called by the function
+@code{decide_connection}. 
+
+One use of the connection code is used is through the autohelper macros
+@code{oplay_connect}, @code{xplay_connect}, @code{oplay_disconnect} and
+@code{xplay_disconnect} which are used in the connection databases.
+
diff --git a/doc/regression.texi b/doc/regression.texi
new file mode 100644 (file)
index 0000000..112685a
--- /dev/null
@@ -0,0 +1,334 @@
+The standard purpose of regression testing is to avoid getting the same
+bug twice. When a bug is found, the programmer fixes the bug and adds a
+test to the test suite. The test should fail before the fix and pass
+after the fix. When a new version is about to be released, all the tests
+in the regression test suite are run and if an old bug reappears, this
+will be seen quickly since the appropriate test will fail.
+
+The regression testing in GNU Go is slightly different. A typical test
+case involves specifying a position and asking the engine what move it
+would make. This is compared to one or more correct moves to decide
+whether the test case passes or fails. It is also stored whether a test
+case is expected to pass or fail, and deviations in this status signify
+whether a change has solved some problem and/or broken something
+else. Thus the regression tests both include positions highlighting some
+mistake being done by the engine, which are waiting to be fixed, and
+positions where the engine does the right thing, where we want to detect
+if a change breaks something.
+
+@menu
+* Regression Testing::          Regression Testing in GNU Go
+* Test Suites::                 Test Suites
+* Running the Regressions::     Running the Regression Tests
+* Running regress.pike::        Running regress.pike
+* Viewing with Emacs::          Viewing tests with Emacs
+* HTML Views::                  HTML Views
+@end menu
+
+@node Regression Testing
+@section Regression testing in GNU Go
+
+Regression testing is performed by the files in the @file{regression/}
+directory. The tests are specified as GTP commands in files with the
+suffix @file{.tst}, with corresponding correct results and expected
+pass/fail status encoded in GTP comments following the test. To run a
+test suite the shell scripts @file{test.sh}, @file{eval.sh}, and
+@file{regress.sh} can be used. There are also Makefile targets to do
+this. If you @command{make all_batches} most of the tests are run. The
+Pike script @file{regress.pike} can also be used to run all tests or a
+subset of the tests.
+
+Game records used by the regression tests are stored in the
+directory @file{regression/games/} and its subdirectories.
+
+@node Test Suites
+@section Test suites
+
+The regression tests are grouped into suites and stored in files as GTP
+commands. A part of a test suite can look as follows:
+@example
+@group
+# Connecting with ko at B14 looks best. Cutting at D17 might be
+# considered. B17 (game move) is inferior.
+loadsgf games/strategy25.sgf 61
+90 gg_genmove black
+#? [B14|D17]
+
+# The game move at P13 is a suicidal blunder.
+loadsgf games/strategy25.sgf 249
+95 gg_genmove black
+#? [!P13]
+
+loadsgf games/strategy26.sgf 257
+100 gg_genmove black
+#? [M16]*
+@end group
+@end example
+
+Lines starting with a hash sign, or in general anything following a hash
+sign, are interpreted as comments by the GTP mode and thus ignored by
+the engine. GTP commands are executed in the order they appear, but only
+those on numbered lines are used for testing. The comment lines starting
+with @code{#?} are magical to the regression testing scripts and
+indicate correct results and expected pass/fail status. The string
+within brackets is matched as a regular expression against the response
+from the previous numbered GTP command. A particular useful feature of
+regular expressions is that by using @samp{|} it is possible to specify
+alternatives. Thus @code{B14|D17} above means that if either @code{B14}
+or @code{D17} is the move generated in test case 90, it passes. There is
+one important special case to be aware of. If the correct result string
+starts with an exclamation mark, this is excluded from the regular
+expression but afterwards the result of the matching is negated. Thus
+@code{!P13} in test case 95 means that any move except @code{P13} is
+accepted as a correct result.
+
+In test case 100, the brackets on the @code{#?} line is followed by an
+asterisk. This means that the test is expected to fail. If there is no
+asterisk, the test is expected to pass. The brackets may also be
+followed by a @samp{&}, meaning that the result is ignored. This is
+primarily used to report statistics, e.g. how many tactical reading
+nodes were spent while running the test suite.
+
+@node Running the Regressions
+@section Running the Regression Tests
+
+@code{./test.sh blunder.tst} runs the tests in @file{blunder.tst} and
+prints the results of the commands on numbered lines, which may look
+like:
+
+@example
+1 E5
+2 F9
+3 O18
+4 B7
+5 A4
+6 E4
+7 E3
+8 A3
+9 D9
+10 J9
+11 B3
+12 C6
+13 C6
+@end example
+
+This is usually not very informative, however. More interesting is
+@code{./eval.sh blunder.tst} which also compares the results above
+against the correct ones in the test file and prints a report for each
+test on the form:
+
+@example
+1 failed: Correct '!E5', got 'E5'
+2 failed: Correct 'C9|H9', got 'F9'
+3 PASSED
+4 failed: Correct 'B5|C5|C4|D4|E4|E3|F3', got 'B7'
+5 PASSED
+6 failed: Correct 'D4', got 'E4'
+7 PASSED
+8 failed: Correct 'B4', got 'A3'
+9 failed: Correct 'G8|G9|H8', got 'D9'
+10 failed: Correct 'G9|F9|C7', got 'J9'
+11 failed: Correct 'D4|E4|E5|F4|C6', got 'B3'
+12 failed: Correct 'D4', got 'C6'
+13 failed: Correct 'D4|E4|E5|F4', got 'C6'
+@end example
+
+The result of a test can be one of four different cases:
+
+@itemize @bullet
+@item @code{passed}: An expected pass
+
+This is the ideal result.
+
+@item @code{PASSED}: An unexpected pass
+
+This is a result that we are hoping for when we fix a bug. An old test
+case that used to fail is now passing. 
+
+@item @code{failed}: An expected failure
+
+The test failed but this was also what we expected, unless we were
+trying to fix the particular mistake highlighted by the test case.
+These tests show weaknesses of the GNU Go engine and are good places to
+search if you want to detect an area which needs improvement.
+
+@item @code{FAILED}: An unexpected failure
+
+This should nominally only happen if something is broken by a
+change. However, sometimes GNU Go passes a test, but for the wrong
+reason or for a combination of wrong reasons.  When one of these reasons
+is fixed, the other one may shine through so that the test suddenly
+fails. When a test case unexpectedly fails, it is necessary to make a
+closer examination in order to determine whether a change has broken
+something.
+
+@end itemize
+
+If you want a less verbose report, @code{./regress.sh . blunder.tst}
+does the same thing as the previous command, but only reports unexpected
+results. The example above is compressed to
+
+@example
+3 unexpected PASS!
+5 unexpected PASS!
+7 unexpected PASS!
+@end example
+
+For convenience the tests are also available as makefile targets. For
+example, @code{make blunder} runs the tests in the blunder test suite by
+executing @code{eval.sh blunder.tst}. @code{make all_batches} runs all
+test suites in a sequence using the @code{regress.sh} script.
+
+@node Running regress.pike
+@section Running regress.pike
+
+A more powerful way to run regressions is with the script
+@file{regress.pike}. This requires that you have Pike
+(@url{http://pike.ida.liu.se}) installed.
+
+Executing @code{./regress.pike} without arguments will run all
+testsuites that @code{make all_batches} would run. The difference is
+that unexpected results are reported immediately when they have been
+found (instead of after the whole file has been run) and that statistics
+of time consumption and node usage is presented for each test file and
+in total.
+
+To run a single test suite do e.g. @code{./regress.pike nicklas3.tst} or
+@code{./regress.pike nicklas3}. The result may look like:
+@example
+nicklas3                                 2.96    614772    3322      469
+Total nodes: 614772 3322 469
+Total time: 2.96 (3.22)
+Total uncertainty: 0.00
+@end example
+The numbers here mean that the test suite took 2.96 seconds of processor
+time and 3.22 seconds of real time. The consumption of reading nodes was
+614772 for tactical reading, 3322 for owl reading, and 469 for
+connection reading. The last line relates to the variability of the
+generated moves in the test suite, and 0 means that none was decided by
+the randomness contribution to the move valuation. Multiple testsuites
+can be run by e.g. @code{./regress.pike owl ld_owl owl1}.
+
+It is also possible to run a single testcase, e.g. @code{./regress.pike
+strategy:6}, a number of testcases, e.g. @code{./regress.pike
+strategy:6,23,45}, a range of testcases, e.g. @code{./regress.pike
+strategy:13-15} or more complex combinations e.g. @code{./regress.pike
+strategy:6,13-15,23,45 nicklas3:602,1403}.
+
+There are also command line options to choose what engine to run, what
+options to send to the engine, to turn on verbose output, and to use a
+file to specify which testcases to run. Run @code{./regress.pike --help}
+for a complete and up to date list of options.
+
+@node Viewing with Emacs
+@section Viewing tests with Emacs
+
+To get a quick regression view, you may use the graphical
+display mode available with Emacs (@pxref{Emacs}). You will
+want the cursor in the regression buffer when you enter
+@command{M-x gnugo}, so that GNU Go opens in the correct
+directory. A good way to be in the right directory is to
+open the window of the test you want to investigate. Then
+you can cut and past GTP commands directly from the test to
+the minibuffer, using the @command{:} command from
+Emacs. Although Emacs mode does not have a coordinate grid,
+you may get an ascii board with the coordinate grid using
+@command{: showboard} command.
+
+@node HTML Views
+@section HTML Regression Views
+
+Extremely useful HTML Views of the regression tests may be
+produced using two perl scripts @file{regression/regress.pl}
+and @file{regression/regress.plx}.
+
+@enumerate
+@item The driver program (regress.pl) which:
+@itemize @bullet
+@item Runs the regression tests, invoking GNU Go.
+@item Captures the trace output, board position, and pass/fail status,
+sgf output, and dragon status information.
+@end itemize
+@item The interface to view the captured output (regress.plx) which:
+@itemize @bullet
+@item Never invokes GNU Go.
+@item Displays the captured output in helpful formats (i.e. HTML).
+@end itemize
+@end enumerate
+
+@subsection Setting up the HTML regression Views
+
+There are many ways configuring Apache to permit CGI scripts, all of them are
+featured in Apache documentation, which can be found at
+@url{http://httpd.apache.org/docs/2.0/howto/cgi.html}
+
+Below you will find one example. 
+
+This documentation assumes an Apache 2.0 included in Fedora Core distribution,
+but it should be fairly close to the config for other distributions.
+
+First, you will need to configure Apache to run CGI scripts in the directory
+you wish to serve the html views from. In @file{/etc/httpd/conf/httpd.conf}
+there should be a line:
+
+@code{DocumentRoot "/var/www/html"}
+
+Search for a line @code{<Directory "/path/to/directory">}, where 
+@code{/path/to/directory} is the same as provided in @code{DocumentRoot},
+then add @code{ExecCGI} to list of @code{Options}.
+The whole section should look like:
+
+@example
+<Directory "/var/www/html">
+...
+    Options ... ExecCGI
+...
+</Directory>
+@end example
+
+This allows CGI scripts to be executed in the directory used by regress.plx.
+Next, you need to tell Apache that @file{.plx} is a CGI script ending. Your
+@file{httpd.conf} file should contain a line:
+
+@code{AddHandler cgi-script ...}
+
+If there isn't already, add it; add @file{.plx} to the list of extensions,
+so line should look like:
+
+@code{AddHandler cgi-script ... .plx}
+
+You will also need to make sure you have the necessary modules loaded to run
+CGI scripts; mod_cgi and mod_mime should be sufficient. Your @file{httpd.conf}
+should have the relevant @code{LoadModule cgi_module modules/mod_cgi.so} and
+@code{LoadModule mime_module modules/mod_mime.so} lines; uncomment them if
+necessary.
+
+Next, you need to put a copy of @file{regress.plx} in the @code{DocumentRoot}
+directory @code{/var/www/html} or it subdirectories where you plan to serve the
+html views from.
+
+You will also need to install the Perl module GD
+(@url{http://search.cpan.org/dist/GD/}), available from CPAN.
+
+Finally, run @file{regression/regress.pl} to create the xml data used to
+generate the html views (to do all regression tests run
+@file{regression/regress.pl -a 1}); then, copy the @file{html/} directory to
+the same directory as @file{regress.plx} resides in.
+
+At this point, you should have a working copy of the html regression views.
+
+Additional notes for Debian users: The Perl GD module can be installed
+by @code{apt-get install libgd-perl}. It may suffice to add this to
+the apache2 configuration:
+
+@example
+<Directory "/var/www/regression">
+       Options +ExecCGI
+       AddHandler cgi-script .plx
+       RedirectMatch ^/regression$ /regression/regress.plx
+</Directory>
+@end example
+
+and then make a link from @file{/var/www/regression} to the GNU Go
+regression directory. The @code{RedirectMatch} statement is only
+needed to set up a shorter entry URL.
diff --git a/doc/sgf.texi b/doc/sgf.texi
new file mode 100644 (file)
index 0000000..bd9bf29
--- /dev/null
@@ -0,0 +1,101 @@
+@cindex SGF files in memory
+
+@dfn{SGF} - Smart Game Format - is a file format which is used for storing
+game records for a number of different games, among them chess and
+go. The format is a framework with special adaptions to each game. This
+is not a description of the file format standard. Too see the exact
+definition of the file format, see @url{http://www.red-bean.com/sgf/}.
+
+GNU Go contains a library to handle go game records in the SGF format in
+memory and to read and write SGF files. This library - @code{libsgf.a} -
+is in the @code{sgf} subdirectory. To use the SGF routines, include the
+file @file{sgftree.h}.
+
+Each game record is stored as a tree of @dfn{nodes}, where each node
+represents a state of the game, often after some move is made. Each node
+contains zero or more @dfn{properties}, which gives meaning to the
+node. There can also be a number of @dfn{child nodes} which are
+different variations of the game tree. The first child node is the main
+variation. 
+
+Here is the definition of @code{SGFNode}, and @code{SGFProperty}, the
+data structures which are used to encode the game tree. 
+
+@example
+@group
+
+typedef struct SGFProperty_t @{
+  struct SGFProperty_t *next;
+  short  name;
+  char   value[1];
+@} SGFProperty;
+
+@end group
+@group
+
+typedef struct SGFNode_t @{
+  SGFProperty      *props;
+  struct SGFNode_t *parent;
+  struct SGFNode_t *child;
+  struct SGFNode_t *next;
+@} SGFNode;
+
+@end group
+@end example
+
+Each node of the SGF tree is stored in an @code{SGFNode} struct. It has
+a pointer to a linked list of properties (see below) called
+@code{props}. It also has a pointer to a linked list of children, where
+each child is a variation which starts at this node. The variations are
+linked through the @code{next} pointer and each variation continues
+through the @code{child} pointer. Each and every node also has a pointer
+to its parent node (the @code{parent} field), except the top node whose
+parent pointer is @code{NULL}.
+
+An SGF property is encoded in the @code{SGFPoperty} struct. It is linked
+in a list through the @code{next} field.  A property has a @code{name}
+which is encoded in a short int.  Symbolic names of properties can be
+found in @file{sgf_properties.h}.
+
+Some properties also have a value, which could be an integer, a floating
+point value, a character or a string. These values can be accessed or
+set through special functions.
+
+@section The SGFTree datatype
+
+Sometimes we just want to record an ongoing game or something similarly
+simple and not do any sofisticated tree manipulation.  In that case we
+can use the simplified interface provided by @code{SGFTree} below. 
+
+@example
+@group
+
+typedef struct SGFTree_t @{
+  SGFNode *root;
+  SGFNode *lastnode;
+@} SGFTree;
+
+@end group
+@end example
+
+An @code{SGFTree} contains a pointer to the root node of an SGF tree and
+a pointer to the node that we last accessed. Most of the time this will
+be the last move of an ongoing game.
+
+Most of the functions which manipulate an @code{SGFTree} work exactly
+like their @code{SGFNode} counterparts, except that they work on the
+current node of the tree.
+
+All the functions below that take arguments @code{tree} and @code{node}
+will work on:
+
+@enumerate
+@item
+@code{node} if non-@code{NULL}
+@item
+@code{tree->lastnode} if non-@code{NULL}
+@item
+The current end of the game tree.
+@end enumerate
+in that order.
+
diff --git a/doc/sync-prod1.eps b/doc/sync-prod1.eps
new file mode 100644 (file)
index 0000000..5c43638
--- /dev/null
@@ -0,0 +1,502 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: sync-prod1.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Jun 19 10:48:42 2001
+%%For: turvoy@semeai.irisa.fr (Tanguy Urvoy, DEA, Paragraphe)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 211 201
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 0.6000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-5.0 203.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 6625 m -1000 -1000 l 6994 -1000 l 6994 6625 l cp clip
+ 0.03600 0.03600 sc
+7.500 slw
+% Ellipse
+n 1200 1800 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 1800 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4200 1800 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 1200 600 309 309 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 1200 3900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2700 3900 300 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4200 3900 309 309 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 1200 5100 309 309 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs  clippath
+3780 1770 m 3900 1800 l 3780 1830 l 3915 1830 l 3915 1770 l cp
+clip
+n 3000 1800 m 3003 1800 l 3011 1800 l 3024 1800 l 3043 1800 l 3067 1800 l
+ 3097 1800 l 3129 1800 l 3162 1800 l 3196 1800 l 3229 1800 l
+ 3260 1800 l 3289 1800 l 3316 1800 l 3341 1800 l 3365 1800 l
+ 3387 1800 l 3408 1800 l 3429 1800 l 3450 1800 l 3471 1800 l
+ 3492 1800 l 3513 1800 l 3535 1800 l 3559 1800 l 3584 1800 l
+ 3611 1800 l 3640 1800 l 3671 1800 l 3704 1800 l 3738 1800 l
+ 3771 1800 l 3803 1800 l 3833 1800 l 3857 1800 l 3900 1800 l gs col0 s gr gr
+
+% arrowhead
+n 3780 1770 m 3900 1800 l 3780 1830 l 3780 1800 l 3780 1770 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+780 1770 m 900 1800 l 780 1830 l 915 1830 l 915 1770 l cp
+clip
+n 300 1800 m 900 1800 l gs col0 s gr gr
+
+% arrowhead
+n 780 1770 m 900 1800 l 780 1830 l 780 1800 l 780 1770 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4980 1770 m 5100 1800 l 4980 1830 l 5115 1830 l 5115 1770 l cp
+clip
+n 4500 1800 m 5100 1800 l gs col0 s gr gr
+
+% arrowhead
+n 4980 1770 m 5100 1800 l 4980 1830 l 4980 1800 l 4980 1770 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2313 1712 m 2400 1800 l 2282 1763 l 2397 1833 l 2428 1782 l cp
+clip
+n 1500 1800 m 1503 1798 l 1508 1795 l 1518 1789 l 1533 1780 l 1553 1768 l
+ 1578 1753 l 1605 1737 l 1635 1720 l 1666 1703 l 1696 1686 l
+ 1726 1671 l 1754 1657 l 1781 1644 l 1806 1633 l 1830 1624 l
+ 1852 1616 l 1873 1610 l 1893 1606 l 1912 1602 l 1931 1601 l
+ 1950 1600 l 1969 1601 l 1988 1602 l 2007 1606 l 2027 1610 l
+ 2048 1616 l 2070 1624 l 2094 1633 l 2119 1644 l 2146 1657 l
+ 2174 1671 l 2204 1686 l 2234 1703 l 2265 1720 l 2295 1737 l
+ 2322 1753 l 2347 1768 l 2367 1780 l 2400 1800 l gs col0 s gr gr
+
+% arrowhead
+n 2313 1712 m 2400 1800 l 2282 1763 l 2297 1738 l 2313 1712 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1694 633 m 1575 600 l 1696 573 l 1561 570 l 1559 630 l cp
+clip
+n 2700 1500 m 2700 1497 l 2700 1490 l 2699 1478 l 2698 1459 l 2696 1433 l
+ 2694 1401 l 2691 1364 l 2688 1321 l 2684 1276 l 2679 1228 l
+ 2674 1181 l 2668 1134 l 2661 1088 l 2654 1046 l 2646 1005 l
+ 2637 968 l 2627 934 l 2617 903 l 2606 875 l 2593 849 l
+ 2580 825 l 2565 804 l 2549 784 l 2532 766 l 2513 750 l
+ 2495 737 l 2476 724 l 2455 713 l 2433 702 l 2409 692 l
+ 2383 683 l 2354 675 l 2324 667 l 2290 660 l 2254 653 l
+ 2215 647 l 2174 641 l 2129 635 l 2082 630 l 2033 626 l
+ 1982 622 l 1931 618 l 1879 614 l 1829 611 l 1780 609 l
+ 1736 606 l 1695 604 l 1661 603 l 1632 602 l 1610 601 l
+ 1575 600 l gs col0 s gr gr
+
+% arrowhead
+n 1694 633 m 1575 600 l 1696 573 l 1695 603 l 1694 633 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1697 546 m 1575 525 l 1693 487 l 1558 496 l 1562 556 l cp
+clip
+n 4200 1500 m 4200 1498 l 4199 1492 l 4199 1482 l 4197 1466 l 4195 1445 l
+ 4193 1418 l 4189 1385 l 4184 1348 l 4179 1307 l 4173 1263 l
+ 4166 1218 l 4157 1174 l 4148 1129 l 4138 1086 l 4128 1046 l
+ 4116 1007 l 4103 971 l 4089 937 l 4075 906 l 4058 877 l
+ 4041 850 l 4022 825 l 4001 802 l 3979 781 l 3955 761 l
+ 3928 743 l 3900 725 l 3876 712 l 3852 699 l 3825 687 l
+ 3798 675 l 3769 664 l 3739 653 l 3707 642 l 3674 632 l
+ 3640 622 l 3604 612 l 3567 603 l 3529 594 l 3489 585 l
+ 3449 577 l 3408 569 l 3366 561 l 3324 554 l 3281 548 l
+ 3238 541 l 3194 535 l 3151 530 l 3107 525 l 3064 520 l
+ 3021 516 l 2979 512 l 2937 508 l 2896 505 l 2856 502 l
+ 2816 499 l 2777 497 l 2739 495 l 2702 493 l 2666 491 l
+ 2631 490 l 2596 489 l 2563 488 l 2523 486 l 2484 486 l
+ 2446 485 l 2408 485 l 2371 485 l 2334 485 l 2296 485 l
+ 2258 486 l 2219 487 l 2179 489 l 2138 490 l 2096 492 l
+ 2052 494 l 2008 496 l 1963 499 l 1917 501 l 1871 504 l
+ 1827 507 l 1784 510 l 1743 513 l 1706 515 l 1672 518 l
+ 1644 520 l 1621 522 l 1603 523 l 1575 525 l gs col0 s gr gr
+
+% arrowhead
+n 1697 546 m 1575 525 l 1693 487 l 1695 516 l 1697 546 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2282 1837 m 2400 1800 l 2313 1888 l 2428 1818 l 2397 1767 l cp
+clip
+n 1500 1800 m 1503 1802 l 1508 1805 l 1518 1811 l 1533 1820 l 1553 1832 l
+ 1578 1847 l 1605 1863 l 1635 1880 l 1666 1897 l 1696 1914 l
+ 1726 1929 l 1754 1943 l 1781 1956 l 1806 1967 l 1830 1976 l
+ 1852 1984 l 1873 1990 l 1893 1994 l 1912 1998 l 1931 1999 l
+ 1950 2000 l 1969 1999 l 1988 1998 l 2007 1994 l 2027 1990 l
+ 2048 1984 l 2070 1976 l 2094 1967 l 2119 1956 l 2146 1943 l
+ 2174 1929 l 2204 1914 l 2234 1897 l 2265 1880 l 2295 1863 l
+ 2322 1847 l 2347 1832 l 2367 1820 l 2400 1800 l gs col0 s gr gr
+
+% arrowhead
+n 2282 1837 m 2400 1800 l 2313 1888 l 2297 1862 l 2282 1837 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1696 475 m 1575 450 l 1694 415 l 1559 421 l 1561 481 l cp
+clip
+n 4200 1500 m 4200 1498 l 4201 1494 l 4202 1485 l 4204 1472 l 4207 1454 l
+ 4210 1431 l 4213 1402 l 4217 1367 l 4221 1328 l 4225 1285 l
+ 4229 1238 l 4233 1189 l 4236 1139 l 4238 1088 l 4238 1037 l
+ 4238 987 l 4237 939 l 4234 893 l 4229 849 l 4223 807 l
+ 4215 768 l 4206 732 l 4194 698 l 4181 666 l 4166 637 l
+ 4149 610 l 4129 586 l 4108 563 l 4084 542 l 4057 523 l
+ 4028 506 l 3997 490 l 3963 475 l 3937 465 l 3910 456 l
+ 3881 448 l 3851 440 l 3819 432 l 3786 426 l 3750 420 l
+ 3712 414 l 3673 409 l 3630 405 l 3586 401 l 3539 397 l
+ 3489 395 l 3437 392 l 3381 390 l 3323 389 l 3262 388 l
+ 3198 388 l 3131 388 l 3062 389 l 2989 390 l 2914 391 l
+ 2837 393 l 2757 395 l 2676 398 l 2594 400 l 2511 403 l
+ 2427 407 l 2344 410 l 2263 414 l 2183 417 l 2106 421 l
+ 2033 425 l 1963 428 l 1899 432 l 1840 435 l 1786 438 l
+ 1739 440 l 1699 443 l 1665 445 l 1637 446 l 1615 448 l
+ 1599 449 l 1575 450 l gs col0 s gr gr
+
+% arrowhead
+n 1696 475 m 1575 450 l 1694 415 l 1695 445 l 1696 475 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2280 3870 m 2400 3900 l 2280 3930 l 2415 3930 l 2415 3870 l cp
+clip
+n 1500 3900 m 2400 3900 l gs col0 s gr gr
+
+% arrowhead
+n 2280 3870 m 2400 3900 l 2280 3930 l 2280 3900 l 2280 3870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3780 3870 m 3900 3900 l 3780 3930 l 3915 3930 l 3915 3870 l cp
+clip
+n 3000 3900 m 3900 3900 l gs col0 s gr gr
+
+% arrowhead
+n 3780 3870 m 3900 3900 l 3780 3930 l 3780 3900 l 3780 3870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4980 3870 m 5100 3900 l 4980 3930 l 5115 3930 l 5115 3870 l cp
+clip
+n 4500 3900 m 5100 3900 l gs col0 s gr gr
+
+% arrowhead
+n 4980 3870 m 5100 3900 l 4980 3930 l 4980 3900 l 4980 3870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+780 3870 m 900 3900 l 780 3930 l 915 3930 l 915 3870 l cp
+clip
+n 300 3900 m 900 3900 l gs col0 s gr gr
+
+% arrowhead
+n 780 3870 m 900 3900 l 780 3930 l 780 3900 l 780 3870 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1230 4680 m 1200 4800 l 1170 4680 l 1170 4815 l 1230 4815 l cp
+clip
+n 1200 4200 m 1200 4800 l gs col0 s gr gr
+
+% arrowhead
+n 1230 4680 m 1200 4800 l 1170 4680 l 1200 4680 l 1230 4680 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1624 5099 m 1500 5100 l 1609 5041 l 1478 5075 l 1493 5133 l cp
+clip
+n 2700 4200 m 2700 4203 l 2699 4208 l 2699 4219 l 2697 4235 l 2695 4256 l
+ 2692 4282 l 2689 4312 l 2684 4346 l 2679 4381 l 2673 4417 l
+ 2666 4453 l 2658 4487 l 2649 4520 l 2640 4551 l 2629 4580 l
+ 2618 4607 l 2606 4631 l 2592 4654 l 2577 4676 l 2560 4696 l
+ 2542 4714 l 2522 4733 l 2500 4750 l 2482 4763 l 2463 4775 l
+ 2443 4788 l 2421 4800 l 2398 4812 l 2372 4824 l 2345 4837 l
+ 2315 4849 l 2283 4862 l 2249 4875 l 2212 4888 l 2172 4902 l
+ 2130 4916 l 2085 4931 l 2038 4945 l 1989 4961 l 1938 4976 l
+ 1886 4991 l 1835 5006 l 1784 5021 l 1735 5035 l 1689 5048 l
+ 1647 5060 l 1609 5070 l 1577 5079 l 1551 5086 l 1531 5092 l
+ 1500 5100 l gs col0 s gr gr
+
+% arrowhead
+n 1624 5099 m 1500 5100 l 1609 5041 l 1616 5070 l 1624 5099 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1696 5200 m 1575 5175 l 1694 5140 l 1559 5146 l 1561 5206 l cp
+clip
+n 4200 4200 m 4200 4202 l 4199 4207 l 4198 4215 l 4197 4228 l 4194 4246 l
+ 4191 4269 l 4187 4297 l 4181 4329 l 4175 4365 l 4167 4404 l
+ 4158 4444 l 4148 4486 l 4137 4528 l 4125 4569 l 4111 4608 l
+ 4097 4646 l 4081 4682 l 4064 4716 l 4046 4748 l 4026 4777 l
+ 4005 4805 l 3982 4830 l 3957 4853 l 3931 4875 l 3902 4895 l
+ 3871 4914 l 3837 4931 l 3801 4947 l 3763 4963 l 3736 4972 l
+ 3708 4981 l 3679 4990 l 3648 4999 l 3616 5007 l 3582 5015 l
+ 3546 5022 l 3508 5030 l 3468 5037 l 3426 5043 l 3382 5050 l
+ 3335 5056 l 3285 5063 l 3233 5069 l 3179 5075 l 3121 5081 l
+ 3061 5086 l 2998 5092 l 2932 5098 l 2863 5103 l 2792 5108 l
+ 2719 5114 l 2644 5119 l 2567 5124 l 2489 5128 l 2410 5133 l
+ 2332 5138 l 2254 5142 l 2177 5146 l 2102 5150 l 2031 5154 l
+ 1963 5157 l 1899 5160 l 1841 5163 l 1788 5166 l 1741 5168 l
+ 1700 5170 l 1666 5171 l 1638 5172 l 1616 5173 l 1599 5174 l
+ 1575 5175 l gs col0 s gr gr
+
+% arrowhead
+n 1696 5200 m 1575 5175 l 1694 5140 l 1695 5170 l 1696 5200 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+817 5192 m 900 5100 l 870 5220 l 934 5101 l 881 5073 l cp
+clip
+n 900 5100 m 899 5100 l 896 5100 l 886 5101 l 870 5101 l 847 5102 l
+ 816 5104 l 781 5107 l 743 5110 l 703 5113 l 664 5117 l
+ 628 5122 l 594 5127 l 565 5133 l 538 5140 l 516 5147 l
+ 497 5155 l 481 5165 l 468 5175 l 458 5187 l 450 5200 l
+ 445 5213 l 441 5227 l 438 5242 l 438 5259 l 438 5276 l
+ 440 5293 l 444 5312 l 449 5330 l 455 5349 l 462 5368 l
+ 471 5386 l 480 5404 l 491 5421 l 502 5436 l 513 5450 l
+ 525 5463 l 537 5474 l 550 5483 l 562 5490 l 575 5496 l
+ 587 5499 l 600 5500 l 613 5499 l 625 5495 l 638 5489 l
+ 651 5480 l 665 5468 l 680 5452 l 696 5434 l 713 5412 l
+ 730 5387 l 749 5358 l 769 5327 l 790 5294 l 810 5260 l
+ 830 5226 l 848 5193 l 864 5165 l 878 5141 l 900 5100 l  cp gs col0 s gr gr
+
+% arrowhead
+n 817 5192 m 900 5100 l 870 5220 l 843 5206 l 817 5192 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+870 4980 m 900 5100 l 817 5008 l 881 5127 l 934 5099 l cp
+clip
+n 900 5100 m 899 5100 l 896 5100 l 886 5099 l 870 5099 l 847 5098 l
+ 816 5096 l 781 5093 l 743 5090 l 703 5087 l 664 5083 l
+ 628 5078 l 594 5073 l 565 5067 l 538 5060 l 516 5053 l
+ 497 5045 l 481 5035 l 468 5025 l 458 5013 l 450 5000 l
+ 445 4987 l 441 4973 l 438 4958 l 438 4941 l 438 4924 l
+ 440 4907 l 444 4888 l 449 4870 l 455 4851 l 462 4832 l
+ 471 4814 l 480 4796 l 491 4779 l 502 4764 l 513 4750 l
+ 525 4737 l 537 4726 l 550 4717 l 562 4710 l 575 4704 l
+ 587 4701 l 600 4700 l 613 4701 l 625 4705 l 638 4711 l
+ 651 4720 l 665 4732 l 680 4748 l 696 4766 l 713 4788 l
+ 730 4813 l 749 4842 l 769 4873 l 790 4906 l 810 4940 l
+ 830 4974 l 848 5007 l 864 5035 l 878 5059 l 900 5100 l  cp gs col0 s gr gr
+
+% arrowhead
+n 870 4980 m 900 5100 l 817 5008 l 843 4994 l 870 4980 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+817 692 m 900 600 l 870 720 l 934 601 l 881 573 l cp
+clip
+n 900 600 m 899 600 l 896 600 l 886 601 l 870 601 l 847 602 l
+ 816 604 l 781 607 l 743 610 l 703 613 l 664 617 l
+ 628 622 l 594 627 l 565 633 l 538 640 l 516 647 l
+ 497 655 l 481 665 l 468 675 l 458 687 l 450 700 l
+ 445 713 l 441 727 l 438 742 l 438 759 l 438 776 l
+ 440 793 l 444 812 l 449 830 l 455 849 l 462 868 l
+ 471 886 l 480 904 l 491 921 l 502 936 l 513 950 l
+ 525 963 l 537 974 l 550 983 l 562 990 l 575 996 l
+ 587 999 l 600 1000 l 613 999 l 625 995 l 638 989 l
+ 651 980 l 665 968 l 680 952 l 696 934 l 713 912 l
+ 730 887 l 749 858 l 769 827 l 790 794 l 810 760 l
+ 830 726 l 848 693 l 864 665 l 878 641 l 900 600 l  cp gs col0 s gr gr
+
+% arrowhead
+n 817 692 m 900 600 l 870 720 l 843 706 l 817 692 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+870 480 m 900 600 l 817 508 l 881 627 l 934 599 l cp
+clip
+n 900 600 m 899 600 l 896 600 l 886 599 l 870 599 l 847 598 l
+ 816 596 l 781 593 l 743 590 l 703 587 l 664 583 l
+ 628 578 l 594 573 l 565 567 l 538 560 l 516 553 l
+ 497 545 l 481 535 l 468 525 l 458 513 l 450 500 l
+ 445 487 l 441 473 l 438 458 l 438 441 l 438 424 l
+ 440 407 l 444 388 l 449 370 l 455 351 l 462 332 l
+ 471 314 l 480 296 l 491 279 l 502 264 l 513 250 l
+ 525 237 l 537 226 l 550 217 l 562 210 l 575 204 l
+ 587 201 l 600 200 l 613 201 l 625 205 l 638 211 l
+ 651 220 l 665 232 l 680 248 l 696 266 l 713 288 l
+ 730 313 l 749 342 l 769 373 l 790 406 l 810 440 l
+ 830 474 l 848 507 l 864 535 l 878 559 l 900 600 l  cp gs col0 s gr gr
+
+% arrowhead
+n 870 480 m 900 600 l 817 508 l 843 494 l 870 480 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman ff 180.00 scf sf
+2700 975 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+1125 675 m
+gs 1 -1 sc (0) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+1125 1875 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+2625 1875 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+4125 1875 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3375 1725 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+1875 1575 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+1875 2175 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3750 900 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+4200 600 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+1125 3975 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+2625 3975 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+4125 3975 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+1125 5175 m
+gs 1 -1 sc (0) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+1875 3825 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3375 3825 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+1275 4500 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+2700 4725 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+4200 4725 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+5025 1725 m
+gs 1 -1 sc (Pattern A) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+5025 3750 m
+gs 1 -1 sc (Pattern B) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+150 5475 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+150 4950 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+150 975 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+150 450 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+975 225 m
+gs 1 -1 sc (Error state) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+900 5625 m
+gs 1 -1 sc (Error state) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+225 2100 m
+gs 1 -1 sc (Start) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+225 3750 m
+gs 1 -1 sc (Start) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/sync-prod1.fig b/doc/sync-prod1.fig
new file mode 100644 (file)
index 0000000..c064243
--- /dev/null
@@ -0,0 +1,122 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+100.00
+Single
+-2
+1200 2
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 1200 1800 300 300 1200 1800 1500 1800
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 1800 300 300 2700 1800 3000 1800
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4200 1800 300 300 4200 1800 4500 1800
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 1200 600 309 309 1200 600 1500 675
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 1200 3900 300 300 1200 3900 1500 3900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 2700 3900 300 300 2700 3900 3000 3900
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 4200 3900 309 309 4200 3900 4500 3975
+1 3 0 1 0 7 100 0 -1 0.000 1 0.0000 1200 5100 309 309 1200 5100 1500 5175
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        3000 1800 3450 1800 3900 1800
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        300 1800 900 1800
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        4500 1800 5100 1800
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        1500 1800 1950 1500 2400 1800
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        2700 1500 2700 600 1575 600
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        4200 1500 4200 600 2400 450 1575 525
+        0.000 1.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        1500 1800 1950 2100 2400 1800
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        4200 1500 4500 225 1575 450
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        1500 3900 2400 3900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        3000 3900 3900 3900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        4500 3900 5100 3900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        300 3900 900 3900
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        1200 4200 1200 4800
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        2700 4200 2700 4800 1500 5100
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        4200 4200 4200 5100 1575 5175
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        900 5100 300 5100 600 5700 900 5100
+        0.000 1.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        900 5100 300 5100 600 4500 900 5100
+        0.000 1.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        900 600 300 600 600 1200 900 600
+        0.000 1.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        900 600 300 600 600 0 900 600
+        0.000 1.000 1.000 0.000
+4 0 0 100 0 0 12 0.0000 4 135 135 2700 975 O\001
+4 0 0 100 0 0 16 0.0000 4 165 120 1125 675 0\001
+4 0 0 100 0 0 16 0.0000 4 165 120 1125 1875 1\001
+4 0 0 100 0 0 16 0.0000 4 165 120 2625 1875 2\001
+4 0 0 100 0 0 16 0.0000 4 165 120 4125 1875 3\001
+4 0 0 100 0 0 12 0.0000 4 135 135 3375 1725 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 1875 1575 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 1875 2175 O\001
+4 0 0 100 0 0 12 0.0000 4 135 135 3750 900 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 4200 600 O\001
+4 0 0 100 0 0 16 0.0000 4 165 120 1125 3975 1\001
+4 0 0 100 0 0 16 0.0000 4 165 120 2625 3975 2\001
+4 0 0 100 0 0 16 0.0000 4 165 120 4125 3975 3\001
+4 0 0 100 0 0 16 0.0000 4 165 120 1125 5175 0\001
+4 0 0 100 0 0 12 0.0000 4 135 135 1875 3825 O\001
+4 0 0 100 0 0 12 0.0000 4 135 135 3375 3825 O\001
+4 0 0 100 0 0 12 0.0000 4 135 135 1275 4500 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 2700 4725 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 4200 4725 X\001
+4 0 0 100 0 0 16 0.0000 4 165 945 5025 1725 Pattern A\001
+4 0 0 100 0 0 16 0.0000 4 165 930 5025 3750 Pattern B\001
+4 0 0 100 0 0 12 0.0000 4 135 135 150 5475 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 150 4950 O\001
+4 0 0 100 0 0 12 0.0000 4 135 135 150 975 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 150 450 O\001
+4 0 0 100 0 0 16 0.0000 4 165 1050 975 225 Error state\001
+4 0 0 100 0 0 16 0.0000 4 165 1050 900 5625 Error state\001
+4 0 0 100 0 0 16 0.0000 4 165 480 225 2100 Start\001
+4 0 0 100 0 0 16 0.0000 4 165 480 225 3750 Start\001
diff --git a/doc/sync-prod1.jpg b/doc/sync-prod1.jpg
new file mode 100644 (file)
index 0000000..e972f7c
Binary files /dev/null and b/doc/sync-prod1.jpg differ
diff --git a/doc/sync-prod1.pdf b/doc/sync-prod1.pdf
new file mode 100644 (file)
index 0000000..50e110d
Binary files /dev/null and b/doc/sync-prod1.pdf differ
diff --git a/doc/sync-prod1.png b/doc/sync-prod1.png
new file mode 100644 (file)
index 0000000..0907b0f
Binary files /dev/null and b/doc/sync-prod1.png differ
diff --git a/doc/sync-prod2.eps b/doc/sync-prod2.eps
new file mode 100644 (file)
index 0000000..9d81a98
--- /dev/null
@@ -0,0 +1,418 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: sync-prod2.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Tue Jun 19 10:48:29 2001
+%%For: turvoy@semeai.irisa.fr (Tanguy Urvoy, DEA, Paragraphe)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 221 153
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 0.6000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-7.0 163.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+       /endangle exch def
+       /startangle exch def
+       /yrad exch def
+       /xrad exch def
+       /y exch def
+       /x exch def
+       /savematrix mtrx currentmatrix def
+       x y tr xrad yrad sc 0 0 1 startangle endangle arc
+       closepath
+       savematrix setmatrix
+       } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 5507 m -1000 -1000 l 7326 -1000 l 7326 5507 l cp clip
+ 0.03600 0.03600 sc
+7.500 slw
+% Ellipse
+n 1275 2400 600 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2775 1500 600 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2779 3299 600 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4275 600 600 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4271 2409 600 300 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4275 4200 600 300 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs  clippath
+555 2370 m 675 2400 l 555 2430 l 690 2430 l 690 2370 l cp
+clip
+n 225 2400 m 675 2400 l gs col0 s gr gr
+
+% arrowhead
+n 555 2370 m 675 2400 l 555 2430 l 555 2400 l 555 2370 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2054 1473 m 2175 1500 l 2056 1533 l 2191 1530 l 2189 1470 l cp
+clip
+n 1275 2100 m 1275 2097 l 1276 2089 l 1276 2077 l 1278 2057 l 1280 2032 l
+ 1283 2002 l 1286 1967 l 1290 1930 l 1295 1893 l 1301 1856 l
+ 1307 1820 l 1314 1787 l 1322 1757 l 1331 1729 l 1341 1704 l
+ 1351 1681 l 1363 1661 l 1376 1644 l 1391 1628 l 1407 1613 l
+ 1425 1600 l 1441 1590 l 1459 1580 l 1479 1572 l 1500 1564 l
+ 1524 1557 l 1550 1550 l 1578 1544 l 1609 1539 l 1643 1534 l
+ 1680 1529 l 1721 1525 l 1763 1521 l 1809 1517 l 1856 1514 l
+ 1903 1511 l 1951 1509 l 1996 1506 l 2039 1505 l 2076 1503 l
+ 2108 1502 l 2134 1501 l 2175 1500 l gs col0 s gr gr
+
+% arrowhead
+n 2054 1473 m 2175 1500 l 2056 1533 l 2055 1503 l 2054 1473 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2056 3267 m 2175 3300 l 2054 3327 l 2189 3330 l 2191 3270 l cp
+clip
+n 1275 2700 m 1275 2703 l 1276 2711 l 1276 2723 l 1278 2743 l 1280 2768 l
+ 1283 2798 l 1286 2833 l 1290 2870 l 1295 2907 l 1301 2944 l
+ 1307 2980 l 1314 3013 l 1322 3043 l 1331 3071 l 1341 3096 l
+ 1351 3119 l 1363 3139 l 1376 3156 l 1391 3172 l 1407 3187 l
+ 1425 3200 l 1441 3210 l 1459 3220 l 1479 3228 l 1500 3236 l
+ 1524 3243 l 1550 3250 l 1578 3256 l 1609 3261 l 1643 3266 l
+ 1680 3271 l 1721 3275 l 1763 3279 l 1809 3283 l 1856 3286 l
+ 1903 3289 l 1951 3291 l 1996 3294 l 2039 3295 l 2076 3297 l
+ 2108 3298 l 2134 3299 l 2175 3300 l gs col0 s gr gr
+
+% arrowhead
+n 2056 3267 m 2175 3300 l 2054 3327 l 2055 3297 l 2056 3267 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3554 573 m 3675 600 l 3556 633 l 3691 630 l 3689 570 l cp
+clip
+n 2775 1200 m 2775 1197 l 2776 1189 l 2776 1177 l 2778 1157 l 2780 1132 l
+ 2783 1102 l 2786 1067 l 2790 1030 l 2795 993 l 2801 956 l
+ 2807 920 l 2814 887 l 2822 857 l 2831 829 l 2841 804 l
+ 2851 781 l 2863 761 l 2876 744 l 2891 728 l 2907 713 l
+ 2925 700 l 2941 690 l 2959 680 l 2979 672 l 3000 664 l
+ 3024 657 l 3050 650 l 3078 644 l 3109 639 l 3143 634 l
+ 3180 629 l 3221 625 l 3263 621 l 3309 617 l 3356 614 l
+ 3403 611 l 3451 609 l 3496 606 l 3539 605 l 3576 603 l
+ 3608 602 l 3634 601 l 3675 600 l gs col0 s gr gr
+
+% arrowhead
+n 3554 573 m 3675 600 l 3556 633 l 3555 603 l 3554 573 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3572 2331 m 3675 2400 l 3552 2388 l 3679 2433 l 3699 2377 l cp
+clip
+n 2775 1800 m 2777 1803 l 2781 1809 l 2788 1819 l 2798 1835 l 2812 1855 l
+ 2828 1879 l 2847 1905 l 2866 1932 l 2886 1959 l 2906 1985 l
+ 2925 2010 l 2944 2032 l 2963 2053 l 2981 2072 l 2999 2090 l
+ 3017 2106 l 3036 2122 l 3055 2136 l 3075 2150 l 3093 2161 l
+ 3111 2173 l 3131 2184 l 3152 2195 l 3174 2206 l 3199 2218 l
+ 3225 2230 l 3254 2242 l 3286 2255 l 3320 2269 l 3356 2283 l
+ 3394 2298 l 3433 2313 l 3473 2327 l 3512 2342 l 3550 2355 l
+ 3583 2368 l 3613 2378 l 3636 2386 l 3675 2400 l gs col0 s gr gr
+
+% arrowhead
+n 3572 2331 m 3675 2400 l 3552 2388 l 3562 2359 l 3572 2331 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4995 2370 m 4875 2400 l 4967 2317 l 4848 2381 l 4876 2434 l cp
+clip
+n 4875 2400 m 4875 2399 l 4875 2396 l 4876 2386 l 4876 2370 l 4877 2347 l
+ 4879 2316 l 4882 2281 l 4885 2243 l 4888 2203 l 4892 2164 l
+ 4897 2128 l 4902 2094 l 4908 2065 l 4915 2038 l 4922 2016 l
+ 4930 1997 l 4940 1981 l 4950 1968 l 4962 1958 l 4975 1950 l
+ 4988 1945 l 5002 1941 l 5017 1938 l 5034 1938 l 5051 1938 l
+ 5068 1940 l 5087 1944 l 5105 1949 l 5124 1955 l 5143 1962 l
+ 5161 1971 l 5179 1980 l 5196 1991 l 5211 2002 l 5225 2013 l
+ 5238 2025 l 5249 2037 l 5258 2050 l 5265 2062 l 5271 2075 l
+ 5274 2087 l 5275 2100 l 5274 2113 l 5270 2125 l 5264 2138 l
+ 5255 2151 l 5243 2165 l 5227 2180 l 5209 2196 l 5187 2213 l
+ 5162 2230 l 5133 2249 l 5102 2269 l 5069 2290 l 5035 2310 l
+ 5001 2330 l 4968 2348 l 4940 2364 l 4916 2378 l 4875 2400 l  cp gs col0 s gr gr
+
+% arrowhead
+n 4995 2370 m 4875 2400 l 4967 2317 l 4981 2343 l 4995 2370 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4967 2483 m 4875 2400 l 4995 2430 l 4876 2366 l 4848 2419 l cp
+clip
+n 4875 2400 m 4875 2401 l 4875 2404 l 4876 2414 l 4876 2430 l 4877 2453 l
+ 4879 2484 l 4882 2519 l 4885 2557 l 4888 2597 l 4892 2636 l
+ 4897 2672 l 4902 2706 l 4908 2735 l 4915 2762 l 4922 2784 l
+ 4930 2803 l 4940 2819 l 4950 2832 l 4962 2842 l 4975 2850 l
+ 4988 2855 l 5002 2859 l 5017 2862 l 5034 2862 l 5051 2862 l
+ 5068 2860 l 5087 2856 l 5105 2851 l 5124 2845 l 5143 2838 l
+ 5161 2829 l 5179 2820 l 5196 2809 l 5211 2798 l 5225 2787 l
+ 5238 2775 l 5249 2763 l 5258 2750 l 5265 2738 l 5271 2725 l
+ 5274 2713 l 5275 2700 l 5274 2687 l 5270 2675 l 5264 2662 l
+ 5255 2649 l 5243 2635 l 5227 2620 l 5209 2604 l 5187 2587 l
+ 5162 2570 l 5133 2551 l 5102 2531 l 5069 2510 l 5035 2490 l
+ 5001 2470 l 4968 2452 l 4940 2436 l 4916 2422 l 4875 2400 l  cp gs col0 s gr gr
+
+% arrowhead
+n 4967 2483 m 4875 2400 l 4995 2430 l 4981 2457 l 4967 2483 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4252 1978 m 4275 2100 l 4198 2003 l 4254 2126 l 4309 2101 l cp
+clip
+n 4275 900 m 4274 903 l 4271 909 l 4266 919 l 4259 935 l 4249 957 l
+ 4237 984 l 4223 1015 l 4208 1050 l 4192 1087 l 4177 1124 l
+ 4161 1161 l 4147 1198 l 4134 1233 l 4122 1266 l 4112 1298 l
+ 4102 1327 l 4095 1355 l 4088 1381 l 4083 1406 l 4080 1430 l
+ 4077 1454 l 4075 1477 l 4075 1500 l 4075 1523 l 4077 1546 l
+ 4080 1570 l 4083 1594 l 4088 1619 l 4095 1645 l 4102 1673 l
+ 4112 1702 l 4122 1734 l 4134 1767 l 4147 1802 l 4161 1839 l
+ 4177 1876 l 4192 1913 l 4208 1950 l 4223 1985 l 4237 2016 l
+ 4249 2043 l 4259 2065 l 4275 2100 l gs col0 s gr gr
+
+% arrowhead
+n 4252 1978 m 4275 2100 l 4198 2003 l 4225 1991 l 4252 1978 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4352 2003 m 4275 2100 l 4298 1978 l 4241 2101 l 4296 2126 l cp
+clip
+n 4275 900 m 4276 903 l 4279 909 l 4284 919 l 4291 935 l 4301 957 l
+ 4313 984 l 4327 1015 l 4342 1050 l 4358 1087 l 4373 1124 l
+ 4389 1161 l 4403 1198 l 4416 1233 l 4428 1266 l 4438 1298 l
+ 4448 1327 l 4455 1355 l 4462 1381 l 4467 1406 l 4470 1430 l
+ 4473 1454 l 4475 1477 l 4475 1500 l 4475 1523 l 4473 1546 l
+ 4470 1570 l 4467 1594 l 4462 1619 l 4455 1645 l 4448 1673 l
+ 4438 1702 l 4428 1734 l 4416 1767 l 4403 1802 l 4389 1839 l
+ 4373 1876 l 4358 1913 l 4342 1950 l 4327 1985 l 4313 2016 l
+ 4301 2043 l 4291 2065 l 4275 2100 l gs col0 s gr gr
+
+% arrowhead
+n 4352 2003 m 4275 2100 l 4298 1978 l 4325 1991 l 4352 2003 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5280 570 m 5400 600 l 5280 630 l 5415 630 l 5415 570 l cp
+clip
+n 4875 600 m 5400 600 l gs col0 s gr gr
+
+% arrowhead
+n 5280 570 m 5400 600 l 5280 630 l 5280 600 l 5280 570 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3556 4167 m 3675 4200 l 3554 4227 l 3689 4230 l 3691 4170 l cp
+clip
+n 2775 3600 m 2775 3603 l 2776 3611 l 2776 3623 l 2778 3643 l 2780 3668 l
+ 2783 3698 l 2786 3733 l 2790 3770 l 2795 3807 l 2801 3844 l
+ 2807 3880 l 2814 3913 l 2822 3943 l 2831 3971 l 2841 3996 l
+ 2851 4019 l 2863 4039 l 2876 4056 l 2891 4072 l 2907 4087 l
+ 2925 4100 l 2941 4110 l 2959 4120 l 2979 4128 l 3000 4136 l
+ 3024 4143 l 3050 4150 l 3078 4156 l 3109 4161 l 3143 4166 l
+ 3180 4171 l 3221 4175 l 3263 4179 l 3309 4183 l 3356 4186 l
+ 3403 4189 l 3451 4191 l 3496 4194 l 3539 4195 l 3576 4197 l
+ 3608 4198 l 3634 4199 l 3675 4200 l gs col0 s gr gr
+
+% arrowhead
+n 3556 4167 m 3675 4200 l 3554 4227 l 3555 4197 l 3556 4167 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3885 985 m 3975 900 l 3936 1017 l 4008 903 l 3958 871 l cp
+clip
+n 2775 3000 m 2775 2998 l 2776 2995 l 2776 2989 l 2778 2979 l 2780 2965 l
+ 2783 2948 l 2786 2928 l 2791 2905 l 2796 2880 l 2802 2854 l
+ 2809 2826 l 2817 2798 l 2826 2770 l 2835 2742 l 2846 2713 l
+ 2857 2684 l 2869 2655 l 2883 2624 l 2898 2593 l 2915 2560 l
+ 2933 2526 l 2953 2489 l 2975 2450 l 2988 2427 l 3002 2403 l
+ 3017 2377 l 3033 2351 l 3049 2324 l 3067 2295 l 3085 2265 l
+ 3105 2233 l 3126 2200 l 3148 2165 l 3172 2128 l 3196 2089 l
+ 3223 2048 l 3251 2004 l 3280 1959 l 3311 1911 l 3343 1861 l
+ 3377 1809 l 3412 1755 l 3449 1699 l 3486 1641 l 3525 1583 l
+ 3564 1523 l 3603 1463 l 3643 1403 l 3682 1344 l 3719 1287 l
+ 3756 1232 l 3790 1179 l 3823 1130 l 3852 1086 l 3879 1045 l
+ 3902 1010 l 3922 980 l 3938 956 l 3951 936 l 3961 922 l
+ 3975 900 l gs col0 s gr gr
+
+% arrowhead
+n 3885 985 m 3975 900 l 3936 1017 l 3911 1001 l 3885 985 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5280 4170 m 5400 4200 l 5280 4230 l 5415 4230 l 5415 4170 l cp
+clip
+n 4875 4200 m 5400 4200 l gs col0 s gr gr
+
+% arrowhead
+n 5280 4170 m 5400 4200 l 5280 4230 l 5280 4200 l 5280 4170 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4298 2822 m 4275 2700 l 4352 2797 l 4296 2674 l 4241 2699 l cp
+clip
+n 4275 3900 m 4276 3897 l 4279 3891 l 4284 3881 l 4291 3865 l 4301 3843 l
+ 4313 3816 l 4327 3785 l 4342 3750 l 4358 3713 l 4373 3676 l
+ 4389 3639 l 4403 3602 l 4416 3567 l 4428 3534 l 4438 3502 l
+ 4448 3473 l 4455 3445 l 4462 3419 l 4467 3394 l 4470 3370 l
+ 4473 3346 l 4475 3323 l 4475 3300 l 4475 3277 l 4473 3254 l
+ 4470 3230 l 4467 3206 l 4462 3181 l 4455 3155 l 4448 3127 l
+ 4438 3098 l 4428 3066 l 4416 3033 l 4403 2998 l 4389 2961 l
+ 4373 2924 l 4358 2887 l 4342 2850 l 4327 2815 l 4313 2784 l
+ 4301 2757 l 4291 2735 l 4275 2700 l gs col0 s gr gr
+
+% arrowhead
+n 4298 2822 m 4275 2700 l 4352 2797 l 4325 2809 l 4298 2822 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4198 2797 m 4275 2700 l 4252 2822 l 4309 2699 l 4254 2674 l cp
+clip
+n 4275 3900 m 4274 3897 l 4271 3891 l 4266 3881 l 4259 3865 l 4249 3843 l
+ 4237 3816 l 4223 3785 l 4208 3750 l 4192 3713 l 4177 3676 l
+ 4161 3639 l 4147 3602 l 4134 3567 l 4122 3534 l 4112 3502 l
+ 4102 3473 l 4095 3445 l 4088 3419 l 4083 3394 l 4080 3370 l
+ 4077 3346 l 4075 3323 l 4075 3300 l 4075 3277 l 4077 3254 l
+ 4080 3230 l 4083 3206 l 4088 3181 l 4095 3155 l 4102 3127 l
+ 4112 3098 l 4122 3066 l 4134 3033 l 4147 2998 l 4161 2961 l
+ 4177 2924 l 4192 2887 l 4208 2850 l 4223 2815 l 4237 2784 l
+ 4249 2757 l 4259 2735 l 4275 2700 l gs col0 s gr gr
+
+% arrowhead
+n 4198 2797 m 4275 2700 l 4252 2822 l 4225 2809 l 4198 2797 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman ff 240.00 scf sf
+1050 2475 m
+gs 1 -1 sc (1  ,  1) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+1350 1500 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+2475 1575 m
+gs 1 -1 sc (2  ,  0) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+2475 3375 m
+gs 1 -1 sc (2  ,  2) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+1350 3450 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+3975 675 m
+gs 1 -1 sc (3  ,  0) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+2850 600 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+3975 2475 m
+gs 1 -1 sc (0  ,  0) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5250 1950 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5250 2925 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+5250 2475 m
+gs 1 -1 sc (Error state) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3900 1575 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+4500 1575 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+5025 525 m
+gs 1 -1 sc (Pattern A) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+225 2250 m
+gs 1 -1 sc (Start) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+2775 2250 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+3975 4275 m
+gs 1 -1 sc (0  ,  3) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+2775 4275 m
+gs 1 -1 sc (O) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+2550 2850 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 240.00 scf sf
+4950 4125 m
+gs 1 -1 sc (Pattern B) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3900 3375 m
+gs 1 -1 sc (X) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+4500 3375 m
+gs 1 -1 sc (O) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/sync-prod2.fig b/doc/sync-prod2.fig
new file mode 100644 (file)
index 0000000..73092d0
--- /dev/null
@@ -0,0 +1,99 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+100.00
+Single
+-2
+1200 2
+6 225 300 6300 4500
+1 1 0 1 0 7 100 0 -1 0.000 1 0.0000 1275 2400 600 300 1275 2400 1875 2100
+1 1 0 1 0 7 100 0 -1 0.000 1 0.0000 2775 1500 600 300 2775 1500 3375 1200
+1 1 0 1 0 7 100 0 -1 0.000 1 0.0000 2779 3299 600 300 2779 3299 3379 2999
+1 1 0 1 0 7 100 0 -1 0.000 1 0.0000 4275 600 600 300 4275 600 4875 300
+1 1 0 1 0 7 100 0 -1 0.000 1 0.0000 4271 2409 600 300 4271 2409 4871 2109
+1 1 0 1 0 7 100 0 -1 0.000 1 0.0000 4275 4200 600 300 4275 4200 4875 3900
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        225 2400 675 2400
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        1275 2100 1275 1500 2175 1500
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        1275 2700 1275 3300 2175 3300
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        2775 1200 2775 600 3675 600
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        2775 1800 3000 2175 3675 2400
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        4875 2400 4875 1800 5475 2100 4875 2400
+        0.000 1.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 4
+       1 1 1.00 60.00 120.00
+        4875 2400 4875 3000 5475 2700 4875 2400
+        0.000 1.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        4275 900 3975 1500 4275 2100
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        4275 900 4575 1500 4275 2100
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        4875 600 5400 600
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        2775 3600 2775 4200 3675 4200
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        2775 3000 2775 2700 3975 900
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 2
+       1 1 1.00 60.00 120.00
+        4875 4200 5400 4200
+        0.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        4275 3900 4575 3300 4275 2700
+        0.000 1.000 0.000
+3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3
+       1 1 1.00 60.00 120.00
+        4275 3900 3975 3300 4275 2700
+        0.000 1.000 0.000
+4 0 0 100 0 0 16 0.0000 4 180 540 1050 2475 1  ,  1\001
+4 0 0 100 0 0 12 0.0000 4 135 135 1350 1500 X\001
+4 0 0 100 0 0 16 0.0000 4 180 540 2475 1575 2  ,  0\001
+4 0 0 100 0 0 16 0.0000 4 180 540 2475 3375 2  ,  2\001
+4 0 0 100 0 0 12 0.0000 4 135 135 1350 3450 O\001
+4 0 0 100 0 0 16 0.0000 4 180 540 3975 675 3  ,  0\001
+4 0 0 100 0 0 12 0.0000 4 135 135 2850 600 X\001
+4 0 0 100 0 0 16 0.0000 4 180 540 3975 2475 0  ,  0\001
+4 0 0 100 0 0 12 0.0000 4 135 135 5250 1950 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 5250 2925 O\001
+4 0 0 100 0 0 16 0.0000 4 165 1050 5250 2475 Error state\001
+4 0 0 100 0 0 12 0.0000 4 135 135 3900 1575 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 4500 1575 O\001
+4 0 0 100 0 0 16 0.0000 4 165 945 5025 525 Pattern A\001
+4 0 0 100 0 0 16 0.0000 4 165 480 225 2250 Start\001
+4 0 0 100 0 0 12 0.0000 4 135 135 2775 2250 O\001
+4 0 0 100 0 0 16 0.0000 4 180 540 3975 4275 0  ,  3\001
+4 0 0 100 0 0 12 0.0000 4 135 135 2775 4275 O\001
+4 0 0 100 0 0 12 0.0000 4 135 135 2550 2850 X\001
+4 0 0 100 0 0 16 0.0000 4 165 930 4950 4125 Pattern B\001
+4 0 0 100 0 0 12 0.0000 4 135 135 3900 3375 X\001
+4 0 0 100 0 0 12 0.0000 4 135 135 4500 3375 O\001
+-6
diff --git a/doc/sync-prod2.jpg b/doc/sync-prod2.jpg
new file mode 100644 (file)
index 0000000..625888b
Binary files /dev/null and b/doc/sync-prod2.jpg differ
diff --git a/doc/sync-prod2.pdf b/doc/sync-prod2.pdf
new file mode 100644 (file)
index 0000000..69f86df
Binary files /dev/null and b/doc/sync-prod2.pdf differ
diff --git a/doc/sync-prod2.png b/doc/sync-prod2.png
new file mode 100644 (file)
index 0000000..413a5d3
Binary files /dev/null and b/doc/sync-prod2.png differ
diff --git a/doc/texinfo.tex b/doc/texinfo.tex
new file mode 100644 (file)
index 0000000..5426087
--- /dev/null
@@ -0,0 +1,8677 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2009-02-08.09}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007, 2008 and 2009 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 3, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING.  If not, write
+% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+% Boston, MA 02110-1301, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction.  (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar  = `\-
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar  = `\;
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be 
+               % {\code {{\tt \backslashcurfont }acronym}
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingyyy.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 24pt
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \indexdummies
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%      is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    out of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux/toc files.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+  \kern-.15em
+  \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+% 
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include file    insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable
+    \def\temp{\input #1 }%
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\next\centerH
+  \else
+    \let\next\centerV
+  \fi
+  \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+  {%
+    \hfil\break
+    \advance\hsize by -\leftskip
+    \advance\hsize by -\rightskip
+    \line{#1}%
+    \break
+  }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n   outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
+
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
+
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em.  So do
+% whichever is larger.
+%
+\def\dots{%
+  \leavevmode
+  \setbox0=\hbox{...}% get width of three periods
+  \ifdim\wd0 > 1.5em
+    \dimen0 = \wd0
+  \else
+    \dimen0 = 1.5em
+  \fi
+  \hbox to \dimen0{%
+    \hskip 0pt plus.25fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \iflinks
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   \openin 1 texinfo.cnf
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+% 
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+   @catcode`@\=@active
+   @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters.  hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens, with minor
+% changes for Texinfo.  It is included here under the GPL by permission
+% from the author, Heiko Oberdiek.
+% 
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+% 
+\def\HyPsdSubst#1#2#3{%
+  \def\HyPsdReplace##1#1##2\END{%
+    ##1%
+    \ifx\\##2\\%
+    \else
+      #2%
+      \HyReturnAfterFi{%
+        \HyPsdReplace##2\END
+      }%
+    \fi
+  }%
+  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+  \xdef#1{#1}% redefine it as its expansion; the definition is simply
+             % \lastnode when called from \setref -> \pdfmkdest.
+  \HyPsdSubst{(}{\realbackslash(}{#1}%
+  \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found.  (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+  \input pdfcolor
+  \pdfcatalog{/PageMode /UseOutlines}
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % pdftex (and the PDF format) support .png, .jpg, .pdf (among
+    % others).  Let's try in that order.
+    \let\pdfimgext=\empty
+    \begingroup
+      \openin 1 #1.png \ifeof 1
+        \openin 1 #1.jpg \ifeof 1
+          \openin 1 #1.jpeg \ifeof 1
+            \openin 1 #1.JPG \ifeof 1
+              \openin 1 #1.pdf \ifeof 1
+                \errhelp = \nopdfimagehelp
+                \errmessage{Could not find image file #1 for pdf}%
+              \else \gdef\pdfimgext{pdf}%
+              \fi
+            \else \gdef\pdfimgext{JPG}%
+            \fi
+          \else \gdef\pdfimgext{jpeg}%
+          \fi
+        \else \gdef\pdfimgext{jpg}%
+        \fi
+      \else \gdef\pdfimgext{png}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    % without \immediate, pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifdim \wd0 >0pt width \imagewidth \fi
+      \ifdim \wd2 >0pt height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.\pdfimgext
+       \else
+         {#1.\pdfimgext}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  %
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \turnoffactive
+    \activebackslashdouble
+    \makevalueexpandable
+    \def\pdfdestname{#1}%
+    \backslashparens\pdfdestname
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }}
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}
+  %
+  % by default, use a color that is dark enough to print on paper as
+  % nearly black, but still distinguishable for online viewing.
+  % (Defined in pdfcolor.tex.)
+  \let\urlcolor = \BrickRed
+  \let\linkcolor = \BrickRed
+  \def\endlink{\Black\pdfendlink}
+  %
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \def\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty
+      \def\pdfoutlinedest{#4}%
+    \else
+      % Doubled backslashes in the name.
+      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+       \backslashparens\pdfoutlinedest}%
+    \fi
+    %
+    % Also double the backslashes in the display string.
+    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+     \backslashparens\pdfoutlinetext}%
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Thanh's hack / proper braces in bookmarks
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\numchapentry##1##2##3##4{%
+       \def\thischapnum{##2}%
+       \def\thissecnum{0}%
+       \def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+       \advancenumber{chap\thischapnum}%
+       \def\thissecnum{##2}%
+       \def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+       \advancenumber{sec\thissecnum}%
+       \def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+       \advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % xx to do this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Right
+      % now, I guess we'll just let the pdf reader have its way.
+      \indexnofonts
+      \setupdatafile
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      % 
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      \leavevmode\urlcolor
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \linkcolor #1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+%
+% PDF CMaps.  See also LaTeX's t1.cmap.
+%
+% \cmapOT1
+\ifpdf
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1IT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1TT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+\else
+  \expandafter\let\csname cmapOT1\endcsname\gobble
+  \expandafter\let\csname cmapOT1IT\endcsname\gobble
+  \expandafter\let\csname cmapOT1TT\endcsname\gobble
+\fi
+
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
+% empty to omit).
+\def\setfont#1#2#3#4#5{%
+  \font#1=\fontprefix#2#3 scaled #4
+  \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt.  This is the default in
+% Texinfo.
+% 
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 11pt text font size definitions
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit.  This is for the GNU
+% Press printing of the Emacs 22 manual.  Maybe other manuals in the
+% future.  Used with @smallbook, which sets the leading to 12pt.
+% 
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12 
+\font\secsy=cmsy10 scaled \magstep1
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+
+% reduce space between paragraphs
+\divide\parskip by 2
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 10pt text font size definitions
+
+
+% We provide the user-level command
+%   @fonttextsize 10
+% (or 11) to redefine the text font size.  pt is assumed.
+% 
+\def\xword{10}
+\def\xiword{11}
+%
+\parseargdef\fonttextsize{%
+  \def\textsizearg{#1}%
+  \wlog{doing @fonttextsize \textsizearg}%
+  %
+  % Set \globaldefs so that documents can use this inside @tex, since
+  % makeinfo 4.8 does not support it, but we need it nonetheless.
+  % 
+ \begingroup \globaldefs=1
+  \ifx\textsizearg\xword \definetextfontsizex
+  \else \ifx\textsizearg\xiword \definetextfontsizexi
+  \else
+    \errhelp=\EMsimple
+    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+  \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
+  \def\lsize{reduced}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
+  \def\lsize{chap}\def\lllsize{subsec}%
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
+  \def\lsize{sec}\def\lllsize{text}%
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
+  \def\lsize{subsec}\def\lllsize{reduced}%
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
+  \def\lsize{text}\def\lllsize{small}%
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
+  \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}{OT1}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+\def\key #1{{\nohyphenation \uppercase{#1}}\null}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \plainfrenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active \catcode`\_=\active
+  \catcode`\'=\active \catcode`\`=\active
+  %
+  \global\def\code{\begingroup
+    \catcode\rquoteChar=\active \catcode\lquoteChar=\active
+    \let'\codequoteright \let`\codequoteleft
+    %
+    \catcode\dashChar=\active  \catcode\underChar=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\realdash
+     \let_\realunder
+    \fi
+    \codex
+  }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general.  @allowcodebreaks provides a way to control this.
+% 
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+  \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+% 
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+% 
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+% 
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+% 
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+% 
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+% 
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+% 
+% 
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  % 
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  % 
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  % 
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename 
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else 
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+% 
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+        \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+        \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+       \finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+               \let\tt=\authortt}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \leftline{\titlefonts\rm #1}
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\authorfont \leftline{#1}}%
+  \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -12pt
+  \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    % 
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+%                                      --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+       % Maybe so, but it also creates really weird page breaks when the
+       % table breaks over pages. Wouldn't \vfil be better?  Wait until the
+       % problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+       % The first column will be indented with the surrounding text.
+       \advance\hsize by\leftskip
+      \else
+       \ifsetpercent \else
+         % If user has not set preamble in terms of percent of \hsize
+         % we will advance \hsize by \multitablecolspace.
+         \advance\hsize by \multitablecolspace
+       \fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty                      % Nothing found.
+    \let\next\doignoretextzzz
+  \else                                        % Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy          % ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0     % We have just found the outermost @end.
+    \let\next\enddoignore
+  \else                                % Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\realdash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+  \escapechar = `\\     % use backslash in output files.
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  %
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % I don't entirely understand this, but when an index entry is
+  % generated from a macro call, the \endinput which \scanmacro inserts
+  % causes processing to be prematurely terminated.  This is,
+  % apparently, because \indexsorttmp is fully expanded, and \endinput
+  % is an expandable command.  The redefinition below makes \endinput
+  % disappear altogether for that purpose -- although logging shows that
+  % processing continues to some further point.  On the other hand, it
+  % seems \endinput does not hurt in the printed index arg, since that
+  % is still getting written without apparent harm.
+  % 
+  % Sample source (mac-idx3.tex, reported by Graham Percival to
+  % help-texinfo, 22may06):
+  % @macro funindex {WORD}
+  % @findex xyz
+  % @end macro
+  % ...
+  % @funindex commtest
+  % 
+  % The above is not enough to reproduce the bug, but it gives the flavor.
+  % 
+  % Sample whatsit resulting:
+  % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
+  % 
+  % So:
+  \let\endinput = \empty
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux and toc files, @ is the escape character.  So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files).  When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % Do the redefinitions.
+  \commondummies
+  \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+  %
+  % \definedummyword defines \#1 as \string\#1\space, thus effectively
+  % preventing its expansion.  This is used only for control% words,
+  % not control letters, because the \space would be incorrect for
+  % control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword  ##1{\def##1{\string##1\space}}%
+  \def\definedummyletter##1{\def##1{\string##1}}%
+  \let\definedummyaccent\definedummyletter
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\L
+  \definedummyword\OE
+  \definedummyword\O
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\l
+  \definedummyword\oe
+  \definedummyword\o
+  \definedummyword\ss
+  \definedummyword\exclamdown
+  \definedummyword\questiondown
+  \definedummyword\ordf
+  \definedummyword\ordm
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\minus
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\result
+  \definedummyword\textdegree
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  %
+  \normalturnoffactive
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \definedummyletter\!%
+  \definedummyaccent\"%
+  \definedummyaccent\'%
+  \definedummyletter\*%
+  \definedummyaccent\,%
+  \definedummyletter\.%
+  \definedummyletter\/%
+  \definedummyletter\:%
+  \definedummyaccent\=%
+  \definedummyletter\?%
+  \definedummyaccent\^%
+  \definedummyaccent\`%
+  \definedummyaccent\~%
+  \definedummyword\u
+  \definedummyword\v
+  \definedummyword\H
+  \definedummyword\dotaccent
+  \definedummyword\ringaccent
+  \definedummyword\tieaccent
+  \definedummyword\ubaraccent
+  \definedummyword\udotaccent
+  \definedummyword\dotless
+  %
+  % Texinfo font commands.
+  \definedummyword\b
+  \definedummyword\i
+  \definedummyword\r
+  \definedummyword\sc
+  \definedummyword\t
+  %
+  % Commands that take arguments.
+  \definedummyword\acronym
+  \definedummyword\cite
+  \definedummyword\code
+  \definedummyword\command
+  \definedummyword\dfn
+  \definedummyword\emph
+  \definedummyword\env
+  \definedummyword\file
+  \definedummyword\kbd
+  \definedummyword\key
+  \definedummyword\math
+  \definedummyword\option
+  \definedummyword\pxref
+  \definedummyword\ref
+  \definedummyword\samp
+  \definedummyword\strong
+  \definedummyword\tie
+  \definedummyword\uref
+  \definedummyword\url
+  \definedummyword\var
+  \definedummyword\verb
+  \definedummyword\w
+  \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\definedummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\definedummyletter##1{\let##1\empty}%
+  % Hopefully, all control words can become @asis.
+  \let\definedummyword\definedummyaccent
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\bullet{bullet}%
+  \def\comma{,}%
+  \def\copyright{copyright}%
+  \def\registeredsymbol{R}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\euro{euro}%
+  \def\expansion{==>}%
+  \def\minus{-}%
+  \def\pounds{pounds}%
+  \def\point{.}%
+  \def\print{-|}%
+  \def\result{=>}%
+  \def\textdegree{degrees}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  % 
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  % 
+  \macrolist
+}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \safewhatsit\dosubindwrite
+  }%
+  \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+  \fi
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+  }%
+  \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero.  The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{%
+\ifhmode
+  #1%
+\else
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \whatsitskip = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \whatsitpenalty = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\skip0 glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\whatsitskip
+  \fi
+  %
+  #1%
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    % 
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\whatsitskip
+  \fi
+\fi
+}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \plainfrenchspacing
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\backslashcurfont}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%      \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % Do not fill out the last line with white space.
+    \parfillskip = 0in
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % Do not prefer a separate line ending with a hyphen to fewer lines.
+    \finalhyphendemerits = 0
+    %
+    % \hangindent is only relevant when the entry text and page number
+    % don't both fit on one line.  In that case, bob suggests starting the
+    % dots pretty far over on the line.  Unfortunately, a large
+    % indentation looks wrong when the entry text itself is broken across
+    % lines.  So we use a small indentation and put up with long leaders.
+    %
+    % \hangafter is reset to 1 (which is the value we want) at the start
+    % of each paragraph, so we need not do anything with that.
+    \hangindent = 2em
+    %
+    % When the entry text needs to be broken, just fill out the first line
+    % with blank space.
+    \rightskip = 0pt plus1fil
+    %
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
+    %
+    % The following is kludged to not output a line of dots in the index if
+    % there are no page numbers.  The next person who breaks this will be
+    % cursed by a Unix daemon.
+    \setbox\boxA = \hbox{#1}%
+    \ifdim\wd\boxA = 0pt
+      \ %
+    \else
+      %
+      % If we must, put the page number on a line of its own, and fill out
+      % this line with blank space.  (The \hfil is overwhelmed with the
+      % fill leaders glue in \indexdotfill if the page number does fit.)
+      \hfil\penalty50
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      % The `\ ' here is removed by the implicit \unskip that TeX does as
+      % part of (the primitive) \par.  Without it, a spurious underfull
+      % \hbox ensues.
+      \ifpdf
+       \pdfgettoks#1.%
+       \ \the\toksA
+      \else
+       \ #1%
+      \fi
+    \fi
+    \par
+  \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+  % The following penalty ensures that the page builder is exercised
+  % _before_ we change the output routine.  This is necessary in the
+  % following situation:
+  %
+  % The last section of the index consists only of a single entry.
+  % Before this section, \pagetotal is less than \pagegoal, so no
+  % break occurs before the last section starts.  However, the last
+  % section, consisting of \initial and the single \entry, does not
+  % fit on the page and has to be broken off.  Without the following
+  % penalty the page builder will not be exercised until \eject
+  % below, and by that time we'll already have changed the output
+  % routine to the \balancecolumns version, so the next-to-last
+  % double-column page will be processed with \balancecolumns, which
+  % is wrong:  The two columns will go to the main vertical list, with
+  % the broken-off section in the recent contributions.  As soon as
+  % the output routine finishes, TeX starts reconsidering the page
+  % break.  The two columns and the broken-off section both fit on the
+  % page, because the two columns now take up only half of the page
+  % goal.  When TeX sees \eject from below which follows the final
+  % section, it invokes the new output routine that we've set after
+  % \balancecolumns below; \onepageout will try to fit the two columns
+  % and the final section into the vbox of \pageheight (see
+  % \pagebody), causing an overfull box.
+  %
+  % Note that glue won't work here, because glue does not exercise the
+  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+  \penalty0
+  %
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unmlevel
+      \chardef\unmlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+       \errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unmlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unmlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+       \unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+         \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+         \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  \message{\putwordChapter\space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  \def\appendixnum{\putwordAppendix\space \appendixletter}%
+  \message{\appendixnum}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:                --kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}%
+  \bigskip \par\penalty 200\relax
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+  \pchapsepmacro
+  {%
+    \chapfonts \rm
+    %
+    % Have to define \thissection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\thissection{#1}%
+    \gdef\thischaptername{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \def\temptype{#2}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+      \gdef\thischapternum{}%
+      \gdef\thischapter{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+      \gdef\thischapternum{}%
+      \gdef\thischapter{}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+      \xdef\thischapternum{\appendixletter}%
+      % We don't substitute the actual chapter name into \thischapter
+      % because we don't want its macros evaluated now.  And we don't
+      % use \thissection because that changes with each section.
+      %
+      \xdef\thischapter{\putwordAppendix{} \appendixletter:
+                        \noexpand\thischaptername}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+      \xdef\thischapternum{\the\chapno}%
+      \xdef\thischapter{\putwordChapter{} \the\chapno:
+                        \noexpand\thischaptername}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Only insert the space after the number if we have a section number.
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\thissection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \thissection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\thissection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\thissection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)
+  \vskip-\parskip
+  % 
+  % This is purely so the last item on the list is a known \penalty >
+  % 10000.  This is so \startdefun can avoid allowing breakpoints after
+  % section headings.  Otherwise, it would insert a valid breakpoint between:
+  % 
+  %   @section sec-whatever
+  %   @deffn def-whatever
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+% 
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \def\thischapter{}%
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref.  We always output on
+% \jobname.toc even if this is redefined.
+% 
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\*=\ptexstar
+  \let\t=\ptext
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+                               % side, and for 6pt waste from
+                               % each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  % Flag to tell @lisp, etc., not to narrow margin.
+  \let\nonarrowing = t%
+  \vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+         \hskip\lskip
+         \vrule\kern3pt
+         \vbox\bgroup
+             \kern3pt
+             \hsize=\cartinner
+             \baselineskip=\normbskip
+             \lineskip=\normlskip
+             \parskip=\normpskip
+             \vskip -\parskip
+             \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+             \kern3pt
+         \egroup
+         \kern3pt\vrule
+         \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    % end paragraph for sake of leading, in case document has no blank
+    % line.  This is redundant with what happens in \aboveenvbreak, but
+    % we need to do it before changing the fonts, and it's inconvenient
+    % to change the fonts afterward.
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+  \makedispenv{#1}{#3}
+  \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+  \nonfillstart
+  \tt\quoteexpand
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\undefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+
+% Allow an option to not replace quotes with a regular directed right
+% quote/apostrophe (char 0x27), but instead use the undirected quote
+% from cmtt (char 0x0d).  The undirected quote is ugly, so don't make it
+% the default, but it works for pasting with more pdf viewers (at least
+% evince), the lilypond developers report.  xpdf does work with the
+% regular 0x27.  
+% 
+\def\codequoteright{%
+  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+      '%
+    \else \char'15 \fi
+  \else \char'15 \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+% 
+\def\codequoteleft{%
+  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+      `%
+    \else \char'22 \fi
+  \else \char'22 \fi
+}
+%
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+  \catcode`\'=\active
+  \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}%
+  %
+  \catcode`\`=\active
+  \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}%
+  %
+  \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  \quoteexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \input #1
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+    \defunpenalty=10003 % Will keep this @deffn together with the
+                        % following @def command, see below.
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \printdefunline, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    %
+    % As a minor refinement, we avoid "club" headers by signalling
+    % with penalty of 10003 after the very first @deffn in the
+    % sequence (see above), and penalty of 10002 after any following
+    % @def command.
+    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % How we'll format the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  % (plain.tex says that \dimen1 should be used only as global.)
+  \parshape 2 0in \dimen0 \defargsindent \dimen2
+  %
+  % Put the type name to the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% return value type
+    \ifx\temp\empty\else \tclose{\temp} \fi
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  Let's try @var for that.
+  \let\var=\ttslanted
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+  \errmessage{Unbalanced parentheses in @def}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \errmessage{Unbalanced square braces in @def}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+\def\scanmacro#1{%
+  \begingroup
+    \newlinechar`\^^M
+    \let\xeatspaces\eatspaces
+    % Undo catcode changes of \startcontents and \doprintindex
+    % When called from @insertcopying or (short)caption, we need active
+    % backslash to get it printed correctly.  Previously, we had
+    % \catcode`\\=\other instead.  We'll see whether a problem appears
+    % with macro expansion.                            --kasal, 19aug04
+    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+    % ... and \example
+    \spaceisspace
+    %
+    % Append \endinput to make sure that TeX does not see the ending newline.
+    % I've verified that it is necessary both for e-TeX and for ordinary TeX
+    %                                                  --kasal, 29nov03
+    \scantokens{#1\endinput}%
+  \endgroup
+}
+
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\definedummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+% 
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion.  Must do this non-globally, to
+% confine the change to the current group.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+  \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
+}
+
+\def\scanargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+\def\macroargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\definedummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\definedummyword \noexpand#1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \edef\writexrdef##1##2{%
+       \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+         ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\thissection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
+    }%
+  \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual\unskip}%
+  \setbox0=\hbox{\printedrefname\unskip}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+      % Use the node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1 > 0pt
+        % It is in another manual, so we don't have it.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    \leavevmode
+    \getfilename{#4}%
+    {\indexnofonts
+     \turnoffactive
+     % See comments at \activebackslashdouble.
+     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+      \backslashparens\pdfxrefdest}%
+     %
+     \ifnum\filenamelength>0
+       \startlink attr{/Border [0 0 0]}%
+         goto file{\the\filename.pdf} name{\pdfxrefdest}%
+     \else
+       \startlink attr{/Border [0 0 0]}%
+         goto name{\pdfmkpgn{\pdfxrefdest}}%
+     \fi
+    }%
+    \linkcolor
+  \fi
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd0 = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % if the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd1 > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    %
+    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+    % insert empty discretionaries after hyphens, which means that it will
+    % not find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens, this
+    % is a loss.  Therefore, we give the text of the node name again, so it
+    % is as if TeX is seeing it for the first time.
+    \ifdim \wd1 > 0pt
+      \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+    \else
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via a macro so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  {% The node name might contain 8-bit characters, which in our current
+   % implementation are changed to commands like @'e.  Don't let these
+   % mess up the control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safexrefname{#1}%
+  }%
+  %
+  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR\safexrefname\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+      {\safexrefname}}%
+  \fi
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
+  {%
+    \count1=128
+    \def\loop{%
+      \catcode\count1=\other
+      \advance\count1 by 1
+      \ifnum \count1<256 \loop \fi
+    }%
+  }%
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\bigskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+    \line\bgroup
+  \fi
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \egroup \bigbreak \fi  % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \thissection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\thissection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+       \appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies
+        %
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+       \scanexp{%
+         \xdef\noexpand\gtemp{%
+           \ifx\thisshortcaption\empty
+             \thiscaption
+           \else
+             \thisshortcaption
+           \fi
+         }%
+       }%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+         \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start floating, we have to issue warning
+  % whenever an insert appears inside a float which could possibly
+  % float. --kasal, 26may04
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+
+\message{localization,}
+
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language (de) or locale (de_DE)
+% abbreviation.  It would be nice if we could set up a hyphenation file.
+%
+{
+  \catcode`\_ = \active
+  \globaldefs=1
+\parseargdef\documentlanguage{\begingroup
+  \let_=\normalunderscore  % normal _ character for filenames
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file by the name they passed if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \documentlanguagetrywithoutunderscore{#1_\finish}%
+    \else
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup
+\endgroup}
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+% 
+\def\documentlanguagetrywithoutunderscore#1_#2\finish{%
+  \openin 1 txi-#1.tex
+  \ifeof 1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+  \else
+    \input txi-#1.tex
+  \fi
+  \closein 1
+}
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \global\catcode\count255=#1
+      \advance\count255 by 1
+   \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \catcode\count255=#1
+      \advance\count255 by 1
+   \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+  % Encoding being declared for the document.
+  \def\declaredencoding{\csname #1.enc\endcsname}%
+  %
+  % Supported encodings: names converted to tokens in order to be able
+  % to compare them with \ifx.
+  \def\ascii{\csname US-ASCII.enc\endcsname}%
+  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+  \def\latone{\csname ISO-8859-1.enc\endcsname}%
+  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+  \def\utfeight{\csname UTF-8.enc\endcsname}%
+  %
+  \ifx \declaredencoding \ascii
+     \asciichardefs
+  %
+  \else \ifx \declaredencoding \lattwo
+     \setnonasciicharscatcode\active
+     \lattwochardefs
+  %
+  \else \ifx \declaredencoding \latone 
+     \setnonasciicharscatcode\active
+     \latonechardefs
+  %
+  \else \ifx \declaredencoding \latnine
+     \setnonasciicharscatcode\active
+     \latninechardefs
+  %
+  \else \ifx \declaredencoding \utfeight
+     \setnonasciicharscatcode\active
+     \utfeightchardefs
+  %
+  \else 
+    \message{Unknown document encoding #1, ignoring.}%
+  %
+  \fi % utfeight
+  \fi % latnine
+  \fi % latone
+  \fi % lattwo
+  \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+% 
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+  \gdef^^a0{~} 
+  \gdef^^a1{\exclamdown}
+  \gdef^^a2{\missingcharmsg{CENT SIGN}} 
+  \gdef^^a3{{\pounds}}
+  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdef^^a5{\missingcharmsg{YEN SIGN}}
+  \gdef^^a6{\missingcharmsg{BROKEN BAR}} 
+  \gdef^^a7{\S}
+  \gdef^^a8{\"{}} 
+  \gdef^^a9{\copyright} 
+  \gdef^^aa{\ordf}
+  \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} 
+  \gdef^^ac{$\lnot$}
+  \gdef^^ad{\-} 
+  \gdef^^ae{\registeredsymbol} 
+  \gdef^^af{\={}}
+  %
+  \gdef^^b0{\textdegree}
+  \gdef^^b1{$\pm$}
+  \gdef^^b2{$^2$}
+  \gdef^^b3{$^3$}
+  \gdef^^b4{\'{}}
+  \gdef^^b5{$\mu$}
+  \gdef^^b6{\P}
+  %
+  \gdef^^b7{$^.$}
+  \gdef^^b8{\cedilla\ }
+  \gdef^^b9{$^1$}
+  \gdef^^ba{\ordm}
+  %
+  \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+  \gdef^^bc{$1\over4$}
+  \gdef^^bd{$1\over2$}
+  \gdef^^be{$3\over4$}
+  \gdef^^bf{\questiondown}
+  %
+  \gdef^^c0{\`A}
+  \gdef^^c1{\'A}
+  \gdef^^c2{\^A}
+  \gdef^^c3{\~A}
+  \gdef^^c4{\"A}
+  \gdef^^c5{\ringaccent A} 
+  \gdef^^c6{\AE}
+  \gdef^^c7{\cedilla C}
+  \gdef^^c8{\`E}
+  \gdef^^c9{\'E}
+  \gdef^^ca{\^E}
+  \gdef^^cb{\"E}
+  \gdef^^cc{\`I}
+  \gdef^^cd{\'I}
+  \gdef^^ce{\^I}
+  \gdef^^cf{\"I}
+  %
+  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}}
+  \gdef^^d1{\~N}
+  \gdef^^d2{\`O}
+  \gdef^^d3{\'O}
+  \gdef^^d4{\^O}
+  \gdef^^d5{\~O}
+  \gdef^^d6{\"O}
+  \gdef^^d7{$\times$}
+  \gdef^^d8{\O}
+  \gdef^^d9{\`U}
+  \gdef^^da{\'U}
+  \gdef^^db{\^U}
+  \gdef^^dc{\"U}
+  \gdef^^dd{\'Y}
+  \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}}
+  \gdef^^df{\ss}
+  %
+  \gdef^^e0{\`a}
+  \gdef^^e1{\'a}
+  \gdef^^e2{\^a}
+  \gdef^^e3{\~a}
+  \gdef^^e4{\"a}
+  \gdef^^e5{\ringaccent a}
+  \gdef^^e6{\ae}
+  \gdef^^e7{\cedilla c}
+  \gdef^^e8{\`e}
+  \gdef^^e9{\'e}
+  \gdef^^ea{\^e}
+  \gdef^^eb{\"e}
+  \gdef^^ec{\`{\dotless i}}
+  \gdef^^ed{\'{\dotless i}}
+  \gdef^^ee{\^{\dotless i}}
+  \gdef^^ef{\"{\dotless i}}
+  %
+  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}}
+  \gdef^^f1{\~n}
+  \gdef^^f2{\`o}
+  \gdef^^f3{\'o}
+  \gdef^^f4{\^o}
+  \gdef^^f5{\~o}
+  \gdef^^f6{\"o}
+  \gdef^^f7{$\div$}
+  \gdef^^f8{\o}
+  \gdef^^f9{\`u}
+  \gdef^^fa{\'u}
+  \gdef^^fb{\^u}
+  \gdef^^fc{\"u}
+  \gdef^^fd{\'y}
+  \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}}
+  \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+  % Encoding is almost identical to Latin1.
+  \latonechardefs
+  %
+  \gdef^^a4{\euro}
+  \gdef^^a6{\v S}
+  \gdef^^a8{\v s}
+  \gdef^^b4{\v Z}
+  \gdef^^b8{\v z}
+  \gdef^^bc{\OE}
+  \gdef^^bd{\oe}
+  \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+  \gdef^^a0{~}
+  \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}}
+  \gdef^^a2{\u{}}
+  \gdef^^a3{\L}
+  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdef^^a5{\v L}
+  \gdef^^a6{\'S}
+  \gdef^^a7{\S}
+  \gdef^^a8{\"{}}
+  \gdef^^a9{\v S}
+  \gdef^^aa{\cedilla S}
+  \gdef^^ab{\v T}
+  \gdef^^ac{\'Z}
+  \gdef^^ad{\-}
+  \gdef^^ae{\v Z}
+  \gdef^^af{\dotaccent Z}
+  %
+  \gdef^^b0{\textdegree}
+  \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}}
+  \gdef^^b2{\missingcharmsg{OGONEK}}
+  \gdef^^b3{\l}
+  \gdef^^b4{\'{}}
+  \gdef^^b5{\v l}
+  \gdef^^b6{\'s}
+  \gdef^^b7{\v{}}
+  \gdef^^b8{\cedilla\ }
+  \gdef^^b9{\v s}
+  \gdef^^ba{\cedilla s}
+  \gdef^^bb{\v t}
+  \gdef^^bc{\'z}
+  \gdef^^bd{\H{}}
+  \gdef^^be{\v z}
+  \gdef^^bf{\dotaccent z}
+  %
+  \gdef^^c0{\'R}
+  \gdef^^c1{\'A}
+  \gdef^^c2{\^A}
+  \gdef^^c3{\u A}
+  \gdef^^c4{\"A}
+  \gdef^^c5{\'L}
+  \gdef^^c6{\'C}
+  \gdef^^c7{\cedilla C}
+  \gdef^^c8{\v C}
+  \gdef^^c9{\'E}
+  \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}}
+  \gdef^^cb{\"E}
+  \gdef^^cc{\v E}
+  \gdef^^cd{\'I}
+  \gdef^^ce{\^I}
+  \gdef^^cf{\v D}
+  %
+  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}}
+  \gdef^^d1{\'N}
+  \gdef^^d2{\v N}
+  \gdef^^d3{\'O}
+  \gdef^^d4{\^O}
+  \gdef^^d5{\H O}
+  \gdef^^d6{\"O}
+  \gdef^^d7{$\times$}
+  \gdef^^d8{\v R}
+  \gdef^^d9{\ringaccent U} 
+  \gdef^^da{\'U}
+  \gdef^^db{\H U}
+  \gdef^^dc{\"U}
+  \gdef^^dd{\'Y}
+  \gdef^^de{\cedilla T}
+  \gdef^^df{\ss}
+  %
+  \gdef^^e0{\'r}
+  \gdef^^e1{\'a}
+  \gdef^^e2{\^a}
+  \gdef^^e3{\u a}
+  \gdef^^e4{\"a}
+  \gdef^^e5{\'l}
+  \gdef^^e6{\'c}
+  \gdef^^e7{\cedilla c}
+  \gdef^^e8{\v c}
+  \gdef^^e9{\'e}
+  \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}}
+  \gdef^^eb{\"e}
+  \gdef^^ec{\v e}
+  \gdef^^ed{\'\i}
+  \gdef^^ee{\^\i}
+  \gdef^^ef{\v d}
+  %
+  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}}
+  \gdef^^f1{\'n}
+  \gdef^^f2{\v n}
+  \gdef^^f3{\'o}
+  \gdef^^f4{\^o}
+  \gdef^^f5{\H o}
+  \gdef^^f6{\"o}
+  \gdef^^f7{$\div$}
+  \gdef^^f8{\v r}
+  \gdef^^f9{\ringaccent u}
+  \gdef^^fa{\'u}
+  \gdef^^fb{\H u}
+  \gdef^^fc{\"u}
+  \gdef^^fd{\'y}
+  \gdef^^fe{\cedilla t}
+  \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+% 
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions.  It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+% 
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+  \ifx #1\relax
+    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+  \else
+    \expandafter #1%
+  \fi
+}
+
+\begingroup
+  \catcode`\~13
+  \catcode`\"12
+
+  \def\UTFviiiLoop{%
+    \global\catcode\countUTFx\active
+    \uccode`\~\countUTFx
+    \uppercase\expandafter{\UTFviiiTmp}%
+    \advance\countUTFx by 1
+    \ifnum\countUTFx < \countUTFy
+      \expandafter\UTFviiiLoop
+    \fi}
+
+  \countUTFx = "C2
+  \countUTFy = "E0
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+  \UTFviiiLoop
+
+  \countUTFx = "E0
+  \countUTFy = "F0
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+  \UTFviiiLoop
+
+  \countUTFx = "F0
+  \countUTFy = "F4
+  \def\UTFviiiTmp{%
+    \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+  \UTFviiiLoop
+\endgroup
+
+\begingroup
+  \catcode`\"=12
+  \catcode`\<=12
+  \catcode`\.=12
+  \catcode`\,=12
+  \catcode`\;=12
+  \catcode`\!=12
+  \catcode`\~=13
+
+  \gdef\DeclareUnicodeCharacter#1#2{%
+    \countUTFz = "#1\relax
+    \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+    \begingroup
+      \parseXMLCharref
+      \def\UTFviiiTwoOctets##1##2{%
+        \csname u8:##1\string ##2\endcsname}%
+      \def\UTFviiiThreeOctets##1##2##3{%
+        \csname u8:##1\string ##2\string ##3\endcsname}%
+      \def\UTFviiiFourOctets##1##2##3##4{%
+        \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+      \expandafter\expandafter\expandafter\expandafter
+       \expandafter\expandafter\expandafter
+       \gdef\UTFviiiTmp{#2}%
+    \endgroup}
+
+  \gdef\parseXMLCharref{%
+    \ifnum\countUTFz < "A0\relax
+      \errhelp = \EMsimple
+      \errmessage{Cannot define Unicode char value < 00A0}%
+    \else\ifnum\countUTFz < "800\relax
+      \parseUTFviiiA,%
+      \parseUTFviiiB C\UTFviiiTwoOctets.,%
+    \else\ifnum\countUTFz < "10000\relax
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+    \else
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiA!%
+      \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+    \fi\fi\fi
+  }
+
+  \gdef\parseUTFviiiA#1{%
+    \countUTFx = \countUTFz
+    \divide\countUTFz by 64
+    \countUTFy = \countUTFz
+    \multiply\countUTFz by 64
+    \advance\countUTFx by -\countUTFz
+    \advance\countUTFx by 128
+    \uccode `#1\countUTFx
+    \countUTFz = \countUTFy}
+
+  \gdef\parseUTFviiiB#1#2#3#4{%
+    \advance\countUTFz by "#10\relax
+    \uccode `#3\countUTFz
+    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+  \DeclareUnicodeCharacter{00A0}{\tie}
+  \DeclareUnicodeCharacter{00A1}{\exclamdown}
+  \DeclareUnicodeCharacter{00A3}{\pounds}
+  \DeclareUnicodeCharacter{00A8}{\"{ }}
+  \DeclareUnicodeCharacter{00A9}{\copyright}
+  \DeclareUnicodeCharacter{00AA}{\ordf}
+  \DeclareUnicodeCharacter{00AD}{\-}
+  \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+  \DeclareUnicodeCharacter{00AF}{\={ }}
+
+  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+  \DeclareUnicodeCharacter{00B4}{\'{ }}
+  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+  \DeclareUnicodeCharacter{00BA}{\ordm}
+  \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+  \DeclareUnicodeCharacter{00C0}{\`A}
+  \DeclareUnicodeCharacter{00C1}{\'A}
+  \DeclareUnicodeCharacter{00C2}{\^A}
+  \DeclareUnicodeCharacter{00C3}{\~A}
+  \DeclareUnicodeCharacter{00C4}{\"A}
+  \DeclareUnicodeCharacter{00C5}{\AA}
+  \DeclareUnicodeCharacter{00C6}{\AE}
+  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+  \DeclareUnicodeCharacter{00C8}{\`E}
+  \DeclareUnicodeCharacter{00C9}{\'E}
+  \DeclareUnicodeCharacter{00CA}{\^E}
+  \DeclareUnicodeCharacter{00CB}{\"E}
+  \DeclareUnicodeCharacter{00CC}{\`I}
+  \DeclareUnicodeCharacter{00CD}{\'I}
+  \DeclareUnicodeCharacter{00CE}{\^I}
+  \DeclareUnicodeCharacter{00CF}{\"I}
+
+  \DeclareUnicodeCharacter{00D1}{\~N}
+  \DeclareUnicodeCharacter{00D2}{\`O}
+  \DeclareUnicodeCharacter{00D3}{\'O}
+  \DeclareUnicodeCharacter{00D4}{\^O}
+  \DeclareUnicodeCharacter{00D5}{\~O}
+  \DeclareUnicodeCharacter{00D6}{\"O}
+  \DeclareUnicodeCharacter{00D8}{\O}
+  \DeclareUnicodeCharacter{00D9}{\`U}
+  \DeclareUnicodeCharacter{00DA}{\'U}
+  \DeclareUnicodeCharacter{00DB}{\^U}
+  \DeclareUnicodeCharacter{00DC}{\"U}
+  \DeclareUnicodeCharacter{00DD}{\'Y}
+  \DeclareUnicodeCharacter{00DF}{\ss}
+
+  \DeclareUnicodeCharacter{00E0}{\`a}
+  \DeclareUnicodeCharacter{00E1}{\'a}
+  \DeclareUnicodeCharacter{00E2}{\^a}
+  \DeclareUnicodeCharacter{00E3}{\~a}
+  \DeclareUnicodeCharacter{00E4}{\"a}
+  \DeclareUnicodeCharacter{00E5}{\aa}
+  \DeclareUnicodeCharacter{00E6}{\ae}
+  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+  \DeclareUnicodeCharacter{00E8}{\`e}
+  \DeclareUnicodeCharacter{00E9}{\'e}
+  \DeclareUnicodeCharacter{00EA}{\^e}
+  \DeclareUnicodeCharacter{00EB}{\"e}
+  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+  \DeclareUnicodeCharacter{00F1}{\~n}
+  \DeclareUnicodeCharacter{00F2}{\`o}
+  \DeclareUnicodeCharacter{00F3}{\'o}
+  \DeclareUnicodeCharacter{00F4}{\^o}
+  \DeclareUnicodeCharacter{00F5}{\~o}
+  \DeclareUnicodeCharacter{00F6}{\"o}
+  \DeclareUnicodeCharacter{00F8}{\o}
+  \DeclareUnicodeCharacter{00F9}{\`u}
+  \DeclareUnicodeCharacter{00FA}{\'u}
+  \DeclareUnicodeCharacter{00FB}{\^u}
+  \DeclareUnicodeCharacter{00FC}{\"u}
+  \DeclareUnicodeCharacter{00FD}{\'y}
+  \DeclareUnicodeCharacter{00FF}{\"y}
+
+  \DeclareUnicodeCharacter{0100}{\=A}
+  \DeclareUnicodeCharacter{0101}{\=a}
+  \DeclareUnicodeCharacter{0102}{\u{A}}
+  \DeclareUnicodeCharacter{0103}{\u{a}}
+  \DeclareUnicodeCharacter{0106}{\'C}
+  \DeclareUnicodeCharacter{0107}{\'c}
+  \DeclareUnicodeCharacter{0108}{\^C}
+  \DeclareUnicodeCharacter{0109}{\^c}
+  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+  \DeclareUnicodeCharacter{010C}{\v{C}}
+  \DeclareUnicodeCharacter{010D}{\v{c}}
+  \DeclareUnicodeCharacter{010E}{\v{D}}
+
+  \DeclareUnicodeCharacter{0112}{\=E}
+  \DeclareUnicodeCharacter{0113}{\=e}
+  \DeclareUnicodeCharacter{0114}{\u{E}}
+  \DeclareUnicodeCharacter{0115}{\u{e}}
+  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+  \DeclareUnicodeCharacter{011A}{\v{E}}
+  \DeclareUnicodeCharacter{011B}{\v{e}}
+  \DeclareUnicodeCharacter{011C}{\^G}
+  \DeclareUnicodeCharacter{011D}{\^g}
+  \DeclareUnicodeCharacter{011E}{\u{G}}
+  \DeclareUnicodeCharacter{011F}{\u{g}}
+
+  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+  \DeclareUnicodeCharacter{0124}{\^H}
+  \DeclareUnicodeCharacter{0125}{\^h}
+  \DeclareUnicodeCharacter{0128}{\~I}
+  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+  \DeclareUnicodeCharacter{012A}{\=I}
+  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+  \DeclareUnicodeCharacter{012C}{\u{I}}
+  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+  \DeclareUnicodeCharacter{0131}{\dotless{i}}
+  \DeclareUnicodeCharacter{0132}{IJ}
+  \DeclareUnicodeCharacter{0133}{ij}
+  \DeclareUnicodeCharacter{0134}{\^J}
+  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+  \DeclareUnicodeCharacter{0139}{\'L}
+  \DeclareUnicodeCharacter{013A}{\'l}
+
+  \DeclareUnicodeCharacter{0141}{\L}
+  \DeclareUnicodeCharacter{0142}{\l}
+  \DeclareUnicodeCharacter{0143}{\'N}
+  \DeclareUnicodeCharacter{0144}{\'n}
+  \DeclareUnicodeCharacter{0147}{\v{N}}
+  \DeclareUnicodeCharacter{0148}{\v{n}}
+  \DeclareUnicodeCharacter{014C}{\=O}
+  \DeclareUnicodeCharacter{014D}{\=o}
+  \DeclareUnicodeCharacter{014E}{\u{O}}
+  \DeclareUnicodeCharacter{014F}{\u{o}}
+
+  \DeclareUnicodeCharacter{0150}{\H{O}}
+  \DeclareUnicodeCharacter{0151}{\H{o}}
+  \DeclareUnicodeCharacter{0152}{\OE}
+  \DeclareUnicodeCharacter{0153}{\oe}
+  \DeclareUnicodeCharacter{0154}{\'R}
+  \DeclareUnicodeCharacter{0155}{\'r}
+  \DeclareUnicodeCharacter{0158}{\v{R}}
+  \DeclareUnicodeCharacter{0159}{\v{r}}
+  \DeclareUnicodeCharacter{015A}{\'S}
+  \DeclareUnicodeCharacter{015B}{\'s}
+  \DeclareUnicodeCharacter{015C}{\^S}
+  \DeclareUnicodeCharacter{015D}{\^s}
+  \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+  \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+  \DeclareUnicodeCharacter{0160}{\v{S}}
+  \DeclareUnicodeCharacter{0161}{\v{s}}
+  \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+  \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+  \DeclareUnicodeCharacter{0164}{\v{T}}
+
+  \DeclareUnicodeCharacter{0168}{\~U}
+  \DeclareUnicodeCharacter{0169}{\~u}
+  \DeclareUnicodeCharacter{016A}{\=U}
+  \DeclareUnicodeCharacter{016B}{\=u}
+  \DeclareUnicodeCharacter{016C}{\u{U}}
+  \DeclareUnicodeCharacter{016D}{\u{u}}
+  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+  \DeclareUnicodeCharacter{0170}{\H{U}}
+  \DeclareUnicodeCharacter{0171}{\H{u}}
+  \DeclareUnicodeCharacter{0174}{\^W}
+  \DeclareUnicodeCharacter{0175}{\^w}
+  \DeclareUnicodeCharacter{0176}{\^Y}
+  \DeclareUnicodeCharacter{0177}{\^y}
+  \DeclareUnicodeCharacter{0178}{\"Y}
+  \DeclareUnicodeCharacter{0179}{\'Z}
+  \DeclareUnicodeCharacter{017A}{\'z}
+  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+  \DeclareUnicodeCharacter{017D}{\v{Z}}
+  \DeclareUnicodeCharacter{017E}{\v{z}}
+
+  \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+  \DeclareUnicodeCharacter{01C5}{D\v{z}}
+  \DeclareUnicodeCharacter{01C6}{d\v{z}}
+  \DeclareUnicodeCharacter{01C7}{LJ}
+  \DeclareUnicodeCharacter{01C8}{Lj}
+  \DeclareUnicodeCharacter{01C9}{lj}
+  \DeclareUnicodeCharacter{01CA}{NJ}
+  \DeclareUnicodeCharacter{01CB}{Nj}
+  \DeclareUnicodeCharacter{01CC}{nj}
+  \DeclareUnicodeCharacter{01CD}{\v{A}}
+  \DeclareUnicodeCharacter{01CE}{\v{a}}
+  \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+  \DeclareUnicodeCharacter{01D1}{\v{O}}
+  \DeclareUnicodeCharacter{01D2}{\v{o}}
+  \DeclareUnicodeCharacter{01D3}{\v{U}}
+  \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+  \DeclareUnicodeCharacter{01E2}{\={\AE}}
+  \DeclareUnicodeCharacter{01E3}{\={\ae}}
+  \DeclareUnicodeCharacter{01E6}{\v{G}}
+  \DeclareUnicodeCharacter{01E7}{\v{g}}
+  \DeclareUnicodeCharacter{01E8}{\v{K}}
+  \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+  \DeclareUnicodeCharacter{01F1}{DZ}
+  \DeclareUnicodeCharacter{01F2}{Dz}
+  \DeclareUnicodeCharacter{01F3}{dz}
+  \DeclareUnicodeCharacter{01F4}{\'G}
+  \DeclareUnicodeCharacter{01F5}{\'g}
+  \DeclareUnicodeCharacter{01F8}{\`N}
+  \DeclareUnicodeCharacter{01F9}{\`n}
+  \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+  \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+  \DeclareUnicodeCharacter{01FE}{\'{\O}}
+  \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+  \DeclareUnicodeCharacter{021E}{\v{H}}
+  \DeclareUnicodeCharacter{021F}{\v{h}}
+
+  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+  \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+  \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+  \DeclareUnicodeCharacter{0232}{\=Y}
+  \DeclareUnicodeCharacter{0233}{\=y}
+  \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+  \DeclareUnicodeCharacter{1E20}{\=G}
+  \DeclareUnicodeCharacter{1E21}{\=g}
+  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+  \DeclareUnicodeCharacter{1E26}{\"H}
+  \DeclareUnicodeCharacter{1E27}{\"h}
+
+  \DeclareUnicodeCharacter{1E30}{\'K}
+  \DeclareUnicodeCharacter{1E31}{\'k}
+  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+  \DeclareUnicodeCharacter{1E3E}{\'M}
+  \DeclareUnicodeCharacter{1E3F}{\'m}
+
+  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+  \DeclareUnicodeCharacter{1E54}{\'P}
+  \DeclareUnicodeCharacter{1E55}{\'p}
+  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+  \DeclareUnicodeCharacter{1E7C}{\~V}
+  \DeclareUnicodeCharacter{1E7D}{\~v}
+  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+  \DeclareUnicodeCharacter{1E80}{\`W}
+  \DeclareUnicodeCharacter{1E81}{\`w}
+  \DeclareUnicodeCharacter{1E82}{\'W}
+  \DeclareUnicodeCharacter{1E83}{\'w}
+  \DeclareUnicodeCharacter{1E84}{\"W}
+  \DeclareUnicodeCharacter{1E85}{\"w}
+  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+  \DeclareUnicodeCharacter{1E8C}{\"X}
+  \DeclareUnicodeCharacter{1E8D}{\"x}
+  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+  \DeclareUnicodeCharacter{1E90}{\^Z}
+  \DeclareUnicodeCharacter{1E91}{\^z}
+  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+  \DeclareUnicodeCharacter{1E97}{\"t}
+  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+  \DeclareUnicodeCharacter{1EBC}{\~E}
+  \DeclareUnicodeCharacter{1EBD}{\~e}
+
+  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+  \DeclareUnicodeCharacter{1EF2}{\`Y}
+  \DeclareUnicodeCharacter{1EF3}{\`y}
+  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+  \DeclareUnicodeCharacter{1EF8}{\~Y}
+  \DeclareUnicodeCharacter{1EF9}{\~y}
+
+  \DeclareUnicodeCharacter{2013}{--}
+  \DeclareUnicodeCharacter{2014}{---}
+  \DeclareUnicodeCharacter{2022}{\bullet}
+  \DeclareUnicodeCharacter{2026}{\dots}
+  \DeclareUnicodeCharacter{20AC}{\euro}
+
+  \DeclareUnicodeCharacter{2192}{\expansion}
+  \DeclareUnicodeCharacter{21D2}{\result}
+
+  \DeclareUnicodeCharacter{2212}{\minus}
+  \DeclareUnicodeCharacter{2217}{\point}
+  \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+   \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+    % if we don't reset these, they will remain at "1 true in" of
+    % whatever layout pdftex was dumped with.
+    \pdfhorigin = 1 true in
+    \pdfvorigin = 1 true in
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {-.2in}{0in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+%  @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+% 
+@def@normalturnoffactive{%
+  @let\=@normalbackslash
+  @let"=@normaldoublequote
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+  @unsepspaces
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/doc/using.texi b/doc/using.texi
new file mode 100644 (file)
index 0000000..c160d6e
--- /dev/null
@@ -0,0 +1,891 @@
+@menu
+* Documentation::            Getting Documentation
+* CGoban::                   Running GNU Go with CGoban
+* Other Clients::            Other Clients
+* Ascii::                    The Ascii Interface
+* Emacs::                    GNU Go mode in Emacs
+* GMP and GTP::              The Go Modem Protocol and Go Text Protocol
+* Tournaments::              Computer Tournaments
+* SGF Support::              The Smart Game Format
+* Invoking GNU Go::          Command line options
+@end menu
+
+@node Documentation
+
+@section Getting Documentation
+
+You can obtain a printed copy of the manual by running @command{make
+gnugo.pdf} in the @file{doc/}directory, then printing the resulting file. The
+manual contains a great deal of information about the algorithms of GNU Go.
+
+On platforms supporting info documentation, you can usually
+install the manual by executing `make install' (running as
+root) from the @file{doc/} directory. This will create a file
+called @file{gnugo.info} (and a few others) and copy them into
+a system directory such as @file{/usr/local/share/info}. You
+may then add them to your info directory tree with the command
+@command{install-info --info-file=[path to gnugo.info] --info-dir=[path to dir]}.
+The info documentation can be read conveniently from within Emacs by executing
+the command @command{Control-h i}.
+
+Documentation in @file{doc/} consists of a man page @file{gnugo.6}, the 
+info files @file{gnugo.info}, @file{gnugo.info-1}, ... and the 
+Texinfo files from which the info files are built. The Texinfo
+documentation contains this User's Guide and extensive information
+about the algorithms of GNU Go, for developers.
+
+If you want a typeset copy of the Texinfo documentation, you can
+@command{make gnugo.dvi}, @command{make gnugo.ps}, or @command{make
+gnugo.pdf} in the @file{doc/} directory. (@command{make gnugo.pdf} only
+works after you have converted all .eps-files in the doc/ directory to
+.pdf files, e.g. with the utility epstopdf.)
+
+You can make an HTML version with the command @command{makeinfo --html
+gnugo.texi}. If you have @command{texi2html}, better HTML documentation
+may be obtained by @command{make gnugo.html} in the @file{doc/}
+directory.
+
+User documentation can be obtained by running @command{gnugo --help} 
+or @command{man gnugo} from any terminal, or from the Texinfo
+documentation.
+
+Documentation for developers is in the Texinfo documentation, and in comments
+throughout the source. Contact us at @email{gnugo@@gnu.org} if you are
+interested in helping to develop this program.
+
+@node CGoban
+@section Running GNU Go via CGoban
+@cindex CGoban
+
+There are two different programs called CGoban, both written by
+William Shubert. In this documentation, CGoban means CGoban 1.x,
+the older program. You should get a copy with version number 1.12 
+or higher.
+
+CGoban is an extremely nice way to run GNU Go. CGoban provides a
+beautiful graphic user interface under X Window System.
+
+Start CGoban. When the CGoban Control panel comes up, select ``Go
+Modem''. You will get the Go Modem Protocol Setup. Choose one (or
+both) of the players to be ``Program,'' and fill out the box with the
+path to @file{gnugo}. After clicking OK, you get the Game Setup
+window.  Choose ``Rules Set'' to be Japanese (otherwise handicaps
+won't work).  Set the board size and handicap if you want.
+
+If you want to play with a komi, you should bear in mind that
+the GMP does not have any provision for communicating the komi.
+Because of this misfeature, unless you set the komi at the command
+line GNU Go will have to guess it. It assumes the komi is 5.5 for
+even games, 0.5 for handicap games. If this is not what you want,
+you can specify the komi at the command line with the
+@option{--komi} option, in the Go Modem Protocol Setup window.
+You have to set the komi again in the Game Setup window, which
+comes up next.
+
+Click OK and you are ready to go.
+
+In the Go Modem Protocol Setup window, when you specify the path to
+GNU Go, you can give it command line options, such as @option{--quiet} to
+suppress most messages. Since the Go Modem Protocol preempts standard
+I/O other messages are sent to stderr, even if they are not error
+messages. These will appear in the terminal from which you started
+CGoban.
+
+@node Other Clients
+@section Other Clients
+@cindex jago
+@cindex quarry
+@cindex qGo
+
+In addition to CGoban (@pxref{CGoban}) there are a number of
+other good clients that are capable of running GNU Go. Here
+are the ones that we are aware of that are Free Software. This
+list is part of a larger list of free Go programs that is maintained
+at @url{http://www.gnu.org/software/gnugo/free_go_software.html}.
+
+@itemize @bullet
+@item Quarry (@url{http://home.gna.org/quarry/}) is a GPL'd
+client that supports GTP.  Works under GNU/Linux and requires
+GTK+ 2.x and librsvg 2.5.  Supports GNU Go as well as other
+engines.  Can play not only Go, but also a few other board
+games.
+@item qGo (@url{http://sourceforge.net/projects/qgo/}) is a
+full featured Client for playing on the servers, SGF viewing/editing,
+and GNU Go client written in C++ for GNU/Linux, Windows and Mac OS X.
+Can play One Color Go. Licensed GPL and QPL.
+@item ccGo (@url{http://ccdw.org/~cjj/prog/ccgo/}) is a GPL'd client
+written in C++ capable of playing with GNU Go, or on IGS.
+@item RubyGo (@url{http://rubygo.rubyforge.org/}) is a GPL'd
+client by J.-F. Menon for IGS written in the scripting language Ruby.
+RubyGo is capable of playing with GNU Go using the GTP.
+@item Dingoui (@url{http://dingoui.sourceforge.net/}) is a free
+GMP client written in GTK+ which can run GNU Go.
+@item Jago (@url{http://www.rene-grothmann.de/jago/})
+is a GPL'd Java client which works for both Microsoft Windows
+and X Window System.
+@item Sente Software's FreeGoban 
+(@url{http://www.sente.ch/software/goban/freegoban.html}) is a
+well-liked user interface for GNU Go (and potentially other
+programs) distributed under the GPL.
+@item  Mac GNU Go (@url{http://www1.u-netsurf.ne.jp/~future/HTML/macgnugo.html}) is a front end for GNU Go 3.2 with both
+English and Japanese versions. License is GPL.
+@item Quickiego (@url{http://www.geocities.com/secretmojo/QuickieGo/}) 
+is a Mac interface to GNU Go 2.6.
+@item Gogui (@url{http://sourceforge.net/projects/gogui/}) from
+Markus Enzenberger is a Java workbench that allows you to play
+with a gtp (@url{http://www.lysator.liu.se/~gunnar/gtp})
+engine such as GNU Go. Licence is GPL. Gogui does not 
+support gmp or play on servers but is potentially very useful for programmers
+working on GNU Go or other engines.
+@end itemize
+
+@node Ascii
+@section Ascii Interface
+@cindex ascii interface
+
+Even if you do not have any client program, you can play with GNU Go
+using its default Ascii interface. Simply type @command{gnugo}
+at the command line, and GNU Go will draw a board. Typing
+@command{help} will give a list of options. At the end of the
+game, pass twice, and GNU Go will prompt you through the
+counting. You and GNU Go must agree on the dead groups---you
+can toggle the status of groups to be removed, and when you
+are done, GNU Go will report the score.
+
+You can save the game at any point using the @command{save @var{filename}}
+command. You can reload the game from the resulting SGF file with
+the command @command{gnugo -l @var{filename} --mode ascii}. Reloading
+games is not supported when playing with CGoban. However you can
+use CGoban to save a file, then reload it in ascii mode.
+
+You may play games with a time limit against GNU Go in
+ascii mode. For this, the Canadian time control system
+is used. (See @uref{http://en.wikipedia.org/wiki/Byoyomi}
+and @uref{http://senseis.xmp.net/?CanadianByoyomi}.)
+That is, you have a main time to be followed by byo-yomi
+periods. After the main time is exhausted you have a certain
+number of moves to be made in a certain number of seconds.
+(@pxref{Invoking GNU Go})
+
+@node Emacs
+@section GNU Go mode in Emacs
+@cindex emacs mode
+
+You can run GNU Go from Emacs. This has the advantage 
+that you place the stones using the cursor arrow keys
+or with the mouse, and you can have a nice graphical display of the board
+within emacs.
+
+You will need the file @file{interface/gnugo.el}. There is
+a version of this distributed with GNU Go but it only
+works with Emacs 21. Most Emacsen are Emacs 22 however.
+Therefore you should get the latest version of
+gnugo.el by Thien-Thi Nguyen, which you can find at
+@uref{http://www.gnuvola.org/software/j/gnugo/} or
+@uref{http://www.emacswiki.org/emacs/gnugo.el}.
+
+You will also need some xpm files for the graphical
+display. You can either use those distributed by
+Thien-Thi Nguyen (at the first URL above) or those
+distributed with GNU Go, either the file
+@file{interface/gnugo-xpms.el} or (for high resolution
+displays) @file{interface/gnugo-big-xpms.el}.
+
+Load the file @file{interface/gnugo.el} and 
+@file{interface/gnugo-xpms.el}. You may do this using the 
+Emacs @command{M-x load-file} command.
+
+When you start a game with @command{M-x gnugo},
+you will first see an ascii board. However typing `i'
+toggles a graphical board display which is very nice.
+This is a pleasant way to play GNU Go. You may get
+help by typing @command{C-x m}.
+
+@node GMP and GTP
+@section The Go Modem Protocol and Go Text Protocol
+@cindex GMP
+@cindex GTP
+@cindex The Go Modem Protocol and Go Text Protocol
+
+@paragraphindent 3
+The Go Modem Protocol (GMP) was developed by Bruce Wilcox with input from
+David Fotland, Anders Kierulf and others, according to the history in
+@url{http://www.britgo.org/tech/gmp.html}.
+
+Any Go program @emph{should} support this protocol since it is a
+standard. Since CGoban supports this protocol, the user interface for
+any Go program can be done entirely through CGoban. The programmer can
+concentrate on the real issues without worrying about drawing stones,
+resizing the board and other distracting issues.
+
+GNU Go 3.0 introduced a new protocol, the Go Text Protocol
+(@pxref{GTP}) which we hope can serve the functions currently 
+used by the GMP. The GTP is becoming increasingly adopted by
+other programs as a method of interprocess communication,
+both by computer programs and by clients. Still the GMP is 
+widely used in tournaments.
+
+@node Tournaments
+
+@section Computer Go Tournaments
+
+Computer Tournaments currently use the Go Modem Protocol.
+The current method followed in such tournaments is to connect
+the serial ports of the two computers by a ``null modem'' cable.
+If you are running GNU/Linux it is convenient to use CGoban.
+If your program is black, set it up in the Go Modem Protocol
+Setup window as usual. For White, select ``Device'' and set
+the device to @file{/dev/cua0} if your serial port is COM1
+and @file{/dev/cua1} if the port is COM2.
+
+@node SGF Support
+@section Smart Game Format
+@cindex SGF (Smart Game Format)
+@cindex Smart Game Format
+
+The Smart Game Format (SGF), is the standard format for storing Go games. 
+GNU Go supports both reading and writing SGF files. The SGF specification
+(FF[4]) is at:
+@url{http://www.red-bean.com/sgf/}
+
+@node Invoking GNU Go
+@section Invoking GNU Go: Command line options
+@cindex command line options
+@cindex invoking GNU Go
+
+@subsection Some basic options
+@itemize
+@item @option{--help}, @option{-h}
+@quotation
+Print a help message describing the options. This will also
+tell you the defaults of various parameters, most importantly
+the level and cache size. The default values of these
+parameters can be set before compiling by @command{configure}.
+If you forget the defaults you can find out using @option{--help}.
+@end quotation
+@item @option{--boardsize @var{size}}
+@quotation
+Set the board size
+@end quotation
+@item @option{--komi @var{num}}
+@quotation
+Set the komi
+@end quotation
+@item @option{--level @var{level}}
+@cindex level of play
+@quotation
+GNU Go can play with different strengths and speeds. Level 10
+is the default. Decreasing the level will make GNU Go faster
+but less accurate in its reading.
+@end quotation
+@item @option{--quiet}, @option{--silent}
+@quotation
+Don't print copyright and other messages. Messages specifically
+requested by other command line options, such as @option{--trace},
+are not supressed.
+@end quotation
+@item @option{-l}, @option{--infile @var{filename}}
+@quotation
+Load the named SGF file. GNU Go will generate a move for
+the player who is about to move. If you want to override this
+and generate a move for the other player you may add the
+option @option{--color @var{<color>}} where @var{<color>} is
+@code{black} or @code{white}.
+@end quotation
+@item @option{-L}, @option{--until @var{move}}
+@quotation
+Stop loading just before the indicated move is played. @var{move} can
+be either the move number or location.
+@end quotation
+@item @option{-o}, @option{--outfile @var{filename}}
+@quotation
+Write sgf output to file
+@end quotation
+@item @option{-O}, @option{--output-flags @var{flags}}
+@quotation
+Add useful information to the sgf file. Flags can be 'd', 'v' or
+both (i.e. 'dv'). If 'd' is specified, dead and critical dragons
+are marked in the sgf file. If 'v' is specified, move valuations
+around the board are indicated.
+@end quotation
+@item @option{--mode @var{mode}} 
+@quotation
+Force the playing mode ('ascii', 'emacs,' 'gmp' or 'gtp'). The default is
+ASCII, but if no terminal is detected GMP (Go Modem Protocol) will be
+assumed. In practice this is usually what you want, so you may never
+need this option.
+@end quotation
+@item @option{--resign-allowed}
+@quotation
+GNU Go will resign games if this option is enabled. This is the default unless
+you build the engine with the configure option
+@option{--disable-resignation-allowed}. Unfortunately
+the Go Modem Protocol has no provision for passing a resignation,
+so this option has no effect in GMP mode.
+@end quotation
+@item @option{--never-resign}
+@quotation
+GNU Go will not resign games.
+@end quotation
+@item @option{--resign-allowed}
+@quotation
+GNU Go will resign lost games. This is the default.
+@end quotation
+@end itemize
+
+@subsection Monte Carlo Options
+
+GNU Go can play Monte Carlo Go on a 9x9 board.  (Not
+available for larger boards.) It makes quite a strong
+engine. Here are the command line options.
+
+@itemize
+@item @option{--monte-carlo}
+@quotation
+Use Monte Carlo move generation (9x9 or smaller).
+@end quotation
+@item @option{--mc-games-per-level <number>}
+@quotation
+Number of Monte Carlo simulations per level. Default 8000.
+Thus at level 10, GNU Go simulates 80,000 games in order
+to generate a move.
+@end quotation
+@item @option{--mc-list-patterns}
+@quotation
+list names of builtin Monte Carlo patterns
+@end quotation
+@item @option{--mc-patterns <name>}
+@quotation
+Choose a built in Monte Carlo pattern database. The
+argument can be @file{mc_mogo_classic}, @file{mc_montegnu_classic}
+or @file{mc_uniform}.
+@end quotation
+@item @option{--mc-load-patterns <filename>}
+@quotation
+read Monte Carlo patterns from file
+@end quotation
+@end itemize
+
+@subsection Other general options
+@itemize
+@item @option{-M}, @option{--cache-size @var{megs}} 
+@quotation
+@cindex cache-size
+@cindex cache
+Memory in megabytes used for caching of read results. The default size
+is 8 unless you configure gnugo with the command @command{configure
+--enable-cache-size=@var{size}} before compiling to make @var{size} the
+default (@pxref{Installation}). GNU Go stores results of its reading
+calculations in a hash table (@pxref{Hashing}). If the hash table is
+filled, it is emptied and the reading continues, but some reading may
+have to be repeated that was done earlier, so a larger cache size will
+make GNU Go run faster, provided the cache is not so large that swapping
+occurs. Swapping may be detected on GNU/Linux machines using the program
+@command{top}. However, if you have ample memory or if performance seems
+to be a problem you may want to increase the size of the cache using
+this option.
+@end quotation
+@item @option{--chinese-rules}
+@quotation
+Use Chinese rules. This means that the Chinese or Area Counting is
+followed. It may affect the score of the game by one point in even
+games, more if there is a handicap (since in Chinese Counting the
+handicap stones count for Black) or if either player passes during the
+game.
+@end quotation
+@item @option{--japanese-rules} 
+@quotation
+Use Japanese Rules. This is the default unless you specify
+@option{--enable-chinese-rules} as a configure option.
+@end quotation
+@item @option{--play-out-aftermath} 
+@item @option{--capture-all-dead} 
+@quotation
+These options cause GNU Go to play out moves that are usually left
+unplayed after the end of the game. Such moves lose points under
+Japanese rules but not Chinese rules.  With
+@option{--play-out-aftermath}, GNU Go may play inside its
+territory in order to reach a position where it considers every
+group demonstrably alive or dead. The option
+@option{--capture-all-dead} causes GNU Go to play inside its own
+territory to remove dead stones.
+@end quotation
+@item @option{--forbid-suicide} 
+@quotation
+Do not allow suicide moves (playing a stone so that it ends up without
+liberties and is therefore immediately removed). This is the default.
+@end quotation
+@item @option{--allow-suicide} 
+@quotation
+Allow suicide moves, except single-stone suicide. The latter would not
+change the board at all and pass should be used instead.
+@end quotation
+@item @option{--allow-all-suicide} 
+@quotation
+Allow suicide moves, including single-stone suicide. This is only
+interesting in exceptional cases. Normally the
+@option{--allow-suicide} option should be used instead.
+@end quotation
+@item @option{--simple-ko} 
+@quotation
+Do not allow an immediate recapture of a ko so that the previous
+position is recreated. Repetition of earlier positions than that are
+allowed. This is default.
+@end quotation
+@item @option{--no-ko} 
+@quotation
+Allow all kinds of board repetition.
+@end quotation
+@item @option{--positional-superko} 
+@quotation
+Forbid repetition of any earlier board position. This only applies to
+moves on the board; passing is always allowed.
+@end quotation
+@item @option{--situational-superko} 
+@quotation
+Forbid repetition of any earlier board position with the same player
+to move. This only applies to moves on the board; passing is always
+allowed.
+@end quotation
+@item @option{--copyright}: Display the copyright notice
+@item @option{--version} or @option{-v}: Print the version number
+@item @option{--printsgf @var{filename}}: 
+@quotation
+Create an SGF file containing a diagram of the board. Useful with 
+@option{-l} and @option{-L} to create a diagram of the board from
+another sgf file. Illegal moves are indicated with the private
+@code{IL} property.  This property is not used in the FF4 SGF
+specification, so we are free to preempt it.
+@end quotation
+@item @option{--options}
+@quotation 
+Print which experimental configure options were compiled into the program
+(@pxref{Other Options}).
+@end quotation
+@item @option{--orientation @var{n}}
+@quotation
+Combine with @option{-l}. The Go board can be oriented in 8 different
+ways, counting reflections and rotations of the position; this option
+selects an orientation (default 0). The parameter @samp{n} is an integer
+between 0 and 7.
+@end quotation
+@end itemize
+
+@subsection Other options affecting strength and speed
+
+@itemize @bullet
+@item @option{--level @var{amount}}
+@cindex level
+@quotation
+The higher the level, the deeper GNU Go reads. Level 10 is the default.
+If GNU Go plays too slowly on your machine, you may want to decrease it.
+@end quotation
+@end itemize
+
+This single parameter @option{--level} is the best way of
+choosing whether to play stronger or faster. It controls
+a host of other parameters which may themselves be set
+individually at the command line.  The default values of
+these parameters may be found by running @command{gnugo --help}. 
+
+Unless you are working on the program you probably don't
+need the remaining options in this category. Instead,
+just adjust the single variable @option{--level}. The
+following options are of use to developers tuning the
+program for performance and accuracy. For completeness,
+here they are.
+
+@itemize @bullet
+@item @option{-D}, @option{--depth @var{depth}}
+@cindex depth
+@quotation
+Deep reading cutoff. When reading beyond this depth (default 16) GNU
+Go assumes that any string which can obtain 3 liberties is alive. Thus
+GNU Go can read ladders to an arbitrary depth, but will miss other
+types of capturing moves.
+@end quotation
+@item @option{-B}, @option{--backfill-depth @var{depth}}
+@quotation
+Deep reading cutoff. Beyond this depth (default 12) GNU Go will no 
+longer try backfilling moves in its reading.
+@end quotation
+@item @option{--backfill2-depth @var{depth}}
+@quotation
+Another depth controlling how deeply GNU Go looks for backfilling
+moves. The moves tried below @code{backfill2_depth} are generally more obscure
+and time intensive than those controlled by @code{backfill_depth}, so this
+parameter has a lower default.
+@end quotation
+@item @option{-F}, @option{--fourlib-depth @var{depth}}
+@quotation
+Deep reading cutoff. When reading beyond this depth (default 7) GNU
+Go assumes that any string which can obtain 4 liberties is alive.
+@end quotation
+@item @option{-K}, @option{--ko-depth @var{depth}}
+@quotation
+Deep reading cutoff. Beyond this depth (default 8) GNU Go no longer
+tries very hard to analyze kos.
+@end quotation
+@item @option{--branch-depth @var{depth}} 
+@quotation
+This sets the @code{branch_depth}, typically a little below the
+@code{depth}. Between @code{branch_depth} and @code{depth},
+attacks on strings with 3 liberties are considered but branching
+is inhibited, so fewer variations are considered.  Below this
+depth (default 13), GNU Go still tries to attack strings with only
+3 liberties, but only tries one move at each node.
+@end quotation
+@item @option{--break-chain-depth @var{depth}}
+@quotation
+Set the @code{break_chain_depth}. Beyond this depth, GNU Go abandons
+some attempts to defend groups by trying to capture part of the surrounding
+chain.
+@end quotation
+@item @option{--aa-depth @var{depth}}
+@quotation
+The reading function @code{atari_atari} looks for combinations beginning
+with a series of ataris, and culminating with some string having an
+unexpected change in status (e.g. alive to dead or critical). This
+command line optio sets the parameter @code{aa_depth} which determines
+how deeply this function looks for combinations.
+@end quotation
+@item @option{--superstring-depth}
+@quotation
+A superstring (@pxref{Superstrings}) is an amalgamation of
+tightly strings. Sometimes the best way to attack or defend a
+string is by attacking or defending an element of the superstring.
+Such tactics are tried below @code{superstring_depth} and this
+command line option allows this parameter to be set.
+@end quotation
+@end itemize
+
+The preceeding options are documented with the reading code
+(@pxref{Reading Basics}).
+
+@itemize @bullet
+@item @option{--owl-branch} Below this depth Owl only considers
+one move. Default 8.
+@item @option{--owl-reading} Below this depth Owl assumes the
+dragon has escaped.  Default 20.
+@item @option{--owl-node-limit}
+@quotation
+If the number of variations exceeds this limit, Owl assumes the dragon can
+make life. Default 1000. We caution the user that increasing
+@code{owl_node_limit} does not necessarily increase the strength of the
+program.
+@end quotation
+@item @option{--owl-node-limit @var{n}}
+@quotation
+If the number of variations exceeds this limit, Owl assumes the dragon can
+make life. Default 1000.  We caution the user that increasing
+@code{owl_node_limit} does not necessarily increase the strength of the
+program.  
+@end quotation
+@item @option{--owl-distrust @var{n}}
+@quotation
+Below this limit some owl reading is truncated.
+@end quotation
+@end itemize
+
+@subsection Ascii mode options
+@cindex ascii mode
+
+@itemize
+@item @option{--color @var{color}}
+@quotation
+Choose your color ('black' or 'white').
+@end quotation
+@item @option{--handicap @var{number}}
+@quotation
+Choose the number of handicap stones (0--9)
+@end quotation
+@end itemize
+
+For more information about the following clock options see @xref{Ascii}.
+
+@itemize
+@item @option{--clock @var{seconds}}
+@quotation
+Initialize the timer.
+@end quotation
+@item @option{--byo-time @var{seconds}}
+@quotation
+Number of seconds per (Canadian) byo-yomi period
+@end quotation
+@item @option{--byo-period @var{stones}}
+@quotation
+Number of stones per (Canadian) byo-yomi period
+@end quotation
+@end itemize
+
+@subsection Development options
+
+@itemize
+@item @option{--replay @var{color}} 
+@quotation
+Replay all moves in a game for either or both colors. If used with the
+@option{-o} option the game record is annotated with move values. This
+option requires @option{-l @var{filename}}. The color can be:
+@itemize
+@item white: replay white moves only
+@item black: replay black moves only
+@item both: replay all moves
+@end itemize
+When the move found by genmove differs from the move in the sgf
+file the values of both moves are reported thus:
+
+@example
+Move 13 (white): GNU Go plays C6 (20.60) - Game move F4 (20.60) 
+@end example
+
+This option is useful if one wants to confirm that a change such as a
+speedup or other optimization has not affected the behavior of the
+engine. Note that when several moves have the same top value (or
+nearly equal) the move generated is not deterministic (though it can be
+made deterministic by starting with the same random seed). Thus a few
+deviations from the move in the sgf file are to be expected. Only if the
+two reported values differ should we conclude that the engine plays
+differently from the engine which generated the sgf file.
+@xref{Regression}.
+@end quotation
+@item @option{-a}, @option{--allpats}
+@quotation
+Test all patterns, even those smaller in value than the largest move
+found so far. This should never affect GNU Go's final move, and it
+will make it run slower. However this can be very useful when "tuning"
+GNU Go. It causes both the traces and the output file (@option{-o}) to
+be more informative.
+@end quotation
+@item @option{-T}, @option{--printboard}: colored display of dragons.
+@quotation
+Use rxvt, xterm or Linux Console. (@pxref{Colored Display})
+@end quotation
+@item @option{--showtime}
+@quotation
+Print timing information to stderr.
+@end quotation
+@item @option{-E}, @option{--printeyes}: colored display of eye spaces
+@quotation
+Use rxvt, xterm or Linux Console. (@pxref{Colored Display})
+@end quotation
+@item @option{-d}, @option{--debug @var{level}}
+@quotation
+Produce debugging output. The debug level is given in hexadecimal, using the
+bits defined in the following table from @file{engine/gnugo.h}. A list of
+these may be produced using @option{--debug-flags}. Here they are in
+hexadecimal:
+
+@cindex debugging options
+@example
+  DEBUG_INFLUENCE             0x0001
+  DEBUG_EYES                  0x0002
+  DEBUG_OWL                   0x0004
+  DEBUG_ESCAPE                0x0008
+  DEBUG_MATCHER               0x0010
+  DEBUG_DRAGONS               0x0020
+  DEBUG_SEMEAI                0x0040
+  DEBUG_LOADSGF               0x0080
+  DEBUG_HELPER                0x0100
+  DEBUG_READING               0x0200
+  DEBUG_WORMS                 0x0400
+  DEBUG_MOVE_REASONS          0x0800
+  DEBUG_OWL_PERFORMANCE       0x1000
+  DEBUG_LIFE                  0x2000
+  DEBUG_FILLLIB               0x4000
+  DEBUG_READING_PERFORMANCE   0x8000
+  DEBUG_SCORING               0x010000
+  DEBUG_AFTERMATH             0x020000
+  DEBUG_ATARI_ATARI           0x040000
+  DEBUG_READING_CACHE         0x080000
+  DEBUG_TERRITORY             0x100000
+  DEBUG_OWL_PERSISTENT_CACHE  0X200000
+  DEBUG_TOP_MOVES             0x400000
+  DEBUG_MISCELLANEOUS         0x800000
+  DEBUG_ORACLE_STREAM         0x1000000
+@end example
+
+These debug flags are additive. If you want to turn on both
+dragon and worm debugging you can use @option{-d0x420}.
+@end quotation
+@item @option{--debug-flags}
+@quotation
+Print the list of debug flags
+@end quotation
+@item @option{-w}, @option{--worms}
+@quotation
+Print more information about worm data.
+@end quotation
+@item @option{-m}, @option{--moyo @var{level}} 
+@quotation
+moyo debugging, show moyo board. The @var{level} is fully
+documented elsewhere (@pxref{Influential Display}).
+@end quotation
+@item @option{-b}, @option{--benchmark @var{number}} 
+@quotation
+benchmarking mode - can be used with @option{-l}. Causes GNU Go to play itself
+repeatedly, seeding the start of the game with a few random moves. This method
+of testing the program is largely superceded by use of the @command{twogtp}
+program.
+@end quotation
+@item @option{-S}, @option{--statistics}
+@quotation
+Print statistics (for debugging purposes).
+@end quotation
+@item @option{-t}, @option{--trace}
+@quotation
+Print debugging information. Use twice for more detail.
+@end quotation
+@item @option{-r}, @option{--seed @var{seed}}
+@quotation
+Set random number seed. This can be used to guarantee that GNU Go will make
+the same decisions on multiple runs through the same game. If @code{seed} is
+zero, GNU Go will play a different game each time.
+@end quotation
+@item @option{--decide-string @var{location}}
+@quotation
+Invoke the tactical reading code (@pxref{Tactical Reading} to decide
+whether the string at @var{location} can be captured, and if so, whether it
+can be defended. If used with @option{-o}, this will produce a variation tree
+in SGF.
+@end quotation
+@item @option{--decide-owl @var{location}}
+@quotation
+Invoke the owl code (@pxref{The Owl Code}) to decide whether the dragon at
+@var{location} can be captured, and whether it can be defended. If used with
+@option{-o}, this will produce a variation tree in SGF.  
+@end quotation
+@item @option{--decide-connection @var{location1}/@var{location2}}
+@quotation
+Decide whether dragons at @var{location1} and @var{location2} can be connected.
+Useful in connection with @option{-o} to write the variations to an SGF file.
+@end quotation
+@item @option{--decide-dragon-data @var{location}}
+@quotation
+Print complete information about the status of the dragon at @var{location}.
+@end quotation
+@item @option{--decide-semeai @var{location1}/@var{location2}}
+@quotation
+At @var{location1} and @var{location2} are adjacent dragons of the
+opposite color. Neither is aliveby itself, and their fate (alive,
+dead or seki) depends on the outcome of a semeai (capturing race).
+Decide what happens.  Useful in connection with @option{-o} to
+write the variations to an SGF file.
+@end quotation
+@item @option{--decide-tactical-semeai @var{location1}/@var{location2}}
+@quotation
+Similar to @option{--decide-semeai}, except that moves proposed by the
+owl code are not considered.
+@end quotation
+@item @option{--decide-position}
+@quotation
+Try to attack and defend every dragon with dragon.escape<6. If
+used with @option{-o}, writes the variations to an sgf file.
+@end quotation
+@item @option{--decide-eye @var{location}}
+@quotation
+Evaluates the eyespace at @var{location} and prints a report. You can get
+more information by adding @option{-d0x02} to the command line. 
+(@pxref{Eye Local Game Values}.)
+@end quotation
+@item @option{--decide-surrounded @var{location}}
+@quotation
+A dragon is @emph{surrounded} if it is contained in the convex hull of
+its unfriendly neighbor dragons. This does not mean that it cannot escape,
+but it is often a good indicator that the dragon is under attack. This
+option draws the convex hull of the neighbor dragons and decides whether
+the dragon at @var{location} is surrounded.
+@end quotation
+@item @option{--decide-combination}
+@quotation
+Calls the function @code{atari_atari} to decide whether there
+exist combinations on the board.
+@end quotation
+@item @option{--score @var{method}}
+@quotation
+Requires @option{-l} to specify which game to score and @option{-L} if
+you want to score anywhere else than at the end of the game record.
+@var{method} can be "estimate", "finish", or "aftermath". "finish" and
+"aftermath" are appropriate when the game is complete, or nearly so, and
+both try to supply an accurate final score. Notice that if the game is
+not already finished it will be played out, which may take quite a long
+time if the game is far from complete. The "estimate" method may be used
+to get a quick estimate during the middle of the game. Any of these
+options may be combined with @option{--chinese-rules} if you want to use
+Chinese (Area) counting.
+
+If the option @option{-o @var{outputfilename}} is provided, the result
+will also be written as a comment in the output file. For the "finish"
+and "aftermath" scoring algorithms, the selfplayed moves completing the
+game are also stored.
+
+@itemize
+@item finish
+@quotation
+Finish the game by selfplaying until two passes, then determine the
+status of all stones and compute territory.
+@end quotation
+@item aftermath
+@quotation
+Finish the game by selfplaying until two passes, then accurately
+determine status of all stones by playing out the "aftermath", i.e.
+playing on until all stones except ones involved in seki have become
+either unconditionally (in the strongest sense) alive or unconditionally
+dead (or captured). Slower than @option{--score finish}, and while these
+algorithms usually agree, if they differ, @option{--score aftermath} is
+most likely to be correct.
+@end quotation
+@end itemize
+@end quotation
+@item @code{--score aftermath --capture-all-dead --chinese-rules}
+@quotation
+This combination mandates @strong{Tromp-Taylor} scoring. The
+Tromp-Taylor ruleset requires the game to be played out until
+all dead stones are removed, then uses area (Chinese) scoring.
+The option @option{--capture-all-dead} requires the aftermath
+code to finish capturing all dead stones.
+@end quotation
+@end itemize
+
+@subsection Experimental options
+
+Most of these are available as configure options and are
+described in @ref{Other Options}.
+
+@itemize @bullet
+@item @option{--options}
+@quotation 
+Print which experimental configure options were compiled into the program.
+@end quotation
+@item @option{--with-break-in}
+@item @option{--without-break-in}
+@quotation
+Use or do not use the experimental break-in code. This option
+has no effect at level 9 or below. The break in code is enabled
+by default at level 10, and the only difference between levels
+9 and level 10 is that the break in code is disabled at level 9.
+@end quotation
+@item @option{--cosmic-gnugo}
+@quotation
+Use center oriented influence.
+@end quotation
+@item @option{--nofusekidb}
+@quotation
+Turn off the fuseki database.
+@end quotation
+@item @option{--nofuseki}
+@quotation
+Turn off fuseki moves entirely
+@end quotation
+@item @option{--nojosekidb}
+@quotation
+Turn off the joseki database.
+@end quotation
+@item @option{--mirror}
+@quotation
+Try to play mirror go.
+@end quotation
+@item @option{--mirror-limit @var{n}}
+@quotation
+Stop mirroring when @var{n} stones are on the board.
+@end quotation
+@end itemize
diff --git a/doc/utils.texi b/doc/utils.texi
new file mode 100644 (file)
index 0000000..244d5f8
--- /dev/null
@@ -0,0 +1,873 @@
+In this Chapter, we document some of the utilities which may be
+called from the GNU Go engine.
+
+@menu
+* General Utilities::              Utilities from @file{engine/utils.c}
+* Print Utilities::                Utilities from @file{engine/printutils.c}
+* Board Utilities::                Utilities from @file{engine/board.c}
+* Influence Utilities::                   Utilities from @file{engine/influence.c}
+@end menu
+
+@node General Utilities
+@section General Utilities
+
+Utility functions from @file{engine/utils.c}. Many of these
+functions underlie autohelper functions (@pxref{Autohelper Functions}).
+
+
+@itemize @bullet
+@item @code{void change_dragon_status(int dr, int status)}
+@findex change_dragon_status
+@quotation
+Change the status of all the stones in the dragon at @code{dr}.
+@end quotation
+@item @code{int defend_against(int move, int color, int apos)}
+@findex defend_against
+@quotation
+Check whether a move at @code{move} stops the enemy from playing at (apos).
+@end quotation
+@item @code{int cut_possible(int pos, int color)}
+@quotation
+Returns true if @code{color} can cut at @code{pos}, or if connection through
+@code{pos} is inhibited. This information is collected by @code{find_cuts()},
+using the B patterns in the connections database.
+@end quotation
+@item @code{int does_attack(int move, int str)}
+@findex does_attack
+@quotation
+returns true if the move at @code{move} attacks @code{str}. This means that it captures
+the string, and that @code{str} is not already dead.  
+@end quotation
+@item @code{int does_defend(int move, int str)}
+@findex does_defend
+@quotation
+@code{does_defend(move, str)} returns true if the move at @code{move}
+defends @code{str}. This means that it defends the string, and that
+@code{str} can be captured if no defense is made.
+@end quotation
+@item @code{int somewhere(int color, int last_move, ...)}
+@findex somewhere
+@quotation
+Example: @code{somewhere(WHITE, 2, apos, bpos, cpos)}.
+Returns true if one of the vertices listed satisfies
+@code{board[pos]==color}. Here num_moves is the number of moves minus one.
+If the check is true the dragon is not allowed to be dead. This
+check is only valid if @code{stackp==0}.
+@end quotation
+@item @code{int visible_along_edge(int color, int apos, int bpos)}
+@quotation
+Search along the edge for the first visible stone. Start at apos
+and move in the direction of bpos. Return 1 if the first visible
+stone is of the given color. It is required that apos and bpos are
+at the same distance from the edge.
+@end quotation
+@item @code{int test_symmetry_after_move(int move, int color, int strict)}
+@findex test_symmetry_after_move
+@quotation
+Is the board symmetric (or rather antisymmetric) with respect to
+mirroring in tengen after a specific move has been played? If the
+move is PASS_MOVE, check the current board.
+If strict is set we require that each stone is matched by a stone
+of the opposite color at the mirrored vertex. Otherwise we only
+require that each stone is matched by a stone of either color.
+@end quotation
+@item @code{int play_break_through_n(int color, int num_moves, ...)}
+@findex play_break_through_n
+@quotation
+The function @code{play_break_through_n()} plays a sequence of moves,
+alternating between the players and starting with color. After
+having played through the sequence, the three last coordinate pairs
+gives a position to be analyzed by @code{break_through()}, to see whether
+either color has managed to enclose some stones and/or connected
+his own stones. If any of the three last positions is empty, it's
+assumed that the enclosure has failed, as well as the attempt to
+connect. If one or more of the moves to play turns out to be illegal for
+some reason, the rest of the sequence is played anyway, and
+@code{break_through()} is called as if nothing special happened.
+Like @code{break_through()}, this function returns 1 if the attempt to
+break through was succesful and 2 if it only managed to cut
+through.
+@end quotation
+@item @code{int play_attack_defend_n(int color, int do_attack, int num_moves, ...)}
+@item @code{int play_attack_defend2_n(int color, int do_attack, int num_moves, ...)}
+@findex play_attack_defend2_n
+@findex play_attack_defend_n
+@quotation
+The function @code{play_attack_defend_n()} plays a sequence of moves,
+alternating between the players and starting with @code{color}. After
+having played through the sequence, the last coordinate pair gives
+a target to attack or defend, depending on the value of do_attack.
+If there is no stone present to attack or defend, it is assumed
+that it has already been captured. If one or more of the moves to
+play turns out to be illegal for some reason, the rest of the
+sequence is played anyway, and attack/defense is tested as if
+nothing special happened. Conversely, 
+@code{play_attack_defend2_n()} plays a sequence of moves,
+alternating between the players and starting with @code{color}. After
+having played through the sequence, the two last coordinate pairs
+give two targets to simultaneously attack or defend, depending on
+the value of do_attack. If there is no stone present to attack or
+defend, it is assumed that it has already been captured. If one or
+more of the moves to play turns out to be illegal for some reason,
+the rest of the sequence is played anyway, and attack/defense is
+tested as if nothing special happened.  A typical use of these functions is to
+set up a ladder in an autohelper and see whether it works or not.  
+@end quotation
+@item @code{int play_connect_n(int color, int do_connect, int num_moves, ...)}
+@findex play_connect_n
+@quotation
+Plays a sequence of moves, alternating between the players and starting
+with @code{color}. After having played through the sequence, the two last
+coordinates give two targets that should be connected or disconnected,
+depending on the value of do_connect. If there is no stone present to
+connect or disconnect, it is assumed that the connection has failed. If
+one or more of the moves to play turns out to be illegal for some
+reason, the rest of the sequence is played anyway, and
+connection/disconnection is tested as if nothing special happened.
+Ultimately the connection is decided by the functions 
+@code{string_connect} and @code{disconnect} (@pxref{Connection Reading}).
+@end quotation
+@item @code{void set_depth_values(int level)}
+@findex set_depth_values
+@quotation
+It is assumed in reading a ladder if @code{stackp >= depth} that
+as soon as a bounding stone is in atari, the string is safe.
+Similar uses are made of the other depth parameters such
+as @code{backfill_depth} and so forth. In short, simplifying
+assumptions are made when @code{stackp} is large. Unfortunately any such
+scheme invites the ``horizon effect,'' in which a stalling move is perceived
+as a win, by pushing the refutation past the ``horizon''---the value of
+@code{stackp} in which the reading assumptions are relaxed. To avoid the depth
+it is sometimes necessary to increase the depth parameters. This
+function can be used to set the various reading depth parameters. If
+@code{mandated_depth_value} is not -1 that value is used; otherwise the depth
+values are set as a function of level. The parameter
+@code{mandated_depth_value} can be set at the command line to force a
+particular value of depth; normally it is -1.
+@end quotation
+@item @code{void modify_depth_values(int n)}
+@findex modify_depth_values
+@quotation
+Modify the various tactical reading depth parameters. This is
+typically used to avoid horizon effects. By temporarily increasing
+the depth values when trying some move, one can avoid that an
+irrelevant move seems effective just because the reading hits a
+depth limit earlier than it did when reading only on relevant
+moves.
+@end quotation
+@item @code{void increase_depth_values(void)}
+@findex increase_depth_values
+@quotation
+@code{modify_depth_values(1)}.
+@end quotation
+@item @code{void decrease_depth_values(void)}
+@findex decrease_depth_values
+@quotation
+@code{modify_depth_values(-1)}.
+@end quotation
+@item @code{void restore_depth_values()}
+@findex restore_depth_values
+@quotation
+Sets @code{depth} and so forth to their saved values.
+@end quotation
+@item @code{void set_temporary_depth_values(int d, int b, int b2, int bc, int ss, int br, int f, int k)}
+@quotation
+Explicitly set the depth values. This function is currently never
+called.
+@end quotation
+@item @code{int confirm_safety(int move, int color, int *defense_point, char safe_stones[BOARDMAX])}
+@findex confirm_safety
+@quotation
+Check that the move at color doesn't involve any kind of blunder,
+regardless of size.
+@end quotation
+@item @code{float blunder_size(int move, int color, int *defense_point, char safe_stones[BOARDMAX])}
+@findex blunder_size
+@quotation
+This function will detect some blunders. If the move reduces the number of
+liberties of an adjacent friendly string, there is a danger that the move
+could backfire, so the function checks that no friendly worm which was
+formerly not attackable becomes attackable, and it checks that no opposing
+worm which was not defendable becomes defendable.  It returns the estimated
+size of the blunder, or 0.0 if nothing bad has happened.  The array
+@code{safe_stones[]} contains the stones that are supposedly safe after
+@code{move}. It may be @code{NULL}. For use when called from
+@code{fill_liberty()}, this function may optionally return a point of defense,
+which, if taken, will presumably make the move at @code{move} safe on a
+subsequent turn.
+@end quotation
+@item @code{int double_atari(int move, int color, float *value, char safe_stones[BOARDMAX])}
+@findex double_atari
+@quotation
+Returns true if a move by (color) fits the following shape:
+@example
+    X*        (O=color)
+    OX
+@end example
+capturing one of the two @samp{X} strings. The name is a slight misnomer since
+this includes attacks which are not necessarily double ataris, though the
+common double atari is the most important special case. If @code{safe_stones
+!= NULL}, then only attacks on stones marked as safe are tried. The value of
+the double atari attack is returned in value (unless value is @code{NULL}),
+and the attacked stones are marked unsafe.
+@end quotation
+@item @code{void unconditional_life(int unconditional_territory[BOARDMAX], int color)}
+@findex unconditional_life
+@quotation
+Find those worms of the given color that can never be captured, even if the
+opponent is allowed an arbitrary number of consecutive moves. The coordinates
+of the origins of these worms are written to the worm arrays and the number of
+non-capturable worms is returned.  The algorithm is to cycle through the worms
+until none remains or no more can be captured. A worm is removed when it is
+found to be capturable, by letting the opponent try to play on all its
+liberties. If the attack fails, the moves are undone. When no more worm can be
+removed in this way, the remaining ones are unconditionally alive.  After
+this, unconditionally dead opponent worms and unconditional territory are
+identified. To find these, we continue from the position obtained at the end
+of the previous operation (only unconditionally alive strings remain for
+color) with the following steps:
+
+@enumerate
+@item Play opponent stones on all liberties of the unconditionally
+alive strings except where illegal. (That the move order may
+determine exactly which liberties can be played legally is not
+important. Just pick an arbitrary order).
+@item
+Recursively extend opponent strings in atari, except where this
+would be suicide.
+@item
+Play an opponent stone anywhere it can get two empty
+neighbors. (I.e. split big eyes into small ones).
+@item
+an opponent stone anywhere it can get one empty
+neighbor. (I.e. reduce two space eyes to one space eyes.)
+Remaining opponent strings in atari and remaining liberties of the
+unconditionally alive strings constitute the unconditional
+territory.
+Opponent strings from the initial position placed on
+unconditional territory are unconditionally dead.
+On return, @code{unconditional_territory[][]} is 1 where color has
+unconditionally alive stones, 2 where it has unconditional
+territory, and 0 otherwise.
+@end enumerate
+@end quotation
+@item @code{void who_wins(int color, FILE *outfile)}
+@quotation
+Score the game and determine the winner
+@end quotation
+@item @code{void find_superstring(int str, int *num_stones, int *stones)}
+@findex find_superstring
+@cindex superstring
+@quotation
+Find the stones of an extended string, where the extensions are
+through the following kinds of connections:
+@enumerate
+@item Solid connections (just like ordinary string).
+@example
+    OO
+@end example
+@item Diagonal connection or one space jump through an intersection
+where an opponent move would be suicide or self-atari.
+@example
+    ...
+    O.O
+    XOX
+    X.X
+@end example
+@item
+Bamboo joint.
+@example
+    OO
+    ..
+    OO
+@end example
+@item Diagonal connection where both adjacent intersections are empty.
+@example
+    .O
+    O.
+@end example
+@item Connection through adjacent or diagonal tactically captured stones.
+Connections of this type are omitted when the superstring code is
+called from reading.c, but included when the superstring code is
+called from owl.c
+@end enumerate
+@end quotation
+@item @code{void find_superstring_liberties(int str, int *num_libs, int *libs, int liberty_cap)}
+@findex find_superstring_liberties
+@quotation
+This function computes the superstring at @code{str} as described above, but
+omitting connections of type 5. Then it constructs a list of liberties of the
+superstring which are not already liberties of @code{str}.  If
+@code{liberty_cap} is nonzero, only liberties of substrings of the superstring
+which have fewer than @code{liberty_cap} liberties are generated.
+@end quotation
+@item @code{void find_proper_superstring_liberties(int str, int *num_libs, int *libs, int liberty_cap)}
+@findex find_proper_superstring_liberties
+@quotation
+This function is the same as find_superstring_liberties, but it omits those
+liberties of the string @code{str}, presumably since those have already been
+treated elsewhere.  If @code{liberty_cap} is nonzero, only liberties of
+substrings of the superstring which have at most @code{liberty_cap} liberties
+are generated.
+@end quotation
+@item @code{void find_superstring_stones_and_liberties(int str, int *num_stones, int *stones, int *num_libs, int *libs, int liberty_cap)}
+@findex find_superstring_stones_and_liberties
+@quotation
+This function computes the superstring at @code{str} as described above,
+but omitting connections of type 5. Then it constructs a list of
+liberties of the superstring which are not already liberties of
+@code{str}. If liberty_cap is nonzero, only liberties of substrings of the
+superstring which have fewer than liberty_cap liberties are
+generated.
+@end quotation
+@item @code{void superstring_chainlinks(int str, int *num_adj, int adjs[MAXCHAIN], int liberty_cap)}
+@findex superstring_chainlinks
+@quotation
+analogous to chainlinks, this function finds boundary chains of the
+superstring at @code{str}, including those which are boundary chains of
+@code{str} itself. If @code{liberty_cap != 0}, only those boundary chains with
+@code{<= liberty_cap} liberties are reported.
+@end quotation
+@item @code{void proper_superstring_chainlinks(int str, int *num_adj, int adjs[MAXCHAIN], int liberty_cap)}
+@findex proper_superstring_chainlingks
+@quotation
+analogous to chainlinks, this function finds boundary chains of the
+superstring at @code{str}, omitting those which are boundary chains of
+@code{str} itself. If @code{liberty_cap != 0}, only those boundary chains with
+@code{<= liberty_cap} liberties are reported.
+@end quotation
+@item @code{void start_timer(int n)}
+@findex start_timer
+@cindex timers
+@quotation
+Start a timer. GNU Go has four internal timers available for
+assessing the time spent on various tasks.
+@end quotation
+@item @code{double time_report(int n, const char *occupation, int move, double mintime)}
+@findex time_report
+@quotation
+Report time spent and restart the timer. Make no report if elapsed
+time is less than mintime.
+@end quotation
+@end itemize
+
+@node Print Utilities
+@section Print Utilities
+@cindex formatted printing
+
+Functions in @file{engine/printutils.c} do formatted printing similar to
+@code{printf} and its allies.  The following formats are recognized:
+
+@itemize @bullet
+@item @code{%c}, @code{%d}, @code{%f}, @code{%s}, @code{%x}
+@quotation
+These have their usual meaning in formatted output, printing
+a character, integer, float, string or hexadecimal, respectively.
+@end quotation
+@item @code{%o}
+@quotation
+`Outdent.' Normally output is indented by @code{2*stackp} spaces,
+so that the depth can be seen at a glance in traces. At the
+beginning of a format, this @code{%o} inhibits the indentation.
+@end quotation
+@item @code{%H}
+@quotation
+Print a hashvalue.
+@end quotation
+@item @code{%C}
+@quotation
+Print a color as a string.
+@end quotation
+@item @code{%m}, @code{%2m} (synonyms)
+@quotation
+Takes 2 integers and writes a move, using the two dimensional
+board representation (@pxref{The Board Array})
+@end quotation
+@item @code{%1m}
+@quotation
+Takes 1 integers and writes a move, using the one dimensional
+board representation (@pxref{The Board Array})
+@end quotation
+@end itemize
+
+We list the non statically declared functions in @file{printutils.c}.
+
+@itemize @bullet
+@item @code{void gfprintf(FILE *outfile, const char *fmt, ...)}
+@findex gfprintf
+@quotation
+Formatted output to @file{outfile}.
+@end quotation
+@item @code{int gprintf(const char *fmt, ...)}
+@findex gprintf
+@quotation
+Formatted output to stderr. Always returns 1 to allow use in short-circuit
+logical expressions.
+@end quotation
+@item @code{int mprintf(const char *fmt, ...)}
+@findex mprintf
+@quotation
+Formatted output to stdout. 
+@end quotation
+@item @code{DEBUG(level, fmt, args...)}
+@findex DEBUG
+@quotation
+If @code{level & debug}, do formatted output to stderr. Otherwise, ignore.
+@end quotation
+@item @code{void abortgo(const char *file, int line, const char *msg, int pos)}
+@findex abortgo
+@quotation
+Print debugging output in an error situation, then exit.
+@end quotation
+@item @code{const char * color_to_string(int color)}
+@findex color_to_string
+@quotation
+Convert a color value to a string
+@end quotation
+@item @code{const char * location_to_string(int pos)}
+@findex location_to_string
+@quotation
+Convert a location to a string
+@end quotation
+@item @code{void location_to_buffer(int pos, char *buf)}
+@findex location_to_buffer
+@quotation
+Convert a location to a string, writing to a buffer.
+@end quotation
+@item @code{int string_to_location(int boardsize, char *str, int *m, int *n)}
+@findex string_to_location
+@quotation
+Get the @code{(m, n)} coordinates in the standard GNU Go coordinate system
+from the string @code{str}.  This means that @samp{m} is the nth row from the
+top and @samp{n} is the column. Both coordinates are between 0 and
+@code{boardsize-1}, inclusive. Return 1 if ok, otherwise return 0;
+@end quotation
+@item @code{int is_hoshi_point(int m, int n)}
+@findex is_hoshi_point
+True if the coordinate is a hoshi point.
+@item @code{void draw_letter_coordinates(FILE *outfile)}
+@findex draw_letter_coordinates
+Print a line with coordinate letters above the board.
+@item @code{void simple_showboard(FILE *outfile)}
+@findex simple_showboard
+@quotation
+Bare bones version of @code{showboard(0)}. No fancy options, no hint of
+color, and you can choose where to write it.
+@end quotation
+@end itemize
+
+The following functions are in @file{showbord.c}. Not all public
+functions in that file are listed here.
+
+@itemize
+@item @code{void showboard(int xo)}
+@findex showboard
+@quotation
+Show go board.
+@example
+xo=0:      black and white XO board for ascii game
+xo=1:      colored dragon display
+xo=2:      colored eye display
+xo=3:      colored owl display
+xo=4:      colored matcher status display
+@end example
+@end quotation
+@item @code{const char * status_to_string(int status)}
+@findex status_to_string
+@quotation
+Convert a status value to a string.
+@end quotation
+@item @code{const char * safety_to_string(int status)}
+@findex safety_to_string
+@quotation
+Convert a safety value to a string.
+@end quotation
+@item @code{const char * result_to_string(int result)}
+@findex result_to_string
+@quotation
+Convert a read result to a string
+@end quotation
+@end itemize
+
+@node Board Utilities
+@section Board Utilities
+
+The functions documented in this section are from @file{board.c}. Other
+functions in @file{board.c} are described in @xref{Some Board Functions}.
+
+@itemize @bullet
+@item @code{void store_board(struct board_state *state)}
+@findex store_board
+@quotation
+Save board state.
+@end quotation
+@item @code{void restore_board(struct board_state *state)}
+@findex restore_board
+@quotation
+Restore a saved board state.
+@end quotation
+@item @code{void clear_board(void)}
+@findex clear_board
+@quotation
+Clear the internal board.
+@end quotation
+@item @code{void dump_stack(void)}
+@findex dump_stack
+@quotation
+for use under GDB prints the move stack.
+@end quotation
+@item @code{void add_stone(int pos, int color)}
+@findex add_stone
+@quotation
+Place a stone on the board and update the board_hash. This operation
+destroys all move history.
+@end quotation
+@item @code{void remove_stone(int pos)}
+@findex remove_stone
+@quotation
+Remove a stone from the board and update the board_hash. This
+operation destroys the move history.
+@end quotation
+@item @code{int is_pass(int pos)}
+@findex is_pass
+@quotation
+Test if the move is a pass or not.  Return 1 if it is.
+@end quotation
+@item @code{int  is_legal(int pos, int color)}
+@findex is_legal
+@quotation
+Determines whether the move @code{color} at @code{pos} is legal.
+@end quotation
+@item @code{int  is_suicide(int pos, int color)}
+@findex is_suicide
+@quotation
+Determines whether the move @code{color} at @code{pos} would be a suicide.
+This is the case if
+@enumerate
+@item There is no neighboring empty intersection.
+@item There is no neighboring opponent string with exactly one liberty.
+@item There is no neighboring friendly string with more than one liberty.
+@end enumerate
+@end quotation
+@item @code{int is_illegal_ko_capture(int pos, int color)}
+@findex is_illegal_ko_capture
+@quotation
+Determines whether the move @code{color} at @code{pos} would be an illegal ko
+capture.
+@end quotation
+@item @code{int is_edge_vertex(int pos)}
+@findex is_edge_vertex
+@quotation
+Determine whether vertex is on the edge.
+@end quotation
+@item @code{int edge_distance(int pos)}
+@findex edge_distance
+@quotation
+Distance to the edge.
+@end quotation
+@item @code{int is_corner_vertex(int pos)}
+@findex is_corner_vertex
+@quotation
+Determine whether vertex is a corner.
+@end quotation
+@item @code{int get_komaster()}
+@findex get_komaster
+@item @code{int get_kom_pos()}
+@findex get_kom_pos
+@quotation
+Public functions to access the variable @code{komaster} and @code{kom_pos},
+which are static in @file{board.c}.
+@end quotation
+@end itemize
+
+Next we come to @code{countlib()} and its allies, which
+address the problem of determining how many liberties a
+string has. Although @code{countlib()} addresses this
+basic question, other functions can often get the needed
+information more quickly, so there are a number of
+different functions in this family.
+
+@itemize @bullet
+@item @code{int countlib(int str)}
+@findex countlib
+@quotation
+Count the number of liberties of the string at @code{pos}. There
+must be a stone at this location.
+@end quotation
+@item @code{int findlib(int str, int maxlib, int *libs)}
+@findex findlib
+@quotation
+Find the liberties of the string at @code{str}. This location must not be
+empty. The locations of up to maxlib liberties are written into
+@code{libs[]}. The full number of liberties is returned.  If you want the
+locations of all liberties, whatever their number, you should pass
+@code{MAXLIBS} as the value for @code{maxlib} and allocate space for
+@code{libs[]} accordingly.
+@end quotation
+@item @code{int fastlib(int pos, int color, int ignore_captures)}
+@findex fastlib
+@quotation
+Count the liberties a stone of the given color would get if played
+at @code{pos}. The intent of this function is to be as fast as possible, not
+necessarily complete. But if it returns a positive value (meaning
+it has succeeded), the value is guaranteed to be correct. Captures are ignored
+based if the @code{ignore_captures} field is nonzero. The location @code{pos}
+must be empty.  The function fails if there are more than two neighbor strings
+of the same color.  In this case, the return value is -1.  Captures are
+handled in a very limited way, so if ignore_capture is 0, and a capture is
+required, it will often return -1.
+@end quotation
+@item @code{int approxlib(int pos, int color, int maxlib, int *libs)}
+@findex approxlib
+@quotation
+Find the liberties a stone of the given color would get if played at
+@code{pos}, ignoring possible captures of opponent stones.  The location
+@code{pos} must be empty. If @code{libs != NULL}, the locations of up to
+@code{maxlib} liberties are written into @code{libs[]}. The counting of
+liberties may or may not be halted when @code{maxlib} is reached. The number
+of liberties found is returned, which may be less than the total number of
+liberties if @code{maxlib} is small. If you want the number or the locations
+of all liberties, however many they are, you should pass @code{MAXLIBS} as the
+value for maxlib and allocate space for @code{libs[]} accordingly.
+@end quotation
+@item @code{int accuratelib(int pos, int color, int maxlib, int *libs)}
+@findex accuratelib
+@quotation
+Find the liberties a stone of the given color would get if played at
+@code{pos}. This function takes into consideration all captures. Its return
+value is exact in that sense it counts all the liberties, unless @code{maxlib}
+allows it to stop earlier. The location @code{pos} must be empty. If
+@code{libs != NULL}, the locations of up to @code{maxlib} liberties are
+written into @code{libs[]}. The counting of liberties may or may not be halted
+when @code{maxlib} is reached. The number of found liberties is returned.
+This function guarantees that liberties which are not results of captures come
+first in @code{libs[]} array. To find whether all the liberties starting from
+a given one are results of captures, one may use @code{if (board[libs[k]] !=
+EMPTY)} construction.  If you want the number or the locations of all
+liberties, however many they are, you should pass @code{MAXLIBS} as the value
+for @code{maxlib} and allocate space for @code{libs[]} accordingly.
+@end quotation
+@end itemize
+
+Next we have some general utility functions.
+
+@itemize @bullet
+@item @code{int count_common_libs(int str1, int str2)}
+@findex count_common_libs
+@quotation
+Find the number of common liberties of the two strings.
+@end quotation
+@item @code{int find_common_libs(int str1, int str2, int maxlib, int *libs)}
+@findex find_common_libs
+@quotation
+Find the common liberties of the two strings. The locations of up to
+@code{maxlib} common liberties are written into @code{libs[]}.  The full
+number of common liberties is returned.  If you want the locations of all
+common liberties, whatever their number, you should pass @code{MAXLIBS} as the
+value for @code{maxlib} and allocate space for @code{libs[]} accordingly.
+@end quotation
+@item @code{int have_common_lib(int str1, int str2, int *lib)}
+@findex have_common_lib
+@quotation
+Determine whether two strings have at least one common liberty.
+If they do and @code{lib != NULL}, one common liberty is returned in 
+@code{*lib}.
+@end quotation
+@item @code{int countstones(int str)}
+@findex countstones
+@quotation
+Report the number of stones in a string.
+@end quotation
+@item @code{int findstones(int str, int maxstones, int *stones)}
+@findex findstones
+@quotation
+Find the stones of the string at @code{str}. The location must not be
+empty. The locations of up to maxstones stones are written into
+@code{stones[]}. The full number of stones is returned.
+@end quotation
+@item @code{int  chainlinks(int str, int adj[MAXCHAIN])}
+@findex chainlinks
+@quotation
+This very useful function returns (in the @code{adj} array) the chains
+surrounding the string at @code{str}. The number of chains is returned.
+@end quotation
+@item @code{int chainlinks2(int str, int adj[MAXCHAIN], int lib)}
+@findex chainlinks2
+@quotation
+Returns (in @code{adj} array) those chains surrounding the string at
+@code{str}, which has exactly @code{lib} liberties. The number of such chains
+is returned.
+@end quotation
+@item @code{int chainlinks3(int str, int adj[MAXCHAIN], int lib)}
+@findex chainlinks3
+@quotation
+Returns (in @code{adj} array) the chains surrounding
+the string at @code{str}, which have less or equal @code{lib} liberties.
+The number of such chains is returned.
+@end quotation
+@item @code{int extended_chainlinks(int str, int adj[MAXCHAIN], int both_colors)}
+@findex extended_chainlinks
+@quotation
+Returns (in the @code{adj} array) the opponent strings being directly adjacent
+to @code{str} or having a common liberty with @code{str}. The number of such
+strings is returned.  If the both_colors parameter is true, also own strings
+sharing a liberty are returned.
+@end quotation
+@item @code{int find_origin(int str)}
+@findex find_origin
+@quotation
+Find the origin of a string, i.e. the point with the smallest 1D board
+coordinate. The idea is to have a canonical reference point for a
+string.
+@end quotation
+@item @code{int is_self_atari(int pos, int color)}
+@findex is_self_atari
+@quotation
+Determine whether a move by color at @code{pos} would be a self atari,
+i.e. whether it would get more than one liberty. This function
+returns true also for the case of a suicide move.
+@end quotation
+@item @code{int liberty_of_string(int pos, int str)}
+@findex liberty_of_string
+@quotation
+Returns true if @code{pos} is a liberty of the string at @code{str}.
+@end quotation
+@item @code{int second_order_liberty_of_string(int pos, int str)}
+@findex second_order_liberty_of_string
+@quotation
+Returns true if @code{pos} is a second order liberty of the string at str.
+@end quotation
+@item @code{int neighbor_of_string(int pos, int str)}
+@findex neighbor_of_string
+@quotation
+Returns true if @code{pos} is adjacent to the string at @code{str}.
+@end quotation
+@item @code{int has_neighbor(int pos, int color)}
+@findex has_neighbor
+@quotation
+Returns true if @code{pos} has a neighbor of @code{color}.
+@end quotation
+@item @code{int same_string(int str1, int str2)}
+@findex same_string
+@quotation
+Returns true if @code{str1} and @code{str2} belong to the same string.
+@end quotation
+@item @code{int adjacent_strings(int str1, int str2)}
+@findex adjacent_strings
+@quotation
+Returns true if the strings at @code{str1} and @code{str2} are adjacent.
+@end quotation
+@item @code{int is_ko(int pos, int color, int *ko_pos)}
+@findex is_ko
+@quotation
+Return true if the move @code{pos} by @code{color} is a ko capture
+(whether capture is legal on this move or not). If so,
+and if @code{ko_pos} is not a @code{NULL} pointer, then
+@code{*ko_pos} returns the location of the captured ko stone.
+If the move is not a ko capture, @code{*ko_pos} is set to 0.
+A move is a ko capture if and only if
+@enumerate
+@item All neighbors are opponent stones.
+@item The number of captured stones is exactly one.
+@end enumerate
+@end quotation
+@item @code{int is_ko_point(int pos)}
+@findex is_ko_point
+@quotation
+Return true if @code{pos} is either a stone, which if captured would give
+ko, or if @code{pos} is an empty intersection adjacent to a ko stone.
+@end quotation
+@item @code{int does_capture_something(int pos, int color)}
+@findex does_capture_something
+@quotation
+Returns 1 if at least one string is captured when color plays at @code{pos}.
+@end quotation
+@item @code{void mark_string(int str, char mx[BOARDMAX], char mark)}
+@findex mark_string
+@quotation
+For each stone in the string at pos, set @code{mx} to value mark. If
+some of the stones in the string are marked prior to calling this
+function, only the connected unmarked stones starting from pos
+are guaranteed to become marked. The rest of the string may or may
+not become marked. (In the current implementation, it will.)
+@end quotation
+@item @code{int move_in_stack(int pos, int cutoff)}
+@findex move_in_stack
+@quotation
+Returns true if at least one move has been played at pos
+at deeper than level @code{cutoff} in the reading tree.
+@end quotation
+@item @code{int stones_on_board(int color)}
+@findex stones_on_board
+@quotation
+Return the number of stones of the indicated color(s) on the board.
+This only counts stones in the permanent position, not stones placed
+by @code{trymove()} or @code{tryko()}. Use 
+@code{stones_on_board(BLACK | WHITE)} to get
+the total number of stones on the board.
+@end quotation
+@end itemize
+
+@node Influence Utilities
+@section Utilities from @file{engine/influence.c}
+
+We will only list here a portion of the public functions in @code{influence.c}.
+The influence code is invoked through the function @code{compute_influence}
+(@pxref{Influence Usage}). It is invoked as follows.
+
+@itemize @bullet
+@item @code{void compute_influence(int color, const char safe_stones[BOARDMAX], const float strength[BOARDMAX], struct influence_data *q, int move, const char *trace_message)}
+@findex compute_influence
+@quotation
+Compute the influence values for both colors.
+The caller must
+@itemize @minus
+@item set up the @code{board[]} state
+@item mark safe stones with @code{INFLUENCE_SAFE_STONE}, dead stones with 0
+@item mark stones newly saved by a move with @code{INFLUENCE_SAVED_STONE}
+(this is relevant if the influence_data *q is reused to compute
+a followup value for this move).
+@end itemize
+Results will be stored in q.
+@code{move} has no effects except toggling debugging. Set it to -1
+for no debug output at all (otherwise it will be controlled by
+the @option{-m} command line option). It is assumed that @code{color} is in turn to move. (This affects the
+barrier patterns (class A, D) and intrusions (class B)). Color
+@end quotation
+@end itemize
+
+Other functions in @file{influence.c} are of the nature of utilities
+which may be useful throughout the engine. We list the most useful
+ones here.
+
+@itemize @bullet
+@item @code{void influence_mark_non_territory(int pos, int color)}
+@findex influence_mark_non_territory
+@quotation
+Called from actions for @samp{t} patterns in @file{barriers.db}.
+Marks @code{pos} as not being territory for @code{color}.
+@end quotation
+@item @code{int whose_territory(const struct influence_data *q, int pos)}
+@findex whose_territory
+@quotation
+Return the color of the territory at @code{pos}. If it's territory for
+neither color, @code{EMPTY} is returned.
+@end quotation
+@item @code{int whose_moyo(const struct influence_data *q, int pos)}
+@findex whose_moyo
+@quotation
+Return the color who has a moyo at @code{pos}. If neither color has a
+moyo there, @code{EMPTY} is returned. The definition of moyo in terms of the
+influences is totally ad hoc.
+@end quotation
+@item @code{int whose_area(const struct influence_data *q, int pos)}
+@findex whose_area
+@quotation
+Return the color who has dominating influence (``area'') at @code{pos}.
+If neither color dominates the influence there, EMPTY is returned.
+The definition of area in terms of the influences is totally ad hoc.
+@end quotation
+@end itemize
+
+
+
diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f8238d6
--- /dev/null
@@ -0,0 +1,62 @@
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/patterns)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/sgf)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/utils)
+
+
+########### engine library ###############
+
+SET(engine_STAT_SRCS
+    aftermath.c
+    board.c
+    boardlib.c
+    breakin.c
+    cache.c
+    clock.c
+    combination.c
+    dragon.c
+    endgame.c
+    filllib.c
+    fuseki.c
+    genmove.c
+    globals.c
+    handicap.c
+    hash.c
+    influence.c
+    interface.c
+    matchpat.c
+    montecarlo.c
+    move_reasons.c
+    movelist.c
+    optics.c
+    oracle.c
+    owl.c
+    persistent.c
+    printutils.c
+    readconnect.c
+    reading.c
+    semeai.c
+    sgfdecide.c
+    sgffile.c
+    shapes.c
+    showbord.c
+    surround.c
+    unconditional.c
+    utils.c
+    value_moves.c
+    worm.c
+    )
+
+ADD_LIBRARY(engine STATIC ${engine_STAT_SRCS})
+
+
+########### board library ###############
+
+SET(board_STAT_SRCS
+    board.c
+    boardlib.c
+    hash.c
+    printutils.c
+    )
+
+ADD_LIBRARY(board STATIC ${board_STAT_SRCS})
diff --git a/engine/Makefile.am b/engine/Makefile.am
new file mode 100644 (file)
index 0000000..e01b1f5
--- /dev/null
@@ -0,0 +1,63 @@
+EXTRA_DIST = engine.dsp board.dsp CMakeLists.txt
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+
+AM_CPPFLAGS = \
+       $(GNU_GO_WARNINGS) \
+       -I../patterns \
+       -I$(top_srcdir)/patterns \
+       -I$(top_srcdir)/sgf \
+       -I$(top_srcdir)/utils
+
+noinst_HEADERS = cache.h gnugo.h hash.h clock.h readconnect.h \
+                 influence.h liberty.h move_reasons.h board.h
+
+# preconfigured settings for various configurations
+noinst_LIBRARIES = libengine.a libboard.a
+
+libengine_a_SOURCES = \
+      aftermath.c \
+      board.c \
+      boardlib.c \
+      breakin.c \
+      cache.c \
+      clock.c \
+      combination.c \
+      dragon.c \
+      endgame.c \
+      filllib.c \
+      fuseki.c \
+      genmove.c \
+      globals.c \
+      handicap.c \
+      hash.c \
+      influence.c \
+      interface.c \
+      matchpat.c \
+      montecarlo.c \
+      move_reasons.c \
+      movelist.c \
+      optics.c \
+      oracle.c \
+      owl.c \
+      persistent.c \
+      printutils.c \
+      readconnect.c \
+      reading.c \
+      semeai.c \
+      sgfdecide.c \
+      sgffile.c \
+      shapes.c \
+      showbord.c \
+      surround.c \
+      unconditional.c \
+      utils.c \
+      value_moves.c \
+      worm.c
+
+libboard_a_SOURCES = \
+      board.c \
+      boardlib.c \
+      hash.c \
+      printutils.c
diff --git a/engine/Makefile.in b/engine/Makefile.in
new file mode 100644 (file)
index 0000000..1ea6e7a
--- /dev/null
@@ -0,0 +1,509 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = engine
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libboard_a_AR = $(AR) $(ARFLAGS)
+libboard_a_LIBADD =
+am_libboard_a_OBJECTS = board.$(OBJEXT) boardlib.$(OBJEXT) \
+       hash.$(OBJEXT) printutils.$(OBJEXT)
+libboard_a_OBJECTS = $(am_libboard_a_OBJECTS)
+libengine_a_AR = $(AR) $(ARFLAGS)
+libengine_a_LIBADD =
+am_libengine_a_OBJECTS = aftermath.$(OBJEXT) board.$(OBJEXT) \
+       boardlib.$(OBJEXT) breakin.$(OBJEXT) cache.$(OBJEXT) \
+       clock.$(OBJEXT) combination.$(OBJEXT) dragon.$(OBJEXT) \
+       endgame.$(OBJEXT) filllib.$(OBJEXT) fuseki.$(OBJEXT) \
+       genmove.$(OBJEXT) globals.$(OBJEXT) handicap.$(OBJEXT) \
+       hash.$(OBJEXT) influence.$(OBJEXT) interface.$(OBJEXT) \
+       matchpat.$(OBJEXT) montecarlo.$(OBJEXT) move_reasons.$(OBJEXT) \
+       movelist.$(OBJEXT) optics.$(OBJEXT) oracle.$(OBJEXT) \
+       owl.$(OBJEXT) persistent.$(OBJEXT) printutils.$(OBJEXT) \
+       readconnect.$(OBJEXT) reading.$(OBJEXT) semeai.$(OBJEXT) \
+       sgfdecide.$(OBJEXT) sgffile.$(OBJEXT) shapes.$(OBJEXT) \
+       showbord.$(OBJEXT) surround.$(OBJEXT) unconditional.$(OBJEXT) \
+       utils.$(OBJEXT) value_moves.$(OBJEXT) worm.$(OBJEXT)
+libengine_a_OBJECTS = $(am_libengine_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libboard_a_SOURCES) $(libengine_a_SOURCES)
+DIST_SOURCES = $(libboard_a_SOURCES) $(libengine_a_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = engine.dsp board.dsp CMakeLists.txt
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+AM_CPPFLAGS = \
+       $(GNU_GO_WARNINGS) \
+       -I../patterns \
+       -I$(top_srcdir)/patterns \
+       -I$(top_srcdir)/sgf \
+       -I$(top_srcdir)/utils
+
+noinst_HEADERS = cache.h gnugo.h hash.h clock.h readconnect.h \
+                 influence.h liberty.h move_reasons.h board.h
+
+
+# preconfigured settings for various configurations
+noinst_LIBRARIES = libengine.a libboard.a
+libengine_a_SOURCES = \
+      aftermath.c \
+      board.c \
+      boardlib.c \
+      breakin.c \
+      cache.c \
+      clock.c \
+      combination.c \
+      dragon.c \
+      endgame.c \
+      filllib.c \
+      fuseki.c \
+      genmove.c \
+      globals.c \
+      handicap.c \
+      hash.c \
+      influence.c \
+      interface.c \
+      matchpat.c \
+      montecarlo.c \
+      move_reasons.c \
+      movelist.c \
+      optics.c \
+      oracle.c \
+      owl.c \
+      persistent.c \
+      printutils.c \
+      readconnect.c \
+      reading.c \
+      semeai.c \
+      sgfdecide.c \
+      sgffile.c \
+      shapes.c \
+      showbord.c \
+      surround.c \
+      unconditional.c \
+      utils.c \
+      value_moves.c \
+      worm.c
+
+libboard_a_SOURCES = \
+      board.c \
+      boardlib.c \
+      hash.c \
+      printutils.c
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  engine/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  engine/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libboard.a: $(libboard_a_OBJECTS) $(libboard_a_DEPENDENCIES) 
+       -rm -f libboard.a
+       $(libboard_a_AR) libboard.a $(libboard_a_OBJECTS) $(libboard_a_LIBADD)
+       $(RANLIB) libboard.a
+libengine.a: $(libengine_a_OBJECTS) $(libengine_a_DEPENDENCIES) 
+       -rm -f libengine.a
+       $(libengine_a_AR) libengine.a $(libengine_a_OBJECTS) $(libengine_a_LIBADD)
+       $(RANLIB) libengine.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aftermath.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/board.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boardlib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/breakin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combination.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dragon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/endgame.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filllib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuseki.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genmove.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handicap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/influence.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interface.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matchpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/montecarlo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/move_reasons.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movelist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/optics.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oracle.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/owl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persistent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printutils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readconnect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reading.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/semeai.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgfdecide.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgffile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shapes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/showbord.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surround.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unconditional.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/value_moves.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worm.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/engine/aftermath.c b/engine/aftermath.c
new file mode 100644 (file)
index 0000000..8fe06f9
--- /dev/null
@@ -0,0 +1,1207 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "liberty.h"
+
+static int do_aftermath_genmove(int color,
+                               int under_control[BOARDMAX],
+                               int do_capture_dead_stones);
+
+
+static int
+all_own_neighbors_inessential(int pos, int color)
+{
+  int k;
+  for (k = 0; k < 4; k++)
+    if (board[pos + delta[k]] == color
+       && DRAGON2(pos + delta[k]).safety != INESSENTIAL
+       && (DRAGON2(pos + delta[k]).safety != ALIVE
+           || DRAGON2(pos + delta[k]).owl_status != DEAD))
+      return 0;
+
+  return 1;
+}
+
+/* Does a move by color at pos make one of the neighboring points into
+ * a solid one-point eye?
+ */
+static int make_solid_eye(int pos, int color)
+{
+  int k;
+  int r;
+  for (k = 0; k < 4; k++) {
+    int eyepos = pos + delta[k];
+    if (board[eyepos] == EMPTY
+       || (board[eyepos] == OTHER_COLOR(color)
+           && countlib(eyepos) == 1)) {
+      /* For a solid one-point eye all four neighbors must be own
+       * stones. But one is about to be played so we need three in the
+       * center, two on the edge and one in the corner.
+       *
+       * We also need a sufficient number of own diagonals; three in
+       * the center, two on the edge, and one in the corner.
+       *
+       * Notice that the same numbers are needed for both neighbors
+       * and diagonals and if we start counting at 2 in the corner and
+       * at 1 on the edge, we need to reach 3 everywhere on the board.
+       */
+      int own_neighbors = is_edge_vertex(pos) + is_corner_vertex(pos);
+      int own_diagonals = own_neighbors;
+      for (r = 0; r < 8; r++) {
+       if (board[eyepos + delta[r]] == color) {
+         if (r < 4)
+           own_neighbors++;
+         else
+           own_diagonals++;
+       }
+      }
+      if (own_neighbors == 3 && own_diagonals >= 3)
+       return 1;
+    }
+  }
+
+  return 0;
+}
+
+/* External interface to do_aftermath_genmove().
+ *
+ * If the suggested move turns out not to be allowed we just return
+ * pass. This is not ideal but also not a big deal. If
+ * do_aftermath_genmove() is ever redesigned that would be a good time
+ * to integrate allowed_moves.
+ */
+
+int
+aftermath_genmove(int color, int do_capture_dead_stones,
+                 int allowed_moves[BOARDMAX])
+{
+  int move = do_aftermath_genmove(color, NULL, do_capture_dead_stones);
+  if (move != PASS_MOVE && allowed_moves && !allowed_moves[move])
+    move = PASS_MOVE;
+
+  return move;
+}
+
+
+/* Generate a move to definitely settle the position after the game
+ * has been finished. The purpose of this is to robustly determine
+ * life and death status and to distinguish between life in seki and
+ * life with territory.
+ *
+ * The strategy is basically to turn all own living stones into
+ * invincible ones and remove from the board all dead opponent stones.
+ * Stones which cannot be removed, nor turned invincible, are alive in
+ * seki.
+ *
+ * If do_capture_dead_stones is 0, opponent stones are not necessarily
+ * removed from the board. This happens if they become unconditionally
+ * dead anyway.
+ *
+ * Moves are generated in the following order of priority:
+ * -1. Play a move which is listed as a replacement for an
+ *     unconditionally meaningless move. This is guaranteed to extend
+ *     the unconditionally settled part of the board. Only do this if
+ *     the meaningless move is not connected through open space to an
+ *     invincible string.
+ * 0.  Play edge liberties in certain positions. This is not really
+ *     necessary, but often it can simplify the tactical and strategical
+ *     reading substantially, making subsequent moves faster to generate.
+ * 1a. Capture an opponent string in atari and adjacent to own invincible
+ *     string. Moves leading to ko or snapback are excluded.
+ * 1b. If do_capture_dead_stones, play a non-self-atari move adjacent
+ *     to an unconditionally dead opponent string.
+ * 1c. If do_capture_dead_stones, play a liberty of an opponent string
+ *     where the liberty is adjacent to own invincible string.
+ * 2.  Extend an invincible string to a liberty of an opponent string.
+ * 3.  Connect a non-invincible string to an invincible string.
+ * 4.  Extend an invincible string towards an opponent string or an own
+ *     non-invincible string.
+ * 5.  Split a big eyespace of an alive own dragon without invincible
+ *     strings into smaller pieces. Do not play self-atari here.
+ * 6.  Play a liberty of a dead opponent dragon.
+ *
+ * Steps 2--4 are interleaved to try to optimize the efficiency of the
+ * moves. In step 5 too, efforts are made to play efficient moves.  By
+ * efficient we here mean moves which are effectively settling the
+ * position and simplify the tactical and strategical reading for
+ * subsequent moves.
+ *
+ * Steps 1--4 are guaranteed to be completely safe. Step 0 and 5
+ * should also be risk-free. Step 6 on the other hand definitely
+ * isn't. Consider for example this position:
+ *
+ * .XXXXX.
+ * XXOOOXX
+ * XOO.OOX
+ * XOXXXOX
+ * XO.XXOX
+ * -------
+ *
+ * In order to remove the O stones, it is necessary to play on one of
+ * the inner liberties, but one of them lets O live. Thus we have to
+ * check carefully for blunders at this step.
+ *
+ * Update: Step 0 is only safe against blunders if care is taken not
+ *         to get into a shortage of liberties.
+ *         Step 5 also has some risks. Consider this position:
+ *
+ *         |XXXXX.
+ *         |OOOOXX
+ *         |..O.OX
+ *         |OX*OOX
+ *         +------
+ *
+ *         Playing at * allows X to make seki.
+ *
+ * IMPORTANT RESTRICTION:
+ * Before calling this function it is mandatory to call genmove() or
+ * genmove_conservative(). For this function to be meaningful, the
+ * genmove() call should return pass.
+ */
+static int
+do_aftermath_genmove(int color,
+                    int under_control[BOARDMAX],
+                    int do_capture_dead_stones)
+{
+  int k;
+  int other = OTHER_COLOR(color);
+  int distance[BOARDMAX];
+  int score[BOARDMAX];
+  float owl_hotspot[BOARDMAX];
+  float reading_hotspot[BOARDMAX];
+  int dragons[BOARDMAX];
+  int something_found;
+  int closest_opponent = NO_MOVE;
+  int closest_own = NO_MOVE;
+  int d;
+  int move = NO_MOVE;
+  int pos = NO_MOVE;
+  int best_score;
+  int best_scoring_move;
+
+  owl_hotspots(owl_hotspot);
+  reading_hotspots(reading_hotspot);
+  
+  /* As a preparation we compute a distance map to the invincible strings. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    else if (board[pos] == color && worm[pos].invincible)
+      distance[pos] = 0;
+    else if (!do_capture_dead_stones
+            && ((board[pos] == other 
+                 && worm[pos].unconditional_status == DEAD)
+                || (board[pos] == color
+                    && worm[pos].unconditional_status == ALIVE)))
+      distance[pos] = 0;
+    else
+      distance[pos] = -1;
+  }
+  
+  d = 0;
+  do {
+    something_found = 0;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (ON_BOARD(pos) && distance[pos] == -1) {
+       for (k = 0; k < 4; k++) {
+         int pos2 = pos + delta[k];
+         if (!ON_BOARD(pos2))
+           continue;
+         if ((d == 0 || board[pos2] == EMPTY)
+             && distance[pos2] == d) {
+           if (d > 0 && board[pos] == other) {
+             distance[pos] = d + 1;
+             if (closest_opponent == NO_MOVE)
+               closest_opponent = pos;
+           }
+           else if (d > 0 && board[pos] == color) {
+             distance[pos] = d + 1;
+             if (closest_own == NO_MOVE)
+               closest_own = pos;
+           }
+           else if (board[pos] == EMPTY) {
+             distance[pos] = d + 1;
+             something_found = 1;
+           }
+           break;
+         }
+       }
+      }
+    }
+    d++;
+  } while (something_found);
+
+  if (under_control) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+      else if (distance[pos] == -1)
+       under_control[pos] = 0;
+      else
+       under_control[pos] = 1;
+    }
+  }
+  
+  if (debug & DEBUG_AFTERMATH) {
+    int m, n;
+    for (m = 0; m < board_size; m++) {
+      for (n = 0; n < board_size; n++) {
+       pos = POS(m, n);
+       if (distance[pos] > 0)
+         fprintf(stderr, "%2d", distance[pos]);
+       else if (distance[pos] == 0) {
+         if (board[pos] == WHITE)
+           gprintf(" o");
+         else if (board[pos] == BLACK)
+           gprintf(" x");
+         else
+           gprintf(" ?");
+       }
+       else {
+         if (board[pos] == WHITE)
+           gprintf(" O");
+         else if (board[pos] == BLACK)
+           gprintf(" X");
+         else
+           gprintf(" .");
+       }
+      }
+      gprintf("\n");
+    }
+  
+    gprintf("Closest opponent %1m", closest_opponent);
+    if (closest_opponent != NO_MOVE)
+      gprintf(", distance %d\n", distance[closest_opponent]);
+    else
+      gprintf("\n");
+
+    gprintf("Closest own %1m", closest_own);
+    if (closest_own != NO_MOVE)
+      gprintf(", distance %d\n", distance[closest_own]);
+    else
+      gprintf("\n");
+  }
+
+  /* Case -1. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int replacement_move;
+    if (board[pos] == EMPTY
+       && distance[pos] == -1
+       && unconditionally_meaningless_move(pos, color, &replacement_move)
+       && replacement_move != NO_MOVE) {
+      DEBUG(DEBUG_AFTERMATH, "Replacement move for %1m at %1m\n", pos,
+           replacement_move);
+      return replacement_move;
+    }
+  }
+  
+  /* Case 0. This is a special measure to avoid a certain kind of
+   * tactical reading inefficiency.
+   *
+   * Here we play on edge liberties in the configuration
+   *
+   * XO.
+   * .*.
+   * ---
+   *
+   * to stop X from "leaking" out along the edge. Sometimes this can
+   * save huge amounts of tactical reading for later moves.
+   */
+  best_scoring_move = NO_MOVE;
+  best_score = 5;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int libs;
+    if (board[pos] != EMPTY
+       || distance[pos] == 0)
+      continue;
+
+    libs = approxlib(pos, color, 3, NULL);
+    if (libs < 3)
+      continue;
+
+    if (is_self_atari(pos, other))
+      continue;
+    
+    for (k = 0; k < 4; k++) {
+      int dir = delta[k];
+      int right = delta[(k+1)%4];
+      if (!ON_BOARD(pos - dir)
+         && board[pos + dir] == color
+         && board[pos + dir + right] == other
+         && board[pos + dir - right] == other
+         && (libs > countlib(pos + dir)
+             || (libs > 4
+                 && libs == countlib(pos + dir)))
+         && (DRAGON2(pos + dir).safety == INVINCIBLE
+             || DRAGON2(pos + dir).safety == STRONGLY_ALIVE)) {
+       int this_score = 20 * (owl_hotspot[pos] + reading_hotspot[pos]);
+       if (this_score > best_score) {
+         best_score = this_score;
+         best_scoring_move = pos;
+       }
+      }
+    }
+  }
+  
+  if (best_scoring_move != NO_MOVE
+      && safe_move(best_scoring_move, color) == WIN) {
+    DEBUG(DEBUG_AFTERMATH, "Closing edge at %1m\n", best_scoring_move);
+    return best_scoring_move;
+  }
+
+  /* Case 1a. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int lib;
+    if (board[pos] == other
+       && worm[pos].unconditional_status != DEAD
+       && countlib(pos) == 1
+       && ((ON_BOARD(SOUTH(pos))    && distance[SOUTH(pos)] == 0)
+           || (ON_BOARD(WEST(pos))  && distance[WEST(pos)]  == 0)
+           || (ON_BOARD(NORTH(pos)) && distance[NORTH(pos)] == 0)
+           || (ON_BOARD(EAST(pos))  && distance[EAST(pos)]  == 0))) {
+      findlib(pos, 1, &lib);
+      /* Make sure we don't play into a ko or a (proper) snapback. */
+      if (countstones(pos) > 1 || !is_self_atari(lib, color)) {
+       return lib;
+      }
+    }
+  }
+
+  /* Case 1b. Play liberties of unconditionally dead stones, but never
+   * self-atari. For efficiency against stubborn opponents, we want to
+   * split up the empty space as much as possible. Therefore we look
+   * among this class of moves for one with a maximum number of
+   * adjacent empty spaces and opponent stones.
+   */
+  if (do_capture_dead_stones) {
+    best_score = 0;
+    best_scoring_move = NO_MOVE;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      /* Look at empty points which are connectable to some invincible
+       * string through empty space.
+       */
+      if (board[pos] == EMPTY
+         && distance[pos] >= 0) {
+       int valid_move = 0;
+       int this_score = 0;
+       for (k = 0; k < 4; k++) {
+         int pos2 = pos + delta[k];
+         if (board[pos2] == EMPTY)
+           this_score += 2;
+         else if (board[pos2] == other
+                  && worm[pos2].unconditional_status == DEAD) {
+           this_score++;
+           valid_move = 1;
+         }
+       }
+       if (valid_move
+           && this_score > best_score
+           && !is_self_atari(pos, color)) {
+         best_score = this_score;
+         best_scoring_move = pos;
+       }
+      }
+    }
+    if (best_score > 0)
+      return best_scoring_move;
+  }
+
+  /* Case 1c. */
+  if (do_capture_dead_stones) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (board[pos] == EMPTY
+         && distance[pos] == 1
+         && has_neighbor(pos, other)) {
+       return pos;
+      }
+    }
+  }
+
+  /* Cases 2--4. */
+  if (closest_opponent != NO_MOVE || closest_own != NO_MOVE) {
+    if (closest_own == NO_MOVE
+       || (capture_all_dead
+           && closest_opponent != NO_MOVE
+           && distance[closest_opponent] < distance[closest_own]))
+      move = closest_opponent;
+    else
+      move = closest_own;
+
+    /* if we're about to play at distance 1, try to optimize the move. */
+    if (distance[move] == 2) {
+      signed char mx[BOARDMAX];
+      signed char mark = 0;
+      memset(mx, 0, sizeof(mx));
+      best_score = 0;
+      best_scoring_move = move;
+
+      for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+       int score = 0;
+       int move_ok = 0;
+       if (!ON_BOARD(pos) || distance[pos] != 1)
+         continue;
+       mark++;
+       for (k = 0; k < 4; k++) {
+         int pos2 = pos + delta[k];
+         if (!ON_BOARD(pos2))
+           continue;
+         if (distance[pos2] < 1)
+           score--;
+         else if (board[pos2] == EMPTY)
+           score++;
+         else if (mx[pos2] == mark)
+           score--;
+         else {
+           if (board[pos2] == color) {
+             move_ok = 1;
+             score += 7;
+             if (countstones(pos2) > 2)
+               score++;
+             if (countstones(pos2) > 4)
+               score++;
+             if (countlib(pos2) < 4)
+               score++;
+             if (countlib(pos2) < 3)
+               score++;
+           }
+           else {
+             int deltalib = (approxlib(pos, other, MAXLIBS, NULL)
+                             - countlib(pos2));
+             move_ok = 1;
+             score++;
+             if (deltalib >= 0)
+               score++;
+             if (deltalib > 0)
+               score++;
+           }
+           mark_string(pos2, mx, mark);
+         }
+       }
+       if (is_suicide(pos, other))
+         score -= 3;
+       
+       if (0)
+         gprintf("Score %1m = %d\n", pos, score);
+       
+       if (move_ok && score > best_score) {
+         best_score = score;
+         best_scoring_move = pos;
+       }
+      }
+      move = best_scoring_move;
+    }
+
+    while (distance[move] > 1) {
+      for (k = 0; k < 4; k++) {
+       int pos2 = move + delta[k];
+       if (ON_BOARD(pos2)
+           && board[pos2] == EMPTY
+           && distance[pos2] == distance[move] - 1) {
+         move = pos2;
+         break;
+       }
+      }
+    }
+    return move;
+  }
+  
+  /* Case 5.
+   * If we reach here, either all strings of a dragon are invincible
+   * or no string is. Next we try to make alive dragons invincible by
+   * splitting big eyes into smaller ones. Our strategy is to search
+   * for an empty vertex with as many eye points as possible adjacent
+   * and with at least one alive but not invincible stone adjacent or
+   * diagonal.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int eyespace_neighbors = 0;
+    int own_neighbors = 0;
+    int own_diagonals = 0;
+    int opponent_dragons = 0;
+    int own_worms = 0;
+    int safety = UNKNOWN;
+    int bonus = 0;
+    int mx[BOARDMAX];
+    score[pos] = 0;
+      
+    if (board[pos] != EMPTY || distance[pos] != -1)
+      continue;
+
+    /* Do not play self-atari here. */
+    if (is_self_atari(pos, color))
+      continue;
+    
+    memset(mx, 0, sizeof(mx));
+    
+    for (k = 0; k < 8; k++) {
+      int pos2 = pos + delta[k];
+      if (!ON_BOARD(pos2))
+       continue;
+      
+      if (board[pos2] == EMPTY) {
+       if (k < 4)
+         eyespace_neighbors++;
+       continue;
+      }
+      
+      if (board[pos2] == other) {
+       int origin = dragon[pos2].origin;
+       
+       if (k < 4) {
+         if (dragon[pos2].status == ALIVE) {
+           safety = DEAD;
+           break;
+         }
+         else if (!mx[origin]) {
+           eyespace_neighbors++;
+           opponent_dragons++;
+         }
+       }
+
+       if (!mx[origin] && dragon[pos2].status == DEAD) {
+         bonus++;
+         if (k < 4 
+             && countlib(pos2) <= 2 
+             && countstones(pos2) >= 3)
+           bonus++;
+         
+         if (k < 4 && countlib(pos2) == 1)
+           bonus += 3;
+       }
+       mx[origin] = 1;
+      }
+      else if (board[pos2] == color) {
+       dragons[pos] = pos2;
+       
+       if (safety == UNKNOWN && dragon[pos2].status == ALIVE)
+         safety = ALIVE;
+       
+       if (DRAGON2(pos2).safety == INVINCIBLE)
+         safety = INVINCIBLE;
+       
+       if (k < 4) {
+         int apos = worm[pos2].origin;
+         
+         if (!mx[apos]) {
+           own_worms++;
+           if (countstones(apos) == 1)
+             bonus += 2;
+           if (countlib(apos) < 6
+               && approxlib(pos, color, 5, NULL) < countlib(apos))
+             bonus -= 5;
+           mx[apos] = 1;
+         }
+         
+         if (countlib(apos) <= 2) {
+           int r;
+           int important = 0;
+           int safe_atari = 0;
+           for (r = 0; r < 4; r++) {
+             d = delta[r];
+             if (!ON_BOARD(apos+d))
+               continue;
+             if (board[apos+d] == other
+                 && dragon[apos+d].status == DEAD)
+               important = 1;
+             else if (board[apos+d] == EMPTY
+                      && !is_self_atari(apos+d, other))
+               safe_atari = 1;
+           }
+           if (approxlib(pos, color, 3, NULL) > 2) {
+             bonus++;
+             if (important) {
+               bonus += 2;
+               if (safe_atari)
+                 bonus += 2;
+             }
+           }
+         }
+         
+         own_neighbors++;
+       }
+       else
+         own_diagonals++;
+      }
+    }
+    if (safety == DEAD || safety == UNKNOWN
+       || eyespace_neighbors == 0
+       || (own_neighbors + own_diagonals) == 0)
+      continue;
+    
+    if (bonus < 0)
+      bonus = 0;
+
+    /* Big bonus for making a small solid eye while splitting the
+     * eyespace. Don't bother optimizing for making two solid eyes,
+     * unconditional replacement moves (case -1) will take care of
+     * that.
+     *
+     * Additional bonus if adjacent to an opponent dragon and we are
+     * asked to remove all dead opponent stones.
+     */
+    if (eyespace_neighbors >= 2)
+      if (make_solid_eye(pos, color)) {
+       bonus += 20;
+       if (do_capture_dead_stones && opponent_dragons > 0)
+         bonus += 10;
+      }
+    
+    score[pos] = 4 * eyespace_neighbors + bonus;
+    if (safety == INVINCIBLE) {
+      score[pos] += own_neighbors;
+      if (own_neighbors < 2)
+       score[pos] += own_diagonals;
+      if (own_worms > 1 && eyespace_neighbors >= 1)
+       score[pos] += 10 + 5 * (own_worms - 2);
+    }
+    else if (eyespace_neighbors > 2)
+      score[pos] += own_diagonals;
+    
+    /* Splitting bonus. */
+    if (opponent_dragons > 1)
+      score[pos] += 10 * (opponent_dragons - 1);
+    
+    /* Hotspot bonus. */
+    {
+      int owl_hotspot_bonus = (int) (20.0 * owl_hotspot[pos]);
+      int reading_hotspot_bonus = (int) (20.0 * reading_hotspot[pos]);
+      int hotspot_bonus = owl_hotspot_bonus + reading_hotspot_bonus;
+      
+      /* Don't allow the hotspot bonus to turn a positive score into
+       * a non-positive one.
+       */
+      if (score[pos] > 0 && score[pos] + hotspot_bonus <= 0)
+       hotspot_bonus = 1 - score[pos];
+      
+      score[pos] += hotspot_bonus;
+      
+      if (1 && (debug & DEBUG_AFTERMATH))
+       gprintf("Score %1M = %d (hotspot bonus %d + %d)\n", pos, score[pos],
+               owl_hotspot_bonus, reading_hotspot_bonus);
+    }
+    
+    /* Avoid taking ko. */
+    if (is_ko(pos, color, NULL))
+      score[pos] = (score[pos] + 1) / 2;
+  }
+  
+  while (1) {
+    int bb;
+    best_score = 0;
+    move = NO_MOVE;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (ON_BOARD(pos) && score[pos] > best_score) {
+       best_score = score[pos];
+       move = pos;
+      }
+    }
+
+    if (move == NO_MOVE)
+      break;
+
+    bb = dragons[move];
+    if (is_illegal_ko_capture(move, color)
+       || !safe_move(move, color)
+       || (DRAGON2(bb).safety != INVINCIBLE
+           && DRAGON2(bb).safety != STRONGLY_ALIVE
+           && owl_does_defend(move, bb, NULL) != WIN)
+       || (!confirm_safety(move, color, NULL, NULL))) {
+      score[move] = 0;
+    }
+    else {
+      /* If we're getting short of liberties, we must be more careful.
+       * Check that no adjacent string or dragon gets more alive by
+       * the move.
+       */
+      int libs = approxlib(move, color, 5, NULL);
+      int move_ok = 1;
+      if (libs < 5) {
+       for (k = 0; k < 4; k++) {
+         if (board[move + delta[k]] == color
+             && countlib(move + delta[k]) > libs)
+           break;
+       }
+       if (k < 4) {
+         if (trymove(move, color, "aftermath-B", move + delta[k])) {
+           int adjs[MAXCHAIN];
+           int neighbors;
+           int r;
+           neighbors = chainlinks(move, adjs);
+           for (r = 0; r < neighbors; r++) {
+             if (worm[adjs[r]].attack_codes[0] != 0
+                 && (find_defense(adjs[r], NULL)
+                     > worm[adjs[r]].defense_codes[0])) {
+               DEBUG(DEBUG_AFTERMATH,
+                     "Blunder: %1m becomes tactically safer after %1m\n",
+                     adjs[r], move);
+               move_ok = 0;
+             }
+           }
+           popgo();
+           for (r = 0; r < neighbors && move_ok; r++) {
+             if (dragon[adjs[r]].status == DEAD
+                 && !owl_does_attack(move, adjs[r], NULL)) {
+               DEBUG(DEBUG_AFTERMATH,
+                     "Blunder: %1m becomes more alive after %1m\n",
+                     adjs[r], move);
+               move_ok = 0;
+             }
+           }
+         }
+       }
+      }
+
+      if (!move_ok)
+       score[move] = 0;
+      else {
+       DEBUG(DEBUG_AFTERMATH, "Splitting eyespace at %1m\n", move);
+       return move;
+      }
+    }
+  }
+
+  /* Case 6.
+   * Finally we try to play on liberties of remaining DEAD opponent
+   * dragons, carefully checking against mistakes.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int target;
+    int cc = NO_MOVE;
+    int self_atari_ok = 0;
+    if (board[pos] != EMPTY || distance[pos] != -1)
+      continue;
+    target = NO_MOVE;
+    for (k = 0; k < 8; k++) {
+      int pos2 = pos + delta[k];
+      if (!ON_BOARD(pos2))
+       continue;
+      if (board[pos2] == other 
+         && dragon[pos2].status != ALIVE
+         && dragon[pos2].status != UNKNOWN
+         && (do_capture_dead_stones 
+             || worm[pos2].unconditional_status != DEAD)
+         && DRAGON2(pos2).safety != INESSENTIAL) {
+       if (k < 4 || all_own_neighbors_inessential(pos, color)) {
+         target = pos2;
+         break;
+       }
+      }
+    }
+    if (target == NO_MOVE)
+      continue;
+    
+    /* At this point, (pos) is a move that potentially may capture
+     * a dead opponent string at (target).
+     */
+    
+    if (!trymove(pos, color, "aftermath-A", target))
+      continue;
+    
+    /* It is frequently necessary to sacrifice own stones in order
+     * to force the opponent's stones to be removed from the board,
+     * e.g. by adding stones to fill up a nakade shape. However, we
+     * should only play into a self atari if the sacrificed stones
+     * are classified as INESSENTIAL. Thus it would be ok for O to
+     * try a self atari in this position:
+     *
+     * |OOOO
+     * |XXXO
+     * |..XO
+     * |OOXO
+     * +----
+     *
+     * but not in this one:
+     *
+     * |XXX..
+     * |OOXX.
+     * |.OOXX
+     * |XXOOX
+     * |.O.OX
+     * +-----
+     */
+
+    self_atari_ok = 1;
+    for (k = 0; k < 4; k++) {
+      if (board[pos + delta[k]] == color
+         && DRAGON2(pos + delta[k]).safety != INESSENTIAL) {
+       self_atari_ok = 0;
+       cc = pos + delta[k];
+       break;
+      }
+    }
+    
+    /* Copy the potential move to (move). */
+    move = pos;
+    
+    /* If the move is a self atari, but that isn't okay, try to
+     * recursively find a backfilling move which later makes the
+     * potential move possible.
+     */
+    if (!self_atari_ok) {
+      while (countlib(pos) == 1) {
+       int lib;
+       findlib(pos, 1, &lib);
+       move = lib;
+       if (!trymove(move, color, "aftermath-B", target))
+         break;
+      }
+      
+      if (countlib(pos) == 1)
+       move = NO_MOVE;
+    }
+
+    while (stackp > 0)
+      popgo();
+    
+    if (move == NO_MOVE)
+      continue;
+      
+    /* Make sure that the potential move really isn't a self
+     * atari. In the case of a move found after backfilling this
+     * could happen (because the backfilling moves happened to
+     * capture some stones). The position of the move may even be
+     * occupied.
+     */
+    if (!self_atari_ok && (board[move] != EMPTY || is_self_atari(move, color)))
+      continue;
+    
+    /* Consult the owl code to determine whether the considered move
+     * really is effective. Blunders should be detected here.
+     */
+    if (owl_does_attack(move, target, NULL) == WIN) {
+      /* If we have an adjacent own dragon, which is not inessential,
+       * verify that it remains safe.
+       */
+      if (cc != NO_MOVE && !owl_does_defend(move, cc, NULL)) {
+       int resulta, resultb;
+       owl_analyze_semeai_after_move(move, color, target, cc,
+                                     &resulta, &resultb, NULL, 1, NULL, 1);
+       if (resulta != 0)
+         continue;
+      }
+
+      /* If we don't allow self atari, also call confirm safety to
+       * avoid setting up combination attacks.
+       */
+      if (!self_atari_ok && !confirm_safety(move, color, NULL, NULL))
+       continue;
+         
+      DEBUG(DEBUG_AFTERMATH, "Filling opponent liberty at %1m\n", move);
+      return move;
+    }
+  }
+  
+  /* Case 7.
+   * In very rare cases it turns out we need yet another pass. An
+   * example is this position:
+   *
+   * |.....
+   * |OOOO.
+   * |XXXO.
+   * |.OXO.
+   * |O.XO.
+   * +-----
+   *
+   * Here the X stones are found tactically dead and therefore the
+   * corner O stones have been amalgamated with the surrounding
+   * stones. Since the previous case only allows sacrificing
+   * INESSENTIAL stones, it fails to take X off the board.
+   *
+   * The solution is to look for tactically attackable opponent stones
+   * that still remain on the board but should be removed.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == other
+       && (worm[pos].unconditional_status == UNKNOWN
+           || do_capture_dead_stones)
+       && (DRAGON2(pos).safety == DEAD
+           || DRAGON2(pos).safety == TACTICALLY_DEAD)
+       && worm[pos].attack_codes[0] != 0
+       && !is_illegal_ko_capture(worm[pos].attack_points[0], color)) {
+      DEBUG(DEBUG_AFTERMATH, "Tactically attack %1m at %1m\n",
+           pos, worm[pos].attack_points[0]);
+      return worm[pos].attack_points[0];
+    }
+  }
+  
+  /* No move found. */
+  return PASS_MOVE;
+}
+
+/* This is a substitute for genmove_conservative() which only does
+ * what is required when doing the aftermath. Notice though that this
+ * generates an "ordinary" move, in contrast to aftermath_genmove().
+ * Usually this should turn up a pass, but when it doesn't it's
+ * important not to miss the move.
+ */
+static int
+reduced_genmove(int color)
+{
+  float value;
+  int save_verbose;
+  float our_score;
+  int move;
+
+  /* no move is found yet. */
+  move = PASS_MOVE;  
+  value = 0.0;
+  
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  /* Find out information about the worms and dragons. */
+  examine_position(EXAMINE_ALL, 1);
+
+  /* The score will be used to determine when we are safely
+   * ahead. So we want the most conservative score.
+   */
+  if (color == WHITE)
+    our_score = black_score;
+  else
+    our_score = -white_score;
+
+  gg_assert(stackp == 0);
+  
+  /*
+   * Ok, information gathering is complete. Now start to find some moves!
+   */
+
+  /* Pick up moves that we know of already. */
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+  collect_move_reasons(color);
+  verbose = save_verbose;
+  
+  /* Look for combination attacks and defenses against them. */
+  combinations(color);
+  gg_assert(stackp == 0);
+
+  /* Review the move reasons and estimate move values. */
+  if (review_move_reasons(&move, &value, color, 0.0, our_score, NULL, 0))
+    TRACE("Move generation likes %1m with value %f\n", move, value);
+  gg_assert(stackp == 0);
+
+  /* If no move is found then pass. */
+  if (move == PASS_MOVE)
+    TRACE("I pass.\n");
+  else
+    TRACE("reduced_genmove() recommends %1m with value %f\n", move, value);
+  return move;
+}
+
+/* Preliminary function for playing through the aftermath. */
+static void
+do_play_aftermath(int color, struct aftermath_data *a,
+                 SGFTree *aftermath_sgftree)
+{
+  int move;
+  int pass = 0;
+  int moves = 0;
+  int color_to_play = color;
+  DEBUG(DEBUG_AFTERMATH, "The aftermath starts.\n");
+
+  /* Disable computing worm and owl threats. */
+  disable_threat_computation = 1;
+  /* Disable matching of endgame patterns. */
+  disable_endgame_patterns = 1;
+
+  while (pass < 2 && moves < board_size * board_size) {
+    int reading_nodes = get_reading_node_counter();
+    int owl_nodes = get_owl_node_counter();
+    move = reduced_genmove(color_to_play);
+    if (move == PASS_MOVE) {
+      int save_verbose = verbose;
+      if (verbose > 0)
+       verbose--;
+      move = do_aftermath_genmove(color_to_play,
+                                 (color_to_play == WHITE ?
+                                  a->white_control : a->black_control),
+                                 0);
+      verbose = save_verbose;
+    }
+    play_move(move, color_to_play);
+    if (aftermath_sgftree)
+      sgftreeAddPlay(aftermath_sgftree, color_to_play, I(move), J(move));
+    moves++;
+    DEBUG(DEBUG_AFTERMATH, "%d %C move %1m (nodes %d, %d  total %d, %d)\n",
+         movenum, color_to_play, move, get_owl_node_counter() - owl_nodes,
+         get_reading_node_counter() - reading_nodes,
+         get_owl_node_counter(), get_reading_node_counter());
+    if (move != PASS_MOVE)
+      pass = 0;
+    else
+      pass++;
+    color_to_play = OTHER_COLOR(color_to_play);
+  }
+  
+  /* Reenable worm and dragon threats and endgame patterns. */
+  disable_threat_computation = 0;
+  disable_endgame_patterns   = 0;
+}
+
+static struct aftermath_data aftermath;
+
+static void
+play_aftermath(int color, SGFTree *aftermath_sgftree)
+{
+  int pos;
+  struct board_state saved_board;
+  struct aftermath_data *a = &aftermath;
+  static int current_board[BOARDMAX];
+  static int current_color = EMPTY;
+  int cached_board = 1;
+  gg_assert(color == BLACK || color == WHITE);
+
+  if (current_color != color) {
+    current_color = color;
+    cached_board = 0;
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && board[pos] != current_board[pos]) {
+      current_board[pos] = board[pos];
+      cached_board = 0;
+    }
+  }
+
+  /* If this is exactly the same position as the one we analyzed the
+   * last time, the content of the aftermath struct is up to date.
+   */
+  if (cached_board)
+    return;
+
+  a->white_captured = white_captured;
+  a->black_captured = black_captured;
+  a->white_prisoners = 0;
+  a->black_prisoners = 0;
+  a->white_territory = 0;
+  a->black_territory = 0;
+  a->white_area = 0;
+  a->black_area = 0;
+  
+  store_board(&saved_board);
+  do_play_aftermath(color, a, aftermath_sgftree);
+  restore_board(&saved_board);
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (a->black_control[pos]) {
+      a->black_area++;
+      if (board[pos] == WHITE) {
+       a->black_territory++;
+       a->white_prisoners++;
+       a->final_status[pos] = DEAD;
+      }
+      else if (board[pos] == EMPTY) {
+       a->black_territory++;
+       a->final_status[pos] = BLACK_TERRITORY;
+      }
+      else
+       a->final_status[pos] = ALIVE;
+    }
+    else if (a->white_control[pos]) {
+      a->white_area++;
+      if (board[pos] == BLACK) {
+       a->white_territory++;
+       a->black_prisoners++;
+       a->final_status[pos] = DEAD;
+      }
+      else if (board[pos] == EMPTY) {
+       a->white_territory++;
+       a->final_status[pos] = WHITE_TERRITORY;
+      }
+      else
+       a->final_status[pos] = ALIVE;
+    }
+    else {
+      if (board[pos] == EMPTY)
+       a->final_status[pos] = DAME;
+      else {
+       a->final_status[pos] = ALIVE_IN_SEKI;
+       if (board[pos] == WHITE)
+         a->white_area++;
+       else
+         a->black_area++;
+      }
+    }
+  }
+
+  if (debug & DEBUG_AFTERMATH) {
+    gprintf("White captured: %d\n", a->white_captured);
+    gprintf("Black captured: %d\n", a->black_captured);
+    gprintf("White prisoners: %d\n", a->white_prisoners);
+    gprintf("Black prisoners: %d\n", a->black_prisoners);
+    gprintf("White territory: %d\n", a->white_territory);
+    gprintf("Black territory: %d\n", a->black_territory);
+    gprintf("White area: %d\n", a->white_area);
+    gprintf("Black area: %d\n", a->black_area);
+  }
+}
+
+float
+aftermath_compute_score(int color, SGFTree *tree)
+{
+  struct aftermath_data *a = &aftermath;
+  play_aftermath(color, tree);
+  if (chinese_rules)
+    return (a->white_area
+           - a->black_area
+           + komi
+           + handicap);
+  else
+    return (a->white_territory
+           + a->black_captured
+           + a->black_prisoners
+           - (a->black_territory
+              + a->white_captured
+              + a->white_prisoners)
+           + komi);
+}
+
+/* Report the final status of a vertex on the board.
+ * Possible results are ALIVE, DEAD, ALIVE_IN_SEKI, WHITE_TERRITORY,
+ * BLACK_TERRITORY, and DAME.
+ */
+enum dragon_status
+aftermath_final_status(int color, int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+  play_aftermath(color, NULL);
+  return aftermath.final_status[pos];
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/board.c b/engine/board.c
new file mode 100644 (file)
index 0000000..d84a11a
--- /dev/null
@@ -0,0 +1,4331 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* The functions in this file implements a go board with incremental
+ * update of strings and liberties.
+ * 
+ * See the Texinfo documentation (Utility Functions: Incremental Board)
+ * for an introduction.
+ */
+
+#include "board.h"
+#include "hash.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+
+/* This can be used for internal checks w/in board.c that should
+ * typically not be necessary (for speed).
+ */
+#if 1
+#define PARANOID1(x, pos) ASSERT1(x, pos)
+#else
+#define PARANOID1(x, pos)
+#endif
+
+
+/* ================================================================ */
+/*                          data structures                         */
+/* ================================================================ */
+
+
+/* Incremental string data. */
+struct string_data {
+  int color;                       /* Color of string, BLACK or WHITE */
+  int size;                        /* Number of stones in string. */
+  int origin;                      /* Coordinates of "origin", i.e. */
+                                   /* "upper left" stone. */
+  int liberties;                   /* Number of liberties. */
+  int neighbors;                   /* Number of neighbor strings */
+  int mark;                        /* General purpose mark. */
+};
+
+struct string_liberties_data {
+  int list[MAX_LIBERTIES];         /* Coordinates of liberties. */
+};
+
+struct string_neighbors_data {
+  int list[MAXCHAIN];              /* List of neighbor string numbers. */
+};
+
+/* we keep the address and the old value */
+struct change_stack_entry {
+  int *address;
+  int value;
+};
+
+/* we keep the address and the old value */
+struct vertex_stack_entry {
+  Intersection *address;
+  int value;
+};
+
+
+/* Experimental results show that the average number of change stack
+ * entries per move usually is in the 20-30 range and very seldom
+ * exceeds 40. But since we have no way to recover from running out of
+ * stack space, we allocate with a substantial safety margin.
+ */
+#define STACK_SIZE 80 * MAXSTACK
+
+
+#define CLEAR_STACKS() do { \
+  change_stack_pointer = change_stack; \
+  vertex_stack_pointer = vertex_stack; \
+  VALGRIND_MAKE_WRITABLE(change_stack, sizeof(change_stack)); \
+  VALGRIND_MAKE_WRITABLE(vertex_stack, sizeof(vertex_stack)); \
+} while (0)
+
+/* Begin a record : address == NULL */
+#define BEGIN_CHANGE_RECORD()\
+((change_stack_pointer++)->address = NULL,\
+ (vertex_stack_pointer++)->address = NULL)
+
+/* Save a value : store the address and the value in the stack */
+#define PUSH_VALUE(v)\
+(change_stack_pointer->address = &(v),\
+ (change_stack_pointer++)->value = (v))
+
+/* Save a board value : store the address and the value in the stack */
+#define PUSH_VERTEX(v)\
+(vertex_stack_pointer->address = &(v),\
+ (vertex_stack_pointer++)->value = (v))
+
+#define POP_MOVE()\
+  while ((--change_stack_pointer)->address)\
+  *(change_stack_pointer->address) =\
+  change_stack_pointer->value
+
+
+#define POP_VERTICES()\
+  while ((--vertex_stack_pointer)->address)\
+  *(vertex_stack_pointer->address) =\
+  vertex_stack_pointer->value
+
+
+/* ================================================================ */
+/*                      static data structures                      */
+/* ================================================================ */
+
+
+/* Main array of string information. */
+static struct string_data string[MAX_STRINGS];
+static struct string_liberties_data string_libs[MAX_STRINGS];
+static struct string_neighbors_data string_neighbors[MAX_STRINGS];
+
+/* Stacks and stack pointers. */
+static struct change_stack_entry change_stack[STACK_SIZE];
+static struct change_stack_entry *change_stack_pointer;
+
+static struct vertex_stack_entry vertex_stack[STACK_SIZE];
+static struct vertex_stack_entry *vertex_stack_pointer;
+
+
+/* Index into list of strings. The index is only valid if there is a
+ * stone at the vertex.
+ */
+static int string_number[BOARDMAX];
+
+
+/* The stones in a string are linked together in a cyclic list. 
+ * These are the coordinates to the next stone in the string.
+ */
+static int next_stone[BOARDMAX];
+
+
+/* ---------------------------------------------------------------- */
+
+
+/* Macros to traverse the stones of a string.
+ *
+ * Usage:
+ * int s, pos;
+ * s = find_the_string()
+ * pos = FIRST_STONE(s);
+ *   do {
+ *    use_stone(pos);
+ *    pos = NEXT_STONE(pos);
+ *  } while (!BACK_TO_FIRST_STONE(s, pos));
+ */
+#define FIRST_STONE(s) \
+  (string[s].origin)
+
+#define NEXT_STONE(pos) \
+  (next_stone[pos])
+
+#define BACK_TO_FIRST_STONE(s, pos) \
+  ((pos) == string[s].origin)
+
+
+/* Assorted useful macros.
+ *
+ * Some of them could have been functions but are implemented as
+ * macros for speed.
+ */
+
+#define LIBERTY(pos) \
+  (board[pos] == EMPTY)
+
+#define UNMARKED_LIBERTY(pos) \
+  (board[pos] == EMPTY && ml[pos] != liberty_mark)
+
+#define MARK_LIBERTY(pos) \
+  ml[pos] = liberty_mark
+
+#define UNMARKED_STRING(pos) \
+  (string[string_number[pos]].mark != string_mark)
+
+/* Note that these two macros are not complementary. Both return
+ * false if board[pos] != color.
+ */
+#define UNMARKED_COLOR_STRING(pos, color)\
+  (board[pos] == color\
+   && string[string_number[pos]].mark != string_mark)
+
+#define MARKED_COLOR_STRING(pos, color)\
+  (board[pos] == color\
+   && string[string_number[pos]].mark == string_mark)
+
+#define MARK_STRING(pos) string[string_number[pos]].mark = string_mark
+
+#define STRING_AT_VERTEX(pos, s, color)\
+  ((board[pos] == color) && string_number[pos] == (s))
+
+#define NEIGHBOR_OF_STRING(pos, s, color)\
+  (STRING_AT_VERTEX(SOUTH(pos), s, color)\
+   || STRING_AT_VERTEX(WEST(pos), s, color)\
+   || STRING_AT_VERTEX(NORTH(pos), s, color)\
+   || STRING_AT_VERTEX(EAST(pos), s, color))
+
+/* These four macros have rather confusing names. It should be read as:
+ * "(pos) is a neighbor of string (s) of (color) in any direction except
+ * the specified one".
+ */
+#define NON_SOUTH_NEIGHBOR_OF_STRING(pos, s, color)\
+  (STRING_AT_VERTEX(SOUTH(pos), s, color)\
+   || STRING_AT_VERTEX(WEST(pos), s, color)\
+   || STRING_AT_VERTEX(EAST(pos), s, color))
+  
+#define NON_WEST_NEIGHBOR_OF_STRING(pos, s, color)\
+  (STRING_AT_VERTEX(WEST(pos), s, color)\
+   || STRING_AT_VERTEX(NORTH(pos), s, color)\
+   || STRING_AT_VERTEX(SOUTH(pos), s, color))
+  
+#define NON_NORTH_NEIGHBOR_OF_STRING(pos, s, color)\
+  (STRING_AT_VERTEX(NORTH(pos), s, color)\
+   || STRING_AT_VERTEX(EAST(pos), s, color)\
+   || STRING_AT_VERTEX(WEST(pos), s, color))
+  
+#define NON_EAST_NEIGHBOR_OF_STRING(pos, s, color)\
+  (STRING_AT_VERTEX(EAST(pos), s, color)\
+   || STRING_AT_VERTEX(SOUTH(pos), s, color)\
+   || STRING_AT_VERTEX(NORTH(pos), s, color))
+  
+#define LIBERTIES(pos)\
+  string[string_number[pos]].liberties
+
+#define COUNTSTONES(pos) \
+  string[string_number[pos]].size
+
+#define ADD_LIBERTY(s, pos)\
+  do {\
+    if (string[s].liberties < MAX_LIBERTIES)\
+      string_libs[s].list[string[s].liberties] = pos;\
+    string[s].liberties++;\
+  } while (0)
+
+#define ADD_AND_MARK_LIBERTY(s, pos)\
+  do {\
+    if (string[s].liberties < MAX_LIBERTIES)\
+      string_libs[s].list[string[s].liberties] = pos;\
+    string[s].liberties++;\
+    ml[pos] = liberty_mark;\
+  } while (0)
+
+#define ADD_NEIGHBOR(s, pos)\
+  string_neighbors[s].list[string[s].neighbors++] = string_number[pos]
+
+#define DO_ADD_STONE(pos, color)\
+  do {\
+    PUSH_VERTEX(board[pos]);\
+    board[pos] = color;\
+    hashdata_invert_stone(&board_hash, pos, color);\
+  } while (0)
+
+#define DO_REMOVE_STONE(pos)\
+  do {\
+    PUSH_VERTEX(board[pos]);\
+    hashdata_invert_stone(&board_hash, pos, board[pos]);\
+    board[pos] = EMPTY;\
+  } while (0)
+
+
+/* ---------------------------------------------------------------- */
+
+
+
+/* Number of the next free string. */
+static int next_string;
+
+
+/* For marking purposes. */
+static int ml[BOARDMAX];
+static int liberty_mark;
+static int string_mark;
+
+
+/* Forward declarations. */
+static void really_do_trymove(int pos, int color);
+static int do_trymove(int pos, int color, int ignore_ko);
+static void undo_trymove(void);
+
+static int do_approxlib(int pos, int color, int maxlib, int *libs);
+static int slow_approxlib(int pos, int color, int maxlib, int *libs);
+static int do_accuratelib(int pos, int color, int maxlib, int *libs);
+
+static int is_superko_violation(int pos, int color, enum ko_rules type);
+
+static void new_position(void);
+static int propagate_string(int stone, int str);
+static void find_liberties_and_neighbors(int s);
+static int do_remove_string(int s);
+static void do_commit_suicide(int pos, int color);
+static void do_play_move(int pos, int color);
+
+static int komaster, kom_pos;
+
+
+/* Statistics. */
+static int trymove_counter = 0;
+
+/* Coordinates for the eight directions, ordered
+ * south, west, north, east, southwest, northwest, northeast, southeast.
+ */
+int deltai[8] = { 1,  0, -1,  0,  1, -1, -1, 1};
+int deltaj[8] = { 0, -1,  0,  1, -1, -1,  1, 1};
+int delta[8]  = { NS, -1, -NS, 1, NS-1, -NS-1, -NS+1, NS+1};
+
+
+/* ================================================================ */
+/*                    Board initialization                          */
+/* ================================================================ */
+
+/*
+ * Save board state.
+ */
+
+void
+store_board(struct board_state *state)
+{
+  int k;
+
+  gg_assert(stackp == 0);
+
+  state->board_size = board_size;
+
+  memcpy(state->board, board, sizeof(board));
+  memcpy(state->initial_board, initial_board, sizeof(initial_board));
+
+  state->board_ko_pos = board_ko_pos;
+  state->white_captured = white_captured;
+  state->black_captured = black_captured;
+  
+  state->initial_board_ko_pos = initial_board_ko_pos;
+  state->initial_white_captured = initial_white_captured;
+  state->initial_black_captured = initial_black_captured;
+  
+  state->move_history_pointer = move_history_pointer;
+  for (k = 0; k < move_history_pointer; k++) {
+    state->move_history_color[k] = move_history_color[k];
+    state->move_history_pos[k] = move_history_pos[k];
+    state->move_history_hash[k] = move_history_hash[k];
+  }
+
+  state->komi = komi;
+  state->handicap = handicap;
+  state->move_number = movenum;
+}
+
+
+/*
+ * Restore a saved board state.
+ */
+
+void
+restore_board(struct board_state *state)
+{
+  int k;
+
+  gg_assert(stackp == 0);
+
+  board_size = state->board_size;
+
+  memcpy(board, state->board, sizeof(board));
+  memcpy(initial_board, state->initial_board, sizeof(initial_board));
+
+  board_ko_pos = state->board_ko_pos;
+  white_captured = state->white_captured;
+  black_captured = state->black_captured;
+  
+  initial_board_ko_pos = state->initial_board_ko_pos;
+  initial_white_captured = state->initial_white_captured;
+  initial_black_captured = state->initial_black_captured;
+  
+  move_history_pointer = state->move_history_pointer;
+  for (k = 0; k < move_history_pointer; k++) {
+    move_history_color[k] = state->move_history_color[k];
+    move_history_pos[k] = state->move_history_pos[k];
+    move_history_hash[k] = state->move_history_hash[k];
+  }
+
+  komi = state->komi;
+  handicap = state->handicap;
+  movenum = state->move_number;
+  
+  hashdata_recalc(&board_hash, board, board_ko_pos);
+  new_position();
+}
+
+
+/*
+ * Clear the internal board.
+ */
+
+void
+clear_board(void)
+{
+  int k;
+
+  gg_assert(board_size > 0 && board_size <= MAX_BOARD);
+  
+  memset(board, EMPTY, sizeof(board));
+  memset(initial_board, EMPTY, sizeof(initial_board));
+  for (k = 0; k < BOARDSIZE; k++) {
+    if (!ON_BOARD2(I(k), J(k))) {
+      board[k] = GRAY;
+      initial_board[k] = GRAY;
+    }
+  }
+
+  board_ko_pos = NO_MOVE;
+  white_captured = 0;
+  black_captured = 0;
+
+  komaster = EMPTY;
+  kom_pos = NO_MOVE;
+
+  initial_board_ko_pos = NO_MOVE;
+  initial_white_captured = 0;
+  initial_black_captured = 0;
+
+  move_history_pointer = 0;
+  movenum = 0;
+
+  handicap = 0;
+  
+  hashdata_recalc(&board_hash, board, board_ko_pos);
+  new_position();
+}
+
+/* Test the integrity of the gray border. */
+int
+test_gray_border(void)
+{
+  int k;
+
+  gg_assert(board_size > 0 && board_size <= MAX_BOARD);
+  
+  for (k = 0; k < BOARDSIZE; k++)
+    if (!ON_BOARD2(I(k), J(k)))
+      if (board[k] != GRAY)
+       return k;
+  
+  return -1;
+}
+
+
+/* ================================================================ */
+/*                      Temporary moves                             */
+/* ================================================================ */
+
+
+/* Stack of trial moves to get to current
+ * position and which color made them. Perhaps 
+ * this should be one array of a structure 
+ */
+static int stack[MAXSTACK];
+static int move_color[MAXSTACK];
+
+static Hash_data board_hash_stack[MAXSTACK];
+
+/*
+ * trymove pushes the position onto the stack, and makes a move
+ * at pos of color. Returns one if the move is legal. The
+ * stack pointer is only incremented if the move is legal.
+ *
+ * The way to use this is:
+ *
+ *   if (trymove(...)) {
+ *      ...
+ *      popgo();
+ *   }   
+ *
+ * The message can be written as a comment to an sgf file using 
+ * sgfdump(). str can be NO_MOVE if it is not needed but otherwise  
+ * the location of str is included in the comment.
+ */
+
+int 
+trymove(int pos, int color, const char *message, int str)
+{
+  UNUSED(str);
+  /* Do the real work elsewhere. */
+  if (!do_trymove(pos, color, 0))
+    return 0;
+
+  /* Store the move in an sgf tree if one is available. */
+  if (sgf_dumptree) {
+    char buf[100];
+
+    if (message == NULL)
+      message = "UNKNOWN";
+
+    if (pos == NO_MOVE) {
+      if (komaster != EMPTY)
+       gg_snprintf(buf, 100, "%s (variation %d, hash %s, komaster %s:%s)", 
+                   message, count_variations, hashdata_to_string(&board_hash),
+                   color_to_string(komaster), location_to_string(kom_pos));
+      else
+       gg_snprintf(buf, 100, "%s (variation %d, hash %s)", message,
+                   count_variations, hashdata_to_string(&board_hash));
+    }
+    else {
+      if (komaster != EMPTY)
+       gg_snprintf(buf, 100, 
+                   "%s at %s (variation %d, hash %s, komaster %s:%s)", 
+                   message, location_to_string(pos), count_variations,
+                   hashdata_to_string(&board_hash),
+                   color_to_string(komaster),
+                   location_to_string(kom_pos));
+      else
+       gg_snprintf(buf, 100, "%s at %s (variation %d, hash %s)", 
+                   message, location_to_string(pos), count_variations,
+                   hashdata_to_string(&board_hash));
+    }
+    sgftreeAddPlayLast(sgf_dumptree, color, I(pos), J(pos));
+    sgftreeAddComment(sgf_dumptree, buf);
+  }
+  
+  if (count_variations)
+    count_variations++;
+  stats.nodes++;
+
+  return 1;
+}
+
+
+/*
+ * tryko pushes the position onto the stack, and makes a move
+ * at (pos) of (color). The move is allowed even if it is an
+ * illegal ko capture. It is to be imagined that (color) has
+ * made an intervening ko threat which was answered and now
+ * the continuation is to be explored.
+ *
+ * Return 1 if the move is legal with the above caveat. Returns
+ * zero if it is not legal because of suicide.
+ */
+
+int 
+tryko(int pos, int color, const char *message)
+{
+  /* Do the real work elsewhere. */
+  if (!do_trymove(pos, color, 1))
+    return 0;
+
+  if (sgf_dumptree) {
+    char buf[100];
+    if (message == NULL)
+      message = "UNKNOWN";
+    if (komaster != EMPTY)
+      gg_snprintf(buf, 100, "tryko: %s (variation %d, %s, komaster %s:%s)", 
+                 message, count_variations, hashdata_to_string(&board_hash),
+                 color_to_string(komaster), location_to_string(kom_pos));
+    else
+      gg_snprintf(buf, 100, "tryko: %s (variation %d, %s)", message,
+                 count_variations, hashdata_to_string(&board_hash));
+
+    /* Add two pass moves to the SGF output to simulate the ko threat
+     * and the answer.
+     *
+     * The reason we add these is that certain SGF viewers, including
+     * Cgoban 1, won't properly display variations with illegal ko
+     * captures. SGF FF[4] compliant browsers should have no problem
+     * with this, though.
+     */
+    sgftreeAddPlayLast(sgf_dumptree, color, -1, -1);
+    sgftreeAddComment(sgf_dumptree, "tenuki (ko threat)");
+    sgftreeAddPlayLast(sgf_dumptree, OTHER_COLOR(color), -1, -1);
+    sgftreeAddComment(sgf_dumptree, "tenuki (answers ko threat)");
+
+    sgftreeAddPlayLast(sgf_dumptree, color, I(pos), J(pos));
+    sgftreeAddComment(sgf_dumptree, buf);
+  }
+  
+  if (count_variations)
+    count_variations++;
+  stats.nodes++;
+
+  return 1;
+}
+
+/* Really, really make a temporary move. It is assumed that all
+ * necessary checks have already been made and likewise that various
+ * administrative bookkeeping outside of the actual board logic has
+ * either been done or is not needed.
+ */
+static void
+really_do_trymove(int pos, int color)
+{
+  BEGIN_CHANGE_RECORD();
+  PUSH_VALUE(board_ko_pos);
+
+  /*
+   * FIXME: Do we really have to store board_hash in a stack?
+   *
+   * Answer: No, we don't.  But for every stone that we add
+   *         or remove, we must call hashdata_invert_stone(). This is
+   *         not difficult per se, but the whole board.c 
+   *         will have to be checked, and there is lots of room
+   *         for mistakes.
+   *
+   *         At the same time, profiling shows that storing the
+   *         hashdata in a stack doesn't take a lot of time, so
+   *         this is not an urgent FIXME.
+   */
+  memcpy(&board_hash_stack[stackp], &board_hash, sizeof(board_hash));
+
+  if (board_ko_pos != NO_MOVE)
+    hashdata_invert_ko(&board_hash, board_ko_pos);
+
+  board_ko_pos = NO_MOVE;
+  
+  stackp++;
+
+  if (pos != PASS_MOVE) {
+    PUSH_VALUE(black_captured);
+    PUSH_VALUE(white_captured);
+    do_play_move(pos, color);
+  }
+}
+
+/*
+ * Do the main work of trymove() and tryko(), i.e. the common parts.
+ * The ignore_ko flag tells whether an illegal ko capture may be done.
+ * Return 1 if the move was valid, otherwise 0.
+ */
+
+static int 
+do_trymove(int pos, int color, int ignore_ko)
+{
+  /* 1. The color must be BLACK or WHITE. */
+  gg_assert(color == BLACK || color == WHITE);
+  if (pos != PASS_MOVE) {
+    /* 2. Unless pass, the move must be inside the board. */
+    ASSERT_ON_BOARD1(pos);
+    
+    /* Update the reading tree shadow. */
+    shadow[pos] = 1;
+
+    /* 3. The location must be empty. */
+    if (board[pos] != EMPTY)
+      return 0;
+    
+    /* 4. The location must not be the ko point, unless ignore_ko == 1. */
+    if (!ignore_ko && pos == board_ko_pos) {
+      if (board[WEST(pos)] == OTHER_COLOR(color)
+         || board[EAST(pos)] == OTHER_COLOR(color)) {
+       return 0;
+      }
+    }
+
+    /* 5. Test for suicide. */
+    if (is_suicide(pos, color))
+      return 0;
+  }
+  
+  /* Check for stack overflow. */
+  if (stackp >= MAXSTACK-2) {
+    fprintf(stderr, 
+           "gnugo: Truncating search. This is beyond my reading ability!\n");
+    /* FIXME: Perhaps it's best to just assert here and be done with it? */
+    if (0) {
+      ASSERT1(0 && "trymove stack overflow", pos);
+    }
+#if 0
+    if (verbose > 0) {
+      showboard(0);
+      dump_stack();
+    }
+#endif
+    fflush(stderr);
+    return 0;
+  }
+
+
+  /* Only count trymove when we do create a new position. */
+  trymove_counter++;
+  
+  /* So far, so good. Now push the move on the move stack. These are
+   * needed for dump_stack().
+   */
+  stack[stackp] = pos;
+  move_color[stackp] = color;
+
+  really_do_trymove(pos, color);
+
+  return 1;
+}
+
+
+/*
+ * popgo pops the position from the stack.
+ */
+
+void
+popgo()
+{
+  undo_trymove();
+  
+  if (sgf_dumptree) {
+    char buf[100];
+    int is_tryko = 0;
+    char *sgf_comment;
+
+    /* FIXME: Change the sgfGet*Property() interface so that either
+     * "C" instead of "C " works or the SGFXX symbols are used.
+     */
+    if (sgfGetCharProperty(sgf_dumptree->lastnode, "C ", &sgf_comment)
+       && strncmp(sgf_comment, "tryko:", 6) == 0)
+      is_tryko = 1;
+    
+    gg_snprintf(buf, 100, "(next variation: %d)", count_variations);
+    sgftreeAddComment(sgf_dumptree, buf);
+    sgf_dumptree->lastnode = sgf_dumptree->lastnode->parent;
+
+    /* After tryko() we need to undo two pass nodes too. */
+    if (is_tryko)
+      sgf_dumptree->lastnode = sgf_dumptree->lastnode->parent->parent;
+  }
+}
+
+
+/* Restore board state to the position before the last move. This is
+ * accomplished by popping everything that was stored on the stacks
+ * since the last BEGIN_CHANGE_RECORD(). Also stackp is decreased and
+ * board hash is restored from stack.
+ *
+ * This undoes the effects of do_trymove() or really_do_trymove() and
+ * is appropriate to call instead of popgo() if you have not passed
+ * through trymove() or tryko().
+ */
+
+static void
+undo_trymove()
+{
+  gg_assert(change_stack_pointer - change_stack <= STACK_SIZE);
+
+  if (0) {
+    gprintf("Change stack size = %d\n", change_stack_pointer - change_stack);
+    gprintf("Vertex stack size = %d\n", vertex_stack_pointer - vertex_stack);
+  }
+
+  POP_MOVE();
+  POP_VERTICES();
+  
+  stackp--;
+  memcpy(&board_hash, &(board_hash_stack[stackp]), sizeof(board_hash));
+}
+
+
+
+/*
+ * dump_stack() for use under gdb prints the move stack. 
+ */
+
+void
+dump_stack(void)
+{
+  do_dump_stack();
+
+#if !TRACE_READ_RESULTS
+  if (count_variations)
+    gprintf("%o (variation %d)", count_variations-1);
+#else
+  gprintf("%o (%s)", hashdata_to_string(&board_hash));
+#endif
+
+  gprintf("%o\n");
+  fflush(stderr);
+}
+
+/* Bare bones of dump_stack(). */
+void
+do_dump_stack(void)
+{
+  int n;
+
+  for (n = 0; n < stackp; n++)
+    gprintf("%o%s:%1m ", move_color[n] == BLACK ? "B" : "W", stack[n]);
+}
+
+/* ================================================================ */
+/*                     Permanent moves                              */
+/* ================================================================ */
+
+
+static void
+reset_move_history(void)
+{
+  memcpy(initial_board, board, sizeof(board));
+  initial_board_ko_pos = board_ko_pos;
+  initial_white_captured = white_captured;
+  initial_black_captured = black_captured;
+  move_history_pointer = 0;
+}
+
+/* Place a stone on the board and update the board_hash. This operation
+ * destroys all move history.
+ */
+
+void
+add_stone(int pos, int color)
+{
+  ASSERT1(stackp == 0, pos);
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(board[pos] == EMPTY, pos);
+
+  board[pos] = color;
+  hashdata_invert_stone(&board_hash, pos, color);
+  reset_move_history();
+  new_position();
+}
+
+
+/* Remove a stone from the board and update the board_hash. This
+ * operation destroys the move history.
+ */
+
+void
+remove_stone(int pos)
+{
+  ASSERT1(stackp == 0, pos);
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(board[pos]), pos);
+
+  hashdata_invert_stone(&board_hash, pos, board[pos]);
+  board[pos] = EMPTY;
+  reset_move_history();
+  new_position();
+}
+
+
+/* Play a move. Basically the same as play_move() below, but doesn't store
+ * the move in history list.
+ *
+ * Set `update_internals' to zero if you want to play several moves in a
+ * row to avoid overhead caused by new_position(). Don't forget to call
+ * it yourself after all the moves have been played.
+ */
+static void
+play_move_no_history(int pos, int color, int update_internals)
+{
+#if CHECK_HASHING
+  Hash_data oldkey;
+
+  /* Check the hash table to see if it corresponds to the cumulative one. */
+  hashdata_recalc(&oldkey, board, board_ko_pos);
+  gg_assert(hashdata_is_equal(oldkey, board_hash));
+#endif
+
+  if (board_ko_pos != NO_MOVE)
+    hashdata_invert_ko(&board_hash, board_ko_pos);
+  board_ko_pos = NO_MOVE;
+
+  /* If the move is a pass, we can skip some steps. */
+  if (pos != PASS_MOVE) {
+    ASSERT_ON_BOARD1(pos);
+    ASSERT1(board[pos] == EMPTY, pos);
+
+    /* Do play the move. */
+    if (!is_suicide(pos, color))
+      do_play_move(pos, color);
+    else
+      do_commit_suicide(pos, color);
+
+#if CHECK_HASHING
+    /* Check the hash table to see if it equals the previous one. */
+    hashdata_recalc(&oldkey, board, board_ko_pos);
+    gg_assert(hashdata_is_equal(oldkey, board_hash));
+#endif
+  }
+
+  if (update_internals || next_string == MAX_STRINGS)
+    new_position();
+  else
+    CLEAR_STACKS();
+}
+
+/* Load the initial position and replay the first n moves. */
+static void
+replay_move_history(int n)
+{
+  int k;
+  
+  memcpy(board, initial_board, sizeof(board));
+  board_ko_pos = initial_board_ko_pos;
+  white_captured = initial_white_captured;
+  black_captured = initial_black_captured;
+  new_position();
+
+  for (k = 0; k < n; k++)
+    play_move_no_history(move_history_pos[k], move_history_color[k], 0);
+
+  new_position();
+}
+
+/* Play a move. If you want to test for legality you should first call
+ * is_legal(). This function strictly follows the algorithm: 
+ * 1. Place a stone of given color on the board.
+ * 2. If there are any adjacent opponent strings without liberties,
+ *    remove them and increase the prisoner count. 
+ * 3. If the newly placed stone is part of a string without liberties,
+ *    remove it and increase the prisoner count.
+ *
+ * In spite of the name "permanent move", this move can (usually) be
+ * unplayed by undo_move(), but it is significantly more costly than
+ * unplaying a temporary move. There are limitations on the available
+ * move history, so under certain circumstances the move may not be
+ * possible to unplay at a later time.
+ */
+void
+play_move(int pos, int color)
+{
+  ASSERT1(stackp == 0, pos);
+  ASSERT1(color == WHITE || color == BLACK, pos);
+  ASSERT1(pos == PASS_MOVE || ON_BOARD1(pos), pos);
+  ASSERT1(pos == PASS_MOVE || board[pos] == EMPTY, pos);
+  ASSERT1(komaster == EMPTY && kom_pos == NO_MOVE, pos);
+
+  if (move_history_pointer >= MAX_MOVE_HISTORY) {
+    /* The move history is full. We resolve this by collapsing the
+     * first about 10% of the moves into the initial position.
+     */
+    int number_collapsed_moves = 1 + MAX_MOVE_HISTORY / 10;
+    int k;
+    Intersection saved_board[BOARDSIZE];
+    int saved_board_ko_pos = board_ko_pos;
+    int saved_white_captured = white_captured;
+    int saved_black_captured = black_captured;
+    memcpy(saved_board, board, sizeof(board));
+
+    replay_move_history(number_collapsed_moves);
+
+    memcpy(initial_board, board, sizeof(board));
+    initial_board_ko_pos = board_ko_pos;
+    initial_white_captured = white_captured;
+    initial_black_captured = black_captured;
+
+    for (k = number_collapsed_moves; k < move_history_pointer; k++) {
+      move_history_color[k - number_collapsed_moves] = move_history_color[k];
+      move_history_pos[k - number_collapsed_moves] = move_history_pos[k];
+      move_history_hash[k - number_collapsed_moves] = move_history_hash[k];
+    }
+    move_history_pointer -= number_collapsed_moves;
+
+    memcpy(board, saved_board, sizeof(board));
+    board_ko_pos = saved_board_ko_pos;
+    white_captured = saved_white_captured;
+    black_captured = saved_black_captured;
+    new_position();
+  }
+
+  move_history_color[move_history_pointer] = color;
+  move_history_pos[move_history_pointer] = pos;
+  move_history_hash[move_history_pointer] = board_hash;
+  if (board_ko_pos != NO_MOVE)
+    hashdata_invert_ko(&move_history_hash[move_history_pointer], board_ko_pos);
+  move_history_pointer++;
+  
+  play_move_no_history(pos, color, 1);
+  
+  movenum++;
+}
+
+
+/* Undo n permanent moves. Returns 1 if successful and 0 if it fails.
+ * If n moves cannot be undone, no move is undone.
+ */
+int
+undo_move(int n)
+{
+  gg_assert(stackp == 0);
+  
+  /* Fail if and only if the move history is too short. */
+  if (move_history_pointer < n)
+    return 0;
+
+  replay_move_history(move_history_pointer - n);
+  move_history_pointer -= n;
+  movenum -= n;
+
+  return 1;
+}
+
+
+/* Return the last move done by the opponent to color. Both if no move
+ * was found or if the last move was a pass, PASS_MOVE is returned.
+ */
+int
+get_last_opponent_move(int color)
+{
+  int k;
+  
+  for (k = move_history_pointer - 1; k >= 0; k--)
+    if (move_history_color[k] == OTHER_COLOR(color))
+      return move_history_pos[k];
+
+  return PASS_MOVE;
+}
+
+/* Return the last move done by anyone. Both if no move was found or
+ * if the last move was a pass, PASS_MOVE is returned.
+ */
+int
+get_last_move()
+{
+  if (move_history_pointer == 0)
+    return PASS_MOVE;
+
+  return move_history_pos[move_history_pointer - 1];
+}
+
+/* Return the color of the player doing the last move. If no move was
+ * found, EMPTY is returned.
+ */
+int
+get_last_player()
+{
+  if (move_history_pointer == 0)
+    return EMPTY;
+
+  return move_history_color[move_history_pointer - 1];
+}
+
+
+/* ================================================================ */
+/*                        Utility functions                         */
+/* ================================================================ */
+
+
+/*
+ * Test if the move is a pass or not.  Return 1 if it is.
+ */
+
+int
+is_pass(int pos)
+{
+  return pos == 0;
+}
+
+
+/*
+ * is_legal(pos, color) determines whether the move (color) at pos is
+ * legal. This is for internal use in the engine and always assumes
+ * that suicide is allowed and only simple ko restrictions, no
+ * superko, regardless of the rules actually used in the game.
+ *
+ * Use is_allowed_move() if you want to take alternative suicide and
+ * ko rules into account.
+ */
+
+int 
+is_legal(int pos, int color)
+{
+  /* 0. A pass move is always legal. */
+  if (pos == PASS_MOVE)
+    return 1;
+
+  /* 1. The move must be inside the board. */
+  ASSERT_ON_BOARD1(pos);
+
+  /* 2. The location must be empty. */
+  if (board[pos] != EMPTY) 
+    return 0;
+
+  /* 3. The location must not be the ko point. */
+  if (pos == board_ko_pos) {
+    /*    The ko position is guaranteed to have all neighbors of the
+     *    same color, or off board. If that color is the same as the
+     *    move the ko is being filled, which is always allowed. This
+     *    could be tested with has_neighbor() but here a faster test
+     *    suffices.
+     */
+    if (board[WEST(pos)] == OTHER_COLOR(color)
+       || board[EAST(pos)] == OTHER_COLOR(color)) {
+      return 0;
+    }
+  }
+
+  /* Check for stack overflow. */
+  if (stackp >= MAXSTACK-2) {
+    fprintf(stderr, 
+           "gnugo: Truncating search. This is beyond my reading ability!\n");
+    /* FIXME: Perhaps it's best to just assert here and be done with it? */
+    if (0) {
+      ASSERT1(0 && "is_legal stack overflow", pos);
+    }
+    return 0;
+  }
+
+  /* Check for suicide. */
+  if (is_suicide(pos, color))
+    return 0;
+  
+  return 1;
+}
+
+
+/*
+ * is_suicide(pos, color) determines whether the move (color) at
+ * (pos) would be a suicide.
+ *
+ * This is the case if
+ * 1. There is no neighboring empty intersection.
+ * 2. There is no neighboring opponent string with exactly one liberty.
+ * 3. There is no neighboring friendly string with more than one liberty.
+ */
+int 
+is_suicide(int pos, int color)
+{
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(board[pos] == EMPTY, pos);
+
+  /* Check for suicide. */
+  if (LIBERTY(SOUTH(pos))
+      || (ON_BOARD(SOUTH(pos))
+         && ((board[SOUTH(pos)] == color) ^ (LIBERTIES(SOUTH(pos)) == 1))))
+    return 0;
+
+  if (LIBERTY(WEST(pos))
+      || (ON_BOARD(WEST(pos))
+         && ((board[WEST(pos)] == color) ^ (LIBERTIES(WEST(pos)) == 1))))
+    return 0;
+
+  if (LIBERTY(NORTH(pos))
+      || (ON_BOARD(NORTH(pos))
+         && ((board[NORTH(pos)] == color) ^ (LIBERTIES(NORTH(pos)) == 1))))
+    return 0;
+
+  if (LIBERTY(EAST(pos))
+      || (ON_BOARD(EAST(pos))
+         && ((board[EAST(pos)] == color) ^ (LIBERTIES(EAST(pos)) == 1))))
+    return 0;
+
+  return 1;
+}
+
+
+/*
+ * is_illegal_ko_capture(pos, color) determines whether the move
+ * (color) at (pos) would be an illegal ko capture.
+ */
+int 
+is_illegal_ko_capture(int pos, int color)
+{
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(board[pos] == EMPTY, pos);
+
+  return (pos == board_ko_pos
+         && ((board[WEST(pos)] == OTHER_COLOR(color))
+             || (board[EAST(pos)] == OTHER_COLOR(color))));
+}
+
+/*
+ * is_allowed_move(int pos, int color) determines whether a move is
+ * legal with respect to the suicide and ko rules in play.
+ *
+ * This function is only valid when stackp == 0 since there is no
+ * tracking of superko for trymoves.
+ */
+int
+is_allowed_move(int pos, int color)
+{
+  gg_assert(stackp == 0);
+
+  /* 1. A pass move is always legal, no matter what. */
+  if (pos == PASS_MOVE)
+    return 1;
+
+  /* 2. The move must be inside the board. */
+  ASSERT_ON_BOARD1(pos);
+
+  /* 3. The location must be empty. */
+  if (board[pos] != EMPTY) 
+    return 0;
+
+  /* 4. Simple ko repetition is only allowed if no ko rule is in use.
+   *    For superko rules this check is redundant.
+   *
+   *    The ko position is guaranteed to have all neighbors of the
+   *    same color, or off board. If that color is the same as the
+   *    move the ko is being filled, which is always allowed. This
+   *    could be tested with has_neighbor() but here a faster test
+   *    suffices.
+   */
+  if (ko_rule != NONE
+      && pos == board_ko_pos
+      && (board[WEST(pos)] == OTHER_COLOR(color)
+         || board[EAST(pos)] == OTHER_COLOR(color)))
+    return 0;
+
+  /* 5. Check for suicide. Suicide rule options:
+   *    FORBIDDEN   - No suicides allowed.
+   *    ALLOWED     - Suicide of more than one stone allowed.
+   *    ALL_ALLOWED - All suicides allowed.
+   */
+  if (is_suicide(pos, color))
+    if (suicide_rule == FORBIDDEN
+       || (suicide_rule == ALLOWED
+           && !has_neighbor(pos, color)))
+      return 0;
+
+  /* 6. Check for whole board repetitions. The superko options are
+   *    SIMPLE, NONE - No superko restrictions.
+   *    PSK          - Repetition of a previous position forbidden.
+   *    SSK          - Repetition of a previous position with the same
+   *                   player to move forbidden.
+   */
+  if (is_superko_violation(pos, color, ko_rule))
+    return 0;
+  
+  return 1;
+}
+
+/* Necessary work to set the new komaster state. */
+static void
+set_new_komaster(int new_komaster)
+{
+  PUSH_VALUE(komaster);
+  hashdata_invert_komaster(&board_hash, komaster);
+  komaster = new_komaster;
+  hashdata_invert_komaster(&board_hash, komaster);
+}
+
+/* Necessary work to set the new komaster position. */
+static void
+set_new_kom_pos(int new_kom_pos)
+{
+  PUSH_VALUE(kom_pos);
+  hashdata_invert_kom_pos(&board_hash, kom_pos);
+  kom_pos = new_kom_pos;
+  hashdata_invert_kom_pos(&board_hash, kom_pos);
+}
+
+/* Variation of trymove()/tryko() where ko captures (both conditional
+ * and unconditional) must follow a komaster scheme.
+ *
+ * Historical note: Up to GNU Go 3.4 five different komaster schemes
+ * were implemented and could easily be switched between. In GNU Go
+ * 3.5.1 four of them were removed to simplify the code and because it
+ * no longer seemed interesting to be able to switch. The remaining
+ * komaster scheme was previously known as komaster scheme 5 (or V).
+ *
+ * FIXME: This function could be optimized by integrating the
+ * trymove()/tryko() code.
+ */
+
+/* V. Complex scheme, O to move.
+ * 
+ * 1. Komaster is EMPTY.
+ * 1a) Unconditional ko capture is allowed.
+ *       Komaster remains EMPTY if previous move was not a ko capture.
+ *       Komaster is set to WEAK_KO if previous move was a ko capture
+ *       and kom_pos is set to the old value of board_ko_pos.
+ * 1b) Conditional ko capture is allowed. Komaster is set to O and
+ *     kom_pos to the location of the ko, where a stone was
+ *     just removed.
+ * 
+ * 2. Komaster is O:
+ * 2a) Only nested ko captures are allowed. Kom_pos is moved to the
+ *     new removed stone.
+ * 2b) If komaster fills the ko at kom_pos then komaster reverts to
+ *     EMPTY.
+ * 
+ * 3. Komaster is X:
+ *    Play at kom_pos is not allowed. Any other ko capture
+ *    is allowed. If O takes another ko, komaster becomes GRAY_X.
+ * 
+ * 4. Komaster is GRAY_O or GRAY_X:
+ *    Ko captures are not allowed. If the ko at kom_pos is
+ *    filled then the komaster reverts to EMPTY.
+ *
+ * 5. Komaster is WEAK_KO:
+ * 5a) After a non-ko move komaster reverts to EMPTY.
+ * 5b) Unconditional ko capture is only allowed if it is nested ko capture.
+ *     Komaster is changed to WEAK_X and kom_pos to the old value of
+ *     board_ko_pos.
+ * 5c) Conditional ko capture is allowed according to the rules of 1b.
+ */
+int
+komaster_trymove(int pos, int color, const char *message, int str,
+                int *is_conditional_ko, int consider_conditional_ko)
+{
+  int other = OTHER_COLOR(color);
+  int ko_move;
+  int kpos;
+  int previous_board_ko_pos = board_ko_pos;
+
+  *is_conditional_ko = 0;
+  ko_move = is_ko(pos, color, &kpos);
+
+  if (ko_move) {
+    /* If opponent is komaster we may not capture his ko. */
+    if (komaster == other && pos == kom_pos)
+      return 0;
+
+    /* If komaster is gray we may not capture ko at all. */
+    if (komaster == GRAY_WHITE || komaster == GRAY_BLACK)
+      return 0;
+
+    /* If we are komaster, we may only do nested captures. */
+    if (komaster == color && !DIAGONAL_NEIGHBORS(kpos, kom_pos))
+      return 0;
+
+    /* If komaster is WEAK_KO, we may only do nested ko capture or
+     * conditional ko capture.
+     */
+    if (komaster == WEAK_KO) {
+      if (pos != board_ko_pos && !DIAGONAL_NEIGHBORS(kpos, kom_pos))
+       return 0;
+    }
+  }
+
+  if (!trymove(pos, color, message, str)) {
+    if (!consider_conditional_ko)
+      return 0;
+
+    if (!tryko(pos, color, message))
+      return 0; /* Suicide. */
+      
+    *is_conditional_ko = 1;
+
+    /* Conditional ko capture, set komaster parameters. */
+    if (komaster == EMPTY || komaster == WEAK_KO) {
+      set_new_komaster(color);
+      set_new_kom_pos(kpos);
+      return 1;
+    }
+  }
+
+  if (!ko_move) {
+    /* If we are komaster, check whether the ko was resolved by the
+     * current move. If that is the case, revert komaster to EMPTY.
+     *
+     * The ko has been resolved in favor of the komaster if it has
+     * been filled, or if it is no longer a ko and an opponent move
+     * there is suicide.
+     */
+    if (((komaster == color
+         || (komaster == GRAY_WHITE && color == WHITE)
+         || (komaster == GRAY_BLACK && color == BLACK))
+        && (IS_STONE(board[kom_pos])
+            || (!is_ko(kom_pos, other, NULL)
+                && is_suicide(kom_pos, other))))) {
+      set_new_komaster(EMPTY);
+      set_new_kom_pos(NO_MOVE);
+    }
+
+    if (komaster == WEAK_KO) {
+      set_new_komaster(EMPTY);
+      set_new_kom_pos(NO_MOVE);
+    }
+    
+    return 1;
+  }
+
+  if (komaster == other) {
+    if (color == WHITE)
+      set_new_komaster(GRAY_BLACK);
+    else
+      set_new_komaster(GRAY_WHITE);
+  }
+  else if (komaster == color) {
+    /* This is where we update kom_pos after a nested capture. */
+    set_new_kom_pos(kpos);
+  }
+  else {
+    /* We can reach here when komaster is EMPTY or WEAK_KO. If previous
+     * move was also a ko capture, we now set komaster to WEAK_KO.
+     */
+    if (previous_board_ko_pos != NO_MOVE) {
+      set_new_komaster(WEAK_KO);
+      set_new_kom_pos(previous_board_ko_pos);
+    }
+  }
+  
+  return 1;
+}
+
+int
+get_komaster()
+{
+  return komaster;
+}
+
+int
+get_kom_pos()
+{
+  return kom_pos;
+}
+
+
+/* Determine whether vertex is on the edge. */
+int
+is_edge_vertex(int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (!ON_BOARD(SW(pos))
+      || !ON_BOARD(NE(pos)))
+    return 1;
+
+  return 0;
+}
+
+/* Distance to the edge. */
+int
+edge_distance(int pos)
+{
+  int i = I(pos);
+  int j = J(pos);
+  ASSERT_ON_BOARD1(pos);
+  return gg_min(gg_min(i, board_size-1 - i), gg_min(j, board_size-1 - j));
+}
+
+
+/* Determine whether vertex is a corner. */
+int
+is_corner_vertex(int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+  if ((!ON_BOARD(WEST(pos)) || !ON_BOARD(EAST(pos)))
+      && (!ON_BOARD(SOUTH(pos)) || !ON_BOARD(NORTH(pos))))
+    return 1;
+  
+  return 0;
+}
+
+
+/* Reorientation of point pos. This function could have been
+ * implemented using the rotate() function in utils/gg_utils.c but we
+ * don't want to make libboard dependent on utils.
+ */
+int
+rotate1(int pos, int rot)
+{
+  int bs = board_size - 1;
+  int i = I(pos);
+  int j = J(pos);
+  gg_assert(rot >= 0 && rot < 8);
+
+  if (pos == PASS_MOVE)
+    return PASS_MOVE;
+
+  if (rot == 0)
+    return pos;                 /* identity map */
+  if (rot == 1)
+    return POS(bs - j, i);      /* rotation over 90 degrees */
+  if (rot == 2)
+    return POS(bs - i, bs - j); /* rotation over 180 degrees */
+  if (rot == 3)
+    return POS(j, bs - i);      /* rotation over 270 degrees */
+  if (rot == 4)
+    return POS(j, i);           /* flip along diagonal */
+  if (rot == 5)
+    return POS(bs - i, j);      /* flip */
+  if (rot == 6)
+    return POS(bs - j, bs - i); /* flip along diagonal */
+  if (rot == 7)
+    return POS(i, bs - j);      /* flip */
+
+  return PASS_MOVE;             /* unreachable */
+}
+
+
+/* Returns true if the empty vertex respectively the string at pos1 is
+ * adjacent to the empty vertex respectively the string at pos2.
+ */
+int
+are_neighbors(int pos1, int pos2)
+{
+  if (board[pos1] == EMPTY) {
+    if (board[pos2] == EMPTY)
+      return (gg_abs(pos1 - pos2) == NS || gg_abs(pos1 - pos2) == WE);
+    else
+      return neighbor_of_string(pos1, pos2);
+  }
+  else {
+    if (board[pos2] == EMPTY)
+      return neighbor_of_string(pos2, pos1);
+    else
+      return adjacent_strings(pos1, pos2);
+  }
+}
+
+
+/* Count the number of liberties of the string at pos. pos must not be
+ * empty.
+ */
+int
+countlib(int str)
+{
+  ASSERT1(IS_STONE(board[str]), str);
+  
+  /* We already know the number of liberties. Just look it up. */
+  return string[string_number[str]].liberties;
+}
+
+
+/* Find the liberties of the string at str. str must not be
+ * empty. The locations of up to maxlib liberties are written into
+ * libs[]. The full number of liberties is returned.
+ *
+ * If you want the locations of all liberties, whatever their number,
+ * you should pass MAXLIBS as the value for maxlib and allocate space
+ * for libs[] accordingly.
+ */
+
+int
+findlib(int str, int maxlib, int *libs)
+{
+  int k;
+  int liberties;
+  int s;
+  
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(libs != NULL, str);
+  
+  /* We already have the list of liberties and only need to copy it to
+   * libs[].
+   *
+   * However, if the string has more than MAX_LIBERTIES liberties the
+   * list is truncated and if maxlib is also larger than MAX_LIBERTIES
+   * we have to traverse the stones in the string in order to find
+   * where the liberties are.
+   */
+  s = string_number[str];
+  liberties = string[s].liberties;
+
+  if (liberties <= MAX_LIBERTIES || maxlib <= MAX_LIBERTIES) {
+    /* The easy case, it suffices to copy liberty locations from the
+     * incrementally updated list.
+     */
+    for (k = 0; k < maxlib && k < liberties; k++)
+      libs[k] = string_libs[s].list[k];
+  }
+  else {
+    /* The harder case, where we have to traverse the stones in the
+     * string. We don't have to check explicitly if we are back to
+     * the start of the chain since we will run out of liberties
+     * before that happens.
+     */
+    int pos;
+    liberty_mark++;
+    for (k = 0, pos = FIRST_STONE(s);
+        k < maxlib && k < liberties;
+        pos = NEXT_STONE(pos)) {
+      if (UNMARKED_LIBERTY(SOUTH(pos))) {
+       libs[k++] = SOUTH(pos);
+       MARK_LIBERTY(SOUTH(pos));
+       if (k >= maxlib)
+         break;
+      }
+      
+      if (UNMARKED_LIBERTY(WEST(pos))) {
+       libs[k++] = WEST(pos);
+       MARK_LIBERTY(WEST(pos));
+       if (k >= maxlib)
+         break;
+      }
+      
+      if (UNMARKED_LIBERTY(NORTH(pos))) {
+       libs[k++] = NORTH(pos);
+       MARK_LIBERTY(NORTH(pos));
+       if (k >= maxlib)
+         break;
+      }
+      
+      if (UNMARKED_LIBERTY(EAST(pos))) {
+       libs[k++] = EAST(pos);
+       MARK_LIBERTY(EAST(pos));
+       if (k >= maxlib)
+         break;
+      }
+    }
+  }
+      
+  return liberties;
+}
+
+/* Count the liberties a stone of the given color would get if played
+ * at (pos). The location (pos) must be empty.
+ *
+ * The intent of this function is to be as fast as possible, not
+ * necessarily complete. But if it returns a positive value (meaning
+ * it has succeeded), the value is guaranteed to be correct.
+ *
+ * Captures are ignored based on the ignore_capture flag.  The function
+ * fails if there are more than two neighbor strings of the same
+ * color.  In this case, the return value is -1.  Captures are handled
+ * in a very limited way, so if ignore_capture is 0, and a capture is
+ * required, it will often return -1.
+ *
+ * Note well, that it relies on incremental data.
+ */
+
+int
+fastlib(int pos, int color, int ignore_captures)
+{
+  int ally1 = -1;
+  int ally2 = -1;
+  int fast_liberties = 0;
+
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  /* Find neighboring strings of the same color. If there are more than two of
+   * them, we give up (it's too difficult to count their common liberties).
+   */
+  if (board[SOUTH(pos)] == color) {
+    ally1 = string_number[SOUTH(pos)];
+
+    if (board[WEST(pos)] == color
+       && string_number[WEST(pos)] != ally1) {
+      ally2 = string_number[WEST(pos)];
+
+      if (board[NORTH(pos)] == color
+         && string_number[NORTH(pos)] != ally1
+         && string_number[NORTH(pos)] != ally2)
+       return -1;
+    }
+    else if (board[NORTH(pos)] == color
+            && string_number[NORTH(pos)] != ally1)
+      ally2 = string_number[NORTH(pos)];
+
+    if (board[EAST(pos)] == color
+       && string_number[EAST(pos)] != ally1) {
+      if (ally2 < 0)
+       ally2 = string_number[EAST(pos)];
+      else if (string_number[EAST(pos)] != ally2)
+       return -1;
+    }
+  }
+  else if (board[WEST(pos)] == color) {
+    ally1 = string_number[WEST(pos)];
+
+    if (board[NORTH(pos)] == color
+       && string_number[NORTH(pos)] != ally1) {
+      ally2 = string_number[NORTH(pos)];
+
+      if (board[EAST(pos)] == color
+         && string_number[EAST(pos)] != ally1
+         && string_number[EAST(pos)] != ally2)
+       return -1;
+    }
+    else if (board[EAST(pos)] == color
+            && string_number[EAST(pos)] != ally1)
+      ally2 = string_number[EAST(pos)];
+  }
+  else if (board[NORTH(pos)] == color) {
+    ally1 = string_number[NORTH(pos)];
+    
+    if (board[EAST(pos)] == color
+       && string_number[EAST(pos)] != ally1)
+      ally2 = string_number[EAST(pos)];
+  }
+  else if (board[EAST(pos)] == color)
+    ally1 = string_number[EAST(pos)];
+
+  /* If we are to ignore captures, the things are very easy. */
+  if (ignore_captures) {
+    if (ally1 < 0) {                   /* No allies */
+      if (LIBERTY(SOUTH(pos)))
+       fast_liberties++;
+      if (LIBERTY(WEST(pos)))
+       fast_liberties++;
+      if (LIBERTY(NORTH(pos)))
+       fast_liberties++;
+      if (LIBERTY(EAST(pos)))
+       fast_liberties++;
+    }
+    else if (ally2 < 0) {              /* One ally */
+      if (LIBERTY(SOUTH(pos))
+         && !NON_SOUTH_NEIGHBOR_OF_STRING(SOUTH(pos), ally1, color))
+       fast_liberties++;
+      if (LIBERTY(WEST(pos))
+         && !NON_WEST_NEIGHBOR_OF_STRING(WEST(pos), ally1, color))
+       fast_liberties++;
+      if (LIBERTY(NORTH(pos))
+         && !NON_NORTH_NEIGHBOR_OF_STRING(NORTH(pos), ally1, color))
+       fast_liberties++;
+      if (LIBERTY(EAST(pos))
+         && !NON_EAST_NEIGHBOR_OF_STRING(EAST(pos), ally1, color))
+       fast_liberties++;
+
+      fast_liberties += string[ally1].liberties - 1;
+    }
+    else {                             /* Two allies */
+      if (LIBERTY(SOUTH(pos))
+         && !NON_SOUTH_NEIGHBOR_OF_STRING(SOUTH(pos), ally1, color)
+         && !NON_SOUTH_NEIGHBOR_OF_STRING(SOUTH(pos), ally2, color))
+       fast_liberties++;
+      if (LIBERTY(WEST(pos))
+         && !NON_WEST_NEIGHBOR_OF_STRING(WEST(pos), ally1, color)
+         && !NON_WEST_NEIGHBOR_OF_STRING(WEST(pos), ally2, color))
+       fast_liberties++;
+      if (LIBERTY(NORTH(pos))
+         && !NON_NORTH_NEIGHBOR_OF_STRING(NORTH(pos), ally1, color)
+         && !NON_NORTH_NEIGHBOR_OF_STRING(NORTH(pos), ally2, color))
+       fast_liberties++;
+      if (LIBERTY(EAST(pos))
+         && !NON_EAST_NEIGHBOR_OF_STRING(EAST(pos), ally1, color)
+         && !NON_EAST_NEIGHBOR_OF_STRING(EAST(pos), ally2, color))
+       fast_liberties++;
+
+      fast_liberties += string[ally1].liberties + string[ally2].liberties
+       - count_common_libs(string[ally1].origin, string[ally2].origin) - 1;
+    }
+  }
+  /* We are to take captures into account. This case is much more rare, so
+   * it is not optimized much.
+   */
+  else {
+    int k;
+
+    for (k = 0; k < 4; k++) {
+      int neighbor = pos + delta[k];
+
+      if (LIBERTY(neighbor)
+         && (ally1 < 0 || !NEIGHBOR_OF_STRING(neighbor, ally1, color))
+         && (ally2 < 0 || !NEIGHBOR_OF_STRING(neighbor, ally2, color)))
+       fast_liberties++;
+      else if (board[neighbor] == OTHER_COLOR(color)   /* A capture */
+              && LIBERTIES(neighbor) == 1) {
+       int neighbor_size = COUNTSTONES(neighbor);
+
+       if (neighbor_size == 1 || (neighbor_size == 2 && ally1 < 0))
+         fast_liberties++;
+       else
+         return -1;
+      }
+    }
+
+    if (ally1 >= 0) {
+      fast_liberties += string[ally1].liberties - 1;
+      if (ally2 >= 0)
+       fast_liberties += string[ally2].liberties
+         - count_common_libs(string[ally1].origin, string[ally2].origin);
+    }
+  }
+
+  return fast_liberties;
+}
+
+
+/* Effectively true unless we store full position in hash. */
+#define USE_BOARD_CACHES       (NUM_HASHVALUES <= 4)
+
+struct board_cache_entry {
+  int threshold;
+  int liberties;
+  Hash_data position_hash;
+};
+
+
+/* approxlib() cache. */
+static struct board_cache_entry approxlib_cache[BOARDMAX][2];
+
+
+/* Clears approxlib() cache. This function should be called only once
+ * during engine initialization. Sets thresholds to zero.
+ */
+void
+clear_approxlib_cache(void)
+{
+  int pos;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    approxlib_cache[pos][0].threshold = 0;
+    approxlib_cache[pos][1].threshold = 0;
+  }
+}
+
+
+/* Find the liberties a stone of the given color would get if played
+ * at (pos), ignoring possible captures of opponent stones. (pos)
+ * must be empty. If libs != NULL, the locations of up to maxlib
+ * liberties are written into libs[]. The counting of liberties may
+ * or may not be halted when maxlib is reached. The number of liberties
+ * found is returned.
+ *
+ * If you want the number or the locations of all liberties, however
+ * many they are, you should pass MAXLIBS as the value for maxlib and
+ * allocate space for libs[] accordingly.
+ */
+int
+approxlib(int pos, int color, int maxlib, int *libs)
+{
+  int liberties;
+
+#ifdef USE_BOARD_CACHES
+
+  struct board_cache_entry *entry = &approxlib_cache[pos][color - 1];
+
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (!libs) {
+    /* First see if this result is cached. */
+    if (hashdata_is_equal(board_hash, entry->position_hash)
+       && maxlib <= entry->threshold) {
+      return entry->liberties;
+    }
+
+    liberties = fastlib(pos, color, 1);
+    if (liberties >= 0) {
+      /* Since fastlib() always returns precise result and doesn't take
+       * `maxlib' into account, we set threshold to MAXLIBS so that this
+       * result is used regardless of any `maxlib' passed.
+       */
+      entry->threshold = MAXLIBS;
+      entry->liberties = liberties;
+      entry->position_hash = board_hash;
+
+      return liberties;
+    }
+  }
+
+  /* We initialize the cache entry threshold to `maxlib'. If do_approxlib()
+   * or slow_approxlib() finds all the liberties (that is, they don't use
+   * `maxlib' value for an early return), they will set threshold to
+   * MAXLIBS themselves.
+   */
+  entry->threshold = maxlib;
+
+  if (maxlib <= MAX_LIBERTIES)
+    liberties = do_approxlib(pos, color, maxlib, libs);
+  else
+    liberties = slow_approxlib(pos, color, maxlib, libs);
+
+  entry->liberties = liberties;
+  entry->position_hash = board_hash;
+
+#else /* not USE_BOARD_CACHES */
+
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (!libs) {
+    liberties = fastlib(pos, color, 1);
+    if (liberties >= 0)
+      return liberties;
+  }
+
+  if (maxlib <= MAX_LIBERTIES)
+    liberties = do_approxlib(pos, color, maxlib, libs);
+  else
+    liberties = slow_approxlib(pos, color, maxlib, libs);
+
+#endif /* not USE_BOARD_CACHES */
+
+  return liberties;
+}
+
+
+/* Does the real work of approxlib(). */
+static int
+do_approxlib(int pos, int color, int maxlib, int *libs)
+{
+  int k;
+  int liberties = 0;
+
+  /* Look for empty neighbors and the liberties of the adjacent
+   * strings of the given color. The algorithm below won't work
+   * correctly if any of the adjacent strings have more than
+   * MAX_LIBERTIES liberties AND maxlib is larger than MAX_LIBERTIES.
+   * therefore approxlib() calls more robust slow_approxlib() if
+   * this might be the case.
+   */
+
+  /* Start by marking pos itself so it isn't counted among its own
+   * liberties.
+   */
+  liberty_mark++;
+  MARK_LIBERTY(pos);
+
+  if (UNMARKED_LIBERTY(SOUTH(pos))) {
+    if (libs != NULL)
+      libs[liberties] = SOUTH(pos);
+    liberties++;
+    /* Stop counting if we reach maxlib. */
+    if (liberties >= maxlib)
+      return liberties;
+    MARK_LIBERTY(SOUTH(pos));
+  }
+  else if (board[SOUTH(pos)] == color) {
+    int s = string_number[SOUTH(pos)];
+    for (k = 0; k < string[s].liberties; k++) {
+      int lib = string_libs[s].list[k];
+      if (UNMARKED_LIBERTY(lib)) {
+       if (libs != NULL)
+         libs[liberties] = lib;
+       liberties++;
+       if (liberties >= maxlib)
+         return liberties;
+       MARK_LIBERTY(lib);
+      }
+    }
+  }
+  
+  if (UNMARKED_LIBERTY(WEST(pos))) {
+    if (libs != NULL)
+      libs[liberties] = WEST(pos);
+    liberties++;
+    /* Stop counting if we reach maxlib. */
+    if (liberties >= maxlib)
+      return liberties;
+    MARK_LIBERTY(WEST(pos));
+  }
+  else if (board[WEST(pos)] == color) {
+    int s = string_number[WEST(pos)];
+    for (k = 0; k < string[s].liberties; k++) {
+      int lib = string_libs[s].list[k];
+      if (UNMARKED_LIBERTY(lib)) {
+       if (libs != NULL)
+         libs[liberties] = lib;
+       liberties++;
+       if (liberties >= maxlib)
+         return liberties;
+       MARK_LIBERTY(lib);
+      }
+    }
+  }
+  
+  if (UNMARKED_LIBERTY(NORTH(pos))) {
+    if (libs != NULL)
+      libs[liberties] = NORTH(pos);
+    liberties++;
+    /* Stop counting if we reach maxlib. */
+    if (liberties >= maxlib)
+      return liberties;
+    MARK_LIBERTY(NORTH(pos));
+  }
+  else if (board[NORTH(pos)] == color) {
+    int s = string_number[NORTH(pos)];
+    for (k = 0; k < string[s].liberties; k++) {
+      int lib = string_libs[s].list[k];
+      if (UNMARKED_LIBERTY(lib)) {
+       if (libs != NULL)
+         libs[liberties] = lib;
+       liberties++;
+       if (liberties >= maxlib)
+         return liberties;
+       MARK_LIBERTY(lib);
+      }
+    }
+  }
+  
+  if (UNMARKED_LIBERTY(EAST(pos))) {
+    if (libs != NULL)
+      libs[liberties] = EAST(pos);
+    liberties++;
+    /* Unneeded since we're about to leave. */
+#if 0
+    if (liberties >= maxlib)
+      return liberties;
+    MARK_LIBERTY(EAST(pos));
+#endif
+  }
+  else if (board[EAST(pos)] == color) {
+    int s = string_number[EAST(pos)];
+    for (k = 0; k < string[s].liberties; k++) {
+      int lib = string_libs[s].list[k];
+      if (UNMARKED_LIBERTY(lib)) {
+       if (libs != NULL)
+         libs[liberties] = lib;
+       liberties++;
+       if (liberties >= maxlib)
+         return liberties;
+       MARK_LIBERTY(lib);
+      }
+    }
+  }  
+
+#if USE_BOARD_CACHES
+  /* If we reach here, then we have counted _all_ the liberties, so
+   * we set threshold to MAXLIBS (the result is the same regardless
+   * of `maxlib' value).
+   */
+  if (!libs)
+    approxlib_cache[pos][color - 1].threshold = MAXLIBS;
+#endif
+  return liberties;
+}
+
+
+/* Find the liberties a move of the given color at pos would have,
+ * excluding possible captures, by traversing all adjacent friendly
+ * strings. This is a fallback used by approxlib() when a faster
+ * algorithm can't be used.
+ */
+static int
+slow_approxlib(int pos, int color, int maxlib, int *libs)
+{
+  int k;
+  int liberties = 0;
+
+  liberty_mark++;
+  MARK_LIBERTY(pos);
+  string_mark++;
+  for (k = 0; k < 4; k++) {
+    int d = delta[k];
+    if (UNMARKED_LIBERTY(pos + d)) {
+      if (libs)
+       libs[liberties] = pos + d;
+      liberties++;
+      if (liberties == maxlib)
+       return liberties;
+      MARK_LIBERTY(pos + d);
+    }
+    else if (board[pos + d] == color
+            && UNMARKED_STRING(pos + d)) {
+      int s = string_number[pos + d];
+      int pos2;
+      pos2 = FIRST_STONE(s);
+      do {
+       int l;
+       for (l = 0; l < 4; l++) {
+         int d2 = delta[l];
+         if (UNMARKED_LIBERTY(pos2 + d2)) {
+           if (libs)
+             libs[liberties] = pos2 + d2;
+           liberties++;
+           if (liberties == maxlib)
+             return liberties;
+           MARK_LIBERTY(pos2 + d2);
+         }
+       }
+
+       pos2 = NEXT_STONE(pos2);
+      } while (!BACK_TO_FIRST_STONE(s, pos2));
+      MARK_STRING(pos + d);
+    }
+  }
+
+#if USE_BOARD_CACHES
+  /* If we reach here, then we have counted _all_ the liberties, so
+   * we set threshold to MAXLIBS (the result is the same regardless
+   * of `maxlib' value).
+   */
+  if (!libs)
+    approxlib_cache[pos][color - 1].threshold = MAXLIBS;
+#endif
+  return liberties;
+}
+
+
+/* accuratelib() cache. */
+static struct board_cache_entry accuratelib_cache[BOARDMAX][2];
+
+
+/* Clears accuratelib() cache. This function should be called only once
+ * during engine initialization. Sets thresholds to zero.
+ */
+void
+clear_accuratelib_cache(void)
+{
+  int pos;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    accuratelib_cache[pos][0].threshold = 0;
+    accuratelib_cache[pos][1].threshold = 0;
+  }
+}
+
+
+/* Find the liberties a stone of the given color would get if played
+ * at (pos). This function takes into consideration all captures. Its
+ * return value is exact in that sense it counts all the liberties,
+ * unless (maxlib) allows it to stop earlier. (pos) must be empty. If
+ * libs != NULL, the locations of up to maxlib liberties are written
+ * into libs[]. The counting of liberties may or may not be halted
+ * when maxlib is reached. The number of found liberties is returned.
+ *
+ * This function guarantees that liberties which are not results of
+ * captures come first in libs[] array. To find whether all the 
+ * liberties starting from a given one are results of captures, one
+ * may use  if (board[libs[k]] != EMPTY)  construction.
+ *
+ * If you want the number or the locations of all liberties, however
+ * many they are, you should pass MAXLIBS as the value for maxlib and
+ * allocate space for libs[] accordingly.
+ */
+int
+accuratelib(int pos, int color, int maxlib, int *libs)
+{
+  int liberties;
+
+#ifdef USE_BOARD_CACHES
+
+  struct board_cache_entry *entry = &accuratelib_cache[pos][color - 1];
+
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (!libs) {
+    /* First see if this result is cached. */
+    if (hashdata_is_equal(board_hash, entry->position_hash)
+       && maxlib <= entry->threshold) {
+      return entry->liberties;
+    }
+
+    liberties = fastlib(pos, color, 0);
+    if (liberties >= 0) {
+      /* Since fastlib() always returns precise result and doesn't take
+       * `maxlib' into account, we set threshold to MAXLIBS so that this
+       * result is used regardless of any `maxlib' passed.
+       */
+      entry->threshold = MAXLIBS;
+      entry->liberties = liberties;
+      entry->position_hash = board_hash;
+
+      return liberties;
+    }
+  }
+
+  liberties = do_accuratelib(pos, color, maxlib, libs);
+
+  /* If accuratelib() found less than `maxlib' liberties, then its
+   * result is certainly independent of `maxlib' and we set threshold
+   * to MAXLIBS.
+   */
+  entry->threshold = liberties < maxlib ? MAXLIBS : maxlib;
+  entry->liberties = liberties;
+  entry->position_hash = board_hash;
+
+#else /* not USE_BOARD_CACHES */
+
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (!libs) {
+    liberties = fastlib(pos, color, 0);
+    if (liberties >= 0)
+      return liberties;
+  }
+
+  liberties = do_accuratelib(pos, color, maxlib, libs);
+
+#endif /* not USE_BOARD_CACHES */
+
+  return liberties;
+}
+
+
+/* Does the real work of accuratelib(). */
+static int
+do_accuratelib(int pos, int color, int maxlib, int *libs)
+{
+  int k, l;
+  int liberties = 0;
+  int lib;
+  int captured[4];
+  int captures = 0;
+
+  string_mark++;
+  liberty_mark++;
+  MARK_LIBERTY(pos);
+
+  for (k = 0; k < 4; k++) {
+    int pos2 = pos + delta[k];
+    if (UNMARKED_LIBERTY(pos2)) {
+      /* A trivial liberty */
+      if (libs)
+       libs[liberties] = pos2;
+      liberties++;
+      if (liberties >= maxlib)
+       return liberties;
+
+      MARK_LIBERTY(pos2);
+    }
+    else if (UNMARKED_COLOR_STRING(pos2, color)) {
+      /* An own neighbor string */
+      struct string_data *s = &string[string_number[pos2]];
+      struct string_liberties_data *sl = &string_libs[string_number[pos2]];
+
+      if (s->liberties <= MAX_LIBERTIES || maxlib <= MAX_LIBERTIES - 1) {
+       /* The easy case - we already have all (necessary) liberties of
+        * the string listed
+        */
+       for (l = 0; l < s->liberties; l++) {
+         lib = sl->list[l];
+         if (UNMARKED_LIBERTY(lib)) {
+           if (libs)
+             libs[liberties] = lib;
+           liberties++;
+           if (liberties >= maxlib)
+             return liberties;
+
+           MARK_LIBERTY(lib);
+         }
+       }
+      }
+      else {
+       /* The harder case - we need to find all the liberties of the
+        * string by traversing its stones. We stop as soon as we have
+        * traversed all the stones or have reached maxlib. Unfortunately,
+        * we cannot use the trick from findlib() since some of the
+        * liberties may already have been marked.
+        */
+       int stone = pos2;
+       do {
+         if (UNMARKED_LIBERTY(SOUTH(stone))) {
+           if (libs)
+             libs[liberties] = SOUTH(stone);
+           liberties++;
+           if (liberties >= maxlib)
+             return liberties;
+
+           MARK_LIBERTY(SOUTH(stone));
+         }
+
+         if (UNMARKED_LIBERTY(WEST(stone))) {
+           if (libs)
+             libs[liberties] = WEST(stone);
+           liberties++;
+           if (liberties >= maxlib)
+             return liberties;
+
+           MARK_LIBERTY(WEST(stone));
+         }
+
+         if (UNMARKED_LIBERTY(NORTH(stone))) {
+           if (libs)
+             libs[liberties] = NORTH(stone);
+           liberties++;
+           if (liberties >= maxlib)
+             return liberties;
+
+           MARK_LIBERTY(NORTH(stone));
+         }
+
+         if (UNMARKED_LIBERTY(EAST(stone))) {
+           if (libs)
+             libs[liberties] = EAST(stone);
+           liberties++;
+           if (liberties >= maxlib)
+             return liberties;
+
+           MARK_LIBERTY(EAST(stone));
+         }
+
+         stone = NEXT_STONE(stone);
+       } while (stone != pos2);
+      }
+
+      MARK_STRING(pos2);
+    }
+    else if (board[pos2] == OTHER_COLOR(color)
+            && string[string_number[pos2]].liberties == 1) {
+      /* A capture. */
+      captured[captures++] = pos2;
+    }
+  }
+
+  /* Now we look at all the captures found in the previous step */
+  for (k = 0; k < captures; k++) {
+    lib = captured[k];
+
+    /* Add the stone adjacent to (pos) to the list of liberties if
+     * it is not also adjacent to an own marked string (otherwise,
+     * it will be added later).
+     */
+    if (!MARKED_COLOR_STRING(SOUTH(lib), color)
+       && !MARKED_COLOR_STRING(WEST(lib), color)
+       && !MARKED_COLOR_STRING(NORTH(lib), color)
+       && !MARKED_COLOR_STRING(EAST(lib), color)) {
+      if (libs)
+       libs[liberties] = lib;
+      liberties++;
+      if (liberties >= maxlib)
+       return liberties;
+    }
+
+    /* Check if we already know of this capture. */
+    for (l = 0; l < k; l++)
+      if (string_number[captured[l]] == string_number[lib])
+       break;
+
+    if (l == k) {
+      /* Traverse all the stones of the capture and add to the list
+       * of liberties those, which are adjacent to at least one own
+       * marked string.
+       */
+      do {
+       if (MARKED_COLOR_STRING(SOUTH(lib), color)
+           || MARKED_COLOR_STRING(WEST(lib), color)
+           || MARKED_COLOR_STRING(NORTH(lib), color)
+           || MARKED_COLOR_STRING(EAST(lib), color)) {
+         if (libs)
+           libs[liberties] = lib;
+         liberties++;
+         if (liberties >= maxlib)
+           return liberties;
+       }
+
+       lib = NEXT_STONE(lib);
+      } while (lib != captured[k]);
+    }
+  }
+
+  return liberties;
+}
+
+
+/* Find the number of common liberties of the two strings at str1 and str2.
+ */
+
+int
+count_common_libs(int str1, int str2)
+{
+  int all_libs1[MAXLIBS], *libs1;
+  int liberties1, liberties2;
+  int commonlibs = 0;
+  int k, n, tmp;
+  
+  ASSERT_ON_BOARD1(str1);
+  ASSERT_ON_BOARD1(str2);
+  ASSERT1(IS_STONE(board[str1]), str1);
+  ASSERT1(IS_STONE(board[str2]), str2);
+  
+  n = string_number[str1];
+  liberties1 = string[n].liberties;
+  
+  if (liberties1 > string[string_number[str2]].liberties) {
+    n = string_number[str2];
+    liberties1 = string[n].liberties;
+    tmp = str1;
+    str1 = str2;
+    str2 = tmp;
+  }
+
+  if (liberties1 <= MAX_LIBERTIES) {
+    /* Speed optimization: don't copy liberties with findlib */
+    libs1 = string_libs[n].list;
+    n = string_number[str2];
+    liberties2 = string[n].liberties;
+    
+    if (liberties2 <= MAX_LIBERTIES) {
+      /* Speed optimization: NEIGHBOR_OF_STRING is quite expensive */
+      liberty_mark++;
+      
+      for (k = 0; k < liberties1; k++)
+       MARK_LIBERTY(libs1[k]);
+
+      libs1 = string_libs[n].list;
+      for (k = 0; k < liberties2; k++)
+       if (!UNMARKED_LIBERTY(libs1[k]))
+         commonlibs++;
+
+      return commonlibs;
+    }
+  }
+  else {
+    findlib(str1, MAXLIBS, all_libs1);
+    libs1 = all_libs1;
+  }
+  
+  for (k = 0; k < liberties1; k++)
+    if (NEIGHBOR_OF_STRING(libs1[k], string_number[str2], board[str2]))
+      commonlibs++;
+  
+  return commonlibs;
+}
+
+
+/* Find the common liberties of the two strings at str1 and str2. The
+ * locations of up to maxlib common liberties are written into libs[].
+ * The full number of common liberties is returned.
+ *
+ * If you want the locations of all common liberties, whatever their
+ * number, you should pass MAXLIBS as the value for maxlib and
+ * allocate space for libs[] accordingly.
+ */
+
+int
+find_common_libs(int str1, int str2, int maxlib, int *libs)
+{
+  int all_libs1[MAXLIBS], *libs1;
+  int liberties1, liberties2;
+  int commonlibs = 0;
+  int k, n, tmp;
+  
+  ASSERT_ON_BOARD1(str1);
+  ASSERT_ON_BOARD1(str2);
+  ASSERT1(IS_STONE(board[str1]), str1);
+  ASSERT1(IS_STONE(board[str2]), str2);
+  ASSERT1(libs != NULL, str1);
+  
+  n = string_number[str1];
+  liberties1 = string[n].liberties;
+  
+  if (liberties1 > string[string_number[str2]].liberties) {
+    n = string_number[str2];
+    liberties1 = string[n].liberties;
+    tmp = str1;
+    str1 = str2;
+    str2 = tmp;
+  }
+  
+  if (liberties1 <= MAX_LIBERTIES) {
+    /* Speed optimization: don't copy liberties with findlib */
+    libs1 = string_libs[n].list;
+    n = string_number[str2];
+    liberties2 = string[n].liberties;
+
+    if (liberties2 <= MAX_LIBERTIES) {
+      /* Speed optimization: NEIGHBOR_OF_STRING is quite expensive */
+      liberty_mark++;
+
+      for (k = 0; k < liberties1; k++)
+       MARK_LIBERTY(libs1[k]);
+      
+      libs1 = string_libs[n].list;
+      for (k = 0; k < liberties2; k++)
+       if (!UNMARKED_LIBERTY(libs1[k])) {
+          if (commonlibs < maxlib)
+           libs[commonlibs] = libs1[k];
+         commonlibs++;
+       }
+      
+      return commonlibs;
+    }
+  }
+  else {
+    findlib(str1, MAXLIBS, all_libs1);
+    libs1 = all_libs1;
+  }
+  
+  for (k = 0; k < liberties1; k++)
+    if (NEIGHBOR_OF_STRING(libs1[k], string_number[str2], board[str2])) {
+      if (commonlibs < maxlib)
+       libs[commonlibs] = libs1[k];
+      commonlibs++;
+    }
+  
+  return commonlibs;
+}
+
+
+/* Determine whether two strings have at least one common liberty.
+ * If they do and lib != NULL, one common liberty is returned in *lib.
+ */
+int
+have_common_lib(int str1, int str2, int *lib)
+{
+  int all_libs1[MAXLIBS], *libs1;
+  int liberties1;
+  int k, n, tmp;
+  
+  ASSERT_ON_BOARD1(str1);
+  ASSERT_ON_BOARD1(str2);
+  ASSERT1(IS_STONE(board[str1]), str1);
+  ASSERT1(IS_STONE(board[str2]), str2);
+  
+  n = string_number[str1];
+  liberties1 = string[n].liberties;
+  
+  if (liberties1 > string[string_number[str2]].liberties) {
+    n = string_number[str2];
+    liberties1 = string[n].liberties;
+    tmp = str1;
+    str1 = str2;
+    str2 = tmp;
+  }
+  
+  if (liberties1 <= MAX_LIBERTIES)
+    /* Speed optimization: don't copy liberties with findlib */
+    libs1 = string_libs[n].list;
+  else {
+    findlib(str1, MAXLIBS, all_libs1);
+    libs1 = all_libs1;
+  }
+
+  for (k = 0; k < liberties1; k++) {
+    if (NEIGHBOR_OF_STRING(libs1[k], string_number[str2], board[str2])) {
+      if (lib)
+       *lib = libs1[k];
+      return 1;
+    }
+  }
+  
+  return 0;
+}
+
+
+
+/*
+ * Report the number of stones in a string.
+ */
+
+int
+countstones(int str)
+{
+  ASSERT_ON_BOARD1(str);
+  ASSERT1(IS_STONE(board[str]), str);
+
+  return COUNTSTONES(str);
+}
+
+
+/* Find the stones of the string at str. str must not be
+ * empty. The locations of up to maxstones stones are written into
+ * stones[]. The full number of stones is returned.
+ */
+
+int
+findstones(int str, int maxstones, int *stones)
+{
+  int s;
+  int size;
+  int pos;
+  int k;
+  
+  ASSERT_ON_BOARD1(str);
+  ASSERT1(IS_STONE(board[str]), str);
+
+  s = string_number[str];
+  size = string[s].size;
+  
+  /* Traverse the stones of the string, by following the cyclic chain. */
+  pos = FIRST_STONE(s);
+  for (k = 0; k < maxstones && k < size; k++) {
+    stones[k] = pos;
+    pos = NEXT_STONE(pos);
+  }
+
+  return size;
+}
+
+
+/* Counts how many stones in str1 are directly adjacent to str2.
+ * A limit can be given in the maxstones parameter so that the
+ * function returns immediately. See fast_defense() in reading.c
+ */
+
+int
+count_adjacent_stones(int str1, int str2, int maxstones)
+{
+  int s1, s2;
+  int size;
+  int pos;
+  int k;
+  int count = 0;
+
+  ASSERT_ON_BOARD1(str1);
+  ASSERT1(IS_STONE(board[str1]), str1);
+  ASSERT_ON_BOARD1(str2);
+  ASSERT1(IS_STONE(board[str2]), str2);
+
+  s1 = string_number[str1];
+  s2 = string_number[str2];
+  size = string[s1].size;
+
+  /* Traverse the stones of the string, by following the cyclic chain. */
+  pos = FIRST_STONE(s1);
+  for (k = 0; k < size && count < maxstones; k++) {
+    if (NEIGHBOR_OF_STRING(pos, s2, board[str2]))
+      count++;
+    pos = NEXT_STONE(pos);
+  }
+
+  return count;
+}
+
+
+/* chainlinks returns (in the (adj) array) the chains surrounding
+ * the string at (str). The number of chains is returned.
+ */
+
+int 
+chainlinks(int str, int adj[MAXCHAIN])
+{
+  struct string_data *s;
+  struct string_neighbors_data *sn;
+  int k;
+
+  ASSERT1(IS_STONE(board[str]), str);
+
+  /* We already have the list ready, just copy it and fill in the
+   * desired information.
+   */
+  s = &string[string_number[str]];
+  sn = &string_neighbors[string_number[str]];
+  for (k = 0; k < s->neighbors; k++)
+    adj[k] = string[sn->list[k]].origin;
+
+  return s->neighbors;
+}
+
+
+/* chainlinks2 returns (in adj array) those chains surrounding
+ * the string at str which have exactly lib liberties. The number
+ * of such chains is returned.
+ */
+
+int
+chainlinks2(int str, int adj[MAXCHAIN], int lib)
+{
+  struct string_data *s, *t;
+  struct string_neighbors_data *sn;
+  int k;
+  int neighbors;
+
+  ASSERT1(IS_STONE(board[str]), str);
+
+  /* We already have the list ready, just copy the strings with the
+   * right number of liberties.
+   */
+  neighbors = 0;
+  s = &string[string_number[str]];
+  sn = &string_neighbors[string_number[str]];
+  for (k = 0; k < s->neighbors; k++) {
+    t = &string[sn->list[k]];
+    if (t->liberties == lib)
+      adj[neighbors++] = t->origin;
+  }
+  return neighbors;
+}
+
+
+/* chainlinks3 returns (in adj array) those chains surrounding
+ * the string at str, which have less or equal lib liberties.
+ * The number of such chains is returned.
+ */
+
+int
+chainlinks3(int str, int adj[MAXCHAIN], int lib)
+{
+  struct string_data *s, *t;
+  struct string_neighbors_data *sn;
+  int k;
+  int neighbors;
+
+  ASSERT1(IS_STONE(board[str]), str);
+
+  /* We already have the list ready, just copy the strings with the
+   * right number of liberties.
+   */
+  neighbors = 0;
+  s = &string[string_number[str]];
+  sn = &string_neighbors[string_number[str]];
+  for (k = 0; k < s->neighbors; k++) {
+    t = &string[sn->list[k]];
+    if (t->liberties <= lib)
+      adj[neighbors++] = t->origin;
+  }
+  return neighbors;
+}
+
+
+/* extended_chainlinks() returns (in the (adj) array) the opponent
+ * strings being directly adjacent to (str) or having a common liberty
+ * with (str). The number of such strings is returned.
+ *
+ * If the both_colors parameter is true, also own strings sharing a
+ * liberty are returned.
+ */
+
+int 
+extended_chainlinks(int str, int adj[MAXCHAIN], int both_colors)
+{
+  struct string_data *s;
+  struct string_neighbors_data *sn;
+  int n;
+  int k;
+  int r;
+  int libs[MAXLIBS];
+  int liberties;
+
+  ASSERT1(IS_STONE(board[str]), str);
+
+  /* We already have the list of directly adjacent strings ready, just
+   * copy it and mark the strings.
+   */
+  s = &string[string_number[str]];
+  sn = &string_neighbors[string_number[str]];
+  string_mark++;
+  for (n = 0; n < s->neighbors; n++) {
+    adj[n] = string[sn->list[n]].origin;
+    MARK_STRING(adj[n]);
+  }
+
+  /* Get the liberties. */
+  liberties = findlib(str, MAXLIBS, libs);
+
+  /* Look for unmarked opponent strings next to a liberty and add the
+   * ones which are found to the output.
+   */
+  for (r = 0; r < liberties; r++) {
+    for (k = 0; k < 4; k++) {
+      if ((board[libs[r] + delta[k]] == OTHER_COLOR(board[str])
+          || (both_colors && board[libs[r] + delta[k]] == board[str]))
+         && UNMARKED_STRING(libs[r] + delta[k])) {
+       adj[n] = string[string_number[libs[r] + delta[k]]].origin;
+       MARK_STRING(adj[n]);
+       n++;
+      }
+    }
+  }
+  
+  return n;
+}
+
+
+/* Returns true if a move by (color) fits a shape like:
+ *
+ *  -----
+ *  O.O*X        (O=color)
+ *  OOXXX
+ *
+ * More specifically the move should have the following properties:
+ * - The move is a self-atari
+ * - The move forms a string of exactly two stones
+ * - When the opponent captures, the capturing stone becomes a single
+ *   stone in atari
+ * - When capturing back the original position is repeated
+ */
+
+int
+send_two_return_one(int move, int color)
+{
+  int other = OTHER_COLOR(color);
+  int lib = NO_MOVE;
+  int friendly_neighbor = NO_MOVE;
+  int k;
+  
+  ASSERT1(board[move] == EMPTY, move);
+
+  for (k = 0; k < 4; k++) {
+    int pos = move + delta[k];
+    if (board[pos] == EMPTY)
+      return 0;
+    if (board[pos] == color) {
+      int s;
+      if (friendly_neighbor != NO_MOVE)
+       return 0;
+      friendly_neighbor = pos;
+      s = string_number[pos];
+      if (string[s].size != 1 || string[s].liberties != 2)
+       return 0;
+      lib = string_libs[s].list[0] + string_libs[s].list[1] - move;
+    }
+    else if (board[pos] == other
+            && string[string_number[pos]].liberties == 1)
+      return 0;
+  }
+  
+  if (friendly_neighbor == NO_MOVE)
+    return 0;
+
+  for (k = 0; k < 4; k++) {
+    int pos = lib + delta[k];
+    if (board[pos] == EMPTY || board[pos] == other)
+      return 0;
+    if (board[pos] == color &&
+       string[string_number[pos]].liberties < 2)
+      return 0;
+  }
+  
+  return 1;
+}
+
+
+/*
+ * Find the origin of a worm, i.e. the point with the
+ * smallest 1D board coordinate. The idea is to have a canonical
+ * reference point for a string.
+ */
+
+int
+find_origin(int str)
+{
+  ASSERT1(IS_STONE(board[str]), str);
+
+  return string[string_number[str]].origin;
+}
+
+
+/* Determine whether a move by color at (pos) would be a self atari,
+ * i.e. whether it would get more than one liberty. This function
+ * returns true also for the case of a suicide move.
+ */
+
+int
+is_self_atari(int pos, int color)
+{
+  int other = OTHER_COLOR(color);
+  /* number of empty neighbors */
+  int trivial_liberties = 0;
+  /* number of captured opponent strings */
+  int captures = 0;
+  /* Whether there is a friendly neighbor with a spare liberty. If it
+   * has more than one spare liberty we immediately return 0.
+   */
+  int far_liberties = 0;
+  
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  /* 1. Try first to solve the problem without much work. */
+  string_mark++;
+  
+  if (LIBERTY(SOUTH(pos)))
+    trivial_liberties++;
+  else if (board[SOUTH(pos)] == color) {
+    if (LIBERTIES(SOUTH(pos)) > 2)
+      return 0;
+    if (LIBERTIES(SOUTH(pos)) == 2)
+      far_liberties++;
+  }
+  else if (board[SOUTH(pos)] == other
+          && LIBERTIES(SOUTH(pos)) == 1 && UNMARKED_STRING(SOUTH(pos))) {
+    captures++;
+    MARK_STRING(SOUTH(pos));
+  }
+
+  if (LIBERTY(WEST(pos)))
+    trivial_liberties++;
+  else if (board[WEST(pos)] == color) {
+    if (LIBERTIES(WEST(pos)) > 2)
+      return 0;
+    if (LIBERTIES(WEST(pos)) == 2)
+      far_liberties++;
+  }
+  else if (board[WEST(pos)] == other
+          && LIBERTIES(WEST(pos)) == 1 && UNMARKED_STRING(WEST(pos))) {
+    captures++;
+    MARK_STRING(WEST(pos));
+  }
+
+  if (LIBERTY(NORTH(pos)))
+    trivial_liberties++;
+  else if (board[NORTH(pos)] == color) {
+    if (LIBERTIES(NORTH(pos)) > 2)
+      return 0;
+    if (LIBERTIES(NORTH(pos)) == 2)
+      far_liberties++;
+  }
+  else if (board[NORTH(pos)] == other
+          && LIBERTIES(NORTH(pos)) == 1 && UNMARKED_STRING(NORTH(pos))) {
+    captures++;
+    MARK_STRING(NORTH(pos));
+  }
+
+  if (LIBERTY(EAST(pos)))
+    trivial_liberties++;
+  else if (board[EAST(pos)] == color) {
+    if (LIBERTIES(EAST(pos)) > 2)
+      return 0;
+    if (LIBERTIES(EAST(pos)) == 2)
+      far_liberties++;
+  }
+  else if (board[EAST(pos)] == other
+          && LIBERTIES(EAST(pos)) == 1 && UNMARKED_STRING(EAST(pos))) {
+    captures++;
+#if 0
+    MARK_STRING(EAST(pos));
+#endif
+  }
+
+  /* Each captured string is guaranteed to produce at least one
+   * liberty. These are disjoint from both trivial liberties and far
+   * liberties. The two latter may however coincide.
+   */
+  if (trivial_liberties + captures >= 2)
+    return 0;
+
+  if ((far_liberties > 0) + captures >= 2)
+    return 0;
+
+  if (captures == 0 && far_liberties + trivial_liberties <= 1)
+    return 1;
+
+  /* 2. It was not so easy.  We use accuratelib() in this case. */
+  return accuratelib(pos, color, 2, NULL) <= 1;
+}
+
+
+/*
+ * Returns true if pos is a liberty of the string at str.
+ */
+
+int
+liberty_of_string(int pos, int str)
+{
+  ASSERT_ON_BOARD1(pos);
+  ASSERT_ON_BOARD1(str);
+  if (IS_STONE(board[pos]))
+    return 0;
+
+  return NEIGHBOR_OF_STRING(pos, string_number[str], board[str]);
+}
+
+
+/*
+ * Returns true if pos is a second order liberty of the string at str.
+ */
+int
+second_order_liberty_of_string(int pos, int str)
+{
+  int k;
+  ASSERT_ON_BOARD1(pos);
+  ASSERT_ON_BOARD1(str);
+
+  for (k = 0; k < 4; k++)
+    if (board[pos + delta[k]] == EMPTY
+       && NEIGHBOR_OF_STRING(pos + delta[k], string_number[str], board[str]))
+      return 1;
+
+  return 0;
+}
+
+
+/*
+ * Returns true if pos is adjacent to the string at str.
+ */
+
+int
+neighbor_of_string(int pos, int str)
+{
+  int color = board[str];
+
+  ASSERT1(IS_STONE(color), str);
+  ASSERT_ON_BOARD1(pos);
+
+  return NEIGHBOR_OF_STRING(pos, string_number[str], color);
+}
+
+/*
+ * Returns true if (pos) has a neighbor of color (color).
+ */
+
+int
+has_neighbor(int pos, int color)
+{
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  return (board[SOUTH(pos)] == color
+          || board[WEST(pos)] == color
+          || board[NORTH(pos)] == color
+          || board[EAST(pos)] == color);
+}
+
+/*
+ * Returns true if str1 and str2 belong to the same string.
+ */
+
+int
+same_string(int str1, int str2)
+{
+  ASSERT_ON_BOARD1(str1);
+  ASSERT_ON_BOARD1(str2);
+  ASSERT1(IS_STONE(board[str1]), str1);
+  ASSERT1(IS_STONE(board[str2]), str2);
+
+  return string_number[str1] == string_number[str2];
+}
+
+
+/*
+ * Returns true if the strings at str1 and str2 are adjacent.
+ */
+
+int
+adjacent_strings(int str1, int str2)
+{
+  int s1, s2;
+  int k;
+  
+  ASSERT_ON_BOARD1(str1);
+  ASSERT_ON_BOARD1(str2);
+  ASSERT1(IS_STONE(board[str1]), str1);
+  ASSERT1(IS_STONE(board[str2]), str2);
+
+  s1 = string_number[str1];
+  s2 = string_number[str2];
+
+  for (k = 0; k < string[s1].neighbors; k++)
+    if (string_neighbors[s1].list[k] == s2)
+      return 1;
+
+  return 0;
+}
+
+
+/*
+ * Return true if the move (pos) by (color) is a ko capture
+ * (whether capture is legal on this move or not). If so,
+ * and if ko_pos is not a NULL pointer, then
+ * *ko_pos returns the location of the captured ko stone.
+ * If the move is not a ko capture, *ko_pos is set to 0.
+ *
+ * A move is a ko capture if and only if
+ *    1. All neighbors are opponent stones.
+ *    2. The number of captured stones is exactly one.
+ */
+
+int
+is_ko(int pos, int color, int *ko_pos)
+{
+  int other = OTHER_COLOR(color);
+  int captures = 0;
+  int kpos = 0;
+  
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(color == WHITE || color == BLACK, pos);
+
+  if (ON_BOARD(SOUTH(pos))) {
+    if (board[SOUTH(pos)] != other)
+      return 0;
+    else if (LIBERTIES(SOUTH(pos)) == 1) {
+      kpos = SOUTH(pos);
+      captures += string[string_number[SOUTH(pos)]].size;
+      if (captures > 1)
+       return 0;
+    }
+  }
+  
+  if (ON_BOARD(WEST(pos))) {
+    if (board[WEST(pos)] != other)
+      return 0;
+    else if (LIBERTIES(WEST(pos)) == 1) {
+      kpos = WEST(pos);
+      captures += string[string_number[WEST(pos)]].size;
+      if (captures > 1)
+       return 0;
+    }
+  }
+  
+  if (ON_BOARD(NORTH(pos))) {
+    if (board[NORTH(pos)] != other)
+      return 0;
+    else if (LIBERTIES(NORTH(pos)) == 1) {
+      kpos = NORTH(pos);
+      captures += string[string_number[NORTH(pos)]].size;
+      if (captures > 1)
+       return 0;
+    }
+  }
+  
+  if (ON_BOARD(EAST(pos))) {
+    if (board[EAST(pos)] != other)
+      return 0;
+    else if (LIBERTIES(EAST(pos)) == 1) {
+      kpos = EAST(pos);
+      captures += string[string_number[EAST(pos)]].size;
+      if (captures > 1)
+       return 0;
+    }
+  }
+  
+  if (captures == 1) {
+    if (ko_pos)
+      *ko_pos = kpos;
+    return 1;
+  }
+  return 0;
+}
+
+
+/* Return true if pos is either a stone, which if captured would give
+ * ko, or if pos is an empty intersection adjacent to a ko stone.
+ */
+int
+is_ko_point(int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+
+  if (board[pos] == EMPTY) {
+    int color;
+    if (ON_BOARD(SOUTH(pos)))
+      color = board[SOUTH(pos)];
+    else
+      color = board[NORTH(pos)];
+    if (IS_STONE(color) && is_ko(pos, OTHER_COLOR(color), NULL))
+      return 1;
+  }
+  else {
+    struct string_data *s = &string[string_number[pos]];
+    struct string_liberties_data *sl = &string_libs[string_number[pos]];
+    if (s->liberties == 1 && s->size == 1
+       && is_ko(sl->list[0], OTHER_COLOR(s->color), NULL))
+      return 1;
+  }
+
+  return 0;
+}
+
+
+/* Return true if a move by color at pos is a superko violation
+ * according to the specified type of ko rules. This function does not
+ * detect simple ko unless it's also a superko violation.
+ *
+ * The superko detection is done by comparing board hashes from
+ * previous positions. For this to work correctly it's necessary to
+ * remove the contribution to the hash from the simple ko position.
+ * The move_history_hash array contains board hashes for previous
+ * positions, also without simple ko position contributions.
+ */
+static int
+is_superko_violation(int pos, int color, enum ko_rules type)
+{
+  Hash_data this_board_hash = board_hash;
+  Hash_data new_board_hash;
+  int k;
+
+  /* No superko violations if the ko rule is not a superko rule. */
+  if (type == NONE || type == SIMPLE)
+    return 0;
+
+  if (board_ko_pos != NO_MOVE)
+    hashdata_invert_ko(&this_board_hash, board_ko_pos);
+
+  really_do_trymove(pos, color);
+  new_board_hash = board_hash;
+  if (board_ko_pos != NO_MOVE)
+    hashdata_invert_ko(&new_board_hash, board_ko_pos);
+  undo_trymove();
+
+  /* The current position is only a problem with positional superko
+   * and a single stone suicide.
+   */
+  if (type == PSK && hashdata_is_equal(this_board_hash, new_board_hash))
+    return 1;
+
+  for (k = move_history_pointer - 1; k >= 0; k--)
+    if (hashdata_is_equal(move_history_hash[k], new_board_hash)
+       && (type == PSK
+           || move_history_color[k] == OTHER_COLOR(color)))
+      return 1;
+
+  return 0;
+}
+
+/* Returns 1 if at least one string is captured when color plays at pos.
+ */
+int
+does_capture_something(int pos, int color)
+{
+  int other = OTHER_COLOR(color);
+
+  ASSERT1(board[pos] == EMPTY, pos);
+
+  if (board[SOUTH(pos)] == other && LIBERTIES(SOUTH(pos)) == 1)
+    return 1;
+  
+  if (board[WEST(pos)] == other && LIBERTIES(WEST(pos)) == 1)
+    return 1;
+  
+  if (board[NORTH(pos)] == other && LIBERTIES(NORTH(pos)) == 1)
+    return 1;
+  
+  if (board[EAST(pos)] == other && LIBERTIES(EAST(pos)) == 1)
+    return 1;
+
+  return 0;
+}
+
+
+/* For each stone in the string at pos, set mx to value mark. */
+void
+mark_string(int str, signed char mx[BOARDMAX], signed char mark)
+{
+  int pos = str;
+
+  ASSERT1(IS_STONE(board[str]), str);
+
+  do {
+    mx[pos] = mark;
+    pos = NEXT_STONE(pos);
+  } while (pos != str);
+}
+
+
+/* Returns true if at least one move has been played at pos
+ * at deeper than level 'cutoff' in the reading tree.
+ */
+int
+move_in_stack(int pos, int cutoff)
+{
+  int k;
+  for (k = cutoff; k < stackp; k++)
+    if (stack[k] == pos)
+      return 1;
+  
+  return 0;
+}
+
+
+/* Retrieve a move from the move stack. */
+void
+get_move_from_stack(int k, int *move, int *color)
+{
+  gg_assert(k < stackp);
+  *move = stack[k];
+  *color = move_color[k];
+}
+
+/* Return the number of stones of the indicated color(s) on the board.
+ * This only counts stones in the permanent position, not stones placed
+ * by trymove() or tryko(). Use stones_on_board(BLACK | WHITE) to get
+ * the total number of stones on the board.
+ *
+ * FIXME: This seems wrong, it uses the modified board, not the permanent
+ * one. /ab
+ */
+int
+stones_on_board(int color)
+{
+  static int stone_count_for_position = -1;
+  static int white_stones = 0;
+  static int black_stones = 0;
+
+  gg_assert(stackp == 0);
+
+  if (stone_count_for_position != position_number) {
+    int pos;
+    white_stones = 0;
+    black_stones = 0;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (board[pos] == WHITE)
+       white_stones++;
+      else if (board[pos] == BLACK)
+       black_stones++;
+    }
+    
+    stone_count_for_position = position_number;
+  }
+
+  return ((color & BLACK ? black_stones : 0) +
+         (color & WHITE ? white_stones : 0));
+}
+
+
+/* ===================== Statistics  ============================= */
+
+
+/* Clear statistics. */
+void
+reset_trymove_counter()
+{
+  trymove_counter = 0;
+}
+
+
+/* Retrieve statistics. */
+int
+get_trymove_counter()
+{
+  return trymove_counter;
+}
+
+
+/* ================================================================ */
+/*                      Lower level functions                       */
+/* ================================================================ */
+
+
+/* This function should be called if the board is modified by other
+ * means than do_play_move() or undo_trymove().
+ *
+ * We have reached a new position. Increase the position counter and
+ * re-initialize the incremental strings.
+ *
+ * Set up incremental board structures and populate them with the
+ * strings available in the position given by board[]. Clear the stacks
+ * and start the mark numbers from zero. All undo information is lost
+ * by calling this function.
+ */
+
+static void
+new_position(void)
+{
+  int pos;
+  int s;
+
+  position_number++;
+  next_string = 0;
+  liberty_mark = 0;
+  string_mark = 0;
+  CLEAR_STACKS();
+
+  memset(string, 0, sizeof(string));
+  memset(string_libs, 0, sizeof(string_libs));
+  memset(string_neighbors, 0, sizeof(string_neighbors));
+  memset(ml, 0, sizeof(ml));
+  VALGRIND_MAKE_WRITABLE(next_stone, sizeof(next_stone));
+
+  /* propagate_string relies on non-assigned stones to have
+   * string_number -1.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      string_number[pos] = -1;
+
+  /* Find the existing strings. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (IS_STONE(board[pos]) && string_number[pos] == -1) {
+      string_number[pos] = next_string;
+      string[next_string].size = propagate_string(pos, pos);
+      string[next_string].color = board[pos];
+      string[next_string].origin = pos;
+      string[next_string].mark = 0;
+      next_string++;
+      PARANOID1(next_string < MAX_STRINGS, pos);
+    }
+  }
+  
+  /* Fill in liberty and neighbor info. */
+  for (s = 0; s < next_string; s++) {
+    find_liberties_and_neighbors(s);
+  }
+}
+
+
+#if 0
+
+/*
+ * Debug function. Dump all string information.
+ */
+
+static void
+dump_incremental_board(void)
+{
+  int pos;
+  int s;
+  int i;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (board[pos] == EMPTY)
+      fprintf(stderr, " . ");
+    else
+      fprintf(stderr, "%2d ", string_number[pos]);
+    fprintf(stderr, "\n");
+  }
+
+  for (s = 0; s < next_string; s++) {
+    if (board[string[s].origin] == EMPTY)
+      continue;
+    
+    gprintf("%o%d %s %1m size %d, %d liberties, %d neighbors\n", s,
+           color_to_string(string[s].color),
+           string[s].origin, string[s].size,
+           string[s].liberties, string[s].neighbors);
+    gprintf("%ostones:");
+
+    pos = FIRST_STONE(s);
+    do {
+      gprintf("%o %1m", pos);
+      pos = NEXT_STONE(pos);
+    } while (!BACK_TO_FIRST_STONE(s, pos));
+    
+    gprintf("%o\nliberties:");
+    for (i = 0; i < string[s].liberties; i++)
+      gprintf("%o %1m", string[s].libs[i]);
+    
+    gprintf("%o\nneighbors:");
+    for (i = 0; i < string[s].neighbors; i++)
+      gprintf("%o %d(%1m)", string[s].neighborlist[i],
+             string[string[s].neighborlist[i]].origin);
+    gprintf("%o\n\n");
+  }
+}
+#endif
+
+
+/* Build a string and its cyclic list representation from scratch.
+ * propagate_string(stone, str) adds the stone (stone) to the string
+ * (str) and recursively continues with not already included friendly
+ * neighbors. To start a new string at (stone), use
+ * propagate_string(stone, stone). The size of the string is returned.
+ */
+
+static int
+propagate_string(int stone, int str)
+{
+  int size = 1;
+  int k;
+  
+  if (stone == str) {
+    /* Start a new string. */
+    next_stone[stone] = stone;
+  }
+  else {
+    /* Link the stone at (stone) to the string including (str) */
+    string_number[stone] = string_number[str];
+    next_stone[stone] = next_stone[str];
+    next_stone[str] = stone;
+  }
+
+  /* Look in all four directions for more stones to add. */
+  for (k = 0; k < 4; k++) {
+    int d = delta[k];
+    if (ON_BOARD(stone + d)
+       && board[stone + d] == board[stone]
+       && string_number[stone + d] == -1)
+      size += propagate_string(stone + d, str);
+  }
+  
+  return size;
+}
+
+
+/* Build the lists of liberties and neighbors of a string from
+ * scratch. No information is pushed onto the stack by this function.
+ */
+
+static void
+find_liberties_and_neighbors(int s)
+{
+  int pos;
+  int other = OTHER_COLOR(string[s].color);
+
+  /* Clear the marks. */
+  liberty_mark++;
+  string_mark++;
+
+  /* Traverse the stones of the string, by following the cyclic chain. */
+  pos = FIRST_STONE(s);
+  do {
+    /* Look in each direction for new liberties or new neighbors. Mark
+     * already visited liberties and neighbors.
+     */
+    if (UNMARKED_LIBERTY(SOUTH(pos))) {
+      ADD_AND_MARK_LIBERTY(s, SOUTH(pos));
+    }
+    else if (UNMARKED_COLOR_STRING(SOUTH(pos), other)) {
+      ADD_NEIGHBOR(s, SOUTH(pos));
+      MARK_STRING(SOUTH(pos));
+    }
+    
+    if (UNMARKED_LIBERTY(WEST(pos))) {
+      ADD_AND_MARK_LIBERTY(s, WEST(pos));
+    }
+    else if (UNMARKED_COLOR_STRING(WEST(pos), other)) {
+      ADD_NEIGHBOR(s, WEST(pos));
+      MARK_STRING(WEST(pos));
+    }
+    
+    if (UNMARKED_LIBERTY(NORTH(pos))) {
+      ADD_AND_MARK_LIBERTY(s, NORTH(pos));
+    }
+    else if (UNMARKED_COLOR_STRING(NORTH(pos), other)) {
+      ADD_NEIGHBOR(s, NORTH(pos));
+      MARK_STRING(NORTH(pos));
+    }
+    
+    if (UNMARKED_LIBERTY(EAST(pos))) {
+      ADD_AND_MARK_LIBERTY(s, EAST(pos));
+    }
+    else if (UNMARKED_COLOR_STRING(EAST(pos), other)) {
+      ADD_NEIGHBOR(s, EAST(pos));
+      MARK_STRING(EAST(pos));
+    }
+    
+    pos = NEXT_STONE(pos);
+  } while (!BACK_TO_FIRST_STONE(s, pos));
+}
+
+
+/* Update the liberties of a string from scratch, first pushing the
+ * old information.
+ */
+
+static void
+update_liberties(int s)
+{
+  int pos;
+  int k;
+
+  /* Push the old information. */
+  PUSH_VALUE(string[s].liberties);
+  for (k = 0; k < string[s].liberties && k < MAX_LIBERTIES; k++) {
+    PUSH_VALUE(string_libs[s].list[k]);
+  }
+  string[s].liberties = 0;
+
+  /* Clear the liberty mark. */
+  liberty_mark++;
+
+  /* Traverse the stones of the string, by following the cyclic chain. */
+  pos = FIRST_STONE(s);
+  do {
+    /* Look in each direction for new liberties. Mark already visited
+     * liberties. 
+     */
+    if (UNMARKED_LIBERTY(SOUTH(pos))) {
+      ADD_AND_MARK_LIBERTY(s, SOUTH(pos));
+    }
+    
+    if (UNMARKED_LIBERTY(WEST(pos))) {
+      ADD_AND_MARK_LIBERTY(s, WEST(pos));
+    }
+    
+    if (UNMARKED_LIBERTY(NORTH(pos))) {
+      ADD_AND_MARK_LIBERTY(s, NORTH(pos));
+    }
+    
+    if (UNMARKED_LIBERTY(EAST(pos))) {
+      ADD_AND_MARK_LIBERTY(s, EAST(pos));
+    }
+    
+    pos = NEXT_STONE(pos);
+  } while (!BACK_TO_FIRST_STONE(s, pos));
+}
+
+
+/* Remove a string from the list of neighbors and push the changed
+ * information.
+ */
+
+static void
+remove_neighbor(int str_number, int n)
+{
+  int k;
+  int done = 0;
+  struct string_data *s = &string[str_number];
+  struct string_neighbors_data *sn = &string_neighbors[str_number];
+  for (k = 0; k < s->neighbors; k++)
+    if (sn->list[k] == n) {
+      /* We need to push the last entry too because it may become
+       * destroyed later.
+       */
+      PUSH_VALUE(sn->list[s->neighbors - 1]);
+      PUSH_VALUE(sn->list[k]);
+      PUSH_VALUE(s->neighbors);
+      sn->list[k] = sn->list[s->neighbors - 1];
+      s->neighbors--;
+      done = 1;
+      break;
+    }
+  gg_assert(done);
+}
+
+
+/* Remove one liberty from the list of liberties, pushing changed
+ * information. If the string had more liberties than the size of the
+ * list, rebuild the list from scratch.
+ */
+
+static void
+remove_liberty(int str_number, int pos)
+{
+  int k;
+  struct string_data *s = &string[str_number];
+  struct string_liberties_data *sl = &string_libs[str_number];
+  
+  if (s->liberties > MAX_LIBERTIES)
+    update_liberties(str_number);
+  else {
+    for (k = 0; k < s->liberties; k++)
+      if (sl->list[k] == pos) {
+       /* We need to push the last entry too because it may become
+        * destroyed later.
+        */
+       PUSH_VALUE(sl->list[s->liberties - 1]);
+       PUSH_VALUE(sl->list[k]);
+       PUSH_VALUE(s->liberties);
+       sl->list[k] = sl->list[s->liberties - 1];
+       s->liberties--;
+       break;
+      }
+  }
+}
+
+
+/* Remove a string from the board, pushing necessary information to
+ * restore it. Return the number of removed stones.
+ */
+
+static int
+do_remove_string(int s)
+{
+  int pos;
+  int k;
+  int size = string[s].size;
+
+  /* Traverse the stones of the string, by following the cyclic chain. */
+  pos = FIRST_STONE(s);
+  do {
+    /* Push color, string number and cyclic chain pointers. */
+    PUSH_VALUE(string_number[pos]);
+    PUSH_VALUE(next_stone[pos]);
+    DO_REMOVE_STONE(pos);
+    pos = NEXT_STONE(pos);
+  } while (!BACK_TO_FIRST_STONE(s, pos));
+
+  /* The neighboring strings have obtained some new liberties and lost
+   * a neighbor.  For speed reasons we handle two most common cases
+   * when string size is 1 or 2 stones here instead of calling
+   * update_liberties().
+   */
+  if (size == 1) {
+    for (k = 0; k < string[s].neighbors; k++) {
+      int neighbor = string_neighbors[s].list[k];
+
+      remove_neighbor(neighbor, s);
+      PUSH_VALUE(string[neighbor].liberties);
+
+      if (string[neighbor].liberties < MAX_LIBERTIES)
+       string_libs[neighbor].list[string[neighbor].liberties] = pos;
+      string[neighbor].liberties++;
+    }
+  }
+  else if (size == 2) {
+    int other = OTHER_COLOR(string[s].color);
+    int pos2 = NEXT_STONE(pos);
+
+    for (k = 0; k < string[s].neighbors; k++) {
+      int neighbor = string_neighbors[s].list[k];      
+
+      remove_neighbor(neighbor, s);
+      PUSH_VALUE(string[neighbor].liberties);
+
+      if (NEIGHBOR_OF_STRING(pos, neighbor, other)) {
+       if (string[neighbor].liberties < MAX_LIBERTIES)
+         string_libs[neighbor].list[string[neighbor].liberties] = pos;
+       string[neighbor].liberties++;
+      }
+
+      if (NEIGHBOR_OF_STRING(pos2, neighbor, other)) {
+       if (string[neighbor].liberties < MAX_LIBERTIES)
+         string_libs[neighbor].list[string[neighbor].liberties] = pos2;
+       string[neighbor].liberties++;
+      }
+    }
+  }
+  else {
+    for (k = 0; k < string[s].neighbors; k++) {
+      remove_neighbor(string_neighbors[s].list[k], s);
+      update_liberties(string_neighbors[s].list[k]);
+    }
+  }
+
+  /* Update the number of captured stones. These are assumed to
+   * already have been pushed.
+   */
+  if (string[s].color == WHITE)
+    white_captured += size;
+  else
+    black_captured += size;
+
+  return size;
+}
+
+
+/* We have played an isolated new stone and need to create a new
+ * string for it.
+ */
+static void
+create_new_string(int pos)
+{
+  int s;
+  int color = board[pos];
+  int other = OTHER_COLOR(color);
+
+  /* Get the next free string number. */
+  PUSH_VALUE(next_string);
+  s = next_string++;
+  PARANOID1(s < MAX_STRINGS, pos);
+  string_number[pos] = s;
+  /* Set up a size one cycle for the string. */
+  next_stone[pos] = pos;
+
+  /* Set trivially known values and initialize the rest to zero. */
+  string[s].color = color;
+  string[s].size = 1;
+  string[s].origin = pos;
+  string[s].liberties = 0;
+  string[s].neighbors = 0;
+  string[s].mark = 0;
+
+  /* Clear the string mark. */
+  string_mark++;
+
+  /* In each direction, look for a liberty or a nonmarked opponent
+   * neighbor. Mark visited neighbors. There is no need to mark the
+   * liberties since we can't find them twice. */
+  if (LIBERTY(SOUTH(pos))) {
+    ADD_LIBERTY(s, SOUTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(SOUTH(pos), other)) {
+    int s2 = string_number[SOUTH(pos)];
+    /* Add the neighbor to our list. */
+    ADD_NEIGHBOR(s, SOUTH(pos));
+    /* Add us to our neighbor's list. */
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    MARK_STRING(SOUTH(pos));
+  }
+  
+  if (LIBERTY(WEST(pos))) {
+    ADD_LIBERTY(s, WEST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(WEST(pos), other)) {
+    int s2 = string_number[WEST(pos)];
+    /* Add the neighbor to our list. */
+    ADD_NEIGHBOR(s, WEST(pos));
+    /* Add us to our neighbor's list. */
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    MARK_STRING(WEST(pos));
+  }
+  
+  if (LIBERTY(NORTH(pos))) {
+    ADD_LIBERTY(s, NORTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(NORTH(pos), other)) {
+    int s2 = string_number[NORTH(pos)];
+    /* Add the neighbor to our list. */
+    ADD_NEIGHBOR(s, NORTH(pos));
+    /* Add us to our neighbor's list. */
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    MARK_STRING(NORTH(pos));
+  }
+  
+  if (LIBERTY(EAST(pos))) {
+    ADD_LIBERTY(s, EAST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(EAST(pos), other)) {
+    int s2 = string_number[EAST(pos)];
+    /* Add the neighbor to our list. */
+    ADD_NEIGHBOR(s, EAST(pos));
+    /* Add us to our neighbor's list. */
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    /* No need to mark since no visits left. */
+#if 0
+    MARK_STRING(EAST(pos));
+#endif
+  }
+}
+
+
+/* We have played a stone with exactly one friendly neighbor. Add the
+ * new stone to that string.
+ */
+static void
+extend_neighbor_string(int pos, int s)
+{
+  int k;
+  int liberties_updated = 0;
+  int color = board[pos];
+  int other = OTHER_COLOR(color);
+
+  /* Link in the stone in the cyclic list. */
+  int pos2 = string[s].origin;
+  next_stone[pos] = next_stone[pos2];
+  PUSH_VALUE(next_stone[pos2]);
+  next_stone[pos2] = pos;
+  
+  /* Do we need to update the origin? */
+  if (pos < pos2) {
+    PUSH_VALUE(string[s].origin);
+    string[s].origin = pos;
+  }
+  
+  string_number[pos] = s;
+
+  /* The size of the string has increased by one. */
+  PUSH_VALUE(string[s].size);
+  string[s].size++;
+
+  /* If s has too many liberties, we don't know where they all are and
+   * can't update the liberties with the algorithm we otherwise
+   * use. In that case we can only recompute the liberties from
+   * scratch.
+   */
+  if (string[s].liberties > MAX_LIBERTIES) {
+    update_liberties(s);
+    liberties_updated = 1;
+  }
+  else {
+    /* The place of the new stone is no longer a liberty. */
+    remove_liberty(s, pos);
+  }
+
+  /* Mark old neighbors of the string. */
+  string_mark++;
+  for (k = 0; k < string[s].neighbors; k++)
+    string[string_neighbors[s].list[k]].mark = string_mark;
+
+  /* Look at the neighbor locations of pos for new liberties and/or
+   * neighbor strings.
+   */
+
+  /* If we find a liberty, look two steps away to determine whether
+   * this already is a liberty of s.
+   */
+  if (LIBERTY(SOUTH(pos))) {
+    if (!liberties_updated
+       && !NON_SOUTH_NEIGHBOR_OF_STRING(SOUTH(pos), s, color))
+      ADD_LIBERTY(s, SOUTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(SOUTH(pos), other)) {
+    int s2 = string_number[SOUTH(pos)];
+    PUSH_VALUE(string[s].neighbors);
+    ADD_NEIGHBOR(s, SOUTH(pos));
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    MARK_STRING(SOUTH(pos));
+  }
+  
+  if (LIBERTY(WEST(pos))) {
+    if (!liberties_updated
+       && !NON_WEST_NEIGHBOR_OF_STRING(WEST(pos), s, color))
+      ADD_LIBERTY(s, WEST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(WEST(pos), other)) {
+    int s2 = string_number[WEST(pos)];
+    PUSH_VALUE(string[s].neighbors);
+    ADD_NEIGHBOR(s, WEST(pos));
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    MARK_STRING(WEST(pos));
+  }
+  
+  if (LIBERTY(NORTH(pos))) {
+    if (!liberties_updated
+       && !NON_NORTH_NEIGHBOR_OF_STRING(NORTH(pos), s, color))
+      ADD_LIBERTY(s, NORTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(NORTH(pos), other)) {
+    int s2 = string_number[NORTH(pos)];
+    PUSH_VALUE(string[s].neighbors);
+    ADD_NEIGHBOR(s, NORTH(pos));
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+    MARK_STRING(NORTH(pos));
+  }
+  
+  if (LIBERTY(EAST(pos))) {
+    if (!liberties_updated
+       && !NON_EAST_NEIGHBOR_OF_STRING(EAST(pos), s, color))
+      ADD_LIBERTY(s, EAST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(EAST(pos), other)) {
+    int s2 = string_number[EAST(pos)];
+    PUSH_VALUE(string[s].neighbors);
+    ADD_NEIGHBOR(s, EAST(pos));
+    PUSH_VALUE(string[s2].neighbors);
+    ADD_NEIGHBOR(s2, pos);
+#if 0
+    MARK_STRING(EAST(pos));
+#endif
+  }
+  
+}
+
+
+/* Incorporate the string at pos with the string s.
+ */
+
+static void
+assimilate_string(int s, int pos)
+{
+  int k;
+  int last;
+  int s2 = string_number[pos];
+  string[s].size += string[s2].size;
+
+  /* Walk through the s2 stones and change string number. Also pick up
+   * the last stone in the cycle for later use.
+   */
+  pos = FIRST_STONE(s2);
+  do {
+    PUSH_VALUE(string_number[pos]);
+    string_number[pos] = s;
+    last = pos;
+    pos = NEXT_STONE(pos);
+  } while (!BACK_TO_FIRST_STONE(s2, pos));
+
+  /* Link the two cycles together. */
+  {
+    int pos2 = string[s].origin;
+    PUSH_VALUE(next_stone[last]);
+    PUSH_VALUE(next_stone[pos2]);
+    next_stone[last] = next_stone[pos2];
+    next_stone[pos2] = string[s2].origin;
+    
+    /* Do we need to update the origin? */
+    if (string[s2].origin < pos2)
+      string[s].origin = string[s2].origin;
+  }
+
+  /* Pick up the liberties of s2 that we don't already have.
+   * It is assumed that the liberties of s have been marked before
+   * this function is called.
+   */
+  if (string[s2].liberties <= MAX_LIBERTIES) {
+    for (k = 0; k < string[s2].liberties; k++) {
+      int pos2 = string_libs[s2].list[k];
+      if (UNMARKED_LIBERTY(pos2)) {
+       ADD_AND_MARK_LIBERTY(s, pos2);
+      }
+    }
+  }
+  else {
+    /* If s2 had too many liberties the above strategy wouldn't be
+     * effective, since not all liberties are listed in
+     * libs[] the chain of stones for s2 is no
+     * longer available (it has already been merged with s) so we
+     * can't reconstruct the s2 liberties. Instead we capitulate and
+     * rebuild the list of liberties for s (including the neighbor
+     * strings assimilated so far) from scratch.
+     */
+    liberty_mark++;          /* Reset the mark. */
+    string[s].liberties = 0; /* To avoid pushing the current list. */
+    update_liberties(s);
+  }
+
+  /* Remove s2 as neighbor to the neighbors of s2 and instead add s if
+   * they don't already have added it. Also add the neighbors of s2 as
+   * neighbors of s, unless they already have been added. The already
+   * known neighbors of s are assumed to have been marked before this
+   * function is called.
+   */
+  for (k = 0; k < string[s2].neighbors; k++) {
+    int t = string_neighbors[s2].list[k];
+    remove_neighbor(t, s2);
+    if (string[t].mark != string_mark) {
+      PUSH_VALUE(string[t].neighbors);
+      string_neighbors[t].list[string[t].neighbors++] = s;
+      string_neighbors[s].list[string[s].neighbors++] = t;
+      string[t].mark = string_mark;
+    }
+  }
+}
+
+
+/* Create a new string for the stone at pos and assimilate all
+ * friendly neighbor strings.
+ */
+
+static void
+assimilate_neighbor_strings(int pos)
+{
+  int s;
+  int color = board[pos];
+  int other = OTHER_COLOR(color);
+
+  /* Get the next free string number. */
+  PUSH_VALUE(next_string);
+  s = next_string++;
+  PARANOID1(s < MAX_STRINGS, pos); 
+  string_number[pos] = s;
+  /* Set up a size one cycle for the string. */
+  next_stone[pos] = pos;
+  
+  /* Set trivially known values and initialize the rest to zero. */
+  string[s].color = color;
+  string[s].size = 1;
+  string[s].origin = pos;
+  string[s].liberties = 0;
+  string[s].neighbors = 0;
+
+  /* Clear the marks. */
+  liberty_mark++;
+  string_mark++;
+
+  /* Mark ourselves. */
+  string[s].mark = string_mark;
+
+  /* Look in each direction for
+   *
+   * 1. liberty: Add if not already visited.
+   * 2. opponent string: Add it among our neighbors and us among its
+   *    neighbors, unless already visited.
+   * 3. friendly string: Assimilate.
+   */
+  if (UNMARKED_LIBERTY(SOUTH(pos))) {
+    ADD_AND_MARK_LIBERTY(s, SOUTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(SOUTH(pos), other)) {
+    ADD_NEIGHBOR(s, SOUTH(pos));
+    PUSH_VALUE(string[string_number[SOUTH(pos)]].neighbors);
+    ADD_NEIGHBOR(string_number[SOUTH(pos)], pos);
+    MARK_STRING(SOUTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(SOUTH(pos), color)) {
+    assimilate_string(s, SOUTH(pos));
+  }
+
+  if (UNMARKED_LIBERTY(WEST(pos))) {
+    ADD_AND_MARK_LIBERTY(s, WEST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(WEST(pos), other)) {
+    ADD_NEIGHBOR(s, WEST(pos));
+    PUSH_VALUE(string[string_number[WEST(pos)]].neighbors);
+    ADD_NEIGHBOR(string_number[WEST(pos)], pos);
+    MARK_STRING(WEST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(WEST(pos), color)) {
+    assimilate_string(s, WEST(pos));
+  }
+  
+  if (UNMARKED_LIBERTY(NORTH(pos))) {
+    ADD_AND_MARK_LIBERTY(s, NORTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(NORTH(pos), other)) {
+    ADD_NEIGHBOR(s, NORTH(pos));
+    PUSH_VALUE(string[string_number[NORTH(pos)]].neighbors);
+    ADD_NEIGHBOR(string_number[NORTH(pos)], pos);
+    MARK_STRING(NORTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(NORTH(pos), color)) {
+    assimilate_string(s, NORTH(pos));
+  }
+  
+  if (UNMARKED_LIBERTY(EAST(pos))) {
+#if 0
+    ADD_AND_MARK_LIBERTY(s, EAST(pos));
+#else
+    ADD_LIBERTY(s, EAST(pos));
+#endif
+  }
+  else if (UNMARKED_COLOR_STRING(EAST(pos), other)) {
+    ADD_NEIGHBOR(s, EAST(pos));
+    PUSH_VALUE(string[string_number[EAST(pos)]].neighbors);
+    ADD_NEIGHBOR(string_number[EAST(pos)], pos);
+#if 0
+    MARK_STRING(EAST(pos));
+#endif
+  }
+  else if (UNMARKED_COLOR_STRING(EAST(pos), color)) {
+    assimilate_string(s, EAST(pos));
+  }
+}
+
+
+/* Suicide at `pos' (the function assumes that the move is indeed suicidal).
+ * Remove the neighboring friendly strings.
+ */
+
+static void
+do_commit_suicide(int pos, int color)
+{
+  if (board[SOUTH(pos)] == color)
+    do_remove_string(string_number[SOUTH(pos)]);
+
+  if (board[WEST(pos)] == color)
+    do_remove_string(string_number[WEST(pos)]);
+
+  if (board[NORTH(pos)] == color)
+    do_remove_string(string_number[NORTH(pos)]);
+
+  if (board[EAST(pos)] == color)
+    do_remove_string(string_number[EAST(pos)]);
+
+  /* Count the stone we "played" as captured. */
+  if (color == WHITE)
+    white_captured++;
+  else
+    black_captured++;
+}
+
+
+/* Play a move without legality checking. This is a low-level function,
+ * it assumes that the move is not a suicide. Such cases must be handled
+ * where the function is called.
+ */
+
+static void
+do_play_move(int pos, int color)
+{
+  int other = OTHER_COLOR(color);
+  int captured_stones = 0;
+  int neighbor_allies = 0;
+  int s = -1;
+
+  /* Clear string mark. */
+  string_mark++;
+
+  /* Put down the stone.  We also set its string number to -1 for a while
+   * so that NEIGHBOR_OF_STRING() and friends don't get confused with the
+   * stone.
+   */
+  DO_ADD_STONE(pos, color);
+  string_number[pos] = -1;
+
+  /* Look in all directions. Count the number of neighbor strings of the same
+   * color, remove captured strings and remove `pos' as liberty for opponent
+   * strings that are not captured.
+   */
+  if (board[SOUTH(pos)] == color) {
+    neighbor_allies++;
+    s = string_number[SOUTH(pos)];
+    MARK_STRING(SOUTH(pos));
+  }
+  else if (board[SOUTH(pos)] == other) {
+    if (LIBERTIES(SOUTH(pos)) > 1) {
+      remove_liberty(string_number[SOUTH(pos)], pos);
+      MARK_STRING(SOUTH(pos));
+    }
+    else
+      captured_stones += do_remove_string(string_number[SOUTH(pos)]);
+  }
+
+  if (UNMARKED_COLOR_STRING(WEST(pos), color)) {
+    neighbor_allies++;
+    s = string_number[WEST(pos)];
+    MARK_STRING(WEST(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(WEST(pos), other)) {
+    if (LIBERTIES(WEST(pos)) > 1) {
+      remove_liberty(string_number[WEST(pos)], pos);
+      MARK_STRING(WEST(pos));
+    }
+    else
+      captured_stones += do_remove_string(string_number[WEST(pos)]);
+  }
+
+  if (UNMARKED_COLOR_STRING(NORTH(pos), color)) {
+    neighbor_allies++;
+    s = string_number[NORTH(pos)];
+    MARK_STRING(NORTH(pos));
+  }
+  else if (UNMARKED_COLOR_STRING(NORTH(pos), other)) {
+    if (LIBERTIES(NORTH(pos)) > 1) {
+      remove_liberty(string_number[NORTH(pos)], pos);
+      MARK_STRING(NORTH(pos));
+    }
+    else
+      captured_stones += do_remove_string(string_number[NORTH(pos)]);
+  }
+
+  if (UNMARKED_COLOR_STRING(EAST(pos), color)) {
+    neighbor_allies++;
+    s = string_number[EAST(pos)];
+#if 0
+    MARK_STRING(EAST(pos));
+#endif
+  }
+  else if (UNMARKED_COLOR_STRING(EAST(pos), other)) {
+    if (LIBERTIES(EAST(pos)) > 1) {
+      remove_liberty(string_number[EAST(pos)], pos);
+#if 0
+      MARK_STRING(EAST(pos));
+#endif
+    }
+    else
+      captured_stones += do_remove_string(string_number[EAST(pos)]);
+  }
+
+  /* Choose strategy depending on the number of friendly neighbors. */
+  if (neighbor_allies == 0)
+    create_new_string(pos);
+  else if (neighbor_allies == 1) {
+    gg_assert(s >= 0);
+    extend_neighbor_string(pos, s);
+    return; /* can't be a ko, we're done */
+  }
+  else {
+    assimilate_neighbor_strings(pos);
+    return; /* can't be a ko, we're done */
+  }
+
+  /* Check whether this move was a ko capture and if so set 
+   * board_ko_pos.
+   *
+   * No need to push board_ko_pos on the stack, 
+   * because this has been done earlier.
+   */
+  s = string_number[pos];
+  if (string[s].liberties == 1
+      && string[s].size == 1
+      && captured_stones == 1) {
+    /* In case of a double ko: clear old ko position first. */
+    if (board_ko_pos != NO_MOVE)
+      hashdata_invert_ko(&board_hash, board_ko_pos);
+    board_ko_pos = string_libs[s].list[0];
+    hashdata_invert_ko(&board_hash, board_ko_pos);
+  }
+}
+
+
+
+/* ================================================================ *
+ * The following functions don't actually belong here. They are  
+ * only here because they are faster here where they have access to
+ * the incremental data structures. 
+ * ================================================================ */
+
+
+/* Help collect the data needed by order_moves() in reading.c.
+ * It's the caller's responsibility to initialize the result parameters.
+ */
+#define NO_UNROLL 0
+void
+incremental_order_moves(int move, int color, int str,
+                       int *number_edges, int *number_same_string,
+                       int *number_own, int *number_opponent,
+                       int *captured_stones, int *threatened_stones,
+                       int *saved_stones, int *number_open)
+{
+#if NO_UNROLL == 1
+  int pos;
+  int k;
+
+  /* Clear the string mark. */
+  string_mark++;
+
+  for (k = 0; k < 4; k++) {
+    pos = move + delta[k];
+    if (!ON_BOARD(pos))
+      (*number_edges)++;
+    else if (board[pos] == EMPTY)
+      (*number_open)++;
+    else {
+      int s = string_number[pos];
+      if (string_number[str] == s)
+       (*number_same_string)++;
+      
+      if (board[pos] == color) {
+       (*number_own)++;
+       if (string[s].liberties == 1)
+         (*saved_stones) += string[s].size;
+      }
+      else {
+       (*number_opponent)++;
+       if (string[s].liberties == 1) {
+         int r;
+         struct string_data *t;
+         (*captured_stones) += string[s].size;
+         for (r = 0; r < string[s].neighbors; r++) {
+           t = &string[string[s].neighborlist[r]];
+           if (t->liberties == 1)
+             (*saved_stones) += t->size;
+         }
+       }
+       else if (string[s].liberties == 2 && UNMARKED_STRING(pos)) {
+         (*threatened_stones) += string[s].size;
+         MARK_STRING(pos);
+       }
+      }
+    }
+  }
+  
+#else
+#define code1(arg) \
+  if (!ON_BOARD(arg)) \
+    (*number_edges)++; \
+  else if (board[arg] == EMPTY) \
+    (*number_open)++; \
+  else { \
+    int s = string_number[arg]; \
+    if (string_number[str] == s) \
+      (*number_same_string)++; \
+    if (board[arg] == color) { \
+      (*number_own)++; \
+      if (string[s].liberties == 1) \
+       (*saved_stones) += string[s].size; \
+    } \
+    else { \
+      (*number_opponent)++; \
+      if (string[s].liberties == 1) { \
+       int r; \
+       struct string_data *t; \
+       (*captured_stones) += string[s].size; \
+       for (r = 0; r < string[s].neighbors; r++) { \
+         t = &string[string_neighbors[s].list[r]]; \
+         if (t->liberties == 1) \
+           (*saved_stones) += t->size; \
+       } \
+      } \
+      else if (string[s].liberties == 2 && UNMARKED_STRING(arg)) { \
+       (*threatened_stones) += string[s].size; \
+        MARK_STRING(arg); \
+      } \
+    } \
+  }
+
+  /* Clear the string mark. */
+  string_mark++;
+
+  code1(SOUTH(move));
+  code1(WEST(move));
+  code1(NORTH(move));
+  code1(EAST(move));
+#endif
+}
+
+
+int 
+square_dist(int pos1, int pos2)
+{
+  int idist = I(pos1) - I(pos2);
+  int jdist = J(pos1) - J(pos2);
+  return idist*idist + jdist*jdist;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/board.dsp b/engine/board.dsp
new file mode 100644 (file)
index 0000000..b2f11c8
--- /dev/null
@@ -0,0 +1,133 @@
+# Microsoft Developer Studio Project File - Name="board" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=board - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "board.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "board.mak" CFG="board - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "board - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "board - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "board - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I "." /I ".." /I "..\sgf" /I "..\interface" /I "..\patterns" /I "..\utils" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /YX"gnugo.h" /Fd"Release/board" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "board - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "board___Win32_Debug"\r
+# PROP BASE Intermediate_Dir "board___Win32_Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I "." /I ".." /I "..\sgf" /I "..\interface" /I "..\patterns" /I "..\utils" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "HAVE_CONFIG_H" /D "_LIB" /FR /YX"gnugo.h" /Fd"Debug/board" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "board - Win32 Release"\r
+# Name "board - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\board.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\boardlib.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\cache.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\globals.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hash.c\r
+\r
+!IF  "$(CFG)" == "board - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "board - Win32 Debug"\r
+\r
+# PROP Intermediate_Dir "Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\printutils.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgffile.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\board.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/engine/board.h b/engine/board.h
new file mode 100644 (file)
index 0000000..6467286
--- /dev/null
@@ -0,0 +1,476 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+#include <stdarg.h>
+#include "config.h"
+#include "sgftree.h"
+#include "winsocket.h"
+
+/* This type is used to store each intersection on the board.
+ *
+ * On a 486, char is best, since the time taken to push and pop
+ * becomes significant otherwise. On other platforms, an int may
+ * be better, e.g. if memcpy() is particularly fast, or if
+ * character access is very slow.
+ */
+
+typedef unsigned char Intersection;
+
+/* FIXME: This is very ugly but we can't include hash.h until we have
+ * defined Intersection. And we do need to include it before using
+ * Hash_data.
+ */
+#include "hash.h"
+
+/* local versions of absolute value, min and max */
+
+#define gg_abs(x) ((x) < 0 ? -(x) : (x))
+#define gg_min(a, b) ((a)<(b) ? (a) : (b))
+#define gg_max(a, b) ((a)<(b) ? (b) : (a))
+
+/* Avoid compiler warnings with unused parameters */
+#define UNUSED(x)  (void)x
+
+
+/* A string with n stones can have at most 2(n+1) liberties. From this
+ * follows that an upper bound on the number of liberties of a string
+ * on a board of size N^2 is 2/3 (N^2+1).
+ */
+#define MAXLIBS   (2*(MAX_BOARD*MAX_BOARD + 1)/3)
+/* This is a smaller, practical number of liberties that we care to keep track of. */
+#define MAX_LIBERTIES 8
+
+
+/* This is an upper bound on the number of strings that can exist on
+ * the board simultaneously. Since each string must have at least one
+ * liberty and each empty point can provide a liberty to at most four
+ * strings, at least one out of five board points must be empty.
+ *
+ * FIXME: This is not sufficiently large. Above stackp==0, the
+ *        incremental board code doesn't re-use the entries for
+ *        removed or merged strings, while new strings require new
+ *        entries. This is a problem only in very pathological cases,
+ *        and is extremely unlikely to occur in practice.
+ *
+ *        Actually, in the not all that pathological case of a
+ *        repeated triple ko cycle, each move creates a new string and
+ *        thus makes use of one more string, which relatively quickly
+ *        will exhaust the available strings. For a safe upper bound
+ *        MAX_STRINGS should be set to
+ *        MAX_STACK + 4 * MAX_BOARD * MAX_BOARD / 5.
+ *        It's not clear that it's worth the extra memory, however.
+ */
+#define MAX_STRINGS (4 * MAX_BOARD * MAX_BOARD / 5)
+
+/* Per gf: Unconditional_life() can get very close to filling the 
+ * entire board under certain circumstances. This was discussed in 
+ * the list around August 21, 2001, in a thread with the subject 
+ * "gnugo bug logs".
+ */
+#define MAXSTACK  MAX_BOARD * MAX_BOARD
+#define MAXCHAIN  160
+
+#define HASH_RANDOM_SEED 12345
+
+/* ================================================================ *
+ *                         One-dimensional board                    *
+ * ================================================================ */
+
+/* Board sizes */
+
+
+#define MIN_BOARD          1       /* Minimum supported board size.   */
+#define MAX_BOARD         19       /* Maximum supported board size.   */
+#define MAX_HANDICAP       9       /* Maximum supported handicap.     */
+#define MAX_MOVE_HISTORY 500       /* Max number of moves remembered. */
+
+#define DEFAULT_BOARD_SIZE MAX_BOARD
+
+/* Colors and komaster states. */
+enum colors {
+  EMPTY,
+  WHITE,
+  BLACK,
+  GRAY,
+  GRAY_WHITE,
+  GRAY_BLACK,
+  WEAK_KO,
+  NUM_KOMASTER_STATES
+};
+
+#define COLOR_NAMES \
+  "empty", \
+  "white", \
+  "black", \
+  "gray", \
+  "gray_white", \
+  "gray_black", \
+  "weak_ko"
+
+const char *color_to_string(int color);
+
+#define OTHER_COLOR(color)      (WHITE+BLACK-(color))
+#define IS_STONE(arg)           ((arg) == WHITE || (arg) == BLACK)
+
+/* Note that POS(-1, -1) == 0
+ * DELTA() is defined so that POS(i+di, j+dj) = POS(i, j) + DELTA(di, dj).
+ */
+#define BOARDSIZE     ((MAX_BOARD + 2) * (MAX_BOARD + 1) + 1)
+#define BOARDMIN      (MAX_BOARD + 2)
+#define BOARDMAX      (MAX_BOARD + 1) * (MAX_BOARD + 1)
+#define POS(i, j)     ((MAX_BOARD + 2) + (i) * (MAX_BOARD + 1) + (j))
+#define DELTA(di, dj) ((di) * (MAX_BOARD + 1) + (dj))
+#define I(pos)        ((pos) / (MAX_BOARD + 1) - 1)
+#define J(pos)        ((pos) % (MAX_BOARD + 1) - 1)
+#define PASS_MOVE     0
+#define NO_MOVE       PASS_MOVE
+#define NS            (MAX_BOARD + 1)
+#define WE            1
+#define SOUTH(pos)    ((pos) + NS)
+#define WEST(pos)     ((pos) - 1)
+#define NORTH(pos)    ((pos) - NS)
+#define EAST(pos)     ((pos) + 1)
+#define SW(pos)       ((pos) + NS - 1)
+#define NW(pos)       ((pos) - NS - 1)
+#define NE(pos)       ((pos) - NS + 1)
+#define SE(pos)       ((pos) + NS + 1)
+#define SS(pos)       ((pos) + 2 * NS)
+#define WW(pos)       ((pos) - 2)
+#define NN(pos)       ((pos) - 2 * NS)
+#define EE(pos)       ((pos) + 2)
+
+#define DIRECT_NEIGHBORS(pos1, pos2)           \
+  ((pos1) == SOUTH(pos2)                       \
+   || (pos1) == WEST(pos2)                     \
+   || (pos1) == NORTH(pos2)                    \
+   || (pos1) == EAST(pos2))
+
+#define DIAGONAL_NEIGHBORS(pos1, pos2)         \
+  ((pos1) == SW(pos2)                          \
+   || (pos1) == NW(pos2)                       \
+   || (pos1) == NE(pos2)                       \
+   || (pos1) == SE(pos2))
+
+#define BOARD(i, j)   board[POS(i, j)]
+
+
+#define MIRROR_MOVE(pos) POS(board_size - 1 - I(pos), board_size - 1 - J(pos))
+
+/* ================================================================ */
+/*                         global variables                         */
+/* ================================================================ */
+
+/* The board and the other parameters deciding the current position. */
+extern int          board_size;             /* board size (usually 19) */
+extern Intersection board[BOARDSIZE];       /* go board */
+extern int          board_ko_pos;
+extern int          black_captured;   /* num. of black stones captured */
+extern int          white_captured;
+
+extern Intersection initial_board[BOARDSIZE];
+extern int          initial_board_ko_pos;
+extern int          initial_white_captured;
+extern int          initial_black_captured;
+extern int          move_history_color[MAX_MOVE_HISTORY];
+extern int          move_history_pos[MAX_MOVE_HISTORY];
+extern Hash_data    move_history_hash[MAX_MOVE_HISTORY];
+extern int          move_history_pointer;
+
+extern float        komi;
+extern int          handicap;     /* used internally in chinese scoring */
+extern int          movenum;      /* movenumber - used for debug output */
+                   
+extern signed char  shadow[BOARDMAX];      /* reading tree shadow */
+
+enum suicide_rules {
+  FORBIDDEN,
+  ALLOWED,
+  ALL_ALLOWED
+};
+extern enum suicide_rules suicide_rule;
+
+enum ko_rules {
+  SIMPLE,
+  NONE,
+  PSK,
+  SSK
+};
+extern enum ko_rules ko_rule;
+
+
+extern int stackp;                /* stack pointer */
+extern int count_variations;      /* count (decidestring) */
+extern SGFTree *sgf_dumptree;
+
+
+/* This struct holds the internal board state. */
+struct board_state {
+  int board_size;
+
+  Intersection board[BOARDSIZE];
+  int board_ko_pos;
+  int black_captured;
+  int white_captured;
+
+  Intersection initial_board[BOARDSIZE];
+  int initial_board_ko_pos;
+  int initial_white_captured;
+  int initial_black_captured;
+  int move_history_color[MAX_MOVE_HISTORY];
+  int move_history_pos[MAX_MOVE_HISTORY];
+  Hash_data move_history_hash[MAX_MOVE_HISTORY];
+  int move_history_pointer;
+
+  float komi;
+  int handicap;
+  int move_number;
+};
+
+/* This is increased by one anytime a move is (permanently) played or
+ * the board is cleared.
+ */
+extern int position_number;
+
+/* ================================================================ */
+/*                        board.c functions                         */
+/* ================================================================ */
+
+
+/* Functions handling the permanent board state. */
+void clear_board(void);
+int test_gray_border(void);
+void setup_board(Intersection new_board[MAX_BOARD][MAX_BOARD], int ko_pos,
+                 int *last, float new_komi, int w_captured, int b_captured);
+void add_stone(int pos, int color);
+void remove_stone(int pos);
+void play_move(int pos, int color);
+int undo_move(int n);
+
+void store_board(struct board_state *state);
+void restore_board(struct board_state *state);
+
+/* Information about the permanent board. */
+int get_last_move(void);
+int get_last_player(void);
+int get_last_opponent_move(int color);
+int stones_on_board(int color);
+
+/* Functions handling the variable board state. */
+int trymove(int pos, int color, const char *message, int str);
+int tryko(int pos, int color, const char *message);
+void popgo(void);
+int komaster_trymove(int pos, int color,
+                    const char *message, int str,
+                    int *is_conditional_ko, int consider_conditional_ko);
+int get_komaster(void);
+int get_kom_pos(void);
+
+int move_in_stack(int pos, int cutoff);
+void get_move_from_stack(int k, int *move, int *color);
+void dump_stack(void);
+void do_dump_stack(void);
+
+void reset_trymove_counter(void);
+int get_trymove_counter(void);
+
+/* move properties */
+int is_pass(int pos);
+int is_legal(int pos, int color);
+int is_suicide(int pos, int color);
+int is_illegal_ko_capture(int pos, int color);
+int is_allowed_move(int pos, int color);
+int is_ko(int pos, int color, int *ko_pos);
+int is_ko_point(int pos);
+int does_capture_something(int pos, int color);
+int is_self_atari(int pos, int color);
+
+/* Purely geometric functions. */
+int is_edge_vertex(int pos);
+int is_corner_vertex(int pos);
+int edge_distance(int pos);
+int square_dist(int pos1, int pos2);
+int rotate1(int pos, int rot);
+
+/* Basic string information. */
+int find_origin(int str);
+int chainlinks(int str, int adj[MAXCHAIN]);
+int chainlinks2(int str, int adj[MAXCHAIN], int lib);
+int chainlinks3(int str, int adj[MAXCHAIN], int lib);
+int extended_chainlinks(int str, int adj[MAXCHAIN], int both_colors);
+
+int liberty_of_string(int pos, int str);
+int second_order_liberty_of_string(int pos, int str);
+int neighbor_of_string(int pos, int str);
+int has_neighbor(int pos, int color);
+int same_string(int str1, int str2);
+int adjacent_strings(int str1, int str2);
+void mark_string(int str, signed char mx[BOARDMAX], signed char mark);
+int are_neighbors(int pos1, int pos2);
+
+/* Count and/or find liberties at (pos). */
+int countlib(int str);
+int findlib(int str, int maxlib, int *libs);
+int fastlib(int pos, int color, int ignore_captures);
+int approxlib(int pos, int color, int maxlib, int *libs);
+int accuratelib(int pos, int color, int maxlib, int *libs);
+int count_common_libs(int str1, int str2);
+int find_common_libs(int str1, int str2, int maxlib, int *libs);
+int have_common_lib(int str1, int str2, int *lib);
+
+/* Count the number of stones in a string. */
+int countstones(int str);
+int findstones(int str, int maxstones, int *stones);
+int count_adjacent_stones(int str1, int str2, int maxstones);
+
+/* Detect a special shape. */
+int send_two_return_one(int move, int color);
+
+/* Special function for reading.c */
+void incremental_order_moves(int move, int color, int string,
+                            int *number_edges, int *number_same_string,
+                            int *number_own, int *number_opponent,
+                            int *captured_stones, int *threatened_stones,
+                            int *saved_stones, int *number_open);
+
+/* Board caches initialization functions. */
+void clear_approxlib_cache(void);
+void clear_accuratelib_cache(void);
+  
+
+/* Is this point inside the board? */
+#if 0
+#define ON_BOARD2(i, j) ((i)>=0 && (j)>=0 && (i)<board_size && (j)<board_size)
+#else
+/*
+ * For the case when expr can only be slightly negative,
+ *    if (expr < 0 || expr > something)
+ * is equivalent to
+ *    if ((unsigned) expr > something)
+ *
+ * (I think gcc knows this trick, but it does no harm to
+ *  encode it explicitly since it saves typing !)
+ */
+#define ON_BOARD2(i, j) ((unsigned) (i) < (unsigned) board_size &&\
+                        (unsigned) (j) < (unsigned) board_size)
+#endif
+
+#define ASSERT_ON_BOARD2(i, j) ASSERT2(ON_BOARD2((i), (j)), (i), (j))
+
+#define ON_BOARD1(pos) (((unsigned) (pos) < BOARDSIZE) && board[pos] != GRAY)
+#define ON_BOARD(pos) (board[pos] != GRAY)
+#define ASSERT_ON_BOARD1(pos) ASSERT1(ON_BOARD1(pos), (pos))
+
+/* Coordinates for the eight directions, ordered
+ * south, west, north, east, southwest, northwest, northeast, southeast.
+ * Defined in board.c.
+ */
+extern int deltai[8]; /* = { 1,  0, -1,  0,  1, -1, -1, 1}; */
+extern int deltaj[8]; /* = { 0, -1,  0,  1, -1, -1,  1, 1}; */
+extern int delta[8];  /* = { NS, -1, -NS, 1, NS-1, -NS-1, -NS+1, NS+1}; */
+
+
+
+/* ================================================================ */
+/*                          Other functions                         */
+/* ================================================================ */
+
+
+/* SGF routines for debugging purposes in sgffile.c */
+void sgffile_begindump(struct SGFTree_t *tree);
+void sgffile_enddump(const char *filename);
+
+
+/* Hashing and Caching statistics. */
+struct stats_data {
+  int nodes;                     /* Number of visited nodes while reading */
+  int read_result_entered;       /* Number of read results entered. */
+  int read_result_hits;          /* Number of hits of read results. */
+  int trusted_read_result_hits;  /* Number of hits of read results   */
+                                 /* with sufficient remaining depth. */
+};
+
+extern struct stats_data stats;
+
+
+/* printutils.c */
+int gprintf(const char *fmt, ...);
+void vgprintf(FILE *outputfile, const char *fmt, va_list ap);
+void mprintf(const char *fmt, ...);
+void gfprintf(FILE *outfile, const char *fmt, ...);
+
+const char *color_to_string(int color); 
+const char *location_to_string(int pos);
+void location_to_buffer(int pos, char *buf);
+
+int string_to_location(int boardsize, const char *str);
+
+int is_hoshi_point(int m, int n);
+void draw_letter_coordinates(FILE *outfile);
+void simple_showboard(FILE *outfile);
+
+void mark_goal_in_sgf(signed char goal[BOARDMAX]);
+
+/* ================================================================ */
+/*                         assertions                               */
+/* ================================================================ */
+
+/* Our own abort() which prints board state on the way out.
+ * (pos) is a "relevant" board position for info.
+ */
+void abortgo(const char *file, int line, const char *msg, int pos)
+#ifdef __GNUC__
+       __attribute__ ((noreturn))
+#endif
+       ;
+
+#ifdef GG_TURN_OFF_ASSERTS
+#define ASSERT2(x, i, j)
+#define ASSERT1(x, pos)
+#else
+/* avoid dangling else */
+/* FIXME: Should probably re-write these using do {...} while (0) idiom. */
+#define ASSERT2(x, i, j) if (x) ; else abortgo(__FILE__, __LINE__, #x, POS(i, j))
+#define ASSERT1(x, pos) if (x) ; else abortgo(__FILE__, __LINE__, #x, pos)
+#endif
+
+#define gg_assert(x) ASSERT1(x, NO_MOVE)
+
+/* Are we using valgrind memory checking? */
+#if USE_VALGRIND
+#include <valgrind/memcheck.h>
+#else
+#define VALGRIND_MAKE_WRITABLE(a, b)
+#endif
+
+#endif  /* _BOARD_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/boardlib.c b/engine/boardlib.c
new file mode 100644 (file)
index 0000000..ce27ecf
--- /dev/null
@@ -0,0 +1,66 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* This file contains the global functions of the board library libboard.a. */
+
+#include "board.h"
+#include "hash.h"
+
+/* The board state itself. */
+int          board_size = DEFAULT_BOARD_SIZE; /* board size */
+Intersection board[BOARDSIZE];
+int          board_ko_pos;
+int          white_captured;    /* number of black and white stones captured */
+int          black_captured;
+
+Intersection initial_board[BOARDSIZE];
+int          initial_board_ko_pos;
+int          initial_white_captured;
+int          initial_black_captured;
+int          move_history_color[MAX_MOVE_HISTORY];
+int          move_history_pos[MAX_MOVE_HISTORY];
+Hash_data    move_history_hash[MAX_MOVE_HISTORY];
+int          move_history_pointer;
+
+float komi = 0.0;
+int handicap = 0;
+int movenum;
+enum suicide_rules suicide_rule = FORBIDDEN;
+enum ko_rules ko_rule = SIMPLE;
+
+
+signed char shadow[BOARDMAX];
+
+/* Hashing of positions. */
+Hash_data board_hash;
+
+int stackp;             /* stack pointer */
+int position_number;    /* position number */
+
+/* Some statistics gathered partly in board.c and hash.c */
+struct stats_data stats;
+
+/* Variation tracking in SGF trees: */
+int count_variations  = 0;
+SGFTree *sgf_dumptree = NULL;
diff --git a/engine/breakin.c b/engine/breakin.c
new file mode 100644 (file)
index 0000000..73244cc
--- /dev/null
@@ -0,0 +1,464 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+#include "liberty.h"
+#include "readconnect.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* This module looks for break-ins into territories that require
+ * deeper tactical reading and are thus impossible to detect for the
+ * influence module. It gets run after the influence module and revises
+ * its territory valuations.
+ *
+ * The procedure is as follows: We look at all big (>= 10) territory regions
+ * as detected by the influence code. Using the computation of
+ * connection distances from readconnect.c, we compute all nearby vertices
+ * of this territory. We look for the closest safe stones belonging to
+ * the opponent.
+ * For each such string (str) we call
+ * - break_in(str, territory) if the opponent is assumed to be next to move,
+ *   or
+ * - block_off(str, territory) if the territory owner is next.
+ * If the break in is successful resp. the blocking unsuccessful, we
+ * shrink the territory, and see whether the opponent can still break in.
+ * We repeat this until the territory is shrunk so much that the opponent
+ * can no longer reach it.
+ */
+
+
+/* Store possible break-ins in initial position to generate move reasons
+ * later.
+ */
+struct break_in_data {
+  int str;
+  int move;
+};
+
+#define MAX_BREAK_INS 50
+static struct break_in_data break_in_list[MAX_BREAK_INS];
+static int num_break_ins;
+
+
+/* Adds all empty intersections that have two goal neighbors to the goal. */
+static void
+enlarge_goal(signed char goal[BOARDMAX])
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == EMPTY && !goal[pos]) {
+      int k;
+      int goal_neighbors = 0;
+      for (k = 0; k < 4; k++)
+       if (board[pos + delta[k]] == EMPTY && goal[pos + delta[k]] == 1)
+         goal_neighbors++;
+      if (goal_neighbors >= 2)
+       goal[pos] = 2;
+    }
+  }
+}
+
+
+/* The "smaller goal" is the intersection of the goal with what is
+ * stored in the queue of the connection_data conn.
+ * Plus we need a couple of extra careful modifications in the case
+ * of "blocking off", i.e. when color_to_move == owner.
+ */
+static void
+compute_smaller_goal(int owner, int color_to_move,
+                    const struct connection_data *conn,
+                    const signed char goal[BOARDMAX],
+                    signed char smaller_goal[BOARDMAX])
+{
+  int k, j;
+  int own_stones_visited[BOARDMAX];
+  memset(smaller_goal, 0, BOARDMAX);
+  for (k = 0; k < conn->queue_end; k++) {
+    int pos = conn->queue[k];
+    int goal_neighbors = 0;
+    /* If we are trying to block-off, we need to be extra careful: We only
+     * can block intrusions coming directly from the string in question.
+     * Therefore, we discard the area if we have traversed more than two
+     * stones of the color breaking in on the way to the goal.
+     */
+    if (owner == color_to_move) {
+      int coming_from = conn->coming_from[pos];
+      if (coming_from == NO_MOVE)
+       own_stones_visited[pos] = 0;
+      else {
+       own_stones_visited[pos] = own_stones_visited[coming_from];
+       /* How many stones have we used to jump from coming_from to pos?
+        * Use Manhattan metric as a guess.
+        */
+       if (!goal[pos] && board[pos] == OTHER_COLOR(owner)) {
+         int i;
+         int stones[MAX_BOARD * MAX_BOARD];
+         int num_stones = findstones(pos, MAX_BOARD * MAX_BOARD, stones);
+         int smallest_distance = 3;
+
+         for (i = 0; i < num_stones; i++) {
+           int distance = (gg_abs(I(stones[i]) - I(coming_from))
+                           + gg_abs(J(stones[i]) - J(coming_from)));
+
+           if (distance < smallest_distance)
+             smallest_distance = distance;
+         }
+
+         own_stones_visited[pos] += smallest_distance;
+       }
+
+       if (own_stones_visited[pos] > 2)
+         continue;
+      }
+    }
+
+    if (!goal[pos])
+      continue;
+
+    /* We don't want vertices that are at the border of the territory, and
+     * from which a break-in is unlikely; these often lead to false
+     * positives.
+     * So we throw out every vertex that has only one neighbor in the goal,
+     * or that is on an edge and has only two goal neighbors.
+     */
+    for (j = 0; j < 4; j++)
+      if (ON_BOARD(pos + delta[j])
+         && goal[pos + delta[j]]
+         && (board[pos] == EMPTY || goal[pos] == OTHER_COLOR(owner)))
+       goal_neighbors++;
+#if 0
+    if (goal_neighbors > 2
+       || goal_neighbors == 2 && !is_edge_vertex(pos))
+#else
+    if (goal_neighbors >= 2)
+      smaller_goal[pos] = 1;
+#endif
+  }
+
+  /* Finally, in the case of blocking off, we only want one connected
+   * component.
+   */
+  if (owner == color_to_move) {
+    signed char marked[BOARDMAX];
+    int sizes[BOARDMAX / 2];
+    signed char mark = 0;
+    int biggest_region = 1;
+    memset(marked, 0, BOARDMAX);
+    for (k = 0; k < conn->queue_end; k++) {
+      int pos = conn->queue[k];
+      if (ON_BOARD(pos) && smaller_goal[pos] && !marked[pos]) {
+       /* Floodfill the connected component of (pos) in the goal. */
+       int queue_start = 0;
+       int queue_end = 1;
+       int queue[BOARDMAX];
+       mark++;
+       sizes[(int) mark] = 1;
+       marked[pos] = mark;
+       queue[0] = pos;
+       while (queue_start < queue_end) {
+         test_gray_border();
+         for (j = 0; j < 4; j++) {
+           int pos2 = queue[queue_start] + delta[j];
+           if (!ON_BOARD(pos2))
+             continue;
+           ASSERT1(marked[pos2] == 0 || marked[pos2] == mark, pos2);
+           if (smaller_goal[pos2]
+               && !marked[pos2]) {
+             sizes[(int) mark]++;
+             marked[pos2] = mark;
+             queue[queue_end++] = pos2;
+           }
+         }
+         queue_start++;
+       }
+      }
+    }
+    /* Now selected the biggest connected component. (In case of
+     * equality, take the first one.
+     */
+    for (k = 1; k <= mark; k++) {
+      if (sizes[k] > sizes[biggest_region])
+       biggest_region = k;
+    }
+    memset(smaller_goal, 0, BOARDMAX);
+    for (k = 0; k < conn->queue_end; k++) {
+      int pos = conn->queue[k];
+      if (marked[pos] == biggest_region)
+       smaller_goal[pos] = 1;
+    }
+  }
+}
+
+
+/* Try to intrude from str into goal. If successful, we shrink the goal,
+ * store the non-territory fields in the non_territory array, and
+ * try again.
+ */
+static int
+break_in_goal_from_str(int str, signed char goal[BOARDMAX],
+                     int *num_non_territory, int non_territory[BOARDMAX],
+                     int color_to_move, int info_pos)
+{
+  int move = NO_MOVE;
+  int saved_move = NO_MOVE;
+  signed char smaller_goal[BOARDMAX];
+  struct connection_data conn;
+
+  /* When blocking off, we use a somewhat smaller goal area. */
+  if (color_to_move == board[str])
+    compute_connection_distances(str, NO_MOVE, FP(3.01), &conn, 1);
+  else
+    compute_connection_distances(str, NO_MOVE, FP(2.81), &conn, 1);
+
+  sort_connection_queue_tail(&conn);
+  expand_connection_queue(&conn);
+  compute_smaller_goal(OTHER_COLOR(board[str]), color_to_move,
+                      &conn, goal, smaller_goal);
+  if (0 && (debug & DEBUG_BREAKIN))
+    print_connection_distances(&conn);
+  DEBUG(DEBUG_BREAKIN, "Trying to break in from %1m to:\n", str);
+  if (debug & DEBUG_BREAKIN)
+    goaldump(smaller_goal);
+  while ((color_to_move == board[str]
+          && break_in(str, smaller_goal, &move))
+         || (color_to_move == OTHER_COLOR(board[str])
+            && !block_off(str, smaller_goal, NULL))) { 
+    /* Successful break-in/unsuccessful block. Now where exactly can we
+     * erase territory? This is difficult, and the method here is very
+     * crude: Wherever we enter the territory when computing the closest
+     * neighbors of (str). Plus at the location of the break-in move.
+     * FIXME: This needs improvement.
+     */
+    int k;
+    int save_num = *num_non_territory;
+    int affected_size = 0;
+    int cut_off_distance = FP(3.5);
+    if (ON_BOARD(move) && goal[move]) {
+      non_territory[(*num_non_territory)++] = move;
+      if (info_pos)
+       DEBUG(DEBUG_TERRITORY | DEBUG_BREAKIN,
+             "%1m: Erasing territory at %1m -a.\n", info_pos, move);
+      else
+       DEBUG(DEBUG_TERRITORY | DEBUG_BREAKIN,
+             "Erasing territory at %1m -a.\n", move);
+    }
+
+    for (k = 0; k < conn.queue_end; k++) {
+      int pos = conn.queue[k];
+      if (conn.distances[pos] > cut_off_distance + FP(0.31))
+       break;
+      if (goal[pos]
+         && (!ON_BOARD(conn.coming_from[pos])
+             || !goal[conn.coming_from[pos]])) {
+       non_territory[(*num_non_territory)++] = pos;
+       if (info_pos)
+         DEBUG(DEBUG_TERRITORY | DEBUG_BREAKIN,
+               "%1m: Erasing territory at %1m -b.\n", info_pos, pos);
+       else
+         DEBUG(DEBUG_TERRITORY | DEBUG_BREAKIN,
+               "Erasing territory at %1m -b.\n", pos);
+       if (conn.distances[pos] < cut_off_distance)
+         cut_off_distance = conn.distances[pos];
+      }
+      if (*num_non_territory >= save_num + 4)
+       break;
+    }
+
+    /* Shouldn't happen, but it does. */
+    if (*num_non_territory == save_num)
+      break;
+
+    for (k = save_num; k < *num_non_territory; k++) {
+      int j;
+      int pos = non_territory[k];
+      if (goal[pos]) {
+       affected_size++;
+       goal[pos] = 0;
+      }
+      for (j = 0; j < 4; j++)
+       if (ON_BOARD(pos + delta[j]) && goal[pos + delta[j]])
+         affected_size++;
+      /* Don't kill too much territory at a time. */
+      if (affected_size >= 5) {
+       *num_non_territory = k;
+       break;
+      }
+    }
+
+    compute_smaller_goal(OTHER_COLOR(board[str]), color_to_move,
+                        &conn, goal, smaller_goal);
+    DEBUG(DEBUG_BREAKIN, "Now trying to break to smaller goal:\n", str);
+    if (debug & DEBUG_BREAKIN)
+      goaldump(smaller_goal);
+
+    if (saved_move == NO_MOVE)
+      saved_move = move;
+  }
+  return saved_move;
+}
+
+#define MAX_TRIES 10
+
+static void
+break_in_goal(int color_to_move, int owner, signed char goal[BOARDMAX],
+             struct influence_data *q, int store, int info_pos)
+{
+  struct connection_data conn;
+  int k;
+  int intruder = OTHER_COLOR(owner);
+  signed char used[BOARDMAX];
+  int non_territory[BOARDMAX];
+  int num_non_territory = 0;
+  int candidate_strings[MAX_TRIES];
+  int candidates = 0;
+  int min_distance = FP(5.0);
+
+  DEBUG(DEBUG_BREAKIN,
+        "Trying to break (%C to move) %C's territory ", color_to_move, owner);
+  if (debug & DEBUG_BREAKIN)
+    goaldump(goal);
+  /* Compute nearby fields of goal. */
+  init_connection_data(intruder, goal, NO_MOVE, FP(3.01), &conn, 1);
+  k = conn.queue_end;
+  spread_connection_distances(intruder, &conn);
+  sort_connection_queue_tail(&conn);
+  if (0 && (debug & DEBUG_BREAKIN))
+    print_connection_distances(&conn);
+
+  /* Look for nearby stones. */
+  memset(used, 0, BOARDMAX);
+  for (; k < conn.queue_end; k++) {
+    int pos = conn.queue[k];
+    if (conn.distances[pos] > min_distance + FP(1.001))
+      break;
+    if (board[pos] == intruder
+       && influence_considered_lively(q, pos)) {
+      /* Discard this string in case the shortest path goes via a string
+       * that we have in the candidate list already.
+       */
+      int pos2 = pos;
+      while (ON_BOARD(pos2)) {
+        pos2 = conn.coming_from[pos2];
+       if (IS_STONE(board[pos2]))
+         pos2 = find_origin(pos2);
+
+       if (used[pos2])
+         break;
+      }
+
+      used[pos] = 1;
+      if (ON_BOARD(pos2))
+       continue;
+      if (candidates == 0)
+       min_distance = conn.distances[pos];
+      candidate_strings[candidates++] = pos;
+      if (candidates == MAX_TRIES)
+       break;
+    }
+  }
+
+  /* Finally, try the break-ins. */
+  memset(non_territory, 0, BOARDMAX);
+  for (k = 0; k < candidates; k++) {
+    int move = break_in_goal_from_str(candidate_strings[k], goal,
+                                    &num_non_territory, non_territory,
+                                    color_to_move, info_pos);
+    if (store && ON_BOARD(move) && num_break_ins < MAX_BREAK_INS) {
+      /* Remember the move as a possible move candidate for later. */
+      break_in_list[num_break_ins].str = candidate_strings[k];
+      break_in_list[num_break_ins].move = move;
+      num_break_ins++;
+    }
+  }
+
+  for (k = 0; k < num_non_territory; k++)
+    influence_erase_territory(q, non_territory[k], owner);
+  if (0 && num_non_territory > 0 && (debug & DEBUG_BREAKIN))
+    showboard(0);
+}
+
+
+/* The main function of this module. color_to_move is self-explanatory,
+ * and the influence_data refers to the influence territory evaluation that
+ * we are analyzing (and will be correcting). store indicates whether
+ * the successful break-ins should be stored in the break_in_list[] (which
+ * later gets used to generate move reasons).
+ */
+void
+break_territories(int color_to_move, struct influence_data *q, int store,
+                 int info_pos)
+{
+  struct moyo_data territories;
+  int k;
+
+  if (!experimental_break_in || get_level() < 10)
+    return;
+
+  influence_get_territory_segmentation(q, &territories);
+  for (k = 1; k <= territories.number; k++) {
+    signed char goal[BOARDMAX];
+    int pos;
+    int size = 0;
+
+    memset(goal, 0, BOARDMAX);
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos) && territories.segmentation[pos] == k) {
+       goal[pos] = 1;
+       if (board[pos] != territories.owner[k])
+         size++;
+      }
+    if (size < 10)
+      continue;
+
+    if (color_to_move == OTHER_COLOR(territories.owner[k]))
+      enlarge_goal(goal);
+    break_in_goal(color_to_move, territories.owner[k], goal, q, store,
+                 info_pos);
+  }
+}
+
+void
+clear_break_in_list()
+{
+  num_break_ins = 0;
+}
+
+/* The blocking moves should usually already have a move reason.
+ *
+ * The EXPAND_TERRITORY move reason ensures a territory evaluation of
+ * this move, without setting the move.safety field. (I.e. the move will
+ * be treated as a sacrifice move unless another move reasons tells us
+ * otherwise.)
+ */
+void
+break_in_move_reasons(int color)
+{
+  int k;
+  for (k = 0; k < num_break_ins; k++)
+    if (board[break_in_list[k].str] == color)
+      add_expand_territory_move(break_in_list[k].move);
+}
diff --git a/engine/cache.c b/engine/cache.c
new file mode 100644 (file)
index 0000000..c006fb2
--- /dev/null
@@ -0,0 +1,403 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "random.h"
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "cache.h"
+#include "sgftree.h"
+
+
+/* ================================================================ */
+/*                    The transposition table                       */
+/* ---------------------------------------------------------------- */
+
+static void tt_init(Transposition_table *table, int memsize);
+static void tt_clear(Transposition_table *table);
+
+/* The transposition table itself. */
+Transposition_table ttable;
+
+
+/* Arrays with random numbers for Zobrist hashing of input data (other
+ * than the board position). If you add an array here, do not forget
+ * to also initialize it in keyhash_init() below.
+ */
+static Hash_data target1_hash[BOARDMAX];
+static Hash_data target2_hash[BOARDMAX];
+static Hash_data routine_hash[NUM_CACHE_ROUTINES];
+
+static void
+keyhash_init(void)
+{
+  static int is_initialized = 0;
+  
+  if (!is_initialized) {
+    
+    INIT_ZOBRIST_ARRAY(target1_hash);
+    INIT_ZOBRIST_ARRAY(target2_hash);
+    INIT_ZOBRIST_ARRAY(routine_hash);
+    
+    is_initialized = 1;
+  }
+}
+
+static void
+calculate_hashval_for_tt(Hash_data *hashdata, int routine, int target1,
+                        int target2, Hash_data *extra_hash)
+{ 
+  *hashdata = board_hash;                /* from globals.c */
+  hashdata_xor(*hashdata, routine_hash[routine]);
+  hashdata_xor(*hashdata, target1_hash[target1]);
+  if (target2 != NO_MOVE)
+    hashdata_xor(*hashdata, target2_hash[target2]);
+  if (extra_hash)
+    hashdata_xor(*hashdata, *extra_hash);
+}
+
+
+
+/* Initialize the transposition table. Non-positive memsize means use
+ * the default size of DEFAULT_NUMBER_OF_CACHE_ENTRIES entries.
+ */
+
+static void
+tt_init(Transposition_table *table, int memsize)
+{
+  int num_entries;
+  /* Make sure the hash system is initialized. */
+  hash_init();
+  keyhash_init();
+
+  if (memsize > 0)
+    num_entries = memsize / sizeof(table->entries[0]);
+  else
+    num_entries = DEFAULT_NUMBER_OF_CACHE_ENTRIES;
+
+  table->num_entries = num_entries;
+  table->entries     = malloc(num_entries * sizeof(table->entries[0]));
+
+  if (table->entries == NULL) {
+    perror("Couldn't allocate memory for transposition table. \n");
+    exit(1);
+  }
+
+  table->is_clean = 0;
+  tt_clear(table);
+}
+
+
+/* Clear the transposition table. */
+
+static void
+tt_clear(Transposition_table *table)
+{
+  if (!table->is_clean) {
+    memset(table->entries, 0, table->num_entries * sizeof(table->entries[0]));
+    table->is_clean = 1;
+  }
+}
+/* Free the transposition table. */
+
+void
+tt_free(Transposition_table *table)
+{
+  free(table->entries);
+}
+
+
+/* Get result and move. Return value:
+ *   0 if not found
+ *   1 if found, but depth too small to be trusted.  In this case the move
+ *     can be used for move ordering.
+ *   2 if found and depth is enough so that the result can be trusted.
+ */
+int
+tt_get(Transposition_table *table, 
+       enum routine_id routine, 
+       int target1, int target2, int remaining_depth,
+       Hash_data *extra_hash,
+       int *value1, int *value2, int *move)
+{
+  Hash_data hashval;
+  Hashentry *entry;
+  Hashnode *node;
+  /* Sanity check. */
+  if (remaining_depth < 0 || remaining_depth > HN_MAX_REMAINING_DEPTH)
+    return 0;
+
+  /* Get the combined hash value. */
+  calculate_hashval_for_tt(&hashval, routine, target1, target2, extra_hash);
+
+  /* Get the correct entry and node. */
+  entry = &table->entries[hashdata_remainder(hashval, table->num_entries)];
+  if (hashdata_is_equal(hashval, entry->deepest.key))
+    node = &entry->deepest;
+  else if (hashdata_is_equal(hashval, entry->newest.key))
+    node = &entry->newest;
+  else
+    return 0;
+
+  stats.read_result_hits++;
+
+  /* Return data.  Only set the result if remaining depth in the table
+   * is big enough to be trusted.  The move can always be used for move
+   * ordering if nothing else.
+   */
+  if (move)
+    *move = hn_get_move(node->data);
+  if (remaining_depth <= (int) hn_get_remaining_depth(node->data)) {
+    if (value1)
+      *value1 = hn_get_value1(node->data);
+    if (value2)
+      *value2 = hn_get_value2(node->data);
+    stats.trusted_read_result_hits++;
+    return 2;
+  }
+
+  return 1;
+}
+
+
+/* Update a transposition table entry.
+ */
+
+void
+tt_update(Transposition_table *table,
+         enum routine_id routine, int target1, int target2,
+         int remaining_depth, Hash_data *extra_hash, 
+         int value1, int value2, int move)
+{
+  Hash_data hashval;
+  Hashentry *entry;
+  Hashnode *deepest;
+  Hashnode *newest;
+  unsigned int data;
+  /* Get routine costs definitions from liberty.h. */
+  static const int routine_costs[] = { ROUTINE_COSTS };
+  gg_assert(routine_costs[NUM_CACHE_ROUTINES] == -1);
+
+  /* Sanity check. */
+  if (remaining_depth < 0 || remaining_depth > HN_MAX_REMAINING_DEPTH)
+    return;
+
+  /* Get the combined hash value. */
+  calculate_hashval_for_tt(&hashval, routine, target1, target2, extra_hash);
+
+  data = hn_create_data(remaining_depth, value1, value2, move,
+                       routine_costs[routine]);
+
+  /* Get the entry and nodes. */ 
+  entry = &table->entries[hashdata_remainder(hashval, table->num_entries)];
+  deepest = &entry->deepest;
+  newest  = &entry->newest;
+  /* See if we found an already existing node. */
+  if (hashdata_is_equal(hashval, deepest->key)
+      && remaining_depth >= (int) hn_get_remaining_depth(deepest->data)) {
+
+    /* Found deepest */
+    deepest->data = data;
+
+  }
+  else if (hashdata_is_equal(hashval, newest->key)
+           && remaining_depth >= (int) hn_get_remaining_depth(newest->data)) {
+
+    /* Found newest */
+    newest->data = data;
+
+    /* If newest has become deeper than deepest, then switch them. */
+    if (hn_get_remaining_depth(newest->data)
+       > hn_get_remaining_depth(deepest->data)) {
+      Hashnode temp;
+
+      temp = *deepest;
+      *deepest = *newest;
+      *newest = temp;
+    }
+
+  }
+  else if (hn_get_total_cost(data) > hn_get_total_cost(deepest->data)) {
+    if (hn_get_total_cost(newest->data) < hn_get_total_cost(deepest->data))
+      *newest = *deepest;
+    deepest->key  = hashval;
+    deepest->data = data;
+  } 
+  else {
+    /* Replace newest. */
+    newest->key  = hashval;
+    newest->data = data;
+  }
+
+  stats.read_result_entered++;
+  table->is_clean = 0;
+}
+
+
+static const char *routine_names[] = {
+  ROUTINE_NAMES
+};
+
+/* Convert a routine as used in the cache table to a string. */
+const char *
+routine_id_to_string(enum routine_id routine)
+{
+  return routine_names[(int) routine];
+}
+
+
+/* Initialize the cache for read results, using at most the given
+ * number of bytes of memory. If the memory isn't sufficient to
+ * allocate a single node or if the allocation fails, the caching is
+ * disabled.
+ */
+void
+reading_cache_init(int bytes)
+{
+  tt_init(&ttable, bytes);
+}
+
+
+/* Clear the cache for read results. */
+void
+reading_cache_clear()
+{
+  tt_clear(&ttable);
+}
+
+float
+reading_cache_default_size()
+{
+  return DEFAULT_NUMBER_OF_CACHE_ENTRIES * sizeof(Hashentry) / 1024.0 / 1024.0;
+}
+
+
+/* Write reading trace data to an SGF file. Normally called through the
+ * macro SGFTRACE in cache.h.
+ */
+
+void
+sgf_trace(const char *func, int str, int move, int result,
+         const char *message)
+{
+  char buf[100];
+
+  sprintf(buf, "%s %c%d: ", func, J(str) + 'A' + (J(str) >= 8),
+         board_size - I(str));
+  
+  if (result == 0)
+    sprintf(buf + strlen(buf), "0");
+  else if (ON_BOARD(move))
+    sprintf(buf + strlen(buf), "%s %c%d", result_to_string(result), 
+           J(move) + 'A' + (J(move) >= 8),
+           board_size - I(move));
+  else if (is_pass(move))
+    sprintf(buf + strlen(buf), "%s PASS", result_to_string(result));
+  else
+    sprintf(buf + strlen(buf), "%s [%d]", result_to_string(result), move);
+
+  if (message)
+    sprintf(buf + strlen(buf), " (%s)", message);
+  
+  sgftreeAddComment(sgf_dumptree, buf);
+}
+
+/* Write two group reading (connection) trace data to an SGF file.
+ * Normally called through the macro SGFTRACE2 in cache.h.
+ */
+
+void
+sgf_trace2(const char *func, int str1, int str2, int move, 
+           const char *result, const char *message)
+{
+  char buf[100];
+
+  sprintf(buf, "%s %c%d %c%d: ", func,
+         J(str1) + 'A' + (J(str1) >= 8), board_size - I(str1),
+         J(str2) + 'A' + (J(str2) >= 8), board_size - I(str2));
+  
+  if (ON_BOARD(move))
+    sprintf(buf + strlen(buf), "%s %c%d", result,
+           J(move) + 'A' + (J(move) >= 8),
+           board_size - I(move));
+  else if (is_pass(move))
+    sprintf(buf + strlen(buf), "%s PASS", result);
+  else
+    sprintf(buf + strlen(buf), "%s [%d]", result, move);
+
+  if (message)
+    sprintf(buf + strlen(buf), " (%s)", message);
+  
+  sgftreeAddComment(sgf_dumptree, buf);
+}
+
+/* Write semeai reading trace data to an SGF file. Normally called
+ * through the macro SGFTRACE_SEMEAI in cache.h.
+ */
+
+void
+sgf_trace_semeai(const char *func, int str1, int str2, int move, 
+                int result1, int result2, const char *message)
+{
+  char buf[100];
+
+  sprintf(buf, "%s %c%d %c%d: ", func,
+         J(str1) + 'A' + (J(str1) >= 8), board_size - I(str1),
+         J(str2) + 'A' + (J(str2) >= 8), board_size - I(str2));
+  
+  if (ON_BOARD(move))
+    sprintf(buf + strlen(buf), "%s %s %c%d",
+           result_to_string(result1), result_to_string(result2),
+           J(move) + 'A' + (J(move) >= 8), board_size - I(move));
+  else if (is_pass(move))
+    sprintf(buf + strlen(buf), "%s %s PASS",
+           result_to_string(result1), result_to_string(result2));
+  else
+    sprintf(buf + strlen(buf), "%s %s [%d]",
+           result_to_string(result1), result_to_string(result2),
+           move);
+
+  if (message)
+    sprintf(buf + strlen(buf), " (%s)", message);
+  
+  sgftreeAddComment(sgf_dumptree, buf);
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/cache.h b/engine/cache.h
new file mode 100644 (file)
index 0000000..f63f2d9
--- /dev/null
@@ -0,0 +1,377 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _CACHE_H_
+#define _CACHE_H_
+
+#include <stdio.h>
+#include "hash.h"
+
+/*
+ * This file, together with engine/hash.c implements hashing of go positions
+ * using a method known as Zobrist hashing.  See the Texinfo documentation
+ * (Reading/Hashing) for more information.  
+ */
+
+
+/* Hashnode: a node stored in the transposition table.
+ *
+ * In addition to the position, the hash lock encodes the following data,
+ * all hashed:
+ *   komaster
+ *   kom_pos
+ *   routine
+ *   str1
+ *   str2
+ *   extra hashvalue, optional (e.g. encoding a goal array)
+ *
+ * The data field packs into 32 bits the following
+ * fields:
+ *
+ *   RESERVED       :  5 bits
+ *   value1         :  4 bits
+ *   value2         :  4 bits
+ *   move           : 10 bits
+ *   cost           :  4 bits
+ *   remaining_depth:  5 bits (depth - stackp)  NOTE: HN_MAX_REMAINING_DEPTH
+ *
+ *   The last 9 bits together give an index for the total costs.
+ */
+typedef struct {
+  Hash_data key;
+  unsigned int data; /* Should be 32 bits, but only wastes 25% if 64 bits. */
+} Hashnode;
+
+#define HN_MAX_REMAINING_DEPTH 31
+
+
+/* Hashentry: an entry, with two nodes of the hash_table
+ */
+typedef struct {
+  Hashnode deepest;
+  Hashnode newest;
+} Hashentry;
+
+/* Hn is for hash node. */
+#define hn_get_value1(hn)           ((hn >> 23) & 0x0f)
+#define hn_get_value2(hn)           ((hn >> 19) & 0x0f)
+#define hn_get_move(hn)             ((hn >>  9) & 0x3ff)
+#define hn_get_cost(hn)             ((hn >>  5) & 0x0f)
+#define hn_get_remaining_depth(hn)  ((hn >>  0) & 0x1f)
+#define hn_get_total_cost(hn)       ((hn >>  0) & 0x1ff)
+
+#define hn_create_data(remaining_depth, value1, value2, move, cost) \
+    ((((value1)         & 0x0f)  << 23) \
+   | (((value2)         & 0x0f)  << 19) \
+   | (((move)           & 0x3ff) <<  9) \
+   | (((cost)           & 0x0f)  <<  5) \
+   | (((remaining_depth & 0x1f)  <<  0)))
+
+
+/* Transposition_table: transposition table used for caching. */
+typedef struct {
+  unsigned int num_entries;
+  Hashentry *entries;
+  int is_clean;
+} Transposition_table;
+
+extern Transposition_table ttable;
+
+/* Number of cache entries to use by default if no cache memory usage
+ * has been set explicitly.
+ */
+#define DEFAULT_NUMBER_OF_CACHE_ENTRIES 350000
+
+void tt_free(Transposition_table *table);
+int  tt_get(Transposition_table *table, enum routine_id routine,
+           int target1, int target2, int remaining_depth,
+           Hash_data *extra_hash,
+           int *value1, int *value2, int *move);
+void tt_update(Transposition_table *table, enum routine_id routine,
+              int target, int target2, int remaining_depth,
+              Hash_data *extra_hash,
+              int value1, int value2, int move);
+
+
+/* ================================================================ */
+
+
+/* Macros used from reading.c, readconnect.c, and owl.c to store and
+ * retrieve read results.
+ */
+
+#if TRACE_READ_RESULTS
+
+#define TRACE_CACHED_RESULT(result, move) \
+      gprintf("%o%s %1m %d %d %1m (cached) ", read_function_name, \
+             q, stackp, result, move); \
+      dump_stack();
+
+#define TRACE_CACHED_RESULT2(result1, result2, move) \
+      gprintf("%o%s %1m %1m %d %d %d %1m (cached) ", read_function_name, \
+             q1, q2, stackp, result1, result2, move); \
+      dump_stack();
+
+
+#define SETUP_TRACE_INFO(name, str) \
+  const char *read_function_name = name; \
+  int q = find_origin(str);
+
+#define SETUP_TRACE_INFO2(name, str1, str2) \
+  const char *read_function_name = name; \
+  int q1 = board[str1] == EMPTY ? str1 : find_origin(str1); \
+  int q2 = board[str2] == EMPTY ? str2 : find_origin(str2);
+
+#else
+
+#define TRACE_CACHED_RESULT(result, move)
+#define TRACE_CACHED_RESULT2(result1, result2, move)
+
+#define SETUP_TRACE_INFO(name, str) \
+  const char *read_function_name = name; \
+  int q = str;
+
+#define SETUP_TRACE_INFO2(name, str1, str2) \
+  const char *read_function_name = name; \
+  int q1 = str1; \
+  int q2 = str2;
+
+#endif
+
+/* Trace messages in decidestring/decidedragon sgf file. */
+void sgf_trace(const char *func, int str, int move, int result,
+              const char *message);
+/* Trace messages in decideconnection sgf file. */
+void sgf_trace2(const char *func, int str1, int str2, int move, 
+               const char *result, const char *message);
+/* Trace messages in decidesemeai sgf file. */
+void sgf_trace_semeai(const char *func, int str1, int str2, int move, 
+                     int result1, int result2, const char *message);
+
+/* Macro to hide the call to sgf_trace(). Notice that a little black
+ * magic is going on here. Before using this macro, SETUP_TRACE_INFO
+ * must have been called to provide the variables read_function_name
+ * and q. These must of course not be used for anything else in
+ * the function.
+ */
+#define SGFTRACE(move, result, message) \
+  if (sgf_dumptree) \
+    sgf_trace(read_function_name, q, move, result, message)
+
+/* Corresponding macro for use in connection or semeai reading, where
+ * two groups are involved.
+ */
+#define SGFTRACE2(move, result, message) \
+  if (sgf_dumptree) \
+    sgf_trace2(read_function_name, q1, q2, move, \
+              result_to_string(result), message)
+
+#define SGFTRACE_SEMEAI(move, result1, result2, message) \
+  if (sgf_dumptree) \
+    sgf_trace_semeai(read_function_name, q1, q2, move, \
+                    result1, result2, message)
+
+
+/* ================================================================ */
+
+/*
+ * These macros should be used in all the places where we want to
+ * return a result from a reading function and where we want to
+ * store the result in the hash table at the same time.
+ */
+
+#if !TRACE_READ_RESULTS
+
+#define READ_RETURN0(routine, str, remaining_depth) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, NULL,\
+             0, 0, NO_MOVE);\
+    return 0; \
+  } while (0)
+
+#define READ_RETURN(routine, str, remaining_depth, point, move, value) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, NULL,\
+              value, 0, move);\
+    if ((value) != 0 && (point) != 0) *(point) = (move); \
+    return (value); \
+  } while (0)
+
+#define READ_RETURN_SEMEAI(routine, str1, str2, remaining_depth, point, move, value1, value2) \
+  do { \
+    tt_update(&ttable, routine, str1, str2, remaining_depth, NULL, \
+              value1, value2, move); \
+    if ((value1) != 0 && (point) != 0) *(point) = (move); \
+    return; \
+  } while (0)
+
+#define READ_RETURN_CONN(routine, str1, str2, remaining_depth, point, move, value) \
+  do { \
+    tt_update(&ttable, routine, str1, str2, remaining_depth, NULL,\
+              value, 0, move);\
+    if ((value) != 0 && (point) != 0) *(point) = (move); \
+    return (value); \
+  } while (0)
+
+#define READ_RETURN_HASH(routine, str, remaining_depth, hash, point, move, value) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, hash,\
+              value, 0, move);\
+    if ((value) != 0 && (point) != 0) *(point) = (move); \
+    return (value); \
+  } while (0)
+
+#define READ_RETURN2(routine, str, remaining_depth, point, move, value1, value2) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, NULL,\
+              value1, value2, move);\
+    if ((value1) != 0 && (point) != 0) *(point) = (move); \
+    return (value1); \
+  } while (0)
+
+#else /* !TRACE_READ_RESULTS */
+
+#define READ_RETURN0(routine, str, remaining_depth) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, NULL,\
+             0, 0, NO_MOVE);\
+    gprintf("%o%s %1m %d 0 0 ", read_function_name, q, stackp); \
+    dump_stack(); \
+    return 0; \
+  } while (0)
+
+#define READ_RETURN(routine, str, remaining_depth, point, move, value) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, NULL,\
+              value, 0, move);\
+    if ((value) != 0 && (point) != 0) *(point) = (move); \
+    gprintf("%o%s %1m %d %d %1m ", read_function_name, q, stackp, \
+           (value), (move)); \
+    dump_stack(); \
+    return (value); \
+  } while (0)
+
+#define READ_RETURN_SEMEAI(routine, str1, str2, remaining_depth, point, move, value1, value2) \
+  do { \
+    tt_update(&ttable, routine, str1, str2, remaining_depth, NULL, \
+              value1, value2, move); \
+    if ((value1) != 0 && (point) != 0) *(point) = (move); \
+    gprintf("%o%s %1m %1m %d %d %d %1m ", read_function_name, q1, q2, stackp, \
+           (value1), (value2), (move)); \
+    dump_stack(); \
+    return; \
+  } while (0)
+
+#define READ_RETURN_CONN(routine, str1, str2, remaining_depth, point, move, value) \
+  do { \
+    tt_update(&ttable, routine, str1, str2, remaining_depth, NULL,\
+              value, 0, move);\
+    if ((value) != 0 && (point) != 0) *(point) = (move); \
+    gprintf("%o%s %1m %1m %d %d %1m ", read_function_name, q1, q2, stackp, \
+           (value), (move)); \
+    dump_stack(); \
+    return (value); \
+  } while (0)
+
+#define READ_RETURN_HASH(routine, str, remaining_depth, hash, point, move, value) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, hash,\
+              value, 0, move);\
+    if ((value) != 0 && (point) != 0) *(point) = (move); \
+    gprintf("%o%s %1m %d %d %1m ", read_function_name, q, stackp, \
+           (value), (move)); \
+    dump_stack(); \
+    return (value); \
+  } while (0)
+
+#define READ_RETURN2(routine, str, remaining_depth, point, move, value1, value2) \
+  do { \
+    tt_update(&ttable, routine, str, NO_MOVE, remaining_depth, NULL,\
+              value1, value2, move);\
+    if ((value1) != 0 && (point) != 0) *(point) = (move); \
+    gprintf("%o%s %1m %d %d %1m ", read_function_name, q, stackp, \
+           (value1), (move)); \
+    dump_stack(); \
+    return (value1); \
+  } while (0)
+
+#endif
+
+
+/* ================================================================ */
+/* This has actually nothing to do with caching, but is useful in
+ * the same places where the caching is.
+ */
+  
+/* Macro to use when saving ko results while continuing to look for an
+ * unconditional result. It's assumed that we have tried the move at
+ * (move) and then called an attack or defense function giving the
+ * result passed in the code parameter.
+ *
+ * In general we prefer not to have to do the first ko threat. Thus a
+ * savecode KO_A is always better than a savecode KO_B. Also we always
+ * prefer to keep the old move if we get the same savecode once more,
+ * on the assumption that the moves have been ordered with the
+ * presumably best one first.
+ *
+ * Notice that the savecode may be either 0 (nothing found so far), KO_B
+ * or KO_A. Occasionally savecode WIN is also used, indicating an effective
+ * but not preferred move, typically because it's either a sacrifice
+ * or a backfilling move. If possible, we prefer making non-sacrifice
+ * and direct moves. Of course savecode WIN is better than KO_A or KO_B.
+ */
+
+#define UPDATE_SAVED_KO_RESULT(savecode, save, code, move) \
+  if (code != 0 && REVERSE_RESULT(code) > savecode) { \
+    save = move; \
+    savecode = REVERSE_RESULT(code); \
+  } \
+
+/* Same as above, except this should be used when there's no
+ * intervening trymove(). Thus we shouldn't reverse the save code.
+ */
+#define UPDATE_SAVED_KO_RESULT_UNREVERSED(savecode, save, code, move) \
+  if (code != WIN && code > savecode) { \
+    save = move; \
+    savecode = code; \
+  }
+
+
+/* This too isn't really related to caching but is convenient to have here.
+ * (Needs to be available in reading.c and persistent.c.)
+ *
+ * Minimum number of nodes for which DEBUG_READING_PERFORMANCE reports
+ * anything.
+ */
+#define MIN_READING_NODES_TO_REPORT 1000
+
+
+#endif /* _CACHE_H_ */
+
+  
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/clock.c b/engine/clock.c
new file mode 100644 (file)
index 0000000..90e2440
--- /dev/null
@@ -0,0 +1,414 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* ============================================================= *\
+ *                        Time handling                          *
+ *                          for GNU Go                           *
+ *                         __       __                           *
+ *                        <  >     <  >                          *
+ *                      +--++-------++--+                        *
+ *                      |  .'11 12 1'.  |                        *
+ *                      |  :10 \    2:  |                        *
+ *                      |  :9   @-> 3:  |                        *
+ *                      |  :8       4;  |                        *
+ *                      |  '..7 6 5..'  |                        *
+ *                      |_______________|                        *
+ *                                                               *
+\* ============================================================= */
+
+#include "clock.h"
+#include "gg_utils.h"
+#include "board.h"
+
+/* Level data */
+static int level             = DEFAULT_LEVEL; /* current level */
+static int level_offset      = 0;
+static int min_level         = 0;
+static int max_level         = gg_max(DEFAULT_LEVEL, 10);
+
+
+/*************************/
+/* Datas and other stuff */
+/*************************/
+
+/* clock parameters */
+static int main_time = -1;
+static int byoyomi_time = -1;
+static int byoyomi_stones = -1; /* <= 0 if no byo-yomi */
+
+/* Keep track of the remaining time left.
+ * If stones_left is zero, .._time_left is the remaining main time.
+ * Otherwise, the remaining time for this byoyomi period.
+ */
+struct remaining_time_data {
+  double time_left;
+  double time_for_last_move;
+  int stones;
+  int movenum;
+  int in_byoyomi;
+};
+
+struct timer_data {
+  struct remaining_time_data official;
+  struct remaining_time_data estimated;
+  int time_out;
+};
+
+static struct timer_data black_time_data;
+static struct timer_data white_time_data;
+
+
+/* Echo a time value in STANDARD format */
+static void
+timeval_print(FILE *outfile, double tv)
+{
+  int min;
+  double sec;
+
+  min = (int) tv / 60;
+  sec = tv - min*60;
+
+  fprintf(outfile, "%3dmin %.2fsec ", min, sec);
+}
+
+
+/* Print the clock status for one side. */
+void
+clock_print(int color)
+{
+  struct timer_data *const td
+    = (color == BLACK) ? &black_time_data : &white_time_data;
+
+  fprintf(stderr, "clock: "); 
+  fprintf(stderr, "%s ", color_to_string(color));
+
+  if (td->time_out)
+    fprintf(stderr, "TIME OUT! ");
+  else {
+    if (td->estimated.in_byoyomi) {
+      fprintf(stderr, "byoyomi");
+      timeval_print(stderr, td->estimated.time_left);
+      fprintf(stderr, "for %d stones.", td->estimated.stones);
+    }
+    else
+      timeval_print(stderr, td->estimated.time_left);
+
+  }
+  fprintf(stderr, "\n");
+}
+
+
+/******************************/
+/*  Initialization functions  */
+/******************************/
+
+/*
+ * Initialize the time settings for this game.
+ * -1 means "do not modify this value".
+ *
+ *  byo_time > 0 and byo_stones == 0 means no time settings.
+ */
+void
+clock_settings(int time, int byo_time, int byo_stones)
+{
+  if (time >= 0)
+    main_time = time;
+  if (byo_time >= 0)
+    byoyomi_time = byo_time;
+  if (byo_stones >= 0)
+    byoyomi_stones = byo_stones;
+  init_timers();
+}
+
+/* Get time settings. Returns 1 if any time settings have been made,
+ * 0 otherwise.
+ */
+int
+have_time_settings(void)
+{
+  /* According to the semantics of the GTP command 'time_settings', the
+   * following signifies no time limits.
+   */
+  if (byoyomi_time > 0 && byoyomi_stones == 0)
+    return 0;
+  else
+    return (main_time >= 0 || byoyomi_time >= 0);
+}
+
+
+/* Initialize all timers. */
+void
+init_timers()
+{
+  white_time_data.official.time_left = main_time;
+  white_time_data.official.time_for_last_move = -1.0;
+  white_time_data.official.stones = 0;
+  white_time_data.official.movenum = 0;
+  white_time_data.official.in_byoyomi = 0;
+  white_time_data.estimated = white_time_data.official;
+  white_time_data.time_out = 0;
+  black_time_data = white_time_data;
+
+  level_offset = 0;
+}
+
+
+/*****************************/
+/*  Clock access functions.  */
+/*****************************/
+
+
+void
+update_time_left(int color, int time_left, int stones)
+{
+  struct timer_data *const td
+    = ((color == BLACK) ? &black_time_data : &white_time_data);
+  int time_used = td->official.time_left - time_left;
+
+  if (time_left > 0)
+    td->time_out = 0;
+  else 
+    td->time_out = 1;
+
+  /* Did our estimate for time usage go wrong? */
+  if (time_used > 0
+      && gg_abs(time_used - td->estimated.time_for_last_move) >= 1.0)
+    td->estimated.time_for_last_move = time_used;
+  td->estimated.stones = stones;
+  td->estimated.movenum = movenum;
+  /* Did our clock go wrong? */
+  if (gg_abs(td->estimated.time_left - time_left) >= 1.0)
+    td->estimated.time_left = time_left;
+  if (stones > 0)
+    td->estimated.in_byoyomi = 1;
+  else
+    td->estimated.in_byoyomi = 0;
+
+  td->official.stones = stones;
+  td->official.movenum = movenum;
+  td->official.time_for_last_move = td->official.time_for_last_move - time_left;
+  td->official.time_left = time_left;
+  td->official.in_byoyomi = td->estimated.in_byoyomi;
+}
+
+/*
+ * Update the estimated timer after a move has been made.
+ */
+void
+clock_push_button(int color)
+{
+  static double last_time = -1.0;
+  static int last_movenum = -1;
+  struct timer_data *const td
+    = (color == BLACK) ? &black_time_data : &white_time_data;
+  double now = gg_gettimeofday();
+
+  if (!have_time_settings())
+    return;
+
+  if (last_movenum >= 0
+      && movenum == last_movenum + 1
+      && movenum > td->estimated.movenum) {
+    double time_used = now - last_time;
+    td->estimated.time_left -= time_used;
+    td->estimated.movenum = movenum;
+    td->estimated.time_for_last_move = time_used;
+    if (td->estimated.time_left < 0) {
+      if (td->estimated.in_byoyomi || byoyomi_stones == 0) {
+       DEBUG(DEBUG_TIME, "%s ran out of time.\n", color_to_string(color));
+       if (debug & DEBUG_TIME)
+         clock_print(color);
+       td->time_out = 1;
+      }
+      else {
+       /* Entering byoyomi. */
+       gg_assert(!(td->estimated.in_byoyomi));
+       td->estimated.in_byoyomi = 1;
+       td->estimated.stones = byoyomi_stones - 1;
+       td->estimated.time_left += byoyomi_time;
+       if (td->estimated.time_left < 0)
+         td->time_out = 1;
+      }
+    }
+    else if (td->estimated.stones > 0) {
+      gg_assert(td->estimated.in_byoyomi);
+      td->estimated.stones = td->estimated.stones - 1;
+      if (td->estimated.stones == 0) {
+       td->estimated.time_left = byoyomi_time;
+       td->estimated.stones = byoyomi_stones;
+      }
+    }
+  }
+
+  last_movenum = movenum;
+  last_time = now;
+
+  /* Update main timer. */
+  if (debug & DEBUG_TIME)
+    clock_print(color);
+}
+
+
+/**********************/
+/*  Autolevel system  */
+/**********************/
+
+
+/* Analyze the two most recent time reports and determine the time
+ * spent on the last moves, the (effective) number of stones left and
+ * the (effective) remaining time.
+ */
+static int
+analyze_time_data(int color, double *time_for_last_move, double *time_left,
+                 int *stones_left)
+{
+  struct remaining_time_data *const timer
+    = (color == BLACK) ? &black_time_data.estimated
+                      : &white_time_data.estimated;
+
+  /* Do we have any time limits. */
+  if (!have_time_settings())
+    return 0;
+
+  /* If we don't have consistent time information yet, just return. */
+  if (timer->time_for_last_move < 0.0)
+    return 0;
+
+  *time_for_last_move = timer->time_for_last_move;
+
+  if (timer->stones == 0) {
+    /* Main time running. */
+    *time_left = timer->time_left + byoyomi_time;
+    if (byoyomi_time > 0)
+      *stones_left = byoyomi_stones;
+    else {
+      /* Absolute time. Here we aim to be able to play at least X more
+       * moves or a total of Y moves. We choose Y as a third of the
+       * number of vertices and X as 40% of Y. For 19x19 this means
+       * that we aim to play at least a total of 120 moves
+       * (corresponding to a 240 move game) or another 24 moves.
+       *
+       * FIXME: Maybe we should use the game_status of
+       * influence_evaluate_position() here to guess how many moves
+       * are remaining.
+       */
+      int nominal_moves = board_size * board_size / 3;
+      *stones_left = gg_max(nominal_moves - movenum / 2,
+                           2 * nominal_moves / 5);
+    }
+  }
+  else {
+    *time_left = timer->time_left;
+    *stones_left = timer->stones;
+  }
+  return 1;
+}
+
+
+/* Adjust the level offset given information of current playing speed
+ * and remaining time and stones.
+ */
+void
+adjust_level_offset(int color)
+{
+  double time_for_last_move;
+  double time_left;
+  int stones_left;
+
+  if (!analyze_time_data(color, &time_for_last_move, &time_left, &stones_left))
+    return;
+
+
+  /* These rules are both crude and ad hoc.
+   *
+   * FIXME: Use rules with at least some theoretical basis.
+   */
+  if (time_left < time_for_last_move * (stones_left + 3))
+    level_offset--;
+  if (time_left < time_for_last_move * stones_left)
+    level_offset--;
+  if (3 * time_left < 2 * time_for_last_move * stones_left)
+    level_offset--;
+  if (2 * time_left < time_for_last_move * stones_left)
+    level_offset--;
+  if (3 * time_left < time_for_last_move * stones_left)
+    level_offset--;
+
+  if (time_for_last_move == 0)
+    time_for_last_move = 1;
+  if (time_left > time_for_last_move * (stones_left + 6))
+    level_offset++;
+  if (time_left > 2 * time_for_last_move * (stones_left + 6))
+    level_offset++;
+
+  if (level + level_offset < min_level)
+    level_offset = min_level - level;
+
+  if (level + level_offset > max_level)
+    level_offset = max_level - level;
+
+  DEBUG(DEBUG_TIME, "New level %d (%d %C %f %f %d)\n", level + level_offset,
+       movenum / 2, color, time_for_last_move, time_left, stones_left);
+}
+
+
+/********************************/
+/* Interface to level settings. */
+/********************************/
+
+int
+get_level()
+{
+  return level + level_offset;
+}
+
+void
+set_level(int new_level)
+{
+  level = new_level;
+  level_offset = 0;
+  if (level > max_level)
+    max_level = level;
+  if (level < min_level)
+    min_level = level;
+}
+
+void
+set_max_level(int new_max)
+{
+  max_level = new_max;
+}
+
+void
+set_min_level(int new_min)
+{
+  min_level = new_min;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/clock.h b/engine/clock.h
new file mode 100644 (file)
index 0000000..95de82b
--- /dev/null
@@ -0,0 +1,50 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _CLOCK_H_
+#define _CLOCK_H_
+
+#include "gnugo.h"
+
+/* initialization and activation */
+void clock_settings(int maintime, int byotime, int byostones);
+void init_timers(void);
+/* main access */
+void clock_push_button(int color);
+void update_time_left(int color, int time_left, int stones);
+void clock_print(int color);
+int have_time_settings(void);
+
+void adjust_level_offset(int color);
+
+/* Access to level settings. */
+int get_level(void);
+void set_level(int new_level);
+void set_max_level(int new_max);
+void set_min_level(int new_min);
+
+
+#endif  /* _CLOCK_H_ */
+
+
diff --git a/engine/combination.c b/engine/combination.c
new file mode 100644 (file)
index 0000000..8535f05
--- /dev/null
@@ -0,0 +1,1591 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* This file contains functions that deals with threats and, 
+ * especially, combinations of threats.
+ */
+
+#include "gnugo.h"
+
+#include <string.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+#include "patterns.h"
+
+
+static void find_double_threats(int color);
+
+/* Generate move reasons for combination attacks and defenses against
+ * them.
+ *
+ * This is one of the move generators called from genmove().
+ */
+
+void
+combinations(int color)
+{
+  int save_verbose;
+  int attack_point;
+  signed char defense_points[BOARDMAX];
+  int other = OTHER_COLOR(color);
+  int aa_val;
+
+  /* Find intersections with multiple threats. */
+  find_double_threats(color);
+
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+
+  if (save_verbose)
+    gprintf("\nlooking for combination attacks ...\n");
+  
+  aa_val = atari_atari(color, &attack_point, NULL, save_verbose);
+  if (aa_val > 0) {
+    if (save_verbose)
+      gprintf("Combination attack for %C with size %d found at %1m\n",
+             color, aa_val, attack_point);
+    add_my_atari_atari_move(attack_point, aa_val);
+  }
+  
+  aa_val = atari_atari(other, &attack_point, defense_points, save_verbose);
+  if (aa_val > 0) {
+    int pos;
+    if (save_verbose)
+      gprintf("Combination attack for %C with size %d found at %1m\n",
+             other, aa_val, attack_point);
+    
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (ON_BOARD(pos) && defense_points[pos]) {
+       add_your_atari_atari_move(pos, aa_val);
+       if (save_verbose)
+         gprintf("- defense at %1m\n", pos);
+      }
+    }
+  }
+  verbose = save_verbose;
+}
+
+
+#define MAX_THREATENED_STRINGS  10  /* Should be enough for one intersection */
+
+static void
+find_double_threats(int color)
+{
+  int ii;
+  int k;
+  int l;
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    int num_a_threatened_groups;
+    int a_threatened_groups[MAX_THREATENED_STRINGS];
+#if 0
+    int num_d_threatened_groups;
+    int d_threatened_groups[MAX_THREATENED_STRINGS];
+#endif
+
+    if (!ON_BOARD(ii))
+      continue;
+
+    /* Generate an EITHER_MOVE move reasons for each pair of the 
+     * threatened strings.  We must also remove the threats, because
+     * otherwise we would get followup points for them as well.
+     *
+     * FIXME: 
+     *   - This is perhaps not the best way to do it, but realistically
+     *     it will be seldom that more than two strings are threatened
+     *     at the same point.  Still, we should find a better way.
+     *   - EITHER_MOVE should be generalized to more than two strings.
+     */
+    num_a_threatened_groups = get_attack_threats(ii, MAX_THREATENED_STRINGS,
+                                                a_threatened_groups);
+    if (num_a_threatened_groups > 1) {
+      if (trymove(ii, color, "find_double_threats-A", ii)) {
+       for (k = 0; k < num_a_threatened_groups - 1; ++k)
+         for (l = k + 1; l < num_a_threatened_groups; ++l) {
+           /* Note: If we used attack_either() here instead of trymove()
+            *       and !defend_both(), we would not make use of the fact
+            *       that we already know of a common threat point for
+            *       the two strings.
+            * Besides, attack_either is currently (3.1.11) not very good.
+            *
+            * The call to attack() is intended to detect the case
+            * where the move at ii is a snapback capture.
+            */
+           if (board[a_threatened_groups[k]] == EMPTY
+               || board[a_threatened_groups[l]] == EMPTY) {
+             if (!attack(ii, NULL)) {
+               TRACE("Double threat at %1m, either %1m or %1m attacked.\n",
+                     ii, a_threatened_groups[k], a_threatened_groups[l]);
+               add_either_move(ii, ATTACK_STRING, a_threatened_groups[k],
+                               ATTACK_STRING, a_threatened_groups[l]);
+               remove_attack_threat_move(ii, a_threatened_groups[k]);
+               remove_attack_threat_move(ii, a_threatened_groups[l]);
+             }
+           }
+           else if (!defend_both(a_threatened_groups[k],
+                                 a_threatened_groups[l])) {
+             TRACE("Double threat at %1m, either %1m or %1m attacked.\n",
+                   ii, a_threatened_groups[k], a_threatened_groups[l]);
+             add_either_move(ii, ATTACK_STRING, a_threatened_groups[k],
+                             ATTACK_STRING, a_threatened_groups[l]);
+             remove_attack_threat_move(ii, a_threatened_groups[k]);
+             remove_attack_threat_move(ii, a_threatened_groups[l]);
+           }
+         }
+       popgo();
+      }
+    }
+  }
+  
+  
+  /* FIXME:
+   *   TODO:
+   *     - defense threats
+   *     - combinations of owl threats and other threats
+   *     - combinations of threats to cut and connect
+   *     - combinations of breakins into enemy territory
+   */
+}
+
+
+/* ================================================================ */
+/*                       Combination attacks                        */
+/* ================================================================ */
+
+
+/* atari_atari(color, *move) looks for a series of ataris on
+ * strings of the other color culminating in the capture of
+ * a string which is thought to be invulnerable by the reading
+ * code. Such a move can be missed since it may be that each
+ * string involved individually can be rescued, but nevertheless
+ * one of them can be caught. The simplest example is a double
+ * atari. The return value is the size of the smallest opponent
+ * worm. 
+ *
+ * One danger with this scheme is that the first atari
+ * tried might be irrelevant to the actual combination.
+ * To detect this possibility, once we've found a combination,
+ * we mark that first move as forbidden, then try again. If
+ * no combination of the same size or larger turns up, then
+ * the first move was indeed essential.
+ *
+ * For the purpose of the move generation, returns the
+ * size of the smallest of the worms under attack.
+ */
+
+/* Local struct to keep track of atari_atari attack moves and what
+ * they threat.
+ */
+#define AA_MAX_TARGETS_PER_MOVE 4
+
+#define MAX_AA_DIST 5
+
+struct aa_move {
+  int move;
+  int target[AA_MAX_TARGETS_PER_MOVE];
+};
+
+#define AA_MAX_MOVES MAX_BOARD * MAX_BOARD  
+static int aa_status[BOARDMAX]; /* ALIVE, DEAD or CRITICAL */
+static int forbidden[BOARDMAX];
+static int aa_values[BOARDMAX];
+static void compute_aa_status(int color,
+                             const signed char safe_stones[BOARDMAX]);
+static void compute_aa_values(int color);
+static int get_aa_status(int pos);
+static int do_atari_atari(int color, int *attack_point, int *defense_point,
+                         signed char all_potential_defenses[BOARDMAX],
+                         int last_friendly, int save_verbose, int minsize,
+                         signed char goal[BOARDMAX]);
+static int atari_atari_succeeded(int color, int *attack_point,
+                                int *defense_point, int last_friendly,
+                                int save_verbose, int minsize);
+static void atari_atari_find_attack_moves(int color, int minsize,
+                                         struct aa_move attacks[AA_MAX_MOVES],
+                                         signed char goal[BOARDMAX]);
+static void atari_atari_attack_patterns(int color, int minsize,
+                                       struct aa_move attacks[AA_MAX_MOVES],
+                                       signed char goal[BOARDMAX]);
+static void atari_atari_attack_callback(int anchor, int color,
+                                       struct pattern *pattern,
+                                       int ll, void *data);
+static int atari_atari_find_defense_moves(int targets[AA_MAX_TARGETS_PER_MOVE],
+                                         int moves[AA_MAX_MOVES]);
+static int get_aa_value(int str);
+static int update_aa_goal(signed char goal[BOARDMAX],
+                         signed char new_goal[BOARDMAX],
+                         int apos, int color);
+static void aa_init_moves(struct aa_move attacks[AA_MAX_MOVES]);
+static void aa_add_move(struct aa_move attacks[AA_MAX_MOVES],
+                       int move, int target);
+static int aa_move_known(struct aa_move attacks[AA_MAX_MOVES],
+                        int move, int target);
+static void aa_sort_moves(struct aa_move attacks[AA_MAX_MOVES]);
+
+/* Set to 1 if you want verbose traces from this function. */
+
+int
+atari_atari(int color, int *attack_move, signed char defense_moves[BOARDMAX],
+           int save_verbose)
+{
+  int other = OTHER_COLOR(color);
+  int apos;
+  int dpos;
+  int aa_val;
+  signed char saved_defense_moves[BOARDMAX];
+
+  /* Collect worm statuses of opponent's worms. We need to
+   * know this because we only want to report unexpected
+   * results. For example, we do not want to report success
+   * if we find we can kill a worm which is already dead.
+   * The worm status of empty points is set to UNKNOWN to signal
+   * that stones added along the way need special attention.
+   */
+  if (aa_depth < 2)
+    return 0;
+  memset(forbidden, 0, sizeof(forbidden));
+
+  compute_aa_status(color, NULL);
+  compute_aa_values(color);
+  
+  if (defense_moves)
+    memset(defense_moves, 0, BOARDMAX);
+  aa_val = do_atari_atari(color, &apos, &dpos, defense_moves, NO_MOVE,
+                         save_verbose, 0, NULL);
+
+  if (aa_val == 0)
+    return 0;
+
+  /* We try excluding the first atari found and see if the
+   * combination still works. Repeat until failure.
+   */
+  while (1) {
+    int new_aa_val;
+    
+    if (attack_move)
+      *attack_move = apos;
+    
+    forbidden[apos] = 1;
+    if (defense_moves) {
+      memcpy(saved_defense_moves, defense_moves, BOARDMAX);
+      memset(defense_moves, 0, BOARDMAX);
+    }
+    new_aa_val = do_atari_atari(color, &apos, &dpos, defense_moves, NO_MOVE,
+                               save_verbose, aa_val, NULL);
+
+    /* The last do_atari_atari call fails. When do_atari_atari fails,
+     * it does not change the value of (apos), so these correspond
+     * to a move that works and is necessary.
+     */
+    if (new_aa_val == 0)
+      break;
+    else
+      aa_val = new_aa_val;
+  }
+
+  if (defense_moves) {
+    int pos;
+    memcpy(defense_moves, saved_defense_moves, BOARDMAX);
+    /* defense_moves[] contains potential defense moves. Now we
+     * examine which of them really work.
+     */
+    forbidden[apos] = 0;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || !defense_moves[pos])
+       continue;
+
+      if (!trymove(pos, other, "atari_atari", NO_MOVE)) {
+       defense_moves[pos] = 0;
+       if (save_verbose)
+         gprintf("%1m deleted defense point, illegal\n", pos);
+       continue;
+      }
+
+      if (attack(pos, NULL)) {
+       defense_moves[pos] = 0;
+       popgo();
+       if (save_verbose)
+         gprintf("%1m deleted defense point, unsafe\n", pos);
+       continue;
+      }
+      
+      if (do_atari_atari(color, &apos, &dpos, NULL, NO_MOVE,
+                        save_verbose, aa_val, NULL) > 0) {
+       if (save_verbose)
+         gprintf("%1m deleted defense point, didn't work\n", pos);
+       defense_moves[pos] = 0;
+      }
+      
+      popgo();
+    }
+  }
+  return aa_val;
+}
+
+
+/* Wrapper around atari_atari_blunder_size. Check whether a
+ * combination attack of size at least minsize appears after move
+ * at (move) has been made.
+ * The arrays saved_dragons[] and saved_worms[] should be one for
+ * stones belonging to dragons or worms respectively, which are
+ * supposedly saved by (move).
+ *
+ * FIXME: We probably want to change the calling convention of this
+ *        function to return all defense moves.
+ */
+int
+atari_atari_confirm_safety(int color, int move, int *defense, int minsize,
+                          const signed char saved_dragons[BOARDMAX],
+                          const signed char saved_worms[BOARDMAX])
+{
+  signed char safe_stones[BOARDMAX];
+  signed char defense_moves[BOARDMAX];
+  int pos;
+  int blunder_size;
+
+  mark_safe_stones(color, move, saved_dragons, saved_worms, safe_stones);
+  blunder_size = atari_atari_blunder_size(color, move, defense_moves,
+                                         safe_stones);
+
+  if (defense) {
+    /* Return one arbitrary defense move. */
+    *defense = NO_MOVE;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos) && defense_moves[pos]) {
+       *defense = pos;
+       break;
+      }
+  }
+  
+  return blunder_size >= minsize;
+}
+
+
+/* This function checks whether any new combination attack appears after
+ * move at (move) has been made, and returns its size (in points).
+ * safe_stones marks which of our stones are supposedly safe after this move.
+ */
+int
+atari_atari_blunder_size(int color, int move,
+                        signed char defense_moves[BOARDMAX],
+                        const signed char safe_stones[BOARDMAX])
+{
+  int apos;
+  int defense_point = NO_MOVE;
+  int aa_val, after_aa_val;
+  int other = OTHER_COLOR(color);
+  signed char defense_points[BOARDMAX];
+  int last_forbidden = NO_MOVE;
+
+  /* If aa_depth is too small, we can't see any combination attacks,
+   * so in this respect the move is safe enough.
+   */
+  if (aa_depth < 2)
+    return 0;
+
+  memset(forbidden, 0, sizeof(forbidden));
+  memset(defense_points, 0, sizeof(defense_points));
+
+  compute_aa_status(other, safe_stones);
+  compute_aa_values(other);
+
+  /* Accept illegal ko capture here. */
+  if (!tryko(move, color, NULL))
+    /* Really shouldn't happen. */
+    abortgo(__FILE__, __LINE__, "trymove", move);
+
+  increase_depth_values();
+
+  aa_val = do_atari_atari(other, &apos, &defense_point, defense_points,
+                         NO_MOVE, 0, 0, NULL);
+  after_aa_val = aa_val;
+
+  if (aa_val == 0 || defense_point == NO_MOVE) {
+
+    /* No sufficiently large combination attack, so the move is safe from
+     * this danger.
+     *
+     * On rare occasions do_atari_atari might find a combination
+     * but no defense. In this case we assume that the combination
+     * is illusory.
+     */
+
+    popgo();
+    decrease_depth_values();
+    return 0;
+  }
+
+  while (aa_val >= after_aa_val && defense_point != NO_MOVE) {
+    /* Try dropping moves from the combination and see if it still
+     * works. What we really want is to get the proper defense move
+     * into (*defense).
+     */
+    forbidden[apos] = 1;
+    last_forbidden = apos;
+    aa_val = do_atari_atari(other, &apos, &defense_point, NULL,
+                           NO_MOVE, 0, aa_val, NULL);
+  }
+
+  popgo();
+  decrease_depth_values();
+  /* We know that a combination exists, but we don't know if
+   * the original move at (aa) was really relevant. So we
+   * try omitting it and see if a combination is still found.
+   */
+  compute_aa_status(other, NULL);
+  compute_aa_values(other);
+  forbidden[last_forbidden] = 0;
+  aa_val = do_atari_atari(other, NULL, NULL, NULL, NO_MOVE, 0, 0, NULL);
+  if (aa_val >= after_aa_val)
+    return 0;
+
+  /* Try the potential defense moves to see which are effective. */
+  if (defense_moves) {
+    int pos;
+    /* defense_points[] contains potential defense moves. Now we
+     * examine which of them really work.
+     */
+    
+    /* FIXME: Maybe these should be moved after the tryko() below? */
+    compute_aa_status(other, safe_stones);
+    compute_aa_values(other);
+      
+    memcpy(defense_moves, defense_points, sizeof(defense_points));
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || !defense_moves[pos] || pos == move)
+       continue;
+
+      if (!trymove(pos, color, "atari_atari", NO_MOVE)) {
+       defense_moves[pos] = 0;
+       continue;
+      }
+      increase_depth_values();
+
+      if (attack(pos, NULL)) {
+       defense_moves[pos] = 0;
+       decrease_depth_values();
+       popgo();
+       continue;
+      }
+      
+      /* Accept illegal ko capture here. */
+      if (!tryko(move, color, NULL))
+       /* Really shouldn't happen. */
+       abortgo(__FILE__, __LINE__, "trymove", move);
+      increase_depth_values();
+      
+      if (do_atari_atari(other, &apos, &defense_point, NULL, NO_MOVE,
+                        0, after_aa_val, NULL) >= after_aa_val)
+       defense_moves[pos] = 0;
+
+      decrease_depth_values();
+      popgo();
+      decrease_depth_values();
+      popgo();
+    }
+  }
+  
+  return after_aa_val - aa_val;
+}
+
+
+/* ---------------------------------------------------------------- */
+/*                Helper functions for atari_atari.                 */
+/* ---------------------------------------------------------------- */
+
+
+/* Helper function for computing the aa_status for all opponent's strings.
+ * If safe_stones is given, we just copy the information from there.
+ * If called at stackp > 0, safe_stones must be provided since the
+ * dragon_data is not valid then.
+ */
+
+static void
+compute_aa_status(int color, const signed char safe_stones[BOARDMAX])
+{
+  int other = OTHER_COLOR(color);
+  int pos;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int save_verbose = verbose;
+
+  gg_assert(safe_stones || stackp == 0);
+  
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  if (verbose)
+    verbose--;
+  
+  /* Collect worm statuses of opponent's worms. We need to
+   * know this because we only want to report unexpected
+   * results. For example, we do not want to report success
+   * if we find we can kill a worm which is already dead.
+   * The worm status of empty points is set to UNKNOWN to signal
+   * that stones added along the way need special attention.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == other) {
+      if (safe_stones) {
+       if (safe_stones[pos])
+         aa_status[pos] = ALIVE;
+       else
+         aa_status[pos] = DEAD;
+      }
+      else {
+       if (dragon[pos].status == DEAD)
+         aa_status[pos] = DEAD;
+       else if (dragon[pos].status == CRITICAL)
+         aa_status[pos] = CRITICAL;
+       else if (worm[pos].attack_codes[0] != 0) {
+         if (worm[pos].defense_codes[0] != 0)
+           aa_status[pos] = CRITICAL;
+         else
+           aa_status[pos] = DEAD;
+       }
+       else
+         aa_status[pos] = ALIVE;
+      }
+    }
+    else if (ON_BOARD(pos))
+      aa_status[pos] = UNKNOWN;
+  }
+  
+  /* reclassify a worm with 2 liberties as INSUBSTANTIAL if capturing
+   * it does not result in a live group.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == other
+       && find_origin(pos) == pos
+       && countlib(pos) == 2
+       && aa_status[pos] == ALIVE) {
+      int libs[2];
+      findlib(pos, 2, libs);
+      /* Don't waste time running owl_substantial() if we can't safely
+       * atari anyway.
+       */
+      if (is_self_atari(libs[0], color)
+         && is_self_atari(libs[1], color))
+       continue;
+      
+      if (!owl_substantial(pos)) {
+       int pos2;
+       for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++)
+         if (board[pos2] == other && find_origin(pos2) == pos)
+           aa_status[pos2] = INSUBSTANTIAL;
+      }
+    }
+  }
+    
+  if (debug & DEBUG_ATARI_ATARI) {
+    gprintf("compute_aa_status() for %C\n", color);
+    gprintf("aa_status: (ALIVE worms not listed)\n");
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (board[pos] == other && is_worm_origin(pos, pos)) {
+       const char *status = "UNKNOWN (shouldn't happen)";
+       if (aa_status[pos] == DEAD)
+         status = "DEAD";
+       else if (aa_status[pos] == CRITICAL)
+         status = "CRITICAL";
+       else if (aa_status[pos] == INSUBSTANTIAL)
+         status = "INSUBSTANTIAL";
+       
+       if (aa_status[pos] != ALIVE)
+         gprintf("%1M: %s\n", pos, status);
+      }
+    }
+  }
+
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+  verbose = save_verbose;
+}
+
+
+/* Helper function for retrieving the aa_status for a string. We can't
+ * reliably do this simply by looking up aa_status[pos] since this is
+ * only valid at vertices which were non-empty at the start of the
+ * reading. For later added stones, we need to find their aa_status by
+ * locating a part of the string which was a worm at the beginning of
+ * the reading.
+ */
+
+static int
+get_aa_status(int pos)
+{
+  int stones[MAX_BOARD * MAX_BOARD];
+  int num_stones;
+  int k;
+
+  if (aa_status[pos] != UNKNOWN)
+    return aa_status[pos];
+
+  num_stones = findstones(pos, MAX_BOARD * MAX_BOARD, stones);
+  for (k = 0; k < num_stones; k++)
+    if (aa_status[stones[k]] != UNKNOWN)
+      return aa_status[stones[k]];
+
+  return UNKNOWN;
+}
+
+
+
+/* Helper function for atari_atari. Here worms is the number of
+ * opponent worms involved in the combination, and (last_friendly) is
+ * the location of the last friendly move played. Moves marked
+ * with the forbidden array are not tried. If no move is found,
+ * the values of *attack_point and *defense_point are not changed.
+ *
+ * If not NULL, *attack_point is left pointing to the location of the
+ * attacking move, and *defense_point points to a move defending the
+ * combination. In rare cases a defensive move might not be found. If
+ * a non-static function calling do_atari_atari gets a return value of
+ * 1 but NO_MOVE as the defense point, this should be treated as
+ * equivalent to a return value of 0.
+ *
+ * The goal array limits where we are allowed to consider threats.
+ * Only strings for which goal is set to 1 may be threatened. If goal
+ * is NULL, anything may be attacked. Thus goal is typically NULL when
+ * do_atari_atari() is called from an external function. After the
+ * first threat has been made, the goal array is set to one in a
+ * neighborhood of the move and after subsequent threats it is
+ * expanded with neighborhoods of those moves. The details of this can
+ * be found in the function update_aa_goal().
+ */
+
+static int
+do_atari_atari(int color, int *attack_point, int *defense_point,
+              signed char all_potential_defenses[BOARDMAX], int last_friendly,
+              int save_verbose, int minsize, signed char goal[BOARDMAX])
+{
+  int other = OTHER_COLOR(color);
+  int k;
+  struct aa_move attacks[AA_MAX_MOVES];
+  int num_defense_moves;
+  int defense_moves[AA_MAX_MOVES];
+  int pos;
+  SGFTree *save_sgf_dumptree;
+  int save_count_variations;
+  
+  if (debug & DEBUG_ATARI_ATARI) {
+    gprintf("%odo_atari_atari: ");
+    dump_stack();
+    gprintf("%oforbidden moves: ");
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos) && forbidden[pos])
+       gprintf("%o%1m ", pos);
+    gprintf("\n");
+    gprintf("%ogoal: ");
+    if (!goal)
+      gprintf("none");
+    else {
+      for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+       if (ON_BOARD(pos) && goal[pos])
+         gprintf("%o%1m ", pos);
+    }
+    gprintf("\n");
+  }
+
+  /* First look for strings adjacent to the last friendly move played
+   * (or to another stone in the same string) which can be
+   * unexpectedly attacked.  If so, the combination attack
+   * has succeeded.
+   */
+  if (last_friendly != NO_MOVE) {
+    int retval;
+    save_sgf_dumptree = sgf_dumptree;
+    save_count_variations = count_variations;
+    sgf_dumptree = NULL;
+    count_variations = 0;
+    retval = atari_atari_succeeded(color, attack_point, defense_point,
+                                  last_friendly, save_verbose, minsize);
+    sgf_dumptree = save_sgf_dumptree;
+    count_variations = save_count_variations;
+    if (retval != 0) {
+      if (sgf_dumptree)
+       /* FIXME: Better message. */
+       sgftreeAddComment(sgf_dumptree, "attack found");
+      return retval;
+    }
+  }
+
+  if (stackp > aa_depth)
+    return 0;
+
+  /* Find attack moves. These are typically ataris but may also be
+   * more general.
+   */
+  save_sgf_dumptree = sgf_dumptree;
+  save_count_variations = count_variations;
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  atari_atari_find_attack_moves(color, minsize, attacks, goal);
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  /* Try the attacking moves and let the opponent defend. Then call
+   * ourselves recursively.
+   */
+  for (k = 0; attacks[k].move != NO_MOVE; k++) {
+    int aa_val;
+    int str = attacks[k].target[0];
+    int apos = attacks[k].move;
+    int bpos;
+    int r;
+    
+    if (!trymove(apos, color, "do_atari_atari-A", str))
+      continue;
+    
+    if (all_potential_defenses) {
+      all_potential_defenses[apos] = 1;
+      if (countlib(apos) <= 2) {
+       int libs[2];
+       int num_libs = findlib(apos, 2, libs);
+       all_potential_defenses[libs[0]] = 1;
+       if (num_libs == 2)
+         all_potential_defenses[libs[1]] = 1;
+      }
+    }
+
+    if (!IS_STONE(board[str])) {
+      /* Error situation. This could be caused by a wrong matcher status. */
+      if (save_verbose || (debug & DEBUG_ATARI_ATARI))
+       gprintf("%oError condition found by atari_atari\n");
+      popgo();
+      return 0;
+    }
+
+    /* Try to defend the stone (str) which is threatened. */
+    aa_val = get_aa_value(str);
+
+    /* Pick up defense moves. */
+    save_sgf_dumptree = sgf_dumptree;
+    save_count_variations = count_variations;
+    sgf_dumptree = NULL;
+    count_variations = 0;
+    num_defense_moves = atari_atari_find_defense_moves(attacks[k].target,
+                                                      defense_moves);
+    sgf_dumptree = save_sgf_dumptree;
+    count_variations = save_count_variations;
+    
+    for (r = 0; r < num_defense_moves; r++) {
+      bpos = defense_moves[r];
+
+      if (all_potential_defenses)
+       all_potential_defenses[bpos] = 1;
+
+      if (trymove(bpos, other, "do_atari_atari-B", str)) {
+       int new_aa_val;
+       signed char new_goal[BOARDMAX];
+       /* These moves may have been irrelevant for later
+        * reading, so in order to avoid horizon problems, we
+        * need to temporarily increase the depth values.
+        */
+       modify_depth_values(2);
+       update_aa_goal(goal, new_goal, apos, color);
+       new_aa_val = do_atari_atari(color, NULL, defense_point,
+                                   all_potential_defenses,
+                                   apos, save_verbose, minsize, new_goal);
+       modify_depth_values(-2);
+       if (new_aa_val < aa_val)
+         aa_val = new_aa_val;
+       popgo();
+      }
+
+      /* Defense successful, no need to try any further. */
+      if (aa_val == 0)
+       break;
+    }
+
+    /* Undo the attacking move. */
+    popgo();
+
+    if (aa_val == 0)
+      continue;
+
+    /* atari_atari successful */
+    if (num_defense_moves == 0) {
+      if (save_verbose || (debug & DEBUG_ATARI_ATARI)) {
+       gprintf("%oThe worm %1m can be attacked at %1m after ", str, apos);
+       dump_stack();
+      }
+      if (sgf_dumptree)
+       /* FIXME: Better message. */
+       sgftreeAddComment(sgf_dumptree, "attack found");
+    }
+
+    if (attack_point)
+      *attack_point = apos;
+
+    if (defense_point) {
+      save_sgf_dumptree = sgf_dumptree;
+      save_count_variations = count_variations;
+      sgf_dumptree = NULL;
+      count_variations = 0;
+
+      if (!find_defense(str, defense_point))
+       *defense_point = NO_MOVE;
+
+      /* If no defense point is known and (apos) is a safe
+       * move for other, it probably defends the combination.
+       */
+      if ((*defense_point == NO_MOVE || !safe_move(*defense_point, other))
+         && safe_move(apos, other))
+       *defense_point = apos;
+
+      sgf_dumptree = save_sgf_dumptree;
+      count_variations = save_count_variations;
+    }
+    
+    DEBUG(DEBUG_ATARI_ATARI, "%oreturn value:%d (%1m)\n", aa_val, str);
+    return aa_val;
+  }
+    
+  /* No atari_atari attack. */
+  return 0;
+}
+
+
+static int
+atari_atari_succeeded(int color, int *attack_point, int *defense_point,
+                     int last_friendly, int save_verbose, int minsize)
+{
+  int pos;
+  int apos;
+  int other = OTHER_COLOR(color);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != other)
+      continue;
+    
+    if (pos != find_origin(pos))
+      continue;
+    
+    if (minsize > 0
+       && get_aa_value(pos) < minsize)
+      continue;
+    
+    if (get_aa_status(pos) != ALIVE)
+      continue;
+    
+    if (board[last_friendly] != EMPTY
+       && !adjacent_strings(last_friendly, pos))
+      continue;
+    
+    if (board[last_friendly] == EMPTY
+       && !liberty_of_string(last_friendly, pos))
+      continue;
+    
+    if (debug & DEBUG_ATARI_ATARI)
+      gprintf("Considering attack of %1m. depth = %d.\n", pos, depth);
+    
+    if (attack(pos, &apos) && !forbidden[apos]) {
+      if (save_verbose || (debug & DEBUG_ATARI_ATARI)) {
+       gprintf("%oThe worm %1m can be attacked at %1m after ", pos, apos);
+       dump_stack();
+      }
+      if (attack_point)
+       *attack_point = apos;
+      
+      /* We look for a move defending the combination.
+       * Normally this is found by find_defense but failing
+       * that, if the attacking move is a safe move for color,
+       * it probably defends.
+       */
+      if (defense_point) {
+       if (!find_defense(pos, defense_point)) {
+         if (safe_move(apos, other))
+           *defense_point = apos;
+         else
+           *defense_point = NO_MOVE;
+       }
+      }
+      
+      DEBUG(DEBUG_ATARI_ATARI, "%oreturn value:%d (%1m)\n",
+           get_aa_value(pos), pos);
+      return get_aa_value(pos);
+    }
+  }
+  
+  return 0;
+}
+
+#define MAX_THREAT_MOVES  MAX_TACTICAL_POINTS
+
+static void
+atari_atari_find_attack_moves(int color, int minsize,
+                             struct aa_move attacks[AA_MAX_MOVES],
+                             signed char goal[BOARDMAX])
+{
+  int k;
+  int r;
+
+  aa_init_moves(attacks);
+
+  atari_atari_attack_patterns(color, minsize, attacks, goal);
+
+  /* Sort the attack moves. */
+  aa_sort_moves(attacks);
+  
+  if (debug & DEBUG_ATARI_ATARI) {
+    gprintf("Attack moves:");
+    for (k = 0; k < AA_MAX_MOVES && attacks[k].move != NO_MOVE; k++) {
+      gprintf("%o %1m(", attacks[k].move);
+      for (r = 0; r < AA_MAX_TARGETS_PER_MOVE; r++) {
+       if (attacks[k].target[r] == NO_MOVE)
+         break;
+       gprintf("%o%s%1m", r == 0 ? "" : ",", attacks[k].target[r]);
+      }
+      gprintf("%o)");
+    }
+    gprintf("%o\n");
+  }
+}
+
+/* FIXME: Move these to a struct and pass to callback through the
+ * *data parameter.
+ */
+static int current_minsize;
+static struct aa_move *current_attacks;
+static int conditional_attack_point[BOARDMAX];
+
+static void
+atari_atari_attack_patterns(int color, int minsize,
+                           struct aa_move attacks[AA_MAX_MOVES],
+                           signed char goal[BOARDMAX])
+{
+  signed char revised_goal[BOARDMAX];
+  current_minsize = minsize;
+  current_attacks = attacks;
+  memset(conditional_attack_point, 0, sizeof(conditional_attack_point));
+
+  /* If goal is NULL and there are forbidden moves we need to compute
+   * a new goal around the forbidden moves.
+   */
+  if (goal == NULL && update_aa_goal(goal, revised_goal, NO_MOVE, color))
+    goal = revised_goal;
+
+#if 0
+  if (goal != NULL) {
+    int pos;
+    gprintf("goal:");
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos) && goal[pos])
+       gprintf("%o %1m", pos);
+    gprintf("%o\n");
+  }
+#endif
+  
+  matchpat(atari_atari_attack_callback, color, &aa_attackpat_db, NULL, goal);
+}
+
+/* Try to attack every X string in the pattern, whether there is an attack
+ * before or not. Only exclude already known attacking moves.
+ */
+static void
+atari_atari_attack_callback(int anchor, int color,
+                           struct pattern *pattern, int ll, void *data)
+{
+  int move;
+  int k;
+  UNUSED(data);
+
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+
+  if (forbidden[move])
+    return;
+  
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT)
+    if (!pattern->autohelper(ll, move, color, 0))
+      return;
+
+  /* If the pattern has a helper, call it to see if the pattern must
+   * be rejected.
+   */
+  if (pattern->helper)
+    if (!pattern->helper(pattern, ll, move, color))
+      return;
+
+  /* Loop through pattern elements in search of X strings to
+   * threaten to attack.
+   */
+  for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+    if (pattern->patn[k].att == ATT_X) {
+      /* transform pattern real coordinate */
+      int str = find_origin(AFFINE_TRANSFORM(pattern->patn[k].offset,
+                                            ll, anchor));
+
+      if (current_minsize > 0
+         && get_aa_value(str) < current_minsize)
+       continue;
+
+      if (aa_move_known(current_attacks, move, str))
+       continue;
+
+      if (get_aa_status(str) != ALIVE)
+       continue;
+
+      /* Usually we don't want to play self atari. However, if we
+       * capture in snapback it's okay. For s class patterns we don't
+       * have this requirement.
+       */
+      if (!(pattern->class & CLASS_s) && is_self_atari(move, color)) {
+       if (countlib(str) > 2)
+         continue;
+
+       if (!safe_move(move, color))
+         continue;
+      }
+      
+      /*
+       * Play (move) and see if there is an attack.
+       */
+      if (trymove(move, color, "attack_callback", str)) {
+       int acode;
+       int attack_point = NO_MOVE;
+
+       if (!board[str])
+         acode = WIN;
+       else
+         acode = attack(str, &attack_point);
+
+       popgo();
+
+       if (acode != 0) {
+         if ((pattern->class & CLASS_c)
+             && !aa_move_known(current_attacks, move, NO_MOVE)) {
+           /* Conditional pattern. */
+           DEBUG(DEBUG_ATARI_ATARI,
+                 "aa_attack pattern %s+%d (conditional) found threat on %1m at %1m with code %d\n",
+                 pattern->name, ll, str, move, acode);
+           if (conditional_attack_point[move] == NO_MOVE)
+             conditional_attack_point[move] = str;
+           else if (conditional_attack_point[move] != str) {
+             aa_add_move(current_attacks, move,
+                         conditional_attack_point[move]);
+             aa_add_move(current_attacks, move, str);
+           }
+         }
+         else {
+           aa_add_move(current_attacks, move, str);
+           DEBUG(DEBUG_ATARI_ATARI,
+                 "aa_attack pattern %s+%d found threat on %1m at %1m with code %d\n",
+                 pattern->name, ll, str, move, acode);
+         }
+       }
+      }
+    }
+  }
+}
+
+
+static int
+atari_atari_find_defense_moves(int targets[AA_MAX_TARGETS_PER_MOVE],
+                              int moves[AA_MAX_MOVES])
+{
+  int num_moves = 0;
+  int move;
+  int k;
+  int liberties;
+  int libs[4];
+  int neighbors;
+  int adjs[MAXCHAIN];
+  int mx[BOARDMAX];
+  int r, s;
+
+  memset(mx, 0, sizeof(mx));
+
+  for (r = 0; r < AA_MAX_TARGETS_PER_MOVE && targets[r] != NO_MOVE; r++) {
+    int str = targets[r];
+
+    /* If the attack move happened to remove (str), there's no defense. */
+    if (board[str] == EMPTY)
+      continue;
+    
+    /* Because we know (str) is threatened there is an
+     * attack and we can be sure find_defense() will give a
+     * useful defense point if it returns non-zero. Usually we
+     * would need to call attack_and_defend() to be certain of
+     * this.
+     */
+    if (!find_defense(str, &move))
+      continue;
+    moves[num_moves++] = move;
+    if (num_moves == AA_MAX_MOVES)
+      return num_moves;
+    mx[move] = 1;
+    
+    /* Consider all moves to attack a neighbor or to play on a liberty. */
+    liberties = findlib(str, 4, libs);
+    for (k = 0; k < liberties; k++) {
+      if (!mx[libs[k]]
+         && trymove(libs[k], board[str], "aa_defend-A", str)) {
+       if (attack(str, NULL) == 0) {
+         moves[num_moves++] = libs[k];
+         mx[libs[k]] = 1;
+       }
+       popgo();
+       if (num_moves == AA_MAX_MOVES)
+         return num_moves;
+      }
+    }
+    
+    neighbors = chainlinks(str, adjs);
+    for (k = 0; k < neighbors; k++) {
+      int attack_point;
+      if (attack(adjs[k], &attack_point) == WIN
+         && !mx[attack_point]) {
+       moves[num_moves++] = attack_point;
+       if (num_moves == AA_MAX_MOVES)
+         return num_moves;
+       mx[attack_point] = 1;
+      }
+
+      /* If the neighbor has at most three liberties, try all of them
+       * for defense, except self-ataris.
+       */
+      liberties = findlib(adjs[k], 3, libs);
+      if (liberties <= 3) {
+       for (s = 0; s < liberties; s++) {
+         if (!mx[libs[s]]
+             && !is_self_atari(libs[s], board[str])
+             && trymove(libs[s], board[str], "aa_defend-B", str)) {
+           if (attack(str, NULL) == 0) {
+             moves[num_moves++] = libs[s];
+             mx[libs[s]] = 1;
+           }
+           popgo();
+           if (num_moves == AA_MAX_MOVES)
+             return num_moves;
+         }
+       }
+      }
+    }
+    
+    if (debug & DEBUG_ATARI_ATARI) {
+      gprintf("Defense moves for %1m:", str);
+      for (k = 0; k < num_moves; k++)
+       gprintf("%o %1m", moves[k]);
+      gprintf("%o\n");
+    }
+  }
+
+  return num_moves;
+}
+
+
+/* Try to guess the value of the strings. We do this by adding twice
+ * the number of stones to the number of liberties and second order
+ * liberties within the moyo around the string. This is of course
+ * quite crude since it doesn't take into account any strategic
+ * effects, e.g. a string being cutting stones. 
+ */
+static void
+compute_aa_values(int color)
+{
+  int other = OTHER_COLOR(color);
+  int pos;
+  int value;
+  int liberties;
+  int libs[MAXLIBS];
+  int mx[BOARDMAX];
+  int r, k;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != other
+       || pos != find_origin(pos)
+       || aa_status[pos] != ALIVE) {
+      aa_values[pos] = 0;
+      continue;
+    }
+      
+    memset(mx, 0, sizeof(mx));
+    liberties = findlib(pos, MAXLIBS, libs);
+    value = 2 * countstones(pos);
+
+    for (r = 0; r < liberties; r++) {
+      if (!mx[libs[r]]
+         && (whose_moyo(&initial_black_influence, libs[r]) == other
+             || whose_moyo(&initial_white_influence, libs[r]) == other)) {
+       mx[libs[r]] = 1;
+       value++;
+      }
+      for (k = 0; k < 4; k++) {
+       int librd = libs[r] + delta[k];
+       if (!ON_BOARD1(librd) || mx[librd])
+         continue;
+       mx[librd] = 1;
+       if (board[librd] == EMPTY
+           && (whose_moyo(&initial_black_influence, librd) == other
+               || (whose_moyo(&initial_white_influence, librd) == other)))
+         value++;
+      }
+    }
+
+    aa_values[pos] = value;
+    if (1)
+      DEBUG(DEBUG_ATARI_ATARI, "aa_value for %1m = %d\n", pos, value);
+  }
+}
+
+/* The aa_value for a string is the sum of the aa_values for all
+ * included strings in the original position. This will systematically
+ * overvalue strings which consist of multiple original strings, but
+ * this is okay since the defender very rarely should defend a string
+ * first and then sacrifice it later.
+ */
+static int
+get_aa_value(int str)
+{
+  int stones[MAX_BOARD * MAX_BOARD];
+  int k;
+  int num_stones = findstones(str, MAX_BOARD * MAX_BOARD, stones);
+  int value = 0;
+  
+  for (k = 0; k < num_stones; k++)
+    value += aa_values[stones[k]];
+
+  return value;
+}
+
+
+/* update_aa_goal(goal, new_goal, apos, color) extends the goal array
+ * with vertices in a neighborhood of apos. The algorithm is that
+ * starting at apos, a distance measure is computed to nearby
+ * vertices. The distance increases with one for each step through
+ * empty vertices and by a liberty depending number when passing
+ * through strings of the attacked color. Strings with 3 or fewer
+ * liberties are free to pass through while strings with more
+ * liberties cost (libs - 3) to pass through. Stones with a distance
+ * of 5 or less are included in the goal.
+ *
+ * Additionally neighborhoods of the moves in the forbidden array are
+ * included in the goal, to make it possible to limit the goal to a
+ * specific area from the beginning. This is needed when trying to
+ * decide which moves are relevant to the combination.
+ */
+
+#define ENQUEUE(pos, dist) \
+    do { \
+      if ((dist) <= MAX_AA_DIST) { \
+        if (dists[pos] == 0) { \
+          queue[queue_end++] = (pos); \
+          dists[pos] = (dist); \
+        } \
+        else if (dists[pos] < (dist)) \
+          dists[pos] = (dist); \
+      } \
+    } while (0);
+
+static int
+update_aa_goal(signed char goal[BOARDMAX], signed char new_goal[BOARDMAX],
+              int apos, int color)
+{
+  int other = OTHER_COLOR(color);
+  int dists[BOARDMAX];
+  int queue[MAX_BOARD * MAX_BOARD];
+  int queue_end = 0;
+  int k, r, s;
+  int pos;
+  
+  if (goal == NULL)
+    memset(new_goal, 0, BOARDMAX);
+  else
+    memcpy(new_goal, goal, BOARDMAX);
+
+  memset(dists, 0, sizeof(dists));
+
+  if (apos != NO_MOVE) {
+    dists[apos] = 1;
+    queue[queue_end++] = apos;
+  }
+
+#if 0
+  /* Disabled for now, since it does nothing but break atari_atari:16
+   * and trevorc:1540. It could be reactivated when the rest of the
+   * function would be modified in order to garanty that a forbidden
+   * move is strictly equivalent to a played move in terms of goal
+   * mapping. I doubt it would be anything worth though...
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && forbidden[pos]) {
+      dists[pos] = 1;
+      queue[queue_end++] = pos;
+    }
+  }
+#endif
+
+  if (queue_end == 0)
+    return 0;
+  
+  for (r = 0; r < queue_end; r++) {
+    int smallest_dist = MAX_BOARD * MAX_BOARD;
+    int best_index = -1;
+
+    gg_assert(queue_end < MAX_BOARD * MAX_BOARD);
+    
+    for (k = r; k < queue_end; k++) {
+      if (dists[queue[k]] < smallest_dist) {
+       smallest_dist = dists[queue[k]];
+       best_index = k;
+      }
+    }
+    
+    if (best_index != r) {
+      int tmp = queue[r];
+      queue[r] = queue[best_index];
+      queue[best_index] = tmp;
+    }
+    
+    pos = queue[r];
+    if (board[pos] == other)
+      new_goal[pos] = 1;
+
+    /* FIXME: We shouldn't let dead opponent stones stop the
+     * propagation of distance.
+     *
+     * As a partial fix we include pos == apos in a test below.
+     */
+    for (k = 0; k < 4; k++) {
+      int pos2 = pos + delta[k];
+      if (!ON_BOARD(pos2))
+       continue;
+      if ((board[pos] != color || pos == apos) && board[pos2] == EMPTY) {
+        ENQUEUE(pos2, dists[pos] + 1);
+      }
+      else if (board[pos] != other && board[pos2] == other) {
+       int stones[MAX_BOARD * MAX_BOARD];
+       int size = findstones(pos2, MAX_BOARD * MAX_BOARD, stones);
+       int libs = countlib(pos2);
+       int deltadist = libs - 3;
+       if (deltadist < 0)
+         deltadist = 0;
+       for (s = 0; s < size; s++)
+         ENQUEUE(stones[s], dists[pos] + deltadist);
+      }
+    }
+  }
+  return 1;
+}
+
+/* Initialize an array with atari_atari attacks. The convention is that
+ * the array ends when a NO_MOVE is encountered in the move field.
+ */
+static void
+aa_init_moves(struct aa_move attacks[AA_MAX_MOVES])
+{
+  attacks[0].move = NO_MOVE;
+}
+
+
+/* Add an atari_atari attack move to a struct aa_move array. If the
+ * move already is included in the array, we check whether the target
+ * also is known for that move and add it if not.
+ */
+static void
+aa_add_move(struct aa_move attacks[AA_MAX_MOVES], int move, int target)
+{
+  int k;
+  int r;
+
+  for (k = 0; k < AA_MAX_MOVES; k++)
+    if (attacks[k].move == move || attacks[k].move == NO_MOVE)
+      break;
+
+  /* If the array is full, give up. */
+  if (k == AA_MAX_MOVES)
+    return;
+
+  target = find_origin(target);
+
+  /* New move. */
+  if (attacks[k].move == NO_MOVE) {
+    attacks[k].move = move;
+    attacks[k].target[0] = target;
+    if (AA_MAX_TARGETS_PER_MOVE > 0)
+      attacks[k].target[1] = NO_MOVE;
+
+    if (k < AA_MAX_MOVES - 1)
+      attacks[k+1].move = NO_MOVE;
+
+    return;
+  }
+
+  /* Known move, maybe new target. */
+  for (r = 0; r < AA_MAX_TARGETS_PER_MOVE; r++)
+    if (attacks[k].target[r] == target || attacks[k].target[r] == NO_MOVE)
+      break;
+
+  /* No place for more targets. */
+  if (r == AA_MAX_TARGETS_PER_MOVE)
+    return;
+
+  /* Target known. */
+  if (attacks[k].target[r] == target)
+    return;
+
+  /* Add target. */
+  attacks[k].target[r] = target;
+  if (r < AA_MAX_TARGETS_PER_MOVE - 1)
+    attacks[k].target[r + 1] = NO_MOVE;
+}
+
+/* Check whether an atari_atari attack move is included in an struct
+ * aa_move array. If target is not NO_MOVE, we also require that the
+ * target is known for the move.
+ */
+static int
+aa_move_known(struct aa_move attacks[AA_MAX_MOVES], int move, int target)
+{
+  int k;
+  int r;
+
+  for (k = 0; k < AA_MAX_MOVES; k++)
+    if (attacks[k].move == move || attacks[k].move == NO_MOVE)
+      break;
+
+  /* If the array is full, give up and claim the move to be known. */
+  if (k == AA_MAX_MOVES)
+    return 1;
+
+  /* Unknown move. */
+  if (attacks[k].move == NO_MOVE)
+    return 0;
+
+  /* Move known, but how about the target?
+   * If no target specified, just return 1.
+   */
+  if (target == NO_MOVE)
+    return 1;
+
+  target = find_origin(target);
+  for (r = 0; r < AA_MAX_TARGETS_PER_MOVE; r++)
+    if (attacks[k].target[r] == target || attacks[k].target[r] == NO_MOVE)
+      break;
+
+  /* No place for more targets. Give up and claim the target to be known. */
+  if (r == AA_MAX_TARGETS_PER_MOVE)
+    return 1;
+
+  /* Target known. */
+  if (attacks[k].target[r] == target)
+    return 1;
+
+  /* Unknown target. */
+  return 0;
+}
+
+
+/* Auxiliary function for aa_sort_moves(). */
+static int
+target_comp_func(const void *a, const void *b)
+{
+  int asize = get_aa_value(*((const int *) a));
+  int bsize = get_aa_value(*((const int *) b));
+  return asize - bsize;
+}
+
+
+/* Auxiliary function for aa_sort_moves(). */
+static int
+move_comp_func(const void *a, const void *b)
+{
+  const struct aa_move *aa = a;
+  const struct aa_move *bb = b;
+  int asize = get_aa_value(aa->target[0]);
+  int bsize = get_aa_value(bb->target[0]);
+  return asize - bsize;
+}
+
+/* Sort the attack moves. For each move the targets are sorted in
+ * decreasing size. Then the moves are sorted with increasing size
+ * of their first target.
+ */
+static void
+aa_sort_moves(struct aa_move attacks[AA_MAX_MOVES])
+{
+  int k;
+  int r;
+  int number_of_attacks;
+  int number_of_targets;
+
+  for (k = 0; k < AA_MAX_MOVES && attacks[k].move != NO_MOVE; k++) {
+    for (r = 0; r < AA_MAX_TARGETS_PER_MOVE; r++)
+      if (attacks[k].target[r] == NO_MOVE)
+       break;
+    number_of_targets = r;
+    gg_sort(attacks[k].target, number_of_targets,
+           sizeof(attacks[k].target[0]), target_comp_func);
+  }
+  number_of_attacks = k;
+  gg_sort(attacks, number_of_attacks, sizeof(attacks[0]), move_comp_func);
+}
+
+
+#if 0
+
+/* Returns true if a move by (color) at (pos) is atari on something.
+ * Currently unused.
+ */
+
+static int
+is_atari(int pos, int color)
+{
+  int other = OTHER_COLOR(color);
+
+  if (!is_legal(pos, color))
+    return 0;
+  
+  if (board[SOUTH(pos)] == other 
+      && countlib(SOUTH(pos)) == 2)
+    return 1;
+  
+  if (board[WEST(pos)] == other 
+      && countlib(WEST(pos)) == 2)
+    return 1;
+  
+  if (board[NORTH(pos)] == other 
+      && countlib(NORTH(pos)) == 2)
+    return 1;
+  
+  if (board[EAST(pos)] == other 
+      && countlib(EAST(pos)) == 2)
+    return 1;
+  
+  return 0;
+}
+
+#endif
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/dragon.c b/engine/dragon.c
new file mode 100644 (file)
index 0000000..9edaf79
--- /dev/null
@@ -0,0 +1,2605 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* A "dragon" is a union of strings of the same color which will be
+ * treated as a unit. The dragons are generated anew at each
+ * move. If two strings are in the dragon, it is GNU Go's working
+ * hypothesis that they will live or die together and are
+ * effectively connected.
+ *
+ *                    _____/|        (! !)
+ *                   / ____/|        /@ @)
+ *                  / /   __        //  +--oo
+ *                 | /   |   >>    /<  _-v--}
+ *                 | |   UUU\\\     / / \\
+ *                 | |   __ _\\\    \ \  U
+ *                 | |  /  V  \\-->  \ \ 
+ *                 | <_/           \_/  }
+ *                 |      __     ____  /
+ *                  \    /  \___/   / /\
+ *                  <  \<          < <\ \
+ *                   ( )))         ( ))))) 
+ */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+
+static void initialize_supplementary_dragon_data(void);
+static void find_lunches(void);
+static void eye_computations(void);
+static void revise_inessentiality(void);
+static void find_neighbor_dragons(void);
+static void add_adjacent_dragons(int a, int b);
+static void add_adjacent_dragon(int a, int b);
+static int dragon_invincible(int pos);
+static int dragon_looks_inessential(int origin);
+static void identify_thrashing_dragons(void);
+static void analyze_false_eye_territory(void);
+static int connected_to_eye(int pos, int str, int color, int eye_color,
+                           struct eye_data *eye);
+static void connected_to_eye_recurse(int pos, int str, int color,
+                                    int eye_color, struct eye_data *eye,
+                                    signed char *mx, signed char *me,
+                                    int *halfeyes);
+static enum dragon_status compute_crude_status(int pos);
+static int compute_escape(int pos, int dragon_status_known);
+static void compute_surrounding_moyo_sizes(const struct influence_data *q);
+static void clear_cut_list(void);
+
+static int dragon2_initialized;
+static int lively_white_dragons;
+static int lively_black_dragons;
+
+/* This is a private array to obtain a list of worms belonging to each
+ * dragon. Public access is via first_worm_in_dragon() and
+ * next_worm_in_dragon().
+ */
+static int next_worm_list[BOARDMAX];
+
+/* Alternative for DRAGON2 macro with asserts. */
+struct dragon_data2 *
+dragon2_func(int pos)
+{
+  ASSERT1(ON_BOARD1(pos)
+          && dragon[pos].id >= 0 
+          && dragon[pos].id < number_of_dragons, pos);
+  return &dragon2[dragon[pos].id];
+}
+
+/* This basic function finds all dragons and collects some basic information
+ * about them in the dragon array.
+ *
+ * color is the player in turn to move. This does in no way affect the
+ * information collected about the dragons, but it does affect what
+ * information is passed on to the move generation code. If
+ * color == EMPTY no information at all is passed on to the move generation.
+ */
+
+void 
+make_dragons(int stop_before_owl)
+{
+  int str;
+  int d;
+
+  dragon2_initialized = 0;
+  initialize_dragon_data();
+
+  /* Find explicit connections patterns in database and amalgamate
+   * involved dragons.
+   */
+  memset(cutting_points, 0, sizeof(cutting_points));
+  find_cuts();
+  find_connections();
+
+  /* At this time, all dragons have been finalized and we can
+   * initialize the dragon2[] array. After that we can no longer allow
+   * amalgamation of dragons.
+   */
+  initialize_supplementary_dragon_data();
+  
+  make_domains(black_eye, white_eye, 0);
+
+  /* Find adjacent worms which can be easily captured: */
+  find_lunches();
+
+  /* Find topological half eyes and false eyes. */
+  find_half_and_false_eyes(BLACK, black_eye, half_eye, NULL);
+  find_half_and_false_eyes(WHITE, white_eye, half_eye, NULL);
+
+  /* Compute the number of eyes, half eyes, determine attack/defense points
+   * etc. for all eye spaces. */
+  eye_computations();
+  /* Try to determine whether topologically false and half eye points
+   * contribute to territory even if the eye doesn't solidify.
+   */
+  analyze_false_eye_territory();
+
+  /* Now we compute the genus. */
+  for (d = 0; d < number_of_dragons; d++)
+    compute_dragon_genus(dragon2[d].origin, &dragon2[d].genus, NO_MOVE);
+
+  /* Compute the escape route measure. */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (IS_STONE(board[str]) && dragon[str].origin == str)
+      DRAGON2(str).escape_route = compute_escape(str, 0);
+
+  /* Set dragon weaknesses according to initial_influence. */
+  compute_refined_dragon_weaknesses();
+  for (d = 0; d < number_of_dragons; d++)
+    dragon2[d].weakness_pre_owl = dragon2[d].weakness;
+
+  /* Determine status: ALIVE, DEAD, CRITICAL or UNKNOWN */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str))
+      if (dragon[str].origin == str && board[str])
+       dragon[str].crude_status = compute_crude_status(str);
+  
+  /* We must update the dragon status at every intersection before we
+   * call the owl code. This updates all fields.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str) && board[str] != EMPTY)
+      dragon[str] = dragon[dragon[str].origin];
+  
+  find_neighbor_dragons();
+
+  for (d = 0; d < number_of_dragons; d++) {
+    dragon2[d].surround_status 
+      = compute_surroundings(dragon2[d].origin, NO_MOVE, 0,
+                            &(dragon2[d].surround_size));
+    if (dragon2[d].surround_status == SURROUNDED) {
+      dragon2[d].escape_route = 0;
+      if (debug & DEBUG_DRAGONS)
+       gprintf("surrounded dragon found at %1m\n", dragon2[d].origin);
+    }
+    else if (dragon2[d].surround_status == WEAKLY_SURROUNDED) {
+      dragon2[d].escape_route /= 2;
+      if (debug & DEBUG_DRAGONS)
+       gprintf("weakly surrounded dragon found at %1m\n", dragon2[d].origin);
+    }
+  }
+
+  if (stop_before_owl)
+    return;
+  
+  /* Determine life and death status of each dragon using the owl code
+   * if necessary.
+   */
+  start_timer(2);
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str)) {
+      int attack_point = NO_MOVE;
+      int defense_point = NO_MOVE;
+      struct eyevalue no_eyes;
+      set_eyevalue(&no_eyes, 0, 0, 0, 0);
+      
+      if (board[str] == EMPTY
+         || dragon[str].origin != str)
+       continue;
+      
+      /* Some dragons can be ignored but be extra careful with big dragons. */
+      if (crude_dragon_weakness(ALIVE, &no_eyes, 0,
+                               DRAGON2(str).moyo_territorial_value,
+                               DRAGON2(str).escape_route - 10)
+         < 0.00001 + gg_max(0.12, 0.32 - 0.01*dragon[str].effective_size)) {
+       DRAGON2(str).owl_status = UNCHECKED;
+       DRAGON2(str).owl_attack_point  = NO_MOVE;
+       DRAGON2(str).owl_defense_point = NO_MOVE;
+      }
+      else {
+       int acode = 0;
+       int dcode = 0;
+       int kworm = NO_MOVE;
+       int owl_nodes_before = get_owl_node_counter();
+       start_timer(3);
+       acode = owl_attack(str, &attack_point, 
+                          &DRAGON2(str).owl_attack_certain, &kworm);
+       DRAGON2(str).owl_attack_node_count
+         = get_owl_node_counter() - owl_nodes_before;
+       if (acode != 0) {
+         DRAGON2(str).owl_attack_point = attack_point;
+         DRAGON2(str).owl_attack_code = acode;
+         DRAGON2(str).owl_attack_kworm = kworm;
+         if (attack_point != NO_MOVE) {
+           kworm = NO_MOVE;
+           dcode = owl_defend(str, &defense_point,
+                              &DRAGON2(str).owl_defense_certain, &kworm);
+           if (dcode != 0) {
+             if (defense_point != NO_MOVE) {
+               DRAGON2(str).owl_status = (acode == GAIN ? ALIVE : CRITICAL);
+               DRAGON2(str).owl_defense_point = defense_point;
+               DRAGON2(str).owl_defense_code = dcode;
+               DRAGON2(str).owl_defense_kworm = kworm;
+             }
+             else {
+               /* Due to irregularities in the owl code, it may
+                * occasionally happen that a dragon is found to be
+                * attackable but also alive as it stands. In this case
+                * we still choose to say that the owl_status is
+                * CRITICAL, although we don't have any defense move to
+                * propose. Having the status right is important e.g.
+                * for connection moves to be properly valued.
+                */
+               DRAGON2(str).owl_status = (acode == GAIN ? ALIVE : CRITICAL);
+               DEBUG(DEBUG_OWL_PERFORMANCE,
+                     "Inconsistent owl attack and defense results for %1m.\n", 
+                     str);
+               /* Let's see whether the attacking move might be the right
+                * defense:
+                */
+               dcode = owl_does_defend(DRAGON2(str).owl_attack_point,
+                                       str, NULL);
+               if (dcode != 0) {
+                 DRAGON2(str).owl_defense_point
+                   = DRAGON2(str).owl_attack_point;
+                 DRAGON2(str).owl_defense_code = dcode;
+               }
+             }
+           }
+         }
+         if (dcode == 0) {
+           DRAGON2(str).owl_status = DEAD; 
+           DRAGON2(str).owl_defense_point = NO_MOVE;
+           DRAGON2(str).owl_defense_code = 0;
+         }
+       }
+       else {
+         if (!DRAGON2(str).owl_attack_certain) {
+           kworm = NO_MOVE;
+           dcode = owl_defend(str, &defense_point, 
+                              &DRAGON2(str).owl_defense_certain, &kworm);
+           if (dcode != 0) {
+             /* If the result of owl_attack was not certain, we may
+              * still want the result of owl_defend */
+             DRAGON2(str).owl_defense_point = defense_point;
+             DRAGON2(str).owl_defense_code = dcode;
+             DRAGON2(str).owl_defense_kworm = kworm;
+           }
+         }
+         DRAGON2(str).owl_status = ALIVE;
+         DRAGON2(str).owl_attack_point = NO_MOVE;
+         DRAGON2(str).owl_attack_code = 0;
+         
+       }
+      }
+    }
+  time_report(2, "  owl reading", NO_MOVE, 1.0);
+  
+  /* Compute the status to be used by the matcher. We most trust the
+   * owl status, if it is available. If it's not we assume that we are
+   * already confident that the dragon is alive, regardless of
+   * crude_status.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (IS_STONE(board[str])) {
+      if (DRAGON2(str).owl_status != UNCHECKED)
+       dragon[str].status = DRAGON2(str).owl_status;
+      else
+       dragon[str].status = ALIVE;
+    }
+
+  /* The dragon data is now correct at the origin of each dragon but
+   * we need to copy it to every vertex.  
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str) && board[str] != EMPTY)
+      dragon[str] = dragon[dragon[str].origin];
+
+  identify_thrashing_dragons();
+  
+  /* Owl threats. */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str) 
+       && board[str] != EMPTY 
+       && dragon[str].origin == str) {
+      struct eyevalue no_eyes;
+      set_eyevalue(&no_eyes, 0, 0, 0, 0);
+      if (crude_dragon_weakness(ALIVE, &no_eyes, 0,
+                               DRAGON2(str).moyo_territorial_value,
+                               DRAGON2(str).escape_route - 10)
+         < 0.00001 + gg_max(0.12, 0.32 - 0.01*dragon[str].effective_size)) {
+       DRAGON2(str).owl_threat_status = UNCHECKED;
+       DRAGON2(str).owl_second_attack_point  = NO_MOVE;
+       DRAGON2(str).owl_second_defense_point = NO_MOVE;
+      }
+      else {
+       int acode = DRAGON2(str).owl_attack_code;
+       int dcode = DRAGON2(str).owl_defense_code;
+       int defense_point, second_defense_point;
+
+       if (get_level() >= 8
+           && !disable_threat_computation
+           && (owl_threats 
+               || thrashing_stone[str])) {
+         if (acode && !dcode && DRAGON2(str).owl_attack_point != NO_MOVE) {
+           if (owl_threaten_defense(str, &defense_point,
+                                    &second_defense_point)) {
+             DRAGON2(str).owl_threat_status = CAN_THREATEN_DEFENSE;
+             DRAGON2(str).owl_defense_point = defense_point;
+             DRAGON2(str).owl_second_defense_point = second_defense_point;
+           }
+           else
+             DRAGON2(str).owl_threat_status = DEAD;
+         }
+         else if (!acode) {
+           int attack_point, second_attack_point;
+           if (owl_threaten_attack(str, 
+                                   &attack_point, &second_attack_point)) {
+             DRAGON2(str).owl_threat_status = CAN_THREATEN_ATTACK;
+             DRAGON2(str).owl_attack_point = attack_point;
+             DRAGON2(str).owl_second_attack_point = second_attack_point;
+           }
+           else
+             DRAGON2(str).owl_threat_status = ALIVE;
+         }
+       }
+      }
+    }
+  
+  /* Once again, the dragon data is now correct at the origin of each dragon
+   * but we need to copy it to every vertex.  
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str) && board[str] != EMPTY)
+      dragon[str] = dragon[dragon[str].origin];
+
+  time_report(2, "  owl threats ", NO_MOVE, 1.0);
+  
+
+  /* Compute the safety value. */
+  for (d = 0; d < number_of_dragons; d++) {
+    int true_genus;
+    int origin = dragon2[d].origin;
+    struct eyevalue *genus = &dragon2[d].genus;
+
+    /* FIXME: We lose information when constructing true_genus. This
+     * code can be improved.
+     */
+    true_genus = max_eyes(genus) + min_eyes(genus);
+    if (dragon_looks_inessential(origin))
+      dragon2[d].safety = INESSENTIAL;
+    else if (dragon[origin].size == worm[origin].size
+            && worm[origin].attack_codes[0] != 0
+            && worm[origin].defense_codes[0] == 0)
+      dragon2[d].safety = TACTICALLY_DEAD;
+    else if (0) /* Seki is detected by the call to semeai() below. */
+      dragon2[d].safety = ALIVE_IN_SEKI;
+    else if (dragon_invincible(origin)) {
+      dragon2[d].safety = INVINCIBLE;
+      /* Sometimes the owl analysis may have misevaluated invincible
+       * dragons, typically if they live by topologically false eyes.
+       * Therefore we also set the status here.
+       */
+      DRAGON(d).status = ALIVE;
+    }
+    else if (dragon2[d].owl_status == DEAD)
+      dragon2[d].safety = DEAD;
+    else if (dragon2[d].owl_status == CRITICAL)
+      dragon2[d].safety = CRITICAL;
+    else if (true_genus >= 6 || dragon2[d].moyo_size > 20)
+      dragon2[d].safety = STRONGLY_ALIVE;
+    else
+      dragon2[d].safety = ALIVE;
+  }
+
+  /* The status is now correct at the origin of each dragon
+   * but we need to copy it to every vertex.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str))
+      dragon[str].status = dragon[dragon[str].origin].status;
+
+  /* Revise inessentiality of critical worms and dragons. */
+  revise_inessentiality();
+
+  semeai();
+  time_report(2, "  semeai module", NO_MOVE, 1.0);
+  
+  /* Count the non-dead dragons. */
+  lively_white_dragons = 0;
+  lively_black_dragons = 0;
+  for (d = 0; d < number_of_dragons; d++)
+    if (DRAGON(d).status != DEAD) {
+      if (DRAGON(d).color == WHITE)
+        lively_white_dragons++;
+      else
+        lively_black_dragons++;
+    }
+}
+
+
+/* Find capturable worms adjacent to each dragon. */
+static void
+find_lunches()
+{
+  int str;
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str)) {
+      int food;
+
+      if (worm[str].origin != str
+         || board[str] == EMPTY
+         || worm[str].lunch == NO_MOVE)
+       continue;
+
+      food = worm[str].lunch;
+
+      /* In contrast to worm lunches, a dragon lunch must also be
+       * able to defend itself. 
+       */
+      if (worm[food].defense_codes[0] == 0)
+       continue;
+
+      /* Tell the move generation code about the lunch. */
+      add_lunch(str, food);
+       
+      /* If several lunches are found, we pick the juiciest.
+       * First maximize cutstone, then minimize liberties.
+       */
+      {
+       int origin = dragon[str].origin;
+       int lunch = DRAGON2(origin).lunch;
+
+       if (lunch == NO_MOVE
+           || worm[food].cutstone > worm[lunch].cutstone
+           || (worm[food].cutstone == worm[lunch].cutstone
+               && (worm[food].liberties < worm[lunch].liberties))) {
+         DRAGON2(origin).lunch = worm[food].origin;
+         TRACE("at %1m setting %1m.lunch to %1m (cutstone=%d)\n",
+               str, origin,
+               worm[food].origin, worm[food].cutstone);
+       }
+      }
+    }
+}
+
+
+/* Compute the value of each eye space. Store its attack and defense point.
+ * A more comlete list of attack and defense points is stored in the lists
+ * black_vital_points and white_vital_points.
+ */
+static void
+eye_computations()
+{ 
+  int str;
+
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (!ON_BOARD(str))
+      continue;
+
+    if (black_eye[str].color == BLACK
+       && black_eye[str].origin == str) {
+      struct eyevalue value;
+      int attack_point, defense_point;
+      
+      compute_eyes(str, &value, &attack_point, &defense_point, 
+                  black_eye, half_eye, 1);
+      DEBUG(DEBUG_EYES, "Black eyespace at %1m: %s\n", str,
+           eyevalue_to_string(&value));
+      black_eye[str].value = value;
+      propagate_eye(str, black_eye);
+    }
+    
+    if (white_eye[str].color == WHITE
+       && white_eye[str].origin == str) {
+      struct eyevalue value;
+      int attack_point, defense_point;
+      
+      compute_eyes(str, &value, &attack_point, &defense_point,
+                  white_eye, half_eye, 1);
+      DEBUG(DEBUG_EYES, "White eyespace at %1m: %s\n", str,
+           eyevalue_to_string(&value));
+      white_eye[str].value = value;
+      propagate_eye(str, white_eye);
+    }
+  }
+}
+
+
+/* This function revises the inessentiality of critical worms and dragons
+ * according to the criteria explained in the comments below.
+ */
+static void
+revise_inessentiality()
+{
+  int str;
+  /* Revise essentiality of critical worms. Specifically, a critical
+   * worm which is adjacent to no enemy dragon with status
+   * better than DEAD, is considered INESSENTIAL.
+   *
+   * A typical case of this is
+   *
+   * |.XXXX
+   * |.OO.X
+   * |X.O.X
+   * |.OO.X
+   * +-----
+   *
+   * However, to be able to deal with the position
+   *
+   * |.XXXX
+   * |.OOOO
+   * |..O.O
+   * |X.OOO
+   * |..O.O
+   * +-----
+   *
+   * we need to extend "adjacent" to "adjacent or shares a liberty",
+   * which is why we use extended_chainlinks() rather than
+   * chainlinks().
+   *
+   * Finally, if the position above is slightly modified to
+   *
+   * |.XXXXX
+   * |.OOOOO
+   * |...O.O
+   * |X..OOO
+   * |...O.O
+   * +------
+   *
+   * we have a position where the critical X stone doesn't share a
+   * liberty with any string at all. Thus the revised rule is:
+   *
+   * A critical worm which is adjacent to or share a liberty with at
+   * least one dead opponent dragon and no opponent dragon which is
+   * not dead, is considered inessential.
+   */
+
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str)) {
+      if (is_worm_origin(str, str)
+         && worm[str].attack_codes[0] != 0
+         && worm[str].defense_codes[0] != 0
+         && !worm[str].inessential) {
+       int adjs[MAXCHAIN];
+       int neighbors;
+       int r;
+       int essential = 0;
+       
+       neighbors = extended_chainlinks(str, adjs, 0);
+       for (r = 0; r < neighbors; r++)
+         if (dragon[adjs[r]].status != DEAD) {
+           essential = 1;
+           break;
+         }
+
+       if (!essential && neighbors > 0) {
+         DEBUG(DEBUG_WORMS, "Worm %1m revised to be inessential.\n", str);
+         worm[str].inessential = 1;
+         propagate_worm(str);
+       }
+      }
+    }
+
+  /* Revise essentiality of critical dragons. Specifically, a critical
+   * dragon consisting entirely of inessential worms is considered
+   * INESSENTIAL.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (ON_BOARD(str)
+       && board[str] != EMPTY
+       && dragon[str].origin == str
+       && DRAGON2(str).safety == CRITICAL) {
+      int w;
+      for (w = first_worm_in_dragon(str); w != NO_MOVE;
+          w = next_worm_in_dragon(w)) {
+       if (!worm[w].inessential)
+         break;
+      }
+
+      if (w == NO_MOVE) {
+       DEBUG(DEBUG_DRAGONS, "Dragon %1m revised to be inessential.\n", str);
+       DRAGON2(str).safety = INESSENTIAL;
+      }
+    }
+  }
+}
+
+/* Initialize the dragon[] array. */
+
+void
+initialize_dragon_data(void)
+{
+  int str;
+  /* VALGRIND_MAKE_WRITABLE(dragon, BOARDMAX * sizeof(struct dragon_data)); */
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str)) {
+
+      dragon[str].id                 = -1;
+      dragon[str].size               = worm[str].size;
+      dragon[str].effective_size     = worm[str].effective_size;
+      dragon[str].color              = worm[str].color;
+      dragon[str].origin             = worm[str].origin;
+      dragon[str].crude_status       = UNKNOWN;
+      dragon[str].status             = UNKNOWN;
+      half_eye[str].type             =  0;
+      half_eye[str].value            =  10.0; /* Something big. */
+      
+      if (IS_STONE(board[str]) && worm[str].origin == str)
+       DEBUG(DEBUG_DRAGONS, 
+             "Initializing dragon from worm at %1m, size %d\n", 
+             str, worm[str].size);
+    }
+  memset(next_worm_list, 0, sizeof(next_worm_list));
+
+  /* We need to reset this to avoid trouble on an empty board when
+   * moves have previously been generated for a non-empty board.
+   *
+   * Comment: The cause of this is that make_dragons() is not called
+   * for an empty board, only initialize_dragon_data(), so we never
+   * reach initialize_supplementary_dragon_data().
+   */
+  number_of_dragons = 0;
+
+  clear_cut_list();
+
+  memset(black_vital_points, 0, BOARDMAX * sizeof(struct vital_eye_points));
+  memset(white_vital_points, 0, BOARDMAX * sizeof(struct vital_eye_points));
+}
+
+
+/* Initialize the dragon2[] array. */
+static void
+initialize_supplementary_dragon_data(void)
+{
+  int str;
+  int d;
+  int origin;
+  
+  /* Give each dragon (caves excluded) an id number for indexing into
+   * the dragon2 array. After this the DRAGON2 macro can be used.
+   */
+  number_of_dragons = 0;
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (!ON_BOARD(str))
+      continue;
+    origin = dragon[str].origin;
+    
+    if (board[str] == EMPTY)
+      continue;
+    
+    if (dragon[origin].id == -1)
+      dragon[origin].id = number_of_dragons++;
+    dragon[str].id = dragon[origin].id;
+  }
+  
+  /* Now number_of_dragons contains the number of dragons and we can
+   * allocate a dragon2 array of the appropriate size. First throw
+   * away the old array.
+   *
+   * FIXME: As a future optimization we should only allocate a new
+   *       array if the old one is too small.
+   */
+  if (dragon2 != NULL)
+    free(dragon2);
+  
+  dragon2 = malloc(number_of_dragons * sizeof(*dragon2));
+  gg_assert(dragon2 != NULL);
+  
+  /* Find the origins of the dragons to establish the mapping back to
+   * the board. After this the DRAGON macro can be used.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (!ON_BOARD(str))
+      continue;
+    if (IS_STONE(board[str])
+       && dragon[str].origin == str) {
+      DRAGON2(str).origin = str;
+    }
+  }
+  
+  /* Initialize the rest of the dragon2 data. */
+  for (d = 0; d < number_of_dragons; d++) {
+    dragon2[d].neighbors                = 0;
+    dragon2[d].hostile_neighbors        = 0;
+
+    dragon2[d].moyo_size               = -1;
+    dragon2[d].moyo_territorial_value   = 0.0;
+    dragon2[d].safety                   = -1;
+    dragon2[d].escape_route             = 0;
+    dragon2[d].heye                     = NO_MOVE;
+    dragon2[d].lunch                    = NO_MOVE;
+    dragon2[d].surround_status          = 0;
+    set_eyevalue(&dragon2[d].genus, 0, 0, 0, 0);
+
+    dragon2[d].semeais                  = 0;
+    dragon2[d].semeai_defense_code     = 0;
+    dragon2[d].semeai_defense_point    = NO_MOVE;
+    dragon2[d].semeai_attack_code      = 0;
+    dragon2[d].semeai_attack_point     = NO_MOVE;
+    dragon2[d].owl_attack_point         = NO_MOVE;
+    dragon2[d].owl_attack_code          = 0;
+    dragon2[d].owl_attack_certain       = 1;
+    dragon2[d].owl_defense_point        = NO_MOVE;
+    dragon2[d].owl_defense_code         = 0;
+    dragon2[d].owl_defense_certain      = 1;
+    dragon2[d].owl_status               = UNCHECKED;
+    dragon2[d].owl_threat_status        = UNCHECKED;
+    dragon2[d].owl_second_attack_point  = NO_MOVE;
+    dragon2[d].owl_second_defense_point = NO_MOVE;
+  }
+  
+  dragon2_initialized = 1;
+}
+
+/* Examine which dragons are adjacent to each other. This is
+ * complicated by the fact that adjacency may involve a certain
+ * amount of empty space.
+ *
+ * The approach we use is to extend the dragons into their
+ * surrounding influence areas until they collide. We also accept
+ * one step extensions into neutral regions. After having done this
+ * we can look for immediate adjacencies.
+ */
+static void
+find_neighbor_dragons()
+{
+  int m, n;
+  int pos;
+  int pos2;
+  int i, j;
+  int d;
+  int dragons[BOARDMAX];
+  int distances[BOARDMAX];
+  int dist;
+  int k;
+  int color;
+
+  gg_assert(dragon2_initialized);
+  
+  /* Initialize the arrays. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos])) {
+      dragons[pos] = dragon[pos].id;
+      distances[pos] = 0;
+    }
+    else if (ON_BOARD(pos)) {
+      dragons[pos] = -1;
+      distances[pos] = -1;
+    }
+  }
+
+  /* Expand from dist-1 to dist. Break out of the loop at the end if
+   * we couldn't expand anything. Never expand more than five steps.
+   */
+  for (dist = 1; dist <= 5; dist++) {
+    int found_one = 0;
+      
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+    
+      if (distances[pos] != dist-1 || dragons[pos] < 0)
+       continue;
+      
+      color = DRAGON(dragons[pos]).color;
+      for (k = 0; k < 4; k++) {
+       pos2 = pos + delta[k];
+       
+       if (!ON_BOARD1(pos2))
+         continue;
+       
+       /* Consider expansion from (pos) to adjacent intersection
+        * (pos2).
+        */
+       if (distances[pos2] >= 0 && distances[pos2] < dist)
+         continue; /* (pos2) already occupied. */
+
+       /* We can always expand the first step, regardless of influence. */
+       if (dist == 1
+           || (whose_area(INITIAL_INFLUENCE(color), pos) == color
+               && whose_area(INITIAL_INFLUENCE(color), pos2)
+                  != OTHER_COLOR(color))) {
+         /* Expansion ok. Now see if someone else has tried to
+          * expand here. In that case we indicate a collision by
+          * setting the dragon number to -2.
+          */
+         if (distances[pos2] == dist) {
+           if (dragons[pos2] != dragons[pos])
+             dragons[pos2] = -2;
+         }
+         else {
+           dragons[pos2] = dragons[pos];
+           distances[pos2] = dist;
+           found_one = 1;
+         }
+       }
+      }
+    }
+    if (!found_one)
+      break;
+  }
+  
+  if (0) {
+    for (m = 0; m < board_size; m++) {
+      for (n = 0; n < board_size; n++)
+       fprintf(stderr, "%3d", dragons[POS(m, n)]);
+      fprintf(stderr, "\n");
+    }
+    fprintf(stderr, "\n");
+      
+    for (m = 0; m < board_size; m++) {
+      for (n = 0; n < board_size; n++)
+       fprintf(stderr, "%3d", distances[POS(m, n)]);
+      fprintf(stderr, "\n");
+    }
+    fprintf(stderr, "\n");
+  }
+
+  /* Now go through dragons to find neighbors. It suffices to look
+   * south and east for neighbors. In the case of a collision zone
+   * where dragons==-2 we set all the neighbors of this intersection
+   * as adjacent to each other.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (dragons[pos] == -2) {
+      int neighbors = 0;
+      int adjacent[4];
+
+      for (k = 0; k < 4; k++) {
+       pos2 = pos + delta[k];
+
+       if (ON_BOARD1(pos2) && dragons[pos2] >= 0)
+         adjacent[neighbors++] = dragons[pos2];
+      }
+      for (i = 0; i < neighbors; i++)
+       for (j = i+1; j < neighbors; j++)
+         add_adjacent_dragons(adjacent[i], adjacent[j]);
+    }
+    else if (dragons[pos] >= 0) {
+      if (ON_BOARD(NORTH(pos))) {
+       if (dragons[NORTH(pos)] >= 0
+           && dragons[NORTH(pos)] != dragons[pos])
+         add_adjacent_dragons(dragons[pos], dragons[NORTH(pos)]);
+      }
+      if (ON_BOARD(EAST(pos))) {
+       if (dragons[EAST(pos)] >= 0
+           && dragons[EAST(pos)] != dragons[pos])
+         add_adjacent_dragons(dragons[pos], dragons[EAST(pos)]);
+      }
+    }
+  }
+  
+  if (0) {
+    for (d = 0; d < number_of_dragons; d++) {
+      gprintf("dragon %d at %1m:", d, dragon2[d].origin);
+      for (i = 0; i < dragon2[d].neighbors; i++)
+       gprintf(" %1m(%d)", dragon2[dragon2[d].adjacent[i]].origin,
+               dragon2[d].adjacent[i]);
+      gprintf("\n");
+    }
+  }
+}
+
+/* Add the dragons with id a and b as adjacent to each other. */
+static void
+add_adjacent_dragons(int a, int b)
+{
+  gg_assert(a >= 0 && a < number_of_dragons
+           && b >= 0 && b < number_of_dragons);
+  if (a == b)
+    return;
+  add_adjacent_dragon(a, b);
+  add_adjacent_dragon(b, a);
+}
+
+/* Add the dragon with id b as adjacent to a. */
+static void
+add_adjacent_dragon(int a, int b)
+{
+  int i;
+  gg_assert(a >= 0 && a < number_of_dragons
+           && b >= 0 && b < number_of_dragons);
+  /* If the array of adjacent dragons already is full, ignore
+   * additional neighbors.
+   */
+  if (dragon2[a].neighbors == MAX_NEIGHBOR_DRAGONS)
+    return;
+  
+  for (i = 0; i < dragon2[a].neighbors; i++)
+    if (dragon2[a].adjacent[i] == b)
+      return;
+
+  dragon2[a].adjacent[dragon2[a].neighbors++] = b;
+
+  if (DRAGON(a).color == OTHER_COLOR(DRAGON(b).color))
+    dragon2[a].hostile_neighbors++;
+}
+
+/* A dragon is considered invincible if it satisfies either of the two
+ * following conditions:
+ * a) At least two distinct eyespaces without topological halfeyes,
+ *    marginal vertices, or tactically critical or alive opponent strings.
+ *    Furthermore there may not be an owl attack of the dragon.
+ * b) At least one string which is unconditionally alive according to the
+ *    unconditional_life() function in utils.c.
+ *
+ * For the requirement on opponent strings in a), see e.g.
+ * seki:404,408,409,413,504,604,908.
+ */
+
+static int
+dragon_invincible(int dr)
+{
+  struct eye_data *eye;
+  int eye_color;
+  int k;
+  int pos;
+  int strong_eyes = 0;
+  int mx[BOARDMAX];
+  
+  ASSERT1(IS_STONE(board[dr]), dr);
+
+  /* First look for invincible strings in the dragon. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && is_same_dragon(pos, dr) && worm[pos].invincible)
+      return 1;
+  }
+
+  /* Can the dragon be owl attacked? */
+  if (DRAGON2(dr).owl_status != UNCHECKED && DRAGON2(dr).owl_status != ALIVE)
+    return 0;
+  
+  /* Examine the eye spaces. */
+  if (board[dr] == BLACK) {
+    eye = black_eye;
+    eye_color = BLACK;
+  }
+  else {
+    eye = white_eye;
+    eye_color = WHITE;
+  }
+
+  memset(mx, 0, sizeof(mx));
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == board[dr] && is_same_dragon(pos, dr)) {
+      for (k = 0; k < 4; k++) {
+       int pos2 = pos + delta[k];
+       if (ON_BOARD(pos2)
+           && eye[pos2].color == eye_color
+           && eye[pos2].origin != NO_MOVE) {
+         if (eye[pos2].marginal
+             || is_halfeye(half_eye, pos2))
+           mx[eye[pos2].origin] = 2; /* bad eye */
+         else if (mx[eye[pos2].origin] == 0)
+           mx[eye[pos2].origin] = 1; /* good eye */
+         
+         if (board[pos2] == OTHER_COLOR(board[dr])
+             && (!attack(pos2, NULL) || find_defense(pos2, NULL)))
+           mx[eye[pos2].origin] = 2; /* bad eye */
+       }
+      }
+    }
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    /* Necessary to check eye margins here since the loop above only
+     * considers margins which are directly adjacent to some stone of
+     * the dragon.
+     */
+    if (mx[pos] == 1
+       && eye[pos].msize == 0)
+      strong_eyes++;
+  }
+
+  if (strong_eyes >= 2)
+    return 1;
+
+  return 0;
+}
+
+
+/* A dragon looks inessential if it satisfies all of
+ * 1. Is a single string.
+ * 2. Is not owl substantial.
+ *
+ * FIXME: Probably need a better definition of INESSENTIAL dragons.
+ *        There are cases where a string is owl insubstantial
+ *        yet allowing it to be captured greatly weakens our
+ *        position.
+ */
+static int
+dragon_looks_inessential(int origin)
+{
+#if 0
+  int d;
+  int k;
+#endif
+  
+  if (dragon[origin].size != worm[origin].size)
+    return 0;
+
+  if (owl_substantial(origin))
+    return 0;
+
+#if 0
+  /* This is a proposed modification which solves 13x13:72 but
+   * breaks buzco:5. It adds the two requirements:
+   *
+   * 3. Has no opponent neighbor with status better than DEAD.
+   * 4. Has no opponent neighbor with escape value bigger than 0.
+   *
+   * This probably needs to be revised before it's enabled.
+   */
+  for (k = 0; k < DRAGON2(origin).neighbors; k++) {
+    d = DRAGON2(origin).adjacent[k];
+    if (DRAGON(d).color != board[origin]
+       && (DRAGON(d).status != DEAD
+           || dragon2[d].escape_route > 0))
+      return 0;
+  }
+#endif
+  
+  return 1;
+}
+
+
+/* Report which stones are alive if it's (color)'s turn to move. I.e.
+ * critical stones belonging to (color) are considered alive.
+ * A stone is dead resp. critical if the tactical reading code _or_ the
+ * owl code thinks so.
+ */
+static void
+get_alive_stones(int color, signed char safe_stones[BOARDMAX])
+{
+  int d;
+  get_lively_stones(color, safe_stones);
+  for (d = 0; d < number_of_dragons; d++) {
+    if (dragon2[d].safety == DEAD
+       || (dragon2[d].safety == CRITICAL
+           && board[dragon2[d].origin] == OTHER_COLOR(color))) {
+      mark_dragon(dragon2[d].origin, safe_stones, 0);
+    }
+  }
+}
+
+
+/* If the opponent's last move is a dead dragon, this is called a
+ * *thrashing dragon*. We must be careful because the opponent may be
+ * trying to trick us, so even though GNU Go thinks the stone is dead,
+ * we should consider attacking it, particularly if we are ahead.
+ *
+ * This function determines whether the last played move is part of a
+ * dead dragon. It also looks for dead friendly neighbors of the
+ * thrashing dragon, which are also considered as thrashing. The
+ * stones of the primary thrashing dragon are marked by 1 in the
+ * thrashing_stone[] array and its neighbors are marked by 2.
+ * Neighbors of neighbors are marked 3, and so on, up to at most
+ * distance 5.
+ */
+static void
+identify_thrashing_dragons()
+{
+  int k;
+  int dist;
+  int last_move;
+  int color;
+
+  thrashing_dragon = 0;
+  memset(thrashing_stone, 0, sizeof(thrashing_stone));
+
+  last_move = get_last_move();
+  if (last_move == NO_MOVE
+      || dragon[last_move].status != DEAD)
+    return;
+
+  thrashing_dragon = dragon[last_move].origin;
+  DEBUG(DEBUG_DRAGONS, "thrashing dragon found at %1m\n", thrashing_dragon);
+  mark_dragon(thrashing_dragon, thrashing_stone, 1);
+  color = board[thrashing_dragon];
+  
+  for (dist = 1; dist < 5; dist++) {
+    int pos;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (board[pos] != color
+         || dragon[pos].origin != pos
+         || thrashing_stone[pos] != dist)
+       continue;
+      
+      for (k = 0; k < DRAGON2(pos).neighbors; k++) {
+       int d = DRAGON2(pos).adjacent[k];
+       if (DRAGON(d).color == color
+           && DRAGON(d).status == DEAD
+           && thrashing_stone[dragon2[d].origin] == 0) {
+         DEBUG(DEBUG_DRAGONS,
+               "neighbor at distance %d of thrashing dragon found at %1m\n",
+               dist + 1, DRAGON(d).origin);
+         mark_dragon(DRAGON(d).origin, thrashing_stone,
+                     (signed char)(dist + 1));
+       }
+      }
+    }
+  }
+}
+
+
+static void
+set_dragon_strengths(const signed char safe_stones[BOARDMAX],
+                    float strength[BOARDMAX])
+{
+  int ii;
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      if (safe_stones[ii]) {
+       ASSERT1(IS_STONE(board[ii]), ii);
+       strength[ii] = DEFAULT_STRENGTH
+                      * (1.0 - 0.3 * DRAGON2(ii).weakness_pre_owl);
+      }
+      else
+       strength[ii] = 0.0;
+    }
+}
+
+/* Marks all inessential stones with INFLUENCE_SAFE_STONE, leaves
+ * everything else unchanged.
+ */
+void
+mark_inessential_stones(int color, signed char safe_stones[BOARDMAX])
+{
+  int ii;
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (IS_STONE(board[ii])
+       && (DRAGON2(ii).safety == INESSENTIAL
+           || (worm[ii].inessential
+               /* FIXME: Why is the check below needed?
+                * Why does it use .safety, not .status? /ab
+                */
+               && ((DRAGON2(ii).safety != DEAD
+                    && DRAGON2(ii).safety != TACTICALLY_DEAD
+                    && DRAGON2(ii).safety != CRITICAL)
+                   || (DRAGON2(ii).safety == CRITICAL
+                       && board[ii] == color)))))
+      safe_stones[ii] = INFLUENCE_SAFE_STONE;
+}
+
+void
+set_strength_data(int color, signed char safe_stones[BOARDMAX],
+                 float strength[BOARDMAX])
+{
+  gg_assert(IS_STONE(color) || color == EMPTY);
+
+  get_alive_stones(color, safe_stones);
+  set_dragon_strengths(safe_stones, strength);
+  mark_inessential_stones(color, safe_stones);
+}
+
+
+void
+compute_dragon_influence()
+{
+  signed char safe_stones[BOARDMAX];
+  float strength[BOARDMAX];
+
+  set_strength_data(BLACK, safe_stones, strength);
+  compute_influence(BLACK, safe_stones, strength, &initial_black_influence,
+                    NO_MOVE, "initial black influence, dragons known");
+  break_territories(BLACK, &initial_black_influence, 1, NO_MOVE);
+
+  set_strength_data(WHITE, safe_stones, strength);
+  compute_influence(WHITE, safe_stones, strength, &initial_white_influence,
+                    NO_MOVE, "initial white influence, dragons known");
+  break_territories(WHITE, &initial_white_influence, 1, NO_MOVE);
+}
+
+
+/* Compute dragon's genus, possibly excluding one given eye.  To
+ * compute full genus, just set `eye_to_exclude' to NO_MOVE.
+ */
+void
+compute_dragon_genus(int d, struct eyevalue *genus, int eye_to_exclude)
+{
+  int pos;
+  int dr;
+
+  ASSERT1(IS_STONE(board[d]), d);
+  gg_assert(eye_to_exclude == NO_MOVE || ON_BOARD1(eye_to_exclude));
+
+  set_eyevalue(genus, 0, 0, 0, 0);
+
+  if (board[d] == BLACK) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+
+      if (black_eye[pos].color == BLACK
+         && black_eye[pos].origin == pos
+         && (eye_to_exclude == NO_MOVE
+             || black_eye[eye_to_exclude].origin != pos)
+         && find_eye_dragons(pos, black_eye, BLACK, &dr, 1) == 1
+         && is_same_dragon(dr, d)) {
+       TRACE("eye at %1m (%s) found for dragon at %1m--augmenting genus\n",
+             pos, eyevalue_to_string(&black_eye[pos].value), dr);
+
+       if (eye_to_exclude == NO_MOVE
+           && (eye_move_urgency(&black_eye[pos].value)
+               > eye_move_urgency(genus)))
+         DRAGON2(d).heye = black_vital_points[pos].defense_points[0];
+
+       add_eyevalues(genus, &black_eye[pos].value, genus);
+      }
+    }
+  }
+  else {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+
+      if (white_eye[pos].color == WHITE
+         && white_eye[pos].origin == pos
+         && (eye_to_exclude == NO_MOVE
+             || white_eye[eye_to_exclude].origin != pos)
+         && find_eye_dragons(pos, white_eye, WHITE, &dr, 1) == 1
+         && is_same_dragon(dr, d)) {
+       TRACE("eye at %1m (%s) found for dragon at %1m--augmenting genus\n",
+             pos, eyevalue_to_string(&white_eye[pos].value), dr);
+
+       if (eye_to_exclude == NO_MOVE
+           && (eye_move_urgency(&white_eye[pos].value)
+               > eye_move_urgency(genus)))
+         DRAGON2(d).heye = white_vital_points[pos].defense_points[0];
+
+       add_eyevalues(genus, &white_eye[pos].value, genus);
+      }
+    }
+  }
+}
+
+
+/* Try to determine whether topologically false and half eye points
+ * contribute to territory even if the eye doesn't solidify. The purpose
+ * is to be able to distinguish between, e.g., these positions:
+ *
+ * |.OOOOO       |.OOOOO
+ * |.O.XXO       |.O.OXO
+ * |OOX.XO       |OOX.XO
+ * |O*XXXO  and  |O*XXXO
+ * |OX.XOO       |OX.XOO
+ * |X.XOO.       |X.XOO.
+ * |.XXO..       |.XXO..
+ * +------       +------
+ * 
+ * In the left one the move at * is a pure dame point while in the
+ * right one it is worth one point of territory for either player.
+ *
+ * In general the question is whether a topologically false eye vertex
+ * counts as territory or not and the answer depends on whether each
+ * string adjoining the eye is externally connected to at least one
+ * proper eye.
+ *
+ * This function loops over the topologically false and half eye
+ * vertices and calls connected_to_eye() for each adjoining string to
+ * determine whether they all have external connection to an eye. The
+ * result is stored in the false_eye_territory[] array.
+ */
+static void
+analyze_false_eye_territory(void)
+{
+  int pos;
+  int color;
+  int eye_color;
+  struct eye_data *eye;
+  int k;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    
+    false_eye_territory[pos] = 0;
+
+    /* The analysis only applies to false and half eyes. */
+    if (half_eye[pos].type == 0)
+      continue;
+
+    /* Determine the color of the eye. */
+    if (white_eye[pos].color == WHITE) {
+      color = WHITE;
+      eye_color = WHITE;
+      eye = white_eye;
+    }
+    else if (black_eye[pos].color == BLACK) {
+      color = BLACK;
+      eye_color = BLACK;
+      eye = black_eye;
+    }
+    else
+      continue;
+
+    /* Make sure we have a "closed" position. Positions like
+     *
+     * |XXXXXX.
+     * |OOOOOXX
+     * |.O.O*..
+     * +-------
+     *
+     * disqualify without further analysis. (* is a false eye vertex)
+     */
+    for (k = 0; k < 4; k++)
+      if (ON_BOARD(pos + delta[k])
+         && board[pos + delta[k]] != color
+         && eye[pos + delta[k]].color != eye_color)
+       break;
+     
+    if (k < 4)
+      continue;
+
+    /* Check that all adjoining strings have external connection to an
+     * eye.
+     */
+    for (k = 0; k < 4; k++)
+      if (ON_BOARD(pos + delta[k])
+         && board[pos + delta[k]] == color
+         && !connected_to_eye(pos, pos + delta[k], color, eye_color, eye))
+       break;
+
+    if (k == 4) {
+      false_eye_territory[pos] = 1;
+      if (0)
+       gprintf("False eye territory at %1m\n", pos);
+    }
+  }
+
+  /* FIXME: This initialization doesn't really belong here but must be
+   *        done somewhere within examine_position().
+   *        The array is eventually filled by the endgame() function.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      forced_backfilling_moves[pos] = 0;
+}
+
+/* 
+ * This function (implicitly) finds the connected set of strings of a
+ * dragon, starting from (str) which is next to the analyzed halfeye
+ * at (pos). Strings are for this purpose considered connected if and
+ * only if they have a common liberty, which is not allowed to be the
+ * half eye itself or one of its diagonal neighbors. For these strings
+ * it is examined whether their liberties are parts of eyespaces worth
+ * at least two halfeyes (again not counting the eyespace at (pos)).
+ *
+ * The real work is done by the recursive function
+ * connected_to_eye_recurse() below.
+ */
+static int
+connected_to_eye(int pos, int str, int color, int eye_color,
+                struct eye_data *eye)
+{
+  signed char mx[BOARDMAX];
+  signed char me[BOARDMAX];
+  int k;
+  int halfeyes;
+
+  /* mx marks strings and liberties which have already been investigated.
+   * me marks the origins of eyespaces which have already been counted.
+   * Start by marking (pos) and the surrounding vertices in mx.
+   */
+  memset(mx, 0, sizeof(mx));
+  memset(me, 0, sizeof(me));
+  mx[pos] = 1;
+  for (k = 0; k < 8; k++)
+    if (ON_BOARD(pos + delta[k]))
+      mx[pos + delta[k]] = 1;
+
+  halfeyes = 0;
+  connected_to_eye_recurse(pos, str, color, eye_color, eye, mx, me, &halfeyes);
+
+  if (halfeyes >= 2)
+    return 1;
+  
+  return 0;
+}
+
+/* Recursive helper for connected_to_eye(). Stop searching when we
+ * have found at least two halfeyes.
+ */
+static void
+connected_to_eye_recurse(int pos, int str, int color, int eye_color,
+                        struct eye_data *eye, signed char *mx,
+                        signed char *me, int *halfeyes)
+{
+  int liberties;
+  int libs[MAXLIBS];
+  int r;
+  int k;
+
+  mark_string(str, mx, 1);
+  liberties = findlib(str, MAXLIBS, libs);
+
+  /* Search the liberties of (str) for eyespaces. */
+  for (r = 0; r < liberties; r++) {
+    if (eye[libs[r]].color == eye_color
+       && libs[r] != pos
+       && !me[eye[libs[r]].origin]) {
+      me[eye[libs[r]].origin] = 1;
+      *halfeyes += (min_eyes(&eye[libs[r]].value)
+                   + max_eyes(&eye[libs[r]].value));
+    }
+  }
+
+  if (*halfeyes >= 2)
+    return;
+
+  /* Search for new strings in the same dragon with a liberty in
+   * common with (str), and recurse.
+   */
+  for (r = 0; r < liberties; r++) {
+    if (mx[libs[r]])
+      continue;
+    mx[libs[r]] = 1;
+    for (k = 0; k < 4; k++) {
+      if (ON_BOARD(libs[r] + delta[k])
+         && board[libs[r] + delta[k]] == color
+         && is_same_dragon(str, libs[r] + delta[k])
+         && !mx[libs[r] + delta[k]])
+       connected_to_eye_recurse(pos, libs[r] + delta[k], color, eye_color,
+                                eye, mx, me, halfeyes);
+      if (*halfeyes >= 2)
+       return;
+    }
+  }
+}
+
+/* print status info on all dragons. (Can be invoked from gdb) 
+ */
+void 
+show_dragons(void)
+{
+  int pos;
+  int k;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    struct worm_data *w = &(worm[pos]);
+    if (!IS_STONE(board[pos]))
+      continue;
+
+    if (w->origin == pos) {
+      gprintf("%1m : (dragon %1m) %s string of size %d (%f), genus %d: (%d,%d,%d,%d)",
+             pos, dragon[pos].origin,
+             color_to_string(board[pos]),
+             w->size,
+             w->effective_size,
+             w->genus,
+             w->liberties,
+             w->liberties2,
+             w->liberties3,
+             w->liberties4);
+      if (w->cutstone == 1)
+       gprintf("%o - is a potential cutting stone\n");
+      else if (w->cutstone == 2)
+       gprintf("%o - is a cutting stone\n");
+      else
+       gprintf("%o\n");
+      
+      if (w->cutstone2 > 0)
+       gprintf("- cutstone2 = %d\n", w->cutstone2);
+      
+      for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+       if (w->attack_codes[k] == 0)
+         break;
+       gprintf("- attackable at %1m, attack code = %d\n",
+               w->attack_points[k], w->attack_codes[k]);
+      }
+      
+      for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+       if (w->defense_codes[k] == 0)
+         break;
+       gprintf("- defendable at %1m, defend code = %d\n",
+               w->defense_points[k], w->defense_codes[k]);
+      }
+      
+      for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+       if (w->attack_threat_codes[k] == 0)
+         break;
+       gprintf("- attack threat at %1m, attack threat code = %d\n",
+               w->attack_threat_points[k], w->attack_threat_codes[k]);
+      }
+      
+      for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+       if (w->defense_threat_codes[k] == 0)
+         break;
+       gprintf("- defense threat at %1m, defense threat code = %d\n",
+               w->defense_threat_points[k], w->defense_threat_codes[k]);
+      }
+      
+      if (w->lunch != NO_MOVE)
+       gprintf("... adjacent worm %1m is lunch\n", w->lunch);
+      
+      if (w->inessential)
+       gprintf("- is inessential\n");
+      
+      if (w->invincible)
+       gprintf("- is invincible\n");
+      
+      if (is_ko_point(pos))
+       gprintf("- is a ko stone\n");
+    }
+  }
+    
+  gprintf("%o\n");
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    struct dragon_data *dd = &(dragon[pos]);
+    struct dragon_data2 *d2;
+    
+    if (!IS_STONE(board[pos]))
+      continue;
+    
+    d2 = &(dragon2[dd->id]);
+    
+    if (dd->origin == pos) {
+      gprintf("%1m : %s dragon size %d (%f), genus %s, escape factor %d, crude status %s, status %s, moyo size %d, moyo territory value %f, safety %s, weakness pre owl %f, weakness %f",
+             pos,
+             board[pos] == BLACK ? "B" : "W",
+             dd->size,
+             dd->effective_size,
+             eyevalue_to_string(&d2->genus),
+             d2->escape_route,
+             status_to_string(dd->crude_status),
+             status_to_string(dd->status),
+             d2->moyo_size,
+             d2->moyo_territorial_value,
+             status_to_string(d2->safety),
+             d2->weakness_pre_owl,
+             d2->weakness);
+      gprintf(", owl status %s\n", status_to_string(d2->owl_status));
+      if (d2->owl_status == CRITICAL) {
+       gprintf("... owl attackable at %1m, code %d\n",
+               d2->owl_attack_point, d2->owl_attack_code);
+       gprintf("... owl defendable at %1m, code %d\n",
+               d2->owl_defense_point, d2->owl_defense_code);
+      }
+      if (dd->status == CRITICAL && d2->semeais) {
+       if (d2->semeai_defense_point)
+         gprintf("... semeai defense move at %1m, result code %s\n",
+                 d2->semeai_defense_point,
+                 result_to_string(d2->semeai_defense_code));
+       if (d2->semeai_attack_point)
+         gprintf("... semeai attack move at %1m, result code %s\n",
+                 d2->semeai_attack_point,
+                 result_to_string(d2->semeai_attack_code));
+      }
+      gprintf("... neighbors");
+      for (k = 0; k < d2->neighbors; k++) {
+       int d = d2->adjacent[k];
+       gprintf(" %1m", dragon2[d].origin);
+      }
+      gprintf("\n");
+      if (d2->lunch != NO_MOVE)
+       gprintf("... adjacent worm %1m is lunch\n", d2->lunch);
+    }
+  }
+}
+
+
+static int new_dragon_origins[BOARDMAX];
+
+/* Compute new dragons, e.g. after having made a move. This will not
+ * affect any global state.
+ */
+void
+compute_new_dragons(int dragon_origins[BOARDMAX])
+{
+  int pos;
+  int saved_cutting_points[BOARDMAX];
+
+  /* This is currently necessary in order not to mess up the
+   * worm[].cutstone2 field. See cutstone2_helper in
+   * patterns/helpers.c. On the other hand it shouldn't be very
+   * interesting to recompute dragons in the original position.
+   */
+  gg_assert(stackp > 0);
+  
+  memcpy(saved_cutting_points, cutting_points, sizeof(cutting_points));
+  memset(cutting_points, 0, sizeof(cutting_points));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      if (board[pos] == EMPTY)
+       new_dragon_origins[pos] = NO_MOVE;
+      else
+       new_dragon_origins[pos] = find_origin(pos);
+    }
+  
+  find_cuts();
+  find_connections();
+
+  memcpy(cutting_points, saved_cutting_points, sizeof(cutting_points));
+  memcpy(dragon_origins, new_dragon_origins, sizeof(new_dragon_origins));
+}
+
+
+/* This gets called if we are trying to compute dragons outside of
+ * make_dragons(), typically after a move has been made.
+ */
+static void
+join_new_dragons(int d1, int d2)
+{
+  int pos;
+  /* Normalize dragon coordinates. */
+  d1 = new_dragon_origins[d1];
+  d2 = new_dragon_origins[d2];
+
+  /* If d1 and d2 are the same dragon, we do nothing. */
+  if (d1 == d2)
+    return;
+
+  ASSERT1(board[d1] == board[d2], d1);
+  ASSERT1(IS_STONE(board[d1]), d1);
+
+  /* Don't bother to do anything fancy with dragon origins. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && new_dragon_origins[pos] == d2)
+      new_dragon_origins[pos] = d1;
+}
+
+/* 
+ * join_dragons amalgamates the dragon at (d1) to the
+ * dragon at (d2).
+ */
+
+void 
+join_dragons(int d1, int d2)
+{
+  int ii;
+  int origin; /* new origin */
+
+  /* If not called from make_dragons(), we don't work on the main
+   * dragon[] array.
+   */
+  if (stackp > 0) {
+    join_new_dragons(d1, d2);
+    return;
+  }
+  
+  /* Normalize dragon coordinates. */
+  d1 = dragon[d1].origin;
+  d2 = dragon[d2].origin;
+
+  /* If d1 and d2 are the same dragon, we do nothing. */
+  if (d1 == d2)
+    return;
+  
+  ASSERT1(board[d1] == board[d2], d1);
+  gg_assert(dragon2_initialized == 0);
+  ASSERT1(IS_STONE(board[d1]), d1);
+
+  /* We want to have the origin pointing to the largest string of
+   * the dragon.  If this is not unique, we take the "upper
+   * leftmost" one.
+   */
+  if (worm[d1].size > worm[d2].size
+      || (worm[d1].size == worm[d2].size
+         && d1 < d2)) {
+    origin = d1;
+    DEBUG(DEBUG_DRAGONS, "joining dragon at %1m to dragon at %1m\n", d2, d1);
+  }
+  else {
+    origin = d2;
+    DEBUG(DEBUG_DRAGONS, "joining dragon at %1m to dragon at %1m\n", d1, d2);
+  }
+  
+  dragon[origin].size  = dragon[d2].size + dragon[d1].size;
+  dragon[origin].effective_size  = (dragon[d2].effective_size
+                                   + dragon[d1].effective_size);
+
+  /* Join the second next_worm_in_dragon chain at the end of the first one. */
+  {
+    int last_worm_origin_dragon = origin;
+    while (next_worm_list[last_worm_origin_dragon] != NO_MOVE)
+      last_worm_origin_dragon = next_worm_list[last_worm_origin_dragon];
+    if (origin == d1)
+      next_worm_list[last_worm_origin_dragon] = d2;
+    else
+      next_worm_list[last_worm_origin_dragon] = d1;
+  }
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    if (ON_BOARD(ii)
+       && (dragon[ii].origin == d1 || dragon[ii].origin == d2))
+      dragon[ii].origin = origin;
+  }
+}
+
+
+
+/*
+ * compute_crude_status(pos) tries to determine whether the dragon
+ * at (pos) is ALIVE, DEAD, or UNKNOWN. The algorithm is not perfect
+ * and can give incorrect answers.
+ *
+ * The dragon is judged alive if its genus is >1. It is judged dead if
+ * the genus is <2, it has no escape route, and no adjoining string can
+ * be easily captured. Otherwise it is judged UNKNOWN.  */
+
+static enum dragon_status
+compute_crude_status(int pos)
+{
+  /* FIXME: We lose information when constructing true_genus. This
+   * code can be improved.
+   */
+  struct eyevalue *genus = &DRAGON2(pos).genus;
+  int true_genus = max_eyes(genus) + min_eyes(genus);
+  int lunch = DRAGON2(pos).lunch;
+
+  gg_assert(dragon2_initialized);
+  
+  /* If it has two sure eyes, everything is just dandy. */
+  if (true_genus > 3)
+    return ALIVE;
+
+  /* If the dragon consists of one worm, there is an attack, but 
+   * no defense and there is less than one eye and one half eye,
+   * the situation is hopeless.
+   */
+  if (dragon[pos].size == worm[pos].size
+      && worm[pos].attack_codes[0] != 0 
+      && worm[pos].defense_codes[0] == 0
+      && true_genus < 3)
+    return DEAD;
+  
+  if (lunch != NO_MOVE
+      && true_genus < 3
+      && worm[lunch].defense_codes[0] != 0
+      && DRAGON2(pos).escape_route < 5)
+    if (true_genus == 2 || worm[lunch].size > 2)
+      return CRITICAL;
+
+  if (lunch != NO_MOVE
+      && true_genus >= 3)
+    return ALIVE;
+
+  if (lunch == NO_MOVE || worm[lunch].cutstone < 2) {
+    if (true_genus < 3
+       && DRAGON2(pos).escape_route == 0
+       && DRAGON2(pos).moyo_size < 5)
+      return DEAD;
+
+    if (true_genus == 3
+       && DRAGON2(pos).escape_route < 5)
+      return CRITICAL;
+  }
+
+  if (DRAGON2(pos).moyo_territorial_value > 9.99)
+    return ALIVE;
+  
+  return UNKNOWN;
+}
+
+
+/* The dragon escape measure. This is defined as follows.
+ *   
+ * Let a PATH be a sequence of adjacent intersections that do nowhere
+ * touch or include an opponent stone or touch the border. It may
+ * include friendly stones and those are allowed to touch opponent
+ * stones or the border). Let a DISTANCE N INTERSECTION be an
+ * intersection connected to a dragon by a path of length N, but by no
+ * shorter path. The connection of the path to the dragon may either
+ * be by direct adjacency or, in the first step, diagonally if both
+ * adjoining intersections are empty.
+ *
+ * It is assumed that each intersection has an escape value, which
+ * would typically depend on influence and (preliminary) dragon
+ * status. We define the escape potential as the sum of the escape
+ * values over the distance four intersections of the dragon.
+ * 
+ * Example of distance N intersections, 1 <= N <= 4:
+ * 
+ * . . . . . . . . .    . . . . . . . . .
+ * . . . . . X . . O    . . . . . X . . O
+ * . . X . . . . . O    . . X . 2 . 4 . O
+ * X . . . . . . . .    X . . 1 1 2 3 4 .
+ * X O . O . . . . O    X O 1 O 1 2 3 4 O
+ * X O . O . . . . .    X O 1 O 1 . 4 . .
+ * X O . . . X . O O    X O 1 . . X . . O
+ * . . . X . . . . .    . 1 . X . . . . .
+ * X . . . . X . . .    X . . . . X . . .
+ * . . . . . . . . .    . . . . . . . . .
+ *
+ * Additionally, a path may not pass a connection inhibited
+ * intersection.
+ */
+
+#define ENQUEUE(pos) (queue[queue_end++] = (pos),\
+                     mx[pos] = 1)
+
+/* Compute the escape potential described above. The dragon is marked
+ * in the goal array.
+ */
+int
+dragon_escape(signed char goal[BOARDMAX], int color,
+             signed char escape_value[BOARDMAX])
+{
+  int ii;
+  int k;
+  static int mx[BOARDMAX];
+  static int mx_initialized = 0;
+  int queue[MAX_BOARD * MAX_BOARD];
+  int queue_start = 0;
+  int queue_end = 0;
+  int other = OTHER_COLOR(color);
+  int distance;
+  int escape_potential = 0;
+
+  gg_assert(IS_STONE(color));
+  
+  if (!mx_initialized) {
+    memset(mx, 0, sizeof(mx));
+    mx_initialized = 1;
+  }
+
+  /* Enter the stones of the dragon in the queue. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii) && goal[ii])
+      ENQUEUE(ii);
+  
+  /* Find points at increasing distances from the dragon. At distance
+   * four, sum the escape values at those points to get the escape
+   * potential.
+   */
+  for (distance = 0; distance <= 4; distance++) {
+    int save_queue_end = queue_end;
+    while (queue_start < save_queue_end) {
+      ii = queue[queue_start];
+      queue_start++;
+
+      /* Do not pass connection inhibited intersections. */
+      if (cut_possible(ii, OTHER_COLOR(color)))
+       continue;
+      if (distance == 4)
+       escape_potential += escape_value[ii];
+      else {
+       if (ON_BOARD(SOUTH(ii))
+           && !mx[SOUTH(ii)]
+           && (board[SOUTH(ii)] == color
+               || (board[SOUTH(ii)] == EMPTY
+                   && ON_BOARD(SE(ii)) && board[SE(ii)] != other
+                   && ON_BOARD(SS(ii)) && board[SS(ii)] != other
+                   && ON_BOARD(SW(ii)) && board[SW(ii)] != other)))
+         ENQUEUE(SOUTH(ii));
+       
+       if (ON_BOARD(WEST(ii))
+           && !mx[WEST(ii)]
+           && (board[WEST(ii)] == color
+               || (board[WEST(ii)] == EMPTY
+                   && ON_BOARD(SW(ii)) && board[SW(ii)] != other
+                   && ON_BOARD(WW(ii)) && board[WW(ii)] != other
+                   && ON_BOARD(NW(ii)) && board[NW(ii)] != other)))
+         ENQUEUE(WEST(ii));
+       
+       if (ON_BOARD(NORTH(ii))
+           && !mx[NORTH(ii)]
+           && (board[NORTH(ii)] == color
+               || (board[NORTH(ii)] == EMPTY
+                   && ON_BOARD(NW(ii)) && board[NW(ii)] != other
+                   && ON_BOARD(NN(ii)) && board[NN(ii)] != other
+                   && ON_BOARD(NE(ii)) && board[NE(ii)] != other)))
+         ENQUEUE(NORTH(ii));
+       
+       if (ON_BOARD(EAST(ii))
+           && !mx[EAST(ii)]
+           && (board[EAST(ii)] == color
+               || (board[EAST(ii)] == EMPTY
+                   && ON_BOARD(NE(ii)) && board[NE(ii)] != other
+                   && ON_BOARD(EE(ii)) && board[EE(ii)] != other
+                   && ON_BOARD(SE(ii)) && board[SE(ii)] != other)))
+         ENQUEUE(EAST(ii));
+       
+       /* For distance one intersections, allow kosumi to move out. I.e.
+        *
+        * ??..
+        * X.*.
+        * ?O.?
+        * ??X?
+        *
+        */
+       if (distance == 0) {
+         if (board[SOUTH(ii)] == EMPTY
+             && board[WEST(ii)] == EMPTY
+             && !mx[SW(ii)]
+             && (board[SW(ii)] == color
+                 || (board[SW(ii)] == EMPTY
+                     && ON_BOARD(SOUTH(SW(ii)))
+                     && board[SOUTH(SW(ii))] != other
+                     && ON_BOARD(WEST(SW(ii)))
+                     && board[WEST(SW(ii))] != other)))
+           ENQUEUE(SW(ii));
+                     
+         if (board[WEST(ii)] == EMPTY
+             && board[NORTH(ii)] == EMPTY
+             && !mx[NW(ii)]
+             && (board[NW(ii)] == color
+                 || (board[NW(ii)] == EMPTY
+                     && ON_BOARD(WEST(NW(ii)))
+                     && board[WEST(NW(ii))] != other
+                     && ON_BOARD(NORTH(NW(ii)))
+                     && board[NORTH(NW(ii))] != other)))
+           ENQUEUE(NW(ii));
+                     
+         if (board[NORTH(ii)] == EMPTY
+             && board[EAST(ii)] == EMPTY
+             && !mx[NE(ii)]
+             && (board[NE(ii)] == color
+                 || (board[NE(ii)] == EMPTY
+                     && ON_BOARD(NORTH(NE(ii)))
+                     && board[NORTH(NE(ii))] != other
+                     && ON_BOARD(EAST(NE(ii)))
+                     && board[EAST(NE(ii))] != other)))
+           ENQUEUE(NE(ii));
+                     
+         if (board[EAST(ii)] == EMPTY
+             && board[SOUTH(ii)] == EMPTY
+             && !mx[SE(ii)]
+             && (board[SE(ii)] == color
+                 || (board[SE(ii)] == EMPTY
+                     && ON_BOARD(EAST(SE(ii)))
+                     && board[EAST(SE(ii))] != other
+                     && ON_BOARD(SOUTH(SE(ii)))
+                     && board[SOUTH(SE(ii))] != other)))
+           ENQUEUE(SE(ii));
+       }
+      }
+    }
+  }
+
+  /* Reset used mx cells. */
+  for (k = 0; k < queue_end; k++) {
+    /* The assertion fails if the same element should have been queued
+     * twice, which might happen if ENQUEUE() is called without
+     * checking mx[].
+     */
+    ASSERT1(mx[queue[k]] == 1, queue[k]);
+    mx[queue[k]] = 0;
+  }
+
+  return escape_potential;
+}
+
+/* Wrapper to call the function above and compute the escape potential
+ * for the dragon at (pos).
+ */
+static int
+compute_escape(int pos, int dragon_status_known)
+{
+  int ii;
+  signed char goal[BOARDMAX];
+  signed char escape_value[BOARDMAX];
+  signed char safe_stones[BOARDMAX];
+
+  ASSERT1(IS_STONE(board[pos]), pos);
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii))
+      goal[ii] = is_same_dragon(ii, pos);
+
+  /* Compute escape_value array.  Points are awarded for moyo (4),
+   * area (2) or EMPTY (1).  Values may change without notice.
+   */
+  get_lively_stones(OTHER_COLOR(board[pos]), safe_stones);
+  compute_escape_influence(board[pos], safe_stones, NULL, 0, escape_value);
+
+  /* If we can reach a live group, award 6 points. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    if (!ON_BOARD(ii))
+      continue;
+
+    if (dragon_status_known) {
+      if (dragon[ii].crude_status == ALIVE)
+       escape_value[ii] = 6;
+      else if (dragon[ii].crude_status == UNKNOWN
+              && (DRAGON2(ii).escape_route > 5
+                  || DRAGON2(ii).moyo_size  > 5))
+       escape_value[ii] = 4;
+    }
+    else {
+      if (board[ii] == board[pos]
+         && !goal[ii]
+         && worm[ii].attack_codes[0] == 0)
+       escape_value[ii] = 2;
+    }
+  }
+  
+  return dragon_escape(goal, board[pos], escape_value);
+}
+
+/*
+ * Sum up the surrounding moyo sizes for each dragon. For this
+ * we retrieve the moyo data stored in influence_data (*q) (which must
+ * have been computed previously) from the influence module.
+ * We set dragon2[].moyo_size and .moyo_value if it is smaller than the 
+ * current entry.
+ *
+ * Currently this is implemented differently depending on whether
+ * experimental connections are used or not. The reason why this is
+ * needed is that most of the B patterns in conn.db are disabled for
+ * experimental connections, which may cause the moyo segmentation to
+ * pass through cutting points between dragons, making the surrounding
+ * moyo size mostly useless. Instead we only use the part of the
+ * surrounding moyo which is closest to some worm of the dragon.
+ */
+static void
+compute_surrounding_moyo_sizes(const struct influence_data *q)
+{
+  int pos;
+  int d;
+  int k;
+  int moyo_color;
+  float moyo_sizes[BOARDMAX];
+  float moyo_values[BOARDMAX];
+    
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    moyo_sizes[pos] = 0.0;
+    moyo_values[pos] = 0.0;
+  }
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    moyo_color = whose_moyo_restricted(q, pos);
+    
+    if (moyo_color == board[pos])
+      continue;
+    
+    if (moyo_color == WHITE) {
+      for (k = 0; k < number_close_white_worms[pos]; k++) {
+       int w = close_white_worms[pos][k];
+       int dr = dragon[w].origin;
+       
+       moyo_sizes[dr] += 1.0 / number_close_white_worms[pos];
+       moyo_values[dr] += (gg_min(influence_territory(q, pos, WHITE), 1.0)
+                           / number_close_white_worms[pos]);
+      }
+    }
+    
+    if (moyo_color == BLACK) {
+      for (k = 0; k < number_close_black_worms[pos]; k++) {
+       int w = close_black_worms[pos][k];
+       int dr = dragon[w].origin;
+       
+       moyo_sizes[dr] += 1.0 / number_close_black_worms[pos];
+       moyo_values[dr] += (gg_min(influence_territory(q, pos, BLACK), 1.0)
+                           / number_close_black_worms[pos]);
+      }
+    }
+  }
+  
+  for (d = 0; d < number_of_dragons; d++) {
+    int this_moyo_size = (int) moyo_sizes[dragon2[d].origin];
+    float this_moyo_value = moyo_values[dragon2[d].origin];
+    
+    if (this_moyo_size < dragon2[d].moyo_size) {
+      dragon2[d].moyo_size = this_moyo_size;
+      dragon2[d].moyo_territorial_value = this_moyo_value;
+    }
+  }
+}
+
+
+static struct interpolation_data moyo_value2weakness =
+  { 5, 0.0, 15.0, {1.0, 0.65, 0.3, 0.15, 0.05, 0.0}};
+static struct interpolation_data escape_route2weakness =
+  { 5, 0.0, 25.0, {1.0, 0.6, 0.3, 0.1, 0.05, 0.0}};
+static struct interpolation_data genus2weakness =
+  { 6, 0.0, 3.0, {1.0, 0.95, 0.8, 0.5, 0.2, 0.1, 0.0}};
+
+float
+crude_dragon_weakness(int safety, struct eyevalue *genus, int has_lunch,
+                     float moyo_value, float escape_route)
+{
+  /* FIXME: We lose information when constructing true_genus. This
+   * code can be improved.
+   */
+  float true_genus = 0.5 * (max_eyes(genus) + min_eyes(genus)
+                           + (has_lunch != 0));
+  float weakness_value[3];
+  float weakness;
+  int i, j;
+
+  if (safety == INVINCIBLE || safety == INESSENTIAL)
+    return 0.0;
+  if (safety == TACTICALLY_DEAD || safety == DEAD || safety == CRITICAL)
+    return 1.0;
+
+  weakness_value[0] = gg_interpolate(&moyo_value2weakness, moyo_value);
+  weakness_value[1] = gg_interpolate(&escape_route2weakness, escape_route);
+  weakness_value[2] = gg_interpolate(&genus2weakness, true_genus);
+
+  DEBUG(DEBUG_DRAGONS,
+       "  moyo value %f -> %f, escape %f -> %f, eyes %f -> %f\n",
+       moyo_value, weakness_value[0],
+       escape_route, weakness_value[1],
+       true_genus, weakness_value[2]);
+
+  for (i = 0; i < 3; i++)
+    for (j = i + 1; j < 3; j++)
+      if (weakness_value[j] < weakness_value[i]) {
+       float tmp = weakness_value[i];
+       weakness_value[i] = weakness_value[j];
+       weakness_value[j] = tmp;
+      }
+
+  /* The overall weakness is mostly, but not completely determined by the
+   * best value found so far:
+   */
+  weakness = gg_min(0.7 * weakness_value[0] + 0.3 * weakness_value[1],
+                    1.3 * weakness_value[0]);
+
+  gg_assert(weakness >= 0.0 && weakness <= 1.0);
+
+  return weakness;
+}
+
+/* This function tries to guess a coefficient measuring the weakness of
+ * a dragon. This coefficient * the effective size of the dragon can be
+ * used to award a strategic penalty for weak dragons.
+ */
+static float
+compute_dragon_weakness_value(int d)
+{
+  int origin = dragon2[d].origin;
+  float weakness;
+
+  /* Possible ingredients for the computation:
+   *   '+' means currently used, '-' means not (yet?) used
+   * - pre-owl moyo_size
+   * + post-owl moyo_size and its territory value
+   * + escape factor
+   * + number of eyes
+   *   - minus number of vital attack moves?
+   * + from owl:
+   *   + attack certain?
+   *   - number of owl nodes
+   *   - maybe reading shadow?
+   *   + threat to attack?
+   * - possible connections to neighbour dragons
+   */
+
+  DEBUG(DEBUG_DRAGONS, "Computing weakness of dragon at %1m:\n", origin);
+
+  weakness = crude_dragon_weakness(dragon2[d].safety, &dragon2[d].genus,
+                                  dragon2[d].lunch != NO_MOVE,
+                                  dragon2[d].moyo_territorial_value, 
+                                  (float) dragon2[d].escape_route);
+
+  /* Now corrections due to (uncertain) owl results resp. owl threats. */
+  if (!dragon2[d].owl_attack_certain)
+    weakness += gg_min(0.25 * (1.0 - weakness), 0.25 * weakness);
+  if (!dragon2[d].owl_defense_certain)
+    weakness += gg_min(0.25 * (1.0 - weakness), 0.25 * weakness);
+  if (dragon2[d].owl_threat_status == CAN_THREATEN_ATTACK)
+    weakness += 0.15 * (1.0 - weakness);
+
+  if (weakness < 0.0)
+    weakness = 0.0;
+  if (weakness > 1.0)
+    weakness = 1.0;
+
+  DEBUG(DEBUG_DRAGONS, " result: %f.\n", weakness);
+  return weakness;
+}
+
+
+/* This function has to be called _after_ the owl analysis and the
+ * subsequent re-run of the influence code.
+ */
+void
+compute_refined_dragon_weaknesses()
+{
+  int d;
+
+  /* Compute the surrounding moyo sizes. */
+  for (d = 0; d < number_of_dragons; d++)
+    dragon2[d].moyo_size = 2 * BOARDMAX;
+  
+  /* Set moyo sizes according to initial_influence. */
+  compute_surrounding_moyo_sizes(&initial_black_influence);
+  compute_surrounding_moyo_sizes(&initial_white_influence);
+
+  for (d = 0; d < number_of_dragons; d++)
+    dragon2[d].weakness = compute_dragon_weakness_value(d);
+}
+
+/* The strategic size is the effective size, plus a bonus for all weak
+ * neighbouring dragons of the opponent.
+ */
+void
+compute_strategic_sizes()
+{
+  float *bonus = calloc(number_of_dragons, sizeof(float));
+  int d;
+  int k;
+
+  for (d = 0; d < number_of_dragons; d++) {
+    /* Compute bonus for all neighbors of dragon (d). The total bonus for
+     * all neighbors is effective_size(d) * weakness(d), and it is given
+     * to a neighbor d2 proportionally to the value of
+     * effective_size(d2) * weakness(d2).
+     */
+    float sum = 0.0;
+    if (dragon2[d].safety == INESSENTIAL)
+      continue;
+    for (k = 0; k < dragon2[d].neighbors; k++) {
+      int d2 = dragon2[d].adjacent[k];
+      if (board[dragon2[d2].origin] == OTHER_COLOR(board[dragon2[d].origin])
+         && dragon2[d2].safety != INESSENTIAL)
+       sum += DRAGON(d2).effective_size * dragon2[d2].weakness;
+    }
+    if (sum == 0.0)
+      continue;
+    for (k = 0; k < dragon2[d].neighbors; k++) {
+      int d2 = dragon2[d].adjacent[k];
+      if (board[dragon2[d2].origin] == OTHER_COLOR(board[dragon2[d].origin])
+         && dragon2[d2].safety != INESSENTIAL) {
+       bonus[d2] += ((DRAGON(d2).effective_size * dragon2[d2].weakness) / sum)
+                    * DRAGON(d).effective_size * dragon2[d].weakness;
+       if (0)
+         gprintf("Dragon %1m receives %f effective size bonus from %1m.\n",
+                 dragon2[d2].origin, 
+                 ((DRAGON(d2).effective_size * dragon2[d2].weakness) / sum)
+                 * DRAGON(d).effective_size * dragon2[d].weakness,
+                 dragon2[d].origin);
+      }
+    }
+  }
+
+  for (d = 0; d < number_of_dragons; d++) {
+    if (0)
+      gprintf("Dragon %1m gets effective size bonus of %f.\n",
+             dragon2[d].origin, bonus[d]);
+    /* We cap strategic size at 3 * effective_size. (This is ad hoc.) */
+    dragon2[d].strategic_size = gg_min(bonus[d] + DRAGON(d).effective_size,
+                                      3 * DRAGON(d).effective_size);
+  }
+
+  free(bonus);
+}
+
+
+/* 
+ * Test whether two dragons are the same. Used by autohelpers and elsewhere.
+ */
+
+int
+is_same_dragon(int d1, int d2)
+{
+  if (d1 == NO_MOVE || d2 == NO_MOVE)
+    return (d1 == d2);
+  
+  ASSERT_ON_BOARD1(d1);
+  ASSERT_ON_BOARD1(d2);
+
+  return (dragon[d1].origin == dragon[d2].origin);
+}
+
+/* Test whether two dragons are neighbors. */
+int
+are_neighbor_dragons(int d1, int d2)
+{
+  int k;
+  d1 = dragon[d1].origin;
+  d2 = dragon[d2].origin;
+  
+  for (k = 0; k < DRAGON2(d1).neighbors; k++)
+    if (dragon2[DRAGON2(d1).adjacent[k]].origin == d2)
+      return 1;
+
+  /* Just to be make sure that this function is always symmetric, we
+   * do it the other way round too.
+   */
+  for (k = 0; k < DRAGON2(d2).neighbors; k++)
+    if (dragon2[DRAGON2(d2).adjacent[k]].origin == d1)
+      return 1;
+
+  return 0;
+}
+
+
+/* Mark the stones of a dragon. */
+void
+mark_dragon(int pos, signed char mx[BOARDMAX], signed char mark)
+{
+  int w;
+  for (w = first_worm_in_dragon(dragon[pos].origin); w != NO_MOVE;
+       w = next_worm_in_dragon(w))
+    mark_string(w, mx, mark);
+}
+
+
+/* The following two functions allow to traverse all worms in a dragon:
+ * for (ii = first_worm_in_dragon(pos); ii != NO_MOVE;
+ *      ii = next_worm_in_dragon(ii);)
+ *   ...
+ * At the moment first_worm_in_dragon(pos) will always be the origin
+ * of the dragon, but you should not rely on that.
+ */
+int
+first_worm_in_dragon(int d)
+{
+  return dragon[d].origin;
+}
+
+int
+next_worm_in_dragon(int w)
+{
+  ASSERT1(worm[w].origin == w, w);
+  return next_worm_list[w];
+}
+
+
+/* ================================================================ */
+/*                       A few status functions                     */
+/* ================================================================ */
+
+/*
+ * These functions are only here because then we don't need to expose
+ * the dragon structure to the external program.
+ */
+
+enum dragon_status
+crude_status(int pos)
+{
+  return dragon[pos].crude_status;
+}
+
+
+enum dragon_status
+dragon_status(int pos)
+{
+  return dragon[pos].status;
+}
+
+
+int
+lively_dragon_exists(int color)
+{
+  if (color == WHITE)
+    return lively_white_dragons > 0;
+  else
+    return lively_black_dragons > 0;
+}
+
+
+/* Is this dragon weak? */
+
+int 
+dragon_weak(int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+  /* FIXME: This should not happen, but avoids a crash.  What is
+   *   the proper fix for calling this at stackp != 0 ?
+   */
+  if (dragon[pos].id < 0 || dragon[pos].id >= number_of_dragons)
+     return 1;
+  return (DRAGON2(pos).weakness > 0.40001);
+}
+
+
+/* Returns the size of the biggest critical dragon on the board. */
+
+int  
+size_of_biggest_critical_dragon(void)
+{ 
+  int str;
+  int max_size = 0;
+  
+  for (str = BOARDMIN; str < BOARDMAX; str++)
+    if (ON_BOARD(str)) {
+      
+      if (board[str] == EMPTY
+         || dragon[str].origin != str)
+       continue;
+        
+      /* Get the best available status for the dragon */
+      if (dragon[str].status == CRITICAL) {
+        if (dragon[str].size >= max_size)
+          max_size = dragon[str].size;
+      }
+    }
+  return max_size;
+}
+
+
+/************************************************************************
+ *         A list of all cuts found during connection matching          *
+ ************************************************************************/
+
+#define MAX_CUTS       3 * MAX_BOARD * MAX_BOARD
+
+struct cut_data {
+  int apos;
+  int bpos;
+  int move;
+};
+
+static int num_cuts = 0;
+static struct cut_data cut_list[MAX_CUTS];
+
+static void
+clear_cut_list()
+{
+  num_cuts = 0;
+}
+
+/* Store in the list that (move) disconnects the two strings at
+ * apos and bpos.
+ */
+void
+add_cut(int apos, int bpos, int move)
+{
+  gg_assert(board[apos] == board[bpos]);
+  if (num_cuts == MAX_CUTS)
+    return;
+  if (apos > bpos) {
+    int tmp = apos;
+    apos = bpos;
+    bpos = tmp;
+  }
+  if (move == NO_MOVE)
+    return;
+  cut_list[num_cuts].apos = apos;
+  cut_list[num_cuts].bpos = bpos;
+  cut_list[num_cuts].move = move;
+  num_cuts++;
+  if (0)
+  gprintf("Added %d-th cut at %1m between %1m and %1m.\n", num_cuts,
+          move, apos, bpos);
+}
+
+/* For every move in the cut list disconnecting two of opponent's strings,
+ * test whether the two strings can be connected at all. If so, add a
+ * CUT_MOVE reason.
+ */
+void
+cut_reasons(int color)
+{
+  int k;
+  for (k = 0; k < num_cuts; k++)
+    if (board[cut_list[k].apos] == OTHER_COLOR(color)
+       && !is_same_dragon(cut_list[k].apos, cut_list[k].bpos)
+       && string_connect(cut_list[k].apos, cut_list[k].bpos, NULL) == WIN)
+      add_cut_move(cut_list[k].move, cut_list[k].apos, cut_list[k].bpos);
+}
+
+
+/* ================================================================ */
+/*                      Debugger functions                          */
+/* ================================================================ */
+
+/* For use in gdb, print details of the dragon at (m, n). 
+ * Add this to your .gdbinit file:
+ *
+ * define dragon
+ * set ascii_report_dragon("$arg0")
+ * end
+ *
+ * Now 'dragon S8' will report the details of the S8 dragon.
+ *
+ */
+
+void
+ascii_report_dragon(char *string)
+{
+  int pos = string_to_location(board_size, string);
+
+  if (!ON_BOARD(pos))
+    fprintf(stderr, "unknown position %s\n", string);
+  else
+    report_dragon(stderr, pos);
+}
+
+
+void
+report_dragon(FILE *outfile, int pos)
+{
+  int w;
+  int k;
+  struct dragon_data *d = &(dragon[pos]);
+  struct dragon_data2 *d2 = &(dragon2[d->id]);
+
+  if (board[pos] == EMPTY) {
+    gprintf("There is no dragon at %1m\n", pos);
+    return;
+  }
+
+  if (d->id < 0) {
+    gprintf("Dragon data not available at %1m\n", pos);
+    return;
+  }
+
+  gfprintf(outfile, "color                   %s\n", color_to_string(d->color));
+  gfprintf(outfile, "origin                  %1m\n", d->origin);
+  gfprintf(outfile, "size                    %d\n", d->size);
+  gfprintf(outfile, "effective_size          %f\n", d->effective_size);
+  gfprintf(outfile, "strategic_size          %f\n", d2->strategic_size);
+  gfprintf(outfile, "genus                   %s\n",
+          eyevalue_to_string(&d2->genus));
+  gfprintf(outfile, "heye                    %1m\n", d2->heye);
+  gfprintf(outfile, "escape_route            %d\n", d2->escape_route);
+  gfprintf(outfile, "lunch                   %1m\n", d2->lunch);
+  gfprintf(outfile, "crude_status            %s\n",
+          status_to_string(d->crude_status));
+  gfprintf(outfile, "owl_status              %s\n",
+          status_to_string(d2->owl_status));
+  gfprintf(outfile, "status                  %s\n",
+          status_to_string(d->status));
+  gfprintf(outfile, "safety                  %s\n",
+          status_to_string(d2->safety));
+  gfprintf(outfile, "weakness                %f\n", d2->weakness);
+  gfprintf(outfile, "weakness_pre_owl        %f\n", d2->weakness_pre_owl);
+  gfprintf(outfile, "surround_status         %d\n", d2->surround_status);
+  gfprintf(outfile, "surround_size           %d\n", d2->surround_size);
+  gfprintf(outfile, "moyo_size               %d\n", d2->moyo_size);
+  gfprintf(outfile, "moyo_territorial_value  %f\n",
+          d2->moyo_territorial_value);
+  gfprintf(outfile, "neighbors               ");
+  for (k = 0; k < d2->neighbors; k++)
+    gfprintf(outfile, "%1m ", DRAGON(d2->adjacent[k]).origin);
+  gfprintf(outfile, "\nhostile_neighbors       %d\n", d2->hostile_neighbors);
+  gfprintf(outfile, "owl_attack_code         %d\n", d2->owl_attack_code);
+  gfprintf(outfile, "owl_attack_point        %1m\n", d2->owl_attack_point);
+  gfprintf(outfile, "owl_attack_certain      %s\n",
+          (d2->owl_attack_certain) ? "YES" : "NO");
+  gfprintf(outfile, "owl_2nd_attack_point    %1m\n",
+          d2->owl_second_attack_point);
+  gfprintf(outfile, "owl_threat_status       %s\n",
+          status_to_string(d2->owl_threat_status));
+  gfprintf(outfile, "owl_defense_code        %d\n", d2->owl_defense_code);
+  gfprintf(outfile, "owl_defense_point       %1m\n", d2->owl_defense_point);
+  gfprintf(outfile, "owl_defense_certain     %s\n",
+          (d2->owl_defense_certain) ? "YES" : "NO");
+  gfprintf(outfile, "owl_2nd_defense_point   %1m\n",
+           d2->owl_second_defense_point);
+  gfprintf(outfile, "owl_attack_kworm        %1m\n", d2->owl_attack_kworm);
+  gfprintf(outfile, "owl_defense_kworm       %1m\n", d2->owl_defense_kworm);
+  gfprintf(outfile, "semeais                 %d\n", d2->semeais);
+  gfprintf(outfile, "semeai_defense_code     %d\n", d2->semeai_defense_code);
+  gfprintf(outfile, "semeai_defense_point    %1m\n", d2->semeai_defense_point);
+  gfprintf(outfile, "semeai_defense_certain  %d\n",
+          d2->semeai_defense_certain);
+  gfprintf(outfile, "semeai_defense_target   %1m\n",
+          d2->semeai_defense_target);
+  gfprintf(outfile, "semeai_attack_code      %d\n", d2->semeai_attack_code);
+  gfprintf(outfile, "semeai_attack_point     %1m\n", d2->semeai_attack_point);
+  gfprintf(outfile, "semeai_attack_certain   %d\n", d2->semeai_attack_certain);
+  gfprintf(outfile, "semeai_attack_target    %1m\n", d2->semeai_attack_target);
+  gfprintf(outfile, "strings                 ");
+  for (w = first_worm_in_dragon(pos); w != NO_MOVE; w = next_worm_in_dragon(w))
+    gfprintf(outfile, "%1m ", w);
+  gfprintf(outfile, "\n");
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/endgame.c b/engine/endgame.c
new file mode 100644 (file)
index 0000000..7c4d249
--- /dev/null
@@ -0,0 +1,527 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "gnugo.h"
+#include "liberty.h"
+
+
+static void endgame_analyze_worm_liberties(int pos, int color);
+static void endgame_find_backfilling_dame(int str, int color);
+static int endgame_find_liberties(int str, int *essential_liberties,
+                                 int essential_libs[MAXLIBS],
+                                 int *inessential_liberties,
+                                 int inessential_libs[MAXLIBS],
+                                 int *false_eye_liberties,
+                                 int false_eye_libs[MAXLIBS]);
+  
+
+/* Generate endgame moves. These are typically moves in settled positions,
+ * they aren't worth many points. Currently, we generate such moves using
+ * patterns in endgames.db and this algorithmic move generator. It is only
+ * called when no move of value higher than 6.0 has been found on board.
+ */
+void
+endgame(int color)
+{
+  int pos;
+
+  TRACE("\nEndgame move generator tries to look for additional moves...\n");
+
+  /* Try to generate some moves using endgame_analyze_worm_liberties(). See
+   * the description of that function to find what moves it generates.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    /* We are only interested in alive, but not invincible worms which are
+     * parts of alive dragons. That is, the position must be stable.
+     */
+    if (IS_STONE(board[pos])
+       && worm[pos].origin == pos
+       && dragon[pos].status == ALIVE
+       && !worm[pos].invincible
+       && !worm[pos].inessential
+       && worm[pos].attack_codes[0] == 0) {
+      endgame_analyze_worm_liberties(pos, color);
+      endgame_find_backfilling_dame(pos, color);
+    }
+  }
+}
+
+
+/* This function handles two cases of endgame moves. Consider these two
+ * positions (from endgame:301,302 and endgame:801,802 respectively):
+ *
+ *   OOOOOOO           XXXXXO.|
+ *   O.XXX.O           X.O.O*.|
+ *   OOX.XXO           X.OOOX.|
+ *   .O*X.OX           XXXXOX.|
+ *   .OXX..X           X..XOOO|
+ *   .OOOXX.           XXXXXXX|
+ *
+ * The two marked with `*' moves are worth one point in gote each (for
+ * both colors). The first one is obvious - once black runs short on
+ * liberties, he'll have to defend in his own eyespace, wasting one
+ * point. In the second position, although black sacrifices one point
+ * by playing in white's territory, he forces white to eventually
+ * capture the black string, losing three points. However, white has
+ * to play at `*' sooner or later if black doesn't take that vertex, so
+ * the move is worth 3 - 1 - 1 = 1 point only, not two.
+ *
+ * This function is able to find such moves. The algorithm is based on
+ * finding so called "inessential liberties". These are defined as
+ * liberties, which satisfy five conditions:
+ *
+ *     1) they are not within an eye (not in someone's territory),
+ *     2) all their adjacent worms and dragons are alive,
+ *     3) they have adjacent worms of both colors,
+ *     4) they have no other adjacent worms of the same color as the worm
+ *        under consideration,
+ *     5) they are safe to fill with stones of other than the worm's color.
+ *
+ * Such liberties are supposed to never become territory (they can't become
+ * an additional eye for the worm under consideration), the worm cannot
+ * connect to something via such a liberty and they will (or at least can)
+ * eventually be filled by either of the players.
+ *
+ * FIXME: This function can probably be improved to handle more cases.
+ */
+static void
+endgame_analyze_worm_liberties(int pos, int color)
+{
+  int k;
+  int worm_color = board[pos];
+  int other = OTHER_COLOR(worm_color);
+  int essential_liberties;
+  int essential_libs[MAXLIBS];
+  int inessential_liberties;
+  int inessential_libs[MAXLIBS];
+  int false_eye_liberties;
+  int false_eye_libs[MAXLIBS];
+  int num_attacks;
+  int num_attacks2;
+  int attacks[MAXLIBS];
+  int defenses[MAXLIBS];
+  int apos;
+  int value;
+
+  if (!endgame_find_liberties(pos, &essential_liberties, essential_libs,
+                             &inessential_liberties, inessential_libs,
+                             &false_eye_liberties, false_eye_libs))
+    return;
+  
+  apos = NO_MOVE;
+  num_attacks = 0;
+
+  /* Now, try to predict the final state of the position. We fill all
+   * inessential liberties by stones of other than the current worm's
+   * color. This is just a guess, we'll have to check the results later.
+   */
+  for (k = 0; k < inessential_liberties; k++) {
+    if (!safe_move(inessential_libs[k], other)
+       || !trymove(inessential_libs[k], other, "endgame", pos))
+      break;
+  }
+
+  /* If we haven't eaten the worm accidentally, look if any attacks on the
+   * worm have appeared.
+   */
+  if (k == inessential_liberties && board[pos] != EMPTY) {
+    /* Try to look for moves as in position 1. If the worm still has
+     * more than one liberty, try to play on every essential liberty
+     * and see if an attack appears.
+     */
+    if (countlib(pos) > 1) {
+      for (k = 0; k < essential_liberties; k++) {
+       int lib = essential_libs[k];
+
+       if (safe_move(lib, worm_color) && safe_move(lib, other)
+           && trymove(lib, other, "endgame", pos)) {
+         if (attack(pos, NULL) != 0) {
+           int dpos;
+
+           if (find_defense(pos, &dpos) && is_proper_eye_space(dpos)) {
+             int i;
+
+             /* If the attack cannot be defended against by playing on
+              * another essential liberty, filling a pure false eye (an
+              * eye which can't become territory) or capturing an opponent
+              * string in atari, keep it for now.
+              */
+             for (i = 0; i < essential_liberties; i++) {
+               if (i != k && essential_libs[i] != dpos
+                   && does_defend(essential_libs[i], pos))
+                 break;
+             }
+
+             if (i == essential_liberties) {
+               for (i = 0; i < false_eye_liberties; i++) {
+                 if (does_defend(false_eye_libs[i], pos))
+                   break;
+               }
+
+               if (i == false_eye_liberties) {
+                 int adj[MAXCHAIN];
+                 int adjs;
+
+                 adjs = chainlinks2(pos, adj, 1);
+                 for (i = 0; i < adjs; i++) {
+                   int lib2;
+                   findlib(adj[i], 1, &lib2);
+                   if (lib2 != dpos && !is_proper_eye_space(lib2)
+                       && does_defend(lib2, pos))
+                     break;
+                 }
+
+                 if (i == adjs) {
+                   attacks[num_attacks] = lib;
+                   defenses[num_attacks] = dpos;
+                   num_attacks++;
+                 }
+               }
+             }
+           }
+         }
+
+         popgo();
+       }
+      }
+    }
+    else if (essential_liberties > 0) {
+      /* If the only remaining liberty is essential, it is an attack. */
+      attacks[num_attacks] = essential_libs[0];
+      defenses[num_attacks] = NO_MOVE;
+      num_attacks++;
+    }
+
+    /* Try to find moves as in position 2. */
+    if (attack(pos, &apos) != 0) {
+      if (is_proper_eye_space(apos)) {
+       /* The attack point is in someone's eye (must be an eye which the worm
+        * bounds). This looks promising. If this attack cannot be averted by
+        * playing on an essential liberty, keep it for further analyzis.
+        */
+       for (k = 0; k < essential_liberties; k++) {
+         if (does_defend(essential_libs[k], pos)) {
+           apos = NO_MOVE;
+           break;
+         }
+       }
+
+       if (apos != NO_MOVE && worm_color == color && !does_defend(apos, pos))
+         apos = NO_MOVE;
+      }
+      else
+       apos = NO_MOVE;
+    }
+  }
+  else {
+    /* We were unable to fill all the liberties. Modify
+     * `inessential_liberties' in order to undo the right number of
+     * moves.
+     */
+    inessential_liberties = k;
+  }
+
+  /* Undo all the moves made to fill inessential liberties. */
+  for (k = 0; k < inessential_liberties; k++)
+    popgo();
+  ASSERT1(stackp == 0, pos);
+
+  num_attacks2 = 0;
+  for (k = 0; k < num_attacks; k++) {
+    /* These moves must be safe for the other color, otherwise they are
+     * pointless. Note that checks for safety on previous step were not
+     * sufficient since we had additional stones on board then.
+     */
+    if (safe_move(attacks[k], other)) {
+      if (defenses[k] != NO_MOVE) {
+       int i;
+
+       /* Consider this position:
+        *
+        *   .X...OO    The move at `*' satisfies the conditions above.
+        *   .X*OO.O    However, it is pointless, since black has a miai
+        *   X.OX..O    move at `a' to force white to play `b'. That is,
+        *   XXObOOO    no matter if white plays `*' or `a', black takes
+        *   .XXaOXO    the other point and white has to fill `b'. So, if
+        *   ...XXXX    there is a point, adjacent to defense point, safe
+        *              for "other" color, we discard the attack.
+        *
+        * Also, in some positions, defense point is adjacent to worm
+        * inessential liberty. In such cases we discard the attack too.
+        */
+       for (i = 0; i < 4; i++) {
+         int pos2 = defenses[k] + delta[i];
+
+         if (board[pos2] == EMPTY) {
+           int m;
+
+           if (!is_proper_eye_space(pos2) && safe_move(pos2, other))
+             break;
+
+           for (m = 0; m < inessential_liberties; m++) {
+             if (inessential_libs[m] == pos2)
+               break;
+           }
+
+           if (m < inessential_liberties)
+             break;
+         }
+       }
+
+       /* If this is not the case, the attack is kept for the final trial. */
+       if (i == 4)
+         attacks[num_attacks2++] = attacks[k];
+      }
+      else {
+       /* This must be the only attack (filling all inessential liberties
+        * gives an atari).
+        */
+       ASSERT1(num_attacks == 1, pos);
+       attacks[num_attacks2++] = attacks[k];
+      }
+    }
+  }
+
+  value = 0;
+  if (apos != NO_MOVE) {
+    /* We use the number of string's liberties minus 2 as the value of
+     * the move. Minus 2 is explained in the comment before the
+     * function. In some rare cases the value may differ, but this
+     * should be a good guess.
+     */
+    value = accuratelib(apos, other, MAXLIBS, NULL) - 2;
+  }
+
+  /* If we haven't found anything interesting or have already dropped it,
+   * there is no point trying more moves, so we return now.
+   */
+  if (value <= 0 && num_attacks2 == 0)
+    return;
+
+  /* We filled the liberties with stones of "other" color. That could lead to
+   * some strange attacks, since inessential liberties are not always really
+   * inessential (see trevorb:320 and trevorb:940 for examples where this step
+   * is necessary). Now we fill the liberties with stones of the same color as
+   * the current worm. If the results remain unchanged, then we can probably
+   * trust them.
+   */
+  for (k = 0; k < inessential_liberties; k++) {
+    if (!trymove(inessential_libs[k], worm_color, "endgame", pos))
+      break;
+  }
+
+  /* GNU Go currently doesn't allow suicide, but let's assume it does. */
+  if (k == inessential_liberties && board[pos] != EMPTY) {
+    if (countlib(pos) > 1) {
+      for (k = 0; k < num_attacks2; k++) {
+       if (trymove(attacks[k], other, "endgame", pos)) {
+         if (attack(pos, NULL) != 0) {
+           TRACE("  endgame move with territorial value %d.0 found at %1m\n",
+                 1, attacks[k]);
+           add_expand_territory_move(attacks[k]);
+           /* FIXME: We just guess the value here. Find a way to calculate it
+            *        (more) precisely.
+            */
+           set_minimum_territorial_value(attacks[k], 1.0);
+         }
+
+         popgo();
+       }
+      }
+    }
+    else if (essential_liberties > 0  && essential_libs[0] == attacks[0]) {
+      TRACE("  endgame move with territorial value %d.0 found at %1m\n",
+           1, attacks[k]);
+      add_expand_territory_move(attacks[0]);
+      /* FIXME: We just guess the value here. Find a way to calculate it
+       *       (more) precisely.
+       */
+      set_minimum_territorial_value(attacks[0], 1.0);
+    }
+
+    if (value > 0 && does_attack(apos, pos)) {
+      TRACE("  endgame move with territorial value %d.0 found at %1m\n",
+           value, apos);
+      add_expand_territory_move(apos);
+      set_minimum_territorial_value(apos, (float) value);
+    }
+  }
+  else {
+    /* Don't undo moves we didn't play. */
+    inessential_liberties = k;
+  }
+
+  /* Undo all the moves made at the third step. */
+  for (k = 0; k < inessential_liberties; k++)
+    popgo();
+  ASSERT1(stackp == 0, pos);
+}
+
+/* A backfilling dame is a defense move, usually within potential own
+ * territory, which does not have to be played immediately but after
+ * outer liberties of some string have been filled. If those outer
+ * liberties are dame points (here inessential liberties), it is
+ * usually better to play the backfilling moves before filling the
+ * dame points. If nothing else it reduces the risk for making stupid
+ * blunders while filling dame.
+ */
+static void
+endgame_find_backfilling_dame(int str, int color_to_move)
+{
+  int k;
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int essential_liberties;
+  int essential_libs[MAXLIBS];
+  int inessential_liberties;
+  int inessential_libs[MAXLIBS];
+  int false_eye_liberties;
+  int false_eye_libs[MAXLIBS];
+  int dpos;
+  int loop_again = 1;
+  int potential_moves[BOARDMAX];
+  int num_potential_moves = 0;
+  int move = NO_MOVE;
+
+  while (loop_again) {
+    loop_again = 0;
+    if (!endgame_find_liberties(str, &essential_liberties, essential_libs,
+                               &inessential_liberties, inessential_libs,
+                               &false_eye_liberties, false_eye_libs))
+      break;
+    for (k = 0; k < inessential_liberties; k++) {
+      if (!safe_move(inessential_libs[k], other)
+         || !trymove(inessential_libs[k], other, "endgame", str))
+       continue;
+      increase_depth_values();
+      if (board[str] == EMPTY)
+       break;
+      if (attack_and_defend(str, NULL, NULL, NULL, &dpos)) {
+       if (worm[dpos].color == EMPTY) {
+         potential_moves[num_potential_moves] = dpos;
+         num_potential_moves++;
+       }
+       forced_backfilling_moves[dpos] = 1;
+       if (trymove(dpos, color, "endgame", str))
+         increase_depth_values();
+       loop_again = 1;
+       break;
+      }
+    }
+  }
+  
+  while (stackp > 0) {
+    popgo();
+    decrease_depth_values();
+  }
+
+  for (k = num_potential_moves - 1; k >= 0; k--)
+    if (safe_move(potential_moves[k], color)) {
+      move = potential_moves[k];
+      TRACE("  backfilling dame found at %1m for string %1m\n", move, str);
+      if (color == color_to_move) {
+       add_expand_territory_move(move);
+       set_minimum_territorial_value(move, 0.1);
+      }
+      break;
+    }
+}
+
+/* Find liberties of the string str with various characteristics. See
+ * the comments above endgame_analyze_worm_liberties() for more
+ * information.
+ */
+static int
+endgame_find_liberties(int str,
+                      int *essential_liberties, int essential_libs[MAXLIBS],
+                      int *inessential_liberties,
+                      int inessential_libs[MAXLIBS],
+                      int *false_eye_liberties, int false_eye_libs[MAXLIBS])
+{
+  int liberties;
+  int libs[MAXLIBS];
+  int k;
+
+  ASSERT1(IS_STONE(board[str]), str);
+
+  *essential_liberties = 0;
+  *inessential_liberties = 0;
+  *false_eye_liberties = 0;
+  
+  /* Find all string liberties. */
+  liberties = findlib(str, MAXLIBS, libs);
+
+  /* Loop over the liberties and find inessential and essential ones. The
+   * latter are defined as those, which are not inside an eye space, but
+   * don't otherwise qualify as inessential. If we find a non-alive (dead
+   * or critical) worm or dragon around, we stop looking for liberties and
+   * skip the current worm (position is unstable).
+   */
+  for (k = 0; k < liberties; k++) {
+    int lib = libs[k];
+
+    if (!is_proper_eye_space(lib)) {
+      int i;
+      int essential = 0;
+      int found_other = 0;
+
+      for (i = 0; i < 4; i++) {
+       int pos = lib + delta[i];
+
+       if (!IS_STONE(board[pos]) || !IS_STONE(worm[pos].color))
+         continue;
+
+       if (worm[pos].attack_codes[0] != 0 || dragon[pos].status != ALIVE)
+         return 0;
+
+       if (board[pos] == board[str]) {
+         if (find_origin(pos) != find_origin(str))
+           essential = 1;
+       }
+       else
+         found_other = 1;
+      }
+
+      if (i < 4)
+       break;
+
+      if (found_other) {
+       if (essential)
+         essential_libs[(*essential_liberties)++] = lib;
+       else
+         inessential_libs[(*inessential_liberties)++] = lib;
+      }
+      else if (is_false_eye(half_eye, lib) && !false_eye_territory[lib])
+       false_eye_libs[(*false_eye_liberties)++] = lib;
+    }
+  }
+  return 1;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/engine.dsp b/engine/engine.dsp
new file mode 100644 (file)
index 0000000..cd395b8
--- /dev/null
@@ -0,0 +1,569 @@
+# Microsoft Developer Studio Project File - Name="engine" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=engine - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "engine.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "engine.mak" CFG="engine - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "engine - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "engine - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I "." /I ".." /I "..\sgf" /I "..\interface" /I "..\patterns" /I "..\utils" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /YX"gnugo.h" /Fd"Release/engine" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "engine___Win32_Debug"\r
+# PROP BASE Intermediate_Dir "engine___Win32_Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I "." /I ".." /I "..\sgf" /I "..\interface" /I "..\patterns" /I "..\utils" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FR /YX"gnugo.h" /Fd"Debug/engine" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "engine - Win32 Release"\r
+# Name "engine - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\aftermath.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\board.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\boardlib.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\breakin.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\cache.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\clock.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\combination.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dragon.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\endgame.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\filllib.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\genmove.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\globals.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\handicap.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hash.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\influence.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\interface.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\matchpat.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\montecarlo.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\move_reasons.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\movelist.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\optics.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\persistent.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\printutils.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\readconnect.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\reading.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\semeai.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgfdecide.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgffile.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shapes.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\showbord.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\surround.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\unconditional.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utils.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\value_moves.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\worm.c\r
+\r
+!IF  "$(CFG)" == "engine - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "engine - Win32 Debug"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\board.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\cache.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\clock.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\gnugo.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hash.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\influence.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\liberty.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\move_reasons.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/engine/filllib.c b/engine/filllib.c
new file mode 100644 (file)
index 0000000..1b539e7
--- /dev/null
@@ -0,0 +1,630 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "liberty.h"
+
+static int find_backfilling_move(int move, int color, int *backfill_move,
+                                int forbidden_moves[BOARDMAX]);
+static int filllib_confirm_safety(int move, int color, int *defense_point);
+
+/* Determine whether a point is adjacent to at least one own string which
+ * isn't dead.
+ */
+static int
+living_neighbor(int pos, int color)
+{
+  int k;
+  for (k = 0; k < 4; k++) {
+    if (board[pos + delta[k]] == color
+       && dragon[pos + delta[k]].status != DEAD)
+      return 1;
+  }
+
+  return 0;
+}
+
+
+/* Determine whether (pos) effectively is a black or white point.
+ * The test for inessentiality is to avoid filling the liberties
+ * around a killing nakade string.
+ */
+static void
+analyze_neighbor(int pos, int *found_black, int *found_white)
+{
+  switch (board[pos]) {
+    case EMPTY:
+      if (!(*found_black)
+         && living_neighbor(pos, BLACK)
+         && safe_move(pos, WHITE) != WIN)
+       *found_black = 1;
+      
+      if (!(*found_white)
+         && living_neighbor(pos, WHITE)
+         && safe_move(pos, BLACK) != WIN)
+       *found_white = 1;
+      
+      break;
+
+    case BLACK:
+      if (!worm[pos].inessential && DRAGON2(pos).safety != INESSENTIAL) {
+       if (dragon[pos].status == ALIVE
+           || dragon[pos].status == UNKNOWN)
+         *found_black = 1;
+       else
+         *found_white = 1;
+      }
+      break;
+
+    case WHITE:
+      if (!worm[pos].inessential && DRAGON2(pos).safety != INESSENTIAL) {
+       if (dragon[pos].status == ALIVE
+           || dragon[pos].status == UNKNOWN)
+         *found_white = 1;
+       else
+         *found_black = 1;
+      }
+      break;
+  }
+}
+
+
+/* If no move of value can be found to play, this seeks to fill a
+ * common liberty, backfilling or back-capturing if necessary. When
+ * backfilling we take care to start from the right end, in the case
+ * that several backfilling moves are ultimately necessary.
+ *
+ * If a move for color is found, return 1, otherwise return 0.
+ * The move is returned in (*move).
+ */
+
+int 
+fill_liberty(int *move, int color)
+{
+  int k;
+  int pos;
+  int other = OTHER_COLOR(color);
+  int defense_point;
+  int potential_color[BOARDMAX];
+
+  /* We first make a fast scan for intersections which are potential
+   * candidates for liberty filling. This is not very accurate, but it
+   * does filter out intersections which could never pass the real
+   * tests below but might still require a lot of tactical reading in
+   * the process.
+   */
+  memset(potential_color, 0, sizeof(potential_color));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!IS_STONE(board[pos]))
+      continue;
+
+    if (worm[pos].inessential || DRAGON2(pos).safety == INESSENTIAL)
+      continue;
+    
+    if (dragon[pos].status != ALIVE) {
+      for (k = 0; k < 4; k++) {
+       int pos2 = pos + delta[k];
+       if (board[pos2] == EMPTY)
+         potential_color[pos2] |= OTHER_COLOR(board[pos]);
+      }
+    }
+    
+    if (dragon[pos].status != DEAD) {
+      for (k = 0; k < 12; k++) {
+       int d = delta[k%8];
+       
+       if (k >= 8) {
+         if (board[pos + d] != EMPTY)
+           continue;
+         d *= 2;
+       }
+       if (board[pos + d] == EMPTY)
+         potential_color[pos + d] |= board[pos];
+      }
+    }
+  }
+  
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    /* It seems we can't trust an empty liberty to be gray-colored
+     * either as a cave or as a cavity. Instead we look for empty
+     * intersections with at least one neighbor of each color, where
+     * dead stones count as enemy stones. We also count empty
+     * neighbors to either color if the opponent can't play there.
+     */
+    int found_white = 0;
+    int found_black = 0;
+    
+    if (board[pos] != EMPTY)
+      continue;
+
+    /* Quick rejection based on preliminary test above. */
+    if (potential_color[pos] != GRAY)
+      continue;
+    
+    /* Loop over the neighbors. */
+    for (k = 0; k < 4; k++) {
+      int d = delta[k];
+      if (ON_BOARD(pos + d))
+       analyze_neighbor(pos + d, &found_black, &found_white);
+    }
+    
+    /* Do we have neighbors of both colors? */
+    if (!(found_white && found_black))
+      continue;
+    
+    /* Ok, we wish to play here, but maybe we can't. The following
+     * cases may occur:
+     * 1. Move is legal and safe.
+     * 2. Move is legal but not safe because it's in the middle of a seki.
+     * 3. Move is legal but not safe, can be played after backfilling.
+     * 4. Move is an illegal ko recapture.
+     * 5. Move is illegal but can be played after back-captures.
+     * 6. Move would violate confirm_safety.
+     */
+    
+    DEBUG(DEBUG_FILLLIB, "Filllib: Considering move at %1m.\n", pos);
+    
+    /* Legal and tactically safe, play it if it passes
+     * confirm_safety test, i.e. that it isn't a blunder which
+     * causes problems for other strings.
+     */
+    if (safe_move(pos, color) == WIN) {
+      DEBUG(DEBUG_FILLLIB, "Filllib: Tactically safe.\n");
+      if (filllib_confirm_safety(pos, color, &defense_point)) {
+       /* Safety confirmed. */
+       DEBUG(DEBUG_FILLLIB, "Filllib: Safety confirmed.\n");
+       *move = pos;
+       return 1;
+      }
+      else if (defense_point != NO_MOVE && is_legal(defense_point, color)) {
+       /* Safety not confirmed because the move at (pos) would set
+        * up a double threat. (defense_point) is assumed to defend
+        * against this threat.
+        *
+        * FIXME: We should verify that (defense_point) really is effective.
+        */
+       DEBUG(DEBUG_FILLLIB,
+             "Filllib: Safety not confirmed, but %1m defends.\n",
+             defense_point);
+       *move = defense_point;
+       return 1;
+      }
+      else {
+       /* The move causes problems somewhere else on the board, so
+        * we have to discard it. If everything works right this
+        * should not happen at this time.
+        */
+       DEBUG(DEBUG_FILLLIB, "Filllib: Safety not confirmed, discarded.\n");
+       TRACE("Warning: Blunder detected in fill_liberty().\n");
+       continue;
+      }
+    }
+    
+    /* Try to play the move. */
+    if (trymove(pos, color, "fill_liberty", NO_MOVE)) {
+      int forbidden_moves[BOARDMAX];
+      popgo();
+      /* Legal, but not safe. Look for backfilling move. */
+      DEBUG(DEBUG_FILLLIB,
+           "Filllib: Legal but not safe, looking for backfilling move.\n");
+
+      memset(forbidden_moves, 0, sizeof(forbidden_moves));
+      while (find_backfilling_move(pos, color, move, forbidden_moves)) {
+       /* Mark as forbidden in case we need another turn in the loop. */
+       forbidden_moves[*move] = 1;
+       
+       DEBUG(DEBUG_FILLLIB, "Filllib: Backfilling move at %1m.\n", *move);
+       /* In certain positions it may happen that an illegal move
+        * is found. This probably only can happen if we try to play
+        * a move inside a lost semeai. Anyway we should discard the
+        * move.
+        */
+       if (!is_legal(*move, color)) {
+         DEBUG(DEBUG_FILLLIB, "Filllib: Was illegal, discarded.\n");
+         *move = NO_MOVE;
+         continue;
+       }
+       
+       /* If the move turns out to be strategically unsafe, or
+        * setting up a double threat elsewhere, also discard it.
+        */
+       if (!filllib_confirm_safety(*move, color, &defense_point)) {
+         DEBUG(DEBUG_FILLLIB,
+               "Filllib: Safety not confirmed, discarded.\n");
+         *move = NO_MOVE;
+         continue;
+       }
+       
+       /* Seems to be ok. */
+       return 1;
+      }
+
+      /* No acceptable backfilling move found.
+       * If we captured some stones, this move should be ok anyway.
+       */
+      if (does_capture_something(pos, color)) {
+       DEBUG(DEBUG_FILLLIB,
+             "Filllib: Not tactically safe, but captures stones.\n");
+       if (!filllib_confirm_safety(pos, color, &defense_point)) {
+         DEBUG(DEBUG_FILLLIB,
+               "Filllib: Safety not confirmed, discarded.\n");
+         continue;
+       }
+       *move = pos;
+       return 1;
+      }
+    }
+    else {
+      /* Move is illegal. Look for an attack on one of the neighbor
+       * worms. If found, return that move for back-capture.
+       */
+      DEBUG(DEBUG_FILLLIB, "Filllib: Illegal, looking for back-capture.\n");
+      for (k = 0; k < 4; k++) {
+       int d = delta[k];
+       if (board[pos + d] == other
+           && worm[pos + d].attack_codes[0] == WIN) {
+         *move = worm[pos + d].attack_points[0];
+         DEBUG(DEBUG_FILLLIB, "Filllib: Found at %1m.\n", *move);
+         return 1;
+       }
+      }
+      
+      DEBUG(DEBUG_FILLLIB,
+           "Filllib: Nothing found, looking for ko back-capture.\n");
+      for (k = 0; k < 4; k++) {
+       int d = delta[k];
+       if (board[pos + d] == other
+           && worm[pos + d].attack_codes[0] != 0
+           && is_legal(worm[pos + d].attack_points[0], color)) {
+         *move = worm[pos + d].attack_points[0];
+         DEBUG(DEBUG_FILLLIB, "Filllib: Found at %1m.\n", *move);
+         return 1;
+       }
+      }
+
+      DEBUG(DEBUG_FILLLIB,
+           "Filllib: Nothing found, looking for threat to back-capture.\n");
+      for (k = 0; k < 4; k++) {
+       int d = delta[k];
+       if (board[pos + d] == other
+           && worm[pos + d].attack_codes[0] != 0) {
+         /* Just pick some other liberty. */
+         /* FIXME: Something is odd about this code. */
+         int libs[2];
+         if (findlib(pos + d, 2, libs) > 1) {
+           if (is_legal(libs[0], color))
+             *move = libs[0];
+           else if (is_legal(libs[1], color))
+             *move = libs[1];
+           else
+             continue;
+           
+           DEBUG(DEBUG_FILLLIB, "Filllib: Found at %1m.\n", *move);
+           return 1;
+         }
+       }
+      }
+    }
+  }
+  
+  /* Nothing found. */
+  DEBUG(DEBUG_FILLLIB, "Filllib: No move found.\n");
+  return 0;
+}
+
+
+/* The strategy for finding a backfilling move is to first identify
+ * moves that
+ *
+ * 1. defends the position obtained after playing (move).
+ * 2. captures a stone adjacent to our neighbors to (move), before
+ *    (move) is played.
+ *
+ * Then we check which of these are legal before (move) is played. If
+ * there is at least one, we take one of these arbitrarily as a
+ * backfilling move.
+ *
+ * Now it may happen that (move) still isn't a safe move. In that case
+ * we recurse to find a new backfilling move. To do things really
+ * correctly we should also give the opponent the opportunity to keep
+ * up the balance of the position by letting him do a backfilling move
+ * of his own. Maybe this could also be arranged by recursing this
+ * function. Currently we only do a half-hearted attempt to find
+ * opponent moves.
+ *
+ * The purpose of the forbidden_moves[] array is to get a new
+ * backfilling move if the first one later was found to be unsafe,
+ * like backfilling for J5 at F9 in filllib:45. With F9 marked as
+ * forbidden the correct move at G9 is found.
+ */
+static int adjs[MAXCHAIN];
+static int libs[MAXLIBS];
+
+static int
+find_backfilling_move(int move, int color, int *backfill_move,
+                     int forbidden_moves[BOARDMAX])
+{
+  int k;
+  int liberties;
+  int neighbors;
+  int found_one = 0;
+  int apos = NO_MOVE;
+  int bpos = NO_MOVE;
+  int extra_pop = 0;
+  int success = 0;
+  int acode;
+  int saved_move = NO_MOVE;
+  int opponent_libs;
+  
+  DEBUG(DEBUG_FILLLIB, "find_backfilling_move for %C %1m\n", color, move);
+  if (debug & DEBUG_FILLLIB)
+    dump_stack();
+  
+  /* Play (move) and identify all liberties and adjacent strings. */
+  if (!trymove(move, color, "find_backfilling_move", move))
+    return 0; /* This shouldn't happen, I believe. */
+
+  /* The move wasn't safe, so there must be an attack for the
+   * opponent. Save it for later use.
+   */
+  acode = attack(move, &apos);
+  gg_assert(acode != 0 && apos != NO_MOVE);
+  
+  /* Find liberties. */
+  liberties = findlib(move, MAXLIBS, libs);
+
+  /* Find neighbors. */
+  neighbors = chainlinks(move, adjs);
+
+  /* Remove (move) again. */
+  popgo();
+  
+  /* It's most fun to capture stones. Start by trying to take some
+   * neighbor off the board. If the attacking move does not directly
+   * reduce the number of liberties of the attacked string we don't
+   * trust it but keep it around if we don't find anything else. (See
+   * filllib:17 for a position where this matters.)
+   *
+   * It is also necessary to take care to first attack the string with
+   * the fewest liberties, which can probably be removed the fastest.
+   * See filllib:37 for an example (J5 tactically attacks K7 but the
+   * correct move is H5).
+   *
+   * FIXME: It seems we have to return immediately when we find an
+   * attacking move, because recursing for further backfilling might
+   * lead to moves which complete the capture but cannot be played
+   * before the attacking move itself. This is not ideal but probably
+   * good enough.
+   *
+   * In order to avoid losing unnecessary points while capturing dead
+   * stones, we try first to capture stones in atari, second defending
+   * at a liberty, and third capture stones with two or more
+   * liberties. See filllib:43 for a position where capturing dead
+   * stones (B10 or C8) loses a point compared to defending at a
+   * liberty (C6).
+   */
+  for (opponent_libs = 1; opponent_libs <= 1; opponent_libs++) {
+    for (k = 0; k < neighbors; k++) {
+      if (opponent_libs < 5 && countlib(adjs[k]) != opponent_libs)
+       continue;
+      if (attack(adjs[k], &bpos) == WIN) {
+       if (forbidden_moves[bpos])
+         continue;
+       if (liberty_of_string(bpos, adjs[k])) {
+         *backfill_move = bpos;
+         return 1;
+       }
+       else
+         saved_move = bpos;
+      }
+    }
+  }
+  
+  /* Otherwise look for a safe move at a liberty. */
+  if (!found_one) {
+    for (k = 0; k < liberties; k++) {
+      if (!forbidden_moves[libs[k]] && safe_move(libs[k], color) == WIN) {
+       *backfill_move = libs[k];
+       found_one = 1;
+       break;
+      }
+    }
+  }
+
+  if (!found_one) {
+    for (opponent_libs = 2; opponent_libs <= 5; opponent_libs++) {
+      for (k = 0; k < neighbors; k++) {
+       if (opponent_libs < 5 && countlib(adjs[k]) != opponent_libs)
+         continue;
+       if (attack(adjs[k], &bpos) == WIN) {
+         if (forbidden_moves[bpos])
+           continue;
+         if (liberty_of_string(bpos, adjs[k])) {
+           *backfill_move = bpos;
+           return 1;
+         }
+         else
+           saved_move = bpos;
+       }
+      }
+    }
+  }
+  
+  /* If no luck so far, try with superstring liberties. */
+  if (!found_one) {
+    trymove(move, color, "find_backfilling_move", move);
+    find_proper_superstring_liberties(move, &liberties, libs, 0);
+    popgo();
+    for (k = 0; k < liberties; k++) {
+      if (!forbidden_moves[libs[k]] && safe_move(libs[k], color) == WIN) {
+       *backfill_move = libs[k];
+       found_one = 1;
+       break;
+      }
+    }
+  }
+
+  /* If no luck so far, try attacking superstring neighbors. */
+  if (!found_one) {
+    trymove(move, color, "find_backfilling_move", move);
+    superstring_chainlinks(move, &neighbors, adjs, 4);
+    popgo();
+    for (k = 0; k < neighbors; k++) {
+      if (attack(adjs[k], &bpos) == WIN) {
+       if (!forbidden_moves[bpos] && liberty_of_string(bpos, adjs[k])) {
+         *backfill_move = bpos;
+         return 1;
+       }
+      }
+    }
+  }
+
+  if (found_one) {
+    ASSERT1(!forbidden_moves[*backfill_move], *backfill_move);
+  
+    if (!trymove(*backfill_move, color, "find_backfilling_move", move))
+      return 0; /* This really shouldn't happen. */
+    
+    /* Allow opponent to get a move in here. */
+    if (trymove(apos, OTHER_COLOR(color), "find_backfilling_move", move))
+      extra_pop = 1;
+    
+    /* If still not safe, recurse to find a new backfilling move. */
+    if (safe_move(move, color) == WIN)
+      success = 1;
+    else
+      success = find_backfilling_move(move, color, backfill_move,
+                                     forbidden_moves);
+
+    /* Pop move(s) and return. */
+    if (extra_pop)
+      popgo();
+    popgo();
+  }
+
+  if (!success && saved_move != NO_MOVE) {
+    ASSERT1(!forbidden_moves[saved_move], saved_move);
+    *backfill_move = saved_move;
+    success = 1;
+  }
+
+  if (!success)
+    *backfill_move = NO_MOVE;
+  
+  return success;
+}
+
+
+/* Confirm that (move) is a safe move for color. In addition to
+ * calling the global confirm_safety(), this function also calls the
+ * owl code to verify the strategical viability of the move.
+ */
+static int
+filllib_confirm_safety(int move, int color, int *defense_point)
+{
+  int k;
+  int apos = NO_MOVE;
+  int save_verbose;
+
+  gg_assert(stackp == 0);
+  gg_assert(defense_point != NULL);
+  *defense_point = NO_MOVE;
+
+  /* Before we can call the owl code, we need to find a neighbor of
+   * our color.
+   */
+  for (k = 0; k < 4; k++)
+    if (board[move + delta[k]] == color) {
+      apos = move + delta[k];
+      break;
+    }
+
+  /* If none found, look for a neighbor of an attacked adjacent string. */
+  if (apos == NO_MOVE)
+    for (k = 0; k < 4; k++) {
+      int pos2 = move + delta[k];
+      if (board[pos2] == OTHER_COLOR(color)
+         && !play_attack_defend_n(color, 0, 1, move, pos2)) {
+       int adj;
+       adj = chainlinks(pos2, adjs);
+       /* It seems unlikely that we would ever get no adjacent strings
+         * here, but if it should happen we simply give up and say the
+         * move is unsafe.
+        */
+       if (adj == 0)
+         return 0;
+       
+       apos = adjs[0];
+       break;
+      }
+    }
+
+  /* Next attempt are diagonal neighbors. */
+  if (apos == NO_MOVE) {
+    for (k = 4; k < 8; k++)
+      if (board[move + delta[k]] == color) {
+       apos = move + delta[k];
+       break;
+      }
+  }
+
+  /* And two steps away. */
+  if (apos == NO_MOVE) {
+    for (k = 0; k < 4; k++)
+      if (board[move + 2 * delta[k]] == color) {
+       apos = move + 2 * delta[k];
+       break;
+      }
+  }
+  
+  /* We should have found something by now. If not something's
+   * probably broken elsewhere. Declare the move unsafe if it happens.
+   */
+  if (apos == NO_MOVE)
+    return 0;
+
+  /* Ask the owl code whether this move is strategically viable. */
+  
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+  if (!owl_does_defend(move, apos, NULL))
+    return 0;
+  verbose = save_verbose;
+  
+  return confirm_safety(move, color, defense_point, NULL);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/fuseki.c b/engine/fuseki.c
new file mode 100644 (file)
index 0000000..053a338
--- /dev/null
@@ -0,0 +1,410 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "liberty.h"
+#include "patterns.h"
+#include "random.h"
+
+#include "sgftree.h"
+
+
+/* Pointless to do fuseki database pattern matching after this number
+ * of stones have been placed on the board.
+ *
+ * Notice that we are not talking of the move number here but the
+ * number of stones actually residing on the board. This does in
+ * particular include handicap stones.
+ */
+#define MAX_FUSEKI_DATABASE_STONES 30
+
+
+#define UPPER_LEFT  0
+#define UPPER_RIGHT 1
+#define LOWER_LEFT  2
+#define LOWER_RIGHT 3
+
+/* Global variables remembering which symmetries the position has. */
+static int horizontally_symmetric; /* symmetry with respect to K column */
+static int vertically_symmetric;   /* symmetry with respect to 10 row */
+static int diagonally_symmetric;   /* with respect to diagonal from UR to LL */
+
+/* This value must be lower than the value for an ongoing joseki. 
+ * (Gets multiplied with board_size / 19.) 
+ */
+#define EMPTY_CORNER_VALUE 25
+
+/* check if region from i1, j1 to i2, j2 is open */
+
+static int 
+openregion(int i1, int i2, int j1, int j2)
+{
+  int x, y;
+
+  if (i1 > i2)
+    return openregion(i2, i1, j1, j2);
+  if (j1 > j2)
+    return openregion(i1, i2, j2, j1);
+
+  /* Disregard parts of the region off the board. This is convenient
+   * in order not to have to special-case tiny boards. It also secures
+   * against potential reading outside the board[] array boundaries.
+   */
+  if (i1 < 0)
+    i1 = 0;
+  if (j1 < 0)
+    j1 = 0;
+  if (i2 >= board_size)
+    i2 = board_size - 1;
+  if (j2 >= board_size)
+    j2 = board_size - 1;
+    
+  for (x = i1; x <= i2; x++)
+    for (y = j1; y <= j2; y++)
+      if (BOARD(x, y) != EMPTY)
+       return 0;
+  return 1;
+}
+
+/* This function sets the global variables indicating symmetries of the
+ * position. (Important for etiquette.)
+ */
+static void
+set_symmetries(void)
+{
+  int i, j;
+  horizontally_symmetric = 1;
+  vertically_symmetric = 1; 
+  diagonally_symmetric = 1;
+  for (i = 0; i < board_size
+              && (vertically_symmetric || horizontally_symmetric
+                 || diagonally_symmetric); i++)
+    for (j = 0; j < board_size; j++) {
+      if (board[POS(i, j)] != board[POS(i, board_size - 1 - j)])
+       horizontally_symmetric = 0;
+      if (board[POS(i, j)] != board[POS(board_size - 1 - i, j)])
+       vertically_symmetric = 0;
+      if (board[POS(i, j)]
+         != board[POS(board_size - 1 - j, board_size - 1 - i)])
+       diagonally_symmetric = 0;
+    }
+}
+
+/* The corner moves. */
+
+static int corners[][2] =
+{
+  {3, 3},
+  {3, 4},
+  {4, 3},
+  {4, 4},
+  {5, 3},
+  {3, 5},
+  {5, 4},
+  {4, 5},
+};
+
+/* Relative weights for different corner moves at different board
+   sizes. */
+
+/* up to 11x11 */
+static int small_board[] =
+{
+  50,       /* 3-3 */
+  18,       /* 3-4 */
+  17,       /* 4-3 */
+  15,       /* 4-4 */
+  0,        /* 5-3 */
+  0,        /* 3-5 */
+  0,        /* 5-4 */
+  0,        /* 4-5 */
+};
+
+/* 12x12 to 15x15 */
+static int medium_board[] =
+{
+  30,       /* 3-3 */
+  20,       /* 3-4 */
+  20,       /* 4-3 */
+  22,       /* 4-4 */
+  2,        /* 5-3 */
+  2,        /* 3-5 */
+  2,        /* 5-4 */
+  2,        /* 4-5 */
+};
+
+/* 16x16 and larger */
+static int large_board[] =
+{
+  15,       /* 3-3 */
+  15,       /* 3-4 */
+  15,       /* 4-3 */
+  35,       /* 4-4 */
+  5,        /* 5-3 */
+  5,        /* 3-5 */
+  5,        /* 5-4 */
+  5,        /* 4-5 */
+};
+
+static void
+choose_corner_move(int corner, int *m, int *n)
+{
+  int *table = 0;
+  int sum_of_weights = 0;
+  int i;
+  int q;
+  
+  if (board_size <= 11)
+    table = small_board;
+  else if (board_size <= 15)
+    table = medium_board;
+  else 
+    table = large_board;
+
+  for (i = 0; i < 8; i++)
+    sum_of_weights += table[i];
+
+  q = gg_rand() % sum_of_weights;
+  for (i = 0; i < 8; i++) {
+    q -= table[i];
+    if (q < 0)
+      break;
+  }
+  
+  *m = corners[i][0];
+  *n = corners[i][1];
+
+  switch (corner) {
+  case UPPER_LEFT:
+    *m = *m - 1;
+    *n = *n - 1;
+    break;
+  case UPPER_RIGHT:
+    *m = *m - 1;
+    *n = board_size - *n;
+    break;
+  case LOWER_LEFT:
+    *m = board_size - *m;
+    *n = *n - 1;
+    break;
+  case LOWER_RIGHT:
+    *m = board_size - *m;
+    *n = board_size - *n;
+    break;
+  }
+}
+
+
+/* Announce move, but check for politeness first. */
+static void
+announce_move(int move, int value, int color)
+{
+  int i, j;
+  /* This shouldn't happen. */
+  if (board[move] != EMPTY)
+    return;
+  
+  /* Politeness: Black plays in lower right half of upper right corner first.
+   * White plays in upper left half of lower left corner first.
+   * (Not sure whether this is correct for handicap games. Is this an
+   * urgent FIXME? :-) )
+   */
+  if (horizontally_symmetric) {
+    i = I(move);
+    j = J(move);
+    if ((2 * j < board_size - 1) ^ (color == WHITE))
+      move = POS(i, board_size - 1 - j);
+  }
+  if (vertically_symmetric) {
+    i = I(move);
+    j = J(move);
+    if ((2 * i > board_size - 1) ^ (color == WHITE))
+      move = POS(board_size - 1 - i, j);
+  }
+  if (diagonally_symmetric) {
+    i = I(move);
+    j = J(move);
+    if ((board_size - 1 - j > i) ^ (color == WHITE))
+      move = POS(board_size - 1 - j, board_size - 1 - i);
+  }
+  
+  if (set_minimum_move_value(move, value))
+    TRACE("Fuseki Player suggests %1m with value %d\n", move, value);
+}
+
+
+/* Storage for values collected during pattern matching. */
+static int fuseki_moves[MAX_BOARD * MAX_BOARD];
+static int fuseki_value[MAX_BOARD * MAX_BOARD];
+static int num_fuseki_moves;
+static int fuseki_total_value;
+
+/* Callback for fuseki database pattern matching. */
+static void
+fuseki_callback(int move, struct fullboard_pattern *pattern, int ll)
+{
+  TRACE("Fuseki database move at %1m with relative weight %d, pattern %s+%d\n",
+       move, pattern->value, pattern->name, ll);
+
+  /* Store coordinates and relative weight for the found move. */
+  fuseki_moves[num_fuseki_moves] = move;
+  fuseki_value[num_fuseki_moves] = pattern->value;
+  fuseki_total_value += pattern->value;
+  num_fuseki_moves++;
+}
+
+/* Full board matching in database for fuseki moves. Return 1 if any
+ * pattern found.
+ */
+static int
+search_fuseki_database(int color)
+{
+  struct fullboard_pattern *database;
+  int q;
+  int k;
+
+  /* Disable matching after a certain number of stones are placed on
+   * the board.
+   */
+  if (stones_on_board(BLACK | WHITE) > MAX_FUSEKI_DATABASE_STONES)
+    return 0;
+
+  /* We only have databases for 9x9, 13x13 and 19x19. */
+  if (board_size == 9)
+    database = fuseki9;
+  else if (board_size == 13)
+    database = fuseki13;
+  else if (board_size == 19)
+    database = fuseki19;
+  else
+    return 0;
+
+  /* Do the matching. */
+  num_fuseki_moves = 0;
+  fuseki_total_value = 0;
+  fullboard_matchpat(fuseki_callback, color, database);
+
+  /* No match. */
+  if (num_fuseki_moves == 0)
+    return 0;
+
+  /* Choose randomly with respect to relative weights for matched moves.
+   */
+  q = gg_rand() % fuseki_total_value;
+  for (k = 0; k < num_fuseki_moves; k++) {
+    q -= fuseki_value[k];
+    if (q < 0)
+      break;
+  }
+
+  gg_assert(k < num_fuseki_moves);
+  /* Give this move an arbitrary value of 75. The actual value doesn't
+   * matter much since the intention is that we should play this move
+   * whatever the rest of the analysis thinks.
+   */
+  announce_move(fuseki_moves[k], 75, color);
+
+  /* Also make sure the other considered moves can be seen in the
+   * traces and in the output file.
+   */
+  for (k = 0; k < num_fuseki_moves; k++)
+    set_minimum_move_value(fuseki_moves[k], 74);
+
+  return 1;
+}
+
+/* Generate move in empty corner or in middle of small board.*/
+void
+fuseki(int color)
+{
+  int i = -1;
+  int j = -1;
+  int width;  /* Side of the open region required in the corner. */
+  int empty_corner_value = EMPTY_CORNER_VALUE * board_size/19;
+
+  /* Return immediately if --disable_fuseki option used. */
+  if (disable_fuseki)
+    return;
+  
+  set_symmetries();
+
+  /* Search in fuseki database unless disabled by --nofusekidb option. */
+  if (fusekidb && search_fuseki_database(color))
+    return;
+
+  /* On 9x9, only play open corners after the first move if nothing
+   * else useful is found.
+   */
+  if (board_size == 9 && stones_on_board(color) > 0)
+    empty_corner_value = 5;
+  
+  if (board_size <= 11) {
+    /* For boards of size 11x11 or smaller we first go for the center point. */
+    int middle = board_size/2;
+    if (openregion(middle-2, middle+2, middle-2, middle+2)) {
+      announce_move(POS(middle, middle), 45, color);
+    }
+  }
+
+  if (board_size < 9)
+    return;
+
+  if (board_size >= 18)
+    width = 8;
+  else if (board_size == 9)
+    width = 5;
+  else
+    width = board_size/2;
+  
+  if (openregion(0, width-1, board_size-width, board_size-1)) {
+    choose_corner_move(UPPER_RIGHT, &i, &j);
+    announce_move(POS(i, j), empty_corner_value, color);
+  }
+  
+  if (openregion(board_size-width, board_size-1, 0, width-1)) {
+    choose_corner_move(LOWER_LEFT, &i, &j);
+    announce_move(POS(i, j), empty_corner_value, color);
+  }
+  if (openregion(board_size-width, board_size-1,
+                board_size-width, board_size-1)) {
+    choose_corner_move(LOWER_RIGHT, &i, &j);
+    announce_move(POS(i, j), empty_corner_value, color);
+  }
+  
+  if (openregion(0, width-1, 0, width-1)) {
+    choose_corner_move(UPPER_LEFT, &i, &j);
+    announce_move(POS(i, j), empty_corner_value, color);
+  }
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
+
diff --git a/engine/genmove.c b/engine/genmove.c
new file mode 100644 (file)
index 0000000..20e2a94
--- /dev/null
@@ -0,0 +1,981 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+/* Return one if x doesn't equal position_number and 0 otherwise.
+ * After using this macro x will always have the value
+ * position_number.
+ */
+#define NEEDS_UPDATE(x) (x != position_number ? (x = position_number, 1) : 0)
+
+/* Mark a limited search area. If limit_search != 1, genmove
+ * will only return moves within the area marked by the array
+ * search_mask.
+ */
+static int limit_search = 0;
+static int search_mask[BOARDMAX];
+
+static int do_genmove(int color, float pure_threat_value,
+                     int allowed_moves[BOARDMAX], float *value, int *resign);
+
+/* Position numbers for which various examinations were last made. */
+static int worms_examined = -1;
+static int initial_influence_examined = -1;
+static int dragons_examined_without_owl = -1;
+static int dragons_examined = -1;
+static int initial_influence2_examined = -1;
+static int dragons_refinedly_examined = -1;
+
+static int revise_semeai(int color);
+static int revise_thrashing_dragon(int color, float our_score,
+                                  float advantage);
+
+static void break_mirror_go(int color);
+static int find_mirror_move(int *move, int color);
+static int should_resign(int color, float optimistic_score, int move);
+static void compute_scores(int use_chinese_rules);
+
+
+/* Reset some things in the engine. 
+ *
+ * This prepares the hash table for the reading code for use.  It
+ * should be called when we start examine a new position.  
+ */
+
+void
+reset_engine()
+{
+  /* To improve the reproducability of games, we restart the random
+   * number generator with the same seed for each move. Thus we don't
+   * have to know how many previous moves have been played, nor
+   * actually play through them, in order to get the right random
+   * numbers.
+   */
+  reuse_random_seed();
+
+  /* Initialize things for hashing of positions. */
+  reading_cache_clear();
+
+  hashdata_recalc(&board_hash, board, board_ko_pos);
+
+  worms_examined = -1;
+  initial_influence_examined = -1;
+  dragons_examined_without_owl = -1;
+  dragons_examined = -1;
+  initial_influence2_examined = -1;
+  dragons_refinedly_examined = -1;
+
+  /* Prepare our table of move reasons. */
+  clear_move_reasons();
+  clear_break_in_list();
+
+  /* Set up depth values (see comments there for details). */
+  set_depth_values(get_level(), 0);
+
+  /* Initialize arrays of moves which are meaningless due to
+   * static analysis of unconditional status.
+   */
+  clear_unconditionally_meaningless_moves();
+}
+
+/*
+ * Examine the position and try to gather as much information as possible.
+ * This is used mainly for move generation, but could also be called
+ * for debugging purposes (decidestring, etc).
+ *
+ * The parameter how_much tells us how much of the work we have to do.
+ * For move generation we have to do it all.  For debugging we can 
+ * sometimes stop a little earlier.
+ *
+ * aftermath_play indicates we are in aftermath playout phase. It's only
+ * effect is to always use chinese rules for the score estimates.
+ */
+
+void
+examine_position(int how_much, int aftermath_play)
+{
+  int save_verbose = verbose;
+
+  purge_persistent_caches();
+  
+  /* Don't print reading traces during make_worms and make_dragons unless 
+   * the user really wants it (verbose == 3). 
+   */
+  if (verbose == 1 || verbose == 2)
+    --verbose;
+
+  if (NEEDS_UPDATE(worms_examined)) {
+    start_timer(0);
+    make_worms();
+    time_report(0, "  make worms", NO_MOVE, 1.0);
+  }
+
+  if (how_much == EXAMINE_WORMS) {
+    verbose = save_verbose;
+    gg_assert(test_gray_border() < 0);
+    return;
+  }
+
+  if (stones_on_board(BLACK | WHITE) != 0) {
+    if (NEEDS_UPDATE(initial_influence_examined))
+      compute_worm_influence();
+    if (how_much == EXAMINE_INITIAL_INFLUENCE) {
+      verbose = save_verbose;
+      gg_assert(test_gray_border() < 0);
+      return;
+    }
+
+    if (how_much == EXAMINE_DRAGONS_WITHOUT_OWL) {
+      if (NEEDS_UPDATE(dragons_examined_without_owl))
+       make_dragons(1);
+      verbose = save_verbose;
+      gg_assert(test_gray_border() < 0);
+      return;
+    }
+    
+    if (NEEDS_UPDATE(dragons_examined)) {
+      make_dragons(0);
+      compute_scores(chinese_rules || aftermath_play);
+      /* We have automatically done a partial dragon analysis as well. */
+      dragons_examined_without_owl = position_number;
+    }
+    if (how_much == EXAMINE_DRAGONS) {
+      verbose = save_verbose;
+      gg_assert(test_gray_border() < 0);
+      return;
+    }
+  }
+  else if (how_much == EXAMINE_INITIAL_INFLUENCE
+          || how_much == EXAMINE_DRAGONS
+          || how_much == EXAMINE_ALL) {
+    initialize_dragon_data();
+    compute_scores(chinese_rules || aftermath_play);
+    verbose = save_verbose;
+    gg_assert(test_gray_border() < 0);
+    return;
+  }
+  
+  verbose = save_verbose;
+
+  if (NEEDS_UPDATE(initial_influence2_examined)) {
+    compute_dragon_influence();
+  }
+  if (how_much == EXAMINE_INITIAL_INFLUENCE2) {
+    gg_assert(test_gray_border() < 0);
+    return;
+  }
+
+  if (NEEDS_UPDATE(dragons_refinedly_examined)) {
+    compute_refined_dragon_weaknesses();
+    compute_strategic_sizes();
+  }
+  if (how_much == FULL_EXAMINE_DRAGONS) {
+    gg_assert(test_gray_border() < 0);
+    return;
+  }
+
+  if (printworms)
+    show_dragons();
+}
+
+
+/* The same as examine_position(), except that all traces, debug
+ * output, and sgf traces are turned off.
+ */
+void
+silent_examine_position(int how_much)
+{
+  int save_verbose = verbose;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int save_debug = debug;
+  int save_printmoyo = printmoyo;
+  
+  verbose = 0;
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  debug = 0;
+  printmoyo = 0;
+  
+  examine_position(how_much, 0);
+
+  verbose = save_verbose;
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+  debug = save_debug;
+  printmoyo = save_printmoyo;
+}
+
+
+/* 
+ * Generate computer move for color.
+ *
+ * Return the generated move.
+ */
+
+int
+genmove(int color, float *value, int *resign)
+{
+  int move = PASS_MOVE;
+  if (resign)
+    *resign = 0;
+
+#if ORACLE
+  if (metamachine) {
+    move = metamachine_genmove(color, value, limit_search);
+    gg_assert(stackp == 0);
+    if (move != PASS_MOVE)
+      return move;
+  }
+#endif
+
+  if (limit_search)
+    move = do_genmove(color, 0.4, search_mask, value, resign);
+  else
+    move = do_genmove(color, 0.4, NULL, value, resign);
+  gg_assert(move == PASS_MOVE || ON_BOARD(move));
+
+  return move;
+}
+
+
+/* 
+ * Same as above but doesn't generate pure threat moves. Useful when
+ * trying to score a game.
+ */
+
+int
+genmove_conservative(int color, float *value)
+{
+  return do_genmove(color, 0.0, NULL, value, NULL);
+}
+
+
+int
+genmove_restricted(int color, int allowed_moves[BOARDMAX])
+{
+  return do_genmove(color, 0.0, allowed_moves, NULL, NULL);
+}
+
+/* This function collects move reasons can be generated immediately from
+ * the data gathered in the examine_position() phase.
+ */
+void
+collect_move_reasons(int color)
+{
+  worm_reasons(color);
+  semeai_move_reasons(color);
+  owl_reasons(color);
+  cut_reasons(color);
+  break_in_move_reasons(color);
+  unconditional_move_reasons(color);
+}
+
+/* Call Monte Carlo module to generate a move. */
+static int
+monte_carlo_genmove(int color, int allowed_moves[BOARDMAX],
+                   float *value, int *resign)
+{
+  int pos;
+  int best_move = PASS_MOVE;
+  int best_uct_move = PASS_MOVE;
+  int unconditional_territory_black[BOARDMAX];
+  int unconditional_territory_white[BOARDMAX];
+  int forbidden_move[BOARDMAX];
+  float move_values[BOARDMAX];
+  int move_frequencies[BOARDMAX];
+  float best_value;
+  int frequency_cutoff;
+  int frequency_cutoff2;
+  int number_of_simulations;
+
+  memset(move_values, 0, sizeof(move_values));
+  memset(move_frequencies, 0, sizeof(move_frequencies));
+  
+  if (0) {
+    simple_showboard(stderr);
+    gprintf("\n");
+  }
+
+  if (resign)
+    *resign = 0;
+  
+  unconditional_life(unconditional_territory_black, BLACK);
+  unconditional_life(unconditional_territory_white, WHITE);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (!ON_BOARD(pos))
+      continue;
+    else if (unconditional_territory_black[pos])
+      forbidden_move[pos] = BLACK;
+    else if (unconditional_territory_white[pos])
+      forbidden_move[pos] = WHITE;
+    else
+      forbidden_move[pos] = 0;
+
+  number_of_simulations = mc_games_per_level * gg_max(get_level(), 1);
+  
+  uct_genmove(color, &best_uct_move, forbidden_move, allowed_moves,
+             number_of_simulations, move_values, move_frequencies);
+
+  best_move = best_uct_move;
+  best_value = 0.0;
+  frequency_cutoff = move_frequencies[best_uct_move] / 2;
+  frequency_cutoff2 = move_frequencies[best_uct_move] / 10;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)
+       && (move_frequencies[pos] > frequency_cutoff
+           || (move_values[pos] > 0.9
+               && move_frequencies[pos] > frequency_cutoff2)
+           || move_values[best_uct_move] < 0.1)
+       && (!allowed_moves || allowed_moves[pos])
+       && potential_moves[pos] > best_value) {
+      best_move = pos;
+      best_value = potential_moves[pos];
+    }
+  }
+
+  unconditionally_meaningless_move(best_move, color, &best_move);
+
+  *value = 1.0;
+  
+  return best_move;
+}
+
+
+/* 
+ * Perform the actual move generation.
+ *
+ * The array allowed_moves restricts which moves may be considered. If
+ * NULL any move is allowed. Pass is always allowed and will be chosen
+ * if the move generation doesn't like any of the allowed moves (or
+ * overlooks them).
+ */
+  
+static int
+do_genmove(int color, float pure_threat_value,
+          int allowed_moves[BOARDMAX], float *value, int *resign)
+{
+  float average_score, pessimistic_score, optimistic_score;
+  int save_verbose;
+  int save_depth;
+  int move;
+  float dummy_value;
+  int use_thrashing_dragon_heuristics = 0;
+
+  if (!value)
+    value = &dummy_value;
+
+  start_timer(0);
+  clearstats();
+
+  /* Usually we would not recommend resignation. */
+  if (resign)
+    *resign = 0;
+  
+  /* Prepare our table of moves considered. */
+  memset(potential_moves, 0, sizeof(potential_moves));
+  
+  /* no move is found yet. */
+  move = PASS_MOVE;  
+  *value = 0.0; 
+  
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  /* Store the depth value so we can check that it hasn't changed when
+   * we leave this function.
+   */
+  save_depth = depth;
+
+  /* If in mirror mode, try to find a mirror move. */
+  if (play_mirror_go
+      && (mirror_stones_limit < 0
+         || stones_on_board(WHITE | BLACK) <= mirror_stones_limit)
+      && find_mirror_move(&move, color)) {
+    TRACE("genmove() recommends mirror move at %1m\n", move);
+    *value = 1.0;
+    return move;
+  }
+
+  /* Find out information about the worms and dragons. */
+  start_timer(1);
+  examine_position(EXAMINE_ALL, 0);
+  time_report(1, "examine position", NO_MOVE, 1.0);
+
+
+  /* The score will be used to determine when we are safely
+   * ahead. So we want the most conservative score.
+   *
+   * We always want to have the score from our point of view. So
+   * negate it if we are black.
+   */
+  if (color == WHITE) {
+    pessimistic_score = black_score;
+    optimistic_score = white_score;
+  }
+  else {
+    pessimistic_score = -white_score;
+    optimistic_score = -black_score;
+  }
+
+  if (color == WHITE)
+    average_score = (white_score + black_score)/2.0;
+  else
+    average_score = -(white_score + black_score)/2.0;
+  choose_strategy(color, average_score, game_status(color));
+
+  if (printboard) {
+    if (printboard == 1)
+      fprintf(stderr, "\n          dragon_status display:\n\n");
+    if (printboard == 2)
+      fprintf(stderr, "\n          eye display:\n\n");
+    showboard(printboard); 
+    if (printboard == 1) {
+      fprintf(stderr, "\n           owl_status display:\n\n");      
+      showboard(3);
+      fprintf(stderr, "\n           matcher_status display:\n\n");      
+      showboard(4);
+    }
+  }
+  
+  gg_assert(stackp == 0);
+  
+  /*
+   * Ok, information gathering is complete. Now start to find some moves!
+   */
+
+  
+  /* Pick up moves that we know of already. */
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+  collect_move_reasons(color);
+  verbose = save_verbose;
+  time_report(1, "generate move reasons", NO_MOVE, 1.0);
+  
+  /* Try to find empty corner moves. */
+  fuseki(color);
+  gg_assert(stackp == 0);
+
+  /* Look for moves to break mirror play by the opponent. */
+  break_mirror_go(color);
+
+  /* If we are ahead by 5 points or more, consider a thrashing
+   * dragon dangerous and change its status from DEAD to
+   * UNKNOWN. Otherwise, pretend there is no thrashing dragon.
+   */
+  if (!doing_scoring)
+    use_thrashing_dragon_heuristics
+      = revise_thrashing_dragon(color, pessimistic_score, 5.0);
+  
+  /* The general pattern database. */
+  shapes(color);
+  time_report(1, "shapes", NO_MOVE, 1.0);
+  gg_assert(stackp == 0);
+
+  /* Look for combination attacks and defenses against them. */
+  combinations(color);
+  time_report(1, "combinations", NO_MOVE, 1.0);
+  gg_assert(stackp == 0);
+
+  /* Review the move reasons and estimate move values. */
+  if (review_move_reasons(&move, value, color, 
+                         pure_threat_value, pessimistic_score, allowed_moves,
+                         use_thrashing_dragon_heuristics))
+    TRACE("Move generation likes %1m with value %f\n", move, *value);
+  gg_assert(stackp == 0);
+  time_report(1, "review move reasons", NO_MOVE, 1.0);
+
+
+  /* If the move value is 6 or lower, we look for endgame patterns too. */
+  if (*value <= 6.0 && !disable_endgame_patterns) {
+    endgame_shapes(color);
+    endgame(color);
+    gg_assert(stackp == 0);
+    if (review_move_reasons(&move, value, color, pure_threat_value,
+                           pessimistic_score, allowed_moves,
+                           use_thrashing_dragon_heuristics))
+      TRACE("Move generation likes %1m with value %f\n", move, *value);
+    gg_assert(stackp == 0);
+    time_report(1, "endgame", NO_MOVE, 1.0);
+  }
+  
+  /* If no move found yet, revisit any semeai and change the
+   * status of the opponent group from DEAD to UNKNOWN, then 
+   * run shapes and endgame_shapes again. This may turn up a move.
+   */
+  if (move == PASS_MOVE) {
+    if (revise_semeai(color)) {
+      shapes(color);
+      endgame_shapes(color);
+      if (review_move_reasons(&move, value, color, pure_threat_value,
+                             pessimistic_score, allowed_moves,
+                             use_thrashing_dragon_heuristics)) {
+       TRACE("Upon reconsideration move generation likes %1m with value %f\n",
+             move, *value); 
+      }
+    }
+    time_report(1, "move reasons with revised semeai status",
+               NO_MOVE, 1.0);
+  }
+
+  /* If Monte Carlo move generation is enabled, call it now. Do not
+   * override a fuseki move.
+   *
+   * FIXME: Identifying fuseki moves by checking the move value is
+   * very ugly and fragile.
+   */
+  if (use_monte_carlo_genmove && move != PASS_MOVE
+      && (*value < 75.0 || *value > 75.01) && !doing_scoring) {
+    int allowed_moves2[BOARDMAX];
+    int num_allowed_moves2 = 0;
+    int pos;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos)
+         && (!allowed_moves || allowed_moves[pos])
+         && is_allowed_move(pos, color)) {
+       allowed_moves2[pos] = 1;
+       num_allowed_moves2++;
+      }
+      else
+       allowed_moves2[pos] = 0;
+    
+    if (num_allowed_moves2 > 1)
+      move = monte_carlo_genmove(color, allowed_moves2, value, resign);
+  }
+  
+  /* If still no move, fill a remaining liberty. This should pick up
+   * all missing dame points.
+   */
+  if (move == PASS_MOVE
+      && fill_liberty(&move, color)) {
+    if (!allowed_moves || allowed_moves[move]) {
+      *value = 1.0;
+      TRACE("Filling a liberty at %1m\n", move);
+      record_top_move(move, *value);
+      move_considered(move, *value);
+      time_report(1, "fill liberty", NO_MOVE, 1.0);
+    }
+    else
+      move = PASS_MOVE;
+  }
+
+  /* If we're instructed to play out the aftermath or capture all dead
+   * opponent stones, or if the opponent is trying to live inside
+   * our territory and we are clearly ahead, generate an aftermath move.
+   */
+  if (move == PASS_MOVE) {
+    if (play_out_aftermath 
+       || capture_all_dead 
+       || (!doing_scoring && thrashing_dragon && pessimistic_score > 15.0))
+      move = aftermath_genmove(color, capture_all_dead, allowed_moves);
+
+    if (move != PASS_MOVE) {
+      ASSERT1(is_legal(move, color), move);
+      *value = 1.0;
+      TRACE("Aftermath move at %1m\n", move);
+      record_top_move(move, *value);
+      move_considered(move, *value);
+      time_report(1, "aftermath_genmove", NO_MOVE, 1.0);
+    }
+  }
+
+  /* If we somehow have managed to generate an illegal move, pass instead. */
+  if (!is_allowed_move(move, color)) {
+    TRACE("ILLEGAL MOVE GENERATED. Passing instead.\n");
+    move = PASS_MOVE;
+    *value = -1.0;
+  }
+  
+  /* If no move is found then pass. */
+  if (move == PASS_MOVE) {
+    TRACE("I pass.\n");
+  }
+  else {
+    TRACE("genmove() recommends %1m with value %f\n", move, *value);
+  }
+  
+  /* Maybe time to resign...
+   */
+  if (resign && resign_allowed
+      && *value < 10.0 && should_resign(color, optimistic_score, move)) {
+    TRACE("... though, genmove() thinks the position is hopeless\n");
+    *resign = 1;
+  }
+  
+  /* If statistics is turned on, this is the place to show it. */
+  if (showstatistics)
+    showstats();
+
+  if (showtime) {
+    double spent = time_report(0, "TIME to generate move at ", move, 1.0);
+    total_time += spent;
+    if (spent > slowest_time) {
+      slowest_time = spent;
+      slowest_move = move;
+      slowest_movenum = movenum + 1;
+    }
+  }
+
+  /* Some consistency checks to verify that things are properly
+   * restored and/or have not been corrupted.
+   */
+  gg_assert(stackp == 0);
+  gg_assert(test_gray_border() < 0);
+  gg_assert(depth == save_depth);
+
+  return move;
+}
+
+
+
+/* This is called for each move which has been considered. For
+ * debugging purposes, we keep a table of all the moves we
+ * have considered.
+ */
+
+void 
+move_considered(int move, float value)
+{
+  if (value > potential_moves[move])
+    potential_moves[move] = value;
+}
+
+
+/* revise_semeai(color) changes the status of any DEAD dragon of
+ * OPPOSITE_COLOR(color) which occurs in a semeai to UNKNOWN.
+ * It returns true if such a dragon is found.
+ */
+
+static int
+revise_semeai(int color)
+{
+  int pos;
+  int found_one = 0;
+  int other = OTHER_COLOR(color);
+
+  if (stones_on_board(BLACK | WHITE) == 0)
+    return 0;
+
+  if (doing_scoring)
+    return 0;
+  
+  gg_assert(dragon2 != NULL);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)
+       && dragon[pos].color == other
+       && DRAGON2(pos).semeais
+       && dragon[pos].status == DEAD) {
+      found_one = 1;
+      dragon[pos].status = UNKNOWN;
+      if (dragon[pos].origin == pos)
+       TRACE("revise_semeai: changed status of dragon %1m from DEAD to UNKNOWN\n",
+             pos);
+    }
+  }
+  
+  return found_one;
+}
+
+
+/* If the opponent's last move added a stone to a dead dragon,
+ * revise it's status to UNKNOWN. This will cause genmove to
+ * generate moves restraining the dragon. We only do this if
+ * we are ahead by 'advantage', and no owl threat has been found.
+ */
+
+static int
+revise_thrashing_dragon(int color, float our_score, float advantage)
+{
+  int pos;
+  signed char safe_stones[BOARDMAX];
+  float strength[BOARDMAX];
+
+  /* Trust the owl code's opinion if we are behind. */
+  if (our_score < advantage)
+    return 0;
+
+  if (disable_threat_computation
+      || !thrashing_dragon 
+      || dragon[thrashing_dragon].status != DEAD)
+    return 0;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && thrashing_stone[pos]
+       && worm[pos].unconditional_status != DEAD) {
+      dragon[pos].status = UNKNOWN;
+      DRAGON2(pos).safety = ALIVE;
+    }
+
+  set_strength_data(OTHER_COLOR(color), safe_stones, strength);
+  compute_influence(OTHER_COLOR(color), safe_stones, strength,
+                   OPPOSITE_INFLUENCE(color),
+                   NO_MOVE, "revised thrashing dragon");
+  compute_refined_dragon_weaknesses();
+  
+  return 1;
+}
+
+
+/* Look for a mirror move. First try the mirror of the last move. If
+ * none is available, test all moves to see if one makes the board
+ * symmetric.
+ *
+ * To be able to deal with handicap stones we use a somewhat weak
+ * definition of symmetry.
+ */
+
+static int
+find_mirror_move(int *move, int color)
+{
+  int last_move = get_last_move();
+  int mirror_move;
+  if (last_move != NO_MOVE) {
+    mirror_move = MIRROR_MOVE(last_move);
+    if (test_symmetry_after_move(mirror_move, color, 0)) {
+      *move = mirror_move;
+      return 1;
+    }
+  }
+  else {
+    for (mirror_move = BOARDMIN; mirror_move < BOARDMAX; mirror_move++) {
+      if (ON_BOARD(mirror_move)
+         && test_symmetry_after_move(mirror_move, color, 0)) {
+       *move = mirror_move;
+       return 1;
+      }
+    }
+  }
+  
+  return 0;
+}
+
+/* Computer two territory estimates: for *upper, the status of all
+ * cricital stones gets resolved in White's favor; vice verso for
+ * black.
+ */
+static void
+compute_scores(int use_chinese_rules)
+{
+  signed char safe_stones[BOARDMAX];
+  float strength[BOARDMAX];
+
+  set_strength_data(WHITE, safe_stones, strength);
+  compute_influence(EMPTY, safe_stones, strength, &move_influence,
+                   NO_MOVE, "White territory estimate");
+  white_score = influence_score(&move_influence, use_chinese_rules);
+  set_strength_data(BLACK, safe_stones, strength);
+  compute_influence(EMPTY, safe_stones, strength, &move_influence,
+                   NO_MOVE, "White territory estimate");
+  black_score = influence_score(&move_influence, use_chinese_rules);
+
+  if (verbose || showscore) {
+    if (white_score == black_score)
+      gprintf("Score estimate: %s %f\n",
+             black_score > 0 ? "W " : "B ", gg_abs(black_score));
+    else
+      gprintf("Score estimate: %s %f to %s %f\n",
+             black_score > 0 ? "W " : "B ", gg_abs(black_score),
+             white_score > 0 ? "W " : "B ", gg_abs(white_score));
+    fflush(stderr);
+  }
+}
+
+
+/* Detect if a white opponent has played mirror go for at least 10
+ * moves and if so play on tengen.
+ *
+ * Mirror breaking moves in other situations are handled by patterns
+ * in patterns.db.
+ */
+static void
+break_mirror_go(int color)
+{
+  int tengen = POS((board_size - 1) / 2, (board_size - 1) / 2);
+  if (board[tengen] == EMPTY
+      && color == BLACK
+      && stones_on_board(BLACK | WHITE) > 10
+      && test_symmetry_after_move(tengen, color, 1)) {
+    set_minimum_move_value(tengen, 30.0);
+    TRACE("Play %1m to break mirror go, value 30.\n", tengen);
+  }
+}
+
+
+/* Helper to decide whether GG should resign a game
+ */
+static int
+should_resign(int color, float optimistic_score, int move)
+{
+  float status;
+  int d;
+  /* We resign 19x19 games only, smaller board games are fast enough.
+   * We resign only if the margin is bigger than 45 pts and if we are
+   * behind (of course).
+   *
+   * As an exception to this rule, we resign on any board size if
+   * it looks like all our dragons are dead and the generated move
+   * is a pass.
+   */
+  if (board_size > 2 && move == PASS_MOVE && !lively_dragon_exists(color))
+    return 1;
+  
+  if (move == PASS_MOVE
+      || board_size < 19
+      || optimistic_score > -45.0)
+    return 0;
+  /* Check dragon statuses. If a friendly dragon is critical, we are
+   * possibly not that much behind after we save it. If some hostile
+   * dragon is at least weak, we possibly have a chance to come back
+   * if we can kill it.
+   */
+  for (d = 0; d < number_of_dragons; d++) {
+    /* any friendly critical dragon ? */
+    if (board[dragon2[d].origin] == color
+       && DRAGON(d).status == CRITICAL)
+      return 0;
+    /* any weak opponent dragon ? */
+    if (board[dragon2[d].origin] == OTHER_COLOR(color)
+       && DRAGON(d).status != DEAD
+       && DRAGON(d).effective_size >= 10
+       && dragon_weak(dragon2[d].origin))
+      return 0;
+  }
+  /* Is it already too late to try something ? */
+  status = game_status(color);
+  if (status < 0.8)
+    /* Still "too early".
+     * Note: the 0.8 constant is very conservative, we actually could give
+     * up a bit earlier.
+     */
+    return 0;
+
+  /* well, it is probably reasonable and polite to give up this game */
+  return 1;
+}
+
+
+/*********************************************************************\
+ *                Mark a limited search area                         *
+\*********************************************************************/
+
+/* Activate or deactivate search limit. */
+void
+set_limit_search(int value)
+{
+  limit_search = value;
+}
+
+/* The following function marks a diamond of radius 6 with center pos.  */
+
+void
+set_search_diamond(int pos)
+{
+  int i = I(pos);
+  int j = J(pos);
+  int m, n;
+  
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) {
+      if (gg_abs(m - i) + gg_abs(n - j) <= 6)
+       search_mask[POS(m, n)] = 1;
+      else
+       search_mask[POS(m, n)] = 0;      
+    }
+  limit_search = pos;
+  if (0)
+    draw_search_area();
+}
+
+/* unmarks the entire board */
+
+void
+reset_search_mask()
+{
+  memset(search_mask, 0, sizeof(search_mask));
+}
+
+/* marks a single vertex */
+
+void
+set_search_mask(int pos, int value)
+{
+  search_mask[pos] = value;
+}
+
+/* displays the search area */
+
+void
+draw_search_area(void)
+{
+  int m, n;
+
+  start_draw_board();
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) {
+      int col, c;
+       
+      if (search_mask[POS(m, n)])
+       col = GG_COLOR_RED;
+      else
+       col = GG_COLOR_BLACK;
+      
+      if (board[POS(m, n)] == BLACK)
+       c = 'X';
+      else if (board[POS(m, n)] == WHITE)
+       c = 'O';
+      else if (search_mask[POS(m, n)])
+       c = '*';
+      else
+       c = '.';
+      draw_color_char(m, n, c, col);
+    }
+  end_draw_board();
+}
+
+/* returns true if the position is within the search area */
+int
+within_search_area(int pos)
+{
+  if (!limit_search)
+    return 1;
+  return search_mask[pos];
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/globals.c b/engine/globals.c
new file mode 100644 (file)
index 0000000..481c440
--- /dev/null
@@ -0,0 +1,180 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+
+#include "sgftree.h"
+#include "liberty.h"
+#include "config.h"
+
+/* 
+ * Define all global variables used within the engine.
+ */
+
+int thrashing_dragon = NO_MOVE; /* Dead opponent's dragon trying to live. */
+signed char thrashing_stone[BOARDMAX]; /* All thrashing stones. */
+
+float potential_moves[BOARDMAX];
+
+/* Used by reading. */
+int depth;              /* deep reading cut off */
+int backfill_depth;     /* deep reading cut off */
+int backfill2_depth;    /* deep reading cut off */
+int break_chain_depth;  /* deep reading cut off */
+int superstring_depth;  /* deep reading cut off */
+int fourlib_depth;      /* deep reading cut off */
+int ko_depth;           /* deep reading cut off */
+int branch_depth;       /* deep reading cut off */
+int aa_depth;
+int depth_offset;       /* keeps track of temporary depth changes */
+int owl_distrust_depth;   /* below this owl trusts the optics code */
+int owl_branch_depth;     /* below this owl tries only one variation */
+int owl_reading_depth;    /* owl does not read below this depth */
+int owl_node_limit;       /* maximum number of nodes considered */
+int semeai_branch_depth;
+int semeai_branch_depth2;
+int semeai_node_limit;
+int connect_depth;     /* Used by Tristan Cazenave's connection reader. */
+int connect_depth2;     /* Used by alternater connection reader. */
+int connection_node_limit; 
+int breakin_node_limit; /* Reading limits for break_in/block_off reading */
+int breakin_depth;    
+/* Mandated values for deep reading cutoffs. */
+int mandated_depth = -1;   
+int mandated_backfill_depth = -1;
+int mandated_backfill2_depth = -1;
+int mandated_break_chain_depth = -1;
+int mandated_superstring_depth = -1;
+int mandated_fourlib_depth = -1;   
+int mandated_ko_depth = -1;       
+int mandated_branch_depth = -1;  
+int mandated_aa_depth = -1;
+int mandated_owl_distrust_depth = -1;  
+int mandated_owl_branch_depth = -1;  
+int mandated_owl_reading_depth = -1; 
+int mandated_owl_node_limit = -1;    
+int mandated_semeai_node_limit = -1;    
+
+
+/* Miscellaneous. */
+int quiet             = 0;  /* minimal output */
+int showstatistics    = 0;  /* print statistics */
+int profile_patterns  = 0;  /* print statistics of pattern usage */
+int allpats           = 0;  /* generate all patterns, even small ones */
+int printworms        = 0;  /* print full data on each string */
+int printmoyo         = 0;  /* print moyo board each move */
+int printboard        = 0;  /* print board each move */
+int fusekidb          = 1;  /* use fuseki database */
+int disable_fuseki    = 0;  /* do not generate fuseki moves */
+int josekidb          = 1;  /* use joseki database */
+int showtime          = 0;  /* print time to find move */
+int showscore         = 0;  /* print estimated score */
+int debug             = 0;  /* controls debug output */
+int verbose           = 0;  /* trace level */
+char outfilename[128] = ""; /* output file (-o option) */
+int output_flags      = OUTPUT_DEFAULT; /* amount of output to outfile */
+int metamachine       = 0;  /* use metamachine_genmove */
+int oracle_exists     = 0;  /* oracle is available for consultation   */
+int autolevel_on      = 0;  /* Adjust level in GMP or ASCII mode. */
+
+int disable_threat_computation = 0;
+int disable_endgame_patterns   = 0;
+int doing_scoring              = 0;
+
+int chinese_rules = CHINESE_RULES; /* ruleset choice for GMP connection */
+/* use experimental connection module */
+int experimental_connections = EXPERIMENTAL_CONNECTIONS;
+/* use alternate connection reading algorithm */
+int alternate_connections = ALTERNATE_CONNECTIONS;
+/* compute owl threats */
+int owl_threats = OWL_THREATS; 
+/* use experimental owl extension (GAIN/LOSS) */
+int experimental_owl_ext = EXPERIMENTAL_OWL_EXT;
+/* use experimental territory break-in module */
+int experimental_break_in = USE_BREAK_IN;
+/* use central oriented influence */
+int cosmic_gnugo = COSMIC_GNUGO;
+/* search for large scale owl moves */
+int large_scale = LARGE_SCALE;
+
+int capture_all_dead    = 0;    /* capture all dead opponent stones */
+int play_out_aftermath  = 0;    /* make everything unconditionally settled */
+int resign_allowed = RESIGNATION_ALLOWED; /* resign hopeless games */
+
+int play_mirror_go      = 0;    /* try to play mirror go if possible */
+int mirror_stones_limit = -1;   /* but stop at this number of stones */
+
+int gtp_version         = 2;    /* Use GTP version 2 by default. */
+int use_monte_carlo_genmove = 0; /* Default is not to use Monte Carlo move
+                                 * generation.
+                                 */
+int mc_games_per_level = 8000;  /* By default, use 8000 times the current
+                                * level number of simulations
+                                * for each mmove when Monte Carlo
+                                * move generation is enabled.
+                                */
+
+float best_move_values[10];
+int   best_moves[10];
+float white_score;
+float black_score;
+
+int close_worms[BOARDMAX][4];
+int number_close_worms[BOARDMAX];
+int close_black_worms[BOARDMAX][4];
+int number_close_black_worms[BOARDMAX];
+int close_white_worms[BOARDMAX][4];
+int number_close_white_worms[BOARDMAX];
+
+int false_eye_territory[BOARDMAX];
+int forced_backfilling_moves[BOARDMAX];
+
+struct worm_data      worm[BOARDMAX];
+struct dragon_data    dragon[BOARDMAX];
+int                   number_of_dragons;
+struct dragon_data2   *dragon2 = NULL;
+struct half_eye_data  half_eye[BOARDMAX];
+struct eye_data       black_eye[BOARDMAX];
+struct eye_data       white_eye[BOARDMAX];
+struct vital_eye_points black_vital_points[BOARDMAX];
+struct vital_eye_points white_vital_points[BOARDMAX];
+struct surround_data  surroundings[MAX_SURROUND];
+int                   surround_pointer;
+
+int cutting_points[BOARDMAX];
+
+double slowest_time = 0.0;
+int    slowest_move = NO_MOVE;
+int    slowest_movenum = 0;
+double total_time = 0.0;
+
+
+float minimum_value_weight  = 1.0;
+float maximum_value_weight  = 1.0;
+float invasion_malus_weight = 1.0;
+float territorial_weight    = 1.0;
+float strategical_weight    = 1.0;
+float attack_dragon_weight  = 1.0;
+float followup_weight       = 1.0;
diff --git a/engine/gnugo.h b/engine/gnugo.h
new file mode 100644 (file)
index 0000000..2afd858
--- /dev/null
@@ -0,0 +1,388 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* ---------------------------------------------------------------- *
+ * gnugo.h
+ *     This file contains the public interface to the GNU Go engine.
+ * ---------------------------------------------------------------- */
+
+
+#ifndef _GNUGO_H_
+#define _GNUGO_H_
+
+#include "board.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_CRTDBG_H
+#include <crtdbg.h>
+#endif
+
+#include "sgftree.h"
+#include "clock.h"
+#include "winsocket.h"
+
+/* interface.c */
+/* Initialize the whole thing. Should be called once. */
+void init_gnugo(float memory, unsigned int random_seed);
+
+
+/* ================================================================ */
+/*                some public macros used everywhere                */
+/* ================================================================ */
+
+
+/* Used in matchpat.c. Have to be different from WHITE, BLACK. */
+#define ANCHOR_COLOR 6
+#define ANCHOR_OTHER 7
+
+/* Return codes for reading functions */
+
+#define WIN  5
+#define KO_A 4
+#define GAIN 3
+#define LOSS 2
+#define KO_B 1
+#define LOSE 0
+
+const char *result_to_string(int result);
+
+/* Used by break_through(). Must be different from 0 and WIN. */
+#define CUT  2
+
+
+/* Surrounded */
+
+#define SURROUNDED 1
+#define WEAKLY_SURROUNDED 2
+
+/* ================================================================ */
+/*                        Board manipulation                        */
+/* ================================================================ */
+
+
+int check_boardsize(int boardsize, FILE *out);
+void gnugo_clear_board(int boardsize);
+void gnugo_play_move(int move, int color);
+int gnugo_play_sgfnode(SGFNode *node, int to_move);
+int gnugo_sethand(int desired_handicap, SGFNode *node);
+float gnugo_estimate_score(float *upper, float *lower);
+
+/* ================================================================ */
+/*                           Game handling                          */
+/* ================================================================ */
+
+
+typedef struct {
+  int handicap;
+  int to_move;         /* whose move it currently is */
+  SGFTree game_record; /* Game record in sgf format. */
+  int computer_player; /* BLACK, WHITE, or EMPTY (used as BOTH) */
+} Gameinfo;
+
+void gameinfo_clear(Gameinfo *ginfo);
+void gameinfo_print(Gameinfo *ginfo);
+int gameinfo_play_sgftree_rot(Gameinfo *gameinfo, SGFTree *tree,
+                             const char *untilstr, int orientation);
+int gameinfo_play_sgftree(Gameinfo *gameinfo, SGFTree *tree,
+                         const char *untilstr);
+
+
+/* ================================================================ */
+/*                           global variables                       */
+/* ================================================================ */
+
+
+/* Miscellaneous debug options. */
+extern int quiet;              /* Minimal output. */
+extern int verbose;            /* Bore the opponent. */
+extern int allpats;            /* generate all patterns, even small ones */
+extern int printworms;         /* print full data on each string */
+extern int printmoyo;          /* print moyo board each move */
+extern int printdragons;       /* print full data on each dragon */
+extern int printboard;         /* print board each move */
+extern int showstatistics;     /* print statistics */
+extern int profile_patterns;   /* print statistics of pattern usage */
+extern char outfilename[128];  /* output file (-o option) */
+extern int output_flags;       /* amount of output to outfile */
+
+/* output flag bits */
+#define OUTPUT_MARKDRAGONS         0x0001  /* mark dead and critical dragons */
+#define OUTPUT_MOVEVALUES          0x0002  /* output values of all moves in list */
+
+#define OUTPUT_DEFAULT             0 /* no debug output  by default */
+
+/* debug flag bits */
+/* NOTE : can specify -d0x... */
+/* Please keep this list in sync with the DEBUG_FLAGS string below. */
+#define DEBUG_INFLUENCE             0x0001
+#define DEBUG_EYES                  0x0002
+#define DEBUG_OWL                   0x0004
+#define DEBUG_ESCAPE                0x0008
+#define DEBUG_MATCHER               0x0010
+#define DEBUG_DRAGONS               0x0020
+#define DEBUG_SEMEAI                0x0040
+#define DEBUG_LOADSGF               0x0080
+#define DEBUG_HELPER                0x0100
+#define DEBUG_READING               0x0200
+#define DEBUG_WORMS                 0x0400
+#define DEBUG_MOVE_REASONS          0x0800
+#define DEBUG_OWL_PERFORMANCE       0x1000
+#define DEBUG_BREAKIN              0x2000
+#define DEBUG_FILLLIB               0x4000
+#define DEBUG_READING_PERFORMANCE   0x8000
+#define DEBUG_SCORING               0x010000
+#define DEBUG_AFTERMATH             0x020000
+#define DEBUG_ATARI_ATARI           0x040000
+#define DEBUG_READING_CACHE         0x080000
+#define DEBUG_TERRITORY             0x100000
+#define DEBUG_PERSISTENT_CACHE     0x200000
+#define DEBUG_TOP_MOVES             0x400000
+#define DEBUG_MISCELLANEOUS         0x800000
+#define DEBUG_ORACLE_STREAM         0x1000000
+#define DEBUG_LARGE_SCALE           0x1000000
+#define DEBUG_SPLIT_OWL             0x2000000
+#define DEBUG_TIME                  0x4000000
+
+
+#define DEBUG_FLAGS "\
+DEBUG_INFLUENCE             0x0001\n\
+DEBUG_EYES                  0x0002\n\
+DEBUG_OWL                   0x0004\n\
+DEBUG_ESCAPE                0x0008\n\
+DEBUG_MATCHER               0x0010\n\
+DEBUG_DRAGONS               0x0020\n\
+DEBUG_SEMEAI                0x0040\n\
+DEBUG_LOADSGF               0x0080\n\
+DEBUG_HELPER                0x0100\n\
+DEBUG_READING               0x0200\n\
+DEBUG_WORMS                 0x0400\n\
+DEBUG_MOVE_REASONS          0x0800\n\
+DEBUG_OWL_PERFORMANCE       0x1000\n\
+DEBUG_BREAKIN               0x2000\n\
+DEBUG_FILLLIB               0x4000\n\
+DEBUG_READING_PERFORMANCE   0x8000\n\
+DEBUG_SCORING               0x010000\n\
+DEBUG_AFTERMATH             0x020000\n\
+DEBUG_ATARI_ATARI           0x040000\n\
+DEBUG_READING_CACHE         0x080000\n\
+DEBUG_TERRITORY             0x100000\n\
+DEBUG_PERSISTENT_CACHE      0x200000\n\
+DEBUG_TOP_MOVES             0x400000\n\
+DEBUG_MISCELLANEOUS         0x800000\n\
+DEBUG_ORACLE_STREAM         0x1000000\n\
+DEBUG_LARGE_SCALE           0x1000000\n\
+DEBUG_SPLIT_OWL             0x2000000\n\
+DEBUG_TIME                  0x4000000\n\
+"
+
+
+extern int debug;              /* debug flags */
+extern int fusekidb;            /* use fuseki database */
+extern int disable_fuseki;      /* do not generate fuseki moves */
+extern int josekidb;            /* use joseki database */
+extern int semeai_variations;   /* max variations considered reading semeai */
+extern int showtime;           /* print genmove time */
+extern int showscore;          /* print score */
+extern int chinese_rules;       /* use chinese (area) rules for counting */
+extern int experimental_owl_ext;     /* use experimental owl (GAIN/LOSS) */
+extern int experimental_connections; /* use experimental connection module */
+extern int alternate_connections;    /* use alternate connection module */
+extern int owl_threats;              /* compute owl threats */
+extern int capture_all_dead;         /* capture all dead opponent stones */
+extern int play_out_aftermath; /* make everything unconditionally settled */
+extern int resign_allowed;           /* allows GG to resign hopeless games */
+extern int play_mirror_go;           /* try to play mirror go if possible */
+extern int mirror_stones_limit;      /* but stop at this number of stones */
+extern int gtp_version;              /* version of Go Text Protocol */
+extern int use_monte_carlo_genmove;  /* use Monte Carlo move generation */
+extern int mc_games_per_level;       /* number of Monte Carlo simulations per level */
+
+/* Mandatory values of reading parameters. Normally -1, if set
+ * these override the values derived from the level. */
+extern int mandated_depth;
+extern int mandated_backfill_depth;
+extern int mandated_backfill2_depth;
+extern int mandated_break_chain_depth;
+extern int mandated_superstring_depth;
+extern int mandated_fourlib_depth;
+extern int mandated_ko_depth;
+extern int mandated_branch_depth;
+extern int mandated_aa_depth;
+extern int mandated_owl_distrust_depth;
+extern int mandated_owl_branch_depth;
+extern int mandated_owl_reading_depth;
+extern int mandated_owl_node_limit; 
+extern int mandated_semeai_node_limit; 
+
+extern int autolevel_on;
+
+extern float potential_moves[BOARDMAX];
+
+extern int oracle_exists; /* oracle is available for consultation        */
+extern int metamachine;   /* use metamachine_genmove                     */
+
+/* ================================================================ */
+/*                 tracing and debugging functions                  */
+/* ================================================================ */
+
+/* Colors. */
+#define GG_COLOR_BLACK   0
+#define GG_COLOR_RED     1
+#define GG_COLOR_GREEN   2
+#define GG_COLOR_YELLOW  3
+#define GG_COLOR_BLUE    4
+#define GG_COLOR_MAGENTA 5
+#define GG_COLOR_CYAN    6
+#define GG_COLOR_WHITE   7
+
+/* showbord.c */
+void start_draw_board(void);
+void draw_color_char(int m, int n, int c, int color);
+void draw_char(int m, int n, int c);
+void end_draw_board(void);
+void showboard(int xo);  /* ascii rep. of board to stderr */
+
+
+/* influence.c */
+void debug_influence_move(int move);
+
+
+#define TRACE  (!(verbose)) ? (void)0 : (void)gprintf
+
+#ifdef HAVE_VARIADIC_DEFINE
+
+/* gnuc allows variadic macros, so the tests can be done inline */
+#define DEBUG(level, fmt, args...) \
+    do { if ((debug & (level))) gprintf(fmt, ##args); } while (0)
+
+#else /*HAVE_VARIADIC_DEFINE*/
+
+/* if debug == 0, then can skip the function call. */
+#define DEBUG  (!(debug)) ? (void)0 : (void)DEBUG_func
+int DEBUG_func(int level, const char *fmt, ...);
+
+#endif  /*HAVE_VARIADIC_DEFINE*/
+
+
+/* genmove.c */
+#define EXAMINE_WORMS               1
+#define EXAMINE_INITIAL_INFLUENCE   2
+#define EXAMINE_DRAGONS_WITHOUT_OWL 3
+#define EXAMINE_DRAGONS             4
+#define EXAMINE_OWL_REASONS         5
+#define EXAMINE_INITIAL_INFLUENCE2  6
+#define FULL_EXAMINE_DRAGONS        7
+
+#define EXAMINE_ALL                 99
+
+void reset_engine(void);
+void examine_position(int how_much, int aftermath_play);
+void silent_examine_position(int how_much);
+
+
+/* ================================================================ */
+/*                         statistics functions                     */
+/* ================================================================ */
+
+
+/* These are mostly used for GTP examination. */
+void reset_owl_node_counter(void);
+int get_owl_node_counter(void);
+void reset_reading_node_counter(void);
+int get_reading_node_counter(void);
+void reset_connection_node_counter(void);
+int get_connection_node_counter(void);
+
+
+
+/* ================================================================ */
+/*                         Low level functions                      */
+/* ================================================================ */
+
+/* utils.c */
+void who_wins(int color, FILE *outfile);
+
+/* high-level routine to generate the best move for the given color */
+int genmove(int color, float *value, int *resign);
+int genmove_conservative(int color, float *value);
+
+/* Play through the aftermath. */
+float aftermath_compute_score(int color, SGFTree *tree);
+
+/* Basic information gathering. */
+/* worm.c */
+void make_worms(void);
+void compute_worm_influence(void);
+
+/* dragon.c */
+void make_dragons(int stop_before_owl);
+void initialize_dragon_data(void);
+void show_dragons(void);
+enum dragon_status crude_status(int pos);
+enum dragon_status dragon_status(int pos);
+int same_dragon(int dr1, int dr2);
+
+/* debugging functions */
+void prepare_pattern_profiling(void);
+void report_pattern_profiling(void);
+
+/* sgffile.c */
+void sgffile_add_debuginfo(SGFNode *node, float value);
+void sgffile_output(SGFTree *tree);
+
+void sgffile_printsgf(int color_to_play, const char *filename);
+void sgffile_printboard(SGFTree *tree);
+void sgffile_recordboard(SGFNode *node);
+int get_sgfmove(SGFProperty *property);
+
+/* sgfdecide.c */
+void decide_string(int pos);
+void decide_connection(int apos, int bpos);
+void decide_owl(int pos);
+void decide_dragon_data(int pos);
+void decide_semeai(int apos, int bpos);
+void decide_tactical_semeai(int apos, int bpos);
+void decide_position(void);
+void decide_eye(int pos);
+void decide_combination(int color);
+void decide_surrounded(int pos);
+void decide_oracle(Gameinfo *gameinfo, char *infilename, char *untilstring);
+
+/*oracle.c*/
+void dismiss_oracle(void);
+void oracle_clear_board(int boardsize);
+
+#endif  /* _GNUGO_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/handicap.c b/engine/handicap.c
new file mode 100644 (file)
index 0000000..6a67188
--- /dev/null
@@ -0,0 +1,446 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include "liberty.h"
+#include "patterns.h"
+#include "random.h"
+
+/* ================================================================ */
+/*       Set up fixed placement handicap stones for black side      */
+/* ================================================================ */
+
+
+/* Handicap stones are set up according to the following diagrams:
+ *  
+ * 2 stones:                    3 stones:           
+ *
+ *   A B C D E F G H J           A B C D E F G H J  
+ * 9 . . . . . . . . . 9       9 . . . . . . . . . 9
+ * 8 . . . . . . . . . 8       8 . . . . . . . . . 8
+ * 7 . . + . . . X . . 7       7 . . X . . . X . . 7
+ * 6 . . . . . . . . . 6       6 . . . . . . . . . 6
+ * 5 . . . . + . . . . 5       5 . . . . + . . . . 5
+ * 4 . . . . . . . . . 4       4 . . . . . . . . . 4
+ * 3 . . X . . . + . . 3       3 . . X . . . + . . 3
+ * 2 . . . . . . . . . 2       2 . . . . . . . . . 2
+ * 1 . . . . . . . . . 1       1 . . . . . . . . . 1
+ *   A B C D E F G H J           A B C D E F G H J  
+ *   
+ * 4 stones:                    5 stones:           
+ *                                                  
+ *   A B C D E F G H J           A B C D E F G H J  
+ * 9 . . . . . . . . . 9       9 . . . . . . . . . 9
+ * 8 . . . . . . . . . 8       8 . . . . . . . . . 8
+ * 7 . . X . . . X . . 7       7 . . X . . . X . . 7
+ * 6 . . . . . . . . . 6       6 . . . . . . . . . 6
+ * 5 . . . . + . . . . 5       5 . . . . X . . . . 5
+ * 4 . . . . . . . . . 4       4 . . . . . . . . . 4
+ * 3 . . X . . . X . . 3       3 . . X . . . X . . 3
+ * 2 . . . . . . . . . 2       2 . . . . . . . . . 2
+ * 1 . . . . . . . . . 1       1 . . . . . . . . . 1
+ *   A B C D E F G H J           A B C D E F G H J  
+ *  
+ * 6 stones:                    7 stones:           
+ *                                                  
+ *   A B C D E F G H J           A B C D E F G H J  
+ * 9 . . . . . . . . . 9       9 . . . . . . . . . 9
+ * 8 . . . . . . . . . 8       8 . . . . . . . . . 8
+ * 7 . . X . . . X . . 7       7 . . X . . . X . . 7
+ * 6 . . . . . . . . . 6       6 . . . . . . . . . 6
+ * 5 . . X . + . X . . 5       5 . . X . X . X . . 5
+ * 4 . . . . . . . . . 4       4 . . . . . . . . . 4
+ * 3 . . X . . . X . . 3       3 . . X . . . X . . 3
+ * 2 . . . . . . . . . 2       2 . . . . . . . . . 2
+ * 1 . . . . . . . . . 1       1 . . . . . . . . . 1
+ *   A B C D E F G H J           A B C D E F G H J  
+ *  
+ * 8 stones:                    9 stones:           
+ *                                                  
+ *   A B C D E F G H J           A B C D E F G H J  
+ * 9 . . . . . . . . . 9       9 . . . . . . . . . 9
+ * 8 . . . . . . . . . 8       8 . . . . . . . . . 8
+ * 7 . . X . X . X . . 7       7 . . X . X . X . . 7
+ * 6 . . . . . . . . . 6       6 . . . . . . . . . 6
+ * 5 . . X . + . X . . 5       5 . . X . X . X . . 5
+ * 4 . . . . . . . . . 4       4 . . . . . . . . . 4
+ * 3 . . X . X . X . . 3       3 . . X . X . X . . 3
+ * 2 . . . . . . . . . 2       2 . . . . . . . . . 2
+ * 1 . . . . . . . . . 1       1 . . . . . . . . . 1
+ *   A B C D E F G H J           A B C D E F G H J  
+ *  
+ * For odd-sized boards larger than 9x9, the same pattern is followed,
+ * except that the edge stones are moved to the fourth line for 13x13
+ * boards and larger.
+ *
+ * For even-sized boards at least 8x8, only the four first diagrams
+ * are used, because there is no way to place the center stones
+ * symmetrically. As for odd-sized boards, the edge stones are moved
+ * to the fourth line for boards larger than 11x11.
+ *
+ * At most four stones are placed on 7x7 boards too (this size may or
+ * may not be supported by the rest of the engine). No handicap stones
+ * are ever placed on smaller boards.
+ *
+ * Notice that this function only deals with fixed handicap placement.
+ * Larger handicaps can be added by free placement if the used
+ * interface supports it.
+ */
+
+
+/* This table contains the (coded) positions of the stones.
+ *  2 maps to 2 or 3, depending on board size
+ *  0 maps to center
+ * -ve numbers map to  board_size - number
+ *
+ * The stones are placed in this order, *except* if there are
+ * 5 or 7 stones, in which case center ({0, 0}) is placed, and
+ * then as for 4 or 6.
+ */
+
+static const int places[][2] = {
+
+  {2, -2}, {-2, 2}, {2, 2}, {-2, -2}, /* first 4 are easy */
+                                      /* for 5, {0,0} is explicitly placed */
+  
+  {0, 2}, {0, -2},                    /* for 6 these two are placed */
+                                      /* for 7, {0,0} is explicitly placed */
+  
+  {2, 0}, {-2, 0},                    /* for 8, these two are placed */
+
+  {0, 0},                             /* finally tengen for 9 */
+};
+
+
+/*
+ * Sets up fixed handicap placement stones, returning the number of
+ * placed handicap stones and also setting the global variable
+ * handicap to the same value.
+ */
+
+int
+place_fixed_handicap(int desired_handicap)
+{
+  int r;
+  int max_handicap;
+  int remaining_stones;
+  int three = board_size > 11 ? 3 : 2;
+  int mid = board_size/2;
+
+  /* A handicap of 1 just means that B plays first, no komi.
+   * Black is not told where to play the first stone so no handicap
+   * is set. 
+   */
+  if (desired_handicap < 2) {
+    handicap = 0;
+    return 0;
+  }
+  
+  if ((board_size % 2 == 1) && (board_size >= 9))
+    max_handicap = 9;
+  else if (board_size >= 7)
+    max_handicap = 4;
+  else
+    max_handicap = 0;
+
+  /* It's up to the caller of this function to notice if the handicap
+   * was too large for fixed placement and act upon that.
+   */
+  if (desired_handicap > max_handicap)
+    handicap = max_handicap;
+  else
+    handicap = desired_handicap;
+
+  remaining_stones = handicap;
+  /* special cases: 5 and 7 */
+  if (desired_handicap == 5 || desired_handicap == 7) {
+    add_stone(POS(mid, mid), BLACK);
+    remaining_stones--;
+  }
+
+  for (r = 0; r < remaining_stones; r++) {
+    int i = places[r][0];
+    int j = places[r][1];
+
+    /* Translate the encoded values to board co-ordinates. */
+    if (i == 2)
+      i = three;       /* 2 or 3 */
+    else if (i == 0)
+      i = mid;
+    else if (i == -2)
+      i = board_size - 1 - three;
+    
+    if (j == 2)
+      j = three;
+    else if (j == 0)
+      j = mid;
+    else if (j == -2)
+      j = board_size - 1 - three;
+    
+    add_stone(POS(i, j), BLACK);
+  }
+
+  return handicap;
+}
+
+
+/* ================================================================ */
+/*       Set up free placement handicap stones for black side       */
+/* ================================================================ */
+
+
+/*
+ * Sets up free handicap placement stones, returning the number of
+ * placed handicap stones.
+ */
+
+static int remaining_handicap_stones = -1;
+static int total_handicap_stones = -1;
+
+static int find_free_handicap_pattern(void);
+static void free_handicap_callback(int anchor, int color,
+                                  struct pattern *pattern,
+                                  int ll, void *data);
+
+/*
+ * Sets up free placement handicap stones, returning the number of
+ * placed handicap stones and also setting the global variable
+ * handicap to the same value.
+ */
+int
+place_free_handicap(int desired_handicap)
+{
+  gg_assert(desired_handicap == 0 || desired_handicap >= 2);
+
+  if (desired_handicap == 0) {
+    handicap = 0;
+    return 0;
+  }
+
+  total_handicap_stones = desired_handicap;
+  remaining_handicap_stones = desired_handicap;
+
+  /* First place black stones in the four corners to enable the
+   * pattern matching scheme.
+   */
+  add_stone(POS(0, 0), BLACK);
+  add_stone(POS(0, board_size - 1), BLACK);
+  add_stone(POS(board_size - 1, 0), BLACK);
+  add_stone(POS(board_size - 1, board_size - 1), BLACK);
+
+  /* Find and place free handicap stones by pattern matching. */
+  while (remaining_handicap_stones > 0) {
+    if (!find_free_handicap_pattern())
+      break;
+  }
+
+  /* Remove the artificial corner stones. */
+  remove_stone(POS(0, 0));
+  remove_stone(POS(0, board_size - 1));
+  remove_stone(POS(board_size - 1, 0));
+  remove_stone(POS(board_size - 1, board_size - 1));
+
+  /* Find and place additional free handicap stones by the aftermath
+   * algorithm.
+   */
+  while (remaining_handicap_stones > 0) {
+    int move;
+    /* Call genmove_conservative() in order to prepare the engine for
+     * an aftermath_genmove() call. We discard the genmove result.
+     */
+    genmove_conservative(BLACK, NULL);
+    move = aftermath_genmove(BLACK, 0, NULL);
+    if (move != PASS_MOVE) {
+      add_stone(move, BLACK);
+      remaining_handicap_stones--;
+    }
+    else
+      break;
+  }
+
+  /* Set handicap to the number of actually placed stones. */
+  handicap = desired_handicap - remaining_handicap_stones;
+
+  /* Reset these to invalid values, so that improper use of handicap
+   * helper functions can be detected.
+   */
+  total_handicap_stones = -1;
+  remaining_handicap_stones = -1;
+  
+  return handicap;
+}
+
+struct handicap_match {
+  int value;
+  int anchor;
+  struct pattern *pattern;
+  int ll;
+};
+
+#define MAX_HANDICAP_MATCHES 40
+
+static struct handicap_match handicap_matches[MAX_HANDICAP_MATCHES];
+static int number_of_matches;
+
+static int
+find_free_handicap_pattern()
+{
+  int k;
+  int highest_value = -1;
+  int sum_values = 0;
+  int r;
+  int anchor;
+  struct pattern *pattern;
+  int ll;
+  int move;
+
+  number_of_matches = 0;
+  matchpat(free_handicap_callback, BLACK, &handipat_db, NULL, NULL);
+
+  if (number_of_matches == 0)
+    return 0;
+
+  /* Find the highest value among the matched patterns. */
+  for (k = 0; k < number_of_matches; k++)
+    if (highest_value < handicap_matches[k].value)
+      highest_value = handicap_matches[k].value;
+
+  /* Replace the values by 2^(value - highest_value + 10) and compute
+   * the sum of these values. Fractional values are discarded.
+   */
+  for (k = 0; k < number_of_matches; k++) {
+    if (handicap_matches[k].value < highest_value - 10)
+      handicap_matches[k].value = 0;
+    else
+      handicap_matches[k].value = 1 << (handicap_matches[k].value
+                                       - highest_value + 10);
+    sum_values += handicap_matches[k].value;
+  }
+
+  /* Pick a random number between 0 and sum_values. Don't bother with
+   * the fact that lower numbers will tend to be very slightly
+   * overrepresented.
+   */
+  r = gg_rand() % sum_values;
+  
+  /* Find the chosen pattern. */
+  for (k = 0; k < number_of_matches; k++) {
+    r -= handicap_matches[k].value;
+    if (r < 0)
+      break;
+  }
+
+  /* Place handicap stones according to pattern k. */
+  anchor = handicap_matches[k].anchor;
+  pattern = handicap_matches[k].pattern;
+  ll = handicap_matches[k].ll;
+  
+  /* Pick up the location of the move */
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+  add_stone(move, BLACK);
+  remaining_handicap_stones--;
+
+  /* Add stones at all '!' in the pattern. */
+  for (k = 0; k < pattern->patlen; k++) { 
+    if (pattern->patn[k].att == ATT_not) {
+      int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+      add_stone(pos, BLACK);
+      remaining_handicap_stones--;
+    }
+  }
+
+  return 1;
+}
+
+static void
+free_handicap_callback(int anchor, int color, struct pattern *pattern,
+                      int ll, void *data)
+{
+  int r = -1;
+  int k;
+  int number_of_stones = 1;
+
+  /* Pick up the location of the move */
+  int move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+
+  UNUSED(data);
+
+  /* Check how many stones are placed by the pattern. This must not be
+   * larger than the number of remaining handicap stones.
+   */
+  for (k = 0; k < pattern->patlen; k++) { 
+    if (pattern->patn[k].att == ATT_not)
+      number_of_stones++;
+  }
+  if (number_of_stones > remaining_handicap_stones)
+    return;
+
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT) {
+    if (!pattern->autohelper(ll, move, color, 0))
+      return;
+  }
+  
+  if (number_of_matches < MAX_HANDICAP_MATCHES) {
+    r = number_of_matches;
+    number_of_matches++;
+  }
+  else {
+    int least_value = handicap_matches[0].value + 1;
+    for (k = 0; k < number_of_matches; k++) {
+      if (handicap_matches[k].value < least_value) {
+       r = k;
+       least_value = handicap_matches[k].value;
+      }
+    }
+  }
+  gg_assert(r >= 0 && r < MAX_HANDICAP_MATCHES);
+  handicap_matches[r].value   = pattern->value;
+  handicap_matches[r].anchor  = anchor;
+  handicap_matches[r].pattern = pattern;
+  handicap_matches[r].ll      = ll;
+}
+
+int
+free_handicap_remaining_stones()
+{
+  gg_assert(remaining_handicap_stones >= 0);
+  return remaining_handicap_stones;
+}
+
+int
+free_handicap_total_stones()
+{
+  gg_assert(total_handicap_stones >= 0);
+  return total_handicap_stones;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/hash.c b/engine/hash.c
new file mode 100644 (file)
index 0000000..6ccf892
--- /dev/null
@@ -0,0 +1,257 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "board.h"
+#include "hash.h"
+#include "random.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+
+
+/*
+ * This file, together with engine/hash.h implements hashing of go positions
+ * using a method known as Zobrist hashing.  See the Texinfo documentation
+ * (Reading/Hashing) for more information.  
+ */
+
+
+/* ================================================================ */
+
+
+
+
+/* Random values for the board hash function. For stones and ko position. */
+static Hash_data white_hash[BOARDMAX];
+static Hash_data black_hash[BOARDMAX];
+static Hash_data ko_hash[BOARDMAX];
+static Hash_data komaster_hash[NUM_KOMASTER_STATES];
+static Hash_data kom_pos_hash[BOARDMAX];
+static Hash_data goal_hash[BOARDMAX];
+
+
+/* Get a random Hashvalue, where all bits are used. */
+static Hashvalue
+hash_rand(void)
+{
+  int i;
+  Hashvalue h = 0;
+
+  for (i = 0; 32*i < (int) (CHAR_BIT*sizeof(Hashvalue)); i++)
+    h |= (Hashvalue) gg_urand() << 32*i;
+
+  return h;
+}
+
+/* Fill an array with random numbers for Zobrist hashing. */
+void
+hash_init_zobrist_array(Hash_data *array, int size)
+{
+  int i, j;
+  for (i = 0; i < size; i++)
+    for (j = 0; j < NUM_HASHVALUES; j++)
+      array[i].hashval[j] = hash_rand();
+}
+
+/*
+ * Initialize the board hash system.
+ */
+
+void
+hash_init(void)
+{
+  static int is_initialized = 0;
+  if (is_initialized)
+    return;
+  
+  INIT_ZOBRIST_ARRAY(black_hash);
+  INIT_ZOBRIST_ARRAY(white_hash);
+  INIT_ZOBRIST_ARRAY(ko_hash);
+  INIT_ZOBRIST_ARRAY(komaster_hash);
+  INIT_ZOBRIST_ARRAY(kom_pos_hash);
+  INIT_ZOBRIST_ARRAY(goal_hash);
+
+  is_initialized = 1;
+}
+
+
+/* ---------------------------------------------------------------- */
+
+/* Calculate the hashvalue from scratch. */
+void 
+hashdata_recalc(Hash_data *hd, Intersection *p, int ko_pos)
+{
+  int pos;
+
+  hashdata_clear(hd);
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (p[pos] == WHITE)
+      hashdata_xor(*hd, white_hash[pos]);
+    else if (p[pos] == BLACK)
+      hashdata_xor(*hd, black_hash[pos]);
+  }
+
+  if (ko_pos != 0)
+    hashdata_xor(*hd, ko_hash[ko_pos]);
+}
+
+/* Clear hashdata. */
+void
+hashdata_clear(Hash_data *hd)
+{
+  int i;
+  for (i = 0; i < NUM_HASHVALUES; i++)
+    hd->hashval[i] = 0;
+}
+
+/* Set or remove ko in the hash value and hash position.  */
+void
+hashdata_invert_ko(Hash_data *hd, int pos)
+{
+  hashdata_xor(*hd, ko_hash[pos]);
+}
+
+
+/* Set or remove a stone of COLOR at pos in a Hash_data.  */
+void
+hashdata_invert_stone(Hash_data *hd, int pos, int color)
+{
+  if (color == BLACK)
+    hashdata_xor(*hd, black_hash[pos]);
+  else if (color == WHITE)
+    hashdata_xor(*hd, white_hash[pos]);
+}
+
+
+/* Set or remove the komaster value in the hash data. */
+void
+hashdata_invert_komaster(Hash_data *hd, int komaster)
+{
+  hashdata_xor(*hd, komaster_hash[komaster]);
+}
+
+/* Set or remove the komaster position in the hash data. */
+void
+hashdata_invert_kom_pos(Hash_data *hd, int kom_pos)
+{
+  hashdata_xor(*hd, kom_pos_hash[kom_pos]);
+}
+
+/* Calculate a transformation invariant hashvalue. */
+void 
+hashdata_calc_orientation_invariant(Hash_data *hd, Intersection *p, int ko_pos)
+{
+  int pos;
+  int rot;
+  Hash_data hd_rot;
+
+  for (rot = 0; rot < 8; rot++) {
+    hashdata_clear(&hd_rot);
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (p[pos] == WHITE)
+       hashdata_xor(hd_rot, white_hash[rotate1(pos, rot)]);
+      else if (p[pos] == BLACK)
+       hashdata_xor(hd_rot, black_hash[rotate1(pos, rot)]);
+    }
+    
+    if (ko_pos != NO_MOVE)
+      hashdata_xor(hd_rot, ko_hash[rotate1(ko_pos, rot)]);
+
+    if (rot == 0 || hashdata_is_smaller(hd_rot, *hd))
+      *hd = hd_rot;
+  }
+}
+
+/* Compute hash value to identify the goal area. */
+Hash_data
+goal_to_hashvalue(const signed char *goal)
+{
+  int pos;
+  Hash_data return_value;
+  
+  hashdata_clear(&return_value);
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && goal[pos])
+      hashdata_xor(return_value, goal_hash[pos]);
+  
+  return return_value;
+}
+
+
+#define HASHVALUE_NUM_DIGITS (1 + (CHAR_BIT * SIZEOF_HASHVALUE - 1) / 4)
+#define BUFFER_SIZE (1 + NUM_HASHVALUES * HASHVALUE_NUM_DIGITS)
+char *
+hashdata_to_string(Hash_data *hashdata)
+{
+  static char buffer[BUFFER_SIZE];
+  int n = 0;
+  int k;
+
+  /* Loop backwards for consistency between 32 and 64 bit platforms. */
+  for (k = NUM_HASHVALUES - 1; k >= 0; k--) {
+    n += sprintf(buffer + n, HASHVALUE_PRINT_FORMAT,
+                HASHVALUE_NUM_DIGITS, hashdata->hashval[k]);
+    gg_assert(n < BUFFER_SIZE);
+  }
+
+  return buffer;
+}
+
+#if NUM_HASHVALUES > 2
+int
+hashdata_is_equal_func(Hash_data *hd1, Hash_data *hd2)
+{
+  int i;
+  for (i = 0; i < NUM_HASHVALUES; i++)
+    if (hd1->hashval[i] != hd2->hashval[i])
+      return 0;
+
+  return 1;
+}
+
+int
+hashdata_is_smaller_func(Hash_data *hd1, Hash_data *hd2)
+{
+  int i;
+  for (i = 0; i < NUM_HASHVALUES; i++)
+    if (hd1->hashval[i] < hd2->hashval[i])
+      return 1;
+    else if (hd1->hashval[i] > hd2->hashval[i])
+      return 0;
+
+  return 0;
+}
+#endif
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/hash.h b/engine/hash.h
new file mode 100644 (file)
index 0000000..02ff7bc
--- /dev/null
@@ -0,0 +1,171 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _HASH_H_
+#define _HASH_H_
+
+#include "config.h"
+#include <limits.h>
+
+/*
+ * This file, together with engine/hash.c implements hashing of go positions
+ * using a method known as Zobrist hashing.  See the Texinfo documentation
+ * (Reading/Hashing) for more information.  
+ */
+
+/* Hash values and the compact board representation should use the
+ * longest integer type that the platform can handle efficiently.
+ * Typically this would be a 32 bit integer on a 32 bit platform and a
+ * 64 bit integer on a 64 bit platform.
+ *
+ * Our current assumption is that unsigned long has this
+ * characteristic. Should it turn out to be false for some platform
+ * we'll add conditional code to choose some other type.
+ *
+ * At the few places in the code where the actual size of these types
+ * matter, the code should use sizeof(type) to test for this. Notice
+ * that ISO C guarantees a long to be at least 32 bits.
+ *
+ * On (future) platforms with word length 128 bits or more, it might
+ * be a waste to use more than 64 bit hashvalues, since the decreased
+ * risk for hash collisions probably isn't worth the increased storage
+ * cost.
+ */
+typedef unsigned long Hashvalue;
+#define SIZEOF_HASHVALUE SIZEOF_LONG
+#define HASHVALUE_PRINT_FORMAT "%0*lx"
+
+/* for testing: Enables a lot of checks. */
+#define CHECK_HASHING 0
+
+/* Dump (almost) all read results. */
+#define TRACE_READ_RESULTS 0
+
+/* How many bits should be used at least for hashing? Set this to 32 for
+ * some memory save and speedup, at the cost of occasional irreproducable
+ * mistakes (and possibly assertion failures). 
+ * With 64 bits, there should be less than one such mistake in 10^9 games.
+ * Set this to 96 if this is not safe enough for you.
+ */
+#define MIN_HASHBITS   64
+
+#define NUM_HASHVALUES (1 + (MIN_HASHBITS - 1) / (CHAR_BIT * SIZEOF_HASHVALUE))
+
+/* This struct is maintained by the machinery that updates the board
+ * to provide incremental hashing. Examples: trymove(), play_move(), ...
+ */
+
+typedef struct {
+  Hashvalue hashval[NUM_HASHVALUES];
+} Hash_data;
+
+extern Hash_data board_hash;
+
+Hash_data goal_to_hashvalue(const signed char *goal);
+
+void hash_init_zobrist_array(Hash_data *array, int size);
+void hash_init(void);
+#define INIT_ZOBRIST_ARRAY(a) \
+  hash_init_zobrist_array(a, (int) (sizeof(a) / sizeof(a[0])))
+
+void hashdata_clear(Hash_data *hd);
+void hashdata_recalc(Hash_data *hd, Intersection *board, int ko_pos);
+void hashdata_invert_ko(Hash_data *hd, int pos);
+void hashdata_invert_stone(Hash_data *hd, int pos, int color);
+void hashdata_invert_komaster(Hash_data *hd, int komaster);
+void hashdata_invert_kom_pos(Hash_data *hd, int kom_pos);
+void hashdata_calc_orientation_invariant(Hash_data *hd, Intersection *board,
+                                        int ko_pos);
+
+char *hashdata_to_string(Hash_data *hashdata);
+
+
+
+/* ---------------------------------------------------------------- */
+
+/* There is no need to involve all bits in the remainder computation
+ * as long as we only use it to compute a key into a hash table. 32
+ * random bits are sufficient to get an even distribution within any
+ * hashtable of reasonable size. By never using more than 32 bits we
+ * also reduce the platform dependency of the GNU Go engine.
+*/
+#define hashdata_remainder(hd, num) \
+  (((hd).hashval[0] & 0xffffffffU) % (num))
+
+#if NUM_HASHVALUES == 1
+
+#define hashdata_is_equal(hd1, hd2) \
+   ((hd1).hashval[0] == (hd2).hashval[0])
+
+#define hashdata_is_smaller(hd1, hd2) \
+   ((hd1).hashval[0] < (hd2).hashval[0])
+
+#define hashdata_xor(hd1, hd2) \
+    (hd1).hashval[0] ^= (hd2).hashval[0]
+
+#elif NUM_HASHVALUES == 2
+
+#define hashdata_is_equal(hd1, hd2) \
+   ((hd1).hashval[0] == (hd2).hashval[0] \
+    && (hd1).hashval[1] == (hd2).hashval[1])
+
+#define hashdata_is_smaller(hd1, hd2) \
+   ((hd1).hashval[0] < (hd2).hashval[0] \
+    || ((hd1).hashval[0] == (hd2).hashval[0] \
+       && (hd1).hashval[1] < (hd2).hashval[1]))
+
+#define hashdata_xor(hd1, hd2) \
+   do { \
+    (hd1).hashval[0] ^= (hd2).hashval[0]; \
+    (hd1).hashval[1] ^= (hd2).hashval[1]; \
+   } while (0)
+
+#else
+
+int hashdata_is_equal_func(Hash_data *hd1, Hash_data *hd2);
+int hashdata_is_smaller_func(Hash_data *hd1, Hash_data *hd2);
+
+#define hashdata_is_equal(hd1, hd2) \
+  hashdata_is_equal_func(&(hd1), &(hd2))
+
+#define hashdata_is_smaller(hd1, hd2) \
+  hashdata_is_smaller_func(&(hd1), &(hd2))
+
+#define hashdata_xor(hd1, hd2) \
+   do { \
+    int i; \
+    for (i = 0; i < NUM_HASHVALUES; i++) \
+      (hd1).hashval[i] ^= (hd2).hashval[i]; \
+   } while (0)
+
+#endif
+
+#endif
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/influence.c b/engine/influence.c
new file mode 100644 (file)
index 0000000..9dcdc85
--- /dev/null
@@ -0,0 +1,2122 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "influence.h"
+#include "patterns.h"
+#include "gg_utils.h"
+
+static void add_influence_source(int pos, int color, float strength,
+                                 float attenuation,
+                                 struct influence_data *q);
+static void print_influence(const struct influence_data *q,
+                           const char *info_string);
+static void print_numeric_influence(const struct influence_data *q,
+                                   const float values[BOARDMAX],
+                                   const char *format, int width,
+                                   int draw_stones, int mark_epsilon);
+static void print_influence_areas(const struct influence_data *q);
+static void value_territory(struct influence_data *q);
+static void enter_intrusion_source(int source_pos, int strength_pos,
+                                   float strength, float attenuation,
+                                   struct influence_data *q);
+static void add_marked_intrusions(struct influence_data *q);
+
+/* Influence computed for the initial position, i.e. before making
+ * some move.
+ */
+struct influence_data initial_black_influence;
+struct influence_data initial_white_influence;
+
+/* Influence computed after some move has been made. */
+struct influence_data move_influence;
+struct influence_data followup_influence;
+
+/* Influence used for estimation of escape potential. */
+static struct influence_data escape_influence;
+
+/* Pointer to influence data used during pattern matching. */
+static struct influence_data *current_influence = NULL;
+
+
+/* Thresholds values used in the whose_moyo() functions */
+static struct moyo_determination_data moyo_data;
+static struct moyo_determination_data moyo_restricted_data;
+/* Thresholds value used in the whose_territory() function */
+static float territory_determination_value; 
+
+
+/* This curve determines how much influence is needed at least to claim
+ * an intersection as territory, in dependence of the "center value".
+ * (In the center, more effort is needed to get territory!)
+ * The center value is at the moment defined as follows:
+ * If d1, d2 are the distance to vertical and horizontal border, resp.,
+ * with d1<d2, then
+ * central = 3 * d1 + min(d2, 4)
+ * So this is mainly a function of the distance to the border; the
+ * distance to the second-nearest border gives a small correction of at
+ * most 4. This distinguishes edge and corner positions.
+ *
+ * The values for intersections close to a corner or to the edge have
+ * to be consistent such that standard corner enclosure etc. are
+ * sufficient to claim territory. The center values are more arbitrary
+ * suspect to tuning.
+ */
+
+static struct interpolation_data min_infl_for_territory =
+  { 6,  0.0, 24.0, { 6.0, 15.0, 26.0, 36.0, 45.0, 50.0, 55.0 }};
+
+/* Determines the territory correction factor in dependence of the ratio
+ * ( influence of stronger color / min_infl_for_territory(intersection))
+ */
+static struct interpolation_data territory_correction = 
+  { 5, (float) 0.0, 1.0, {0.0, 0.25, 0.45, 0.65, 0.85, 1.0}};
+
+
+
+
+
+/* If set, print influence map when computing this move. Purely for
+ * debugging.
+ */
+static int debug_influence = NO_MOVE;
+
+/* Assigns an id to all influence computations for reference in the
+ * delta territory cache.
+ */
+static int influence_id = 0;
+
+/* This is the core of the influence function. Given the coordinates
+ * and color of an influence source, it radiates the influence
+ * outwards until it hits a barrier or the strength of the influence
+ * falls under a certain threshold.
+ *
+ * The radiation is performed by a breadth first propagation,
+ * implemented by means of an internal queue.
+ *
+ * Since this function has turned out be one of the bottlenecks, loop
+ * unrolling makes a noticeable performance difference. It does,
+ * however, make the code much harder to read and maintain. Therefore
+ * we include both the original and the unrolled versions.
+ */
+
+#define EXPLICIT_LOOP_UNROLLING 1
+
+#if EXPLICIT_LOOP_UNROLLING
+/* In addition to the parameters, this macro expects
+ *  m,n = original source of influence
+ *  ii = point influence is being spread from
+ *  delta_i = I(ii) - m
+ *  delta_j = J(ii) - n
+ *  current_strength combines strength and damping factor
+ *  b is 1/(square of distance from m,n to i,j) ; or halved
+ *    for diagonals
+ * 
+ *  arg is i + arg_di ; arg_j is j + arg_dj
+ *  arg_d is 1 for diagonal movement
+ *
+ */
+
+
+#define code1(arg_di, arg_dj, arg, arg_d) do { \
+      if (!q->safe[arg] \
+         && ((arg_di)*(delta_i) + (arg_dj)*(delta_j) > 0 \
+             || queue_start == 1)) { \
+       float contribution; \
+       float permeability = permeability_array[ii]; \
+       if (arg_d) { \
+         permeability *= gg_max(permeability_array[ii + DELTA(arg_di, 0)], \
+                                permeability_array[ii + DELTA(0, arg_dj)]); \
+         if (permeability == 0.0) \
+           continue; \
+       } \
+       contribution = current_strength * permeability; \
+       if (queue_start != 1) { \
+         int a = (arg_di)*(delta_i) + (arg_dj)*(delta_j); \
+         contribution *= (a*a) * b; /* contribution *= cos(phi) */ \
+       } \
+       if (contribution <= INFLUENCE_CUTOFF) \
+         continue; \
+       if (working[arg] == 0.0) { \
+         q->queue[queue_end] = (arg); \
+         queue_end++; \
+       } \
+       working[arg] += contribution; \
+      } } while (0) 
+#endif
+
+
+static void
+accumulate_influence(struct influence_data *q, int pos, int color)
+{
+  int ii;
+  int m = I(pos);
+  int n = J(pos);
+  int k;
+#if !EXPLICIT_LOOP_UNROLLING
+  int d;
+#endif
+  float b;
+  float inv_attenuation;
+  float inv_diagonal_damping;
+  float *permeability_array;
+
+  /* Clear the queue. Entry 0 is implicitly (m, n). */
+  int queue_start = 0;
+  int queue_end = 1;
+
+  static float working[BOARDMAX];
+  static int working_area_initialized = 0;
+
+  if (!working_area_initialized) {
+    for (ii = 0; ii < BOARDMAX; ii++)
+      working[ii] = 0.0;
+    working_area_initialized = 1;
+  }
+
+  if (0)
+    gprintf("Accumulating influence for %s at %m\n",
+           color_to_string(color), m, n);
+
+  /* Attenuation only depends on the influence origin. */
+  if (color == WHITE)
+    inv_attenuation = 1.0 / q->white_attenuation[pos];
+  else
+    inv_attenuation = 1.0 / q->black_attenuation[pos];
+
+  if (q->is_territorial_influence)
+    inv_diagonal_damping = 1.0 / TERR_DIAGONAL_DAMPING;
+  else
+    inv_diagonal_damping = 1.0 / DIAGONAL_DAMPING;
+
+  if (color == WHITE)
+    permeability_array = q->white_permeability;
+  else
+    permeability_array = q->black_permeability;
+
+  /* We put the original source into slot 0.  */
+  q->queue[0] = pos;
+    
+  if (color == WHITE)
+    working[pos] = q->white_strength[pos];
+  else
+    working[pos] = q->black_strength[pos];
+
+
+  /* Spread influence until the stack is empty. */
+  while (queue_start < queue_end) {
+    float current_strength;
+    int delta_i, delta_j;
+
+    ii = q->queue[queue_start];
+    delta_i = I(ii) - m;
+    delta_j = J(ii) - n;
+    queue_start++;
+    if (permeability_array[ii] == 0.0)
+      continue;
+    if (0)
+      gprintf("Picked %1m from queue. w=%f start=%d end=%d\n",
+             ii, working[ii], queue_start, queue_end);
+    if (queue_start == 1)
+      b = 1.0;
+    else
+      b = 1.0 / ((delta_i)*(delta_i) + (delta_j)*(delta_j));
+
+    current_strength = working[ii] * inv_attenuation;
+
+#if !EXPLICIT_LOOP_UNROLLING
+    /* Try to spread influence in each of the eight directions. */    
+    for (d = 0; d < 8; d++) {
+      int di = deltai[d];
+      int dj = deltaj[d];
+      int d_ii = delta[d];
+
+      /* Verify that (ii + d_ii) is
+       * 1. Inside the board.
+       * 2. Not occupied.
+       * 3. Directed outwards. For the origin all directions are outwards.
+       */
+      if (ON_BOARD(ii + d_ii)
+         && (!q->safe[ii + d_ii])
+         && (di*(delta_i) + dj*(delta_j) > 0
+             || queue_start == 1)) {
+
+       float contribution;
+       float permeability = permeability_array[ii];
+       float dfactor;
+       float inv_damping;
+
+       /* Now compute the damping of the influence.
+        * First we have the permeability at the point we are
+        * spreading from. For diagonal movement we also take the
+        * permeability of the vertices we are "passing by" into
+        * account.
+        */
+       if (d > 3) { /* diagonal movement */
+         permeability *= gg_max(permeability_array[ii + DELTA(di, 0)],
+                                permeability_array[ii + DELTA(0, dj)]);
+         inv_damping = inv_diagonal_damping;
+         dfactor = 0.5;
+       }
+       else {
+         inv_damping = 1.0;
+         dfactor = 1.0;
+       }
+
+       if (permeability == 0.0)
+         continue;
+
+       contribution = permeability * current_strength * inv_damping;
+
+       /* Finally direction dependent damping. */
+       if (ii != pos) {
+         int a = di*(delta_i) + dj*(delta_j);
+         gg_assert(a > 0);
+         contribution *= (a*a) * b * dfactor;
+       }
+
+       /* Stop spreading influence if the contribution becomes too low. */
+       if (contribution <= INFLUENCE_CUTOFF)
+         continue;
+       
+       /* If no influence here before, add the point to the queue for
+        * further spreading.
+        */
+       if (0)
+         gprintf("  Spreading %s influence from %1m to %1m, d=%d\n",
+                 color_to_string(color), ii, ii + d_ii, d);
+       if (working[ii + d_ii] == 0.0) {
+         q->queue[queue_end] = ii + d_ii;
+         queue_end++;
+       }
+       working[ii + d_ii] += contribution;
+      }
+    }
+#else
+    if (ON_BOARD(ii + delta[0]))
+      code1(deltai[0], deltaj[0], ii + delta[0], 0);
+    if (ON_BOARD(ii + delta[1]))
+      code1(deltai[1], deltaj[1], ii + delta[1], 0);
+    if (ON_BOARD(ii + delta[2]))
+      code1(deltai[2], deltaj[2], ii + delta[2], 0);
+    if (ON_BOARD(ii + delta[3]))
+      code1(deltai[3], deltaj[3], ii + delta[3], 0);
+
+    /* Update factors for diagonal movement. */
+    b *= 0.5;
+    current_strength *= inv_diagonal_damping;
+
+    if (ON_BOARD(ii + delta[4]))
+      code1(deltai[4], deltaj[4], ii + delta[4], 1);
+    if (ON_BOARD(ii + delta[5]))
+      code1(deltai[5], deltaj[5], ii + delta[5], 1);
+    if (ON_BOARD(ii + delta[6]))
+      code1(deltai[6], deltaj[6], ii + delta[6], 1);
+    if (ON_BOARD(ii + delta[7]))
+      code1(deltai[7], deltaj[7], ii + delta[7], 1);
+#endif
+  }
+  
+  /* Add the values in the working area to the accumulated influence
+   * and simultaneously reset the working area. We know that all
+   * influenced points were stored in the queue, so we just traverse
+   * it.
+   */
+  for (k = 0; k < queue_end; k++) {
+    ii = q->queue[k];
+
+    if (color == WHITE) {
+      if (working[ii] > 1.01 * INFLUENCE_CUTOFF
+         || q->white_influence[ii] == 0.0)
+       q->white_influence[ii] += working[ii];
+    }
+    else {
+      if (working[ii] > 1.01 * INFLUENCE_CUTOFF
+         || q->black_influence[ii] == 0.0)
+       q->black_influence[ii] += working[ii];
+    }
+    
+    working[ii] = 0.0;
+  }
+}
+
+
+
+/* Initialize the influence_data structure.  */
+
+static void
+init_influence(struct influence_data *q,
+              const signed char safe_stones[BOARDMAX], 
+              const float strength[BOARDMAX])
+{
+  int ii;
+  float attenuation;
+  
+  /* Initialisation of some global positional values, based on 
+   * game stage. 
+   */
+  if (cosmic_gnugo) {
+    float t;
+    if ((board_size != 19) || (movenum <= 2) || ((movenum / 2) % 2))
+      cosmic_importance = 0.0;
+    else {
+      cosmic_importance = 1.0 - (movenum / 150.0)*(movenum / 150.0); 
+      cosmic_importance = gg_max(0.0, cosmic_importance);
+    }
+
+    t = cosmic_importance;
+    
+    moyo_data.influence_balance     = t * 15.0  +  (1.0-t) * 5.0;  
+    moyo_data.my_influence_minimum  = t * 5.0   +  (1.0-t) * 5.0;
+    moyo_data.opp_influence_maximum = t * 30.0  +  (1.0-t) * 30.0;
+    
+    /* we use the same values for moyo and moyo_restricted */
+    moyo_restricted_data = moyo_data;
+
+    territory_determination_value   = t * 0.95 +  (1.0-t) * 0.95; 
+      
+    min_infl_for_territory.values[0] = t * 6.0   +  (1.0-t) * 10.0;
+    min_infl_for_territory.values[1] = t * 10.0  +  (1.0-t) * 15.0;
+    min_infl_for_territory.values[2] = t * 20.0  +  (1.0-t) * 15.0;
+    min_infl_for_territory.values[3] = t * 20.0  +  (1.0-t) * 20.0;
+    min_infl_for_territory.values[4] = t * 20.0  +  (1.0-t) * 20.0;
+    min_infl_for_territory.values[5] = t * 15.0  +  (1.0-t) * 15.0;
+    min_infl_for_territory.values[6] = t * 10.0  +  (1.0-t) * 15.0;   
+  }
+  else {  
+    /* non-cosmic values */
+    cosmic_importance = 0.0;
+  
+    moyo_data.influence_balance     = 7.0;
+    moyo_data.my_influence_minimum  = 5.0;
+    moyo_data.opp_influence_maximum = 10.0;
+    
+    moyo_restricted_data.influence_balance     = 10.0;
+    moyo_restricted_data.my_influence_minimum  = 10.0;
+    moyo_restricted_data.opp_influence_maximum = 10.0;
+    
+    territory_determination_value = 0.95;
+    
+    min_infl_for_territory.values[0] = 6.0;
+    min_infl_for_territory.values[1] = 15.0;
+    min_infl_for_territory.values[2] = 26.0;
+    min_infl_for_territory.values[3] = 36.0;
+    min_infl_for_territory.values[4] = 45.0;
+    min_infl_for_territory.values[5] = 50.0;
+    min_infl_for_territory.values[6] = 55.0; 
+  }
+  
+  if (q->is_territorial_influence)
+    attenuation = TERR_DEFAULT_ATTENUATION;
+  else
+    attenuation = 2 * DEFAULT_ATTENUATION;
+  
+  q->intrusion_counter = 0;
+
+  /* Remember this for later. */
+  memcpy(q->safe, safe_stones, BOARDMAX * sizeof(*safe_stones));
+  q->captured = black_captured - white_captured;
+  
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      /* Initialize. */
+      q->white_influence[ii] = 0.0;
+      q->black_influence[ii] = 0.0;
+      q->white_attenuation[ii] = attenuation;
+      q->black_attenuation[ii] = attenuation;
+      q->white_permeability[ii] = 1.0;
+      q->black_permeability[ii] = 1.0;
+      q->white_strength[ii] = 0.0;
+      q->black_strength[ii] = 0.0;
+      q->non_territory[ii] = EMPTY;
+
+      if (IS_STONE(board[ii])) {
+       if (!safe_stones[ii]) {
+         if (board[ii] == WHITE)
+           q->white_permeability[ii] = 0.0;
+         else
+           q->black_permeability[ii] = 0.0;
+       }
+       else {
+         if (board[ii] == WHITE) {
+           if (strength)
+             q->white_strength[ii] = strength[ii];
+           else
+             q->white_strength[ii] = DEFAULT_STRENGTH;
+           q->black_permeability[ii] = 0.0;
+         }
+         else {
+           if (strength)
+             q->black_strength[ii] = strength[ii];
+           else
+             q->black_strength[ii] = DEFAULT_STRENGTH;
+           q->white_permeability[ii] = 0.0;
+         }
+       }
+      }
+      else
+       /* Ideally, safe_stones[] should always be zero for empty
+        * intersections. This is currently, however, sometimes not true
+        * when an inessential worm gets captured. So we revise this
+        * in our private copy here.
+        */
+       q->safe[ii] = 0;
+    }
+}
+
+
+/* Adds an influence source at position pos with prescribed strength
+ * and attenuation. color can be BLACK, WHITE or both. If there
+ * already exists an influence source of the respective color at pos
+ * that is stronger than the new one, we do nothing.
+ */
+static void
+add_influence_source(int pos, int color, float strength, float attenuation,
+                     struct influence_data *q)
+{
+  if ((color & WHITE) && (q->white_strength[pos] < strength)) {
+    q->white_strength[pos] = strength;
+    q->white_attenuation[pos] = attenuation;
+  }
+  
+  if ((color & BLACK) && (q->black_strength[pos] < strength)) {
+    q->black_strength[pos] = strength;
+    q->black_attenuation[pos] = attenuation;
+  }
+}
+
+/* Adds an intrusion as an entry in the list q->intrusions.  */
+static void
+enter_intrusion_source(int source_pos, int strength_pos,
+                       float strength, float attenuation,
+                       struct influence_data *q)
+{
+  if (q->intrusion_counter >= MAX_INTRUSIONS) {
+    DEBUG(DEBUG_INFLUENCE, "intrusion list exhausted\n");
+    return;
+  }
+  q->intrusions[q->intrusion_counter].source_pos = source_pos;
+  q->intrusions[q->intrusion_counter].strength_pos = strength_pos;
+  q->intrusions[q->intrusion_counter].strength = strength;
+  q->intrusions[q->intrusion_counter].attenuation = attenuation;
+  q->intrusion_counter++;
+}
+
+/* Comparison of intrusions datas, to sort them. */
+static int
+compare_intrusions(const void *p1, const void *p2)
+{
+  const struct intrusion_data *intr1 = p1;
+  const struct intrusion_data *intr2 = p2;
+  if (intr1->source_pos - intr2->source_pos != 0)
+    return (intr1->source_pos - intr2->source_pos);
+  else if (intr1->strength_pos - intr2->strength_pos != 0)
+    return (intr1->strength_pos - intr2->strength_pos);
+  else if (intr1->strength > intr2->strength)
+    return 1;
+  else
+    return -1;
+}
+
+/* It may happen that we have a low intensity influence source at a
+ * blocked intersection (due to an intrusion). This function resets the
+ * permeabilities.
+ */
+static void
+reset_unblocked_blocks(struct influence_data *q)
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      if (!q->safe[pos] && q->white_strength[pos] > 0.0
+         && q->white_permeability[pos] != 1.0) {
+       DEBUG(DEBUG_INFLUENCE, "  black block removed from %1m\n", pos);
+       q->white_permeability[pos] = 1.0;
+      }
+      if (!q->safe[pos] && q->black_strength[pos] > 0.0
+         && q->black_permeability[pos] != 1.0) {
+       DEBUG(DEBUG_INFLUENCE, "  white block removed from %1m\n", pos);
+       q->black_permeability[pos] = 1.0;
+      }
+    }
+}
+
+
+/* This function goes through the list of intrusion sources, and adds
+ * the intrusion as influence sources for color. The strength is
+ * corrected so that each stone's intrusions sources can have total
+ * strength of at most 60%/100% of the strength of the stone.
+ * (100% is if q == &followup_influence, 60% otherwise).
+ */
+static void
+add_marked_intrusions(struct influence_data *q)
+{
+  int i;
+  int j = 0;
+  int source_pos;
+  float strength_sum;
+  float correction;
+  float source_strength;
+  float allowed_strength;
+  int color = q->color_to_move;
+
+  gg_sort(q->intrusions, q->intrusion_counter, sizeof(q->intrusions[0]),
+          compare_intrusions);
+
+  /* Go through all intrusion sources. */
+  for (i = 0; i < q->intrusion_counter; i = j) {
+    strength_sum = 0.0;
+    source_pos = q->intrusions[i].source_pos;
+    /* "Anonymous" intrusios go in uncorrected. */
+    if (source_pos == NO_MOVE) {
+      add_influence_source(q->intrusions[i].strength_pos, color,
+                           q->intrusions[j].strength,
+                           q->intrusions[j].attenuation, q);
+      DEBUG(DEBUG_INFLUENCE, "Adding %s intrusion at %1m, value %f\n",
+           (color == BLACK) ? "black" : "white",
+           q->intrusions[j].strength_pos, q->intrusions[j].strength);
+      j = i+1;
+      continue;
+    }
+    if (color == BLACK)
+      source_strength = q->black_strength[source_pos];
+    else
+      source_strength = q->white_strength[source_pos];
+
+    /* First loop: Determine correction factor. */
+    for (j = i; (j < q->intrusion_counter)
+                 && (q->intrusions[j].source_pos == source_pos); j++) {
+      /* Of identical strength positions, only take strongest value. */
+      if (j == i
+          || q->intrusions[j].strength_pos != q->intrusions[j-1].strength_pos)
+        strength_sum += q->intrusions[j].strength;
+    }
+    if (q == &followup_influence)
+      allowed_strength = source_strength;
+    else
+      allowed_strength = 0.6 * source_strength;
+    if (strength_sum > allowed_strength)
+      correction = (allowed_strength / strength_sum);
+    else
+      correction = 1.0;
+
+    /* Second loop: Add influence sources. */
+    for (j = i; (j < q->intrusion_counter)
+                 && (q->intrusions[j].source_pos == source_pos); j++) {
+      /* Of identical strenght positions, only take strongest value. */
+      if (j == i || q->intrusions[j].strength_pos
+                    != q->intrusions[j-1].strength_pos) {
+        add_influence_source(q->intrusions[j].strength_pos, color,
+                             correction * q->intrusions[j].strength,
+                             q->intrusions[j].attenuation, q);
+        DEBUG(DEBUG_INFLUENCE,
+              "Adding %s intrusion for %1m at %1m, value %f (correction %f)\n",
+              (color == BLACK) ? "black" : "white", source_pos,
+              q->intrusions[j].strength_pos,
+              correction * q->intrusions[j].strength, correction);
+      }
+    }
+  }
+}
+
+/* Callback for the matched patterns in influence.db and barriers.db.
+ * The pattern classes used here are:
+ * A - Barrier pattern, where O plays first and X tries to block influence.
+ * D - Barrier pattern, where O plays first and O tries to block influence.
+ * B - Intrusion patterns, adding a low intensity influence source.
+ * E - Enhance patterns, FIXME: document this one!
+ * t - Non-territory patterns, marking vertices as not territory.
+ * I - Invasion patterns, adding a low intensity influence source. 
+ * e - Escape bonus. Used together with I to increase the value substantially
+ *     if escape influence is being computed.
+ *
+ * Classes A, D, and B are matched with color as O, and it is assumed
+ * that O is in turn to move. Classes E and I are matched with either
+ * color as O.
+ */
+static void
+influence_callback(int anchor, int color, struct pattern *pattern, int ll,
+                  void *data)
+{
+  int pos = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+  int k;
+  struct influence_data *q = data;
+  
+  /* We also ignore enhancement patterns in territorial influence. */
+  if ((pattern->class & CLASS_E) && q->is_territorial_influence)
+    return;
+
+  /* Don't use invasion (I) patterns when scoring. */
+  if (doing_scoring && (pattern->class & CLASS_I))
+    return;
+  
+  /* Loop through pattern elements to see if an A or D pattern
+   * can possibly have any effect. If not we can skip evaluating
+   * constraint and/or helper.
+   */
+  if (pattern->class & (CLASS_A | CLASS_D)) {
+    int something_to_do = 0;
+    gg_assert(q->is_territorial_influence);
+    for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+      int blocking_color;
+      int ii;
+      /* The order of elements is: All commas, all "!", then other. */
+      if (pattern->patn[k].att != ATT_comma
+         && pattern->patn[k].att != ATT_not)
+       break;  
+
+      ii = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+      if (pattern->class & CLASS_D)
+       blocking_color = color;
+      else
+       blocking_color = OTHER_COLOR(color);
+      if ((blocking_color == WHITE
+          && q->black_permeability[ii] != 0.0)
+         || (blocking_color == BLACK
+             && q->white_permeability[ii] != 0.0)) {
+       something_to_do = 1;
+       break;
+      }
+    }
+    if (!something_to_do)
+      return;
+  }
+
+  /* Require that all O stones in the pattern have non-zero influence
+   * strength for patterns of type D, E, B, t, and all X stones have
+   * non-zero strength for patterns of type A and t.
+   *
+   * Patterns also having class s are an exception from this rule.
+   */
+  if ((pattern->class & (CLASS_D | CLASS_A | CLASS_B | CLASS_E | CLASS_t))
+      && !(pattern->class & CLASS_s)) {
+    for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+      int ii = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+      if (pattern->patn[k].att == ATT_O) {
+       if ((pattern->class & (CLASS_B | CLASS_t | CLASS_E | CLASS_D))
+           && ((color == WHITE && q->white_strength[ii] == 0.0)
+               || (color == BLACK && q->black_strength[ii] == 0.0)))
+         return;
+      }
+      else if (pattern->patn[k].att == ATT_X) {
+       if ((pattern->class & (CLASS_A | CLASS_t))
+           && ((color == BLACK && q->white_strength[ii] == 0.0)
+               || (color == WHITE && q->black_strength[ii] == 0.0)))
+         return; /* Match failed. */
+      }
+    }
+  }
+
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if ((pattern->autohelper_flag & HAVE_CONSTRAINT)
+      && !pattern->autohelper(ll, pos, color, 0))
+    return;
+
+  DEBUG(DEBUG_INFLUENCE, "influence pattern '%s'+%d matched at %1m\n",
+       pattern->name, ll, anchor);
+
+  /* For t patterns, everything happens in the action. */
+  if ((pattern->class & CLASS_t)
+      && (pattern->autohelper_flag & HAVE_ACTION)) {
+    pattern->autohelper(ll, pos, color, INFLUENCE_CALLBACK);
+    return;
+  }
+  
+  /* For I patterns, add a low intensity, both colored, influence
+   * source at *.
+   */
+  if (pattern->class & CLASS_I) {
+    int this_color = EMPTY;
+    float strength;
+    float attenuation;
+
+    if (q->color_to_move == EMPTY || (pattern->class & CLASS_s))
+      this_color = BLACK | WHITE;
+    else if (q->color_to_move != color)
+      this_color = q->color_to_move;
+      
+    if (cosmic_gnugo) {
+      float t = 0.15 + (1.0 - cosmic_importance);
+      t = gg_min(1.0, t);
+      t = gg_max(0.0, t);
+      strength = t * pattern->value;  
+      attenuation = 1.6;
+    }
+    else {
+      strength = pattern->value;  
+      attenuation = 1.5;
+    }
+
+    /* Increase strength if we're computing escape influence. */
+    if (!q->is_territorial_influence && (pattern->class & CLASS_e))
+      add_influence_source(pos, this_color, 20 * strength, attenuation, q);
+    else
+      add_influence_source(pos, this_color, strength, attenuation, q);
+
+    DEBUG(DEBUG_INFLUENCE,
+         "  low intensity influence source at %1m, strength %f, color %C\n",
+         pos, strength, this_color);
+    return;
+  }
+    
+  /* For E patterns, add a new influence source of the same color and
+   * pattern defined strength at *.
+   */
+  if (pattern->class & CLASS_E) {
+    add_influence_source(pos, color, pattern->value, DEFAULT_ATTENUATION, q);
+    DEBUG(DEBUG_INFLUENCE,
+         "  extra %C source at %1m, strength %f\n", color,
+         pos, pattern->value);
+    return;
+  }
+
+  /* For B patterns add intrusions sources at "!" points. */
+  if (pattern->class & CLASS_B) {
+    float strength;
+    if (cosmic_gnugo) {
+      float t = 0.15 + (1.0 - cosmic_importance);
+      t = gg_min(1.0, t);
+      t = gg_max(0.0, t);
+      strength = t * pattern->value;
+    }
+    else 
+      strength = pattern->value;
+    
+    for (k = 0; k < pattern->patlen; ++k)  /* match each point */
+      if (pattern->patn[k].att == ATT_not) {
+       /* transform pattern real coordinate */
+       int ii = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+       /* Low intensity influence source for the color in turn to move. */  
+       if (q->is_territorial_influence)
+         enter_intrusion_source(anchor, ii, strength, 
+                                TERR_DEFAULT_ATTENUATION, q);
+       else
+         add_influence_source(ii, color, strength, DEFAULT_ATTENUATION, q); 
+       DEBUG(DEBUG_INFLUENCE, "  intrusion at %1m\n", ii);
+      }
+    return;
+  }
+  
+
+  gg_assert(pattern->class & (CLASS_D | CLASS_A));
+  /* For A, D patterns, add blocks for all "," or "!" points.  */
+  for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+    if (pattern->patn[k].att == ATT_comma
+       || pattern->patn[k].att == ATT_not) {
+      /* transform pattern real coordinate */
+      int ii = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+      int blocking_color;
+      if (pattern->class & CLASS_D)
+       blocking_color = color;
+      else
+       blocking_color = OTHER_COLOR(color);
+      DEBUG(DEBUG_INFLUENCE, "  barrier for %s influence at %1m\n",
+           color_to_string(OTHER_COLOR(blocking_color)), ii);
+      if (pattern->patn[k].att == ATT_comma) {
+       if (blocking_color == WHITE)
+         q->black_permeability[ii] = 0.0;
+       else
+         q->white_permeability[ii] = 0.0;
+      }
+      /* Weak barrier at !-marked points. */
+      else {
+       if (blocking_color == WHITE)
+         q->black_permeability[ii] *= 0.7;
+       else
+         q->white_permeability[ii] *= 0.7;
+       
+      }
+    }
+  }
+}
+
+/* Callback for matched barriers patterns in followup influence.
+ * This adds an intrusion source for all B patterns in barriers.db for
+ * the color that has made a move if all the following conditions are
+ * fulfilled:
+ * - the anchor ("Q") is adjacent (directly or diagonally) to a "saved stone"
+ *  (this is ensured by matchpat before calling back here)
+ * - at least one of the O stones in the pattern is a saved stone.
+ * - the usual pattern constraint ("; oplay_attack_either(...)") is fulfilled
+ * - the pattern action (typically ">return (!xplay_attack(...))") returns
+ *   true if  called with parameter action = FOLLOWUP_INFLUENCE_CALLBACK.
+ * "Saved stones" are: the move played + tactically rescued stones + stones
+ *                     in a critcal dragon brought to life by this move
+ */
+static void
+followup_influence_callback(int anchor, int color, struct pattern *pattern,
+                            int ll, void *data)
+{
+  int k;
+  int t;
+  struct influence_data *q = data;
+  UNUSED(color);
+  /* We use only B  patterns in followup influence. */
+  if (!(pattern->class & CLASS_B))
+    return;
+
+  t = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT
+      && !pattern->autohelper(ll, t, color, 0))
+    return;
+
+  /* Actions in B patterns are used as followup specific constraints. */
+  if ((pattern->autohelper_flag & HAVE_ACTION)
+      && !pattern->autohelper(ll, t, color, FOLLOWUP_INFLUENCE_CALLBACK))
+    return;
+
+  DEBUG(DEBUG_INFLUENCE, "influence pattern '%s'+%d matched at %1m\n",
+       pattern->name, ll, anchor);
+
+  for (k = 0; k < pattern->patlen; ++k)  /* match each point */
+    if (pattern->patn[k].att == ATT_not) {
+      /* transform pattern real coordinate */
+      int ii = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+      /* Low intensity influence source for the color in turn to move. */
+      enter_intrusion_source(anchor, ii, pattern->value,
+                            TERR_DEFAULT_ATTENUATION, q);
+      DEBUG(DEBUG_INFLUENCE, "  followup for %1m: intrusion at %1m\n",
+            anchor, ii);
+    }
+}
+
+/* Called from actions for t patterns. Marks (pos) as not being
+ * territory for (color).
+ */
+void
+influence_mark_non_territory(int pos, int color)
+{
+  DEBUG(DEBUG_INFLUENCE, "  non-territory for %C at %1m\n", color, pos);
+  current_influence->non_territory[pos] |= color;
+}
+
+/* Erases all territory for color at (pos), and all directly neighboring
+ * fields.
+ */
+void
+influence_erase_territory(struct influence_data *q, int pos, int color)
+{
+  int k;
+  ASSERT1((color == WHITE && q->territory_value[pos] >= 0.0)
+          || (color == BLACK && q->territory_value[pos] <= 0.0), pos);
+
+  current_influence = q;
+
+  q->territory_value[pos] = 0.0;
+  influence_mark_non_territory(pos, color);
+  for (k = 0; k < 4; k++) {
+    if (ON_BOARD(pos + delta[k])) {
+      q->territory_value[pos + delta[k]] = 0.0;
+      influence_mark_non_territory(pos + delta[k], color);
+    }
+  }
+}
+
+/* Match the patterns in influence.db and barriers.db in order to add:
+ * - influence barriers,
+ * - extra influence sources at possible invasion and intrusion points, and
+ * - extra influence induced by strong positions.
+ * Reduce permeability around each living stone.
+ * Reset permeability to 1.0 at intrusion points.
+ */
+static void
+find_influence_patterns(struct influence_data *q)
+{
+  int ii;
+
+  current_influence = q;
+  matchpat(influence_callback, ANCHOR_COLOR, &influencepat_db, q, NULL);
+  if (q->color_to_move != EMPTY)
+    matchpat(influence_callback, q->color_to_move, &barrierspat_db, q, NULL);
+
+  if (q->is_territorial_influence)
+    add_marked_intrusions(q);
+
+  /* Additionally, we introduce a weaker kind of barriers around living
+   * stones.
+   */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii) && !q->safe[ii]) {
+      int k;
+      float black_reduction = 1.0;
+      float white_reduction = 1.0;
+      for (k = 0; k < 8; k++) {
+       int d = delta[k];
+       if (IS_STONE(board[ii + d]) && q->safe[ii + d]) {
+         /* Reduce less diagonally. */
+         float reduction = (k < 4) ? 0.25 : 0.65;
+         if (board[ii + d] == BLACK)
+           white_reduction *= reduction;
+         else
+           black_reduction *= reduction;
+       }
+       else if (IS_STONE(board[ii + d]) && !q->safe[ii + d]) {
+         if (board[ii + d] == BLACK)
+           white_reduction = -100.0;
+         else
+           black_reduction = -100.0;
+       }
+      }
+      if (black_reduction > 0.0)
+       q->black_permeability[ii] *= black_reduction;
+      if (white_reduction > 0.0)
+       q->white_permeability[ii] *= white_reduction;
+    }
+
+  reset_unblocked_blocks(q);
+}
+
+/* This function checks whether we have two or more adjacent blocks for
+ * influence of color next to pos. If yes, it returns the position of the
+ * least valuable blocks; otherwise, it returns NO_MOVE.
+ */
+static int
+check_double_block(int color, int pos, const struct influence_data *q)
+{
+  int k;
+  int block_neighbors = 0;
+  const float *permeability = ((color == BLACK) ? q->black_permeability :
+                                                 q->white_permeability);
+
+  /* Count neighboring blocks. */
+  for (k = 0; k < 4; k++)
+    if (board[pos + delta[k]] == EMPTY && permeability[pos + delta[k]] == 0.0)
+      block_neighbors++;
+
+  if (block_neighbors >= 2) {
+    /* Search for least valuable block. */
+    float smallest_value = 4.0 * MAX_BOARD * MAX_BOARD;
+    int smallest_block = NO_MOVE;
+    /* We count opponent's territory as positive. */
+    float sign = ((color == WHITE) ? -1.0 : 1.0);
+    for (k = 0; k < 4; k++) {
+      int neighbor = pos + delta[k];
+      if (board[neighbor] == EMPTY && permeability[neighbor] == 0.0) {
+       /* Value is sum of opponents territory at this and all 4 neighboring
+        * intersections.
+        */
+       float this_value = sign * q->territory_value[neighbor];
+       int j;
+       for (j = 0; j < 4; j++)
+         if (ON_BOARD(neighbor + delta[j]))
+           this_value += sign * q->territory_value[neighbor + delta[j]];
+       /* We use an artifical tie breaker to avoid possible platform
+        * dependency.
+        */
+       if (this_value + 0.0005 < smallest_value) {
+         smallest_block = neighbor;
+         smallest_value = this_value;
+       }
+      }
+    }
+    ASSERT1(ON_BOARD1(smallest_block), pos);
+    return smallest_block;
+  }
+  return NO_MOVE;
+}
+
+#define MAX_DOUBLE_BLOCKS 20 
+
+
+/* This function checks for the situation where an influence source for
+ * the color to move is direclty neighbored by 2 or more influence blocks.
+ * It then removes the least valuable of these blocks, and re-runs the
+ * influence accumulation for this position.
+ *
+ * See endgame:840 for an example where this is essential.
+ */
+static void
+remove_double_blocks(struct influence_data *q,
+                    const signed char inhibited_sources[BOARDMAX])
+{
+  int ii;
+  float *strength = ((q->color_to_move == WHITE) ? q->white_strength :
+                                                  q->black_strength);
+  int double_blocks[MAX_DOUBLE_BLOCKS];
+  int num_blocks = 0;
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (board[ii] == EMPTY
+       && !(inhibited_sources && inhibited_sources[ii])
+       && strength[ii] > 0.0) {
+      double_blocks[num_blocks] = check_double_block(q->color_to_move, ii, q);
+      if (double_blocks[num_blocks] != NO_MOVE) {
+       num_blocks++;
+       if (num_blocks == MAX_DOUBLE_BLOCKS)
+         break;
+      }
+    }
+  {
+    int k;
+    float *permeability = ((q->color_to_move == BLACK)
+                          ? q->black_permeability : q->white_permeability);
+    for (k = 0; k < num_blocks; k++) {
+      DEBUG(DEBUG_INFLUENCE, "Removing block for %s at %1m.\n",
+           color_to_string(q->color_to_move), double_blocks[k]);
+      permeability[double_blocks[k]] = 1.0;
+      accumulate_influence(q, double_blocks[k], q->color_to_move);
+    }
+  }
+}
+
+
+/* Do the real work of influence computation. This is called from
+ * compute_influence and compute_escape_influence.
+ *
+ * q->is_territorial_influence and q->color_to_move must be set by the caller.
+ */
+static void
+do_compute_influence(const signed char safe_stones[BOARDMAX],
+                    const signed char inhibited_sources[BOARDMAX],
+                    const float strength[BOARDMAX], struct influence_data *q,
+                    int move, const char *trace_message)
+{
+  int ii;
+  init_influence(q, safe_stones, strength);
+
+  modify_depth_values(stackp - 1);
+  find_influence_patterns(q);
+  modify_depth_values(1 - stackp);
+  
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii) && !(inhibited_sources && inhibited_sources[ii])) {
+      if (q->white_strength[ii] > 0.0)
+       accumulate_influence(q, ii, WHITE);
+      if (q->black_strength[ii] > 0.0)
+       accumulate_influence(q, ii, BLACK);
+    }
+
+  value_territory(q);
+  remove_double_blocks(q, inhibited_sources);
+
+  value_territory(q);
+  
+  if ((move == NO_MOVE
+       && (printmoyo & PRINTMOYO_INITIAL_INFLUENCE))
+      || (debug_influence && move == debug_influence))
+    print_influence(q, trace_message);
+}
+
+
+/* Compute the influence values for both colors.
+ * 
+ * The caller must
+ * - set up the board[] state
+ * - mark safe stones with INFLUENCE_SAFE_STONE, dead stones with 0
+ * - mark stones newly saved by a move with INFLUENCE_SAVED_STONE
+ *   (this is relevant if the influence_data *q is reused to compute
+ *   a followup value for this move).
+ *
+ * Results will be stored in q.
+ *
+ * (move) has no effects except toggling debugging. Set it to -1
+ * for no debug output at all (otherwise it will be controlled by
+ * the -m command line option).
+ *
+ * It is assumed that color is in turn to move. (This affects the
+ * barrier patterns (class A, D) and intrusions (class B)). Color
+ */
+
+void
+compute_influence(int color, const signed char safe_stones[BOARDMAX],
+                 const float strength[BOARDMAX], struct influence_data *q,
+                 int move, const char *trace_message)
+{
+  int save_debug = debug;
+  VALGRIND_MAKE_WRITABLE(q, sizeof(*q));
+
+  q->is_territorial_influence = 1;
+  q->color_to_move = color;
+
+  /* Turn off DEBUG_INFLUENCE for influence computations we are not
+   * interested in.
+   */
+  if ((move == NO_MOVE
+       && !(printmoyo & PRINTMOYO_INITIAL_INFLUENCE))
+      || (move != NO_MOVE && move != debug_influence))
+    debug = debug &~ DEBUG_INFLUENCE;
+
+  influence_id++;
+  q->id = influence_id;
+
+  do_compute_influence(safe_stones, NULL, strength,
+                      q, move, trace_message);
+
+  debug = save_debug;
+}
+
+/* Return the color of the territory at (pos). If it's territory for
+ * neither color, EMPTY is returned.
+ */
+int
+whose_territory(const struct influence_data *q, int pos)
+{
+  float bi = q->black_influence[pos];
+  float wi = q->white_influence[pos];
+  float terr = q->territory_value[pos];
+
+  ASSERT_ON_BOARD1(pos);
+
+  if (bi > 0.0 && wi == 0.0 && terr < -territory_determination_value)
+     return BLACK;
+  if (wi > 0.0 && bi == 0.0 && terr > territory_determination_value)
+     return WHITE;
+
+  return EMPTY;
+}
+
+
+/* Return the color who has a moyo at (pos). If neither color has a
+ * moyo there, EMPTY is returned. The definition of moyo in terms of the
+ * influences is totally ad hoc.
+ */
+int
+whose_moyo(const struct influence_data *q, int pos)
+{
+  float bi = q->black_influence[pos];
+  float wi = q->white_influence[pos];
+
+  int territory_color = whose_territory(q, pos);
+  if (territory_color != EMPTY)
+    return territory_color;
+    
+  if (bi > moyo_data.influence_balance * wi
+      && bi > moyo_data.my_influence_minimum
+      && wi < moyo_data.opp_influence_maximum)
+    return BLACK;
+  if (wi > moyo_data.influence_balance * bi
+      && wi > moyo_data.my_influence_minimum
+      && bi < moyo_data.opp_influence_maximum)
+    return WHITE;
+  
+  return EMPTY;
+}
+
+/* Return the color who has a moyo at (pos). If neither color has a
+ * moyo there, EMPTY is returned.
+ * The definition of moyo in terms of the influences is totally ad
+ * hoc.
+ *
+ * It has a slightly different definition of moyo than whose_moyo.
+ */
+int
+whose_moyo_restricted(const struct influence_data *q, int pos)
+{
+  float bi = q->black_influence[pos];
+  float wi = q->white_influence[pos];
+
+  int territory_color = whose_territory(q, pos);
+
+  /* default */
+  if (territory_color != EMPTY)
+    return territory_color;
+  else if (bi > moyo_restricted_data.influence_balance * wi
+           && bi > moyo_restricted_data.my_influence_minimum
+           && wi < moyo_restricted_data.opp_influence_maximum)
+    return BLACK;
+  else if (wi > moyo_restricted_data.influence_balance * bi
+           && wi > moyo_restricted_data.my_influence_minimum
+           && bi < moyo_restricted_data.opp_influence_maximum)
+    return WHITE; 
+  else
+    return EMPTY;
+}
+
+
+/* Return the color who has dominating influence ("area") at (pos).
+ * If neither color dominates the influence there, EMPTY is returned.
+ * The definition of area in terms of the influences is totally ad
+ * hoc.
+ */
+int
+whose_area(const struct influence_data *q, int pos)
+{
+  float bi = q->black_influence[pos];
+  float wi = q->white_influence[pos];
+
+  int moyo_color = whose_moyo(q, pos);
+  if (moyo_color != EMPTY)
+    return moyo_color;
+  
+  if (bi > 3.0 * wi && bi > 1.0 && wi < 40.0)
+    return BLACK;
+
+  if (wi > 3.0 * bi && wi > 1.0 && bi < 40.0)
+    return WHITE;
+  
+  return EMPTY;
+}
+
+static void
+value_territory(struct influence_data *q)
+{
+  int ii;
+  int dist_i, dist_j;
+  float central;
+  float first_guess[BOARDMAX];
+  float ratio;
+  int k;
+
+  memset(first_guess, 0, BOARDMAX*sizeof(float));
+  memset(q->territory_value, 0, BOARDMAX*sizeof(float));
+  /* First loop: guess territory directly from influence. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)
+       && !q->safe[ii]) {
+      float diff = 0.0;
+      if (q->white_influence[ii] + q->black_influence[ii] > 0)
+       diff = (q->white_influence[ii] - q->black_influence[ii])
+              / (q->white_influence[ii] + q->black_influence[ii]);
+      first_guess[ii] = diff * diff * diff;
+
+      /* If both side have small influence, we have to reduce this value.
+       * What we consider "small influence" depends on how central this
+       * intersection lies.
+       *
+       * The values of central on an 11x11 board become:
+       *
+       *  4  5  6  7  7  7  7  7  6  5  4
+       *  5  8  9 10 10 10 10 10  9  8  5
+       *  6  9 12 13 13 13 13 13 12  9  6
+       *  7 10 13 16 16 16 16 16 13 10  7
+       *  7 10 13 16 17 17 17 16 13 10  7
+       *  7 10 13 16 17 18 17 16 13 10  7
+       *  7 10 13 16 17 17 17 16 13 10  7
+       *  7 10 13 16 16 16 16 16 13 10  7
+       *  6  9 12 13 13 13 13 13 12  9  6
+       *  5  8  9 10 10 10 10 10  9  8  5
+       *  4  5  6  7  7  7  7  7  6  5  4
+       */
+      dist_i = gg_min(I(ii), board_size - I(ii) - 1);
+      dist_j = gg_min(J(ii), board_size - J(ii) - 1);
+      if (dist_i > dist_j)
+       dist_i = gg_min(4, dist_i);
+      else
+       dist_j = gg_min(4, dist_j);
+      central = (float) 2 * gg_min(dist_i, dist_j) + dist_i + dist_j;
+      ratio = gg_max(q->black_influence[ii], q->white_influence[ii])
+             / gg_interpolate(&min_infl_for_territory, central);
+
+      /* Do not make this adjustment when scoring unless both
+       * players have non-zero influence.
+       */
+      if (doing_scoring && (q->black_influence[ii] == 0.0
+                           || q->white_influence[ii] == 0.0))
+       ratio = 1.0;
+      
+      first_guess[ii] *= gg_interpolate(&territory_correction, ratio);
+
+      /* Dead stone, upgrade to territory. Notice that this is not
+       * the point for a prisoner, which is added later. Instead
+       * this is to make sure that the vertex is not regarded as
+       * moyo or area. Also notice that the non-territory
+       * degradation below may over-rule this decision.
+       */
+      if (board[ii] == BLACK)
+       first_guess[ii] = 1.0;
+      else if (board[ii] == WHITE)
+       first_guess[ii] = -1.0;
+      q->territory_value[ii] = first_guess[ii];
+    }
+
+  /* Second loop: Correct according to neighbour vertices. Each territory
+   * value is degraded to the minimum value of its neighbors (unless this
+   * neighbor has reduced permeability for the opponent's influence).
+   */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)
+       /* Do not overrule dead stone territory above.
+        * FIXME: This does not do what it claims to do. Correcting it
+        * seems to break some tests, though.
+        */
+       && !q->safe[ii]) {
+      /* Loop over all neighbors. */
+      for (k = 0; k < 4; k++) {
+       if (!ON_BOARD(ii + delta[k]))
+         continue;
+       if (q->territory_value[ii] > 0.0) {
+         /* White territory. */
+         if (!q->safe[ii + delta[k]]) {
+           float neighbor_val =
+             q->black_permeability[ii + delta[k]]
+               * first_guess[ii + delta[k]]
+             + (1.0 - q->black_permeability[ii + delta[k]])
+               * first_guess[ii];
+           q->territory_value[ii]
+             = gg_max(0, gg_min(q->territory_value[ii], neighbor_val));
+         }
+       }
+       else {
+         /* Black territory. */
+         if (!q->safe[ii + delta[k]]) {
+           float neighbor_val =
+             q->white_permeability[ii + delta[k]]
+               * first_guess[ii + delta[k]]
+             + (1 - q->white_permeability[ii + delta[k]])
+               * first_guess[ii];
+           q->territory_value[ii]
+             = gg_min(0, gg_max(q->territory_value[ii], neighbor_val));
+         }
+       }
+      }
+    }
+
+  /* Third loop: Nonterritory patterns, points for prisoners. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)
+       && !q->safe[ii]) {
+      /* If marked as non-territory for the color currently owning
+       * it, reset the territory value.
+       */
+      if (q->territory_value[ii] > 0.0
+         && (q->non_territory[ii] & WHITE))
+       q->territory_value[ii] = 0.0;
+
+      if (q->territory_value[ii] < 0.0
+         && (q->non_territory[ii] & BLACK))
+       q->territory_value[ii] = 0.0;
+      
+      /* Dead stone, add one to the territory value. */
+      if (board[ii] == BLACK)
+       q->territory_value[ii] += 1.0;
+      else if (board[ii] == WHITE)
+       q->territory_value[ii] -= 1.0;
+    }
+}
+
+
+/* Segment the influence map into connected regions of territory,
+ * moyo, or area. What to segment on is determined by the the function
+ * pointer region_owner. The segmentation is performed for both
+ * colors. The connected regions may include stones of the own color,
+ * but only empty intersections (and dead opponent stones) count
+ * toward the region size.
+ */
+static void
+segment_region(struct influence_data *q, owner_function_ptr region_owner,
+              struct moyo_data *regions)
+{
+  int ii;
+  static signed char marked[BOARDMAX];
+  regions->number = 0;
+
+  /* Reset the markings. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    marked[ii] = 0;
+    regions->segmentation[ii] = 0;
+  }
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)
+       && !marked[ii]
+       && region_owner(q, ii) != EMPTY) {
+      /* Found an unlabelled intersection. Use flood filling to find
+       * the rest of the region.
+       */
+      int size = 0;
+      float terr_val = 0.0;
+      int queue_start = 0;
+      int queue_end = 1;
+      int color = region_owner(q, ii);
+      regions->number++;
+      marked[ii] = 1;
+      q->queue[0] = ii;
+      while (queue_start < queue_end) {
+       int tt = q->queue[queue_start];
+       int k;
+       queue_start++;
+       if (!q->safe[tt] || board[tt] != color) {
+         size++;
+         if (q->is_territorial_influence)
+           terr_val += gg_abs(q->territory_value[tt]);
+       }
+       regions->segmentation[tt] = regions->number;
+       for (k = 0; k < 4; k++) {
+         int d = delta[k];
+         if (ON_BOARD(tt + d)
+             && !marked[tt + d]
+             && region_owner(q, tt + d) == color) {
+           q->queue[queue_end] = tt + d;
+           queue_end++;
+           marked[tt + d] = 1;
+         }
+       }
+      }
+      regions->size[regions->number] = size;
+      regions->territorial_value[regions->number] = terr_val;
+      regions->owner[regions->number] = color;
+    }
+}
+
+
+
+/* Export a territory segmentation. */
+void
+influence_get_territory_segmentation(struct influence_data *q,
+                                    struct moyo_data *moyos)
+{
+  segment_region(q, whose_territory, moyos);
+}
+
+
+/* Export the territory valuation at an intersection from initial_influence;
+ * it is given from (color)'s point of view.
+ */
+float
+influence_territory(const struct influence_data *q, int pos, int color)
+{
+  if (color == WHITE)
+    return q->territory_value[pos];
+  else
+    return -q->territory_value[pos];
+}
+
+int
+influence_considered_lively(const struct influence_data *q, int pos)
+{
+  int color = board[pos];
+  ASSERT1(IS_STONE(color), pos);
+  return (q->safe[pos]
+          && ((color == WHITE && q->white_strength[pos] > 0)
+             || (color == BLACK && q->black_strength[pos] > 0)));
+}
+
+
+/* Compute a followup influence. It is assumed that the stones that
+ * deserve a followup have been marked INFLUENCE_SAVED_STONE in
+ * base->safe.
+ */
+void
+compute_followup_influence(const struct influence_data *base,
+                          struct influence_data *q,
+                          int move, const char *trace_message) 
+{
+  int ii;
+  signed char goal[BOARDMAX];
+  /* This is the color that will get a followup value. */
+  int color = OTHER_COLOR(base->color_to_move);
+  int save_debug = debug;
+
+  memcpy(q, base, sizeof(*q));
+  ASSERT1(IS_STONE(q->color_to_move), move);
+  q->color_to_move = color;
+  /* We mark the saved stones and their neighbors in the goal array.
+   */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      if (q->safe[ii] == INFLUENCE_SAVED_STONE)
+        goal[ii] = 1;
+      else
+       goal[ii] = 0;
+    }
+
+
+  /* Turn off DEBUG_INFLUENCE for influence computations we are not
+   * interested in.
+   */
+  if ((move == NO_MOVE
+       && !(printmoyo & PRINTMOYO_INITIAL_INFLUENCE))
+      || (move != debug_influence))
+    debug = debug &~ DEBUG_INFLUENCE;
+
+  q->intrusion_counter = 0;
+  current_influence = q;
+  /* Match B patterns for saved stones. */
+  matchpat_goal_anchor(followup_influence_callback, color, &barrierspat_db, 
+                      q, goal, 1);
+
+  debug = save_debug;
+  /* Now add the intrusions. */
+  add_marked_intrusions(q);
+
+  reset_unblocked_blocks(q);
+  
+  /* Spread influence for new influence sources. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii))
+      if ((color == BLACK
+            && q->black_strength[ii] > base->black_strength[ii])
+          || (color == WHITE
+              && q->white_strength[ii] > base->white_strength[ii]))
+        accumulate_influence(q, ii, color);
+
+  value_territory(q);
+
+  if (debug_influence && debug_influence == move)
+    print_influence(q, trace_message);
+}
+
+
+/* Compute influence based escape values and return them in the
+ * escape_value array.  
+ */
+
+void
+compute_escape_influence(int color, const signed char safe_stones[BOARDMAX],
+                        const signed char goal[BOARDMAX],
+                        const float strength[BOARDMAX],
+                        signed char escape_value[BOARDMAX])
+{
+  int k;
+  int ii;
+  int save_debug = debug;
+
+  /* IMPORTANT: The caching relies on the fact that safe_stones[] and
+   * strength[] will currently always be identical for identical board[]
+   * states. Better check for these, too.
+   */
+  static int cached_board[BOARDMAX];
+  static signed char escape_values[BOARDMAX][2];
+  static int active_caches[2] = {0, 0};
+
+  int cache_number = (color == WHITE);
+
+  VALGRIND_MAKE_WRITABLE(&escape_influence, sizeof(escape_influence));
+
+  if (!goal) {
+    /* Encode the values of color and dragons_known into an integer
+     * between 0 and 3.
+     */
+    int board_was_cached = 1;
+
+    /* Notice that we compare the out of board markers as well, in
+     * case the board size should have changed between calls.
+     */
+    for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+      if (cached_board[ii] != board[ii]) {
+       cached_board[ii] = board[ii];
+       board_was_cached = 0;
+      }
+    }
+
+    if (!board_was_cached)
+      for (k = 0; k < 2; k++)
+       active_caches[k] = 0;
+
+    if (active_caches[cache_number]) {
+      for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+       if (ON_BOARD(ii))
+         escape_value[ii] = escape_values[ii][cache_number];
+
+      return;
+    }
+  }
+
+  /* Use enhance pattern and higher attenuation for escape influence. */
+  escape_influence.is_territorial_influence = 0;
+  escape_influence.color_to_move = EMPTY;
+
+  /* Turn off DEBUG_INFLUENCE unless we are specifically interested in
+   * escape computations.
+   */
+  if (!(debug & DEBUG_ESCAPE))
+    debug &= ~DEBUG_INFLUENCE;
+
+  do_compute_influence(safe_stones, goal, strength,
+                      &escape_influence, -1, NULL);
+
+  debug = save_debug;
+  
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      if (whose_moyo(&escape_influence, ii) == color)
+       escape_value[ii] = 4;
+      else if (whose_area(&escape_influence, ii) == color)
+       escape_value[ii] = 2;
+      else if (whose_area(&escape_influence, ii) == EMPTY) {
+       if (goal) {
+         escape_value[ii] = 0;
+
+         if (!goal[ii]) {
+           int goal_proximity = 0;
+
+           for (k = 0; k < 8; k++) {
+             if (ON_BOARD(ii + delta[k])) {
+               goal_proximity += 2 * goal[ii + delta[k]];
+               if (k < 4 && ON_BOARD(ii + 2 * delta[k]))
+                 goal_proximity += goal[ii + delta[k]];
+             }
+             else
+               goal_proximity += 1;
+           }
+
+           if (goal_proximity < 6)
+             escape_value[ii] = 1;
+         }
+       }
+       else
+         escape_value[ii] = 1;
+      }
+      else
+       escape_value[ii] = 0;
+    }
+
+  if (0 && (debug & DEBUG_ESCAPE) && verbose > 0)
+    print_influence(&escape_influence, "escape influence");
+
+  if (!goal) {
+    /* Save the computed values in the cache. */
+    for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+      if (ON_BOARD(ii))
+       escape_values[ii][cache_number] = escape_value[ii];
+    active_caches[cache_number] = 1;
+  }
+}
+
+
+/* Cache of delta_territory_values. */
+static float delta_territory_cache[BOARDMAX];
+static float followup_territory_cache[BOARDMAX];
+static Hash_data delta_territory_cache_hash[BOARDMAX];
+static int territory_cache_position_number = -1;
+static int territory_cache_influence_id = -1;
+static int territory_cache_color = -1;
+
+/* We cache territory computations. This avoids unnecessary re-computations
+ * when review_move_reasons is run a second time for the endgame patterns.
+ *
+ * (*base) points to the initial_influence data that would be used
+ * to make the territory computation against.
+ */
+int 
+retrieve_delta_territory_cache(int pos, int color, float *move_value,
+                              float *followup_value,
+                              const struct influence_data *base,
+                              Hash_data safety_hash)
+{
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  /* We check whether the color, the board position, or the base influence
+   * data has changed since the cache entry got entered.
+   */
+  if (territory_cache_position_number == position_number
+      && territory_cache_color == color
+      && territory_cache_influence_id == base->id
+      && delta_territory_cache[pos] != NOT_COMPUTED) {
+    int i;
+    for (i = 0; i < NUM_HASHVALUES; i++)
+      if (delta_territory_cache_hash[pos].hashval[i]
+         != safety_hash.hashval[i])
+       return 0;
+    *move_value = delta_territory_cache[pos];
+    *followup_value = followup_territory_cache[pos];
+    if (0) 
+      gprintf("%1m: retrieved territory value from cache: %f, %f\n", pos,
+             *move_value, *followup_value);
+    return 1;
+  }
+  return 0;
+}
+
+void 
+store_delta_territory_cache(int pos, int color,
+                           float move_value, float followup_value,
+                           const struct influence_data *base,
+                           Hash_data safety_hash)
+{
+  int i;
+
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (territory_cache_position_number != position_number
+      || territory_cache_color != color
+      || territory_cache_influence_id != base->id) {
+    int ii;
+    for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+      delta_territory_cache[ii] = NOT_COMPUTED;
+    territory_cache_position_number = position_number;
+    territory_cache_influence_id = base->id;
+    territory_cache_color = color;
+    if (0)
+      gprintf("Cleared delta territory cache.\n");
+  }
+  delta_territory_cache[pos] = move_value;
+  followup_territory_cache[pos] = followup_value;
+  for (i = 0; i < NUM_HASHVALUES; i++)
+    delta_territory_cache_hash[pos].hashval[i] = safety_hash.hashval[i];
+  if (0)
+    gprintf("%1m: Stored delta territory cache: %f, %f\n", pos, move_value,
+           followup_value);
+}
+
+/* Compute the difference in territory between two influence data,
+ * from the point of view of (color).
+ * (move) is only passed for debugging output.
+ */
+float
+influence_delta_territory(const struct influence_data *base,
+                         const struct influence_data *q, int color,
+                         int move)
+{
+  int ii;
+  float total_delta = 0.0;
+  float this_delta;
+  ASSERT_ON_BOARD1(move);
+  ASSERT1(IS_STONE(color), move);
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      float new_value = q->territory_value[ii];
+      float old_value = base->territory_value[ii];
+      this_delta = new_value - old_value;
+      /* Negate values if we are black. */
+      if (color == BLACK) {
+       new_value = -new_value;
+       old_value = -old_value;
+       this_delta = -this_delta;
+      }
+      
+      if (move != -1
+         && (this_delta > 0.02 || -this_delta > 0.02))
+       DEBUG(DEBUG_TERRITORY,
+             "  %1m:   - %1m territory change %f (%f -> %f)\n",
+             move, ii, this_delta, old_value, new_value);
+      total_delta += this_delta;
+    }
+
+  /* Finally, captured stones: */
+  this_delta = q->captured - base->captured;
+  if (color == BLACK)
+    this_delta = -this_delta;
+  if (move != -1
+      && this_delta != 0.0)
+    DEBUG(DEBUG_TERRITORY, "  %1m:   - captured stones %f\n",
+         move, this_delta);
+  total_delta += this_delta;
+
+  return total_delta;
+}
+
+
+/* Estimate the score. A positive value means white is ahead. The
+ * score is estimated influence data *q, which must have been
+ * computed in advance.
+ */
+float
+influence_score(const struct influence_data *q, int use_chinese_rules)
+{
+  float score = 0.0;
+  int ii;
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii))
+      score += q->territory_value[ii];
+  
+  if (use_chinese_rules)
+    score += stones_on_board(WHITE) - stones_on_board(BLACK) + komi + handicap;
+  else
+    score += black_captured - white_captured + komi;
+
+  return score;
+}
+
+
+/* Uses initial_influence to estimate the game advancement (fuseki,
+ * chuban, yose) returned as a value between 0.0 (start) and 1.0 (game
+ * over)
+ */
+float
+game_status(int color)
+{
+  struct influence_data *iq = INITIAL_INFLUENCE(color);
+  struct influence_data *oq = OPPOSITE_INFLUENCE(color);
+  int count = 0;
+  int ii;
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      if (iq->safe[ii])
+       count += WEIGHT_TERRITORY;
+      else if (whose_territory(iq, ii) != EMPTY
+              && whose_territory(oq, ii) != EMPTY)
+       count += WEIGHT_TERRITORY;
+      else if (whose_moyo(oq, ii) != EMPTY)
+       count += WEIGHT_MOYO;
+      else if (whose_area(oq, ii) != EMPTY)
+       count += WEIGHT_AREA;
+    }
+
+  return (float) count / (WEIGHT_TERRITORY * board_size * board_size);
+}
+
+
+/* Print the influence map when we have computed influence for the
+ * move at (i, j).
+ */
+void
+debug_influence_move(int move)
+{
+  debug_influence = move;
+}
+
+
+/* One more way to export influence data. This should only be used
+ * for debugging.
+ */
+void
+get_influence(const struct influence_data *q,
+             float white_influence[BOARDMAX],
+             float black_influence[BOARDMAX],
+             float white_strength[BOARDMAX],
+             float black_strength[BOARDMAX],
+             float white_attenuation[BOARDMAX], 
+             float black_attenuation[BOARDMAX],
+             float white_permeability[BOARDMAX],
+             float black_permeability[BOARDMAX],
+             float territory_value[BOARDMAX],
+             int influence_regions[BOARDMAX],
+             int non_territory[BOARDMAX])
+{
+  int ii;
+  
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    white_influence[ii] = q->white_influence[ii];
+    black_influence[ii] = q->black_influence[ii];
+    white_strength[ii] = q->white_strength[ii];
+    black_strength[ii] = q->black_strength[ii];
+    white_attenuation[ii] = q->white_attenuation[ii];
+    black_attenuation[ii] = q->black_attenuation[ii];
+    white_permeability[ii] = q->white_permeability[ii];
+    black_permeability[ii] = q->black_permeability[ii];
+    territory_value[ii] = q->territory_value[ii];
+    non_territory[ii] = q->non_territory[ii];
+
+    if (board[ii] == EMPTY) {
+      if (whose_territory(q, ii) == WHITE)
+       influence_regions[ii] = 3;
+      else if (whose_territory(q, ii) == BLACK)
+       influence_regions[ii] = -3;
+      else if (whose_moyo(q, ii) == WHITE)
+       influence_regions[ii] = 2;
+      else if (whose_moyo(q, ii) == BLACK)
+       influence_regions[ii] = -2;
+      else if (whose_area(q, ii) == WHITE)
+       influence_regions[ii] = 1;
+      else if (whose_area(q, ii) == BLACK)
+       influence_regions[ii] = -1;
+      else
+       influence_regions[ii] = 0;
+    }
+    else if (board[ii] == WHITE)
+      influence_regions[ii] = 4;
+    else if (board[ii] == BLACK)
+      influence_regions[ii] = -4;
+  }
+}
+  
+
+
+/* Print influence for debugging purposes, according to
+ * printmoyo bitmap (controlled by -m command line option).
+ */
+void
+print_influence(const struct influence_data *q, const char *info_string)
+{
+  if (printmoyo & PRINTMOYO_ATTENUATION) {
+    /* Print the attenuation values. */
+    fprintf(stderr, "white attenuation (%s):\n", info_string);
+    print_numeric_influence(q, q->white_attenuation, "%3.2f", 3, 0, 0);
+    fprintf(stderr, "black attenuation (%s):\n", info_string);
+    print_numeric_influence(q, q->black_attenuation, "%3.2f", 3, 0, 0);
+  }
+
+  if (printmoyo & PRINTMOYO_PERMEABILITY) {
+    /* Print the white permeability values. */
+    fprintf(stderr, "white permeability:\n");
+    print_numeric_influence(q, q->white_permeability, "%3.1f", 3, 0, 0);
+    
+    /* Print the black permeability values. */
+    fprintf(stderr, "black permeability:\n");
+    print_numeric_influence(q, q->black_permeability, "%3.1f", 3, 0, 0);
+  }
+
+  if (printmoyo & PRINTMOYO_STRENGTH) {
+    /* Print the strength values. */
+    fprintf(stderr, "white strength:\n");
+    if (q->is_territorial_influence)
+      print_numeric_influence(q, q->white_strength, "%5.1f", 5, 0, 0);
+    else
+      print_numeric_influence(q, q->white_strength, "%3.0f", 3, 0, 1);
+    fprintf(stderr, "black strength:\n");
+    if (q->is_territorial_influence)
+      print_numeric_influence(q, q->black_strength, "%5.1f", 5, 0, 0);
+    else
+      print_numeric_influence(q, q->black_strength, "%3.0f", 3, 0, 1);
+  }
+
+  if (printmoyo & PRINTMOYO_NUMERIC_INFLUENCE) {
+    /* Print the white influence values. */
+    fprintf(stderr, "white influence (%s):\n", info_string);
+    print_numeric_influence(q, q->white_influence, "%5.1f", 5, 1, 0);
+    /* Print the black influence values. */
+    fprintf(stderr, "black influence (%s):\n", info_string);
+    print_numeric_influence(q, q->black_influence, "%5.1f", 5, 1, 0);
+  }
+
+  if (printmoyo & PRINTMOYO_PRINT_INFLUENCE) {
+    fprintf(stderr, "influence regions (%s):\n", info_string);
+    print_influence_areas(q);
+  }
+  if (printmoyo & PRINTMOYO_VALUE_TERRITORY) {
+    fprintf(stderr, "territory (%s)", info_string);
+    print_numeric_influence(q, q->territory_value, "%5.2f", 5, 1, 0);
+  }
+}
+
+
+
+/*
+ * Print numeric influence values.
+ */
+static void
+print_numeric_influence(const struct influence_data *q,
+                       const float values[BOARDMAX],
+                       const char *format, int width,
+                       int draw_stones, int mark_epsilon)
+{
+  int i, j;
+  char ch;
+  char format_stone[20];
+
+  memset(format_stone, ' ', 20);
+  format_stone[(width + 1) / 2] = '%';
+  format_stone[(width + 3) / 2] = 'c';
+  format_stone[width + 2] = 0;
+
+  fprintf(stderr, "   ");
+  for (i = 0, ch = 'A'; i < board_size; i++, ch++) {
+    if (ch == 'I')
+      ch++;
+    fprintf(stderr, format_stone, ch);
+  }
+  fprintf(stderr, "\n");
+
+  for (i = 0; i < board_size; i++) {
+    int ii = board_size - i;
+    fprintf(stderr, "%2d ", ii);
+    for (j = 0; j < board_size; j++) {
+      int ii = POS(i, j);
+      if (draw_stones && q->safe[ii]) {
+        if (board[ii] == WHITE)
+         fprintf(stderr, format_stone, 'O');
+       else 
+         fprintf(stderr, format_stone, 'X');
+      }
+      else {
+       if (mark_epsilon && values[ii] > 0.0 && values[ii] < 1.0)
+         fprintf(stderr, "eps");
+       else
+         fprintf(stderr, format, values[ii]);
+       fprintf(stderr, " ");
+      }
+    }
+    fprintf(stderr, "%2d\n", ii);
+  }
+
+  fprintf(stderr, "   ");
+  for (i = 0, ch = 'A'; i < board_size; i++, ch++) {
+    if (ch == 'I')
+      ch++;
+    fprintf(stderr, format_stone, ch);
+  }
+  fprintf(stderr, "\n");
+}
+
+/* Draw colored board illustrating territory, moyo, and area. */
+static void
+print_influence_areas(const struct influence_data *q)
+{
+  int ii;
+  start_draw_board();
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii)) {
+      int c = EMPTY;
+      int color = GG_COLOR_BLACK;
+      if (q->safe[ii]) {
+       color = GG_COLOR_BLACK;
+        if (board[ii] == WHITE)
+         c = 'O';
+        else
+         c = 'X';
+      }
+      else if (whose_territory(q, ii) == WHITE) {
+       c = 'o';
+       color = GG_COLOR_CYAN;
+      }
+      else if (whose_territory(q, ii) == BLACK) {
+       c = 'x';
+       color = GG_COLOR_CYAN;
+      }
+      else if (whose_moyo(q, ii) == WHITE) {
+       c = 'o';
+       color = GG_COLOR_YELLOW;
+      }
+      else if (whose_moyo(q, ii) == BLACK) {
+       c = 'x';
+       color = GG_COLOR_YELLOW;
+      }
+      else if (whose_area(q, ii) == WHITE) {
+       c = 'o';
+       color = GG_COLOR_RED;
+      }
+      else if (whose_area(q, ii) == BLACK) {
+       c = 'x';
+       color = GG_COLOR_RED;
+      }
+      draw_color_char(I(ii), J(ii), c, color);
+    }
+  end_draw_board();
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
+
diff --git a/engine/influence.h b/engine/influence.h
new file mode 100644 (file)
index 0000000..dd3a745
--- /dev/null
@@ -0,0 +1,148 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "winsocket.h"
+
+
+/* The cosmic style uses more influence than the defaults attenuation 
+ * coefficients !
+ * The "TERR_.."-values are used in the influence computations used
+ * for territory evaluation. (initial_influence with dragons_known,
+ * move_influence)
+ */
+#define DEFAULT_ATTENUATION \
+               (cosmic_importance * 2.7  + (1.0 - cosmic_importance) * 3.0)
+#define TERR_DEFAULT_ATTENUATION \
+       (cosmic_importance * 2.15 + (1.0 - cosmic_importance) * 2.4)
+
+/* Extra damping coefficient for spreading influence diagonally. */
+#define DIAGONAL_DAMPING \
+       (cosmic_importance * 2.5 + (1.0 - cosmic_importance) * 2.0)
+#define TERR_DIAGONAL_DAMPING \
+       (cosmic_importance * 2.5 + (1.0 - cosmic_importance) * 1.7)
+
+
+
+
+
+
+/* Smallest amount of influence that we care about distributing. */
+#define INFLUENCE_CUTOFF 0.02
+
+/* Value in delta_territory_cache indicating that the value has not
+ * been computed. Arbitrary but unattainable.
+ */
+#define NOT_COMPUTED (-2.0 * MAX_BOARD * MAX_BOARD)
+
+/* Maximum number of regions allowed between territory, moyo, and area.
+ * FIXME: This number is vastly exaggerated. Should be possible to
+ * come up with a much better upper bound.
+ */ 
+#define MAX_REGIONS (3*MAX_BOARD*MAX_BOARD + 1)
+
+#define MAX_INTRUSIONS (2 * MAX_BOARD * MAX_BOARD)
+
+struct intrusion_data
+{
+  int source_pos;      /* Stone from which intrusion originates.*/
+  int strength_pos;     /* Position of the intrusion influence soure. */
+  float strength;
+  float attenuation;
+};
+
+struct influence_data
+{
+  signed char safe[BOARDMAX];
+
+  float white_influence[BOARDMAX];     /* Accumulated influence. */
+  float black_influence[BOARDMAX];     /* Accumulated influence. */
+  float white_strength[BOARDMAX];      /* Strength of influence source. */
+  float black_strength[BOARDMAX];      /* Strength of influence source. */
+  float white_attenuation[BOARDMAX]; 
+  float black_attenuation[BOARDMAX];
+  float white_permeability[BOARDMAX];
+  float black_permeability[BOARDMAX];
+
+  int is_territorial_influence; /* 0 only if computing escape_influence.*/
+
+  float territory_value[BOARDMAX];
+  int non_territory[BOARDMAX];
+  int captured;
+
+  int color_to_move; /* Which color is in turn to move. */
+  
+  int queue[MAX_BOARD * MAX_BOARD];     /* Points receiving influence. */
+
+  int intrusion_counter;
+  struct intrusion_data intrusions[MAX_INTRUSIONS];
+
+  int id;
+};
+
+/* Typedef for pointer to either of the functions whose_territory(),
+ * whose_loose_territory(), whose_moyo(), and whose_area().
+ */
+typedef int (*owner_function_ptr)(const struct influence_data *q, int pos);
+
+/* Used for tuning game advancement algorythm */
+#define WEIGHT_TERRITORY 10
+#define WEIGHT_MOYO       3
+#define WEIGHT_AREA       1
+
+
+
+/* cosmic_importance is a number between 0.0 and 1.0 ;
+ * when cosmic_importance is 0.0, the default influence
+ * values are used; when cosmic_importance is 1.0, GNU Go
+ * will try to play an influence-oriented fuseki by 
+ * over-estimatingthe potential territory values of moyos.
+ * In the current implementation, cosmic_importance decreases 
+ * slowly for 19*19 games from 1.0 at move 4 to 0.0 at move 120.
+ */
+float cosmic_importance;
+
+
+/* Used in the whose_moyo() function */
+struct moyo_determination_data
+{
+  float influence_balance;
+  float my_influence_minimum;
+  float opp_influence_maximum;
+};
+
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
+
diff --git a/engine/interface.c b/engine/interface.c
new file mode 100644 (file)
index 0000000..e0ba5e4
--- /dev/null
@@ -0,0 +1,430 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "sgftree.h"
+#include "liberty.h"
+#include "clock.h"
+
+#include "gg_utils.h"
+
+/*
+ * Initialize the gnugo engine. This needs to be called 
+ * once only.
+ */
+
+void
+init_gnugo(float memory, unsigned int seed)
+{
+  /* We need a fixed seed when initializing the Zobrist hashing to get
+   * reproducable results.
+   * FIXME: Test the quality of the seed.
+   */
+  set_random_seed(HASH_RANDOM_SEED);
+  reading_cache_init(memory * 1024 * 1024);
+  set_random_seed(seed);
+  persistent_cache_init();
+  clear_board();
+
+  transformation_init();
+  dfa_match_init();
+  choose_mc_patterns(NULL);
+
+  clear_approxlib_cache();
+  clear_accuratelib_cache();
+}
+
+
+/* ---------------------------------------------------------------- */
+
+/* Check whether we can accept a certain boardsize. Set out to NULL to
+ * suppress informative messages. Return 1 for an acceptable
+ * boardsize, 0 otherwise.
+ */
+int check_boardsize(int boardsize, FILE *out)
+{
+  int max_board = MAX_BOARD;
+  if (use_monte_carlo_genmove && max_board > 9)
+    max_board = 9;
+  
+  if (boardsize < MIN_BOARD || boardsize > max_board) {
+    if (out) {
+      fprintf(out, "Unsupported board size: %d. ", boardsize);
+      if (boardsize < MIN_BOARD)
+       fprintf(out, "Min size is %d.\n", MIN_BOARD);
+      else {
+       fprintf(out, "Max size is %d", max_board);
+       if (max_board < MAX_BOARD)
+         fprintf(out, " (%d without --monte-carlo)", MAX_BOARD);
+       fprintf(out, ".\n");
+      }
+      fprintf(out, "Try `gnugo --help' for more information.\n");
+    }
+    return 0;
+  }
+
+  return 1;
+}
+
+/*
+ * Clear the board.
+ */
+void
+gnugo_clear_board(int boardsize)
+{
+  board_size = boardsize;
+  clear_board();
+  init_timers();
+#if 0
+  if (metamachine && oracle_exists)
+    oracle_clear_board(boardsize);
+#endif
+}
+
+/* Play a move and start the clock */
+
+void
+gnugo_play_move(int move, int color)
+{
+#if ORACLE
+  if (oracle_exists)
+    oracle_play_move(move, color);
+  else
+    play_move(move, color);
+#else
+  play_move(move, color);
+#endif
+  clock_push_button(color);
+}
+
+
+/*
+ * Perform the moves and place the stones from the SGF node on the 
+ * board. Return the color of the player whose turn it is to move.
+ */
+
+int
+gnugo_play_sgfnode(SGFNode *node, int to_move)
+{
+  SGFProperty *prop;
+
+  for (prop = node->props; prop; prop = prop->next) {
+    switch (prop->name) {
+    case SGFAB:
+      /* A black stone. */
+      add_stone(get_sgfmove(prop), BLACK);
+      break;
+
+    case SGFAW:
+      /* A white stone. */
+      add_stone(get_sgfmove(prop), WHITE);
+      break;
+
+    case SGFPL:
+      /* Player property - who is next to move? */
+      if (prop->value[0] == 'w' || prop->value[0] == 'W')
+       to_move = WHITE;
+      else
+       to_move = BLACK;
+      break;
+
+    case SGFW:
+    case SGFB:
+      /* An ordinary move. */
+      to_move = (prop->name == SGFW) ? WHITE : BLACK;
+      gnugo_play_move(get_sgfmove(prop), to_move);
+      to_move = OTHER_COLOR(to_move);
+      break;
+    }
+  }
+
+  return to_move;
+}
+
+
+/* Interface to place_fixed_handicap. Sets up handicap stones and
+ * updates the sgf file.
+ */
+int
+gnugo_sethand(int desired_handicap, SGFNode *node)
+{
+  place_fixed_handicap(desired_handicap);
+  sgffile_recordboard(node);
+  return handicap;
+}
+
+
+/* Put upper and lower score estimates into *upper, *lower and
+ * return the average. A positive score favors white. In computing
+ * the upper bound, CRITICAL dragons are awarded to white; in
+ * computing the lower bound, they are awarded to black.
+ */
+
+float
+gnugo_estimate_score(float *upper, float *lower)
+{
+  silent_examine_position(EXAMINE_DRAGONS);
+  if (upper != NULL)
+    *upper = white_score;
+  if (lower != NULL)
+    *lower = black_score;
+  return ((white_score + black_score) / 2.0);
+}
+
+
+/* ================================================================ */
+/*                             Gameinfo                             */
+/* ================================================================ */
+
+
+/*
+ * Initialize the structure.
+ */
+
+void
+gameinfo_clear(Gameinfo *gameinfo)
+{
+  gnugo_clear_board(board_size);
+  gameinfo->handicap = 0;
+  gameinfo->to_move = BLACK;
+  sgftree_clear(&gameinfo->game_record);
+
+  /* Info relevant to the computer player. */
+  gameinfo->computer_player = WHITE; /* Make an assumption. */
+}
+
+
+/*
+ * Print a gameinfo.
+ */
+
+void
+gameinfo_print(Gameinfo *gameinfo)
+{
+  printf("Board Size:   %d\n", board_size);
+  printf("Handicap      %d\n", gameinfo->handicap);
+  printf("Komi:         %.1f\n", komi);
+  printf("Move Number:  %d\n", movenum);
+  printf("To Move:      %s\n", color_to_string(gameinfo->to_move));
+
+  printf("Computer player: ");
+  if (gameinfo->computer_player == WHITE)
+    printf("White\n");
+  else if (gameinfo->computer_player == BLACK)
+    printf("Black\n");
+  else if (gameinfo->computer_player == EMPTY)
+    printf("Both (solo)\n");
+  else
+    printf("Nobody\n");
+}
+
+/*
+ * Play the moves in an SGF tree. Walk the main variation, actioning
+ * the properties into the playing board.
+ *
+ * Returns the color of the next move to be made. The returned color
+ * being EMPTY signals a failure to load the file.
+ *
+ * Head is an sgf tree. 
+ * Untilstr is an optional string of the form either 'L12' or '120'
+ * which tells it to stop playing at that move or move-number.
+ * When debugging, this is the location of the move being examined.
+ */
+
+int
+gameinfo_play_sgftree_rot(Gameinfo *gameinfo, SGFTree *tree,
+                         const char *untilstr, int orientation)
+{
+  int bs;
+  int next = BLACK;
+  int untilmove = -1; /* Neither a valid move nor pass. */
+  int until = 9999;
+  
+  if (!sgfGetIntProperty(tree->root, "SZ", &bs))
+    bs = 19;
+
+  if (!check_boardsize(bs, stderr))
+    return EMPTY;
+  
+  handicap = 0;
+  if (sgfGetIntProperty(tree->root, "HA", &handicap) && handicap > 1)
+    next = WHITE;
+  gameinfo->handicap = handicap;
+  
+  if (handicap > bs * bs - 1 || handicap < 0) {
+    gprintf(" Handicap HA[%d] is unreasonable.\n Modify SGF file.\n",
+           handicap);
+    return EMPTY;
+  }
+  
+  gnugo_clear_board(bs);
+
+  if (!sgfGetFloatProperty(tree->root, "KM", &komi)) {
+    if (gameinfo->handicap == 0)
+      komi = 5.5;
+    else
+      komi = 0.5;
+  }
+
+  /* Now we can safely parse the until string (which depends on board size). */
+  if (untilstr) {
+    if (*untilstr > '0' && *untilstr <= '9') {
+      until = atoi(untilstr);
+      DEBUG(DEBUG_LOADSGF, "Loading until move %d\n", until);
+    }
+    else {
+      untilmove = string_to_location(board_size, untilstr);
+      DEBUG(DEBUG_LOADSGF, "Loading until move at %1m\n", untilmove);
+    }
+  }
+  
+  /* Finally, we iterate over all the properties of all the
+   * nodes, actioning them. We follow only the 'child' pointers,
+   * as we have no interest in variations.
+   *
+   * The sgf routines map AB[aa][bb][cc] into AB[aa]AB[bb]AB[cc]
+   */
+  for (tree->lastnode = NULL; sgftreeForward(tree);) {
+    SGFProperty *prop;
+    int move;
+      
+    for (prop = tree->lastnode->props; prop; prop = prop->next) {
+      DEBUG(DEBUG_LOADSGF, "%c%c[%s]\n", 
+           prop->name & 0xff, (prop->name >> 8), prop->value);
+      switch (prop->name) {
+      case SGFAB:
+      case SGFAW:
+       /* Generally the last move is unknown when the AB or AW
+        * properties are encountered. These are used to set up
+        * a board position (diagram) or to place handicap stones
+        * without reference to the order in which the stones are
+        * placed on the board.
+        */
+       move = rotate1(get_sgfmove(prop), orientation);
+       if (board[move] != EMPTY)
+         gprintf("Illegal SGF! attempt to add a stone at occupied point %1m\n",
+                 move);
+       else
+         add_stone(move, prop->name == SGFAB ? BLACK : WHITE);
+       break;
+             
+      case SGFPL:
+       /* Due to a bad comment in the SGF FF3 definition (in the
+         * "Alphabetical list of properties" section) some
+         * applications encode the colors with 1 for black and 2 for
+         * white.
+        */
+       if (prop->value[0] == 'w'
+           || prop->value[0] == 'W'
+           || prop->value[0] == '2')
+         next = WHITE;
+       else
+         next = BLACK;
+       /* following really should not be needed for proper sgf file */
+       if (stones_on_board(GRAY) == 0 && next == WHITE) {
+         place_fixed_handicap(gameinfo->handicap);
+         sgfOverwritePropertyInt(tree->root, "HA", handicap);
+       }
+       break;
+             
+      case SGFW:
+      case SGFB:
+       next = prop->name == SGFW ? WHITE : BLACK;
+       /* following really should not be needed for proper sgf file */
+       if (stones_on_board(GRAY) == 0 && next == WHITE) {
+         place_fixed_handicap(gameinfo->handicap);
+         sgfOverwritePropertyInt(tree->root, "HA", handicap);
+       }
+
+       move = get_sgfmove(prop);
+       if (move == untilmove || movenum == until - 1) {
+         gameinfo->to_move = next;
+         /* go back so that variant will be added to the proper node */
+         sgftreeBack(tree);
+         return next;
+       }
+
+       move = rotate1(move, orientation);
+       if (move == PASS_MOVE || board[move] == EMPTY) {
+         gnugo_play_move(move, next);
+         next = OTHER_COLOR(next);
+       }
+       else {
+         gprintf("WARNING: Move off board or on occupied position found in sgf-file.\n");
+         gprintf("Move at %1m ignored, trying to proceed.\n", move);
+         gameinfo->to_move = next;
+         return next;
+       }
+
+       break;
+
+      case SGFIL:
+       /* The IL property is not a standard SGF property but
+        * is used by GNU Go to mark illegal moves. If a move
+        * is found marked with the IL property which is a ko
+        * capture then that ko capture is deemed illegal and
+        * (board_ko_i, board_ko_j) is set to the location of
+        * the ko.
+        */
+       move = rotate1(get_sgfmove(prop), orientation);
+
+       if (board_size > 1)
+       {
+         int move_color;
+
+         if (ON_BOARD(NORTH(move)))
+           move_color = OTHER_COLOR(board[NORTH(move)]);
+         else 
+           move_color = OTHER_COLOR(board[SOUTH(move)]);
+         if (is_ko(move, move_color, NULL))
+           board_ko_pos = move;
+       }
+       break;
+      }
+    }
+  }
+
+  gameinfo->to_move = next;
+  return next;
+}
+
+/* Same as previous function, using standard orientation */
+
+int
+gameinfo_play_sgftree(Gameinfo *gameinfo, SGFTree *tree, const char *untilstr)
+{
+  return gameinfo_play_sgftree_rot(gameinfo, tree, untilstr, 0);
+}
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/liberty.h b/engine/liberty.h
new file mode 100644 (file)
index 0000000..0bddff5
--- /dev/null
@@ -0,0 +1,1065 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _LIBERTY_H_
+#define _LIBERTY_H_
+
+#include "board.h"
+#include "hash.h"
+#include "gnugo.h"
+#include "winsocket.h"
+
+/* ================================================================ */
+/*                           public variables                       */
+/* ================================================================ */
+
+
+/* ================================================================ */
+
+
+#define FALSE_EYE          1
+#define HALF_EYE           2
+
+
+#define REVERSE_RESULT(result)         (WIN - result)
+
+
+void start_timer(int n);
+double time_report(int n, const char *occupation, int move, double mintime);
+void showstats(void);
+void clearstats(void);
+
+void transformation_init(void);
+
+void ascii_report_worm(char *string);
+void report_dragon(FILE *outfile, int pos);
+void ascii_report_dragon(char *string);
+struct dragon_data2 *dragon2_func(int pos);
+
+/* Routine names used by persistent and non-persistent caching schemes. */
+enum routine_id {
+  OWL_ATTACK,
+  OWL_DEFEND,
+  SEMEAI,
+  FIND_DEFENSE,
+  ATTACK,
+  CONNECT,
+  DISCONNECT,
+  BREAK_IN,
+  BLOCK_OFF,
+  OWL_THREATEN_ATTACK,
+  OWL_THREATEN_DEFENSE,
+  OWL_DOES_DEFEND,
+  OWL_DOES_ATTACK,
+  OWL_CONNECTION_DEFENDS,
+  OWL_SUBSTANTIAL,
+  OWL_CONFIRM_SAFETY,
+  ANALYZE_SEMEAI,
+  NUM_CACHE_ROUTINES
+};
+
+#define ROUTINE_NAMES \
+  "owl_attack", \
+  "owl_defend", \
+  "semeai", \
+  "find_defense", \
+  "attack", \
+  "connect", \
+  "disconnect", \
+  "break_in", \
+  "block_off", \
+  "owl_threaten_attack", \
+  "owl_threatend_defense", \
+  "owl_does_defend", \
+  "owl_does_attack", \
+  "owl_connection_defends", \
+  "owl_substantial", \
+  "owl_confirm_safety", \
+  "analyze_semeai"
+
+/* To prioritize between different types of reading, we give a cost
+ * ranking to each of the routines above:
+ *
+ * 4 semeai
+ * 3 owl
+ * 2 break-in
+ * 1 connection
+ * 0 tactical reading
+ *
+ * -1 is left at the end for a consistency check.
+ */
+#define ROUTINE_COSTS \
+  3, 3, 4, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, -1
+  
+
+const char *routine_id_to_string(enum routine_id routine);
+
+
+/* This is used for both the dragon status and safety fields.
+ * Also used for unconditional status in struct worm_data and for the
+ * final status computed by the aftermath code.
+ */
+enum dragon_status {
+  DEAD,
+  ALIVE,
+  CRITICAL,
+  UNKNOWN,
+  UNCHECKED,
+  CAN_THREATEN_ATTACK,
+  CAN_THREATEN_DEFENSE, 
+  INESSENTIAL,
+  TACTICALLY_DEAD,
+  ALIVE_IN_SEKI,
+  STRONGLY_ALIVE,
+  INVINCIBLE,
+  INSUBSTANTIAL,
+  WHITE_TERRITORY,
+  BLACK_TERRITORY,
+  DAME,
+  NUM_DRAGON_STATUS
+};
+
+#define DRAGON_STATUS_NAMES \
+  "dead", \
+  "alive", \
+  "critical", \
+  "unknown", \
+  "unchecked", \
+  "can threaten attack", \
+  "can threaten defense", \
+  "inessential", \
+  "tactically dead", \
+  "alive in seki", \
+  "strongly alive", \
+  "invincible", \
+  "insubstantial", \
+  "white_territory", \
+  "black_territory", \
+  "dame"
+
+const char *status_to_string(enum dragon_status status);
+
+
+/* Forward struct declarations. */
+struct pattern;
+struct pattern_db;
+struct fullboard_pattern;
+struct corner_pattern;
+struct corner_db;
+struct half_eye_data;
+struct movelist;
+
+/*
+ * Try to match a pattern in the database to the board. Callbacks for
+ * each match.
+ */
+typedef void (*matchpat_callback_fn_ptr)(int anchor, int color,
+                                         struct pattern *, int rotation,
+                                         void *data);
+typedef void (*fullboard_matchpat_callback_fn_ptr)(int move,
+                                                   struct fullboard_pattern *,
+                                                   int rotation);
+typedef void (*corner_matchpat_callback_fn_ptr)(int move, int color,
+                                               struct corner_pattern *pattern,
+                                               int trans,
+                                               int *stones, int num_stones);
+void matchpat(matchpat_callback_fn_ptr callback, int color,
+             struct pattern_db *pdb, void *callback_data,
+             signed char goal[BOARDMAX]);
+void matchpat_goal_anchor(matchpat_callback_fn_ptr callback, int color,
+             struct pattern_db *pdb, void *callback_data,
+             signed char goal[BOARDMAX], int anchor_in_goal);
+void fullboard_matchpat(fullboard_matchpat_callback_fn_ptr callback,
+                       int color, struct fullboard_pattern *pattern);
+void corner_matchpat(corner_matchpat_callback_fn_ptr callback, int color,
+                    struct corner_db *database);
+void dfa_match_init(void);
+
+void reading_cache_init(int bytes);
+void reading_cache_clear(void);
+float reading_cache_default_size(void);
+
+/* reading.c */
+int attack(int str, int *move);
+int find_defense(int str, int *move);
+int attack_and_defend(int str,
+                     int *attack_code, int *attack_point,
+                     int *defend_code, int *defense_point);
+int attack_either(int astr, int bstr);
+int defend_both(int astr, int bstr);
+int break_through(int apos, int bpos, int cpos);
+int attack_threats(int pos, int max_points, int moves[], int codes[]);
+
+int restricted_defend1(int str, int *move,
+                      int num_forbidden_moves, int *forbidden_moves);
+int restricted_attack2(int str, int *move,
+                      int num_forbidden_moves, int *forbidden_moves);
+
+int simple_ladder(int str, int *move);
+#define MOVE_ORDERING_PARAMETERS 67
+void tune_move_ordering(int params[MOVE_ORDERING_PARAMETERS]);
+void draw_reading_shadow(void);
+
+/* persistent.c */
+void persistent_cache_init(void);
+void purge_persistent_caches(void);
+void clear_persistent_caches(void);
+
+int search_persistent_reading_cache(enum routine_id routine, int str,
+                                   int *result, int *move);
+void store_persistent_reading_cache(enum routine_id routine, int str,
+                                   int result, int move, int nodes);
+void reading_hotspots(float values[BOARDMAX]);
+int search_persistent_connection_cache(enum routine_id routine,
+                                      int str1, int str2,
+                                      int *result, int *move);
+void store_persistent_connection_cache(enum routine_id routine,
+                                      int str1, int str2,
+                                      int result, int move,
+                                      int tactical_nodes,
+                                      signed char connection_shadow[BOARDMAX]);
+int search_persistent_breakin_cache(enum routine_id routine,
+                                   int str, Hash_data *goal_hash,
+                                   int breakin_node_limit,
+                                   int *result, int *move);
+void store_persistent_breakin_cache(enum routine_id routine,
+                                   int str, Hash_data *goal_hash,
+                                   int result, int move,
+                                   int tactical_nodes,
+                                   int breakin_node_limit,
+                                   signed char breakin_shadow[BOARDMAX]);
+int search_persistent_owl_cache(enum routine_id routine,
+                               int apos, int bpos, int cpos,
+                               int *result, int *move, int *move2,
+                               int *certain);
+void store_persistent_owl_cache(enum routine_id routine,
+                               int apos, int bpos, int cpos,
+                               int result, int move, int move2, int certain,
+                               int tactical_nodes, signed char goal[BOARDMAX],
+                               int goal_color);
+void owl_hotspots(float values[BOARDMAX]);
+int search_persistent_semeai_cache(enum routine_id routine,
+                                  int apos, int bpos, int cpos, int color,
+                                  Hash_data *goal_hash,
+                                  int *resulta, int *resultb,
+                                  int *move, int *certain);
+void store_persistent_semeai_cache(enum routine_id routine,
+                                  int apos, int bpos, int cpos, int color,
+                                  Hash_data *goal_hash,
+                                  int resulta, int resultb,
+                                  int move, int certain, int tactical_nodes,
+                                  signed char goala[BOARDMAX],
+                                  signed char goalb[BOARDMAX]);
+
+
+/* readconnect.c */
+int string_connect(int str1, int str2, int *move);
+int disconnect(int str1, int str2, int *move);
+int fast_disconnect(int str1, int str2, int *move);
+int non_transitivity(int str1, int str2, int str3, int *move);
+
+int break_in(int str, const signed char goal[BOARDMAX], int *move);
+int block_off(int str1, const signed char goal[BOARDMAX], int *move);
+
+int obvious_false_eye(int pos, int color);
+void estimate_lunch_eye_value(int lunch, int *min, int *probable, int *max,
+                             int appreciate_one_two_lunches);
+int owl_topological_eye(int pos, int color);
+int vital_chain(int pos);
+int confirm_safety(int move, int color, int *defense_point,
+                  signed char safe_stones[BOARDMAX]);
+int dragon_weak(int pos);
+float dragon_weakness(int pos, int ignore_dead_dragons);
+int size_of_biggest_critical_dragon(void);
+void change_dragon_status(int dr, enum dragon_status status);
+float blunder_size(int move, int color, int *defense_point,
+                  signed char safe_stones[BOARDMAX]);
+void set_depth_values(int level, int report_levels);
+void modify_depth_values(int n);
+void increase_depth_values(void);
+void decrease_depth_values(void);
+int get_depth_modification(void);
+
+int safe_move(int move, int color);
+int does_secure(int color, int move, int pos);
+
+void compute_new_dragons(int dragon_origins[BOARDMAX]);
+void join_dragons(int d1, int d2);
+int dragon_escape(signed char goal[BOARDMAX], int color,
+                 signed char escape_value[BOARDMAX]);
+void compute_refined_dragon_weaknesses(void);
+void compute_strategic_sizes(void);
+
+struct eyevalue;
+void compute_dragon_genus(int d, struct eyevalue *genus, int eye_to_exclude);
+float crude_dragon_weakness(int safety, struct eyevalue *genus, int has_lunch,
+                           float moyo_value, float escape_route);
+
+int is_same_dragon(int d1, int d2);
+int are_neighbor_dragons(int d1, int d2);
+void mark_dragon(int pos, signed char mx[BOARDMAX], signed char mark);
+int first_worm_in_dragon(int d);
+int next_worm_in_dragon(int w);
+int lively_dragon_exists(int color);
+void compute_dragon_influence(void);
+void set_strength_data(int color, signed char safe_stones[BOARDMAX],
+                      float strength[BOARDMAX]);
+void mark_inessential_stones(int color, signed char safe_stones[BOARDMAX]);
+
+void add_cut(int apos, int bpos, int move);
+void cut_reasons(int color);
+
+void get_lively_stones(int color, signed char safe_stones[BOARDMAX]);
+int is_same_worm(int w1, int w2);
+int is_worm_origin(int w, int pos);
+void propagate_worm(int pos);
+void find_cuts(void);
+void find_connections(void);
+
+/* movelist.c */
+int movelist_move_known(int move, int max_points, int points[], int codes[]);
+void movelist_change_point(int move, int code, int max_points, 
+                          int points[], int codes[]);
+
+/* surround.c */
+int compute_surroundings(int pos, int apos, int showboard,
+                        int *surround_size);
+int is_surrounded(int pos);
+int does_surround(int move, int dragon);
+void reset_surround_data(void);
+int surround_map(int dr, int pos);
+
+/* functions to add (or remove) move reasons */
+void collect_move_reasons(int color);
+
+void clear_move_reasons(void);
+void add_lunch(int eater, int food);
+void add_attack_move(int pos, int ww, int code);
+void add_defense_move(int pos, int ww, int code);
+void add_attack_threat_move(int pos, int ww, int code);
+void remove_attack_threat_move(int pos, int ww);
+void add_defense_threat_move(int pos, int ww, int code);
+void add_connection_move(int pos, int dr1, int dr2);
+void add_cut_move(int pos, int dr1, int dr2);
+void add_antisuji_move(int pos);
+void add_semeai_move(int pos, int dr);
+void add_potential_semeai_attack(int pos, int dr1, int dr2);
+void add_potential_semeai_defense(int pos, int dr1, int dr2);
+void add_semeai_threat(int pos, int dr);
+
+void add_owl_attack_move(int pos, int dr, int kworm, int code);
+void add_owl_defense_move(int pos, int dr, int code);
+void add_owl_attack_threat_move(int pos, int dr, int code);
+void add_owl_defense_threat_move(int pos, int dr, int code);
+void add_owl_prevent_threat_move(int pos, int dr);
+void add_owl_uncertain_defense_move(int pos, int dr);
+void add_owl_uncertain_attack_move(int pos, int dr);
+void add_gain_move(int pos, int target1, int target2);
+void add_loss_move(int pos, int target1, int target2);
+
+void add_my_atari_atari_move(int pos, int size);
+void add_your_atari_atari_move(int pos, int size);
+void add_vital_eye_move(int pos, int eyespace, int color);
+void add_invasion_move(int pos);
+void add_expand_territory_move(int pos);
+void add_expand_moyo_move(int pos);
+void add_strategical_attack_move(int pos, int dr);
+void add_strategical_defense_move(int pos, int dr);
+void add_worthwhile_threat_move(int pos);
+void add_replacement_move(int from, int to, int color);
+
+/* Parameters to add_either_move and add_all_move */
+#define ATTACK_STRING  1
+#define DEFEND_STRING  2
+void add_either_move(int pos, int reason1, int target1,
+                    int reason2, int target2);
+void add_all_move(int pos, int reason1, int target1,
+                 int reason2, int target2);
+
+int set_minimum_move_value(int pos, float value);
+void set_maximum_move_value(int pos, float value);
+void set_minimum_territorial_value(int pos, float value);
+void set_maximum_territorial_value(int pos, float value);
+void add_shape_value(int pos, float value);
+void add_followup_value(int pos, float value);
+void add_reverse_followup_value(int pos, float value);
+int list_move_reasons(FILE *out, int pos);
+void print_all_move_values(FILE *output);
+void record_top_move(int move, float val);
+void remove_top_move(int move);
+void scale_randomness(int pos, float scaling);
+void compute_move_probabilities(float probabilities[BOARDMAX]);
+
+void register_good_attack_threat(int move, int target);
+int is_known_good_attack_threat(int move, int target);
+
+void register_known_safe_move(int move);
+int is_known_safe_move(int move);
+
+int get_attack_threats(int pos, int max_strings, int strings[]);
+int get_defense_threats(int pos, int max_strings, int strings[]);
+void get_saved_worms(int pos, signed char saved[BOARDMAX]);
+void get_saved_dragons(int pos, signed char saved[BOARDMAX]);
+void mark_safe_stones(int color, int move_pos,
+                     const signed char saved_dragons[BOARDMAX],
+                     const signed char saved_worms[BOARDMAX],
+                     signed char safe_stones[BOARDMAX]);
+
+
+int owl_lively(int pos);
+int owl_escape_value(int pos);
+int owl_goal_dragon(int pos);
+int owl_eyespace(int pos);
+int owl_big_eyespace(int pos);
+int owl_mineye(int pos);
+int owl_maxeye(int pos);
+int owl_proper_eye(int pos);
+int owl_eye_size(int pos);
+int owl_lunch(int str);
+int owl_strong_dragon(int pos);
+void owl_reasons(int color);
+
+void unconditional_life(int unconditional_territory[BOARDMAX], int color);
+void clear_unconditionally_meaningless_moves(void);
+void find_unconditionally_meaningless_moves(int unconditional_territory[BOARDMAX],
+                                           int color);
+int unconditionally_meaningless_move(int pos, int color,
+                                    int *replacement_move);
+void unconditional_move_reasons(int color);
+
+void find_superstring(int str, int *num_stones, int *stones);
+void find_superstring_conservative(int str, int *num_stones, int *stones);
+void find_superstring_liberties(int str, int *liberties, int *libs,
+                                int liberty_cap);
+void find_proper_superstring_liberties(int str, int *liberties, int *libs, 
+                                       int liberty_cap);
+void find_superstring_stones_and_liberties(int str, int *num_stones,
+                                          int *stones, int *liberties,
+                                          int *libs, int liberty_cap);
+void superstring_chainlinks(int str, int *num_adj, int adj[MAXCHAIN],
+                            int liberty_cap);
+void proper_superstring_chainlinks(int str, int *num_adj, 
+                                   int adj[MAXCHAIN], int liberty_cap);
+
+int place_fixed_handicap(int handicap); /* place stones on board only */
+int place_free_handicap(int handicap); /* place stones on board only */
+int free_handicap_remaining_stones(void);
+int free_handicap_total_stones(void);
+
+
+/* Various different strategies for finding a move */
+void fuseki(int color);
+void semeai(void);
+void semeai_move_reasons(int color);
+void shapes(int color);
+void endgame(int color);
+void endgame_shapes(int color);
+
+void combinations(int color);
+int atari_atari(int color, int *attack_move,
+               signed char defense_moves[BOARDMAX],
+               int save_verbose);
+int atari_atari_confirm_safety(int color, int tpos, int *move, int minsize,
+                              const signed char saved_dragons[BOARDMAX],
+                              const signed char saved_worms[BOARDMAX]);
+
+int atari_atari_blunder_size(int color, int tpos,
+                            signed char defense_moves[BOARDMAX],
+                            const signed char safe_stones[BOARDMAX]);
+
+int review_move_reasons(int *move, float *value, int color,
+                       float pure_threat_value, float our_score,
+                       int allowed_moves[BOARDMAX],
+                       int use_thrashing_dragon_heuristics);
+void prepare_move_influence_debugging(int pos, int color);
+int fill_liberty(int *move, int color);
+int aftermath_genmove(int color, int do_capture_dead_stones,
+                     int allowed_moves[BOARDMAX]);
+enum dragon_status aftermath_final_status(int color, int pos);
+
+int mc_get_size_of_pattern_values_table(void);
+int mc_load_patterns_from_db(const char *filename, unsigned int *values);
+void mc_init_patterns(const unsigned int *values);
+int choose_mc_patterns(char *name);
+void list_mc_patterns(void);
+
+void uct_genmove(int color, int *move, int *forbidden_moves,
+                int *allowed_moves, int nodes, float *move_values,
+                int *move_frequencies);
+
+int owl_attack(int target, int *attack_point, int *certain, int *kworm);
+int owl_defend(int target, int *defense_point, int *certain, int *kworm);
+int owl_threaten_attack(int target, int *attack1, int *attack2);
+int owl_threaten_defense(int target, int *defend1, int *defend2);
+int owl_does_defend(int move, int target, int *kworm);
+int owl_confirm_safety(int move, int target, int *defense_point, int *kworm);
+int owl_does_attack(int move, int target, int *kworm);
+int owl_connection_defends(int move, int target1, int target2);
+int owl_substantial(int str);
+void owl_analyze_semeai(int apos, int bpos, 
+                       int *resulta, int *resultb, int *semeai_move,
+                       int owl, int *semeai_result_certain);
+void owl_analyze_semeai_after_move(int move, int color, int apos, int bpos,
+                                  int *resulta, int *resultb,
+                                  int *semeai_move, int owl,
+                                  int *semeai_result_certain,
+                                  int recompute_dragons);
+
+void set_limit_search(int value);
+void set_search_diamond(int pos);
+void reset_search_mask(void);
+void set_search_mask(int pos, int value);
+int oracle_play_move(int pos, int color);
+void consult_oracle(int color);
+void summon_oracle(void);
+void oracle_loadsgf(char *infilename, char *untilstring);
+int oracle_threatens(int move, int target);
+int within_search_area(int pos);
+int metamachine_genmove(int color, float *value);
+void draw_search_area(void);
+
+int genmove_restricted(int color, int allowed_moves[BOARDMAX]);
+
+void change_attack(int str, int move, int acode);
+void change_defense(int str, int move, int dcode);
+void change_attack_threat(int str, int move, int acode);
+void change_defense_threat(int str, int move, int dcode);
+int attack_move_known(int move, int str);
+int defense_move_known(int move, int str);
+int attack_threat_move_known(int move, int str);
+int defense_threat_move_known(int move, int str);
+void worm_reasons(int color);
+
+int semeai_move_reason_known(int move, int dr);
+
+int does_attack(int move, int str);
+int does_defend(int move, int str);
+int double_atari(int move, int color, float *value,
+                signed char safe_stones[BOARDMAX]);
+int playing_into_snapback(int move, int color);
+int play_attack_defend_n(int color, int do_attack, int num_moves, ...);
+int play_attack_defend2_n(int color, int do_attack, int num_moves, ...);
+int play_break_through_n(int color, int num_moves, ...);
+int play_connect_n(int color, int do_connect, int num_moves, ...);
+int play_lib_n(int color, int num_moves, ...);
+int cut_possible(int pos, int color);
+int defend_against(int move, int color, int apos);
+int somewhere(int color, int check_alive, int num_moves, ...);
+int visible_along_edge(int color, int apos, int bpos);
+int test_symmetry_after_move(int move, int color, int strict);
+
+/* Printmoyo values, specified by -m flag. */
+#define PRINTMOYO_TERRITORY         0x01
+#define PRINTMOYO_MOYO              0x02
+#define PRINTMOYO_AREA              0x04
+/* The following have been borrowed by the influence functions below. */
+#define PRINTMOYO_INITIAL_INFLUENCE 0x08
+#define PRINTMOYO_PRINT_INFLUENCE   0x10
+#define PRINTMOYO_NUMERIC_INFLUENCE 0x20
+#define PRINTMOYO_PERMEABILITY      0x40
+#define PRINTMOYO_STRENGTH          0x80
+#define PRINTMOYO_ATTENUATION       0x100
+#define PRINTMOYO_VALUE_TERRITORY   0x200
+
+/* These values are used to communicate whether stones are safe or
+ * have been saved, when computing influence.
+ */
+#define INFLUENCE_SAFE_STONE   1
+#define INFLUENCE_SAVED_STONE  2
+
+/* These values are used to communicate the status of stones when analyzing
+ * a move for potentially being a blunder.
+ */
+/*     dead            0 */
+#define SAFE_STONE     1
+#define OWL_SAVED_STONE        2
+
+/* This format is used when exporting the moyo segmentation. */
+#define MAX_MOYOS MAX_BOARD*MAX_BOARD
+
+struct moyo_data
+{
+  int number; /* Number of moyos. */
+  int segmentation[BOARDMAX]; /* Numbers the moyos. */
+  int size[MAX_MOYOS];
+  int owner[MAX_MOYOS];
+  float territorial_value[MAX_MOYOS];
+};
+
+/* We use a forward declaration of influence_data so that the rest
+ * of the engine can reference influence data. It can only be accessed
+ * in influence.c, however!
+ */
+struct influence_data;
+extern struct influence_data initial_black_influence;
+extern struct influence_data initial_white_influence;
+extern struct influence_data move_influence;
+extern struct influence_data followup_influence;
+
+#define INITIAL_INFLUENCE(color) ((color) == WHITE ? \
+                                   &initial_white_influence \
+                                 : &initial_black_influence)
+#define OPPOSITE_INFLUENCE(color) (INITIAL_INFLUENCE(OTHER_COLOR(color)))
+
+#define DEFAULT_STRENGTH 100.0
+
+/* Influence functions. */
+void compute_influence(int color, const signed char safe_stones[BOARDMAX],
+                      const float strength[BOARDMAX],
+                      struct influence_data *q,
+                      int move, const char *trace_message);
+void compute_followup_influence(const struct influence_data *base,
+                               struct influence_data *q, 
+                               int move, const char *trace_message);
+void compute_escape_influence(int color,
+                             const signed char safe_stones[BOARDMAX],
+                             const signed char goal[BOARDMAX],
+                             const float strength[BOARDMAX],
+                              signed char escape_value[BOARDMAX]);
+
+float influence_delta_territory(const struct influence_data *base,
+                               const struct influence_data *q, int color,
+                               int move);
+int retrieve_delta_territory_cache(int pos, int color, float *move_value,
+                                  float *followup_value,
+                                  const struct influence_data *base,
+                                  Hash_data safety_hash);
+void store_delta_territory_cache(int pos, int color, float move_value,
+                                float followup_value,
+                                const struct influence_data *base,
+                                Hash_data safety_hash);
+
+int whose_territory(const struct influence_data *q, int pos);
+int whose_moyo(const struct influence_data *q, int pos);
+int whose_moyo_restricted(const struct influence_data *q, int pos);
+int whose_area(const struct influence_data *q, int pos);
+float influence_territory(const struct influence_data *q, int pos, int color);
+void influence_get_territory_segmentation(struct influence_data *q,
+                                         struct moyo_data *moyo);
+void get_influence(const struct influence_data *q,
+                  float white_influence[BOARDMAX],
+                  float black_influence[BOARDMAX],
+                  float white_strength[BOARDMAX],
+                  float black_strength[BOARDMAX],
+                  float white_attenuation[BOARDMAX], 
+                  float black_attenuation[BOARDMAX],
+                  float white_permeability[BOARDMAX],
+                  float black_permeability[BOARDMAX],
+                  float territory_value[BOARDMAX],
+                  int influence_regions[BOARDMAX],
+                  int non_territory[BOARDMAX]);
+float influence_score(const struct influence_data *q, int chinese_rules);
+float game_status(int color);
+void influence_mark_non_territory(int pos, int color);
+int influence_considered_lively(const struct influence_data *q, int pos);
+void influence_erase_territory(struct influence_data *q, int pos, int color);
+
+void break_territories(int color_to_move, struct influence_data *q,
+                      int store, int pos);
+void clear_break_in_list(void);
+void break_in_move_reasons(int color);
+
+void choose_strategy(int color, float our_score, float game_status);
+
+/* Eye space functions. */
+int is_eye_space(int pos);
+int is_proper_eye_space(int pos);
+int is_marginal_eye_space(int pos);
+int max_eye_value(int pos);
+void test_eyeshape(int eyesize, int *eye_vertices);
+int analyze_eyegraph(const char *coded_eyegraph, struct eyevalue *value,
+                    char *analyzed_eyegraph);
+
+
+/* debugging support */
+void goaldump(const signed char goal[BOARDMAX]);
+void move_considered(int move, float value);
+
+
+/* Transformation stuff. */
+#define MAX_OFFSET                     (2*MAX_BOARD - 1) * (2*MAX_BOARD - 1)
+#define OFFSET(dx, dy)\
+  ((dy + MAX_BOARD - 1) * (2*MAX_BOARD - 1) + (dx + MAX_BOARD - 1))
+#define OFFSET_DELTA(dx, dy)           (OFFSET(dx, dy) - OFFSET(0, 0))
+#define CENTER_OFFSET(offset)          (offset - OFFSET(0, 0))
+#define TRANSFORM(offset, trans)       (transformation[offset][trans])
+#define AFFINE_TRANSFORM(offset, trans, delta)\
+  (transformation[offset][trans] + delta)
+#define TRANSFORM2(x, y, tx, ty, trans)\
+  do {\
+    *tx = transformation2[trans][0][0] * (x) + transformation2[trans][0][1] * (y);\
+    *ty = transformation2[trans][1][0] * (x) + transformation2[trans][1][1] * (y);\
+  } while (0)
+
+
+/* ================================================================ */
+/*                         global variables                         */
+/* ================================================================ */
+
+extern int disable_threat_computation;
+extern int disable_endgame_patterns;
+extern int doing_scoring;
+
+/* Reading parameters */
+extern int depth;               /* deep reading cutoff */
+extern int backfill_depth;      /* deep reading cutoff */
+extern int backfill2_depth;     /* deep reading cutoff */
+extern int break_chain_depth;   /* deep reading cutoff */
+extern int superstring_depth;   /* deep reading cutoff */
+extern int branch_depth;        /* deep reading cutoff */
+extern int fourlib_depth;       /* deep reading cutoff */
+extern int ko_depth;            /* deep ko reading cutoff */
+extern int aa_depth;            /* deep global reading cutoff */
+extern int depth_offset;        /* keeps track of temporary depth changes */
+extern int owl_distrust_depth;  /* below this owl trusts the optics code */
+extern int owl_branch_depth;    /* below this owl tries only one variation */
+extern int owl_reading_depth;   /* owl does not read below this depth */
+extern int owl_node_limit;      /* maximum number of nodes considered */
+extern int semeai_branch_depth;
+extern int semeai_branch_depth2;
+extern int semeai_node_limit;
+extern int connect_depth;
+extern int connect_depth2;
+extern int connection_node_limit;
+extern int breakin_depth;
+extern int breakin_node_limit;
+extern int semeai_variations;   /* max variations considered reading semeai */
+extern float best_move_values[10];
+extern int best_moves[10];
+
+extern int experimental_owl_ext;     /* use experimental owl (GAIN/LOSS) */
+extern int experimental_semeai;      /* use experimental semeai module */
+extern int experimental_connections; /* use experimental connection module */
+extern int alternate_connections;    /* use alternate connection module */
+extern int owl_threats;              /* compute owl threats */
+extern int experimental_break_in;    /* use experimental module breakin.c */
+extern int cosmic_gnugo;             /* use center oriented influence */
+extern int large_scale;              /* seek large scale captures */
+
+extern int thrashing_dragon;        /* Dead opponent's dragon trying to live */
+extern signed char thrashing_stone[BOARDMAX];       /* All thrashing stones. */
+
+extern int transformation[MAX_OFFSET][8];
+extern const int transformation2[8][2][2];
+
+
+/* Arrays pointing out the closest worms from each vertex.  The first
+ * one is the closest worms of either color, the last two ones ignore
+ * worms of the other color.  Beyond a certain distance from any worm
+ * no close worm is listed at all.  Only the closest worm is listed
+ * and if more than one are equally close they are all listed. The
+ * number of equally close worms is given in the number_*_worms
+ * arrays. If more than MAX_CLOSE_WORMS are equally close, none is
+ * listed.
+ *
+ * See compute_effective_worm_sizes() in worm.c for details.
+ */
+#define MAX_CLOSE_WORMS 4
+extern int close_worms[BOARDMAX][MAX_CLOSE_WORMS];
+extern int number_close_worms[BOARDMAX];
+extern int close_black_worms[BOARDMAX][MAX_CLOSE_WORMS];
+extern int number_close_black_worms[BOARDMAX];
+extern int close_white_worms[BOARDMAX][MAX_CLOSE_WORMS];
+extern int number_close_white_worms[BOARDMAX];
+
+extern int false_eye_territory[BOARDMAX];
+extern int forced_backfilling_moves[BOARDMAX];
+
+extern double slowest_time;      /* Timing statistics */
+extern int slowest_move;
+extern int slowest_movenum;
+extern double total_time;
+
+
+struct eyevalue {
+  unsigned char a; /* number of eyes if attacker plays first twice */
+  unsigned char b; /* number of eyes if attacker plays first */
+  unsigned char c; /* number of eyes if defender plays first */
+  unsigned char d; /* number of eyes if defender plays first twice */
+};
+
+
+struct half_eye_data {
+  float value;          /* Topological eye value. */
+  unsigned char type;   /* HALF_EYE or FALSE_EYE; */
+  int num_attacks;      /* number of attacking points */
+  int attack_point[4];  /* the moves to attack a topological halfeye */
+  int num_defenses;     /* number of defending points */
+  int defense_point[4]; /* the moves to defend a topological halfeye */
+};
+
+/* array of half-eye data */
+extern struct half_eye_data half_eye[BOARDMAX];
+
+/*
+ * data concerning a worm. A copy is kept at each vertex of the worm.
+ */
+
+#define MAX_TACTICAL_POINTS 10
+
+struct worm_data {
+  int color;         /* its color */
+  int size;          /* its cardinality */
+  float effective_size; /* stones and surrounding spaces */
+  int origin;        /* the origin of the string. Two vertices are in */
+                     /* the same worm iff they have same origin. */
+  int liberties;     /* number of liberties */
+  int liberties2;    /* number of second order liberties */
+  int liberties3;    /* third order liberties (empty vertices at distance 3) */
+  int liberties4;    /* fourth order liberties */
+  int lunch;         /* if lunch != 0 then lunch points to a boundary */
+                     /* worm which can be captured easily. */
+  int cutstone;      /* 1=potential cutting stone; 2=cutting stone */
+  int cutstone2;     /* Number of potential cuts involving the worm. */
+  int genus;         /* number of connected components of the complement, less one */
+  int inessential;   /* 1=inessential worm */
+  int invincible;    /* 1=strongly unconditionally non-capturable */
+  enum dragon_status unconditional_status; /* ALIVE, DEAD, WHITE_TERRITORY,
+                                             BLACK_TERRITORY, UNKNOWN */
+
+  /* The following arrays keeps track of up to MAX_TACTICAL_POINTS
+   * different attack, defense, attack threat, and defense threat
+   * points with corresponding result codes. (0 = loss, 1 = bad ko, 2
+   * = good ko, 3 = win). The arrays are guaranteed to be sorted with
+   * respect to the codes so that the first element contains the best
+   * result.
+   */
+  int attack_points[MAX_TACTICAL_POINTS];
+  int attack_codes[MAX_TACTICAL_POINTS];
+  int defense_points[MAX_TACTICAL_POINTS];
+  int defense_codes[MAX_TACTICAL_POINTS];
+  int attack_threat_points[MAX_TACTICAL_POINTS];
+  int attack_threat_codes[MAX_TACTICAL_POINTS]; 
+  int defense_threat_points[MAX_TACTICAL_POINTS];
+  int defense_threat_codes[MAX_TACTICAL_POINTS];
+};
+
+extern struct worm_data worm[BOARDMAX];
+
+/* Unconditionally meaningless moves. */
+int meaningless_black_moves[BOARDMAX];
+int meaningless_white_moves[BOARDMAX];
+
+/* Surround cache (see surround.c) */
+
+#define MAX_SURROUND 10
+
+struct surround_data {
+  int dragon_number;                  /* number of the (surrounded) beast */
+  signed char surround_map[BOARDMAX]; /* surround map                     */
+};
+
+extern struct surround_data surroundings[MAX_SURROUND];
+extern int surround_pointer;
+
+/*
+ * data concerning a dragon. A copy is kept at each stone of the string.
+ */
+
+struct dragon_data {
+  int color;    /* its color                                                 */
+  int id;       /* the index into the dragon2 array                          */
+  int origin;   /* the origin of the dragon. Two vertices are in the same    */
+                /* dragon iff they have same origin.                         */
+  int size;     /* size of the dragon                                        */
+  float effective_size; /* stones and surrounding spaces                     */
+  enum dragon_status crude_status; /* (ALIVE, DEAD, UNKNOWN, CRITICAL)       */
+  enum dragon_status status;       /* best trusted status                    */
+};
+
+extern struct dragon_data dragon[BOARDMAX];
+
+/* Supplementary data concerning a dragon. Only one copy is stored per
+ * dragon in the dragon2 array.
+ */
+
+#define MAX_NEIGHBOR_DRAGONS 10
+
+struct dragon_data2 {
+  int origin;                         /* the origin of the dragon            */
+  int adjacent[MAX_NEIGHBOR_DRAGONS]; /* adjacent dragons                    */
+  int neighbors;                      /* number of adjacent dragons          */
+  int hostile_neighbors;              /* neighbors of opposite color         */
+
+  int moyo_size;                     /* size of surrounding influence moyo, */
+  float moyo_territorial_value;       /* ...and its territorial value        */
+  enum dragon_status safety;          /* a more detailed status estimate     */
+  float weakness;           /* a continuous estimate of the dragon's safety  */
+  float weakness_pre_owl;   /* dragon safety based on pre-owl computations   */
+  float strategic_size; /* An effective size including weakness of neighbors */
+  int escape_route;         /* a measurement of likelihood of escape         */
+  struct eyevalue genus;    /* the number of eyes (approximately)            */
+  int heye;     /* coordinates of a half eye                                 */
+  int lunch;    /* if lunch != 0 then lunch points to a boundary worm which  */
+                /* can be captured easily.                                   */
+  int surround_status;         /* Is it surrounded?                          */
+  int surround_size;           /* Size of the surrounding area               */
+
+  int semeais;         /* number of semeais in which the dragon is involved  */
+  int semeai_defense_code ;/* Result code for semeai defense.                */
+  int semeai_defense_point;/* Move found by semeai code to rescue dragon     */
+  int semeai_defense_certain;
+  int semeai_defense_target; /* The opponent dragon involved in the semeai   */
+  int semeai_attack_code ; /* Result code for semeai attack.                 */
+  int semeai_attack_point; /* Move found by semeai code to kill dragon       */
+  int semeai_attack_certain;
+  int semeai_attack_target; /* The opponent dragon involved in the semeai    */
+  enum dragon_status owl_threat_status; /* CAN_THREATEN_ATTACK/DEFENSE       */
+  enum dragon_status owl_status; /* (ALIVE, DEAD, UNKNOWN, CRITICAL, UNCHECKED)    */
+  int owl_attack_point;    /* vital point for attack                         */
+  int owl_attack_code;     /* ko result code                                 */
+  int owl_attack_certain;  /* 0 if owl reading node limit is reached         */
+  int owl_attack_node_count;
+  int owl_second_attack_point;/* if attacker gets both attack points, wins   */
+  int owl_defense_point;   /* vital point for defense                        */
+  int owl_defense_code;    /* ko result code                                 */
+  int owl_defense_certain; /* 0 if owl reading node limit is reached         */
+  int owl_second_defense_point;/* if defender gets both attack points, wins  */
+  int owl_attack_kworm;    /* only valid when owl_attack_code is GAIN        */
+  int owl_defense_kworm;   /* only valid when owl_defense_code is LOSS       */
+};
+
+/* dragon2 is dynamically allocated */
+extern int number_of_dragons;
+extern struct dragon_data2 *dragon2;
+
+/* Macros for accessing the dragon2 data with board coordinates and
+ * the dragon data with a dragon id.
+ */
+#if 1 /* Trust DRAGON2 accesses */
+#define DRAGON2(pos) dragon2[dragon[pos].id]
+#else
+struct dragon_data2 *dragon2_func(int pos);
+#define DRAGON2(pos) (*dragon2_func(pos))
+#endif
+
+#define DRAGON(d) dragon[dragon2[d].origin]
+
+extern float white_score, black_score;
+
+/* Global variables to tune strategy. */
+
+extern float minimum_value_weight;
+extern float maximum_value_weight;
+extern float invasion_malus_weight;
+extern float strategical_weight;
+extern float territorial_weight;
+extern float attack_dragon_weight;
+extern float followup_weight;
+
+struct aftermath_data {
+  int white_captured;
+  int black_captured;
+  int white_prisoners;
+  int black_prisoners;
+  int white_territory;
+  int black_territory;
+  int white_area;
+  int black_area;
+  int white_control[BOARDMAX];
+  int black_control[BOARDMAX];
+  enum dragon_status final_status[BOARDMAX];
+};
+
+#define MAX_EYE_ATTACKS 3
+
+struct eye_data {
+  int color;             /* BLACK, WHITE, or GRAY                     */
+  int esize;             /* size of the eyespace                      */
+  int msize;             /* number of marginal vertices               */
+  int origin;            /* The origin                                */
+  struct eyevalue value; /* Number of eyes.                           */
+
+  /* The above fields are constant on the whole eyespace.             */
+  /* ---------------------------------------------------------------- */
+  /* The below fields are not.                                        */
+
+  unsigned char marginal;             /* This vertex is marginal               */
+  unsigned char neighbors;            /* number of neighbors in eyespace       */
+  unsigned char marginal_neighbors;   /* number of marginal neighbors          */
+};
+
+struct vital_eye_points {
+  int attack_points[MAX_EYE_ATTACKS];
+  int defense_points[MAX_EYE_ATTACKS];
+};
+
+extern struct vital_eye_points black_vital_points[BOARDMAX];
+extern struct vital_eye_points white_vital_points[BOARDMAX];
+
+extern struct eye_data white_eye[BOARDMAX];
+extern struct eye_data black_eye[BOARDMAX];
+
+/* Array with the information which was previously stored in the cut
+ * field and in the INHIBIT_CONNECTION bit of the type field in struct
+ * eye_data.
+ */
+extern int cutting_points[BOARDMAX];
+
+/* The following declarations have to be postponed until after the
+ * definition of struct eye_data or struct half_eye_data.
+ */
+
+void compute_eyes(int pos, struct eyevalue *value,
+                  int *attack_point, int *defense_point,
+                  struct eye_data eye[BOARDMAX],
+                  struct half_eye_data heye[BOARDMAX],
+                 int add_moves);
+void compute_eyes_pessimistic(int pos, struct eyevalue *value,
+                              int *pessimistic_min,
+                              int *attack_point, int *defense_point,
+                              struct eye_data eye[BOARDMAX],
+                              struct half_eye_data heye[BOARDMAX]);
+void propagate_eye(int pos, struct eye_data eye[BOARDMAX]);
+int find_eye_dragons(int origin, struct eye_data eye[BOARDMAX], int eye_color,
+                    int dragons[], int max_dragons);
+void make_domains(struct eye_data b_eye[BOARDMAX],
+                  struct eye_data w_eye[BOARDMAX],
+                 int owl_call);
+void partition_eyespaces(struct eye_data eye[BOARDMAX], int color);
+void find_half_and_false_eyes(int color, struct eye_data eye[BOARDMAX],
+                             struct half_eye_data heye[BOARDMAX],
+                             int find_mask[BOARDMAX]);
+
+void set_eyevalue(struct eyevalue *e, int a, int b, int c, int d);
+int min_eye_threat(struct eyevalue *e);
+int min_eyes(struct eyevalue *e);
+int max_eyes(struct eyevalue *e);
+int max_eye_threat(struct eyevalue *e);
+void add_eyevalues(struct eyevalue *e1, struct eyevalue *e2,
+                  struct eyevalue *sum);
+int eye_move_urgency(struct eyevalue *e);
+char *eyevalue_to_string(struct eyevalue *e);
+
+int is_halfeye(struct half_eye_data heye[BOARDMAX], int pos);
+int is_false_eye(struct half_eye_data heye[BOARDMAX], int pos);
+
+#endif  /* _LIBERTY_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/matchpat.c b/engine/matchpat.c
new file mode 100644 (file)
index 0000000..bb57a01
--- /dev/null
@@ -0,0 +1,1137 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+#include "patterns.h"
+#include "dfa.h"
+
+
+/**************************************************************************/
+/* Pattern profiling functions:                                           */
+/**************************************************************************/
+
+
+#if PROFILE_PATTERNS
+/* Initialize pattern profiling fields in one pattern struct array. */
+static void
+clear_profile(struct pattern *pattern)
+{
+  for (; pattern->patn; ++pattern) {
+    pattern->hits = 0;
+    pattern->reading_nodes = 0;
+    pattern->dfa_hits = 0;
+  }
+}
+#endif
+
+#if PROFILE_PATTERNS
+/* Print profiling information for one pattern struct array. */
+static void
+print_profile(struct pattern *pattern, int *total_hits,
+             int *total_nodes, int *total_dfa_hits)
+{
+  for (; pattern->patn; ++pattern)
+    if (pattern->hits > 0) {
+      *total_hits += pattern->hits;
+      *total_nodes += pattern->reading_nodes;
+      *total_dfa_hits += pattern->dfa_hits;
+      fprintf(stderr, "%6d %6d %9d %8.1f %s\n",
+             pattern->dfa_hits,
+             pattern->hits,
+             pattern->reading_nodes,
+             pattern->reading_nodes / (float) pattern->hits, 
+             pattern->name);
+    }
+}
+#endif /* PROFILE_PATTERNS */
+
+
+/* Initialize pattern profiling fields in pattern struct arrays. */
+void
+prepare_pattern_profiling()
+{
+#if PROFILE_PATTERNS
+  clear_profile(pat_db.patterns);
+  clear_profile(attpat_db.patterns);
+  clear_profile(defpat_db.patterns);
+  clear_profile(endpat_db.patterns);
+  clear_profile(conn_db.patterns);
+  clear_profile(influencepat_db.patterns);
+  clear_profile(barrierspat_db.patterns);
+  clear_profile(aa_attackpat_db.patterns);
+  clear_profile(owl_attackpat_db.patterns);
+  clear_profile(owl_vital_apat_db.patterns);
+  clear_profile(owl_defendpat_db.patterns);
+  clear_profile(fusekipat_db.patterns);
+  clear_profile(oracle_db.patterns);
+#else
+  fprintf(stderr,
+         "Warning, no support for pattern profiling in this binary.\n");
+#endif
+}
+
+
+/* Report result of pattern profiling. Only patterns with at least one
+ * match are listed.
+ */
+void
+report_pattern_profiling()
+{
+#if PROFILE_PATTERNS
+  int hits = 0;
+  int dfa_hits = 0;
+  int nodes = 0;
+
+  print_profile(pat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(attpat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(defpat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(endpat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(conn_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(influencepat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(barrierspat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(aa_attackpat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(owl_attackpat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(owl_vital_apat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(owl_defendpat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(fusekipat_db.patterns, &hits, &nodes, &dfa_hits);
+  print_profile(oracle_db.patterns, &hits, &nodes, &dfa_hits);
+  fprintf(stderr, "------ ---------\n");
+  fprintf(stderr, "%6d, %6d %9d\n", dfa_hits, hits, nodes);
+#endif
+}
+
+
+
+/**************************************************************************/
+/* Standard matcher:                                                      */
+/**************************************************************************/
+
+
+/* Forward declarations. */
+
+static void fixup_patterns_for_board_size(struct pattern *pattern);
+static void prepare_for_match(int color);
+static void do_matchpat(int anchor, matchpat_callback_fn_ptr callback,
+                       int color, struct pattern *database,
+                       void *callback_data, signed char goal[BOARDMAX]);
+static void matchpat_loop(matchpat_callback_fn_ptr callback, 
+                         int color, int anchor,
+                         struct pattern_db *pdb, void *callback_data,
+                         signed char goal[BOARDMAX], int anchor_in_goal);
+
+/* Precomputed tables to allow rapid checks on the piece at
+ * the board. This table relies on the fact that color is
+ * 1 or 2.
+ *
+ * For pattern element i,  require  (board[pos] & andmask[i]) == valmask[i]
+ *
+ * .XO) For i=0,1,2, board[pos] & 3 is a no-op, so we check board[pos]
+ *     == valmask
+ * x)   For i=3, we are checking that board[pos] is not color, so AND
+ *     color and we get 0 for either empty or OTHER_COLOR, but color
+ *     if it contains color
+ * o)   Works the other way round for checking it is not X.
+ *
+ *
+ *  gcc allows the entries to be computed at run-time, but that is not ANSI.
+ */
+static const int and_mask[2][8] = {
+  /*  .      X      O     x      o      ,      a      !         color */ 
+  {   3,     3,     3,  WHITE, BLACK,   3,     3,     3   }, /* BLACK */
+  {   3,     3,     3,  BLACK, WHITE,   3,     3,     3   }  /* WHITE */
+};
+
+static const int val_mask[2][8] = {
+  { EMPTY, BLACK, WHITE,  0,     0,   EMPTY, EMPTY, EMPTY},  /* BLACK */ 
+  { EMPTY, WHITE, BLACK,  0,     0,   EMPTY, EMPTY, EMPTY}   /* WHITE */
+};
+
+
+/* and a table for checking classes quickly
+ * class_mask[status][color] contains the mask to look for in class.
+ * ie. if  pat[r].class & class_mask[dragon[pos].status][board[pos]]
+ * is not zero then we reject it
+ * Most elements if class_mask[] are zero - it is a sparse
+ * matrix containing
+ *  CLASS_O in [DEAD][color]
+ *  CLASS_O in [CRITICAL][color]
+ *  CLASS_o in [ALIVE][color]
+ *  CLASS_X in [DEAD][other]
+ *  CLASS_x in [ALIVE][other]
+ *
+ * so eg. if we have a dead white dragon, and we
+ * are checking a pattern for black, then
+ *  class_mask[DEAD][other]  will contain CLASS_X
+ * Then we reject any patterns which have CLASS_X
+ * set in the class bits.
+ *
+ * Making it static guarantees that all fields are
+ * initially set to 0, and we overwrite the ones
+ * we care about each time.
+ */
+  
+static unsigned int class_mask[NUM_DRAGON_STATUS][3];
+
+
+/* In the current implementation, the edge constraints depend on
+ * the board size, because we pad width or height out to the
+ * board size. (This is because it is easy to find the corners
+ * of the rotated pattern, but it is harder to transform the
+ * bitmask of edge constraints.)
+ *
+ * But since version 1.103, board size is variable. Thus we
+ * make a first pass through the table once we know the board
+ * size.
+ *
+ * This should be called once for each pattern database.
+ */
+
+static void
+fixup_patterns_for_board_size(struct pattern *pattern)
+{
+  for (; pattern->patn; ++pattern)
+    if (pattern->edge_constraints != 0) {
+
+      /* If the patterns have been fixed up for a different board size
+       * earlier, we need to undo the modifications that were done
+       * below before we do them anew. The first time this function is
+       * called, this step is effectively a no-op.
+       */
+      
+      if (pattern->edge_constraints & NORTH_EDGE)
+       pattern->maxi = pattern->mini + pattern->height;
+       
+      if (pattern->edge_constraints & SOUTH_EDGE)
+       pattern->mini = pattern->maxi - pattern->height;
+       
+      if (pattern->edge_constraints & WEST_EDGE)
+       pattern->maxj = pattern->minj + pattern->width;
+      
+      if (pattern->edge_constraints & EAST_EDGE)
+       pattern->minj = pattern->maxj - pattern->width;
+      
+      /* we extend the pattern in the direction opposite the constraint,
+       * such that maxi (+ve) - mini (-ve) = board_size-1
+       * Note : the pattern may be wider than the board, so
+       * we need to be a bit careful !
+       */
+      
+      if (pattern->edge_constraints & NORTH_EDGE)
+       if (pattern->maxi < (board_size-1) + pattern->mini)
+         pattern->maxi = (board_size-1) + pattern->mini;
+      
+      if (pattern->edge_constraints & SOUTH_EDGE)
+       if (pattern->mini > pattern->maxi - (board_size-1))
+         pattern->mini = pattern->maxi - (board_size-1);
+      
+      if (pattern->edge_constraints & WEST_EDGE)
+       if (pattern->maxj <  (board_size-1) + pattern->minj)
+         pattern->maxj = (board_size-1) + pattern->minj;
+      
+      if (pattern->edge_constraints & EAST_EDGE)
+       if (pattern->minj > pattern->maxj - (board_size-1))
+         pattern->minj = pattern->maxj - (board_size-1);
+    }
+}
+
+
+/* 
+ * prepare a pattern matching for color point of view
+ */
+static void
+prepare_for_match(int color)
+{
+  int other = OTHER_COLOR(color);
+
+  /* Basic sanity checks. */
+  gg_assert(color != EMPTY);
+
+  /* If we set one of class_mask[XXX][color] and
+   * class_mask[XXX][other], we have to explicitly set or reset the
+   * other as well, since 'color' may change between calls.
+   */
+  class_mask[DEAD][color]     = CLASS_O;
+  class_mask[DEAD][other]     = CLASS_X;
+  class_mask[CRITICAL][color] = CLASS_O;
+  class_mask[CRITICAL][other] = 0;       /* Need to reset this. */
+  class_mask[ALIVE][color]    = CLASS_o;
+  class_mask[ALIVE][other]    = CLASS_x;
+}
+
+
+/*
+ * Try all the patterns in the given array at (anchor). Invoke the
+ * callback for any that matches. Classes X,O,x,o are checked here. It
+ * is up to the callback to process the other classes, and any helper
+ * or autohelper functions.
+ *
+ * If the support of goal[BOARDMAX] is a subset of the board, patterns
+ * are rejected which do not involve this dragon. If goal is a null
+ * pointer, this parameter is ignored.
+ */
+
+static void
+do_matchpat(int anchor, matchpat_callback_fn_ptr callback, int color,
+           struct pattern *pattern, void *callback_data,
+           signed char goal[BOARDMAX]) 
+{
+  const int anchor_test = board[anchor] ^ color;  /* see below */
+  int m = I(anchor);
+  int n = J(anchor);
+  int merged_val;
+
+  /* Basic sanity checks. */
+  ASSERT_ON_BOARD1(anchor);
+
+  /* calculate the merged value around [m][n] for the grid opt */
+  {
+    /* FIXME: Convert this to 2D (using delta[]) but be aware that you'll
+     *       also need to make corresponding changes in mkpat.c!
+     */
+    int i, j;
+    int shift = 30;
+
+    merged_val = 0;
+    for (i = m-1; i <= m+2; ++i)
+      for (j = n-1; j <= n+2; shift -= 2, ++j) {
+       unsigned int this;
+       if (!ON_BOARD2(i, j))
+         this = 3;
+       else if ((this = BOARD(i, j)) == 0)
+         continue;
+       else if (color == 2)
+         this = OTHER_COLOR(this);
+       merged_val |= (this << shift);
+      }
+  }
+
+  /* Try each pattern - NULL pattern marks end of list. Assume at least 1 */
+  gg_assert(pattern->patn);
+
+  do {
+    /*
+     * These days we always match all patterns.
+     */
+    {
+      int end_transformation;
+      int ll;   /* Iterate over transformations (rotations or reflections)  */
+      int k;    /* Iterate over elements of pattern */
+      int found_goal;
+  
+      /* We can check the color of the anchor stone now.
+       * Roughly half the patterns are anchored at each
+       * color, and since the anchor stone is invariant under
+       * rotation, we can reject all rotations of a wrongly-anchored
+       * pattern in one go.
+       *
+       * Patterns are always drawn from O perspective in .db,
+       * so board[pos] is 'color' if the pattern is anchored
+       * at O, or 'other' for X.
+       * Since we require that this flag contains 3 for
+       * anchored_at_X, we can check that
+       *   board[pos] == (color ^ anchored_at_X)
+       * which is equivalent to
+       *   (board[pos] ^ color) == anchored_at_X)
+       * and the LHS is something we precomputed.
+       */
+
+      if (anchor_test != pattern->anchored_at_X)
+       continue;  /* does not match the anchor */
+
+      ll = 0;  /* first transformation number */
+      end_transformation = pattern->trfno;
+
+      /* Ugly trick for dealing with 'O' symmetry. */
+      if (pattern->trfno == 5) {
+       ll = 2;
+       end_transformation = 6;
+      }
+      
+      /* try each orientation transformation. Assume at least 1 */
+
+      do {
+
+#if PROFILE_PATTERNS
+       int nodes_before;
+#endif
+       
+#if GRID_OPT == 1
+
+       /* We first perform the grid check : this checks up to 16
+        * elements in one go, and allows us to rapidly reject
+        * patterns which do not match.  While this check invokes a
+        * necessary condition, it is not a sufficient test, so more
+        * careful checks are still required, but this allows rapid
+        * rejection. merged_val should contain a combination of
+        * 16 board positions around m, n.  The colours have been fixed
+        * up so that stones which are 'O' in the pattern are
+        * bit-pattern %01.
+        */
+       if ((merged_val & pattern->and_mask[ll]) != pattern->val_mask[ll])
+         continue;  /* large-scale match failed */
+
+#endif /* GRID_OPT == 1 */
+
+       /* Next, we do the range check. This applies the edge
+        * constraints implicitly.
+        */
+       {
+         int mi, mj, xi, xj;
+         
+         TRANSFORM2(pattern->mini, pattern->minj, &mi, &mj, ll);
+         TRANSFORM2(pattern->maxi, pattern->maxj, &xi, &xj, ll);
+
+         /* {min,max}{i,j} are the appropriate corners of the original
+          * pattern, Once we transform, {m,x}{i,j} are still corners,
+          * but we don't know *which* corners.
+          * We could sort them, but it turns out to be cheaper
+          * to just test enough cases to be safe.
+          */
+
+         DEBUG(DEBUG_MATCHER, 
+               "---\nconsidering pattern '%s', rotation %d at %1m. Range %d,%d -> %d,%d\n",
+               pattern->name, ll, anchor, mi, mj, xi, xj);
+
+         /* now do the range-check */
+         if (!ON_BOARD2(m + mi, n + mj) || !ON_BOARD2(m + xi, n + xj))
+           continue;  /* out of range */
+       }
+
+       /* Now iterate over the elements of the pattern. */
+       found_goal = 0;
+       for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+         int pos; /* absolute coords of (transformed) pattern element */
+         int att = pattern->patn[k].att;  /* what we are looking for */
+
+         /* Work out the position on the board of this pattern element. */
+
+         /* transform pattern real coordinate... */
+         pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+         ASSERT_ON_BOARD1(pos);
+
+         /* ...and check that board[pos] matches (see above). */
+         if ((board[pos] & and_mask[color-1][att]) != val_mask[color-1][att])
+           goto match_failed;
+
+         if (goal != NULL && board[pos] != EMPTY && goal[pos])
+           found_goal = 1;
+         
+         /* Check out the class_X, class_O, class_x, class_o
+          * attributes - see patterns.db and above.
+          */
+         if ((pattern->class
+              & class_mask[dragon[pos].status][board[pos]]) != 0)
+           goto match_failed; 
+         
+       } /* loop over elements */
+
+
+#if GRID_OPT == 2
+       /* Make sure the grid optimisation wouldn't have 
+           rejected this pattern */
+       ASSERT2((merged_val & pattern->and_mask[ll])
+               == pattern->val_mask[ll], m, n);
+#endif /* we don't trust the grid optimisation */
+
+
+       /* Make it here ==> We have matched all the elements to the board. */
+       if ((goal != NULL) && !found_goal)
+         goto match_failed;
+
+#if PROFILE_PATTERNS
+       pattern->hits++;
+       nodes_before = stats.nodes;
+#endif
+       
+       /* A match!  - Call back to the invoker to let it know. */
+       callback(anchor, color, pattern, ll, callback_data);
+
+#if PROFILE_PATTERNS
+       pattern->reading_nodes += stats.nodes - nodes_before;
+#endif
+       
+       /* We jump to here as soon as we discover a pattern has failed. */
+      match_failed:
+       DEBUG(DEBUG_MATCHER, 
+             "end of pattern '%s', rotation %d at %1m\n---\n", 
+             pattern->name, ll, anchor);
+        
+      } while (++ll < end_transformation); /* ll loop over symmetries */
+    } /* if not rejected by maxwt */
+  } while ((++pattern)->patn);  /* loop over patterns */
+}
+
+
+/*
+ * Scan the board to get patterns anchored by anchor from color
+ * point of view.
+ * the board must be prepared by dfa_prepare_for_match(color) !
+ */
+static void
+matchpat_loop(matchpat_callback_fn_ptr callback, int color, int anchor,
+             struct pattern_db *pdb, void *callback_data,
+             signed char goal[BOARDMAX], int anchor_in_goal) 
+{
+  int pos;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == anchor && (!anchor_in_goal || goal[pos] != 0))
+      do_matchpat(pos, callback, color, pdb->patterns,
+                 callback_data, goal);
+  }
+}
+
+
+/**************************************************************************/
+/* DFA matcher:                                                           */
+/**************************************************************************/
+
+/* Set this to show the dfa board in action */
+/* #define DFA_TRACE 1 */
+
+/* Data. */
+static int dfa_board_size = -1;
+static int dfa_p[DFA_BASE * DFA_BASE];
+
+/* This is used by the EXPECTED_COLOR macro. */
+static const int convert[3][4] = {
+  {-1, -1, -1, -1},            /* not used */
+  {EMPTY, WHITE, BLACK, OUT_BOARD},    /* WHITE */
+  {EMPTY, BLACK, WHITE, OUT_BOARD}     /* BLACK */
+};
+#define EXPECTED_COLOR(player_c, position_c)           \
+               (convert[player_c][position_c])
+
+/* Forward declarations. */
+static void dfa_prepare_for_match(int color);
+static int scan_for_patterns(dfa_rt_t *pdfa, int l, int *dfa_pos,
+                            int *pat_list);
+static void do_dfa_matchpat(dfa_rt_t *pdfa,
+                           int anchor, matchpat_callback_fn_ptr callback,
+                           int color, struct pattern *database,
+                           void *callback_data, signed char goal[BOARDMAX],
+                            int anchor_in_goal);
+static void check_pattern_light(int anchor, 
+                               matchpat_callback_fn_ptr callback,
+                               int color, struct pattern *pattern, int ll,
+                               void *callback_data,
+                               signed char goal[BOARDMAX],
+                                int anchor_in_goal);
+static void dfa_matchpat_loop(matchpat_callback_fn_ptr callback,
+                             int color, int anchor,
+                             struct pattern_db *pdb, void *callback_data,
+                             signed char goal[BOARDMAX], int anchor_in_goal);
+
+
+/***********************************************************************/
+
+
+
+/* prepare the dfa board (gnugo initialization) */
+void
+dfa_match_init(void)
+{
+  build_spiral_order();
+
+  if (owl_vital_apat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "owl_vital_apat --> using dfa\n");
+  if (owl_attackpat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "owl_attackpat --> using dfa\n");
+  if (owl_defendpat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "owl_defendpat --> using dfa\n");
+  if (pat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "pat --> using dfa\n");
+  if (attpat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "attpat --> using dfa\n");
+  if (defpat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "defpat --> using dfa\n");
+  if (endpat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "endpat --> using dfa\n");
+  if (conn_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "conn --> using dfa\n");
+  if (influencepat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "influencepat --> using dfa\n");
+  if (barrierspat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "barrierspat --> using dfa\n");
+  if (fusekipat_db.pdfa != NULL)
+    DEBUG(DEBUG_MATCHER, "barrierspat --> using dfa\n");
+
+  /* force out_board initialization */
+  dfa_board_size = -1;
+}
+
+/* 
+ * copy the board on a private board with adapted colors 
+ * and adapted size 
+ */
+static void
+dfa_prepare_for_match(int color)
+{
+  int i, j;
+  int pos;
+    
+  if (dfa_board_size != board_size) {
+    dfa_board_size = board_size;
+    /* clean up the board */
+    for (pos = 0; pos < DFA_BASE * DFA_BASE; pos++)
+      dfa_p[pos] = OUT_BOARD;
+  }
+
+  /* copy the board */
+  for (i = 0; i < dfa_board_size; i++)
+    for (j = 0; j < dfa_board_size; j++)
+      dfa_p[DFA_POS(i, j)] = EXPECTED_COLOR(color, BOARD(i, j));
+
+  prepare_for_match(color);
+}
+
+#if 0
+/* Debug function. */
+static void
+dump_dfa_board(int m, int n)
+{
+  int i, j;
+
+  for (i = 0; i < dfa_board_size; i++) {
+    for (j = 0; j < dfa_board_size; j++) {
+      if (i != m || j != n)
+       fprintf(stderr, "%1d", dfa_p[DFA_POS(i, j)]);
+      else
+       fprintf(stderr, "*");
+    }
+
+    fprintf(stderr, "\n");
+  }
+}
+#endif
+
+
+/*
+ * Scan the board with a DFA to get all patterns matching at
+ * `dfa_pos' with transformation l.  Store patterns indexes
+ * `pat_list'.  Return the number of patterns found.
+ */
+static int
+scan_for_patterns(dfa_rt_t *pdfa, int l, int *dfa_pos, int *pat_list)
+{
+  int delta;
+  int state = 1; /* initial state */
+  int row = 0; /* initial row */
+  int id = 0; /* position in id_list */
+
+  do {
+    /* collect patterns indexes */
+    int att = pdfa->states[state].att;
+    while (att != 0) {
+      pat_list[id] = pdfa->indexes[att].val;
+      id++;
+      att = pdfa->indexes[att].next;
+    }
+
+    /* go to next state */
+    delta = pdfa->states[state].next[dfa_pos[spiral[row][l]]];
+    state += delta;
+    row++;
+  } while (delta != 0); /* while not on error state */
+
+  return id;
+}
+
+
+/* Perform pattern matching with DFA filtering. */
+static void
+do_dfa_matchpat(dfa_rt_t *pdfa,
+               int anchor, matchpat_callback_fn_ptr callback,
+               int color, struct pattern *database,
+               void *callback_data, signed char goal[BOARDMAX],
+               int anchor_in_goal)
+{
+  int k;
+  int ll;      /* Iterate over transformations (rotations or reflections)  */
+  int patterns[DFA_MAX_MATCHED + 8];
+  int num_matched = 0;
+  int *dfa_pos = dfa_p + DFA_POS(I(anchor), J(anchor));
+
+  /* Basic sanity checks. */
+  ASSERT_ON_BOARD1(anchor);
+
+  /* One scan by transformation */
+  for (ll = 0; ll < 8; ll++) {
+    num_matched += scan_for_patterns(pdfa, ll, dfa_pos,
+                                    patterns + num_matched);
+    patterns[num_matched++] = -1;
+  }
+
+  ASSERT1(num_matched <= DFA_MAX_MATCHED + 8, anchor);
+
+  /* Constraints and other tests. */
+  for (ll = 0, k = 0; ll < 8; k++) {
+    int matched;
+
+    if (patterns[k] == -1) {
+      ll++;
+      continue;
+    }
+
+    matched = patterns[k];
+
+#if PROFILE_PATTERNS
+    database[matched].dfa_hits++;
+#endif
+
+    check_pattern_light(anchor, callback, color, database + matched,
+                       ll, callback_data, goal, anchor_in_goal);
+  }
+}
+
+
+/*
+ * Do the pattern matching for a given pattern and a given 
+ * transformation ll. 
+ * (does not recompute what dfa filtering has already done)
+ */
+
+static void
+check_pattern_light(int anchor, matchpat_callback_fn_ptr callback, int color,
+                   struct pattern *pattern, int ll, void *callback_data,
+                   signed char goal[BOARDMAX], int anchor_in_goal)
+{
+  int k;                       /* Iterate over elements of pattern */
+  int found_goal = 0;
+  
+#if PROFILE_PATTERNS
+  int nodes_before;
+#endif
+  
+  if (0)
+    gprintf("check_pattern_light @ %1m rot:%d pattern: %s\n", 
+           anchor, ll, pattern->name);
+
+  /* Throw out duplicating orientations of symmetric patterns. */
+  if (pattern->trfno == 5) {
+    if (ll < 2 || ll >= 6)
+      return;
+  }
+  else {
+    if (ll >= pattern->trfno)
+      return;
+  }
+
+  /* Now iterate over the elements of the pattern. */
+  for (k = 0; k < pattern->patlen; k++) {
+                               /* match each point */
+    int pos;                   /* absolute (board) co-ords of 
+                                  (transformed) pattern element */
+
+    /* transform pattern real coordinate... */
+    pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+    ASSERT_ON_BOARD1(pos);
+
+    if (!anchor_in_goal) { 
+      /* goal check */
+      if (goal != NULL && board[pos] != EMPTY && goal[pos])
+       found_goal = 1;
+    }
+
+    /* class check */
+    ASSERT1(dragon[pos].status < 4, anchor);
+    if ((pattern->class & class_mask[dragon[pos].status][board[pos]]) != 0)
+      goto match_failed;
+    
+  } /* loop over elements */
+  
+  /* Make it here ==> We have matched all the elements to the board. */
+  if (!anchor_in_goal) { 
+    if (goal != NULL && !found_goal)
+      goto match_failed;
+  }
+
+#if PROFILE_PATTERNS
+  pattern->hits++;
+  nodes_before = stats.nodes;
+#endif
+  
+  /* A match!  - Call back to the invoker to let it know. */
+  callback(anchor, color, pattern, ll, callback_data);
+  
+#if PROFILE_PATTERNS
+  pattern->reading_nodes += stats.nodes - nodes_before;
+#endif
+  
+  /* We jump to here as soon as we discover a pattern has failed. */
+ match_failed:
+  DEBUG(DEBUG_MATCHER, "end of pattern '%s', rotation %d at %1m\n---\n",
+       pattern->name, ll, anchor);
+  
+} /* check_pattern_light */
+
+
+/*
+ * Scan the board to get patterns anchored by anchor from color
+ * point of view.
+ * the board must be prepared by dfa_prepare_for_match(color) !
+ */
+static void
+dfa_matchpat_loop(matchpat_callback_fn_ptr callback, int color, int anchor,
+                 struct pattern_db *pdb, void *callback_data,
+                 signed char goal[BOARDMAX], int anchor_in_goal) 
+{
+  int pos;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == anchor && (!anchor_in_goal || goal[pos] != 0))
+      do_dfa_matchpat(pdb->pdfa, pos, callback, color, pdb->patterns,
+                     callback_data, goal, anchor_in_goal);
+  }
+}
+
+
+
+/**************************************************************************/
+/* Main functions:                                                        */
+/**************************************************************************/
+
+
+typedef void (*loop_fn_ptr_t)(matchpat_callback_fn_ptr callback, 
+                             int color, int anchor,
+                             struct pattern_db *pdb, void *callback_data,
+                             signed char goal[BOARDMAX], int anchor_in_goal);
+
+typedef void (*prepare_fn_ptr_t)(int color);
+
+/* same as the old matchpat but for all the board with
+ * preparation.
+ *
+ * 4 possible values for color argument:
+ * WHITE or BLACK: matchpat is called from this color point of view.
+ * ANCHOR_COLOR  : matchpat is called from the anchor's point of view.
+ * ANCHOR_OTHER  : matchpat is called from the opposite color of the 
+ *                 anchor's point of view.
+ */
+
+void
+matchpat(matchpat_callback_fn_ptr callback, int color,
+        struct pattern_db *pdb, void *callback_data,
+        signed char goal[BOARDMAX]) 
+{
+  matchpat_goal_anchor(callback, color, pdb, callback_data, goal, 
+                       pdb->fixed_anchor);
+}
+
+void 
+matchpat_goal_anchor(matchpat_callback_fn_ptr callback, int color,
+                    struct pattern_db *pdb, void *callback_data,
+                    signed char goal[BOARDMAX], int anchor_in_goal) 
+{
+  loop_fn_ptr_t loop = matchpat_loop;
+  prepare_fn_ptr_t prepare = prepare_for_match;
+
+  /* check board size */
+  if (pdb->fixed_for_size != board_size) {
+    fixup_patterns_for_board_size(pdb->patterns);
+    pdb->fixed_for_size = board_size;
+  }
+
+  /* select pattern matching strategy */
+  if (pdb->pdfa != NULL) { 
+    loop = dfa_matchpat_loop;
+    prepare = dfa_prepare_for_match;
+  }
+
+  /* select strategy */
+  switch (color) {
+    case ANCHOR_COLOR:
+      { /* match pattern for the color of their anchor */
+       prepare(WHITE);
+       loop(callback, WHITE, WHITE, pdb, callback_data, goal, anchor_in_goal);
+       prepare(BLACK);
+       loop(callback, BLACK, BLACK, pdb, callback_data, goal, anchor_in_goal);
+      }
+      break;
+    case ANCHOR_OTHER:
+      { /* match pattern for the opposite color of their anchor */
+       prepare(WHITE);
+       loop(callback, WHITE, BLACK, pdb, callback_data, goal, anchor_in_goal);
+       prepare(BLACK);
+       loop(callback, BLACK, WHITE, pdb, callback_data, goal, anchor_in_goal);
+      }
+      break;
+    default:
+      { /* match all patterns for color */
+       prepare(color);
+       loop(callback, color, WHITE, pdb, callback_data, goal, anchor_in_goal);
+       loop(callback, color, BLACK, pdb, callback_data, goal, anchor_in_goal);
+      }
+  }
+}
+
+
+static int
+fullboard_transform(int pos, int trans)
+{
+  int dx = I(pos) - (board_size-1)/2;
+  int dy = J(pos) - (board_size-1)/2;
+  int x, y;
+  gg_assert(POS((board_size-1)/2, (board_size-1)/2) + DELTA(dx, dy) == pos);
+  TRANSFORM2(dx, dy, &x, &y, trans);
+  return POS(x + (board_size-1)/2, y + (board_size-1)/2);
+}
+
+/* A dedicated matcher which can only do fullboard matching on
+ * odd-sized boards, optimized for fuseki patterns.
+ */
+void
+fullboard_matchpat(fullboard_matchpat_callback_fn_ptr callback, int color,
+                  struct fullboard_pattern *pattern)
+{
+  int ll;   /* Iterate over transformations (rotations or reflections)  */
+  /* We transform around the center point. */
+  int number_of_stones_on_board = stones_on_board(BLACK | WHITE);
+  static int color_map[gg_max(WHITE, BLACK) + 1];
+  /* One hash value for each rotation/reflection: */
+  Hash_data current_board_hash[8];
+  
+  /* Basic sanity check. */
+  gg_assert(color != EMPTY);
+  gg_assert(board_size % 2 == 1);
+
+  color_map[EMPTY] = EMPTY;
+  if (color == WHITE) {
+    color_map[WHITE] = WHITE;
+    color_map[BLACK] = BLACK;
+  }
+  else {
+    color_map[WHITE] = BLACK;
+    color_map[BLACK] = WHITE;
+  }
+
+  /* Get hash data of all rotations/reflections of current board position. */
+  for (ll = 0; ll < 8; ll++) {
+    Intersection p[BOARDSIZE];
+    int pos;
+    for (pos = 0; pos < BOARDSIZE; pos++)
+      if (ON_BOARD(pos))
+       p[pos] = color_map[board[fullboard_transform(pos, ll)]];
+      else
+       p[pos] = GRAY;
+
+    if (ON_BOARD(board_ko_pos))
+      hashdata_recalc(&current_board_hash[ll], p,
+                     fullboard_transform(board_ko_pos, ll));
+    else 
+      hashdata_recalc(&current_board_hash[ll], p, NO_MOVE);
+  }
+
+  /* Try each pattern - NULL pattern name marks end of list. */
+  for (; pattern->name; pattern++) { 
+    if (pattern->number_of_stones != number_of_stones_on_board)
+      continue;
+    /* Try each orientation transformation. */
+    for (ll = 0; ll < 8; ll++)
+      if (hashdata_is_equal(current_board_hash[ll], pattern->fullboard_hash)) {
+       /* A match!  - Call back to the invoker to let it know. */
+       int pos = AFFINE_TRANSFORM(pattern->move_offset, ll,
+                                  POS((board_size-1)/2, (board_size-1)/2));
+       callback(pos, pattern, ll);
+      }
+  }
+}
+
+
+/**************************************************************************/
+/* Corner matcher                                                         */
+/**************************************************************************/
+
+/* These arrays specify anchor corner for each transformation. They _must_
+ * be in line with transformation2[][] array in patterns/transform.c.
+ */
+static const int corner_x[8] = {0, 0, 1, 1, 1, 1, 0, 0};
+static const int corner_y[8] = {0, 1, 1, 0, 1, 0, 0, 1};
+
+/* The number of stones in "corner area" for each board position. For example,
+ * corner area for position E3 when anchoring at A1 corner, looks like this:
+ *
+ *   |........         In general, NUM_STONES(pos) is the number of stones
+ *   |........         which are closer to the corner (stone at pos, if any,
+ * 3 |#####...         counts too) than pos. Note, that say G2 is not closer
+ *   |#####...         to the corner than E3, the reverse isn't true either.
+ * 1 |#####...         Their distances are "incomparable" since E < G but
+ *   +--------         3 > 2.
+ *    A   E
+ *
+ * Note that we need these values in at most MAX_BOARD x MAX_BOARD array.
+ * However, it may be anchored at any corner of the board, so if the board is
+ * small, we may calculate NUM_STONES() at negative coordinates.
+ */
+static int num_stones[2*BOARDMAX];
+#define NUM_STONES(pos) num_stones[(pos) + BOARDMAX]
+
+/* Stone locations are stored in this array. They might be needed by callback
+ * function.
+ */
+static int pattern_stones[BOARDMAX];
+
+
+/* Recursively performs corner matching. This function checks whether
+ * `num_variation' variations pointed by `variation' parameter match.
+ * If any of them does, the function calls itself recursively. If any
+ * pattern corresponding to those variations matches, it notifies
+ * callback function.
+ */
+static void
+do_corner_matchpat(int num_variations, struct corner_variation *variation,
+                  int match_color, corner_matchpat_callback_fn_ptr callback,
+                  int callback_color, int trans, int anchor, int stones)
+{
+  for (; --num_variations >= 0; variation++) {
+    int move = AFFINE_TRANSFORM(variation->move_offset, trans, anchor);
+    int color_check = match_color ^ variation->xor_att;
+    struct corner_pattern *pattern = variation->pattern;
+
+    if (pattern && color_check == callback_color) {
+      int second_corner
+         = AFFINE_TRANSFORM(pattern->second_corner_offset, trans, anchor);
+
+      if (NUM_STONES(second_corner) == stones
+         && (!pattern->symmetric || trans < 4)) {
+       /* We have found a matching pattern. */
+       ASSERT1(board[move] == EMPTY, move);
+
+       callback(move, callback_color, pattern, trans, pattern_stones, stones);
+       continue;
+      }
+    }
+
+    if (variation->num_variations
+       && NUM_STONES(move) == variation->num_stones
+       && board[move] == color_check) {
+      /* A matching variation. */
+      pattern_stones[stones] = move;
+      do_corner_matchpat(variation->num_variations, variation->variations,
+                        match_color, callback, callback_color,
+                        trans, anchor, stones + 1);
+    }
+  }
+}
+
+
+/* Perform corner matching at all four corners and both possible
+ * transformations at each corner. `callback' is notified if any
+ * matching pattern is found.
+ */
+void
+corner_matchpat(corner_matchpat_callback_fn_ptr callback, int color,
+               struct corner_db *database)
+{
+  int k;
+
+  for (k = 0; k < 8; k++) {
+    int anchor = POS(corner_x[k] * (board_size - 1),
+                    corner_y[k] * (board_size - 1));
+    int i;
+    int j;
+    int dx = TRANSFORM(OFFSET(1, 0), k);
+    int dy = TRANSFORM(OFFSET(0, 1), k);
+    int pos;
+    struct corner_variation *variation = database->top_variations;
+
+    /* Fill in the NUM_STONES() array. We use `max_width' and `max_height'
+     * fields of database structure to stop working as early as possible.
+     */
+    NUM_STONES(anchor) = IS_STONE(board[anchor]);
+
+    pos = anchor;
+    for (i = 1; i < database->max_height; i++) {
+      pos += dx;
+      if (!ON_BOARD(pos)) {
+       do {
+         NUM_STONES(pos) = BOARDMAX;
+         pos += dx;
+       } while (++i < database->max_height);
+
+       break;
+      }
+
+      NUM_STONES(pos) = NUM_STONES(pos - dx) + IS_STONE(board[pos]);
+    }
+
+    pos = anchor;
+    for (j = 1; j < database->max_width; j++) {
+      pos += dy;
+      if (!ON_BOARD(pos)) {
+       do {
+         NUM_STONES(pos) = BOARDMAX;
+         pos += dy;
+       } while (++j < database->max_width);
+
+       break;
+      }
+      
+      NUM_STONES(pos) = NUM_STONES(pos - dy) + IS_STONE(board[pos]);
+    }
+    
+    for (i = 1; i < database->max_height; i++) {
+      pos = anchor + i * dy;
+      for (j = 1; j < database->max_width; j++) {
+       pos += dx;
+       NUM_STONES(pos) = NUM_STONES(pos - dx) + NUM_STONES(pos - dy)
+                       - NUM_STONES(pos - dx - dy);
+       if (ON_BOARD1(pos) && IS_STONE(board[pos]))
+         NUM_STONES(pos)++;
+      }
+    }
+
+    /* Try to match top variations. If any of them matches, we call
+     * do_corner_matchpat() to recurse that variation's tree.
+     */
+    for (i = 0; i < database->num_top_variations; i++) {
+      int move = AFFINE_TRANSFORM(variation->move_offset, k, anchor);
+
+      if (NUM_STONES(move) == 1 && IS_STONE(board[move])) {
+       pattern_stones[0] = move;
+       do_corner_matchpat(variation->num_variations, variation->variations,
+                          board[move], callback, color, k, anchor, 1);
+      }
+
+      variation++;
+    }
+  }
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/montecarlo.c b/engine/montecarlo.c
new file mode 100644 (file)
index 0000000..1804f27
--- /dev/null
@@ -0,0 +1,2262 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+#include "random.h"
+#include <math.h>
+
+/* FIXME: Replace with a DEBUG_MC symbol for use with -d. */
+static int mc_debug = 0;
+
+#define TURN_OFF_ASSERTIONS 1
+
+
+/* Special board code for Monte Carlo simulations.
+ *
+ * A liberty edge is the combination of the position of the liberty
+ * and the direction to a string given by the index into the delta[]
+ * array. A liberty edge at lib with corresponding string in direction
+ * delta[dir] is encoded as (lib << 2 | dir).
+ *
+ * The stones of a string are linked in a cyclic list through the
+ * next_stone field, just like the global board does.
+ *
+ * Likewise the liberty edges corresponding to each string are
+ * connected in a doubly linked cyclic list through the
+ * previous_liberty_edge and next_liberty_edge fields.
+ *
+ * The reference stone has to be the same for every stone in a string
+ * but it doesn't have to be a predictable one, in contrast to the
+ * origin in the global board. The reference stone is the only one
+ * which is guaranteed to have a valid pointer to the "first" liberty
+ * edge (just an arbitrary element in the circular list).
+ *
+ * The local_context field contains information about the surrounding
+ * 8 points. The bit layout is
+ *
+ * 23   : Black suicide.
+ * 22   : White suicide.
+ * 21   : Black self-atari.
+ * 20   : White self-atari.
+ * 19,18: Number of stones captured by black move.
+ * 17,16: Number of stones captured by white move.
+ * 15,14: Color to the southeast.
+ * 13,12: Color to the northeast.
+ * 11,10: Color to the northwest.
+ *  9, 8: Color to the southwest.
+ *  7, 6: Color to the east.
+ *  5, 4: Color to the north.
+ *  3, 2: Color to the west.
+ *  1, 0: Color to the south.
+ *
+ * The number of stones in atari is 0 if empty or not atari, 1 if one
+ * stone in atari, 2 if two stones in atari, and 3 if three or more stones
+ * in atari.
+ *
+ * The queue array is used to form a linked single list data structure
+ * with O(1) add, O(1) lookup, and O(n) delete operations. The
+ * assumption is that v1 = queue[0] points to the first board vertex
+ * in the list, v2 = queue[v1] points to the second vertex and so on.
+ * The list ends when the next vertex is the off-board point 1. Board
+ * vertices not included in the list have queue[v1] = 0. Thus an empty
+ * list is characterized by queue[0] = 1 and queue[v] = 0 for all
+ * vertices on the board. Generally queue[v] can be used to test for
+ * membership in the list. The list is used to keep track of points
+ * needing updated local context or value information.
+ *
+ * The move_values_*, partitioned_move_value_sums_*,
+ * move_partition_lists_*, and move_value_sum_* fields are together
+ * used to track move values and quickly sample according the
+ * distribution determined by the move values.
+ *
+ * The move_values_* arrays naturally hold the values of each move.
+ *
+ * The move_partition_lists_* arrays form a two-level access to the
+ * legal moves of respective color. Depending on the MAX_BOARD size,
+ * the vertices are split into 2, 4, 8, or 16 partitions (see below)
+ * where the partition number of each vertex is given by the 1, 2, 3,
+ * or 4 least significant bits of the vertex index respectively. The
+ * legal moves in each partition are linked together just like the
+ * queue array described above. The only difference is that multiple
+ * partition linked lists are represented in the same array by
+ * starting from out of board indices 0..1, 0..3, 0..7, and 0..15
+ * respectively.
+ *
+ * The partitioned_move_value_sums_* arrays are simply the sums of
+ * move values in each partition and the move_value_sum_white_* fields
+ * are the sum of the values of all legal moves.
+ */
+
+#if MAX_BOARD < 4
+#define NUM_MOVE_PARTITIONS 2
+#elif MAX_BOARD < 8
+#define NUM_MOVE_PARTITIONS 4
+#elif MAX_BOARD < 16
+#define NUM_MOVE_PARTITIONS 8
+#else
+#define NUM_MOVE_PARTITIONS 16
+#endif
+
+struct mc_board {
+  Intersection board[BOARDSIZE];
+  int local_context[BOARDSIZE];
+  int queue[BOARDMAX];
+  unsigned int move_values_white[BOARDMAX];
+  unsigned int move_values_black[BOARDMAX];
+  unsigned int partitioned_move_value_sums_white[NUM_MOVE_PARTITIONS];
+  unsigned int partitioned_move_value_sums_black[NUM_MOVE_PARTITIONS];
+  int move_partition_lists_white[BOARDMAX];
+  int move_partition_lists_black[BOARDMAX];
+  unsigned int move_value_sum_white;
+  unsigned int move_value_sum_black;
+  int board_ko_pos;
+  int reference_stone[BOARDMAX];
+  int next_stone[BOARDMAX];
+  int first_liberty_edge[BOARDMAX];
+  int previous_liberty_edge[4 * BOARDMAX];
+  int next_liberty_edge[4 * BOARDMAX];
+  Hash_data hash;
+};
+
+#define MC_ADD_TO_UPDATE_QUEUE(mc, pos) \
+  do {                                 \
+    if (!mc->queue[pos]) {             \
+      mc->queue[pos] = mc->queue[0];   \
+      mc->queue[0] = pos;              \
+    }                                  \
+  } while (0)
+
+#define MC_ON_BOARD(pos) (mc->board[pos] != GRAY)
+
+/* Add a liberty edge for a string at pos with liberty at lib and
+ * direction dir.
+ */
+static void
+mc_add_liberty_edge(struct mc_board *mc, int pos, int lib, int dir)
+{
+  int this_liberty_edge = (lib << 2) | dir;
+  int reference = mc->reference_stone[pos];
+  int first_liberty_edge = mc->first_liberty_edge[reference];
+
+#if !TURN_OFF_ASSERTIONS
+  gg_assert(lib + delta[dir] == pos);
+#endif
+  
+  if (first_liberty_edge) {
+    int second_liberty_edge = mc->next_liberty_edge[first_liberty_edge];
+    mc->previous_liberty_edge[this_liberty_edge] = first_liberty_edge;
+    mc->next_liberty_edge[this_liberty_edge] = second_liberty_edge;
+    mc->next_liberty_edge[first_liberty_edge] = this_liberty_edge;
+    mc->previous_liberty_edge[second_liberty_edge] = this_liberty_edge;
+  }
+  else {
+    mc->first_liberty_edge[reference] = this_liberty_edge;
+    mc->next_liberty_edge[this_liberty_edge] = this_liberty_edge;
+    mc->previous_liberty_edge[this_liberty_edge] = this_liberty_edge;
+  }
+}
+
+
+/* Remove a liberty edge for a string at pos with liberty at lib and
+ * direction dir.
+ */
+static int
+mc_remove_liberty_edge(struct mc_board *mc, int pos, int lib, int dir)
+{
+  int reference = mc->reference_stone[pos];
+  int this_liberty_edge = (lib << 2) | dir;
+  int next = mc->next_liberty_edge[this_liberty_edge];
+  int previous = mc->previous_liberty_edge[this_liberty_edge];
+  
+#if !TURN_OFF_ASSERTIONS
+  gg_assert(lib + delta[dir] == pos);
+#endif
+  
+  if (next == this_liberty_edge) {
+    mc->first_liberty_edge[reference] = 0;
+    return 0;
+  }
+
+  mc->next_liberty_edge[previous] = next;
+  mc->previous_liberty_edge[next] = previous;
+  if (mc->first_liberty_edge[reference] == this_liberty_edge)
+    mc->first_liberty_edge[reference] = next;
+
+  return next;
+}
+
+
+/* Join the strings at str1 and str2. It is assumed that str1 is a
+ * newly placed stone (possibly already joined with other strings) and
+ * that the liberty edge corresponding to the liberty at the newly
+ * placed stone has not yet been removed.
+ */
+static void
+mc_join_strings(struct mc_board *mc, int str1, int str2)
+{
+  int reference = mc->reference_stone[str2];
+  int liberty_edge2 = mc->first_liberty_edge[reference];
+  int liberty_edge1 = mc->first_liberty_edge[mc->reference_stone[str1]];
+  int next1;
+  int next2;
+  int pos = str1;
+
+  /* Update the reference stone for str1. */
+  do {
+    mc->reference_stone[pos] = reference;
+    pos = mc->next_stone[pos];
+  } while (pos != str1);
+
+  /* Switch next_stone pointers to join the strings. */
+  next1 = mc->next_stone[str1];
+  mc->next_stone[str1] = mc->next_stone[str2];
+  mc->next_stone[str2] = next1;
+
+  /* Join the circular liberty_edge structures. We know that str2
+   * still has a liberty listed at the newly added stone so
+   * liberty_edge2 is guaranteed to be non-zero.
+   */
+  if (liberty_edge1 != 0) {
+    next1 = mc->next_liberty_edge[liberty_edge1];
+    next2 = mc->next_liberty_edge[liberty_edge2];
+    mc->next_liberty_edge[liberty_edge1] = next2;
+    mc->next_liberty_edge[liberty_edge2] = next1;
+    mc->previous_liberty_edge[next1] = liberty_edge2;
+    mc->previous_liberty_edge[next2] = liberty_edge1;
+  }
+}
+
+
+/* Does the string at str have at most two liberties? In that case,
+ * add them to the update queue.
+ */
+static void
+mc_queue_max_two_liberties(struct mc_board *mc, int str)
+{
+  int reference = mc->reference_stone[str];
+  int first_liberty_edge = mc->first_liberty_edge[reference];
+  int first_liberty = first_liberty_edge >> 2;
+  int liberty_edge = mc->next_liberty_edge[first_liberty_edge];
+  int second_liberty;
+#if !TURN_OFF_ASSERTIONS
+  ASSERT1(IS_STONE(mc->board[str]), str);
+#endif
+  if (first_liberty == NO_MOVE)
+    return;
+  while (liberty_edge != first_liberty_edge) {
+    if ((liberty_edge >> 2) != first_liberty) {
+      second_liberty = liberty_edge >> 2;
+      while (liberty_edge != first_liberty_edge) {
+       if ((liberty_edge >> 2) != first_liberty
+           && (liberty_edge >> 2) != second_liberty)
+         return;
+       liberty_edge = mc->next_liberty_edge[liberty_edge];
+      }
+      MC_ADD_TO_UPDATE_QUEUE(mc, first_liberty);
+      MC_ADD_TO_UPDATE_QUEUE(mc, second_liberty);
+      return;
+    }
+    liberty_edge = mc->next_liberty_edge[liberty_edge];
+  }
+
+  MC_ADD_TO_UPDATE_QUEUE(mc, first_liberty);
+}
+
+
+/* Remove the string at str from the board. */
+static int
+mc_remove_string(struct mc_board *mc, int str)
+{
+  int color = mc->board[str];
+  int other = OTHER_COLOR(color);
+  int pos = str;
+  int num_removed_stones = 0;
+  int k;
+  
+  do {
+    for (k = 0; k < 8; k++) {
+      if (k < 4 && mc->board[pos + delta[k]] == other) {
+       mc_queue_max_two_liberties(mc, pos + delta[k]);
+       mc_add_liberty_edge(mc, pos + delta[k], pos, k);
+      }
+      if (mc->board[pos + delta[k]] == EMPTY)
+       MC_ADD_TO_UPDATE_QUEUE(mc, pos + delta[k]);
+    }
+    mc->board[pos] = EMPTY;
+    mc->local_context[NW(pos)] ^= color << 14;
+    mc->local_context[SW(pos)] ^= color << 12;
+    mc->local_context[SE(pos)] ^= color << 10;
+    mc->local_context[NE(pos)] ^= color << 8;
+    mc->local_context[WEST(pos)] ^= color << 6;
+    mc->local_context[SOUTH(pos)] ^= color << 4;
+    mc->local_context[EAST(pos)] ^= color << 2;
+    mc->local_context[NORTH(pos)] ^= color;
+    hashdata_invert_stone(&(mc->hash), pos, color);
+    MC_ADD_TO_UPDATE_QUEUE(mc, pos);
+    num_removed_stones++;
+    pos = mc->next_stone[pos];
+  } while (pos != str);
+
+  return num_removed_stones;
+}
+
+
+/* Initialize a Monte Carlo board struct from the global board. */
+static void
+mc_init_board_from_global_board(struct mc_board *mc)
+{
+  int stones[BOARDMAX];
+  int num_stones;
+  int pos;
+  int k;
+  int r;
+  
+  memcpy(mc->board, board, sizeof(mc->board));
+  mc->board_ko_pos = board_ko_pos;
+  mc->hash = board_hash;
+  memset(mc->queue, 0, sizeof(mc->queue));
+  mc->queue[0] = 1;
+
+  memset(mc->next_stone, 0, sizeof(mc->next_stone));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int geometry = ((mc->board[SE(pos)] << 14)
+                   | (mc->board[NE(pos)] << 12)
+                   | (mc->board[NW(pos)] << 10)
+                   | (mc->board[SW(pos)] << 8)
+                   | (mc->board[EAST(pos)] << 6)
+                   | (mc->board[NORTH(pos)] << 4)
+                   | (mc->board[WEST(pos)] << 2)
+                   | mc->board[SOUTH(pos)]);
+    mc->local_context[pos] = geometry;
+    if (board[pos] == EMPTY) {
+      int s;
+      int captured_black_stones = 0;
+      int captured_white_stones = 0;
+      if (is_self_atari(pos, WHITE))
+       mc->local_context[pos] |= 1 << 20;
+      if (is_self_atari(pos, BLACK))
+       mc->local_context[pos] |= 1 << 21;
+      if (is_suicide(pos, WHITE))
+       mc->local_context[pos] |= 1 << 22;
+      if (is_suicide(pos, BLACK))
+       mc->local_context[pos] |= 1 << 23;
+      for (s = 0; s < 4; s++) {
+       if (board[pos + delta[s]] == BLACK
+           && countlib(pos + delta[s]) == 1)
+         captured_black_stones += countstones(pos + delta[s]);
+       else if (board[pos + delta[s]] == WHITE
+                && countlib(pos + delta[s]) == 1)
+         captured_white_stones += countstones(pos + delta[s]);
+      }
+      if (captured_black_stones > 3)
+       captured_black_stones = 3;
+      if (captured_white_stones > 3)
+       captured_white_stones = 3;
+      mc->local_context[pos] |= captured_black_stones << 16;
+      mc->local_context[pos] |= captured_white_stones << 18;
+    }
+    
+    if (IS_STONE(board[pos]) && mc->next_stone[pos] == 0) {
+      num_stones = findstones(pos, BOARDMAX, stones);
+      mc->first_liberty_edge[pos] = 0;
+      for (r = 0; r < num_stones; r++) {
+       mc->next_stone[stones[r]] = stones[(r + 1) % num_stones];
+       mc->reference_stone[stones[r]] = pos;
+       for (k = 0; k < 4; k++) {
+         if (board[stones[r] + delta[k]] == EMPTY)
+           mc_add_liberty_edge(mc, stones[r], stones[r] + delta[k],
+                               (k + 2) % 4);
+       }
+      }
+    }
+  }
+}
+
+
+#if 0
+/* Debug tool. */
+static void
+mc_check_consistency_with_global_board(struct mc_board *mc)
+{
+  int pos;
+
+  ASSERT1(board_ko_pos == mc->board_ko_pos, mc->board_ko_pos);
+  for (pos = 0; pos < BOARDSIZE; pos++) {
+    ASSERT1(board[pos] == mc->board[pos], pos);
+    if (IS_STONE(board[pos])) {
+      ASSERT1(same_string(pos, mc->reference_stone[pos]), pos);
+      if (find_origin(pos) == pos) {
+       int reference = mc->reference_stone[pos];
+       int pos2 = pos;
+       int num_stones = 0;
+       int first_liberty_edge;
+       int liberty_edge;
+       int num_liberty_edges = 0;
+       int k;
+       int ml[4 * BOARDMAX];
+       memset(ml, 0, sizeof(ml));
+       
+       do {
+         ASSERT1(mc->reference_stone[pos2] == reference, pos2);
+         ASSERT1(num_stones < countstones(pos), pos);
+         num_stones++;
+         for (k = 0; k < 4; k++)
+           if (board[pos2 + delta[k]] == EMPTY) {
+             ml[(pos2 + delta[k]) << 2 | (k + 2) % 4] = 1;
+             num_liberty_edges++;
+           }
+         pos2 = mc->next_stone[pos2];
+       } while (pos2 != pos);
+       ASSERT1(num_stones == countstones(pos), pos);
+
+       first_liberty_edge = mc->first_liberty_edge[reference];
+       liberty_edge = first_liberty_edge;
+       do {
+         int previous = mc->previous_liberty_edge[liberty_edge];
+         int next = mc->next_liberty_edge[liberty_edge];
+         ASSERT1(ml[liberty_edge] == 1, pos);
+         ml[liberty_edge] = 0;
+         num_liberty_edges--;
+         ASSERT1(mc->next_liberty_edge[previous] == liberty_edge, pos);
+         ASSERT1(mc->previous_liberty_edge[next] == liberty_edge, pos);
+         ASSERT1(liberty_of_string(liberty_edge >> 2, pos), pos);
+         liberty_edge = mc->next_liberty_edge[liberty_edge];
+       } while (liberty_edge != first_liberty_edge);
+       ASSERT1(num_liberty_edges == 0, pos);
+      }
+    }
+  }
+}
+#endif
+
+
+/* Write the Monte Carlo board to outfile. */
+static void
+mc_showboard(struct mc_board *mc, FILE *outfile)
+{
+  int i, j;
+
+  draw_letter_coordinates(outfile);
+  
+  for (i = 0; i < board_size; i++) {
+    fprintf(outfile, "\n%2d", board_size - i);
+    
+    for (j = 0; j < board_size; j++) {
+      if (mc->board[POS(i, j)] == EMPTY)
+       fprintf(outfile, " %c", is_hoshi_point(i, j) ? '+' : '.');
+      else
+       fprintf(outfile, " %c", mc->board[POS(i, j)] == BLACK ? 'X' : 'O');
+    }
+  }
+  
+  fprintf(outfile, "\n");
+  draw_letter_coordinates(outfile);
+}
+
+
+/* Count the number of stones in the string at str. Stop counting if
+ * maxstones is reached.
+ */
+static int
+mc_countstones(struct mc_board *mc, int str, int maxstones)
+{
+  int stone = str;
+  int num_stones = 0;
+  do {
+    num_stones++;
+    stone = mc->next_stone[stone];
+  } while (stone != str && num_stones < maxstones);
+
+  return num_stones;
+}
+
+
+/* Suicide is incrementally tracked by the local context information. */
+#define mc_is_suicide(mc, pos, color) \
+  ((mc->local_context[pos] >> (21 + color)) & 1)
+
+
+#if !TURN_OFF_ASSERTIONS
+/* Is a move at pos by color legal? */
+static int
+mc_is_legal(struct mc_board *mc, int pos, int color)
+{
+  if (pos == PASS_MOVE)
+    return 1;
+
+  if (mc->board[pos] != EMPTY)
+    return 0;
+
+  if (pos == mc->board_ko_pos) {
+    if (mc->board[WEST(pos)] == OTHER_COLOR(color)
+       || mc->board[EAST(pos)] == OTHER_COLOR(color)) {
+      return 0;
+    }
+  }
+
+  return !mc_is_suicide(mc, pos, color);
+}
+#endif
+
+
+/* Is the string at str in atari? Always place one liberty of the
+ * string in lib, unless it's a null pointer.
+ */
+static int
+mc_is_in_atari(struct mc_board *mc, int str, int *lib)
+{
+  int reference = mc->reference_stone[str];
+  int first_liberty_edge = mc->first_liberty_edge[reference];
+  int liberty = first_liberty_edge >> 2;
+  int liberty_edge = mc->next_liberty_edge[first_liberty_edge];
+#if !TURN_OFF_ASSERTIONS
+  ASSERT1(IS_STONE(mc->board[str]), str);
+#endif
+  if (lib)
+    *lib = liberty;
+  while (liberty_edge != first_liberty_edge) {
+    if ((liberty_edge >> 2) != liberty)
+      return 0;
+    liberty_edge = mc->next_liberty_edge[liberty_edge];
+  }
+
+  return 1;
+}
+
+
+/* Does the liberty edge chain at first_liberty_edge contain more than
+ * one distinct liberty?
+ */
+static int
+mc_is_in_atari2(struct mc_board *mc, int first_liberty, int first_liberty_edge)
+{
+  int liberty_edge = mc->next_liberty_edge[first_liberty_edge];
+  while (liberty_edge != first_liberty_edge) {
+    if ((liberty_edge >> 2) != first_liberty)
+      return 0;
+    liberty_edge = mc->next_liberty_edge[liberty_edge];
+  }
+
+  return 1;
+}
+
+
+/* Count the number of stones that would be captured if color played at move.
+ * Return at most the number given by maxstones.
+ */
+static int
+mc_stones_in_atari(struct mc_board *mc, int move, int color, int maxstones)
+{
+  int k;
+  int stones_in_atari = 0;
+  for (k = 0; k < 4 && stones_in_atari < maxstones; k++) {
+    int pos = move + delta[k];
+    if (mc->board[pos] == OTHER_COLOR(color)
+       && mc_is_in_atari(mc, pos, NULL))
+      stones_in_atari += mc_countstones(mc, pos, maxstones - stones_in_atari);
+  }
+  
+  return stones_in_atari;
+}
+
+
+/* Does the string at str have exactly two liberties? One liberty is
+ * assumed to be known and passed in first_liberty, whereas the second
+ * is placed in second_liberty.
+ */
+static int
+mc_has_two_liberties_one_given(struct mc_board *mc, int str,
+                              int first_liberty, int *second_liberty)
+{
+  int reference = mc->reference_stone[str];
+  int first_liberty_edge = mc->first_liberty_edge[reference];
+  int liberty_edge = first_liberty_edge;
+  *second_liberty = NO_MOVE;
+  do {
+    int liberty = liberty_edge >> 2;
+    if (liberty != first_liberty) {
+      if (*second_liberty == NO_MOVE)
+       *second_liberty = liberty;
+      else if (liberty != *second_liberty)
+       return 0;
+    }
+    liberty_edge = mc->next_liberty_edge[liberty_edge];
+  } while (liberty_edge != first_liberty_edge);
+
+  return (*second_liberty != NO_MOVE);
+}
+
+
+/* Is a move at pos by color a self atari? */
+static int
+mc_is_self_atari(struct mc_board *mc, int pos, int color)
+{
+  int k;
+  int captured = NO_MOVE;
+  int liberty = NO_MOVE;
+  int reference;
+  int other;
+
+  /* Quick test which is often effective. */
+  if (((mc->board[SOUTH(pos)] == EMPTY)
+       + (mc->board[WEST(pos)] == EMPTY)
+       + (mc->board[NORTH(pos)] == EMPTY)
+       + (mc->board[EAST(pos)] == EMPTY)) > 1)
+    return 0;
+
+  /* Otherwise look closer. */
+  for (k = 0; k < 4; k++) {
+    int first_liberty_edge;
+    int liberty_edge;
+    int additional_liberty = 0;
+    int pos2 = pos + delta[k];
+    if (mc->board[pos2] == EMPTY) {
+      if (pos2 != liberty) {
+       if (liberty != NO_MOVE)
+         return 0;
+       else
+         liberty = pos2;
+      }
+    }
+    else if (IS_STONE(mc->board[pos2])) {
+      first_liberty_edge = (pos << 2) | k;
+      liberty_edge = mc->next_liberty_edge[first_liberty_edge];
+      while (liberty_edge != first_liberty_edge) {
+       int lib = liberty_edge >> 2;
+       if (lib != pos) {
+         additional_liberty = 1;
+         if (mc->board[pos2] == color) {
+           if (lib != liberty) {
+             if (liberty != NO_MOVE)
+               return 0;
+             else
+               liberty = lib;
+           }
+         }
+         else
+           break;
+       }
+       liberty_edge = mc->next_liberty_edge[liberty_edge];
+      }
+
+      if (mc->board[pos2] != color && additional_liberty == 0) {
+       captured = pos2;
+       if (pos2 != liberty) {
+         if (liberty != NO_MOVE)
+           return 0;
+         else
+           liberty = pos2;
+       }
+      }
+    }
+  }
+
+  if (liberty == NO_MOVE || captured == NO_MOVE)
+    return 1;
+
+  /* Now only the difficult case remains where there was no adjacent
+   * empty stone, no adjacent friendly stone with an extra liberty,
+   * and exactly one neighbor was captured. Then the question is
+   * whether the capture produced a second liberty elsewhere.
+   */
+  reference = mc->reference_stone[captured];
+  other = OTHER_COLOR(color);
+  for (k = 0; k < 4; k++) {
+    if (mc->board[pos + delta[k]] == color) {
+      int stone = pos + delta[k];
+      do {
+       int m;
+       for (m = 0; m < 4; m++) {
+         int pos2 = stone + delta[m];
+         if (mc->board[pos2] == other
+             && pos2 != captured
+             && mc->reference_stone[pos2] == reference)
+           return 0;
+       }
+       stone = mc->next_stone[stone];
+      } while (stone != pos + delta[k]);
+    }
+  }
+
+  return 1;
+}
+
+
+/* Update the local context information at pos, except the geometric
+ * information, by recomputing it. Most of the information is obtained
+ * by analyzing the presence of empty vertices or stones in atari
+ * adjacent to pos.
+ *
+ * FIXME: There's some computations wasted by calling the full
+ * mc_is_self_atari() and mc_stones_in_atari() functions when parts of
+ * the relevant information is already available.
+ */
+static void
+mc_update_local_context(struct mc_board *mc, int pos)
+{
+  int min_white_liberties = 0;
+  int min_black_liberties = 0;
+  int white_liberty_through_stones = 0;
+  int black_liberty_through_stones = 0;
+  int min_white_captured_stones = 0;
+  int min_black_captured_stones = 0;
+  int white_suicide = 0;
+  int black_suicide = 0;
+  int white_self_atari = 0;
+  int black_self_atari = 0;
+  int white_captured_stones = 0;
+  int black_captured_stones = 0;
+  int k;
+  for (k = 0; k < 4; k++) {
+    int pos2 = pos + delta[k];
+    switch (mc->board[pos2]) {
+      case EMPTY:
+       min_white_liberties++;
+       min_black_liberties++;
+       break;
+      case WHITE:
+       if (mc_is_in_atari2(mc, pos, (pos << 2) | k)) {
+         min_black_liberties++;
+         min_white_captured_stones++;
+       }
+       else
+         white_liberty_through_stones = 1;
+       break;
+      case BLACK:
+       if (mc_is_in_atari2(mc, pos, (pos << 2) | k)) {
+         min_white_liberties++;
+         min_black_captured_stones++;
+       }
+       else
+         black_liberty_through_stones = 1;
+       break;
+    }
+  }
+
+  if (min_white_liberties + white_liberty_through_stones == 0) {
+    white_suicide = 1;
+    white_self_atari = 1;
+  }
+  else if (min_white_liberties <= 1)
+    white_self_atari = mc_is_self_atari(mc, pos, WHITE);
+
+  if (min_black_liberties + black_liberty_through_stones == 0) {
+    black_suicide = 1;
+    black_self_atari = 1;
+  }
+  else if (min_black_liberties <= 1)
+    black_self_atari = mc_is_self_atari(mc, pos, BLACK);
+
+  if (min_white_captured_stones >= 3)
+    white_captured_stones = 3;
+  else if (min_white_captured_stones > 0)
+    white_captured_stones = mc_stones_in_atari(mc, pos, BLACK, 3);
+
+  if (min_black_captured_stones >= 3)
+    black_captured_stones = 3;
+  else if (min_black_captured_stones > 0)
+    black_captured_stones = mc_stones_in_atari(mc, pos, WHITE, 3);
+
+  mc->local_context[pos] &= 0xffff;
+  mc->local_context[pos] |= black_captured_stones << 16;
+  mc->local_context[pos] |= white_captured_stones << 18;
+  mc->local_context[pos] |= white_self_atari << 20;
+  mc->local_context[pos] |= black_self_atari << 21;
+  mc->local_context[pos] |= white_suicide << 22;
+  mc->local_context[pos] |= black_suicide << 23;
+}
+
+
+/* Play the move at pos by color. */
+static int
+mc_play_move(struct mc_board *mc, int pos, int color)
+{
+  int k;
+  int captured_stones = 0;
+  int num_direct_liberties = 0;
+  int pos2;
+
+  /* Clear the update queue. */
+  while (mc->queue[0] != 1) {
+    pos2 = mc->queue[0];
+    mc->queue[0] = mc->queue[pos2];
+    mc->queue[pos2] = 0;
+  }
+
+  if (pos == PASS_MOVE) {
+    if (mc->board_ko_pos != NO_MOVE)
+      hashdata_invert_ko(&mc->hash, mc->board_ko_pos);
+    mc->board_ko_pos = NO_MOVE;
+    return 1;
+  }
+  
+  /* The move must not be the ko point. */
+  if (pos == mc->board_ko_pos) {
+    if (mc->board[WEST(pos)] == OTHER_COLOR(color)
+       || mc->board[EAST(pos)] == OTHER_COLOR(color)) {
+      return 0;
+    }
+  }
+  
+  /* Test for suicide. */
+  if (mc_is_suicide(mc, pos, color))
+    return 0;
+
+  if (mc->board_ko_pos != NO_MOVE)
+    hashdata_invert_ko(&mc->hash, mc->board_ko_pos);
+  mc->board_ko_pos = NO_MOVE;
+
+#if !TURN_OFF_ASSERTIONS
+  ASSERT1(mc->board[pos] == EMPTY, pos);
+#endif
+  mc->board[pos] = color;
+  hashdata_invert_stone(&mc->hash, pos, color);
+  mc->next_stone[pos] = pos;
+  
+  /* Update the geometry part of the local context. */
+  mc->local_context[NW(pos)] |= color << 14;
+  mc->local_context[SW(pos)] |= color << 12;
+  mc->local_context[SE(pos)] |= color << 10;
+  mc->local_context[NE(pos)] |= color << 8;
+  mc->local_context[WEST(pos)] |= color << 6;
+  mc->local_context[SOUTH(pos)] |= color << 4;
+  mc->local_context[EAST(pos)] |= color << 2;
+  mc->local_context[NORTH(pos)] |= color;
+  
+  mc->reference_stone[pos] = pos;
+  mc->first_liberty_edge[pos] = 0;
+
+  for (k = 0; k < 4; k++) {
+    pos2 = pos + delta[k];
+    if (mc->board[pos2] == EMPTY) {
+      mc_add_liberty_edge(mc, pos, pos2, (k + 2) % 4);
+      num_direct_liberties++;
+      MC_ADD_TO_UPDATE_QUEUE(mc, pos2);
+    }
+  }
+  
+  for (k = 0; k < 4; k++) {
+    int liberty;
+    pos2 = pos + delta[k];
+    if (mc->board[pos2] == color) {
+      if (mc->reference_stone[pos] != mc->reference_stone[pos2]) {
+       if (mc_has_two_liberties_one_given(mc, pos2, pos, &liberty))
+         MC_ADD_TO_UPDATE_QUEUE(mc, liberty);
+       mc_join_strings(mc, pos, pos2);
+      }
+      mc_remove_liberty_edge(mc, pos2, pos, k);
+    }
+  }
+
+  for (k = 0; k < 4; k++) {
+    pos2 = pos + delta[k];
+    if (mc->board[pos2] == OTHER_COLOR(color)) {
+      if (mc_remove_liberty_edge(mc, pos2, pos, k) == 0)
+       captured_stones += mc_remove_string(mc, pos2);
+      else
+       mc_queue_max_two_liberties(mc, pos2);
+    }
+  }
+
+  if (captured_stones == 1
+      && mc->next_stone[pos] == pos
+      && num_direct_liberties == 0) {
+    mc->board_ko_pos = mc->first_liberty_edge[pos] >> 2;
+    hashdata_invert_ko(&mc->hash, mc->board_ko_pos);
+  }
+
+  mc_queue_max_two_liberties(mc, pos);
+
+  /* Traverse the update queue and update the local context for queued
+   * points.
+   */
+  for (pos2 = mc->queue[0]; pos2 != 1; pos2 = mc->queue[pos2])
+    if (pos2 != pos)
+      mc_update_local_context(mc, pos2);
+
+  /* Add the immediate neighborhood of the move to the update queue
+   * for recomputation of move values later on.
+   */
+  MC_ADD_TO_UPDATE_QUEUE(mc, pos);
+  for (k = 0; k < 8; k++)
+    if (mc->board[pos + delta[k]] == EMPTY)
+      MC_ADD_TO_UPDATE_QUEUE(mc, pos + delta[k]);
+  
+  return 1;
+}
+
+
+/***************************************************/
+
+#define NUM_GEOMETRIES 1107
+#define NUM_PROPERTIES 256
+
+struct mc_pattern_table
+{
+  unsigned short geometry_table[65536];
+  unsigned int values[(NUM_GEOMETRIES + 1) * NUM_PROPERTIES];
+};
+
+static struct mc_pattern_table mc_patterns;
+
+/* The pattern number is determined by the following bit layout:
+ * 18-8: Geometry number (range 1..1107)
+ * 7   : Opponent suicide
+ * 6   : Our self-atari
+ * 5   : Opponent self-atari
+ * 4,3 : Our captures
+ * 2,1 : Opponent captures
+ * 0   : Near
+ */
+static int
+mc_find_pattern_number(struct mc_board *mc, int move, int color,
+                      int near_previous_move)
+{
+  int local_context = mc->local_context[move];
+  int properties;
+  int geometry;
+
+  if (color == WHITE) {
+    properties = (((local_context >> 16) & 0xa0)
+                 | ((local_context >> 14) & 0x40)
+                 | ((local_context >> 17) & 0x06)
+                 | ((local_context >> 13) & 0x18));
+    geometry = local_context & 0xffff;
+  }
+  else {
+    properties = (local_context >> 15) & 0xfe;
+    geometry = (((local_context & 0x5555) << 1)
+               | ((local_context & 0xaaaa) >> 1));
+  }
+
+  return ((mc_patterns.geometry_table[geometry] << 8)
+         | properties
+         | near_previous_move);
+}
+
+
+/* Geometry patterns have the neighborhood defined by the order
+ *
+ * 637
+ * 2*4
+ * 518
+ *
+ * where * is the point to play. The reason for this seemingly
+ * arbitrary order is to be consistent with the delta[] array
+ * of point offsets.
+ *
+ * The 8 rotation/mirror transformations are given by reordering the
+ * points like this:
+ * 12345678 no transform
+ * 41238567 rotation 90
+ * 34127856 rotation 180
+ * 23416785 rotation 270
+ * 14328765 mirror
+ * 21435876 mirror + rotation 90
+ * 32146587 mirror + rotation 180
+ * 43217658 mirror + rotation 270
+ *
+ * The geometry is encoded by a 16-bit integer where point 1 goes into
+ * the 2 least significant bits and point 8 into the 2 most
+ * significant bits. Each pair of bits contain the corresponding
+ * EMPTY, WHITE, BLACK, GRAY (off board) values.
+ */
+static unsigned short
+mc_register_geometry_pattern(unsigned int pattern, unsigned short n)
+{
+  int k;
+  int j;
+  unsigned int transformed_pattern;
+  
+  if (mc_patterns.geometry_table[pattern] != 0)
+    return 0;
+
+  for (k = 0; k < 8; k++) {
+    transformed_pattern = pattern;
+    if (k >= 4) {
+      /* Mirror pattern. */
+      transformed_pattern = (((pattern & 0x0300) << 6)
+                            | ((pattern & 0x000c) << 4)
+                            | ((pattern & 0x0c00) << 2)
+                            | (pattern & 0x0033)
+                            | ((pattern & 0x3000) >> 2)
+                            | ((pattern & 0x00c0) >> 4)
+                            | ((pattern & 0xc000) >> 6));
+    }
+
+    /* Rotate pattern. */
+    for (j = 0; j < k % 4; j++) {
+      transformed_pattern = (((transformed_pattern & 0xc0c0) >> 6)
+                            | ((transformed_pattern & 0x3f3f) << 2));
+    }
+    mc_patterns.geometry_table[transformed_pattern] = n;
+  }
+
+  return 1;
+}
+
+
+/* Compute the mapping from 8-point local neighborhoods to rotation
+ * invariant geometry numbers.
+ */
+static void
+mc_init_pattern_geometries(void)
+{
+  unsigned int pattern;
+  unsigned short n = 1;
+
+  static int initialized = 0;
+  if (initialized)
+    return;
+  initialized = 1;
+
+  memset(mc_patterns.geometry_table, 0, sizeof(mc_patterns.geometry_table));
+  
+  for (pattern = 0; pattern < 65536; pattern++) {
+    unsigned int off_board = (pattern & (pattern >> 1)) & 0x5555;
+    if (off_board == 0x0 || off_board == 0x1410 || off_board == 0x5450)
+      n += mc_register_geometry_pattern(pattern, n);
+  }
+
+  gg_assert(n == NUM_GEOMETRIES + 1);
+}
+
+
+/* Determine which geometry numbers are matched by a pattern with
+ * possible wildcards, for use when loading pattern databases.
+ *
+ * This function is recursive with the argument n determining which
+ * point in the neighborhood is expanded for wildcards.
+ */
+static void
+mc_match_geometries(int pattern[8], int *matching_geometries, int n)
+{
+  int k;
+  int geometry = 0;
+  if (n == 8) {
+    /* The pattern has been fully expanded. Find the geometry number. */
+    for (k = 0; k < 8; k++) {
+      if (pattern[k] == 'O')
+       geometry |= WHITE << (2 * k);
+      else if (pattern[k] == 'X')
+       geometry |= BLACK << (2 * k);
+      else if (pattern[k] == '+' || pattern[k] == '|' || pattern[k] == '-')
+       geometry |= (WHITE | BLACK) << (2 * k);
+    }
+    if (mc_patterns.geometry_table[geometry] != 0) {
+      matching_geometries[mc_patterns.geometry_table[geometry]] = 1;
+    }
+  }
+  else {
+    /* Recurse with all possible expansions of the current
+     * neighborhood point.
+     */
+    int new_pattern[8];
+    memcpy(new_pattern, pattern, sizeof(new_pattern));
+    switch (pattern[n]) {
+      case '.':
+      case 'O':
+      case 'X':
+      case '|':
+      case '-':
+      case '+':
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       break;
+      case 'o':
+       new_pattern[n] = '.';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = 'O';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       break;
+      case 'x':
+       new_pattern[n] = '.';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = 'X';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       break;
+      case '?':
+       new_pattern[n] = '.';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = 'O';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = 'X';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       break;
+      case '%':
+       new_pattern[n] = '.';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = 'O';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = 'X';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       new_pattern[n] = '+';
+       mc_match_geometries(new_pattern, matching_geometries, n + 1);
+       break;
+    }
+  }
+}
+
+
+/* Clear a subset of the property combinations determined by shift,
+ * mask, and value.
+ */
+static void
+mc_clear_properties(int *properties, int shift, int mask, int value)
+{
+  int k;
+  for (k = 0; k < NUM_PROPERTIES; k++)
+    if (((k >> shift) & mask) == value)
+      properties[k] = 0;
+}
+
+
+/* Find which property combinations are consistent with the rules
+ * given in buf.
+ */
+static void
+mc_analyze_properties(char *buf, int *properties)
+{
+  int k;
+
+  /* First set all properties. */
+  for (k = 0; k < NUM_PROPERTIES; k++)
+    properties[k] = 1;
+
+  /* Then reset the ones which are inconsistent. */
+  if (strstr(buf, "near"))
+    mc_clear_properties(properties, 0, 1, 0);
+  if (strstr(buf, "far"))
+    mc_clear_properties(properties, 0, 1, 1);
+  if (strstr(buf, "xcap0")) {
+    mc_clear_properties(properties, 1, 3, 1);
+    mc_clear_properties(properties, 1, 3, 2);
+    mc_clear_properties(properties, 1, 3, 3);
+  }
+  if (strstr(buf, "xcap1+"))
+    mc_clear_properties(properties, 1, 3, 0);
+  else if (strstr(buf, "xcap1-")) {
+    mc_clear_properties(properties, 1, 3, 2);
+    mc_clear_properties(properties, 1, 3, 3);
+  }
+  else if (strstr(buf, "xcap1")) {
+    mc_clear_properties(properties, 1, 3, 0);
+    mc_clear_properties(properties, 1, 3, 2);
+    mc_clear_properties(properties, 1, 3, 3);
+  }
+  if (strstr(buf, "xcap2+")) {
+    mc_clear_properties(properties, 1, 3, 0);
+    mc_clear_properties(properties, 1, 3, 1);
+  }
+  else if (strstr(buf, "xcap2-"))
+    mc_clear_properties(properties, 1, 3, 3);
+  else if (strstr(buf, "xcap2")) {
+    mc_clear_properties(properties, 1, 3, 0);
+    mc_clear_properties(properties, 1, 3, 1);
+    mc_clear_properties(properties, 1, 3, 3);
+  }
+  if (strstr(buf, "xcap3")) {
+    mc_clear_properties(properties, 1, 3, 0);
+    mc_clear_properties(properties, 1, 3, 1);
+    mc_clear_properties(properties, 1, 3, 2);
+  }
+  if (strstr(buf, "ocap0")) {
+    mc_clear_properties(properties, 3, 3, 1);
+    mc_clear_properties(properties, 3, 3, 2);
+    mc_clear_properties(properties, 3, 3, 3);
+  }
+  if (strstr(buf, "ocap1+"))
+    mc_clear_properties(properties, 3, 3, 0);
+  else if (strstr(buf, "ocap1-")) {
+    mc_clear_properties(properties, 3, 3, 2);
+    mc_clear_properties(properties, 3, 3, 3);
+  }
+  else if (strstr(buf, "ocap1")) {
+    mc_clear_properties(properties, 3, 3, 0);
+    mc_clear_properties(properties, 3, 3, 2);
+    mc_clear_properties(properties, 3, 3, 3);
+  }
+  if (strstr(buf, "ocap2+")) {
+    mc_clear_properties(properties, 3, 3, 0);
+    mc_clear_properties(properties, 3, 3, 1);
+  }
+  else if (strstr(buf, "ocap2-"))
+    mc_clear_properties(properties, 3, 3, 3);
+  else if (strstr(buf, "ocap2")) {
+    mc_clear_properties(properties, 3, 3, 0);
+    mc_clear_properties(properties, 3, 3, 1);
+    mc_clear_properties(properties, 3, 3, 3);
+  }
+  if (strstr(buf, "ocap3")) {
+    mc_clear_properties(properties, 3, 3, 0);
+    mc_clear_properties(properties, 3, 3, 1);
+    mc_clear_properties(properties, 3, 3, 2);
+  }
+  if (strstr(buf, "xsafe"))
+    mc_clear_properties(properties, 5, 1, 1);
+  if (strstr(buf, "xunsafe"))
+    mc_clear_properties(properties, 5, 1, 0);
+  if (strstr(buf, "osafe"))
+    mc_clear_properties(properties, 6, 1, 1);
+  if (strstr(buf, "ounsafe"))
+    mc_clear_properties(properties, 6, 1, 0);
+  if (strstr(buf, "xsuicide"))
+    mc_clear_properties(properties, 7, 1, 0);
+  if (strstr(buf, "xnosuicide"))
+    mc_clear_properties(properties, 7, 1, 1);
+}
+
+
+/* Export the size of the array mc_patterns.values so that external
+ * callers of mc_load_patterns_from_db() know how big arrays to
+ * allocate.
+ */
+int
+mc_get_size_of_pattern_values_table(void)
+{
+  return (NUM_GEOMETRIES + 1) * NUM_PROPERTIES;
+}
+
+
+/* Load Monte Carlo patterns from file in .db format. If values is
+ * NULL, load directly into mc_patterns.values.
+ */
+int
+mc_load_patterns_from_db(const char *filename, unsigned int *values)
+{
+  FILE *pattern_file;
+  char buf[80];
+  unsigned int value;
+  int pattern_line = 0;
+  int current_pattern[8];
+  int patterns_expanded = 0;
+  int *matching_geometries;
+  int properties[NUM_PROPERTIES];
+  int k;
+  int m;
+
+  if (!values)
+    values = mc_patterns.values;
+
+  mc_init_pattern_geometries();
+  
+  pattern_file = fopen(filename, "r");
+  if (!pattern_file) {
+    gprintf("Failed to open %s file.\n", filename);
+    return 0;
+  }
+
+  matching_geometries = malloc((NUM_GEOMETRIES + 1)
+                              * sizeof(*matching_geometries));
+
+  /* Set unloaded patterns to a "-1" value. */
+  for (k = 1; k <= NUM_GEOMETRIES; k++)
+    for (m = 0; m < NUM_PROPERTIES; m++)
+      values[k * NUM_PROPERTIES + m] = 0xffffffffU;
+
+  /* Loop over the rows of the pattern database. */
+  while (fgets(buf, 80, pattern_file)) {
+    if (strchr(".xXoO|+-?%", buf[0])) {
+      /* Pattern line found */
+      patterns_expanded = 0;
+      if (pattern_line == 0) {
+       current_pattern[5] = buf[0];
+       current_pattern[2] = buf[1];
+       current_pattern[6] = buf[2];
+      }
+      else if (pattern_line == 1) {
+       current_pattern[1] = buf[0];
+       current_pattern[3] = buf[2];
+      }
+      else if (pattern_line == 2) {
+       current_pattern[4] = buf[0];
+       current_pattern[0] = buf[1];
+       current_pattern[7] = buf[2];
+      }
+      pattern_line++;
+    }
+    else if (sscanf(buf, ":%u", &value) == 1) {
+      /* Colon line found. */
+      if (value > 10000000)
+       fprintf(stderr, "Warning: pattern values should be at most 10000000.");
+
+      if (!patterns_expanded) {
+       /* Find the set of rotation invariant geometries matching the
+        * pattern.
+        */
+       memset(matching_geometries, 0,
+              (NUM_GEOMETRIES + 1) * sizeof(*matching_geometries));
+       mc_match_geometries(current_pattern, matching_geometries, 0);
+       patterns_expanded = 1;
+      }
+
+      /* Find the set of matching property values. */
+      mc_analyze_properties(buf, properties);
+
+      /* Set the value for the combinations of matched geometries and
+       * properties, except those which have already been matched by a
+       * previous pattern.
+       */
+      for (k = 1; k <= NUM_GEOMETRIES; k++)
+       if (matching_geometries[k])
+         for (m = 0; m < NUM_PROPERTIES; m++)
+           if (properties[m] && values[k * NUM_PROPERTIES + m] == 0xffffffffU)
+             values[k * NUM_PROPERTIES + m] = value;
+
+      pattern_line = 0;
+    }
+  }
+
+  fclose(pattern_file);
+
+  /* Set unmatched patterns/properties to a value of 1. */
+  for (k = 1; k <= NUM_GEOMETRIES; k++)
+    for (m = 0; m < NUM_PROPERTIES; m++)
+      if (values[k * NUM_PROPERTIES + m] == 0xffffffffU)
+       values[k * NUM_PROPERTIES + m] = 1;
+
+  free(matching_geometries);
+  return 1;
+}
+
+
+/* Set up local pattern values. */
+void
+mc_init_patterns(const unsigned int *values)
+{
+  mc_init_pattern_geometries();
+  memcpy(mc_patterns.values, values, sizeof(mc_patterns.values));
+}
+
+
+/* Initialize the data structures used to keep track of the local
+ * pattern values.
+ */
+static void
+mc_init_move_values(struct mc_board *mc)
+{
+  int pos;
+  int k;
+
+  memset(mc->move_values_white, 0, sizeof(mc->move_values_white));
+  memset(mc->move_values_black, 0, sizeof(mc->move_values_black));
+  memset(mc->partitioned_move_value_sums_white, 0,
+        sizeof(mc->partitioned_move_value_sums_white));
+  memset(mc->partitioned_move_value_sums_black, 0,
+        sizeof(mc->partitioned_move_value_sums_black));
+  memset(mc->move_partition_lists_white, 0,
+        sizeof(mc->move_partition_lists_white));
+  memset(mc->move_partition_lists_black, 0,
+        sizeof(mc->move_partition_lists_black));
+
+  mc->move_value_sum_white = 0.0;
+  mc->move_value_sum_black = 0.0;
+
+  for (k = 0; k < NUM_MOVE_PARTITIONS; k++) {
+    mc->move_partition_lists_white[k] = 1;
+    mc->move_partition_lists_black[k] = 1;
+  }
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (mc->board[pos] == EMPTY) {
+      int partition = pos & (NUM_MOVE_PARTITIONS - 1);
+      if (!mc_is_suicide(mc, pos, WHITE)) {
+       int pattern = mc_find_pattern_number(mc, pos, WHITE, 0);
+       unsigned int value = mc_patterns.values[pattern];
+       mc->move_values_white[pos] = value;
+       mc->partitioned_move_value_sums_white[partition] += value;
+       mc->move_value_sum_white += value;
+       mc->move_partition_lists_white[pos] = mc->move_partition_lists_white[partition];
+       mc->move_partition_lists_white[partition] = pos;
+      }
+      if (!mc_is_suicide(mc, pos, BLACK)) {
+       int pattern = mc_find_pattern_number(mc, pos, BLACK, 0);
+       unsigned int value = mc_patterns.values[pattern];
+       mc->move_values_black[pos] = value;
+       mc->partitioned_move_value_sums_black[partition] += value;
+       mc->move_value_sum_black += value;
+       mc->move_partition_lists_black[pos] = mc->move_partition_lists_black[partition];
+       mc->move_partition_lists_black[partition] = pos;
+      }
+    }
+  }
+}
+
+
+/* Add a move at a vertex which was previously not a legal move. */
+static void
+mc_add_move(struct mc_board *mc, int pos, int color, int partition,
+           unsigned int *move_values, int *partition_lists,
+           unsigned int *partition_sums, unsigned int *move_value_sum)
+{
+  int pattern = mc_find_pattern_number(mc, pos, color, 0);
+  unsigned int value = mc_patterns.values[pattern];
+  partition_lists[pos] = partition_lists[partition];
+  partition_lists[partition] = pos;
+  move_values[pos] = value;
+  partition_sums[partition] += value;
+  *move_value_sum += value;
+}
+
+
+/* Update a move value. */
+static void
+mc_update_move(struct mc_board *mc, int pos, int color, int partition,
+              unsigned int *move_values, unsigned int *partition_sums,
+              unsigned int *move_value_sum)
+{
+  int pattern = mc_find_pattern_number(mc, pos, color, 0);
+  unsigned int value = mc_patterns.values[pattern];
+  partition_sums[partition] += value - move_values[pos];
+  *move_value_sum += value - move_values[pos];
+  move_values[pos] = value;
+}
+
+
+/* Remove a move because it has been played or has become suicide. */
+static void
+mc_remove_move(int pos, int partition, unsigned int *move_values,
+              int *partition_lists, unsigned int *partition_sums,
+              unsigned int *move_value_sum)
+{
+  int pos2;
+  int pos3;
+  for (pos2 = partition; partition_lists[pos2] != 1; pos2 = partition_lists[pos2]) {
+    if (partition_lists[pos2] == pos)
+      break;
+  }
+  pos3 = partition_lists[pos2];
+  partition_lists[pos2] = partition_lists[pos3];
+  partition_lists[pos3] = 0;
+  partition_sums[partition] -= move_values[pos];
+  *move_value_sum -= move_values[pos];
+  move_values[pos] = 0.0;
+}
+
+
+/* Update move values for the moves listed in the update queue. */
+static void
+mc_update_move_values(struct mc_board *mc)
+{
+  int pos;
+  int partition;
+  for (pos = mc->queue[0]; pos != 1; pos = mc->queue[pos]) {
+    partition = pos & (NUM_MOVE_PARTITIONS - 1);
+    if ((mc->board[pos] != EMPTY || mc_is_suicide(mc, pos, WHITE))) {
+      if (mc->move_partition_lists_white[pos] != 0) {
+       mc_remove_move(pos, partition, mc->move_values_white,
+                      mc->move_partition_lists_white,
+                      mc->partitioned_move_value_sums_white,
+                      &mc->move_value_sum_white);
+      }
+    }
+    else {
+      if (mc->move_partition_lists_white[pos] == 0)
+       mc_add_move(mc, pos, WHITE, partition, mc->move_values_white,
+                   mc->move_partition_lists_white,
+                   mc->partitioned_move_value_sums_white,
+                   &mc->move_value_sum_white);
+      else
+       mc_update_move(mc, pos, WHITE, partition, mc->move_values_white,
+                      mc->partitioned_move_value_sums_white,
+                      &mc->move_value_sum_white);
+    }
+
+    if ((mc->board[pos] != EMPTY || mc_is_suicide(mc, pos, BLACK))) {
+      if (mc->move_partition_lists_black[pos] != 0) {
+       mc_remove_move(pos, partition, mc->move_values_black,
+                      mc->move_partition_lists_black,
+                      mc->partitioned_move_value_sums_black,
+                      &mc->move_value_sum_black);
+      }
+    }
+    else {
+      if (mc->move_partition_lists_black[pos] == 0)
+       mc_add_move(mc, pos, BLACK, partition, mc->move_values_black,
+                   mc->move_partition_lists_black,
+                   mc->partitioned_move_value_sums_black,
+                   &mc->move_value_sum_black);
+      else
+       mc_update_move(mc, pos, BLACK, partition, mc->move_values_black,
+                      mc->partitioned_move_value_sums_black,
+                      &mc->move_value_sum_black);
+    }
+  }
+}
+
+
+/***************************************************/
+
+#define ASSERT_LEGAL 1
+
+struct mc_game {
+  struct mc_board mc;
+  int move_history[600];
+  unsigned char settled[BOARDMAX];
+  int color_to_move;
+  int last_move;
+  int consecutive_passes;
+  int consecutive_ko_captures;
+  int depth;
+};
+
+
+/* Generate a random move. */
+static int
+mc_generate_random_move(struct mc_game *game)
+{
+  struct mc_board *mc = &game->mc;
+  int last_move = game->last_move;
+  int color = game->color_to_move;
+  int depth = game->depth;
+  
+  int pos;
+
+  int near_moves[BOARDMAX];
+  unsigned int saved_near_move_values[BOARDMAX];
+  int num_near_moves;
+  unsigned int *move_values;
+  unsigned int *partition_sums;
+  int *partition_lists;
+  unsigned int *move_value_sum;
+  unsigned int saved_ko_value = 0;
+  int partition;
+  int move;
+  int k;
+  int x;
+
+  /* If we get this deep we are almost certainly playing triple ko
+   * without alternative options, so just give up and score as is.
+   *
+   * FIXME: Handle this in some proper way.
+   */
+  if (depth > 600) {
+    if (mc_debug) {
+      int pos;
+      fprintf(stderr, "Reached 600 iterations.\n");
+      mc_showboard(mc, stderr);
+      for (k = 0; k < game->depth; k++)
+       gprintf("%1m ", game->move_history[k]);
+      gprintf("\n");
+      for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+       if (mc->board[pos] == EMPTY) {
+         gprintf("%1m ", pos);
+         fprintf(stderr, "white %7d black %7d white near %7d black near %7d\n",
+                 (int) mc->move_values_white[pos],
+                 (int) mc->move_values_black[pos],
+                 mc_patterns.values[mc_find_pattern_number(mc, pos, WHITE, 1)],
+                 mc_patterns.values[mc_find_pattern_number(mc, pos, BLACK, 1)]);
+       }
+    }
+    return PASS_MOVE;
+  }
+
+  if (color == WHITE) {
+    move_values = mc->move_values_white;
+    partition_sums = mc->partitioned_move_value_sums_white;
+    partition_lists = mc->move_partition_lists_white;
+    move_value_sum = &mc->move_value_sum_white;
+  }
+  else {
+    move_values = mc->move_values_black;
+    partition_sums = mc->partitioned_move_value_sums_black;
+    partition_lists = mc->move_partition_lists_black;
+    move_value_sum = &mc->move_value_sum_black;
+  }
+  
+  /* Temporarily update pattern values for NEAR moves. We define
+   * NEAR moves as those which had their values updated during the
+   * previous mc_play_move() call and can be found by traversing the
+   * update queue.
+   */
+  num_near_moves = 0;
+  if (last_move != PASS_MOVE) {
+    for (pos = mc->queue[0]; pos != 1; pos = mc->queue[pos]) {
+      if (mc->board[pos] == EMPTY && partition_lists[pos] != 0) {
+       unsigned int old_value = move_values[pos];
+       int pattern = mc_find_pattern_number(mc, pos, color, 1);
+       unsigned int new_value = mc_patterns.values[pattern];
+       partition = pos & (NUM_MOVE_PARTITIONS - 1);
+       saved_near_move_values[num_near_moves] = old_value;
+       near_moves[num_near_moves++] = pos;
+       move_values[pos] = new_value;
+       partition_sums[partition] += new_value - old_value;
+         *move_value_sum += new_value - old_value;
+      }
+    }
+  }
+  
+  /* Temporarily clear the move value of an illegal ko capture. */
+  if (mc->board_ko_pos != NO_MOVE) {
+    if (mc->board[WEST(mc->board_ko_pos)] == OTHER_COLOR(color)
+       || mc->board[EAST(mc->board_ko_pos)] == OTHER_COLOR(color)) {
+      partition = mc->board_ko_pos & (NUM_MOVE_PARTITIONS - 1);
+      saved_ko_value = move_values[mc->board_ko_pos];
+      move_values[mc->board_ko_pos] = 0;
+      partition_sums[partition] -= saved_ko_value;
+      *move_value_sum -= saved_ko_value;
+    }
+  }
+  
+  /* Sample a move randomly according to the distribution given by
+   * the move values.
+   */
+  if (*move_value_sum == 0)
+    move = PASS_MOVE;
+  else {
+    /* First choose a partition. */
+    x = (int) (gg_drand() * *move_value_sum);
+    for (k = 0; k < NUM_MOVE_PARTITIONS; k++) {
+      x -= partition_sums[k];
+      if (x < 0)
+       break;
+    }
+
+    /* Then choose a move in that partition. */
+    x = (unsigned int) (gg_drand() * partition_sums[k]);
+    for (pos = partition_lists[k]; pos != 1; pos = partition_lists[pos]) {
+      x -= move_values[pos];
+      if (x < 0)
+       break;
+    }
+
+    move = pos;
+#if !TURN_OFF_ASSERTIONS
+    ASSERT1(move == PASS_MOVE || move_values[move] > 0, move);
+    ASSERT1(move == PASS_MOVE || mc->board[move] == EMPTY, move);
+    ASSERT1(mc_is_legal(mc, move, color), move);
+#endif
+  }
+
+  /* Reset the value of an illegal ko capture. */
+  if (saved_ko_value > 0) {
+    partition = mc->board_ko_pos & (NUM_MOVE_PARTITIONS - 1);
+    partition_sums[partition] += saved_ko_value - move_values[mc->board_ko_pos];
+    *move_value_sum += saved_ko_value - move_values[mc->board_ko_pos];
+    move_values[mc->board_ko_pos] = saved_ko_value;
+  }
+  
+  /* Reset move values for NEAR moves. */
+  for (k = 0; k < num_near_moves; k++) {
+    unsigned int old_value;
+    unsigned int new_value;
+    pos = near_moves[k];
+    partition = pos & (NUM_MOVE_PARTITIONS - 1);
+    old_value = move_values[pos];
+    new_value = saved_near_move_values[k];
+    move_values[pos] = new_value;
+    partition_sums[partition] += new_value - old_value;
+    *move_value_sum += new_value - old_value;
+  }
+
+  return move;
+}
+
+
+static int mc_play_random_move(struct mc_game *game, int move)
+{
+  int result = mc_play_move(&game->mc, move, game->color_to_move);
+  mc_update_move_values(&game->mc);
+  
+  if (result) {
+    if (is_pass(move))
+      game->consecutive_passes++;
+    else {
+      game->consecutive_passes = 0;
+    }
+      
+    if (game->mc.board_ko_pos != NO_MOVE)
+      game->consecutive_ko_captures++;
+    else
+      game->consecutive_ko_captures = 0;
+
+    game->move_history[game->depth] = move;
+    game->last_move = move;
+    game->color_to_move = OTHER_COLOR(game->color_to_move);
+    game->depth++;
+  }
+    
+  return result;
+}
+
+static int mc_play_random_game(struct mc_game *game)
+{
+  struct mc_board *mc = &game->mc;
+  
+  int score = 0;
+  int pos;
+  int k;
+  int result;
+  int move;
+
+  /* First finish the game, if it isn't already. */
+  while (game->consecutive_passes < 3) {
+    move = mc_generate_random_move(game);
+    result = mc_play_random_move(game, move);
+    ASSERT1(result, move);
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (MC_ON_BOARD(pos)) {
+      if (game->settled[pos] == WHITE)
+       score++;
+      else if (game->settled[pos] == BLACK)
+       score--;
+      else {
+       int pos2 = pos;
+       if (mc->board[pos] == EMPTY)
+         for (k = 0; k < 4; k++) {
+           pos2 = pos + delta[k];
+           if (IS_STONE(mc->board[pos2]))
+             break;
+         }
+       
+       score += 2 * (mc->board[pos2] == WHITE) - 1;
+      }
+    }
+
+  return score;
+}
+
+/******************* UCT search ***********************/
+
+#define UCT_MAX_SEARCH_DEPTH BOARDMAX
+
+struct bitboard {
+  /* FIXME: Do this properly. */
+  unsigned int bits[1 + BOARDMAX / 32];
+};
+
+struct uct_arc {
+  int move;
+  struct uct_node *node;
+  struct uct_arc *next;
+};
+
+struct uct_node {
+  int wins;
+  int games;
+  float sum_scores;
+  float sum_scores2;
+  struct uct_arc *child;
+  struct bitboard untested;
+  Hash_data boardhash;
+};
+
+struct uct_tree {
+  struct uct_node *nodes;
+  struct uct_arc *arcs;
+  unsigned int *hashtable_odd;
+  unsigned int *hashtable_even;
+  unsigned int hashtable_size;
+  int num_nodes;
+  int num_used_nodes;
+  int num_arcs;
+  int num_used_arcs;
+  int *forbidden_moves;
+  struct mc_game game;
+  int move_score[BOARDSIZE];
+  int move_ordering[BOARDSIZE];
+  int inverse_move_ordering[BOARDSIZE];
+  int num_ordered_moves;
+};
+
+
+static struct uct_node *
+uct_init_node(struct uct_tree *tree, int *allowed_moves)
+{
+  int pos;
+  struct uct_node *node = &tree->nodes[tree->num_used_nodes++];
+
+  node->wins = 0;
+  node->games = 0;
+  node->sum_scores = 0.0;
+  node->sum_scores2 = 0.0;
+  node->child = NULL;
+  memset(node->untested.bits, 0, sizeof(node->untested.bits));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (tree->game.mc.board[pos] == EMPTY
+       && !tree->forbidden_moves[pos]
+       && (!allowed_moves || allowed_moves[pos])) {
+      node->untested.bits[pos / 32] |= 1 << pos % 32;
+    }
+  }
+  node->boardhash = tree->game.mc.hash;
+
+  return node;
+}
+
+static struct uct_node *
+uct_find_node(struct uct_tree *tree, struct uct_node *parent, int move)
+{
+  struct uct_node *node = NULL;
+  Hash_data *boardhash = &tree->game.mc.hash;
+  unsigned int hash_index = hashdata_remainder(*boardhash,
+                                              tree->hashtable_size);
+  unsigned int *hashtable = tree->hashtable_even;
+  if (tree->game.depth & 1)
+    hashtable = tree->hashtable_odd;
+
+  while (hashtable[hash_index] != 0) {
+    int node_index = hashtable[hash_index];
+    gg_assert(node_index > 0 && node_index < tree->num_nodes);
+    if (hashdata_is_equal(tree->nodes[node_index].boardhash, *boardhash)) {
+      node = &tree->nodes[node_index];
+      break;
+    }
+    hash_index++;
+    if (hash_index >= tree->hashtable_size)
+      hash_index = 0;
+  }
+
+  if (!node) {
+    node = uct_init_node(tree, NULL);
+    gg_assert(hash_index < tree->hashtable_size);
+    hashtable[hash_index] = node - tree->nodes;
+  }
+  
+  /* Add the node as the first of the siblings. */
+  if (parent) {
+    struct uct_arc *arc = &tree->arcs[tree->num_used_arcs++];
+    gg_assert(tree->num_used_arcs < tree->num_arcs);
+    arc->move = move;
+    arc->node = node;
+    if (parent->child)
+      arc->next = parent->child;
+    else
+      arc->next = NULL;
+    parent->child = arc;
+  }
+
+  return node;
+}
+
+
+static void
+uct_update_move_ordering(struct uct_tree *tree, int move)
+{
+  int score = ++tree->move_score[move];
+  while (1) {
+    int n = tree->inverse_move_ordering[move];
+    int preceding_move;
+    if (n == 0)
+      return;
+    preceding_move = tree->move_ordering[n - 1];
+    if (tree->move_score[preceding_move] >= score)
+      return;
+
+    /* Swap move ordering. */
+    tree->move_ordering[n - 1] = move;
+    tree->move_ordering[n] = preceding_move;
+    tree->inverse_move_ordering[move] = n - 1;
+    tree->inverse_move_ordering[preceding_move] = n;
+  }
+}
+
+
+static void
+uct_init_move_ordering(struct uct_tree *tree)
+{
+  int pos;
+  int k = 0;
+  /* FIXME: Exclude forbidden moves. */
+  memset(tree->move_score, 0, sizeof(tree->move_score));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      tree->move_ordering[k] = pos;
+      tree->inverse_move_ordering[pos] = k;
+      k++;
+    }
+  
+  tree->num_ordered_moves = k;
+
+  /* FIXME: Quick and dirty experiment. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)) {
+      tree->move_score[pos] = (int) (10 * potential_moves[pos]) - 1;
+      uct_update_move_ordering(tree, pos);
+    }
+  }
+}
+
+
+static float
+uct_finish_and_score_game(struct mc_game *game)
+{
+  return komi + mc_play_random_game(game);
+}
+
+static struct uct_node *
+uct_play_move(struct uct_tree *tree, struct uct_node *node, float alpha,
+             float *gamma, int *move)
+{
+  struct uct_arc *child_arc;
+  int pos;
+  struct uct_arc *next_arc = NULL;
+  struct uct_arc *best_winrate_arc = NULL;
+  float best_uct_value = 0.0;
+  float best_winrate = 0.0;
+  
+  for (child_arc = node->child; child_arc; child_arc = child_arc->next) {
+    struct uct_node *child_node = child_arc->node;
+    float winrate = (float) child_node->wins / child_node->games;
+    float uct_value;
+    float log_games_ratio = log(node->games) / child_node->games;
+    float x = winrate * (1.0 - winrate) + sqrt(2.0 * log_games_ratio);
+    if (x < 0.25)
+      x = 0.25;
+    uct_value = winrate + sqrt(2 * log_games_ratio * x / (1 + tree->game.depth));
+    if (uct_value > best_uct_value) {
+      next_arc = child_arc;
+      best_uct_value = uct_value;
+    }
+
+    if (winrate > best_winrate) {
+      best_winrate_arc = child_arc;
+      best_winrate = winrate;
+    }
+  }
+
+  *gamma = best_winrate;
+  if (best_winrate > alpha)
+    next_arc = best_winrate_arc;
+  else {
+    /* First play a random previously unplayed move, if any. */
+    int k;
+    for (k = -1; k < tree->num_ordered_moves; k++) {
+      if (k == -1 && best_uct_value > 0.0)
+       continue;
+      else if (k == -1)
+       pos = mc_generate_random_move(&tree->game);
+      else
+       pos = tree->move_ordering[k];
+      
+      if (node->untested.bits[pos / 32] & (1 << (pos % 32))) {
+       int r;
+       int proper_small_eye = 1;
+       struct mc_board *mc = &tree->game.mc;
+       *move = pos;
+       node->untested.bits[*move / 32] &= ~(1 << *move % 32);
+
+       for (r = 0; r < 4; r++) {
+         if (mc->board[pos + delta[r]] == EMPTY
+             || mc->board[pos + delta[r]] == OTHER_COLOR(tree->game.color_to_move)) {
+           proper_small_eye = 0;
+           break;
+         }
+       }
+       
+       if (proper_small_eye) {
+         int diagonal_value = 0;
+         for (r = 4; r < 8; r++) {
+           int pos2 = pos + delta[r];
+           if (!MC_ON_BOARD(pos2))
+             diagonal_value++;
+           else if (mc->board[pos2] == OTHER_COLOR(tree->game.color_to_move))
+             diagonal_value += 2;
+         }
+         if (diagonal_value > 3)
+           proper_small_eye = 0;
+       }
+       
+       if (!proper_small_eye && mc_play_random_move(&tree->game, *move))
+         return uct_find_node(tree, node, *move);
+      }
+    }
+  }
+  
+  if (!next_arc) {
+    mc_play_random_move(&tree->game, PASS_MOVE);
+    *move = PASS_MOVE;
+    return uct_find_node(tree, node, PASS_MOVE);
+  }
+
+  *move = next_arc->move;
+  mc_play_random_move(&tree->game, next_arc->move);
+  
+  return next_arc->node;
+}
+
+static float
+uct_traverse_tree(struct uct_tree *tree, struct uct_node *node,
+                 float alpha, float beta)
+{
+  int color = tree->game.color_to_move;
+  int num_passes = tree->game.consecutive_passes;
+  float result;
+  float gamma;
+  int move = PASS_MOVE;
+  
+  /* FIXME: Unify these. */
+  if (num_passes == 3 || tree->game.depth >= UCT_MAX_SEARCH_DEPTH
+      || (node->games == 0 && node != tree->nodes))
+    result = uct_finish_and_score_game(&tree->game);
+  else {
+    struct uct_node *next_node;
+    next_node = uct_play_move(tree, node, alpha, &gamma, &move);
+    
+    gamma += 0.00;
+    if (gamma > 0.8)
+      gamma = 0.8;
+    result = uct_traverse_tree(tree, next_node, beta, gamma);
+  }
+
+  node->games++;
+  if ((result > 0) ^ (color == WHITE)) {
+    node->wins++;
+    if (move != PASS_MOVE)
+      uct_update_move_ordering(tree, move);
+  }
+
+  node->sum_scores += result;
+  node->sum_scores2 += result * result;
+  
+  return result;
+}
+
+static int
+uct_find_best_children(struct uct_node *node, struct uct_arc **children,
+                      int n)
+{
+  struct uct_arc *child_arc;
+  float best_score;
+  struct uct_arc *best_child;
+  int found_moves[BOARDMAX];
+  int k;
+
+  memset(found_moves, 0, sizeof(found_moves));
+  for (k = 0; k < n; k++) {
+    best_score = 0.0;
+    best_child = NULL;
+    for (child_arc = node->child; child_arc; child_arc = child_arc->next) {
+      struct uct_node *child_node = child_arc->node;
+      if (!found_moves[child_arc->move]
+         && best_score * child_node->games < child_node->wins) {
+       best_child = child_arc;
+       best_score = (float) child_node->wins / child_node->games;
+      }
+    }
+    if (!best_child)
+      break;
+    children[k] = best_child;
+    found_moves[best_child->move] = 1;
+  }
+
+  return k;
+}
+
+static void
+uct_dump_tree_recursive(struct uct_node *node, SGFTree *sgf_tree, int color,
+                       int cutoff, int depth)
+{
+  struct uct_arc *child_arc;
+  char buf[100];
+  if (depth > 50)
+    return;
+  for (child_arc = node->child; child_arc; child_arc = child_arc->next) {
+    struct uct_node *child_node = child_arc->node;
+    sgftreeAddPlayLast(sgf_tree, color,
+                      I(child_arc->move), J(child_arc->move));
+    gg_snprintf(buf, 100, "%d/%d (%5.3f)", child_node->wins, child_node->games,
+               (float) child_node->wins / child_node->games);
+    sgftreeAddComment(sgf_tree, buf);
+    if (child_node->games >= cutoff)
+      uct_dump_tree_recursive(child_node, sgf_tree, OTHER_COLOR(color), cutoff, depth + 1);
+    sgf_tree->lastnode = sgf_tree->lastnode->parent;
+  }
+}
+
+
+static void
+uct_dump_tree(struct uct_tree *tree, const char *filename, int color,
+             int cutoff)
+{
+  SGFTree sgf_tree;
+  sgftree_clear(&sgf_tree);
+  sgftreeCreateHeaderNode(&sgf_tree, board_size, komi, 0);
+  sgffile_printboard(&sgf_tree);
+
+  uct_dump_tree_recursive(&tree->nodes[0], &sgf_tree, color, cutoff, 0);
+  
+  writesgf(sgf_tree.root, filename);
+  sgfFreeNode(sgf_tree.root);
+}
+
+
+void
+uct_genmove(int color, int *move, int *forbidden_moves, int *allowed_moves,
+           int nodes, float *move_values, int *move_frequencies)
+{
+  struct uct_tree tree;
+  float best_score;
+  struct uct_arc *arc;
+  struct uct_node *node;
+  struct mc_game starting_position;
+  int most_games;
+  struct uct_node *most_games_node;
+  struct uct_arc *most_games_arc;
+  int pos;
+
+  mc_init_board_from_global_board(&starting_position.mc);
+  mc_init_move_values(&starting_position.mc);
+  starting_position.color_to_move = color;
+  /* FIXME: Fill in correct information. */
+  starting_position.consecutive_passes = 0;
+  starting_position.consecutive_ko_captures = 0;
+  starting_position.last_move = get_last_move();
+  starting_position.depth = 0;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    starting_position.settled[pos] = forbidden_moves[pos];
+
+  tree.game = starting_position;
+  /* FIXME: Don't reallocate between moves. */
+  tree.nodes = malloc(nodes * sizeof(*tree.nodes));
+  gg_assert(tree.nodes);
+  tree.arcs = malloc(nodes * sizeof(*tree.arcs));
+  gg_assert(tree.arcs);
+  tree.hashtable_size = nodes;
+  tree.hashtable_odd = calloc(tree.hashtable_size,
+                             sizeof(*tree.hashtable_odd));
+  tree.hashtable_even = calloc(tree.hashtable_size,
+                              sizeof(*tree.hashtable_even));
+  gg_assert(tree.hashtable_odd);
+  gg_assert(tree.hashtable_even);
+  tree.num_nodes = nodes;
+  tree.num_arcs = nodes;
+  tree.num_used_nodes = 0;
+  tree.num_used_arcs = 0;
+  tree.forbidden_moves = forbidden_moves;
+  uct_init_node(&tree, allowed_moves);
+  uct_init_move_ordering(&tree);
+
+  /* Play simulations. FIXME: Terribly dirty fix. */
+  while (tree.num_used_arcs < tree.num_arcs - 10) {
+    int last_used_arcs = tree.num_used_arcs;
+    tree.game = starting_position;
+    uct_traverse_tree(&tree, &tree.nodes[0], 1.0, 0.9);
+    /* FIXME: Ugly workaround for solved positions before running out
+     * of nodes.
+     */
+    if (tree.num_used_arcs == last_used_arcs)
+      break;
+  }
+
+  /* Identify the best move on the top level. */
+  best_score = 0.0;
+  *move = PASS_MOVE;
+  for (arc = tree.nodes[0].child; arc; arc = arc->next) {
+    node = arc->node;
+    move_frequencies[arc->move] = node->games;
+    move_values[arc->move] = (float) node->wins / node->games;
+    if (best_score * node->games < node->wins) {
+      *move = arc->move;
+      best_score = (float) node->wins / node->games;
+    }
+  }
+
+  /* Dump sgf tree of the significant part of the search tree. */
+  if (0)
+    uct_dump_tree(&tree, "/tmp/ucttree.sgf", color, 50);
+    
+  /* Print information about the search tree. */
+  if (mc_debug) {
+    while (1) {
+      float mean;
+      float std;
+      
+      most_games = 0;
+      most_games_node = NULL;
+      most_games_arc = NULL;
+      
+      for (arc = tree.nodes[0].child; arc; arc = arc->next) {
+       node = arc->node;
+       if (most_games < node->games) {
+         most_games = node->games;
+         most_games_node = node;
+         most_games_arc = arc;
+       }
+      }
+      
+      if (most_games == 0)
+       break;
+      
+      mean = most_games_node->sum_scores / most_games_node->games;
+      std = sqrt((most_games_node->sum_scores2 - most_games_node->sum_scores * mean) / (most_games_node->games - 1));
+      gprintf("%1m ", most_games_arc->move);
+      fprintf(stderr, "%6d %6d %5.3f %5.3f %5.3f %5.3f\n",
+             most_games_node->wins, most_games_node->games,
+             (float) most_games_node->wins / most_games_node->games,
+             mean, std, mean / (std + 0.001));
+      most_games_node->games = -most_games_node->games;
+    }
+    for (arc = tree.nodes[0].child; arc; arc = arc->next)
+      arc->node->games = -arc->node->games;
+    
+    {
+      int n;
+      struct uct_arc *arcs[7];
+      int depth = 0;
+      n = uct_find_best_children(&tree.nodes[0], arcs, 7);
+      gprintf("Principal variation:\n");
+      while (n > 0 && depth < 80) {
+       int k;
+       gprintf("%C ", color);
+       for (k = 0; k < n; k++) {
+         node = arcs[k]->node;
+         gprintf("%1m ", arcs[k]->move);
+         fprintf(stderr, "%5.3f", (float) node->wins / node->games);
+         if (k == 0)
+           gprintf(" (%d games)", node->games);
+         if (k < n - 1)
+           gprintf(", ");
+       }
+       gprintf("\n");
+       color = OTHER_COLOR(color);
+       n = uct_find_best_children(arcs[0]->node, arcs, 7);
+       depth++;
+      }
+      gprintf("\n");
+    }
+  }
+  
+  free(tree.nodes);
+  free(tree.arcs);
+  free(tree.hashtable_odd);
+  free(tree.hashtable_even);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/move_reasons.c b/engine/move_reasons.c
new file mode 100644 (file)
index 0000000..8f56622
--- /dev/null
@@ -0,0 +1,2070 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+#include "random.h"
+#include "move_reasons.h"
+
+
+/* All these data structures are declared in move_reasons.h */
+
+struct move_data move[BOARDMAX];
+struct move_reason move_reasons[MAX_MOVE_REASONS];
+int next_reason;
+
+/* Connections */
+int conn_worm1[MAX_CONNECTIONS];
+int conn_worm2[MAX_CONNECTIONS];
+int next_connection;
+
+/* Potential semeai moves. */
+int semeai_target1[MAX_POTENTIAL_SEMEAI];
+int semeai_target2[MAX_POTENTIAL_SEMEAI];
+static int next_semeai;
+
+/* Unordered sets (currently pairs) of move reasons / targets */
+Reason_set either_data[MAX_EITHER];
+int next_either;
+Reason_set all_data[MAX_ALL];
+int next_all;
+
+/* Eye shapes */
+int eyes[MAX_EYES];
+int eyecolor[MAX_EYES];
+int next_eye;
+
+/* Lunches */
+int lunch_dragon[MAX_LUNCHES]; /* eater */
+int lunch_worm[MAX_LUNCHES];   /* food */
+int next_lunch;
+
+/* Point redistribution */
+int replacement_map[BOARDMAX];
+
+/* The color for which we are evaluating moves. */
+int current_color;
+
+/* Attack threats that are known to be sente locally. */
+static int known_good_attack_threats[BOARDMAX][MAX_ATTACK_THREATS];
+
+/* Moves that are known to be safe (in the sense that played stones can
+ * be captured, but opponent loses much more when attempting to do so)
+ */
+static int known_safe_moves[BOARDMAX];
+
+/* Helper functions to check conditions in discard rules. */
+typedef int (*discard_condition_fn_ptr)(int pos, int what);
+
+struct discard_rule {
+  int reason_type[MAX_REASONS];
+  discard_condition_fn_ptr condition;
+  int flags;
+  char trace_message[MAX_TRACE_LENGTH];
+};
+
+
+/* Initialize move reason data structures. */
+void
+clear_move_reasons(void)
+{
+  int pos;
+  int k;
+  next_reason = 0;
+  next_connection = 0;
+  next_semeai = 0;
+  next_either = 0;
+  next_all = 0;
+  next_eye = 0;
+  next_lunch = 0;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)) {
+      move[pos].value                    = 0.0;
+      move[pos].final_value              = 0.0;
+      move[pos].additional_ko_value      = 0.0;
+      move[pos].territorial_value        = 0.0;
+      move[pos].strategical_value        = 0.0;
+      move[pos].maxpos_shape             = 0.0;
+      move[pos].numpos_shape             = 0;
+      move[pos].maxneg_shape             = 0.0;
+      move[pos].numneg_shape             = 0;
+      move[pos].followup_value           = 0.0;
+      move[pos].influence_followup_value = 0.0;
+      move[pos].reverse_followup_value   = 0.0;
+      move[pos].secondary_value          = 0.0;
+      move[pos].min_value                = 0.0;
+      move[pos].max_value                = HUGE_MOVE_VALUE;
+      move[pos].min_territory            = 0.0;
+      move[pos].max_territory            = HUGE_MOVE_VALUE;
+      for (k = 0; k < MAX_REASONS; k++)     
+       move[pos].reason[k]              = -1;
+      move[pos].move_safety              = 0;
+      move[pos].worthwhile_threat        = 0;
+      move[pos].randomness_scaling       = 1.0;
+      /* The reason we assign a random number to each move immediately
+       * is to avoid dependence on which moves are evaluated when it
+       * comes to choosing between multiple moves of the same value.
+       * In this way we can get consistent results for use in the
+       * regression tests.
+       */
+      move[pos].random_number            = gg_drand();
+
+      /* Do not send away the points (yet). */
+      replacement_map[pos] = NO_MOVE;
+    }
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    known_safe_moves[pos] = 0;
+    for (k = 0; k < MAX_ATTACK_THREATS; k++)
+      known_good_attack_threats[pos][k] = NO_MOVE;
+  }
+}
+
+
+/*
+ * Find the index of a connection in the list of connections.
+ * If necessary, add a new entry.
+ */
+int
+find_connection(int worm1, int worm2)
+{
+  int k;
+  
+  if (worm1 > worm2) {
+    /* Swap to canonical order. */
+    int tmp = worm1;
+    worm1 = worm2;
+    worm2 = tmp;
+  }
+  
+  for (k = 0; k < next_connection; k++)
+    if (conn_worm1[k] == worm1 && conn_worm2[k] == worm2)
+      return k;
+  
+  /* Add a new entry. */
+  gg_assert(next_connection < MAX_CONNECTIONS);
+  conn_worm1[next_connection] = worm1;
+  conn_worm2[next_connection] = worm2;
+  next_connection++;
+  return next_connection - 1;
+}
+
+
+static int
+find_either_data(int reason1, int what1, int reason2, int what2)
+{
+  int k;
+  
+  /* Make sure the worms are ordered canonically. */
+  if (what1 > what2) {
+    int tmp = what1;
+    what1 = what2;
+    what2 = tmp;
+  }
+
+  for (k = 0; k < next_either; k++)
+    if (either_data[k].reason1    == reason1
+       && either_data[k].what1   == what1
+       && either_data[k].reason2 == reason2
+       && either_data[k].what2   == what2)
+      return k;
+  
+  /* Add a new entry. */
+  gg_assert(next_either < MAX_EITHER);
+  either_data[next_either].reason1 = reason1;
+  either_data[next_either].what1   = what1;
+  either_data[next_either].reason2 = reason2;
+  either_data[next_either].what2   = what2;
+  next_either++;
+  return next_either - 1;
+}
+
+static int
+find_all_data(int reason1, int what1, int reason2, int what2)
+{
+  int k;
+  
+  /* Make sure the worms are ordered canonically. */
+  if (what1 > what2) {
+    int tmp = what1;
+    what1 = what2;
+    what2 = tmp;
+  }
+
+  for (k = 0; k < next_all; k++)
+    if (all_data[k].reason1    == reason1
+       && all_data[k].what1   == what1
+       && all_data[k].reason2 == reason2
+       && all_data[k].what2   == what2)
+      return k;
+  
+  /* Add a new entry. */
+  gg_assert(next_all < MAX_ALL);
+  all_data[next_all].reason1 = reason1;
+  all_data[next_all].what1   = what1;
+  all_data[next_all].reason2 = reason2;
+  all_data[next_all].what2   = what2;
+  next_all++;
+  return next_all - 1;
+}
+
+static int
+find_pair_data(int what1, int what2)
+{
+  int k;
+  
+  for (k = 0; k < next_either; k++)
+    if (either_data[k].what1 == what1
+       && either_data[k].what2 == what2)
+      return k;
+  
+  /* Add a new entry. */
+  gg_assert(next_either < MAX_EITHER);
+  either_data[next_either].what1   = what1;
+  either_data[next_either].what2   = what2;
+  next_either++;
+  return next_either - 1;
+}
+
+
+/* Interprets the object of a reason and returns its position.
+ * If the object is a pair (of worms or dragons), the position of the first
+ * object is returned. (This is only used for trace outputs.) Returns
+ * NO_MOVE if move does not point to a location.
+ * FIXME: This new function produces some code duplication with other
+ * trace output function. Do some code cleanup here.
+ */
+static int
+get_pos(int reason, int what)
+{
+  switch (reason) {
+  case ATTACK_MOVE:
+  case DEFEND_MOVE:
+  case ATTACK_THREAT:
+  case DEFEND_THREAT:
+  case ATTACK_MOVE_GOOD_KO:
+  case ATTACK_MOVE_BAD_KO:
+  case DEFEND_MOVE_GOOD_KO:
+  case DEFEND_MOVE_BAD_KO:
+    return what;
+
+  case SEMEAI_MOVE:
+  case SEMEAI_THREAT:
+  case STRATEGIC_ATTACK_MOVE:
+  case STRATEGIC_DEFEND_MOVE:
+  case OWL_ATTACK_MOVE:
+  case OWL_DEFEND_MOVE:
+  case OWL_ATTACK_THREAT:
+  case OWL_DEFEND_THREAT:
+  case OWL_PREVENT_THREAT:
+  case UNCERTAIN_OWL_ATTACK:
+  case UNCERTAIN_OWL_DEFENSE:
+  case OWL_ATTACK_MOVE_GOOD_KO:
+  case OWL_ATTACK_MOVE_BAD_KO:
+  case OWL_DEFEND_MOVE_GOOD_KO:
+  case OWL_DEFEND_MOVE_BAD_KO:
+    return what;
+
+  case EITHER_MOVE:
+    /* FIXME: What should we return here? */
+    return either_data[what].what1;
+
+  case ALL_MOVE:
+    /* FIXME: What should we return here? */
+    return all_data[what].what1;
+
+  case CONNECT_MOVE:
+  case CUT_MOVE:
+    return conn_worm1[what];
+
+  case ANTISUJI_MOVE:
+  case EXPAND_TERRITORY_MOVE:
+  case EXPAND_MOYO_MOVE:
+  case INVASION_MOVE:
+  case MY_ATARI_ATARI_MOVE:
+  case YOUR_ATARI_ATARI_MOVE:
+    return NO_MOVE;
+
+  case OWL_ATTACK_MOVE_GAIN:
+  case OWL_DEFEND_MOVE_LOSS:
+    /* FIXME: What should we return here? */
+    return either_data[what].what1;
+
+  default:
+    /* We should never get here: */
+    gg_assert(0);
+    return 0; /* To keep gcc happy. */
+  }
+}
+
+/*
+ * See if a lunch is already in the list of lunches, otherwise add a new
+ * entry. A lunch is in this context a pair of eater (a dragon) and food
+ * (a worm).
+ */
+void
+add_lunch(int eater, int food)
+{
+  int k;
+  int dragon1 = dragon[eater].origin;
+  int worm1   = worm[food].origin;
+  ASSERT_ON_BOARD1(eater);
+  ASSERT_ON_BOARD1(food);
+  
+  for (k = 0; k < next_lunch; k++)
+    if ((lunch_dragon[k] == dragon1) && (lunch_worm[k] == worm1))
+      return;
+  
+  /* Add a new entry. */
+  gg_assert(next_lunch < MAX_LUNCHES);
+  lunch_dragon[next_lunch] = dragon1;
+  lunch_worm[next_lunch] = worm1;
+  next_lunch++;
+  return;
+}
+
+/* ---------------------------------------------------------------- */
+
+
+/*
+ * Add a move reason for (pos) if it's not already there or the
+ * table is full.
+ */ 
+static void
+add_move_reason(int pos, int type, int what)
+{
+  int k;
+
+  ASSERT_ON_BOARD1(pos);
+  if (stackp == 0) {
+    ASSERT1(board[pos] == EMPTY, pos);
+  }
+
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    if (move_reasons[r].type == type
+       && move_reasons[r].what == what)
+      return;  /* Reason already listed. */
+  }
+
+  /* Reason not found, add it if there is place left in both lists.
+   * Otherwise drop it.
+   */
+  if (k >= MAX_REASONS) {
+    DEBUG(DEBUG_MOVE_REASONS,
+         "Move reason at %1m (type=%d, what=%d) dropped because list full.\n",
+         pos, type, what);
+    return;
+  }
+
+  if (next_reason >= MAX_MOVE_REASONS) {
+    DEBUG(DEBUG_MOVE_REASONS,
+         "Move reason at %1m (type=%d, what=%d) dropped because global list full.\n",
+         pos, type, what);
+    return;
+  }
+
+  /* Add a new entry. */
+  move[pos].reason[k] = next_reason;
+  move_reasons[next_reason].type = type;
+  move_reasons[next_reason].what = what;
+  move_reasons[next_reason].status = ACTIVE;
+  next_reason++;
+}
+
+/*
+ * Remove a move reason for (pos). Ignore silently if the reason
+ * wasn't there.
+ */ 
+static void
+remove_move_reason(int pos, int type, int what)
+{
+  int k;
+  int n = -1; /* Position of the move reason to be deleted. */
+
+  ASSERT_ON_BOARD1(pos);
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    if (move_reasons[r].type == type
+       && move_reasons[r].what == what)
+      n = k;
+  }
+  
+  if (n == -1)
+    return; /* Move reason wasn't there. */
+  
+  /* Now move the last move reason to position n, thereby removing the
+   * one we were looking for.
+   */
+  k--;
+  move[pos].reason[n] = move[pos].reason[k];
+  move[pos].reason[k] = -1;
+}
+
+
+/*
+ * Check whether a move reason already is recorded for a move.
+ * A negative value for 'what' means only match 'type'.
+ */
+int
+move_reason_known(int pos, int type, int what)
+{
+  int k;
+  int r;
+
+  ASSERT_ON_BOARD1(pos);
+  for (k = 0; k < MAX_REASONS; k++) {
+    r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    if (move_reasons[r].type == type
+       && (what < 0
+           || move_reasons[r].what == what))
+      return 1;
+  }
+  return 0;
+}
+
+/* ---------------------------------------------------------------- */
+
+/* Functions used in discard_rules follow below. */
+
+/*
+ * Check whether an attack move reason already is recorded for a move.
+ * A negative value for 'what' means only match 'type'.
+ */
+int
+attack_move_reason_known(int pos, int what)
+{
+  ASSERT1(what < 0 || IS_STONE(board[what]), what);
+  what = worm[what].origin;
+  if (move_reason_known(pos, ATTACK_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, ATTACK_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, ATTACK_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
+}
+
+/*
+ * Check whether a defense move reason already is recorded for a move.
+ * A negative value for 'what' means only match 'type'.
+ */
+int
+defense_move_reason_known(int pos, int what)
+{
+  ASSERT1(what < 0 || IS_STONE(board[what]), what);
+  what = worm[what].origin;
+  if (move_reason_known(pos, DEFEND_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, DEFEND_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, DEFEND_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
+}
+
+/* Check whether a dragon consists of only one worm. If so, check
+ * whether we know of a tactical attack or defense move.
+ */
+static int
+tactical_move_vs_whole_dragon_known(int pos, int what)
+{
+  return ((worm[what].size == dragon[what].size)
+         && (attack_move_reason_known(pos, what)
+             || defense_move_reason_known(pos, what)));
+}
+
+/*
+ * Check whether an owl attack move reason already is recorded for a move.
+ * A negative value for 'what' means only match 'type'.
+ */
+int
+owl_attack_move_reason_known(int pos, int what)
+{
+  if (move_reason_known(pos, OWL_ATTACK_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, OWL_ATTACK_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, OWL_ATTACK_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
+}
+
+/*
+ * Check whether an owl defense move reason already is recorded for a move.
+ * A negative value for 'what' means only match 'type'.
+ */
+int
+owl_defense_move_reason_known(int pos, int what)
+{
+  if (move_reason_known(pos, OWL_DEFEND_MOVE, what))
+    return WIN;
+  if (move_reason_known(pos, OWL_DEFEND_MOVE_GOOD_KO, what))
+    return KO_A;
+  if (move_reason_known(pos, OWL_DEFEND_MOVE_BAD_KO, what))
+    return KO_B;
+  return 0;
+}
+
+/*
+ * Check whether an owl attack/defense move reason is recorded for a move.
+ * A negative value for 'what' means only match 'type'.
+ */
+int
+owl_move_reason_known(int pos, int what)
+{
+  return (owl_attack_move_reason_known(pos, what)
+          || owl_defense_move_reason_known(pos, what));
+}
+
+/*
+ * Check whether we have an owl attack/defense reason for a move that
+ * involves a specific worm.
+ */
+static int
+owl_move_vs_worm_known(int pos, int what)
+{
+  return owl_move_reason_known(pos, dragon[what].origin);
+}
+
+int
+semeai_move_reason_known(int pos, int what)
+{
+  return move_reason_known(pos, SEMEAI_MOVE, what);
+}
+
+/* Check whether a worm is inessential */
+static int
+concerns_inessential_worm(int pos, int what)
+{
+  UNUSED(pos);
+  return DRAGON2(what).safety == INESSENTIAL
+        || worm[what].inessential;
+}
+
+/* Check whether a dragon is inessential */
+static int
+concerns_inessential_dragon(int pos, int what)
+{
+  UNUSED(pos);
+  return DRAGON2(what).safety == INESSENTIAL; 
+}
+
+static int
+move_is_marked_unsafe(int pos, int what)
+{
+  UNUSED(what);
+  return (!move[pos].move_safety
+         && !adjacent_to_nondead_stone(pos, current_color));
+}
+
+/* Check whether a dragon is non-critical. */
+static int
+concerns_noncritical_dragon(int pos, int what)
+{
+  UNUSED(pos);
+  return (dragon[what].status != CRITICAL
+         && worm[what].attack_codes[0] == 0);
+}
+
+
+/* (what) points to two worms listed in either_data. Returns true if
+ * this is a "attack either" move reason, and one of the worms attackable.
+ * FIXME: Ko?
+ */
+static int
+either_worm_attackable(int pos, int what)
+{
+  UNUSED(pos);
+  return (either_data[what].reason1 == ATTACK_STRING
+         && either_data[what].reason2 == ATTACK_STRING
+          && (worm[either_data[what].what1].attack_codes[0] != 0
+              || worm[either_data[what].what2].attack_codes[0] != 0));
+}
+
+/* (what) points to two worms via all_data. Returns true if this is
+ * a "defend both" move reason, and one of the worms is attackable.
+ * FIXME: Ko?
+ */
+static int
+one_of_both_attackable(int pos, int what)
+{
+  UNUSED(pos);
+  return (all_data[what].reason1 == DEFEND_STRING
+         && all_data[what].reason2 == DEFEND_STRING
+         && (worm[all_data[what].what1].attack_codes[0] != 0
+              || worm[all_data[what].what2].attack_codes[0] != 0));
+}
+
+
+/* ---------------------------------------------------------------- */
+
+
+/*
+ * Add to the reasons for the move at (pos) that it attacks the worm
+ * at (ww).
+ */
+void
+add_attack_move(int pos, int ww, int code)
+{
+  ASSERT_ON_BOARD1(ww);
+  ww = worm[ww].origin;
+
+  if (code == WIN)
+    add_move_reason(pos, ATTACK_MOVE, ww);
+  else if (code == KO_A)
+    add_move_reason(pos, ATTACK_MOVE_GOOD_KO, ww);
+  else if (code == KO_B)
+    add_move_reason(pos, ATTACK_MOVE_BAD_KO, ww);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it defends the worm
+ * at (ww).
+ */
+void
+add_defense_move(int pos, int ww, int code)
+{
+  ASSERT_ON_BOARD1(ww);
+  ww = worm[ww].origin;
+
+  if (code == WIN)
+    add_move_reason(pos, DEFEND_MOVE, ww);
+  else if (code == KO_A)
+    add_move_reason(pos, DEFEND_MOVE_GOOD_KO, ww);
+  else if (code == KO_B)
+    add_move_reason(pos, DEFEND_MOVE_BAD_KO, ww);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it threatens to
+ * attack the worm at (ww). 
+ */
+void
+add_attack_threat_move(int pos, int ww, int code)
+{
+  UNUSED(code);
+  
+  ASSERT_ON_BOARD1(ww);
+  add_move_reason(pos, ATTACK_THREAT, worm[ww].origin);
+}
+
+/* Remove an attack threat move reason. */
+
+void
+remove_attack_threat_move(int pos, int ww)
+{
+  ASSERT_ON_BOARD1(ww);
+  remove_move_reason(pos, ATTACK_THREAT, worm[ww].origin);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it defends the worm
+ * at (ww).
+ */
+void
+add_defense_threat_move(int pos, int ww, int code)
+{
+  UNUSED(code);
+
+  ASSERT_ON_BOARD1(ww);
+  add_move_reason(pos, DEFEND_THREAT, worm[ww].origin);
+}
+
+
+/* Report all, or up to max_strings, strings that are threatened 
+ * at (pos).
+ */
+int
+get_attack_threats(int pos, int max_strings, int strings[])
+{
+  int k;
+  int num_strings;
+
+  num_strings = 0;
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+
+    if (move_reasons[r].type == ATTACK_THREAT)
+      strings[num_strings++] = move_reasons[r].what;
+
+    if (num_strings == max_strings)
+      break;
+  }
+
+  return num_strings;
+}
+
+/* Report all, or up to max_strings, strings that might be defended 
+ * at (pos).
+ */
+int
+get_defense_threats(int pos, int max_strings, int strings[])
+{
+  int k;
+  int num_strings;
+
+  num_strings = 0;
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+
+    if (move_reasons[r].type == DEFEND_THREAT)
+      strings[num_strings++] = move_reasons[r].what;
+
+    if (num_strings == max_strings)
+      break;
+  }
+
+  return num_strings;
+}
+
+/* Report the biggest dragon that is owl-affected (possibily with ko)
+ * by a move at (pos).
+ */
+int
+get_biggest_owl_target(int pos)
+{
+  int k;
+  int biggest_target = -1;
+  float target_size = 0.0;
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+
+    switch (move_reasons[r].type) {
+    case OWL_ATTACK_MOVE:
+    case OWL_ATTACK_MOVE_GOOD_KO:
+    case OWL_ATTACK_MOVE_BAD_KO:
+    case OWL_ATTACK_THREAT:
+    case OWL_DEFEND_MOVE:
+    case OWL_DEFEND_MOVE_GOOD_KO:
+    case OWL_DEFEND_MOVE_BAD_KO:
+    case OWL_DEFEND_THREAT:
+    case OWL_PREVENT_THREAT:
+      if (dragon[move_reasons[r].what].effective_size > target_size) {
+        biggest_target = move_reasons[r].what;
+        target_size = dragon[move_reasons[r].what].effective_size;
+      }
+      break;
+    }
+  }
+  return biggest_target;
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it connects the
+ * dragons at (dr1) and (dr2). Require that the dragons are
+ * distinct.
+ */
+void
+add_connection_move(int pos, int w1, int w2)
+{
+  int connection;
+
+  ASSERT_ON_BOARD1(w1);
+  ASSERT_ON_BOARD1(w2);
+  ASSERT1(worm[w1].color == worm[w2].color, w1);
+  if (worm[w1].origin == worm[w2].origin)
+    return;
+  
+  connection = find_connection(worm[w1].origin, worm[w2].origin);
+  add_move_reason(pos, CONNECT_MOVE, connection);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it cuts the
+ * dragons at (dr1) and (dr2). Require that the dragons are
+ * distinct.
+ */
+void
+add_cut_move(int pos, int w1, int w2)
+{
+  int connection;
+
+  ASSERT_ON_BOARD1(w1);
+  ASSERT_ON_BOARD1(w2);
+  ASSERT1(worm[w1].color == worm[w2].color, w1);
+  if (worm[w1].origin == worm[w2].origin)
+    return;
+  connection = find_connection(worm[w1].origin, worm[w2].origin);
+  
+  /*
+   * Ignore the cut or connection if either (w1) or (w2)
+   * points to a tactically captured worm.
+   */
+  if ((worm[w1].attack_codes[0] != 0 && worm[w1].defense_codes[0] == 0)
+      || (worm[w2].attack_codes[0] != 0 && worm[w2].defense_codes[0] == 0))
+    return;
+  
+  add_move_reason(pos, CUT_MOVE, connection);
+
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it is an anti-suji.
+ * This means that it's a locally inferior move or for some other reason
+ * must *not* be played.
+ */
+void
+add_antisuji_move(int pos)
+{
+  add_move_reason(pos, ANTISUJI_MOVE, 0);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it wins the
+ * dragon (friendly or not) at (dr) in semeai. Since it is
+ * possible that in some semeai one player can kill but the
+ * other can only make seki, it is possible that one dragon
+ * is already alive in seki. Therefore separate move reasons
+ * must be added for the two dragons.
+ */
+void
+add_semeai_move(int pos, int dr)
+{
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, SEMEAI_MOVE, dragon[dr].origin);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it might
+ * kill/save the dragon at (dr1) in the semeai against (dr2).
+ */
+static void
+add_potential_semeai_move(int pos, int type, int dr1, int dr2)
+{
+  ASSERT1(ON_BOARD(dr1), pos);
+  ASSERT1(ON_BOARD(dr2), pos);
+  if (next_semeai >= MAX_POTENTIAL_SEMEAI)
+    DEBUG(DEBUG_MOVE_REASONS,
+         "Potential semeai move at %1m dropped as list was full\n", pos);
+  else {
+    semeai_target1[next_semeai] = dr1;
+    semeai_target2[next_semeai] = dr2;
+    add_move_reason(pos, type, next_semeai);
+    next_semeai++;
+  }
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it might
+ * kill the dragon at (dr1) in the semeai against (dr2).
+ */
+void
+add_potential_semeai_attack(int pos, int dr1, int dr2)
+{
+  add_potential_semeai_move(pos, POTENTIAL_SEMEAI_ATTACK, dr1, dr2);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it might
+ * save the dragon at (dr1) in the semeai against (dr2).
+ */
+void
+add_potential_semeai_defense(int pos, int dr1, int dr2)
+{
+  add_potential_semeai_move(pos, POTENTIAL_SEMEAI_DEFENSE, dr1, dr2);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that given two
+ * moves in a row a move here can win the dragon (friendly or
+ * not) at (dr) in semeai. Such a move can be used as a 
+ * ko threat, and it is also given some value due to uncertainty
+ * in the counting of liberties.
+ */
+void
+add_semeai_threat(int pos, int dr)
+{
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, SEMEAI_THREAT, dragon[dr].origin);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it will accomplish
+ * one of two things: either (reason1) on (target1) or (reason2) on 
+ * (target2).  
+ *
+ * At this time, (reason) can only be ATTACK_STRING.
+ * However, more reasons will be implemented in the future.
+ *
+ * FIXME: Implement at least ATTACK_MOVE_GOOD_KO, ATTACK_MOVE_BAD_KO,
+ *         DEFEND_MOVE and associates, CONNECT_MOVE, OWL_ATTACK_MOVE,
+ *         OWL_DEFEND_MOVE, and possibly more.
+ *
+ * FIXME: Generalize to more than 2 parameters.
+ *        When that is done, this will be a good way to add 
+ *        atari_atari moves.
+ */
+void
+add_either_move(int pos, int reason1, int target1, int reason2, int target2)
+{
+  int what1 = 0;
+  int what2 = 0;
+  int index;
+
+  ASSERT_ON_BOARD1(target1);
+  ASSERT_ON_BOARD1(target2);
+  if (reason1 == reason2 && target1 == target2)
+    return;
+  
+  /* For now. */
+  gg_assert(reason1 == ATTACK_STRING);
+  gg_assert(reason2 == ATTACK_STRING);
+
+  switch (reason1) {
+  case ATTACK_STRING:
+    {
+      what1 = worm[target1].origin;
+
+      /* If this string is already attacked, and with no defense, then
+       * there is no additional value of this move reason. */
+      if (worm[target1].attack_codes[0] != 0
+         && worm[target1].defense_codes[0] == 0)
+       return;
+    }
+    break;
+
+  default:
+    break;
+  }
+
+  switch (reason2) {
+  case ATTACK_STRING:
+    {
+      what2 = worm[target2].origin;
+
+      /* If this string is already attacked, and with no defense, then
+       * there is no additional value of this move reason. */
+      if (worm[target2].attack_codes[0] != 0 
+         && worm[target2].defense_codes[0] == 0)
+       return;
+    }
+    break;
+
+  default:
+    break;
+  }
+
+  index = find_either_data(reason1, what1, reason2, what2);
+  add_move_reason(pos, EITHER_MOVE, index);
+}
+
+
+/*
+ * Add to the reasons for the move at (pos) that it will accomplish
+ * both of two things: (reason1) on (target1) and (reason2) on 
+ * (target2).  
+ *
+ * At this time, (reason) can only be DEFEND_STRING.
+ * However, more reasons will be implemented in the future.
+ *
+ * FIXME: Implement at least ATTACK_MOVE_GOOD_KO, ATTACK_MOVE_BAD_KO,
+ *         DEFEND_MOVE and associates, CONNECT_MOVE, OWL_ATTACK_MOVE,
+ *         OWL_DEFEND_MOVE, and possibly more.
+ *
+ * FIXME: Generalize to more than 2 parameters.
+ *        When that is done, this will be a good way to add 
+ *        atari_atari moves.
+ */
+void
+add_all_move(int pos, int reason1, int target1, int reason2, int target2)
+{
+  int what1 = 0;
+  int what2 = 0;
+  int index;
+
+  ASSERT_ON_BOARD1(target1);
+  ASSERT_ON_BOARD1(target2);
+  if (reason1 == reason2 && target1 == target2)
+    return;
+  
+  /* For now. */
+  gg_assert(reason1 == DEFEND_STRING);
+  gg_assert(reason2 == DEFEND_STRING);
+
+  switch (reason1) {
+  case DEFEND_STRING:
+    what1 = worm[target1].origin;
+    break;
+
+  default:
+    break;
+  }
+
+  switch (reason2) {
+  case DEFEND_STRING:
+    what2 = worm[target2].origin;
+    break;
+
+  default:
+    break;
+  }
+
+  index = find_all_data(reason1, what1, reason2, what2);
+  add_move_reason(pos, ALL_MOVE, index);
+}
+
+
+void
+add_loss_move(int pos, int target1, int target2)
+{
+  int what1 = dragon[target1].origin;
+  int what2 = worm[target2].origin;
+  int index = find_pair_data(what1, what2);
+  ASSERT1(target2 != NO_MOVE, pos);
+  add_move_reason(pos, OWL_DEFEND_MOVE_LOSS, index);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it expands
+ * territory.
+ */
+void
+add_expand_territory_move(int pos)
+{
+  add_move_reason(pos, EXPAND_TERRITORY_MOVE, 0);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it expands
+ * moyo.
+ */
+void
+add_expand_moyo_move(int pos)
+{
+  add_move_reason(pos, EXPAND_MOYO_MOVE, 0);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it is an invasion.
+ */
+void
+add_invasion_move(int pos)
+{
+  add_move_reason(pos, INVASION_MOVE, 0);
+}
+
+/*
+ * This function is called when a shape value for the move at (pos)
+ * is found. 
+ * 
+ * We keep track of the largest positive shape value found, and the
+ * total number of positive contributions, as well as the largest
+ * negative shape value found, and the total number of negative
+ * shape contributions.
+ */
+void
+add_shape_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value > 0.0) {
+    if (value > move[pos].maxpos_shape)
+      move[pos].maxpos_shape = value;
+    move[pos].numpos_shape += 1;
+  }
+  else if (value < 0.0) {
+    value = -value;
+    if (value > move[pos].maxneg_shape)
+      move[pos].maxneg_shape = value;
+    move[pos].numneg_shape += 1;
+  }
+}
+
+/*
+ * Flag that this move is worthwhile to play as a pure threat move.
+ */
+void
+add_worthwhile_threat_move(int pos)
+{
+  move[pos].worthwhile_threat = 1;
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it attacks
+ * the dragon (dr) on a strategical level.
+ */
+void
+add_strategical_attack_move(int pos, int dr)
+{
+  dr = dragon[dr].origin;
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, STRATEGIC_ATTACK_MOVE, dr);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that it defends
+ * the dragon (dr) on a strategical level.
+ */
+void
+add_strategical_defense_move(int pos, int dr)
+{
+  dr = dragon[dr].origin;
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, STRATEGIC_DEFEND_MOVE, dr);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that the owl
+ * code reports an attack on the dragon (dr).
+ */
+void
+add_owl_attack_move(int pos, int dr, int kworm, int code)
+{
+  dr = dragon[dr].origin;
+
+  ASSERT_ON_BOARD1(dr);
+  if (code == WIN)
+    add_move_reason(pos, OWL_ATTACK_MOVE, dr);
+  else if (code == KO_A)
+    add_move_reason(pos, OWL_ATTACK_MOVE_GOOD_KO, dr);
+  else if (code == KO_B)
+    add_move_reason(pos, OWL_ATTACK_MOVE_BAD_KO, dr);
+  else if (code == GAIN) {
+    ASSERT_ON_BOARD1(kworm);
+    add_move_reason(pos, OWL_ATTACK_MOVE_GAIN, find_pair_data(dr, kworm));
+  }
+}
+
+/*
+ * Add to the reasons for the move at (pos) that the owl
+ * code reports a defense of the dragon (dr).
+ */
+void
+add_owl_defense_move(int pos, int dr, int code)
+{
+  dr = dragon[dr].origin;
+
+  ASSERT_ON_BOARD1(dr);
+  if (code == WIN)
+    add_move_reason(pos, OWL_DEFEND_MOVE, dr);
+  else if (code == KO_A)
+    add_move_reason(pos, OWL_DEFEND_MOVE_GOOD_KO, dr);
+  else if (code == KO_B)
+    add_move_reason(pos, OWL_DEFEND_MOVE_BAD_KO, dr);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that the owl
+ * code reports a move threatening to attack the dragon enemy (dr).
+ * That is, if the attacker is given two moves in a row, (pos)
+ * can be the first move.
+ */
+void
+add_owl_attack_threat_move(int pos, int dr, int code)
+{
+  UNUSED(code);
+  dr = dragon[dr].origin;
+  
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, OWL_ATTACK_THREAT, dragon[dr].origin);
+  add_worthwhile_threat_move(pos);
+}
+
+/* The owl code found the friendly dragon alive, or the unfriendly dragon
+ * dead, and an extra point of attack or defense was found, so this might be a
+ * good place to play.  
+ */
+void
+add_owl_uncertain_defense_move(int pos, int dr)
+{
+  dr = dragon[dr].origin;
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, UNCERTAIN_OWL_DEFENSE, dragon[dr].origin);
+}
+
+/* The owl code found the opponent dragon alive, or the friendly
+ * dragon dead, but was uncertain, and this move reason propose
+ * an attack or defense which is expected to fail but might succeed.
+ */
+void
+add_owl_uncertain_attack_move(int pos, int dr)
+{
+  dr = dragon[dr].origin;
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, UNCERTAIN_OWL_ATTACK, dragon[dr].origin);
+}
+
+/*
+ * Add to the reasons for the move at (pos) that the owl
+ * code reports a move threatening to rescue the dragon (dr).
+ * That is, if the defender is given two moves in a row, (pos)
+ * can be the first move.
+ */
+void
+add_owl_defense_threat_move(int pos, int dr, int code)
+{
+  UNUSED(code);
+  dr = dragon[dr].origin;
+
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, OWL_DEFEND_THREAT, dragon[dr].origin);
+  add_worthwhile_threat_move(pos);
+}
+
+/* Add to the reasons for the move at (pos) that it captures
+ * at least one of a set of worms which individually are tactically
+ * safe (such as a double atari). Only one such move reason is
+ * permitted per move.
+ */
+void
+add_my_atari_atari_move(int pos, int size)
+{
+  add_move_reason(pos, MY_ATARI_ATARI_MOVE, size);
+}
+
+/* Add to the reasons for the move at (pos) that it stops a
+ * combination attack for the opponent.
+ */
+void
+add_your_atari_atari_move(int pos, int size)
+{
+  add_move_reason(pos, YOUR_ATARI_ATARI_MOVE, size);
+}
+
+
+/*
+ * Add to the reasons for the move at (pos) that the owl
+ * code reports a move threatening to defend the dragon enemy (dr),
+ * and that (pos) is a move which attacks the dragon. 
+ * That is, if the defender is given two moves in a row, (pos)
+ * can be the first move. Hopefully playing at (pos) makes it harder 
+ * for the dragon to live.
+ */
+void
+add_owl_prevent_threat_move(int pos, int dr)
+{
+  ASSERT_ON_BOARD1(dr);
+  add_move_reason(pos, OWL_PREVENT_THREAT, dragon[dr].origin);
+}
+
+/*
+ * Add value of followup moves. 
+ */
+void
+add_followup_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value > move[pos].followup_value)
+    move[pos].followup_value = value;
+}
+
+/*
+ * Add value of reverse followup moves. 
+ */
+void
+add_reverse_followup_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value > move[pos].reverse_followup_value)
+    move[pos].reverse_followup_value = value;
+}
+
+/*
+ * Set a minimum allowed value for the move.
+ */
+int
+set_minimum_move_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value > move[pos].min_value) {
+    move[pos].min_value = value;
+    return 1;
+  }
+  return 0;
+}
+
+/*
+ * Set a maximum allowed value for the move.
+ */
+void
+set_maximum_move_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value < move[pos].max_value)
+    move[pos].max_value = value;
+}
+
+/*
+ * Set a minimum allowed territorial value for the move.
+ */
+void
+set_minimum_territorial_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value > move[pos].min_territory)
+    move[pos].min_territory = value;
+}
+
+/*
+ * Set a maximum allowed territorial value for the move.
+ */
+void
+set_maximum_territorial_value(int pos, float value)
+{
+  ASSERT_ON_BOARD1(pos);
+  if (value < move[pos].max_territory)
+    move[pos].max_territory = value;
+}
+
+/* 
+ * Add a point redistribution rule, sending the points from (from)
+ * to (to). 
+ */
+void
+add_replacement_move(int from, int to, int color)
+{
+  int cc;
+  int pos;
+  int dummy;
+
+  ASSERT_ON_BOARD1(from);
+  ASSERT_ON_BOARD1(to);
+
+  if (board[from] != EMPTY)
+    return;
+  ASSERT1(board[to] == EMPTY, to);
+
+  cc = replacement_map[to];
+  if (unconditionally_meaningless_move(to, color, &dummy)) {
+    /* Silently ignore replacement patterns which conflict with the
+     * unconditional analysis since the latter is always correct and
+     * it's difficult to anticipate such situations for the patterns.
+     */
+    return;
+  }
+
+  /* First check for an incompatible redistribution rule. */
+  if (replacement_map[from] != NO_MOVE) {
+    int dd = replacement_map[from];
+    /* Abort if the old rule isn't compatible with the new one.
+     * (But not in the stable release.)
+     */
+    if (0) {
+      ASSERT1(dd == to || to == replacement_map[dd], from);
+    }
+    /* There already is a redistribution in effect so we
+     * have nothing more to do.
+     */
+    return;
+  }
+
+  TRACE("Move at %1m is replaced by %1m.\n", from, to);    
+
+  /* Verify that we don't introduce a cyclic redistribution. */
+  if (cc == from) {
+    gprintf("Cyclic point redistribution detected.\n");
+    ASSERT1(0, from);
+  }
+
+  /* Update the replacement map. Make sure that all replacements
+   * always are directed immediately to the final destination.
+   */
+  if (cc != NO_MOVE)
+    replacement_map[from] = cc;
+  else
+    replacement_map[from] = to;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && replacement_map[pos] == from)
+      replacement_map[pos] = replacement_map[from];
+  }
+}
+
+
+/* Find worms rescued by a move at (pos). */
+void
+get_saved_worms(int pos, signed char saved[BOARDMAX])
+{
+  int k;
+  memset(saved, 0, sizeof(saved[0]) * BOARDMAX);
+  
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    int what;
+
+    if (r < 0)
+      break;
+    
+    what = move_reasons[r].what;
+    /* We exclude the ko contingent defenses, to avoid that the
+     * confirm_safety routines spot an attack with ko and thinks the
+     * move is unsafe.
+     */
+    if (move_reasons[r].type == DEFEND_MOVE)
+      mark_string(worm[what].origin, saved, 1);
+    else if (move_reasons[r].type == OWL_DEFEND_MOVE_LOSS) {
+      int origin = dragon[what].origin;
+      int kworm = worm[what].origin;
+      int ii;
+      for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+       if (IS_STONE(board[ii]) && dragon[ii].origin == origin
+           && worm[ii].origin != kworm)
+         mark_string(worm[ii].origin, saved, 1);
+    }
+  }    
+}
+
+/* This function marks all stones whose status is changed by an owl move
+ * reason according to the following rules:
+ * 1. For an owl attack, all stones belonging to the attacked dragon are
+ *    marked as INFLUENCE_CAPTURED_STONE
+ * 2. For an owl defense, all stones belonging to the defended dragon are
+ *    markes as INFLUENCE_SAVED_STONE if they are also sufficiently
+ *    tactically stable.
+ *
+ * In effective_size, the sum of the effective size of the changed worms
+ * is returned (unless it is a NULL pointer).
+ */
+void
+mark_changed_dragon(int pos, int color, int affected, int affected2,
+                   int move_reason_type, signed char safe_stones[BOARDMAX],
+                   float strength[BOARDMAX], float *effective_size)
+{
+  int ii;
+  signed char new_status = INFLUENCE_SAVED_STONE;
+  int result_to_beat = 0;
+
+  ASSERT1(board[pos] == EMPTY, pos);
+  ASSERT1(IS_STONE(board[affected]), pos);
+
+  if (effective_size)
+    *effective_size = 0.0;
+
+  /* For attack moves, we immediately can set the effective size.
+   * For defense moves, it will be calculated in the course of
+   * updating the worms' status.
+   */
+  switch (move_reason_type) {
+    case OWL_ATTACK_MOVE:
+    case OWL_ATTACK_MOVE_GOOD_KO:
+    case OWL_ATTACK_MOVE_BAD_KO:
+      ASSERT1(board[affected] == OTHER_COLOR(color), pos);
+      new_status = 0;
+      if (effective_size)
+       *effective_size = dragon[affected].effective_size;
+      break;
+    case OWL_DEFEND_MOVE:
+      ASSERT1(board[affected] == color, pos);
+      result_to_beat = WIN;
+      break;
+    case OWL_DEFEND_MOVE_GOOD_KO:
+      ASSERT1(board[affected] == color, pos);
+      result_to_beat = KO_A;
+      break;
+    case OWL_DEFEND_MOVE_BAD_KO:
+      ASSERT1(board[affected] == color, pos);
+      result_to_beat = KO_B;
+      break;
+    case OWL_ATTACK_MOVE_GAIN:
+      ASSERT1(board[affected] == OTHER_COLOR(color), pos);
+      new_status = 0;
+      if (effective_size)
+       *effective_size = worm[affected2].effective_size;
+      break;
+    case OWL_DEFEND_MOVE_LOSS:
+      ASSERT1(board[affected] == color, pos);
+      if (effective_size)
+       *effective_size = dragon[affected].effective_size
+                         - worm[affected2].effective_size;
+      result_to_beat = WIN;
+      break;
+    case SEMEAI_MOVE:
+      ASSERT1(IS_STONE(board[affected]), pos);
+      if (board[affected] == color)
+       result_to_beat = WIN;
+      else {
+       new_status = 0;
+       if (effective_size)
+         *effective_size = dragon[affected].effective_size;
+      }
+      break;
+
+    default:
+      /* mark_changed_dragon() called with invalid move reason. */
+      ASSERT1(0, pos);
+  }
+
+  if (move_reason_type == OWL_ATTACK_MOVE_GAIN)
+    mark_changed_string(affected2, safe_stones, strength, new_status);
+  else {
+    for (ii = first_worm_in_dragon(affected); ii != NO_MOVE; 
+        ii = next_worm_in_dragon(ii))
+      if (new_status == 0)
+       mark_changed_string(ii, safe_stones, strength, new_status);
+      else {
+       int worm_is_safe = 0;
+       if (worm[ii].attack_codes[0] == NO_MOVE
+           || defense_move_reason_known(pos, ii))
+         worm_is_safe = 1;
+       else if (trymove(pos, color, "mark-changed-dragon", ii)) {
+           if (REVERSE_RESULT(attack(ii, NULL)) >= result_to_beat)
+             worm_is_safe = 1;
+           popgo();
+       }
+       if (worm_is_safe || move_reason_type == SEMEAI_MOVE) {
+         /* This string can now be considered safe. Hence we mark the
+          * whole string as such:
+          */
+         mark_changed_string(ii, safe_stones, strength, new_status);
+         if (effective_size)
+           *effective_size += worm[ii].effective_size;
+       }
+      }
+    if (move_reason_type == OWL_DEFEND_MOVE_LOSS) {
+      new_status = 0;
+      mark_changed_string(affected2, safe_stones, strength, new_status);
+    }
+  }
+}
+
+/* Marks the string at (affected) with the new status and accordingly
+ * with the new strength.
+ */
+void
+mark_changed_string(int affected, signed char safe_stones[BOARDMAX],
+                   float strength[BOARDMAX], signed char new_status)
+{
+  float new_strength;
+  int ii;
+
+  ASSERT1(IS_STONE(board[affected]), affected);
+
+  if (new_status == 0)
+    new_strength = 0.0;
+  else {
+    gg_assert(new_status == INFLUENCE_SAVED_STONE);
+    new_strength = DEFAULT_STRENGTH;
+  }
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (board[ii] == board[affected]
+       && same_string(ii, affected)) {
+      strength[ii] = new_strength;
+      safe_stones[ii] = new_status;
+    }
+}
+
+
+/* Find dragons rescued by a move at (pos). */
+void
+get_saved_dragons(int pos, signed char saved[BOARDMAX])
+{
+  int k;
+  memset(saved, 0, sizeof(saved[0]) * BOARDMAX);
+  
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    int what;
+
+    if (r < 0)
+      break;
+    
+    what = move_reasons[r].what;
+    /* We exclude the ko contingent defenses, to avoid that the
+     * confirm_safety routines spot an attack with ko and thinks the
+     * move is unsafe.
+     */
+    if (move_reasons[r].type == OWL_DEFEND_MOVE)
+      mark_dragon(what, saved, 1);
+  }    
+}
+
+
+/* If a move has saved the dragons in saved_dragons[] and worms in
+ * saved_worms[], this functions writes the stones now supposedly safe
+ * in the array safe_stones[].
+ *
+ * The safety of the played move itself is set according to
+ * move[pos].move_safety.
+ */
+void
+mark_safe_stones(int color, int move_pos,
+                const signed char saved_dragons[BOARDMAX],
+                const signed char saved_worms[BOARDMAX],
+                signed char safe_stones[BOARDMAX])
+{
+  int pos; 
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == OTHER_COLOR(color)) {
+      if (dragon[pos].status == DEAD
+         || (worm[pos].attack_codes[0] != 0
+             && worm[pos].defense_codes[0] == 0))
+       safe_stones[pos] = 0;
+      else
+       safe_stones[pos] = SAFE_STONE;
+    }
+    else if (board[pos] == color) {
+      if ((worm[pos].attack_codes[0] != 0
+          && (worm[pos].defense_codes[0] == 0 || !saved_worms[pos]))
+         || dragon[pos].status == DEAD)
+       safe_stones[pos] = 0;
+      else if (saved_dragons[pos])
+       safe_stones[pos] = OWL_SAVED_STONE;
+      else if (dragon[pos].status == CRITICAL)
+       safe_stones[pos] = 0;
+      else
+       safe_stones[pos] = SAFE_STONE;
+    }
+    else
+      safe_stones[pos] = 0;
+  }
+  safe_stones[move_pos]
+    = move[move_pos].move_safety && safe_move(move_pos, color) == WIN;
+}
+
+
+/* List the move reasons for (color)'s move at (pos). Return the
+ * number of move reasons.
+ */
+int
+list_move_reasons(FILE *out, int move_pos)
+{
+  int m;
+  int n;
+  int pos;
+  int k;
+  int reason1;
+  int reason2;
+  int aa = NO_MOVE;
+  int bb = NO_MOVE;
+  int worm1 = -1;
+  int worm2 = -1;
+  int num_move_reasons = 0;
+
+  gprintf("\nMove reasons:\n");
+  
+  for (n = 0; n < board_size; n++)
+    for (m = board_size-1; m >= 0; m--) {
+      pos = POS(m, n);
+
+      if (move_pos != NO_MOVE && move_pos != pos)
+       continue;
+      
+      for (k = 0; k < MAX_REASONS; k++) {
+       int r = move[pos].reason[k];
+
+       if (r < 0)
+         break;
+
+       num_move_reasons++;
+
+       switch (move_reasons[r].type) {
+       case ATTACK_MOVE:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m attacks %1m%s\n", pos, aa,
+                  (worm[aa].defense_codes[0] == 0) ? " (defenseless)" : "");
+         break;
+       case ATTACK_MOVE_GOOD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m attacks %1m%s with good ko\n", pos, aa,
+                  (worm[aa].defense_codes[0] == 0) ? " (defenseless)" : "");
+         break;
+       case ATTACK_MOVE_BAD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m attacks %1m%s with bad ko\n", pos, aa,
+                  (worm[aa].defense_codes[0] == 0) ? " (defenseless)" : "");
+         break;
+         
+       case DEFEND_MOVE:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m defends %1m\n", pos, aa);
+         break;
+       case DEFEND_MOVE_GOOD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m defends %1m with good ko\n", pos, aa);
+         break;
+       case DEFEND_MOVE_BAD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m defends %1m with bad ko\n", pos, aa);
+         break;
+         
+       case ATTACK_THREAT:
+       case DEFEND_THREAT:
+         aa = move_reasons[r].what;
+         
+         if (move_reasons[r].type == ATTACK_THREAT)
+           gfprintf(out, "Move at %1m threatens to attack %1m\n", pos, aa);
+         else if (move_reasons[r].type == DEFEND_THREAT)
+           gfprintf(out, "Move at %1m threatens to defend %1m\n", pos, aa);
+         break;
+
+       case UNCERTAIN_OWL_DEFENSE:
+         aa = move_reasons[r].what;
+         if (board[aa] == current_color)
+           gfprintf(out, "%1m found alive but not certainly, %1m defends it again\n",
+                    aa, pos);
+         else
+           gfprintf(out, "%1m found dead but not certainly, %1m attacks it again\n",
+                    aa, pos);
+         break;          
+
+       case CONNECT_MOVE:
+       case CUT_MOVE:
+         worm1 = conn_worm1[move_reasons[r].what];
+         worm2 = conn_worm2[move_reasons[r].what];
+         if (move_reasons[r].type == CONNECT_MOVE)
+           gfprintf(out, "Move at %1m connects %1m and %1m\n",
+                    pos, worm1, worm2);
+         else
+           gfprintf(out, "Move at %1m cuts %1m and %1m\n", pos, worm1, worm2);
+         break;
+         
+       case ANTISUJI_MOVE:
+         gfprintf(out, "Move at %1m is an antisuji\n", pos);
+         break;
+         
+       case SEMEAI_MOVE:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m wins semeai for %1m\n", pos, aa);
+         break;
+         
+       case SEMEAI_THREAT:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m threatens to win semeai for %1m\n",
+                  pos, aa);
+         break;
+         
+       case EITHER_MOVE:
+         reason1 = either_data[move_reasons[r].what].reason1;
+         reason2 = either_data[move_reasons[r].what].reason2;
+         worm1 = either_data[move_reasons[r].what].what1;
+         worm2 = either_data[move_reasons[r].what].what2;
+         gfprintf(out, "Move at %1m either %s %1m or %s %1m\n", pos, 
+                  reason1 == ATTACK_STRING ? "attacks" : "defends", worm1, 
+                  reason2 == ATTACK_STRING ? "attacks" : "defends", worm2);
+         break;
+
+       case ALL_MOVE:
+         reason1 = all_data[move_reasons[r].what].reason1;
+         reason2 = all_data[move_reasons[r].what].reason2;
+         worm1 = all_data[move_reasons[r].what].what1;
+         worm2 = all_data[move_reasons[r].what].what2;
+         gfprintf(out, "Move at %1m both %s %1m and %s %1m\n", pos, 
+                  reason1 == ATTACK_STRING ? "attacks" : "defends", worm1, 
+                  reason2 == ATTACK_STRING ? "attacks" : "defends", worm2);
+         break;
+
+       case OWL_ATTACK_MOVE:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-attacks %1m\n", pos, aa);
+         break;
+       case OWL_ATTACK_MOVE_GOOD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-attacks %1m with good ko\n", pos, aa);
+         break;
+       case OWL_ATTACK_MOVE_BAD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-attacks %1m with bad ko\n", pos, aa);
+         break;
+       case OWL_ATTACK_MOVE_GAIN:
+         aa = either_data[move_reasons[r].what].what1;
+         bb = either_data[move_reasons[r].what].what2;
+         gfprintf(out, "Move at %1m owl-attacks %1m (captures %1m)\n",
+                  pos, aa, bb);
+         break;
+         
+       case OWL_DEFEND_MOVE:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-defends %1m\n", pos, aa);
+         break;
+       case OWL_DEFEND_MOVE_GOOD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-defends %1m with good ko\n", pos, aa);
+         break;
+       case OWL_DEFEND_MOVE_BAD_KO:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-defends %1m with bad ko\n", pos, aa);
+         break;
+       case OWL_DEFEND_MOVE_LOSS:
+         aa = either_data[move_reasons[r].what].what1;
+         bb = either_data[move_reasons[r].what].what2;
+         gfprintf(out, "Move at %1m owl-defends %1m (loses %1m)\n",
+                  pos, aa, bb);
+         break;
+         
+       case OWL_ATTACK_THREAT:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-threatens to attack %1m\n", pos, aa);
+         break;
+         
+       case OWL_DEFEND_THREAT:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-threatens to defend %1m\n", pos, aa);
+         break;
+         
+       case OWL_PREVENT_THREAT:
+         aa = move_reasons[r].what;
+         gfprintf(out, "Move at %1m owl-prevents a threat to attack or defend %1m\n", 
+                  pos, aa);
+         break;
+
+       case EXPAND_TERRITORY_MOVE:
+         gfprintf(out, "Move at %1m expands territory\n", pos);
+         break;
+         
+       case EXPAND_MOYO_MOVE:
+         gfprintf(out, "Move at %1m expands moyo\n", pos);
+         break;
+         
+       case INVASION_MOVE:
+         gfprintf(out, "Move at %1m is an invasion\n", pos);
+         break;
+         
+       case STRATEGIC_ATTACK_MOVE:
+       case STRATEGIC_DEFEND_MOVE:
+         aa = move_reasons[r].what;
+         
+         if (move_reasons[r].type == STRATEGIC_ATTACK_MOVE)
+           gfprintf(out, "Move at %1m strategically attacks %1m\n", pos, aa);
+         else
+           gfprintf(out, "Move at %1m strategically defends %1m\n", pos, aa);
+         break;
+         
+       case MY_ATARI_ATARI_MOVE:
+         gfprintf(out, "Move at %1m captures something\n", pos);
+
+       case YOUR_ATARI_ATARI_MOVE:
+         gfprintf(out, "Move at %1m defends against combination attack\n",
+                  pos);
+       }
+      }
+      if (k > 0 && move[pos].move_safety == 0)
+       gfprintf(out, "Move at %1m strategically or tactically unsafe\n", pos);
+    }
+  
+  return num_move_reasons;
+}
+
+
+
+
+/* This array lists rules according to which we set the status
+ * flags of a move reasons.
+ * The format is:
+ * { List of reasons to which the rule applies, condition of the rule,
+ * flags to be set, trace message }
+ * The condition must be of type discard_condition_fn_ptr, that is a pointer
+ * to a function with parameters (pos, what).
+ *
+ * FIXME: Add handling of ALL and EITHER moves for inessential worms.
+ */
+
+static struct discard_rule discard_rules[] =
+{
+  { { ATTACK_MOVE, ATTACK_MOVE_GOOD_KO,
+      ATTACK_MOVE_BAD_KO, ATTACK_THREAT,
+      DEFEND_MOVE, DEFEND_MOVE_GOOD_KO,
+      DEFEND_MOVE_BAD_KO, DEFEND_THREAT, -1 },
+    owl_move_vs_worm_known, TERRITORY_REDUNDANT,
+    "  %1m: 0.0 - (threat of) attack/defense of %1m (owl attack/defense as well)\n" },
+  { { SEMEAI_MOVE, SEMEAI_THREAT, -1 },
+    owl_move_reason_known, REDUNDANT,
+    "  %1m: 0.0 - (threat to) win semeai involving %1m (owl move as well)\n"},
+  { { SEMEAI_MOVE, SEMEAI_THREAT, -1 },
+    tactical_move_vs_whole_dragon_known, REDUNDANT,
+    "  %1m: 0.0 - (threat to) win semeai involving %1m (tactical move as well)\n"},
+  { { EITHER_MOVE, -1 },
+    either_worm_attackable, REDUNDANT,
+    "  %1m: 0.0 - 'attack either' is redundant at %1m (direct att./def. as well)\n"},
+  { { ALL_MOVE, -1 },
+    one_of_both_attackable, REDUNDANT,
+    "  %1m: 0.0 - 'defend both' is redundant at %1m (direct att./def. as well)\n"},
+  { { ATTACK_THREAT, DEFEND_THREAT, -1 },
+    concerns_inessential_worm, TERRITORY_REDUNDANT,
+    "  %1m: 0.0 - attack/defense threat of %1m (inessential)\n"},
+  { { OWL_ATTACK_THREAT, UNCERTAIN_OWL_DEFENSE, -1 },
+    concerns_inessential_dragon, REDUNDANT,
+    "  %1m: 0.0 - (uncertain) owl attack/defense of %1m (inessential)\n"},
+  { { ATTACK_MOVE, ATTACK_MOVE_GOOD_KO, ATTACK_MOVE_BAD_KO,
+      DEFEND_MOVE, DEFEND_MOVE_GOOD_KO, DEFEND_MOVE_BAD_KO, -1},
+    move_is_marked_unsafe, REDUNDANT,
+    "  %1m: 0.0 - tactical move vs %1m (unsafe move)\n"},
+  { { OWL_ATTACK_MOVE, OWL_ATTACK_MOVE_GOOD_KO, OWL_ATTACK_MOVE_BAD_KO,
+      OWL_DEFEND_MOVE, OWL_DEFEND_MOVE_GOOD_KO, OWL_DEFEND_MOVE_BAD_KO, -1},
+    concerns_noncritical_dragon, REDUNDANT,
+    "  %1m: 0.0 - owl move vs %1m (non-critical)\n"},
+  { { -1 }, NULL, 0, ""}  /* Keep this entry at end of the list. */
+};
+
+/* This function checks the list of move reasons for redundant move
+ * reasons and marks them accordingly in their status field.
+ */
+void
+discard_redundant_move_reasons(int pos)
+{
+  int k1, k2;
+  int l;
+  for (k1 = 0; !(discard_rules[k1].reason_type[0] == -1); k1++) {
+    for (k2 = 0; !(discard_rules[k1].reason_type[k2] == -1); k2++) {
+      for (l = 0; l < MAX_REASONS; l++) {
+
+        int r = move[pos].reason[l];
+        if (r < 0)
+          break;
+        if ((move_reasons[r].type == discard_rules[k1].reason_type[k2])
+            && (discard_rules[k1].condition(pos, move_reasons[r].what))) {
+          DEBUG(DEBUG_MOVE_REASONS, discard_rules[k1].trace_message,
+                pos, get_pos(move_reasons[r].type, move_reasons[r].what)); 
+          move_reasons[r].status |= discard_rules[k1].flags;
+        }
+      } 
+    }
+  }
+}
+
+
+/* Look through the move reasons to see whether (pos) is an antisuji move. */
+int
+is_antisuji_move(int pos)
+{
+  int k;
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    if (move_reasons[r].type == ANTISUJI_MOVE)
+      return 1; /* This move must not be played. End of story. */
+  }
+
+  return 0;
+}
+
+/* Increase the randomness scaling factor.
+ * This causes the move value to be more random.
+ */
+
+void
+scale_randomness(int pos, float scaling)
+{
+  if (scaling > move[pos].randomness_scaling)
+    move[pos].randomness_scaling = scaling;
+}
+
+
+/* Register the given `move' as a good attack threat against `target'. By
+ * "good" we mean a threat which is effectively a sente for the player.
+ * E.g. in this position the threat is good, because it results in four
+ * sente moves locally (trevord:950):
+ *
+ *  ..OX..
+ *  .O.*..
+ *  .OXX..
+ *  .OOX..
+ *  ------
+ *
+ * We use this list of good threats for performance reasons so that
+ * estimate_territorial_value() in valuemoves.c doesn't have to read
+ * through all the moves. Such threats are found with patterns.
+ */
+void
+register_good_attack_threat(int move, int target)
+{
+  int k;
+  ASSERT_ON_BOARD1(move);
+  ASSERT_ON_BOARD1(target);
+  ASSERT1(IS_STONE(worm[target].color), move);
+
+  target = worm[target].origin;
+  for (k = 0; k < MAX_ATTACK_THREATS; k++) {
+    if (known_good_attack_threats[move][k] == target)
+      break;
+    if (known_good_attack_threats[move][k] == NO_MOVE) {
+      known_good_attack_threats[move][k] = target;
+      break;
+    }
+  }
+}
+
+
+/* Determine if an attack threat is registered as good (see above). */
+int
+is_known_good_attack_threat(int move, int target)
+{
+  int k;
+  ASSERT_ON_BOARD1(move);
+  ASSERT_ON_BOARD1(target);
+  ASSERT1(IS_STONE(worm[target].color), move);
+
+  target = worm[target].origin;
+  for (k = 0; k < MAX_ATTACK_THREATS; k++) {
+    if (known_good_attack_threats[move][k] == target)
+      return 1;
+    if (known_good_attack_threats[move][k] == NO_MOVE)
+      break;
+  }
+
+  return 0;
+}
+
+/* Like documented in endgame:980, there are also moves which aren't
+ * safe by themselves, but attempting to capture these stones would
+ * result in a loss for the opponent (typically, by damezumari).
+ * Simple examples include snapbacks, but more complicated ones do
+ * exist. Following functions are helpers for the valuation processing
+ * which deal with such special cases.
+ */
+void
+register_known_safe_move(int move)
+{
+  ASSERT_ON_BOARD1(move);
+  
+  known_safe_moves[move] = 1;
+}
+
+
+int
+is_known_safe_move(int move)
+{
+  ASSERT_ON_BOARD1(move);
+  
+  return known_safe_moves[move];
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/move_reasons.h b/engine/move_reasons.h
new file mode 100644 (file)
index 0000000..7257a54
--- /dev/null
@@ -0,0 +1,220 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* values for move_reason.type */
+#define THREAT_BIT    1
+
+/* Only use even values for non-threat move reasons! */
+#define ATTACK_MOVE              2
+#define ATTACK_MOVE_GOOD_KO      4
+#define ATTACK_MOVE_BAD_KO       6
+#define ATTACK_THREAT           (ATTACK_MOVE | THREAT_BIT)
+#define DEFEND_MOVE              8
+#define DEFEND_MOVE_GOOD_KO     10
+#define DEFEND_MOVE_BAD_KO      12
+#define DEFEND_THREAT           (DEFEND_MOVE | THREAT_BIT)
+
+#define CONNECT_MOVE            14
+#define CUT_MOVE                16
+
+#define SEMEAI_MOVE             18
+#define SEMEAI_THREAT           (SEMEAI_MOVE | THREAT_BIT)
+
+#define EXPAND_TERRITORY_MOVE   20
+#define EXPAND_MOYO_MOVE        22
+#define INVASION_MOVE           24
+
+#define OWL_ATTACK_MOVE         26
+#define OWL_ATTACK_MOVE_GOOD_KO 28
+#define OWL_ATTACK_MOVE_BAD_KO  30
+#define OWL_ATTACK_THREAT       (OWL_ATTACK_MOVE | THREAT_BIT)
+#define OWL_DEFEND_MOVE         32
+#define OWL_DEFEND_MOVE_GOOD_KO 34
+#define OWL_DEFEND_MOVE_BAD_KO  36
+#define OWL_DEFEND_THREAT       (OWL_DEFEND_MOVE | THREAT_BIT)
+#define OWL_PREVENT_THREAT      38
+#define UNCERTAIN_OWL_ATTACK    40
+#define UNCERTAIN_OWL_DEFENSE   42
+#define STRATEGIC_ATTACK_MOVE   44
+#define STRATEGIC_DEFEND_MOVE   46
+
+#define MY_ATARI_ATARI_MOVE     50
+#define YOUR_ATARI_ATARI_MOVE   52
+#define VITAL_EYE_MOVE          54
+
+#define OWL_ATTACK_MOVE_GAIN    60
+#define OWL_DEFEND_MOVE_LOSS    62
+#define POTENTIAL_SEMEAI_ATTACK        64
+#define POTENTIAL_SEMEAI_DEFENSE 66
+
+#define ANTISUJI_MOVE           70
+
+#define EITHER_MOVE             100
+#define ALL_MOVE                102
+
+
+/* Bitmap values for move_reason.status */
+#define ACTIVE                  0
+#define TERRITORY_REDUNDANT     1
+#define STRATEGICALLY_REDUNDANT 2
+#define REDUNDANT               (TERRITORY_REDUNDANT | STRATEGICALLY_REDUNDANT)
+#define SECONDARY               4
+
+#define MAX_REASONS 120
+
+#define MAX_TRACE_LENGTH  160
+
+#define HUGE_MOVE_VALUE 10.0*MAX_BOARD*MAX_BOARD
+
+struct move_reason {
+  int type;   /* e.g. attack, defend, or connect */
+  int what;   /* pointer into list of strings, list of pair of dragons,
+                or similar */
+  int status; /* This is a bitmap to mark redundant or secondary
+                 move reasons. */
+};
+
+struct move_data {
+  float value;    /* total comparison value, computed at the very end */
+  float final_value; /* value after point redistribution. */
+  float additional_ko_value; /* Additional threat value if ko fight going on.*/
+
+  float territorial_value; /* Value in terms of actual profit. */
+  float strategical_value; /* Value with respect to strength, weakness, and
+                             safety of all groups on the board. */
+
+  float maxpos_shape;      /* Maximal positive contribution to shape */
+  float maxneg_shape;      /* Maximal negative contribution to shape */
+  int numpos_shape;        /* Number of positive contributions to shape */
+  int numneg_shape;        /* Number of negative contributions to shape */
+
+  float followup_value;    /* Value of followup move (our sente). */
+  float influence_followup_value;  /* Followup value of move as reported by
+                                      experimental influence. */
+  float reverse_followup_value;        /* Value of opponents followup move
+                                  (reverse sente). */
+  float secondary_value;      /* Secondary move value. */
+  float min_value;            /* Minimum allowed value for the move. */
+  float max_value;            /* Maximum allowed value for the move. */
+  float min_territory;        /* Minimum territorial value. */
+  float max_territory;        /* Maximum territorial value. */
+  float randomness_scaling;   /* Increase to randomize this move. */
+
+  int reason[MAX_REASONS]; /* List of reasons for a move. */
+  int move_safety;         /* Whether the move seems safe. */
+  int worthwhile_threat;   /* Play this move as a pure threat. */
+  float random_number;     /* Random number connected to this move. */
+};
+
+
+
+/*
+ * Some sizes.  
+ *
+ * FIXME: Many of these could be optimized more for size (e.g. MAX_EYES)
+ */
+
+#define MAX_MOVE_REASONS       1000
+#define MAX_WORMS              2*MAX_BOARD*MAX_BOARD/3
+#define MAX_DRAGONS            MAX_WORMS
+#define MAX_CONNECTIONS        4*MAX_WORMS
+#define MAX_POTENTIAL_SEMEAI   50
+#define MAX_EYES               MAX_BOARD*MAX_BOARD/2
+#define MAX_LUNCHES            MAX_WORMS
+#define MAX_EITHER             100
+#define MAX_ALL                100
+#define MAX_ATTACK_THREATS     6
+
+
+extern struct move_data move[BOARDMAX];
+extern struct move_reason move_reasons[MAX_MOVE_REASONS];
+extern int next_reason;
+
+/* Connections */
+extern int conn_worm1[MAX_CONNECTIONS];
+extern int conn_worm2[MAX_CONNECTIONS];
+extern int next_connection;
+
+extern int semeai_target1[MAX_POTENTIAL_SEMEAI];
+extern int semeai_target2[MAX_POTENTIAL_SEMEAI];
+
+/* Unordered sets (currently pairs) of move reasons / targets */
+typedef struct {
+  int reason1;
+  int what1;
+  int reason2;
+  int what2;
+} Reason_set;
+extern Reason_set either_data[MAX_EITHER];
+extern int        next_either;
+extern Reason_set all_data[MAX_ALL];
+extern int        next_all;
+
+/* Eye shapes */
+extern int eyes[MAX_EYES];
+extern int eyecolor[MAX_EYES];
+extern int next_eye;
+
+/* Lunches */
+extern int lunch_dragon[MAX_LUNCHES]; /* eater */
+extern int lunch_worm[MAX_LUNCHES];   /* food */
+extern int next_lunch;
+
+/* Point redistribution */
+extern int replacement_map[BOARDMAX];
+
+/* The color for which we are evaluating moves. */
+extern int current_color;
+
+int find_worm(int str);
+int find_dragon(int str);
+   
+int move_reason_known(int pos, int type, int what);
+int attack_move_reason_known(int pos, int what);
+int defense_move_reason_known(int pos, int what);
+int owl_attack_move_reason_known(int pos, int what);
+int owl_defense_move_reason_known(int pos, int what);
+int owl_move_reason_known(int pos, int what);
+int semeai_move_reason_known(int pos, int what);
+int get_biggest_owl_target(int pos);
+int is_antisuji_move(int pos);
+
+void discard_redundant_move_reasons(int pos);
+
+void mark_changed_dragon(int pos, int color, int affected, int affected2,
+                        int move_reason_type,
+                        signed char safe_stones[BOARDMAX],
+                        float strength[BOARDMAX], float *effective_size);
+void mark_changed_string(int affected, signed char changed_stones[BOARDMAX],
+                        float strength[BOARDMAX], signed char new_status);
+int adjacent_to_nondead_stone(int pos, int color);
+
+int find_connection(int worm1, int worm2);
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
+
diff --git a/engine/movelist.c b/engine/movelist.c
new file mode 100644 (file)
index 0000000..73a631b
--- /dev/null
@@ -0,0 +1,143 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+
+
+static void movelist_sort_points(int max_points, int points[], int codes[]);
+static void swap_points_and_codes(int points[], int codes[], int m, int n);
+
+
+/* Return the code for the move if it is known.
+ */
+int
+movelist_move_known(int move, int max_points, int points[], int codes[])
+{
+  int k;
+
+  for (k = 0; k < max_points; k++) {
+    if (codes[k] == 0)
+      return 0;
+    if (points[k] == move)
+      return codes[k];
+  }
+  return 0;
+}
+
+
+/*
+ * This function does the real work for change_attack(),
+ * change_defense(), change_attack_threat(), and
+ * change_defense_threat().
+ */
+
+void
+movelist_change_point(int move, int code, int max_points,
+                     int points[], int codes[])
+{
+  int k;
+
+  /* First see if we already know about this point. */
+  for (k = 0; k < max_points; k++)
+    if (points[k] == move)
+      break;
+
+  /* Yes, we do. */
+  if (k < max_points) {
+    if (codes[k] <= code)
+      return; /* Old news. */
+
+    codes[k] = code;
+    movelist_sort_points(max_points, points, codes);
+    return;
+  }
+
+  /* This tactical point is new to us. */
+  if (code > codes[max_points - 1]) {
+    points[max_points - 1] = move;
+    codes[max_points - 1] = code;
+    movelist_sort_points(max_points, points, codes);
+  }
+}
+
+
+/* Sort the tactical points so we have it sorted in falling order on
+ * the code values.
+ *
+ * We use shaker sort because we prefer a stable sort and in all use
+ * cases we can expect it to suffice with one turn through the outer
+ * loop.
+ */
+
+static void
+movelist_sort_points(int max_points, int points[], int codes[])
+{
+  int start = 0;
+  int end = max_points - 1;
+  int new_start;
+  int new_end;
+  int k;
+  
+  while (start < end) {
+    new_start = end;
+    for (k = end; k > start; k--)
+      if (codes[k] > codes[k-1]) {
+       swap_points_and_codes(points, codes, k, k-1);
+       new_start = k;
+      }
+    start = new_start;
+    new_end = start;
+    for (k = start; k < end - 1; k++)
+      if (codes[k] < codes[k+1]) {
+       swap_points_and_codes(points, codes, k, k+1);
+       new_end = k;
+      }
+    end = new_end;
+  }
+}
+
+static void
+swap_points_and_codes(int points[], int codes[], int m, int n)
+{
+  int tmp = points[m];
+  points[m] = points[n];
+  points[n] = tmp;
+  tmp = codes[m];
+  codes[m] = codes[n];
+  codes[n] = tmp;
+}
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/optics.c b/engine/optics.c
new file mode 100644 (file)
index 0000000..1107a8e
--- /dev/null
@@ -0,0 +1,3761 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "liberty.h"
+#include "eyes.h"
+#include "gg_utils.h"
+
+#define MAXEYE 20
+
+
+/* This structure is used in communication between read_eye() and
+ * recognize_eye().
+ */
+struct vital_points {
+  int attacks[4 * MAXEYE];
+  int defenses[4 * MAXEYE];
+  int num_attacks;
+  int num_defenses;
+};
+
+
+static void
+compute_primary_domains(int color, int domain[BOARDMAX],
+                       int lively[BOARDMAX],
+                       int false_margins[BOARDMAX],
+                       int first_time);
+static void count_neighbours(struct eye_data eyedata[BOARDMAX]);
+static int is_lively(int owl_call, int pos);
+static int false_margin(int pos, int color, int lively[BOARDMAX]);
+static void originate_eye(int origin, int pos,
+                         int *esize, int *msize,
+                         struct eye_data eye[BOARDMAX]);
+static int read_eye(int pos, int *attack_point, int *defense_point,
+                   struct eyevalue *value,
+                   struct eye_data eye[BOARDMAX],
+                   struct half_eye_data heye[BOARDMAX],
+                   int add_moves);
+static int recognize_eye(int pos, int *attack_point, int *defense_point,
+                        struct eyevalue *value,
+                        struct eye_data eye[BOARDMAX],
+                        struct half_eye_data heye[BOARDMAX],
+                        struct vital_points *vp);
+static void guess_eye_space(int pos, int effective_eyesize, int margins,
+                           int bulk_score, struct eye_data eye[BOARDMAX],
+                           struct eyevalue *value, int *pessimistic_min);
+static void reset_map(int size);
+static void first_map(int *map_value);
+static int next_map(int *q, int map[MAXEYE]);
+static void print_eye(struct eye_data eye[BOARDMAX],
+                     struct half_eye_data heye[BOARDMAX], int pos);
+static void add_false_eye(int pos, struct eye_data eye[BOARDMAX], 
+                         struct half_eye_data heye[BOARDMAX]);
+static float topological_eye(int pos, int color,
+                            struct eye_data my_eye[BOARDMAX],
+                            struct half_eye_data heye[BOARDMAX]);
+static float evaluate_diagonal_intersection(int m, int n, int color,
+                                           int *attack_point,
+                                           int *defense_point,
+                                           struct eye_data my_eye[BOARDMAX]);
+
+
+/* These are used during the calculations of eye spaces. */
+static int black_domain[BOARDMAX];
+static int white_domain[BOARDMAX];
+
+/* Used internally by mapping functions. */
+static int map_size;
+static signed char used_index[MAXEYE];
+
+
+/*
+ * make_domains() is called from make_dragons() and from
+ * owl_determine_life(). It marks the black and white domains
+ * (eyeshape regions) and collects some statistics about each one.
+ */
+
+void
+make_domains(struct eye_data b_eye[BOARDMAX],
+            struct eye_data w_eye[BOARDMAX],
+            int owl_call)
+{
+  int k;
+  int pos;
+  int lively[BOARDMAX];
+  int false_margins[BOARDMAX];
+  
+  memset(black_domain, 0, sizeof(black_domain));
+  memset(white_domain, 0, sizeof(white_domain));
+  memset(false_margins, 0, sizeof(false_margins));
+
+  if (b_eye)
+    memset(b_eye, 0, BOARDMAX * sizeof(b_eye[0]));
+  if (w_eye)
+    memset(w_eye, 0, BOARDMAX * sizeof(w_eye[0]));
+
+  /* Initialize eye data and compute the lively array. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      lively[pos] = is_lively(owl_call, pos);
+
+  /* Compute the domains of influence of each color. */
+  compute_primary_domains(BLACK, black_domain, lively, false_margins, 1);
+  compute_primary_domains(WHITE, white_domain, lively, false_margins, 0);
+
+  /* Now we fill out the arrays b_eye and w_eye with data describing
+   * each eye shape.
+   */
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    
+    if (board[pos] == EMPTY || !lively[pos]) {
+      if (black_domain[pos] == 0 && white_domain[pos] == 0) {
+       if (w_eye)
+         w_eye[pos].color = GRAY;
+       if (b_eye)
+         b_eye[pos].color = GRAY;
+      }
+      else if (black_domain[pos] == 1 && white_domain[pos] == 0 && b_eye) {
+       b_eye[pos].color = BLACK;
+       for (k = 0; k < 4; k++) {
+         int apos = pos + delta[k];
+         if (ON_BOARD(apos) && white_domain[apos] && !black_domain[apos]) {
+           b_eye[pos].marginal = 1;
+           break;
+         }
+       }
+      }
+      else if (black_domain[pos] == 0 && white_domain[pos] == 1 && w_eye) {
+       w_eye[pos].color = WHITE;
+       for (k = 0; k < 4; k++) {
+         int apos = pos + delta[k];
+         if (ON_BOARD(apos) && black_domain[apos] && !white_domain[apos]) {
+           w_eye[pos].marginal = 1;
+           break;
+         }
+       }
+      }
+      else if (black_domain[pos] == 1 && white_domain[pos] == 1) {
+       if (b_eye) {
+         for (k = 0; k < 4; k++) {
+           int apos = pos + delta[k];
+           if (ON_BOARD(apos) && black_domain[apos]
+               && !white_domain[apos]) {
+             b_eye[pos].marginal = 1;
+             b_eye[pos].color = BLACK;
+             break;
+           }
+         }
+         if (k == 4)
+           b_eye[pos].color = GRAY;
+       }
+       
+       if (w_eye) {
+         for (k = 0; k < 4; k++) {
+           int apos = pos + delta[k];
+           if (ON_BOARD(apos) && white_domain[apos]
+               && !black_domain[apos]) {
+             w_eye[pos].marginal = 1;
+             w_eye[pos].color = WHITE;
+             break;
+           }
+         }
+         if (k == 4)
+           w_eye[pos].color = GRAY;
+       }
+      }
+    }
+  }
+  
+  /* The eye spaces are all found. Now we need to find the origins. */
+  partition_eyespaces(b_eye, BLACK);
+  partition_eyespaces(w_eye, WHITE);
+}
+
+/* Find connected eyespace components and compute relevant statistics. */
+void
+partition_eyespaces(struct eye_data eye[BOARDMAX], int color)
+{
+  int pos;
+
+  if (!eye)
+    return;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      eye[pos].origin = NO_MOVE;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (eye[pos].origin == NO_MOVE && eye[pos].color == color) {
+      int esize = 0;
+      int msize = 0;
+      
+      originate_eye(pos, pos, &esize, &msize, eye);
+      eye[pos].esize = esize;
+      eye[pos].msize = msize;
+    }
+  }
+
+  /* Now we count the number of neighbors and marginal neighbors
+   * of each vertex.
+   */
+  count_neighbours(eye);
+}
+
+
+/* Compute the domains of influence of each color, used in determining
+ * eye shapes. NOTE: the term influence as used here is distinct from the
+ * influence in influence.c.
+ * 
+ * For this algorithm the strings which are not lively are invisible. Ignoring
+ * these, the algorithm assigns friendly influence to:
+ *
+ * (1) every vertex which is occupied by a (lively) friendly stone, 
+ * (2) every empty vertex adjoining a (lively) friendly stone,
+ * (3) every empty vertex for which two adjoining vertices (not
+ *     on the first line) in the (usually 8) surrounding ones have friendly
+ *     influence, with two CAVEATS explained below.
+ *
+ * Thus in the following diagram, e would be assigned friendly influence
+ * if a and b have friendly influence, or a and d. It is not sufficent
+ * for b and d to have friendly influence, because they are not adjoining.
+ * 
+ *        uabc
+ *         def
+ *         ghi
+ * 
+ * The constraint that the two adjoining vertices not lie on the first
+ * line prevents influence from leaking under a stone on the third line.
+ * 
+ * The first CAVEAT alluded to above is that even if a and b have friendly
+ * influence, this does not cause e to have friendly influence if there
+ * is a lively opponent stone at d. This constraint prevents 
+ * influence from leaking past knight's move extensions.
+ *
+ * The second CAVEAT is that even if a and b have friendly influence
+ * this does not cause e to have influence if there are lively opponent
+ * stones at u and at c. This prevents influence from leaking past
+ * nikken tobis (two space jumps).  
+ *
+ * The corner vertices are handled slightly different.
+ * 
+ *    +---
+ *    |ab
+ *    |cd
+ * 
+ * We get friendly influence at a if we have friendly influence
+ * at b or c and no lively unfriendly stone at b, c or d. 
+ *
+ */
+
+#define sufficient_influence(pos, apos, bpos) \
+  (ON_BOARD(bpos) && influence[bpos] > threshold[pos] - influence[apos])
+
+static void
+compute_primary_domains(int color, int domain[BOARDMAX],
+                       int lively[BOARDMAX],
+                       int false_margins[BOARDMAX],
+                       int first_time)
+{
+  int other = OTHER_COLOR(color);
+  int i, j, k;
+  int pos, pos2;
+  int own, enemy;
+  signed char threshold[BOARDMAX];
+  signed char influence[BOARDMAX];
+  int list[BOARDMAX];
+  int size = 0, lastchange = 0;
+
+  memset(threshold, 0, sizeof(threshold));
+  memset(influence, 0, sizeof(influence));
+  
+  /* In the first pass we
+   * 1. Give influence to lively own stones and their neighbors.
+   *    (Cases (1) and (2) above.)
+   * 2. Fill influence[] and threshold[] arrays with initial values.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+   
+    if (lively[pos]) {
+      if (board[pos] == color) {
+        domain[pos] = 1; /* Case (1) above. */
+        influence[pos] = 1;
+      }
+      else
+        influence[pos] = -1;
+      continue;
+    }
+    
+    own = enemy = 0;
+    for (k = 0; k < 4; k++) {
+      pos2 = pos + delta[k];
+      if (ON_BOARD(pos2) && lively[pos2]) {
+        if (board[pos2] == color)
+          own = 1;
+        else
+          enemy = 1;
+      }
+    }
+    
+    if (own) {
+      /* To explain the asymmetry between the first time around
+       * this loop and subsequent ones, a false margin is adjacent
+       * to both B and W lively stones, so it's found on the first
+       * pass through the loop.
+       */
+      if (first_time) {
+        if (board[pos] == EMPTY && (false_margin(pos, color, lively)
+                                   || false_margin(pos, other, lively)))
+          false_margins[pos] = 1;
+        else {
+          domain[pos] = 1;
+          influence[pos] = 1;
+        }
+      }
+      else if (board[pos] != EMPTY || !false_margins[pos]) {
+        domain[pos] = 1;
+        influence[pos] = 1;
+      }
+    }
+    else
+      list[size++] = pos;
+    
+    if (enemy) {
+      threshold[pos] = 1;
+      influence[pos]--;
+    }
+    else if (is_edge_vertex(pos))
+      influence[pos]--;
+  }
+  
+  /* Now we loop over the board until no more vertices can be added to
+   * the domain through case (3) above.
+   */
+  if (size) {
+    k = size;
+    while (1) {
+      if (!k)
+        k = size;
+      pos = list[--k];
+   
+      /* Case (3) above. */
+      if (sufficient_influence(pos, SOUTH(pos), SE(pos))
+          || sufficient_influence(pos, SOUTH(pos), SW(pos))
+          || sufficient_influence(pos, EAST(pos), SE(pos))
+          || sufficient_influence(pos, EAST(pos), NE(pos))
+          || sufficient_influence(pos, WEST(pos), SW(pos))
+          || sufficient_influence(pos, WEST(pos), NW(pos))
+          || sufficient_influence(pos, NORTH(pos), NW(pos))
+          || sufficient_influence(pos, NORTH(pos), NE(pos))) {
+        domain[pos] = 1;
+        influence[pos]++;
+       
+        if (!--size)
+          break;
+        if (k < size)
+          list[k] = list[size];
+        else
+          k--;
+        lastchange = k;
+      }
+      else if (k == lastchange)
+        break; /* Looped the whole list and found nothing new */
+    }
+  }
+  
+  if (0 && (debug & DEBUG_EYES)) {
+    start_draw_board();
+    for (i = 0; i < board_size; i++)
+      for (j = 0; j < board_size; j++) {
+       draw_color_char(i, j, domain[POS(i, j)] ? '1' : '0', GG_COLOR_BLACK);
+      }
+    end_draw_board();
+  }
+}
+
+
+static void
+count_neighbours(struct eye_data eyedata[BOARDMAX])
+{
+  int pos;
+  int k;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos) || eyedata[pos].origin == NO_MOVE) 
+      continue;
+
+    eyedata[pos].esize = eyedata[eyedata[pos].origin].esize;
+    eyedata[pos].msize = eyedata[eyedata[pos].origin].msize;
+    eyedata[pos].neighbors = 0;
+    eyedata[pos].marginal_neighbors = 0;
+    
+    for (k = 0; k < 4; k++) {
+      int pos2 = pos + delta[k];
+      if (ON_BOARD(pos2) && eyedata[pos2].origin == eyedata[pos].origin) {
+       eyedata[pos].neighbors++;
+       if (eyedata[pos2].marginal)
+         eyedata[pos].marginal_neighbors++;
+      }
+    }
+  }
+}
+
+
+static int
+is_lively(int owl_call, int pos)
+{
+  if (board[pos] == EMPTY)
+    return 0;
+
+  if (owl_call)
+    return owl_lively(pos);
+  else
+    return (!worm[pos].inessential
+           && (worm[pos].attack_codes[0] == 0
+               || worm[pos].defense_codes[0] != 0));
+}
+
+
+/* In the following situation, we do not wish the vertex at 'a'
+ * included in the O eye space:
+ * 
+ * OOOOXX
+ * OXaX..
+ * ------
+ *
+ * This eyespace should parse as (X), not (X!). Thus the vertex
+ * should not be included in the eyespace if it is adjacent to
+ * an X stone which is alive, yet X cannot play safely at a.
+ * The function returns 1 if this situation is found at 
+ * (pos) for color O.
+ *
+ * The condition above is true, curiously enough, also for the
+ * following case:
+ *   A group has two eyes, one of size 1 and one which is critical 1/2.
+ *   It also has to have less than 4 external liberties, since the
+ *   reading has to be able to capture the group tactically. In that 
+ *   case, the eye of size one will be treated as a false marginal.
+ * Thus we have to exclude this case, which is done by requiring (pos)
+ * to be adjacent to both white and black stones. Since this test is
+ * least expensive, we start with it.
+ *
+ * As a second optimization we require that one of the other colored
+ * neighbors is not lively. This should cut down on the number of
+ * calls to attack() and safe_move().
+ */
+
+static int
+false_margin(int pos, int color, int lively[BOARDMAX])
+{
+  int other = OTHER_COLOR(color);
+  int neighbors = 0;
+  int k;
+  int all_lively;
+  int potential_false_margin;
+  
+  /* Require neighbors of both colors. */
+  for (k = 0; k < 4; k++)
+    if (ON_BOARD(pos + delta[k]))
+       neighbors |= board[pos + delta[k]];     
+
+  if (neighbors != (WHITE | BLACK))
+    return 0;
+
+  /* At least one opponent neighbor should be not lively. */
+  all_lively = 1;
+  for (k = 0; k < 4; k++)
+    if (board[pos + delta[k]] == other && !lively[pos + delta[k]])
+      all_lively = 0;
+
+  if (all_lively)
+    return 0;
+
+  potential_false_margin = 0;
+  for (k = 0; k < 4; k++) {
+    int apos = pos + delta[k];
+    if (board[apos] != other || !lively[apos])
+      continue;
+    
+    if (stackp == 0 && worm[apos].attack_codes[0] == 0)
+      potential_false_margin = 1;
+    
+    if (stackp > 0 && !attack(apos, NULL))
+      potential_false_margin = 1;
+  }
+  
+  if (potential_false_margin && safe_move(pos, other) == 0) {
+    DEBUG(DEBUG_EYES, "False margin for %C at %1m.\n", color, pos);
+    return 1;
+  }
+
+  return 0;
+}
+
+
+/*
+ * originate_eye(pos, pos, *esize, *msize, eye) creates an eyeshape
+ * with origin pos. esize and msize return the size and the number of
+ * marginal vertices. The repeated variables (pos) are due to the
+ * recursive definition of the function.
+ */
+static void
+originate_eye(int origin, int pos,
+             int *esize, int *msize, 
+             struct eye_data eye[BOARDMAX])
+{
+  int k;
+  ASSERT_ON_BOARD1(origin);
+  ASSERT_ON_BOARD1(pos);
+  gg_assert(esize != NULL);
+  gg_assert(msize != NULL);
+  
+  eye[pos].origin = origin;
+  (*esize)++;
+  if (eye[pos].marginal)
+    (*msize)++;
+
+  for (k = 0; k < 4; k++) {
+    int pos2 = pos + delta[k];
+    if (ON_BOARD(pos2)
+       && eye[pos2].color == eye[pos].color
+       && eye[pos2].origin == NO_MOVE
+       && (!eye[pos2].marginal || !eye[pos].marginal))
+      originate_eye(origin, pos2, esize, msize, eye);
+  }
+}
+
+
+/* 
+ * propagate_eye(origin) copies the data at the (origin) to the
+ * rest of the eye (invariant fields only).
+ */
+
+void
+propagate_eye(int origin, struct eye_data eye[BOARDMAX])
+{
+  int pos;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && eye[pos].origin == origin) {
+      eye[pos].color         = eye[origin].color;
+      eye[pos].esize         = eye[origin].esize;
+      eye[pos].msize         = eye[origin].msize;
+      eye[pos].origin        = eye[origin].origin;
+      eye[pos].value         = eye[origin].value;
+    }
+}
+
+
+/* Find the dragon or dragons surrounding an eye space. Up to
+ * max_dragons dragons adjacent to the eye space are added to
+ * the dragon array, and the number of dragons found is returned.
+ */
+
+int
+find_eye_dragons(int origin, struct eye_data eye[BOARDMAX], int eye_color,
+                int dragons[], int max_dragons)
+{
+  int mx[BOARDMAX];
+  int num_dragons = 0;
+  int pos;
+
+  memset(mx, 0, sizeof(mx));
+  DEBUG(DEBUG_MISCELLANEOUS, "find_eye_dragons: %1m %C\n", origin, eye_color);
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == eye_color
+       && mx[dragon[pos].origin] == 0
+       && ((ON_BOARD(SOUTH(pos))
+            && eye[SOUTH(pos)].origin == origin
+            && !eye[SOUTH(pos)].marginal)
+           || (ON_BOARD(WEST(pos))
+               && eye[WEST(pos)].origin == origin
+               && !eye[WEST(pos)].marginal)
+           || (ON_BOARD(NORTH(pos))
+               && eye[NORTH(pos)].origin == origin
+               && !eye[NORTH(pos)].marginal)
+           || (ON_BOARD(EAST(pos))
+               && eye[EAST(pos)].origin == origin
+               && !eye[EAST(pos)].marginal))) {
+      DEBUG(DEBUG_MISCELLANEOUS, 
+           "  dragon: %1m %1m\n", pos, dragon[pos].origin);
+      mx[dragon[pos].origin] = 1;
+      if (dragons != NULL && num_dragons < max_dragons)
+       dragons[num_dragons] = dragon[pos].origin;
+      num_dragons++;
+    }
+  }
+  
+  return num_dragons;
+}
+
+/* Print debugging data for the eyeshape at (i,j). Useful with GDB.
+ */
+
+static void
+print_eye(struct eye_data eye[BOARDMAX], struct half_eye_data heye[BOARDMAX],
+         int pos)
+{
+  int m, n;
+  int pos2;
+  int mini, maxi;
+  int minj, maxj;
+  int origin = eye[pos].origin;
+
+  gprintf("Eyespace at %1m: color=%C, esize=%d, msize=%d\n",
+         pos, eye[pos].color, eye[pos].esize, eye[pos].msize);
+  
+  for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+    if (!ON_BOARD(pos2))
+      continue;
+    
+    if (eye[pos2].origin != pos) 
+      continue;
+    
+    if (eye[pos2].marginal && IS_STONE(board[pos2]))
+      gprintf("%1m (X!)\n", pos2);
+    else if (is_halfeye(heye, pos2) && IS_STONE(board[pos2])) {
+      if (heye[pos2].value == 3.0)
+       gprintf("%1m (XH)\n", pos2);
+      else
+       gprintf("%1m (XH) (topological eye value = %f)\n", pos2,
+               heye[pos2].value);
+    }
+    else if (!eye[pos2].marginal && IS_STONE(board[pos2]))
+      gprintf("%1m (X)\n", pos2);
+    else if (eye[pos2].marginal && board[pos2] == EMPTY)
+      gprintf("%1m (!)\n", pos2);
+    else if (is_halfeye(heye, pos2) && board[pos2] == EMPTY) {
+      if (heye[pos2].value == 3.0)
+       gprintf("%1m (H)\n", pos2);
+      else
+       gprintf("%1m (H) (topological eye value = %f)\n", pos2,
+               heye[pos2].value);
+    }
+    else
+      gprintf("%1m\n", pos2);
+  }
+  gprintf("\n");
+  
+  /* Determine the size of the eye. */
+  mini = board_size;
+  maxi = -1;
+  minj = board_size;
+  maxj = -1;
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) {
+      if (eye[POS(m, n)].origin != origin)
+       continue;
+
+      if (m < mini) mini = m;
+      if (m > maxi) maxi = m;
+      if (n < minj) minj = n;
+      if (n > maxj) maxj = n;
+    }
+
+  /* Prints the eye shape. A half eye is shown by h, if empty or H, if an
+   * enemy is present. Note that each half eye has a marginal point which is 
+   * not printed, so the representation here may have less points than the 
+   * matching eye pattern in eyes.db. Printing a marginal for the half eye
+   * would be nice, but difficult to implement.
+   */
+  for (m = mini; m <= maxi; m++) {
+    gprintf(""); /* Get the indentation right. */
+    for (n = minj; n <= maxj; n++) {
+      int pos2 = POS(m, n);
+      if (eye[pos2].origin == origin) {
+       if (board[pos2] == EMPTY) {
+         if (eye[pos2].marginal)
+           gprintf("%o!");
+         else if (is_halfeye(heye, pos2))
+           gprintf("%oh");
+         else
+           gprintf("%o.");
+       }
+       else if (is_halfeye(heye, pos2))
+         gprintf("%oH");
+       else
+         gprintf("%oX");
+      }
+      else
+       gprintf("%o ");
+    }
+    gprintf("\n");
+  }
+}
+
+
+/* 
+ * Given an eyespace with origin (pos), this function computes the
+ * minimum and maximum numbers of eyes the space can yield. If max and
+ * min are different, then vital points of attack and defense are also
+ * generated.
+ * 
+ * If add_moves == 1, this function may add a move_reason for (color) at
+ * a vital point which is found by the function. If add_moves == 0,
+ * set color == EMPTY.
+ */
+
+void
+compute_eyes(int pos, struct eyevalue *value,
+            int *attack_point, int *defense_point,
+            struct eye_data eye[BOARDMAX],
+            struct half_eye_data heye[BOARDMAX], int add_moves)
+{
+  if (attack_point)
+    *attack_point = NO_MOVE;
+  if (defense_point)
+    *defense_point = NO_MOVE;
+
+  if (debug & DEBUG_EYES) {
+    print_eye(eye, heye, pos);
+    DEBUG(DEBUG_EYES, "\n");
+  }
+  
+  /* Look up the eye space in the graphs database. */
+  if (read_eye(pos, attack_point, defense_point, value, eye, heye, add_moves))
+    return;
+
+  /* Ideally any eye space that hasn't been matched yet should be two
+   * secure eyes. Until the database becomes more complete we have
+   * some additional heuristics to guess the values of unknown
+   * eyespaces.
+   */
+  if (eye[pos].esize - 2*eye[pos].msize > 3)
+    set_eyevalue(value, 2, 2, 2, 2);
+  else if (eye[pos].esize - 2*eye[pos].msize > 0)
+    set_eyevalue(value, 1, 1, 1, 1);
+  else
+    set_eyevalue(value, 0, 0, 0, 0);
+}
+
+
+/*
+ * This function works like compute_eyes(), except that it also gives
+ * a pessimistic view of the chances to make eyes. Since it is intended
+ * to be used from the owl code, the option to add move reasons has
+ * been removed.
+ */
+void
+compute_eyes_pessimistic(int pos, struct eyevalue *value,
+                        int *pessimistic_min,
+                        int *attack_point, int *defense_point,
+                        struct eye_data eye[BOARDMAX],
+                        struct half_eye_data heye[BOARDMAX])
+{
+  static int bulk_coefficients[5] = {-1, -1, 1, 4, 12};
+
+  int pos2;
+  int margins = 0;
+  int halfeyes = 0;
+  int margins_adjacent_to_margin = 0;
+  int effective_eyesize;
+  int bulk_score = 0;
+  signed char chainlinks[BOARDMAX];
+
+  /* Stones inside eyespace which do not coincide with a false eye or
+   * a halfeye.
+   */
+  int interior_stones = 0;
+
+  memset(chainlinks, 0, BOARDMAX);
+
+  for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+    int k;
+
+    if (!ON_BOARD(pos2) || eye[pos2].origin != pos)
+      continue;
+
+    if (eye[pos2].marginal || is_halfeye(heye, pos2)) {
+      margins++;
+      if (eye[pos2].marginal && eye[pos2].marginal_neighbors > 0)
+       margins_adjacent_to_margin++;
+      if (is_halfeye(heye, pos2))
+       halfeyes++;
+    }
+    else if (IS_STONE(board[pos2]))
+      interior_stones++;
+
+    bulk_score += bulk_coefficients[(int) eye[pos2].neighbors];
+
+    for (k = 0; k < 4; k++) {
+      int neighbor = pos2 + delta[k];
+
+      if (board[neighbor] == eye[pos].color) {
+       if (!chainlinks[neighbor]) {
+         bulk_score += 4;
+         mark_string(neighbor, chainlinks, 1);
+       }
+      }
+      else if (!ON_BOARD(neighbor))
+       bulk_score += 2;
+    }
+  }
+
+  /* This is a measure based on the simplified assumption that both
+   * players only cares about playing the marginal eye spaces. It is
+   * used later to guess the eye value for unidentified eye shapes.
+   */
+  effective_eyesize = (eye[pos].esize + halfeyes - 2*margins
+                      - margins_adjacent_to_margin);
+
+  if (attack_point)
+    *attack_point = NO_MOVE;
+  if (defense_point)
+    *defense_point = NO_MOVE;
+
+  if (debug & DEBUG_EYES) {
+    print_eye(eye, heye, pos);
+    DEBUG(DEBUG_EYES, "\n");
+  }
+  
+  /* Look up the eye space in the graphs database. */
+  if (read_eye(pos, attack_point, defense_point, value,
+              eye, heye, 0)) {
+    *pessimistic_min = min_eyes(value) - margins;
+
+    /* A single point eye which is part of a ko can't be trusted. */
+    if (eye[pos].esize == 1
+       && is_ko(pos, OTHER_COLOR(eye[pos].color), NULL))
+      *pessimistic_min = 0;
+
+    DEBUG(DEBUG_EYES, "  graph matching - %s, pessimistic_min=%d\n",
+         eyevalue_to_string(value), *pessimistic_min);
+  }
+  
+  /* Ideally any eye space that hasn't been matched yet should be two
+   * secure eyes. Until the database becomes more complete we have
+   * some additional heuristics to guess the values of unknown
+   * eyespaces.
+   */
+  else {
+    guess_eye_space(pos, effective_eyesize, margins, bulk_score, eye,
+                   value, pessimistic_min); 
+    DEBUG(DEBUG_EYES, "  guess_eye - %s, pessimistic_min=%d\n",
+         eyevalue_to_string(value), *pessimistic_min);
+  }
+
+  if (*pessimistic_min < 0) {
+    *pessimistic_min = 0;
+    DEBUG(DEBUG_EYES, "  pessimistic min revised to 0\n");
+  }
+
+  /* An eyespace with at least two interior stones is assumed to be
+   * worth at least one eye, regardless of previous considerations.
+   */
+  if (*pessimistic_min < 1 && interior_stones >= 2) {
+    *pessimistic_min = 1;
+    DEBUG(DEBUG_EYES, "  pessimistic min revised to 1 (interior stones)\n");
+  }
+
+  if (attack_point
+      && *attack_point == NO_MOVE
+      && max_eyes(value) != *pessimistic_min) {
+    /* Find one marginal vertex and set as attack and defense point.
+     *
+     * We make some effort to find the best marginal vertex by giving
+     * priority to ones with more than one neighbor in the eyespace.
+     * We prefer non-halfeye margins and ones which are not self-atari
+     * for the opponent. Margins not on the edge are also favored.
+     */
+    int best_attack_point = NO_MOVE;
+    int best_defense_point = NO_MOVE;
+    float score = 0.0;
+    
+    for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+      if (ON_BOARD(pos2) && eye[pos2].origin == pos) {
+       float this_score = 0.0;
+       int this_attack_point = NO_MOVE;
+       int this_defense_point = NO_MOVE;
+       if (eye[pos2].marginal && board[pos2] == EMPTY) {
+         this_score = eye[pos2].neighbors;
+         this_attack_point = pos2;
+         this_defense_point = pos2;
+
+         if (is_self_atari(pos2, OTHER_COLOR(eye[pos].color)))
+           this_score -= 0.5;
+         
+         if (is_edge_vertex(pos2))
+           this_score -= 0.1;
+       }
+       else if (is_halfeye(heye, pos2)) {
+         this_score = 0.75;
+         this_defense_point = heye[pos2].defense_point[0];
+         this_attack_point = heye[pos2].attack_point[0];
+       }
+       else
+         continue;
+       
+       if (gg_normalize_float2int(this_score, 0.01)
+           > gg_normalize_float2int(score, 0.01)) {
+         best_attack_point = this_attack_point;
+         best_defense_point = this_defense_point;
+         score = this_score;
+       }
+      }
+    }
+    
+    if (score > 0.0) {
+      if (defense_point)
+       *defense_point = best_defense_point;
+      if (attack_point)
+       *attack_point = best_attack_point;
+    }
+  }
+
+  if (defense_point && *defense_point != NO_MOVE) {
+    ASSERT_ON_BOARD1(*defense_point);
+  }
+  if (attack_point && *attack_point != NO_MOVE) {
+    ASSERT_ON_BOARD1(*attack_point);
+  }
+}
+
+
+static void
+guess_eye_space(int pos, int effective_eyesize, int margins,
+               int bulk_score, struct eye_data eye[BOARDMAX],
+               struct eyevalue *value, int *pessimistic_min)
+{
+  if (effective_eyesize > 3) {
+    set_eyevalue(value, 2, 2, 2, 2);
+    *pessimistic_min = 1;
+
+    if ((margins == 0 && effective_eyesize > 7)
+       || (margins > 0 && effective_eyesize > 9)) {
+      int eyes = 2 + (effective_eyesize - 2 * (margins > 0) - 8) / 2;
+      int threshold = (4 * (eye[pos].esize - 2)
+                      + (effective_eyesize - 8) * (effective_eyesize - 9));
+
+      DEBUG(DEBUG_EYES, "size: %d(%d), threshold: %d, bulk score: %d\n",
+           eye[pos].esize, effective_eyesize, threshold, bulk_score);
+
+      if (bulk_score > threshold && effective_eyesize < 15)
+       eyes = gg_max(2, eyes - ((bulk_score - threshold) / eye[pos].esize));
+
+      if (bulk_score < threshold + eye[pos].esize || effective_eyesize >= 15)
+       *pessimistic_min = eyes;
+
+      set_eyevalue(value, eyes, eyes, eyes, eyes);
+    }
+  }
+  else if (effective_eyesize > 0) {
+    set_eyevalue(value, 1, 1, 1, 1);
+    if (margins > 0)
+      *pessimistic_min = 0;
+    else
+      *pessimistic_min = 1;
+  }
+  else {
+    if (eye[pos].esize - margins > 2)
+      set_eyevalue(value, 0, 0, 1, 1);
+    else
+      set_eyevalue(value, 0, 0, 0, 0);
+    *pessimistic_min = 0;
+  }
+}
+
+
+/* This function does some minor reading to improve the results of
+ * recognize_eye(). Currently, it has two duties. One is to read
+ * positions like this:
+ *
+ *     .XXXX|        with half eye         with proper eye
+ *     XXOOO|
+ *     XO.O.|           .   (1 eye)           .   (2 eyes)
+ *     XXOa.|         !..                    .*
+ *     -----+
+ *
+ * recognize_eye() sees the eyespace of the white dragon as shown
+ * (there's a half eye at a and it is considered the same as '!.' by
+ * the optics code). Normally, that eye shape gives only one secure
+ * eye, and owl thinks that the white dragon is dead unconditionally.
+ * This function tries to turn such ko-dependent half eyes into proper
+ * eyes and chooses the best alternative. Note that we don't have any
+ * attack/defense codes here, since owl will determine them itself.
+ *
+ * Another one is related to some cases when replacing half eyes with
+ * '!.' doesn't work. E.g. consider this eye (optics:328):
+ *
+ *     XXXOO         eye graph is 310:
+ *     X..X.
+ *     XOXX.             !.!  (second '!' is due to the halfeye)
+ *     OXO..
+ *     O.O..
+ *
+ * When this function detects such a half eye that can be attacked
+ * and/or defended inside its eyespace, it tries to turn it into a
+ * proper eye and see what happens. In case it gives an improvement
+ * for attacker and/or defender, the function keeps new result but
+ * only if new vital points are also vital points for the half eye.
+ * The heuristics used here might need improvements since they are
+ * based on a single game position.
+ *
+ * If add_moves != 0, this function may add move reasons for (color)
+ * at the vital points which are found by recognize_eye(). If add_moves 
+ * == 0, set color to be EMPTY.
+ */
+static int
+read_eye(int pos, int *attack_point, int *defense_point,
+        struct eyevalue *value, struct eye_data eye[BOARDMAX], 
+        struct half_eye_data heye[BOARDMAX], 
+        int add_moves)
+{
+  int eye_color;
+  int k;
+  int pos2;
+  int combination_halfeye = NO_MOVE;
+  int combination_attack = NO_MOVE;
+  int combination_defense = NO_MOVE;
+  int num_ko_halfeyes = 0;
+  int ko_halfeye = NO_MOVE;
+  struct vital_points vp;
+  struct vital_points ko_vp;
+  struct vital_points *best_vp = &vp;
+
+  eye_color = recognize_eye(pos, attack_point, defense_point, value,
+                           eye, heye, &vp);
+  if (!eye_color)
+    return 0;
+
+  /* Find ko half eyes and "combination" half eyes if any. */
+  for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+    if (ON_BOARD(pos2)
+       && eye[pos2].origin == pos
+       && heye[pos2].type == HALF_EYE) {
+      if (combination_halfeye == NO_MOVE) {
+       int apos = NO_MOVE;
+       int dpos = NO_MOVE;
+       for (k = 0; k < heye[pos2].num_attacks; k++) {
+         if (eye[heye[pos2].attack_point[k]].origin == pos) {
+           apos = heye[pos2].attack_point[k];
+           break;
+         }
+       }
+  
+       for (k = 0; k < heye[pos2].num_defenses; k++) {
+         if (eye[heye[pos2].defense_point[k]].origin == pos) {
+           dpos = heye[pos2].defense_point[k];
+           break;
+         }
+       }
+       if (apos || dpos) {
+         combination_halfeye = pos2;
+         combination_attack = apos;
+         combination_defense = dpos;
+       }
+      }
+      if (heye[pos2].value < 3.0) {
+       num_ko_halfeyes++;
+       ko_halfeye = pos2;
+      }
+    }
+  }
+
+  /* In case we have a "combination" half eye, turn it into a proper eye
+   * vertex for a while and see what happens.
+   */
+  if (combination_halfeye != NO_MOVE) {
+    int result;
+    int apos = NO_MOVE;
+    int dpos = NO_MOVE;
+    struct eyevalue combination_value;
+    struct vital_points combination_vp;
+
+    heye[combination_halfeye].type = 0;
+    result = recognize_eye(pos, &apos, &dpos, &combination_value, eye,
+                          heye, &combination_vp);
+    heye[combination_halfeye].type = HALF_EYE;
+
+    if (result) {
+      if (combination_attack
+         && min_eyes(value) > min_eyes(&combination_value)) {
+       /* FIXME: I'm not sure we can ever get here. */
+       for (k = 0; k < combination_vp.num_attacks; k++) {
+         if (combination_vp.attacks[k] == combination_attack) {
+           value->a = combination_value.a;
+           value->b = combination_value.b;
+           *attack_point = apos;
+           best_vp->num_attacks = 1;
+           best_vp->attacks[0] = combination_attack;
+           break;
+         }
+       }
+      }
+
+      if (combination_defense
+         && max_eyes(value) < max_eyes(&combination_value)) {
+       /* Turning the half eye into a proper eye gives an improvement.
+        * However, we can only accept this result if there is a vital
+        * point that defends both the half eye and the whole eyespace.
+        */
+       for (k = 0; k < combination_vp.num_defenses; k++) {
+         if (combination_vp.defenses[k] == combination_defense) {
+           value->c = combination_value.c;
+           value->d = combination_value.d;
+           *defense_point = dpos;
+           best_vp->num_defenses = 1;
+           best_vp->defenses[0] = combination_defense;
+           break;
+         }
+       }
+      }
+
+      if (min_eyes(value) != max_eyes(value)) {
+       ASSERT1(combination_attack || combination_defense, combination_halfeye);
+       if (*attack_point == NO_MOVE) {
+         *attack_point = combination_attack;
+         if (*attack_point == NO_MOVE)
+           *attack_point = combination_defense;
+       }
+
+       if (*defense_point == NO_MOVE) {
+         *defense_point = combination_defense;
+         if (*defense_point == NO_MOVE)
+           *defense_point = combination_defense;
+       }
+      }
+    }
+  }
+
+  /* The same with ko half eye (we cannot win two kos at once, therefore we
+   * give up if there is more than one ko half eye).
+   */
+  if (num_ko_halfeyes == 1) {
+    int result;
+    int apos = NO_MOVE;
+    int dpos = NO_MOVE;
+    struct eyevalue ko_value;
+
+    heye[ko_halfeye].type = 0;
+    result = recognize_eye(pos, &apos, &dpos, &ko_value, eye,
+                          heye, &ko_vp);
+    heye[ko_halfeye].type = HALF_EYE;
+
+    if (result && max_eyes(value) < max_eyes(&ko_value)) {
+      /* It is worthy to win the ko. */
+      *value = ko_value;
+      *attack_point = apos;
+      *defense_point = dpos;
+      best_vp = &ko_vp;
+    }
+  }
+
+  if (add_moves) {
+    struct vital_eye_points *vital;
+    if (eye_color == WHITE)
+      vital = white_vital_points;
+    else
+      vital = black_vital_points;
+    for (k = 0; k < best_vp->num_defenses && k < MAX_EYE_ATTACKS; k++)
+      vital[pos].defense_points[k] = best_vp->defenses[k];
+    for (k = 0; k < best_vp->num_attacks && k < MAX_EYE_ATTACKS; k++)
+      vital[pos].attack_points[k] = best_vp->attacks[k];
+  }
+
+  return 1;
+}
+
+
+/* recognize_eye(pos, *attack_point, *defense_point, *max, *min, eye_data,
+ * half_eye_data, color, vp), where pos is the origin of an eyespace, returns
+ * owner of eye (his color) if there is a pattern in eyes.db matching the
+ * eyespace, or 0 if no match is found. If there is a key point for attack,
+ * (*attack_point) is set to its location, or NO_MOVE if there is none.
+ * Similarly (*defense_point) is the location of a vital defense point.
+ * *value is set according to the pattern found. Vital attack/defense points
+ * exist if and only if min_eyes(value) != max_eyes(value).
+ */
+
+static int
+recognize_eye(int pos, int *attack_point, int *defense_point,
+             struct eyevalue *value,
+             struct eye_data eye[BOARDMAX], 
+             struct half_eye_data heye[BOARDMAX], 
+             struct vital_points *vp)
+{
+  int pos2;
+  int eye_color;
+  int eye_size = 0;
+  int num_marginals = 0;
+  int vpos[MAXEYE];
+  signed char marginal[MAXEYE], edge[MAXEYE], neighbors[MAXEYE];
+  int graph;
+  int map[MAXEYE];
+  int best_score;
+  int r;
+
+  gg_assert(attack_point != NULL);
+  gg_assert(defense_point != NULL);
+    
+  /* Set `eye_color' to the owner of the eye. */
+  eye_color = eye[pos].color;
+
+  if (eye[pos].esize-eye[pos].msize > 8)
+    return 0;
+
+  if (eye[pos].msize > MAXEYE)
+    return 0;
+
+  /* Create list of eye vertices */
+  for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+    if (!ON_BOARD(pos2))
+      continue;
+    if (eye[pos2].origin == pos) {
+      vpos[eye_size] = pos2;
+      marginal[eye_size] = eye[pos2].marginal;
+      if (marginal[eye_size])
+       num_marginals++;
+      neighbors[eye_size] = eye[pos2].neighbors;
+      if (0) {
+       if (marginal[eye_size])
+         TRACE("(%1m)", vpos[eye_size]);
+       else
+         TRACE(" %1m ", vpos[eye_size]);
+       TRACE("\n");
+      }
+      
+      if (is_corner_vertex(pos2))
+       edge[eye_size] = 2;
+      else if (is_edge_vertex(pos2))
+       edge[eye_size] = 1;
+      else 
+       edge[eye_size] = 0;
+      
+      if (is_halfeye(heye, pos2)) {
+       neighbors[eye_size]++;      /* Increase neighbors of half eye. */
+       eye_size++;
+       /* Use a virtual marginal vertex for mapping purposes. We set it
+        * to be at NO_MOVE so it won't accidentally count as a
+        * neighbor for another vertex. Note that the half eye precedes
+        * the virtual marginal vertex in the list.
+        */
+       vpos[eye_size] = NO_MOVE;
+       marginal[eye_size] = 1;
+       num_marginals++;
+       edge[eye_size] = 0;
+       neighbors[eye_size] = 1;
+      }
+      
+      eye_size++;
+    }
+  }
+  
+  /* We attempt to construct a map from the graph to the eyespace
+   * preserving the adjacency structure. If this can be done, we've
+   * identified the eyeshape.
+   */
+
+  for (graph = 0; graphs[graph].vertex != NULL; graph++) {
+    int q;
+
+    if (graphs[graph].esize != eye_size
+       || graphs[graph].msize != num_marginals)
+      continue;
+
+    reset_map(eye_size);
+    q = 0;
+    first_map(&map[0]);
+
+    while (1) {
+      struct eye_vertex *gv = &graphs[graph].vertex[q];
+      int mv = map[q];
+      int ok = 1;
+
+      if (0)
+       TRACE("q=%d: %d %d %d %d %d %d\n", 
+             q, map[0], map[1], map[2], map[3], map[4], map[5]);
+
+      if (neighbors[mv] != gv->neighbors
+         || marginal[mv] != gv->marginal
+         || edge[mv] < gv->edge)
+       ok = 0;
+
+      if (ok) {
+        if (IS_STONE(board[vpos[mv]])) {
+         if (!(gv->flags & CAN_CONTAIN_STONE))
+           ok = 0;
+       }
+       /* Virtual half eye marginals also fall here since they are off
+        * board.
+        */
+       else if (!(gv->flags & CAN_BE_EMPTY))
+         ok = 0;
+      }
+
+      if (ok) {
+       int k;
+
+       for (k = 0; k < gv->neighbors; k++) {
+         if (gv->n[k] < q) {
+           int mn = map[gv->n[k]];
+
+           /* Two eye vertices are neighbours if they are adjacent on the
+            * board or one of them is a half eye and the other is its
+            * virtual marginal vertex (and follows it in vpos[] array).
+            */
+           if (vpos[mv] != SOUTH(vpos[mn])
+               && vpos[mv] != WEST(vpos[mn])
+               && vpos[mv] != NORTH(vpos[mn])
+               && vpos[mv] != EAST(vpos[mn])
+               && (mv != mn - 1
+                   || vpos[mv] == NO_MOVE
+                   || heye[vpos[mv]].type != HALF_EYE)
+               && (mn != mv - 1
+                   || vpos[mn] == NO_MOVE
+                   || heye[vpos[mn]].type != HALF_EYE)) {
+             ok = 0;
+             break;
+           }
+         }
+       }
+      }
+
+      if (!ok) {
+       if (!next_map(&q, map))
+         break;
+
+       if (0)
+         gprintf("  q=%d, esize=%d: %d %d %d %d %d\n",
+                 q, eye_size, 
+                 map[0], map[1], map[2], map[3], map[4]);
+      }
+      else {
+       q++;
+       if (q == eye_size)
+         break;                        /* A match! */
+       
+       first_map(&map[q]);
+      }
+    }
+
+    if (q == eye_size) {
+      /* We have found a match! Now sort out the vital moves. */
+      *value = graphs[graph].value;
+      vp->num_attacks = 0;
+      vp->num_defenses = 0;
+      
+      if (eye_move_urgency(value) > 0) {
+       /* Collect all attack and defense points in the pattern. */
+       int k;
+
+       for (k = 0; k < eye_size; k++) {
+         struct eye_vertex *ev = &graphs[graph].vertex[k];
+
+         if (ev->flags & EYE_ATTACK_POINT) {
+           /* Check for a marginal vertex matching a half eye virtual
+            * marginal. This is the case if a half eye preceeds the
+            * current vertex in the list.
+            */
+           if (ev->marginal
+               && map[k] > 0
+               && vpos[map[k] - 1] != NO_MOVE
+               && is_halfeye(heye, vpos[map[k] - 1])) {
+             /* Add all diagonals as vital. */
+             int ix;
+             struct half_eye_data *he = &heye[vpos[map[k] - 1]];
+             
+             for (ix = 0; ix < he->num_attacks; ix++)
+               vp->attacks[vp->num_attacks++] = he->attack_point[ix];
+           }
+           else
+             vp->attacks[vp->num_attacks++] = vpos[map[k]];
+         }
+         
+         if (ev->flags & EYE_DEFENSE_POINT) {
+           /* Check for a half eye virtual marginal vertex. */
+           if (ev->marginal
+               && map[k] > 0
+               && vpos[map[k] - 1] != NO_MOVE
+               && is_halfeye(heye, vpos[map[k] - 1])) {
+             /* Add all diagonals as vital. */
+             int ix;
+             struct half_eye_data *he = &heye[vpos[map[k] - 1]];
+             
+             for (ix = 0; ix < he->num_defenses; ix++)
+               vp->defenses[vp->num_defenses++] = he->defense_point[ix];
+           }
+           else
+             vp->defenses[vp->num_defenses++] = vpos[map[k]];
+         }
+       }
+       
+       gg_assert(vp->num_attacks > 0 && vp->num_defenses > 0);
+
+       /* We now have all vital attack and defense points listed but
+         * we are also expected to single out of one of each to return
+         * in *attack_point and *defense_point. Since sometimes those
+         * are the only vital points considered, we want to choose the
+         * best ones, in the sense that they minimize the risk for
+         * error in the eye space analysis.
+        *
+        * One example is this position
+        *
+        * |..XXXX
+        * |XXX..X
+        * |..!O.X
+        * |OO.O.X
+        * |.O.!XX
+        * +------
+        *
+        * where O has an eyespace of the !..! type. The graph
+        * matching finds that both marginal vertices are vital points
+        * but here the one at 3-3 fails to defend. (For attack both
+        * points work but the 3-3 one is still worse since it leaves
+        * a ko threat.)
+        *
+        * In order to differentiate between the marginal points we
+        * count the number of straight and diagonal neighbors within
+        * the eye space. In the example above both have one straight
+        * neighbor each but the edge margin wins because it also has
+        * a diagonal margin.
+        */
+
+       best_score = -10;
+       for (k = 0; k < vp->num_attacks; k++) {
+         int apos = vp->attacks[k];
+         int score = 0;
+         for (r = 0; r < 8; r++)
+           if (ON_BOARD(apos + delta[r])
+               && eye[apos + delta[r]].color == eye[pos].color
+               && !eye[apos + delta[r]].marginal) {
+             score++;
+             if (r < 4) {
+               score++;
+               if (board[apos + delta[r]] != EMPTY)
+                 score++;
+             }
+           }
+
+         /* If a vital point is not adjacent to any point in the eye
+           * space, it must be a move to capture or defend a string
+           * related to a halfeye, e.g. the move * in this position,
+          *
+          * ......|
+          * .XXXX.|
+          * .X.O..|
+          * .XO.OO|
+          * .*XO..|
+          * ------+
+          *
+          * Playing this is probably a good idea.
+          */
+         if (score == 0)
+           score += 2;
+         
+         if (0)
+           gprintf("attack point %1m score %d\n", apos, score);
+         
+         if (score > best_score) {
+           *attack_point = apos;
+           best_score = score;
+         }
+       }
+
+       best_score = -10;
+       for (k = 0; k < vp->num_defenses; k++) {
+         int dpos = vp->defenses[k];
+         int score = 0;
+         for (r = 0; r < 8; r++)
+           if (ON_BOARD(dpos + delta[r])
+               && eye[dpos + delta[r]].color == eye[pos].color
+               && !eye[dpos + delta[r]].marginal) {
+             score++;
+             if (r < 4) {
+               score++;
+               if (board[dpos + delta[r]] != EMPTY)
+                 score++;
+             }
+           }
+
+         /* If possible, choose a non-sacrificial defense point.
+          * Compare white T8 and T6 in lazarus:21.
+          */
+         if (safe_move(dpos, eye_color) != WIN)
+           score -= 5;
+
+         /* See comment to the same code for attack points. */
+         if (score == 0)
+           score += 2;
+
+         if (0)
+           gprintf("defense point %1m score %d\n", dpos, score);
+         
+         if (score > best_score) {
+           *defense_point = dpos;
+           best_score = score;
+         }
+       }
+       
+       DEBUG(DEBUG_EYES, "  vital points: %1m (attack) %1m (defense)\n",
+             *attack_point, *defense_point);
+       DEBUG(DEBUG_EYES, "  pattern matched:  %d\n", graphs[graph].patnum);
+       
+      }
+      TRACE("eye space at %1m of type %d\n", pos, graphs[graph].patnum);
+      
+      return eye_color;
+    }
+  }
+
+  return 0;
+}
+
+
+/* a MAP is a map of the integers 0,1,2, ... ,q into 
+ * 0,1, ... , esize-1 where q < esize. This determines a 
+ * bijection of the first q+1 elements of the graph into the 
+ * eyespace. The following three functions work with maps.
+ */
+
+/* Reset internal data structure used by first_map() and
+ * next_map() functions.
+ */
+static void
+reset_map(int size)
+{
+  map_size = size;
+  memset(used_index, 0, size * sizeof(used_index[0]));
+}
+
+
+/* The function first_map finds the smallest valid
+ * value of a map element.
+ */
+static void
+first_map(int *map_value)
+{
+  int k = 0;
+
+  while (used_index[k])
+    k++;
+
+  used_index[k] = 1;
+  *map_value = k;
+}     
+
+
+/* The function next_map produces the next map in lexicographical
+ * order. If no next map can be found, q is decremented, then we
+ * try again. If the entire map is lexicographically last, the
+ * function returns false.
+ */
+static int
+next_map(int *q, int map[MAXEYE])
+{
+  int k;
+
+  do {
+    used_index[map[*q]] = 0;
+    for (k = map[*q]; ++k < map_size;) {
+      if (!used_index[k]) {
+       used_index[k] = 1;
+       map[*q] = k;
+       return 1;
+      }
+    }
+
+    (*q)--;
+  } while (*q >= 0);
+  
+  return 0;
+}     
+
+
+/* add_false_eye() turns a proper eyespace into a margin. */
+
+static void
+add_false_eye(int pos, struct eye_data eye[BOARDMAX],
+             struct half_eye_data heye[BOARDMAX])
+{
+  int k;
+  ASSERT1(heye[pos].type == FALSE_EYE, pos);
+  DEBUG(DEBUG_EYES, "false eye found at %1m\n", pos);
+
+  if (eye[pos].color == GRAY || eye[pos].marginal != 0)
+    return;
+  
+  eye[pos].marginal = 1;
+  eye[eye[pos].origin].msize++;
+  for (k = 0; k < 4; k++)
+    if (ON_BOARD(pos + delta[k])
+       && eye[pos + delta[k]].origin == eye[pos].origin)
+      eye[pos + delta[k]].marginal_neighbors++;
+  propagate_eye(eye[pos].origin, eye);
+}
+
+
+/* These functions are used from constraints to identify eye spaces,
+ * primarily for late endgame moves.
+ */
+int
+is_eye_space(int pos)
+{
+  return (white_eye[pos].color == WHITE
+         || black_eye[pos].color == BLACK);
+}
+
+int
+is_proper_eye_space(int pos)
+{
+  return ((white_eye[pos].color == WHITE && !white_eye[pos].marginal)
+         || (black_eye[pos].color == BLACK && !black_eye[pos].marginal));
+}
+
+/* Return the maximum number of eyes that can be obtained from the
+ * eyespace at (i, j). This is most useful in order to determine
+ * whether the eyespace can be assumed to produce any territory at
+ * all.
+ */
+int
+max_eye_value(int pos)
+{
+  int max_white = 0;
+  int max_black = 0;
+  
+  if (white_eye[pos].color == WHITE)
+    max_white = max_eyes(&white_eye[pos].value);
+
+  if (black_eye[pos].color == BLACK)
+    max_black = max_eyes(&black_eye[pos].value);
+
+  return gg_max(max_white, max_black);
+}
+
+int
+is_marginal_eye_space(int pos)
+{
+  return (white_eye[pos].marginal || black_eye[pos].marginal);
+}
+
+int
+is_halfeye(struct half_eye_data heye[BOARDMAX], int pos)
+{
+  return heye[pos].type == HALF_EYE;
+}
+
+int
+is_false_eye(struct half_eye_data heye[BOARDMAX], int pos)
+{
+  return heye[pos].type == FALSE_EYE;
+}
+
+
+/* Find topological half eyes and false eyes by analyzing the
+ * diagonal intersections, as described in the Texinfo
+ * documentation (Eyes/Eye Topology).
+ */
+void
+find_half_and_false_eyes(int color, struct eye_data eye[BOARDMAX],
+                        struct half_eye_data heye[BOARDMAX],
+                        int find_mask[BOARDMAX])
+{
+  int eye_color = color;
+  int pos;
+  float sum;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    /* skip eyespaces which owl doesn't want to be searched */
+    if (!ON_BOARD(pos) || (find_mask && find_mask[eye[pos].origin] <= 1))
+      continue;
+    
+    /* skip every vertex which can't be a false or half eye */
+    if (eye[pos].color != eye_color
+        || eye[pos].marginal
+        || eye[pos].neighbors > 1)
+      continue;
+    
+    sum = topological_eye(pos, color, eye, heye);
+    if (sum >= 4.0) {
+      /* false eye */
+      heye[pos].type = FALSE_EYE;
+      if (eye[pos].esize == 1
+          || is_legal(pos, OTHER_COLOR(color))
+          || board[pos] == OTHER_COLOR(color))
+        add_false_eye(pos, eye, heye);
+    }
+    else if (sum > 2.0) {
+      /* half eye */
+      heye[pos].type = HALF_EYE;
+      ASSERT1(heye[pos].num_attacks > 0, pos);
+      ASSERT_ON_BOARD1(heye[pos].attack_point[0]);
+      ASSERT1(heye[pos].num_defenses > 0, pos);
+      ASSERT_ON_BOARD1(heye[pos].defense_point[0]);
+    }
+  }
+}
+
+
+/* See Texinfo documentation (Eyes:Eye Topology). Returns:
+ * - 2 or less if (pos) is a proper eye for (color);
+ * - between 2 and 3 if the eye can be made false only by ko
+ * - 3 if (pos) is a half eye;
+ * - between 3 and 4 if the eye can be made real only by ko
+ * - 4 or more if (pos) is a false eye.
+ *
+ * Attack and defense points for control of the diagonals are stored
+ * in the heye[] array.
+ *
+ * my_eye is the eye space information with respect to (color).
+ */
+
+static float
+topological_eye(int pos, int color,
+               struct eye_data my_eye[BOARDMAX],
+               struct half_eye_data heye[BOARDMAX])
+{
+  float sum = 0.0;
+  float val;
+  int num_attacks = 0;
+  int num_defenses = 0;
+  int attack_values[4];
+  int defense_values[4];
+  int k;
+  int r;
+  int attack_point;
+  int defense_point;
+  int attack_value;
+  int defense_value;
+
+  memset(attack_values, 0, sizeof(attack_values));
+  memset(defense_values, 0, sizeof(defense_values));
+  
+  /* Loop over the diagonal directions. */
+  for (k = 4; k < 8; k++) {
+    int diag = pos + delta[k];
+    val = evaluate_diagonal_intersection(I(pos) + deltai[k],
+                                        J(pos) + deltaj[k], color,
+                                        &attack_point, &defense_point, 
+                                        my_eye);
+
+    /*
+     * Eyespaces with cutting points are problematic. In this position
+     * 
+     * .....XXXXX
+     * XXXXX.OO.X
+     * X.OOOO.O.X
+     * X.O.XXXO.X
+     * ----------
+     * 
+     * the eyespace will be .XXX. which evaluates to two eyes (seki)
+     * unless countermeasures are taken.
+     *
+     * This can be worked around in the topological analysis by
+     * sometimes setting the diagonal value to 2.0 for vertices inside
+     * the eyespace which are occupied by opponent stones. More
+     * precisely all of the following conditions must hold:
+     *
+     * a) The value is not already 2.0.
+     * a) The (potential) eyepoint is empty.
+     * b) The diagonal is occupied by an opponent string,
+     * c) which is also adjacent to the (potential) eye and 
+     * d) at least three stones long.
+     * e) The (potential) eye is not on the edge (to steer clear of all the
+     *    hairy cases that are handled by eyes.db anyway).
+     * f) At least two own strings are adjacent to the (potential) eye.
+     * g) At least one of the own strings adjacent to the (potential) eye has
+     *    only one liberty which is an eye space and not decided false, yet.
+     *
+     * With this revision the eyespace above becomes .XXXh or
+     * equivalently .XXX.! which is almost evaluated correctly, eye
+     * value 0122 instead of the correct 1122. Compared to the
+     * previous value 2222 it's a major improvement.
+     *
+     * FIXME: This approach has a number of shortcomings.
+     *
+     *        1. d) is kind of arbitrary and there may be exceptional
+     *           cases.
+     *
+     *        2. This diagonal value modification should not apply to
+     *           two diagonals of the same strings inside the eyespace.
+     *           E.g. if we have a partial eyespace looking like
+     *
+     *           .OOO.
+     *           OO.OO
+     *           OXXXO
+     *
+     *           it doesn't make sense to mark the middle vertex as a
+     *           false eye. Possibly this doesn't make any difference
+     *           in practice but it's at the very least confusing.
+     *
+     *        3. Actually it doesn't make sense to mark vertices as
+     *           false otherwise either due to these revisions (half
+     *           eyes make good sense though) as can be seen if a
+     *           stone is added to the initial diagram,
+     * 
+     *           .....XXXXX
+     *           XXXXXXOO.X
+     *           X.OOOO.O.X
+     *           X.O.XXXO.X
+     *           ----------
+     *
+     *           Now the eyespace instead becomes .XXX! which has the
+     *           eye value 0011 but if X tries to attack the eye O
+     *           suddenly gets two solid eyes!
+     *
+     *           The correct analysis would be to remove the vertex
+     *           from the eyespace rather than turning it into a false
+     *           eye. Then we would have the eyespace .XXX which is
+     *           correctly evaluated to one eye (eye value 1112).
+     *
+     *           The problem with this is that removing eye points is
+     *           messy. It can surely be done but currently there is
+     *           no support in the code for doing that. It has existed
+     *           at an earlier time but was removed because the
+     *           implementation was not robust enough and there was no
+     *           longer any apparent need for it. To correct this
+     *           problem is sufficient reason to reimplement that
+     *           functionality.
+     *
+     *        4. The test of condition g) has a result which
+     *           potentially depends on the ordering of the eyespaces
+     *           and thus presumably on the orientation of the board.
+     *           It might make more sense to examine whether the
+     *           string neighbors more than one empty vertex in the
+     *           same eyespace.
+     */
+    if (val < 2.0 && board[pos] == EMPTY && board[diag] == OTHER_COLOR(color)
+       && !is_edge_vertex(pos) && neighbor_of_string(pos, diag)
+       && countstones(diag) >= 3) {
+      int strings[3];
+      int string_count;
+      int s;
+      string_count = 0;
+      for (r = 0; r < 4; r++) {
+       int str;
+       str = pos + delta[r];
+
+       if (board[str] != color)
+         continue;
+
+       ASSERT1(string_count < 3, pos);
+       for (s = 0; s < string_count; s++)
+         if (same_string(str, strings[s]))
+           break;
+       if (s != string_count)
+         continue;
+
+       strings[string_count++] = str;
+      }
+      if (string_count > 1) {
+       for (s = 0; s < string_count; s++) {
+         int libs[MAX_LIBERTIES];
+         int adj_eye_count;
+         int lib_count;
+         adj_eye_count = 0;
+         lib_count = findlib(strings[s], MAX_LIBERTIES, libs);
+         if (lib_count > MAX_LIBERTIES)
+           continue;
+
+         for (r = 0; r < lib_count && adj_eye_count < 2; r++)
+           if (my_eye[libs[r]].color == OTHER_COLOR(color)
+               && !my_eye[libs[r]].marginal)
+             adj_eye_count++;
+         if (adj_eye_count < 2) {
+           val = 2.0;
+           break;
+         }
+       }
+      }
+    }
+
+    sum += val;
+
+    if (val > 0.0 && val < 2.0) {
+      /* Diagonals off the edge has value 1.0 but no attack or defense
+       * point.
+       */
+      if (attack_point != NO_MOVE && defense_point != NO_MOVE) {
+       ASSERT_ON_BOARD1(attack_point);
+       ASSERT_ON_BOARD1(defense_point);
+       /* Store these in sorted (descending) order. We remap val
+         * differently for attack and defense points according to:
+        *
+        * val    attack_value     defense_value
+        * ---    ------------     -------------
+        * 1.0    3                3
+        * <1.0   2                1
+        * >1.0   1                2
+        *
+        * This means that we primarily want to take control of
+        * diagonals without ko and secondarily of diagonals we can
+        * take unconditionally but not the opponent.
+        */
+       if (val == 1.0) {
+         attack_value = 3;
+         defense_value = 3;
+       }
+       else if (val < 1.0) {
+         attack_value = 2;
+         defense_value = 1;
+       }
+       else {
+         attack_value = 1;
+         defense_value = 2;
+       }
+
+       for (r = 0; r < 4; r++) {
+         if (attack_values[r] < attack_value) {
+           int tmp_value = attack_values[r];
+           int tmp_point;
+           if (tmp_value)
+             tmp_point = heye[pos].attack_point[r];
+           else
+             tmp_point = 0;
+           attack_values[r] = attack_value;
+           heye[pos].attack_point[r] = attack_point;
+           attack_value = tmp_value;
+           attack_point = tmp_point;
+         }
+         
+         if (defense_values[r] < defense_value) {
+           int tmp_value = defense_values[r];
+           int tmp_point;
+           if (tmp_value)
+             tmp_point = heye[pos].defense_point[r];
+           else
+             tmp_point = 0;
+           defense_values[r] = defense_value;
+           heye[pos].defense_point[r] = defense_point;
+           defense_value = tmp_value;
+           defense_point = tmp_point;
+         }
+       }
+       
+       num_attacks++;
+       num_defenses++;
+      }
+    }
+  }
+
+  /* Remove attacks and defenses with smaller value than the best
+   * ones. (These might be useful to save as well, but not unless we
+   * also store the attack/defense values in the half_eye_data.)
+   */
+  for (r = 0; r < num_attacks; r++) {
+    if (attack_values[r] < attack_values[0]) {
+      num_attacks = r;
+      break;
+    }
+  }
+  
+  for (r = 0; r < num_defenses; r++) {
+    if (defense_values[r] < defense_values[0]) {
+      num_defenses = r;
+      break;
+    }
+  }
+
+  heye[pos].num_attacks = num_attacks;
+  heye[pos].num_defenses = num_defenses;
+  heye[pos].value = sum;
+
+  return sum;
+}
+
+
+
+/* Evaluate an intersection (m, n) which is diagonal to an eye space,
+ * as described in the Texinfo documentation (Eyes/Eye Topology).
+ *
+ * Returns:
+ *
+ * 0 if both coordinates are off the board
+ * 1 if one coordinate is off the board
+ *
+ * 0    if (color) has control over the vertex
+ * a    if (color) can take control over the vertex unconditionally and
+ *      the opponent can take control by winning a ko.
+ * 1    if both (color) and the opponent can take control of the vertex
+ *      unconditionally
+ * b    if (color) can take control over the vertex by winning a ko and
+ *      the opponent can take control unconditionally.
+ * 2    if the opponent has control over the vertex
+ *
+ * The values a and b are discussed in the documentation. We are
+ * currently using a = 0.75 and b = 1.25.
+ *
+ * Notice that it's necessary to pass the coordinates separately
+ * instead of as a 1D coordinate. The reason is that the 1D mapping
+ * can't uniquely identify "off the corner" points.
+ *
+ * my_eye has to be the eye_data with respect to color.
+ */
+static float
+evaluate_diagonal_intersection(int m, int n, int color,
+                              int *attack_point, int *defense_point,
+                              struct eye_data my_eye[BOARDMAX])
+{
+  float value = 0;
+  int other = OTHER_COLOR(color);
+  int pos = POS(m, n);
+  int acode = 0;
+  int apos = NO_MOVE;
+  int dcode = 0;
+  int dpos = NO_MOVE;
+  int off_edge = 0;
+  const float a = 0.75;
+  const float b = 2 - a;
+
+  *attack_point = NO_MOVE;
+  *defense_point = NO_MOVE;
+  
+  /* Check whether intersection is off the board. We must do this for
+   * each board coordinate separately because points "off the corner"
+   * are special cases.
+   */
+  if (m < 0 || m >= board_size)
+    off_edge++;
+
+  if (n < 0 || n >= board_size)
+    off_edge++;
+
+  /* Must return 0 if both coordinates out of bounds. */
+  if (off_edge > 0)
+    return (float) (off_edge % 2);
+
+  /* Discard points within own eyespace, unless marginal or ko point.
+   *
+   * Comment: For some time discardment of points within own eyespace
+   * was contingent on this being the same eyespace as that of the
+   * examined vertex. This caused problems, e.g. in this position,
+   *
+   * |........
+   * |XXXXX...
+   * |OOOOX...
+   * |aO.OX...
+   * |OXXOX...
+   * |.XXOX...
+   * +--------
+   *
+   * where the empty vertex at a was evaluated as a false eye and the
+   * whole group as dead (instead of living in seki).
+   *
+   * The reason for the requirement of less than two marginal
+   * neighbors is this position:
+   *
+   * |.XXXX...
+   * |.OOOX...
+   * |O..OX...
+   * |aOO.X...
+   * |O..XX...
+   * |..O.X...
+   * |.X..X...
+   * |..XXX...
+   *
+   * where the empty vertex at a should not count as a solid eye.
+   * (The eyespace diagonally below a looks like this:
+   *   .!
+   *   !
+   * so we can clearly see why having two marginal vertices makes a
+   * difference.)
+   */
+   if (my_eye[pos].color == color
+       && !my_eye[pos].marginal
+       && my_eye[pos].marginal_neighbors < 2
+       && !(board[pos] == EMPTY && does_capture_something(pos, other)))
+    return 0.0;
+
+  if (board[pos] == EMPTY) {
+    int your_safety = safe_move(pos, other);
+
+    apos = pos;
+    dpos = pos;
+
+    /* We should normally have a safe move, but occasionally it may
+     * happen that it's not safe. There are complications, however,
+     * with a position like this:
+     *
+     * .XXXX|
+     * XXOO.|
+     * XO.O.|
+     * XXO.O|
+     * -----+
+     *
+     * Therefore we ignore our own safety if opponent's safety depends
+     * on ko.
+     */
+    if (your_safety == 0)
+      value = 0.0;
+    else if (your_safety != WIN)
+      value = a;
+    else {                           /* So your_safety == WIN. */
+      int our_safety = safe_move(pos, color);
+      
+      if (our_safety == 0) {
+       int k;
+
+       value = 2.0;
+
+       /* This check is intended to fix a certain special case, but might
+        * be helpful in other situations as well. Consider this position,
+        * happened in owl reading deep enough:
+        *
+        * |XXXXX
+        * |XOOXX
+        * |O.OOX
+        * |.OXX.
+        * +-----
+        *
+        * Without this check, the corner eye is considered false, not half-
+        * eye. Thus, owl thinks that the capture gains at most one eye and
+        * gives up.
+        */
+       for (k = 4; k < 8; k++) {
+         int diagonal = pos + delta[k];
+         int lib;
+
+         if (board[diagonal] == other && findlib(diagonal, 1, &lib) == 1) {
+           if (lib != pos && does_secure(color, lib, pos)) {
+             value = 1.0;
+             apos = lib;
+             break;
+           }
+         }
+       }
+      }
+      else if (our_safety == WIN)
+        value = 1.0;
+      else                           /* our_safety depends on ko. */
+        value = b;
+    }
+  }
+  else if (board[pos] == color) {
+    /* This stone had better be safe, otherwise we wouldn't have an
+     * eyespace in the first place.
+     */
+    value = 0.0;
+  }
+  else if (board[pos] == other) {
+    if (stackp == 0) {
+      acode = worm[pos].attack_codes[0];
+      apos  = worm[pos].attack_points[0];
+      dcode = worm[pos].defense_codes[0];
+      dpos  = worm[pos].defense_points[0];
+    }
+    else
+      attack_and_defend(pos, &acode, &apos, &dcode, &dpos);
+
+    /* Must test acode first since dcode only is reliable if acode is
+     * non-zero.
+     */
+    if (acode == 0)
+      value = 2.0;
+    else if (dcode == 0)
+      value = 0.0;
+    else if (acode == WIN && dcode == WIN)
+      value = 1.0;
+    else if (acode == WIN && dcode != WIN)
+      value = a;
+    else if (acode != WIN && dcode == WIN)
+      value = b;
+    else if (acode != WIN && dcode != WIN)
+      value = 1.0; /* Both contingent on ko. Probably can't happen. */
+  }
+  
+  if (value > 0.0 && value < 2.0) {
+    /* FIXME:
+     * Usually there are several attack and defense moves that would
+     * be equally valid. It's not good that we make an arbitrary
+     * choice at this point.
+     */
+    ASSERT_ON_BOARD1(apos);
+    ASSERT_ON_BOARD1(dpos);
+    /* Notice:
+     * The point to ATTACK the half eye is the point which DEFENDS
+     * the stones on the diagonal intersection and vice versa. Thus
+     * we must switch attack and defense points here.
+     * If the vertex is empty, dpos == apos and it doesn't matter
+     * whether we switch.
+     */
+    *attack_point = dpos;
+    *defense_point = apos;
+  }
+
+  return value;
+}
+
+
+/* Conservative relative of topological_eye(). Essentially the same
+ * algorithm is used, but only tactically safe opponent strings on
+ * diagonals are considered. This may underestimate the false/half eye
+ * status, but it should never be overestimated.
+ */
+int
+obvious_false_eye(int pos, int color)
+{
+  int i = I(pos);
+  int j = J(pos);
+  int k;
+  int diagonal_sum = 0;
+  for (k = 4; k < 8; k++) {
+    int di = deltai[k];
+    int dj = deltaj[k];
+    
+    if (!ON_BOARD2(i+di, j) && !ON_BOARD2(i, j+dj))
+      diagonal_sum--;
+    
+    if (!ON_BOARD2(i+di, j+dj))
+      diagonal_sum++;
+    else if (BOARD(i+di, j+dj) == OTHER_COLOR(color)
+            && !attack(POS(i+di, j+dj), NULL))
+      diagonal_sum += 2;
+  }
+  
+  return diagonal_sum >= 4;
+}
+
+
+/* Set the parameters into struct eyevalue as follows:
+a = number of eyes if attacker plays first twice
+b = number of eyes if attacker plays first
+c = number of eyes if defender plays first
+d =number of eyes if defender plays first twice
+*/
+
+void
+set_eyevalue(struct eyevalue *e, int a, int b, int c, int d)
+{
+  e->a = a;
+  e->b = b;
+  e->c = c;
+  e->d = d;
+}
+
+/* Number of eyes if attacker plays first twice (the threat of the first
+ * move by attacker).
+ */
+int
+min_eye_threat(struct eyevalue *e)
+{
+  return e->a;
+}
+
+/* Number of eyes if attacker plays first followed by alternating play. */
+int
+min_eyes(struct eyevalue *e)
+{
+  return e->b;
+}
+
+/* Number of eyes if defender plays first followed by alternating play. */
+int
+max_eyes(struct eyevalue *e)
+{
+  return e->c;
+}
+
+/* Number of eyes if defender plays first twice (the threat of the first
+ * move by defender).
+ */
+int
+max_eye_threat(struct eyevalue *e)
+{
+  return e->d;
+}
+
+/* Add the eyevalues *e1 and *e2, leaving the result in *sum. It is
+ * safe to let sum be the same as e1 or e2.
+ */
+void
+add_eyevalues(struct eyevalue *e1, struct eyevalue *e2, struct eyevalue *sum)
+{
+  struct eyevalue res;
+  res.a = gg_min(gg_min(e1->a + e2->c, e1->c + e2->a),
+                gg_max(e1->a + e2->b, e1->b + e2->a));
+  res.b = gg_min(gg_max(e1->b + e2->b, gg_min(e1->a + e2->d, e1->b + e2->c)),
+                gg_max(e1->b + e2->b, gg_min(e1->d + e2->a, e1->c + e2->b)));
+  res.c = gg_max(gg_min(e1->c + e2->c, gg_max(e1->d + e2->a, e1->c + e2->b)),
+                gg_min(e1->c + e2->c, gg_max(e1->a + e2->d, e1->b + e2->c)));
+  res.d = gg_max(gg_max(e1->d + e2->b, e1->b + e2->d),
+                gg_min(e1->d + e2->c, e1->c + e2->d));
+
+  /* The rules above give 0011 + 0002 = 0012, which is incorrect. Thus
+   * we need this annoying exception.
+   */
+  if ((e1->d - e1->c == 2 && e2->c - e2->b == 1)
+      || (e1->c - e1->b == 1 && e2->d - e2->c == 2)) {
+    res.d = gg_max(gg_min(e1->c + e2->d, e1->d + e2->b),
+                  gg_min(e1->d + e2->c, e1->b + e2->d));
+  }
+
+  /* The temporary storage in res is necessary if sum is the same as
+   * e1 or e2.
+   */
+  sum->a = res.a;
+  sum->b = res.b;
+  sum->c = res.c;
+  sum->d = res.d;
+}
+
+/* The impact on the number of eyes (counting up to two) if a vital
+ * move is made. The possible values are
+ * 0 - settled eye, no vital move
+ * 2 - 1/2 eye or 3/2 eyes
+ * 3 - 3/4 eyes or 5/4 eyes
+ * 4 - 1* eyes (a chimera)
+ */
+int
+eye_move_urgency(struct eyevalue *e)
+{
+  int a = gg_min(e->a, 2);
+  int b = gg_min(e->b, 2);
+  int c = gg_min(e->c, 2);
+  int d = gg_min(e->d, 2);
+  if (b == c)
+    return 0;
+  else
+    return d + c - b - a;
+}
+
+/* Produces a string representing the eyevalue.
+ * 
+ * Note: the result string is stored in a statically allocated buffer
+ * which will be overwritten the next time this function is called.
+ */
+char *
+eyevalue_to_string(struct eyevalue *e)
+{
+  static char result[30];
+  if (e->a < 10 && e->b < 10 && e->c < 10 && e->d < 10)
+    gg_snprintf(result, 29, "%d%d%d%d", e->a, e->b, e->c, e->d);
+  else
+    gg_snprintf(result, 29, "[%d,%d,%d,%d]", e->a, e->b, e->c, e->d);
+  return result;
+}
+
+
+
+/* Test whether the optics code evaluates an eyeshape consistently. */
+void
+test_eyeshape(int eyesize, int *eye_vertices)
+{
+  int k;
+  int n, N;
+  int mx[BOARDMAX];
+  int pos;
+  int str = NO_MOVE;
+  int attack_code;
+  int attack_point;
+  int defense_code;
+  int defense_point;
+  int save_verbose;
+  struct board_state starting_position;
+
+  /* Clear the board and initialize the engine properly. */
+  clear_board();
+  reset_engine();
+
+  /* Mark the eyespace in the mx array. */
+  memset(mx, 0, sizeof(mx));
+  for (k = 0; k < eyesize; k++) {
+    ASSERT_ON_BOARD1(eye_vertices[k]);
+    mx[eye_vertices[k]] = 1;
+  }
+
+  /* Play white stones surrounding the eyespace, including diagonals. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos) || mx[pos] == 1)
+      continue;
+    for (k = 0; k < 8; k++) {
+      if (ON_BOARD(pos + delta[k]) && mx[pos + delta[k]] == 1) {
+       play_move(pos, WHITE);
+       str = pos;
+       break;
+      }
+    }
+  }
+
+  /* Play black stones surrounding the white group, but leaving all
+   * liberties empty.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (mx[pos] == 1 || board[pos] != EMPTY || liberty_of_string(pos, str))
+      continue;
+    for (k = 0; k < 8; k++) {
+      if (ON_BOARD(pos + delta[k])
+         && liberty_of_string(pos + delta[k], str)) {
+       play_move(pos, BLACK);
+       break;
+      }
+    }
+  }
+
+  /* Show the board if verbose is on. Then turn off traces so we don't
+   * get any from make_worms(), make_dragons(), or the owl reading.
+   */
+  if (verbose)
+    showboard(0);
+  save_verbose = verbose;
+  verbose = 0;
+  
+  
+  /* Store this position so we can come back to it. */
+  store_board(&starting_position);
+
+  /* Loop over all configurations of black stones inserted in the
+   * eyeshape. There are N = 2^(eyesize) configurations and we can
+   * straightforwardly use binary representation to enumerate them.
+   */
+  N = 1 << eyesize;
+  for (n = 0; n < N; n++) {
+    int valid = 1;
+    int internal_stones = 0;
+    
+    restore_board(&starting_position);
+    /* Play the stones for this configuration. */
+    for (k = 0; k < eyesize; k++) {
+      if (n & (1 << k)) {
+       if (!is_legal(eye_vertices[k], BLACK)) {
+         valid = 0;
+         break;
+       }
+       play_move(eye_vertices[k], BLACK);
+       internal_stones++;
+      }
+    }
+
+    if (!valid)
+      continue;
+
+    if (save_verbose > 1)
+      showboard(0);
+
+    /* Now we are ready to test the consistency. This is most easily
+     * done with help from the owl code. First we must prepare for
+     * this though.
+     */
+    examine_position(EXAMINE_DRAGONS_WITHOUT_OWL, 0);
+
+    attack_code = owl_attack(str, &attack_point, NULL, NULL);
+
+    if (attack_code == 0) {
+      /* The owl code claims there is no attack. We test this by
+       * trying to attack on all empty spaces in the eyeshape.
+       */
+      for (k = 0; k < eyesize; k++) {
+       if (board[eye_vertices[k]] == EMPTY
+           && is_legal(eye_vertices[k], BLACK)
+           && owl_does_attack(eye_vertices[k], str, NULL)) {
+         gprintf("%1m alive, but %1m attacks:\n", str, eye_vertices[k]);
+         showboard(0);
+         gprintf("\n");
+       }
+      }
+
+      /* Furthermore, if the eyespace is almost filled, white should
+       * be able to play on the remaining eyespace point and still be
+       * alive.
+       */
+      if (internal_stones == eyesize - 1) {
+       for (k = 0; k < eyesize; k++) {
+         if (board[eye_vertices[k]] == EMPTY
+             && !owl_does_defend(eye_vertices[k], str, NULL)) {
+           gprintf("%1m alive, but almost filled with nakade:\n", str);
+           showboard(0);
+         }
+       }
+      }
+    }
+    else {
+      defense_code = owl_defend(str, &defense_point, NULL, NULL);
+      if (defense_code == 0) {
+       /* The owl code claims there is no defense. We test this by
+        * trying to defend on all empty spaces in the eyeshape.
+        */
+       for (k = 0; k < eyesize; k++) {
+         if (board[eye_vertices[k]] == EMPTY
+             && is_legal(eye_vertices[k], WHITE)
+             && owl_does_defend(eye_vertices[k], str, NULL)) {
+           gprintf("%1m dead, but %1m defends:\n", str, eye_vertices[k]);
+           showboard(0);
+           gprintf("\n");
+         }
+       }
+      }
+      else {
+       /* The owl code claims the dragon is critical. Verify the
+         * attack and defense points.
+        */
+       if (board[attack_point] != EMPTY
+           || !is_legal(attack_point, BLACK)) {
+         gprintf("Bad attack point %1m:\n", attack_point);
+         showboard(0);
+       }
+       else if (!owl_does_attack(attack_point, str, NULL)) {
+         gprintf("Attack point %1m failed:\n", attack_point);
+         showboard(0);
+       }
+
+       if (board[defense_point] != EMPTY
+           || !is_legal(defense_point, WHITE)) {
+         gprintf("Bad defense point %1m:\n", defense_point);
+         showboard(0);
+       }
+       else if (!owl_does_defend(defense_point, str, NULL)) {
+         gprintf("Defense point %1m failed:\n", defense_point);
+         showboard(0);
+       }
+      }
+    }
+  }
+  verbose = save_verbose;
+}
+
+/********************************************************************
+ * The following static functions are helpers for analyze_eyegraph()
+ * further down. The purpose is to evaluate eye graphs according to
+ * the rules for local games, as described in doc/eyes.texi.
+ *
+ * The technique to do this is to convert the eye evaluation problem
+ * into a tactical style life and death reading problem. Tactical in
+ * the sense of needing to decide whether certain stones can be
+ * captured, but not in the sense of the tactical reading that five
+ * liberties are considered safe.
+ *
+ * We illustrate how this works with an example. Consider the eye shape
+ *
+ *   !
+ *  .X
+ * !...
+ *
+ * The basic idea is to embed the eyespace in a perfectly connected
+ * group without additional eyes or eye potential. This is most easily
+ * done by the somewhat brutal trick to fill the entire board with
+ * stones. We let the group consist of white stones (O) and get this
+ * result, disregarding the two marginal eye vertices:
+ *
+ *    A B C D E F G H J K L M N O P Q R S T
+ * 19 O O O O O O O O O O O O O O O O O O O 19
+ * 18 O O O O O O O O O O O O O O O O O O O 18
+ * 17 O O O O O O O O O O O O O O O O O O O 17
+ * 16 O O O O O O O O O O O O O O O O O O O 16
+ * 15 O O O O O O O O O O O O O O O O O O O 15
+ * 14 O O O O O O O O O O O O O O O O O O O 14
+ * 13 O O O O O O O O O O O O O O O O O O O 13
+ * 12 O O O O O O O O . O O O O O O O O O O 12
+ * 11 O O O O O O O . X O O O O O O O O O O 11
+ * 10 O O O O O O . . . . O O O O O O O O O 10
+ *  9 O O O O O O O O O O O O O O O O O O O 9
+ *  8 O O O O O O O O O O O O O O O O O O O 8
+ *  7 O O O O O O O O O O O O O O O O O O O 7
+ *  6 O O O O O O O O O O O O O O O O O O O 6
+ *  5 O O O O O O O O O O O O O O O O O O O 5
+ *  4 O O O O O O O O O O O O O O O O O O O 4
+ *  3 O O O O O O O O O O O O O O O O O O O 3
+ *  2 O O O O O O O O O O O O O O O O O O O 2
+ *  1 O O O O O O O O O O O O O O O O O O O 1
+ *    A B C D E F G H J K L M N O P Q R S T
+ *
+ * The question now is whether black can capture all the white stones
+ * under alternating play where only white may pass. However, first we
+ * need to make the top and leftmost eye vertices marginal. This is
+ * done by inserting small invincible black groups in the sea of white
+ * stones, in contact with the marginal vertices.
+ *
+ *    A B C D E F G H J K L M N O P Q R S T
+ * 19 . O O O O O O O O O O O O O O O O O O 19
+ * 18 O O O O O O O O X X X O O O O O O O O 18
+ * 17 O O O O O O O O X . X O O O O O O O O 17
+ * 16 O O O O O O O O X X X O O O O O O O O 16
+ * 15 O O O O O O O O X . X O O O O O O O O 15
+ * 14 O O O O O O O O X X X O O O O O O O O 14
+ * 13 O O O O O O O O X O O O O O O O O O O 13
+ * 12 O O O O O O O O . O O O O O O O O O O 12
+ * 11 O O O O O O O . X O O O O O O O O O O 11
+ * 10 O O O O O O . . . . O O O O O O O O O 10
+ *  9 O O O O O O X O O O O O O O O O O O O 9
+ *  8 O O O O X X X O O O O O O O O O O O O 8
+ *  7 O O O O X . X O O O O O O O O O O O O 7
+ *  6 O O O O X X X O O O O O O O O O O O O 6
+ *  5 O O O O X . X O O O O O O O O O O O O 5
+ *  4 . O O O X X X O O O O O O O O O O O O 4
+ *  3 X X . O O O O O O O O O O O O O O O O 3
+ *  2 X . X O O O O O O O O O O O O O O O O 2
+ *  1 . X X O O O O O O O O O O O O O O O O 1
+ *    A B C D E F G H J K L M N O P Q R S T
+ *
+ * In this diagram we have also added an invincible black group in the
+ * lower left corner in order to add two outer liberties (at A4 and
+ * C3) for the white group (this is sometimes needed for the tactical
+ * life and death reading to make sense). Furthermore there is an
+ * extra eye at A19. This is used when we want to distinguish between
+ * 0 and 1 (or 2) eyes since the tactical life and death reading by
+ * itself only cares about two eyes or not. When trying to distinguish
+ * between 1 (or 0) and 2 eyes we first fill in A19 again.
+ *
+ * Depending on the tactical life and death status with or without the
+ * extra eye we can determine the number of eyes. By evaluating
+ * tactical life and death status after having made a move we can also
+ * identify ko threats and critical moves.
+ *
+ * This code is organized as follows:
+ *
+ * analyze_eyegraph() converts the eyegraph into the tactical board
+ * position as demonstrated, then calls evaluate_eyespace() to its eye
+ * value.
+ *
+ * white_area() is a helper to add a small invincible black group on
+ * the board.
+ *
+ * evaluate_eyespace() calls tactical_life() and itself recursively to
+ * determine the eye value and the critical points.
+ *
+ * tactical_life() determines whether the white stones on the board
+ * (assumed to be a single string) can be captured under alternating
+ * play.
+ *
+ * tactical_life_attack() and tactical_life_defend() are two mutually
+ * recursive functions which perform the actual reading for
+ * tactical_life().
+ *
+ * Worth to mention in this overview is also the cache used for
+ * tactical_life_attack() and tactical_life_defend(). Since we have a
+ * limited number of vertices (eye space points + two outer liberties
+ * + possibly an extra eye) to play on we use a complete cache with a
+ * unique entry for every possible configuration of stones on the
+ * considered vertices.
+ *
+ * For each cache entry four bits are used, two for attack results and
+ * two four defense results. Each of these can take the values 0-3
+ * with the following interpretations:
+ * 0 - not yet considered
+ * 1 - result is being computed
+ * 2 - result has been computed and was a failure (0)
+ * 3 - result has been computed and was a success (1)
+ */
+
+/* Like trymove() except that it does a superko check. This does,
+ * however, only disallow repetition (besides simple ko) if the move
+ * does not capture any stones.
+ */
+static int
+eyegraph_trymove(int pos, int color, const char *message, int str)
+{
+  static Hash_data remembered_board_hashes[MAXSTACK];
+  int k;
+  int does_capture = does_capture_something(pos, color);
+  
+  remembered_board_hashes[stackp] = board_hash;
+  
+  if (!trymove(pos, color, message, str))
+    return 0;
+
+  if (does_capture)
+    return 1;
+
+  for (k = 0; k < stackp; k++)
+    if (hashdata_is_equal(board_hash, remembered_board_hashes[k])) {
+      popgo();
+      return 0;
+    }
+
+  return 1;
+}
+
+static int
+eyegraph_is_margin_or_outer_liberty(int vertex)
+{
+  int k;
+  int r;
+  int num_libs;
+  int libs[MAXLIBS];
+  int eyes;
+  
+  for (k = 0; k < 4; k++) {
+    if (board[vertex + delta[k]] == BLACK) {
+      eyes = 0;
+      num_libs = findlib(vertex + delta[k], MAXLIBS, libs);
+      
+      for (r = 0; r < num_libs; r++)
+       if (is_suicide(libs[r], WHITE))
+         eyes++;
+      
+      if (eyes >= 2)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+static int
+eyegraph_order_moves(int num_vertices, int *vertices, int color_to_move, int *moves)
+{
+  int num_moves = 0;
+  int scores[BOARDMAX];
+  int move;
+  int score;
+  int k;
+  int r;
+
+  for (k = 0; k < num_vertices; k++) {
+    if (k >= num_vertices - 3) {
+      /* Never useful for white to fill in outer liberties or a second eye. */
+      if (color_to_move == WHITE)
+       break;
+      /* No use playing the second outer liberty before the first one. */
+      if (k == num_vertices - 2 && board[vertices[num_vertices - 3]] == EMPTY)
+       continue;
+    }
+    
+    move = vertices[k];
+    score = 0;
+
+    if (board[move] != EMPTY)
+      continue;
+    
+    if (eyegraph_is_margin_or_outer_liberty(move)) {
+      if (k < num_vertices - 3)
+       score = 5; /* margin */
+      else
+       score = -10; /* outer liberty */
+    }
+
+    if (accuratelib(move, color_to_move, 2, NULL) == 1)
+      score -= 3;
+    
+    for (r = 0; r < 4; r++) {
+      if (board[move + delta[r]] == EMPTY)
+       score += 2;
+      else if (board[move + delta[r]] == BLACK)
+       score += 3;
+    }
+    
+    moves[num_moves] = move;
+    scores[num_moves] = score;
+    num_moves++;
+  }
+
+  for (k = 0; k < num_moves; k++) {
+    int maxscore = scores[k];
+    int max_at = 0;
+
+    /* Find the move with the biggest score. */
+    for (r = k + 1; r < num_moves; r++) {
+      if (scores[r] > maxscore) {
+       maxscore = scores[r];
+       max_at = r;
+      }
+    }
+
+    /* Now exchange the move at k with the move at max_at.
+     * Don't forget to exchange the scores as well.
+     */
+    if (max_at != 0) {
+      int temp = moves[max_at];
+      moves[max_at] = moves[k];
+      moves[k] = temp;
+      temp = scores[max_at];
+      scores[max_at] = scores[k];
+      scores[k] = temp;
+    }
+  }
+  
+  return num_moves;
+}
+
+/* Place a small invincible black group on the board.
+ * It is required that previously there were white stones at all
+ * involved vertices and on the surrounding vertices.
+ *
+ * Returns 1 if a group was placed, 0 otherwise.
+ */
+static int
+white_area(int mx[BOARDMAX], int pos, int up, int right, int marginpos,
+          int distance)
+{
+  int u, v;
+  int k;
+  int edge = is_edge_vertex(marginpos);
+
+  for (k = 1; k < distance; k++)
+    if (!ON_BOARD(marginpos + k * up)
+       || mx[marginpos + k * up] != WHITE)
+      return 0;
+
+  for (u = -1; u <= 4; u++)
+    for (v = -1; v <= 4; v++) {
+      int pos2 = pos + u * up + v * right;
+      if (!ON_BOARD(pos2)) {
+       if (!edge)
+         return 0;
+       else if (u >= 0 && u <= 3 && v >= 0 && v <= 3)
+         return 0;
+       else if (I(pos2) != I(NORTH(marginpos))
+                && I(pos2) != I(SOUTH(marginpos))
+                && J(pos2) != J(WEST(marginpos))
+                && J(pos2) != J(EAST(marginpos)))
+         return 0;
+      }
+      else if (mx[pos2] != WHITE)
+       return 0;
+    }
+  
+  for (u = 0; u <= 3; u++)
+    for (v = 0; v <= 3; v++) {
+      int pos2 = pos + u * up + v * right;
+      mx[pos2] = BLACK;
+    }
+
+  mx[pos + up + right] = EMPTY;
+  mx[pos + 2 * up + 2 * right] = EMPTY;
+
+  return 1;
+}
+
+
+#define EYEGRAPH_RETURN(result, trace) \
+  do { \
+    if (sgf_dumptree) \
+      sgftreeAddComment(sgf_dumptree, (trace)); \
+    return (result); \
+  } while (0);
+
+static int tactical_life_defend(int str, int num_vertices, int *vertices,
+                               unsigned char *results);
+
+/* Determine whether black can capture all white stones. */
+static int
+tactical_life_attack(int str, int num_vertices, int *vertices,
+                    unsigned char *results)
+{
+  int k;
+  int hash = 0;
+  int cached_result;
+  int result;
+  int num_moves;
+  int moves[BOARDMAX];
+
+  /* Compute hash value to index the result cache with. */
+  for (k = 0; k < num_vertices; k++) {
+    hash *= 3;
+    hash += board[vertices[k]];
+  }
+  hash *= 2;
+  hash += (board_ko_pos != NO_MOVE);
+
+  /* Is the result known from the cache? */
+  cached_result = results[hash] & 3;
+
+  if (0) {
+    showboard(0);
+    gprintf("%d %d (%d)\n", hash, cached_result, results[hash]);
+  }
+  
+  if (cached_result == 2)
+    EYEGRAPH_RETURN(0, "tactical_life_attack: 0 (cached)");
+  if (cached_result == 3)
+    EYEGRAPH_RETURN(1, "tactical_life_attack: win (cached)");
+  if (cached_result == 1)
+    EYEGRAPH_RETURN(1, "tactical_life_attack: win (open node in cache)");
+
+  /* Mark this entry in the cache as currently being computed. */
+  results[hash] |= 1;
+
+  /* Try to play on all relevant vertices. */
+  num_moves = eyegraph_order_moves(num_vertices, vertices,
+                                  OTHER_COLOR(board[str]), moves);
+  for (k = 0; k < num_moves; k++) {
+    int move = moves[k];
+    if (eyegraph_trymove(move, OTHER_COLOR(board[str]),
+                        "tactical_life_attack", str)) {
+      /* We were successful if the white stones were captured or if no
+       * defense can be found.
+       */
+      if (board[str] == EMPTY)
+       result = 1;
+      else
+       result = !tactical_life_defend(str, num_vertices, vertices, results);
+      
+      popgo();
+
+      if (result == 1) {
+       /* Store the result (success) in the cache. */
+       results[hash] = (results[hash] & (~3)) | 3;
+       EYEGRAPH_RETURN(1, "tactical_life_attack: win");
+      }
+    }
+  }
+  
+  /* Store the result (failure) in the cache. */
+  results[hash] = (results[hash] & (~3)) | 2;
+  EYEGRAPH_RETURN(0, "tactical_life_attack: 0");
+}
+
+/* Determine whether white can live with all stones. */
+static int
+tactical_life_defend(int str, int num_vertices, int *vertices,
+                    unsigned char *results)
+{
+  int k;
+  int hash = 0;
+  int cached_result;
+  int result;
+  int num_moves;
+  int moves[BOARDMAX];
+  
+  /* Compute hash value to index the result cache with. */
+  for (k = 0; k < num_vertices; k++) {
+    hash *= 3;
+    ASSERT1(board[vertices[k]] <= 2, vertices[k]);
+    hash += board[vertices[k]];
+  }
+  hash *= 2;
+  hash += (board_ko_pos != NO_MOVE);
+  
+  /* Is the result known from the cache? */
+  cached_result = (results[hash] >> 2) & 3;
+
+  if (0) {
+    showboard(0);
+    gprintf("%d %d (%d)\n", hash, cached_result, results[hash]);
+  }
+
+  if (cached_result == 2)
+    EYEGRAPH_RETURN(0, "tactical_life_defend: 0 (cached)");
+  if (cached_result == 3)
+    EYEGRAPH_RETURN(1, "tactical_life_defend: win (cached)");
+  if (cached_result == 1)
+    EYEGRAPH_RETURN(1, "tactical_life_defend: win (node open in cache)");
+
+  /* Mark this entry in the cache as currently being computed. */
+  results[hash] |= (1 << 2);
+
+  /* Try to play on all relevant vertices. */
+  num_moves = eyegraph_order_moves(num_vertices, vertices, board[str], moves);
+  for (k = 0; k < num_moves; k++) {
+    int move = moves[k];
+    if ((!is_suicide(move, OTHER_COLOR(board[str]))
+        || does_capture_something(move, board[str]))
+       && eyegraph_trymove(move, board[str], "tactical_life_defend", str)) {
+      /* We were successful if no attack can be found. */
+      result = !tactical_life_attack(str, num_vertices, vertices, results);
+      
+      popgo();
+
+      if (result == 1) {
+       /* Store the result (success) in the cache. */
+       results[hash] = (results[hash] & (~12)) | (3 << 2);
+       EYEGRAPH_RETURN(1, "tactical_life_defend: win");
+      }
+    }
+  }
+
+  /* If no move worked, also try passing. */
+  if (!tactical_life_attack(str, num_vertices, vertices, results)) {
+    /* Store the result (success) in the cache. */
+    results[hash] = (results[hash] & (~12)) | (3 << 2);
+    EYEGRAPH_RETURN(1, "tactical_life_defend: win");
+  }
+  
+  /* Store the result (failure) in the cache. */
+  results[hash] = (results[hash] & (~12)) | (2 << 2);
+  EYEGRAPH_RETURN(0, "tactical_life_defend: 0");
+}
+
+/* Determine the tactical life and death status of all white stones.
+ * Also find all attack and defense moves. The parameter have_eye
+ * determines whether the extra eye in the upper left corner should be
+ * used or filled in before starting reading.
+ */
+static void
+tactical_life(int have_eye, int num_vertices, int *vertices,
+             int *attack_code, int *num_attacks, int *attack_points,
+             int *defense_code, int *num_defenses, int *defense_points,
+             unsigned char *results)
+{
+  int k;
+  int str;
+  int num_moves;
+  int moves[BOARDMAX];
+
+  gg_assert(attack_code != NULL && defense_code != NULL);
+
+  /* We know that the large white group includes A18. This is the
+   * vertex we test to determine whether the white stones have been
+   * captured.
+   */
+  str = POS(1, 0);
+
+  if (board[str] == EMPTY) {
+    /* The stones have already been captured, too late to defend. */
+    *attack_code = WIN;
+    *defense_code = 0;
+    return;
+  }
+
+  /* Fill in the extra eye if have_eye is 0. If filling in would be
+   * suicide the white stones can be considered dead.
+   */
+  if (!have_eye) {
+    if (!eyegraph_trymove(POS(0, 0), WHITE, "tactical_life-A", NO_MOVE)) {
+      *attack_code = WIN;
+      *defense_code = 0;
+      return;
+    }
+  }
+  
+  *attack_code = 0;
+  *defense_code = 0;
+
+  /* Call tactical_life_attack() and tactical_life_defend() to
+   * determine status.
+   */
+  if (tactical_life_attack(str, num_vertices, vertices, results)) {
+    *attack_code = WIN;
+    if (tactical_life_defend(str, num_vertices, vertices, results))
+      *defense_code = WIN;
+  }
+  else
+    *defense_code = WIN;
+
+
+  /* If the status is critical, try to play at each relevant vertex
+   * and call tactical_life_defend() or tactical_life_attack() to
+   * determine whether the move works as attack or defense.
+   */
+  if (*attack_code != 0 && *defense_code != 0) {
+    if (num_attacks != NULL && attack_points != NULL) {
+      *num_attacks = 0;
+      num_moves = eyegraph_order_moves(num_vertices, vertices,
+                                      OTHER_COLOR(board[str]), moves);
+      for (k = 0; k < num_moves; k++) {
+       int move = moves[k];
+       if (eyegraph_trymove(move, OTHER_COLOR(board[str]), "tactical_life-B",
+                            str)) {
+         if (board[str] == EMPTY
+             || !tactical_life_defend(str, num_vertices, vertices, results))
+           attack_points[(*num_attacks)++] = move;
+         popgo();
+       }
+      }
+    }
+
+    if (num_defenses != NULL && defense_points != NULL) {
+      *num_defenses = 0;
+      num_moves = eyegraph_order_moves(num_vertices, vertices, board[str],
+                                      moves);
+      for (k = 0; k < num_moves; k++) {
+       int move = moves[k];
+       if (eyegraph_trymove(move, board[str], "tactical_life-C", str)) {
+         if (!tactical_life_attack(str, num_vertices, vertices, results))
+           defense_points[(*num_defenses)++] = move;
+         popgo();
+       }
+      }
+    }
+  }
+
+  /* Unfill the extra eye if we didn't use it. */
+  if (!have_eye)
+    popgo();
+}
+
+/* Determine the eye value of the eyespace for the big white group on
+ * the board and vital moves. The possible eye values are documented
+ * in the preamble to eyes.db. By calling tactical_life() multiple
+ * times, with and without using an extra eye, we can compute the eye
+ * values. To determine ko threats and vital moves, tactical_life() is
+ * called again after trying to play on one of the relevant vertices.
+ * In order to find out whether ko threats really are effective and to
+ * distinguish between 0122/1122 and 0012/0011 eye values (see
+ * discussion on pattern 6141 in the preamble of eyes.db), we may also
+ * need to recursively call ourselves after a move has been made.
+ */
+static void
+evaluate_eyespace(struct eyevalue *result, int num_vertices, int *vertices,
+                 int *num_vital_attacks, int *vital_attacks,
+                 int *num_vital_defenses, int *vital_defenses,
+                 unsigned char *tactical_life_results)
+{
+  int k;
+  int attack_code;
+  int num_attacks;
+  int attack_points[BOARDMAX];
+  int defense_code;
+  int num_defenses;
+  int defense_points[BOARDMAX];
+  int attack_code2;
+  int num_attacks2;
+  int attack_points2[BOARDMAX];
+  int defense_code2;
+  struct eyevalue result2;
+  int num_vital_attacks2;
+  int vital_attacks2[BOARDMAX];
+  int num_vital_defenses2;
+  int vital_defenses2[BOARDMAX];
+  int num_moves;
+  int moves[BOARDMAX];
+
+  *num_vital_attacks = 0;
+  *num_vital_defenses = 0;
+
+  /* Determine tactical life without an extra eye. */
+  tactical_life(0, num_vertices, vertices,
+               &attack_code, &num_attacks, attack_points,
+               &defense_code, &num_defenses, defense_points,
+               tactical_life_results);
+
+  if (attack_code == 0) {
+    /* Alive without extra eye.
+     * Possible results: 0222, 1222, 2222
+     *
+     * Determine whether there are ko threats and how serious.
+     */
+    int a = 2;
+
+    if (sgf_dumptree)
+      sgftreeAddComment(sgf_dumptree, "Alive without extra eye.\n");
+    
+    num_moves = eyegraph_order_moves(num_vertices, vertices, BLACK, moves);
+    for (k = 0; k < num_moves; k++) {
+      int acode, dcode;
+      int move = moves[k];
+      if (eyegraph_trymove(move, BLACK, "evaluate_eyespace-A", NO_MOVE)) {
+       tactical_life(0, num_vertices, vertices, &acode, NULL, NULL,
+                     &dcode, NULL, NULL, tactical_life_results);
+       if (acode != 0) {
+         tactical_life(1, num_vertices, vertices, &acode, NULL, NULL,
+                       &dcode, NULL, NULL, tactical_life_results);
+         if (acode != 0) {
+           if (a == 1)
+             *num_vital_attacks = 0;
+           a = 0;
+           vital_attacks[(*num_vital_attacks)++] = move;
+           if (sgf_dumptree)
+             sgftreeAddComment(sgf_dumptree,
+                               "Ko threat to remove both eyes.\n");
+         }
+         else {
+           if (a != 0) {
+             vital_attacks[(*num_vital_attacks)++] = move;
+             a = 1;
+           }
+           if (sgf_dumptree)
+             sgftreeAddComment(sgf_dumptree, "Ko threat to remove one eye.\n");
+         }
+       }
+       popgo();
+      }
+    }
+    set_eyevalue(result, a, 2, 2, 2);
+    if (sgf_dumptree) {
+      if (a == 0)
+       sgftreeAddComment(sgf_dumptree, "Eyevalue 0222.\n");
+      else if (a == 1)
+       sgftreeAddComment(sgf_dumptree, "Eyevalue 1222.\n");
+      else
+       sgftreeAddComment(sgf_dumptree, "Eyevalue 2222.\n");
+    }
+  }
+  else if (defense_code != 0) {
+    /* Critical without extra eye.
+     * Possible results: 0022, 0122, 1122
+     */
+    if (sgf_dumptree)
+      sgftreeAddComment(sgf_dumptree, "Critical without extra eye.\n");
+    tactical_life(1, num_vertices, vertices,
+                 &attack_code2, &num_attacks2, attack_points2,
+                 &defense_code2, NULL, NULL, tactical_life_results);
+    for (k = 0; k < num_defenses; k++)
+      vital_defenses[(*num_vital_defenses)++] = defense_points[k];
+    if (attack_code2 == WIN) {
+      /* A chimera. 0022. */
+      set_eyevalue(result, 0, 0, 2, 2);
+      for (k = 0; k < num_attacks2; k++)
+       vital_attacks[(*num_vital_attacks)++] = attack_points2[k];
+      if (sgf_dumptree)
+       sgftreeAddComment(sgf_dumptree, "Eyevalue: 0022.\n");
+    }
+    else {
+      int a = 1;
+      for (k = 0; k < num_attacks; k++) {
+       int move = attack_points[k];
+       if (eyegraph_trymove(move, BLACK, "evaluate_eyespace-B", NO_MOVE)) {
+         evaluate_eyespace(&result2, num_vertices, vertices,
+                           &num_vital_attacks2, vital_attacks2,
+                           &num_vital_defenses2, vital_defenses2,
+                           tactical_life_results);
+         /* If result2 is 0011 for some move we have 0122 as final
+           * result, otherwise 1122.
+          */
+         if (min_eyes(&result2) == 0
+             && max_eyes(&result2) == 1
+             && max_eye_threat(&result2) == 1) {
+           if (a == 1)
+             *num_vital_attacks = 0;
+           a = 0;
+           vital_attacks[(*num_vital_attacks)++] = move;
+         }
+         else if (a == 1)
+           vital_attacks[(*num_vital_attacks)++] = move;
+         popgo();
+       }
+      }
+      set_eyevalue(result, a, 1, 2, 2);
+      if (sgf_dumptree) {
+       if (a == 0)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue: 0122.\n");
+       else
+         sgftreeAddComment(sgf_dumptree, "Eyevalue: 1122.\n");
+      }          
+    }
+  }
+  else {
+    /* Dead without extra eye.
+     * Possible results: 0000, 0001, 0002, 0011, 0012, 0111, 0112, 1111, 1112
+     *
+     * Now determine tactical life with an extra eye.
+     */
+    if (sgf_dumptree)
+      sgftreeAddComment(sgf_dumptree, "Dead without extra eye.\n");
+    tactical_life(1, num_vertices, vertices,
+                 &attack_code, &num_attacks, attack_points,
+                 &defense_code, &num_defenses, defense_points,
+                 tactical_life_results);
+    if (attack_code == 0) {
+      /* Alive with extra eye.
+       * Possible results: 0111, 0112, 1111, 1112
+       */
+      int a = 1;
+      int d = 1;
+      if (sgf_dumptree)
+       sgftreeAddComment(sgf_dumptree, "Alive with extra eye.\n");
+      num_moves = eyegraph_order_moves(num_vertices, vertices, BLACK, moves);
+      for (k = 0; k < num_moves; k++) {
+       int acode, dcode;
+       int move = moves[k];
+       if (eyegraph_trymove(move, BLACK, "evaluate_eyespace-C", NO_MOVE)) {
+         tactical_life(1, num_vertices, vertices, &acode, NULL, NULL,
+                       &dcode, NULL, NULL, tactical_life_results);
+         if (acode != 0) {
+           evaluate_eyespace(&result2, num_vertices, vertices,
+                             &num_vital_attacks2, vital_attacks2,
+                             &num_vital_defenses2, vital_defenses2,
+                             tactical_life_results);
+           /* This is either 0011 or 0012. Only the first is acceptable. */
+           if (max_eye_threat(&result2) == 1) {
+             vital_attacks[(*num_vital_attacks)++] = move;
+             a = 0;
+             if (sgf_dumptree)
+               sgftreeAddComment(sgf_dumptree, "Attacking ko threat.\n");
+           }
+         }
+         popgo();
+       }
+      }
+      
+      num_moves = eyegraph_order_moves(num_vertices, vertices, WHITE, moves);
+      for (k = 0; k < num_moves; k++) {
+       int acode, dcode;
+       int move = moves[k];
+       if (eyegraph_trymove(move, WHITE, "evaluate_eyespace-D", NO_MOVE)) {
+         tactical_life(0, num_vertices, vertices, &acode, NULL, NULL,
+                       &dcode, NULL, NULL, tactical_life_results);
+         if (dcode != 0) {
+           evaluate_eyespace(&result2, num_vertices, vertices,
+                             &num_vital_attacks2, vital_attacks2,
+                             &num_vital_defenses2, vital_defenses2,
+                             tactical_life_results);
+           /* This is either 1122 or 0122. Only the first is acceptable. */
+           if (min_eye_threat(&result2) == 1) {
+             vital_defenses[(*num_vital_defenses)++] = move;
+             d = 2;
+             if (sgf_dumptree)
+               sgftreeAddComment(sgf_dumptree, "Defending ko threat.\n");
+           }
+         }
+         popgo();
+       }
+      }
+      set_eyevalue(result, a, 1, 1, d);
+      if (sgf_dumptree) {
+       if (a == 0 && d == 1)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 0111.\n");
+       else if (a == 0 && d == 2)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 0112.\n");
+       else if (a == 1 && d == 1)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 1111.\n");
+       else
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 1112.\n");
+      }
+    }
+    else if (defense_code != 0) {
+      /* Critical with extra eye.
+       * Possible results: 0011, 0012
+       */
+      int d = 1;
+      if (sgf_dumptree)
+       sgftreeAddComment(sgf_dumptree, "Critical with extra eye.\n");
+      for (k = 0; k < num_attacks; k++)
+       vital_attacks[(*num_vital_attacks)++] = attack_points[k];
+      for (k = 0; k < num_defenses; k++) {
+       int move = defense_points[k];
+       if (eyegraph_trymove(move, WHITE, "evaluate_eyespace-E", NO_MOVE)) {
+         evaluate_eyespace(&result2, num_vertices, vertices,
+                           &num_vital_attacks2, vital_attacks2,
+                           &num_vital_defenses2, vital_defenses2,
+                           tactical_life_results);
+         /* If result2 is 1122 for some move we have 0012 as final
+           * result, otherwise 0011.
+          */
+         if (min_eye_threat(&result2) == 1
+             && min_eyes(&result2) == 1
+             && max_eyes(&result2) == 2) {
+           if (d == 1)
+             *num_vital_defenses = 0;
+           d = 2;
+           vital_defenses[(*num_vital_defenses)++] = move;
+         }
+         else if (d == 1)
+           vital_defenses[(*num_vital_defenses)++] = move;
+         popgo();
+       }
+      }
+      set_eyevalue(result, 0, 0, 1, d);
+      if (sgf_dumptree) {
+       if (d == 1)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue: 0011.\n");
+       else
+         sgftreeAddComment(sgf_dumptree, "Eyevalue: 0012.\n");
+      }          
+    }
+    else {
+      /* Dead with extra eye.
+       * Possible results: 0000, 0001, 0002
+       *
+       * Determine whether there are ko threats and how serious.
+       */
+      int d = 0;
+      if (sgf_dumptree)
+       sgftreeAddComment(sgf_dumptree, "Dead with extra eye.\n");
+      num_moves = eyegraph_order_moves(num_vertices, vertices, WHITE, moves);
+      for (k = 0; k < num_moves; k++) {
+       int acode, dcode;
+       int move = moves[k];
+       if (eyegraph_trymove(move, WHITE, "evaluate_eyespace-F", NO_MOVE)) {
+         tactical_life(1, num_vertices, vertices, &acode, NULL, NULL,
+                       &dcode, NULL, NULL, tactical_life_results);
+         if (dcode != 0) {
+           tactical_life(0, num_vertices, vertices, &acode, NULL, NULL,
+                         &dcode, NULL, NULL, tactical_life_results);
+           if (dcode != 0) {
+             if (d == 1)
+               *num_vital_defenses = 0;
+             d = 2;
+             vital_defenses[(*num_vital_defenses)++] = move;
+             if (sgf_dumptree)
+               sgftreeAddComment(sgf_dumptree,
+                                 "Ko threat to make two eyes.\n");
+           }
+           else {
+             if (d != 2) {
+               vital_defenses[(*num_vital_defenses)++] = move;
+               d = 1;
+             }
+             if (sgf_dumptree)
+               sgftreeAddComment(sgf_dumptree,
+                                 "Ko threat to make one eye.\n");
+           }
+         }
+         popgo();
+       }
+      }
+      set_eyevalue(result, 0, 0, 0, d);
+      if (sgf_dumptree) {
+       if (d == 0)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 0000.\n");
+       else if (d == 1)
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 0001.\n");
+       else
+         sgftreeAddComment(sgf_dumptree, "Eyevalue 0002.\n");
+      }
+    }
+  }
+}
+
+/* Add small invincible black groups in contact with the marginal
+ * vertices, without destroying the connectivity of the white stones.
+ *
+ */
+static int
+add_margins(int num_margins, int *margins, int mx[BOARDMAX])
+{
+  int k;
+  int i, j;
+  int old_mx[BOARDMAX];
+  int pos;
+
+  if (num_margins == 0)
+    return 1;
+  
+  memcpy(old_mx, mx, sizeof(old_mx));
+  
+  pos = margins[num_margins - 1];
+
+  for (k = 0; k < 4; k++) {
+    int up = delta[k];
+    int right = delta[(k + 1) % 4];
+    
+    if (!ON_BOARD(pos + up))
+      continue;
+    
+    if (mx[pos + up] == WHITE
+       && (!ON_BOARD(pos + up + right) || mx[pos + up + right] == WHITE)
+       && (!ON_BOARD(pos + up - right) || mx[pos + up - right] == WHITE)) {
+      for (i = -3; i <= 0; i++) {
+       for (j = 2; j < 6; j++) {
+         if (white_area(mx, pos + j * up + i * right, up, right, pos, j)) {
+           int s = 1;
+           while (mx[pos + s * up] == WHITE) {
+             mx[pos + s * up] = BLACK;
+             s++;
+           }
+           if (add_margins(num_margins - 1, margins, mx))
+             return 1;
+           else
+             memcpy(mx, old_mx, sizeof(old_mx));
+         }
+       }
+      }
+    }
+  }
+
+  return 0;
+}
+
+/* Analyze an eye graph to determine the eye value and vital moves.
+ *
+ * The eye graph is given by a string which is encoded with "%" for
+ * newlines and "O" for spaces. E.g., the eye graph
+ *
+ *   !
+ *  .X
+ * !...
+ *
+ * is encoded as "OO!%O.X%!...". (The encoding is needed for the GTP
+ * interface to this function.)
+ *
+ * The result is an eye value and a (nonencoded) pattern showing the
+ * vital moves, using the same notation as eyes.db. In the example above
+ * we would get the eye value 0112 and the graph (showing ko threat moves)
+ *
+ *   @  
+ *  .X  
+ * !.*.
+ *
+ * If the eye graph cannot be realized, 0 is returned, 1 otherwise.
+ */
+int
+analyze_eyegraph(const char *coded_eyegraph, struct eyevalue *value,
+                char *analyzed_eyegraph)
+{
+  int k;
+  int i, j;
+  int mini, minj;
+  int mx[BOARDMAX];
+  char mg[BOARDMAX];
+  int pos;
+
+  int num_vital_attacks;
+  int vital_attacks[BOARDMAX]; /* Way larger than necessary. */
+  int num_vital_defenses;
+  int vital_defenses[BOARDMAX]; /* Way larger than necessary. */
+  
+  int maxwidth;
+  int current_width;
+  int num_rows;
+  int horizontal_edge;
+  int vertical_edge;
+
+  int num_margins;
+  int margins[BOARDMAX]; /* Way larger than necessary. */
+
+  int num_vertices;
+  int vertices[BOARDMAX]; /* Way larger than necessary. */
+
+  int table_size;
+  unsigned char *tactical_life_results;
+
+  if (0)
+    gprintf("Analyze eyegraph %s\n", coded_eyegraph);
+  
+  /* Mark the eyespace in the mx array. We construct the position in
+   * the mx array and copy it to the actual board later.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      mx[pos] = WHITE;
+
+  /* Find out the size of the eye graph pattern so that we can center
+   * it properly.
+   */
+  maxwidth = 0;
+  current_width = 0;
+  num_rows = 1;
+  horizontal_edge = -1;
+  vertical_edge = -1;
+  for (k = 0; k < (int) strlen(coded_eyegraph); k++) {
+    if (coded_eyegraph[k] == '\n')
+      continue;
+    if (coded_eyegraph[k] == '%') {
+      num_rows++;
+      if (current_width > maxwidth)
+       maxwidth = current_width;
+      current_width = 0;
+    }
+    else {
+      if (coded_eyegraph[k] == '-')
+       horizontal_edge = num_rows - 1;
+      else if (coded_eyegraph[k] == '|')
+       vertical_edge = current_width;
+      current_width++;
+    }
+  }
+  if (current_width > maxwidth)
+    maxwidth = current_width;
+
+  /* Cut out the eyespace from the solid white string. */
+  num_margins = 0;
+  num_vertices = 0;
+  
+  if (horizontal_edge == 0)
+    mini = -1;
+  else if (horizontal_edge > 0)
+    mini = board_size - num_rows + 1;
+  else
+    mini = (board_size - num_rows) / 2;
+
+  if (vertical_edge == 0)
+    minj = -1;
+  else if (vertical_edge > 0)
+    minj = board_size - maxwidth + 1;
+  else
+    minj = (board_size - maxwidth) / 2;
+  
+  i = mini;
+  j = minj;
+  for (k = 0; k < (int) strlen(coded_eyegraph); k++) {
+    char c = coded_eyegraph[k];
+    if (c == '\n')
+      continue;
+    if (c == '%') {
+      i++;
+      j = minj - 1;
+    }
+    else if (c == 'X' || c == '$')
+      mx[POS(i, j)] = BLACK;
+    else if (c == '.' || c == '*' || c == '<' || c == '>'
+            || c == '!' || c == '@' || c == '(' || c == ')')
+      mx[POS(i, j)] = EMPTY;
+    if (c == '!' || c == '@' || c == '(' || c == ')' || c == '$')
+      margins[num_margins++] = POS(i, j);
+    if (c != '|' && c != '-' && c != '+' && c != '%'
+       && ON_BOARD(POS(i, j)) && mx[POS(i, j)] != WHITE)
+      vertices[num_vertices++] = POS(i, j);
+    j++;
+  }
+
+  /* Add an invincible black group in the lower left plus two outer
+   * liberties for the white string. However, if the eyespace is
+   * placed in or near the lower left corner, we put this group in the
+   * upper right instead.
+   */
+  pos = POS(board_size - 2, 1);
+  if ((vertical_edge == 0 && horizontal_edge != 0)
+      || (horizontal_edge > 0 && vertical_edge <= 0))
+    pos = POS(1, board_size - 2);
+  mx[pos] = EMPTY;
+  mx[NORTH(pos)] = BLACK;
+  mx[NW(pos)] = BLACK;
+  mx[NE(pos)] = EMPTY;
+  mx[WEST(pos)] = BLACK;
+  mx[EAST(pos)] = BLACK;
+  mx[SW(pos)] = EMPTY;
+  mx[SOUTH(pos)] = BLACK;
+  mx[SE(pos)] = BLACK;
+  if (ON_BOARD(NN(pos)))
+    mx[NN(pos)] = EMPTY;
+  else
+    mx[SS(pos)] = EMPTY;
+
+  /* Add the two outer liberties in the lower left or upper right to
+   * the list of vertices.
+   */
+  if (ON_BOARD(NN(pos))) {
+    vertices[num_vertices++] = NE(pos);
+    vertices[num_vertices++] = NN(pos);
+  }
+  else {
+    vertices[num_vertices++] = SW(pos);
+    vertices[num_vertices++] = SS(pos);
+  }
+
+  /* Add an extra eye in the upper left corner. */
+  mx[POS(0, 0)] = EMPTY;
+  vertices[num_vertices++] = POS(0, 0);
+
+  if (!add_margins(num_margins, margins, mx))
+    return 0;
+
+  /* Copy the mx array over to the board. */
+  clear_board();
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      if (mx[pos] == WHITE)
+       add_stone(pos, WHITE);
+      else if (mx[pos] == BLACK)
+       add_stone(pos, BLACK);
+    }
+
+  if (verbose)
+    showboard(0);
+
+  /* If there are any isolated O stones, those should also be added to
+   * the playable vertices.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == WHITE && !same_string(pos, POS(1, 0))) {
+      vertices[num_vertices] = vertices[num_vertices - 1];
+      vertices[num_vertices - 1] = vertices[num_vertices - 2];
+      vertices[num_vertices - 2] = vertices[num_vertices - 3];
+      vertices[num_vertices - 3] = pos;
+      num_vertices++;
+    }
+
+  if (verbose) {
+    int k;
+    gprintf("\nPlayable vertices:\n");
+    for (k = 0; k < num_vertices; k++)
+      gprintf("%1m ", vertices[k]);
+    gprintf("\n\n");
+  }
+  
+  /* Disable this test if you need to evaluate larger eyespaces, have
+   * no shortage of memory, and know what you're doing.
+   */
+  if (num_vertices > 17) {
+    gprintf("analyze_eyegraph: too large eyespace, %d vertices\n",
+           num_vertices);
+    gg_assert(num_vertices <= 17);
+  }
+
+  /* The cache must have 2*3^num_vertices entries. */
+  table_size = 2;
+  for (k = 0; k < num_vertices; k++)
+    table_size *= 3;
+
+  /* Allocate memory for the cache. */
+  tactical_life_results = malloc(table_size);
+  if (!tactical_life_results) {
+    gprintf("analyze_eyegraph: failed to allocate %d bytes\n", table_size);
+    gg_assert(tactical_life_results != NULL);
+  }
+  memset(tactical_life_results, 0, table_size);
+
+  if (sgf_dumptree)
+    sgffile_printboard(sgf_dumptree);
+  
+  /* Evaluate the eyespace on the board. */
+  evaluate_eyespace(value, num_vertices, vertices,
+                   &num_vital_attacks, vital_attacks,
+                   &num_vital_defenses, vital_defenses,
+                   tactical_life_results);
+
+  /* Return the cache memory. */
+  free(tactical_life_results);
+
+  if (verbose) {
+    gprintf("Eyevalue: %s\n", eyevalue_to_string(value));
+    for (k = 0; k < num_vital_attacks; k++)
+      gprintf("  vital attack point %1m\n", vital_attacks[k]);
+    for (k = 0; k < num_vital_defenses; k++)
+      gprintf("  vital defense point %1m\n", vital_defenses[k]);
+  }
+
+  /* Encode the attack and defense points with symbols in the mg[] array. */
+  memset(mg, ' ', sizeof(mg));
+
+  for (k = 0; k < num_vertices - 2; k++)
+    mg[vertices[k]] = (board[vertices[k]] == BLACK ? 'X' : '.');
+
+  for (k = 0; k < num_margins; k++)
+    mg[margins[k]] = (mg[margins[k]] == 'X' ? '$' : '!');
+
+  for (k = 0; k < num_vital_attacks; k++)
+    mg[vital_attacks[k]] = (mg[vital_attacks[k]] == '!' ? '(' : '<');
+
+  for (k = 0; k < num_vital_defenses; k++) {
+    int pos = vital_defenses[k];
+    if (mg[pos] == '.')
+      mg[pos] = '>';
+    else if (mg[pos] == '!')
+      mg[pos] = ')';
+    else if (mg[pos] == '<')
+      mg[pos] = '*';
+    else if (mg[pos] == '(')
+      mg[pos] = '@';
+  }
+
+  /* Return the central part of the mg[] array (corresponding to the
+   * input eye graph).
+   */
+  k = 0;
+  for (i = mini; i < mini + num_rows; i++) {
+    for (j = minj; j < minj + maxwidth; j++) {
+      if ((i < 0 || i >= board_size) && (j < 0 || j >= board_size))
+       analyzed_eyegraph[k++] = '+';
+      else if (i < 0 || i >= board_size)
+       analyzed_eyegraph[k++] = '-';
+      else if (j < 0 || j >= board_size)
+       analyzed_eyegraph[k++] = '|';
+      else
+       analyzed_eyegraph[k++] = mg[POS(i, j)];
+    }
+    analyzed_eyegraph[k++] = '\n';
+  }
+  analyzed_eyegraph[k - 1] = 0;
+  
+  return 1;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/oracle.c b/engine/oracle.c
new file mode 100644 (file)
index 0000000..bceb28b
--- /dev/null
@@ -0,0 +1,474 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/* The functions in this file implement a mechanism whereby
+ * GNU Go can fork a second gnugo process, called the oracle.
+ * The two processes communicate by means of the GTP.
+ * The functions oracle_trymove() and oracle_popgo() call
+ * trymove and popgo in the primary gnugo processes but
+ * actually play and undo the move in the oracle. This
+ * the oracle can be queried for information which is
+ * normally only available at the top level.
+ */
+
+#include "config.h"
+
+#if ORACLE
+
+#include "gnugo.h"
+#include "liberty.h"
+#include "patterns.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define USE_POSIX 1
+
+FILE *to_gnugo_stream, *from_gnugo_stream;
+char gnugo_line[128];
+int gnugo_line_length;
+
+int pfd_a[2];
+int pfd_b[2];
+
+#define TELL_ORACLE(x, args...) do { \
+              if (debug & DEBUG_ORACLE_STREAM) fprintf(stderr, x, ##args);  \
+                if (fprintf(to_gnugo_stream, x, ##args) < 0) \
+                   error("can't write command in to_gnugo_stream"); \
+                fflush(to_gnugo_stream); \
+              } while (0)
+
+#define ASK_ORACLE    do { \
+                        gnugo_line_length = 0;   \
+                        while (gnugo_line_length != 1) { \
+                          if (!fgets(gnugo_line, 128, from_gnugo_stream)) \
+                             error("can't get response"); \
+                          gnugo_line_length = strlen(gnugo_line); \
+                          if (debug & DEBUG_ORACLE_STREAM) \
+                            fprintf(stderr, gnugo_line); \
+                          } \
+                        } while (0)
+
+#define MAX_ORACLE_MOVES 10
+
+struct oracle_move_data {
+  int pos;            /* move coordinate */
+  int color;          /* color to play */
+  int value;          /* value */
+  int ab_value;       /* alpha-beta value */
+  const char *reason; /* why this move */
+};
+
+static void oracle_callback(int anchor, int color, struct pattern *pattern,
+                           int ll, void *data);
+static void oracle_add_move(struct oracle_move_data *moves, 
+                           int this_move, int this_value, 
+                           const char *this_reason);
+void do_consult_oracle(int color);
+void error(const char *msg);
+static int oracle_trymove(int pos, int color, const char *message, int str,
+                         int komaster, int kom_pos);
+static void oracle_popgo(void);
+static void tell_oracle(const char *fmt, ...);
+static void ask_oracle(void);
+static int search_width(void);
+
+
+/*** * *** * *** * *** * *** * *** * *** * *** * *** * *** * *** * ***\
+ *                    Primary Oracle Functions                       *
+\*** * *** * *** * *** * *** * *** * *** * *** * *** * *** * *** * ***/
+
+/* Forks and attaches pipes to a new GNU Go process in gtp mode.
+ * Loads the sgf file
+ */
+
+void
+summon_oracle(void)
+{
+  if (pipe(pfd_a) == -1)
+    error("can't open pipe a");
+  if (pipe(pfd_b) == -1)
+    error("can't open pipe b");
+  switch (fork()) {
+  case -1:
+    error("fork failed (try chopsticks)");
+  case 0:
+    /* Attach pipe a to stdin */
+    if (dup2(pfd_a[0], 0) == -1) 
+      error("dup pfd_a[0] failed");
+    /* attach pipe b to stdout" */
+    if (dup2(pfd_b[1], 1) == -1)
+      error("dup pfd_b[1] failed");
+    execlp("gnugo", "gnugo", "--mode", "gtp", "--quiet", NULL);
+    error("execlp failed");
+  }
+  oracle_exists = 1;
+  /* Attach pipe a to to_gnugo_stream  */
+  to_gnugo_stream = (FILE *) fdopen(pfd_a[1], "w");
+  /* Attach pipe b to from_gnugo_stream */
+  from_gnugo_stream = (FILE *) fdopen(pfd_b[0], "r");
+}
+
+/* load an sgf file */
+
+void
+oracle_loadsgf(char *infilename, char *untilstring)
+{
+  if (untilstring)
+    TELL_ORACLE("loadsgf %s %s\n", infilename, untilstring);
+  else
+    TELL_ORACLE("loadsgf %s\n", infilename);
+  ASK_ORACLE;
+  fflush(to_gnugo_stream);
+  gnugo_line_length = 0;
+}
+
+/* Tell the oracle to go away. */
+
+void
+dismiss_oracle(void)
+{
+  if (oracle_exists)
+    TELL_ORACLE("quit\n");
+  oracle_exists = 0;
+}
+
+/* complain and die! */
+
+void
+error(const char *msg)      
+{
+  fprintf(stderr, "oracle: %s\n", msg);
+  abort();
+}
+
+/* Call trymove in the primary process, and have the oracle actually
+ * play the move.
+ */
+static int 
+oracle_trymove(int pos, int color, const char *message, int str,
+              int komaster, int kom_pos)
+{
+  if (!trymove(pos, color, message, str))
+    return 0;
+  if (debug & DEBUG_ORACLE_STREAM)
+    gfprintf(stderr, "%o%s %1m\n", 
+            color == BLACK ? "black" : "white", pos);
+  gfprintf(to_gnugo_stream, "%o%s %1m\n", 
+          color == BLACK ? "black" : "white", pos);
+  fflush(to_gnugo_stream);
+  ASK_ORACLE;
+  return 1;
+}
+
+/* Undo the move. 
+ */
+static void
+oracle_popgo(void)
+{
+  popgo();
+  TELL_ORACLE("undo\n");
+  ASK_ORACLE;
+}
+
+/* Play the move.
+ */
+
+int
+oracle_play_move(int pos, int color)
+{
+  play_move(pos, color);
+
+  if (debug & DEBUG_ORACLE_STREAM)
+    gfprintf(stderr, "%o%s %1m\n", 
+            color == BLACK ? "black" : "white", pos);
+  gfprintf(to_gnugo_stream, "%o%s %1m\n", 
+          color == BLACK ? "black" : "white", pos);
+  fflush(to_gnugo_stream);
+  ASK_ORACLE;
+  return 1;
+}
+
+/* FIXME: Debugging needed. This variadic function doesn't work right if we
+ * try to pass a const *char argument, like the infilename in
+ * oracle_loadsgf. So for the time being we stick with the variadic macro
+ * TELL_ORACLE.
+ */
+static void
+tell_oracle(const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  if (debug & DEBUG_ORACLE_STREAM) fprintf(stderr, fmt, ap);
+  if (fprintf(to_gnugo_stream, fmt, ap) < 0)
+    error("can't write command in to_gnugo_stream");
+  fflush(to_gnugo_stream);
+  va_end(ap);
+}
+
+/* FIXME: Debugging needed. This variadic function seems a little more
+ * reliable than the corresponding variadic macro ASK_ORACLE.  
+ */
+
+static void
+ask_oracle(void)
+{
+  int line_length = 0;
+  char line[128];
+
+  while (line_length != 1) {
+    if (!fgets(line, 128, from_gnugo_stream))
+      error("can't get response");
+    line_length = strlen(line);
+    if (line_length > 1 
+       && (line[0] == '=' || line[0] == '?'))
+      strncpy(gnugo_line, line, 128);
+    if (debug & DEBUG_ORACLE_STREAM) {
+      fprintf(stderr, line);
+      fflush(stderr);
+    }
+  }
+}
+
+
+/* clear the oracle's board and set the boardsize */
+
+void 
+oracle_clear_board(int boardsize)
+{
+  TELL_ORACLE("boardsize %d\n", boardsize);
+  ASK_ORACLE;
+}
+
+/*** * *** * *** * *** * *** * *** * *** * *** * *** * *** * *** * ***\
+ *              Demonstration: a pattern matcher                     *
+\*** * *** * *** * *** * *** * *** * *** * *** * *** * *** * *** * ***/
+
+/* Call the pattern matcher */
+
+void
+consult_oracle(int color)
+{
+  do_consult_oracle(color);
+}
+
+void
+do_consult_oracle(int color)
+{
+  struct oracle_move_data oracle_moves[MAX_ORACLE_MOVES];
+  int k;
+
+  for (k = 0; k < MAX_ORACLE_MOVES; k++)
+    oracle_moves[k].value = -1;
+  
+  matchpat(oracle_callback, color, &oracle_db, oracle_moves, NULL);
+  for (k = 0; k < MAX_ORACLE_MOVES; k++)
+    if (oracle_moves[k].value > -1) {
+      oracle_trymove(oracle_moves[k].pos, color, oracle_moves[k].reason,
+                    0, 0, NO_MOVE);
+      do_consult_oracle(OTHER_COLOR(color));
+      oracle_popgo();
+    }
+}
+
+static void
+oracle_callback(int anchor, int color, struct pattern *pattern,
+               int ll, void *data)
+{
+  int this_move;
+  struct oracle_move_data *moves = data;
+  UNUSED(color);
+
+  this_move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+  if (within_search_area(this_move))
+    oracle_add_move(moves, this_move, pattern->value, pattern->name);
+  else
+    gprintf("outside the area\n");
+}
+
+/* Add a move to a list */
+
+static void
+oracle_add_move(struct oracle_move_data moves[MAX_ORACLE_MOVES],
+               int this_move, int this_value, const char *this_reason)
+{
+  int k, l;
+  
+  for (k = 0; k < MAX_ORACLE_MOVES; k++)
+    if (moves[k].value == -1
+       || this_value >= moves[k].value)
+      break;
+  for (l = MAX_ORACLE_MOVES-1; l > k; l--) {
+    moves[l].pos = moves[l-1].pos;
+    moves[l].value = moves[l-1].value;
+    moves[l].reason = moves[l-1].reason;
+  }
+  moves[k].pos = this_move;
+  moves[k].value = this_value;
+  moves[k].reason = this_reason;
+}
+
+/*** * *** * *** * *** * *** * *** * *** * *** * *** * *** * *** * ***\
+ *              Demonstration: metamachine                           *
+\*** * *** * *** * *** * *** * *** * *** * *** * *** * *** * *** * ***/
+
+#define FIRST_LEVEL_MOVES 3
+#define SECOND_LEVEL_MOVES 2
+
+static int
+do_metamachine_genmove(int color, int width, float *value);
+
+int
+metamachine_genmove(int color, float *value, int limit_search)
+{
+  int move;
+  int pos;
+
+  if (limit_search) {
+    TELL_ORACLE("limit_search 1\n");
+    ASK_ORACLE;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (within_search_area(pos)) {
+       if (debug & DEBUG_ORACLE_STREAM)
+         gfprintf(stderr, "%oset_search_limit %1m\n", pos);
+       gfprintf(to_gnugo_stream, "%oset_search_limit %1m\n", pos);
+       fflush(to_gnugo_stream);
+       ASK_ORACLE;
+      }        
+  }
+  count_variations = 1;
+  move = do_metamachine_genmove(color, search_width(), value);
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+  return move;
+}
+
+static int
+do_metamachine_genmove(int color, int width, float *value)
+{
+  int k, moves_considered;
+  float move_value[10];
+  float best_score = 0.;
+  int best_move = -1;
+  char *token;
+  int moves[10];
+  float score[10];
+  char delimiters[] = " \t\r\n";
+  char buf[100];
+  int i, j;
+
+  if (color == BLACK)
+    TELL_ORACLE("top_moves_black\n");
+  else
+    TELL_ORACLE("top_moves_white\n");
+  ask_oracle();
+  token = strtok(gnugo_line, delimiters);
+  for (k = 0; k < 10; k++) {
+    moves[k] = PASS_MOVE;
+    move_value[k] = 0.0;
+  }
+  moves_considered = width;
+  if (verbose)
+    dump_stack();
+  for (k = 0; k < moves_considered; k++) {
+    token = strtok(NULL, delimiters);
+    if (!token)
+      break;
+    moves[k] = string_to_location(board_size, token);
+    token = strtok(NULL, delimiters);
+    if (!token)
+      break;
+    sscanf(token, "%f", move_value + k);
+    TRACE("move %d: %1m valued %f\n", k, moves[k], move_value[k]);
+  }
+  /* if we left the loop early, k is the number of valid moves */
+  moves_considered = k;
+  if (moves_considered == 0) {
+    *value = 0.0;
+    return PASS_MOVE;
+  }
+  if (moves_considered == 1) {
+    *value = 1.0;
+    return moves[k];
+  }
+  for (k = 0; k < moves_considered; k++) {
+    if (oracle_trymove(moves[k], color, "", 0, 0, NO_MOVE)) {
+      int new_width = search_width();
+
+      if (new_width == 0) {
+       TELL_ORACLE("experimental_score %s\n", 
+                   color == BLACK ? "black" : "white");
+       ask_oracle();
+       sscanf(gnugo_line, "= %f", score + k);
+      }
+      else {
+       do_metamachine_genmove(OTHER_COLOR(color), new_width, &score[k]);
+      }
+      if (verbose)
+       dump_stack();
+      TRACE("score: %f\n", color == WHITE ? score[k] : -score[k]);
+      sprintf(buf, "value %.2f", color == WHITE ? score[k] : -score[k]);
+      if (sgf_dumptree)
+       sgftreeAddComment(sgf_dumptree, buf);
+      oracle_popgo();
+    }
+    if (best_move == -1
+       || (color == WHITE && score[k] > best_score) 
+       || (color == BLACK && score[k] < best_score)) {
+      best_move = k;
+      best_score = score[k];
+    }
+  }
+  TRACE("best: %f at %1m\n", best_score, moves[best_move]);
+  *value = score[best_move];
+  return moves[best_move];
+}
+
+/* decide how wide to search */
+
+static int
+search_width(void)
+{
+  if (stackp == 0)
+    return 3;
+  else if (stackp == 1)
+    return 2;
+  else
+    return 0;
+}
+
+
+#endif
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/owl.c b/engine/owl.c
new file mode 100644 (file)
index 0000000..646e530
--- /dev/null
@@ -0,0 +1,7182 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * The code in this file implements "Optics With Limit-negotiation (OWL)."
+ *
+ * The life and death code in optics.c, works reasonably well as long as the
+ * position is in a *terminal position*, which we define to be one where there
+ * are no moves left which can expand the eye space, or limit it. In
+ * situations where the dragon is surrounded, yet has room to thrash around a
+ * bit making eyes, a simple application of the graph-based analysis will not
+ * work. Instead, a bit of reading is needed to reach a terminal position.
+ * The defender tries to expand his eyespace, the attacker to limit it, and
+ * when neither finds an effective move, the position is evaluated. We call
+ * this type of life and death reading *Optics With Limit-negotiation* (OWL).
+ *
+ *                             (|__|)
+ *                            (@)(@))
+ *                            |:v:: |
+ *                           (       )
+ *                            \|   |/
+ *                            =#===#=
+ *                            /___/
+ * 
+ *                The owl is noted for its keen vision 
+ *                       and (purported) wisdom.
+ */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "liberty.h"
+#include "readconnect.h"
+#include "patterns.h"
+#include "cache.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+#define MAX_MOVES 3           /* maximum number of branches at each node */
+#define MAX_SEMEAI_MOVES 6    /* semeai branch factor */
+#define MAX_SEMEAI_DEPTH 100  /* Don't read below this depth */
+#define MAX_LUNCHES 10
+#define MAX_GOAL_WORMS 15  /* maximum number of worms in a dragon to be */
+                           /*   cataloged.  NOTE: Must fit in value2 in hashnode! */
+#define MAX_ESCAPE 3  /* After this many escape moves, owl_determine_life is */
+                      /*    not called                                       */
+
+struct local_owl_data {
+  signed char goal[BOARDMAX];
+  signed char boundary[BOARDMAX];
+  /* Same as goal, except never anything is removed from it. */
+  signed char cumulative_goal[BOARDMAX];
+
+  /* FIXME: neighbors[] and escape_values[] are never recomputed.
+   *       Consider moving these arrays from stack to a static or
+   *       dynamic variable so it is not copied around in
+   *       do_push_owl().  Be aware of semeai code though.
+   */
+  signed char neighbors[BOARDMAX];
+
+  signed char escape_values[BOARDMAX];
+  int color;
+
+  struct eye_data my_eye[BOARDMAX];
+  /* array of half-eye data for use during owl reading */
+  struct half_eye_data half_eye[BOARDMAX];
+  
+  int lunch[MAX_LUNCHES];
+  int lunch_attack_code[MAX_LUNCHES];
+  int lunch_attack_point[MAX_LUNCHES];
+  int lunch_defend_code[MAX_LUNCHES];
+  int lunch_defense_point[MAX_LUNCHES];
+  signed char inessential[BOARDMAX];
+  
+  int lunches_are_current; /* If true, owl lunch data is current */  
+
+  signed char safe_move_cache[BOARDMAX];
+
+  /* This is used to organize the owl stack. */
+  struct local_owl_data *restore_from;
+};
+
+
+static int result_certain;
+
+/* Statistics. */
+static int local_owl_node_counter;
+/* Node limitation. */
+static int global_owl_node_counter = 0;
+
+static struct local_owl_data *current_owl_data;
+static struct local_owl_data *other_owl_data;
+
+static int goal_worms_computed = 0;
+static int owl_goal_worm[MAX_GOAL_WORMS];
+
+
+#define MAX_CUTS 5
+
+enum same_dragon_value {
+  SAME_DRAGON_NOT_CONNECTED,
+  SAME_DRAGON_MAYBE_CONNECTED,
+  SAME_DRAGON_CONNECTED,
+  SAME_DRAGON_ALL_CONNECTED
+};
+
+struct matched_pattern_data;
+
+struct owl_move_data {
+  int pos;          /* move coordinate */
+  int value;        /* value */
+  const char *name; /* name of the pattern suggesting the move */
+  /* whether the move extends the dragon or not */
+  enum same_dragon_value same_dragon;
+  int lunch;       /* Position of a lunch, if applicable.*/
+  int escape;       /* true if an escape pattern is matched */
+  int defense_pos;  /* defense coordinate for vital owl attack patterns. */
+  int cuts[MAX_CUTS]; /* strings of the goal that might get cut off */
+  /* pointer to pattern data, used for SAME_DRAGON_ALL_CONNECTED */
+  struct matched_pattern_data *pattern_data;
+};
+
+#define USE_BDIST 1
+
+struct matched_pattern_data {
+  int move;
+  int value;
+  int ll;
+  int anchor;
+#if USE_BDIST
+  int bdist;
+#endif
+  struct pattern *pattern;
+
+  /* To link combinable patterns in chains. */
+  int next_pattern_index;
+};
+  
+struct matched_patterns_list_data {
+  int initialized;
+  int counter;                 /* Number of patterns in the list. */
+  int used;            /* How many patterns have already been used?*/
+  int list_size;       
+  struct matched_pattern_data *pattern_list;
+  int first_pattern_index[BOARDMAX];
+
+  int heap_num_patterns;
+  struct matched_pattern_data **pattern_heap;
+};
+
+void dump_pattern_list(struct matched_patterns_list_data *list);
+
+
+static int do_owl_attack(int str, int *move, int *wormid,
+                        struct local_owl_data *owl, int escape);
+static int do_owl_defend(int str, int *move, int *wormid,
+                        struct local_owl_data *owl, int escape);
+static void owl_shapes(struct matched_patterns_list_data *list,
+                       struct owl_move_data moves[MAX_MOVES], int color,
+                      struct local_owl_data *owl, struct pattern_db *type);
+static void collect_owl_shapes_callbacks(int anchor, int color,
+                                        struct pattern *pattern_db,
+                                        int ll, void *data);
+
+static void pattern_list_prepare(struct matched_patterns_list_data *list);
+static void pattern_list_build_heap(struct matched_patterns_list_data *list);
+static void pattern_list_pop_heap_once(struct matched_patterns_list_data *list);
+static void pattern_list_sink_heap_top_element(struct matched_patterns_list_data
+                                              *list);
+
+static int get_next_move_from_list(struct matched_patterns_list_data *list,
+                                   int color, struct owl_move_data *moves,
+                                  int cutoff, struct local_owl_data *owl);
+static void init_pattern_list(struct matched_patterns_list_data *list);
+static void close_pattern_list(int color,
+                              struct matched_patterns_list_data *list);
+static void owl_shapes_callback(int anchor, int color,
+                               struct pattern *pattern_db,
+                               int ll, void *data);
+static void owl_add_move(struct owl_move_data *moves, int move, int value,
+                        const char *reason,
+                        enum same_dragon_value same_dragon, int lunch,
+                        int escape, int defense_pos, int max_moves,
+                        struct matched_pattern_data *pattern_data);
+static void owl_determine_life(struct local_owl_data *owl,
+                              struct local_owl_data *second_owl,
+                              int does_attack,
+                              struct owl_move_data *moves,
+                              struct eyevalue *probable_eyes,
+                              int *eyemin, int *eyemax);
+static void owl_find_relevant_eyespaces(struct local_owl_data *owl,
+                                       int mw[BOARDMAX], int mz[BOARDMAX]);
+static int owl_estimate_life(struct local_owl_data *owl,
+                            struct local_owl_data *second_owl,
+                            struct owl_move_data vital_moves[MAX_MOVES],
+                            const char **live_reason,
+                            int does_attack,
+                            struct eyevalue *probable_eyes,
+                            int *eyemin, int *eyemax);
+static int modify_stupid_eye_vital_point(struct local_owl_data *owl,
+                                        int *vital_point,
+                                        int is_attack_point);
+static int modify_eyefilling_move(int *move, int color);
+static int estimate_lunch_half_eye_bonus(int lunch,
+                       struct half_eye_data half_eye[BOARDMAX]);
+static void owl_mark_dragon(int apos, int bpos,
+                           struct local_owl_data *owl,
+                           int new_dragons[BOARDMAX]);
+static void owl_mark_worm(int apos, int bpos,
+                         struct local_owl_data *owl);
+static void owl_mark_boundary(struct local_owl_data *owl);
+static void owl_update_goal(int pos, enum same_dragon_value same_dragon,
+                           int lunch, struct local_owl_data *owl,
+                           int semeai_call,
+                           struct matched_pattern_data *pattern_data);
+static void owl_test_cuts(signed char goal[BOARDMAX], int color,
+                         int cuts[MAX_CUTS]);
+static void componentdump(const signed char component[BOARDMAX]);
+static void owl_update_boundary_marks(int pos, struct local_owl_data *owl);
+static void owl_find_lunches(struct local_owl_data *owl);
+static int improve_lunch_attack(int lunch, int attack_point);
+static int improve_lunch_defense(int lunch, int defense_point);
+static void owl_make_domains(struct local_owl_data *owla,
+                            struct local_owl_data *owlb);
+static int owl_safe_move(int move, int color);
+static void sniff_lunch(int lunch, int *min, int *probable, int *max,
+                       struct local_owl_data *owl);
+static void eat_lunch_escape_bonus(int lunch, int *min, int *probable,
+                                  int *max, struct local_owl_data *owl);
+static int select_new_goal_origin(int origin, struct local_owl_data *owl);
+static void compute_owl_escape_values(struct local_owl_data *owl);
+static int owl_escape_route(struct local_owl_data *owl);
+static void do_owl_analyze_semeai(int apos, int bpos, 
+                                 struct local_owl_data *owla,
+                                 struct local_owl_data *owlb,
+                                 int *resulta, int *resultb,
+                                 int *move, int pass, int owl_phase);
+static int semeai_trymove_and_recurse(int apos, int bpos,
+                                     struct local_owl_data *owla,
+                                     struct local_owl_data *owlb,
+                                     int owl_phase,
+                                     int move, int color, int ko_allowed,
+                                     int move_value, const char *move_name,
+                                     enum same_dragon_value same_dragon,
+                                     struct matched_pattern_data *pattern_data,
+                                     int lunch, int *semeai_move,
+                                     int *this_resulta, int *this_resultb);
+static void semeai_add_sgf_comment(int value, int owl_phase);
+static int semeai_trust_tactical_attack(int str);
+static int semeai_propose_eyespace_filling_move(struct local_owl_data *owla,
+                                               struct local_owl_data *owlb);
+static void semeai_review_owl_moves(struct owl_move_data owl_moves[MAX_MOVES],
+                                   struct local_owl_data *owla,
+                                   struct local_owl_data *owlb, int color,
+                                   int *safe_outside_liberty_found,
+                                   int *safe_common_liberty_found,
+                                   int *riskless_move_found,
+                                   signed char mw[BOARDMAX],
+                                   struct owl_move_data semeai_moves[MAX_SEMEAI_MOVES],
+                                   int guess_same_dragon, int value_bonus,
+                                   int *critical_semeai_worms);
+static int semeai_move_value(int move, struct local_owl_data *owla,
+                            struct local_owl_data *owlb, int raw_value,
+                            int *critical_semeai_worms);
+static int semeai_is_riskless_move(int move, struct local_owl_data *owla);
+static void remove_eye_filling_moves(struct local_owl_data *our_owl,
+                                    struct owl_move_data *moves);
+static int find_semeai_backfilling_move(int worm, int liberty);
+static int liberty_of_goal(int pos, struct local_owl_data *owl);
+static int second_liberty_of_goal(int pos, struct local_owl_data *owl);
+static int matches_found;
+static signed char found_matches[BOARDMAX];
+
+static void reduced_init_owl(struct local_owl_data **owl,
+                            int at_bottom_of_stack);
+static void init_owl(struct local_owl_data **owl, int target1, int target2,
+                    int move, int use_stack, int new_dragons[BOARDMAX]);
+
+static struct local_owl_data *owl_stack[2 * MAXSTACK];
+static int owl_stack_size = 0;
+static int owl_stack_pointer = 0;
+static void check_owl_stack_size(void);
+static void push_owl(struct local_owl_data **owl);
+static void do_push_owl(struct local_owl_data **owl);
+static void pop_owl(struct local_owl_data **owl);
+
+#if 0
+static int catalog_goal(struct local_owl_data *owl,
+                       int goal_worm[MAX_GOAL_WORMS]);
+#endif
+
+static int list_goal_worms(struct local_owl_data *owl,
+                          int goal_worm[MAX_GOAL_WORMS]);
+
+/* FIXME: taken from move_reasons.h */
+#define MAX_DRAGONS       2 * MAX_BOARD * MAX_BOARD / 3
+
+static int dragon_goal_worms[MAX_DRAGONS][MAX_GOAL_WORMS];
+
+static void
+prepare_goal_list(int str, struct local_owl_data *owl,
+                 int list[MAX_GOAL_WORMS], int *flag, int *kworm,
+                 int do_list);
+static void
+finish_goal_list(int *flag, int *wpos, int list[MAX_GOAL_WORMS], int index);
+
+
+/* Semeai worms are worms whose capture wins the semeai. */
+
+#define MAX_SEMEAI_WORMS 20
+static int s_worms = 0;
+static int semeai_worms[MAX_SEMEAI_WORMS];
+static int important_semeai_worms[MAX_SEMEAI_WORMS];
+
+/* Whether one color prefers to get a ko over a seki. */
+static int prefer_ko;
+
+/* Usually it's a bad idea to include the opponent worms involved in
+ * the semeai in the eyespace. For some purposes (determining a
+ * definite lack of eyespace, finding certain vital moves), however,
+ * we want to do that anyway. Then set this variable to 1 before
+ * calling owl_estimate_life() and reset it afterwards.
+ *
+ * FIXME: We should implement a nicer mechanism to propagate this
+ *        information to owl_lively(), where it's used.
+ */
+static int include_semeai_worms_in_eyespace = 0;
+
+
+
+static void
+clear_cut_list(int cuts[MAX_CUTS])
+{
+  int i;
+  for (i = 0; i < MAX_CUTS; i++)
+    cuts[i] = NO_MOVE;
+}
+
+
+
+/* Called when (apos) and (bpos) point to adjacent dragons
+ * of the opposite color, both with matcher_status DEAD or
+ * CRITICAL, analyzes the semeai, assuming that the player
+ * of the (apos) dragon moves first. The results returned
+ * by *resulta and *resultb are the results of the defense 
+ * of the apos dragon and the attack of the bpos dragon,
+ * respectively. Thus if these results are 1 and 0,
+ * respectively, the usual meaning is that a move by the
+ * apos player produces seki.
+ *
+ * owl determines whether owl moves are being generated
+ * or simple liberty filling is taking place.
+ *
+ */
+
+void
+owl_analyze_semeai(int apos, int bpos, int *resulta, int *resultb,
+                  int *semeai_move, int owl, int *semeai_result_certain)
+{
+  owl_analyze_semeai_after_move(PASS_MOVE, EMPTY, apos, bpos, resulta, resultb,
+                               semeai_move, owl, semeai_result_certain, 0);
+}
+
+/* Same as the function above with the addition that an arbitrary move
+ * may be made before the analysis is performed.
+ */
+void
+owl_analyze_semeai_after_move(int move, int color, int apos, int bpos,
+                             int *resulta, int *resultb, int *semeai_move, 
+                             int owl, int *semeai_result_certain,
+                             int recompute_dragons)
+{
+  signed char ms[BOARDMAX];
+  int w1, w2;
+  int str;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_verbose = verbose;
+  int dummy_resulta;
+  int dummy_resultb;
+  int dummy_semeai_move;
+  double start = 0.0;
+  int reading_nodes_when_called = get_reading_node_counter();
+  int nodes_used;
+  int new_dragons[BOARDMAX];
+  
+  struct local_owl_data *owla;
+  struct local_owl_data *owlb;
+  Hash_data goal_hash;
+  
+  if (!resulta)
+    resulta = &dummy_resulta;
+  if (!resultb)
+    resultb = &dummy_resultb;
+  if (!semeai_move)
+    semeai_move = &dummy_semeai_move;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  if (recompute_dragons) {
+    if (tryko(move, color, "Recompute dragons for semeai.")) {
+      compute_new_dragons(new_dragons);
+      popgo();
+    }
+    else
+      recompute_dragons = 0;
+  }
+  
+  
+  /* Look for owl substantial worms of either dragon adjoining
+   * the other dragon. Capturing such a worm wins the semeai.
+   * These are the semeai_worms. This code must come before
+   * the owl_init() calls because the owl_substantial
+   *
+   * FIXME: The sentence above is unfinished.
+   */
+  s_worms = 0;
+  memset(ms, 0, sizeof(ms));
+  for (w1 = first_worm_in_dragon(apos);
+       w1 != NO_MOVE;
+       w1 = next_worm_in_dragon(w1)) {
+    for (w2 = first_worm_in_dragon(bpos);
+        w2 != NO_MOVE;
+        w2 = next_worm_in_dragon(w2)) {
+      if (adjacent_strings(w1, w2) || have_common_lib(w1, w2, NULL)) {
+       mark_string(w1, ms, 1);
+       mark_string(w2, ms, 1);
+      }
+    }
+  }
+
+
+  
+  sgf_dumptree = NULL;
+  if (verbose > 0)
+    verbose--;
+  for (str = BOARDMIN; str < BOARDMAX; str++) 
+    if (ON_BOARD(str) && ms[str] && worm[str].origin == str) {
+      int adj;
+      int adjs[MAXCHAIN];
+      int k;
+      int adjacent_to_outside = 0;
+
+      /* Is the string adjacent to a living dragon outside the semeai?
+       * In that case it's important to attack/defend it for the life
+       * of the opponent.
+       *
+       * FIXME: Checking crude_status here isn't quite appropriate but
+       * owl_status is not always computed and status itself is unsafe
+       * since it might change before later calls to this code, e.g.
+       * when checking for blunders.
+       *
+       * Not checking for aliveness at all gives problems in e.g.
+       * ld_owl:302 where S19 is a separate dragon and R19 should not
+       * be considered critically important. What we really would like
+       * to determine is whether it's outside the semeai, however.
+       */
+      adj = chainlinks(str, adjs);
+      for (k = 0; k < adj; k++) {
+       if (!is_same_dragon(adjs[k], apos)
+           && !is_same_dragon(adjs[k], bpos)
+           && dragon[adjs[k]].crude_status == ALIVE)
+         adjacent_to_outside = 1;
+      }
+      
+      if ((adjacent_to_outside || countstones(str) > 6)
+         && s_worms < MAX_SEMEAI_WORMS) {
+       important_semeai_worms[s_worms] = 1;
+       semeai_worms[s_worms++] = str;
+       DEBUG(DEBUG_SEMEAI, "important semeai worm: %1m\n", str);
+      }
+      else if (owl_substantial(str) && s_worms < MAX_SEMEAI_WORMS) {
+       important_semeai_worms[s_worms] = 0;
+       semeai_worms[s_worms++] = str;
+       DEBUG(DEBUG_SEMEAI, "semeai worm: %1m\n", str);
+      }
+    }
+  verbose = save_verbose;
+  sgf_dumptree = save_sgf_dumptree;
+
+  ASSERT1(board[apos] == OTHER_COLOR(board[bpos]), apos);
+  count_variations = 1;
+  if (move == PASS_MOVE)
+    DEBUG(DEBUG_SEMEAI, "owl_analyze_semeai: %1m vs. %1m\n", apos, bpos);
+  else
+    DEBUG(DEBUG_SEMEAI, "owl_analyze_semeai_after_move %C %1m: %1m vs. %1m\n",
+         color, move, apos, bpos);
+  
+  if (owl) {
+    if (recompute_dragons) {
+      init_owl(&owla, apos, NO_MOVE, NO_MOVE, 1, new_dragons);
+      init_owl(&owlb, bpos, NO_MOVE, NO_MOVE, 0, new_dragons);
+    }
+    else {
+      init_owl(&owla, apos, NO_MOVE, NO_MOVE, 1, NULL);
+      init_owl(&owlb, bpos, NO_MOVE, NO_MOVE, 0, NULL);
+    }
+    owl_make_domains(owla, owlb);
+  }
+  else {
+    reduced_init_owl(&owla, 1);
+    reduced_init_owl(&owlb, 0);
+    local_owl_node_counter = 0;
+    owl_mark_worm(apos, NO_MOVE, owla);
+    owl_mark_worm(bpos, NO_MOVE, owlb);
+  }
+
+  result_certain = 1;
+
+  {
+    Hash_data temp = goal_to_hashvalue(owla->goal);
+    goal_hash = goal_to_hashvalue(owlb->goal);
+    hashdata_xor(goal_hash, temp);
+  }
+  if (owl
+      && search_persistent_semeai_cache(ANALYZE_SEMEAI,
+                                       apos, bpos, move, color, &goal_hash,
+                                       resulta, resultb, semeai_move,
+                                       semeai_result_certain)) {
+    if (move == PASS_MOVE) {
+      DEBUG(DEBUG_OWL_PERFORMANCE,
+           "analyze_semeai %1m vs. %1m, result %d %d %1m (cached)\n",
+           apos, bpos, *resulta, *resultb, *semeai_move);
+    }
+    else {
+      DEBUG(DEBUG_OWL_PERFORMANCE,
+           "analyze_semeai_after_move %C %1m: %1m vs. %1m, result %d %d %1m (cached)\n",
+           color, move, apos, bpos, *resulta, *resultb, *semeai_move);
+    }
+    return;
+  }
+
+  /* In some semeai situations one or both players have the option to
+   * choose between seki and ko for the life and death of both. In
+   * general this choice depends on the ko threat situation, the
+   * overall score, and the strategical effects on surrounding
+   * dragons, but we don't try to correctly estimate this. Instead we
+   * make the reasonable assumption that if one dragon is
+   * substantially smaller than the other dragon, ko is to be
+   * preferred for the smaller dragon and seki for the larger dragon.
+   *
+   * prefer_ko can be either WHITE, BLACK, or EMPTY and tells which
+   * color, if any, prefers to get ko.
+   */
+  if (dragon[apos].size <= 5 && dragon[bpos].size > 3 * dragon[apos].size)
+    prefer_ko = board[apos];
+  else if (dragon[bpos].size <= 5 && dragon[apos].size > 3 * dragon[bpos].size)
+    prefer_ko = board[bpos];
+  else
+    prefer_ko = EMPTY;
+  
+  if (move == PASS_MOVE)
+    do_owl_analyze_semeai(apos, bpos, owla, owlb,
+                         resulta, resultb, semeai_move, 0, owl);
+  else {
+    semeai_trymove_and_recurse(bpos, apos, owlb, owla, owl,
+                              move, color, 1, 0, "mandatory move",
+                              SAME_DRAGON_MAYBE_CONNECTED, NULL, NO_MOVE,
+                              semeai_move, resultb, resulta);
+    *resulta = REVERSE_RESULT(*resulta);
+    *resultb = REVERSE_RESULT(*resultb);
+  }
+
+  nodes_used = get_reading_node_counter() - reading_nodes_when_called;
+  if (move == PASS_MOVE) {
+    DEBUG(DEBUG_OWL_PERFORMANCE,
+         "analyze_semeai %1m vs. %1m, result %d %d %1m (%d, %d nodes, %f seconds)\n",
+         apos, bpos, *resulta, *resultb, *semeai_move, local_owl_node_counter,
+         nodes_used, gg_cputime() - start);
+  }
+  else {
+    DEBUG(DEBUG_OWL_PERFORMANCE,
+         "analyze_semeai_after_move %C %1m: %1m vs. %1m, result %d %d %1m (%d, %d nodes, %f seconds)\n",
+         color, move, apos, bpos, *resulta, *resultb, *semeai_move,
+         local_owl_node_counter,
+         nodes_used, gg_cputime() - start);
+  }
+  
+  if (semeai_result_certain)
+    *semeai_result_certain = result_certain;
+
+  if (owl)
+    store_persistent_semeai_cache(ANALYZE_SEMEAI, apos, bpos, move, color,
+                                 &goal_hash,
+                                 *resulta, *resultb, *semeai_move,
+                                 result_certain, nodes_used,
+                                 owla->goal, owlb->goal);
+}
+
+
+
+/* It is assumed that the 'a' player moves first, and
+ * determines the best result for both players. The
+ * parameter "pass" is 1 if the opponent's last move is
+ * pass. In this case, if no move is found but the genus
+ * is less than 2, then the position is declared seki.
+ *
+ * If a move is needed to get this result, then (*move) is
+ * the location, otherwise this field returns PASS.
+ */
+
+static void
+do_owl_analyze_semeai(int apos, int bpos, 
+                     struct local_owl_data *owla,
+                     struct local_owl_data *owlb,
+                     int *resulta, int *resultb,
+                     int *move, int pass, int owl_phase)
+{
+  int color = board[apos];
+  int other = OTHER_COLOR(color);
+#if 0
+  int wormsa, wormsb;
+  int goal_wormsa[MAX_GOAL_WORMS], goal_wormsb[MAX_GOAL_WORMS];
+#endif
+  struct owl_move_data vital_defensive_moves[MAX_MOVES];
+  struct owl_move_data vital_offensive_moves[MAX_MOVES];
+  struct owl_move_data shape_defensive_moves[MAX_MOVES];
+  struct owl_move_data shape_offensive_moves[MAX_MOVES];
+  struct matched_patterns_list_data shape_offensive_patterns;
+  struct matched_patterns_list_data shape_defensive_patterns;
+  struct owl_move_data moves[MAX_SEMEAI_MOVES];
+  struct owl_move_data outside_liberty;
+  struct owl_move_data common_liberty;
+  struct owl_move_data backfill_outside_liberty;
+  struct owl_move_data backfill_common_liberty;
+  int safe_outside_liberty_found = 0;
+  int safe_common_liberty_found = 0;
+  int riskless_move_found = 0;
+  signed char mw[BOARDMAX];  
+  int k;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int move_value;
+  int best_resulta = 0;
+  int best_resultb = 0;
+  int best_move = 0;
+  const char *best_move_name = NULL;
+  int this_resulta = -1;
+  int this_resultb = -1;
+  int xpos;
+  int value1;
+  int value2;
+  int this_variation_number = count_variations - 1;
+  int you_look_alive = 0;
+  int I_look_alive = 0;
+  int dummy_move;
+  int tested_moves;
+  int critical_semeai_worms[MAX_SEMEAI_WORMS];
+  int sworm;
+  int we_might_be_inessential;
+  struct eyevalue probable_eyes_a;
+  struct eyevalue probable_eyes_b;
+  struct eyevalue dummy_eyes;
+  int I_have_more_eyes;
+  
+  SETUP_TRACE_INFO2("do_owl_analyze_semeai", apos, bpos);
+
+  if (!move)
+    move = &dummy_move;
+  
+  ASSERT1(board[apos] == owla->color, apos);
+  ASSERT1(board[bpos] == owlb->color, bpos);
+
+  apos = find_origin(apos);
+  bpos = find_origin(bpos);
+
+  if (stackp <= semeai_branch_depth
+      && owl_phase
+      && tt_get(&ttable, SEMEAI, apos, bpos, depth - stackp, NULL,
+               &value1, &value2, &xpos) == 2) {
+    TRACE_CACHED_RESULT2(value1, value2, xpos);
+    *move = xpos;
+      
+    *resulta = value1;
+    *resultb = value2;
+
+    TRACE("%oVariation %d: %1m %1m %s %s %1m (cached) ",
+         this_variation_number, apos, bpos,
+         result_to_string(*resulta),
+         result_to_string(*resultb),
+         *move);
+    SGFTRACE_SEMEAI(xpos, *resulta, *resultb, "cached");
+    return;
+  }
+
+  global_owl_node_counter++;
+  local_owl_node_counter++;
+
+  shape_offensive_patterns.initialized = 0;
+  shape_defensive_patterns.initialized = 0;
+  
+#if 0
+  wormsa = catalog_goal(owla, goal_wormsa);
+  wormsb = catalog_goal(owlb, goal_wormsb);
+#endif
+  
+  outside_liberty.pos = NO_MOVE;
+  common_liberty.pos = NO_MOVE;
+  backfill_outside_liberty.pos = NO_MOVE;
+  backfill_common_liberty.pos = NO_MOVE;
+  for (k = 0; k < MAX_SEMEAI_MOVES; k++) {
+    moves[k].pos = 0;
+    moves[k].value = -1;
+    moves[k].name = NULL;
+    moves[k].same_dragon = SAME_DRAGON_CONNECTED;
+    moves[k].lunch = NO_MOVE;
+    clear_cut_list(moves[k].cuts);
+  }
+  ASSERT1(other == board[bpos], bpos);
+  memset(mw, 0, sizeof(mw));
+
+  /* Turn off the sgf file and variation counting. */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  
+  /* Look for a tactical attack. We seek a semeai worm of owlb which
+   * can be attacked. If such exists and is considered critical, we
+   * declare victory. If it's not considered critical we add the
+   * attacking move as a high priority move to try.
+   */
+
+  {
+    int upos;
+    
+    for (sworm = 0; sworm < s_worms; sworm++) {
+      critical_semeai_worms[sworm] = 0;
+      if (board[semeai_worms[sworm]] == other) {
+       int acode = attack(semeai_worms[sworm], &upos);
+       if (acode == WIN
+           && semeai_trust_tactical_attack(semeai_worms[sworm])
+           && important_semeai_worms[sworm]) {
+         *resulta = WIN;
+         *resultb = WIN;
+         *move = upos;
+         sgf_dumptree = save_sgf_dumptree;
+         count_variations = save_count_variations;
+         SGFTRACE_SEMEAI(upos, WIN, WIN, "tactical win found");
+         READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                            move, upos, WIN, WIN);
+       }
+       else if (acode != 0
+                && find_defense(semeai_worms[sworm], NULL)) {
+         critical_semeai_worms[sworm] = 1;
+         owl_add_move(moves, upos, 105, "attack semeai worm",
+                      SAME_DRAGON_MAYBE_CONNECTED,
+                      NO_MOVE, 0, NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+         TRACE("Added %1m %d (-1)\n", upos, 105);
+       }
+       else if (acode == WIN
+                && important_semeai_worms[sworm]) {
+         owl_add_move(moves, upos, 100, "attack semeai worm",
+                      SAME_DRAGON_MAYBE_CONNECTED,
+                      NO_MOVE, 0, NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+         TRACE("Added %1m %d (-1)\n", upos, 100);
+       }
+      }
+    }
+    /* Look for a tactical rescue. If a semeai worm of owla is tactically
+     * threatened, try to save it.
+     */
+
+    we_might_be_inessential = 1;
+    for (sworm = 0; sworm < s_worms; sworm++)
+      if (board[semeai_worms[sworm]] == color) {
+       if (important_semeai_worms[sworm])
+         we_might_be_inessential = 0;
+       
+       if (attack(semeai_worms[sworm], NULL)
+           && find_defense(semeai_worms[sworm], &upos)) {
+         critical_semeai_worms[sworm] = 1;
+         owl_add_move(moves, upos, 85, "defend semeai worm",
+                      SAME_DRAGON_MAYBE_CONNECTED, NO_MOVE,
+                      0, NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+         TRACE("Added %1m %d (0)\n", upos, 85);
+       }
+      }
+  }
+
+  /* We generate the candidate moves. During the early stages of
+   * the semeai, there may be moves to expand or shrink the
+   * eyespaces of the two dragons. During the later stages, the
+   * picture is simplified and reading the semeai is a matter 
+   * of filling liberties until one of the dragons may be removed,
+   * or a seki results. The first stage we call the owl phase.
+   */
+  if (!owl_phase) {
+    set_eyevalue(&probable_eyes_a, 0, 0, 0, 0);
+    set_eyevalue(&probable_eyes_b, 0, 0, 0, 0);
+    I_have_more_eyes = 0;
+  }
+  else {
+    /* First the vital moves. These include moves to attack or
+     * defend the eyespace (e.g. nakade, or hane to reduce the
+     * number of eyes) or moves to capture a lunch. 
+     */
+    int eyemin_a;
+    int eyemin_b;
+    int eyemax_a;
+    int eyemax_b;
+    const char *live_reasona;
+    const char *live_reasonb;
+    
+    /* We do not wish for any string of the 'b' dragon to be 
+     * counted as a lunch of the 'a' dragon since owl_determine_life 
+     * can give a wrong result in the case of a semeai. So we eliminate 
+     * such lunches.
+     */
+    
+    owl_find_lunches(owla);
+    owl_find_lunches(owlb);
+    for (k = 0; k < MAX_LUNCHES; k++) {
+      if (owla->lunch[k] != NO_MOVE 
+         && owlb->goal[owla->lunch[k]]) {
+       owla->lunch[k] = NO_MOVE;
+      }
+    }
+#if 1
+    for (k = 0; k < MAX_LUNCHES; k++) {
+      if (owlb->lunch[k] != NO_MOVE 
+         && owla->goal[owlb->lunch[k]]) {
+       owlb->lunch[k] = NO_MOVE;
+      }
+    }
+#endif
+
+    if (owl_estimate_life(owla, owlb, vital_defensive_moves,
+                         &live_reasona, 0, &probable_eyes_a,
+                         &eyemin_a, &eyemax_a))
+      I_look_alive = 1;
+    else if (stackp > 2 && owl_escape_route(owla) >= 5) {
+      live_reasona = "escaped";
+      I_look_alive = 1;
+    }
+
+    if (owl_estimate_life(owlb, owla, vital_offensive_moves,
+                         &live_reasonb, 1, &probable_eyes_b,
+                         &eyemin_b, &eyemax_b))
+      you_look_alive = 1;
+    else if (stackp > 2 && owl_escape_route(owlb) >= 5) {
+      live_reasonb = "escaped";
+      you_look_alive = 1;
+    }
+    
+    if (verbose) {
+      gprintf("probable_eyes_a: %s eyemin: %d eyemax: %d",
+             eyevalue_to_string(&probable_eyes_a), eyemin_a, eyemax_a);
+      if (I_look_alive)
+       gprintf("%o I look alive (%s)", live_reasona);
+      gprintf("%o\n");
+      gprintf("probable_eyes_b: %s eyemin: %d eyemax: %d",
+             eyevalue_to_string(&probable_eyes_b), eyemin_b, eyemax_b);
+      if (you_look_alive)
+       gprintf("%o you look alive(%s)", live_reasonb);
+      gprintf("%o\n");
+    }
+
+    /* Stop here if both look certain to live. */
+    if (I_look_alive && you_look_alive) {
+      *resulta = WIN;
+      *resultb = 0;
+      *move = PASS_MOVE;
+      sgf_dumptree = save_sgf_dumptree;
+      count_variations = save_count_variations;
+      TRACE("Both live\n");
+      SGFTRACE_SEMEAI(PASS_MOVE, WIN, 0, "Both live");
+      READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                        move, PASS_MOVE, WIN, 0);
+    }
+    
+    /* Next the shape moves. */
+    if (!I_look_alive) {
+      owl_shapes(&shape_defensive_patterns, shape_defensive_moves, color,
+                owla, &owl_defendpat_db);
+      for (k = 0; k < MAX_MOVES-1; k++)
+       if (!get_next_move_from_list(&shape_defensive_patterns, color,
+                                    shape_defensive_moves, 1, owla))
+         break;
+    }
+    else
+      shape_defensive_moves[0].pos = NO_MOVE;
+
+    if (!you_look_alive) {
+      owl_shapes(&shape_offensive_patterns, shape_offensive_moves, color,
+                owlb, &owl_attackpat_db);
+      for (k = 0; k < MAX_MOVES-1; k++)
+       if (!get_next_move_from_list(&shape_offensive_patterns, color,
+                                    shape_offensive_moves, 1, owlb))
+         break;
+    }
+    else
+      shape_offensive_moves[0].pos = NO_MOVE;
+
+    /* Filter out moves, which fill our eye (and not split it). */
+    if (eyemax_a > 0) {
+      remove_eye_filling_moves(owla, vital_defensive_moves);
+      remove_eye_filling_moves(owla, vital_offensive_moves);
+      remove_eye_filling_moves(owla, shape_defensive_moves);
+      remove_eye_filling_moves(owla, shape_offensive_moves);
+    }
+
+    /* Now we review the moves already considered, while collecting
+     * them into a single list. 
+     */
+
+    if (!I_look_alive) {
+      semeai_review_owl_moves(vital_defensive_moves, owla, owlb, color,
+                             &safe_outside_liberty_found,
+                             &safe_common_liberty_found,
+                             &riskless_move_found,
+                             mw, moves, 0, 30,
+                             critical_semeai_worms);
+      
+      semeai_review_owl_moves(shape_defensive_moves, owla, owlb, color,
+                             &safe_outside_liberty_found,
+                             &safe_common_liberty_found,
+                             &riskless_move_found,
+                             mw, moves, 0, 0,
+                             critical_semeai_worms);
+    }
+
+    if (!you_look_alive) {
+      semeai_review_owl_moves(vital_offensive_moves, owla, owlb, color,
+                             &safe_outside_liberty_found,
+                             &safe_common_liberty_found,
+                             &riskless_move_found,
+                             mw, moves, 1, 30,
+                             critical_semeai_worms);
+      
+      semeai_review_owl_moves(shape_offensive_moves, owla, owlb, color,
+                             &safe_outside_liberty_found,
+                             &safe_common_liberty_found,
+                             &riskless_move_found,
+                             mw, moves, 1, 0,
+                             critical_semeai_worms);
+    }
+
+    /* If no moves were found so far, also check the eyespaces when
+     * opponent semeai worms are allowed to be included for vital
+     * moves.
+     */
+    if (moves[0].pos == NO_MOVE || we_might_be_inessential) {
+      include_semeai_worms_in_eyespace = 1;
+      if (!owl_estimate_life(owlb, owla, vital_offensive_moves,
+                            &live_reasonb, 1, &dummy_eyes,
+                            &eyemin_b, &eyemax_b))
+       semeai_review_owl_moves(vital_offensive_moves, owla, owlb, color,
+                               &safe_outside_liberty_found,
+                               &safe_common_liberty_found,
+                               &riskless_move_found,
+                               mw, moves, 1, 30,
+                               critical_semeai_worms);
+      include_semeai_worms_in_eyespace = 0;
+    }
+
+    if (eyemin_a == eyemax_a)
+      /* We have stable number of eyes, so we can try to reduce
+       * opponent eyes.
+       */
+      I_have_more_eyes = (eyemin_a > min_eyes(&probable_eyes_b));
+    else {
+      if (min_eyes(&probable_eyes_a) == max_eyes(&probable_eyes_a))
+        /* If we can't increase our number of eyes, we try to reduce
+        * opponent eyes.
+        */
+        I_have_more_eyes = (max_eyes(&probable_eyes_a) > min_eyes(&probable_eyes_b));
+      else
+        /* If we can increase our number of eyes, we do it and let
+        * opponent to increase his.
+        */
+        I_have_more_eyes = (max_eyes(&probable_eyes_a) > max_eyes(&probable_eyes_b));
+    }
+
+    if (get_level() < 8) {
+      /* If no owl moves were found on two consecutive moves,
+       * turn off the owl phase.
+       */
+      if (moves[0].pos == NO_MOVE) {
+       if (owl_phase == 1)
+         owl_phase = 2;
+       else if (owl_phase == 2)
+         owl_phase = 0;
+      }
+      else
+       owl_phase = 1;
+    }
+  }
+
+  if (1 && verbose) {
+    showboard(0);
+    goaldump(owla->goal);
+    goaldump(owlb->goal);
+  }
+  
+  /* Now we look for a move to fill a liberty. This is only
+   * interesting if the opponent doesn't already have two eyes.
+   * If we have more eyes, always check for a backfilling move.
+   */
+  if (!you_look_alive
+      && !safe_outside_liberty_found
+      && (moves[0].value < 110 || I_have_more_eyes)) {
+    int pos;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+      
+      if (board[pos] == EMPTY && !mw[pos]) {
+       if (liberty_of_goal(pos, owlb)) {
+         if (!liberty_of_goal(pos, owla)) {
+           /* outside liberty */
+           if (safe_move(pos, color) == WIN) {
+             safe_outside_liberty_found = 1;
+             outside_liberty.pos = pos;
+             break;
+           }
+           else if (backfill_outside_liberty.pos == NO_MOVE)
+             backfill_outside_liberty.pos = find_semeai_backfilling_move(bpos,
+                                                                         pos);
+         }
+         else {
+           /* common liberty */
+           if (safe_move(pos, color) == WIN) {
+             safe_common_liberty_found = 1;
+             common_liberty.pos = pos;
+           }
+           else if (backfill_common_liberty.pos == NO_MOVE)
+             backfill_common_liberty.pos = find_semeai_backfilling_move(bpos,
+                                                                        pos);
+         }
+       }
+      }
+    }
+  }
+
+  /* Add the best liberty filling move available. We first want to
+   * play outer liberties, second backfilling moves required before
+   * filling an outer liberty. If no such moves are available we try
+   * to fill a mutual liberty or play a corresponding backfilling
+   * move.
+   */
+  if (!you_look_alive) {
+    if (safe_outside_liberty_found
+       && outside_liberty.pos != NO_MOVE) {
+      move_value = semeai_move_value(outside_liberty.pos,
+                                    owla, owlb, 50,
+                                    critical_semeai_worms);
+      owl_add_move(moves, outside_liberty.pos, move_value,
+                  "safe outside liberty", SAME_DRAGON_NOT_CONNECTED,
+                  NO_MOVE, 0, NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+      riskless_move_found = 1;
+      TRACE("Added %1m %d (5)\n", outside_liberty.pos, move_value);
+    }
+    else if (backfill_outside_liberty.pos != NO_MOVE) {
+      move_value = semeai_move_value(backfill_outside_liberty.pos,
+                                    owla, owlb, 50,
+                                    critical_semeai_worms);
+      owl_add_move(moves, backfill_outside_liberty.pos, move_value,
+                  "backfilling move", SAME_DRAGON_NOT_CONNECTED, NO_MOVE, 0,
+                  NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+      riskless_move_found = 1;
+      TRACE("Added %1m %d (6)\n", backfill_outside_liberty.pos, move_value);
+    }
+    else if (safe_common_liberty_found
+            && common_liberty.pos != NO_MOVE) {
+      move_value = semeai_move_value(common_liberty.pos,
+                                    owla, owlb, 10,
+                                    critical_semeai_worms);
+      owl_add_move(moves, common_liberty.pos, move_value,
+                  "safe common liberty", SAME_DRAGON_MAYBE_CONNECTED,
+                  NO_MOVE, 0, NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+      if (semeai_is_riskless_move(common_liberty.pos, owla))
+       riskless_move_found = 1;
+      TRACE("Added %1m %d (7)\n", common_liberty.pos, move_value);
+    }
+    else if (backfill_common_liberty.pos != NO_MOVE) {
+      move_value = semeai_move_value(backfill_common_liberty.pos,
+                                    owla, owlb, 10,
+                                    critical_semeai_worms);
+      owl_add_move(moves, backfill_common_liberty.pos, move_value,
+                  "backfilling move", SAME_DRAGON_NOT_CONNECTED, NO_MOVE, 0,
+                  NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+      if (semeai_is_riskless_move(backfill_common_liberty.pos, owla))
+       riskless_move_found = 1;
+      TRACE("Added %1m %d (6)\n", backfill_common_liberty.pos, move_value);
+    }
+  }
+
+  if (moves[0].pos == NO_MOVE) {
+    /* If no move has been found yet, see if we can fill opponent's
+     * eye (i.e. put more stones in "bulky five" shape).
+     */
+    if (min_eyes(&probable_eyes_b) == 1) {
+      int move = semeai_propose_eyespace_filling_move(owla, owlb);
+
+      if (move) {
+       owl_add_move(moves, move, 70, "eyespace filling",
+                    SAME_DRAGON_NOT_CONNECTED, NO_MOVE,
+                    0, NO_MOVE, MAX_SEMEAI_MOVES, NULL);
+      }
+    }
+
+    if (moves[0].pos == NO_MOVE)
+      TRACE("No move found\n");
+  }
+  
+  /* Now we are ready to try moves. Turn on the sgf output ... */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+  tested_moves = 0;
+  for (k = 0; k < MAX_SEMEAI_MOVES; k++) {
+    int mpos = moves[k].pos;
+    if (mpos == NO_MOVE)
+      break;
+
+    if (moves[k].value == 0)
+      continue;
+
+    /* Do not try too many moves. */
+    if (tested_moves > 2
+       || (stackp > semeai_branch_depth2 && tested_moves > 1)
+       || (stackp > semeai_branch_depth && tested_moves > 0)) {
+      /* If allpats, try and pop to get the move in the sgf record. */
+      if (!allpats)
+       break;
+      else if (trymove(mpos, color, moves[k].name, apos)) {
+       semeai_add_sgf_comment(moves[k].value, owl_phase);
+       popgo();
+      }
+      continue;
+    }
+    
+    if (count_variations >= semeai_node_limit
+       || stackp >= MAX_SEMEAI_DEPTH)
+      continue;
+
+    /* Try playing the move at mpos and call ourselves recursively to
+     * determine the result obtained by this move.
+     */
+    if (semeai_trymove_and_recurse(apos, bpos, owla, owlb,
+                                  owl_phase, mpos, color,
+                                  best_resulta == 0 || best_resultb == 0,
+                                  moves[k].value, moves[k].name,
+                                  moves[k].same_dragon, moves[k].pattern_data,
+                                  moves[k].lunch, NULL,
+                                  &this_resulta, &this_resultb)) {
+      tested_moves++;
+      if (this_resultb == WIN && this_resulta == WIN) {
+       /* Ideal result, no need to try any more moves. */
+       *resulta = WIN;
+       *resultb = WIN;
+       *move = mpos;
+       TRACE("After %1m I (%C) am alive, you are dead\n", mpos, color);
+       SGFTRACE_SEMEAI(mpos, WIN, WIN, moves[k].name);
+       close_pattern_list(color, &shape_defensive_patterns);
+       close_pattern_list(color, &shape_offensive_patterns);
+       READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                          move, mpos, WIN, WIN);
+      }
+      /* When there is a choice between ko and seki, the prefer_ko
+       * variable decides policy. Thus if prefer_ko == color we
+       * consider attacking the opponent more important than defending
+       * our dragon, and vise versa otherwise.
+       */
+      else if ((prefer_ko != color
+               && (this_resulta > best_resulta
+                   || (this_resulta == best_resulta
+                       && this_resultb > best_resultb)))
+              || (prefer_ko == color
+                  && (this_resultb > best_resultb
+                      || (this_resultb == best_resultb
+                          && this_resulta > best_resulta)))) {
+       best_resulta = this_resulta;
+       best_resultb = this_resultb;
+       best_move = mpos;
+       best_move_name = moves[k].name;
+      }
+    }
+  }
+
+  close_pattern_list(color, &shape_defensive_patterns);
+  close_pattern_list(color, &shape_offensive_patterns);
+
+  /* If we can't find a move and the opponent looks alive, we have
+   * lost.
+   */
+  if (best_resulta == 0 && best_resultb == 0 && you_look_alive) {
+    *resulta = 0;
+    *resultb = 0;
+    *move = PASS_MOVE;
+    SGFTRACE_SEMEAI(PASS_MOVE, 0, 0, "You live, I die");
+    READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                      move, PASS_MOVE, 0, 0);
+  }
+
+  /* If we didn't find a working move and we look dead even if including the
+   * opponent stones in our eyespace, we have lost.
+   */
+  if (best_resulta == 0 && best_resultb == 0
+      && !riskless_move_found) {
+    const char *live_reasona;
+    int eyemin_a;
+    int eyemax_a;
+    for (sworm = 0; sworm < s_worms; sworm++) {
+      if (board[semeai_worms[sworm]] == other) {
+       if (important_semeai_worms[sworm])
+         break;
+      }
+    }
+    
+    if (sworm == s_worms) {
+      include_semeai_worms_in_eyespace = 1;
+      if (!owl_estimate_life(owla, owlb, vital_defensive_moves,
+                            &live_reasona, 0, &dummy_eyes,
+                            &eyemin_a, &eyemax_a)
+         && eyemax_a < 2) {
+       include_semeai_worms_in_eyespace = 0;
+       *resulta = 0;
+       *resultb = 0;
+       *move = PASS_MOVE;
+       SGFTRACE_SEMEAI(PASS_MOVE, 0, 0, "You live, I die - 2");
+       READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                          move, PASS_MOVE, 0, 0);
+      }
+      include_semeai_worms_in_eyespace = 0;
+    }
+  }
+
+  /* If we can't find a useful move and opponent passed, it's seki, unless
+   * one dragon has more eyes than the other.
+   */
+  if (best_resulta == 0 && best_resultb == 0
+      && !riskless_move_found) {
+    if (pass) {
+      if (max_eyes(&probable_eyes_a) < min_eyes(&probable_eyes_b)) {
+       *resulta = 0;
+       *resultb = 0;
+       *move = PASS_MOVE;
+       TRACE("You have more eyes.\n");
+       SGFTRACE_SEMEAI(PASS_MOVE, 0, 0, "You have more eyes");
+       READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                          move, PASS_MOVE, 0, 0);
+      }
+      else if (max_eyes(&probable_eyes_b) < min_eyes(&probable_eyes_a)) {
+       *resulta = WIN;
+       *resultb = WIN;
+       *move = PASS_MOVE;
+       TRACE("I have more eyes\n");
+       SGFTRACE_SEMEAI(PASS_MOVE, WIN, WIN, "I have more eyes");
+       READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                          move, PASS_MOVE, WIN, WIN);
+      }
+      else {
+       *resulta = WIN;
+       *resultb = 0;
+       *move = PASS_MOVE;
+       TRACE("Seki\n");
+       SGFTRACE_SEMEAI(PASS_MOVE, WIN, 0, "Seki");
+       READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                          move, PASS_MOVE, WIN, 0);
+      }
+    }
+    else {
+    /* No working move was found, but opponent hasn't passed. Then we pass. */
+      do_owl_analyze_semeai(bpos, apos, owlb, owla,
+                           resultb, resulta, NULL, 1, owl_phase);
+      *resulta = REVERSE_RESULT(*resulta);
+      *resultb = REVERSE_RESULT(*resultb);
+      TRACE("No move found\n");
+      SGFTRACE_SEMEAI(PASS_MOVE, *resulta, *resultb, "No move found");
+      *move = PASS_MOVE;
+      READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp,
+                        move, PASS_MOVE, *resulta, *resultb);
+    }
+  }
+
+  /* There are a few selected cases where we should try to see if it
+   * would be better to pass rather than playing any move in the semeai.
+   *
+   * A first simple example is the case of positions where there is nothing
+   * left to play but common liberties. In case the above analysis concluded
+   * the result is seki and if the best (and only) move happens to be a
+   * common liberty, we attempt to pass, so that the engine considers tenuki
+   * as a viable option in case it actually is.
+   *
+   * Another example is related to "disturbing" kos.
+   * 
+   * .OOOOOOOO.  In this position (similar to semeai:130), X has just taken
+   * OOXXXXXXOO  the ko on the left. The semeai code finds the ko recapture
+   * OX.XXOOXXO  as the only attacking move and concludes the result is KO_B.
+   * OOXX.OO.XO
+   * ----------
+   *
+   * In such cases too, we try to pass to see if it doesn't actually yield
+   * a better result.
+   *
+   * FIXME: there might be more cases where passing would be valuable. 
+   */
+  if (!pass && k == 1) {
+    if ((best_resulta == WIN && best_resultb == 0
+        && best_move != NO_MOVE
+        && best_move == common_liberty.pos)
+       || (best_resulta == KO_B && best_resultb == KO_B
+           && is_ko(best_move, owla->color, NULL))) {
+      do_owl_analyze_semeai(bpos, apos, owlb, owla, &this_resultb,
+                           &this_resulta, NULL, 1, owl_phase);
+      if (REVERSE_RESULT(this_resulta) >= best_resulta
+         && REVERSE_RESULT(this_resultb) >= best_resultb) {
+       best_move = PASS_MOVE;
+       best_resulta = REVERSE_RESULT(this_resulta);
+       best_resultb = REVERSE_RESULT(this_resultb);
+       best_move_name = "Pass";
+      }
+    }
+  }
+
+  *resulta = best_resulta;
+  *resultb = best_resultb;
+  if (best_resulta == 0)
+    best_move = PASS_MOVE;
+  *move = best_move;
+  SGFTRACE_SEMEAI(best_move, best_resulta, best_resultb, best_move_name);
+  READ_RETURN_SEMEAI(SEMEAI, apos, bpos, depth - stackp, 
+                    move, best_move, best_resulta, best_resultb);
+}
+
+/* Play a move, update goal and boundaries appropriately, and call
+ * do_owl_analyze_semeai() recursively to determine the result of this
+ * move.
+ */
+static int
+semeai_trymove_and_recurse(int apos, int bpos, struct local_owl_data *owla,
+                          struct local_owl_data *owlb,
+                          int owl_phase,
+                          int move, int color, int ko_allowed,
+                          int move_value, const char *move_name,
+                          enum same_dragon_value same_dragon,
+                          struct matched_pattern_data *pattern_data,
+                          int lunch, int *semeai_move,
+                          int *this_resulta, int *this_resultb)
+{
+  int ko_move = 0;
+  
+  gg_assert(this_resulta != NULL && this_resultb != NULL);
+  *this_resulta = 0;
+  *this_resultb = 0;
+
+  if (!komaster_trymove(move, color, move_name, apos, &ko_move, ko_allowed)) {
+    int kpos;
+    if (is_ko(move, color, &kpos)) {
+      /* Move was not allowed because of komaster. We want to check
+       * if this situation is double ko and when it is, we won semeai.
+       */
+      int libs[MAX_LIBERTIES];
+      int n;
+      int nlib;
+      int sworm;
+      int worm_color;
+      int other = OTHER_COLOR(color);
+
+      for (sworm = 0; sworm < s_worms; sworm++) {
+       worm_color = board[semeai_worms[sworm]];
+       if (worm_color == color) {
+         /* We only check up to MAX_LIBERTIES, due to performance
+          * reasons. When we have more liberties we have some outside
+          * liberties to fill and these moves will be tried later
+          * (and double ko situation will be found).
+          */
+         nlib = findlib(semeai_worms[sworm], MAX_LIBERTIES, libs);
+         if (nlib > MAX_LIBERTIES)
+           return 0;
+
+         for (n = 0; n < nlib; n++)
+           if (is_ko(libs[n], other, NULL)) {
+             /* Check if situation is not a nested ko capture. */
+             if (DIAGONAL_NEIGHBORS(libs[n], kpos))
+               return 0;
+
+             /* Our dragon has double ko, but we have to check if
+              * opponent dragon doesn't have outside liberties or
+              * double ko.
+              */
+             *this_resulta = WIN;
+             *this_resultb = WIN;
+           }
+       }
+       else if (worm_color == other) {
+         if (countlib(semeai_worms[sworm]) > 2)
+           /* In double ko situation the opponent can have only a
+            * single eye and a ko outside liberty to be sure that we
+            * will always win double ko.
+            */
+           return 0;
+       }
+      }
+      if (*this_resulta == WIN)
+       return 1;
+    }
+
+    return 0;
+  }
+  
+  semeai_add_sgf_comment(move_value, owl_phase);
+  TRACE("Trying %C %1m. Current stack: ", color, move);
+  if (verbose) {
+    dump_stack();
+    goaldump(owla->goal);
+    gprintf("\n");
+    goaldump(owlb->goal);
+    gprintf("\n");
+  }
+  TRACE("%s, value %d, same_dragon %d\n", move_name, move_value, same_dragon);
+    
+  push_owl(&owla);
+  push_owl(&owlb);
+
+  if (owla->color == color) {
+    owl_update_goal(move, same_dragon, lunch, owla, 1, pattern_data);
+    owl_update_boundary_marks(move, owlb);
+  }
+  else {
+    owl_update_goal(move, same_dragon, lunch, owlb, 1, pattern_data);
+    owl_update_boundary_marks(move, owla);
+  }
+  mark_goal_in_sgf(owla->goal);
+  mark_goal_in_sgf(owlb->goal);
+    
+  /* Do a recursive call to read the semeai after the move we just
+   * tried. If dragon b was captured by the move, call
+   * do_owl_attack() to see whether it sufficed for us to live.
+   */
+  if (board[bpos] == EMPTY) {
+    /* FIXME: Are all owl_data fields and relevant static
+     * variables properly set up for a call to do_owl_attack()?
+     */
+    *this_resulta = REVERSE_RESULT(do_owl_attack(apos, semeai_move, NULL, owla, 0));
+    *this_resultb = *this_resulta;
+  }
+  else {
+    do_owl_analyze_semeai(bpos, apos, owlb, owla,
+                         this_resultb, this_resulta, semeai_move,
+                         0, owl_phase);
+    *this_resulta = REVERSE_RESULT(*this_resulta);
+    *this_resultb = REVERSE_RESULT(*this_resultb);
+  }
+    
+  pop_owl(&owlb);
+  pop_owl(&owla);
+    
+  popgo();
+    
+  /* Does success require ko? */
+  if (ko_move) {
+    if (*this_resulta != 0)
+      *this_resulta = KO_B;
+    if (*this_resultb != 0)
+      *this_resultb = KO_B;
+  }
+    
+  if (count_variations >= semeai_node_limit) {
+    TRACE("Out of nodes, claiming win.\n");
+    result_certain = 0;
+    *this_resulta = WIN;
+    *this_resultb = WIN;
+  }
+  return 1;
+}
+
+/* Add details in sgf file about move value and whether owl_phase is active. */
+static void
+semeai_add_sgf_comment(int value, int owl_phase)
+{
+  char buf[100];
+
+  if (!sgf_dumptree)
+    return;
+  
+  if (owl_phase)
+    gg_snprintf(buf, 100, "value %d, owl_phase", value);
+  else
+    gg_snprintf(buf, 100, "value %d", value);
+  sgftreeAddComment(sgf_dumptree, buf);
+}
+
+
+/* In semeai situations tactical attacks often cannot be trusted. This
+ * in particular holds for strings with three or more liberties. Two
+ * liberties can usually be trusted, but if neither liberty can be
+ * played immediately, the need for backfilling moves gives an
+ * effective liberty count of more than two, again making the attack
+ * untrustworthy.
+ *
+ * This function decides whether an attack should be trusted. It does
+ * not check whether there actually is an attack, though.
+ */
+static int
+semeai_trust_tactical_attack(int str)
+{
+  int liberties;
+  int libs[3];
+  int other = OTHER_COLOR(board[str]);
+  
+  liberties = findlib(str, 3, libs);
+  if (liberties > 2)
+    return 0;
+
+  if (liberties < 2)
+    return 1;
+
+  if (!is_self_atari(libs[0], other)
+      || !is_self_atari(libs[1], other))
+    return 1;
+
+  return 0;
+}
+
+
+/* A move is deemed riskless (i.e., doesn't kill ourself in a seki situation)
+ * if it doesn't decrease the liberty count of any goal string of our
+ * dragon.
+ */
+static int
+semeai_is_riskless_move(int move, struct local_owl_data *owla)
+{
+  int k;
+  int liberties = accuratelib(move, owla->color, MAXLIBS, NULL);
+  if (!liberty_of_goal(move, owla))
+    return 1;
+  for (k = 0; k < 4; k++) {
+    int pos = move + delta[k];
+    if (board[pos] == owla->color
+       && owla->goal[pos]
+       && countlib(pos) > liberties)
+      return 0;
+  }
+  return 1;
+}
+
+
+/* Review the moves in owl_moves[] and add them into semeai_moves[].
+ * This is used to merge multiple sets of owl moves into one move
+ * list, while revising the values for use in semeai reading.
+ *
+ * We also record whether the moves include an outer or common liberty
+ * in the semeai.
+ */
+static void
+semeai_review_owl_moves(struct owl_move_data owl_moves[MAX_MOVES],
+                       struct local_owl_data *owla,
+                       struct local_owl_data *owlb, int color,
+                       int *safe_outside_liberty_found,
+                       int *safe_common_liberty_found,
+                       int *riskless_move_found,
+                       signed char mw[BOARDMAX],
+                       struct owl_move_data semeai_moves[MAX_SEMEAI_MOVES],
+                       int guess_same_dragon, int value_bonus,
+                       int *critical_semeai_worms)
+{
+  int move;
+  int move_value;
+  enum same_dragon_value same_dragon;
+  struct matched_pattern_data *pattern_data = NULL;
+  int k;
+  
+  for (k = 0; k < MAX_MOVES-1; k++) {
+    move = owl_moves[k].pos;
+    if (move == NO_MOVE)
+      break;
+
+    if (owl_moves[k].value == 0)
+      continue;
+
+    /* Does the move fill a liberty in the semeai? */
+    if (liberty_of_goal(move, owlb)
+       && safe_move(move, color)) {
+      if (!liberty_of_goal(move, owla))
+       *safe_outside_liberty_found = 1;
+      else
+       *safe_common_liberty_found = 1;
+    }
+    if (is_legal(move, color) && !is_ko(move, color, NULL)
+       && semeai_is_riskless_move(move, owla))
+      *riskless_move_found = 1;
+
+    /* For some types of owl moves we don't have same_dragon
+     * information recorded and need to guess.
+     */
+    if (guess_same_dragon) {
+      if (liberty_of_goal(move, owla)
+         || second_liberty_of_goal(move, owla))
+       same_dragon = SAME_DRAGON_MAYBE_CONNECTED;
+      else
+       same_dragon = SAME_DRAGON_NOT_CONNECTED;
+    }
+    else {
+      same_dragon = owl_moves[k].same_dragon;
+      pattern_data = owl_moves[k].pattern_data;
+    }
+
+    mw[move] = 1;
+    move_value = (semeai_move_value(move, owla, owlb, owl_moves[k].value,
+                                   critical_semeai_worms)
+                 + value_bonus);
+    owl_add_move(semeai_moves, move, move_value, owl_moves[k].name, 
+                same_dragon, NO_MOVE, owl_moves[k].escape,
+                NO_MOVE, MAX_SEMEAI_MOVES, pattern_data);
+    TRACE("Added %1m %d\n", move, move_value);
+  }
+}
+
+
+/* Propose an eyespace filling move.  Such a move can, for instance,
+ * add a stone to opponent's "bulky five" shape.  We of course choose
+ * a move that doesn't allow opponent to turn his dead eyeshape into a
+ * two eyes eyeshape.  E.g. in this position, the function will
+ * propose the move at '*', not at the '.':
+ *
+ *      XXX
+ *     XXOX
+ *     XOOX
+ *     X.*X
+ *     ----
+ */
+static int
+semeai_propose_eyespace_filling_move(struct local_owl_data *owla,
+                                    struct local_owl_data *owlb)
+{
+  int color = OTHER_COLOR(owlb->color);
+  int pos;
+  int mw[BOARDMAX];
+  int mz[BOARDMAX];
+
+  owl_find_relevant_eyespaces(owlb, mw, mz);
+
+  /* Never try to fill opponent's eyes which contain our dragon.  This
+   * is nothing else than suicide.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && owla->goal[pos])
+      mw[owlb->my_eye[pos].origin] = 0;
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == EMPTY) {
+      int origin = owlb->my_eye[pos].origin;
+
+      if (mw[origin] > 1
+         && min_eyes(&owlb->my_eye[origin].value) == 1) {
+       int good_move = 0;
+
+       if (trymove(pos, color, "eyespace_filling", NO_MOVE)) {
+         struct eyevalue new_value;
+         int dummy_attack;
+         int dummy_defense;
+
+         compute_eyes(origin, &new_value, &dummy_attack, &dummy_defense,
+                      owlb->my_eye, owlb->half_eye, 0);
+         if (max_eyes(&new_value) <= 1)
+           good_move = 1;
+
+         popgo();
+       }
+
+       if (good_move)
+         return pos;
+      }
+    }
+  }
+
+  return NO_MOVE;
+}
+
+
+/* Try to estimate the value of a semeai move. This has two
+ * components. The first is the change in the total number of
+ * liberties for strings involved in the semeai. The second is a bonus
+ * for attacks and defenses of critical semeai worms.
+ */
+
+static int
+semeai_move_value(int move, struct local_owl_data *owla,
+                 struct local_owl_data *owlb,
+                 int raw_value, int *critical_semeai_worms)
+{
+  int pos;
+  int net = 0;
+  int color = owla->color;
+  int save_verbose = verbose;
+  int k;
+  int bonus = 0;
+
+  ASSERT1(board[move] == EMPTY, move);
+  verbose = 0;
+  if (safe_move(move, color)) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (IS_STONE(board[pos])
+         && pos == find_origin(pos)) {
+       int count_lib = -1;
+       if (owla->goal[pos]) {
+         count_lib = countlib(pos);
+         net -= 75 * count_lib;
+       }
+       if (owlb->goal[pos]) {
+         if (count_lib < 0)
+           count_lib = countlib(pos);
+         net += 100 * count_lib;
+       }
+      }
+    }
+    if (!trymove(move, color, NULL, 0)) {
+      verbose = save_verbose;
+      return 0;
+    }
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (IS_STONE(board[pos])
+         && pos == find_origin(pos)) {
+       int count_lib = -1;
+       if (owla->goal[pos]
+           || (pos == move && liberty_of_goal(move, owla))) {
+         count_lib = countlib(pos);
+         net += 75 * count_lib;
+       }
+       if (owlb->goal[pos]) {
+         if (count_lib < 0)
+           count_lib = countlib(pos);
+         net -= 100 * count_lib;
+       }
+      }
+    }
+
+    increase_depth_values();
+    for (k = 0; k < s_worms; k++) {
+      if (!critical_semeai_worms[k])
+       continue;
+      if (board[semeai_worms[k]] == color
+         && !attack(semeai_worms[k], NULL))
+       bonus += 50;
+      else if (board[semeai_worms[k]] == OTHER_COLOR(color)
+              && !find_defense(semeai_worms[k], NULL))
+       bonus += 50;
+    }
+    decrease_depth_values();
+    
+    popgo();
+  }
+
+  verbose = save_verbose;
+
+  if (net < 0)
+    net = 0;
+
+  net /= 25;
+  net *= 3;
+  
+  return raw_value + net + bonus;
+}
+
+
+/* Remove all moves from the list that would fill our own eye. */
+static void
+remove_eye_filling_moves(struct local_owl_data *our_owl,
+                        struct owl_move_data *moves)
+{
+  int k;
+  int color = our_owl->color;
+
+  for (k = 0; k < MAX_MOVES; k++) {
+    if (moves[k].pos == NO_MOVE)
+      break;
+    else {
+      struct eye_data *eye = &our_owl->my_eye[moves[k].pos];
+
+      /* If esize==1 this eye must not be a real eye (at least one
+       * worm is capturable, otherwise this move would not be
+       * proposed).
+       */
+      if (eye->color == color && eye->msize == 0 && eye->neighbors <= 1
+         && eye->esize != 1
+         && our_owl->half_eye[moves[k].pos].type != HALF_EYE
+         && !has_neighbor(moves[k].pos, OTHER_COLOR(color)))
+       moves[k].value = 0;
+    }
+  }
+}
+
+/* Is the vertex at pos adjacent to an element of the owl goal? */
+static int
+liberty_of_goal(int pos, struct local_owl_data *owl)
+{
+  int k;
+  for (k = 0; k < 4; k++)
+    if (IS_STONE(board[pos + delta[k]]) && owl->goal[pos + delta[k]])
+      return 1;
+  
+  return 0;
+}
+
+/* Is the vertex at pos a second liberty of the owl goal? */
+static int
+second_liberty_of_goal(int pos, struct local_owl_data *owl)
+{
+  int k;
+  for (k = 0; k < 4; k++)
+    if (board[pos + delta[k]] == EMPTY && liberty_of_goal(pos + delta[k], owl))
+      return 1;
+  
+  return 0;
+}
+
+
+/* 'liberty' is a liberty of 'worm' which we would like to fill.
+ * However it is not safe to play there, so we look for a
+ * backfilling move. For example in this situation:
+ *
+ *   ------+
+ *   O.OaXc|
+ *   OOOOOX|
+ *   XXXXXb|
+ *   ......|
+ *
+ * If 'worm' is the O string and 'liberty' is 'a', the
+ * function returns 'b'. To fill at 'a', X must first
+ * fill 'b' and 'c' and it is better to fill at 'b' first
+ * since that will sometimes leave fewer or smaller ko threats.
+ *
+ * Returns NO_MOVE if no move is found.
+ */
+
+static int
+find_semeai_backfilling_move(int worm, int liberty)
+{
+  int color = board[worm];
+  int other = OTHER_COLOR(color);
+  int result = NO_MOVE;
+
+  if (safe_move(liberty, other) == WIN)
+    return liberty;
+  if (is_self_atari(liberty, other)) {
+    int fill;
+    if (approxlib(liberty, other, 1, &fill) > 0
+       && trymove(fill, other, "find_semeai_backfilling_move", worm)) {
+      if (safe_move(liberty, other))
+       result = fill;
+      else if (board[worm] != EMPTY)
+       result = find_semeai_backfilling_move(worm, liberty);
+      popgo();
+    }
+  }
+  if (ON_BOARD(result) && safe_move(result, other))
+    return result;
+  else
+    return NO_MOVE;
+}
+
+/* Some helper function for do_owl_attack/defend. */
+
+static int
+reading_limit_reached(const char **live_reason, int this_variation_number)
+{
+  /* If (stackp > owl_reading_depth), interpret deep reading
+   * conservatively as escape.
+   */
+  if (stackp > owl_reading_depth) {
+    TRACE("%oVariation %d: ALIVE (maximum reading depth reached)\n",
+         this_variation_number);
+    *live_reason = "max reading depth reached";
+    return 1;
+  }
+  /* If the owl node limit has been reached, assume the dragon has
+   * managed to escape.
+   */
+  if (local_owl_node_counter >= owl_node_limit) {
+    result_certain = 0;
+    TRACE("%oVariation %d: ALIVE (owl node limit reached)\n",
+         this_variation_number);
+    *live_reason = "owl node limit reached";
+    return 1;
+  }
+  return 0;
+}
+
+static void
+clear_owl_move_data(struct owl_move_data moves[MAX_MOVES])
+{
+  int k;
+  for (k = 0; k < MAX_MOVES; k++) {
+    moves[k].pos = NO_MOVE;
+    moves[k].value = -1;
+    moves[k].name = NULL;
+    moves[k].same_dragon = SAME_DRAGON_CONNECTED;
+    moves[k].escape = 0;
+    moves[k].lunch = NO_MOVE;
+    moves[k].pattern_data = NULL;
+    clear_cut_list(moves[k].cuts);
+  }
+}
+
+static void
+set_single_owl_move(struct owl_move_data moves[MAX_MOVES],
+                   int pos, const char *name)
+{
+  moves[0].pos          = pos;
+  moves[0].value        = 25;
+  moves[0].name         = name;
+  moves[0].same_dragon  = SAME_DRAGON_MAYBE_CONNECTED;
+  moves[0].escape       = 0;
+  moves[0].lunch        = NO_MOVE;
+  moves[0].pattern_data = NULL;
+  clear_cut_list(moves[0].cuts);
+  moves[1].value        = 0;
+}
+
+
+/* Returns true if a move can be found to attack the dragon
+ * at (target), in which case (*attack_point) is the recommended move.
+ * (attack_point) can be a null pointer if only the result is needed.
+ *
+ * The array goal marks the extent of the dragon. This must
+ * be maintained during reading. Call this function only when
+ * stackp==0; otherwise you can call do_owl_attack but you must
+ * set up the goal and boundary arrays by hand first.
+ *
+ * Returns KO_A or KO_B if the position is ko:
+ *
+ * - Returns KO_A if the attack prevails provided attacker is willing to
+ *   ignore any ko threat (the attacker makes the first ko capture).
+ *
+ * - Returns KO_B if attack succeeds provided attacker has a ko threat
+ *   which must be answered (the defender makes the first ko capture).
+ *
+ * If GNU Go is compiled with `configure --enable-experimental-owl-ext'
+ * then a return codes of GAIN is also possible.
+ *
+ * - Returns GAIN if the attack fails but another worm of the
+ *   opponent's is captured in during the failed attack. The location
+ *   of the killed worm is returned through the *kworm field.
+ *
+ * */
+
+int
+owl_attack(int target, int *attack_point, int *certain, int *kworm)
+{
+  int result;
+  struct local_owl_data *owl;
+  int reading_nodes_when_called = get_reading_node_counter();
+  double start = 0.0;
+  int tactical_nodes;
+  int move = NO_MOVE;
+  int wpos = NO_MOVE;
+  int wid = MAX_GOAL_WORMS;
+
+  result_certain = 1;
+  if (worm[target].unconditional_status == DEAD) {
+    if (attack_point)
+      *attack_point = NO_MOVE;
+    if (kworm)
+      *kworm = NO_MOVE;
+    if (certain)
+      *certain = 1;
+    return 1;
+  }
+
+  if (search_persistent_owl_cache(OWL_ATTACK, target, 0, 0, &result,
+                                 attack_point, kworm, certain))
+    return result;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+  
+  TRACE("owl_attack %1m\n", target);
+  init_owl(&owl, target, NO_MOVE, NO_MOVE, 1, NULL);
+  owl_make_domains(owl, NULL);
+  prepare_goal_list(target, owl, owl_goal_worm, &goal_worms_computed,
+                   kworm, 1);
+  result = do_owl_attack(target, &move, &wid, owl, 0);
+  finish_goal_list(&goal_worms_computed, &wpos, owl_goal_worm, wid);
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+    "owl_attack %1m, result %d %1m (%d, %d nodes, %f seconds)\n",
+    target, result, move, local_owl_node_counter,
+    tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_ATTACK, target, 0, 0,
+                            result, move, wpos,
+                            result_certain, tactical_nodes,
+                            owl->goal, board[target]);
+  if (attack_point)
+    *attack_point = move;
+  if (kworm)
+    *kworm = wpos;
+  if (certain)
+    *certain = result_certain;
+
+  return result;
+}
+
+
+/* Static function containing the main recursive code for 
+ * owl_attack.
+ */
+
+static int
+do_owl_attack(int str, int *move, int *wormid,
+             struct local_owl_data *owl, int escape)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  struct owl_move_data vital_moves[MAX_MOVES];
+  struct owl_move_data shape_moves[MAX_MOVES];
+  struct owl_move_data *moves;
+  struct matched_patterns_list_data shape_patterns;
+  signed char mw[BOARDMAX];
+  int number_tried_moves = 0;
+  int pass;
+  int k;
+  int savemove = 0;
+  int saveworm = MAX_GOAL_WORMS;
+  int savecode = 0;
+  int eyemin = -1;               /* Lower bound on the number of eyes. */
+  int eyemax = -1;               /* Upper bound on the number of eyes. */
+  struct eyevalue probable_eyes; /* Best guess of eyevalue. */
+  const char *live_reason;
+  int move_cutoff;
+  int xpos;
+  int value1;
+  int value2;
+  int this_variation_number = count_variations - 1;
+  
+  SETUP_TRACE_INFO("owl_attack", str);
+
+  shape_patterns.initialized = 0;
+
+  str = find_origin(str);
+
+  if (tt_get(&ttable, OWL_ATTACK, str, NO_MOVE, depth - stackp, NULL, 
+            &value1, &value2, &xpos) == 2) {
+
+    TRACE_CACHED_RESULT(value1, xpos);
+    if (move)
+      *move = xpos;
+
+    if (value1 == GAIN) {
+      if (wormid) {
+       if (goal_worms_computed)
+         *wormid = value2;
+       else
+         *wormid = MAX_GOAL_WORMS;
+      }
+    }
+    
+    if (value1 == WIN)
+      TRACE("%oVariation %d: DEAD (cached)\n", this_variation_number);
+    else
+      TRACE("%oVariation %d: ALIVE (cached)\n", this_variation_number);
+    
+    SGFTRACE(xpos, value1, "cached");
+    
+    return value1;
+  }
+
+
+  /* If reading goes to deep or we run out of nodes, we assume life. */
+  if (reading_limit_reached(&live_reason, this_variation_number)) {
+    SGFTRACE(0, 0, live_reason);
+    READ_RETURN(OWL_ATTACK, str, depth - stackp, move, 0, 0);
+  }
+
+  memset(mw, 0, sizeof(mw));
+  global_owl_node_counter++;
+  local_owl_node_counter++;
+
+  current_owl_data = owl;
+  memset(owl->safe_move_cache, 0, sizeof(owl->safe_move_cache));
+
+  /* First see whether there is any chance to kill. */
+  if (owl_estimate_life(owl, NULL, vital_moves, &live_reason, 1,
+                       &probable_eyes, &eyemin, &eyemax)) {
+    /*
+     * We need to check here if there's a worm under atari. If yes,
+     * locate it and report a (gote) GAIN.
+     */
+    int acode = 0;
+    int mpos = NO_MOVE;
+    if (experimental_owl_ext && goal_worms_computed) {
+      int size = 0;
+      saveworm = MAX_GOAL_WORMS;
+      for (k = 0; k < MAX_GOAL_WORMS; k++) {
+       if (owl_goal_worm[k] == NO_MOVE)
+         break;
+       if (board[owl_goal_worm[k]] == EMPTY
+           || countlib(owl_goal_worm[k]) > 1)
+         continue;
+       if (worm[owl_goal_worm[k]].size > size) {
+         saveworm = k;
+         size = worm[owl_goal_worm[k]].size;
+       }
+      }
+      if (saveworm != MAX_GOAL_WORMS && size >= 3) {
+       acode = GAIN;
+       findlib(worm[owl_goal_worm[saveworm]].origin, 1, &mpos);
+       /* ASSERT1( ... */
+      }
+    }
+    SGFTRACE(0, acode, live_reason);
+    TRACE("%oVariation %d: ALIVE (%s)\n", this_variation_number, live_reason);
+    if (acode == 0) {
+      READ_RETURN(OWL_ATTACK, str, depth - stackp, move, 0, 0);
+    }
+    else {
+      if (wormid)
+       *wormid = saveworm;
+      READ_RETURN2(OWL_ATTACK, str, depth - stackp,
+                  move, mpos, acode, saveworm);
+    }
+  }
+
+  /* We try moves in five passes.
+   *                                stackp==0   stackp>0
+   * 0. Vital moves in the interval  [70..]      [45..]
+   * 1. Shape moves
+   * 2. Vital moves in the interval  [..69]      [..44]
+   * 3. Tactical attack moves (except certain kos)
+   * 4. Moves found by the defender
+   * 5. Tactical ko attack moves which were not tried in pass 3
+   */
+  for (pass = 0; pass < 6; pass++) {
+    moves = NULL;
+    move_cutoff = 1;
+    
+    current_owl_data = owl;
+    /* Get the shape moves if we are in the right pass. */
+    switch (pass) {
+    case 1:
+      if (stackp > owl_branch_depth && number_tried_moves > 0)
+       continue;
+      
+      owl_shapes(&shape_patterns, shape_moves, other, owl, &owl_attackpat_db);
+      moves = shape_moves;
+      break;
+
+    case 0:
+    case 2:
+      if (stackp > owl_branch_depth && number_tried_moves > 0)
+       continue;
+      
+      moves = vital_moves;
+      if (pass == 0 || stackp > owl_distrust_depth) {
+       if (stackp == 0)
+         move_cutoff = 70;
+       else
+         move_cutoff = 45;
+      }
+      if (eyemax < 2 && stackp > 2)
+       move_cutoff = 99; /* Effectively disable vital moves. */
+      break;
+
+    case 3:
+    case 5:
+      {
+       /* Look for a tactical attack. This is primarily intended for
+        * the case where the whole dragon is a single string, therefore
+        * we only look at the string at the "origin".
+        *
+        * We must be wary with attacks giving ko. Unless the dragon
+        * otherwise looks alive, this may turn a dead dragon into one
+        * which can live by ko. Such moves will be tried anyway in
+        * pass 5. Notice though that we can only reach there if an owl
+        * defense was found in pass 4.
+        */
+       int apos;
+       int result;
+       SGFTree *save_sgf_dumptree = sgf_dumptree;
+       int save_count_variations = count_variations;
+
+       sgf_dumptree = NULL;
+       count_variations = 0;
+       result = attack(str, &apos);
+       if (result == WIN
+           || (result != 0 && (min_eyes(&probable_eyes) >= 2
+                               || pass == 5))) {
+         set_single_owl_move(shape_moves, apos, "tactical attack");
+         moves = shape_moves;
+       }
+       sgf_dumptree = save_sgf_dumptree;
+       count_variations = save_count_variations;
+      }
+      break;
+
+    /* If we found no move in the first four passes we ask the defender
+     * for a move suggestion.
+     */
+    case 4:
+      if (number_tried_moves == 0) {
+       int dpos;
+       int dcode = do_owl_defend(str, &dpos, NULL, owl, escape);
+       /* No defense, we won. */
+       if (dcode == 0) {
+         TRACE("%oVariation %d: DEAD (no defense)\n",
+               this_variation_number);
+         SGFTRACE(0, WIN, "no defense");
+         close_pattern_list(other, &shape_patterns);
+         READ_RETURN(OWL_ATTACK, str, depth - stackp, move, 0, WIN);
+       }
+       else if (dpos != NO_MOVE) {
+         /* The dragon could be defended by one more move. Try to
+          * attack with this move.
+          *
+          * If the move is suicide for us, try to find a backfilling
+          * move to play instead. Do this also if the move is a
+          * send-two-return-one sacrifice.
+          */
+         const char *name = "defense move";
+         SGFTree *save_sgf_dumptree = sgf_dumptree;
+         int save_count_variations = count_variations;
+
+         sgf_dumptree = NULL;
+         count_variations = 0;
+
+         if (is_suicide(dpos, other) || send_two_return_one(dpos, other)) {
+           int dpos2;
+           for (k = 0; k < 4; k++) {
+             if (board[dpos + delta[k]] == other
+                 && find_defense(dpos + delta[k], &dpos2)) {
+               dpos = dpos2;
+               name = "defense move (backfill)";
+               break;
+             }
+           }
+         }
+
+         sgf_dumptree = save_sgf_dumptree;
+         count_variations = save_count_variations;
+       
+         if (dpos != NO_MOVE) {
+           set_single_owl_move(shape_moves, dpos, name);
+           moves = shape_moves;
+         }
+       }
+      }
+      break;
+    } /* switch (pass) */
+      
+
+    /* FIXME: This block probably should reappear somewhere in this
+     * function.
+     */
+#if 0
+    /* First test whether the dragon has escaped. */
+    if (owl_escape_route(owl) >= 5) {
+      /* FIXME: We probably should make distinction in the returned
+       * result whether the dragon lives by making two eyes or by
+       * escaping.
+       */
+      TRACE("%oVariation %d: ALIVE (escaped)\n", this_variation_number);
+      SGFTRACE(0, 0, "escaped");
+      close_pattern_list(other, &shape_patterns);
+      READ_RETURN0(OWL_ATTACK, str, depth - stackp);
+    }
+#endif
+
+    if (!moves)
+      continue;
+    
+    /* For the up to MAX_MOVES best moves with value equal to
+     * move_cutoff or higher, try to attack the dragon and see if it
+     * can then be defended.
+     */
+    for (k = 0; k < MAX_MOVES; k++) {
+      int mpos;
+      int ko_move = -1;
+      int origin = NO_MOVE;
+      int captured;
+      int wid = MAX_GOAL_WORMS;
+      int dcode;
+
+      /* Consider only the highest scoring move if we're deeper than
+       * owl_branch_depth.
+       *
+       * FIXME: To behave as intended, k should be replaced by
+       *        number_tried_moves.
+       */
+      if (stackp > owl_branch_depth && k > 0)
+       break;
+
+      current_owl_data = owl;
+
+      /* Shape moves are selected on demand. */
+      if (pass == 1) {
+        if (!get_next_move_from_list(&shape_patterns, other,
+                                    shape_moves, move_cutoff, owl))
+          break;
+      }
+      else
+       if (moves[k].value < move_cutoff)
+         break;
+
+      mpos = moves[k].pos;
+      ASSERT_ON_BOARD1(mpos);
+    
+      /* Have we already tested this move? */
+      if (mw[mpos])
+       continue;
+
+      captured = (color == WHITE ? white_captured : black_captured);
+
+      /* Try to make the move. */
+      if (!komaster_trymove(mpos, other, moves[k].name, str,
+                           &ko_move, savecode == 0))
+       continue;
+
+      captured = (color == WHITE ? white_captured : black_captured) - captured;
+
+      TRACE("Trying %C %1m. Escape = %d. Current stack: ",
+           other, mpos, escape);
+      if (verbose)
+       dump_stack();
+
+      /* We have now made a move. Analyze the new position. */
+      push_owl(&owl);
+      mw[mpos] = 1;
+      number_tried_moves++;
+      owl_update_boundary_marks(mpos, owl);
+      
+      /* If the origin of the dragon has been captured, we look
+       * for another string which was part of the original dragon,
+       * marked when stackp==0, which has not been captured. If no
+       * such string is found, owl_attack declares victory.
+       */
+      if (IS_STONE(board[str]))
+       origin = str;
+      else
+       origin = select_new_goal_origin(NO_MOVE, owl);
+
+      /* Test whether the move cut the goal dragon apart. */
+      if (moves[k].cuts[0] != NO_MOVE && origin != NO_MOVE) {
+       owl_test_cuts(owl->goal, owl->color, moves[k].cuts);
+       if (!owl->goal[origin])
+         origin = select_new_goal_origin(origin, owl);
+      }
+      mark_goal_in_sgf(owl->goal);
+
+      if (origin == NO_MOVE)
+       dcode = 0;
+      else
+       dcode = do_owl_defend(origin, NULL, &wid, owl, escape);
+
+      if (!ko_move) {
+       if (dcode == 0) {
+         pop_owl(&owl);
+         popgo();
+         if (sgf_dumptree) {
+           const char *wintxt;
+           char winstr[192];
+           if (origin == NO_MOVE)
+             wintxt = "all original stones captured";
+           else
+             wintxt = "attack effective";
+           sprintf(winstr, "%s)\n  (%d variations", wintxt,
+                           count_variations - this_variation_number);
+           SGFTRACE(mpos, WIN, winstr);
+         }
+          close_pattern_list(other, &shape_patterns);
+         READ_RETURN(OWL_ATTACK, str, depth - stackp, move, mpos, WIN);
+       }
+       else if (experimental_owl_ext && dcode == LOSS) {
+         if (saveworm == MAX_GOAL_WORMS
+             || worm[owl_goal_worm[wid]].size
+                > worm[owl_goal_worm[saveworm]].size)
+           saveworm = wid;
+       }
+       /* The conditions here are set so that this code doesn't get
+        * triggered when the capture is immediate (the tactical
+        * reading code should take care of these).
+        */
+       else if (experimental_owl_ext && goal_worms_computed
+#if 0
+                && stackp > 1
+#endif
+                && captured >= 3) {
+         int w = MAX_GOAL_WORMS;
+         int size = 0;
+         int l;
+         /* locate the biggest captured worm */
+         for (l = 0; l < MAX_GOAL_WORMS; l++) {
+           if (owl_goal_worm[l] == NO_MOVE)
+             break;
+           if (board[owl_goal_worm[l]] == EMPTY)
+             if (size == 0 || worm[owl_goal_worm[l]].size > size) {
+               w = l;
+               size = worm[owl_goal_worm[l]].size;
+             }
+         }
+         if (w != MAX_GOAL_WORMS) {
+           if (GAIN > savecode) {
+             /* if new result better, just update */
+             dcode = LOSS;
+             saveworm = w;
+           }
+           else if (GAIN == savecode) {
+             /* bigger ? */
+             int wpos = owl_goal_worm[saveworm];
+             if (size > worm[wpos].size)
+               saveworm = w;
+           }
+         }
+       }
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, dcode, mpos);
+      }
+      else { /* ko_move */
+       if (dcode != WIN) {
+         if (mpos == 0) {
+           SGFTRACE(mpos, KO_B, "all original stones captured with ko");
+         }
+         else {
+           SGFTRACE(mpos, KO_B, "attack effective - ko");
+         }
+         /* We already know the savecode was previously 0. */
+         savemove = mpos;
+         savecode = KO_B;
+
+         /* It's possible that the defender has no defense even if we
+           * give up the ko. In order to force a test of this,
+           * assuming this was our only move, we decrease the number
+           * of tried moves counter, disregarding this move.
+          */
+         number_tried_moves--;
+       }
+      }
+    
+      pop_owl(&owl);
+      popgo();
+    }
+  }
+
+  close_pattern_list(other, &shape_patterns);
+  
+  if (savecode) {
+    if (savecode == GAIN) {
+      SGFTRACE(savemove, savecode, "attack effective (gain) - E");
+      if (wormid)
+       *wormid = saveworm;
+      READ_RETURN2(OWL_ATTACK, str, depth - stackp,
+                  move, savemove, savecode, saveworm);
+    }
+    else {
+      SGFTRACE(savemove, savecode, "attack effective (ko) - E");
+      READ_RETURN(OWL_ATTACK, str, depth - stackp, move, savemove, savecode);
+    }
+  }
+
+  if (sgf_dumptree) {
+    char winstr[128];
+    sprintf(winstr, "attack failed)\n  (%d variations",
+                   count_variations - this_variation_number);
+    SGFTRACE(0, 0, winstr);
+  }
+  
+  READ_RETURN0(OWL_ATTACK, str, depth - stackp);
+}
+
+
+/* Returns true if the dragon at (target) can be captured given
+ * two moves in a row. The first two moves to capture the
+ * dragon are given as (*attack1) and (*attack2).
+ */
+
+int
+owl_threaten_attack(int target, int *attack1, int *attack2)
+{
+  struct owl_move_data moves[MAX_MOVES];
+  int k;
+  int other = OTHER_COLOR(board[target]);
+  struct local_owl_data *owl;
+  int result = 0;
+  int reading_nodes_when_called = get_reading_node_counter();
+  signed char saved_boundary[BOARDMAX];
+  double start = 0.0;
+  int tactical_nodes;
+  int move = 0;
+  int move2 = 0;
+  struct matched_patterns_list_data shape_patterns;
+
+  shape_patterns.initialized = 0;
+  result_certain = 1;
+  if (search_persistent_owl_cache(OWL_THREATEN_ATTACK, target, 0, 0,
+                                 &result, attack1, attack2, NULL))
+    return result;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+  
+  gg_assert(stackp == 0);
+  TRACE("owl_threaten_attack %1m\n", target);
+  init_owl(&owl, target, NO_MOVE, NO_MOVE, 1, NULL);
+  memcpy(saved_boundary, owl->boundary, sizeof(saved_boundary));
+  owl_make_domains(owl, NULL);
+  owl_shapes(&shape_patterns, moves, other, owl, &owl_attackpat_db);
+  for (k = 0; k < MAX_MOVES; k++) {
+    current_owl_data = owl;
+    if (!get_next_move_from_list(&shape_patterns, other, moves, 1, owl))
+      break;
+    else {
+      int mpos = moves[k].pos;
+
+      if (mpos != NO_MOVE && moves[k].value > 0)
+       if (trymove(mpos, other, moves[k].name, target)) {
+         int pos;
+         int origin = NO_MOVE;
+         owl->lunches_are_current = 0;
+         owl_update_boundary_marks(mpos, owl);
+         
+         /* If the origin of the dragon has been captured, we look
+          * for another string which was part of the original dragon,
+          * marked when stackp==0, which has not been captured. If no
+          * such string is found, owl_attack declares victory.
+          */
+         
+         if (board[target] == EMPTY) {
+           for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+             if (IS_STONE(board[pos]) && owl->goal[pos] == 1) {
+               origin = find_origin(pos);
+               break;
+             }
+           }
+           
+           if (origin == NO_MOVE
+               || do_owl_attack(origin, NULL, NULL, owl, 0)) {
+             /* probably this can't happen */
+             popgo();
+             gg_assert(stackp == 0);
+             result = 1;
+             break;
+           }
+         }
+         else if (do_owl_attack(target, &move2, NULL, owl, 0) == WIN) {
+           move = moves[k].pos;
+           popgo();
+           gg_assert(stackp == 0);
+           result = 1;
+           break;
+         }
+         popgo();
+         memcpy(owl->boundary, saved_boundary, sizeof(saved_boundary));
+       }
+    }
+  }
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+  gg_assert(stackp == 0);
+
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+    "owl_threaten_attack %1m %1m %1m, result %d (%d, %d nodes, %f seconds)\n",
+    target, move, move2, result, local_owl_node_counter,
+    tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_THREATEN_ATTACK, target, 0, 0,
+                            result, move, move2, 0,
+                            tactical_nodes, owl->goal, board[target]);
+
+  if (attack1)
+    *attack1 = move;
+  if (attack2)
+    *attack2 = move2;
+
+  close_pattern_list(other, &shape_patterns);
+  return result;
+}
+
+
+/* Returns true if a move can be found to defend the dragon
+ * at (target), in which case (*defense_point) is the recommended move.
+ * (defense_point) can be a null pointer if the result is not needed.
+ *
+ * The array goal marks the extent of the dragon. This must
+ * be maintained during reading. Call this function only when
+ * stackp==0; otherwise you can call do_owl_attack but you must
+ * set up the goal and boundary arrays by hand first.
+ *
+ * Returns KO_A or KO_B if the position is ko:
+ *
+ * - Returns KO_A if the defendse succeeds provided the defender is willing to
+ *   ignore any ko threat (the defender makes the first ko capture).
+ * - Returns KO_B if the defense succeeds provided the defender has a ko threat
+ *   which must be answered (the attacker makes the first ko capture).
+ *
+ * If GNU Go is compiled with `configure --enable-experimental-owl-ext'
+ * then a return codes of GAIN is also possible.
+ *
+ * - Returns LOSS if the defense succeeds but another worm of the
+ *   defender's is captured in during the defense. The location
+ *   of the killed worm is returned through the *kworm field.
+ *
+ * The array goal marks the extent of the dragon. This must
+ * be maintained during reading.  
+ */
+
+int
+owl_defend(int target, int *defense_point, int *certain, int *kworm)
+{
+  int result;
+  static struct local_owl_data *owl;
+  int reading_nodes_when_called = get_reading_node_counter();
+  double start = 0.0;
+  int tactical_nodes;
+  int move = NO_MOVE;
+  int wpos = NO_MOVE;
+  int wid = MAX_GOAL_WORMS;
+
+  result_certain = 1;
+  if (worm[target].unconditional_status == DEAD)
+    return 0;
+
+  if (search_persistent_owl_cache(OWL_DEFEND, target, 0, 0, &result, 
+                                 defense_point, kworm, certain))
+    return result;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  TRACE("owl_defend %1m\n", target);
+  init_owl(&owl, target, NO_MOVE, NO_MOVE, 1, NULL);
+  owl_make_domains(owl, NULL);
+  prepare_goal_list(target, owl, owl_goal_worm, &goal_worms_computed,
+                   kworm, 1);
+  result = do_owl_defend(target, &move, &wid, owl, 0);
+  finish_goal_list(&goal_worms_computed, &wpos, owl_goal_worm, wid);
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+    "owl_defend %1m, result %d %1m (%d, %d nodes, %f seconds)\n",
+           target, result, move, local_owl_node_counter,
+           tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_DEFEND, target, 0, 0, result, move, wpos,
+                            result_certain, tactical_nodes, owl->goal,
+                            board[target]);
+
+  if (defense_point)
+    *defense_point = move;
+  if (kworm)
+    *kworm = wpos;
+  if (certain)
+    *certain = result_certain;
+  
+  return result;
+}
+
+
+/* Static function containing the main recursive code for owl_defend.
+ */
+
+static int
+do_owl_defend(int str, int *move, int *wormid, struct local_owl_data *owl,
+             int escape)
+{
+  int color = board[str];
+  struct owl_move_data shape_moves[MAX_MOVES];
+  struct owl_move_data vital_moves[MAX_MOVES];
+  struct owl_move_data *moves;
+  struct matched_patterns_list_data shape_patterns;
+  signed char mw[BOARDMAX];
+  int number_tried_moves = 0;
+  int pass;
+  int k;
+  int savemove = 0;
+  int saveworm = MAX_GOAL_WORMS;
+  int savecode = 0;
+  int eyemin = -1;               /* Lower bound on the number of eyes. */
+  int eyemax = -1;               /* Upper bound on the number of eyes. */
+  struct eyevalue probable_eyes; /* Best guess of eyevalue. */
+  int escape_route;
+  const char *live_reason;
+  int move_cutoff;
+  int xpos;
+  int value1;
+  int value2;
+  int this_variation_number = count_variations - 1;
+
+  SETUP_TRACE_INFO("owl_defend", str);
+
+  shape_patterns.initialized = 0;
+  
+  str = find_origin(str);
+
+  if (tt_get(&ttable, OWL_DEFEND, str, NO_MOVE, depth - stackp, NULL, 
+            &value1, &value2, &xpos) == 2) {
+    
+    TRACE_CACHED_RESULT(value1, xpos);
+    if (move)
+      *move = xpos;
+
+    if (value1 == LOSS) {
+      if (wormid) {
+       if (goal_worms_computed)
+         *wormid = value2;
+       else
+         *wormid = MAX_GOAL_WORMS;
+      }
+    }
+
+    if (value1 == WIN || value1 == LOSS)
+      TRACE("%oVariation %d: ALIVE (cached)\n", this_variation_number);
+    else
+      TRACE("%oVariation %d: DEAD (cached)\n", this_variation_number);
+
+    SGFTRACE(xpos, value1, "cached");
+
+    return value1;
+  }
+
+  /* In order to get a defense move even if we seem to already have
+   * escaped and to reduce the impact of overestimated escape
+   * possibilities, we don't declare escape victory on the first move.
+   *
+   * FIXME: Should introduce a new owl depth value rather than having
+   *        this hardwired value.
+   */
+  escape_route = owl_escape_route(owl);
+  if (stackp > 2 && escape_route >= 5) {
+    /* FIXME: We probably should make distinction in the returned
+     * result whether the dragon lives by making two eyes or by
+     * escaping.
+     */
+    TRACE("%oVariation %d: ALIVE (escaped)\n", this_variation_number);
+    SGFTRACE(0, WIN, "escaped");
+    READ_RETURN(OWL_DEFEND, str, depth - stackp, move, 0, WIN);
+  }
+
+  /* If reading goes to deep or we run out of nodes, we assume life. */
+  if (reading_limit_reached(&live_reason, this_variation_number)) {
+    SGFTRACE(0, WIN, live_reason);
+    READ_RETURN(OWL_DEFEND, str, depth - stackp, move, 0, WIN);
+  }
+
+  memset(mw, 0, sizeof(mw));
+  local_owl_node_counter++;
+  global_owl_node_counter++;
+
+  current_owl_data = owl;
+  memset(owl->safe_move_cache, 0, sizeof(owl->safe_move_cache));
+
+  /* First see whether we might already be alive. */
+  if (escape < MAX_ESCAPE) {
+    if (owl_estimate_life(owl, NULL, vital_moves, &live_reason, 0,
+                         &probable_eyes, &eyemin, &eyemax)) {
+      SGFTRACE(0, WIN, live_reason);
+      TRACE("%oVariation %d: ALIVE (%s)\n",
+           this_variation_number, live_reason);
+      READ_RETURN(OWL_DEFEND, str, depth - stackp, move, 0, WIN);
+    }
+  }
+  else {
+    /* In this case we don't recompute eyes. However, to avoid accessing
+     * partially-random data left on stack, we copy eye data from the
+     * previous depth level. It should be reasonably close to the actual
+     * state of eyes.
+     */
+    memcpy(owl->my_eye, owl->restore_from->my_eye, sizeof(owl->my_eye));
+    memcpy(owl->half_eye, owl->restore_from->half_eye, sizeof(owl->half_eye));
+
+    vital_moves[0].pos = 0;
+    vital_moves[0].value = -1;
+    set_eyevalue(&probable_eyes, 0, 0, 0, 0);
+  }
+
+  /* We try moves in four passes.
+   *                                stackp==0   stackp>0
+   * 0. Vital moves in the interval  [70..]      [45..]
+   * 1. Shape moves
+   * 2. Vital moves in the interval  [..69]      [..44]
+   * 3. Tactical defense moves
+   */
+  for (pass = 0; pass < 4; pass++) {
+    moves = NULL;
+    move_cutoff = 1;
+    
+    current_owl_data = owl;
+    switch (pass) {
+    /* Get the shape moves if we are in the right pass. */
+    case 1:
+      
+      if (stackp > owl_branch_depth && number_tried_moves > 0)
+       continue;
+      
+      owl_shapes(&shape_patterns, shape_moves, color, owl, &owl_defendpat_db);
+      moves = shape_moves;
+      break;
+
+    case 0:
+    case 2:
+      if (stackp > owl_branch_depth && number_tried_moves > 0)
+       continue;
+      
+      moves = vital_moves;
+      if (pass == 0 || stackp > owl_distrust_depth) {
+       if (stackp == 0)
+         move_cutoff = 70;
+       else if (eyemin + min_eyes(&probable_eyes) > 3)
+         move_cutoff = 25;
+       else if (eyemin + min_eyes(&probable_eyes) >= 3)
+         move_cutoff = 35;
+       else
+         move_cutoff = 45;
+      }
+      if (eyemax < 2 && stackp > 2)
+       move_cutoff = 99; /* Effectively disable vital moves. */
+      break;
+
+    case 3:
+      {
+       int goalcount = 0;
+
+       /* If the goal is small, try a tactical defense. */
+
+       for (k = BOARDMIN; k < BOARDMAX; k++)
+         if (ON_BOARD(k))
+           goalcount += owl->goal[k];
+
+       if (goalcount < 5) {
+
+         /* Look for a tactical defense. This is primarily intended for
+          * the case where the whole dragon is a single string, therefore
+          * we only look at the string at the "origin".
+          *
+          * We only accept clearly effective tactical defenses here,
+          * using a liberty heuristic. The reason for this is problems
+          * with ineffective self ataris which do defend tactically but
+          * have no strategical effect other than wasting owl nodes or
+          * confusing the eye analysis.
+          */
+         int dpos;
+         SGFTree *save_sgf_dumptree = sgf_dumptree;
+         int save_count_variations = count_variations;
+
+         sgf_dumptree = NULL;
+         count_variations = 0;
+         if (attack_and_defend(str, NULL, NULL, NULL, &dpos)
+             && (approxlib(dpos, color, 2, NULL) > 1
+                 || does_capture_something(dpos, color))) {
+           TRACE("Found tactical defense for %1m at %1m.\n", str, dpos);
+           set_single_owl_move(shape_moves, dpos, "tactical_defense");
+           moves = shape_moves;
+         }
+         sgf_dumptree = save_sgf_dumptree;
+         count_variations = save_count_variations;
+       }
+       if (!moves)
+         continue;
+      }
+    } /* switch (pass) */
+
+    /* For the up to MAX_MOVES best moves with value equal to
+     * move_cutoff or higher, try to defend the dragon and see if it
+     * can then be attacked.
+     */
+    for (k = 0; k < MAX_MOVES; k++) {
+      int mpos;
+      int ko_move = -1;
+      int new_escape;
+      int wid = MAX_GOAL_WORMS;
+      
+      /* Consider only the highest scoring move if we're deeper than
+       * owl_branch_depth.
+       *
+       * FIXME: To behave as intended, k should be replaced by
+       *        number_tried_moves.
+       */
+      if (stackp > owl_branch_depth && k > 0)
+       break;
+      
+      current_owl_data = owl;
+      
+      if (pass == 1) {
+        if (!get_next_move_from_list(&shape_patterns, color, shape_moves,
+                                    move_cutoff, owl))
+         break;
+      }
+      else
+       if (moves[k].value < move_cutoff)
+         break;
+      
+      mpos = moves[k].pos;
+      modify_eyefilling_move(&mpos, color);
+      ASSERT_ON_BOARD1(mpos);
+      
+      /* Have we already tested this move? */
+      if (mw[mpos])
+       continue;
+      
+      /* Try to make the move. */
+      if (!komaster_trymove(mpos, color, moves[k].name, str,
+                           &ko_move, savecode == 0))
+       continue;
+
+      new_escape = escape;
+      if (moves[k].escape)
+       new_escape++;
+
+      TRACE("Trying %C %1m. Escape = %d. Current stack: ",
+           color, mpos, escape);
+      if (verbose)
+       dump_stack();
+
+      /* We have now made a move. Analyze the new position. */
+      push_owl(&owl);
+      mw[mpos] = 1;
+      number_tried_moves++;
+
+      /* Add the stone just played to the goal dragon, unless the
+       * pattern explicitly asked for not doing this.
+       */
+      owl_update_goal(mpos, moves[k].same_dragon, moves[k].lunch, owl, 0,
+                     moves[k].pattern_data);
+      mark_goal_in_sgf(owl->goal);
+
+      if (!ko_move) {
+       int acode = do_owl_attack(str, NULL, &wid, owl, new_escape);
+       if (!acode) {
+         pop_owl(&owl);
+         popgo();
+         if (sgf_dumptree) {
+           char winstr[192];
+           sprintf(winstr, "defense effective)\n  (%d variations",   
+                           count_variations - this_variation_number);
+           SGFTRACE(mpos, WIN, winstr);
+         }
+         close_pattern_list(color, &shape_patterns);
+         READ_RETURN(OWL_DEFEND, str, depth - stackp, move, mpos, WIN);
+       }
+       if (acode == GAIN)
+         saveworm = wid;
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, acode, mpos);
+      }
+      else {
+       if (do_owl_attack(str, NULL, NULL, owl, new_escape) != WIN) {
+         savemove = mpos;
+         savecode = KO_B;
+       }
+      }
+      
+      /* Undo the tested move. */
+      pop_owl(&owl);
+      popgo();
+    }
+  }
+
+  close_pattern_list(color, &shape_patterns);
+  
+  if (savecode) {
+    if (savecode == LOSS) {
+      SGFTRACE(savemove, savecode, "defense effective (loss) - B");
+      if (wormid)
+       *wormid = saveworm;
+      READ_RETURN2(OWL_DEFEND, str, depth - stackp,
+                  move, savemove, savecode, saveworm);
+    }
+    else {
+      SGFTRACE(savemove, savecode, "defense effective (ko) - B");
+      READ_RETURN(OWL_DEFEND, str, depth - stackp, move, savemove, savecode);
+    }
+  }
+
+  if (number_tried_moves == 0 && min_eyes(&probable_eyes) >= 2) {
+    SGFTRACE(0, WIN, "genus probably >= 2");
+    READ_RETURN(OWL_DEFEND, str, depth - stackp, move, 0, WIN);
+  }
+  
+
+  if (sgf_dumptree) {
+    char winstr[196];
+    int print_genus = eyemin == 1 ? 1 : 0;
+    sprintf(winstr, "defense failed - genus %d)\n  (%d variations",
+                   print_genus, count_variations - this_variation_number);
+    SGFTRACE(0, 0, winstr);
+  }
+
+  READ_RETURN0(OWL_DEFEND, str, depth - stackp);
+}
+
+
+/* Returns true if the dragon at (target) can be defended given
+ * two moves in a row. The first two moves to defend the
+ * dragon are given as (*defend1) and (*defend2).
+ */
+
+int
+owl_threaten_defense(int target, int *defend1, int *defend2)
+{
+  struct owl_move_data moves[MAX_MOVES];
+  int k;
+  int color = board[target];
+  int result = 0;
+  struct local_owl_data *owl;
+  int reading_nodes_when_called = get_reading_node_counter();
+  signed char saved_goal[BOARDMAX];
+  double start = 0.0;
+  int tactical_nodes;
+  int move = 0;
+  int move2 = 0;
+  struct matched_patterns_list_data shape_patterns;
+
+  shape_patterns.initialized = 0;
+
+  result_certain = 1;
+  if (worm[target].unconditional_status == DEAD)
+    return 0;
+
+  if (search_persistent_owl_cache(OWL_THREATEN_DEFENSE, target, 0, 0,
+                                 &result, defend1, defend2, NULL))
+    return result;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  TRACE("owl_threaten_defense %1m\n", target);
+  init_owl(&owl, target, NO_MOVE, NO_MOVE, 1, NULL);
+  memcpy(saved_goal, owl->goal, sizeof(saved_goal));
+  owl_make_domains(owl, NULL);
+  owl_shapes(&shape_patterns, moves, color, owl, &owl_defendpat_db);
+  for (k = 0; k < MAX_MOVES; k++) {
+    current_owl_data = owl;
+    if (!get_next_move_from_list(&shape_patterns, color, moves, 1, owl))
+      break;
+    else {
+      if (moves[k].pos != NO_MOVE && moves[k].value > 0)
+       if (trymove(moves[k].pos, color, moves[k].name, target)) {
+         owl->lunches_are_current = 0;
+         owl_update_goal(moves[k].pos, moves[k].same_dragon,
+                         moves[k].lunch, owl, 0, moves[k].pattern_data);
+         if (do_owl_defend(target, &move2, NULL, owl, 0) == WIN) {
+           move = moves[k].pos;
+           popgo();
+           /* Don't return the second move if occupied before trymove */
+           if (move2 != NO_MOVE && IS_STONE(board[move2]))
+             move2 = NO_MOVE;
+           result = WIN;
+           break;
+         }
+         else
+           popgo();
+         memcpy(owl->goal, saved_goal, sizeof(saved_goal));
+       }
+    }
+  }
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+  gg_assert(stackp == 0);
+
+  DEBUG(DEBUG_OWL_PERFORMANCE, 
+    "owl_threaten_defense %1m %1m %1m, result %d (%d, %d nodes, %f seconds)\n",
+           target, move, move2, result, local_owl_node_counter,
+           tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_THREATEN_DEFENSE, target, 0, 0,
+                            result, move, move2, 0,
+                            tactical_nodes, owl->goal, board[target]);
+
+  if (defend1)
+    *defend1 = move;
+  if (defend2)
+    *defend2 = move2;
+
+  close_pattern_list(color, &shape_patterns);
+  return result;
+}
+
+
+
+/*
+ * This function calls owl_determine_life() to get an eye estimate,
+ * and matchpat() for vital attack moves, and decides according to
+ * various policies (depth-dependant) whether the dragon should thus
+ * be considered alive.
+ */
+static int
+owl_estimate_life(struct local_owl_data *owl,
+                 struct local_owl_data *second_owl,
+                 struct owl_move_data vital_moves[MAX_MOVES],
+                 const char **live_reason, int does_attack,
+                 struct eyevalue *probable_eyes, int *eyemin, int *eyemax)
+{
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  struct owl_move_data dummy_moves[MAX_MOVES];
+  int other = OTHER_COLOR(owl->color);
+
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  owl_determine_life(owl, second_owl, does_attack, vital_moves,
+                    probable_eyes, eyemin, eyemax);
+
+  matches_found = 0;
+  memset(found_matches, 0, sizeof(found_matches));
+
+  if (get_level() >= 8) {
+    memset(owl->safe_move_cache, 0, sizeof(owl->safe_move_cache));
+    if (!does_attack) {
+      clear_owl_move_data(dummy_moves);
+      matchpat(owl_shapes_callback, other,
+              &owl_vital_apat_db, dummy_moves, owl->goal);
+    }
+    else if (max_eyes(probable_eyes) >= 2)
+      matchpat(owl_shapes_callback, other,
+              &owl_vital_apat_db, vital_moves, owl->goal);
+  }
+
+  if ((debug & DEBUG_EYES) && (debug & DEBUG_OWL))
+    gprintf("owl: eyemin=%d matches_found=%d\n", *eyemin, matches_found);
+  if (*eyemin >= matches_found)
+    *eyemin -= matches_found;
+  else
+    *eyemin = 0;
+
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  if (*eyemin >= 2
+      || (*eyemin == 1 && min_eyes(probable_eyes) >= 4)
+      || (stackp > owl_distrust_depth
+         && min_eyes(probable_eyes) >= 2
+         && !matches_found)) {
+    if (*eyemin >= 2)
+      *live_reason = "2 or more secure eyes";
+    else if (*eyemin == 1 && min_eyes(probable_eyes) >= 4)
+      *live_reason = "1 secure eye, likely >= 4";
+    else if (stackp > owl_distrust_depth
+            && min_eyes(probable_eyes) >= 2
+            && !matches_found)
+      *live_reason = "getting deep, looks lively";
+    else
+      gg_assert(0);
+    return 1;
+  }
+
+  if (!does_attack
+      && (*eyemin + matches_found >= 2
+         || (*eyemin + matches_found == 1 && min_eyes(probable_eyes) >= 4)
+      || (stackp > owl_distrust_depth
+         && min_eyes(probable_eyes) >= 2))) {
+    /* We are not yet alive only due to owl vital attack patterns matching.
+     * Let's try to defend against it.
+     */
+    owl_add_move(vital_moves, dummy_moves[0].defense_pos,
+                dummy_moves[0].value, dummy_moves[0].name,
+                SAME_DRAGON_CONNECTED, NO_MOVE, 0, NO_MOVE, MAX_MOVES, NULL);
+  }
+
+  return 0;
+}
+
+
+/* 
+ * This function is invoked from do_owl_attack() and do_owl_defend()
+ * for each node to determine whether the the dragon has sufficient
+ * eye potential to live. It also generates vital moves to attack or
+ * defend the eyes. There are two distinct sources for eyes. The first
+ * is the eyespaces found by make_domains() and evaluated by
+ * compute_eyes_pessimistic(). The second is the lunches found by
+ * owl_find_lunches() and evaluated by sniff_lunch().
+ *
+ * The best guess of the eye potential is stored as an eyevalue in
+ * *probable_eyes. This is not entirely reliable though since the
+ * graph matching techniques in optics.c fail to understand subtleties
+ * like atari inside the eyespace, cutting points in the wall, and
+ * shortage of outside liberties. (The patterns in owl_vital_apats.db
+ * are used to compensate for this. See do_owl_attack() and
+ * do_owl_defend() for how these are used.) Also the estimates from
+ * sniff_lunch() are fairly unreliable.
+ *
+ * A lower and upper bound on the number of eyes are returned in
+ * *eyemin and *eyemax. The value of *eyemin must be offset by the
+ * matches of owl_vital_apats.db. If that number is 2 or larger, we
+ * should be certain of life.
+ *
+ * Vital moves to attack or defend eyes are returned in the moves[]
+ * array. Also moves to reduce the uncertainty of the eye estimates
+ * are added to this array, but with smaller move values. The
+ * parameter does_attack determines whether to generate vital attack
+ * moves or vital defense moves.
+ *
+ * The dragon is specified by the information in the owl struct. The
+ * color of the dragon is passed in the color parameter.
+ *
+ * For use in the semeai code, a second dragon can be provided. Set
+ * this to NULL when only one dragon is involved.
+ */
+
+static void
+owl_determine_life(struct local_owl_data *owl,
+                  struct local_owl_data *second_owl,
+                  int does_attack,
+                  struct owl_move_data *moves,
+                  struct eyevalue *probable_eyes, int *eyemin, int *eyemax)
+{
+  int color = owl->color;
+  struct eye_data *eye = owl->my_eye;
+  int mw[BOARDMAX];  /* mark relevant eye origins */
+  int mz[BOARDMAX];  /* mark potentially irrelevant eye origins */
+  int vital_values[BOARDMAX];
+  int dummy_eyemin = 0;
+  int dummy_eyemax = 0;
+  struct eyevalue eyevalue;
+  struct eyevalue eyevalue_list[BOARDMAX/2];
+  int eyes_attack_points[BOARDMAX/2];
+  int pessimistic_min;
+  int attack_point;
+  int defense_point;
+  int pos;
+  int k;
+  int lunch;
+  int num_eyes = 0;
+  int num_lunches = 0;
+  int save_debug = debug;
+  memset(vital_values, 0, sizeof(vital_values));
+
+  if (!eyemin)
+    eyemin = &dummy_eyemin;
+  if (!eyemax)
+    eyemax = &dummy_eyemax;
+
+  *eyemin = 0;
+  *eyemax = 0;
+  
+  /* Turn off eye debugging if we're not also debugging owl. */
+  if (!(debug & DEBUG_OWL))
+    debug &= ~DEBUG_EYES;
+  
+  clear_owl_move_data(moves);
+  
+  if (!owl->lunches_are_current)
+    owl_find_lunches(owl);
+  
+  if (0) {
+    for (k = 0; k < MAX_LUNCHES; k++)
+      if (owl->lunch[k] != NO_MOVE)
+       gprintf("owl lunch %1m, attack %1m, defend %1m\n",
+               owl->lunch[k],
+               owl->lunch_attack_point[k],
+               owl->lunch_defense_point[k]);
+  }
+
+  owl_make_domains(owl, second_owl);
+
+  owl_find_relevant_eyespaces(owl, mw, mz);
+
+  /* Reset halfeye data. Set topological eye value to something big. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)) {
+      owl->half_eye[pos].type = 0;
+      owl->half_eye[pos].value = 10.0;
+    }
+  }
+  
+  /* Find topological half eyes and false eyes. */
+  find_half_and_false_eyes(color, eye, owl->half_eye, mw);
+
+  /* The eyespaces may have been split or changed in other ways by the
+   * topological analysis, so we need to regenerate them and once more
+   * determine which ones are relevant.
+   */
+  partition_eyespaces(owl->my_eye, owl->color);
+  owl_find_relevant_eyespaces(owl, mw, mz);
+  
+  set_eyevalue(probable_eyes, 0, 0, 0, 0);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && mw[pos] > 1) {
+      int value = 0;
+      const char *reason = "";
+      compute_eyes_pessimistic(pos, &eyevalue, &pessimistic_min,
+                              &attack_point, &defense_point,
+                              eye, owl->half_eye);
+
+      /* If the eyespace is more in contact with own stones not in the goal,
+       * than with ones in the goal, there is a risk that we can be cut off
+       * from a major part of the eyespace. Thus we can't trust the opinion
+       * of compute_eyes().
+       *
+       * (Obviously this is a quite fuzzy heuristic. With more accurate
+       * connection analysis in the owl code we could do this more robustly.)
+       */
+      if (mw[pos] < mz[pos]
+         || (mw[pos] < 3 * mz[pos] && mz[pos] > 5))
+       pessimistic_min = 0;
+
+      /* It appears that this policy is needed no longer. */
+#if 0
+      /* If this eyespace includes an owl inessential string, we must assume
+       * that the pessimistic min is 0.
+       */
+      if (pessimistic_min > 0) {
+       for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+         if (ON_BOARD(pos2)
+             && eye[pos2].origin == pos
+             && owl->inessential[pos2]) {
+           pessimistic_min = 0;
+           break;
+         }
+       }
+      }
+#endif
+
+      eyes_attack_points[num_eyes] = NO_MOVE;
+      eyevalue_list[num_eyes] = eyevalue;
+      *eyemin += pessimistic_min;
+
+      /* Fill in the value field for use by the owl_eyespace() function. */
+      eye[pos].value = eyevalue;
+
+      /* This shortcut has been disabled for two reasons:
+       * 1. Due to the vital attack moves being able to later reduce
+       * the *eyemin, we can't say that a certain *eyemin is
+       * sufficient.
+       * 2. This part of the code is in no way time critical.
+       */
+#if 0
+      /* Found two certain eyes---look no further. */
+      if (*eyemin >= 2) {
+       debug = save_debug;
+       return 2;
+      }
+#endif
+
+      if (eye_move_urgency(&eyevalue)) {
+       value = 50;
+       if (max_eyes(&eyevalue) - min_eyes(&eyevalue) == 2)
+         value = 70;
+       else if (max_eyes(&eyevalue) - pessimistic_min == 2)
+         value = 60;
+       reason = "vital move";
+      }
+      else if (max_eyes(&eyevalue) != pessimistic_min) {
+       if (max_eyes(&eyevalue) - pessimistic_min == 2)
+         value = 40;
+       else
+         value = 30;
+       reason = "marginal eye space";
+      }
+
+      if (value > 0) {
+       if (does_attack && attack_point != NO_MOVE) {
+         if (vital_values[attack_point] > 0) {
+           value += vital_values[attack_point];
+           if (value > 98)
+             value = 98; /* Higher values may get special interpretation. */
+         }
+
+         TRACE("%s at %1m, score %d (eye at %1m, value %s, pessimistic_min %d)\n",
+               reason, attack_point, value,
+               pos, eyevalue_to_string(&eyevalue), pessimistic_min);
+
+         if (eye[attack_point].marginal
+             && modify_stupid_eye_vital_point(owl, &attack_point, 1))
+           TRACE("vital point looked stupid, moved it to %1m\n",
+                 attack_point);
+
+         if (attack_point != NO_MOVE) {
+           owl_add_move(moves, attack_point, value, reason,
+                        SAME_DRAGON_MAYBE_CONNECTED, NO_MOVE,
+                        0, NO_MOVE, MAX_MOVES, NULL);
+           vital_values[attack_point] = value;
+           eyes_attack_points[num_eyes] = attack_point;
+         }
+       }
+
+       /* The reason for the last set of tests is that we don't
+        * want to play a self atari in e.g. this position
+        *
+        * |XXX.
+        * |OOX.
+        * |.OX.
+        * |XOXX
+        * |XOOX
+        * |O*OX
+        * +----
+        *
+        * but it's okay in this position
+        * 
+        * |XXXXX
+        * |....X
+        * |OOOOX
+        * |.XXOX
+        * |.*XOX
+        * +-----
+        *
+        * In both cases * is the vital point according to the graph
+        * matching. The significant difference is that in the first
+        * case the vital point is adjacent to stones in the goal.
+        */
+       else if (!does_attack
+                && defense_point != NO_MOVE
+                && board[defense_point] == EMPTY
+                && (!liberty_of_goal(defense_point, owl)
+                    || !is_self_atari(defense_point, color)
+                    || is_ko(defense_point, color, NULL)
+                    || safe_move(defense_point, color) != 0)) {
+         if (vital_values[defense_point] > 0) {
+           value += vital_values[defense_point];
+           if (value > 98)
+             value = 98; /* Higher values may get special interpretation. */
+         }
+
+         TRACE("%s at %1m, score %d (eye at %1m, value %s, pessimistic_min %d)\n",
+               reason, defense_point, value, pos,
+               eyevalue_to_string(&eyevalue), pessimistic_min);
+
+         if ((eye[defense_point].marginal
+              || eye[defense_point].origin != pos)
+             && modify_stupid_eye_vital_point(owl, &defense_point, 0))
+           TRACE("vital point looked stupid, moved it to %1m\n",
+                 defense_point);
+
+         if (defense_point != NO_MOVE) {
+           owl_add_move(moves, defense_point, value, reason,
+                        SAME_DRAGON_MAYBE_CONNECTED, NO_MOVE,
+                        0, NO_MOVE, MAX_MOVES, NULL);
+           vital_values[defense_point] = value;
+         }
+       }
+      }
+      num_eyes++;
+    }
+  }
+
+  /* Sniff each lunch for nutritional value. The assumption is that
+   * capturing the lunch is gote, therefore the number of half eyes
+   * equals the MINIMUM number of eyes yielded by the resulting eye
+   * space.
+   */
+  {
+    for (lunch = 0; (lunch < MAX_LUNCHES); lunch++)
+      if (owl->lunch[lunch] != NO_MOVE
+         && owl->lunch_defense_point[lunch] != NO_MOVE) {
+       int value = 0;
+       int lunch_min;
+       int lunch_probable;
+       int lunch_max;
+       struct eyevalue e;
+       sniff_lunch(owl->lunch[lunch], 
+                   &lunch_min, &lunch_probable, &lunch_max, owl);
+
+       set_eyevalue(&e, 0, 0, lunch_probable, lunch_probable);
+       *eyemax += lunch_max;
+
+       if (lunch_probable == 0) {
+         if (countstones(owl->lunch[lunch]) == 1)
+           continue;
+         value = 20;
+       }
+       else if (lunch_probable == 1 && lunch_max == 1)
+         value = 60 + countstones(owl->lunch[lunch]);
+       else if (lunch_probable == 1 && lunch_max == 2)
+         value = 70 + countstones(owl->lunch[lunch]);
+       else
+         value = 75 + countstones(owl->lunch[lunch]);
+
+       if (owl->lunch_attack_code[lunch] != WIN)
+         value -= 10;
+
+       if (does_attack) {
+         defense_point = improve_lunch_defense(owl->lunch[lunch],
+                                               owl->lunch_defense_point[lunch]);
+
+         if (vital_values[defense_point]) {
+           /* The point here is that the move which saves the lunch also
+            * attacks an eye. So this attack move reduces the global eye
+            * potential. The eyes arithmetic for probable_eyes has then
+            * to be adapted accordingly.
+            */
+           int ne;
+           for (ne = 0; ne < num_eyes - num_lunches; ne++)
+             if (eyes_attack_points[ne] == defense_point)
+               break;
+           gg_assert(ne < num_eyes - num_lunches);
+           /* merge eye values */
+           add_eyevalues(&eyevalue_list[ne], &e, &eyevalue_list[ne]);
+           /* and adjust */
+           eyevalue_list[ne].a = 0;
+           eyevalue_list[ne].b = 0;
+         } 
+         else {
+           num_lunches++;
+           eyevalue_list[num_eyes++] = e;
+         }
+
+         TRACE("save lunch at %1m with %1m, score %d, probable eye %d, max eye %d\n",
+               owl->lunch[lunch], defense_point, value,
+               lunch_probable, lunch_max);
+         owl_add_move(moves, defense_point, value,
+                      "save lunch", SAME_DRAGON_MAYBE_CONNECTED,
+                      NO_MOVE, 0, NO_MOVE, MAX_MOVES, NULL);
+       }
+       else {
+         attack_point = improve_lunch_attack(owl->lunch[lunch],
+                                             owl->lunch_attack_point[lunch]);
+         TRACE("eat lunch at %1m with %1m, score %d, probable eye %d, max eye %d\n",
+               owl->lunch[lunch], attack_point, value,
+               lunch_probable, lunch_max);
+         /* We only remember the lunch for owl_update_goal() if the lunch
+          * cannot be defended with ko after the move.
+          * If we capture the lunch by an illegal ko capture, we become
+          * ko master with this move, and hence the above is true.
+          */
+         if (owl->lunch_attack_code[lunch] ==  WIN
+             || is_illegal_ko_capture(attack_point, owl->color))
+           owl_add_move(moves, attack_point, value, "eat lunch",
+                        SAME_DRAGON_MAYBE_CONNECTED, owl->lunch[lunch],
+                        0, NO_MOVE, MAX_MOVES, NULL);
+         else
+           owl_add_move(moves, attack_point, value, "eat lunch",
+                        SAME_DRAGON_MAYBE_CONNECTED, NO_MOVE, 0, NO_MOVE,
+                        MAX_MOVES, NULL);
+         num_lunches++;
+         eyevalue_list[num_eyes++] = e;
+       }
+      }
+  }
+
+  /* now, totalize the eye potential */
+  {
+    int ne;
+    for (ne = 0; ne < num_eyes - num_lunches; ne++)
+      add_eyevalues(probable_eyes, &eyevalue_list[ne], probable_eyes);
+
+    *eyemax += max_eyes(probable_eyes);
+    /* If we have at least two different eyespaces and can create one eye
+     * in sente, we assume there's a chance to create another one. This is
+     * needed because optics code don't know about eyespaces influencing
+     * each other and combination moves (i.e. double threats to create an
+     * eye).
+     */
+    if (num_eyes - num_lunches > 1 && max_eye_threat(probable_eyes) > 1)
+      *eyemax += 1;
+
+    for (; ne < num_eyes; ne++)
+      add_eyevalues(probable_eyes, &eyevalue_list[ne], probable_eyes);
+  }
+
+  debug = save_debug;
+}
+
+
+/* The eyespaces we want to evaluate are the ones which
+ * are adjacent to the dragon (whose stones comprise the
+ * support of goal) which are not GRAY bordered. These
+ * are the eyespaces of the dragon. Now we find their
+ * origins.
+ *
+ * It is required that there are at least two distinct connections,
+ * adjacent or diagonal, between non-marginal eyespace vertices and
+ * stones of the goal dragon. Otherwise there is a risk that we
+ * include irrelevant eye spaces.
+ */
+
+static void
+owl_find_relevant_eyespaces(struct local_owl_data *owl,
+                           int mw[BOARDMAX], int mz[BOARDMAX])
+{
+  int pos;
+  int eye_color;
+  int k;
+  struct eye_data *eye = owl->my_eye;
+  
+  if (owl->color == WHITE)
+    eye_color = WHITE;
+  else
+    eye_color = BLACK;
+
+  memset(mw, 0, BOARDMAX * sizeof(mw[0]));
+  memset(mz, 0, BOARDMAX * sizeof(mz[0]));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == owl->color) {
+      for (k = 0; k < 8; k++) {
+       int pos2 = pos + delta[k];
+       if (ON_BOARD(pos2)
+           && eye[pos2].color == eye_color
+           && !eye[pos2].marginal) {
+         if (owl->goal[pos])
+           mw[eye[pos2].origin]++;
+         else
+           mz[eye[pos2].origin]++;
+       }
+      }
+    }
+  }
+}
+
+/* Case 1.
+ *
+ * The optics code occasionally comes up with stupid vital moves, like
+ * a in this position:
+ *
+ * ----+
+ * O...|
+ * OX..|
+ * OX..|
+ * O.X.|
+ * .O.a|
+ * ....|
+ *
+ * This function moves such moves to the second line.
+ *
+ * Case 2.
+ *
+ * In this position the optics code can suggest the empty 1-2 point as
+ * vital move for the eyespace on the right edge. That is okay for attack
+ * but obviously not for defense.
+ *
+ * ----+
+ * XO.O|
+ * XOOX|
+ * XXO.|
+ * .XOO|
+ * .XXX|
+ *
+ * Case 3.
+ *
+ * Playing into a snapback is usually not an effective way to destroy
+ * an eye.
+ *
+ * XOOO|
+ * XOXX|
+ * XXO.|
+ * .XXO|
+ * ....|
+ *
+ * This function changes the attack point to NO_MOVE (i.e. removes it).
+ */
+static int
+modify_stupid_eye_vital_point(struct local_owl_data *owl, int *vital_point,
+                             int is_attack_point)
+{
+  int up;
+  int right;
+  int k;
+  int libs[2];
+
+  /* Case 1. */
+  for (k = 0; k < 4; k++) {
+    up = delta[k];
+    if (ON_BOARD(*vital_point - up))
+      continue;
+
+    if (board[*vital_point + up] != EMPTY)
+      continue;
+
+    right = delta[(k+1) % 4];
+
+    if (board[*vital_point + right] != EMPTY
+       || board[*vital_point - right] != EMPTY)
+      continue;
+
+    if (board[*vital_point + 2 * up] != EMPTY
+       || board[*vital_point + up + right] != EMPTY
+       || board[*vital_point + up - right] != EMPTY) {
+      *vital_point += up;
+      return 1;
+    }
+  }
+
+  /* Case 2. */
+  if (!is_attack_point) {
+    if (approxlib(*vital_point, OTHER_COLOR(owl->color), 1, NULL) == 0) {
+      for (k = 4; k < 8; k++) {
+       int pos = *vital_point + delta[k];
+       if (board[pos] == OTHER_COLOR(owl->color)
+           && countlib(pos) == 1) {
+         findlib(pos, 1, vital_point);
+         return 1;
+       }
+      }
+    }
+  }
+
+  /* Case 3. */
+  if (is_attack_point
+      && does_capture_something(*vital_point, OTHER_COLOR(owl->color))
+      && accuratelib(*vital_point, OTHER_COLOR(owl->color), 2, libs) == 1
+      && !attack(libs[0], NULL)) {
+    *vital_point = NO_MOVE;
+    return 1;
+  }
+
+  return 0;
+}
+
+
+/* The purpose of this function is to avoid moves which needlessly
+ * fill in an eye. A typical example, from ld_owl:188, is
+ *
+ * -----+
+ * .O.OX|
+ * XOOXX|
+ * XXOOX|
+ * .XXO.|
+ * ..XOO|
+ * ..XXX|
+ *
+ * where various patterns manage to propose the eye-filling move on
+ * the top edge instead of capturing the opponent stones and get two
+ * solid eyes. This function modifies the move accordingly.
+ */
+static int
+modify_eyefilling_move(int *move, int color)
+{
+  int k;
+  int r;
+  int other = OTHER_COLOR(color);
+  /* Only do this for a small eye. */
+  for (k = 0; k < 4; k++)
+    if (ON_BOARD(*move + delta[k]) && board[*move + delta[k]] != color)
+      return 0;
+
+  for (r = 4; r < 8; r++)
+    if (board[*move + delta[r]] == other
+       && countlib(*move + delta[r]) == 1) {
+      for (k = 0; k < 4; k++)
+       if (board[*move + delta[k]] == color
+           && countlib(*move + delta[k]) == 1
+           && !adjacent_strings(*move + delta[r], *move + delta[k]))
+         break;
+
+      if (k == 4) {
+       int new_move;
+       findlib(*move + delta[r], 1, &new_move);
+       TRACE("Changing eyefilling move at %1m to capture at %1m.\n",
+             *move, new_move);
+       *move = new_move;
+       return 1;
+      }
+    }
+  
+  return 0;    
+}
+
+
+/* 
+ * Generates up to max_moves moves, attempting to attack or defend the goal
+ * dragon. The found moves are put in moves, an array of owl_move_data
+ * structs, starting in the position 'initial'.  The entries in the array are
+ * sorted by value with moves[initial] having highest priority. When no more
+ * moves are available this is indicated by value and coordinates in the array
+ * being -1.
+ *
+ * This function automatically initializes the owl_safe_move cache the
+ * pattern list. WATCH OUT: This has to be matched with a call to
+ * close_pattern_list(pattern_list)!!!
+ *
+ * Returns 1 if at least one move is found, or 0 if no move is found.
+ */
+
+static void
+owl_shapes(struct matched_patterns_list_data *pattern_list,
+           struct owl_move_data moves[MAX_MOVES],
+          int color, struct local_owl_data *owl, struct pattern_db *type)
+{
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  current_owl_data = owl;
+  
+  clear_owl_move_data(moves);
+
+  /* We must reset the owl safe_move_cache before starting the
+   * pattern matching. The cache is used by owl_shapes_callback().
+   */
+  memset(owl->safe_move_cache, 0, sizeof(owl->safe_move_cache));
+  init_pattern_list(pattern_list);
+  matchpat(collect_owl_shapes_callbacks, color, type, pattern_list, owl->goal);
+
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+}
+
+
+/* This function contains all the expensive checks for a matched pattern. */
+static int
+check_pattern_hard(int move, int color, struct pattern *pattern, int ll)
+{
+  int constraint_checked = 0;
+  int safe_move_checked = 0;
+
+  /* The very first check is whether we can disregard the pattern due
+   * due to an owl safe_move_cache lookup.
+   */
+  if (!(pattern->class & CLASS_s))
+    if (current_owl_data->safe_move_cache[move]) {
+      if (current_owl_data->safe_move_cache[move] == 1)
+        return 0;
+      else
+        safe_move_checked = 1;
+    }
+
+  /* If the constraint is cheap to check, we do this first. */
+  if ((pattern->autohelper_flag & HAVE_CONSTRAINT)
+      && pattern->constraint_cost < 0.45) {
+    if (!pattern->autohelper(ll, move, color, 0))
+      return 0;
+    constraint_checked = 1;
+  }
+
+  /* For sacrifice patterns, the survival of the stone to be played is
+   * not checked. Otherwise we discard moves which can be captured. 
+   * Illegal ko captures are accepted for ko analysis.
+   */
+  if (!(pattern->class & CLASS_s) && !safe_move_checked) {
+    if (!owl_safe_move(move, color)) {
+      if (0)
+       TRACE("  move at %1m wasn't safe, discarded\n", move);
+      return 0;
+    }
+    if (!is_legal(move, color)) {
+      if (0)
+       TRACE("  move at %1m wasn't legal, discarded\n", move);
+      return 0;
+    }
+  }
+  
+  /* For class n patterns, the pattern is contingent on an opponent
+   * move at * not being captured.
+   *
+   * We can't use owl_safe_move() here because we would try the wrong color.
+   */
+  if (pattern->class & CLASS_n) {
+    if (safe_move(move, OTHER_COLOR(color)) == 0) {
+      if (0)
+       TRACE("  opponent can't play safely at %1m, move discarded\n", move);
+      return 0;
+    }
+  }
+
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if ((pattern->autohelper_flag & HAVE_CONSTRAINT) && !constraint_checked)
+    if (!pattern->autohelper(ll, move, color, 0))
+      return 0;
+  return 1;
+}
+
+
+/* This initializes a pattern list, allocating memory for 200 patterns.
+ * If more patterns need to be stored, collect_owl_shapes_callbacks will
+ * dynamically reallocate additional memory.
+ * The space for list->pattern_list is allocated here.
+ *
+ * This function is automatically called from owl_shapes. Every call here
+ * has to be matched by a call to close_pattern_list below.
+ */
+static void
+init_pattern_list(struct matched_patterns_list_data *list)
+{
+  gg_assert(!list->initialized);
+
+  list->counter = 0;
+  list->used = 0;
+
+  list->pattern_list = malloc(200 * sizeof(list->pattern_list[0]));
+  list->list_size = 200;
+  gg_assert(list->pattern_list != NULL);
+  list->pattern_heap = NULL;
+
+  if (0)
+    gprintf("List at %x has new array at %x\n", list, list->pattern_list);
+
+  list->initialized = 1;
+}
+
+
+/* This function has to get called before the memory of *list is freed
+ * in the calling function.
+ */
+static void
+close_pattern_list(int color, struct matched_patterns_list_data *list)
+{
+  if (list->initialized) {
+    if (0)
+      gprintf("%d patterns matched, %d patterns checked\n", list->counter,
+             list->used);
+    if (0)
+      gprintf("Pattern list at %x freed for list at %x\n",
+             list->pattern_list, list);
+    if (allpats && verbose) {
+      int i;
+      int found_one = 0;
+      SGFTree *save_sgf_dumptree = sgf_dumptree;
+      int save_count_variations = count_variations;
+      sgf_dumptree = NULL;
+      count_variations = 0;
+
+      if (!current_owl_data->lunches_are_current)
+       owl_find_lunches(current_owl_data);
+
+      if (!list->pattern_heap)
+       pattern_list_build_heap(list);
+
+      for (i = 0; i < list->heap_num_patterns; i++)
+       if (check_pattern_hard(list->pattern_heap[i]->move, color,
+                              list->pattern_heap[i]->pattern,
+                              list->pattern_heap[i]->ll)) {
+         if (!found_one) {
+           TRACE("Remaining valid (but unused) patterns at stack: ");
+           dump_stack();
+           found_one = 1;
+         }
+         TRACE("Pattern %s found at %1m with value %d\n",
+               list->pattern_heap[i]->pattern->name,
+               list->pattern_heap[i]->move,
+               (int) list->pattern_heap[i]->pattern->value);
+       }
+      
+      sgf_dumptree = save_sgf_dumptree;
+      count_variations = save_count_variations;
+    }
+
+    free(list->pattern_list);
+    free(list->pattern_heap);
+  }
+  list->counter = -1;
+}
+
+
+/* Can be called from gdb for debugging:
+ * (gdb) set dump_pattern_list(&shape_patterns)
+ */
+void
+dump_pattern_list(struct matched_patterns_list_data *list)
+{
+  int i;
+  struct matched_pattern_data *matched_pattern;
+  if (!list->initialized)
+    return;
+  gprintf("%oList size %d. %d Patterns in list, %d have been used.",
+         list->list_size, list->counter, list->used);
+  for (i = 0; i < list->counter; i++) {
+    matched_pattern = &list->pattern_list[i];
+    gprintf("%o\n  Pattern %s (orient. %d) at %1m, value %f.",
+           matched_pattern->pattern->name, matched_pattern->ll,
+           matched_pattern->move, matched_pattern->pattern->value);
+    if (matched_pattern->next_pattern_index != -1)
+      gprintf("%o * ");
+  }
+  gprintf("%o\n");
+
+  gprintf("%oCurrent heap ordering: \n");
+  for (i = 0; i < list->heap_num_patterns; i++) {
+    matched_pattern = list->pattern_heap[i];
+    gprintf("%o %s (%1m), %f; ", matched_pattern->pattern->name,
+           matched_pattern->move, matched_pattern->pattern->value);
+  }
+  gprintf("\n");
+}
+
+
+/* This function stores a found pattern in the list for later evaluation.
+ * The only processing done is computing the position of the move, and
+ * forgetting the color.
+ */
+static void
+collect_owl_shapes_callbacks(int anchor, int color, struct pattern *pattern,
+                             int ll, void *data)
+{
+  struct matched_patterns_list_data *matched_patterns = data;
+  struct matched_pattern_data *next_pattern;
+
+  UNUSED(color); /* The calling function has to remember that. */
+
+  if (matched_patterns->counter >= matched_patterns->list_size) {
+    matched_patterns->list_size += 100;
+    matched_patterns->pattern_list
+        = realloc(matched_patterns->pattern_list,
+                 matched_patterns->list_size
+                 * sizeof(matched_patterns->pattern_list[0]));
+  }
+
+  next_pattern = &matched_patterns->pattern_list[matched_patterns->counter];
+  next_pattern->move   = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+  next_pattern->value  = pattern->value;
+  next_pattern->ll     = ll;
+  next_pattern->anchor = anchor;
+  next_pattern->pattern        = pattern;
+  next_pattern->next_pattern_index = -1;
+
+  matched_patterns->counter++;
+}
+
+
+#define MAX_STORED_REASONS     4
+
+static int
+valuate_combinable_pattern_chain(struct matched_patterns_list_data *list,
+                                int pos)
+{
+  /* FIXME: This is just a first attempt at pattern combination.
+   *       Improve it.  The first idea is to differentiate between
+   *       move reason types.  For instance, when there is a secure
+   *       eye already, a threat to create another is more severe.
+   *
+   *       This will certainly involve splitting the function into
+   *       attack and defense versions.
+   */
+
+  int pattern_index = list->first_pattern_index[pos];
+  int num_capture_threats = 0;
+  int capture_threats[MAX_STORED_REASONS];
+  int num_eye_threats = 0;
+  int eye_threats[MAX_STORED_REASONS];
+  int num_reverse_sente = 0;
+  int reverse_sente_against[MAX_STORED_REASONS];
+  int num_move_reasons;
+  float full_value = 0.0;
+
+  ASSERT1(pattern_index != -1, pos);
+
+  do {
+    struct matched_pattern_data *pattern_data = (list->pattern_list
+                                                + pattern_index);
+    struct pattern_attribute *attribute;
+
+    /* Skip patterns that haven't passed constraint validation. */
+    if (pattern_data->pattern) {
+      for (attribute = pattern_data->pattern->attributes;
+          attribute->type != LAST_ATTRIBUTE;
+          attribute++) {
+       int k;
+       int target = AFFINE_TRANSFORM(attribute->offset, pattern_data->ll,
+                                     pattern_data->move);
+
+       switch (attribute->type) {
+       case THREATENS_TO_CAPTURE:
+         if (num_capture_threats < MAX_STORED_REASONS) {
+           ASSERT1(IS_STONE(board[target]), target);
+           target = find_origin(target);
+
+           for (k = 0; k < num_capture_threats; k++) {
+             if (capture_threats[k] == target)
+               break;
+           }
+
+           if (k == num_capture_threats) {
+             capture_threats[num_capture_threats++] = target;
+             full_value += pattern_data->pattern->value;
+           }
+         }
+
+         break;
+
+       case THREATENS_EYE:
+         if (num_eye_threats < MAX_STORED_REASONS) {
+           target = current_owl_data->my_eye[target].origin;
+
+           for (k = 0; k < num_eye_threats; k++) {
+             if (eye_threats[k] == target)
+               break;
+           }
+
+           if (k == num_eye_threats) {
+             eye_threats[num_eye_threats++] = target;
+             full_value += pattern_data->pattern->value;
+           }
+         }
+
+         break;
+
+       case REVERSE_SENTE:
+         if (num_reverse_sente < MAX_STORED_REASONS) {
+           ASSERT1(board[target] == EMPTY, target);
+
+           for (k = 0; k < num_reverse_sente; k++) {
+             if (reverse_sente_against[k] == target)
+               break;
+           }
+
+           if (k == num_reverse_sente) {
+             reverse_sente_against[num_reverse_sente++] = target;
+             full_value += pattern_data->pattern->value;
+           }
+         }
+
+         break;
+
+       default:
+         gg_assert(0);
+       }
+      }
+    }
+
+    pattern_index = pattern_data->next_pattern_index;
+  } while (pattern_index >= 0);
+
+
+  num_move_reasons = num_capture_threats + num_eye_threats + num_reverse_sente;
+  if (num_move_reasons <= 1) {
+    /* Not much to combine, eh? */
+    return 0;
+  }
+
+  if (num_move_reasons == 2)
+    return gg_min(gg_normalize_float2int(full_value, 1.0), 75);
+  if (num_move_reasons == 3)
+    return gg_min(gg_normalize_float2int(full_value * 0.85, 1.0), 90);
+  return gg_min(gg_normalize_float2int(full_value * 0.75, 1.0), 99);
+}
+
+
+#if USE_BDIST
+
+/* Compute the squared of the distance of a point on the board to the
+ * center of the board.
+ */
+static int
+bdist(int move)
+{
+  /* i = 0:              idist = - (board_size - 1)
+   * i = board_size -1 : idist =    board_size - 1
+   */
+  int idist = 2*I(move) - board_size + 1;
+  int jdist = 2*J(move) - board_size + 1;
+  return idist*idist + jdist*jdist;
+}
+
+
+/* NOTICE : In order to stabilize the regression test results,
+ * arbitrary parameters like pattern memory address and move position
+ * have been included in the sorting algorithm.
+ */
+
+#define BETTER_PATTERN(a, b)                           \
+  ((a)->value > (b)->value                             \
+   || ((a)->value == (b)->value                                \
+       && ((a)->pattern < (b)->pattern                 \
+          || ((a)->pattern == (b)->pattern             \
+              && ((a)->bdist < (b)->bdist              \
+                  || ((a)->bdist == (b)->bdist         \
+                      && (a)->move < (b)->move))))))
+
+#else  /* not USE_BDIST */
+
+#define BETTER_PATTERN(a, b)                           \
+  ((a)->value > (b)->value                             \
+   || ((a)->value == (b)->value                                \
+       && ((a)->pattern < (b)->pattern                 \
+          || ((a)->pattern == (b)->pattern             \
+              && (a)->move < (b)->move))))
+
+#endif /* not USE_BDIST */
+
+
+static void
+pattern_list_prepare(struct matched_patterns_list_data *list)
+{
+  int k;
+  int pos;
+
+  list->heap_num_patterns = 0;
+
+  /* This is more than needed in case of (combinable) pattern chains,
+   * but it is easier to allocate more than to count real number of
+   * heap elements first.
+   */
+  if (list->counter > 0) { /* avoid malloc(0) */
+    list->pattern_heap = malloc(list->counter * sizeof(*(list->pattern_heap)));
+    gg_assert(list->pattern_heap != NULL);
+  }
+  else {
+    /* free() has defined behaviour for NULL pointer */
+    list->pattern_heap = NULL;
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    list->first_pattern_index[pos] = -1;
+
+  for (k = 0; k < list->counter; k++) {
+    int move = list->pattern_list[k].move;
+
+#if USE_BDIST
+    list->pattern_list[k].bdist = bdist(move);
+#endif
+
+    /* Allocate heap elements for normal patterns.  Link combinable
+     * patterns in chains.
+     */
+    if (!(list->pattern_list[k].pattern->class & CLASS_c))
+      list->pattern_heap[list->heap_num_patterns++] = &list->pattern_list[k];
+    else {
+      list->pattern_list[k].next_pattern_index = list->first_pattern_index[move];
+      list->first_pattern_index[move] = k;
+    }
+  }
+
+  /* Allocate one heap element for each chain of combinable patterns
+   * and calculate initial chain values (as if all patterns passed
+   * constraint validation).
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (list->first_pattern_index[pos] != -1) {
+      struct matched_pattern_data *pattern_data
+       = &list->pattern_list[list->first_pattern_index[pos]];
+
+      pattern_data->value = valuate_combinable_pattern_chain(list, pos);
+      list->pattern_heap[list->heap_num_patterns++] = pattern_data;
+    }
+  }
+
+  if (list->heap_num_patterns > 0)
+    pattern_list_build_heap(list);
+}
+
+
+/* Fast heap building.  Takes O(n) only. */
+static void
+pattern_list_build_heap(struct matched_patterns_list_data *list)
+{
+  int k;
+  int limit = list->heap_num_patterns / 2;
+
+  for (k = limit; --k >= 0;) {
+    int parent;
+    int child;
+    struct matched_pattern_data *pattern_data = list->pattern_heap[k];
+
+    for (parent = k; parent < limit; parent = child) {
+      child = 2 * parent + 1;
+      if (child + 1 < list->heap_num_patterns
+         && BETTER_PATTERN(list->pattern_heap[child + 1],
+                           list->pattern_heap[child]))
+       child++;
+
+      if (BETTER_PATTERN(pattern_data, list->pattern_heap[child]))
+       break;
+
+      list->pattern_heap[parent] = list->pattern_heap[child];
+    }
+
+    list->pattern_heap[parent] = pattern_data;
+  }
+}
+
+
+/* Pops patterns list's heap once. */
+static void
+pattern_list_pop_heap_once(struct matched_patterns_list_data *list)
+{
+  int parent;
+  int child;
+
+  list->heap_num_patterns--;
+  for (parent = 0; 2 * parent + 1 < list->heap_num_patterns; parent = child) {
+    child = 2 * parent + 1;
+    if (BETTER_PATTERN(list->pattern_heap[child + 1],
+                      list->pattern_heap[child]))
+      child++;
+
+    if (BETTER_PATTERN(list->pattern_heap[list->heap_num_patterns],
+                      list->pattern_heap[child]))
+      break;
+
+    list->pattern_heap[parent] = list->pattern_heap[child];
+  }
+
+  list->pattern_heap[parent] = list->pattern_heap[list->heap_num_patterns];
+}
+
+
+/* Sink top element of heap because it got devalued.  This happens
+ * when a combinable pattern doesn't pass check_pattern_hard() -- it
+ * is no longer counted and its whole chain's value is reduced.
+ */
+static void
+pattern_list_sink_heap_top_element(struct matched_patterns_list_data *list)
+{
+  int parent;
+  int child;
+  struct matched_pattern_data *heap_top_element = list->pattern_heap[0];
+
+  for (parent = 0; 2 * parent + 1 < list->heap_num_patterns; parent = child) {
+    child = 2 * parent + 1;
+    if (child + 1 < list->heap_num_patterns
+       && BETTER_PATTERN(list->pattern_heap[child + 1],
+                         list->pattern_heap[child]))
+      child++;
+
+    if (BETTER_PATTERN(heap_top_element,
+                      list->pattern_heap[child]))
+      break;
+
+    list->pattern_heap[parent] = list->pattern_heap[child];
+  }
+
+  list->pattern_heap[parent] = heap_top_element;
+}
+
+
+/* Adds all goal strings in the pattern area to the cuts[] list, if there
+ * is more than one.
+ */
+static void
+generate_cut_list(struct pattern *pattern, int ll, int anchor,
+                 int cuts[MAX_CUTS], struct local_owl_data *owl)
+{
+  int k;
+  int num = 0;
+  signed char mark[BOARDMAX];
+
+  memset(mark, 0, BOARDMAX);
+  for (k = 0; k < pattern->patlen; k++) {
+    int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+    if (!IS_STONE(board[pos]))
+      continue;
+    pos = find_origin(pos);
+    if (!mark[pos] && board[pos] == owl->color && owl->goal[pos]) {
+      cuts[num++] = pos;
+      mark[pos] = 1;
+      if (num == MAX_CUTS)
+       return;
+    }
+  }
+  if (num == 1)
+    cuts[0] = NO_MOVE;
+  else if ((debug & DEBUG_SPLIT_OWL) && num > 1)
+    gprintf("Move provokes %d cuts, among them %1m and %1m.\n", num,
+           cuts[0], cuts[1]);
+}
+
+/* This function searches in the previously stored list of matched
+ * patterns for the highest valued unused patterns that have a valid
+ * constraint.  It returns the moves at the next empty positions in
+ * the array moves[].  Empty positions in the moves array are marked
+ * by having value <= 0.  There must be enough empty positions in the
+ * list.
+ *
+ * If the highest valued pattern found has a value less than cutoff,
+ * no move is returned.  Returns 1 if a move is found, 0 otherwise.
+ *
+ * This function also dispatches constraint validation of combinable
+ * pattern chains.  Whenever a pattern from a chain fails constraints,
+ * the chain is reevaluated and most likely drops in value enough to
+ * let other patterns (or chains) climb to the top of pattern heap.
+ *
+ * This function loops until enough moves are found or the end of the
+ * list is reached.
+ */
+
+static int
+get_next_move_from_list(struct matched_patterns_list_data *list, int color,
+                       struct owl_move_data *moves, int cutoff,
+                       struct local_owl_data *owl)
+{
+  int move_found = 0;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  /* Prepare pattern list if needed. */
+  if (!list->pattern_heap)
+    pattern_list_prepare(list);
+
+  while (list->heap_num_patterns > 0) {
+    int k;
+    struct matched_pattern_data *pattern_data;
+    struct pattern *pattern;
+    int move;
+    int value;
+    int ll;
+    int anchor;
+    int next_pattern_index;
+
+    /* Peek top element of heap associated with pattern list. */
+    if (list->pattern_heap[0]->value < cutoff)
+      break;
+
+    pattern_data = list->pattern_heap[0];
+    pattern = list->pattern_heap[0]->pattern;
+    move    = list->pattern_heap[0]->move;
+    value   = list->pattern_heap[0]->value;
+    ll      = list->pattern_heap[0]->ll;
+    anchor  = list->pattern_heap[0]->anchor;
+    next_pattern_index = list->pattern_heap[0]->next_pattern_index;
+
+    list->used++;
+
+    ASSERT_ON_BOARD1(move);
+    for (k = 0; k < MAX_MOVES; k++) {
+      if (moves[k].pos == move || moves[k].value <= 0)
+       break;
+    }
+
+    if (moves[k].pos == move) {
+      /* No point in testing this pattern/chain.  Throw it out. */
+      pattern_list_pop_heap_once(list);
+      continue;
+    }
+
+    /* There has to be an empty space. */
+    gg_assert(k < MAX_MOVES);
+
+    /* If a pattern chain was devalued because its last pattern didn't
+     * pass constraint validation, `pattern' is set NULL (i.e. nothing
+     * more to test).  Note that devalued chains might still be
+     * useful, i.e. if 2 of 3 patterns passed check_pattern_hard().
+     */
+    if (pattern == NULL
+       || check_pattern_hard(move, color, pattern, ll)) {
+      if (next_pattern_index == -1) {
+       /* Normal pattern or last one in a chain. */
+       pattern_list_pop_heap_once(list);
+      }
+      else {
+       /* We just validated a non-last pattern in a chain.  Since the
+        * chain remains at the same value, we keep the heap structure
+        * untouched.  However, we need to set heap's top to point to
+        * next pattern of the chain.
+        */
+       list->pattern_heap[0] = list->pattern_list + next_pattern_index;
+       list->pattern_heap[0]->value = value;
+       continue;
+      }
+
+      moves[k].pos = move;
+      moves[k].value = value;
+      clear_cut_list(moves[k].cuts);
+      move_found = 1;
+
+      if (pattern && !(pattern->class & CLASS_c)) {
+       moves[k].name = pattern->name;
+       TRACE("Pattern %s found at %1m with value %d\n",
+             pattern->name, move, moves[k].value);
+
+       if (pattern->class & CLASS_C) {
+         /* Cut possible. (Only used in attack patterns). Try to find
+          * goal strings in the pattern area and store them in the cut list
+          * if there is more than one.
+          */
+         DEBUG(DEBUG_SPLIT_OWL,
+               "Generating cut list for move at %1m.\n", move);
+         generate_cut_list(pattern, ll, anchor, moves[k].cuts, owl);
+       }
+
+       if (pattern->class & CLASS_B)
+         moves[k].same_dragon = SAME_DRAGON_NOT_CONNECTED;
+       else if (pattern->class & CLASS_a) {
+         moves[k].same_dragon = SAME_DRAGON_ALL_CONNECTED;
+         moves[k].pattern_data = pattern_data;
+       }
+       else if (!(pattern->class & CLASS_b))
+         moves[k].same_dragon = SAME_DRAGON_CONNECTED;
+       else {
+         int i;
+         enum same_dragon_value same_dragon = SAME_DRAGON_MAYBE_CONNECTED;
+
+         /* If we do not yet know whether the move belongs to the
+          * same dragon, we see whether another pattern can clarify.
+          */
+         for (i = 0; i < list->heap_num_patterns; i++) {
+           pattern_data = list->pattern_heap[i];
+
+           if (pattern_data->pattern
+               && pattern_data->move == move
+               && ((pattern_data->pattern->class & CLASS_B)
+                   || !(pattern_data->pattern->class & CLASS_b))) {
+             if (check_pattern_hard(move, color, pattern_data->pattern,
+                                    pattern_data->ll)) {
+               TRACE("Additionally pattern %s found at %1m\n",
+                     pattern_data->pattern->name, move);
+               if (pattern_data->pattern->class & CLASS_B)
+                 same_dragon = SAME_DRAGON_NOT_CONNECTED;
+               else if (pattern_data->pattern->class & CLASS_a) {
+                 same_dragon = SAME_DRAGON_ALL_CONNECTED;
+                 moves[k].pattern_data = pattern_data;
+               }
+               else
+                 same_dragon = SAME_DRAGON_CONNECTED;
+
+               break;
+             }
+           }
+         }
+
+         moves[k].same_dragon = same_dragon;
+       }
+      }
+      else {
+       moves[k].name = "Pattern combination";
+       if (verbose) {
+         /* FIXME: write names of all patterns in chain. */
+       }
+
+       /* FIXME: Add handling of CLASS_b.
+        *
+        * FIXME: It is silently assumed that all patterns in the
+        *        chain have the same class.  When the last pattern in
+        *        chain didn't match, this will not work at all.
+        */
+       if (pattern && pattern->class & CLASS_B)
+         moves[k].same_dragon = SAME_DRAGON_NOT_CONNECTED;
+       else if (pattern && pattern->class & CLASS_a) {
+         moves[k].same_dragon = SAME_DRAGON_ALL_CONNECTED;
+         moves[k].pattern_data = list->pattern_heap[0];
+       }
+       else
+         moves[k].same_dragon = SAME_DRAGON_CONNECTED;
+      }
+
+      if (pattern && pattern->class & CLASS_E)
+       moves[k].escape = 1;
+      else
+       moves[k].escape = 0;
+
+      break;
+    }
+    else {                     /* !check_pattern_hard(...) */
+      if (!(pattern->class & CLASS_c)) {
+       /* Just forget about it. */
+       pattern_list_pop_heap_once(list);
+      }
+      else {
+       /* Set this pattern to not matched and advance to next one in
+        * the chain, if any.
+        */
+       list->pattern_heap[0]->pattern = NULL;
+       if (next_pattern_index != -1)
+         list->pattern_heap[0] = list->pattern_list + next_pattern_index;
+
+       /* Reevaluate chain and adjust heap structure accordingly. */
+       list->pattern_heap[0]->value = valuate_combinable_pattern_chain(list,
+                                                                       move);
+       pattern_list_sink_heap_top_element(list);
+      }
+    }
+  }
+
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  return move_found;
+}
+
+
+/* This function takes an array of already found moves (passed as
+ * 'data') and looks for moves to replace these. Only moves near
+ * the goal dragon are considered.
+ */
+static void
+owl_shapes_callback(int anchor, int color, struct pattern *pattern,
+                   int ll, void *data)
+{
+  int tval;  /* trial move and its value */
+  int move;
+  struct owl_move_data *moves = data; /* considered moves passed as data */
+  enum same_dragon_value same_dragon = SAME_DRAGON_MAYBE_CONNECTED;
+  int escape = 0;
+  int defense_pos;
+
+  /* Pick up the location of the move */
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+
+  /* Before we do any expensive reading, check whether this move
+   * already is known with a higher value or if there are too many
+   * other moves with higher value.
+   */
+  if (!allpats) {
+    int k;
+    for (k = 0; k < MAX_MOVES; k++) {
+      if (moves[k].value == -1)
+       break;
+      if (moves[k].pos == move) {
+       if (moves[k].value >= pattern->value)
+         return;
+       else
+         break;
+      }
+    }
+    if (k == MAX_MOVES && moves[MAX_MOVES - 1].value >= pattern->value)
+      return;
+  }
+  
+  if (!check_pattern_hard(move, color, pattern, ll))
+    return;
+
+  /* and work out the value of this move */
+  if (pattern->helper) {
+    /* ask helper function to consider the move */
+    gg_assert(0);
+    DEBUG(DEBUG_HELPER, "  asking helper to consider '%s'+%d at %1m\n",
+         pattern->name, ll, move);
+    tval = pattern->helper(pattern, ll, move, color);
+    
+    if (tval > 0) {
+      DEBUG(DEBUG_HELPER, "helper likes pattern '%s' value %d at %1m\n",
+           pattern->name, tval, move);
+    }
+    else {
+      DEBUG(DEBUG_HELPER, "  helper does not like pattern '%s' at %1m\n",
+           pattern->name, move);
+      return;  /* pattern matcher does not like it */
+    }
+  }
+  else { /* no helper */
+    tval = (int) pattern->value;
+  }
+
+  /* having made it here, we have made it through all the extra checks */
+
+  TRACE("Pattern %s found at %1m with value %d\n", pattern->name, move, tval);
+
+  if (pattern->class & CLASS_B)
+    same_dragon = SAME_DRAGON_NOT_CONNECTED;
+  else if (pattern->class & CLASS_b)
+    same_dragon = SAME_DRAGON_MAYBE_CONNECTED;
+  else if (pattern->class & CLASS_a) {
+    same_dragon = SAME_DRAGON_ALL_CONNECTED;
+    /* FIXME: Currently this code is only used with vital attack
+     * moves, so there is no use for the "a" classification. If it
+     * would be needed in the future it's necessary to set up a struct
+     * matched_pattern_data here to be passed to owl_add_move(). This
+     * is not all that simple with respect to memory management
+     * however. Notice that a local variable in this function would go
+     * out of scope too early.
+     */
+    gg_assert(0);
+  }
+  else
+    same_dragon = SAME_DRAGON_CONNECTED;
+
+  if (pattern->class & CLASS_E)
+    escape = 1;
+  else 
+    escape = 0;
+
+  /* Finally, check for position of defense move. */
+  {
+    int k;
+    defense_pos = move;
+    for (k = 0; k < pattern->patlen; k++)
+      if (pattern->patn[k].att == ATT_not)
+       defense_pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+  }
+  
+  owl_add_move(moves, move, tval, pattern->name, same_dragon, NO_MOVE,
+              escape, defense_pos, MAX_MOVES, NULL);
+}
+
+
+/* Add a move to the list of candidate moves */
+
+static void
+owl_add_move(struct owl_move_data *moves, int move, int value,
+            const char *reason, enum same_dragon_value same_dragon, int lunch,
+            int escape, int defense_pos, int max_moves,
+            struct matched_pattern_data *pattern_data)
+{
+  int k;
+
+  if (!found_matches[move]) {
+    found_matches[move] = 1;
+    matches_found++;
+  }
+  
+  /* Add the new move to the list of already found moves, if the value
+   * is sufficently large. We keep the list sorted.
+   *
+   * First we must see if this move already is in the list.
+   */
+  for (k = 0; k < max_moves; k++) {
+    if (moves[k].value == -1)
+      break;
+    if (moves[k].pos == move) {
+      if (same_dragon > moves[k].same_dragon) {
+       moves[k].same_dragon = same_dragon;
+       moves[k].pattern_data = pattern_data;
+      }
+      if (!moves[k].escape)
+       escape = 0;
+      break;
+    }
+  }
+
+  /* Did we already have this move in the list with a higher value? */
+  if (k < max_moves && moves[k].value >= value)
+    return;
+
+  /* Insert the move at the right place in the list and adjust other
+   * entries as needed.
+   */
+  for (; k >= 0; k--) {
+    if (k == 0 || value <= moves[k-1].value) {
+      /* Can't get higher. Insert the move below this point and quit
+       * looping.
+       */
+      if (k < max_moves) {
+       moves[k].pos = move;
+       moves[k].value = value;
+       moves[k].name = reason;
+       /* If B or b class pattern, this move shouldn't be added to the
+         * dragon under consideration.
+        */
+       moves[k].same_dragon = same_dragon;
+       moves[k].pattern_data = pattern_data;
+       moves[k].lunch = lunch;
+       moves[k].escape = escape;
+       moves[k].defense_pos = defense_pos;
+      }
+      break;
+    }
+    /* Shuffle the passed move one step downwards. */
+    if (k < max_moves)
+      moves[k] = moves[k-1]; /* struct copy */
+  }
+
+  /* Assert that the list contains unique moves. */
+  if (0) {
+    int l;
+    for (k = 0; k < max_moves; k++)
+      for (l = k+1; l < max_moves; l++)
+       gg_assert(moves[k].pos == 0
+                 || moves[k].pos != moves[l].pos);
+  }
+}  
+
+
+/* Marks the dragons at apos and bpos. If only one dragon
+ * needs marking, bpos should be passed as NO_MOVE. 
+ */
+
+static void
+owl_mark_dragon(int apos, int bpos, struct local_owl_data *owl,
+               int new_dragons[BOARDMAX])
+{
+  int pos;
+  int color = board[apos];
+  
+  ASSERT1(bpos == NO_MOVE || board[bpos] == color, bpos);
+
+  if (new_dragons == NULL) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos)) {
+       if (is_same_dragon(pos, apos) || is_same_dragon(pos, bpos))
+         owl->goal[pos] = 1;
+       else
+         owl->goal[pos] = 0;
+      }
+  }
+  else {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos)) {
+       if (IS_STONE(board[pos])
+           && (new_dragons[pos] == new_dragons[apos]
+               || new_dragons[pos] == new_dragons[bpos]))
+         owl->goal[pos] = 1;
+       else
+         owl->goal[pos] = 0;
+      }
+  }
+
+  memcpy(owl->cumulative_goal, owl->goal, sizeof(owl->goal));
+  owl->color = color;
+  owl_mark_boundary(owl);
+}
+
+
+/* Marks the worms at apos and bpos. If only one worm
+ * needs marking, bpos should be passed as NO_MOVE. 
+ */
+
+static void
+owl_mark_worm(int apos, int bpos, struct local_owl_data *owl)
+{
+  int pos;
+  int color = board[apos];
+  
+  ASSERT1(bpos == NO_MOVE || board[bpos] == color, bpos);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      if (is_same_worm(pos, apos) || is_same_worm(pos, bpos))
+       owl->goal[pos] = 1;
+      else
+       owl->goal[pos] = 0;
+    }
+
+  owl->color = color;
+}
+
+
+/* Mark the boundary strings of the dragon. A boundary string is marked 2
+ * if it adjoins a friendly live dragon, 1 otherwise.
+ */
+
+static void
+owl_mark_boundary(struct local_owl_data *owl)
+{
+  int k;
+  int pos;
+  int color = owl->color;
+  int other = OTHER_COLOR(color);
+  
+  memset(owl->boundary, 0, sizeof(owl->boundary));
+  memset(owl->neighbors, 0, sizeof(owl->neighbors));
+
+  /* Find all friendly neighbors of the dragon in goal. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == color && owl->goal[pos]) {
+      for (k = 0; k < 4; k++) {
+       if (board[pos + delta[k]] == EMPTY
+           && board[pos + 2 * delta[k]] == color
+           && !owl->neighbors[pos + 2 * delta[k]])
+         mark_string(pos + 2 * delta[k], owl->neighbors, 1);
+      }
+
+      for (; k < 8; k++) {
+       int pos2 = pos + delta[k];
+
+       if (board[pos2] == color
+           && !owl->neighbors[pos2]
+           && (board[SOUTH(gg_min(pos, pos2))] == EMPTY
+               || board[NORTH(gg_max(pos, pos2))] == EMPTY))
+         mark_string(pos2, owl->neighbors, 1);
+      }
+    }
+  }
+
+  /* First find all boundary strings (including those adjacent not to
+   * the goal dragon, but one of its neighbors).
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == other && !owl->boundary[pos]) {
+      for (k = 0; k < 8; k++)
+       if (ON_BOARD(pos + delta[k])
+           && (owl->goal[pos + delta[k]] || owl->neighbors[pos + delta[k]])) {
+         mark_string(pos, owl->boundary, 1);
+         break;
+       }
+    }
+
+  /* Upgrade the mark of a boundary string if it adjoins a safe
+   * friendly dragon.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (owl->boundary[pos] == 1) {
+      for (k = 0; k < 8; k++) {
+       int pos2 = pos + delta[k];
+       if (board[pos2] == color
+           && !owl->goal[pos2]
+           && !owl->neighbors[pos2]
+           && ((dragon[pos2].crude_status != DEAD && countstones(pos2) > 2)
+               || dragon[pos2].crude_status == ALIVE)) {
+         mark_string(pos, owl->boundary, 2);
+         break;
+       }
+      }
+    }
+  
+  /* During the owl reading, stones farther away may become parts of
+   * the boundary. We mark those strings neighboring some other
+   * friendly dragon with boundary value 2 right away, since we have
+   * no mechanism for detecting this later.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == other && owl->boundary[pos] == 0) {
+      /* If a lunch has been amalgamated into a larger dragon, we
+       * have to back out now.
+       *
+       * Notice that we assume that no stone of the attacking color
+       * has been placed on the board with trymove() when this
+       * function is called. Thus we can (mostly) trust the worm data for
+       * stones of this color.
+       */
+      if (worm[pos].attack_codes[0] != 0
+         && worm[pos].size != dragon[pos].size)
+       continue;
+      
+      /* This can happen if called when stackp > 0 */
+      if (dragon[pos].id == -1)
+       continue;
+      
+      for (k = 0; k < DRAGON2(pos).neighbors; k++) {
+       int d = DRAGON2(pos).adjacent[k];
+       int apos = dragon2[d].origin;
+       
+       if (board[apos] == color && !owl->goal[apos]) {
+         owl->boundary[pos] = 2;
+         break;
+       }
+      }
+    }
+}
+
+/* Add the stone just played to the goal dragon if same_dragon is
+ * SAME_DRAGON_CONNECTED. We also add all stones belonging to the same
+ * generalized string to the goal. If same_dragon is
+ * SAME_DRAGON_MAYBE_CONNECTED, we only add the stones if at least one
+ * stone of the generalized string already was part of the goal. If
+ * same_dragon is SAME_DRAGON_NOT_CONNECTED, we don't add any stones
+ * at all.
+ *
+ * The SAME_DRAGON_ALL_CONNECTED case is like SAME_DRAGON_CONNECTED
+ * but additionally all other own stones in the pattern suggesting the
+ * move are also added to the goal.
+ */
+static void
+owl_update_goal(int pos, enum same_dragon_value same_dragon, int lunch,
+               struct local_owl_data *owl, int semeai_call,
+               struct matched_pattern_data *pattern_data)
+{
+  int stones[MAX_BOARD * MAX_BOARD];
+  int num_stones;
+  int k;
+  int do_add = 1;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  
+
+  /* Turn off sgf output during find_superstring(). */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  
+  if (same_dragon == SAME_DRAGON_NOT_CONNECTED)
+    num_stones = findstones(pos, MAX_BOARD * MAX_BOARD, stones);
+  else if (semeai_call)
+    find_superstring_conservative(pos, &num_stones, stones);
+  else
+    find_superstring(pos, &num_stones, stones);
+
+  /* Turn sgf output back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+  
+  /* If same_dragon field is 1, only add if the played stone
+   * clearly is in contact with the goal dragon.
+   */
+  if (same_dragon <= SAME_DRAGON_MAYBE_CONNECTED) {
+    do_add = 0;
+    for (k = 0; k < num_stones; k++)
+      if (owl->goal[stones[k]] != 0) {
+       do_add = 1;
+       break;
+      }
+  }
+  
+  if (do_add)
+    for (k = 0; k < num_stones; k++) {
+      if (owl->goal[stones[k]] == 0) {
+       if (0)
+         TRACE("Added %1m to goal.\n", stones[k]);
+       owl->goal[stones[k]] = 2;
+       owl->cumulative_goal[stones[k]] = 1;
+      }
+    }
+
+  /* If this move captures a lunch, we add all it's direct neighbours to the
+   * goal.
+   */
+  if (!semeai_call && lunch != NO_MOVE && board[lunch] != EMPTY) {
+    int adj, adjs[MAXCHAIN];
+    int k;
+    adj = chainlinks(lunch, adjs);
+    for (k = 0; k < adj; k++)
+      if (!owl->goal[adjs[k]]) {
+       mark_string(adjs[k], owl->goal, 2);
+       mark_string(adjs[k], owl->cumulative_goal, 2);
+      }
+  }
+
+  /* Now we handle the SAME_DRAGON_ALL_CONNECTED case. The move has
+   * already been added to the goal above, so it remains to find all
+   * other friendly stones in the pattern and add them too. We do that
+   * by a recursive call to this function in SAME_DRAGON_CONNECTED mode.
+   * This is maybe not the most elegant technique, however.
+   */
+  if (same_dragon == SAME_DRAGON_ALL_CONNECTED) {
+    gg_assert(pattern_data != NULL);
+    for (k = 0; k < pattern_data->pattern->patlen; k++) {
+      int pos2;
+      
+      /* all the following stuff (currently) applies only at occupied cells */
+      if (pattern_data->pattern->patn[k].att != ATT_O)
+       continue;
+      
+      /* transform pattern real coordinate */
+      pos2 = AFFINE_TRANSFORM(pattern_data->pattern->patn[k].offset,
+                             pattern_data->ll, pattern_data->anchor);
+
+      if (!owl->goal[pos2])
+       owl_update_goal(pos2, SAME_DRAGON_CONNECTED, NO_MOVE, owl, semeai_call,
+                       pattern_data);
+    }
+  }
+
+  if (1 && verbose)
+    goaldump(owl->goal);
+}
+
+
+/* Computes the connected components of a the graph that is given by
+ * having graph[i][j] = 1 if i and j are connected, and that has size
+ * graph_size.
+ *
+ * This function is generic, but without having the fixed MAX_CUTS
+ * array size it is ugly to write in ANSI C89 (no variably sized arrays),
+ * so we leave it here for now.
+ */
+static int
+connected_components(signed char graph[MAX_CUTS][MAX_CUTS], int graph_size,
+                    signed char component[MAX_CUTS])
+{
+  int num_components = 0;
+  int k, j;
+
+  if (graph_size <= 0)
+    return 0;
+
+  memset(component, -1, MAX_CUTS);
+  for (;;) {
+    int found_one;
+    /* Find unidentified string. */
+    for (k = 0; k < graph_size; k++)
+      if (component[k] == -1)
+       break;
+    if (k == graph_size)
+      break; /* All are identified. */
+    component[k] = num_components; /* Start new component. */
+    do { /* Spread new component. */
+      found_one = 0;
+      for (j = k+1; j < graph_size; j++)
+       if (graph[k][j] && component[j] == -1) {
+         component[j] = num_components;
+         found_one = 1;
+       }
+    } while (found_one);
+    num_components++;
+  }
+  gg_assert(num_components > 0);
+  return num_components;
+}
+
+/* This functions gets called after a move has been made that threatens
+ * to cut the owl goal dragon. It cuts the goal if necessary, and sets it
+ * to the biggest remaining component.
+ */
+static void
+owl_test_cuts(signed char goal[BOARDMAX], int color, int cuts[MAX_CUTS])
+{
+  int k, j;
+  signed char connected[MAX_CUTS][MAX_CUTS];
+  /* int connect_move[MAX_CUTS][MAX_CUTS]; */
+  int num_cuts;
+  int found_cut = 0;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+    
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  memset(connected, 1, MAX_CUTS*MAX_CUTS);
+  if (debug & DEBUG_SPLIT_OWL) {
+    gprintf("Called for this goal: ");
+    goaldump(goal);
+    gprintf("At this position:\n");
+    showboard(0);
+  }
+
+  /* Delete captured strings from list. */
+  for (k = 0; k < MAX_CUTS; k++) {
+    if (cuts[k] == NO_MOVE)
+      break;
+    if (board[cuts[k]] == EMPTY) {
+      for (j = k + 1; j < MAX_CUTS; j++) {
+       if (cuts[j] == NO_MOVE)
+         break;
+       cuts[j-1] = cuts[j];
+      }
+      cuts[k] = NO_MOVE;
+      k--;
+    }
+  }
+  num_cuts = k;
+
+  /* Test for each pair of strings in cuts[] whether it can now be
+   * disconnected.
+   */
+  for (k = 0; k < num_cuts; k++) {
+    ASSERT1(board[cuts[k]] == color, cuts[k]);
+    for (j = k + 1; j < num_cuts; j++)
+      if (fast_disconnect(cuts[k], cuts[j], NULL) == WIN) {
+       found_cut = 1;
+       connected[k][j] = 0;
+       connected[j][k] = 0;
+      }
+  }
+
+  if (found_cut) {
+    signed char component[MAX_CUTS];
+    signed char component2[BOARDMAX];
+    int component_size[MAX_CUTS];
+    int num_components;
+    int biggest_component = -1;
+    struct connection_data *conn_data;
+    int c_id;
+    int pos;
+
+    /* Start by computing the connected components among the strings
+     * listed in cuts[].
+     */
+    num_components = connected_components(connected, num_cuts, component);
+    if (num_components <= 1) {
+      sgf_dumptree = save_sgf_dumptree;
+      count_variations = save_count_variations;
+      return;
+    }
+
+    /* Now break up the goal by associating each goal stone to one of
+     * the connected components.
+     *
+     * First we compute the connection distances from each of the
+     * partial goals we have found.
+     */
+    memset(component2, -1, BOARDMAX);
+    memset(component_size, 0, sizeof(int) * num_components);
+    conn_data = malloc(sizeof(struct connection_data) * num_components);
+    for (c_id = 0; c_id < num_components; c_id++) {
+      signed char this_goal[BOARDMAX];
+      memset(this_goal, 0, BOARDMAX);
+
+      for (k = 0; k < num_cuts; k++)
+       if (component[k] == c_id) {
+         mark_string(cuts[k], this_goal, 1);
+         mark_string(cuts[k], component2, (signed char) c_id);
+       }
+      init_connection_data(color, this_goal, NO_MOVE, FP(3.01),
+                          conn_data + c_id, 1);
+      spread_connection_distances(color, conn_data + c_id);
+    }
+
+    /* Now put each goal string to the component to which it has the
+     * smallest distance.
+     */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      int closest_dist = HUGE_CONNECTION_DISTANCE;
+      int closest_component = -1;
+      if (board[pos] != color || !goal[pos])
+       continue;
+      if (pos != find_origin(pos))
+       continue;
+      for (c_id = 0; c_id < num_components; c_id++) {
+       if (conn_data[c_id].distances[pos] < closest_dist) {
+         closest_dist = conn_data[c_id].distances[pos];
+         closest_component = c_id;
+       }
+      }
+      /* FIXME: What to do if no close component found? */
+      if (closest_component != -1) {
+       mark_string(pos, component2, (signed char) closest_component);
+       component_size[closest_component] += countstones(pos);
+      }
+    }
+
+    /* Now find the biggest_component. */
+    {
+      int biggest_size = 0;
+      for (c_id = 0; c_id < num_components; c_id++)
+       if (component_size[c_id] > biggest_size) {
+         biggest_size = component_size[c_id];
+         biggest_component = c_id;
+       }
+      gg_assert(biggest_component != -1);
+    }
+
+    /* Now delete everything except the biggest component from the goal. */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (component2[pos] != biggest_component)
+       goal[pos] = 0;
+    if (debug & DEBUG_SPLIT_OWL) {
+      gprintf("Split dragon. Biggest component is %d (of %d).\n",
+             biggest_component, num_components);
+      showboard(0);
+      componentdump(component2);
+    }
+    free(conn_data);
+  }
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+}
+
+/* We update the boundary marks. The boundary mark must be
+ * constant on each string. It is nonzero if the string
+ * adjoins the goal dragon, or if the string includes a
+ * stone played in the course of analysis. If the string
+ * adjoins a live friendly dragon, the boundary mark is 2.
+ */
+static void
+owl_update_boundary_marks(int pos, struct local_owl_data *owl)
+{
+  signed char boundary_mark = 0;
+  int k;
+
+  for (k = 0; k < 4; k++) {
+    int pos2 = pos + delta[k];
+
+    if (ON_BOARD(pos2) && owl->boundary[pos2] > boundary_mark)
+      boundary_mark = owl->boundary[pos2];
+
+    if (board[pos2] == owl->color
+       && dragon[pos2].color == owl->color
+       && dragon[pos2].status == ALIVE
+       && !owl->goal[pos2]
+       && !owl->neighbors[pos2])
+      boundary_mark = 2;
+  }
+
+  mark_string(pos, owl->boundary, boundary_mark);
+}
+
+/* Lists the goal array. For use in GDB:
+ * (gdb) set goaldump(goal).
+ */
+
+void
+goaldump(const signed char goal[BOARDMAX])
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && goal[pos])
+      gprintf("%o%1m (%d)  ", pos, (int) goal[pos]);
+  gprintf("\n");
+}
+
+void
+componentdump(const signed char component[BOARDMAX])
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && component[pos] != -1)
+      gprintf("%o%1m (%d)  ", pos, (int) component[pos]);
+  gprintf("\n");
+}
+
+/*
+ * Owl attack moves are ineffective when the dragon can still live in a
+ * semeai. This function tests whether an owl attack move has this problem.
+ * If not, an owl attack move reason is added, otherwise we treat the
+ * move as a strategic attack.
+ */
+static void
+test_owl_attack_move(int pos, int dr, int kworm, int acode)
+{
+  int color = OTHER_COLOR(board[dr]);
+  if (DRAGON2(dr).semeais == 0
+      || DRAGON2(dr).semeai_defense_point == NO_MOVE
+      || (DRAGON2(dr).semeais == 1 && semeai_move_reason_known(pos, dr))
+      || acode == GAIN) {
+    add_owl_attack_move(pos, dr, kworm, acode);
+    DEBUG(DEBUG_OWL, "owl: %1m attacks %1m (%s) at move %d\n",
+         pos, dr, result_to_string(DRAGON2(dr).owl_attack_code),
+         movenum+1);
+  }
+  else {
+    int dr2 = DRAGON2(dr).semeai_defense_target;
+    int semeai_result, certain;
+    int save_verbose = verbose;
+    if (verbose > 0)
+      verbose--;
+    owl_analyze_semeai_after_move(pos, color, dr, dr2, &semeai_result,
+                                 NULL, NULL, 1, &certain, 0);
+    verbose = save_verbose;
+    if (certain >= DRAGON2(dr).semeai_defense_certain
+       && (semeai_result >= REVERSE_RESULT(acode))) {
+      /* Demote the move reasons. */
+      DEBUG(DEBUG_OWL, "owl: %1m ineffective owl attack on %1m (can live in semeai with %1m)\n", pos, dr, dr2);
+      add_strategical_attack_move(pos, dr);
+    }
+    else {
+      add_owl_attack_move(pos, dr, kworm, acode);
+      DEBUG(DEBUG_OWL, "owl: %1m attacks %1m (%s) at move %d\n",
+           pos, dr, result_to_string(DRAGON2(dr).owl_attack_code),
+           movenum+1);
+    }
+  }
+}
+
+/* Add owl move reasons. This function should be called once during
+ * genmove. It has to be called after semeai_move_reasons().
+ */
+
+void
+owl_reasons(int color)
+{
+  int pos;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!IS_STONE(board[pos])
+        || dragon[pos].origin != pos)
+      continue;
+    
+    if (dragon[pos].status == CRITICAL
+       && DRAGON2(pos).owl_attack_point != NO_MOVE) {
+      if (board[pos] == color) {
+       if (DRAGON2(pos).owl_defense_point != NO_MOVE) {
+         if (DRAGON2(pos).owl_defense_code == LOSS) {
+           add_loss_move(DRAGON2(pos).owl_defense_point, pos,
+                         DRAGON2(pos).owl_defense_kworm);
+           DEBUG(DEBUG_OWL, "owl: %1m defends %1m with loss at move %d\n",
+                 DRAGON2(pos).owl_defense_point, pos, movenum+1);
+         }
+         else {
+           add_owl_defense_move(DRAGON2(pos).owl_defense_point, pos,
+                                DRAGON2(pos).owl_defense_code);
+           DEBUG(DEBUG_OWL, "owl: %1m defends %1m at move %d\n",
+                 DRAGON2(pos).owl_defense_point, pos, movenum+1);
+         }
+       }
+      }
+      else { /* opponent's dragon */
+       /* We don't want to add this move reason if the attacker
+        * dies because the victim only formed a nakade shape.
+        *
+        * FIXME: This code overlaps heavily with some code in
+        *        examine_move_safety() in move_reasons.c. The caching
+        *        scheme should minimize the performance hit, but of course
+        *        it's unfortunate to have the code duplication.
+        */
+       int move = DRAGON2(pos).owl_attack_point;
+       
+       /* No worries if we catch something big. */
+       if (dragon[pos].effective_size < 8) {
+         /* Look through the neighbors of the victim for dragons of
+          * our color. If we find at least one being thought alive
+          * everything is ok. Otherwise we keep track of the
+          * largest one for further examination.
+          */
+         int largest = 0;
+         int k;
+         int bpos = NO_MOVE;
+         int kworm = NO_MOVE;
+         int safe = 0;
+         for (k = 0; k < DRAGON2(pos).neighbors; k++) {
+           int d = DRAGON2(pos).adjacent[k];
+           if (DRAGON(d).color == color) {
+             if (DRAGON(d).status == ALIVE) {
+               safe = 1;
+               break;
+             }
+             if (DRAGON(d).size > largest) {
+               bpos = dragon2[d].origin;
+               largest = DRAGON(d).size;
+             }
+           }
+         }
+         
+         /* It may occasionally happen that no neighbor of our
+          * color was found. Assume safe in that case.
+          */
+         if (bpos == NO_MOVE)
+           safe = 1;
+         
+         /* If not yet thought safe, ask the owl code whether the
+          * owl attack defends the (largest) attacker.
+          */
+         if (!safe && owl_does_defend(move, bpos, &kworm) != WIN) {
+           DEBUG(DEBUG_OWL,
+                 "owl: %1m attacks %1m at move %d, but the attacker dies.\n",
+                 move, pos, movenum+1);
+           DRAGON2(pos).safety = INESSENTIAL;
+           continue;
+         }
+       }
+
+       /* If we've reached this far, it only remains to check the move
+        * against semeai complications. */
+       test_owl_attack_move(move, pos, DRAGON2(pos).owl_attack_kworm,
+                           DRAGON2(pos).owl_attack_code);
+      }
+    }
+    else if (DRAGON2(pos).owl_status == DEAD
+            && DRAGON2(pos).owl_threat_status == CAN_THREATEN_DEFENSE) {
+      if (board[pos] == color 
+         && DRAGON2(pos).owl_defense_point != NO_MOVE) {
+       add_owl_defense_threat_move(DRAGON2(pos).owl_defense_point, pos, WIN);
+       DEBUG(DEBUG_OWL, "owl: %1m threatens to defend %1m at move %d\n", 
+             DRAGON2(pos).owl_defense_point, pos, movenum+1);
+      }
+      if (board[pos] == color
+           && DRAGON2(pos).owl_second_defense_point != NO_MOVE
+         && is_legal(DRAGON2(pos).owl_second_defense_point, color)) {
+       add_owl_defense_threat_move(DRAGON2(pos).owl_second_defense_point,
+                                   pos, WIN);
+       DEBUG(DEBUG_OWL, "owl: %1m threatens to defend %1m at move %d\n", 
+             DRAGON2(pos).owl_second_defense_point, pos, movenum+1);
+      }
+
+      /* If the opponent can threaten to live, an attacking
+       * move gets a small value to make sure it's really dead.
+       */
+      if (board[pos] == OTHER_COLOR(color)
+         && DRAGON2(pos).owl_threat_status == CAN_THREATEN_DEFENSE
+         && DRAGON2(pos).owl_attack_point != NO_MOVE) {
+       add_owl_prevent_threat_move(DRAGON2(pos).owl_attack_point, pos);
+       DEBUG(DEBUG_OWL, "owl: %1m prevents a threat against %1m at move %d\n",
+             DRAGON2(pos).owl_attack_point, pos, movenum+1);
+      }
+    }
+    else if (DRAGON2(pos).owl_status == ALIVE) {
+      if (board[pos] == OTHER_COLOR(color)
+         && DRAGON2(pos).owl_threat_status == CAN_THREATEN_ATTACK) {
+       if (DRAGON2(pos).owl_attack_point != NO_MOVE) {
+         add_owl_attack_threat_move(DRAGON2(pos).owl_attack_point, pos, WIN);
+         DEBUG(DEBUG_OWL, "owl: %1m threatens %1m at move %d\n",
+               DRAGON2(pos).owl_attack_point, pos, movenum+1);
+       }
+       if (DRAGON2(pos).owl_second_attack_point != NO_MOVE
+           && is_legal(DRAGON2(pos).owl_second_attack_point, color)) {
+         add_owl_attack_threat_move(DRAGON2(pos).owl_second_attack_point, pos,
+                                    WIN);
+         DEBUG(DEBUG_OWL, "owl: %1m threatens %1m at move %d\n",
+               DRAGON2(pos).owl_second_attack_point, pos, movenum+1);
+       }
+      }
+      else if (board[pos] == OTHER_COLOR(color)
+              && DRAGON2(pos).owl_attack_point != NO_MOVE
+              && DRAGON2(pos).owl_attack_code == GAIN) {
+       add_owl_attack_move(DRAGON2(pos).owl_attack_point, pos,
+                           DRAGON2(pos).owl_attack_kworm, GAIN);
+       DEBUG(DEBUG_OWL, "owl: %1m attacks %1m with gain at move %d\n", 
+             DRAGON2(pos).owl_attack_point, pos, movenum+1);
+      }
+      else if (board[pos] == color
+              && DRAGON2(pos).owl_defense_point != NO_MOVE
+              && DRAGON2(pos).owl_defense_code == LOSS) {
+       add_loss_move(DRAGON2(pos).owl_defense_point, pos,
+                     DRAGON2(pos).owl_defense_kworm);
+       DEBUG(DEBUG_OWL, "owl: %1m defends %1m with loss at move %d\n",
+             DRAGON2(pos).owl_defense_point, pos, movenum+1);
+      }
+      else if (board[pos] == color
+              && DRAGON2(pos).owl_attack_point != NO_MOVE
+              && DRAGON2(pos).owl_attack_code == GAIN
+              && DRAGON2(pos).owl_defense_code == WIN
+              && DRAGON2(pos).owl_defense_point != NO_MOVE) {
+       add_owl_defense_move(DRAGON2(pos).owl_defense_point, pos,
+                            DRAGON2(pos).owl_defense_code);
+       DEBUG(DEBUG_OWL, "owl: %1m defends %1m against possible loss at move %d\n",
+             DRAGON2(pos).owl_defense_point, pos, movenum+1);
+
+      }
+      /* The owl code found the friendly dragon alive, but was uncertain,
+       * and an extra point of defense was found, so this might
+       * be a good place to play.
+       */
+      else if (board[pos] == color
+              && !DRAGON2(pos).owl_attack_certain
+              && DRAGON2(pos).owl_defense_certain
+              && ON_BOARD(DRAGON2(pos).owl_defense_point)) {
+       add_owl_uncertain_defense_move(DRAGON2(pos).owl_defense_point, pos);
+       DEBUG(DEBUG_OWL, 
+             "owl: %1m defends the uncertain dragon at %1m at move %d\n",
+             DRAGON2(pos).owl_defense_point, pos, movenum+1);
+      }
+    }
+
+    /* The owl code found the dragon dead, but was uncertain,
+     * and an extra point of attack was found, so this might
+     * be a good place to play.
+     */
+    else if (DRAGON2(pos).owl_status == DEAD
+            && board[pos] == OTHER_COLOR(color)
+            && !DRAGON2(pos).owl_attack_certain
+            && ON_BOARD(DRAGON2(pos).owl_attack_point)) {
+      add_owl_uncertain_defense_move(DRAGON2(pos).owl_attack_point, pos);
+      DEBUG(DEBUG_OWL,
+           "owl: %1m might defend the uncertain dragon at %1m at move %d\n",
+           DRAGON2(pos).owl_attack_point, pos, movenum+1);
+    }
+  }
+}
+
+/* Use the owl code to determine whether the move at (move) makes
+ * the dragon at (target) owl safe. This is used to test whether
+ * tactical defenses are strategically viable and whether a vital eye
+ * point does kill an owl critical dragon. 
+ *
+ * Should be called only when stackp==0.
+ */
+
+int
+owl_does_defend(int move, int target, int *kworm)
+{
+  int color = board[target];
+  int result = 0;
+  struct local_owl_data *owl;
+  int reading_nodes_when_called = get_reading_node_counter();
+  int tactical_nodes;
+  int origin;
+  int acode;
+  int wpos = NO_MOVE;
+  int wid = MAX_GOAL_WORMS;
+  double start = 0.0;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  if (worm[target].unconditional_status == DEAD)
+    return 0;
+
+  origin = dragon[target].origin;
+  TRACE("owl_does_defend %1m %1m(%1m)\n", move, target, origin);
+
+  if (search_persistent_owl_cache(OWL_DOES_DEFEND, move, target, 0,
+                                 &result, kworm, NULL, NULL))
+    return result;
+
+  if (trymove(move, color, "owl_does_defend", target)) {
+    /* Check if a compatible owl_attack() is cached. */
+    if (search_persistent_owl_cache(OWL_ATTACK, origin, 0, 0,
+                                   &result, NULL, kworm, NULL)) {
+      popgo();
+      return REVERSE_RESULT(result);
+    }
+    
+    /*
+     * FIXME: (move) will be added to the goal dragon although we
+     * do not know whether it is really connected.
+     */
+    init_owl(&owl, target, NO_MOVE, move, 1, NULL);
+    prepare_goal_list(target, owl, owl_goal_worm, &goal_worms_computed,
+                     kworm, 0);
+    acode = do_owl_attack(target, NULL, &wid, owl, 0);
+    finish_goal_list(&goal_worms_computed, &wpos, owl_goal_worm, wid);
+    result = REVERSE_RESULT(acode);
+    popgo();
+  }
+  else
+    return 0;  /* Don't cache anything in this case. */
+
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+       "owl_does_defend %1m %1m(%1m), result %d (%d, %d nodes, %f seconds)\n",
+       move, target, origin, result, local_owl_node_counter,
+       tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_DOES_DEFEND, move, target, 0,
+                            result, wpos, 0, 0,
+                            tactical_nodes, owl->goal, board[target]);
+
+  if (kworm)
+    *kworm = wpos;
+  return result;
+}
+
+
+/* Use the owl code to determine whether the dragon at (target) is owl
+ * safe after an own move at (move). This is used to detect
+ * blunders. In case the dragon is not safe, it also tries to find a
+ * defense point making (target) safe in a later move.
+ *
+ * Should be called only when stackp==0.
+ */
+
+int
+owl_confirm_safety(int move, int target, int *defense_point, int *kworm)
+{
+  int color = board[target];
+  int result = 0;
+  struct local_owl_data *owl;
+  int reading_nodes_when_called = get_reading_node_counter();
+  int tactical_nodes;
+  int origin;
+  int defense = 0;
+  double start = 0.0;
+  int acode;
+  int wpos = NO_MOVE;
+  int wid = MAX_GOAL_WORMS;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  if (worm[target].unconditional_status == DEAD)
+    return 0;
+
+  origin = dragon[target].origin;
+  TRACE("owl_confirm_safety %1m %1m(%1m)\n", move, target, origin);
+
+  if (search_persistent_owl_cache(OWL_CONFIRM_SAFETY, move, target, 0,
+                                 &result, defense_point, kworm, NULL))
+    return result;
+
+  if (trymove(move, color, "owl_confirm_safety", target)) {
+    /* Check if a compatible owl_attack() is cached. */
+    if (search_persistent_owl_cache(OWL_ATTACK, origin, 0, 0,
+                                   &result, defense_point, kworm, NULL)) {
+      popgo();
+      if (result == 0)
+       return WIN;
+      else if (result == GAIN)
+       return LOSS;
+      else
+       return 0;
+    }
+    
+    init_owl(&owl, target, NO_MOVE, move, 1, NULL);
+    prepare_goal_list(target, owl, owl_goal_worm, &goal_worms_computed,
+                     kworm, 0);
+    acode = do_owl_attack(target, &defense, &wid, owl, 0);
+    finish_goal_list(&goal_worms_computed, &wpos, owl_goal_worm, wid);
+    if (acode == 0)
+      result = WIN;
+    else if (acode == GAIN)
+      result = LOSS;
+    popgo();
+  }
+  else
+    return 0;  /* Don't cache anything in this case. */
+
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+       "owl_confirm_safety %1m %1m(%1m), result %d %1m (%d, %d nodes, %f seconds)\n",
+       move, target, origin, result, defense,
+       local_owl_node_counter, tactical_nodes,
+       gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_CONFIRM_SAFETY, move, target, 0,
+                            result, defense, wpos, 0,
+                            tactical_nodes, owl->goal, board[target]);
+
+  if (defense_point)
+    *defense_point = defense;
+  if (kworm)
+    *kworm = wpos;
+
+  return result;
+}
+
+
+/* Use the owl code to determine whether the attack move at (move) of
+ * the dragon (target) is effective, i.e. whether it kills the stones.
+ *
+ * Should be called only when stackp==0.
+ */
+
+int
+owl_does_attack(int move, int target, int *kworm)
+{
+  int color = board[target];
+  int other = OTHER_COLOR(color);
+  int result = 0;
+  struct local_owl_data *owl;
+  int reading_nodes_when_called = get_reading_node_counter();
+  int tactical_nodes;
+  int origin;
+  int dcode;
+  int wpos = NO_MOVE;
+  int wid = MAX_GOAL_WORMS;
+  double start = 0.0;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  if (worm[target].unconditional_status == ALIVE)
+    return 0;
+
+  origin = dragon[target].origin;
+  TRACE("owl_does_attack %1m %1m(%1m)\n", move, target, origin);
+
+  if (search_persistent_owl_cache(OWL_DOES_ATTACK, move, target, 0,
+                                 &result, kworm, NULL, NULL))
+    return result;
+
+  /* FIXME: We want to do this after the trymove(), but currently
+   * owl_mark_dragon() may crash if the trymove() happens to remove
+   * some stones of the goal dragon from the board.
+   */
+#if 1
+  init_owl(&owl, target, NO_MOVE, NO_MOVE, 1, NULL);
+#endif
+
+  if (trymove(move, other, "owl_does_attack", target)) {
+    /* Check if a compatible owl_defend() is cached. */
+    if (search_persistent_owl_cache(OWL_DEFEND, origin, 0, 0,
+                                   &result, NULL, kworm, NULL)) {
+      popgo();
+      return REVERSE_RESULT(result);
+    }
+
+#if 0
+    local_owl_node_counter = 0;
+    owl->lunches_are_current = 0;
+    owl_mark_dragon(target, NO_MOVE, owl);
+#endif
+    owl_update_boundary_marks(move, owl);
+#if 0
+    compute_owl_escape_values(owl);
+#endif
+    /* FIXME: Should also check if part of the dragon was captured,
+     *        like do_owl_attack() does.
+     */
+    if (board[target] == EMPTY)
+      dcode = 0;
+    else {
+      prepare_goal_list(target, owl, owl_goal_worm, &goal_worms_computed,
+                        kworm, 0);
+      dcode = do_owl_defend(target, NULL, &wid, owl, 0);
+      finish_goal_list(&goal_worms_computed, &wpos, owl_goal_worm, wid);
+    }
+    result = REVERSE_RESULT(dcode);
+    owl->lunches_are_current = 0;
+    popgo();
+  }
+  else
+    return 0;  /* Don't cache anything in this case. */
+
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+       "owl_does_attack %1m %1m(%1m), result %d (%d, %d nodes, %f seconds)\n",
+       move, target, origin, result, local_owl_node_counter,
+       tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_DOES_ATTACK, move, target, 0,
+                            result, wpos, 0, 0,
+                            tactical_nodes, owl->goal, board[target]);
+
+  if (kworm)
+    *kworm = wpos;
+  return result;
+}
+
+
+/* Use the owl code to determine whether connecting the two dragons
+ * (target1) and (target2) by playing at (move) results in a living
+ * dragon. Should be called only when stackp==0.
+ */
+
+int
+owl_connection_defends(int move, int target1, int target2)
+{
+  int color = board[target1];
+  int result = 0;
+  int reading_nodes_when_called = get_reading_node_counter();
+  int tactical_nodes;
+  double start = 0.0;
+  struct local_owl_data *owl;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  ASSERT1(board[target2] == color, target2);
+  TRACE("owl_connection_defends %1m %1m %1m\n", move, target1, target2);
+
+  if (worm[target1].unconditional_status == DEAD)
+    return 0;
+  if (worm[target2].unconditional_status == DEAD)
+    return 0;
+
+  if (search_persistent_owl_cache(OWL_CONNECTION_DEFENDS, move, target1,
+                                 target2, &result, NULL, NULL, NULL))
+    return result;
+
+  init_owl(&owl, target1, target2, NO_MOVE, 1, NULL);
+
+  if (trymove(move, color, "owl_connection_defends", target1)) {
+    owl_update_goal(move, SAME_DRAGON_MAYBE_CONNECTED, NO_MOVE, owl, 0, NULL);
+    if (!do_owl_attack(move, NULL, NULL, owl, 0))
+      result = WIN;
+    owl->lunches_are_current = 0;
+    popgo();
+  }
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+  
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+       "owl_conn_defends %1m %1m %1m, result %d (%d, %d nodes, %f seconds)\n",
+       move, target1, target2, result, local_owl_node_counter,
+       tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_CONNECTION_DEFENDS, move, target1, target2,
+                            result, 0, 0, 0, tactical_nodes,
+                            owl->goal, color);
+
+  return result;
+}
+
+
+/* This function attempts to make a list of dead strings
+ * which may be relevant to the life of the goal dragon.
+ * Such strings are called owl lunches. They are ignored
+ * (treated as invisible) during the running of make_domains.
+ *
+ * In certain cases we also need to identify tactically safe strings
+ * which should be included in the eyespace, e.g. in this position:
+ *
+ * -------
+ * OXXOOXO
+ * OX.O.XO
+ * OXX.XXO
+ * OOXXXOO
+ * .OOOOO.
+ *
+ * The three O stones cannot be captured, but they can't live
+ * independently without capturing the surrounding stones. We call
+ * such stones INESSENTIAL and identify them by the condition that for
+ * each liberty of the corresponding superstring, the following must
+ * hold:
+ *
+ * 1. At least one neighbor of the liberty is the goal dragon.
+ * 2. No neighbor of the liberty is the same color as the tested string,
+ *    unless part of the same superstring.
+ * 3. No neighbor of the liberty of the same color as the goal dragon
+ *    does not belong to the goal dragon.
+ * 4. No neighbor of the liberty belonging to the goal dragon can be
+ *    tactically captured.
+ *
+ * There is a weakness with this characterization though, which can be
+ * seen in this position:
+ *
+ * --------
+ * OX..OOX.
+ * OX.X.XOO
+ * OX.XX.O.
+ * O.XXOOO.
+ * .OOOO...
+ *
+ * The two O stones intruding in X's eyespace cannot be tactically
+ * captured and their liberties satisfy the requirements above. Still
+ * it doesn't make any sense to count those stones as
+ * inessential. Therefore we add another requirement on the stones
+ * themself:
+ *
+ * 5. No neighbor of the stones does not belong to the goal or can be
+ *    tactically captured.
+ *
+ * A second weakness can be noticed in this position:
+ *
+ * |OOOO.
+ * |XXXO.
+ * |O.XOO
+ * |OXXXO
+ * |.O.XO
+ * +-----
+ *
+ * The white stones in the corner should qualify as inessential but
+ * the corner liberty doesn't satisfy requirement 1. Therefore we add
+ * an alternative requirement:
+ *
+ * 1b. The liberty is a topologically false eye with respect to the
+ *     goal dragon.
+ *
+ * This is not quite good enough though, as shown in this position:
+ *
+ * ----------
+ * OX.X.OO...
+ * OXX.OOX.O.
+ * O.XXXXX.O.
+ * OOOOOOOOO.
+ *
+ * The four O stones are regarded as inessential after inclusion of
+ * rule 1b, which is clearly inappropriate. To solve this problem we
+ * modify the rule:
+ *
+ * 1b'. The liberty is a topologically false eye with respect to the
+ *      goal dragon and is adjacent to no empty vertex.
+ */
+
+static void
+owl_find_lunches(struct local_owl_data *owl)
+{
+  int k;
+  int pos;
+  int lunches = 0;
+  int prevlunch;
+  int lunch;
+  int acode;
+  int apos;
+  int dcode;
+  int dpos;
+  int color = owl->color;
+  int other = OTHER_COLOR(color);
+  signed char already_checked[BOARDMAX];
+
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+    
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  for (prevlunch = 0; prevlunch < MAX_LUNCHES; prevlunch++)
+    owl->lunch[prevlunch] = NO_MOVE;
+  memset(owl->inessential, 0, sizeof(owl->inessential));
+  
+  memset(already_checked, 0, sizeof(already_checked));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == color && owl->goal[pos]) {
+      /* Loop over the eight neighbors. */
+      for (k = 0; k < 8; k++) {
+       int pos2 = pos + delta[k];
+
+       /* If the immediate neighbor is empty, we look two steps away. */
+       if (k < 4 && board[pos2] == EMPTY)
+         pos2 += delta[k];
+
+       if (board[pos2] != other)
+         continue;
+
+       lunch = find_origin(pos2);
+       if (already_checked[lunch])
+         continue;
+       already_checked[lunch] = 1;
+
+       attack_and_defend(lunch, &acode, &apos, &dcode, &dpos);
+       if (acode != 0) {
+         owl->lunch[lunches] = lunch;
+         owl->lunch_attack_code[lunches]  = acode;
+         owl->lunch_attack_point[lunches] = apos;
+         owl->lunch_defend_code[lunches]  = dcode;
+         ASSERT1(board[apos] == EMPTY, lunch);
+         if (dcode != 0) {
+           owl->lunch_defense_point[lunches] = dpos;
+           ASSERT1(board[dpos] == EMPTY, lunch);
+         }
+         else
+           owl->lunch_defense_point[lunches] = NO_MOVE;
+         lunches++;
+         if (lunches == MAX_LUNCHES) {
+           sgf_dumptree = save_sgf_dumptree;
+           count_variations = save_count_variations;
+           owl->lunches_are_current = 1;
+           return;
+         }
+       }
+       else if (!owl->inessential[lunch]) {
+         /* Test for inessentiality. */
+         int adj;
+         int adjs[MAXCHAIN];
+         int num_stones;
+         int stones[MAX_BOARD * MAX_BOARD];
+         int liberties;
+         int libs[MAXLIBS];
+         int r;
+         int essential = 0;
+         int superstring[BOARDMAX];
+
+         /* First check the neighbors of the string. */
+         adj = chainlinks(lunch, adjs);
+         for (r = 0; r < adj; r++) {
+           if (!owl->goal[adjs[r]] || attack(adjs[r], NULL) != 0) {
+             essential = 1;
+             break;
+           }
+         }
+
+         if (essential)
+           continue;
+
+         find_superstring_stones_and_liberties(lunch, &num_stones, stones,
+                                               &liberties, libs, 0);
+
+         memset(superstring, 0, sizeof(superstring));
+         for (r = 0; r < num_stones; r++)
+           superstring[stones[r]] = 1;
+
+         for (r = 0; r < liberties; r++) {
+           int bpos = libs[r];
+           int goal_found = 0;
+           int s;
+
+           for (s = 0; s < 4; s++) {
+             int cpos = bpos + delta[s];
+
+             if (!ON_BOARD(cpos))
+               continue;
+             if (board[cpos] == color) {
+               if (attack(cpos, NULL) != 0) {
+                 essential = 1;
+                 break;
+               }
+               else if (owl->goal[cpos])
+                 goal_found = 1;
+               else {
+                 essential = 1;
+                 break;
+               }
+             }
+             else if (board[cpos] == other
+                      && !superstring[cpos]) {
+               essential = 1;
+               break;
+             }
+           }
+           if (!goal_found) {
+             /* Requirement 1 not satisfied. Test requirement 1b.
+              * N.B. This is a simplified topological eye test.
+              * The simplification may be good, bad, or neutral.
+              */
+             int off_board = 0;
+             int diagonal_goal = 0;
+             for (s = 4; s < 8; s++) {
+               if (!ON_BOARD(bpos + delta[s]))
+                 off_board++;
+               else if (owl->goal[bpos + delta[s]])
+                 diagonal_goal++;
+             }
+             if (diagonal_goal + (off_board >= 2) < 2)
+               essential = 1;
+             else {
+               /* Check that the liberty is adjacent to no empty
+                * vertex, as required by 1b'.
+                */
+               for (s = 0; s < 4; s++) {
+                 if (board[bpos + delta[s]] == EMPTY) {
+                   essential = 1;
+                   break;
+                 }
+               }
+             }
+           }
+
+           if (essential)
+             break;
+         }
+
+         if (!essential) {
+           TRACE("Inessential string found at %1m.\n", lunch);
+           for (r = 0; r < num_stones; r++)
+             owl->inessential[stones[r]] = 1;
+         }
+       }
+      }
+    }
+  }
+
+  owl->lunches_are_current = 1;
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+}
+
+
+/* Try to improve the move to attack a lunch. Essentially we try to avoid
+ * unsafe moves when there are less risky ways to attack.
+ *
+ * This function also improves lunch attack point in a special case when
+ * we capture a one- or two-stone lunch on the first line. If we eat it
+ * with a first line move, there is a huge risk we'll end up with a false
+ * eye. Therefore, we move the attack to the second line when it works.
+ *
+ *   .*OO      .*OOO       .*OOOO
+ *   .,XO      .,X.O       .,XX.O
+ *   ----      -----       ------
+ *
+ * In all these position the attack point is moved from ',' to '*'.
+ */
+static int
+improve_lunch_attack(int lunch, int attack_point)
+{
+  int color = OTHER_COLOR(board[lunch]);
+  int defense_point;
+  int k;
+
+  if (safe_move(attack_point, color)) {
+    if (is_edge_vertex(lunch)
+       && is_edge_vertex(attack_point)
+       && neighbor_of_string(attack_point, lunch)) {
+      int stones = countstones(lunch);
+      int libs[2];
+
+      if (stones == 1
+         || (stones == 2
+             && findlib(lunch, 2, libs) == 2
+             && is_edge_vertex(libs[0])
+             && is_edge_vertex(libs[1]))) {
+       for (k = 0; k < 4; k++) {
+         int apos = attack_point + delta[k];
+         if (!ON_BOARD(attack_point - delta[k]) && board[apos] == EMPTY) {
+           if (does_attack(apos, lunch) && safe_move(apos, color))
+             return apos;
+           break;
+         }
+       }
+      }
+    }
+
+    return attack_point;
+  }
+
+  for (k = 0; k < 4; k++) {
+    int pos = attack_point + delta[k];
+    if (board[pos] == color
+       && attack(pos, NULL)
+       && find_defense(pos, &defense_point)
+       && defense_point != NO_MOVE
+       && does_attack(defense_point, lunch)) {
+      TRACE("Moved attack of lunch %1m from %1m to %1m.\n",
+           lunch, attack_point, defense_point);
+      return defense_point;
+    }
+  }
+  
+  return attack_point;
+}
+
+/* Try to improve the move to defend a lunch.
+ *
+ * An example where this is useful is the position below, where the
+ * defense of A is moved from b to c. This is a possible variation in
+ * ld_owl:182.
+ *
+ * ...X..|      ...X..|
+ * ...X..|     ...Xc.|
+ * ..XXO.|     ..XXOb|
+ * XXXOOX|     XXXOOA|
+ * XOOOX.|     XOOOX.|
+ * .XOX.X|     .XOX.X|
+ * ------+     ------+
+ */
+static int
+improve_lunch_defense(int lunch, int defense_point)
+{
+  int color = board[lunch];
+  int k;
+  
+  for (k = 0; k < 4; k++) {
+    int pos = defense_point + delta[k];
+    if (board[pos] == OTHER_COLOR(color)
+       && countlib(pos) == 2) {
+      int libs[2];
+      int pos2;
+      
+      findlib(pos, 2, libs);
+      if (libs[0] == defense_point)
+       pos2 = libs[1];
+      else
+       pos2 = libs[0];
+
+      if (accuratelib(pos2, color, MAXLIBS, NULL)
+         > accuratelib(defense_point, color, MAXLIBS, NULL)
+         && does_defend(pos2, lunch)) {
+       TRACE("Moved defense of lunch %1m from %1m to %1m.\n",
+             lunch, defense_point, pos2);
+       return pos2;
+      }
+    }
+  }
+  
+  return defense_point;
+}
+
+
+/* Wrapper for make domains. The second set of owl data is optional.
+ * Use a null pointer if it is not needed. Otherwise, make_domains
+ * is run separately for the two owl data, but information about
+ * tactically dead lunches is used from *both* sources through
+ * the owl_lively() calls.
+ */
+
+static void
+owl_make_domains(struct local_owl_data *owla, struct local_owl_data *owlb)
+{
+  /* We need to set this so that owl_lively() can be used. */
+  struct eye_data *black_eye = NULL;
+  struct eye_data *white_eye = NULL;
+  
+  current_owl_data = owla;
+  other_owl_data = owlb;
+
+  if (!owla->lunches_are_current)
+    owl_find_lunches(owla);
+  if (owla->color == BLACK)
+    black_eye = owla->my_eye;
+  else
+    white_eye = owla->my_eye;
+  
+  if (owlb) {
+    gg_assert(owla->color == OTHER_COLOR(owlb->color));
+    if (!owlb->lunches_are_current)
+      owl_find_lunches(owlb);
+    if (owlb->color == BLACK)
+      black_eye = owlb->my_eye;
+    else
+      white_eye = owlb->my_eye;
+  }
+  make_domains(black_eye, white_eye, 1);
+}
+
+/* True unless (pos) is EMPTY or occupied by a lunch for the goal dragon.  
+ * Used during make_domains (see optics.c: lively macro). A ``lively''
+ * worm is one that might be alive, hence cannot be ignored in 
+ * determining eye spaces.
+ */
+
+int 
+owl_lively(int pos)
+{
+  int origin;
+  int lunch;
+  ASSERT_ON_BOARD1(pos);
+
+  if (board[pos] == EMPTY)
+    return 0;
+  origin = find_origin(pos);
+
+  /* When reading a semeai there is a second set of owl data to consider.
+   * Strings of the second owl are considered lively no matter what,
+   * since declaring such a string dead prematurely can prevent the
+   * semeai code from finishing its job.
+   *
+   * On the other hand a friendly string which is a lunch of the
+   * other dragon and can't be saved is not lively.
+   */
+  if (other_owl_data) {
+
+    if (include_semeai_worms_in_eyespace && other_owl_data->goal[pos])
+      return 0;
+    
+    if (other_owl_data->goal[pos] && !semeai_trust_tactical_attack(pos))
+      return 1;
+    /* FIXME: Shouldn't we check other_owl_data->inessential[origin] here? */
+    for (lunch = 0; lunch < MAX_LUNCHES; lunch++)
+      if (other_owl_data->lunch[lunch] == origin
+         && other_owl_data->lunch_defense_point[lunch] == NO_MOVE)
+       return 0;
+  }
+
+  /* Inessential stones are not lively. */
+  if (current_owl_data->inessential[origin])
+    return 0;
+
+  /* Lunches that can't be saved are dead, so don't report them as lively. */
+  for (lunch = 0; lunch < MAX_LUNCHES; lunch++)
+    if (current_owl_data->lunch[lunch] == origin
+       && current_owl_data->lunch_defense_point[lunch] == NO_MOVE)
+      return 0;
+
+  return 1;
+}
+
+
+/* Caching version of safe_move for the callback. This function has
+ * its own cache, separate from the global safe move cache. Note that
+ * since the cache is reset by owl_shapes before starting pattern
+ * matching, and since (unlike safe_move) this function is always
+ * called from the same place in owl_shapes_callback, the color will
+ * be the same each time it is called. So there is no need to have
+ * separate caches for B and W.
+ */
+
+static int
+owl_safe_move(int move, int color)
+{
+  int acode, safe = 0;
+
+  if (trymove(move, color, "owl_safe_move", 0)) {
+    acode = attack(move, NULL);
+    if (acode != WIN)
+      safe = 1;
+    else
+      safe = 0;
+    popgo();
+  }
+  current_owl_data->safe_move_cache[move] = safe+1;
+  return safe;
+}
+  
+
+/* This function, called when stackp==0, returns true if capturing
+ * the string at (str) results in a live group.
+ */
+
+#define MAX_SUBSTANTIAL_LIBS 10
+
+int
+owl_substantial(int str)
+{
+  int k;
+  int libs[MAX_SUBSTANTIAL_LIBS + 1];
+  int liberties = findlib(str, MAX_SUBSTANTIAL_LIBS+1, libs);
+  int reading_nodes_when_called = get_reading_node_counter();
+  int tactical_nodes;
+  int result;
+  double start = 0.0;
+  struct local_owl_data *owl;
+  int num_moves = 0;
+
+  if (debug & DEBUG_OWL_PERFORMANCE)
+    start = gg_cputime();
+
+  /* FIXME: We want to use the full init_owl here too (cf. similar
+   * remark below).
+   */
+  reduced_init_owl(&owl, 1);
+
+  owl->color = OTHER_COLOR(board[str]);
+  local_owl_node_counter = 0;
+
+  /* Big strings are always substantial since the biggest nakade is
+   * six stones. (There are probably rare exceptions to this
+   * rule, but they are unlikely to come up in a game.)
+   */
+  if (countstones(str) > 6)
+    return 1;
+  
+  if (liberties > MAX_SUBSTANTIAL_LIBS)
+    return 0;
+
+  memset(owl->goal, 0, sizeof(owl->goal));
+  /* Mark the neighbors of the string. If one is found which is alive, return
+   * true. */
+  {
+    int adjs[MAXCHAIN];
+    int adj;
+
+    adj = chainlinks(str, adjs);
+    for (k = 0; k < adj; k++) {
+      if (dragon[adjs[k]].status == ALIVE)
+       return 1;
+      mark_dragon(adjs[k], owl->goal, 1);
+    }
+  }
+
+  /* We must check the cache while stackp == 0, but we wait until the
+   * trivial tests have been done.
+   */
+  if (search_persistent_owl_cache(OWL_SUBSTANTIAL, str, 0, 0,
+                                 &result, NULL, NULL, NULL))
+    return result;
+
+  /* fill all the liberties */
+  for (k = 0; k < liberties; k++) {
+    if (trymove(libs[k], owl->color, NULL, 0)) {
+      if (get_level() >= 8)
+       increase_depth_values();
+      owl->goal[libs[k]] = 1;
+      num_moves++;
+    }
+    else {
+      /* if we can't fill, try swapping with the next liberty */
+      if (k < liberties-1
+         && trymove(libs[k+1], owl->color, NULL, 0)) {
+       if (get_level() >= 8)
+         increase_depth_values();
+       owl->goal[libs[k+1]] = 1;
+       libs[k+1] = libs[k];
+       num_moves++;
+      }
+      else {
+       /* Can't fill the liberties. Give up! */
+       while (num_moves-- > 0) {
+         if (get_level() >= 8)
+           decrease_depth_values();
+         popgo();
+       }
+       return 0;
+      }
+    }
+  }
+  /* FIXME: We would want to use init_owl() here too, but it doesn't
+   * fit very well with the construction of the goal array above.
+   */
+  memcpy(owl->cumulative_goal, owl->goal, BOARDMAX);
+  compute_owl_escape_values(owl);
+  owl_mark_boundary(owl);
+  owl->lunches_are_current = 0;
+
+  if (do_owl_attack(libs[0], NULL, NULL, owl, 0))
+    result = 0;
+  else
+    result = 1;
+  while (num_moves-- > 0) {
+    if (get_level() >= 8)
+      decrease_depth_values();
+    popgo();
+  }
+
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+  DEBUG(DEBUG_OWL_PERFORMANCE,
+       "owl_substantial %1m, result %d (%d, %d nodes, %f seconds)\n",
+       str, result, local_owl_node_counter,
+       tactical_nodes, gg_cputime() - start);
+
+  store_persistent_owl_cache(OWL_SUBSTANTIAL, str, 0, 0, result, 0, 0, 0,
+                            tactical_nodes, owl->goal, owl->color);
+
+  return result;
+}
+
+
+
+/* Returns true if and only if (i, j) is a 1-2 vertex, i.e. next to a
+ * corner.
+ */
+static int
+one_two_point(int pos)
+{
+  int i = I(pos);
+  int j = J(pos);
+  
+  if ((i == 0 || i == board_size-1 || j == 0 || j == board_size-1)
+      && (i == 1 || i == board_size-2 || j == 1 || j == board_size-2))
+    return 1;
+
+  return 0;
+}
+
+
+
+/* Reports the number of eyes gotten by capturing a boundary string.
+ * This implementation tends to give an optimistic view of the
+ * chances, so if it tells that the lunch is worthless, it truly
+ * should be. The converse is not true.
+ */
+
+static void
+sniff_lunch(int lunch, int *min, int *probable, int *max,
+           struct local_owl_data *owl)
+{
+  int other = OTHER_COLOR(board[lunch]);
+  int libs[MAXLIBS];
+  int liberties;
+  int r;
+
+  ASSERT1(IS_STONE(board[lunch]), lunch);
+
+  if (owl->boundary[lunch] == 2) {
+    *min = 2;
+    *probable = 2;
+    *max = 2;
+    return;
+  }
+
+  /* Do we believe this capture would help escaping? */
+  liberties = findlib(lunch, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++) {
+    if (owl->escape_values[libs[r]] > 0
+       && !is_self_atari(libs[r], other)) {
+      int k;
+      for (k = 0; k < 8; k++)
+       if (ON_BOARD(libs[r] + delta[k]) && owl->goal[libs[r] + delta[k]])
+         break;
+      if (k == 8) {
+       *min = 2;
+       *probable = 2;
+       *max = 2;
+       return;
+      }
+    }
+  }
+
+  estimate_lunch_eye_value(lunch, min, probable, max, 1);
+
+  if (*min < 2) {
+    int bonus = estimate_lunch_half_eye_bonus(lunch, owl->half_eye);
+    *min += bonus/2;
+    *probable += bonus;
+    *max += (bonus + 1)/2;
+  }
+
+  if (*probable < 2)
+    eat_lunch_escape_bonus(lunch, min, probable, max, owl);
+}
+
+/* Capturing a lunch can give eyes by turning a false eye into a proper one,
+ * etc. This function returns the likely increase in half eyes
+ * by capturing the string at (lunch).
+ */
+static int
+estimate_lunch_half_eye_bonus(int lunch,
+                             struct half_eye_data half_eye[BOARDMAX])
+{
+  int stones[10];
+  int k;
+  int size = findstones(lunch, 10, stones);
+  int half_eyes = 0;
+
+  ASSERT1(size < 10, lunch);
+
+  for (k = 0; k < size; k++) {
+    int stone = stones[k];
+    int d;
+    for (d = 4; d < 8; d++) {
+      int pos = stone + delta[d];
+      if (ON_BOARD(pos)
+         && (is_halfeye(half_eye, pos) || is_false_eye(half_eye, pos)))
+       half_eyes++;
+    }
+  }
+  return half_eyes;
+}
+
+
+void
+estimate_lunch_eye_value(int lunch, int *min, int *probable, int *max,
+                        int appreciate_one_two_lunches)
+{
+  int other = OTHER_COLOR(board[lunch]);
+  int size = countstones(lunch);
+
+  if (size > 6) {
+    *min = 2;
+    *probable = 2;
+    *max = 2;
+  }
+  else if (size > 4) {
+    *min = 1;
+    *probable = 2;
+    *max = 2;
+  }
+  else if (size > 2) {
+    *min = 0;
+    *probable = 1;
+    *max = 2;
+  }
+  else if (size == 2) {
+    int stones[2];
+    findstones(lunch, 2, stones);
+    /* A lunch on a 1-2 point tends always to be worth contesting. */
+    if ((obvious_false_eye(stones[0], other)
+       || obvious_false_eye(stones[1], other))
+       && (!appreciate_one_two_lunches
+           || !(one_two_point(stones[0]) || one_two_point(stones[1])))) {
+      *min = 0;
+      *probable = 0;
+      *max = 0;
+    }
+    else {
+      *min = 0;
+      *probable = 1;
+      *max = 1;
+    }
+  }
+  else if (size == 1) {
+    if (!obvious_false_eye(lunch, other)) {
+      *min = 0;
+      *probable = 1;
+      *max = 1;
+    }
+    else {
+      *min = 0;
+      *probable = 0;
+      *max = 0;
+    }
+  }
+}
+
+/* Gives a bonus for a lunch capture which joins a (or some) friendly
+ * string(s) to the goal dragon and improves the escape potential at
+ * the same time. This is indicated in some situations where the owl
+ * code would stop the analysis because of various cutoffs. See
+ * do_owl_defend()
+ * 
+ * The following implementation tries to get a precise idea of the
+ * escape potential improvement by calling dragon_escape() twice.
+ */
+static void
+eat_lunch_escape_bonus(int lunch, int *min, int *probable, int *max,
+                      struct local_owl_data *owl)
+{
+  int adjacent[MAXCHAIN];
+  int neighbors;
+  int adjoins = 0;
+  int n;
+  /* Be very careful before touching this value.
+   * See owl_estimate_life() for details.
+   */
+  UNUSED(min);
+  
+  /* Don't mess up with kos */
+  if (is_ko_point(lunch))
+    return;
+  
+  neighbors = chainlinks(lunch, adjacent);
+  for (n = 0; n < neighbors; n++)
+    adjoins |= !owl->goal[adjacent[n]];
+  
+  if (adjoins) {
+    int before, after;
+    before = dragon_escape(owl->goal, owl->color, owl->escape_values);
+    /* if the escape route is already large enough to be considered
+     * a WIN by the owl code, then no need for more */
+    if (before < 5) {
+      signed char new_goal[BOARDMAX];
+      memcpy(new_goal, owl->goal, sizeof(new_goal));
+      for (n = 0; n < neighbors; n++)
+       if (!owl->goal[adjacent[n]])
+         mark_string(adjacent[n], new_goal, 2);
+      after = dragon_escape(new_goal, owl->color, owl->escape_values);
+       
+      /* Following is completely ad hoc. Another set of tests might
+       * very well get better results. */
+      if (after - before >= 3) {
+       if (after >= 8 || (before == 0 && after >= 5)) {
+         *probable = 2;
+         *max = 2;
+       }
+       else if (*max < 2)
+         (*max)++;
+      }
+    }
+  }
+}
+
+/* Find a new origin when it has been captured or cut out of the
+ * goal. Used in do_owl_attack()
+ */
+static int
+select_new_goal_origin(int origin, struct local_owl_data *owl)
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == owl->color && owl->goal[pos] == 1)
+      return find_origin(pos);
+
+  return origin;
+}
+
+
+/* Retrieve topological eye values stored in the half_eye[] array of
+ * the current owl data.
+ *
+ * FIXME: Sooner or later we'll want this to return a non-rounded
+ * value. When we change this, we have to review all patterns using
+ * the autohelper owl_topological_eye().
+ */
+int
+owl_topological_eye(int pos, int color)
+{
+  float value;
+  UNUSED(color);
+  value = current_owl_data->half_eye[pos].value;
+  if (value > 2.0 && value < 4.0)
+    return 3;
+  else if (value <= 2.0)
+    return (int) (value + 0.99); /* Round up. */
+  else
+    return (int) value;          /* Round down. */
+}
+
+/* This function returns true if it is judged that the capture of the
+ * string at (pos) is sufficient to create one eye.
+ *
+ * Update: Now it instead returns the max number of eyes.
+ */
+
+int
+vital_chain(int pos)
+{
+  int min;
+  int probable;
+  int max;
+  sniff_lunch(pos, &min, &probable, &max, current_owl_data);
+
+  return max;
+}
+
+
+static void
+compute_owl_escape_values(struct local_owl_data *owl)
+{
+  int pos;
+  int m, n;
+  signed char safe_stones[BOARDMAX];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  signed char mx[BOARDMAX];
+  memset(mx, 0, sizeof(mx));
+    
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  get_lively_stones(OTHER_COLOR(owl->color), safe_stones);
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  compute_escape_influence(owl->color, safe_stones, NULL, NULL,
+                          owl->escape_values);
+
+  DEBUG(DEBUG_ESCAPE, "Owl escape values:\n");
+  for (m = 0; m < board_size; m++) {
+    for (n = 0; n < board_size; n++) {
+      pos = POS(m, n);
+      if (dragon[pos].color == owl->color && !owl->goal[pos]) {
+       if (dragon[pos].crude_status == ALIVE)
+         owl->escape_values[pos] = 6;
+       else if (dragon[pos].crude_status == UNKNOWN) {
+         if (DRAGON2(pos).moyo_size > 5)
+           owl->escape_values[pos] = 4;
+         else if (DRAGON2(pos).escape_route > 5) {
+           if (mx[dragon[pos].origin])
+             owl->escape_values[pos] = owl->escape_values[dragon[pos].origin];
+           else {
+             int pos2;
+             signed char escape_values[BOARDMAX];
+             signed char dragon_stones[BOARDMAX];
+
+             compute_escape_influence(owl->color, safe_stones, owl->goal,
+                                      NULL, escape_values);
+
+             /* mark_dragon() can't be used here in case a string of
+              * the dragon was captured by the initial move in
+              * owl_does_attack(). Actually it isn't really proper to
+              * use is_same_dragon() at stackp>0 either but it's more
+              * robust at least.
+              */
+             for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+               if (ON_BOARD(pos2))
+                 dragon_stones[pos2] = is_same_dragon(pos2, pos);
+             }
+             
+             if (dragon_escape(dragon_stones, owl->color, escape_values) > 5)
+               owl->escape_values[dragon[pos].origin] = 4;
+
+             mx[dragon[pos].origin] = 1;
+           }
+         }
+       }
+      }
+      DEBUG(DEBUG_ESCAPE, "%o%d", owl->escape_values[pos]);
+    }
+    DEBUG(DEBUG_ESCAPE, "%o\n");
+  }
+}
+
+
+/* Used by autohelpers. */
+int
+owl_escape_value(int pos)
+{
+  /* FIXME: Should have a more robust mechanism to avoid 
+   * escaping inwards. Returning a negative value is just a kludge.
+   */
+  int k;
+  ASSERT_ON_BOARD1(pos);
+  if (current_owl_data->goal[pos])
+    return -10;
+
+  if (board[pos] == EMPTY)
+    for (k = 0; k < 8; k++)
+      if (ON_BOARD(pos + delta[k]) && current_owl_data->goal[pos + delta[k]])
+       return -10;
+  
+  return current_owl_data->escape_values[pos];
+}
+
+
+/* Used by autohelpers. */
+int
+owl_goal_dragon(int pos)
+{
+  return current_owl_data->goal[pos] != 0;
+}
+
+/* Used by autohelpers.
+ * Returns 1 if (pos) is an eyespace for the color of the dragon currently
+ * under owl investigation.
+ */
+int
+owl_eyespace(int pos)
+{
+  int origin;
+  ASSERT_ON_BOARD1(pos);
+  
+  origin = current_owl_data->my_eye[pos].origin;
+  return (ON_BOARD(origin)
+         && (current_owl_data->my_eye[origin].color
+             == current_owl_data->color)
+         && max_eyes(&current_owl_data->my_eye[origin].value) > 0);
+}
+
+
+/* Used by autohelpers.
+ * Returns 1 if (pos) is an eyespace for the color of the dragon currently
+ * under owl investigation, which is possibly worth (at least) 2 eyes.
+ */
+int
+owl_big_eyespace(int pos)
+{
+  int origin;
+  ASSERT_ON_BOARD1(pos);
+
+  origin = current_owl_data->my_eye[pos].origin;
+  return (ON_BOARD(origin) 
+         && (current_owl_data->my_eye[origin].color
+             == current_owl_data->color)
+         && max_eyes(&current_owl_data->my_eye[origin].value) >= 2);
+}
+
+
+/* Used by autohelpers.
+ * Returns 1 if (pos) is an eyespace for the color of the dragon currently
+ * under owl investigation.
+ */
+int
+owl_mineye(int pos)
+{
+  int origin;
+  ASSERT_ON_BOARD1(pos);
+  
+  origin = current_owl_data->my_eye[pos].origin;
+  if (!ON_BOARD(origin)
+      || (current_owl_data->my_eye[origin].color
+         != current_owl_data->color))
+    return 0;
+      
+  return min_eyes(&current_owl_data->my_eye[origin].value);
+}
+
+
+/* Used by autohelpers.
+ * Returns 1 if (pos) is an eyespace for the color of the dragon currently
+ * under owl investigation.
+ */
+int
+owl_maxeye(int pos)
+{
+  int origin;
+  ASSERT_ON_BOARD1(pos);
+  
+  origin = current_owl_data->my_eye[pos].origin;
+  if (!ON_BOARD(origin)
+      || (current_owl_data->my_eye[origin].color
+         != current_owl_data->color))
+    return 0;
+      
+  return max_eyes(&current_owl_data->my_eye[origin].value);
+}
+
+
+/* Used by autohelpers.
+ * Returns 1 if (pos) is a non-marginal eyespace for the color of the
+ * dragon currently under owl investigation.
+ */
+int
+owl_proper_eye(int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+
+  return ((current_owl_data->my_eye[pos].color
+          == current_owl_data->color)
+         && !current_owl_data->my_eye[pos].marginal);
+}
+  
+
+/* Used by autohelpers.
+ * Returns the effective size of the eyespace at pos.
+ */
+int
+owl_eye_size(int pos)
+{
+  int origin;
+  ASSERT_ON_BOARD1(pos);
+
+  origin = current_owl_data->my_eye[pos].origin;
+  return current_owl_data->my_eye[origin].esize
+        - current_owl_data->my_eye[origin].msize;
+}
+  
+
+/* Used by autohelpers.
+ * Returns whether str is a lunch.
+ */
+int
+owl_lunch(int str)
+{
+  int k;
+  int origin;
+  ASSERT_ON_BOARD1(str);
+  ASSERT1(current_owl_data->lunches_are_current, str);
+  origin = find_origin(str);
+
+  for (k = 0; k < MAX_LUNCHES; k++) {
+    if (current_owl_data->lunch[k] == NO_MOVE)
+      break;
+    if (current_owl_data->lunch[k] == origin)
+      return 1;
+  }
+
+  return 0;
+}
+  
+
+/* Used by autohelpers.
+
+ * Returns 1 if (pos) is considered to be a strong dragon. This is
+ * intended to be used to decide whether connecting to some external
+ * stones is an easy way to live. The current implementation is fairly
+ * conservative, requiring that (pos) was part of a dragon with two
+ * eyes according to the static analysis. This requirement may be
+ * relaxed considerably in the future.
+ *
+ * (pos) must not be part of the goal dragon.
+ */
+int
+owl_strong_dragon(int pos)
+{
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(board[pos]), pos);
+  
+  return (!current_owl_data->goal[pos]
+         && dragon[pos].color == board[pos]
+         && dragon[pos].crude_status == ALIVE);
+}
+  
+
+static int
+owl_escape_route(struct local_owl_data *owl)
+{
+  signed char modified_escape[BOARDMAX];
+  int pos;
+  memcpy(modified_escape, owl->escape_values, sizeof(modified_escape));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && owl->cumulative_goal[pos])
+      modified_escape[pos] = 0;
+  return dragon_escape(owl->goal, owl->color, modified_escape);
+}
+
+
+/****************************
+ * Initialization of owl data
+ ****************************/
+
+/* This is a temporary solution. We want to be able to use the full
+ * init_owl() also in owl_substantial.
+ */
+static void
+reduced_init_owl(struct local_owl_data **owl, int at_bottom_of_stack)
+{
+  if (at_bottom_of_stack)
+    owl_stack_pointer = 0;
+  else
+    owl_stack_pointer++;
+
+  check_owl_stack_size();
+  *owl = owl_stack[owl_stack_pointer];
+  VALGRIND_MAKE_WRITABLE(*owl, sizeof(struct local_owl_data));
+}
+
+
+/* Initialize owl data. Set at_bottom_of_stack to 1 the first time you
+ * call init_owl() and to 0 any following time (only relevant if you
+ * need more than one set of owl data).
+ */
+static void
+init_owl(struct local_owl_data **owl, int target1, int target2, int move,
+         int at_bottom_of_stack, int new_dragons[BOARDMAX])
+{
+  reduced_init_owl(owl, at_bottom_of_stack);
+
+  local_owl_node_counter = 0;
+  (*owl)->lunches_are_current = 0;
+  owl_mark_dragon(target1, target2, *owl, new_dragons);
+  if (move != NO_MOVE)
+    owl_update_goal(move, SAME_DRAGON_MAYBE_CONNECTED, NO_MOVE, *owl, 0, NULL);
+  compute_owl_escape_values(*owl);
+}
+
+
+/***********************
+ * Storage of owl data
+ ***********************/
+
+/* Check the size of the owl stack and extend it if too small. */
+static void
+check_owl_stack_size(void)
+{
+  while (owl_stack_size <= owl_stack_pointer) {
+    owl_stack[owl_stack_size] = malloc(sizeof(*owl_stack[0]));
+    gg_assert(owl_stack[owl_stack_size] != NULL);
+    owl_stack_size++;
+  }
+}
+
+/* Push owl data one step upwards in the stack. Gets called from
+ * push_owl.
+ */
+static void
+do_push_owl(struct local_owl_data **owl)
+{
+  struct local_owl_data *new_owl = owl_stack[owl_stack_pointer];
+
+  /* Mark all the data in *new_owl as uninitialized. */
+  VALGRIND_MAKE_WRITABLE(new_owl, sizeof(struct local_owl_data));
+  /* Copy the owl data. */
+  memcpy(new_owl->goal, (*owl)->goal, sizeof(new_owl->goal));
+  memcpy(new_owl->cumulative_goal, (*owl)->cumulative_goal,
+         sizeof(new_owl->cumulative_goal));
+  memcpy(new_owl->boundary, (*owl)->boundary, sizeof(new_owl->boundary));
+  memcpy(new_owl->neighbors, (*owl)->neighbors, sizeof(new_owl->neighbors));
+  memcpy(new_owl->escape_values, (*owl)->escape_values,
+        sizeof(new_owl->escape_values));
+  new_owl->color = (*owl)->color;
+
+  new_owl->lunches_are_current = 0;
+
+  /* Needed for stack organization. Since there may be one or two sets
+   * of owl data active at we don't know whether to restore from the
+   * previos stack entry or two steps back.
+   */
+  new_owl->restore_from = *owl;
+
+  /* Finally move the *owl pointer. */
+  *owl = new_owl;
+}
+
+
+/* Push owl data one step upwards in the stack. The stack is extended
+ * with dynamically allocated memory if it is too small.
+ *
+ * This function no longer may move existing owl data around, so
+ * existing pointers do not risk becoming invalid.
+ */
+static void
+push_owl(struct local_owl_data **owl)
+{
+  owl_stack_pointer++;
+  check_owl_stack_size();
+  do_push_owl(owl);
+}
+
+
+/* Retrieve owl data from the stack. */
+static void
+pop_owl(struct local_owl_data **owl)
+{
+  *owl = (*owl)->restore_from;
+  owl_stack_pointer--;
+}
+
+
+/*
+ * List worms in order to track captures during owl reading
+ * (GAIN/LOSS codes)
+ */
+static int
+list_goal_worms(struct local_owl_data *owl, int goal_worm[MAX_GOAL_WORMS])
+{
+  int pos, k;
+  int w = 0;
+
+  for (k = 0; k < MAX_GOAL_WORMS; k++)
+    goal_worm[k] = NO_MOVE;
+
+  for (pos = BOARDMIN; pos < BOARDMAX && w < MAX_GOAL_WORMS; pos++) {
+    if (ON_BOARD(pos)
+       && board[pos]
+       && owl->goal[pos] == 1) {
+      int origin = find_origin(pos);
+      for (k = 0; k < w; k++)
+       if (goal_worm[k] == origin) 
+         break;
+      if (k == w)
+       goal_worm[w++] = pos;
+    }
+  }
+
+  /* experimental: let's try to fill up the array with other neighboring
+   * opponent worms
+   */
+  if (1 && (w > 0) && (w < MAX_GOAL_WORMS)) {
+    pos = goal_worm[0];
+    for (k = 0; k < DRAGON2(pos).neighbors && w < MAX_GOAL_WORMS; k++) {
+      int ii;
+      int d = DRAGON2(pos).adjacent[k];
+      if (DRAGON(d).color != owl->color)
+       continue;
+
+      for (ii = BOARDMIN; ii < BOARDMAX && w < MAX_GOAL_WORMS; ii++)
+       if (ON_BOARD(ii) && board[ii] && worm[ii].origin == ii
+           && worm[ii].size >= 3 && dragon[ii].id == d)
+         goal_worm[w++] = ii;
+    }
+  }
+
+  return w;
+}
+
+static void
+prepare_goal_list(int str, struct local_owl_data *owl,
+                 int list[MAX_GOAL_WORMS], int *flag,
+                 int *kworm, int do_list)
+{
+  gg_assert(flag != NULL);
+
+  if (kworm) {
+    if (do_list)
+      list_goal_worms(owl, list);
+    /* N.B. We cannot use sizeof(list) below because a formal array
+     * parameter implicitly is converted to a pointer and sizeof(list)
+     * thus equals sizeof(int *), which is not what we want.
+     */
+    memcpy(dragon_goal_worms[dragon[str].id], list,
+          sizeof(dragon_goal_worms[dragon[str].id]));
+    *flag = 1;
+  }
+  else
+    *flag = 0;
+}
+
+static void
+finish_goal_list(int *flag, int *wpos, int list[MAX_GOAL_WORMS], int index)
+{
+  gg_assert(flag != NULL);
+  gg_assert(wpos != NULL);
+
+  *flag = 0;
+  if (index == MAX_GOAL_WORMS)
+    *wpos = NO_MOVE;
+  else
+    *wpos = list[index];
+}
+
+
+/* Returns the number of worms in the goal dragon, and a pointer to each */
+
+#if 0
+static int
+catalog_goal(struct local_owl_data *owl, int goal_worm[MAX_GOAL_WORMS])
+{
+  int pos;
+  int worms = 0;
+  int k;
+
+  for (k = 0; k < MAX_WORMS; k++)
+    goal_worm[k] = NO_MOVE;
+
+  for (pos = BOARDMIN; pos < BOARDMAX && worms < MAX_WORMS; pos++)
+    if (ON_BOARD(pos)
+       && board[pos]
+       && (owl->goal)[pos]) {
+      int origin = find_origin(pos);
+      if (pos == origin) {
+       if (0) {
+         DEBUG(DEBUG_SEMEAI, "goal worm: %1m\n", pos);
+       }
+       goal_worm[worms++] = pos;
+      }
+    }
+  return worms;
+}
+#endif
+
+/***********************/
+
+/* Clear statistics. */
+void
+reset_owl_node_counter()
+{
+  global_owl_node_counter = 0;
+}
+
+
+/* Retrieve statistics. */
+int
+get_owl_node_counter()
+{
+  return global_owl_node_counter;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/persistent.c b/engine/persistent.c
new file mode 100644 (file)
index 0000000..35c8ae4
--- /dev/null
@@ -0,0 +1,1462 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * The code in this file implements persistent caching.
+ *
+ * The idea is that reading results are stored together with an
+ * "active area", i.e. the part of the board having an effect on the
+ * reading result. Thus if only moves outside of the active area has
+ * been played since the result was stored, it can be reused.
+ *
+ * The active areas are not known exactly but are estimated
+ * heuristically. The effects are that too large an active area
+ * reduces the efficiency of the caching scheme while too small an
+ * active area may cause an incorrect read result to be retrieved from
+ * the cache.
+ *
+ * Persistent caching has so far been implemented for tactical reading,
+ * owl reading, connection reading and break-in reading (with semeai
+ * reading planned for the future).
+ *
+ * The hotspot functions are intended to locate where the most
+ * expensive reading of either type is going on. This information can
+ * be estimated from the contents of the persistent caches since the
+ * most expensive readings are stored there with full information of
+ * spent reading nodes, involved strings or dragons, and active areas.
+ */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "liberty.h"
+#include "cache.h"
+
+
+/* ================================================================ */
+/*                     Data structures                              */
+/* ================================================================ */
+
+/* Used in active area. */
+#define HIGH_LIBERTY_BIT  4
+#define HIGH_LIBERTY_BIT2 8
+
+
+#define MAX_READING_CACHE_DEPTH 5
+#define MAX_READING_CACHE_SIZE 100
+
+#define MAX_OWL_CACHE_DEPTH 0
+#define MAX_OWL_CACHE_SIZE 150
+
+#define MAX_CONNECTION_CACHE_DEPTH 5
+#define MAX_CONNECTION_CACHE_SIZE 100
+
+#define MAX_BREAKIN_CACHE_DEPTH 1
+#define MAX_BREAKIN_CACHE_SIZE 150
+
+#define MAX_SEMEAI_CACHE_DEPTH 0
+#define MAX_SEMEAI_CACHE_SIZE 150
+
+#define MAX_CACHE_DEPTH        5
+
+
+/* We use the same data structure for all of the caches. Some of the entries
+ * below are unused for some of the caches.
+ */
+struct persistent_cache_entry {
+  int boardsize;
+  int movenum;
+  Intersection board[BOARDMAX];
+  int stack[MAX_CACHE_DEPTH];
+  int move_color[MAX_CACHE_DEPTH];
+  enum routine_id routine;
+  int apos; /* first input coordinate */
+  int bpos; /* second input coordinate */
+  int cpos; /* third input coordinate */
+  int color; /* Move at (cpos) by (color) in analyze_semeai_after_move() */
+  Hash_data goal_hash; /* hash of the goals in break-in and semeai reading */
+  int result;
+  int result2;
+  int result_certain;
+  int remaining_depth;
+  int node_limit; 
+  int move; /* first result coordinate */
+  int move2;/* second result coordinate */
+  int cost; /* Usually no. of tactical nodes spent on this reading result. */
+  int score; /* Heuristic guess of the worth of the cache entry. */
+};
+
+/* Callback function that implements the computation of the active area.
+ * This function has to be provided by each cache.
+ */
+typedef void (*compute_active_area_fn)(struct persistent_cache_entry *entry,
+                                      const signed char goal[BOARDMAX],
+                                      int goal_color);
+
+struct persistent_cache {
+  const int max_size; /* Size of above array. */
+  const int max_stackp; /* Don't store positions with stackp > max_stackp. */
+  const float age_factor; /* Reduce value of old entries with this factor. */
+  const char *name; /* For debugging purposes. */
+  const compute_active_area_fn compute_active_area;
+  struct persistent_cache_entry *table; /* Array of actual results. */
+  int current_size; /* Current number of entries. */
+  int last_purge_position_number;
+};
+
+static void compute_active_owl_area(struct persistent_cache_entry *entry,
+                                   const signed char goal[BOARDMAX],
+                                   int goal_color);
+static void compute_active_semeai_area(struct persistent_cache_entry *entry,
+                                      const signed char goal[BOARDMAX],
+                                      int dummy);
+static void compute_active_reading_area(struct persistent_cache_entry *entry,
+                                       const signed char
+                                           reading_shadow[BOARDMAX],
+                                       int dummy);
+static void compute_active_connection_area(struct persistent_cache_entry *entry,
+                                          const signed char
+                                               connection_shadow[BOARDMAX],
+                                          int goal_color);
+static void compute_active_breakin_area(struct persistent_cache_entry *entry,
+                                       const signed char
+                                           breakin_shadow[BOARDMAX],
+                                       int dummy);
+
+static struct persistent_cache reading_cache =
+  { MAX_READING_CACHE_SIZE, MAX_READING_CACHE_DEPTH, 1.0,
+    "reading cache", compute_active_reading_area,
+    NULL, 0, -1 };
+
+static struct persistent_cache connection_cache =
+  { MAX_CONNECTION_CACHE_SIZE, MAX_CONNECTION_CACHE_DEPTH, 1.0,
+    "connection cache", compute_active_connection_area,
+    NULL, 0, -1 };
+
+static struct persistent_cache breakin_cache =
+  { MAX_BREAKIN_CACHE_SIZE, MAX_BREAKIN_CACHE_DEPTH, 0.75,
+    "breakin cache", compute_active_breakin_area,
+    NULL, 0, -1 };
+
+static struct persistent_cache owl_cache =
+  { MAX_OWL_CACHE_SIZE, MAX_OWL_CACHE_DEPTH, 1.0,
+    "owl cache", compute_active_owl_area,
+    NULL, 0, -1 };
+
+static struct persistent_cache semeai_cache =
+  { MAX_SEMEAI_CACHE_SIZE, MAX_SEMEAI_CACHE_DEPTH, 0.75,
+    "semeai cache", compute_active_semeai_area,
+    NULL, 0, -1 };
+
+/* ================================================================ */
+/* Common helper functions.                                        */
+
+
+static void
+draw_active_area(Intersection board[BOARDMAX], int apos)
+{
+  int i, j, ii;
+  int c = ' ';
+  int cw = (apos == NO_MOVE) ? 'O' : 'o';
+  int cb = (apos == NO_MOVE) ? 'X' : 'x';
+
+  start_draw_board();
+  
+  for (i = 0; i < board_size; i++) {
+    ii = board_size - i;
+    fprintf(stderr, "\n%2d", ii);
+    
+    for (j = 0; j < board_size; j++) {
+      int pos = POS(i, j);
+      if (board[pos] == EMPTY)
+       c = '.';
+      else if (board[pos] == WHITE)
+       c = cw;
+      else if ((board[pos] & 3) == WHITE)
+       c = 'O';
+      else if (board[pos] == BLACK)
+       c = cb;
+      else if ((board[pos] & 3) == BLACK)
+       c = 'X';
+      if (board[pos] == GRAY)
+       c = '?';
+      
+      if (pos == apos)
+       fprintf(stderr, "[%c", c);
+      else if (j > 0 && POS(i, j-1) == apos)
+       fprintf(stderr, "]%c", c);
+      else
+       fprintf(stderr, " %c", c);
+    }
+    
+    fprintf(stderr, " %d", ii);
+  }
+
+  end_draw_board();
+}
+
+
+/* Returns 1 if the stored board is compatible with the current board,
+ * 0 otherwise.
+ */
+static int
+verify_stored_board(Intersection p[BOARDMAX])
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    else if (p[pos] == GRAY)
+      continue;
+    else if ((p[pos] & 3) != board[pos])
+      return 0;
+    else if (!(p[pos] & (HIGH_LIBERTY_BIT | HIGH_LIBERTY_BIT2)))
+      continue;
+    else if (((p[pos] & HIGH_LIBERTY_BIT) && countlib(pos) <= 4)
+             || (p[pos] & HIGH_LIBERTY_BIT2 && countlib(pos) <= 3))
+      return 0;
+  }
+  
+  return 1;
+}
+
+
+/* Prints out all relevant information for a cache entry, and prints
+ * a board showing the active area.
+ */
+static void
+print_persistent_cache_entry(struct persistent_cache_entry *entry)
+{
+  int r;
+
+  gprintf("%omovenum         = %d\n",  entry->movenum);
+  gprintf("%oscore          = %d\n",  entry->score);
+  gprintf("%ocost           = %d\n",  entry->cost);
+  gprintf("%oroutine         = %s\n",  routine_id_to_string(entry->routine));
+  gprintf("%oapos            = %1m\n", entry->apos);
+  if (entry->bpos != NO_MOVE)
+    gprintf("%obpos          = %1m\n", entry->bpos);
+  if (entry->cpos != NO_MOVE)
+    gprintf("%ocpos            = %1m\n", entry->cpos);
+  gprintf("%oresult          = %s\n",  result_to_string(entry->result));
+  if (entry->result2 != 0)
+    gprintf("%oresult2         = %s\n",  result_to_string(entry->result2));
+  if (entry->result_certain != -1)
+    gprintf("%oresult_certain  = %d\n",  entry->result_certain);
+  if (entry->node_limit != -1)
+    gprintf("%onode_limit      = %d\n",  entry->node_limit);
+  if (entry->move != NO_MOVE)
+    gprintf("%omove            = %1m\n", entry->move);
+  if (entry->move2 != NO_MOVE)
+    gprintf("%omove2           = %1m\n", entry->move2);
+  
+  for (r = 0; r < MAX_CACHE_DEPTH; r++) {
+    if (entry->stack[r] == 0)
+      break;
+    gprintf("%ostack[%d]      = %C %1m\n", r, entry->move_color[r],
+           entry->stack[r]);
+  }
+
+  draw_active_area(entry->board, entry->apos);
+}
+
+/* To keep GCC happy and have the function included in the
+ * gnugo executable. Can be used from gdb.
+ */
+void print_persistent_cache(struct persistent_cache *cache);
+
+
+/* Can be used from gdb. */
+void
+print_persistent_cache(struct persistent_cache *cache)
+{
+  int k;
+  gprintf("Entire content of %s:\n", cache->name);
+  for (k = 0; k < cache->current_size; k++)
+    print_persistent_cache_entry(cache->table + k);
+}
+
+
+/* ================================================================ */
+/* Core functions.                                                 */
+/* ================================================================ */
+
+/* The static functions below implement the core infrastructure of the
+ * persistent caches. Each cache only has to provide a function
+ * computing the active area, and wrappers around the search_.. and store_..
+ * function below.
+ */
+
+/* Remove persistent cache entries which are no longer compatible with
+ * the board. For efficient use of the cache, it's recommended to call
+ * this function once per move, before starting the owl reading. It's
+ * not required for correct operation though. 
+ */
+static void
+purge_persistent_cache(struct persistent_cache *cache)
+{
+  int k;
+  int r;
+  gg_assert(stackp == 0);
+
+  /* Never do this more than once per move. */
+  if (cache->last_purge_position_number == position_number)
+    return;
+  else
+    cache->last_purge_position_number = position_number;
+
+  for (k = 0; k < cache->current_size; k++) {
+    int played_moves = 0;
+    int entry_ok = 1;
+    struct persistent_cache_entry *entry = &(cache->table[k]);
+
+    if (entry->boardsize != board_size)
+      entry_ok = 0;
+    else {
+      for (r = 0; r < MAX_CACHE_DEPTH; r++) {
+       int apos = entry->stack[r];
+       int color = entry->move_color[r];
+       if (apos == 0)
+         break;
+       if (board[apos] == EMPTY
+           && trymove(apos, color, "purge_persistent_cache", 0))
+         played_moves++;
+       else {
+         entry_ok = 0;
+         break;
+       }
+      }
+    }
+
+    if (!entry_ok 
+       || !verify_stored_board(entry->board)) {
+      /* Move the last entry in the cache here and back up the loop
+       * counter to redo the test at this position in the cache.
+       */
+      if (0)
+       gprintf("Purging entry %d from cache.\n", k);
+      if (k < cache->current_size - 1)
+       *entry = cache->table[cache->current_size - 1];
+      k--;
+      cache->current_size--;
+    }
+    else {
+      /* Reduce score here to penalize entries getting old. */
+      entry->score *= cache->age_factor;
+    }
+
+    while (played_moves > 0) {
+      popgo();
+      played_moves--;
+    }
+  }
+}
+
+
+/* Find a cache entry matching the data given in the parameters.
+ * Important: We assume that unused parameters are normalized to NO_MOVE
+ * when storing or retrieving, so that we can ignore them here.
+ */ 
+static struct persistent_cache_entry *
+find_persistent_cache_entry(struct persistent_cache *cache,
+                           enum routine_id routine, int apos, int bpos,
+                           int cpos, int color,
+                           Hash_data *goal_hash, int node_limit)
+{
+  int k;
+  for (k = 0; k < cache->current_size; k++) {
+    struct persistent_cache_entry *entry = cache->table + k;
+    if (entry->routine == routine
+       && entry->apos == apos
+       && entry->bpos == bpos
+       && entry->cpos == cpos
+       && entry->color == color
+        && depth - stackp <= entry->remaining_depth
+        && (entry->node_limit >= node_limit || entry->result_certain)
+        && (goal_hash == NULL
+           || hashdata_is_equal(entry->goal_hash, *goal_hash))
+        && verify_stored_board(entry->board))
+      return entry;
+  }
+  return NULL;
+}
+
+/* Search through a persistent cache. Returns 0 if no matching entry was
+ * found; returns 1 and sets the relevant return values otherwise. See
+ * comment above find_persistent_cache_entry() about unused parameters.
+ */
+static int 
+search_persistent_cache(struct persistent_cache *cache,
+                       enum routine_id routine, int apos, int bpos,
+                       int cpos, int color,
+                       Hash_data *goal_hash, int node_limit, 
+                       int *result, int *result2, int *move, int *move2,
+                       int *certain)
+{
+  /* Try to find entry. */
+  struct persistent_cache_entry *entry;
+  entry = find_persistent_cache_entry(cache, routine, apos, bpos, cpos, color,
+                                     goal_hash, node_limit);
+  if (entry == NULL)
+    return 0;
+
+  /* Set return values. */
+  *result = entry->result;
+  if (result2)
+    *result2 = entry->result2;
+  if (move)
+    *move = entry->move;
+  if (move2)
+    *move2 = entry->move2;
+  if (certain)
+    *certain = entry->result_certain;
+
+  /* Increase score for entry. */
+  entry->score += entry->cost;
+
+  if (debug & DEBUG_PERSISTENT_CACHE) {
+    gprintf("%oRetrieved position from %s:\n", cache->name);
+    print_persistent_cache_entry(entry);
+  }
+  /* FIXME: This is an ugly hack. */
+  if (strcmp(cache->name, "reading cache") == 0
+      && (debug & DEBUG_READING_PERFORMANCE)
+      && entry->cost >= MIN_READING_NODES_TO_REPORT) {
+    if (entry->result != 0)
+      gprintf("%o%s %1m = %d %1m, cached (%d nodes) ",
+              routine == ATTACK ? "attack" : "defend",
+              apos, entry->result, entry->move, entry->cost);
+    else
+      gprintf("%o%s %1m = %d, cached (%d nodes) ",
+              routine == ATTACK ? "attack" : "defend",
+              apos, entry->result, entry->cost);
+    dump_stack();
+  }
+  return 1;
+}
+
+/* Generic function that tries to store a cache entry. If the cache
+ * is full, we delete the lowest scoring entry.
+ *
+ * Unused parameters have to be normalized to NO_MOVE by the calling
+ * function.
+ */
+static void
+store_persistent_cache(struct persistent_cache *cache,
+                      enum routine_id routine,
+                      int apos, int bpos, int cpos, int color,
+                      Hash_data *goal_hash,
+                      int result, int result2, int move, int move2,
+                      int certain, int node_limit,
+                      int cost, const signed char goal[BOARDMAX],
+                      int goal_color)
+{
+  int r;
+  struct persistent_cache_entry *entry;
+  if (stackp > cache->max_stackp)
+    return;
+
+  /* If cache is still full, consider kicking out an old entry. */
+  if (cache->current_size == cache->max_size) {
+    int worst_entry = -1;
+    int worst_score = cost;
+    int k;
+
+    for (k = 0; k < cache->current_size; k++) {
+      if (cache->table[k].score < worst_score) {
+       worst_score = cache->table[k].score;
+       worst_entry = k;
+      }
+    }
+
+    if (worst_entry != -1) {
+      /* Move the last entry in the cache here to make space.
+       */
+      if (worst_entry < cache->current_size - 1)
+       cache->table[worst_entry] = cache->table[cache->current_size - 1];
+      cache->current_size--;
+    }
+    else
+      return;
+  }
+
+  entry = &(cache->table[cache->current_size]);
+  entry->boardsize      = board_size;
+  entry->routine        = routine;
+  entry->apos           = apos;
+  entry->bpos           = bpos;
+  entry->cpos           = cpos;
+  entry->color          = color;
+  if (goal_hash)
+    entry->goal_hash    = *goal_hash;
+  entry->result         = result;
+  entry->result2        = result2;
+  entry->result_certain  = certain;
+  entry->node_limit      = node_limit;
+  entry->remaining_depth = depth - stackp;
+  entry->move           = move;
+  entry->move2          = move2;
+  entry->score                  = cost;
+  entry->cost           = cost;
+  entry->movenum        = movenum;
+
+  for (r = 0; r < MAX_CACHE_DEPTH; r++) {
+    if (r < stackp)
+      get_move_from_stack(r, &(entry->stack[r]), &(entry->move_color[r]));
+    else {
+      entry->stack[r] = 0;
+      entry->move_color[r] = EMPTY;
+    }
+  }
+  
+  /* Remains to set the board. */
+  cache->compute_active_area(&(cache->table[cache->current_size]),
+                            goal, goal_color);
+  cache->current_size++;
+
+  if (debug & DEBUG_PERSISTENT_CACHE) {
+    gprintf("%oEntered position in %s:\n", cache->name);
+    print_persistent_cache_entry(entry);
+    gprintf("%oCurrent size: %d\n", cache->current_size);
+  }
+}
+
+
+/* ================================================================ */
+/* Interface functions relevant to all caches.                     */
+/* ================================================================ */
+
+/* Allocate the actual cache table. */
+static void
+init_cache(struct persistent_cache *cache)
+{
+  cache->table = malloc(cache->max_size*sizeof(struct persistent_cache_entry));
+  gg_assert(cache->table);
+}
+
+/* Initializes all persistent caches.
+ * Needs to be called only once at startup.
+ */
+void
+persistent_cache_init()
+{
+  init_cache(&reading_cache);
+  init_cache(&breakin_cache);
+  init_cache(&connection_cache);
+  init_cache(&owl_cache);
+  init_cache(&semeai_cache);
+}
+
+
+/* Discards all persistent cache entries. */
+void
+clear_persistent_caches()
+{
+  reading_cache.current_size = 0;
+  connection_cache.current_size = 0;
+  breakin_cache.current_size = 0;
+  owl_cache.current_size = 0;
+  semeai_cache.current_size = 0;
+}
+
+/* Discards all persistent cache entries that are no longer useful. 
+ * Should be called once per move for optimal performance (but is not 
+ * necessary for proper operation).
+ */
+void
+purge_persistent_caches()
+{
+  purge_persistent_cache(&reading_cache);
+  purge_persistent_cache(&connection_cache);
+  purge_persistent_cache(&breakin_cache);
+  purge_persistent_cache(&owl_cache);
+  purge_persistent_cache(&semeai_cache);
+}
+
+/* ================================================================ */
+/*                  Tactical reading functions                      */
+/* ================================================================ */
+
+/* Look for a valid read result in the persistent cache.
+ * Return 1 if found, 0 otherwise.
+ */
+int
+search_persistent_reading_cache(enum routine_id routine, int str,
+                               int *result, int *move)
+{
+  return search_persistent_cache(&reading_cache,
+                                routine, str, NO_MOVE, NO_MOVE, EMPTY, NULL,
+                                -1, result, NULL, move, NULL, NULL);
+}
+
+
+/* Store a new read result in the persistent cache. */
+void
+store_persistent_reading_cache(enum routine_id routine, int str,
+                              int result, int move, int nodes)
+{
+  store_persistent_cache(&reading_cache, routine,
+                        str, NO_MOVE, NO_MOVE, EMPTY, NULL,
+                        result, NO_MOVE, move, NO_MOVE, -1, -1,
+                        nodes, shadow, EMPTY);
+}
+
+static void
+compute_active_reading_area(struct persistent_cache_entry *entry,
+                           const signed char goal[BOARDMAX], int dummy)
+{
+  signed char active[BOARDMAX];
+  int pos, r;
+  UNUSED(dummy);
+
+  /* Remains to set the board. We let the active area be the contested
+   * string and reading shadow + adjacent empty and strings +
+   * neighbors of active area so far + one more expansion from empty
+   * to empty.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    active[pos] = goal[pos];
+
+  mark_string(entry->apos, active, 1);
+
+  /* To be safe, also add the successful move. */
+  if (entry->result != 0 && entry->move != 0)
+    active[entry->move] = 1;
+
+  /* Add adjacent strings and empty. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (active[pos] != 0) 
+      continue;
+    if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == 1)
+       || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == 1)
+       || (ON_BOARD(NORTH(pos)) && active[NORTH(pos)] == 1)
+       || (ON_BOARD(EAST(pos)) && active[EAST(pos)] == 1)) {
+      if (IS_STONE(board[pos]))
+       mark_string(pos, active, 2);
+      else
+       active[pos] = 2;
+    }
+  }
+
+  /* Remove invincible strings. No point adding their liberties and
+   * neighbors.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (IS_STONE(board[pos]) && worm[pos].invincible)
+      active[pos] = 0;
+  }
+  
+  /* Expand empty to empty. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos]) || active[pos] != 0) 
+      continue;
+    if ((board[SOUTH(pos)] == EMPTY && active[SOUTH(pos)] == 2)
+       || (board[WEST(pos)] == EMPTY && active[WEST(pos)] == 2)
+       || (board[NORTH(pos)] == EMPTY && active[NORTH(pos)] == 2)
+       || (board[EAST(pos)] == EMPTY && active[EAST(pos)] == 2))
+      active[pos] = 3;
+  }
+  
+  /* Add neighbors of active area so far. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (active[pos] != 0) 
+      continue;
+    if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] > 0
+        && active[SOUTH(pos)] < 4)
+       || (ON_BOARD(WEST(pos)) && active[WEST(pos)] > 0
+           && active[WEST(pos)] < 4)
+       || (ON_BOARD(NORTH(pos)) && active[NORTH(pos)] > 0
+           && active[NORTH(pos)] < 4)
+       || (ON_BOARD(EAST(pos)) && active[EAST(pos)] > 0
+           && active[EAST(pos)] < 4))
+      active[pos] = 4;
+  }
+
+  /* Also add the previously played stones to the active area. */
+  for (r = 0; r < stackp; r++)
+    active[entry->stack[r]] = 5;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    entry->board[pos] = 
+      active[pos] != 0 ? board[pos] : GRAY;
+  }
+}
+
+
+/* Helper for the reading_hotspots() function below. */
+static void
+mark_string_hotspot_values(float values[BOARDMAX],
+                          int m, int n, float contribution)
+{
+  int i, j, k;
+  
+  /* If p[m][n] is EMPTY, we just give the contribution to close empty
+   * vertices. This is a rough simplification.
+   */
+  if (BOARD(m, n) == EMPTY) {
+    for (i = -1; i <= 1; i++)
+      for (j = -1; j <= 1; j++)
+       if (BOARD(m+i, n+j) == EMPTY)
+         values[POS(m+i, n+j)] += contribution;
+    return;
+  }
+  
+  /* Otherwise we give contribution to liberties and diagonal
+   * neighbors of the string at (m, n).
+   */
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++) {
+      if (BOARD(i, j) != EMPTY)
+       continue;
+      for (k = 0; k < 8; k++) {
+       int di = deltai[k];
+       int dj = deltaj[k];
+       if (IS_STONE(BOARD(i+di, j+dj))
+           && same_string(POS(i+di, j+dj), POS(m, n))) {
+         if (k < 4) {
+           values[POS(i, j)] += contribution;
+           break;
+         }
+         else {
+           if (BOARD(i+di, j) == EMPTY || countlib(POS(i+di, j)) <= 2
+               || BOARD(i, j+dj) == EMPTY || countlib(POS(i, j+dj)) <= 2)
+             values[POS(i, j)] += contribution;
+           break;
+         }
+       }
+      }
+    }
+}
+  
+
+/* Based on the entries in the reading cache and their nodes field,
+ * compute where the relatively most expensive tactical reading is
+ * going on.
+ */
+void
+reading_hotspots(float values[BOARDMAX])
+{
+  int pos;
+  int k;
+  int sum_nodes = 0;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    values[pos] = 0.0;
+  
+  /* Compute the total number of nodes for the cached entries. */
+  for (k = 0; k < reading_cache.current_size; k++)
+    sum_nodes += reading_cache.table[k].cost;
+
+  if (sum_nodes <= 100)
+    return;
+
+  /* Loop over all entries and increase the value of vertices adjacent
+   * to dragons involving expensive tactical reading.
+   */
+  for (k = 0; k < reading_cache.current_size; k++) {
+    struct persistent_cache_entry *entry = &(reading_cache.table[k]);
+    float contribution = entry->cost / (float) sum_nodes;
+    if (0) {
+      gprintf("Reading hotspots: %d %1m %f\n", entry->routine, entry->apos,
+             contribution);
+    }
+    switch (entry->routine) {
+    case ATTACK:
+    case FIND_DEFENSE:
+      mark_string_hotspot_values(values, I(entry->apos), J(entry->apos),
+                                contribution);
+      break;
+    default:
+      gg_assert(0); /* Shouldn't happen. */
+      break;
+    }
+  }
+}
+
+
+/* ================================================================ */
+/*                  Connection reading functions                    */
+/* ================================================================ */
+
+/* Look for a valid read result in the persistent connection cache.
+ * Return 1 if found, 0 otherwise.
+ */
+int
+search_persistent_connection_cache(enum routine_id routine, int str1,
+                                  int str2, int *result, int *move)
+{
+  return search_persistent_cache(&connection_cache, routine,
+                                str1, str2, NO_MOVE, EMPTY, NULL,
+                                connection_node_limit,
+                                result, NULL, move, NULL, NULL);
+}
+
+/* Store a new connection result in the persistent cache. */
+void
+store_persistent_connection_cache(enum routine_id routine,
+                                 int str1, int str2,
+                                 int result, int move, int tactical_nodes,
+                                 signed char connection_shadow[BOARDMAX])
+{
+  store_persistent_cache(&connection_cache, routine,
+                        str1, str2, NO_MOVE, EMPTY, NULL,
+                        result, NO_MOVE, move, NO_MOVE, -1,
+                        connection_node_limit,
+                        tactical_nodes, connection_shadow, EMPTY);
+}
+
+/* Computes the active area for the current board position and the
+ * connection read result that has just been stored in *entry.
+ */
+static void
+compute_active_connection_area(struct persistent_cache_entry *entry,
+                              const signed char connection_shadow[BOARDMAX],
+                              int dummy)
+{
+  int pos;
+  int k, r;
+  signed char active[BOARDMAX];
+  int other = OTHER_COLOR(board[entry->apos]);
+  UNUSED(dummy);
+
+  /* Remains to set the board. We let the active area be
+   * the two strings to connect +
+   * the connection shadow +
+   * distance two expansion through empty intersections and own stones +
+   * adjacent opponent strings +
+   * liberties and neighbors of adjacent opponent strings with less than
+   * five liberties +
+   * liberties and neighbors of low liberty neighbors of adjacent opponent
+   * strings with less than five liberties.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    active[pos] = connection_shadow[pos];
+
+  mark_string(entry->apos, active, 1);
+  mark_string(entry->bpos, active, 1);
+
+  /* To be safe, also add the successful move. */
+  if (entry->result != 0 && entry->move != 0)
+    active[entry->move] = 1;
+
+  /* Distance two expansion through empty intersections and own stones. */
+  for (k = 1; k < 3; k++) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || board[pos] == other || active[pos] != 0) 
+       continue;
+      if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == k)
+         || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == k)
+         || (ON_BOARD(NORTH(pos)) && active[NORTH(pos)] == k)
+         || (ON_BOARD(EAST(pos)) && active[EAST(pos)] == k)) {
+       if (board[pos] == EMPTY)
+         active[pos] = k + 1;
+       else
+         mark_string(pos, active, (signed char) (k + 1));
+      }
+    }
+  }
+  
+  /* Adjacent opponent strings. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != other || active[pos] != 0) 
+      continue;
+    for (r = 0; r < 4; r++) {
+      int pos2 = pos + delta[r];
+      if (ON_BOARD(pos2) && board[pos2] != other && active[pos2] != 0) {
+       mark_string(pos, active, 1);
+       break;
+      }
+    }
+  }
+  
+  /* Liberties of adjacent opponent strings with less than five liberties +
+   * liberties of low liberty neighbors of adjacent opponent strings
+   * with less than five liberties.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == other && active[pos] > 0 && countlib(pos) < 5) {
+      int libs[4];
+      int liberties = findlib(pos, 4, libs);
+      int adjs[MAXCHAIN];
+      int adj;
+      for (r = 0; r < liberties; r++)
+       active[libs[r]] = 1;
+      
+      /* Also add liberties of neighbor strings if these are three
+       * or less.
+       */
+      adj = chainlinks(pos, adjs);
+      for (r = 0; r < adj; r++) {
+       mark_string(adjs[r], active, -1);
+       if (countlib(adjs[r]) <= 3) {
+         int s;
+         int adjs2[MAXCHAIN];
+         int adj2;
+         liberties = findlib(adjs[r], 3, libs);
+         for (s = 0; s < liberties; s++)
+           active[libs[s]] = 1;
+         adj2 = chainlinks(pos, adjs2);
+         for (s = 0; s < adj2; s++)
+           mark_string(adjs2[s], active, -1);
+       }
+      }
+    }
+  }
+  
+  /* Also add the previously played stones to the active area. */
+  for (r = 0; r < stackp; r++)
+    active[entry->stack[r]] = 1;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int value = board[pos];
+    if (!ON_BOARD(pos))
+      continue;
+    if (!active[pos])
+      value = GRAY;
+    else if (IS_STONE(board[pos]) && countlib(pos) > 4 && active[pos] > 0)
+      value |= HIGH_LIBERTY_BIT;
+    
+    entry->board[pos] = value;
+  }
+
+}
+
+
+/* ================================================================ */
+/*                   Break-in reading functions                     */
+/* ================================================================ */
+
+/* Look for a valid read result in the persistent breakin cache.
+ * Return 1 if found, 0 otherwise.
+ */
+int
+search_persistent_breakin_cache(enum routine_id routine,
+                               int str, Hash_data *goal_hash,
+                               int node_limit, int *result, int *move)
+{
+  return search_persistent_cache(&breakin_cache, routine,
+                                str, NO_MOVE, NO_MOVE, EMPTY, goal_hash, 
+                                node_limit, result, NULL, move, NULL, NULL);
+}
+                         
+/* Store a new breakin result in the persistent cache. */
+void
+store_persistent_breakin_cache(enum routine_id routine,
+                              int str, Hash_data *goal_hash,
+                              int result, int move, int tactical_nodes,
+                              int breakin_node_limit,
+                              signed char breakin_shadow[BOARDMAX])
+{
+  store_persistent_cache(&breakin_cache, routine,
+                        str, NO_MOVE, NO_MOVE, EMPTY, goal_hash,
+                        result, NO_MOVE, move, NO_MOVE, -1, breakin_node_limit,
+                        tactical_nodes, breakin_shadow, EMPTY);
+}
+  
+
+/* Computes the active area for the current board position and the
+ * read result that has just been stored in *entry.
+ */
+static void
+compute_active_breakin_area(struct persistent_cache_entry *entry,
+                           const signed char breakin_shadow[BOARDMAX],
+                           int dummy)
+{
+  int pos;
+  int k, r;
+  signed char active[BOARDMAX];
+  int other = OTHER_COLOR(board[entry->apos]);
+  UNUSED(dummy);
+
+  /* We let the active area be
+   * the string to connect +
+   * the breakin shadow (which contains the goal) +
+   * distance two expansion through empty intersections and own stones +
+   * adjacent opponent strings +
+   * liberties and neighbors of adjacent opponent strings with less than
+   * five liberties +
+   * liberties and neighbors of low liberty neighbors of adjacent opponent
+   * strings with less than five liberties.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    active[pos] = breakin_shadow[pos];
+
+  mark_string(entry->apos, active, 1);
+
+  /* To be safe, also add the successful move. */
+  if (entry->result != 0 && entry->move != 0)
+    active[entry->move] = 1;
+
+  /* Distance two expansion through empty intersections and own stones. */
+  for (k = 1; k < 3; k++) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || board[pos] == other || active[pos] != 0) 
+       continue;
+      if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == k)
+         || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == k)
+         || (ON_BOARD(NORTH(pos)) && active[NORTH(pos)] == k)
+         || (ON_BOARD(EAST(pos)) && active[EAST(pos)] == k)) {
+       if (board[pos] == EMPTY)
+         active[pos] = k + 1;
+       else
+         mark_string(pos, active, (signed char) (k + 1));
+      }
+    }
+  }
+  
+  /* Adjacent opponent strings. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != other || active[pos] != 0) 
+      continue;
+    for (r = 0; r < 4; r++) {
+      int pos2 = pos + delta[r];
+      if (ON_BOARD(pos2)
+         && board[pos2] != other
+         && active[pos2] && active[pos2] <= 2) {
+       mark_string(pos, active, 1);
+       break;
+      }
+    }
+  }
+  
+  /* Liberties of adjacent opponent strings with less than four liberties +
+   * liberties of low liberty neighbors of adjacent opponent strings
+   * with less than five liberties.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == other && active[pos] > 0 && countlib(pos) < 4) {
+      int libs[4];
+      int liberties = findlib(pos, 3, libs);
+      int adjs[MAXCHAIN];
+      int adj;
+      for (r = 0; r < liberties; r++)
+       active[libs[r]] = 1;
+      
+      /* Also add liberties of neighbor strings if these are three
+       * or less.
+       */
+      adj = chainlinks(pos, adjs);
+      for (r = 0; r < adj; r++) {
+       mark_string(adjs[r], active, -1);
+       if (countlib(adjs[r]) <= 3) {
+         int s;
+         int adjs2[MAXCHAIN];
+         int adj2;
+         liberties = findlib(adjs[r], 3, libs);
+         for (s = 0; s < liberties; s++)
+           active[libs[s]] = 1;
+         adj2 = chainlinks(pos, adjs2);
+         for (s = 0; s < adj2; s++)
+           mark_string(adjs2[s], active, -1);
+       }
+      }
+    }
+  }
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    Intersection value = board[pos];
+    if (!ON_BOARD(pos))
+      continue;
+    if (!active[pos])
+      value = GRAY;
+    else if (IS_STONE(board[pos]) && countlib(pos) > 3 && active[pos] > 0)
+      value |= HIGH_LIBERTY_BIT2;
+    
+    entry->board[pos] = value;
+  }
+}
+
+
+/* ================================================================ */
+/*                    Owl reading functions                         */
+/* ================================================================ */
+int
+search_persistent_owl_cache(enum routine_id routine,
+                           int apos, int bpos, int cpos,
+                           int *result, int *move, int *move2, int *certain)
+{
+  return search_persistent_cache(&owl_cache,
+                                routine, apos, bpos, cpos, EMPTY, NULL,
+                                owl_node_limit,
+                                result, NULL, move, move2, certain);
+}
+  
+
+void
+store_persistent_owl_cache(enum routine_id routine,
+                          int apos, int bpos, int cpos,
+                          int result, int move, int move2, int certain,
+                          int tactical_nodes,
+                          signed char goal[BOARDMAX], int goal_color)
+{
+  store_persistent_cache(&owl_cache, routine, apos, bpos, cpos, EMPTY, NULL,
+                        result, NO_MOVE, move, move2, certain, owl_node_limit,
+                        tactical_nodes, goal, goal_color);
+}
+
+
+/* This function is used by owl and semai active area computation. We assume
+ * that (goal) marks a dragon of color (goal_color), i.e. all intersections
+ * in the goal that are not a stone of this color are ignored. The calling
+ * functions must have zeroed the active area, and is allowed to preset
+ * some intersection to be active.
+ */
+static void
+compute_active_owl_type_area(const signed char goal[BOARDMAX], int goal_color,
+                            signed char active[BOARDMAX])
+{
+  int k, r;
+  int pos;
+  int other = OTHER_COLOR(goal_color);
+
+  /* We let the active area be the goal +
+   * distance four expansion through empty intersections and own stones +
+   * adjacent opponent strings +
+   * liberties and neighbors of adjacent opponent strings with less than
+   * five liberties +
+   * liberties and neighbors of low liberty neighbors of adjacent opponent
+   * strings with less than five liberties.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && goal[pos])
+      active[pos] = 1;
+
+  /* Distance four expansion through empty intersections and own stones. */
+  for (k = 1; k < 5; k++) {
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || board[pos] == other || active[pos] > 0) 
+       continue;
+      if ((ON_BOARD(SOUTH(pos)) && active[SOUTH(pos)] == k)
+         || (ON_BOARD(WEST(pos)) && active[WEST(pos)] == k)
+         || (ON_BOARD(NORTH(pos)) && active[NORTH(pos)] == k)
+         || (ON_BOARD(EAST(pos)) && active[EAST(pos)] == k)) {
+       if (board[pos] == EMPTY)
+         active[pos] = k + 1;
+       else
+         mark_string(pos, active, (signed char) (k + 1));
+      }
+    }
+  }
+  
+  /* Adjacent opponent strings. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != other || active[pos] != 0) 
+      continue;
+    for (r = 0; r < 4; r++) {
+      int pos2 = pos + delta[r];
+      if (ON_BOARD(pos2) && board[pos2] != other && active[pos2] != 0) {
+       mark_string(pos, active, 1);
+       break;
+      }
+    }
+  }
+  
+  /* Liberties of adjacent opponent strings with less than five liberties +
+   * liberties of low liberty neighbors of adjacent opponent strings
+   * with less than five liberties.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == other && active[pos] > 0 && countlib(pos) < 5) {
+      int libs[4];
+      int liberties = findlib(pos, 4, libs);
+      int adjs[MAXCHAIN];
+      int adj;
+      for (r = 0; r < liberties; r++)
+       active[libs[r]] = 1;
+      
+      /* Also add liberties of neighbor strings if these are three
+       * or less.
+       */
+      adj = chainlinks(pos, adjs);
+      for (r = 0; r < adj; r++) {
+       mark_string(adjs[r], active, -1);
+       if (countlib(adjs[r]) <= 3) {
+         int s;
+         int adjs2[MAXCHAIN];
+         int adj2;
+         liberties = findlib(adjs[r], 3, libs);
+         for (s = 0; s < liberties; s++)
+           active[libs[s]] = 1;
+         adj2 = chainlinks(pos, adjs2);
+         for (s = 0; s < adj2; s++)
+           mark_string(adjs2[s], active, -1);
+       }
+      }
+    }
+  }
+}
+
+static void
+compute_active_owl_area(struct persistent_cache_entry *entry,
+                       const signed char goal[BOARDMAX], int goal_color)
+{
+  int pos;
+  signed char active[BOARDMAX];
+  memset(active, 0, BOARDMAX);
+
+  /* Add critical moves to the active area. */
+  if (ON_BOARD1(entry->move))
+    active[entry->move] = 1;
+
+  if (ON_BOARD1(entry->move2))
+    active[entry->move2] = 1;
+
+  compute_active_owl_type_area(goal, goal_color, active);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int value = board[pos];
+    if (!ON_BOARD(pos))
+      continue;
+    if (!active[pos])
+      value = GRAY;
+    else if (IS_STONE(board[pos]) && countlib(pos) > 4 && active[pos] > 0)
+      value |= HIGH_LIBERTY_BIT;
+    
+    entry->board[pos] = value;
+  }
+}
+
+
+/* ================================================================ */
+/*                    Semeai reading functions                      */
+/* ================================================================ */
+
+/* Look for stored result in semeai cache. Returns 1 if result found, 0
+ * otherwise.
+ */
+int
+search_persistent_semeai_cache(enum routine_id routine,
+                              int apos, int bpos, int cpos, int color,
+                              Hash_data *goal_hash,
+                              int *resulta, int *resultb,
+                              int *move, int *certain)
+{
+  return search_persistent_cache(&semeai_cache, routine, apos, bpos, cpos,
+                                color, goal_hash, semeai_node_limit,
+                                resulta, resultb, move, NULL, certain);
+}
+
+
+/* Store a new read result in the persistent semeai cache. */
+void
+store_persistent_semeai_cache(enum routine_id routine,
+                             int apos, int bpos, int cpos, int color,
+                             Hash_data *goal_hash,
+                             int resulta, int resultb, int move, int certain,
+                             int tactical_nodes,
+                             signed char goala[BOARDMAX],
+                             signed char goalb[BOARDMAX])
+{
+  signed char goal[BOARDMAX];
+  int pos;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      goal[pos] = goala[pos] || goalb[pos];
+
+  store_persistent_cache(&semeai_cache, routine,
+                        apos, bpos, cpos, color, goal_hash,
+                        resulta, resultb, move, NO_MOVE,
+                        certain, semeai_node_limit,
+                        tactical_nodes, goal, EMPTY);
+}
+
+
+static void
+compute_active_semeai_area(struct persistent_cache_entry *entry,
+                          const signed char goal[BOARDMAX], int dummy)
+{
+  int pos;
+  signed char active_b[BOARDMAX];
+  signed char active_w[BOARDMAX];
+  UNUSED(dummy);
+  memset(active_b, 0, BOARDMAX);
+  memset(active_w, 0, BOARDMAX);
+
+  /* Add critical move to the active area. */
+  if (ON_BOARD1(entry->move)) {
+    active_b[entry->move] = 1;
+    active_w[entry->move] = 1;
+  }
+  if (ON_BOARD1(entry->cpos)) {
+    active_b[entry->cpos] = 1;
+    active_w[entry->cpos] = 1;
+  }
+
+  compute_active_owl_type_area(goal, BLACK, active_b);
+  compute_active_owl_type_area(goal, WHITE, active_w);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int value = board[pos];
+    if (!ON_BOARD(pos))
+      continue;
+    if (!active_b[pos] && !active_w[pos])
+      value = GRAY;
+    else if (IS_STONE(board[pos]) && countlib(pos) > 4
+            && (active_b[pos] > 0 || active_w[pos] > 0))
+      value |= HIGH_LIBERTY_BIT;
+    
+    entry->board[pos] = value;
+  }
+}
+
+
+
+/* Helper for the owl_hotspots() function below. */
+static void
+mark_dragon_hotspot_values(float values[BOARDMAX], int dr,
+                          float contribution,
+                          Intersection active_board[BOARDMAX])
+{
+  int pos;
+  int k;
+  if (!IS_STONE(board[dr]))
+    return;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != EMPTY)
+      continue;
+    for (k = 0; k < 8; k++) {
+      int pos2 = pos + delta[k];
+      if (IS_STONE(board[pos2])
+         && (is_same_dragon(pos2, dr)
+             || (are_neighbor_dragons(pos2, dr)
+                 && board[pos2] == board[dr]))
+         && (countlib(pos2) <= 4
+             || is_edge_vertex(pos))) {
+       if (k < 4) {
+         if (is_same_dragon(pos2, dr))
+           values[pos] += contribution;
+         else
+           values[pos] += 0.5 * contribution;
+         break;
+       }
+       else {
+         /* If pos2 = SOUTHWEST(pos), this construction makes
+          *    pos3 = SOUTH(pos) and
+          *    pos4 = WEST(pos)
+          * and corresponding for all other diagonal movements.
+          */
+         int pos3 = pos + delta[k % 4];
+         int pos4 = pos + delta[(k+1) % 4];
+         if (board[pos3] == EMPTY || countlib(pos3) <= 2
+             || board[pos4] == EMPTY || countlib(pos4) <= 2)
+           values[pos] += 0.5 * contribution;
+         break;
+       }
+      }
+    }
+    /* If not close to the dragon, but within the active area, give
+     * negative hotspot contribution.
+     */
+    if (k == 8 && active_board[pos] == EMPTY) {
+      values[pos] -= 0.5 * contribution;
+    }
+  }
+}
+  
+
+/* Based on the entries in the owl cache and their tactical_nodes
+ * field, compute where the relatively most expensive owl reading is
+ * going on.
+ */
+void
+owl_hotspots(float values[BOARDMAX])
+{
+  int pos;
+  int k, r;
+  int libs[MAXLIBS];
+  int liberties;
+  int sum_tactical_nodes = 0;
+
+  /* Don't bother checking out of board. Set values[] to zero there too. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    values[pos] = 0.0;
+  
+  /* Compute the total number of tactical nodes for the cached entries. */
+  for (k = 0; k < owl_cache.current_size; k++)
+    sum_tactical_nodes += owl_cache.table[k].score;
+
+  if (sum_tactical_nodes <= 100)
+    return;
+
+  /* Loop over all entries and increase the value of vertices adjacent
+   * to dragons involving expensive owl reading.
+   */
+  for (k = 0; k < owl_cache.current_size; k++) {
+    struct persistent_cache_entry *entry = &(owl_cache.table[k]);
+    float contribution = entry->score / (float) sum_tactical_nodes;
+    if (debug & DEBUG_PERSISTENT_CACHE) {
+      gprintf("Owl hotspots: %d %1m %f\n", entry->routine, entry->apos,
+             contribution);
+    }
+    switch (entry->routine) {
+    case OWL_ATTACK:
+    case OWL_THREATEN_ATTACK:
+    case OWL_DEFEND:
+    case OWL_THREATEN_DEFENSE:
+      mark_dragon_hotspot_values(values, entry->apos,
+                                contribution, entry->board);
+      break;
+    case OWL_DOES_DEFEND:
+    case OWL_DOES_ATTACK:
+    case OWL_CONFIRM_SAFETY:
+      mark_dragon_hotspot_values(values, entry->bpos,
+                                contribution, entry->board);
+      break;
+    case OWL_CONNECTION_DEFENDS:
+      mark_dragon_hotspot_values(values, entry->bpos,
+                                contribution, entry->board);
+      mark_dragon_hotspot_values(values, entry->cpos,
+                                contribution, entry->board);
+      break;
+    case OWL_SUBSTANTIAL:
+      /* Only consider the liberties of (apos). */
+      if (!IS_STONE(board[entry->apos]))
+       continue;
+      liberties = findlib(entry->apos, MAXLIBS, libs);
+      for (r = 0; r < liberties; r++)
+       values[libs[r]] += contribution;
+      break;
+    default:
+      gg_assert(0); /* Shouldn't happen. */
+      break;
+    }
+  }
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/printutils.c b/engine/printutils.c
new file mode 100644 (file)
index 0000000..d72f189
--- /dev/null
@@ -0,0 +1,539 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "board.h"
+#include "hash.h"
+#include "gg_utils.h"
+#include "sgftree.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+/*
+ * This function underpins all the TRACE and DEBUG stuff.
+ * It accepts %c, %d, %f, %s, and %x as usual. But it
+ * also accepts %m, which takes TWO integers and writes a move.
+ * Other accepted formats are
+ * %H: Print a hashvalue.
+ * %C: Print a color as a string.
+ * Nasty bodge: %o at the start means outdent, i.e. cancel indent.
+ */
+
+void 
+vgprintf(FILE *outputfile, const char *fmt, va_list ap)
+{
+  if (fmt[0] == '%' && fmt[1] == 'o')
+    fmt += 2;  /* cancel indent */
+  else if (stackp > 0)
+    fprintf(outputfile, "%.*s", stackp*2, "                                ");
+
+  for (; *fmt; ++fmt) {
+    if (*fmt == '%') {
+      switch (*++fmt) {
+      case 'c':
+      {
+       /* rules of promotion => passed as int, not char */
+       int c = va_arg(ap, int);
+       putc(c, outputfile);
+       break;
+      }
+      case 'd':
+      {
+       int d = va_arg(ap, int);
+       fprintf(outputfile, "%d", d);
+       break;
+      }
+      case 'x':
+      {
+       unsigned int d = va_arg(ap, unsigned int);
+       fprintf(outputfile, "%x", d);
+       break;
+      }
+      case 'f':
+      {
+       double f = va_arg(ap, double); /* passed as double, not float */
+       fprintf(outputfile, "%.2f", f);
+       break;
+      }
+      case 's':
+      {
+       char *s = va_arg(ap, char *);
+       fputs(s, outputfile);
+       break;
+      }
+      case '2':
+        fmt++;
+        if (*fmt != 'm' && *fmt != 'M') {
+         fprintf(outputfile, "\n\nUnknown format string '2%c'\n", *fmt);
+         break;
+        }
+        /* else fall through - 2 modifier on %m is default. */
+      case 'm':
+      case 'M':
+      {
+       char movename[4];
+       int m = va_arg(ap, int);
+       int n = va_arg(ap, int);
+       if (m == -1 && n == -1)
+         fputs("PASS", outputfile);
+       else if (!ON_BOARD2(m, n))
+         fprintf(outputfile, "[%d,%d]", m, n);
+       else {
+         /* Generate the move name. */
+         if (n < 8)
+           movename[0] = n + 65;
+         else
+           movename[0] = n + 66;
+         if (*fmt == 'm')
+           sprintf(movename+1, "%d", board_size - m);
+         else
+           sprintf(movename+1, "%-2d", board_size - m);
+         fputs(movename, outputfile);
+       }
+       break;
+      }
+      case '1':
+      fmt++;
+      if (*fmt != 'm' && *fmt != 'M') {
+       fprintf(outputfile, "\n\nUnknown format string '1%c'\n", *fmt);
+       break;
+      }
+      else {
+       char movename[4];
+       int pos = va_arg(ap, int);
+       int m = I(pos);
+       int n = J(pos);
+       if (pos == NO_MOVE)
+         fputs("PASS", outputfile);
+       else if (!ON_BOARD1(pos))
+         fprintf(outputfile, "[%d]", pos);
+       else {
+         /* Generate the move name. */
+         if (n < 8)
+           movename[0] = n + 65;
+         else
+           movename[0] = n + 66;
+         if (*fmt == 'm')
+           sprintf(movename + 1, "%d", board_size - m);
+         else
+           sprintf(movename + 1, "%-2d", board_size - m);
+         fputs(movename, outputfile);
+       }
+       break;
+      }
+      case 'H':
+      {
+       unsigned long h = va_arg(ap, unsigned long);
+       fprintf(outputfile, "%lx", h);
+       break;
+      }
+      case 'C':
+      {
+       int color = va_arg(ap, int);
+       fputs(color_to_string(color), outputfile);
+       break;
+      }
+      default:
+       fprintf(outputfile, "\n\nUnknown format character '%c'\n", *fmt);
+       break;
+      }
+    }
+    else
+      putc(*fmt, outputfile);
+  }
+}
+
+
+/*
+ * required wrapper around vgprintf, writes to outfile.
+ */
+
+void 
+gfprintf(FILE *outfile, const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  vgprintf(outfile, fmt, ap);
+  va_end(ap);
+}
+
+
+/*
+ * required wrapper around vgprintf, writes to stderr.
+ * Always returns 1 to allow use in short-circuit logical expressions.
+ */
+
+int 
+gprintf(const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  vgprintf(stderr, fmt, ap);
+  va_end(ap);
+  return 1;
+}
+
+
+/*
+ * required wrapper around vgprintf, in contrast to gprintf this one
+ * writes to stdout.
+ */
+
+void
+mprintf(const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  vgprintf(stdout, fmt, ap);
+  va_end(ap);
+}
+
+/* This writes the move history information in sgf format to stderr.
+ * This is only intended as a stand-alone debug tool for use in
+ * abortgo(). Anywhere else you should use the normal sgf library.
+ */
+static void
+dump_board_sgf(void)
+{
+  int pos;
+  int initial_colors_found = EMPTY;
+  int color;
+  int k;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      initial_colors_found |= initial_board[pos];
+  
+  fprintf(stderr, "(;GM[1]FF[4]SZ[%d]KM[%.1f]HA[%d]GN[GNU Go %s stepped on a bug]\n",
+         board_size, komi, handicap, gg_version());
+
+  for (color = WHITE; color <= BLACK; color++) {
+    if (initial_colors_found & color) {
+      fprintf(stderr, "A%s", color == WHITE ? "W" : "B");
+      for (k = 0, pos = BOARDMIN; pos < BOARDMAX; pos++) {
+       if (ON_BOARD(pos) && initial_board[pos] == color) {
+         fprintf(stderr, "[%c%c]", 'a' + J(pos), 'a' + I(pos));
+         k++;
+         if (k % 16 == 0)
+           fprintf(stderr, "\n");
+       }
+      }
+      if (k % 16 != 0)
+       fprintf(stderr, "\n");
+    }
+  }
+
+  if (move_history_pointer > 0) {
+    for (k = 0; k < move_history_pointer; k++) {
+      fprintf(stderr, ";%s", move_history_color[k] == WHITE ? "W" : "B");
+      if (move_history_pos[k] == PASS_MOVE)
+       fprintf(stderr, "[]");
+      else
+       fprintf(stderr, "[%c%c]", 'a' + J(move_history_pos[k]),
+               'a' + I(move_history_pos[k]));
+      
+      if (k % 12 == 11)
+       fprintf(stderr, "\n");
+    }
+    if (k % 12 != 0)
+      fprintf(stderr, "\n");
+  }
+  fprintf(stderr, ")\n");
+}
+
+/*
+ * A wrapper around abort() which shows the state variables at the time
+ * of the problem. (pos) is typically a related move, or NO_MOVE.
+ */
+
+void 
+abortgo(const char *file, int line, const char *msg, int pos)
+{
+  gprintf("%o\n\n***assertion failure:\n%s:%d - %s near %1m***\n\n",
+         file, line, msg, pos);
+  dump_stack();
+
+  /* Print the board at the top of the stack. */
+  simple_showboard(stderr);
+  fprintf(stderr, "\n");
+
+  dump_board_sgf();
+
+  fprintf(stderr, "gnugo %s (seed %d): You stepped on a bug.\n",
+          gg_version(), get_random_seed());
+  if (board_size >= 9 && board_size <= 19) {
+    fprintf(stderr, "\
+Please mail this message, including the debug output above, \
+to gnugo@gnu.org\n");
+  }
+  fprintf(stderr, "\n");
+
+  fflush(stderr);
+  fflush(stdout);
+
+  abort();  /* cause core dump */
+}
+
+static const char *color_names[] = {
+  COLOR_NAMES
+};
+
+/* Convert a color value to a string. */
+const char *
+color_to_string(int color)
+{
+  gg_assert(color < NUM_KOMASTER_STATES);
+  return color_names[color];
+}
+
+/* Convert a location to a string. */
+const char *
+location_to_string(int pos)
+{
+  static int init = 0;
+  static char buf[BOARDSIZE][5];
+  if (!init) {
+    int pos;
+    for (pos = 0; pos < BOARDSIZE; pos++)
+      location_to_buffer(pos, buf[pos]);
+    init = 1;
+  }
+  ASSERT1(pos >= 0 && pos < BOARDSIZE, pos);
+  return buf[pos];
+}
+
+/* Convert a location to a string, writing to a buffer. */
+
+void
+location_to_buffer(int pos, char *buf)
+{
+  char *bufp = buf;
+  int i = I(pos);
+  int j = J(pos);
+
+  if (pos == NO_MOVE) {
+    strcpy(buf, "Pass");
+    return;
+  }
+
+  *bufp = 'A'+j;
+  if (*bufp >= 'I')
+    (*bufp)++;
+  bufp++;
+
+  i = board_size - i;
+  if (i > 9)
+    *bufp++ = '0' + i/10;
+  *bufp++ = '0' + i%10;
+
+  *bufp = 0;
+}
+
+
+/*
+ * Convert the string str to a 1D coordinate. Return NO_MOVE if invalid
+ * string.
+ */
+
+int
+string_to_location(int boardsize, const char *str)
+{
+  int m, n;
+  
+  if (*str == '\0')
+    return NO_MOVE;
+
+  if (!isalpha((int) *str))
+    return NO_MOVE;
+  
+  n = tolower((int) *str) - 'a';
+  if (tolower((int) *str) >= 'i')
+    --n;
+  if (n < 0 || n > boardsize - 1)
+    return NO_MOVE;
+
+  if (!isdigit((int) *(str + 1)))
+    return NO_MOVE;
+  
+  m = boardsize - atoi(str + 1);
+  if (m < 0 || m > boardsize - 1)
+    return NO_MOVE;
+
+  return POS(m, n);
+}
+
+
+/* Some simple functions to draw an ASCII board. */
+
+/* True if the coordinate is a hoshi point. */
+int
+is_hoshi_point(int m, int n)
+{
+  int hoshi;
+  int middle;
+
+  /* No hoshi points on these boards. */
+  if (board_size == 2 || board_size == 4)
+    return 0;
+
+  /* In the middle of a 3x3 board. */
+  if (board_size == 3) {
+    if (m == 1 && n == 1)
+      return 1;
+
+    return 0;
+  }
+
+  if (board_size == 5) {
+    if (m == 1 && (n == 1 || n == 3))
+      return 1;
+    if (m == 2 && n == 2)
+      return 1;
+    if (m == 3 && (n == 1 || n == 3))
+      return 1;
+
+    return 0;
+  }
+
+  /* 3-3 points are hoshi on sizes 7--11, 4-4 on larger. */
+  if (board_size <= 11)
+    hoshi = 2;
+  else
+    hoshi = 3;
+
+  /* Coordinate for midpoint. */
+  middle = board_size/2;
+    
+  /* Normalize the coordinates by mirroring to the lower numbers. */
+  if (m >= middle)
+    m = board_size - 1 - m;
+  if (n >= middle)
+    n = board_size - 1 - n;
+  
+  /* Is this a corner hoshi? */
+  if (m == hoshi && n == hoshi)
+    return 1;
+
+  /* If even sized board, only hoshi points in the corner. */
+  if (board_size%2 == 0)
+    return 0;
+
+  /* Less than 12 in board size only middle point. */
+  if (board_size < 12) {
+    if (m == middle && n == middle)
+      return 1;
+
+    return 0;
+  }
+
+  /* Is this a midpoint hoshi? */
+  if ((m == hoshi || m == middle)
+      && (n == hoshi || n == middle))
+    return 1;
+
+  /* No more chances. */
+  return 0;
+}
+
+
+/* Print a line with coordinate letters above the board. */
+void
+draw_letter_coordinates(FILE *outfile)
+{
+  int i;
+  int ch;
+  
+  fprintf(outfile, "  ");
+  for (i = 0, ch = 'A'; i < board_size; i++, ch++) {
+    if (ch == 'I')
+      ch++;
+    fprintf(outfile, " %c", ch);
+  }
+}
+
+
+/* Bare bones version of showboard(0). No fancy options, no hint of
+ * color, and you can choose where to write it.
+ */
+void
+simple_showboard(FILE *outfile)
+{
+  int i, j;
+
+  draw_letter_coordinates(outfile);
+  
+  for (i = 0; i < board_size; i++) {
+    fprintf(outfile, "\n%2d", board_size - i);
+    
+    for (j = 0; j < board_size; j++) {
+      if (BOARD(i, j) == EMPTY)
+       fprintf(outfile, " %c", is_hoshi_point(i, j) ? '+' : '.');
+      else
+       fprintf(outfile, " %c", BOARD(i, j) == BLACK ? 'X' : 'O');
+    }
+
+    fprintf(outfile, " %d", board_size - i);
+    
+    if ((board_size < 10 && i == board_size-2)
+       || (board_size >= 10 && i == 8))
+      fprintf(outfile, "     WHITE (O) has captured %d stones", black_captured);
+    
+    if ((board_size < 10 && i == board_size-1)
+       || (board_size >= 10 && i == 9))
+      fprintf(outfile, "     BLACK (X) has captured %d stones", white_captured);
+  }
+  
+  fprintf(outfile, "\n");
+  draw_letter_coordinates(outfile);
+}
+
+
+/* Adds square marks for each goal intersecion in the current sgf_dumptree.
+ * This function cannot be in sgf/ as it has to understand the 1-D board.
+ */
+void
+mark_goal_in_sgf(signed char goal[BOARDMAX])
+{
+  int pos;
+  SGFNode *node;
+
+  if (!sgf_dumptree)
+    return;
+  node = sgftreeNodeCheck(sgf_dumptree);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && goal[pos])
+      sgfSquare(node, I(pos), J(pos));
+}
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/readconnect.c b/engine/readconnect.c
new file mode 100644 (file)
index 0000000..d039042
--- /dev/null
@@ -0,0 +1,4350 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <math.h>
+
+#include "liberty.h"
+#include "cache.h"
+#include "gg_utils.h"
+#include "readconnect.h"
+
+/* Size of array where candidate moves are stored. */
+#define MAX_MOVES 362
+
+/* trace of a search */
+
+typedef struct _zone {
+  int array[BOARDMAX];
+  unsigned int bits[1+BOARDMAX/32];
+  int i;
+} zone;
+
+static int recursive_connect2(int str1, int str2, int *move,
+                               int has_passed);
+static int recursive_disconnect2(int str1, int str2, int *move,
+                                  int has_passed);
+static int recursive_break(int str, const signed char goal[BOARDMAX],
+                          int *move, int has_passed, Hash_data *goal_hash);
+static int recursive_block(int str, const signed char goal[BOARDMAX],
+                          int *move, int has_passed, Hash_data *goal_hash);
+
+static int add_array(int *array, int elt);
+static int element_array(int *array, int elt);
+static void intersection_array(int *array1, int *array2);
+static int snapback(int str);
+static int connection_one_move(int str1, int str2);
+static int prevent_connection_one_move(int *moves, int str1, int str2);
+static int connected_one_move(int str1, int str2);
+static int moves_to_connect_in_two_moves(int *moves, int str1, int str2);
+static int connection_two_moves(int str1, int str2);
+static int prevent_connection_two_moves(int *moves, int str1, int str2);
+#if 0
+static int connected_two_moves(int str1, int str2);
+#endif
+static int moves_to_connect_in_three_moves(int *moves, int str1, int str2,
+                                          int does_connect);
+#if 0
+static int simple_connection_three_moves(int str1, int str2);
+static int prevent_simple_connection_three_moves(int *moves,
+                                                int str1, int str2);
+#endif
+
+static int recursive_connect(int str1, int str2, int *move);
+static int recursive_disconnect(int str1, int str2, int *move);
+
+static int quiescence_connect(int str1, int str2, int *move);
+static int quiescence_capture(int str, int *move);
+/* static int capture_one_move(int str); */
+static int prevent_capture_one_move(int *moves, int str1);
+static int recursive_transitivity(int str1, int str2, int str3, int *move);
+static int recursive_non_transitivity(int str1, int str2, int str3, int *move);
+static void order_connection_moves(int *moves, int str1, int str2,
+                                  int color_to_move, const char *funcname);
+
+static int nodes_connect = 0;
+
+/* Used by alternate connections. */
+static signed char connection_shadow[BOARDMAX];
+
+static signed char breakin_shadow[BOARDMAX]; 
+
+/* Statistics. */
+static int global_connection_node_counter = 0;
+
+static void
+init_zone(zone *zn)
+{
+  zn->array[0] = 0;
+  memset(zn->bits, 0, 1 + BOARDMAX / 8);
+}
+
+/* send back 1 if the intersection is in the zone
+ */
+
+#if 0
+static int
+elt_zone(zone *zn, int elt)
+{
+  if ((zn->bits[elt >> 5] >> (elt & 31)) & 1)
+    return 1;
+  return 0;
+}
+#endif
+
+/* Adds an intersection to a zone
+ */
+
+static void
+add_zone(zone *zn, int elt)
+{
+  if (((zn->bits[elt >> 5] >> (elt & 31)) & 1) == 0) {
+    zn->bits[elt >> 5] |= (1 << (elt & 31));
+    zn->array[0]++;
+    zn->array[zn->array[0]] = elt;
+  }
+}
+
+/* start to loop over a zone
+ */
+
+#if 0
+static int
+start_zone(zone *zn)
+{
+  if (zn->array[0] < 1)
+    return -1;
+  zn->i = 1;
+  return zn->array[1];
+}
+#endif
+
+/* continue to loop over a zone
+ */
+
+#if 0
+static int
+next_zone(zone *zn)
+{
+  zn->i++;
+  if (zn->i > zn->array[0])
+    return -1;
+  return zn->array[zn->i];
+}
+#endif
+
+/* only keep the elements of zn1 which are also in zn2 */
+
+#if 0
+static void
+intersection_zone(zone *zn1, zone *zn2)
+{
+  int r, s;
+  
+  for (r = start_zone(zn1); r > -1; r = next_zone(zn1))
+    if (!elt_zone(zn2, r)) {
+      for (s = r; s < zn1->array[0]; s++)
+       zn1->array[s] = zn1->array[s+1];
+      zn1->bits[r >> 5] &= ~ (1 << (r & 31));
+      zn1->array[0]--;
+      zn1->i--;
+    }
+}
+#endif
+
+/* Adds an integer to an array of integers if it is not already there.
+ * The number of elements of the array is in array[0].
+ */
+
+static int
+add_array(int *array, int elt)
+{
+  int r;
+  
+  for (r = 1; r < array[0] + 1; r++)
+    if (array[r] == elt)
+      return 0;
+
+  array[0]++;
+  array[array[0]] = elt;
+  return 1;
+}
+
+/* test if an element is part of an array */
+
+static int
+element_array(int *array, int elt)
+{
+  int r;
+  for (r = 1; r < array[0] + 1; r++)
+    if (array[r] == elt)
+      return 1;
+  return 0;
+}
+
+/* only keep the elements of array1 which are also in array2 */
+
+static void
+intersection_array(int *array1, int *array2)
+{
+  int r, s;
+  
+  for (r = 1; r < array1[0] + 1; r++)
+    if (!element_array(array2, array1[r])) {
+      for (s = r; s < array1[0]; s++)
+       array1[s] = array1[s+1];
+      array1[0]--;
+      r--;
+    }
+}
+
+/* verifies that capturing the stone at str is not a snapback */
+
+static int
+snapback(int str)
+{
+  int stones, liberties, lib;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+
+  /* if more than one stone captured, not a snapback */
+  stones = countstones(str);
+  if (stones > 1)
+    return 0;
+
+  /* if more than one liberty, not a snapback */
+  liberties = findlib(str, 1, &lib);
+  if (liberties > 1)
+    return 0;
+
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+  
+  /* if only one liberty after capture */
+  if (trymove(lib, OTHER_COLOR(board[str]), "snapback", str)) {
+    liberties = 0;
+    if (IS_STONE(board[lib]))
+      liberties = countlib(lib);
+    popgo();
+    sgf_dumptree = save_sgf_dumptree;
+    if (liberties > 1)
+      return 0;
+    return WIN;
+  }
+  
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  
+  return 0;
+}
+
+/* connection by playing and finding a ponnuki after play */
+
+static int
+ponnuki_connect(int *moves, int str1, int str2, zone *zn)
+{
+  int r, s, k, res = 0;
+  int liberties, libs[MAXLIBS];
+  int adj, adjs[MAXCHAIN];
+  int neighb, neighbs[MAXCHAIN];
+
+  /* finds connection through two forbidden liberties for
+   * the opponent
+   * + + + + + + +
+   * + + @ O O @ +
+   * + @ + @ @ x +
+   * + + @ + + + +
+   * - - - - - - -
+   *
+   * + + + + + + +
+   * + + @ O O @ +
+   * + @ + @ @ O @
+   * + + @ + + x +
+   * - - - - - - -
+   */
+  liberties = findlib(str1, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++)
+    if (is_self_atari(libs[r], OTHER_COLOR(board[str1]))) 
+      for (k = 0; k < 4; k++) {
+       int pos = libs[r] + delta[k];
+       if (board[pos] == board[str1]
+           && !same_string(pos, str1)
+           && !same_string(pos, str2)) {
+         /* try to connect pos to str2 in one move */
+         /* play a common liberty */
+         neighb = findlib(pos, MAXLIBS, neighbs);
+         for (s = 0; s < neighb; s++)
+           if (liberty_of_string(neighbs[s], str2)) {
+             res = 1;
+             add_zone(zn, libs[r]);
+             add_zone(zn, neighbs[s]);
+             add_array(moves, neighbs[s]);
+           }
+         /* or capture a common adjacent string */
+         adj = chainlinks2(pos, adjs, 1);
+         for (s = 0; s < adj; s++)
+           if (adjacent_strings(adjs[s], str2)
+               && !snapback(adjs[s])) {
+             res = 1;
+             neighb = findlib(adjs[s], 1, neighbs);
+             add_zone(zn, libs[r]);
+             add_zone(zn, neighbs[0]);
+             add_array(moves, neighbs[0]);
+           }
+       }
+      }
+  
+  return res;
+}
+
+/* connection in one move, finds all moves and memorizes intersections
+ * involved in the connection.
+ */
+
+static int
+moves_connection_one_move(int *moves, int str1, int str2, zone *zn)
+{
+  int r;
+  int adj, adjs[MAXCHAIN];
+
+  /* If one string is missing we have already failed. */
+  if (board[str1] == EMPTY || board[str2] == EMPTY)
+    return 0;
+
+  /* Common liberties. */
+  if (have_common_lib(str1, str2, NULL))
+    return WIN;
+
+  /* Common adjacent string in atari, more than one stone, no snapback. */
+  adj = chainlinks2(str1, adjs, 1);
+  for (r = 0; r < adj; r++)
+    if (adjacent_strings(adjs[r], str2)
+        && !snapback(adjs[r]))
+      return WIN;
+  
+  /* Connections through a ponnuki */
+  if (ponnuki_connect(moves, str1, str2, zn))
+    return WIN;
+  if (ponnuki_connect(moves, str2, str1, zn))
+    return WIN;
+
+  return 0;
+}
+
+/* Verifies that the strings str1 and str2 can be connected
+ * directly by playing one move, either by playing a common liberty
+ * of the two strings, or by capturing a common adjacent string.
+ *
+ * This is the gi1 game function.
+ */
+
+static int
+connection_one_move(int str1, int str2)
+{
+  int moves[BOARDMAX];
+  zone zn;
+  init_zone(&zn);
+  moves[0] = 0;
+  return moves_connection_one_move(moves, str1, str2, &zn);
+}
+
+/* If the two strings str1 and str2 can be connected sends back WIN fill the
+ * array moves with the only move that can prevent a connection in one move
+ * (common liberties, liberties of common adjacent strings in atari).
+ *
+ * This is the ip1 game function. */
+
+static int
+prevent_connection_one_move(int *moves, int str1, int str2)
+{
+  int r, s;
+  int libs[MAXLIBS];
+  int adj, adjs[MAXCHAIN];
+  int adjadj, adjadjs[MAXCHAIN];
+  
+  /* Common liberties. */
+  if (have_common_lib(str1, str2, libs)) {
+    add_array(moves, libs[0]);
+    return WIN;
+  }
+  
+  /* Save a common adjacent string in atari, more than one stone, no snapback.
+   */
+  adj = chainlinks2(str1, adjs, 1);
+  for (r = 0; r < adj; r++)
+    if (adjacent_strings(adjs[r], str2)
+        && !snapback(adjs[r])) {
+      findlib(adjs[r], MAXLIBS, libs);
+      add_array(moves, libs[0]);
+      adjadj = chainlinks2(adjs[r], adjadjs, 1);
+      for (s = 0; s < adjadj; s++) {
+       findlib(adjadjs[s], MAXLIBS, libs);
+       add_array(moves, libs[0]);
+      }
+      return WIN;
+    }
+  
+  return 0;
+}
+
+/* Returns WIN if str1 and str2 are connected in at most
+ * one move even if the opponent plays first.
+ * Verify that the strings are connectable in one move
+ * and find the only possible moves that can prevent
+ * using prevent_connection_one_move. If none of these
+ * moves works, the two strings are connected.
+ *
+ * This is the g1 game function.
+ */
+
+static int
+connected_one_move(int str1, int str2)
+{
+  int r, res = 0;
+  int moves[MAX_MOVES];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+  
+  moves[0] = 0;
+  if (prevent_connection_one_move(moves, str1, str2)) {
+    order_connection_moves(moves, str1, str2, OTHER_COLOR(board[str1]),
+                          "connected_one_move");
+    res = WIN;
+    for (r = 1; ((r < moves[0] + 1) && res); r++) {
+      if (trymove(moves[r], OTHER_COLOR(board[str1]),
+                 "connected_one_move", str1)) {
+       if (!connection_one_move(str1, str2))
+         res = 0;
+       popgo();
+      }
+    }
+  }
+
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  
+  return res;
+}
+
+/* Find the moves that might be able to connect in less than three plies.
+ * That is moves that can connect the strings if another move of the same
+ * color is played just after:
+ * - common liberties of the two strings;
+ * - moves on the liberties of an opponent string with less than two
+ *   liberties adjacent to both strings, or adjacent to one string and
+ *   that has a common liberty with the second string;
+ * - liberties of one string that are second order liberties of the
+ *   other string.
+ *
+ * Returns WIN if a direct connection has been found. Returns 0
+ * otherwise.
+ */
+
+static int
+moves_to_connect_in_two_moves(int *moves, int str1, int str2)
+{
+  int r, s, common_adj_liberty;
+  int liberties, libs[MAXLIBS];
+  int adj, adjs[MAXCHAIN];
+  int adjadj, adjadjs[MAXCHAIN];
+  int k;
+  int color = board[str1];
+  int move;
+  
+  /* Common liberties. */
+  if (have_common_lib(str1, str2, libs)) {
+    add_array(moves, libs[0]);
+    return 1;
+  }
+  
+  /* Capture a common adjacent string or an adjacent liberty of str1
+   * that has a common liberty with str2...
+   */
+  adj = chainlinks3(str1, adjs, 2);
+  for (r = 0; r < adj; r++) {
+    liberties = findlib(adjs[r], MAXLIBS, libs);
+    common_adj_liberty = 0;
+    for (s = 0; s < liberties; s++)
+      if (liberty_of_string(libs[s], str2))
+       common_adj_liberty = 1;
+    if (common_adj_liberty || adjacent_strings(adjs[r], str2)) {
+      for (s = 0; s < liberties; s++)
+       add_array(moves, libs[s]);
+      adjadj = chainlinks2(adjs[r], adjadjs, 1);
+      for (s = 0; s < adjadj; s++) {
+       findlib(adjadjs[s], MAXLIBS, libs);
+       add_array(moves, libs[0]);
+      }
+    }
+  }
+
+  /* ...and vice versa. */
+  adj = chainlinks3(str2, adjs, 2);
+  for (r = 0; r < adj; r++) {
+    liberties = findlib(adjs[r], MAXLIBS, libs);
+    common_adj_liberty = 0;
+    for (s = 0; s < liberties; s++)
+      if (liberty_of_string(libs[s], str1))
+       common_adj_liberty = 1;
+    if (common_adj_liberty || adjacent_strings(adjs[r], str1)) {
+      for (s = 0; s < liberties; s++)
+       add_array(moves, libs[s]);
+      adjadj = chainlinks2(adjs[r], adjadjs, 1);
+      for (s = 0; s < adjadj; s++) {
+       findlib(adjadjs[s], MAXLIBS, libs);
+       add_array(moves, libs[0]);
+      }
+    }
+  }
+  
+  /* Liberties of str1 that are second order liberties of str2 and
+   * vice versa.
+   */
+  liberties = findlib(str1, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++) {
+    if (board[SOUTH(libs[r])] == EMPTY) {
+      if (liberty_of_string(SOUTH(libs[r]), str2)) {
+       add_array(moves, libs[r]);
+       add_array(moves, SOUTH(libs[r]));
+      }
+    }
+    
+    if (board[WEST(libs[r])] == EMPTY) {
+      if (liberty_of_string(WEST(libs[r]), str2)) {
+       add_array(moves, libs[r]);
+       add_array(moves, WEST(libs[r]));
+      }
+    }
+
+    if (board[NORTH(libs[r])] == EMPTY) {
+      if (liberty_of_string(NORTH(libs[r]), str2)) {
+       add_array(moves, libs[r]);
+       add_array(moves, NORTH(libs[r]));
+      }
+    }
+
+    if (board[EAST(libs[r])] == EMPTY) {
+      if (liberty_of_string(EAST(libs[r]), str2)) {
+       add_array(moves, libs[r]);
+       add_array(moves, EAST(libs[r]));
+      }
+    }    
+  }
+
+  /* Liberties of str1 which are adjacent to a friendly string with
+   * common liberty with str2.
+   */
+  liberties = findlib(str1, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++) {
+    for (k = 0; k < 4; k++) {
+      int pos = libs[r] + delta[k];
+      if (board[pos] == color
+         && !same_string(pos, str1)
+         && quiescence_connect(pos, str2, &move)) {
+       add_array(moves, libs[r]);
+       add_array(moves, move);
+      }
+    }
+  }
+
+  /* And vice versa. */
+  liberties = findlib(str2, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++) {
+    for (k = 0; k < 4; k++) {
+      int pos = libs[r] + delta[k];
+      if (board[pos] == color
+         && !same_string(pos, str2)
+         && quiescence_connect(pos, str1, &move)) {
+       add_array(moves, libs[r]);
+       add_array(moves, move);
+      }
+    }
+  }
+
+  return 0;
+}
+  
+/* Tests if the strings can be connected in three plies starts
+ * with finding the possible moves that can connect.  If two
+ * moves in a row are played, then try them and stops at the
+ * first working move.  The strings are connected in two moves
+ * if the function connected_one_move is verified after a move.
+ *
+ * This is the gi2 game function.
+ */
+
+static int
+connection_two_moves(int str1, int str2)
+{
+  int r, res = 0, moves[MAX_MOVES];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  /* If one string is missing we have already failed. */
+  if (board[str1] == EMPTY || board[str2] == EMPTY)
+    return 0;
+  
+  moves[0] = 0;
+  if (moves_to_connect_in_two_moves(moves, str1, str2))
+    return WIN;
+  order_connection_moves(moves, str1, str2, board[str1],
+                        "connection_two_moves");
+  
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+  
+  for (r = 1; ((r < moves[0] + 1) && !res); r++) {
+    if (trymove(moves[r], board[str1], "connection_two_moves", str1)) {
+      if (connected_one_move(str1, str2))
+       res = WIN;
+      popgo();
+    }
+  }
+  
+  sgf_dumptree = save_sgf_dumptree;
+  
+  return res;
+}
+
+/* Find the complete set of possible moves that can prevent
+ * a connection in three plies.
+ *
+ * The function is not yet written, but moves_to_connect_in_two_moves does
+ * a similar job, so it is called temporarly.
+ */
+
+static int
+moves_to_prevent_connection_in_two_moves(int *moves, int str1, int str2)
+{
+  if (moves_to_connect_in_two_moves(moves, str1, str2))
+    return 1;
+  return 0;
+}
+
+/* Find all the moves that prevent to connect in a three plies
+ * deep search and put them in the moves array.  Returns 0 if
+ * there is no three plies connection, or else it tries all the
+ * possible preventing moves.  If after a possible preventing
+ * moves, there no connection in one move and no connection in
+ * two moves, then the moves prevents a three plies deep
+ * connection, and it is added to the moves array.
+ *
+ * this is the ip2 game function */
+
+static int
+prevent_connection_two_moves(int *moves, int str1, int str2)
+{
+  int r, res = 0;
+  int possible_moves[MAX_MOVES];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+    
+  if (connection_two_moves(str1, str2)) {
+    res = WIN;
+    possible_moves[0] = 0;
+    moves_to_prevent_connection_in_two_moves(possible_moves, str1, str2);
+    order_connection_moves(possible_moves, str1, str2,
+                          OTHER_COLOR(board[str1]),
+                          "prevent_connection_two_moves");
+    for (r = 1; r < possible_moves[0] + 1; r++) {
+      if (trymove(possible_moves[r], OTHER_COLOR(board[str1]), 
+                 "prevent_connection_two_moves", str1)) {
+       if (!connection_one_move(str1, str2))
+         if (!connection_two_moves(str1, str2))
+           add_array(moves, possible_moves[r]);
+       popgo();
+      }
+    }
+  }
+
+  sgf_dumptree = save_sgf_dumptree;  
+
+  return res;
+}
+
+/* Only partially written.
+ *
+ * Find all the moves than can connect if two subsequent
+ * moves of the same color are played after
+ * - common liberties;
+ * - liberties of common adjacent strings with 3 liberties or less;
+ * - liberties of adjacent strings with 2 liberties or less that have
+ *   liberties that are second order liberties of the other string;
+ * - liberties of one string that are second order liberties of the
+ *   other string;
+ * - second order liberties of the first string that are second order 
+ *   liberties of the other string;
+ *
+ * A function that computes the second order liberties of a string is
+ * needed as well as a function that checks efficiently if an
+ * intersection is a second order liberty of a given string.
+ *
+ * If does_connect is 1, generate moves to connect, otherwise generate
+ * moves to disconnect.
+ */
+
+static int
+moves_to_connect_in_three_moves(int *moves, int str1, int str2,
+                               int does_connect)
+{
+  int r, s;
+  int liberties, libs[MAXLIBS];
+  int liberties2, libs2[MAXLIBS];
+  int adj, adjs[MAXCHAIN];
+  int adjadj, adjadjs[MAXCHAIN];
+  int move;
+  int k;
+  int pos;
+  int secondlib1[BOARDMAX];
+  int secondlib2[BOARDMAX];
+  
+  if (moves_to_connect_in_two_moves(moves, str1, str2))
+    return 1;
+
+  /* Find second order liberties of str1. */
+  memset(secondlib1, 0, sizeof(secondlib1));
+  liberties = findlib(str1, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++)
+    for (k = 0; k < 4; k++) {
+      pos = libs[r] + delta[k];
+      if (board[pos] == EMPTY)
+       secondlib1[pos] = 1;
+      else if (board[pos] == board[str1]) {
+       liberties2 = findlib(pos, MAXLIBS, libs2);
+       for (s = 0; s < liberties2; s++)
+         secondlib1[libs2[s]] = 1;
+      }
+    }
+  
+  /* Find second order liberties of str2.
+   */
+  memset(secondlib2, 0, sizeof(secondlib2));
+  liberties = findlib(str2, MAXLIBS, libs);
+  for (r = 0; r < liberties; r++)
+    for (k = 0; k < 4; k++) {
+      pos = libs[r] + delta[k];
+      if (board[pos] == EMPTY)
+       secondlib2[pos] = 1;
+      else if (board[pos] == board[str2]) {
+       liberties2 = findlib(pos, MAXLIBS, libs2);
+       for (s = 0; s < liberties2; s++)
+         secondlib2[libs2[s]] = 1;
+      }
+    }
+  
+  /* Second order liberties of str1 that are second order liberties
+   * of str2 and vice versa.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (secondlib1[pos] && secondlib2[pos])
+      add_array(moves, pos);
+  }
+
+  /* Capture a neighbor of str1 which is in atari. The captured string
+   * must in turn have a neighbor which can connect to str2 easily.
+   */
+  adj = chainlinks2(str1, adjs, 1);
+  for (r = 0; r < adj; r++) {
+    adjadj = chainlinks(adjs[r], adjadjs);
+    for (s = 0; s < adjadj; s++) {
+      if (!same_string(adjadjs[s], str1)
+         && quiescence_connect(adjadjs[s], str2, &move)) {
+       findlib(adjs[r], 1, libs);
+       add_array(moves, libs[0]);
+       add_array(moves, move);
+      }
+    }
+  }
+
+  /* And vice versa. */
+  adj = chainlinks2(str2, adjs, 1);
+  for (r = 0; r < adj; r++) {
+    adjadj = chainlinks(adjs[r], adjadjs);
+    for (s = 0; s < adjadj; s++) {
+      if (!same_string(adjadjs[s], str2)
+         && quiescence_connect(adjadjs[s], str1, &move)) {
+       findlib(adjs[r], 1, libs);
+       add_array(moves, libs[0]);
+       add_array(moves, move);
+      }
+    }
+  }
+
+  /* Liberties of neighbor of str1 with at most two liberties, which
+   * are second order liberties of str2.
+   */
+  adj = chainlinks3(str1, adjs, 2);
+  for (r = 0; r < adj; r++) {
+    liberties = findlib(adjs[r], 2, libs);
+    for (s = 0; s < liberties; s++)
+      if (second_order_liberty_of_string(libs[s], str2))
+       add_array(moves, libs[s]);
+  }
+
+  /* And vice versa. */
+  adj = chainlinks3(str2, adjs, 2);
+  for (r = 0; r < adj; r++) {
+    liberties = findlib(adjs[r], 2, libs);
+    for (s = 0; s < liberties; s++)
+      if (second_order_liberty_of_string(libs[s], str1))
+       add_array(moves, libs[s]);
+  }
+  
+  /* Move in on a three liberty opponent string which is adjacent to
+   * str1 and has a liberty in common with str2.
+   */
+  adj = chainlinks2(str1, adjs, 3);
+  for (r = 0; r < adj; r++) {
+    if (have_common_lib(adjs[r], str2, NULL)) {
+      liberties = findlib(adjs[r], 3, libs);
+      for (s = 0; s < liberties; s++) {
+       /* If generating a connecting move, require the liberty to be
+         * no further than diagonal to a second order liberty of one
+         * of the strings.
+        */
+       for (k = 0; k < 8; k++) {
+         if (!does_connect
+             || (ON_BOARD(libs[s] + delta[k])
+                 && (secondlib1[libs[s] + delta[k]]
+                     || secondlib2[libs[s] + delta[k]]))) {
+           add_array(moves, libs[s]);
+           break;
+         }
+       }
+      }
+    }
+  }
+
+  /* And vice versa. */
+  adj = chainlinks2(str2, adjs, 3);
+  for (r = 0; r < adj; r++) {
+    if (have_common_lib(adjs[r], str1, NULL)) {
+      liberties = findlib(adjs[r], 3, libs);
+      for (s = 0; s < liberties; s++) {
+       /* If generating a connecting move, require the liberty to be
+         * no further than diagonal to a second order liberty of one
+         * of the strings.
+        */
+       for (k = 0; k < 8; k++) {
+         if (!does_connect
+             || (ON_BOARD(libs[s] + delta[k])
+                 && (secondlib1[libs[s] + delta[k]]
+                     || secondlib2[libs[s] + delta[k]]))) {
+           add_array(moves, libs[s]);
+           break;
+         }
+       }
+      }
+    }
+  }
+  
+  return 0;
+}
+
+
+/* Not yet written.
+ *
+ * Find the complete set of possible moves that can prevent
+ * a connection in 5 plies.
+ */
+
+static int
+moves_to_prevent_connection_in_three_moves(int *moves, int str1, int str2)
+{
+  if (moves_to_connect_in_three_moves(moves, str1, str2, 0))
+    return 1;
+  return 0;
+}
+
+/* 
+ * The simplest depth 4 connection:
+ *
+ * If there are forced moves to prevent connection in one move,
+ * try them, and verify that they all lead to a depth 1 or
+ * depth 3 connection.
+ * 
+ * This is the g211 game function.
+ */
+
+static int
+simply_connected_two_moves(int str1, int str2)
+{
+  int r, res = 0;
+  int moves[MAX_MOVES];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+  
+  
+  /* If one string is missing we have already failed. */
+  if (board[str1] == EMPTY || board[str2] == EMPTY)
+    return 0;
+  
+  moves[0] = 0;
+  if (prevent_connection_one_move(moves, str1, str2)) {
+    res = WIN;
+    order_connection_moves(moves, str1, str2, OTHER_COLOR(board[str1]),
+                          "simply_connected_two_moves");
+    for (r = 1; ((r < moves[0] + 1) && res); r++) {
+      if (trymove(moves[r], OTHER_COLOR(board[str1]),
+                 "simply_connected_two_moves", str1)) {
+       if (!connection_one_move(str1, str2))
+         if (!connection_two_moves(str1, str2))
+           res = 0;
+       popgo();
+      }
+    }
+  }
+  
+  sgf_dumptree = save_sgf_dumptree;
+  
+  return res;
+}
+
+/* Test if a move is a simple depth 5 connection.
+ *
+ * This is the gi311 game function.
+ */
+
+static int
+simple_connection_three_moves(int str1, int str2)
+{
+  int r, res = 0, moves[MAX_MOVES];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+    
+  
+  moves[0] = 0;
+  if (moves_to_connect_in_two_moves(moves, str1, str2))
+    return WIN;
+  order_connection_moves(moves, str1, str2, board[str1],
+                        "simple_connection_three_moves");
+  for (r = 1; ((r < moves[0] + 1) && !res); r++) {
+    if (trymove(moves[r], board[str1],
+               "simple_connection_three_moves", str1)) {
+      if (simply_connected_two_moves(str1, str2))
+       res = WIN;
+      popgo();
+    }
+  }
+  
+  sgf_dumptree = save_sgf_dumptree;
+  
+  return res;
+}
+
+/* Find the forced moves that prevent a simple depth 5 connection.
+ * Fills the array moves with the forced moves.
+ *
+ * This is the ip311 game function.
+ *
+ * It finds moves in very important situations such as:
+ *
+ * + + + O + +
+ * + @ @ O + +
+ * + @ O @ @ +
+ * + @ O + + +
+ * + + + + + +
+ * - - - - - -
+ *
+ * and enables recursive_disconnect to prove the two black
+ * strings are connected in these situations.
+ */
+
+static int
+prevent_simple_connection_three_moves(int *moves, int str1, int str2)
+{
+  int r, res = 0;
+  int possible_moves[MAX_MOVES];
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+
+  /* turn off the sgf traces
+   */
+  sgf_dumptree = NULL;
+    
+  
+  if (simple_connection_three_moves(str1, str2)) {
+    res = WIN;
+    possible_moves[0] = 0;
+    moves_to_prevent_connection_in_three_moves(possible_moves, str1, str2);
+    order_connection_moves(moves, str1, str2, OTHER_COLOR(board[str1]),
+                          "prevent_simple_connection_three_moves");
+    for (r = 1; r < possible_moves[0] + 1; r++) {
+      if (trymove(possible_moves[r], OTHER_COLOR(board[str1]), 
+                 "prevent_simple_connection_three_moves", str1)) {
+       if (!connection_one_move(str1, str2))
+         if (!connection_two_moves(str1, str2))
+           if (!simple_connection_three_moves(str1, str2))
+             add_array(moves, possible_moves[r]);
+       popgo();
+      }
+    }
+  }
+  
+  sgf_dumptree = save_sgf_dumptree;
+  
+  return res;
+}
+
+/* Find simple connections by looking at common liberties
+ * or directly capturing a common adjacent string without a snapback
+ * or looking at a ladder for a common adjacent string.
+ */
+
+static int
+quiescence_connect(int str1, int str2, int *move)
+{
+  int r;
+  int lib;
+  int adj, adjs[MAXCHAIN];
+
+  /* Common liberties. */
+  if (have_common_lib(str1, str2, &lib)) {
+    *move = lib;
+    return WIN;
+  }
+
+  /* Common adjacent string in atari, more than one stone, no snapback. */
+  adj = chainlinks2(str1, adjs, 1);
+  for (r = 0; r < adj; r++)
+    if (adjacent_strings(adjs[r], str2)
+        && !snapback(adjs[r])) {
+      findlib(adjs[r], 1, move);
+      return WIN;
+    }
+  
+  /* Common adjacent string two liberties, read ladder. */
+  adj = chainlinks2(str1, adjs, 2);
+  for (r = 0; r < adj; r++)
+    if (adjacent_strings(adjs[r], str2))
+      if (quiescence_capture(adjs[r], move))
+       return WIN;
+  
+  return 0;
+}
+
+
+/* A persistent connection cache has been implemented, but currently
+ * (3.3.15) it does not have much impact on performance. Possible
+ * explanations for this include:
+ * 1. The active area is too often unnecessarily large.
+ * 2. Between the persistent caches of tactical reading and owl
+ *    reading, there is not much to gain from also caching the
+ *    connection results.
+ * 3. There is some bug in the implementation.
+ *
+ * In order to simplify testing of code modifications, the caching
+ * code has been made conditional. Setting
+ * USE_PERSISTENT_CONNECTION_CACHE to 0, 1, or 2 has the following
+ * effects.
+ * 0 - Completely turned off.
+ * 1 - Results are stored in the cache but retrieved results are only
+ *     compared to the non-cached result. Deviations are reported.
+ * 2 - Fully turned on.
+ */
+#define USE_PERSISTENT_CONNECTION_CACHE 0
+
+
+/* Externally callable frontend to recursive_connect().
+ * Returns WIN if str1 and str2 can be connected. 
+ */
+int
+string_connect(int str1, int str2, int *move)
+{
+  int dummy_move;
+  int save_verbose;
+  int result;
+
+  if (move == NULL)
+    move = &dummy_move;
+  
+  nodes_connect = 0;
+  *move = PASS_MOVE;
+  
+  if (alternate_connections) {
+    int reading_nodes_when_called = get_reading_node_counter();
+    double start = 0;
+    int tactical_nodes;
+    int save_connection_node_limit = connection_node_limit;
+#if USE_PERSISTENT_CONNECTION_CACHE == 1
+    int result2 = -1;
+    int move2;
+#endif
+    if (board[str1] == EMPTY || board[str2] == EMPTY)
+      return 0;
+    str1 = find_origin(str1);
+    str2 = find_origin(str2);
+    if (str1 > str2) {
+      int tmp = str1;
+      str1 = str2;
+      str2 = tmp;
+    }
+
+
+#if USE_PERSISTENT_CONNECTION_CACHE == 1
+    if (!search_persistent_connection_cache(CONNECT, str1, str2,
+                                           &result2, &move2))
+      result2 = -1;
+    else if (0)
+      gprintf("Persistent cache found connect %1m %1m: %d %1m\n",
+             str1, str2, result2, move2);
+#endif
+#if USE_PERSISTENT_CONNECTION_CACHE == 2
+    if (search_persistent_connection_cache(CONNECT, str1, str2, &result, move))
+      return result;
+#endif
+
+    connection_node_limit *= pow(1.45, -stackp + get_depth_modification());
+    save_verbose = verbose;
+    if (verbose > 0)
+      verbose--;
+    start = gg_cputime();
+    memset(connection_shadow, 0, sizeof(connection_shadow));
+    result = recursive_connect2(str1, str2, move, 0);
+    verbose = save_verbose;
+    tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+    connection_node_limit = save_connection_node_limit;
+
+#if USE_PERSISTENT_CONNECTION_CACHE == 1
+    if (result2 != -1
+       && result2 != result
+       && *move != move2)
+      gprintf("Persistent cache failure connect %1m %1m: %d %1m != %d %1m\n",
+             str1, str2, result, *move, result2, move2);
+#endif
+
+    if (0) {
+      gprintf("%oconnect    %1M %1M, result %d %1M (%d, %d nodes, %f seconds)\n",
+             str1, str2, result, *move,
+             nodes_connect, tactical_nodes, gg_cputime() - start);
+      dump_stack();
+    }
+    if (0) {
+      gprintf("%oconnect %1m %1m %d %1m ", str1, str2, result, *move);
+      dump_stack();
+    }
+
+#if USE_PERSISTENT_CONNECTION_CACHE > 0
+    store_persistent_connection_cache(CONNECT, str1, str2, result, *move,
+                                     tactical_nodes, connection_shadow);
+#endif
+  
+    return result;
+  }
+
+  return recursive_connect(str1, str2, move);
+}
+
+
+/* returns WIN if str1 and str2 can be connected. */
+
+static int
+recursive_connect(int str1, int str2, int *move)
+{
+  int i, res = 0, Moves[MAX_MOVES], ForcedMoves[MAX_MOVES];
+  SETUP_TRACE_INFO2("recursive_connect", str1, str2);
+  
+  if (board[str1] == EMPTY || board[str2] == EMPTY) {
+    SGFTRACE2(PASS_MOVE, 0, "one string already captured");
+    return 0;
+  }
+  
+  if (same_string(str1, str2)) {
+    SGFTRACE2(PASS_MOVE, WIN, "already connected");
+    return WIN;
+  }
+
+  if (nodes_connect > connection_node_limit) {
+    SGFTRACE2(PASS_MOVE, 0, "connection node limit reached");
+    return 0;
+  }
+  
+  if (stackp == connect_depth) {
+    SGFTRACE2(PASS_MOVE, 0, "connection depth limit reached");
+    return 0;
+  }
+
+  nodes_connect++;
+  global_connection_node_counter++;
+  
+  if (quiescence_connect (str1, str2, move)) {
+    SGFTRACE2(*move, WIN, "quiescence_connect");
+    return WIN;
+  }
+
+  ForcedMoves[0] = 0;
+  Moves[0] = 0;
+  /* if one of the strings to connect can be captured
+   * and there are forced moves to prevent the capture
+   * then the only moves to try are the moves that
+   * defend the string: all the other moves will
+   * lead to the capture of the string
+   */
+  if (!prevent_capture_one_move(ForcedMoves, str1))
+    prevent_capture_one_move(ForcedMoves, str2);
+#if 0
+  else if (prevent_capture_two_moves(ForcedMoves, str1))
+     ; 
+  else if (prevent_capture_two_moves(ForcedMoves, str2))
+     ; 
+#endif
+  
+  /* We are at a max node, so any move we can find
+   * is ok. Try moves that can connect in three moves
+   * because the function that prevent connection in one
+   * and two moves are called at AND nodes.
+   */
+  moves_to_connect_in_three_moves(Moves, str1, str2, 1);
+
+  /* if there are some forced moves to prevent the capture
+   * of one of the two strings, then we only look at
+   * the moves that prevent capture and that might also
+   * connect
+   */
+  if (ForcedMoves[0] != 0 && Moves[0] != 0)
+    intersection_array(Moves, ForcedMoves);
+
+  order_connection_moves(Moves, str1, str2, board[str1],
+                        "recursive_connect");
+  for (i = 1; ((i < Moves[0] + 1) && (res == 0)); i++) {
+    if (trymove(Moves[i], board[str1], "recursive_connect", str1)) {
+      if (!recursive_disconnect(str1, str2, move)) {
+       *move = Moves[i];
+       res = WIN;
+      }
+      popgo();
+    }
+  }
+
+  if (res == WIN) {
+    SGFTRACE2(*move, WIN, "success");
+  }
+  else {
+    SGFTRACE2(PASS_MOVE, 0, "failure");
+  }
+  
+  return res;
+}
+  
+
+/* Externally callable frontend to recursive_disconnect().
+ * Returns WIN if str1 and str2 can be disconnected. 
+ */
+int
+disconnect(int str1, int str2, int *move)
+{
+  int i;
+  int res = WIN;
+  int Moves[MAX_MOVES];
+  int dummy_move;
+  int result;
+  int save_verbose;
+  
+  if (move == NULL)
+    move = &dummy_move;
+  
+  nodes_connect = 0;
+  *move = PASS_MOVE;
+  
+  if (alternate_connections) {
+    int reading_nodes_when_called = get_reading_node_counter();
+    int save_connection_node_limit = connection_node_limit;
+    double start = 0;
+    int tactical_nodes;
+#if USE_PERSISTENT_CONNECTION_CACHE == 1
+    int result2 = -1;
+    int move2;
+#endif
+    if (board[str1] == EMPTY || board[str2] == EMPTY)
+      return WIN;
+    str1 = find_origin(str1);
+    str2 = find_origin(str2);
+    if (str1 > str2) {
+      int tmp = str1;
+      str1 = str2;
+      str2 = tmp;
+    }
+
+#if USE_PERSISTENT_CONNECTION_CACHE == 1
+    if (!search_persistent_connection_cache(DISCONNECT, str1, str2,
+                                           &result2, &move2))
+      result2 = -1;
+    else if (0)
+      gprintf("Persistent cache found disconnect %1m %1m: %d %1m\n",
+             str1, str2, result2, move2);
+#endif
+#if USE_PERSISTENT_CONNECTION_CACHE == 2
+    if (search_persistent_connection_cache(DISCONNECT, str1, str2,
+                                          &result, move))
+      return result;
+#endif
+
+    connection_node_limit *= pow(1.5, -stackp + get_depth_modification());
+    save_verbose = verbose;
+    if (verbose > 0)
+      verbose--;
+    start = gg_cputime();
+    memset(connection_shadow, 0, sizeof(connection_shadow));
+    result = recursive_disconnect2(str1, str2, move, 0);
+    verbose = save_verbose;
+    tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+    connection_node_limit = save_connection_node_limit;
+
+#if USE_PERSISTENT_CONNECTION_CACHE == 1
+    if (result2 != -1
+       && result2 != result
+       && *move != move2)
+      gprintf("Persistent cache failure disconnect %1m %1m: %d %1m != %d %1m\n",
+             str1, str2, result, *move, result2, move2);
+#endif
+
+    if (0) {
+      gprintf("%odisconnect %1m %1m, result %d %1m (%d, %d nodes, %f seconds)\n",
+             str1, str2, result, *move,
+             nodes_connect, tactical_nodes, gg_cputime() - start);
+      dump_stack();
+    }
+    if (0) {
+      gprintf("%odisconnect %1m %1m %d %1m ", str1, str2, result, *move);
+      dump_stack();
+    }
+
+#if USE_PERSISTENT_CONNECTION_CACHE > 0
+    store_persistent_connection_cache(DISCONNECT, str1, str2, result, *move,
+                                     tactical_nodes, connection_shadow);
+#endif
+
+    return result;
+  }
+
+  Moves[0] = 0;
+  moves_to_prevent_connection_in_three_moves(Moves, str1, str2);
+  if (Moves[0] > 0)
+    res = 0;
+  order_connection_moves(Moves, str1, str2, OTHER_COLOR(board[str1]),
+                        "disconnect");
+  for (i = 1; ((i < Moves[0] + 1) && (res == 0)); i++)
+    if (trymove(Moves[i], OTHER_COLOR(board[str1]),
+               "disconnect", str1)) {
+      if (!recursive_connect(str1, str2, move)) {
+       *move = Moves[i];
+       res = WIN;
+      }
+      popgo();
+    }
+  return res;
+}
+
+/* Externally callable frontend to recursive_disconnect().
+ * Returns WIN if str1 and str2 can be disconnected. 
+ *
+ * Uses much lower node and depths limits.
+ */
+int
+fast_disconnect(int str1, int str2, int *move)
+{
+  int result;
+  int save_limit = connection_node_limit;
+  int save_verbose = verbose;
+
+  if (board[str1] == EMPTY || board[str2] == EMPTY)
+    return WIN;
+  str1 = find_origin(str1);
+  str2 = find_origin(str2);
+  if (str1 > str2) {
+    int tmp = str1;
+    str1 = str2;
+    str2 = tmp;
+  }
+
+  modify_depth_values(-3);
+  connection_node_limit /= 4;
+
+  if (verbose > 0)
+    verbose--;
+  result = recursive_disconnect2(str1, str2, move, 0);
+  verbose = save_verbose;
+
+  connection_node_limit = save_limit;
+  modify_depth_values(3);
+
+  return result;
+}
+
+
+
+/* Returns WIN if str1 and str2 can be disconnected. */
+
+static int
+recursive_disconnect(int str1, int str2, int *move)
+{
+  int i, res = WIN, Moves[MAX_MOVES];
+  
+  SETUP_TRACE_INFO2("recursive_disconnect", str1, str2);
+  
+  if (board[str1] == EMPTY || board[str2] == EMPTY) {
+    SGFTRACE2(PASS_MOVE, WIN, "one string already captured");
+    return WIN;
+  }
+
+  if (quiescence_capture(str1, move)) {
+    SGFTRACE2(*move, WIN, "first string capturable");
+    return WIN;
+  }
+  if (quiescence_capture(str2, move)) {
+    SGFTRACE2(*move, WIN, "second string capturable");
+    return WIN;
+  }
+
+  if (same_string(str1, str2)) {
+    SGFTRACE2(PASS_MOVE, 0, "already connected");
+    return 0;
+  }
+  
+  if (nodes_connect > connection_node_limit) {
+    SGFTRACE2(PASS_MOVE, WIN, "connection node limit reached");
+    return WIN;
+  }
+  
+  if (stackp == connect_depth) {
+    SGFTRACE2(PASS_MOVE, WIN, "connection depth limit reached");
+    return WIN;
+  }
+  
+  nodes_connect++;
+  global_connection_node_counter++;
+  
+  /* we are at an and node
+   * only look at forced moves here,
+   * it ensures that the result of recursive_disconnect
+   * is proved if it returns 0 (that is connections are proved)
+   */
+  Moves[0] = 0;
+
+  if (prevent_connection_one_move(Moves, str1, str2))
+    res = 0;
+  else if (prevent_connection_two_moves(Moves, str1, str2))
+    res = 0;
+  else if (prevent_simple_connection_three_moves(Moves, str1, str2))
+    res = 0;
+  
+  if (res == 0)
+    order_connection_moves(Moves, str1, str2, OTHER_COLOR(board[str1]),
+                          "recursive_disconnect");
+    for (i = 1; ((i < Moves[0] + 1) && (res == 0)); i++)
+      if (trymove(Moves[i], OTHER_COLOR(board[str1]),
+                 "recursive_disconnect", str1)) {
+       if (!recursive_connect(str1, str2, move)) {
+         *move = Moves[i];
+         res = WIN;
+       }
+       popgo();
+      }
+
+  if (res == WIN) {
+    SGFTRACE2(*move, WIN, "success");
+  }
+  else {
+    SGFTRACE2(PASS_MOVE, 0, "failure");
+  }
+  
+  return res;
+}
+/* Reads simple ladders.
+ */
+
+static int
+quiescence_capture(int str, int *move)
+{
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int result = 0;
+
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * naive_ladder moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  if (countlib(str) == 1) {
+    findlib(str, 1, move);
+    result = WIN;
+  }
+  else if (countlib(str) == 2)
+    result = simple_ladder(str, move);
+
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  return result;
+}
+
+#if 0
+static int
+capture_one_move(int str) 
+{
+  if (countlib(str) == 1)
+    return 1;
+  return 0;
+}
+#endif
+
+/* Find all the possible moves that can prevent the capture
+ * of a string in atari.
+ *
+ * The ip1 game function.
+ */
+
+static int
+prevent_capture_one_move(int *moves, int str1)
+{
+  int r, res = 0;
+  int liberties, libs[MAXLIBS];
+  int adj, adjs[MAXCHAIN];
+  
+  liberties = findlib(str1, MAXLIBS, libs);
+  if (liberties == 1) {
+    add_array(moves, libs[0]);
+    res = WIN;
+    adj = chainlinks2(str1, adjs, 1);
+    for (r = 0; r < adj; r++) {
+      findlib(adjs[r], 1, libs);
+      add_array(moves, libs[0]);
+    }
+  }
+  return res;
+}
+
+
+/* Returns WIN if str1, str2 and str3 can be connected. */
+
+static int
+recursive_transitivity(int str1, int str2, int str3, int *move)
+{
+  int i, res = 0, Moves[MAX_MOVES], ForcedMoves[MAX_MOVES];
+
+  SETUP_TRACE_INFO2("recursive_transitivity", str1, str3);
+  
+  if (board[str1] == EMPTY || board[str2] == EMPTY || board[str3] == EMPTY) {
+    SGFTRACE2(PASS_MOVE, 0, "one string already captured");
+    return 0;
+  }
+  
+  if (same_string(str1, str2) && same_string(str1, str3)) {
+    SGFTRACE2(PASS_MOVE, WIN, "already connected");
+    return WIN;
+  }
+
+  if (nodes_connect > connection_node_limit) {
+    SGFTRACE2(PASS_MOVE, 0, "connection node limit reached");
+    return 0;
+  }
+  
+  if (stackp == connect_depth) {
+    SGFTRACE2(PASS_MOVE, 0, "connection depth limit reached");
+    return 0;
+  }
+
+  nodes_connect++;
+  global_connection_node_counter++;
+  
+  if (same_string(str1, str2))
+    if (quiescence_connect (str1, str3, move)) {
+      SGFTRACE2(*move, WIN, "quiescence_connect");
+      return WIN;
+    }
+
+  if (same_string(str2, str3))
+    if (quiescence_connect (str1, str2, move)) {
+      SGFTRACE2(*move, WIN, "quiescence_connect");
+      return WIN;
+    }
+
+  ForcedMoves[0] = 0;
+  Moves[0] = 0;
+  /* If one of the strings to connect can be captured
+   * and there are forced moves to prevent the capture
+   * then the only moves to try are the moves that
+   * defend the string. All the other moves will
+   * lead to the capture of the string.
+   */
+  if (!prevent_capture_one_move(ForcedMoves, str1))
+    if (!prevent_capture_one_move(ForcedMoves, str2))
+      prevent_capture_one_move(ForcedMoves, str3);
+  
+  /* We are at a max node, so any move we can find
+   * is ok. Try moves that can connect in two moves
+   * because the function that prevents connection in one
+   * move is called at and nodes.
+   */
+  moves_to_connect_in_two_moves(Moves, str1, str2);
+  moves_to_connect_in_two_moves(Moves, str2, str3);
+
+  /* If there are some forced moves to prevent the capture
+   * of one of the two strings, then we only look at
+   * the moves that prevent capture and that might also
+   * connect.
+   */
+  if ((ForcedMoves[0] != 0) && (Moves[0] != 0))
+    intersection_array(Moves, ForcedMoves);
+
+  order_connection_moves(Moves, str1, str2, board[str1],
+                        "recursive_transitivity");
+  for (i = 1; ((i < Moves[0] + 1) && (res == 0)); i++) {
+    if (trymove(Moves[i], board[str1], "recursive_transitivity", str1)) {
+      if (!recursive_non_transitivity(str1, str2, str3, move)) {
+       *move = Moves[i];
+       res = WIN;
+      }
+      popgo();
+    }
+  }
+
+  if (res == WIN) {
+    SGFTRACE2(*move, WIN, "success");
+  }
+  else {
+    SGFTRACE2(PASS_MOVE, 0, "failure");
+  }
+  
+  return res;
+}
+  
+/* It is often assumed that if str1 connects to str2 and str2 
+ * connects to str3 then str1 connects to str3. This is called
+ * TRANSITIVITY. However there are exceptions such as this
+ * situation:
+ * 
+ *     XXXXX            XXXXX
+ *     OO.OO            AA*CC
+ *     ..O..            ..B..
+ *     XXXXX            XXXXX
+ *
+ * Although strings A and B are connected, and strings B and C
+ * are connected, a move at * disconnects strings A and C.
+ *
+ * This function is a public frontend to recursive_non_transitivity(). 
+ * Returns WIN if str1, str2 and str3 can be disconnected.
+*/
+
+int
+non_transitivity(int str1, int str2, int str3, int *move)
+{
+  int i, res = WIN, Moves[MAX_MOVES];
+  
+  nodes_connect = 0;
+  *move = PASS_MOVE;
+  moves_to_prevent_connection_in_three_moves(Moves, str1, str3);
+  if (Moves[0] > 0)
+    res = 0;
+  order_connection_moves(Moves, str1, str2, OTHER_COLOR(board[str1]),
+                        "non_transitivity");
+  for (i = 1; ((i < Moves[0] + 1) && (res == 0)); i++)
+    if (trymove(Moves[i], OTHER_COLOR(board[str1]),
+               "non_transitivity", str1)) {
+      if (!recursive_transitivity(str1, str2, str3, move)) {
+       *move = Moves[i];
+       res = WIN;
+      }
+      popgo();
+    }
+  return res;
+}
+
+/* Returns WIN if str1, str2 and str3 can be disconnected. */
+
+static int
+recursive_non_transitivity(int str1, int str2, int str3, int *move)
+{
+  int i, res = WIN, Moves[MAX_MOVES];
+  
+  SETUP_TRACE_INFO2("recursive_non_transitivity", str1, str3);
+  
+  if (board[str1] == EMPTY || board[str2] == EMPTY
+      || board[str3] == EMPTY) {
+    SGFTRACE2(PASS_MOVE, WIN, "one string already captured");
+    return WIN;
+  }
+
+  if (quiescence_capture(str1, move)) {
+    SGFTRACE2(*move, WIN, "first string capturable");
+    return WIN;
+  }
+  if (quiescence_capture(str2, move)) {
+    SGFTRACE2(*move, WIN, "second string capturable");
+    return WIN;
+  }
+  if (quiescence_capture(str3, move)) {
+    SGFTRACE2(*move, WIN, "third string capturable");
+    return WIN;
+  }
+
+  if (same_string(str1, str2) && same_string(str1, str3)) {
+    SGFTRACE2(PASS_MOVE, 0, "already connected");
+    return 0;
+  }
+  
+  if (nodes_connect > connection_node_limit) {
+    SGFTRACE2(PASS_MOVE, WIN, "connection node limit reached");
+    return WIN;
+  }
+  
+  if (stackp == connect_depth) {
+    SGFTRACE2(PASS_MOVE, WIN, "connection depth limit reached");
+    return WIN;
+  }
+  
+  nodes_connect++;
+  global_connection_node_counter++;
+  
+  /* We are at an and node. Only look at forced moves. */
+  Moves[0] = 0;
+  if (prevent_connection_one_move(Moves, str1, str3))
+    res = 0;
+  else if (prevent_connection_two_moves(Moves, str1, str3))
+    res = 0;
+  else if (prevent_simple_connection_three_moves(Moves, str1, str3))
+    res = 0;
+  
+  if (res == 0)
+    order_connection_moves(Moves, str1, str2, OTHER_COLOR(board[str1]),
+                          "recursive_non_transitivity");
+    for (i = 1; ((i < Moves[0] + 1) && (res == 0)); i++)
+      if (trymove(Moves[i], OTHER_COLOR(board[str1]),
+                 "recursive_non_transitivity", str1)) {
+       if (!recursive_transitivity(str1, str2, str3, move)) {
+         *move = Moves[i];
+         res = WIN;
+       }
+       popgo();
+      }
+
+  if (res == WIN) {
+    SGFTRACE2(*move, WIN, "success");
+  }
+  else {
+    SGFTRACE2(PASS_MOVE, 0, "failure");
+  }
+  
+  return res;
+}
+
+
+/* Order the moves so that we try the ones likely to succeed early. */
+static void
+order_connection_moves(int *moves, int str1, int str2, int color_to_move,
+                      const char *funcname)
+{
+  int scores[MAX_MOVES];
+  int r;
+  int i, j;
+  UNUSED(str2);
+  UNUSED(color_to_move);
+
+  for (r = 1; r <= moves[0]; r++) {
+    int move = moves[r];
+
+    /* Look at the neighbors of this move and count the things we
+     * find. Friendly and opponent stones are related to color, i.e.
+     * the player to move, not to the color of the string.
+     *
+     * We don't use all these values. They are only here so we can
+     * reuse incremental_order_moves() which was developed for the
+     * tactical reading.
+     */
+    int number_edges       = 0; /* outside board */
+    int number_same_string = 0; /* the string being attacked */
+    int number_own         = 0; /* friendly stone */
+    int number_opponent    = 0; /* opponent stone */
+    int captured_stones    = 0; /* number of stones captured by this move */
+    int threatened_stones  = 0; /* number of stones threatened by this move */
+    int saved_stones       = 0; /* number of stones in atari saved */
+    int number_open        = 0; /* empty intersection */
+    int libs;
+
+    /* We let the incremental board code do the heavy work. */
+    incremental_order_moves(move, color_to_move, str1, &number_edges,
+                           &number_same_string, &number_own,
+                           &number_opponent, &captured_stones,
+                           &threatened_stones, &saved_stones, &number_open);
+
+    if (0)
+      gprintf("%o %1m values: %d %d %d %d %d %d %d %d\n", move, number_edges,
+             number_same_string, number_own, number_opponent,
+             captured_stones, threatened_stones, saved_stones, number_open);
+
+    scores[r] = 0;
+    libs = approxlib(move, color_to_move, 10, NULL);
+
+    /* Avoid self atari. */
+    if (libs == 1 && captured_stones == 0)
+      scores[r] -= 10;
+
+    /* Good to get many liberties. */
+    if (libs < 4)
+      scores[r] += libs;
+    else
+      scores[r] += 4;
+
+    /* Very good to capture opponent stones. */
+    if (captured_stones > 0)
+      scores[r] += 5 + captured_stones;
+
+    /* Good to threaten opponent stones. */
+    if (threatened_stones > 0)
+      scores[r] += 3;
+
+    /* Extremely good to save own stones. */
+    if (saved_stones > 0)
+      scores[r] += 10 + saved_stones;
+  }
+  
+  /* Now sort the moves.  We use selection sort since this array will
+   * probably never be more than 10 moves long.  In this case, the
+   * overhead imposed by quicksort will probably overshadow the gains
+   * given by the O(n*log(n)) behaviour over the O(n^2) behaviour of
+   * selection sort.
+   */
+  for (i = 1; i <= moves[0]; i++) {
+    /* Find the move with the biggest score. */
+    int maxscore = scores[i];
+    int max_at = i;
+    for (j = i+1; j <= moves[0]; j++) {
+      if (scores[j] > maxscore) {
+       maxscore = scores[j];
+       max_at = j;
+      }
+    }
+
+    /* Now exchange the move at i with the move at max_at.
+     * Don't forget to exchange the scores as well.
+     */
+    if (max_at != i) {
+      int temp = moves[i];
+      int tempmax = scores[i];
+
+      moves[i] = moves[max_at];
+      scores[i] = scores[max_at];
+
+      moves[max_at] = temp;
+      scores[max_at] = tempmax;
+    }
+  }
+
+  if (0) {
+    gprintf("%oVariation %d:\n", count_variations);
+    for (i = 1; i <= moves[0]; i++)
+      gprintf("%o  %1M %d\n", moves[i], scores[i]);
+  }
+
+  if (sgf_dumptree) {
+    char buf[500];
+    char *pos;
+    int chars;
+    sprintf(buf, "Move order for %s: %n", funcname, &chars);
+    pos = buf + chars;
+    for (i = 1; i <= moves[0]; i++) {
+      sprintf(pos, "%c%d (%d) %n", J(moves[i]) + 'A' + (J(moves[i]) >= 8),
+             board_size - I(moves[i]), scores[i], &chars);
+      pos += chars;
+    }
+    sgftreeAddComment(sgf_dumptree, buf);
+  }
+}
+
+/* Clear statistics. */
+void
+reset_connection_node_counter()
+{
+  global_connection_node_counter = 0;
+}
+
+
+/* Retrieve statistics. */
+int
+get_connection_node_counter()
+{
+  return global_connection_node_counter;
+}
+
+
+/*********************************************************
+ *
+ * Alternate connection reading algorithm.
+ *
+ * This code is enabled with the --enable-alternate-connections
+ * configure flag at build time or toggled with the
+ * --alternate-connections option at run time.
+ *
+ *********************************************************/
+
+/* This has been copied from reading.c and modified.
+ */
+
+#define ADD_CANDIDATE_MOVE(move, distance, moves, distances, num_moves)\
+  do {\
+    int l;\
+    for (l = 0; l < num_moves; l++)\
+      if (moves[l] == (move)) {\
+        if (distances[l] > distance)\
+          distances[l] = distance;\
+       break;\
+      }\
+    if ((l == num_moves) && (num_moves < MAX_MOVES)) {\
+      moves[num_moves] = move;\
+      distances[num_moves] = distance;\
+      (num_moves)++;\
+    }\
+  } while (0)
+
+
+static int find_string_connection_moves(int str1, int str2, int color_to_move,
+                                       int moves[MAX_MOVES],
+                                       int *total_distance);
+static void clear_connection_data(struct connection_data *conn);
+static int trivial_connection(int str1, int str2, int *move);
+static int does_secure_through_ladder(int color, int move, int pos);
+static int ladder_capture(int str, int *move);
+static int ladder_capturable(int pos, int color);
+static int no_escape_from_atari(int str);
+static int no_escape_from_ladder(int str);
+static int check_self_atari(int pos, int color_to_move);
+static int common_vulnerabilities(int a1, int a2, int b1, int b2, int color);
+static int common_vulnerability(int apos, int bpos, int color);
+
+/* Try to connect two strings. This function is called in a mutual
+ * recursion with recursive_disconnect2(). Return codes is identical to
+ * the tactical reading functions. For the has_passed parameter, see the
+ * documentation of recursive_disconnect2().
+ *
+ * The algorithm is
+ * 1. Check if the strings are trivially connected or disconnected or
+ *    the result is already cached.
+ * 2. Find connection moves.
+ * 3. Try one move at a time and call recursive_disconnect2() to see
+ *    whether we were successful.
+ * 4. If no move was found we assume success if the connection
+ *    distance was small and failure otherwise.
+ */
+static int
+recursive_connect2(int str1, int str2, int *move, int has_passed)
+{
+  int color = board[str1];
+  int moves[MAX_MOVES];
+  int num_moves;
+  int distance = FP(0.0);
+  int k;
+  int xpos;
+  int savemove = NO_MOVE;
+  int savecode = 0;
+  int tried_moves = 0;
+  int value;
+  
+  SETUP_TRACE_INFO2("recursive_connect2", str1, str2);
+
+  if (move)
+    *move = NO_MOVE;
+
+  nodes_connect++;
+  global_connection_node_counter++;
+  
+  if (board[str1] == EMPTY || board[str2] == EMPTY) {
+    SGFTRACE2(PASS_MOVE, 0, "one string already captured");
+    return 0;
+  }
+  
+  if (same_string(str1, str2)) {
+    SGFTRACE2(PASS_MOVE, WIN, "already connected");
+    return WIN;
+  }
+
+  if (nodes_connect > connection_node_limit) {
+    SGFTRACE2(PASS_MOVE, 0, "connection node limit reached");
+    return 0;
+  }
+  
+  if (stackp > connect_depth2) {
+    SGFTRACE2(PASS_MOVE, 0, "connection depth limit reached");
+    return 0;
+  }
+
+  str1 = find_origin(str1);
+  str2 = find_origin(str2);
+
+  if (stackp <= depth && !has_passed
+      && tt_get(&ttable, CONNECT, str1, str2, depth - stackp, NULL,
+               &value, NULL, &xpos) == 2) {
+    TRACE_CACHED_RESULT2(value, value, xpos);
+    if (value != 0)
+      if (move)
+       *move = xpos;
+
+    SGFTRACE2(xpos, value, "cached");
+    return value;
+  }
+  
+  if (trivial_connection(str1, str2, &xpos) == WIN) {
+    SGFTRACE2(xpos, WIN, "trivial connection");
+    READ_RETURN_CONN(CONNECT, str1, str2, depth - stackp, move, xpos, WIN);
+  }
+  
+  num_moves = find_string_connection_moves(str1, str2, color,
+                                          moves, &distance);
+  
+  for (k = 0; k < num_moves; k++) {
+    int ko_move;
+    xpos = moves[k];
+    
+    if (komaster_trymove(xpos, color, "recursive_connect2", str1,
+                        &ko_move, stackp <= ko_depth && savecode == 0)) {
+      tried_moves++;
+      if (!ko_move) {
+       int acode = recursive_disconnect2(str1, str2, NULL,
+                                        
+                                         has_passed);
+       popgo();
+       if (acode == 0) {
+         SGFTRACE2(xpos, WIN, "connection effective");
+         READ_RETURN_CONN(CONNECT, str1, str2, depth - stackp,
+                          move, xpos, WIN);
+       }
+       /* if the move works with ko we save it, then look for something
+        * better.
+        */
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, acode, xpos);
+      }
+      else {
+       if (recursive_disconnect2(str1, str2, NULL,
+                                
+                                 has_passed) != WIN) {
+         savemove = xpos;
+         savecode = KO_B;
+       }
+       popgo();
+      }
+    }
+  }
+
+  if (tried_moves == 0 && distance < FP(1.0)) {
+    SGFTRACE2(NO_MOVE, WIN, "no move, probably connected");
+    READ_RETURN_CONN(CONNECT, str1, str2, depth - stackp, move, NO_MOVE, WIN);
+  }
+  
+  if (savecode != 0) {
+    SGFTRACE2(savemove, savecode, "saved move");
+    READ_RETURN_CONN(CONNECT, str1, str2, depth - stackp,
+                    move, savemove, savecode);
+  }
+
+  SGFTRACE2(0, 0, NULL);
+  READ_RETURN_CONN(CONNECT, str1, str2, depth - stackp, move, NO_MOVE, 0);
+}
+
+
+/* Try to disconnect two strings. This function is called in a mutual
+ * recursion with recursive_connect2(). Return codes is identical to
+ * the tactical reading functions.
+ *
+ * The algorithm is
+ * 1. Check if the strings are trivially connected or disconnected or
+ *    the result is already cached.
+ * 2. Find disconnection moves.
+ * 3. Try one move at a time and call recursive_connect2() to see
+ *    whether we were successful.
+ * 4. If no move was found we assume failure if the connection
+ *    distance was small. Otherwise we pass and let
+ *    recursive_connect2() try to connect. However, if we already have
+ *    passed once we just declare success. Whether a pass already has
+ *    been made is indicated by the has_passed parameter.
+ */
+static int
+recursive_disconnect2(int str1, int str2, int *move, int has_passed)
+{
+  int color = board[str1];
+  int other = OTHER_COLOR(color);
+  int moves[MAX_MOVES];
+  int num_moves;
+  int distance = FP(0.0);
+  int k;
+  int xpos;
+  int savemove = NO_MOVE;
+  int savecode = 0;
+  int tried_moves = 0;
+  int attack_code1;
+  int attack_pos1;
+  int attack_code2;
+  int attack_pos2;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int value;
+
+  SETUP_TRACE_INFO2("recursive_disconnect2", str1, str2);
+  
+  nodes_connect++;
+  global_connection_node_counter++;
+
+  if (move)
+    *move = NO_MOVE;
+  
+  if (board[str1] == EMPTY || board[str2] == EMPTY) {
+    SGFTRACE2(PASS_MOVE, WIN, "one string already captured");
+    return WIN;
+  }
+
+  if (same_string(str1, str2)) {
+    SGFTRACE2(PASS_MOVE, 0, "already connected");
+    return 0;
+  }
+  
+  if (nodes_connect > connection_node_limit) {
+    SGFTRACE2(PASS_MOVE, WIN, "connection node limit reached");
+    return WIN;
+  }
+  
+  if (stackp > connect_depth2) {
+    SGFTRACE2(PASS_MOVE, WIN, "connection depth limit reached");
+    return WIN;
+  }
+
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  str1 = find_origin(str1);
+  str2 = find_origin(str2);
+
+  attack_code1 = attack(str1, &attack_pos1);
+  if (attack_code1 == WIN) {
+    sgf_dumptree = save_sgf_dumptree;
+    count_variations = save_count_variations;
+
+    SGFTRACE2(attack_pos1, WIN, "one string is capturable");
+    if (move)
+      *move = attack_pos1;
+
+    return WIN;
+  }
+
+  attack_code2 = attack(str2, &attack_pos2);
+  if (attack_code2 == WIN) {
+    sgf_dumptree = save_sgf_dumptree;
+    count_variations = save_count_variations;
+
+    SGFTRACE2(attack_pos2, WIN, "one string is capturable");
+    if (move)
+      *move = attack_pos2;
+
+    return WIN;
+  }
+
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  if (stackp <= depth
+      && tt_get(&ttable, DISCONNECT, str1, str2,
+               depth - stackp, NULL,
+               &value, NULL, &xpos) == 2) {
+    TRACE_CACHED_RESULT2(value, value, xpos);
+    if (value != 0)
+      if (move)
+       *move = xpos;
+
+    SGFTRACE2(xpos, value, "cached");
+    return value;
+  }
+
+  if (ladder_capture(str1, &xpos) == WIN) {
+    SGFTRACE2(xpos, WIN, "first string capturable");
+    READ_RETURN_CONN(DISCONNECT, str1, str2, depth - stackp, move, xpos, WIN);
+  }
+  
+  if (ladder_capture(str2, &xpos) == WIN) {
+    SGFTRACE2(xpos, WIN, "second string capturable");
+    READ_RETURN_CONN(DISCONNECT, str1, str2, depth - stackp, move, xpos, WIN);
+  }
+
+  num_moves = find_string_connection_moves(str1, str2, other,
+                                          moves, &distance);
+
+  if (attack_code1 != 0 && num_moves < MAX_MOVES) {
+    for (k = 0; k < num_moves; k++) {
+      if (moves[k] == attack_pos1)
+       break;
+    }
+
+    if (k == num_moves)
+      moves[num_moves++] = attack_pos1;
+  }
+
+  if (attack_code2 != 0 && num_moves < MAX_MOVES) {
+    for (k = 0; k < num_moves; k++) {
+      if (moves[k] == attack_pos2)
+       break;
+    }
+
+    if (k == num_moves)
+      moves[num_moves++] = attack_pos2;
+  }
+
+  for (k = 0; k < num_moves; k++) {
+    int ko_move;
+    xpos = moves[k];
+    
+    if (komaster_trymove(xpos, other, "recursive_disconnect2", str1,
+                        &ko_move, stackp <= ko_depth && savecode == 0)) {
+      tried_moves++;
+      if (!ko_move) {
+       int dcode = recursive_connect2(str1, str2, NULL,
+                                      has_passed);
+       popgo();
+       if (dcode == 0) {
+         SGFTRACE2(xpos, WIN, "disconnection effective");
+         READ_RETURN_CONN(DISCONNECT, str1, str2, depth - stackp,
+                          move, xpos, WIN);
+       }
+       /* if the move works with ko we save it, then look for something
+        * better.
+        */
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, dcode, xpos);
+      }
+      else {
+       if (recursive_connect2(str1, str2, NULL,
+                             
+                              has_passed) != WIN) {
+         savemove = xpos;
+         savecode = KO_B;
+       }
+       popgo();
+      }
+    }
+  }
+
+  if (tried_moves == 0
+      && distance >= FP(1.0)
+      && (has_passed
+         || !recursive_connect2(str1, str2, NULL, 1))) {
+    SGFTRACE2(NO_MOVE, WIN, "no move, probably disconnected");
+    READ_RETURN_CONN(DISCONNECT, str1, str2, depth - stackp,
+                    move, NO_MOVE, WIN);
+  }
+  
+  if (savecode != 0) {
+    SGFTRACE2(savemove, savecode, "saved move");
+    READ_RETURN_CONN(DISCONNECT, str1, str2, depth - stackp, 
+                    move, savemove, savecode);
+  }
+
+  SGFTRACE2(0, 0, NULL);
+  READ_RETURN_CONN(DISCONNECT, str1, str2, depth - stackp, move, NO_MOVE, 0);
+}
+
+
+/* Find moves to connect or disconnect the two strings str1 and str2.
+ * If color_to_move equals the color of the strings we search for
+ * connecting moves and otherwise disconnecting moves. The moves are
+ * returned in the moves[] array and the number of moves is the return
+ * value of the function. The parameter *total_distance is set to the
+ * approximated connection distance between the two strings. This is
+ * most useful when no moves are found. If *total_distance is small
+ * they are probably already effectively connected and if it is huge
+ * they are probably disconnected.
+ *
+ * The algorithm is to compute connection distances around each string
+ * and find points where the sum of the distances is small, or more
+ * exactly where the sum of the distances after the move would be
+ * small. This can be done with help of delta values returned together
+ * with distance values from the function
+ * compute_connection_distances(). This "distance after move" measure
+ * is modified with various bonuses and then used to order the found
+ * moves.
+ */
+static int
+find_connection_moves(int str1, int str2, int color_to_move,
+                     struct connection_data *conn1,
+                     struct connection_data *conn2,
+                     int max_dist1, int max_dist2,
+                     int moves[MAX_MOVES], int total_distance,
+                     int cutoff)
+{
+  int color = board[str1];
+  int other = OTHER_COLOR(color);
+  int connect_move = (color_to_move == color);
+  int r;
+  int distances[MAX_MOVES];
+  int num_moves = 0;
+  int acode = 0;
+  int attack_move = NO_MOVE;
+  int dcode = 0;
+  int defense_move = NO_MOVE;
+  int k;
+  int i, j;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int distance_limit;
+
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * tactical reading moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  /* Loop through the points with smallish distance from str1 and look
+   * for ones also having a small distance to str2.
+   */
+  for (r = 0; r < conn1->queue_end; r++) {
+    int pos = conn1->queue[r];
+    int dist1 = conn1->distances[pos];
+    int deltadist1 = conn1->deltas[pos];
+    int dist2 = conn2->distances[pos];
+    int deltadist2 = conn2->deltas[pos];
+    int d1;
+    int d2;
+    int distance;
+    
+    if (dist1 - deltadist1 + dist2 - deltadist2 > FP(2.5)
+       || dist1 > max_dist1 + FP(0.2)
+       || dist2 > max_dist2 + FP(0.2))
+      continue;
+
+    if (verbose > 0)
+      gprintf("%oMove %1m, (%f, %f, %f, %f)\n", pos, 
+             FIXED_TO_FLOAT(dist1), FIXED_TO_FLOAT(deltadist1), 
+             FIXED_TO_FLOAT(dist2), FIXED_TO_FLOAT(deltadist2));
+
+    /* The basic quality of the move is the sum of the distances to
+     * each string minus the two delta values. This distance value
+     * will subsequently be modified to take other factors into
+     * account.
+     */
+    d1 = dist1 - deltadist1;
+    d2 = dist2 - deltadist2;
+    distance = d1 + d2;
+    if (verbose > 0)
+      gprintf("%o  %f, primary distance\n", FIXED_TO_FLOAT(distance));
+    
+    /* Bonus if d1 and d2 are well balanced. */
+    if ((3 * d1) / 2 > d2 && (3 * d2) / 2 > d1) {
+      distance -= FP(0.1);
+      if (verbose > 0)
+       gprintf("%o  -0.1, well balanced\n");
+    }
+
+    /* Check whether the move is "between" the two strings. */
+    if (conn1->coming_from[pos] != NO_MOVE
+       && conn1->coming_from[pos] == conn2->coming_from[pos]) {
+      if (verbose > 0)
+       gprintf("%o  discarded, not between strings\n");
+      continue;
+    }
+    
+    if (board[pos] == EMPTY) {
+      if (check_self_atari(pos, color_to_move)) {
+       ADD_CANDIDATE_MOVE(pos, distance, moves, distances, num_moves);
+      }
+      else {
+       if (verbose > 0)
+         gprintf("%o  discarded, self atari\n");
+      }
+    }
+    else if (board[pos] == other) {
+      attack_and_defend(pos, &acode, &attack_move, &dcode, &defense_move);
+      if (verbose > 0)
+       gprintf("%o  attack with code %d at %1m, defense with code %d at %1m\n",
+               acode, attack_move, dcode, defense_move);
+      
+      if (connect_move && acode != 0) {
+       if (dcode == 0) {
+         distance += FP(0.5);
+         if (verbose > 0)
+           gprintf("%o  +0.5, no defense\n");
+       }
+       else {
+         if (conn1->distances[attack_move]
+             + conn2->distances[attack_move] > dist1 + dist2) {
+           distance += FP(0.5);
+           if (verbose > 0)
+             gprintf("%o  +0.5, attack point not on shortest path\n");
+         }
+       }
+       ADD_CANDIDATE_MOVE(attack_move, distance - FP(0.15), moves, distances,
+                          num_moves);
+       if (verbose > 0)
+         gprintf("%o  -0.15 at %1m, capturing a string\n", attack_move);
+      }
+      else if (!connect_move && acode != 0 && dcode != 0) {
+       ADD_CANDIDATE_MOVE(defense_move, distance - FP(0.5), moves, distances,
+                          num_moves);
+       if (verbose > 0)
+         gprintf("%o  -0.5 at %1m, defending a string\n", defense_move);
+      }
+    }
+    else if (board[pos] == color) {
+      /* Check whether there are common vulnerable points. */
+      for (k = 0; k < 4; k++) {
+       int apos, bpos;
+       if (k & 1)
+         apos = conn1->vulnerable1[pos];
+       else 
+         apos = conn1->vulnerable2[pos];
+
+       if (k & 2)
+         bpos = conn2->vulnerable1[pos];
+       else 
+         bpos = conn2->vulnerable2[pos];
+
+       if (common_vulnerability(apos, bpos, color)) {
+         if (check_self_atari(apos, color_to_move)) {
+           ADD_CANDIDATE_MOVE(apos, distance, moves, distances, num_moves);
+           if (verbose > 0)
+             gprintf("%o  +0.0 at %1m, vulnerability\n", apos);
+         }
+
+         if (bpos != apos
+             && check_self_atari(bpos, color_to_move)) {
+           ADD_CANDIDATE_MOVE(bpos, distance, moves, distances, num_moves);
+           if (verbose > 0)
+             gprintf("%o  +0.0 at %1m, vulnerability\n", bpos);
+         }
+       }
+      } 
+    }
+  }
+
+  /* Modify the distance values for the moves with various bonuses. */
+  for (r = 0; r < num_moves; r++) {
+    int move = moves[r];
+    int adjacent_to_attacker = 0;
+    int bonus_given = 0;
+
+    for (k = 0; k < 4; k++) {
+      int pos = move + delta[k];
+      if (board[pos] == other) {
+       adjacent_to_attacker = 1;
+       distances[r] -= FP(0.15);
+       if (verbose > 0)
+         gprintf("%o%1M -0.15, adjacent to attacker string\n", move);
+       if (countlib(pos) <= 2) {
+         distances[r] -= FP(0.2);
+         if (verbose > 0)
+           gprintf("%o%1M -0.2, adjacent to attacker string with at most two liberties\n", move);
+         if ((connect_move || !bonus_given)
+             && (conn1->distances[move] - conn1->deltas[move] <= FP(0.5)
+                 || conn1->distances[pos] - conn1->deltas[pos] <= FP(0.5))
+             && (conn2->distances[move] - conn2->deltas[move] <= FP(0.5)
+                 || conn2->distances[pos] - conn2->deltas[pos] <= FP(0.5))
+             && conn1->distances[pos] < total_distance
+             && conn2->distances[pos] < total_distance) {
+           bonus_given = 1;
+           distances[r] -= FP(0.7);
+           if (verbose > 0)
+             gprintf("%o%1M -0.7, capture or atari of immediately connecting string\n", move);
+         }
+       }
+      }
+      else if (board[pos] == color) {
+       if (countlib(pos) <= 2) {
+         distances[r] -= FP(0.2);
+         if (verbose > 0)
+           gprintf("%o%1M -0.2, adjacent to defender string with at most two liberties\n", move);
+       }
+       /* The code above (in the 'board[pos] == other' branch) makes
+        * perfect sense for the defender, but has a tendency to
+        * overestimate solid connection defenses when the attacker's
+        * stones happen to be in atari, specially when capturing some
+        * defender stones instead would help just as well, if not better.
+        * The following code compensates in such kind of situations.
+        * See connection:111 and gunnar:53 for example.
+        */
+       if (!connect_move && countlib(pos) == 1
+           /* let's avoid ko and snapbacks */
+           && accuratelib(move, other, 2, NULL) > 1) {
+         int adjs[MAXCHAIN];
+         int bonus;
+         bonus = FP(0.1) * chainlinks2(pos, adjs, 2);
+         bonus += FP(0.5) * chainlinks2(pos, adjs, 1);
+         distances[r] -= bonus;
+         if (verbose > 0)
+           gprintf("%o%1M -%f, capture of defender string\n",
+                   move, FIXED_TO_FLOAT(bonus));
+       }
+      }
+    }
+    if (adjacent_to_attacker
+       && !connect_move
+       && is_edge_vertex(move)) {
+      distances[r] -= FP(0.1);
+      if (verbose > 0)
+       gprintf("%o%1M -0.1, disconnect move on edge\n", move);
+    }
+
+    if (ladder_capturable(move, color_to_move)) {
+      distances[r] += FP(0.3);
+      if (verbose > 0)
+       gprintf("%o%1M +0.3, can be captured in a ladder\n", move);
+    }
+
+    /* Bonus for moves adjacent to endpoint strings with 3 liberties.
+     * Neighbor strings with less than 3 liberties have already
+     * generated a bonus above.
+     */
+    if ((liberty_of_string(move, str1)
+        && countlib(str1) == 3)
+       || (ON_BOARD(str2) && liberty_of_string(move, str2)
+           && countlib(str2) == 3)) {
+      distances[r] -= FP(0.1);
+      if (verbose > 0)
+       gprintf("%o%1M -0.1, liberty of endpoint string with 3 libs\n", move);
+    }
+  }
+
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  /* Now sort the moves.  We use selection sort since this array will
+   * probably never be more than 10 moves long.  In this case, the
+   * overhead imposed by quicksort will probably overshadow the gains
+   * given by the O(n*log(n)) behaviour over the O(n^2) behaviour of
+   * selection sort.
+   */
+  for (i = 0; i < num_moves; i++) {
+    /* Find the move with the smallest distance. */
+    int mindistance = distances[i];
+    int min_at = i;
+    for (j = i + 1; j < num_moves; j++) {
+      if (distances[j] < mindistance) {
+       mindistance = distances[j];
+       min_at = j;
+      }
+    }
+
+    /* Now exchange the move at i with the move at min_at.
+     * Don't forget to exchange the distances as well.
+     */
+    if (min_at != i) {
+      int temp = moves[i];
+      int tempmin = distances[i];
+
+      moves[i] = moves[min_at];
+      distances[i] = distances[min_at];
+
+      moves[min_at] = temp;
+      distances[min_at] = tempmin;
+    }
+  }
+
+  if (verbose > 0) {
+    gprintf("%oSorted moves:\n");
+    for (i = 0; i < num_moves; i++)
+      gprintf("%o%1M %f\n", moves[i], FIXED_TO_FLOAT(distances[i]));
+  }
+
+  if (sgf_dumptree) {
+    char buf[500];
+    char *pos;
+    int chars;
+    sprintf(buf, "Move order for %sconnect: %n",
+           connect_move ? "" : "dis", &chars);
+    pos = buf + chars;
+    for (i = 0; i < num_moves; i++) {
+      sprintf(pos, "%c%d (%4.2f) %n", J(moves[i]) + 'A' + (J(moves[i]) >= 8),
+             board_size - I(moves[i]), FIXED_TO_FLOAT(distances[i]),
+             &chars);
+      pos += chars;
+    }
+    if (cutoff < HUGE_CONNECTION_DISTANCE) {
+      sprintf(pos, "(cutoff %f)%n", FIXED_TO_FLOAT(cutoff), &chars);
+      pos += chars;
+    }
+    sgftreeAddComment(sgf_dumptree, buf);
+  }
+
+  if (num_moves == 0)
+    return num_moves;
+
+  /* Filter out moves with distance at least 1.5 more than the best
+   * move, or with distance higher than the cutoff specified.
+   *
+   * In order to further reduce the branching factor, a decreasing
+   * cutoff is applied between candidates. For instance, in this case
+   *   1. d    2. d+0.5   3. d+1.0   4. d+1.5
+   * the 4th candidate will be tested, while in following one
+   *   1. d    2. d+0.1   3. d+0.2   4. d+1.5
+   * it will be discarded.
+   */
+  if (num_moves <= 1 || !is_ko(moves[0], color_to_move, NULL))
+    distance_limit = distances[0] + FP(1.5);
+  else
+    distance_limit = distances[1] + FP(1.5);
+
+  /* Special case: If the second best move has a distance less than 1,
+   * include it if even if the best move has a very low distance.
+   */
+  if (num_moves > 1
+      && distances[1] < FP(1.0)
+      && distances[1] > distance_limit)
+    distance_limit = distances[1];
+  
+  for (r = 0; r < num_moves; r++) {
+    if (r > 1
+       && distances[r] > distances[r-1]
+       && distances[r] - distances[r-1] > (8 - r) * FP(0.2))
+      break;
+    if (distances[r] > distance_limit
+       || distances[r] > cutoff)
+      break;
+  }
+  num_moves = r;
+
+  return num_moves;
+}
+
+static int
+find_string_connection_moves(int str1, int str2, int color_to_move,
+                            int moves[MAX_MOVES], int *total_distance)
+{
+  struct connection_data conn1;
+  struct connection_data conn2;
+  int max_dist1;
+  int max_dist2;
+  int num_moves;
+  int lib;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * tactical reading moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  compute_connection_distances(str1, str2, FP(3.051), &conn1, 1);
+  compute_connection_distances(str2, str1, FP(3.051), &conn2, 1);
+
+  if (findlib(str1, 1, &lib) == 1) {
+    conn1.distances[lib] = 0;
+    conn1.coming_from[lib] = NO_MOVE;
+    conn2.distances[lib] = conn2.distances[str1];
+    conn2.coming_from[lib] = conn1.coming_from[str1];
+  }
+
+  if (findlib(str2, 1, &lib) == 1) {
+    conn2.distances[lib] = 0;
+    conn1.distances[lib] = conn1.distances[str2];
+  }
+
+  max_dist1 = conn1.distances[str2];
+  max_dist2 = conn2.distances[str1];
+
+  *total_distance = gg_min(max_dist1, max_dist2);
+
+  if (verbose > 0) {
+    gprintf("%oVariation %d\n", save_count_variations);
+    dump_stack();
+    showboard(0);
+    print_connection_distances(&conn1);
+    print_connection_distances(&conn2);
+  }
+
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  num_moves = find_connection_moves(str1, str2, color_to_move,
+                                   &conn1, &conn2, max_dist1, max_dist2,
+                                   moves, *total_distance,
+                                   HUGE_CONNECTION_DISTANCE);
+  return num_moves;
+}
+
+
+static void
+add_to_start_queue(int pos, int dist, struct connection_data *conn)
+{
+  conn->queue[conn->queue_end++] = pos;
+  conn->distances[pos] = dist;
+  conn->deltas[pos] = dist;
+  conn->coming_from[pos] = NO_MOVE;
+  conn->vulnerable1[pos] = NO_MOVE;
+  conn->vulnerable2[pos] = NO_MOVE;
+}
+
+
+void
+init_connection_data(int color, const signed char goal[BOARDMAX],
+                    int target, int cutoff,
+                    struct connection_data *conn, int speculative)
+{
+  int pos;
+  signed char mark[BOARDMAX];
+
+  memset(mark, 0, BOARDMAX);
+  VALGRIND_MAKE_WRITABLE(conn, sizeof(conn));
+  clear_connection_data(conn);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (goal[pos]) {
+      if (board[pos] == color) {
+       int origin = find_origin(pos);
+
+       if (!mark[origin]) {
+         add_to_start_queue(origin, FP(0.0), conn);
+         mark[origin] = 1;
+       }
+      }
+      else if (board[pos] == EMPTY)
+        add_to_start_queue(pos, FP(1.0), conn);
+    }
+  }
+
+  conn->target = target;
+  conn->cutoff_distance = cutoff;
+  conn->speculative = speculative;
+}
+
+static int
+find_break_moves(int str, const signed char goal[BOARDMAX], int color_to_move,
+                int moves[MAX_MOVES], int *total_distance)
+{
+  struct connection_data conn1;
+  struct connection_data conn2;
+  int max_dist1 = HUGE_CONNECTION_DISTANCE;
+  int max_dist2;
+  int num_moves;
+  int str2 = NO_MOVE;
+  int color = board[str];
+  int lib;
+  int k;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * tactical reading moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  compute_connection_distances(str, NO_MOVE, FP(2.501), &conn1, 1);
+  for (k = 0; k < conn1.queue_end; k++)
+    if (board[conn1.queue[k]] == color) {
+      int stones[MAX_BOARD * MAX_BOARD];
+      int num_stones = findstones(conn1.queue[k],
+                                 MAX_BOARD * MAX_BOARD, stones);
+      int i;
+      for (i = 0; i < num_stones; i++) {
+       if (goal[stones[i]]) {
+         str2 = find_origin(stones[i]);
+         TRACE("%oUsing %1m as secondary target.\n", str2);
+         mark_string(str2, breakin_shadow, 1);
+         break;
+       }
+      }
+      if (i < num_stones)
+       break;
+    }
+
+  /* Add all stones in the goal to the queue. */
+  init_connection_data(color, goal, str, FP(2.501), &conn2, 1);
+
+  for (k = 0; k < conn2.queue_end; k++) {
+    if (max_dist1 > conn1.distances[conn2.queue[k]])
+      max_dist1 = conn1.distances[conn2.queue[k]];
+  }
+
+  spread_connection_distances(color, &conn2);
+
+  if (findlib(str, 1, &lib) == 1) {
+    conn1.distances[lib] = 0;
+    conn1.coming_from[lib] = NO_MOVE;
+    conn2.distances[lib] = conn2.distances[str];
+    conn2.coming_from[lib] = conn1.coming_from[str];
+  }
+
+  max_dist2 = conn2.distances[str];
+  *total_distance = gg_min(max_dist1, max_dist2);
+
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  if (verbose > 0) {
+    gprintf("%oVariation %d\n", save_count_variations);
+    dump_stack();
+    showboard(0);
+    print_connection_distances(&conn1);
+    print_connection_distances(&conn2);
+  }
+
+  {
+    int cutoff = HUGE_CONNECTION_DISTANCE;
+    if (breakin_depth - stackp <= 5)
+      cutoff = FP(1.101) + (breakin_depth - stackp) * FP(0.15);
+    num_moves = find_connection_moves(str, str2, color_to_move,
+                                     &conn1, &conn2, max_dist1, max_dist2,
+                                     moves, *total_distance, cutoff);
+  }
+
+  if (color_to_move != board[str]) {
+    int move;
+    if (num_moves < MAX_MOVES
+       && ON_BOARD(str2)
+       && ladder_capture(str2, &move)) {
+      moves[num_moves++] = move;
+    }
+  }
+
+  for (k = 0; k < num_moves; k++)
+    breakin_shadow[moves[k]] = 1;
+
+  return num_moves;
+}
+
+
+/* Can (str) connect to goal[] if the other color moves first? */
+static int
+recursive_break(int str, const signed char goal[BOARDMAX], int *move,
+                 int has_passed,
+               Hash_data *goal_hash)
+{
+  int color = board[str];
+  int moves[MAX_MOVES];
+  int num_moves;
+  int distance = FP(0.0);
+  int k;
+  int xpos;
+  int savemove = NO_MOVE;
+  int savecode = 0;
+  int tried_moves = 0;
+  int retval;
+  
+  SETUP_TRACE_INFO("recursive_break", str);
+
+  if (move)
+    *move = NO_MOVE;
+
+  nodes_connect++;
+  global_connection_node_counter++;
+  
+  if (board[str] == EMPTY) {
+    SGFTRACE(PASS_MOVE, 0, "one string already captured");
+    return 0;
+  }
+  
+  if (nodes_connect > breakin_node_limit) {
+    SGFTRACE(PASS_MOVE, 0, "connection node limit reached");
+    return 0;
+  }
+  
+  if (stackp > breakin_depth) {
+    SGFTRACE(PASS_MOVE, 0, "connection depth limit reached");
+    return 0;
+  }
+
+  str = find_origin(str);
+  if (stackp <= depth && !has_passed
+      && tt_get(&ttable, BREAK_IN, str, NO_MOVE, depth - stackp, goal_hash,
+               &retval, NULL, &xpos) == 2) {
+    /* FIXME: Use move for move ordering if tt_get() returned 1 */
+    TRACE_CACHED_RESULT(retval, xpos);
+    SGFTRACE(xpos, retval, "cached");
+    if (move)
+      *move = xpos;
+    return retval;
+  }
+  
+#if 0
+  if (trivial_connection(str1, str2, &xpos) == WIN) {
+    SGFTRACE2(xpos, WIN, "trivial connection");
+    READ_RETURN_HASH(BREAK_IN, str, depth - stackp, goal_hash,
+                    move, xpos, WIN);
+  }
+#endif
+  
+  num_moves = find_break_moves(str, goal, color, moves, &distance);
+  
+  for (k = 0; k < num_moves; k++) {
+    int ko_move;
+    xpos = moves[k];
+    
+    if (komaster_trymove(xpos, color, "recursive_break", str,
+                        &ko_move, stackp <= ko_depth && savecode == 0)) {
+      tried_moves++;
+      if (!ko_move) {
+       int acode = recursive_block(str, goal, NULL, has_passed, goal_hash);
+       popgo();
+       if (acode == 0) {
+         SGFTRACE(xpos, WIN, "break effective");
+         READ_RETURN_HASH(BREAK_IN, str, depth - stackp, goal_hash,
+                          move, xpos, WIN);
+       }
+       /* if the move works with ko we save it, then look for something
+        * better.
+        */
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, acode, xpos);
+      }
+      else {
+       if (recursive_block(str, goal, NULL, has_passed, goal_hash) != WIN) {
+         savemove = xpos;
+         savecode = KO_B;
+       }
+       popgo();
+      }
+    }
+  }
+
+  /* Because of a couple differences between the break-in and the
+   * connection reading code, we can't afford to be as optimistic
+   * as in recursive_connect2() here. See nando:32
+   */
+  if (tried_moves == 0 && distance < FP(0.89)) {
+    SGFTRACE(NO_MOVE, WIN, "no move, probably connected");
+    READ_RETURN_HASH(BREAK_IN, str, depth - stackp, goal_hash,
+                    move, NO_MOVE, WIN);
+  }
+  
+  if (savecode != 0) {
+    SGFTRACE(savemove, savecode, "saved move");
+    READ_RETURN_HASH(BREAK_IN, str, depth - stackp, goal_hash,
+                    move, savemove, savecode);
+  }
+
+  SGFTRACE(0, 0, NULL);
+  READ_RETURN_HASH(BREAK_IN, str, depth - stackp, goal_hash, move, NO_MOVE, 0);
+}
+
+
+/* Can (str) connect to goal[] if the other color moves first? */
+static int
+recursive_block(int str, const signed char goal[BOARDMAX], int *move,
+               int has_passed, Hash_data *goal_hash)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int moves[MAX_MOVES];
+  int num_moves;
+  int distance = FP(0.0);
+  int k;
+  int xpos;
+  int savemove = NO_MOVE;
+  int savecode = 0;
+  int tried_moves = 0;
+  int retval;
+  SETUP_TRACE_INFO("recursive_block", str);
+  
+  nodes_connect++;
+  global_connection_node_counter++;
+
+  if (move)
+    *move = NO_MOVE;
+  
+  if (board[str] == EMPTY) {
+    SGFTRACE(PASS_MOVE, WIN, "string already captured");
+    return WIN;
+  }
+
+#if 0
+  if (same_string(str1, str2)) {
+    SGFTRACE(PASS_MOVE, 0, "already connected");
+    return 0;
+  }
+#endif
+  
+  if (nodes_connect > breakin_node_limit) {
+    SGFTRACE(PASS_MOVE, WIN, "connection node limit reached");
+    return WIN;
+  }
+  
+  if (stackp > breakin_depth) {
+    SGFTRACE(PASS_MOVE, WIN, "connection depth limit reached");
+    return WIN;
+  }
+  
+  str = find_origin(str);
+  if (stackp <= depth
+      && tt_get(&ttable, BLOCK_OFF, str, NO_MOVE,
+               depth - stackp, goal_hash, &retval, NULL, &xpos) == 2) {
+    TRACE_CACHED_RESULT(retval, xpos);
+    SGFTRACE(xpos, retval, "cached");
+    if (move)
+      *move = xpos;
+    return retval;
+  }
+
+  if (ladder_capture(str, &xpos) == WIN) {
+    SGFTRACE(xpos, WIN, "string capturable");
+    READ_RETURN_HASH(BLOCK_OFF, str, depth - stackp, goal_hash,
+                    move, xpos, WIN);
+  }
+  
+  num_moves = find_break_moves(str, goal, other, moves, &distance);
+  
+  for (k = 0; k < num_moves; k++) {
+    int ko_move;
+    xpos = moves[k];
+    
+    if (komaster_trymove(xpos, other, "recursive_block", str,
+                        &ko_move, stackp <= ko_depth && savecode == 0)) {
+      tried_moves++;
+      if (!ko_move) {
+       int dcode = recursive_break(str, goal, NULL, has_passed, goal_hash);
+       popgo();
+       if (dcode == 0) {
+         SGFTRACE(xpos, WIN, "block effective");
+         READ_RETURN_HASH(BLOCK_OFF, str, depth - stackp, goal_hash,
+                          move, xpos, WIN);
+       }
+       /* if the move works with ko we save it, then look for something
+        * better.
+        */
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, dcode, xpos);
+      }
+      else {
+       if (recursive_break(str, goal, NULL,
+                           has_passed, goal_hash) != WIN) {
+         savemove = xpos;
+         savecode = KO_B;
+       }
+       popgo();
+      }
+    }
+  }
+
+  if (tried_moves == 0
+      && distance >= FP(1.0)
+      && (has_passed
+         || !recursive_break(str, goal, NULL, 1,
+                             goal_hash))) {
+    SGFTRACE(NO_MOVE, WIN, "no move, probably disconnected");
+    READ_RETURN_HASH(BLOCK_OFF, str, depth - stackp, goal_hash,
+                    move, NO_MOVE, WIN);
+  }
+  
+  if (savecode != 0) {
+    SGFTRACE(savemove, savecode, "saved move");
+    READ_RETURN_HASH(BLOCK_OFF, str, depth - stackp, goal_hash,
+                    move, savemove, savecode);
+  }
+
+  SGFTRACE(0, 0, NULL);
+  READ_RETURN_HASH(BLOCK_OFF, str, depth - stackp, goal_hash,
+                  move, NO_MOVE, 0);
+}
+
+
+
+/* Externally callable frontend to recursive_break.
+ * Returns WIN if (str) can connect to the area goal[] (which may or may
+ * not contain stones), if he gets the first move.
+ */
+int
+break_in(int str, const signed char goal[BOARDMAX], int *move)
+{
+  int dummy_move;
+  int save_verbose;
+  int result;
+  int reading_nodes_when_called = get_reading_node_counter();
+  double start = 0;
+  int tactical_nodes;
+  Hash_data goal_hash = goal_to_hashvalue(goal);
+
+  if (move == NULL)
+    move = &dummy_move;
+  
+  nodes_connect = 0;
+  *move = PASS_MOVE;
+  
+  if (board[str] == EMPTY)
+    return 0;
+  str = find_origin(str);
+
+  if (search_persistent_breakin_cache(BREAK_IN, str, &goal_hash,
+                                     breakin_node_limit, &result, move)) {
+    if (debug & DEBUG_BREAKIN) {
+      gprintf("Break-in from %1m to:\n", str);
+      goaldump(goal);
+      gprintf("Result cached: %s %1m\n", result_to_string(result), *move);
+    }
+    return result;
+  }
+
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+  start = gg_cputime();
+  memcpy(breakin_shadow, goal, sizeof(breakin_shadow));
+  result = recursive_break(str, goal, move, 0, &goal_hash);
+  verbose = save_verbose;
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+  if (debug & DEBUG_BREAKIN) {
+    gprintf("%obreak_in    %1M, result %s %1M (%d, %d nodes, %f seconds)\n",
+           str, result_to_string(result), *move,
+           nodes_connect, tactical_nodes, gg_cputime() - start);
+    goaldump(goal);
+    dump_stack();
+  }
+  if (0) {
+    gprintf("%obreak_in %1m %d %1m ", str, result, *move);
+    dump_stack();
+    goaldump(goal);
+  }
+  store_persistent_breakin_cache(BREAK_IN, str, &goal_hash, result, *move,
+                                tactical_nodes, breakin_node_limit,
+                                breakin_shadow);
+
+  return result;
+}
+
+
+/* Externably callable frontend to recursive_block_off.
+ * Returns WIN if (str) cannot connect to the area goal[] (which may or may
+ * not contain stones), if the other color moves first.
+ */
+int
+block_off(int str, const signed char goal[BOARDMAX], int *move)
+{
+  int dummy_move;
+  int result;
+  int save_verbose;
+  int reading_nodes_when_called = get_reading_node_counter();
+  double start = 0;
+  int tactical_nodes;
+  Hash_data goal_hash = goal_to_hashvalue(goal);
+  
+  if (move == NULL)
+    move = &dummy_move;
+  
+  nodes_connect = 0;
+  *move = PASS_MOVE;
+  
+  str = find_origin(str);
+  if (search_persistent_breakin_cache(BLOCK_OFF, str, &goal_hash,
+                                     breakin_node_limit, &result, move)) {
+    if (debug & DEBUG_BREAKIN) {
+      gprintf("Blocking off %1m from:\n", str);
+      goaldump(goal);
+      gprintf("Result cached: %s %1m\n", result_to_string(result), *move);
+    }
+    return result;
+  }
+
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+  start = gg_cputime();
+  memcpy(breakin_shadow, goal, sizeof(breakin_shadow));
+  result = recursive_block(str, goal, move, 0, &goal_hash);
+  verbose = save_verbose;
+  tactical_nodes = get_reading_node_counter() - reading_nodes_when_called;
+
+  if (debug & DEBUG_BREAKIN) {
+    gprintf("%oblock_off %1m, result %s %1m (%d, %d nodes, %f seconds)\n",
+           str, result_to_string(result), *move,
+           nodes_connect, tactical_nodes, gg_cputime() - start);
+    goaldump(goal);
+    dump_stack();
+  }
+  if (0) {
+    gprintf("%oblock_off %1m %d %1m ", str, result, *move);
+    goaldump(goal);
+    dump_stack();
+  }
+  store_persistent_breakin_cache(BLOCK_OFF, str, &goal_hash, result, *move,
+                                tactical_nodes, breakin_node_limit,
+                                breakin_shadow);
+
+  return result;
+}
+
+
+/* Store a possibly expensive decision for later evaluation. The
+ * data getting stored should be self-explanatory.
+ * The job of the helper function is to
+ * - decide whether the spreading step will be allowed (typically
+ *   depending on a latter)
+ * - add the relevant positions to the connection queue in case the test
+ *   was successful.
+ *
+ * Elements in the heap are kept sorted according to smallest distance.
+ */
+static void
+push_connection_heap_entry(struct connection_data *conn, int distance,
+                          int coming_from, int target,
+                          connection_helper_fn_ptr helper)
+{
+  int k;
+  int parent;
+  struct heap_entry *new_entry = &conn->heap_data[conn->heap_data_size];
+
+  gg_assert(conn->heap_data_size < 4 * BOARDMAX);
+  gg_assert(conn->heap_size < BOARDMAX);
+
+  /* Create new heap entry. */
+  new_entry->distance   = distance;
+  new_entry->coming_from = coming_from;
+  new_entry->target     = target;
+  new_entry->helper     = helper;
+
+  /* And insert it into the heap. */
+  conn->heap_data_size++;
+
+  for (k = conn->heap_size++; k > 0; k = parent) {
+    parent = (k - 1) / 2;
+    if (conn->heap[parent]->distance <= distance)
+      break;
+
+    conn->heap[k] = conn->heap[parent];
+  }
+
+  conn->heap[k] = new_entry;
+}
+
+
+/* Delete the first entry from the heap. */
+static void
+pop_connection_heap_entry(struct connection_data *conn)
+{
+  int k;
+  int child;
+
+  conn->heap_size--;
+  for (k = 0; 2 * k + 1 < conn->heap_size; k = child) {
+    child = 2 * k + 1;
+    if (conn->heap[child]->distance > conn->heap[child + 1]->distance)
+      child++;
+    if (conn->heap[child]->distance >= conn->heap[conn->heap_size]->distance)
+      break;
+
+    conn->heap[k] = conn->heap[child];
+  }
+
+  conn->heap[k] = conn->heap[conn->heap_size];
+}
+
+
+#define ENQUEUE(conn, from, pos, dist, delta, v1, v2)                  \
+  do {                                                                 \
+    if (dist < conn->distances[pos]) {                                 \
+      if (conn->distances[pos] == HUGE_CONNECTION_DISTANCE)            \
+       conn->queue[conn->queue_end++] = pos;                           \
+      conn->distances[pos]   = dist;                                   \
+      conn->deltas[pos]      = delta;                                  \
+      conn->coming_from[pos] = from;                                   \
+      conn->vulnerable1[pos] = v1;                                     \
+      conn->vulnerable2[pos] = v2;                                     \
+    }                                                                  \
+  } while(0)
+
+#define ENQUEUE_STONE(conn, from, pos, dist, delta, v1, v2)            \
+  do {                                                                 \
+    int origin = find_origin(pos);                                     \
+    if (dist < conn->distances[origin]) {                              \
+      if (conn->distances[origin] == HUGE_CONNECTION_DISTANCE)         \
+       conn->queue[conn->queue_end++] = origin;                        \
+      conn->distances[origin]  = dist;                                 \
+      conn->deltas[origin]     = delta;                                \
+      conn->coming_from[origin] = from;                                        \
+      conn->vulnerable1[origin] = v1;                                  \
+      conn->vulnerable2[origin] = v2;                                  \
+      if (origin == conn->target && dist < conn->cutoff_distance)      \
+       conn->cutoff_distance = dist - FP(0.0001);                      \
+    }                                                                  \
+  } while(0)
+
+
+static void
+case_6_7_helper(struct connection_data *conn, int color)
+{
+  struct heap_entry *data = conn->heap[0];
+  int pos = data->coming_from;
+  int apos = data->target;
+  int other = OTHER_COLOR(color);
+
+  if (ladder_capturable(apos, other))
+    ENQUEUE(conn, pos, apos, data->distance, FP(0.6), apos, NO_MOVE);
+  else {
+    int this_delta 
+      = FP(0.85) + FP(0.05) * gg_min(approxlib(apos, other, 5, NULL), 5);
+    ENQUEUE(conn, pos, apos, data->distance + this_delta - FP(0.6), this_delta,
+           NO_MOVE, NO_MOVE);
+  }
+}
+
+
+static void
+case_9_10_helper(struct connection_data *conn, int color)
+{
+  struct heap_entry *data = conn->heap[0];
+  int pos = data->coming_from;
+  int apos = data->target;
+
+  UNUSED(color);
+
+  if (no_escape_from_ladder(apos))
+    ENQUEUE_STONE(conn, pos, apos, data->distance, FP(0.3), NO_MOVE, NO_MOVE);
+  else {
+    if (conn->speculative) {
+      ENQUEUE_STONE(conn, pos, apos, data->distance + FP(0.7), FP(1.0),
+                   NO_MOVE, NO_MOVE);
+    }
+    else {
+      ENQUEUE_STONE(conn, pos, apos, data->distance + FP(0.8), FP(1.1),
+                   NO_MOVE, NO_MOVE);
+    }
+  }
+}
+
+
+static void
+case_16_17_18_helper(struct connection_data *conn, int color)
+{
+  struct heap_entry *data = conn->heap[0];
+  int pos = data->coming_from;
+  int bpos = data->target;
+  int apos = SOUTH(gg_min(pos, bpos));
+  int gpos = NORTH(gg_max(pos, bpos));
+  int other = OTHER_COLOR(color);
+
+  if (board[apos] == EMPTY
+      && does_secure_through_ladder(color, bpos, apos))
+    ENQUEUE(conn, pos, bpos, data->distance, FP(1.0), apos, NO_MOVE);
+  else if (board[gpos] == EMPTY
+          && does_secure_through_ladder(color, bpos, gpos))
+    ENQUEUE(conn, pos, bpos, data->distance, FP(1.0), gpos, NO_MOVE);
+  else if (conn->distances[bpos] > data->distance + FP(0.3)) {
+    if (board[apos] == EMPTY
+       && board[gpos] == other
+       && countlib(gpos) <= 3)
+      ENQUEUE(conn, pos, bpos, data->distance + FP(0.3), FP(1.0),
+             apos, NO_MOVE);
+    else if (board[gpos] == EMPTY
+            && board[apos] == other
+            && countlib(apos) <= 3)
+      ENQUEUE(conn, pos, bpos, data->distance + FP(0.3), FP(1.0),
+             gpos, NO_MOVE);
+    else
+      ENQUEUE(conn, pos, bpos, data->distance + FP(0.6), FP(0.9),
+             NO_MOVE, NO_MOVE);
+  }
+}
+
+
+/* Do the real work of computing connection distances.
+ * This is a rough approximation of the number of moves required to secure
+ * a connection. We also compute delta values which are intended to tell how
+ * big difference a particular move locally has on the connection
+ * distance. However, remember that this is only a heuristic with the
+ * sole purpose of helping to find relevant moves for connection
+ * problems.
+ *
+ * The algorithm is to propagate connection values outwards using a
+ * breadth-first searching strategy, implemented through an implicitly
+ * sorted queue. The propagation to new vertices depends on
+ * geometrical features with significance for connections. E.g. a
+ * bamboo joint is recognized and the distance added when passing
+ * through it is small. New points are added to the queue through the
+ * ENQUEUE macro above. This checks whether the point has already been
+ * entered on the queue and updates the distance and delta values if
+ * the previous ones were worse. When a stone is entered, all stones
+ * of the string are added to the queue simultaneously.
+ *
+ * (target) is the other string when called from find_connection_moves().
+ * (It can be set to NO_MOVE otherwise.)
+ *
+ * The propagation is inhibited when the distance becomes too large,
+ * or larger than the shortest path found to the target so far.
+ *
+ *
+ * The purpose of the fields called vulnerable is to keep track of
+ * points where the attacker can threaten an individual
+ * connection. For example the diagonal formation
+ *
+ * .O
+ * O.
+ *
+ * is considered a small distance link but both the empty vertices are
+ * marked as vulnerable. Thus if we are computing connection distance
+ * from the lower left O in this diagram,
+ *
+ * XXX     XXX
+ * .O.     .O.
+ * O.O     OaO
+ * .X.     .X.
+ *
+ * the distance to the middle O is small but the second diagonal link
+ * to the lower right O stone is not given a small distance since a
+ * had already been marked as vulnerable.
+ *
+ * It should also be pointed out that this reasoning is not relevant
+ * in this position where X has no cutting potential,
+ *
+ * XXX     XXX
+ * .O.     .O.
+ * O.O     OaO
+ * ...     ...
+ *
+ * That is because there is a pattern directly recognizing the safe
+ * link between the two lower stones, without taking the longer road
+ * over the two diagonal links.
+ *
+ * (color) is the color for which we are computing connection distances,
+ * (target) the position we want to reach (can be set to NO_MOVE),
+ * (*conn) has to have the queue initialized with the positions
+ * from which we want to know the distances,
+ * (cutoff_distance) is the highest distance before we give up,
+ * (speculative) controls some special cases in the propagation rules
+ * below.
+ *
+ * As an optimization, new points are either added directly via the ENQUEUE
+ * macro if the necessary test is an immediate (usually purely geometric)
+ * check, or if the decision is more expensive (usually depending on a
+ * ladder), it gets postponed and stored via push_connection_heap_entry()
+ * for later evaluation.
+ */
+
+void
+spread_connection_distances(int color, struct connection_data *conn)
+{
+  int other = OTHER_COLOR(color);
+  int stones[MAX_BOARD * MAX_BOARD];
+  int num_stones = 0;
+  int stone = 0;
+
+  /* Loop until we reach the end of the queue. */
+  while (conn->queue_start < conn->queue_end || conn->heap_size > 0) {
+    int k;
+    int pos;
+    int distance;
+
+    /* Delete heap entries for positions that have already been reached
+     * with smaller distance.
+     */
+    while (conn->heap_size > 0
+          && conn->heap[0]->distance >= conn->distances[conn->heap[0]->target])
+      pop_connection_heap_entry(conn);
+
+    if (stone == num_stones) {
+      int best_index = -1;
+      int smallest_dist = HUGE_CONNECTION_DISTANCE;
+
+      if (conn->queue_start == conn->queue_end) {
+       if (conn->heap_size > 0) {
+         conn->heap[0]->helper(conn, color);
+         pop_connection_heap_entry(conn);
+       }
+
+       continue;
+      }
+
+      gg_assert(conn->queue_end <= MAX_BOARD * MAX_BOARD);
+
+      /* Find the smallest distance among the queued points. */
+      for (k = conn->queue_start; k < conn->queue_end; k++) {
+       if (conn->distances[conn->queue[k]] < smallest_dist) {
+         smallest_dist = conn->distances[conn->queue[k]];
+         best_index = k;
+       }
+      }
+
+      /* Exchange the best point with the first element in the queue. */
+      if (best_index != conn->queue_start) {
+       int temp = conn->queue[conn->queue_start];
+       conn->queue[conn->queue_start] = conn->queue[best_index];
+       conn->queue[best_index] = temp;
+      }
+
+      /* If the first element in heap has smaller distance than the
+       * smallest we have found so far, call the relevant helper function
+       * now, and delete the heap entry.
+       */
+      if (conn->heap_size > 0 && conn->heap[0]->distance < smallest_dist) {
+       conn->heap[0]->helper(conn, color);
+       pop_connection_heap_entry(conn);
+       continue;
+      }
+
+      /* Now we are ready to pick the first element in the queue and
+       * process it.
+       */
+      pos = conn->queue[conn->queue_start++];
+      if (board[pos] != EMPTY) {
+       num_stones = findstones(pos, MAX_BOARD * MAX_BOARD, stones);
+       pos = stones[0];
+       stone = 1;
+      }
+    }
+    else {
+      pos = stones[stone++];
+      conn->distances[pos]   = conn->distances[stones[0]];
+      conn->deltas[pos]      = conn->deltas[stones[0]];
+      conn->coming_from[pos] = conn->coming_from[stones[0]];
+      conn->vulnerable1[pos] = conn->vulnerable1[stones[0]];
+      conn->vulnerable2[pos] = conn->vulnerable2[stones[0]];
+    }
+
+    /* No further propagation if the distance is too large. */
+    distance = conn->distances[pos];
+    if (distance > conn->cutoff_distance)
+      break;
+
+    /* Search for new vertices to propagate to. */
+    if (board[pos] == color) {
+      for (k = 0; k < 4; k++) {
+       /* List of relative coordinates. (pos) is marked by *.
+        *
+        *  jef.
+        *  igb.
+        * kh*ac
+        *  ....
+        *
+        */
+       int right = delta[k];
+       int up = delta[(k+1)%4];
+
+       /* FIXME: Compactify this list. */
+       int apos = pos + right;
+       int bpos = pos + right + up;
+       int cpos = pos + 2 * right;
+       int epos = pos + 2*up;
+       int fpos = pos + right + 2*up;
+       int gpos = pos + up;
+       int hpos = pos - right;
+       int ipos = pos - right + up;
+       int jpos = pos - right + 2 * up;
+       int kpos = pos - 2 * right;
+       
+       /* Case 1. "a" is empty and would be suicide for the opponent. */
+       if (board[apos] == EMPTY && is_suicide(apos, other))
+         ENQUEUE(conn, pos, apos, distance, FP(0.0), apos, NO_MOVE);
+       
+       /* Case 2. "a" is empty and would be self atari for the opponent. */
+       if (board[apos] == EMPTY
+           && conn->distances[apos] > distance + FP(0.1)
+           && is_self_atari(apos, other)) {
+         int lib;
+         int vulnerable1 = NO_MOVE;
+         int vulnerable2 = NO_MOVE;
+         if (approxlib(apos, other, 1, &lib) >= 1) {
+           if (approxlib(lib, other, 2, NULL) > 2)
+             vulnerable1 = lib;
+           if (countlib(pos) == 2) {
+             int i;
+             for (i = 0; i < 4; i++) {
+               if (board[lib + delta[i]] == EMPTY
+                   && lib + delta[i] != apos
+                   && trymove(lib + delta[i], other,
+                              "compute_connection_distances", pos)) {
+                 if (ladder_capture(pos, NULL)) {
+                   vulnerable2 = lib + delta[i];
+                   popgo();
+                   break;
+                 }
+                 popgo();
+               }
+             }
+           }
+         }
+         
+         if (!common_vulnerabilities(conn->vulnerable1[pos],
+                                     conn->vulnerable2[pos],
+                                     vulnerable1, vulnerable2, color)) {
+           ENQUEUE(conn, pos, apos, distance + FP(0.1), FP(0.1),
+                   vulnerable1, vulnerable2);
+         }
+       }
+       
+       /* Case 3. Bamboo joint of "*" + "a" to "e" + "f" through "b" and "g".
+        * Notice that the order of these tests is significant. We must
+        * check bpos before fpos and epos to avoid accessing memory
+        * outside the board array. (Notice that fpos is two steps away
+        * from pos, which we know is on the board.)
+        */
+       if (board[apos] == color && board[bpos] == EMPTY
+           && board[fpos] == color && board[epos] == color
+           && board[gpos] == EMPTY) {
+         ENQUEUE(conn, pos, bpos, distance + FP(0.1), FP(0.1),
+                 NO_MOVE, NO_MOVE);
+         ENQUEUE(conn, pos, gpos, distance + FP(0.1), FP(0.1),
+                 NO_MOVE, NO_MOVE);
+       }
+          
+       /* Case 4. Diagonal connection to another stone "b" through
+        * empty vertices "a" and "g".
+        */
+       if (board[bpos] == color
+           && board[apos] == EMPTY
+           && board[gpos] == EMPTY
+           && !common_vulnerabilities(conn->vulnerable1[pos],
+                                      conn->vulnerable2[pos],
+                                      apos, gpos, color)
+           && conn->distances[bpos] > distance + FP(0.1)) {
+#if 0
+         ENQUEUE(conn, pos, apos, distance + FP(0.2), FP(0.2),
+                 NO_MOVE, NO_MOVE);
+         ENQUEUE(conn, pos, gpos, distance + FP(0.2), FP(0.2),
+                 NO_MOVE, NO_MOVE);
+#endif
+         ENQUEUE_STONE(conn, pos, bpos, distance + FP(0.1), FP(0.1),
+                       apos, gpos);
+       }
+
+       /* Case 5. Almost bamboo joint.
+        * 
+        */
+       if (board[gpos] == EMPTY
+           && board[epos] == color
+            && conn->distances[epos] > distance + FP(0.2)
+           && approxlib(gpos, other, 3, NULL) <= 2) {
+         if (board[bpos] == EMPTY
+             && approxlib(bpos, color, 3, NULL) >= 3
+             && (board[apos] == color
+                 || (board[apos] == EMPTY
+                     && countlib(pos) > 2
+                     && !common_vulnerabilities(conn->vulnerable1[pos],
+                                                conn->vulnerable2[pos],
+                                                apos, gpos, color)
+                     && approxlib(apos, other, 3, NULL) <= 2))
+             && (board[fpos] == color
+                 || (board[fpos] == EMPTY
+                     && countlib(epos) > 2
+                     && !common_vulnerabilities(conn->vulnerable1[pos],
+                                                conn->vulnerable2[pos],
+                                                fpos, gpos, color)
+                     && approxlib(fpos, other, 3, NULL) <= 2))) {
+           if (board[apos] == EMPTY && board[fpos] == EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           apos, fpos);
+           }
+           else if (board[apos] == EMPTY && board[fpos] != EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           apos, NO_MOVE);
+           }
+           else if (board[apos] != EMPTY && board[fpos] == EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           fpos, NO_MOVE);
+           }
+           else if (board[apos] != EMPTY && board[fpos] != EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           NO_MOVE, NO_MOVE);
+           }
+         }
+
+         if (board[ipos] == EMPTY
+             && approxlib(ipos, color, 3, NULL) >= 3
+             && (board[hpos] == color
+                 || (board[hpos] == EMPTY
+                     && countlib(pos) > 2
+                     && !common_vulnerabilities(conn->vulnerable1[pos],
+                                                conn->vulnerable2[pos],
+                                                hpos, gpos, color)
+                     && approxlib(hpos, other, 3, NULL) <= 2))
+             && (board[jpos] == color
+                 || (board[jpos] == EMPTY
+                     && countlib(epos) > 2
+                     && !common_vulnerabilities(conn->vulnerable1[pos],
+                                                conn->vulnerable2[pos],
+                                                jpos, gpos, color)
+                     && approxlib(jpos, other, 3, NULL) <= 2))) {
+           if (board[hpos] == EMPTY && board[jpos] == EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           hpos, jpos);
+           }
+           else if (board[hpos] == EMPTY && board[jpos] != EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           hpos, NO_MOVE);
+           }
+           else if (board[hpos] != EMPTY && board[jpos] == EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           jpos, NO_MOVE);
+           }
+           else if (board[hpos] != EMPTY && board[jpos] != EMPTY) {
+             ENQUEUE_STONE(conn, pos, epos, distance + FP(0.2), FP(0.2),
+                           NO_MOVE, NO_MOVE);
+           }
+         }
+       }
+
+       /* Case 6. "a" is empty and an opponent move can be captured
+        * in a ladder.
+        *
+        * Case 7. "a" is empty.
+        */
+       if (board[apos] == EMPTY && conn->distances[apos] > distance + FP(0.6)) {
+         push_connection_heap_entry(conn, distance + FP(0.6), pos, apos,
+                                    case_6_7_helper);
+       }
+
+       /* Case 8. Adjacent opponent stone at "a" which can't avoid atari.
+        */
+       if (board[apos] == other
+           && conn->distances[apos] > distance + FP(0.1)
+           && no_escape_from_atari(apos)) {
+         ENQUEUE_STONE(conn, pos, apos, distance + FP(0.1), FP(0.1),
+                       NO_MOVE, NO_MOVE);
+       }
+
+       /* Case 9. Adjacent opponent stone at "a" which can't avoid
+        * ladder capture.
+        *
+        * Case 10. "a" is occupied by opponent.
+        */
+       if (board[apos] == other && conn->distances[apos] > distance + FP(0.3)) {
+         push_connection_heap_entry(conn, distance + FP(0.3), pos, apos,
+                                    case_9_10_helper);
+       }
+
+       /* Case 11. Diagonal connection to empty vertex "b" through
+        * empty vertex "a" or "g", which makes "a" or "g" self-atari
+        * for opponent.
+        */
+       if (board[bpos] == EMPTY
+           && board[apos] == EMPTY
+           && conn->distances[bpos] > distance + FP(1.1)
+           && does_secure(color, bpos, apos)) {
+         ENQUEUE(conn, pos, bpos, distance + FP(1.1), FP(1.0), apos, NO_MOVE);
+       }
+
+       if (board[bpos] == EMPTY
+           && board[gpos] == EMPTY
+           && conn->distances[bpos] > distance + FP(1.1)
+           && does_secure(color, bpos, gpos)) {
+         ENQUEUE(conn, pos, bpos, distance + FP(1.1), FP(1.0), gpos, NO_MOVE);
+       }
+
+       /* Case 12. One-space jump to empty vertex "e" through empty
+        * vertex "g", which makes "g" self-atari for opponent.
+        */
+       if (board[gpos] == EMPTY
+           && board[epos] == EMPTY
+           && conn->distances[epos] > distance + FP(1.1)
+           && does_secure(color, epos, gpos)) {
+         ENQUEUE(conn, pos, epos, distance + FP(1.1), FP(1.0), gpos, NO_MOVE);
+       }
+
+       /* Case 13. One-space jump to empty vertex "e" through empty
+        * vertex "g", making a bamboo joint.
+        */
+       if (board[gpos] == EMPTY
+           && board[epos] == EMPTY
+           && conn->distances[epos] > distance + FP(1.1)
+           && ((board[apos] == color && board[fpos] == color
+                && board[bpos] == EMPTY)
+               || (board[hpos] == color && board[jpos] == color
+                   && board[ipos] == EMPTY))) {
+         ENQUEUE(conn, pos, epos, distance + FP(1.1), FP(1.0), gpos, NO_MOVE);
+       }
+
+       /* Case 14. Diagonal connection to empty vertex "b" through
+        * empty vertices "a" and "g".
+        */
+       if (board[bpos] == EMPTY
+           && board[apos] == EMPTY && board[gpos] == EMPTY
+            && conn->distances[bpos] > distance + FP(1.3)) {
+         ENQUEUE(conn, pos, bpos, distance + FP(1.3), FP(1.0), apos, gpos);
+       }
+
+       /* Case 15. Keima to "f" or "j" on edge. and one space jump on
+        * first or second line.
+        */
+       if (board[apos] == EMPTY
+           && board[bpos] == EMPTY
+           && board[gpos] == EMPTY
+           && board[epos] == EMPTY
+           && board[fpos] == EMPTY
+           && (conn->distances[fpos] > distance + FP(1.3)
+               || conn->distances[epos] > distance + FP(1.3))
+           && countlib(pos) >= 3
+           && (!ON_BOARD(cpos) || !ON_BOARD(hpos))) {
+         ENQUEUE(conn, pos, fpos, distance + FP(1.3), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+         ENQUEUE(conn, pos, epos, distance + FP(1.3), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+       }
+
+       if (board[hpos] == EMPTY
+           && board[ipos] == EMPTY
+           && board[gpos] == EMPTY
+           && board[epos] == EMPTY
+           && board[jpos] == EMPTY
+           && (conn->distances[jpos] > distance + FP(1.3)
+               || conn->distances[epos] > distance + FP(1.3))
+           && countlib(pos) >= 3
+           && (!ON_BOARD(apos) || !ON_BOARD(kpos))) {
+         ENQUEUE(conn, pos, jpos, distance + FP(1.3), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+         ENQUEUE(conn, pos, epos, distance + FP(1.3), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+       }
+
+       /* Case 16. Diagonal connection to empty vertex "b" through
+        * empty vertex "a" or "g", which allows opponent move at "a"
+        * or "g" to be captured in a ladder.
+        *
+        * Case 17. Diagonal connection to empty vertex "b" through
+        * one empty and one opponent vertex "a" and "g", where
+        * the opponent stone is short of liberties.
+        *
+        * Case 18. Diagonal connection to empty vertex "b" through
+        * empty vertex "a" or "g", with no particular properties.
+        */
+       if (board[bpos] == EMPTY
+           && (board[apos] == EMPTY || board[gpos] == EMPTY)
+           && conn->distances[bpos] > distance + FP(1.2)) {
+         push_connection_heap_entry(conn, distance + FP(1.2), pos, bpos,
+                                    case_16_17_18_helper);
+       }
+
+       /* Case 19. Clamp at "e" of single stone at "g". */
+       if (board[gpos] == other
+           && board[epos] == EMPTY
+           && conn->distances[epos] > distance + FP(2.0)
+           && countstones(gpos) == 1) {
+         ENQUEUE(conn, pos, epos, distance + FP(2.0), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+       }
+
+       /* Case 20. Diagonal connection to empty vertex "b" through
+        * opponent stones "a" or "g" with few liberties.
+        */
+       if (board[bpos] == EMPTY
+           && board[apos] == other
+           && board[gpos] == other
+           && conn->distances[bpos] > distance + FP(2.0)
+           && (countlib(apos) + countlib(gpos) <= 6)) {
+         ENQUEUE(conn, pos, bpos, distance + FP(2.0), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+       }
+
+       /* Case 21. Diagonal connection to own stone "b" through
+        * opponent stones "a" or "g" with few liberties.
+        */
+       if (board[bpos] == color
+           && board[apos] == other
+           && board[gpos] == other
+           && conn->distances[bpos] > distance + FP(2.0)
+           && (countlib(apos) + countlib(gpos) <= 5)) {
+         ENQUEUE_STONE(conn, pos, bpos, distance + FP(2.0), FP(1.0),
+                       NO_MOVE, NO_MOVE);
+       }
+      }
+    }
+    else if (board[pos] == EMPTY
+            || (board[pos] == other
+                && countlib(pos) <= 2
+                && no_escape_from_ladder(pos))) {
+      for (k = 0; k < 4; k++) {
+       /* List of relative coordinates. (pos) is marked by *.
+        *
+        *  jef.
+        *  igb.
+        * kh*ac
+        *   .d.
+        *
+        */
+       int right = delta[k];
+       int up = delta[(k+1)%4];
+
+       /* FIXME: Compactify this list. */
+       int apos = pos + right;
+       int bpos = pos + right + up;
+#if 0
+       int cpos = pos + 2 * right;
+       int epos = pos + 2*up;
+       int fpos = pos + right + 2*up;
+#endif
+       int gpos = pos + up;
+#if 0
+       int hpos = pos - right;
+       int ipos = pos - right + up;
+       int jpos = pos - right + 2 * up;
+       int kpos = pos - 2 * right;
+#endif
+       
+       if (board[apos] == color) {
+         ENQUEUE_STONE(conn, pos, apos, distance, FP(0.0),
+                       conn->vulnerable1[pos], conn->vulnerable2[pos]);
+       }
+       else if (board[apos] == EMPTY) {
+         int this_delta
+           = FP(0.8) + FP(0.05) * gg_min(approxlib(apos, other, 6, NULL), 6);
+         ENQUEUE(conn, pos, apos, distance + this_delta, this_delta,
+                 NO_MOVE, NO_MOVE);
+       }
+       else if (board[apos] == other) {
+         ENQUEUE_STONE(conn, pos, apos, distance + FP(1.0), FP(1.0),
+                       NO_MOVE, NO_MOVE);
+       }
+
+       /* Case 1. Diagonal connection to empty vertex "b" through
+        * empty vertices "a" and "g".
+        */
+       if (board[bpos] == EMPTY
+           && board[apos] == EMPTY
+           && board[gpos] == EMPTY
+            && conn->distances[bpos] > distance + FP(1.5)) {
+         ENQUEUE(conn, pos, bpos, distance + FP(1.5), FP(1.0),
+                 NO_MOVE, NO_MOVE);
+       }
+       
+       /* Case 2. Diagonal connection to friendly stone at "b" through
+        * empty vertices "a" and "g".
+        */
+       if (board[bpos] == color
+           && board[apos] == EMPTY
+           && board[gpos] == EMPTY
+           && conn->distances[bpos] > distance + FP(1.3)) {
+         ENQUEUE_STONE(conn, pos, bpos, distance + FP(1.3), FP(1.0),
+                       NO_MOVE, NO_MOVE);
+       }
+      }
+    }
+  }
+}
+
+
+void
+sort_connection_queue_tail(struct connection_data *conn)
+{
+  int k;
+
+  for (k = conn->queue_start; k < conn->queue_end - 1; k++) {
+    int i;
+    int best_index = k;
+    int smallest_dist = conn->distances[conn->queue[k]];
+
+    for (i = k + 1; i < conn->queue_end; i++) {
+      if (conn->distances[conn->queue[i]] < smallest_dist) {
+       best_index = i;
+       smallest_dist = conn->distances[conn->queue[i]];
+      }
+    }
+
+    if (best_index != k) {
+      int temp = conn->queue[k];
+      conn->queue[k] = conn->queue[best_index];
+      conn->queue[best_index] = temp;
+    }
+  }
+}
+
+
+/* Replace string origins in a connection queue with complete sets of
+ * corresponding string stones.
+ */
+void
+expand_connection_queue(struct connection_data *conn)
+{
+  int k;
+  int full_queue[BOARDMAX];
+  int full_queue_position = 0;
+  int full_queue_start = 0;
+
+  for (k = 0; k < conn->queue_end; k++) {
+    if (k == conn->queue_start)
+      full_queue_start = full_queue_position;
+
+    if (board[conn->queue[k]] == EMPTY)
+      full_queue[full_queue_position++] = conn->queue[k];
+    else {
+      full_queue_position += findstones(conn->queue[k],
+                                       MAX_BOARD * MAX_BOARD,
+                                       full_queue + full_queue_position);
+    }
+  }
+
+  conn->queue_start = full_queue_start;
+  conn->queue_end   = full_queue_position;
+  memcpy(conn->queue, full_queue, conn->queue_end * sizeof(int));
+}
+
+
+/* Initialize distance and delta values so that the former are
+ * everywhere huge and the latter everywhere zero.
+ */
+static void
+clear_connection_data(struct connection_data *conn)
+{
+  int pos;
+
+  conn->queue_start = 0;
+  conn->queue_end = 0;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    conn->distances[pos] = HUGE_CONNECTION_DISTANCE;
+    conn->deltas[pos] = FP(0.0);
+    conn->coming_from[pos] = NO_MOVE;
+    conn->vulnerable1[pos] = NO_MOVE;
+    conn->vulnerable2[pos] = NO_MOVE;
+  }
+
+  conn->heap_data_size = 0;
+  conn->heap_size = 0;
+}
+
+
+/* Compute the connection distances from string (str) to nearby
+ * vertices, until we reach target or the distance gets too high.
+ */
+void
+compute_connection_distances(int str, int target, int cutoff,
+                            struct connection_data *conn,
+                            int speculative)
+{
+  int color = board[str];
+  
+  clear_connection_data(conn);
+
+  /* Add the origin of the initial string to the queue. */
+  add_to_start_queue(find_origin(str), FP(0.0), conn);
+
+  conn->target = target;
+  conn->cutoff_distance = cutoff;
+  conn->speculative = speculative;
+
+  spread_connection_distances(color, conn);
+}
+
+
+/* Print the connection distances in a struct connection_data. */
+void
+print_connection_distances(struct connection_data *conn)
+{
+  int i, j;
+  int ch;
+  int pos;
+  
+  fprintf(stderr, "  ");
+  for (j = 0, ch = 'A'; j < board_size; j++, ch++) {
+    if (ch == 'I')
+      ch++;
+    fprintf(stderr, "  %c ", ch);
+  }
+  fprintf(stderr, "\n");
+
+  for (i = 0; i < board_size; i++) {
+    fprintf(stderr, "%2d ", board_size - i);
+    for (j = 0; j < board_size; j++) {
+      pos = POS(i, j);
+      if (conn->distances[pos] == HUGE_CONNECTION_DISTANCE) {
+       if (board[pos] == WHITE)
+         fprintf(stderr, " O  ");
+       if (board[pos] == BLACK)
+         fprintf(stderr, " X  ");
+       if (board[pos] == EMPTY)
+         fprintf(stderr, " .  ");
+      }
+      else {
+       fprintf(stderr, "%3.1f ", FIXED_TO_FLOAT(conn->distances[pos]));
+      }
+    }
+    fprintf(stderr, "\n");
+  }
+  fprintf(stderr, "\n");
+
+  fprintf(stderr, "Vulnerable:\n");
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (conn->distances[pos] < HUGE_CONNECTION_DISTANCE
+       && (conn->vulnerable1[pos] != NO_MOVE
+           || conn->vulnerable2[pos] != NO_MOVE)) {
+      gprintf(" %1m:", pos);
+      if (conn->vulnerable1[pos] != NO_MOVE)
+       gprintf(" %1m", conn->vulnerable1[pos]);
+      if (conn->vulnerable2[pos] != NO_MOVE)
+       gprintf(" %1m", conn->vulnerable2[pos]);
+      gprintf("\n", pos);
+    }
+}
+
+
+/* Test whether there is a trivial connection between str1 and str2
+ * and if so return the connecting move in *move. By trivial
+ * connection we mean that they either have a common liberty or a
+ * common neighbor which can be tactically attacked.
+ */
+static int
+trivial_connection(int str1, int str2, int *move)
+{
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int adj, adjs[MAXCHAIN];
+  int r;
+  int result = 0;
+  
+  if (have_common_lib(str1, str2, move))
+    return WIN;
+
+  adj = chainlinks(str1, adjs);
+
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * tactical reading moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  
+  for (r = 0; r < adj; r++)
+    if (adjacent_strings(adjs[r], str2) && attack(adjs[r], move) == WIN) {
+      result = WIN;
+      break;
+    }
+
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+  
+  return result;
+}
+
+
+/* True if a move by color makes an opponent move at pos a self atari
+ * or possible to capture in a ladder.
+ */
+static int
+does_secure_through_ladder(int color, int move, int pos)
+{
+  int result = 0;
+  
+  if (trymove(move, color, NULL, NO_MOVE)) {
+    if (ladder_capturable(pos, OTHER_COLOR(color)))
+      result = 1;
+    popgo();
+  }
+  
+  return result;
+}
+
+/* Test whether the string str can be immediately taken off the board
+ * or captured in a ladder. If so the capturing move is returned in
+ * *move.
+ */
+static int
+ladder_capture(int str, int *move)
+{
+  int result;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int liberties = countlib(str);
+  
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * tactical reading moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+
+  if (liberties == 1)
+    result = attack(str, move);
+  else if (liberties == 2)
+    result = simple_ladder(str, move);
+  else
+    result = 0;
+  
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  return result;
+}
+
+/* Test whether a move at pos by color can be captured in a ladder. */
+static int
+ladder_capturable(int pos, int color)
+{
+  int result = 0;
+  
+  if (trymove(pos, color, NULL, NO_MOVE)) {
+    int liberties = countlib(pos);
+    if (liberties == 1 && attack(pos, NULL) == WIN)
+      result = 1;
+    else if (liberties == 2 && simple_ladder(pos, NULL) == WIN)
+      result = 1;
+    popgo();
+  }
+  else
+    result = 1;
+  
+  return result;
+}
+
+
+/* Test whether the string str with one liberty is stuck with at most
+ * one liberty. This function trivially returns false if the string
+ * has more than one liberty to start with.
+ */
+static int
+no_escape_from_atari(int str)
+{
+  int lib;
+  int adj[MAXCHAIN];
+
+  if (findlib(str, 1, &lib) > 1)
+    return 0;
+
+  if (accuratelib(lib, board[str], 2, NULL) > 1)
+    return 0;
+
+  /* FIXME: Should exclude snapback. */
+  if (chainlinks2(str, adj, 1) > 0)
+    return 0;
+
+  return 1;
+}
+
+
+/* Test whether the string str with one liberty is captured in a
+ * ladder. This function trivially returns false if the string has
+ * more than one liberty to start with, except for one special case.
+ * FIXME: Needs a simple_ladder_defense().
+ */
+static int
+no_escape_from_ladder(int str)
+{
+  int result = 0;
+  SGFTree *save_sgf_dumptree = sgf_dumptree;
+  int save_count_variations = count_variations;
+  int adj[MAXCHAIN];
+  int libs[2];
+  
+  /* We turn off the sgf traces here to avoid cluttering them up with
+   * tactical reading moves.
+   */
+  sgf_dumptree = NULL;
+  count_variations = 0;
+  
+  if (countlib(str) == 1 && find_defense(str, NULL) == 0)
+    result = 1;
+
+  if (countlib(str) == 2
+      && chainlinks2(str, adj, 1) == 0
+      && findlib(str, 2, libs) == 2
+      && approxlib(libs[0], board[str], 2, NULL) == 1
+      && approxlib(libs[1], board[str], 2, NULL) == 1
+      && ladder_capture(str, NULL)
+      && !find_defense(str, NULL))
+    result = 1;
+      
+  
+  /* Turn the sgf traces back on. */
+  sgf_dumptree = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  return result;
+}
+
+/* We usually don't want to spend time with moves which are
+ * self-atari, unless the stone is involved in a ko.
+ */
+static int
+check_self_atari(int pos, int color_to_move)
+{
+#if 1
+  int lib;
+#endif
+  
+  if (!is_self_atari(pos, color_to_move))
+    return 1;
+
+  if (is_ko(pos, color_to_move, NULL))
+    return 1;
+
+#if 1
+  /* FIXME: At some time I added this exceptional case but I can no
+   * longer see how it would be useful. It might still be, however, so
+   * I leave the code in for a while. /gf
+   *
+   * Code reactivated, see nando:31. /nn
+   *
+   * Added requirement that no additional stones are sacrificed in the
+   * self atari. /gf
+   *
+   * FIXME: Add a function in board.c to check how big the string
+   *        becomes when playing a move and use for the isolated stone
+   *        test below.
+   */
+  if (approxlib(pos, color_to_move, 1, &lib) >= 1
+      && approxlib(lib, OTHER_COLOR(color_to_move), 3, NULL) <= 2
+      && ladder_capturable(lib, OTHER_COLOR(color_to_move))) {
+    int k;
+    for (k = 0; k < 4; k++) {
+      if (board[pos + delta[k]] == color_to_move)
+       break;
+    }
+    if (k == 4)
+      return 1;
+  }
+#endif
+
+  return 0;
+}
+
+/* Check for overlap between (a1, a2) and (b1, b2). */
+static int
+common_vulnerabilities(int a1, int a2, int b1, int b2, int color)
+{
+  return (common_vulnerability(a1, b1, color)
+         || common_vulnerability(a1, b2, color)
+         || common_vulnerability(a2, b1, color)
+         || common_vulnerability(a2, b2, color));
+}
+
+/* Check if apos and bpos are the same or if they are both liberties
+ * of a string of the given color with at most three liberties.
+ */
+static int
+common_vulnerability(int apos, int bpos, int color)
+{
+  int k;
+  
+  if (apos == NO_MOVE || bpos == NO_MOVE)
+    return 0;
+  
+  if (apos == bpos)
+    return 1;
+
+  for (k = 0; k < 4; k++)
+    if (board[apos + delta[k]] == color
+       && countlib(apos + delta[k]) <= 3
+       && liberty_of_string(bpos, apos + delta[k]))
+      return 1;
+
+  return 0;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/readconnect.h b/engine/readconnect.h
new file mode 100644 (file)
index 0000000..f66c497
--- /dev/null
@@ -0,0 +1,91 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+struct heap_entry;
+struct connection_data;
+
+/* Expensive functions that we try to evaluate as late as possible
+ * when spreading connection distances.
+ */
+typedef void (*connection_helper_fn_ptr) (struct connection_data *conn,
+                                         int color);
+
+/* This heap contains a list of positions where we have delayed a
+ * decision whether to "spread a connection distance". The function
+ * helper() will be called when we finally need the decision. See
+ * push_connection_heap_entry() for organization of the heap.
+ */
+struct heap_entry {
+  int distance;
+  int coming_from;
+  int target;
+  connection_helper_fn_ptr helper;
+};
+
+/* Fixed-point arithmetic helper macros */
+#define FIXED_POINT_BASIS 10000
+#define FP(x) ((int) (0.5 + FIXED_POINT_BASIS * (x)))
+#define FIXED_TO_FLOAT(x) ((x) / (float) FIXED_POINT_BASIS)
+
+#define HUGE_CONNECTION_DISTANCE FP(100.0)
+
+struct connection_data {
+  int distances[BOARDMAX];
+  int deltas[BOARDMAX];
+  int coming_from[BOARDMAX];
+  int vulnerable1[BOARDMAX];
+  int vulnerable2[BOARDMAX];
+  int queue[BOARDMAX];
+  int queue_start;
+  int queue_end;
+
+  int heap_data_size;
+  int heap_size;
+  struct heap_entry heap_data[4 * BOARDMAX];
+  struct heap_entry *heap[BOARDMAX];
+
+  int target;
+  int cutoff_distance;
+  int speculative;
+};
+
+
+void compute_connection_distances(int str, int target, int cutoff,
+                                 struct connection_data *conn,
+                                 int speculative);
+void init_connection_data(int color, const signed char goal[BOARDMAX],
+                         int target, int cutoff,
+                         struct connection_data *conn, int speculative);
+void spread_connection_distances(int color, struct connection_data *conn);
+void sort_connection_queue_tail(struct connection_data *conn);
+void expand_connection_queue(struct connection_data *conn);
+void print_connection_distances(struct connection_data *conn);
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/reading.c b/engine/reading.c
new file mode 100644 (file)
index 0000000..2a94e42
--- /dev/null
@@ -0,0 +1,5739 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "cache.h"
+#include "gg_utils.h"
+
+/* If nonzero, attack() and find_defense() write all results to
+ * stderr.  Use this to if you have deviations in results, but cannot
+ * find where they come from.
+ *
+ * Redirect results to a file.  Take dumps of two versions and
+ * (assuming GNU tools) do `sort -t= -s' on both.  Then join the
+ * sorted dumps:
+ *
+ *   join -t= sorted-first-dump sorted-second-dump \
+ *   | sed -e "s/^[^=]\+=\([^=]\+\)=\1$//" | tr -s "\n" | tr = "\t" \
+ *   | uniq
+ *
+ * to get a nice list of deviations.  This is only meaningful if you
+ * dump results of a single test (or at least tests originating at a
+ * same position).
+ */
+#define DUMP_ALL_RESULTS       0
+
+
+/* Size of array where candidate moves are stored. */
+#define MAX_MOVES 50
+
+/* Please notice that message had better be a fixed string. Only the
+ * pointer to it is saved and there is no attempt to free up any
+ * storage.
+ */
+#define ADD_CANDIDATE_MOVE(move, this_score, moves, this_message)      \
+  do {                                                                 \
+    int u;                                                             \
+    for (u = 0; u < (moves).num; u++)                                  \
+      if ((moves).pos[u] == (move)) {                                  \
+       (moves).score[u] += this_score;                                 \
+       break;                                                          \
+      }                                                                        \
+    if ((u == (moves).num) && ((moves).num < MAX_MOVES)) {             \
+      (moves).pos[(moves).num] = move;                                 \
+      (moves).score[(moves).num] = this_score;                         \
+      (moves).message[(moves).num] = this_message;                     \
+      (moves).num++;                                                   \
+    }                                                                  \
+  } while (0)
+
+#define REMOVE_CANDIDATE_MOVE(move, moves)                             \
+  do {                                                                 \
+    int u;                                                             \
+    for (u = (moves).num_tried; u < (moves).num; u++) {                        \
+      if ((moves).pos[u] == (move)) {                                  \
+       (moves).pos[u] = (moves).pos[(moves).num - 1];                  \
+       (moves).score[u] = (moves).score[(moves).num - 1];              \
+       (moves).message[u] = (moves).message[(moves).num - 1];          \
+       (moves).num--;                                                  \
+       break;                                                          \
+      }                                                                        \
+    }                                                                  \
+  } while (0)
+
+
+/* This macro checks whether the reported result is a loss, so we have won
+ * and can exit, or else if it is the best result so far.
+ * Note that SGFTRACE must have been setup.
+ */
+#define CHECK_RESULT(savecode, savemove, code, move_pos, move_ptr,     \
+                    trace_message)                                     \
+  do {                                                                 \
+    if (code == 0) {                                                   \
+      if (move_ptr)                                                    \
+       *(move_ptr) = (move_pos);                                       \
+      SGFTRACE(move_pos, WIN, trace_message);                          \
+      return WIN;                                                      \
+    }                                                                  \
+    else if (REVERSE_RESULT(code) > savecode) {                                \
+      savemove = move_pos;                                             \
+      savecode = REVERSE_RESULT(code);                                 \
+    }                                                                  \
+  } while (0)
+
+/* Reverse of CHECK_RESULT, for results passed from a helper function. */
+#define CHECK_RESULT_UNREVERSED(savecode, savemove, code, move_pos,    \
+                               move_ptr, trace_message)                \
+  CHECK_RESULT(savecode, savemove, REVERSE_RESULT(code), move_pos,     \
+              move_ptr, trace_message)
+
+
+#define RETURN_RESULT(savecode, savemove, move_ptr, trace_message)     \
+  do {                                                                 \
+    if (savecode) {                                                    \
+      if (move_ptr)                                                    \
+       *(move_ptr) = (savemove);                                       \
+      SGFTRACE(savemove, savecode, trace_message);                     \
+    }                                                                  \
+    else                                                               \
+      SGFTRACE(0, 0, NULL);                                            \
+    return savecode;                                                   \
+  } while (0)
+
+
+/* Play a collected batch of moves and see if any of them works.  This
+ * is a defense version.
+ */
+#define DEFEND_TRY_MOVES(no_deep_branching, attack_hint)               \
+  do {                                                                 \
+    int k;                                                             \
+                                                                       \
+    for (k = moves.num_tried; k < moves.num; k++) {                    \
+      int ko_move;                                                     \
+      int dpos = moves.pos[k];                                         \
+                                                                       \
+      if (komaster_trymove(dpos, color, moves.message[k], str, &ko_move,\
+                          stackp <= ko_depth && savecode == 0)) {      \
+       int acode = do_attack(str, (attack_hint));                      \
+       popgo();                                                        \
+                                                                       \
+       if (!ko_move) {                                                 \
+         CHECK_RESULT(savecode, savemove, acode, dpos, move,           \
+                      "defense effective");                            \
+       }                                                               \
+       else {                                                          \
+         if (acode != WIN) {                                           \
+           savemove = dpos;                                            \
+           savecode = KO_B;                                            \
+         }                                                             \
+       }                                                               \
+      }                                                                        \
+                                                                       \
+      if ((no_deep_branching) && stackp >= branch_depth)               \
+       RETURN_RESULT(savecode, savemove, move, "branching limit");     \
+    }                                                                  \
+                                                                       \
+    moves.num_tried = moves.num;                                       \
+  } while (0)
+
+
+/* Attack version of the macro above.  This one is a bit more
+ * complicated, because when defender fails to defend, attacker has to
+ * prove that he can capture the string before claiming victory.
+ */
+#define ATTACK_TRY_MOVES(no_deep_branching, defense_hint)              \
+  do {                                                                 \
+    int k;                                                             \
+                                                                       \
+    for (k = moves.num_tried; k < moves.num; k++) {                    \
+      int ko_move;                                                     \
+      int apos = moves.pos[k];                                         \
+                                                                       \
+      if ((board_ko_pos != NO_MOVE || !send_two_return_one(apos, other))\
+         && komaster_trymove(apos, other, moves.message[k],            \
+                              str, &ko_move,                            \
+                             stackp <= ko_depth && savecode == 0)) {   \
+       int dcode = do_find_defense(str, (defense_hint));               \
+                                                                       \
+       if (REVERSE_RESULT(dcode) > savecode                            \
+           && do_attack(str, NULL)) {  \
+         if (!ko_move) {                                               \
+           if (dcode == 0) {                                           \
+             popgo();                                                  \
+             RETURN_RESULT(WIN, apos, move, "attack effective");       \
+           }                                                           \
+                                                                       \
+           savemove = apos;                                            \
+           savecode = REVERSE_RESULT(dcode);                           \
+         }                                                             \
+         else {                                                        \
+           savemove = apos;                                            \
+           savecode = KO_B;                                            \
+         }                                                             \
+       }                                                               \
+                                                                       \
+       popgo();                                                        \
+      }                                                                        \
+                                                                       \
+      if ((no_deep_branching) && stackp >= branch_depth)               \
+       RETURN_RESULT(savecode, savemove, move, "branching limit");     \
+    }                                                                  \
+                                                                       \
+    moves.num_tried = moves.num;                                       \
+  } while (0)
+
+
+
+struct reading_moves
+{
+  int pos[MAX_MOVES];
+  int score[MAX_MOVES];
+  const char *message[MAX_MOVES];
+  int num;
+  int num_tried;
+};
+
+/*
+ * The functions in reading.c are used to read whether groups 
+ * can be captured or not. See the Texinfo documentation 
+ * (Reading) for more information.
+ *
+ * NULL POINTERS: Many functions in this file can use pointers
+ * to return the locations of recommended plays. These can be
+ * set NULL in which case these values are not returned.
+ */
+
+static int do_find_defense(int str, int *move);
+static int defend1(int str, int *move);
+static int defend2(int str, int *move);
+static int defend3(int str, int *move);
+static int defend4(int str, int *move);
+static void special_rescue_moves(int str, int lib,
+                                struct reading_moves *moves);
+static void bamboo_rescue_moves(int str, int num_libs, int libs[], 
+                                struct reading_moves *moves);
+static void special_rescue2_moves(int str, int libs[2],
+                                 struct reading_moves *moves);
+static void special_rescue3_moves(int str, int libs[3],
+                                 struct reading_moves *moves);
+static void special_rescue4_moves(int str, int libs[2],
+                                 struct reading_moves *moves);
+static void hane_rescue_moves(int str, int libs[4],
+                             struct reading_moves *moves);
+static void special_rescue5_moves(int str, int libs[3],
+                                 struct reading_moves *moves);
+static void special_rescue6_moves(int str, int libs[3],
+                                 struct reading_moves *moves);
+static void set_up_snapback_moves(int str, int lib,
+                                 struct reading_moves *moves);
+static void edge_clamp_moves(int str, struct reading_moves *moves);
+static int do_attack(int str, int *move);
+static int attack1(int str, int *move);
+static int attack2(int str, int *move);
+static int attack3(int str, int *move);
+static int attack4(int str, int *move);
+static void find_cap_moves(int str, struct reading_moves *moves);
+static void special_attack2_moves(int str, int libs[2],
+                                 struct reading_moves *moves);
+static void special_attack3_moves(int str, int libs[2],
+                                 struct reading_moves *moves);
+static void special_attack4_moves(int str, int libs[2],
+                                 struct reading_moves *moves);
+static void draw_back_moves(int str, struct reading_moves *moves);
+static void edge_closing_backfill_moves(int str, int apos,
+                                       struct reading_moves *moves);
+static void edge_block_moves(int str, int apos,
+                            struct reading_moves *moves);
+static void propose_edge_moves(int str, int *libs, int liberties,
+                              struct reading_moves *moves, int color);
+static void break_chain_moves(int str, struct reading_moves *moves);
+static int  defend_secondary_chain1_moves(int str, struct reading_moves *moves,
+                                         int min_liberties);
+static void defend_secondary_chain2_moves(int str, struct reading_moves *moves,
+                                         int min_liberties);
+static void break_chain2_efficient_moves(int str, 
+                                        struct reading_moves *moves);
+static void do_find_break_chain2_efficient_moves(int str, int adj,
+                                                struct reading_moves *moves);
+static void break_chain2_moves(int str, struct reading_moves *moves,
+                              int require_safe, int be_aggressive);
+static void break_chain2_defense_moves(int str, struct reading_moves *moves,
+                                      int be_aggressive);
+static void break_chain3_moves(int str, struct reading_moves *moves,
+                              int be_aggressive);
+static void break_chain4_moves(int str, struct reading_moves *moves,
+                              int be_aggressive);
+static void superstring_moves(int str, struct reading_moves *moves, 
+                             int liberty_cap, int does_attack);
+static void squeeze_moves(int str, struct reading_moves *moves);
+static void superstring_break_chain_moves(int str, int liberty_cap,
+                                        struct reading_moves *moves);
+static void double_atari_chain2_moves(int str,
+                                     struct reading_moves *moves,
+                                     int generate_more_moves);
+static void order_moves(int str, struct reading_moves *moves,
+                       int color, const char *funcname, int killer);
+static int simple_ladder_defend(int str, int *move);
+static int in_list(int move, int num_moves, int *moves);
+
+
+/* Statistics. */
+static int reading_node_counter = 0;
+static int nodes_when_called = 0;
+
+
+/* ================================================================ */  
+/*                          Goal functions                          */
+/* ================================================================ */
+
+
+/*
+ * These functions define goals for the reading process.  They use 
+ * the rest of the reading machinery to evaluate whether the goal
+ * is fulfillable.
+ *
+ * The simplest goals are defined by attack() and find_defense(),
+ * namely to see if it is possible to capture or defend a single
+ * string.  More complex goals are defined by e.g. attack_either()
+ * or defend_both().
+ *
+ * The functions in this section and the next are the only ones which are
+ * callable from outside this file.  
+ */
+
+
+/* attack(str, *move) determines if the string at (str) can be 
+ * captured, and if so, (*move) returns the attacking move, unless
+ * (move) is a null pointer. Use a null pointer if you are interested
+ * in the result of the attack but not the attacking move itself.
+ *
+ * Return WIN if the attack succeeds unconditionally, 0 if it doesn't.
+ * Returns KO_A or KO_B if the result depends on ko: 
+ *   - Returns KO_A if the attack succeeds provided attacker is willing to
+ *     ignore any ko threat (the attacker makes the first ko capture).
+ *   - Returns KO_B if attack succeeds provided attacker has a ko threat
+ *     which must be answered (the defender makes the first ko capture).
+ */
+
+int
+attack(int str, int *move)
+{
+  int result;
+  int nodes;
+  int origin;
+  int the_move = NO_MOVE;
+  int liberties = countlib(str);
+
+  nodes_when_called = reading_node_counter;
+  /* Don't even spend time looking in the cache if there are more than
+   * enough liberties. We need this before the persistent cache lookup
+   * to avoid results inconsistent with find_defense().
+   */
+  if (liberties > 4
+      || (liberties == 4 && stackp > fourlib_depth)
+      || (liberties == 3 && stackp > depth))
+    return 0;
+
+  origin = find_origin(str);
+  if (search_persistent_reading_cache(ATTACK, origin, &result, &the_move)) {
+    if (move)
+      *move = the_move;
+    return result;
+  }
+
+  memset(shadow, 0, sizeof(shadow));
+  result = do_attack(str, &the_move);
+  nodes = reading_node_counter - nodes_when_called;
+
+  if (debug & DEBUG_READING_PERFORMANCE) {
+    if (reading_node_counter - nodes_when_called
+       >= MIN_READING_NODES_TO_REPORT) {
+      if (result != 0)
+       gprintf("%oattack %1m(%1m) = %d %1M, %d nodes ", str, origin, result,
+               the_move, nodes);
+      else
+       gprintf("%oattack %1m(%1m) = %d, %d nodes ", str, origin, result,
+               nodes);
+      dump_stack();
+    }
+  }
+
+  store_persistent_reading_cache(ATTACK, origin, result, the_move, nodes);
+  
+  if (move)
+    *move = the_move;
+
+#if DUMP_ALL_RESULTS
+  do_dump_stack();
+  gprintf("%oattack %1m (%d)=%d %1m\n", str, depth, result, the_move);
+#endif
+
+  return result;
+}
+
+
+/* find_defense(str, *move) attempts to find a move that will save
+ * the string at (str). It returns WIN if such a move is found, with
+ * (*move) the location of the saving move, unless (move) is a
+ * null pointer. It is not checked that tenuki defends, so this may 
+ * give an erroneous answer if !attack(str).
+ * 
+ * Returns KO_A or KO_B if the result depends on ko. Returns KO_A if the
+ * string can be defended provided the defender is willing to ignore
+ * any ko threat. Returns KO_B if the defender wins by having a ko threat
+ * which must be answered.
+ */
+
+int 
+find_defense(int str, int *move)
+{
+  int result;
+  int nodes;
+  int origin;
+  int the_move = NO_MOVE;
+  int liberties = countlib(str);
+
+  nodes_when_called = reading_node_counter;
+  /* Don't even spend time looking in the cache if there are more than
+   * enough liberties.
+   */
+  if (liberties > 4
+      || (liberties == 4 && stackp > fourlib_depth)) {
+    if (move)
+      *move = NO_MOVE;
+    return WIN;
+  }
+
+  origin = find_origin(str);
+  if (search_persistent_reading_cache(FIND_DEFENSE, origin, 
+                                     &result, &the_move)) {
+    if (move)
+      *move = the_move;
+    return result;
+  }
+
+  memset(shadow, 0, sizeof(shadow));
+  result = do_find_defense(str, &the_move);
+  nodes = reading_node_counter - nodes_when_called;
+
+  if (debug & DEBUG_READING_PERFORMANCE) {
+    if (reading_node_counter - nodes_when_called
+       >= MIN_READING_NODES_TO_REPORT) {
+      if (result != 0)
+       gprintf("%odefend %1m(%1m) = %d %1M, %d nodes ", str, origin, result,
+               the_move, nodes);
+      else
+       gprintf("%odefend %1m(%1m) = %d, %d nodes ", str, origin, result,
+               nodes);
+      dump_stack();
+    }
+  }
+
+  store_persistent_reading_cache(FIND_DEFENSE, origin, result, 
+                                the_move, nodes);
+  
+  if (move)
+    *move = the_move;
+
+#if DUMP_ALL_RESULTS
+  do_dump_stack();
+  gprintf("%odefend %1m (%d)=%d %1m\n", str, depth, result, the_move);
+#endif
+
+  return result;
+}
+
+
+/* attack_and_defend(str, &acode, &attack_point,
+ *                        &dcode, &defense_point)
+ * is a frontend to the attack() and find_defense() functions, which
+ * guarantees a consistent result. If a string cannot be attacked, 0
+ * is returned and acode is 0. If a string can be attacked and
+ * defended, WIN is returned, acode and dcode are both non-zero, and
+ * (attack_point), (defense_point) both point to vertices on the board. 
+ * If a string can be attacked but not defended, 0 is again returned, 
+ * acode is non-zero, dcode is 0, and (attack_point) points to a vertex 
+ * on the board.
+ *
+ * This function in particular guarantees that if there is an attack,
+ * it will never return (defense_point) = NO_MOVE, which means the string is
+ * safe without defense. Separate calls to attack() and find_defense()
+ * may occasionally give this result, due to irregularities introduced
+ * by the persistent reading cache.
+ */
+int
+attack_and_defend(int str,
+                 int *attack_code, int *attack_point,
+                 int *defend_code, int *defense_point)
+{
+  int acode = 0;
+  int apos = NO_MOVE;
+  int dcode = 0;
+  int dpos = NO_MOVE;
+
+  acode = attack(str, &apos);
+  if (acode != 0)
+    dcode = find_defense(str, &dpos);
+
+  ASSERT1(!(acode != 0 && dcode == WIN && dpos == NO_MOVE), str);
+
+  if (attack_code)
+    *attack_code = acode;
+  if (attack_point)
+    *attack_point = apos;
+  if (defend_code)
+    *defend_code = dcode;
+  if (defense_point)
+    *defense_point = dpos;
+
+  return acode != 0 && dcode != 0;
+}
+
+
+/*
+ * attack_either(astr, bstr) returns true if there is a move which
+ * guarantees that at least one of the strings (astr) and (bstr)
+ * can be captured. A typical application for this is in connection
+ * patterns, where after a cut it suffices to capture one of the cutting
+ * stones.
+ *
+ * FIXME: The current implementation only looks for uncoordinated
+ *        attacks. This is insufficient to find double ataris or 
+ *        moves such as 'a' in positions like
+ *
+ *        XOOOOOOOX
+ *        XOXXOXXOX
+ *        XX..a..XX
+ *        ---------
+ *
+ *        where neither of the threatened X stones can be captured right
+ *        out. Still either can be captured by a move down to a.
+ */
+
+int
+attack_either(int astr, int bstr)
+{
+  int asuccess = 0;
+  int bsuccess = 0;
+  int color = board[astr];
+  ASSERT1(IS_STONE(color) , astr);
+  ASSERT1(color == board[bstr], bstr);
+
+  /* Start by attacking the string with the fewest liberties. On
+   * average this seems to be slightly more efficient.
+   */
+  if (countlib(astr) > countlib(bstr)) {
+    int t = astr;
+    astr = bstr;
+    bstr = t;
+  }
+
+  asuccess = attack(astr, NULL);
+  if (asuccess == WIN)
+    return asuccess;
+
+  bsuccess = attack(bstr, NULL);
+  if (asuccess || bsuccess) {
+    return (asuccess > bsuccess) ? asuccess : bsuccess;
+  }
+
+  /* Try (a little) harder */
+  {
+    int alibs[2];
+    int blibs[2];
+    int alib = findlib(astr, 2, alibs);
+    int defended0 = WIN;
+    int defended1 = WIN;
+    int other = OTHER_COLOR(color);
+    /* Let's just try the case where the group with the fewest liberties
+     * has only 2, and try each atari in turn.
+     */
+    if (alib == 2) {
+      if (trymove(alibs[0], other, "attack_either-A", astr)) {
+       defended0 = defend_both(astr, bstr);
+       popgo();
+      }
+      if (defended0 
+         && trymove(alibs[1], other, "attack_either-B", astr)) {
+       defended1 = defend_both(astr, bstr);
+       popgo();
+      }
+    }
+    /* The second string is possibly also short in liberties.
+     * Let's try to improve the result.
+     */
+    if (defended0 > 0 && defended1 > 0
+       && findlib(bstr, 2, blibs) == 2) {
+      defended0 = gg_min(defended0, defended1);
+      defended1 = defended0;
+
+      /* We may get here even if alib==1, in case there is a snapback.
+       * To avoid referencing uninitialized memory in this case we
+       * explicitly set alibs[1] to NO_MOVE.
+       */
+      if (alib == 1)
+       alibs[1] = NO_MOVE;
+
+      if (blibs[0] != alibs[0] && blibs[0] != alibs[1]
+         && trymove(blibs[0], other, "attack_either-C", bstr)) {
+       int defended = defend_both(astr, bstr);
+       defended0 = gg_min(defended0, defended);
+       popgo();
+      }
+      if (defended0 
+         && blibs[1] != alibs[0] && blibs[1] != alibs[1]
+         && trymove(blibs[1], other, "attack_either-D", bstr)) {
+       int defended = defend_both(astr, bstr);
+       defended1 = gg_min(defended1, defended);
+       popgo();
+      }
+    }
+    return REVERSE_RESULT(gg_min(defended0, defended1));
+  }
+
+}
+
+
+/*
+ * defend_both(astr, bstr) returns true if both the strings (astr)
+ * and (bstr) can be defended simultaneously or if there is no attack.
+ * A typical application for this is in connection patterns, where
+ * after a cut it's necessary to defend both cutting stones.
+ *
+ * FIXME: The current implementation only makes halfhearted
+ * attempts to find coordinated defense moves. A proper implementation
+ * would require some serious reading.
+ */
+
+int
+defend_both(int astr, int bstr)
+{
+  int a_threatened = 0;
+  int b_threatened = 0;
+  int a_savepos;
+  int b_savepos;
+  int acode = 0;
+  int dcode = 0;
+  
+  int color = board[astr];
+  ASSERT1(IS_STONE(color) , astr);
+  ASSERT1(color == board[bstr], bstr);
+
+  /* This probably helps here too...
+   * (see attack_either)
+   */
+  if (countlib(astr) > countlib(bstr)) {
+    int t = astr;
+    astr = bstr;
+    bstr = t;
+  }
+
+  attack_and_defend(astr, &acode, NULL, &dcode, &a_savepos);
+  if (acode != 0) {
+    a_threatened = 1;
+    if (dcode != WIN)
+      return 0; /* (astr) already lost */
+  }
+  
+  attack_and_defend(bstr, &acode, NULL, &dcode, &b_savepos);
+  if (acode != 0) {
+    b_threatened = 1;
+    if (dcode != WIN)
+      return 0; /* (bstr) already lost */
+  }
+
+  /* Neither string can be attacked or only one of them, in which case
+   * we have time to save it.
+   */
+  if (!a_threatened || !b_threatened)
+    return WIN;
+  
+  /* If both strings are threatened we assume that one will become lost,
+   * unless find_defense() happened to return the same defense point for
+   * both (which e.g. may happen if they are in fact the same string).
+   * This is still a bit too pessimistic, as there may be one move which
+   * saves both strings. To do this right we should try each move which
+   * defends either string and see if it also defends the other string.
+   */
+
+  if (a_savepos == b_savepos)
+    return WIN; /* Both strings can be attacked but also defended 
+                 * by one move. */
+
+  /* We also try each of the returned defense points and see whether
+   * the other string can still be attacked. This still gives a
+   * somewhat pessimistic estimation.
+   */
+
+  if (trymove(a_savepos, color, "defend_both-A", astr)) {
+    if (board[bstr] && !attack(bstr, NULL)) {
+      popgo();
+      return WIN;
+    }
+    popgo();
+  }
+  
+  if (trymove(b_savepos, color, "defend_both-B", bstr)) {
+    if (board[astr] && !attack(astr, NULL)) {
+      popgo();
+      return WIN;
+    }
+    popgo();
+  }
+
+  /* The next improvement is to try to attack a common adjacent string. */
+  {
+    int adjs1[MAXCHAIN];
+    int neighbors1;
+    int adjs2[MAXCHAIN];
+    int neighbors2;
+    int r;
+    int s;
+    int epos;
+    int fpos;
+    
+    neighbors1 = chainlinks(astr, adjs1);
+    neighbors2 = chainlinks(bstr, adjs2);
+    
+    for (r = 0; r < neighbors1; r++) {
+      epos = adjs1[r];
+      if (countlib(epos) <= 4
+         && (epos != a_savepos)
+         && (epos != b_savepos)) {
+       /* Is (epos) also adjacent to (bstr)? */
+       for (s = 0; s < neighbors2; s++) {
+         if (adjs2[s] == adjs1[r])
+           break;
+       }
+       if (s == neighbors2)
+         continue;   /* No, it wasn't. */
+
+       if (attack(epos, &fpos)) {
+         if (trymove(fpos, color, "defend_both-C", astr)) {
+           if (board[astr] && board[bstr]
+               && !attack(astr, NULL) 
+               && !attack(bstr, NULL)) {
+             popgo();
+             return WIN;
+           }
+           popgo();
+         }
+       }
+      }
+    }  
+  }
+  
+  /* Both strings can be attacked but we have only time to defend one. */
+  return 0;
+}
+
+
+/*
+ * break_through(apos, bpos, cpos) returns WIN if a position can
+ * succesfully be broken through and CUT if it can be cut. The position
+ * is assumed to have the shape (the colors may be reversed)
+ *
+ * .O.       dbe
+ * OXO       aFc
+ *
+ * It is X to move and try to capture at least one of a, b, and c. If
+ * this succeeds, X is said to have broken through the position.
+ * Otherwise X may try to cut through the position, which means
+ * keeping F safe and getting a tactically safe string at either d or
+ * e.
+ *
+ * Important notice: a, b, and c must be given in the correct order.
+ *
+ * FIXME: The reading involved here can most likely be improved.
+ *
+ * FIXME: We need to take ko results properly into account.
+ */
+
+static int
+break_through_helper(int apos, int bpos, int cpos,
+                    int dpos, int epos, int Fpos,
+                    int color, int other);
+
+int
+break_through(int apos, int bpos, int cpos)
+{
+  int color = board[apos];
+  int other = OTHER_COLOR(color);
+
+  int dpos;
+  int epos;
+  int Fpos;
+  int gpos;
+  
+  int success = 0;
+  int success2 = 0;
+  
+  /* Basic sanity checking. */
+  ASSERT1(IS_STONE(color) , apos);
+  ASSERT1(color == board[bpos], bpos);
+  ASSERT1(color == board[cpos], cpos);
+
+  /* Construct the rest of the points in the pattern. */
+  Fpos = (apos + cpos) / 2;      /* F midpoint between a and c. */
+  dpos = apos + bpos - Fpos;     /* Use diagonal relation a+b = d+F. */
+  epos = bpos + cpos - Fpos;     /* Use diagonal relation b+c = e+F. */
+
+  /* More sanity checking. */
+  ASSERT1(board[dpos] == EMPTY , dpos);
+  ASSERT1(board[epos] == EMPTY , epos);
+
+  /* F might already have been captured. (play_break_through_n() can't
+   * detect this.
+   */
+  if (board[Fpos] == EMPTY)
+    return 0;
+  
+  ASSERT1(board[Fpos] == other, Fpos);
+
+  /* First X tries to play at d. */
+  success = break_through_helper(apos, bpos, cpos, dpos, epos, Fpos,
+                                color, other);
+  if (success == WIN)
+    return WIN;
+  
+  success2 = break_through_helper(cpos, bpos, apos, epos, dpos, Fpos,
+                                 color, other);
+
+  if (success2 == WIN)
+    return WIN;
+
+  if (success2 == CUT)
+    success = CUT;
+
+  /* If we haven't been lucky yet, we might need to start by
+   * defending F.
+   *
+   * FIXME: The function would probably be considerably faster if we
+   * start by checking whether F needs defense. Beware of ko potential
+   * though.
+   */
+  success2 = 0;
+  if (attack_and_defend(Fpos, NULL, NULL, NULL, &gpos)) {
+    if (trymove(gpos, other, "break_through-A", Fpos)) {
+      /* Now we let O defend his position by playing either d or e.
+       * FIXME: There may be other plausible moves too.
+       */
+      if (trymove(dpos, color, "break_through-B", Fpos)) {
+       /* O connects at d, so X cuts at e. */
+       if (safe_move(epos, other)) {
+         success2 = CUT;
+         if (!board[cpos] || attack(cpos, NULL))
+           success2 = WIN;
+       }
+       popgo();
+      }
+
+      if (success2 > 0 && trymove(epos, color, "break_through-C", Fpos)) {
+       /* O connects at e, so X cuts at d. */
+       if (safe_move(dpos, other)) {
+         /* success2 is already WIN or CUT. */
+         if (board[apos] && !attack(apos, NULL))
+           success2 = CUT;
+       }
+       else
+         success2 = 0;
+       popgo();
+      }
+      popgo();
+    }
+  }
+    
+  if (success2 > 0)
+    return success2;
+
+  return success;
+}
+
+/* Helper function for break_through(). Since we can symmetrically
+ * start by cutting at d or e, we use the same code for both attacks,
+ * simply switching positions between the two calls.
+ */
+static int
+break_through_helper(int apos, int bpos, int cpos,
+                    int dpos, int epos, int Fpos,
+                    int color, int other)
+{
+  int success = 0;
+  int gpos;
+
+  if (trymove(dpos, other, "break_through_helper-A", Fpos)) {
+    /* If F can be attacked we can't start in this way. */
+    if (!attack(Fpos, NULL)) {
+      /* If d is safe too, we have at least managed to break through. */
+      if (!attack(dpos, &gpos))
+       success = CUT;
+      
+      /* Too bad, d could be attacked. We let O play the attack and
+       * then try to make a second cut at e. But first we must test if
+       * O at e is sufficient to capture d.
+       */
+      else {
+       if (trymove(epos, color, "break_through_helper-E", Fpos)) {
+         if (!board[dpos] || !find_defense(dpos, NULL)) {
+           popgo();
+           popgo();
+           return 0;
+         }
+         popgo();
+       }
+       
+       if (gpos == epos) {
+         popgo();
+         return 0;
+       }
+       
+       if (trymove(gpos, color, "break_through_helper-F", Fpos)) {
+         if (trymove(epos, other, "break_through_helper-G", Fpos)) {
+           if (!attack(epos, NULL)) {
+             success = CUT;
+             /* Make sure b and c are safe.  If not, back up & let O try 
+              * to defend in a different way. */
+             if (board[bpos] 
+                 && board[cpos] 
+                 && defend_both(bpos, cpos)) {
+               /* Can't do better than CUT. */
+               popgo();  
+               popgo();
+               popgo();
+               return CUT;
+             }
+           }
+           else {
+             /* Lost everything. (Note we ignore ko at the moment.) */
+             popgo();
+             popgo();
+             popgo();
+             return 0;
+           }
+           popgo();
+         }
+         else {
+           /* Failed to cut at all. */
+           popgo();
+           popgo();
+           return 0;
+         }
+         popgo();
+       }
+      }
+      
+      /* By now, we're sure a cut works, so now we can try 
+       * to capture something.
+       */
+      if (!board[apos] || !board[bpos] || !defend_both(apos, bpos))
+       success = WIN;
+      else {
+       /* Both a and b could be defended, or didn't need to be.
+        * Let's see if a move at e is sufficient for O.
+        */
+       int attack_on_b = 0;
+       int attack_on_a = 0;
+       
+       if (trymove(epos, color, "break_through_helper-B", Fpos)) {
+         if (attack(bpos, NULL))
+           attack_on_b = 1;
+         else if (attack(apos, NULL))
+           attack_on_a = 1;
+         popgo();
+       }
+       
+       /* Let O find a defense and play it. */
+       if (attack_on_a || attack_on_b) {
+         int hpos = NO_MOVE;
+         
+         if (((attack_on_a && find_defense(apos, &hpos))
+              || (attack_on_b && find_defense(bpos, &hpos)))
+             && hpos != NO_MOVE
+             && trymove(hpos, color, "break_through_helper-C", Fpos)) {
+           /* Now we make a second cut at e, trying to capture
+            * either b or c.
+            */
+           if (trymove(epos, other, "break_through_helper-D", Fpos)) {
+             if (!board[bpos]
+                 || !board[cpos] 
+                 || !defend_both(bpos, cpos))
+               success = WIN;
+             popgo();
+           }
+           popgo();
+         }
+         else
+           success = WIN; /* This should have been covered by
+                           * defend_both(), so probably unnecessary. */
+       }
+      }
+    }
+    popgo();
+  }
+
+  return success;
+}
+
+
+/* ---------------------------------------------------------------- */
+/*                              Threats                             */
+/* ---------------------------------------------------------------- */
+
+
+/* Return up to max_threats threats to capture the string at str.
+ * If the string is directly attackable the number of threats
+ * is reported to be 0.
+ *
+ * NOTE:  You can call attack_threats with moves[] and codes[] 
+ *        already partly filled in. So if you want to get the
+ *        threats from scratch, you have to set them to 0
+ *        yourself.
+ *
+ * FIXME: Shall we report upgrades, like we can capture in ko but
+ *        have a threat to capture unconditionally?
+ */
+
+int
+attack_threats(int str, int max_points, int moves[], int codes[])
+{
+  int other;
+  int num_threats;
+  int liberties;
+  int libs[MAXLIBS];
+  int num_adj;
+  int adjs[MAXCHAIN];
+  int k;
+  int l;
+  int r;
+
+  ASSERT1(IS_STONE(board[str]), str);
+  other = OTHER_COLOR(board[str]);
+
+  /* Only handle strings with no way to capture immediately.
+   * For now, we treat ko the same as unconditionally. */
+  if (attack(str, NULL) != 0)
+    return 0;
+
+  /* This test would seem to be unnecessary since we only threaten
+   * strings with attack_code == 0, but it turns out that single
+   * stones with one liberty that can be captured, but come to
+   * live again in a snap-back get attack_code == 0.
+   *
+   * The test against 6 liberties is just an optimization.
+   */
+  liberties = findlib(str, MAXLIBS, libs);
+  if (liberties > 1 && liberties < 6) {
+    for (k = 0; k < liberties; k++) {
+      int aa = libs[k];
+
+      /* Try to threaten on the liberty. */
+      if (trymove(aa, other, "attack_threats-A", str)) {
+       int acode = attack(str, NULL);
+       if (acode != 0)
+        movelist_change_point(aa, acode, max_points, moves, codes);
+       popgo();
+      }
+
+      /* Try to threaten on second order liberties. */
+      for (l = 0; l < 4; l++) {
+       int bb = libs[k] + delta[l];
+
+       if (!ON_BOARD(bb)
+           || IS_STONE(board[bb])
+           || liberty_of_string(bb, str))
+         continue;
+
+       if (trymove(bb, other, "attack_threats-B", str)) {
+         int acode = attack(str, NULL);
+         if (acode != 0)
+          movelist_change_point(bb, acode, max_points, moves, codes);
+         popgo();
+       }
+      }
+    }
+  }
+
+  /* Threaten to attack by saving weak neighbors. */
+  num_adj = chainlinks(str, adjs);
+  for (k = 0; k < num_adj; k++) {
+    int bb;
+    int dd;  /* Defense point of weak neighbor. */
+    int acode;
+    int dcode;
+
+    attack_and_defend(adjs[k], &acode, NULL, &dcode, &dd);
+    if (acode == 0 || dcode == 0)
+      continue;
+
+    /* The strange code using r == -1 below is only avoid duplication
+     * of the code starting with "if (trymove..)" below.
+     * If r == -1 and stackp == 0 then use the defense point what we got from
+     * attack_and_defend above. Otherwise step through all defense points.
+     */
+    for (r = -1; r < max_points; r++) {
+      if (stackp == 0) {
+       if (r == -1)
+         continue;
+       if (worm[adjs[k]].defense_codes[r] == 0)
+         break;
+       bb = worm[adjs[k]].defense_points[r];
+      }
+      else {
+       if (r == -1)
+         bb = dd;
+       else
+         break;
+      }
+
+      /* Test the move and see if it is a threat. */
+      if (trymove(bb, other, "attack_threats-C", str)) {
+       if (board[str] == EMPTY)
+         acode = WIN;
+       else
+         acode = attack(str, NULL);
+       if (acode != 0)
+         movelist_change_point(bb, acode, max_points, moves, codes);
+       popgo();
+      }
+    }
+  }
+
+  /* Return actual number of threats found regardless of attack code. */
+  if (codes[max_points - 1] > 0)
+    return max_points;
+  for (num_threats = 0; num_threats < max_points; num_threats++)
+    if (codes[num_threats] == 0)
+      break;
+  return num_threats;
+}
+
+
+/* ================================================================ */  
+/*                       Defensive functions                        */
+/* ================================================================ */
+
+
+/* Like find_defense, but takes the komaster argument. If the
+ * opponent is reading functions will not try
+ * to take ko.
+ */
+
+static int
+do_find_defense(int str, int *move)
+{
+  int xpos = NO_MOVE;
+  int dcode = 0;
+  int liberties;
+  int retval;
+  
+  SETUP_TRACE_INFO("find_defense", str);
+
+  /* We first check if the number of liberties is larger than four. In
+   * that case we don't cache the result and to avoid needlessly
+   * storing the position in the hash table, we must do this test
+   * before we look for cached results.
+   */
+  str = find_origin(str);
+  liberties = countlib(str);
+  
+  if (liberties > 4
+      || (liberties == 4 && stackp > fourlib_depth)
+      || (liberties == 3 && stackp > depth)) {
+    /* No need to cache the result in these cases. */
+    SGFTRACE(0, WIN, "too many liberties or stackp > depth");
+    if (move)
+      *move = 0;
+    return WIN;
+  }
+
+  /* Set "killer move" up.  This move (if set) was successful in
+   * another variation, so it is reasonable to try it now.  However,
+   * we only do this if the string has at least 3 liberties -
+   * otherwise the situation changes too much from variation to
+   * variation.
+   */
+  if (liberties > 2 && move)
+    xpos = *move;
+
+  if (stackp <= depth
+      && tt_get(&ttable, FIND_DEFENSE, str, NO_MOVE, depth - stackp, NULL, 
+               &retval, NULL, &xpos) == 2) {
+    /* Note that if return value is 1 (too small depth), the move will
+     * still be used for move ordering.
+     */
+    TRACE_CACHED_RESULT(retval, xpos);
+    SGFTRACE(xpos, retval, "cached");
+    if (move)
+      *move = xpos;
+    return retval;
+  }
+
+  if (liberties == 1)
+    dcode = defend1(str, &xpos);
+  else if (liberties == 2)
+    dcode = defend2(str, &xpos);
+  else if (liberties == 3)
+    dcode = defend3(str, &xpos);
+  else if (liberties == 4)
+    dcode = defend4(str, &xpos);
+
+  if (dcode) {
+    READ_RETURN(FIND_DEFENSE, str, depth - stackp, move, xpos, dcode);
+  }
+    
+  READ_RETURN0(FIND_DEFENSE, str, depth - stackp);
+}
+
+
+/* Determine if a `move' by `color' allows under-the-stones tesuji
+ * a.k.a. "big snapback".  Here is an example:
+ *
+ *     |XXXX...
+ *     |XXOOXXX
+ *     |OOOXOOX
+ *     |..O*OOX
+ *     +-------
+ *
+ * Even though the move at '*' allows black to capture four white
+ * stones, white can later recapture black stones and create a second
+ * eye.  This is very similar to a snapback.
+ *
+ * This function returns true if a move creates a string of with two
+ * liberties, which can, however, be instantly recaptured by opponent.
+ * It is actually not required that the move captures something.  If
+ * the caller needs captures, it should check for them itself.
+ */
+static int
+allows_under_the_stones_tesuji(int move, int color)
+{
+  int result = 0;
+  SGFTree *save_sgf_dumptree;
+  int save_count_variations;
+
+  if (accuratelib(move, color, 3, NULL) != 2)
+    return 0;
+
+  save_sgf_dumptree     = sgf_dumptree;
+  save_count_variations = count_variations;
+
+  sgf_dumptree    = NULL;
+  count_variations = 0;
+
+  if (trymove(move, color, "allows_under_the_stones_tesuji", NO_MOVE)) {
+    int libs[2];
+
+    findlib(move, 2, libs);
+    if ((!is_self_atari(libs[0], color)
+        && accuratelib(libs[1], OTHER_COLOR(color), 3, NULL) <= 2)
+       || (!is_self_atari(libs[1], color)
+           && accuratelib(libs[0], OTHER_COLOR(color), 3, NULL) <= 2))
+      result = 1;
+
+    popgo();
+  }
+
+  sgf_dumptree    = save_sgf_dumptree;
+  count_variations = save_count_variations;
+
+  return result;
+}
+
+
+/* Called by the defendN functions.  Don't think too much if there's
+ * an easy way to get enough liberties.
+ */
+static int
+fast_defense(int str, int liberties, int *libs, int *move)
+{
+  int color = board[str];
+  int j, k, l;
+  int goal_liberties = (stackp < fourlib_depth ? 5 : 4);
+  int adj, adjs[MAXCHAIN];
+
+  /* We would like to initialize liberty_mark to -1, but some
+   * compilers warn, quite correctly, that -1 is not an unsigned
+   * number.
+   */
+  static unsigned liberty_mark = ~0U;
+  static unsigned lm[BOARDMAX];
+
+  ASSERT1(libs != NULL, str);
+  ASSERT1(move != NULL, str);
+
+  for (k = 0; k < liberties; k++) {
+    /* accuratelib() seems to be more efficient than fastlib() here,
+     * probably because it catches more cases.
+     */
+    if (accuratelib(libs[k], color, goal_liberties, NULL) >= goal_liberties) {
+      *move = libs[k];
+      return 1;
+    }
+  }
+
+  /* Check the cases where an opponent neighbor string is in
+   * atari.
+   */
+  adj = chainlinks2(str, adjs, 1);
+  for (j = 0; j < adj; j++) {
+    int lib;
+    int missing = goal_liberties - liberties;
+    int total = 0;
+    int adj2, adjs2[MAXCHAIN];
+    int alib, alibs[MAXLIBS];
+    int num_adjacent_stones;
+
+    findlib(adjs[j], 1, &lib);
+    /* We aren't interested in ko (at this stage). And playing
+     * our own last liberty to capture is prone to snapbacks,
+     * so better let the 'normal' reading routines do the job.
+     */
+    if ((liberties == 1 && lib == libs[0]
+        && countstones(adjs[j]) <= 2)
+       || is_ko(lib, color, NULL))
+      continue;
+
+    /* Would the capture already gain enough liberties ?
+     * No need to test the case if the move is one of our liberties,
+     * it has already been done in the first loop of this function.
+     */
+    num_adjacent_stones = count_adjacent_stones(adjs[j], str, missing);
+    if (!liberty_of_string(lib, str)
+       && num_adjacent_stones >= missing) {
+      *move = lib;
+      return 1;
+    }
+    ASSERT1(num_adjacent_stones >= 1, str);
+
+    /* What is the total number of liberties of the friendly strings around
+     * the lunch?
+     */
+    if (++liberty_mark == 0) {
+      memset(lm, 0, sizeof(lm));
+      liberty_mark++;
+    }
+    /* Loop over all neighbors of the lunch. */
+    adj2 = chainlinks(adjs[j], adjs2);
+    for (k = 0; k < adj2; k++) {
+      /* Loop over all liberties of the neighbor. */
+      alib = findlib(adjs2[k], MAXLIBS, alibs);
+      for (l = 0; l < alib; l++) {
+       if (lm[alibs[l]] != liberty_mark) {
+         lm[alibs[l]] = liberty_mark;
+         total++;
+       }
+      }
+    }
+
+    /* The captured string is treated as common liberties, and
+     * some adjustements are made :
+     * - we're adding a stone for capturing the lunch (-1)
+     * - opponent might be able to remove a liberty (-1)
+     * - and possibly force us to connect (-1)
+     * - reduce us by one more liberty with a throw-in; this
+     *   is only possible if there is only one adjacent stone in the
+     *   lunch to the string (-1)
+     * Probably there are more damezumari-type cases, but as a heuristic,
+     * it seems good enough.
+     */
+    total += countstones(adjs[j]) - 2;
+    if (lm[lib] == liberty_mark)
+      total--;
+    if (num_adjacent_stones == 1)
+      total--;
+
+    if (total >= goal_liberties) {
+      /* One case when this code can give a false defense is an
+       * under-the-stones tesuji or "big snapback."  See reading:199
+       * for an example.  While this position is probably very rare,
+       * it is nice to make GNU Go understand "neat" tesujis.
+       */
+      if (liberties == 1 && lib == libs[0]
+         && allows_under_the_stones_tesuji(lib, color)) {
+       /* This is a bad "fast defense". */
+       continue;
+      }
+
+      *move = lib;
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+/* If str points to a string with exactly one liberty, defend1 
+ * determines whether it can be saved by extending or capturing
+ * a boundary chain having one liberty. The function returns WIN if the string
+ * can be saved, otherwise 0. It returns KO_A or KO_B if it can be saved,
+ * conditioned on ko. Returns KO_A if it can be saved provided (color) is
+ * willing to ignore any ko threat. Returns KO_B if it can be saved if (color)
+ * has a ko threat which must be answered.
+ *
+ * The pair defend1-attack2 call each other recursively to
+ * read situations such as ladders. They read all ladders to the end.
+ * If the reading ply (stackp) is deeper than the deep-reading cutoff
+ * parameter depth, whose default value DEPTH is defined in gnugo.h, then a
+ * string is assumed alive if it can get 3 liberties. When
+ * fourlib_depth < stackp < depth, a string is considered alive if it can get
+ * four liberties. When stackp < fourlib_depth, it is considered alive
+ * if it can get 5 liberties.
+ * */
+
+static int
+defend1(int str, int *move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int xpos;
+  int lib;
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int liberties;
+  int k;
+
+  SETUP_TRACE_INFO("defend1", str);
+  reading_node_counter++;
+  
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 1, str);
+
+  /* lib will be the liberty of the string. */
+  liberties = findlib(str, 1, &lib);
+  ASSERT1(liberties == 1, str);
+
+  if (fast_defense(str, liberties, &lib, &xpos))
+    RETURN_RESULT(WIN, xpos, move, "fast defense");
+
+  /* Collect moves to try in the first batch.
+   * 1. First order liberty.
+   * 2. Chain breaking moves.
+   * 3. Moves to set up a snapback.
+   */
+  moves.pos[0] = lib;
+  moves.score[0] = 0;
+  moves.message[0] = "liberty";
+  moves.num = 1;
+  moves.num_tried = 0;
+
+  break_chain_moves(str, &moves);
+  set_up_snapback_moves(str, lib, &moves);
+
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(0, NULL);
+
+  /* If the string is a single stone and a capture would give a ko,
+   * try to defend it with ko by backfilling.
+   *
+   * FIXME: What is an example of this? Is it correct that the
+   *           return value is WIN and not KO_A or KO_B?
+   */
+  if (stackp <= backfill_depth
+      && countstones(str) == 1
+      && is_ko(lib, other, NULL)) {
+    int libs2[6];
+    liberties = approxlib(lib, color, 6, libs2);
+    if (liberties <= 5) {
+      for (k = 0; k < liberties; k++) {
+       int apos = libs2[k];
+       if ((liberties == 1 || !is_self_atari(apos, other))
+           && trymove(apos, color, "defend1-C", str)) {
+         int acode = do_attack(str, NULL);
+         popgo();
+         CHECK_RESULT(savecode, savemove, acode, apos, move, "backfilling");
+       }
+      }
+    }
+  }
+  
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+
+/* If str points to a group with two liberties, defend2 determines
+ * whether the group can be saved by extending, or by capturing part of
+ * its surrounding chain. A group is considered safe if either part of
+ * the surrounding chain may be captured, or if it can get 3
+ * liberties. It is presumed that the opponent could kill if tenuki.
+ * If both extensions work, it prefers the one which maximizes 
+ * liberties.
+ *
+ * *move returns the move to save the stones.
+ */
+
+static int 
+defend2(int str, int *move)
+{
+  int color, other;
+  int xpos = NO_MOVE;
+  int liberties;
+  int libs[2];
+  int liberties2;
+  int libs2[6];
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int k;
+  int r;
+  int suggest_move = NO_MOVE;
+  int string_size;
+  int be_aggressive;
+
+  SETUP_TRACE_INFO("defend2", str);
+  reading_node_counter++;
+
+  color = board[str];
+  other = OTHER_COLOR(color);
+
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 2, str);
+
+  liberties = findlib(str, 2, libs);
+
+  if (fast_defense(str, liberties, libs, &xpos))
+    RETURN_RESULT(WIN, xpos, move, "fast defense");
+
+  /* Collect moves to try in the first batch.
+   * 1. First order liberties.
+   * 2. Chain breaking moves.
+   * 3. Second order liberties moving up from first line to second.
+   * 4. Edge clamps.
+   */
+  moves.num = 0;
+  moves.num_tried = 0;
+
+  /* We don't want to play self-atari liberties, unless the string is a
+   * single stone (in which case it might be a snapback move).  Sacrifices
+   * might be good moves, but not in tactical reading.
+   */
+  string_size = countstones(str);
+  if (string_size == 1 || !is_self_atari(libs[0], color))
+    ADD_CANDIDATE_MOVE(libs[0], 0, moves, "liberty");
+  if (string_size == 1 || !is_self_atari(libs[1], color))
+    ADD_CANDIDATE_MOVE(libs[1], 0, moves, "liberty");
+
+  break_chain_moves(str, &moves);
+  break_chain2_efficient_moves(str, &moves);
+  propose_edge_moves(str, libs, liberties, &moves, color);
+  edge_clamp_moves(str, &moves);
+
+  if (stackp <= depth) {
+    for (k = 0; k < liberties; k++)
+      special_rescue_moves(str, libs[k], &moves);
+    bamboo_rescue_moves(str, liberties, libs, &moves);
+  }
+
+  if (stackp <= backfill_depth)
+    special_rescue2_moves(str, libs, &moves);
+
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(0, &suggest_move);
+
+  /* Look for backfilling moves. */
+  for (k = 0; k < liberties; k++) {
+    if (is_self_atari(libs[k], other)) {
+      liberties2 = approxlib(libs[k], color, 6, libs2);
+      /* Note: liberties2 must be smaller than 5, otherwise libs[k] had been
+       * a direct defense.
+       */
+      for (r = 0; r < liberties2; r++) {
+       xpos = libs2[r];
+       /* If the newly placed stone would be in atari, but not a single
+        * stone, we don't even try.
+        */
+       if (!is_self_atari(xpos, color)
+           && has_neighbor(xpos, color))
+         ADD_CANDIDATE_MOVE(xpos, 0, moves, "backfill-A");
+      }
+    }
+
+    liberties2 = approxlib(libs[k], other, 3, libs2);
+    if (liberties2 <= 2) {
+      for (r = 0; r < liberties2; r++) {
+       xpos = libs2[r];
+       if (!is_self_atari(xpos, color))
+         ADD_CANDIDATE_MOVE(xpos, 0, moves, "backfill-B");
+      }
+    }
+  }
+
+  special_rescue4_moves(str, libs, &moves);
+  
+  /* Only order and test the new set of moves. */
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(0, &suggest_move);
+
+  /* If we haven't found any useful moves in first batches, be more
+   * aggressive in break_chain[23]_moves().
+   */
+  be_aggressive = (moves.num == 0);
+
+  if (stackp <= superstring_depth)
+    superstring_break_chain_moves(str, 4, &moves);
+
+  /* If nothing else works, we try playing a liberty of the
+   * super_string.
+   */
+  if (stackp <= superstring_depth) {
+    superstring_moves(str, &moves, 3, 0);
+    squeeze_moves(str, &moves);
+  }
+
+  break_chain2_defense_moves(str, &moves, be_aggressive);
+
+  if (stackp <= backfill_depth)
+    special_rescue5_moves(str, libs, &moves);
+
+  if (stackp <= break_chain_depth
+      || (be_aggressive && stackp <= backfill_depth))
+    break_chain3_moves(str, &moves, be_aggressive);
+
+  if (be_aggressive && stackp <= backfill_depth)
+    break_chain4_moves(str, &moves, be_aggressive);
+
+  /* Only order and test the new set of moves. */
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(0, &suggest_move);
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/* defend3(str, *move) attempts to find a move rescuing the 
+ * string at (str) with 3 liberties.  If such a move can be found,
+ * it returns true and the saving move in *move.
+ */
+
+static int 
+defend3(int str, int *move)
+{
+  int color;
+  int xpos = NO_MOVE;
+  int liberties;
+  int libs[3];
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int k;
+  int suggest_move = NO_MOVE;
+
+  SETUP_TRACE_INFO("defend3", str);
+  reading_node_counter++;
+
+  color = board[str];
+
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 3, str);
+
+  liberties = findlib(str, 3, libs);
+
+  if (fast_defense(str, liberties, libs, &xpos))
+    RETURN_RESULT(WIN, xpos, move, "fast defense");
+
+  /* Collect moves to try in the first batch.
+   * 1. First order liberties.
+   * 2. Chain breaking moves.
+   * 3. Second order liberties moving up from first line to second.
+   * 4. Edge clamps.
+   */
+  for (k = 0; k < liberties; k++) {
+    moves.pos[k] = libs[k];
+    moves.score[k] = 0;
+    moves.message[k] = "liberty";
+  }
+
+  moves.num = liberties;
+  moves.num_tried = 0;
+
+  break_chain_moves(str, &moves);
+  break_chain2_efficient_moves(str, &moves);
+  propose_edge_moves(str, libs, liberties, &moves, color);
+  edge_clamp_moves(str, &moves);
+
+  if (stackp <= backfill2_depth)
+    hane_rescue_moves(str, libs, &moves);
+
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(1, &suggest_move);
+
+  /* This looks a little too expensive. */
+#if 0
+  /* Look for backfilling moves. */
+  if (stackp <= backfill_depth) {
+    int other = OTHER_COLOR(color);
+    int liberties2;
+    int libs2[6];
+    int r;
+    int s;
+    for (k = 0; k < liberties; k++) {
+      if (is_self_atari(libs[k], other)) {
+       liberties2 = approxlib(libs[k], color, 6, libs2);
+       for (r = 0; r < liberties2; r++) {
+         xpos = libs2[r];
+         /* Don't reconsider previously tested moves. */
+         for (s = 0; s < moves.num; s++)
+           if (xpos == moves.pos[s])
+             break;
+         if (s < moves.num)
+           continue;
+         
+         if (trymove(xpos, color, "defend3-D", str)) {
+           int acode;
+           /* If the newly placed stone is in atari, we give up
+             * without fight.
+            */
+           if (countlib(xpos) == 1)
+             acode = WIN;
+           else
+             acode = do_attack(str, NULL);
+
+           popgo();
+           CHECK_RESULT(savecode, savemove, acode, xpos, move,
+                        "backfill effective");
+         }
+       }
+      }
+      else {
+       liberties2 = approxlib(libs[k], other, 3, libs2);
+       if (liberties2 <= 3) {
+         for (r = 0; r < liberties2; r++) {
+           xpos = libs2[r];
+           /* Don't reconsider previously tested moves. */
+           for (s = 0; s < moves.num; s++)
+             if (xpos == moves.pos[s])
+               break;
+           if (s < moves.num)
+             continue;
+           
+           if (!is_self_atari(xpos, color)
+               && trymove(xpos, color, "defend2-G", str)) {
+             int acode = do_attack(str, NULL);
+             popgo();
+             CHECK_RESULT(savecode, savemove, acode, xpos, move
+                          "backfill effective");
+           }
+         }
+       }
+      }
+    }
+  }
+#endif
+  
+  /* If nothing else works, try to defend with second order liberties. */
+
+  if (stackp <= backfill_depth)
+    special_rescue3_moves(str, libs, &moves);
+
+  if (stackp <= depth) {
+    for (k = 0; k < liberties; k++)
+      special_rescue_moves(str, libs[k], &moves);
+    bamboo_rescue_moves(str, liberties, libs, &moves);
+  }
+
+  if (get_level() >= 8 && stackp <= backfill2_depth)
+    superstring_break_chain_moves(str, 4, &moves);
+
+  if (stackp <= break_chain_depth)
+    break_chain2_defense_moves(str, &moves, 0);
+
+  if (stackp <= backfill_depth) {
+    special_rescue5_moves(str, libs, &moves);
+    special_rescue6_moves(str, libs, &moves);
+  }
+
+  /* Only order and test the new set of moves. */
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(1, &suggest_move);
+
+  /* If nothing else works, we try playing a liberty of the
+   * super_string.
+   */
+  if (get_level() >= 8 && stackp <= backfill2_depth) {
+    superstring_moves(str, &moves, 3, 0);
+    squeeze_moves(str, &moves);
+  }
+
+  if (stackp <= break_chain_depth)
+    break_chain3_moves(str, &moves, 0);
+
+  /* Only order and test the new set of moves. */
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(1, &suggest_move);
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/* defend4(str, *move) attempts to find a move rescuing the 
+ * string at (str) with 4 liberties.  If such a move can be found,
+ * it returns true, and if the pointer move is not NULL, 
+ * then it returns the saving move in *move.
+ */
+
+static int 
+defend4(int str, int *move)
+{
+  int color;
+  int xpos = NO_MOVE;
+  int liberties;
+  int libs[4];
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int k;
+  int suggest_move = NO_MOVE;
+
+  SETUP_TRACE_INFO("defend4", str);
+  reading_node_counter++;
+
+  color = board[str];
+
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 4, str);
+
+  liberties = findlib(str, 4, libs);
+
+  if (fast_defense(str, liberties, libs, &xpos))
+    RETURN_RESULT(WIN, xpos, move, "fast defense");
+
+  /* Collect moves to try in the first batch.
+   * 1. First order liberties.
+   * 2. Chain breaking moves.
+   */
+  for (k = 0; k < liberties; k++) {
+    moves.pos[k] = libs[k];
+    moves.score[k] = 0;
+    moves.message[k] = "liberty";
+  }
+
+  moves.num = liberties;
+  moves.num_tried = 0;
+
+  break_chain_moves(str, &moves);
+  break_chain2_efficient_moves(str, &moves);
+
+  if (stackp <= backfill_depth) {
+    break_chain2_defense_moves(str, &moves, 0);
+    break_chain3_moves(str, &moves, 0);
+    break_chain4_moves(str, &moves, 0);
+#if 0 
+    hane_rescue_moves(str, libs, &moves);
+#endif
+  if (stackp <= superstring_depth)
+    superstring_moves(str, &moves, 4, 0);
+    squeeze_moves(str, &moves);
+  }
+
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(1, &suggest_move);
+
+  if (stackp <= depth) {
+    for (k = 0; k < liberties; k++)
+      special_rescue_moves(str, libs[k], &moves);
+    bamboo_rescue_moves(str, liberties, libs, &moves);
+  }
+
+  order_moves(str, &moves, color, read_function_name, *move);
+  DEFEND_TRY_MOVES(1, &suggest_move);
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/*
+ * special_rescue_moves(str, lib, *move) is called with (str) a
+ * string having a liberty at (lib).
+ *
+ * This adds moves on a second order liberty to the list of candidate
+ * moves in the struct *moves; e.g. in shapes like:
+ *
+ *   .        O        O       X.XXO
+ *  O.*  or  ..*  or  O.*  or  XOOXO
+ *   O        O        O       ...*.
+ *                             -----
+ *
+ * This will occasionally save a string where no other move will. To
+ * reduce the branching caused by these moves, we require that the
+ * opponent can be trivially captured when trying to intercept on the
+ * corresponding first order liberty.
+ */
+
+static void
+special_rescue_moves(int str, int lib, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int otherlib;
+  int k;
+
+  /* Use approxlib() to test for trivial capture. */
+  otherlib = approxlib(lib, other, 3, NULL);
+  if (otherlib > 2)
+    return;
+
+  /* Loop over the four neighbours of the liberty, (lib + d). */
+  for (k = 0; k < 4; k++) {
+    int d = delta[k];
+    if (board[lib + d] == EMPTY) {
+
+      /* Don't play into a self atari unless we have a potential snapback. */
+      if (is_self_atari(lib + d, color) && otherlib > 1)
+       continue;
+
+      /* Be more demanding when the string has four liberties. (Mostly
+       * because attack4() otherwise would need more move generators.)
+       * More precisely we require not only the first order liberty to
+       * become a self atari for the opponent but also one more of the
+       * neighbors of the proposed move. See reading:144 for a
+       * position where we otherwise would try to defend at D9 and
+       * attack4() then lacks move generators to stop black from
+       * continuing towards the top left corner.
+       */
+      if (countlib(str) > 3) {
+       int r;
+       int number_protected = 0;
+       
+       for (r = 0; r < 4; r++) {
+         if (board[lib + d + delta[r]] == EMPTY
+             && approxlib(lib + d + delta[r], other, 3, NULL) < 3)
+           number_protected++;
+         if (number_protected == 2)
+           break;
+       }
+
+       if (number_protected < 2)
+         continue;
+      }
+      
+      ADD_CANDIDATE_MOVE(lib + d, 0, *moves, "special_rescue");
+    }
+  }
+}
+
+
+/*
+ * In situations like 
+ *
+ * XXXXXO
+ * XO.*.O
+ * XO.O.O
+ * XXXXXO
+ *
+ * playing at * is the correct rescue move, although the opponent cannot 
+ * be captured at the respective first-order liberty.
+ */
+static void
+bamboo_rescue_moves(int str, int num_libs, int libs[], 
+                    struct reading_moves *moves)
+{
+  int color = board[str];
+  int l1, l2;
+
+  for (l1 = 0; l1 < num_libs; l1++)
+    for (l2 = 0; l2 < num_libs; l2++) {
+      if (l1 == l2) 
+       continue;
+
+      if (libs[l1] == WEST(libs[l2]) || libs[l1] == EAST(libs[l2])) {
+       if (board[SOUTH(libs[l1])] == EMPTY 
+           && board[SOUTH(libs[l2])] == color
+           && !is_self_atari(SOUTH(libs[l1]), color))
+         ADD_CANDIDATE_MOVE(SOUTH(libs[l1]), 0, *moves, "bamboo_rescue");
+       if (board[NORTH(libs[l1])] == EMPTY 
+           && board[NORTH(libs[l2])] == color
+           && !is_self_atari(NORTH(libs[l1]), color))
+         ADD_CANDIDATE_MOVE(NORTH(libs[l1]), 0, *moves, "bamboo_rescue");
+      } 
+      else if (libs[l1] == NORTH(libs[l2]) || libs[l1] == SOUTH(libs[l2])) {
+       if (board[WEST(libs[l1])] == EMPTY 
+           && board[WEST(libs[l2])] == color
+           && !is_self_atari(WEST(libs[l1]), color))
+         ADD_CANDIDATE_MOVE(WEST(libs[l1]), 0, *moves, "bamboo_rescue");
+       if (board[EAST(libs[l1])] == EMPTY 
+           && board[EAST(libs[l2])] == color
+           && !is_self_atari(EAST(libs[l1]), color))
+         ADD_CANDIDATE_MOVE(EAST(libs[l1]), 0, *moves, "bamboo_rescue");
+      }
+    }
+}
+
+
+/* In a situation like this:
+ *       
+ *   OOXXXX     the following code can find the
+ *   .OXOOX     defensive move at 'c'.
+ *   .cO.OX
+ *   .X.OOX
+ *   ------
+ *
+ *   OOXXXX     It also can find more general moves like 'c' here.
+ *   .OXOOX     
+ *   cXO.OX
+ *   ...OOX
+ *   ------
+ */
+static void
+special_rescue2_moves(int str, int libs[2], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int newlibs[4];
+  int liberties;
+  int newstr;
+  int k, r, s;
+  
+  for (r = 0; r < 2; r++) {
+    /* Let alib be one of the liberties and require it to be suicide
+     * for the opponent.
+     */
+    int alib = libs[r];
+    if (!is_suicide(alib, other))
+      continue;
+
+    for (k = 0; k < 4; k++) {
+      if (board[alib + delta[k]] == color
+         && !same_string(alib + delta[k], str)) {
+       newstr = alib + delta[k];
+       liberties = findlib(newstr, 4, newlibs);
+       
+       for (s = 0; s < liberties && s < 4; s++) {
+         if (!is_self_atari(newlibs[s], color))
+           ADD_CANDIDATE_MOVE(newlibs[s], 0, *moves, "special_rescue2");
+       }
+       break_chain_moves(newstr, moves);
+       break_chain2_efficient_moves(newstr, moves);
+       edge_clamp_moves(newstr, moves);
+      }
+    }
+  }
+}
+
+
+/* In a situation like this:
+ *
+ *   ...X.XXO
+ *   .XXXOOXO
+ *   XXOO.OXO     the following code can find the
+ *   .O..X.*.     defensive move at '*'.
+ *   --------
+ *
+ *   OXO   cde
+ *   .*.   afg
+ *   ---   b--
+ */
+static void
+special_rescue3_moves(int str, int libs[3], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos, bpos, cpos, dpos, epos, fpos, gpos;
+  int k, l, r;
+
+  ASSERT1(countlib(str) == 3, str);
+  
+  for (r = 0; r < 3; r++) {
+    /* Let (apos) be one of the three liberties. */
+    apos = libs[r];
+    /* Try to find the configuration above. */
+    for (k = 0; k < 4; k++) {
+      bpos = apos + delta[k];
+      if (ON_BOARD(bpos))
+       continue;
+
+      cpos = apos - delta[k];
+      if (board[cpos] != color)
+       continue;
+      
+      if (!same_string(cpos, str))
+       continue;
+
+      for (l = 0; l < 2; l++) {
+       int normal = delta[(k+1)%4];
+       if (l == 1)
+         normal = -normal;
+       
+       dpos = cpos + normal;
+       if (board[dpos] != other)
+         continue;
+
+       epos = dpos + normal;
+       if (board[epos] != color)
+         continue;
+
+       fpos = apos + normal;
+       if (board[fpos] != EMPTY)
+         continue;
+
+       gpos = fpos + normal;
+       if (board[gpos] != EMPTY)       
+         continue;
+
+       /* Configuration found. Now require an X move at 'a' not
+        * getting too many liberties.
+        */
+
+       if (approxlib(apos, other, 4, NULL) > 3)
+         continue;
+       
+       /* Try to play at (fpos). */
+       ADD_CANDIDATE_MOVE(fpos, 0, *moves, "special_rescue3");
+      }
+    }
+  }
+}
+
+
+/* This code can find moves to counter attack moves generated by
+ * special_attack3_moves(). In case such an attack move has only two
+ * liberties, this function finds the liberty which is not common with
+ * the attacked string.
+ *
+ * For a typical example, see reading:198 where black L7 is generated
+ * by special_attack3_moves() and the response at L8 is generated by
+ * this function.
+ */
+
+static void
+special_rescue4_moves(int str, int libs[2], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int xpos;
+  int apos;
+  int bpos;
+  int libs2[2];
+  int k;
+  int r;
+
+  ASSERT1(countlib(str) == 2, str);
+
+  for (k = 0; k < 2; k++) {
+    apos = libs[k];
+    bpos = libs[1-k];
+    
+    if (apos == SOUTH(bpos) || apos == NORTH(bpos)) {
+      if (board[WEST(apos)] == other)
+       xpos = WEST(apos);
+      else if (board[EAST(apos)] == other)
+       xpos = EAST(apos);
+      else
+       continue;
+    }
+    else if (apos == WEST(bpos) || apos == EAST(bpos)) {
+      if (board[SOUTH(apos)] == other)
+       xpos = SOUTH(apos);
+      else if (board[NORTH(apos)] == other)
+       xpos = NORTH(apos);
+      else
+       continue;
+    }
+    else
+      return; /* Incorrect configuration, give up. */
+
+    if (findlib(xpos, 2, libs2) == 2) {
+      for (r = 0; r < 2; r++)
+       if (libs2[r] != apos && libs2[r] != bpos
+           && !is_self_atari(libs2[r], color))
+         ADD_CANDIDATE_MOVE(libs2[r], 0, *moves, "special_rescue4");
+    }
+  }
+}
+
+/* In a situation like this:
+ *
+ *   .XXXXX
+ *   XX.*OO
+ *   X.OX..     the following code can find the
+ *   ......     defensive move at '*'.
+ *   ------
+ *
+ *   .*   ac
+ *   OX   bd
+ *
+ * The only requirement is that d has at most as many liberties as b,
+ * and as the newly placed stone at c.
+ */
+static void
+hane_rescue_moves(int str, int libs[4], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos, bpos, cpos, dpos;
+  int num_libs = countlib(str);
+  int k, l, r;
+
+  ASSERT1(num_libs <= 4, str);
+  
+  for (r = 0; r < num_libs; r++) {
+    /* Let (apos) be one of the three liberties. */
+    apos = libs[r];
+    /* Try to find the configuration above. */
+    for (k = 0; k < 4; k++) {
+      bpos = apos + delta[k];
+      if (board[bpos] != color)
+       continue;
+
+      if (!same_string(bpos, str))
+       continue;
+
+      for (l = 0; l < 2; l++) {
+       int normal = delta[(k+1)%4];
+       if (l == 1)
+         normal = -normal;
+
+       cpos = apos + normal;
+       if (board[cpos] != EMPTY)
+         continue;
+
+       dpos = bpos + normal;
+       if (board[dpos] != other)
+         continue;
+
+       /* Configuration found. Now check liberty constraint. */
+       {
+         int dlibs = countlib(dpos);
+         if (dlibs > num_libs
+             || dlibs > accuratelib(cpos, color, dlibs, NULL))
+           continue;
+       }
+       
+       if (0 && !in_list(cpos, moves->num, moves->pos)) {
+         gprintf("hane_rescue_move added for %1m at %1m\n", str, cpos);
+         dump_stack();
+         showboard(0);
+       }
+       ADD_CANDIDATE_MOVE(cpos, 0, *moves, "hane_rescue");
+      }
+    }
+  }
+}
+
+
+/* In situations like these
+ *
+ *   |XXXX    |.X...    |.X...
+ *   |OOOX    |.XOO.    |XXOO.
+ *   |..OX    |OOXO.    |OOXO.
+ *   |O.OX    |O.X*O    |O.XOO
+ *   |.X*.    |O.X.O    |O.X*O
+ *   +----    +-----    +-----
+ *
+ * the smaller of the O strings can be defended by *. The property
+ * they have in common is that the defended string has (at least) two
+ * liberties in common with an X string and it's effective to play on
+ * an exterior liberty of this string. Similarly it may be worth
+ * defending a weak neighbor of the X string.
+ *
+ * This function may be called for strings with 2 or 3 liberties and
+ * returns moves which are potentially useful in these positions.
+ */
+static void
+special_rescue5_moves(int str, int libs[3],
+                      struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos, bpos;
+  int k, r, s;
+  int liberties = countlib(str);
+  int libs2[4];
+  int liberties2;
+
+  ASSERT1(liberties == 2 || liberties == 3, str);
+  
+  for (r = 0; r < liberties; r++) {
+    apos = libs[r];
+    
+    for (k = 0; k < 4; k++) {
+      bpos = apos + delta[k];
+      if (board[bpos] != other)
+       continue;
+
+      /* Don't bother if it has too many liberties. */
+      if (countlib(bpos) > liberties + 1)
+       continue;
+
+      if (count_common_libs(str, bpos) < 2)
+       continue;
+
+      liberties2 = findlib(bpos, 4, libs2);
+      for (s = 0; s < liberties2; s++)
+       if (!liberty_of_string(libs2[s], str)
+           && !is_self_atari(libs2[s], color))
+         ADD_CANDIDATE_MOVE(libs2[s], 0, *moves, "special_rescue5-A");
+
+      /* Reinforce the second order chain. */
+      if (liberties2 <= liberties) {
+       int adj;
+       int adjs[MAXCHAIN];
+       int t;
+       adj = chainlinks2(bpos, adjs, 1);
+       for (t = 0; t < adj; t++) {
+         int cpos;
+         break_chain_moves(adjs[t], moves);
+         
+         findlib(adjs[t], 1, &cpos);
+         if (!is_self_atari(cpos, color))
+           ADD_CANDIDATE_MOVE(cpos, 0, *moves, "special_rescue5-B");
+       }
+  
+       /* Defend against double atari in the surrounding chain early. */
+       double_atari_chain2_moves(bpos, moves, 0);
+      }
+    }
+  }
+}
+
+
+/* In situations like this
+ *
+ *   |.bOX
+ *   |.Xa.
+ *   |.OXX
+ *   |.O..
+ *   |.XX.
+ *
+ * the lower O string can often be defended at a or b.
+ *
+ * This function may be called for strings with 3 or 4 liberties and
+ * returns the * moves in the configuration below:
+ *
+ * |..O   |.*O
+ * |.X.   |.c*
+ * |.O?   |ab?
+ *
+ * It also adds the * move in these configurations:
+ * 
+ * |.X.   |.c*
+ * |.OX   |abX
+ *
+ * |.X.   |.c*
+ * |.O.   |ab.
+ *
+ * Provided that * is not a self atari and that the X strings have
+ * sufficiently few liberties.
+ */
+static void
+special_rescue6_moves(int str, int libs[3], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos, bpos, cpos;
+  int right, up;
+  int k, l, r;
+  int liberties = countlib(str);
+
+  ASSERT1(liberties == 3 || liberties == 4, str);
+  
+  for (r = 0; r < liberties; r++) {
+    apos = libs[r];
+    
+    for (k = 0; k < 4; k++) {
+      right = delta[k];
+      
+      if (ON_BOARD(apos - right))
+       continue;
+      
+      bpos = apos + right;
+      if (board[bpos] != color || !same_string(str, bpos))
+       continue;
+
+      for (l = 0; l < 2; l++) {
+       up = delta[(k+1) % 4];
+       if (l == 1)
+         up = -up;
+
+       cpos = bpos + up;
+       if (board[cpos] != other)
+         continue;
+
+       if (board[apos + up] != EMPTY)
+         continue;
+
+       if (board[cpos + right] != EMPTY)
+         continue;
+
+       if (board[apos + up + up] == EMPTY
+           && board[cpos + up] == EMPTY
+           && board[cpos + up + right] == color) {
+         ADD_CANDIDATE_MOVE(cpos + right, 0, *moves, "special_rescue6-A");
+         ADD_CANDIDATE_MOVE(cpos + up, 0, *moves, "special_rescue6-B");
+       }
+       else if (countlib(cpos) <= 3
+                && (board[bpos + right] == EMPTY
+                    || (board[bpos + right] == other
+                        && countlib(bpos + right) <= 4))
+                && !is_self_atari(cpos + right, color)) {
+         ADD_CANDIDATE_MOVE(cpos + right, 0, *moves, "special_rescue6-C");
+       }
+      }
+    }
+  }
+}
+
+/*
+ * set_up_snapback_moves() is called with (str) a string having a
+ * single liberty at (lib).
+ *
+ * This adds moves which may defend a string in atari by capturing a
+ * neighbor in a snapback. One example is this position:
+ *
+ * OOOOO
+ * OXXXO
+ * OX.OX
+ * OXOXX
+ * OX*..
+ * -----
+ *
+ * This code also finds the move * to defend the lone O stone with ko
+ * in this position:
+ *
+ * |XXXXX
+ * |XOOOX
+ * |OX.OO
+ * |.*...
+ * +-----
+ *
+ */
+
+static void
+set_up_snapback_moves(int str, int lib, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int libs2[2];
+
+  ASSERT1(countlib(str) == 1, str);
+
+  /* This can only work if our string is a single stone and the
+   * opponent is short of liberties.
+   */
+  if (stackp <= backfill_depth
+      && countstones(str) == 1
+      && approxlib(lib, other, 2, libs2) == 1
+      && (!is_self_atari(libs2[0], color)
+         || is_ko(libs2[0], color, NULL)))
+    ADD_CANDIDATE_MOVE(libs2[0], 0, *moves, "set_up_snapback");
+}
+
+
+
+/* This function adds liberties of the superstring as candidate moves.
+ * For performance, this is restricted to strings with liberty_cap
+ * liberties, and to cases where at most 5 liberties would get considered.
+ *
+ * When attacking, we also try backfilling in case the direct approach
+ * would be self-atari. 
+ * When defending, we also try second order liberties.
+ */
+static void
+superstring_moves(int str, struct reading_moves *moves, 
+                 int liberty_cap, int does_attack)
+{
+  int ss_liberties;
+  int ss_libs[MAX_LIBERTIES + 4];
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int k;
+
+  find_superstring_liberties(str, &ss_liberties, ss_libs, liberty_cap);
+  if (ss_liberties <= 5) {
+    for (k = 0; k < ss_liberties; k++) {
+      int apos = ss_libs[k];
+      int alibs[2];
+      int alib = accuratelib(apos, other, 2, alibs);
+
+      if (liberty_of_string(apos, str))
+       continue;
+
+      if (alib >= 2)
+       ADD_CANDIDATE_MOVE(apos, 0, *moves, "superstring liberty");
+      else if (alib == 1
+              && does_attack
+              && board[alibs[0]] == EMPTY
+              && approxlib(alibs[0], other, 3, NULL) >= 3)
+       ADD_CANDIDATE_MOVE(alibs[0], 0, *moves, "superstring backfill");
+
+      if (!does_attack)
+       special_rescue_moves(str, apos, moves);
+    }
+  }
+}
+
+
+/* This function is somewhat related to superstring_moves() but tries
+ * to find moves to squeeze out liberties from the superstring, aiming
+ * to capture the main string in a shortage of liberties.
+ *
+ * For a typical example, see the move E9 in reading:203,204. It is
+ * assumed that the same move is effective both for attack and
+ * defense.
+ */
+static void
+squeeze_moves(int str, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int libs[4];
+  int num_libs;
+  int libs2[4];
+  int num_libs2;
+  int k;
+  int r;
+  int potential_move = NO_MOVE;
+  int previous_liberty;
+
+  num_libs = findlib(str, 4, libs);
+  gg_assert(num_libs <= 4);
+
+  for (k = 0; k < num_libs; k++) {
+    if (!is_suicide(libs[k], other))
+      continue;
+
+    num_libs2 = approxlib(libs[k], color, 4, libs2);
+    if (num_libs2 != num_libs)
+      continue;
+
+    for (r = 0; r < num_libs2; r++)
+      if (!liberty_of_string(libs2[r], str)) {
+       potential_move = libs2[r];
+       break;
+      }
+
+    previous_liberty = libs[k];
+
+    while (is_suicide(potential_move, other)) {
+      num_libs2 = approxlib(potential_move, color, 3, libs2);
+      if (num_libs2 != 2) {
+       potential_move = NO_MOVE;
+       break;
+      }
+      if (libs2[0] == previous_liberty) {
+       previous_liberty = potential_move;
+       potential_move = libs2[1];
+      }
+      else {
+       previous_liberty = potential_move;
+       potential_move = libs2[0];
+      }
+      if (liberty_of_string(potential_move, str)) {
+       potential_move = NO_MOVE;
+       break;
+      }
+    }
+    
+    if (potential_move == NO_MOVE
+       || !is_self_atari(potential_move, other))
+      continue;
+
+    approxlib(potential_move, other, 1, libs2);
+
+    num_libs2 = approxlib(libs2[0], color, MAXLIBS, NULL);
+    
+    if (num_libs2 < 3
+       && num_libs2 < approxlib(potential_move, color, MAXLIBS, NULL))
+      ADD_CANDIDATE_MOVE(potential_move, 0, *moves, "squeeze move");
+  }
+}
+
+
+/* In positions like
+ *
+ * |.XXOO.
+ * |XXOX..
+ * |OOOX*.
+ * |......
+ * +------
+ *
+ * the O stones to the left are best defended by the move at *.
+ *
+ * This function tries to find an adjacent string (apos) with exactly
+ * three liberties. One of the liberties (bpos) must be on the edge
+ * (but not in the corner). Diagonal to this liberty must be one stone
+ * of the attacked string (cpos) and another liberty (dpos) of the
+ * adjacent string. The third liberty (epos) must be adjacent to
+ * (dpos). Furthermore must an O stone at (dpos) get at least three
+ * liberties and and X stone at (epos) must get at most three
+ * liberties.
+ *
+ * |.XXOO.
+ * |XXOXe.
+ * |OOcad.
+ * |...b..
+ * +------
+ *
+ * The defense move at (dpos) is proposed if the above conditions
+ * are satisfied.
+ */
+
+static void
+edge_clamp_moves(int str, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos;
+  int bpos;
+  int cpos;
+  int dpos;
+  int epos;
+  int adj, adjs[MAXCHAIN];
+  int libs[3];
+  int k, l, r;
+  
+  /* Pick up neighbors with three liberties. */
+  adj = chainlinks2(str, adjs, 3);
+
+  for (r = 0; r < adj; r++) {
+    apos = adjs[r];
+    /* Find a liberty at the edge. */
+    bpos = NO_MOVE;
+    findlib(apos, 3, libs);
+    for (k = 0; k < 3; k++) {
+      if (is_edge_vertex(libs[k])) {
+       bpos = libs[k];
+       break;
+      }
+    }
+    if (bpos == NO_MOVE)
+      continue;
+
+    /* Edge liberty found. Establish up and right directions. */
+    for (k = 0; k < 4; k++) {
+      int up = delta[k];
+      if (ON_BOARD(bpos - up))
+       continue;
+      if (board[bpos + up] != other)
+       continue;
+       
+      for (l = 0; l < 2; l++) {
+       int right = delta[(k+1)%4];
+       if (l == 1)
+         right = -right;
+
+       cpos = bpos + up - right;
+       dpos = bpos + up + right;
+
+       if (board[cpos] != color || !same_string(cpos, str))
+         continue;
+
+       if (board[dpos] != EMPTY || !liberty_of_string(dpos, apos))
+         continue;
+
+       epos = dpos + up;
+
+       if (board[epos] != EMPTY || !liberty_of_string(epos, apos))
+         continue;
+
+       if (approxlib(dpos, color, 3, NULL) < 3)
+         continue;
+       
+       if (approxlib(epos, other, 4, NULL) > 3)
+         continue;
+
+       /* (dpos) looks like a good move. Add it to the list with a
+         * substantial initial score.
+        */
+       ADD_CANDIDATE_MOVE(dpos, 10, *moves, "edge_clamp");
+      }
+    }
+  }
+}
+
+
+/* 
+ * This function handles some special cases on the edge.
+ *
+ * 1. If (str) points to a string and 'a' an edge liberty of it,
+ *    there is no point of trying to defend the string by crawling 
+ *    along the edge if there is no hope of ever getting more liberties.
+ *    This is of course if the blocking enemy group has enough liberties
+ *    of its own.
+ *
+ *      XX       XX
+ *      O.       Oa
+ *      --       --
+ *
+ *    This function searches the edge towards the corner and sees if there
+ *    is a friendly stone on one of the two first lines. If not, the move
+ *    is removed from the  list of moves.
+ *
+ * 2. If (str) points to a string and 'a' an edge liberty of it,
+ *    the drawing back/climbing up move 'b' is often correct attack or
+ *    defense. Another good move to try is 'c' (but usually not for
+ *    defense of a 2 liberty string).
+ * 
+ *      X.?        Xbc
+ *      O..        Oa.
+ *      ---        ---
+ *
+ *    This function adds the points configured like 'b' and 'c' relative to
+ *    (str) to the list of moves.
+ *
+ * color is the color to move.
+ */
+
+static void
+propose_edge_moves(int str, int *libs, int liberties,
+                   struct reading_moves *moves, int to_move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int right;
+  int up;
+  int apos;
+  int k, l;
+  int r;
+
+  for (r = 0; r < liberties; r++) {
+    apos = libs[r];
+    for (k = 0; k < 4; k++) {
+      up = delta[k];
+      if (ON_BOARD(apos - up))
+       continue;
+      
+      for (l = 0; l < 2; l++) {
+       right = delta[(k+1)%4];
+       if (l == 1)
+         right = -right;
+       
+       if (board[apos + up] == other      /* other on top of liberty */
+           && countlib(apos + up) > 4     /* blocking group must be secure */
+           && color == to_move) {         /* only applicable as defense */
+
+         /* Case 1: other above the liberty (crawl along the edge). */
+         int xpos = apos;
+       
+         while (ON_BOARD(xpos)) {
+           if (board[xpos] == color
+               || board[xpos + up] == color)
+             break;
+
+           xpos += right;
+         }
+
+         /* If no friendly stone found, then it is pointless and we
+          * can just as well remove the move.
+          */
+         if (!ON_BOARD(xpos)) {
+           REMOVE_CANDIDATE_MOVE(apos, *moves);
+         }
+       }
+       else if (board[apos + up] == EMPTY  /* empty above the liberty */
+                && board[apos - right + up] == other
+                && board[apos + right] == EMPTY) { /* empty to the right */
+
+         /* Case 2: Try to escape or contain. */
+         
+         /* Add b 
+          * If adjacent X stone in atari, boost the initial score of this
+          * move.
+          */
+         if (countlib(apos + up - right) == 1)
+           ADD_CANDIDATE_MOVE(apos + up, 10, *moves, "propose_edge-A");
+         else {
+           ADD_CANDIDATE_MOVE(apos + up, 0, *moves, "propose_edge-B");
+           
+           /* Add c if empty */
+           if (board[apos + right + up] == EMPTY
+               && (liberties != 2 || color != to_move))
+             ADD_CANDIDATE_MOVE(apos + right + up, 0, *moves,
+                                "propose_edge-C");
+         }
+       }
+      }
+    }
+  }
+}
+
+
+/* ================================================================ */  
+/*                       Attacking functions                        */
+/* ================================================================ */
+
+
+/* Like attack. If the opponent is komaster reading functions will not try
+ * to take ko.
+ */
+static int 
+do_attack(int str, int *move)
+{
+  int color = board[str];
+  int xpos = NO_MOVE;
+  int liberties;
+  int result = 0;
+  int retval;
+
+  SETUP_TRACE_INFO("attack", str);
+
+  ASSERT1(color != 0, str);
+
+  if (color == 0)      /* if assertions are turned off, silently fails */
+    return 0;
+
+  str = find_origin(str);
+  liberties = countlib(str);
+
+  if (liberties > 4
+      || (liberties == 4 && stackp > fourlib_depth)
+      || (liberties == 3 && stackp > depth)) {
+    /* No need to cache the result in these cases. */
+    if (sgf_dumptree) {
+      char buf[100];
+      sprintf(buf, "got 4 liberties (stackp:%d>%d)", 
+              stackp, fourlib_depth);
+      SGFTRACE(0, 0, buf);
+    }
+    return 0;
+  }
+
+  /* Set "killer move" up.  This move (if set) was successful in
+   * another variation, so it is reasonable to try it now.  However,
+   * we only do this if the string has 4 liberties - otherwise the
+   * situation changes too much from variation to variation.
+   */
+  if (liberties > 3 && move)
+    xpos = *move;
+
+  /* Note that if return value is 1 (too small depth), the move will
+   * still be used for move ordering.
+   */
+  if (stackp <= depth
+      && tt_get(&ttable, ATTACK, str, NO_MOVE, depth - stackp, NULL, 
+               &retval, NULL, &xpos) == 2) {
+    TRACE_CACHED_RESULT(retval, xpos);
+    SGFTRACE(xpos, retval, "cached");
+    if (move)
+      *move = xpos;
+    return retval;
+  }
+
+  /* Treat the attack differently depending on how many liberties the 
+     string at (str) has. */
+  if (liberties == 1)
+    result = attack1(str, &xpos);
+  else if (liberties == 2) {
+    if (stackp > depth + 10)
+      result = simple_ladder(str, &xpos);
+    else
+      result = attack2(str, &xpos);
+  }
+  else if (liberties == 3)
+    result = attack3(str, &xpos);
+  else if (liberties == 4)
+    result = attack4(str, &xpos);
+
+
+  ASSERT1(result >= 0 && result <= WIN, str);
+  
+  if (result) {
+    READ_RETURN(ATTACK, str, depth - stackp, move, xpos, result);
+  }
+
+  READ_RETURN0(ATTACK, str, depth - stackp);
+}
+
+
+/* If (str) points to a group with exactly one liberty, attack1
+ * determines whether it can be captured by playing at this liberty.
+ * If successful, (*move) is the killing move. move may be NULL if
+ * caller is only interested in whether it can be captured.
+ *
+ * The attack may fail for two different reasons. The first one is
+ * that the attack may be an illegal ko capture, in this case KO_B is
+ * returned (need to play a ko threat before the attack can be
+ * fulfilled).
+ *
+ * The second cause for failure is that the attack is caught in a
+ * snapback. We must require that it is a proper snapback, though. By
+ * proper snapback we mean a position like
+ *
+ *  XXXXO
+ *  XO.XO
+ *  XOXOO
+ *  -----
+ *
+ * where capture by O and recapture by X leaves the X stone intact
+ * with at least two liberties:
+ *
+ *  XXXXO
+ *  X..XO
+ *  X.XOO
+ *  -----
+ *
+ * There are a number of different kinds of improper snapbacks, which
+ * have in common that the attacked string ends up captured. We don't
+ * consider these as failures to attack. Three examples are given below.
+ *
+ *   XXOOOOO     (X can recapture but loses most of the string.)
+ *   X.XXXXO
+ *   -------
+ *
+ *   XXXOOOOOOOO (Like the previous example, except O loses one more stone)
+ *   XO*XXXXXXXO
+ *   -----------
+ *
+ *   XXXOO       (After three captures, the lone X stone is gone.)
+ *   XO.XO
+ *   -----
+ *
+ * This function is fast and never branches. There's little point in
+ * caching the result.
+ */
+
+static int
+attack1(int str, int *move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int xpos;
+  int savemove = 0;
+  int savecode = 0;
+  int liberties;
+  int libs[6];
+  int k;
+  int r;
+  int adjs[MAXCHAIN];
+  int adj;
+  int apos;
+  
+  
+  SETUP_TRACE_INFO("attack1", str);
+  reading_node_counter++;
+  
+  /* Pick up the position of the liberty. */
+  findlib(str, 1, &xpos);
+
+  /* If the attacked string consists of more than one stone, the
+   * attack never fails. (This assumes simple ko rule. With superko
+   * rule it could still be a ko violation.)
+   */
+  if (countstones(str) > 1) {
+    RETURN_RESULT(WIN, xpos, move, "last liberty");
+  }
+  
+  /* Try to play on the liberty. This fails if and only if it is an
+   * illegal ko capture.
+   */
+  if (trymove(xpos, other, "attack1-A", str)) {
+    /* Is the attacker in atari? If not the attack was successful. */
+    if (countlib(xpos) > 1) {
+      popgo();
+      RETURN_RESULT(WIN, xpos, move, "last liberty");
+    }
+
+    /* If the attacking string is also a single stone, a possible
+     * recapture would be a ko violation, so the defender has to make
+     * a ko threat first.
+     */
+    else if (countstones(xpos) == 1) {
+      if (get_komaster() != other) {
+       /* If the defender is allowed to take the ko the result is KO_A. */
+       CHECK_RESULT_UNREVERSED(savecode, savemove, KO_A, xpos, move,
+                               "last liberty - ko");
+      }
+      else {
+       /* But if the attacker is the attack was successful. */
+       popgo();
+       RETURN_RESULT(WIN, xpos, move, "last liberty");
+      }
+    }
+      
+    /* Otherwise, do recapture. Notice that the liberty must be
+     * at (str) since we have already established that this string
+     * was a single stone.
+     */
+    else if (trymove(str, color, "attack1-B", str)) {
+      /* If this was a proper snapback, (str) will now have more
+       * than one liberty.
+       */
+      if (countlib(str) > 1) {
+       /* Proper snapback, attack fails. */
+       popgo();
+      }
+      else {
+       popgo();
+       popgo();
+       RETURN_RESULT(WIN, xpos, move, "last liberty");
+      }
+    }
+    popgo();
+  }
+  else {/* Illegal ko capture. */
+    if (get_komaster() != color) {
+      CHECK_RESULT_UNREVERSED(savecode, savemove, KO_B, xpos, move,
+                             "last liberty - ko");
+    }
+  }
+
+  /* If not yet successful, try backfilling and back-capturing.
+   * An example of back-capturing can be found in reading:234.
+   * Backfilling is maybe only meaningful in positions involving ko.
+   */
+  liberties = approxlib(xpos, color, 6, libs);
+  if (liberties <= 5)
+    for (k = 0; k < liberties; k++) {
+      apos = libs[k];
+      if (!is_self_atari(apos, other)
+         && trymove(apos, other, "attack1-C", str)) {
+       int dcode = do_find_defense(str, NULL);
+       if (dcode != WIN && do_attack(str, NULL)) {
+         if (dcode == 0) {
+           popgo();
+           RETURN_RESULT(WIN, apos, move, "backfilling");
+         }
+         UPDATE_SAVED_KO_RESULT(savecode, savemove, dcode, apos);
+       }
+       popgo();
+      }
+    }
+
+  adj = chainlinks2(str, adjs, 1);
+  for (r = 0; r < adj; r++) {
+    if (liberty_of_string(xpos, adjs[r])) {
+      int adjs2[MAXCHAIN];
+      int adj2;
+      adj2 = chainlinks2(adjs[r], adjs2, 1);
+      for (k = 0; k < adj2; k++) {
+       int ko_move;
+       if (adjs2[k] == str)
+         continue;
+       findlib(adjs2[k], 1, &apos);
+       if (komaster_trymove(apos, other, "attack1-D", str,
+                            &ko_move, stackp <= ko_depth && savecode == 0)) {
+         if (!ko_move) {
+           int dcode = do_find_defense(str, NULL);
+           if (dcode != WIN
+               && do_attack(str, NULL)) {
+             popgo();
+             CHECK_RESULT(savecode, savemove, dcode, apos, move,
+                          "attack effective");
+           }
+           else
+             popgo();
+         }
+         else {
+           if (do_find_defense(str, NULL) != WIN
+               && do_attack(str, NULL) != 0) {
+             savemove = apos;
+             savecode = KO_B;
+           }
+           popgo();
+         }
+       }
+      }
+    }
+  }
+  
+  if (savecode == 0) {
+    RETURN_RESULT(0, 0, move, NULL);
+  }
+  
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/* If str points to a group with exactly two liberties
+ * attack2 determines whether it can be captured in ladder or net.
+ * If yes, *move is the killing move. move may be null if caller 
+ * is only interested in whether it can be captured.
+ *  
+ * Returns KO_A or KO_B if it can be killed conditioned on ko. Returns
+ * KO_A if it can be killed provided (other) is willing to ignore any
+ * ko threat. Returns KO_B if (other) wins provided he has a ko threat
+ * which must be answered. Can give a return code KO_B yet *move=0 if
+ * the winning move is an illegal ko capture. In this case, making a
+ * ko threat and having it answered should transform the position to
+ * one where the return code is KO_A.
+ *
+ * See the comment before defend1 about ladders and reading depth.
+ */
+
+static int 
+attack2(int str, int *move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int hpos;
+  int xpos = NO_MOVE;
+  int liberties, r;
+  int libs[2];
+  int libs2[2];
+  int adj, adjs[MAXCHAIN];
+  int savemove = 0;
+  int savecode = 0;
+  int k;
+  int atari_possible = 0;
+  struct reading_moves moves;
+  int adjacent_liberties = 0;
+  int pass;
+  int suggest_move = NO_MOVE;
+
+  SETUP_TRACE_INFO("attack2", str);
+  reading_node_counter++;
+  moves.num = 0;
+  moves.num_tried = 0;
+
+  str = find_origin(str);
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 2, str);
+
+  for (pass = 0; pass < 4; pass++) {
+    
+    switch (pass) {
+    case 0:
+      /* The attack may fail if a boundary string is in atari and cannot
+       * be defended.  First we must try defending such a string.
+       *
+       * We start by trying to defend the boundary string by looking for an
+       * adjacent string which is in atari.
+       */
+      adj = chainlinks2(str, adjs, 1);
+      for (r = 0; r < adj; r++) {
+        /* If stackp > depth and any boundary chain is in atari, assume safe.
+         * However, if the captured chain is only of size 1, there can still
+         * be a working ladder, so continue if that is the case.
+        * Also if the string in atari shares its liberty with the
+        * attacked string, drawing it out may enable the ladder to
+        * continue.
+         */
+        if (stackp > depth
+           && countstones(adjs[r]) > 1
+           && !have_common_lib(str, adjs[r], NULL)) {
+          RETURN_RESULT(0, 0, move, "boundary in atari");
+        }
+
+        /* Pick up moves breaking the second order chain. */
+        if (stackp <= depth)
+          break_chain_moves(adjs[r], &moves);
+
+        findlib(adjs[r], 1, &hpos);
+        ADD_CANDIDATE_MOVE(hpos, 0, moves, "save_boundary");
+      }
+
+      /* Get the two liberties of (str). */
+      liberties = findlib(str, 2, libs);
+      ASSERT1(liberties == 2, str);
+
+      if (DIRECT_NEIGHBORS(libs[0], libs[1]))
+        adjacent_liberties = 1;
+
+      for (k = 0; k < 2; k++) {
+        int apos = libs[k];
+        if (!is_self_atari(apos, other))
+          atari_possible = 1;
+       /* We only want to consider the move at (apos) if:
+         * stackp <= backfill_depth
+         * -or-  stackp <= depth and it is an isolated stone
+         * -or-  it is not in immediate atari
+         */
+        if (stackp <= backfill_depth
+           || ((stackp <= depth || adjacent_liberties)
+               && !has_neighbor(apos, other))
+           || !is_self_atari(apos, other))
+          ADD_CANDIDATE_MOVE(apos, 0, moves, "liberty");
+
+        /* Try backfilling if atari is impossible. */
+        if (stackp <= backfill_depth
+           && approxlib(apos, other, 2, libs2) == 1) {
+          ADD_CANDIDATE_MOVE(libs2[0], 0, moves, "backfill");
+          /* If there is a neighbor in atari, we also try back-capturing. */
+          for (r = 0; r < 4; r++) {
+           int bpos = libs2[0] + delta[r];
+           if (board[bpos] == other && chainlinks2(bpos, adjs, 1) > 0) {
+             /* FIXME: If there is more than one neighbor in atari, we
+               * currently just take one randomly. This is maybe not good
+               * enough. We might also want to check against snapback.
+              *
+              * FIXME: What is the purpose of this? It produces some
+              * completely irrelevant moves (e.g. if bpos is a huge string
+              * with many liberties and adjs[0] is somewhere else on the
+              * board).
+              */
+             findlib(adjs[0], 1, &xpos);
+             ADD_CANDIDATE_MOVE(xpos, 0, moves, "back-capture");
+           }
+          }
+        }
+      }
+
+      /* If we can't make a direct atari, look for edge blocking moves. */
+      if (!atari_possible)
+        for (k = 0; k < 2; k++)
+          edge_block_moves(str, libs[k], &moves);
+    
+
+      /* If one of the surrounding chains have only two liberties, which
+       * coincide with the liberties of the attacked string, we try to
+       * backcapture.
+       */
+  
+      adj = chainlinks2(str, adjs, 2);
+      for (r = 0; r < adj; r++) {
+        int apos = adjs[r];
+        if (liberty_of_string(libs[0], apos)
+           && liberty_of_string(libs[1], apos))
+          break_chain_moves(apos, &moves);
+      }
+
+      propose_edge_moves(str, libs, liberties, &moves, other);
+
+      break;
+
+    case 1:
+      if (stackp <= backfill_depth) {
+        special_attack2_moves(str, libs, &moves);
+        special_attack3_moves(str, libs, &moves);
+       special_attack4_moves(str, libs, &moves);
+      }
+      break;
+
+    case 2:
+      find_cap_moves(str, &moves);
+      break;
+
+    case 3:
+      /* If it is not possible to make a direct atari, we try filling
+       * a liberty of the superstring.
+       */
+      if (get_level() >= 8
+          && stackp <= backfill_depth
+          && (stackp <= superstring_depth || !atari_possible)) {
+       int liberty_cap = 2;
+       if (stackp <= backfill2_depth)
+         liberty_cap = 3;
+       superstring_moves(str, &moves, liberty_cap, 1);
+       squeeze_moves(str, &moves);
+      }
+      break;
+
+    default:
+      abort();
+    } /* switch (pass) */
+
+    order_moves(str, &moves, other, read_function_name, *move);
+    ATTACK_TRY_MOVES(0, &suggest_move);
+  }
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+
+/* attack3(str, *move) is used when (str) points to a group with
+ * three liberties. It returns true if it finds a way to kill the group.
+ *
+ * Return code is KO_A if the group can be killed if the attacker is 
+ * willing to ignore any ko threat.
+ *
+ * Return code is KO_B if the group can be killed if the attacker is 
+ * able to find a ko threat which must be answered.
+ *
+ * If non-NULL (*move) will be set to the move which makes the
+ * attack succeed.
+ */
+
+static int 
+attack3(int str, int *move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int adj, adjs[MAXCHAIN];
+  int liberties;
+  int libs[3];
+  int r;
+  int k;
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int pass;
+  int suggest_move = NO_MOVE;
+
+  SETUP_TRACE_INFO("attack3", str);
+  reading_node_counter++;
+  moves.num = 0;
+  moves.num_tried = 0;
+
+  ASSERT1(IS_STONE(board[str]), str);
+  
+  ASSERT1(stackp <= depth, str);
+  
+  for (pass = 0; pass < 4; pass++) {
+
+    switch (pass) {
+    case 0:
+      adj = chainlinks2(str, adjs, 1);
+      for (r = 0; r < adj; r++) {
+        int hpos;
+        break_chain_moves(adjs[r], &moves);
+    
+        findlib(adjs[r], 1, &hpos);
+        ADD_CANDIDATE_MOVE(hpos, 0, moves, "save_boundary");
+      }
+  
+      /* Defend against double atari in the surrounding chain early. */
+      double_atari_chain2_moves(str, &moves, stackp <= superstring_depth);
+  
+      /* Get the three liberties of (str). */
+      liberties = findlib(str, 3, libs);
+      ASSERT1(liberties == 3, str);
+  
+      for (k = 0; k < 3; k++) {
+#if 0
+        int libs2[2];
+#endif
+        int apos = libs[k];
+       /* We only want to consider the move at (apos) if:
+         * stackp <= backfill_depth
+         * -or-  stackp <= depth and it is an isolated stone
+         * -or-  it is not in immediate atari
+         */
+        if (stackp <= backfill_depth
+           || (stackp <= depth
+               && !has_neighbor(apos, other))
+           || !is_self_atari(apos, other))
+          ADD_CANDIDATE_MOVE(apos, 0, moves, "liberty");
+
+        edge_closing_backfill_moves(str, apos, &moves);
+
+#if 0
+        /* Try backfilling if atari is impossible. */
+        if (stackp <= backfill_depth
+           && approxlib(apos, other, 2, libs2) == 1) {
+          ADD_CANDIDATE_MOVE(libs2[0], 0, moves, "backfill");
+        }
+#endif
+    
+        /* Look for edge blocking moves. */
+        edge_block_moves(str, apos, &moves);
+      }
+  
+      /* Pick up some edge moves. */
+      propose_edge_moves(str, libs, liberties, &moves, other);
+      break;
+
+    case 1:
+      /* The simple ataris didn't work. Try something more fancy. */
+      if (stackp <= backfill_depth)
+        find_cap_moves(str, &moves);
+
+      if (stackp <= fourlib_depth)
+        draw_back_moves(str, &moves);
+
+      break;
+
+    case 2:
+      /* Try to defend chain links with two liberties. */
+      if (stackp <= backfill2_depth) {
+        adj = chainlinks2(str, adjs, 2);
+        for (r = 0; r < adj; r++) {
+          int libs2[2];
+          findlib(adjs[r], 2, libs2);
+          if (approxlib(libs2[0], other, 4, NULL) > 3
+             && approxlib(libs2[1], other, 4, NULL) > 3)
+           continue;
+          break_chain_moves(adjs[r], &moves);
+          break_chain2_moves(adjs[r], &moves, 1, 0);
+          for (k = 0; k < 2; k++)
+           ADD_CANDIDATE_MOVE(libs2[k], 0, moves, "save_boundary-2");
+        }
+      }
+      break;
+
+    case 3:
+      /* If nothing else works, we try filling a liberty of the
+       * super_string.
+       */
+      if (get_level() >= 8 && stackp <= backfill2_depth) {
+       superstring_moves(str, &moves, 3, 1);
+       squeeze_moves(str, &moves);
+      }
+      break;
+
+    default:
+      abort();
+    }
+
+    order_moves(str, &moves, other, read_function_name, *move);
+    ATTACK_TRY_MOVES(1, &suggest_move);
+  } /* for (pass... */
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/* attack4 tries to capture a string with 4 liberties. */
+
+static int 
+attack4(int str, int *move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int r;
+  int k;
+  int liberties;
+  int libs[4];
+  int adj, adjs[MAXCHAIN];
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int pass;
+  int suggest_move = NO_MOVE;
+
+  SETUP_TRACE_INFO("attack4", str);
+  
+  ASSERT1(IS_STONE(board[str]), str);
+  reading_node_counter++;
+  moves.num = 0;
+  moves.num_tried = 0;
+
+  if (stackp > depth) {
+    SGFTRACE(0, 0, "stackp > depth");
+    return 0;
+  }
+
+  for (pass = 0; pass < 2; pass++) {
+
+    switch (pass) {
+    case 0:
+      adj = chainlinks2(str, adjs, 1);
+      for (r = 0; r < adj; r++) {
+        int hpos;
+        break_chain_moves(adjs[r], &moves);
+
+        findlib(adjs[r], 1, &hpos);
+        ADD_CANDIDATE_MOVE(hpos, 0, moves, "save_boundary");
+      }
+
+      /* Defend against double atari in the surrounding chain early. */
+      double_atari_chain2_moves(str, &moves, stackp <= superstring_depth);
+
+      /* Give a score bonus to the chain preserving moves. */
+      for (k = 0; k < moves.num; k++)
+        moves.score[k] += 5;
+
+      /* Get the four liberties of (str). */
+      liberties = findlib(str, 4, libs);
+      ASSERT1(liberties == 4, str);
+
+      for (k = 0; k < 4; k++) {
+        int apos = libs[k];
+       /* We only want to consider the move at (apos) if:
+         * stackp <= backfill_depth
+         * -or-  stackp <= depth and it is an isolated stone
+         * -or-  it is not in immediate atari
+         */
+        if (stackp <= backfill_depth
+           || (stackp <= depth
+               && !has_neighbor(apos, other))
+           || !is_self_atari(apos, other))
+          ADD_CANDIDATE_MOVE(apos, 0, moves, "liberty");
+
+        edge_closing_backfill_moves(str, apos, &moves);
+
+        /* Look for edge blocking moves. */
+        edge_block_moves(str, apos, &moves);
+      }
+
+      /* Pick up some edge moves. */
+      propose_edge_moves(str, libs, liberties, &moves, other);
+      break;
+
+    case 1:
+      if (stackp <= backfill_depth)
+        find_cap_moves(str, &moves);
+      break;
+
+    default:
+      abort();
+    }
+
+    order_moves(str, &moves, other, read_function_name, *move);
+    ATTACK_TRY_MOVES(1, &suggest_move);
+  } /* for (pass = ... */
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/* If (str) points to a string with 2 - 4 liberties,
+ * find_cap_moves(str, &moves)
+ * looks for a configuration of the following type:
+ *
+ *  Xa
+ *  b*
+ *
+ * where X are elements of the string in question and a and b are
+ * two of its liberties.
+ *
+ * For larger strings, this can find moves like
+ *
+ * XXXXX
+ * XX.XX
+ * X.*.X
+ * XX.XX
+ * XXXXX
+ *
+ * even though they are not capping moves.
+ */
+
+static void
+find_cap_moves(int str, struct reading_moves *moves)
+{
+  int alib, blib;
+  int numlibs;
+  int libs[4];
+  int i, j;
+  int ai, aj;
+  int bi, bj;
+
+  numlibs = findlib(str, 4, libs);
+  if (numlibs > 4 || numlibs < 2)
+    return;
+
+  for (i = 0; i < numlibs - 1; i++) {
+    for (j = i + 1; j < numlibs; j++) {
+      alib = libs[i];
+      blib = libs[j];
+
+      /* Check if the two liberties are located like the figure above. */
+      if (!DIAGONAL_NEIGHBORS(alib, blib))
+        continue;
+
+      ai = I(alib);
+      aj = J(alib);
+      bi = I(blib);
+      bj = J(blib);
+      /* Which of the two corner points should we use? One of them is
+       * always occupied by the string at (str), the other one is either
+       * free or occupied by something else.
+       */
+      if (BOARD(bi, aj) == EMPTY)
+        ADD_CANDIDATE_MOVE(POS(bi, aj), 10, *moves, "find_cap");
+      else if (BOARD(ai, bj) == EMPTY)
+        ADD_CANDIDATE_MOVE(POS(ai, bj), 10, *moves, "find_cap");
+    }
+  }
+}
+
+
+
+/* In a situation like this:
+ *       
+ * -----        the code that
+ * cO.OX        follows can find
+ * XXOOX        the attacking move
+ * XO.OX        at c.
+ * XOOOX
+ * XXXXX
+ *
+ * The name of the function corresponds to special_rescue2, which is
+ * fairly similar to this situation.
+ */
+
+static void
+special_attack2_moves(int str, int libs[2], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int newlibs[3];
+  int xpos;
+  int k;
+
+  for (k = 0; k < 2; k++) {
+    if (is_suicide(libs[k], other) 
+       && (approxlib(libs[k], color, 3, newlibs) == 2)) {
+      if (newlibs[0] != libs[1-k])
+       xpos = newlibs[0];
+      else
+       xpos = newlibs[1];
+
+      if (!is_self_atari(xpos, other)) {
+       ADD_CANDIDATE_MOVE(xpos, 0, *moves, "special_attack2");
+      }
+    }
+  }
+}
+
+
+/* In situations like these:
+ *
+ * ..XXX..   ...XX
+ * .XX.XX.   .cO.X
+ * XXOOOXX   ....X
+ * XO.O.OX   XOOXX
+ * XO.c.OX   XXXX.
+ * -------
+ *
+ * the code that follows can find the attacking move at c.
+ */
+
+static void
+special_attack3_moves(int str, int libs[2], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int xpos;
+  int apos;
+  int bpos;
+  int k;
+
+  ASSERT1(countlib(str) == 2, str);
+
+  for (k = 0; k < 2; k++) {
+    apos = libs[k];
+    bpos = libs[1-k];
+    
+    if (apos == SOUTH(bpos) || apos == NORTH(bpos)) {
+      if (board[WEST(apos)] == EMPTY)
+       xpos = WEST(apos);
+      else if (board[EAST(apos)] == EMPTY)
+       xpos = EAST(apos);
+      else
+       continue;
+    }
+    else if (apos == WEST(bpos) || apos == EAST(bpos)) {
+      if (board[SOUTH(apos)] == EMPTY)
+       xpos = SOUTH(apos);
+      else if (board[NORTH(apos)] == EMPTY)
+       xpos = NORTH(apos);
+      else
+       continue;
+    }
+    else
+      return; /* Incorrect configuration, give up. */
+
+    if (!is_self_atari(xpos, other))
+      ADD_CANDIDATE_MOVE(xpos, 0, *moves, "special_attack3");
+  }
+}
+
+
+/* In situations like these:
+ *
+ * ...O.O...   ...O.O...
+ * XXXXOOXXX   XXXXOOXXX
+ * XOOOXXO*.   Xsssbbcd.
+ * .X.O.....   .X.sa.e..
+ * ---------   ---------
+ *
+ * the code that follows can find the attacking move at *.
+ *
+ * Also for situations in which c has three liberties, one of which in common
+ * with b, the respective attacking move is found (see reading:52 for an 
+ * example).
+ */
+
+static void
+special_attack4_moves(int str, int libs[2], struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int adj, adjs[MAXCHAIN];
+  int adj2, adjs2[MAXCHAIN];
+  int libs2[3];
+  int apos;
+  int bpos = 0;
+  int cpos;
+  int dpos;
+  int epos;
+  int clibs;
+  int dlibs;
+  int elibs;
+  int bc_common_lib;
+  int k, s, t, u;
+
+  ASSERT1(countlib(str) == 2, str);
+
+  /* To avoid making this too general, we require that both
+   * liberties are self ataris for X.
+   */
+  if (!is_self_atari(libs[0], other) 
+      || !is_self_atari(libs[1], other))
+    return;
+
+  /* Pick up chain links with 2 liberties. */
+  adj = chainlinks2(str, adjs, 2);
+  
+  for (k = 0; k < 2; k++) {
+    apos = libs[k];
+
+    /* Check that (apos) also is a liberty of one of the two liberty
+     * chain links.
+     */
+    for (s = 0; s < adj; s++)
+      if (liberty_of_string(apos, adjs[s])) {
+       bpos = adjs[s];
+       break;
+      }
+
+    /* Nothing found. */
+    if (s == adj)
+      continue;
+
+    /* Now require that (bpos) has a chain link, different from (str),
+     * also with two liberties, or with three liberties, but one in common 
+     * with (bpos). 
+     */
+    adj2 = chainlinks3(bpos, adjs2, 3);
+
+    for (s = 0; s < adj2; s++) {
+      cpos = adjs2[s];
+      if (same_string(cpos, str))
+       continue;
+      
+      /* Pick up the liberties of (cpos). */
+      clibs = findlib(cpos, 3, libs2);
+
+      /* No need to do something fancy if it is in atari already. */
+      if (clibs < 2)
+       continue;
+
+      /* (cpos) has three liberties, none of which in commmon with (bpos)
+       * attacking it seems too difficult. */
+      bc_common_lib = have_common_lib(bpos, cpos, NULL);
+      if (clibs > 2 && !bc_common_lib)
+       continue;
+
+      /* Try playing at a liberty. Before doing this, verify that
+       * (cpos) cannot get more than three liberties by answering on 
+       * another liberty and that we are not putting ourselves in atari.
+       * We also should only allow ourselves to get fewer liberties than
+       * the defender in case (bpos) and (cpos) have a common liberty.
+       */
+      for (t = 0; t < clibs; t++) {
+       dpos = libs2[t];
+
+       if (is_self_atari(dpos, other))
+         continue;
+
+       for (u = 0; u < clibs; u++) {
+         if (t == u)
+           continue;
+
+         epos = libs2[u];
+
+         elibs = approxlib(epos, color, 4, NULL);
+         if (elibs > 3)
+           break;
+
+         dlibs = approxlib(dpos, other, 3, NULL);
+         if (elibs > dlibs && !bc_common_lib)
+           break;
+       }
+
+       if (u >= clibs) /* No break occurred. */
+         ADD_CANDIDATE_MOVE(dpos, 0, *moves, "special_attack4");
+      }
+    }
+  }
+}
+
+
+/* 
+ * If (str) points to a string, draw_back(str, &moves)
+ * looks for a move in the following configuration which attacks
+ * the string:
+ *
+ *      X*            X=attacker, O=defender
+ *      O.
+ *
+ * In the initial implementation we consider cases 
+ * where X has exactly 2 liberties. 
+ *
+ */
+
+static void
+draw_back_moves(int str, struct reading_moves *moves)
+{
+  int r, k;
+  int adj, adjs[MAXCHAIN];
+  int libs[2];
+
+  adj = chainlinks2(str, adjs, 2);
+  for (r = 0; r < adj; r++) {
+    findlib(adjs[r], 2, libs);
+    for (k = 0; k < 2; k++) {
+      if (!liberty_of_string(libs[k], str)
+            && ((ON_BOARD1(SOUTH(libs[k]))
+                    && liberty_of_string(SOUTH(libs[k]), str))
+             || (ON_BOARD1(WEST(libs[k]))
+                    && liberty_of_string(WEST(libs[k]), str))
+             || (ON_BOARD1(NORTH(libs[k]))
+                    && liberty_of_string(NORTH(libs[k]), str))
+             || (ON_BOARD1(EAST(libs[k]))
+                    && liberty_of_string(EAST(libs[k]), str)))) {
+       ADD_CANDIDATE_MOVE(libs[k], 0, *moves, "draw_back");
+      }
+    }
+  }
+}
+
+/* In the following position the reading is much simplifed if we start
+ * with the edge closing backfilling move at *.
+ *
+ * |OO...
+ * |.OOO.
+ * |.X.O.
+ * |XXXO.
+ * |.X.*.
+ * +-----
+ *
+ * This function identifies the situation
+ *
+ * ?XOb
+ * Xatc
+ * ----
+ *
+ * where a is a liberty of the attacked string, t is the proposed move,
+ * and b and c do not contain more O stones than X stones.
+ */
+
+static void
+edge_closing_backfill_moves(int str, int apos, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int k;
+  int bpos;
+  int cpos;
+  int number_x, number_o;
+
+  for (k = 0; k < 4; k++) {
+    int up = delta[k];
+    int right = delta[(k+1)%4];
+    if (ON_BOARD(apos - up))
+      continue;
+    if (board[apos + up] != color)
+      return;
+    if (board[apos + right] == EMPTY
+       && (!ON_BOARD(apos - right) 
+           || board[apos - right] == color))
+      ; /* Everything ok so far. */
+    else if (board[apos - right] == EMPTY
+            && (!ON_BOARD(apos + right) 
+                || board[apos + right] == color)) {
+      /* Negate right direction. */
+      right = -right;
+    }
+    else
+      return;
+    
+    if (board[apos + up + right] != other)
+      return;
+
+    bpos = apos + up + 2 * right;
+    if (!ON_BOARD(bpos))
+      return;
+
+    cpos = apos + 2 * right;
+
+    number_x = 0;
+    number_o = 0;
+    if (board[bpos] == color)
+      number_x++;
+    else if (board[bpos] == other)
+      number_o++;
+
+    if (board[cpos] == color)
+      number_x++;
+    else if (board[cpos] == other)
+      number_o++;
+
+    if (number_o > number_x)
+      return;
+
+    ADD_CANDIDATE_MOVE(apos + right, 0, *moves, "edge_closing_backfill");
+    return;
+  }
+}
+
+
+/* The first version of this function seemed to induce too many
+ * variations and has therefore been replaced by a much more limited
+ * version.
+ */
+#if 0
+
+/* In positions like
+ *
+ * OO...
+ * XXO*.
+ * x.X*.
+ * -----
+ *
+ * where the X stones to the left are being attacked, it is often a
+ * good idea to first consider either or both of the moves marked by *
+ * in the diagram. Notice that propose_edge_moves() doesn't help with
+ * this, since the rightmost X stone is not part of the attacked
+ * string, only the corresponding superstring.
+ *
+ * This function identifies the situation
+ *
+ * ?XO.?   ?bdf?
+ * ?.X.o   haceg
+ * -----   -----
+ *
+ * where a is a liberty of the attacked string, b is a stone of the
+ * attacked string, and e and f are the considered moves. Also
+ * considered is the situation where the conditions to the right are
+ * not correct but c has only two liberties anyway. If safe, the move
+ * to make atari on c is proposed.
+ *
+ * Notice, this code is disabled, as commented above.
+ */
+
+static void
+edge_block_moves(int str, int apos, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int cpos;
+  int dpos;
+  int epos;
+  int fpos;
+  int gpos;
+  int hpos;
+  int score;
+  int k, l;
+
+  /* Search for the right orientation. */
+  for (k = 0; k < 4; k++) {
+    int up = delta[k];
+    if (ON_BOARD(apos - up))
+      continue;
+    if (board[apos + up] != color || !same_string(apos + up, str))
+      return;
+    
+    for (l = 0; l < 2; l++) {
+      int right = delta[(k+1)%4];
+      if (l == 1)
+       right = -right;
+
+      cpos = apos + right;
+      dpos = apos + right + up;
+
+      if (board[cpos] != color || board[dpos] != other)
+       continue;
+
+      epos = cpos + right;
+      fpos = dpos + right;
+      gpos = epos + right;
+      hpos = apos - right;
+      
+      if (!ON_BOARD(epos))
+       continue;
+      
+      if (board[epos] == EMPTY && board[fpos] == EMPTY 
+         && (board[gpos] != color)) {
+       /* Everything is set up, suggest moves at e and f. */
+       if (!ON_BOARD(hpos) || board[hpos] == color)
+         score = 0;
+       else
+         score = -5;
+       if (countlib(str) == 2)
+         score -= 10;
+       ADD_CANDIDATE_MOVE(epos, score, *moves, "edge_block-A");
+
+       if (countlib(dpos) == 1)
+         score = 25;
+       else
+         score = 0;
+       if (countlib(str) == 2)
+         score -= 10;
+       ADD_CANDIDATE_MOVE(fpos, score, *moves, "edge_block-B");
+      }
+      else if (countlib(cpos) == 2 && countlib(dpos) > 1) {
+       int libs[2];
+       int move;
+       findlib(cpos, 2, libs);
+       if (libs[0] == apos)
+         move = libs[1];
+       else
+         move = libs[0];
+       if (!is_self_atari(move, other))
+         ADD_CANDIDATE_MOVE(move, 0, *moves, "edge_block-C");
+      }
+    }
+  }
+}
+
+#else
+
+/* In positions like
+ *
+ *   OOX..
+ *   XXO*.
+ *   x.X..
+ *   -----
+ *
+ * where the X stones to the left are being attacked, it is usually
+ * important to start by considering the move at *. Thus we propose
+ * the move at * with a high initial score.
+ *
+ * Also, it is often needed to prevent "crawling" along first line
+ * which can eventually give defender more liberties, like here:
+ *
+ *   O.OO..X
+ *   OXXO..X
+ *   ...X*..
+ *   -------
+ *
+ * This function identifies the situation
+ *
+ *   XO.?   bdf?
+ *   .X.o   aceg
+ *   ----   ----
+ *
+ * where a is a liberty of the attacked string, b is a stone of the
+ * attacked string, and e and f are the considered moves.
+ */
+
+static void
+edge_block_moves(int str, int apos, struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int k;
+
+  /* Search for the right orientation. */
+  for (k = 0; k < 4; k++) {
+    int l;
+    int up = delta[k];
+
+    if (ON_BOARD(apos - up))
+      continue;
+    if (board[apos + up] != color || !same_string(apos + up, str))
+      return;
+    
+    for (l = 0; l < 2; l++) {
+      int right = delta[(k+1)%4];
+      int cpos;
+      int dpos;
+      int epos;
+      int fpos;
+
+      if (l == 1)
+       right = -right;
+
+      cpos = apos + right;
+      dpos = apos + right + up;
+      epos = cpos + right;
+      fpos = dpos + right;
+
+      if (board[cpos] == color && board[dpos] == other
+         && board[epos] == EMPTY && board[fpos] == EMPTY) {
+       if (countlib(dpos) == 1) {
+         int gpos = epos + right;
+
+         /* Check if we have the first situation. */
+         if (board[gpos] != color)
+           ADD_CANDIDATE_MOVE(fpos, 30, *moves, "edge_block-A");
+       }
+       else {
+         int edge_scan;
+
+         /* Look along board edge to see if the defender's string can
+          * run away to a friend.
+          */
+         for (edge_scan = epos; ; edge_scan += right) {
+           if (board[edge_scan] == color || board[edge_scan + up] == color) {
+             ADD_CANDIDATE_MOVE(epos, 10, *moves, "edge_block-B");
+             break;
+           }
+
+           if (board[edge_scan] != EMPTY || board[edge_scan + up] != EMPTY)
+             break;
+         }
+       }
+      }
+    }
+  }
+}
+
+#endif
+
+/* ================================================================ */
+/*            Defending by attacking surrounding strings            */
+/* ================================================================ */
+
+/* Add the chainbreaking moves relative to the string (str) to the
+ * (moves) struct.
+ */
+static void
+break_chain_moves(int str, struct reading_moves *moves)
+{
+  int r;
+  int xpos;
+  int adj, adjs[MAXCHAIN];
+  
+  /* Find links in atari. */
+  adj = chainlinks2(str, adjs, 1);
+  
+  for (r = 0; r < adj; r++) {
+    findlib(adjs[r], 1, &xpos);
+    ADD_CANDIDATE_MOVE(xpos, 1, *moves, "break_chain");
+  }
+}
+
+
+/* defend_secondary_chain1_moves() tries to break a chain by defending
+ * "secondary chain", that is, own strings surrounding a given
+ * opponent string (which is in turn a chainlink for another own
+ * string, phew... :).  It only defends own strings in atari.
+ *
+ * When defending is done by stretching, it is required that the defending
+ * stone played gets at least `min_liberties', or one less if it is 
+ * adjacent to the opponent chainlink.
+ *
+ * Returns true if there where any secondary strings that needed defence 
+ * (which does not imply they actually where defended).
+ */
+static int
+defend_secondary_chain1_moves(int str, struct reading_moves *moves,
+                             int min_liberties)
+{
+  int r, s;
+  int color = OTHER_COLOR(board[str]);
+  int xpos;
+  int adj;
+  int adj2;
+  int adjs[MAXCHAIN];
+  int adjs2[MAXCHAIN];
+
+  /* Find links in atari. */
+  adj = chainlinks2(str, adjs, 1);
+
+  for (r = 0; r < adj; r++) {
+    /* Stretch out. */
+    findlib(adjs[r], 1, &xpos);
+    if (approxlib(xpos, color, min_liberties, NULL)
+       + neighbor_of_string(xpos, str) >= min_liberties)
+      ADD_CANDIDATE_MOVE(xpos, 0, *moves, "defend_secondary_chain1-A");
+
+    /* Capture adjacent stones in atari, if any. */
+    adj2 = chainlinks2(adjs[r], adjs2, 1);
+    for (s = 0; s < adj2; s++) {
+      findlib(adjs2[s], 1, &xpos);
+      if (!is_self_atari(xpos, color))
+       ADD_CANDIDATE_MOVE(xpos, 0, *moves, "defend_secondary_chain1-B");
+    }
+  }
+
+  return adj;
+}
+
+
+/* defend_secondary_chain2_moves() tries to break a chain by defending
+ * "secondary chain", that is, own strings surrounding a given
+ * opponent string (which is in turn a chainlink for another own
+ * string, phew... :).  It only defends own strings in
+ * with two liberties.
+ *
+ * When defending is done by stretching, it is required that the defending
+ * stone played gets at least `min_liberties', or one less if it is 
+ * adjacent to the opponent chainlink. Defence can also be done by capturing
+ * opponent stones or trying to capture them with an atari.
+ */
+static void
+defend_secondary_chain2_moves(int str, struct reading_moves *moves,
+    int min_liberties)
+{
+  int r, s, t;
+  int color = OTHER_COLOR(board[str]);
+  int xpos;
+  int adj;
+  int adj2;
+  int adjs[MAXCHAIN];
+  int adjs2[MAXCHAIN];
+  int libs[2];
+
+  /* Find links with two liberties. */
+  adj = chainlinks2(str, adjs, 2);
+
+  for (r = 0; r < adj; r++) {
+    if (!have_common_lib(str, adjs[r], NULL))
+      continue;
+
+    /* Stretch out. */
+    findlib(adjs[r], 2, libs);
+    for (t = 0; t < 2; t++) {
+      xpos = libs[t];
+      if (approxlib(xpos, color, min_liberties, NULL)
+         + neighbor_of_string(xpos, str) >= min_liberties)
+       ADD_CANDIDATE_MOVE(xpos, 0, *moves, "defend_secondary_chain2-A");
+    }
+
+    /* Capture adjacent stones in atari, if any. */
+    adj2 = chainlinks2(adjs[r], adjs2, 1);
+    for (s = 0; s < adj2; s++) {
+      findlib(adjs2[s], 1, &xpos);
+      if (!is_self_atari(xpos, color))
+       ADD_CANDIDATE_MOVE(xpos, 0, *moves, "defend_secondary_chain2-B");
+    }
+
+    /* Look for neighbours we can atari. */
+    adj2 = chainlinks2(adjs[r], adjs2, 2);
+    for (s = 0; s < adj2; s++) {
+      findlib(adjs2[s], 2, libs);
+      for (t = 0; t < 2; t++) {
+       /* Only atari if target has no easy escape with his other liberty. */
+       if (approxlib(libs[1-t], OTHER_COLOR(color), 3, NULL) < 3 
+           &&  !is_self_atari(libs[t], color)) {
+         ADD_CANDIDATE_MOVE(libs[t], 0, *moves, "defend_secondary_chain2-C");
+       }
+      }
+    }
+  }
+}
+
+
+/*
+ * Find moves which immediately capture chain links with 2
+ * liberties, in the sense that the links cannot escape atari.
+ *
+ * The used heuristics are slightly sloppy, so useless moves may
+ * appear occasionally. This should, however, only lead to slightly
+ * worse performance but not to incorrect results.
+ */
+static void
+break_chain2_efficient_moves(int str, struct reading_moves *moves)
+{
+  int r;
+  int adj, adjs[MAXCHAIN];
+  
+  /* Find links with 2 liberties. */
+  adj = chainlinks2(str, adjs, 2);
+  
+  for (r = 0; r < adj; r++)
+    do_find_break_chain2_efficient_moves(str, adjs[r], moves);
+}
+
+
+/* Helper function for break_chain2_efficient_moves(). */
+static void
+do_find_break_chain2_efficient_moves(int str, int adj,
+                                    struct reading_moves *moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int k;
+  int adj2, adjs2[MAXCHAIN];
+  int libs[2];
+  int pos1;
+  int pos2;
+  ASSERT1(countlib(adj) == 2, adj);
+  
+  adj2 = chainlinks2(adj, adjs2, 1);
+  if (adj2 == 1 && countlib(str) > 2) {
+    int apos;
+    break_chain_moves(adjs2[0], moves);
+    findlib(adjs2[0], 1, &apos);
+    if (!is_self_atari(apos, color))
+      ADD_CANDIDATE_MOVE(apos, 0, *moves, "break_chain2_efficient-A");
+    return;
+  }
+  
+  if (adj2 > 1)
+    return;
+    
+  findlib(adj, 2, libs);
+  for (k = 0; k < 2; k++)
+    if (approxlib(libs[k], other, 3, NULL) <= 2
+       && !is_self_atari(libs[1 - k], color))
+      ADD_CANDIDATE_MOVE(libs[1 - k], 0, *moves, "break_chain2_efficient-B");
+  
+  /* A common special case is this kind of edge position
+   * 
+   * ..XXX.
+   * X.XOO.
+   * XOOX*.
+   * ......
+   * ------
+   *
+   * where a move at * is most effective for saving the two stones
+   * to the left.
+   *
+   * The code below tries to identify this case. We use the crude
+   * heuristic that the two liberties of the X stone we want to
+   * capture should be placed diagonally and that one liberty should
+   * be on the edge. Then we propose to play the other liberty.
+   * Notice that both moves may be proposed when attacking a stone
+   * on 2-2.
+   *
+   * Update: This was too crude. Also require that the X stone is on
+   * the second line and that the proposed move is not a self-atari.
+   */
+  if (!DIAGONAL_NEIGHBORS(libs[0], libs[1]))
+    return;
+
+  /* Since we know that the two liberties are diagonal, the following
+   * construction gives the two vertices "between" the liberties.
+   */
+  pos1 = NORTH(gg_max(libs[0], libs[1]));
+  pos2 = SOUTH(gg_min(libs[0], libs[1]));
+  if ((board[pos1] != other
+       || !is_edge_vertex(pos2)
+       || !same_string(pos1, adj))
+      && (board[pos2] != other
+         || !is_edge_vertex(pos1)
+         || !same_string(pos2, adj)))
+    return;
+
+  if (is_edge_vertex(libs[0]) && !is_self_atari(libs[1], color))
+    ADD_CANDIDATE_MOVE(libs[1], 1, *moves, "break_chain2_efficient-C");
+
+  if (is_edge_vertex(libs[1]) && !is_self_atari(libs[0], color))
+    ADD_CANDIDATE_MOVE(libs[0], 1, *moves, "break_chain2_efficient-C");
+}
+
+
+/* (str) points to a string with two or more liberties. break_chain2_moves()
+ * tries to defend this string by attacking a neighbouring string with
+ * two liberties.
+ * This is done by playing on either of its liberties
+ * (if (require_safe) is true these are only used if they are not
+ * self-ataris), taking a neighbour out of atari or by backfilling if
+ * both liberties are self-ataris.
+ */
+static void
+break_chain2_moves(int str, struct reading_moves *moves, int require_safe,
+                  int be_aggressive)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int r;
+  int adj;
+  int adjs[MAXCHAIN];
+
+  adj = chainlinks2(str, adjs, 2);
+
+  for (r = 0; r < adj; r++) {
+    int k;
+    int apos = adjs[r];
+    int libs[2];
+    int unsafe[2];
+    int dummy_adjs[MAXCHAIN];
+
+    findlib(apos, 2, libs);
+
+    /* If stackp > backfill_depth, don't bother playing liberties of
+     * 2-liberty strings if those also have at least one neighbor in
+     * atari. This is intended to solve reading:171 and generally reduce
+     * the number of nodes.
+     */
+    if (stackp > backfill_depth
+       && chainlinks2(apos, dummy_adjs, 1) > 0)
+      continue;
+
+    for (k = 0; k < 2; k++) {
+      unsafe[k] = is_self_atari(libs[k], color);
+      if (!unsafe[k]
+         || is_ko(libs[k], color, NULL)
+         || (!require_safe
+             && approxlib(libs[k], other, 5, NULL) < 5))
+       ADD_CANDIDATE_MOVE(libs[k], 0, *moves, "break_chain2-A");
+    }
+
+    if (stackp <= break_chain_depth
+       || (be_aggressive && stackp <= backfill_depth)) {
+      /* If the chain link cannot escape easily, try to defend all adjacent
+       * friendly stones in atari (if any). If there are none, defend 
+       * adjacent friendly stones with only two liberties.
+       */
+      if (approxlib(libs[0], other, 4, NULL) < 4
+         && approxlib(libs[1], other, 4, NULL) < 4) {
+       if (!defend_secondary_chain1_moves(adjs[r], moves, 2))
+         defend_secondary_chain2_moves(adjs[r], moves, 2);
+      }
+    }
+
+    if (unsafe[0] && unsafe[1]
+       && (stackp <= backfill2_depth || have_common_lib(str, apos, NULL))) {
+      int lib;
+
+      /* Find backfilling moves. */
+      for (k = 0; k < 2; k++) {
+       int libs2[3];
+       if (approxlib(libs[k], other, 3, libs2) == 2) {
+         if (!is_self_atari(libs2[0], color))
+           ADD_CANDIDATE_MOVE(libs2[0], 0, *moves, "break_chain2-B");
+         if (!is_self_atari(libs2[1], color))
+           ADD_CANDIDATE_MOVE(libs2[1], 0, *moves, "break_chain2-B");
+       }
+      }
+
+      /* Consider this case (reading:188):
+       *
+       *   |.OOOXXX
+       *   |OXXXOOO
+       *   |.X.O...
+       *   +-------
+       *
+       * We cannot atari the corner X string immediatly, so we need to
+       * backfill.  However, to avoid generating too many variations,
+       * we require that the opponent string is well restrained.
+       * Otherwise it could just run away while we backfill.
+       */
+      if (approxlib(libs[0], other, 3, NULL) <= 2
+         && approxlib(libs[1], other, 3, NULL) <= 2) {
+       if (approxlib(libs[0], color, 1, &lib) == 1
+           && approxlib(lib, color, 3, NULL) >= 3)
+         ADD_CANDIDATE_MOVE(lib, 0, *moves, "break_chain2-C");
+
+       if (approxlib(libs[1], color, 1, &lib) == 1
+           && approxlib(lib, color, 3, NULL) >= 3)
+         ADD_CANDIDATE_MOVE(lib, 0, *moves, "break_chain2-C");
+      }
+    }
+  }
+}
+
+/*
+ * (str) points to a group to be defended. 
+ * break_chain2_defense_moves is a wrapper around break_chain2_moves.
+ * It devalues all entries by 2.
+ *
+ * Rationale: Otherwise, these moves get overvalued by order_moves. In
+ * particular, if there is both a direct and a break_chain2 defense,
+ * then the latter one might be just an irrelevant intermediate forcing
+ * move. Hence, we should rather return the direct defense.
+ */
+
+static void
+break_chain2_defense_moves(int str, struct reading_moves *moves,
+                          int be_aggressive)
+{
+  int saved_num_moves = moves->num;
+  int k;
+
+  break_chain2_moves(str, moves, !(stackp <= backfill_depth), be_aggressive);
+  for (k = saved_num_moves; k < moves->num; k++)
+    moves->score[k] = -2;
+}
+
+
+/* Helper function for break_chain3_moves() and
+ * superstring_break_chain_moves().
+ */
+static void
+do_find_break_chain3_moves(int *chain_links, int num_chain_links,
+                          struct reading_moves *moves, int be_aggressive,
+                          const char *caller_function_name)
+{
+  int other = board[chain_links[0]];
+  int color = OTHER_COLOR(other);
+  signed char move_added[BOARDMAX];
+  int possible_moves[MAX_MOVES];
+  int num_possible_moves = 0;
+  int r;
+  int k;
+
+  gg_assert(num_chain_links > 0);
+
+  memset(move_added, 0, sizeof move_added);
+
+  for (r = 0; r < num_chain_links; r++) {
+    int lib1;
+    int lib2;
+    int lib3;
+    int libs[3];
+
+    /* We make a list in the (adjs) array of the liberties
+     * of boundary strings having exactly three liberties. We mark
+     * each liberty in the mw array so that we do not list any
+     * more than once.
+     */
+    findlib(chain_links[r], 3, libs);
+
+    /* If the 3 liberty chain easily can run away through one of the
+     * liberties, we don't play on any of the other liberties.
+     */
+    lib1 = approxlib(libs[0], other, 4, NULL);
+    lib2 = approxlib(libs[1], other, 4, NULL);
+    if (lib1 >= 4 && lib2 >= 4)
+      continue;
+    lib3 = approxlib(libs[2], other, 4, NULL);
+
+    if ((lib1 >= 4 || lib2 >= 4) && lib3 >= 4)
+      continue;
+
+    if (lib1 >= 4) {
+      if (!move_added[libs[0]]) {
+       possible_moves[num_possible_moves++] = libs[0];
+       move_added[libs[0]] = 1;
+      }
+
+      continue;
+    }
+
+    if (lib2 >= 4) {
+      if (!move_added[libs[1]]) {
+       possible_moves[num_possible_moves++] = libs[1];
+       move_added[libs[1]] = 1;
+      }
+
+      continue;
+    }
+
+    if (lib3 >= 4) {
+      if (!move_added[libs[2]]) {
+       possible_moves[num_possible_moves++] = libs[2];
+       move_added[libs[2]] = 1;
+      }
+
+      continue;
+    }
+
+    /* No easy escape, try all liberties. */
+    for (k = 0; k < 3; k++) {
+      if (!move_added[libs[k]]) {
+       possible_moves[num_possible_moves++] = libs[k];
+       move_added[libs[k]] = 1;
+      }
+    }
+
+    if (stackp <= backfill2_depth
+       || (be_aggressive && stackp <= backfill_depth))
+      defend_secondary_chain1_moves(chain_links[r], moves, 3);
+  }
+
+  for (k = 0; k < num_possible_moves; k++) {
+    /* We do not wish to consider the move if it can be immediately
+     * recaptured, unless stackp < backfill2_depth.  Beyond
+     * backfill2_depth, the necessary capturing move might not get
+     * generated in follow-up for the attacker.  (This currently only
+     * makes a difference at stackp == backfill2_depth.)
+     */
+    int move = possible_moves[k];
+
+    if (stackp <= break_chain_depth
+       || (be_aggressive && stackp <= backfill_depth)
+       || approxlib(move, color, 2, NULL) > 1)
+      /* We use a negative initial score here as we prefer to find
+       * direct defense moves.
+       */
+      ADD_CANDIDATE_MOVE(move, -2, *moves, caller_function_name);
+  }
+}
+
+
+/*
+ * (str) points to a group.
+ * If there is a string in the surrounding chain having
+ * exactly three liberties whose attack leads to the rescue of
+ * (str), break_chain3_moves(str, *moves) adds attack moves against
+ * the surrounding string as candidate moves.
+ */
+
+static void
+break_chain3_moves(int str, struct reading_moves *moves, int be_aggressive)
+{
+  int chain_links[MAXCHAIN];
+  int num_chain_links = chainlinks2(str, chain_links, 3);
+
+  if (num_chain_links > 0) {
+    do_find_break_chain3_moves(chain_links, num_chain_links,
+                              moves, be_aggressive, "break_chain3");
+  }
+}
+
+
+/*
+ * (str) points to a group.
+ * If there is a string in the surrounding chain having
+ * exactly four liberties whose attack leads to the rescue of
+ * (str), break_chain4_moves(str, *moves) adds attack moves against
+ * the surrounding string as candidate moves.
+ */
+
+static void
+break_chain4_moves(int str, struct reading_moves *moves, int be_aggressive)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int r;
+  int k;
+  int u = 0, v;
+  int apos;
+  int adj;
+  int adjs[MAXCHAIN];
+  int libs[4];
+  int possible_moves[MAX_MOVES];
+  int mw[BOARDMAX];
+
+  memset(mw, 0, sizeof(mw));
+  
+  adj = chainlinks2(str, adjs, 4);
+  for (r = 0; r < adj; r++) {
+    int lib1 = 0, lib2 = 0, lib3 = 0, lib4 = 0;
+    apos = adjs[r];
+
+    /* We make a list in the (adjs) array of the liberties
+     * of boundary strings having exactly four liberties. We mark
+     * each liberty in the mw array so that we do not list any
+     * more than once.
+     */
+    findlib(apos, 4, libs);
+
+    /* If the 4 liberty chain easily can run away through one of the
+     * liberties, we don't play on any of the other liberties.
+     */
+    lib1 = approxlib(libs[0], other, 5, NULL);
+    lib2 = approxlib(libs[1], other, 5, NULL);
+    if (lib1 >= 5 && lib2 >= 5)
+      continue;
+    lib3 = approxlib(libs[2], other, 5, NULL);
+
+    if ((lib1 >= 5 || lib2 >= 5) && lib3 >= 5)
+      continue;
+    lib4 = approxlib(libs[3], other, 5, NULL);
+
+    if ((lib1 >= 5 || lib2 >= 5 || lib3 >= 5) && lib4 >= 5)
+      continue;
+
+    if (lib1 >= 5 && !mw[libs[0]]) {
+      mw[libs[0]] = 1;
+      possible_moves[u++] = libs[0];
+      continue;
+    }
+    
+    if (lib2 >= 5 && !mw[libs[1]]) {
+      mw[libs[1]] = 1;
+      possible_moves[u++] = libs[1];
+      continue;
+    }
+    
+    if (lib3 >= 5 && !mw[libs[2]]) {
+      mw[libs[2]] = 1;
+      possible_moves[u++] = libs[2];
+      continue;
+    }
+
+    if (lib4 >= 5 && !mw[libs[3]]) {
+      mw[libs[3]] = 1;
+      possible_moves[u++] = libs[3];
+      continue;
+    }
+
+    /* No easy escape, try all liberties. */
+    for (k = 0; k < 4; k++) {
+      if (!mw[libs[k]]) {
+       mw[libs[k]] = 1;
+       possible_moves[u++] = libs[k];
+      }
+    }
+
+    if (stackp <= backfill2_depth
+       || (be_aggressive && stackp <= backfill_depth))
+      defend_secondary_chain1_moves(adjs[r], moves, 4);
+  }
+
+  for (v = 0; v < u; v++) {
+    /* We do not wish to consider the move if it can be 
+     * immediately recaptured, unless stackp < backfill2_depth.
+     * Beyond backfill2_depth, the necessary capturing move might not
+     * get generated in follow-up for the attacker.
+     * (This currently only makes a difference at stackp == backfill2_depth.)
+     */
+    int xpos = possible_moves[v];
+    if (stackp <= break_chain_depth
+       || (be_aggressive && stackp <= backfill_depth)
+       || approxlib(xpos, color, 2, NULL) > 1)
+      /* We use a negative initial score here as we prefer to find
+       * direct defense moves.
+       */
+      ADD_CANDIDATE_MOVE(xpos, -2, *moves, "break_chain4");
+  }
+}
+
+/* This function looks for moves attacking those components
+ * of the surrounding chain of the superstring (see find_superstring
+ * for the definition) which have fewer than liberty_cap liberties,
+ * and which are not adjacent to the string itself, since those
+ * are tested by break_chain_moves.
+ */
+static void
+superstring_break_chain_moves(int str, int liberty_cap,
+                             struct reading_moves *moves)
+{
+  int adj;
+  int adjs[MAXCHAIN];
+  int chain_links3[MAXCHAIN];
+  int num_chain_links3 = 0;
+  int k;
+  int apos;
+
+  proper_superstring_chainlinks(str, &adj, adjs, liberty_cap);
+  for (k = 0; k < adj; k++) {
+    int liberties = countlib(adjs[k]);
+    if (liberties == 1) {
+      findlib(adjs[k], 1, &apos);
+      ADD_CANDIDATE_MOVE(apos, 0, *moves, "superstring_break_chain");
+    }
+    else if (liberties == 2)
+      do_find_break_chain2_efficient_moves(str, adjs[k], moves);
+    else if (liberties == 3)
+      chain_links3[num_chain_links3++] = adjs[k];
+  }
+
+  if (num_chain_links3 > 0) {
+    do_find_break_chain3_moves(chain_links3, num_chain_links3,
+                              moves, 0, "superstring_break_chain-3");
+  }
+}
+
+/*
+ * If `str' points to a group, double_atari_chain2_moves() adds all
+ * moves which make a double atari on some strings in the surrounding
+ * chain to the moves[] array.  In addition, if `generate_more_moves'
+ * is set, it adds moves that make atari on a string in the
+ * surrounding chain and are adjacent to another string with 3
+ * liberties.
+ */
+
+static void
+double_atari_chain2_moves(int str, struct reading_moves *moves,
+                         int generate_more_moves)
+{
+  int r, k;
+  int adj;
+  int adjs[MAXCHAIN];
+  int libs[3];
+  int mw[BOARDMAX];
+
+  memset(mw, 0, sizeof(mw));
+
+  adj = chainlinks2(str, adjs, 2);
+  for (r = 0; r < adj; r++) {
+    findlib(adjs[r], 2, libs);
+    for (k = 0; k < 2; k++) {
+      mw[libs[k]]++;
+      if (mw[libs[k]] == 2) {
+       /* Found a double atari, but don't play there unless the move
+         * is safe for the defender.
+        */
+       if (!is_self_atari(libs[k], board[str]))
+         ADD_CANDIDATE_MOVE(libs[k], 1, *moves, "double_atari_chain2-A");
+      }
+    }
+  }
+
+  if (generate_more_moves) {
+    int adj3;
+    int adjs3[MAXCHAIN];
+
+    adj3 = chainlinks2(str, adjs3, 3);
+    for (r = 0; r < adj3; r++) {
+      findlib(adjs3[r], 3, libs);
+      for (k = 0; k < 3; k++) {
+       if (mw[libs[k]] == 1) {
+         mw[libs[k]] = 2;
+         if (!is_self_atari(libs[k], board[str]))
+           ADD_CANDIDATE_MOVE(libs[k], -3, *moves, "double_atari_chain2-B");
+       }
+      }
+    }
+  }
+}
+
+
+/* ================================================================ */
+/*                Restricted Attack and Defense                     */
+/* ================================================================ */
+
+
+/* These functions try to attack and defend a string, avoiding moves
+ * from a certain set. It is assumed that as soon as the string gets
+ * three liberties, it is alive.
+ * 
+ * These functions can be used to generate backfilling moves as
+ * follows: Suppose that we would like to make atari on a
+ * string, but the atari is not safe until we make a backfilling
+ * move. To find the backfilling move, we make a list of the
+ * liberties of the string under attack, declaring these moves
+ * forbidden. Neither player will play them while the restricted
+ * functions are in effect. We fill the liberty, creating a
+ * string which is under attack, and look for a defensive move
+ * which avoids the forbidden moves. This is the backfilling
+ * move.
+ *
+ * These are minimalist functions capable of reading a ladder
+ * and not much more.
+ */
+
+/* Given a list of moves, restricted_defend1 tries to find a 
+ * move that defends the string (str) with one liberty,
+ * not considering moves from the list.
+ */
+int
+restricted_defend1(int str, int *move,  
+                  int num_forbidden_moves, int *forbidden_moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int xpos;
+  int lib;
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int liberties;
+  int k;
+
+  SETUP_TRACE_INFO("restricted_defend1", str);
+  reading_node_counter++;
+  moves.num = 0;
+  
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 1, str);
+
+  /* (lib) will be the liberty of the string. */
+  liberties = findlib(str, 1, &lib);
+  ASSERT1(liberties == 1, str);
+
+  /* Collect moves to try in the first batch.
+   * 1. First order liberty.
+   * 2. Chain breaking moves.
+   * 3. Moves to set up a snapback.
+   */
+  moves.pos[0] = lib;
+  moves.score[0] = 0;
+  moves.message[0] = "liberty";
+  moves.num = 1;
+  moves.num_tried = 0;
+
+  break_chain_moves(str, &moves);
+  set_up_snapback_moves(str, lib, &moves);
+  order_moves(str, &moves, color, read_function_name, NO_MOVE);
+
+  for (k = 0; k < moves.num; k++) {
+    int ko_capture;
+
+    xpos = moves.pos[k];
+    if (in_list(xpos, num_forbidden_moves, forbidden_moves))
+      continue;
+    /* To avoid loops with double ko, we do not allow any ko captures,
+     * even legal ones, if the opponent is komaster.
+     */
+    if (is_ko(xpos, color, NULL))
+      ko_capture = 1;
+    else
+      ko_capture = 0;
+
+    if ((get_komaster() != other || !ko_capture)
+       && trymove(xpos, color, moves.message[k], str)) {
+      int libs = countlib(str);
+      if (libs > 2) {
+       popgo();
+       SGFTRACE(xpos, WIN, "defense effective");
+       if (move)
+         *move = xpos;
+       return WIN;
+      }
+      if (libs == 2) {
+       int acode;
+
+       if (!ko_capture)
+         acode = restricted_attack2(str, NULL,
+                                    num_forbidden_moves, forbidden_moves);
+       else
+         acode = restricted_attack2(str, NULL,
+                                    num_forbidden_moves, forbidden_moves);
+       popgo();
+       if (acode == 0) {
+         SGFTRACE(xpos, WIN, "defense effective");
+         if (move)
+           *move = xpos;
+         return WIN;
+       }
+       /* if the move works with ko we save it, then look for something
+        * better.
+        */
+       UPDATE_SAVED_KO_RESULT(savecode, savemove, acode, xpos);
+      }
+      else
+       popgo();
+    }
+    else {
+      int ko_pos;
+      if (stackp <= ko_depth
+         && savecode == 0 
+         && (get_komaster() == EMPTY
+             || (get_komaster() == color
+                 && get_kom_pos() == xpos))
+         && is_ko(xpos, color, &ko_pos)
+         && tryko(xpos, color, "restricted_defend1-B")) {
+       int libs = countlib(str);
+       if (libs > 2) {
+         popgo();
+         UPDATE_SAVED_KO_RESULT(savecode, savemove, 2, xpos);
+       }
+       else if (libs == 2) {
+         int acode;
+         acode = restricted_attack2(str, NULL,
+                                    num_forbidden_moves, forbidden_moves);
+         popgo();
+         UPDATE_SAVED_KO_RESULT(savecode, savemove, acode, xpos);
+       }
+       else
+         popgo();
+      }
+    }
+  }
+
+  if (savecode != 0) {
+    if (move)
+      *move = savemove;
+    SGFTRACE(savemove, savecode, "saved move");
+    return savecode;
+  }
+
+  SGFTRACE(0, 0, NULL);
+  return 0;
+}
+
+
+/* Given a list of moves, restricted_attack2 tries to find a 
+ * move that attacks the string (str) with two liberties,
+ * not considering moves from the list.
+ */
+int
+restricted_attack2(int str, int *move,  
+                  int num_forbidden_moves, int *forbidden_moves)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos;
+  int liberties;
+  int libs[2];
+  int savemove = 0;
+  int savecode = 0;
+  int k;
+
+  SETUP_TRACE_INFO("restricted_attack2", str);
+  reading_node_counter++;
+
+  str = find_origin(str);
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 2, str);
+
+  /* The attack may fail if a boundary string is in atari and cannot 
+   * be defended.  First we must try defending such a string. 
+   */
+  /* Get the two liberties of (str). */
+  liberties = findlib(str, 2, libs);
+  ASSERT1(liberties == 2, str);
+
+  for (k = 0; k < 2; k++) {
+    int ko_pos;
+    int ko_capture;
+
+    apos = libs[k];
+    if (in_list(apos, num_forbidden_moves, forbidden_moves))
+      continue;
+    /* To avoid loops with double ko, we do not allow any ko captures,
+     * even legal ones, if the opponent is komaster. 
+     */
+    if (is_ko(apos, other, &ko_pos))
+      ko_capture = 1;
+    else
+      ko_capture = 0;
+
+    if ((get_komaster() != color || !ko_capture)
+       && trymove(apos, other, "restricted_attack2", str)) {
+      if ((!ko_capture 
+          && !restricted_defend1(str, NULL,
+                                 num_forbidden_moves, forbidden_moves))
+         || (ko_capture
+             && !restricted_defend1(str, NULL,
+                                    num_forbidden_moves, forbidden_moves))) {
+       popgo();
+       SGFTRACE(apos, WIN, "attack effective");
+       if (move)
+         *move = apos;
+       return WIN;
+      }
+      popgo();
+    }
+    else if (savecode == 0
+            && (get_komaster() == EMPTY
+                || (get_komaster() == other
+                    && get_kom_pos() == apos))
+            && tryko(apos, other, "restricted_attack2")) {
+      if (!restricted_defend1(str, NULL,
+                             num_forbidden_moves, forbidden_moves)) {
+       popgo();
+       savecode = KO_B;
+       savemove = apos;
+      }
+      else
+       popgo();
+    }
+  }
+
+  if (savecode != 0) {
+    if (move)
+      *move = savemove;
+    SGFTRACE(savemove, savecode, "saved move");
+    return savecode;
+  }
+
+  SGFTRACE(0, 0, NULL);
+  return 0;
+}
+
+
+/*
+ * Returns true if the move is in a given list of moves.
+ */
+
+static int
+in_list(int move, int num_moves, int *moves)
+{
+  int k;
+
+  for (k = 0; k < num_moves; k++)
+    if (moves[k] == move)
+      return 1;
+  return 0;
+}
+
+
+/* ================================================================ */
+/*                          Move ordering                           */
+/* ================================================================ */
+
+/* Parameters used in the ordering of moves to try in the tactical
+ * reading.
+ */
+
+/*                                              0   1   2   3   4  >4  */
+static int defend_lib_score[6]              = {-5, -4,  0,  3,  5, 50};
+static int defend_not_adjacent_lib_score[5] = { 0,  0,  2,  3,  5};
+static int defend_capture_score[6]          = { 0,  6,  9, 13, 18, 24};
+static int defend_atari_score[6]            = { 0,  2,  4,  6,  7, 8};
+static int defend_save_score[6]             = { 0,  3,  6,  8, 10, 12};
+static int defend_open_score[5]             = { 0,  1,  2,  3,  4};
+static int attack_own_lib_score[5]          = {10, -4,  2,  3,  4};
+static int attack_string_lib_score[6]       = {-5,  2,  3,  7, 10, 19};
+static int attack_capture_score[6]          = {-4,  4, 10, 15, 20, 25};
+static int attack_save_score[6]             = { 0, 10, 13, 18, 21, 24};
+static int attack_open_score[5]             = { 0,  0,  2,  4,  4};
+static int defend_not_edge_score            = 5;
+static int attack_not_edge_score            = 1;
+static int attack_ko_score                  = -15;
+static int cannot_defend_penalty            = -20;
+static int safe_atari_score                 = 8;
+
+
+static void
+sgf_dumpmoves(struct reading_moves *moves, const char *funcname)
+{
+  char buf[500];
+  char *pos;
+  int i, chars;
+  sprintf(buf, "Move order for %s: %n", funcname, &chars);
+  pos = buf + chars;
+  for (i = moves->num_tried; i < moves->num; i++) {
+    sprintf(pos, "%c%d (%d) %n",
+           J(moves->pos[i]) + 'A' + (J(moves->pos[i]) >= 8),
+           board_size - I(moves->pos[i]), moves->score[i], &chars);
+    pos += chars;
+  }
+  sgftreeAddComment(sgf_dumptree, buf);
+}
+
+
+/* The string at (str) is under attack. The moves.num moves in
+ * (moves) for color have been deemed interesting in
+ * the attack or defense of the group. Most of these moves will be
+ * immediate liberties of the group.
+ *
+ * This function orders the moves in the order where the move most
+ * likely to succeed to attack or defend the string will be first and
+ * so on.
+ *
+ * Currently, this is defined as:
+ * 1) Moves which let the defending string get more liberties are more
+ *    interesting.
+ * 2) Moves adjacent to the most open liberties are more 
+ *    interesting than those with fewer open liberties.
+ * 3) Moves on the edge are less interesting.
+ *
+ * Moves below first_move are ignored and assumed to be sorted already.
+ */
+
+static void
+order_moves(int str, struct reading_moves *moves, int color,
+           const char *funcname, int killer)
+{
+  int string_color = board[str];
+  int string_libs = countlib(str);
+  int r;
+  int i, j;
+
+  /* Don't bother sorting if only one move, or none at all. */
+  if (moves->num - moves->num_tried < 2) {
+    /* But let's still have a single candidate in the sgf output */
+    if (sgf_dumptree && moves->num > moves->num_tried)
+      sgf_dumpmoves(moves, funcname);
+    return;
+  }
+
+  /* Assign a score to each move. */
+  for (r = moves->num_tried; r < moves->num; r++) {
+    int move = moves->pos[r];
+
+    /* Look at the neighbors of this move and count the things we
+     * find. Friendly and opponent stones are related to color, i.e.
+     * the player to move, not to the color of the string.
+     */
+    int number_edges       = 0; /* outside board */
+    int number_same_string = 0; /* the string being attacked */
+    int number_own         = 0; /* friendly stone */
+    int number_opponent    = 0; /* opponent stone */
+    int captured_stones    = 0; /* number of stones captured by this move */
+    int threatened_stones  = 0; /* number of stones threatened by this move */
+    int saved_stones       = 0; /* number of stones in atari saved */
+    int number_open        = 0; /* empty intersection */
+
+    /* We let the incremental_board code do the heavy work. */
+    incremental_order_moves(move, color, str, &number_edges,
+                           &number_same_string, &number_own,
+                           &number_opponent, &captured_stones,
+                           &threatened_stones, &saved_stones, &number_open);
+
+    if (0)
+      gprintf("%o %1m values: %d %d %d %d %d %d %d %d\n", move, number_edges,
+             number_same_string, number_own, number_opponent, captured_stones,
+             threatened_stones, saved_stones, number_open);
+    
+    /* Different score strategies depending on whether the move is
+     * attacking or defending the string.
+     */
+    if (color == string_color) {
+      /* Defense move.
+       *
+       * 1) Add twice the number of liberties the group receives by
+       *    extending to the intersection of the move, if more than one.
+       *    Only applicable if the move is adjacent to the group.
+       */
+      
+      int libs = approxlib(move, color, 10, NULL);
+      if (number_same_string > 0) {
+       if (libs > 5 || (libs == 4 && stackp > fourlib_depth))
+         moves->score[r] += defend_lib_score[5] + (libs - 4);
+       else
+         moves->score[r] += defend_lib_score[libs];
+      }
+      else {
+       /* Add points for the number of liberties the played stone
+         * obtains when not adjacent to the attacked string.
+        */
+       if (libs > 4)
+         moves->score[r] += defend_not_adjacent_lib_score[4];
+       else
+         moves->score[r] += defend_not_adjacent_lib_score[libs];
+      }
+      
+      /* 2) Add the number of open liberties near the move to its score. */
+      gg_assert(number_open <= 4);
+      moves->score[r] += defend_open_score[number_open];
+      
+      /* 3) Add a bonus if the move is not on the edge. 
+       */
+      if (number_edges == 0 || captured_stones > 0)
+       moves->score[r] += defend_not_edge_score;
+      
+      /* 4) Add thrice the number of captured stones. */
+      if (captured_stones <= 5)
+       moves->score[r] += defend_capture_score[captured_stones];
+      else
+       moves->score[r] += defend_capture_score[5] + captured_stones;
+
+      /* 5) Add points for stones put into atari, unless this is a
+       *    self atari.
+       */
+      if (libs + captured_stones > 1) {
+       if (threatened_stones <= 5)
+         moves->score[r] += defend_atari_score[threatened_stones];
+       else
+         moves->score[r] += defend_atari_score[5] + threatened_stones;
+      }
+
+      /* 6) Add a bonus for saved stones. */
+      if (saved_stones <= 5)
+       moves->score[r] += defend_save_score[saved_stones];
+      else
+       moves->score[r] += defend_save_score[5];
+    }
+    else {
+      /* Attack move.
+       *
+       * 1) Add the number of liberties the attacker gets when playing
+       *    there, but never more than four.
+       */
+      int libs = approxlib(move, color, 4, NULL);
+      if (libs > 4)
+       libs = 4;
+      moves->score[r] += attack_own_lib_score[libs];
+
+      if (libs == 0 && captured_stones == 1)
+       moves->score[r] += attack_ko_score;
+      
+      /* 2) If the move is not a self atari and adjacent to the
+       *    string, add the number of liberties the opponent would
+       *    gain by playing there. If the string has two liberties,
+       *    self-ataris are also ok since they may be snapbacks, but
+       *    only if a single stone is sacrificed.
+       */
+      if ((libs + captured_stones > 1 || (string_libs <= 2 && number_own == 0))
+         && number_same_string > 0) {
+       int safe_atari;
+       int liberties = approxlib(move, string_color, 5, NULL);
+       if (liberties > 5 || (liberties == 4 && stackp > fourlib_depth))
+         liberties = 5;
+       moves->score[r] += attack_string_lib_score[liberties];
+
+       safe_atari = (string_libs <= 2 && libs + captured_stones > 1);
+       /* The defender can't play here without getting into atari, so
+         * we probably souldn't either.
+        */
+       if (liberties == 1 && saved_stones == 0 && !safe_atari)
+         moves->score[r] += cannot_defend_penalty;
+
+       /* Bonus if we put the attacked string into atari without
+         * ourselves getting into atari.
+        */
+       if (safe_atari)
+         moves->score[r] += safe_atari_score;
+      }
+      
+      /* 3) Add the number of open liberties near the move to its score. */
+      gg_assert(number_open <= 4);
+      moves->score[r] += attack_open_score[number_open];
+      
+      /* 4) Add a bonus if the move is not on the edge. */
+      if (number_edges == 0)
+       moves->score[r] += attack_not_edge_score;
+      
+      /* 5) Add twice the number of captured stones. */
+      if (captured_stones <= 5)
+       moves->score[r] += attack_capture_score[captured_stones];
+      else
+       moves->score[r] += attack_capture_score[5];
+
+      /* 6) Add a bonus for saved stones. */
+      if (saved_stones <= 5)
+       moves->score[r] += attack_save_score[saved_stones];
+      else
+       moves->score[r] += attack_save_score[5];
+    }
+    if (moves->pos[r] == killer)
+      moves->score[r] += 50;
+  }
+  
+  /* Now sort the moves.  We use selection sort since this array will
+   * probably never be more than 10 moves long.  In this case, the
+   * overhead imposed by quicksort will probably overshadow the gains
+   * given by the O(n*log(n)) behaviour over the O(n^2) behaviour of
+   * selection sort.
+   */
+  for (i = moves->num_tried; i < moves->num-1; i++) {
+    int maxscore = moves->score[i];
+    int max_at = 0; /* This is slightly faster than max_at = i. */
+
+    /* Find the move with the biggest score. */
+    for (j = i + 1; j < moves->num; j++) {
+      if (moves->score[j] > maxscore) {
+       maxscore = moves->score[j];
+       max_at = j;
+      }
+    }
+
+    /* Now exchange the move at i with the move at max_at.
+     * Don't forget to exchange the scores as well.
+     */
+    if (max_at != 0) {
+      int temp = moves->pos[max_at];
+      const char *temp_message = moves->message[max_at];
+
+      moves->pos[max_at] = moves->pos[i];
+      moves->score[max_at] = moves->score[i];
+      moves->message[max_at] = moves->message[i];
+
+      moves->pos[i] = temp;
+      moves->score[i] = maxscore;
+      moves->message[i] = temp_message;
+    }
+  }
+
+
+  if (0) {
+    gprintf("%oVariation %d:\n", count_variations);
+    for (i = moves->num_tried; i < moves->num; i++)
+      gprintf("%o  %1M %d\n", moves->pos[i], moves->score[i]);
+  }
+
+  if (sgf_dumptree)
+    sgf_dumpmoves(moves, funcname);
+}
+
+
+/* Set new values for the move ordering parameters. */
+void
+tune_move_ordering(int params[MOVE_ORDERING_PARAMETERS])
+{
+  int k;
+  for (k = 0; k < 6; k++) {
+    defend_lib_score[k]                = params[k];
+    if (k < 5)
+      defend_not_adjacent_lib_score[k] = params[k + 6];
+    defend_capture_score[k]            = params[k + 11];
+    defend_atari_score[k]              = params[k + 17];
+    defend_save_score[k]               = params[k + 23];
+    if (k < 5) {
+      defend_open_score[k]             = params[k + 29];
+      attack_own_lib_score[k]          = params[k + 34];
+    }
+    attack_string_lib_score[k]         = params[k + 39];
+    attack_capture_score[k]            = params[k + 45];
+    attack_save_score[k]               = params[k + 51];
+    if (k < 5)
+      attack_open_score[k]             = params[k + 57];
+  }
+  defend_not_edge_score                = params[62];
+  attack_not_edge_score                = params[63];
+  attack_ko_score                      = params[64];
+  cannot_defend_penalty                = params[65];
+  safe_atari_score                     = params[66];
+
+  if (verbose) {
+    gprintf("static int defend_lib_score[6]              = {%d, %d, %d, %d, %d, %d};\n",
+           defend_lib_score[0], defend_lib_score[1],
+           defend_lib_score[2], defend_lib_score[3],
+           defend_lib_score[4], defend_lib_score[5]);
+    gprintf("static int defend_not_adjacent_lib_score[5] = {%d, %d, %d, %d, %d};\n",
+           defend_not_adjacent_lib_score[0], defend_not_adjacent_lib_score[1],
+           defend_not_adjacent_lib_score[2], defend_not_adjacent_lib_score[3],
+           defend_not_adjacent_lib_score[4]);
+    gprintf("static int defend_capture_score[6]          = {%d, %d, %d, %d, %d, %d};\n",
+           defend_capture_score[0], defend_capture_score[1],
+           defend_capture_score[2], defend_capture_score[3],
+           defend_capture_score[4], defend_capture_score[5]);
+    gprintf("static int defend_atari_score[6]            = {%d, %d, %d, %d, %d, %d};\n",
+           defend_atari_score[0], defend_atari_score[1],
+           defend_atari_score[2], defend_atari_score[3],
+           defend_atari_score[4], defend_atari_score[5]);
+    gprintf("static int defend_save_score[6]             = {%d, %d, %d, %d, %d, %d};\n",
+           defend_save_score[0], defend_save_score[1],
+           defend_save_score[2], defend_save_score[3],
+           defend_save_score[4], defend_save_score[5]);
+    gprintf("static int defend_open_score[5]             = {%d, %d, %d, %d, %d};\n",
+           defend_open_score[0], defend_open_score[1],
+           defend_open_score[2], defend_open_score[3],
+           defend_open_score[4]);
+    gprintf("static int attack_own_lib_score[5]          = {%d, %d, %d, %d, %d};\n",
+           attack_own_lib_score[0], attack_own_lib_score[1],
+           attack_own_lib_score[2], attack_own_lib_score[3],
+           attack_own_lib_score[4]);
+    gprintf("static int attack_string_lib_score[6]       = {%d, %d, %d, %d, %d, %d};\n",
+           attack_string_lib_score[0], attack_string_lib_score[1],
+           attack_string_lib_score[2], attack_string_lib_score[3],
+           attack_string_lib_score[4], attack_string_lib_score[5]);
+    gprintf("static int attack_capture_score[6]          = {%d, %d, %d, %d, %d, %d};\n",
+           attack_capture_score[0], attack_capture_score[1],
+           attack_capture_score[2], attack_capture_score[3],
+           attack_capture_score[4], attack_capture_score[5]);
+    gprintf("static int attack_save_score[6]             = {%d, %d, %d, %d, %d, %d};\n",
+           attack_save_score[0], attack_save_score[1],
+           attack_save_score[2], attack_save_score[3],
+           attack_save_score[4], attack_save_score[5]);
+    gprintf("static int attack_open_score[5]             = {%d, %d, %d, %d, %d};\n",
+           attack_open_score[0], attack_open_score[1],
+           attack_open_score[2], attack_open_score[3],
+           attack_open_score[4]);
+    gprintf("static int defend_not_edge_score            = %d;\n", defend_not_edge_score);
+    gprintf("static int attack_not_edge_score            = %d;\n", attack_not_edge_score);
+    gprintf("static int attack_ko_score                  = %d;\n", attack_ko_score);
+    gprintf("static int cannot_defend_penalty            = %d;\n", cannot_defend_penalty);
+    gprintf("static int safe_atari_score                 = %d;\n", safe_atari_score);
+  }
+}
+
+
+
+/* ================================================================ */
+/*                         Reading utilities                        */
+/* ================================================================ */
+
+
+static int safe_move_cache[BOARDMAX][2];
+static int safe_move_cache_when[BOARDMAX][2];
+static void clear_safe_move_cache(void);
+
+static void
+clear_safe_move_cache(void)
+{
+  int k;
+
+  for (k = BOARDMIN; k < BOARDMAX; k++) {
+    safe_move_cache_when[k][0] = -1;
+    safe_move_cache_when[k][1] = -1;
+  }
+}
+
+/* safe_move(move, color) checks whether a move at (move) is illegal
+ * or can immediately be captured. If stackp==0 the result is cached.
+ * If the move only can be captured by a ko, it's considered safe.
+ * This may or may not be a good convention.
+ *
+ * For performance reasons, the result of this function is cached.
+ */
+
+int
+safe_move(int move, int color)
+{
+  int safe = 0;
+  static int initialized = 0;
+  int ko_move;
+  
+  if (!initialized) {
+    clear_safe_move_cache();
+    initialized = 1;
+  }
+
+  /* If we have this position cached, use the previous value.
+   * Only use cached values when stackp is 0 and reading is not being done
+   * at a modified depth.
+   */
+  if (stackp == 0
+      && depth_offset == 0
+      && safe_move_cache_when[move][color == BLACK] == position_number)
+    return safe_move_cache[move][color == BLACK];
+
+  /* Otherwise calculate the value... */
+  if (komaster_trymove(move, color, "safe_move", 0, &ko_move, 1)) {
+    safe = REVERSE_RESULT(attack(move, NULL));
+    if (ko_move && safe != 0)
+      safe = KO_B;
+    popgo();
+  }
+
+  /* ...and store it in the cache.
+   * FIXME: Only store result in cache when we're working at
+   * full depth.
+   *
+   * Comment: This is currently not a problem since no reduced depth
+   * reading is performed.
+   */
+  if (stackp == 0 && depth_offset == 0) {
+    if (0)
+      gprintf("Safe move at %1m for %s cached when depth=%d, position number=%d\n",
+             move, color_to_string(color), depth, position_number);
+    safe_move_cache_when[move][color == BLACK] = position_number;
+    safe_move_cache[move][color == BLACK] = safe;
+  }
+
+  return safe;
+}
+
+
+/* Checks if a move by color makes an opponent move at pos a self atari.
+ */
+int
+does_secure(int color, int move, int pos)
+{
+  int result = 0;
+  if (trymove(move, color, NULL, NO_MOVE)) {
+    if (is_self_atari(pos, OTHER_COLOR(color)))
+      result = 1;
+    popgo();
+  }
+  
+  return result;
+}
+
+
+/* ===================== Statistics  ============================= */
+
+
+/* Clear statistics. */
+void
+reset_reading_node_counter()
+{
+  reading_node_counter = 0;
+}
+
+
+/* Retrieve statistics. */
+int
+get_reading_node_counter()
+{
+  return reading_node_counter;
+}
+
+/* ============ Reading shadow =============== */
+
+/* Draw the reading shadow, for debugging purposes */
+
+void
+draw_reading_shadow()
+{
+  int i, j;
+  int c = ' ';
+  int pos;
+
+  start_draw_board();
+  
+  for (i = 0; i < board_size; i++) {
+    fprintf(stderr, "\n%2d", board_size - i);
+    
+    for (j = 0; j < board_size; j++) {
+      pos = POS(i, j);
+      if (!shadow[pos] && board[pos] == EMPTY)
+       c = '.';
+      else if (!shadow[pos] && board[pos] == WHITE)
+       c = 'O';
+      else if (!shadow[pos] && board[pos] == BLACK)
+       c = 'X';
+      if (shadow[pos] && board[pos] == EMPTY)
+       c = ',';
+      else if (shadow[pos] && board[pos] == WHITE)
+       c = 'o';
+      else if (shadow[pos] && board[pos] == BLACK)
+       c = 'x';
+      
+      fprintf(stderr, " %c", c);
+    }
+    
+    fprintf(stderr, " %d", board_size - i);
+  }
+
+  end_draw_board();
+}
+
+
+/* ================================================================ */
+/*              Code for special purposes.                          */
+/* ================================================================ */
+
+/* simple_ladder(str, &move) tries to capture a string (str)
+ * with exactly two liberties under simplified assumptions, which are
+ * adequate in a ladder. The rules are as follows:
+ *
+ * 1. The attacker is allowed to play at each of the two liberties,
+ *    but no other move. If the move was legal, the string now has
+ *    exactly one liberty.
+ * 2. The defender must move out of atari. This can only be done by
+ *    either extending at the liberty or capturing a neighboring
+ *    string which was in atari. All such moves may be tested.
+ * 3. Depending on the resulting number of liberties of the string
+ *    after the defender's move, we value each node as follows:
+ *
+ *    3 or more liberties:           the attack has failed
+ *    2 liberties:                   recurse
+ *    1 liberty:                     the attack has succeeded
+ *
+ *    illegal move for the defender: successful attack
+ *    illegal move for the attacker: failed attack
+ *
+ * Return codes are as usual 0 for failure, WIN for success, KO_A for
+ * a ko where the defender must make the first ko threat and KO_B for
+ * a ko where the attacked has to make the first threat. If the attack
+ * was successful, (*move) contains the attacking move, unless it is a
+ * null pointer.
+ *
+ * The differences compared to the attack2()/defend1() combination for
+ * reading ladders is that this one is a strict ladder reader which
+ * never allows the defender to have more than one liberty when it's
+ * in turn to move. This has a number of consequences.
+ *
+ * 1. This function will miss tactical captures involving other
+ *    techniques than the ladder.
+ *
+ * 2. This function is faster because it gives up faster when the
+ *    ladder doesn't work. In particular it can't branch out in a huge
+ *    tree of exotic variations.
+ *
+ * 3. This function always reads ladders to the very end. There are no
+ *    depth limits or other assumptions to stop reading prematurely.
+ *
+ * 4. If this function returns WIN, it is guaranteed that the defender
+ *    has no way whatsoever to escape, all possibilities are tried.
+ *    The converse is definitely not true.
+ */
+
+int
+simple_ladder(int str, int *move)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int apos;
+  int libs[2];
+  int savemove = 0;
+  int savecode = 0;
+  int dcode;
+  int k;
+  struct reading_moves moves;
+
+  SETUP_TRACE_INFO("simple_ladder", str);
+  reading_node_counter++;
+  moves.num = 0;
+  moves.num_tried = 0;
+
+  str = find_origin(str);
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 2, str);
+
+  /* Give up if we attacked depending on ko for too long. */
+  if (stackp > depth + 20 && get_komaster() == OTHER_COLOR(board[str])) {
+    SGFTRACE(0, 0, NULL);
+    if (move)
+      *move = PASS_MOVE;
+    return 0;
+  }
+
+  /* Get the two liberties of (str). */
+  findlib(str, 2, libs);
+
+  /* If the defender can get enough liberties by playing one of these 
+   * two, then we have no choice but to block there and consequently, 
+   * it is unnecesary to try the other liberty.
+   */
+
+  if (approxlib(libs[0], color, 4, NULL) <= 3)
+    ADD_CANDIDATE_MOVE(libs[1], 0, moves, "simple_ladder");
+  if (approxlib(libs[1], color, 4, NULL) <= 3)
+    ADD_CANDIDATE_MOVE(libs[0], 0, moves, "simple_ladder");
+
+  order_moves(str, &moves, other, read_function_name, NO_MOVE);
+
+  for (k = 0; k < moves.num; k++) {
+    int ko_move;
+
+    apos = moves.pos[k];
+    if (komaster_trymove(apos, other, moves.message[k], str,
+                        &ko_move, savecode == 0)) {
+      if (!ko_move) {
+       dcode = simple_ladder_defend(str, NULL);
+       if (dcode != WIN) {
+         if (dcode == 0) {
+           popgo();
+           SGFTRACE(apos, WIN, "attack effective");
+           if (move)
+             *move = apos;
+           return WIN;
+         }
+         UPDATE_SAVED_KO_RESULT(savecode, savemove, dcode, apos);
+       }
+      }
+      else {
+       if (simple_ladder_defend(str, NULL) != WIN) {
+         savemove = apos;
+         savecode = KO_B;
+       }
+      }
+      popgo();
+    }
+  }
+  
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+static int
+simple_ladder_defend(int str, int *move)
+{
+  int color = board[str];
+  int xpos;
+  int lib;
+  struct reading_moves moves;
+  int savemove = 0;
+  int savecode = 0;
+  int k;
+
+  SETUP_TRACE_INFO("simple_ladder_defend", str);
+  reading_node_counter++;
+
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(countlib(str) == 1, str);
+
+  /* lib will be the liberty of the string. */
+  findlib(str, 1, &lib);
+
+  moves.pos[0] = lib;
+  moves.score[0] = 0;
+  moves.message[0] = "liberty";
+  moves.num = 1;
+  moves.num_tried = 0;
+
+  break_chain_moves(str, &moves);
+  order_moves(str, &moves, color, read_function_name, NO_MOVE);
+
+  for (k = 0; k < moves.num; k++) {
+    int ko_move;
+
+    xpos = moves.pos[k];
+    if (komaster_trymove(xpos, color, moves.message[k], str,
+                        &ko_move, savecode == 0)) {
+      int acode;
+      int new_libs = countlib(str);
+      if (new_libs > 2)
+       acode = 0;
+      else if (new_libs < 2)
+       acode = WIN;
+      else
+       acode = simple_ladder(str, NULL);
+      popgo();
+      
+      if (!ko_move)
+       CHECK_RESULT(savecode, savemove, acode, xpos, move,
+                    "defense effective");
+      else {
+       if (acode != WIN) {
+         savemove = xpos;
+         savecode = KO_B;
+       }
+      }
+    }
+  }
+
+  RETURN_RESULT(savecode, savemove, move, "saved move");
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/semeai.c b/engine/semeai.c
new file mode 100644 (file)
index 0000000..3d25f46
--- /dev/null
@@ -0,0 +1,617 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "liberty.h"
+
+#define INFINITY 1000
+
+static void find_moves_to_make_seki(void);
+static void update_status(int dr, enum dragon_status new_status, 
+                         enum dragon_status new_safety);
+static int close_enough_for_proper_semeai(int apos, int bpos);
+
+/* semeai() searches for pairs of dragons of opposite color which
+ * have safety DEAD. If such a pair is found, owl_analyze_semeai is
+ * called to read out which dragon will prevail in a semeai, and
+ * whether a move now will make a difference in the outcome. The
+ * dragon statuses are revised, and if a move now will make a
+ * difference in the outcome this information is stored in
+ * dragon_data2 and an owl reason is later generated by
+ * semeai_move_reasons().
+ */
+
+#define MAX_DRAGONS 50
+
+void
+semeai()
+{
+  int semeai_results_first[MAX_DRAGONS][MAX_DRAGONS];
+  int semeai_results_second[MAX_DRAGONS][MAX_DRAGONS];
+  int semeai_move[MAX_DRAGONS][MAX_DRAGONS];
+  signed char semeai_certain[MAX_DRAGONS][MAX_DRAGONS];
+  int d1, d2;
+  int k;
+  int num_dragons = number_of_dragons;
+
+  if (num_dragons > MAX_DRAGONS) {
+    TRACE("Too many dragons!!! Semeai analysis disabled.");
+    return;
+  }
+
+  for (d1 = 0; d1 < num_dragons; d1++)
+    for (d2 = 0; d2 < num_dragons; d2++) {
+      semeai_results_first[d1][d2] = -1;
+      semeai_results_second[d1][d2] = -1;
+    }
+
+  for (d1 = 0; d1 < num_dragons; d1++)
+    for (k = 0; k < dragon2[d1].neighbors; k++) {
+      int apos = DRAGON(d1).origin;
+      int bpos = DRAGON(dragon2[d1].adjacent[k]).origin;
+      int result_certain;
+      
+      d2 = dragon[bpos].id;
+
+      /* Look for semeais */
+      
+      if (dragon[apos].color == dragon[bpos].color
+         || (dragon[apos].status != DEAD
+             && dragon[apos].status != CRITICAL)
+         || (dragon[bpos].status != DEAD
+             && dragon[bpos].status != CRITICAL))
+       continue;
+
+      
+      /* Ignore inessential worms or dragons */
+      
+      if (worm[apos].inessential 
+         || DRAGON2(apos).safety == INESSENTIAL
+         || worm[bpos].inessential 
+         || DRAGON2(bpos).safety == INESSENTIAL)
+       continue;
+
+      /* Sometimes the dragons are considered neighbors but are too
+       * distant to constitute a proper semeai, e.g. in nngs4:650, P2
+       * vs. R3. Then the result of semeai reading may be meaningless
+       * and can confuse the analysis. In order to avoid this we check
+       * that the dragons either are directly adjacent or at least
+       * have one common liberty.
+       */
+      if (!close_enough_for_proper_semeai(apos, bpos))
+       continue;
+
+      /* The array semeai_results_first[d1][d2] will contain the status
+       * of d1 after the d1 d2 semeai, giving d1 the first move.
+       * The array semeai_results_second[d1][d2] will contain the status
+       * of d1 after the d1 d2 semeai, giving d2 the first move.
+       */
+      
+      DEBUG(DEBUG_SEMEAI, "Considering semeai between %1m and %1m\n",
+           apos, bpos);
+      owl_analyze_semeai(apos, bpos,
+                        &(semeai_results_first[d1][d2]), 
+                        &(semeai_results_second[d1][d2]),
+                        &(semeai_move[d1][d2]), 1, &result_certain);
+      DEBUG(DEBUG_SEMEAI, "results if %s moves first: %s %s, %1m%s\n",
+           board[apos] == BLACK ? "black" : "white",
+           result_to_string(semeai_results_first[d1][d2]),
+           result_to_string(semeai_results_second[d1][d2]),
+           semeai_move[d1][d2], result_certain ? "" : " (uncertain)");
+      semeai_certain[d1][d2] = result_certain;
+    }
+  
+  /* Look for dragons which lose all their semeais outright. The
+   * winners in those semeais are considered safe and further semeais
+   * they are involved in are disregarded. See semeai:81-86 and
+   * nicklas5:1211 for examples of where this is useful.
+   *
+   * Note: To handle multiple simultaneous semeais properly we would
+   * have to make simultaneous semeai reading. Lacking that we can
+   * only get rough guesses of the correct status of the involved
+   * dragons. This code is not guaranteed to be correct in all
+   * situations but should usually be an improvement.
+   */
+  for (d1 = 0; d1 < num_dragons; d1++) {
+    int involved_in_semeai = 0;
+    int all_lost = 1;
+    for (d2 = 0; d2 < num_dragons; d2++) {
+      if (semeai_results_first[d1][d2] != -1) {
+       involved_in_semeai = 1;
+       if (semeai_results_first[d1][d2] != 0) {
+         all_lost = 0;
+         break;
+       }
+      }
+    }
+    
+    if (involved_in_semeai && all_lost) {
+      /* Leave the status changes to the main loop below. Here we just
+       * remove the presumably irrelevant semeai results.
+       */
+      for (d2 = 0; d2 < num_dragons; d2++) {
+       if (semeai_results_first[d1][d2] == 0) {
+         int d3;
+         for (d3 = 0; d3 < num_dragons; d3++) {
+           if (semeai_results_second[d3][d2] > 0) {
+             semeai_results_first[d3][d2] = -1;
+             semeai_results_second[d3][d2] = -1;
+             semeai_results_first[d2][d3] = -1;
+             semeai_results_second[d2][d3] = -1;
+           }
+         }
+       }
+      }
+    }
+  }
+
+  for (d1 = 0; d1 < num_dragons; d1++) {
+    int semeais_found = 0;
+    int best_defense = 0;
+    int best_attack = 0;
+    int defense_move = PASS_MOVE;
+    int attack_move = PASS_MOVE;
+    int defense_certain = -1;
+    int attack_certain = -1;
+    int semeai_attack_target = NO_MOVE;
+    int semeai_defense_target = NO_MOVE;
+    
+    for (d2 = 0; d2 < num_dragons; d2++) {
+      if (semeai_results_first[d1][d2] == -1)
+       continue;
+      gg_assert(semeai_results_second[d1][d2] != -1);
+      semeais_found++;
+
+      if (best_defense < semeai_results_first[d1][d2]
+         || (best_defense == semeai_results_first[d1][d2]
+             && defense_certain < semeai_certain[d1][d2])) {
+       best_defense = semeai_results_first[d1][d2];
+       defense_move = semeai_move[d1][d2];
+       defense_certain = semeai_certain[d1][d2];
+       gg_assert(board[dragon2[d2].origin] == OTHER_COLOR(board[dragon2[d1].origin]));
+       semeai_defense_target = dragon2[d2].origin;
+      }
+      if (best_attack < semeai_results_second[d2][d1]
+         || (best_attack == semeai_results_second[d2][d1]
+             && attack_certain < semeai_certain[d2][d1])) {
+       best_attack = semeai_results_second[d2][d1];
+       attack_move = semeai_move[d2][d1];
+       attack_certain = semeai_certain[d2][d1];
+       semeai_attack_target = dragon2[d2].origin;
+      }
+    }
+    
+    if (semeais_found) {
+      dragon2[d1].semeais = semeais_found;
+      if (best_defense != 0 && best_attack != 0)
+       update_status(DRAGON(d1).origin, CRITICAL, CRITICAL);
+      else if (best_attack == 0 && attack_certain)
+       update_status(DRAGON(d1).origin, ALIVE, ALIVE);
+      dragon2[d1].semeai_defense_code = best_defense;
+      dragon2[d1].semeai_defense_point = defense_move;
+      dragon2[d1].semeai_defense_certain = defense_certain;
+      ASSERT1(board[semeai_defense_target]
+             == OTHER_COLOR(board[dragon2[d1].origin]),
+             dragon2[d1].origin);
+      dragon2[d1].semeai_defense_target = semeai_defense_target;
+      dragon2[d1].semeai_attack_code = best_attack;
+      dragon2[d1].semeai_attack_point = attack_move;
+      dragon2[d1].semeai_attack_certain = attack_certain;
+      dragon2[d1].semeai_attack_target = semeai_attack_target;
+    }
+  }
+  find_moves_to_make_seki();
+}
+
+/* Find moves turning supposed territory into seki. This is not
+ * detected above since it either involves an ALIVE dragon adjacent to
+ * a CRITICAL dragon, or an ALIVE dragon whose eyespace can be invaded
+ * and turned into a seki.
+ *
+ * Currently we only search for tactically critical strings with
+ * dragon status dead, which are neighbors of only one opponent
+ * dragon, which is alive. Through semeai analysis we then determine
+ * whether such a string can in fact live in seki. Relevant testcases
+ * include gunnar:42 and gifu03:2.
+ */
+static void
+find_moves_to_make_seki()
+{
+  int str;
+  int defend_move;
+  int resulta, resultb;
+  
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (IS_STONE(board[str]) && is_worm_origin(str, str)
+       && attack_and_defend(str, NULL, NULL, NULL, &defend_move)
+       && dragon[str].status == DEAD
+       && DRAGON2(str).hostile_neighbors == 1) {
+      int k;
+      int color = board[str];
+      int opponent = NO_MOVE;
+      int certain;
+      struct eyevalue reduced_genus;
+
+      for (k = 0; k < DRAGON2(str).neighbors; k++) {
+       opponent = dragon2[DRAGON2(str).adjacent[k]].origin;
+       if (board[opponent] != color)
+         break;
+      }
+
+      ASSERT1(opponent != NO_MOVE, opponent);
+
+      if (dragon[opponent].status != ALIVE)
+       continue;
+
+      /* FIXME: These heuristics are used for optimization.  We don't
+       *        want to call expensive semeai code if the opponent
+       *        dragon has more than one eye elsewhere.  However, the
+       *        heuristics might still need improvement.
+       */
+      compute_dragon_genus(opponent, &reduced_genus, str);
+      
+      if (min_eyes(&reduced_genus) > 1
+         || DRAGON2(opponent).moyo_size > 10
+         || DRAGON2(opponent).moyo_territorial_value > 2.999
+         || DRAGON2(opponent).escape_route > 0
+         || DRAGON2(str).escape_route > 0)
+       continue;
+
+      owl_analyze_semeai_after_move(defend_move, color, opponent, str,
+                                   &resulta, &resultb, NULL, 1, &certain, 0);
+
+      if (resultb == WIN) {
+       owl_analyze_semeai(str, opponent, &resultb, &resulta,
+                          &defend_move, 1, &certain);
+       resulta = REVERSE_RESULT(resulta);
+       resultb = REVERSE_RESULT(resultb);
+      }
+      
+      /* Do not trust uncertain results. In fact it should only take a
+       * few nodes to determine the semeai result, if it is a proper
+       * potential seki position.
+       */
+      if (resultb != WIN && certain) {
+       int d = dragon[str].id;
+       DEBUG(DEBUG_SEMEAI, "Move to make seki at %1m (%1m vs %1m)\n",
+             defend_move, str, opponent);
+       dragon2[d].semeais++;
+       update_status(str, CRITICAL, CRITICAL);
+       dragon2[d].semeai_defense_code = REVERSE_RESULT(resultb);
+       dragon2[d].semeai_defense_point = defend_move;
+       dragon2[d].semeai_defense_certain = certain;
+       gg_assert(board[opponent] == OTHER_COLOR(board[dragon2[d].origin]));
+       dragon2[d].semeai_defense_target = opponent;
+
+       /* We need to determine a proper attack move (the one that
+        * prevents seki).  Currently we try the defense move first,
+        * and if it doesn't work -- all liberties of the string.
+        */
+       owl_analyze_semeai_after_move(defend_move, OTHER_COLOR(color),
+                                     str, opponent, &resulta, NULL,
+                                     NULL, 1, NULL, 0);
+       if (resulta != WIN) {
+         dragon2[d].semeai_attack_code = REVERSE_RESULT(resulta);
+         dragon2[d].semeai_attack_point = defend_move;
+       }
+       else {
+         int k;
+         int libs[MAXLIBS];
+         int liberties = findlib(str, MAXLIBS, libs);
+
+         for (k = 0; k < liberties; k++) {
+           owl_analyze_semeai_after_move(libs[k], OTHER_COLOR(color),
+                                         str, opponent, &resulta, NULL,
+                                         NULL, 1, NULL, 0);
+           if (resulta != WIN) {
+             dragon2[d].semeai_attack_code = REVERSE_RESULT(resulta);
+             dragon2[d].semeai_attack_point = libs[k];
+             break;
+           }
+         }
+
+         if (k == liberties) {
+           DEBUG(DEBUG_SEMEAI,
+                 "No move to attack in semeai (%1m vs %1m), seki assumed.\n",
+                 str, opponent);
+           dragon2[d].semeai_attack_code = 0;
+           dragon2[d].semeai_attack_point = NO_MOVE;
+           update_status(str, ALIVE, ALIVE_IN_SEKI);
+         }
+       }
+
+       DEBUG(DEBUG_SEMEAI, "Move to prevent seki at %1m (%1m vs %1m)\n",
+             dragon2[d].semeai_attack_point, opponent, str);
+
+       dragon2[d].semeai_attack_certain = certain;
+       dragon2[d].semeai_attack_target = opponent;
+      }
+    }
+  }
+
+  /* Now look for dead strings inside a single eyespace of a living dragon.
+   *
+   * FIXME: Clearly this loop should share most of its code with the
+   *        one above. It would also be good to reimplement so that
+   *        moves invading a previously empty single eyespace to make
+   *        seki can be found.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (IS_STONE(board[str]) && is_worm_origin(str, str)
+       && !find_defense(str, NULL)
+       && dragon[str].status == DEAD
+       && DRAGON2(str).hostile_neighbors == 1) {
+      int k;
+      int color = board[str];
+      int opponent = NO_MOVE;
+      int certain;
+      struct eyevalue reduced_genus;
+
+      for (k = 0; k < DRAGON2(str).neighbors; k++) {
+       opponent = dragon2[DRAGON2(str).adjacent[k]].origin;
+       if (board[opponent] != color)
+         break;
+      }
+
+      ASSERT1(opponent != NO_MOVE, opponent);
+
+      if (dragon[opponent].status != ALIVE)
+       continue;
+
+      /* FIXME: These heuristics are used for optimization.  We don't
+       *        want to call expensive semeai code if the opponent
+       *        dragon has more than one eye elsewhere.  However, the
+       *        heuristics might still need improvement.
+       */
+      compute_dragon_genus(opponent, &reduced_genus, str);
+      if (DRAGON2(opponent).moyo_size > 10 || min_eyes(&reduced_genus) > 1)
+       continue;
+
+      owl_analyze_semeai(str, opponent, &resulta, &resultb,
+                        &defend_move, 1, &certain);
+
+      /* Do not trust uncertain results. In fact it should only take a
+       * few nodes to determine the semeai result, if it is a proper
+       * potential seki position.
+       */
+      if (resulta != 0 && certain) {
+       int d = dragon[str].id;
+       DEBUG(DEBUG_SEMEAI, "Move to make seki at %1m (%1m vs %1m)\n",
+             defend_move, str, opponent);
+       dragon2[d].semeais++;
+       update_status(str, CRITICAL, CRITICAL);
+       dragon2[d].semeai_defense_code = resulta;
+       dragon2[d].semeai_defense_point = defend_move;
+       dragon2[d].semeai_defense_certain = certain;
+       gg_assert(board[opponent] == OTHER_COLOR(board[dragon2[d].origin]));
+       dragon2[d].semeai_defense_target = opponent;
+
+       /* We need to determine a proper attack move (the one that
+        * prevents seki).  Currently we try the defense move first,
+        * and if it doesn't work -- all liberties of the string.
+        */
+       owl_analyze_semeai_after_move(defend_move, OTHER_COLOR(color),
+                                     str, opponent, &resulta, NULL,
+                                     NULL, 1, NULL, 0);
+       if (resulta != WIN) {
+         dragon2[d].semeai_attack_code = REVERSE_RESULT(resulta);
+         dragon2[d].semeai_attack_point = defend_move;
+       }
+       else {
+         int k;
+         int libs[MAXLIBS];
+         int liberties = findlib(str, MAXLIBS, libs);
+
+         for (k = 0; k < liberties; k++) {
+           owl_analyze_semeai_after_move(libs[k], OTHER_COLOR(color),
+                                         str, opponent, &resulta, NULL,
+                                         NULL, 1, NULL, 0);
+           if (resulta != WIN) {
+             dragon2[d].semeai_attack_code = REVERSE_RESULT(resulta);
+             dragon2[d].semeai_attack_point = libs[k];
+             break;
+           }
+         }
+
+         if (k == liberties) {
+           DEBUG(DEBUG_SEMEAI,
+                 "No move to attack in semeai (%1m vs %1m), seki assumed.\n",
+                 str, opponent);
+           dragon2[d].semeai_attack_code = 0;
+           dragon2[d].semeai_attack_point = NO_MOVE;
+           update_status(str, ALIVE, ALIVE_IN_SEKI);
+         }
+       }
+
+       DEBUG(DEBUG_SEMEAI, "Move to prevent seki at %1m (%1m vs %1m)\n",
+             dragon2[d].semeai_attack_point, opponent, str);
+
+       dragon2[d].semeai_attack_certain = certain;
+       dragon2[d].semeai_attack_target = opponent;
+      }
+    }
+  }
+}
+
+
+/* neighbor_of_dragon(pos, origin) returns true if the vertex at (pos) is a
+ * neighbor of the dragon with origin at (origin).
+ */
+static int 
+neighbor_of_dragon(int pos, int origin)
+{
+  int k;
+  if (pos == NO_MOVE)
+    return 0;
+
+  for (k = 0; k < 4; k++)
+    if (ON_BOARD(pos + delta[k]) && dragon[pos + delta[k]].origin == origin)
+      return 1;
+
+  return 0;
+}
+
+/* Check whether two dragons are directly adjacent or have at least
+ * one common liberty.
+ */
+static int
+close_enough_for_proper_semeai(int apos, int bpos)
+{
+  int pos;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == EMPTY
+       && neighbor_of_dragon(pos, apos)
+       && neighbor_of_dragon(pos, bpos))
+      return 1;
+    else if (IS_STONE(board[pos])) {
+      if (is_same_dragon(pos, apos) && neighbor_of_dragon(pos, bpos))
+       return 1;
+      if (is_same_dragon(pos, bpos) && neighbor_of_dragon(pos, apos))
+       return 1;
+    }
+  }
+  
+  return 0;
+}
+
+/* This function adds the semeai related move reasons, using the information
+ * stored in the dragon2 array.
+ *
+ * If the semeai had an uncertain result, and there is a owl move with
+ * certain result doing the same, we don't trust the semeai move.
+ */
+void
+semeai_move_reasons(int color)
+{
+  int other = OTHER_COLOR(color);
+  int d;
+  int liberties;
+  int libs[MAXLIBS];
+  int r;
+
+  for (d = 0; d < number_of_dragons; d++)
+    if (dragon2[d].semeais && DRAGON(d).status == CRITICAL) {
+      if (DRAGON(d).color == color
+          && dragon2[d].semeai_defense_point
+         && (dragon2[d].owl_defense_point == NO_MOVE
+             || dragon2[d].semeai_defense_certain >= 
+                dragon2[d].owl_defense_certain)) {
+       /* My dragon can be defended. */
+       add_semeai_move(dragon2[d].semeai_defense_point, dragon2[d].origin);
+       DEBUG(DEBUG_SEMEAI, "Adding semeai defense move for %1m at %1m\n",
+             DRAGON(d).origin, dragon2[d].semeai_defense_point);
+       if (neighbor_of_dragon(dragon2[d].semeai_defense_point,
+                              dragon2[d].semeai_defense_target)
+           && !neighbor_of_dragon(dragon2[d].semeai_defense_point,
+                                  dragon2[d].origin)
+           && !is_self_atari(dragon2[d].semeai_defense_point, color)) {
+         
+         /* If this is a move to fill the non-common liberties of the
+          * target, and is not a ko or snap-back, then we mark all
+          * non-common liberties of the target as potential semeai moves.
+          */
+
+          liberties = findlib(dragon2[d].semeai_defense_target, MAXLIBS, libs);
+
+          for (r = 0; r < liberties; r++) {
+            if (!neighbor_of_dragon(libs[r], dragon2[d].origin)
+               && !is_self_atari(libs[r], color)
+               && libs[r] != dragon2[d].semeai_defense_point)
+             add_potential_semeai_defense(libs[r], dragon2[d].origin,
+                                          dragon2[d].semeai_defense_target);
+         }
+       }
+      }
+      else if (DRAGON(d).color == other
+              && dragon2[d].semeai_attack_point
+              && (dragon2[d].owl_attack_point == NO_MOVE
+                  || dragon2[d].owl_defense_point == NO_MOVE
+                  || dragon2[d].semeai_attack_certain >= 
+                     dragon2[d].owl_attack_certain)) {
+       /* Your dragon can be attacked. */
+       add_semeai_move(dragon2[d].semeai_attack_point, dragon2[d].origin);
+       DEBUG(DEBUG_SEMEAI, "Adding semeai attack move for %1m at %1m\n",
+             DRAGON(d).origin, dragon2[d].semeai_attack_point);
+       if (neighbor_of_dragon(dragon2[d].semeai_attack_point,
+                              dragon2[d].origin)
+           && !neighbor_of_dragon(dragon2[d].semeai_attack_point,
+                                 dragon2[d].semeai_attack_target)
+           && !is_self_atari(dragon2[d].semeai_attack_point, color)) {
+
+          liberties = findlib(dragon2[d].origin, MAXLIBS, libs);
+
+          for (r = 0; r < liberties; r++) {
+            if (!neighbor_of_dragon(libs[r], dragon2[d].semeai_attack_target)
+               && !is_self_atari(libs[r], color)
+               && libs[r] != dragon2[d].semeai_attack_point)
+             add_potential_semeai_attack(libs[r], dragon2[d].origin,
+                                         dragon2[d].semeai_attack_target);
+         }
+       }
+      }
+    }
+}
+
+
+/* Change the status and safety of a dragon.  In addition, if the new
+ * status is not DEAD, make all worms of the dragon essential, so that
+ * results found by semeai code don't get ignored.
+ */
+static void
+update_status(int dr, enum dragon_status new_status,
+             enum dragon_status new_safety)
+{
+  int pos;
+
+  if (dragon[dr].status != new_status
+      && (dragon[dr].status != CRITICAL || new_status != DEAD)) {
+    DEBUG(DEBUG_SEMEAI, "Changing status of %1m from %s to %s.\n", dr,
+         status_to_string(dragon[dr].status),
+         status_to_string(new_status));
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (IS_STONE(board[pos]) && is_same_dragon(dr, pos)) {
+       dragon[pos].status = new_status;
+       if (new_status != DEAD)
+         worm[pos].inessential = 0;
+      }
+  }
+
+  if (DRAGON2(dr).safety != new_safety
+      && (DRAGON2(dr).safety != CRITICAL || new_safety != DEAD)) {
+    DEBUG(DEBUG_SEMEAI, "Changing safety of %1m from %s to %s.\n", dr,
+         status_to_string(DRAGON2(dr).safety), status_to_string(new_safety));
+    DRAGON2(dr).safety = new_safety;
+  }
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/sgfdecide.c b/engine/sgfdecide.c
new file mode 100644 (file)
index 0000000..8550c0f
--- /dev/null
@@ -0,0 +1,675 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* ================================================================ */
+/*      Show status for a string, a dragon, etc in an SGF file.     */
+/* ================================================================ */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "sgftree.h"
+
+
+/* 
+ * decide_string tries to attack and defend the string at (pos),
+ * and then writes the number of variations considered in the attack
+ * and defence to the sgf file.
+ */
+
+void
+decide_string(int pos)
+{
+  int aa, dd;
+  int acode, dcode;
+  SGFTree tree;
+  
+  if (board[pos] == EMPTY) {
+    fprintf(stderr, "gnugo: --decide-string called on an empty vertex\n");
+    return;
+  }
+
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  count_variations = 1;
+  acode = attack(pos, &aa);
+  if (acode) {
+    if (acode == WIN)
+      gprintf("%1m can be attacked at %1m (%d variations)\n", 
+             pos, aa, count_variations);
+    else if (acode == KO_A)
+       gprintf("%1m can be attacked with ko (good) at %1m (%d variations)\n", 
+             pos, aa, count_variations);
+    else if (acode == KO_B)
+       gprintf("%1m can be attacked with ko (bad) at %1m (%d variations)\n", 
+               pos, aa, count_variations);
+
+    if (debug & DEBUG_READING_PERFORMANCE) {
+      gprintf("Reading shadow: \n");
+      draw_reading_shadow();
+    }
+
+    count_variations = 1;
+    dcode = find_defense(pos, &dd);
+    if (dcode) {
+      if (dcode == WIN)
+       gprintf("%1m can be defended at %1m (%d variations)\n", 
+               pos, dd, count_variations);
+      else if (dcode == KO_A)
+       gprintf("%1m can be defended with ko (good) at %1m (%d variations)\n", 
+               pos, dd, count_variations);
+      else if (dcode == KO_B)
+       gprintf("%1m can be defended with ko (bad) at %1m (%d variations)\n", 
+               pos, dd, count_variations);
+    }
+    else
+      gprintf("%1m cannot be defended (%d variations)\n", 
+             pos, count_variations);
+    if (debug & DEBUG_READING_PERFORMANCE) {
+      gprintf("Reading shadow: \n");
+      draw_reading_shadow();
+    }
+
+  }
+  else {
+    gprintf("%1m cannot be attacked (%d variations)\n", 
+           pos, count_variations);
+    if (debug & DEBUG_READING_PERFORMANCE) {
+      gprintf("Reading shadow: \n");
+      draw_reading_shadow();
+    }
+  }
+
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+/* 
+ * decide_connection tries to connect and disconnect the strings at
+ * (apos) and (bpos), and then writes the number of variations
+ * considered in the attack and defence to the sgf file.
+ */
+
+void
+decide_connection(int apos, int bpos)
+{
+  int move;
+  int result;
+  SGFTree tree;
+
+  ASSERT_ON_BOARD1(apos);
+  ASSERT_ON_BOARD1(bpos);
+  
+  if (board[apos] == EMPTY || board[bpos] == EMPTY) {
+    fprintf(stderr, "gnugo: --decide-connection called on an empty vertex\n");
+    return;
+  }
+
+  if (board[apos] != board[bpos]) {
+    fprintf(stderr, "gnugo: --decide-connection called for strings of different colors\n");
+    return;
+  }
+
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  count_variations = 1;
+  result = string_connect(apos, bpos, &move);
+  if (result == WIN) {
+    if (move == NO_MOVE)
+      gprintf("%1m and %1m are connected as it stands (%d variations)\n", 
+             apos, bpos, count_variations);
+    else
+       gprintf("%1m and %1m can be connected at %1m (%d variations)\n", 
+               apos, bpos, move, count_variations);
+  }
+  else if (result == KO_A)
+    gprintf("%1m and %1m can be connected with ko (good) at %1m (%d variations)\n", 
+           apos, bpos, move, count_variations);
+  else if (result == KO_B)
+    gprintf("%1m and %1m can be connected with ko (bad) at %1m (%d variations)\n", 
+           apos, bpos, move, count_variations);
+  else
+    gprintf("%1m and %1m cannot be connected (%d variations)\n", 
+           apos, bpos, count_variations);
+  
+  count_variations = 1;
+  result = disconnect(apos, bpos, &move);
+  if (result == WIN) {
+    if (move == NO_MOVE)
+      gprintf("%1m and %1m are disconnected as it stands (%d variations)\n", 
+             apos, bpos, count_variations);
+    else
+       gprintf("%1m and %1m can be disconnected at %1m (%d variations)\n", 
+               apos, bpos, move, count_variations);
+  }
+  else if (result == KO_A)
+    gprintf("%1m and %1m can be disconnected with ko (good) at %1m (%d variations)\n", 
+           apos, bpos, move, count_variations);
+  else if (result == KO_B)
+    gprintf("%1m and %1m can be disconnected with ko (bad) at %1m (%d variations)\n", 
+           apos, bpos, move, count_variations);
+  else
+    gprintf("%1m and %1m cannot be disconnected (%d variations)\n", 
+           apos, bpos, count_variations);
+  
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+/* 
+ * decide_owl (formerly called decide_dragon) tries to attack and defend 
+ * the dragon at (pos), and then writes the number of variations considered 
+ * in the attack and defence to the sgf file.
+ */
+
+void
+decide_owl(int pos)
+{
+  int move = NO_MOVE;
+  int acode, dcode;
+  SGFTree tree;
+  int result_certain;
+  int kworm;
+
+  if (board[pos] == EMPTY) {
+    fprintf(stderr, "gnugo: --decide-dragon called on an empty vertex\n");
+    return;
+  }
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  gprintf("finished examine_position\n");
+
+  /* We want to see the reading performed, not just a result picked
+   * from the cache. Thus we clear the cache here.
+   */
+  reading_cache_clear();
+  
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  count_variations = 1;
+  acode = owl_attack(pos, &move, &result_certain, &kworm);
+  if (acode) {
+    if (acode == WIN) {
+      if (move == NO_MOVE)
+       gprintf("%1m is dead as it stands", pos);
+      else
+       gprintf("%1m can be attacked at %1m (%d variations)", 
+               pos, move, count_variations);
+    }
+    else if (acode == KO_A)
+      gprintf("%1m can be attacked with ko (good) at %1m (%d variations)", 
+             pos, move, count_variations);
+    else if (acode == KO_B)
+      gprintf("%1m can be attacked with ko (bad) at %1m (%d variations)", 
+             pos, move, count_variations);
+    else if (acode == GAIN)
+      gprintf("%1m can be attacked with gain (captures %1m) at %1m (%d variations)", 
+             pos, kworm, move, count_variations);
+  }
+  else 
+    gprintf("%1m cannot be attacked (%d variations)", pos, count_variations);
+  
+  if (result_certain)
+    gprintf("\n");
+  else
+    gprintf(" result uncertain\n");
+
+  reading_cache_clear();
+  count_variations = 1;
+  dcode = owl_defend(pos, &move, &result_certain, &kworm);
+
+  if (dcode) {
+    if (dcode == WIN) {
+      if (move == NO_MOVE)
+       gprintf("%1m is alive as it stands", pos);
+      else 
+       gprintf("%1m can be defended at %1m (%d variations)", 
+               pos, move, count_variations);
+    }
+    else if (dcode == KO_A)
+      gprintf("%1m can be defended with ko (good) at %1m (%d variations)", 
+             pos, move, count_variations);
+    else if (dcode == KO_B)
+      gprintf("%1m can be defended with ko (bad) at %1m (%d variations)", 
+             pos, move, count_variations);
+    else if (dcode == LOSS)
+      gprintf("%1m can be defended with loss (loses %1m) at %1m (%d variations)", 
+             pos, kworm, move, count_variations);
+  }
+  else
+    gprintf("%1m cannot be defended (%d variations)",
+           pos, count_variations);
+
+  if (result_certain)
+    gprintf("\n");
+  else
+    gprintf(" result uncertain\n");
+  
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+/* 
+ * decide_dragon_data prints the dragon data at (pos).
+ */
+
+void
+decide_dragon_data(int pos)
+{
+  if (board[pos] == EMPTY) {
+    fprintf(stderr, "gnugo: --decide-dragon-data called on an empty vertex\n");
+    return;
+  }
+  reset_engine();
+  silent_examine_position(FULL_EXAMINE_DRAGONS);
+
+  gprintf("Dragon at %1m:\n", pos);
+  report_dragon(stderr, pos);
+}
+
+
+/* Print the result of the semeai code on the semeai at apos/bpos,
+ * optionally writing an sgf file.
+ */
+
+void
+decide_semeai(int apos, int bpos)
+{
+  SGFTree tree;
+  int resulta, resultb, move, result_certain;
+  int color = board[apos];
+
+  if (color == EMPTY || board[bpos] != OTHER_COLOR(color)) {
+    gprintf("gnugo: --decide-semeai called on invalid data\n");
+    return;
+  }
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  gprintf("finished examine_position\n");
+  count_variations = 1;
+
+  /* We want to see the reading performed, not just a result picked
+   * from the cache. Thus we clear the cache here. */
+  reading_cache_clear();
+  
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  gprintf("Analyzing semeai between %1m and %1m, %C moves first\n",
+         apos, bpos, board[apos]);
+  owl_analyze_semeai(apos, bpos, &resulta, &resultb, &move, 1,
+                    &result_certain);
+  gprintf("Semeai defense of %1m: result %s %1m\n",
+         apos, result_to_string(resulta), move);
+  gprintf("Semeai attack of %1m: result %s %1m\n",
+         bpos, result_to_string(resultb), move);
+  gprintf("%d nodes%s\n\n", count_variations,
+         result_certain ? "" : ", uncertain result");
+  
+  gprintf("Analyzing semeai between %1m and %1m, %C moves first\n",
+         bpos, apos, board[bpos]);
+  owl_analyze_semeai(bpos, apos, &resultb, &resulta, &move, 1,
+                    &result_certain);
+  gprintf("Semeai defense of %1m: result %s %1m\n",
+         bpos, result_to_string(resultb), move);
+  gprintf("Semeai attack of %1m: result %s %1m\n",
+         apos, result_to_string(resulta), move);
+  gprintf("%d nodes%s\n", count_variations,
+         result_certain ? "" : ", uncertain result");
+
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+void
+decide_tactical_semeai(int apos, int bpos)
+{
+  SGFTree tree;
+  int resulta, resultb, move, dummy;
+  int color = board[apos];
+
+  if (color == EMPTY || board[bpos] != OTHER_COLOR(color)) {
+    gprintf("gnugo: --decide-semeai called on invalid data\n");
+    return;
+  }
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  gprintf("finished examine_position\n");
+  count_variations = 1;
+
+  /* We want to see the reading performed, not just a result picked
+   * from the cache. Thus we clear the cache here. */
+  reading_cache_clear();
+  
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  /* FIXME: Calling status_to_string() with a result code as argument
+   * doesn't make sense. It could be changed to result_to_string() but
+   * the overall formatting needs change as well.
+   */
+  owl_analyze_semeai(apos, bpos, &resulta, &resultb, &move, 0, &dummy);
+  gprintf("After %s at %1m, %1m is %s, %1m is %s (%d nodes)\n",
+         color_to_string(color),
+         move,
+         apos, status_to_string(resulta),
+         bpos, status_to_string(resultb),
+         count_variations);
+  owl_analyze_semeai(bpos, apos, &resultb, &resulta, &move, 0, &dummy);
+  gprintf("After %s at %1m, %1m is %s, %1m is %s (%d nodes)\n",
+         color_to_string(color),
+         move,
+         apos, status_to_string(resulta),
+         bpos, status_to_string(resultb),
+         count_variations);
+
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+/* 
+ * decide_position tries to attack and defend every dragon with
+ * dragon.escape<6 and writes the variations to an sgf file.
+ */
+
+void
+decide_position()
+{
+  int pos;
+  int move = NO_MOVE;
+  int acode = 0, dcode = 0;
+  int kworm;
+  static const char *snames[] = {"dead", "alive", "critical", "unknown"};
+  SGFTree tree;
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+
+  /* We want to see the reading performed, not just a result picked
+   * from the cache. Thus we clear the cache here. */
+  reading_cache_clear();
+
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  count_variations = 1;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos)
+       || dragon[pos].origin != pos
+       || board[pos] == EMPTY
+       || DRAGON2(pos).escape_route >= 6)
+      continue;
+
+    gprintf("\nanalyzing %1m\n", pos);
+    gprintf("status=%s, escape=%d\n", 
+           snames[dragon[pos].crude_status], DRAGON2(pos).escape_route);
+    acode = owl_attack(pos, &move, NULL, &kworm);
+    if (acode) {
+      if (acode == WIN) {
+       if (move == NO_MOVE)
+         gprintf("%1m is dead as it stands\n", pos);
+       else
+         gprintf("%1m can be attacked at %1m (%d variations)\n", 
+                 pos, move, count_variations);
+      }
+      else if (acode == KO_A)
+       gprintf("%1m can be attacked with ko (good) at %1m (%d variations)\n", 
+               pos, move, count_variations);
+      else if (acode == KO_B)
+       gprintf("%1m can be attacked with ko (bad) at %1m (%d variations)\n", 
+               pos, move, count_variations);
+      else if (acode == GAIN)
+       gprintf("%1m can be attacked with gain (captures %1m) at %1m (%d variations)", 
+               pos, kworm, move, count_variations);
+      
+      count_variations = 1;
+      dcode = owl_defend(pos, &move, NULL, &kworm);
+      if (dcode) {
+       if (dcode == WIN) {
+         if (move == NO_MOVE)
+           gprintf("%1m is alive as it stands\n", pos);
+         else 
+           gprintf("%1m can be defended at %1m (%d variations)\n", 
+                   pos, move, count_variations);
+       }
+       else if (dcode == KO_A)
+         gprintf("%1m can be defended with ko (good) at %1m (%d variations)\n", 
+                 pos, move, count_variations);
+       else if (dcode == KO_B)
+         gprintf("%1m can be defended with ko (bad) at %1m (%d variations)\n",
+                 pos, move, count_variations);
+       else if (dcode == LOSS)
+         gprintf("%1m can be defended with loss (loses %1m) at %1m (%d variations)", 
+                 pos, kworm, move, count_variations);
+      }
+      else
+       gprintf("%1m cannot be defended (%d variations)\n", 
+               pos, count_variations);
+    }
+    else 
+      gprintf("%1m cannot be attacked (%d variations)\n", 
+             pos, count_variations);
+    
+    if (acode) {
+      if (dcode)
+       gprintf("status of %1m revised to CRITICAL\n", pos);
+      else
+       gprintf("status of %1m revised to DEAD\n", pos);
+    }
+    else
+      gprintf("status of %1m revised to ALIVE\n", pos);
+  }
+  
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+/*
+ * Evaluates the eyespace at (pos) and prints a report. You can get
+ * more information by adding -d0x02 to the command line.
+ */
+
+void
+decide_eye(int pos)
+{
+  int color;
+  struct eyevalue value;
+  int attack_point;
+  int defense_point;
+  int eyepos;
+  SGFTree tree;
+
+  reset_engine();
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  color = black_eye[pos].color;
+  if (!IS_STONE(color)) {
+    gprintf("The eye at %1m is not of a single color.\n", pos);
+    return;
+  }
+
+  if (printboard)
+    showboard(0);
+
+  /* Enable sgf output. */
+  if (*outfilename)
+    sgffile_begindump(&tree);
+  count_variations = 1;
+  
+  if (black_eye[pos].color == BLACK) {
+    eyepos = black_eye[pos].origin;
+    compute_eyes(eyepos, &value, &attack_point, &defense_point,
+                black_eye, half_eye, 0);
+    gprintf("Black eyespace at %1m: %s\n", eyepos, eyevalue_to_string(&value));
+    if (eye_move_urgency(&value) > 0) {
+      gprintf("  vital points: %1m (attack) %1m (defense)\n", attack_point,
+             defense_point);
+    }
+  }
+  
+  if (white_eye[pos].color == WHITE) {
+    eyepos = white_eye[pos].origin;
+    compute_eyes(eyepos, &value, &attack_point, &defense_point,
+                white_eye, half_eye, 0);
+    gprintf("White eyespace at %1m: %s\n", eyepos, eyevalue_to_string(&value));
+    if (eye_move_urgency(&value) > 0) {
+      gprintf("  vital points: %1m (attack) %1m (defense)\n", attack_point,
+             defense_point);
+    }
+  }
+  
+  /* Finish sgf output. */
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+/* 
+ * decide_combination tries to find a combination attack for (color) by
+ * calling atari_atari().
+ */
+
+void
+decide_combination(int color)
+{
+  int attack_move;
+  signed char defense_moves[BOARDMAX];
+  SGFTree tree;
+  int first = 1;
+  int pos;
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  silent_examine_position(EXAMINE_ALL);
+
+  if (*outfilename)
+    sgffile_begindump(&tree);
+  count_variations = 1;
+
+  if (atari_atari(color, &attack_move, defense_moves, verbose)) {
+    gprintf("Combination attack for %C at %1m, defense at ", color,
+           attack_move);
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (ON_BOARD(pos) && defense_moves[pos]) {
+       if (first)
+         first = 0;
+       else
+         gprintf(", ");
+       gprintf("%1m", pos);
+      }
+    }
+    gprintf("\n");
+  }
+  else
+    gprintf("No Combination attack for %C\n", color);
+  
+  sgffile_enddump(outfilename);
+  count_variations = 0;
+}
+
+
+void
+decide_surrounded(int pos)
+{
+  int surround_status;
+
+  if (board[pos] == EMPTY) {
+    fprintf(stderr, "location must not be empty!\n");
+    return;
+  }
+
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+
+  silent_examine_position(EXAMINE_ALL);
+  surround_status = compute_surroundings(pos, NO_MOVE, 1, NULL);
+  if (surround_status == 1)
+    gprintf("the dragon at %1m is SURROUNDED!\n", pos);
+  else if (surround_status == 2)
+    gprintf("the dragon at %1m is WEAKLY SURROUNDED!\n", pos);
+  else
+    gprintf("the dragon at %1m is not surrounded.\n", pos);
+}  
+
+
+#if ORACLE
+
+void
+decide_oracle(Gameinfo *gameinfo, char *infilename, char *untilstring)
+{
+  SGFTree tree;
+
+  reset_engine();
+  if (*outfilename)
+    sgffile_begindump(&tree);
+
+  count_variations = 1;
+  summon_oracle();
+  oracle_loadsgf(infilename, untilstring);
+  consult_oracle(gameinfo->to_move);
+  sgffile_enddump(outfilename);
+  dismiss_oracle();
+  count_variations = 0;
+}
+
+#endif
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
+
diff --git a/engine/sgffile.c b/engine/sgffile.c
new file mode 100644 (file)
index 0000000..8f43cd5
--- /dev/null
@@ -0,0 +1,249 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * sgffile.c
+ *
+ * This file used to contain functions that create an SGF file on the fly.
+ *
+ * Today it contains supporting code around the more general SGF library
+ * found in the sgf/ directory.
+ */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+/*
+ * Add debug information to a node if user requested it from command
+ * line.
+ */
+
+void
+sgffile_add_debuginfo(SGFNode *node, float value)
+{
+  int pos;
+  char comment[24];
+
+  if (!outfilename[0])
+    return;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    
+    if (IS_STONE(board[pos]) && (output_flags & OUTPUT_MARKDRAGONS)) {
+      if (dragon[pos].crude_status == DEAD)
+       sgfLabel(node, "X", I(pos), J(pos));
+      else if (dragon[pos].crude_status == CRITICAL)
+       sgfLabel(node, "!", I(pos), J(pos));
+    }
+       
+    if (potential_moves[pos] > 0.0 && (output_flags & OUTPUT_MOVEVALUES)) {
+      if (potential_moves[pos] < 1.0)
+       sgfLabel(node, "<1", I(pos), J(pos));
+      else
+       sgfLabelInt(node, (int) potential_moves[pos], I(pos), J(pos));
+    }
+  }
+  
+  if (value > 0.0 && (output_flags & OUTPUT_MOVEVALUES)) {
+    sprintf(comment, "Value of move: %.2f", value);
+    sgfAddComment(node, comment);
+  }
+}
+
+
+/*
+ * Write sgf tree to output file specified with -o option.
+ * This can safely be done multiple times.
+ */
+
+void
+sgffile_output(SGFTree *tree)
+{
+  if (outfilename[0])
+    writesgf(tree->root, outfilename);
+}
+
+
+/* ================================================================ 
+ * Dumping of information about a position into an sgftree.
+ * Used by sgffile_decideposition, etc.
+ * ================================================================ */
+
+
+/*
+ * sgffile_begindump begins storing all moves considered by
+ * trymove and tryko in an sgf tree in memory.
+ *
+ * The caller only has to provide an own SGFTree pointer if he wants
+ * to do something more with the tree than writing it to file as done
+ * by sgffile_enddump().
+ */
+
+void
+sgffile_begindump(SGFTree *tree)
+{
+  static SGFTree local_tree;
+  gg_assert(sgf_dumptree == NULL);
+
+  if (tree == NULL)
+    sgf_dumptree = &local_tree;
+  else 
+    sgf_dumptree = tree;
+  
+  sgftree_clear(sgf_dumptree);
+  sgftreeCreateHeaderNode(sgf_dumptree, board_size, komi, handicap);
+  sgffile_printboard(sgf_dumptree);
+}
+
+
+/*
+ * sgffile_enddump ends the dump and writes the sgf tree to file.
+ */
+
+void 
+sgffile_enddump(const char *filename)
+{
+  /* Check if we have a valid filename and a tree. */
+  if (filename && *filename && sgf_dumptree) {
+    if (writesgf(sgf_dumptree->root, filename)) {
+      /* Only delete the tree if writesgf() succeeds. If it doesn't, one
+       * will most likely wish to save into another (writable) file.
+       */
+      sgfFreeNode(sgf_dumptree->root);
+      sgf_dumptree = NULL;
+    }
+  }
+}
+
+
+/*
+ * sgffile_printsgf creates an sgf of the current board position
+ * (without any move history). It also adds information about who is
+ * to play and marks illegal moves with the private sgf property IL.
+ */
+
+void
+sgffile_printsgf(int color_to_play, const char *filename)
+{
+  SGFTree sgftree;
+  int m, n;
+  char pos[3];
+  char str[128];
+  float relative_komi;
+
+  relative_komi = komi + black_captured - white_captured;
+  
+  sgftree_clear(&sgftree);
+  sgftreeCreateHeaderNode(&sgftree, board_size, relative_komi, handicap);
+  sgf_write_header(sgftree.root, 1, get_random_seed(), relative_komi,
+                  handicap, get_level(), chinese_rules);
+  gg_snprintf(str, 128, "GNU Go %s load and print", gg_version());
+  sgfOverwriteProperty(sgftree.root, "GN", str);
+  
+  sgffile_printboard(&sgftree);
+  
+  if (color_to_play != EMPTY) {
+    sgfAddProperty(sgftree.lastnode, "PL",
+                  (color_to_play == WHITE ? "W" : "B"));
+
+    for (m = 0; m < board_size; ++m)
+      for (n = 0; n < board_size; ++n)
+        if (BOARD(m, n) == EMPTY && !is_legal(POS(m, n), color_to_play)) {
+         gg_snprintf(pos, 3, "%c%c", 'a' + n, 'a' + m);
+         sgfAddProperty(sgftree.lastnode, "IL", pos);
+       }
+  }
+  
+  writesgf(sgftree.root, filename);
+}
+
+
+/*
+ * sgffile_printboard adds the current board position to the tree.
+ */
+
+void
+sgffile_printboard(SGFTree *tree)
+{
+  int i, j;
+  SGFNode *node;
+  
+  gg_assert(tree);
+  node = tree->lastnode;
+  
+  /* Write the white stones to the file. */
+  for (i = 0; i < board_size; i++) {
+    for (j = 0; j < board_size; j++) {
+      if (BOARD(i, j) == WHITE)
+       sgfAddStone(node, WHITE, i, j);
+    }
+  }
+
+  /* Write the black stones to the file. */
+  for (i = 0; i < board_size; i++) {
+    for (j = 0; j < board_size; j++) {
+      if (BOARD(i, j) == BLACK)
+       sgfAddStone(node, BLACK, i, j);
+    }
+  }
+
+  sgftreeSetLastNode(tree, node);
+}
+
+
+void
+sgffile_recordboard(SGFNode *node)
+{
+  int i, j;
+
+  if (node)
+    for (i = 0; i < board_size; i++)
+      for (j = 0; j < board_size; j++)
+        if (BOARD(i, j) == BLACK)
+          sgfAddStone(node, BLACK, i, j);
+}
+
+
+int
+get_sgfmove(SGFProperty *property)
+{
+  return POS(get_moveX(property, board_size), get_moveY(property, board_size));
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/shapes.c b/engine/shapes.c
new file mode 100644 (file)
index 0000000..63720ba
--- /dev/null
@@ -0,0 +1,656 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "liberty.h"
+#include "patterns.h"
+
+/* Maximum number of dragons considered by a, B, C, and d class patterns. */
+#define MAX_DRAGONS_PER_PATTERN 5
+#define MAX_STRINGS_PER_PATTERN 5
+
+/* Values of joseki patterns. */
+#define U_VALUE 40.0
+#define J_VALUE 35.0
+#define j_VALUE 24.0
+#define t_VALUE 16.0
+
+
+/* Take care of joseki patterns. */
+static void
+handle_joseki_patterns(struct pattern_attribute *attributes,
+                      unsigned int class, int move,
+                      int my_dragons[MAX_DRAGONS_PER_PATTERN],
+                      int my_ndragons,
+                      int your_dragons[MAX_DRAGONS_PER_PATTERN],
+                      int your_ndragons)
+{
+  struct pattern_attribute *attribute;
+
+  /* Pattern class J, joseki standard move. Add expand territory and
+   * moyo, and require the value at least J_value.
+   */
+  if (class & CLASS_J) {
+    TRACE("...joseki standard move\n");
+    add_expand_territory_move(move);
+    TRACE("...expands territory\n");
+    add_expand_moyo_move(move);
+    TRACE("...expands moyo\n");
+    set_minimum_move_value(move, J_VALUE);
+    TRACE("... minimum move value %f\n", J_VALUE);
+  }
+
+  /* Class `j' and `t' patterns are treated similarly. */
+  if (class & (CLASS_j | CLASS_t)) {
+    float min_value;
+    float shape_value = 0.0;
+
+    if (class & CLASS_j) {
+      min_value = j_VALUE;
+      TRACE("...less urgent joseki move\n");
+      add_expand_territory_move(move);
+      TRACE("...expands territory\n");
+      add_expand_moyo_move(move);
+      TRACE("...expands moyo\n");
+    }
+    else {
+      min_value = t_VALUE;
+      TRACE("...minor joseki move\n");
+    }
+
+    /* Board size modification. */
+    min_value *= board_size / 19.0;
+
+    for (attribute = attributes; attribute->type != LAST_ATTRIBUTE;
+        attribute++) {
+      if (attribute->type == SHAPE) {
+       shape_value = attribute->value;
+       min_value *= (1 + 0.01 * shape_value);
+       break;
+      }
+    }
+
+    if ((board_size >= 17) && (class & CLASS_F)) {
+      /* Otherwise, `j' and `t' patterns not of CLASS_F would get
+       * preferred in value_move_reasons().
+       */
+      min_value *= 1.005;
+
+      set_maximum_move_value(move, min_value);
+      scale_randomness(move, 5.0);
+      TRACE("...move value %f (shape %f)\n", min_value, shape_value);
+    }
+    else
+      TRACE("...minimum move value %f (shape %f)\n", min_value, shape_value);
+
+    set_minimum_move_value(move, min_value);
+  }
+
+  /* Pattern class U, very urgent joseki move. Add strategical defense
+   * and attack, plus a shape bonus of 15 and a minimum value of 40.
+   */
+  if (class & CLASS_U) {
+    int k;
+
+    TRACE("...joseki urgent move\n");
+    for (k = 0; k < my_ndragons; k++) {
+      add_strategical_defense_move(move, my_dragons[k]);
+      TRACE("...strategical defense of %1m\n", my_dragons[k]);
+    }
+    for (k = 0; k < your_ndragons; k++) {
+      add_strategical_attack_move(move, your_dragons[k]);
+      TRACE("...strategical attack on %1m\n", your_dragons[k]);
+    }
+    add_shape_value(move, 15);
+    TRACE("...shape value 15\n");
+    set_minimum_move_value(move, U_VALUE);
+    TRACE("...(min) move value %f\n", U_VALUE);
+  }
+
+  /* Pattern class T, joseki trick move. For the moment we never play
+   * these.
+   */
+  if (class & CLASS_T) {
+    TRACE("...joseki trick move\n");
+    add_antisuji_move(move);
+    TRACE("...antisuji\n");
+  }
+
+  for (attribute = attributes; attribute->type != LAST_ATTRIBUTE;
+       attribute++) {
+    switch (attribute->type) {
+    case MIN_VALUE:
+      set_minimum_move_value(move, attribute->value);
+      TRACE("...(min) move value %f\n", attribute->value);
+      break;
+
+    case MAX_VALUE:
+      set_maximum_move_value(move, attribute->value);
+      TRACE("...max move value %f\n", attribute->value);
+      break;
+
+    case MIN_TERRITORY:
+      set_minimum_territorial_value(move, attribute->value);
+      TRACE("...(min) territorial value %f\n", attribute->value);
+      break;
+
+    case MAX_TERRITORY:
+      set_maximum_territorial_value(move, attribute->value);
+      TRACE("...max territorial value %f\n", attribute->value);
+      break;
+
+    case SHAPE:
+      /* For class `j' and `t' patterns shape value has been counted
+       * already.
+       */
+      if (!(class & (CLASS_j | CLASS_t))) {
+       add_shape_value(move, attribute->value);
+       TRACE("...shape value %f\n", attribute->value);
+      }
+
+      break;
+
+    case FOLLOWUP:
+      add_followup_value(move, attribute->value);
+      TRACE("...followup value %f\n", attribute->value);
+      break;
+
+    case REVERSE_FOLLOWUP:
+      add_reverse_followup_value(move, attribute->value);
+      TRACE("...reverse followup value %f\n", attribute->value);
+      break;
+
+    default:
+      /* Must not happen. */
+      gg_assert(0);
+    }
+  }
+}
+
+
+/* 
+ * This callback is invoked for each matched pattern.
+ */
+static void
+shapes_callback(int anchor, int color, struct pattern *pattern, int ll,
+               void *data)
+{
+  int other = OTHER_COLOR(color);
+  
+  int k, l;
+  int move;
+  /* For restricted search, the pattern must intersect the search area */
+  
+  /* Dragons of our color. */
+  int my_dragons[MAX_DRAGONS_PER_PATTERN];
+  int my_ndragons = 0;
+  
+  /* Dragons of other color. */
+  int your_dragons[MAX_DRAGONS_PER_PATTERN];
+  int your_ndragons = 0;
+
+  /* Strings of our color. */
+  int my_strings[MAX_STRINGS_PER_PATTERN];
+  int my_nstrings = 0;
+  
+  /* Strings of other color. */
+  int your_strings[MAX_STRINGS_PER_PATTERN];
+  int your_nstrings = 0;
+
+  /* Make a local copy of the classification that we may modify. */
+  unsigned int class = pattern->class;
+
+  /* Don't accept fuseki marked patterns while scoring. */
+  if (doing_scoring && (class & CLASS_F))
+    return;
+
+  /* Don't need auxiliary data in this callback. */
+  UNUSED(data);
+
+  /* Pick up the location of the move */
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+
+  /* For some classes of patterns we need to find all dragons present
+   * in the pattern.
+   */
+  if ((class & (CLASS_B | CLASS_C | CLASS_c | CLASS_a | CLASS_d | CLASS_O
+               | CLASS_J | CLASS_j | CLASS_U | CLASS_T | CLASS_t)) != 0) {
+    /* Match each point. */
+    for (k = 0; k < pattern->patlen; ++k) {
+      int pos; /* absolute (board) co-ord of (transformed) pattern element */
+      int origin; /* dragon origin */
+      
+      /* all the following stuff (currently) applies only at occupied cells */
+      if (pattern->patn[k].att == ATT_dot)
+       continue;
+      
+      /* transform pattern real coordinate */
+      pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+      
+      /* Already, matchpat rejects O patterns containing a friendly stone with
+       * DEAD or CRITICAL matcher_status. If the stone is tactically
+       * CRITICAL it still could have matcher_status ALIVE since it might
+       * be amalgamated into a live dragon. In this case we want to reject the
+       * pattern if (move) does not rescue it. This is most easily tested
+       * here within shapes_callback(), since the value of (move) is not
+       * known by matchpat().
+       */
+      if ((class & CLASS_O)
+         && board[pos] == color
+         && worm[pos].attack_points[0] != 0
+         && !does_defend(move, pos))
+       return;
+
+      origin = dragon[pos].origin;
+      if (board[pos] == color && my_ndragons < MAX_DRAGONS_PER_PATTERN) {
+       for (l = 0; l < my_ndragons; l++) {
+         if (my_dragons[l] == origin)
+           break;
+       }
+       if (l == my_ndragons) {
+         /* We found another dragon of our color. Check that it (or
+           * rather the underlying worm) cannot be tactically
+           * captured before adding it to the list of my_dragons.  
+          */
+         if (worm[pos].attack_codes[0] == 0
+             || does_defend(move, pos)) {
+           /* Ok, add the dragon to the list. */
+           my_dragons[l] = origin;
+           my_ndragons++;
+         }
+       }
+      }
+
+      if (board[pos] == other && your_ndragons < MAX_DRAGONS_PER_PATTERN) {
+       for (l = 0; l < your_ndragons; l++) {
+         if (your_dragons[l] == origin)
+           break;
+       }
+       if (l == your_ndragons) {
+         /* We found another opponent dragon, add it to the list. */
+         your_dragons[l] = origin;
+         your_ndragons++;
+       }
+      }
+      
+      if (pattern->patn[k].att == ATT_O || pattern->patn[k].att == ATT_X) {
+       origin = find_origin(pos);
+       if (board[pos] == color && my_nstrings < MAX_STRINGS_PER_PATTERN) {
+         for (l = 0; l < my_nstrings; l++) {
+           if (my_strings[l] == origin)
+             break;
+         }
+         if (l == my_nstrings) {
+           /* We found another string of our color. Check that it
+            * cannot be tactically captured before adding it to the
+            * list of my_strings.
+            */
+           if (worm[pos].attack_codes[0] == 0
+               || does_defend(move, pos)) {
+             /* Ok, add the string to the list. */
+             my_strings[l] = origin;
+             my_nstrings++;
+           }
+         }
+       }
+       
+       if (board[pos] == other && your_nstrings < MAX_STRINGS_PER_PATTERN) {
+         for (l = 0; l < your_nstrings; l++) {
+           if (your_strings[l] == origin)
+             break;
+         }
+         if (l == your_nstrings) {
+           /* We found another opponent string, add it to the list. */
+           your_strings[l] = origin;
+           your_nstrings++;
+         }
+       }
+      }
+    } /* loop over elements */
+  } /* if we need to loop over the elements */
+
+  /* Nothing to connect. Remove C class bit. */
+  if (my_nstrings < 2)
+    class &= ~CLASS_C;
+
+  /* Nothing to cut. Remove B class bit. */
+  if (your_nstrings < 2)
+    class &= ~CLASS_B;
+  
+  /*
+   * If this pattern can't produce any effect (e.g. if it was a B or C
+   * pattern with only one dragon of the appropriate color), don't
+   * do any expensive checking but return immediately.
+   * If it only has some move_values, these will be ignored.
+   */
+  if (!pattern->helper
+      && !allpats
+      && !(pattern->autohelper_flag & HAVE_ACTION)
+      && !(class & CLASS_MOVE_REASONS)
+      && pattern->attributes->type == LAST_ATTRIBUTE)
+    return;
+  
+  /* For sacrifice patterns, the survival of the stone to be played is
+   * not checked (but it still needs to be legal). Otherwise we
+   * discard moves which can be captured.
+   */
+  if (!(class & CLASS_s)) {
+    /* Don't allow ko unsafety. */
+    if (safe_move(move, color) != WIN) {
+      if (0)
+       TRACE("  move at %1m wasn't safe, discarded\n", move);
+      return;
+    }
+  }
+  else {
+    /* Allow illegal ko captures at this stage. */
+    if (!is_ko(move, color, NULL) && !is_legal(move, color)) {
+      if (0)
+       TRACE("  move at %1m wasn't legal, discarded\n", move);
+      return;
+    }
+  }
+  
+  /* For class n patterns, the pattern is contingent on an opponent
+   * move at * not being captured.
+   */
+  if (class & CLASS_n) {
+    /* Allow ko unsafety. */
+    if (safe_move(move, other) == 0) {
+      if (0)
+       TRACE("  opponent can't play safely at %1m, move discarded\n", move);
+      return;
+    }
+  }
+  
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT) {
+    if (!pattern->autohelper(ll, move, color, 0))
+      return;
+  }
+
+  /* Ask helper for acceptance of pattern. */
+  if (pattern->helper) {
+    /* ask helper function to consider the move */
+    int accepted;
+    DEBUG(DEBUG_HELPER, "  asking helper to consider '%s'+%d at %1m\n", 
+         pattern->name, ll, move);
+    accepted = pattern->helper(pattern, ll, move, color);
+    
+    if (accepted) {
+      DEBUG(DEBUG_HELPER, "helper likes pattern '%s' at %1m\n",
+           pattern->name, move);
+    }
+    else {
+      DEBUG(DEBUG_HELPER, "  helper does not like pattern '%s' at %1m\n", 
+           pattern->name, move);
+      return;  /* pattern matcher does not like it */
+    }
+  }
+      
+  /* If using -a, want to see all matches even if not -v */
+  if (allpats || verbose) {
+    TRACE("pattern '%s'+%d matched at %1m\n", pattern->name, ll, move);
+  }
+  
+  /* does the pattern have an action? */
+  if (pattern->autohelper_flag & HAVE_ACTION)
+    pattern->autohelper(ll, move, color, 1);
+
+  /* Pattern class B, try to cut all combinations of opponent strings. */
+  if (class & CLASS_B) {
+    for (k = 0; k < your_nstrings; k++)
+      for (l = k+1; l < your_nstrings; l++) {
+       if (string_connect(your_strings[k], your_strings[l], NULL)
+           && !play_connect_n(color, 1, 1, move,
+                              your_strings[k], your_strings[l])) {
+         add_cut_move(move, your_strings[k], your_strings[l]);
+         TRACE("...cuts strings %1m, %1m\n",
+               your_strings[k], your_strings[l]);
+       }
+      }
+  }
+
+  /* Pattern class C, try to connect all combinations of our strings. */
+  if (class & CLASS_C) {
+    for (k = 0; k < my_nstrings; k++)
+      for (l = k+1; l < my_nstrings; l++) {
+       if (disconnect(my_strings[k], my_strings[l], NULL)
+           && !play_connect_n(color, 0, 1, move,
+                              my_strings[k], my_strings[l])) {
+         add_connection_move(move, my_strings[k], my_strings[l]);
+         TRACE("...connects strings %1m, %1m\n",
+               my_strings[k], my_strings[l]);
+       }
+      }
+  }
+
+  /* Pattern class c, add strategical defense move reason for all our
+   * dragons and a small shape bonus.
+   *
+   * This is a preliminary effect of "weak connection" and may need to
+   * be revised.
+   */
+  if (class & CLASS_c) {
+    for (k = 0; k < my_ndragons; k++) {
+      add_strategical_defense_move(move, my_dragons[k]);
+      TRACE("...strategical defense (weak connection) of %1m\n",
+           my_dragons[k]);
+    }
+    add_shape_value(move, 1);
+    TRACE("...shape value 1\n");
+  }
+
+  /* Pattern class b is obsolete in the pattern databases handled here. */
+  gg_assert(!(class & CLASS_b));
+
+  /* Pattern class e, expand to make territory. */
+  if (class & CLASS_e) {
+    add_expand_territory_move(move);
+    TRACE("...expands territory\n");
+  }
+
+  /* Pattern class E, expand to make moyo. */
+  if (class & CLASS_E) {
+    add_expand_moyo_move(move);
+    TRACE("...expands moyo\n");
+  }
+
+  /* Pattern class i, an invasion. */
+  if (class & CLASS_I) {
+    add_invasion_move(move);
+    TRACE("...is an invasion\n");
+  }
+
+  /* Pattern class a, strategical level attack on all opponent dragons. */
+  if (class & CLASS_a) {
+    for (k = 0; k < your_ndragons; k++) {
+      add_strategical_attack_move(move, your_dragons[k]);
+      TRACE("...strategical attack on %1m\n", your_dragons[k]);
+    }
+  }
+  
+  /* Pattern class d, strategical level defense of all own dragons. */
+  if (class & CLASS_d) {
+    for (k = 0; k < my_ndragons; k++) {
+      add_strategical_defense_move(move, my_dragons[k]);
+      TRACE("...strategical defense of %1m\n", my_dragons[k]);
+    }
+  }
+
+  /* Pattern class W, worthwhile threat move. */
+  if (class & CLASS_W) {
+    TRACE("...worthwhile threat move\n");
+    add_worthwhile_threat_move(move);
+  }
+
+  handle_joseki_patterns(pattern->attributes, class, move,
+                        my_dragons, my_ndragons, your_dragons, your_ndragons);
+}
+
+
+/* This callback is invoked for each matched pattern from joseki
+ * database.  This function is just a copy of relevant parts of
+ * shapes_callback().  However, most of the common code resides in
+ * handle_joseki_patterns().
+ */
+static void
+joseki_callback(int move, int color, struct corner_pattern *pattern,
+               int trans, int *stones, int num_stones)
+{
+  int k, l;
+  int class = pattern->class;
+
+  /* Dragons of our color. */
+  int my_dragons[MAX_DRAGONS_PER_PATTERN];
+  int my_ndragons = 0;
+
+  /* Dragons of other color. */
+  int your_dragons[MAX_DRAGONS_PER_PATTERN];
+  int your_ndragons = 0;
+
+  /* For urgent joseki patterns we need to find all dragons present in the
+   * pattern since such patterns are assumed to have strategical effect on
+   * them.
+   */
+  if (class & CLASS_U) {
+    /* Loop over all stones in the pattern. */
+    for (k = 0; k < num_stones; k++) {
+      int pos = stones[k];
+      int origin = dragon[pos].origin;
+
+      if (board[pos] == color && my_ndragons < MAX_DRAGONS_PER_PATTERN) {
+       for (l = 0; l < my_ndragons; l++) {
+         if (my_dragons[l] == origin)
+           break;
+       }
+
+       if (l == my_ndragons) {
+         /* We found another dragon of our color. Check that it (or
+           * rather the underlying worm) cannot be tactically
+           * captured before adding it to the list of my_dragons.
+          */
+         if (worm[pos].attack_codes[0] == 0 || does_defend(move, pos)) {
+           /* Ok, add the dragon to the list. */
+           my_dragons[l] = origin;
+           my_ndragons++;
+         }
+       }
+      }
+
+      if (board[pos] != color && your_ndragons < MAX_DRAGONS_PER_PATTERN) {
+       for (l = 0; l < your_ndragons; l++) {
+         if (your_dragons[l] == origin)
+           break;
+       }
+       if (l == your_ndragons) {
+         /* We found another opponent dragon, add it to the list. */
+         your_dragons[l] = origin;
+         your_ndragons++;
+       }
+      }
+    }
+  }
+
+  /* For joseki patterns we don't check if the proposed move is safe or legal.
+   */
+
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT) {
+    if (!pattern->autohelper(trans, move, color, 0))
+      return;
+  }
+
+  /* If using -a, want to see all matches even if not -v. */
+  if (allpats || verbose)
+    TRACE("pattern '%s'+%d matched at %1m\n", pattern->name, trans, move);
+
+  /* Does the pattern have an action? */
+  if (pattern->autohelper_flag & HAVE_ACTION)
+    pattern->autohelper(trans, move, color, 1);
+
+  /* Pattern class N, antisuji move. */
+  if (class & CLASS_N) {
+    TRACE("...antisuji move\n");
+    add_antisuji_move(move);
+  }
+
+  handle_joseki_patterns(pattern->attributes, class, move,
+                        my_dragons, my_ndragons, your_dragons, your_ndragons);
+}
+
+
+/*
+ * Match all patterns in patterns.db and patterns2.db on all positions.
+ *
+ * This function is one of the basic generators of move reasons, called
+ * by genmove().
+ */
+void
+shapes(int color)
+{
+  TRACE("\nPattern matcher is looking for move reasons for %s!\n",
+       color_to_string(color));
+
+  matchpat(shapes_callback, color, &pat_db, NULL, NULL);
+
+  /* Don't match joseki patterns while scoring. */
+  if (josekidb && !doing_scoring)
+#if 1
+    corner_matchpat(joseki_callback, color, &joseki_db);
+#else
+    matchpat(shapes_callback, color, &joseki_db, NULL, NULL);
+#endif
+
+  if (!disable_fuseki && !doing_scoring)
+    matchpat(shapes_callback, color, &fusekipat_db, NULL, NULL);
+}
+
+
+/*
+ * Match all patterns in endgame.db on all positions.
+ */
+void
+endgame_shapes(int color)
+{
+  TRACE("\nEndgame pattern matcher is looking for move reasons for %s!\n",
+       color_to_string(color));
+
+  matchpat(shapes_callback, color, &endpat_db, NULL, NULL);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/showbord.c b/engine/showbord.c
new file mode 100644 (file)
index 0000000..10bfe76
--- /dev/null
@@ -0,0 +1,374 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------
+  showbord.c -- Show current go board and playing information
+-------------------------------------------------------------*/
+
+/* 
+ * NOTE : this is no longer intended as the main user interface
+ * as it was in GNU Go 1.2. It is now a debugging aid, showing
+ * the internal state of dragons, and things. But with
+ * color enabled, it should be easy enough to see the state
+ * of play at a glance.
+ *
+ * Note : the dragons must have been calculated before this is called
+ */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+
+
+/*
+ * Stuff to enumerate the dragons 
+ */
+
+/* Element at origin of each worm stores allocated worm number. */
+static unsigned char dragon_num[BOARDMAX];
+
+static int next_white;         /* next worm number to allocate */
+static int next_black;
+
+/* linux console :
+ *  0=black
+ *  1=red             [critical]
+ *  2=green           [alive]
+ *  3=yellow/brown    [unknown]
+ *  4=blue
+ *  5=magenta
+ *  6=cyan            [dead]
+ *  7=white           [unchecked]
+ */
+
+/* Both black and white are common background colors and should be
+ * avoided.
+ */
+static const int colors[3][5] = {
+  {0, 0, 0, 0, 0}, /*not used */
+  {6, 2, 1, 3, 5}, /* WHITE : dead, alive, critical, unknown, unchecked */
+  {6, 2, 1, 3, 5}  /* BLACK : dead, alive, critical, unknown, unchecked */
+};
+
+static const int domain_colors[4] = {5, 1, 2, 3}; /* gray, black, white, both */
+
+
+/* The following four functions define an API for drawing boards. The
+ * typical use would be along the following lines:
+ *
+ * start_draw_board();
+ * for (m = 0; m < board_size; m++)
+ *   for (n = 0; n < board_size; n++) {
+ *     int color = ...;
+ *     int c = ...;
+ *     draw_color_char(m, n, c, color);
+ *   }
+ * end_draw_board();
+ *
+ * Coordinate system, hoshi points, and linefeeds are written
+ * automatically by the board drawing functions. The coordinates m, n
+ * must be ordered as in the full loops above.
+ *
+ */
+
+/* Init color and print a line with coordinate letters above the board. */
+void
+start_draw_board()
+{
+  gg_init_color();
+  draw_letter_coordinates(stderr);
+}
+
+/* Draw a colored character. If c has the value EMPTY, either a "." or
+ * a "+" is drawn, depending on whether it is a hoshi stone. If this
+ * is the first or last intersection on a line, the coordinate number
+ * is also drawn.
+ */
+void
+draw_color_char(int m, int n, int c, int color)
+{
+  /* Is this the first column? */
+  if (n == 0)
+    fprintf(stderr, "\n%2d", board_size - m);
+
+  /* Do we see a hoshi point? */
+  if (c == EMPTY) {
+    if (is_hoshi_point(m, n))
+      c = '+';
+    else
+      c = '.';
+  }
+
+  /* Use fprintf to draw black characters. This way they'll turn out
+   * white on terminals with black background.
+   */
+  if (color == GG_COLOR_BLACK)
+    fprintf(stderr, " %c", c);
+  else
+    write_color_char(color, c);
+  
+  /* Is this the last column? */
+  if (n == board_size - 1)
+    fprintf(stderr, " %-2d", board_size - m);
+}
+
+/* Draw a black character as specified above. */
+void
+draw_char(int m, int n, int c)
+{
+  draw_color_char(m, n, c, GG_COLOR_BLACK);
+}
+
+/* Print a line with coordinate letters under the board. */
+void
+end_draw_board()
+{
+  fprintf(stderr, "\n");
+  draw_letter_coordinates(stderr);
+  fprintf(stderr, "\n");
+}
+
+
+/* 
+ * Write one stone. Use 'empty' if the board is empty ('-' or '+')
+ * We use capital letters A,B,... for black, lower case a,b,... for white.
+ * This allows us to indicate up to 26 dragons uniquely, and more with
+ * low risk of ambiguity.
+ */
+
+/* The variable xo=1 if running gnugo -T, 2 if running gnugo -E, or
+ * 3 if displaying owl_status.
+ */
+
+static void 
+showchar(int i, int j, int empty, int xo)
+{
+  struct dragon_data *d;  /* dragon data at (i, j) */
+  struct dragon_data2 *d2;
+  int x;
+  ASSERT_ON_BOARD2(i, j);
+  x = BOARD(i, j);
+  d = &(dragon[POS(i, j)]);
+  d2 = &(dragon2[d->id]);
+
+  if (x == EMPTY) {
+    if (xo != 2)
+      fprintf(stderr, " %c", empty);
+    else {
+      int empty_color;
+      char empty_char;
+      
+      if (black_eye[POS(i, j)].color == BLACK) {
+       if (white_eye[POS(i, j)].color == WHITE)
+         empty_color = domain_colors[3];
+       else
+         empty_color = domain_colors[1];
+
+       if (black_eye[POS(i, j)].marginal)
+         empty_char = '!';
+       else
+         empty_char = 'x';
+      }
+      else if (white_eye[POS(i, j)].color == WHITE) {
+       empty_color = domain_colors[2];
+       if (white_eye[POS(i, j)].marginal)
+         empty_char = '!';
+       else
+         empty_char = 'o';
+      }
+      else {
+       empty_color = domain_colors[0];
+       empty_char = '.';
+      }
+
+      write_color_char(empty_color, empty_char);
+    }
+  }
+  else {
+    int w;
+
+    if (xo == 0 || ! ON_BOARD1(d->origin)) {
+      fprintf(stderr, " %c", BOARD(i, j) == BLACK ? 'X' : 'O');
+      return;
+    }
+
+    /* Figure out ascii character for this dragon. This is the
+     * dragon number allocated to the origin of this worm. */
+
+    w = dragon_num[d->origin];
+    if (!w) {
+      /* Not yet allocated - allocate next one. */
+      /* Count upwards for black, downwards for white to reduce confusion. */
+      if (BOARD(i, j) == BLACK)
+       w = dragon_num[d->origin] = next_black++;
+      else
+       w = dragon_num[d->origin] = next_white--; 
+    }
+
+    w = w%26 + (BOARD(i, j) == BLACK ? 'A' : 'a');
+    
+    /* Now draw it. */
+    if (xo == 1)
+      write_color_char(colors[BOARD(i, j)][d->crude_status], w);
+    else if (xo == 2) {
+      if (BOARD(i, j) == BLACK)
+       write_color_char(domain_colors[1], 'X');
+      else
+       write_color_char(domain_colors[2], 'O');
+    }
+    else if (xo == 3)
+      write_color_char(colors[BOARD(i, j)][d2->owl_status], w);
+    else if (xo == 4)
+      write_color_char(colors[BOARD(i, j)][d->status], w);
+  }
+}
+
+
+
+
+/*
+ * Show go board.
+ *
+ * xo=0:      black and white XO board for ascii game
+ * xo=1:      colored dragon display
+ * xo=2:      colored eye display
+ * xo=3:      colored owl display
+ * xo=4:      colored matcher status display
+ *
+ */
+
+void
+showboard(int xo)
+{
+  int i, j, ii;
+  gg_init_color();
+
+  /* Set all dragon numbers to 0. */
+  memset(dragon_num, 0, sizeof(dragon_num));
+  
+  next_white = (259 - 26);
+  next_black = 26;
+  
+  start_draw_board();
+  
+  for (i = 0; i < board_size; i++) {
+    ii = board_size - i;
+    fprintf(stderr, "\n%2d", ii);
+    
+    for (j = 0; j < board_size; j++)
+      showchar(i, j, is_hoshi_point(i, j) ? '+' : '.', xo);
+    
+    fprintf(stderr, " %d", ii);
+    
+    if (xo == 0 && ((board_size < 10 && i == board_size-2)
+                   || (board_size >= 10 && i == 8)))
+      fprintf(stderr, "     WHITE (O) has captured %d stones", black_captured);
+    
+    if (xo == 0 && ((board_size < 10 && i == board_size-1)
+                   || (board_size >= 10 && i == 9)))
+      fprintf(stderr, "     BLACK (X) has captured %d stones", white_captured);
+    
+    if (xo == 3) {
+      if (i == board_size-5)
+       write_color_string(GG_COLOR_GREEN, "    green=alive");
+      if (i == board_size-4)
+       write_color_string(GG_COLOR_CYAN, "    cyan=dead");
+      if (i == board_size-3)
+       write_color_string(GG_COLOR_RED, "    red=critical");
+      if (i == board_size-2)
+       write_color_string(GG_COLOR_YELLOW, "    yellow=unknown");
+      if (i == board_size-1)
+       write_color_string(GG_COLOR_MAGENTA, "    magenta=unchecked");
+    }
+  }
+
+  end_draw_board();
+}
+
+
+/* Some print utility function that don't really have a better place
+ * in the engine code than here.
+ */
+
+static const char *status_names[] = {
+  DRAGON_STATUS_NAMES
+};
+
+/* Convert a status value to a string. */
+const char *
+status_to_string(enum dragon_status status)
+{
+  return status_names[(int) status];
+}
+
+
+/* Convert a read result to a string */
+const char *
+result_to_string(int result)
+{
+  switch (result) {
+  case 0:             return "0";
+  case KO_B:          return "KO_B";
+  case LOSS:          return "LOSS";
+  case GAIN:          return "GAIN";
+  case KO_A:          return "KO_A";
+  case WIN:           return "WIN";
+
+  default:            return "ERROR";
+  }
+}
+
+
+#ifndef HAVE_VARIADIC_DEFINE
+
+/* See gnugo.h for related TRACE family macro definitions */
+
+/* Always returns 1 to allow use in short-circuit logical expressions. */
+int 
+DEBUG_func(int flag, const char *fmt, ...)
+{
+  if (debug & flag) {
+    va_list ap;
+    va_start(ap, fmt);
+    vgprintf(stderr, fmt, ap);
+    va_end(ap);
+  }
+
+  return 1;
+}
+
+#endif /*HAVE_VARIADIC_DEFINE*/
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/surround.c b/engine/surround.c
new file mode 100644 (file)
index 0000000..bad325b
--- /dev/null
@@ -0,0 +1,689 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+
+/* Forward declarations */
+static int goal_dist(int pos, signed char goal[BOARDMAX]);
+static int compare_angles(const void *a, const void *b);
+static void show_surround_map(signed char mf[BOARDMAX],
+                             signed char mn[BOARDMAX]);
+
+/* Globals */
+static int gg;      /* stores the gravity center of the goal */
+
+
+/* Returns true if a dragon is enclosed within the convex hull of
+ * its hostile neighbor dragons. This is an indication that the dragon is
+ * in danger. Stones on the second and first lines are not tested.
+ *
+ * Normally NULL will be passed to the parameter apos. It can be
+ * an empty board location. If apos is non NULL it is marked and
+ * added to the the hull. Thus we can ask if adding a single stone
+ * to the board surrounds the dragon.
+ *
+ * A CORNER is a vertex of the polygon which comprises this convex
+ * hull. The algorithm proceeds by first finding the sequence of
+ * corners on the left side of the polyhedron, then the sequence
+ * of corners on the right side.
+ *
+ * The hull is marked in the array mn with the number 1.  A slight
+ * expansion is marked with the number 2. Return code is SURROUNDED if
+ * the friendly dragon lies within the area marked 1,
+ * WEAKLY_SURROUNDED if it lies in the slightly larger area marked 1
+ * and 2, and 0 otherwise.
+ *
+ * The notion of weak surroundedness seems to be much less indicative
+ * of a dragon's immanent danger than surroundedness.
+ * 
+ * An exception: if the larger area contains any stone of a different
+ * friendly dragon (which is not DEAD) the return code is 0, unless
+ * that allied dragon is ENTIRELY contained within the hull.
+ *
+ * Another exception: an ikken tobi (one space jump) is generally not
+ * a connection but in practice may be almost as good. If there is an
+ * ikken tobi out of the hull, then the dragon is not surrounded.
+ *
+ * If the parameter showboard is 1, the figure is drawn. If showboard
+ * is 2, the figure is only drawn if the region is surrounded.  
+ *
+ * If (apos) is NULL, the result is saved in the surround_data cache. 
+ * The assumption is that the function will only be called once
+ * with (apos) null, during make_dragons; thereafter the surroundedness
+ * will be accessed using the function is_surrounded().
+ *
+ * If *surround_size is not a NULL pointer, then surround_size
+ * returns the size of the surroundings.
+ */
+
+int
+compute_surroundings(int pos, int apos, int showboard, int *surround_size)
+{
+  int i, j;
+  int m, n;
+  int k;
+  int dpos;
+  int surrounded;
+  
+  int left_corner[MAX_BOARD];
+  int right_corner[MAX_BOARD];
+  int corner[BOARDMAX];
+  int left_corners = 0, right_corners = 0;
+  int corners = 0;
+  int top_row, bottom_row;
+  int color = board[pos];
+  int other = OTHER_COLOR(color);
+  int gi = 0;
+  int gj = 0;
+  int stones = 0;
+  int found_some;
+  
+  signed char mf[BOARDMAX]; /* friendly dragon  */
+  signed char mn[BOARDMAX]; /* neighbor dragons */
+  int  sd[BOARDMAX]; /* distances to the goal */
+  
+  if (DRAGON2(pos).hostile_neighbors == 0)
+    return(0);
+  
+  memset(mf, 0, sizeof(mf));
+  memset(mn, 0, sizeof(mn));
+  memset(sd, 0, sizeof(sd));
+  
+  mark_dragon(pos, mf, 1);
+
+  /* mark hostile neighbors */
+
+  for (k = 0; k < DRAGON2(pos).neighbors; k++) {
+    int nd = DRAGON(DRAGON2(pos).adjacent[k]).origin;
+    
+    if (board[nd] != color) {
+      if (0)
+       gprintf("neighbor: %1m\n", nd);
+      mark_dragon(nd, mn, 1);
+    }
+  }
+
+  /* descend markings from stones lying on the 2nd and third lines */
+
+  for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+    if (ON_BOARD(dpos) && mn[dpos]) {
+      for (k = 0; k < 4; k++) {
+        int d = delta[k];
+        if (!ON_BOARD(dpos + d))
+          continue;
+        if (!ON_BOARD(dpos + 2*d)) {
+          if (board[dpos + d] == EMPTY)
+            mn[dpos + d] = 1;
+        }
+        else if (!ON_BOARD(dpos + 3*d)) {
+          if (board[dpos + d] == EMPTY
+              && board[dpos + 2*d] == EMPTY)
+            mn[dpos + 2*d] = 1;
+        }
+      }
+    }
+
+  /* compute minimum distances to the goal */
+
+  for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+    if (ON_BOARD(dpos) && mn[dpos]) 
+      sd[dpos] = goal_dist(dpos, mf);
+
+  /* revise markings */
+
+  do {
+    found_some = 0;
+    for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+      if (ON_BOARD(dpos) && mn[dpos] && sd[dpos] > 8) {
+        /* discard markings if we can find 2 stones
+         * that verify :
+         * - it is closer to the goal than we are
+         * - it is closer to us than the goal is
+         * - they are closer to each other than we are to the goal
+         */
+        for (i = BOARDMIN; i < BOARDMAX; i++)
+         if (ON_BOARD(i) && mn[i] && i != dpos
+              && sd[i] < sd[dpos]
+              && square_dist(i, dpos) < sd[dpos]) {
+            for (j = i + 1; j < BOARDMAX; j++)
+             if (ON_BOARD(j) && mn[j] && j != dpos
+                  && sd[j] < sd[dpos]
+                  && square_dist(j, dpos) < sd[dpos]
+                  && square_dist(i, j) < sd[dpos]) {
+               mn[dpos] = 0;
+                found_some = 1;
+                break;
+              }
+            if (mn[dpos] == 0)
+              break;
+          }
+      }
+  } while (found_some);
+
+  /* prepare corner array */
+
+  for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+    if (ON_BOARD(dpos) && mn[dpos])
+      corner[corners++] = dpos;
+
+  /* compute gravity center of the goal */
+
+  for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+    if (ON_BOARD(dpos) && mf[dpos]) {
+      gi += I(dpos);
+      gj += J(dpos);
+      stones++;
+    }
+  gi /= stones;
+  gj /= stones;
+  gg = POS(gi, gj);
+
+  /* sort the corner array */
+
+  gg_sort(corner, corners, sizeof(int), compare_angles);
+
+  /* if apos is not NO_MOVE, mark it. */
+
+  if (apos != NO_MOVE) {
+    ASSERT_ON_BOARD1(apos);
+    mn[apos] = 1;
+  }
+  
+  if (showboard == 1) {
+    show_surround_map(mf, mn);
+  }
+
+  /* find top row of surrounding polyhedron */
+  
+  top_row = -1;
+  for (m = 0; m < board_size; m++) {
+    if (top_row != -1)
+      break;
+    for (n = 0; n < board_size; n++)
+      if (mn[POS(m, n)]) {
+       left_corner[0] = POS(m, n);
+       top_row = m;
+       break;
+      }
+  }
+
+  /* find bottom row */
+  
+  bottom_row = -1;
+  for (m = board_size - 1; m >= 0; m--) {
+    if (bottom_row != -1)
+      break;
+    for (n = 0; n < board_size; n++)
+      if (mn[POS(m, n)]) {
+       bottom_row = m;
+       break;
+      }
+  }
+  
+  /* find the corners on the left side */
+  
+  for (left_corners = 1; I(left_corner[left_corners-1]) < bottom_row; 
+       left_corners++) {
+    int best_found = 0;
+    float best_slope = 0.;
+    int m = I(left_corner[left_corners-1]);
+    int n = J(left_corner[left_corners-1]);
+    
+    for (i = m + 1; i <= bottom_row; i++)
+      for (j = 0; j < board_size; j++)
+       if (mn[POS(i, j)]) {
+         float slope = ((float) (j - n))/((float) (i - m));
+         if (0)
+           gprintf("(left) at %m, last %m, slope=%f\n", i, j, m, n, slope);
+         
+         if (!best_found || slope < best_slope) {
+           best_found = POS(i, j);
+           best_slope = slope;
+         }
+       }
+    ASSERT_ON_BOARD1(best_found);
+    left_corner[left_corners] = best_found;
+  }
+  
+  for (n = board_size-1; n >= 0; n--)
+    if (mn[POS(top_row, n)]) {
+      right_corner[0] = POS(top_row, n);
+      break;
+    }
+  
+  /* find the corners on the right side */
+  
+  for (right_corners = 1; I(right_corner[right_corners-1]) < bottom_row; 
+       right_corners++) {
+    int best_found = 0;
+    float best_slope = 0.;
+    int m = I(right_corner[right_corners-1]);
+    int n = J(right_corner[right_corners-1]);
+    
+    for (i = m + 1; i <= bottom_row; i++) {
+      for (j = board_size - 1; j >= 0; j--) {
+       if (mn[POS(i, j)]) {
+         float slope = ((float) (j - n))/((float) (i - m));
+         if (0)
+           gprintf("(right) at %m, last %m, slope=%f\n", i, j, m, n, slope);
+         if (!best_found || slope > best_slope) {
+           best_found = POS(i, j);
+           best_slope = slope;
+         }
+       }
+      }
+    }
+    ASSERT_ON_BOARD1(best_found);
+    right_corner[right_corners] = best_found;
+  }
+  
+  if (0) {
+    for (k = 0; k < left_corners; k++)
+      gprintf("left corner %d: %1m\n", k, left_corner[k]);
+    
+    for (k = 0; k < right_corners; k++)
+      gprintf("right corner %d: %1m\n", k, right_corner[k]);
+  }
+
+  /* Now mark the interior of the convex hull */
+  
+  for (n = J(left_corner[0]); n <= J(right_corner[0]); n++)
+    mn[POS(top_row, n)] = 1;
+
+  for (n = J(left_corner[left_corners-1]); 
+       n <= J(right_corner[right_corners-1]); n++)
+    mn[POS(bottom_row, n)] = 1;
+
+  for (m = top_row+1; m < bottom_row; m++) {
+    int left_boundary = -1, right_boundary = -1;
+    for (k = 1; k < left_corners; k++) {
+      if (I(left_corner[k]) > m) {
+       float ti = I(left_corner[k-1]);
+       float tj = J(left_corner[k-1]);
+       float bi = I(left_corner[k]);
+       float bj = J(left_corner[k]);
+       
+       if (0)
+         gprintf("(left) %d: %1m %1m\n", 
+                 m, left_corner[k-1], left_corner[k]);
+       /* left edge in this row is on segment (ti,tj) -> (bi, bj) */
+       
+       /* FIXME: Rewrite this to avoid floating point arithmetic */
+       left_boundary = ceil(tj + (m - ti) * (bj - tj) / (bi - ti));
+       break;
+      }
+    }
+
+    for (k = 1; k < right_corners; k++) {
+      if (I(right_corner[k]) > m) {
+       float ti = I(right_corner[k-1]);
+       float tj = J(right_corner[k-1]);
+       float bi = I(right_corner[k]);
+       float bj = J(right_corner[k]);
+       
+       if (0)
+         gprintf("(right) %d: %1m %1m\n", 
+                 m, right_corner[k-1], right_corner[k]);
+
+       /* FIXME: Rewrite this to avoid floating point arithmetic */
+       right_boundary = floor(tj + (m - ti) * (bj - tj) / (bi - ti));
+       break;
+      }
+    }
+
+    for (n = left_boundary; n <= right_boundary; n++)
+      mn[POS(m, n)] = 1;
+  }
+  
+  /* mark the expanded region */
+
+  for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+    if (ON_BOARD(dpos) && mn[dpos] == 1)
+      for (k = 0; k < 4; k++)
+       if (ON_BOARD(dpos + delta[k]) && !mn[dpos + delta[k]])
+         mn[dpos + delta[k]] = 2;
+      
+  /* Mark allied dragons that intersect the (unexpanded) hull.
+   * These must all lie entirely within the hull for the
+   * dragon to be considered surrounded. 
+   *
+   * Only neighbor dragons are considered since dragons that
+   * are not neighbors are less likely to be helpful.
+   */
+
+  for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++) {
+    int mpos;
+    if (ON_BOARD(dpos) 
+       && mn[dpos] == 1
+       && board[dpos] == color
+       && are_neighbor_dragons(pos, dpos)
+       && !mf[dpos]) {
+
+      for (mpos = BOARDMIN; mpos < BOARDMAX; mpos++)
+       if (ON_BOARD(mpos) && is_same_dragon(mpos, dpos))
+         mf[mpos] = 2;
+    }
+    /* A special case
+     *
+     *  . X X .
+     *  X O . X
+     *  X . O O
+     *  . O . .
+     *
+     * The O stone hasn't been amalgamated and the surround computations
+     * might think this single stone dragon is surrounded, which in turn
+     * can generate overvaluation of moves around this stone.
+     * Consequently, we allow inclusion of the stones at kosumi distance
+     * in the mf (friendly) array.
+     */
+    if (ON_BOARD(dpos) 
+       && mn[dpos] == 2
+       && board[dpos] == color
+       && are_neighbor_dragons(pos, dpos)
+       && !mf[dpos]) {
+      for (k = 4; k < 8; k++)
+       if (ON_BOARD(dpos + delta[k]) && board[dpos + delta[k]] == color
+           && mn[dpos + delta[k]] == 1
+           && board[dpos + delta[k-4]] == EMPTY
+           && board[dpos + delta[(k-3)%4]] == EMPTY) {
+         for (mpos = BOARDMIN; mpos < BOARDMAX; mpos++)
+           if (ON_BOARD(mpos) && is_same_dragon(mpos, dpos))
+             mf[mpos] = 2;
+       }
+    }
+  }
+
+  /* determine the surround status of the dragon */
+
+  surrounded = SURROUNDED;
+
+  /* Compute the maximum surround status awarded
+   * If distances between enclosing stones are large, reduce to
+   * WEAKLY_SURROUNDED. If (really) too large, then reduce to 0
+   * FIXME: constants chosen completely ad hoc. Possibly better tunings
+   *        can be found.
+   */
+
+  for (k = 0; k < corners - 1; k++) {
+    if (is_edge_vertex(corner[k])
+        && is_edge_vertex(corner[k+1]))
+      continue;
+    if (square_dist(corner[k], corner[k+1]) > 60) {
+      surrounded = 0;
+      break;
+    }
+    else if (square_dist(corner[k], corner[k+1]) > 27)
+      surrounded = WEAKLY_SURROUNDED;
+  }
+  if (surrounded
+      && (!is_edge_vertex(corner[0])
+          || !is_edge_vertex(corner[corners-1]))) {
+    if (square_dist(corner[0], corner[corners-1]) > 60)
+      surrounded = 0;
+    else if (square_dist(corner[0], corner[corners-1]) > 27)
+      surrounded = WEAKLY_SURROUNDED;
+  }
+
+  if (surrounded)
+    for (dpos = BOARDMIN; dpos < BOARDMAX; dpos++)
+      if (mf[dpos]) {
+       if (mn[dpos] == 0) {
+         surrounded = 0;
+         break;
+       }
+       else if (mn[dpos] == 2)
+         surrounded = WEAKLY_SURROUNDED;
+      }
+
+  /* revise the status for single stone dragons. */
+
+  if (stones == 1
+      && surrounded == WEAKLY_SURROUNDED
+      && mn[pos] == 2)
+    surrounded = 0;
+      
+  /* revise the status if an ikken tobi jumps out. */
+
+  if (surrounded) {
+    for (dpos = BOARDMIN; dpos < BOARDMAX && surrounded; dpos++) {
+      if (!ON_BOARD(dpos) || !mf[dpos])
+       continue;
+
+      for (k = 0; k < 4; k++) {
+       int up = delta[k];
+       int right = delta[(k + 1) % 4];
+       if (board[dpos + up] == EMPTY
+           && board[dpos + 2*up] == color
+           && mn[dpos + 2*up] != 1
+           && ON_BOARD(dpos + up + right)
+           && board[dpos + up + right] != other
+           && ON_BOARD(dpos + up - right)
+           && board[dpos + up - right] != other) {
+         surrounded = 0;
+         break;
+       }
+      }
+    }
+  }
+
+  if (showboard == 1 || (showboard == 2 && surrounded)) {
+    show_surround_map(mf, mn);
+  }
+
+  if (!apos && surrounded && surround_pointer < MAX_SURROUND) {
+    memcpy(surroundings[surround_pointer].surround_map, mn, sizeof(mn));
+    surroundings[surround_pointer].dragon_number = dragon[pos].id;
+    surround_pointer++;
+  }
+
+  if (surround_size) {
+    int pos;
+
+    *surround_size = 0;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (ON_BOARD(pos) && mn[pos] == 1)
+       (*surround_size)++;
+  }
+
+  return surrounded;
+}
+
+
+/* Computes the minimum distance to the goal
+ */
+
+static int
+goal_dist(int pos, signed char goal[BOARDMAX])
+{
+  int dist = 10000;
+  int ii;
+
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+    if (ON_BOARD(ii) && goal[ii])
+      dist = gg_min(dist, square_dist(ii, pos));
+
+  return dist;
+}
+
+/* Compares angles. Chosen convention:
+ * - SOUTH is "lowest"
+ * - ascending order is done clock-wise (WEST, NORTH, EAST)
+ */
+static int
+compare_angles(const void *a, const void *b)
+{
+  int aa = *((const int *)a);
+  int bb = *((const int *)b);
+
+  int di_a = I(aa) - I(gg);
+  int dj_a = J(aa) - J(gg);
+  int di_b = I(bb) - I(gg);
+  int dj_b = J(bb) - J(gg);
+
+  float sin_a, sin_b;
+
+  if (aa == gg)
+    return 1;
+  if (bb == gg)
+    return -1;
+
+  if (dj_a == 0) {
+    if (di_a > 0) {
+      if (dj_b != 0 || di_b <= 0)
+        return -1;
+      return 0;
+    }
+    else {
+      if (dj_b > 0)
+        return -1;
+      else if (dj_b < 0 || di_b > 0)
+        return 1;
+      else
+        return 0;
+    }
+  }
+
+  sin_a = (float)di_a / sqrt(di_a*di_a + dj_a*dj_a);
+  sin_b = (float)di_b / sqrt(di_b*di_b + dj_b*dj_b);
+
+  if (dj_a > 0) {
+    if (dj_b <= 0)
+      return 1;
+    if (sin_a > sin_b)
+      return 1;
+    else if (sin_a < sin_b)
+      return -1;
+    else
+      return 0;
+  }
+  else { /* if (dj_a < 0) */
+    if (dj_b > 0)
+      return -1;
+    if (sin_a < sin_b)
+      return 1;
+    else if (sin_a > sin_b)
+      return -1;
+    else
+      return 0;
+  }
+}
+
+
+static void
+show_surround_map(signed char mf[BOARDMAX], signed char mn[BOARDMAX])
+{
+  int m, n;
+
+  start_draw_board();
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) {
+      int col, c;
+      
+      if (mf[POS(m, n)]) {
+       if (mn[POS(m, n)] == 1)
+         col = GG_COLOR_RED;
+       else if (mn[POS(m, n)] == 2)
+         col = GG_COLOR_YELLOW;
+       else
+         col = GG_COLOR_GREEN;
+      }
+      else if (mn[POS(m, n)] == 1)
+       col = GG_COLOR_BLUE;
+      else if (mn[POS(m, n)] == 2)
+       col = GG_COLOR_CYAN;
+      else
+       col = GG_COLOR_BLACK;
+      if (board[POS(m, n)] == BLACK)
+       c = 'X';
+      else if (board[POS(m, n)] == WHITE)
+       c = 'O';
+      else if (mn[POS(m, n)])
+       c = '*';
+      else
+       c = '.';
+      draw_color_char(m, n, c, col);
+    }
+  end_draw_board();
+}
+
+
+
+int
+is_surrounded(int dr)
+{
+  return(DRAGON2(dr).surround_status);
+}
+
+/* Returns true if (dragon) is not surrounded, but (move) surrounds it.
+ */
+
+int
+does_surround(int move, int dr)
+{
+  if (DRAGON2(dr).surround_status)
+    return 0;
+  return compute_surroundings(dr, move, 0, NULL);
+}
+
+
+/* Should be run once per genmove, before make_dragons. */
+
+void
+reset_surround_data(void)
+{
+  surround_pointer = 0;
+}
+
+
+/* Returns 1 (respectively 2) if pos is in the convex hull
+ * (respectively expanded hull boundary) of the surrounding
+ * dragons. Returns -1 if the dragon is not found.
+ */
+int
+surround_map(int dr, int pos)
+{
+  int k;
+
+  for (k = 0; k < surround_pointer; k++)
+    if (surroundings[k].dragon_number == dragon[dr].id)
+      return surroundings[k].surround_map[pos];
+  return -1;
+}
+
+
+  
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/unconditional.c b/engine/unconditional.c
new file mode 100644 (file)
index 0000000..3f35cd1
--- /dev/null
@@ -0,0 +1,705 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "liberty.h"
+
+/* Capture as many strings of the given color as we can. Played stones
+ * are left on the board and the number of played stones is returned.
+ * Strings marked in the exceptions array are excluded from capturing
+ * attempts. If all non-excepted strings are successfully captured,
+ * *none_invincible is set to one. Set none_invincible to NULL if you
+ * don't need that information.
+ */
+static int
+capture_non_invincible_strings(int color, int exceptions[BOARDMAX],
+                              int *none_invincible)
+{
+  int other = OTHER_COLOR(color);
+  int something_captured = 1; /* To get into the first turn of the loop. */
+  int string_found = 0;
+  int moves_played = 0;
+  int save_moves;
+  int libs[MAXLIBS];
+  int liberties;
+  int pos;
+  int k;
+  
+  while (something_captured) {
+    /* Nothing captured so far in this turn of the loop. */
+    something_captured = 0;
+
+    /* Is there something left to try to capture? */
+    string_found = 0;
+    
+    /* Visit all friendly strings on the board. */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (board[pos] != color || find_origin(pos) != pos)
+       continue;
+
+      if (exceptions && exceptions[pos])
+       continue;
+
+      string_found = 1;
+      
+      /* Try to capture the string at pos. */
+      liberties = findlib(pos, MAXLIBS, libs);
+      save_moves = moves_played;
+      for (k = 0; k < liberties; k++) {
+       if (trymove(libs[k], other, "unconditional_life", pos))
+         moves_played++;
+      }
+      
+      /* Successful if already captured or a single liberty remains.
+       * Otherwise we must rewind and take back the last batch of moves.
+       */
+      if (board[pos] == EMPTY)
+       something_captured = 1;
+      else if (findlib(pos, 2, libs) == 1) {
+       /* Need to use tryko as a defense against the extreme case
+        * when the only opponent liberty that is not suicide is an
+        * illegal ko capture, like in this 5x5 position:
+        * +-----+
+        * |.XO.O|
+        * |XXOO.|
+        * |X.XOO|
+        * |XXOO.|
+        * |.XO.O|
+        * +-----+
+        */
+       int success = tryko(libs[0], other, "unconditional_life");
+       gg_assert(success);
+       moves_played++;
+       something_captured = 1;
+      }
+      else
+       while (moves_played > save_moves) {
+         popgo();
+         moves_played--;
+       }
+    }
+  }
+
+  if (none_invincible)
+    *none_invincible = !string_found;
+  
+  return moves_played;
+}
+
+/* Find those worms of the given color that can never be captured,
+ * even if the opponent is allowed an arbitrary number of consecutive
+ * moves. The coordinates of the origins of these worms are written to
+ * the worm arrays and the number of non-capturable worms is
+ * returned.
+ *
+ * The algorithm is to cycle through the worms until none remains or
+ * no more can be captured. A worm is removed when it is found to be
+ * capturable, by letting the opponent try to play on all its
+ * liberties. If the attack fails, the moves are undone. When no more
+ * worm can be removed in this way, the remaining ones are
+ * unconditionally alive.
+ *
+ * After this, unconditionally dead opponent worms and unconditional
+ * territory are identified. This is almost, but only almost,
+ * straightforward. We first present a simple but only almost correct
+ * solution, then show how to patch up its deficiencies.
+ *
+ * - - - - - - -
+ *
+ * Algorithm 1, simple but slightly incorrect.
+ *
+ * To find unconditionally dead opponent worms and unconditional
+ * territory, we continue from the position obtained at the end of the
+ * previous operation (only unconditionally alive strings remain for
+ * color) with the following steps:
+ *
+ * 1. Play opponent stones on all liberties of the unconditionally
+ *    alive strings except where illegal. (That the move order may
+ *    determine exactly which liberties can be played legally is not
+ *    important. Just pick an arbitrary order).
+ * 2. Recursively extend opponent strings in atari, except where this
+ *    would be suicide.
+ * 3. Play an opponent stone anywhere it can get two empty
+ *    neighbors. (I.e. split big eyes into small ones).
+ * 4. Play an opponent stone anywhere it can get one empty
+ *    neighbor. (I.e. reduce two space eyes to one space eyes.)
+ *
+ * Remaining opponent strings in atari and remaining liberties of the
+ * unconditionally alive strings constitute the unconditional
+ * territory.
+ *
+ * Opponent strings from the initial position placed on
+ * unconditional territory are unconditionally dead.
+ *
+ * - - - - - - -
+ *
+ * The deficiency with this algorithm is that a certain class of sekis
+ * are considered as dead, e.g. this position:
+ *
+ * .OOOOO.
+ * OOXXXOO
+ * OXX.XXO
+ * OX.O.XO
+ * OX.O.XO
+ * OXX.XXO
+ * OOXXXOO
+ * .OOOOO.
+ *
+ * The problem is that while removing the two O stones, X is reduced
+ * to a single small eye. Still O cannot capture these stones under
+ * alternating play since the eyespace is too big.
+ *
+ * Before discussing this seki further we make a preliminary
+ * modification of the algorithm.
+ *
+ * - - - - - - -
+ *
+ * Algorithm 2. More complex but still slightly incorrect algorithm:
+ *
+ * 1. Run algorithm 1.
+ * 2. Return to the original position.
+ * 3. Capture all capturable O strings which according to algorithm 1
+ *    do not belong to unconditional territory.
+ * 4. Play opponent stones on all liberties of the unconditionally
+ *    alive strings except where illegal. (That the move order may
+ *    determine exactly which liberties can be played legally is not
+ *    important. Just pick an arbitrary order).
+ * 5. Recursively extend opponent strings in atari, except where this
+ *    would be suicide.
+ * 6. Capture all remaining capturable O strings.
+ * 7. Repeat 4 and 5 once.
+ * 8. Play an opponent stone anywhere it can get two empty
+ *    neighbors. (I.e. split big eyes into small ones).
+ * 9. Play an opponent stone anywhere it can get one empty
+ *    neighbor. (I.e. reduce two space eyes to one space eyes.)
+ *
+ * Remaining opponent strings in atari and remaining liberties of the
+ * unconditionally alive strings constitute the unconditional
+ * territory.
+ *
+ * Opponent strings from the initial position placed on
+ * unconditional territory are unconditionally dead.
+ *
+ * - - - - - - -
+ *
+ * We can observe that, after step 5, an X group with at least two
+ * distinct eyespaces would not risk being reduced to a single small
+ * eye. Similarly an X group with a capturable O string of size at
+ * least three would allow the formation of two distinct small eyes
+ * after being captured. Thus it is easy to see that the only X groups
+ * which would live in seki but could not be transformed into
+ * unconditionally alive groups would have a single eyespace with a
+ * capturable O string of size at most 2. Furthermore the eyespace
+ * would not be possible to subdivide. Then if the capturable string
+ * would be of size 1 it would in all cases form a nakade and we would
+ * not have a seki. The plausible seki positions would all be
+ * reducable to the following eyeshape:
+ *
+ * .OOOOO.
+ * OOXXXO.
+ * OXX.XOO
+ * OX.OXXO
+ * OXXO.XO
+ * OOX.XXO
+ * .OXXXOO
+ * .OOOOO.
+ *
+ * The remaining question is what effects cutting points in the X
+ * group would have. For example these X groups are dead:
+ *
+ * .OOOOO.   .OOOOO.   .OOOOO.   .OOOOO.   ..OOOO.   ..OOOO.
+ * .OXXXO.   .OXXXO.   .OXXXO.  .OXXXO.   OOOXXO.   OOOXXO.
+ * OOX.XO.   OOX.XOO   OOX.XOO  OOX.XOO   OXX.XO.   OXX.XOO
+ * OX.OXOO   OX.OXXO   OX.OXXO  OX.OXXO   OX.OXOO   OX.OXXO
+ * OXXO.XO   OXXO.XO   OXXO.XO  OXXO.XO   OXXO.XO   OXXO.XO
+ * OOX.XXO   OOX.XOO   OOX.XXO  OOX.XXO   OOX.XXO   OOX.XXO
+ * .OXXXOO   .OXXXO.   .OXXOOO  .OOXXOO   .OXXXOO   .OXXOOO
+ * .OOOOO.   .OOOOO.   .OOOO..  ..OOOO.   .OOOOO.   .OOOO..
+ *
+ * while these are alive in seki
+ *
+ * ..OOOO.   .OOOO..   .OOOO..   ..OOOO.   ..OOOO.
+ * OOOXXO.   .OXXOO.   OOXXOO.  .OOXXO.   OOOXXO.
+ * OXX.XOO   OOX.XOO   OXX.XOO  OOX.XOO   OXX.XOO
+ * OX.OXXO   OX.OXXO   OX.OXXO  OX.OXXO   OX.OXXO
+ * OXXO.XO   OXXO.XO   OOXO.XO  OXXO.XO   OOXO.XO
+ * OOX.XXO   OOX.XXO   .OX.XXO  OOX.XXO   .OX.XXO
+ * .OXXXOO   .OXXXOO   .OXXOOO  .OXXXOO   .OXXXOO
+ * .OOOOO.   .OOOOO.   .OOOO..  ..OOOO.   .OOOOO.
+ *
+ * The critical distinction between the dead ones and the seki ones is
+ * that the stones marked a and b below,
+ *
+ * .OOOOO.
+ * OOXXXO.
+ * OXX.XOO
+ * OX.ObXO
+ * OXaO.XO
+ * OOX.XXO
+ * .OXXXOO
+ * .OOOOO.
+ *
+ * belong to different strings for the dead groups and to the same
+ * string for the seki groups.
+ *
+ * The trick to avoid misclassifying areas where the opponent can form
+ * a seki group but not an invincible group as unconditional territory
+ * is thus to detect the formation above and add a third stone to the
+ * O group before the capturing in step 6 above.
+ *
+ * This leads to the final algorithm.
+ *
+ * - - - - - - -
+ *
+ * Algorithm 3. Final and correct algorithm:
+ *
+ * 1. Run algorithm 1.
+ * 2. Return to the original position.
+ * 3. Capture all capturable O strings which according to algorithm 1
+ *    do not belong to unconditional territory.
+ * 4. Play opponent stones on all liberties of the unconditionally
+ *    alive strings except where illegal. (That the move order may
+ *    determine exactly which liberties can be played legally is not
+ *    important. Just pick an arbitrary order).
+ * 5. Recursively extend opponent strings in atari, except where this
+ *    would be suicide.
+ * 6. Identify eyespaces of the kind described above and extend any
+ *    matching two-stone string with a third stone.
+ * 7. Capture all remaining capturable O strings.
+ * 8. Repeat 4 and 5 once.
+ * 9. Play an opponent stone anywhere it can get two empty
+ *    neighbors. (I.e. split big eyes into small ones).
+ * 10. Play an opponent stone anywhere it can get one empty
+ *    neighbor. (I.e. reduce two space eyes to one space eyes.)
+ *
+ * Remaining opponent strings in atari and remaining liberties of the
+ * unconditionally alive strings constitute the unconditional
+ * territory.
+ *
+ * Opponent strings from the initial position placed on
+ * unconditional territory are unconditionally dead.
+ *
+ * - - - - - - -
+ *
+ * On return, unconditional_territory[][] is 1 where color has
+ * unconditionally alive stones, 2 where it has unconditional
+ * territory, and 0 otherwise.
+ */
+
+void
+unconditional_life(int unconditional_territory[BOARDMAX], int color)
+{
+  int found_one;
+  int other = OTHER_COLOR(color);
+  int libs[MAXLIBS];
+  int liberties;
+  int pos;
+  int k, r;
+  int moves_played;
+  int potential_sekis[BOARDMAX];
+  int none_invincible;
+
+  /* Initialize unconditional_territory array. */
+  memset(unconditional_territory, 0,
+        sizeof(unconditional_territory[0]) * BOARDMAX);
+  
+  /* Find isolated two-stone strings which might be involved in the
+   * kind of seki described in the comments.
+   */
+  memset(potential_sekis, 0, sizeof(potential_sekis));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int isolated = 1;
+    int stones[2];
+    int pos2;
+    
+    if (board[pos] != color
+       || find_origin(pos) != pos
+       || countstones(pos) != 2)
+      continue;
+    
+    findstones(pos, 2, stones);
+    for (k = 0; k < 2 && isolated; k++) {
+      for (r = 0; r < 8 && isolated; r++) {
+       pos2 = stones[k] + delta[r];
+       if (!ON_BOARD(pos2)
+           || (board[pos2] == color
+               && !same_string(pos, pos2)))
+         isolated = 0;
+      }
+    }
+
+    if (isolated) {
+      potential_sekis[stones[0]] = 1;
+      potential_sekis[stones[1]] = 1;
+    }
+  }
+  
+  moves_played = capture_non_invincible_strings(color, potential_sekis,
+                                               &none_invincible);
+
+  /* If there are no invincible strings, nothing can be unconditionally
+   * settled.
+   */
+  if (none_invincible) {
+    /* Take back all moves. */
+    while (moves_played > 0) {
+      popgo();
+      moves_played--;
+    }
+    return;
+  }
+  
+  /* The strings still remaining except those marked in
+   * potential_sekis[] are uncapturable. Now see which opponent
+   * strings can survive.
+   *
+   * 1. Play opponent stones on all liberties of the unconditionally
+   *    alive strings except where illegal.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != color || potential_sekis[pos] || find_origin(pos) != pos)
+      continue;
+      
+    /* Play as many liberties as we can. */
+    liberties = findlib(pos, MAXLIBS, libs);
+    for (k = 0; k < liberties; k++) {
+      if (trymove(libs[k], other, "unconditional_life", pos))
+       moves_played++;
+    }
+  }
+
+  /* 2. Recursively extend opponent strings in atari, except where this
+   *    would be suicide.
+   */
+  found_one = 1;
+  while (found_one) {
+    /* Nothing found so far in this turn of the loop. */
+    found_one = 0;
+
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (board[pos] != other || countlib(pos) > 1)
+       continue;
+       
+      /* Try to extend the string at (m, n). */
+      findlib(pos, 1, libs);
+      if (trymove(libs[0], other, "unconditional_life", pos)) {
+       moves_played++;
+       found_one = 1;
+      }
+    }
+  }
+
+  /* Now see whether there are any significant sekis on the board. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!potential_sekis[pos]
+       || board[pos] == EMPTY
+       || find_origin(pos) != pos)
+      continue;
+    for (r = 0; r < 4; r++) {
+      int up = delta[r];
+      int right = delta[(r + 1) % 4];
+      int locally_played_moves = 0;
+      if (board[pos + up] != color
+         || board[pos + up + up] != EMPTY
+         || board[pos - up] != EMPTY)
+       continue;
+      for (k = 0; k < 2; k++) {
+       if (k == 1)
+         right = -right;
+       if (board[pos + right] != EMPTY || board[pos + up - right] != EMPTY)
+         continue;
+       if (board[pos - right] == EMPTY
+           && trymove(pos - right, other, "unconditional_life", pos))
+         locally_played_moves++;
+       if (board[pos + up + right] == EMPTY
+           && trymove(pos + up + right, other, "unconditional_life", pos))
+         locally_played_moves++;
+       if (board[pos - right] == other && board[pos + up + right] == other
+           && same_string(pos - right, pos + up + right)) {
+         /* This is a critical seki. Extend the string with one stone
+           * in an arbitrary direction to break the seki.
+          */
+         while (locally_played_moves > 0) {
+           popgo();
+           locally_played_moves--;
+         }
+         trymove(pos - up, color, "unconditional_life", pos);
+         moves_played++;
+         break;
+       }
+       else {
+         while (locally_played_moves > 0) {
+           popgo();
+           locally_played_moves--;
+         }
+       }
+      }
+      if (countstones(pos) > 2)
+       break;
+    }
+  }
+
+  /* Capture the strings involved in potential sekis. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!potential_sekis[pos] || board[pos] == EMPTY)
+      continue;
+    /* Play as many liberties as we can. */
+    liberties = findlib(pos, MAXLIBS, libs);
+    for (k = 0; k < liberties; k++) {
+      if (trymove(libs[k], other, "unconditional_life", pos))
+       moves_played++;
+    }
+  }
+    
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int apos;
+    int bpos;
+    int aopen, bopen;
+    int alib, blib;
+    if (board[pos] != other || countlib(pos) != 2)
+      continue;
+    findlib(pos, 2, libs);
+    apos = libs[0];
+    bpos = libs[1];
+    if (abs(I(apos) - I(bpos)) + abs(J(apos) - J(bpos)) != 1)
+      continue;
+    
+    /* Only two liberties and these are adjacent. Play one. We want
+     * to maximize the number of open liberties. In this particular
+     * situation we can count this with approxlib for the opposite
+     * color. If the number of open liberties is the same, we
+     * maximize the total number of obtained liberties.
+     * Two relevant positions:
+     *
+     * |XXX. 
+     * |OOXX    |XXXXXXX
+     * |O.OX    |OOXOOOX
+     * |..OX    |..OO.OX
+     * +----    +-------
+     */
+    aopen = approxlib(apos, color, 4, NULL);
+    bopen = approxlib(bpos, color, 4, NULL);
+    alib  = approxlib(apos, other, 4, NULL);
+    blib  = approxlib(bpos, other, 4, NULL);
+    
+    if (aopen > bopen || (aopen == bopen && alib >= blib)) {
+      trymove(apos, other, "unconditional_life", pos);
+      moves_played++;
+    }
+    else {
+      trymove(bpos, other, "unconditional_life", pos);
+      moves_played++;
+    }
+  }
+  
+  /* Identify unconditionally alive stones and unconditional territory. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == color && !potential_sekis[pos]) {
+      unconditional_territory[pos] = 1;
+      if (find_origin(pos) == pos) {
+       liberties = findlib(pos, MAXLIBS, libs);
+       for (k = 0; k < liberties; k++)
+         unconditional_territory[libs[k]] = 2;
+      }
+    }
+    else if (board[pos] == other && countlib(pos) == 1) {
+      unconditional_territory[pos] = 2;
+      findlib(pos, 1, libs);
+      unconditional_territory[libs[0]] = 2;
+    }
+  }
+  
+  /* Take back all moves. */
+  while (moves_played > 0) {
+    popgo();
+    moves_played--;
+  }
+}
+
+
+/* By unconditional status analysis we can statically find some moves
+ * which there is never any need to play. Those belong to three
+ * different categories:
+ *
+ * 1. A move on a vertex which is already unconditional territory for
+ *    either color.
+ * 2. A move which after having been made ends up as unconditional
+ *    territory for the opponent.
+ * 3. If a move at vertex A makes vertex B become unconditional
+ *    territory, there is no need to consider a move at B, since A has
+ *    all the positive effects that B would have.
+ *
+ * Moves in categories 1 and 2 are never any better than passing and
+ * often worse (with territory scoring always worse). Moves in
+ * category three can be either better or worse than passing, but it's
+ * always true that a move at A is at least as good as a move at B.
+ * Occasionally they are identically good (A makes B unconditional
+ * territory and B makes A unconditional territory) but there is never
+ * any need to analyze both.
+ *
+ * In meaningless_black_moves[] and meaningless_white_moves[] a value
+ * of -1 means it is not meaningless, 0 (NO_MOVE) means it belongs to
+ * category 1 or 2, and a value greater than zero points to the
+ * preferred move in category 3.
+ *
+ * The parameter unconditional_territory should contain the result of
+ * calling unconditional_life() in the original position. Meaningless
+ * moves are computed for the given color.
+ */
+void
+find_unconditionally_meaningless_moves(int unconditional_territory[BOARDMAX],
+                                      int color)
+{
+  int *meaningless_moves;
+  int other = OTHER_COLOR(color);
+  int friendly_unconditional[BOARDMAX];
+  int opponent_unconditional[BOARDMAX];
+  int pos;
+  int pos2;
+
+  gg_assert(color == BLACK || color == WHITE);
+
+  if (color == BLACK)
+    meaningless_moves = meaningless_black_moves;
+  else
+    meaningless_moves = meaningless_white_moves;
+
+  /* Initialize meaningless_moves and detect moves of category 1, but
+   * only for own unconditional territory.
+   *
+   * FIXME: We would save some time by detecting all category 1 moves
+   * here but then we would need to have the initial unconditional
+   * territory for the opponent as well. This can of course be done,
+   * the question is how we get it in the nicest way.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == EMPTY) {
+      if (unconditional_territory[pos])
+       meaningless_moves[pos] = NO_MOVE;
+      else
+       meaningless_moves[pos] = -1;
+    }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != EMPTY || meaningless_moves[pos] != -1)
+      continue;
+
+    if (!tryko(pos, color, "find_unconditionally_meaningless_moves"))
+      continue;
+
+    unconditional_life(opponent_unconditional, other);
+    if (opponent_unconditional[pos]) {
+      /* Move of category 1 or 2. */
+      meaningless_moves[pos] = NO_MOVE;
+    }
+    else {
+      unconditional_life(friendly_unconditional, color);
+      if (friendly_unconditional[pos])
+       for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++)
+         if (board[pos2] == EMPTY
+             && meaningless_moves[pos2] == -1
+             && friendly_unconditional[pos2]) {
+           /* Move of category 3. */
+           meaningless_moves[pos2] = pos;
+         }
+    }
+
+    popgo();
+  }
+
+  /* Meaningless moves of category 3 may have been found in multiple
+   * steps. Normalize to the final replacement move.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == EMPTY && meaningless_moves[pos] > 0)
+      while (meaningless_moves[meaningless_moves[pos]] > 0)
+       meaningless_moves[pos] = meaningless_moves[meaningless_moves[pos]];
+}
+
+/* Returns 1 if the move at pos by color is meaningless and 0
+ * otherwise. When it is meaningless, *replacement_move will contain a
+ * replacing move, which is NO_MOVE if passing is guaranteed to be no
+ * worse than making the move.
+ */
+int
+unconditionally_meaningless_move(int pos, int color, int *replacement_move)
+{
+  if (color == WHITE && meaningless_white_moves[pos] != -1) {
+    *replacement_move = meaningless_white_moves[pos];
+    return 1;
+  }
+  if (color == BLACK && meaningless_black_moves[pos] != -1) {
+    *replacement_move = meaningless_black_moves[pos];
+    return 1;
+  }
+
+  return 0;
+}
+
+void
+clear_unconditionally_meaningless_moves()
+{
+  int pos;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      meaningless_black_moves[pos] = -1;
+      meaningless_white_moves[pos] = -1;
+    }
+}
+
+/* Pick up antisuji and replacement move reasons found by analysis
+ * of unconditional status.
+ */
+void
+unconditional_move_reasons(int color)
+{
+  int replacement_move;
+  int pos;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == EMPTY
+       && unconditionally_meaningless_move(pos, color, &replacement_move)) {
+      if (replacement_move == NO_MOVE) {
+       TRACE("%1m unconditional antisuji.\n", pos);
+       add_antisuji_move(pos);
+      }
+      else {
+       TRACE("%1m unconditionally replaced to %1m.\n", pos, replacement_move);
+       add_replacement_move(pos, replacement_move, color);
+      }
+    }
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/utils.c b/engine/utils.c
new file mode 100644 (file)
index 0000000..b08457a
--- /dev/null
@@ -0,0 +1,2004 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <math.h>
+
+#include "liberty.h"
+#include "sgftree.h"
+#include "random.h"
+#include "gg_utils.h"
+#include "patterns.h"
+
+/*
+ * Change the status of all the stones in the dragon at (dr).
+ */
+
+void
+change_dragon_status(int dr, enum dragon_status status)
+{
+  int pos;
+  int origin = dragon[dr].origin;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)) {
+      if (dragon[pos].origin == origin)
+       dragon[pos].status = status;
+    }
+}
+
+
+/*
+ * Check whether a move at (move) stops the enemy from playing at (apos).
+ */
+
+int
+defend_against(int move, int color, int apos)
+{
+  if (trymove(move, color, "defend_against", NO_MOVE)) {
+    if (safe_move(apos, OTHER_COLOR(color)) == 0) {
+      popgo();
+      return 1;
+    }
+    popgo();
+  }
+  return 0;
+}
+
+
+/* 
+ * Returns true if color can cut at (pos), or if connection through (pos)
+ * is inhibited. This information is collected by find_cuts(), using the B
+ * patterns in the connections database.
+ */
+
+int
+cut_possible(int pos, int color)
+{
+  return (cutting_points[pos] & OTHER_COLOR(color)) != 0;
+}
+
+
+/*
+ * does_attack(move, str) returns the result code for an attack on the
+ * string 'str' by the move 'move'. However, if the move does not
+ * improve the attack result compared to tenuki, 0 is returned. In
+ * particular if the string is already captured, does_attack() always
+ * returns 0.
+ */
+
+int
+does_attack(int move, int str)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int result = 0;
+  int acode = 0;
+  int dcode = 0;
+  int spos = NO_MOVE;
+  
+  attack_and_defend(str, &acode, NULL, &dcode, &spos);
+  if (acode != 0 && dcode == 0)
+    return 0;
+  
+  if (trymove(move, other, "does_attack-A", str)) {
+    if (!board[str])
+      result = WIN;
+    else
+      result = REVERSE_RESULT(find_defense(str, NULL));
+    if (result != 0) {
+      increase_depth_values();
+      if (spos != NO_MOVE && trymove(spos, color, "does_attack-B", str)) {
+       if (board[str]) {
+         int new_result = attack(str, NULL);
+         if (new_result < result)
+           result = new_result;
+       }
+       popgo();
+      }
+      decrease_depth_values();
+    }
+    popgo();
+  }
+
+  if (result < acode)
+    result = 0;
+  
+  return result;
+}
+
+
+/*
+ * does_defend(move, str) returns true if the move at (move)
+ * defends (str). This means that it defends the string, and that
+ * (str) can be captured if no defense is made.
+ *
+ * FIXME: Make does_defend() ko aware like does_attack().
+ */
+
+int
+does_defend(int move, int str)
+{
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+  int result = 0;
+  int spos = NO_MOVE;
+
+  if (!attack(str, &spos))
+    return 0;
+
+  gg_assert(spos != NO_MOVE);
+  
+  if (trymove(move, color, "does_defend-A", str)) {
+    if (!attack(str, NULL)) {
+      result = 1;
+      increase_depth_values();
+      if (trymove(spos, other, "does_defend-B", str)) {
+       if (!board[str] || !find_defense(str, NULL))
+         result = 0;
+       popgo();
+      }
+      decrease_depth_values();
+    }
+    popgo();
+  }
+
+  return result;
+}
+
+
+/* 
+ * Example: somewhere(WHITE, 2, apos, bpos, cpos).
+ * 
+ * Returns true if one of the vertices listed
+ * satisfies board[pos]==color. Here num_moves is the
+ * number of moves. If check_alive is true, the dragon is not allowed
+ * to be dead. This check is only valid if stackp==0.
+ */
+
+int
+somewhere(int color, int check_alive, int num_moves, ...)
+{
+  va_list ap;
+  int pos;
+  int k;
+
+  gg_assert(stackp == 0 || !check_alive);
+  
+  va_start(ap, num_moves);
+  for (k = 0; k < num_moves; k++) {
+    pos = va_arg(ap, int);
+
+    if (board[pos] == color
+       && (!check_alive || dragon[pos].status != DEAD)) {
+      va_end(ap);
+      return 1;
+    }
+  }
+
+  va_end(ap);
+  return 0;
+}
+
+/* Search along the edge for the first visible stone. Start at apos
+ * and move in the direction of bpos. Return 1 if the first visible
+ * stone is of the given color. It is required that apos and bpos are
+ * at the same distance from the edge.
+ *
+ * FIXME: The detection of the first visible stone is quite crude and
+ * probably needs to be improved.
+ */
+int
+visible_along_edge(int color, int apos, int bpos)
+{
+  int ai = I(apos);
+  int aj = J(apos);
+  int bi = I(bpos);
+  int bj = J(bpos);
+  int pos;
+  int forward;
+  int up;
+  ASSERT1((ai == bi) ^ (aj == bj), apos);
+
+  if (ai == bi) {
+    if (aj > bj)
+      forward = WEST(0);
+    else
+      forward = EAST(0);
+
+    if (ai < board_size/2) {
+      pos = POS(0, bj);
+      up = SOUTH(0);
+    }
+    else {
+      pos = POS(board_size - 1, bj);
+      up = NORTH(0);
+    }
+  }
+  else {
+    if (ai > bi)
+      forward = NORTH(0);
+    else
+      forward = SOUTH(0);
+
+    if (aj < board_size/2) {
+      pos = POS(bi, 0);
+      up = EAST(0);
+    }
+    else {
+      pos = POS(bi, board_size - 1);
+      up = WEST(0);
+    }
+  }
+  
+  for (; ON_BOARD(pos); pos += forward) {
+    int k;
+    for (k = 4; k >= 0; k--) {
+      ASSERT_ON_BOARD1(pos + k * up);
+      if (board[pos + k * up] == color)
+       return 1;
+      else if (board[pos + k * up] == OTHER_COLOR(color))
+       return 0;
+    }
+  }
+
+  return 0;
+}
+
+/* Is the board symmetric (or rather antisymmetric) with respect to
+ * mirroring in tengen after a specific move has been played? If the
+ * move is PASS_MOVE, check the current board.
+ *
+ * If strict is set we require that each stone is matched by a stone
+ * of the opposite color at the mirrored vertex. Otherwise we only
+ * require that each stone is matched by a stone of either color.
+ */
+int
+test_symmetry_after_move(int move, int color, int strict)
+{
+  int pos;
+  int result = 1;
+
+  if (move != PASS_MOVE) {
+    if (board[move] != EMPTY)
+      return 0;
+    if (!trymove(move, color, "find_mirror_move", NO_MOVE))
+      return 0;
+  }
+  
+  for (pos = BOARDMIN; pos < MIRROR_MOVE(pos); pos++) {
+    int sum;
+    if (!ON_BOARD(pos))
+      continue;
+    
+    sum = board[pos] + board[MIRROR_MOVE(pos)];
+    if (sum != EMPTY + EMPTY && sum != BLACK + WHITE) {
+      if (strict || sum == EMPTY + WHITE || sum == EMPTY + BLACK) {
+       result = 0;
+       break;
+      }
+    }
+  }
+
+  if (move != PASS_MOVE)
+    popgo();
+  
+  return result;
+}
+
+
+/* The function play_break_through_n() plays a sequence of moves,
+ * alternating between the players and starting with color. After
+ * having played through the sequence, the three last coordinate pairs
+ * gives a position to be analyzed by break_through(), to see whether
+ * either color has managed to enclose some stones and/or connected
+ * his own stones. If any of the three last positions is empty, it's
+ * assumed that the enclosure has failed, as well as the attempt to
+ * connect.
+ *
+ * If one or more of the moves to play turns out to be illegal for
+ * some reason, the rest of the sequence is played anyway, and
+ * break_through() is called as if nothing special happened.
+ *
+ * Like break_through(), this function returns 1 if the attempt to
+ * break through was succesful and 2 if it only managed to cut
+ * through.
+ */
+   
+int
+play_break_through_n(int color, int num_moves, ...)
+{
+  va_list ap;
+  int mcolor = color;
+  int success = 0;
+  int i;
+  int played_moves = 0;
+  int apos;
+  int xpos;
+  int ypos;
+  int zpos;
+  
+  va_start(ap, num_moves);
+
+  /* Do all the moves with alternating colors. */
+  for (i = 0; i < num_moves; i++) {
+    apos = va_arg(ap, int);
+
+    if (apos != NO_MOVE
+       && (trymove(apos, mcolor, "play_break_through_n", NO_MOVE)
+           || tryko(apos, mcolor, "play_break_through_n")))
+      played_moves++;
+    mcolor = OTHER_COLOR(mcolor);
+  }
+
+  /* Now do the real work. */
+  xpos = va_arg(ap, int);
+  ypos = va_arg(ap, int);
+  zpos = va_arg(ap, int);
+    
+  /* Temporarily increase the depth values with the number of explicitly
+   * placed stones.
+   */
+#if 0
+  modify_depth_values(played_moves);
+#endif
+  
+  if (board[xpos] == EMPTY
+      || board[ypos] == EMPTY
+      || board[zpos] == EMPTY)
+    success = 1;
+  else
+    success = break_through(xpos, ypos, zpos);
+
+#if 0
+  modify_depth_values(-played_moves);
+#endif
+  
+  /* Pop all the moves we could successfully play. */
+  for (i = 0; i < played_moves; i++)
+    popgo();
+
+  va_end(ap);
+  return success;
+}
+
+
+/* The function play_attack_defend_n() plays a sequence of moves,
+ * alternating between the players and starting with color. After
+ * having played through the sequence, the last coordinate pair gives
+ * a target to attack or defend, depending on the value of do_attack.
+ * If there is no stone present to attack or defend, it is assumed
+ * that it has already been captured. If one or more of the moves to
+ * play turns out to be illegal for some reason, the rest of the
+ * sequence is played anyway, and attack/defense is tested as if
+ * nothing special happened.
+ *
+ * A typical use for these functions is to set up a ladder in an
+ * autohelper and see whether it works or not.
+ */
+   
+int
+play_attack_defend_n(int color, int do_attack, int num_moves, ...)
+{
+  va_list ap;
+  int mcolor = color;
+  int success = 0;
+  int i;
+  int played_moves = 0;
+  int apos;
+  int zpos;
+  
+  va_start(ap, num_moves);
+
+  /* Do all the moves with alternating colors. */
+  for (i = 0; i < num_moves; i++) {
+    apos = va_arg(ap, int);
+
+    if (apos != NO_MOVE
+       && (trymove(apos, mcolor, "play_attack_defend_n", NO_MOVE)
+           || tryko(apos, mcolor, "play_attack_defend_n")))
+      played_moves++;
+    mcolor = OTHER_COLOR(mcolor);
+  }
+
+  /* Now do the real work. */
+  zpos = va_arg(ap, int);
+
+  /* Temporarily increase the depth values with the number of explicitly
+   * placed stones.
+   *
+   * This improves the reading of pattern constraints but
+   * unfortunately tends to be too expensive. For the time being it is
+   * disabled.
+   */
+#if 0
+  modify_depth_values(played_moves);
+#endif
+  
+  if (do_attack) {
+    if (board[zpos] == EMPTY)
+      success = WIN;
+    else
+      success = attack(zpos, NULL);
+  }
+  else {
+    if (board[zpos] == EMPTY)
+      success = 0;
+    else {
+      int dcode = find_defense(zpos, NULL);
+      if (dcode == 0 && !attack(zpos, NULL))
+       success = WIN;
+      else
+       success = dcode;
+    }
+  }
+
+#if 0
+  modify_depth_values(-played_moves);
+#endif
+  
+  /* Pop all the moves we could successfully play. */
+  for (i = 0; i < played_moves; i++)
+    popgo();
+
+  va_end(ap);
+  return success;
+}
+
+
+/* The function play_attack_defend2_n() plays a sequence of moves,
+ * alternating between the players and starting with color. After
+ * having played through the sequence, the two last coordinate pairs
+ * give two targets to simultaneously attack or defend, depending on
+ * the value of do_attack. If there is no stone present to attack or
+ * defend, it is assumed that it has already been captured. If one or
+ * more of the moves to play turns out to be illegal for some reason,
+ * the rest of the sequence is played anyway, and attack/defense is
+ * tested as if nothing special happened.
+ *
+ * A typical use for these functions is to set up a crosscut in an
+ * autohelper and see whether at least one cutting stone can be
+ * captured.
+ */
+   
+int
+play_attack_defend2_n(int color, int do_attack, int num_moves, ...)
+{
+  va_list ap;
+  int mcolor = color;
+  int success = 0;
+  int i;
+  int played_moves = 0;
+  int apos;
+  int ypos;
+  int zpos;
+  
+  va_start(ap, num_moves);
+
+  /* Do all the moves with alternating colors. */
+  for (i = 0; i < num_moves; i++) {
+    apos = va_arg(ap, int);
+
+    if (apos != NO_MOVE
+       && (trymove(apos, mcolor, "play_attack_defend_n", NO_MOVE)
+           || tryko(apos, mcolor, "play_attack_defend_n")))
+      played_moves++;
+    mcolor = OTHER_COLOR(mcolor);
+  }
+
+  /* Now do the real work. */
+  ypos = va_arg(ap, int);
+  zpos = va_arg(ap, int);
+
+  /* Temporarily increase the depth values with the number of explicitly
+   * placed stones.
+   */
+#if 0
+  modify_depth_values(played_moves);
+#endif
+  
+
+  /* FIXED: tm - returns ko results correctly (3.1.22) */
+  if (do_attack) {
+    if (board[ypos] == EMPTY || board[zpos] == EMPTY)
+      success = WIN;
+    else
+      success = attack_either(ypos, zpos);
+  }
+  else {
+    if (board[ypos] == EMPTY || board[zpos] == EMPTY)
+      success = 0;
+    else
+      success = defend_both(ypos, zpos);
+  }
+
+#if 0
+  modify_depth_values(-played_moves);
+#endif
+  
+  /* Pop all the moves we could successfully play. */
+  for (i = 0; i < played_moves; i++)
+    popgo();
+
+  va_end(ap);
+  return success;
+}
+
+
+/* The function play_connect_n() plays a sequence of moves,
+ * alternating between the players and starting with color. After
+ * having played through the sequence, the two last coordinates
+ * give two targets that should be connected or disconnected, depending on
+ * the value of do_connect. If there is no stone present to connect or
+ * disconnect, it is assumed that the connection has failed. If one or
+ * more of the moves to play turns out to be illegal for some reason,
+ * the rest of the sequence is played anyway, and connection/disconnection
+ * is tested as if nothing special happened.
+ */
+
+int 
+play_connect_n(int color, int do_connect, int num_moves, ...)
+{
+  va_list ap;
+  int mcolor = color;
+  int success = 0;
+  int i;
+  int played_moves = 0;
+  int apos;
+  int ypos;
+  int zpos;
+
+  va_start(ap, num_moves);
+
+  /* Do all the moves with alternating colors. */
+  for (i = 0; i < num_moves; i++) {
+    apos = va_arg(ap, int);
+
+    if (apos != NO_MOVE
+       && (trymove(apos, mcolor, "play_connect_n", NO_MOVE)
+           || tryko(apos, mcolor, "play_connect_n")))
+      played_moves++;
+    mcolor = OTHER_COLOR(mcolor);
+  }
+
+  /* Now do the real work. */
+  ypos = va_arg(ap, int);
+  zpos = va_arg(ap, int);
+
+  /* Temporarily increase the depth values with the number of explicitly
+   * placed stones.
+   *
+   * This improves the reading of pattern constraints but
+   * unfortunately tends to be too expensive. For the time being it is
+   * disabled.
+   */
+#if 0
+  modify_depth_values(played_moves);
+#endif
+  
+  /* See if ypos and zpos can be connected (or disconnected). */
+  if (do_connect) {
+    if (board[ypos] == EMPTY || board[zpos] == EMPTY)
+      success = 0;
+    else
+      success = string_connect(ypos, zpos, NULL);
+  }
+  else {
+    if (board[ypos] == EMPTY || board[zpos] == EMPTY)
+      success = WIN;
+    else
+      success = disconnect(ypos, zpos, NULL);
+  }
+
+#if 0
+  modify_depth_values(-played_moves);
+#endif
+  
+  /* Pop all the moves we could successfully play. */
+  for (i = 0; i < played_moves; i++)
+    popgo();
+
+  va_end(ap);
+  return success;
+}
+
+
+/* The function play_lib_n() plays a sequence of moves, alternating
+ * between the players and starting with color. After having played
+ * through the sequence, the last coordinate gives a target for liberty
+ * counting. The number of liberties is returned.
+ *
+ * If only one move is to be played and that stone is the target,
+ * accuratelib (or approxlib if appropriate) is more efficient.
+ */
+
+int 
+play_lib_n(int color, int num_moves, ...)
+{
+  va_list ap;
+  int mcolor = color;
+  int libs = 0;
+  int i;
+  int played_moves = 0;
+  int apos;
+  int ypos;
+
+  va_start(ap, num_moves);
+
+  /* Do all the moves with alternating colors. */
+  for (i = 0; i < num_moves; i++) {
+    apos = va_arg(ap, int);
+
+    if (apos != NO_MOVE
+       && (trymove(apos, mcolor, "play_connect_n", NO_MOVE)
+           || tryko(apos, mcolor, "play_connect_n")))
+      played_moves++;
+    mcolor = OTHER_COLOR(mcolor);
+  }
+
+  /* Now do the real work. */
+  ypos = va_arg(ap, int);
+  if (board[ypos] == EMPTY)
+    libs = 0;
+  else
+    libs = countlib(ypos);
+  
+  /* Pop all the moves we could successfully play. */
+  for (i = 0; i < played_moves; i++)
+    popgo();
+
+  va_end(ap);
+  return libs;
+}
+
+
+
+/* 
+ * It is assumed in reading a ladder if stackp >= depth that
+ * as soon as a bounding stone is in atari, the string is safe.
+ * It is used similarly at other places in reading.c to implement simplifying
+ * assumptions when stackp is large. DEPTH is the default value of depth.
+ *
+ * Unfortunately any such scheme invites the ``horizon effect.'' Increasing
+ * DEPTH will make the program stronger and slower.
+ *
+ */
+
+/* Tactical reading using C functions */
+#define DEPTH                16
+#define BRANCH_DEPTH         13
+#define BACKFILL_DEPTH       12
+#define BACKFILL2_DEPTH       5
+#define BREAK_CHAIN_DEPTH     7
+#define SUPERSTRING_DEPTH     7
+#define FOURLIB_DEPTH         7
+#define KO_DEPTH              8
+
+#if 0
+#undef FOURLIB_DEPTH
+#define FOURLIB_DEPTH         9
+#endif
+
+
+#define AA_DEPTH              6
+
+/* Pattern based reading */
+#define OWL_DISTRUST_DEPTH    6
+#define OWL_BRANCH_DEPTH      8
+#define OWL_READING_DEPTH    20
+#define SEMEAI_BRANCH_DEPTH  12
+#define SEMEAI_BRANCH_DEPTH2  6
+
+/* Connecton reading */
+#define CONNECT_NODE_LIMIT 2000
+#define CONNECT_DEPTH        64
+#define CONNECT_DEPTH2       20
+
+#define BREAKIN_NODE_LIMIT  400
+#define BREAKIN_DEPTH       14
+
+/* Set the various reading depth parameters. If mandated_depth_value
+ * is not -1 that value is used; otherwise the depth values are
+ * set as a function of level. The parameter mandated_depth_value
+ * can be set at the command line to force a particular value of
+ * depth; normally it is -1.
+ */
+
+void
+set_depth_values(int level, int report_levels)
+{
+  static int node_limits[] = {500, 500, 450, 400, 400, 325, 275,
+                             200, 150, 100, 75, 50};
+  int depth_level;
+
+  /*
+   * Other policies depending on level:
+   * owl.c:         >=  9: use vital attack pattern database
+   *                >=  8: increase depth values in owl_substantial
+   *                >=  8: don't turn off owl_phase in semeai reading
+   * reading.c:     >=  8: Use superstrings and do more backfilling.
+   * value_moves.c: >=  6: try to find more owl attacks/defenses
+   * breakin.c:     >= 10: try to find break-ins. (*)
+   * worm.c:        >= 10: detect unconditionally meaningless moves
+   *
+   * The break-in code (*) is particularly expensive. 
+   *
+   * Speedups between levels 9 and 10 and between levels 7 and 8
+   * are obtained by turning off services, and between these
+   * levels no changes are made in the depths. The parameter
+   * depth_level is the correction compared to the default settings at level
+   * 10 for most reading depths.
+   */
+  if (level >= 10)
+    depth_level = level - 10;
+  else if (level == 9)
+    depth_level = 0;
+  else if (level == 8)
+    depth_level = -1;
+  else 
+    depth_level = level - 8;
+
+  depth                = gg_max(6, DEPTH           + depth_level);
+  branch_depth         = gg_max(3, BRANCH_DEPTH            + depth_level);
+  backfill_depth       = gg_max(2, BACKFILL_DEPTH    + depth_level);
+  backfill2_depth      = gg_max(1, BACKFILL2_DEPTH   + depth_level);
+  break_chain_depth    = gg_max(2, BREAK_CHAIN_DEPTH + depth_level);
+  if (level >= 8)
+    owl_distrust_depth = gg_max(1, (2 * OWL_DISTRUST_DEPTH + depth_level) / 2);
+  else
+    owl_distrust_depth = gg_max(1, (2 * OWL_DISTRUST_DEPTH - 1
+                                   + depth_level) / 2);
+  owl_branch_depth     = gg_max(2, (2 * OWL_BRANCH_DEPTH   + depth_level) / 2);
+  owl_reading_depth    = gg_max(5, (2 * OWL_READING_DEPTH  + depth_level) / 2);
+
+  /* Atari-atari depth levels are unchanged only between levels 7/8, 9/10: */
+  if (level >= 10)
+    aa_depth = gg_max(0, AA_DEPTH + (level - 10));
+  else if (level == 9)
+    aa_depth = gg_max(0, AA_DEPTH);
+  else if (level >= 7)
+    aa_depth = gg_max(0, AA_DEPTH - 1);
+  else
+    aa_depth = gg_max(0, AA_DEPTH - (8 - level));
+
+  /* Exceptions:
+   * fourlib_depth: This is constant from levels 7 to 10.
+   * superstring_depth: set to 0 below level 8.
+   */
+  if (level >= 10)
+    ko_depth            = gg_max(1, KO_DEPTH + (level - 10));
+  else if (level == 9)
+    ko_depth            = gg_max(1, KO_DEPTH);
+  else if (level >= 7)
+    ko_depth            = gg_max(1, KO_DEPTH - 1);
+  else
+    ko_depth            = gg_max(1, KO_DEPTH + (level - 8));
+
+  if (level >= 10)
+    fourlib_depth       = gg_max(1, FOURLIB_DEPTH + (level - 10));
+  else if (level >= 7)
+    fourlib_depth       = gg_max(1, FOURLIB_DEPTH);
+  else
+    fourlib_depth       = gg_max(1, FOURLIB_DEPTH + (level - 7));
+
+  if (level >= 8)
+    superstring_depth = gg_max(1, SUPERSTRING_DEPTH);
+  else
+    superstring_depth = 0;
+
+  if (level >= 10)
+    owl_node_limit      = OWL_NODE_LIMIT * pow(1.5, depth_level);
+  else {
+    owl_node_limit      = (OWL_NODE_LIMIT * node_limits[10 - level] /
+                          node_limits[0]);
+    owl_node_limit      = gg_max(20, owl_node_limit);
+  }
+
+  semeai_branch_depth  = gg_max(2, (2*SEMEAI_BRANCH_DEPTH  + depth_level) / 2);
+  semeai_branch_depth2 = gg_max(2, (2*SEMEAI_BRANCH_DEPTH2 + depth_level) / 2);
+  semeai_node_limit    = SEMEAI_NODE_LIMIT * pow(1.5, depth_level);
+
+  connect_depth         = gg_max(2, CONNECT_DEPTH  + 2 * depth_level);
+  connect_depth2        = gg_max(2, CONNECT_DEPTH2 + 2 * depth_level);
+  connection_node_limit = CONNECT_NODE_LIMIT * pow(1.45, depth_level);
+  breakin_depth        = gg_max(2, BREAKIN_DEPTH + 2 * depth_level);
+  breakin_node_limit   = BREAKIN_NODE_LIMIT * pow(1.5, depth_level);
+
+  if (mandated_depth != -1)
+    depth = mandated_depth;
+  if (mandated_backfill_depth != -1)
+    backfill_depth = mandated_backfill_depth;
+  if (mandated_backfill2_depth != -1)
+    backfill2_depth = mandated_backfill2_depth;
+  if (mandated_break_chain_depth != -1)
+    break_chain_depth = mandated_break_chain_depth;
+  if (mandated_superstring_depth != -1)
+    superstring_depth = mandated_superstring_depth;
+  if (mandated_branch_depth != -1)
+    branch_depth = mandated_branch_depth;
+  if (mandated_fourlib_depth != -1)
+    fourlib_depth = mandated_fourlib_depth;
+  if (mandated_ko_depth != -1)
+    ko_depth = mandated_ko_depth;
+  if (mandated_aa_depth != -1)
+    aa_depth = mandated_aa_depth;
+  if (mandated_owl_distrust_depth != -1)
+    owl_distrust_depth = mandated_owl_distrust_depth;
+  if (mandated_owl_branch_depth != -1)
+    owl_branch_depth = mandated_owl_branch_depth;
+  if (mandated_owl_reading_depth != -1)
+    owl_reading_depth = mandated_owl_reading_depth;
+  if (mandated_owl_node_limit != -1)
+    owl_node_limit = mandated_owl_node_limit;
+  if (mandated_semeai_node_limit != -1)
+    semeai_node_limit = mandated_semeai_node_limit;
+
+  depth_offset = 0;
+  
+  if (report_levels) {
+    fprintf(stderr, "at level %d:\n\n\
+depth: %d\n\
+branch_depth: %d\n\
+backfill_depth: %d\n\
+backfill2_depth: %d\n\
+break_chain_depth: %d\n\
+owl_distrust_depth: %d\n\
+owl_branch_depth: %d\n\
+owl_reading_depth: %d\n\
+aa_depth: %d\n\
+ko_depth: %d\n\
+fourlib_depth: %d\n\
+superstring_depth: %d\n\
+owl_node_limit: %d\n\
+semeai_branch_depth: %d\n\
+semeai_branch_depth2: %d\n\
+semeai_node_limit: %d\n\
+connect_depth: %d\n\
+connect_depth2: %d\n\
+connection_node_limit: %d\n\
+breakin_depth: %d\n\
+breakin_node_limit: %d\n\n",
+           level, depth, branch_depth, backfill_depth, backfill2_depth,
+           break_chain_depth, owl_distrust_depth, owl_branch_depth,
+           owl_reading_depth, aa_depth, ko_depth, fourlib_depth,
+           superstring_depth, owl_node_limit, semeai_branch_depth, 
+           semeai_branch_depth2, semeai_node_limit, connect_depth, 
+            connect_depth2, connection_node_limit, breakin_depth, 
+           breakin_node_limit);
+  }
+}
+
+
+static int depth_modification = 0;
+
+/*
+ * Modify the various tactical reading depth parameters. This is
+ * typically used to avoid horizon effects. By temporarily increasing
+ * the depth values when trying some move, one can avoid that an
+ * irrelevant move seems effective just because the reading hits a
+ * depth limit earlier than it did when reading only on relevant
+ * moves.
+ */
+
+void
+modify_depth_values(int n)
+{
+  depth              += n;
+  backfill_depth     += n;
+  backfill2_depth    += n;
+  break_chain_depth  += n;
+  superstring_depth  += n;
+  branch_depth       += n;
+  fourlib_depth      += n;
+  ko_depth           += n;
+  breakin_depth             += n;
+  depth_offset       += n;
+  depth_modification += n;
+}
+
+void
+increase_depth_values(void)
+{
+  modify_depth_values(1);
+}
+
+void
+decrease_depth_values(void)
+{
+  modify_depth_values(-1);
+}
+
+int
+get_depth_modification(void)
+{
+  return depth_modification;
+}
+
+
+/*******************
+ * Detect blunders *
+ *******************/
+
+static int detect_owl_blunder(int move, int color, int *defense_point,
+                             signed char safe_stones[BOARDMAX], int liberties,
+                             float *return_value, int save_verbose);
+
+static void detect_tactical_blunder(int move, int color, int *defense_point,
+                                   signed char safe_stones[BOARDMAX],
+                                   int liberties, int *libs,
+                                   float *return_value, int save_verbose);
+
+/* Check that the move at color doesn't involve any kind of blunder,
+ * regardless of size.
+ */
+int
+confirm_safety(int move, int color, int *defense_point,
+              signed char safe_stones[BOARDMAX])
+{
+  return (blunder_size(move, color, defense_point, safe_stones) == 0.0);
+}
+
+/* This function will detect some blunders. If the move reduces the
+ * number of liberties of an adjacent friendly string, there is a
+ * danger that the move could backfire, so the function checks that no
+ * friendly worm which was formerly not attackable becomes attackable,
+ * and it checks that no opposing worm which was not defendable
+ * becomes defendable.
+ *
+ * It returns the estimated size of the blunder, or 0.0 if nothing
+ * bad has happened.
+ *
+ * The array safe_stones[] contains the stones that are supposedly
+ * safe after (move). It may be NULL.
+ *
+ * For use when called from fill_liberty, this function may optionally
+ * return a point of defense, which, if taken, will presumably make
+ * the move at (move) safe on a subsequent turn.
+ */
+
+float
+blunder_size(int move, int color, int *defense_point,
+            signed char safe_stones[BOARDMAX])
+{
+  int libs[5];
+  int liberties = accuratelib(move, color, 5, libs);
+  int trouble = 0;
+  int save_verbose = verbose;
+  float return_value = 0.0;
+  int atari;
+  signed char defense_moves[BOARDMAX];
+  
+  if (defense_point)
+    *defense_point = NO_MOVE;
+
+  TRACE("Checking safety of a %s move at %1m\n", color_to_string(color), move);
+
+  if (verbose > 0)
+    verbose--;
+
+  /* We start by checking whether we have accidentally killed an own
+   * dragon.
+   */
+  trouble = detect_owl_blunder(move, color, defense_point,
+                              safe_stones, liberties,
+                              &return_value, save_verbose);
+  
+
+  /* Next we see whether the move has caused tactical complications.
+   * The trouble variable is set if a string next to the move with few
+   * liberties has not gained liberties by the move.
+   */
+  if (trouble)
+    detect_tactical_blunder(move, color, defense_point, safe_stones,
+                           liberties, libs, &return_value, save_verbose);
+
+  /* FIXME: We would also need a detect_semeai_blunder() to check
+   * against moves which make the outcome of a semeai worse, e.g. by
+   * letting the opponent live in seki.
+   */
+
+  
+  /* Finally we call the atari-atari code to see whether the move has
+   * set up some combination attack that didn't exist before. We do
+   * this last to avoid duplicate blunder reports.
+   */
+  atari = atari_atari_blunder_size(color, move, defense_moves, safe_stones);
+  if (atari) {
+    if (defense_point) {
+      /* FIXME: Choose defense point more systematically. */
+      int pos;
+      *defense_point = NO_MOVE;
+      for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+       if (ON_BOARD(pos) && defense_moves[pos]) {
+         *defense_point = pos;
+         break;
+       }
+    }
+    verbose = save_verbose;
+    TRACE("Combination attack appears.\n");
+    return_value += (float) atari;
+  }
+
+  verbose = save_verbose;
+  return return_value;
+}
+
+/* Check whether we have accidentally killed an own dragon adjacent to
+ * move. If this happens, we mark its stones as no longer safe, and
+ * remember the dragon's size.
+ */
+
+static int
+detect_owl_blunder(int move, int color, int *defense_point,
+                  signed char safe_stones[BOARDMAX], int liberties,
+                  float *return_value, int save_verbose)
+{
+  int k;
+  int ii;
+  int trouble = 0;
+  int dragon_analyzed[4] = {0, 0, 0, 0};
+  int current_verbose = verbose;
+  
+  for (k = 0; k < 4; k++) {
+    int bpos = move + delta[k];
+    int j;
+    /* We get worried if there is a liberty problem (and in this case
+     * there might also be tactical trouble), or if we play inside
+     * our eye space and the dragon is only just alive.
+     */
+    if (board[bpos] != color)
+      continue;
+    if (liberties <= worm[bpos].liberties
+       && liberties <= 4)
+      trouble = 1;
+    else
+      if (min_eyes(&(DRAGON2(bpos).genus)) > 2
+         || !is_proper_eye_space(move))
+       continue;
+
+    /* Don't test the same dragon twice. */
+    for (j = 0; j < k; j++)
+      if (dragon_analyzed[j] == dragon[bpos].origin)
+       break;
+    if (j < k)
+      continue;
+    dragon_analyzed[k] = dragon[bpos].origin;
+
+    /* Don't reanalyze if (move) is an owl defense for (bpos). */
+    if (safe_stones && safe_stones[bpos] == OWL_SAVED_STONE)
+      continue;
+
+    if ((dragon[bpos].status == ALIVE
+        || (safe_stones 
+            && safe_stones[bpos]))
+       && DRAGON2(bpos).safety != INVINCIBLE
+       && DRAGON2(bpos).safety != STRONGLY_ALIVE) {
+      int kworm = NO_MOVE;
+      int acode = owl_confirm_safety(move, bpos, defense_point, &kworm);
+
+      /* If owl couldn't confirm safety, maybe semeai can. */
+      if (acode != WIN) {
+       int r;
+       for (r = 0; r < DRAGON2(bpos).neighbors; r++) {
+         int neighbor = dragon2[DRAGON2(bpos).adjacent[r]].origin;
+         int resultb;
+         if (board[neighbor] == color)
+           continue;
+         owl_analyze_semeai_after_move(move, color, neighbor, bpos,
+                                       NULL, &resultb, NULL, 1, NULL, 0);
+         if (resultb == 0)
+           acode = WIN;
+       }
+      }
+      
+      if (acode == 0) {
+       verbose = save_verbose;
+       TRACE("Dragon at %1m becomes attackable.\n", bpos);
+       verbose = current_verbose;
+       *return_value += 2.0 * dragon[bpos].effective_size;
+       if (safe_stones)
+         mark_dragon(bpos, safe_stones, 0);
+      }
+      else if (acode == LOSS) {
+       verbose = save_verbose;
+       TRACE("Dragon at %1m becomes attackable.\n", bpos);
+       verbose = current_verbose;
+       if (kworm == move) {
+         int l;
+         /* the worm origin was messed by our own move */
+         for (l = 0; l < 4; l++) {
+           int kworm = move + delta[l];
+           if (board[kworm] == color) {
+             *return_value += 2.0 * worm[kworm].effective_size;
+             if (safe_stones)
+               for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+                 if (ON_BOARD(ii) && worm[ii].origin == worm[kworm].origin)
+                   safe_stones[ii] = 0;
+           }
+         }
+       }
+       else {
+         *return_value += 2.0 * worm[kworm].effective_size;
+         if (safe_stones)
+           for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+             if (ON_BOARD(ii) && worm[ii].origin == worm[kworm].origin)
+               safe_stones[ii] = 0;
+       }
+      }
+    }
+  }
+
+  return trouble;
+}
+
+/* Check whether a move causes any unexpected and unwelcome changes in
+ * the tactical status of worms all over the board.
+ */
+static void
+detect_tactical_blunder(int move, int color, int *defense_point,
+                       signed char safe_stones[BOARDMAX],
+                       int liberties, int *libs,
+                       float *return_value, int save_verbose)
+{
+  int other = OTHER_COLOR(color);
+  int pos;
+  int ii;
+  int current_verbose = verbose;
+
+  if (!trymove(move, color, NULL, NO_MOVE))
+    return;
+  
+  /* Need to increase the depth values during this reading to avoid
+   * horizon effects.
+   */
+  increase_depth_values();
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!IS_STONE(board[pos])
+       || worm[pos].origin != pos
+       || pos == move)
+      continue;
+    
+    /* First, we look for a new tactical attack.
+     * FIXME: Verify that the tactically attacked stone matters. See
+     *        e.g. the D6 move in filllib:51 which invites a harmless
+     *        tactical attack of A4.
+     */
+    if (board[pos] == color
+       && ((safe_stones && safe_stones[pos])
+           || (!safe_stones && worm[pos].attack_codes[0] == 0))
+       && attack(pos, NULL)) {
+      /* A safe worm of ours has become attackable. */
+      if (defense_point) {
+       find_defense(pos, defense_point);
+       /* Check that this move is legal and effective also on the
+        * original board, otherwise find a tactical defense there
+        * instead.
+        */
+       popgo();
+       
+       if (!is_legal(*defense_point, color)
+           || play_attack_defend_n(color, 1, 1, *defense_point, pos))
+         find_defense(pos, defense_point);
+       
+       /* Redo the move, we know that it won't fail. */
+       trymove(move, color, NULL, NO_MOVE);
+      }
+      verbose = save_verbose;
+      TRACE("After %1m Worm at %1m becomes attackable.\n", move, pos);
+      verbose = current_verbose;
+      *return_value += worm[pos].effective_size;
+      if (safe_stones) /* Can't use mark_string. */
+       for (ii = BOARDMIN; ii < BOARDMAX; ii++)
+         if (worm[ii].origin == worm[pos].origin)
+           safe_stones[ii] = 0;
+    }
+    else if (board[pos] == other
+            && worm[pos].origin == pos
+            && worm[pos].attack_codes[0] != 0
+            && worm[pos].defense_codes[0] == 0
+            && find_defense(pos, NULL)) {
+      /* A dead opponent's worm has become defendable.
+       * Also ask the owl code whether the string can live
+       * strategically. To do this we need to temporarily undo
+       * the trymove().
+       */
+      int owl_attacks;
+      int defense_effective = 0;
+      
+      popgo();
+      decrease_depth_values();
+      owl_attacks = owl_does_attack(move, pos, NULL);
+      if (owl_attacks != WIN) {
+       *return_value += 2 * worm[pos].effective_size;
+       defense_effective = 1;
+       verbose = save_verbose;
+       TRACE("After %1m worm at %1m becomes defendable - A.\n", move, pos);
+       verbose = current_verbose;
+      }
+      else if (dragon[pos].status != ALIVE) {
+       /* Before redoing the trymove we also check whether the worm now
+        * has a semeai defense. See blunder:26 for an example.
+        *
+        * If the worm already was alive in seki, it is generally okay
+        * that it also becomes tactically safe when the outer
+        * liberties are filled, see e.g. blunder:32,34. Thus the
+        * check above.
+        */
+       int k;
+       int adj[MAXCHAIN];
+       int num_adj;
+       num_adj = extended_chainlinks(pos, adj, 0);
+       for (k = 0; k < num_adj; k++) {
+         int neighbor = adj[k];
+         int resulta;
+         owl_analyze_semeai_after_move(move, color, pos, neighbor,
+                                       &resulta, NULL, NULL, 1, NULL, 1);
+         if (resulta != 0) {
+           *return_value += 2 * worm[pos].effective_size;
+           defense_effective = 1;
+           verbose = save_verbose;
+           TRACE("After %1m worm at %1m becomes defendable - B.\n",
+                 move, pos);
+           verbose = current_verbose;
+           break;
+         }
+       }
+      }
+      
+      trymove(move, color, NULL, NO_MOVE);
+      increase_depth_values();
+      
+      if (defense_effective && defense_point) {
+       int dpos;
+       if (attack(pos, &dpos)) {
+         *defense_point = dpos;
+         /* Check that this move is legal and effective also on the
+           * original board, otherwise find a tactical attack there
+           * instead.
+          */
+         popgo();
+         
+         if (!is_legal(dpos, color)
+             || play_attack_defend_n(color, 0, 1, dpos, pos))
+           attack(pos, defense_point);
+
+         /* Redo the move, we know that it won't fail. */
+         trymove(move, color, NULL, NO_MOVE);
+       }
+       else {
+         verbose = save_verbose;
+         TRACE("No attack found (unexpectedly) on %1m after move at %1m.\n",
+               pos, move);
+         verbose = current_verbose;
+       }
+      }
+    }
+  }
+
+  /* Look for double atari style complications of the move.
+   *
+   * FIXME: Since we have an atari_atari check in blunder_size(), do
+   * we still need to do this step?
+   */
+  if (liberties == 2) {
+    float d_a_blunder_size;
+    if (double_atari(libs[0], other, &d_a_blunder_size, safe_stones)) {
+      if (defense_point && safe_move(libs[0], color) == WIN)
+       *defense_point = libs[0];
+      *return_value += d_a_blunder_size;
+      verbose = save_verbose;
+      TRACE("Double threat appears at %1m.\n", libs[0]);
+      verbose = current_verbose;
+    }
+    else if (double_atari(libs[1], other, &d_a_blunder_size, safe_stones)) {
+      if (defense_point && safe_move(libs[1], color) == WIN)
+       *defense_point = libs[1];
+      *return_value += d_a_blunder_size;
+      verbose = save_verbose;
+      TRACE("Double threat appears at %1m.\n", libs[1]);
+      verbose = current_verbose;
+    }
+  }
+  
+  /* Reset the depth values. */
+  decrease_depth_values();
+
+  popgo();
+}
+
+
+/* Returns true if a move by (color) fits the following shape:
+ * 
+ *
+ *    X*        (O=color)
+ *    OX
+ * 
+ * capturing one of the two X strings. The name is a slight
+ * misnomer since this includes attacks which are not necessarily
+ * double ataris, though the common double atari is the most
+ * important special case.
+ * 
+ * If safe_stones != NULL, then only attacks on stones marked as safe are
+ * tried.
+ *
+ * The value of the double atari attack is returned in *value (unless
+ * value is NULL), and the attacked stones are marked unsafe.
+ */
+
+int
+double_atari(int move, int color, float *value,
+            signed char safe_stones[BOARDMAX])
+{
+  int other = OTHER_COLOR(color);
+  int k;
+  int m = I(move);
+  int n = J(move);
+
+  if (!ON_BOARD(move))
+    return 0;
+
+  /* Loop over the diagonal directions. */
+  for (k = 4; k < 8; k++) {
+    int dm = deltai[k];
+    int dn = deltaj[k];
+    
+    /* because (m, n) and (m+dm, n+dn) are opposite
+     * corners of a square, ON_BOARD2(m, n) && ON_BOARD2(m+dm, n+dn)
+     * implies ON_BOARD2(m+dm, n) and ON_BOARD2(n, n+dn)
+     *
+     * Only try to attack supposedly safe stones.
+     */
+    if (BOARD(m+dm, n+dn) == color
+       && BOARD(m, n+dn) == other
+       && BOARD(m+dm, n) == other
+       && (!safe_stones
+           || (safe_stones[POS(m, n+dn)] && safe_stones[POS(m+dm, n)]))
+       && trymove(move, color, "double_atari", NO_MOVE)) {
+      if (countlib(move) > 1
+         && (BOARD(m, n+dn) == EMPTY || BOARD(m+dm, n) == EMPTY 
+             || !defend_both(POS(m, n+dn), POS(m+dm, n)))) {
+       popgo();
+       if (value) {
+         if (worm[POS(m, n+dn)].effective_size
+             > worm[POS(m+dm, n)].effective_size) {
+           *value = 2.0 * worm[POS(m, n+dn)].effective_size;
+           if (safe_stones)
+             mark_string(POS(m, n+dn), safe_stones, 0);
+         }
+         else {
+           *value = 2.0 * worm[POS(m+dm, n)].effective_size;
+           if (safe_stones)
+             mark_string(POS(m+dm, n), safe_stones, 0);
+         }
+       }
+       return 1;
+      }
+      popgo();
+    }
+  }
+  
+  return 0;
+}
+    
+
+/* Returns true if a move by (color) plays into a snapback. */
+int
+playing_into_snapback(int move, int color)
+{
+  int libs[2];
+  int k;
+  
+  if (approxlib(move, color, 1, NULL) != 0
+      || accuratelib(move, color, 2, libs) != 1)
+    return 0;
+
+  for (k = 0; k < 4; k++)
+    if (board[move + delta[k]] == color
+       && adjacent_strings(libs[0], move + delta[k]))
+      return 1;
+
+  return 0;
+}
+
+
+/* Score the game and determine the winner */
+
+void
+who_wins(int color, FILE *outfile)
+{
+  float result;
+
+  silent_examine_position(EXAMINE_DRAGONS);
+
+#if 0
+  float white_score;
+  float black_score;
+  int winner;
+#endif
+
+  if (color != BLACK && color != WHITE)
+    color = BLACK;
+
+#if 0
+  /* Use the aftermath code to compute the final score. (Slower but
+   * more reliable.) 
+   */
+  result = aftermath_compute_score(color, NULL);
+  if (result > 0.0)
+    winner = WHITE;
+  else {
+    winner = BLACK;
+    result = -result;
+  }
+#endif
+
+  result = (white_score + black_score)/2.0;
+  if (result == 0.0)
+    fprintf(outfile, "Result: jigo   ");
+  else
+    fprintf(outfile, "Result: %c+%.1f   ",
+           (result > 0.0) ? 'W' : 'B', gg_abs(result));
+}
+
+
+
+/* Find the stones of an extended string, where the extensions are
+ * through the following kinds of connections:
+ *
+ * 1. Solid connections (just like ordinary string).
+ *
+ *    OO
+ *
+ * 2. Diagonal connection or one space jump through an intersection
+ *    where an opponent move would be suicide or self-atari.
+ *
+ *    ...
+ *    O.O
+ *    XOX
+ *    X.X
+ *
+ * 3. Bamboo joint.
+ *
+ *    OO
+ *    ..
+ *    OO
+ *
+ * 4. Diagonal connection where both adjacent intersections are empty.
+ *
+ *    .O
+ *    O.
+ *
+ * 5. Connection through adjacent or diagonal tactically captured stones.
+ *    Connections of this type are omitted when the superstring code is
+ *    called from reading.c, but included when the superstring code is
+ *    called from owl.c
+ */
+
+static void
+do_find_superstring(int str, int *num_stones, int *stones,
+                   int *num_lib, int *libs, int maxlibs,
+                   int *num_adj, int *adjs, int liberty_cap,
+                   int proper, int type);
+
+static void
+superstring_add_string(int str,
+                      int *num_my_stones, int *my_stones,
+                      int *num_stones, int *stones,
+                      int *num_libs, int *libs, int maxlibs,
+                      int *num_adj, int *adjs, int liberty_cap,
+                      signed char mx[BOARDMAX],
+                      signed char ml[BOARDMAX],
+                      signed char ma[BOARDMAX],
+                      int do_add);
+
+void
+find_superstring(int str, int *num_stones, int *stones)
+{
+  do_find_superstring(str, num_stones, stones,
+                     NULL, NULL, 0,
+                     NULL, NULL, 0,
+                     0, 1);
+}
+
+/* This is the same as find_superstring, except that connections of
+ * type 5 are omitted. This is used in semeai analysis.
+ */
+void
+find_superstring_conservative(int str, int *num_stones, int *stones)
+{
+  do_find_superstring(str, num_stones, stones,
+                     NULL, NULL, 0,
+                     NULL, NULL, 0,
+                     0, 0);
+}
+
+
+/* This function computes the superstring at (str) as described above,
+ * but omitting connections of type 5. Then it constructs a list of
+ * liberties of the superstring which are not already liberties of
+ * (str).
+ *
+ * If liberty_cap is nonzero, only liberties of substrings of the
+ * superstring which have fewer than liberty_cap liberties are
+ * generated.
+ */
+
+void
+find_superstring_liberties(int str,
+                          int *num_libs, int *libs, int liberty_cap)
+{
+  do_find_superstring(str, NULL, NULL,
+                     num_libs, libs, MAX_LIBERTIES,
+                     NULL, NULL, liberty_cap,
+                     0, 0);
+}
+
+/* This function is the same as find_superstring_liberties, but it
+ * omits those liberties of the string (str), presumably since
+ * those have already been treated elsewhere.
+ *
+ * If liberty_cap is nonzero, only liberties of substrings of the
+ * superstring which have at most liberty_cap liberties are
+ * generated.
+ */
+
+void
+find_proper_superstring_liberties(int str, 
+                                 int *num_libs, int *libs, 
+                                 int liberty_cap)
+{
+  do_find_superstring(str, NULL, NULL,
+                     num_libs, libs, MAX_LIBERTIES,
+                     NULL, NULL, liberty_cap,
+                     1, 0);
+}
+
+/* This function computes the superstring at (str) as described above,
+ * but omitting connections of type 5. Then it constructs a list of
+ * liberties of the superstring which are not already liberties of
+ * (str).
+ *
+ * If liberty_cap is nonzero, only liberties of substrings of the
+ * superstring which have fewer than liberty_cap liberties are
+ * generated.
+ */
+
+void
+find_superstring_stones_and_liberties(int str,
+                                     int *num_stones, int *stones,
+                                     int *num_libs, int *libs,
+                                     int liberty_cap)
+{
+  do_find_superstring(str, num_stones, stones,
+                     num_libs, libs, MAX_LIBERTIES,
+                     NULL, NULL, liberty_cap,
+                     0, 0);
+}
+
+/* analogous to chainlinks, this function finds boundary chains of the
+ * superstring at (str), including those which are boundary chains of
+ * (str) itself. If liberty_cap != 0, only those boundary chains with
+ * <= liberty_cap liberties are reported.
+ */
+
+void
+superstring_chainlinks(int str, 
+                      int *num_adj, int adjs[MAXCHAIN],
+                      int liberty_cap)
+{
+  do_find_superstring(str, NULL, NULL,
+                     NULL, NULL, 0,
+                     num_adj, adjs, liberty_cap,
+                     0, 2);
+}
+
+
+/* analogous to chainlinks, this function finds boundary chains of the
+ * superstring at (str), omitting those which are boundary chains of
+ * (str) itself. If liberty_cap != 0, only those boundary chains with
+ * <= liberty_cap liberties are reported.
+ */
+
+void
+proper_superstring_chainlinks(int str,
+                             int *num_adj, int adjs[MAXCHAIN],
+                             int liberty_cap)
+{
+  do_find_superstring(str, NULL, NULL,
+                     NULL, NULL, 0,
+                     num_adj, adjs, liberty_cap,
+                     1, 2);
+}
+
+/* Do the real work finding the superstring and recording stones,
+ * liberties, and/or adjacent strings.
+ */
+static void
+do_find_superstring(int str, int *num_stones, int *stones,
+                   int *num_libs, int *libs, int maxlibs,
+                   int *num_adj, int *adjs, int liberty_cap,
+                   int proper, int type)
+{
+  int num_my_stones;
+  int my_stones[MAX_BOARD * MAX_BOARD];
+  
+  signed char mx[BOARDMAX]; /* stones */
+  signed char ml[BOARDMAX]; /* liberties */
+  signed char ma[BOARDMAX]; /* adjacent strings */
+
+  int k, l, r;
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+
+  memset(mx, 0, sizeof(mx));
+  memset(ml, 0, sizeof(ml));
+  memset(ma, 0, sizeof(ma));
+
+  if (num_stones)
+    *num_stones = 0;
+  if (num_libs)
+    *num_libs = 0;
+  if (num_adj)
+    *num_adj = 0;
+
+  /* Include the string itself in the superstring. Only record stones,
+   * liberties, and/or adjacent strings if proper==0.
+   */
+  num_my_stones = 0;
+  superstring_add_string(str, &num_my_stones, my_stones,
+                        num_stones, stones,
+                        num_libs, libs, maxlibs,
+                        num_adj, adjs, liberty_cap,
+                        mx, ml, ma,
+                        !proper);
+
+  /* Loop over all found stones, looking for more strings to include
+   * in the superstring. The loop is automatically extended over later
+   * found stones as well.
+   */
+  for (r = 0; r < num_my_stones; r++) {
+    int pos = my_stones[r];
+
+    for (k = 0; k < 4; k++) {
+      /* List of relative coordinates. (pos) is marked by *.
+       *
+       *  ef.
+       *  gb.
+       *  *ac
+       *  .d.
+       *
+       */
+      int right = delta[k];
+      int up = delta[(k+1)%4];
+      
+      int apos = pos + right;
+      int bpos = pos + right + up;
+      int cpos = pos + 2*right;
+      int dpos = pos + right - up;
+      int epos = pos + 2*up;
+      int fpos = pos + right + 2*up;
+      int gpos = pos + up;
+      int unsafe_move;
+      
+      if (!ON_BOARD(apos))
+       continue;
+      
+      /* Case 1. Nothing to do since stones are added string by string. */
+            
+      /* Case 2. */
+      if (board[apos] == EMPTY) {
+       if (type == 2)
+         unsafe_move = (approxlib(apos, other, 2, NULL) < 2);
+       else
+         unsafe_move = is_self_atari(apos, other);
+       
+       if (unsafe_move && type == 1 && is_ko(apos, other, NULL))
+         unsafe_move = 0;
+       
+       if (unsafe_move) {
+         if (board[bpos] == color && !mx[bpos])
+           superstring_add_string(bpos, &num_my_stones, my_stones,
+                                  num_stones, stones,
+                                  num_libs, libs, maxlibs,
+                                  num_adj, adjs, liberty_cap,
+                                  mx, ml, ma, 1);
+         if (board[cpos] == color && !mx[cpos])
+           superstring_add_string(cpos, &num_my_stones, my_stones,
+                                  num_stones, stones,
+                                  num_libs, libs, maxlibs,
+                                  num_adj, adjs, liberty_cap,
+                                  mx, ml, ma, 1);
+         if (board[dpos] == color && !mx[dpos])
+           superstring_add_string(dpos, &num_my_stones, my_stones,
+                                  num_stones, stones,
+                                  num_libs, libs, maxlibs,
+                                  num_adj, adjs, liberty_cap,
+                                  mx, ml, ma, 1);
+       }
+      }
+      
+      /* Case 3. */
+      /* Notice that the order of these tests is significant. We must
+       * check bpos before fpos and epos to avoid accessing memory
+       * outside the board array. (Notice that fpos is two steps away
+       * from pos, which we know is on the board.)
+       */
+      if (board[apos] == color && board[bpos] == EMPTY
+         && board[fpos] == color && board[epos] == color && !mx[epos]
+         && board[gpos] == EMPTY)
+       superstring_add_string(epos, &num_my_stones, my_stones,
+                              num_stones, stones,
+                              num_libs, libs, maxlibs,
+                              num_adj, adjs, liberty_cap,
+                              mx, ml, ma, 1);
+      /* Don't bother with f, it is part of the string just added. */
+      
+      /* Case 4. */
+      if (board[bpos] == color && !mx[bpos]
+         && board[apos] == EMPTY && board[gpos] == EMPTY)
+       superstring_add_string(bpos, &num_my_stones, my_stones,
+                              num_stones, stones,
+                              num_libs, libs, maxlibs,
+                              num_adj, adjs, liberty_cap,
+                              mx, ml, ma, 1);
+      
+      /* Case 5. */
+      if (type == 1)
+       for (l = 0; l < 2; l++) {
+         int upos;
+         
+         if (l == 0) {
+           /* adjacent lunch */
+           upos = apos;
+         }
+         else {
+           /* diagonal lunch */
+           upos = bpos;
+         }
+         
+         if (board[upos] != other)
+           continue;
+         
+         upos = find_origin(upos);
+         
+         /* Only do the reading once. */
+         if (mx[upos] == 1)
+           continue;
+         
+         mx[upos] = 1;
+         
+         if (attack(upos, NULL)
+             && !find_defense(upos, NULL)) {
+           int lunch_stones[MAX_BOARD*MAX_BOARD];
+           int num_lunch_stones = findstones(upos, MAX_BOARD*MAX_BOARD,
+                                             lunch_stones);
+           int m, n;
+           for (m = 0; m < num_lunch_stones; m++)
+             for (n = 0; n < 8; n++) {
+               int vpos = lunch_stones[m] + delta[n];
+               if (board[vpos] == color && !mx[vpos])
+                 superstring_add_string(vpos,
+                                        &num_my_stones, my_stones,
+                                        num_stones, stones,
+                                        num_libs, libs, maxlibs,
+                                        num_adj, adjs, liberty_cap,
+                                        mx, ml, ma, 1);
+             }
+         }
+       }
+      if (num_libs && maxlibs > 0 && *num_libs >= maxlibs)
+       return;
+    }
+  }
+}
+
+/* Add a new string to a superstring. Record stones, liberties, and
+ * adjacent strings as asked for.
+ */
+static void
+superstring_add_string(int str,
+                      int *num_my_stones, int *my_stones,
+                      int *num_stones, int *stones,
+                      int *num_libs, int *libs, int maxlibs,
+                      int *num_adj, int *adjs, int liberty_cap,
+                      signed char mx[BOARDMAX],
+                      signed char ml[BOARDMAX],
+                      signed char ma[BOARDMAX],
+                      int do_add)
+{
+  int num_my_libs;
+  int my_libs[MAXLIBS];
+  int num_my_adj;
+  int my_adjs[MAXCHAIN];
+  int new_stones;
+  int k;
+  
+  ASSERT1(mx[str] == 0, str);
+
+  /* Pick up the stones of the new string. */
+  new_stones = findstones(str, board_size * board_size,
+                         &(my_stones[*num_my_stones]));
+  
+  mark_string(str, mx, 1);
+  if (stones) {
+    gg_assert(num_stones);
+    for (k = 0; k < new_stones; k++) {
+      if (do_add) {
+       stones[*num_stones] = my_stones[*num_my_stones + k];
+       (*num_stones)++;
+      }
+    }
+  }
+  (*num_my_stones) += new_stones;
+
+  /* Pick up the liberties of the new string. */
+  if (libs) {
+    gg_assert(num_libs);
+    /* Get the liberties of the string. */
+    num_my_libs = findlib(str, MAXLIBS, my_libs);
+
+    /* Remove this string from the superstring if it has too many
+     * liberties.
+     */
+    if (liberty_cap > 0 && num_my_libs > liberty_cap)
+      (*num_my_stones) -= new_stones;
+
+    for (k = 0; k < num_my_libs; k++) {
+      if (ml[my_libs[k]])
+       continue;
+      ml[my_libs[k]] = 1;
+      if (do_add && (liberty_cap == 0 || num_my_libs <= liberty_cap)) {
+       libs[*num_libs] = my_libs[k];
+       (*num_libs)++;
+       if (*num_libs == maxlibs)
+         break;
+      }
+    }
+  }
+
+  /* Pick up adjacent strings to the new string. */
+  if (adjs) {
+    gg_assert(num_adj);
+    num_my_adj = chainlinks(str, my_adjs);
+    for (k = 0; k < num_my_adj; k++) {
+      if (liberty_cap > 0 && countlib(my_adjs[k]) > liberty_cap)
+       continue;
+      if (ma[my_adjs[k]])
+       continue;
+      ma[my_adjs[k]] = 1;
+      if (do_add) {
+       adjs[*num_adj] = my_adjs[k];
+       (*num_adj)++;
+      }
+    }
+  }
+}
+
+/* Internal timers for assessing time spent on various tasks. */
+#define NUMBER_OF_TIMERS 4
+static double timers[NUMBER_OF_TIMERS];
+
+/* Start a timer. */
+void
+start_timer(int n)
+{
+  gg_assert(n >= 0 && n < NUMBER_OF_TIMERS);
+  if (!showtime)
+    return;
+
+  timers[n] = gg_cputime();
+}
+
+/* Report time spent and restart the timer. Make no report if elapsed
+ * time is less than mintime.
+ */
+double
+time_report(int n, const char *occupation, int move, double mintime)
+{
+  double t;
+  double dt;
+  gg_assert(n >= 0 && n < NUMBER_OF_TIMERS);
+
+  if (!showtime)
+    return 0.0;
+
+  t = gg_cputime();
+  dt = t - timers[n];
+  if (dt > mintime) {
+    gprintf("%s", occupation);
+    if (move != NO_MOVE)
+      gprintf("%1m", move);
+    fprintf(stderr, ": %.2f sec\n", dt);
+  }
+  timers[n] = t;
+  return dt;
+}
+
+void
+clearstats()
+{
+  stats.nodes                    = 0;
+  stats.read_result_entered      = 0;
+  stats.read_result_hits         = 0;
+  stats.trusted_read_result_hits = 0;
+}
+  
+void
+showstats()
+{
+  gprintf("Nodes:                    %d\n", stats.nodes);
+  gprintf("Read results entered:     %d\n", stats.read_result_entered);
+  gprintf("Read result hits:         %d\n", stats.read_result_hits);
+  gprintf("Trusted read result hits: %d\n", stats.trusted_read_result_hits);
+}
+
+
+/* Set up a compiled in pattern database for use by the Monte Carlo
+ * code. If name is NULL, the first pattern database is used.
+ *
+ * The reason why this function and the next are placed here rather
+ * than in montecarlo.c is to keep that file free from dependency on
+ * patterns.h.
+ */
+int
+choose_mc_patterns(char *name)
+{
+  int k;
+  for (k = 0; mc_pattern_databases[k].name; k++) {
+    if (!name || strcmp(name, mc_pattern_databases[k].name) == 0) {
+      mc_init_patterns(mc_pattern_databases[k].values);
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+/* List compiled in Monte Carlo pattern databases. */
+void
+list_mc_patterns(void)
+{
+  int k;
+  printf("Available builtin Monte Carlo local patterns:\n\n");
+  for (k = 0; mc_pattern_databases[k].name; k++) {
+    if (k == 0)
+      printf("* %s (default)\n", mc_pattern_databases[k].name);
+    else
+      printf("* %s\n", mc_pattern_databases[k].name);
+  }
+  printf("\nUse \"--mc-patterns name\" to choose one of these.\n");
+  printf("Use \"--mc-load-patterns filename\" to directly load a pattern database.\n");
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/value_moves.c b/engine/value_moves.c
new file mode 100644 (file)
index 0000000..2d805a2
--- /dev/null
@@ -0,0 +1,4043 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "liberty.h"
+#include "gg_utils.h"
+#include "move_reasons.h"
+
+
+/* Count how many distinct strings are (solidly) connected by the move
+ * at (pos). Add a bonus for strings with few liberties. Also add
+ * bonus for opponent strings put in atari or removed and for own
+ * strings in atari adjacent to removed opponent strings.
+ *
+ * The parameter to_move should be set when color is the color to
+ * move. (This function is called for both colors.)
+ */
+static int
+move_connects_strings(int pos, int color, int to_move)
+{
+  int ss[4];
+  int strings = 0;
+  int own_strings = 0;
+  int k, l;
+  int fewlibs = 0;
+
+  for (k = 0; k < 4; k++) {
+    int ii = pos + delta[k];
+    int origin;
+
+    if (!ON_BOARD(ii) || board[ii] == EMPTY)
+      continue;
+
+    origin = find_origin(ii);
+
+    for (l = 0; l < strings; l++)
+      if (ss[l] == origin)
+       break;
+
+    if (l == strings) {
+      ss[strings] = origin;
+      strings++;
+    }
+  }
+
+  for (k = 0; k < strings; k++) {
+    if (worm[ss[k]].invincible)
+      continue;
+    if (board[ss[k]] == color) {
+      int newlibs = approxlib(pos, color, MAXLIBS, NULL);
+      own_strings++;
+      if (newlibs >= countlib(ss[k])) {
+       if (countlib(ss[k]) <= 4)
+         fewlibs++;
+       if (countlib(ss[k]) <= 2)
+         fewlibs++;
+      }
+    }
+    else {
+      if (countlib(ss[k]) <= 2)
+       fewlibs++;
+      if (countlib(ss[k]) <= 1 && to_move) {
+       int dummy[MAXCHAIN];
+       fewlibs++;
+       fewlibs += chainlinks2(ss[k], dummy, 1);
+      }
+    }
+  }
+
+  /* Do some thresholding. */
+  if (fewlibs > 4)
+    fewlibs = 4;
+  if (to_move && is_ko(pos, color, NULL) && fewlibs > 1)
+    fewlibs = 1;
+  if (fewlibs == 0 && own_strings == 1)
+    own_strings = 0;
+
+  return own_strings + fewlibs;
+}
+
+/* Find saved dragons and worms, then call blunder_size(). */
+static float
+value_moves_get_blunder_size(int move, int color)
+{
+  signed char saved_dragons[BOARDMAX];
+  signed char saved_worms[BOARDMAX];
+  signed char safe_stones[BOARDMAX];
+
+  get_saved_dragons(move, saved_dragons);
+  get_saved_worms(move, saved_worms);
+
+  mark_safe_stones(color, move, saved_dragons, saved_worms, safe_stones);
+  
+  return blunder_size(move, color, NULL, safe_stones);
+}
+
+static int
+value_moves_confirm_safety(int move, int color)
+{
+  return (value_moves_get_blunder_size(move, color) == 0.0);
+}
+
+
+/* Test all moves which defend, attack, connect or cut to see if they
+ * also attack or defend some other worm.
+ *
+ * FIXME: We would like to see whether an arbitrary move works to cut
+ *        or connect something else too.
+ */
+
+static void
+find_more_attack_and_defense_moves(int color)
+{
+  int unstable_worms[MAX_WORMS];
+  int N = 0;  /* number of unstable worms */
+  int ii;
+  int k;
+  int other = OTHER_COLOR(color);
+  int cursor_at_start_of_line;
+  
+  TRACE("\nLooking for additional attack and defense moves. Trying moves ...\n");
+  
+  /* Identify the unstable worms and store them in a list. */
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    if (IS_STONE(board[ii])
+       && worm[ii].origin == ii
+       && worm[ii].attack_codes[0] != 0
+       && worm[ii].defense_codes[0] != 0) {
+      unstable_worms[N] = ii;
+      N++;
+    }
+  }
+  
+  /* To avoid horizon effects, we temporarily increase the depth values. */
+  increase_depth_values();
+  
+  for (ii = BOARDMIN; ii < BOARDMAX; ii++) {
+    if (board[ii] != EMPTY)
+      continue;
+
+    /* Don't consider send-two-return-one moves here. */
+    if (send_two_return_one(ii, color))
+      continue;
+    
+    for (k = 0; k < MAX_REASONS; k++) {
+      int r = move[ii].reason[k];
+      
+      if (r < 0)
+       break;
+      
+      if (move_reasons[r].type == ATTACK_MOVE
+         || move_reasons[r].type == ATTACK_MOVE_GOOD_KO
+         || move_reasons[r].type == ATTACK_MOVE_BAD_KO
+         || move_reasons[r].type == DEFEND_MOVE
+         || move_reasons[r].type == DEFEND_MOVE_GOOD_KO
+         || move_reasons[r].type == DEFEND_MOVE_BAD_KO
+         || move_reasons[r].type == CONNECT_MOVE
+         || move_reasons[r].type == CUT_MOVE)
+       break;
+      /* FIXME: Add code for EITHER_MOVE and ALL_MOVE here. */
+    }
+    
+    if (k == MAX_REASONS || move[ii].reason[k] == -1)
+      continue;
+    
+    /* Try the move at (ii) and see what happens. */
+    cursor_at_start_of_line = 0;
+    TRACE("%1m ", ii);
+    if (trymove(ii, color, "find_more_attack_and_defense_moves", NO_MOVE)) {
+      for (k = 0; k < N; k++) {
+       int aa = unstable_worms[k];
+       
+       /* string of our color, see if there still is an attack,
+        * unless we already know the move works as defense move.
+        */
+       if (board[aa] == color
+           && !defense_move_reason_known(ii, unstable_worms[k])) {
+         int acode = attack(aa, NULL);
+         if (acode < worm[aa].attack_codes[0]) {
+           /* Maybe attack() doesn't find the attack. Try to
+            * attack with the stored attack move.
+            */
+           int defense_works = 1;
+           
+           if (trymove(worm[aa].attack_points[0], other, 
+                       "find_more_attack_and_defense_moves", 0)) {
+             if (!board[aa])
+               defense_works = 0;
+             else {
+               int this_acode = REVERSE_RESULT(find_defense(aa, NULL));
+               if (this_acode > acode) {
+                 acode = this_acode;
+                 if (acode >= worm[aa].attack_codes[0])
+                   defense_works = 0;
+               }
+             }
+             popgo();
+           }
+           
+           if (defense_works) {
+             if (!cursor_at_start_of_line)
+               TRACE("\n");
+             TRACE("%ofound extra point of defense of %1m at %1m code %d\n",
+                   aa, ii, REVERSE_RESULT(acode));
+             cursor_at_start_of_line = 1;
+             add_defense_move(ii, aa, REVERSE_RESULT(acode));
+           }
+         }
+       }
+       
+       /* string of opponent color, see if there still is a defense,
+        * unless we already know the move works as attack move.
+        */
+       if (board[aa] == other
+           && !attack_move_reason_known(ii, unstable_worms[k])) {
+         
+         int dcode = find_defense(aa, NULL);
+         if (dcode < worm[aa].defense_codes[0]) {
+           /* Maybe find_defense() doesn't find the defense. Try to
+            * defend with the stored defense move.
+            *
+            * Another option is maybe there is no attack anymore
+            * (e.g. we pushed the worm into seki), find_defense()
+            * could easily fail in that case.
+            */
+           int attack_works = 1;
+
+           if (attack(aa, NULL) >= worm[aa].attack_codes[0]) {
+             if (trymove(worm[aa].defense_points[0], other, 
+                         "find_more_attack_and_defense_moves", 0)) {
+               int this_dcode = REVERSE_RESULT(attack(aa, NULL));
+               if (this_dcode > dcode) {
+                 dcode = this_dcode;
+                 if (dcode >= worm[aa].defense_codes[0])
+                   attack_works = 0;
+               }
+               popgo();
+             }
+           }
+           else
+             attack_works = 0;
+           
+           if (attack_works) {
+             if (!cursor_at_start_of_line)
+               TRACE("\n");
+             TRACE("%ofound extra point of attack of %1m at %1m code %d\n",
+                   aa, ii, REVERSE_RESULT(dcode));
+             cursor_at_start_of_line = 1;
+             add_attack_move(ii, aa, REVERSE_RESULT(dcode));
+           }
+         }
+       }
+      }
+      popgo();
+    }
+  }
+  
+  TRACE("\n");
+  decrease_depth_values();
+}
+
+
+/* Do the real job of find_more_owl_attack_and_defense_moves() with given
+ * move reason at given position and for given target (`what').  This
+ * function is used from induce_secondary_move_reasons() for upgrading
+ * one specific move reason only.
+ */
+static void
+do_find_more_owl_attack_and_defense_moves(int color, int pos,
+                                         int move_reason_type, int what)
+{
+  int k;
+  int dd1 = NO_MOVE;
+  int dd2 = NO_MOVE;
+  int save_verbose;
+
+  gg_assert(stackp == 0);
+  
+  /* Never consider moves of the send-two-return-one type here. */
+  if (send_two_return_one(pos, color))
+    return;
+
+  /* Never consider moves playing into snapback here. */
+  if (playing_into_snapback(pos, color))
+    return;
+
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose --;
+
+  if (move_reason_type == STRATEGIC_ATTACK_MOVE
+      || move_reason_type == STRATEGIC_DEFEND_MOVE)
+    dd1 = what;
+  else if (move_reason_type == ATTACK_MOVE
+          || move_reason_type == ATTACK_MOVE_GOOD_KO
+          || move_reason_type == ATTACK_MOVE_BAD_KO
+          || move_reason_type == DEFEND_MOVE
+          || move_reason_type == DEFEND_MOVE_GOOD_KO
+          || move_reason_type == DEFEND_MOVE_BAD_KO
+          || move_reason_type == VITAL_EYE_MOVE)
+    dd1 = what;
+  else if (move_reason_type == CONNECT_MOVE) {
+    int worm1 = conn_worm1[what];
+    int worm2 = conn_worm2[what];
+
+    dd1 = dragon[worm1].origin;
+    dd2 = dragon[worm2].origin;
+    if (dd1 == dd2)
+      dd2 = NO_MOVE;
+  }
+  else {
+    verbose = save_verbose;
+    return;
+  }
+
+  for (k = 0; k < 2; k++) {
+    int dd = (k == 0 ? dd1 : dd2);
+
+    if (dd == NO_MOVE)
+      continue;
+
+    /* Don't care about inessential dragons. */
+    if (DRAGON2(dd).safety == INESSENTIAL)
+      continue;
+
+    if (DRAGON2(dd).owl_status != CRITICAL)
+      continue;
+
+    if ((move_reason_type == STRATEGIC_ATTACK_MOVE
+        || move_reason_type == ATTACK_MOVE
+        || move_reason_type == ATTACK_MOVE_GOOD_KO
+        || move_reason_type == ATTACK_MOVE_BAD_KO
+        || (move_reason_type == VITAL_EYE_MOVE
+            && board[dd] == OTHER_COLOR(color)))
+       && !owl_attack_move_reason_known(pos, dd)) {
+      int kworm = NO_MOVE;
+      int acode = owl_does_attack(pos, dd, &kworm);
+
+      if (acode >= DRAGON2(dd).owl_attack_code) {
+       add_owl_attack_move(pos, dd, kworm, acode);
+       if (save_verbose)
+         gprintf("Move at %1m upgraded to owl attack on %1m (%s).\n",
+                 pos, dd, result_to_string(acode));
+      }
+    }
+
+    if ((move_reason_type == STRATEGIC_DEFEND_MOVE
+        || move_reason_type == CONNECT_MOVE
+        || move_reason_type == DEFEND_MOVE
+        || move_reason_type == DEFEND_MOVE_GOOD_KO
+        || move_reason_type == DEFEND_MOVE_BAD_KO
+        || (move_reason_type == VITAL_EYE_MOVE
+            && board[dd] == color))
+       && !owl_defense_move_reason_known(pos, dd)) {
+      int kworm = NO_MOVE;
+      /* FIXME: Better use owl_connection_defend() for CONNECT_MOVE ? */
+      int dcode = owl_does_defend(pos, dd, &kworm);
+
+      if (dcode >= DRAGON2(dd).owl_defense_code) {
+       if (dcode == LOSS)
+         add_loss_move(pos, dd, kworm);
+       else
+         add_owl_defense_move(pos, dd, dcode);
+       if (save_verbose)
+         gprintf("Move at %1m upgraded to owl defense for %1m (%s).\n",
+                 pos, dd, result_to_string(dcode));
+      }
+    }
+  }
+
+  verbose = save_verbose;
+}
+
+
+
+/* Try whether the move at (pos) for (color) is also an owl attack on
+ * (target). (dist) is the distance to the dragon, and is used for a
+ * safety heuristic: distant moves are only accepted if they kill within
+ * few owl nodes.
+ */
+static void
+try_large_scale_owl_attack(int pos, int color, int target, int dist)
+{
+  int owl_nodes_before;
+  int owl_nodes_used;
+  int kworm = NO_MOVE;
+  int acode;
+  int save_verbose = verbose;
+  int save_owl_node_limit = owl_node_limit;
+  
+  ASSERT1(board[target] == OTHER_COLOR(color), pos);
+  ASSERT1(!owl_attack_move_reason_known(pos, target), pos);
+  DEBUG(DEBUG_LARGE_SCALE, "Trying large scale move %1m on %1m\n", pos, target);
+  
+  /* To avoid horizon effects, we temporarily increase 
+   * the depth values to find the large scale attacks.
+   */
+  increase_depth_values(); 
+  
+  /* To reduce the amount of aji allowed for large scale
+   * attacks, we reduce the owl limit to 350 nodes for
+   * attacks at distance <= 1, and 150 nodes for attacks at
+   * distance >= 2.
+   */
+  if (dist <= 1)
+    owl_node_limit *= 0.35;
+  else
+    owl_node_limit *= 0.15;
+
+  if (DRAGON2(target).owl_attack_node_count < owl_node_limit) {
+    if (verbose > 0)
+      verbose--;
+
+    owl_nodes_before = get_owl_node_counter(); 
+    acode = owl_does_attack(pos, target, &kworm);
+    owl_nodes_used = get_owl_node_counter() - owl_nodes_before;
+    
+    if (acode >= DRAGON2(target).owl_attack_code
+       && acode == WIN) {
+      add_owl_attack_move(pos, target, kworm, acode);
+      DEBUG(DEBUG_LARGE_SCALE | DEBUG_MOVE_REASONS,
+           "Move at %1m owl-attacks %1m on a large scale(%s).\n", 
+           pos, target, result_to_string(acode));
+    }
+    else
+      DEBUG(DEBUG_LARGE_SCALE,
+           "Move at %1m isn't a clean large scale attack on %1m (%s).\n",
+           pos, target, result_to_string(acode));
+    
+    DEBUG(DEBUG_LARGE_SCALE, "  owl nodes used = %d, dist = %d\n", 
+         owl_nodes_used, dist);
+    /* Restore settings. */
+    verbose = save_verbose;
+  }
+  decrease_depth_values(); 
+  owl_node_limit = save_owl_node_limit;
+}
+
+
+#define MAXIMUM_LARGE_SCALE_DIST       3
+
+/* Test all the moves to see whether they can owl-attack a specific
+ * dragon on a large scale . Tested moves are
+ * 1. Moves that already have a move reason. 
+ * 2. Are not too far away.
+ *    The distance used is the Manhattan distance, and the maximum 
+ *    distance is MAXIMUM_LARGE_SCALE_DIST.
+ */
+static void
+find_large_scale_owl_attacks_on_dragon(int color, int target)
+{
+  int x, y;
+  int x_min = board_size;
+  int x_max = 0;
+  int y_min = board_size;
+  int y_max = 0;
+  int dist;
+
+  ASSERT1(board[target] == OTHER_COLOR(color), target);
+  
+  /* Find the physical extension of the dragon. */
+  for (x = 0; x < board_size; x++)
+    for (y = 0; y < board_size; y++) {
+      if (is_same_dragon(target, POS(x, y))) {
+       if (x < x_min)
+         x_min = x;
+       if (x > x_max)
+         x_max = x;
+       if (y < y_min)
+         y_min = y;
+       if (y > y_max)
+         y_max = y;
+      }
+    }
+  ASSERT1(x_min <= x_max && y_min <= y_max, target);
+
+  /* Try to find large scale attacks.
+   * We do this by first trying to find attacks at dist = 0, then
+   * dist = 1, etc., up to MAXIMUM_LARGE_SCALE_DIST.
+   */
+  for (dist = 0; dist <= MAXIMUM_LARGE_SCALE_DIST; dist++)
+    for (x = gg_max(x_min - dist, 0);
+        x <= gg_min(x_max + dist, board_size - 1); x++)
+      for (y = gg_max(y_min - dist, 0);
+          y <= gg_min(y_max + dist, board_size - 1); y++) {
+       int pos = POS(x, y);
+       ASSERT1(ON_BOARD2(x, y), pos);
+       
+       if (board[pos] == EMPTY) {
+         int a, b, dx, dy;
+         a = abs(x - x_min);
+         b = abs(x - x_max);
+         dx = gg_min(a, b);
+         a = abs(y - y_min);
+         b = abs(y - y_max);
+         dy = gg_min(a, b);
+
+         if (gg_max(dx, dy) == dist  
+             && move[pos].reason[0] >= 0
+             && !owl_attack_move_reason_known(pos, target))
+           /* Maximum Manhatan distance, move reason known but no owl
+            * attack yet.
+            */
+           try_large_scale_owl_attack(pos, color, target, dist);
+         
+       }
+      }
+}
+
+
+/* Try large scale owl attacks against all enemy dragons that are
+ * small (size <= 6) and critical.
+ */
+static void
+find_large_scale_owl_attack_moves(int color)
+{
+  int d;
+
+  DEBUG(DEBUG_LARGE_SCALE, "\nTrying to find large scale attack moves.\n");
+  for (d = 0; d < number_of_dragons; d++) {
+    int target = dragon2[d].origin;
+    if (dragon[target].color == OTHER_COLOR(color)
+       && dragon[target].size <= 6
+        && dragon[target].status == CRITICAL
+       && dragon2[d].owl_status == CRITICAL) {
+      DEBUG(DEBUG_LARGE_SCALE, "Small critical dragon found at %1m\n", target);
+      find_large_scale_owl_attacks_on_dragon(color, target);
+    }
+  }
+}
+
+/* Test certain moves to see whether they (too) can owl-attack or
+ * defend an owl critical dragon. Tested moves are
+ * 1. Strategical attacks or defenses for the dragon.
+ * 2. Vital eye points for the dragon.
+ * 3. Tactical attacks or defenses for a part of the dragon.
+ * 4. Moves connecting the dragon to something else.
+ */
+static void
+find_more_owl_attack_and_defense_moves(int color)
+{
+  int pos, pos2;
+  int k;
+  int dd = NO_MOVE;
+  int worth_trying;
+  int save_verbose;
+  struct eye_data *our_eyes;
+  struct eye_data *your_eyes;
+  struct vital_eye_points *our_vital_points;
+  struct vital_eye_points *your_vital_points;
+
+  if (verbose)
+    gprintf("\nTrying to upgrade strategical attack and defense moves.\n");
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+      
+    for (k = 0; k < MAX_REASONS; k++) {
+      int r = move[pos].reason[k];
+      if (r < 0)
+       break;
+
+      do_find_more_owl_attack_and_defense_moves(color, pos,
+                                               move_reasons[r].type,
+                                               move_reasons[r].what);
+    }
+  }
+
+  if (verbose)
+    gprintf("\nTrying vital eye moves as owl attacks.\n");
+  if (color == WHITE) {
+    our_eyes = white_eye;
+    your_eyes = black_eye;
+    our_vital_points = white_vital_points;
+    your_vital_points = black_vital_points;
+  }
+  else {
+    our_eyes = black_eye;
+    your_eyes = white_eye;
+    our_vital_points = black_vital_points;
+    your_vital_points = white_vital_points;
+  }
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    if (our_eyes[pos].origin == pos
+       && our_vital_points[pos].defense_points[0] != NO_MOVE) {
+      int k, dr;
+      find_eye_dragons(pos, our_eyes, color, &dr, 1);
+      for (k = 0; k < MAX_EYE_ATTACKS; k++) {
+       int move = our_vital_points[pos].defense_points[k];
+       if (move == NO_MOVE)
+         break;
+       do_find_more_owl_attack_and_defense_moves(color, move,
+                                                 VITAL_EYE_MOVE, dr);
+      }
+    }
+    if (your_eyes[pos].origin == pos
+       && your_vital_points[pos].attack_points[0] != NO_MOVE) {
+      int k, dr;
+      find_eye_dragons(pos, your_eyes, OTHER_COLOR(color), &dr, 1);
+      for (k = 0; k < MAX_EYE_ATTACKS; k++) {
+       int move = your_vital_points[pos].attack_points[k];
+       if (move == NO_MOVE)
+         break;
+       do_find_more_owl_attack_and_defense_moves(color, move,
+                                                 VITAL_EYE_MOVE, dr);
+      }
+    }
+  }
+
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+
+  /* If two critical dragons are adjacent, test whether a move to owl
+   * attack or defend one also is effective on the other.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos])
+       && dragon[pos].origin == pos
+       && DRAGON2(pos).owl_status == CRITICAL) {
+      for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+       if (board[pos2] != EMPTY)
+         continue;
+       worth_trying = 0;
+       for (k = 0; k < MAX_REASONS; k++) {
+         int r = move[pos2].reason[k];
+         
+         if (r < 0)
+           break;
+         if (move_reasons[r].type == OWL_ATTACK_MOVE
+             || move_reasons[r].type == OWL_ATTACK_MOVE_GOOD_KO
+             || move_reasons[r].type == OWL_ATTACK_MOVE_BAD_KO
+             || move_reasons[r].type == OWL_DEFEND_MOVE
+             || move_reasons[r].type == OWL_DEFEND_MOVE_GOOD_KO
+             || move_reasons[r].type == OWL_DEFEND_MOVE_BAD_KO) {
+           dd = move_reasons[r].what;
+           if (are_neighbor_dragons(dd, pos)) {
+             worth_trying = 1;
+             break;
+           }
+         } 
+         /* else ...
+            FIXME: what about the new OWL_ATTACK_MOVE_GAIN codes ?
+          */
+       }
+
+       if (worth_trying) {
+         if (board[pos] == color
+             && !owl_defense_move_reason_known(pos2, pos)) {
+           int kworm = NO_MOVE;
+           int dcode = owl_does_defend(pos2, pos, &kworm);
+           if (dcode >= DRAGON2(pos).owl_defense_code) {
+             if (dcode == LOSS)
+               add_loss_move(pos2, pos, kworm);
+             else
+               add_owl_defense_move(pos2, pos, dcode);
+             if (save_verbose)
+               gprintf("Move at %1m also owl defends %1m (%s).\n",
+                       pos2, pos, result_to_string(dcode));
+           }
+
+         }
+         else if (board[pos] != color
+                  && !owl_attack_move_reason_known(pos2, pos)) {
+           int kworm = NO_MOVE;
+           int acode = owl_does_attack(pos2, pos, &kworm);
+           if (acode >= DRAGON2(pos).owl_attack_code) {
+             add_owl_attack_move(pos2, pos, kworm, acode);
+             if (save_verbose)
+               gprintf("Move at %1m also owl attacks %1m (%s).\n",
+                       pos2, pos, result_to_string(acode));
+           }
+         }
+       }
+      }
+    }
+  }
+
+  verbose = save_verbose;
+}
+
+/* Tests whether the potential semeai move at (pos) with details given via
+ * (*reason) works, and adds a semeai move if applicable.
+ */
+static void
+try_potential_semeai_move(int pos, int color, struct move_reason *reason)
+{
+  int dr1 = semeai_target1[reason->what];
+  int dr2 = semeai_target2[reason->what];
+  int resulta, resultb, certain, old_certain;
+  ASSERT1(IS_STONE(board[dr1]), pos);
+  switch (reason->type) {
+    case POTENTIAL_SEMEAI_ATTACK:
+      owl_analyze_semeai_after_move(pos, color, dr1, dr2,
+                                   &resulta, &resultb, NULL,
+                                   1, &certain, 0);
+      old_certain = DRAGON2(dr1).semeai_attack_certain;
+      break;
+    case POTENTIAL_SEMEAI_DEFENSE:
+      old_certain = DRAGON2(dr1).semeai_defense_certain;
+      /* In this case other dragon gets to move first after forced move. */
+      owl_analyze_semeai_after_move(pos, color, dr2, dr1,
+                                   &resulta, &resultb, NULL,
+                                   1, &certain, 0);
+      break;
+    default:
+      ASSERT1(0, pos);
+  }
+  if (resulta == 0 && resultb == 0
+      && (certain || !old_certain)) {
+    add_semeai_move(pos, dr1);
+    DEBUG(DEBUG_SEMEAI,
+         "Potential semeai move at %1m for dragon at %1m is real\n",
+         pos, dr1);
+  }
+  else
+    DEBUG(DEBUG_MOVE_REASONS, "Potential semeai move at %1m for %1m discarded\n",
+         pos, dr1);
+}
+
+/* This functions tests all potential semeai attack moves whether they work,
+ * provided that there is at least one other move reasons stored for the
+ * relevant position.
+ */
+static void
+find_more_semeai_moves(int color)
+{
+  int pos;
+  int save_verbose = verbose;
+
+  if (verbose > 0)
+    verbose--;
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int k, r;
+    int potential_semeai_move_found = 0;
+    int other_move_reason_found = 0;
+
+    if (!ON_BOARD1(pos))
+      continue;
+    for (k = 0; k < MAX_REASONS; k++) {
+      r = move[pos].reason[k];
+      if (r < 0)
+       break;
+      switch (move_reasons[r].type) {
+       case POTENTIAL_SEMEAI_ATTACK:
+       case POTENTIAL_SEMEAI_DEFENSE:
+          potential_semeai_move_found = 1;
+         break;
+       default:
+         other_move_reason_found = 1;
+      }
+    }
+    if ((r < 0 || k == MAX_REASONS)
+       && !other_move_reason_found)
+      continue;
+    if (!potential_semeai_move_found)
+      continue;
+
+    for (k = 0; k < MAX_REASONS; k++) {
+      int r = move[pos].reason[k];
+      if (r < 0)
+       break;
+      if (move_reasons[r].type == POTENTIAL_SEMEAI_ATTACK
+         || move_reasons[r].type == POTENTIAL_SEMEAI_DEFENSE)
+       try_potential_semeai_move(pos, color, &(move_reasons[r]));
+    }
+  }
+  verbose = save_verbose;
+}
+
+
+/*
+ * Any move that captures or defends a worm also potentially connects
+ * or cuts the surrounding strings. Find these secondary move reasons
+ * and verify them by connection reading.
+ *
+ * We also let an owl attack count as a strategical defense of our
+ * neighbors of the owl attacked dragon. We only do this for
+ * tactically safe dragons, however, because otherwise the effects of
+ * capturing have already been taken into account elsewhere.
+ *
+ * Also, connecting moves played on inhibited points possibly remove
+ * nearby connection inhibitions like in following example :
+ * 
+ * .OX.   The * move connects _all_ O stones together, not only
+ * O...   the 2 lower ones.
+ * XO*O
+ * X.X.
+ *
+ */
+
+static void
+induce_secondary_move_reasons(int color)
+{
+  int pos;
+  int k;
+  int i, j;
+  int aa;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+    
+    for (k = 0; k < MAX_REASONS; k++) {
+      int r = move[pos].reason[k];
+      
+      if (r < 0)
+       break;
+      
+      if (move_reasons[r].type == ATTACK_MOVE
+         || move_reasons[r].type == DEFEND_MOVE) {
+       int attack_move;
+       int color_to_move;
+       int num_adj, adjs[MAXCHAIN];
+       
+       aa = move_reasons[r].what;
+       
+       if (move_reasons[r].type == ATTACK_MOVE) {
+         attack_move = 1;
+         color_to_move = OTHER_COLOR(board[aa]);
+       }
+       else {
+         attack_move = 0;
+         color_to_move = board[aa];
+       }
+               
+       if (worm[aa].defense_codes[0] == 0)
+         continue; /* No defense. */
+       
+       /* Don't care about inessential dragons. */
+       if (DRAGON2(aa).safety == INESSENTIAL)
+         continue;
+       
+       /*
+        * If this is a defense move and the defense is futile for
+        * strategical reasons, we shouldn't induce a cutting move
+        * reason.
+        *
+        * FIXME: We may want to revise this policy.
+        */
+       if (!attack_move && !move[pos].move_safety)
+         continue;
+       
+       num_adj = extended_chainlinks(aa, adjs, 1);
+       
+       for (i = 0; i < num_adj; i++) {
+         for (j = i+1; j < num_adj; j++) {
+           int adj1 = adjs[i];
+           int adj2 = adjs[j];
+           
+           if (board[adj1] != board[adj2])
+             continue;
+           if (attack_move
+               && board[adj1] != board[aa]
+               && !disconnect(adj1, adj2, NULL))
+             continue;
+           if (!attack_move
+               && board[adj1] != board[aa]
+               && !string_connect(adj1, adj2, NULL))
+             continue;
+           if (attack_move
+               && board[adj1] == board[aa])
+             continue;
+           if (!attack_move
+               && board[adj1] == board[aa]
+               && !disconnect(adj1, adj2, NULL))
+             continue;
+
+           if (trymove(pos, color_to_move, "induce_secondary_move_reasons",
+                       aa)) {
+             if (attack_move
+                 && board[adj1] != board[aa]
+                 && !disconnect(adj1, adj2, NULL)) {
+               popgo();
+               DEBUG(DEBUG_MOVE_REASONS,
+                     "Connection move at %1m induced for %1m/%1m due to attack of %1m\n",
+                     pos, adj1, adj2, aa);
+               add_connection_move(pos, adj1, adj2);
+               do_find_more_owl_attack_and_defense_moves(color, pos, CONNECT_MOVE,
+                                                         find_connection(adj1, adj2));
+             }
+             else if (!attack_move
+                      && board[adj1] != board[aa]
+                      && !string_connect(adj1, adj2, NULL)) {
+               popgo();
+               DEBUG(DEBUG_MOVE_REASONS,
+                     "Cut move at %1m induced for %1m/%1m due to defense of %1m\n",
+                     pos, adj1, adj2, aa);
+               add_cut_move(pos, adj1, adj2);
+             }
+             else if (!attack_move
+                 && board[adj1] == board[aa]
+                 && !disconnect(adj1, adj2, NULL)) {
+               popgo();
+               DEBUG(DEBUG_MOVE_REASONS,
+                     "Connection move at %1m induced for %1m/%1m due to defense of %1m\n",
+                     pos, adj1, adj2, aa);
+               add_connection_move(pos, adj1, adj2);
+               do_find_more_owl_attack_and_defense_moves(color, pos, CONNECT_MOVE,
+                                                         find_connection(adj1, adj2));
+             }
+             else
+               popgo();
+           }
+         }
+       }
+
+       /* Strategical attack move reason is induced for moves that
+        * defend neighbor strings of weak opponent dragons a.  We
+        * only count strings that are large (more than three stones)
+        * or adjoin at least two non-dead non-single-stone opponent
+        * dragons.
+        */
+       if (!attack_move) {
+         int strategically_valuable = (worm[aa].size > 3);
+         signed char neighbor_dragons[BOARDMAX];
+
+         memset(neighbor_dragons, 0, sizeof(neighbor_dragons));
+
+         if (!strategically_valuable) {
+           int num_dragons = 0;
+
+           for (i = 0; i < num_adj; i++) {
+             int origin = dragon[adjs[i]].origin;
+
+             if (board[origin] != color_to_move
+                 && neighbor_dragons[origin] != 1
+                 && dragon[origin].size > 1
+                 && dragon[origin].status != DEAD) {
+               if (++num_dragons == 2) {
+                 strategically_valuable = 1;
+                 break;
+               }
+
+               neighbor_dragons[origin] = 1;
+             }
+           }
+         }
+
+         if (strategically_valuable) {
+           for (i = 0; i < num_adj; i++) {
+             int origin = dragon[adjs[i]].origin;
+
+             if (board[origin] != color_to_move
+                 && neighbor_dragons[origin] != 2
+                 && dragon[origin].status != DEAD
+                 && dragon_weak(origin)) {
+               DEBUG(DEBUG_MOVE_REASONS,
+                     "Strategical attack move at %1m induced for %1m due to defense of %1m\n",
+                     pos, origin, aa);
+               add_strategical_attack_move(pos, origin);
+               do_find_more_owl_attack_and_defense_moves(color, pos,
+                                                         STRATEGIC_ATTACK_MOVE,
+                                                         origin);
+
+               neighbor_dragons[origin] = 2;
+             }
+           }
+         }
+       }
+      }
+      else if (move_reasons[r].type == OWL_ATTACK_MOVE) {
+       aa = move_reasons[r].what;
+       for (i = 0; i < DRAGON2(aa).neighbors; i++) {
+         int bb = dragon2[DRAGON2(aa).adjacent[i]].origin;
+         if (dragon[bb].color == color && worm[bb].attack_codes[0] == 0
+             && !DRAGON2(bb).semeais) {
+           add_strategical_defense_move(pos, bb);
+           do_find_more_owl_attack_and_defense_moves(color, pos,
+                                                     STRATEGIC_DEFEND_MOVE,
+                                                     bb);
+           DEBUG(DEBUG_MOVE_REASONS, "Strategic defense at %1m induced for %1m due to owl attack on %1m\n",
+                 pos, bb, aa);
+         }
+       }
+      }
+      else if (move_reasons[r].type == CONNECT_MOVE
+              && cut_possible(pos, OTHER_COLOR(color))) {
+       int worm1 = conn_worm1[move_reasons[r].what];
+       int worm2 = conn_worm2[move_reasons[r].what];
+       int pos2;
+       for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+         if (ON_BOARD(pos2) && board[pos2] == EMPTY
+             && cut_possible(pos2, OTHER_COLOR(color))
+             && square_dist(pos, pos2) <= 5) {
+           for (j = 0; j < 8; j++) {
+             int pos3 = pos2 + delta[j];
+             if (ON_BOARD(pos3) && board[pos3] == color
+                 && !is_same_worm(pos3, worm1)
+                 && !is_same_worm(pos3, worm2)) {
+               if (trymove(pos, color, "induce_secondary_move_reasons-B",
+                           worm1)) {
+                 int break1 = disconnect(pos3, worm1, NULL);
+                 int break2 = disconnect(pos3, worm2, NULL);
+                 popgo();
+                 
+                 if (!break1) {
+                   add_connection_move(pos, pos3, worm1);
+                   do_find_more_owl_attack_and_defense_moves(color, pos, CONNECT_MOVE,
+                                                             find_connection(pos3, worm1));
+                   DEBUG(DEBUG_MOVE_REASONS, "Connection at %1m induced for %1m/%1m due to connection at %1m/%1m\n",
+                         pos, worm1, worm2, pos3, worm1);
+                 }
+                 
+                 if (!break2) {
+                   add_connection_move(pos, pos3, worm2);
+                   do_find_more_owl_attack_and_defense_moves(color, pos, CONNECT_MOVE,
+                                                             find_connection(pos3, worm2));
+                   DEBUG(DEBUG_MOVE_REASONS, "Connection at %1m induced for %1m/%1m due to connection at %1m/%1m\n",
+                         pos, worm1, worm2, pos3, worm2);
+                 }
+               }
+             }
+           }
+         }
+       }
+      }
+    }
+  }
+}
+
+
+/* Examine the strategical and tactical safety of the moves. This is
+ * used to decide whether or not the stone should generate influence
+ * when the move is evaluated. The idea is to avoid overestimating the
+ * value of strategically unsafe defense moves and connections of dead
+ * dragons. This sets the move.move_safety field.
+ */
+static void
+examine_move_safety(int color)
+{
+  int pos;
+  int k;
+  
+  start_timer(3);
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int safety = 0;
+    int tactical_safety = 0;
+    if (!ON_BOARD(pos))
+      continue;
+    tactical_safety = is_known_safe_move(pos);
+      
+    for (k = 0; k < MAX_REASONS; k++) {
+      int r = move[pos].reason[k];
+      int type;
+      int what;
+      
+      if (r == -1)
+       break;
+      type = move_reasons[r].type;
+      what = move_reasons[r].what;
+      switch (type) {
+      case CUT_MOVE:
+       /* We don't trust cut moves, unless some other move reason
+        * indicates they are safe.
+        */
+       break;
+      case OWL_DEFEND_MOVE:
+      case OWL_DEFEND_MOVE_GOOD_KO:
+      case OWL_DEFEND_MOVE_BAD_KO:
+      case OWL_DEFEND_MOVE_LOSS:
+       {
+         int ii;
+         for (ii = first_worm_in_dragon(what); ii != NO_MOVE; 
+              ii = next_worm_in_dragon(ii)) {
+           if (!play_connect_n(color, 0, 1, pos, ii, pos))
+             break;
+         }
+         if (ii != NO_MOVE) {
+           tactical_safety = 1;
+           safety = 1;
+         }
+         break;
+       }
+      case SEMEAI_MOVE:
+      case MY_ATARI_ATARI_MOVE:
+      case YOUR_ATARI_ATARI_MOVE:
+      case EITHER_MOVE:         /* FIXME: More advanced handling? */
+       tactical_safety = 1;
+       safety = 1;
+       break;
+      case ALL_MOVE:
+       /* We don't trust these, unless some other move reason
+        * indicates safety.
+        */
+       break;
+      case EXPAND_TERRITORY_MOVE:
+      case EXPAND_MOYO_MOVE:
+      case INVASION_MOVE:   /* A real invasion should be safe.
+                              A sacrifice is something else.*/
+        safety = 1;
+       break;
+      case ATTACK_MOVE:
+      case ATTACK_MOVE_GOOD_KO:
+      case ATTACK_MOVE_BAD_KO:
+      case OWL_ATTACK_MOVE:
+      case OWL_ATTACK_MOVE_GOOD_KO:
+      case OWL_ATTACK_MOVE_BAD_KO:
+      case OWL_ATTACK_MOVE_GAIN:
+        {
+         int aa = NO_MOVE;
+         int bb = NO_MOVE;
+         int size;
+         int m;
+         int our_color_neighbors;
+         
+         if (type == ATTACK_MOVE
+             || type == ATTACK_MOVE_GOOD_KO
+             || type == ATTACK_MOVE_BAD_KO) {
+           aa = what;
+           size = worm[aa].effective_size;
+         } 
+         else if (type == OWL_ATTACK_MOVE_GAIN) {
+           aa = either_data[what].what2;
+           size = worm[aa].effective_size;
+         } 
+         else {
+           aa = what;
+           size = dragon[aa].effective_size;
+         }
+         
+         /* No worries if we catch something big. */
+         if (size >= 8) {
+           tactical_safety = 1;
+           safety = 1;
+           break;
+         }
+         
+         /* If the victim has multiple neighbor dragons of our
+          * color, we leave it to the connection move reason to
+          * determine safety.
+          *
+          * The exception is an owl_attack where we only require
+          * one neighbor to be alive.
+          */
+         our_color_neighbors = 0;
+         if (type == ATTACK_MOVE
+             || type == ATTACK_MOVE_GOOD_KO
+             || type == ATTACK_MOVE_BAD_KO) {
+           /* We could use the same code as for OWL_ATTACK_MOVE
+            * below if we were certain that the capturable string
+            * had not been amalgamated with a living dragon.
+            */
+           int num_adj, adjs[MAXCHAIN];
+           
+           num_adj = chainlinks(aa, adjs);
+           for (m = 0; m < num_adj; m++) {
+             int adj = adjs[m];
+             
+             if (board[adj] == color) {
+               /* Check whether this string is part of the same
+                * dragon as an earlier string. We only want to
+                * count distinct neighbor dragons.
+                */
+               int n;
+               
+               for (n = 0; n < m; n++)
+                 if (dragon[adjs[n]].id == dragon[adj].id)
+                   break;
+               if (n == m) {
+                 /* New dragon. */
+                 our_color_neighbors++;
+                 bb = adj;
+               }
+             }
+           }
+         }
+         else {
+           for (m = 0; m < DRAGON2(aa).neighbors; m++)
+             if (DRAGON(DRAGON2(aa).adjacent[m]).color == color) {
+               our_color_neighbors++;
+               bb = dragon2[DRAGON2(aa).adjacent[m]].origin;
+               if (dragon[bb].status == ALIVE) {
+                 tactical_safety = 1;
+                 safety = 1;
+               }
+             }
+         }
+         
+         if (our_color_neighbors > 1)
+           break;
+         
+         /* It may happen in certain positions that no neighbor of
+          * our color is found. The working hypothesis is that
+          * the move is safe then. One example is a position like
+          *
+          * ----+
+          * OX.X|
+          * OOX.|
+          *  OOX|
+          *   OO|
+          *
+          * where the top right stone only has friendly neighbors
+          * but can be attacked.
+          *
+          * As a further improvement, we also look for a friendly
+          * dragon adjacent to the considered move.
+          */
+         
+         for (m = 0; m < 4; m++) {
+           int d = delta[m];
+           if (board[pos+d] == color) {
+             bb = pos + d;
+             break;
+           }
+         }
+         
+         if (bb == NO_MOVE) {
+           tactical_safety = 1;
+           safety = 1;
+           break;
+         }
+         
+         /* If the attacker is thought to be alive, we trust that
+          * sentiment.
+          */
+         if (dragon[bb].status == ALIVE) {
+           tactical_safety = 1;
+           safety = 1;
+           break;
+         }
+         
+         /* It remains the possibility that what we have captured
+          * is just a nakade shape. Ask the owl code whether this
+          * move saves our attacking dragon.
+          *
+          * FIXME: Might need to involve semeai code too here.
+          */
+         if (owl_does_defend(pos, bb, NULL)) {
+           tactical_safety = 1;
+           safety = 1;
+         }
+         break;
+       }
+      case DEFEND_MOVE:
+      case DEFEND_MOVE_GOOD_KO:
+      case DEFEND_MOVE_BAD_KO:
+       {
+         int aa = what;
+         
+         if (dragon[aa].status == ALIVE)
+           /* It would be better if this never happened, but it does
+            * sometimes. The owl reading can be very slow then.
+            */
+           safety = 1;
+         
+         else if (!play_connect_n(color, 0, 1, pos, aa, pos)
+                  && owl_does_defend(pos, aa, NULL))
+           safety = 1;
+         break;
+       }
+       
+      case ATTACK_THREAT:
+      case DEFEND_THREAT:
+       break;
+
+      case CONNECT_MOVE:
+        {
+         int worm1 = conn_worm1[move_reasons[r].what];
+         int worm2 = conn_worm2[move_reasons[r].what];
+         int aa = dragon[worm1].origin;
+         int bb = dragon[worm2].origin;
+
+         if (aa == bb)
+           continue;
+
+         if (DRAGON2(aa).owl_status == ALIVE
+             || DRAGON2(bb).owl_status == ALIVE) {
+           tactical_safety = 1;
+           safety = 1;
+         }
+         else if ((DRAGON2(aa).owl_status == UNCHECKED
+                   && dragon[aa].crude_status == ALIVE)
+                  || (DRAGON2(bb).owl_status == UNCHECKED
+                      && dragon[bb].crude_status == ALIVE)) {
+           tactical_safety = 1;
+           safety = 1;
+         }
+         else if (owl_connection_defends(pos, aa, bb)) {
+           tactical_safety = 1;
+           safety = 1;
+         }
+         break;
+       }
+      }
+      if (safety == 1 && (tactical_safety == 1 || safe_move(pos, color)))
+       break;
+    }
+      
+    if (safety == 1 && (tactical_safety || safe_move(pos, color)))
+      move[pos].move_safety = 1;
+    else
+      move[pos].move_safety = 0;
+    
+    time_report(3, "    examine_move_safety: ", pos, 1.0);
+  }
+}
+
+
+/*
+ * Returns the pre-computed weakness of a dragon, with corrections
+ * according to ignore_dead_dragons.
+ *
+ * FIXME: Important to test more exactly how effective a strategical
+ *        attack or defense of a weak dragon is. This can be done by
+ *        measuring escape factor and moyo size after the move and
+ *        compare with the old values. Also necessary to test whether
+ *        an attack or defense of a critical dragon is effective.
+ *        Notice that this wouldn't exactly go into this function but
+ *        rather where it's called.
+ */
+
+float
+dragon_weakness(int dr, int ignore_dead_dragons)
+{
+  int dragon_safety = DRAGON2(dr).safety;
+
+  /* Kludge: If a dragon is dead, we return 1.0 in order not
+   * to try to run away.
+   */
+  if (ignore_dead_dragons
+      && (dragon_safety == DEAD
+         || dragon_safety == INESSENTIAL
+         || dragon_safety == TACTICALLY_DEAD))
+    return 0.0;
+
+  /* When scoring, we don't want to reinforce ALIVE dragons. */
+  if (doing_scoring && dragon_safety == ALIVE)
+    return 0.0;
+  
+  return DRAGON2(dr).weakness;
+}
+
+/*
+ * Strategical value of connecting (or cutting) the dragon at (dragona)
+ * to the dragon at (dragonb). Notice that this function is asymmetric.
+ * This is because connection_value(a, b) is intended to measure the
+ * strategical value on the a dragon from a connection to the b dragon.
+ * 
+ * Consider the following position:
+ * +---------+
+ * |XXO.O.OXX|
+ * |.XOOOOOX.|
+ * |XXXX.XXXX|
+ * |.XOOXOOX.|
+ * |XXO.X.O.X|
+ * |OOOXXXOOO|
+ * |..OOOOO..|
+ * |.........|
+ * +---------+
+ * 
+ * X has three dragons, one invincible to the left (A), one critical to
+ * the right (B), and one dead in the center (C). The move at the cutting
+ * point has three move reasons:
+ * connect A and B
+ * connect A and C
+ * connect B and C
+ * 
+ * The strategical value on A of either connection is of course zero,
+ * since it's very unconditionally alive. The strategical value on B is
+ * high when it's connected to A but small (at least should be) from the
+ * connection to C. Similarly for dragon C. In effect the total
+ * strategical value of this move is computed as:
+ * 
+ * max(connection_value(A, B), connection_value(A, C))
+ * + max(connection_value(B, A), connection_value(B, C))
+ * + max(connection_value(C, A), connection_value(C, B))
+ *
+ * The parameter 'margin' is the margin by which we are ahead.
+ * If this exceeds 20 points we value connections more.  This is because
+ * we can afford to waste a move making sure of safety.
+ */
+
+static float
+connection_value(int dragona, int dragonb, int tt, float margin)
+{
+  struct dragon_data2 *da = &DRAGON2(dragona);
+  struct dragon_data2 *db = &DRAGON2(dragonb);
+  float sizea = da->strategic_size;
+  float sizeb = db->strategic_size;
+  int safetya = da->safety;
+  int safetyb = db->safety;
+  float crude_weakness_a
+    = crude_dragon_weakness(da->safety, &da->genus, da->lunch != NO_MOVE, 
+                           da->moyo_territorial_value,
+                           (float) da->escape_route);
+  float crude_weakness_sum;
+  struct eyevalue genus_sum;
+  float terr_val = move[tt].territorial_value;
+  float return_value;
+
+  if (margin > 20.0)
+    margin = 20.0;
+
+  /* When scoring, we want to be restrictive with reinforcement moves.
+   * Thus if both dragons are alive, strongly alive, or invincible, no
+   * bonus is awarded.
+   *
+   * FIXME: Shouldn't it be sufficient to check this for dragon a?
+   */
+  if (doing_scoring) {
+    if ((safetya == ALIVE
+        || safetya == STRONGLY_ALIVE
+        || safetya == INVINCIBLE)
+       && (safetyb == ALIVE
+           || safetyb == STRONGLY_ALIVE
+           || safetyb == INVINCIBLE))
+      return 0.0;
+  }
+
+  if (safetyb == INESSENTIAL)
+    return 0.0;
+  
+  if (crude_weakness_a == 0.0
+      || dragon[dragona].status == DEAD)
+    return 0.0;
+  if (terr_val < 0.0)
+    terr_val = 0.0;
+
+  add_eyevalues(&da->genus, &db->genus, &genus_sum);
+  /* FIXME: There is currently no sane way to take the escape values
+   * into account. Hence we simply pretend they do not change.
+   *
+   * FIXME: terr_val is a very crude approximation to the expected
+   * increase in moyo size. It's especially way off if the move at (tt)
+   * (owl) defends some stones.
+   */
+  crude_weakness_sum
+    = crude_dragon_weakness(safetyb, &genus_sum,
+                           (da->lunch != NO_MOVE || db->lunch != NO_MOVE), 
+                           da->moyo_territorial_value
+                           + db->moyo_territorial_value
+                           + terr_val,
+                           (float) da->escape_route);
+
+  /* Kludge: For a CRITICAL dragon, we use the usual effective
+   * size and give a strategic effect bigger than 2.0 * effective size.
+   * This is to match the "strategic bonus computation" in
+   * estimate_strategical_value(). This prefers connection moves that
+   * owl defend a dragon to other owl defense move.
+   */
+  if (dragon[dragona].status == CRITICAL) {
+    float bonus = (0.4 - 0.3 * crude_weakness_sum) * sizea;
+
+    if (bonus < 0.0)
+      bonus = 0.0;
+
+    /* If ahead, give extra bonus to connections. */
+    if (margin > 0.0 && bonus > 0.0)
+      bonus *= 1.0 + 0.05 * margin;
+    return_value = 2.0 * sizea + bonus;
+  }
+  else {
+    float old_burden = 2.0 * crude_weakness_a * soft_cap(sizea, 15.0);
+
+    /* The new burden is the burden of defending new joint dragon; but
+     * we share this burden proportionally with the other dragon.
+     */
+    float new_burden = 2.0 * crude_weakness_sum * soft_cap(sizea + sizeb, 15.0)
+                      * sizea / (sizea + sizeb);
+
+    return_value = 1.05 * (old_burden - new_burden);
+    /* If ahead, give extra bonus to connections. */
+    if (margin > 0.0)
+      return_value *= 1.0 + 0.02 * margin;
+  }
+
+  if (return_value < 0.0)
+    return_value = 0.0;
+
+  return return_value;
+}
+
+
+/* 
+ * This function computes the shape factor, which multiplies
+ * the score of a move. We take the largest positive contribution
+ * to shape and add 1 for each additional positive contribution found.
+ * Then we take the largest negative contribution to shape, and
+ * add 1 for each additional negative contribution. The resulting
+ * number is raised to the power 1.05.
+ *
+ * The rationale behind this complicated scheme is that every
+ * shape point is very significant. If two shape contributions
+ * with values (say) 5 and 3 are found, the second contribution
+ * should be devalued to 1. Otherwise the engine is too difficult to
+ * tune since finding multiple contributions to shape can cause
+ * significant overvaluing of a move.
+ */
+
+static float
+compute_shape_factor(int pos)
+{
+  float exponent = move[pos].maxpos_shape - move[pos].maxneg_shape;
+
+  ASSERT_ON_BOARD1(pos);
+  if (move[pos].numpos_shape > 1)
+    exponent += move[pos].numpos_shape - 1;
+  if (move[pos].numneg_shape > 1)
+    exponent -= move[pos].numneg_shape - 1;
+  return pow(1.05, exponent);
+}
+
+
+/*
+ * Usually the value of attacking a worm is twice its effective size,
+ * but when evaluating certain move reasons we need to adjust this to
+ * take effects on neighbors into account, e.g. for an attack_either
+ * move reason. This does not apply to the attack and defense move
+ * reasons, however, because then the neighbors already have separate
+ * attack or defense move reasons (if such apply).
+ *
+ * If the worm has an adjacent (friendly) dead dragon we add its
+ * value. At least one of the surrounding dragons must be alive. 
+ * If not, the worm must produce an eye of sufficient size, and that 
+ * should't be accounted for here.  As a guess, we suppose that
+ * a critical dragon is alive for our purpose here.
+ *
+ * On the other hand if it has an adjacent critical worm, and
+ * if (pos) does not defend that worm, we subtract the value of the
+ * worm, since (pos) may be defended by attacking that worm. We make at
+ * most one adjustment of each type.
+ */
+
+static float
+adjusted_worm_attack_value(int pos, int ww)
+{
+  int num_adj;
+  int adjs[MAXCHAIN];
+  int has_live_neighbor = 0;
+  float adjusted_value = 2 * worm[ww].effective_size;
+  float adjustment_up = 0.0;
+  float adjustment_down = 0.0;
+  int s;
+
+  num_adj = chainlinks(ww, adjs);
+  for (s = 0; s < num_adj; s++) {
+    int adj = adjs[s];
+
+    if (dragon[adj].status != DEAD)
+      has_live_neighbor = 1;
+
+    if (dragon[adj].status == DEAD
+       && 2*dragon[adj].effective_size > adjustment_up)
+      adjustment_up = 2*dragon[adj].effective_size;
+
+    if (worm[adj].attack_codes[0] != 0
+       && !does_defend(pos, adj)
+       && 2*worm[adj].effective_size > adjustment_down)
+      adjustment_down = 2*worm[adj].effective_size;
+  }
+
+  if (has_live_neighbor)
+    adjusted_value += adjustment_up;
+  adjusted_value -= adjustment_down;
+
+  /* It can happen that the adjustment down was larger than the effective
+   * size we started with. In this case we simply return 0.0. (This means
+   * we ignore the respective EITHER_MOVE reason.)
+   */
+  if (adjusted_value > 0.0)
+    return adjusted_value;
+  else
+    return 0.0;
+}
+
+
+/* The new (3.2) territorial evaluation overvalues moves creating a new
+ * group in the opponent's sphere of influence. The influence module cannot
+ * see that the opponent will gain by attacking the new (probably weak)
+ * group.
+ * This function uses some heuristics to estimate the strategic penalty
+ * of invasion moves, and moves that try to run away with a group of size
+ * 1 in front of opponent's strength.
+ */
+static float
+strategic_penalty(int pos, int color)
+{
+  int k;
+  float ret_val;
+  
+  /* We try to detect support from an alive friendly stone by checking
+   * whether all neighboring intersections belong to the opponent's moyo.
+   */
+  for (k = 0; k < 4; k++)
+    if (board[pos + delta[k]] == EMPTY
+        && whose_area(OPPOSITE_INFLUENCE(color), pos + delta[k])
+          != OTHER_COLOR(color))
+      return 0.0;
+  if (whose_area(OPPOSITE_INFLUENCE(color), pos) != OTHER_COLOR(color))
+    return 0.0;
+
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    /* We assume that invasion moves can only have the move reasons listed
+     * below.
+     *
+     * FIXME: EXPAND_TERRITORY should always be connected to our own
+     *        stones.  Remove later when that change is done.
+     */
+    switch (move_reasons[r].type) {
+#if 0
+    case EXPAND_TERRITORY_MOVE:
+#endif
+    case EXPAND_MOYO_MOVE:
+    case STRATEGIC_ATTACK_MOVE:
+    case INVASION_MOVE:
+      continue;
+    /* If we find a tactical defense move, we just test whether it concerns
+     * a single-stone-dragon; if not, we stop, if yes, we let the necessary
+     * tests be made in the OWL_DEFEND_MOVE case.
+     */
+    case DEFEND_MOVE:
+      {
+       int target = move_reasons[r].what;
+       if (dragon[target].size > 1)
+         return 0.0;
+       continue;
+      }
+    /* An owl defense of a single stone might be a stupid attempt to run
+     * away with an unimportant (kikashi like) stone. We assume this is the
+     * case if this single stone has a strong hostile direct neighbor.
+     */
+    case OWL_DEFEND_MOVE:
+      {
+       int target = move_reasons[r].what;
+       int has_strong_neighbor = 0;
+       int has_weak_neighbor = 0;
+       int i;
+       /* We award no penalty for running away with a cutting stone. */
+       if (dragon[target].size > 1
+           || worm[target].cutstone > 0
+           || worm[target].cutstone2 > 0)
+         return 0.0;
+       /* Third line moves (or lower) are ok -- they try to live, not run
+         * away.
+         */
+        if (edge_distance(pos) < 3)
+         return 0.0;
+       
+       for (i = 0; i < 4; i++)
+         if (board[target + delta[i]] == OTHER_COLOR(color)) {
+           if (dragon[target + delta[i]].size == 1) {
+             has_weak_neighbor = 1;
+             break;
+           }
+           switch (DRAGON2(target + delta[i]).safety) {
+           case INVINCIBLE:
+           case STRONGLY_ALIVE:
+             has_strong_neighbor = 1;
+             break;
+           case ALIVE:
+             if (DRAGON2(target + delta[i]).weakness > 0.4)
+               has_weak_neighbor = 1;
+             break;
+           default:
+             has_weak_neighbor = 1;
+           }
+         }
+       if (has_weak_neighbor || (!has_strong_neighbor))
+         return 0.0;
+       else
+         continue;
+      }
+    default:
+      return 0.0;
+    }  
+  }
+
+  /* We have to make a guess how much the point where we want to play
+   * is dominated by the opponent. The territorial valuation is a
+   * good try here.
+   */
+  ret_val = influence_territory(INITIAL_INFLUENCE(OTHER_COLOR(color)),
+                               pos, OTHER_COLOR(color));
+  ret_val *= 12.0;
+  ret_val = gg_max(0.0, ret_val);
+  return ret_val;
+}
+
+
+/* True if pos is adjacent to a nondead stone of the given color. This
+ * function can be called when stackp>0 but the result is given for
+ * the position when stackp==0. It also checks for nondead stones two
+ * steps away from pos if a move by color at pos cannot be cut off
+ * from that stone.
+ *
+ * FIXME: Move this somewhere more generally accessible, probably
+ *        utils.c
+ */
+int
+adjacent_to_nondead_stone(int pos, int color)
+{
+  int k;
+
+  int stack[MAXSTACK];
+  int move_color[MAXSTACK];
+  int saved_stackp = stackp;
+  int result = 0;
+
+  while (stackp > 0) {
+    get_move_from_stack(stackp - 1, &stack[stackp - 1],
+                       &move_color[stackp - 1]);
+    popgo();
+  }
+
+  if (trymove(pos, color, NULL, EMPTY)) {
+    for (k = 0; k < 12; k++) {
+      int pos2;
+      if (k < 8)
+       pos2 = pos + delta[k];
+      else if (ON_BOARD(pos + delta[k - 8]))
+       pos2 = pos + 2 * delta[k - 8];
+      else
+       continue;
+      
+      if (ON_BOARD(pos2)
+         && worm[pos2].color == color
+         && dragon[pos2].status != DEAD
+         && !disconnect(pos, pos2, NULL)) {
+       result = 1;
+       break;
+      }
+    }
+    popgo();
+  }
+
+  while (stackp < saved_stackp)
+    tryko(stack[stackp], move_color[stackp], NULL);
+  
+  return result;
+}
+
+static int
+max_lunch_eye_value(int pos)
+{
+  int min;
+  int probable;
+  int max;
+  
+  estimate_lunch_eye_value(pos, &min, &probable, &max, 0);
+  return max;
+}
+
+/*
+ * Estimate the direct territorial value of a move at (pos) by (color).
+ */
+static void
+estimate_territorial_value(int pos, int color, float our_score,
+                          int disable_delta_territory_cache)
+{
+  int other = OTHER_COLOR(color);
+  int k;
+  int aa = NO_MOVE;
+  int bb = NO_MOVE;
+  
+  float this_value = 0.0;
+  float tot_value = 0.0;
+  float secondary_value = 0.0;
+
+  int does_block = 0;
+  signed char safe_stones[BOARDMAX];
+  float strength[BOARDMAX];
+
+  set_strength_data(OTHER_COLOR(color), safe_stones, strength);
+  
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    if (move_reasons[r].status & TERRITORY_REDUNDANT)
+      continue;
+
+    this_value = 0.0;
+    switch (move_reasons[r].type) {
+    case ATTACK_MOVE:
+    case ATTACK_MOVE_GOOD_KO:
+    case ATTACK_MOVE_BAD_KO:
+      aa = move_reasons[r].what;
+      
+      ASSERT1(board[aa] != color, aa);
+      
+      /* Defenseless stone. */
+      if (worm[aa].defense_codes[0] == 0) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "  %1m:   %f (secondary) - attack on %1m (defenseless)\n",
+             pos, worm[aa].effective_size, aa);
+       secondary_value += worm[aa].effective_size;
+       does_block = 1;
+       break;
+      }
+
+      this_value = 2 * worm[aa].effective_size;
+
+      /* If the stones are dead, there is only a secondary value in
+       * capturing them tactically as well.
+       */
+      if (dragon[aa].status == DEAD) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "  %1m:   %f (secondary) - attack on %1m (dead)\n",
+             pos, 0.2 * this_value, aa);
+       secondary_value += 0.2 * this_value;
+       does_block = 1;
+       break;
+      }
+
+      /* Mark the string as captured, for evaluation in the influence code. */
+      mark_changed_string(aa, safe_stones, strength, 0);
+      TRACE("  %1m: attack on worm %1m\n", pos, aa);
+      
+      /* FIXME: How much should we reduce the value for ko attacks? */
+      if (move_reasons[r].type == ATTACK_MOVE)
+       this_value = 0.0;
+      else if (move_reasons[r].type == ATTACK_MOVE_GOOD_KO) {
+       this_value *= 0.3;
+       TRACE("  %1m: -%f - attack on worm %1m only with good ko\n",
+             pos, this_value, aa);
+      }        
+      else if (move_reasons[r].type == ATTACK_MOVE_BAD_KO) {
+       this_value *= 0.5;
+       TRACE("  %1m: -%f - attack on worm %1m only with bad ko\n",
+             pos, this_value, aa);
+      }
+      
+      tot_value -= this_value;
+      does_block = 1;
+      break;
+      
+    case DEFEND_MOVE:
+    case DEFEND_MOVE_GOOD_KO:
+    case DEFEND_MOVE_BAD_KO:
+      aa = move_reasons[r].what;
+      
+      ASSERT1(board[aa] == color, aa);
+      
+      /* 
+       * Estimate value 
+       */
+      this_value = 2 * worm[aa].effective_size;
+
+      /* If the stones are dead, we use the convention that
+       * defending them has a strategical value rather than
+       * territorial. Admittedly this make more sense for attacks on
+       * dead stones.
+       */
+      if (dragon[aa].status == DEAD) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "  %1m:   %f (secondary) - defense of %1m (dead)\n",
+             pos, 0.2 * this_value, aa);
+       secondary_value += 0.2 * this_value;
+       break;
+      }
+      
+      if (DRAGON2(aa).owl_status == CRITICAL
+         && (owl_defense_move_reason_known(pos, aa)
+             < defense_move_reason_known(pos, aa))
+         && !semeai_move_reason_known(pos, aa)) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "  %1m:   %f (secondary) - ineffective defense of %1m (critical)\n",
+             pos, 0.2 * this_value, aa);
+       secondary_value += 0.2 * this_value;
+       break;
+      }
+      
+      /* Mark the string as saved, for evaluation in the influence code. */
+      mark_changed_string(aa, safe_stones, strength, INFLUENCE_SAVED_STONE);
+      TRACE("  %1m: defense of worm %1m\n", pos, aa);
+      
+      /* FIXME: How much should we reduce the value for ko defenses? */
+      if (move_reasons[r].type == DEFEND_MOVE)
+       this_value = 0.0;
+      else if (move_reasons[r].type == DEFEND_MOVE_GOOD_KO) {
+       this_value *= 0.3;
+       TRACE("  %1m: -%f - defense of worm %1m with good ko\n",
+             pos, this_value, aa);
+      }        
+      else if (move_reasons[r].type == DEFEND_MOVE_BAD_KO) {
+       this_value *= 0.5;
+       TRACE("  %1m: -%f - defense of worm %1m with bad ko\n",
+             pos, this_value, aa);
+      }        
+    
+      tot_value -= this_value;
+
+      /* If a move tactically defends an owl critical string, but
+       * this move is not listed as an owl defense, it probably is
+       * ineffective. The 0.45 factor is chosen so that even in
+       * combination with bad ko it still has a positive net impact.
+       */
+      if (DRAGON2(aa).owl_status == CRITICAL
+         && (owl_defense_move_reason_known(pos, aa)
+             < defense_move_reason_known(pos, aa))) {
+       this_value = 0.45 * (2 * worm[aa].effective_size);
+       TRACE("  %1m: -%f - suspected ineffective defense of worm %1m\n",
+             pos, this_value, aa);
+       tot_value -= this_value;
+      }
+
+      does_block = 1;
+      break;
+
+    case ATTACK_THREAT:
+      aa = move_reasons[r].what;
+
+      /* Make sure this is a threat to attack opponent stones. */
+      ASSERT1(board[aa] == other, aa);
+      
+      if (dragon[aa].status == DEAD) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "    %1m: 0.0 - threatens to capture %1m (dead)\n", pos, aa);
+       break;
+      }
+
+      /* The followup value of a move threatening to attack (aa)
+       * is twice its effective size, with adjustments. If the
+       * worm has an adjacent (friendly) dead dragon we add its
+       * value. On the other hand if it has an adjacent critical
+       * worm, and if (pos) does not defend that worm, we subtract
+       * the value of the worm, since (aa) may be defended by
+       * attacking that worm. We make at most one adjustment
+       * of each type.
+       *
+       * No followup value is awarded if the defense move is a threat
+       * back on our move because we're likely to end in gote then,
+       * unless the move is unsafe anyway and played as a ko threat.
+       *
+       * FIXME: It might be possible that parts of the dragon
+       *        can be cut in the process of capturing the (aa)
+       *        worm. In that case, not the entire size of the 
+       *        adjacent dead dragon should be counted as a positive
+       *        adjustment.  However, it seems difficult to do this
+       *        analysis, and in most cases it won't apply, so we
+       *        leave it as it is for now.
+       *
+       * FIXME: The same analysis should be applied to
+       *        DEFEND_THREAT,
+       *        ATTACK_EITHER_MOVE, DEFEND_BOTH_MOVE. It should be 
+       *        broken out as separate functions and dealt with in
+       *        a structured manner.
+       */
+
+      if (trymove(pos, color, "estimate_territorial_value-A", NO_MOVE)) {
+       int adjs[MAXCHAIN];
+       float adjusted_value = 2 * worm[aa].effective_size;
+       float adjustment_up = 0.0;
+       float adjustment_down = 0.0;
+       int s;
+       int num_adj;
+       int defense_move;
+
+       /* In rare cases it may happen that the trymove() above
+         * actually removed the string at aa.
+        */
+       if (board[aa] == EMPTY)
+         num_adj = 0;
+       else
+         num_adj = chainlinks(aa, adjs);
+
+       /* No followup value if string can be defended with threat
+         * against our move. An exception to this is when our move
+         * isn't safe anyway and we play this only for the followup
+         * value, typically as a ko threat. Though, "suspicious" owl 
+        * defenses (move_safety != 1) are still tested for possible
+        * backfires.
+        *
+        * This rule may be overwritten with patterns. See pattern
+        * Sente22 and related test trevord:950 for an example.
+        *
+        * FIXME: This is somewhat halfhearted since only one defense
+        * move is tested.
+        */
+       if (!is_known_good_attack_threat(pos, aa)
+           && board[aa] != EMPTY
+           && (move[pos].move_safety == 1
+               || adjacent_to_nondead_stone(pos, color)
+               || owl_defense_move_reason_known(pos, -1))
+           && find_defense(aa, &defense_move) == WIN
+           && defense_move != NO_MOVE) {
+         int bad_followup;
+         int attack_move;
+
+         if (attack(pos, &attack_move) != WIN) {
+           int i;
+
+           if (trymove(defense_move, other,
+                       "estimate_territorial_value-b", NO_MOVE)) {
+             if (board[pos] == EMPTY || attack(pos, NULL) != 0) {
+               popgo();
+               popgo();
+               break;
+             }
+
+             /* Now check all `ATTACK_MOVE' reasons for this same
+              * move.  If the defense against current threat makes a
+              * string attacked by this move defendable, we reduce
+              * the followup.
+              *
+              * Adjustments done later are concerned with current
+              * dragon states.  Here we actually try to check if
+              * opponent's reply to our move will have a followup in
+              * turn.
+              */
+             for (i = 0; i < MAX_REASONS; i++) {
+               int reason = move[pos].reason[i];
+               int attacked_string;
+               if (reason < 0)
+                 break;
+
+               attacked_string = move_reasons[reason].what;
+               if (move_reasons[reason].type == ATTACK_MOVE
+                   && board[attacked_string] == other) {
+                 int defense_code = find_defense(attacked_string, NULL);
+                 double down_coefficient = 0.0;
+
+                 switch (defense_code) {
+                 case WIN:
+                   down_coefficient = 2.0;
+                   break;
+
+                 case KO_A:
+                   down_coefficient = 2.0 * 0.5;
+                   break;
+
+                 case KO_B:
+                   down_coefficient = 2.0 * 0.7;
+                   break;
+                 }
+
+                 if (adjustment_down
+                     < (worm[attacked_string].effective_size
+                        * down_coefficient)) {
+                   adjustment_down = (worm[attacked_string].effective_size
+                                      * down_coefficient);
+                 }
+               }
+             }
+
+             popgo();
+           }
+         }
+         else {
+           /* Our move is attackable to begin with.  However, maybe
+            * the attack is not sufficient to defend opponent's
+            * string?
+            */
+           if (trymove(attack_move, other,
+                       "estimate_territorial_value-c", NO_MOVE)) {
+             if (attack(aa, NULL) == 0) {
+               /* It is sufficient, no followup. */
+               popgo();
+               popgo();
+               break;
+             }
+
+             popgo();
+           }
+
+           /* Heuristically reduce the followup, since our string
+            * will be still attackable if opponent defends his
+            * string.
+            */
+           adjustment_down = 2 * countstones(pos);
+         }
+
+         bad_followup = 0;
+         for (s = 0; s < num_adj; s++) {
+           int lib;
+           if (countlib(adjs[s]) == 1) {
+             findlib(adjs[s], 1, &lib);
+             if (trymove(lib, other,
+                         "estimate_territorial_value-d", NO_MOVE)) {
+               if (!attack(aa, NULL)
+                   && (board[pos] == EMPTY || attack(pos, NULL) != 0)) {
+                 popgo();
+                 bad_followup = 1;
+                 break;
+               }
+               popgo();
+             }
+           }
+         }
+         if (bad_followup) {
+           popgo();
+           break;
+         }
+       }
+
+       for (s = 0; s < num_adj; s++) {
+         int adj = adjs[s];
+
+         if (same_string(pos, adj))
+           continue;
+         if (dragon[adj].color == color
+             && dragon[adj].status == DEAD
+             && 2*dragon[adj].effective_size > adjustment_up)
+           adjustment_up = 2*dragon[adj].effective_size;
+         if (dragon[adj].color == color
+             && attack(adj, NULL)
+             && 2*worm[adj].effective_size > adjustment_down)
+           adjustment_down = 2*worm[adj].effective_size;
+       }
+
+       popgo();
+
+       /* No followup if the string is not substantial. */
+       {
+         int save_verbose = verbose;
+         if (verbose > 0)
+           verbose --;
+         if (move[pos].move_safety == 0
+             && !owl_substantial(aa)) {
+           verbose = save_verbose;
+           break;
+         }
+         verbose = save_verbose;
+       }
+       
+       adjusted_value += adjustment_up;
+       adjusted_value -= adjustment_down;
+       if (adjusted_value > 0.0) {
+         add_followup_value(pos, adjusted_value);
+         TRACE("  %1m:   %f (followup) - threatens to capture %1m\n",
+               pos, adjusted_value, aa);
+       }
+      }
+      break;
+
+    case DEFEND_THREAT:
+      aa = move_reasons[r].what;
+
+      /* Make sure this is a threat to defend our stones. */
+      ASSERT1(board[aa] == color, aa);
+      
+      /* We don't trust tactical defense threats as ko threats, unless
+       * the move is safe.
+       */
+      if (move[pos].move_safety == 0)
+       break;
+
+      /* No followup value if string can be attacked with threat
+       * against our move. An exception to this is when our move
+       * isn't safe anyway and we play this only for the followup
+       * value, typically as a ko threat.
+       *
+       * FIXME: This is somewhat halfhearted since only one attack
+       * move is tested.
+       */
+      if (trymove(pos, color, "estimate_territorial_value-A", NO_MOVE)) {
+       int attack_move;
+       if (move[pos].move_safety == 1
+           && attack(aa, &attack_move) == WIN
+           && attack_move != NO_MOVE) {
+         if (trymove(attack_move, other,
+                     "estimate_territorial_value-b", NO_MOVE)) {
+           if (board[pos] == EMPTY || attack(pos, NULL) != 0) {
+             popgo();
+             popgo();
+             break;
+           }
+           popgo();
+         }
+       }
+       popgo();
+      }
+      
+      add_followup_value(pos, 2 * worm[aa].effective_size);
+
+      TRACE("  %1m:   %f (followup) - threatens to defend %1m\n",
+           pos, 2 * worm[aa].effective_size, aa);
+
+      break;
+
+    case UNCERTAIN_OWL_DEFENSE:
+      /* This move reason is valued as a strategical value. */
+      break;
+      
+    case CUT_MOVE:
+    case EXPAND_MOYO_MOVE:
+    case EXPAND_TERRITORY_MOVE:
+    case INVASION_MOVE:
+      does_block = 1;
+      break;
+
+    case CONNECT_MOVE:
+      /* This used to always set does_block=1, but there is no
+       * guarantee that a connection move is strategically safe. See
+       * for example gunnar:72.
+       */
+      if (move[pos].move_safety)
+       does_block = 1;
+      break;
+      
+    case STRATEGIC_ATTACK_MOVE:
+    case STRATEGIC_DEFEND_MOVE:
+      /* Do not trust these when we are scoring. Maybe we shouldn't
+       * trust them otherwise either but require them to be
+       * accompanied by e.g. an EXPAND move reason.
+       */
+      if (!doing_scoring)
+       does_block = 1;
+      break;
+      
+    case SEMEAI_THREAT:
+      aa = move_reasons[r].what;
+
+      /* threaten to win the semeai as a ko threat */
+      add_followup_value(pos, 2 * dragon[aa].effective_size);
+      TRACE("  %1m: %f (followup) - threatens to win semeai for %1m\n",
+           pos, 2 * dragon[aa].effective_size, aa);
+      break;
+      
+    case SEMEAI_MOVE:
+    case OWL_ATTACK_MOVE:
+    case OWL_ATTACK_MOVE_GOOD_KO:
+    case OWL_ATTACK_MOVE_BAD_KO:
+    case OWL_ATTACK_MOVE_GAIN:
+    case OWL_DEFEND_MOVE:
+    case OWL_DEFEND_MOVE_GOOD_KO:
+    case OWL_DEFEND_MOVE_BAD_KO:
+    case OWL_DEFEND_MOVE_LOSS:
+
+      if (move_reasons[r].type == OWL_ATTACK_MOVE_GAIN
+         || move_reasons[r].type == OWL_DEFEND_MOVE_LOSS) {
+        aa = either_data[move_reasons[r].what].what1;
+        bb = either_data[move_reasons[r].what].what2;
+      } 
+      else {
+       aa = move_reasons[r].what;
+       bb = NO_MOVE;
+      }
+
+      /* If the dragon is a single ko stone, the owl code currently
+       * won't detect that the owl attack is conditional. As a
+       * workaround we deduct 0.5 points for the move here, but only
+       * if the move is a liberty of the string.
+       */
+      if (dragon[aa].size == 1
+         && is_ko_point(aa)
+         && liberty_of_string(pos, aa)) {
+       TRACE("  %1m: -0.5 - penalty for ko stone %1m (workaround)\n",
+             pos, aa);
+       tot_value -= 0.5;
+      }
+
+      /* Mark the affected dragon for use in the territory analysis. */
+      mark_changed_dragon(pos, color, aa, bb, move_reasons[r].type,
+                         safe_stones, strength, &this_value);
+      this_value *= 2.0;
+
+      TRACE("  %1m: owl attack/defend for %1m\n", pos, aa);
+      
+      /* FIXME: How much should we reduce the value for ko attacks? */
+      if (move_reasons[r].type == OWL_ATTACK_MOVE
+         || move_reasons[r].type == OWL_DEFEND_MOVE
+         || move_reasons[r].type == SEMEAI_MOVE)
+       this_value = 0.0;
+      else if (move_reasons[r].type == OWL_ATTACK_MOVE_GOOD_KO
+              || move_reasons[r].type == OWL_DEFEND_MOVE_GOOD_KO) {
+       this_value *= 0.3;
+       TRACE("  %1m: -%f - owl attack/defense of %1m only with good ko\n",
+             pos, this_value, aa);
+      }        
+      else if (move_reasons[r].type == OWL_ATTACK_MOVE_BAD_KO
+              || move_reasons[r].type == OWL_DEFEND_MOVE_BAD_KO) {
+       this_value *= 0.5;
+       TRACE("  %1m: -%f - owl attack/defense of %1m only with bad ko\n",
+             pos, this_value, aa);
+      }
+      else if (move_reasons[r].type == OWL_ATTACK_MOVE_GAIN
+              || move_reasons[r].type == OWL_DEFEND_MOVE_LOSS) {
+       this_value = 0.0;
+      }
+      
+      tot_value -= this_value;
+
+      /* If the dragon is a single string which can be tactically
+       * attacked, but this owl attack does not attack tactically, it
+       * can be suspected to leave some unnecessary aji or even be an
+       * owl misread. Therefore we give it a small penalty to favor
+       * the moves which do attack tactically as well.
+       *
+       * One example is manyfaces:2 where the single stone S15 can be
+       * tactically attacked at S16 but where 3.3.2 finds additional
+       * owl attacks at R14 (clearly ineffective) and T15 (might work,
+       * but leaves huge amounts of aji).
+       */
+      if ((move_reasons[r].type == OWL_ATTACK_MOVE
+          || move_reasons[r].type == OWL_ATTACK_MOVE_GOOD_KO
+          || move_reasons[r].type == OWL_ATTACK_MOVE_BAD_KO)
+         && dragon[aa].size == worm[aa].size
+         && worm[aa].attack_codes[0] == WIN
+         && worm[aa].defense_codes[0] != 0
+         && attack_move_reason_known(pos, aa) != WIN) {
+       if (large_scale)
+         this_value = (2.0 + 0.05 * (2 * worm[aa].effective_size));
+       else
+         this_value = 0.05 * (2 * worm[aa].effective_size);
+       TRACE("  %1m: -%f - suspected ineffective owl attack of worm %1m\n",
+             pos, this_value, aa);
+       tot_value -= this_value;
+      }
+      
+      does_block = 1;
+      break;
+
+    case OWL_ATTACK_THREAT:
+      aa = move_reasons[r].what;
+
+      if (dragon[aa].status == DEAD) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "    %1m: 0.0 - threatens to owl attack %1m (dead)\n", pos, aa);
+       break;
+      }
+
+      /* The followup value of a move threatening to attack (aa) is
+       * twice its effective size, unless it has an adjacent
+       * (friendly) critical dragon. In that case it's probably a
+       * mistake to make the threat since it can defend itself with
+       * profit.
+       *
+       * FIXME: We probably need to verify that the critical dragon is
+       * substantial enough that capturing it saves the threatened
+       * dragon.
+       */       
+      {
+       float value = 2 * dragon[aa].effective_size;
+       int s;
+
+       for (s = 0; s < DRAGON2(aa).neighbors; s++) {
+         int d = DRAGON2(aa).adjacent[s];
+         int adj = dragon2[d].origin;
+
+         if (dragon[adj].color == color
+             && dragon[adj].status == CRITICAL
+             && dragon2[d].safety != INESSENTIAL
+             && !owl_defense_move_reason_known(pos, adj))
+           value = 0.0;
+       }
+       
+       if (value > 0.0) {
+         add_followup_value(pos, value);
+         TRACE("  %1m: %f (followup) - threatens to owl attack %1m\n",
+               pos, value, aa);
+       }
+      }
+      break;
+
+    case OWL_DEFEND_THREAT:
+      aa = move_reasons[r].what;
+
+      add_followup_value(pos, 2 * dragon[aa].effective_size);
+      TRACE("  %1m: %f (followup) - threatens to owl defend %1m\n",
+           pos, 2 * dragon[aa].effective_size, aa);
+      break;
+
+    case OWL_PREVENT_THREAT:
+      /* A move attacking a dragon whose defense can be threatened.
+       */
+      aa = move_reasons[r].what;
+
+      if (dragon[aa].status != DEAD) {
+       DEBUG(DEBUG_MOVE_REASONS,
+             "    %1m: 0.0 - prevent defense threat (dragon is not dead)\n",
+             pos);
+       break;
+      }
+
+      /* If the opponent just added a stone to a dead dragon, then
+       * attack it. If we are ahead, add a safety move here, at most
+       * half the margin of victory.
+       *
+       * This does not apply if we are doing scoring.
+       */
+      if (!doing_scoring
+         && is_same_dragon(get_last_opponent_move(color), aa)) {
+       this_value = 1.5 * dragon[aa].effective_size;
+       TRACE("  %1m: %f - attack last move played, although it seems dead\n",
+             pos, this_value);
+       tot_value += this_value * attack_dragon_weight;
+      }
+      else if (!doing_scoring && our_score > 0.0) {
+       /* tm - devalued this bonus (3.1.17) */
+       this_value = gg_min(0.9 * dragon[aa].effective_size,
+                           our_score/2.0 - board_size/2.0 - 1.0);
+       this_value = gg_max(this_value, 0);
+       TRACE("  %1m: %f - attack %1m, although it seems dead, as we are ahead\n",
+             pos, this_value, aa);
+       tot_value += this_value * attack_dragon_weight;
+      }
+      else {
+       
+       add_reverse_followup_value(pos, 2 * dragon[aa].effective_size);
+       if (board[aa] == color)
+         TRACE("  %1m: %f (reverse followup) - prevent threat to attack %1m\n",
+               pos, 2 * dragon[aa].effective_size, aa);
+       else 
+         TRACE("  %1m: %f (reverse followup) - prevent threat to defend %1m\n",
+               pos, 2 * dragon[aa].effective_size, aa);
+      }
+      break;
+      
+    case MY_ATARI_ATARI_MOVE:
+      /* Add 1.0 to compensate for -1.0 penalty because the move is
+       * thought to be a sacrifice.
+       */
+      this_value = move_reasons[r].what + 1.0;
+      tot_value += this_value;
+      TRACE("  %1m: %f - combination attack kills one of several worms\n",
+           pos, this_value);
+      break;
+      
+    case YOUR_ATARI_ATARI_MOVE:
+      /* Set does_block to force territorial valuation of the move.
+       * That way we can prefer defenses against combination attacks
+       * on dame points instead of inside territory.
+       */
+      does_block = 1;
+      this_value = move_reasons[r].what;
+      tot_value += this_value;
+      TRACE("  %1m: %f - defends against combination attack on several worms\n",
+           pos, this_value);
+      break;
+    }
+  }
+
+  /* Currently no difference in the valuation between blocking and
+   * expanding moves.
+   */
+  this_value = 0.0;
+
+  mark_inessential_stones(OTHER_COLOR(color), safe_stones);
+
+  if (move[pos].move_safety == 1
+      && (is_known_safe_move(pos) || safe_move(pos, color) != 0)) {
+    safe_stones[pos] = INFLUENCE_SAVED_STONE;
+    strength[pos] = DEFAULT_STRENGTH;
+    if (0)
+      TRACE("  %1m: is a safe move\n", pos);
+  }
+  else {
+    TRACE("  %1m: not a safe move\n", pos);
+    safe_stones[pos] = 0;
+    strength[pos] = 0.0;
+  }
+  
+  /* We don't check for move safety here. This enables a territorial
+   * evaluation for sacrifice moves that enable a break-through (or
+   * an owl defense).
+   */
+  if (does_block
+      && tryko(pos, color, "estimate_territorial_value")) {
+    Hash_data safety_hash = goal_to_hashvalue(safe_stones);
+    if (disable_delta_territory_cache
+       || !retrieve_delta_territory_cache(pos, color, &this_value, 
+                                          &move[pos].influence_followup_value,
+                                          OPPOSITE_INFLUENCE(color),
+                                          safety_hash)) {
+
+      compute_influence(OTHER_COLOR(color), safe_stones, strength, 
+                       &move_influence, pos, "after move");
+      increase_depth_values();
+      break_territories(OTHER_COLOR(color), &move_influence, 0, pos);
+      decrease_depth_values();
+      this_value = influence_delta_territory(OPPOSITE_INFLUENCE(color),
+                                            &move_influence, color, pos);
+      compute_followup_influence(&move_influence, &followup_influence,
+                                pos, "followup");
+                                 
+      if (this_value != 0.0)
+       TRACE("%1m: %f - change in territory\n", pos, this_value);
+      else
+       DEBUG(DEBUG_MOVE_REASONS, "%1m: 0.00 - change in territory\n", pos);
+      move[pos].influence_followup_value
+       = influence_delta_territory(&move_influence, &followup_influence,
+                                   color, pos);
+      store_delta_territory_cache(pos, color, this_value,
+                                 move[pos].influence_followup_value,
+                                 OPPOSITE_INFLUENCE(color), safety_hash);      
+    }
+    else {
+      if (this_value != 0.0)
+       TRACE("%1m: %f - change in territory (cached)\n", pos, this_value);
+      else
+       DEBUG(DEBUG_MOVE_REASONS,
+             "%1m: 0.00 - change in territory (cached)\n", pos);
+    }
+    popgo();
+    
+  }
+
+  tot_value += this_value;
+  
+  /* Test if min_territory or max_territory values constrain the
+   * delta_territory value.
+   */
+  if (tot_value < move[pos].min_territory
+      && move[pos].min_territory > 0) {
+    tot_value = move[pos].min_territory;
+    TRACE("  %1m:   %f - revised to meet minimum territory value\n", 
+         pos, tot_value);
+  }
+  if (tot_value > move[pos].max_territory) {
+    tot_value = move[pos].max_territory;
+    TRACE("  %1m:   %f - revised to meet maximum territory value\n",
+         pos, tot_value);
+  }
+    
+  move[pos].territorial_value = tot_value;
+  move[pos].secondary_value  += secondary_value;
+}
+
+
+/*
+ * Estimate the strategical value of a move at (pos).
+ */
+static void
+estimate_strategical_value(int pos, int color, float our_score,
+                          int use_thrashing_dragon_heuristics)
+{
+  int k;
+  int l;
+  int aa = NO_MOVE;
+  int bb = NO_MOVE;
+  float aa_value = 0.0;
+  float bb_value = 0.0;
+  
+  float this_value = 0.0;
+  float tot_value = 0.0;
+
+  /* Strategical value of connecting or cutting dragons. */
+  float dragon_value[BOARDMAX];
+
+  for (aa = BOARDMIN; aa < BOARDMAX; aa++)
+    dragon_value[aa] = 0.0;
+  
+  for (k = 0; k < MAX_REASONS; k++) {
+    int r = move[pos].reason[k];
+    if (r < 0)
+      break;
+    if (move_reasons[r].status & STRATEGICALLY_REDUNDANT)
+      continue;
+    
+    this_value = 0.0;
+    switch (move_reasons[r].type) {
+      case ATTACK_MOVE:
+      case ATTACK_MOVE_GOOD_KO:
+      case ATTACK_MOVE_BAD_KO:
+      case DEFEND_MOVE:
+      case DEFEND_MOVE_GOOD_KO:
+      case DEFEND_MOVE_BAD_KO:
+       aa = move_reasons[r].what;
+      
+       /* Defenseless stone */
+       if (worm[aa].defense_codes[0] == 0)
+         break;
+
+       if (doing_scoring && dragon[aa].status == DEAD)
+         break;
+       
+       /* FIXME: This is totally ad hoc, just guessing the value of
+         *        potential cutting points.
+        * FIXME: When worm[aa].cutstone2 == 1 we should probably add
+        *        a followup value.
+        */
+       if (worm[aa].cutstone2 > 1 && !worm[aa].inessential) {
+         double ko_factor = 1;
+         if (move_reasons[r].type == ATTACK_MOVE_GOOD_KO
+             || move_reasons[r].type == DEFEND_MOVE_GOOD_KO) {
+           ko_factor = 0.6;
+         }
+         else if (move_reasons[r].type == ATTACK_MOVE_BAD_KO
+                  || move_reasons[r].type == DEFEND_MOVE_BAD_KO) {
+           ko_factor = 0.4;
+         }
+         this_value = 10.0 * (worm[aa].cutstone2 - 1) * ko_factor;
+         TRACE("  %1m: %f - %1m cutstone\n", pos, this_value, aa);
+       }
+       
+       tot_value += this_value;
+       
+       /* If the string is a lunch for a weak dragon, the attack or
+         * defense has a strategical value. This can be valued along
+        * the same lines as strategic_attack/strategic_defend.
+        *
+        * No points are awarded if the lunch is an inessential dragon
+        * or worm.
+        */
+       if (DRAGON2(aa).safety == INESSENTIAL
+           || worm[aa].inessential)
+         break;
+
+       /* If the lunch has no potential to create eyes, no points. */
+       if (max_lunch_eye_value(aa) == 0)
+         break;
+       
+       /* Can't use k in this loop too. */
+       for (l = 0; l < next_lunch; l++)
+         if (lunch_worm[l] == aa) {
+           bb = lunch_dragon[l];
+
+           /* FIXME: This value cannot be computed without some measurement
+            * of how the actual move affects the dragon.  The dragon safety
+            * alone is not enough. The question is whether the dragon is
+            * threatened or defended by the move or not.  
+            */
+           this_value = 1.8 * soft_cap(DRAGON2(bb).strategic_size, 15.0)
+                        * dragon_weakness(bb, 0);
+
+           /* If this dragon consists of only one worm and that worm
+            * can be tactically captured or defended by this move, we
+            * have already counted the points as territorial value,
+            * unless it's assumed to be dead.
+            */
+           if (dragon[bb].status != DEAD
+               && dragon[bb].size == worm[bb].size
+               && (attack_move_reason_known(pos, bb)
+                   || defense_move_reason_known(pos, bb)))
+             this_value = 0.0;
+
+           /* If this dragon can be tactically attacked and the move
+             * does not defend or attack, no points.
+            */
+           if (worm[bb].attack_codes[0] != 0
+               && ((color == board[bb] && !does_defend(pos, bb))
+                   || (color == OTHER_COLOR(board[bb])
+                       && !does_attack(pos, bb))))
+             this_value = 0.0;
+
+           /* If we are doing scoring, are alive, and the move loses
+             * territory, no points.
+            */
+           if (doing_scoring
+               && move[pos].territorial_value < 0.0
+               && (DRAGON2(bb).safety == ALIVE
+                   || DRAGON2(bb).safety == STRONGLY_ALIVE
+                   || DRAGON2(bb).safety == INVINCIBLE))
+             this_value = 0.0;
+           
+           if (this_value > dragon_value[bb]) {
+             DEBUG(DEBUG_MOVE_REASONS,
+                   "  %1m:   %f - %1m attacked/defended\n",
+                   pos, this_value, bb);
+             dragon_value[bb] = this_value;
+           }
+         }
+
+       break;
+       
+      case ATTACK_THREAT:
+      case DEFEND_THREAT:
+        break;
+
+      case EITHER_MOVE:
+       /* FIXME: Generalize this to more types of threats. */
+       /* FIXME: We need a policy if a move has several EITHER_MOVE
+        * reasons. Most likely not all of them can be achieved.
+        */
+       aa = either_data[move_reasons[r].what].what1;
+       bb = either_data[move_reasons[r].what].what2;
+
+       /* If both worms are dead, this move reason has no value. */
+       if (dragon[aa].status == DEAD 
+           && dragon[bb].status == DEAD)
+         break;
+
+       /* Also if there is a combination attack, we assume it covers
+        * the same thing.
+        * FIXME: This is only applicable as long as the only moves
+        *        handled by EITHER_MOVE are attacks.
+        */
+       if (move_reason_known(pos, MY_ATARI_ATARI_MOVE, -1))
+         break;
+
+       aa_value = adjusted_worm_attack_value(pos, aa);
+       bb_value = adjusted_worm_attack_value(pos, bb);
+       this_value = gg_min(aa_value, bb_value);
+
+       TRACE("  %1m: %f - either attacks %1m (%f) or attacks %1m (%f)\n",
+             pos, this_value, aa, aa_value, bb, bb_value);
+
+       tot_value += this_value;
+       break;
+       
+      case ALL_MOVE:
+       /* FIXME: Generalize this to more types of threats. */
+       aa = all_data[move_reasons[r].what].what1;
+       bb = all_data[move_reasons[r].what].what2;
+
+       /* If both worms are dead, this move reason has no value. */
+       if (dragon[aa].status == DEAD 
+           && dragon[bb].status == DEAD)
+         break;
+
+       /* Also if there is a combination attack, we assume it covers
+        * the same thing.
+        */
+       if (move_reason_known(pos, YOUR_ATARI_ATARI_MOVE, -1))
+         break;
+
+       aa_value = worm[aa].effective_size;
+       bb_value = worm[bb].effective_size;
+       this_value = 2 * gg_min(aa_value, bb_value);
+
+       TRACE("  %1m: %f - both defends %1m (%f) and defends %1m (%f)\n",
+             pos, this_value, aa, aa_value, bb, bb_value);
+
+       tot_value += this_value;
+       break;
+       
+      case CONNECT_MOVE:
+
+       /* If the opponent just added a stone to a dead dragon, which is
+        * adjacent to both dragons being connected, then the connection
+        * is probably a good way to make sure the thrashing dragon
+        * stays dead. If we are ahead, add a safety move here, at most
+        * half the margin of victory.
+        *
+        * This does only apply if we decided earlier we want to use
+        * thrashing dragon heuristics.
+        */
+      
+       if (use_thrashing_dragon_heuristics) {
+         int cc;
+         aa = dragon[conn_worm1[move_reasons[r].what]].origin;
+         bb = dragon[conn_worm2[move_reasons[r].what]].origin;
+         cc = get_last_opponent_move(color);
+
+         if (cc != NO_MOVE
+             && thrashing_stone[cc]
+             && are_neighbor_dragons(aa, cc)
+             && are_neighbor_dragons(bb, cc)) {
+           if (aa == bb)
+             this_value = 1.6 * DRAGON2(cc).strategic_size;
+           else if (DRAGON2(aa).safety == INESSENTIAL
+                    || DRAGON2(bb).safety == INESSENTIAL) {
+             if ((DRAGON2(aa).safety == INESSENTIAL
+                  && max_lunch_eye_value(aa) == 0)
+                 || (DRAGON2(bb).safety == INESSENTIAL
+                     && max_lunch_eye_value(bb) == 0))
+               this_value = 0.0;
+             else
+               this_value = 0.8 * DRAGON2(cc).strategic_size;
+           }
+           else
+             this_value = 1.7 * DRAGON2(cc).strategic_size;
+           
+           if (this_value > dragon_value[dragon[cc].origin]) {
+             dragon_value[dragon[cc].origin] = this_value;
+             DEBUG(DEBUG_MOVE_REASONS,
+                   "  %1m:   %f - connect %1m and %1m to attack thrashing dragon %1m\n",
+                   pos, this_value, aa, bb, cc);
+           }
+         }
+       }
+
+       if (!move[pos].move_safety)
+         break;
+       /* Otherwise fall through. */
+      case CUT_MOVE:
+       if (doing_scoring && !move[pos].move_safety)
+         break;
+
+       aa = dragon[conn_worm1[move_reasons[r].what]].origin;
+       bb = dragon[conn_worm2[move_reasons[r].what]].origin;
+
+       if (aa == bb)
+         continue;
+
+       /* If we are ahead by more than 20, value connections more strongly */
+       if (our_score > 20.0)
+         this_value = connection_value(aa, bb, pos, our_score);
+       else
+         this_value = connection_value(aa, bb, pos, 0);
+       if (this_value > dragon_value[aa]) {
+         dragon_value[aa] = this_value;
+          DEBUG(DEBUG_MOVE_REASONS,
+               "  %1m:   %f - %1m cut/connect strategic value\n",
+               pos, this_value, aa);
+       }
+
+       
+       if (our_score > 20.0)
+         this_value = connection_value(bb, aa, pos, our_score);
+       else
+         this_value = connection_value(bb, aa, pos, 0);
+       if (this_value > dragon_value[bb]) {
+         dragon_value[bb] = this_value;
+          DEBUG(DEBUG_MOVE_REASONS,
+               "  %1m:   %f - %1m cut/connect strategic value\n",
+               pos, this_value, bb);
+       }
+       
+       break;
+       
+      case SEMEAI_MOVE:
+       /*
+        * The strategical value of winning a semeai is
+        * own dragons (usually) becomes fully secure, while adjoining
+        * enemy dragons do not.
+        *
+        * FIXME: Valuation not implemented at all yet. 
+        */
+
+       break;
+       
+      case STRATEGIC_ATTACK_MOVE:
+      case STRATEGIC_DEFEND_MOVE:      
+       /* The right way to do this is to estimate the safety of the
+        * dragon before and after the move. Unfortunately we are
+        * missing good ways to do this currently.
+        *
+        * Temporary solution is to only look at an ad hoc measure of
+        * the dragon safety and ignoring the effectiveness of the
+        * move.
+        *
+        * FIXME: Improve the implementation.
+        */
+       aa = move_reasons[r].what;
+
+       /* FIXME: This value cannot be computed without some
+        * measurement of how the actual move affects the dragon. The
+        * dragon safety alone is not enough. The question is whether
+        * the dragon is threatened by the move or not.
+        */
+       if (use_thrashing_dragon_heuristics
+           && thrashing_stone[aa])
+         this_value = 1.7 * DRAGON2(aa).strategic_size;
+       else
+         this_value = 1.8 * soft_cap(DRAGON2(aa).strategic_size, 15.0)
+                      * dragon_weakness(aa, 1);
+
+       /* No strategical attack value is awarded if the dragon at (aa)
+        * has an adjacent (friendly) critical dragon, which is not
+        * defended by this move. In that case it's probably a mistake
+        * to make the strategical attack since the dragon can defend
+        * itself with profit.
+        *
+        * FIXME: We probably need to verify that the critical dragon is
+        * substantial enough that capturing it saves the strategically
+        * attacked dragon.
+        */
+       if (move_reasons[r].type == STRATEGIC_ATTACK_MOVE) {
+         int s;
+         
+         for (s = 0; s < DRAGON2(aa).neighbors; s++) {
+           int d = DRAGON2(aa).adjacent[s];
+           int adj = dragon2[d].origin;
+           
+           if (dragon[adj].color == color
+               && dragon[adj].status == CRITICAL
+               && dragon2[d].safety != INESSENTIAL
+               && !owl_defense_move_reason_known(pos, adj))
+             this_value = 0.0;
+         }
+       }
+       
+       /* Multiply by attack_dragon_weight to try to find a best fit */
+       this_value = this_value * attack_dragon_weight;
+               
+       if (this_value > dragon_value[aa]) {
+         dragon_value[aa] = this_value;
+          DEBUG(DEBUG_MOVE_REASONS,
+               "  %1m:   %f - %1m strategic attack/defend\n",
+               pos, this_value, aa);
+
+       }
+       break;
+
+      case UNCERTAIN_OWL_DEFENSE:
+       aa = move_reasons[r].what;
+       
+       /* If there is an adjacent dragon which is critical we should
+        * skip this type of move reason, since attacking or defending
+        * the critical dragon is more urgent.
+        */
+       {
+         int d;
+         int found_one = 0;
+         
+         for (d = 0; d < DRAGON2(aa).neighbors; d++)
+           if (DRAGON(DRAGON2(aa).adjacent[d]).status == CRITICAL)
+             found_one = 1;
+         if (found_one)
+           break;
+       }
+       
+       /* If we are behind, we should skip this type of move reason. 
+        * If we are ahead, we should value it more. 
+        */
+       if (our_score < 0.0)
+         this_value = 0.0;
+       else 
+         this_value = gg_min(2*DRAGON2(aa).strategic_size, 0.65*our_score);
+       
+       if (this_value > dragon_value[aa]) {
+         dragon_value[aa] = this_value;
+         DEBUG(DEBUG_MOVE_REASONS,
+               "  %1m:   %f - %1m uncertain owl defense bonus\n",
+               pos, this_value, aa);
+       }
+
+       break;
+    }
+  }
+  
+  for (aa = BOARDMIN; aa < BOARDMAX; aa++) {
+    if (dragon_value[aa] == 0.0)
+      continue;
+
+    ASSERT1(dragon[aa].origin == aa, aa);
+
+    /* If this dragon is critical but not attacked/defended by this
+     * move, we ignore the strategic effect.
+     */
+    if (dragon[aa].status == CRITICAL
+       && !owl_move_reason_known(pos, aa)) {
+      DEBUG(DEBUG_MOVE_REASONS, "  %1m: 0.0 - disregarding strategic effect on %1m (critical dragon)\n",
+           pos, aa);
+      continue;
+    }
+    
+    /* If this dragon consists of only one worm and that worm can
+     * be tactically captured or defended by this move, we have
+     * already counted the points as territorial value, unless
+     * it's assumed to be dead.
+     * However, we still allow strategical excess value (see below)
+     * in case the effective_size is substantially bigger (by 2.0)
+     * than the actualy size.
+     */
+    if (dragon[aa].status != DEAD
+       && dragon[aa].size == worm[aa].size
+       && worm[aa].effective_size < worm[aa].size + 2.0
+       && (attack_move_reason_known(pos, aa)
+           || defense_move_reason_known(pos, aa))) {
+      TRACE("  %1m:   %f - %1m strategic value already counted - A.\n",
+           pos, dragon_value[aa], aa);
+      continue;
+    }
+    /* If the dragon has been owl captured, owl defended, or involved
+     * in a semeai, we have likewise already counted the points as
+     * territorial value.
+     */
+    if (attack_move_reason_known(pos, aa)
+       || defense_move_reason_known(pos, aa)
+       || (owl_move_reason_known(pos, aa)
+           && dragon[aa].status == CRITICAL)
+       || move_reason_known(pos, SEMEAI_MOVE, aa)) {
+      /* But if the strategical value was larger than the territorial
+       * value (e.g. because connecting to strong dragon) we award the
+       * excess value as a bonus.
+       */
+      float excess_value = (dragon_value[aa] - 
+                           2 * DRAGON2(aa).strategic_size);
+      if (excess_value > 0.0) {
+       TRACE("  %1m: %f - strategic bonus for %1m\n", pos, excess_value, aa);
+       tot_value += excess_value;
+      }
+      else {
+       TRACE("  %1m:   %f - %1m strategic value already counted - B.\n",
+             pos, dragon_value[aa], aa);
+      }
+      
+      continue;
+    }
+
+    TRACE("  %1m: %f - strategic effect on %1m\n",
+         pos, dragon_value[aa], aa);
+    tot_value += dragon_value[aa];
+  }
+
+  /* Finally, subtract penalty for invasion type moves. */
+  this_value = strategic_penalty(pos, color);
+  /* Multiply by invasion_malus_weight to allow us to fit the weight */
+  this_value = this_value * invasion_malus_weight;
+  if (this_value > 0.0) {
+    TRACE("  %1m: %f - strategic penalty, considered as invasion.\n",
+         pos, -this_value);
+    tot_value -= this_value;
+  }
+
+  move[pos].strategical_value = tot_value;
+}
+
+
+/* Compare two move reasons, used for sorting before presentation. */
+static int
+compare_move_reasons(const void *p1, const void *p2)
+{
+  const int mr1 = *(const int *) p1;
+  const int mr2 = *(const int *) p2;
+
+  if (move_reasons[mr1].type != move_reasons[mr2].type)
+    return move_reasons[mr2].type - move_reasons[mr1].type;
+  else
+    return move_reasons[mr2].what - move_reasons[mr1].what;
+}
+
+
+/*
+ * Combine the reasons for a move at (pos) into a simple numerical value.
+ * These heuristics are now somewhat less ad hoc than before but probably
+ * still need a lot of improvement.
+ */
+static float
+value_move_reasons(int pos, int color, float pure_threat_value,
+                  float our_score, int use_thrashing_dragon_heuristics)
+{
+  float tot_value;
+  float shape_factor;
+
+  gg_assert(stackp == 0);
+  
+  /* Is it an antisuji? */
+  if (is_antisuji_move(pos))
+    return 0.0; /* This move must not be played. End of story. */
+
+  /* Never play on a vertex which is unconditional territory for
+   * either player. There is absolutely nothing to gain.
+   */
+  if (worm[pos].unconditional_status != UNKNOWN)
+    return 0.0;
+  
+  /* If this move has no reason at all, we can skip some steps. */
+  if (move[pos].reason[0] >= 0
+      || move[pos].min_territory > 0.0) {
+    int num_reasons;
+
+    /* Sort the move reasons. This makes it easier to visually compare
+     * the reasons for different moves in the trace outputs.
+     */
+    num_reasons = 0;
+    while (move[pos].reason[num_reasons] >= 0 && num_reasons < MAX_REASONS)
+      num_reasons++;
+    gg_sort(move[pos].reason, num_reasons, sizeof(move[pos].reason[0]),
+           compare_move_reasons);
+
+    /* Discard move reasons that only duplicate another. */
+    discard_redundant_move_reasons(pos);
+
+    /* Estimate the value of various aspects of the move. The order
+     * is significant. Territorial value must be computed before
+     * strategical value. See connection_value().
+     */
+    estimate_territorial_value(pos, color, our_score, 0);
+    estimate_strategical_value(pos, color, our_score,
+                              use_thrashing_dragon_heuristics);
+  }
+
+  /* Introduction of strategical_weight and territorial_weight, 
+   * for automatic fitting. (3.5.1)
+   */
+  tot_value = territorial_weight * move[pos].territorial_value + 
+              strategical_weight * move[pos].strategical_value;
+
+  shape_factor = compute_shape_factor(pos);
+
+  if (tot_value > 0.0) {
+    int c;
+    float followup_value;
+
+    /* Negative territorial followup doesn't make make sense. */
+    if (move[pos].influence_followup_value < 0.0)
+      move[pos].influence_followup_value = 0.0;
+     
+    followup_value = move[pos].followup_value
+                    + move[pos].influence_followup_value;
+    TRACE("  %1m:   %f - total followup value, added %f as territorial followup\n",
+         pos, followup_value, move[pos].influence_followup_value);
+
+    /* In the endgame, there are a few situations where the value can
+     * be 0 points + followup.  But we want to take the intersections first
+     * were we actually get some points.  0.5 points is a 1 point ko which
+     * is the smallest value that is actually worth something.
+     */
+    if (tot_value >= 0.5) {
+      float old_tot_value = tot_value;
+      float contribution;
+      /* We adjust the value according to followup and reverse followup
+       * values.
+       */
+      contribution = gg_min(gg_min(0.5 * followup_value
+                                  + 0.5 * move[pos].reverse_followup_value,
+                                  1.0 * tot_value
+                                  + followup_value),
+                           1.1 * tot_value
+                           + move[pos].reverse_followup_value);
+      tot_value += contribution * followup_weight;
+      /* The first case applies to gote vs gote situation, the
+       * second to reverse sente, and the third to sente situations.
+       * The usual rule is that a sente move should count at double
+       * value. But if we have a 1 point move with big followup (i.e.
+       * sente) we want to play that before a 2 point gote move. Hence
+       * the factor 1.1 above.
+       */
+      
+      if (contribution != 0.0) {
+       TRACE("  %1m: %f - added due to followup (%f) and reverse followup values (%f)\n",
+             pos, contribution, followup_value,
+             move[pos].reverse_followup_value);
+      }
+
+      /* If a ko fight is going on, we should use the full followup
+       * and reverse followup values in the total value. We save the
+       * additional contribution for later access.
+       */
+      move[pos].additional_ko_value =
+       followup_value 
+       + move[pos].reverse_followup_value 
+       - (tot_value - old_tot_value);
+
+      /* Not sure whether this could happen, but check for safety. */
+      if (move[pos].additional_ko_value < 0.0)
+       move[pos].additional_ko_value = 0.0;
+    }
+    else {
+      move[pos].additional_ko_value =
+       shape_factor * (move[pos].followup_value
+                       + move[pos].reverse_followup_value);
+    }
+
+    tot_value += soft_cap(0.05 * move[pos].secondary_value, 0.4);
+    if (move[pos].secondary_value != 0.0)
+      TRACE("  %1m: %f - secondary\n", pos,
+           soft_cap(0.05 * move[pos].secondary_value, 0.4));
+
+    if (move[pos].numpos_shape + move[pos].numneg_shape > 0) {
+      /* shape_factor has already been computed. */
+      float old_value = tot_value;
+      /* Maximum 15 points of the territorial value will be weighted by shape_factor */
+      if (move[pos].territorial_value < 15)
+        tot_value *= shape_factor;
+      else {
+        float non_shape_val = move[pos].territorial_value - 15;
+        tot_value = (tot_value - non_shape_val) * shape_factor + non_shape_val;
+      }
+
+      if (verbose) {
+       /* Should all have been TRACE, except we want field sizes. */
+       gprintf("  %1m: %f - shape ", pos, tot_value - old_value);
+       fprintf(stderr,
+               "(shape values +%4.2f(%d) -%4.2f(%d), shape factor %5.3f)\n",
+               move[pos].maxpos_shape, move[pos].numpos_shape,
+               move[pos].maxneg_shape, move[pos].numneg_shape,
+               shape_factor);
+      }
+    }
+
+    /* Add a special shape bonus for moves which connect own strings
+     * or cut opponent strings.
+     */
+    c = (move_connects_strings(pos, color, 1)
+        + move_connects_strings(pos, OTHER_COLOR(color), 0));
+    if (c > 0) {
+      float shape_factor2 = pow(1.02, (float) c) - 1;
+      float base_value = gg_max(gg_min(tot_value, 5.0), 1.0);
+      if (verbose) {
+       /* Should all have been TRACE, except we want field sizes. */
+       gprintf("  %1m: %f - connects strings ", pos,
+               base_value * shape_factor2);
+       fprintf(stderr, "(connect value %d, shape factor %5.3f)\n", c,
+               shape_factor2);
+      }
+      tot_value += base_value * shape_factor2;
+    }
+
+    /* Dame points which have a cut or connect move reason get a small
+     * extra bonus because these have a tendency to actually be worth
+     * a point.
+     */
+    if (tot_value < 0.3
+       && (move_reason_known(pos, CONNECT_MOVE, -1)
+           || move_reason_known(pos, CUT_MOVE, -1))) {
+      float old_tot_value = tot_value;
+      tot_value = gg_min(0.3, tot_value + 0.1);
+      TRACE("  %1m: %f - cut/connect dame bonus\n", pos,
+           tot_value - old_tot_value);
+    }
+  }
+  else {
+    move[pos].additional_ko_value =
+      shape_factor * (move[pos].followup_value +
+                     gg_min(move[pos].followup_value,
+                            move[pos].reverse_followup_value));
+  }
+
+  /* If the move is valued 0 or small, but has followup values and is
+   * flagged as a worthwhile threat, add up to pure_threat_value to
+   * the move.
+   *
+   * FIXME: We shouldn't have to call confirm_safety() here. It's
+   * potentially too expensive.
+   */
+  if (pure_threat_value > 0.0 
+      && move[pos].worthwhile_threat
+      && tot_value <= pure_threat_value
+      && board[pos] == EMPTY
+      && move[pos].additional_ko_value > 0.0
+      && is_legal(pos, color)
+      && value_moves_confirm_safety(pos, color)) {
+    float new_tot_value = gg_min(pure_threat_value,
+                                tot_value
+                                + 0.25 * move[pos].additional_ko_value);
+
+    /* Make sure that moves with independent value are preferred over
+     * those without.
+     */
+    new_tot_value *= (1.0 - 0.1 * (pure_threat_value - tot_value)
+                     / pure_threat_value);
+    
+    if (new_tot_value > tot_value) {
+      TRACE("  %1m: %f - carry out threat or defend against threat\n",
+           pos, new_tot_value - tot_value);
+      tot_value = new_tot_value;
+    }
+  }
+  
+  /* min_value is now subject to reduction with a fitted weight (3.5.1) */
+  move[pos].min_value = move[pos].min_value * minimum_value_weight;
+  move[pos].max_value = move[pos].max_value * maximum_value_weight;
+  
+  /* Test if min_value or max_value values constrain the total value.
+   * First avoid contradictions between min_value and max_value,
+   * assuming that min_value is right.
+   */
+  if (move[pos].min_value > move[pos].max_value)
+    move[pos].max_value = move[pos].min_value;
+
+  /* If several moves have an identical minimum value, then GNU Go uses the
+   * following secondary criterion (unless min_value and max_value agree, and
+   * unless min_value is bigger than 25, in which case it probably comes from
+   * a J or U pattern): 
+   */
+  if (move[pos].min_value < 25)
+    move[pos].min_value += tot_value / 200;
+  if (tot_value < move[pos].min_value
+      && move[pos].min_value > 0) {
+    tot_value = move[pos].min_value;
+    TRACE("  %1m:   %f - minimum accepted value\n", pos, tot_value);
+  }
+  
+  if (tot_value > move[pos].max_value) {
+    tot_value = move[pos].max_value;
+    TRACE("  %1m:   %f - maximum accepted value\n",
+          pos, tot_value);
+  }
+
+  if (tot_value > 0
+      || move[pos].territorial_value > 0
+      || move[pos].strategical_value > 0) {
+    TRACE("Move generation values %1m to %f\n", pos, tot_value);
+    move_considered(pos, tot_value);
+  }
+
+  return tot_value;
+}
+
+
+/*
+ * Loop over all possible moves and value the move reasons for each.
+ */
+static void
+value_moves(int color, float pure_threat_value, float our_score,
+            int use_thrashing_dragon_heuristics)
+{
+  int m, n;
+  int pos;
+
+  TRACE("\nMove valuation:\n");
+  
+  /* Visit the moves in the standard lexicographical order */
+  for (n = 0; n < board_size; n++)
+    for (m = board_size-1; m >= 0; m--) {
+      pos = POS(m, n);
+
+      move[pos].value = value_move_reasons(pos, color, 
+                                          pure_threat_value, our_score,
+                                          use_thrashing_dragon_heuristics);
+      if (move[pos].value == 0.0)
+       continue;
+      
+      /* Maybe this test should be performed elsewhere. This is just
+       * to get some extra safety. We don't filter out illegal ko
+       * captures here though, because if that is the best move, we
+       * should reevaluate ko threats.
+       */
+      if (is_legal(pos, color) || is_illegal_ko_capture(pos, color)) {
+       /* Add a random number between 0 and 0.01 to use in comparisons. */
+       move[pos].value += 
+         0.01 * move[pos].random_number * move[pos].randomness_scaling;
+      }
+      else {
+       move[pos].value = 0.0;
+       TRACE("Move at %1m wasn't legal.\n", pos);
+      }
+    }
+}
+
+
+/* Print the values of all moves with values bigger than zero. */
+
+void
+print_all_move_values(FILE *output)
+{
+  int pos;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos) || move[pos].final_value <= 0.0)
+      continue;
+      
+    gfprintf(output, "%1M %f\n", pos, move[pos].final_value);
+  }
+}
+
+/* Search through all board positions for the 10 highest valued
+ * moves and print them.
+ */
+
+static void
+print_top_moves(void)
+{
+  int k;
+  int pos;
+  float tval;
+  
+  for (k = 0; k < 10; k++) {
+    best_moves[k] = NO_MOVE;
+    best_move_values[k] = 0.0;
+  }
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos) || move[pos].final_value <= 0.0)
+      continue;
+      
+    tval = move[pos].final_value;
+    record_top_move(pos, tval);
+  }
+  
+  if (verbose > 0 || (debug & DEBUG_TOP_MOVES)) {
+    gprintf("\nTop moves:\n");
+    for (k = 0; k < 10 && best_move_values[k] > 0.0; k++)
+      gprintf("%d. %1M %f\n", k+1, best_moves[k], best_move_values[k]);
+  }
+}
+
+/* Add a move to the list of top moves (if it is among the top ten) */
+
+void
+record_top_move(int pos, float val)
+{
+  int k;
+  for (k = 9; k >= 0; k--)
+    if (val > best_move_values[k]) {
+      if (k < 9) {
+       best_move_values[k+1] = best_move_values[k];
+       best_moves[k+1] = best_moves[k];
+      }
+      best_move_values[k] = val;
+      best_moves[k] = pos;
+    }
+
+  move[pos].final_value = val;
+}
+
+/* remove a rejected move from the list of top moves */
+
+void
+remove_top_move(int move)
+{
+  int k;
+  for (k = 0; k < 10; k++) {
+    if (best_moves[k] == move) {
+      int l;
+      for (l = k; l < 9; l++) {
+       best_moves[l] = best_moves[l+1];
+       best_move_values[l] = best_move_values[l+1];
+      }
+      best_moves[9] = NO_MOVE;
+      best_move_values[9] = 0.0;
+    }
+  }
+}
+
+/* This function is called if the biggest move on board was an illegal
+ * ko capture.
+ */
+static void
+reevaluate_ko_threats(int ko_move, int color, float ko_value)
+{
+  int ko_stone = NO_MOVE;
+  int opp_ko_move;
+  int pos;
+  int k;
+  int type, what;
+  int threat_does_work = 0;
+  int ko_move_target;
+  int num_good_threats = 0;
+  int good_threats[BOARDMAX];
+  int best_threat_quality = -1;
+  float threat_size;
+
+  ko_move_target = get_biggest_owl_target(ko_move);
+  
+  /* If the move is a simple ko recapture, find the ko stone. (If
+   * it's not a simple ko recapture, then the move must be a superko
+   * violation.)
+   */
+  if (is_illegal_ko_capture(ko_move, color)) {
+    for (k = 0; k <= 3; k++) {
+      ko_stone = ko_move + delta[k];
+      if (ON_BOARD(ko_stone) && countlib(ko_stone) == 1)
+       break;
+    }
+    ASSERT_ON_BOARD1(ko_stone);
+  }
+  
+  TRACE("Reevaluating ko threats.\n");
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int threat_quality = 0;
+
+    if (!ON_BOARD(pos) || pos == ko_move)
+      continue;
+    if (move[pos].additional_ko_value <= 0.0) 
+      continue;
+
+    /* Otherwise we look for the biggest threat, and then check whether
+     * it still works after ko has been resolved.
+     */
+
+    /* `additional_ko_value' includes reverse followup. While it is good to
+     * play ko threats which eliminate other threats in turn, we should
+     * always prefer threats that are larger than the value of the ko.
+     */
+    if (move[pos].followup_value < ko_value)
+      threat_quality = -1;
+
+    threat_size = 0.0;
+    type = -1;
+    what = -1;
+    for (k = 0; k < MAX_REASONS; k++) {
+      int r = move[pos].reason[k];
+      if (r < 0)
+       break;
+      if (!(move_reasons[r].type & THREAT_BIT))
+       continue;
+
+      switch (move_reasons[r].type) {
+      case ATTACK_THREAT:
+      case DEFEND_THREAT:
+       if (worm[move_reasons[r].what].effective_size
+           > threat_size) {
+         threat_size = worm[move_reasons[r].what].effective_size;
+         type = move_reasons[r].type;
+         what = move_reasons[r].what;
+       }
+       break;
+      case OWL_ATTACK_THREAT:
+      case OWL_DEFEND_THREAT:   
+      case SEMEAI_THREAT:
+       if (dragon[move_reasons[r].what].effective_size
+           > threat_size) {
+         threat_size = dragon[move_reasons[r].what]\
+           .effective_size;
+         type = move_reasons[r].type;
+         what = move_reasons[r].what;
+       }
+       break;
+      default:
+       /* This means probably someone has introduced a new threat type
+        * without adding the corresponding case above.
+        */
+       gg_assert(0);
+       break;
+      }
+    } 
+    /* If there is no threat recorded, the followup value is probably
+     * contributed by a pattern. We can do nothing but accept this value.
+     * (although this does cause problems).
+     *
+     * FIXME: In the case of superko violation we have no ko_stone.
+     * Presumably some of the tests below should be applicable anyway.
+     * Currently we just say that any threat is ok.
+     */
+    if (type == -1 || ko_stone == NO_MOVE)
+      threat_does_work = 1;
+    else {
+      if (trymove(pos, color, "reevaluate_ko_threats", ko_move)) {
+       ASSERT_ON_BOARD1(ko_stone);
+       if (!find_defense(ko_stone, &opp_ko_move))
+         threat_does_work = 1;
+       else {
+         int threat_wastes_point = 0;
+         if (whose_area(OPPOSITE_INFLUENCE(color), pos) != EMPTY)
+           threat_wastes_point = 1;
+
+         if (trymove(opp_ko_move, OTHER_COLOR(color),
+                     "reevaluate_ko_threats", ko_move)) {
+           switch (type) {
+           case ATTACK_THREAT:
+             /* In case the attack threat was a snapback move, there
+              * is no stone on the board to attack now and we check
+              * for a defense of the threatening move instead.
+              */
+             if (board[what] != EMPTY)
+               threat_does_work = attack(what, NULL);
+             else
+               threat_does_work = find_defense(pos, NULL);
+             break;
+           case DEFEND_THREAT:
+             threat_does_work = (board[what] != EMPTY
+                                 && find_defense(what, NULL));
+             break;
+           case OWL_ATTACK_THREAT:
+           case OWL_DEFEND_THREAT:
+             /* Should we call do_owl_attack/defense here?
+              * Maybe too expensive? For the moment we just assume
+              * that the attack does not work if it concerns the
+              * same dragon as ko_move. (Can this really happen?)
+              */
+             threat_does_work = (ko_move_target != what);
+           }
+           popgo();
+           
+           /* Is this a losing ko threat? */
+           if (threat_does_work && type == ATTACK_THREAT) {
+             int apos;
+             if (attack(pos, &apos)
+                 && does_defend(apos, what)
+                 && (forced_backfilling_moves[apos]
+                     || (!is_proper_eye_space(apos)
+                        && !false_eye_territory[apos]))) {
+               threat_does_work = 0;
+             }
+           }
+
+           /* If we are fighting a tiny ko (1 - 2 points only), we pay
+            * extra attention to select threats that don't waste points.
+            * In particular, we don't play threats inside of opponent
+            * territory if they can be averted on a dame intersection.
+            */
+           if (ko_value < 1.0
+               && threat_does_work
+               && threat_quality >= 0
+               && (type == ATTACK_THREAT || type == DEFEND_THREAT)) {
+             int averting_pos;
+
+             if (type == ATTACK_THREAT)
+               find_defense(what, &averting_pos);
+             else
+               attack(what, &averting_pos);
+
+             /* `averting_pos' can be NO_MOVE sometimes, at least when
+              * when the the threat is a threat to attack. It is not
+              * clear what to do in such cases.
+              */
+             if (averting_pos != NO_MOVE) {
+               int averting_wastes_point = 0;
+               if (whose_territory(OPPOSITE_INFLUENCE(color), averting_pos)
+                   != EMPTY)
+                 averting_wastes_point = 1;
+               threat_quality = averting_wastes_point - threat_wastes_point;
+               if (threat_quality < 0)
+                 threat_does_work = 0;
+             }
+           }
+         }
+       }
+       popgo();
+      }
+    }
+    
+    if (threat_does_work) {
+      if (threat_quality == best_threat_quality)
+       good_threats[num_good_threats++] = pos;
+      else if (threat_quality > best_threat_quality) {
+       best_threat_quality = threat_quality;
+       num_good_threats = 0;
+       good_threats[num_good_threats++] = pos;
+      }
+      else
+       DEBUG(DEBUG_MOVE_REASONS,
+             "%1m: no additional ko value (threat does not work as ko threat)\n", pos);
+    }
+  }
+
+  for (k = 0; k < num_good_threats; k++) {
+    pos = good_threats[k];
+
+    /* If the move previously had no value, we need to add in the
+     * randomness contribution now.
+     *
+     * FIXME: This is very ugly. Restructure the code so that the
+     * randomness need only be considered in one place.
+     */
+    if (move[pos].value == 0.0) {
+      move[pos].value += 
+       0.01 * move[pos].random_number * move[pos].randomness_scaling;
+    }
+
+    TRACE("%1m: %f + %f = %f\n", pos, move[pos].value,
+         move[pos].additional_ko_value,
+         move[pos].value + move[pos].additional_ko_value);
+    move[pos].value += move[pos].additional_ko_value;
+  }
+}
+
+
+/* Redistribute points. When one move is declared a replacement for
+ * another by a replacement move reason, the move values for the
+ * inferior move are transferred to the replacement.
+ */
+static void
+redistribute_points(void)
+{
+  int source;
+  int target;
+
+  for (target = BOARDMIN; target < BOARDMAX; target++)
+    if (ON_BOARD(target))
+      move[target].final_value = move[target].value;
+  
+  for (source = BOARDMIN; source < BOARDMAX; source++) {
+    if (!ON_BOARD(source))
+      continue;
+    target = replacement_map[source];
+    if (target == NO_MOVE)
+      continue;
+
+    TRACE("Redistributing points from %1m to %1m.\n", source, target);
+    if (move[target].final_value < move[source].final_value) {
+      TRACE("%1m is now valued %f.\n", target, move[source].final_value);
+      move[target].final_value = move[source].final_value;
+    }
+    TRACE("%1m is now valued 0.\n", source);
+    move[source].final_value = 0.0;
+  }
+}
+
+/* This selects the best move available according to their valuations.
+ * If the best move is an illegal ko capture, we add ko threat values.
+ * If the best move is a blunder, it gets devalued and continue to look
+ * for the best move.
+ */
+static int
+find_best_move(int *the_move, float *value, int color,
+              int allowed_moves[BOARDMAX])
+{
+  int good_move_found = 0;
+  signed char blunder_tested[BOARDMAX];
+  float best_value = 0.0;
+  int best_move = NO_MOVE;
+  int pos;
+
+  memset(blunder_tested, 0, sizeof(blunder_tested));
+
+  while (!good_move_found) {
+    best_value = 0.0;
+    best_move = NO_MOVE;
+
+    /* Search through all board positions for the highest valued move. */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      float this_value = move[pos].final_value;
+      if (allowed_moves && !allowed_moves[pos])
+       continue;
+      if (!ON_BOARD(pos) || move[pos].final_value == 0.0)
+       continue;
+       
+      if (this_value > best_value) {
+       if (is_legal(pos, color) || is_illegal_ko_capture(pos, color)) {
+         best_value = this_value;
+         best_move = pos;
+       }
+       else {
+         TRACE("Move at %1m would be suicide.\n", pos);
+         remove_top_move(pos);
+         move[pos].value = 0.0;
+         move[pos].final_value = 0.0;
+       }
+      }
+    }
+    
+    /* If the best move is an illegal ko capture, reevaluate ko
+     * threats and search again.
+     */
+    if (best_value > 0.0
+       && (is_illegal_ko_capture(best_move, color)
+           || !is_allowed_move(best_move, color))) {
+      TRACE("Move at %1m would be an illegal ko capture.\n", best_move);
+      reevaluate_ko_threats(best_move, color, best_value);
+      redistribute_points();
+      time_report(2, "  reevaluate_ko_threats", NO_MOVE, 1.0);
+      remove_top_move(best_move);
+      move[best_move].value = 0.0;
+      move[best_move].final_value = 0.0;
+      print_top_moves();
+      good_move_found = 0;
+    }
+    /* Call blunder_size() to check that we're not about to make a
+     * blunder. Otherwise devalue this move and scan through all move
+     * values once more.
+     */
+    else if (best_value > 0.0) {
+      if (!blunder_tested[best_move]) {
+       float blunder_size = value_moves_get_blunder_size(best_move, color);
+       if (blunder_size > 0.0) {
+         TRACE("Move at %1m is a blunder, subtracting %f.\n", best_move,
+               blunder_size);
+         remove_top_move(best_move);
+         move[best_move].value -= blunder_size;
+         move[best_move].final_value -= blunder_size;
+         TRACE("Move at %1m is now valued %f.\n", best_move,
+               move[best_move].final_value);
+         record_top_move(best_move, move[best_move].final_value);
+         good_move_found = 0;
+         blunder_tested[best_move] = 1;
+       }
+       else
+         good_move_found = 1; /* Best move was not a blunder. */
+      }
+      else /* The move apparently was a blunder, but still the best move. */
+       good_move_found = 1;
+    }
+    else
+      good_move_found = 1; /* It's best to pass. */
+  }
+  
+  if (best_value > 0.0 
+      && best_move != NO_MOVE) {
+    *the_move = best_move;
+    *value = best_value;
+    return 1;
+  }
+
+  return 0;
+}
+
+
+/*
+ * Review the move reasons to find which (if any) move we want to play.
+ *
+ * The parameter pure_threat_value is the value assigned to a move
+ * which only threatens to capture or kill something. The reason for
+ * playing these is that the move may be effective because we have
+ * misevaluated the dangers or because the opponent misplays.
+ *
+ * The array allowed_moves restricts which moves may be considered. If
+ * NULL any move is allowed.
+ */
+int
+review_move_reasons(int *the_move, float *value, int color,
+                   float pure_threat_value, float our_score,
+                   int allowed_moves[BOARDMAX],
+                   int use_thrashing_dragon_heuristics)
+{
+  int save_verbose;
+
+  current_color = color;
+  
+  start_timer(2);
+  find_more_attack_and_defense_moves(color);
+  time_report(2, "  find_more_attack_and_defense_moves", NO_MOVE, 1.0);
+
+  if (get_level() >= 6) {
+    find_more_owl_attack_and_defense_moves(color);
+    time_report(2, "  find_more_owl_attack_and_defense_moves", NO_MOVE, 1.0);
+  }
+
+  if (large_scale && get_level() >= 6) {
+    find_large_scale_owl_attack_moves(color);
+    time_report(2, "  find_large_scale_owl_attack_moves", NO_MOVE, 1.0);
+  }
+
+  find_more_semeai_moves(color);
+  time_report(2, "  find_more_semeai_moves", NO_MOVE, 1.0);
+
+  save_verbose = verbose;
+  if (verbose > 0)
+    verbose--;
+  examine_move_safety(color);
+  time_report(2, "  examine_move_safety", NO_MOVE, 1.0);
+  verbose = save_verbose;
+
+  /* We can't do this until move_safety is known. */
+  induce_secondary_move_reasons(color);
+  time_report(2, "  induce_secondary_move_reasons", NO_MOVE, 1.0);
+    
+  if (printworms || verbose)
+    list_move_reasons(stderr, NO_MOVE);
+
+  /* Evaluate all moves with move reasons. */
+  value_moves(color, pure_threat_value, our_score,
+             use_thrashing_dragon_heuristics);
+  time_report(2, "  value_moves", NO_MOVE, 1.0);
+
+  /* Perform point redistribution */
+  redistribute_points();
+
+  /* Search through all board positions for the 10 highest valued
+   * moves and print them.
+   */
+  print_top_moves();
+
+  /* Select the highest valued move and return it. */
+  return find_best_move(the_move, value, color, allowed_moves);
+}
+
+
+/*
+ * Choosing a strategy based on the current score estimate 
+ * and the game status (between 0.0 (start) and 1.0 (game over)).
+ */
+
+void 
+choose_strategy(int color, float our_score, float game_status)
+{
+
+  minimum_value_weight  = 1.0;
+  maximum_value_weight  = 1.0;
+  territorial_weight    = 1.0;
+  strategical_weight    = 1.0;
+  attack_dragon_weight  = 1.0;
+  invasion_malus_weight = 1.0;
+  followup_weight       = 1.0;
+
+  TRACE("  Game status = %f (0.0 = start, 1.0 = game over)\n", game_status);
+
+  
+  if (cosmic_gnugo) {
+
+    if (game_status > 0.65 && our_score > 15.0) {
+      
+      /* We seem to be winning, so we use conservative settings. */
+      minimum_value_weight  = 0.66;
+      maximum_value_weight  = 2.0;
+      territorial_weight    = 0.95; 
+      strategical_weight    = 1.0; 
+      attack_dragon_weight  = 1.1; 
+      invasion_malus_weight = 1.3;
+      followup_weight       = 1.1;
+      TRACE("  %s is leading, using conservative settings.\n",
+           color == WHITE ? "White" : "Black");
+    }
+    else if (game_status > 0.16) {
+      
+      /* We're not winning enough yet, try aggressive settings. */
+      minimum_value_weight  = 0.66;
+      maximum_value_weight  = 2.0;
+      territorial_weight    = 1.4;
+      strategical_weight    = 0.5; 
+      attack_dragon_weight  = 0.62;
+      invasion_malus_weight = 2.0;
+      followup_weight       = 0.62;
+       
+      /* If we're getting desesperate, try invasions as a last resort */
+      if (game_status > 0.75 && our_score < -25.0)
+        invasion_malus_weight = 0.2;
+            
+      TRACE("  %s is not winning enough, using aggressive settings.\n", 
+           color == WHITE ? "White" : "Black");
+    }
+  }
+}
+
+/* In order to get valid influence data after a move, we need to rerun
+ * estimate_territorial_value() for that move. A prerequisite for
+ * using this function is that move reasons have already been collected.
+ *
+ * This function should only be used for debugging purposes.
+ */
+void
+prepare_move_influence_debugging(int pos, int color)
+{
+  float our_score;
+  
+  if (color == WHITE)
+    our_score = black_score;
+  else
+    our_score = -white_score;
+
+  estimate_territorial_value(pos, color, our_score, 1);
+}
+
+
+/* Compute probabilities of each move being played.  It is assumed
+ * that the `move[]' array is filled with proper values (i.e. that
+ * one of the genmove*() functions has been called).
+ *
+ * The value of each move `V_k' should be a uniformly distributed
+ * random variable (`k' is a unique move index).  Let it have values
+ * from the interval [l_k; u_k] .  Then move value has constant
+ * probability density on the interval:
+ *
+ *             1
+ *   d_k = -----------.
+ *         u_k - l_k
+ *
+ * We need to determine the probability of `V_k' being the largest of
+ * {V_1, V_2, ..., V_n}.  Probability density is like follows:
+ *
+ *   D_k(t) = d_k * Product(P{V_i < t} for i != k), l_k <= t <= u_k,
+ *
+ * where P{A} is the probability of event `A'.  By integrating D_k(t)
+ * from `l_k' to `u_k' we can find the probability in question:
+ *
+ *   P{V_k > V_i for i != k} = Integrate(D_k(t) dt from l_k to u_k).
+ *
+ * Function D_k(t) is a polynomial on each of subintervals produced by
+ * points `l_k', `u_k', k = 1, ..., n.  When t < min(l_k), D_k(t) is
+ * zero.  On other subintervals it can be evaluated by taking into
+ * account that
+ *
+ *  P{V_i < t} = d_i * (t - l_i)  if t < u_i;
+ *  P{V_i < t} = 1               if t >= u_i.
+ */
+void
+compute_move_probabilities(float probabilities[BOARDMAX])
+{
+  int k;
+  int pos;
+  int num_moves = 0;
+  int moves[BOARDMAX];
+  double lower_values[BOARDMAX];
+  double upper_values[BOARDMAX];
+  double densities[BOARDMAX];
+  double common_lower_limit = 0.0;
+
+  /* Find all moves with positive values. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    probabilities[pos] = 0.0;
+
+    if (ON_BOARD(pos)) {
+      /* FIXME: what about point redistribution? */
+      if (move[pos].final_value > 0.0) {
+       double scale = 0.01 * (double) move[pos].randomness_scaling;
+
+       moves[num_moves] = pos;
+       lower_values[num_moves] = ((double) move[pos].final_value
+                                  - (scale * move[pos].random_number));
+       upper_values[num_moves] = lower_values[num_moves] + scale;
+       densities[num_moves] = 1.0 / scale;
+
+       if (lower_values[num_moves] > common_lower_limit)
+         common_lower_limit = lower_values[num_moves];
+
+       num_moves++;
+      }
+    }
+  }
+
+  /* Compute probability of each move. */
+  for (k = 0; k < num_moves; k++) {
+    int i;
+    double lower_limit = common_lower_limit;
+
+    /* Iterate over subintervals for integration. */
+    while (lower_limit < upper_values[k]) {
+      int j;
+      double upper_limit = upper_values[k];
+      double span_power;
+      double polynomial[BOARDMAX];
+      int degree;
+
+      degree = 0;
+      polynomial[0] = 1.0;
+
+      for (i = 0; i < num_moves; i++) {
+       /* See if we need to decrease current subinterval. */
+       if (upper_values[i] > lower_limit && upper_values[i] < upper_limit)
+         upper_limit = upper_values[i];
+      }
+
+      /* Build the probability density polynomial for the current
+       * subinterval.
+       */
+      for (i = 0; i < num_moves; i++) {
+       if (i != k && upper_values[i] >= upper_limit) {
+         polynomial[++degree] = 0.0;
+         for (j = degree; j > 0; j--) {
+           polynomial[j] = (densities[i]
+                            * (polynomial[j - 1]
+                               + ((lower_limit - lower_values[i])
+                                  * polynomial[j])));
+         }
+
+         polynomial[0] *= densities[i] * (lower_limit - lower_values[i]);
+       }
+      }
+
+      /* And compute the integral of the polynomial on the current
+       * subinterval.
+       */
+      span_power = 1.0;
+      for (j = 0; j <= degree; j++) {
+       span_power *= upper_limit - lower_limit;
+       probabilities[moves[k]] += (polynomial[j] * span_power) / (j + 1);
+      }
+
+      /* Go on to the next subinterval. */
+      lower_limit = upper_limit;
+    }
+
+    probabilities[moves[k]] *= densities[k];
+  }
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/engine/worm.c b/engine/worm.c
new file mode 100644 (file)
index 0000000..2d299e1
--- /dev/null
@@ -0,0 +1,1876 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+#include "patterns.h"
+
+static void compute_effective_worm_sizes(void);
+static void do_compute_effective_worm_sizes(int color,
+                                           int (*cw)[MAX_CLOSE_WORMS],
+                                           int *ncw, int max_distance);
+static void compute_unconditional_status(void);
+static void find_worm_attacks_and_defenses(void);
+static void find_worm_threats(void);
+static int find_lunch(int str, int *lunch);
+static void change_tactical_point(int str, int move, int code,
+                                 int points[MAX_TACTICAL_POINTS],
+                                 int codes[MAX_TACTICAL_POINTS]);
+static void propagate_worm2(int str);
+static int genus(int str);
+static void markcomponent(int str, int pos, int mg[BOARDMAX]);
+static int examine_cavity(int pos, int *edge);
+static void cavity_recurse(int pos, int mx[BOARDMAX], 
+                          int *border_color, int *edge, int str);
+static void ping_cave(int str, int *result1,  int *result2,
+                     int *result3, int *result4);
+static void ping_recurse(int pos, int *counter, 
+                        int mx[BOARDMAX], 
+                        int mr[BOARDMAX], int color);
+static int touching(int pos, int color);
+static void find_attack_patterns(void);
+static void attack_callback(int anchor, int color,
+                           struct pattern *pattern, int ll, void *data);
+static void find_defense_patterns(void);
+static void defense_callback(int anchor, int color,
+                            struct pattern *pattern, int ll, void *data);
+static void build_worms(void);
+static void report_worm(int pos);
+
+/* A worm or string is a maximal connected set of stones of the same color, 
+ * black or white.
+ *
+ * Cavities are sets of connected empty vertices.
+ */
+
+
+/* make_worms() finds all worms and assembles some data about them.
+ *
+ * Each worm is marked with an origin.  This is an arbitrarily chosen
+ * element of the worm, in practice the algorithm puts the origin at
+ * the first element when they are given the lexicographical order,
+ * though its location is irrelevant for applications. To see if two
+ * stones lie in the same worm, compare their origins.
+ *
+ * We will use the field dragon[ii].genus to keep track of
+ * black- or white-bordered cavities (essentially eyes) which are found.  
+ * so this field must be zero'd now.
+ */
+
+void
+make_worms(void)
+{
+  int pos;
+
+  /* Build the basic worm data:  color, origin, size, liberties. */
+  build_worms();
+
+  /* No point continuing if the board is completely empty. */
+  if (stones_on_board(BLACK | WHITE) == 0)
+    return;
+
+  /* Compute effective sizes of all worms. */
+  compute_effective_worm_sizes();
+
+  /* Look for unconditionally alive and dead worms, and unconditional
+   * territory.
+   */
+  compute_unconditional_status();
+  
+  find_worm_attacks_and_defenses();
+  
+  gg_assert(stackp == 0);
+
+  /* Count liberties of different orders and initialize cutstone fields. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos]) && is_worm_origin(pos, pos)) {
+      int lib1, lib2, lib3, lib4;
+      
+      ping_cave(pos, &lib1, &lib2, &lib3, &lib4);
+      ASSERT1(worm[pos].liberties == lib1, pos);
+      worm[pos].liberties2 = lib2;
+      worm[pos].liberties3 = lib3;
+      worm[pos].liberties4 = lib4;
+      worm[pos].cutstone = 0;
+      worm[pos].cutstone2 = 0;
+      propagate_worm(pos);
+    }
+  }
+  
+  gg_assert(stackp == 0);
+
+  /*
+   * There are two concepts of cutting stones in the worm array.
+   *
+   * worm.cutstone:
+   *
+   *     A CUTTING STONE is one adjacent to two enemy strings,
+   *     which do not have a liberty in common. The most common
+   *     type of cutting string is in this situation.
+   *  
+   *     XO
+   *     OX
+   *     
+   *     A POTENTIAL CUTTING STONE is adjacent to two enemy
+   *     strings which do share a liberty. For example, X in:
+   *     
+   *     XO
+   *     O.
+   *     
+   *     For cutting strings we set worm[m][n].cutstone=2. For potential
+   *     cutting strings we set worm[m][n].cutstone=1. For other strings,
+   *     worm[m][n].cutstone=0.
+   *
+   * worm.cutstone2:
+   *
+   *     Cutting points are identified by the patterns in the
+   *     connections database. Proper cuts are handled by the fact
+   *     that attacking and defending moves also count as moves
+   *     cutting or connecting the surrounding dragons. 
+   *
+   * The cutstone field will now be set. The cutstone2 field is set
+   * later, during find_cuts(), called from make_dragons().
+   *
+   * We maintain both fields because the historically older cutstone
+   * field is needed to deal with the fact that e.g. in the position
+   *
+   *
+   *    OXX.O
+   *    .OOXO
+   *    OXX.O
+   *
+   * the X stones are amalgamated into one dragon because neither cut
+   * works as long as the two O stones are in atari. Therefore we add
+   * one to the cutstone field for each potential cutting point,
+   * indicating that these O stones are indeed worth rescuing.
+   *
+   * For the time being we use both concepts in parallel. It's
+   * possible we also need the old concept for correct handling of lunches.
+   */
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int w1 = NO_MOVE;
+    int w2 = NO_MOVE;
+    int k;
+    int pos2;
+    
+    /* Only work on each worm once. This is easiest done if we only 
+     * work with the origin of each worm.
+     */
+    if (!IS_STONE(board[pos]) || !is_worm_origin(pos, pos))
+      continue;
+    
+    /* Try to find two adjacent worms (w1) and (w2) 
+     * of opposite colour from (pos).
+     */
+    for (pos2 = BOARDMIN; pos2 < BOARDMAX; pos2++) {
+      /* Work only with the opposite color from (pos). */
+      if (board[pos2] != OTHER_COLOR(board[pos])) 
+       continue;
+      
+      for (k = 0; k < 4; k++) {
+       if (!ON_BOARD(pos2 + delta[k])
+           || worm[pos2 + delta[k]].origin != pos)
+         continue;
+       
+       ASSERT1(board[pos2 + delta[k]] == board[pos], pos);
+       
+       /* If we have not already found a worm which meets the criteria,
+        * store it into (w1), otherwise store it into (w2).
+        */
+       if (w1 == NO_MOVE)
+         w1 = worm[pos2].origin;
+       else if (!is_same_worm(pos2, w1))
+         w2 = worm[pos2].origin;
+      }
+    }
+    
+    /* 
+     *  We now verify the definition of cutting stones. We have
+     *  verified that the string at (pos) is adjacent to two enemy
+     *  strings at (w1) and (w2). We need to know if these
+     *  strings share a liberty.
+     */
+    
+    /* Only do this if we really found something. */
+    if (w2 != NO_MOVE) {
+      worm[pos].cutstone = 2;
+      if (count_common_libs(w1, w2) > 0)
+       worm[pos].cutstone = 1;
+      
+      DEBUG(DEBUG_WORMS, "Worm at %1m has w1 %1m and w2 %1m, cutstone %d\n",
+           pos, w1, w2, worm[pos].cutstone);
+    }
+  }
+  
+  gg_assert(stackp == 0);
+  
+  /* Set the genus of all worms. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos]) && is_worm_origin(pos, pos)) {
+      worm[pos].genus = genus(pos);
+      propagate_worm(pos);
+    }
+  }
+  gg_assert(stackp == 0);
+
+  /* Now we try to improve the values of worm.attack and worm.defend.
+   * If we find that capturing the string at str also defends the
+   * string at str2, or attacks it, then we add points of attack and
+   * defense. We don't add attacking point for strings that can't be
+   * defended.
+   */
+  {
+    int color;
+    int str;
+    int moves_to_try[BOARDMAX];
+    memset(moves_to_try, 0, sizeof(moves_to_try));
+
+    /* Find which colors to try at what points. */
+    for (str = BOARDMIN; str < BOARDMAX; str++) {
+      if (IS_STONE(board[str]) && is_worm_origin(str, str)) {
+       color = board[str];
+       moves_to_try[worm[str].defense_points[0]] |= color;
+       moves_to_try[worm[str].attack_points[0]] |= OTHER_COLOR(color);
+      }
+    }
+
+    /* Loop over the board and over the colors and try the moves found
+     * in the previous loop.
+     */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+
+      for (color = WHITE; color <= BLACK; color++) {
+       if (!(moves_to_try[pos] & color))
+         continue;
+       
+       /* Try to play color at pos and see what it leads to. */
+       if (!trymove(pos, color, "make_worms", NO_MOVE))
+         continue;
+         
+       /* We must read to the same depth that was used in the
+        * initial determination of worm.attack and worm.defend
+        * to avoid horizon effects. Since stackp has been
+        * incremented we must also increment depth values.
+        */
+       
+       DEBUG(DEBUG_WORMS, "trying %1m\n", pos);
+       increase_depth_values();
+       
+       /* Now we try to find a group which is saved or attacked as well
+        * by this move.
+        */
+       for (str = BOARDMIN; str < BOARDMAX; str++) {
+         if (!IS_STONE(board[str])
+             || !is_worm_origin(str, str))
+           continue;
+         
+         /* If the worm is of the opposite color to the move,
+          * then we try to defend it. If there was a previous 
+          * attack and defense of it, and there is no defense
+          * for the attack now...
+          */
+         if (worm[str].color == OTHER_COLOR(color)
+             && worm[str].attack_codes[0] != 0
+             && worm[str].defense_codes[0] != 0) {
+           int dcode = find_defense(str, NULL);
+           if (dcode < worm[str].defense_codes[0]) {
+             int attack_works = 1;
+
+             /* Sometimes find_defense() fails to find a
+              * defense which has been found by other means.
+              * Try if the old defense move still works.
+              *
+              * However, we first check if the _attack_ still exists,
+              * because we could, for instance, drive the worm into
+              * seki with our move.
+              */
+             if (attack(str, NULL) >= worm[str].attack_codes[0]) {
+               if (worm[str].defense_codes[0] != 0
+                   && trymove(worm[str].defense_points[0],
+                              OTHER_COLOR(color), "make_worms", 0)) {
+                 int this_dcode = REVERSE_RESULT(attack(str, NULL));
+                 if (this_dcode > dcode) {
+                   dcode = this_dcode;
+                   if (dcode >= worm[str].defense_codes[0])
+                     attack_works = 0;
+                 }
+                 popgo();
+               }
+             }
+             else
+               attack_works = 0;
+             
+             /* ...then add an attack point of that worm at pos. */
+             if (attack_works) {
+               DEBUG(DEBUG_WORMS,
+                     "adding point of attack of %1m at %1m with code %d\n",
+                     str, pos, REVERSE_RESULT(dcode));
+               change_attack(str, pos, REVERSE_RESULT(dcode));
+             }
+           }
+         }
+         
+         /* If the worm is of the same color as the move we try to
+          * attack it. If there previously was an attack on it, but
+          * there is none now, then add a defense point of str at
+          * pos.
+          */
+         else if (worm[str].color == color
+                  && worm[str].attack_codes[0] != 0) {
+           int acode = attack(str, NULL);
+           if (acode < worm[str].attack_codes[0]) {
+             int defense_works = 1;
+             /* Sometimes attack() fails to find an
+              * attack which has been found by other means.
+              * Try if the old attack move still works.
+              */
+             if (worm[str].attack_codes[0] != 0
+                 && trymove(worm[str].attack_points[0],
+                            OTHER_COLOR(color), "make_worms", 0)) {
+               int this_acode;
+               if (board[str] == EMPTY)
+                 this_acode = WIN;
+               else
+                 this_acode = REVERSE_RESULT(find_defense(str, NULL));
+               if (this_acode > acode) {
+                 acode = this_acode;
+                 if (acode >= worm[str].attack_codes[0])
+                   defense_works = 0;
+               }
+               popgo();
+             }
+             
+             /* ...then add an attack point of that worm at pos. */
+             if (defense_works) {
+               DEBUG(DEBUG_WORMS,
+                     "adding point of defense of %1m at %1m with code %d\n",
+                     str, pos, REVERSE_RESULT(acode));
+               change_defense(str, pos, REVERSE_RESULT(acode));
+             }
+           }
+         }
+       }
+       decrease_depth_values();
+       popgo();
+      }
+    }
+  }
+  
+  gg_assert(stackp == 0);
+  
+  /* Sometimes it happens that the tactical reading finds adjacent
+   * strings which both can be attacked but not defended. (The reason
+   * seems to be that the attacker tries harder to attack a string,
+   * than the defender tries to capture it's neighbors.) When this
+   * happens, the eyes code produces overlapping eye spaces and, still
+   * worse, all the nondefendable stones actually get amalgamated with
+   * their allies on the outside.
+   *
+   * To solve this we scan through the strings which can't be defended
+   * and check whether they have a neighbor that can be attacked. In
+   * this case we set the defense point of the former string to the
+   * attacking point of the latter.
+   *
+   * Please notice that find_defense() will still read this out
+   * incorrectly, which may lead to some confusion later.
+   */
+
+  /* First look for vertical neighbors. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos])
+       && IS_STONE(board[SOUTH(pos)])
+       && !is_same_worm(pos, SOUTH(pos))) {
+      if (worm[pos].attack_codes[0] != 0
+         && worm[SOUTH(pos)].attack_codes[0] != 0) {
+       if (worm[pos].defense_codes[0] == 0
+           && does_defend(worm[SOUTH(pos)].attack_points[0], pos)) {
+         /* FIXME: need to check ko relationship here */
+         change_defense(pos, worm[SOUTH(pos)].attack_points[0], WIN);
+       }
+       if (worm[SOUTH(pos)].defense_codes[0] == 0
+           && does_defend(worm[pos].attack_points[0], SOUTH(pos))) {
+         /* FIXME: need to check ko relationship here */           
+         change_defense(SOUTH(pos), worm[pos].attack_points[0], WIN);
+       }
+      }
+    }
+  }
+  
+  /* Then look for horizontal neighbors. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos])
+       && IS_STONE(board[EAST(pos)])
+       && !is_same_worm(pos, EAST(pos))) {
+      if (worm[pos].attack_codes[0] != 0
+         && worm[EAST(pos)].attack_codes[0] != 0) {
+       if (worm[pos].defense_codes[0] == 0
+           && does_defend(worm[EAST(pos)].attack_points[0], pos)) {
+         /* FIXME: need to check ko relationship here */           
+         change_defense(pos, worm[EAST(pos)].attack_points[0], WIN);
+       }
+       if (worm[EAST(pos)].defense_codes[0] == 0
+           && does_defend(worm[pos].attack_points[0], EAST(pos))) {
+         /* FIXME: need to check ko relationship here */           
+         change_defense(EAST(pos), worm[pos].attack_points[0], WIN);
+       }
+      }
+    }
+  }
+  
+  gg_assert(stackp == 0);
+  
+  /* Find adjacent worms that can be easily captured, aka lunches. */
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    int lunch;
+    
+    if (!IS_STONE(board[pos]) || !is_worm_origin(pos, pos))
+      continue;
+    
+    if (find_lunch(pos, &lunch)
+       && (worm[lunch].attack_codes[0] == WIN
+           || worm[lunch].attack_codes[0] == KO_A)) {
+      DEBUG(DEBUG_WORMS, "lunch found for %1m at %1m\n", pos, lunch);
+      worm[pos].lunch = lunch;
+    }
+    else
+      worm[pos].lunch = NO_MOVE;
+    
+    propagate_worm(pos);
+  }
+  
+  if (!disable_threat_computation)
+    find_worm_threats();
+
+  /* Identify INESSENTIAL strings.
+   *
+   * These are defined as surrounded strings which have no life
+   * potential unless part of their surrounding chain can be captured.
+   * We give a conservative definition of inessential:
+   *  - the genus must be zero 
+   *  - there can no second order liberties
+   *  - there can be no more than two edge liberties
+   *  - if it is removed from the board, the remaining cavity has
+   *    border color the opposite color of the string 
+   *  - it contains at most two edge vertices.
+   *
+   * If we get serious about identifying seki, we might want to add:
+   *
+   *  - if it has fewer than 4 liberties it is tactically dead.
+   *
+   * The last condition is helpful in excluding strings which are
+   * alive in seki.
+   *
+   * An inessential string can be thought of as residing inside the
+   * opponent's eye space.
+   */
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (IS_STONE(board[pos])
+       && worm[pos].origin == pos
+       && worm[pos].genus == 0
+       && worm[pos].liberties2 == 0
+       && !worm[pos].cutstone
+       && worm[pos].lunch == NO_MOVE) {
+      int edge;
+      int border_color = examine_cavity(pos, &edge);
+      if (border_color != GRAY && edge < 3) {
+       DEBUG(DEBUG_WORMS, "Worm %1m identified as inessential.\n", pos);
+       worm[pos].inessential = 1;
+       propagate_worm(pos);
+      }
+    }
+  }
+}
+
+
+/* 
+ * Clear all worms and initialize the basic data fields:
+ *   color, origin, size, liberties
+ * This is a substep of make_worms().
+ */
+
+static void
+build_worms()
+{
+  int pos;
+
+  /* Set all worm data fields to 0. */
+  memset(worm, 0 , sizeof(worm));
+
+  /* Initialize the worm data for each worm. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos))
+      worm[pos].origin = NO_MOVE;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos) || worm[pos].origin != NO_MOVE)
+      continue;
+    worm[pos].color = board[pos];
+    worm[pos].origin = pos;
+    worm[pos].inessential = 0;
+    worm[pos].invincible = 0;
+    worm[pos].unconditional_status = UNKNOWN;
+    worm[pos].effective_size = 0.0;
+    if (IS_STONE(board[pos])) {
+      worm[pos].liberties = countlib(pos);
+      worm[pos].size = countstones(pos);
+      propagate_worm(pos);
+    }
+  }
+}
+
+
+/* Compute effective size of each worm. 
+ *
+ * Effective size is the number of stones in a worm plus half the
+ * number of empty intersections that are at least as close to this
+ * worm as to any other worm. This is used to estimate the direct
+ * territorial value of capturing a worm. Intersections that are
+ * shared are counted with equal fractional values for each worm.
+ *
+ * We never count intersections further away than distance 3.
+ *
+ * This function is also used to compute arrays with information about
+ * the distances to worms of both or either color. In the latter case
+ * we count intersections up to a distance of 5.
+ */
+
+static void
+compute_effective_worm_sizes()
+{
+  do_compute_effective_worm_sizes(BLACK | WHITE, close_worms,
+                                 number_close_worms, 3);
+  do_compute_effective_worm_sizes(BLACK, close_black_worms,
+                                 number_close_black_worms, 5);
+  do_compute_effective_worm_sizes(WHITE, close_white_worms,
+                                 number_close_white_worms, 5);
+}
+
+static void
+do_compute_effective_worm_sizes(int color, int (*cw)[MAX_CLOSE_WORMS],
+                               int *ncw, int max_distance)
+{
+  int pos;
+
+  /* Distance to closest worm, -1 means unassigned, 0 that there is
+   * a stone at the location, 1 a liberty of a stone, and so on.
+   */
+  int distance[BOARDMAX];
+  /* Pointer to the origin of the closest worms. A very large number of
+   * worms may potentially be equally close, but no more than
+   * 2*(board_size-1).
+   */
+  static int worms[BOARDMAX][2*(MAX_BOARD-1)];
+  int nworms[BOARDMAX];   /* number of equally close worms */
+  int found_one;
+  int dist; /* current distance */
+  int k, l;
+  int r;
+    
+  /* Initialize arrays. */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+
+    for (k = 0; k < 2*(board_size-1); k++)
+      worms[pos][k] = NO_MOVE;
+    
+    nworms[pos] = 0;
+    
+    if (board[pos] & color) {
+      distance[pos] = 0;
+      worms[pos][0] = worm[pos].origin;
+      nworms[pos]++;
+    }
+    else
+      distance[pos] = -1;
+  }
+  
+  dist = 0;
+  found_one = 1;
+  while (found_one && dist <= max_distance) {
+    found_one = 0;
+    dist++;
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || distance[pos] != -1)
+       continue; /* already claimed */
+
+      for (r = 0; r < 4; r++) {
+       int pos2 = pos + delta[r];
+       
+       if (ON_BOARD(pos2) && distance[pos2] == dist - 1) {
+         found_one = 1;
+         distance[pos] = dist;
+         for (k = 0; k < nworms[pos2]; k++) {
+           int already_counted = 0;
+           for (l = 0; l < nworms[pos]; l++)
+             if (worms[pos][l] == worms[pos2][k]) {
+               already_counted = 1;
+               break;
+             }
+           if (!already_counted) {
+             ASSERT1(nworms[pos] < 2*(board_size-1), pos);
+             worms[pos][nworms[pos]] = worms[pos2][k];
+             nworms[pos]++;
+           }
+         }
+       }
+      }
+    }
+  }
+
+  /* Compute the effective sizes but only when all worms are considered. */
+  if (color == (BLACK | WHITE)) {
+    /* Distribute (fractional) contributions to the worms. */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos))
+       continue;
+      
+      for (k = 0; k < nworms[pos]; k++) {
+       int w = worms[pos][k];
+       if (board[pos] == EMPTY)
+         worm[w].effective_size += 0.5/nworms[pos];
+       else
+         worm[w].effective_size += 1.0;
+      }
+    }
+    
+    /* Propagate the effective size values all over the worms. */
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+      if (IS_STONE(board[pos]) && is_worm_origin(pos, pos))
+       propagate_worm(pos);
+  }
+
+  /* Fill in the appropriate close_*_worms (cw) and
+   * number_close_*_worms (ncw) arrays.
+   */
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos))
+      continue;
+
+    if (nworms[pos] > MAX_CLOSE_WORMS)
+      ncw[pos] = 0;
+    else
+      ncw[pos] = nworms[pos];
+
+    for (k = 0; k < ncw[pos]; k++)
+      cw[pos][k] = worms[pos][k];
+  }
+}
+
+/* Identify worms which are unconditionally uncapturable in the
+ * strongest sense, i.e. even if the opponent is allowed an arbitrary
+ * number of consecutive moves. Also identify worms which are
+ * similarly unconditionally dead and empty points which are
+ * unconditional territory for either player.
+ */
+static void
+compute_unconditional_status()
+{
+  int unconditional_territory[BOARDMAX];
+  int pos;
+  int color;
+  
+  for (color = WHITE; color <= BLACK; color++) {
+    unconditional_life(unconditional_territory, color);
+    if (get_level() >= 10)
+      find_unconditionally_meaningless_moves(unconditional_territory, color);
+
+    for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+      if (!ON_BOARD(pos) || !unconditional_territory[pos])
+       continue;
+       
+      if (board[pos] == color) {
+       worm[pos].unconditional_status = ALIVE;
+       if (unconditional_territory[pos] == 1)
+         worm[pos].invincible = 1;
+      }
+      else if (board[pos] == EMPTY) {
+       if (color == WHITE)
+         worm[pos].unconditional_status = WHITE_TERRITORY;
+       else
+         worm[pos].unconditional_status = BLACK_TERRITORY;
+      }
+      else
+       worm[pos].unconditional_status = DEAD;
+    }
+  }
+  gg_assert(stackp == 0);
+}
+
+/*
+ * Analyze tactical safety of each worm. 
+ */
+
+static void
+find_worm_attacks_and_defenses()
+{
+  int str;
+  int k;
+  int acode, dcode;
+  int attack_point;
+  int defense_point;
+  static int libs[MAXLIBS];
+  int liberties;
+  int color;
+  int other;
+
+   /* 1. Start with finding attack points. */
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (!IS_STONE(board[str]) || !is_worm_origin(str, str))
+      continue;
+
+    TRACE("considering attack of %1m\n", str);
+    /* Initialize all relevant fields at once. */
+    for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+      worm[str].attack_codes[k]   = 0;
+      worm[str].attack_points[k]  = 0;
+      worm[str].defense_codes[k]  = 0;
+      worm[str].defense_points[k] = 0;
+    }
+    propagate_worm(str);
+    
+    acode = attack(str, &attack_point);
+    if (acode != 0) {
+      DEBUG(DEBUG_WORMS, "worm at %1m can be attacked at %1m\n",
+           str, attack_point);
+      change_attack(str, attack_point, acode);
+    }
+  }
+  gg_assert(stackp == 0);
+  
+  /* 2. Use pattern matching to find a few more attacks. */
+  find_attack_patterns();
+  gg_assert(stackp == 0);
+  
+  /* 3. Now find defense moves. */
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    if (!IS_STONE(board[str]) || !is_worm_origin(str, str))
+      continue;
+
+    if (worm[str].attack_codes[0] != 0) {
+
+      TRACE("considering defense of %1m\n", str);
+      dcode = find_defense(str, &defense_point);
+      if (dcode != 0) {
+       TRACE("worm at %1m can be defended at %1m\n", str, defense_point);
+       if (defense_point != NO_MOVE)
+         change_defense(str, defense_point, dcode);
+      }
+      else {
+       /* If the point of attack is not adjacent to the worm, 
+        * it is possible that this is an overlooked point of
+        * defense, so we try and see if it defends.
+        */
+       attack_point = worm[str].attack_points[0];
+       if (!liberty_of_string(attack_point, str))
+         if (trymove(attack_point, worm[str].color, "make_worms", NO_MOVE)) {
+           int acode = attack(str, NULL);
+           if (acode != WIN) {
+             change_defense(str, attack_point, REVERSE_RESULT(acode));
+             TRACE("worm at %1m can be defended at %1m with code %d\n",
+                   str, attack_point, REVERSE_RESULT(acode));
+           }    
+           popgo();
+         }
+      }
+    }
+  }
+  gg_assert(stackp == 0);
+
+  /* 4. Use pattern matching to find a few more defense moves. */
+  find_defense_patterns();
+  gg_assert(stackp == 0);
+  
+  /*
+   * 5. Find additional attacks and defenses by testing all immediate
+   *    liberties. Further attacks and defenses are found by pattern
+   *    matching and by trying whether each attack or defense point
+   *    attacks or defends other strings.
+   */
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    color = board[str];
+    if (!IS_STONE(color) || !is_worm_origin(str, str))
+      continue;
+    
+    other = OTHER_COLOR(color);
+    
+    if (worm[str].attack_codes[0] == 0)
+      continue;
+    
+    /* There is at least one attack on this group. Try the
+     * liberties.
+     */
+    liberties = findlib(str, MAXLIBS, libs);
+    
+    for (k = 0; k < liberties; k++) {
+      int pos = libs[k];
+      if (!attack_move_known(pos, str)) {
+       /* Try to attack on the liberty. Don't consider
+        * send-two-return-one moves.
+        */
+       if (!send_two_return_one(pos, other)
+           && trymove(pos, other, "make_worms", str)) {
+         if (board[str] == EMPTY || attack(str, NULL)) {
+           if (board[str] == EMPTY)
+             dcode = 0;
+           else
+             dcode = find_defense(str, NULL);
+           
+           if (dcode != WIN)
+             change_attack(str, pos, REVERSE_RESULT(dcode));
+         }
+         popgo();
+       }
+      }
+      /* Try to defend at the liberty. */
+      if (!defense_move_known(pos, str)) {
+       if (worm[str].defense_codes[0] != 0)
+         if (trymove(pos, color, "make_worms", NO_MOVE)) {
+           acode = attack(str, NULL);
+           if (acode != WIN)
+             change_defense(str, pos, REVERSE_RESULT(acode));
+           popgo();
+         }
+      }
+    }
+  }
+  gg_assert(stackp == 0);
+}
+
+
+/*
+ * Find moves threatening to attack or save all worms.
+ */
+
+static void
+find_worm_threats()
+{
+  int str;
+  static int libs[MAXLIBS];
+  int liberties;
+  
+  int k;
+  int l;
+  int color;
+  
+  for (str = BOARDMIN; str < BOARDMAX; str++) {
+    color = board[str];
+    if (!IS_STONE(color) || !is_worm_origin(str, str))
+      continue;
+
+    /* 1. Start with finding attack threats. */
+    /* Only try those worms that have no attack. */
+    if (worm[str].attack_codes[0] == 0) {
+      attack_threats(str, MAX_TACTICAL_POINTS,
+                    worm[str].attack_threat_points,
+                    worm[str].attack_threat_codes);
+#if 0
+      /* Threaten to attack by saving weak neighbors. */
+      num_adj = chainlinks(str, adjs);
+      for (k = 0; k < num_adj; k++) {
+       if (worm[adjs[k]].attack_codes[0] != 0
+           && worm[adjs[k]].defense_codes[0] != 0)
+         for (r = 0; r < MAX_TACTICAL_POINTS; r++) {
+           int bb;
+           
+           if (worm[adjs[k]].defense_codes[r] == 0)
+             break;
+           bb = worm[adjs[k]].defense_points[r];
+           if (trymove(bb, other, "threaten attack", str,
+                       EMPTY, NO_MOVE)) {
+             int acode;
+             if (board[str] == EMPTY)
+               acode = WIN;
+             else
+               acode = attack(str, NULL);
+             if (acode != 0)
+               change_attack_threat(str, bb, acode);
+             popgo();
+           }
+         }
+      }
+#endif
+      /* FIXME: Try other moves also (patterns?). */
+    }
+    
+    /* 2. Continue with finding defense threats. */
+    /* Only try those worms that have an attack. */
+    if (worm[str].attack_codes[0] != 0
+       && worm[str].defense_codes[0] == 0) {
+      
+      liberties = findlib(str, MAXLIBS, libs);
+      
+      for (k = 0; k < liberties; k++) {
+       int aa = libs[k];
+       
+       /* Try to threaten on the liberty. */
+       if (trymove(aa, color, "threaten defense", NO_MOVE)) {
+         if (attack(str, NULL) == WIN) {
+           int dcode = find_defense(str, NULL);
+           if (dcode != 0)
+             change_defense_threat(str, aa, dcode);
+         }
+         popgo();
+       }
+       
+       /* Try to threaten on second order liberties. */
+       for (l = 0; l < 4; l++) {
+         int bb = libs[k] + delta[l];
+         
+         if (!ON_BOARD(bb)
+             || IS_STONE(board[bb])
+             || liberty_of_string(bb, str))
+           continue;
+         
+         if (trymove(bb, color, "threaten defense", str)) {
+           if (attack(str, NULL) == WIN) {
+             int dcode = find_defense(str, NULL);
+             if (dcode != 0)
+               change_defense_threat(str, bb, dcode);
+           }
+           popgo();
+         }
+       }
+      }
+      
+      /* It might be interesting to look for defense threats by
+       * attacking weak neighbors, similar to threatening attack by
+       * defending a weak neighbor. However, in this case it seems
+       * probable that if there is such an attack, it's a real
+       * defense, not only a threat. 
+       */
+      
+      /* FIXME: Try other moves also (patterns?). */
+    }
+  }
+}
+
+
+/* find_lunch(str, &worm) looks for a worm adjoining the
+ * string at (str) which can be easily captured. Whether or not it can
+ * be defended doesn't matter.
+ *
+ * Returns the location of the string in (*lunch).
+ */
+       
+static int
+find_lunch(int str, int *lunch)
+{
+  int pos;
+  int k;
+
+  ASSERT1(IS_STONE(board[str]), str);
+  ASSERT1(stackp == 0, str);
+
+  *lunch = NO_MOVE;
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] != OTHER_COLOR(board[str]))
+      continue;
+    for (k = 0; k < 8; k++) {
+      int apos = pos + delta[k];
+      if (ON_BOARD(apos) && is_same_worm(apos, str)) {
+       if (worm[pos].attack_codes[0] != 0 && !is_ko_point(pos)) {
+         /*
+          * If several adjacent lunches are found, we pick the 
+          * juiciest. First maximize cutstone, then minimize liberties. 
+          * We can only do this if the worm data is available, 
+          * i.e. if stackp==0.
+          */
+         if (*lunch == NO_MOVE
+             || worm[pos].cutstone > worm[*lunch].cutstone 
+             || (worm[pos].cutstone == worm[*lunch].cutstone 
+                 && worm[pos].liberties < worm[*lunch].liberties)) {
+           *lunch = worm[pos].origin;
+         }
+       }
+       break;
+      }
+    }
+  }
+  
+  if (*lunch != NO_MOVE)
+    return 1;
+
+  return 0;
+}
+
+
+/*
+ * Test whether two worms are the same. Used by autohelpers.
+ * Before this function can be called, build_worms must have been run.
+ */
+
+int
+is_same_worm(int w1, int w2)
+{
+  return worm[w1].origin == worm[w2].origin;
+}
+
+
+/*
+ * Test whether the origin of the worm at (w) is (pos).
+ */
+
+int
+is_worm_origin(int w, int pos)
+{
+  return worm[w].origin == pos;
+}
+
+
+/* 
+ * change_defense(str, move, dcode) is used to add and remove defense
+ * points. It can also be used to change the defense code. The meaning
+ * of the call is that the string (str) can be defended by (move) with
+ * defense code (dcode). If (dcode) is zero, the move is removed from
+ * the list of defense moves if it was previously listed.
+ */
+
+void
+change_defense(int str, int move, int dcode)
+{
+  str = worm[str].origin;
+  change_tactical_point(str, move, dcode,
+                       worm[str].defense_points, worm[str].defense_codes);
+}
+
+
+/* 
+ * change_attack(str, move, acode) is used to add and remove attack
+ * points. It can also be used to change the attack code. The meaning
+ * of the call is that the string (str) can be attacked by (move) with
+ * attack code (acode). If (acode) is zero, the move is removed from
+ * the list of attack moves if it was previously listed.
+ */
+
+void
+change_attack(int str, int move, int acode)
+{
+  str = worm[str].origin;
+  DEBUG(DEBUG_WORMS, "change_attack: %1m %1m %d\n", str, move, acode);
+  change_tactical_point(str, move, acode,
+                       worm[str].attack_points, worm[str].attack_codes);
+}
+
+
+/* 
+ * change_defense_threat(str, move, dcode) is used to add and remove
+ * defense threat points. It can also be used to change the defense
+ * threat code. The meaning of the call is that the string (str) can
+ * threaten to be defended by (move) with defense threat code (dcode).
+ * If (dcode) is zero, the move is removed from the list of defense
+ * threat moves if it was previously listed.
+ */
+
+void
+change_defense_threat(int str, int move, int dcode)
+{
+  str = worm[str].origin;
+  change_tactical_point(str, move, dcode,
+                       worm[str].defense_threat_points,
+                       worm[str].defense_threat_codes);
+}
+
+
+/* 
+ * change_attack_threat(str, move, acode) is used to add and remove
+ * attack threat points. It can also be used to change the attack
+ * threat code. The meaning of the call is that the string (str) can
+ * threaten to be attacked by (move) with attack threat code (acode).
+ * If (acode) is zero, the move is removed from the list of attack
+ * threat moves if it was previously listed.
+ */
+
+void
+change_attack_threat(int str, int move, int acode)
+{
+  str = worm[str].origin;
+  change_tactical_point(str, move, acode,
+                       worm[str].attack_threat_points,
+                       worm[str].attack_threat_codes);
+}
+
+
+/* Check whether (move) is listed as an attack point for (str) and
+ * return the attack code. If (move) is not listed, return 0.
+ */
+int
+attack_move_known(int move, int str)
+{
+  return movelist_move_known(move, MAX_TACTICAL_POINTS,
+                            worm[str].attack_points,
+                            worm[str].attack_codes);
+}
+
+/* Check whether (move) is listed as a defense point for (str) and
+ * return the defense code. If (move) is not listed, return 0.
+ */
+int
+defense_move_known(int move, int str)
+{
+  return movelist_move_known(move, MAX_TACTICAL_POINTS,
+                            worm[str].defense_points,
+                            worm[str].defense_codes);
+}
+
+/* Check whether (move) is listed as an attack threat point for (str)
+ * and return the attack threat code. If (move) is not listed, return
+ * 0.
+ */
+int
+attack_threat_move_known(int move, int str)
+{
+  return movelist_move_known(move, MAX_TACTICAL_POINTS,
+                            worm[str].attack_threat_points,
+                            worm[str].attack_threat_codes);
+}
+
+/* Check whether (move) is listed as a defense threat point for (str)
+ * and return the defense threat code. If (move) is not listed, return
+ * 0.
+ */
+int
+defense_threat_move_known(int move, int str)
+{
+  return movelist_move_known(move, MAX_TACTICAL_POINTS,
+                            worm[str].defense_threat_points,
+                            worm[str].defense_threat_codes);
+}
+
+
+/*
+ * This function does the real work for change_attack(),
+ * change_defense(), change_attack_threat(), and
+ * change_defense_threat().
+ */
+
+static void
+change_tactical_point(int str, int move, int code,
+                     int points[MAX_TACTICAL_POINTS],
+                     int codes[MAX_TACTICAL_POINTS])
+{
+  ASSERT_ON_BOARD1(str);
+  ASSERT1(str == worm[str].origin, str);
+  
+  movelist_change_point(move, code, MAX_TACTICAL_POINTS, points, codes);
+  propagate_worm2(str);
+}
+
+
+/* 
+ * propagate_worm() takes the worm data at one stone and copies it to 
+ * the remaining members of the worm.
+ *
+ * Even though we don't need to copy all the fields, it's probably
+ * better to do a structure copy which should compile to a block copy.
+ */
+
+void 
+propagate_worm(int pos)
+{
+  int k;
+  int num_stones;
+  int stones[MAX_BOARD * MAX_BOARD];
+  gg_assert(stackp == 0);
+  ASSERT1(IS_STONE(board[pos]), pos);
+
+  num_stones = findstones(pos, MAX_BOARD * MAX_BOARD, stones);
+  for (k = 0; k < num_stones; k++)
+    if (stones[k] != pos)
+      worm[stones[k]] = worm[pos];
+}
+
+
+/* 
+ * propagate_worm2() is a relative to propagate_worm() which can be
+ * used when stackp>0 but not for the initial construction of the
+ * worms.
+ */
+
+static void 
+propagate_worm2(int str)
+{
+  int pos;
+  ASSERT_ON_BOARD1(str);
+  ASSERT1(IS_STONE(worm[str].color), str);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (board[pos] == board[str] && is_same_worm(pos, str)
+       && pos != str)
+      worm[pos] = worm[str];
+}
+
+
+/* Report all known attack, defense, attack threat, and defense threat
+ * moves. But limit this to the moves which can be made by (color).
+ */
+void
+worm_reasons(int color)
+{
+  int pos;
+  int k;
+  
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (!ON_BOARD(pos) || board[pos] == EMPTY)
+      continue;
+
+    if (!is_worm_origin(pos, pos))
+      continue;
+
+    if (board[pos] == OTHER_COLOR(color)) {
+      for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+       if (worm[pos].attack_codes[k] != 0)
+         add_attack_move(worm[pos].attack_points[k], pos,
+                         worm[pos].attack_codes[k]);
+       if (worm[pos].attack_threat_codes[k] != 0)
+         add_attack_threat_move(worm[pos].attack_threat_points[k], pos,
+                                worm[pos].attack_threat_codes[k]);
+      }
+    }
+      
+    if (board[pos] == color) {
+      for (k = 0; k < MAX_TACTICAL_POINTS; k++) {
+       if (worm[pos].defense_codes[k] != 0)
+         add_defense_move(worm[pos].defense_points[k], pos,
+                          worm[pos].defense_codes[k]);
+
+       if (worm[pos].defense_threat_codes[k] != 0)
+         add_defense_threat_move(worm[pos].defense_threat_points[k], pos,
+                                 worm[pos].defense_threat_codes[k]);
+      }
+    }
+  }
+}
+
+
+/* ping_cave(str, *lib1, ...) is applied when (str) points to a string.
+ * It computes the vector (*lib1, *lib2, *lib3, *lib4), 
+ * where *lib1 is the number of liberties of the string, 
+ * *lib2 is the number of second order liberties (empty vertices
+ * at distance two) and so forth.
+ *
+ * The definition of liberties of order >1 is adapted to the problem
+ * of detecting the shape of the surrounding cavity. In particular
+ * we want to be able to see if a group is loosely surrounded.
+ *
+ * A liberty of order n is an empty space which may be connected
+ * to the string by placing n stones of the same color on the board, 
+ * but no fewer. The path of connection may pass through an intervening group
+ * of the same color. The stones placed at distance >1 may not touch a
+ * group of the opposite color. At the edge, also diagonal neighbors
+ * count as touching. The path may also not pass through a liberty at distance
+ * 1 if that liberty is flanked by two stones of the opposing color. This
+ * reflects the fact that the O stone is blocked from expansion to the
+ * left by the two X stones in the following situation:
+ * 
+ *          X.
+ *          .O
+ *          X.
+ *
+ * On the edge, one stone is sufficient to block expansion:
+ *
+ *          X.
+ *          .O
+ *          --
+ */
+
+static void 
+ping_cave(int str, int *lib1, int *lib2, int *lib3, int *lib4)
+{
+  int pos;
+  int k;
+  int libs[MAXLIBS];
+  int mrc[BOARDMAX];
+  int mse[BOARDMAX];
+  int color = board[str];
+  int other = OTHER_COLOR(color);
+
+  memset(mse, 0, sizeof(mse));
+
+  /* Find and mark the first order liberties. */
+  *lib1 = findlib(str, MAXLIBS, libs);
+  for (k = 0; k < *lib1; k++)
+    mse[libs[k]] = 1;
+
+  /* Reset mse at liberties which are flanked by two stones of the
+   * opposite color, or one stone and the edge.
+   */
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos)
+       && mse[pos]
+       && (((      !ON_BOARD(SOUTH(pos)) || board[SOUTH(pos)] == other)
+            && (   !ON_BOARD(NORTH(pos)) || board[NORTH(pos)] == other))
+           || ((   !ON_BOARD(WEST(pos))  || board[WEST(pos)]  == other)
+               && (!ON_BOARD(EAST(pos))  || board[EAST(pos)]  == other))))
+      mse[pos] = 0;
+  
+  *lib2 = 0;
+  memset(mrc, 0, sizeof(mrc));
+  ping_recurse(str, lib2, mse, mrc, color);
+
+  *lib3 = 0;
+  memset(mrc, 0, sizeof(mrc));
+  ping_recurse(str, lib3, mse, mrc, color);
+
+  *lib4 = 0;
+  memset(mrc, 0, sizeof(mrc));
+  ping_recurse(str, lib4, mse, mrc, color);
+}
+
+
+/* recursive function called by ping_cave */
+
+static void 
+ping_recurse(int pos, int *counter,
+            int mx[BOARDMAX], int mr[BOARDMAX],
+            int color)
+{
+  int k;
+  mr[pos] = 1;
+
+  for (k = 0; k < 4; k++) {
+    int apos = pos + delta[k];
+    if (board[apos] == EMPTY
+       && mx[apos] == 0
+       && mr[apos] == 0
+       && !touching(apos, OTHER_COLOR(color))) {
+      (*counter)++;
+      mr[apos] = 1;
+      mx[apos] = 1;
+    }
+  }
+  
+  if (!is_ko_point(pos)) {
+    for (k = 0; k < 4; k++) {
+      int apos = pos + delta[k];
+      if (ON_BOARD(apos)
+         && mr[apos] == 0
+         && (mx[apos] == 1
+             || board[apos] == color))
+       ping_recurse(apos, counter, mx, mr, color);
+    }
+  }
+}
+
+
+/* touching(pos, color) returns true if the vertex at (pos) is
+ * touching any stone of (color).
+ */
+
+static int
+touching(int pos, int color)
+{
+  return (board[SOUTH(pos)] == color
+         || board[WEST(pos)] == color
+         || board[NORTH(pos)] == color
+         || board[EAST(pos)] == color);
+}
+
+
+/* The GENUS of a string is the number of connected components of
+ * its complement, minus one. It is an approximation to the number of
+ * eyes of the string.
+ */
+
+static int 
+genus(int str)
+{
+  int pos;
+  int mg[BOARDMAX];
+  int gen = -1;
+
+  memset(mg, 0, sizeof(mg));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)
+       && !mg[pos]
+       && (board[pos] == EMPTY || !is_same_worm(pos, str))) {
+      markcomponent(str, pos, mg);
+      gen++;
+    }
+  }
+
+  return gen;
+}
+
+
+/* This recursive function marks the component at (pos) of 
+ * the complement of the string with origin (str)
+ */
+
+static void 
+markcomponent(int str, int pos, int mg[BOARDMAX])
+{
+  int k;
+  mg[pos] = 1;
+  for (k = 0; k < 4; k++) {
+    int apos = pos + delta[k];
+    if (ON_BOARD(apos)
+       && mg[apos] == 0
+       && (board[apos] == EMPTY || !is_same_worm(apos, str)))
+      markcomponent(str, apos, mg);
+  }
+}
+
+
+/* examine_cavity(pos, *edge), if (pos) is EMPTY, examines the
+ * cavity at (m, n) and returns its bordercolor,
+ * which can be BLACK, WHITE or GRAY. The edge parameter is set to the
+ * number of edge vertices in the cavity.
+ *
+ * If (pos) is nonempty, it returns the same result, imagining
+ * that the string at (pos) is removed. The edge parameter is
+ * set to the number of vertices where the cavity meets the
+ * edge in a point outside the removed string.  
+ */
+
+static int
+examine_cavity(int pos, int *edge)
+{
+  int border_color = EMPTY;
+  int ml[BOARDMAX];
+  int origin = NO_MOVE;
+  
+  ASSERT_ON_BOARD1(pos);
+  gg_assert(edge != NULL);
+  
+  memset(ml, 0, sizeof(ml));
+
+  *edge = 0;
+
+  if (IS_STONE(board[pos]))
+    origin = find_origin(pos);
+  
+  cavity_recurse(pos, ml, &border_color, edge, origin);
+
+  if (border_color != EMPTY)
+    return border_color;
+
+  /* We should have returned now, unless the board is completely empty.
+   * Verify that this is the case and then return GRAY.
+   *
+   * Notice that the board appears completely empty if there's only a
+   * single string and pos points to it.
+   */
+  gg_assert(border_color == EMPTY
+           && ((pos == NO_MOVE
+                && stones_on_board(BLACK | WHITE) == 0)
+               || (pos != NO_MOVE
+                   && stones_on_board(BLACK | WHITE) == countstones(pos))));
+  
+  return GRAY;
+}
+
+
+/* helper function for examine_cavity.
+ * border_color contains information so far : transitions allowed are
+ *   EMPTY       -> BLACK/WHITE
+ *   BLACK/WHITE -> BLACK | WHITE
+ *
+ * mx[pos] is 1 if (pos) has already been visited.
+ *
+ * if (str) points to the origin of a string, it will be ignored.
+ *
+ * On (fully-unwound) exit
+ *   *border_color should be BLACK, WHITE or BLACK | WHITE
+ *   *edge is the count of edge pieces
+ *
+ * *border_color should be EMPTY if and only if the board
+ * is completely empty or only contains the ignored string.
+ */
+
+static void 
+cavity_recurse(int pos, int mx[BOARDMAX], 
+              int *border_color, int *edge, int str)
+{
+  int k;
+  ASSERT1(mx[pos] == 0, pos);
+
+  mx[pos] = 1;
+
+  if (is_edge_vertex(pos) && board[pos] == EMPTY) 
+    (*edge)++;
+
+  /* Loop over the four neighbors. */
+  for (k = 0; k < 4; k++) {
+    int apos = pos + delta[k];
+    if (ON_BOARD(apos) && !mx[apos]) {
+      int neighbor_empty = 0;
+      
+      if (board[apos] == EMPTY)
+       neighbor_empty = 1;
+      else {
+       /* Count the neighbor as empty if it is part of the (ai, aj) string. */
+       if (str == find_origin(apos))
+         neighbor_empty = 1;
+       else
+         neighbor_empty = 0;
+      }
+      
+      if (!neighbor_empty)
+       *border_color |= board[apos];
+      else
+       cavity_recurse(apos, mx, border_color, edge, str);
+    }
+  }
+}
+
+
+/* Find attacking moves by pattern matching, for both colors. */
+static void
+find_attack_patterns(void)
+{
+  matchpat(attack_callback, ANCHOR_OTHER, &attpat_db, NULL, NULL);
+}
+
+/* Try to attack every X string in the pattern, whether there is an attack
+ * before or not. Only exclude already known attacking moves.
+ */
+static void
+attack_callback(int anchor, int color, struct pattern *pattern, int ll,
+               void *data)
+{
+  int move;
+  int k;
+  UNUSED(data);
+
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT) {
+    if (!pattern->autohelper(ll, move, color, 0))
+      return;
+  }
+
+  /* If the pattern has a helper, call it to see if the pattern must
+   * be rejected.
+   */
+  if (pattern->helper) {
+    if (!pattern->helper(pattern, ll, move, color)) {
+      DEBUG(DEBUG_WORMS,
+           "Attack pattern %s+%d rejected by helper at %1m\n",
+           pattern->name, ll, move);
+      return;
+    }
+  }
+
+  /* Loop through pattern elements in search of X strings to attack. */
+  for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+    if (pattern->patn[k].att == ATT_X) {
+      /* transform pattern real coordinate */
+      int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+      int str = worm[pos].origin;
+
+      /* A string with 5 liberties or more is considered tactically alive. */
+      if (countlib(str) > 4)
+       continue;
+
+      if (attack_move_known(move, str))
+       continue;
+
+      /* No defenses are known at this time, so defend_code is always 0. */
+#if 0
+      /* If the string can be attacked but not defended, ignore it. */
+      if (worm[str].attack_codes[0] == WIN && worm[str].defense_codes[0] == 0)
+       continue;
+#endif
+      
+      /* FIXME: Don't attack the same string more than once.
+       * Play (move) and see if there is a defense.
+       */
+      if (trymove(move, color, "attack_callback", str)) {
+       int dcode;
+       if (!board[str])
+         dcode = 0;
+       else if (!attack(str, NULL))
+         dcode = WIN;
+       else
+         dcode = find_defense(str, NULL);
+
+       popgo();
+
+       /* Do not pick up suboptimal attacks at this time. Since we
+         * don't know whether the string can be defended it's quite
+         * possible that it only has a ko defense and then we would
+         * risk to find an irrelevant move to attack with ko.
+        */
+       if (dcode != WIN && REVERSE_RESULT(dcode) >= worm[str].attack_codes[0]) {
+         change_attack(str, move, REVERSE_RESULT(dcode));
+         DEBUG(DEBUG_WORMS,
+               "Attack pattern %s+%d found attack on %1m at %1m with code %d\n",
+               pattern->name, ll, str, move, REVERSE_RESULT(dcode));
+       }
+      }
+    }
+  }
+}
+
+static void
+find_defense_patterns(void)
+{
+  matchpat(defense_callback, ANCHOR_COLOR, &defpat_db, NULL, NULL);
+}
+
+static void
+defense_callback(int anchor, int color, struct pattern *pattern, int ll,
+                void *data)
+{
+  int move;
+  int k;
+  UNUSED(data);
+
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+  
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT) {
+    if (!pattern->autohelper(ll, move, color, 0))
+      return;
+  }
+
+  /* If the pattern has a helper, call it to see if the pattern must
+   * be rejected.
+   */
+  if (pattern->helper) {
+    if (!pattern->helper(pattern, ll, move, color)) {
+      DEBUG(DEBUG_WORMS,
+           "Defense pattern %s+%d rejected by helper at %1m\n",
+           pattern->name, ll, move);
+      return;
+    }
+  }
+
+  /* Loop through pattern elements in search for O strings to defend. */
+  for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+    if (pattern->patn[k].att == ATT_O) {
+      /* transform pattern real coordinate */
+      int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+      int str = worm[pos].origin;
+
+      if (worm[str].attack_codes[0] == 0
+         || defense_move_known(move, str))
+       continue;
+      
+      /* FIXME: Don't try to defend the same string more than once.
+       * FIXME: For all attacks on this string, we should test whether
+       *        the proposed move happens to refute the attack.
+       * Play (move) and see if there is an attack.
+       */
+      if (trymove(move, color, "defense_callback", str)) {
+       int acode = attack(str, NULL);
+
+       popgo();
+       
+       if (acode < worm[str].attack_codes[0]) {
+         change_defense(str, move, REVERSE_RESULT(acode));
+         DEBUG(DEBUG_WORMS,
+               "Defense pattern %s+%d found defense of %1m at %1m with code %d\n",
+               pattern->name, ll, str, move, REVERSE_RESULT(acode));
+       }
+      }
+    }
+  }
+}
+
+
+void
+get_lively_stones(int color, signed char safe_stones[BOARDMAX])
+{
+  int pos;
+  memset(safe_stones, 0, BOARDMAX * sizeof(*safe_stones));
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (IS_STONE(board[pos]) && find_origin(pos) == pos) {
+      if ((stackp == 0 && worm[pos].attack_codes[0] == 0) || !attack(pos, NULL)
+         || (board[pos] == color
+             && ((stackp == 0 && worm[pos].defense_codes[0] != 0)
+                 || find_defense(pos, NULL))))
+       mark_string(pos, safe_stones, 1);
+    }
+}
+
+
+void
+compute_worm_influence()
+{
+  signed char safe_stones[BOARDMAX];
+
+  get_lively_stones(BLACK, safe_stones);
+  compute_influence(BLACK, safe_stones, NULL, &initial_black_influence,
+                   NO_MOVE, "initial black influence");
+  get_lively_stones(WHITE, safe_stones);
+  compute_influence(WHITE, safe_stones, NULL, &initial_white_influence,
+                   NO_MOVE, "initial white influence");
+}
+
+/* ================================================================ */
+/*                      Debugger functions                          */
+/* ================================================================ */
+
+/* For use in gdb, print details of the worm at (m, n). 
+ * Add this to your .gdbinit file:
+ *
+ * define worm
+ * set ascii_report_worm("$arg0")
+ * end
+ *
+ * Now 'worm S8' will report the details of the S8 worm.
+ *
+ */
+
+void
+ascii_report_worm(char *string)
+{
+  int pos = string_to_location(board_size, string);
+  report_worm(pos);
+}
+
+
+static void
+report_worm(int pos)
+{
+  int i;
+
+  if (board[pos] == EMPTY) {
+    gprintf("There is no worm at %1m\n", pos);
+    return;
+  }
+
+  gprintf("*** worm at %1m:\n", pos);
+  gprintf("color: %s; origin: %1m; size: %d; effective size: %f\n",
+         (worm[pos].color == WHITE) ? "White" : "Black",
+         worm[pos].origin, worm[pos].size, worm[pos].effective_size);
+
+  gprintf("liberties: %d order 2 liberties:%d order 3:%d order 4:%d\n",
+         worm[pos].liberties, 
+         worm[pos].liberties2, 
+         worm[pos].liberties3, 
+         worm[pos].liberties4);
+
+  /* List all attack points. */
+  if (worm[pos].attack_points[0] == NO_MOVE)
+    gprintf("no attack point, ");
+  else {
+    gprintf("attack point(s):");
+    i = 0;
+    while (worm[pos].attack_points[i] != NO_MOVE) {
+      if (i > 0)
+       gprintf(",");
+      gprintf(" %1m: %s", worm[pos].attack_points[i],
+             result_to_string(worm[pos].attack_codes[i]));
+      i++;
+    }
+    gprintf("\n;");
+  }
+
+  /* List all defense points. */
+  if (worm[pos].defense_points[0] == NO_MOVE)
+    gprintf("no defense point, ");
+  else {
+    gprintf("defense point(s):");
+    i = 0;
+    while (worm[pos].defense_points[i] != NO_MOVE) {
+      if (i > 0)
+       gprintf(",");
+      gprintf(" %1m: %s", worm[pos].defense_points[i],
+             result_to_string(worm[pos].defense_codes[i]));
+      i++;
+    }
+    gprintf("\n;");
+  }
+
+  /* List all attack threat points. */
+  if (worm[pos].attack_threat_points[0] == NO_MOVE)
+    gprintf("no attack threat point, ");
+  else {
+    gprintf("attack threat point(s):");
+    i = 0;
+    while (worm[pos].attack_threat_points[i] != NO_MOVE) {
+      if (i > 0)
+       gprintf(",");
+      gprintf(" %1m: %s", worm[pos].attack_threat_points[i],
+             result_to_string(worm[pos].attack_threat_codes[i]));
+      i++;
+    }
+    gprintf("\n;");
+  }
+
+  /* List all defense threat points. */
+  if (worm[pos].defense_threat_points[0] == NO_MOVE)
+    gprintf("no defense threat point, ");
+  else {
+    gprintf("defense threat point(s):");
+    i = 0;
+    while (worm[pos].defense_threat_points[i] != NO_MOVE) {
+      if (i > 0)
+       gprintf(",");
+      gprintf(" %1m: %s", worm[pos].defense_threat_points[i],
+             result_to_string(worm[pos].defense_threat_codes[i]));
+      i++;
+    }
+    gprintf("\n;");
+  }
+
+  /* Report lunch if any. */
+  if (worm[pos].lunch != NO_MOVE)
+    gprintf("lunch at %1m\n", worm[pos].lunch);
+
+  gprintf("cutstone: %d, cutstone2: %d\n",
+         worm[pos].cutstone, worm[pos].cutstone2);
+
+  gprintf("genus: %d, ", worm[pos].genus);
+
+  if (worm[pos].inessential)
+    gprintf("inessential: YES, ");
+  else
+    gprintf("inessential: NO, ");
+
+  if (worm[pos].invincible)
+    gprintf("invincible: YES, \n");
+  else
+    gprintf("invincible: NO, \n");
+
+  gprintf("unconditional status %s\n",
+         status_to_string(worm[pos].unconditional_status));
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/gnugo.dsw b/gnugo.dsw
new file mode 100644 (file)
index 0000000..19d6f7d
--- /dev/null
+++ b/gnugo.dsw
@@ -0,0 +1,290 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "board"=.\engine\board.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "dfa"=.\patterns\dfa.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "engine"=.\engine\engine.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgf\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "fuseki"=.\patterns\fuseki.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgf\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgfgen\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name engine\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name patterns\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name dfa\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "gnugo"=.\interface\gnugo.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name board\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name engine\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name joseki\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name mkeyes\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name mkpat\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgf\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgfgen\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name fuseki\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name patterns\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name dfa\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "joseki"=.\patterns\joseki.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgf\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name board\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "mkeyes"=.\patterns\mkeyes.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "mkmcpat"=.\patterns\mkmcpat.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "mkpat"=.\patterns\mkpat.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name dfa\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "patterns"=.\patterns\patterns.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name joseki\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name mkeyes\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name mkpat\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name uncompress_fuseki\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name mkmcpat\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "sgf"=.\sgf\sgf.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgfgen\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "sgfgen"=.\sgf\sgfgen.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "uncompress_fuseki"=.\patterns\uncompress_fuseki.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+    Begin Project Dependency\r
+    Project_Dep_Name utils\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name board\r
+    End Project Dependency\r
+    Begin Project Dependency\r
+    Project_Dep_Name sgf\r
+    End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "utils"=.\utils\utils.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f6c38f2
--- /dev/null
@@ -0,0 +1,30 @@
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/engine)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/sgf)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/utils)
+
+########### gnugo executable ###############
+
+SET(gnugo_SRCS
+    main.c
+    play_ascii.c
+    play_gmp.c
+    play_gtp.c
+    play_solo.c
+    play_test.c
+    gmp.c
+    gtp.c
+    )
+
+ADD_EXECUTABLE(gnugo ${gnugo_SRCS})
+
+IF(WIN32)
+    SET(PLATFORM_LIBRARIES wsock32)
+ENDIF(WIN32)
+
+IF(UNIX)
+    SET(PLATFORM_LIBRARIES m)
+ENDIF(UNIX)
+
+TARGET_LINK_LIBRARIES(gnugo sgf engine sgf utils patterns ${PLATFORM_LIBRARIES})
+
+INSTALL(TARGETS gnugo DESTINATION bin)
diff --git a/interface/GoImage/Stone.pm b/interface/GoImage/Stone.pm
new file mode 100644 (file)
index 0000000..ad48db9
--- /dev/null
@@ -0,0 +1,270 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 #
+# by the Free Software Foundation.                                  #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Uses Perl GB package to create mini-PNG files used by the
+# regression html views.
+#
+
+package GoImage::Stone;
+
+if (0) {
+  require GD;
+}
+
+use GD;
+use strict;
+use warnings;
+
+BEGIN {
+      use Exporter ();
+      our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+      # set the version for version checking
+      $VERSION     = 0.01;
+      # if using RCS/CVS, this may be preferred (???-tm)
+      $VERSION = do { my @r = (q$Revision: 1.1.1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
+      @ISA         = qw(Exporter);
+      @EXPORT      = qw(&createPngFile &parseFileName);
+      %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
+      # your exported package globals go here,
+      # as well as any optionally exported functions
+      @EXPORT_OK   = (); #qw($Var1 %Hashit &func3);
+}
+our @EXPORT_OK;
+  # exported package globals go here
+  #our $Var1;
+  #our %Hashit;
+  # non-exported package globals go here
+  #our @more;
+  #our $stuff;
+  # initialize package globals, first exported ones
+  #$Var1   = '';
+  #%Hashit = ();
+  # then the others (which are still accessible as $Some::Module::stuff)
+  #$stuff  = '';
+  #@more   = ();
+  # all file-scoped lexicals must be created before
+  # the functions below that use them.
+  # file-private lexicals go here
+  #my $priv_var    = '';
+  #my %secret_hash = ();
+  # here's a file-private function as a closure,
+  # callable as &$priv_func;  it cannot be prototyped.
+  #my $priv_func = sub {
+      # stuff goes here.
+  #};
+  # make all your functions, whether exported or not;
+  # remember to put something interesting in the {} stubs
+  #sub createPngFile      {}    # no prototype
+  #sub func2()    {}    # proto'd void
+  #sub func3($$)  {}    # proto'd to 2 scalars
+  # this one isn't exported, but could be called!
+  #sub func4(\%)  {}    # proto'd to 1 hash ref
+
+my $overwrite = "";
+
+my $image_dir = "html/images";
+
+sub parseFileName {
+
+  #FIXME: !!!!!!!!!!!!!!!!!!!!!!!
+  #   Need to support text2 & text2_color attributes correctly.
+  my $fn = shift;
+  $fn =~ s/(.png)?\s*$//mg;
+#  print "$fn\n";
+  $fn =~ /([WBE])([1-9][0-9]*)([NSEWH]{0,2})((?:x[0-9a-fA-F]{2})*)_?([a-z]*)(?:-s([a-z]*))?/;
+  my ($color, $pixels, $position, $text, $text_color, $square_color) = ($1,$2,$3,$4,$5,$6);
+  my ($text2, $text2_color);
+  #print "$1:$2:$3:$4:$5\n";
+  if ($color eq "B") { $color = "black"; }
+  elsif ($color eq "W") { $color = "white"; }
+  elsif ($color =~ /^E/ || die "bad color in: $fn;$color;") { $color = ""; }
+  if ($text) {
+    my $new_text="";
+    while ($text =~ s/(...)//) {
+      $new_text .= chr(hex("0$1"));
+    }
+    $text = $new_text;
+  }
+
+
+
+  my $out = createPngFile($color, $pixels, $position, $text, $text_color, $text2, $text2_color, $square_color);
+  if ("$fn.png" ne $out) {
+    print "IN:$fn\tOUT:$out\n";
+  }
+}
+
+
+#createStone:
+#Does: Creates an appropriate PNG file if it doesn't exist, and...
+#Returns: name of the image file to use
+#Parameters:
+# color - stone color: "black", "white", ""
+# pixels - default 15.
+# position - "H", "N", "S", "E", "W", "NE", "SW", "SE", "NW", ""  (H == hoshi)
+#          : edge or star point location.
+# text  - stone label: "3 char max recommended."
+# text_color - "white", "black", "green","cyan","red","yellow","magenta","blue", ""
+# text2 - appended t text...;
+# text2_color - ...but in this color.
+# square_color - same choices as text_color
+#
+#Details:
+# creates file named like:
+#  COLORLIST := white|black|green|cyan|red|blue|yellow|magenta|grey
+#  [WBE]$pixels[NSEWH]{0,2}(${text}_(COLORLIST))?(__?${text}$(_COLORLIST))?(-s(COLORLIST))?
+#  Note that $text is written with each character converted to it's ord value
+#   in hex preceeded by an underscore to avoid bogus file names.  Also allows
+#   upper & lower case easily on case-insensitive file systems, like Windows.
+#  For example:
+#    W25.png - large white stone;
+#    B10.png - smaller black stone;
+#    B14x61x6d_R - black stone w/ red 'am' text.
+
+
+sub createPngFile {
+  my ($color, $pixels, $position, $text, $text_color, $text2, $text2_color, $square_color)= @_;
+  if (!$color) {$color = "";}
+  elsif (!($color eq "black" || $color eq "white")) { die "invalid color: $color"; }
+  if (!$text) {$text = "";}
+  if (!$text_color) {$text_color = "blue";}
+  if (!$text2) {$text2 = "";}
+  if (!$text2_color) {$text2_color = "blue";}
+  if (!$position) {$position = ""};
+  if (!$pixels) {$pixels = 15};
+  if (!$square_color) {$square_color = ""};
+  
+  my $image_name;
+  if ($color eq "black") { $image_name = "B"; }
+  elsif ($color eq "white") { $image_name = "W"; }
+  else {$image_name = "E"}
+
+  $image_name .= $pixels;
+  $image_name .= $position;
+  if ($text) {
+    foreach (split(//,$text)) {
+      $image_name .= "x" . (sprintf "%x", ord($_));
+    }
+    $image_name .= "_" . $text_color;
+  }
+  if ($text2) {
+    $image_name .= '__';
+    foreach (split(//,$text2)) {
+      $image_name .= "x" . (sprintf "%x", ord($_));
+    }
+    $image_name .= "_" . $text2_color;
+  }
+  
+  if ($square_color) {
+    $image_name .= "-s" . $square_color;
+  }
+  
+
+#gdGiantFont, gdLargeFont, gdMediumBoldFont, gdSmallFont and gdTinyFont  
+  $image_name .= ".png";
+
+  #Note: Create image name first; don't re-create if it already exists.
+  #The caller now caches the images names, so they're regenerated every
+  #time.  Maybe make this a package-level option?
+  if ((!$overwrite) && -e "$image_dir/$image_name") {
+    return $image_name;
+  }
+
+  my $im = new GD::Image($pixels,$pixels);
+  my %colors = ("white", $im->colorAllocate(255,255,255),
+                "black", $im->colorAllocate(0,0,0),
+                "red",   $im->colorAllocate(255,0,0),
+                "blue",  $im->colorAllocate(0,0,255),
+                "green", $im->colorAllocate(0,255,0),
+                "grey",  $im->colorAllocate(127,127,127),
+                "dkgrey",  $im->colorAllocate(63,63,63),
+                "ltgrey",  $im->colorAllocate(190,190,190),
+                "brown", $im->colorAllocate(170,140,70),
+                "cyan",  $im->colorAllocate(0,255,255),
+                "yellow",$im->colorAllocate(255,255,0),
+                "magenta",$im->colorAllocate(255,0,255),
+                );
+                
+  $im->fill(1,1, $colors{"brown"});                
+  if ($color) {
+    $im->arc($pixels/2, $pixels/2, $pixels+1, $pixels+1, 0, 360, $colors{$color});
+    $im->fill($pixels/2, $pixels/2, $colors{$color});
+  } else {
+    $im->line($pixels/2,0,$pixels/2,$pixels, $colors{"black"});
+    $im->line(0,$pixels/2,$pixels,$pixels/2, $colors{"black"});
+  }
+
+  if ($text || $text2) {
+    my $f = gdSmallFont;#gdLargeFont;#gdMediumBoldFont;#
+    my $ftext = $text.$text2;
+    my ($fw, $fh) = ($f->width,$f->height);
+    my ($tw, $th) = ($fw * length($ftext), $fh);  #TODO: Allow multi-line text.
+    my ($ulx, $uly) = ($pixels/2 - $tw/2 + 1, $pixels/2 - $th/2);
+    my ($lrx, $lry) = ($ulx + $tw, $uly + $th);
+    if (!$color or $text_color eq "blue" or $text2_color eq "blue"
+        or ($color eq "white" and $text_color eq "yellow" and $text2_color eq "yellow")) {
+      $im->filledRectangle($ulx-2, $uly, $lrx, $lry, $colors{"ltgrey"});
+    }
+    $im->string($f, $ulx, $uly, $text, $colors{$text_color});
+    $im->string($f, $ulx+ length($text) * $fw, $uly, $text2, $colors{$text2_color});
+  }
+  
+  if ($square_color) {
+    $im->rectangle(1,1,$pixels-2, $pixels-2, $colors{$square_color});
+    $im->rectangle(2,2,$pixels-3, $pixels-3, $colors{$square_color});
+  }
+
+
+  
+  open(IMAGE, ">$image_dir/$image_name") || die "Couldn't create file: $image_dir/$image_name";
+  binmode IMAGE;
+  print IMAGE $im->png;
+  close IMAGE;
+  return $image_name;
+}
+
+sub createTestHtml {
+  opendir(IMAGES, $image_dir);
+  foreach (sort readdir(IMAGES)) {
+    if (/\.png$/) {
+      print "$_:&nbsp;<IMG SRC=\"$image_dir/$_\"><HR>\n";
+    }
+  }
+}
+
+1;
+
+END { }
+
+if (!-e "html") {  #Wher's perl's  mkdir -p ????
+  mkdir "html";
+}
+
+if (!(-e $image_dir)) {
+  mkdir ($image_dir)  || die "Couldn't create directory: $image_dir\n";
+}
+
+1;
diff --git a/interface/Makefile.am b/interface/Makefile.am
new file mode 100644 (file)
index 0000000..b9949f4
--- /dev/null
@@ -0,0 +1,41 @@
+bin_PROGRAMS = gnugo
+
+EXTRA_DIST = gtp_examples gnugo.dsp gnugo.el make-xpms-file.el GoImage xpms \
+             big-xpms gnugo-xpms.el gnugo-big-xpms.el CMakeLists.txt
+
+noinst_HEADERS = interface.h gmp.h gtp.h
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+
+AM_CPPFLAGS = \
+       $(GNU_GO_WARNINGS) \
+       -I$(top_srcdir)/sgf \
+       -I$(top_srcdir)/engine \
+       -I$(top_srcdir)/utils
+
+LDADD = \
+       ../engine/libengine.a \
+       ../patterns/libpatterns.a \
+       ../sgf/libsgf.a \
+       ../utils/libutils.a
+
+gnugo_SOURCES = \
+       main.c \
+       play_ascii.c \
+       play_gmp.c \
+       play_gtp.c \
+       play_solo.c \
+       play_test.c \
+       gmp.c \
+       gtp.c
+
+gnugo-xpms.el : $(shell ls xpms/*.xpm)
+       emacs -batch --no-site-file -l make-xpms-file.el -f make-xpms-file $@ $(shell ls xpms/*.xpm)
+
+gnugo-big-xpms.el : $(shell ls xpms/*.xpm)
+       emacs -batch --no-site-file -l make-xpms-file.el -f make-xpms-file $@ $(shell ls big-xpms/*.xpm)
+
+AIXOPTS=-O -qmaxmem=16384 -qro -qroconst -qinfo
+
+# OPTIONS=$(AIXOPTS)
diff --git a/interface/Makefile.in b/interface/Makefile.in
new file mode 100644 (file)
index 0000000..b21865f
--- /dev/null
@@ -0,0 +1,459 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = gnugo$(EXEEXT)
+subdir = interface
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_gnugo_OBJECTS = main.$(OBJEXT) play_ascii.$(OBJEXT) \
+       play_gmp.$(OBJEXT) play_gtp.$(OBJEXT) play_solo.$(OBJEXT) \
+       play_test.$(OBJEXT) gmp.$(OBJEXT) gtp.$(OBJEXT)
+gnugo_OBJECTS = $(am_gnugo_OBJECTS)
+gnugo_LDADD = $(LDADD)
+gnugo_DEPENDENCIES = ../engine/libengine.a ../patterns/libpatterns.a \
+       ../sgf/libsgf.a ../utils/libutils.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(gnugo_SOURCES)
+DIST_SOURCES = $(gnugo_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = gtp_examples gnugo.dsp gnugo.el make-xpms-file.el GoImage xpms \
+             big-xpms gnugo-xpms.el gnugo-big-xpms.el CMakeLists.txt
+
+noinst_HEADERS = interface.h gmp.h gtp.h
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+AM_CPPFLAGS = \
+       $(GNU_GO_WARNINGS) \
+       -I$(top_srcdir)/sgf \
+       -I$(top_srcdir)/engine \
+       -I$(top_srcdir)/utils
+
+LDADD = \
+       ../engine/libengine.a \
+       ../patterns/libpatterns.a \
+       ../sgf/libsgf.a \
+       ../utils/libutils.a
+
+gnugo_SOURCES = \
+       main.c \
+       play_ascii.c \
+       play_gmp.c \
+       play_gtp.c \
+       play_solo.c \
+       play_test.c \
+       gmp.c \
+       gtp.c
+
+AIXOPTS = -O -qmaxmem=16384 -qro -qroconst -qinfo
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  interface/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  interface/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+         if test -f $$p \
+         ; then \
+           f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+          echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+          $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+         rm -f "$(DESTDIR)$(bindir)/$$f"; \
+       done
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+gnugo$(EXEEXT): $(gnugo_OBJECTS) $(gnugo_DEPENDENCIES) 
+       @rm -f gnugo$(EXEEXT)
+       $(LINK) $(gnugo_LDFLAGS) $(gnugo_OBJECTS) $(gnugo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/play_ascii.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/play_gmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/play_gtp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/play_solo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/play_test.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+       clean-generic ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-binPROGRAMS \
+       install-data install-data-am install-exec install-exec-am \
+       install-info install-info-am install-man install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+
+gnugo-xpms.el : $(shell ls xpms/*.xpm)
+       emacs -batch --no-site-file -l make-xpms-file.el -f make-xpms-file $@ $(shell ls xpms/*.xpm)
+
+gnugo-big-xpms.el : $(shell ls xpms/*.xpm)
+       emacs -batch --no-site-file -l make-xpms-file.el -f make-xpms-file $@ $(shell ls big-xpms/*.xpm)
+
+# OPTIONS=$(AIXOPTS)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interface/big-xpms/bmoku1.xpm b/interface/big-xpms/bmoku1.xpm
new file mode 100644 (file)
index 0000000..9ae2baa
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                                    ",
+"                                    ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"  ....................XXXXX.........",
+"  ..................................",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bmoku2.xpm b/interface/big-xpms/bmoku2.xpm
new file mode 100644 (file)
index 0000000..dfcb6c1
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku2_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                                    ",
+"                                    ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"......................XXXXX.........",
+"....................................",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bmoku3.xpm b/interface/big-xpms/bmoku3.xpm
new file mode 100644 (file)
index 0000000..30b2af7
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku3_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                                    ",
+"                                    ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"......................XXXXX.......  ",
+"..................................  ",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bmoku4.xpm b/interface/big-xpms/bmoku4.xpm
new file mode 100644 (file)
index 0000000..0e20241
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku4_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"  ....................XXXXX.........",
+"  ..................................",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bmoku5.xpm b/interface/big-xpms/bmoku5.xpm
new file mode 100644 (file)
index 0000000..fcbc41f
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku5_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"......................XXXXX.........",
+"....................................",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bmoku6.xpm b/interface/big-xpms/bmoku6.xpm
new file mode 100644 (file)
index 0000000..d579da6
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku6_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"......................XXXXX.......  ",
+"..................................  ",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bmoku7.xpm b/interface/big-xpms/bmoku7.xpm
new file mode 100644 (file)
index 0000000..5a209e8
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku7_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"  ....................XXXXX.........",
+"  ..................................",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/bmoku8.xpm b/interface/big-xpms/bmoku8.xpm
new file mode 100644 (file)
index 0000000..61aadab
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku8_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"......................XXXXX.........",
+"....................................",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/bmoku9.xpm b/interface/big-xpms/bmoku9.xpm
new file mode 100644 (file)
index 0000000..340f7c3
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku9_xpm[] = {
+"36 36 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ..............XooOOOOooX....    ",
+"    ..............XooOOOOOooX...    ",
+"   ...............XooOOOOOooX....   ",
+"   ...............XooOOOOOOoX....   ",
+"   ...............XXoOOOOOooX....   ",
+"  .................XoooOOoooX.....  ",
+"  .................XXooooooXX.....  ",
+"  ..................XXXoooXX......  ",
+"......................XXXXX.......  ",
+"..................................  ",
+"  ................................  ",
+"  ................................  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/bpmoku1.xpm b/interface/big-xpms/bpmoku1.xpm
new file mode 100644 (file)
index 0000000..c6b9dca
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku1_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                                    ",
+"                                    ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"  .............++++++...............",
+"  .............++++++...............",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bpmoku2.xpm b/interface/big-xpms/bpmoku2.xpm
new file mode 100644 (file)
index 0000000..84c68a4
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku2_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                                    ",
+"                                    ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"...............++++++...............",
+"...............++++++...............",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bpmoku3.xpm b/interface/big-xpms/bpmoku3.xpm
new file mode 100644 (file)
index 0000000..467ad01
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku3_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                                    ",
+"                                    ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"...............++++++.............  ",
+"...............++++++.............  ",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bpmoku4.xpm b/interface/big-xpms/bpmoku4.xpm
new file mode 100644 (file)
index 0000000..1d0c942
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku4_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"  .............++++++...............",
+"  .............++++++...............",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bpmoku5.xpm b/interface/big-xpms/bpmoku5.xpm
new file mode 100644 (file)
index 0000000..ecab4d1
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku5_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"...............++++++...............",
+"...............++++++...............",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bpmoku6.xpm b/interface/big-xpms/bpmoku6.xpm
new file mode 100644 (file)
index 0000000..09847e2
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku6_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"...............++++++.............  ",
+"...............++++++.............  ",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/bpmoku7.xpm b/interface/big-xpms/bpmoku7.xpm
new file mode 100644 (file)
index 0000000..cd0dce8
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku7_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"  .............++++++...............",
+"  .............++++++...............",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/bpmoku8.xpm b/interface/big-xpms/bpmoku8.xpm
new file mode 100644 (file)
index 0000000..9257e55
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku8_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"...............++++++...............",
+"...............++++++...............",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/bpmoku9.xpm b/interface/big-xpms/bpmoku9.xpm
new file mode 100644 (file)
index 0000000..8e05104
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bpmoku9_xpm[] = {
+"36 36 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                 ..                 ",
+"                 ..                 ",
+"              ........              ",
+"           ..............           ",
+"         ..................         ",
+"        ............XXXX....        ",
+"       ............XXXXXXX...       ",
+"      ............XXXooooXX...      ",
+"     .............XXooooooXX...     ",
+"    ................XXOOOooX....    ",
+"    ..................XXOOooX...    ",
+"   ....................XXOooX....   ",
+"   .....................XXOoX....   ",
+"   .....................XXOOX....   ",
+"  .......................XXOX.....  ",
+"  ...............++.......XXX.....  ",
+"  ..............++++..............  ",
+"...............++++++.............  ",
+"...............++++++.............  ",
+"  ..............++++..............  ",
+"  ...............++...............  ",
+"  ................................  ",
+"   ..............................   ",
+"   ..............................   ",
+"   ..............................   ",
+"    ............................    ",
+"    ............................    ",
+"     ..........................     ",
+"      ........................      ",
+"       ......................       ",
+"        ....................        ",
+"         ..................         ",
+"           ..............           ",
+"              ........              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/empty1.xpm b/interface/big-xpms/empty1.xpm
new file mode 100644 (file)
index 0000000..ddc9712
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty1_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                 ...................",
+"                 ...................",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/empty2.xpm b/interface/big-xpms/empty2.xpm
new file mode 100644 (file)
index 0000000..5506c69
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty1_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"....................................",
+"....................................",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/empty3.xpm b/interface/big-xpms/empty3.xpm
new file mode 100644 (file)
index 0000000..a70c781
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty3_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"...................                 ",
+"...................                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/empty4.xpm b/interface/big-xpms/empty4.xpm
new file mode 100644 (file)
index 0000000..1d26031
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty4_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ...................",
+"                 ...................",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/empty5.xpm b/interface/big-xpms/empty5.xpm
new file mode 100644 (file)
index 0000000..9daeeda
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty5_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"....................................",
+"....................................",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/empty6.xpm b/interface/big-xpms/empty6.xpm
new file mode 100644 (file)
index 0000000..e6ae287
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty6_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"...................                 ",
+"...................                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/empty7.xpm b/interface/big-xpms/empty7.xpm
new file mode 100644 (file)
index 0000000..f352049
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty7_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ...................",
+"                 ...................",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/empty8.xpm b/interface/big-xpms/empty8.xpm
new file mode 100644 (file)
index 0000000..cbd499c
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty8_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"....................................",
+"....................................",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/empty9.xpm b/interface/big-xpms/empty9.xpm
new file mode 100644 (file)
index 0000000..824042c
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * empty9_xpm[] = {
+"36 36 2 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"...................                 ",
+"...................                 ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/hoshi.xpm b/interface/big-xpms/hoshi.xpm
new file mode 100644 (file)
index 0000000..8103b02
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * hoshi_xpm[] = {
+"36 36 4 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618565956185",
+"o     c #9E799A699E79",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                ....                ",
+"               ......               ",
+"....................................",
+"....................................",
+"               ......               ",
+"                ....                ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku1.xpm b/interface/big-xpms/wmoku1.xpm
new file mode 100644 (file)
index 0000000..8851c25
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku1_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                                    ",
+"                                    ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"  &%%%%%$$$$$oooXXXOOO+++++OOOXXXo..",
+"  &&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku2.xpm b/interface/big-xpms/wmoku2.xpm
new file mode 100644 (file)
index 0000000..14ecd73
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku2_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                                    ",
+"                                    ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo..",
+"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku3.xpm b/interface/big-xpms/wmoku3.xpm
new file mode 100644 (file)
index 0000000..59a4e2b
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku3_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                                    ",
+"                                    ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo  ",
+"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo  ",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku4.xpm b/interface/big-xpms/wmoku4.xpm
new file mode 100644 (file)
index 0000000..426200a
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku4_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"  &%%%%%$$$$$oooXXXOOO+++++OOOXXXo..",
+"  &&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku5.xpm b/interface/big-xpms/wmoku5.xpm
new file mode 100644 (file)
index 0000000..a011358
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo..",
+"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku6.xpm b/interface/big-xpms/wmoku6.xpm
new file mode 100644 (file)
index 0000000..e3c032f
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku6_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo  ",
+"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo  ",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wmoku7.xpm b/interface/big-xpms/wmoku7.xpm
new file mode 100644 (file)
index 0000000..620cdfa
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku7_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"  &%%%%%$$$$$oooXXXOOO+++++OOOXXXo..",
+"  &&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/wmoku8.xpm b/interface/big-xpms/wmoku8.xpm
new file mode 100644 (file)
index 0000000..c490eca
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku8_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo..",
+"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/wmoku9.xpm b/interface/big-xpms/wmoku9.xpm
new file mode 100644 (file)
index 0000000..768fec7
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku9_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo  ",
+"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo  ",
+"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/wpmoku1.xpm b/interface/big-xpms/wpmoku1.xpm
new file mode 100644 (file)
index 0000000..afb9be5
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku1_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                                    ",
+"                                    ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"  &%%%%%$$$$$oo......O+++++OOOXXXo..",
+"  &&&&%%%$$$$oo......OOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wpmoku2.xpm b/interface/big-xpms/wpmoku2.xpm
new file mode 100644 (file)
index 0000000..fba9863
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku2_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                                    ",
+"                                    ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oo......O+++++OOOXXXo..",
+"..&&&&%%%$$$$oo......OOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wpmoku3.xpm b/interface/big-xpms/wpmoku3.xpm
new file mode 100644 (file)
index 0000000..e046b2f
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku3_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                                    ",
+"                                    ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oo......O+++++OOOXXXo  ",
+"..&&&&%%%$$$$oo......OOOOOOOOOXXoo  ",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wpmoku4.xpm b/interface/big-xpms/wpmoku4.xpm
new file mode 100644 (file)
index 0000000..d1c130c
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku4_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"  &%%%%%$$$$$oo......O+++++OOOXXXo..",
+"  &&&&%%%$$$$oo......OOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wpmoku5.xpm b/interface/big-xpms/wpmoku5.xpm
new file mode 100644 (file)
index 0000000..82b5168
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku5_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oo......O+++++OOOXXXo..",
+"..&&&&%%%$$$$oo......OOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wpmoku6.xpm b/interface/big-xpms/wpmoku6.xpm
new file mode 100644 (file)
index 0000000..fa61d91
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku6_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oo......O+++++OOOXXXo  ",
+"..&&&&%%%$$$$oo......OOOOOOOOOXXoo  ",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                 ..                 ",
+"                 ..                 "};
diff --git a/interface/big-xpms/wpmoku7.xpm b/interface/big-xpms/wpmoku7.xpm
new file mode 100644 (file)
index 0000000..ddc2cb0
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku7_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"  &%%%%%$$$$$oo......O+++++OOOXXXo..",
+"  &&&&%%%$$$$oo......OOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/wpmoku8.xpm b/interface/big-xpms/wpmoku8.xpm
new file mode 100644 (file)
index 0000000..b2a83b4
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku8_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oo......O+++++OOOXXXo..",
+"..&&&&%%%$$$$oo......OOOOOOOOOXXoo..",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                                    ",
+"                                    "};
diff --git a/interface/big-xpms/wpmoku9.xpm b/interface/big-xpms/wpmoku9.xpm
new file mode 100644 (file)
index 0000000..96a1c49
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wpmoku9_xpm[] = {
+"36 36 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                 ..                 ",
+"                 ..                 ",
+"              XXoooXOX              ",
+"           XoXXXXXXOOOOXO           ",
+"         XoXXXXXXXOOOOOOOXX         ",
+"        XooXXXXXXOOO++++OOXX        ",
+"       XooooXXXXXOO+++++++OOX       ",
+"      XoooooXXXXOO+++@@@@++OOX      ",
+"     XoooooooXXXOO++@@@@@@+++OX     ",
+"    XooooooooXXXOO+@@####@@+++OX    ",
+"    Xooo$ooooXXXOO+@@#####@@++OO    ",
+"   Xooo$$ooooXXXOO+@@#####@@++OOX   ",
+"   oooo$$$ooooXXOO+@@######@++OOO   ",
+"   o$$$$$$ooooXXOO++@#####@@++OOO   ",
+"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  ",
+"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  ",
+"  %%%%%$$$$$oooo....+++@@++++OOXXo  ",
+"..&%%%%%$$$$$oo......O+++++OOOXXXo  ",
+"..&&&&%%%$$$$oo......OOOOOOOOOXXoo  ",
+"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  ",
+"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  ",
+"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  ",
+"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   ",
+"   &&&&&&%%%%$$$$$oooooooooooXXXX   ",
+"   &&&&&&&%%%%$$$$$$oooooooooXXXX   ",
+"    &&&&&&&%%%%%$$$$$ooooooooXXX    ",
+"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    ",
+"     &&&&&&&&%%%%%$$$$$$$$ooXXX     ",
+"      &&&&&&&&%%%%%%%%%$$$ooXX      ",
+"       &&&&&&&&&&%%%%%%%$$ooX       ",
+"        &&&&&&&&&&&%%%%%$$oo        ",
+"         &&&&&&&&&&&%%%%$$o         ",
+"           &&&&&&&&&&%%$%           ",
+"              &&&&&&%%              ",
+"                                    ",
+"                                    "};
diff --git a/interface/gmp.c b/interface/gmp.c
new file mode 100644 (file)
index 0000000..a2e30ee
--- /dev/null
@@ -0,0 +1,853 @@
+/*
+ * src/gmp.h
+ * Copyright (C) 1995-1997 William Shubert.
+ *
+ * You may use this code in any way you wish as long as you retain the
+ *   above copyright notice.
+ *
+ * This is based on David Fotland's Go Modem Protocol Code and the
+ *   "protocol.Z" info file from Bruce Wilcox.  It has been pretty much
+ *   completely rewritten now, though.
+ */
+
+/* Modification by Daniel Bump for GNU Go: I made all GMP messages
+   contingent on gmp_debug. Otherwise this is identical to Bill Shubert's
+   version distributed with GoDummy.
+*/
+
+/* Modified by Paul Pogonyshev on 10.07.2003.
+ * Added support for Simplified GTP.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define  _GMP_C_  1
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef __MINGW32__
+#include <windows.h>
+#include <winsock.h>
+#include <io.h>
+#endif
+
+#ifdef HAVE_WINSOCK_IO_H
+#include <winsock.h>
+#include <io.h>
+#endif
+
+/**********************************************************************
+ * Constants
+ **********************************************************************/
+
+#define  GMP_TIMEOUTRETRIES   60
+#define  GMP_RETRYSECS        1
+#define  SGMP_TIMEOUTRETRIES   9
+#define  SGMP_RETRYSECS       20
+#define  GMP_MAXSENDSQUEUED   16
+
+
+/**********************************************************************
+ * Data types
+ **********************************************************************/
+typedef enum  {
+  cmd_ack, cmd_deny, cmd_reset, cmd_query, cmd_respond, cmd_move,
+  cmd_undo
+} Command;
+
+
+typedef enum  {
+  query_game, query_bufSize, query_protocol, query_stones,
+  query_bTime, query_wTime, query_charSet, query_rules, query_handicap,
+  query_boardSize, query_timeLimit, query_color, query_who,
+  query_max
+} Query;
+
+
+typedef struct Gmp_struct  {
+  int  inFile, outFile;
+  int  boardSize, sizeVerified;
+  int  handicap, handicapVerified;
+  float  komi;
+  int komiVerified;
+  int  chineseRules, rulesVerified;
+  int  iAmWhite, colorVerified;
+  Query  lastQuerySent;
+
+  int  recvSoFar, sendsQueued;
+  int  sendFailures, noResponseSecs;
+  int  waitingHighAck;
+  time_t  lastSendTime;
+  int  myLastSeq, hisLastSeq;
+  unsigned char  recvData[4];
+  unsigned char  sendData[4];
+  struct  {
+    int  cmd, val;
+  } sendsPending[GMP_MAXSENDSQUEUED];
+
+  int  earlyMovePresent;
+  int  earlyMoveX, earlyMoveY;
+
+  int simplified;
+} Gmp;
+
+
+/**********************************************************************
+ * Globals
+ **********************************************************************/
+
+int  gmp_debug = 0;
+static const char  *commandNames[] = {
+  "ACK", "DENY", "RESET", "QUERY", "RESPOND", "MOVE", "UNDO"};
+static const char  *queryNames[] = {
+  "GAME", "BUFFER SIZE", "PROTOCOL", "STONES",
+  "BLACK TIME", "WHITE TIME", "CHAR SET", "RULES", "HANDICAP",
+  "BOARD SIZE", "TIME LIMIT", "COLOR", "WHO"};
+
+
+/**********************************************************************
+ * Forward Declarations
+ **********************************************************************/
+
+/* Get the forward declaration of externally visible functions. */
+#include "gmp.h"
+
+static unsigned char  checksum(unsigned char p[4]);
+static GmpResult  gotQueryResponse(Gmp *ge, int val, const char **err);
+static void  putCommand(Gmp *ge, Command cmd, int val);
+static GmpResult  respond(Gmp *ge, Query query);
+static void  askQuery(Gmp *ge);
+static int  heartbeat(Gmp *ge);
+static GmpResult  getPacket(Gmp *ge, int *out1, int *out2,
+                           const char **error);
+static GmpResult  parsePacket(Gmp *ge, int *out1, int *out2,
+                             const char **error);
+static GmpResult  processCommand(Gmp *ge, Command command, int val,
+                                int *out1, int *out2, const char **error);
+static void  processQ(Gmp *ge);
+
+
+/**********************************************************************
+ * Functions
+ **********************************************************************/
+
+#define  gmp_verified(ge)  \
+  ((ge)->sizeVerified && (ge)->colorVerified && \
+   (ge)->handicapVerified && (ge)->rulesVerified)
+
+
+Gmp  *gmp_create(int inFile, int outFile)  {
+  Gmp  *ge;
+
+  ge = malloc(sizeof(Gmp));
+  ge->inFile = inFile;
+  ge->outFile = outFile;
+
+  ge->boardSize = -1;
+  ge->sizeVerified = 0;
+
+  ge->handicap = -1;
+  ge->handicapVerified = 0;
+
+  ge->komi = 0.0;
+
+  ge->chineseRules = -1;
+  ge->rulesVerified = 0;
+
+  ge->iAmWhite = -1;
+  ge->colorVerified = 0;
+
+  ge->lastQuerySent = 0;
+  
+  ge->recvSoFar = 0;
+  ge->sendsQueued = 0;
+  ge->sendFailures = 0;
+  ge->noResponseSecs = 0;
+  ge->waitingHighAck = 0;
+  ge->lastSendTime = 0;
+  ge->myLastSeq = 0;
+  ge->hisLastSeq = 0;
+
+  ge->earlyMovePresent = 0;
+
+  return(ge);
+}
+
+
+void  gmp_destroy(Gmp *ge)  {
+  free(ge);
+}
+
+
+GmpResult  gmp_check(Gmp *ge, int gsleep, int *out1, int *out2,
+                    const char **error)  {
+  fd_set  readReady;
+  struct timeval  noTime;
+  int  intDummy;
+  const char  *charPtrDummy;
+  GmpResult  result;
+
+  if (out1 == NULL)
+    out1 = &intDummy;
+  if (out2 == NULL)
+    out2 = &intDummy;
+  if (error == NULL)
+    error = &charPtrDummy;
+  if (gmp_verified(ge) && ge->earlyMovePresent) {
+    *out1 = ge->earlyMoveX;
+    *out2 = ge->earlyMoveY;
+    ge->earlyMovePresent = 0;
+    if (gmp_debug) {
+      fprintf(stderr, "GMP: Returning early move.\n");
+    }
+    return(gmp_move);
+  }
+  *out1 = 0;
+  *out2 = 0;
+  *error = NULL;
+  do  {
+    if (time(NULL) != ge->lastSendTime)  {
+      if (!heartbeat(ge))  {
+       *error = "GMP Timeout";
+       return(gmp_err);
+      }
+    }
+    FD_ZERO(&readReady);
+    FD_SET(ge->inFile, &readReady);
+    noTime.tv_usec = 0;
+    if (gsleep)
+      noTime.tv_sec = 1;
+    else
+      noTime.tv_sec = 0;
+    select(ge->inFile + 1, &readReady, NULL, NULL, &noTime);
+    if (!gsleep && !FD_ISSET(ge->inFile, &readReady))
+      return(gmp_nothing);
+    result = getPacket(ge, out1, out2, error);
+  } while (result == gmp_nothing);
+  return(result);
+}
+
+
+static GmpResult  getPacket(Gmp *ge, int *out1, int *out2,
+                           const char **error)  {
+  unsigned char  charsIn[4], c;
+  int  count = 0, cNum;
+  static char  errOut[200];
+
+  count = read(ge->inFile, charsIn, 4 - ge->recvSoFar);
+  if (count <= 0)  {
+    sprintf(errOut, "System error.");
+    *error = errOut;
+    return(gmp_err);
+  }
+
+  for (cNum = 0;  cNum < count;  ++cNum)  {
+    c = charsIn[cNum];
+    if (!ge->recvSoFar)  {
+      /* idle, looking for start of packet */
+      if ((c & 0xfc) == 0)  {  /* start of packet */
+       ge->recvData[0] = c;
+       ge->recvSoFar = 1;
+      } else {
+       if (gmp_debug) {
+         fprintf(stderr, "GMP: Received invalid packet.\n");
+       }
+      }
+    } else  {
+      /* We're in the packet. */
+      if ((c & 0x80) == 0)  {  /* error */
+       if (gmp_debug) {
+         fprintf(stderr, "GMP: Received invalid packet.\n");
+       }
+       ge->recvSoFar = 0;
+       if ((c & 0xfc) == 0)  {
+         ge->recvData[ge->recvSoFar++] = c;
+       }
+      } else  {
+       /* A valid character for in a packet. */
+       ge->recvData[ge->recvSoFar++] = c;
+       if (ge->recvSoFar == 4)  {  /* check for extra bytes */
+         assert(cNum + 1 == count);
+         ge->recvSoFar = 0;
+         if (checksum(ge->recvData) == ge->recvData[1])
+           return(parsePacket(ge, out1, out2, error));
+       }
+      }
+    }
+  }
+  return(gmp_nothing);
+}
+
+
+static unsigned char  checksum(unsigned char p[4])  {
+  unsigned char sum;
+  sum = p[0] + p[2] + p[3];       
+  sum |= 0x80;  /* set sign bit */
+  return(sum);
+}
+
+
+static GmpResult  parsePacket(Gmp *ge, int *out1, int *out2,
+                             const char **error)  {
+  int  seq, ack, val;
+  Command  command;
+  GmpResult  result;
+
+  seq = ge->recvData[0] & 1;
+  ack = (ge->recvData[0] & 2) >> 1;
+  if (ge->recvData[2] & 0x08)  {  /* Not-understood command. */
+    if (gmp_debug) {
+      fprintf(stderr, "GMP: Unknown command byte 0x%x received.\n",
+             (unsigned int) ge->recvData[2]);
+    }
+    return(gmp_nothing);
+  }
+  command = (ge->recvData[2] >> 4) & 7;
+  val = ((ge->recvData[2] & 7) << 7) | (ge->recvData[3] & 0x7f);
+  if (gmp_debug) {
+    if (command == cmd_query) {
+      if (val >= query_max) {
+       if (gmp_debug)
+         fprintf(stderr, "GMP: Read in command: %s unkown value %d\n",
+                 commandNames[command], val);
+      } else {
+       if (gmp_debug)
+         fprintf(stderr, "GMP: Read in command: %s %s\n",
+                 commandNames[command], queryNames[val]);
+      }
+    } else {
+      if (gmp_debug)
+       fprintf(stderr, "GMP: Read in command: %s\n",
+               commandNames[command]);
+    }
+  }
+  if (!ge->waitingHighAck)  {
+    if ((command == cmd_ack) ||  /* An ack.  We don't need an ack now. */
+       (ack != ge->myLastSeq))  {  /* He missed my last message. */
+      if (gmp_debug)
+       fprintf(stderr, "GMP: Unexpected ACK.\n");
+      return(gmp_nothing);
+    } else if (seq == ge->hisLastSeq)  {  /* Seen this one before. */
+      if (gmp_debug)
+       fprintf(stderr, "GMP: Received repeated message.\n");
+      putCommand(ge, cmd_ack, ~0);
+    } else  {
+      ge->hisLastSeq = seq;
+      ge->sendFailures = 0;
+      ge->noResponseSecs = 0;
+      return(processCommand(ge, command, val, out1, out2, error));
+    }
+  } else  {
+    /* Waiting for OK. */
+    if (command == cmd_ack)  {
+      if ((ack != ge->myLastSeq) || (seq != ge->hisLastSeq))  {
+       /* Sequence error. */
+       fprintf(stderr, "Sequence error.\n");
+       return(gmp_nothing);
+      }
+      ge->sendFailures = 0;
+      ge->noResponseSecs = 0;
+      ge->waitingHighAck = 0;
+      if (!gmp_verified(ge)) {
+       askQuery(ge);
+      }
+      processQ(ge);
+    } else if ((command == cmd_reset) && (ge->iAmWhite == -1)) {
+      if (gmp_debug)
+       fprintf(stderr, "gmp/his last seq = %d\n", seq);
+      ge->hisLastSeq = seq;
+      ge->waitingHighAck = 0;
+      return(processCommand(ge, command, val, out1, out2, error));
+    } else if (seq == ge->hisLastSeq)  {
+      /* His command is old. */
+    } else if (ack == ge->myLastSeq)  {
+      ge->sendFailures = 0;
+      ge->noResponseSecs = 0;
+      ge->waitingHighAck = 0;
+      ge->hisLastSeq = seq;
+      result = processCommand(ge, command, val, out1, out2, error);
+      processQ(ge);
+      return(result);
+    } else  {
+      /* Conflict with opponent. */
+      if (gmp_debug)
+       fprintf(stderr, "Sending conflict.\n");
+      ge->myLastSeq = 1 - ge->myLastSeq;
+      ge->waitingHighAck = 0;
+      processQ(ge);
+    }
+  }
+  return(gmp_nothing);
+}
+
+
+static GmpResult  processCommand(Gmp *ge, Command command, int val,
+                                int *out1, int *out2, const char **error)  {
+  int  s, x, y;
+
+  switch(command)  {
+  case cmd_deny:
+    putCommand(ge, cmd_ack, ~0);
+    break;
+  case cmd_query:
+    return(respond(ge, val));
+    break;
+  case cmd_reset:  /* New game. */
+    if (gmp_debug)
+      fprintf(stderr, "GMP: Resetted.  New game.\n");
+    askQuery(ge);
+    return(gmp_reset);
+    break;
+  case cmd_undo:  /* Take back moves. */
+    putCommand(ge, cmd_ack, ~0);
+    *out1 = val;
+    return(gmp_undo);
+    break;
+  case cmd_move:
+    s = val & 0x1ff;
+    if (s == 0)  {
+      x = -1;
+      y = 0;
+    } else if (s == 0x1ff)  {
+      x = -2;
+      y = 0;
+    } else  {
+      --s;
+      x = (s % ge->boardSize);
+      y = ge->boardSize - 1 - (s / ge->boardSize);
+    }
+    putCommand(ge, cmd_ack, ~0);
+    if (x == -1)
+      return(gmp_pass);
+    else  {
+      if (gmp_verified(ge)) {
+       *out1 = x;
+       *out2 = y;
+       return(gmp_move);
+      } else {
+       assert(ge->earlyMovePresent == 0);
+       ge->earlyMovePresent = 1;
+       ge->earlyMoveX = x;
+       ge->earlyMoveY = y;
+       askQuery(ge);
+      }
+    }
+    break;
+  case cmd_respond:
+    return(gotQueryResponse(ge, val, error));
+    break;
+  default:  /* Don't understand command. */
+    putCommand(ge, cmd_deny, 0);
+    break;
+  }
+  return(gmp_nothing);
+}
+
+
+static void  putCommand(Gmp *ge, Command cmd, int val)  {
+  if (ge->waitingHighAck &&
+      (cmd != cmd_ack) && (cmd != cmd_respond) && (cmd != cmd_deny))  {
+    if (ge->sendsQueued < 1024)  {
+      ge->sendsPending[ge->sendsQueued].cmd = cmd;
+      ge->sendsPending[ge->sendsQueued].val = val;
+      ++ge->sendsQueued;
+    } else  {
+      if (gmp_debug)
+       fprintf(stderr, "GMP: Send buffer full.  Catastrophic error.");
+      exit(EXIT_FAILURE);
+    }
+    return;
+  }
+  if ((cmd == cmd_ack) && (ge->sendsQueued))  {
+    ge->waitingHighAck = 0;
+    processQ(ge);
+    return;
+  }
+  if (cmd != cmd_ack)
+    ge->myLastSeq ^= 1;
+  ge->sendData[0] = ge->myLastSeq | (ge->hisLastSeq << 1);
+  ge->sendData[2] = 0x80 | (cmd << 4) | ((val >> 7) & 7);
+  ge->sendData[3] = 0x80 | val;
+  ge->sendData[1] = checksum(ge->sendData);
+  ge->lastSendTime = time(NULL);
+  if (gmp_debug) {
+    if (cmd == cmd_query) 
+      fprintf(stderr, "GMP: Sending command: %s %s\n",
+             commandNames[cmd], queryNames[val]);
+    else
+      fprintf(stderr, "GMP: Sending command: %s\n", commandNames[cmd]);
+  }
+  write(ge->outFile, ge->sendData, 4);
+  ge->waitingHighAck = (cmd != cmd_ack);
+  return;
+}
+
+
+static GmpResult  respond(Gmp *ge, Query query)  {
+  int  response;
+  int  wasVerified;
+
+  wasVerified = gmp_verified(ge);
+  if (query & 0x200)  {
+    /* Do you support this extended query? */
+    response = 0;  /* No. */
+  } else  {
+    ge->waitingHighAck = 1;
+    switch(query)  {
+    case query_game:
+      response = 1;  /* GO */
+      break;
+    case query_rules:
+      if (ge->chineseRules == -1) {
+       response = 0;
+      } else {
+       ge->rulesVerified = 1;
+       if (ge->chineseRules == 1)
+         response = 2;
+       else
+         response = 1;
+      }
+      break;
+    case query_handicap:
+      if (ge->handicap == -1)
+       response = 0;
+      else {
+       ge->handicapVerified = 1;
+       response = ge->handicap;
+       if (response == 0)
+         response = 1;
+      }
+      break;
+    case query_boardSize:
+      if (ge->boardSize == -1) {
+       response = 0;
+      } else {
+       response = ge->boardSize;
+       ge->sizeVerified = 1;
+      }
+      break;
+    case query_color:
+      if (ge->iAmWhite == -1) {
+       response = 0;
+      } else  {
+       ge->colorVerified = 1;
+       if (ge->iAmWhite)
+         response = 1;
+       else
+         response = 2;
+      }
+      break;
+    default:
+      response = 0;
+      break;
+    }    
+  }
+  putCommand(ge, cmd_respond, response);
+  if (!wasVerified && gmp_verified(ge)) {
+    if (gmp_debug)
+      fprintf(stderr, "GMP: New game ready.\n");
+    return(gmp_newGame);
+  } else {
+    return(gmp_nothing);
+  }
+}
+
+
+static void  askQuery(Gmp *ge)  {
+  if (!ge->simplified) {
+    if (!ge->rulesVerified) {
+      ge->lastQuerySent = query_rules;
+    } else if (!ge->sizeVerified) {
+      ge->lastQuerySent = query_boardSize;
+    } else if (!ge->handicapVerified) {
+      ge->lastQuerySent = query_handicap;
+    /*  } else if (!ge->komiVerified) {
+         ge->lastQuerySent = query_komi; query komi is not define in GMP !? */
+    } else {
+      assert(!ge->colorVerified);
+      ge->lastQuerySent = query_color;
+    }
+  }
+  else {
+    if (!ge->colorVerified)
+      ge->lastQuerySent = query_color;
+    else if (!ge->handicapVerified)
+      ge->lastQuerySent = query_handicap;
+  }
+
+  putCommand(ge, cmd_query, ge->lastQuerySent);
+}
+
+
+static GmpResult  gotQueryResponse(Gmp *ge, int val, const char **err)  {
+  static const char  *ruleNames[] = {"Japanese", "Chinese"};
+  static const char  *colorNames[] = {"Black", "White"};
+  static char errOut[200];
+
+  switch(ge->lastQuerySent)  {
+  case query_handicap:
+    if (val <= 1)
+      --val;
+    if (ge->handicap == -1) {
+      if (val == -1) {
+       sprintf(errOut, "Neither player knows what the handicap should be.");
+       *err = errOut;
+       return(gmp_err);
+      } else {
+       ge->handicap = val;
+       ge->handicapVerified = 1;
+      }
+    } else {
+      ge->handicapVerified = 1;
+      if ((val != -1) && (val != ge->handicap))  {
+       sprintf(errOut, "Handicaps do not agree; I want %d, he wants %d.",
+               ge->handicap, val);
+       *err = errOut;
+       return(gmp_err);
+      }
+    }
+    break;
+  case query_boardSize:
+    if (ge->boardSize == -1)  {
+      if (val == 0)  {
+       sprintf(errOut, "Neither player knows what the board size should be.");
+       *err = errOut;
+       return(gmp_err);
+      } else {
+       ge->boardSize = val;
+       ge->sizeVerified = 1;
+      }
+    } else {
+      ge->sizeVerified = 1;
+      if ((val != 0) && (val != ge->boardSize))  {
+       sprintf(errOut, "Board sizes do not agree; I want %d, he wants %d.",
+               ge->boardSize, val);
+       *err = errOut;
+       return(gmp_err);
+      }
+    }
+    break;
+  case query_rules:
+    if (ge->chineseRules == -1) {
+      if (val == 0) {
+       sprintf(errOut, "Neither player knows what rule set to use.");
+       *err = errOut;
+       return(gmp_err);
+      } else {
+       ge->chineseRules = val - 1;
+       ge->rulesVerified = 1;
+      }
+    } else {
+      ge->rulesVerified = 1;
+      if (val != 0)  {
+       if (ge->chineseRules != (val == 2))  {
+         sprintf(errOut, "Rule sets do not agree; I want %s, he wants %s.",
+                 ruleNames[ge->chineseRules], ruleNames[val == 2]);
+         *err = errOut;
+         return(gmp_err);
+       }
+      }
+    }
+    break;
+  case query_color:
+    if (ge->iAmWhite == -1)  {
+      if (val == 0)  {
+       sprintf(errOut, "Neither player knows who is which color.");
+       *err = errOut;
+       return(gmp_err);
+      } else {
+       ge->iAmWhite = !(val == 1);
+       ge->colorVerified = 1;
+      }
+    } else {
+      ge->colorVerified = 1;
+      if (val != 0)  {
+       if (ge->iAmWhite == (val == 1))  {
+         sprintf(errOut, "Colors do not agree; we both want to be %s.",
+                 colorNames[ge->iAmWhite]);
+         *err = errOut;
+         return(gmp_err);
+       }
+      }
+    }
+    break;
+  default:
+    break;
+  }
+  if (!gmp_verified(ge)) {
+    askQuery(ge);
+    return(gmp_nothing);
+  } else {
+    putCommand(ge, cmd_ack, ~0);
+    if (gmp_debug)
+      fprintf(stderr, "GMP: New game ready.\n");
+    return(gmp_newGame);
+  }
+}
+
+
+static int  heartbeat(Gmp *ge)  {
+  Command  cmd;
+  
+  if (ge->waitingHighAck) {
+    if (++ge->noResponseSecs
+       > (ge->simplified ? SGMP_RETRYSECS : GMP_RETRYSECS))  {
+      if (++ge->sendFailures
+         > (ge->simplified ? SGMP_TIMEOUTRETRIES : GMP_TIMEOUTRETRIES))  {
+       return(0);
+      } else  {
+       if (gmp_debug) {
+         cmd = (ge->sendData[2] >> 4) & 7;
+         if (cmd == cmd_query) {
+           if (gmp_debug)
+             fprintf(stderr, "GMP: Sending command: %s %s (retry)\n",
+                     commandNames[cmd],
+                     queryNames[ge->sendData[3] & 0x7f]);
+         }
+         else
+           if (gmp_debug)
+             fprintf(stderr, "GMP: Sending command: %s (retry)\n",
+                     commandNames[cmd]);
+       }
+       write(ge->outFile, ge->sendData, 4);
+      }
+    }
+  }
+  return(1);
+}
+
+
+void  gmp_startGame(Gmp *ge, int size, int handicap, float komi,
+                   int chineseRules, int iAmWhite, int simplified)  {
+  assert((size == -1) || ((size > 1) && (size <= 22)));
+  assert((handicap >= -1) && (handicap <= 27));
+  assert((chineseRules >= -1) && (chineseRules <= 1));
+  assert((iAmWhite >= -1) && (iAmWhite <= 1));
+
+  ge->boardSize = size;
+  ge->sizeVerified = simplified;
+
+  ge->handicap = handicap;
+  ge->handicapVerified = 0;
+
+  ge->komi = komi;
+
+  ge->chineseRules = chineseRules;
+  ge->rulesVerified = simplified;
+
+  ge->iAmWhite = iAmWhite;
+  ge->colorVerified = 0;
+
+  ge->earlyMovePresent = 0;
+
+  ge->simplified = simplified;
+
+  if (iAmWhite != 1) {
+    putCommand(ge, cmd_reset, 0);
+  }
+}
+
+
+void  gmp_sendPass(Gmp *ge)  {
+  int  arg;
+
+  if (ge->iAmWhite)
+    arg = 0x200;
+  else
+    arg = 0;
+  putCommand(ge, cmd_move, arg);
+}
+
+
+void  gmp_sendMove(Gmp *ge, int x, int y)  {
+  int  val;
+
+  val = x + ge->boardSize * (ge->boardSize - 1 - y) + 1;
+  if (ge->iAmWhite)
+    val |= 0x200;
+  putCommand(ge, cmd_move, val);
+}
+
+
+void  gmp_sendUndo(Gmp *ge, int numUndos)  {
+  putCommand(ge, cmd_undo, numUndos);
+}
+
+
+const char  *gmp_resultString(GmpResult result)  {
+  static const char  *names[] = {
+    "Nothing", "Move", "Pass", "Reset", "New game", "Undo", "Error"};
+
+  assert(result <= gmp_err);
+  return(names[result]);
+}
+
+
+int  gmp_size(Gmp *ge)  {
+  return(ge->boardSize);
+}
+
+
+int  gmp_handicap(Gmp *ge)  {
+  return(ge->handicap);
+}
+
+
+float  gmp_komi(Gmp *ge)  {
+  return(ge->komi);
+}
+
+
+int  gmp_chineseRules(Gmp *ge)  {
+  return(ge->chineseRules);
+}
+
+
+int  gmp_iAmWhite(Gmp *ge)  {
+  return(ge->iAmWhite);
+}
+
+
+static void  processQ(Gmp *ge)  {
+  int  i;
+
+  if (!ge->waitingHighAck && ge->sendsQueued)  {
+    putCommand(ge, ge->sendsPending[0].cmd, ge->sendsPending[0].val);
+    --ge->sendsQueued;
+    for (i = 0;  i < ge->sendsQueued;  ++i)  {
+      ge->sendsPending[i] = ge->sendsPending[i + 1];
+    }
+  }
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/gmp.h b/interface/gmp.h
new file mode 100644 (file)
index 0000000..2777b38
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * src/gmp.h
+ * Copyright (C) 1995-1996 William Shubert.
+ *
+ * Parts of this file are taken from "protocol.c", which is covered under
+ *   the copyright notice below.
+ * Any code that is not present in the original "proocol.c" is covered under
+ *   the copyright notice above.
+ */
+/*******************************************************
+  protocol.c 1.00
+  JCGA Go Communication Protocol
+  copyright(c)    Shuji Sunaga   95.7.9
+  original         Standard Go Modem Protocol 1.0
+                   by David Fotland
+ * Permission granted to use this code for any
+ * commercial or noncommercial purposes as long as this
+ * copyright notice is not removed. 
+ * This code was written for Borland C++ 4.0J
+*******************************************************/
+/*
+ * You may use this code in any way you wish as long as you retain the
+ *   above copyright notices.
+ */
+
+/* Modified by Paul Pogonyshev on 10.07.2003.
+ * Added support for Simplified GTP.
+ */
+
+#ifndef  _GMP_H_
+#define  _GMP_H_  1
+
+
+/**********************************************************************
+ * Data types
+ **********************************************************************/
+typedef enum  {
+  gmp_nothing, gmp_move, gmp_pass, gmp_reset, gmp_newGame, gmp_undo, gmp_err
+} GmpResult;
+
+
+#ifndef  _GMP_C_
+typedef struct Gmp_struct  Gmp;
+#endif  /* _GMP_C_ */
+
+
+/**********************************************************************
+ * Fuctions
+ **********************************************************************/
+extern Gmp  *gmp_create(int inFile, int outFile);
+
+extern void  gmp_destroy(Gmp *ge);
+
+/*
+ * This starts a game up.
+ * If you want, you can pass in -1 for size, handicap, and chineseRules,
+ *   and it will query.  You can also pass in -1 for iAmWhite, but if you do
+ *   this then it will send a RESET command.  If the other machine is black
+ *   and doesn't support arbitration, then this could screw things up.
+ * Komi must be specified since GMP doesn't let you exchange komi information.
+ * After calling this function, you should call gmp_check until you get a
+ *   "gmp_newGame" returned.  Then you know that the size, etc. have all been
+ *   verified, you can call "gmp_size()" or whatever to find out values you
+ *   set to -1, and you can start the game.
+ */
+extern void  gmp_startGame(Gmp *ge, int boardsize, int handicap,
+                          float komi, int chineseRules, int iAmWhite,
+                          int simplified);
+
+/*
+ * Pretty self-explanatory set of routines.  For sendMove, (0,0) is the
+ *   corner.
+ */
+extern void  gmp_sendMove(Gmp *ge, int x, int y);
+extern void  gmp_sendPass(Gmp *ge);
+extern void  gmp_sendUndo(Gmp *ge, int numUndos);
+
+/*
+ * gmp_check() process all data queued up until the next command that needs
+ *   to be returned to the application.  If sleep is nonzero, then it will
+ *   stay here until a command arrives.  If sleep is zero, then it will
+ *   return immediately if no command is ready.
+ * It should be called about once per second to prevent the connection
+ *   between the programs from timing out.
+ * If you get a move, "out1" will be the X and "out2" will be the y.
+ */
+extern GmpResult  gmp_check(Gmp *ge, int sleepy,
+                           int *out1, int *out2, const char  **error);
+
+
+/*
+ * These routines return the configuration of the game that you are playing
+ *   in.  They should all be set up by the time you get a gmpResult_newGame
+ *   from gmp_read().
+ * If you get a -1 back from these, it means that you didn't set the value
+ *   when you called gmp_startGame() and your opponent wouldn't say what
+ *   they had the parameter set to.
+ */
+extern int  gmp_size(Gmp *ge);
+extern int  gmp_handicap(Gmp *ge);
+extern float  gmp_komi(Gmp *ge);
+extern int  gmp_chineseRules(Gmp *ge);
+extern int  gmp_iAmWhite(Gmp *ge);
+
+/*
+ * This is handy if you want to print out, as an ascii string, the result
+ *   that you got bock from gmp_read().
+ */
+extern const char  *gmp_resultString(GmpResult result);
+
+#endif  /* _GMP_H_ */
diff --git a/interface/gnugo-big-xpms.el b/interface/gnugo-big-xpms.el
new file mode 100644 (file)
index 0000000..8080a1e
--- /dev/null
@@ -0,0 +1,128 @@
+";;; generated file --- do not edit!
+
+;;; This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+;;; http://www.gnu.org/software/gnugo/ for more information.
+;;;
+;;; Copyright (C) 2003, 2004 by the Free Software Foundation.
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation - version 3
+;;; or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;;; PURPOSE.  See the GNU General Public License in file COPYING
+;;; for more details.
+;;;                        
+;;; You should have received a copy of the GNU General Public
+;;; License along with this program; if not, write to the Free
+;;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;;; Boston, MA 02111, USA.
+
+"(defconst gnugo-xpms
+  (mapcar
+   (lambda
+     (pair)
+     (cons
+      (car pair)
+      (find-image
+       (list
+       (list :type 'xpm :data
+             (cdr pair)
+             :ascent 'center)))))
+   '(((bmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                                    \",\n\"                                    \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"  ....................XXXXX.........\",\n\"  ..................................\",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku2_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                                    \",\n\"                                    \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"......................XXXXX.........\",\n\"....................................\",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku3_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                                    \",\n\"                                    \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"......................XXXXX.......  \",\n\"..................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku4_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"  ....................XXXXX.........\",\n\"  ..................................\",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku5_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"......................XXXXX.........\",\n\"....................................\",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku6_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"......................XXXXX.......  \",\n\"..................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku7_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"  ....................XXXXX.........\",\n\"  ..................................\",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((bmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku8_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"......................XXXXX.........\",\n\"....................................\",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((bmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku9_xpm[] = {\n\"36 36 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ..............XooOOOOooX....    \",\n\"    ..............XooOOOOOooX...    \",\n\"   ...............XooOOOOOooX....   \",\n\"   ...............XooOOOOOOoX....   \",\n\"   ...............XXoOOOOOooX....   \",\n\"  .................XoooOOoooX.....  \",\n\"  .................XXooooooXX.....  \",\n\"  ..................XXXoooXX......  \",\n\"......................XXXXX.......  \",\n\"..................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((bpmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku1_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                                    \",\n\"                                    \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"  .............++++++...............\",\n\"  .............++++++...............\",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bpmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku2_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                                    \",\n\"                                    \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"...............++++++...............\",\n\"...............++++++...............\",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bpmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku3_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                                    \",\n\"                                    \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"...............++++++.............  \",\n\"...............++++++.............  \",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bpmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku4_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"  .............++++++...............\",\n\"  .............++++++...............\",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bpmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku5_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"...............++++++...............\",\n\"...............++++++...............\",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bpmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku6_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"...............++++++.............  \",\n\"...............++++++.............  \",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((bpmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku7_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"  .............++++++...............\",\n\"  .............++++++...............\",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((bpmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku8_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"...............++++++...............\",\n\"...............++++++...............\",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((bpmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bpmoku9_xpm[] = {\n\"36 36 6 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              ........              \",\n\"           ..............           \",\n\"         ..................         \",\n\"        ............XXXX....        \",\n\"       ............XXXXXXX...       \",\n\"      ............XXXooooXX...      \",\n\"     .............XXooooooXX...     \",\n\"    ................XXOOOooX....    \",\n\"    ..................XXOOooX...    \",\n\"   ....................XXOooX....   \",\n\"   .....................XXOoX....   \",\n\"   .....................XXOOX....   \",\n\"  .......................XXOX.....  \",\n\"  ...............++.......XXX.....  \",\n\"  ..............++++..............  \",\n\"...............++++++.............  \",\n\"...............++++++.............  \",\n\"  ..............++++..............  \",\n\"  ...............++...............  \",\n\"  ................................  \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"   ..............................   \",\n\"    ............................    \",\n\"    ............................    \",\n\"     ..........................     \",\n\"      ........................      \",\n\"       ......................       \",\n\"        ....................        \",\n\"         ..................         \",\n\"           ..............           \",\n\"              ........              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((empty . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty1_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                 ...................\",\n\"                 ...................\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((empty . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty1_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"....................................\",\n\"....................................\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((empty . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty3_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"...................                 \",\n\"...................                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((empty . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty4_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ...................\",\n\"                 ...................\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((empty . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty5_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"....................................\",\n\"....................................\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((empty . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty6_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"...................                 \",\n\"...................                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((empty . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty7_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ...................\",\n\"                 ...................\",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \"};\n")
+     ((empty . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty8_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"....................................\",\n\"....................................\",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \"};\n")
+     ((empty . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * empty9_xpm[] = {\n\"36 36 2 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"...................                 \",\n\"...................                 \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \",\n\"                                    \"};\n")
+     ((hoshi . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * hoshi_xpm[] = {\n\"36 36 4 1\",\n\"       c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618565956185\",\n\"o c #9E799A699E79\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                ....                \",\n\"               ......               \",\n\"....................................\",\n\"....................................\",\n\"               ......               \",\n\"                ....                \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku1_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                                    \",\n\"                                    \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"  &%%%%%$$$$$oooXXXOOO+++++OOOXXXo..\",\n\"  &&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku2_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                                    \",\n\"                                    \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo..\",\n\"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku3_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                                    \",\n\"                                    \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo  \",\n\"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo  \",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku4_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"  &%%%%%$$$$$oooXXXOOO+++++OOOXXXo..\",\n\"  &&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo..\",\n\"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku6_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo  \",\n\"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo  \",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku7_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"  &%%%%%$$$$$oooXXXOOO+++++OOOXXXo..\",\n\"  &&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((wmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku8_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo..\",\n\"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((wmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku9_xpm[] = {\n\"36 36 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXXXO++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$ooooXXOO+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oooXXXOOO+++++OOOXXXo  \",\n\"..&&&&%%%$$$$ooooXXXXOOOOOOOOOXXoo  \",\n\"  &&&&%%%%$$$$ooooXXXXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$ooooXXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((wpmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku1_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                                    \",\n\"                                    \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"  &%%%%%$$$$$oo......O+++++OOOXXXo..\",\n\"  &&&&%%%$$$$oo......OOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wpmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku2_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                                    \",\n\"                                    \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oo......O+++++OOOXXXo..\",\n\"..&&&&%%%$$$$oo......OOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wpmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku3_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                                    \",\n\"                                    \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oo......O+++++OOOXXXo  \",\n\"..&&&&%%%$$$$oo......OOOOOOOOOXXoo  \",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wpmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku4_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"  &%%%%%$$$$$oo......O+++++OOOXXXo..\",\n\"  &&&&%%%$$$$oo......OOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wpmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku5_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oo......O+++++OOOXXXo..\",\n\"..&&&&%%%$$$$oo......OOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wpmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku6_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oo......O+++++OOOXXXo  \",\n\"..&&&&%%%$$$$oo......OOOOOOOOOXXoo  \",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                 ..                 \",\n\"                 ..                 \"};\n")
+     ((wpmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku7_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"  &%%%%%$$$$$oo......O+++++OOOXXXo..\",\n\"  &&&&%%%$$$$oo......OOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((wpmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku8_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oo......O+++++OOOXXXo..\",\n\"..&&&&%%%$$$$oo......OOOOOOOOOXXoo..\",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                                    \",\n\"                                    \"};\n")
+     ((wpmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wpmoku9_xpm[] = {\n\"36 36 11 1\",\n\"    c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                 ..                 \",\n\"                 ..                 \",\n\"              XXoooXOX              \",\n\"           XoXXXXXXOOOOXO           \",\n\"         XoXXXXXXXOOOOOOOXX         \",\n\"        XooXXXXXXOOO++++OOXX        \",\n\"       XooooXXXXXOO+++++++OOX       \",\n\"      XoooooXXXXOO+++@@@@++OOX      \",\n\"     XoooooooXXXOO++@@@@@@+++OX     \",\n\"    XooooooooXXXOO+@@####@@+++OX    \",\n\"    Xooo$ooooXXXOO+@@#####@@++OO    \",\n\"   Xooo$$ooooXXXOO+@@#####@@++OOX   \",\n\"   oooo$$$ooooXXOO+@@######@++OOO   \",\n\"   o$$$$$$ooooXXOO++@#####@@++OOO   \",\n\"  %$$$$$$$$ooooXXOO+@@@##@@@++OOXo  \",\n\"  %%%%%$$$$$oooXX..++@@@@@@++OOOXo  \",\n\"  %%%%%$$$$$oooo....+++@@++++OOXXo  \",\n\"..&%%%%%$$$$$oo......O+++++OOOXXXo  \",\n\"..&&&&%%%$$$$oo......OOOOOOOOOXXoo  \",\n\"  &&&&%%%%$$$$oo....XXXOOOOOXXXXoo  \",\n\"  &&&&&%%%$$$$$oo..XXXXXXXXXXXXXoo  \",\n\"  &&&&&&%%%$$$$$oooooXXXXXXXXXXooo  \",\n\"   &&&&&&%%%$$$$$oooooooXXXXXXXXo   \",\n\"   &&&&&&%%%%$$$$$oooooooooooXXXX   \",\n\"   &&&&&&&%%%%$$$$$$oooooooooXXXX   \",\n\"    &&&&&&&%%%%%$$$$$ooooooooXXX    \",\n\"    %&&&&&&%%%%%%$$$$$$$$$oooXXX    \",\n\"     &&&&&&&&%%%%%$$$$$$$$ooXXX     \",\n\"      &&&&&&&&%%%%%%%%%$$$ooXX      \",\n\"       &&&&&&&&&&%%%%%%%$$ooX       \",\n\"        &&&&&&&&&&&%%%%%$$oo        \",\n\"         &&&&&&&&&&&%%%%$$o         \",\n\"           &&&&&&&&&&%%$%           \",\n\"              &&&&&&%%              \",\n\"                                    \",\n\"                                    \"};\n")))
+  "Alist of XPM images suitable for use by gnugo.el.\nKeys are (TYPE . PLACE), where TYPE is one of:\n  bmoku bpmoku empty hoshi wmoku wpmoku\nand PLACE is an integer describing a visible location:\n  1 2 3\n  4 5 6\n  7 8 9.\nThe image values are the result of `find-image'.")
+(provide 'gnugo-xpms)
diff --git a/interface/gnugo-xpms.el b/interface/gnugo-xpms.el
new file mode 100644 (file)
index 0000000..c298fc0
--- /dev/null
@@ -0,0 +1,128 @@
+";;; generated file --- do not edit!
+
+;;; This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+;;; http://www.gnu.org/software/gnugo/ for more information.
+;;;
+;;; Copyright (C) 2003, 2004 by the Free Software Foundation.
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation - version 3
+;;; or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;;; PURPOSE.  See the GNU General Public License in file COPYING
+;;; for more details.
+;;;                        
+;;; You should have received a copy of the GNU General Public
+;;; License along with this program; if not, write to the Free
+;;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;;; Boston, MA 02111, USA.
+
+"(defconst gnugo-xpms
+  (mapcar
+   (lambda
+     (pair)
+     (cons
+      (car pair)
+      (find-image
+       (list
+       (list :type 'xpm :data
+             (cdr pair)
+             :ascent 'center)))))
+   '(((bmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\" .............................\",\n\" .............................\",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................   \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\"..............................\",\n\"..............................\",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\"............................. \",\n\"............................. \",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\" .............................\",\n\" .............................\",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\"..............................\",\n\"..............................\",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\"............................. \",\n\"............................. \",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\" .............................\",\n\" .............................\",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"                              \"};\n\n")
+     ((bmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\"..............................\",\n\"..............................\",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"                              \"};\n\n")
+     ((bmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" ............................ \",\n\" ............................ \",\n\"............................. \",\n\"............................. \",\n\" ............................ \",\n\" ............................ \",\n\" ............................ \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"                              \"};\n\n")
+     ((bpmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\" ...........O++++O............\",\n\" ...........O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bpmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\" ...........O++++O............\",\n\" ...........O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bpmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\"............O++++O........... \",\n\"............O++++O........... \",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bpmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\" ...........O++++O............\",\n\" ...........O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bpmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\"............O++++O............\",\n\"............O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bpmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\"............O++++O........... \",\n\"............O++++O........... \",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((bpmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\" ...........O++++O............\",\n\" ...........O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"                              \"};\n\n")
+     ((bpmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"              ..              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\"............O++++O............\",\n\"............O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"                              \"};\n\n")
+     ((bpmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 6 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"+ c #FFFFFFFFFFFF\",\n\"                              \",\n\"           ........           \",\n\"         ............         \",\n\"       ................       \",\n\"      ..........XXX.....      \",\n\"     ..........XXXXXX....     \",\n\"    ..........XXooooXX....    \",\n\"   ...........XooOOOooX....   \",\n\"   ...........XooOOOoXX....   \",\n\"  ............XoooOoooX.....  \",\n\"  .............XXoooXX......  \",\n\" ...............XXXXX........ \",\n\" .............OO............. \",\n\" ............O++O............ \",\n\" ...........O++++O............\",\n\" ...........O++++O............\",\n\" ............O++O............ \",\n\" .............OO............. \",\n\"  ........................... \",\n\"  ..........................  \",\n\"  ..........................  \",\n\"   ........................   \",\n\"   ........................   \",\n\"    ......................    \",\n\"     ....................     \",\n\"      ..................      \",\n\"       ................       \",\n\"         ............         \",\n\"           ........           \",\n\"              ..              \"};\n\n")
+     ((empty . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"              ................\",\n\"              ................\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((empty . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"..............................\",\n\"..............................\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((empty . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"................              \",\n\"................              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((empty . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ................\",\n\"              ................\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((empty . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"..............................\",\n\"..............................\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((empty . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"................              \",\n\"................              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((empty . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ................\",\n\"              ................\",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \"};\n\n")
+     ((empty . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"..............................\",\n\"..............................\",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \"};\n\n")
+     ((empty . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"................              \",\n\"................              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \",\n\"                              \"};\n\n")
+     ((hoshi . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * bmoku1_xpm[] = {\n\"30 30 5 1\",\n\"      c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #618561856185\",\n\"o c #9E799E799E79\",\n\"O c #CF3CCF3CCF3C\",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"             ....             \",\n\"..............................\",\n\"..............................\",\n\"             ....             \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \",\n\"              ..              \"};\n\n")
+     ((wmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\" &%%%%$$$$oooXXXOOO++++OOOXXo.\",\n\" &&&%%%$$$ooooXXXXOOOOOOOOXoo.\",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\".&%%%%$$$$oooXXXOOO++++OOOXXo.\",\n\".&&&%%%$$$ooooXXXXOOOOOOOOXoo.\",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\".&%%%%$$$$oooXXXOOO++++OOOXXo \",\n\".&&&%%%$$$ooooXXXXOOOOOOOOXoo \",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\" &%%%%$$$$oooXXXOOO++++OOOXXo.\",\n\" &&&%%%$$$ooooXXXXOOOOOOOOXoo.\",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\".&%%%%$$$$oooXXXOOO++++OOOXXo.\",\n\".&&&%%%$$$ooooXXXXOOOOOOOOXoo.\",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\".&%%%%$$$$oooXXXOOO++++OOOXXo \",\n\".&&&%%%$$$ooooXXXXOOOOOOOOXoo \",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\" &%%%%$$$$oooXXXOOO++++OOOXXo.\",\n\" &&&%%%$$$ooooXXXXOOOOOOOOXoo.\",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"                              \"};\n")
+     ((wmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\".&%%%%$$$$oooXXXOOO++++OOOXXo.\",\n\".&&&%%%$$$ooooXXXXOOOOOOOOXoo.\",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"                              \"};\n")
+     ((wmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXXXO++@@@@@++OOXo \",\n\" %%%%$$$$ooooXXOO+++@@+++OXXo \",\n\".&%%%%$$$$oooXXXOOO++++OOOXXo \",\n\".&&&%%%$$$ooooXXXXOOOOOOOOXoo \",\n\" &&&%%%%$$$ooooXXXXXOOOOXXXoo \",\n\" &&&&%%%$$$$ooooXXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"                              \"};\n")
+     ((wpmoku . 1)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\" &%%%%$$$$oo&....&O++++OOOXXo.\",\n\" &&&%%%$$$oo&....&OOOOOOOOXoo.\",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wpmoku . 2)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\".&%%%%$$$$oo&....&O++++OOOXXo.\",\n\".&&&%%%$$$oo&....&OOOOOOOOXoo.\",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wpmoku . 3)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"                              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\".&%%%%$$$$oo&....&O++++OOOXXo \",\n\".&&&%%%$$$oo&....&OOOOOOOOXoo \",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wpmoku . 4)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\" &%%%%$$$$oo&....&O++++OOOXXo.\",\n\" &&&%%%$$$oo&....&OOOOOOOOXoo.\",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wpmoku . 5)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\".&%%%%$$$$oo&....&O++++OOOXXo.\",\n\".&&&%%%$$$oo&....&OOOOOOOOXoo.\",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wpmoku . 6)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\".&%%%%$$$$oo&....&O++++OOOXXo \",\n\".&&&%%%$$$oo&....&OOOOOOOOXoo \",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"              ..              \"};\n")
+     ((wpmoku . 7)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\" &%%%%$$$$oo&....&O++++OOOXXo.\",\n\" &&&%%%$$$oo&....&OOOOOOOOXoo.\",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"                              \"};\n")
+     ((wpmoku . 8)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\".&%%%%$$$$oo&....&O++++OOOXXo.\",\n\".&&&%%%$$$oo&....&OOOOOOOOXoo.\",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"                              \"};\n")
+     ((wpmoku . 9)
+      . "/* XPM */\n/* Copyright 2004 by the Free Software Foundation. See COPYING */\nstatic char * wmoku5_xpm[] = {\n\"30 30 11 1\",\n\"     c #E79DB2CA4924\",\n\". c #000000000000\",\n\"X c #CF3CCF3CCF3C\",\n\"o c #C71BC71BC71B\",\n\"O c #D75CD75CD75C\",\n\"+ c #DF7DDF7DDF7D\",\n\"@ c #E79DE79DE79D\",\n\"# c #EFBEEFBEEFBE\",\n\"$ c #BEFBBEFBBEFB\",\n\"% c #B6DAB6DAB6DA\",\n\"& c #AEBAAEBAAEBA\",\n\"              ..              \",\n\"           XXoooXOX           \",\n\"         oXXXXXXOOOOX         \",\n\"       XoXXXXXXOOOOOOXX       \",\n\"      XooXXXXXOO++++++OX      \",\n\"     XoooXXXXOO+++@@@++OX     \",\n\"    ooooooXXXOO++@@@@@+++O    \",\n\"   XooooooXXXOO+@@###@@+++X   \",\n\"   Xoo$oooXXXOO+@@####@@++O   \",\n\"  ooo$$$oooXXOO+@@#####@++OO  \",\n\"  o$$$$$oooXXOO++@####@@++OO  \",\n\" %$$$$$$$oooXXOO+@@@#@@@++OXo \",\n\" %%%%$$$$oooXX&&++@@@@@++OOXo \",\n\" %%%%$$$$oooo&..&+++@@+++OXXo \",\n\".&%%%%$$$$oo&....&O++++OOOXXo \",\n\".&&&%%%$$$oo&....&OOOOOOOOXoo \",\n\" &&&%%%%$$$oo&..&XXXOOOOXXXoo \",\n\" &&&&%%%$$$$oo&&XXXXXXXXXXXoo \",\n\" &&&&&%%%$$$$oooooXXXXXXXXooo \",\n\"  &&&&&%%$$$$$oooooooXXXXXXo  \",\n\"  &&&&&%%%$$$$$ooooooooooXXX  \",\n\"   &&&&&&%%%%$$$$$oooooooXX   \",\n\"   %&&&&&%%%%%$$$$$$$$oooXX   \",\n\"    &&&&&&%%%%%$$$$$$$ooXX    \",\n\"     &&&&&&%%%%%%%%%$$ooX     \",\n\"      &&&&&&&&%%%%%%%$oo      \",\n\"       &&&&&&&&&&%%%%$o       \",\n\"         &&&&&&&&&%%$         \",\n\"           &&&&&&%%           \",\n\"                              \"};\n")))
+  "Alist of XPM images suitable for use by gnugo.el.\nKeys are (TYPE . PLACE), where TYPE is one of:\n  bmoku bpmoku empty hoshi wmoku wpmoku\nand PLACE is an integer describing a visible location:\n  1 2 3\n  4 5 6\n  7 8 9.\nThe image values are the result of `find-image'.")
+(provide 'gnugo-xpms)
diff --git a/interface/gnugo.dsp b/interface/gnugo.dsp
new file mode 100644 (file)
index 0000000..7e20c80
--- /dev/null
@@ -0,0 +1,186 @@
+# Microsoft Developer Studio Project File - Name="gnugo" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=gnugo - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "gnugo.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "gnugo.mak" CFG="gnugo - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "gnugo - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "gnugo - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I "." /I ".." /I "..\sgf" /I "..\patterns" /I "..\utils" /I "../engine" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /Fr"Release/gnugo/" /Fd"Release/gnugo" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 ..\sgf\Release\sgf.lib ..\engine\Release\engine.lib ..\patterns\Release\patterns.lib ..\utils\Release\utils.lib wsock32.lib ..\patterns\Release\dfa.lib /nologo /subsystem:console /profile /debug /machine:I386 /out:"gnugo.exe"\r
+# SUBTRACT LINK32 /nodefaultlib\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /Zi /Od /I "." /I ".." /I "..\sgf" /I "..\patterns" /I "..\utils" /I "../engine" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FR /Fd"Debug/gnugo" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 ..\patterns\Debug\patterns.lib ..\utils\Debug\utils.lib ..\sgf\Debug\sgf.lib ..\engine\Debug\engine.lib wsock32.lib ..\patterns\Debug\dfa.lib /nologo /subsystem:console /profile /debug /machine:I386 /out:"gnugo.exe"\r
+# SUBTRACT LINK32 /nodefaultlib\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "gnugo - Win32 Release"\r
+# Name "gnugo - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\gmp.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\gtp.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\main.c\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\play_ascii.c\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\play_gmp.c\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\play_gtp.c\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\play_solo.c\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\interface\play_test.c\r
+\r
+!IF  "$(CFG)" == "gnugo - Win32 Release"\r
+\r
+# ADD CPP /YX"gnugo.h"\r
+\r
+!ELSEIF  "$(CFG)" == "gnugo - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/interface/gnugo.el b/interface/gnugo.el
new file mode 100644 (file)
index 0000000..19cb216
--- /dev/null
@@ -0,0 +1,2219 @@
+;;; gnugo.el
+;;;
+;;; This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+;;; http://www.gnu.org/software/gnugo/ for more information.   
+;;;                                                            
+;;; Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007
+;;; and 2008 by the Free Software Foundation.
+;;;                                                            
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation - version 3
+;;; or (at your option) any later version.
+;;;                                                            
+;;; This program is distributed in the hope that it will be    
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied 
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR    
+;;; PURPOSE.  See the GNU General Public License in file COPYING
+;;; for more details.                                          
+;;;                                                            
+;;; You should have received a copy of the GNU General Public
+;;; License along with this program; if not, write to the Free 
+;;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,    
+;;; Boston, MA 02111, USA.
+;;; 
+;;; This Emacs mode for GNU Go may work with Emacs 20.x but
+;;; the graphical display requires Emacs 21.x.
+;;;
+;;; Maintainer: Thien-Thi Nguyen
+;;;
+;;; Rel:standalone-gnugo-el-2-2-8
+;;;
+;;; Description: Run GNU Go in a buffer.
+
+;;; Commentary:
+
+;; Playing
+;; -------
+;;
+;; This file provides the command `gnugo' which allows you to play the game of
+;; go against the external program "gnugo" (http://www.gnu.org/software/gnugo)
+;; in a dedicated Emacs buffer, or to resume a game in progress.  NOTE: In
+;; this file, to avoid confusion w/ elisp vars and funcs, we use the term "GNU
+;; Go" to refer to the process object created by running the external program.
+;;
+;; At the start of a new game, you can pass additional command-line arguments
+;; to GNU Go to specify level, board size, color, komi, handicap, etc.  By
+;; default GNU Go plays at level 10, board size 19, color white, and zero for
+;; both komi and handicap.
+;;
+;; To play a stone, move the cursor to the desired vertice and type `SPC' or
+;; `RET'; to pass, `P' (note: uppercase); to quit, `q'; to undo one of your
+;; moves (as well as a possibly intervening move by GNU Go), `u'.  To undo
+;; back through an arbitrary stone that you played, place the cursor on a
+;; stone and type `U' (note: uppercase).  Other keybindings are described in
+;; the `gnugo-board-mode' documentation, which you may view with the command
+;; `describe-mode' (normally `C-h m') in that buffer.  The buffer name shows
+;; the last move and who is currently to play.  Capture counts and other info
+;; are shown on the mode line immediately following the major mode name.
+;;
+;; While GNU Go is pondering its next move, certain commands that rely on its
+;; assistence will result in a "still waiting" error.  Do not be alarmed; that
+;; is normal.  When it is your turn again you may retry the command.  In the
+;; meantime, you can use Emacs for other tasks, or start an entirely new game
+;; with `C-u M-x gnugo'.  (NOTE: A new game will slow down all games. :-)
+;;
+;; If GNU Go should crash during a game the mode line will show "no process".
+;; Please report the event to the GNU Go maintainers so that they can improve
+;; the program.
+;;
+;; This code was tested with:
+;; - GNU Emacs: 21.3 / 21.3.50 (from CVS)
+;; - GNU Go: 3.3.15 / 3.4 / 3.6-pre3
+;;
+;;
+;; Meta-Playing (aka Customizing)
+;; ------------------------------
+;;
+;; Customization is presently limited to
+;;   vars:                 `gnugo-program'
+;;                         `gnugo-animation-string'
+;;                         `gnugo-mode-line'
+;;                         `gnugo-xpms'
+;;   normal hooks:         `gnugo-board-mode-hook'
+;;                         `gnugo-post-move-hook'
+;;   and the keymap:       `gnugo-board-mode-map'
+;;
+;; The variable `gnugo-xpms' is a special case.  To set it you need to load
+;; gnugo-xpms.el (http://www.emacswiki.org) or some other library w/ congruent
+;; interface.
+;;
+;;
+;; Meta-Meta-Playing (aka Hacking)
+;; -------------------------------
+;;
+;; You may wish to first fix the bugs:
+;; - `gnugo-toggle-dead-group' only half-complete; see docstring for details
+;; - probably sgf handling is not 100% to spec (excuse: written w/o spec!)
+;; - subprocess should provide scoring details, gnugo.el not yet blissful
+;; - no move history and sgf tree re-init in the case of mid-session loadsgf
+;;
+;; Otherwise (we can live w/ some bugs), here are some ideas:
+;; - talk GTP over the network
+;; - "assist minor mode" (see gnugo-extra.el for work in progress)
+;; - using assist minor mode, gnugo-v-gnugo (ibid)
+;; - extract GNU Go Board mode and sgf stuff into sgf.el; make gnugo.el use it
+;; - make gnugo (the external program) support query (read-only) thread
+;;   so as to be able to lift "still waiting" restriction
+;; - alternatively, extend GNU Go Board mode to manage another subprocess
+;;   dedicated to analysis (no genmove)
+;; - command `C' to add a comment to the sgf tree
+;; - command `C-u =' to label a position
+;; - sgf tree display, traversal (belongs in sgf.el); review game history
+;;   in another buffer; branch subgame tree at arbitrary point
+;; - subgame branch matriculation (maturity: child leaves the family)
+;; - dribble the sgf tree
+;; - "undo undo undoing"; integrate Emacs undo, GTP undo, subgame branching
+;; - make buffer name format configurable (but enforce uniqueness)
+;; - more tilde escapes for `gnugo-mode-line'
+;; - make veneration configurable
+;; - make animation more configurable; lift same-color-stones-only
+;;   restriction; allow sequencing rather than lock-step; include sound
+;; - [your hacking ideas here]
+;;
+;; Some gnugo.el hackers update http://www.emacswiki.org -- check it out!
+;;
+;;
+;; History
+;; -------
+;;
+;; Originally gnugo.el was written to interact w/ "gnugo --mode text" and then
+;; "gnugo --mode emacs" as the subprocess.  Those versions were released as
+;; 1.x, w/ x < 14.  In Novemeber 2002, gnugo.el was changed to interact w/
+;; "gnugo --mode gtp", but was released as 1.14 through 1.26, even though the
+;; proper versions should be 2.0.x for "--mode gtp", and 2.1.x for XPM image
+;; support.  (Sorry about the confusion.)
+;;
+;; Thus we arrive at at the current version.  The first gnugo.el to be
+;; released w/ a `gnugo-version' variable is "2.2.0".  The versioning scheme
+;; is strictly monotonically increasing numbers and dots, no letters or other
+;; suffixes (and none of this even/odd crap).  Here we list, aside from the
+;; bugfixes, some of the notable changes introduced in each released version:
+;;
+;; 2.2.x -- uncluttered, letters and numbers hidden, board centered
+;;          buffer name shows last move and current player
+;;          mode-line customization (var `gnugo-mode-line')
+;;          new commands: `=', `h', `s', `F', `R', `l', `U'
+;;          program option customization (var `gnugo-program')
+;;          new hooks (vars `gnugo-post-move-hook', `gnugo-board-mode-hook')
+;;          multiple independent buffers/games
+;;          XPM set can be changed on the fly (global and/or local)
+;;          font-locking for "X", "O", "[xo]"
+;;          undo by N moves, by "move pair", or by board position
+;;
+;;
+;; History Predicted
+;; -----------------
+;;
+;; If you are an elisp programmer, this section might not apply to you;
+;; the GPL allows you to define the future of the code you receive under
+;; its terms, as long as you do not deny that freedom to subsequent users.
+;;
+;; For users who are not elisp programmers, you can look forward to gradual
+;; refinement in 2.x, splitting into gnugo.el and sgf.el in 3.x, and then
+;; eventual merging into GNU Emacs for 4.x (if RMS gives it the thumbs-up).
+;; If it is not accepted into Emacs at that time, a new maintainer will be
+;; sought.  In any case, it will no longer be bundled w/ ttn-pers-elisp.
+
+;;; Code:
+
+(require 'cl)                           ; use the source luke!
+(ignore-errors (require 'time-date))    ; for `time-subtract'
+
+
+;;; ==========================================================================
+
+; Modifications to gnugo.el-2.2.8:
+;
+; * Grid display implemented
+; * SGF handling improved
+; * Undo and Redo related enhancements
+; * Primitive edit mode
+; * Regression view mode
+
+;;;---------------------------------------------------------------------------
+;;; Political arts
+
+(defconst gnugo-version "2.2.8.b5"
+  "Version of gnugo.el currently loaded.
+Note that more than two dots in the value indicates \"pre-release\",
+or \"alpha\" or \"hackers-invited-all-else-beware\"; use at your own risk!
+The more dots the more courage/foolishness you must find to continue.
+See source code for a history of what means what version-wise.")
+
+;;;---------------------------------------------------------------------------
+;;; Variables for the uninquisitive programmer
+
+(defvar gnugo-program "gnugo"
+  "*Command to start an external program that speaks GTP, such as \"gnugo\".
+The value may also be in the form \"PROGRAM OPTIONS...\" in which case the
+the command `gnugo' will prefix OPTIONS in its default offering when it
+queries you for additional options.  It is an error for \"--mode\" to appear
+in OPTIONS.
+
+For more information on GTP and GNU Go, feel free to visit:
+http://www.gnu.org/software/gnugo")
+
+(defvar gnugo-board-mode-map nil
+  "Keymap for GNU Go Board mode.")
+
+(defvar gnugo-board-mode-hook nil
+  "*Hook run when entering GNU Go Board mode.")
+
+(defvar gnugo-post-move-hook nil
+  "*Normal hook run after a move and before the board is refreshed.
+Hook functions can prevent the call to `gnugo-refresh' by evaluating:
+  (setq inhibit-gnugo-refresh t)
+Initially, when `run-hooks' is called, the current buffer is the GNU Go
+Board buffer of the game.  Hook functions that switch buffers must take
+care not to call (directly or indirectly through some other function)
+`gnugo-put' or `gnugo-get' after the switch.")
+
+(defvar gnugo-animation-string
+  (let ((jam "*#") (blink " #") (spin "-\\|/") (yada "*-*!"))
+    (concat jam jam jam jam jam
+            ;; "SECRET MESSAGE HERE"
+            blink blink blink blink blink blink blink blink
+            ;; Playing go is like fighting ignorance: when you think you have
+            ;; surrounded something by knowing it very well it often turns
+            ;; out that in the time you spent deepening this understanding,
+            ;; other areas of ignorance have surrounded you.
+            spin spin spin spin spin spin spin spin spin
+            ;; Playing go is not like fighting ignorance: what one person
+            ;; knows many people may come to know; knowledge does not build
+            ;; solely move by move.  Wisdom, on the other hand...
+            yada yada yada))
+  "*String whose individual characters are used for animation.
+Specifically, the `gnugo-worm-stones' and `gnugo-dragon-stones' commands
+render the stones in their respective (computed) groups as the first
+character in the string, then the next, and so on until the string (and/or
+the viewer) is exhausted.")
+
+(defvar gnugo-mode-line "~b ~w :~m ~n :~u"
+  "*A `mode-line-format'-compliant value for GNU Go Board mode.
+If a single string, the following special escape sequences are
+replaced with their associated information:
+  ~b,~w  black,white captures (a number)
+  ~p     current player (black or white)
+  ~m     move number
+  ~n     size of undo stack
+  ~t     time waiting for the current move
+  ~u     time taken for the Ultimate (most recent) move
+The times are in seconds, or \"-\" if that information is not available.
+For ~t, the value is a snapshot, use `gnugo-refresh' to update it.")
+
+(defvar gnugo-font-lock-keywords
+  '(("X" . font-lock-string-face)
+    ("O" . font-lock-builtin-face))
+  "*Font lock keywords for `gnugo-board-mode'.")
+
+;;;---------------------------------------------------------------------------
+;;; Variables for the inquisitive programmer
+
+(defvar gnugo-option-history nil)
+
+(defvar gnugo-state nil) ; (let ((proc (get-process "gnugo")))
+                         ;   (when proc
+                         ;     (with-current-buffer (process-buffer proc)
+                         ;       (when (hash-table-p gnugo-state)
+                         ;         (let (acc)
+                         ;           (maphash (lambda (&rest args)
+                         ;                      (setq acc (cons args acc)))
+                         ;                    gnugo-state)
+                         ;           (reverse acc))))))
+
+(defvar gnugo-regression-directory nil)
+
+(eval-when-compile
+  (defvar gnugo-xpms nil))
+
+;;;---------------------------------------------------------------------------
+;;; In case Emacs is lacking
+
+(unless (fboundp 'delete-dups)
+  (defun delete-dups (list)             ; from repo 2004-10-29
+    "Destructively remove `equal' duplicates from LIST.
+Store the result in LIST and return it.  LIST must be a proper list.
+Of several `equal' occurrences of an element in LIST, the first
+one is kept."
+    (let ((tail list))
+      (while tail
+        (setcdr tail (delete (car tail) (cdr tail)))
+        (setq tail (cdr tail))))
+    list))
+
+(unless (fboundp 'time-subtract)
+  (defun time-subtract (t1 t2)          ; from repo 2004-10-29
+    "Subtract two time values.
+Return the difference in the format of a time value."
+    (let ((borrow (< (cadr t1) (cadr t2))))
+      (list (- (car t1) (car t2) (if borrow 1 0))
+            (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2))))))
+
+;;;---------------------------------------------------------------------------
+;;; Support functions
+
+(put  'gnugo-put 'lisp-indent-function 1)
+(defun gnugo-put (key value) (puthash key value gnugo-state))
+(defun gnugo-get (key)       (gethash key gnugo-state))
+
+(let ((docs "Put or get move/game/board-specific properties.
+\(This docstring is shared by `gnugo-put' and `gnugo-get'.\)
+
+There are many properties, each named by a keyword, that record and control
+how gnugo.el manages each game.  Each GNU Go Board buffer has its own set
+of properties, stored in the hash table `gnugo-state'.  Here we document
+some of the more stable properties.  You may wish to use them as part of
+a `gnugo-post-move-hook' function, for example.  Be careful to preserve
+the current buffer as `gnugo-state' is made into a buffer-local variable.
+NOTE: In the following, \"see foo\" actually means \"see foo source or
+you may never really understand to any degree of personal satisfaction\".
+
+ :proc -- subprocess named \"gnugo\", \"gnugo<1>\" and so forth
+
+ :diamond -- the part of the subprocess name after \"gnugo\", may be \"\"
+
+ :board-size -- numbers; see `gnugo-board-mode'
+ :handicap
+ :komi
+
+ :game-over -- nil until game over at which time its value is set to
+               the alist `((live GROUP ...) (dead GROUP ...))'
+
+ :sgf-tree -- the (very simple) list of nodes, each node a list of
+              properties of the form `(:XY . VALUE)'; see functions
+              `gnugo-push-move', `gnugo-note' and `gnugo-write-sgf-file'
+ :future-history -- an undo stack (so moves undone may be redone)
+
+ :gnugo-color -- either \"black\" or \"white\"
+ :user-color
+ :last-mover
+
+ :last-waiting  -- seconds and time value, respectively; see `gnugo-push-move'
+ :waiting-start
+
+ :black-captures -- these are strings since gnugo.el doesn't do anything
+ :white-captures    w/ the information besides display it in the mode line;
+                    gory details in functions `gnugo-propertize-board-buffer'
+                    and `gnugo-merge-showboard-results' (almost more effort
+                    than they are worth!)
+
+ :display-using-images -- XPMs, to be precise; see functions `gnugo-yy',
+                          `gnugo-toggle-image-display' and `gnugo-refresh',
+                          as well as gnugo-xpms.el (available elsewhere)
+ :show-grid -- display the grid
+
+ :all-yy -- list of 46 keywords used as the `category' text property
+            (so that their plists, typically w/ property `display' or
+            `do-not-display') are consulted by the Emacs display engine;
+            46 = 9 places * (4 moku + 1 empty) + 1 hoshi; see functions
+            `gnugo-toggle-image-display', `gnugo-yy' and `gnugo-yang'
+
+ :lparen-ov -- overlays shuffled about to indicate the last move; only
+ :rparen-ov    one is used when displaying using images
+
+ :last-user-bpos -- board position; keep the hapless human happy
+
+If you browse the source you will see a form for extracting all the
+properties from `gnugo-state' (even those not documented here).  As
+things stabilize probably more of them will be added to this docstring."))
+  (put 'gnugo-put 'function-documentation docs)
+  (put 'gnugo-get 'function-documentation docs))
+
+(defun gnugo-board-buffer-p (&optional buffer)
+  "Return non-nil if BUFFER is a GNU Go Board buffer."
+  (with-current-buffer (or buffer (current-buffer)) gnugo-state))
+
+(defun gnugo-board-user-play-ok-p (&optional buffer)
+  "Return non-nil if BUFFER is a GNU Go Board buffer ready for a user move."
+  (with-current-buffer (or buffer (current-buffer))
+    (and gnugo-state (not (gnugo-get :waitingp)))))
+
+(defun gnugo-other (color)
+  (if (string= "black" color) "white" "black"))
+
+(defun gnugo-gate (&optional in-progress-p)
+  (unless (gnugo-board-buffer-p)
+    (error "Wrong buffer -- try M-x gnugo"))
+  (unless (gnugo-get :proc)
+    (error "No \"gnugo\" process!"))
+  (when (gnugo-get :waitingp)
+    (error "Not your turn yet -- please wait for \"\(%s to play\)\""
+           (gnugo-get :user-color)))
+  (when (and (gnugo-get :game-over) in-progress-p)
+    (error "Sorry, game over")))
+
+(defun gnugo-sentinel (proc string)
+  (let ((status (process-status proc)))
+    (when (or (eq status 'exit)
+              (eq status 'signal))
+      (let ((buf (process-buffer proc)))
+        (when (buffer-live-p buf)
+          (with-current-buffer buf
+            (setq mode-line-process '( " [%s]"))
+            (when (eq proc (gnugo-get :proc))
+              (gnugo-put :proc nil))))))))
+
+(defun gnugo-send-line (line)
+  (process-send-string (gnugo-get :proc) (concat line "\n")))
+
+(defun gnugo-synchronous-send/return (message)
+  "Return (TIME . STRING) where TIME is that returned by `current-time' and
+STRING omits the two trailing newlines.  See also `gnugo-query'."
+  (when (gnugo-get :waitingp)
+    (error "Sorry, still waiting for %s to play" (gnugo-get :gnugo-color)))
+  (gnugo-put :sync-return "")
+  (let ((proc (gnugo-get :proc)))
+    (set-process-filter
+     proc (lambda (proc string)
+            (let* ((so-far (gnugo-get :sync-return))
+                   (start  (max 0 (- (length so-far) 2))) ; backtrack a little
+                   (full   (gnugo-put :sync-return (concat so-far string))))
+              (when (string-match "\n\n" full start)
+                (gnugo-put :sync-return
+                  (cons (current-time) (substring full 0 -2)))))))
+    (gnugo-send-line message)
+    (let (rv)
+      ;; type change => break
+      (while (stringp (setq rv (gnugo-get :sync-return)))
+        (accept-process-output proc))
+      (gnugo-put :sync-return "")
+      rv)))
+
+(defun gnugo-query (message-format &rest args)
+  "Return cleaned-up value of a call to `gnugo-synchronous-send/return', q.v.
+The TIME portion is omitted as well as the first two characters of the STRING
+portion (corresponding to the status indicator in the Go Text Protocol).  Use
+this function when you are sure the command cannot fail.  The first arg is
+a format string applied to the rest of the args."
+  (substring (cdr (gnugo-synchronous-send/return
+                   (apply 'format message-format args)))
+             2))
+
+(defun gnugo-goto-pos (pos)
+  "Move point to board position POS, a letter-number string."
+  (unless (string= pos "PASS")
+    (goto-char (point-min))
+    (forward-line (- (+ 2 (gnugo-get :board-size))
+                    (string-to-number (substring pos 1))))
+    (forward-char 2)
+    (forward-char (+ (if (= 32 (following-char)) 1 2)
+                    (* 2 (- (let ((letter (aref pos 0)))
+                              (if (> ?I letter)
+                                  letter
+                                (1- letter)))
+                            ?A))))))
+
+(defun gnugo-f (frag)
+  (intern (format ":gnugo-%s%s-props" (gnugo-get :diamond) frag)))
+
+(defun gnugo-yang (c)
+  (case c
+    (?+ 'hoshi)
+    (?. 'empty)
+    (?X '(bmoku . bpmoku))
+    (?O '(wmoku . wpmoku))
+    (t (error "badness"))))
+
+(defun gnugo-yy (yin yang &optional momentaryp)
+  (gnugo-f (format "%d-%s"
+                   yin (cond ((and (consp yang) momentaryp) (cdr yang))
+                             ((consp yang) (car yang))
+                             (t yang)))))
+
+(defun gnugo-toggle-image-display ()
+  (unless (and (fboundp 'display-images-p) (display-images-p))
+    (error "Display does not support images, sorry"))
+  (require 'gnugo-xpms)
+  (unless (and (boundp 'gnugo-xpms) gnugo-xpms)
+    (error "Could not load `gnugo-xpms', sorry"))
+  (let ((fresh (or (gnugo-get :local-xpms) gnugo-xpms)))
+    (unless (eq fresh (gnugo-get :xpms))
+      (gnugo-put :xpms fresh)
+      (gnugo-put :all-yy nil)))
+  (let* ((new (not (gnugo-get :display-using-images)))
+         (act (if new 'display 'do-not-display)))
+    (mapc (lambda (yy)
+            (setcar (symbol-plist yy) act))
+          (or (gnugo-get :all-yy)
+              (gnugo-put :all-yy
+                (prog1 (mapcar (lambda (ent)
+                                 (let* ((k (car ent))
+                                        (yy (gnugo-yy (cdr k) (car k))))
+                                   (setplist yy `(not-yet ,(cdr ent)))
+                                   yy))
+                               (gnugo-get :xpms))
+                  (let ((imul (image-size (get (gnugo-yy 5 (gnugo-yang ?+))
+                                               'not-yet))))
+                    (gnugo-put :w-imul (car imul))
+                    (gnugo-put :h-imul (cdr imul)))))))
+    (setplist (gnugo-f 'ispc) (and new
+                                   ;; `(display (space :width 0))'
+                                   ;; works as well, for newer emacs
+                                   '(invisible t)))
+    (setplist (gnugo-f 'jspc)
+             (and new `(display (space :width ,(- (gnugo-get :w-imul) 1)))))
+    (gnugo-put :highlight-last-move-spec
+      (if new
+          '((lambda (p)
+              (get (gnugo-yy (get-text-property p 'gnugo-yin)
+                             (get-text-property p 'gnugo-yang)
+                             t)
+                   'display))
+            0 delete-overlay)
+        (gnugo-get :default-highlight-last-move-spec)))
+    ;; a kludge to be reworked another time perhaps by another gnugo.el lover
+    (dolist (group (cdr (assq 'dead (gnugo-get :game-over))))
+      (mapc 'delete-overlay (cdar group))
+      (setcdr (car group) nil))
+    (gnugo-put :wmul (if new (gnugo-get :w-imul) 1))
+    (gnugo-put :hmul (if new (gnugo-get :h-imul) 1))
+    (gnugo-put :display-using-images new)))
+
+(defun gnugo-toggle-grid ()
+  "Turn the grid around the board on or off."
+  (interactive)
+  (gnugo-put :show-grid (not (gnugo-get :show-grid)))
+  (gnugo-refresh t))
+
+(defun gnugo-propertize-grid-line (size)
+  (put-text-property (point) (+ 1 (point)) 
+                    'category (gnugo-f 'lpad))
+  (do ((p (+ 4 (point)) (+ 2 p)) (ival 'even (if (eq 'even ival) 'odd 'even)))
+      ((< (+ (* 2 size) 3 (point)) p))
+    (add-text-properties p (1+ p)
+                        `(gnugo-yin
+                          ,5
+                          gnugo-yang
+                          ,'empty
+                          front-sticky
+                          (gnugo-position gnugo-yin)))
+    (add-text-properties (- p 1) p
+                        `(category
+                          ,(gnugo-f 'jspc)
+                          rear-nonsticky
+                          t))
+    (put-text-property (- p 2) p 'intangible ival)))
+
+(defun gnugo-propertize-board-buffer ()
+  (erase-buffer)
+  (insert (substring (cdr (gnugo-synchronous-send/return "showboard")) 3))
+  (let* ((size (gnugo-get :board-size))
+         (size-string (number-to-string size)))
+    (beginning-of-buffer)
+    (insert " \n")
+    (put-text-property (point-min) (+ 1 (point-min)) 'category (gnugo-f 'tpad))
+    (insert " ")
+    (beginning-of-line)
+    (gnugo-propertize-grid-line size)
+    (forward-line 1)
+    (insert " ")
+    (beginning-of-line)
+    (while (looking-at "\\s-*\\([0-9]+\\)[ ]")
+      (let* ((row (match-string-no-properties 1))
+             (edge (match-end 0))
+             (other-edge (+ edge (* 2 size) -1))
+             (top-p (string= size-string row))
+             (bot-p (string= "1" row)))
+        (put-text-property (point) (1+ (point)) 'category (gnugo-f 'lpad))
+        (do ((p edge (+ 2 p)) (ival 'even (if (eq 'even ival) 'odd 'even)))
+            ((< other-edge p))
+          (let* ((position (format "%c%s" (aref [?A ?B ?C ?D ?E ?F ?G ?H
+                                                    ?J ?K ?L ?M ?N ?O ?P
+                                                    ?Q ?R ?S ?T]
+                                                (ash (- p edge) -1))
+                                   row))
+                 (yin (let ((A-p (= edge p))
+                            (Z-p (= (1- other-edge) p)))
+                        (cond ((and top-p A-p) 1)
+                              ((and top-p Z-p) 3)
+                              ((and bot-p A-p) 7)
+                              ((and bot-p Z-p) 9)
+                              (top-p 2)
+                              (bot-p 8)
+                              (A-p 4)
+                              (Z-p 6)
+                              (t 5))))
+                 (yang (gnugo-yang (char-after p))))
+            (add-text-properties p (1+ p)
+                                 `(gnugo-position
+                                   ,position
+                                   gnugo-yin
+                                   ,yin
+                                   gnugo-yang
+                                   ,yang
+                                   category
+                                   ,(gnugo-yy yin yang)
+                                   front-sticky
+                                   (gnugo-position gnugo-yin))))
+          (unless (= (1- other-edge) p)
+            (add-text-properties (1+ p) (+ 2 p)
+                                 `(category
+                                   ,(gnugo-f 'ispc)
+                                   rear-nonsticky
+                                   t))
+            (put-text-property p (+ 2 p) 'intangible ival)))
+        (goto-char (+ other-edge (length row) 1))
+        (when (looking-at "\\s-+\\(WH\\|BL\\).*capt.* \\([0-9]+\\).*$")
+         (kill-line))
+       (unless (gnugo-get :show-grid)
+           (save-excursion
+             (put-text-property (line-beginning-position)
+                                (+ 3 (line-beginning-position))
+                                'invisible t)
+             (put-text-property (+ 3 (* 2 size) (line-beginning-position))
+                                (line-end-position)
+                                'invisible t)
+             (beginning-of-buffer)
+             (forward-line 1)
+             (put-text-property (point) (line-end-position) 'invisible t)
+             (end-of-buffer)
+             (put-text-property 
+              (line-beginning-position) (point) 'invisible t)))
+        (end-of-line)
+        ;(put-text-property other-edge (point) 'category (gnugo-f 'rpad))
+        (forward-char 1)
+       (insert " ")
+       (beginning-of-line)))
+      (gnugo-propertize-grid-line size)))
+
+(defun gnugo-merge-showboard-results ()
+  (let ((aft (substring (cdr (gnugo-synchronous-send/return "showboard")) 3))
+        (adj 1)                         ; string to buffer position adjustment
+        (sync "[0-9]+ stones$")
+        (bef (buffer-substring-no-properties (point-min) (point-max)))
+        (bef-start 0) (bef-idx 0)
+        (aft-start 0) (aft-idx 0)
+        aft-sync-backtrack mis inc cut new very-strange)
+    (while (numberp (setq mis (compare-strings bef bef-start nil
+                                               aft aft-start nil)))
+      (setq aft-sync-backtrack nil
+            inc (if (> 0 mis)
+                    (- (+ 1 mis))
+                  (- mis 1))
+            bef-idx (+ bef-start inc)
+            aft-idx (+ aft-start inc)
+            bef-start (if (eq bef-idx (string-match sync bef bef-idx))
+                          (match-end 0)
+                        (1+ bef-idx))
+            aft-start (if (and (eq aft-idx (string-match sync aft aft-idx))
+                               (let ((peek (1- aft-idx)))
+                                 (while (not (= 32 (aref aft peek)))
+                                   (setq peek (1- peek)))
+                                 (setq aft-sync-backtrack (1+ peek))))
+                          (match-end 0)
+                        (1+ aft-idx))
+            cut (+ bef-idx adj
+                   (if aft-sync-backtrack
+                       (- aft-sync-backtrack aft-idx)
+                     0)))
+      (goto-char cut)
+      (if aft-sync-backtrack
+          (let* ((asb aft-sync-backtrack)
+                 (old-len (let ((look (1+ cut))) ; fields are weird
+                            (- (field-end look) (field-beginning look))))
+                 (keep (text-properties-at cut)))
+            (setq new (substring aft asb (string-match " " aft asb)))
+            (gnugo-put (get-text-property cut 'field) new)
+            (delete-char old-len)
+            (insert (apply 'propertize new keep))
+            (setq adj (+ adj (- (length new) old-len))))
+        (setq new (aref aft aft-idx))
+        (insert-and-inherit (char-to-string new))
+        (let ((yin (get-text-property cut 'gnugo-yin))
+              (yang (gnugo-yang new)))
+          (add-text-properties cut (1+ cut)
+                               `(gnugo-yang
+                                 ,yang
+                                 category
+                                 ,(gnugo-yy yin yang))))
+        (delete-char 1)
+        ;; do this last to avoid complications w/ font lock
+        ;; (this also means we cannot include `intangible' in `front-sticky')
+        (when (setq very-strange (get-text-property (1+ cut) 'intangible))
+          (put-text-property cut (1+ cut) 'intangible very-strange))))))
+
+(defun gnugo-sgf-to-gtp (cc) 
+  "Convert board locations from the format used by sgf to the format used by gtp."
+  (interactive)
+  (if (string= "tt" cc)
+      "PASS"
+    (let ((col (aref cc 0)))
+      (format "%c%d"
+             (+ ?A (- (if (> ?i col) col (1+ col)) ?a))
+             (- (gnugo-get :board-size) (- (aref cc 1) ?a))))))
+
+(defun gnugo-gtp-to-sgf (value)
+  "Convert board locations from the format used by gtp to the format used by sgf."
+  (interactive)
+  (if (string= "PASS" value)
+      "tt"
+    (let* ((col (aref value 0))
+          (one (+ ?a (- (if (< ?H col) (1- col) col) ?A)))
+          (two (+ ?a (- (gnugo-get :board-size) 
+                        (string-to-number (substring value 1))))))
+      (format "%c%c" one two))))
+
+(defun gnugo-move-history (&optional rsel)
+  "Determine and return the game's move history.
+Optional arg RSEL controls side effects and return value.
+If nil, display the history in the echo area as \"(N moves)\"
+followed by the space-separated list of moves.  When called
+interactively with a prefix arg (i.e., RSEL is `(4)'), display
+similarly, but prefix with the mover (either \"B:\" or \"W:\").
+If RSEL is the symbol `car' return the most-recent move; if
+`cadr', the next-to-most-recent move.
+
+For all other values of RSEL, do nothing and return nil."
+  (interactive "P")
+  (let ((size (gnugo-get :board-size))
+        col
+        (sgf (gnugo-get :sgf-tree))
+        acc node mprop move)
+    (flet ((as-pos (cc) (if (string= "tt" cc)
+                            "PASS"
+                          (setq col (aref cc 0))
+                          (format "%c%d"
+                                  (+ ?A (- (if (> ?i col) col (1+ col)) ?a))
+                                  (- size (- (aref cc 1) ?a)))))
+           (next (propp) (when (setq node (car sgf)
+                                     mprop (or (assq :B node)
+                                               (assq :W node))
+                                     move (cdr mprop))
+                           (setq move (as-pos move)
+                                 sgf (cdr sgf))
+                           (push (if propp
+                                     (propertize move :by (case (car mprop)
+                                                            (:B "black")
+                                                            (:W "white")))
+                                   move)
+                                 acc))))
+      (cond
+       ((not rsel)
+        (while (next nil))
+        (message "(%d moves) %s"
+                 (length acc)
+                 (mapconcat 'identity (nreverse acc) " ")))
+       ((equal '(4) rsel)
+        (while (next t))
+        (message "(%d moves) %s"
+                 (length acc)
+                 (mapconcat (lambda (x)
+                              (format "%s:%s"
+                                      (upcase
+                                       (substring
+                                        (get-text-property 0 :by x)
+                                        0 1))
+                                      x))
+                            (nreverse acc) " ")))
+       ((eq 'car rsel)
+        (car (next nil)))
+       ((eq 'cadr rsel)
+        (next nil)
+        (car (next nil)))))))
+
+(defun gnugo-note (property value &optional new mogrifyp)
+  (when mogrifyp
+    (setq value
+          ;; todo: write sgf.el; call to it here
+          (if (string= "PASS" value)
+              "tt"
+            (let* ((col (aref value 0))
+                   (one (+ ?a (- (if (< ?H col) (1- col) col) ?A)))
+                   (two (+ ?a (- (gnugo-get :board-size)
+                                 (string-to-number (substring value 1))))))
+              (format "%c%c" one two)))))
+  (let ((tree (gnugo-get :sgf-tree))
+        (pair (cons property value)))
+    (gnugo-put :sgf-tree
+      (if new
+          (cons (list pair) tree)
+        (cons (cons pair (car tree)) (cdr tree))))))
+
+(defun gnugo-push-move (userp move)
+  (let* ((color (gnugo-get (if userp :user-color :gnugo-color)))
+         (start (gnugo-get :waiting-start))
+         (now (current-time))
+         (resignp (string= "resign" move))
+         (passp (string= "PASS" move))
+         (head (gnugo-move-history 'car))
+         (onep (and head (string= "PASS" head)))
+         (donep (or resignp (and onep passp))))
+;    (unless passp
+;      (gnugo-merge-showboard-results))
+    (gnugo-put :last-mover color)
+    (when userp
+      (gnugo-put :last-user-bpos (and (not passp) (not resignp) move)))
+    (gnugo-put :future-history nil)
+    (gnugo-note (if (string= "black" color) :B :W) move t (not resignp))
+    (when resignp
+      (gnugo-note :EV "resignation"))
+    (when start
+      (gnugo-put :last-waiting (cadr (time-subtract now start))))
+    (when donep
+      (gnugo-put :game-end-time now)
+      (gnugo-put :scoring-seed (logior (ash (logand (car now) 255) 16)
+                                       (cadr now)))
+      (gnugo-put :game-over
+        (if resignp
+            (flet ((ls (color) (mapcar
+                                (lambda (x)
+                                  (cons (list color)
+                                        (split-string x)))
+                                (split-string
+                                 (gnugo-query "worm_stones %s"
+                                              color)
+                                 "\n"))))
+              (let ((live (append (ls "black") (ls "white"))))
+                `((live ,@live)
+                  (dead))))
+          (let ((dd (gnugo-query "dragon_data"))
+                (start 0) mem color ent live dead)
+            (while (string-match "\\(.+\\):\n[^ ]+[ ]+\\(black\\|white\\)\n"
+                                 dd start)
+              (setq mem (match-string 1 dd)
+                    color (match-string 2 dd)
+                    start (match-end 0)
+                    ent (cons (list color)
+                              (sort (split-string
+                                     (gnugo-query "dragon_stones %s" mem))
+                                    'string<)))
+              (string-match "\nstatus[ ]+\\(\\(ALIVE\\)\\|[A-Z]+\\)\n"
+                            dd start)
+              (if (match-string 2 dd)
+                  (push ent live)
+                (push ent dead))
+              (setq start (match-end 0)))
+            `((live ,@live)
+              (dead ,@dead))))))
+    (gnugo-put :waiting-start (and (not donep) now))
+    (gnugo-put :black-captures (gnugo-query "captures black"))
+    (gnugo-put :white-captures (gnugo-query "captures white"))
+    (gnugo-refresh t)
+    donep))
+
+(defun gnugo-toggle-edit-mode ()
+  "Toggle :edit-mode. When true, GNU Go is not called to generate moves."
+  (interactive)
+  (gnugo-put :edit-mode (not (gnugo-get :edit-mode)))
+  (if (gnugo-get :edit-mode)
+      (setq mode-name "Editing SGF File")
+    (setq mode-name "Playing GNU Go"))
+  (gnugo-refresh))
+
+(defun gnugo-venerate (yin yang)
+  (let* ((fg-yy (gnugo-yy yin yang))
+         (fg-disp (or (get fg-yy 'display)
+                      (get fg-yy 'do-not-display)))
+         (fg-data (plist-get (cdr fg-disp) :data))
+         (bg-yy (gnugo-yy yin (gnugo-yang ?.)))
+         (bg-disp (or (get bg-yy 'display)
+                      (get bg-yy 'do-not-display)))
+         (bg-data (plist-get (cdr bg-disp) :data))
+         (bop (lambda (s)
+                (let* ((start 0)
+                       (ncolors
+                        (when (string-match "\\([0-9]+\\)\\s-+[0-9]+\"," s)
+                          (setq start (match-end 0))
+                          (string-to-number (match-string 1 s)))))
+                  (while (and (<= 0 ncolors) (string-match ",\n" s start))
+                    (setq start (match-end 0)
+                          ncolors (1- ncolors)))
+                  (string-match "\"" s start)
+                  (match-end 0))))
+         (new (copy-sequence fg-data))
+         (lx (length fg-data))
+         (lb (length bg-data))
+         (sx (funcall bop fg-data))
+         (sb (funcall bop bg-data))
+         (color-key (aref new sx)))     ; blech, heuristic
+    (while (< sx lx)
+      (when (and (not (= color-key (aref new sx)))
+                 (< 0 (random 4)))
+        (aset new sx (aref bg-data sb)))
+      (incf sx)
+      (incf sb))
+    (create-image new 'xpm t :ascent 'center)))
+
+(defun gnugo-refresh (&optional nocache)
+  "Update GNU Go Board buffer display.
+While a game is in progress, parenthesize the last-played stone (no parens
+for pass).  If the buffer is currently displayed in the selected window,
+recenter the board (presuming there is extra space in the window).  Update
+the mode line.  Lastly, move point to the last position played by the user,
+if that move was not a pass.
+
+Prefix arg NOCACHE requests complete reconstruction of the display, which may
+be slow.  (This should normally be unnecessary; specify it only if the display
+seems corrupted.)  NOCACHE is silently ignored when GNU Go is thinking about
+its move."
+  (interactive "P")
+  (when (and nocache (not (gnugo-get :waitingp)))
+    (gnugo-propertize-board-buffer))
+  (let* ((last-mover (gnugo-get :last-mover))
+         (other (gnugo-other last-mover))
+         (move (gnugo-move-history 'car))
+         (game-over (gnugo-get :game-over))
+         window last)
+    ;; last move
+    (when move
+      (let ((l-ov (gnugo-get :lparen-ov))
+            (r-ov (gnugo-get :rparen-ov)))
+        (if (member move '("PASS" "resign"))
+            (mapc 'delete-overlay (list l-ov r-ov))
+          (gnugo-goto-pos move)
+          (let* ((p (point))
+                 (hspec (gnugo-get :highlight-last-move-spec))
+                 (display-value (nth 0 hspec))
+                 (l-offset (nth 1 hspec))
+                 (l-new-pos (+ p l-offset))
+                 (r-action (nth 2 hspec)))
+            (overlay-put l-ov 'display
+                         (if (functionp display-value)
+                             (funcall display-value p)
+                           display-value))
+            (move-overlay l-ov l-new-pos (1+ l-new-pos))
+            (if r-action
+                (funcall r-action r-ov)
+              (move-overlay r-ov (+ l-new-pos 2) (+ l-new-pos 3)))))))
+    ;; buffer name
+    (rename-buffer (concat (gnugo-get :diamond)
+                           (if game-over
+                               (format "%s(game over)"
+                                       (if (string= move "resign")
+                                           (concat move "ation ")
+                                         ""))
+                             (format "%s(%s to play)"
+                                     (if move (concat move " ") "")
+                                     other))))
+    ;; pall of death
+    (when game-over
+      (let ((live (cdr (assq 'live game-over)))
+            (dead (cdr (assq 'dead game-over)))
+            p pall)
+        (unless (eq game-over (get-text-property 1 'game-over))
+          (dolist (group (append live dead))
+            (dolist (pos (cdr group))
+              (gnugo-goto-pos pos)
+              (setq p (point))
+              (put-text-property p (1+ p) 'group group)))
+          (put-text-property 1 2 'game-over game-over))
+        (dolist (group live)
+          (when (setq pall (cdar group))
+            (mapc 'delete-overlay pall)
+            (setcdr (car group) nil)))
+        (dolist (group dead)
+          (unless (cdar group)
+            (let (ov pall c (color (caar group)))
+              (setq c (if (string= "black" color) "x" "o"))
+              (dolist (pos (cdr group))
+                (gnugo-goto-pos pos)
+                (setq p (point) ov (make-overlay p (1+ p)))
+                (overlay-put
+                 ov 'display
+                 (if (gnugo-get :display-using-images)
+                     ;; respect the dead individually; it takes more time
+                     ;; but that's not a problem (for them)
+                     (gnugo-venerate (get-text-property p 'gnugo-yin)
+                                     (gnugo-yang (aref (upcase c) 0)))
+                   (propertize c 'face 'font-lock-warning-face)))
+                (push ov pall))
+              (setcdr (car group) pall))))))
+    ;; window update
+    (when (setq window (get-buffer-window (current-buffer)))
+      (let* ((size (gnugo-get :board-size))
+             (h (ash (- (window-height window)
+                        (round (* size (gnugo-get :hmul)))
+                        1)
+                     -5))
+             (edges (window-edges window))
+             (right-w-edge (nth 2 edges))
+             (avail-width (- right-w-edge (nth 0 edges)))
+             (w (/ (- avail-width
+                      (+ (* size (gnugo-get :wmul))
+                         (if (symbol-plist (gnugo-f 'ispc))
+                             0
+                           (1- size)))
+                      8)
+                   2.0)))
+        (dolist (pair `((tpad . ,(if (and h (< 0 h))
+                                     `(display ,(make-string h 10))
+                                   '(invisible t)))
+                        (lpad . ,(if (< 0 w)
+                                     `(display (space :align-to ,w))
+                                   '(invisible t)))
+                        (rpad . (display
+                                 (space :align-to ,(1- avail-width))))))
+          (setplist (gnugo-f (car pair)) (cdr pair)))))
+    ;; mode line update
+    (let ((cur (gnugo-get :mode-line)))
+      (unless (equal cur gnugo-mode-line)
+        (setq cur gnugo-mode-line)
+        (gnugo-put :mode-line cur)
+        (gnugo-put :mode-line-form
+          (cond ((stringp cur)
+                 (setq cur (copy-sequence cur))
+                 (let (acc cut c)
+                   (while (setq cut (string-match "~[bwmnptu]" cur))
+                     (aset cur cut ?%)
+                     (setq cut (1+ cut) c (aref cur cut))
+                     (aset cur cut ?s)
+                     (push
+                      `(,(intern (format "squig-%c" c))
+                        ,(case c
+                           (?b '(or (gnugo-get :black-captures) 0))
+                           (?w '(or (gnugo-get :white-captures) 0))
+                           (?m '(length (cdr (gnugo-get :sgf-tree))))
+                           (?n '(length (gnugo-get :future-history)))
+                           (?p '(gnugo-other (gnugo-get :last-mover)))
+                           (?t '(let ((ws (gnugo-get :waiting-start)))
+                                  (if ws
+                                      (cadr (time-since ws))
+                                    "-")))
+                           (?u '(or (gnugo-get :last-waiting) "-"))))
+                      acc))
+                   `(let ,(delete-dups (copy-sequence acc))
+                      (format ,cur ,@(reverse (mapcar 'car acc))))))
+                (t cur))))
+      (let ((form (gnugo-get :mode-line-form)))
+        (setq mode-line-process
+              (and form
+                   ;; this dynamicism is nice but excessive in its wantonness
+                   ;;- `(" [" (:eval ,form) "]")
+                   ;; this dynamicism is ok because the user triggers it
+                   (list (format " [%s]" (eval form))))))
+      (force-mode-line-update))
+    ;; last user move
+    (when (setq last (gnugo-get :last-user-bpos))
+      (gnugo-goto-pos last))))
+
+;;;---------------------------------------------------------------------------
+;;; Game play actions
+
+(defun gnugo-get-move-insertion-filter (proc string)
+  (with-current-buffer (process-buffer proc)
+    (let* ((so-far (gnugo-get :get-move-string))
+           (full   (gnugo-put :get-move-string (concat so-far string))))
+      (when (string-match "^= \\(.+\\)\n\n" full)
+        (let ((pos-or-pass (match-string 1 full)))
+          (gnugo-put :get-move-string nil)
+          (gnugo-put :waitingp nil)
+          (gnugo-push-move nil pos-or-pass)
+          (let ((buf (current-buffer)))
+            (let (inhibit-gnugo-refresh)
+              (run-hooks 'gnugo-post-move-hook)
+              (unless inhibit-gnugo-refresh
+                (with-current-buffer buf
+                  (gnugo-refresh))))))))))
+
+(defun gnugo-get-move (color)
+  (gnugo-put :waitingp t)
+  (set-process-filter (gnugo-get :proc) 'gnugo-get-move-insertion-filter)
+  (gnugo-send-line (concat "genmove " color))
+  (accept-process-output))
+
+(defun gnugo-cleanup ()
+  (when (gnugo-board-buffer-p)
+    (unless (= 0 (buffer-size))
+      (message "Thank you for playing GNU Go."))
+    (mapc (lambda (sym)
+            (setplist sym nil)          ; "...is next to fordliness." --Huxley
+            (unintern sym))
+          (append (gnugo-get :all-yy)
+                  (mapcar 'gnugo-f
+                          '(anim
+                            tpad
+                            lpad
+                            rpad
+                            ispc
+                            jspc))))
+    (setq gnugo-state nil)))
+
+(defun gnugo-position ()
+  (or (get-text-property (point) 'gnugo-position)
+      (error "Not a proper position point")))
+
+(defun gnugo-move ()
+  "Make a move on the GNU Go Board buffer.
+The position is computed from current point.
+Signal error if done out-of-turn or if game-over.
+To start a game try M-x gnugo."
+  (interactive)
+  (gnugo-gate t)
+  (let* ((buf (current-buffer))
+         (pos (gnugo-position))
+         (move (format "play %s %s" (gnugo-get :user-color) pos))
+         (accept (cdr (gnugo-synchronous-send/return move))))
+    (unless (= ?= (aref accept 0))
+      (error accept))
+    (gnugo-push-move t pos)             ; value always nil for non-pass move
+    (let (inhibit-gnugo-refresh)
+      (run-hooks 'gnugo-post-move-hook)
+      (unless inhibit-gnugo-refresh
+        (with-current-buffer buf
+          (gnugo-refresh))))
+    (if (not (gnugo-get :edit-mode))
+       (with-current-buffer buf
+         (gnugo-get-move (gnugo-get :gnugo-color)))
+      (progn
+       (gnugo-put :user-color (gnugo-other (gnugo-get :user-color)))
+       (gnugo-put :gnugo-color (gnugo-other (gnugo-get :gnugo-color)))))))
+
+(defun gnugo-mouse-move (e)
+  "Do `gnugo-move' at mouse location."
+  (interactive "@e")
+  (mouse-set-point e)
+  (when (looking-at "[.+]")
+    (gnugo-move)))
+
+(defun gnugo-pass ()
+  "Make a pass on the GNU Go Board buffer.
+Signal error if done out-of-turn or if game-over.
+To start a game try M-x gnugo."
+  (interactive)
+  (gnugo-gate t)
+  (let ((accept (cdr (gnugo-synchronous-send/return
+                      (format "play %s PASS" (gnugo-get :user-color))))))
+    (unless (= ?= (aref accept 0))
+      (error accept)))
+  (let ((donep (gnugo-push-move t "PASS"))
+        (buf (current-buffer)))
+    (let (inhibit-gnugo-refresh)
+      (run-hooks 'gnugo-post-move-hook)
+      (unless inhibit-gnugo-refresh
+        (with-current-buffer buf
+          (gnugo-refresh))))
+    (unless donep
+      (with-current-buffer buf
+        (gnugo-get-move (gnugo-get :gnugo-color))))))
+
+(defun gnugo-mouse-pass (e)
+  "Do `gnugo-pass' at mouse location."
+  (interactive "@e")
+  (mouse-set-point e)
+  (gnugo-pass))
+
+(defun gnugo-resign ()
+  (interactive)
+  (gnugo-gate t)
+  (if (not (y-or-n-p "Resign? "))
+      (message "(not resigning)")
+    (gnugo-push-move t "resign")
+    (gnugo-refresh)))
+
+(defun gnugo-animate-group (command)
+  (message "Computing %s ..." command)
+  (let ((stones (cdr (gnugo-synchronous-send/return
+                      (format "%s %s" command (gnugo-position))))))
+    (unless (= ?= (aref stones 0))
+      (error stones))
+    (setq stones (split-string (substring stones 1)))
+    (message "Computing %s ... %s in group." command (length stones))
+    (setplist (gnugo-f 'anim) nil)
+    (let* ((spec (let ((spec
+                        ;; `(split-string gnugo-animation-string "" t)'
+                        ;; works as well, for newer emacs versions
+                        (delete "" (split-string gnugo-animation-string ""))))
+                   (cond ((gnugo-get :display-using-images)
+                          (let* ((yin (get-text-property (point) 'gnugo-yin))
+                                 (yang (gnugo-yang (char-after)))
+                                 (up (get (gnugo-yy yin yang t) 'display))
+                                 (dn (get (gnugo-yy yin yang) 'display))
+                                 flip-flop)
+                            (mapcar (lambda (c)
+                                      (if (setq flip-flop (not flip-flop))
+                                          dn up))
+                                    (mapcar 'string-to-char spec))))
+                         (t spec))))
+           (cell (list spec))
+           (ovs (save-excursion
+                  (mapcar (lambda (pos)
+                            (gnugo-goto-pos pos)
+                            (let* ((p (point))
+                                   (ov (make-overlay p (1+ p))))
+                              (overlay-put ov 'category (gnugo-f 'anim))
+                              (overlay-put ov 'priority most-positive-fixnum)
+                              ov))
+                          stones))))
+      (setplist (gnugo-f 'anim) (cons 'display cell))
+      (while (and (cdr spec)            ; let last linger lest levity lost
+                  (sit-for 0.08675309)) ; jenny jenny i got your number...
+        (setcar cell (setq spec (cdr spec)))
+        (set-buffer-modified-p t))
+      (sit-for 5)
+      (mapc 'delete-overlay ovs)
+      t)))
+
+(defun gnugo-display-group-data (command buffer-name)
+  (message "Computing %s ..." command)
+  (let ((data (cdr (gnugo-synchronous-send/return
+                    (format "%s %s" command (gnugo-position))))))
+    (switch-to-buffer buffer-name)
+    (erase-buffer)
+    (insert data))
+  (message "Computing %s ... done." command))
+
+(defun gnugo-worm-stones ()
+  "In the GNU Go Board buffer, animate \"worm\" at current position.
+Signal error if done out-of-turn or if game-over.
+See variable `gnugo-animation-string' for customization."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-animate-group "worm_stones"))
+
+(defun gnugo-worm-data ()
+  "Display in another buffer data from \"worm\" at current position.
+Signal error if done out-of-turn or if game-over."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-display-group-data "worm_data" "*gnugo worm data*"))
+
+(defun gnugo-dragon-stones ()
+  "In the GNU Go Board buffer, animate \"dragon\" at current position.
+Signal error if done out-of-turn or if game-over.
+See variable `gnugo-animation-string' for customization."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-animate-group "dragon_stones"))
+
+(defun gnugo-dragon-data ()
+  "Display in another buffer data from \"dragon\" at current position.
+Signal error if done out-of-turn or if game-over."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-display-group-data "dragon_data" "*gnugo dragon data*"))
+
+(defun gnugo-toggle-dead-group ()
+  "In a GNU Go Board buffer, during game-over, toggle a group as dead.
+The group is selected from current position (point).  Signal error if
+not in game-over or if there is no group at that position.
+
+In the context of GNU Go, a group is called a \"dragon\" and may be
+composed of more than one \"worm\" (set of directly-connected stones).
+It is unclear to the gnugo.el author whether or not GNU Go supports
+ - considering worms as groups in their own right; and
+ - toggling group aliveness via GTP.
+Due to these uncertainties, this command is only half complete; the
+changes you may see in Emacs are not propagated to the gnugo subprocess.
+Thus, GTP commands like `final_score' may give unexpected results.
+
+If you are able to expose via GTP `change_dragon_status' in utils.c,
+you may consider modifying the `gnugo-toggle-dead-group' source code
+to enable full functionality."
+  (interactive)
+  (let ((game-over (or (gnugo-get :game-over)
+                       (error "Sorry, game still in play")))
+        (group (or (get-text-property (point) 'group)
+                   (error "No stone at that position")))
+        (now (current-time)))
+    (gnugo-put :scoring-seed (logior (ash (logand (car now) 255) 16)
+                                     (cadr now)))
+    (let ((live (assq 'live game-over))
+          (dead (assq 'dead game-over))
+          bef now)
+      (if (memq group live)
+          (setq bef live now dead)
+        (setq bef dead now live))
+      (setcdr bef (delq group (cdr bef)))
+      (setcdr now (cons group (cdr now)))
+      ;; disabled permanently -- too wrong
+      (when nil
+        (flet ((populate (group)
+                         (let ((color (caar group)))
+                           (dolist (stone (cdr group))
+                             (gnugo-query "play %s %s" color stone)))))
+          (if (eq now live)
+              (populate group)
+            ;; drastic (and wrong -- clobbers capture info, etc)
+            (gnugo-query "clear_board")
+            (mapc 'populate (cdr live)))))
+      ;; here is the desired interface (to be enabled Some Day)
+      (when nil
+        (gnugo-query "change_dragon_status %s %s"
+                     (cadr group) (if (eq now live)
+                                      'alive
+                                    'dead)))))
+  (save-excursion
+    (gnugo-refresh)))
+
+(defun gnugo-estimate-score ()
+  "Display estimated score of a game of GNU Go.
+Output includes number of stones on the board and number of stones
+captured by each player, and the estimate of who has the advantage (and
+by how many stones)."
+  (interactive)
+  (message "Est.score ...")
+  (let ((black (length (split-string (gnugo-query "list_stones black"))))
+        (white (length (split-string (gnugo-query "list_stones white"))))
+        (black-captures (gnugo-query "captures black"))
+        (white-captures (gnugo-query "captures white"))
+        (est (gnugo-query "estimate_score")))
+    ;; might as well update this
+    (gnugo-put :black-captures black-captures)
+    (gnugo-put :white-captures white-captures)
+    (message "Est.score ... B %s %s | W %s %s | %s"
+             black black-captures white white-captures est)))
+
+(defun gnugo-write-sgf-file (filename)
+  "Save the game history to FILENAME (even if unfinished).
+If FILENAME already exists, Emacs confirms that you wish to overwrite it."
+  (interactive "FWrite game as SGF file: ")
+  (when (and (file-exists-p filename)
+             (not (y-or-n-p "File exists. Continue? ")))
+    (error "Not writing %s" filename))
+  ;; todo: write sgf.el; call to it here
+  (let ((bef-newline-appreciated '(:C :PB :PW :AB :AW))
+        (aft-newline-appreciated '(:C :B :AB :AW :W :PB :PW :SZ))
+        (sz (gnugo-get :board-size))
+        (tree (gnugo-get :sgf-tree))
+       newline-just-printed)
+    (with-temp-buffer
+      (insert "(")
+      (dolist (node (reverse tree))
+        (insert ";")
+        (dolist (prop (reverse node))
+          (let ((name (car prop))
+                (v (cdr prop)))
+           (insert
+            (if (and (memq name bef-newline-appreciated) 
+                     (not newline-just-printed)) "\n" "")
+            (substring (symbol-name name) 1)
+            (if (not (memq name '(:AB :AW))) "[" "")
+            (format "%s" v)
+            (if (not (memq name '(:AB :AW))) "]" "")
+            (if (or (memq name aft-newline-appreciated)
+                    (> (current-column) 60)) "\n" ""))
+           (setq newline-just-printed
+                 (memq name aft-newline-appreciated)))))
+      (insert ")\n")
+      (write-file filename))))
+
+(defun gnugo-warp-point ()
+  "Move the cursor to the next-to-last move."
+  (interactive)
+  (let ((moves (cdr (gnugo-get :sgf-tree))))
+    (if (memq (car (car (car moves))) '(:B :W))
+       (gnugo-goto-pos (gnugo-sgf-to-gtp (cdr (car (car moves))))))))
+
+(defun gnugo-initialize-sgf-tree ()
+  "Start a new sgf tree"
+  (gnugo-put :sgf-tree (list (list)))
+  (let ((g-blackp (string= "black" (gnugo-get :gnugo-color)))
+       (black-stones (split-string (gnugo-query "list_stones black") " "))
+       (white-stones (split-string (gnugo-query "list_stones white") " ")))
+    (mapc (lambda (x) (apply 'gnugo-note x))
+          `((:GM 1)
+            (:FF 4)                     ; hmm maybe better: 3
+            (:DT ,(format-time-string "%Y-%m-%d"))
+            (:RU ,(gnugo-get :rules))
+            (:HA ,(gnugo-get :handicap))
+            (:SZ ,(gnugo-get :board-size))
+            (:KM ,(gnugo-get :komi))
+            (:AP ,(format "gnugo.el:%s" gnugo-version))
+            (,(if g-blackp :PW :PB) ,(user-full-name))
+            (,(if g-blackp :PB :PW) ,(concat "GNU Go "
+                                             (gnugo-query "version")))))
+    (if black-stones
+       (gnugo-note :AB
+                   (apply 'concat
+                          (mapcar 
+                           (lambda (x) (format "[%s]" (gnugo-gtp-to-sgf x)))
+                           black-stones))))
+    (if white-stones
+       (gnugo-note :AW
+                   (apply 'concat
+                          (mapcar 
+                           (lambda (x) (format "[%s]" (gnugo-gtp-to-sgf x)))
+                           white-stones))))))
+
+(defun gnugo-read-sgf-file (filename)
+  "Load a game tree from FILENAME, a file in SGF format."
+  (interactive "fSGF file to load: ")
+  (gnugo-command (format "loadsgf %s 1" (expand-file-name filename)))
+  (gnugo-put :board-size 
+    (string-to-number (gnugo-query "query_boardsize")))
+  (gnugo-put :handicap 
+    (string-to-number (gnugo-query "get_handicap")))
+  (gnugo-put :komi 
+    (string-to-number (gnugo-query "get_komi")))
+  (gnugo-put :future-history nil)
+  (gnugo-initialize-sgf-tree)
+  (gnugo-command (format "loadsgf %s" (expand-file-name filename)))
+  (let* ((colorhistory 
+         (mapcar 
+          (lambda (x) (split-string x " ")) 
+          (split-string 
+           (cdr (gnugo-synchronous-send/return "move_history")) "[=\n]")))
+        (k (length colorhistory)))
+    (unless (equal colorhistory '(nil)) ; empty move history gives this
+      (gnugo-put :last-mover
+       (car (car colorhistory)))
+      (let ((half (ash (1+ (gnugo-get :board-size)) -1)))
+       (gnugo-goto-pos (format "A%d" half))
+       (forward-char (* 2 (1- half)))
+       (gnugo-put :last-user-bpos
+         (gnugo-put :center-position
+           (get-text-property (point) 'gnugo-position))))
+      (while (> k 0)
+       (decf k)
+       (gnugo-note (if (string= (car (nth k colorhistory)) "black") :B :W)
+                   (nth 1 (nth k colorhistory)) t t))))
+  (gnugo-refresh t)
+  (gnugo-warp-point))
+
+(defun gnugo-undo (&optional norefresh)
+  "Undo one move. Interchange the colors of the two players."
+  (interactive)
+  (gnugo-gate)
+  (unless (and (gnugo-get :game-over) ; engine should undo pass but not resign
+              (not
+               (string= "PASS" 
+                        (nth 1 
+                             (split-string (gnugo-query "last_move") " ")))))
+    (if (equal
+        (car
+         (split-string 
+          (cdr (gnugo-synchronous-send/return "undo")) " ")) "?")
+       (error "cannot undo")
+      (gnugo-put :future-history
+       (cons (car (gnugo-get :sgf-tree)) (gnugo-get :future-history)))))
+  (gnugo-put :sgf-tree (cdr (gnugo-get :sgf-tree)))
+  (gnugo-put :user-color (gnugo-get :last-mover))
+  (gnugo-put :gnugo-color (gnugo-other (gnugo-get :last-mover)))
+  (gnugo-put :last-mover (gnugo-get :gnugo-color))
+  (gnugo-put :game-over nil)
+; (gnugo-merge-showboard-results)
+  (unless norefresh
+    (gnugo-refresh t)
+    (gnugo-warp-point)))
+
+(defun gnugo-redo (&optional norefresh)
+  "Redo one move from the undo-stack (future-history).
+   Interchange the colors of the two players."
+  (interactive)
+  (gnugo-gate)
+  (if (equal (gnugo-get :future-history) nil)
+      (error "no more undone moves left to redo!"))
+  (let* ((buf (current-buffer))
+        (pos (gnugo-sgf-to-gtp (cdr (car (car (gnugo-get :future-history))))))
+       (color (if (equal (car (car (car (gnugo-get :future-history)))) :B) 
+                  "black" "white"))
+       (move (format "play %s %s" color pos))
+       (accept (cdr (gnugo-synchronous-send/return move))))
+    (gnugo-note (if (string= "black" color) :B :W) pos t t)
+    (gnugo-put :future-history (cdr (gnugo-get :future-history)))
+    (gnugo-put :user-color (gnugo-other color))
+    (gnugo-put :gnugo-color color)
+    (gnugo-put :last-mover color)
+;    (gnugo-merge-showboard-results)
+    (unless norefresh
+      (gnugo-refresh t)
+      (gnugo-warp-point))))
+
+(defun gnugo-redo-two-moves ()
+  "Redo a pair of moves (yours and GNU Go's).
+If two moves cannot be found, do nothing. (If there is
+exactly one move in the undo stack, you can still redo
+it using gnugo-redo.)"
+  (interactive)
+  (gnugo-gate)
+  (if (cdr (gnugo-get :future-history))
+      (gnugo-redo)
+    (error "can't redo two moves\n"))
+  (gnugo-redo))
+
+(defun gnugo-magic-undo (spec &optional noalt)
+  "Undo moves on the GNU Go Board, based on SPEC, a string or number.
+If SPEC is a string in the form of a board position (e.g., \"T19\"),
+check that the position is occupied by a stone of the user's color,
+and if so, remove moves from the history until that position is clear.
+If SPEC is a positive number, remove exactly that many moves from the
+history, signaling an error if the history is exhausted before finishing.
+If SPEC is not recognized, signal \"bad spec\" error.
+
+Refresh the board for each move undone.  If (in the case where SPEC is
+a number) after finishing, the color to play is not the user's color,
+schedule a move by GNU Go.
+
+After undoing the move(s), schedule a move by GNU Go if it is GNU Go's
+turn to play.  Optional second arg NOALT non-nil inhibits this."
+  (gnugo-gate)
+  (let ((n 0) done ans)
+    (cond ((and (numberp spec) (< 0 spec))
+           (setq n spec done (lambda () (= 0 n))))
+          ((string-match "^[a-z]" spec)
+           (let ((pos (upcase spec)))
+             (setq done `(lambda () 
+                          (equal 
+                           (gnugo-query ,(concat "color " pos)) "empty")))
+             (when (funcall done)
+               (error "%s already clear" pos))
+             (let ((u (gnugo-get :user-color)))
+               (when (= (save-excursion
+                          (gnugo-goto-pos pos)
+                          (char-after))
+                        (if (string= "black" u)
+                            ?O
+                          ?X))
+                 (error "%s not occupied by %s" pos u)))))
+          (t (error "bad spec: %S" spec)))
+    (while (not (funcall done))
+      (if (gnugo-get :game-over)
+         (gnugo-put :game-over nil)
+       (progn
+         (setq ans (cdr (gnugo-synchronous-send/return "undo")))
+         (unless (= ?= (aref ans 0))
+           (gnugo-refresh t)
+           (error ans))
+         (gnugo-put :future-history
+           (cons (car (gnugo-get :sgf-tree)) (gnugo-get :future-history)))))
+      (gnugo-put :sgf-tree (cdr (gnugo-get :sgf-tree)))
+      (gnugo-put :last-mover (gnugo-other (gnugo-get :last-mover)))
+;     (gnugo-merge-showboard-results)   ; all
+;     (gnugo-refresh t)                 ; this
+      (decf n)                          ; is
+      (sit-for 0)))                     ; eye candy
+  (let* ((ulastp (string= (gnugo-get :last-mover) (gnugo-get :user-color)))
+        
+         (ubpos (gnugo-move-history (if ulastp 'car 'cadr))))
+    (gnugo-put :last-user-bpos (if (and ubpos (not (string= "PASS" ubpos)))
+                                   ubpos
+                                 (gnugo-get :center-position)))
+    (gnugo-refresh t)
+    (when (and ulastp (not noalt))
+      (gnugo-get-move (gnugo-get :gnugo-color)))))
+
+(defun gnugo-undo-one-move ()
+  "Undo exactly one move (perhaps GNU Go's, perhaps yours).
+Do not schedule a move by GNU Go even if it is GNU Go's turn to play.
+See also `gnugo-undo-two-moves'."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-magic-undo 1 t))
+
+(defun gnugo-undo-two-moves ()
+  "Undo a pair of moves (GNU Go's and yours).
+However, if you are the last mover, undo only one move.
+Regardless, after undoing, it is your turn to play again."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-magic-undo (if (string= (gnugo-get :user-color)
+                                 (gnugo-get :last-mover))
+                        1
+                      2)))
+
+(defun gnugo-jump-to-move (movenum)
+  "Jump to move number MOVENUM."
+  (interactive)
+  (unless 
+      (and
+       (>= movenum 0)
+       (<= movenum (+ (length (cdr (gnugo-get :sgf-tree)))
+                     (length (gnugo-get :future-history)))))
+    (error "invalid move number"))
+  (while (not (= movenum (length (cdr (gnugo-get :sgf-tree)))))
+    (if (< movenum (length (cdr (gnugo-get :sgf-tree))))
+       (gnugo-undo t)
+      (gnugo-redo t)))
+  (gnugo-refresh t)
+  (gnugo-warp-point))
+
+(defun gnugo-jump-to-beginning ()
+  "Jump to the beginning of the game."
+  (interactive)
+  (gnugo-jump-to-move 0))
+
+(defun gnugo-jump-to-end ()
+  "Jump to the end of the game"
+  (interactive)
+  (gnugo-jump-to-move (+ (length (cdr (gnugo-get :sgf-tree)))
+        (length (gnugo-get :future-history)))))
+
+(defun gnugo-get-regression-directory (filename)
+  "Prompt the user for the regression directory."
+  (interactive "fRegression directory: ")
+  (setq gnugo-regression-directory (expand-file-name filename)))
+
+(defun gnugo-view-regression (test)
+  "View one of the standard gnugo regressions.
+   Enter the name of the test in the format filename:testnumber.
+   The filename must be a file in the regression directory. The
+   first time the function is run, you will be prompted for the
+   path to that directory."
+  (interactive "sTest: ")
+  (let* ((file (car (split-string test ":")))
+       (testnumber (nth 1 (split-string test ":")))
+       (gnugo-buffer (current-buffer))
+       (file-already-open nil))
+    (unless gnugo-regression-directory
+      (call-interactively 'gnugo-get-regression-directory))
+    (unless gnugo-regression-directory
+      (error "directory not found"))
+    (let ((filename
+          (concat gnugo-regression-directory file ".tst")))
+      (if (find-buffer-visiting filename)
+         (setq file-already-open t))
+      (find-file filename))
+    (beginning-of-buffer)
+    (unless
+       (re-search-forward (concat "^" testnumber " ") nil t)
+      (unless file-already-open (kill-buffer (current-buffer)))
+      (switch-to-buffer gnugo-buffer)
+      (error "test not found"))
+    (beginning-of-line)
+    (let* ((second-line (buffer-substring
+                        (line-beginning-position)
+                        (line-end-position)))
+          (third-line (progn
+                        (forward-line)
+                        (buffer-substring
+                        (line-beginning-position)
+                        (line-end-position))))
+          (first-line (progn (re-search-backward "loadsgf")
+                             (buffer-substring
+                              (line-beginning-position)
+                              (line-end-position))))
+          (first-line-split (split-string first-line)))
+      ; don't close the file if the user was visiting it
+      (unless file-already-open (kill-buffer (current-buffer)))
+      (switch-to-buffer gnugo-buffer)
+      (gnugo-read-sgf-file
+       (concat gnugo-regression-directory (nth 1 first-line-split)))
+      (if (> (length first-line-split) 2)
+         (gnugo-jump-to-move (1- (string-to-number 
+                                  (nth 2 first-line-split)))))
+      (setq mode-name "running test ...")
+      (gnugo-put :show-grid t)
+      (gnugo-refresh t)
+      (end-of-buffer)
+      (insert "\n\n ")
+      (insert first-line)
+      (insert "\n ")
+      (insert (format "%s:%s" file second-line))
+      (insert "\n ")
+      (insert third-line)
+      (insert "\n ")
+      (setq mode-name (format "%s" test))
+      (insert (cdr (gnugo-synchronous-send/return second-line))))))
+
+(defun gnugo-display-final-score ()
+  "Display final score and other info in another buffer (when game over).
+If the game is still ongoing, Emacs asks if you wish to stop play (by
+making sure two \"pass\" moves are played consecutively, if necessary).
+This info is also added to the game tree.  See `gnugo-write-sgf-file'."
+  (interactive)
+  (unless (or (gnugo-get :game-over)
+              (and (not (gnugo-get :waitingp))
+                   (y-or-n-p "Game still in play. Stop play now? ")))
+    (error "Sorry, game still in play"))
+  (unless (gnugo-get :game-over)
+    (flet ((pass (userp)
+                 (message "Playing PASS for %s ..."
+                          (gnugo-get (if userp :user-color :gnugo-color)))
+                 (sit-for 1)
+                 (gnugo-push-move userp "PASS")))
+      (unless (pass t)
+        (pass nil)))
+    (gnugo-refresh)
+    (sit-for 3))
+  (let ((b=  "   Black = ")
+        (w=  "   White = ")
+        (n1p (last (gnugo-get :sgf-tree)))
+        (res (let* ((node (car (gnugo-get :sgf-tree)))
+                    (event (and node (cdr (assq :EV node)))))
+               (and event (string= "resignation" event)
+                    (if (assq :B node) "black" "white"))))
+        blurb result)
+    (if res
+        (setq blurb (list
+                     (format "%s wins.\n"
+                             (substring (if (= ?b (aref res 0)) w= b=)
+                                        3 8))
+                     "The game is over.\n"
+                     (format "Resignation by %s.\n" res))
+              result (concat (upcase (substring (gnugo-other res) 0 1))
+                             "+Resign"))
+      (message "Computing final score ...")
+      (let* ((live   (cdr (assq 'live (gnugo-get :game-over))))
+             (dead   (cdr (assq 'dead (gnugo-get :game-over))))
+             (seed   (gnugo-get :scoring-seed))
+             (result (gnugo-query "final_score %d" seed))
+             (terr-q (format "final_status_list %%s_territory %d" seed))
+             (terr   "territory")
+             (capt   "captures")
+             (b-terr (length (split-string (gnugo-query terr-q "black"))))
+             (w-terr (length (split-string (gnugo-query terr-q "white"))))
+             (b-capt (string-to-number (gnugo-get :black-captures)))
+             (w-capt (string-to-number (gnugo-get :white-captures)))
+             (komi   (gnugo-get :komi)))
+        (setq blurb (list "The game is over.  Final score:\n"))
+        (cond ((string= "Chinese" (gnugo-get :rules))
+               (dolist (group live)
+                 (let ((count (length (cdr group))))
+                   (if (string= "black" (caar group))
+                       (setq b-terr (+ b-terr count))
+                     (setq w-terr (+ w-terr count)))))
+               (dolist (group dead)
+                 (let* ((color (caar group))
+                        (count (length (cdr group))))
+                   (if (string= "black" color)
+                       (setq w-terr (+ count w-terr))
+                     (setq b-terr (+ count b-terr)))))
+               (push (format "%s%d %s = %3.1f\n" b= b-terr terr b-terr) blurb)
+               (push (format "%s%d %s + %3.1f %s = %3.1f\n" w=
+                             w-terr terr komi 'komi (+ w-terr komi))
+                     blurb))
+              (t
+               (dolist (group dead)
+                 (let* ((color (caar group))
+                        (adjust (* 2 (length (cdr group)))))
+                   (if (string= "black" color)
+                       (setq w-terr (+ adjust w-terr))
+                     (setq b-terr (+ adjust b-terr)))))
+               (push (format "%s%d %s + %s %s = %3.1f\n" b=
+                             b-terr terr
+                             b-capt capt
+                             (+ b-terr b-capt))
+                     blurb)
+               (push (format "%s%d %s + %s %s + %3.1f %s = %3.1f\n" w=
+                             w-terr terr
+                             w-capt capt
+                             komi 'komi
+                             (+ w-terr w-capt komi))
+                     blurb)))
+        (push (if (string= "0" result)
+                  "The game is a draw.\n"
+                (format "%s wins by %s.\n"
+                        (substring (if (= ?B (aref result 0)) b= w=) 3 8)
+                        (substring result 2)))
+              blurb)
+        (message "Computing final score ... done")))
+    ;; extra info
+    (push "\n" blurb)
+    (dolist (spec '(("Game start" . :game-start-time)
+                    ("       end" . :game-end-time)))
+      (push (format-time-string
+             (concat (car spec) ": %Y-%m-%d %H:%M:%S %z\n")
+             (gnugo-get (cdr spec)))
+            blurb))
+    (setq blurb (apply 'concat (reverse blurb)))
+    (unless (eq :RE (caaar n1p))
+      (gnugo-note :C blurb)
+      (setcar n1p (append `((:RE . ,result)
+                            (:C . ,blurb))
+                          (car n1p))))
+    (switch-to-buffer (format "%s*GNU Go Final Score*"
+                              (gnugo-get :diamond)))
+    (when (= 0 (buffer-size))
+      (insert blurb))))
+
+;;;---------------------------------------------------------------------------
+;;; Command properties and gnugo-command
+
+;; GTP commands entered by the user are never issued directly to GNU Go;
+;; instead, their behavior and output are controlled by the property
+;; `:gnugo-gtp-command-spec' hung off of each (interned/symbolic) command.
+;; The value of this property is a sub-plist, w/ sub-properties as follows:
+;;
+;; :full -- completely interpret the command string; the value is a
+;;          func that takes the list of words derived from splitting the
+;;          command string (minus the command) and handles everything.
+;;
+;; :output -- either a keyword specifying the preferred output method:
+;;              :message -- show output in minibuffer
+;;              :discard -- sometimes you just don't care;
+;;            or a function that takes one arg, the output string, and
+;;            handles it completely.   default is to switch to buffer
+;;            "*gnugo command output*" if the output has a newline,
+;;            otherwise use `message'.
+;;
+;; :post-hook -- normal hook run after output processing (at the very end).
+
+(defun gnugo-command (command)
+  "Send the Go Text Protocol COMMAND (a string) to GNU Go.
+Output and Emacs behavior depend on which command is given (some
+commands are handled completely by Emacs w/o using the subprocess;
+some commands have their output displayed in specially prepared
+buffers or in the echo area; some commands are instrumented to do
+gnugo.el-specific housekeeping).
+
+For example, for the command \"help\", Emacs visits the
+GTP command reference info page.
+
+NOTE: At this time, GTP command handling specification is still
+      incomplete.  Thus, some commands WILL confuse gnugo.el."
+  (interactive "sCommand: ")
+  (if (string= "" command)
+      (message "(no command given)")
+    (let* ((split (split-string command))
+           (cmd (intern (car split)))
+           (spec (get cmd :gnugo-gtp-command-spec))
+           (full (plist-get spec :full))
+           (last-message nil))
+      (if full
+          (funcall full (cdr split))
+        (message "Doing %s ..." command)
+        (let* ((ans (cdr (gnugo-synchronous-send/return command)))
+               (where (plist-get spec :output)))
+          (if (string-match "unknown.command" ans)
+              (message ans)
+            (cond ((functionp where) (funcall where ans))
+                  ((eq :discard where) (message ""))
+                  ((or (eq :message where)
+                       (not (string-match "\n" ans)))
+                   (message ans))
+                  (t (switch-to-buffer "*gnugo command output*")
+                     (erase-buffer)
+                     (insert ans)
+                     (message "Doing %s ... done." command)))
+            (let ((hook
+                   ;; do not elide this binding; `run-hooks' needs it
+                   (plist-get spec :post-hook)))
+              (run-hooks 'hook))))))))
+
+;;;---------------------------------------------------------------------------
+;;; Major mode for interacting with a GNU Go subprocess
+
+(put 'gnugo-board-mode 'mode-class 'special)
+(defun gnugo-board-mode ()
+  "Major mode for playing GNU Go.
+Entering this mode runs the normal hook `gnugo-board-mode-hook'.
+In this mode, keys do not self insert. You can get further help
+describing any particular function with `C-h f <function-name>',
+for example `C-h f gnugo-move'.
+Default keybindings:
+
+  ?             View this help.
+
+  RET or SPC    Run `gnugo-move'.
+
+  q or Q        Quit (the latter without confirmation).
+
+  R             Resign.
+
+  u             Run `gnugo-undo-two-moves'.
+
+  r             Redo two moves.
+
+  U             Pass to `gnugo-magic-undo' either the board position
+                at point (if no prefix arg), or the prefix arg converted
+                to a number.  E.g., to undo 16 moves: `C-u C-u U' (see
+                `universal-argument'); to undo 42 moves: `M-4 M-2 U'.
+
+  f             Scroll forward (redo one undone move); 
+                potentially switch colors.
+
+  b             Scroll backward (undo one move); potentially switch colors.
+
+  <             Go to the beginning of the game
+
+  >             Go to the end of the game
+
+  j <n> RET     Jump to move number <n>
+
+  g             toggle the grid on or off.
+
+  C-l           Run `gnugo-refresh' to redraw the board.
+  _ or M-_      Bury the Board buffer (when the boss is near).
+
+  P             Run `gnugo-pass'.
+
+  i             Toggle display using XPM images (if supported).
+
+  w             Run `gnugo-worm-stones'.
+  d             Run `gnugo-dragon-stones'.
+
+  W             Run `gnugo-worm-data'.
+  D             Run `gnugo-dragon-data'.
+
+  t             Run `gnugo-toggle-dead-group'.
+
+  !             Run `gnugo-estimate-score'.
+
+  : or ;        Run `gnugo-command' (for GTP commands to GNU Go).
+
+  =             Display board position under point (if valid).
+
+  h             Run `gnugo-move-history'.
+
+  F             Run `gnugo-display-final-score'.
+
+  s             Run `gnugo-write-sgf-file'.
+
+  v             Run `gnugo-view-regression'.
+  or C-x C-w
+  or C-x C-s
+
+  l             Run `gnugo-read-sgf-file'."
+  (switch-to-buffer (generate-new-buffer "(Uninitialized GNU Go Board)"))
+  (buffer-disable-undo)                 ; todo: undo undo undoing
+  (kill-all-local-variables)
+  (setq truncate-lines t)
+  (use-local-map gnugo-board-mode-map)
+  (set (make-local-variable 'font-lock-defaults)
+       '(gnugo-font-lock-keywords t))
+  (setq major-mode 'gnugo-board-mode)
+  (setq mode-name "Playing GNU Go")
+  (add-hook 'kill-buffer-hook 'gnugo-cleanup nil t)
+  (make-local-variable 'gnugo-state)
+  (setq gnugo-state (make-hash-table :size (1- 42) :test 'eq))
+  (mapc (lambda (prop)
+          (gnugo-put prop nil))         ; todo: separate display/game aspects;
+        '(:game-over                    ;       move latter to func `gnugo'
+          :waitingp
+          :last-waiting
+          :black-captures
+          :white-captures
+          :mode-line
+          :mode-line-form
+          :edit-mode
+          :display-using-images
+          :show-grid
+          :xpms
+          :local-xpms
+          :all-yy))
+  (let ((name (if (string-match "[ ]" gnugo-program)
+                  (let ((p (substring gnugo-program 0 (match-beginning 0)))
+                        (o (substring gnugo-program (match-end 0)))
+                        (h (or (car gnugo-option-history) "")))
+                    (when (string-match "--mode" o)
+                      (error "Found \"--mode\" in `gnugo-program'"))
+                    (when (and o (< 0 (length o))
+                               h (< 0 (length o))
+                               (or (< (length h) (length o))
+                                   (not (string= (substring h 0 (length o))
+                                                 o))))
+                      (push (concat o " " h) gnugo-option-history))
+                    p)
+                gnugo-program))
+        (args (read-string "GNU Go options: "
+                           (car gnugo-option-history)
+                           'gnugo-option-history))
+        pre)
+    (mapc (lambda (x)
+            (apply (lambda (prop default opt &optional rx)
+                     (gnugo-put prop
+                       (or (when (string-match opt args)
+                             (let ((start (match-end 0)) s)
+                               (string-match (or rx "[0-9.]+") args start)
+                               (setq s (match-string 0 args))
+                               (if rx s (string-to-number s))))
+                           default)))
+                   x))
+          '((:board-size      19 "--boardsize")
+            (:user-color "black" "--color" "\\(black\\|white\\)")
+            (:handicap         0 "--handicap")
+            (:komi           0.0 "--komi")
+            (:minus-l        nil "\\([^-]\\|^\\)-l[ ]*" "[^ ]+")
+            (:infile         nil "--infile" "[ ]*[^ ]+")))
+    (gnugo-put :rules (if (string-match "--chinese-rules" args)
+                          "Chinese"
+                        "Japanese"))
+    (let ((proc-args (split-string args)))
+      (gnugo-put :proc-args proc-args)
+      (gnugo-put :proc (apply 'start-process "gnugo" nil name
+                              "--mode" "gtp" "--quiet"
+                              proc-args)))
+    (when (setq pre (or (gnugo-get :minus-l) (gnugo-get :infile)))
+      (mapc (lambda (x)
+              (apply (lambda (prop q)
+                       (gnugo-put prop (string-to-number (gnugo-query q))))
+                     x))
+            '((:board-size "query_boardsize")
+              (:komi       "get_komi")
+              (:handicap   "get_handicap")))))
+  (remhash :minus-l gnugo-state)        ; (ab)used as local var only
+  (remhash :infile gnugo-state)         ; likewise
+  (gnugo-put :diamond (substring (process-name (gnugo-get :proc)) 5))
+  (gnugo-put :gnugo-color (gnugo-other (gnugo-get :user-color)))
+  (gnugo-put :highlight-last-move-spec
+    (gnugo-put :default-highlight-last-move-spec '("(" -1 nil)))
+  (gnugo-put :lparen-ov (make-overlay 1 1))
+  (gnugo-put :rparen-ov (let ((ov (make-overlay 1 1)))
+                          (overlay-put ov 'display ")")
+                          ov))
+  (if (< 0 (gnugo-get :handicap))
+        (gnugo-query (format "fixed_handicap %d" (gnugo-get :handicap))))
+  (gnugo-initialize-sgf-tree)
+  (set-process-sentinel (gnugo-get :proc) 'gnugo-sentinel)
+  (set-process-buffer (gnugo-get :proc) (current-buffer))
+  (gnugo-put :waiting-start (current-time))
+  (gnugo-put :hmul 1)
+  (gnugo-put :wmul 1)
+  (run-hooks 'gnugo-board-mode-hook)
+  (gnugo-refresh t))
+
+;;;---------------------------------------------------------------------------
+;;; Entry point
+
+;;;###autoload
+(defun gnugo (&optional new-game)
+  "Run gnugo in a buffer, or resume a game in progress.
+Prefix arg means skip the game-in-progress check and start a new
+game straight away.
+
+You are queried for additional command-line options (Emacs supplies
+\"--mode gtp --quiet\" automatically).  Here is a list of options
+that gnugo.el understands and handles specially:
+
+    --boardsize num   Set the board size to use (5--19)
+    --color <color>   Choose your color ('black' or 'white')
+    --handicap <num>  Set the number of handicap stones (0--9)
+
+If there is already a game in progress you may resume it instead of
+starting a new one.  See `gnugo-board-mode' documentation for more info."
+  (interactive "P")
+  (let* ((all (let (acc)
+                (dolist (buf (buffer-list))
+                  (when (gnugo-board-buffer-p buf)
+                    (push (cons (buffer-name buf) buf) acc)))
+                acc))
+         (n (length all)))
+    (if (and (not new-game)
+             (< 0 n)
+             (y-or-n-p (format "GNU Go game%s in progress, resume play? "
+                               (if (= 1 n) "" "s"))))
+        ;; resume
+        (switch-to-buffer
+         (cdr (if (= 1 n)
+                  (car all)
+                (let ((sel (completing-read "Which one? " all nil t)))
+                  (if (string= "" sel)
+                      (car all)
+                    (assoc sel all))))))
+      ;; set up a new board
+      (gnugo-board-mode)
+      (let ((half (ash (1+ (gnugo-get :board-size)) -1)))
+        (gnugo-goto-pos (format "A%d" half))
+        (forward-char (* 2 (1- half)))
+        (gnugo-put :last-user-bpos
+          (gnugo-put :center-position
+            (get-text-property (point) 'gnugo-position))))
+      ;; first move
+      (if (and (fboundp 'display-images-p) (display-images-p))
+         (progn
+           (gnugo-toggle-image-display)
+           (gnugo-refresh t)))
+      (gnugo-put :game-start-time (current-time))
+      (let ((g (gnugo-get :gnugo-color))
+            (n (gnugo-get :handicap))
+            (u (gnugo-get :user-color)))
+        (gnugo-put :last-mover g)
+        (when (or (and (string= "black" u) (< 1 n))
+                  (and (string= "black" g) (< n 2)))
+          (gnugo-put :last-mover u)
+          (gnugo-refresh t)
+          (gnugo-get-move g))))))
+
+;;;---------------------------------------------------------------------------
+;;; Load-time actions
+
+(unless gnugo-board-mode-map
+  (setq gnugo-board-mode-map (make-sparse-keymap))
+  (suppress-keymap gnugo-board-mode-map)
+  (mapcar (lambda (pair)
+            (define-key gnugo-board-mode-map (car pair) (cdr pair)))
+          '(("?"        . describe-mode)
+            ("\C-m"     . gnugo-move)
+            (" "        . gnugo-move)
+            ("P"        . gnugo-pass)
+            ("R"        . gnugo-resign)
+            ("q"        . (lambda () (interactive)
+                            (if (or (gnugo-get :game-over)
+                                    (y-or-n-p "Quit? "))
+                                (kill-buffer nil)
+                              (message "(not quitting)"))))
+            ("Q"        . (lambda () (interactive)
+                            (kill-buffer nil)))
+            ("U"        . (lambda (x) (interactive "P")
+                            (gnugo-magic-undo
+                             (cond ((numberp x) x)
+                                   ((consp x) (car x))
+                                   (t (gnugo-position))))))
+            ("u"        . gnugo-undo-two-moves)
+            ("r"        . gnugo-redo-two-moves)
+            ("f"        . gnugo-redo)
+            ("b"        . gnugo-undo)
+            ("j"        . (lambda (x) (interactive "nJump to move number: ")
+                           (gnugo-jump-to-move x)))
+            ("<"        . gnugo-jump-to-beginning)
+           (">"        . gnugo-jump-to-end)
+            ("\C-l"     . gnugo-refresh)
+            ("\M-_"     . bury-buffer)
+            ("_"        . bury-buffer)
+            ("h"        . gnugo-move-history)
+            ("i"        . (lambda () (interactive)
+                            (gnugo-toggle-image-display)
+                            (save-excursion (gnugo-refresh))))
+           ("e"        . gnugo-toggle-edit-mode)
+            ("w"        . gnugo-worm-stones)
+            ("W"        . gnugo-worm-data)
+            ("d"        . gnugo-dragon-stones)
+            ("D"        . gnugo-dragon-data)
+            ("t"        . gnugo-toggle-dead-group)
+            ("g"        . gnugo-toggle-grid)
+            ("v"        . gnugo-view-regression)
+            ("!"        . gnugo-estimate-score)
+            (":"        . gnugo-command)
+            (";"        . gnugo-command)
+            ("="        . (lambda () (interactive)
+                            (message (gnugo-position))))
+            ("s"        . gnugo-write-sgf-file)
+            ("\C-x\C-s" . gnugo-write-sgf-file)
+            ("\C-x\C-w" . gnugo-write-sgf-file)
+            ("l"        . gnugo-read-sgf-file)
+            ("F"        . gnugo-display-final-score)
+            ;; mouse
+            ([(down-mouse-1)] . gnugo-mouse-move)
+            ([(down-mouse-3)] . gnugo-mouse-pass))))
+
+(unless (get 'help :gnugo-gtp-command-spec)
+  (flet ((sget (x) (get x :gnugo-gtp-command-spec))
+         (jam (cmd prop val) (put cmd :gnugo-gtp-command-spec
+                                  (plist-put (sget cmd) prop val)))
+         (add (cmd prop val) (jam cmd prop (let ((cur (plist-get
+                                                       (sget cmd)
+                                                       prop)))
+                                             (append (delete val cur)
+                                                     (list val)))))
+         (defgtp (x &rest props) (dolist (cmd (if (symbolp x) (list x) x))
+                                   (let ((ls props))
+                                     (while ls
+                                       (funcall (if (eq :post-hook (car ls))
+                                                    'add
+                                                  'jam)
+                                                cmd (car ls) (cadr ls))
+                                       (setq ls (cddr ls)))))))
+
+    (defgtp 'help :full
+      (lambda (sel)
+        (info "(gnugo)GTP command reference")
+        (when sel (setq sel (intern (car sel))))
+        (let (buffer-read-only pad cur spec output found)
+          (flet ((note (s) (insert pad "[NOTE: gnugo.el " s ".]\n")))
+            (goto-char (point-min))
+            (save-excursion
+              (while (re-search-forward "^ *[*] \\([a-zA-Z_]+\\)\\(:.*\\)*\n"
+                                        (point-max) t)
+                (unless pad
+                  (setq pad (make-string (- (match-beginning 1)
+                                            (match-beginning 0))
+                                         32)))
+                (when (plist-get
+                       (setq spec
+                             (get (setq cur (intern (match-string 1)))
+                                  :gnugo-gtp-command-spec))
+                       :full)
+                  (note "handles this command completely"))
+                (when (setq output (plist-get spec :output))
+                  (cond ((functionp output)
+                         (note "handles the output specially"))
+                        ((eq :discard output)
+                         (note "discards the output"))
+                        ((eq :message output)
+                         (note "displays the output in the echo area"))))
+                (when (eq sel cur)
+                  (setq found (match-beginning 0))))))
+          (cond (found (goto-char found))
+                ((not sel))
+                (t (message "(no such command: %s)" sel))))))
+
+    (defgtp 'final_score :full
+      (lambda (sel) (gnugo-display-final-score)))
+
+    (defgtp '(boardsize
+              clear_board
+              fixed_handicap
+             loadsgf)
+      :output :discard
+      :post-hook (lambda ()
+                   (dolist (prop '(:game-over
+                                   :last-mover))
+                     (gnugo-put prop nil))
+                   (flet ((n! (p q) (gnugo-put p
+                                      (string-to-number
+                                       (gnugo-query q)))))
+                     (n! :komi "get_komi")
+                     (n! :handicap "get_handicap")
+                     (n! :board-size "query_boardsize"))
+                   (gnugo-refresh t)))
+
+    (defgtp 'loadsgf
+      :output (lambda (ans)
+                (unless (= ?= (aref ans 0))
+                  (error ans))
+                (let* ((play (substring ans 2))
+                       (wait (gnugo-other play))
+                       (samep (string= (gnugo-get :user-color) play)))
+                  (unless samep
+                    (gnugo-put :gnugo-color wait)
+                    (gnugo-put :user-color play))
+                  ;; fixme: re-init :sgf-tree here.
+                  (message "GNU Go %splays as %s, you as %s (%s)"
+                           (if samep "" "now ")
+                           wait play (if samep
+                                         "as before"
+                                       "NOTE: this is a switch!")))))
+
+    (defgtp '(undo gg-undo) :full
+      (lambda (sel) (gnugo-magic-undo
+                     (let (n)
+                       (cond ((not sel) 1)
+                             ((< 0 (setq n (string-to-number (car sel)))) n)
+                             (t (car sel)))))))))
+
+(provide 'gnugo)
+
+;;; ttn-sez: worth-compiling
+;;; gnugo.el ends here
diff --git a/interface/gtp.c b/interface/gtp.c
new file mode 100644 (file)
index 0000000..f4d58bc
--- /dev/null
@@ -0,0 +1,484 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see   *
+ * http://www.gnu.org/software/gnugo/ for more information.      *
+ *                                                               *
+ * To facilitate development of the Go Text Protocol, the two    *
+ * files gtp.c and gtp.h are licensed under less restrictive     *
+ * terms than the rest of GNU Go.                                *
+ *                                                               *
+ * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 and  *
+ * 2009 by the Free Software Foundation.                         *
+ *                                                               *
+ * Permission is hereby granted, free of charge, to any person   *
+ * obtaining a copy of this file gtp.c, to deal in the Software  *
+ * without restriction, including without limitation the rights  *
+ * to use, copy, modify, merge, publish, distribute, and/or      *
+ * sell copies of the Software, and to permit persons to whom    *
+ * the Software is furnished to do so, provided that the above   *
+ * copyright notice(s) and this permission notice appear in all  *
+ * copies of the Software and that both the above copyright      *
+ * notice(s) and this permission notice appear in supporting     *
+ * documentation.                                                *
+ *                                                               *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY     *
+ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE    *
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR       *
+ * PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO      *
+ * EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS  *
+ * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR    *
+ * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING    *
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF    *
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT    *
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS       *
+ * SOFTWARE.                                                     *
+ *                                                               *
+ * Except as contained in this notice, the name of a copyright   *
+ * holder shall not be used in advertising or otherwise to       *
+ * promote the sale, use or other dealings in this Software      *
+ * without prior written authorization of the copyright holder.  *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "gtp.h"
+
+/* These are copied from gnugo.h. We don't include this file in order
+ * to remain as independent as possible of GNU Go internals.
+ */
+#define EMPTY        0
+#define WHITE        1
+#define BLACK        2
+
+/* We need to keep track of the board size in order to be able to
+ * convert between coordinate descriptions. We could also have passed
+ * the board size in all calls needing it, but that would be
+ * unnecessarily inconvenient.
+ */
+static int gtp_boardsize = -1;
+
+/* Vertex transformation hooks. */
+static gtp_transform_ptr vertex_transform_input_hook = NULL;
+static gtp_transform_ptr vertex_transform_output_hook = NULL;
+
+/* Current id number. We keep track of this internally rather than
+ * pass it to the functions processing the commands, since those can't
+ * do anything useful with it anyway.
+ */
+static int current_id;
+
+/* The file all GTP output goes to.  This is made global for the user
+ * of this file may want to use functions other than gtp_printf() etc.
+ * Set by gtp_main_loop().
+ */
+FILE *gtp_output_file = NULL;
+
+
+/* Read filehandle gtp_input linewise and interpret as GTP commands. */
+void
+gtp_main_loop(struct gtp_command commands[],
+             FILE *gtp_input, FILE *gtp_output, FILE *gtp_dump_commands)
+{
+  char line[GTP_BUFSIZE];
+  char command[GTP_BUFSIZE];
+  char *p;
+  int i;
+  int n;
+  int status = GTP_OK;
+
+  gtp_output_file = gtp_output;
+
+  while (status == GTP_OK) {
+    /* Read a line from gtp_input. */
+    if (!fgets(line, GTP_BUFSIZE, gtp_input))
+      break; /* EOF or some error */
+
+    if (gtp_dump_commands) {
+      fputs(line, gtp_dump_commands);
+      fflush(gtp_dump_commands);
+    }    
+
+    /* Preprocess the line. */
+    for (i = 0, p = line; line[i]; i++) {
+      char c = line[i];
+      /* Convert HT (9) to SPACE (32). */
+      if (c == 9)
+       *p++ = 32;
+      /* Remove CR (13) and all other control characters except LF (10). */
+      else if ((c > 0 && c <= 9)
+              || (c >= 11 && c <= 31)
+              || c == 127)
+       continue;
+      /* Remove comments. */
+      else if (c == '#')
+       break;
+      /* Keep ordinary text. */
+      else
+       *p++ = c;
+    }
+    /* Terminate string. */
+    *p = 0;
+       
+    p = line;
+
+    /* Look for an identification number. */
+    if (sscanf(p, "%d%n", &current_id, &n) == 1)
+      p += n;
+    else
+      current_id = -1; /* No identification number. */
+
+    /* Look for command name. */
+    if (sscanf(p, " %s %n", command, &n) < 1)
+      continue; /* Whitespace only on this line, ignore. */
+    p += n;
+
+    /* Search the list of commands and call the corresponding function
+     * if it's found.
+     */
+    for (i = 0; commands[i].name != NULL; i++) {
+      if (strcmp(command, commands[i].name) == 0) {
+       status = (*commands[i].function)(p);
+       break;
+      }
+    }
+    if (commands[i].name == NULL)
+      gtp_failure("unknown command");
+
+    if (status == GTP_FATAL)
+      gtp_panic();
+  }
+}
+
+/* Set the board size used in coordinate conversions. */
+void
+gtp_internal_set_boardsize(int size)
+{
+  gtp_boardsize = size;
+}
+
+/* If you need to transform the coordinates on input or output, use
+ * these functions to set hook functions which are called any time
+ * coordinates are read or about to be written. In GNU Go this is used
+ * to simulate rotated boards in regression tests.
+ */
+void
+gtp_set_vertex_transform_hooks(gtp_transform_ptr in, gtp_transform_ptr out)
+{
+  vertex_transform_input_hook = in;
+  vertex_transform_output_hook = out;
+}
+
+/*
+ * This function works like printf, except that it only understands
+ * very few of the standard formats, to be precise %c, %d, %f, %s.
+ * But it also accepts %m, which takes two integers and writes a vertex,
+ * and %C, which takes a color value and writes a color string.
+ */
+void 
+gtp_mprintf(const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  
+  for (; *fmt; ++fmt) {
+    if (*fmt == '%') {
+      switch (*++fmt) {
+      case 'c':
+      {
+       /* rules of promotion => passed as int, not char */
+       int c = va_arg(ap, int);
+       putc(c, gtp_output_file);
+       break;
+      }
+      case 'd':
+      {
+       int d = va_arg(ap, int);
+       fprintf(gtp_output_file, "%d", d);
+       break;
+      }
+      case 'f':
+      {
+       double f = va_arg(ap, double); /* passed as double, not float */
+       fprintf(gtp_output_file, "%f", f);
+       break;
+      }
+      case 's':
+      {
+       char *s = va_arg(ap, char *);
+       fputs(s, gtp_output_file);
+       break;
+      }
+      case 'm':
+      {
+       int m = va_arg(ap, int);
+       int n = va_arg(ap, int);
+        gtp_print_vertex(m, n);
+       break;
+      }
+      case 'C':
+      {
+       int color = va_arg(ap, int);
+       if (color == WHITE)
+         fputs("white", gtp_output_file);
+       else if (color == BLACK)
+         fputs("black", gtp_output_file);
+       else
+         fputs("empty", gtp_output_file);
+       break;
+      }
+      default:
+       /* FIXME: Should go to `stderr' instead? */
+       fprintf(gtp_output_file, "\n\nUnknown format character '%c'\n", *fmt);
+       break;
+      }
+    }
+    else
+      putc(*fmt, gtp_output_file);
+  }
+  va_end(ap);
+}
+
+
+/* This currently works exactly like printf. */
+void
+gtp_printf(const char *format, ...)
+{
+  va_list ap;
+  va_start(ap, format);
+  vfprintf(gtp_output_file, format, ap);
+  va_end(ap);
+}
+
+
+/* Write success or failure indication plus identity number if one was
+ * given.
+ */
+void
+gtp_start_response(int status)
+{
+  if (status == GTP_SUCCESS)
+    gtp_printf("=");
+  else
+    gtp_printf("?");
+  
+  if (current_id < 0)
+    gtp_printf(" ");
+  else
+    gtp_printf("%d ", current_id);
+}
+
+
+/* Finish a GTP response by writing a double newline and returning GTP_OK. */
+int
+gtp_finish_response()
+{
+  gtp_printf("\n\n");
+  return GTP_OK;
+}
+
+
+/* Write a full success response. Except for the id number, the call
+ * is just like one to printf.
+ */
+int
+gtp_success(const char *format, ...)
+{
+  va_list ap;
+  gtp_start_response(GTP_SUCCESS);
+  va_start(ap, format);
+  vfprintf(gtp_output_file, format, ap);
+  va_end(ap);
+  return gtp_finish_response();
+}
+
+
+/* Write a full failure response. The call is identical to gtp_success. */
+int
+gtp_failure(const char *format, ...)
+{
+  va_list ap;
+  gtp_start_response(GTP_FAILURE);
+  va_start(ap, format);
+  vfprintf(gtp_output_file, format, ap);
+  va_end(ap);
+  return gtp_finish_response();
+}
+
+
+/* Write a panic message. */
+void
+gtp_panic()
+{
+  gtp_printf("! panic\n\n");
+}
+
+
+/* Convert a string describing a color, "b", "black", "w", or "white",
+ * to GNU Go's integer representation of colors. Return the number of
+ * characters read from the string s.
+ */
+int
+gtp_decode_color(char *s, int *color)
+{
+  char color_string[7];
+  int i;
+  int n;
+
+  assert(gtp_boardsize > 0);
+
+  if (sscanf(s, "%6s%n", color_string, &n) != 1)
+    return 0;
+
+  for (i = 0; i < (int) strlen(color_string); i++)
+    color_string[i] = tolower((int) color_string[i]);
+
+  if (strcmp(color_string, "b") == 0
+      || strcmp(color_string, "black") == 0)
+    *color = BLACK;
+  else if (strcmp(color_string, "w") == 0
+          || strcmp(color_string, "white") == 0)
+    *color = WHITE;
+  else
+    return 0;
+  
+  return n;
+}
+
+
+/* Convert an intersection given by a string to two coordinates
+ * according to GNU Go's convention. Return the number of characters
+ * read from the string s.
+ */
+int
+gtp_decode_coord(char *s, int *i, int *j)
+{
+  char column;
+  int row;
+  int n;
+
+  assert(gtp_boardsize > 0);
+
+  if (sscanf(s, " %c%d%n", &column, &row, &n) != 2)
+    return 0;
+  
+  if (tolower((int) column) == 'i')
+    return 0;
+  *j = tolower((int) column) - 'a';
+  if (tolower((int) column) > 'i')
+    --*j;
+
+  *i = gtp_boardsize - row;
+
+  if (*i < 0 || *i >= gtp_boardsize || *j < 0 || *j >= gtp_boardsize)
+    return 0;
+
+  if (vertex_transform_input_hook != NULL)
+    (*vertex_transform_input_hook)(*i, *j, i, j);
+
+  return n;
+}
+
+/* Convert a move, i.e. "b" or "w" followed by a vertex to a color and
+ * coordinates. Return the number of characters read from the string
+ * s. The vertex may be "pass" and then the coordinates are set to (-1, -1).
+ */
+int
+gtp_decode_move(char *s, int *color, int *i, int *j)
+{
+  int n1, n2;
+  int k;
+
+  assert(gtp_boardsize > 0);
+
+  n1 = gtp_decode_color(s, color);
+  if (n1 == 0)
+    return 0;
+
+  n2 = gtp_decode_coord(s + n1, i, j);
+  if (n2 == 0) {
+    char buf[6];
+    if (sscanf(s + n1, "%5s%n", buf, &n2) != 1)
+      return 0;
+    for (k = 0; k < (int) strlen(buf); k++)
+      buf[k] = tolower((int) buf[k]);
+    if (strcmp(buf, "pass") != 0)
+      return 0;
+    *i = -1;
+    *j = -1;
+  }
+  
+  return n1 + n2;
+}
+
+/* This a bubble sort. Given the expected size of the sets to
+ * sort, it's probably not worth the overhead to set up a call to
+ * qsort.
+ */
+static void
+sort_moves(int n, int movei[], int movej[])
+{
+  int b, a;
+  for (b = n-1; b > 0; b--) {
+    for (a = 0; a < b; a++) {
+      if (movei[a] > movei[b]
+         || (movei[a] == movei[b] && movej[a] > movej[b])) {
+       int tmp;
+       tmp = movei[b];
+       movei[b] = movei[a];
+       movei[a] = tmp;
+       tmp = movej[b];
+       movej[b] = movej[a];
+       movej[a] = tmp;
+      }
+    }
+  }
+}
+
+/* Write a number of space separated vertices. The moves are sorted
+ * before being written.
+ */
+void
+gtp_print_vertices(int n, int movei[], int movej[])
+{
+  int k;
+  int ri, rj;
+  
+  assert(gtp_boardsize > 0);
+  
+  sort_moves(n, movei, movej);
+  for (k = 0; k < n; k++) {
+    if (k > 0)
+      gtp_printf(" ");
+    if (movei[k] == -1 && movej[k] == -1)
+      gtp_printf("PASS");
+    else if (movei[k] < 0 || movei[k] >= gtp_boardsize
+            || movej[k] < 0 || movej[k] >= gtp_boardsize)
+      gtp_printf("??");
+    else {
+      if (vertex_transform_output_hook != NULL)
+       (*vertex_transform_output_hook)(movei[k], movej[k], &ri, &rj);
+      else {
+       ri = movei[k];
+       rj = movej[k];
+      }
+      gtp_printf("%c%d", 'A' + rj + (rj >= 8), gtp_boardsize - ri);
+    }
+  }
+}
+
+/* Write a single move. */
+void
+gtp_print_vertex(int i, int j)
+{
+  gtp_print_vertices(1, &i, &j);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/gtp.h b/interface/gtp.h
new file mode 100644 (file)
index 0000000..1bddff8
--- /dev/null
@@ -0,0 +1,96 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see   *
+ * http://www.gnu.org/software/gnugo/ for more information.      *
+ *                                                               *
+ * To facilitate development of the Go Text Protocol, the two    *
+ * files gtp.c and gtp.h are licensed under less restrictive     *
+ * terms than the rest of GNU Go.                                *
+ *                                                               *
+ * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 and  *
+ * 2009 by the Free Software Foundation.                         *
+ *                                                               *
+ * Permission is hereby granted, free of charge, to any person   *
+ * obtaining a copy of this file gtp.h, to deal in the Software  *
+ * without restriction, including without limitation the rights  *
+ * to use, copy, modify, merge, publish, distribute, and/or      *
+ * sell copies of the Software, and to permit persons to whom    *
+ * the Software is furnished to do so, provided that the above   *
+ * copyright notice(s) and this permission notice appear in all  *
+ * copies of the Software and that both the above copyright      *
+ * notice(s) and this permission notice appear in supporting     *
+ * documentation.                                                *
+ *                                                               *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY     *
+ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE    *
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR       *
+ * PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO      *
+ * EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS  *
+ * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR    *
+ * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING    *
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF    *
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT    *
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS       *
+ * SOFTWARE.                                                     *
+ *                                                               *
+ * Except as contained in this notice, the name of a copyright   *
+ * holder shall not be used in advertising or otherwise to       *
+ * promote the sale, use or other dealings in this Software      *
+ * without prior written authorization of the copyright holder.  *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* NOTE: GNU Go specific, workarounds dumb Windows sockets. */
+#include "winsocket.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+
+/* Maximum allowed line length in GTP. */
+#define GTP_BUFSIZE 1000
+
+/* Status returned from callback functions. */
+#define GTP_QUIT    -1
+#define GTP_OK       0
+#define GTP_FATAL    1
+
+/* Whether the GTP command was successful. */
+#define GTP_SUCCESS  0
+#define GTP_FAILURE  1
+
+/* Function pointer for callback functions. */
+typedef int (*gtp_fn_ptr)(char *s);
+
+/* Function pointer for vertex transform functions. */
+typedef void (*gtp_transform_ptr)(int ai, int aj, int *bi, int *bj);
+
+/* Elements in the array of commands required by gtp_main_loop. */
+struct gtp_command {
+  const char *name;
+  gtp_fn_ptr function;
+};
+
+void gtp_main_loop(struct gtp_command commands[],
+                  FILE *gtp_input, FILE *gtp_output, FILE *gtp_dump_commands);
+void gtp_internal_set_boardsize(int size);
+void gtp_set_vertex_transform_hooks(gtp_transform_ptr in,
+                                   gtp_transform_ptr out);
+void gtp_mprintf(const char *format, ...);
+void gtp_printf(const char *format, ...);
+void gtp_start_response(int status);
+int gtp_finish_response(void);
+int gtp_success(const char *format, ...);
+int gtp_failure(const char *format, ...);
+void gtp_panic(void);
+int gtp_decode_color(char *s, int *color);
+int gtp_decode_coord(char *s, int *m, int *n);
+int gtp_decode_move(char *s, int *color, int *i, int *j);
+void gtp_print_vertices(int n, int movei[], int movej[]);
+void gtp_print_vertex(int i, int j);
+
+extern FILE *gtp_output_file;
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/gtp_examples/2ptkgo.pl b/interface/gtp_examples/2ptkgo.pl
new file mode 100644 (file)
index 0000000..d8995d4
--- /dev/null
@@ -0,0 +1,549 @@
+#!/usr/bin/perl -w
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.        #
+#                                                               #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/ #
+# for more information.                                         #
+#                                                               #
+# Copyright 1999, 2000, 2001 by the Free Software Foundation.   #
+#                                                               #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License   #
+# as published by the Free Software Foundation - version 3,     #
+# or (at your option) any later version.                        #
+#                                                               #
+# This program is distributed in the hope that it will be       #
+# useful, but WITHOUT ANY WARRANTY; without even the implied    #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR       #
+# PURPOSE.  See the GNU General Public License in file COPYING  #
+# for more details.                                             #
+#                                                               #
+# You should have received a copy of the GNU General Public     #
+# License along with this program; if not, write to the Free    #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,   #
+# Boston, MA 02111, USA.                                        #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+use Tk;
+use ttgo;
+use FileHandle;
+use IPC::Open2;
+
+# use strict;
+
+$| = 1;
+
+my $boardsize = 11;
+
+my $autoplay = 1;
+
+my @program = ();
+my @cur_id = ();
+
+
+my $Aprg_in = new FileHandle;
+my $Aprg_out = new FileHandle;
+$program[0] = 'gnugo --mode gtp --quiet';
+$cur_id[0] = 1;   # starting id
+
+
+my $Bprg_in = new FileHandle;
+my $Bprg_out = new FileHandle;
+$program[1] = 'gnugo --mode gtp --score aftermath --capture-all-dead --chinese-rules --quiet';
+$cur_id[1] = 1;   # starting id
+
+
+my $state = 'start';    # first initialization state
+
+open2($Aprg_out, $Aprg_in, $program[0]);
+$flags = 
+    fcntl( $Aprg_out, F_GETFL, 0) 
+    or die "Error with fcntl\n";
+$flags = 
+    fcntl( $Aprg_out, F_SETFL, $flags | O_NOBLOCK) 
+    or die "Error with fcntl\n";
+
+
+open2($Bprg_out, $Bprg_in, $program[1]);
+$flags = 
+    fcntl( $Bprg_out, F_GETFL, 0) 
+    or die "Error with fcntl\n";
+$flags = 
+    fcntl( $Bprg_out, F_SETFL, $flags | O_NOBLOCK) 
+    or die "Error with fcntl\n";
+
+
+
+my $flags = 0;
+my $consecutive_passes = 0;
+my $ctm = 'B';   # who's turn to move?
+my $cc = 'W';    # computers color
+
+
+my $msgstr = '';
+
+
+# This handles up to 25 size boards
+# =================================
+my @letter = qw ( A B C D E F G H J K L M N O P Q R S T U V W X Y Z );
+
+
+# color definitions
+# =================
+my %cstr = ( 'b' => '#604040', 'B' => '#604040', 
+            'w' => '#ffffff', 'W' => '#ffffff' 
+            );
+
+my $bkc = '#eeeeee';
+
+
+
+
+# get command line arguments start with defaults
+# ==============================================
+my $sqwh = 26;
+my $sqwh2 = 12;   # 1/2 of sqwh
+
+
+
+
+my %toix = ();
+foreach my $ix (0 .. $#letter) {
+    $toix{ $letter[$ix] } = $ix;
+}
+
+
+
+
+# initialize graphics and such
+# ----------------------------
+my $top = MainWindow->new; 
+$top->title("ptkgo.pl");
+$top->resizable(0,0);
+my $geox = ($boardsize-1) * $sqwh + 80;
+my $geoy = ($boardsize-1) * $sqwh + 140;
+
+$top->geometry( $geox . 'x' . $geoy );
+$top->configure( background => $bkc );
+
+
+
+# build the background go board
+
+my $backing = $top->Canvas(
+                          -width => $sqwh * $boardsize + 80,
+                          -height => $sqwh * $boardsize + 80,
+                          -background => $bkc
+                          )->place(
+                                   -x => 0,
+                                   -y => 0,
+                                   );
+
+
+foreach my $x ( 0 .. $boardsize-1 ) {
+
+    $backing->createText( 40 + $x * $sqwh, 
+                         25,
+                         -text => $letter[$x],
+                         -fill => 'black',
+                         -justify => 'center',
+                         -font => '-b&h-*-bold-r-*-*-11-*-*-*-*-*-*-*'
+                         );
+
+    $backing->createText( 40 + $x * $sqwh, 
+                         ($boardsize-1)*$sqwh + 55,
+                         -text => $letter[$x],
+                         -fill => 'black',
+                         -justify => 'center',
+                         -font => '-b&h-*-bold-r-*-*-11-*-*-*-*-*-*-*'
+                         );
+
+
+    $backing->createLine( $x*$sqwh + 40,
+                         40,
+                         $x*$sqwh+40,
+                         ($boardsize-1)*$sqwh + 40,
+                         -fill => 'black',
+                         -width => 1 );
+}
+
+
+
+
+foreach my $y ( 0 .. $boardsize-1 ) {
+
+    $backing->createText( 25,
+                         $y * $sqwh + 40,
+                         -text => $boardsize - $y,
+                         -fill => 'black',
+                         -justify => 'center',
+                         -font => '-b&h-*-bold-r-*-*-11-*-*-*-*-*-*-*'
+                         );
+
+    $backing->createText( ($boardsize-1) * $sqwh + 55,
+                         $y * $sqwh + 40,
+                         -text => $boardsize - $y,
+                         -fill => 'black',
+                         -justify => 'center',
+                         -font => '-b&h-*-bold-r-*-*-11-*-*-*-*-*-*-*'
+                         );
+
+
+    $backing->createLine( 40,
+                         $y*$sqwh+40,
+                         ($boardsize-1)*$sqwh+40,
+                         $y*$sqwh + 40,
+                         -fill => 'black',
+                         -width => 1 );
+}
+
+
+ttNewGame($boardsize);
+ttShowBoard();
+
+
+
+
+# pass button
+# -----------
+my $pass = $top->Button(
+                       -text => 'Pass',
+                       -command => sub {   },
+                       -width => 2,
+                       -height => 1,
+                       -font => '5x7',
+                       -borderwidth => 1,
+                       -highlightcolor => 'black',
+                       -highlightthickness  => 1,
+                       -highlightbackground => 'black',
+                       -relief => 'flat'
+                       )->place(
+                                -x => 40 + 0 * 40,
+                                -y => ($boardsize + 2) * $sqwh,
+                                );
+
+
+
+# undo button
+# -----------
+my $undo = $top->Button(
+                       -text => 'Undo',
+                       -command => sub {   },
+                       -width => 2,
+                       -height => 1,
+                       -font => '5x7',
+                       -borderwidth => 1,
+                       -highlightcolor => 'black',
+                       -highlightthickness  => 1,
+                       -highlightbackground => 'black',
+                       -relief => 'flat'
+                       )->place(
+                                -x => 40 + 1 * 40,
+                                -y => ($boardsize + 2) * $sqwh,
+                                );
+
+
+
+
+$top->bind( "<Button-1>", [ \&drop_stone, Ev('x'), Ev('y') ] );
+
+
+$top->fileevent( $Aprg_out, 'readable', [ \&getmessage, 0] );
+$top->fileevent( $Bprg_out, 'readable', [ \&getmessage, 1] );
+
+
+$state = 'start';    # first initialization state
+control();
+
+
+MainLoop();
+
+
+
+
+my $tmpstr;
+
+sub getmessage
+{
+    my ($pi) = @_;
+
+
+    if ($pi == 0) {
+       $tmpstr = <$Aprg_out>;
+    } else {
+       $tmpstr = <$Bprg_out>;  
+    }
+    
+    if (defined $tmpstr) {
+       chomp($tmpstr);
+
+       if ($tmpstr eq '') {   # eat the line, update id
+           $cur_id[$pi] ++; 
+           control( $msgstr );
+       }  else {
+           $msgstr = $tmpstr;
+           print "Came up with $msgstr\n";
+       }
+
+    }
+}
+
+
+
+
+sub xputstone
+{
+    my ($color, $x, $y) = @_;
+    
+
+    my $xx = $x * $sqwh + 40;
+    my $yy = $y * $sqwh + 40;
+
+    $backing->createOval( $xx-$sqwh2, $yy-$sqwh2, 
+                         $xx+$sqwh2, $yy+$sqwh2,
+                         -tags => $x . '_' . $y,
+                         -outline => 'black',
+                         -fill => $cstr{$color} );
+}
+
+
+# This routine clears all empty squares, it does 
+# not actually draw board
+sub xfixboard
+{
+    my @vis = ttGetBoard();
+    my $st;
+
+    foreach my $y (0 .. $boardsize -1) {
+       foreach my $x (0 .. $boardsize -1) {
+
+           $st = shift @vis;
+
+           if ($st eq '+') {
+               $backing->delete( $x . '_' . $y );
+           }
+       }
+    }
+}
+
+
+sub pass
+{
+
+
+}
+
+
+sub drop_stone
+{
+    my ( $w, $x, $y) = @_;
+
+    $x = -1 + int(($x-3) / 26);
+    $y = -1 + int(($y-3) / 26);
+
+    if ($x < 0) { return 1; }
+    if ($y < 0) { return 1; }
+    if ($x >= $boardsize) { return 1; }
+    if ($y >= $boardsize) { return 1; }
+
+
+    my $gn = $letter[$x] . ($boardsize - $y);
+
+    if ( !ttPlaceStone( $ctm, $gn ) ) {
+       xputstone( $ctm, $x, $y );
+       xfixboard();
+       ttShowBoard();
+    } else {  return 1; }
+
+
+    if ($ctm eq 'W') { 
+       $state = 'white';
+    } else {
+       $state = 'black';
+    } 
+
+    swap_ctm();    
+
+}
+
+
+
+
+# This routine is called after each message is recieved
+# -----------------------------------------------------
+
+# How the control loop works:
+#
+# the '$state' variable determines where to jump in.
+# control is called when a program responds to a message
+
+sub  control
+{
+    my ($msg) = @_;
+
+
+    # send boardsize 0    (prgA)
+    # send boardsize 1    (prgB)
+    # xxx
+    # send genmove_black  (prgA);
+    # send black          (prgB);
+    # send genmove_white  (prgB);
+    # white               (prgA)
+    # goto                xxx
+    
+
+    if (defined $msg) {
+       print STDERR "state/msg = $state $msg\n";
+    } else { print STDERR "state/msg = $state NULL\n"; }
+
+    if ($state eq 'start') {
+       snd( 0, "$cur_id[0] boardsize $boardsize" );
+       $state = 'startb';
+       return; 
+    }
+
+    if ($state eq 'startb') {
+       snd( 1, "$cur_id[1] boardsize $boardsize" );
+       $state = 'genmove_black';
+       return;
+    }
+
+    if ( $state eq 'genmove_black' ) {
+       snd( 0, "$cur_id[0] genmove_black" );
+       $state = 'black';
+       return;
+    }
+
+    if ( $state eq 'black' ) {
+       my $y;
+       my $x;
+       my $gn;
+
+       print "msg ---> $msg\n";
+
+       $msg =~ /^=\d+\s+(.)(.*)/;    # parse out move components
+
+       if ( $msg =~ /PASS/ ) {
+           $consecutive_passes++;
+           $gn = 'PASS';
+       } else {
+           $consecutive_passes = 0;
+           $y = $boardsize - $2;
+           $x = $toix{$1};
+           $gn = $letter[$x] . ($boardsize - $y);
+       }
+
+
+       # show blacks move to the interface 
+       # ---------------------------------
+       if ( !ttPlaceStone( $ctm, $gn ) ) {
+           xputstone( $ctm, $x, $y ) if $gn ne 'PASS';
+           xfixboard();
+           ttShowBoard();
+           swap_ctm();
+       } else {  return 1; }
+
+       # send the move along to WHITE
+       # ----------------------------
+       snd( 1, "$cur_id[1] black $gn" );
+       $state = 'genmove_white';
+
+       if ($consecutive_passes == 2) {
+           $state = 'gameover';
+       }
+
+       return;
+    }
+
+
+    if ( $state eq 'genmove_white' ) {
+       snd( 1, "$cur_id[1] genmove_white" );
+       $state = 'white';
+       return;
+    }
+
+
+    if ( $state eq 'white' ) {
+       my $y;
+       my $x;
+       my $gn;
+
+       print "msg ---> $msg\n";
+
+       $msg =~ /^=\d+\s+(.)(.*)/;    # parse out move components
+
+       if ( $msg =~ /PASS/ ) {
+           $consecutive_passes++;
+           $gn = 'PASS';
+       } else {
+           $consecutive_passes = 0;
+           $y = $boardsize - $2;
+           $x = $toix{$1};
+           $gn = $letter[$x] . ($boardsize - $y);
+       }
+
+
+       # show blacks move to the interface 
+       # ---------------------------------
+       if ( !ttPlaceStone( $ctm, $gn ) ) {
+           xputstone( $ctm, $x, $y ) if $gn ne 'PASS';
+           xfixboard();
+           ttShowBoard();
+           swap_ctm();
+       } else {  return 1; }
+
+       # send the move along to BLACK
+       # ----------------------------
+       snd( 0, "$cur_id[0] white $gn" );
+       $state = 'genmove_black';
+
+       if ($consecutive_passes == 2) {
+           $state = 'gameover';
+       }
+
+       return;
+    }
+
+
+    if ( $state eq 'gameover' ) {    
+       print "Game Over\n";
+       ttScore();
+
+    }
+
+
+
+
+
+
+}
+
+
+
+
+
+sub snd
+{
+    my ($who, $str) = @_;
+
+    if ($who == 0) {
+       print $Aprg_in "$str\n";
+    } else {
+       print $Bprg_in "$str\n";
+    }
+
+    print STDERR "----> $str\n";
+
+}
+
+
+sub swap_ctm
+{
+    if ( $ctm eq 'B' ) { 
+       $ctm = 'W'; 
+    } else { 
+       $ctm = 'B'; 
+    }
+
+}
diff --git a/interface/gtp_examples/README b/interface/gtp_examples/README
new file mode 100644 (file)
index 0000000..65970ce
--- /dev/null
@@ -0,0 +1,39 @@
+                       GTP Demonstration Programs
+
+twogtp    : a very useful perl script for playing two gtp processes together.
+
+twogtp-a  : alternative implementation
+
+twogtp.py : Python version of twogtp with additional features.
+
+twogtp.pike : Pike version of twogtp with even more features.
+
+2ptkgo.pl : Requires perltk and the next program. Plays two gtp processes 
+            together with graphical display
+
+ttgo.pm   : required by 2ptkgo.pl
+
+gtp2_6    : patch to GNU Go 2.6 allowing use of the gtp with a
+            limited command set sufficient to use twogtp.
+
+vanilla.c : Not useful by itself, this program shows how to spawn a gtp
+            process using fork() and exec(). It behaves just like GNU Go
+            and could be modified into any number of useful programs such
+            as a gtp/gmp mediator.
+
+metamachine.c : This program sits between a gtp controller and an
+                engine intercepting gtp commands and processing
+            them. When the gtp engine is gnugo, it gives an
+            alternative move generation scheme (though a weaker
+            engine).
+
+sgf2tst   : A perl script that produces a gtp test script from an sgf file
+
+matcher_check : A perl script that plays a gnugo process against itself,
+               watching for inconsistencies in the dragon_status field.
+               It flags these for further analysis by a person, and attempts
+               to generate regression tests from them.
+                
+gnugo.el   : This alternative to interface/gnugo.el can use XPM's to
+             display the board, but it is not finished. Use 
+             interface/gnugo.el instead.
diff --git a/interface/gtp_examples/gnugo.el b/interface/gtp_examples/gnugo.el
new file mode 100644 (file)
index 0000000..898090c
--- /dev/null
@@ -0,0 +1,663 @@
+;;; ID: $Id: gnugo.el,v 1.1.1.1 2008/12/21 18:47:58 bump Exp $
+;;;
+;;; This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+;;; http://www.gnu.org/software/gnugo/ for more information.   
+;;;                                                            
+;;; Copyright 1999, 2000, 2001 by the Free Software Foundation.            
+;;;                                                            
+;;; This program is free software; you can redistribute it and/
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation - version 3,
+;;; or (at your option) any later version.
+;;;                                                            
+;;; This program is distributed in the hope that it will be    
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied 
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR    
+;;; PURPOSE.  See the GNU General Public License in file COPYIN
+;;; for more details.                                          
+;;;                                                            
+;;; You should have received a copy of the GNU General Public  
+;;; License along with this program; if not, write to the Free 
+;;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,    
+;;; Boston, MA 02111, USA.
+
+;;; Description: Run GNU Go in a buffer.
+
+;;; Commentary:
+
+;; This is an interface to GNU Go using the Go Text Protocol.  Interaction
+;; with the gnugo subprocess is synchronous except for `gnugo-get-move'.  This
+;; means you can use Emacs to do other things while gnugo is thinking about
+;; its move.  (Actually, all interaction with the subprocess is inhibited
+;; during thinking time -- really, trying to distract your opponent is poor
+;; sportsmanship. :-)
+;;
+;; Customization is presently limited to `gnugo-animation-string', q.v.
+;;
+;; This code was tested with Emacs 20.7 on a monochrome 80x24 terminal.
+
+;;; Code:
+
+(require 'cl)                           ; use the source luke!
+
+;;;---------------------------------------------------------------------------
+;;; Variables
+
+(defvar gnugo-board-mode-map nil
+  "Keymap for GNU Go Board mode.")
+
+(defvar gnugo-option-history nil
+  "History of additional GNU Go command-line options.")
+
+(defvar gnugo-animation-string
+  (let ((jam "*#") (blink " #") (spin "-\\|/") (yada "*-*!"))
+    (concat jam jam jam jam jam
+            ;; "SECRET MESSAGE HERE"
+            blink blink blink blink blink blink blink blink
+            ;; Playing go is like fighting ignorance: when you think you have
+            ;; surrounded something by knowing it very well it often turns
+            ;; out that in the time you spent deepening this understanding,
+            ;; other areas of ignorance have surrounded you.
+            spin spin spin spin spin spin spin spin spin
+            ;; Playing go is not like fighting ignorance: what one person
+            ;; knows many people may come to know; knowledge does not build
+            ;; solely move by move.  Wisdom, on the other hand...
+            yada yada yada))
+  "*String whose individual characters are used for animation.
+Specifically, the `gnugo-worm-stones' and `gnugo-dragon-stones' commands
+render the stones in their respective (computed) groups as the first
+character in the string, then the next, and so on until the string (and/or
+the viewer) is exhausted.")
+
+;;;---------------------------------------------------------------------------
+;;; Support functions
+
+(defun gnugo-other (color)
+  (if (string= "black" color) "white" "black"))
+
+(defun gnugo-gate ()
+  (unless (eq (current-buffer) (get 'gnugo 'bbuf))
+    (error "Wrong buffer -- try M-x gnugo"))
+  (when (eq 'waiting (get 'gnugo 'get-move-state))
+    (error "Not your turn yet -- please wait"))
+  (when (eq 'game-over (get 'gnugo 'last-move))
+    (error "Sorry, game over")))
+
+(defun gnugo-sentinel (proc string)
+  (let ((status (process-status proc)))
+    (when (or (eq status 'exit)
+              (eq status 'signal))
+      (switch-to-buffer (get 'gnugo 'bbuf))
+      (delete-other-windows)
+      (delete-process proc)
+      (put 'gnugo 'proc nil))))
+
+(defun gnugo-send-line (line)
+  (process-send-string (get 'gnugo 'proc) (concat line "\n")))
+
+(defun gnugo-synchronous-send/return (message)
+  "Return (TIME . STRING) where TIME is that returned by `current-time' and
+STRING omits the two trailing newlines.  See also `gnugo-query'."
+  (when (eq 'waiting (get 'gnugo 'get-move-state))
+    (error "sorry, still waiting for %s to play" (get 'gnugo 'gnugo-color)))
+  (put 'gnugo 'sync-return "")
+  (let ((proc (get 'gnugo 'proc)))
+    (set-process-filter
+     proc #'(lambda (proc string)
+              (let* ((so-far (get 'gnugo 'sync-return))
+                     (start  (max 0 (- (length so-far) 2))) ; backtrack a little
+                     (full   (put 'gnugo 'sync-return (concat so-far string))))
+                (when (string-match "\n\n" full start)
+                  (put 'gnugo 'sync-return
+                       (cons (current-time) (substring full 0 -2)))))))
+    (gnugo-send-line message)
+    (let (rv)
+      ;; type change => break
+      (while (stringp (setq rv (get 'gnugo 'sync-return)))
+        (accept-process-output proc))
+      (put 'gnugo 'sync-return "")
+      rv)))
+
+(defun gnugo-query (message)
+  "Return cleaned-up value of a call to `gnugo-synchronous-send/return', q.v.
+The TIME portion is omitted as well as the first two characters of the STRING
+portion (corresponding to the status indicator in the Go Text Protocol).  Use
+this function when you are sure the command cannot fail."
+  (substring (cdr (gnugo-synchronous-send/return message)) 2))
+
+(defun gnugo-goto-pos (pos)
+  "Move point to board position POS, a letter-number string."
+  (goto-char (point-min))
+  (search-forward (substring pos 0 1))
+  (let ((col (1- (current-column))))
+    (re-search-forward (concat "^\\s-*" (substring pos 1) "\\s-"))
+    (move-to-column col)))
+
+;;;---------------------------------------------------------------------------
+;;; Game play actions
+
+(defun gnugo-showboard ()
+  (interactive)
+  (let ((board (cdr (gnugo-synchronous-send/return "showboard")))
+        white-captures black-captures)
+    (with-current-buffer (get 'gnugo 'bbuf)
+      (delete-region (point-min) (point-max))
+      (insert (substring board 3))      ; omit "= \n"
+      (goto-char (point-min))
+      (while (re-search-forward "\\s-*\\(WH\\|BL\\).*capt.*\\([0-9]+\\).*$"
+                                (point-max) t)
+        (if (string= "WH" (match-string 1))
+            (setq white-captures (match-string 2))
+          (setq black-captures (match-string 2)))
+        (replace-match ""))
+      (goto-char (point-max))
+      (move-to-column-force (get 'gnugo 'board-cols))
+      (delete-region (point) (point-max))
+      (let (pos)
+        (insert
+         (case (get 'gnugo 'last-move)
+           ((nil) "(black to play)")
+           ((game-over) "(t toggle, ! score, q quit)")
+           (t (let* ((last-move (get 'gnugo 'last-move))
+                     (color (car last-move))
+                     (move (cdr last-move)))
+                (setq pos (and (not (string= "PASS" move)) move))
+                (format "%s: %s (%s to play)\n%scaptures: black %s white %s"
+                        color move (gnugo-other color)
+                        (make-string (get 'gnugo 'board-cols) 32) ; space
+                        black-captures white-captures)))))
+        (when pos
+          (gnugo-goto-pos pos)
+          (delete-char -1) (insert "(")
+          (forward-char 1) (delete-char 1) (insert ")")))
+      (goto-char (get 'gnugo 'last)))))
+
+(defun gnugo-get-move-insertion-filter (proc string)
+  (let* ((so-far (get 'gnugo 'get-move-string))
+         (full   (put 'gnugo 'get-move-string (concat so-far string))))
+    (when (string-match "^= \\(.+\\)\n\n" full)
+      (let ((pos (match-string 1 full)))
+        (put 'gnugo 'get-move-string nil)
+        (put 'gnugo 'get-move-state nil)
+        (put 'gnugo 'last-move (cons (get 'gnugo 'gnugo-color) pos))
+        (gnugo-showboard)
+        (put 'gnugo 'passes
+             (if (string= "PASS" pos)
+                 (1+ (get 'gnugo 'passes))
+               0))
+        (when (= 2 (get 'gnugo 'passes))
+          (put 'gnugo 'last-move 'game-over))))))
+
+(defun gnugo-get-move (color)
+  (put 'gnugo 'get-move-state 'waiting)
+  (set-process-filter (get 'gnugo 'proc) 'gnugo-get-move-insertion-filter)
+  (gnugo-send-line (concat "genmove " color))
+  (accept-process-output))
+
+(defun gnugo-cleanup (&optional quietly)
+  "Kill gnugo process and *gnugo board* buffer.  Reset internal state."
+  (interactive)
+  (let ((proc (get 'gnugo 'proc)))
+    (when proc
+      (delete-process proc)))
+  (let ((bbuf (get 'gnugo 'bbuf)))
+    (when (and bbuf (get-buffer bbuf))
+      (kill-buffer bbuf)))
+  (unless quietly
+    (message "Thank you for playing GNU Go."))
+  (setplist 'gnugo nil))
+
+(defun gnugo-position ()
+  (let* ((letter (ignore-errors
+                   (save-excursion
+                     (let ((col (current-column)))
+                       (re-search-forward "^\\s-+A B C")
+                       (move-to-column col)
+                       (buffer-substring (point) (1+ (point)))))))
+ (number (save-excursion
+   (beginning-of-line)
+   (looking-at "\\s-*\\([0-9]+\\)")
+   (match-string 1)))
+ (pos (concat letter number)))
+    (if (string-match "^[A-T][1-9][0-9]*$" pos)
+pos
+      (error "Not a proper position point"))))
+
+(defun gnugo-move ()
+  "Make a move on the *gnugo board* buffer.
+The position is computed from current point.
+Signal error if done out-of-turn or if game-over.
+To start a game try M-x gnugo."
+  (interactive)
+  (gnugo-gate)
+  (let* ((pos (gnugo-position))
+         (move (format "play %s %s" (get 'gnugo 'user-color) pos))
+         (accept (cdr (gnugo-synchronous-send/return move)))
+         (status (substring accept 0 1)))
+    (cond ((string= "=" status)
+           (put 'gnugo 'last (point))
+           (put 'gnugo 'last-move (cons (get 'gnugo 'user-color) pos))
+           (put 'gnugo 'passes 0)
+           (gnugo-showboard))
+          (t (error accept)))
+    (gnugo-get-move (get 'gnugo 'gnugo-color))))
+
+(defun gnugo-mouse-move (e)
+  "Do `gnugo-move' at mouse location."
+  (interactive "@e")
+  (mouse-set-point e)
+  (when (looking-at "[.+]")
+    (gnugo-move)))
+
+(defun gnugo-pass ()
+  "Make a pass on the *gnugo board* buffer.
+Signal error if done out-of-turn or if game-over.
+To start a game try M-x gnugo."
+  (interactive)
+  (gnugo-gate)
+  (let ((passes (1+ (get 'gnugo 'passes))))
+    (put 'gnugo 'passes passes)
+    (put 'gnugo 'last-move
+         (if (= 2 passes)
+             'game-over
+           (cons (get 'gnugo 'user-color) "PASS")))
+    (gnugo-showboard)
+    (unless (= 2 passes)
+      (gnugo-get-move (get 'gnugo 'gnugo-color)))))
+
+(defun gnugo-mouse-pass (e)
+  "Do `gnugo-pass' at mouse location."
+  (interactive "@e")
+  (mouse-set-point e)
+  (gnugo-pass))
+
+(defun gnugo-refresh ()
+    "Display *gnugo board* buffer and update it with the current board state.
+During normal play, parenthesize the last-played stone (no parens for pass),
+and display at bottom-right corner a message describing the last-played
+position, who played it (and who is to play), and the number of stones
+captured thus far by each player."
+  (interactive)
+  (switch-to-buffer (get 'gnugo 'bbuf))
+  (gnugo-showboard))
+
+(defun gnugo-animate-group (command)
+  (message "Computing %s ..." command)
+  (let ((stones (cdr (gnugo-synchronous-send/return
+                      (format "%s %s" command (gnugo-position))))))
+    (if (not (string= "=" (substring stones 0 1)))
+        (error stones)
+      (setq stones (split-string (substring stones 1)))
+      (message "Computing %s ... %s in group." command (length stones))
+      (dolist (c (string-to-list gnugo-animation-string))
+        (save-excursion
+          (dolist (pos stones)
+            (gnugo-goto-pos pos)
+            (delete-char 1)
+            (insert c)))
+        (sit-for 0.08675309))           ; jenny jenny i got your number...
+      (sit-for 5)
+      (let ((p (point)))
+        (gnugo-showboard)
+        (goto-char p)))))
+
+(defun gnugo-display-group-data (command buffer-name)
+  (message "Computing %s ..." command)
+  (let ((data (cdr (gnugo-synchronous-send/return
+                    (format "%s %s" command (gnugo-position))))))
+    (switch-to-buffer buffer-name)
+    (erase-buffer)
+    (insert data))
+  (message "Computing %s ... done." command))
+
+(defun gnugo-worm-stones ()
+  "In the *gnugo board* buffer, animate \"worm\" at current position.
+Signal error if done out-of-turn or if game-over.
+See variable `gnugo-animation-string' for customization."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-animate-group "worm_stones"))
+
+(defun gnugo-worm-data ()
+  "Display in another buffer data from \"worm\" at current position.
+Signal error if done out-of-turn or if game-over."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-display-group-data "worm_data" "*gnugo worm data*"))
+
+(defun gnugo-dragon-stones ()
+  "In the *gnugo board* buffer, animate \"dragon\" at current position.
+Signal error if done out-of-turn or if game-over.
+See variable `gnugo-animation-string' for customization."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-animate-group "dragon_stones"))
+
+(defun gnugo-dragon-data ()
+  "Display in another buffer data from \"dragon\" at current position.
+Signal error if done out-of-turn or if game-over."
+  (interactive)
+  (gnugo-gate)
+  (gnugo-display-group-data "dragon_data" "*gnugo dragon data*"))
+
+(defun gnugo-snap ()
+  (save-excursion
+    (let ((letters (progn
+                     (goto-char (point-min))
+                     (end-of-line)
+                     (split-string (buffer-substring (point-min) (point)))))
+          (maxnum (read (current-buffer)))
+          snap)
+      (dolist (letter letters)
+        (do ((number maxnum (1- number)))
+            ((= 0 number))
+          (let* ((pos (format "%s%d" letter number))
+                 (color (gnugo-query (format "color %s" pos))))
+            (unless (string= "empty" color)
+              (setq snap (cons (cons pos color) snap))))))
+      snap)))
+
+(defun gnugo-toggle-dead-group ()
+  "In a *gnugo board* buffer, during game-over, toggle a group as dead.
+The group is selected from current position (point).
+Signal error if not in game-over or if there is no group at that position."
+  (interactive)
+  (unless (eq 'game-over (get 'gnugo 'last-move))
+    (error "Sorry, game still in play"))
+  (let* ((snap (or (get 'gnugo 'snap) (put 'gnugo 'snap (gnugo-snap))))
+         (pos (gnugo-position))
+         (color (gnugo-query (format "color %s" pos)))
+         (morgue (get 'gnugo 'morgue)))
+    (if (string= "empty" color)
+        (let ((already-dead (find-if '(lambda (group)
+                                        (member pos (cdr group)))
+                                     morgue)))
+          (unless already-dead
+            (error "No group at that position"))
+          (put 'gnugo 'morgue (delete already-dead morgue))
+          (setq color (car already-dead))
+          (save-excursion
+            (let ((c (if (string= color "black") "X" "O")))
+              (dolist (stone (cdr already-dead))
+                (gnugo-synchronous-send/return
+                 (format "play %s %s" color stone))
+                (gnugo-goto-pos stone) (delete-char 1) (insert c)))))
+      (let ((stones (sort (split-string
+                           (gnugo-query (format "worm_stones %s" pos)))
+                          'string<)))
+        (let ((newly-dead (cons color stones)))
+          (unless (member newly-dead morgue)
+            (setq morgue (put 'gnugo 'morgue (cons newly-dead morgue)))))
+        ;; clear and add back everything except the dead -- yuk!
+        (gnugo-synchronous-send/return "clear_board")
+        (let ((all-dead (apply 'append (mapcar 'cdr morgue))))
+          (dolist (pos-color snap)
+            (unless (member (car pos-color) all-dead)
+              (gnugo-synchronous-send/return
+               (format "play %s %s" (cdr pos-color) (car pos-color))))))
+        (let ((p (point)))
+          ;;(gnugo-showboard)
+          (dolist (worm morgue)
+            (let ((c (if (string= "black" (car worm)) "x" "o")))
+              (dolist (stone (cdr worm))
+                (gnugo-goto-pos stone)
+                (delete-char 1) (insert c))))
+          (goto-char p))))))
+
+(defun gnugo-estimate-score ()
+  "Display estimated score of a game of GNU Go.
+Output includes number of stones on the board and number of stones
+captured by each player, and the estimate of who has the advantage (and
+by how many stones)."
+  (interactive)
+  (message "Est.score ...")
+  (let ((black (length (split-string (gnugo-query "list_stones black"))))
+        (white (length (split-string (gnugo-query "list_stones white"))))
+        (black-captures (gnugo-query "captures black"))
+        (white-captures (gnugo-query "captures white"))
+        (est (gnugo-query "estimate_score")))
+    (message "Est.score ... B %s %s | W %s %s | %s"
+             black black-captures white white-captures est)))
+
+;;;---------------------------------------------------------------------------
+;;; Command properties and gnugo-command
+
+;; A direct gtp command can easily confuse gnugo.el, so we allow for
+;; interpretation of any command (and still become confused when the
+;; heuristics fail ;-).  Both control and data paths are are influenced by
+;; these properties:
+;;
+;;  gnugo-full -- completely interpret the command string; the value is a
+;;                func that takes the list of words derived from splitting the
+;;                command string (minus the command) and handles everything.
+;;
+;;  gnugo-rinse -- function taking raw output string and returning a
+;;                 (possibly filtered) replacement, the only one able
+;;                 to set the `gnugo-post-function' property (below).
+;;                 value may also be a list of such functions.
+;;
+;;  gnugo-output -- symbol specifying the preferred output method.
+;;                     message -- show output in minibuffer
+;;                     discard -- sometimes you just don't care
+;;                  default is to switch to buffer "*gnugo command output*"
+;;                  if the output has a newline, otherwise use `message'.
+;;
+;;  gnugo-post-function -- function or list of functions to call after the
+;;                         command (also after all output processing); only
+;;                         settable by a `gnugo-rinse' function.
+
+(defun gnugo-command (command)
+  "During a GNU Go game, send Go Text Protocol COMMAND to the subprocess."
+  (interactive "sCommand: ")
+  (if (string= "" command)
+      (message "(no command given)")
+    (let* ((split (split-string command))
+           (cmd (intern (car split)))
+           (full (get cmd 'gnugo-full))
+           (last-message nil))
+      (if full
+          (funcall full (cdr split))
+        (message "Doing %s ..." command)
+        (let* ((ans (cdr (gnugo-synchronous-send/return command)))
+               (rinse (get cmd 'gnugo-rinse))
+               (where (get cmd 'gnugo-output)))
+          (put cmd 'gnugo-post-function nil)
+          (when rinse
+            (cond ((functionp rinse) (setq ans (funcall rinse ans)))
+                  ((listp rinse) (while rinse
+                                   (setq ans (funcall (car rinse) ans)
+                                         rinse (cdr rinse))))
+                  (t (error "bad gnugo-rinse property: %s" rinse))))
+          (if (string-match "unknown.command" ans)
+              (message ans)
+            (cond ((eq 'discard where) (message ""))
+                  ((or (eq 'message where)
+                       (not (string-match "\n" ans)))
+                   (message ans))
+                  (t (switch-to-buffer "*gnugo command output*")
+                     (erase-buffer)
+                     (insert ans)
+                     (message "Doing %s ... done." command)))
+            (let ((pf (get cmd 'gnugo-post-function)))
+              (when pf
+                (cond ((functionp pf) (funcall pf))
+                      ((listp pf) (while pf
+                                    (progn (funcall (car pf))
+                                           (setq pf (cdr pf)))))
+                      (t (error "bad gnugo-post-function property: %s"
+                                pf)))
+                (put cmd 'gnugo-post-function nil)))))))))
+
+;;;---------------------------------------------------------------------------
+;;; Major mode for interacting with a GNU Go subprocess
+
+(defun gnugo-board-mode ()
+  "In this mode, keys do not self insert.
+Here are the default keybindings:
+
+  ?             View this help.
+
+  RET or SPC    Select point as the next move.
+                An error is signalled for invalid locations.
+
+  q or Q        Quit (the latter without confirmation).
+
+  R             Resign.
+
+  C-l           Refresh board.
+
+  _ or M-_      Bury the Board buffer (when the boss is near).
+
+  P             Pass; i.e., select no location for your move.
+
+  w             Animate current position's worm stones.
+  d             Animate current position's dragon stones.
+                See variable `gnugo-animation-string'.
+
+  W             Display current position's worm data in another buffer.
+  D             Display current position's dragon data in another buffer.
+
+  t             Toggle dead groups (when the game is over).
+
+  !             Estimate score (at any time).
+
+  : or ;        Extended command.  Type in a string to be passed (quite
+                indirectly) to the GNU Go subprocess.  Output and emacs
+                behavior depend on which command is given.  Try `help'
+                to get a list of all commands.  Note that some commands
+                may confuse gnugo.el."
+  (kill-all-local-variables)
+  (use-local-map gnugo-board-mode-map)
+  (setq major-mode 'gnugo-board-mode)
+  (setq mode-name "GNU Go Board"))
+
+;;;---------------------------------------------------------------------------
+;;; Entry point
+
+;;;###autoload
+(defun gnugo ()
+  "Run gnugo in a buffer, or resume a game in progress.
+You are queried for additional command-line options (Emacs supplies
+\"--mode gtp --quiet\" automatically).  Here is a list of options
+that gnugo.el understands and handles specially:
+
+    --boardsize num   Set the board size to use (5--19)
+    --color <color>   Choose your color ('black' or 'white')
+    --handicap <num>  Set the number of handicap stones (0--9)
+
+If there is already a game in progress you may resume it instead of
+starting a new one.  See `gnugo-board-mode' documentation for more info.
+See also variable `gnugo-option-history'."
+  (interactive)
+  (if (and (get 'gnugo 'proc)
+           (y-or-n-p "GNU Go game in progress, resume play? "))
+      (progn
+        (switch-to-buffer (get 'gnugo 'bbuf))
+        (gnugo-refresh))
+    (gnugo-cleanup t)
+    (put 'gnugo 'last 1)
+    (let* ((name "gnugo")
+           (args (read-string "GNU Go options: "
+                              (car gnugo-option-history)
+                              'gnugo-option-history))
+           (proc (apply 'start-process name nil name
+                        "--mode" "gtp" "--quiet"
+                        (split-string args)))
+           (bbuf (generate-new-buffer "*gnugo board*"))
+           (board-cols (+ 8 (* 2 (if (string-match "--boardsize" args)
+                                     (let ((start (match-end 0)))
+                                       (string-match "[1-9]+" args start)
+                                       (string-to-number (match-string 0 args)))
+                                   19))))
+           (user-color (if (string-match "--color" args)
+                           (let ((start (match-end 0)))
+                             (string-match "\\(black\\|white\\)" args start)
+                             (match-string 0 args))
+                         "black"))
+           (gnugo-color (gnugo-other user-color))
+           (handicap (if (string-match "--handicap" args)
+                         (let ((start (match-end 0)))
+                           (string-match "[0-9]+" args start)
+                           (string-to-number (match-string 0 args)))
+                       0))
+           (passes 0)
+           snap morgue)
+      (mapcar '(lambda (sym)
+                 (put 'gnugo sym (eval sym)))
+              '(proc bbuf board-cols user-color gnugo-color handicap passes
+                     snap morgue))
+      (unless (= 0 handicap)
+        (gnugo-synchronous-send/return (concat "fixed_handicap " handicap)))
+      (set-process-sentinel proc 'gnugo-sentinel)
+      (gnugo-refresh))
+    ;; set it all up
+    (gnugo-board-mode)
+    ;; first move
+    (when (or (and (string= "black" (get 'gnugo 'user-color))
+                   (< 1 (get 'gnugo 'handicap)))
+              (and (string= "black" (get 'gnugo 'gnugo-color))
+                   (< (get 'gnugo 'handicap) 2)))
+      (gnugo-get-move (get 'gnugo 'gnugo-color)))))
+
+;;;---------------------------------------------------------------------------
+;;; Load-time actions
+
+(unless gnugo-board-mode-map
+  (setq gnugo-board-mode-map (make-sparse-keymap))
+  (suppress-keymap gnugo-board-mode-map)
+  (mapcar '(lambda (pair)
+             (define-key gnugo-board-mode-map (car pair) (cdr pair)))
+          '(("?"        . describe-mode)
+            ("\C-m"     . gnugo-move)
+            (" "        . gnugo-move)
+            ("P"        . gnugo-pass)
+            ("R"        . (lambda () (interactive)
+                            (if (y-or-n-p "Resign? ")
+                                (gnugo-cleanup)
+                              (message "(not resigning)"))))
+            ("q"        . (lambda () (interactive)
+                            (if (y-or-n-p "Quit? ")
+                                (gnugo-cleanup)
+                              (message "(not quitting)"))))
+            ("Q"        . gnugo-cleanup)
+            ("\C-l"     . gnugo-refresh)
+            ("\M-_"     . bury-buffer)
+            ("_"        . bury-buffer)
+            ("w"        . gnugo-worm-stones)
+            ("W"        . gnugo-worm-data)
+            ("d"        . gnugo-dragon-stones)
+            ("D"        . gnugo-dragon-data)
+            ("t"        . gnugo-toggle-dead-group)
+            ("!"        . gnugo-estimate-score)
+            (":"        . gnugo-command)
+            (";"        . gnugo-command)
+            ;; mouse
+            ([(down-mouse-1)] . gnugo-mouse-move)
+            ([(down-mouse-3)] . gnugo-mouse-pass))))
+
+(put 'help 'gnugo-full
+     '(lambda (sel)
+        (info "(gnugo)GTP command reference")
+        (if (not sel)
+            (message "(you can also try \"help COMMAND\" next time)")
+          (let ((topic (intern (car sel))))
+            (goto-char (point-min))
+            (when (search-forward (concat "* " (car sel) "\n") (point-max) t)
+              (let (buffer-read-only)
+                (when (get topic 'gnugo-full)
+                  (insert "[NOTE: fully handled by gnugo.el]\n"))
+                (when (get topic 'gnugo-rinse)
+                  (insert "[NOTE: output rinsed by gnugo.el]\n"))))))))
+
+(mapc '(lambda (command)
+         (put command 'gnugo-output 'discard)
+         (put command 'gnugo-rinse
+              '(lambda (ans)
+                 (put cmd 'gnugo-post-function 'gnugo-refresh)
+                 ans)))
+      '(clear_board
+        fixed_handicap))
+
+(provide 'gnugo)
+
+;;; $RCSfile: gnugo.el,v $$Revision: 1.1.1.1 $ ends here
diff --git a/interface/gtp_examples/gtp2_6 b/interface/gtp_examples/gtp2_6
new file mode 100644 (file)
index 0000000..a4af10a
--- /dev/null
@@ -0,0 +1,1167 @@
+This patch to GNU Go 2.6 allows it to play with the Go Text Protocol.
+
+
+
+
+diff -u -N -r -x *\.orig -x *\.info* ./configure.in ../gnugo-2.6.1/gnugo-2.6.1/configure.in
+--- ./configure.in     Sun Feb 13 03:02:11 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/configure.in    Sat Aug  4 00:10:58 2001
+@@ -8,7 +8,7 @@
+ AC_PREREQ(2.12)dnl               dnl Minimum Autoconf version required.
+ dnl this defines VERSION and PACKAGE
+-AM_INIT_AUTOMAKE([gnugo], [2.6])
++AM_INIT_AUTOMAKE([gnugo], [2.6.1])
+ GNU_PACKAGE="GNU $PACKAGE"
+ AC_DEFINE_UNQUOTED(GNU_PACKAGE, "$GNU_PACKAGE")
+diff -u -N -r -x *\.orig -x *\.info* ./engine/liberty.h ../gnugo-2.6.1/gnugo-2.6.1/engine/liberty.h
+--- ./engine/liberty.h Tue Feb  8 19:59:07 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/engine/liberty.h        Fri Aug 10 16:20:09 2001
+@@ -53,6 +53,7 @@
+ #define WHITE 1
+ #define BLACK 2
+ #define GRAY_BORDER 3
++#define GRAY 3
+ #define WHITE_BORDER 4
+ #define BLACK_BORDER 5
+ #define NONE 6               /* for use with is_computer_player */
+@@ -138,8 +139,7 @@
+ void restore_state(void);
+ int dragon_status(int i, int j);
+ void change_dragon_status(int x, int y, int status);
+-
+-void who_wins(int color, float fkomi, FILE* stdwhat);
++void who_wins(int color, float fkomi, FILE * stdwhat);
+ /* data concerning a dragon. A copy is kept at each stone of the string */
+@@ -362,6 +362,7 @@
+ void find_cuts(void);
+ void find_connections(void);
+ void endgame(void);
++float estimate_score(float komi);
+ /* various different strategies for finding a move */
+diff -u -N -r -x *\.orig -x *\.info* ./engine/moyo.c ../gnugo-2.6.1/gnugo-2.6.1/engine/moyo.c
+--- ./engine/moyo.c    Tue Feb  8 19:59:07 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/engine/moyo.c   Fri Aug 10 16:21:10 2001
+@@ -2489,6 +2489,20 @@
+     fprintf(stdwhat, "%c says \"I lost!\"\n", (color == WHITE) ? 'W' : 'B');
+ }
++float
++estimate_score(float fkomi)
++{
++  float white_score;
++  float black_score;
++  float result;
++
++  make_moyo(BLACK);
++  white_score = (float) terri_eval[WHITE] + fkomi;
++  black_score = (float) terri_eval[BLACK];
++  result = white_score - black_score;
++  return result;
++}
++
+ void
+diff -u -N -r -x *\.orig -x *\.info* ./engine/reading.c ../gnugo-2.6.1/gnugo-2.6.1/engine/reading.c
+--- ./engine/reading.c Tue Feb  8 19:59:07 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/engine/reading.c        Sat Aug  4 00:10:58 2001
+@@ -2732,9 +2732,6 @@
+ {
+   int safe=0;
+-  if (stackp == 0 && safe_move_cache_when[i][j][color==BLACK] == movenum)
+-    return safe_move_cache[i][j][color==BLACK];
+-
+   if (trymove(i, j, color, "safe_move", -1, -1)) {
+     int acode = attack(i, j, NULL, NULL);
+     if (acode != 1)
+@@ -2742,10 +2739,6 @@
+     popgo();
+   }
+   
+-  if (stackp == 0) {
+-    safe_move_cache_when[i][j][color==BLACK] = movenum;
+-    safe_move_cache[i][j][color==BLACK] = safe;
+-  }
+   return safe;
+ }
+diff -u -N -r -x *\.orig -x *\.info* ./engine/sethand.c ../gnugo-2.6.1/gnugo-2.6.1/engine/sethand.c
+--- ./engine/sethand.c Sat Feb  5 05:59:53 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/engine/sethand.c        Sat Aug  4 00:10:58 2001
+@@ -158,13 +158,16 @@
+   if (handicap > maxhand)
+     handicap = maxhand;
+   
+-  sgfAddPropertyInt(sgf_root,"HA",handicap);
++  if (sgf_root)
++    sgfAddPropertyInt(sgf_root,"HA",handicap);
+   /* special cases: 5 and 7 */
+   if (handicap == 5 || handicap == 7) {
+     p[mid][mid] = BLACK;
+     handicap--;
+-    sgfAddStone(sgf_root,BLACK,mid,mid);
+-    sgf_set_stone(mid,mid,BLACK);
++    if (sgf_root) {
++      sgfAddStone(sgf_root,BLACK,mid,mid);
++      sgf_set_stone(mid,mid,BLACK);
++    }
+   }
+   for (x=0; x<handicap; ++x) {
+@@ -185,8 +188,10 @@
+     if ( j < 0) j += board_size-1;
+     p[i][j] = BLACK;
+-    sgfAddStone(sgf_root,BLACK,i,j);
+-    sgf_set_stone(i,j,BLACK);
++    if (sgf_root) {
++      sgfAddStone(sgf_root,BLACK,i,j);
++      sgf_set_stone(i,j,BLACK);
++    }
+   }
+   return handicap;
+ }
+diff -u -N -r -x *\.orig -x *\.info* ./engine/utils.c ../gnugo-2.6.1/gnugo-2.6.1/engine/utils.c
+--- ./engine/utils.c   Tue Feb  8 19:59:07 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/engine/utils.c  Sat Aug  4 00:10:58 2001
+@@ -349,7 +349,6 @@
+       case 's':
+       {
+       char *s = va_arg(ap, char*);
+-      assert( (int)*s >= board_size );  /* in case %s used in place of %m */
+       fputs(s, outputfile);
+       break;
+       }
+diff -u -N -r -x *\.orig -x *\.info* ./interface/Makefile.am ../gnugo-2.6.1/gnugo-2.6.1/interface/Makefile.am
+--- ./interface/Makefile.am    Thu Feb  3 20:48:50 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/Makefile.am   Sat Aug  4 00:10:58 2001
+@@ -26,7 +26,10 @@
+       play_gmp.c \
+       play_solo.c \
+       play_test.c \
+-      gmp.c
++      play_gtp.c \
++      gmp.c \
++      gtp.c \
++      gtp.h
+ AIXOPTS=-O -qmaxmem=16384 -qro -qroconst -qinfo
+diff -u -N -r -x *\.orig -x *\.info* ./interface/Makefile.in ../gnugo-2.6.1/gnugo-2.6.1/interface/Makefile.in
+--- ./interface/Makefile.in    Mon Feb 14 07:10:44 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/Makefile.in   Tue Aug 14 01:17:57 2001
+@@ -88,7 +88,7 @@
+ LDADD =       ../engine/libengine.a   ../patterns/libpatterns.a       ../sgf/libsgf.a         ../utils/libutils.a
+-gnugo_SOURCES =       main.c  interface.c     play_ascii.c    play_gmp.c      play_solo.c     play_test.c     gmp.c
++gnugo_SOURCES =       main.c  interface.c     play_ascii.c    play_gmp.c      play_solo.c     play_test.c     play_gtp.c      gmp.c   gtp.c   gtp.h
+ AIXOPTS = -O -qmaxmem=16384 -qro -qroconst -qinfo
+@@ -104,7 +104,7 @@
+ LDFLAGS = @LDFLAGS@
+ LIBS = @LIBS@
+ gnugo_OBJECTS =  main.o interface.o play_ascii.o play_gmp.o play_solo.o \
+-play_test.o gmp.o
++play_test.o play_gtp.o gmp.o gtp.o
+ gnugo_LDADD = $(LDADD)
+ gnugo_DEPENDENCIES =  ../engine/libengine.a ../patterns/libpatterns.a \
+ ../sgf/libsgf.a ../utils/libutils.a
+@@ -120,7 +120,7 @@
+ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+-TAR = tar
++TAR = gtar
+ GZIP_ENV = --best
+ SOURCES = $(gnugo_SOURCES)
+ OBJECTS = $(gnugo_OBJECTS)
+@@ -229,6 +229,7 @@
+         fi; \
+       done
+ gmp.o: gmp.c ../config.h gmp.h
++gtp.o: gtp.c gtp.h
+ interface.o: interface.c ../config.h ../sgf/sgf.h ../engine/liberty.h \
+       ../engine/hash.h interface.h ../engine/main.h
+ main.o: main.c ../config.h ../utils/getopt.h ../engine/main.h \
+@@ -241,6 +242,8 @@
+ play_gmp.o: play_gmp.c interface.h ../engine/liberty.h ../config.h \
+       ../engine/hash.h gmp.h ../sgf/sgf.h ../sgf/ttsgf.h \
+       ../sgf/ttsgf_write.h ../sgf/sgfana.h
++play_gtp.o: play_gtp.c ../config.h ../engine/liberty.h ../engine/hash.h \
++      interface.h gtp.h
+ play_solo.o: play_solo.c ../config.h interface.h ../engine/liberty.h \
+       ../engine/hash.h ../sgf/sgf.h ../sgf/sgf_properties.h \
+       ../sgf/ttsgf_read.h ../sgf/ttsgf.h ../sgf/sgfana.h
+diff -u -N -r -x *\.orig -x *\.info* ./interface/gtp.c ../gnugo-2.6.1/gnugo-2.6.1/interface/gtp.c
+--- ./interface/gtp.c  Thu Jan  1 00:00:00 1970
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/gtp.c Tue Aug 14 00:50:36 2001
+@@ -0,0 +1,417 @@
++/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
++ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see   *
++ * http://www.gnu.org/software/gnugo/ for more information.      *
++ *                                                               *
++ * To facilitate development of the Go Text Protocol, the two    *
++ * files gtp.c and gtp.h are licensed under less restrictive     *
++ * terms than the rest of GNU Go.                                *
++ *                                                               *
++ * Copyright 2001 by the Free Software Foundation.               *
++ *                                                               *
++ * Permission is hereby granted, free of charge, to any person   *
++ * obtaining a copy of this file gtp.c, to deal in the Software  *
++ * without restriction, including without limitation the rights  *
++ * to use, copy, modify, merge, publish, distribute, and/or      *
++ * sell copies of the Software, and to permit persons to whom    *
++ * the Software is furnished to do so, provided that the above   *
++ * copyright notice(s) and this permission notice appear in all  *
++ * copies of the Software and that both the above copyright      *
++ * notice(s) and this permission notice appear in supporting     *
++ * documentation.                                                *
++ *                                                               *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY     *
++ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE    *
++ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR       *
++ * PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO      *
++ * EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS  *
++ * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR    *
++ * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING    *
++ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF    *
++ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT    *
++ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS       *
++ * SOFTWARE.                                                     *
++ *                                                               *
++ * Except as contained in this notice, the name of a copyright   *
++ * holder shall not be used in advertising or otherwise to       *
++ * promote the sale, use or other dealings in this Software      *
++ * without prior written authorization of the copyright holder.  *
++\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
++
++#include <stdio.h>
++#include <string.h>
++#include <ctype.h>
++#include <assert.h>
++
++#include "gtp.h"
++
++/* These are copied from gnugo.h. We don't include this file in order
++ * to remain as independent as possible of GNU Go internals.
++ */
++#define EMPTY        0
++#define WHITE        1
++#define BLACK        2
++
++/* We need to keep track of the board size in order to be able to
++ * convert between coordinate descriptions. We could also have passed
++ * the board size in all calls needing it, but that would be
++ * unnecessarily inconvenient.
++ */
++static int gtp_boardsize = -1;
++
++/* Read stdin linewise and interpret as GTP commands. */
++void
++gtp_main_loop(struct gtp_command commands[])
++{
++  char line[GTP_BUFSIZE];
++  char command[GTP_BUFSIZE];
++  char *p;
++  int i;
++  int id;
++  int n;
++  int status = GTP_OK;
++  
++  while (status == GTP_OK) {
++    /* Read a line from stdin. */
++    if (!fgets(line, GTP_BUFSIZE, stdin))
++      break; /* EOF or some error */
++
++    /* Remove comments. */
++    if ((p = strchr(line, '#')) != NULL)
++      *p = 0;
++    
++    p = line;
++
++    /* Look for an identification number. */
++    if (sscanf(p, "%d%n", &id, &n) == 1)
++      p += n;
++    else
++      id = -1; /* No identification number. */
++
++    /* Look for command name. */
++    if (sscanf(p, " %s %n", command, &n) < 1)
++      continue; /* Whitespace only on this line, ignore. */
++    p += n;
++
++    /* Search the list of commands and call the corresponding function
++     * if it's found.
++     */
++    for (i = 0; commands[i].name != NULL; i++) {
++      if (strcmp(command, commands[i].name) == 0) {
++      status = (*commands[i].function)(p, id);
++      break;
++      }
++    }
++    if (commands[i].name == NULL)
++      gtp_failure(id, "unknown command: '%s'", command);
++
++    if (status == GTP_FATAL)
++      gtp_panic();
++  }
++}
++
++
++/* Set the board size used in coordinate conversions. */
++void
++gtp_internal_set_boardsize(int size)
++{
++  gtp_boardsize = size;
++}
++
++/*
++ * This function works like printf, except that it only understands
++ * very few of the standard formats, to be precise %c, %d, %f, %s.
++ * But it also accepts %m, which takes two integers and writes a move,
++ * and %C, which takes a color value and writes a color string.
++ */
++void 
++gtp_mprintf(const char *fmt, ...)
++{
++  va_list ap;
++  va_start(ap, fmt);
++  
++  for ( ; *fmt ; ++fmt ) {
++    if (*fmt == '%') {
++      switch (*++fmt) {
++      case 'c':
++      {
++      /* rules of promotion => passed as int, not char */
++      int c = va_arg(ap, int);
++      putc(c, stdout);
++      break;
++      }
++      case 'd':
++      {
++      int d = va_arg(ap, int);
++      fprintf(stdout, "%d", d);
++      break;
++      }
++      case 'f':
++      {
++      double f = va_arg(ap, double); /* passed as double, not float */
++      fprintf(stdout, "%f", f);
++      break;
++      }
++      case 's':
++      {
++      char *s = va_arg(ap, char*);
++      fputs(s, stdout);
++      break;
++      }
++      case 'm':
++      {
++      int m = va_arg(ap, int);
++      int n = va_arg(ap, int);
++      if (m == -1 && n == -1)
++        fputs("PASS", stdout);
++      else if ((m<0) || (n<0) || (m>=gtp_boardsize) || (n>=gtp_boardsize))
++        fprintf(stdout, "??");
++      else
++        fprintf(stdout, "%c%d", 'A' + n + (n >= 8), gtp_boardsize - m);
++      break;
++      }
++      case 'C':
++      {
++      int color = va_arg(ap, int);
++      if (color == WHITE)
++        fputs("white", stdout);
++      else if (color == BLACK)
++        fputs("black", stdout);
++      else
++        fputs("empty", stdout);
++      break;
++      }
++      default:
++      fprintf(stdout, "\n\nUnknown format character '%c'\n", *fmt);
++      break;
++      }
++    }
++    else
++      putc(*fmt, stdout);
++  }
++  va_end(ap);
++}
++
++
++/* This currently works exactly like printf. */
++void
++gtp_printf(const char *format, ...)
++{
++  va_list ap;
++  va_start(ap, format);
++  vfprintf(stdout, format, ap);
++  va_end(ap);
++}
++
++
++/* Write success or failure indication plus identity number if one was
++ * given.
++ */
++void
++gtp_printid(int id, int status)
++{
++  if (status == GTP_SUCCESS)
++    gtp_printf("=");
++  else
++    gtp_printf("?");
++  
++  if (id < 0)
++    gtp_printf(" ");
++  else
++    gtp_printf("%d ", id);
++}
++
++
++/* Finish a GTP response by writing a double newline and returning GTP_OK. */
++int
++gtp_finish_response()
++{
++  gtp_printf("\n\n");
++  return GTP_OK;
++}
++
++
++/* Write a full success response. Except for the id number, the call
++ * is just like one to printf.
++ */
++int
++gtp_success(int id, const char *format, ...)
++{
++  va_list ap;
++  gtp_printid(id, GTP_SUCCESS);
++  va_start(ap, format);
++  vfprintf(stdout, format, ap);
++  va_end(ap);
++  return gtp_finish_response();
++}
++
++
++/* Write a full failure response. The call is identical to gtp_success. */
++int
++gtp_failure(int id, const char *format, ...)
++{
++  va_list ap;
++  gtp_printid(id, GTP_FAILURE);
++  va_start(ap, format);
++  vfprintf(stdout, format, ap);
++  va_end(ap);
++  return gtp_finish_response();
++}
++
++
++/* Write a panic message. */
++void
++gtp_panic()
++{
++  gtp_printf("! panic\n\n");
++}
++
++
++/* Convert a string describing a color, "b", "black", "w", or "white",
++ * to GNU Go's integer representation of colors. Return the number of
++ * characters read from the string s.
++ */
++int
++gtp_decode_color(char *s, int *color)
++{
++  char color_string[7];
++  int i;
++  int n;
++
++  assert(gtp_boardsize > 0);
++
++  if (sscanf(s, "%6s%n", color_string, &n) != 1)
++    return 0;
++
++  for (i = 0; i < (int) strlen(color_string); i++)
++    color_string[i] = tolower((int) color_string[i]);
++
++  if (strcmp(color_string, "b") == 0
++      || strcmp(color_string, "black") == 0)
++    *color = BLACK;
++  else if (strcmp(color_string, "w") == 0
++         || strcmp(color_string, "white") == 0)
++    *color = WHITE;
++  else
++    return 0;
++  
++  return n;
++}
++
++
++/* Convert an intersection given by a string to two coordinates
++ * according to GNU Go's convention. Return the number of characters
++ * read from the string s.
++ */
++int
++gtp_decode_coord(char *s, int *i, int *j)
++{
++  char column;
++  int row;
++  int n;
++
++  assert(gtp_boardsize > 0);
++
++  if (sscanf(s, " %c%d%n", &column, &row, &n) != 2)
++    return 0;
++  
++  if (tolower((int) column) == 'i')
++    return 0;
++  *j = tolower((int) column) - 'a';
++  if (tolower((int) column) > 'i')
++    --*j;
++
++  *i = gtp_boardsize - row;
++
++  if (*i < 0 || *i >= gtp_boardsize || *j < 0 || *j >= gtp_boardsize)
++    return 0;
++
++  return n;
++}
++
++/* Convert a move, i.e. "b" or "w" followed by a vertex to a color and
++ * coordinates. Return the number of characters read from the string
++ * s.
++ */
++int
++gtp_decode_move(char *s, int *color, int *i, int *j)
++{
++  int n1, n2;
++
++  assert(gtp_boardsize > 0);
++
++  n1 = gtp_decode_color(s, color);
++  if (n1 == 0)
++    return 0;
++
++  n2 = gtp_decode_coord(s + n1, i, j);
++  if (n2 == 0)
++    return 0;
++
++  return n1 + n2;
++}
++
++/* This a bubble sort. Given the expected size of the sets to
++ * sort, it's probably not worth the overhead to set up a call to
++ * qsort.
++ */
++static void
++sort_moves(int n, int movei[], int movej[])
++{
++  int b, a;
++  for (b = n-1; b > 0; b--) {
++    for (a = 0; a < b; a++) {
++      if (movei[a] > movei[b]
++        || (movei[a] == movei[b] && movej[a] > movej[b])) {
++      int tmp;
++      tmp = movei[b];
++      movei[b] = movei[a];
++      movei[a] = tmp;
++      tmp = movej[b];
++      movej[b] = movej[a];
++      movej[a] = tmp;
++      }
++    }
++  }
++}
++
++/* Write a number of space separated vertices. The moves are sorted
++ * before being written.
++ */
++void
++gtp_print_vertices(int n, int movei[], int movej[])
++{
++  int k;
++  
++  assert(gtp_boardsize > 0);
++  
++  sort_moves(n, movei, movej);
++  for (k = 0; k < n; k++) {
++    if (k > 0)
++      gtp_printf(" ");
++    if ((movei[k] == -1 && movej[k] == -1)
++      || (movei[k] == gtp_boardsize && movej[k] == gtp_boardsize))
++      gtp_printf("PASS");
++    else if (movei[k] < 0 || movei[k] >= gtp_boardsize
++           || movej[k] < 0 || movej[k] >= gtp_boardsize) {
++      gtp_printf("?? %d %d", movei[k], movej[k]);
++    }
++    else
++      gtp_printf("%c%d", 'A' + movej[k] + (movej[k] >= 8),
++               gtp_boardsize - movei[k]);
++  }
++}
++
++/* Write a single move. */
++void
++gtp_print_vertex(int i, int j)
++{
++  gtp_print_vertices(1, &i, &j);
++}
++
++
++/*
++ * Local Variables:
++ * tab-width: 8
++ * c-basic-offset: 2
++ * End:
++ */
+diff -u -N -r -x *\.orig -x *\.info* ./interface/gtp.h ../gnugo-2.6.1/gnugo-2.6.1/interface/gtp.h
+--- ./interface/gtp.h  Thu Jan  1 00:00:00 1970
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/gtp.h Sat Aug  4 00:10:58 2001
+@@ -0,0 +1,83 @@
++/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
++ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see   *
++ * http://www.gnu.org/software/gnugo/ for more information.      *
++ *                                                               *
++ * To facilitate development of the Go Text Protocol, the two    *
++ * files gtp.c and gtp.h are licensed under less restrictive     *
++ * terms than the rest of GNU Go.                                *
++ *                                                               *
++ * Copyright 2001 by the Free Software Foundation.               *
++ *                                                               *
++ * Permission is hereby granted, free of charge, to any person   *
++ * obtaining a copy of this file gtp.h, to deal in the Software  *
++ * without restriction, including without limitation the rights  *
++ * to use, copy, modify, merge, publish, distribute, and/or      *
++ * sell copies of the Software, and to permit persons to whom    *
++ * the Software is furnished to do so, provided that the above   *
++ * copyright notice(s) and this permission notice appear in all  *
++ * copies of the Software and that both the above copyright      *
++ * notice(s) and this permission notice appear in supporting     *
++ * documentation.                                                *
++ *                                                               *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY     *
++ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE    *
++ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR       *
++ * PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO      *
++ * EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS  *
++ * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR    *
++ * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING    *
++ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF    *
++ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT    *
++ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS       *
++ * SOFTWARE.                                                     *
++ *                                                               *
++ * Except as contained in this notice, the name of a copyright   *
++ * holder shall not be used in advertising or otherwise to       *
++ * promote the sale, use or other dealings in this Software      *
++ * without prior written authorization of the copyright holder.  *
++\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
++
++#include <stdarg.h>
++
++/* Maximum allowed line length in GTP. */
++#define GTP_BUFSIZE 1000
++
++/* Status returned from callback functions. */
++#define GTP_QUIT    -1
++#define GTP_OK       0
++#define GTP_FATAL    1
++
++/* Whether the GTP command was successful. */
++#define GTP_SUCCESS  0
++#define GTP_FAILURE  1
++
++/* Function pointer for callback functions. */
++typedef int (*gtp_fn_ptr)(char *s, int id);
++
++/* Elements in the array of commands required by gtp_main_loop. */
++struct gtp_command {
++  const char *name;
++  gtp_fn_ptr function;
++};
++
++void gtp_main_loop(struct gtp_command commands[]);
++void gtp_internal_set_boardsize(int size);
++void gtp_mprintf(const char *format, ...);
++void gtp_printf(const char *format, ...);
++void gtp_printid(int id, int status);
++int gtp_finish_response(void);
++int gtp_success(int id, const char *format, ...);
++int gtp_failure(int id, const char *format, ...);
++void gtp_panic(void);
++int gtp_decode_color(char *s, int *color);
++int gtp_decode_coord(char *s, int *m, int *n);
++int gtp_decode_move(char *s, int *color, int *i, int *j);
++void gtp_print_vertices(int n, int movei[], int movej[]);
++void gtp_print_vertex(int i, int j);
++
++/*
++ * Local Variables:
++ * tab-width: 8
++ * c-basic-offset: 2
++ * End:
++ */
+diff -u -N -r -x *\.orig -x *\.info* ./interface/interface.c ../gnugo-2.6.1/gnugo-2.6.1/interface/interface.c
+--- ./interface/interface.c    Sat Feb  5 06:03:19 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/interface.c   Tue Aug 14 00:49:58 2001
+@@ -326,14 +326,14 @@
+ int 
+ clear_board(board_t **board)
+ {
+-  if(board==NULL)
+-    {
++  if (board==NULL) {
+       memset(p,EMPTY,sizeof(p));
+-    }
+-  else
+-    {
+-      memset(board,EMPTY,MAX_BOARD*MAX_BOARD*sizeof(board_t));
+-    }
++  }
++  else {
++    memset(board,EMPTY,MAX_BOARD*MAX_BOARD*sizeof(board_t));
++  }
++  white_captured = 0;
++  black_captured = 0;
+   return 1;
+ }
+diff -u -N -r -x *\.orig -x *\.info* ./interface/interface.h ../gnugo-2.6.1/gnugo-2.6.1/interface/interface.h
+--- ./interface/interface.h    Sat Feb  5 06:03:25 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/interface.h   Sat Aug  4 00:10:58 2001
+@@ -42,6 +42,7 @@
+ void play_ascii(char * filename);
+ void play_ascii_emacs(char * filename);
+ void play_gmp(void);
++void play_gtp(void);
+ void play_solo(int);
+ void play_test(struct SGFNode *, enum testmode);
+ int load_sgf_file(struct SGFNode *, const char *untilstr);
+diff -u -N -r -x *\.orig -x *\.info* ./interface/main.c ../gnugo-2.6.1/gnugo-2.6.1/interface/main.c
+--- ./interface/main.c Sat Feb 12 04:37:42 2000
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/main.c        Sat Aug  4 00:10:58 2001
+@@ -79,7 +79,7 @@
+ Usage : gnugo [-opts]\n\
+ \n\
+ Main Options:\n\
+-       --mode <mode>     Force the playing mode ('ascii', 'test' or 'gmp').\n\
++       --mode <mode>     Select mode ('ascii', 'test, 'gmp', 'gtp').\n\
+                          Default is ASCII.\n\
+                          If no terminal is detected GMP (Go Modem Protocol)\n\
+                          will be assumed.\n\
+@@ -185,6 +185,7 @@
+   MODE_ASCII,
+   MODE_ASCII_EMACS,
+   MODE_GMP,
++  MODE_GTP,
+   MODE_SGF,
+   MODE_LOAD_AND_ANALYZE,
+   MODE_LOAD_AND_SCORE,
+@@ -482,6 +483,7 @@
+        if (strcmp(optarg,"ascii")==0) playmode = MODE_ASCII;
+        else if (strcmp(optarg,"emacs")==0) playmode = MODE_ASCII_EMACS;
+        else if (strcmp(optarg,"gmp")==0) playmode = MODE_GMP;
++       else if (strcmp(optarg,"gtp")==0) playmode = MODE_GTP;  
+        else if (strcmp(optarg,"test")==0) playmode = MODE_TEST;
+        else {
+          fprintf(stderr,"Invalid mode selection: %s\n",optarg);
+@@ -718,6 +720,10 @@
+          set_computer_player(NONE);
+        }
+      play_ascii_emacs(infile);
++     break;
++
++   case MODE_GTP:
++     play_gtp();
+      break;
+    case MODE_ASCII :  
+diff -u -N -r -x *\.orig -x *\.info* ./interface/play_gtp.c ../gnugo-2.6.1/gnugo-2.6.1/interface/play_gtp.c
+--- ./interface/play_gtp.c     Thu Jan  1 00:00:00 1970
++++ ../gnugo-2.6.1/gnugo-2.6.1/interface/play_gtp.c    Tue Aug 14 01:16:03 2001
+@@ -0,0 +1,377 @@
++/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
++ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see   *
++ * http://www.gnu.org/software/gnugo/ for more information.      *
++ *                                                               *
++ * Copyright 1999, 2000, 2001 by the Free Software Foundation.   *
++ *                                                               *
++ * This program is free software; you can redistribute it and/or *
++ * modify it under the terms of the GNU General Public License   *
++ * as published by the Free Software Foundation - version 3.     *
++ *                                                               *
++ * This program is distributed in the hope that it will be       *
++ * useful, but WITHOUT ANY WARRANTY; without even the implied    *
++ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR       *
++ * PURPOSE.  See the GNU General Public License in file COPYING  *
++ * for more details.                                             *
++ *                                                               *
++ * You should have received a copy of the GNU General Public     *
++ * License along with this program; if not, write to the Free    *
++ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,   *
++ * Boston, MA 02111, USA.                                        *
++\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <stdio.h>
++#include <assert.h>
++#include <ctype.h>
++#include <string.h>
++
++#include "liberty.h"
++#include "interface.h"
++#include "gtp.h"
++
++#define MAXLIBS (2*(MAX_BOARD*MAX_BOARD + 1)/3)
++#define UNUSED(x)  x=x
++
++/* Internal state that's not part of the engine. */
++int color_to_move;
++float komi;
++int handicap;
++
++#define DECLARE(func) static int func(char *s, int id)
++
++DECLARE(gtp_fixed_handicap);
++DECLARE(gtp_genmove_black);
++DECLARE(gtp_genmove_white);
++DECLARE(gtp_name);
++DECLARE(gtp_estimate_score);
++DECLARE(gtp_playblack);
++DECLARE(gtp_playwhite);
++DECLARE(gtp_quit);
++DECLARE(gtp_set_boardsize);
++DECLARE(gtp_set_komi);
++DECLARE(gtp_showboard);
++DECLARE(gtp_version);
++DECLARE(gtp_help);
++float estimate_score(float komi);
++
++void play_gtp(void);
++
++/* List of known commands. */
++static struct gtp_command commands[] = {
++  {"black",                   gtp_playblack},
++  {"boardsize",                     gtp_set_boardsize},
++  {"fixed_handicap",                gtp_fixed_handicap},
++  {"genmove_black",           gtp_genmove_black},
++  {"genmove_white",           gtp_genmove_white},
++  {"help",                    gtp_help},
++  {"komi",                  gtp_set_komi},
++  {"name",                    gtp_name},
++  {"estimate_score",          gtp_estimate_score},
++  {"quit",                    gtp_quit},
++  {"showboard",                     gtp_showboard},
++  {"version",                 gtp_version},
++  {"white",                         gtp_playwhite},
++  {NULL,                      NULL}
++};
++
++
++/* Start playing using the Go Text Protocol. */
++void
++play_gtp(void)
++{
++  /* Try to make sure that we have a useful level of buffering of stdout. */
++#ifdef HAVE_SETLINEBUF
++  setlinebuf(stdout);
++#else
++  setbuf(stdout, NULL);
++#endif
++
++  gtp_internal_set_boardsize(19);
++
++  gtp_main_loop(commands);
++}
++
++
++/* Function:  Quit
++ * Arguments: none
++ * Fails:     never
++ * Returns:   nothing
++ */
++static int
++gtp_quit(char *s, int id)
++{
++  UNUSED(s);
++  gtp_success(id, "");
++  return GTP_QUIT;
++}
++
++
++/****************************
++ * Program identity.        *
++ ****************************/
++
++/* Function:  Report the name of the program.
++ * Arguments: none
++ * Fails:     never
++ * Returns:   program name
++ */
++static int
++gtp_name(char *s, int id)
++{
++  UNUSED(s);
++  return gtp_success(id, "GNU Go");
++}
++
++
++/* Function:  Report the version number of the program.
++ * Arguments: none
++ * Fails:     never
++ * Returns:   version number
++ */
++static int
++gtp_version(char *s, int id)
++{
++  UNUSED(s);
++  return gtp_success(id, VERSION);
++}
++
++
++/* Function:  Set the board size to NxN and clear the board.
++ * Arguments: integer
++ * Fails:     board size outside engine's limits
++ * Returns:   nothing
++ */
++static int
++gtp_set_boardsize(char *s, int id)
++{
++  int boardsize;
++  if (sscanf(s, "%d", &boardsize) < 1)
++    return gtp_failure(id, "boardsize not an integer");
++  
++  if (boardsize < MIN_BOARD || boardsize > MAX_BOARD)
++    return gtp_failure(id, "unacceptable boardsize");
++
++  set_boardsize(boardsize);
++  clear_board(NULL);
++  gtp_internal_set_boardsize(boardsize);
++  return gtp_success(id, "");
++}
++
++
++/* Function:  Set the komi.
++ * Arguments: float
++ * Fails:     incorrect argument
++ * Returns:   nothing
++ */
++static int
++gtp_set_komi(char *s, int id)
++{
++  if (sscanf(s, "%f", &komi) < 1)
++    return gtp_failure(id, "komi not a float");
++  
++  return gtp_success(id, "");
++}
++
++
++/* Function:  Play a black stone at the given vertex.
++ * Arguments: vertex
++ * Fails:     invalid vertex, illegal move
++ * Returns:   nothing
++ */
++static int
++gtp_playblack(char *s, int id)
++{
++  int i, j;
++  char *c;
++
++  for (c = s; *c; c++)
++    *c = tolower(*c);
++
++  if (strncmp(s, "pass", 4) == 0) {
++    i = get_boardsize();
++    j = get_boardsize();
++  }
++  else if (!gtp_decode_coord(s, &i, &j))
++    return gtp_failure(id, "invalid coordinate");
++
++  if (!legal(i, j, BLACK))
++    return gtp_failure(id, "illegal move");
++
++  updateboard(i, j, BLACK);
++  return gtp_success(id, "");
++}
++
++
++/* Function:  Play a white stone at the given vertex.
++ * Arguments: vertex
++ * Fails:     invalid vertex, illegal move
++ * Returns:   nothing
++ */
++static int
++gtp_playwhite(char *s, int id)
++{
++  int i, j;
++  char *c;
++
++  for (c = s; *c; c++)
++    *c = tolower(*c);
++
++  if (strncmp(s, "pass", 4) == 0) {
++    i = get_boardsize();
++    j = get_boardsize();
++  }
++  else if (!gtp_decode_coord(s, &i, &j))
++    return gtp_failure(id, "invalid coordinate");
++  
++  if (!legal(i, j, WHITE))
++    return gtp_failure(id, "illegal move");
++
++  updateboard(i, j, WHITE);
++  return gtp_success(id, "");
++}
++
++
++/* Function:  Set up fixed placement handicap stones.
++ * Arguments: number of handicap stones
++ * Fails:     invalid number of stones for the current boardsize
++ * Returns:   list of vertices with handicap stones
++ */
++static int
++gtp_fixed_handicap(char *s, int id)
++{
++  int m, n;
++  int first = 1;
++  int handicap;
++  if (sscanf(s, "%d", &handicap) < 1)
++    return gtp_failure(id, "handicap not an integer");
++  
++  clear_board(NULL);
++  if (sethand(handicap) != handicap)
++    return gtp_failure(id, "invalid handicap");
++
++  gtp_printid(id, GTP_SUCCESS);
++
++  for (m = 0; m < board_size; m++)
++    for (n = 0; n < board_size; n++)
++      if (p[m][n] != EMPTY) {
++      if (!first)
++        gtp_printf(" ");
++      else
++        first = 0;
++      gtp_mprintf("%m", m, n);
++      }
++
++  return gtp_finish_response();
++}
++
++
++/* Function:  Generate and play the supposedly best black move.
++ * Arguments: none
++ * Fails:     never
++ * Returns:   a move coordinate (or "PASS")
++ */
++static int
++gtp_genmove_black(char *s, int id)
++{
++  int i, j;
++  UNUSED(s);
++  
++  if (genmove(&i, &j, BLACK) >= 0)
++    updateboard(i, j, BLACK);
++
++  gtp_printid(id, GTP_SUCCESS);
++  gtp_print_vertex(i, j);
++  return gtp_finish_response();
++}
++
++
++
++
++/* Function:  Generate and play the supposedly best white move.
++ * Arguments: none
++ * Fails:     never
++ * Returns:   a move coordinate (or "PASS")
++ */
++static int
++gtp_genmove_white(char *s, int id)
++{
++  int i, j;
++  UNUSED(s);
++  if (genmove(&i, &j, WHITE) >= 0)
++    updateboard(i, j, WHITE);
++
++  gtp_printid(id, GTP_SUCCESS);
++  gtp_print_vertex(i, j);
++  return gtp_finish_response();
++}
++
++static int
++gtp_estimate_score(char *s, int id)
++{
++  int i, j;
++  float score;
++  UNUSED(s);
++
++  genmove(&i, &j, BLACK);
++  score = estimate_score(komi);
++
++  gtp_printid(id, GTP_SUCCESS);
++  if (score > 0.0) 
++    gtp_printf("W+%3.1f (upper bound: %3.1f, lower: %3.1f)", 
++             score, score, score);
++  else if (score < 0.0)
++    gtp_printf("B+%3.1f (upper bound: %3.1f, lower: %3.1f)", 
++             -score, score, score);
++  else
++    gtp_printf("0");
++  return gtp_finish_response();
++}  
++
++
++/* Function:  Write the position to stderr.
++ * Arguments: none
++ * Fails:     never
++ * Returns:   nothing
++ */
++static int
++gtp_showboard(char *s, int id)
++{
++  UNUSED(s);
++  showboard(1);
++  return gtp_success(id, "");
++}
++
++
++/* Function:  List all known commands
++ * Arguments: none
++ * Fails:     never
++ * Returns:   list of known commands, one per line
++ */
++static int
++gtp_help(char *s, int id)
++{
++  int k;
++  UNUSED(s);
++
++  gtp_printid(id, GTP_SUCCESS);
++
++  for (k = 0; commands[k].name != NULL; k++)
++    gtp_printf("%s\n", commands[k].name);
++
++  gtp_printf("\n");
++  return GTP_OK;
++}
++
++
++
++
++/*
++ * Local Variables:
++ * tab-width: 8
++ * c-basic-offset: 2
++ * End:
++ */
diff --git a/interface/gtp_examples/matcher_check b/interface/gtp_examples/matcher_check
new file mode 100644 (file)
index 0000000..b517dd3
--- /dev/null
@@ -0,0 +1,729 @@
+#! /usr/bin/perl -w
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007    #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# matcher_check info:
+#
+# Plays one gtp program against itself or lets it analzye a saved .sgf-file,
+# and watches for bad status transitions.
+#
+# FIXME: if the vertex by which a dragon is named ever changes,
+# the hash table used will consider it new.  therefore, if the
+# vertex changes at the same time an illegal state change occurs,
+# it will get missed.  Also, it is possible that a dragon would
+# be captured, and that vertex go unused until a new piece was
+# played in that spot, resulting in a false positive.  However,
+# this should be rare (?).
+
+package TWOGTP_A;
+
+use IPC::Open2;
+use Getopt::Long;
+use FileHandle;
+use strict;
+use warnings;
+use Carp;
+
+STDOUT->autoflush(1);
+
+#following added globally to allow "use strict" :
+my $vertex;
+my $first;
+my $sgfmove;
+my $sgffilename;
+my $pidp;
+my $sgffile;
+my $handicap_stones;
+my $result;
+my @vertices;
+my $second;
+my %game_list;
+#end of "use strict" repairs
+
+my $program;
+my $size = 19;
+my $verbose = 0;
+my $komi = 5.5;
+my $handicap = 0;
+my $games = 1;
+my $wanthelp;
+
+#added for matcher_check
+my %match_hist;
+my $loadfile;
+my $movenum;
+my $movecount;
+my $move;
+my $toplay;
+my $randseed;
+my $stable;
+my $pids;
+my $stable_move = "";
+my $noilcheck;
+my $color;
+
+my $helpstring = "
+
+Run with:
+
+matchercheck --program \'<path to program> --mode gtp [program options]\' \\
+       [matcher_check options]
+
+Possible matcher_check options:
+
+  --verbose 1 (to list moves) or --verbose 2 (to draw board)
+  --komi <amount>
+  --handicap <amount>
+  --size <board size>                     (default 19)
+  --games <number of games to play>       (-1 to play forever)
+  --sgffile <filename>                   (file to save games as)
+  --loadsgf <filename>                   (file to analyze)
+  --movecount <number of moves to check>
+  --randseed <number>                    (sets the random seed)
+  --stable \'<path to stable version> --mode gtp [program options]\'
+  --noilcheck                            (turns off illegal transition checks)
+  --color <color>                        (only replay for color; has no effect
+                                          without --noilcheck and --loadsgf)
+  --help                                  (show this)
+
+
+";
+
+GetOptions(
+           "program|p=s"            => \$program,
+           "verbose|v=i"            => \$verbose,
+           "komi|k=f"               => \$komi,
+           "handicap|h=i"           => \$handicap,
+           "size|boardsize|s=i"     => \$size,
+           "sgffile|o=s"            => \$sgffilename,
+          "loadsgf|l=s"            => \$loadfile,
+           "games=i"                => \$games,
+          "movecount=i"            => \$movecount,
+          "randseed=i"             => \$randseed,
+          "stable=s"               => \$stable,
+          "noilcheck"              => \$noilcheck,
+          "color=s"                => \$color,
+           "help"                   => \$wanthelp,
+);
+
+if ($wanthelp) {
+    print $helpstring;
+    exit;
+}
+
+
+if (!$program) {
+    $program = '../gnugo --mode gtp --quiet';
+    warn "Defaulting program to: $program\n";
+}
+
+if (defined($color) and (!defined($noilcheck) or !defined($loadfile))) {
+    print "Error: --color requires --noilcheck and --loadsgf";
+    exit;
+}
+
+
+# create FileHandles
+my $prog_in  = new FileHandle;         # stdin of program
+my $prog_out = new FileHandle;         # stdout of program
+my $stable_in  = new FileHandle;       # stdin of stable version
+my $stable_out = new FileHandle;       # stdout of stable version
+
+
+if ($loadfile)
+{
+    #we need to analyze an sgf file
+    if (not defined $movecount) {
+       print "Error: When analyzing an sgf file with --loadsgf <filename>, you also need to
+specify the number of moves to check with --movecount <n>.
+";
+       exit;
+    }
+
+    $pidp = open2($prog_out, $prog_in, $program);
+    $pids = open2($stable_out, $stable_in, $stable) if defined($stable);
+    print "program pid: $pidp\n" if $verbose;
+    print "stable pid:  $pids\n" if (defined($stable) and $verbose);
+
+    if (defined($randseed)) {
+        print $prog_in "set_random_seed $randseed\n";
+       eat_no_response($prog_out);
+    } else {
+        print $prog_in "get_random_seed\n";
+        $randseed = eat_one_line($prog_out);
+        print "random seed $randseed\n";
+    }
+
+    if (defined($stable)) {
+        $randseed =~ s/^= //smg;
+        print $stable_in "set_random_seed $randseed\n";
+        eat_no_response($stable_out);
+    }
+
+    for ($movenum = 1; $movenum <= $movecount + 1; $movenum++)
+    {
+        #load the file, check the statuses, next move.
+        my $lmove = $movenum + 1;#number to load up to
+       print "loading move $movenum\n" if $verbose;
+        print $prog_in "loadsgf $loadfile $lmove\n";
+       eat_no_response($prog_out);
+        if (!defined($noilcheck)) {
+            check_matcher($prog_in, $prog_out);
+            print "done checking status.\n" if ($verbose);
+        }
+
+        #do stable checks
+        if (defined($stable)) {
+            print $stable_in "loadsgf $loadfile $lmove\n";
+            $toplay = eat_one_line($stable_out);
+            $toplay =~ s/^=//smg;
+            $toplay =~ s/ //smg;
+           if (!defined($color) or ($color eq $toplay)) {
+               print $prog_in "genmove_$toplay\n";
+               print $stable_in "genmove_$toplay\n";
+               $move = eat_move($prog_out);
+               $stable_move = eat_move($stable_out);
+               if ($move ne $stable_move and defined ($stable)) {
+                   print "At move $movenum, $toplay\:\n";
+                   print "Test version played   $move\n";
+                   print "Stable version played $stable_move\n";
+                   if ($verbose eq 2) {
+                       print $prog_in "showboard\n";
+                       print eat_response($prog_out);
+                   }
+               } else {
+                   print "$toplay plays $move\n" if $verbose;
+               }
+           }
+        }
+    }
+
+    print "done reading sgf file\n" if ($verbose);
+    exit;
+}
+
+
+while ($games > 0) {
+    %match_hist = ();
+    $pidp = open2($prog_out, $prog_in, $program);
+    print "program pid: $pidp\n" if $verbose;
+
+    if (defined($stable)) {
+        $pids = open2($stable_out, $stable_in, $stable);
+        print "stable pid: $pids\n" if $verbose;
+    }
+
+    $sgffile = rename_sgffile($games, $sgffilename) if defined $sgffilename;
+
+    if ((defined $sgffilename) && !open(SGFFILEHANDLE, ">$sgffile")) {
+       printf("can't open $sgffile\n");
+       undef($sgffilename);
+    }
+
+    #set autoflushing for sgf file
+    SGFFILEHANDLE->autoflush(1);
+
+    if (!defined $komi) {
+        if ($handicap > 0) {
+           $komi = 0.5;
+       }
+       else {
+           $komi = 5.5;
+       }
+    }
+
+    print $prog_in  "boardsize $size\n";
+    eat_no_response($prog_out);
+    print $prog_in  "komi $komi\n";
+    eat_no_response($prog_out);
+
+    if (defined($stable)) {
+        print $stable_in "komi $komi\n";
+        eat_no_response($stable_out);
+        print $stable_in "boardsize $size\n";
+        eat_no_response($stable_out);
+    }
+
+    if (defined($randseed)) {
+        print $prog_in "set_random_seed $randseed\n";
+       eat_no_response($prog_out);
+    } else {
+        print $prog_in "get_random_seed\n";
+       $randseed = eat_one_line($prog_out);
+        $randseed =~ s/^= //smg;
+       print "random seed $randseed\n";
+    }
+
+    if (defined($stable)) {
+        print $stable_in "set_random_seed $randseed\n";
+        eat_no_response($stable_out);
+    }
+
+    undef $randseed;   #if more than one game, get a new seed next time.
+
+    print SGFFILEHANDLE "(;GM[1]FF[4]RU[Japanese]SZ[$size]HA[$handicap]KM[$komi]"
+       if defined $sgffilename;
+
+    my $pass = 0;
+    $move = "";
+
+    if ($handicap < 2) {
+       $toplay = "black";
+    }
+    else {
+       $toplay = "white";
+       print $prog_in "fixed_handicap $handicap\n";
+
+       $handicap_stones = eat_handicap($prog_out);
+       my $stable_stones = $handicap_stones;
+
+        if (defined($stable)) {
+           print $stable_in "fixed_handicap $handicap\n";
+           $stable_stones = eat_handicap($stable_out);
+       }
+
+       if ($stable_stones ne $handicap_stones) {
+           print "Handicap discrepancy:\n";
+           print "Test:   $handicap_stones\n";
+           print "Stable: $stable_stones\n";
+       }
+
+       if (defined $sgffilename) {
+           print SGFFILEHANDLE $handicap_stones;
+       }
+    }
+
+    $movenum = 1;
+    while ($pass < 2) {
+       print $prog_in "genmove_$toplay\n";
+       $move = eat_move($prog_out);
+
+       if (defined($stable)) {
+           print $stable_in "genmove_$toplay\n" if defined($stable);
+           $stable_move = eat_move($stable_out);
+           print $stable_in "undo\n";
+           eat_no_response($stable_out);
+       }
+
+       if ($move ne $stable_move and defined ($stable)) {
+           print "At move $movenum, $toplay\:\n";
+           print "Test version played   $move\n";
+           print "Stable version played $stable_move\n";
+           if ($verbose eq 2) {
+               print $prog_in "showboard\n";
+               print eat_response($prog_out);
+           }
+       } else {
+           print "$toplay plays $move\n" if $verbose;
+       }
+
+       $sgfmove = standard_to_sgf($move);
+       my $tpc = "B"; #toplay char
+       $tpc = "W" if ($toplay eq "white");
+       print SGFFILEHANDLE ";$tpc\[$sgfmove\]\n" if defined $sgffilename;
+
+       print $stable_in "$toplay $move\n" if defined($stable);
+       eat_no_response($stable_out) if defined($stable);
+
+       if ($toplay eq "black") {
+           $toplay = "white";
+       } else {
+           $toplay = "black";
+       }
+
+       if ($move =~ /PASS/i) {
+           $pass++;
+       } else {
+           $pass = 0;
+       }
+
+       if ($verbose > 2) {
+           print $prog_in "showboard\n";
+           eat_no_response($prog_out);
+           if (defined($stable)) {
+               print $stable_in "showboard\n";
+               eat_no_response($stable_out);
+           }
+       }
+
+       check_matcher($prog_in, $prog_out) if !defined($noilcheck);
+       $movenum++;
+    }
+    print $prog_in "estimate_score\n";
+    $result = eat_score($prog_out);
+    if (defined($stable)) {
+        print $stable_in "estimate_score\n";
+       my $stable_result = eat_score($stable_out);
+       print "scoring discrepancy. Stable score: $stable_result.\n" if ($stable_result ne $result);
+    }
+
+    print "Result: $result\n";
+    print $prog_in "quit\n";
+    print $stable_in "quit\n" if defined($stable);
+
+    if (defined $sgffilename) {
+       print "sgf file: $sgffile\n";
+       print SGFFILEHANDLE ")";
+       close SGFFILEHANDLE;
+       $game_list{$sgffile} = $result;
+    }
+    $games-- if $games > 0;
+
+    #make sure gnugo dies correctly.
+    close $prog_in;
+    close $prog_out;
+    close $stable_in if defined($stable);
+    close $stable_out if defined($stable);
+    waitpid $pidp, 0;
+    waitpid $pids, 0;
+
+    print "games remaining: $games\n";
+}
+
+if (defined $sgffilename) {
+  my $index_out  = new FileHandle;
+  open ($index_out, "> " . index_name($sgffilename));
+  print $index_out
+"<HTML><HEAD><TITLE>game results</TITLE></HEAD>
+<BODY><H3>Game Results</H3>
+<H4>White: ".html_encode($program)."</H4>
+<H4>Black: ".html_encode($program)."</H4>
+<TABLE border=1>
+ <TR>
+  <TD>SGF file</TD>
+  <TD>Result</TD>
+ </TR>
+";
+ foreach (sort by_result keys(%game_list)) {
+    print $index_out "<TR><TD><A href=\"$_\">$_</A></TD>" .
+               "<TD>".html_encode(game_result($_))."</TD></TR>\n";
+  }
+  print $index_out "</TABLE></BODY></HTML>\n";
+}
+
+exit;
+#all done here.
+
+sub game_result {
+  $_ = shift;
+  $_ = $game_list{$_};
+  #i.e.:  B+13.5 (upper bound: -13.5, lower: -13.5)|B+13.5 (upper bound: -13.5, lower: -13.5)
+  #Make sure that all 4 values are the same.  I've not seen them different yet.
+  #If they are ever different, need to improve the HTML output (now just -999) -
+  # an explanation of the score mismatch problem would be appropriate.
+  $_ =~ /^.*upper bound..([0-9+.\-]*)..lower..\1.\|.*upper bound..\1..lower..\1./;
+  if (defined($1)) {
+    return $1;
+  } else {
+    return -999;
+  }
+}
+
+sub by_result {
+  game_result($a) <=> game_result($b) || $a cmp $b;
+}
+
+sub html_encode {
+  #print shift;
+  my $r = shift;
+  $r =~ s/&/&amp;/g;
+  $r =~ s/</&lt;/g;
+  $r =~ s/>/&gt;/g;
+  return $r;
+}
+
+sub eat_no_response {
+    my $h = shift;
+
+# ignore empty lines
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+        $line =~ s/(\s|\n)*$//smg;
+    }
+}
+
+sub eat_response {
+    my $h = shift;
+    my $response = "";
+# ignore empty lines
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+        $line =~ s/(\s|\n)*$//smg;
+    }
+    while ($line ne "") {
+       $response = "$response$line\n";
+       chop($line = <$h>) or die "No response!";
+        $line =~ s/(\s|\n)*$//smg;
+    }
+    return $response;
+}
+
+sub eat_one_line {
+    my $h = shift;
+# ignore empty lines
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+        $line =~ s/(\s|\n)*$//smg;
+    }
+    return $line;
+}
+
+sub eat_move {
+    my $h = shift;
+# ignore empty lines
+    my $line = "";
+    while ($line eq "") {
+       if (!defined($line = <$h>)) {
+           print SGFFILEHANDLE ")";
+           close SGFFILEHANDLE;
+           die "Engine crashed!\n";
+       }
+        $line =~ s/(\s|\n)*$//smg;
+    }
+    my ($equals, $move) = split(' ', $line, 2);
+    $line = <$h>;
+    defined($move) or confess "no move found: line was: '$line'";
+    return $move;
+}
+
+sub eat_handicap {
+    my $h = shift;
+    my $sgf_handicap = "AB";
+# ignore empty lines, die if process is gone
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+    }
+    @vertices = split(" ", $line);
+    foreach $vertex (@vertices) {
+       if (!($vertex eq "=")) {
+           $vertex = standard_to_sgf($vertex);
+           $sgf_handicap = "$sgf_handicap\[$vertex\]";
+       }
+    }
+    return "$sgf_handicap;";
+}
+
+sub eat_score {
+    my $h = shift;
+# ignore empty lines, die if process is gone
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+       $line =~ s/^\s*//msg;
+       $line =~ s/\s*$//msg;
+    }
+    $line =~ s/\s*$//;
+    my ($equals, $result) = split(' ', $line, 2);
+    $line = <$h>;
+    return $result;
+}
+
+sub standard_to_sgf {
+    for (@_) { confess "Yikes!" if !defined($_); }
+    for (@_) { tr/A-Z/a-z/ };
+    $_ = shift(@_);
+    /([a-z])([0-9]+)/;
+    return "tt" if $_ eq "pass";
+
+    $first = ord $1;
+    if ($first > 104) {
+       $first = $first - 1;
+    }
+    $first = chr($first);
+    $second = chr($size+1-$2+96);
+    return "$first$second";
+}
+
+sub rename_sgffile {
+    my $nogames = int shift(@_);
+    $_ = shift(@_);
+    s/\.sgf$//;
+    # Annoying to loose _001 on game #1 in multi-game set.
+    # Could record as an additional parameter.
+    # return "$_.sgf" if ($nogames == 1);
+    return sprintf("$_" . "_%03d.sgf", $nogames);
+}
+
+sub index_name {
+    $_ = shift;
+    s/\.sgf$//;
+    return $_ . "_index.html";
+}
+
+sub check_matcher {
+    #check for illegal transitions, and print things if they happen
+    my $in = shift;
+    my $out = shift;
+    my $line = "";
+    my $legality = "illegal";
+    my $vertex = " ";
+    my $new_status = " ";
+    my $old_status;
+    my $il_vertex = "";
+    my $il_move = "";
+
+    #send command
+    print $in "dragon_status\n";
+
+    while ($line eq "") {
+        chop($line = <$out>);
+       $line =~ s/^\s*//smg;
+       $line =~ s/\s*$//smg;
+    }
+
+    while ($line ne "")
+    {
+        print "parsing a line\n" if ($verbose);
+        $line =~ s/= //g;      #zap the "= " at the front of the response
+       $line =~ s/\n//g;       #zap newlines...
+       $line =~ s/://g;        #zap the :
+       print $line . "\n" if ($verbose);
+       ($vertex, $new_status) = split(" ", $line);     #and split on spaces
+                                                       #extra get trashed
+       $old_status = $match_hist{$vertex} if (exists($match_hist{$vertex}));
+
+       #debug output
+       if ($verbose > 1)
+       {
+           print "Vertex: $vertex\n";
+           print "Old Status: $old_status\n" if (exists($match_hist{$vertex}));
+           print "New Status: $new_status\n";
+       }
+
+       #if it's new, we don't care
+       if (!exists($match_hist{$vertex})) {
+           print "$vertex is new.\n" if ($verbose > 0);
+           $match_hist{$vertex} = $new_status;
+           next;
+       }
+
+       #ok, so it's old
+
+       $legality = "illegal";
+       if ($old_status eq "critical") {$legality = "legal"};
+       if ($new_status eq "critical") {$legality = "legal"};
+       if ($new_status eq "unknown") {$legality = "legal"};
+       if ($old_status eq "unknown") {
+           if ($new_status eq "alive") {$legality = "legal";}
+           if ($new_status eq "critical") {$legality = "legal";}
+       }
+       if ($old_status eq "alive" and $new_status eq "dead") {
+           $legality = "killed";
+       }
+
+       if ($match_hist{$vertex} eq $new_status)
+       {
+           #state didn't change -- valid result
+           print "$vertex remained unchanged.\n" if ($verbose > 0);
+       } else
+       {
+           #state changed
+           if ($legality eq "legal")
+           {
+               #legal state change
+               if ($verbose > 1)
+               {
+                   print "Legal state change:\n";
+                   print "Games remaining: $games\n";
+                   print "Move: $movenum\n";
+                   print "Vertex: $vertex\n";
+                   print "Old Status: $old_status\n";
+                   print "New Status: $new_status\n";
+                   print "\n";
+               }
+           } else
+           {
+               #illegal state change -- alive to dead or vice versa
+               print "Illegal state change:\n";
+               print "Games remaining: $games\n";
+               print "Move: $movenum\n";
+               print "Vertex: $vertex\n";
+               print "Old Status: $old_status\n";
+               print "New Status: $new_status\n";
+               print "\n";
+
+               #now print gtp output
+               #FIXME: doesn't work with --loadsgf because we don't have
+               #the move list available (it's hidden by using GTP loadsgf).
+               #FIXME: currently, only produces GTP output for one transition
+               #per move.  This is because we have to finish parsing the
+               #entire output of dragon_status before dealing with finding
+               #missed attacks.  Using arrays instead would fix it.
+               if ($legality eq "killed" and !defined($loadfile)) {
+                   #The type we deal with now.
+                   #FIXME: check for defensive errors too.
+                   $il_move = $move;
+                   $il_vertex = $vertex;
+               }
+           }
+           $match_hist{$vertex} = $new_status;
+       }
+    } continue {
+        chop($line = <$out>);
+    }
+
+    if ($il_move ne "") {
+        print "attempting gtp output.\n";
+        #undo the move, check owl_does_attack
+        #and owl_attack, if they disagree,
+        #output a regression test.
+        print $in "undo\n";
+        eat_no_response($out);
+        my $oa_result = "";
+        my $oda_result = "";
+        print $in "owl_attack $il_vertex\n";
+        $oa_result = eat_one_line($out);
+        print "owl_attack $il_vertex\: $oa_result\n";
+        print $in "owl_does_attack $il_move $il_vertex\n";
+       $oda_result = eat_one_line($out);
+       print "owl_does_attack $il_move $il_vertex\: $oda_result\n";
+
+       #now try to do something with it
+       if ($oa_result eq "= 0" and $oda_result ne "= 0") {
+           print "found a missed attack.\n\n";
+           print "loadsgf $sgffile $movenum\n";
+           print "owl_attack $il_vertex\n";
+           print "#$oa_result\n";
+           print "#? [1 $move]*\n\n";
+       } else {
+           print "no missed attack found.\n\n";
+       }
+
+       #cancel the undo
+       my $last_played = "black";
+       if ($toplay eq "B") { $last_played = "white"; }
+       print $in "genmove_$last_played\n";
+       eat_move($out);
+    }
+
+    print "\n" if ($verbose > 0);
+}
+
diff --git a/interface/gtp_examples/metamachine.c b/interface/gtp_examples/metamachine.c
new file mode 100644 (file)
index 0000000..c5b42b4
--- /dev/null
@@ -0,0 +1,435 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3             *
+ * or (at your option) any later version.                            *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This program sits between a GTP client and a GTP engine,
+ * passing commands back and forth and modifying them in 
+ * some cases.
+ *
+ * To the client it appears to be a GTP engine. 
+ *                
+ *             stdin             pipe a
+ *  GTP client ----> metamachine -----> GTP engine
+ *             <----             <-----
+ *            stdout             pipe b
+ *
+ * Most commands are passed verbatim to the engine. The
+ * exception is gg_genmove, which is intercepted then
+ * processed differently. The top two moves are both
+ * tried, the position evaluated by estimate_score,
+ * and the move yielding the higher score is selected.
+ *
+ * Usage: no arguments gives normal GTP behavior.
+ * 'metamachine --debug' sends diagnostics to stderr.  */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+void error(const char *msg);
+void gprintf(FILE *outputfile, const char *fmt, ...);
+void trace(const char *fmt, ...);
+void tell_gnugo(char *gnugo_line, const char *msg);
+
+int boardsize = 19;
+char delimiters[] = " \t\r\n";
+char gnugo_line[128], client_line[128];
+FILE *to_gnugo_stream, *from_gnugo_stream;
+
+int debug = 0;
+
+#define EMPTY        0
+#define WHITE        1
+#define BLACK        2
+
+#define GTP_BUFSIZE  1000
+
+void ask_gnugo(char *line, int verbose, const char *msg);
+
+int
+main(int argc, char *const *argv)
+{
+  int pfd_a[2];
+  int pfd_b[2];
+  int id;
+  int k;
+  char command[GTP_BUFSIZE];
+
+  for (k = 1; k < argc; k++)
+    if (argc > 1 && strstr(argv[k], "debug"))
+      debug = 1;
+  if (pipe(pfd_a) == -1)
+    error("can't open pipe a");
+  if (pipe(pfd_b) == -1)
+    error("can't open pipe b");
+  switch (fork()) {
+  case -1:
+    error("fork failed (try chopsticks)");
+  case 0:
+    /* Attach pipe a to stdin */
+    if (dup2(pfd_a[0], 0) == -1) 
+      error("dup pfd_a[0] failed");
+    /* attach pipe b to stdout" */
+    if (dup2(pfd_b[1], 1) == -1)
+      error("dup pfd_b[1] failed");
+    execlp("gnugo", "gnugo", "--mode", "gtp", "--quiet", NULL);
+    error("execlp failed");
+  }
+  /* Attach pipe a to to_gnugo_stream  */
+  to_gnugo_stream = fdopen(pfd_a[1], "w");
+  /* Attach pipe b to from_gnugo_stream */
+  from_gnugo_stream = fdopen(pfd_b[0], "r");
+  
+  while (1) {
+    char *p;
+    int n;
+
+    if (!fgets(client_line, GTP_BUFSIZE, stdin)
+       || (strstr(client_line, "quit") == client_line)) {
+      tell_gnugo("quit\n", "a");
+       return 1;
+    }
+
+    /* remove comments */
+    if ((p = strchr(client_line, '#')) != NULL)
+      *p = 0;
+    
+    p = client_line;
+
+    /* Look for an identification number. */
+    if (sscanf(p, "%d%n", &id, &n) == 1)
+      p += n;
+    else
+      id = -1; /* No identification number. */
+    trace("id = %d\n", id);
+
+    /* Look for command name. */
+    if (sscanf(p, " %s %n", command, &n) < 1)
+      continue; /* Whitespace only on this line, ignore. */
+    p += n;
+    trace("command: %s\n", command);
+
+    if (!strncmp(command, "boardsize", 9)) {
+      char *token;
+      tell_gnugo(client_line, "b");
+      ask_gnugo(gnugo_line, 1, "1");
+
+      token = strtok(client_line, delimiters);
+      token = strtok(NULL, delimiters);
+      boardsize = atoi(token);
+    }
+    else if (!strncmp(command, "gg_genmove", 10)) {
+      int move_i[10], move_j[10];
+      float move_value[10], position_value[10];
+      int moves_considered;
+      int k;
+      char *token;
+      int line_length = 0;
+      int color;
+
+      if (strstr(client_line, "black"))
+       color = BLACK;
+      else if (strstr(client_line, "white"))
+       color = WHITE;
+      else {
+       color = EMPTY;
+       printf("?\n\n");
+      }
+
+      if (color == BLACK)
+       tell_gnugo("top_moves_black\n", "c");
+      else 
+       tell_gnugo("top_moves_white\n", "d");
+
+      ask_gnugo(gnugo_line, 0, "2");
+      token = strtok(gnugo_line, delimiters);
+      for (k = 0; k < 10; k++) {
+       move_i[k] = -1;
+       move_j[k] = -1;
+       move_value[k] = 0.0;
+      }
+      for (k = 0; k < 10; k++) {
+       token = strtok(NULL, delimiters);
+       if (!token)
+         break;
+       string_to_location(boardsize, token, move_i+k, move_j+k);
+       token = strtok(NULL, delimiters);
+       if (!token)
+         break;
+       sscanf(token, "%f", move_value+k);
+       trace("move %d: %m valued %f\n", k,
+                 move_i[k], move_j[k], move_value[k]);
+      }
+      moves_considered = k;
+      if (debug)
+       fprintf(stderr, "moves considered: %d\n",
+               moves_considered);
+      for (k = 0; k < 2 && k < moves_considered; k++) {
+       float upper, lower;
+       int n;
+
+       trace("%s %m\n", color == BLACK ? "black" : "white",
+                 move_i[k], move_j[k]);
+       gprintf(to_gnugo_stream, "%s %m\n", color == BLACK ? "black" : "white",
+               move_i[k], move_j[k]);
+       fflush(to_gnugo_stream);
+       ask_gnugo(gnugo_line, 0, "3");
+       tell_gnugo("estimate_score\n", "e");
+       ask_gnugo(gnugo_line, 0, "4");
+       strtok(gnugo_line, "()\n");
+       token = strtok(NULL, "()\n");
+       trace("%s\n", token);
+       sscanf(token, "upper bound: %f, lower: %f%n",
+              &upper, &lower, &n);
+       if (n < 2)
+         error("can't read territory");
+       trace("upper %f, lower %f\n", upper, lower);
+       tell_gnugo("undo\n", "f");
+       ask_gnugo(gnugo_line, 0, "5");
+       fflush(stdout);
+       if (color == BLACK)
+         position_value[k] = - upper;
+       else
+         position_value[k] = lower;
+       trace("position value %f\n", position_value[k]);
+      }
+      if (moves_considered == 0) {
+       if (id == -1)
+         gprintf(stdout, "= PASS\n\n");
+       else
+         gprintf(stdout, "=%d PASS\n\n", id);
+       fflush(stdout);
+      }
+      else if (moves_considered == 1
+              || position_value[0] > position_value[1]) {
+       gprintf(to_gnugo_stream, "%s %m\n", color == BLACK ? "black" : "white",
+               move_i[0], move_j[0]);
+       ask_gnugo(gnugo_line, 0, "6");
+       if (id == -1)
+         gprintf(stdout, "= %m\n\n", move_i[0], move_j[0]);
+       else
+         gprintf(stdout, "=%d %m\n\n", id, move_i[0], move_j[0]);
+       fflush(stdout);
+      }
+      else {
+       gprintf(to_gnugo_stream, "%s %m\n", color == BLACK ? "black" : "white",
+               move_i[1], move_j[1]);
+       ask_gnugo(gnugo_line, 0, "7");
+       if (id == -1)
+         gprintf(stdout, "= %m\n\n", move_i[1], move_j[1]);
+       else
+         gprintf(stdout, "=%d %m\n\n", id, move_i[1], move_j[1]);
+       fflush(stdout);
+      }
+    }
+    else {
+      tell_gnugo(client_line, "g");
+      ask_gnugo(gnugo_line, 1, "8");
+    }
+    /* loadsgf commands could change the boardsize, so we get
+     * it from the engine, after the command is run. */
+    if (!strncmp(command, "loadsgf", 7)) {
+      tell_gnugo("query_boardsize\n", "i");
+      ask_gnugo(gnugo_line, 0, "10");
+      if (!sscanf(gnugo_line, "= %d", &boardsize))
+       error("can't get boardsize");
+      trace("setting boardsize %d\n", boardsize);
+      fflush(stderr);
+    }
+  }
+}
+
+/* bark and barf */
+
+void
+error(const char *msg)      
+{
+  fprintf(stderr, "metamachine: %s\n", msg);
+  tell_gnugo("quit\n", msg);
+  abort();
+}
+
+/* Send a GTP command to the engine. */
+
+void
+tell_gnugo(char *gnugo_line, const char *msg)
+{
+  gprintf(to_gnugo_stream, gnugo_line);
+  fflush(to_gnugo_stream);
+  if (debug) {
+    fprintf(stderr, "%s: %s", msg, gnugo_line);
+    fflush(stderr);
+  }
+}
+
+/* Obtains the engine's response to a GTP command. If verbose is true,
+ * the reply is echoed to stdout.
+ */
+
+void
+ask_gnugo(char *gnugo_line, int verbose, const char *msg)
+{
+  int line_length = 0;
+  char line[GTP_BUFSIZE];
+
+  while (line_length != 1) {
+    if (!fgets(line, 128, from_gnugo_stream))
+      error("can't get response");
+    line_length = strlen(line);
+    if (line_length > 1 
+       && (line[0] == '=' || line[0] == '?'))
+      strncpy(gnugo_line, line, 128);
+    if (verbose)
+      printf(line);
+    if (debug)
+      fprintf(stderr, "%s: %s\n", msg, gnugo_line);
+  }
+  if (verbose)
+    fflush(stdout);
+  fflush(stderr);
+}
+
+
+/* Adapted from GNU Go. Formatted output with %m format. */
+
+void 
+gprintf(FILE *outputfile, const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  vgprintf(outputfile, fmt, ap);
+  fflush(outputfile);
+  va_end(ap);
+}
+
+/* print diagnostic */
+
+void
+trace(const char *fmt, ...)
+{
+  va_list ap;
+  if (debug) {
+    va_start(ap, fmt);
+    vgprintf(stderr, fmt, ap);
+    fflush(stderr);
+    va_end(ap);
+  }
+}
+
+int
+vgprintf(FILE *outputfile, const char *fmt, va_list ap)
+{
+  for ( ; *fmt; ++fmt) {
+    if (*fmt == '%') {
+      switch (*++fmt) {
+      case 'c':
+       {
+         /* rules of promotion => passed as int, not char */
+
+         int c = va_arg(ap, int);
+         putc(c, outputfile);
+         break;
+       }
+      case 'd':
+       {
+         int d = va_arg(ap, int);
+         fprintf(outputfile, "%d", d);
+         break;
+       }
+      case 'f':
+       {
+         double f = va_arg(ap, double); /* passed as double, not float */
+         fprintf(outputfile, "%.2f", f);
+         break;
+       }
+      case 's':
+       {
+         char *s = va_arg(ap, char *);
+         fputs(s, outputfile);
+         break;
+       }
+      case 'm':
+      case 'M':
+       {
+         char movename[4];
+         int m = va_arg(ap, int);
+         int n = va_arg(ap, int);
+         if (m == -1 && n == -1)
+           fputs("PASS", outputfile);
+         else if (m < 0 || n < 0 || m >= 19 || n >= 19)
+           fprintf(outputfile, "[%d,%d]", m, n);
+         else {
+           /* Generate the move name. */
+           if (n < 8)
+             movename[0] = n + 65;
+           else
+             movename[0] = n + 66;
+           if (*fmt == 'm')
+             sprintf(movename+1, "%d", boardsize-m);
+           else
+             sprintf(movename+1, "%-2d", boardsize-m);
+           fputs(movename, outputfile);
+         }
+         break;
+       }
+      default:
+       {
+         fprintf(outputfile, "\n\nUnknown format character: '%c'\n", *fmt);
+         abort();
+       }
+      }
+    }
+    else
+      putc(*fmt, outputfile);
+  }
+  fflush(outputfile);
+}
+
+/* Extracts coordinates from a location in algebraic notation */
+
+int
+string_to_location(int boardsize, char *str, int *m, int *n)
+{
+  if (*str == '\0')
+    return 0;
+
+  if (!isalpha((int) *str))
+    return 0;
+  *n = tolower((int) *str) - 'a';
+  if (tolower((int) *str) >= 'i')
+    --*n;
+  if (*n < 0 || *n > boardsize - 1)
+    return 0;
+
+  if (!isdigit((int) *(str+1)))
+    return 0;
+  *m = boardsize - atoi(str + 1);
+  if (*m < 0 || *m > boardsize - 1)
+    return 0;
+
+  return 1;
+}
+
diff --git a/interface/gtp_examples/sgf2tst b/interface/gtp_examples/sgf2tst
new file mode 100644 (file)
index 0000000..f68b045
--- /dev/null
@@ -0,0 +1,119 @@
+#! /usr/bin/perl -w
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.        #
+#                                                               #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/ #
+# for more information.                                         #
+#                                                               #
+# Copyright 1999, 2000, 2001 by the Free Software Foundation.   #
+#                                                               #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License   #
+# as published by the Free Software Foundation - version 3,     #
+# or (at your option) any later version.                        #
+#                                                               #
+# This program is distributed in the hope that it will be       #
+# useful, but WITHOUT ANY WARRANTY; without even the implied    #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR       #
+# PURPOSE.  See the GNU General Public License in file COPYING  #
+# for more details.                                             #
+#                                                               #
+# You should have received a copy of the GNU General Public     #
+# License along with this program; if not, write to the Free    #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,   #
+# Boston, MA 02111, USA.                                        #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+
+# This is a script which converts a game record annotated with test cases to
+# the *.tst format.
+# 
+# The script currently only processes SGF files without variations, but that's
+# quite useful enough when annotating games.
+#
+# All GTP commands are put into the SGF comment field.  The comment field is
+# interpretted in order:
+# 
+#  1) Lines starting with "#" are copied into the tst file.
+#  2) owl_attack, owl_defend, attack, defend, and eval_eye commands can 
+#     be put in such as:
+#         owl_attack A1
+#         1 G2
+#  3) Otherwise, a single line is interpreted as the correct answer, with
+#     the appropriate "gg_genmove" directive added automatically.
+# 
+# See regression/trevora.tst for examples. The sgf files for this test
+# are in regression/games/trevor/auto/a??.sgf
+
+use strict;
+use warnings;
+
+local $/;
+undef $/;
+
+my $autoprobnum = 100;
+my $increment = 10;
+
+while (<>) {
+  my $content = $_;
+  if ($content !~ /C\[/) {
+    print STDERR "Warning : $ARGV : No comments.\n";
+    next;
+  }
+
+  print "\n\n# $ARGV problems:\n\n";
+  
+  $content =~ s/^\(;//;
+  $content .= ';';
+  
+  my $DEBUG = 0;  
+  
+  my $i=0;
+  my $done=0;
+  while ($content =~ /(.*?);/sg  && ($done=1)) {  # for each node.
+    $i++;
+    my $node = $1;
+    print "CONTENT:'$content':CONTENT\n\n" if $DEBUG;
+    print "NODE:'$node':NODE\n\n" if $DEBUG;
+    next if $node !~ /C\[(.*)\]/s ;
+    my $comments = "";
+    my $command = "";
+    my $comment = $1;
+    my ($othercolor) = $node =~ /(W|B)\[/       or die "No W or B move here: $ARGV($i): $node";
+    while ($comment =~ /^(.*)$/mg) { # i.e. for each line of comment
+      my $line = $1;
+      $line =~ s/\s*$//;
+      $line =~ s/^\s*//;
+      if ($line =~ /^#/) {
+        $comments .= "$line\n";
+        next;
+      }
+      $command .= "loadsgf $ARGV $i\n";
+      my $probnum = $autoprobnum;
+      if ($line =~ /^([0-9]*)\s*((?:owl_attack|attack|owl_defend|defend|eval_eye).*)$/) {
+        if ($1 eq "") {
+          $probnum = $autoprobnum;
+        } else {
+          $probnum = $1;
+          $autoprobnum -= $increment;
+        }
+
+        $command .= "$probnum $2\n";  #ah, this line is a specific gtp command.
+        $comment =~ /^(.*)$/mg;          #read next line for answer.
+        $line = $1;
+        $line =~ s/\s*$//;
+        $line =~ s/^\s*//;
+      } else {
+        $command .= "$probnum gg_genmove " . ($othercolor eq 'B' ? 'white' : 'black') . "\n";
+      }
+      $autoprobnum += $increment;
+      $command .= "#? [$line]*\n";
+      print $command if $DEBUG;
+    }
+    print "$comments$command\n\n";
+  }
+  
+}
+
diff --git a/interface/gtp_examples/ttgo.pm b/interface/gtp_examples/ttgo.pm
new file mode 100644 (file)
index 0000000..e9a7161
--- /dev/null
@@ -0,0 +1,289 @@
+#!/usr/bin/perl -w
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.        #
+#                                                               #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/ #
+# for more information.                                         #
+#                                                               #
+# Copyright 1999, 2000, 2001 by the Free Software Foundation.   #
+#                                                               #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License   #
+# as published by the Free Software Foundation - version 3,     #
+# or (at your option) any later version.                        #
+#                                                               #
+# This program is distributed in the hope that it will be       #
+# useful, but WITHOUT ANY WARRANTY; without even the implied    #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR       #
+# PURPOSE.  See the GNU General Public License in file COPYING  #
+# for more details.                                             #
+#                                                               #
+# You should have received a copy of the GNU General Public     #
+# License along with this program; if not, write to the Free    #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,   #
+# Boston, MA 02111, USA.                                        #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+package ttgo;
+require Exporter;
+
+use strict;
+
+
+our @ISA    = qw(Exporter);
+our @EXPORT = qw(ttNewGame ttShowBoard ttPlaceStone ttGetBoard ttScore);
+
+my @bd = ();
+my @sbd = ();   # working board
+my $white = 1;
+my $black = 2;
+my $bs;
+my @letter = qw ( A B C D E F G H J K L M N O P Q R S T U V W X Y Z );
+my %tocol = ( 'b' => 2, 'B' => 2, 'w' => 1, 'W' => 1  );
+my %toix = ();
+foreach my $ix (0 .. $#letter) {
+    $toix{ $letter[$ix] } = $ix;
+}
+
+my %hashed_boards = ();  # for convenient rep testing
+my @all_boards = ();     # for move takebacks
+
+
+my %tovisual = ( 2 => 'W',  1 => 'B', 0 => '+' );
+
+my @dir = ();
+
+
+
+sub ttNewGame
+{
+    ($bs) = @_;
+
+    my $s = ($bs+2) * ($bs+1);
+
+    foreach my $i (0 .. $s-1) {
+       $bd[$i] = 3;                            # w+b
+    }
+
+    foreach my $x (0 .. $bs - 1) {
+       foreach my $y (0 .. $bs - 1) {
+           $bd[ ($y+1) * ($bs+1) + $x ] = 0;   # empty
+       }
+    }
+
+    @dir = ();
+
+    $dir[0] = -1;
+    $dir[1] =  1;
+    $dir[2] = $bs + 1;
+    $dir[3] = -($bs + 1);
+
+    push( @all_boards, join(',', @bd) );
+}
+
+
+
+sub ttPlaceStone
+{
+    my ($c, $loc) = @_;
+
+    my @prev_board = @bd;        # to take back if needed
+    $hashed_boards{join(',',@prev_board)} = 1;  # hash previous board
+
+    if ($loc eq 'PASS') {
+       return(0);
+    }
+
+    $loc =~ /^(.)(.*)/;
+    my $y = $bs - $2;
+    my $x = $toix{$1};
+
+    my $sq = ($y+1) * ($bs+1) + $x;
+
+
+    # occupied?
+    # =========
+    if ($bd[ ($y+1) * ($bs+1) + $x ] != 0) {
+       print "Illegal move, square occupied\n";
+       return(1);
+    }
+
+    # Make move 
+    # =========
+    $bd[$sq] = $tocol{$c};
+
+    # did we capture anything?
+    # ========================
+    my $cc = $tocol{$c};   # current color
+    my $cap = 0;
+    foreach my $d (@dir) {
+       if ($bd[$sq+$d] == (3 ^ $cc)) {
+           @sbd = @bd;
+           my $lc = lib_count( 3 ^ $cc, $sq + $d );
+           if ($lc == 0) {
+               $cap = 1;
+               print "Capture possible\n";
+               capture( 3 ^ $cc, $sq+$d );
+           }
+       }
+    }
+
+    # if capture not possible, it might be suicide
+    # ============================================
+
+    if (!$cap) {   
+       $bd[$sq] = 0;   # make it empty again
+       @sbd = @bd;
+       $sbd[$sq] = $tocol{$c};
+       my $lc = lib_count($tocol{$c}, $sq );
+       print "liberty count = $lc\n";
+       if ($lc == 0) {
+           print "Illegal move,  suicide!\n";
+           return(2);
+       }
+       # Make move
+       # =========
+       $bd[$sq] = $tocol{$c};    
+    }
+
+
+    if ( defined( $hashed_boards{ join(',',@bd) } ) ) {
+       print "Illegal move, repeated positions\n";
+       # @bd = @prev_board;
+       # return(0);        
+    }
+
+    push( @all_boards, join(',', @bd) );
+
+    ttScore();
+       
+    return 0;
+}
+
+
+
+
+sub lib_count
+{
+    my ($c, $sq) = @_;
+    my $count = 0;
+
+    foreach my $d (@dir) {
+       if ($sbd[ $sq + $d ] == 0) { 
+           $count++; 
+           $sbd[$sq + $d ] = 9;
+           next;
+       }
+       if ($sbd[ $sq + $d ] == 3)  { next; }
+       if ($sbd[ $sq + $d ] == $c) { 
+           $sbd[$sq + $d ] = 9;
+           $count += lib_count( $c, $sq + $d );
+       }
+    }
+
+    return $count;
+}
+
+
+sub capture
+{
+    my ($c, $sq) = @_;
+
+    $bd[$sq] = 0;
+    foreach my $d (@dir) {
+       if ( $bd[ $sq + $d ] == $c ) {
+           capture( $c, $sq + $d );
+       }
+    }
+}
+
+
+
+sub ttShowBoard
+{
+    foreach my $y (0 .. $bs + 1) {
+       foreach my $x (0 .. $bs) {
+           printf ( "%2d", $bd[ $y * ($bs+1) + $x ] );
+       }
+       print "\n";
+    }
+
+    print "\n";
+}
+
+
+
+sub ttGetBoard
+{
+    my @tbd = ();
+
+    foreach my $y (0 .. $bs-1) {
+       foreach my $x (0 .. $bs-1) {
+           push @tbd, $tovisual{ $bd[ ($y+1) * ($bs+1) + $x ] };
+       }
+    }
+    return @tbd;
+}
+
+
+
+sub ttScore
+{
+    @sbd = @bd;
+
+    my $who = 0;
+    my @ter = (0, 0, 0);
+    my @stc = (0, 0, 0);
+
+    foreach my $sq (0 .. (($bs+2) * ($bs+1))-1 ) {
+       if ( $bd[$sq]==1 || $bd[$sq]==2 ) { $stc[$bd[$sq]] ++; }
+       if ($sbd[$sq] == 0) {
+           my ($cnt, $who) = count_space($sq);
+           if ($who == 1 || $who == 2) {
+               $ter[$who] += $cnt;
+           }
+       }  
+    }
+
+    print "white stones=$stc[$white]   territory=$ter[$white]\n";
+    print "black stones=$stc[$black]   territory=$ter[$black]\n";
+
+    return( ($stc[$black] + $ter[$black])-($stc[$white] + $ter[$white]) );
+}
+
+
+
+
+# return count
+# ------------
+sub count_space
+{
+    my ($sq) = @_;
+    my $count = 0;
+    my $who = 0;
+
+    if ( $sbd[$sq] == 9 || $sbd[$sq] == 3) {
+       return (0,0);
+    } elsif ( $sbd[$sq] != 0 ) {
+       $who |= $sbd[$sq];
+       return( 0, $who);
+    } else {  # must be zero          
+       $count++;
+       $sbd[$sq] = 9;   # mark it
+       foreach my $d (@dir) {
+           my ($c, $w) = count_space( $sq + $d );
+           $count += $c;
+           $who |= $w;
+       }
+    }
+    return ( $count, $who );
+}
+
+
+1;
+
+
+
+
+
diff --git a/interface/gtp_examples/twogtp b/interface/gtp_examples/twogtp
new file mode 100644 (file)
index 0000000..b758228
--- /dev/null
@@ -0,0 +1,574 @@
+#! /usr/bin/perl -w
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007    #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+package GTP;
+
+use strict;
+
+my $debug = 0;
+
+sub exec_cmd {
+    my $hin = shift;
+    my $hout = shift;
+    my $cmd = shift;
+
+# send the command to the GTP program
+
+    print $hin "$cmd\n";
+
+# parse the response of the GTP program
+
+    my $line;
+    my $repchar;
+    my $result = "ERROR";
+    $line = <$hout>;
+    print STDERR "$hin 1:$line" if ($debug);
+    return "ERROR" unless (defined $line);
+    $line =~ s/\s*$//;
+    ($repchar, $result) = split(/\s*/, $line, 2);
+    print STDERR "$hin 2:repchar $repchar\n" if ($debug);
+    print STDERR "$hin 3:result $result\n" if ($debug);
+
+    $line = <$hout>;
+    while (!($line =~ /^\s*$/)) {
+       $result .= $line;
+       $line = <$hout>;
+    }
+    print STDERR "$hin 4:$line" if ($debug);
+    if ($repchar eq '?') {
+       return "ERROR";
+    }
+    return $result;
+}
+
+sub standard_to_sgf {
+
+    my $size = shift;
+    my $board_coords = shift;
+    $board_coords =~ tr/A-Z/a-z/;
+    return "" if ($board_coords eq "pass");
+    my $first  = substr($board_coords, 0, 1);
+    my $number = substr($board_coords, 1);
+    my $sgffirst;
+    if ($first gt 'i') {
+      $sgffirst = chr(ord($first) - 1);
+    } else {
+      $sgffirst = $first;
+    }
+    my $sgfsecond = chr(ord('a') + $size - $number);
+#   print "$board_coords, $sgffirst, $number, $sgfsecond\n";
+    return $sgffirst . $sgfsecond;
+}
+
+package GTP::Player;
+
+use strict;
+use Class::Struct;
+use FileHandle;
+use IPC::Open2;
+
+struct('GTP::Player' => {
+    'in'           => 'FileHandle',
+    'out'          => 'FileHandle',
+    'gtp_version'   => '$',
+}
+);
+
+sub init {
+    my $self = shift;
+    return $self;
+}
+
+sub initialize {
+    my $self = shift;
+    my $cmd = shift;
+
+    my $pid = open2($self->{out}, $self->{in}, $cmd);
+    $self->{gtp_version} = GTP::exec_cmd($self->{in},
+       $self->{out}, "protocol_version");
+    $self->{gtp_version} eq 1 or $self->{gtp_version} eq 2 or
+       die "Unsupported gtp version $self->{gtp_version}\n";
+    return $pid;
+}
+
+sub genmove {
+    my $self = shift;
+    my $color = shift;
+
+    my $cmd;
+    if ($self->{gtp_version} eq 1) {
+       $cmd = "genmove_";
+    } else {
+       $cmd = "genmove ";
+    }
+    if ($color =~ /^b/i) {
+       $cmd .= "black";
+    } elsif ($color =~ /^w/i) {
+       $cmd .= "white";
+    } else {
+       die "Illegal color $color\n";
+    }
+    my $move = GTP::exec_cmd($self->{in}, $self->{out}, $cmd);
+}
+
+sub black {
+    my $self = shift;
+    my $move = shift;
+    my $cmd;
+    if ($self->{gtp_version} eq 1) {
+       $cmd = "black ";
+    } else {
+       $cmd = "play black ";
+    }
+
+    GTP::exec_cmd($self->{in}, $self->{out}, $cmd . $move);
+}
+
+sub white {
+    my $self = shift;
+    my $move = shift;
+    my $cmd;
+    if ($self->{gtp_version} eq 1) {
+       $cmd = "white ";
+    } else {
+       $cmd = "play white ";
+    }
+
+    GTP::exec_cmd($self->{in}, $self->{out}, $cmd . $move);
+}
+
+sub komi {
+    my $self = shift;
+    my $komi = shift;
+
+    GTP::exec_cmd($self->{in}, $self->{out}, "komi $komi");
+}
+
+sub boardsize {
+    my $self = shift;
+    my $size = shift;
+
+    GTP::exec_cmd($self->{in}, $self->{out}, "boardsize $size");
+}
+
+sub clear_board {
+    my $self = shift;
+
+    GTP::exec_cmd($self->{in}, $self->{out}, "clear_board");
+}
+
+sub handicap {
+    my $self = shift;
+    my $handicap = shift;
+
+    my $stones;
+    $stones = GTP::exec_cmd($self->{in}, $self->{out}, "handicap $handicap");
+    return split(' ', $stones);
+}
+
+sub fixed_handicap {
+    my $self = shift;
+    my $handicap = shift;
+
+    my $stones;
+    $stones = GTP::exec_cmd($self->{in}, $self->{out}, "fixed_handicap $handicap");
+    return split(' ', $stones);
+}
+
+sub quit {
+    my $self = shift;
+
+    $self->{in}->print("quit\n");
+}
+
+sub showboard {
+    my $self = shift;
+    my $board;
+
+    $board = GTP::exec_cmd($self->{in}, $self->{out}, "showboard");
+
+    if ($self->{gtp_version} eq 2) {
+       print $board;
+    }
+}
+
+sub get_random_seed {
+    my $self = shift;
+
+    my $ret = GTP::exec_cmd($self->{in}, $self->{out}, "get_random_seed");
+    if ($ret eq "ERROR") {
+        return "unknown";
+    }
+    my ($result, $rest) = split(' ', $ret, 2);
+    return $result;
+}
+
+sub get_program_name {
+    my $self = shift;
+
+    my $name = GTP::exec_cmd($self->{in}, $self->{out}, "name");
+    my $version = GTP::exec_cmd($self->{in}, $self->{out}, "version");
+    return "$name $version";
+}
+
+sub score {
+    my $self = shift;
+
+    return GTP::exec_cmd($self->{in}, $self->{out}, "score");
+}
+
+sub final_score {
+    my $self = shift;
+
+    my $ret = GTP::exec_cmd($self->{in}, $self->{out}, "final_score");
+    my ($result, $rest) = split(' ', $ret, 2);
+    return $result;
+}
+
+package GTP::Game::Result;
+
+use strict;
+use Class::Struct;
+use FileHandle;
+
+struct('GTP::Game::Result' => {
+    'resultw'  => '$',
+    'resultb'  => '$'
+}
+);
+
+package GTP::Game;
+
+use strict;
+use Class::Struct;
+use FileHandle;
+
+struct('GTP::Game' => {
+    'black'            => 'GTP::Player',
+    'white'            => 'GTP::Player',
+    'size'             => '$',
+    'komi'             => '$',
+    'handicap'         => '$',
+    'handicap_stones'  => '@',
+    'moves'            => '@',
+    'result'           => 'GTP::Game::Result'
+}
+);
+
+my $verbose = 0;
+
+sub verbose {
+    my $self = shift;
+    my $verbose_arg = shift;
+
+    $verbose = $verbose_arg;
+}
+
+sub writesgf {
+    my $self    = shift;
+    my $sgffile = shift;
+
+    my $size = $self->size;
+
+    my $handle = new FileHandle;
+    $handle->open(">$sgffile") or
+       die "Can't write to $sgffile\n";
+    my $black_name = $self->black->get_program_name;
+    my $white_name = $self->white->get_program_name;
+    my $black_seed = $self->black->get_random_seed;
+    my $white_seed = $self->white->get_random_seed;
+    my $handicap = $self->handicap;
+    my $komi = $self->komi;
+    my $result = $self->{result}->resultw;
+
+    print $handle "(;GM[1]FF[4]RU[Japanese]SZ[$size]HA[$handicap]KM[$komi]RE[$result]\n";
+    print $handle "PW[$white_name (random seed $white_seed)]PB[$black_name (random seed $black_seed)]\n";
+    if ($handicap > 1) {
+       for my $stone (@{$self->handicap_stones}) {
+           printf $handle "AB[%s]", GTP::standard_to_sgf($self->size, $stone);
+       }
+       print $handle "\n";
+    }
+    my $toplay = $self->handicap < 2 ? 'B' : 'W';
+    for my $move (@{$self->moves}) {
+       my $sgfmove = GTP::standard_to_sgf($size, $move);
+        print $handle ";$toplay" . "[$sgfmove]\n";
+       $toplay = $toplay  eq 'B' ? 'W' : 'B';
+    }
+    print $handle ")\n";
+    $handle->close;
+}
+
+
+
+
+sub play {
+
+    my $self = shift;
+    my $sgffile = shift;
+
+    my $size     = $self->size;
+    my $handicap = $self->handicap;
+    my $komi     = $self->komi;
+
+    print "Setting boardsize and komi for black\n" if $verbose;
+    $self->black->boardsize($size);
+    $self->black->clear_board();
+    $self->black->komi($komi);
+
+    print "Setting boardsize and komi for white\n" if $verbose;
+    $self->white->boardsize($size);
+    $self->white->clear_board();
+    $self->white->komi($komi);
+
+    my $pass = 0;
+    my $resign = 0;
+    my ($move, $toplay, $sgfmove);
+
+    $pass = 0;
+    $#{$self->handicap_stones} = -1;
+    if ($handicap < 2) {
+
+      $toplay = 'B';
+
+    } else {
+
+      @{$self->handicap_stones} = $self->white->fixed_handicap($handicap);
+      for my $stone (@{$self->handicap_stones}) {
+         $self->black->black($stone);
+      }
+      $toplay = 'W';
+
+    }
+
+    $#{$self->moves} = -1;
+    while ($pass < 2 and $resign eq 0) {
+
+       if ($toplay eq 'B') {
+
+           $move = $self->black->genmove("black");
+           if ($move eq "ERROR") {
+               $self->writesgf($sgffile) if defined $sgffile;
+               die "No response!";
+           }
+           $resign = ($move =~ /resign/i) ? 1 : 0;
+           if ($resign) {
+               print "Black resigns\n" if $verbose;
+           } else {
+               push @{$self->moves}, $move;
+               print "Black plays $move\n" if $verbose;
+               $pass = ($move =~ /PASS/i) ? $pass + 1 : 0;
+               $self->white->black($move);
+           }
+           if ($verbose == 3) {
+               my $black_seed = $self->black->get_random_seed;
+               printf "Black seed $black_seed\n";
+           }
+           if ($verbose == 2) {
+               $self->white->showboard;
+           }
+
+           $toplay = 'W';
+
+        } else {
+
+           $move = $self->white->genmove("white");
+           if ($move eq "ERROR") {
+               $self->writesgf($sgffile) if defined $sgffile;
+               die "No response!";
+           }
+           $resign = ($move =~ /resign/i) ? 1 : 0;
+           if ($resign) {
+               print "White resigns\n" if $verbose;
+           } else {
+               push @{$self->moves}, $move;
+               print "White plays $move\n" if $verbose;
+               $pass = ($move =~ /PASS/i) ? $pass + 1 : 0;
+               $self->black->white($move);
+           }
+           if ($verbose == 3) {
+               my $white_seed = $self->white->get_random_seed;
+               printf "White seed $white_seed\n";
+           }
+           if ($verbose == 2) {
+               $self->black->showboard;
+           }
+           $toplay = 'B';
+
+        }
+    }
+
+    my $resultb;
+    my $resultw;
+    if ($resign) {
+       $resultb = $toplay eq 'B' ? 'B+R' : 'W+R';
+       $resultw = $resultb;
+    } else {
+       $resultw = $self->white->final_score;
+       $resultb = $self->black->final_score;
+    }
+    if ($resultb eq $resultw) {
+       print "Result: $resultw\n";
+    } else {
+       print "Result according to W: $resultw\n";
+       print "****** according to B: $resultb\n";
+    }
+    $self->{result} = new GTP::Game::Result;
+    $self->{result}->resultw($resultw);
+    $self->{result}->resultb($resultb);
+    $self->writesgf($sgffile) if defined $sgffile;
+}
+
+package GTP::Match;
+
+use strict;
+use Class::Struct;
+use FileHandle;
+
+struct('GTP::Match' => {
+    'black'    => 'GTP::Player',
+    'white'    => 'GTP::Player',
+    'size'     => '$',
+    'komi'     => '$',
+    'handicap' => '$'
+}
+);
+
+sub play {
+    my $self = shift;
+    my $games = shift;
+    my $sgffile = shift;
+
+    my $game = new GTP::Game;
+    $game->size($self->size);
+    $game->komi($self->komi);
+    $game->handicap($self->handicap);
+    $game->black($self->black);
+    $game->white($self->white);
+    $game->komi($self->komi);
+    my @results;
+    (my $sgffile_base = $sgffile) =~ s/\.sgf$//;
+    for my $i (1..$games) {
+        my $sgffile_game = sprintf "%s%03d.sgf", $sgffile_base, $i;
+       $game->play($sgffile_game);
+       my $result = new GTP::Game::Result;
+       $result->resultb($game->{result}->resultb);
+       $result->resultw($game->{result}->resultw);
+       push @results, $result;
+    }
+    return @results;
+}
+
+package main;
+
+use strict;
+use Getopt::Long;
+use FileHandle;
+
+my $white;
+my $black;
+my $size = 19;
+my $games = 1;
+my $komi;
+my $handicap = 0;
+my $sgffile = "twogtp.sgf";
+
+GetOptions(
+       "white|w=s"     => \$white,
+       "black|b=s"     => \$black,
+       "verbose|v=i"   => \$verbose,
+       "komi|km=f"     => \$komi,
+       "handicap|ha=i" => \$handicap,
+       "games|g=i"     => \$games,
+        "sgffile|f=s"  => \$sgffile,
+       "boardsize|size|s=i"    => \$size
+);
+
+GTP::Game->verbose($verbose);
+
+my $helpstring = "
+
+Run with:
+
+twogtp --white \'<path to program 1> --mode gtp [program options]\' \\
+       --black \'<path to program 2> --mode gtp [program options]\' \\
+       [twogtp options]
+
+Possible twogtp options:
+
+  --verbose 1 (to list moves) or --verbose 2 (to draw board)
+  --komi <amount>
+  --handicap <amount>
+  --size <board size>                     (default 19)
+  --games <number of games to play>       (-1 to play forever)
+  --sgffile <filename>
+";
+
+die $helpstring unless defined $white and defined $black;
+
+if (!defined $komi) {
+    if ($handicap > 0) {
+        $komi = 0.5;
+    } else {
+        $komi = 5.5;
+    }
+}
+
+# create GTP players
+
+my $black_pl = new GTP::Player;
+$black_pl->initialize($black);
+print "Created black GTP player\n" if $verbose;
+
+my $white_pl = new GTP::Player;
+$white_pl->initialize($white);
+print "Created white GTP player\n" if $verbose;
+
+my $match = new GTP::Match;
+$match->white($white_pl);
+$match->black($black_pl);
+$match->size($size);
+$match->komi($komi);
+$match->handicap($handicap);
+my @results = $match->play($games, $sgffile);
+
+my $i=0;
+for my $r (@results) {
+    $i++;
+    if ($r->resultb eq $r->resultw) {
+       printf "Game $i: %s\n", $r->resultw;    
+    }
+    else {
+       printf "Game $i: %s %s\n", $r->resultb, $r->resultw;
+    }
+}
+
+$white_pl->quit;
+$black_pl->quit;
+
+
diff --git a/interface/gtp_examples/twogtp-a b/interface/gtp_examples/twogtp-a
new file mode 100644 (file)
index 0000000..82a8b76
--- /dev/null
@@ -0,0 +1,472 @@
+#! /usr/bin/perl -w 
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007    #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Here is a small perlscript twogtp. Its purpose is to run
+# two programs against each other. Both must support the Go
+# Text Protocol. For example GNU Go 2.7.241 or higher works.
+#
+# It is easier to implement this program in gtp than gmp.
+# The script is almost trivial. It also works with cygwin on
+# windows.
+# 
+# Run with:
+# 
+# twogtp --white '<path to program 1> --mode gtp <options>' \
+#        --black '<path to program 2> --mode gtp <options>' \
+#        [twogtp options]
+#
+# Possible twogtp options:
+#
+#   --verbose 1 (to list moves) or --verbose 2 (to draw board)
+#   --komi <amount>
+#   --handicap <amount>
+#   --size <board size>                     (default 19)
+#   --games <number of games to play>       (-1 to play forever)
+#   --sgffile <filename>
+#
+#
+
+package TWOGTP_A;
+
+use IPC::Open2;
+use Getopt::Long;
+use FileHandle;
+use strict;
+use warnings;
+use Carp;
+
+STDOUT->autoflush(1);
+
+#following added globally to allow "use strict" :
+my $vertex;
+my $first;
+my $sgfmove;
+my $sgffilename;
+my $pidw;
+my $pidb;
+my $sgffile;
+my $handicap_stones;
+my $resultw;
+my $resultb;
+my @vertices;
+my $second;
+my %game_list;
+#end of "use strict" repairs
+
+
+my $white;
+my $black;
+my $size = 19;
+my $verbose = 0;
+my $komi;
+my $handicap = 0;
+my $games = 1;
+my $wanthelp;
+
+my $helpstring = "
+
+Run with:
+
+twogtp --white \'<path to program 1> --mode gtp [program options]\' \\
+       --black \'<path to program 2> --mode gtp [program options]\' \\
+       [twogtp options]
+
+Possible twogtp options:
+
+  --verbose 1 (to list moves) or --verbose 2 (to draw board)
+  --komi <amount>
+  --handicap <amount> 
+  --size <board size>                     (default 19)
+  --games <number of games to play>       (-1 to play forever)
+  --sgffile <filename>
+  --help                                  (show this)
+
+";
+
+GetOptions(
+           "white|w=s"              => \$white,
+           "black|b=s"              => \$black,
+           "verbose|v=i"            => \$verbose,
+           "komi|k=f"               => \$komi,
+           "handicap|h=i"           => \$handicap,
+           "size|boardsize|s=i"     => \$size,
+           "sgffile|o=s"            => \$sgffilename,
+           "games=i"                => \$games,
+           "help"                   => \$wanthelp,
+);
+
+if ($wanthelp) {
+  print $helpstring;
+  exit;
+}
+
+
+if (!$white) {
+  $white = '../gnugo.exe --mode gtp --quiet';
+  warn "Defaulting white to: $white";
+}
+if (!$black) {
+  $black = '../gnugo.exe --mode gtp --quiet';
+  warn "Defaulting black to: $black";
+}
+
+die $helpstring unless defined $white and defined $black;
+
+# create FileHandles
+#my $black_in;
+my $black_in  = new FileHandle;                # stdin of black player
+my $black_out = new FileHandle;                # stdout of black player
+my $white_in  = new FileHandle;                # stdin of white player
+my $white_out = new FileHandle;                # stdout of white player
+my $b_gtp_ver;                         # gtp version of black player
+my $w_gtp_ver;                         # gtp version of white player
+
+while ($games > 0) {
+    $pidb = open2($black_out, $black_in, $black);
+    print "black pid: $pidb\n" if $verbose;
+    $pidw = open2($white_out, $white_in, $white);
+    print "white pid: $pidw\n" if $verbose;
+    
+    $sgffile = rename_sgffile($games, $sgffilename) if defined $sgffilename;
+
+    if ((defined $sgffilename) && !open(SGFFILEHANDLE, ">$sgffile")) {
+       printf("can't open $sgffile\n");
+       undef($sgffilename);
+    }
+    
+    if (!defined $komi) {
+        if ($handicap eq 0) {
+           $komi = 5.5;
+       }
+       else {
+           $komi = 0.5;
+       }
+    }
+
+    print $black_in  "protocol_version\n";
+    $b_gtp_ver = eat_gtp_ver($black_out);
+    print $black_in  "boardsize $size\n";
+    eat_no_response($black_out);
+    print $black_in  "clear_board\n";
+    eat_no_response($black_out);
+    print $black_in  "komi $komi\n";
+    eat_no_response($black_out);
+
+    print $white_in  "protocol_version\n";
+    $w_gtp_ver = eat_gtp_ver($white_out);
+    print $white_in  "boardsize $size\n";
+    eat_no_response($white_out);
+    print $white_in  "clear_board\n";
+    eat_no_response($white_out);
+    print $white_in  "komi $komi\n";
+    eat_no_response($white_out);
+    
+    print SGFFILEHANDLE "(;GM[1]FF[4]RU[Japanese]SZ[$size]HA[$handicap]KM[$komi]"
+       if defined $sgffilename;
+    
+    my $pass = 0;
+    my ($move, $toplay);
+
+    if ($handicap < 2) {
+       $toplay = 'B';
+    }
+    else {
+       $toplay = 'W';
+       print $black_in "fixed_handicap $handicap\n";
+       $handicap_stones = eat_handicap($black_out);
+       if (defined $sgffilename) {
+           print SGFFILEHANDLE $handicap_stones;
+       }
+       print $white_in "fixed_handicap $handicap\n";
+       $handicap_stones = eat_handicap($white_out);
+    }
+    while ($pass < 2) {
+       if ($toplay eq 'B') {
+           if ($b_gtp_ver eq 1) {
+               print $black_in "genmove_black\n";
+           } else {
+               print $black_in "genmove black\n";
+           }
+           $move = eat_move($black_out);
+           $sgfmove = standard_to_sgf($move);
+           print SGFFILEHANDLE ";B[$sgfmove]\n" if defined $sgffilename;
+           print "Black plays $move\n" if $verbose;
+           if ($move =~ /PASS/i) {
+               $pass++;
+           } else {
+               $pass = 0;
+           }
+           if ($w_gtp_ver eq 1) {
+               print $white_in "black $move\n";
+           } else {
+               print $white_in "play black $move\n";
+           }
+           eat_no_response($white_out);
+           if ($verbose > 1) {
+               print $white_in "showboard\n";
+               if ($w_gtp_ver eq 2) {
+                   eat_showboard($white_out);
+               } else {
+                   eat_no_response($white_out);
+               }
+           }
+           $toplay = 'W';
+       } else {
+           if ($w_gtp_ver eq 1) {
+               print $white_in "genmove_white\n";
+           } else {
+               print $white_in "genmove white\n";
+           }
+           $move = eat_move($white_out);
+           $sgfmove = standard_to_sgf($move);
+           print SGFFILEHANDLE ";W[$sgfmove]\n" if defined $sgffilename;
+           print "White plays $move\n" if $verbose;
+           if ($move =~ /PASS/i) {
+               $pass++;
+           } else {
+               $pass = 0;
+           }
+           if ($b_gtp_ver eq 1) {
+               print $black_in "white $move\n";
+           } else {
+               print $black_in "play white $move\n";
+           }
+           eat_no_response($black_out);
+           if ($verbose > 1) {
+               print $black_in "showboard\n";
+               if ($b_gtp_ver eq 2) {
+                   eat_showboard($black_out);
+               } else {
+                   eat_no_response($black_out);
+               }
+           }
+           $toplay = 'B';
+       }
+    }
+    print $white_in "final_score\n";
+    $resultw = eat_score($white_out);
+    print "Result according to W: $resultw\n";
+    print $black_in "final_score\n";
+    $resultb = eat_score($black_out);
+    print "Result according to B: $resultb\n";
+    print $white_in "quit\n";
+    print $black_in "quit\n";
+    if (defined $sgffilename) {
+       print "sgf file: $sgffile\n";
+       print SGFFILEHANDLE ")";
+       close SGFFILEHANDLE;
+       $game_list{$sgffile} = $resultw . "|" . $resultb
+    }
+    $games-- if $games > 0;
+    close $black_in;
+    close $black_out;
+    close $white_in;
+    close $white_out;
+    waitpid $pidb, 0;
+    waitpid $pidw, 0;
+    print "games remaining: $games\n";
+}
+
+if (defined $sgffilename) {
+  my $index_out  = new FileHandle;
+  open ($index_out, "> " . index_name($sgffilename));
+  print $index_out
+"<HTML><HEAD><TITLE>game results</TITLE></HEAD>
+<BODY><H3>Game Results</H3>
+<H4>White: ".html_encode($white)."</H4>
+<H4>Black: ".html_encode($black)."</H4>
+<TABLE border=1>
+ <TR>
+  <TD>SGF file</TD>
+  <TD>Result</TD>
+ </TR>
+";
+ foreach (sort by_result keys(%game_list)) {
+    print $index_out "<TR><TD><A href=\"$_\">$_</A></TD>" .
+               "<TD>".html_encode(game_result($_))."</TD></TR>\n";
+  }
+  print $index_out "</TABLE></BODY></HTML>\n";
+}
+
+sub game_result {
+  $_ = shift;
+  $_ = $game_list{$_};
+  #i.e.:  B+13.5 (upper bound: -13.5, lower: -13.5)|B+13.5 (upper bound: -13.5, lower: -13.5)
+  #Make sure that all 4 values are the same.  I've not seen them different yet.
+  #If they are ever different, need to improve the HTML output (now just -999) -
+  # an explanation of the score mismatch problem would be appropriate. 
+  $_ =~ /^.*upper bound..([0-9+.\-]*)..lower..\1.\|.*upper bound..\1..lower..\1./;
+  if (defined($1)) {
+    return $1;
+  } else {
+    return -999;
+  }
+}
+
+sub by_result {
+  game_result($a) <=> game_result($b) || $a cmp $b;
+}
+
+sub html_encode {
+  #print shift;
+  my $r = shift;
+  $r =~ s/&/&amp;/g;
+  $r =~ s/</&lt;/g;
+  $r =~ s/>/&gt;/g;
+  return $r;
+}
+
+
+
+sub eat_no_response {
+    my $h = shift;
+
+# ignore empty lines
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+        $line =~ s/(\s|\n)*$//smg;
+    }
+}
+
+sub eat_move {
+    my $h = shift;
+# ignore empty lines
+    my $line = "";
+    while ($line eq "") {
+       if (!defined($line = <$h>)) {
+           print SGFFILEHANDLE ")";
+           close SGFFILEHANDLE;
+           die "Engine crashed!\n";
+       }
+        $line =~ s/(\s|\n)*$//smg;
+    }
+    my ($equals, $move) = split(' ', $line, 2);
+    $line = <$h>;
+    defined($move) or confess "no move found: line was: '$line'";
+    return $move;
+}
+
+sub eat_handicap {
+    my $h = shift;
+    my $sgf_handicap = "AB";
+# ignore empty lines, die if process is gone
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+    }
+    @vertices = split(" ", $line);
+    foreach $vertex (@vertices) {
+       if (!($vertex eq "=")) {
+           $vertex = standard_to_sgf($vertex);
+           $sgf_handicap = "$sgf_handicap\[$vertex\]";
+       }
+    }          
+    return "$sgf_handicap;";
+}
+
+sub eat_score {
+    my $h = shift;
+# ignore empty lines, die if process is gone
+    my $line = "";
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+       $line =~ s/^\s*//msg;
+       $line =~ s/\s*$//msg;
+    }
+    $line =~ s/\s*$//;
+    my ($equals, $result) = split(' ', $line, 2);
+    $line = <$h>;
+    return $result;
+}
+
+sub eat_gtp_ver {
+    my $h = shift;
+    my $line = "";
+
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+       $line =~ s/^\s*//msg;
+       $line =~ s/\s*$//msg;
+    }
+    $line =~ s/\s*$//;
+    my ($equals, $result) = split(' ', $line, 2);
+    $line = <$h>;
+    return $result;
+}
+
+sub eat_showboard {
+    my $h = shift;
+    my $line = "";
+
+    while ($line eq "") {
+       chop($line = <$h>) or die "No response!";
+       $line =~ s/^\s*//msg;
+       $line =~ s/\s*$//msg;
+    }
+    $line =~ s/\s*$//;
+    my ($equals, $result) = split(' ', $line, 2);
+
+    while (!($line =~ /^\s*$/)) {
+       $result .= $line;
+       $line = <$h>;
+    }
+    print STDERR $result;
+}
+
+sub standard_to_sgf {
+    for (@_) { confess "Yikes!" if !defined($_); }
+    for (@_) { tr/A-Z/a-z/ };
+    $_ = shift(@_);
+    /([a-z])([0-9]+)/;
+    return "tt" if $_ eq "pass";
+    
+    $first = ord $1;
+    if ($first > 104) {
+       $first = $first - 1;
+    }
+    $first = chr($first);
+    $second = chr($size+1-$2+96);
+    return "$first$second";
+}
+
+sub rename_sgffile {
+    my $nogames = int shift(@_);
+    $_ = shift(@_);
+    s/\.sgf$//;
+    # Annoying to loose _001 on game #1 in multi-game set.
+    # Could record as an additional parameter.
+    # return "$_.sgf" if ($nogames == 1);
+    return sprintf("$_" . "_%03d.sgf", $nogames);
+}
+
+sub index_name {
+  $_ = shift;
+  s/\.sgf$//;
+  return $_ . "_index.html";
+}
diff --git a/interface/gtp_examples/twogtp.pike b/interface/gtp_examples/twogtp.pike
new file mode 100755 (executable)
index 0000000..cb1ad20
--- /dev/null
@@ -0,0 +1,1420 @@
+#! /usr/bin/env pike
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 and      *
+ * 2009 by the Free Software Foundation.                             *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#define DUMP_GTP_PIPES         0
+
+
+int
+maximal_fixed_handicap(int board_size)
+{
+  if (board_size < 7)
+    return 0;
+  if (board_size % 2 == 1 && board_size >= 9)
+    return 9;
+  return 4;
+}
+
+
+float
+result_to_float(string result)
+{
+  if (result[..1] == "W+")
+    return (float) result[2..];
+  if (result[..1] == "B+")
+    return - (float) result[2..];
+  return (float) result;
+}
+
+
+string
+arrange_values_nicely(array(string) values, string delimiter)
+{
+  string result = "";
+  for (int k = 0; k < sizeof(values); k++) {
+    if (k > 0 && k % 12 == 0)
+      result += "\n";
+    result += delimiter + values[k];
+  }
+
+  return result + "\n";
+}
+
+
+string
+list_sgf_positions(array(array(string)) positions, array(string) sgf_properties)
+{
+  string result = "";
+  for (int k = 0; k < sizeof(positions); k++) {
+    if (sizeof(positions[k]))
+      result += sgf_properties[k] + arrange_values_nicely(positions[k], "");
+  }
+
+  return result;
+}
+
+
+string
+nice_time(float _time)
+{
+  int time = (int) (_time * 10);
+#ifdef __AUTO_BIGNUM__
+  return sprintf("%d:%02d.%d", time / 600, (time % 600) / 10, time % 10);
+#else
+  return sprintf("%d:%02d", time / 600, (time % 600) / 10);
+#endif
+}
+
+
+int
+is_numeric(string str)
+{
+  str = String.trim_all_whites(str);
+  if (str[0] == '+')
+    str = str[1..];
+
+  return ((string) ((int) str)) == str;
+}
+
+
+class GtpServer {
+  int server_is_up;
+  int board_size;
+  private Stdio.File file_out;
+  private Stdio.FILE file_in;
+  int protocol_version;
+  string color;
+  string capitalized_color;
+  string command_line;
+  string full_engine_name;
+  string random_seed;
+  private float main_time;
+  private float byo_yomi_time;
+  private int byo_yomi_stones;
+  private float time_left;
+  private int stones_left;
+  float total_used_time;
+  private array(string) statistics;
+  private array(string) reset;
+  private array totals;
+
+
+  void
+  create(string _command_line, array(string) _statistics, array(string) _reset,
+        string _color,
+        float _main_time, float _byo_yomi_time, int _byo_yomi_stones)
+  {
+    file_out = Stdio.File();
+    file_in = Stdio.FILE();
+    set_color(_color);
+    command_line = _command_line;
+
+    array error = catch {
+      Process.create_process(command_line / " ",
+                            ([ "stdin" : file_out->pipe(),
+                               "stdout" : file_in->pipe() ]));
+    };
+
+    if (error) {
+      werror(error[0]);
+      werror("Command line was `%s'.\n", command_line);
+      destruct(this_object());
+    }
+    else {
+      array error = catch {
+       array answer = send_command("protocol_version");
+       protocol_version = answer[0] ? 1 : (int) answer[1];
+       full_engine_name = get_full_engine_name();
+       server_is_up = 1;
+      };
+      if (error) {
+       werror("Engine `%s' crashed at startup.\nPerhaps command line is wrong.\n",
+              command_line);
+       destruct(this_object());
+      }
+      else {
+       main_time = _main_time;
+       byo_yomi_time = _byo_yomi_time;
+       byo_yomi_stones = _byo_yomi_stones;
+       total_used_time = 0.0;
+
+       statistics = _statistics;
+       reset = _reset;
+       totals = ({ 0 }) * sizeof(statistics);
+      }
+    }
+  }
+
+
+  void
+  set_color(string _color)
+  {
+    color = _color;
+    capitalized_color = String.capitalize(color);
+  }
+
+
+  void
+  restart_if_crashed()
+  {
+    if (!server_is_up) {
+      werror("Restarting engine `%s' playing %s.\n", command_line, color);
+      Process.create_process(command_line / " ",
+                            ([ "stdin" : file_out->pipe(),
+                               "stdout" : file_in->pipe() ]));
+      server_is_up = 1;
+    }
+  }
+
+
+  array
+  send_command(string command)
+  {
+#if DUMP_GTP_PIPES
+    werror("[%s%s] %s\n",
+          full_engine_name ? full_engine_name + ", " : "", color, command);
+#endif
+
+    command = String.trim_all_whites(command);
+    sscanf(command, "%[0-9]", string id);
+    if (command[0] == '#' || command == id)
+      return ({ 0, "" });
+
+    file_out->write("%s\n", command);
+    string response = file_in->gets();
+    if (!response) {
+      server_is_up = 0;
+      error("Engine `%s' playing %s crashed!", command_line, color);
+    }
+
+#if DUMP_GTP_PIPES
+    werror("%s\n", response);
+#endif
+
+    array result;
+    int id_length = strlen(id);
+    if (response && response[..id_length] == "=" + id)
+      result = ({ 0, response[id_length + 1 ..] });
+    else if (response && response[..id_length] == "?" + id)
+      result = ({ 1, response[id_length + 1 ..] });
+    else
+      result = ({ -1, response });
+
+    result[1] = String.trim_all_whites(result[1]);
+    while (1) {
+      response = file_in->gets();
+
+#if DUMP_GTP_PIPES
+      werror("%s\n", response);
+#endif
+
+      if (response == "") {
+       if (result[0] < 0) {
+         werror("Warning, unrecognized response to command `%s':\n", command);
+         werror("%s\n", result[1]);
+       }
+       return result;
+      }
+      result[1] += "\n" + response;
+    }
+  }
+
+
+  int
+  is_known_command(string command)
+  {
+    array answer = send_command("known_command " + command);
+    return !answer[0] && answer[1] == "true";
+  }
+
+
+  string
+  get_full_engine_name()
+  {
+    return send_command("name")[1] + " " + send_command("version")[1];
+  }
+
+
+  void
+  set_board_size(int _board_size)
+  {
+    board_size = _board_size;
+    send_command("boardsize " + board_size);
+    if (protocol_version >= 2)
+      send_command("clear_board");
+    random_seed = get_random_seed();
+  }
+
+
+  array(string)
+  fixed_handicap(int handicap)
+  {
+    array answer = send_command("fixed_handicap " + handicap);
+    return answer[0] ? ({}) : answer[1] / " ";
+  }
+
+
+  array(string)
+  place_free_handicap(int handicap)
+  {
+    array answer = send_command("place_free_handicap " + handicap);
+    return answer[0] ? ({}) : answer[1] / " ";
+  }
+
+
+  void
+  set_free_handicap(array(string) stones)
+  {
+    send_command("set_free_handicap " + (stones * " "));
+  }
+
+
+  array(string)
+  set_handicap(int handicap, string handicap_mode,
+              GtpServer opponent, GtpServer arbiter)
+  {
+    if (handicap == 0)
+      return ({});
+
+    if (handicap_mode == "free") {
+      array(string) stones = place_free_handicap(handicap);
+      opponent->set_free_handicap(stones);
+      if (arbiter)
+       arbiter->set_free_handicap(stones);
+
+      return stones;
+    }
+    else {
+      opponent->fixed_handicap(handicap);
+      if (arbiter)
+       arbiter->fixed_handicap(handicap);
+
+      return fixed_handicap(handicap);
+    }
+  }
+
+
+  float
+  get_komi()
+  {
+    return (float) (send_command("get_komi")[1]);
+  }
+
+
+  void
+  set_komi(float komi)
+  {
+    send_command("komi " + komi);
+  }
+
+
+  array
+  load_sgf(string sgf_file_name, int|string load_up_to)
+  {
+    array answer = send_command(sprintf("loadsgf %s %s", sgf_file_name,
+                                       (string) load_up_to));
+    board_size = (int) send_command("query_boardsize")[1];
+    return answer;
+  }
+
+
+  void
+  reset_engine()
+  {
+    foreach (reset, string reset_command)
+      send_command(reset_command);
+
+    initialize_time_control();
+  }
+
+
+  void
+  initialize_time_control()
+  {
+    if (main_time < 0.0) {
+      time_left = 0.0;
+      return;
+    }
+
+    if (main_time > 0.0) {
+      time_left = main_time;
+      stones_left = 0;
+    }
+    else {
+      time_left = byo_yomi_time;
+      stones_left = byo_yomi_stones;
+    }
+
+    send_command(sprintf("time_settings %d %d %d", (int) main_time,
+                        (int) byo_yomi_time, byo_yomi_stones));
+  }
+
+
+  string
+  generate_move(int use_time_control)
+  {
+    string result;
+    int time_notch = 0;
+
+    if (use_time_control) {
+      if (main_time >= 0.0) {
+       send_command(sprintf("time_left %s %d %d", color,
+                            (int) time_left, stones_left));
+      }
+
+#ifdef __AUTO_BIGNUM__
+      time_notch = gethrtime();
+#else
+      time_notch = time();
+#endif
+    }
+
+    if (protocol_version >= 2)
+      result = send_command("genmove " + color)[1];
+    else
+      result = send_command("genmove_" + color)[1];
+
+    if (use_time_control) {
+#ifdef __AUTO_BIGNUM__
+      time_left -= (gethrtime() - time_notch) / 1.0e6;
+#else
+      time_left -= time() - time_notch;
+#endif
+      if (main_time >= 0.0) {
+       if (time_left < 0.0) {
+         if (stones_left > 0)
+           return "time";
+         else {
+           total_used_time += main_time;
+           time_left += byo_yomi_time;
+           stones_left = byo_yomi_stones;
+           if (time_left < 0.0)
+             return "time";
+         }
+       }
+
+       if (stones_left > 0 && --stones_left == 0) {
+         total_used_time += byo_yomi_time - time_left;
+         time_left = byo_yomi_time;
+         stones_left = byo_yomi_stones;
+       }
+      }
+    }
+
+    return result;
+  }
+
+
+  string
+  get_time_left()
+  {
+    if (main_time < 0.0)
+      return "";
+
+    if (time_left < 0)
+      return "lost on time";
+
+    if (stones_left <= 0) {
+      return sprintf("main time: %s / %s",
+                    nice_time(time_left), nice_time(main_time));
+    }
+
+    return sprintf("byo-yomi time: %s / %s, stones: %d / %d",
+                  nice_time(time_left), nice_time(byo_yomi_time),
+                  stones_left, byo_yomi_stones);
+  }
+
+
+  void
+  finalize_time_control()
+  {
+    if (main_time < 0.0)
+      total_used_time += -time_left;
+    else if (stones_left > 0)
+      total_used_time += byo_yomi_time - time_left;
+    else
+      total_used_time += main_time - time_left;
+  }
+
+
+  void
+  play(string color, string move)
+  {
+    if (protocol_version >= 2)
+      send_command(sprintf("play %s %s", color, move));
+    else
+      send_command(sprintf("%s %s", color, move));
+  }
+
+
+  string
+  get_random_seed()
+  {
+    array answer = send_command("get_random_seed");
+    return answer[0] ? "unknown" : answer[1];
+  }
+
+
+  void
+  set_random_seed(int|string seed)
+  {
+    random_seed = (string) seed;
+    send_command("set_random_seed " + random_seed);
+  }
+
+
+  array(string)
+  list_stones(string color)
+  {
+    return send_command("list_stones " + color)[1] / " ";
+  }
+
+
+  array(array(string))
+  get_position_as_sgf()
+  {
+    if (!is_known_command("list_stones"))
+      return ({});
+    return ({ map(list_stones("white"), move_to_sgf_notation),
+             map(list_stones("black"), move_to_sgf_notation) });
+  }
+
+
+  array(string)
+  final_status_list(string status)
+  {
+    array result = send_command("final_status_list " + status); 
+    return result[0] ? ({}) : ((result[1] / "\n") * " ") / " " - ({""});
+  }
+
+
+  array(array(string))
+  get_territory_as_sgf()
+  {
+    if (!is_known_command("final_status_list"))
+      return ({});
+
+    array(array(string)) result
+      = ({ map(final_status_list("white_territory"), move_to_sgf_notation),
+          map(final_status_list("black_territory"), move_to_sgf_notation) });
+    if (result[0] == ({}) && result[1] == ({}))
+      return ({});
+
+    if (is_known_command("color")) {
+      array(string) dead_stones = final_status_list("dead");
+      foreach (dead_stones, string stone) {
+       switch (send_command("color " + stone)[1]) {
+       case "black": result[0] += ({ move_to_sgf_notation(stone) }); break;
+       case "white": result[1] += ({ move_to_sgf_notation(stone) }); break;
+       }
+      }
+    }
+
+    return result;
+  }
+
+
+  string
+  show_board()
+  {
+    array answer = send_command("showboard");
+    if (answer[0])
+      return "\n";
+    if (answer[1] != "" && answer[1][0] == '\n')
+      return answer[1][1..] + "\n";
+    return answer[1] + "\n";
+  }
+
+
+  void
+  print_statistics(int dont_print_numerics)
+  {
+    for (int k = 0; k < sizeof(statistics); k++) {
+      array command_result = send_command(statistics[k]);
+      if (!command_result[0]) {
+       if (is_numeric(command_result[1])) {
+         if (totals[k] != "")
+           totals[k] += (int) command_result[1];
+
+         if (dont_print_numerics)
+           continue;
+       }
+       else
+         totals[k] = "";
+
+       write("%s (%s) statistic `%s': %s\n", full_engine_name, color,
+             statistics[k], command_result[1]);
+      }
+      else {
+       werror("Couldn't acquire statistic `%s': engine failed with message \"%s\"\n",
+              statistics[k], command_result[1]);
+      }
+    }
+  }
+
+
+  void
+  print_statistic_totals()
+  {
+    int first_total = 1;
+    for (int k = 0; k < sizeof(statistics); k++) {
+      if (totals[k] != "") {
+       if (first_total) {
+         write("\n%s (%s) statistics totals:\n", full_engine_name, color);
+         first_total = 0;
+       }
+
+       write("`%s' total: %d\n", statistics[k], totals[k]);
+      }
+    }
+  }
+
+
+  string
+  final_score()
+  {
+    array answer = send_command("final_score");
+    return answer[0] ? "?" : answer[1];
+  }
+
+
+  string
+  cpu_time()
+  {
+    if (is_known_command("cputime"))
+      return send_command("cputime")[1];
+    return "";
+  }
+
+
+  void
+  quit()
+  {
+    send_command("quit");
+  }
+
+
+  string
+  move_to_sgf_notation(string coordinates)
+  {
+    coordinates = lower_case(coordinates);
+    if (coordinates == "pass")
+      return "[]";
+
+    int y = board_size - ((int) coordinates[1..]);
+    int x = coordinates[0] - 'a';
+    if (x > 'i' - 'a')
+      x--;
+
+    return sprintf("[%c%c]", 'a' + x, 'a' + y);
+  }
+};
+
+
+class GtpGame {
+  private GtpServer white;
+  private GtpServer black;
+  private GtpServer arbiter;
+  private int verbose;
+  private int black_to_play;
+  private string sgf_header;
+  private array(array(string)) territory;
+  private int totals_only;
+
+
+  void
+  create(string command_line_white, string command_line_black,
+        string command_line_arbiter,
+        array(string) statistics_white, array(string) statistics_black,
+        array(string) reset_white, array(string) reset_black,
+        int _totals_only, int _verbose,
+        float main_time, float byo_yomi_time, int byo_yomi_stones)
+  {
+    verbose = _verbose;
+    totals_only = _totals_only;
+    white = GtpServer(command_line_white, statistics_white, reset_white,
+                     "white", main_time, byo_yomi_time, byo_yomi_stones);
+    if (white) {
+      black = GtpServer(command_line_black, statistics_black, reset_black,
+                       "black", main_time, byo_yomi_time, byo_yomi_stones);
+
+      if (black && command_line_arbiter != "") {
+       arbiter = GtpServer(command_line_arbiter, ({}), ({}), "arbiter",
+                           -1.0, 0.0, 0);
+      }
+      else
+       arbiter = UNDEFINED;
+    }
+
+    if (!white || !black || (command_line_arbiter != "" && !arbiter))
+      destruct(this_object());
+  }
+
+
+  void
+  swap_engines()
+  {
+    GtpServer temp = white;
+    white = black;
+    black = temp;
+    white->set_color("white");
+    black->set_color("black");
+  }
+
+
+  void
+  start_new_game(int board_size, int handicap, string handicap_mode,
+                float komi)
+  {
+    white->set_board_size(board_size);
+    black->set_board_size(board_size);
+    if (arbiter)
+      arbiter->set_board_size(board_size);
+
+    array(string) stones = black->set_handicap(handicap, handicap_mode,
+                                              white, arbiter);
+    stones = map(stones, black->move_to_sgf_notation);
+
+    white->set_komi(komi);
+    black->set_komi(komi);
+    if (arbiter)
+      arbiter->set_komi(komi);
+
+    black_to_play = (handicap == 0);
+    sgf_header = sprintf("(;\nGM[1]FF[4]\nSZ[%d]HA[%d]KM[%.1f]\n",
+                        board_size, handicap, komi);
+    if (handicap)
+      sgf_header += "AB" + arrange_values_nicely(stones, "");
+  }
+
+
+  array(string)
+  play(string|int sgf_file_name)
+  {
+    array(string) sgf_moves = ({});
+    array(array(string)) move_history = ({});
+    string special_win = "";
+    GtpServer player;
+    GtpServer opponent;
+
+    if (verbose)
+      werror("\nBeginning a new game.\n");
+
+    white->reset_engine();
+    black->reset_engine();
+    territory = UNDEFINED;
+
+    array error = catch {
+      int passes = 0;
+      while (1) {
+       player = black_to_play ? black : white;
+       opponent = black_to_play ? white : black;
+
+       string move = player->generate_move(1);
+       string move_lower_case = lower_case(move);
+
+       if (move_lower_case == "resign") {
+         if (verbose)
+           werror(player->capitalized_color + " resigns!\n");
+
+         special_win = sprintf("%c+Resign", opponent->capitalized_color[0]);
+         break;
+       }
+
+       if (move_lower_case == "time") {
+         if (verbose)
+           werror(player->capitalized_color + " loses on time!\n");
+
+         special_win = sprintf("%c+Time", opponent->capitalized_color[0]);
+         break;
+       }
+
+       opponent->play(player->color, move);
+       sgf_moves += ({ sprintf("%c%s", player->capitalized_color[0],
+                               player->move_to_sgf_notation(move)) });
+       if (arbiter)
+         move_history += ({ ({ player->color, move }) });
+
+       if (move_lower_case == "pass") {
+         if (verbose)
+           werror("play " + player->capitalized_color + " pass\n");
+
+         if (++passes == 2)
+           break;
+       }
+       else {
+         if (verbose) {
+           string time_left = " (" + player->get_time_left() + ")";
+           if (time_left == " ()")
+             time_left = "";
+
+           werror("play %s %s%s\n", player->capitalized_color,
+                  move, time_left);
+         }
+
+         passes = 0;
+       }
+
+       if (verbose >= 2) {
+         string board = white->show_board();
+         if (board == "")
+           board = black->show_board();
+         werror("%s\n", board);
+       }
+       black_to_play = !black_to_play;
+
+       if (sgf_file_name)
+         write_sgf_file(sgf_file_name, sgf_moves, ({ "Void" }));
+      }
+    };
+
+    white->finalize_time_control();
+    black->finalize_time_control();
+
+    array(string) result;
+    if (error) {
+      result = ({ "Void", error[0] });
+      if (sgf_file_name)
+       werror("The game will be saved in file `%s'.\n", sgf_file_name);
+
+      white->restart_if_crashed();
+      black->restart_if_crashed();
+      if (arbiter)
+       arbiter->restart_if_crashed();
+    }
+    else {
+      if (special_win == "") {
+       result = ({ white->final_score(), black->final_score() });
+
+       if (result[1] == "?" || result[0] == result[1])
+         result = ({ result[0] });
+       else if (result[0] == "?")
+         result = ({ result[1] });
+
+       territory = player->get_territory_as_sgf();
+       if (territory == ({}))
+         territory = opponent->get_territory_as_sgf();
+
+       if (arbiter && (sizeof(result) == 2 || result[0] == "?")) {
+         foreach (move_history, array(string) move)
+           arbiter->play(move[0], move[1]);
+         result = ({ arbiter->final_score() });
+
+         if (territory == ({}))
+           territory = arbiter->get_territory_as_sgf();
+       }
+      }
+      else
+       result = ({ special_win });
+    }
+
+    if (sgf_file_name)
+      write_sgf_file(sgf_file_name, sgf_moves, result);
+    return result;
+  }
+
+
+  int
+  init_endgame_contest(string endgame_file_name, int endgame_moves)
+  {
+    array(string) sgf_nodes;
+    array error = catch {
+      sgf_nodes = Stdio.read_file(endgame_file_name) / ";";
+    };
+    if (error) {
+      werror(error[0]);
+      return 0;
+    }
+
+    Regexp move = Regexp("\\<([BW]\\[[a-z][a-z]\\])");
+    array(string) moves = ({});
+    foreach (sgf_nodes, string sgf_node) {
+      array move_groups = move->split(sgf_node);
+      if (move_groups)
+       moves += ({ move_groups[0] });
+    }
+
+    int load_up_to = max(sizeof(moves) - endgame_moves + 1, 1);
+    array white_answer = white->load_sgf(endgame_file_name, load_up_to);
+    array black_answer = black->load_sgf(endgame_file_name, load_up_to);
+    array arbiter_answer = (arbiter
+                           ? arbiter->load_sgf(endgame_file_name, load_up_to)
+                           : ({0}));
+
+    if (white_answer[0] || black_answer[0] || arbiter_answer[0]) {
+      werror("File `%s' might be corrupt. Engines refuse to load it.\n",
+            endgame_file_name);
+      return 0;
+    }
+
+    sgf_header = sprintf("(;\nGM[1]FF[4]\nSZ[%d]KM[%.1f]\n"
+                        "C[Original game: `%s' loaded up to move %d]\n",
+                        white->board_size, white->get_komi(),
+                        endgame_file_name, load_up_to);
+    array(array(string)) stones = white->get_position_as_sgf();
+    if (!stones)
+      stones = black->get_position_as_sgf();
+    if (!stones && arbiter)
+      stones = arbiter->get_position_as_sgf();
+    if (!stones) {
+      stones = ({ ({}), ({}) });
+      moves = moves[..load_up_to - 2];
+      foreach (moves, string move)
+       stones[move[0] == 'B'] += ({ move[1..] });
+    }
+
+    sgf_header += list_sgf_positions(stones, ({ "AW", "AB" }));
+
+    white->set_random_seed(0);
+    black->set_random_seed(0);
+
+    black_to_play = (black_answer[1] == "black");
+    return load_up_to;
+  }
+
+
+  void
+  reinit_endgame_contest(string endgame_file_name, int load_up_to)
+  {
+    swap_engines();
+    white->load_sgf(endgame_file_name, load_up_to);
+    array black_answer = black->load_sgf(endgame_file_name, load_up_to);
+
+    if (arbiter)
+      arbiter->load_sgf(endgame_file_name, load_up_to);
+
+    white->set_random_seed(0);
+    black->set_random_seed(0);
+    black_to_play = (black_answer[1] == "black");
+  }
+
+
+  void
+  write_sgf_file(string sgf_file_name, array(string) sgf_moves,
+                array(string) result)
+  {
+    string sgf_data = sprintf("PW[%s (random seed %s)]\nPB[%s (random seed %s)]\n"
+                             "RU[Japanese]\nRE[%s]\n",
+                             white->full_engine_name, white->random_seed,
+                             black->full_engine_name, black->random_seed,
+                             result[0]);
+    if (sizeof(result) > 1) {
+      sgf_data += sprintf("GC[%s]\n", result[0] == "Void" ? result[1] :
+                         sprintf("Engines disagreed on results:\n"
+                                 "White claimed %s\nBlack claimed %s\n",
+                                 result[0], result[1]));
+    }
+
+    sgf_data += arrange_values_nicely(sgf_moves, ";");
+    if (sizeof(result) == 1) {
+      if (territory)
+       sgf_data += ";" + list_sgf_positions(territory, ({ "TW", "TB" }));
+    }
+    else if (result[0] == "Void")
+      sgf_data += ";C[" + result[1] + "]\n";
+    sgf_data += ")\n";
+
+    array error = catch {
+      Stdio.write_file(sgf_file_name, sgf_header + sgf_data);
+    };
+
+    if (error)
+      werror(error[0]);
+  }
+
+
+  void
+  print_time_report()
+  {
+    string cpu_time_white = white->cpu_time();
+    string cpu_time_black = black->cpu_time();
+    if (cpu_time_white != "")
+      write("White: %ss CPU time.\n", cpu_time_white);
+    if (cpu_time_black != "")
+      write("Black: %ss CPU time.\n", cpu_time_black);
+
+    write("\nTime control report (wall move generation time):\n");
+    write("  White: %s\n", nice_time(white->total_used_time));
+    write("  Black: %s\n", nice_time(black->total_used_time));
+  }
+
+
+  void
+  print_statistics()
+  {
+    white->print_statistics(totals_only);
+    black->print_statistics(totals_only);
+  }
+
+
+  void
+  print_statistic_totals()
+  {
+    white->print_statistic_totals();
+    black->print_statistic_totals();
+  }
+
+
+  void
+  finalize()
+  {
+    white->quit();
+    black->quit();
+  }
+}
+
+
+void
+run_twogtp_match(GtpGame game, int num_games, int board_size, int handicap,
+                string handicap_mode, int adjust_handicap, float komi,
+                int verbose, string|int sgf_base, int skip_games)
+{
+  int white_wins = 0;
+  int black_wins = 0;
+  int jigos = 0;
+  int result_unknown = 0;
+  int disagreed_games = 0;
+  int last_streak = 0;
+  int last_to_win = '0';
+  array(array(string)) results = ({});
+
+  for (int k = skip_games; k < skip_games + num_games; k++) {
+    game->start_new_game(board_size, handicap, handicap_mode, komi);
+    array(string) result
+      = game->play(sgf_base ? sprintf("%s%03d.sgf", sgf_base, k + 1) : 0);
+
+    write("Game %d: %s\n", k + 1, result * "  ");
+    game->print_statistics();
+    results += ({result});
+
+    if (sizeof(result) == 1 || (result[0][0] == result[1][0])) {
+      switch (result[0][0]) {
+      case 'W':
+      case 'B':
+       if (result[0][0] == 'W')
+         white_wins++;
+       else
+         black_wins++;
+
+       if (result[0][0] == last_to_win)
+         last_streak++;
+       else {
+         last_to_win = result[0][0];
+         last_streak = 1;
+       }
+       break;
+
+      case '0': jigos++; break;
+
+      default:
+       result_unknown++;
+       last_to_win = '0';
+      }
+    }
+    else {
+      result_unknown++;
+      last_to_win = '0';
+    }
+
+    if (adjust_handicap && last_streak == adjust_handicap) {
+      if (result[0][0] == 'W') {
+       if (handicap_mode == "free"
+           || handicap < maximal_fixed_handicap(board_size)) {
+         if (++handicap == 1)
+           handicap = 2;
+         write("White wins too often. Increasing handicap to %d.\n", handicap);
+       }
+      }
+      else {
+       if (handicap == 0) {
+         handicap = 2;
+         if (handicap_mode == "fixed")
+           handicap = min(maximal_fixed_handicap(board_size), 2);
+         game->swap_engines();
+         write("Black looks stronger than white. Swapping colors and setting handicap to %d.\n",
+               handicap);
+       }
+       else {
+         if (--handicap == 1)
+           handicap = 0;
+         write("Black wins too often. Decreasing handicap to %d.\n",
+               handicap);
+       }
+      }
+
+      last_streak = 0;
+    }
+
+    if (sizeof(result) == 2 && result[0] != "Void")
+      disagreed_games++;
+  }
+
+  if (verbose) {
+    write("\n");
+    for (int k = 0; k < num_games; k++)
+      write("Game %d: %s\n", skip_games + k + 1, results[k] * "  ");
+  }
+
+  write("\nTotal %d game(s).\nWhite won %d. Black won %d.",
+       num_games, white_wins, black_wins);
+  if (jigos)
+    write(" %d jigos.", jigos);
+  if (result_unknown)
+    write(" Results of %d game(s) are unknown.", result_unknown);
+  write("\n");
+  if (disagreed_games)
+    write("Engines disagreed on results of %d game(s).\n", disagreed_games);
+
+  game->print_time_report();
+  game->print_statistic_totals();
+  game->finalize();
+}
+
+
+void
+endgame_contest(GtpGame game, int endgame_moves, array(string) endgame_files,
+               int verbose, string|int sgf_base, int skip_games)
+{
+  array(string) differences = ({});
+  for (int k = skip_games; k < sizeof(endgame_files); k++) {
+    int load_up_to = game->init_endgame_contest(endgame_files[k], endgame_moves);
+    if (load_up_to) {
+      if (verbose)
+       werror("Replaying game `%s'.\n", endgame_files[k]);
+
+      array(string) result1
+       = game->play(sgf_base ? sprintf("%s%03d_1.sgf", sgf_base, k + 1) : 0);
+      game->print_statistics();
+      game->reinit_endgame_contest(endgame_files[k], load_up_to);
+
+      array(string) result2
+       = game->play(sgf_base ? sprintf("%s%03d_2.sgf", sgf_base, k + 1) : 0);
+      game->print_statistics();
+      game->swap_engines();
+
+      write("%s: ", endgame_files[k]);
+      if (sizeof(result1) > 1 || sizeof(result2) > 1) {
+       write("can't determine difference, engines disagreed on results.\n");
+       write("\t%s\n", result1 * " ");
+       write("\t%s\n", result2 * " ");
+       differences += ({ "unknown" });
+      }
+      else {
+       string difference = sprintf("%+.1f", (result_to_float(result1[0])
+                                             - result_to_float(result2[0])));
+       if (difference == "+0.0") {
+         write("same result: %s\n", result1[0]);
+         differences += ({ "0" });
+       }
+       else {
+         write("%s %s; difference %s.\n", result1[0], result2[0], difference);
+         differences += ({ difference });
+       }
+      }
+    }
+  }
+
+  int white_wins = 0;
+  int black_wins = 0;
+  write("\n");
+  foreach (differences, string difference) {
+    write(difference + "\n");
+    if (difference[0] == '+')
+      white_wins++;
+    else if (difference[0] == '-')
+      black_wins++;
+  }
+
+  write("\nTotal %d game(s) replayed. White won %d. Black won %d.\n",
+       sizeof(differences), white_wins, black_wins);
+  game->print_time_report();
+  game->print_statistic_totals();
+  game->finalize();
+}
+
+
+string help_message =
+  "Usage: %s [OPTION]... [FILE]...\n\n"
+  "Runs either a match or endgame contest between two GTP engines.\n"
+  "`--white' and `--black' options are mandatory.\n\n"
+  "Options:\n"
+  "  -w, --white=COMMAND_LINE\n"
+  "  -b, --black=COMMAND_LINE      command lines to run the two engines with.\n\n"
+  "  -A, --arbiter=COMMAND_LINE    command line to run arbiter--program that will\n"
+  "                                score disputed games--with.\n"
+  "      --help                    display this help and exit.\n"
+  "      --help-statistics         display help on statistics options and exit.\n"
+  "  -v, --verbose=LEVEL           1 - print moves, 2 and higher - draw boards.\n"
+  "      --no-sgf                  do not create SGF game recods.\n"
+  "      --sgf-base=FILENAME       create SGF files with FILENAME as base (default\n"
+  "                                is `twogtp' or `endgame' depending on mode).\n"
+  "  -m, --match                   runs a match between the engines (the default).\n"
+  "  -e, --endgame=MOVES           runs an endgame contest instead of a match.\n"
+  "  -c, --continue                continue a match or endgame contest.\n\n"
+  "Options valid only in match mode:\n"
+  "  -g, --games=GAMES             number of games in the match (one by default).\n"
+  "  -s, --board-size=SIZE         the board size for the match (default is 19).\n"
+  "  -h, --handicap=STONES         fixed handicap for the black player.\n"
+  "  -f, --free-handicap=STONES    free handicap for the black player.\n"
+  "  -a, --adjust-handicap=LENGTH  use simple adjusting scheme: change handicap\n"
+  "                                by 1 after LENGTH wins in a row.\n"
+  "  -k, --komi=KOMI               the komi to use.\n\n"
+  "Time control options:\n"
+  "  -t, --main-time=TIME          main time for a game (default is forever with\n"
+  "                                no byo-yomi or zero otherwise).\n"
+  "  -B, --byo-yomi-time=TIME      byo-yomi time for a game (zero by default).\n"
+  "                                TIMEs are in minutes and can be fractional.\n"
+  "  -S, --byo-yomi-stones=STONES  stones to be played in a byo-yomi period\n"
+  "                                (default is 25).\n\n"
+  "Default is no handicap. Komi defaults to 5.5 with no handicap or 0.5 with\n"
+  "nonzero handicap. Note that `--adjust-handicap' option not only can change\n"
+  "handicap, but can also swap engines' colors if black appears stronger.\n\n"
+  "FILEs are only used in endgame contest mode. They must be non-branched SGF\n"
+  "game records. In endgame contest mode the FILEs are loaded into the engines\n"
+  "excluding last non-pass MOVES specified with `--endgame' option. For each of\n"
+  "the FILEs two games are played with alternating colors and the difference in\n"
+  "results is determined.\n\n"
+  "Option `--continue' allows to have a continuous set of game records for\n"
+  "several script runs. It restarts a match or endgame contest skipping all\n"
+  "games for which game records already exist. In case of an endgame contest\n"
+  "it also skips appropriate number of FILEs.\n";
+
+string help_statistics_message =
+  "Engine statistics options:\n"
+  "  --statistics=COMMANDS\n"
+  "  --statistics-white=COMMANDS\n"
+  "  --statistics-black=COMMANDS   COMMANDS is a semicolon separated list of GTP\n"
+  "                                commands to be executed after each game; if\n"
+  "                                engines' responses appear to be numeric, totals\n"
+  "                                are printed after all games are played.\n"
+  "  --reset=COMMANDS\n"
+  "  --reset-white=COMMANDS\n"
+  "  --reset-black=COMMANDS        semicolon separated list of GTP commands needed\n"
+  "                                to reset statistics before each game.\n\n"
+  "  --totals-only                 don't print numeric statistics after each game.\n"
+  "Note that you can use `--statistics' and `--reset' options to acquire similar\n"
+  "statistics from both engines (provided they both understand the commands). If\n"
+  "you use color-specific options together with common options, both command lists\n"
+  "are used as one would expect.\n";
+
+
+int
+main(int argc, array(string) argv)
+{
+  string hint = sprintf("Try `%s --help' for more information.\n",
+                       basename(argv[0]));
+
+  if (Getopt.find_option(argv, UNDEFINED, "help")) {
+    write(help_message, basename(argv[0]));
+    return 0;
+  }
+
+  if (Getopt.find_option(argv, UNDEFINED, "help-statistics")) {
+    write(help_statistics_message);
+    return 0;
+  }
+
+  string white = Getopt.find_option(argv, "w", "white", UNDEFINED, "");
+  if (white == "") {
+    werror("White player is not specified.\n" + hint);
+    return 1;
+  }
+
+  string black = Getopt.find_option(argv, "b", "black", UNDEFINED, "");
+  if (black == "") {
+    werror("Black player is not specified.\n" + hint);
+    return 1;
+  }
+
+  string arbiter = Getopt.find_option(argv, "A", "arbiter", UNDEFINED, "");
+
+  int verbose = (int) Getopt.find_option(argv, "v", "verbose",
+                                        UNDEFINED, "0");
+  Getopt.find_option(argv, "m", "match");
+  int endgame_moves = (int) Getopt.find_option(argv, "e", "endgame",
+                                              UNDEFINED, "0");
+  int mode = (endgame_moves > 0);
+
+  string|int sgf_base = 0;
+  if (!Getopt.find_option(argv, UNDEFINED, "no-sgf")) {
+    sgf_base = Getopt.find_option(argv, UNDEFINED, "sgf-base",
+                                 UNDEFINED, mode ? "endgame" : "twogtp");
+  }
+  else {
+    if (Getopt.find_option(argv, UNDEFINED, "sgf-base"))
+      werror("Warning: `--no-sgf' option specified, `--sgf-base' has no effect");
+  }
+
+  int skip_games = Getopt.find_option(argv, "c", "continue");
+  if (skip_games) {
+    for (skip_games = 0; ; skip_games++) {
+      if (!Stdio.is_file(sprintf("%s%03d%s.sgf", sgf_base, skip_games + 1,
+                                mode ? "_1" : "")))
+       break;
+    }
+  }
+
+  float main_time = (float) Getopt.find_option(argv, "t", "main-time",
+                                              UNDEFINED, "0") * 60.0;
+  float byo_yomi_time = (float) Getopt.find_option(argv, "B", "byo-yomi-time",
+                                                  UNDEFINED, "0") * 60.0;
+  if (main_time == 0.0 && byo_yomi_time <= 0.0)
+    main_time = -1.0;
+  int byo_yomi_stones = (int) Getopt.find_option(argv, "S", "byo-yomi-stones",
+                                                UNDEFINED, "25");
+  byo_yomi_stones = max(byo_yomi_stones, 1);
+
+  string|int statistics_value
+    = Getopt.find_option(argv, UNDEFINED, "statistics", UNDEFINED, "");
+  string|int statistics_white_value
+    = Getopt.find_option(argv, UNDEFINED, "statistics-white", UNDEFINED, "");
+  string|int statistics_black_value
+    = Getopt.find_option(argv, UNDEFINED, "statistics-black", UNDEFINED, "");
+
+  array(string) statistics_white = ({});
+  array(string) statistics_black = ({});
+
+  if (statistics_value && statistics_value != "") {
+    statistics_white = map(statistics_value / ";", String.trim_all_whites);
+    statistics_black = map(statistics_value / ";", String.trim_all_whites);
+  }
+
+  if (statistics_white_value && statistics_white_value != "") {
+    statistics_white |= map(statistics_white_value / ";",
+                           String.trim_all_whites);
+  }
+
+  if (statistics_black_value && statistics_black_value != "") {
+    statistics_black |= map(statistics_black_value / ";",
+                           String.trim_all_whites);
+  }
+
+  string|int reset_value
+    = Getopt.find_option(argv, UNDEFINED, "reset", UNDEFINED, "");
+  string|int reset_white_value
+    = Getopt.find_option(argv, UNDEFINED, "reset-white", UNDEFINED, "");
+  string|int reset_black_value
+    = Getopt.find_option(argv, UNDEFINED, "reset-black", UNDEFINED, "");
+
+  array(string) reset_white = ({});
+  array(string) reset_black = ({});
+
+  if (reset_value && reset_value != "") {
+    reset_white = map(reset_value / ";", String.trim_all_whites);
+    reset_black = map(reset_value / ";", String.trim_all_whites);
+  }
+
+  if (reset_white_value && reset_white_value != "")
+    reset_white |= map(reset_white_value / ";", String.trim_all_whites);
+
+  if (reset_black_value && reset_black_value != "")
+    reset_black |= map(reset_black_value / ";", String.trim_all_whites);
+
+  int totals_only = (Getopt.find_option(argv, UNDEFINED, "totals-only") != 0);
+
+  if (!mode) {
+    string handicap_mode = "fixed";
+    int handicap = 0;
+
+    int games = (int) Getopt.find_option(argv, "g", "games", UNDEFINED, "1");
+    games = max(games, 1);
+    int board_size = (int) Getopt.find_option(argv, "s", "board-size",
+                                             UNDEFINED, "19");
+    if (board_size < 1 || 25 < board_size) {
+      werror("GTP only supports boards with size from 1 to 25.\n");
+      return 1;
+    }
+
+    int fixed_handicap = (int) Getopt.find_option(argv, "h", "handicap",
+                                                 UNDEFINED, "-1");
+
+    int free_handicap = (int) Getopt.find_option(argv, "f", "free-handicap",
+                                                UNDEFINED, "-1");
+
+    if (fixed_handicap >= 0 && free_handicap >= 0) {
+      werror("Fixed and free handicaps are mutually exclusive.\n" + hint);
+      return 1;
+    }
+
+    if (fixed_handicap >= 0) {
+      int maximum = maximal_fixed_handicap(board_size);
+      if (fixed_handicap > maximum) {
+       write("Maximal allowed handicap for board size %d is %d.\n",
+             board_size, maximum);
+       return 1;
+      }
+
+      handicap = fixed_handicap;
+      handicap_mode = "fixed";
+    }
+    else if (free_handicap >= 0) {
+      handicap = free_handicap;
+      handicap_mode = "free";
+    }
+
+    if (handicap == 1) {
+      werror("Warning: handicap 1 is not allowed, falling back on handicap 0.\n");
+      handicap = 0;
+    }
+
+    int adjust_handicap = (int) Getopt.find_option(argv, "a", "adjust-handicap",
+                                                  UNDEFINED, "0");
+    adjust_handicap = max(adjust_handicap, 0);
+
+    float komi = handicap ? 0.5 : 5.5;
+    komi = (float) Getopt.find_option(argv, "k", "komi",
+                                     UNDEFINED, (string) komi);
+
+    if (sizeof(Getopt.get_args(argv)) != 1) {
+      werror("Unrecognized input in command line.\n" + hint);
+      return 1;
+    }
+
+
+    GtpGame game = GtpGame(white, black, arbiter,
+                          statistics_white, statistics_black,
+                          reset_white, reset_black, totals_only,
+                          verbose, main_time, byo_yomi_time, byo_yomi_stones);
+    if (game) {
+      run_twogtp_match(game, games, board_size, handicap, handicap_mode,
+                      adjust_handicap, komi, verbose, sgf_base, skip_games);
+    }
+  }
+  else {
+    array(string) endgame_files = Getopt.get_args(argv)[1..];
+    if (sizeof(endgame_files) == 0) {
+      werror("No SGF files specified for endgame contest.\n" + hint);
+      return 1;
+    }
+
+    GtpGame game = GtpGame(white, black, arbiter,
+                          statistics_white, statistics_black,
+                          reset_white, reset_black, totals_only,
+                          verbose, main_time, byo_yomi_time, byo_yomi_stones);
+    if (game) {
+      endgame_contest(game, endgame_moves, endgame_files,
+                     verbose, sgf_base, skip_games);
+    }
+  }
+}
diff --git a/interface/gtp_examples/twogtp.py b/interface/gtp_examples/twogtp.py
new file mode 100644 (file)
index 0000000..f3783f4
--- /dev/null
@@ -0,0 +1,702 @@
+#! /usr/bin/env python
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+from getopt import *
+import popen2
+import sys
+import string
+import re
+
+
+debug = 0 
+
+
+def coords_to_sgf(size, board_coords):
+    global debug
+    
+    board_coords = string.lower(board_coords)
+    if board_coords == "pass":
+        return ""
+    if debug:
+        print "Coords: <" + board_coords + ">"
+    letter = board_coords[0]
+    digits = board_coords[1:]
+    if letter > "i":
+        sgffirst = chr(ord(letter) - 1)
+    else:
+        sgffirst = letter
+    sgfsecond = chr(ord("a") + int(size) - int(digits))
+    return sgffirst + sgfsecond
+
+
+
+class GTP_connection:
+
+    #
+    # Class members:
+    #   outfile         File to write to
+    #   infile          File to read from
+
+    def __init__(self, command):
+        try:
+            infile, outfile = popen2.popen2(command)
+        except:
+            print "popen2 failed"
+            sys.exit(1)
+        self.infile  = infile
+        self.outfile = outfile
+        
+    def exec_cmd(self, cmd):
+        global debug
+        
+        if debug:
+            sys.stderr.write("GTP command: " + cmd + "\n")
+        self.outfile.write(cmd + "\n\n")
+        self.outfile.flush()
+        result = ""
+        line = self.infile.readline()
+        while line != "\n":
+            result = result + line
+            line = self.infile.readline()
+        if debug:
+            sys.stderr.write("Reply: " + line + "\n")
+
+        # Remove trailing newline from the result
+        if result[-1] == "\n":
+            result = result[:-1]
+
+        if len(result) == 0:
+            return "ERROR: len = 0"
+        if (result[0] == "?"):
+            return "ERROR: GTP Command failed: " + result[2:]
+        if (result[0] == "="):
+            return result[2:]
+        return "ERROR: Unrecognized answer: " + result
+        
+
+class GTP_player:
+
+    # Class members:
+    #    connection     GTP_connection
+
+    def __init__(self, command):
+        self.connection = GTP_connection(command)
+        protocol_version = self.connection.exec_cmd("protocol_version")
+        if protocol_version[:5] != "ERROR":
+            self.protocol_version = protocol_version
+        else:
+            self.protocol_version = "1"
+
+    def is_known_command(self, command):
+        return self.connection.exec_cmd("known_command " + command) == "true"
+
+    def genmove(self, color):
+        if color[0] in ["b", "B"]:
+            command = "black"
+        elif color[0] in ["w", "W"]:
+            command = "white"
+        if self.protocol_version == "1":
+            command = "genmove_" + command
+        else:
+            command = "genmove " + command
+
+        return self.connection.exec_cmd(command)
+
+    def black(self, move):
+        if self.protocol_version == "1":
+            self.connection.exec_cmd("black " + move)
+        else:
+            self.connection.exec_cmd("play black " + move)
+
+    def white(self, move):
+        if self.protocol_version == "1":
+            self.connection.exec_cmd("white " + move)
+        else:
+            self.connection.exec_cmd("play white " + move)
+
+    def komi(self, komi):
+        self.connection.exec_cmd("komi " + komi)
+
+    def boardsize(self, size):
+        self.connection.exec_cmd("boardsize " + size)
+        if self.protocol_version != "1":
+            self.connection.exec_cmd("clear_board")
+
+    def handicap(self, handicap, handicap_type):
+        if handicap_type == "fixed":
+            result = self.connection.exec_cmd("fixed_handicap %d" % (handicap))
+        else:
+            result = self.connection.exec_cmd("place_free_handicap %d"
+                                              % (handicap))
+
+        return string.split(result, " ")
+
+    def loadsgf(self, endgamefile, move_number):
+        self.connection.exec_cmd(string.join(["loadsgf", endgamefile,
+                                 str(move_number)]))
+
+    def list_stones(self, color):
+        return string.split(self.connection.exec_cmd("list_stones " + color), " ")
+
+    def quit(self):
+        return self.connection.exec_cmd("quit")
+    
+    def showboard(self):
+        board = self.connection.exec_cmd("showboard")
+        if board and (board[0] == "\n"):
+            board = board[1:]
+        return board
+
+    def get_random_seed(self):
+        result = self.connection.exec_cmd("get_random_seed")
+        if result[:5] == "ERROR":
+            return "unknown"
+        return result
+
+    def set_random_seed(self, seed):
+        self.connection.exec_cmd("set_random_seed " + seed)
+
+    def get_program_name(self):
+        return self.connection.exec_cmd("name") + " " + \
+               self.connection.exec_cmd("version")
+
+    def final_score(self):
+        return self.connection.exec_cmd("final_score")
+
+    def score(self):
+        return self.final_score(self)
+
+    def cputime(self):
+        if (self.is_known_command("cputime")):
+            return self.connection.exec_cmd("cputime")
+        else:
+            return "0"
+
+
+class GTP_game:
+
+    # Class members:
+    #    whiteplayer     GTP_player
+    #    blackplayer     GTP_player
+    #    size            int
+    #    komi            float
+    #    handicap        int
+    #    handicap_type   string
+    #    handicap_stones int
+    #    moves           list of string
+    #    resultw
+    #    resultb
+
+    def __init__(self, whitecommand, blackcommand, size, komi, handicap,
+                 handicap_type, endgamefile):
+        self.whiteplayer = GTP_player(whitecommand)
+        self.blackplayer = GTP_player(blackcommand)
+        self.size = size
+        self.komi = komi
+        self.handicap = handicap
+        self.handicap_type = handicap_type
+        self.endgamefile = endgamefile
+        self.sgffilestart = ""
+        if endgamefile != "":
+            self.init_endgame_contest_game()
+        else:
+            self.sgffilestart = ""
+
+    def init_endgame_contest_game(self):
+        infile = open(self.endgamefile)
+        if not infile:
+            print "Couldn't read " + self.endgamefile
+            sys.exit(2)
+        sgflines = infile.readlines()
+        infile.close
+        size = re.compile("SZ\[[0-9]+\]")
+        move = re.compile(";[BW]\[[a-z]{0,2}\]")
+        sgf_start = []
+        for line in sgflines:
+            match = size.search(line)
+            if match:
+                self.size = match.group()[3:-1]
+            match = move.search(line)
+            while match:
+                sgf_start.append("A" + match.group()[1:])
+                line = line[match.end():]
+                match = move.search(line)
+        self.endgame_start = len(sgf_start) - endgame_start_at
+        self.sgffilestart = ";" + string.join(
+                                    sgf_start[:self.endgame_start-1], "") + "\n"
+        if self.endgame_start % 2 == 0:
+            self.first_to_play = "W"
+        else:
+            self.first_to_play = "B"
+
+    def get_position_from_engine(self, engine):
+        black_stones = engine.list_stones("black")
+        white_stones = engine.list_stones("white")
+        self.sgffilestart = ";"
+        if len(black_stones) > 0:
+            self.sgffilestart += "AB"
+            for stone in black_stones:
+                self.sgffilestart += "[%s]" % coords_to_sgf(self.size, stone)
+            self.sgffilestart += "\n"
+        if len(white_stones) > 0:
+            self.sgffilestart += "AW"
+            for stone in white_stones:
+                self.sgffilestart += "[%s]" % coords_to_sgf(self.size, stone)
+            self.sgffilestart += "\n"
+
+    def writesgf(self, sgffilename):
+        "Write the game to an SGF file after a game"
+
+        size = self.size
+        outfile = open(sgffilename, "w")
+        if not outfile:
+            print "Couldn't create " + sgffilename
+            return
+        black_name = self.blackplayer.get_program_name()
+        white_name = self.whiteplayer.get_program_name()
+        black_seed = self.blackplayer.get_random_seed()
+        white_seed = self.whiteplayer.get_random_seed()
+        handicap = self.handicap
+        komi     = self.komi
+        result   = self.resultw
+
+        outfile.write("(;GM[1]FF[4]RU[Japanese]SZ[%s]HA[%s]KM[%s]RE[%s]\n" %
+                      (size, handicap, komi, result))
+        outfile.write("PW[%s (random seed %s)]PB[%s (random seed %s)]\n" %
+                      (white_name, white_seed, black_name, black_seed))
+        outfile.write(self.sgffilestart)
+
+        if handicap > 1:
+            outfile.write("AB");
+            for stone in self.handicap_stones:
+                outfile.write("[%s]" %(coords_to_sgf(size, stone)))
+            outfile.write("PL[W]\n")
+
+        to_play = self.first_to_play
+
+        for move in self.moves:
+            sgfmove = coords_to_sgf(size, move)
+            outfile.write(";%s[%s]\n" % (to_play, sgfmove))
+            if to_play == "B":
+                to_play = "W"
+            else:
+                to_play = "B"
+        outfile.write(")\n")
+        outfile.close
+
+    def set_handicap(self, handicap):
+        self.handicap = handicap
+
+    def swap_players(self):
+        temp = self.whiteplayer
+        self.whiteplayer = self.blackplayer
+        self.blackplayer = temp
+
+    def play(self, sgffile):
+        "Play a game"
+        global verbose
+
+        if verbose >= 1:
+            print "Setting boardsize and komi for black\n"
+        self.blackplayer.boardsize(self.size)
+        self.blackplayer.komi(self.komi)
+
+        if verbose >= 1:
+            print "Setting boardsize and komi for white\n"
+        self.whiteplayer.boardsize(self.size)
+        self.whiteplayer.komi(self.komi)
+
+        self.handicap_stones = []
+
+        if self.endgamefile == "":
+            if self.handicap < 2:
+                self.first_to_play = "B"
+            else:
+                self.handicap_stones = self.blackplayer.handicap(self.handicap, self.handicap_type)
+                for stone in self.handicap_stones:
+                    self.whiteplayer.black(stone)
+                self.first_to_play = "W"
+        else:
+            self.blackplayer.loadsgf(self.endgamefile, self.endgame_start)
+            self.blackplayer.set_random_seed("0")
+            self.whiteplayer.loadsgf(self.endgamefile, self.endgame_start)
+            self.whiteplayer.set_random_seed("0")
+            if self.blackplayer.is_known_command("list_stones"):
+                self.get_position_from_engine(self.blackplayer)
+            elif self.whiteplayer.is_known_command("list_stones"):
+                self.get_position_from_engine(self.whiteplayer)
+
+        to_play = self.first_to_play
+
+        self.moves = []
+        passes = 0
+        won_by_resignation = ""
+        while passes < 2:
+            if to_play == "B":
+                move = self.blackplayer.genmove("black")
+                if move[:5] == "ERROR":
+                    # FIXME: write_sgf
+                    sys.exit(1)
+
+                if move[:6] == "resign":
+                    if verbose >= 1:
+                        print "Black resigns"
+                    won_by_resignation = "W+Resign"
+                    break
+                else:
+                    self.moves.append(move)
+                    if string.lower(move[:4]) == "pass":
+                        passes = passes + 1
+                        if verbose >= 1:
+                            print "Black passes"
+                    else:
+                        passes = 0
+                        self.whiteplayer.black(move)
+                        if verbose >= 1:
+                            print "Black plays " + move
+                to_play = "W"
+            else:
+                move = self.whiteplayer.genmove("white")
+                if move[:5] == "ERROR":
+                    # FIXME: write_sgf
+                    sys.exit(1)
+
+                if move[:6] == "resign":
+                    if verbose >= 1:
+                        print "White resigns"
+                    won_by_resignation = "B+Resign"
+                    break
+                else:
+                    self.moves.append(move)
+                    if string.lower(move[:4]) == "pass":
+                        passes = passes + 1
+                        if verbose >= 1:
+                            print "White passes"
+                    else:
+                        passes = 0
+                        self.blackplayer.white(move)
+                        if verbose >= 1:
+                            print "White plays " + move
+                to_play = "B"
+
+            if verbose >= 2:
+                print self.whiteplayer.showboard() + "\n"
+
+        if won_by_resignation == "":
+            self.resultw = self.whiteplayer.final_score()
+            self.resultb = self.blackplayer.final_score()
+        else:
+            self.resultw = won_by_resignation;
+            self.resultb = won_by_resignation;
+    #    if self.resultb == self.resultw:
+    #        print "Result: ", self.resultw
+    #    else:
+    #        print "Result according to W: ", self.resultw
+    #        print "Result according to B: ", self.resultb
+        # FIXME:   $self->writesgf($sgffile) if defined $sgffile;
+        if sgffile != "":
+            self.writesgf(sgffile)
+
+    def result(self):
+        return (self.resultw, self.resultb)
+
+    def cputime(self):
+        cputime = {}
+        cputime["white"] = self.whiteplayer.cputime()
+        cputime["black"] = self.blackplayer.cputime()
+        return cputime
+    
+    def quit(self):
+        self.blackplayer.quit()
+        self.whiteplayer.quit()
+
+
+class GTP_match:
+
+    # Class members:
+    #    black
+    #    white
+    #    size
+    #    komi
+    #    handicap
+    #    handicap_type
+
+    def __init__(self, whitecommand, blackcommand, size, komi, handicap,
+                 handicap_type, streak_length, endgamefilelist):
+        self.white = whitecommand
+        self.black = blackcommand
+        self.size = size
+        self.komi = komi
+        self.handicap = handicap
+        self.handicap_type = handicap_type
+        self.streak_length = streak_length
+        self.endgamefilelist = endgamefilelist
+
+    def endgame_contest(self, sgfbase):
+        results = []
+        i = 1
+        for endgamefile in self.endgamefilelist:
+            game1 = GTP_game(self.white, self.black, self.size, self.komi,
+                             0, "", endgamefile)
+            game2 = GTP_game(self.black, self.white, self.size, self.komi,
+                             0, "", endgamefile)
+            if verbose:
+                print "Replaying", endgamefile
+                print "Black:", self.black
+                print "White:", self.white
+            game1.play("")
+            result1 = game1.result()[0]
+            if result1 != "0":
+                plain_result1 = re.search(r"([BW]\+)([0-9]*\.[0-9]*)", result1)
+                result1_float = float(plain_result1.group(2))
+            else:
+                plain_result1 = re.search(r"(0)", "0")
+                result1_float = 0.0
+            if result1[0] == "B":
+                result1_float *= -1
+            if verbose:
+                print "Result:", result1
+                print "Replaying", endgamefile
+                print "Black:", self.white
+                print "White:", self.black
+            game2.play("")
+            result2 = game2.result()[1]
+            if verbose:
+                print "Result:", result2
+            if result2 != "0":
+                plain_result2 = re.search(r"([BW]\+)([0-9]*\.[0-9]*)", result2)
+                result2_float = float(plain_result2.group(2))
+            else:
+                plain_result2 = re.search(r"(0)", "0")
+                result2_float = 0.0
+
+            if result2[0] == "B":
+                result2_float *= -1
+            results.append(result1_float - result2_float)
+            if (result1 != result2):
+                print endgamefile+ ":", plain_result1.group(), \
+                    plain_result2.group(), "Difference:",
+                print result1_float - result2_float
+            else:
+                print endgamefile+": Same result:", plain_result1.group()
+            sgffilename = "%s%03d" % (sgfbase, i)
+            game1.writesgf(sgffilename + "_1.sgf")
+            game2.writesgf(sgffilename + "_2.sgf")
+            game1.quit()
+            game2.quit()
+            i += 1
+        return results
+
+    def play(self, games, sgfbase):
+        last_color = ""
+        last_streak = 0
+        game = GTP_game(self.white, self.black,
+                        self.size, self.komi, self.handicap,
+                        self.handicap_type, "")
+        results = []
+        for i in range(games):
+            sgffilename = "%s%03d.sgf" % (sgfbase, i + 1)
+            game.play(sgffilename)
+            result = game.result()
+            if result[0] == result[1]:
+                print "Game %d: %s" % (i + 1, result[0])
+            else:
+                print "Game %d: %s %s" % (i + 1, result[0], result[1])
+
+            if result[0][0] == last_color:
+                last_streak += 1
+            elif result[0][0] != "0":
+                last_color = result[0][0]
+                last_streak = 1
+
+            if last_streak == self.streak_length:
+                if last_color == "W":
+                    self.handicap += 1
+                    if self.handicap == 1:
+                        self.handicap = 2
+                    print "White wins too often. Increasing handicap to %d" \
+                          % (self.handicap)
+                else:   
+                    if self.handicap > 0:
+                        self.handicap -= 1
+                        if self.handicap == 1:
+                            self.handicap = 0
+                        print "Black wins too often. Decreasing handicap to %d" \
+                              % (self.handicap)
+                    else:
+                        self.handicap = 2
+                        game.swap_players()
+                        print "Black looks stronger than white. Swapping colors and setting handicap to 2"
+                game.set_handicap(self.handicap)
+                last_color = ""
+                last_streak = 0
+            results.append(result)
+        cputime = game.cputime()
+        game.quit()
+        return results, cputime
+
+
+# ================================================================
+#                      Main program
+#
+
+
+# Default values
+#
+
+white    = ""
+black    = ""
+komi     = ""
+size     = "19"
+handicap = 0
+handicap_type = "fixed"
+streak_length = -1
+endgame_start_at = 0
+
+games   = 1
+sgfbase = "twogtp"
+
+verbose = 0
+
+helpstring = """
+
+Run with:
+
+twogtp --white \'<path to program 1> --mode gtp [program options]\' \\
+       --black \'<path to program 2> --mode gtp [program options]\' \\
+       [twogtp options]
+
+Possible twogtp options:
+
+  --verbose 1 (to list moves) or --verbose 2 (to draw board)
+  --komi <amount>
+  --handicap <amount>
+  --free-handicap <amount>
+  --adjust-handicap <length>        (change handicap by 1 after <length> wins
+                                     in a row)
+  --size <board size>               (default 19)
+  --games <number of games to play> (default 1)
+  --sgfbase <filename>              (create sgf files with sgfbase as basename)
+  --endgame <moves before end>      (endgame contest - add filenames of
+                                     games to be replayed after last option)
+"""
+
+def usage():
+    print helpstring
+    sys.exit(1)
+
+try:
+    (opts, params) = getopt(sys.argv[1:], "",
+                            ["black=",
+                             "white=",
+                             "verbose=",
+                             "komi=",
+                             "boardsize=",
+                             "size=",
+                             "handicap=",
+                             "free-handicap=",
+                             "adjust-handicap=",
+                             "games=",
+                             "sgfbase=",
+                             "endgame=",
+                            ])
+except:
+    usage();
+
+for opt, value in opts:
+    if opt == "--black":
+        black = value
+    elif opt == "--white":
+        white = value
+    elif opt == "--verbose":
+        verbose = int(value)
+    elif opt == "--komi":
+        komi = value
+    elif opt == "--boardsize" or opt == "--size":
+        size = value
+    elif opt == "--handicap":
+        handicap = int(value)
+        handicap_type = "fixed"
+    elif opt == "--free-handicap":
+        handicap = int(value)
+        handicap_type = "free"
+    elif opt == "--adjust-handicap":
+        streak_length = int(value)
+    elif opt == "--games":
+        games = int(value)
+    elif opt == "--sgfbase":
+        sgfbase = value
+    elif opt == "--endgame":
+        endgame_start_at = int(value)
+
+if endgame_start_at != 0:
+    endgame_filelist = params
+else:
+    endgame_filelist = []
+    if params != []:
+        usage()
+            
+
+if black == "" or white == "":
+    usage()
+
+if komi == "":
+    if handicap > 1 and streak_length == -1:
+        komi = "0.5"
+    else:
+        komi = "5.5"
+
+match = GTP_match(white, black, size, komi, handicap, handicap_type,
+                  streak_length, endgame_filelist)
+if endgame_filelist != []:
+    results = match.endgame_contest(sgfbase)
+    win_black = 0
+    win_white = 0
+    for res in results:
+        print res
+        if res > 0.0:
+            win_white += 1
+        elif res < 0.0:
+            win_black += 1
+    print "%d games, %d wins for black, %d wins for white." \
+         % (len(results), win_black, win_white)
+
+else:
+    results, cputimes = match.play(games, sgfbase)
+
+    i = 0
+    for resw, resb in results:
+        i = i + 1
+        if resw == resb:
+            print "Game %d: %s" % (i, resw)
+        else:
+            print "Game %d: %s %s" % (i, resb, resw)
+    if (cputimes["white"] != "0"):
+        print "White: %ss CPU time" % cputimes["white"]
+    if (cputimes["black"] != "0"):
+        print "Black: %ss CPU time" % cputimes["black"]
diff --git a/interface/gtp_examples/vanilla.c b/interface/gtp_examples/vanilla.c
new file mode 100644 (file)
index 0000000..566cd99
--- /dev/null
@@ -0,0 +1,134 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3             *
+ * or (at your option) any later version.                            *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* This program uses two pipes to communicate with the
+ * GNU Go client. To an external client it appears to
+ * be a gtp engine. It accomplishes this by intercepting
+ * gtp commands and passing them on to GNU Go.
+ *
+ * This program in and of itself is not useful but it
+ * can be the basis of useful programs. Example: hack
+ * in gmp.c and get a gtp / gmp mediator.
+ * 
+ * Pipe a: client --> gnugo
+ * Pipe b: gnugo --> client
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+void error(const char *msg);
+#define TELL_GNUGO(x) if (verbose) fprintf(stderr, "%s", x); \
+                      if (fprintf(to_gnugo_stream, "%s", x) < 0) \
+                         error ("can't write command in to_gnugo_stream"); \
+                      fflush(to_gnugo_stream);
+#define ASK_GNUGO(x)  if (!fgets(x, 128, from_gnugo_stream)) \
+                         error("can't get response");
+int
+main()
+{
+  int pfd_a[2];
+  int pfd_b[2];
+  char gnugo_line[128], client_line[128];
+  int length = 0;
+  int verbose = 1;
+  FILE *to_gnugo_stream, *from_gnugo_stream;
+
+  if (pipe(pfd_a) == -1)
+    error("can't open pipe a");
+  if (pipe(pfd_b) == -1)
+    error("can't open pipe b");
+  switch (fork()) {
+  case -1:
+    error("fork failed (try chopsticks)");
+  case 0:
+    /* Attach pipe a to stdin */
+    if (dup2(pfd_a[0], 0) == -1) 
+      error("dup pfd_a[0] failed");
+    /* attach pipe b to stdout" */
+    if (dup2(pfd_b[1], 1) == -1)
+      error("dup pfd_b[1] failed");
+    execlp("gnugo", "gnugo", "--mode", "gtp", "--quiet", NULL);
+    error("execlp failed");
+  }
+  /* We use stderr to communicate with the client since stdout is needed. */
+  /* Attach pipe a to to_gnugo_stream  */
+  to_gnugo_stream = fdopen(pfd_a[1], "w");
+  /* Attach pipe b to from_gnugo_stream */
+  from_gnugo_stream = fdopen(pfd_b[0], "r");
+
+  while (1) {
+    int length = 0;
+    if (!fgets(client_line, 128, stdin) 
+       || !strncmp(client_line, "quit", 4)) {
+      TELL_GNUGO("quit\n");
+      return 1;
+    }
+    if (!strncmp(client_line, "genmove_black", 13)) {
+      char *token;
+      const char delimiters[] = " \t\r\n";
+      float value1, value2;
+
+      TELL_GNUGO("top_moves_black\n");
+      ASK_GNUGO(gnugo_line);
+      token = strtok(gnugo_line, delimiters);
+      token = strtok(NULL, delimiters);
+      TELL_GNUGO("black ");
+      TELL_GNUGO(token);
+      TELL_GNUGO("\n");
+      ASK_GNUGO(gnugo_line);
+      while (length != 1) {
+       ASK_GNUGO(gnugo_line);
+       length = strlen(gnugo_line);
+       printf(gnugo_line);
+       fflush(stdout);
+      }
+    }
+    else {
+      TELL_GNUGO(client_line);
+      while (length != 1) {
+       ASK_GNUGO(gnugo_line);
+       length = strlen(gnugo_line);
+       printf(gnugo_line);
+       fflush(stdout);
+      }
+    }
+  }
+}
+
+void
+error(const char *msg)      
+{
+  fprintf(stderr, "vanilla: %s\n", msg);
+  abort();
+}
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/interface.h b/interface/interface.h
new file mode 100644 (file)
index 0000000..8412f24
--- /dev/null
@@ -0,0 +1,56 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ * interface.h
+ *     This file contains all headers for interfaces
+ *-------------------------------------------------------------------------*/
+
+#ifndef _PLAY_INTERFACE_H
+#define _PLAY_INTERFACE_H
+
+#include "gnugo.h"
+#include "sgftree.h"
+
+void play_ascii(SGFTree *tree, Gameinfo *gameinfo, 
+               char *filename, char *until);
+void play_gtp(FILE *gtp_input, FILE *gtp_output, FILE *gtp_dump_commands,
+             int gtp_initial_orientation);
+void play_gmp(Gameinfo *gameinfo, int simplified);
+void play_solo(Gameinfo *gameinfo, int benchmark);
+void play_replay(SGFTree *tree, int color_to_test);
+
+void load_and_analyze_sgf_file(Gameinfo *gameinfo);
+void load_and_score_sgf_file(SGFTree *tree, Gameinfo *gameinfo,
+                            const char *scoringmode);
+
+
+#endif
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/main.c b/interface/main.c
new file mode 100644 (file)
index 0000000..dfb0aed
--- /dev/null
@@ -0,0 +1,1988 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_UNISTD_H
+/* For isatty(). */
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include "liberty.h"
+
+#include "gg-getopt.h"
+#include "gg_utils.h"
+#include "winsocket.h"
+
+#include "interface.h"
+#include "sgftree.h"
+#include "random.h"
+
+static void show_copyright(void);
+static void show_version(void);
+static void show_help(void);
+static void show_debug_help(void);
+static void show_debug_flags(void);
+
+static void socket_connect_to(const char *host_name, unsigned int port,
+                             FILE **input_file, FILE **output_file);
+static void socket_listen_at(const char *host_name, unsigned int port,
+                            FILE **input_file, FILE **output_file);
+static void socket_close_connection(FILE *input_file, FILE *output_file);
+static void socket_stop_listening(FILE *input_file, FILE *output_file);
+
+
+/* long options which have no short form */
+enum {OPT_BOARDSIZE = 127,
+      OPT_HANDICAPSTONES,
+      OPT_COLOR,
+      OPT_KOMI,
+      OPT_CLOCK_TIME,
+      OPT_CLOCK_BYO_TIME,
+      OPT_CLOCK_BYO_PERIOD,
+      OPT_AUTOLEVEL,
+      OPT_MODE,
+      OPT_INFILE,
+      OPT_OUTFILE, 
+      OPT_QUIET,
+      OPT_GTP_INPUT,
+      OPT_GTP_CONNECT,
+      OPT_GTP_LISTEN,
+      OPT_GTP_DUMP_COMMANDS,
+      OPT_GTP_INITIAL_ORIENTATION,
+      OPT_GTP_VERSION,
+      OPT_SHOWCOPYRIGHT,
+      OPT_REPLAY_GAME,
+      OPT_DECIDE_STRING,
+      OPT_DECIDE_CONNECTION,
+      OPT_DECIDE_OWL,
+      OPT_DECIDE_DRAGON_DATA,
+      OPT_DECIDE_SEMEAI,
+      OPT_DECIDE_SURROUNDED,
+      OPT_DECIDE_TACTICAL_SEMEAI,
+      OPT_DECIDE_ORACLE,
+      OPT_EXPERIMENTAL_SEMEAI,
+      OPT_EXPERIMENTAL_OWL_EXT,
+      OPT_SEMEAI_NODE_LIMIT,
+      OPT_EXPERIMENTAL_CONNECTIONS,
+      OPT_ALTERNATE_CONNECTIONS,
+      OPT_WITH_BREAK_IN,
+      OPT_WITHOUT_BREAK_IN,
+      OPT_COSMIC_GNUGO,
+      OPT_NO_COSMIC_GNUGO,
+      OPT_LARGE_SCALE,
+      OPT_NO_LARGE_SCALE,
+      OPT_OPTIONS,
+      OPT_STANDARD_SEMEAI,
+      OPT_STANDARD_CONNECTIONS,
+      OPT_PRINT_LEVELS,
+      OPT_DECIDE_POSITION,
+      OPT_DECIDE_EYE,
+      OPT_DECIDE_COMBINATION,
+      OPT_BRANCH_DEPTH,
+      OPT_BACKFILL2_DEPTH,
+      OPT_BREAK_CHAIN_DEPTH,
+      OPT_SUPERSTRING_DEPTH,
+      OPT_AA_DEPTH,
+      OPT_DEBUG_FLAGS,
+      OPT_OWL_DISTRUST,
+      OPT_OWL_BRANCH,
+      OPT_OWL_READING,
+      OPT_OWL_NODE_LIMIT,
+      OPT_NOFUSEKIDB,
+      OPT_NOFUSEKI,
+      OPT_NOJOSEKIDB,
+      OPT_LEVEL,
+      OPT_MIN_LEVEL,
+      OPT_MAX_LEVEL,
+      OPT_LIMIT_SEARCH,
+      OPT_SHOWTIME,
+      OPT_SHOWSCORE,
+      OPT_DEBUG_INFLUENCE,
+      OPT_SCORE,
+      OPT_PRINTSGF,
+      OPT_PROFILE_PATTERNS,
+      OPT_CHINESE_RULES,
+      OPT_OWL_THREATS,
+      OPT_NO_OWL_THREATS,
+      OPT_JAPANESE_RULES,
+      OPT_FORBID_SUICIDE,
+      OPT_ALLOW_SUICIDE,
+      OPT_ALLOW_ALL_SUICIDE,
+      OPT_SIMPLE_KO,
+      OPT_NO_KO,
+      OPT_POSITIONAL_SUPERKO,
+      OPT_SITUATIONAL_SUPERKO,
+      OPT_CAPTURE_ALL_DEAD,
+      OPT_PLAY_OUT_AFTERMATH,
+      OPT_MIRROR,
+      OPT_MIRROR_LIMIT,
+      OPT_METAMACHINE,
+      OPT_RESIGN_ALLOWED,
+      OPT_NEVER_RESIGN,
+      OPT_MONTE_CARLO,
+      OPT_MC_GAMES_PER_LEVEL,
+      OPT_MC_PATTERNS,
+      OPT_MC_LIST_PATTERNS,
+      OPT_MC_LOAD_PATTERNS
+};
+
+/* names of playing modes */
+
+enum mode {
+  MODE_UNKNOWN = 0,
+  MODE_ASCII,
+  MODE_GTP,
+  MODE_GMP,
+  MODE_SGMP,
+  MODE_SGF,
+  MODE_LOAD_AND_ANALYZE,
+  MODE_LOAD_AND_SCORE,
+  MODE_LOAD_AND_PRINT,
+  MODE_SOLO,
+  MODE_REPLAY,
+  MODE_DECIDE_STRING,
+  MODE_DECIDE_CONNECTION,
+  MODE_DECIDE_OWL,
+  MODE_DECIDE_DRAGON_DATA,
+  MODE_DECIDE_SEMEAI,
+  MODE_DECIDE_TACTICAL_SEMEAI,
+  MODE_DECIDE_POSITION,
+  MODE_DECIDE_EYE,
+  MODE_DECIDE_COMBINATION,
+  MODE_DECIDE_SURROUNDED,
+  MODE_DECIDE_ORACLE
+};
+
+
+/* Definitions of the --long options. Final column is
+ * either an OPT_ as defined in the enum above, or it
+ * is the equivalent single-letter option.
+ * It is useful to keep them in the same order as the
+ * help string, for maintenance purposes only.
+ */
+
+static struct gg_option const long_options[] =
+{
+  {"mode",           required_argument, 0, OPT_MODE},
+  {"replay",         required_argument, 0, OPT_REPLAY_GAME},
+  {"quiet",          no_argument,       0, OPT_QUIET},
+  {"silent",         no_argument,       0, OPT_QUIET},
+  {"gtp-input",      required_argument, 0, OPT_GTP_INPUT},
+  {"gtp-connect",    required_argument, 0, OPT_GTP_CONNECT},
+  {"gtp-listen",     required_argument, 0, OPT_GTP_LISTEN},
+  {"gtp-dump-commands", required_argument, 0, OPT_GTP_DUMP_COMMANDS},
+  {"orientation",    required_argument, 0, OPT_GTP_INITIAL_ORIENTATION},
+  {"gtp-initial-orientation",
+                    required_argument, 0, OPT_GTP_INITIAL_ORIENTATION},
+  {"gtp-version",    required_argument, 0, OPT_GTP_VERSION},
+  {"infile",         required_argument, 0, 'l'},
+  {"until",          required_argument, 0, 'L'},
+  {"outfile",        required_argument, 0, 'o'},
+  {"output-flags",   required_argument, 0, 'O'},
+  {"boardsize",      required_argument, 0, OPT_BOARDSIZE},
+  {"color",          required_argument, 0, OPT_COLOR},
+  {"handicap",       required_argument, 0, OPT_HANDICAPSTONES},
+  {"komi",           required_argument, 0, OPT_KOMI},
+  {"help",           optional_argument, 0, 'h'},
+  {"copyright",      no_argument,       0, OPT_SHOWCOPYRIGHT},
+  {"version",        no_argument,       0, 'v'},
+  {"allpats",        no_argument,       0, 'a'},
+  {"printboard",     no_argument,       0, 'T'},
+  {"printeyes",      no_argument,       0, 'E'},
+  {"debug",          required_argument, 0, 'd'},
+  {"debug-flags",    no_argument,       0,  OPT_DEBUG_FLAGS},
+  {"depth",          required_argument, 0, 'D'},
+  {"backfill-depth", required_argument, 0, 'B'},
+  {"branch-depth",   required_argument, 0, OPT_BRANCH_DEPTH},
+  {"backfill2-depth",   required_argument, 0, OPT_BACKFILL2_DEPTH},
+  {"break-chain-depth", required_argument, 0, OPT_BREAK_CHAIN_DEPTH},
+  {"superstring-depth", required_argument, 0, OPT_SUPERSTRING_DEPTH},
+  {"fourlib-depth",  required_argument, 0, 'F'},
+  {"ko-depth",       required_argument, 0, 'K'},
+  {"aa-depth",       required_argument, 0, OPT_AA_DEPTH},
+  {"owl-distrust",   required_argument, 0, OPT_OWL_DISTRUST},
+  {"owl-branch",     required_argument, 0, OPT_OWL_BRANCH},
+  {"owl-reading",    required_argument, 0, OPT_OWL_READING},
+  {"owl-node-limit", required_argument, 0, OPT_OWL_NODE_LIMIT},
+  {"print-levels",   no_argument,       0, OPT_PRINT_LEVELS},
+  {"level",          required_argument, 0, OPT_LEVEL},
+  {"min-level",      required_argument, 0, OPT_MIN_LEVEL},
+  {"max-level",      required_argument, 0, OPT_MAX_LEVEL},
+  {"limit-search",   required_argument, 0, OPT_LIMIT_SEARCH},
+  {"clock",          required_argument, 0, OPT_CLOCK_TIME},
+  {"byo-time",       required_argument, 0, OPT_CLOCK_BYO_TIME},
+  {"byo-period",     required_argument, 0, OPT_CLOCK_BYO_PERIOD},
+  {"autolevel",      no_argument,       0, OPT_AUTOLEVEL},
+  {"chinese-rules",  no_argument,       0, OPT_CHINESE_RULES},
+  {"japanese-rules", no_argument,       0, OPT_JAPANESE_RULES},
+  {"experimental-semeai",  no_argument, 0, OPT_EXPERIMENTAL_SEMEAI},
+  {"experimental-owl-ext",  no_argument, 0, OPT_EXPERIMENTAL_OWL_EXT},
+  {"semeai-node-limit",   required_argument, 0, OPT_SEMEAI_NODE_LIMIT},
+  {"experimental-connections",  no_argument, 0, OPT_EXPERIMENTAL_CONNECTIONS},
+  {"standard-connections",  no_argument, 0, OPT_STANDARD_CONNECTIONS},
+  {"standard-semeai", no_argument,      0, OPT_STANDARD_SEMEAI},
+  {"alternate-connections",  no_argument, 0, OPT_ALTERNATE_CONNECTIONS},
+  {"with-break-in",       no_argument, 0, OPT_WITH_BREAK_IN},
+  {"without-break-in",     no_argument, 0, OPT_WITHOUT_BREAK_IN},
+  {"cosmic-gnugo",         no_argument, 0, OPT_COSMIC_GNUGO},
+  {"no-cosmic-gnugo",      no_argument, 0, OPT_NO_COSMIC_GNUGO},
+  {"large-scale",          no_argument, 0, OPT_LARGE_SCALE},
+  {"no-large-scale",       no_argument, 0, OPT_NO_LARGE_SCALE},
+  {"options",              no_argument, 0, OPT_OPTIONS},
+  {"forbid-suicide",       no_argument, 0, OPT_FORBID_SUICIDE},
+  {"allow-suicide",        no_argument, 0, OPT_ALLOW_SUICIDE},
+  {"allow-all-suicide",    no_argument, 0, OPT_ALLOW_ALL_SUICIDE},
+  {"simple-ko",            no_argument, 0, OPT_SIMPLE_KO},
+  {"no-ko",                no_argument, 0, OPT_NO_KO},
+  {"positional-superko",   no_argument, 0, OPT_POSITIONAL_SUPERKO},
+  {"situational-superko",  no_argument, 0, OPT_SITUATIONAL_SUPERKO},
+  {"capture-all-dead",     no_argument, 0, OPT_CAPTURE_ALL_DEAD},
+  {"play-out-aftermath",   no_argument, 0, OPT_PLAY_OUT_AFTERMATH},
+  {"cache-size",     required_argument, 0, 'M'},
+  {"worms",          no_argument,       0, 'w'},
+  {"moyo",           required_argument, 0, 'm'},
+  {"benchmark",      required_argument, 0, 'b'},
+  {"statistics",     no_argument,       0, 'S'},
+  {"trace",          no_argument,       0, 't'},
+  {"seed",           required_argument, 0, 'r'},
+  {"decide-string",  required_argument, 0, OPT_DECIDE_STRING},
+  {"decide-connection", required_argument, 0, OPT_DECIDE_CONNECTION},
+  {"decide-dragon",  required_argument, 0, OPT_DECIDE_OWL},
+  {"decide-owl",     required_argument, 0, OPT_DECIDE_OWL},
+  {"decide-dragon-data",  required_argument, 0, OPT_DECIDE_DRAGON_DATA},
+  {"decide-semeai",  required_argument, 0, OPT_DECIDE_SEMEAI},
+  {"decide-tactical-semeai", required_argument, 0, OPT_DECIDE_TACTICAL_SEMEAI},
+  {"decide-position", no_argument,      0, OPT_DECIDE_POSITION},
+  {"decide-surrounded",  required_argument, 0, OPT_DECIDE_SURROUNDED},
+  {"decide-eye",     required_argument, 0, OPT_DECIDE_EYE},
+  {"decide-combination", no_argument,   0, OPT_DECIDE_COMBINATION},
+  {"decide-oracle",  no_argument,       0, OPT_DECIDE_ORACLE},
+  {"nofusekidb",     no_argument,       0, OPT_NOFUSEKIDB},
+  {"nofuseki",       no_argument,       0, OPT_NOFUSEKI},
+  {"nojosekidb",     no_argument,       0, OPT_NOJOSEKIDB},
+  {"debug-influence", required_argument, 0, OPT_DEBUG_INFLUENCE},
+  {"showtime",       no_argument,       0, OPT_SHOWTIME},
+  {"showscore",      no_argument,       0, OPT_SHOWSCORE},
+  {"score",          required_argument, 0, OPT_SCORE},
+  {"printsgf",       required_argument, 0, OPT_PRINTSGF},
+  {"profile-patterns", no_argument,     0, OPT_PROFILE_PATTERNS},
+  {"mirror",         no_argument,       0, OPT_MIRROR},
+  {"mirror-limit",   required_argument, 0, OPT_MIRROR_LIMIT},
+  {"metamachine",    no_argument,       0, OPT_METAMACHINE},
+  {"resign-allowed", no_argument,       0, OPT_RESIGN_ALLOWED},
+  {"never-resign",   no_argument,       0, OPT_NEVER_RESIGN},
+  {"monte-carlo",    no_argument,       0, OPT_MONTE_CARLO},
+  {"mc-games-per-level", required_argument, 0, OPT_MC_GAMES_PER_LEVEL},
+  {"mc-patterns",    required_argument, 0, OPT_MC_PATTERNS},
+  {"mc-list-patterns", no_argument,     0, OPT_MC_LIST_PATTERNS},
+  {"mc-load-patterns", required_argument, 0, OPT_MC_LOAD_PATTERNS},
+  {NULL, 0, NULL, 0}
+};
+
+
+int
+main(int argc, char *argv[])
+{
+  Gameinfo gameinfo;
+  SGFTree sgftree;
+
+  int i;
+  int mandated_color = EMPTY;
+  enum mode playmode = MODE_UNKNOWN;
+  int replay_color = EMPTY;
+  
+  char *infilename = NULL;
+  char *untilstring = NULL;
+  char *scoringmode = NULL;
+  char *outfile = NULL;
+  char *outflags = NULL;
+  char *gtpfile = NULL;
+  char *gtp_dump_commands_file = NULL;
+  int gtp_tcp_ip_mode = 0;
+  char *gtp_tcp_ip_address = NULL;
+  
+  char *printsgffile = NULL;
+  
+  char decide_this[8];
+  char *decide_that = NULL;
+  char debuginfluence_move[4] = "\0";
+  
+  int benchmark = 0;  /* benchmarking mode (-b) */
+  FILE *output_check;
+  int orientation = 0;
+
+  char mc_pattern_name[40] = "";
+  char mc_pattern_filename[320] = "";
+
+  float memory = (float) DEFAULT_MEMORY; /* Megabytes used for hash table. */
+
+  /* If seed is zero, GNU Go will play a different game each time. If
+   * it is set using -r, GNU Go will play the same game each time.
+   * (Change seed to get a different game).
+   */
+  int seed = 0;
+  int seed_specified = 0;
+  
+  int requested_boardsize = -1;
+
+  sgftree_clear(&sgftree);
+  gameinfo_clear(&gameinfo);
+  
+  /* Weed through all of the command line options. */
+  while ((i = gg_getopt_long(argc, argv, 
+                            "-ab:B:d:D:EF:gh::K:l:L:M:m:o:O:p:r:fsStTvw",
+                            long_options, NULL)) != EOF)
+    {
+      switch (i) {
+      case 'T': printboard++; break;
+      case 't': ++verbose; break;
+      case 'a': allpats = 1; break;
+
+      case  1 :
+      case 'l': infilename = gg_optarg; 
+       break;
+       
+      case 'b': benchmark = atoi(gg_optarg); playmode = MODE_SOLO; break;
+      case 'r': seed = atoi(gg_optarg); seed_specified = 1; break;
+      case 'S': showstatistics = 1; break;
+      case 'w': printworms = 1; break;
+      case 'm': printmoyo = strtol(gg_optarg, NULL, 0);  /* allows 0x... */ 
+       break;
+      case 'd': debug ^= strtol(gg_optarg, NULL, 0);  /* allows 0x... */ break;
+      case 'D': mandated_depth = atoi(gg_optarg); break;
+      case 'M': memory = atof(gg_optarg); break; /* floating point number */
+      case 'E': printboard = 2; break;
+      case 'B': mandated_backfill_depth = atoi(gg_optarg); break;
+      case 'F': mandated_fourlib_depth = atoi(gg_optarg); break;
+      case 'K': mandated_ko_depth = atoi(gg_optarg); break;
+
+      case 'L':
+       untilstring = gg_optarg;
+       break;
+       
+      case 'o':
+       if (strlen(gg_optarg) >= sizeof(outfilename)) {
+         fprintf(stderr, "Too long filename given as value to -o option.\n");
+         exit(EXIT_FAILURE);
+       }
+       outfile = gg_optarg;
+       strcpy(outfilename, gg_optarg);
+       break;
+
+      case 'O':
+       outflags = gg_optarg;
+       output_flags = 0;
+       if (outflags)
+         while (*outflags) {
+           switch (*outflags) {
+           case 'd':
+             output_flags |= OUTPUT_MARKDRAGONS;
+             break;
+           case 'v':
+             output_flags |= OUTPUT_MOVEVALUES;
+             break;
+           }
+           outflags++;
+         }
+       break;
+       
+      case OPT_QUIET:
+       quiet = 1;
+       break;
+
+      case OPT_GTP_INPUT:
+      case OPT_GTP_CONNECT:
+      case OPT_GTP_LISTEN:
+       if (gtp_tcp_ip_mode != 0 || gtpfile != NULL) {
+         fprintf(stderr, ("Options `--gtp-input', `--gtp-connect' and `--gtp-listen' "
+                          "are mutually-exclusive\n"));
+         exit(EXIT_FAILURE);
+       }
+
+       if (i == OPT_GTP_INPUT)
+         gtpfile = gg_optarg;
+       else {
+         gtp_tcp_ip_mode = i;
+         gtp_tcp_ip_address = gg_optarg;
+       }
+
+       break;
+
+      case OPT_GTP_DUMP_COMMANDS:
+       gtp_dump_commands_file = gg_optarg;
+       break;
+       
+      case OPT_GTP_INITIAL_ORIENTATION:
+       orientation = atoi(gg_optarg);
+       if (orientation < 0 || orientation > 7) {
+         fprintf(stderr, "Invalid orientation: %d.\n", orientation);
+         fprintf(stderr, "Try `gnugo --help' for more information.\n");
+         exit(EXIT_FAILURE);
+       }
+       break;
+       
+      case OPT_GTP_VERSION:
+       gtp_version = atoi(gg_optarg);
+       break;
+       
+      case OPT_OPTIONS:
+       if (USE_BREAK_IN)
+         fprintf(stdout,
+                 "configure option enabled: experimental break-ins\n");
+       if (COSMIC_GNUGO)
+         fprintf(stdout,
+                 "configure option enabled: cosmic GNU Go \n");
+       if (LARGE_SCALE)
+         fprintf(stdout,
+                 "configure option enabled: large scale captures \n");
+       if (EXPERIMENTAL_CONNECTIONS)
+         fprintf(stdout,
+                 "configure option enabled: experimental connections\n");
+       if (ALTERNATE_CONNECTIONS)
+         fprintf(stdout,
+                 "configure option enabled: alternate connections\n");
+       if (EXPERIMENTAL_OWL_EXT)
+         fprintf(stdout,
+                 "configure option enabled: experimental GAIN/LOSS codes\n");
+       if (OWL_THREATS)
+         fprintf(stdout,
+                 "configure option enabled: owl threats\n");
+       if (RESIGNATION_ALLOWED)
+         fprintf(stdout,
+                 "configure option enabled: resignation allowed\n");
+       if (ORACLE)
+         fprintf(stdout,
+                 "configure option enabled: oracle\n");
+       fprintf(stdout,
+               "Owl node limit: %d\n", OWL_NODE_LIMIT);
+       fprintf(stdout,
+               "Semeai node limit: %d\n", SEMEAI_NODE_LIMIT);
+       if (DEFAULT_MEMORY == -1)
+         fprintf(stdout, "Cache size: %d MB (special default value)\n",
+                 DEFAULT_MEMORY);
+       else
+         fprintf(stdout, "Cache size: %d MB\n", DEFAULT_MEMORY);
+
+       return EXIT_SUCCESS;
+       break;
+
+      case OPT_SHOWTIME:
+       showtime = 1;
+       break;
+       
+      case OPT_SHOWSCORE:
+       showscore = 1;
+       break;
+       
+      case OPT_HANDICAPSTONES:
+       {
+         int requested_handicap = atoi(gg_optarg);
+         
+         if (requested_handicap < 0 || requested_handicap > MAX_HANDICAP) {
+           fprintf(stderr, "Unsupported handicap: %d.\n", requested_handicap);
+           fprintf(stderr, "Try `gnugo --help' for more information.\n");
+           exit(EXIT_FAILURE);
+         }
+         gameinfo.handicap = requested_handicap;
+       }
+        break;
+      
+      case OPT_BOARDSIZE:
+       requested_boardsize = atoi(gg_optarg);
+       break;
+       
+      case OPT_KOMI: 
+       if (sscanf(gg_optarg, "%f", &komi) != 1) {
+         fprintf(stderr, "Invalid komi selection: %s\n", gg_optarg);
+         fprintf(stderr, "Try `gnugo --help' for more information.\n");
+         exit(EXIT_FAILURE);
+       }
+       break;
+       
+      case OPT_CHINESE_RULES: 
+       chinese_rules = 1;
+       break;
+
+      case OPT_OWL_THREATS: 
+       owl_threats = 1;
+       break;
+
+      case OPT_NO_OWL_THREATS: 
+       owl_threats = 0;
+       break;
+
+      case OPT_METAMACHINE:
+        metamachine = 1;
+       break;
+
+      case OPT_JAPANESE_RULES: 
+       chinese_rules = 0;
+       break;
+
+      case OPT_EXPERIMENTAL_OWL_EXT:
+       experimental_owl_ext = 1;
+       break;
+
+      case OPT_SEMEAI_NODE_LIMIT:
+       mandated_semeai_node_limit = atoi(gg_optarg);
+       break;
+
+      case OPT_EXPERIMENTAL_CONNECTIONS:
+       experimental_connections = 1;
+       break;
+
+      case OPT_STANDARD_CONNECTIONS: 
+       experimental_connections = 0;
+       break;
+
+      case OPT_ALTERNATE_CONNECTIONS: 
+       alternate_connections = !alternate_connections;
+       break;
+
+      case OPT_WITH_BREAK_IN:
+       experimental_break_in = 1;
+       break;
+
+      case OPT_WITHOUT_BREAK_IN:
+       experimental_break_in = 0;
+       break;
+
+      case OPT_COSMIC_GNUGO:
+       cosmic_gnugo = 1;
+       break;
+
+      case OPT_NO_COSMIC_GNUGO:
+       cosmic_gnugo = 0;
+       break;
+
+      case OPT_LARGE_SCALE:
+       large_scale = 1;
+       break;
+
+      case OPT_NO_LARGE_SCALE:
+       large_scale = 0;
+       break;
+
+      case OPT_FORBID_SUICIDE:
+       suicide_rule = FORBIDDEN;
+       break;
+
+      case OPT_ALLOW_SUICIDE:
+       suicide_rule = ALLOWED;
+       break;
+
+      case OPT_ALLOW_ALL_SUICIDE:
+       suicide_rule = ALL_ALLOWED;
+       break;
+
+      case OPT_SIMPLE_KO:
+       ko_rule = SIMPLE;
+       break;
+
+      case OPT_NO_KO:
+       ko_rule = NONE;
+       break;
+
+      case OPT_POSITIONAL_SUPERKO:
+       ko_rule = PSK;
+       break;
+
+      case OPT_SITUATIONAL_SUPERKO:
+       ko_rule = SSK;
+       break;
+
+      case OPT_CAPTURE_ALL_DEAD:
+       capture_all_dead = 1;
+       break;
+
+      case OPT_PLAY_OUT_AFTERMATH:
+       play_out_aftermath = 1;
+       break;
+
+      case OPT_RESIGN_ALLOWED:
+       resign_allowed = 1;
+       break;
+
+      case OPT_NEVER_RESIGN:
+       resign_allowed = 0;
+       break;
+
+      case OPT_MONTE_CARLO:
+       use_monte_carlo_genmove = 1;
+       break;
+
+      case OPT_MC_GAMES_PER_LEVEL:
+       mc_games_per_level = atoi(gg_optarg);
+       break;
+
+      case OPT_MC_PATTERNS:
+       if (strlen(gg_optarg) >= sizeof(mc_pattern_name)) {
+         fprintf(stderr, "Too long name given as value to --mc-patterns option.\n");
+         exit(EXIT_FAILURE);
+       }
+       strcpy(mc_pattern_name, gg_optarg);
+       break;
+
+      case OPT_MC_LIST_PATTERNS:
+       list_mc_patterns();
+       return EXIT_SUCCESS;
+       break;
+
+      case OPT_MC_LOAD_PATTERNS:
+       if (strlen(gg_optarg) >= sizeof(mc_pattern_filename)) {
+         fprintf(stderr, "Too long name given as value to --mc-load-patterns option.\n");
+         exit(EXIT_FAILURE);
+       }
+       strcpy(mc_pattern_filename, gg_optarg);
+       break;
+
+      case OPT_MODE: 
+       if (strcmp(gg_optarg, "ascii") == 0)
+         playmode = MODE_ASCII;
+       else if (strcmp(gg_optarg, "gtp") == 0)
+         playmode = MODE_GTP;
+       else if (strcmp(gg_optarg, "gmp") == 0)
+         playmode = MODE_GMP;
+       else if (strcmp(gg_optarg, "sgmp") == 0)
+         playmode = MODE_SGMP;
+       else {
+         fprintf(stderr, "Invalid mode selection: %s\n", gg_optarg);
+         fprintf(stderr, "Try `gnugo --help' for more information.\n");
+         
+         exit(EXIT_FAILURE);
+       }
+       break;
+       
+      case OPT_DECIDE_STRING:
+       if (strlen(gg_optarg) > 3) {
+         fprintf(stderr, "Invalid board coordinate: %s\n", gg_optarg);
+         exit(EXIT_FAILURE);
+       }
+       strcpy(decide_this, gg_optarg);
+       playmode = MODE_DECIDE_STRING;
+       break;
+       
+      case OPT_DECIDE_CONNECTION:
+       if (strlen(gg_optarg) > 7) {
+         fprintf(stderr, 
+                 "usage: --decide-connection [first string]/[second string]\n");
+         return EXIT_FAILURE;
+       }
+       strcpy(decide_this, gg_optarg);
+       strtok(decide_this, "/");
+       decide_that = strtok(NULL, "/");
+       if (!decide_that) {
+         fprintf(stderr, 
+                 "usage: --decide-connection [first string]/[second string]\n");
+         return EXIT_FAILURE;
+       }
+
+       playmode = MODE_DECIDE_CONNECTION;
+       break;
+       
+      case OPT_DECIDE_OWL:
+       if (strlen(gg_optarg) > 3) {
+         fprintf(stderr, "Invalid board coordinate: %s\n", gg_optarg);
+         exit(EXIT_FAILURE);
+       }
+       strcpy(decide_this, gg_optarg);
+       playmode = MODE_DECIDE_OWL;
+       break;
+       
+      case OPT_DECIDE_DRAGON_DATA:
+       if (strlen(gg_optarg) > 3) {
+         fprintf(stderr, "Invalid board coordinate: %s\n", gg_optarg);
+         exit(EXIT_FAILURE);
+       }
+       strcpy(decide_this, gg_optarg);
+       playmode = MODE_DECIDE_DRAGON_DATA;
+       break;
+       
+      case OPT_DECIDE_SEMEAI:
+       if (strlen(gg_optarg) > 7) {
+         fprintf(stderr, 
+                 "usage: --decide-semeai [first dragon]/[second dragon]\n");
+         return EXIT_FAILURE;
+       }
+       strcpy(decide_this, gg_optarg);
+       strtok(decide_this, "/");
+       decide_that = strtok(NULL, "/");
+       if (!decide_that) {
+         fprintf(stderr, 
+                 "usage: --decide-semeai [first dragon]/[second dragon]\n");
+         return EXIT_FAILURE;
+       }
+
+       playmode = MODE_DECIDE_SEMEAI;
+       break;
+       
+      case OPT_DECIDE_TACTICAL_SEMEAI:
+       if (strlen(gg_optarg) > 7) {
+         fprintf(stderr, 
+                 "usage: --decide-tactical-semeai [first dragon]/[second dragon]\n");
+         return EXIT_FAILURE;
+       }
+       strcpy(decide_this, gg_optarg);
+       strtok(decide_this, "/");
+       decide_that = strtok(NULL, "/");
+       if (!decide_that) {
+         fprintf(stderr, 
+                 "usage: --decide-tactical-semeai [first dragon]/[second dragon]\n");
+         return EXIT_FAILURE;
+       }
+       playmode = MODE_DECIDE_TACTICAL_SEMEAI;
+       break;
+       
+      case OPT_DECIDE_POSITION:
+       playmode = MODE_DECIDE_POSITION;
+       break;
+       
+      case OPT_DECIDE_EYE:
+       if (strlen(gg_optarg) > 3) {
+         fprintf(stderr, "Invalid board coordinate: %s\n", gg_optarg);
+         exit(EXIT_FAILURE);
+       }
+       strcpy(decide_this, gg_optarg);
+       playmode = MODE_DECIDE_EYE;
+       break;
+       
+      case OPT_DECIDE_COMBINATION:
+       playmode = MODE_DECIDE_COMBINATION;
+       break;
+       
+      case OPT_DECIDE_SURROUNDED:
+       if (strlen(gg_optarg) > 3) {
+         fprintf(stderr, "Invalid board coordinate: %s\n", gg_optarg);
+         exit(EXIT_FAILURE);
+       }
+       strcpy(decide_this, gg_optarg);
+       playmode = MODE_DECIDE_SURROUNDED;
+       break;
+       
+      case OPT_DECIDE_ORACLE:
+       playmode = MODE_DECIDE_ORACLE;
+       break;
+       
+      case OPT_BRANCH_DEPTH:
+       mandated_branch_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_BACKFILL2_DEPTH:
+       mandated_backfill2_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_BREAK_CHAIN_DEPTH:
+       mandated_break_chain_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_SUPERSTRING_DEPTH:
+       mandated_superstring_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_AA_DEPTH:
+       mandated_aa_depth = atoi(gg_optarg);
+       break;
+
+      case OPT_OWL_DISTRUST:
+       mandated_owl_distrust_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_OWL_BRANCH:
+       mandated_owl_branch_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_OWL_READING:
+       mandated_owl_reading_depth = atoi(gg_optarg);
+       break;
+       
+      case OPT_OWL_NODE_LIMIT:
+       mandated_owl_node_limit = atoi(gg_optarg);
+       break;
+       
+      case OPT_NOFUSEKIDB:
+       fusekidb = 0;
+       break;
+       
+      case OPT_NOFUSEKI:
+       disable_fuseki = 1;
+       break;
+       
+      case OPT_NOJOSEKIDB:
+       josekidb = 0;
+       break;
+       
+      case OPT_LEVEL:
+       set_level(atoi(gg_optarg));
+       break;
+
+      case OPT_MIN_LEVEL:
+       set_min_level(atoi(gg_optarg));
+       break;
+
+      case OPT_MAX_LEVEL:
+       set_max_level(atoi(gg_optarg));
+       break;
+
+      case OPT_LIMIT_SEARCH:
+       {
+         int pos = string_to_location(board_size, gg_optarg);
+         if (pos == NO_MOVE) {
+           fprintf(stderr, "gnugo: use --limit-search <pos>\n");
+           return EXIT_FAILURE;
+         }
+         set_search_diamond(pos);
+       }
+       break;
+
+      case OPT_CLOCK_TIME:
+       clock_settings(atoi(gg_optarg), -1, -1);
+       break;
+
+      case OPT_CLOCK_BYO_TIME: 
+       clock_settings(-1, atoi(gg_optarg), -1);
+       break;
+
+      case OPT_CLOCK_BYO_PERIOD:
+       clock_settings(-1, -1, atoi(gg_optarg));
+       break;
+
+      case OPT_AUTOLEVEL:
+       autolevel_on = 1;
+       break;
+       
+      case OPT_DEBUG_INFLUENCE:
+       if (strlen(gg_optarg) > 3) {
+         fprintf(stderr, "Invalid board coordinate: %s\n", gg_optarg);
+         exit(EXIT_FAILURE);
+       }
+       strcpy(debuginfluence_move, gg_optarg);
+        break;
+       
+      case OPT_REPLAY_GAME: 
+       playmode = MODE_REPLAY;
+       if (strcmp(gg_optarg, "white") == 0)
+         replay_color = WHITE;
+       else if (strcmp(gg_optarg, "black") == 0)
+         replay_color = BLACK;
+       else if (strcmp(gg_optarg, "both") == 0)
+         replay_color = GRAY;
+       else {
+         fprintf(stderr, "Invalid replay color: %s\n", gg_optarg);
+         fprintf(stderr, "Try `gnugo --help' for more information.\n");
+         exit(EXIT_FAILURE);
+       }
+       break;
+       
+      case OPT_SCORE:
+       scoringmode = gg_optarg;
+       if (playmode == MODE_UNKNOWN)
+         playmode = MODE_LOAD_AND_SCORE;
+       break;
+       
+      case OPT_PRINTSGF:
+       playmode = MODE_LOAD_AND_PRINT;
+       printsgffile = gg_optarg;
+       break;
+       
+      case OPT_PROFILE_PATTERNS:
+       profile_patterns = 1;
+       prepare_pattern_profiling();
+       break;
+       
+      case OPT_COLOR: 
+       if (strcmp(gg_optarg, "white") == 0)
+         mandated_color = WHITE;
+       else if (strcmp(gg_optarg, "black") == 0)
+         mandated_color = BLACK;
+       else {
+         fprintf(stderr, "Invalid color selection: %s\n", gg_optarg);
+         fprintf(stderr, "Try `gnugo --help' for more information.\n");
+         exit(EXIT_FAILURE);
+       }
+       break;
+       
+      case OPT_SHOWCOPYRIGHT: 
+       show_copyright();
+       return EXIT_SUCCESS;
+       break;
+       
+      case OPT_MIRROR:
+        play_mirror_go = 1;
+        break;
+
+      case OPT_MIRROR_LIMIT:
+        mirror_stones_limit = atoi(gg_optarg);
+        break;
+
+      case 'v':
+       show_version();
+       show_copyright();
+       return EXIT_SUCCESS;
+       break;
+       
+      case 'h': 
+       show_version();
+       if (gg_optarg) {
+         /* In the default behavior of getopt_long with optional args
+          * you need to type "-hdebug"
+          * I can't get long options "--helpdebug" to work at all
+          */
+         if (strncmp(gg_optarg, "debug", 5) == 0)
+           show_debug_help();
+       }
+       else {
+         /* This is the trick to get "--help debug" and "-h debug" to work*/
+         if (gg_optind < argc) {
+           if (strncmp(argv[gg_optind], "debug", 5) == 0)
+             show_debug_help();
+         }
+         else
+           show_help();
+       }
+       return EXIT_SUCCESS;
+       break;
+       
+      case OPT_DEBUG_FLAGS:
+       show_debug_flags();
+       return EXIT_SUCCESS;
+       break;
+
+      case OPT_PRINT_LEVELS:
+       {
+         int lev;
+         for (lev = 12; lev >= 0; lev--)
+           set_depth_values(lev, 1);
+       }
+       return EXIT_SUCCESS;
+       break;
+
+      /* NOTE: getopt returns '?' if an illegal option is supplied. */
+
+      case '?':
+      default:
+       fprintf(stderr, "Try `gnugo --help' for more information.\n");
+       exit(EXIT_FAILURE);
+      }
+    }
+
+  if (requested_boardsize != -1) {
+    if (!check_boardsize(requested_boardsize, stderr))
+      exit(EXIT_FAILURE);
+    gnugo_clear_board(requested_boardsize);
+  }
+  
+  /* Start random number seed. */
+  if (!seed_specified)
+    seed = time(0);
+  
+  /* Initialize the GNU Go engine. */
+  init_gnugo(memory, seed);
+
+  /* Load Monte Carlo patterns if one has been specified. Either
+   * choose one of the compiled in ones or load directly from a
+   * database file.
+   */
+  if (strlen(mc_pattern_filename) > 0) {
+    if (!mc_load_patterns_from_db(mc_pattern_filename, NULL))
+      return EXIT_FAILURE;
+  }
+  else if (strlen(mc_pattern_name) > 0) {
+    if (!choose_mc_patterns(mc_pattern_name)) {
+      fprintf(stderr, "Unknown Monte Carlo pattern database name %s.\n",
+             mc_pattern_name);
+      fprintf(stderr, "Use \"--mc-list-patterns\" to list the available databases.\n");
+      return EXIT_FAILURE;
+    }
+  }
+
+  /* Read the infile if there is one. Also play up the position. */
+  if (infilename) {
+    if (!sgftree_readfile(&sgftree, infilename)) {
+      fprintf(stderr, "Cannot open or parse '%s'\n", infilename);
+      exit(EXIT_FAILURE);
+    }
+    
+    if (gameinfo_play_sgftree_rot(&gameinfo, &sgftree, untilstring,
+                                 orientation) == EMPTY) {
+      fprintf(stderr, "Cannot load '%s'\n", infilename);
+      exit(EXIT_FAILURE);
+    }
+  }
+  else
+  /* Initialize and empty sgf tree if there was no infile. */
+    sgftreeCreateHeaderNode(&sgftree, board_size, komi, handicap);
+
+  /* Set the game_record to be identical to the loaded one or the
+   * newly created empty sgf tree.
+   */
+  gameinfo.game_record = sgftree;
+  
+  /* Notice that we need to know the board size before we can do this.
+   */
+  if (debuginfluence_move[0]) {
+    int pos = string_to_location(board_size, debuginfluence_move);
+    debug_influence_move(pos);
+  }
+  
+  /* Figure out a default mode if there was no explicit one. */
+  if (playmode == MODE_UNKNOWN) {
+    if (infilename)
+      playmode = MODE_LOAD_AND_ANALYZE;
+    else
+      playmode = (isatty(0)) ? MODE_ASCII : MODE_GMP;
+  }
+
+  if (outfile && playmode != MODE_LOAD_AND_PRINT) {
+    output_check = fopen(outfile, "w");
+    if (!output_check) {
+      fprintf(stderr, "Error: could not open '%s' for writing\n", outfile);
+      exit(EXIT_FAILURE);
+    }
+    fclose(output_check);
+  }
+
+  switch (playmode) {
+  case MODE_GMP:
+  case MODE_SGMP:
+
+    /* not supported by the protocol */
+    resign_allowed = 0;
+
+#if ORACLE
+    if (metamachine)
+      summon_oracle();
+#endif
+
+    /* EMPTY is valid for play_gmp.c. */
+    gameinfo.computer_player = mandated_color;
+    play_gmp(&gameinfo, playmode == MODE_SGMP);
+
+#if ORACLE
+    if (metamachine)
+      dismiss_oracle();
+#endif
+
+    break;
+    
+  case MODE_SOLO:
+    play_solo(&gameinfo, benchmark);
+    break;
+    
+  case MODE_REPLAY:    
+    if (!infilename) {
+      fprintf(stderr, "You must use -l infile with replay mode.\n");
+      exit(EXIT_FAILURE);
+    }
+    play_replay(&sgftree, replay_color);
+    break;
+    
+  case MODE_LOAD_AND_ANALYZE:
+    if (mandated_color != EMPTY)
+      gameinfo.to_move = mandated_color;
+    
+    if (!infilename) {
+      fprintf(stderr, "You must use -l infile with load and analyze mode.\n");
+      exit(EXIT_FAILURE);
+    }
+
+#if ORACLE
+    if (metamachine) {
+      summon_oracle();
+      oracle_loadsgf(infilename, untilstring);
+    }
+#endif
+
+    load_and_analyze_sgf_file(&gameinfo);
+
+#if ORACLE
+    dismiss_oracle();
+#endif
+
+    break;
+    
+  case MODE_LOAD_AND_SCORE:
+    if (mandated_color != EMPTY)
+      gameinfo.to_move = mandated_color;
+
+    if (!infilename) {
+      fprintf(stderr, "gnugo: --score must be used with -l\n");
+      exit(EXIT_FAILURE);
+    }
+    load_and_score_sgf_file(&sgftree, &gameinfo, scoringmode);
+    break;
+    
+  case MODE_LOAD_AND_PRINT:
+    if (!infilename) {
+      fprintf(stderr, "gnugo: --printsgf must be used with -l\n");
+      exit(EXIT_FAILURE);
+    }
+
+    else {
+      if (mandated_color != EMPTY)
+        gameinfo.to_move = mandated_color;
+
+      sgffile_printsgf(gameinfo.to_move, printsgffile);
+    }
+    break;
+    
+  case MODE_DECIDE_STRING:
+    {
+      int str;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-string must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      str = string_to_location(board_size, decide_this); 
+      if (str == NO_MOVE) {
+       fprintf(stderr, "gnugo: --decide-string: strange coordinate \n");
+       return EXIT_FAILURE;
+      }
+
+      decide_string(str);
+    }
+    break;
+  
+  case MODE_DECIDE_CONNECTION:
+    {
+      int str1, str2;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-connection must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      str1 = string_to_location(board_size, decide_this);
+      if (str1 == NO_MOVE) {
+       fprintf(stderr,
+               "usage: --decide-connection [first string]/[second string]\n");
+       return EXIT_FAILURE;
+      }
+
+      str2 = string_to_location(board_size, decide_that);
+      if (str2 == NO_MOVE) {
+       fprintf(stderr,
+               "usage: --decide-connection [first string]/[second string]\n");
+       return EXIT_FAILURE;
+      }
+
+      decide_connection(str1, str2);
+    }
+    break;
+  
+  case MODE_DECIDE_OWL:
+    {
+      int pos;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-dragon must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      pos = string_to_location(board_size, decide_this);
+      if (pos == NO_MOVE) {
+       fprintf(stderr, "gnugo: --decide-dragon: strange coordinate \n");
+       return EXIT_FAILURE;
+      }
+
+      decide_owl(pos);
+    }
+    break;
+  
+  case MODE_DECIDE_DRAGON_DATA:
+    {
+      int pos;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-dragon-data must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      pos = string_to_location(board_size, decide_this);
+      if (pos == NO_MOVE) {
+       fprintf(stderr, "gnugo: --decide-dragon-data: strange coordinate \n");
+       return EXIT_FAILURE;
+      }
+
+      decide_dragon_data(pos);
+    }
+    break;
+  
+  case MODE_DECIDE_SEMEAI:
+    {
+      int pos1, pos2;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-semeai must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      pos1 = string_to_location(board_size, decide_this);
+      if (pos1 == NO_MOVE) {
+       fprintf(stderr, 
+               "usage: --decide-semeai [first dragon]/[second dragon]\n");
+       return EXIT_FAILURE;
+      }
+
+      pos2 = string_to_location(board_size, decide_that);
+      if (pos2 == NO_MOVE) {
+       fprintf(stderr, 
+               "usage: --decide-semeai [first dragon]/[second dragon]\n");
+       return EXIT_FAILURE;
+      }
+
+      decide_semeai(pos1, pos2);
+    }
+    break;
+    
+
+  case MODE_DECIDE_TACTICAL_SEMEAI:
+    {
+      int pos1, pos2;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-tactical-semeai must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      pos1 = string_to_location(board_size, decide_this);
+      if (pos1 == NO_MOVE) {
+       fprintf(stderr, 
+               "usage: --decide-tactical-semeai [first dragon]/[second dragon]\n");
+       return EXIT_FAILURE;
+      }
+
+      pos2 = string_to_location(board_size, decide_that);
+      if (pos2 == NO_MOVE) {
+       fprintf(stderr, 
+               "usage: --decide-tactical-semeai [first dragon]/[second dragon]\n");
+       return EXIT_FAILURE;
+      }
+
+      decide_tactical_semeai(pos1, pos2);
+    }
+    break;
+    
+
+  case MODE_DECIDE_POSITION:
+    {
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-position must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+      decide_position();
+    }
+    break;
+    
+  case MODE_DECIDE_EYE:
+    {
+      int pos;
+      
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-eye must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+
+      pos = string_to_location(board_size, decide_this);
+      if (pos == NO_MOVE) {
+       fprintf(stderr, "gnugo: --decide-eye: strange coordinate \n");
+       return EXIT_FAILURE;
+      }
+      
+      decide_eye(pos);
+    }
+    break;
+  
+  case MODE_DECIDE_COMBINATION:
+    {
+      int color;
+      if (!infilename) {
+       fprintf(stderr, "gnugo: --decide-combination must be used with -l\n");
+       return EXIT_FAILURE;
+      }
+      color = gameinfo.to_move;
+      if (mandated_color != EMPTY)
+       color = mandated_color;
+      decide_combination(color);
+    }
+    break;
+    
+  case MODE_DECIDE_SURROUNDED:
+    {
+      int pos = string_to_location(board_size, decide_this);
+
+      if (pos == NO_MOVE) {
+       fprintf(stderr, 
+               "usage: --decide-surrounded [pos]\n");
+       return EXIT_FAILURE;
+      }
+
+      decide_surrounded(pos);
+      break;
+    }
+
+#if ORACLE
+  case MODE_DECIDE_ORACLE:
+    {
+      if (mandated_color != EMPTY)
+       gameinfo.to_move = mandated_color;
+      
+      if (!infilename) {
+       fprintf(stderr, "You must use -l infile with load and analyze mode.\n");
+       exit(EXIT_FAILURE);
+      }
+
+      decide_oracle(&gameinfo, infilename, untilstring);
+      break;
+    }
+#endif
+
+  case MODE_GTP:
+    {
+      FILE *gtp_input_FILE = stdin;
+      FILE *gtp_output_FILE = stdout;
+      FILE *gtp_dump_commands_FILE = NULL;
+
+      if (gtpfile != NULL) {
+       gtp_input_FILE = fopen(gtpfile, "r");
+       if (gtp_input_FILE == NULL) {
+         fprintf(stderr, "gnugo: Cannot open file %s\n", gtpfile);
+         return EXIT_FAILURE;
+       }
+      }
+      else if (gtp_tcp_ip_mode != 0) {
+       unsigned int port = 65536;
+       char *port_string = strchr(gtp_tcp_ip_address, ':');
+       const char *host_name = NULL;
+
+       if (port_string) {
+         host_name = gtp_tcp_ip_address;
+
+         *port_string++ = 0;
+         sscanf(port_string, "%u", &port);
+       }
+       else
+         sscanf(gtp_tcp_ip_address, "%u", &port);
+
+       if (port > 65535) {
+         fprintf(stderr, "A valid TCP/IP port number expected\n");
+         exit(EXIT_FAILURE);
+       }
+
+       if (gtp_tcp_ip_mode == OPT_GTP_CONNECT) {
+         socket_connect_to(host_name, port,
+                           &gtp_input_FILE, &gtp_output_FILE);
+       }
+       else {
+         socket_listen_at(host_name, port,
+                          &gtp_input_FILE, &gtp_output_FILE);
+       }
+      }
+
+      if (gtp_dump_commands_file != NULL) {
+       gtp_dump_commands_FILE = fopen(gtp_dump_commands_file, "w");
+       if (gtp_dump_commands_FILE == NULL) {
+         fprintf(stderr, "gnugo: Cannot open file %s\n",
+                 gtp_dump_commands_file);
+         return EXIT_FAILURE;
+       }
+      }
+
+      play_gtp(gtp_input_FILE, gtp_output_FILE, gtp_dump_commands_FILE,
+              orientation);
+
+      if (gtp_dump_commands_FILE)
+       fclose(gtp_dump_commands_FILE);
+
+      if (gtp_tcp_ip_mode == OPT_GTP_CONNECT)
+       socket_close_connection(gtp_input_FILE, gtp_output_FILE);
+      else if (gtp_tcp_ip_mode == OPT_GTP_LISTEN)
+       socket_stop_listening(gtp_input_FILE, gtp_output_FILE);
+    }
+
+    break;
+
+  case MODE_ASCII:  
+  default:     
+    if (mandated_color != EMPTY)
+      gameinfo.computer_player = OTHER_COLOR(mandated_color);
+
+  /* Display copyright message in ASCII mode unless --quiet option used. */
+    if (!quiet) {
+      show_version();
+      show_copyright();
+    }
+
+#if ORACLE
+    if (metamachine) {
+      summon_oracle();
+      oracle_loadsgf(infilename, untilstring);
+    }
+#endif
+
+    play_ascii(&sgftree, &gameinfo, infilename, untilstring);
+    break;
+  }
+  
+  if (profile_patterns)
+    report_pattern_profiling();
+
+  sgfFreeNode(sgftree.root); 
+
+  return 0;
+}  /* end main */
+
+
+
+static void
+show_version(void)
+{
+  printf("GNU Go %s\n", VERSION);
+}
+
+
+/* Set the parameters which determine the depth to which
+ * the reading and owl code carries its calculations.
+ */
+
+
+
+/* 
+ * This string is modelled after the GNU tar --help output.
+ * Since the maximum string length is 2048 bytes in VC++ we
+ * split the help string.
+ */
+
+
+#define USAGE "\n\
+Usage: gnugo [-opts]\n\
+\n\
+Examples:\n\
+  gnugo --mode gtp --level 5\n\
+         To play against gnugo in level 5 from a GTP client\n\
+  gnugo --mode ascii -l game.sgf -L 123\n\
+         Resume game at move 123 in ASCII mode\n\
+  gnugo --score estimate -l game.sgf\n\
+         Give a rough score estimate of the end position in game.sgf\n\
+\n\
+Main Options:\n\
+       --mode <mode>     Force the playing mode ('ascii', 'gmp', 'sgmp',\n\
+                         or 'gtp'). Default is ASCII.\n\
+                         If no terminal is detected GMP (Go Modem Protocol)\n\
+                         will be assumed.\n\
+       --quiet  --silent Don't print copyright and informational messages\n\
+       --level <amount>  strength (default %d)\n\
+       --never-resign    Forbid GNU Go to resign\n\
+       --resign-allowed  Allow resignation (default)\n\
+   -l, --infile <file>   Load name sgf file\n\
+   -L, --until <move>    Stop loading just before move is played. <move>\n\
+                         can be the move number or location (eg L10).\n\
+   -o, --outfile <file>  Write sgf output to file\n\
+       --printsgf <file>     Write position as a diagram to file (use with -l)\n\
+\n\
+Scoring:\n\
+   --score estimate      estimate score at loaded position\n\
+   --score finish        generate moves to finish game, then score\n\
+   --score aftermath     generate moves to finish, use best algorithm\n\
+\n\
+"
+
+#define USAGE1 "\
+Game Options:\n\
+Used with --mode ascii (or other modes for non-interactive settings)\n\
+   --boardsize num   Set the board size to use (%d--%d)\n\
+   --color <color>   Choose your color ('black' or 'white')\n\
+   --handicap <num>  Set the number of handicap stones (0--%d)\n\
+   --komi <num>      Set the komi\n\
+   --clock <sec>     Initialize the timer.\n\
+   --byo-time <sec>  Initialize the byo-yomi timer.\n\
+   --byo-period <stones>  Initialize the byo-yomi period.\n\
+\n\
+   --japanese-rules     (default)\n\
+   --chinese-rules\n\
+   --forbid-suicide      Forbid suicide. (default)\n\
+   --allow-suicide       Allow suicide except single-stone suicide.\n\
+   --allow-all-suicide   Allow all suicide moves.\n\
+   --simple-ko           Forbid simple ko recapture. (default)\n\
+   --no-ko               Allow any ko recapture.\n\
+   --positional-superko  Positional superko restrictions.\n\
+   --situational-superko Situational superko restrictions.\n\
+\n\
+   --play-out-aftermath\n\
+   --capture-all-dead\n\
+\n\
+   --min-level <amount>         minimum level for adjustment schemes\n\
+   --max-level <amount>         maximum level for adjustment schemes\n\
+   --autolevel                  adapt gnugo level during game to respect\n\
+                                the time specified by --clock <sec>.\n\
+\n\
+Connection options\n\
+   --gtp-input <file>Read gtp commands from file instead of stdin\n\
+   --gtp-connect [HOST:]PORT\n\
+                     Connect to given host (127.0.0.1 if omitted) and port\n\
+                     and receive GTP commands on the established connection\n\
+   --gtp-listen [HOST:]PORT\n\
+                     Wait for the first TCP/IP connection on the given port\n\
+                     (if HOST is specified, only to that host)\n\
+   --gtp-version\n\
+\n\
+"
+
+#define USAGE2 "\
+Experimental options:\n\
+   --with-break-in         use the break-in code (on at level 10 by default)\n\
+   --without-break-in      do not use the break-in code\n\
+   --cosmic-gnugo          use center oriented influence\n\
+   --no-cosmic-gnugo       don't use center oriented influence (default)\n\
+   --large-scale           look for large scale captures\n\
+   --no-large-scale        don't seek large scale captures (default)\n\
+   --nofusekidb            turn off fuseki database\n\
+   --nofuseki              turn off fuseki moves entirely\n\
+   --nojosekidb            turn off joseki database\n\
+   --mirror                try to play mirror go\n\
+   --mirror-limit <n>      stop mirroring when n stones on board\n\n\
+   --monte-carlo           enable Monte Carlo move generation (9x9 or smaller)\n\
+   --mc-games-per-level <n> number of Monte Carlo simulations per level\n\
+   --mc-list-patterns      list names of builtin Monte Carlo patterns\n\
+   --mc-patterns <name>    choose a built in Monte Carlo pattern database\n\
+   --mc-load-patterns <filename> read Monte Carlo patterns from file\n\
+   --alternate-connections\n\
+   --experimental-connections\n\
+   --experimental-owl-ext\n\
+   --experimental-semeai\n\
+   --standard-connections\n\
+   --standard-semeai\n\
+   --oracle                Read the documentation\n\
+\n\
+Cache size (higher=more memory usage, faster unless swapping occurs):\n\
+   -M, --cache-size <megabytes>  RAM cache for read results (default %4.1f Mb)\n\
+\n\
+Informative Output:\n\
+   -v, --version         Display the version and copyright of GNU Go\n\
+   --options             Display configure options\n\
+   -h, --help            Display this help message\n\
+       --help debug      Display help about debugging options\n\
+       --copyright       Display copyright notice\n\
+\n\
+"
+
+#define COPYRIGHT \
+"Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007\n\
+2008 and 2009 by the Free Software Foundation, Inc.\n\
+See http://www.gnu.org/software/gnugo/ or contact\n\
+gnugo@gnu.org for information about GNU Go. GNU Go comes with NO WARRANTY to\n\
+the extent permitted by law. This program is free software; you can\n\
+redistribute it and/or modify it under the terms of the GNU General Public\n\
+License as published by the Free Software Foundation - version 3 or\n\
+(at your option) any later version. For more\n\
+information about these matters, see the files named COPYING.\n"
+
+/* USAGE_DEBUG Split in half because of VC limit on constant string 
+ * length of 2048 characters!*/
+#define USAGE_DEBUG "\n\
+Debugging Options:\n\
+\n\
+       --replay <color> replay the moves in a game for color.\n\
+                        (requires -l)\n\
+                     white: replay only white moves\n\
+                     black: replay only black moves\n\
+                     both:  replay all moves\n\
+   -a, --allpats                 test all patterns\n\
+   -T, --printboard              colored display of dragons\n\
+   -E, --printeyes               colored display of eye spaces\n\
+   -d, --debug <flags>           debugging output (see next item for bits)\n\
+       --debug-flags             print the debug flags for previous item\n\
+   -w, --worms                   print worm and dragon data and move reasons\n\
+   -m, --moyo <level>            moyo debugging, show moyo board\n\
+       --debug-influence <move>   print influence map after making a move\n\
+   -b, --benchmark num           benchmarking mode - can be used with -l\n\
+   -S, --statistics              print statistics (for debugging purposes)\n\n\
+       --profile-patterns        print statistics for pattern usage\n\
+       --showtime                print timing diagnostic\n\
+   -t, --trace                   verbose tracing\n\
+   -O, --output-flags <flags>    optional output (use with -o)\n\
+                    d: mark dead and critical dragons\n\
+                    v: show values of considered moves\n\
+                    specify either 'd', 'v' or 'dv' (nothing by default)\n\
+       --showscore               print estimated score\n\
+   -r, --seed number             set random number seed\n\
+       --gtp-dump-commands <file>dump commands received in GTP mode\n\
+       --gtp-initial-orientation\n\
+       --orientation\n\
+\n\
+"
+
+#define USAGE_DEBUG2 "\
+Options affecting depth settings and playing strength:\n\
+   --print-levels        shows all this values for levels 12 to 0\n\
+\n\
+   Default values for the default level (%d):\n\
+   -D, --depth <depth>          deep reading cutoff (default %d)\n\
+   -B, --backfill-depth <depth> deep reading cutoff (default %d)\n\
+   -F, --fourlib-depth <depth>  deep reading cutoff (default %d)\n\
+   -K, --ko-depth <depth>       deep reading cutoff (default %d)\n\
+   --branch-depth <depth>       deep reading cutoff (default %d)\n\
+   --backfill2-depth <depth>    deep reading cutoff (default %d)\n\
+   --break_chain-depth <depth>  deep reading cutoff (default %d)\n\
+   --superstring-depth <depth>  deep reading cutoff (default %d)\n\
+   --aa-depth <depth>           deep reading cutoff (default %d)\n\
+   --owl-distrust <depth>       owl distrust depth (default %d)\n\
+   --owl-branch <depth>         owl branching depth (default %d)\n\
+   --owl-reading <depth>        owl reading depth (default %d)\n\
+   --owl-node-limit <limit>     max nodes for owl reading (default %d)\n\
+   --semeai-node-limit <limit>  max nodes for semeai reading (default %d)\n\
+\n\
+Options providing detailed reading results etc.:\n\
+   --decide-string <string>     can this string live? (try with -o)\n\
+   --decide-connection <str/str> can these strings connect? (try with -o)\n\
+   --decide-dragon <dragon>     can this dragon live? (try with -o or -t)\n\
+   --decide-dragon-data\n\
+   --decide-owl\n\
+   --decide-position            evaluate all dragons (try with -o or -t)\n\
+   --decide-eye <string>        evaluate the eye\n\
+   --decide-combination         search for combination attack (try with -o)\n\
+   --decide-oracle\n\
+   --decide-semeai\n\
+   --decide-tactical-semeai\n\
+   --decide-surrounded\n\
+   --limit-search\n\
+\n\
+"
+
+
+/*
+ * Since the maximum string length is 2048 bytes in VC++ we
+ * split the help string.
+ */
+static void
+show_help(void)
+{
+  printf(USAGE, DEFAULT_LEVEL);
+  printf(USAGE1, MIN_BOARD, MAX_BOARD, MAX_HANDICAP);
+  printf(USAGE2, DEFAULT_MEMORY <= 0 ? reading_cache_default_size() :
+        (float) DEFAULT_MEMORY);
+}
+
+
+static void
+show_debug_help(void)
+{
+  set_depth_values(DEFAULT_LEVEL,0);
+  printf(USAGE_DEBUG USAGE_DEBUG2, 
+        DEFAULT_LEVEL, depth, backfill_depth, fourlib_depth, ko_depth, branch_depth,
+        backfill2_depth, break_chain_depth, superstring_depth, aa_depth, 
+        owl_distrust_depth, owl_branch_depth,
+        owl_reading_depth, owl_node_limit, semeai_node_limit);
+}
+
+static void 
+show_debug_flags(void)
+{
+  printf(DEBUG_FLAGS);
+}
+
+static void
+show_copyright(void)
+{
+  printf(COPYRIGHT);
+}
+
+
+#ifdef ENABLE_SOCKET_SUPPORT
+
+
+#if !defined(_WIN32) && !defined(_WIN32_WCE)
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#define closesocket    close
+#define init_sockets()
+
+#else  /* on Windows */
+
+
+#include <winsocket.h>
+
+
+static void
+init_sockets(void)
+{
+  WSADATA data;
+  WORD version = MAKEWORD(1, 1);
+
+  if (WSAStartup(version, &data) != NO_ERROR) {
+    fprintf(stderr, "WSAStartup() failed with error %d\n", WSAGetLastError());
+    exit(EXIT_FAILURE);
+  }
+}
+
+
+#endif /* on Windows */
+
+
+static void
+socket_connect_to(const char *host_name, unsigned int port,
+                 FILE **input_file, FILE **output_file)
+{
+  struct sockaddr_in address;
+  int connection_socket;
+  struct hostent *host_data;
+  char **address_pointer;
+
+  init_sockets();
+
+  if (!host_name)
+    host_name = "127.0.0.1";
+
+  host_data = gethostbyname(host_name);
+  if (!host_data
+      || host_data->h_addrtype != AF_INET
+      || host_data->h_length != sizeof address.sin_addr) {
+    fprintf(stderr, "Failed to resolve host name `%s'\n", host_name);
+    exit(EXIT_FAILURE);
+  }
+
+  connection_socket = socket(PF_INET, SOCK_STREAM, 0);
+  if (connection_socket == -1) {
+    fprintf(stderr, "Unexpected error: failed to create a socket\n");
+    exit(EXIT_FAILURE);
+  }
+
+  address.sin_family = AF_INET;
+  address.sin_port = htons((unsigned short) port);
+
+  for (address_pointer = host_data->h_addr_list; *address_pointer;
+       address_pointer++) {
+    memcpy(&address.sin_addr, *address_pointer, sizeof address.sin_addr);
+    if (connect(connection_socket, (struct sockaddr *) &address,
+               sizeof address) != -1)
+      break;
+  }
+
+  if (! *address_pointer) {
+    fprintf(stderr, "Failed to connect to %s:%u\n", host_data->h_name, port);
+    closesocket(connection_socket);
+    exit(EXIT_FAILURE);
+  }
+
+#if !USE_WINDOWS_SOCKET_CLUDGE
+
+  *input_file  = fdopen(connection_socket, "r");
+  *output_file = fdopen(dup(connection_socket), "w");
+
+#else  /* USE_WINDOWS_SOCKET_CLUDGE */
+
+  winsocket_activate(connection_socket);
+
+  *input_file  = NULL;
+  *output_file = NULL;
+
+#endif /* USE_WINDOWS_SOCKET_CLUDGE */
+}
+
+
+static void
+socket_listen_at(const char *host_name, unsigned int port,
+                FILE **input_file, FILE **output_file)
+{
+  struct sockaddr_in address;
+  int listening_socket;
+  int connection_socket;
+
+  init_sockets();
+
+  if (host_name) {
+    struct hostent *host_data;
+
+    host_data = gethostbyname(host_name);
+    if (!host_data
+       || host_data->h_addrtype != AF_INET
+       || host_data->h_length != sizeof address.sin_addr) {
+      fprintf(stderr, "Failed to resolve host name `%s'\n", host_name);
+      exit(EXIT_FAILURE);
+    }
+
+    host_name = host_data->h_name;
+    memcpy(&address.sin_addr, host_data->h_addr_list[0],
+          sizeof address.sin_addr);
+  }
+  else
+    address.sin_addr.s_addr = htonl(INADDR_ANY);
+
+  listening_socket = socket(PF_INET, SOCK_STREAM, 0);
+  if (listening_socket == -1) {
+    fprintf(stderr, "Unexpected error: failed to create a socket\n");
+    exit(EXIT_FAILURE);
+  }
+
+  address.sin_family = AF_INET;
+  address.sin_port = htons((unsigned short) port);
+
+  if (verbose) {
+    if (host_name) {
+      fprintf(stderr, "Waiting for a connection on %s:%u...\n",
+             host_name, port);
+    }
+    else
+      fprintf(stderr, "Waiting for a connection on port %u...\n", port);
+  }
+
+  if (bind(listening_socket,
+          (struct sockaddr *) &address, sizeof address) == -1
+      || listen(listening_socket, 0) == -1
+      || (connection_socket = accept(listening_socket, NULL, NULL)) == -1) {
+    if (host_name)
+      fprintf(stderr, "Failed to listen on %s:%u\n", host_name, port);
+    else
+      fprintf(stderr, "Failed to listen on port %u\n", port);
+
+    closesocket(listening_socket);
+    exit(EXIT_FAILURE);
+  }
+
+  closesocket(listening_socket);
+
+#if !USE_WINDOWS_SOCKET_CLUDGE
+
+  *input_file  = fdopen(connection_socket, "r");
+  *output_file = fdopen(dup(connection_socket), "w");
+
+#else  /* USE_WINDOWS_SOCKET_CLUDGE */
+
+  winsocket_activate(connection_socket);
+
+  *input_file  = NULL;
+  *output_file = NULL;
+
+#endif /* USE_WINDOWS_SOCKET_CLUDGE */
+}
+
+
+static void
+socket_close_connection(FILE *input_file, FILE *output_file)
+{
+  /* When connecting, we close the socket first. */
+  fclose(input_file);
+  fclose(output_file);
+}
+
+
+static void
+socket_stop_listening(FILE *input_file, FILE *output_file)
+{
+  int buffer[0x1000];
+
+  if (verbose)
+    fprintf(stderr, "Waiting for the client to disconnect...\n");
+
+  /* When listening, we wait for the client to disconnect first.
+   * Otherwise, socket doesn't get released properly.
+   */
+  do
+    fread(buffer, sizeof buffer, 1, input_file);
+  while (!feof(input_file));
+
+  fclose(input_file);
+  fclose(output_file);
+}
+
+
+#else  /* not ENABLE_SOCKET_SUPPORT */
+
+
+static void
+socket_connect_to(const char *host_name, unsigned int port,
+                 FILE **input_file, FILE **output_file)
+{
+  UNUSED(host_name);
+  UNUSED(port);
+  UNUSED(input_file);
+  UNUSED(output_file);
+
+  fprintf(stderr, "GNU Go was compiled without socket support, unable to connect\n");
+  exit(EXIT_FAILURE);
+}
+
+
+static void
+socket_listen_at(const char *host_name, unsigned int port,
+                FILE **input_file, FILE **output_file)
+{
+  UNUSED(host_name);
+  UNUSED(port);
+  UNUSED(input_file);
+  UNUSED(output_file);
+
+  fprintf(stderr, "GNU Go was compiled without socket support, unable to listen\n");
+  exit(EXIT_FAILURE);
+}
+
+
+static void
+socket_close_connection(FILE *input_file, FILE *output_file)
+{
+  UNUSED(input_file);
+  UNUSED(output_file);
+}
+
+
+static void
+socket_stop_listening(FILE *input_file, FILE *output_file)
+{
+  UNUSED(input_file);
+  UNUSED(output_file);
+}
+
+
+#endif /* not ENABLE_SOCKET_SUPPORT */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/make-xpms-file.el b/interface/make-xpms-file.el
new file mode 100644 (file)
index 0000000..58708d2
--- /dev/null
@@ -0,0 +1,129 @@
+;;; make-xpms-file.el --- create gnugo.el-support elisp from xpm files
+;;; gnugo.el
+;;;
+;;; This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+;;; http://www.gnu.org/software/gnugo/ for more information.   
+;;;                                                            
+;;; Copyright (C) 2003, 2004 by the Free Software Foundation.
+;;;                                                            
+;;; This program is free software; you can redistribute it and/
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation - version 3
+;;; or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be    
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied 
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR    
+;;; PURPOSE.  See the GNU General Public License in file COPYING
+;;; for more details.                                          
+;;;                                                            
+;;; You should have received a copy of the GNU General Public  
+;;; License along with this program; if not, write to the Free 
+;;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,    
+;;; Boston, MA 02111, USA.
+;;; 
+;;; This Emacs mode for GNU Go may work with Emacs 20.x but
+;;; the graphical display requires Emacs 21.x.
+;;;
+;;; Maintainer: Thien-Thi Nguyen
+
+;;; Commentary:
+
+;; Usage: EBATCH -l make-xpms-file.el -f make-xpms-file OUTFILE [XPM ...]
+;;        where EBATCH is: emacs -batch --no-site-file
+;;
+;; Write to OUTFILE emacs lisp that encapsulates each XPM file.
+
+;;; Code:
+
+(require 'pp)
+
+(unless (fboundp 'delete-dups)
+  (defun delete-dups (list)             ; from repo 2004-10-29
+    "Destructively remove `equal' duplicates from LIST.
+Store the result in LIST and return it.  LIST must be a proper list.
+Of several `equal' occurrences of an element in LIST, the first
+one is kept."
+    (let ((tail list))
+      (while tail
+        (setcdr tail (delete (car tail) (cdr tail)))
+        (setq tail (cdr tail))))
+    list))
+
+(defun make-xpms-file-usage ()
+  (message "Usage: %s OUTFILE [XPM ...]" (car (command-line)))
+  (error "Quit"))
+
+(defun make-xpms-file-alist-entry (xpm)
+  (let* ((stem (file-name-sans-extension (file-name-nondirectory xpm)))
+         (bits (progn (find-file xpm)
+                      (prog1 (buffer-string)
+                        (kill-buffer (current-buffer)))))
+         (nump (string-match "[0-9]$" stem))
+         ;; 1 2 3
+         ;; 4 5 6
+         ;; 7 8 9
+         (key (if (not nump)
+                  (cons (intern stem) 5)
+                (cons (intern (substring stem 0 -1))
+                      (string-to-number (substring stem -1))))))
+    (cons key bits)))
+
+(defun make-xpms-file ()
+  (unless noninteractive
+    (error "Interactive use for make-xpms-file not supported, sorry"))
+  (let ((outfile (car command-line-args-left))
+        (xpms (cdr command-line-args-left))
+        entries doc)
+    (unless (and outfile xpms)
+      (make-xpms-file-usage))
+    (setq entries (mapcar 'make-xpms-file-alist-entry xpms)
+          doc (concat
+               "Alist of XPM images suitable for use by gnugo.el.\n"
+               "Keys are (TYPE . PLACE), where TYPE is one of:\n"
+               "  " (mapconcat 'symbol-name
+                               (delete-dups (mapcar 'caar entries))
+                               " ")
+               "\n"
+               "and PLACE is an integer describing a visible location:\n"
+               "  1 2 3\n  4 5 6\n  7 8 9.\n"
+               "The image values are the result of `find-image'."))
+    (find-file outfile)
+    (erase-buffer)
+    (let ((standard-output (current-buffer)))
+      (prin1 ";;; generated file --- do not edit!\n
+;;; This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+;;; http://www.gnu.org/software/gnugo/ for more information.
+;;;
+;;; Copyright (C) 2003, 2004 by the Free Software Foundation.
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation - version 3
+;;; or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;;; PURPOSE.  See the GNU General Public License in file COPYING
+;;; for more details.
+;;;                        
+;;; You should have received a copy of the GNU General Public
+;;; License along with this program; if not, write to the Free
+;;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;;; Boston, MA 02111, USA.\n\n")
+      (mapc 'pp `((defconst gnugo-xpms
+                    (mapcar (lambda (pair)
+                              (cons (car pair)
+                                    (find-image
+                                     (list (list :type 'xpm
+                                                 :data (cdr pair)
+                                                 :ascent 'center)))))
+                            ',entries)
+                    ,doc)
+                  (provide 'gnugo-xpms))))
+    (save-buffer)
+    (kill-buffer (current-buffer))))
+
+
+;;; make-xpms-file.el ends here
diff --git a/interface/play_ascii.c b/interface/play_ascii.c
new file mode 100644 (file)
index 0000000..5b0cdf9
--- /dev/null
@@ -0,0 +1,1317 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#if READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+#include "liberty.h"
+#include "interface.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+#define DEBUG_COMMANDS "\
+capture <pos>    try to capture indicated group\n\
+dead             Toggle display of dead stones\n\
+defend <pos>     try to defend indicated group\n\
+listdragons      print dragon info \n\
+showarea         display area\n\
+showdragons      display dragons\n\
+showmoyo         display moyo\n\
+showterri        display territory\n\
+"
+
+/* some options for the ascii interface */
+static int opt_showboard = 1;
+static int showdead = 0;
+static SGFTree sgftree;
+static int resignation_allowed;
+
+static int clock_on = 0;
+
+/* Unreasonable score used to detect missing information. */
+#define NO_SCORE 4711
+/* Keep track of the score estimated before the last computer move. */
+static int current_score_estimate = NO_SCORE;
+
+static void do_play_ascii(Gameinfo *gameinfo);
+static int ascii_endgame(Gameinfo *gameinfo, int reason);
+static void ascii_count(Gameinfo *gameinfo);
+static void showcapture(char *line);
+static void showdefense(char *line);
+static void ascii_goto(Gameinfo *gameinfo, char *line);
+static void ascii_free_handicap(Gameinfo *gameinfo, char *handicap_string);
+
+/* If sgf game info is written can't reset parameters like handicap, etc. */
+static int sgf_initialized;
+
+/*
+ * Create letterbar for the top and bottom of the ASCII board.
+ */
+
+static void
+make_letterbar(int boardsize, char *letterbar)
+{
+  int i, letteroffset;
+  char spaces[64];
+  char letter[64];
+
+  if (boardsize <= 25)
+    strcpy(spaces, " ");
+  strcpy(letterbar, "   ");
+  
+  for (i = 0; i < boardsize; i++) {
+    letteroffset = 'A';
+    if (i+letteroffset >= 'I')
+      letteroffset++;
+    strcat(letterbar, spaces);
+    sprintf(letter, "%c", i+letteroffset);
+    strcat(letterbar, letter);
+  }
+}
+
+
+/* This array contains +'s and -'s for the empty board positions.
+ * hspot_size contains the board size that the grid has been
+ * initialized to.
+ */
+
+static int hspot_size;
+static char hspots[MAX_BOARD][MAX_BOARD];
+
+
+/*
+ * Mark the handicap spots on the board.
+ */
+
+static void
+set_handicap_spots(int boardsize)
+{
+  if (hspot_size == boardsize)
+    return;
+  
+  hspot_size = boardsize;
+  
+  memset(hspots, '.', sizeof(hspots));
+
+  if (boardsize == 5) {
+    /* place the outer 4 */
+    hspots[1][1] = '+';
+    hspots[boardsize-2][1] = '+';
+    hspots[1][boardsize-2] = '+';
+    hspots[boardsize-2][boardsize-2] = '+';
+    /* and the middle one */
+    hspots[boardsize/2][boardsize/2] = '+';
+    return;
+  }
+
+  if (!(boardsize%2)) {
+    /* If the board size is even, no center handicap spots. */
+    if (boardsize > 2 && boardsize < 12) {
+      /* Place the outer 4 only. */
+      hspots[2][2] = '+';
+      hspots[boardsize-3][2] = '+';
+      hspots[2][boardsize-3] = '+';
+      hspots[boardsize-3][boardsize-3] = '+';
+    }
+    else {
+      /* Place the outer 4 only. */
+      hspots[3][3] = '+';
+      hspots[boardsize-4][3] = '+';
+      hspots[3][boardsize-4] = '+';
+      hspots[boardsize-4][boardsize-4] = '+';
+    }
+  }
+  else {
+    /* Uneven board size */
+    if (boardsize > 2 && boardsize < 12) {
+      /* Place the outer 4... */
+      hspots[2][2] = '+';
+      hspots[boardsize-3][2] = '+';
+      hspots[2][boardsize-3] = '+';
+      hspots[boardsize-3][boardsize-3] = '+';
+
+      /* ...and the middle one. */
+      hspots[boardsize/2][boardsize/2] = '+';
+    }
+    else if (boardsize > 12) {
+      /* Place the outer 4... */
+      hspots[3][3] = '+';
+      hspots[boardsize-4][3] = '+';
+      hspots[3][boardsize-4] = '+';
+      hspots[boardsize-4][boardsize-4] = '+';
+
+      /* ...and the inner 4... */
+      hspots[3][boardsize/2] = '+';
+      hspots[boardsize/2][3] = '+';
+      hspots[boardsize/2][boardsize-4] = '+';
+      hspots[boardsize-4][boardsize/2] = '+';
+
+      /* ...and the middle one. */
+      hspots[boardsize/2][boardsize/2] = '+';
+    }
+  }
+
+  return;
+}
+
+
+/*
+ * Display the board position when playing in ASCII.
+ */
+
+static void
+ascii_showboard(void)
+{
+  int i, j;
+  char letterbar[64];
+  int last_pos_was_move;
+  int pos_is_move;
+  int dead;
+  int last_move = get_last_move();
+  
+  make_letterbar(board_size, letterbar);
+  set_handicap_spots(board_size);
+
+  printf("\n");
+  printf("    White (O) has captured %d pieces\n", black_captured);
+  printf("    Black (X) has captured %d pieces\n", white_captured);
+  if (showscore) {
+    if (current_score_estimate == NO_SCORE)
+      printf("    No score estimate is available yet.\n");
+    else if (current_score_estimate < 0)
+      printf("    Estimated score: Black is ahead by %d\n",
+            -current_score_estimate);
+    else if (current_score_estimate > 0)
+      printf("    Estimated score: White is ahead by %d\n",
+            current_score_estimate);
+    else
+      printf("    Estimated score: Even!\n");
+  }
+   
+  printf("\n");
+
+  fflush(stdout);
+  printf("%s", letterbar);
+
+  if (get_last_player() != EMPTY) {
+    gfprintf(stdout, "        Last move: %s %1m",
+            get_last_player() == WHITE ? "White" : "Black",
+            last_move);
+  }
+
+  printf("\n");
+  fflush(stdout);
+  
+  for (i = 0; i < board_size; i++) {
+    printf(" %2d", board_size - i);
+    last_pos_was_move = 0;
+    for (j = 0; j < board_size; j++) {
+      if (POS(i, j) == last_move)
+       pos_is_move = 128;
+      else
+       pos_is_move = 0;
+      dead = (dragon_status(POS(i, j)) == DEAD) && showdead;
+      switch (BOARD(i, j) + pos_is_move + last_pos_was_move) {
+       case EMPTY+128:
+       case EMPTY:
+         printf(" %c", hspots[i][j]);
+         last_pos_was_move = 0;
+         break;
+       case BLACK:
+         printf(" %c", dead ? 'x' : 'X');
+         last_pos_was_move = 0;
+         break;
+       case WHITE:
+         printf(" %c", dead ? 'o' : 'O');
+         last_pos_was_move = 0;
+         break;
+       case BLACK+128:
+         printf("(%c)", 'X');
+         last_pos_was_move = 256;
+         break;
+       case WHITE+128:
+         printf("(%c)", 'O');
+         last_pos_was_move = 256;
+         break;
+       case EMPTY+256:
+         printf("%c", hspots[i][j]);
+         last_pos_was_move = 0;
+         break;
+       case BLACK+256:
+         printf("%c", dead ? 'x' : 'X');
+         last_pos_was_move = 0;
+         break;
+       case WHITE+256:
+         printf("%c", dead ? 'o' : 'O');
+         last_pos_was_move = 0;
+         break;
+       default: 
+         fprintf(stderr, "Illegal board value %d\n", (int) BOARD(i, j));
+         exit(EXIT_FAILURE);
+         break;
+      }
+    }
+    
+    if (last_pos_was_move == 0) {
+      if (board_size > 10)
+       printf(" %2d", board_size - i);
+      else
+       printf(" %1d", board_size - i);
+    }
+    else {
+      if (board_size > 10)
+       printf("%2d", board_size - i);
+      else
+       printf("%1d", board_size - i);
+    }
+    printf("\n");
+  }
+  
+  fflush(stdout);
+  printf("%s\n\n", letterbar);
+  fflush(stdout);
+
+  if (clock_on) {
+    clock_print(WHITE);
+    clock_print(BLACK);
+  }
+  
+}  /* end ascii_showboard */
+
+/*
+ * command help
+ */
+
+static void
+show_commands(void)
+{
+  printf("\nCommands:\n");
+  printf(" back                Take back your last move\n");
+  printf(" boardsize           Set boardsize (on move 1 only)\n");
+  printf(" comment             Write a comment to outputfile\n");
+  printf(" depth <num>         Set depth for reading\n");
+  printf(" display             Display game board\n");
+  printf(" exit                Exit GNU Go\n");
+  printf(" force <move>        Force a move for current color\n");
+  printf(" forward             Go to next node in game tree\n");
+  printf(" goto <movenum>      Go to movenum in game tree\n");
+  printf(" level <amount>      Playing level (default = 10)\n");
+  printf(" handicap <num>      Set fixed handicap (on move 1 only)\n");
+  printf(" freehandicap <num>  Place free handicap (on move 1 only)\n");
+  printf("                     Omit <num> to place handicap yourself\n");
+  printf(" help                Display this help menu\n");
+  printf(" helpdebug           Display debug help menu\n");
+  printf(" info                Display program settings\n");
+  printf(" komi                Set komi (on move 1 only)\n");
+  printf(" last                Goto last node in game tree\n");
+  printf(" pass                Pass on your move\n");
+  printf(" play <num>          Play <num> moves\n");
+  printf(" playblack           Play as Black (switch if White)\n");
+  printf(" playwhite           Play as White (switch if Black)\n");
+  printf(" quit                Exit GNU Go\n");
+  printf(" resign              Resign the current game\n");
+  printf(" save <file>         Save the current game\n");
+  printf(" load <file>         Load a game from file\n");
+  printf(" score               Toggle display of score On/Off\n");
+  printf(" showboard           Toggle display of board On/Off\n");
+  printf(" switch              Switch the color you are playing\n");
+  printf(" undo                Take the last move back (same as back)\n");
+  printf(" <move>              A move of the format <letter><number>");
+  printf("\n");
+}
+
+enum commands {INVALID = -1, END, EXIT, QUIT, RESIGN, 
+              PASS, MOVE, FORCE, SWITCH,
+              PLAY, PLAYBLACK, PLAYWHITE,
+              SETHANDICAP, FREEHANDICAP, SETBOARDSIZE, SETKOMI,
+              SETDEPTH,
+               INFO, DISPLAY, SHOWBOARD, HELP, UNDO, COMMENT, SCORE,
+               CMD_DEAD, CMD_BACK, CMD_FORWARD, CMD_LAST,
+               CMD_CAPTURE, CMD_DEFEND,
+               CMD_HELPDEBUG, CMD_SHOWAREA, CMD_SHOWMOYO, CMD_SHOWTERRI,
+               CMD_GOTO, CMD_SAVE, CMD_LOAD, CMD_SHOWDRAGONS, CMD_LISTDRAGONS,
+              SETLEVEL, NEW, COUNT, CONTINUE
+};
+
+
+/*
+ * Check if we have a valid command.
+ */
+
+static int
+get_command(char *command)
+{
+  char c;
+  int d;
+
+  /* Check to see if a move was input. */
+  if (!((sscanf(command, "%c%d", &c, &d) != 2)
+       || ((c = toupper((int) c)) < 'A')
+       || ((c = toupper((int) c)) > 'Z')
+       || (c == 'I')))
+    return MOVE;
+
+  /* help shortcut */
+  if (command[0] == '?')
+    return HELP;
+
+  /* Kill leading spaces. */
+  while (command[0] == ' ')
+    command++;
+
+  if (!strncmp(command, "playblack", 9)) return PLAYBLACK;
+  if (!strncmp(command, "playwhite", 9)) return PLAYWHITE;
+  if (!strncmp(command, "showboard", 9)) return SHOWBOARD;
+  if (!strncmp(command, "showdragons", 9)) return CMD_SHOWDRAGONS;
+  if (!strncmp(command, "listdragons", 9)) return CMD_LISTDRAGONS;
+  if (!strncmp(command, "boardsize", 9)) return SETBOARDSIZE;
+  if (!strncmp(command, "freehandicap", 9)) return FREEHANDICAP;
+  if (!strncmp(command, "handicap", 5)) return SETHANDICAP;
+  if (!strncmp(command, "display", 7)) return DISPLAY;
+  if (!strncmp(command, "helpdebug", 7)) return CMD_HELPDEBUG;
+  if (!strncmp(command, "resign", 6)) return RESIGN;
+  if (!strncmp(command, "showmoyo", 6)) return CMD_SHOWMOYO;
+  if (!strncmp(command, "showterri", 6)) return CMD_SHOWTERRI;
+  if (!strncmp(command, "showarea", 6)) return CMD_SHOWAREA;
+  if (!strncmp(command, "depth", 5)) return SETDEPTH;
+  if (!strncmp(command, "switch", 5)) return SWITCH;
+  if (!strncmp(command, "komi", 4)) return SETKOMI;
+  if (!strncmp(command, "play", 4)) return PLAY;
+  if (!strncmp(command, "info", 4)) return INFO;
+  if (!strncmp(command, "force", 4)) return FORCE;
+  if (!strncmp(command, "level", 5)) return SETLEVEL;
+  if (!strncmp(command, "pass", 4)) return PASS;
+  if (!strncmp(command, "save", 3)) return CMD_SAVE;
+  if (!strncmp(command, "load", 3)) return CMD_LOAD;
+  if (!strncmp(command, "end", 3)) return END;
+  if (!strncmp(command, "move", 3)) return MOVE;
+  if (!strncmp(command, "undo", 3)) return UNDO;
+  if (!strncmp(command, "comment", 3)) return COMMENT;
+  if (!strncmp(command, "score", 3)) return SCORE;
+  if (!strncmp(command, "dead", 3)) return CMD_DEAD;
+  if (!strncmp(command, "capture", 3)) return CMD_CAPTURE;
+  if (!strncmp(command, "defend", 3)) return CMD_DEFEND;
+  if (!strncmp(command, "exit", 4)) return EXIT;
+  if (!strncmp(command, "quit", 4)) return QUIT;
+  if (!strncmp(command, "help", 1)) return HELP;
+  if (!strncmp(command, "back", 2)) return CMD_BACK;
+  if (!strncmp(command, "forward", 2)) return CMD_FORWARD;
+  if (!strncmp(command, "last", 2)) return CMD_LAST;
+  if (!strncmp(command, "goto", 2)) return CMD_GOTO;
+  if (!strncmp(command, "game", 2)) return NEW;
+  if (!strncmp(command, "count", 3)) return COUNT;
+  if (!strncmp(command, "continue", 4)) return CONTINUE;
+
+  /* No valid command was found. */
+  return INVALID;
+}
+
+
+/*
+ * Write sgf root node. 
+ */
+
+static void
+init_sgf(Gameinfo *ginfo)
+{
+  if (sgf_initialized)
+    return;
+  sgf_initialized = 1;
+
+  sgf_write_header(sgftree.root, 1, get_random_seed(), komi,
+                  ginfo->handicap, get_level(), chinese_rules);
+  if (ginfo->handicap > 0)
+    sgffile_recordboard(sgftree.root);
+}
+
+
+/*
+ * Generate the computer move. 
+ */
+
+static int
+computer_move(Gameinfo *gameinfo, int *passes)
+{
+  int move;
+  float move_value;
+  int resign;
+  int resignation_declined = 0;
+  float upper_bound, lower_bound;
+
+  init_sgf(gameinfo);
+
+  /* Generate computer move. */
+  if (autolevel_on)
+    adjust_level_offset(gameinfo->to_move);
+  move = genmove(gameinfo->to_move, &move_value, &resign);
+  if (resignation_allowed && resign) {
+    int state = ascii_endgame(gameinfo, 2);
+    if (state != -1)
+      return state;
+
+    /* The opponent declined resignation. Remember not to resign again. */
+    resignation_allowed = 0;
+    resignation_declined = 1;
+  }
+
+  if (showscore) {
+    gnugo_estimate_score(&upper_bound, &lower_bound);
+    current_score_estimate = (int) ((lower_bound + upper_bound) / 2.0);
+  }
+  
+  mprintf("%s(%d): %1m\n", color_to_string(gameinfo->to_move),
+         movenum + 1, move);
+  if (is_pass(move))
+    (*passes)++;
+  else
+    *passes = 0;
+
+  gnugo_play_move(move, gameinfo->to_move);
+  sgffile_add_debuginfo(sgftree.lastnode, move_value);
+  sgftreeAddPlay(&sgftree, gameinfo->to_move, I(move), J(move));
+  if (resignation_declined)
+    sgftreeAddComment(&sgftree, "GNU Go resignation was declined");
+  sgffile_output(&sgftree);
+
+  gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+  return 0;
+}
+
+
+/*
+ * Make a move.
+ */
+
+static int
+do_move(Gameinfo *gameinfo, char *command, int *passes, int force)
+{
+  int move = string_to_location(board_size, command);
+
+  if (move == NO_MOVE) {
+    printf("\nInvalid move: %s\n", command);
+    return 0;
+  }
+  
+  if (!is_allowed_move(move, gameinfo->to_move)) {
+    printf("\nIllegal move: %s", command);
+    return 0;
+  }
+
+  *passes = 0;
+  TRACE("\nyour move: %1m\n\n", move);
+  init_sgf(gameinfo);
+  gnugo_play_move(move, gameinfo->to_move);
+  sgffile_add_debuginfo(sgftree.lastnode, 0.0);
+  sgftreeAddPlay(&sgftree, gameinfo->to_move, I(move), J(move));
+  sgffile_output(&sgftree);
+  
+  if (opt_showboard) {
+    ascii_showboard();
+    printf("GNU Go is thinking...\n");
+  }
+
+  if (force) {
+    gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player);
+    gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+    sgftreeAddComment(&sgftree, "forced");
+    return 0;
+  }
+
+  gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+  return computer_move(gameinfo, passes);
+}
+
+
+/*
+ * Make a pass.
+ */
+
+static int
+do_pass(Gameinfo *gameinfo, int *passes, int force)
+{
+  (*passes)++;
+  init_sgf(gameinfo);
+  gnugo_play_move(PASS_MOVE, gameinfo->to_move);
+  sgffile_add_debuginfo(sgftree.lastnode, 0.0);
+  sgftreeAddPlay(&sgftree, gameinfo->to_move, -1, -1);
+  sgffile_output(&sgftree);
+
+  gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+  if (force) {
+    gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player);
+    sgftreeAddComment(&sgftree, "forced");
+    return 0;
+  }
+
+  return computer_move(gameinfo, passes);
+}
+
+
+/*
+ * Play a game against an ascii client.
+ */
+
+void
+play_ascii(SGFTree *tree, Gameinfo *gameinfo, char *filename, char *until)
+{
+  int sz;
+  
+  setvbuf(stdout, (char *)NULL, _IONBF, 0); /* No buffering. */
+  
+  sgftree = *tree;
+
+  if (filename) {
+    /* No need to check for failure here since that was already done
+     * when it was loaded in main().
+     *
+     * FIXME: Why do we load the game again?
+     */
+    gameinfo_play_sgftree(gameinfo, &sgftree, until);
+    sgf_initialized = 1;
+  }
+  else {
+    if (sgfGetIntProperty(sgftree.root, "SZ", &sz)) 
+      gnugo_clear_board(sz);
+    if (gameinfo->handicap == 0)
+      gameinfo->to_move = BLACK;
+    else {
+      gameinfo->handicap = place_fixed_handicap(gameinfo->handicap);
+      gameinfo->to_move = WHITE;
+    }
+    sgf_initialized = 0;
+  }
+
+  do_play_ascii(gameinfo);
+  printf("\nThanks! for playing GNU Go.\n\n");
+
+  /* main() frees the tree and we might have changed it. */
+  *tree = sgftree;
+}
+
+
+void
+do_play_ascii(Gameinfo *gameinfo)
+{
+  int m, num;
+  float fnum;
+  int passes = 0;  /* two passes and its over */
+  int tmp;
+  char line[80];
+  char *line_ptr = line;
+  char *command;
+  char *tmpstring;
+  int state = 1;
+
+  if (have_time_settings())
+    clock_on = 1;
+
+  while (state == 1) {
+    state = 0;
+
+    /* No score is estimated yet. */
+    current_score_estimate = NO_SCORE;
+
+    /* Allow resignation at interface level (the engine may still be not
+     * allowed to resign.
+     */
+    resignation_allowed = 1;
+
+    printf("\nBeginning ASCII mode game.\n\n");
+    gameinfo_print(gameinfo);
+
+    /* Does the computer play first?  If so, make a move. */
+    if (gameinfo->computer_player == gameinfo->to_move)
+      state = computer_move(gameinfo, &passes);
+
+    /* main ASCII Play loop */
+    while (state == 0) {
+      /* Display game board. */
+      if (opt_showboard)
+       ascii_showboard();
+
+#if !READLINE
+      /* Print the prompt */
+      mprintf("%s(%d): ", color_to_string(gameinfo->to_move), movenum + 1);
+
+      /* Read a line of input. */
+      line_ptr = line;
+      if (!fgets(line, 80, stdin))
+       return;
+#else
+      snprintf(line, 79, "%s(%d): ",
+              color_to_string(gameinfo->to_move), movenum + 1);
+      if (!(line_ptr = readline(line)))
+       return;
+
+      add_history(line_ptr);
+#endif
+
+      while (state == 0
+            && (command = strtok(line_ptr, ";"), line_ptr = 0, command)) {
+       /* Get the command or move. */
+       switch (get_command(command)) {
+       case RESIGN:
+         state = ascii_endgame(gameinfo, 1);
+         break;
+
+       case END:
+       case EXIT:
+       case QUIT:
+         return;
+
+       case HELP:
+         show_commands();
+         break;
+
+       case CMD_HELPDEBUG:
+         printf(DEBUG_COMMANDS);
+         break;
+
+       case SHOWBOARD:
+         opt_showboard = !opt_showboard;
+         break;
+
+       case INFO:
+         printf("\n");
+         gameinfo_print(gameinfo);
+         break;
+
+       case SETBOARDSIZE:
+         if (sgf_initialized) {
+           printf("Boardsize cannot be changed after record is started!\n");
+           break;
+         }
+         command += 10;
+         if (sscanf(command, "%d", &num) != 1) {
+           printf("\nInvalid command syntax!\n");
+           break;
+         }
+         if (!check_boardsize(num, stdout))
+           break;
+         /* Init board. */
+         board_size = num;
+         clear_board();
+         /* In case max handicap changes on smaller board. */
+         gameinfo->handicap = place_fixed_handicap(gameinfo->handicap);
+         sgfOverwritePropertyInt(sgftree.root, "SZ", board_size);
+         sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap);
+         break;
+
+       case SETHANDICAP:
+         if (sgf_initialized) {
+           printf("Handicap cannot be changed after game is started!\n");
+           break;
+         }
+         command += 9;
+         if (sscanf(command, "%d", &num) != 1) {
+           printf("\nInvalid command syntax!\n");
+           break;
+         }
+         if (num < 0 || num > MAX_HANDICAP) {
+           printf("\nInvalid handicap: %d\n", num);
+           break;
+         }
+         /* Init board. */
+         clear_board();
+         /* Place stones on board but don't record sgf 
+          * in case we change more info. */
+         gameinfo->handicap = place_fixed_handicap(num);
+         printf("\nSet handicap to %d\n", gameinfo->handicap);
+          gameinfo->to_move = (gameinfo->handicap ? WHITE : BLACK);
+         break;
+
+       case FREEHANDICAP:
+         if (sgf_initialized) {
+           printf("Handicap cannot be changed after game is started!\n");
+           break;
+         }
+         while (*command && *command != ' ')
+           command++;
+         ascii_free_handicap(gameinfo, command);
+         break;
+
+       case SETKOMI:
+         if (sgf_initialized) {
+           printf("Komi cannot be modified after game record is started!\n");
+           break;
+         }
+         command += 5;
+         if (sscanf(command, "%f", &fnum) != 1) {
+           printf("\nInvalid command syntax!\n");
+           break;
+         }
+         komi = fnum;
+         printf("\nSet Komi to %.1f\n", komi);
+         break;
+
+       case SETDEPTH:
+         command += 6;
+         if (sscanf(command, "%d", &num) != 1) {
+           printf("\nInvalid command syntax!\n");
+           break;
+         }
+         mandated_depth = num;
+         printf("\nSet depth to %d\n", mandated_depth);
+         break;
+
+       case SETLEVEL:
+         command += 6;
+         if (sscanf(command, "%d", &num) != 1) {
+           printf("\nInvalid command syntax!\n");
+           break;
+         }
+         set_level(num);
+         printf("\nSet level to %d\n", num);
+         break;
+
+       case DISPLAY:
+         if (!opt_showboard)
+           ascii_showboard();
+         break;
+
+       case FORCE:
+         command += 6; /* skip the force part... */
+         switch (get_command(command)) {
+         case MOVE:
+           state = do_move(gameinfo, command, &passes, 1);
+           break;
+         case PASS:
+           state = do_pass(gameinfo, &passes, 1);
+           break;
+         default:
+           printf("Illegal forced move: %s %d\n", command,
+                  get_command(command));
+           break;
+         }
+         break;
+
+       case MOVE:
+         state = do_move(gameinfo, command, &passes, 0);
+         break;
+
+       case PASS:
+         state = do_pass(gameinfo, &passes, 0);
+         break;
+
+       case PLAY:
+         command += 5;
+         if (sscanf(command, "%d", &num) != 1) {
+           printf("\nInvalid command syntax!\n");
+           break;
+         }
+         if (num >= 0)
+           for (m = 0; m < num; m++) {
+             gameinfo->computer_player 
+               = OTHER_COLOR(gameinfo->computer_player);
+             state = computer_move(gameinfo, &passes);
+             if (state)
+               break;
+             if (passes >= 2)
+               break;
+           }
+         else {
+           printf("\nInvalid number of moves specified: %d\n", num);
+           break;
+         }
+         break;
+
+       case PLAYBLACK:
+         if (gameinfo->computer_player == WHITE)
+           gameinfo->computer_player = BLACK;
+         if (gameinfo->computer_player == gameinfo->to_move)
+           state = computer_move(gameinfo, &passes);
+         break;
+
+       case PLAYWHITE:
+         if (gameinfo->computer_player == BLACK)
+           gameinfo->computer_player = WHITE;
+         if (gameinfo->computer_player == gameinfo->to_move)
+           state = computer_move(gameinfo, &passes);
+         break;
+
+       case SWITCH:
+         gameinfo->computer_player = OTHER_COLOR(gameinfo->computer_player);
+         state = computer_move(gameinfo, &passes);
+         break;
+
+       case UNDO:
+       case CMD_BACK:
+         if (undo_move(1)) {
+            sgftreeAddComment(&sgftree, "undone");
+           sgftreeBack(&sgftree);
+           gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+         }
+         else
+           printf("\nCan't undo.\n");
+         break;
+
+       case CMD_FORWARD:
+         if (sgftreeForward(&sgftree))
+           gameinfo->to_move = gnugo_play_sgfnode(sgftree.lastnode,
+                                                 gameinfo->to_move);
+         else
+           printf("\nEnd of game tree.\n");
+         break;
+
+       case CMD_LAST:
+         while (sgftreeForward(&sgftree))
+           gameinfo->to_move = gnugo_play_sgfnode(sgftree.lastnode,
+                                                 gameinfo->to_move);
+         break;
+
+       case COMMENT:
+         printf("\nEnter comment. Press ENTER when ready.\n");
+         fgets(line, 80, stdin);
+         sgftreeAddComment(&sgftree, line);
+         break;
+
+       case SCORE:
+         showscore = !showscore;
+         if (!showscore)
+           current_score_estimate = NO_SCORE;
+         break;
+
+       case CMD_DEAD:
+         silent_examine_position(FULL_EXAMINE_DRAGONS);
+         showdead = !showdead;
+         break;
+
+       case CMD_CAPTURE:
+         strtok(command, " ");
+         showcapture(strtok(NULL, " "));
+         break;
+
+       case CMD_DEFEND:
+         strtok(command, " ");
+         showdefense(strtok(NULL, " "));
+         break;
+
+       case CMD_SHOWMOYO:
+         tmp = printmoyo;
+         printmoyo = PRINTMOYO_MOYO;
+         silent_examine_position(EXAMINE_DRAGONS);
+         printmoyo = tmp;
+         break;
+
+       case CMD_SHOWTERRI:
+         tmp = printmoyo;
+         printmoyo = PRINTMOYO_TERRITORY;
+         silent_examine_position(EXAMINE_DRAGONS);
+         printmoyo = tmp;
+         break;
+
+       case CMD_SHOWAREA:
+         tmp = printmoyo;
+         printmoyo = PRINTMOYO_AREA;
+         silent_examine_position(EXAMINE_DRAGONS);
+         printmoyo = tmp;
+         break;
+
+       case CMD_SHOWDRAGONS:
+         silent_examine_position(EXAMINE_DRAGONS);
+         showboard(1);
+         break;
+
+       case CMD_GOTO:
+         strtok(command, " ");
+         ascii_goto(gameinfo, strtok(NULL, " "));
+         break;
+
+       case CMD_SAVE:
+         strtok(command, " ");
+         tmpstring = strtok(NULL, " ");
+         if (tmpstring) {
+           /* discard newline */
+           tmpstring[strlen(tmpstring) - 1] = 0;
+           /* make sure we are saving proper handicap */
+           init_sgf(gameinfo);
+           writesgf(sgftree.root, tmpstring);
+           printf("You may resume the game");
+           printf(" with -l %s --mode ascii\n", tmpstring);
+           printf("or load %s\n", tmpstring);
+         }
+         else
+           printf("Please specify filename\n");
+         break;
+
+       case CMD_LOAD:
+         strtok(command, " ");
+         tmpstring = strtok(NULL, " ");
+         if (tmpstring) {
+           /* discard newline */
+           tmpstring[strlen(tmpstring) - 1] = 0;
+           if (!sgftree_readfile(&sgftree, tmpstring)) {
+             fprintf(stderr, "Cannot open or parse '%s'\n", tmpstring);
+             break;
+           }
+            /* to avoid changing handicap etc. */
+           if (gameinfo_play_sgftree(gameinfo, &sgftree, NULL) == EMPTY)
+             fprintf(stderr, "Cannot load '%s'\n", tmpstring);
+           else {
+             sgf_initialized = 1;
+             sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap);
+           }
+         }
+         else
+           printf("Please specify a filename\n");
+         break;
+
+       case CMD_LISTDRAGONS:
+         silent_examine_position(EXAMINE_DRAGONS);
+         show_dragons();
+         break;
+
+       default:
+         printf("\nInvalid command: %s", command);
+         break;
+       }
+
+       if (passes >= 2)
+         state = ascii_endgame(gameinfo, 0);
+      }
+#if READLINE
+       free(line_ptr);
+#endif
+
+    }
+
+    sgffile_output(&sgftree);
+    passes = 0;
+    
+    /* Play a different game next time. */
+    update_random_seed();
+
+    /* Free the sgf tree and prepare for a new game. */
+    sgfFreeNode(sgftree.root);
+    sgftree_clear(&sgftree);
+    sgftreeCreateHeaderNode(&sgftree, board_size, komi, gameinfo->handicap);
+    sgf_initialized = 0;
+
+    gameinfo_clear(gameinfo);
+  }
+}
+
+
+/* Communicates with user after a game has ended. */
+static int
+ascii_endgame(Gameinfo *gameinfo, int reason)
+{
+  char line[80];
+  char *line_ptr;
+  char *command;
+  char *tmpstring;
+  int state = 0;
+
+  if (reason == 0) {           /* Two passes, game is over. */
+    who_wins(gameinfo->computer_player, stdout);
+    printf("\nIf you disagree, we may count the game together.\n");
+
+    sgftreeWriteResult(&sgftree, (white_score + black_score)/2.0, 1);
+  }
+  else {
+    int color = OTHER_COLOR(gameinfo->to_move);
+
+    if (reason == 1)           /* Our opponent has resigned. */
+      printf("GNU Go wins by resignation.\n");
+    else                       /* We have resigned. */
+      printf("You win by resignation.\n");
+
+    printf("Result: %c+Resign\n\n", color == WHITE ? 'W' : 'B');
+    sgftreeWriteResult(&sgftree, color == WHITE ? 1000.0 : -1000.0, 1);
+  }
+
+  while (state == 0) {
+    printf("You may optionally save the game as an SGF file.\n\n");
+    printf("Type \"save <filename>\" to save,\n");
+    if (reason == 0)
+      printf("     \"count\" to recount,\n");
+    else if (reason == 2)
+      printf("     \"continue\" to decline resignation and continue the game,\n");
+    printf("     \"quit\" to quit\n");
+    printf(" or  \"game\" to play again\n");
+
+    line_ptr = line;
+    if (!fgets(line, 80, stdin))
+      break;
+
+    command = strtok(line_ptr, "");
+    switch (get_command(command)) {
+    case CMD_SAVE:
+      strtok(command, " ");
+      tmpstring = strtok(NULL, " ");
+      if (tmpstring) {
+       /* discard newline */
+       tmpstring[strlen(tmpstring) - 1] = 0;
+       init_sgf(gameinfo);
+       writesgf(sgftree.root, tmpstring);
+      }
+      else
+       printf("Please specify filename\n");
+      break;
+
+    case COUNT:
+      if (reason == 0)
+       ascii_count(gameinfo);
+      break;
+
+    case CONTINUE:
+      state = -1;
+      break;
+
+    case NEW:
+      state = 1;
+      break;
+
+    case QUIT:
+      state = 2;
+      break;
+
+    default:
+      state = 0;
+    }
+  }
+
+  return state;
+}
+
+
+/* ascii_count() scores the game.
+ */
+static void
+ascii_count(Gameinfo *gameinfo)
+{
+  char line[12];
+  int done = 0;
+  int i;
+  int xyzzy = 1;
+  
+  printf("\nGame over. Let's count!.\n");  
+  showdead = 1;
+  ascii_showboard();
+  while (!done) {
+    printf("Dead stones are marked with small letters (x,o).\n");
+    printf("\nIf you don't agree, enter the location of a group\n");
+    printf("to toggle its state or \"done\".\n");
+
+    if (!fgets(line, 12, stdin))
+      return; /* EOF or some error */
+    
+    for (i = 0; i < 12; i++)
+      line[i] = tolower((int) line[i]);
+    if (!strncmp(line, "done", 4))
+      done = 1;
+    else if (!strncmp(line, "quit", 4))
+      return;
+    else if (!strncmp(line, "xyzzy", 5)) {
+      if (xyzzy) {
+       printf("\nYou are in a debris room filled with stuff washed in from the\n");
+       printf("surface.  A low wide passage with cobbles becomes plugged\n");
+       printf("with mud and debris here, but an awkward canyon leads\n");
+       printf("upward and west.  A note on the wall says:\n");
+       printf("   Magic Word \"XYZZY\"\n\n");
+       xyzzy = 0;
+      }
+      else {
+       printf("You are inside a building, a well house for a large spring.\n\n");
+       xyzzy = 1;
+      }
+    }
+    else if (!strncmp(line, "help", 4)) {
+      printf("\nIf there are dead stones on the board I will remove them.\n");
+      printf("You must tell me where they are. Type the coordinates of a\n");
+      printf("dead group, or type \"done\"\n");
+    }      
+    else if (!strncmp(line, "undo", 4)) {
+      printf("UNDO not allowed anymore. The status of the stones now\n");
+      printf("toggles after entering the location of it.\n");
+      ascii_showboard();
+    }
+    else {
+      int pos = string_to_location(board_size, line);
+      if (pos == NO_MOVE || board[pos] == EMPTY)
+       printf("\ninvalid!\n");
+      else {
+       enum dragon_status status = dragon_status(pos);
+       status = (status == DEAD) ? ALIVE : DEAD;
+       change_dragon_status(pos, status);
+       ascii_showboard();
+      }
+    }
+  }
+  who_wins(gameinfo->computer_player, stdout);
+}
+
+
+static void
+showcapture(char *line)
+{
+  int str;
+  int move;
+
+  gg_assert(line);
+  str = string_to_location(board_size, line);
+  if (str == NO_MOVE || board[str] == EMPTY) {
+    printf("\ninvalid point!\n");
+    return;
+  }
+  
+  if (attack(str, &move))
+    mprintf("\nSuccessful attack of %1m at %1m\n", str, move);
+  else
+    mprintf("\n%1m cannot be attacked\n", str);
+}
+
+
+static void
+showdefense(char *line)
+{
+  int str;
+  int move;
+  
+  gg_assert(line);
+  str = string_to_location(board_size, line);
+  if (str == NO_MOVE || board[str] == EMPTY) {
+    printf("\ninvalid point!\n");
+    return;
+  }
+
+  if (attack(str, NULL)) {
+      if (find_defense(str, &move))
+        mprintf("\nSuccessful defense of %1m at %1m\n", str, move);
+      else
+        mprintf("\n%1m cannot be defended\n", str);
+    }
+    else
+      mprintf("\nThere is no need to defend %1m\n", str);
+}
+
+
+static void
+ascii_goto(Gameinfo *gameinfo, char *line)
+{
+  const char *movenumber = line;
+
+  if (!line)
+    return;
+  
+  if (!strncmp(line, "last", 4))
+    movenumber = "9999";
+  else if (!strncmp(line, "first", 4))
+    movenumber = "1";
+  
+  printf("goto %s\n", movenumber);
+  gameinfo_play_sgftree(gameinfo, &sgftree, movenumber);
+}
+
+
+static void
+ascii_free_handicap(Gameinfo *gameinfo, char *handicap_string)
+{
+  int handi;
+  int i;
+  char line[80];
+  int stones[MAX_BOARD*MAX_BOARD];
+
+  if (sscanf(handicap_string, "%d", &handi) == 1) {
+    /* GNU Go is to place handicap */
+    if (handi < 0 || handi == 1) {
+      printf("\nInvalid command syntax!\n");
+      return;
+    }
+
+    clear_board();
+    handi = place_free_handicap(handi);
+    printf("\nPlaced %d stones of free handicap.\n", handi);
+  }
+  else { /* User is to place handicap */
+    clear_board();
+    handi = 0;
+
+    while (1) {
+      ascii_showboard();
+      printf("\nType in coordinates of next handicap stone, or one of the following commands:\n");
+      printf("  undo        take back the last stone placed\n");
+      printf("  clear       remove all the stones placed so far\n");
+      printf("  done        finish placing handicap\n\n");
+      printf("You have placed %d handicap stone(s) so far.\n\n", handi);
+
+      if (!fgets(line, 80, stdin))
+        return; /* EOF or some error */
+      for (i = 0; i < 80; i++)
+        line[i] = tolower((int) line[i]);
+
+      if (!strncmp(line, "undo", 4)) {
+        if (!handi)
+         printf("\nNothing to undo.\n");
+       else {
+         remove_stone(stones[--handi]);
+         gprintf("\nRemoved the stone at %m.\n", I(stones[handi]),
+                 J(stones[handi]));
+       }
+      }
+      else if (!strncmp(line, "clear", 5)) {
+        clear_board();
+        handi = 0;
+      }
+      else if (!strncmp(line, "done", 4)) {
+       if (handi == 1) /* Don't bother with checks later */
+         printf("\nHandicap cannot be one stone. Either add "
+                "some more, or delete the only stone.\n");
+       else
+         break;
+      }
+      else {
+       int pos = string_to_location(board_size, line);
+       if (pos != NO_MOVE) {
+         if (board[pos] != EMPTY)
+           printf("\nThere's already a stone there.\n");
+         else {
+           add_stone(pos, BLACK);
+           stones[handi++] = pos;
+         }
+       }
+       else
+         printf("\nInvalid command: %s", line);
+      }
+    }
+  }
+  gameinfo->handicap = handi;
+  gameinfo->to_move = (handi ? WHITE : BLACK);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/play_gmp.c b/interface/play_gmp.c
new file mode 100644 (file)
index 0000000..9099525
--- /dev/null
@@ -0,0 +1,277 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+#include "liberty.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "interface.h"
+#include "gmp.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+
+/* --------------------------------------------------------------*/
+/* Play a game against a go-modem-protocol (GMP) client.         */
+/* --------------------------------------------------------------*/
+void
+play_gmp(Gameinfo *gameinfo, int simplified)
+{
+  SGFTree sgftree;
+
+  Gmp *ge;
+  GmpResult message;
+  const char *error;
+  
+  int i, j;
+  int passes = 0; /* two passes and its over */
+  int to_move;  /* who's turn is next ? */
+
+  int mycolor = -1;  /* who has which color */
+  int yourcolor;
+
+  if (gameinfo->computer_player == WHITE)
+    mycolor = 1;
+  else if (gameinfo->computer_player == BLACK)
+    mycolor = 0;
+
+  sgftree_clear(&sgftree);
+  sgftreeCreateHeaderNode(&sgftree, board_size, komi, gameinfo->handicap);
+
+  ge = gmp_create(0, 1);
+  TRACE("board size=%d\n", board_size);
+
+  /* 
+   * The specification of the go modem protocol doesn't even discuss
+   * komi. So we have to guess the komi. If the komi is set on the
+   * command line, keep it. Otherwise, its value will be 0.0 and we
+   * use 5.5 in an even game, 0.5 otherwise.
+   */
+  if (komi == 0.0) {
+    if (gameinfo->handicap == 0)
+      komi = 5.5;
+    else
+      komi = 0.5;
+  }
+
+  if (!simplified) {
+    /* Leave all the -1's so the client can negotiate the game parameters. */
+    if (chinese_rules)
+      gmp_startGame(ge, -1, -1, 5.5, -1, mycolor, 0);
+    else
+      gmp_startGame(ge, -1, -1, 5.5, 0, mycolor, 0);
+  }
+  else {
+    gmp_startGame(ge, board_size, gameinfo->handicap,
+                 komi, chinese_rules, mycolor, 1);
+  }
+
+  do {
+    message = gmp_check(ge, 1, NULL, NULL, &error);
+  } while (message == gmp_nothing || message == gmp_reset);
+  
+  if (message == gmp_err) {
+    fprintf(stderr, "gnugo-gmp: Error \"%s\" occurred.\n", error);
+    exit(EXIT_FAILURE);
+  }
+  else if (message != gmp_newGame) {
+    fprintf(stderr, "gnugo-gmp: Expecting a newGame, got %s\n",
+           gmp_resultString(message));
+    exit(EXIT_FAILURE);
+  }
+
+  gameinfo->handicap = gmp_handicap(ge);
+  if (!check_boardsize(gmp_size(ge), stderr))
+    exit(EXIT_FAILURE);
+  
+  gnugo_clear_board(gmp_size(ge));
+
+  /* Let's pretend GMP knows about komi in case something will ever change. */
+  komi = gmp_komi(ge);
+
+#if ORACLE
+  if (metamachine && oracle_exists)
+    oracle_clear_board(board_size);
+#endif
+
+  sgfOverwritePropertyInt(sgftree.root, "SZ", board_size);
+
+  TRACE("size=%d, handicap=%d, komi=%f\n", board_size,
+       gameinfo->handicap, komi);
+
+  if (gameinfo->handicap)
+    to_move = WHITE;
+  else
+    to_move = BLACK;
+
+  if (gmp_iAmWhite(ge)) {
+    mycolor = WHITE;     /* computer white */
+    yourcolor = BLACK;   /* human black */
+  }
+  else {
+    mycolor = BLACK;
+    yourcolor = WHITE;
+  }
+
+  gameinfo->computer_player = mycolor;
+  sgf_write_header(sgftree.root, 1, get_random_seed(), komi,
+                  gameinfo->handicap, get_level(), chinese_rules);
+  gameinfo->handicap = gnugo_sethand(gameinfo->handicap, sgftree.root);
+  sgfOverwritePropertyInt(sgftree.root, "HA", gameinfo->handicap);
+
+  /* main GMP loop */
+  while (passes < 2) {
+
+    if (to_move == yourcolor) {
+      int move;
+      /* Get opponent's move from gmp client. */
+      message = gmp_check(ge, 1, &j, &i, &error);
+
+      if (message == gmp_err) {
+       fprintf(stderr, "GNU Go: Sorry, error from gmp client\n");
+        sgftreeAddComment(&sgftree, "got error from gmp client");
+        sgffile_output(&sgftree);
+       return;
+      }
+
+      if (message == gmp_undo) {
+       int k;
+       assert(j > 0);
+       
+       for (k = 0; k < j; k++) {
+         if (!undo_move(1)) {
+           fprintf(stderr, "GNU Go: play_gmp UNDO: can't undo %d moves\n",
+                   j - k);
+           break;
+         }
+         sgftreeAddComment(&sgftree, "undone");
+         sgftreeBack(&sgftree);
+         to_move = OTHER_COLOR(to_move);
+       }
+       continue;
+      }
+
+      if (message == gmp_pass) {
+       passes++;
+       move = PASS_MOVE;
+      }
+      else {
+       passes = 0;
+       move = POS(i, j);
+      }
+
+      TRACE("\nyour move: %1m\n\n", move);
+      sgftreeAddPlay(&sgftree, to_move, I(move), J(move));
+      gnugo_play_move(move, yourcolor);
+      sgffile_output(&sgftree);
+
+    }
+    else {
+      /* Generate my next move. */
+      float move_value;
+      int move;
+      if (autolevel_on)
+       adjust_level_offset(mycolor);
+      move = genmove(mycolor, &move_value, NULL);
+      gnugo_play_move(move, mycolor);
+      sgffile_add_debuginfo(sgftree.lastnode, move_value);
+      
+      if (is_pass(move)) {
+       /* pass */
+        sgftreeAddPlay(&sgftree, to_move, -1, -1);
+       gmp_sendPass(ge);
+       ++passes;
+      }
+      else {
+       /* not pass */
+        sgftreeAddPlay(&sgftree, to_move, I(move), J(move));
+       gmp_sendMove(ge, J(move), I(move));
+       passes = 0;
+       TRACE("\nmy move: %1m\n\n", move);
+      }
+      sgffile_add_debuginfo(sgftree.lastnode, 0.0);
+      sgffile_output(&sgftree);
+    }
+    
+    to_move = OTHER_COLOR(to_move);
+  }
+  
+  /* two passes: game over */
+  gmp_sendPass(ge);   
+  
+  if (!quiet)
+    fprintf(stderr, "Game over - waiting for client to shut us down\n");
+  who_wins(mycolor, stderr);
+
+  if (showtime) {
+    gprintf("\nSLOWEST MOVE: %d at %1m ", slowest_movenum, slowest_move);
+    fprintf(stderr, "(%.2f seconds)\n", slowest_time);
+    fprintf(stderr, "\nAVERAGE TIME: %.2f seconds per move\n",
+           total_time / movenum);
+    fprintf(stderr, "\nTOTAL TIME: %.2f seconds\n",
+           total_time);
+  }
+  
+  
+  /* play_gmp() does not return to main(), therefore the score
+   * writing code is here.
+   */
+  { 
+    float score = gnugo_estimate_score(NULL, NULL);
+    sgfWriteResult(sgftree.root, score, 1);
+  }
+  sgffile_output(&sgftree);
+
+  if (!simplified) {
+    /* We hang around here until cgoban asks us to go, since
+     * sometimes cgoban crashes if we exit first.
+     *
+     * FIXME: Check if this is still needed.  I made it dependand on
+     *       `simplifed' just to avoid changes in GMP mode.
+     */
+    while (1) {
+      message = gmp_check(ge, 1, &j, &i, &error);
+      if (!quiet)
+       fprintf(stderr, "Message %d from gmp\n", message);
+      if (message == gmp_err)
+       break;
+    }
+  }
+
+#if ORACLE
+  if (metamachine && oracle_exists)
+    dismiss_oracle();
+#endif
+
+  if (!quiet)
+    fprintf(stderr, "gnugo going down\n");
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/play_gtp.c b/interface/play_gtp.c
new file mode 100644 (file)
index 0000000..f5e416d
--- /dev/null
@@ -0,0 +1,4639 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+
+#include "interface.h"
+#include "liberty.h"
+#include "gtp.h"
+#include "gg_utils.h"
+
+/* Internal state that's not part of the engine. */
+static int report_uncertainty = 0;
+static int gtp_orientation = 0;
+
+static void gtp_print_code(int c);
+static void gtp_print_vertices2(int n, int *moves);
+static void rotate_on_input(int ai, int aj, int *bi, int *bj);
+static void rotate_on_output(int ai, int aj, int *bi, int *bj);
+
+
+#define DECLARE(func) static int func(char *s)
+
+DECLARE(gtp_aa_confirm_safety);
+DECLARE(gtp_accurate_approxlib);
+DECLARE(gtp_accuratelib);
+DECLARE(gtp_advance_random_seed);
+DECLARE(gtp_all_legal);
+DECLARE(gtp_all_move_values);
+DECLARE(gtp_analyze_eyegraph);
+DECLARE(gtp_analyze_semeai);
+DECLARE(gtp_analyze_semeai_after_move);
+DECLARE(gtp_attack);
+DECLARE(gtp_attack_either);
+DECLARE(gtp_block_off);
+DECLARE(gtp_break_in);
+DECLARE(gtp_captures);
+DECLARE(gtp_clear_board);
+DECLARE(gtp_clear_cache);
+DECLARE(gtp_combination_attack);
+DECLARE(gtp_combination_defend);
+DECLARE(gtp_connect);
+DECLARE(gtp_countlib);
+DECLARE(gtp_cputime);
+DECLARE(gtp_decrease_depths);
+DECLARE(gtp_defend);
+DECLARE(gtp_defend_both);
+DECLARE(gtp_disconnect);
+DECLARE(gtp_does_attack);
+DECLARE(gtp_does_defend);
+DECLARE(gtp_does_surround);
+DECLARE(gtp_dragon_data);
+DECLARE(gtp_dragon_status);
+DECLARE(gtp_dragon_stones);
+DECLARE(gtp_draw_search_area);
+DECLARE(gtp_dump_stack);
+DECLARE(gtp_echo);
+DECLARE(gtp_echo_err);
+DECLARE(gtp_estimate_score);
+DECLARE(gtp_eval_eye);
+DECLARE(gtp_experimental_score);
+DECLARE(gtp_eye_data);
+DECLARE(gtp_final_score);
+DECLARE(gtp_final_status);
+DECLARE(gtp_final_status_list);
+DECLARE(gtp_findlib);
+DECLARE(gtp_finish_sgftrace);
+DECLARE(gtp_fixed_handicap);
+DECLARE(gtp_followup_influence);
+DECLARE(gtp_genmove);
+DECLARE(gtp_genmove_black);
+DECLARE(gtp_genmove_white);
+DECLARE(gtp_get_connection_node_counter);
+DECLARE(gtp_get_handicap);
+DECLARE(gtp_get_komi);
+DECLARE(gtp_get_life_node_counter);
+DECLARE(gtp_get_owl_node_counter);
+DECLARE(gtp_get_random_seed);
+DECLARE(gtp_get_reading_node_counter);
+DECLARE(gtp_get_trymove_counter);
+DECLARE(gtp_gg_genmove);
+DECLARE(gtp_gg_undo);
+DECLARE(gtp_half_eye_data);
+DECLARE(gtp_increase_depths);
+DECLARE(gtp_initial_influence);
+DECLARE(gtp_invariant_hash);
+DECLARE(gtp_invariant_hash_for_moves);
+DECLARE(gtp_is_legal);
+DECLARE(gtp_is_surrounded);
+DECLARE(gtp_kgs_genmove_cleanup);
+DECLARE(gtp_known_command);
+DECLARE(gtp_ladder_attack);
+DECLARE(gtp_last_move);
+DECLARE(gtp_limit_search);
+DECLARE(gtp_list_commands);
+DECLARE(gtp_list_stones);
+DECLARE(gtp_loadsgf);
+DECLARE(gtp_move_influence);
+DECLARE(gtp_move_probabilities);
+DECLARE(gtp_move_reasons);
+DECLARE(gtp_move_uncertainty);
+DECLARE(gtp_move_history);
+DECLARE(gtp_name);
+DECLARE(gtp_owl_attack);
+DECLARE(gtp_owl_connection_defends);
+DECLARE(gtp_owl_defend);
+DECLARE(gtp_owl_does_attack);
+DECLARE(gtp_owl_does_defend);
+DECLARE(gtp_owl_substantial);
+DECLARE(gtp_owl_threaten_attack);
+DECLARE(gtp_owl_threaten_defense);
+DECLARE(gtp_place_free_handicap);
+DECLARE(gtp_play);
+DECLARE(gtp_playblack);
+DECLARE(gtp_playwhite);
+DECLARE(gtp_popgo);
+DECLARE(gtp_printsgf);
+DECLARE(gtp_program_version);
+DECLARE(gtp_protocol_version);
+DECLARE(gtp_query_boardsize);
+DECLARE(gtp_query_orientation);
+DECLARE(gtp_quit);
+DECLARE(gtp_reg_genmove);
+DECLARE(gtp_report_uncertainty);
+DECLARE(gtp_reset_connection_node_counter);
+DECLARE(gtp_reset_life_node_counter);
+DECLARE(gtp_reset_owl_node_counter);
+DECLARE(gtp_reset_reading_node_counter);
+DECLARE(gtp_reset_search_mask);
+DECLARE(gtp_reset_trymove_counter);
+DECLARE(gtp_restricted_genmove);
+DECLARE(gtp_same_dragon);
+DECLARE(gtp_set_boardsize);
+DECLARE(gtp_set_free_handicap);
+DECLARE(gtp_set_komi);
+DECLARE(gtp_set_level);
+DECLARE(gtp_set_orientation);
+DECLARE(gtp_set_random_seed);
+DECLARE(gtp_set_search_diamond);
+DECLARE(gtp_set_search_limit);
+DECLARE(gtp_showboard);
+DECLARE(gtp_start_sgftrace);
+DECLARE(gtp_surround_map);
+DECLARE(gtp_tactical_analyze_semeai);
+DECLARE(gtp_test_eyeshape);
+DECLARE(gtp_time_left);
+DECLARE(gtp_time_settings);
+DECLARE(gtp_top_moves);
+DECLARE(gtp_top_moves_black);
+DECLARE(gtp_top_moves_white);
+DECLARE(gtp_tryko);
+DECLARE(gtp_trymove);
+DECLARE(gtp_tune_move_ordering);
+DECLARE(gtp_unconditional_status);
+DECLARE(gtp_undo);
+DECLARE(gtp_what_color);
+DECLARE(gtp_worm_cutstone);
+DECLARE(gtp_worm_data);
+DECLARE(gtp_worm_stones);
+
+/* List of known commands. */
+static struct gtp_command commands[] = {
+  {"aa_confirm_safety",       gtp_aa_confirm_safety},
+  {"accurate_approxlib",      gtp_accurate_approxlib},
+  {"accuratelib",             gtp_accuratelib},
+  {"advance_random_seed",     gtp_advance_random_seed},
+  {"all_legal",                      gtp_all_legal},
+  {"all_move_values",         gtp_all_move_values},
+  {"analyze_eyegraph",               gtp_analyze_eyegraph},
+  {"analyze_semeai",          gtp_analyze_semeai},
+  {"analyze_semeai_after_move", gtp_analyze_semeai_after_move},
+  {"attack",                         gtp_attack},
+  {"attack_either",           gtp_attack_either},
+  {"black",                          gtp_playblack},
+  {"block_off",                      gtp_block_off},
+  {"boardsize",                      gtp_set_boardsize},
+  {"break_in",               gtp_break_in},
+  {"captures",               gtp_captures},
+  {"clear_board",                    gtp_clear_board},
+  {"clear_cache",            gtp_clear_cache},
+  {"color",                          gtp_what_color},
+  {"combination_attack",      gtp_combination_attack},
+  {"combination_defend",      gtp_combination_defend},
+  {"connect",                gtp_connect},
+  {"countlib",                       gtp_countlib},
+  {"cputime",                gtp_cputime},
+  {"decrease_depths",                gtp_decrease_depths},
+  {"defend",                         gtp_defend},
+  {"defend_both",            gtp_defend_both},
+  {"disconnect",                     gtp_disconnect},
+  {"does_attack",             gtp_does_attack},
+  {"does_defend",             gtp_does_defend},
+  {"does_surround",           gtp_does_surround},
+  {"dragon_data",             gtp_dragon_data},
+  {"dragon_status",                  gtp_dragon_status},
+  {"dragon_stones",           gtp_dragon_stones},
+  {"draw_search_area",        gtp_draw_search_area},
+  {"dump_stack",                     gtp_dump_stack},
+  {"echo" ,                   gtp_echo},
+  {"echo_err" ,               gtp_echo_err},
+  {"estimate_score",          gtp_estimate_score},
+  {"eval_eye",                       gtp_eval_eye},
+  {"experimental_score",      gtp_experimental_score},
+  {"eye_data",                gtp_eye_data},
+  {"final_score",             gtp_final_score},
+  {"final_status",            gtp_final_status},
+  {"final_status_list",       gtp_final_status_list},
+  {"findlib",                        gtp_findlib},
+  {"finish_sgftrace",                gtp_finish_sgftrace},
+  {"fixed_handicap",                 gtp_fixed_handicap},
+  {"followup_influence",      gtp_followup_influence},
+  {"genmove",                 gtp_genmove},
+  {"genmove_black",           gtp_genmove_black},
+  {"genmove_white",           gtp_genmove_white},
+  {"get_connection_node_counter", gtp_get_connection_node_counter},
+  {"get_handicap",           gtp_get_handicap},
+  {"get_komi",               gtp_get_komi},
+  {"get_life_node_counter",   gtp_get_life_node_counter},
+  {"get_owl_node_counter",    gtp_get_owl_node_counter},
+  {"get_random_seed",                gtp_get_random_seed},
+  {"get_reading_node_counter", gtp_get_reading_node_counter},
+  {"get_trymove_counter",     gtp_get_trymove_counter},
+  {"gg-undo",                 gtp_gg_undo},
+  {"gg_genmove",              gtp_gg_genmove},
+  {"half_eye_data",           gtp_half_eye_data},
+  {"help",                    gtp_list_commands},
+  {"increase_depths",                gtp_increase_depths},
+  {"initial_influence",       gtp_initial_influence},
+  {"invariant_hash_for_moves",gtp_invariant_hash_for_moves},
+  {"invariant_hash",                 gtp_invariant_hash},
+  {"is_legal",                       gtp_is_legal},
+  {"is_surrounded",           gtp_is_surrounded},
+  {"kgs-genmove_cleanup",     gtp_kgs_genmove_cleanup},
+  {"known_command",                  gtp_known_command},
+  {"komi",                   gtp_set_komi},
+  {"ladder_attack",                  gtp_ladder_attack},
+  {"last_move",              gtp_last_move},
+  {"level",                  gtp_set_level},
+  {"limit_search",                   gtp_limit_search},
+  {"list_commands",                  gtp_list_commands},
+  {"list_stones",            gtp_list_stones},
+  {"loadsgf",                        gtp_loadsgf},
+  {"move_influence",          gtp_move_influence},
+  {"move_probabilities",      gtp_move_probabilities},
+  {"move_reasons",            gtp_move_reasons},
+  {"move_uncertainty",       gtp_move_uncertainty},
+  {"move_history",           gtp_move_history},
+  {"name",                    gtp_name},
+  {"new_score",               gtp_estimate_score},
+  {"orientation",            gtp_set_orientation},
+  {"owl_attack",             gtp_owl_attack},
+  {"owl_connection_defends",  gtp_owl_connection_defends},
+  {"owl_defend",             gtp_owl_defend},
+  {"owl_does_attack",        gtp_owl_does_attack},
+  {"owl_does_defend",        gtp_owl_does_defend},
+  {"owl_substantial",        gtp_owl_substantial},
+  {"owl_threaten_attack",     gtp_owl_threaten_attack},
+  {"owl_threaten_defense",    gtp_owl_threaten_defense},
+  {"place_free_handicap",     gtp_place_free_handicap},
+  {"play",                   gtp_play},
+  {"popgo",                          gtp_popgo},
+  {"printsgf",                       gtp_printsgf},
+  {"protocol_version",        gtp_protocol_version},
+  {"query_boardsize",         gtp_query_boardsize},
+  {"query_orientation",       gtp_query_orientation},
+  {"quit",                           gtp_quit},
+  {"reg_genmove",             gtp_reg_genmove},
+  {"report_uncertainty",      gtp_report_uncertainty},
+  {"reset_connection_node_counter", gtp_reset_connection_node_counter},
+  {"reset_life_node_counter", gtp_reset_life_node_counter},
+  {"reset_owl_node_counter",  gtp_reset_owl_node_counter},
+  {"reset_reading_node_counter", gtp_reset_reading_node_counter},
+  {"reset_search_mask",       gtp_reset_search_mask},
+  {"reset_trymove_counter",   gtp_reset_trymove_counter},
+  {"restricted_genmove",      gtp_restricted_genmove},
+  {"same_dragon",            gtp_same_dragon},
+  {"set_free_handicap",       gtp_set_free_handicap},
+  {"set_random_seed",                gtp_set_random_seed},
+  {"set_search_diamond",      gtp_set_search_diamond},
+  {"set_search_limit",        gtp_set_search_limit},
+  {"showboard",                      gtp_showboard},
+  {"start_sgftrace",         gtp_start_sgftrace},
+  {"surround_map",            gtp_surround_map},
+  {"tactical_analyze_semeai", gtp_tactical_analyze_semeai},
+  {"test_eyeshape",           gtp_test_eyeshape},
+  {"time_left",               gtp_time_left},
+  {"time_settings",           gtp_time_settings},
+  {"top_moves",               gtp_top_moves},
+  {"top_moves_black",         gtp_top_moves_black},
+  {"top_moves_white",         gtp_top_moves_white},
+  {"tryko",                  gtp_tryko},
+  {"trymove",                        gtp_trymove},
+  {"tune_move_ordering",      gtp_tune_move_ordering},
+  {"unconditional_status",    gtp_unconditional_status},
+  {"undo",                    gtp_undo},
+  {"version",                 gtp_program_version},
+  {"white",                          gtp_playwhite},
+  {"worm_cutstone",           gtp_worm_cutstone},
+  {"worm_data",               gtp_worm_data},
+  {"worm_stones",             gtp_worm_stones},
+  {NULL,                      NULL}
+};
+
+
+/* Start playing using the Go Text Protocol. */
+void
+play_gtp(FILE *gtp_input, FILE *gtp_output, FILE *gtp_dump_commands,
+        int gtp_initial_orientation)
+{
+  /* Make sure `gtp_output' is unbuffered. (Line buffering is also
+   * okay but not necessary. Block buffering breaks GTP mode.)
+   *
+   * FIXME: Maybe should go to `gtp.c'?
+   */
+  setbuf(gtp_output, NULL);
+
+  /* Inform the GTP utility functions about the board size. */
+  gtp_internal_set_boardsize(board_size);
+  gtp_orientation = gtp_initial_orientation;
+  gtp_set_vertex_transform_hooks(rotate_on_input, rotate_on_output);
+
+  /* Initialize time handling. */
+  init_timers();
+  
+  /* Prepare pattern matcher and reading code. */
+  reset_engine();
+  clearstats();
+  gtp_main_loop(commands, gtp_input, gtp_output, gtp_dump_commands);
+  if (showstatistics)
+    showstats();
+}
+
+
+/****************************
+ * Administrative commands. *
+ ****************************/
+
+/* Function:  Quit
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_quit(char *s)
+{
+  UNUSED(s);
+  gtp_success("");
+  return GTP_QUIT;
+}
+
+
+/* Function:  Report protocol version.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   protocol version number
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_protocol_version(char *s)
+{
+  UNUSED(s);
+  return gtp_success("%d", gtp_version);
+}
+
+
+/****************************
+ * Program identity.        *
+ ****************************/
+
+/* Function:  Report the name of the program.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   program name
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_name(char *s)
+{
+  UNUSED(s);
+  return gtp_success("GNU Go");
+}
+
+
+
+
+/* Function:  Report the version number of the program.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   version number
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_program_version(char *s)
+{
+  UNUSED(s);
+  return gtp_success(VERSION);
+}
+
+
+/***************************
+ * Setting the board size. *
+ ***************************/
+
+/* Function:  Set the board size to NxN and clear the board.
+ * Arguments: integer
+ * Fails:     board size outside engine's limits
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_set_boardsize(char *s)
+{
+  int boardsize;
+
+  if (sscanf(s, "%d", &boardsize) < 1)
+    return gtp_failure("boardsize not an integer");
+  
+  if (!check_boardsize(boardsize, NULL)) {
+    if (gtp_version == 1)
+      return gtp_failure("unacceptable boardsize");
+    else
+      return gtp_failure("unacceptable size");
+  }
+
+  /* If this is called with a non-empty board, we assume that a new
+   * game will be started, for which we want a new random seed.
+   */
+  if (stones_on_board(BLACK | WHITE) > 0)
+    update_random_seed();
+
+  board_size = boardsize;
+  clear_board();
+  gtp_internal_set_boardsize(boardsize);
+  reset_engine();
+  return gtp_success("");
+}
+
+/* Function:  Find the current boardsize
+ * Arguments: none
+ * Fails:     never
+ * Returns:   board_size
+ */
+static int
+gtp_query_boardsize(char *s)
+{
+  UNUSED(s);
+
+  return gtp_success("%d", board_size);
+}
+
+/***********************
+ * Clearing the board. *
+ ***********************/
+
+/* Function:  Clear the board.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_clear_board(char *s)
+{
+  UNUSED(s);
+
+  /* If this is called with a non-empty board, we assume that a new
+   * game will be started, for which we want a new random seed.
+   */
+  if (stones_on_board(BLACK | WHITE) > 0)
+    update_random_seed();
+
+  clear_board();
+  init_timers();
+  
+  return gtp_success("");
+}
+
+/****************************
+ * Setting the orientation. *
+ ****************************/
+
+/* Function:  Set the orienation to N and clear the board
+ * Arguments: integer
+ * Fails:     illegal orientation
+ * Returns:   nothing
+ */
+static int
+gtp_set_orientation(char *s)
+{
+  int orientation;
+  if (sscanf(s, "%d", &orientation) < 1)
+    return gtp_failure("orientation not an integer");
+  
+  if (orientation < 0 || orientation > 7)
+    return gtp_failure("unacceptable orientation");
+
+  clear_board();
+  gtp_orientation = orientation;
+  gtp_set_vertex_transform_hooks(rotate_on_input, rotate_on_output);
+  return gtp_success("");
+}
+
+/* Function:  Find the current orientation
+ * Arguments: none
+ * Fails:     never
+ * Returns:   orientation
+ */
+static int
+gtp_query_orientation(char *s)
+{
+  UNUSED(s);
+
+  return gtp_success("%d", gtp_orientation);
+}
+
+/***************************
+ * Setting komi.           *
+ ***************************/
+
+/* Function:  Set the komi.
+ * Arguments: float
+ * Fails:     incorrect argument
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_set_komi(char *s)
+{
+  if (sscanf(s, "%f", &komi) < 1)
+    return gtp_failure("komi not a float");
+  
+  return gtp_success("");
+}
+
+
+/***************************
+ * Getting komi            *
+ ***************************/
+
+/* Function:  Get the komi
+ * Arguments: none
+ * Fails:     never
+ * Returns:   Komi 
+ */
+static int
+gtp_get_komi(char *s)
+{
+  UNUSED(s);
+  return gtp_success("%4.1f", komi);
+}
+
+
+/******************
+ * Playing moves. *
+ ******************/
+
+/* Function:  Play a black stone at the given vertex.
+ * Arguments: vertex
+ * Fails:     invalid vertex, illegal move
+ * Returns:   nothing
+ *
+ * Status:    Obsolete GTP version 1 command.
+ */
+static int
+gtp_playblack(char *s)
+{
+  int i, j;
+  char *c;
+
+  for (c = s; *c; c++)
+    *c = tolower((int)*c);
+
+  if (strncmp(s, "pass", 4) == 0) {
+    i = -1;
+    j = -1;
+  }
+  else if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (!is_allowed_move(POS(i, j), BLACK))
+    return gtp_failure("illegal move");
+
+  gnugo_play_move(POS(i, j), BLACK);
+  return gtp_success("");
+}
+
+
+/* Function:  Play a white stone at the given vertex.
+ * Arguments: vertex
+ * Fails:     invalid vertex, illegal move
+ * Returns:   nothing
+ *
+ * Status:    Obsolete GTP version 1 command.
+ */
+static int
+gtp_playwhite(char *s)
+{
+  int i, j;
+  char *c;
+
+  for (c = s; *c; c++)
+    *c = tolower((int)*c);
+
+  if (strncmp(s, "pass", 4) == 0) {
+    i = -1;
+    j = -1;
+  }
+  else if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+  
+  if (!is_allowed_move(POS(i, j), WHITE))
+    return gtp_failure("illegal move");
+
+  gnugo_play_move(POS(i, j), WHITE);
+  return gtp_success("");
+}
+
+
+/* Function:  Play a stone of the given color at the given vertex.
+ * Arguments: color, vertex
+ * Fails:     invalid vertex, illegal move
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_play(char *s)
+{
+  int i, j;
+  int color;
+
+  if (!gtp_decode_move(s, &color, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  if (!is_allowed_move(POS(i, j), color))
+    return gtp_failure("illegal move");
+
+  gnugo_play_move(POS(i, j), color);
+  return gtp_success("");
+}
+
+
+/* Function:  Set up fixed placement handicap stones.
+ * Arguments: number of handicap stones
+ * Fails:     invalid number of stones for the current boardsize
+ * Returns:   list of vertices with handicap stones
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_fixed_handicap(char *s)
+{
+  int m, n;
+  int first = 1;
+  int this_handicap;
+
+  if (gtp_version == 1)
+    clear_board();
+  else if (stones_on_board(BLACK | WHITE) > 0)
+    return gtp_failure("board not empty");
+
+  if (sscanf(s, "%d", &this_handicap) < 1)
+    return gtp_failure("handicap not an integer");
+  
+  if (this_handicap < 2 && (gtp_version > 1 || this_handicap != 0))
+    return gtp_failure("invalid handicap");
+
+  if (place_fixed_handicap(this_handicap) != this_handicap) {
+    clear_board();
+    return gtp_failure("invalid handicap");
+  }
+
+  handicap = this_handicap;
+
+  gtp_start_response(GTP_SUCCESS);
+
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++)
+      if (BOARD(m, n) != EMPTY) {
+       if (!first)
+         gtp_printf(" ");
+       else
+         first = 0;
+       gtp_mprintf("%m", m, n);
+      }
+  
+  return gtp_finish_response();
+}
+
+
+/* Function:  Choose free placement handicap stones and put them on the board.
+ * Arguments: number of handicap stones
+ * Fails:     invalid number of stones
+ * Returns:   list of vertices with handicap stones
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_place_free_handicap(char *s)
+{
+  int m, n;
+  int first = 1;
+  int this_handicap;
+  if (sscanf(s, "%d", &this_handicap) < 1)
+    return gtp_failure("handicap not an integer");
+  
+  if (stones_on_board(BLACK | WHITE) > 0)
+    return gtp_failure("board not empty");
+
+  if (this_handicap < 2)
+    return gtp_failure("invalid handicap");
+
+  handicap = place_free_handicap(this_handicap);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++)
+      if (BOARD(m, n) != EMPTY) {
+       if (!first)
+         gtp_printf(" ");
+       else
+         first = 0;
+       gtp_mprintf("%m", m, n);
+      }
+  
+  return gtp_finish_response();
+}
+
+
+/* Function:  Put free placement handicap stones on the board.
+ * Arguments: list of vertices with handicap stones
+ * Fails:     board not empty, bad list of vertices
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_set_free_handicap(char *s)
+{
+  int n;
+  int i, j;
+  int k;
+  
+  if (stones_on_board(BLACK | WHITE) > 0)
+    return gtp_failure("board not empty");
+
+  for (k = 0; k < MAX_BOARD * MAX_BOARD; k++) {
+    n = gtp_decode_coord(s, &i, &j);
+    if (n > 0) {
+      if (board[POS(i, j)] != EMPTY) {
+       clear_board();
+       return gtp_failure("repeated vertex");
+      }
+      add_stone(POS(i, j), BLACK);
+      s += n;
+    }
+    else if (sscanf(s, "%*s") != EOF)
+      return gtp_failure("invalid coordinate");
+    else
+      break;
+  }
+
+  if (k < 2) {
+    clear_board();
+    return gtp_failure("invalid handicap");
+  }
+
+  handicap = k;
+  
+  return gtp_success("");
+}
+
+
+/* Function:  Get the handicap
+ * Arguments: none
+ * Fails:     never
+ * Returns:   handicap
+ */
+static int
+gtp_get_handicap(char *s)
+{
+  UNUSED(s);
+  return gtp_success("%d", handicap);
+}
+
+
+/* Function:  Load an sgf file, possibly up to a move number or the first
+ *            occurence of a move.           
+ * Arguments: filename + move number, vertex, or nothing
+ * Fails:     missing filename or failure to open or parse file
+ * Returns:   color to play
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_loadsgf(char *s)
+{
+  char filename[GTP_BUFSIZE];
+  char untilstring[GTP_BUFSIZE];
+  SGFTree sgftree;
+  Gameinfo gameinfo;
+  int nread;
+  int color_to_move;
+  
+  nread = sscanf(s, "%s %s", filename, untilstring);
+  if (nread < 1)
+    return gtp_failure("missing filename");
+
+  sgftree_clear(&sgftree);
+  if (!sgftree_readfile(&sgftree, filename))
+    return gtp_failure("cannot open or parse '%s'", filename);
+
+  if (nread == 1)
+    color_to_move = gameinfo_play_sgftree_rot(&gameinfo, &sgftree, NULL,
+                                             gtp_orientation);
+  else
+    color_to_move = gameinfo_play_sgftree_rot(&gameinfo, &sgftree, untilstring,
+                                              gtp_orientation);
+
+  if (color_to_move == EMPTY)
+    return gtp_failure("cannot load '%s'", filename);
+  
+  gtp_internal_set_boardsize(board_size);
+  reset_engine();
+  init_timers();
+
+  sgfFreeNode(sgftree.root);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_mprintf("%C", color_to_move);
+  return gtp_finish_response();
+}
+
+
+/*****************
+ * Board status. *
+ *****************/
+
+/* Function:  Return the color at a vertex.
+ * Arguments: vertex
+ * Fails:     invalid vertex
+ * Returns:   "black", "white", or "empty"
+ */
+static int
+gtp_what_color(char *s)
+{
+  int i, j;
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+  
+  return gtp_success(color_to_string(BOARD(i, j)));
+}
+
+
+/* Function:  List vertices with either black or white stones.
+ * Arguments: color
+ * Fails:     invalid color
+ * Returns:   list of vertices
+ */
+static int
+gtp_list_stones(char *s)
+{
+  int i, j;
+  int color = EMPTY;
+  int vertexi[MAX_BOARD * MAX_BOARD];
+  int vertexj[MAX_BOARD * MAX_BOARD];
+  int vertices = 0;
+  
+  if (!gtp_decode_color(s, &color))
+    return gtp_failure("invalid color");
+
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++)
+      if (BOARD(i, j) == color) {
+       vertexi[vertices] = i;
+       vertexj[vertices++] = j;
+      }
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertices(vertices, vertexi, vertexj);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Count number of liberties for the string at a vertex.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   Number of liberties.
+ */
+static int
+gtp_countlib(char *s)
+{
+  int i, j;
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  return gtp_success("%d", countlib(POS(i, j)));
+}
+
+
+/* Function:  Return the positions of the liberties for the string at a vertex.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   Sorted space separated list of vertices.
+ */
+static int
+gtp_findlib(char *s)
+{
+  int i, j;
+  int libs[MAXLIBS];
+  int liberties;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  liberties = findlib(POS(i, j), MAXLIBS, libs);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertices2(liberties, libs);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Determine which liberties a stone of given color
+ *            will get if played at given vertex.
+ * Arguments: move (color + vertex)
+ * Fails:     invalid color, invalid vertex, occupied vertex
+ * Returns:   Sorted space separated list of liberties
+ */
+static int
+gtp_accuratelib(char *s)
+{
+  int i, j;
+  int color;
+  int libs[MAXLIBS];
+  int liberties;
+
+  if (!gtp_decode_move(s, &color, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  if (BOARD(i, j) != EMPTY)
+    return gtp_failure("vertex must be empty");
+
+  liberties = accuratelib(POS(i, j), color, MAXLIBS, libs);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertices2(liberties, libs);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Determine which liberties a stone of given color
+ *            will get if played at given vertex.
+ * Arguments: move (color + vertex)
+ * Fails:     invalid color, invalid vertex, occupied vertex
+ * Returns:   Sorted space separated list of liberties
+ *
+ * Supposedly identical in behavior to the above function and
+ * can be retired when this is confirmed.
+ */
+static int
+gtp_accurate_approxlib(char *s)
+{
+  int i, j;
+  int color;
+  int libs[MAXLIBS];
+  int liberties;
+
+  if (!gtp_decode_move(s, &color, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  if (BOARD(i, j) != EMPTY)
+    return gtp_failure("vertex must be empty");
+
+  liberties = accuratelib(POS(i, j), color, MAXLIBS, libs);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertices2(liberties, libs);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Tell whether a move is legal.
+ * Arguments: move
+ * Fails:     invalid move
+ * Returns:   1 if the move is legal, 0 if it is not.
+ */
+static int
+gtp_is_legal(char *s)
+{
+  int i, j;
+  int color;
+  
+  if (!gtp_decode_move(s, &color, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  return gtp_success("%d", is_allowed_move(POS(i, j), color));
+}
+
+
+/* Function:  List all legal moves for either color.
+ * Arguments: color
+ * Fails:     invalid color
+ * Returns:   Sorted space separated list of vertices.
+ */
+static int
+gtp_all_legal(char *s)
+{
+  int i, j;
+  int color;
+  int movei[MAX_BOARD * MAX_BOARD];
+  int movej[MAX_BOARD * MAX_BOARD];
+  int moves = 0;
+  
+  if (!gtp_decode_color(s, &color))
+    return gtp_failure("invalid color");
+
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++)
+      if (BOARD(i, j) == EMPTY && is_allowed_move(POS(i, j), color)) {
+       movei[moves] = i;
+       movej[moves++] = j;
+      }
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertices(moves, movei, movej);
+  return gtp_finish_response();
+}
+
+
+/* Function:  List the number of captures taken by either color.
+ * Arguments: color
+ * Fails:     invalid color
+ * Returns:   Number of captures.
+ */
+static int
+gtp_captures(char *s)
+{
+  int color;
+  
+  if (!gtp_decode_color(s, &color))
+    return gtp_failure("invalid color");
+
+  if (color == BLACK)
+    return gtp_success("%d", white_captured);
+  else
+    return gtp_success("%d", black_captured);
+}
+
+
+/* Function:  Return the last move.
+ * Arguments: none
+ * Fails:     no previous move known
+ * Returns:   Color and vertex of last move.
+ */
+static int
+gtp_last_move(char *s)
+{
+  int pos;
+  int color;
+  UNUSED(s);
+  
+  if (move_history_pointer <= 0)
+    return gtp_failure("no previous move known");
+  
+  pos = move_history_pos[move_history_pointer - 1];
+  color = move_history_color[move_history_pointer - 1];
+  
+  gtp_start_response(GTP_SUCCESS);
+  gtp_mprintf("%C %m", color, I(pos), J(pos));
+  return gtp_finish_response();
+}
+
+/* Function:  Print the move history in reverse order
+ * Arguments: none
+ * Fails:     never
+ * Returns:   List of moves played in reverse order in format: 
+ *            color move (one move per line)
+ */
+static int
+gtp_move_history(char *s)
+{
+  int k, pos, color;
+  UNUSED(s);
+  
+  gtp_start_response(GTP_SUCCESS);
+  if (move_history_pointer > 0)
+    for (k = move_history_pointer-1; k >= 0; k--) {
+      color = move_history_color[k];
+      pos = move_history_pos[k];
+      gtp_mprintf("%C %m\n", color, I(pos), J(pos));
+    }
+  else
+    gtp_printf("\n");
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+/* Function:  Return the rotation/reflection invariant board hash.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   Invariant hash for the board as a hexadecimal number.
+ */
+static int
+gtp_invariant_hash(char *s)
+{
+  Hash_data hash;
+  UNUSED(s);
+  hashdata_calc_orientation_invariant(&hash, board, board_ko_pos);
+  return gtp_success("%s", hashdata_to_string(&hash));
+}
+
+
+/* Function:  Return the rotation/reflection invariant board hash
+ *            obtained by playing all the possible moves for the
+ *            given color.
+ * Arguments: color
+ * Fails:     invalid color
+ * Returns:   List of moves + invariant hash as a hexadecimal number,
+ *            one pair of move + hash per line.
+ */
+static int
+gtp_invariant_hash_for_moves(char *s)
+{
+  Hash_data hash;
+  int color;
+  int pos;
+  int move_found = 0;
+  
+  if (!gtp_decode_color(s, &color))
+    return gtp_failure("invalid color");
+
+  gtp_start_response(GTP_SUCCESS);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (board[pos] == EMPTY
+       && trymove(pos, color, "gtp_invariant_hash_for_moves", NO_MOVE)) {
+      hashdata_calc_orientation_invariant(&hash, board, board_ko_pos);
+      gtp_mprintf("%m %s\n", I(pos), J(pos), hashdata_to_string(&hash));
+      popgo();
+      move_found = 1;
+    }
+  }
+
+  if (!move_found)
+    gtp_printf("\n");
+  
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+
+/**********************
+ * Retractable moves. *
+ **********************/
+
+/* Function:  Play a stone of the given color at the given vertex.
+ * Arguments: move (color + vertex)
+ * Fails:     invalid color, invalid vertex, illegal move
+ * Returns:   nothing
+ */
+static int
+gtp_trymove(char *s)
+{
+  int i, j;
+  int color;
+  if (!gtp_decode_move(s, &color, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  if (!trymove(POS(i, j), color, "gtp_trymove", NO_MOVE))
+    return gtp_failure("illegal move");
+
+  return gtp_success("");
+}
+
+/* Function:  Play a stone of the given color at the given vertex, 
+ *            allowing illegal ko capture.
+ * Arguments: move (color + vertex)
+ * Fails:     invalid color, invalid vertex, illegal move
+ * Returns:   nothing
+ */
+static int
+gtp_tryko(char *s)
+{
+  int i, j;
+  int color;
+  if (!gtp_decode_move(s, &color, &i, &j) || POS(i, j) == PASS_MOVE)
+    return gtp_failure("invalid color or coordinate");
+
+  if (!tryko(POS(i, j), color, "gtp_tryko"))
+    return gtp_failure("illegal move");
+
+  return gtp_success("");
+}
+
+
+/* Function:  Undo a trymove or tryko.
+ * Arguments: none
+ * Fails:     stack empty
+ * Returns:   nothing
+ */
+static int
+gtp_popgo(char *s)
+{
+  UNUSED(s);
+
+  if (stackp == 0)
+    return gtp_failure("Stack empty.");
+
+  popgo();
+  return gtp_success("");
+}
+
+/*********************
+ * Caching          *
+ *********************/
+
+/* Function:  clear the caches.
+ * Arguments: none.
+ * Fails:     never.
+ * Returns:   nothing.
+ */
+
+static int
+gtp_clear_cache(char *s)
+{
+  UNUSED(s);
+  clear_persistent_caches();
+  reading_cache_clear();
+  return gtp_success("");
+}
+
+/*********************
+ * Tactical reading. *
+ *********************/
+
+/* Function:  Try to attack a string.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code followed by attack point if attack code nonzero.
+ */
+static int
+gtp_attack(char *s)
+{
+  int i, j;
+  int apos;
+  int attack_code;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  attack_code = attack(POS(i, j), &apos);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(attack_code);
+  if (attack_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(apos), J(apos));
+  }
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Try to attack either of two strings
+ * Arguments: two vertices
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code against the strings.  Guarantees there
+ *            exists a move which will attack one of the two
+ *            with attack_code, but does not return the move.
+ */
+static int
+gtp_attack_either(char *s)
+{
+  int ai, aj;
+  int bi, bj;
+  int n;
+  int acode;
+
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ai, aj) == EMPTY)
+    return gtp_failure("string vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &bi, &bj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(bi, bj) == EMPTY)
+    return gtp_failure("string vertex must not be empty");
+
+  acode = attack_either(POS(ai, aj), POS(bi, bj));
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(acode);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Try to defend a string.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   defense code followed by defense point if defense code nonzero.
+ */
+static int
+gtp_defend(char *s)
+{
+  int i, j;
+  int dpos;
+  int defend_code;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  defend_code = find_defense(POS(i, j), &dpos);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(defend_code);
+  if (defend_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(dpos), J(dpos));
+  }
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Examine whether a specific move attacks a string tactically.
+ * Arguments: vertex (move), vertex (dragon)
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code
+ */
+static int
+gtp_does_attack(char *s)
+{
+  int i, j;
+  int ti, tj;
+  int attack_code;
+  int n;
+
+  n = gtp_decode_coord(s, &ti, &tj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ti, tj) != EMPTY)
+    return gtp_failure("move vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("string vertex must not be empty");
+
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  attack_code = does_attack(POS(ti, tj), POS(i, j));
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(attack_code);
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Examine whether a specific move defends a string tactically.
+ * Arguments: vertex (move), vertex (dragon)
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code
+ */
+static int
+gtp_does_defend(char *s)
+{
+  int i, j;
+  int ti, tj;
+  int defense_code;
+  int n;
+
+  n = gtp_decode_coord(s, &ti, &tj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ti, tj) != EMPTY)
+    return gtp_failure("move vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("string vertex must not be empty");
+
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  defense_code = does_defend(POS(ti, tj), POS(i, j));
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(defense_code);
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Try to attack a string strictly in a ladder.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code followed by attack point if attack code nonzero.
+ */
+static int
+gtp_ladder_attack(char *s)
+{
+  int i, j;
+  int apos;
+  int attack_code;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  if (countlib(POS(i, j)) != 2)
+    return gtp_failure("string must have exactly 2 liberties");
+
+  attack_code = simple_ladder(POS(i, j), &apos);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(attack_code);
+  if (attack_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(apos), J(apos));
+  }
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Increase depth values by one.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_increase_depths(char *s)
+{
+  UNUSED(s);
+  increase_depth_values();
+  return gtp_success("");
+}  
+
+
+/* Function:  Decrease depth values by one.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_decrease_depths(char *s)
+{
+  UNUSED(s);
+  decrease_depth_values();
+  return gtp_success("");
+}  
+
+
+/******************
+ * owl reading. *
+ ******************/
+
+/* Function:  Try to attack a dragon.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code followed by attack point if attack code nonzero.
+ */
+static int
+gtp_owl_attack(char *s)
+{
+  int i, j;
+  int attack_point;
+  int attack_code;
+  int result_certain;
+  int kworm;
+
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  attack_code = owl_attack(POS(i, j), &attack_point, &result_certain, &kworm);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(attack_code);
+  if (attack_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(attack_point), J(attack_point));
+  }
+  if (!result_certain && report_uncertainty)
+    gtp_printf(" uncertain");
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Try to defend a dragon.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   defense code followed by defense point if defense code nonzero.
+ */
+static int
+gtp_owl_defend(char *s)
+{
+  int i, j;
+  int defense_point;
+  int defend_code;
+  int result_certain;
+  int kworm;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+
+  defend_code = owl_defend(POS(i, j), &defense_point, &result_certain, &kworm);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(defend_code);
+  if (defend_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(defense_point), J(defense_point));
+  }
+  if (!result_certain && report_uncertainty)
+    gtp_printf(" uncertain");
+  return gtp_finish_response();
+}  
+
+/* Function:  Try to attack a dragon in 2 moves.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code followed by the two attack points if
+ *            attack code nonzero.
+ */
+static int
+gtp_owl_threaten_attack(char *s)
+{
+  int i, j;
+  int attack_point1;
+  int attack_point2;
+  int attack_code;
+
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  attack_code = owl_threaten_attack(POS(i, j), &attack_point1, &attack_point2);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(attack_code);
+  if (attack_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(attack_point1), J(attack_point1));
+    gtp_printf(" ");
+    gtp_print_vertex(I(attack_point2), J(attack_point2));
+  }
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Try to defend a dragon with 2 moves.
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   defense code followed by the 2 defense points if
+ *            defense code nonzero.
+ */
+static int
+gtp_owl_threaten_defense(char *s)
+{
+  int i, j;
+  int defense_point1;
+  int defense_point2;
+  int defend_code;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+
+  defend_code = owl_threaten_defense(POS(i, j), &defense_point1,
+                                    &defense_point2);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(defend_code);
+  if (defend_code > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(defense_point1), J(defense_point1));
+    gtp_printf(" ");
+    gtp_print_vertex(I(defense_point2), J(defense_point2));
+  }
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Examine whether a specific move attacks a dragon.
+ * Arguments: vertex (move), vertex (dragon)
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   attack code
+ */
+static int
+gtp_owl_does_attack(char *s)
+{
+  int i, j;
+  int ti, tj;
+  int attack_code;
+  int kworm;
+  int n;
+
+  n = gtp_decode_coord(s, &ti, &tj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ti, tj) != EMPTY)
+    return gtp_failure("move vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("dragon vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  attack_code = owl_does_attack(POS(ti, tj), POS(i, j), &kworm);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(attack_code);
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Examine whether a specific move defends a dragon.
+ * Arguments: vertex (move), vertex (dragon)
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   defense code
+ */
+static int
+gtp_owl_does_defend(char *s)
+{
+  int i, j;
+  int ti, tj;
+  int defense_code;
+  int kworm;
+  int n;
+
+  n = gtp_decode_coord(s, &ti, &tj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ti, tj) != EMPTY)
+    return gtp_failure("move vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("dragon vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  defense_code = owl_does_defend(POS(ti, tj), POS(i, j), &kworm);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(defense_code);
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Examine whether a connection defends involved dragons.
+ * Arguments: vertex (move), vertex (dragon1), vertex (dragon2)
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   defense code
+ */
+static int
+gtp_owl_connection_defends(char *s)
+{
+  int ai, aj;
+  int bi, bj;
+  int ti, tj;
+  int defense_code;
+  int n;
+
+  n = gtp_decode_coord(s, &ti, &tj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ti, tj) != EMPTY)
+    return gtp_failure("move vertex must be empty");
+
+  s += n;
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  s += n;
+  n = gtp_decode_coord(s, &bi, &bj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ai, aj) == EMPTY || BOARD(bi, bj) == EMPTY)
+    return gtp_failure("dragon vertex must not be empty");
+
+  if (BOARD(ai, aj) != BOARD(bi, bj))
+    return gtp_failure("dragon vertices must have the same color");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+  
+  defense_code = owl_connection_defends(POS(ti, tj), POS(ai, aj), POS(bi, bj));
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(defense_code);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Try to defend both of two strings
+ * Arguments: two vertices
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   defend code for the strings.  Guarantees there
+ *            exists a move which will defend both of the two
+ *            with defend_code, but does not return the move.
+ */
+static int
+gtp_defend_both(char *s)
+{
+  int ai, aj;
+  int bi, bj;
+  int n;
+  int dcode;
+
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ai, aj) == EMPTY)
+    return gtp_failure("string vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &bi, &bj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(bi, bj) == EMPTY)
+    return gtp_failure("string vertex must not be empty");
+
+  dcode = defend_both(POS(ai, aj), POS(bi, bj));
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(dcode);
+  return gtp_finish_response();
+}
+
+
+
+/* Function:  Determine whether capturing a string gives a living dragon
+ * Arguments: vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   1 if dragon can live, 0 otherwise
+ */
+static int
+gtp_owl_substantial(char *s)
+{
+  int i, j;
+  int result;
+  
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+
+  result = owl_substantial(POS(i, j));
+  return gtp_success("%d", result);
+}  
+
+
+/* Function:  Analyze a semeai
+ * Arguments: dragona, dragonb
+ * Fails:     invalid vertices, empty vertices
+ * Returns:   semeai defense result, semeai attack result, semeai move
+ */
+static int
+gtp_analyze_semeai(char *s)
+{
+  int i, j;
+  int k;
+  int dragona, dragonb;
+  int resulta, resultb, move, result_certain;
+  
+  k = gtp_decode_coord(s, &i, &j);
+
+  if (k == 0)
+    return gtp_failure("invalid coordinate");
+  dragona = POS(i, j);
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  if (!gtp_decode_coord(s+k, &i, &j))
+    return gtp_failure("invalid coordinate");
+  dragonb = POS(i, j);
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+
+  owl_analyze_semeai(dragona, dragonb, &resulta, &resultb, &move, 1,
+                    &result_certain);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(resulta);
+  gtp_printf(" ");
+  gtp_print_code(resultb);
+  gtp_mprintf(" %m", I(move), J(move));
+  if (!result_certain && report_uncertainty)
+    gtp_printf(" uncertain");
+
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Analyze a semeai after a move have been made.
+ * Arguments: color, vertex, dragona, dragonb
+ * Fails:     invalid vertices
+ * Returns:   semeai defense result, semeai attack result, semeai move
+ */
+static int
+gtp_analyze_semeai_after_move(char *s)
+{
+  int i, j;
+  int color;
+  int move;
+  int k;
+  int dragona, dragonb;
+  int resulta, resultb, semeai_move, result_certain;
+  
+  k = gtp_decode_move(s, &color, &i, &j);
+  move = POS(i, j);
+  if (k == 0 || move == NO_MOVE)
+    return gtp_failure("invalid color or coordinate");
+  if (board[move] != EMPTY)
+    return gtp_failure("move vertex is not empty");
+  s += k;
+  
+  k = gtp_decode_coord(s, &i, &j);
+  if (k == 0)
+    return gtp_failure("invalid coordinate");
+  dragona = POS(i, j);
+  if (board[dragona] == EMPTY)
+    return gtp_failure("dragon vertex must not be empty");
+  s += k;
+
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+  dragonb = POS(i, j);
+  if (board[dragonb] == EMPTY)
+    return gtp_failure("dragon vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+
+  owl_analyze_semeai_after_move(move, color, dragona, dragonb,
+                               &resulta, &resultb, &semeai_move, 1,
+                               &result_certain, 0);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(resulta);
+  gtp_printf(" ");
+  gtp_print_code(resultb);
+  gtp_mprintf(" %m", I(semeai_move), J(semeai_move));
+  if (!result_certain && report_uncertainty)
+    gtp_printf(" uncertain");
+
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Analyze a semeai, not using owl
+ * Arguments: dragona, dragonb
+ * Fails:     invalid vertices, empty vertices
+ * Returns:   status of dragona, dragonb assuming dragona moves first
+ */
+static int
+gtp_tactical_analyze_semeai(char *s)
+{
+  int i, j;
+  int k;
+  int dragona, dragonb;
+  int resulta, resultb, move, result_certain;
+  
+  k = gtp_decode_coord(s, &i, &j);
+
+  if (k == 0)
+    return gtp_failure("invalid coordinate");
+  dragona = POS(i, j);
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  if (!gtp_decode_coord(s+k, &i, &j))
+    return gtp_failure("invalid coordinate");
+  dragonb = POS(i, j);
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  /* to get the variations into the sgf file, clear the reading cache */
+  if (sgf_dumptree)
+    reading_cache_clear();
+
+  owl_analyze_semeai(dragona, dragonb, &resulta, &resultb, &move, 0,
+                     &result_certain);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(resulta);
+  gtp_printf(" ");
+  gtp_print_code(resultb);
+  gtp_mprintf(" %m", I(move), J(move));
+  if (!result_certain && report_uncertainty)
+    gtp_printf(" uncertain");
+
+  return gtp_finish_response();
+}  
+
+
+/***********************
+ * Connection reading. *
+ ***********************/
+
+/* Function:  Try to connect two strings.
+ * Arguments: vertex, vertex
+ * Fails:     invalid vertex, empty vertex, vertices of different colors
+ * Returns:   connect result followed by connect point if successful.
+ */
+static int
+gtp_connect(char *s)
+{
+  int ai, aj;
+  int bi, bj;
+  int connect_move = PASS_MOVE;
+  int result;
+  int n;
+  
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (!gtp_decode_coord(s + n, &bi, &bj))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ai, aj) == EMPTY || BOARD(bi, bj) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  if (BOARD(ai, aj) != BOARD(bi, bj))
+    return gtp_failure("vertices must have same color");
+
+  result = string_connect(POS(ai, aj), POS(bi, bj), &connect_move);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(result);
+  if (result != 0)
+    gtp_mprintf(" %m", I(connect_move), J(connect_move));
+
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Try to disconnect two strings.
+ * Arguments: vertex, vertex
+ * Fails:     invalid vertex, empty vertex, vertices of different colors
+ * Returns:   disconnect result followed by disconnect point if successful.
+ */
+static int
+gtp_disconnect(char *s)
+{
+  int ai, aj;
+  int bi, bj;
+  int disconnect_move = PASS_MOVE;
+  int result;
+  int n;
+  
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (!gtp_decode_coord(s + n, &bi, &bj))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ai, aj) == EMPTY || BOARD(bi, bj) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  if (BOARD(ai, aj) != BOARD(bi, bj))
+    return gtp_failure("vertices must have same color");
+
+  result = disconnect(POS(ai, aj), POS(bi, bj), &disconnect_move);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(result);
+  if (result != 0)
+    gtp_mprintf(" %m", I(disconnect_move), J(disconnect_move));
+
+  return gtp_finish_response();
+}  
+
+
+/* Function:  Try to break from string into area.
+ * Arguments: vertex, vertices
+ * Fails:     invalid vertex, empty vertex.
+ * Returns:   result followed by break in point if successful.
+ */
+static int
+gtp_break_in(char *s)
+{
+  int ai, aj;
+  int i, j;
+  signed char goal[BOARDMAX];
+  int break_move = PASS_MOVE;
+  int result;
+  int n;
+  int k;
+  
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  memset(goal, 0, BOARDMAX);
+  s += n;
+
+  for (k = 0; k < MAX_BOARD * MAX_BOARD; k++) {
+    n = gtp_decode_coord(s, &i, &j);
+    if (n > 0) {
+      goal[POS(i, j)] = 1;
+      s += n;
+    }
+    else if (sscanf(s, "%*s") != EOF)
+      return gtp_failure("invalid coordinate");
+    else
+      break;
+  }
+
+  if (BOARD(ai, aj) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  result = break_in(POS(ai, aj), goal, &break_move);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(result);
+  if (result != 0)
+    gtp_mprintf(" %m", I(break_move), J(break_move));
+
+  return gtp_finish_response();
+}
+
+/* Function:  Try to block string from area.
+ * Arguments: vertex, vertices
+ * Fails:     invalid vertex, empty vertex.
+ * Returns:   result followed by block point if successful.
+ */
+static int
+gtp_block_off(char *s)
+{
+  int ai, aj;
+  int i, j;
+  signed char goal[BOARDMAX];
+  int block_move = PASS_MOVE;
+  int result;
+  int n;
+  int k;
+  
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  memset(goal, 0, BOARDMAX);
+  s += n;
+
+  for (k = 0; k < MAX_BOARD * MAX_BOARD; k++) {
+    n = gtp_decode_coord(s, &i, &j);
+    if (n > 0) {
+      goal[POS(i, j)] = 1;
+      s += n;
+    }
+    else if (sscanf(s, "%*s") != EOF)
+      return gtp_failure("invalid coordinate");
+    else
+      break;
+  }
+
+  if (BOARD(ai, aj) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  result = block_off(POS(ai, aj), goal, &block_move);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_code(result);
+  if (result != 0)
+    gtp_mprintf(" %m", I(block_move), J(block_move));
+
+  return gtp_finish_response();
+}
+
+
+
+/********
+ * eyes *
+ ********/
+
+/* Function:  Evaluate an eye space
+ * Arguments: vertex
+ * Fails:     invalid vertex
+ * Returns:   Minimum and maximum number of eyes. If these differ an
+ *            attack and a defense point are additionally returned.
+ *            If the vertex is not an eye space or not of unique color,
+ *            a single -1 is returned.
+ */
+
+static int
+gtp_eval_eye(char *s)
+{
+  int m, n;
+  struct eyevalue value;
+  int attack_point;
+  int defense_point;
+  int pos;
+
+  if (!gtp_decode_coord(s, &m, &n))
+    return gtp_failure("invalid coordinate");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  if (black_eye[POS(m, n)].color == BLACK) {
+    pos = black_eye[POS(m, n)].origin;
+    compute_eyes(pos, &value, &attack_point, &defense_point,
+                black_eye, half_eye, 0);
+  }
+  else if (white_eye[POS(m, n)].color == WHITE) {
+    pos = white_eye[POS(m, n)].origin;
+    compute_eyes(pos, &value, &attack_point, &defense_point,
+                white_eye, half_eye, 0);
+  }
+  else
+    /* Not an eye or not of unique color. */
+    return gtp_success("-1");
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_printf("%d %d", min_eyes(&value), max_eyes(&value));
+  if (eye_move_urgency(&value) > 0) {
+    gtp_printf(" ");
+    gtp_print_vertex(I(attack_point), J(attack_point));
+    gtp_printf(" ");
+    gtp_print_vertex(I(defense_point), J(defense_point));
+  }
+  return gtp_finish_response();
+}
+
+
+/*****************
+ * dragon status *
+ *****************/
+
+/* Function:  Determine status of a dragon.
+ * Arguments: optional vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   status ("alive", "critical", "dead", or "unknown"),
+ *            attack point, defense point. Points of attack and
+ *            defense are only given if the status is critical.
+ *            If no vertex is given, the status is listed for all
+ *            dragons, one per row in the format "A4: alive".
+ *
+ * FIXME: Should be able to distinguish between life in seki
+ *        and independent life. Should also be able to identify ko.
+ */
+
+static int
+gtp_dragon_status(char *s)
+{
+  int i, j;
+  int str = NO_MOVE;
+  int pos;
+  int empty_response = 1;
+
+  if (gtp_decode_coord(s, &i, &j)) {
+    str = POS(i, j);
+    if (board[str] == EMPTY)
+      return gtp_failure("vertex must not be empty");
+  }
+  else if (sscanf(s, "%*s") != EOF)
+    return gtp_failure("invalid coordinate");
+
+  silent_examine_position(EXAMINE_DRAGONS);
+  
+  gtp_start_response(GTP_SUCCESS);
+
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos)
+       && (pos == str
+           || (str == NO_MOVE
+               && board[pos] != EMPTY
+               && dragon[pos].origin == pos))) {
+      if (str == NO_MOVE)
+       gtp_mprintf("%m: ", I(pos), J(pos));
+      
+      if (dragon[pos].status == ALIVE)
+       gtp_printf("alive\n");
+      else if (dragon[pos].status == DEAD)
+       gtp_printf("dead\n");
+      else if (dragon[pos].status == UNKNOWN)
+       gtp_printf("unknown\n");
+      else {
+       /* Only remaining possibility. */
+       assert(dragon[pos].status == CRITICAL); 
+       /* Status critical, need to return attack and defense point as well. */
+       gtp_mprintf("critical %m %m\n", 
+                   I(DRAGON2(pos).owl_attack_point),
+                   J(DRAGON2(pos).owl_attack_point),
+                   I(DRAGON2(pos).owl_defense_point),
+                   J(DRAGON2(pos).owl_defense_point));
+      }
+      empty_response = 0;
+    }
+  }
+
+  if (empty_response)
+    gtp_printf("\n");
+
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+/* Function:  Determine whether two stones belong to the same dragon.
+ * Arguments: vertex, vertex
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   1 if the vertices belong to the same dragon, 0 otherwise
+ */
+
+static int
+gtp_same_dragon(char *s)
+{
+  int ai, aj;
+  int bi, bj;
+  int n;
+
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (!gtp_decode_coord(s + n, &bi, &bj))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(ai, aj) == EMPTY || BOARD(bi, bj) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+  
+  return gtp_success("%d", dragon[POS(ai, aj)].id == dragon[POS(bi, bj)].id);
+}
+
+
+/************************
+ * Unconditional status *
+ ************************/
+
+/* Function:  Determine the unconditional status of a vertex.
+ * Arguments: vertex
+ * Fails:     invalid vertex
+ * Returns:   unconditional status ("undecided", "alive", "dead",
+ *            "white_territory", "black_territory"). Occupied vertices can
+ *            be undecided, alive, or dead. Empty vertices can be
+ *            undecided, white territory, or black territory.
+ */
+
+static int
+gtp_unconditional_status(char *s)
+{
+  int i, j;
+  enum dragon_status status;
+
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  silent_examine_position(EXAMINE_WORMS);
+  
+  status = worm[POS(i, j)].unconditional_status;
+  if (status == UNKNOWN)
+    return gtp_success("undecided");
+  return gtp_success("%s", status_to_string(status));
+}
+
+
+/***********************
+ * combination attacks *
+ ***********************/
+
+/* Function:  Find a move by color capturing something through a
+ *            combination attack.
+ * Arguments: color
+ * Fails:     invalid color
+ * Returns:   Recommended move, PASS if no move found
+ */
+
+static int
+gtp_combination_attack(char *s)
+{
+  int color;
+  int attack_point;
+  int n;
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  silent_examine_position(EXAMINE_ALL);
+
+  if (!atari_atari(color, &attack_point, NULL, verbose))
+    attack_point = NO_MOVE;
+  
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(attack_point), J(attack_point));
+  return gtp_finish_response();
+}
+
+/* Function:  If color can capture something through a
+ *            combination attack, list moves by the opponent of color
+ *            to defend against this attack.
+ * Arguments: color
+ * Fails:     invalid color
+ * Returns:   Recommended moves, PASS if no combination attack found.
+ */
+
+static int
+gtp_combination_defend(char *s)
+{
+  int color;
+  signed char defense_points[BOARDMAX];
+  int pos;
+  int first = 1;
+  int n;
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  silent_examine_position(EXAMINE_ALL);
+
+  memset(defense_points, 0, sizeof(defense_points));
+  if (!atari_atari(color, NULL, defense_points, verbose))
+    return gtp_success("PASS");
+  
+  gtp_start_response(GTP_SUCCESS);
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++)
+    if (ON_BOARD(pos) && defense_points[pos]) {
+      if (!first)
+       gtp_printf(" ");
+      else
+       first = 0;
+      gtp_print_vertex(I(pos), J(pos));
+    }
+  
+  return gtp_finish_response();
+}
+
+/* Function:  Run atari_atari_confirm_safety().
+ * Arguments: move, optional int
+ * Fails:     invalid move
+ * Returns:   success code, if failure also defending move
+ */
+
+static int
+gtp_aa_confirm_safety(char *s)
+{
+  int color;
+  int i, j;
+  int n;
+  int minsize = 0;
+  int result;
+  int defense_point = NO_MOVE;
+  signed char saved_dragons[BOARDMAX];
+  signed char saved_worms[BOARDMAX];
+
+  n = gtp_decode_move(s, &color, &i, &j);
+  if (n == 0 || POS(i, j) == NO_MOVE)
+    return gtp_failure("invalid color or coordinate");
+
+  sscanf(s + n, "%d", &minsize);
+
+  genmove(color, NULL, NULL);
+  get_saved_dragons(POS(i, j), saved_dragons);
+  get_saved_worms(POS(i, j), saved_worms);
+  
+  result = atari_atari_confirm_safety(color, POS(i, j),
+                                     &defense_point, minsize,
+                                     saved_dragons, saved_worms);
+  
+  gtp_start_response(GTP_SUCCESS);
+  gtp_mprintf("%d", result);
+  if (result == 0)
+    gtp_mprintf(" %m", I(defense_point), J(defense_point));
+  
+  return gtp_finish_response();
+}
+
+
+/********************
+ * generating moves *
+ ********************/
+
+/* Function:  Generate and play the supposedly best black move.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   a move coordinate or "PASS"
+ *
+ * Status:    Obsolete GTP version 1 command.
+ */
+static int
+gtp_genmove_black(char *s)
+{
+  int move;
+  UNUSED(s);
+
+  if (stackp > 0)
+    return gtp_failure("genmove cannot be called when stackp > 0");
+
+  move = genmove(BLACK, NULL, NULL);
+
+  gnugo_play_move(move, BLACK);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+/* Function:  Generate and play the supposedly best white move.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   a move coordinate or "PASS"
+ *
+ * Status:    Obsolete GTP version 1 command.
+ */
+static int
+gtp_genmove_white(char *s)
+{
+  int move;
+  UNUSED(s);
+
+  if (stackp > 0)
+    return gtp_failure("genmove cannot be called when stackp > 0");
+
+  move = genmove(WHITE, NULL, NULL);
+
+  gnugo_play_move(move, WHITE);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+/* Function:  Generate and play the supposedly best move for either color.
+ * Arguments: color to move
+ * Fails:     invalid color
+ * Returns:   a move coordinate or "PASS" (or "resign" if resignation_allowed)
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_genmove(char *s)
+{
+  int move;
+  int resign;
+  int color;
+  int n;
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  if (stackp > 0)
+    return gtp_failure("genmove cannot be called when stackp > 0");
+
+  adjust_level_offset(color);
+  move = genmove(color, NULL, &resign);
+
+  if (resign)
+    return gtp_success("resign");
+
+  gnugo_play_move(move, color);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+
+/* Function:  Generate the supposedly best move for either color.
+ * Arguments: color to move
+ * Fails:     invalid color
+ * Returns:   a move coordinate (or "PASS")
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_reg_genmove(char *s)
+{
+  int move;
+  int color;
+  int n;
+  unsigned int saved_random_seed = get_random_seed();
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  if (stackp > 0)
+    return gtp_failure("genmove cannot be called when stackp > 0");
+
+  /* This is intended for regression purposes and should therefore be
+   * deterministic. The best way to ensure this is to reset the random
+   * number generator before calling genmove(). It is always seeded by
+   * 0.
+   */
+  set_random_seed(0);
+  
+  move = genmove_conservative(color, NULL);
+
+  set_random_seed(saved_random_seed);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+/* Function:  Generate the supposedly best move for either color.
+ * Arguments: color to move, optionally a random seed
+ * Fails:     invalid color
+ * Returns:   a move coordinate (or "PASS")
+ *
+ * This differs from reg_genmove in the optional random seed.
+ */
+static int
+gtp_gg_genmove(char *s)
+{
+  int move;
+  int color;
+  int n;
+  unsigned int saved_random_seed = get_random_seed();
+  unsigned int seed;
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  if (stackp > 0)
+    return gtp_failure("genmove cannot be called when stackp > 0");
+
+  /* This is intended for regression purposes and should therefore be
+   * deterministic. The best way to ensure this is to reset the random
+   * number generator before calling genmove(). By default it is
+   * seeded with 0, but if an optional unsigned integer is given in
+   * the command after the color, this is used as seed instead.
+   */
+  seed = 0;
+  sscanf(s+n, "%u", &seed);
+  set_random_seed(seed);
+  
+  move = genmove_conservative(color, NULL);
+  set_random_seed(saved_random_seed);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+
+/* Function:  Generate the supposedly best move for either color from a
+ *            choice of allowed vertices.
+ * Arguments: color to move, allowed vertices
+ * Fails:     invalid color, invalid vertex, no vertex listed
+ * Returns:   a move coordinate (or "PASS")
+ */
+static int
+gtp_restricted_genmove(char *s)
+{
+  int move;
+  int i, j;
+  int color;
+  int n;
+  unsigned int saved_random_seed = get_random_seed();
+  int allowed_moves[BOARDMAX];
+  int number_allowed_moves = 0;
+  memset(allowed_moves, 0, sizeof(allowed_moves));
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  s += n;
+  while (1) {
+    n = gtp_decode_coord(s, &i, &j);
+    if (n > 0) {
+      allowed_moves[POS(i, j)] = 1;
+      number_allowed_moves++;
+      s += n;
+    }
+    else if (sscanf(s, "%*s") != EOF)
+      return gtp_failure("invalid coordinate");
+    else
+      break;
+  }
+
+  if (number_allowed_moves == 0)
+    return gtp_failure("no allowed vertex");
+
+  if (stackp > 0)
+    return gtp_failure("genmove cannot be called when stackp > 0");
+
+  /* This is intended for regression purposes and should therefore be
+   * deterministic. The best way to ensure this is to reset the random
+   * number generator before calling genmove(). It is always seeded by
+   * 0.
+   */
+  set_random_seed(0);
+  
+  move = genmove_restricted(color, allowed_moves);
+  set_random_seed(saved_random_seed);
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+
+/* Function:  Generate and play the supposedly best move for either color,
+ *            not passing until all dead opponent stones have been removed.
+ * Arguments: color to move
+ * Fails:     invalid color
+ * Returns:   a move coordinate (or "PASS")
+ *
+ * Status:    KGS specific command.
+ *
+ * A similar command, but possibly somewhat different, will likely be added
+ * to GTP version 3 at a later time.
+ */
+static int
+gtp_kgs_genmove_cleanup(char *s)
+{
+  int move;
+  int color;
+  int n;
+  int save_capture_all_dead = capture_all_dead;
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+
+  if (stackp > 0)
+    return gtp_failure("kgs-genmove_cleanup cannot be called when stackp > 0");
+
+  /* Turn on the capture_all_dead option to force removal of dead
+   * opponent stones.
+   */
+  capture_all_dead = 1;
+  
+  adjust_level_offset(color);
+  move = genmove(color, NULL, NULL);
+
+  capture_all_dead = save_capture_all_dead;
+  
+  gnugo_play_move(move, color);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_print_vertex(I(move), J(move));
+  return gtp_finish_response();
+}
+
+
+/* Function : List the move reasons for a move.
+ * Arguments: vertex
+ * Fails:   : invalid vertex, occupied vertex
+ * Returns  : list of move reasons (may be empty)
+ */
+
+static int
+gtp_move_reasons(char *s)
+{
+  int i, j;
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) != EMPTY)
+    return gtp_failure("vertex must not be occupied");
+
+  gtp_start_response(GTP_SUCCESS);
+  if (list_move_reasons(gtp_output_file, POS(i, j)) == 0)
+    gtp_printf("\n");
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+/* Function : Generate a list of all moves with values larger than zero in
+ *            the previous genmove command.
+ *            If no previous genmove command has been issued, the result
+ *            of this command will be meaningless.
+ * Arguments: none
+ * Fails:   : never
+ * Returns  : list of moves with values
+ */
+
+static int
+gtp_all_move_values(char *s)
+{
+  UNUSED(s);
+  gtp_start_response(GTP_SUCCESS);
+  print_all_move_values(gtp_output_file);
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+/* Function : Generate a sorted list of the best moves in the previous genmove
+ *            command.
+ *            If no previous genmove command has been issued, the result
+ *            of this command will be meaningless.
+ * Arguments: none
+ * Fails:   : never
+ * Returns  : list of moves with weights
+ */
+
+/* FIXME: Don't we want the moves one per row? */
+static int
+gtp_top_moves(char *s)
+{
+  int k;
+  UNUSED(s);
+  gtp_start_response(GTP_SUCCESS);
+  for (k = 0; k < 10; k++)
+    if (best_move_values[k] > 0.0) {
+      gtp_print_vertex(I(best_moves[k]), J(best_moves[k]));
+      gtp_printf(" %.2f ", best_move_values[k]);
+    }
+  gtp_printf("\n\n");
+  return GTP_OK;
+}
+
+/* Function : Generate a list of the best moves for white with weights
+ * Arguments: none
+ * Fails:   : never
+ * Returns  : list of moves with weights
+ */
+
+static int
+gtp_top_moves_white(char *s)
+{
+  int k;
+  UNUSED(s);
+  genmove(WHITE, NULL, NULL);
+  gtp_start_response(GTP_SUCCESS);
+  for (k = 0; k < 10; k++)
+    if (best_move_values[k] > 0.0) {
+      gtp_print_vertex(I(best_moves[k]), J(best_moves[k]));
+      gtp_printf(" %.2f ", best_move_values[k]);
+    }
+  return gtp_finish_response();
+}
+
+/* Function : Generate a list of the best moves for black with weights
+ * Arguments: none
+ * Fails:   : never
+ * Returns  : list of moves with weights
+ */
+
+static int
+gtp_top_moves_black(char *s)
+{
+  int k;
+  UNUSED(s);
+  genmove(BLACK, NULL, NULL);
+  gtp_start_response(GTP_SUCCESS);
+  for (k = 0; k < 10; k++)
+    if (best_move_values[k] > 0.0) {
+      gtp_print_vertex(I(best_moves[k]), J(best_moves[k]));
+      gtp_printf(" %.2f ", best_move_values[k]);
+    }
+  return gtp_finish_response();
+}
+
+
+
+/* Function:  Set the playing level.
+ * Arguments: int
+ * Fails:     incorrect argument
+ * Returns:   nothing
+ */
+static int
+gtp_set_level(char *s)
+{
+  int new_level;
+  if (sscanf(s, "%d", &new_level) < 1)
+    return gtp_failure("level not an integer");
+  
+  set_level(new_level);
+  return gtp_success("");
+}
+
+/* Function:  Undo one move
+ * Arguments: none
+ * Fails:     If move history is too short.
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+
+static int
+gtp_undo(char *s)
+{
+  UNUSED(s);
+
+  if (stackp > 0 || !undo_move(1))
+    return gtp_failure("cannot undo");
+
+  reset_engine();
+  
+  return gtp_success("");
+}
+
+
+/* Function:  Undo a number of moves
+ * Arguments: optional int
+ * Fails:     If move history is too short.
+ * Returns:   nothing
+ */
+
+static int
+gtp_gg_undo(char *s)
+{
+  int number_moves = 1;
+
+  sscanf(s, "%d", &number_moves);
+
+  if (number_moves < 0)
+    return gtp_failure("can't undo a negative number of moves");
+
+  if (stackp > 0 || !undo_move(number_moves))
+    return gtp_failure("cannot undo");
+
+  reset_engine();
+  
+  return gtp_success("");
+}
+
+
+/*****************
+ * time handling *
+ *****************/
+
+/* Function:  Set time allowance
+ * Arguments: int main_time, int byo_yomi_time, int byo_yomi_stones
+ * Fails:     syntax error
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+
+static int
+gtp_time_settings(char *s)
+{
+  int main_time, byoyomi_time, byoyomi_stones;
+  
+  if (sscanf(s, "%d %d %d", &main_time, &byoyomi_time, &byoyomi_stones) < 3)
+    return gtp_failure("not three integers");
+
+  clock_settings(main_time, byoyomi_time, byoyomi_stones);
+  return gtp_success("");
+}
+
+
+/* Function:  Report remaining time
+ * Arguments: color color, int time, int stones
+ * Fails:     syntax error
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+
+static int
+gtp_time_left(char *s)
+{
+  int color;
+  int time;
+  int stones;
+  int n;
+
+  n = gtp_decode_color(s, &color);
+  if (!n)
+    return gtp_failure("invalid color");
+  
+  if (sscanf(s+n, "%d %d", &time, &stones) < 2)
+    return gtp_failure("time and stones not two integers");
+
+  update_time_left(color, time, stones);
+  
+  return gtp_success("");
+}
+
+
+/***********
+ * scoring *
+ ***********/
+
+static float final_score;
+static enum dragon_status final_status[MAX_BOARD][MAX_BOARD];
+static enum dragon_status status_numbers[6] = {ALIVE, DEAD, ALIVE_IN_SEKI,
+                                              WHITE_TERRITORY,
+                                              BLACK_TERRITORY, DAME};
+static const char *status_names[6] = {"alive", "dead", "seki",
+                                     "white_territory", "black_territory",
+                                     "dame"};
+
+/* Helper function. */
+static void
+finish_and_score_game(int seed)
+{
+  int move;
+  int i, j;
+  int next;
+  int pass = 0;
+  int moves = 0;
+  int saved_board[MAX_BOARD][MAX_BOARD];
+  struct board_state saved_pos;
+  static int current_board[MAX_BOARD][MAX_BOARD];
+  static int current_seed = -1;
+  int cached_board = 1;
+
+  if (current_seed != seed) {
+    current_seed = seed;
+    cached_board = 0;
+  }
+
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++)
+      if (BOARD(i, j) != current_board[i][j]) {
+       current_board[i][j] = BOARD(i, j);
+       cached_board = 0;
+      }
+
+  /* If this is exactly the same position as the one we analyzed the
+   * last time, the contents of final_score and final_status are up to date.
+   */
+  if (cached_board)
+    return;
+
+  doing_scoring = 1;
+  store_board(&saved_pos);
+
+  /* Let black start if we have no move history. Otherwise continue
+   * alternation.
+   */
+  if (get_last_player() == EMPTY)
+    next = BLACK;
+  else
+    next = OTHER_COLOR(get_last_player());
+
+  do {
+    move = genmove_conservative(next, NULL);
+    gnugo_play_move(move, next);
+    if (move != PASS_MOVE) {
+      pass = 0;
+      moves++;
+    }
+    else
+      pass++;
+
+    next = OTHER_COLOR(next);
+  } while (pass < 2 && moves < board_size * board_size);
+
+  final_score = aftermath_compute_score(next, NULL);
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++) {
+      final_status[i][j] = aftermath_final_status(next, POS(i, j));
+      saved_board[i][j] = BOARD(i, j);
+    }
+
+  restore_board(&saved_pos);
+  doing_scoring = 0;
+
+  /* Update the status for vertices which were changed while finishing
+   * the game, up to filling dame.
+   */
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++) {
+      if (BOARD(i, j) == saved_board[i][j])
+       continue;
+
+      if (BOARD(i, j) == EMPTY) {
+       if (final_status[i][j] == ALIVE
+           || final_status[i][j] == ALIVE_IN_SEKI)
+         final_status[i][j] = DAME;
+       else if (final_status[i][j] == DEAD) {
+         if (saved_board[i][j] == BLACK)
+           final_status[i][j] = WHITE_TERRITORY;
+         else
+           final_status[i][j] = BLACK_TERRITORY;
+       }
+      }
+      else if (BOARD(i, j) == BLACK) {
+       if (final_status[i][j] == WHITE_TERRITORY)
+         final_status[i][j] = DEAD;
+       else if (final_status[i][j] == DAME)
+         final_status[i][j] = ALIVE_IN_SEKI;
+       else if (final_status[i][j] == BLACK_TERRITORY)
+         final_status[i][j] = ALIVE;
+       else
+         final_status[i][j] = DEAD;
+      }
+      else if (BOARD(i, j) == WHITE) {
+       if (final_status[i][j] == BLACK_TERRITORY)
+         final_status[i][j] = DEAD;
+       else if (final_status[i][j] == DAME)
+         final_status[i][j] = ALIVE_IN_SEKI;
+       else if (final_status[i][j] == WHITE_TERRITORY)
+         final_status[i][j] = ALIVE;
+       else
+         final_status[i][j] = DEAD;
+      }
+    }
+}
+
+
+/* Function:  Compute the score of a finished game.
+ * Arguments: Optional random seed
+ * Fails:     never
+ * Returns:   Score in SGF format (RE property).
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_final_score(char *s)
+{
+  unsigned int saved_random_seed = get_random_seed();
+  int seed;
+  /* This is intended for regression purposes and should therefore be
+   * deterministic. The best way to ensure this is to reset the random
+   * number generator before calling genmove(). By default it is
+   * seeded with 0, but if an optional unsigned integer is given in
+   * the command after the color, this is used as seed instead.
+   */
+  seed = 0;
+  sscanf(s, "%d", &seed);
+  set_random_seed(seed);
+
+  finish_and_score_game(seed);
+
+  set_random_seed(saved_random_seed);
+
+  gtp_start_response(GTP_SUCCESS);
+  if (final_score > 0.0)
+    gtp_printf("W+%3.1f", final_score);
+  else if (final_score < 0.0)
+    gtp_printf("B+%3.1f", -final_score);
+  else
+    gtp_printf("0");
+  return gtp_finish_response();
+}
+
+
+/* Function:  Report the final status of a vertex in a finished game.
+ * Arguments: Vertex, optional random seed
+ * Fails:     invalid vertex
+ * Returns:   Status in the form of one of the strings "alive", "dead",
+ *            "seki", "white_territory", "black_territory", or "dame".
+ */
+static int
+gtp_final_status(char *s)
+{
+  int seed;
+  int n;
+  int ai, aj;
+  int k;
+  unsigned int saved_random_seed = get_random_seed();
+  const char *result = NULL;
+
+  n = gtp_decode_coord(s, &ai, &aj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  /* This is intended for regression purposes and should therefore be
+   * deterministic. The best way to ensure this is to reset the random
+   * number generator before calling genmove(). By default it is
+   * seeded with 0, but if an optional unsigned integer is given in
+   * the command after the color, this is used as seed instead.
+   */
+  seed = 0;
+  sscanf(s + n, "%d", &seed);
+  set_random_seed(seed);
+
+  finish_and_score_game(seed);
+
+  set_random_seed(saved_random_seed);
+  for (k = 0; k < 6; k++)
+    if (final_status[ai][aj] == status_numbers[k]) {
+      result = status_names[k];
+      break;
+    }
+  assert(result != NULL);
+
+  return gtp_success(result);
+}
+
+
+/* Function:  Report vertices with a specific final status in a finished game.
+ * Arguments: Status in the form of one of the strings "alive", "dead",
+ *            "seki", "white_territory", "black_territory", or "dame".
+ *            An optional random seed can be added.
+ * Fails:     missing or invalid status string
+ * Returns:   Vertices having the specified status. These are split with
+ *            one string on each line if the vertices are nonempty (i.e.
+ *            for "alive", "dead", and "seki").
+ *
+ * Status:    GTP version 2 standard command.
+ *            However, "dame", "white_territory", and "black_territory"
+ *            are private extensions.
+ */
+static int
+gtp_final_status_list(char *s)
+{
+  int seed;
+  int n;
+  int i, j;
+  enum dragon_status status = UNKNOWN;
+  int k;
+  char status_string[GTP_BUFSIZE];
+  int first;
+  unsigned int saved_random_seed = get_random_seed();
+
+  if (sscanf(s, "%s %n", status_string, &n) != 1)
+    return gtp_failure("missing status");
+  
+  for (k = 0; k < 6; k++) {
+    if (strcmp(status_string, status_names[k]) == 0)
+      status = status_numbers[k];
+  }
+
+  if (status == UNKNOWN)
+    return gtp_failure("invalid status");
+
+  /* This is intended for regression purposes and should therefore be
+   * deterministic. The best way to ensure this is to reset the random
+   * number generator before calling genmove(). By default it is
+   * seeded with 0, but if an optional unsigned integer is given in
+   * the command after the color, this is used as seed instead.
+   */
+  seed = 0;
+  sscanf(s + n, "%d", &seed);
+  set_random_seed(seed);
+
+  finish_and_score_game(seed);
+
+  set_random_seed(saved_random_seed);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  first = 1;
+  for (i = 0; i < board_size; i++)
+    for (j = 0; j < board_size; j++) {
+      if (final_status[i][j] != status)
+       continue;
+      if (BOARD(i, j) == EMPTY) {
+       if (!first)
+         gtp_printf(" ");
+       else
+         first = 0;
+       gtp_print_vertex(i, j);
+      }
+      else {
+       int num_stones;
+       int stones[MAX_BOARD * MAX_BOARD];
+       if (find_origin(POS(i, j)) != POS(i, j))
+         continue;
+       if (!first)
+         gtp_printf("\n");
+       else
+         first = 0;
+       num_stones = findstones(POS(i, j), board_size * board_size, stones);
+       gtp_print_vertices2(num_stones, stones);
+      }
+    }
+
+  return gtp_finish_response();
+}
+
+/* Function:  Estimate the score
+ * Arguments: None
+ * Fails:     never
+ * Returns:   upper and lower bounds for the score
+ */
+
+static int
+gtp_estimate_score(char *s)
+{
+  float score;
+  float upper_bound, lower_bound;
+  UNUSED(s);
+
+  score = gnugo_estimate_score(&upper_bound, &lower_bound);
+  gtp_start_response(GTP_SUCCESS);
+  /* Traditionally W wins jigo */
+  if (score >= 0.0) 
+    gtp_printf("W+%3.1f (upper bound: %3.1f, lower: %3.1f)", 
+              score, upper_bound, lower_bound);
+  else if (score < 0.0)
+    gtp_printf("B+%3.1f (upper bound: %3.1f, lower: %3.1f)", 
+              -score, upper_bound, lower_bound);
+  return gtp_finish_response();
+}  
+
+/* Function:  Estimate the score, taking into account which player moves next
+ * Arguments: Color to play
+ * Fails:     Invalid color
+ * Returns:   Score.
+ *
+ * This function generates a move for color, then adds the
+ * value of the move generated to the value of the position.
+ * Critical dragons are awarded to the opponent since the
+ * value of rescuing a critical dragon is taken into account
+ * in the value of the move generated.
+ */
+
+static int
+gtp_experimental_score(char *s)
+{
+  float upper_bound, lower_bound, score;
+  int color;
+
+  if (!gtp_decode_color(s, &color)
+      || (color != BLACK && color != WHITE))
+    return gtp_failure("invalid color");
+
+  genmove_conservative(color, NULL);
+  gnugo_estimate_score(&upper_bound, &lower_bound);
+
+  if (debug & DEBUG_SCORING)
+    fprintf(stderr, "upper = %3.1f, lower = %3.1f, best = %3.1f\n",
+           upper_bound, lower_bound, best_move_values[0]);
+  if (color == WHITE)
+    score = lower_bound + best_move_values[0];
+  else
+    score = upper_bound - best_move_values[0];
+
+  return gtp_success("%3.1f", score);
+}  
+
+
+/**************
+ * statistics *
+ **************/
+
+/* Function:  Reset the count of life nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ *
+ * Note: This function is obsolete and only remains for backwards
+ * compatibility.
+ */
+static int
+gtp_reset_life_node_counter(char *s)
+{
+  UNUSED(s);
+  return gtp_success("");
+}
+
+
+/* Function:  Retrieve the count of life nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   number of life nodes
+ *
+ * Note: This function is obsolete and only remains for backwards
+ * compatibility.
+ */
+static int
+gtp_get_life_node_counter(char *s)
+{
+  UNUSED(s);
+  return gtp_success("0");
+}
+
+
+/* Function:  Reset the count of owl nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_reset_owl_node_counter(char *s)
+{
+  UNUSED(s);
+  reset_owl_node_counter();
+  return gtp_success("");
+}
+
+
+/* Function:  Retrieve the count of owl nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   number of owl nodes
+ */
+static int
+gtp_get_owl_node_counter(char *s)
+{
+  int nodes = get_owl_node_counter();
+  UNUSED(s);
+  return gtp_success("%d", nodes);
+}
+
+
+/* Function:  Reset the count of reading nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_reset_reading_node_counter(char *s)
+{
+  UNUSED(s);
+  reset_reading_node_counter();
+  return gtp_success("");
+}
+
+
+/* Function:  Retrieve the count of reading nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   number of reading nodes
+ */
+static int
+gtp_get_reading_node_counter(char *s)
+{
+  int nodes = get_reading_node_counter();
+  UNUSED(s);
+  return gtp_success("%d", nodes);
+}
+
+
+/* Function:  Reset the count of trymoves/trykos.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_reset_trymove_counter(char *s)
+{
+  UNUSED(s);
+  reset_trymove_counter();
+  return gtp_success("");
+}
+
+
+/* Function:  Retrieve the count of trymoves/trykos.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   number of trymoves/trykos
+ */
+static int
+gtp_get_trymove_counter(char *s)
+{
+  int nodes = get_trymove_counter();
+  UNUSED(s);
+  return gtp_success("%d", nodes);
+}
+
+
+/* Function:  Reset the count of connection nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_reset_connection_node_counter(char *s)
+{
+  UNUSED(s);
+  reset_connection_node_counter();
+  return gtp_success("");
+}
+
+
+/* Function:  Retrieve the count of connection nodes.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   number of connection nodes
+ */
+static int
+gtp_get_connection_node_counter(char *s)
+{
+  int nodes = get_connection_node_counter();
+  UNUSED(s);
+  return gtp_success("%d", nodes);
+}
+
+
+
+/*********
+ * debug *
+ *********/
+
+
+/* Function:  Test an eyeshape for inconsistent evaluations
+ * Arguments: Eyeshape vertices
+ * Fails:     Bad vertices
+ * Returns:   Failure reports on stderr.
+ */
+static int
+gtp_test_eyeshape(char *s)
+{
+  int n;
+  int i, j;
+  int eye_vertices[MAX_BOARD * MAX_BOARD];
+  int eyesize = 0;
+
+  n = gtp_decode_coord(s, &i, &j);
+  while (n > 0) {
+    eye_vertices[eyesize] = POS(i, j);
+    eyesize++;
+    s += n;
+    n = gtp_decode_coord(s, &i, &j);
+  }
+  
+  if (eyesize == 0)
+    return gtp_failure("invalid coordinate");
+
+  test_eyeshape(eyesize, eye_vertices);
+
+  return gtp_success("");
+}
+
+
+/* Function:  Compute an eyevalue and vital points for an eye graph
+ * Arguments: Eyeshape encoded in string
+ * Fails:     Bad eyeshape, analysis failed
+ * Returns:   Eyevalue, vital points
+ */
+static int
+gtp_analyze_eyegraph(char *s)
+{
+  struct eyevalue value;
+  char analyzed_eyegraph[1024];
+  int result = analyze_eyegraph(s, &value, analyzed_eyegraph);
+
+  if (result == 0)
+    return gtp_failure("failed to analyze");
+
+  return gtp_success("%s\n%s", eyevalue_to_string(&value), analyzed_eyegraph);
+}
+
+
+
+/* Function:  Returns elapsed CPU time in seconds.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   Total elapsed (user + system) CPU time in seconds.
+ */
+static int
+gtp_cputime(char *s)
+{
+  UNUSED(s);
+  return gtp_success("%.3f", gg_cputime());
+}
+
+
+
+/* Function:  Write the position to stdout.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_showboard(char *s)
+{
+  UNUSED(s);
+  
+  gtp_start_response(GTP_SUCCESS);
+  gtp_printf("\n");
+  simple_showboard(gtp_output_file);
+  return gtp_finish_response();
+}
+
+
+/* Function:  Dump stack to stderr.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_dump_stack(char *s)
+{
+  UNUSED(s);
+  dump_stack();
+  return gtp_success("");
+}
+
+/* Determine whether a string starts with a specific substring. */
+static int
+has_prefix(const char *s, const char *prefix)
+{
+  return strncmp(s, prefix, strlen(prefix)) == 0;
+}
+
+static int
+print_influence_data(struct influence_data *q, char *what_data)
+{
+  float white_influence[BOARDMAX];
+  float black_influence[BOARDMAX];
+  float white_strength[BOARDMAX];
+  float black_strength[BOARDMAX];
+  float white_attenuation[BOARDMAX]; 
+  float black_attenuation[BOARDMAX];
+  float white_permeability[BOARDMAX];
+  float black_permeability[BOARDMAX];
+  float territory_value[BOARDMAX];
+  int influence_regions[BOARDMAX];
+  int non_territory[BOARDMAX];
+  int m, n;
+  
+  float *float_pointer = NULL;
+  int *int_pointer = NULL;
+  
+  while (*what_data == ' ')
+    what_data++;
+
+  get_influence(q, white_influence, black_influence,
+               white_strength, black_strength,
+               white_attenuation, black_attenuation,
+               white_permeability, black_permeability,
+               territory_value, influence_regions, non_territory);
+
+  if (has_prefix(what_data, "white_influence"))
+    float_pointer = white_influence;
+  else if (has_prefix(what_data, "black_influence"))
+    float_pointer = black_influence;
+  else if (has_prefix(what_data, "white_strength"))
+    float_pointer = white_strength;
+  else if (has_prefix(what_data, "black_strength"))
+    float_pointer = black_strength;
+  else if (has_prefix(what_data, "white_attenuation"))
+    float_pointer = white_attenuation;
+  else if (has_prefix(what_data, "black_attenuation"))
+    float_pointer = black_attenuation;
+  else if (has_prefix(what_data, "white_permeability"))
+    float_pointer = white_permeability;
+  else if (has_prefix(what_data, "black_permeability"))
+    float_pointer = black_permeability;
+  else if (has_prefix(what_data, "territory_value"))
+    float_pointer = territory_value;
+  else if (has_prefix(what_data, "influence_regions"))
+    int_pointer = influence_regions;
+  else if (has_prefix(what_data, "non_territory"))
+    int_pointer = non_territory;
+  else
+    return gtp_failure("unknown influence data");
+  
+  gtp_start_response(GTP_SUCCESS);
+  for (m = 0; m < board_size; m++) {
+    for (n = 0; n < board_size; n++) {
+      if (float_pointer)
+       gtp_printf("%6.2f ", float_pointer[POS(m, n)]);
+      else
+       gtp_printf("%2d ", int_pointer[POS(m, n)]);
+    }
+    gtp_printf("\n");
+  }
+  
+  /* We already have one newline and thus can't use gtp_finish_response(). */
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+/* Function:  Return information about the initial influence function.
+ * Arguments: color to move, what information
+ * Fails:     never
+ * Returns:   Influence data formatted like:
+ *
+ *   0.51   1.34   3.20   6.60   9.09   8.06   1.96   0.00   0.00 
+ *   0.45   1.65   4.92  12.19  17.47  15.92   4.03   0.00   0.00 
+ *                   .
+ *                   .
+ *                   .
+ *   0.00   0.00   0.00   0.00   0.00 100.00  75.53  41.47  23.41
+ *
+ * The available choices of information are:
+ * 
+ * white_influence (float)
+ * black_influence (float)
+ * white_strength (float)
+ * black_strength (float)
+ * white_attenuation (float)
+ * black_attenuation (float)
+ * white_permeability (float)
+ * black_permeability (float)
+ * territory_value (float)
+ * influence_regions (int)
+ * non_territory (int)
+ *
+ * The encoding of influence_regions is as follows:
+ *  4 white stone
+ *  3 white territory
+ *  2 white moyo
+ *  1 white area
+ *  0 neutral
+ * -1 black area
+ * -2 black moyo
+ * -3 black territory
+ * -4 black stone
+ */
+static int
+gtp_initial_influence(char *s)
+{
+  int color;
+  struct influence_data *q;
+  int n;
+
+  n = gtp_decode_color(s, &color);
+  if (n == 0)
+    return gtp_failure("invalid color");
+
+  q = INITIAL_INFLUENCE(color);
+  
+  silent_examine_position(EXAMINE_ALL);
+
+  return print_influence_data(q, s + n);
+}
+
+
+/* Function:  Return information about the influence function after a move.
+ * Arguments: move, what information
+ * Fails:     never
+ * Returns:   Influence data formatted like for initial_influence.
+ */
+static int
+gtp_move_influence(char *s)
+{
+  int color;
+  int i, j;
+  int n;
+
+  n = gtp_decode_move(s, &color, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid move");
+
+  prepare_move_influence_debugging(POS(i, j), color);
+  
+  return print_influence_data(&move_influence, s + n);
+}
+
+
+/* Function:  List probabilities of each move being played (when non-zero).
+ *            If no previous genmove command has been issued, the result
+ *            of this command will be meaningless.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   Move, probabilty pairs, one per row.
+ */
+static int
+gtp_move_probabilities(char *s)
+{
+  float probabilities[BOARDMAX];
+  int pos;
+  int any_moves_printed = 0;
+
+  UNUSED(s);
+
+  compute_move_probabilities(probabilities);
+
+  gtp_start_response(GTP_SUCCESS);
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && probabilities[pos] != 0.0) {
+      gtp_mprintf("%m ", I(pos), J(pos));
+      gtp_printf("%.4f\n", probabilities[pos]);
+      any_moves_printed = 1;
+    }
+  }
+
+  if (!any_moves_printed)
+    gtp_printf("\n");
+  gtp_printf("\n");
+
+  return GTP_OK;
+}
+
+
+/* Function:  Return the number of bits of uncertainty in the move.
+ *            If no previous genmove command has been issued, the result
+ *            of this command will be meaningless.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   bits of uncertainty
+ */
+static int
+gtp_move_uncertainty(char *s)
+{
+  float probabilities[BOARDMAX];
+  int pos;
+  double uncertainty = 0.0;
+
+  UNUSED(s);
+
+  compute_move_probabilities(probabilities);
+
+  gtp_start_response(GTP_SUCCESS);
+  for (pos = BOARDMIN; pos < BOARDMAX; pos++) {
+    if (ON_BOARD(pos) && probabilities[pos] > 0.0) {
+      /* Shannon's formula */
+      uncertainty += -1 * ((double)probabilities[pos]) *
+       log((double)probabilities[pos]) / log(2.0);
+    }
+  }
+
+  gtp_printf("%.4f\n\n", uncertainty);
+
+  return GTP_OK;
+}
+
+
+
+/* Function:  Return information about the followup influence after a move.
+ * Arguments: move, what information
+ * Fails:     never
+ * Returns:   Influence data formatted like for initial_influence.
+ */
+static int
+gtp_followup_influence(char *s)
+{
+  int color;
+  int i, j;
+  int n;
+
+  n = gtp_decode_move(s, &color, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid move");
+
+  prepare_move_influence_debugging(POS(i, j), color);
+  
+  return print_influence_data(&followup_influence, s + n);
+}
+
+
+/* Function:  Return the information in the worm data structure.
+ * Arguments: optional vertex
+ * Fails:     never
+ * Returns:   Worm data formatted like:
+ *
+ * A19:
+ * color           black
+ * size            10
+ * effective_size  17.83
+ * origin          A19
+ * liberties       8
+ * liberties2      15
+ * liberties3      10
+ * liberties4      8
+ * attack          PASS
+ * attack_code     0
+ * lunch           B19
+ * defend          PASS
+ * defend_code     0
+ * cutstone        2
+ * cutstone2       0
+ * genus           0
+ * inessential     0
+ * B19:
+ * color           white
+ * .
+ * .
+ * .
+ * inessential     0
+ * C19:
+ * ...
+ *
+ * If an intersection is specified, only data for this one will be returned.
+ */
+static int
+gtp_worm_data(char *s)
+{
+  int i = -1;
+  int j = -1;
+  int m, n;
+
+  if (sscanf(s, "%*c") >= 0 && !gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  silent_examine_position(EXAMINE_WORMS);
+
+  gtp_start_response(GTP_SUCCESS);
+  
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++)
+      if (i == -1 || (m == i && n == j)) {
+       struct worm_data *w = &worm[POS(m, n)];
+       gtp_print_vertex(m, n);
+       gtp_printf(":\n");
+       gtp_mprintf("origin               %m\n",  I(w->origin), J(w->origin));
+       gtp_mprintf("color                %C\n",  w->color);
+       gtp_printf("size                 %d\n",   w->size);
+       gtp_printf("effective_size       %.2f\n", w->effective_size);
+       gtp_printf("liberties            %d\n",   w->liberties);
+       gtp_printf("liberties2           %d\n",   w->liberties2);
+       gtp_printf("liberties3           %d\n",   w->liberties3);
+       gtp_printf("liberties4           %d\n",   w->liberties4);
+       gtp_printf("attack_code          %d\n",   w->attack_codes[0]);
+       gtp_mprintf("attack_point         %m\n",  
+                   I(w->attack_points[0]), J(w->attack_points[0]));
+       gtp_printf("defense_code         %d\n",   w->defense_codes[0]);
+       gtp_mprintf("defense_point        %m\n",  
+                   I(w->defense_points[0]), J(w->defense_points[0]));
+       gtp_mprintf("lunch                %m\n",  
+                   I(w->lunch), J(w->lunch));
+       gtp_printf("cutstone             %d\n",   w->cutstone);
+       gtp_printf("cutstone2            %d\n",   w->cutstone2);
+       gtp_printf("genus                %d\n",   w->genus);
+       gtp_printf("inessential          %d\n",   w->inessential);
+       gtp_printf("invincible           %d\n",   w->invincible);
+       gtp_printf("unconditional_status %s\n",
+                  status_to_string(w->unconditional_status));
+      }
+  
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+/* Function:  List the stones of a worm
+ * Arguments: the location, "BLACK" or "WHITE"
+ * Fails:     if called on an empty or off-board location
+ * Returns:   list of stones
+ */
+static int
+gtp_worm_stones(char *s)
+{
+  int i = -1;
+  int j = -1;
+  int color = EMPTY;
+  int m, n;
+  int u, v;
+  int board_empty = 1;
+
+  if (sscanf(s, "%*c") >= 0) {
+    if (!gtp_decode_coord(s, &i, &j)
+       && !gtp_decode_color(s, &color))
+      return gtp_failure("invalid coordinate");
+  }
+    
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("worm_stones called on an empty vertex");
+
+  gtp_start_response(GTP_SUCCESS);
+  
+  for (u = 0; u < board_size; u++)
+    for (v = 0; v < board_size; v++) {
+      if (BOARD(u, v) == EMPTY
+         || (color != EMPTY && BOARD(u, v) != color))
+       continue;
+      board_empty = 0;
+      if (find_origin(POS(u, v)) != POS(u, v))
+       continue;
+      if (ON_BOARD2(i, j) 
+         && !same_string(POS(u, v), POS(i, j)))
+       continue;
+      for (m = 0; m < board_size; m++)
+       for (n = 0; n < board_size; n++)
+         if (BOARD(m, n) != EMPTY
+             && same_string(POS(m, n), POS(u, v)))
+           gtp_mprintf("%m ", m, n);
+      gtp_printf("\n");
+    }
+  
+  if (board_empty) 
+    gtp_printf("\n"); /* in case no stones have been printed */
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+
+/* Function:  Return the cutstone field in the worm data structure.
+ * Arguments: non-empty vertex
+ * Fails:     never
+ * Returns:   cutstone
+ */
+static int
+gtp_worm_cutstone(char *s)
+{
+
+  int i, j;
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("vertex must not be empty");
+
+  silent_examine_position(EXAMINE_WORMS);
+
+  return gtp_success(" %d", worm[POS(i, j)].cutstone);
+}
+
+/* Function:  Return the information in the dragon data structure.
+ * Arguments: optional intersection
+ * Fails:     never
+ * Returns:   Dragon data formatted in the corresponding way to gtp_worm_data.
+ */
+static int
+gtp_dragon_data(char *s)
+{
+  int i = -1;
+  int j = -1;
+  int m, n;
+  int newline_needed = 0;
+
+  if (sscanf(s, "%*c") >= 0 && !gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (stackp > 0)
+    return gtp_failure("dragon data unavailable when stackp > 0");
+
+  silent_examine_position(FULL_EXAMINE_DRAGONS);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  if (ON_BOARD2(i, j) && BOARD(i, j) == EMPTY)
+    gtp_mprintf("%m empty\n", i, j);
+  else {
+    newline_needed = 1;
+    for (m = 0; m < board_size; m++)
+      for (n = 0; n < board_size; n++)
+       if ((m == i && n == j)
+           || (i == -1
+               && BOARD(m, n) != EMPTY
+               && dragon[POS(m, n)].origin == POS(m, n))) {
+         gtp_print_vertex(m, n);
+         gtp_printf(":\n");
+         report_dragon(gtp_output_file, POS(m, n));
+         newline_needed = 0;
+       }
+  }
+  if (newline_needed)
+    gtp_printf("\n");
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+/* Function:  List the stones of a dragon
+ * Arguments: the location
+ * Fails:     if called on an empty or off-board location
+ * Returns:   list of stones
+ */
+static int
+gtp_dragon_stones(char *s)
+{
+  int i = -1;
+  int j = -1;
+  int color = EMPTY;
+  int m, n;
+  int u, v;
+
+  if (sscanf(s, "%*c") >= 0) {
+    if (!gtp_decode_coord(s, &i, &j)
+       && !gtp_decode_color(s, &color))
+    return gtp_failure("invalid coordinate");
+  }
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("dragon_stones called on an empty vertex");
+
+  silent_examine_position(EXAMINE_DRAGONS);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  
+  for (u = 0; u < board_size; u++)
+    for (v = 0; v < board_size; v++) {
+      if (BOARD(u, v) == EMPTY
+         || (color != EMPTY && BOARD(u, v) != color))
+       continue;
+      if (dragon[POS(u, v)].origin != POS(u, v))
+       continue;
+      if (ON_BOARD2(i, j) && dragon[POS(i, j)].origin != POS(u, v))
+       continue;
+      for (m = 0; m < board_size; m++)
+       for (n = 0; n < board_size; n++)
+         if (dragon[POS(m, n)].origin == POS(u, v))
+           gtp_mprintf("%m ", m, n);
+      gtp_printf("\n");
+    }
+  
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+/* Function:  Return the information in the eye data structure.
+ * Arguments: color, vertex
+ * Fails:     never
+ * Returns:   eye data fields and values, one pair per row
+ */
+static int
+gtp_eye_data(char *s)
+{
+  int color = EMPTY;
+  int i = -1;
+  int j = -1;
+  struct eye_data *e;
+
+  if (!gtp_decode_move(s, &color, &i, &j))
+    return gtp_failure("invalid color or coordinate");
+
+  if (stackp > 0)
+    return gtp_failure("eye data unavailable when stackp > 0");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  if (color == BLACK)
+    e = &black_eye[POS(i, j)];
+  else
+    e = &white_eye[POS(i, j)];
+  
+  gtp_mprintf("origin               %m\n", I(e->origin), J(e->origin));
+  gtp_mprintf("color                %C\n", e->color);
+  gtp_printf("esize                %d\n", e->esize);
+  gtp_printf("msize                %d\n", e->msize);
+  gtp_printf("value                %s\n", eyevalue_to_string(&e->value));
+  gtp_printf("marginal             %d\n", e->marginal);
+  gtp_printf("neighbors            %d\n", e->neighbors);
+  gtp_printf("marginal_neighbors   %d\n", e->marginal_neighbors);
+  
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+/* Function:  Return the information in the half eye data structure.
+ * Arguments: vertex
+ * Fails:     never
+ * Returns:   half eye data fields and values, one pair per row
+ */
+static int
+gtp_half_eye_data(char *s)
+{
+  int i = -1;
+  int j = -1;
+  struct half_eye_data *h;
+  int k;
+
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+
+  if (stackp > 0)
+    return gtp_failure("half eye data unavailable when stackp > 0");
+
+  silent_examine_position(EXAMINE_DRAGONS_WITHOUT_OWL);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  h = &half_eye[POS(i, j)];
+  
+  gtp_printf("value                %.2f\n", h->value);
+  if (h->type == HALF_EYE)
+    gtp_printf("type                 HALF_EYE\n");
+  else if (h->type == FALSE_EYE)
+    gtp_printf("type                 FALSE_EYE\n");
+  else
+    gtp_printf("type                 %d\n", h->type);
+  gtp_printf("num_attacks          %d\n", h->num_attacks);
+  for (k = 0; k < h->num_attacks; k++)
+    gtp_mprintf("attack_point[%d]      %m\n", k, I(h->attack_point[k]),
+               J(h->attack_point[k]));
+  gtp_printf("num_defenses         %d\n", h->num_defenses);
+  for (k = 0; k < h->num_defenses; k++)
+    gtp_mprintf("defense_point[%d]     %m\n", k, I(h->defense_point[k]),
+               J(h->defense_point[k]));
+  
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+static SGFTree gtp_sgftree;
+
+/* Function:  Start storing moves executed during reading in an sgf
+ *            tree in memory. 
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ *
+ * Warning: You had better know what you're doing if you try to use this
+ *          command.
+ */
+static int
+gtp_start_sgftrace(char *s)
+{
+  UNUSED(s);
+  sgffile_begindump(&gtp_sgftree);
+  count_variations = 1;
+  return gtp_success("");
+}
+
+
+/* Function:  Finish storing moves in an sgf tree and write it to file. 
+ * Arguments: filename
+ * Fails:     never
+ * Returns:   nothing
+ *
+ * Warning: You had better know what you're doing if you try to use this
+ *          command.
+ */
+static int
+gtp_finish_sgftrace(char *s)
+{
+  char filename[GTP_BUFSIZE];
+  int nread;
+  
+  nread = sscanf(s, "%s", filename);
+  if (nread < 1)
+    return gtp_failure("missing filename");
+
+  sgffile_enddump(filename);
+  count_variations = 0;
+  return gtp_success("");
+}
+
+
+/* Function:  Dump the current position as a static sgf file to filename,
+ *            or as output if filename is missing or "-" 
+ * Arguments: optional filename
+ * Fails:     never
+ * Returns:   nothing if filename, otherwise the sgf
+ */
+static int
+gtp_printsgf(char *s)
+{
+  char filename[GTP_BUFSIZE];
+  int nread;
+  int next;
+  
+  if (get_last_player() == EMPTY)
+    next = BLACK;
+  else
+    next = OTHER_COLOR(get_last_player());
+
+  nread = sscanf(s, "%s", filename);
+
+  if (nread < 1)
+    gg_snprintf(filename, GTP_BUFSIZE, "%s", "-");
+
+  if (strcmp(filename, "-") == 0) {
+    gtp_start_response(GTP_SUCCESS);
+    sgffile_printsgf(next, filename);
+    gtp_printf("\n");
+    return GTP_OK;
+  }
+  else {
+    sgffile_printsgf(next, filename);
+    return gtp_success("");
+  }
+}
+
+
+/* Function:  Tune the parameters for the move ordering in the tactical
+ *            reading.
+ * Arguments: MOVE_ORDERING_PARAMETERS integers
+ * Fails:     incorrect arguments
+ * Returns:   nothing
+ */
+static int
+gtp_tune_move_ordering(char *s)
+{
+  int params[MOVE_ORDERING_PARAMETERS];
+  int k;
+  int p;
+  int n;
+
+  for (k = 0; k < MOVE_ORDERING_PARAMETERS; k++) {
+    if (sscanf(s, "%d%n", &p, &n) == 0)
+      return gtp_failure("incorrect arguments, expected %d integers",
+                        MOVE_ORDERING_PARAMETERS);
+    params[k] = p;
+    s += n;
+  }
+
+  tune_move_ordering(params);
+  return gtp_success("");
+}
+
+/* Function:  Echo the parameter
+ * Arguments: string
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_echo(char *s)
+{
+  return gtp_success("%s", s);
+}
+
+
+/* Function:  Echo the parameter to stdout AND stderr
+ * Arguments: string
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_echo_err(char *s)
+{
+  fprintf(stderr, "%s", s);
+  fflush(gtp_output_file);
+  fflush(stderr);
+  return gtp_success("%s", s);
+}
+
+/* Function:  List all known commands
+ * Arguments: none
+ * Fails:     never
+ * Returns:   list of known commands, one per line
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_list_commands(char *s)
+{
+  int k;
+  UNUSED(s);
+
+  gtp_start_response(GTP_SUCCESS);
+
+  for (k = 0; commands[k].name != NULL; k++)
+    gtp_printf("%s\n", commands[k].name);
+
+  gtp_printf("\n");
+  return GTP_OK;
+}
+
+
+/* Function:  Tell whether a command is known.
+ * Arguments: command name
+ * Fails:     never
+ * Returns:   "true" if command exists, "false" if not
+ *
+ * Status:    GTP version 2 standard command.
+ */
+static int
+gtp_known_command(char *s)
+{
+  int k;
+  char command[GTP_BUFSIZE];
+
+  if (sscanf(s, "%s", command) == 1) {
+    for (k = 0; commands[k].name != NULL; k++)
+      if (strcmp(command, commands[k].name) == 0)
+       return gtp_success("true");
+  }
+
+  return gtp_success("false");
+}
+
+
+/* Function:  Turn uncertainty reports from owl_attack
+ *            and owl_defend on or off.
+ * Arguments: "on" or "off"
+ * Fails:     invalid argument
+ * Returns:   nothing
+ */
+static int
+gtp_report_uncertainty(char *s)
+{
+  if (!strncmp(s, "on", 2)) {
+    report_uncertainty = 1;
+    return gtp_success("");
+  }
+  if (!strncmp(s, "off", 3)) {
+    report_uncertainty = 0;
+    return gtp_success("");
+  }
+  return gtp_failure("invalid argument");
+}
+    
+
+static void
+gtp_print_code(int c)
+{
+  static int conversion[6] = { 
+    0, /* LOSE */
+    3, /* KO_B */
+    5, /* LOSS */
+    4, /* GAIN */
+    2, /* KO_A */
+    1, /* WIN  */
+  };
+  gtp_printf("%d", conversion[c]);
+}
+
+static void
+gtp_print_vertices2(int n, int *moves)
+{
+  int movei[MAX_BOARD * MAX_BOARD];
+  int movej[MAX_BOARD * MAX_BOARD];
+  int k;
+
+  for (k = 0; k < n; k++) {
+    movei[k] = I(moves[k]);
+    movej[k] = J(moves[k]);
+  }
+  
+  gtp_print_vertices(n, movei, movej);
+}
+
+/*************
+ * transform *
+ *************/
+
+static void
+rotate_on_input(int ai, int aj, int *bi, int *bj)
+{
+  rotate(ai, aj, bi, bj, board_size, gtp_orientation);
+}
+
+static void
+rotate_on_output(int ai, int aj, int *bi, int *bj)
+{
+  inv_rotate(ai, aj, bi, bj, board_size, gtp_orientation);
+}
+
+
+/***************
+ * random seed *
+ ***************/
+
+/* Function:  Get the random seed
+ * Arguments: none
+ * Fails:     never
+ * Returns:   random seed
+ */
+static int
+gtp_get_random_seed(char *s)
+{
+  UNUSED(s);
+  return gtp_success("%d", get_random_seed());
+}
+
+/* Function:  Set the random seed
+ * Arguments: integer
+ * Fails:     invalid data
+ * Returns:   nothing
+ */
+static int
+gtp_set_random_seed(char *s)
+{
+  int seed;
+  if (sscanf(s, "%d", &seed) < 1)
+    return gtp_failure("invalid seed");
+  
+  set_random_seed(seed);
+  return gtp_success("");
+}
+
+
+/* Function:  Advance the random seed by a number of games.
+ * Arguments: integer
+ * Fails:     invalid data
+ * Returns:   New random seed.
+ */
+static int
+gtp_advance_random_seed(char *s)
+{
+  int i;
+  int games;
+  if (sscanf(s, "%d", &games) < 1
+      || games < 0)
+    return gtp_failure("invalid number of games");
+  
+  for (i = 0; i < games; i++)
+    update_random_seed();
+
+  return gtp_success("%d", get_random_seed());
+}
+
+/***************
+ * surrounding *
+ ***************/
+
+/* Function:  Determine if a dragon is surrounded
+ * Arguments: vertex (dragon)
+ * Fails:     invalid vertex, empty vertex
+ * Returns:   1 if surrounded, 2 if weakly surrounded, 0 if not
+ */
+static int
+gtp_is_surrounded(char *s)
+{
+  int i, j;
+  int n;
+
+  n = gtp_decode_coord(s, &i, &j);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(i, j) == EMPTY)
+    return gtp_failure("dragon vertex must be nonempty");
+
+  silent_examine_position(EXAMINE_DRAGONS);
+  return gtp_success("%d", DRAGON2(POS(i, j)).surround_status);
+}
+
+/* Function:  Determine if a move surrounds a dragon
+ * Arguments: vertex (move), vertex (dragon)
+ * Fails:     invalid vertex, empty (dragon, nonempty (move)
+ * Returns:   1 if (move) surrounds (dragon)
+ */
+static int
+gtp_does_surround(char *s)
+{
+  int si, sj, di, dj;
+  int n;
+
+  n = gtp_decode_coord(s, &si, &sj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(si, sj) != EMPTY)
+    return gtp_failure("move vertex must be empty");
+
+  n = gtp_decode_coord(s + n, &di, &dj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(di, dj) == EMPTY)
+    return gtp_failure("dragon vertex must be nonempty");
+
+  silent_examine_position(EXAMINE_DRAGONS);
+  return gtp_success("%d", does_surround(POS(si, sj), POS(di, dj)));
+}
+
+/* Function:  Report the surround map for dragon at a vertex
+ * Arguments: vertex (dragon), vertex (mapped location)
+ * Fails:     invalid vertex, empty dragon
+ * Returns:   value of surround map at (mapped location), or -1 if
+ *            dragon not surrounded.
+ */
+
+static int
+gtp_surround_map(char *s)
+{
+  int di, dj, mi, mj;
+  int n;
+
+  n = gtp_decode_coord(s, &di, &dj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  if (BOARD(di, dj) == EMPTY)
+    return gtp_failure("dragon vertex must not be empty");
+
+  n = gtp_decode_coord(s + n, &mi, &mj);
+  if (n == 0)
+    return gtp_failure("invalid coordinate");
+
+  silent_examine_position(EXAMINE_DRAGONS);
+  return gtp_success("%d", surround_map(POS(di, dj), POS(mi, mj)));
+}
+
+/***************
+ * search area *
+ ***************/
+
+/* Function:  limit search, and establish a search diamond
+ * Arguments: pos
+ * Fails:     invalid value
+ * Returns:   nothing
+ */
+static int
+gtp_set_search_diamond(char *s)
+{
+  int i, j;
+
+  if (!gtp_decode_coord(s, &i, &j))
+    return gtp_failure("invalid coordinate");
+  
+  set_limit_search(1);
+  set_search_diamond(POS(i, j));
+  return gtp_success("");
+}
+
+/* Function:  unmark the entire board for limited search
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_reset_search_mask(char *s)
+{
+  UNUSED(s);
+
+  reset_search_mask();
+  return gtp_success("");
+}
+  
+/* Function:  sets the global variable limit_search
+ * Arguments: value
+ * Fails:     invalid arguments
+ * Returns:   nothing
+ */
+static int
+gtp_limit_search(char *s)
+{
+  int value;
+
+  if (sscanf(s, "%d", &value) < 1)
+    return gtp_failure("invalid value for search limit");
+  set_limit_search(value);
+  return gtp_success("");
+}
+
+/* Function:  mark a vertex for limited search
+ * Arguments: position
+ * Fails:     invalid arguments
+ * Returns:   nothing
+ */
+static int
+gtp_set_search_limit(char *s)
+{
+  int i, j;
+
+  gtp_decode_coord(s, &i, &j);
+  set_search_mask(POS(i, j), 1);
+  return gtp_success("");
+}
+  
+/* Function:  Draw search area. Writes to stderr.
+ * Arguments: none
+ * Fails:     never
+ * Returns:   nothing
+ */
+static int
+gtp_draw_search_area(char *s)
+{
+  UNUSED(s);
+
+  gtp_start_response(GTP_SUCCESS);
+  gtp_printf("\n");
+  draw_search_area();
+  return gtp_finish_response();
+}
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/play_solo.c b/interface/play_solo.c
new file mode 100644 (file)
index 0000000..cf210c6
--- /dev/null
@@ -0,0 +1,323 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "interface.h"
+
+#include "liberty.h" /* to get to the stats */
+
+#include "sgftree.h"
+#include "random.h"
+#include "gg_utils.h"
+
+void
+play_solo(Gameinfo *gameinfo, int moves)
+{
+  SGFTree sgftree;
+  int passes = 0; /* num. consecutive passes */
+  float move_value;
+  double t1, t2;
+  int save_moves = moves;
+
+  struct stats_data totalstats;
+  int total_owl_count = 0;
+
+  /* It tends not to be very imaginative in the opening,
+   * so we scatter a few stones randomly to start with.
+   * We add two random numbers to reduce the probability
+   * of playing stones near the edge.
+   */
+  
+  int n = 6 + 2*gg_rand()%5;
+  int i, j;
+
+  komi = 5.5;
+
+  sgftree_clear(&sgftree);
+  sgftreeCreateHeaderNode(&sgftree, board_size, komi, handicap);
+  sgf_write_header(sgftree.root, 1, get_random_seed(), 5.5, handicap,
+                   get_level(), chinese_rules);
+  /* Generate some random moves. */
+  if (board_size > 6) {
+    do {
+      do {
+       i = (gg_rand() % 4) + (gg_rand() % (board_size - 4));
+       j = (gg_rand() % 4) + (gg_rand() % (board_size - 4));
+      } while (!is_allowed_move(POS(i, j), gameinfo->to_move));
+
+      gnugo_play_move(POS(i, j), gameinfo->to_move);
+      sgftreeAddPlay(&sgftree, gameinfo->to_move, i, j);
+      sgftreeAddComment(&sgftree, "random move");
+      gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+    } while (--n > 0);
+  }
+  
+  t1 = gg_cputime();
+  memset(&totalstats, '\0', sizeof(totalstats));
+  while (passes < 2 && --moves >= 0) {
+    int move;
+    reset_owl_node_counter();
+    move = genmove(gameinfo->to_move, &move_value, NULL);
+
+    gnugo_play_move(move, gameinfo->to_move);
+    sgffile_add_debuginfo(sgftree.lastnode, move_value);
+    sgftreeAddPlay(&sgftree, gameinfo->to_move, I(move), J(move));
+    sgffile_output(&sgftree);
+    gameinfo->to_move = OTHER_COLOR(gameinfo->to_move);
+
+    if (move == PASS_MOVE) {
+      passes++;
+      printf("%s(%d): Pass\n", gameinfo->to_move == BLACK ? "Black" : "White",
+            movenum);
+    }
+    else {
+      passes = 0;
+      gprintf("%s(%d): %1m\n", gameinfo->to_move == BLACK ? "Black" : "White",
+             movenum, move);
+    }
+
+    totalstats.nodes                    += stats.nodes;
+    totalstats.read_result_entered      += stats.read_result_entered;
+    totalstats.read_result_hits         += stats.read_result_hits;
+    totalstats.trusted_read_result_hits += stats.trusted_read_result_hits;
+    total_owl_count                     += get_owl_node_counter();
+  }
+  t2 = gg_cputime();
+  
+  /* Two passes and it's over. (EMPTY == BOTH) */
+  who_wins(EMPTY, stdout);
+
+  {
+    float score = gnugo_estimate_score(NULL, NULL);
+    sgfWriteResult(sgftree.root, score, 1);
+  }
+  sgffile_output(&sgftree);
+
+  printf("%10d moves played in %0.3f seconds\n", save_moves-moves, t2-t1);
+  if (save_moves != moves)
+    printf("%10.3f seconds/move\n", (t2-t1)/(save_moves-moves));
+  
+  printf("%10d nodes\n", totalstats.nodes);
+  printf("%10d read results entered\n", totalstats.read_result_entered);
+  printf("%10d read result hits\n", totalstats.read_result_hits);
+  printf("%10d trusted read result hits\n",
+        totalstats.trusted_read_result_hits);
+  printf("%10d owl nodes\n", total_owl_count);
+}
+
+
+/* ================================================================ */
+
+
+/*
+ * Load SGF file and run genmove().
+ */
+
+void 
+load_and_analyze_sgf_file(Gameinfo *gameinfo)
+{
+  SGFTree sgftree;
+  int move;
+  int next;
+  float move_value;
+  
+  next = gameinfo->to_move;
+  sgftree = gameinfo->game_record;
+
+  if (metamachine)
+    sgffile_begindump(&sgftree);
+
+  move = genmove(next, &move_value, NULL);
+
+  gprintf("%s move %1m\n", next == WHITE ? "white (O)" : "black (X)", move);
+
+  if (metamachine)
+    sgffile_enddump(outfilename);
+  else {
+    gnugo_play_move(move, next);
+    sgftreeAddPlay(&sgftree, next, I(move), J(move));
+    sgftreeAddComment(&sgftree, "load and analyze mode");
+    sgffile_add_debuginfo(sgftree.lastnode, move_value);
+    sgffile_output(&sgftree);
+  }
+}
+
+
+/*
+ * Load SGF file and score the game
+ * scoringmode:
+ * estimate  - estimate territorial balance
+ * finish    - finish the game by selfplaying and then count the score quickly
+ * aftermath - like 'finish' but also play out the aftermath in order to
+ *             get an accurate score
+ */
+
+#define ESTIMATE  0
+#define FINISH    1
+#define AFTERMATH 2
+
+void 
+load_and_score_sgf_file(SGFTree *tree, Gameinfo *gameinfo, 
+                       const char *scoringmode)
+{
+  int move;
+  float move_value;
+  char *tempc = NULL;
+  char text[250];
+  char winner;
+  int next;
+  int pass = 0;
+  int method;
+  float score;
+  SGFTree local_tree;
+  SGFTree *score_tree = tree;
+  
+  /* Default scoring method is ESTIMATE since it's fastest. */
+  method = ESTIMATE;
+  if (strcmp(scoringmode, "finish") == 0)
+    method = FINISH;
+  else if (strcmp(scoringmode, "aftermath") == 0)
+    method = AFTERMATH;
+
+  /* For aftermath scoring we compress the previous moves to a static
+   * board position in the output sgf. This helps a lot when debugging
+   * scoring mistakes. We don't do this for the finish method,
+   * however, since users may be better served by having GNU Go's
+   * selfplay added to the original game record.
+   */
+  if (method == AFTERMATH) {
+    sgftree_clear(&local_tree);
+    /* Modify komi to compensate for captured stones. We start at a
+     * setup position and since there is no standard sgf property to
+     * tell the number of captured stones, a modified komi is the best
+     * available solution.
+     */
+    sgftreeCreateHeaderNode(&local_tree, board_size,
+                           komi + black_captured - white_captured, handicap);
+    sgffile_printboard(&local_tree);
+    sgfAddProperty(local_tree.lastnode, "PL",
+                  gameinfo->to_move == WHITE ? "W" : "B");
+    score_tree = &local_tree;
+  }
+  
+  next = gameinfo->to_move;
+  reset_engine();
+  
+  /* Complete the game by selfplay for the finish and aftermath methods. */
+  if (method != ESTIMATE) {
+    doing_scoring = 1;
+    while (pass < 2) {
+      move = genmove_conservative(next, &move_value);
+      if (move != PASS_MOVE) {
+       pass = 0;
+       gprintf("%d %s move %1m\n", movenum,
+               next == WHITE ? "white (O)" : "black (X)", move);
+      }
+      else {
+       pass++;
+       gprintf("%d %s move PASS\n", movenum, 
+               next == WHITE ? "white (O)" : "black (X)");
+      }
+      play_move(move, next);
+      sgffile_add_debuginfo(score_tree->lastnode, move_value);
+      sgftreeAddPlay(score_tree, next, I(move), J(move));
+      sgffile_output(score_tree);
+      next = OTHER_COLOR(next);
+    }
+    doing_scoring = 0;
+  }
+  
+  /* Calculate the score. */
+  if (method == AFTERMATH)
+    score = aftermath_compute_score(next, score_tree);
+  else
+    score = gnugo_estimate_score(NULL, NULL);
+  
+  if (score < 0.0) {
+    sprintf(text, "Black wins by %1.1f points\n", -score);
+    winner = 'B';
+  }
+  else if (score > 0.0) {
+    sprintf(text, "White wins by %1.1f points\n", score);
+    winner = 'W';
+  }
+  else {
+    sprintf(text, "Jigo\n");
+    winner = '0';
+  }
+  fputs(text, stdout);
+  sgftreeAddComment(score_tree, text);
+
+  /* For the finish and aftermath methods we compare the score with
+   * what's stored in the game record.
+   *
+   * FIXME: No comparison is made if the stored result was 0. Wins by
+   *        time or forfeit are not handled either.
+   *
+   * FIXME: Does anybody actually care about this information? Just
+   *        removing this piece of code is a tempting alternative.
+   */
+  if (method != ESTIMATE && sgfGetCharProperty(tree->root, "RE", &tempc)) {
+    char dummy;
+    float result;
+    if (sscanf(tempc, "%1c%f", &dummy, &result) == 2) {
+      fprintf(stdout, "Result from file: %c+%1.1f\n", dummy, result);
+      fputs("GNU Go result and result from file are ", stdout);
+      if (result == fabs(score) && winner == dummy)
+       fputs("identical\n", stdout);
+      else
+       fputs("different\n", stdout);
+      
+    }
+    else {
+      if (tempc[2] == 'R') {
+       fprintf(stdout, "Result from file: Resign\n");
+       fputs("GNU Go result and result from file are ", stdout);
+       if (tempc[0] == winner)
+         fputs("identical\n", stdout);
+       else
+         fputs("different\n", stdout);
+      }
+    }
+  }
+
+  if (method != ESTIMATE)
+    sgfWriteResult(score_tree->root, score, 1);
+  
+  sgffile_output(score_tree);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/play_test.c b/interface/play_test.c
new file mode 100644 (file)
index 0000000..eb07321
--- /dev/null
@@ -0,0 +1,220 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "gnugo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "interface.h"
+#include "sgftree.h"
+#include "gg_utils.h"
+#include "liberty.h"
+
+static void replay_node(SGFNode *node, int color_to_test, float *replay_score,
+                       float *total_score);
+
+
+/* --------------------------------------------------------------*/
+/* replay a game */
+/* --------------------------------------------------------------*/
+
+void
+play_replay(SGFTree *tree, int color_to_replay)
+{
+  char *tmpc = NULL;
+  float replay_score = 0.0;
+  float total_score = 0.0;
+
+  SGFNode *node = tree->root;
+
+  /* Board size and komi are already set up correctly since the game
+   * has already been loaded before this function is called. Now we
+   * only have to clear the board before starting over.
+   */
+  clear_board();
+  if (!quiet) {
+    printf("Board Size:   %d\n", board_size);
+    if (sgfGetCharProperty(node, "HA", &tmpc))
+      printf("Handicap:     %s\n", tmpc);
+    printf("Komi:         %.1f\n", komi);
+    if (sgfGetCharProperty(node, "RU", &tmpc))
+      printf("Ruleset:      %s\n", tmpc);
+    if (sgfGetCharProperty(node, "GN", &tmpc))
+      printf("Game Name:    %s\n", tmpc);
+    if (sgfGetCharProperty(node, "DT", &tmpc))
+      printf("Game Date:    %s\n", tmpc);
+    if (sgfGetCharProperty(node, "GC", &tmpc))
+      printf("Game Comment: %s\n", tmpc);
+    if (sgfGetCharProperty(node, "US", &tmpc))
+      printf("Game User:    %s\n", tmpc);
+    if (sgfGetCharProperty(node, "PB", &tmpc))
+      printf("Black Player: %s\n", tmpc);
+    if (sgfGetCharProperty(node, "PW", &tmpc))
+      printf("White Player: %s\n", tmpc);
+    if (sgfGetCharProperty(node, "RE", &tmpc))
+      printf("Result:       %s\n", tmpc);
+  }
+
+  /*
+   * Now actually run through the file.  This is the interesting part.
+   * We need to traverse the SGF tree, and every time we encounter a node
+   * we need to check what move GNU Go would make, and see if it is OK. 
+   */
+  while (node) {
+    replay_node(node, color_to_replay, &replay_score, &total_score);
+    sgffile_output(tree);
+    node = node->child;
+  }
+
+  if (!quiet)
+    printf("Global score: %.2f / %.2f\n", replay_score, total_score);
+
+  if (showtime) {
+    gprintf("SLOWEST MOVE: %d at %1m ", slowest_movenum, slowest_move);
+    fprintf(stderr, "(%.2f seconds)\n", slowest_time);
+    fprintf(stderr, "AVERAGE TIME: %.2f seconds per move\n",
+           total_time / movenum);
+    fprintf(stderr, "TOTAL TIME: %.2f seconds\n",
+           total_time);
+  }
+}
+
+
+#define BUFSIZE 128
+
+/*
+ * Handle this node.
+ */
+
+static void
+replay_node(SGFNode *node, int color_to_replay, float *replay_score,
+           float *total_score)
+{
+  SGFProperty *sgf_prop;  /* iterate over properties of the node */
+  SGFProperty *move_prop = NULL; /* remember if we see a move property */
+  int color; /* color of move to be made at this node. */
+  
+  int old_move; /* The move played in the file. */
+  int new_move; /* The move generated by GNU Go. */
+
+  char buf[BUFSIZE];
+
+  /* Handle any AB / AW properties, and note presence
+   * of move properties.
+   */
+
+  for (sgf_prop = node->props; sgf_prop; sgf_prop = sgf_prop->next) {
+    switch (sgf_prop->name) {
+    case SGFAB:
+      /* add black */
+      add_stone(get_sgfmove(sgf_prop), BLACK);
+      break;
+    case SGFAW:
+      /* add white */
+      add_stone(get_sgfmove(sgf_prop), WHITE);
+      break;
+    case SGFB:
+    case SGFW:
+      move_prop = sgf_prop;  /* remember it for later */
+      break;
+    }
+  }
+
+  /* Only generate moves at move nodes. */
+  if (!move_prop)
+    return;
+
+  old_move = get_sgfmove(move_prop);
+  color = (move_prop->name == SGFW) ? WHITE : BLACK;
+
+  if (color == color_to_replay || color_to_replay == GRAY) {
+    float new_move_value = 0.0;
+    float old_move_value = 0.0;
+  
+    /* Get a move from the engine for color. */
+    int resign;
+    new_move = genmove(color, NULL, &resign);
+    
+    /* Pick up the relevant values from the potential_moves[] array. */
+    if (new_move != PASS_MOVE)
+      new_move_value = potential_moves[new_move]; 
+    if (old_move != PASS_MOVE)
+      old_move_value = potential_moves[old_move];
+    
+    /* Now report on how well the computer generated the move. */
+    if (new_move != old_move || !quiet) {
+      mprintf("Move %d (%C): ", movenum + 1, color);
+    
+      if (resign)
+       printf("GNU Go resigns ");
+      else {
+       mprintf("GNU Go plays %1m ", new_move);
+       if (new_move != PASS_MOVE)
+         printf("(%.2f) ", new_move_value);
+      }
+      
+      mprintf("- Game move %1m ", old_move);
+      if (new_move != PASS_MOVE && old_move_value > 0.0)
+       printf("(%.2f) ", old_move_value);
+      printf("\n");
+
+      *replay_score += new_move_value - old_move_value;
+      *total_score += new_move_value;
+    }
+    
+    if (new_move != old_move) {
+      if (resign)
+       gg_snprintf(buf, BUFSIZE, "GNU Go resigns - Game move %s (%.2f)",
+                   location_to_string(old_move), old_move_value);
+      else {      
+       gg_snprintf(buf, BUFSIZE,
+                   "GNU Go plays %s (%.2f) - Game move %s (%.2f)",
+                   location_to_string(new_move), new_move_value,
+                   location_to_string(old_move), old_move_value);
+       if (new_move != PASS_MOVE)
+         sgfCircle(node, I(new_move), J(new_move));
+      }
+    }
+    else
+      gg_snprintf(buf, BUFSIZE, "GNU Go plays the same move %s (%.2f)",
+                 location_to_string(new_move), new_move_value);
+    
+    sgfAddComment(node, buf);
+    sgffile_add_debuginfo(node, 0.0);
+  }
+
+  /* Finally, do play the move from the file. */
+  play_move(old_move, color);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/interface/xpms/bmoku1.xpm b/interface/xpms/bmoku1.xpm
new file mode 100644 (file)
index 0000000..5ed0a22
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+" .............................",
+" .............................",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................   ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bmoku2.xpm b/interface/xpms/bmoku2.xpm
new file mode 100644 (file)
index 0000000..f1a812d
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+"..............................",
+"..............................",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bmoku3.xpm b/interface/xpms/bmoku3.xpm
new file mode 100644 (file)
index 0000000..bf7ada6
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+"............................. ",
+"............................. ",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bmoku4.xpm b/interface/xpms/bmoku4.xpm
new file mode 100644 (file)
index 0000000..6d0e8fc
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+" .............................",
+" .............................",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bmoku5.xpm b/interface/xpms/bmoku5.xpm
new file mode 100644 (file)
index 0000000..ebeac2c
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+"..............................",
+"..............................",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bmoku6.xpm b/interface/xpms/bmoku6.xpm
new file mode 100644 (file)
index 0000000..4ddb486
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+"............................. ",
+"............................. ",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bmoku7.xpm b/interface/xpms/bmoku7.xpm
new file mode 100644 (file)
index 0000000..4d8bc82
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+" .............................",
+" .............................",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"                              "};
+
diff --git a/interface/xpms/bmoku8.xpm b/interface/xpms/bmoku8.xpm
new file mode 100644 (file)
index 0000000..44af862
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+"..............................",
+"..............................",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"                              "};
+
diff --git a/interface/xpms/bmoku9.xpm b/interface/xpms/bmoku9.xpm
new file mode 100644 (file)
index 0000000..feb467f
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" ............................ ",
+" ............................ ",
+"............................. ",
+"............................. ",
+" ............................ ",
+" ............................ ",
+" ............................ ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"                              "};
+
diff --git a/interface/xpms/bpmoku1.xpm b/interface/xpms/bpmoku1.xpm
new file mode 100644 (file)
index 0000000..c0fcbf8
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+" ...........O++++O............",
+" ...........O++++O............",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bpmoku2.xpm b/interface/xpms/bpmoku2.xpm
new file mode 100644 (file)
index 0000000..c0fcbf8
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+" ...........O++++O............",
+" ...........O++++O............",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bpmoku3.xpm b/interface/xpms/bpmoku3.xpm
new file mode 100644 (file)
index 0000000..5c68c6d
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"                              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+"............O++++O........... ",
+"............O++++O........... ",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bpmoku4.xpm b/interface/xpms/bpmoku4.xpm
new file mode 100644 (file)
index 0000000..2261543
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+" ...........O++++O............",
+" ...........O++++O............",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bpmoku5.xpm b/interface/xpms/bpmoku5.xpm
new file mode 100644 (file)
index 0000000..a10b00e
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+"............O++++O............",
+"............O++++O............",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bpmoku6.xpm b/interface/xpms/bpmoku6.xpm
new file mode 100644 (file)
index 0000000..3cbf7d5
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+"............O++++O........... ",
+"............O++++O........... ",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"              ..              "};
+
diff --git a/interface/xpms/bpmoku7.xpm b/interface/xpms/bpmoku7.xpm
new file mode 100644 (file)
index 0000000..b6ae9f2
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+" ...........O++++O............",
+" ...........O++++O............",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"                              "};
+
diff --git a/interface/xpms/bpmoku8.xpm b/interface/xpms/bpmoku8.xpm
new file mode 100644 (file)
index 0000000..46d5c7a
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+"............O++++O............",
+"............O++++O............",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"                              "};
+
diff --git a/interface/xpms/bpmoku9.xpm b/interface/xpms/bpmoku9.xpm
new file mode 100644 (file)
index 0000000..9f0cd27
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 6 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"+     c #FFFFFFFFFFFF",
+"              ..              ",
+"           ........           ",
+"         ............         ",
+"       ................       ",
+"      ..........XXX.....      ",
+"     ..........XXXXXX....     ",
+"    ..........XXooooXX....    ",
+"   ...........XooOOOooX....   ",
+"   ...........XooOOOoXX....   ",
+"  ............XoooOoooX.....  ",
+"  .............XXoooXX......  ",
+" ...............XXXXX........ ",
+" .............OO............. ",
+" ............O++O............ ",
+"............O++++O........... ",
+"............O++++O........... ",
+" ............O++O............ ",
+" .............OO............. ",
+"  ........................... ",
+"  ..........................  ",
+"  ..........................  ",
+"   ........................   ",
+"   ........................   ",
+"    ......................    ",
+"     ....................     ",
+"      ..................      ",
+"       ................       ",
+"         ............         ",
+"           ........           ",
+"                              "};
+
diff --git a/interface/xpms/empty1.xpm b/interface/xpms/empty1.xpm
new file mode 100644 (file)
index 0000000..a44bc14
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"              ................",
+"              ................",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/empty2.xpm b/interface/xpms/empty2.xpm
new file mode 100644 (file)
index 0000000..66a0290
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"..............................",
+"..............................",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/empty3.xpm b/interface/xpms/empty3.xpm
new file mode 100644 (file)
index 0000000..7fe71da
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"................              ",
+"................              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/empty4.xpm b/interface/xpms/empty4.xpm
new file mode 100644 (file)
index 0000000..0c6980e
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ................",
+"              ................",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/empty5.xpm b/interface/xpms/empty5.xpm
new file mode 100644 (file)
index 0000000..eefd6e2
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"..............................",
+"..............................",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/empty6.xpm b/interface/xpms/empty6.xpm
new file mode 100644 (file)
index 0000000..5578030
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"................              ",
+"................              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/empty7.xpm b/interface/xpms/empty7.xpm
new file mode 100644 (file)
index 0000000..58f2853
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ................",
+"              ................",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              "};
+
diff --git a/interface/xpms/empty8.xpm b/interface/xpms/empty8.xpm
new file mode 100644 (file)
index 0000000..7a772c8
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"..............................",
+"..............................",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              "};
+
diff --git a/interface/xpms/empty9.xpm b/interface/xpms/empty9.xpm
new file mode 100644 (file)
index 0000000..fa02ce5
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"................              ",
+"................              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              ",
+"                              "};
+
diff --git a/interface/xpms/hoshi.xpm b/interface/xpms/hoshi.xpm
new file mode 100644 (file)
index 0000000..c3c2e1a
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * bmoku1_xpm[] = {
+"30 30 5 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #618561856185",
+"o     c #9E799E799E79",
+"O     c #CF3CCF3CCF3C",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"             ....             ",
+"..............................",
+"..............................",
+"             ....             ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              ",
+"              ..              "};
+
diff --git a/interface/xpms/wmoku1.xpm b/interface/xpms/wmoku1.xpm
new file mode 100644 (file)
index 0000000..9767695
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+" &%%%%$$$$oooXXXOOO++++OOOXXo.",
+" &&&%%%$$$ooooXXXXOOOOOOOOXoo.",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wmoku2.xpm b/interface/xpms/wmoku2.xpm
new file mode 100644 (file)
index 0000000..384ca1b
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+".&%%%%$$$$oooXXXOOO++++OOOXXo.",
+".&&&%%%$$$ooooXXXXOOOOOOOOXoo.",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wmoku3.xpm b/interface/xpms/wmoku3.xpm
new file mode 100644 (file)
index 0000000..5df419f
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+".&%%%%$$$$oooXXXOOO++++OOOXXo ",
+".&&&%%%$$$ooooXXXXOOOOOOOOXoo ",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wmoku4.xpm b/interface/xpms/wmoku4.xpm
new file mode 100644 (file)
index 0000000..3207d37
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+" &%%%%$$$$oooXXXOOO++++OOOXXo.",
+" &&&%%%$$$ooooXXXXOOOOOOOOXoo.",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wmoku5.xpm b/interface/xpms/wmoku5.xpm
new file mode 100644 (file)
index 0000000..799813c
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+".&%%%%$$$$oooXXXOOO++++OOOXXo.",
+".&&&%%%$$$ooooXXXXOOOOOOOOXoo.",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wmoku6.xpm b/interface/xpms/wmoku6.xpm
new file mode 100644 (file)
index 0000000..5273c0b
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+".&%%%%$$$$oooXXXOOO++++OOOXXo ",
+".&&&%%%$$$ooooXXXXOOOOOOOOXoo ",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wmoku7.xpm b/interface/xpms/wmoku7.xpm
new file mode 100644 (file)
index 0000000..6652ed2
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+" &%%%%$$$$oooXXXOOO++++OOOXXo.",
+" &&&%%%$$$ooooXXXXOOOOOOOOXoo.",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"                              "};
diff --git a/interface/xpms/wmoku8.xpm b/interface/xpms/wmoku8.xpm
new file mode 100644 (file)
index 0000000..9b50b46
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+".&%%%%$$$$oooXXXOOO++++OOOXXo.",
+".&&&%%%$$$ooooXXXXOOOOOOOOXoo.",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"                              "};
diff --git a/interface/xpms/wmoku9.xpm b/interface/xpms/wmoku9.xpm
new file mode 100644 (file)
index 0000000..4c999c7
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXXXO++@@@@@++OOXo ",
+" %%%%$$$$ooooXXOO+++@@+++OXXo ",
+".&%%%%$$$$oooXXXOOO++++OOOXXo ",
+".&&&%%%$$$ooooXXXXOOOOOOOOXoo ",
+" &&&%%%%$$$ooooXXXXXOOOOXXXoo ",
+" &&&&%%%$$$$ooooXXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"                              "};
diff --git a/interface/xpms/wpmoku1.xpm b/interface/xpms/wpmoku1.xpm
new file mode 100644 (file)
index 0000000..684e646
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+" &%%%%$$$$oo&....&O++++OOOXXo.",
+" &&&%%%$$$oo&....&OOOOOOOOXoo.",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wpmoku2.xpm b/interface/xpms/wpmoku2.xpm
new file mode 100644 (file)
index 0000000..233af90
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+".&%%%%$$$$oo&....&O++++OOOXXo.",
+".&&&%%%$$$oo&....&OOOOOOOOXoo.",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wpmoku3.xpm b/interface/xpms/wpmoku3.xpm
new file mode 100644 (file)
index 0000000..9a7c158
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"                              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+".&%%%%$$$$oo&....&O++++OOOXXo ",
+".&&&%%%$$$oo&....&OOOOOOOOXoo ",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wpmoku4.xpm b/interface/xpms/wpmoku4.xpm
new file mode 100644 (file)
index 0000000..db25233
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+" &%%%%$$$$oo&....&O++++OOOXXo.",
+" &&&%%%$$$oo&....&OOOOOOOOXoo.",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wpmoku5.xpm b/interface/xpms/wpmoku5.xpm
new file mode 100644 (file)
index 0000000..6698ae9
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+".&%%%%$$$$oo&....&O++++OOOXXo.",
+".&&&%%%$$$oo&....&OOOOOOOOXoo.",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wpmoku6.xpm b/interface/xpms/wpmoku6.xpm
new file mode 100644 (file)
index 0000000..2508d4a
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+".&%%%%$$$$oo&....&O++++OOOXXo ",
+".&&&%%%$$$oo&....&OOOOOOOOXoo ",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"              ..              "};
diff --git a/interface/xpms/wpmoku7.xpm b/interface/xpms/wpmoku7.xpm
new file mode 100644 (file)
index 0000000..c84b4e6
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+" &%%%%$$$$oo&....&O++++OOOXXo.",
+" &&&%%%$$$oo&....&OOOOOOOOXoo.",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"                              "};
diff --git a/interface/xpms/wpmoku8.xpm b/interface/xpms/wpmoku8.xpm
new file mode 100644 (file)
index 0000000..ea9ca82
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+".&%%%%$$$$oo&....&O++++OOOXXo.",
+".&&&%%%$$$oo&....&OOOOOOOOXoo.",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"                              "};
diff --git a/interface/xpms/wpmoku9.xpm b/interface/xpms/wpmoku9.xpm
new file mode 100644 (file)
index 0000000..8073c97
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+/* Copyright 2004 by the Free Software Foundation. See COPYING */
+static char * wmoku5_xpm[] = {
+"30 30 11 1",
+"      c #E79DB2CA4924",
+".     c #000000000000",
+"X     c #CF3CCF3CCF3C",
+"o     c #C71BC71BC71B",
+"O     c #D75CD75CD75C",
+"+     c #DF7DDF7DDF7D",
+"@     c #E79DE79DE79D",
+"#     c #EFBEEFBEEFBE",
+"$     c #BEFBBEFBBEFB",
+"%     c #B6DAB6DAB6DA",
+"&     c #AEBAAEBAAEBA",
+"              ..              ",
+"           XXoooXOX           ",
+"         oXXXXXXOOOOX         ",
+"       XoXXXXXXOOOOOOXX       ",
+"      XooXXXXXOO++++++OX      ",
+"     XoooXXXXOO+++@@@++OX     ",
+"    ooooooXXXOO++@@@@@+++O    ",
+"   XooooooXXXOO+@@###@@+++X   ",
+"   Xoo$oooXXXOO+@@####@@++O   ",
+"  ooo$$$oooXXOO+@@#####@++OO  ",
+"  o$$$$$oooXXOO++@####@@++OO  ",
+" %$$$$$$$oooXXOO+@@@#@@@++OXo ",
+" %%%%$$$$oooXX&&++@@@@@++OOXo ",
+" %%%%$$$$oooo&..&+++@@+++OXXo ",
+".&%%%%$$$$oo&....&O++++OOOXXo ",
+".&&&%%%$$$oo&....&OOOOOOOOXoo ",
+" &&&%%%%$$$oo&..&XXXOOOOXXXoo ",
+" &&&&%%%$$$$oo&&XXXXXXXXXXXoo ",
+" &&&&&%%%$$$$oooooXXXXXXXXooo ",
+"  &&&&&%%$$$$$oooooooXXXXXXo  ",
+"  &&&&&%%%$$$$$ooooooooooXXX  ",
+"   &&&&&&%%%%$$$$$oooooooXX   ",
+"   %&&&&&%%%%%$$$$$$$$oooXX   ",
+"    &&&&&&%%%%%$$$$$$$ooXX    ",
+"     &&&&&&%%%%%%%%%$$ooX     ",
+"      &&&&&&&&%%%%%%%$oo      ",
+"       &&&&&&&&&&%%%%$o       ",
+"         &&&&&&&&&%%$         ",
+"           &&&&&&%%           ",
+"                              "};
diff --git a/makevcdist.pl b/makevcdist.pl
new file mode 100755 (executable)
index 0000000..0bbb424
--- /dev/null
@@ -0,0 +1,110 @@
+#!/usr/bin/perl
+# This script morphs config.h.in into config.vcin
+
+use strict;
+use warnings;
+
+my %defaults =
+ ( CHINESE_RULES => 0,
+   RESIGNATION_ALLOWED => 1,
+   HASHING_SCHEME => 2,
+   DEFAULT_LEVEL => 10,
+   DEFAULT_MEMORY => 8,
+   ENABLE_SOCKET_SUPPORT => 1,
+   ALTERNATE_CONNECTIONS => 1,
+   SEMEAI_NODE_LIMIT => 500,
+   OWL_NODE_LIMIT => 1000,
+   EXPERIMENTAL_SEMEAI => 1,
+   EXPERIMENTAL_OWL_EXT => 0,
+   EXPERIMENTAL_CONNECTIONS => 1,
+   LARGE_SCALE => 0,
+   GRID_OPT => 1,
+   OWL_THREATS => 0,
+   USE_BREAK_IN => 1,
+   COSMIC_GNUGO => 0,
+   ORACLE => 0,
+   USE_VALGRIND => 0,
+   READLINE => 0);
+
+my @skip = qw/
+  GNU_PACKAGE 
+  SIZEOF_INT 
+  SIZEOF_LONG 
+  GNUGO_PATH
+  PACKAGE
+  SIZEOF_INT
+  SIZEOF_LONG
+  const
+  ANSI_COLOR
+  TERMINFO
+  VERSION
+  TIME_WITH_SYS_TIME
+  /;
+
+open (CONFIGH, "config.h.in") or
+      die "Couldn't open config.h.in: $!";
+  
+open (CONFIGVC, ">config.vcin")  or
+      die "Couldn't overwrite config.vcin: $!";
+  
+print CONFIGVC 
+q%/* This is the Microsoft Visual C++ version of config.h        *
+ * Replace the distributed config.h with this file             *
+ * See config.h.in for comments on the meanings of most of the *
+ * defines.  This file is autogenerated.  Do not modify it.    *
+ * See instead, the perl script makevcdist.pl                  */
+
+#define HAVE_CRTDBG_H 1
+#define HAVE_WINSOCK_IO_H 1
+#define HAVE__VSNPRINTF 1
+
+%;
+
+  
+my $comment = "";  
+while (<CONFIGH>) {
+  s/\s*$//ms;
+  if (/^\s*$/) { next; }
+  if (m@^/[*].*@) {
+    $comment = $_;
+    next;
+  }
+  if (/\*\/\s*$/) {
+    $comment .= "\n$_";
+    next;
+  }
+  if (/HAVE_/) { next; }
+  if (! /^#undef\s+([^ ]*)\s*$/ms) {
+    warn "Don't understand: $_";
+    next;
+  }
+  my $define = $1;
+  if (!defined($defaults{$define})) {
+    my $found =0;
+    foreach (@skip) {$found = 1 if $_ eq $define;}
+    warn "Unknown define: $define" unless $found;
+    next;
+  }
+  print CONFIGVC "$comment\n";
+  print CONFIGVC "#define $define $defaults{$define}\n\n";
+}
+
+print CONFIGVC
+q%
+/* Version number of package */
+#define PACKAGE "gnugo"
+
+/* The concatenation of the strings "GNU ", and PACKAGE.  */
+#define GNU_PACKAGE "GNU " PACKAGE
+
+/* The number of bytes in a int.  */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long.  */
+#define SIZEOF_LONG 4
+
+/* Version number of package */
+#define VERSION "@VERSION@"
+
+#pragma warning(disable: 4244 4305)
+%;
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..66e0bbb
--- /dev/null
+++ b/missing
@@ -0,0 +1,283 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing 0.3 - GNU automake"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+       file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit 1
+    fi
+    ;;
+
+  makeinfo)
+    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+       # We have makeinfo, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  tar)
+    shift
+    if test -n "$run"; then
+      echo 1>&2 "ERROR: \`tar' requires --run"
+      exit 1
+    fi
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar ${1+"$@"} && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar ${1+"$@"} && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+       case "$firstarg" in
+       *o*)
+           firstarg=`echo "$firstarg" | sed s/o//`
+           tar "$firstarg" ${1+"$@"} && exit 0
+           ;;
+       esac
+       case "$firstarg" in
+       *h*)
+           firstarg=`echo "$firstarg" | sed s/h//`
+           tar "$firstarg" ${1+"$@"} && exit 0
+           ;;
+       esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..34cffa3
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.1.1 2008/12/21 18:47:57 bump Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/patterns/CMakeLists.txt b/patterns/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5b4dcdf
--- /dev/null
@@ -0,0 +1,237 @@
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/patterns)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/engine)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/sgf)
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/utils)
+
+########### mkpat program ###############
+
+SET(mkpat_SRCS
+    mkpat.c
+    transform.c
+    dfa.c
+    )
+
+ADD_EXECUTABLE(mkpat ${mkpat_SRCS})
+
+TARGET_LINK_LIBRARIES(mkpat utils)
+
+
+########### joseki program ###############
+
+SET(joseki_SRCS
+    joseki.c
+    )
+
+ADD_EXECUTABLE(joseki ${joseki_SRCS})
+
+TARGET_LINK_LIBRARIES(joseki board sgf utils)
+
+
+########### mkeyes program ###############
+
+SET(mkeyes_SRCS
+    mkeyes.c
+    )
+
+ADD_EXECUTABLE(mkeyes ${mkeyes_SRCS})
+
+TARGET_LINK_LIBRARIES(mkeyes utils)
+
+
+########### mkmcpat program ###############
+
+SET(mkmcpat_SRCS
+    mkmcpat.c
+    )
+
+ADD_EXECUTABLE(mkmcpat ${mkmcpat_SRCS})
+
+IF(UNIX)
+    SET(PLATFORM_LIBRARIES m)
+ENDIF(UNIX)
+
+TARGET_LINK_LIBRARIES(mkmcpat engine sgf utils ${PLATFORM_LIBRARIES})
+
+
+########### uncompress_fuseki program ###############
+
+SET(uncompress_fuseki_SRCS
+    uncompress_fuseki.c
+    )
+
+ADD_EXECUTABLE(uncompress_fuseki ${uncompress_fuseki_SRCS})
+
+TARGET_LINK_LIBRARIES(uncompress_fuseki utils board sgf)
+
+
+########### extract_fuseki program ###############
+
+SET(extract_fuseki_SRCS
+    extract_fuseki.c
+    )
+
+ADD_EXECUTABLE(extract_fuseki ${extract_fuseki_SRCS})
+
+TARGET_LINK_LIBRARIES(extract_fuseki engine patterns
+                      engine patterns sgf utils)
+
+
+########### next target ###############
+
+SET(compress_fuseki_SRCS
+    compress_fuseki.c
+    )
+
+ADD_EXECUTABLE(compress_fuseki ${compress_fuseki_SRCS})
+
+TARGET_LINK_LIBRARIES(compress_fuseki)
+
+
+########### Generate files. ##############
+
+GET_TARGET_PROPERTY(JOSEKI_EXE joseki LOCATION)
+GET_TARGET_PROPERTY(MKPAT_EXE mkpat LOCATION)
+GET_TARGET_PROPERTY(MKEYES_EXE mkeyes LOCATION)
+GET_TARGET_PROPERTY(MKMCPAT_EXE mkmcpat LOCATION)
+GET_TARGET_PROPERTY(UNCOMPRESS_FUSEKI_EXE uncompress_fuseki LOCATION)
+
+SET(JOSEKI_INPUTS "")
+SET(JOSEKI_NAMES "")
+SET(GG_BUILT_SOURCES "")
+MACRO(BUILD_JOSEKI NAME PREFIX)
+    ADD_CUSTOM_COMMAND(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.db
+        COMMAND ${JOSEKI_EXE} ${PREFIX}
+               ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.sgf
+                > ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.db
+        DEPENDS joseki ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.sgf
+    )
+    SET(JOSEKI_INPUTS ${JOSEKI_INPUTS}
+                      "-i" ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.db)
+    SET(JOSEKI_NAMES ${JOSEKI_NAMES}
+                     ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.db)
+ENDMACRO(BUILD_JOSEKI)
+
+BUILD_JOSEKI(gogo JG)
+BUILD_JOSEKI(hoshi_keima JHK)
+BUILD_JOSEKI(hoshi_other JHO)
+BUILD_JOSEKI(komoku JK)
+BUILD_JOSEKI(sansan JS)
+BUILD_JOSEKI(mokuhazushi JM)
+BUILD_JOSEKI(takamoku JT)
+
+MACRO(RUN_MKPAT OPTIONS1 OPTIONS2 PATNAME DBNAME CNAME)
+    ADD_CUSTOM_COMMAND(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CNAME}
+        COMMAND ${MKPAT_EXE} ${OPTIONS1} ${OPTIONS2} ${PATNAME}
+                             -i ${CMAKE_CURRENT_SOURCE_DIR}/${DBNAME}
+                             -o ${CMAKE_CURRENT_BINARY_DIR}/${CNAME}
+        DEPENDS mkpat ${CMAKE_CURRENT_SOURCE_DIR}/${DBNAME}
+        )
+    SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/${CNAME})
+ENDMACRO(RUN_MKPAT)
+
+SET(DFAFLAGS -D -m)
+
+MACRO(RUN_MKPAT_DFA OPTIONS PATNAME DTRNAME DBNAME CNAME)
+    ADD_CUSTOM_COMMAND(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CNAME}
+        COMMAND ${MKPAT_EXE} ${DFAFLAGS} ${OPTIONS}
+                             -t ${CMAKE_CURRENT_SOURCE_DIR}/${DTRNAME} ${PATNAME}
+                             -i ${CMAKE_CURRENT_SOURCE_DIR}/${DBNAME}
+                             -o ${CMAKE_CURRENT_BINARY_DIR}/${CNAME}
+        DEPENDS mkpat ${CMAKE_CURRENT_SOURCE_DIR}/${DBNAME}
+                      ${CMAKE_CURRENT_SOURCE_DIR}/${DTRNAME}
+        )
+    SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/${CNAME})
+ENDMACRO(RUN_MKPAT_DFA)
+
+MACRO(RUN_UNCOMPRESS_FUSEKI BOARDSIZE)
+    ADD_CUSTOM_COMMAND(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/fuseki${BOARDSIZE}.c
+        COMMAND ${UNCOMPRESS_FUSEKI_EXE} ${BOARDSIZE}
+                             ${CMAKE_CURRENT_SOURCE_DIR}/fuseki${BOARDSIZE}.dbz
+                             c > ${CMAKE_CURRENT_BINARY_DIR}/fuseki${BOARDSIZE}.c
+        DEPENDS uncompress_fuseki
+                ${CMAKE_CURRENT_SOURCE_DIR}/fuseki${BOARDSIZE}.dbz
+        )
+    SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES}
+                         ${CMAKE_CURRENT_BINARY_DIR}/fuseki${BOARDSIZE}.c)
+ENDMACRO(RUN_UNCOMPRESS_FUSEKI)
+
+# FIXME: It's very ugly that the RUN_MKPAT macro takes two separate
+# option arguments, where one is in most cases eliminated by using "".
+# The problem with just having one option argument is that specifying
+# it as "-c -b" causes the space to be escaped into "-c\ -b". There is
+# probably some trivial workaround for someone who actually knows cmake.
+RUN_MKPAT(-X "" attpat attack.db apatterns.c)
+RUN_MKPAT("" "" defpat defense.db dpatterns.c)
+RUN_MKPAT(-b "" handipat handicap.db handipat.c)
+RUN_MKPAT(-c "" influencepat influence.db influence.c)
+RUN_MKPAT(-c -b barrierspat barriers.db barriers.c)
+RUN_MKPAT(-b "" endpat endgame.db endgame.c)
+RUN_MKPAT(-c "" conn conn.db conn.c)
+RUN_MKPAT(-b "" fusekipat fuseki.db fusekipat.c)
+RUN_MKPAT_DFA(-b aa_attackpat aa_attackpats.dtr aa_attackpats.db aa_attackpat.c)
+RUN_MKPAT_DFA(-b owl_vital_apat owl_vital_apats.dtr owl_vital_apats.db owl_vital_apat.c)
+RUN_MKPAT_DFA(-b owl_attackpat owl_attackpats.dtr owl_attackpats.db owl_attackpat.c)
+RUN_MKPAT_DFA(-b owl_defendpat owl_defendpats.dtr owl_defendpats.db owl_defendpat.c)
+RUN_UNCOMPRESS_FUSEKI(9)
+RUN_UNCOMPRESS_FUSEKI(13)
+RUN_UNCOMPRESS_FUSEKI(19)
+
+ADD_CUSTOM_COMMAND(
+   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/josekidb.c
+   COMMAND ${MKPAT_EXE} -C joseki ${JOSEKI_INPUTS}
+                        -o ${CMAKE_CURRENT_BINARY_DIR}/josekidb.c
+   DEPENDS mkpat ${JOSEKI_NAMES}
+   )
+SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES}
+                     ${CMAKE_CURRENT_BINARY_DIR}/josekidb.c)
+
+ADD_CUSTOM_COMMAND(
+   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/patterns.c
+   COMMAND ${MKPAT_EXE} -b pat -i ${CMAKE_CURRENT_SOURCE_DIR}/patterns.db
+                               -i ${CMAKE_CURRENT_SOURCE_DIR}/patterns2.db
+                               -o ${CMAKE_CURRENT_BINARY_DIR}/patterns.c
+   DEPENDS mkpat ${CMAKE_CURRENT_SOURCE_DIR}/patterns.db
+                 ${CMAKE_CURRENT_SOURCE_DIR}/patterns2.db
+   )
+SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES}
+                     ${CMAKE_CURRENT_BINARY_DIR}/patterns.c)
+
+ADD_CUSTOM_COMMAND(
+   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/eyes.c
+   COMMAND ${MKEYES_EXE} < ${CMAKE_CURRENT_SOURCE_DIR}/eyes.db
+                         > ${CMAKE_CURRENT_BINARY_DIR}/eyes.c
+   DEPENDS mkeyes ${CMAKE_CURRENT_SOURCE_DIR}/eyes.db
+   )
+SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/eyes.c)
+
+ADD_CUSTOM_COMMAND(
+   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mcpat.c
+   COMMAND ${MKMCPAT_EXE} ${CMAKE_CURRENT_SOURCE_DIR}/mc_montegnu_classic.db
+                          ${CMAKE_CURRENT_SOURCE_DIR}/mc_mogo_classic.db
+                          ${CMAKE_CURRENT_SOURCE_DIR}/mc_uniform.db
+                         > ${CMAKE_CURRENT_BINARY_DIR}/mcpat.c
+   DEPENDS mkmcpat ${CMAKE_CURRENT_SOURCE_DIR}/mkmcpat.c
+                   ${CMAKE_CURRENT_SOURCE_DIR}/mc_montegnu_classic.db
+                   ${CMAKE_CURRENT_SOURCE_DIR}/mc_mogo_classic.db
+                   ${CMAKE_CURRENT_SOURCE_DIR}/mc_uniform.db
+   )
+
+SET(GG_BUILT_SOURCES ${GG_BUILT_SOURCES}
+                     ${CMAKE_CURRENT_BINARY_DIR}/mcpat.c)
+
+
+
+########### patterns library ###############
+
+SET(patterns_STAT_SRCS
+    connections.c
+    helpers.c
+    transform.c
+    ${GG_BUILT_SOURCES}
+    )
+
+ADD_LIBRARY(patterns STATIC ${patterns_STAT_SRCS})
diff --git a/patterns/Makefile.am b/patterns/Makefile.am
new file mode 100644 (file)
index 0000000..21632ba
--- /dev/null
@@ -0,0 +1,209 @@
+noinst_PROGRAMS = mkpat joseki mkeyes uncompress_fuseki mkmcpat
+EXTRA_PROGRAMS = extract_fuseki compress_fuseki
+
+DSP = dfa.dsp patterns.dsp joseki.dsp mkeyes.dsp mkpat.dsp fuseki.dsp uncompress_fuseki.dsp mkmcpat.dsp
+DTR = aa_attackpats.dtr owl_attackpats.dtr owl_defendpats.dtr \
+       owl_vital_apats.dtr
+
+EXTRA_DIST = $(DSP)\
+        $(DTR)\
+       dfa.c\
+       gnugo-db.el\
+        hoshi_keima.sgf\
+        komoku.sgf\
+        gogo.sgf\
+        hoshi_other.sgf\
+        mokuhazushi.sgf\
+        takamoku.sgf\
+        sansan.sgf\
+        aa_attackpats.db\
+        attack.db\
+        barriers.db\
+        conn.db\
+        defense.db\
+        endgame.db\
+        eyes.db\
+        fuseki.db\
+        gogo.db\
+        handicap.db\
+        hoshi_keima.db\
+        hoshi_other.db\
+        influence.db\
+        komoku.db\
+        mc_mogo_classic.db\
+        mc_montegnu_classic.db\
+        mc_uniform.db\
+        mokuhazushi.db\
+        oracle.db\
+        owl_attackpats.db\
+        owl_defendpats.db\
+        owl_vital_apats.db\
+        patterns2.db\
+        patterns.db\
+        sansan.db\
+        takamoku.db\
+       fuseki13.dbz\
+       fuseki19.dbz\
+       fuseki9.dbz\
+       CMakeLists.txt
+
+mkpat_SOURCES  = mkpat.c transform.c dfa.c
+
+mkpat_LDADD = ../utils/libutils.a
+
+if DFA_ENABLED
+DFAFLAGS = -D -m
+else
+DFAFLAGS =
+endif
+
+joseki_SOURCES = joseki.c 
+joseki_LDADD = ../engine/libboard.a ../sgf/libsgf.a ../utils/libutils.a 
+joseki_AM_CPPFLAGS = $(GNU_GO_WARNINGS) -I$(top_srcdir)/sgf
+mkeyes_SOURCES = mkeyes.c
+mkeyes_LDADD = ../utils/libutils.a
+mkmcpat_SOURCES  = mkmcpat.c ../engine/globals.c
+mkmcpat_LDADD = ../engine/libengine.a ../sgf/libsgf.a ../utils/libutils.a
+mkmcpat_AM_CPPFLAGS = $(GNU_GO_WARNINGS)
+extract_fuseki_SOURCES  = extract_fuseki.c
+# Yes, we currently need duplicate libengine.a and libpatterns.a.
+extract_fuseki_LDADD = ../engine/libengine.a libpatterns.a\
+                      ../engine/libengine.a libpatterns.a\
+                       ../sgf/libsgf.a ../utils/libutils.a
+extract_fuseki_AM_CPPFLAGS = $(GNU_GO_WARNINGS) -I$(top_srcdir)/sgf
+
+uncompress_fuseki_SOURCES = uncompress_fuseki.c
+uncompress_fuseki_LDADD = ../utils/libutils.a ../engine/libboard.a ../sgf/libsgf.a
+compress_fuseki_SOURCES = compress_fuseki.c
+
+noinst_HEADERS = patterns.h eyes.h dfa.h dfa-mkpat.h
+
+GGBUILTSOURCES = conn.c patterns.c apatterns.c dpatterns.c eyes.c\
+                 influence.c barriers.c endgame.c aa_attackpat.c\
+                 owl_attackpat.c\
+                owl_vital_apat.c owl_defendpat.c fusekipat.c\
+                 fuseki9.c fuseki13.c fuseki19.c josekidb.c\
+                handipat.c oraclepat.c mcpat.c
+
+DBBUILT = gogo.db hoshi_keima.db hoshi_other.db komoku.db sansan.db \
+         mokuhazushi.db takamoku.db
+
+DBBUILT_INPUT = -i gogo.db -i hoshi_keima.db -i hoshi_other.db -i komoku.db \
+               -i sansan.db -i mokuhazushi.db -i takamoku.db
+
+MC_DB = $(srcdir)/mc_montegnu_classic.db $(srcdir)/mc_mogo_classic.db \
+        $(srcdir)/mc_uniform.db
+
+DB_TO_TAG = aa_attackpats.db attack.db barriers.db conn.db defense.db\
+           endgame.db eyes.db fuseki.db fuseki9.dbz fuseki13.dbz fuseki19.dbz\
+           handicap.db influence.db oracle.db owl_attackpats.db\
+           owl_defendpats.db owl_vital_apats.db patterns.db patterns2.db\
+           $(DBBUILT)
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = $(GGBUILTSOURCES) $(DBBUILT) *~
+
+dist-hook:
+       cd $(distdir) && rm $(GGBUILTSOURCES)
+
+# source files in this directory get access to private prototypes
+AM_CPPFLAGS = \
+       $(GNU_GO_WARNINGS) \
+       -I$(top_srcdir)/engine \
+       -I$(top_srcdir)/utils \
+       -I$(top_srcdir)/sgf
+
+noinst_LIBRARIES = libpatterns.a
+
+libpatterns_a_SOURCES = connections.c helpers.c transform.c $(GGBUILTSOURCES)
+
+gogo.db : $(srcdir)/gogo.sgf joseki$(EXEEXT)
+       ./joseki JG $(srcdir)/gogo.sgf >gogo.db
+
+hoshi_keima.db : $(srcdir)/hoshi_keima.sgf joseki$(EXEEXT)
+       ./joseki JHK $(srcdir)/hoshi_keima.sgf >hoshi_keima.db
+
+hoshi_other.db : $(srcdir)/hoshi_other.sgf joseki$(EXEEXT)
+       ./joseki JHO $(srcdir)/hoshi_other.sgf >hoshi_other.db
+
+komoku.db : $(srcdir)/komoku.sgf joseki$(EXEEXT)
+       ./joseki JK $(srcdir)/komoku.sgf >komoku.db
+
+sansan.db : $(srcdir)/sansan.sgf joseki$(EXEEXT)
+       ./joseki JS $(srcdir)/sansan.sgf >sansan.db
+
+mokuhazushi.db : $(srcdir)/mokuhazushi.sgf joseki$(EXEEXT)
+       ./joseki JM $(srcdir)/mokuhazushi.sgf >mokuhazushi.db
+
+takamoku.db : $(srcdir)/takamoku.sgf joseki$(EXEEXT)
+       ./joseki JT $(srcdir)/takamoku.sgf >takamoku.db
+
+patterns.c : $(srcdir)/patterns.db $(srcdir)/patterns2.db mkpat$(EXEEXT)
+       ./mkpat -b pat -i $(srcdir)/patterns.db -i$(srcdir)/patterns2.db \
+               -o patterns.c
+
+josekidb.c : $(DBBUILT) mkpat$(EXEEXT)
+       ./mkpat -C joseki $(DBBUILT_INPUT) -o josekidb.c
+
+apatterns.c : $(srcdir)/attack.db mkpat$(EXEEXT)
+       ./mkpat -X attpat -i $(srcdir)/attack.db -o apatterns.c
+
+dpatterns.c : $(srcdir)/defense.db mkpat$(EXEEXT)
+       ./mkpat defpat -i $(srcdir)/defense.db -o dpatterns.c
+
+conn.c : $(srcdir)/conn.db mkpat$(EXEEXT)
+       ./mkpat -c conn -i $(srcdir)/conn.db -o conn.c
+
+endgame.c : $(srcdir)/endgame.db mkpat$(EXEEXT)
+       ./mkpat -b endpat -i $(srcdir)/endgame.db -o endgame.c
+
+eyes.c: $(srcdir)/eyes.db mkeyes$(EXEEXT)
+       ./mkeyes < $(srcdir)/eyes.db >eyes.c
+
+influence.c : $(srcdir)/influence.db mkpat$(EXEEXT)
+       ./mkpat -c influencepat -i $(srcdir)/influence.db -o influence.c
+
+barriers.c : $(srcdir)/barriers.db mkpat$(EXEEXT)
+       ./mkpat -c -b barrierspat -i $(srcdir)/barriers.db -o barriers.c
+
+aa_attackpat.c : $(srcdir)/aa_attackpats.db $(srcdir)/aa_attackpats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/aa_attackpats.dtr aa_attackpat \
+               -i $(srcdir)/aa_attackpats.db -o aa_attackpat.c
+
+owl_attackpat.c : $(srcdir)/owl_attackpats.db $(srcdir)/owl_attackpats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/owl_attackpats.dtr owl_attackpat \
+               -i $(srcdir)/owl_attackpats.db -o owl_attackpat.c
+
+oraclepat.c : $(srcdir)/oracle.db mkpat$(EXEEXT)
+       ./mkpat -b oracle -i $(srcdir)/oracle.db -o oraclepat.c
+
+owl_vital_apat.c : $(srcdir)/owl_vital_apats.db $(srcdir)/owl_vital_apats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/owl_vital_apats.dtr owl_vital_apat \
+               -i $(srcdir)/owl_vital_apats.db -o owl_vital_apat.c
+
+owl_defendpat.c : $(srcdir)/owl_defendpats.db $(srcdir)/owl_defendpats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/owl_defendpats.dtr owl_defendpat \
+               -i $(srcdir)/owl_defendpats.db -o owl_defendpat.c
+
+fusekipat.c : $(srcdir)/fuseki.db mkpat$(EXEEXT)
+       ./mkpat -b fusekipat -i $(srcdir)/fuseki.db -o fusekipat.c
+
+fuseki9.c : $(srcdir)/fuseki9.dbz uncompress_fuseki$(EXEEXT)
+       ./uncompress_fuseki 9 $(srcdir)/fuseki9.dbz c >fuseki9.c
+
+fuseki13.c : $(srcdir)/fuseki13.dbz uncompress_fuseki$(EXEEXT)
+       ./uncompress_fuseki 13 $(srcdir)/fuseki13.dbz c >fuseki13.c
+
+fuseki19.c : $(srcdir)/fuseki19.dbz uncompress_fuseki$(EXEEXT)
+       ./uncompress_fuseki 19 $(srcdir)/fuseki19.dbz c >fuseki19.c
+
+handipat.c : $(srcdir)/handicap.db mkpat$(EXEEXT)
+       ./mkpat -b handipat -i $(srcdir)/handicap.db -o handipat.c
+
+mcpat.c : $(MC_DB) mkmcpat$(EXEEXT)
+       ./mkmcpat $(MC_DB) > mcpat.c
+
+
+ETAGS_ARGS = --language none --regex '/^Pattern[ \t]+[a-zA-Z0-9]+/' $(DB_TO_TAG)\
+            --language auto --no-regex
+TAGS_DEPENDENCIES = $(DB_TO_TAG)
diff --git a/patterns/Makefile.in b/patterns/Makefile.in
new file mode 100644 (file)
index 0000000..9d5fa84
--- /dev/null
@@ -0,0 +1,703 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+noinst_PROGRAMS = mkpat$(EXEEXT) joseki$(EXEEXT) mkeyes$(EXEEXT) \
+       uncompress_fuseki$(EXEEXT) mkmcpat$(EXEEXT)
+EXTRA_PROGRAMS = extract_fuseki$(EXEEXT) compress_fuseki$(EXEEXT)
+subdir = patterns
+DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libpatterns_a_AR = $(AR) $(ARFLAGS)
+libpatterns_a_LIBADD =
+am__objects_1 = conn.$(OBJEXT) patterns.$(OBJEXT) apatterns.$(OBJEXT) \
+       dpatterns.$(OBJEXT) eyes.$(OBJEXT) influence.$(OBJEXT) \
+       barriers.$(OBJEXT) endgame.$(OBJEXT) aa_attackpat.$(OBJEXT) \
+       owl_attackpat.$(OBJEXT) owl_vital_apat.$(OBJEXT) \
+       owl_defendpat.$(OBJEXT) fusekipat.$(OBJEXT) fuseki9.$(OBJEXT) \
+       fuseki13.$(OBJEXT) fuseki19.$(OBJEXT) josekidb.$(OBJEXT) \
+       handipat.$(OBJEXT) oraclepat.$(OBJEXT) mcpat.$(OBJEXT)
+am_libpatterns_a_OBJECTS = connections.$(OBJEXT) helpers.$(OBJEXT) \
+       transform.$(OBJEXT) $(am__objects_1)
+libpatterns_a_OBJECTS = $(am_libpatterns_a_OBJECTS)
+PROGRAMS = $(noinst_PROGRAMS)
+am_compress_fuseki_OBJECTS = compress_fuseki.$(OBJEXT)
+compress_fuseki_OBJECTS = $(am_compress_fuseki_OBJECTS)
+compress_fuseki_LDADD = $(LDADD)
+am_extract_fuseki_OBJECTS = extract_fuseki.$(OBJEXT)
+extract_fuseki_OBJECTS = $(am_extract_fuseki_OBJECTS)
+extract_fuseki_DEPENDENCIES = ../engine/libengine.a libpatterns.a \
+       ../engine/libengine.a libpatterns.a ../sgf/libsgf.a \
+       ../utils/libutils.a
+am_joseki_OBJECTS = joseki.$(OBJEXT)
+joseki_OBJECTS = $(am_joseki_OBJECTS)
+joseki_DEPENDENCIES = ../engine/libboard.a ../sgf/libsgf.a \
+       ../utils/libutils.a
+am_mkeyes_OBJECTS = mkeyes.$(OBJEXT)
+mkeyes_OBJECTS = $(am_mkeyes_OBJECTS)
+mkeyes_DEPENDENCIES = ../utils/libutils.a
+am_mkmcpat_OBJECTS = mkmcpat.$(OBJEXT) globals.$(OBJEXT)
+mkmcpat_OBJECTS = $(am_mkmcpat_OBJECTS)
+mkmcpat_DEPENDENCIES = ../engine/libengine.a ../sgf/libsgf.a \
+       ../utils/libutils.a
+am_mkpat_OBJECTS = mkpat.$(OBJEXT) transform.$(OBJEXT) dfa.$(OBJEXT)
+mkpat_OBJECTS = $(am_mkpat_OBJECTS)
+mkpat_DEPENDENCIES = ../utils/libutils.a
+am_uncompress_fuseki_OBJECTS = uncompress_fuseki.$(OBJEXT)
+uncompress_fuseki_OBJECTS = $(am_uncompress_fuseki_OBJECTS)
+uncompress_fuseki_DEPENDENCIES = ../utils/libutils.a \
+       ../engine/libboard.a ../sgf/libsgf.a
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libpatterns_a_SOURCES) $(compress_fuseki_SOURCES) \
+       $(extract_fuseki_SOURCES) $(joseki_SOURCES) $(mkeyes_SOURCES) \
+       $(mkmcpat_SOURCES) $(mkpat_SOURCES) \
+       $(uncompress_fuseki_SOURCES)
+DIST_SOURCES = $(libpatterns_a_SOURCES) $(compress_fuseki_SOURCES) \
+       $(extract_fuseki_SOURCES) $(joseki_SOURCES) $(mkeyes_SOURCES) \
+       $(mkmcpat_SOURCES) $(mkpat_SOURCES) \
+       $(uncompress_fuseki_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+DSP = dfa.dsp patterns.dsp joseki.dsp mkeyes.dsp mkpat.dsp fuseki.dsp uncompress_fuseki.dsp mkmcpat.dsp
+DTR = aa_attackpats.dtr owl_attackpats.dtr owl_defendpats.dtr \
+       owl_vital_apats.dtr
+
+EXTRA_DIST = $(DSP)\
+        $(DTR)\
+       dfa.c\
+       gnugo-db.el\
+        hoshi_keima.sgf\
+        komoku.sgf\
+        gogo.sgf\
+        hoshi_other.sgf\
+        mokuhazushi.sgf\
+        takamoku.sgf\
+        sansan.sgf\
+        aa_attackpats.db\
+        attack.db\
+        barriers.db\
+        conn.db\
+        defense.db\
+        endgame.db\
+        eyes.db\
+        fuseki.db\
+        gogo.db\
+        handicap.db\
+        hoshi_keima.db\
+        hoshi_other.db\
+        influence.db\
+        komoku.db\
+        mc_mogo_classic.db\
+        mc_montegnu_classic.db\
+        mc_uniform.db\
+        mokuhazushi.db\
+        oracle.db\
+        owl_attackpats.db\
+        owl_defendpats.db\
+        owl_vital_apats.db\
+        patterns2.db\
+        patterns.db\
+        sansan.db\
+        takamoku.db\
+       fuseki13.dbz\
+       fuseki19.dbz\
+       fuseki9.dbz\
+       CMakeLists.txt
+
+mkpat_SOURCES = mkpat.c transform.c dfa.c
+mkpat_LDADD = ../utils/libutils.a
+@DFA_ENABLED_FALSE@DFAFLAGS = 
+@DFA_ENABLED_TRUE@DFAFLAGS = -D -m
+joseki_SOURCES = joseki.c 
+joseki_LDADD = ../engine/libboard.a ../sgf/libsgf.a ../utils/libutils.a 
+joseki_AM_CPPFLAGS = $(GNU_GO_WARNINGS) -I$(top_srcdir)/sgf
+mkeyes_SOURCES = mkeyes.c
+mkeyes_LDADD = ../utils/libutils.a
+mkmcpat_SOURCES = mkmcpat.c ../engine/globals.c
+mkmcpat_LDADD = ../engine/libengine.a ../sgf/libsgf.a ../utils/libutils.a
+mkmcpat_AM_CPPFLAGS = $(GNU_GO_WARNINGS)
+extract_fuseki_SOURCES = extract_fuseki.c
+# Yes, we currently need duplicate libengine.a and libpatterns.a.
+extract_fuseki_LDADD = ../engine/libengine.a libpatterns.a\
+                      ../engine/libengine.a libpatterns.a\
+                       ../sgf/libsgf.a ../utils/libutils.a
+
+extract_fuseki_AM_CPPFLAGS = $(GNU_GO_WARNINGS) -I$(top_srcdir)/sgf
+uncompress_fuseki_SOURCES = uncompress_fuseki.c
+uncompress_fuseki_LDADD = ../utils/libutils.a ../engine/libboard.a ../sgf/libsgf.a
+compress_fuseki_SOURCES = compress_fuseki.c
+noinst_HEADERS = patterns.h eyes.h dfa.h dfa-mkpat.h
+GGBUILTSOURCES = conn.c patterns.c apatterns.c dpatterns.c eyes.c\
+                 influence.c barriers.c endgame.c aa_attackpat.c\
+                 owl_attackpat.c\
+                owl_vital_apat.c owl_defendpat.c fusekipat.c\
+                 fuseki9.c fuseki13.c fuseki19.c josekidb.c\
+                handipat.c oraclepat.c mcpat.c
+
+DBBUILT = gogo.db hoshi_keima.db hoshi_other.db komoku.db sansan.db \
+         mokuhazushi.db takamoku.db
+
+DBBUILT_INPUT = -i gogo.db -i hoshi_keima.db -i hoshi_other.db -i komoku.db \
+               -i sansan.db -i mokuhazushi.db -i takamoku.db
+
+MC_DB = $(srcdir)/mc_montegnu_classic.db $(srcdir)/mc_mogo_classic.db \
+        $(srcdir)/mc_uniform.db
+
+DB_TO_TAG = aa_attackpats.db attack.db barriers.db conn.db defense.db\
+           endgame.db eyes.db fuseki.db fuseki9.dbz fuseki13.dbz fuseki19.dbz\
+           handicap.db influence.db oracle.db owl_attackpats.db\
+           owl_defendpats.db owl_vital_apats.db patterns.db patterns2.db\
+           $(DBBUILT)
+
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = $(GGBUILTSOURCES) $(DBBUILT) *~
+
+# source files in this directory get access to private prototypes
+AM_CPPFLAGS = \
+       $(GNU_GO_WARNINGS) \
+       -I$(top_srcdir)/engine \
+       -I$(top_srcdir)/utils \
+       -I$(top_srcdir)/sgf
+
+noinst_LIBRARIES = libpatterns.a
+libpatterns_a_SOURCES = connections.c helpers.c transform.c $(GGBUILTSOURCES)
+ETAGS_ARGS = --language none --regex '/^Pattern[ \t]+[a-zA-Z0-9]+/' $(DB_TO_TAG)\
+            --language auto --no-regex
+
+TAGS_DEPENDENCIES = $(DB_TO_TAG)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  patterns/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  patterns/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libpatterns.a: $(libpatterns_a_OBJECTS) $(libpatterns_a_DEPENDENCIES) 
+       -rm -f libpatterns.a
+       $(libpatterns_a_AR) libpatterns.a $(libpatterns_a_OBJECTS) $(libpatterns_a_LIBADD)
+       $(RANLIB) libpatterns.a
+
+clean-noinstPROGRAMS:
+       -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+compress_fuseki$(EXEEXT): $(compress_fuseki_OBJECTS) $(compress_fuseki_DEPENDENCIES) 
+       @rm -f compress_fuseki$(EXEEXT)
+       $(LINK) $(compress_fuseki_LDFLAGS) $(compress_fuseki_OBJECTS) $(compress_fuseki_LDADD) $(LIBS)
+extract_fuseki$(EXEEXT): $(extract_fuseki_OBJECTS) $(extract_fuseki_DEPENDENCIES) 
+       @rm -f extract_fuseki$(EXEEXT)
+       $(LINK) $(extract_fuseki_LDFLAGS) $(extract_fuseki_OBJECTS) $(extract_fuseki_LDADD) $(LIBS)
+joseki$(EXEEXT): $(joseki_OBJECTS) $(joseki_DEPENDENCIES) 
+       @rm -f joseki$(EXEEXT)
+       $(LINK) $(joseki_LDFLAGS) $(joseki_OBJECTS) $(joseki_LDADD) $(LIBS)
+mkeyes$(EXEEXT): $(mkeyes_OBJECTS) $(mkeyes_DEPENDENCIES) 
+       @rm -f mkeyes$(EXEEXT)
+       $(LINK) $(mkeyes_LDFLAGS) $(mkeyes_OBJECTS) $(mkeyes_LDADD) $(LIBS)
+mkmcpat$(EXEEXT): $(mkmcpat_OBJECTS) $(mkmcpat_DEPENDENCIES) 
+       @rm -f mkmcpat$(EXEEXT)
+       $(LINK) $(mkmcpat_LDFLAGS) $(mkmcpat_OBJECTS) $(mkmcpat_LDADD) $(LIBS)
+mkpat$(EXEEXT): $(mkpat_OBJECTS) $(mkpat_DEPENDENCIES) 
+       @rm -f mkpat$(EXEEXT)
+       $(LINK) $(mkpat_LDFLAGS) $(mkpat_OBJECTS) $(mkpat_LDADD) $(LIBS)
+uncompress_fuseki$(EXEEXT): $(uncompress_fuseki_OBJECTS) $(uncompress_fuseki_DEPENDENCIES) 
+       @rm -f uncompress_fuseki$(EXEEXT)
+       $(LINK) $(uncompress_fuseki_LDFLAGS) $(uncompress_fuseki_OBJECTS) $(uncompress_fuseki_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aa_attackpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apatterns.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/barriers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress_fuseki.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conn.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connections.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dfa.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dpatterns.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/endgame.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract_fuseki.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eyes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuseki13.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuseki19.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuseki9.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fusekipat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handipat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helpers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/influence.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/joseki.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/josekidb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkeyes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkmcpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oraclepat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/owl_attackpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/owl_defendpat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/owl_vital_apat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/patterns.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uncompress_fuseki.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+globals.o: ../engine/globals.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT globals.o -MD -MP -MF "$(DEPDIR)/globals.Tpo" -c -o globals.o `test -f '../engine/globals.c' || echo '$(srcdir)/'`../engine/globals.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/globals.Tpo" "$(DEPDIR)/globals.Po"; else rm -f "$(DEPDIR)/globals.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='../engine/globals.c' object='globals.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o globals.o `test -f '../engine/globals.c' || echo '$(srcdir)/'`../engine/globals.c
+
+globals.obj: ../engine/globals.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT globals.obj -MD -MP -MF "$(DEPDIR)/globals.Tpo" -c -o globals.obj `if test -f '../engine/globals.c'; then $(CYGPATH_W) '../engine/globals.c'; else $(CYGPATH_W) '$(srcdir)/../engine/globals.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/globals.Tpo" "$(DEPDIR)/globals.Po"; else rm -f "$(DEPDIR)/globals.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='../engine/globals.c' object='globals.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o globals.obj `if test -f '../engine/globals.c'; then $(CYGPATH_W) '../engine/globals.c'; else $(CYGPATH_W) '$(srcdir)/../engine/globals.c'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES clean-noinstPROGRAMS ctags dist-hook \
+       distclean distclean-compile distclean-generic distclean-tags \
+       distdir dvi dvi-am html html-am info info-am install \
+       install-am install-data install-data-am install-exec \
+       install-exec-am install-info install-info-am install-man \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags uninstall uninstall-am uninstall-info-am
+
+
+dist-hook:
+       cd $(distdir) && rm $(GGBUILTSOURCES)
+
+gogo.db : $(srcdir)/gogo.sgf joseki$(EXEEXT)
+       ./joseki JG $(srcdir)/gogo.sgf >gogo.db
+
+hoshi_keima.db : $(srcdir)/hoshi_keima.sgf joseki$(EXEEXT)
+       ./joseki JHK $(srcdir)/hoshi_keima.sgf >hoshi_keima.db
+
+hoshi_other.db : $(srcdir)/hoshi_other.sgf joseki$(EXEEXT)
+       ./joseki JHO $(srcdir)/hoshi_other.sgf >hoshi_other.db
+
+komoku.db : $(srcdir)/komoku.sgf joseki$(EXEEXT)
+       ./joseki JK $(srcdir)/komoku.sgf >komoku.db
+
+sansan.db : $(srcdir)/sansan.sgf joseki$(EXEEXT)
+       ./joseki JS $(srcdir)/sansan.sgf >sansan.db
+
+mokuhazushi.db : $(srcdir)/mokuhazushi.sgf joseki$(EXEEXT)
+       ./joseki JM $(srcdir)/mokuhazushi.sgf >mokuhazushi.db
+
+takamoku.db : $(srcdir)/takamoku.sgf joseki$(EXEEXT)
+       ./joseki JT $(srcdir)/takamoku.sgf >takamoku.db
+
+patterns.c : $(srcdir)/patterns.db $(srcdir)/patterns2.db mkpat$(EXEEXT)
+       ./mkpat -b pat -i $(srcdir)/patterns.db -i$(srcdir)/patterns2.db \
+               -o patterns.c
+
+josekidb.c : $(DBBUILT) mkpat$(EXEEXT)
+       ./mkpat -C joseki $(DBBUILT_INPUT) -o josekidb.c
+
+apatterns.c : $(srcdir)/attack.db mkpat$(EXEEXT)
+       ./mkpat -X attpat -i $(srcdir)/attack.db -o apatterns.c
+
+dpatterns.c : $(srcdir)/defense.db mkpat$(EXEEXT)
+       ./mkpat defpat -i $(srcdir)/defense.db -o dpatterns.c
+
+conn.c : $(srcdir)/conn.db mkpat$(EXEEXT)
+       ./mkpat -c conn -i $(srcdir)/conn.db -o conn.c
+
+endgame.c : $(srcdir)/endgame.db mkpat$(EXEEXT)
+       ./mkpat -b endpat -i $(srcdir)/endgame.db -o endgame.c
+
+eyes.c: $(srcdir)/eyes.db mkeyes$(EXEEXT)
+       ./mkeyes < $(srcdir)/eyes.db >eyes.c
+
+influence.c : $(srcdir)/influence.db mkpat$(EXEEXT)
+       ./mkpat -c influencepat -i $(srcdir)/influence.db -o influence.c
+
+barriers.c : $(srcdir)/barriers.db mkpat$(EXEEXT)
+       ./mkpat -c -b barrierspat -i $(srcdir)/barriers.db -o barriers.c
+
+aa_attackpat.c : $(srcdir)/aa_attackpats.db $(srcdir)/aa_attackpats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/aa_attackpats.dtr aa_attackpat \
+               -i $(srcdir)/aa_attackpats.db -o aa_attackpat.c
+
+owl_attackpat.c : $(srcdir)/owl_attackpats.db $(srcdir)/owl_attackpats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/owl_attackpats.dtr owl_attackpat \
+               -i $(srcdir)/owl_attackpats.db -o owl_attackpat.c
+
+oraclepat.c : $(srcdir)/oracle.db mkpat$(EXEEXT)
+       ./mkpat -b oracle -i $(srcdir)/oracle.db -o oraclepat.c
+
+owl_vital_apat.c : $(srcdir)/owl_vital_apats.db $(srcdir)/owl_vital_apats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/owl_vital_apats.dtr owl_vital_apat \
+               -i $(srcdir)/owl_vital_apats.db -o owl_vital_apat.c
+
+owl_defendpat.c : $(srcdir)/owl_defendpats.db $(srcdir)/owl_defendpats.dtr mkpat$(EXEEXT)
+       ./mkpat $(DFAFLAGS) -b -t $(srcdir)/owl_defendpats.dtr owl_defendpat \
+               -i $(srcdir)/owl_defendpats.db -o owl_defendpat.c
+
+fusekipat.c : $(srcdir)/fuseki.db mkpat$(EXEEXT)
+       ./mkpat -b fusekipat -i $(srcdir)/fuseki.db -o fusekipat.c
+
+fuseki9.c : $(srcdir)/fuseki9.dbz uncompress_fuseki$(EXEEXT)
+       ./uncompress_fuseki 9 $(srcdir)/fuseki9.dbz c >fuseki9.c
+
+fuseki13.c : $(srcdir)/fuseki13.dbz uncompress_fuseki$(EXEEXT)
+       ./uncompress_fuseki 13 $(srcdir)/fuseki13.dbz c >fuseki13.c
+
+fuseki19.c : $(srcdir)/fuseki19.dbz uncompress_fuseki$(EXEEXT)
+       ./uncompress_fuseki 19 $(srcdir)/fuseki19.dbz c >fuseki19.c
+
+handipat.c : $(srcdir)/handicap.db mkpat$(EXEEXT)
+       ./mkpat -b handipat -i $(srcdir)/handicap.db -o handipat.c
+
+mcpat.c : $(MC_DB) mkmcpat$(EXEEXT)
+       ./mkmcpat $(MC_DB) > mcpat.c
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/patterns/README b/patterns/README
new file mode 100644 (file)
index 0000000..660e4db
--- /dev/null
@@ -0,0 +1,20 @@
+The pattern file patterns.db determines GNU Go's personality.
+Due to autohelpers, even a nonprogrammer could write powerful
+patterns which might make GNU Go stronger. Consult the Texinfo
+documentation for more information, or write to gnugo@gnu.org.
+
+The SGF format files in this directory, fuseki2.sgf, hoshi.sgf,
+komoku.sgf, sansan.sgf, mokuhazushi.sgf and takamoku.sgf comprise
+GNU Go's Joseki database. These files are Copyright 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 and 2009 by 
+the Free Software Foundation.
+
+You may redistribute or modify them under the terms of the GNU
+General Public License as published by the Free Software
+Foundation - version 3, or (at your option) any later version.
+If you redistribute them, this notice should be distributed with them.
+You should have received a copy of the GNU General Public     
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       
+Boston, MA 02111, USA                                         
diff --git a/patterns/aa_attackpats.db b/patterns/aa_attackpats.db
new file mode 100644 (file)
index 0000000..bee10fb
--- /dev/null
@@ -0,0 +1,474 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The atari_atari attack pattern database.
+#
+#  Further documentation may be found in the Texinfo documentation.
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  In the second field (classification) the following pattern attributes
+#  are possible. Friendly stones are 'O', opponent stones are 'X'.
+# 
+# s  :  "Sacrifice" pattern. Allow sacrifice through self atari.
+#       Notice that this is different from the usual meaning of the
+#       s classification since all but a few moves in an atari_atari
+#       sequence are expected to be sacrifices.
+#
+# c  :  "Conditional" pattern. Don't accept the move unless it is also
+#       found by a non-conditional pattern or by one more conditional
+#       pattern that threatens some other string.
+# 
+#########################################################
+
+
+attribute_map none
+
+goal_elements Xx
+callback_data X
+
+
+Pattern A1
+
+X*
+
+:-,-
+
+A*
+
+;lib(A) == 2
+
+
+Pattern A2
+
+xXOXx
+..X*.
+.....
+-----
+
+:8,-
+
+
+Pattern A3
+
+OX
+X*
+X.
+xx
+--
+
+:8,-
+
+
+Pattern A4
+
+?X
+O*
+X.
+xx
+--
+
+:8,-
+
+
+Pattern A5
+
+?O?
+X*X
+...
+---
+
+:|,-
+
+
+Pattern A6
+
+*.X
+oXO
+
+:8,c
+
+*.X
+oXO
+
+;olib(*)>3
+
+
+Pattern A7
+
+X.X      reduce eyespace
+X*X
+OXO
+
+:|,s
+
+
+Pattern A7b
+# gf New pattern. (3.5.10)
+
+|.X      reduce eyespace
+|*X
+|XO
+|.X
+
+:8,s
+
+
+Pattern A7c
+
+X.X      reduce eyespace
+X*X
+OX.
+
+:8,s
+
+A.X
+A*X
+OXb
+
+;lib(A)==2 && olib(b)>1
+
+
+Pattern A8
+
+O..
+?X*
+??O
+
+:8,c
+
+
+Pattern A9
+
+X*
+OX
+
+:/,-
+
+X*
+OX
+
+;safe_omove(*)
+
+
+Pattern A10
+
+?X?
+XOX
+.*.
+
+:|,-
+
+
+Pattern A11
+
+*.X
+?.X
+?XO
+
+:8,c
+
+*.X
+?.X
+?XO
+
+;olib(*)>3
+
+
+Pattern A12
+
+.X?
+*.X
+.X?
+---
+
+:8,-
+
+.X?
+*.X
+.A?
+---
+
+;lib(A)==2 && olib(*)>3
+
+
+Pattern A13
+
+*O
+.X
+.X
+.x
+--
+
+:8,-
+
+*O
+.A
+.A
+.x
+--
+
+;lib(A)==3 && olib(*)>=3
+
+
+Pattern A14
+
+.X.
+X*X
+?O?
+
+:|,-
+
+.X.
+A*B
+?O?
+
+;safe_omove(*) && oplay_attack_either(*,A,B)
+;&& !oplay_connect(*,A,B)
+
+
+Pattern A15
+#evand new pattern (3.3.13)
+
+?X?
+X*.
+?XX
+
+:8,s
+
+?X?
+X*b
+?AA
+
+;lib(A) == 2 && xlib(b) <= 2
+
+
+Pattern A16
+#evand new pattern (3.3.13)
+
+*x
+X.
+x.
+--
+
+:8,-
+
+*x
+A.
+x.
+--
+
+;lib(A) == 3
+
+
+Pattern A17
+# gf New pattern. (3.3.16)
+
+?O??
+o*XX
+..xX
+...X
+----
+
+:8,-
+
+?O??
+o*AA
+..xA
+...A
+----
+
+;lib(A)==3 && olib(*)>=2
+
+
+Pattern A18
+# gf New pattern. (3.3.17)
+
+??.?
+?X*.
+OOX.
+?X..
+??.?
+
+:8,-
+
+??.?
+?C*.
+eeXa
+?Db.
+??.?
+
+;!oplay_attack(*,e) && oplay_attack(*,a,C) && oplay_attack(b,a,D)
+
+
+Pattern A19
+# gf New pattern. (3.3.17)
+
+?*X    threaten snapback
+O..
+?XX
+
+:8,c
+
+?*X
+O..
+?AA
+
+;lib(A)==2 && olib(*)>1
+
+
+Pattern A20
+# gf New pattern. (3.3.17)
+
+|*X    threaten snapback
+|..
+|XX
+
+:8,c
+
+|*X
+|..
+|AA
+
+;lib(A)==2 && olib(*)>1
+
+
+Pattern A21
+# gf New pattern. (3.3.17)
+
+.XO
+*.X
+---
+
+:8,-
+
+.XO
+*.A
+---
+
+;lib(A)==2 && olib(*)>2
+
+
+Pattern A22
+#evand New pattern. (3.3.18)
+
+?.X
+O.X
+X*X
+?X?
+
+:8,s
+
+?.A
+ObA
+X*A
+?X?
+
+;lib(A) <= 4 && oplay_attack(*,b,A) && oplay_defend(*,?,*)
+
+
+Pattern A23
+# evand New pattern. (3.3.19)
+
+XXO
+.X.
+.*.
+
+:8,-
+
+AAB
+.A.
+.*.
+
+;lib(A) == 3 && lib(B) > 1 && oplay_attack(*,A)
+
+
+Pattern A24
+# pp New pattern - see atari_atari:25 and blunder:31 (3.5.1)
+
+?*?
+XOX
+
+:|,-
+
+?*?
+BAC
+
+; lib(A) == 1 && lib(B) + lib(C) <= 6 && !oplay_defend_both(*,B,C)
+
+
+Pattern A25
+# gf New pattern. (3.5.4)
+
+..X
+*OX
+.XO
+
+:8,-
+
+..A
+*OA
+.BO
+
+;lib(A)<=3 && lib(B)<=3 && (oplay_attack(*,A) || oplay_attack(*,B))
+
+
+Pattern A26
+# pp New pattern, see kgs:490. (3.7.4)
+
+?XX
+O*.
+?X.
+
+:8,-
+
+?CC
+A*a
+?B.
+
+# FIXME: The constraint is not very good.
+; lib(B) <= 5 && lib(A) > lib(B) && !oplay_defend(*,?,a,C)
+
+
+# END OF FILE
diff --git a/patterns/aa_attackpats.dtr b/patterns/aa_attackpats.dtr
new file mode 100644 (file)
index 0000000..01ac4d5
--- /dev/null
@@ -0,0 +1,23 @@
+A1     1
+A2     3
+A3     0
+A4     0
+A5     1
+A6     1
+A7     1
+A8     1
+A9     0
+A10    2
+A11    4
+A12    0
+A13    7
+A14    1
+A15    6
+A16    6
+A17    0
+A18    6
+A19    1
+A20    6
+A21    0
+A22    1
+A23    5
diff --git a/patterns/attack.db b/patterns/attack.db
new file mode 100644 (file)
index 0000000..8960d6c
--- /dev/null
@@ -0,0 +1,215 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  attack.db - pattern database for finding tactical attack moves
+#
+#  The tactical reading functions try to capture by attacking
+#  on the immediate liberties plus certain caps and backfilling
+#  moves. This database is intended to find additional attacking
+#  moves. Notice though that these patterns doesn't help the
+#  tactical reading to find attacking moves later in a move
+#  sequence but only at stackp=0.
+#
+#  See patterns.db for a specification of the current database format.
+#
+#  Since these patterns are matched during make_worms() it doesn't
+#  make any sense to use classifications such as X and O. No other
+#  classification is useful either except A since we only have
+#  tactical attack moves here.
+#
+#  The semantics of these patterns are that the move at * is tried as
+#  an attack of each X string in the pattern. The patterns are matched
+#  with either player as O.
+#
+##################################################################
+
+
+attribute_map none
+
+goal_elements none
+callback_data X
+
+
+Pattern Attack1
+# Even if a ladder works (and is found by the tactical reading) we
+# also want to consider the geta capture.
+
+XOO?    capture one stone
+OX..
+O.*?
+?.??
+
+:8,A
+
+
+Pattern Attack2
+
+OOXX         push to capture X
+.XO*
+....
+----
+
+:8,A
+
+
+Pattern Attack4
+
+*OX           extend to kill
+.XO
+
+:8,A
+
+
+Pattern Attack5
+
+|.X
+|XO
+|*.
+|.X
+
+:8,A
+
+
+Pattern Attack6
+
+?X           block to attack and defend
+?O
+X*
+O.
+
+:8,A
+
+
+Pattern Attack10
+
+?O.            common geta
+OX.
+O.*
+?.?
+
+:8,A
+
+
+Pattern Attack11
+
+o..??          catch two stones in a net
+O.*.?
+?X..o
+?X.oo
+??O??
+
+:8,A
+
+
+Pattern Attack13
+
+----
+....
+X...
+O*.O
+
+:8,A
+
+
+Pattern Attack14
+
+?.?    Sometimes better to capture indirectly
+*.O
+OXO
+?O?
+
+:8,A
+
+
+Pattern Attack15
+
+XOX    Capture one step away
+X.*
+---
+
+:8,A,NULL
+
+AOX
+A.*
+---
+
+; lib(A)==1
+
+
+Pattern Attack16
+
+?*X?   Capture with snapback
+O.OX
+?XX?
+
+:8,A
+
+?*X?
+b.OX
+?AA?
+
+;lib(A)==1 && olib(*)>1 && lib(b)>1
+
+
+Pattern Attack17
+# This is only intended for finding an alternative attack. It should
+# have a constraint to first check whether the move above * was
+# successful. 
+# FIXME: Add necessary machinery for this.
+
+?X?
+O.O
+?*o
+
+:8,A
+
+
+Pattern Attack18
+# gf New pattern. (3.3.4)
+
+OX
+O.
+X*
+--
+
+:8,A
+
+
+Pattern Attack19
+# pp New pattern (3.3.18)
+
+*.O        May be better to capture indirectly
+O.X
+..O
+
+:8,A
+
+*.O
+O.A
+..O
+
+; lib(A) == 1
+
+
+# END OF FILE
diff --git a/patterns/barriers.db b/patterns/barriers.db
new file mode 100644 (file)
index 0000000..4e1b858
--- /dev/null
@@ -0,0 +1,3527 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Database of influence patterns.
+#
+#  ? - don't care
+#  . - empty
+#  O - color to move
+#  Q - same as O, plus sets the pattern anchor
+#  X - opposite color of O
+#  o - O or empty
+#  x - X or empty
+#  , - point which influence can't pass through
+# A/D patterns:
+#  ! - point where influence gets weakened when passing through
+#      (permeability multiplied by 0.7) 
+# B patterns:
+#  ! - marks an intrusion for the anchor stone with indicated value
+#
+#
+# Four different classes of patterns are used here.
+#
+#  A - Patterns stopping O influence
+#  D - Patterns stopping X influence
+#  B - Intrusions (where O can intrude into X'x territory)
+#  t - Nonterritory patterns indicating points where one color cannot
+#      get territory
+#
+# Constraints are as usual.
+# B patterns are matched for the color to move, and for the color having
+# made a move in followup influence, in order to compute the followup
+# value of this move. (Only patterns including the played move or any
+# stone saved by this move are taken into account.)
+# For the followup influence, a pattern is used if the usual constraint
+# is satisfied, and if the action returns true. See the influence
+# documentation for explanation and influence.c for details.
+
+
+attribute_map value_only
+
+goal_elements none
+callback_data XO,!
+
+
+#########################################################
+#                                                       #
+#        Influence blocking patterns (barriers)         #
+#                                                       #
+#########################################################
+
+
+Pattern Barrier1
+
+O,O
+
+:+,D
+
+
+Pattern Barrier1b
+# gf Corrected symmetry. (3.1.23)
+
+o,o
+O,O
+
+:|,D
+
+
+Pattern Barrier2
+
+xxx
+X,X
+xxx
+
+:+,A
+
+
+Pattern Barrier3
+
+.,.
+X,X
+
+:|,A
+
+.b.
+cad
+
+;!(oplay_break_through(a,b,c,b,d)==WIN)
+
+
+Pattern Barrier4a
+
+|,O
+
+:-,D
+
+|aO
+
+;!oplay_attack(a,a)
+
+
+Pattern Barrier4b
+
+|,o?
+|.OX
+
+:8,OD
+
+|ao?
+|.OX
+
+;!oplay_attack(a,a)
+
+
+Pattern Barrier5
+
+xXx
+x,x
+---
+
+:|,A
+
+
+Pattern Barrier6
+
+,X
+,.
+--
+
+:8,A
+
+cd
+ba
+--
+
+;oplay_attack_either(a,b,c,a,c) || !oplay_attack_either(a,b,b,d)
+
+
+Pattern Barrier6b
+# gf New pattern. (3.3.10)
+# See century2002:85.
+
+OX
+,.
+--
+
+:8,A
+
+aX
+,.
+--
+
+;!defend(a)
+
+
+Pattern Barrier7
+
+XX
+,,
+--
+
+:|,A
+
+
+Pattern Barrier8
+
+,O
+O,
+
+:X,D
+
+
+Pattern Barrier9
+
+,X
+X,
+
+:X,A
+
+
+Pattern Barrier10
+
+XO
+O,
+
+:\,D
+
+
+Pattern Barrier11
+
+OX
+X,
+
+:\,A
+
+Oc
+ba
+
+;!safe_omove(a) || oplay_defend_both(a,b,c)
+
+
+Pattern Barrier12
+
+O,.
+?,O
+
+:8,D
+
+
+Pattern Barrier13
+
+X,X
+X,X
+
+:+,A
+
+
+Pattern Barrier14
+
+X,o
+X,X
+
+:8,A
+
+Xbo
+Xac
+
+;!oplay_attack_either(a,b,b,c)
+
+
+Pattern Barrier15
+
+xxx
+X,x
+x,X
+xxx
+
+:8,A
+
+
+Pattern Barrier16
+
+X,.
+.,X
+
+:O,A
+
+cae
+fbd
+
+;(oplay_attack_either(a,b,f,a,f) || !oplay_attack_either(a,b,c,d))
+;&& (oplay_attack_either(b,a,e,b,e) || !oplay_attack_either(b,a,c,d))
+
+
+Pattern Barrier16b
+
+X,X
+.,X
+
+:8,A
+
+cad
+fbd
+
+;(oplay_attack_either(a,b,f,a,f) || !oplay_attack_either(a,b,c,d))
+;&& !oplay_attack(b,a,c)
+
+
+Pattern Barrier17
+
+X,.
+O,X
+
+:8,A
+
+cae
+Obd
+
+;!oplay_attack_either(a,b,c,d)
+;&& (oplay_attack_either(b,a,e,b,e) || !oplay_attack_either(b,a,c,d))
+
+
+Pattern Barrier18
+
+X,O
+O,X
+
+:8,A
+
+caO
+Obd
+
+;!oplay_attack_either(a,b,c,d) && !oplay_attack_either(b,a,c,d)
+
+
+Pattern Barrier19
+
+O,,O
+...o
+
+:8,D
+
+dbaO
+.c.o
+
+;!oplay_break_through(a,b,c,a,c,d)
+
+
+Pattern Barrier20
+# gf Corrected symmetry. (3.1.23)
+
+O,,O
+O..o
+
+:8,D
+
+Obae
+Ocdo
+
+;!oplay_attack_either(a,b,c,a,c) || !oplay_attack_either(b,a,d,d,e)
+
+
+Pattern Barrier21
+
+?xx?
+xxxx
+X,,X
+xxxx
+?xx?
+
+:+,A
+
+
+Pattern Barrier22
+
+x..x
+X,,X
+x..x
+
+:|,A
+
+x..x
+XdaX
+xcbx
+
+;!oplay_attack_either(a,b,c,d,b,d) && !oplay_attack_either(d,c,b,a,c,a)
+
+
+Pattern Barrier22a
+# This pattern could have '|' symmetry, but to improve the chances
+# that it's matched before the expensive next one, we let it have
+# '8' symmetry.
+
+?xxxx?
+xxxxxx
+xX,,Xx
+xx,,xx
+xxxxxx
+------
+
+:8,A
+
+
+Pattern Barrier22b
+
+X..X
+x,,x
+xxxx
+
+:|,A
+
+XdaX
+xcbx
+xxxx
+
+;!oplay_attack_either(a,b,c,d,b,d) && !oplay_attack_either(d,c,b,a,c,a)
+
+
+Pattern Barrier23
+# gf Revised. (3.3.17)
+
+O,,.
+.,,O
+
+:O,D
+
+Oab.
+.dcO
+
+;oplay_attack_either(a,b,c,d,b,d) || oplay_defend_both(a,b,c,d,a,c)
+
+
+Pattern Barrier24
+
+?O...
+oo,,O
+?O...
+
+:-,D
+
+
+Pattern Barrier25
+
+?xx?
+xxxx
+X,.x
+x.,X
+xxxx
+?xx?
+
+:8,A
+
+
+Pattern Barrier26
+# gf Revised pattern. (3.5.3)
+
+X,,x
+x,,X
+
+:O,A
+
+Xdax
+xcbX
+
+;!oplay_attack_either(a,b,c,d,b,d) && !oplay_attack_either(d,c,b,a,c,a)
+
+
+Pattern Barrier27
+
+oOo
+o,o
+o,o
+---
+
+:|,D
+
+
+Pattern Barrier28
+
+xXx
+x,x
+x,x
+---
+
+:|,A
+
+
+Pattern Barrier29
+
+,O
+,X
+--
+
+:8,D
+
+,b
+aX
+--
+
+;!oplay_attack_either(a,a,b)
+
+
+Pattern Barrier30
+
+OO
+,X
+--
+
+:8,D
+
+OO
+aX
+--
+
+;!oplay_attack(a,a)
+
+
+Pattern Barrier31
+
+?.O,o
+?.X,o
+o..,o
+-----
+
+:8,D
+
+
+Pattern Barrier32
+
+?Ooo
+X,,o
+..,o
+----
+
+:8,D
+
+
+Pattern Barrier33
+
+XOoo
+.X,o
+..,o
+----
+
+:8,D
+
+XOoo
+.Bao
+..,o
+----
+
+;oplay_attack(a,B)
+
+
+Pattern Barrier34
+
+XOo
+.,o
+.,o
+---
+
+:8,D
+
+
+Pattern Barrier34b
+
+XOO
+.,X
+.,?
+---
+
+:8,D
+
+XOO
+.,A
+.,?
+---
+
+;attack(A)
+
+
+Pattern Barrier35
+
+oOoOo
+o,,,o
+o,,,o
+-----
+
+:|,D
+
+
+Pattern Barrier36
+
+xXxXx
+x,,,x
+x,,,x
+-----
+
+:|,A
+
+
+Pattern Barrier37
+
+OXxx
+.,,x
+..,x
+----
+
+:8,A
+
+OAbx
+.cdx
+..,x
+----
+
+;lib(A)>3 || (!legal_omove(b))
+;|| (lib(A)>2 && (olib(b) <= 2 || oplay_attack_either(c,d,b,b,c)))
+
+
+Pattern Barrier38
+
+OXO
+,,?
+---
+
+:8,D
+
+OAO
+,,?
+---
+
+;lib(A)==1
+
+
+Pattern Barrier39
+
+oooO?
+oO..o
+o.,,o
+o.,,o
+-----
+
+:8,D
+
+
+Pattern Barrier40
+
+xxxX?
+xX..x
+x.,,x
+x.,,x
+-----
+
+:8,A
+
+
+Pattern Barrier41a
+
+O.XO
+.,,O
+
+:8,D
+
+OcXO
+.baO
+
+;!oplay_attack_either(a,b,c,a,c)
+
+
+Pattern Barrier41b
+
+O.XO
+.,,.
+
+:8,D
+
+OcXe
+.bad
+
+;oplay_defend_both(a,b,c,d,a,e)
+
+
+Pattern Barrier42
+
+OX?
+.,O
+
+:8,D
+
+cD?
+baO
+
+;oplay_attack_either(a,b,b,D) || oplay_defend_both(a,b,a,c)
+
+
+Pattern Barrier43
+
+?X..O
+oO,,o
+o..,o
+-----
+
+:8,D
+
+
+Pattern Barrier44
+
+?X.O
+O,,.
+..,o
+----
+
+:8,D
+
+?EbO
+Oacd
+..,o
+----
+
+;oplay_attack_either(a,b,c,d,d,b) && !oplay_defend_both(a,c,b,c,E)
+
+
+Pattern Barrier45
+
+X.XX
+X,,.
+.,,.
+----
+
+:8,A
+
+
+Pattern Barrier46
+
+.X.O
+O..,
+.,,o
+
+:8,D
+
+
+Pattern Barrier47
+
+ooOoOoo
+oo,,,oo
+oo,,,oo
+oo,,,oo
+-------
+
+:|,D
+
+
+Pattern Barrier48
+
+xxxxxxx
+xxXxXxx
+xx,,,xx
+xx,,,xx
+xx,,,xx
+-------
+
+:|,A
+
+
+Pattern Barrier49
+
+O.?
+,,.
+.,O
+
+:/,D
+
+
+Pattern Barrier50
+
+O??
+,,?
+.,O
+
+:/,D
+
+
+Pattern Barrier51
+
+o.??
+O,,O
+
+:8,D
+
+
+Pattern Barrier52
+
+o.O.?
+o,X..
+.,...
+-----
+
+:8,sD
+
+o.b.?
+oaX..
+.,...
+-----
+
+;!oplay_attack(a,b)
+
+
+Pattern Barrier53
+
+?O?
+OXO
+.,x
+---
+
+:8,sD
+
+
+Pattern Barrier54
+
+xx.xx
+xXOXx
+x,,,x
+.....
+-----
+
+:|,A
+
+xx.xx
+xXOXx
+x,a,x
+.....
+-----
+
+;oplay_attack(a,a)
+
+
+Pattern Barrier55
+
+OX.O
+.,,.
+
+:8,sD
+
+bA.c
+.,,.
+
+;lib(A)<=3 && lib(b)>=3 && lib(c)>=3
+
+
+Pattern Barrier56
+# ab generalized (3.5.5)
+
+xXOo
+xOX,
+.x.,
+----
+
+:8,sD
+
+xXbo
+xOXa
+.x.,
+----
+
+;!oplay_attack(a,b)
+
+
+Pattern Barrier56b
+
+xXOo
+XO.,
+.X.,
+----
+
+:8,sD
+
+xXOo
+XOa,
+.X.,
+----
+
+;safe_omove(a)
+
+
+Pattern Barrier57
+
+X,
+O?
+
+:8,sD
+
+A,
+O?
+
+;lib(A)==1
+
+
+Pattern Barrier58
+
+o,o
+OXO
+
+:8,sD
+
+o,o
+bAc
+
+;lib(A)<=2 && lib(b)>1 && lib(c)>1
+
+
+Pattern Barrier59
+
+,.
+XO
+
+:8,sD
+
+ab
+XO
+
+;oplay_attack(a,b,b)
+
+
+Pattern Barrier60a
+
+.X.
+...
+.!.
+.!.
+---
+
+:|,XA
+
+
+Pattern Barrier60b
+
+.O.
+.,.
+.!.
+.!.
+---
+
+:|,OD
+
+
+Pattern Barrier61
+
+|oooooo
+|!!...o
+|...O.o
+|..X..o
+|....!o
+|....!o
++------
+
+:/,D
+
+
+Pattern Barrier62
+
+?xX?
+...O
+.!..
+
+:8,OXD
+
+
+Pattern Barrier63
+# gf New pattern. (3.3.10)
+
+oX..
+O,..
+.,,.
+....
+----
+
+:8,D
+
+
+Pattern Barrier64
+# gf New pattern. (3.3.10)
+
+oX..
+O,,.
+..,,
+....
+----
+
+:8,D
+
+oXc.
+Oab.
+..,,
+....
+----
+
+;!oplay_attack(a,b,c,c)
+
+
+Pattern Barrier65
+# ab New (3.3.10)
+
+?O.
+X,.
+x,.
+---
+
+:8,OD
+
+?O.
+Ca.
+xb.
+---
+
+;oplay_attack(a,b,C)
+
+
+Pattern Barrier66
+# gf New pattern. (3.3.13)
+
+|..X...
+|......
+|..XO..
+|..,,..
+|..,...
+|......
++------
+
+:8,D
+
+
+Pattern Barrier67
+# gf New pattern. (3.5.3)
+
+....O
+O,,,.
+.....
+.....
+-----
+
+:8,D
+
+
+#########################################################
+#                                                       #
+#   Intrusion patterns (secondary influence sources)    #
+#                                                       #
+#########################################################
+
+
+Pattern Intrusion1
+
+???x
+...X
+!!.Q
+----
+
+:8,B,value(30)
+
+???x
+..cX
+!!ba
+----
+
+>return (lib(a)>2 || (lib(a) == 2 && connect_and_cut_helper(a,b,c)));
+
+
+Pattern Intrusion1a
+
+|??x
+|!!X
+|..Q
++---
+
+:8,B,value(30)
+
+|??x
+|.cX
+|.ba
++---
+
+;safe_omove(c)
+>return (lib(a)>2 || (lib(a) == 2 && connect_and_cut_helper(a,b,c)));
+
+
+Pattern Intrusion1b
+
+xxxx
+X..X
+..!Q
+----
+
+:8,B,value(30)
+
+xxxx
+X.cX
+..ba
+----
+
+>return (lib(a)>2 || (lib(a) == 2 && connect_and_cut_helper(a,b,c)));
+
+
+Pattern Intrusion1c
+
+xxxx
+X..X
+.!.Q
+----
+
+:8,B,value(30)
+
+xxxx
+X.dX
+.acb
+----
+
+;safe_omove(a)
+>return (lib(b)>2 || (lib(b) == 2 && connect_and_cut_helper(b,c,d)));
+
+
+Pattern Intrusion1d
+# ab New pattern (3.1.24).
+
+xxxx
+!!.X
+...Q
+----
+
+:8,B,value(30)
+
+xxxx
+a!cX
+..bQ
+----
+
+;!oplay_defend(a,b,c,b)
+
+
+Pattern Intrusion2
+
+xXx?
+...Q
+!!..
+----
+
+:8,B,value(30)
+
+xXx?
+..bd
+a!c.
+----
+
+;!oplay_attack(a,b,c,d)
+>return (!xplay_attack(b,d));
+
+
+Pattern Intrusion3
+# ab 3.1.22 Constraint added (see 13x13:52)
+
+xxX?
+...Q
+!!..
+----
+
+:8,B,value(30)
+
+xxX?
+..bd
+a!c.
+----
+
+;!oplay_attack(a,b,c,d)
+>return (!xplay_attack(b,d));
+
+
+Pattern Intrusion4
+
+XQOX
+!!X.
+!...
+----
+
+:8,B,value(30)
+
+XdOX
+baC.
+!...
+----
+
+;oplay_attack(a,b,C)
+>return (!xplay_attack(a,d));
+
+
+Pattern Intrusion5a
+
+X.QX
+.!X.
+.!..
+----
+
+:8,B,value(30)
+
+XbdX
+.aC.
+.!..
+----
+
+;oplay_attack(a,b,C)
+>return (!xplay_attack(b,d));
+
+
+Pattern Intrusion5b
+
+.QX
+!X.
+
+:8,B,value(30)
+
+bfE
+aDc
+
+;!oplay_defend_both(a,b,c,D,E)
+>return (!xplay_attack(b,f));
+
+
+Pattern Intrusion6
+
+?QX
+X!!
+x..
+
+:8,B,value(30)
+
+?aX
+Xb!
+x..
+
+>return (!xplay_attack(b,a));
+
+
+# Pattern Intrusion7a
+# 
+# QX.
+# .!!
+# X.x
+# 
+# :8,BW,value(30)
+# 
+# cA.
+# b!!
+# X.x
+# 
+# ;lib(A)==2
+# >return (!xplay_attack(b,c));
+# 
+
+Pattern Intrusion7b
+
+QX
+!!
+
+:8,B,value(30)
+
+cC
+ba
+
+;oplay_attack_either(a,b,C,b);
+>return (!xplay_attack(b,c));
+
+
+Pattern Intrusion8a
+# ab 3.1.22 revised constraint (see territory valuation in 13x13:2)
+
+X.X
+Q!!
+?X.
+
+:8,B,value(30)
+
+B.X
+ca!
+?X.
+
+;oplay_attack(a,B) && !attack(B)
+>return (!xplay_attack(a,c));
+
+
+Pattern Intrusion8b
+# ab New (3.3.18)
+
+?X
+Q!
+X!
+
+:8,B,value(30)
+
+?B
+ca
+X!
+
+;oplay_attack(a,B) && !attack(B)
+>return (!xplay_attack(a,c));
+
+
+Pattern Intrusion9
+
+X.
+QX
+.!
+
+:8,B,value(30)
+
+X.
+QC
+ba
+
+;oplay_attack(a,b,C)
+
+
+Pattern Intrusion10
+# ab Modified action constraint. (3.3.20)
+
+xxx??
+..XO?
+!!.Q?
+-----
+
+:8,B,value(30)
+
+xxxef
+..COg
+!badh
+-----
+
+;oplay_attack_either(a,b,b,C)
+>return (!xplay_attack(a,d) && o_somewhere(g,e,f,h));
+
+
+Pattern Intrusion11
+# O can intrude on either side. The position of the influence source
+# here isn't entirely accurate.
+
+.Q.
+.X.
+.!.
+...
+---
+
+:|,B,value(30)
+
+dQb
+cXa
+.!.
+...
+---
+
+;oplay_attack(a,b,b) && oplay_attack(c,d,d)
+
+
+Pattern Intrusion12a
+# O can intrude on either side. The position of the influence source
+# here isn't entirely accurate.
+
+!Q!
+!X!
+...
+...
+---
+
+:|,B,value(30)
+
+dQb
+cXa
+...
+...
+---
+
+;oplay_attack(a,b,b) || oplay_attack(c,d,d)
+
+
+Pattern Intrusion12b
+
+oQo
+.X!
+...
+
+:8,OB,value(30)
+
+odb
+.Ca
+...
+
+;o_somewhere(b) || oplay_attack_either(a,b,b,C)
+>return (!xplay_attack(b,d));
+
+
+Pattern Intrusion13
+
+?OoQ?
+X.!X.
+X.!..
+.....
+-----
+
+:8,B,value(30)
+
+?boa?
+X.!X.
+X.!..
+.....
+-----
+
+;lib(a)>=2 && lib(b)>=2
+
+
+Pattern Intrusion14
+
+?QO?
+X!X.
+.!..
+.!..
+----
+
+:8,B,value(30)
+
+?QO?
+XaXd
+.bc.
+.!..
+----
+
+;oplay_attack_either(a,b,c,d,b,d)
+
+
+Pattern Intrusion15
+
+oQo
+.XO
+!.X
+
+:8,B,value(30)
+
+oeo
+aXd
+cbX
+
+;!oplay_attack(a,b,c,a)
+>return (lib(d)>2 && lib(e)>2 && !xplay_attack(a,e));
+
+
+Pattern Intrusion16
+# ab value decreased (3.1.24)
+
+Q!.
+!!.
+.xX
+
+:8,B,value(20)
+
+
+Pattern Intrusion17
+# ab value decreased (3.1.24)
+
+Q!.
+.!.
+XxX
+
+:8,B,value(20)
+
+
+Pattern Intrusion18
+
+xXx
+o..
+Q!!
+o..
+xXx
+
+:8,B,value(30)
+
+
+Pattern Intrusion19
+
+X..
+Q!.
+o..
+xXx
+
+:8,B,value(30)
+
+X..
+ba.
+o..
+xXx
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion20
+
+oQ!
+OX!
+
+:8,B,value(30)
+
+edc
+fAb
+
+;lib(A)==2 && !oplay_attack(b,b)
+>return (!xplay_attack(c,d) && xplay_defend_both(e,d,f));
+
+
+Pattern Intrusion21
+
+Q.X
+.!.
+x..
+
+:8,B,value(30)
+
+b.X
+a!.
+x..
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion21b
+
+ooX
+Q!.
+x..
+
+:8,B,value(30)
+
+ooX
+ba.
+x..
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion22
+
+Q.X
+...
+.!.
+
+:8,B,value(10)
+
+b.X
+a..
+.!.
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion23
+
+Q..
+.!!
+---
+
+:8,B,value(10)
+
+eb.
+dca
+---
+
+;oplay_attack_either(a,b,c,d,b,d)
+>return (!xplay_attack(b,e));
+
+
+Pattern Intrusion24
+
+O..
+Q!!
+---
+
+:8,B,value(30)
+
+ba.
+Q!!
+---
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion25
+
+!!.O
+!XQ.
+....
+....
+----
+
+:8,B,value(30)
+
+
+Pattern Intrusion26
+
+!!.O
+.XQ.
+..X!
+....
+----
+
+:8,B,value(30)
+
+
+Pattern Intrusion27
+
+Q..
+.!.
+.!.
+...
+
+:8,B,value(30)
+
+
+Pattern Intrusion28
+
+??Q?
+x.!X
+..!.
+....
+----
+
+:8,B,value(30)
+
+??Q?
+xdaX
+.cb.
+....
+----
+
+;oplay_attack_either(a,b,c,d,b,d)
+
+
+Pattern Intrusion29
+
+oooo
+oooo
+.Q.o
+....
+.!!.
+.!..
+
+:8,B,value(30)
+
+
+Pattern Intrusion30
+
+oooo
+oooo
+XQ.o
+....
+.!!.
+.!..
+
+:8,B,value(30)
+
+oooo
+oooo
+XQfo
+dbc.
+.ae.
+.!..
+
+;oplay_attack(a,b,c,d,e,f,f)
+
+
+Pattern Intrusion30a
+
+????
+????
+oQoo
+...X
+.!..
+????
+
+:8,B,value(30)
+
+????
+????
+ocoo
+.b.X
+.a..
+????
+
+;oplay_connect(a,b,a,c)
+>return (!xplay_attack(b,c))
+
+
+Pattern Intrusion31
+
+ooo
+XQ.
+.!!
+.!.
+?.?
+
+:8,B,value(30)
+
+ooo
+Xb.
+.a!
+.!.
+?.?
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion32
+
+ooo
+XQ.
+.!.
+?.?
+
+:8,B,value(30)
+
+ooo
+Xb.
+.a.
+?.?
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion33
+
+oOo
+XQX
+.!.
+?.?
+
+:8,B,value(30)
+
+
+Pattern Intrusion34
+
+o.o
+XQX
+.!.
+?.?
+
+:8,B,value(30)
+
+obo
+XQX
+.a.
+?.?
+
+;oplay_attack(a,b,b)
+>return 0;
+
+
+Pattern Intrusion35
+
+|..X??
+|...Q?
+|..X!X
+|...!.
+|...!.
++-----
+
+:8,B,value(30)
+
+|..X??
+|.baQ?
+|.fXcX
+|..ed.
+|...!.
++-----
+
+;oplay_attack(a,b,c,d,e,f,d)
+
+
+Pattern Intrusion36
+
+?X
+Q!
+Xx
+
+:8,B,value(30)
+
+?X
+ba
+Xx
+
+;safe_omove(a)
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion37
+
+?X
+Q!
+oX
+
+:8,B,value(30)
+
+?X
+ba
+oX
+
+;safe_omove(a)
+> return (!xplay_attack(a,b));
+
+
+Pattern Intrusion38
+
+X?
+!Q
+--
+
+:8,B,value(5)
+
+X?
+ab
+--
+
+;safe_omove(a)
+> return (!xplay_attack(a,b));
+
+
+Pattern Intrusion39
+
+?Xx
+Q!.
+o!X
+
+:8,B,value(30)
+
+?Xx
+ba.
+o!X
+
+;safe_omove(a)
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion40
+# gf Revised constraint. (3.3.10)
+
+X!
+Q?
+
+:8,B,value(30)
+
+A!
+Q?
+
+;lib(A)==1 && attack(A)
+
+
+Pattern Intrusion41
+
+X!
+Q!
+
+:8,B,value(30)
+
+A!
+Q!
+
+;lib(A)==1
+
+
+Pattern Intrusion42
+
+?Ooo
+.XQo
+.!X.
+....
+----
+
+:8,B,value(30)
+
+?Oeo
+bXQo
+.aDc
+....
+----
+
+;(o_somewhere(e) || !safe_xmove(e)) && !oplay_defend(a,b,c,D)
+
+
+Pattern Intrusion43
+
+??XO
+..XQ
+?!!o
+
+:8,B,value(50)
+
+??AO
+.cAQ
+?dbo
+
+;lib(A)==2 && !attack(A) && !oplay_attack(b,c,d,d)
+
+
+Pattern Intrusion44a
+# gf New pattern. (3.1.20)
+
+.XQ
+!!o
+
+:8,B,value(30)
+
+cDf
+bae
+
+;safe_omove(a)
+;&& (o_somewhere(e) || oplay_attack(a,e,e))
+;&& !oplay_defend_both(a,b,c,b,D)
+>return (!xplay_attack(a,f) && (o_somewhere(e) || (!xplay_attack(e,f))));
+
+
+Pattern Intrusion44b
+# ab New pattern. (3.3.5)
+
+..X?
+.XQo
+!!o?
+
+:8,B,value(30)
+
+.dG?
+eFho
+cab?
+
+;safe_omove(a)
+;&& (o_somewhere(b) || oplay_attack(a,b,b))
+;&& !oplay_defend_both(a,c,d,e,F,G)
+>return (!xplay_attack(a,h));
+
+
+Pattern Intrusion45
+# gf New pattern. (3.1.20)
+
+X.Qo
+.!X.
+....
+----
+
+:8,B,value(30)
+
+XbQo
+.aC.
+....
+----
+
+;safe_omove(a) && oplay_attack(a,b,C)
+
+
+Pattern Intrusion46
+# gf New pattern. (3.1.22)
+# gf Fixed diagram inconsistency. (3.1.23)
+# FIXME: This pattern exaggerates the intrusion since X can stop it
+#        on one of the sides, but we don't know which one he will
+#        choose. This may or may not be a problem in practice.
+
+x.Q.x
+.!X!.
+x...x
+x...x
+-----
+
+:|,B,value(10)
+
+x.dbx
+.cXa.
+x...x
+x...x
+-----
+
+;!oplay_attack(a,b,c,d)
+
+
+Pattern Intrusion47
+# gf New pattern. (3.1.23)
+
+??X.?
+o..!.
+Q....
+-----
+
+:8,B,value(20)
+
+??X.?
+o..!.
+a....
+-----
+
+;lib(a)>2
+
+
+Pattern Intrusion48
+# ab New pattern. (3.1.23)
+# FIXME: This would need a constraint. The one below did not work.
+# gf Revised. (3.5.3)
+
+?x.
+...
+Q.!
+..X
+
+:8,B,value(20)
+
+# .x.
+# fce
+# Oba
+# .dX
+# 
+# ;oplay_attack(a,b,c,d,e,f,f)
+
+
+Pattern Intrusion49
+# ab added (3.1.24)
+
+XQX
+.!!
+
+:8,B,value(30)
+
+bcX
+.a!
+
+;oplay_attack(a,b) && ! attack(b)
+>return (!xplay_attack(a,c));
+
+
+Pattern Intrusion50
+# ab added (3.1.25)
+
+?..
+QX!
+...
+---
+
+:8,OB,value(30)
+
+?c.
+dXa
+.b.
+---
+
+;!oplay_attack_either(a,b,c,c,d)
+
+
+Pattern Intrusion51a
+
+?Q?
+X.X
+.!.
+
+:|,B,value(30)
+
+?e?
+CaD
+.b.
+
+;oplay_break_through(a,b,C,b,D)
+>return(!xplay_attack(a,e));
+
+
+Pattern Intrusion51b
+# ab New pattern. (3.3.5)
+# This is a bit incorrect, as usually X can choose on which side the
+# intrusion is allowed to happen.
+# Due to reading depth limitations, oplay_break_through == CUT is not
+# sufficient (see nngs1:40).
+# pp Revised constraint (3.5.1)
+# Ko checks prevent 0.5 point "breaks through" with no further threat.
+
+?O?
+XQX
+!X!
+
+:|,BX,value(20)
+
+?O?
+aQc
+dbe
+
+; (oplay_break_through(a,b,c)==WIN
+;  && (!ko(a) || oplay_attack_either(d,b,c))
+;  && (!ko(c) || oplay_attack_either(e,b,a)))
+
+
+Pattern Intrusion52
+# gf New pattern. (3.3.3)
+
+X.x
+Q!.
+.X.
+
+:8,B,value(30)
+
+X.x
+ba.
+.X.
+
+>return (!xplay_attack(a,b));
+
+
+Pattern Intrusion53
+# gf New pattern. (3.3.3)
+
+X!.
+QX!
+
+:8,B,value(50)
+
+Xa.
+QB!
+
+;!oplay_defend(a,B)
+
+
+Pattern Intrusion54
+# ab New pattern (3.3.10)
+# X cannot play double hane.
+
+..X?
+.XQo
+!.oo
+
+:8,B,value(40)
+
+.eG?
+fXQb
+!dac
+
+;(o_somewhere(a) || o_somewhere(b) || o_somewhere(c))
+;&& (o_somewhere(a) || oplay_attack(d,a,a)) && oplay_attack(e,f,G)
+
+
+Pattern Intrusion55
+# gf New pattern (3.3.16)
+
+????
+xxx?
+.!.o
+.!.Q
+----
+
+:8,B,value(30)
+
+efg?
+bcd?
+...o
+.a.Q
+----
+
+;x_somewhere(b,c,d,e,f,g) && safe_omove(a)
+
+
+Pattern Intrusion56
+# gf New pattern (3.3.16)
+
+????
+xxx?
+!..o
+!..Q
+----
+
+:8,B,value(30)
+
+fgh?
+cde?
+a..o
+...b
+----
+
+;x_somewhere(c,d,e,f,g,h) && !oplay_disconnect(a,a,b)
+
+
+Pattern Intrusion57
+# gf New pattern (3.3.16)
+
+xX
+!Q
+X?
+
+:8,B,value(30)
+
+xX
+ab
+X?
+
+;safe_omove(a)
+
+>return !xplay_attack(a,b);
+
+
+Pattern Intrusion58
+# gf New pattern (3.3.17)
+
+XOoo
+.XQo
+..X!
+?..!
+
+:8,B,value(30)
+
+Xgoo
+bXfo
+.aXc
+?.de
+
+;!oplay_disconnect(f,g) && !oplay_disconnect(a,b,c,d,e,c,f)
+
+
+Pattern Intrusion59
+# New pattern (3.3.20)
+# It is a little drastic, but see arend2:120 for where it is necessary.
+
+|x!xx
+|.!.x
+|.X.X
+|XQO?
+|.oo?
+
+:8,B,value(30)
+
+|x!xx
+|.!.x
+|.X.B
+|AQO?
+|.oo?
+
+;!attack(A) && oplay_disconnect(A,B) && !attack(B)
+
+
+Pattern Intrusion60
+#pp New pattern (3.5.1)
+# gf FIXME: This pattern looks rather likely to introduce more
+#           problems than it solves. We may need to find some other
+#           solution to endgame:880. (3.5.7)
+
+OQ?        this pattern should prevent attempts to cut bamboo joint
+X.!
+OO?
+
+:8,B,value(20)
+
+
+Pattern Intrusion61
+# gf New pattern. (3.5.2)
+# This pattern is somewhat questionable. See arend:30 and 13x13:16 for
+# positions where it helps.
+
+|..!?
+|.X..
+|.QXX
+|.OO?
+
+:8,B,value(20)
+
+|.a!?
+|bEc.
+|.QDD
+|.OO?
+
+;!oplay_connect(a,b,c,D,E)
+
+
+Pattern Intrusion62
+# gf New pattern. (3.5.3)
+# See gifu03:206
+
+.Xo
+.Q.
+!XO
+
+:8,B,value(20)
+
+.Xo
+bQa
+cDO
+
+;oplay_attack(c,b,D)
+>return !safe_xmove(a) && !oplay_defend_both(c,b,a,b,D);
+
+
+Pattern Intrusion63
+# gf New pattern. (3.7.10)
+# Try to discourage unreasonable hane. See gunnar:85.
+
+.oOO?
+.OX.X
+.QX..
+.X..!
+-----
+
+:8,B,value(50)
+
+.oOO?
+.OXcD
+.QX..
+aXb.!
+-----
+
+;olib(a)>1 && !oplay_connect(a,b,c,b,D)
+
+
+#########################################################
+#                                                       #
+#                 Nonterritory patterns                 #
+#                                                       #
+#########################################################
+
+
+Pattern Nonterritory1
+# gf Revised constraint. (3.3.10)
+
+OxO
+XoX
+
+:|,t
+
+OaO
+XbX
+
+>if (!false_eye_territory(a)) non_oterritory(a);
+>if (!false_eye_territory(b)) non_xterritory(b);
+
+
+Pattern Nonterritory1b
+# gf Revised constraint. (3.3.10)
+# gf Revised constraint. (3.3.17)
+
+Ox.
+XoX
+
+:8,t
+
+Oxb
+XaX
+
+>if ((halfeye(a) || false_eye(a)) && safe_omove(b)
+>    && !false_eye_territory(a)) non_xterritory(a);
+
+
+Pattern Nonterritory1c
+# gf Revised constraint. (3.3.10)
+
+Xo.
+OxO
+
+:8,t
+
+Xo.
+OaO
+
+>if (false_eye(a)
+>    && !false_eye_territory(a)) non_oterritory(a);
+
+
+Pattern Nonterritory2
+# gf Revised constraint. (3.3.10)
+
+?xO
+x.X
+Ox?
+
+:8,t
+
+?xO
+xaX
+Ox?
+
+>if (!false_eye_territory(a)) non_xterritory(a);
+
+
+Pattern Nonterritory3
+# gf Revised constraint. (3.3.10)
+
+?oX
+o.O
+Xo?
+
+:8,t
+
+?oX
+oaO
+Xo?
+
+>if (!false_eye_territory(a)) non_oterritory(a);
+
+
+Pattern Nonterritory4
+# gf Revised constraint. (3.3.10)
+
+|xO
+|oX
+
+:8,t
+
+|aO
+|bX
+
+>if (!false_eye_territory(a)) non_oterritory(a);
+>if (!false_eye_territory(b)) non_xterritory(b);
+
+
+Pattern Nonterritory5
+
+|?O
+|..
+|xX
+
+:8,t
+
+|?O
+|ab
+|xX
+
+>non_xterritory(a);
+>non_xterritory(b);
+
+
+Pattern Nonterritory6
+
+|?X
+|..
+|oO
+
+:8,t
+
+|?X
+|ab
+|oO
+
+>non_oterritory(a);
+>non_oterritory(b);
+
+
+Pattern Nonterritory7
+
+.X?
+..O
+---
+
+:8,t
+
+.X?
+baO
+---
+
+;safe_omove(a)
+
+>non_xterritory(a);
+>non_xterritory(b);
+
+
+Pattern Nonterritory7b
+# gf The old constraint was no good, as can be seen in nngs1:40. After
+#    black R6 this pattern declared S5 non-territory. (3.1.30)
+
+.X?
+..O
+---
+
+:8,t
+
+cX?
+baO
+---
+
+;safe_omove(a) && oplay_attack(a,b,c,a) && connect_and_cut_helper2(a,b,c)
+
+>non_xterritory(c);
+
+
+Pattern Nonterritory7c
+
+..X?
+...O
+----
+
+:8,t
+
+.cD?
+ebaO
+----
+
+;!oplay_defend_both(a,b,c,b,D)
+
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(e);
+
+
+Pattern Nonterritory8
+
+xXO
+..o
+---
+
+:8,t
+
+xXO
+bao
+---
+
+;safe_omove(a)
+
+>non_xterritory(a);
+>non_xterritory(b);
+
+
+Pattern Nonterritory8b
+# gf New pattern. (3.3.7)
+
+.XO
+...
+---
+
+:8,t
+
+dEO
+bac
+---
+
+;safe_omove(a) && !oplay_defend_both(a,b,c,?,d,b,E)
+
+>non_xterritory(d);
+
+
+Pattern Nonterritory9
+
+...X
+X..?
+?oO?
+
+:8,t
+
+.cbX
+X.a?
+?oO?
+
+;safe_omove(a)
+
+>non_xterritory(b);
+>non_xterritory(c);
+
+
+Pattern Nonterritory10
+
+..x
+...
+XOX
+
+:8,t
+
+edx
+cab
+XOX
+
+;safe_omove(a)
+
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+>non_xterritory(e);
+
+
+Pattern Nonterritory11
+
+oOX
+OX.
+.X.
+---
+
+:8,t
+
+oOX
+OBc
+aB.
+---
+
+;safe_omove(a) && oplay_attack(a,B)
+
+>non_xterritory(c);
+
+
+Pattern Nonterritory12
+
+.?
+O.
+
+:/,t
+
+bc
+Oa
+
+>non_xterritory(a);
+>non_xterritory(b);
+>non_xterritory(c);
+
+
+Pattern Nonterritory13
+
+.?
+X.
+
+:/,t
+
+a?
+Xb
+
+>non_oterritory(a);
+>non_oterritory(b);
+
+
+Pattern Nonterritory14
+
+.?
+..
+OX
+
+:8,t
+
+c?
+ab
+OX
+
+;safe_omove(a)
+
+>non_xterritory(a);
+>non_xterritory(b);
+>non_xterritory(c);
+
+
+Pattern Nonterritory15
+
+|.?
+|..
+|..
+|OX
+
+:8,t
+
+|ef
+|cd
+|ab
+|OX
+
+;safe_omove(a)
+
+>non_xterritory(a);
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+>non_xterritory(e);
+>non_xterritory(f);
+
+
+Pattern Nonterritory16
+
+|.?
+|.X
+|..
+|OX
+
+:8,t
+
+|e?
+|cd
+|ab
+|OX
+
+;safe_omove(a)
+
+>non_xterritory(a);
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+>non_xterritory(e);
+
+
+Pattern Nonterritory17
+
+|..
+|XO
+|.X
+
+:8,t
+
+|ac
+|Xd
+|bX
+
+;!oplay_defend_both(a,b,?,c,a,d)
+
+>non_oterritory(a);
+>non_oterritory(c);
+
+
+Pattern Nonterritory17b
+# gf New pattern. (3.3.7)
+
+|O.
+|XO
+
+:8,t
+
+|ba
+|Xc
+
+;!xplay_defend_both(a,b,c)
+
+>non_oterritory(a);
+
+
+Pattern Nonterritory18a
+
+.XOo
+..xO
+----
+
+:8,t
+
+dEOo
+bacO
+----
+
+;!oplay_defend_both(a,b,c,?,d,b,E)
+
+>non_xterritory(a);
+>non_xterritory(b);
+>non_xterritory(d);
+
+
+Pattern Nonterritory18b
+
+..XOo
+...xO
+-----
+
+:8,t
+
+fbXOo
+dcaeO
+-----
+
+;!oplay_defend_both(a,b,c,d,e,?,f,d,b)
+
+>non_xterritory(a);
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+>non_xterritory(f);
+
+
+Pattern Nonterritory19
+# gf New pattern. (3.1.18)
+
+.?
+*X
+.O
+
+:8,t
+
+b?
+*X
+aO
+
+;oplay_attack(*,a,a) && safe_omove(*)
+
+>non_xterritory(*);
+>non_xterritory(b);
+
+
+Pattern Nonterritory20
+# gf New pattern. (3.1.18)
+
+*X
+.O
+
+:8,t
+
+*X
+ab
+
+;attack(b) && oplay_attack(*,b)
+
+>non_oterritory(a);
+
+
+Pattern Nonterritory21
+
+..
+.X
+O?
+
+:8,t
+
+cb
+aX
+O?
+
+;!oplay_attack(a,b,b) && !oplay_attack(b,a,a)
+
+>non_oterritory(a);
+>non_oterritory(b);
+>non_oterritory(c);
+
+
+Pattern Nonterritory22
+
+.?
+*X
+O?
+
+:8,t
+
+a?
+*X
+O?
+
+;safe_omove(*)
+
+>non_xterritory(*);
+>non_xterritory(a);
+
+
+Pattern Nonterritory23
+# tm New Pattern (3.1.20)
+
+O.
+
+:-,t
+
+Oa
+
+>non_xterritory(a);
+
+
+Pattern Nonterritory24
+# tm New Pattern (3.1.20)
+
+X.
+
+:-,t
+
+Xa
+
+>non_oterritory(a);
+
+
+Pattern Nonterritory25
+# gf New pattern. (3.1.20)
+
+|XO
+|..
+
+:8,t
+
+|AO
+|bc
+
+;lib(A)==2 && connect_and_cut_helper(A,b,c)
+
+>non_oterritory(b);
+>non_oterritory(c);
+
+
+Pattern Nonterritory26
+# gf New pattern. (3.1.20)
+
+?.X
+OX.
+?OX
+
+:8,t
+
+?aX
+OXb
+?OX
+
+;safe_omove(a)
+
+>non_xterritory(b);
+
+
+Pattern Nonterritory27
+# gf New Pattern (3.1.22)
+
+O..
+
+:-,t
+
+Oab
+
+;safe_omove(a)
+
+>non_xterritory(b);
+
+
+Pattern Nonterritory28
+# gf New Pattern (3.1.22)
+
+O.
+x.
+
+:8,t
+
+Oa
+xb
+
+;safe_omove(a)
+
+>non_xterritory(b);
+
+
+Pattern Nonterritory29
+# gf New pattern. (3.1.23)
+
+?OO.
+X...
+----
+
+:8,t
+
+?OOc
+Xab.
+----
+
+;!safe_omove(a) && oplay_attack(b,a,b)
+
+>non_oterritory(b);
+>non_oterritory(c);
+
+
+Pattern Nonterritory30
+# gf New pattern. (3.1.23)
+
+?XX.
+O...
+----
+
+:8,t
+
+?EEd
+Oabc
+----
+
+;oplay_attack(a,b,b) && !oplay_attack(a,c,b,b) && oplay_attack(a,c,b,E)
+
+>non_xterritory(c);
+>non_xterritory(d);
+
+
+Pattern Nonterritory31
+# gf New pattern. (3.1.23)
+
+?XXX.
+O....
+-----
+
+:8,t
+
+?XXXd
+Oabc.
+-----
+
+;oplay_attack(a,b,b) && oplay_attack(a,c,b,c)
+
+>non_xterritory(c);
+>non_xterritory(d);
+
+
+Pattern Nonterritory32
+# gf New pattern. (3.1.23)
+# gf This pattern is somewhat problematic. O can often block at d to
+#    secure e or block at b to secure c. The real point of the pattern
+#    is that O can't secure both, but there's no way to express this
+#    accurately. See gunnar:15 for a position where this pattern is
+#    bad. (3.3.17)
+
+..O
+...
+X..
+
+:/,t
+
+e.O
+da.
+Xbc
+
+;!oplay_attack(a,b,c,d,e,d)
+
+>non_oterritory(a);
+>non_oterritory(c);
+>non_oterritory(e);
+
+
+Pattern Nonterritory33
+# gf New pattern. (3.1.30)
+
+X.O
+...
+..X
+
+:/,t
+
+X.O
+ca.
+dbX
+
+;!oplay_attack(a,b,c,a) && !oplay_attack(a,c,b,a)
+
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+
+
+Pattern Nonterritory34
+# gf New pattern. (3.1.30)
+
+x.O
+.XO
+.xO
+---
+
+:8,t
+
+xaO
+cXO
+.bO
+---
+
+;safe_omove(a)
+;&& ((x_somewhere(b) && oplay_attack(a,b))
+;    || (!x_somewhere(b) && oplay_attack(a,b,b)))
+
+>non_xterritory(c);
+
+
+Pattern Nonterritory35
+# gf New pattern. (3.3.4)
+
+..O
+..X
+
+:8,t
+
+caO
+dbX
+
+;!oplay_attack(a,b,c,a) && !oplay_attack(a,c,b,a)
+
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+
+
+Pattern Nonterritory36
+# gf New pattern. (3.3.7)
+# gf Revised constraint. (3.3.10)
+
+OX?
+.OX
+.o?
+---
+
+:8,t
+
+OX?
+baX
+.o?
+---
+
+;lib(a)==2 && attack(a)
+
+>non_oterritory(b);
+
+
+Pattern Nonterritory37
+# gf New pattern. (3.3.10)
+# See trevorb:270.
+
+X.?
+.XO
+.x?
+---
+
+:8,t
+
+Xa?
+cBO
+.x?
+---
+
+;lib(B)==3 && safe_omove(a) && oplay_attack(a,B)
+
+>non_xterritory(c);
+
+
+Pattern Nonterritory38
+# gf New pattern. (3.3.10)
+# See trevorc:930.
+
+OX?
+.OX
+..O
+
+:8,t
+
+OX?
+.cX
+.ab
+
+;!xplay_defend_both(a,b,c)
+
+>non_oterritory(a);
+
+
+Pattern Nonterritory39
+# gf New pattern. (3.3.10)
+# See trevorc:930.
+
+X.O
+.XO
+..X
+
+:8,t
+
+XaO
+.DO
+.bC
+
+;!oplay_defend_both(a,?,b,C,D)
+
+>non_xterritory(b);
+
+
+Pattern Nonterritory40
+# gf New pattern. (3.3.10)
+
+oX.
+OX.
+...
+...
+---
+
+:8,t
+
+oX.
+OXc
+dab
+.e.
+---
+
+;!oplay_defend(a,b,c,d,a)
+
+>non_oterritory(d);
+>non_oterritory(e);
+
+
+Pattern Nonterritory41
+# gf New pattern. (3.3.13)
+
+?oOo
+X..O
+..X?
+
+:8,t
+
+?oOo
+XabO
+.cX?
+
+;oplay_attack(a,b,b)
+
+>non_xterritory(c);
+
+
+Pattern Nonterritory42
+# gf New pattern. (3.3.15)
+
+OX
+.O
+
+:8,t
+
+bX
+ac
+
+;!xplay_defend_both(a,b,c) && !adjacent_to_defendable_stone_in_atari(b)
+;&& !adjacent_to_defendable_stone_in_atari(c)
+
+>non_oterritory(a);
+
+
+Pattern Nonterritory43
+# gf New pattern. (3.3.15)
+
+oOXx
+O..X
+oO.X
+
+:8,t
+
+oODx
+OabX
+oOcX
+
+;!oplay_attack(b,D) && !oplay_attack(b,c,c)
+
+>non_oterritory(a);
+
+
+Pattern Nonterritory44
+# gf New pattern. (3.3.15)
+
+OXXx?
+.OOXx
+.....
+-----
+
+:8,t
+
+OXXx?
+eccXx
+..abd
+-----
+
+;oplay_attack(a,b,c) && !oplay_attack(b,d,d)
+
+>non_oterritory(e);
+
+
+Pattern Nonterritory45
+# gf New pattern. (3.3.16)
+
+O.X
+?X.
+
+:8,t
+
+OaX
+?Cb
+
+;lib(C)==2 && safe_omove(a) && oplay_attack(a,C) && !oplay_attack(a,b,a)
+
+>non_xterritory(b);
+
+
+Pattern Nonterritory46
+# gf New pattern. (3.3.17)
+
+??X?
+O...
+X...
+?.X?
+
+:8,t
+
+??X?
+Oab.
+Xcef
+?dX?
+
+;oplay_defend(a,b,c,d,e,f,a)
+
+>non_xterritory(b);
+>non_xterritory(c);
+>non_xterritory(d);
+>non_xterritory(e);
+>non_xterritory(f);
+
+
+Pattern Nonterritory47
+# gf New pattern. (3.3.17)
+
+?ooo?
+X...X
+
+:|,t
+
+?ooo?
+CaebD
+
+;!oplay_attack(a,C) && !oplay_attack(b,D)
+
+>non_oterritory(e);
+
+
+Pattern Nonterritory48
+# gf New pattern. (3.5.3)
+# See gifu03:507.
+
+?.?
+O..
+?XO
+
+:8,t
+
+?d?
+Oab
+?Xc
+
+;!oplay_defend_both(a,b,a,c)
+
+>non_oterritory(b);
+>non_oterritory(d);
+
+
+Pattern Nonterritory49
+# gf New pattern. (3.5.3)
+# See gifu03:205.
+
+?O?
+..X
+..?
+
+:8,t
+
+?O?
+baX
+dc?
+
+;!oplay_attack(a,b,c,a) && !oplay_attack(a,c,b,a)
+
+>non_xterritory(d);
+
+
+Pattern Nonterritory50
+# gf New pattern. (3.5.3)
+# See gifu03:205.
+
+??O
+X..
+?..
+
+:8,t
+
+??O
+Xba
+?dc
+
+;!oplay_attack(a,b,c,a) && !oplay_attack(a,c,b,a)
+
+>non_xterritory(d);
+
+
+Pattern Nonterritory51
+# gf New pattern. (3.5.3)
+# See gifu03:206.
+
+.Ox
+.X.
+.OX
+
+:8,t
+
+.Ox
+bXa
+cdX
+
+;!safe_omove(a) && !oplay_defend_both(b,a,?,c,b,d)
+
+>non_oterritory(c);
+
+
+Pattern Nonterritory52
+# gf New pattern. (3.5.3)
+# See blunder:17.
+
+O??
+.XO
+?.?
+
+:8,t
+
+O??
+aCb
+?d?
+
+;lib(C)==2 && !adjacent_to_stone_in_atari(C) && !oplay_attack_either(a,a,b)
+
+>non_xterritory(d);
+
+
+Pattern Nonterritory53
+# gf New pattern. (3.5.3)
+# See gifu03:205.
+
+O.O
+.XO
+?.?
+
+:8,t
+
+Obc
+aXc
+?d?
+
+;oplay_attack(a,b,b) && !oplay_attack_either(a,a,c)
+
+>non_xterritory(d);
+
+
+Pattern Nonterritory54
+# gf New pattern. (3.5.3)
+# See nicklas4:1103
+
+OX.
+...
+...
+---
+
+:8,t
+
+ODc
+eab
+...
+---
+
+;oplay_defend_both(a,b,c,D,b) && oplay_attack(a,b,a)
+
+>non_oterritory(e);
+
+
+Pattern Nonterritory55
+# gf New pattern. (3.5.4)
+
+?.X.
+O...
+----
+
+:8,t
+
+?dX.
+Ocab
+----
+
+;!oplay_attack(a,b,c,a) && !oplay_attack(a,d,c,a)
+
+>non_xterritory(b);
+
+
+Pattern Nonterritory56
+# gf New pattern. (3.7.1)
+# See endgame:920.
+
+...
+X.O
+?O.
+
+:8,t
+
+eac
+XbO
+?Od
+
+;oplay_attack(a,b,c,d,d)
+
+>non_xterritory(e);
+
+
+Pattern Nonterritory57
+# gf New pattern. (3.7.1)
+# See endgame:910.
+
+|..X
+|.XO
+|...
++---
+
+:8,t
+
+|.eX
+|bXO
+|dac
++---
+
+;safe_omove(a) && oplay_attack(a,b,c,d,b)
+
+>non_xterritory(e);
+
+
+Pattern Nonterritory58
+# gf New pattern. (3.7.2)
+# See gunnar:56.
+
+XOOOX
+x...x
+-----
+
+:|,t
+
+DOOOE
+xabcx
+-----
+
+;!oplay_attack_either(a,c,D,c) && !oplay_attack_either(c,a,E,a)
+
+>non_oterritory(b);
+
+
+Pattern Nonterritory59
+# gf New pattern. (3.7.2)
+# See gunnar:58.
+
+?OOX
+X...
+?OO?
+
+:8,t
+
+?OOE
+Dabc
+?OO?
+
+;!oplay_attack_either(a,c,D,c) && !oplay_attack_either(c,a,E,a)
+
+>non_oterritory(b);
+
+
+Pattern Nonterritory60
+# gf New pattern. (3.7.2)
+# See gunnar:57.
+
+??OO
+X...
+??OX
+
+:8,t
+
+??OO
+Ecba
+??OD
+
+;!oplay_attack_either(a,c,D,c) && !oplay_attack_either(c,a,E,a)
+
+>non_oterritory(b);
+
+
+# END OF FILE
diff --git a/patterns/compress_fuseki.c b/patterns/compress_fuseki.c
new file mode 100644 (file)
index 0000000..ae38700
--- /dev/null
@@ -0,0 +1,148 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#define BUFSIZE 160
+#define MAX_STONES 40
+#define MAX_BOARDSIZE 19
+
+#define USAGE "\
+Usage : uncompress_fuseki boardsize filename\n\
+"
+
+/* Write a board point in sgf format. Also do a sanity check. */
+static void
+write_stone(int i, int j)
+{
+  assert(i > 0 && i <= MAX_BOARDSIZE);
+  assert(j > 0 && j <= MAX_BOARDSIZE);
+  printf("%c%c", j + 'a' - 1, i + 'a' - 1);
+}
+
+int
+main(int argc, char *argv[])
+{
+  const char *filename;
+  FILE *input_FILE;
+  char line[BUFSIZE];
+  char name[BUFSIZE];
+  int value;
+  int k;
+  int row = 0;
+  int movei = -1;
+  int movej = -1;
+  int xi[MAX_STONES];
+  int xj[MAX_STONES];
+  int oi[MAX_STONES];
+  int oj[MAX_STONES];
+  int num_x = 0;
+  int num_o = 0;
+  
+  /* Check number of arguments. */
+  if (argc != 2) {
+    fprintf(stderr, USAGE);
+    return EXIT_FAILURE;
+  }
+
+  filename = argv[1];
+
+  input_FILE = fopen(filename, "r");
+  if (!input_FILE) {
+    fprintf(stderr, "compress_fuseki: Cannot open file %s\n", filename);
+    return EXIT_FAILURE;
+  }
+  
+  while (fgets(line, BUFSIZE, input_FILE)) {
+    if (sscanf(line, "Pattern %s", name) == 1) {
+      /* A new name has been picked up.
+       * Reset the row counter and the lists of stones.
+       */
+      row = 0;
+      num_x = 0;
+      num_o = 0;
+    }
+    else if (line[0] == ':') {
+      /* The colon line ends the pattern. First get the move value. */
+      if (sscanf(line, ":8,-,value(%d)", &value) != 1) {
+       fprintf(stderr, "compress_fuseki: Misformed colon line \"%s\"\n",
+               line);
+       return EXIT_FAILURE;
+      }
+
+      /* Write the compressed description of this pattern.
+       * Pad the stone list with passes (tt) if unbalanced colors.
+       */
+      printf("%s %d ", name, value);
+      write_stone(movei, movej);
+      while (num_x > 0 || num_o > 0) {
+       if (num_x > 0) {
+         num_x--;
+         write_stone(xi[num_x], xj[num_x]);
+       }
+       else if (num_o > 0)
+         printf("tt");
+       if (num_o > 0) {
+         num_o--;
+         write_stone(oi[num_o], oj[num_o]);
+       }
+       else if (num_x > 0)
+         printf("tt");
+      }
+      printf("\n");
+    }
+    else if (line[0] == '|') {
+      /* Found a diagram line. */
+      row++;
+      for (k = 1; line[k] && line[k] != '|'; k++) {
+       if (line[k] == '*') {
+         movei = row;
+         movej = k;
+       }
+       else if (line[k] == 'X') {
+         xi[num_x] = row;
+         xj[num_x] = k;
+         num_x++;
+         assert(num_x < MAX_STONES);
+       }
+       else if (line[k] == 'O') {
+         oi[num_o] = row;
+         oj[num_o] = k;
+         num_o++;
+         assert(num_o < MAX_STONES);
+       }
+      }
+    }
+  }
+
+  return EXIT_SUCCESS;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/conn.db b/patterns/conn.db
new file mode 100644 (file)
index 0000000..542c486
--- /dev/null
@@ -0,0 +1,732 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Database of connection patterns.
+#
+#  ? - don't care
+#  . - empty
+#  X - opposite color of O
+#  O - color of dragon looking for connection
+#  x - X or empty
+#  o - O or empty
+#  * - cutting point in the O formation, an X move here must be
+#      tactically safe
+#  ! - inhibit connection, eye space points for O are turned marginal
+#
+###################################
+#
+# Classification
+#
+# The connection database contains patterns of three different classes,
+# which also are matched separately.
+#
+#  B - Indicate cutting points and inhibit connections.
+#  C - Amalgamate worms into dragons.
+#
+# Additionally there are a few acceptance modifiers. 
+#
+#  s - Accept even if the pattern includes tactically unsafe strings
+#
+###################################
+#
+# Organisation
+#
+# The connection database is organized into a number of different
+# categories and ordered so that more specific patterns are matched
+# before more general ones, since evaluating the constraints of the
+# latter usually is expensive.
+#
+#  EB    - Edge B patterns
+#  CB    - Center B patterns
+#  EC    - Edge C patterns
+#  CC    - Center C patterns
+#  Lunch - patterns that invalidate lunches, matched with I patterns
+#
+###################################
+
+
+attribute_map none
+
+goal_elements none
+# callback_data is dependent on pattern class in this database
+
+
+########################
+#
+# B patterns on the edge
+#
+########################
+
+callback_data X!
+
+
+##########################
+#
+# B patterns in the center
+#
+##########################
+
+callback_data X!
+
+
+Pattern CB1b
+
+?O.          fragile double connection 
+X*O
+?O.
+
+:8,B
+
+?b.
+X*O
+?a.
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CB2b
+
+?O.
+?..          fragile double connection 
+X*O
+?O.
+
+:8,B
+
+?b.
+?..
+X*O
+?a.
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CB3b
+
+O!O
+.*X
+.O?
+
+:8,B
+
+O!a
+.*X
+.b?
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CB3c
+
+O!O
+.*.
+.OX
+
+:8,B
+
+c!a
+.*.
+.bX
+
+;!oplay_disconnect(a,c)
+;&& !oplay_disconnect(c,b)
+;&& !xplay_connect(*,a,b)
+
+
+Pattern CB7
+# This pattern is used to find potential cutting stones as defined by
+# the field cutstone2 in the worm data. The helper returns 0 so the
+# pattern doesn't fire as a B pattern.
+
+XO
+O*
+
+:\,B,cutstone2_helper
+
+AO
+O*
+
+;attack(A)
+
+
+Pattern CB11b
+
+?OX?
+O!OX
+?*!O
+??O?
+
+:8,B
+
+?bX?
+O!OX
+?*!a
+??O?
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CB15b
+# tm New Pattern (3.1.23)  (see global:17, )
+#   careful not to break trevord:730
+# FIXME:  Need to use amalgamate_most_valuable helper.
+# xplay_disconnect helper also might be useful here.
+
+?*?   save cutting stone.
+OXO
+!O!
+
+:8,B
+
+?*?
+aXb
+!O!
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CB16
+# gf Revised constraint. (3.3.13)
+
+?O
+x*          fragile double connection 
+XO
+O!
+
+:8,B
+
+?a
+x*
+XO
+b!
+
+;xplay_connect(a,b) && !xplay_connect(*,a,b)
+
+
+Pattern CB17
+
+O!O
+!*?        fragile double connection 
+O??
+
+:\,B
+
+O!a
+!*?
+b??
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CB18
+
+?X?
+X.X        workaround for ko contingent connection
+OXO
+?O*
+
+:8,B
+
+?X?
+XbX
+OAd
+?c*
+
+;xplay_attack(*,A)<WIN && !xplay_connect(*,?,b,c,d)
+
+
+########################
+#
+# C patterns on the edge
+#
+########################
+
+# Static connections need almost everything
+callback_data .Oxo,!
+
+
+Pattern EC1
+
+??oo??
+?....?
+oO..Oo
+o....o
+o....o
+------
+
+:|,C
+
+
+Pattern EC1b
+
+??....??
+o.O..O.o
+o......o
+o......o
+--------
+
+:|,C
+
+
+Pattern EC3a
+
+o...o
+oO.Oo
+o...o
+o...o
+o...o
+-----
+
+:8,C
+
+o...o
+oO.Oo
+o...o
+oa..o
+o...o
+-----
+
+;omoyo(a)
+
+
+##########################
+#
+# C patterns in the center
+#
+##############################################
+#
+# CC1xx - patterns without reading constraints
+#
+##############################################
+
+# Static connections need almost everything
+callback_data .Oxo,!
+
+
+Pattern CC101
+
+.O
+O.
+
+:X,C
+
+aO
+Ob
+
+;!xcut(a) && !xcut(b)
+
+
+Pattern CC103
+
+?oooo?
+o....o
+oO..Oo
+o....o
+?oooo?
+
+:+,C
+
+
+Pattern CC104
+
+?ooo??
+o...oo
+oO...o
+o...Oo
+oo...o
+??ooo?
+
+:8,C
+
+
+Pattern CC105
+
+?ooo?
+.....
+.O.O.
+.....
+?ooo?
+
+:+,C
+
+
+Pattern CC106
+
+.O.O.
+o...o
+o...o
+o.O.o
+
+:8,C
+
+
+Pattern CC107
+
+.O.O.
+o...o
+o...o
+.O.O.
+
+:8,C
+
+
+Pattern CC108
+
+O.O
+...
+...
+.O.
+
+:|,C
+
+OaO
+bcd
+efg
+.O.
+
+;omoyo(a) && oarea(c) && oarea(f)
+;&& ((omoyo(b) + omoyo(c) + omoyo(d) + omoyo(e) + omoyo(f) +omoyo(g)) >= 3)
+
+
+Pattern CC109
+# gf Revised constraint. (3.3.3)
+
+O.oo
+..oo
+..oo
+.Ooo
+
+:8,C
+
+c.oo
+.aoo
+.boo
+.doo
+
+;omoyo(a) && omoyo(b) && lib(c)>=4 && lib(d)>=4
+
+
+##########################################################
+#
+# CC2xx - patterns with reasonably inexpensive constraints
+#
+##########################################################
+
+#############################################
+#
+# CC3xx - patterns with expensive constraints
+#
+#############################################
+#
+# CC30x - one space jump connections
+#
+####################################
+
+###########################
+#
+# CC31x - keima connections
+#
+###########################
+
+####################################
+#
+# CC32x - two space jump connections
+#
+####################################
+
+############################
+#
+# CC33x - ogeima connections
+#
+############################
+
+####################################################################
+#
+# CC4xx -  fragile double connections
+#
+# FIXME: These shouldn't be matched until all other amalgamation has
+# been completed.
+#
+####################################################################
+
+Pattern CC401
+# Do amalgamate one of the two possible connections. We guess that
+# the larger of the two dragons is the one we most want to keep in
+# case of a cut.
+
+?O.          fragile double connection 
+X.O
+?O.
+
+:8,-
+
+?d.
+Xac
+?b.
+
+;xcut(a)
+
+>amalgamate_most_valuable_helper(b,c,d);
+
+
+Pattern CC402
+# Do amalgamate one of the two possible connections. We guess that
+# the larger of the two dragons is the one we most want to keep in
+# case of a cut.
+
+?O.
+?..          fragile double connection 
+X.O
+?O.
+
+:8,-
+
+?gd
+?bc
+Xaf
+?e.
+
+;xcut(a)
+
+>if (!xplay_attack_either(b,c,d,b,d) || !xplay_attack_either(c,b,a,c,a))
+>  amalgamate(e,f);
+>else
+>  amalgamate_most_valuable_helper(e,f,g);
+
+
+####################################################################
+#
+# CC5xx - experimental connection patterns
+#
+####################################################################
+#
+# Note about patterns CC501, CC502, CC502b, CC511
+#
+# In theory, these patterns go against the connection policy that the
+# involved strings must be tactically stable (not capturable) and
+# consequently, they should not be needed at all. In practice though,
+# problems arise with the optics/owl analysis when such strings aren't
+# amalgamated. An example (see owl:50)
+#
+# +------
+# |...X.O
+# |XXX.XO
+# |.OOXXO
+# |O.OOOO
+#
+# In the absence of the mentioned patterns, the topmost X stone would
+# NOT be amalgamated with the others, because all attempts at
+# defending these kosumi connections result in a tactical capture of
+# the whole string, thus a successful cut.
+#
+# As a consequence, the owl code would be run against separate targets,
+# and in the above case, it would even fail to find a way to kill the
+# topmost X stone (the lack of context is then responsible for the 
+# optics/owl code not being able to return vital points)
+#
+####################################################################
+
+
+Pattern CC501
+# Connect even if stones not tactically safe.
+
+xO
+O.
+
+:\,sC
+
+xO
+Oc
+
+;x_suicide(c)
+
+
+Pattern CC502
+# Connect even if stones not tactically safe.
+
+XO
+O.
+
+:\,sC
+
+Xb
+ac
+
+;lib(a)>1 && lib(b)>1 && !xcut(c) && xlib(c)==1 && xplay_attack(c,c)==WIN
+
+
+Pattern CC502b
+# Connect even if stones not tactically safe.
+
+.O
+O.
+
+:\,sC
+
+db
+ac
+
+;lib(a)>1 && lib(b)>1 && !xcut(c) && !xcut(d)
+;&& xlib(c)==1 && xplay_attack(c,c)
+
+
+Pattern CC503
+
+O
+.
+O
+
+:+,C
+
+c
+a
+b
+
+;!xcut(a) && !disconnect_helper(b,c)
+
+
+Pattern CC504
+
+XO
+O.
+
+:\,C
+
+Xb
+ca
+
+;!xcut(a) && !disconnect_helper(b,c)
+
+
+Pattern CC505
+
+XO
+OX
+
+:X,C
+
+Bc
+dA
+
+;((attack(A) && !distrust_tactics_helper(A))
+; || (attack(B) && !distrust_tactics_helper(B)))
+;&& !disconnect_helper(c,d)
+
+
+Pattern CC506
+
+O
+.
+.
+O
+
+:+,C
+
+c
+a
+b
+d
+
+;!xcut(a) && !xcut(b) && !disconnect_helper(c,d)
+
+
+Pattern CC506b
+
+O.
+Xo
+..
+O.
+
+:8,C
+
+c.
+Eo
+ab
+d.
+
+;!xcut(a) && !xcut(b) && lib(E)<=2 && !disconnect_helper(c,d)
+
+
+Pattern CC507
+
+Ox
+..
+xO
+
+:O,C
+
+cx
+ab
+xd
+
+;!xcut(a) && !xcut(b) && !disconnect_helper(c,d)
+
+
+Pattern CC508
+
+O?
+.X
+xO
+
+:8,C
+
+b?
+aX
+xc
+
+;!xcut(a) && !disconnect_helper(b,c)
+
+
+Pattern CC509
+
+Ox
+..
+..
+xO
+
+:O,C
+
+ex
+ab
+cd
+xf
+
+;!xcut(a) && !xcut(b) && !xcut(c) && !xcut(d) && !disconnect_helper(e,f)
+
+
+Pattern CC511
+# Connect even if stones not tactically safe.
+
+.O
+O.
+
+:\,sC
+
+db
+ac
+
+;attack(a) && attack(b) && !xcut(c) && !xcut(d)
+
+
+# END OF FILE
diff --git a/patterns/connections.c b/patterns/connections.c
new file mode 100644 (file)
index 0000000..7fd9620
--- /dev/null
@@ -0,0 +1,237 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include "liberty.h"
+#include "patterns.h"
+
+
+/* Test whether apos and bpos can be cut. If yes, return 1 and
+ * store it in the cut list of dragons.c.
+ */
+int
+disconnect_helper(int apos, int bpos)
+{
+  int color = board[apos];
+  int move;
+  ASSERT1(color == board[bpos] && IS_STONE(color), apos);
+
+  if (disconnect(apos, bpos, &move)) {
+    add_cut(apos, bpos, move);
+    return 1;
+  }
+  return 0;
+}
+
+/* Try to match all (permutations of) connection patterns at (m,n).
+ * For each match, if it is a B pattern, set cutting point in
+ * cutting_points array. If it is a C pattern, amalgamate the dragons
+ * in the pattern.
+ */
+
+static void
+cut_connect_callback(int anchor, int color, struct pattern *pattern,
+                    int ll, void *data)
+{
+  int move;
+  int k;
+  int first_dragon  = NO_MOVE;
+  int second_dragon = NO_MOVE;
+
+  int other = OTHER_COLOR(color);
+  UNUSED(data);
+
+  move = AFFINE_TRANSFORM(pattern->move_offset, ll, anchor);
+  
+  if ((pattern->class & CLASS_B) && !safe_move(move, other))
+    return;
+
+  if (pattern->class & CLASS_C) {
+    /* If C pattern, test if there are more than one dragon in this
+     * pattern so that there is something to connect, before doing any
+     * expensive reading.
+     */
+
+    for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+      /* transform pattern real coordinate */
+      int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+      
+      /* Look for distinct dragons. */
+      if (pattern->patn[k].att == ATT_O) {
+       if (first_dragon == NO_MOVE)
+         first_dragon = dragon[pos].origin;
+       else if (second_dragon == NO_MOVE
+                && dragon[pos].origin != first_dragon) {
+         second_dragon = dragon[pos].origin;
+         /* A second dragon found, no need to continue looping. */
+         break;
+       }
+      }
+    }
+    if (second_dragon == NO_MOVE)
+      return; /* Nothing to amalgamate. */
+  }
+    
+  /* If the pattern has a constraint, call the autohelper to see
+   * if the pattern must be rejected.
+   */
+  if (pattern->autohelper_flag & HAVE_CONSTRAINT) {
+    if (!pattern->autohelper(ll, move, color, 0))
+      return;
+  }
+
+  /* If the pattern has a helper, call it to see if the pattern must
+   * be rejected.
+   */
+  if (pattern->helper) {
+    if (!pattern->helper(pattern, ll, move, color))
+      return;
+  }
+
+  if ((pattern->class & CLASS_B)
+      && !(pattern->class & CLASS_s)) {
+    /* Require that the X stones in the pattern are tactically safe. */
+    for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+      if (pattern->patn[k].att == ATT_X) {
+       /* transform pattern real coordinate */
+       int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+       if (attack(pos, NULL) == WIN
+           && (move == NO_MOVE
+               || !does_defend(move, pos)))
+         return; /* Match failed */
+      }
+    }
+  }
+
+  /* Get here => Pattern matches. */
+  if (pattern->class & CLASS_B) {
+    DEBUG(DEBUG_DRAGONS, "Cutting pattern %s+%d found at %1m\n",
+         pattern->name, ll, anchor);
+    DEBUG(DEBUG_DRAGONS, "cutting point %1m\n", move);
+  }
+  else if (pattern->class & CLASS_C)
+    DEBUG(DEBUG_DRAGONS, "Connecting pattern %s+%d found at %1m\n",
+         pattern->name, ll, anchor);
+
+  /* does the pattern have an action? */
+  if (pattern->autohelper_flag & HAVE_ACTION) {
+    pattern->autohelper(ll, move, color, 1);
+  }
+
+  /* If it is a B pattern, set cutting point. */
+  
+  if (pattern->class & CLASS_B) {
+    cutting_points[move] |= color;
+  }
+  else if (!(pattern->class & CLASS_C))
+    return; /* Nothing more to do, up to the helper or autohelper
+              to amalgamate dragons or modify eye space. */
+
+  /* If it is a C pattern, find the dragons to connect.
+   * If it is a B pattern, find eye space points to inhibit connection
+   * through.
+   */
+  first_dragon  = NO_MOVE;
+  second_dragon = NO_MOVE;
+  for (k = 0; k < pattern->patlen; ++k) { /* match each point */
+    /* transform pattern real coordinate */
+    int pos = AFFINE_TRANSFORM(pattern->patn[k].offset, ll, anchor);
+
+    /* Look for dragons to amalgamate. Never amalgamate stones which
+     * can be attacked.
+     */
+    if ((pattern->class & CLASS_C)
+       && board[pos] == color
+       && pattern->patn[k].att == ATT_O
+       && ((pattern->class & CLASS_s) || attack(pos, NULL) == 0)) {
+      if (first_dragon == NO_MOVE)
+       first_dragon = dragon[pos].origin;
+      else if (second_dragon == NO_MOVE
+              && dragon[pos].origin != first_dragon) {
+       second_dragon = dragon[pos].origin;
+       /* A second dragon found, we amalgamate them at once. */
+       /* Want this output if verbose or DEBUG_DRAGONS is on. */
+       if (verbose || (debug & DEBUG_DRAGONS))
+         gprintf("Pattern %s joins %C dragons %1m, %1m\n",
+                 pattern->name, color, first_dragon, second_dragon);
+       join_dragons(second_dragon, first_dragon);
+       /* Now look for another second dragon. */
+       second_dragon = NO_MOVE;
+       first_dragon = dragon[pos].origin;
+      }
+    }
+    
+    /* Inhibit connections */
+    if (pattern->class & CLASS_B) {
+      if (pattern->patn[k].att != ATT_not)
+       break; /* The inhibition points are guaranteed to come first. */
+      cutting_points[pos] |= color;
+      DEBUG(DEBUG_DRAGONS, "inhibiting connection at %1m\n", pos);
+    }
+  } /* loop over elements */
+}
+
+
+/* Only consider B patterns. */
+static void
+cut_callback(int anchor, int color, struct pattern *pattern, int ll,
+            void *data)
+{
+  if (pattern->class & CLASS_B)
+    cut_connect_callback(anchor, color, pattern, ll, data);
+}
+  
+
+/* Consider C patterns and those without classification. */
+static void
+conn_callback(int anchor, int color, struct pattern *pattern, int ll,
+             void *data)
+{
+  if (!(pattern->class & CLASS_B))
+    cut_connect_callback(anchor, color, pattern, ll, data);
+}
+  
+/* Find cutting points which should inhibit amalgamations and sever
+ * the adjacent eye space.
+ */
+void
+find_cuts(void)
+{
+  matchpat(cut_callback, ANCHOR_COLOR, &conn_db, NULL, NULL);
+}
+
+/* Find explicit connection patterns and amalgamate the involved dragons. */
+void
+find_connections(void)
+{
+  matchpat(conn_callback, ANCHOR_COLOR, &conn_db, NULL, NULL);
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/defense.db b/patterns/defense.db
new file mode 100644 (file)
index 0000000..12b2bbf
--- /dev/null
@@ -0,0 +1,402 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  defense.db - pattern database for finding tactical defense moves
+#
+#  The tactical reading functions try to defend by playing on the
+#  immediate liberties only. This database is intended to find
+#  additional defense moves. Notice though that these patterns doesn't
+#  help the tactical reading to find defense moves later in a move
+#  sequence but only at stackp=0.
+#
+#  See patterns.db for a specification of the current database format.
+#
+#  Since these patterns are matched during make_worms() it doesn't
+#  make any sense to use classifications such as X and O. No other
+#  classification than D is useful either since we only have tactical
+#  defense moves here.
+#
+#  The semantics of these patterns are that the move at * is tried
+#  as a defense for each attackable O string in the pattern.
+#  The patterns are matched with either player as O.
+#
+#  FIXME: There are still some redundant patterns.
+#
+##################################################################
+
+
+attribute_map none
+
+goal_elements none
+callback_data O
+
+
+Pattern Def1
+
+X*
+Ox
+
+:8,D
+
+X*
+Ox
+
+;olib(*)>1
+
+
+Pattern Def2
+# Require that the common tesuji at b doesn't invalidate this defense move.
+
+O.*
+O..
+
+:8,D
+
+a.*
+a.b
+
+;attack(a) && oplay_defend(*,b,a)
+
+
+Pattern Def4
+
+XOO?    capture one stone
+OX..
+O.*?
+?.??
+
+:8,D
+
+
+Pattern Def5
+
+OXoO    connect under
+O*..
+....
+----
+
+:8,D
+
+
+Pattern Def6
+
+OXXO    connect under (the connection may or may not be broken)
+O.*.
+....
+----
+
+:8,D
+
+
+Pattern Def9
+
+OX*O    cut!
+.OX?
+
+:8,D
+
+
+Pattern Def10
+
+XO?        connection pattern
+*.O
+?.?
+
+:8,D
+
+
+Pattern Def12
+
+?O*X           
+o.XO           
+?O.X
+
+:8,D
+
+
+Pattern Def16
+
+-----
+...O?
+*.OXO
+XO.X?
+?XX??
+
+:8,D
+
+
+Pattern Def17
+
++----
+|.*oo
+|O.o?     defend with good eye shape
+|XOOo     
+|XX??
+
+:8,D
+
+
+Pattern Def21
+
+|oOO
+|.X.
+|.OX
+|*XO
+|.O?        capture to connect
+
+:8,D
+
+|oaa
+|.X.
+|.OX
+|*XO
+|.O?
+
+;lib(a)>2
+
+
+Pattern Def25
+
+?XO           threaten to capture          
+?OX
+..*
+?O.
+
+:8,D
+
+
+Pattern Def26
+
+O.O?           Bamboo joint for defense
+O.*?
+
+:8,D
+
+
+Pattern Def28
+
+?O?
+Ox*        defend with eye shape
+?O?
+
+:-,D
+
+
+Pattern Def29
+
+?X?        make shape
+.O.
+...
+.*.
+?.?
+
+:|,D
+
+
+Pattern Def39
+
+?X?.??       jump under
+O..*.?
+O....?
+o....?
+------
+
+:8,D
+
+
+Pattern Def44
+
+??Xx?
+XXO*.         override solid connection
+OO...
+.....
+-----
+
+:8,D
+
+
+Pattern Def45
+
+OOXX         push to capture X
+.XO*
+....
+----
+
+:8,D
+
+
+Pattern Def49
+
+??X?
+O*.X         Draw back to defend connection
+..OX
+....
+----
+
+:8,D
+
+
+Pattern Def50
+
+??o?            hanging connection
+?O.*
+XXO.
+----
+
+:8,D
+
+
+Pattern Def52
+
+??????
+?....x             jump into empty space
+?.*.OO
+?....x
+??????
+
+:8,D
+
+
+Pattern Def55
+# Not on edge
+
+ooo
+O.O      form eye to protect
+.*X
+
+:8,D
+
+
+Pattern Def56
+
+xXO             extend after hane
+XO.
+.*.
+...
+
+:8,D
+
+
+Pattern Def57
+
+..O
+o*X
+..O
+
+:-,D
+
+
+Pattern Def58
+
+?????
+....?          jump! (But not down to second line)
+O.*.?
+....?
+X...?
+
+:8,D
+
+
+Pattern Def59
+
+....           jump!
+O.*.
+....
+X.X.
+
+:8,D
+
+
+Pattern Def60
+
+OXO             block opponent
+.*.
+?.?
+
+:|,D
+
+
+Pattern Def61
+
+?.?       extend to defend
+.*.
+XO?
+X.?
+XO?
+
+:8,D
+
+
+Pattern Def62
+
+oOo?           attach
+...?
+.*X.
+...?
+
+:8,D
+
+
+Pattern Def63
+
+O.Oo
+XO..     protect by drawing back
+XX*O
+
+:8,D
+
+
+Pattern Def68
+
+o.X?      try to defend by clamping to connect
+OX*O
+....
+----
+
+:8,D
+
+
+Pattern Def69
+
+OX*       atari on opponent to defend
+?O.
+
+:8,D
+
+aC*
+?b.
+
+;lib(a)>1 && lib(b)>1 && lib(C)<=2 && olib(*)>1
+
+
+Pattern Def70
+# pp New Pattern - see endgame:860 (3.5.1)
+
+OOOO*    a very specific position (defend the stone on the first line)
+O....
+XO...
+-----
+
+:8,D
+
diff --git a/patterns/dfa-mkpat.h b/patterns/dfa-mkpat.h
new file mode 100644 (file)
index 0000000..a950965
--- /dev/null
@@ -0,0 +1,231 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3             *
+ * or (at your option) any later version.                            *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _DFA_MKPAT_H_
+#define _DFA_MKPAT_H_
+
+#include "dfa.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+/********************************
+ *         Parameters           *
+ ********************************/
+
+#define DFA_RESIZE_STEP                20000
+#define DFA_INIT_SIZE          250
+
+/********************************
+ *    Data types definition     *
+ ********************************/
+
+/* Intersections. */
+typedef unsigned short Intersection_t;
+
+/* Attribute list. */
+typedef struct attrib
+{
+  int val;
+  int next;
+} attrib_t;
+
+
+/* DFA state. */
+typedef struct state
+{
+  int att;
+  int next[4];
+} state_t;
+
+
+/* DFA. */
+typedef struct dfa
+{
+  /* File header. */
+  char name[80];
+
+  /* Transition graph. */
+  state_t *states;
+  int max_states;
+  int last_state;
+
+  /* Attributes sets. */
+  attrib_t *indexes;
+  int max_indexes;
+  int last_index;
+} dfa_t;
+
+
+/********************************
+ *    Functions declaration     *
+ ********************************/
+
+void dfa_init(void);           /* Every call to a DFA function must be done */
+void dfa_end(void);            /* between calls to these two functions. */
+
+/* Basic DFA manipulation. */
+void print_c_dfa(FILE *of, const char *name, dfa_t *pdfa);
+void new_dfa(dfa_t *pdfa, const char *name);
+void copy_dfa(dfa_t *p_to, dfa_t *p_from);
+void kill_dfa(dfa_t *pdfa);
+int dfa_size(dfa_t *pdfa);     /* in kB */
+void save_dfa(const char *f_name, dfa_t *pdfa);
+dfa_t *load_dfa(const char *f_path, const char *f_name, dfa_t **ppdfa);
+void dfa_finalize(dfa_t *pdfa);
+void dfa_shuffle(dfa_t *pdfa);
+int dfa_calculate_max_matched_patterns(dfa_t *pdfa);
+int dfa_minmax_delta(dfa_t *pdfa, int next_index, int isMin);
+void dump_dfa(FILE *f, dfa_t *pdfa);
+
+struct pattern;
+
+/* Conversion between a GNU Go pattern struct into a DFA string. */
+void pattern_2_string(struct pattern *pat, struct patval_b *elements,
+                     char *str, int ci, int cj);
+void dfa_rotate_string(char *strrot, const char *str, int ll);
+
+/* Add a string with attribute `att_val' into a DFA. */
+float dfa_add_string(dfa_t *pdfa, const char *str, int pattern_index, int ll);
+
+
+/********************************
+ *    Global variables          *
+ ********************************/
+
+extern int dfa_verbose;                /* Verbiage level. */
+
+
+/**************************************
+ *     Experimental DFA builder      *
+ **************************************/
+
+#define DFA_ATTRIB_BLOCK_SIZE  150000
+#define DFA_NODE_BLOCK_SIZE     50000
+
+typedef struct _dfa_attrib      dfa_attrib;
+typedef struct _dfa_attrib_block dfa_attrib_block;
+typedef struct _dfa_attrib_array dfa_attrib_array;
+typedef struct _dfa_node        dfa_node;
+typedef struct _dfa_node_block  dfa_node_block;
+typedef struct _dfa_graph       dfa_graph;
+
+struct _dfa_attrib {
+  dfa_attrib      *next;
+  int              string_index;
+};
+
+struct _dfa_attrib_block {
+  dfa_attrib_block *previous;
+  dfa_attrib       attrib[DFA_ATTRIB_BLOCK_SIZE];
+};
+
+struct _dfa_attrib_array {
+  dfa_attrib_block *last_block;
+  int              allocated;
+};
+
+struct _dfa_node {
+  dfa_node        *branch[4];
+  dfa_attrib      *attributes;
+  dfa_attrib      *passing_strings;
+};
+
+struct _dfa_node_block {
+  dfa_node_block   *previous;
+  dfa_node         node[DFA_NODE_BLOCK_SIZE];
+};
+
+struct _dfa_graph {
+  int              num_nodes;
+  dfa_node        *root;
+  dfa_node_block   *last_block;
+  int              allocated;
+  dfa_attrib_array  attributes;
+};
+
+
+#define DFA_HASH_BLOCK_SIZE     10000
+
+#define DFA_HASH_TABLE_SIZE      4096
+#define DFA_HASH_VALUE_1            1
+#define DFA_HASH_VALUE_2           79
+#define DFA_HASH_VALUE_3         2971
+
+typedef struct _dfa_hash_entry  dfa_hash_entry;
+typedef struct _dfa_hash_block  dfa_hash_block;
+
+struct _dfa_hash_entry {
+  dfa_hash_entry   *next;
+  dfa_attrib      *key;
+  dfa_node        *value;
+};
+
+struct _dfa_hash_block {
+  dfa_hash_block   *previous;
+  dfa_hash_entry    entry[DFA_HASH_BLOCK_SIZE];
+};
+
+
+typedef struct _dfa_pattern     dfa_pattern;
+typedef struct _dfa_patterns    dfa_patterns;
+
+struct _dfa_pattern {
+  dfa_pattern     *next;
+  int              num_variations;
+  int              current_variation;
+  char            *variation[8];
+};
+
+struct _dfa_patterns {
+  int              num_patterns;
+  dfa_pattern     *patterns;
+  dfa_pattern     *last_pattern;
+  dfa_graph        graph;
+};
+
+
+void dfa_graph_reset(dfa_graph *graph);
+     
+void dfa_patterns_reset(dfa_patterns *patterns);
+void dfa_patterns_clear(dfa_patterns *patterns);
+void dfa_patterns_add_pattern(dfa_patterns *patterns,
+                             const char *string, int index);
+void dfa_patterns_set_last_pattern_variation(dfa_patterns *patterns,
+                                            int variation);
+void dfa_patterns_select_shortest_variation(dfa_patterns *patterns);
+void dfa_patterns_build_graph(dfa_patterns *patterns);
+int *dfa_patterns_optimize_variations(dfa_patterns *patterns, int iterations);
+
+
+#endif /* _DFA_MKPAT_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/dfa.c b/patterns/dfa.c
new file mode 100644 (file)
index 0000000..3689616
--- /dev/null
@@ -0,0 +1,1930 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * * * * * * * * fast pattern matching with DFA  version 2.9 * * *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "liberty.h"
+#include "patterns.h"
+#include "dfa-mkpat.h"
+#include "random.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+
+/*********************
+ *   Public data     *
+ *********************/
+
+/* If > 0 more detailed information is given */
+int dfa_verbose = 0;
+
+
+/*********************
+ *  Private data     *
+ *********************/
+
+/* auxiliary dfa's for high level functions */
+#define DFA_BINS 33 /* Number of temporary bins used to store intermediate DFAs */
+static dfa_t aux_dfa[DFA_BINS];        /* used to store intermediate DFAs */
+static dfa_t aux_temp;          /* used to store temporary DFAs */
+
+/* To be sure that everything was well initialized */
+static int dfa_was_initialized = 0;
+static int aux_count = 0;
+
+
+/* convert ATT_* values to the corresponding expected values on the board */
+static const char att2val[8] = {
+  '.', 'X', 'O', 'x', 'o', ',', 'a', '!'
+};
+
+#define EXPECTED_VAL(att_val) att2val[att_val]
+
+
+/************************************************
+ *   forward declaration of private functions   *
+ ************************************************/
+static void clean_dfa(dfa_t *pdfa);
+static void resize_dfa(dfa_t *pdfa, int max_states, int max_indexes);
+static void create_dfa(dfa_t *pdfa, const char *str, int att_val);
+static void do_sync_product(int l, int r);
+static void sync_product(dfa_t *pout, dfa_t *pleft, dfa_t *pright);
+
+static void dfa_prepare_rotation_data(void);
+
+
+/********************************
+ * manipulating attributes list *
+ ********************************/
+
+/*
+ * Test if val is member of the attributes set att
+ */
+
+static int
+member_att(dfa_t *pdfa, int att, int val)
+{
+  while (att != 0) {
+    if (pdfa->indexes[att].val == val)
+      return 1;
+    
+    att = pdfa->indexes[att].next;
+  }
+  
+  return 0;
+}
+
+/* 
+ * return the union of two attribute sets att1 & att2
+ * repectively from dfa1 and dfa2 into
+ * att in dfa.
+ */
+
+static int
+union_att(dfa_t *pdfa, dfa_t *pdfa1, int att1, dfa_t *pdfa2, int att2)
+{
+  int att;
+  int att_aux;
+
+  /* copy att1 in att */
+  att = 0;
+  while (att1 != 0) {
+    pdfa->last_index++;
+    if (pdfa->last_index >= pdfa->max_indexes)
+      resize_dfa(pdfa, pdfa->max_states, pdfa->max_indexes + DFA_RESIZE_STEP);
+    att_aux = pdfa->last_index;
+    
+    pdfa->indexes[att_aux].val = pdfa1->indexes[att1].val;
+    pdfa->indexes[att_aux].next = att;
+    att = att_aux;
+    att1 = pdfa1->indexes[att1].next;
+  }
+
+  /* add to att the new elements of att2 */
+  while (att2 != 0) {
+    if (!member_att(pdfa, att, pdfa2->indexes[att2].val)) {
+      pdfa->last_index++;
+      if (pdfa->last_index >= pdfa->max_indexes)
+       resize_dfa(pdfa, pdfa->max_states, pdfa->max_indexes + DFA_RESIZE_STEP);
+      att_aux = pdfa->last_index;
+
+      pdfa->indexes[att_aux].val = pdfa2->indexes[att2].val;
+      pdfa->indexes[att_aux].next = att;
+      att = att_aux;
+    }
+    att2 = pdfa2->indexes[att2].next;
+  }
+
+  return att;
+}
+
+
+/* Remove all attribute entry repetitions from a dfa.
+ */
+static void
+compactify_att(dfa_t *pdfa)
+{
+  int k;
+  int last = 0;
+  int save_last = pdfa->last_index;
+  int *map;
+  int *search_first;
+  int *search_next;
+  int size = (save_last + 1) * sizeof(int);
+
+  map = malloc(size);
+  map[0] = 0;
+  search_first = malloc(size);
+  memset(search_first, 0, size);
+  search_next = malloc(size);
+  memset(search_next, 0, size);
+
+  for (k = 1; k <= save_last; k++) {
+    int i = search_first[pdfa->indexes[k].val];
+
+    if (i) {
+      while (pdfa->indexes[i].next != pdfa->indexes[k].next) {
+       if (!search_next[i]) {
+         search_next[i] = ++last;
+         i = 0;
+         break;
+       }
+
+       i = search_next[i];
+      }
+    }
+    else
+      search_first[pdfa->indexes[k].val] = ++last;
+
+    if (i)
+      map[k] = i;
+    else {
+      map[k] = last;
+      pdfa->indexes[last] = pdfa->indexes[k];
+    }
+  }
+
+  free(search_first);
+  free(search_next);
+  
+  if (last < save_last) {
+    pdfa->last_index = last;
+    for (k = 0; k <= pdfa->last_index; k++)
+      pdfa->indexes[k].next = map[pdfa->indexes[k].next];
+
+    for (k = 0; k <= pdfa->last_state; k++)
+      pdfa->states[k].att = map[pdfa->states[k].att];
+
+    if (0)
+      fprintf(stderr, "compactified: %d attributes left of %d\n",
+             last, save_last);
+
+    compactify_att(pdfa);
+  }
+  
+  free(map);
+}
+
+
+/**********************
+ * manipulating dfa's *
+ **********************/
+
+
+/*
+ * return the effective size of a dfa in kB.
+ */
+
+int
+dfa_size(dfa_t *pdfa)
+{
+  int states_size, indexes_size;
+
+  states_size = (pdfa->last_state + 1) * sizeof(state_rt_t);
+  indexes_size = (pdfa->last_index + 1) * sizeof(attrib_rt_t);
+
+  return (states_size + indexes_size + sizeof(dfa_rt_t)) / 1024;
+}
+
+
+/* 
+ * resize memory for a dfa 
+ */
+
+static void
+resize_dfa(dfa_t *pdfa, int max_states, int max_indexes)
+{
+  state_t *pBuf;
+  attrib_t *pBuf2;
+  int i;
+
+  if (dfa_verbose > 1)
+    fprintf(stderr, "Resizing dfa %s\n", pdfa->name);
+
+  assert(pdfa->last_state <= pdfa->max_states);
+  assert(pdfa->last_index <= pdfa->max_indexes);
+
+  pBuf = realloc(pdfa->states, max_states * sizeof(*pBuf));
+  pBuf2 = realloc(pdfa->indexes, max_indexes * sizeof(*pBuf2));
+  if (pBuf == NULL || pBuf2 == NULL) {
+    fprintf(stderr, "No memory left for dfa: %s", pdfa->name);
+    exit(EXIT_FAILURE);
+  }
+
+  for (i = pdfa->max_states; i < max_states; i++)
+    memset(pBuf + i, 0, sizeof(state_t));
+  for (i = pdfa->max_indexes; i < max_indexes; i++)
+    memset(pBuf2 + i, 0, sizeof(attrib_t));
+
+  pdfa->states = pBuf;
+  pdfa->max_states = max_states;
+  pdfa->indexes = pBuf2;
+  pdfa->max_indexes = max_indexes;
+}
+
+
+
+/* 
+ * dump a dfa (debugging purpose).
+ */
+
+static const char *line =
+  "----------------------------------------------------\n";
+
+void
+dump_dfa(FILE *f, dfa_t *pdfa)
+{
+  int i;
+  int att, k;
+
+  fprintf(f, line);
+  fprintf(f, " name : %s\n", pdfa->name);
+  fprintf(f, " Nb states :  %7d, max= %d\n", pdfa->last_state + 1,
+         pdfa->max_states);
+  fprintf(f, " Nb Indexes : %7d, max= %d\n", pdfa->last_index,
+         pdfa->max_indexes);
+  fprintf(f, " memory needed : %d Mb\n", dfa_size(pdfa) / 1024);
+  fprintf(f, line);
+
+  if (dfa_size(pdfa) > 10000) /* change this value if needed */
+    return;
+  fprintf(f, " state  |   .    |   O    |   X    |   #    |  att \n");
+  fprintf(f, line);
+  for (i = 1; i != pdfa->last_state + 1; i++) {
+    int *pnext = pdfa->states[i].next;
+    fprintf(f, " %6d |", i);
+    fprintf(f, " %6d | %6d | %6d |", pnext[0], pnext[1], pnext[2]);
+    fprintf(f, " %6d |", pnext[OUT_BOARD]);
+    att = pdfa->states[i].att;
+    k = 0;
+    fprintf(f, " %5d:", att);
+    while (att != 0 && k < 10) {
+      fprintf(f, " %4d", pdfa->indexes[att].val);
+      att = pdfa->indexes[att].next;
+      k++;
+    }
+    if (att != 0)
+      fprintf(f, " ...");
+    fprintf(f, "\n");
+  }
+  fprintf(f, line);
+  fflush(f);
+}
+
+
+/*
+ * Reset a dfa
+ */
+
+static void
+clean_dfa(dfa_t *pdfa)
+{
+  memset(pdfa->states, 0, pdfa->max_states * sizeof(state_t));
+  memset(pdfa->indexes, 0, pdfa->max_indexes * sizeof(attrib_t));
+  pdfa->last_state = 1;                /* initial state */
+  pdfa->last_index = 0;
+  pdfa->indexes[0].val = -1;
+}
+
+
+/* 
+ * allocate memory for a new dfa 
+ */
+
+void
+new_dfa(dfa_t *pdfa, const char *name)
+{
+  memset(pdfa, 0, sizeof(dfa_t));
+  resize_dfa(pdfa, DFA_INIT_SIZE, DFA_INIT_SIZE);
+  clean_dfa(pdfa);
+  if (name != NULL)
+    strcpy(pdfa->name, name);
+  else
+    strcpy(pdfa->name, "noname ");
+
+  if (dfa_verbose > 1)
+    fprintf(stderr, "dfa %s is born :)\n", pdfa->name);
+
+}
+
+/*
+ * free memory used by a dfa
+ */
+
+void
+kill_dfa(dfa_t *pdfa)
+{
+  free(pdfa->states);
+  free(pdfa->indexes);
+  if (dfa_verbose > 1)
+    fprintf(stderr, "dfa %s is dead :(\n", pdfa->name);
+
+  memset(pdfa, 0, sizeof(dfa_t));
+}
+
+
+/*
+ * Copy a dfa and resize the destination dfa if necessary.
+ */
+
+void
+copy_dfa(dfa_t *p_to, dfa_t *p_from)
+{
+  assert(p_to != p_from);
+
+  if (p_to->max_states < p_from->last_state)
+    resize_dfa(p_to, p_from->max_states, p_to->max_indexes);
+
+  if (p_to->max_indexes < p_from->last_index)
+    resize_dfa(p_to, p_to->max_states, p_from->max_indexes);
+
+  clean_dfa(p_to);
+
+  memcpy(p_to->states, p_from->states,
+        sizeof(state_t) * (p_from->last_state + 1));
+  memcpy(p_to->indexes, p_from->indexes,
+        sizeof(attrib_t) * (p_from->last_index + 1));
+
+  p_to->last_state = p_from->last_state;
+  p_to->last_index = p_from->last_index;
+}
+
+
+/*
+ * print c dfa:
+ * print the dfa in c format.
+ */
+
+void
+print_c_dfa(FILE *of, const char *name, dfa_t *pdfa)
+{
+  int i;
+
+  if (sizeof(unsigned short) < 2) {
+    fprintf(of, "#error shorts too short");
+    fprintf(stderr, "Error: shorts are expected to be at least 2 bytes long.\n");
+    exit(EXIT_FAILURE);
+  }
+
+  assert(dfa_minmax_delta(pdfa, -1, 1) > -32768);
+  if (dfa_minmax_delta(pdfa, -1, 0)  > 32768) {
+    fprintf(of, "#error too many states");
+    fprintf(stderr, "Error: The dfa states are too disperse. Can't fit delta into a short.\n");
+    exit(EXIT_FAILURE);
+  }
+
+  if (pdfa->last_index + 1 > 65535) {
+    fprintf(of, "#error too many states");
+    fprintf(stderr, "Error: Too many index entries. Can't fit delta into a short.\n");
+    exit(EXIT_FAILURE);
+  }
+
+
+  fprintf(of, "\n#include \"dfa-mkpat.h\"\n");
+
+  fprintf(of, "static const state_rt_t state_%s[%d] = {\n",
+         name, pdfa->last_state + 1);
+  for (i = 0; i != pdfa->last_state + 1; i++) {
+    int j;
+    fprintf(of, "{{");
+    for (j = 0; j < 4; j++) {
+      int n = pdfa->states[i].next[j];
+      assert((n == 0) || (abs(n - i) < 32768));
+      fprintf(of, "%d", n ? n - i : 0);
+      if (j != 3)
+        fprintf(of, ",");
+    }
+    fprintf(of, "}, %d},%s", pdfa->states[i].att, ((i+1)%3 ? "\t" : "\n"));
+  }
+  fprintf(of, "};\n\n");
+
+
+  fprintf(of, "static const attrib_rt_t idx_%s[%d] = {\n",
+         name, pdfa->last_index + 1);
+  for (i = 0; i != pdfa->last_index + 1; i++)
+    fprintf(of, "{%d,%d},%s", pdfa->indexes[i].val, pdfa->indexes[i].next,
+                              ((i+1)%4 ? "\t" : "\n"));
+  fprintf(of, "};\n\n");
+
+  fprintf(of, "static dfa_rt_t dfa_%s = {\n", name);
+  fprintf(of, " \"%s\",\n", name);
+  fprintf(of, "state_%s,\n", name);
+  fprintf(of, "idx_%s", name);
+  fprintf(of, "};\n");
+}
+
+
+/*
+ * Create a linear dfa from a string and an attributes value
+ * and resize the dfa if needed.
+ *
+ * For example:
+ * create_dfa(pdfa, "Oo?.", 2001)
+ * gives:
+ *
+ *           1              0,1            0,1,2             0
+ * (1,{}) -------> (2,{}) -------> (3,{}) -------> (4,{}) ------> (5,{2001})
+ *                                                  
+ * An empty string force a junk pattern : The scanner will always 
+ * consider this pattern as active.
+ *
+ * The possible input symbols are :
+ * 
+ * '.', ',', '*', '!' for EMPTY expected.
+ * 'X'                for BLACK expected.
+ * 'O'                for WHITE expected.
+ * 'x'                for BLACK|EMPTY expected.
+ * 'o'                for WHITE|EMPTY expected.
+ * '#', '+', '-', '|' for OUT_BOARD expected.
+ * '?'                for EMPTY|BLACK|WHITE expected.
+ * '$'                for EMPTY|BLACK|WHITE|OUT_BOARD expected.
+ */
+
+static void
+create_dfa(dfa_t *pdfa, const char *str, int att_val)
+{
+  int new_state;
+
+  if (dfa_verbose > 1)
+    fprintf(stderr, "linear dfa in %s with string: %s\n", pdfa->name, str);
+
+  assert(str != NULL);
+  assert(pdfa->max_states > 1);
+  assert(pdfa->max_indexes > 1);
+
+  clean_dfa(pdfa);
+  new_state = 1;
+  for (; *str != '\0' && strchr("$#+-|OoXx.?,!a*", *str); str++) {
+    memset(pdfa->states[new_state].next, 0, 4 * sizeof(int));
+    if (strchr("$?.ox,a!*", *str))
+      pdfa->states[new_state].next[0] = new_state + 1;
+    if (strchr("$?Oo", *str))
+      pdfa->states[new_state].next[1] = new_state + 1;
+    if (strchr("$?Xx", *str))
+      pdfa->states[new_state].next[2] = new_state + 1;
+    if (strchr("$#+-|", *str))
+      pdfa->states[new_state].next[OUT_BOARD] = new_state + 1;
+    new_state++;
+    if (new_state >= pdfa->max_states)
+      resize_dfa(pdfa, pdfa->max_states + DFA_RESIZE_STEP,
+                pdfa->max_indexes);
+  }
+  memset(pdfa->states[new_state].next, 0, 4 * sizeof(int));
+
+  pdfa->last_index++;
+  if (pdfa->last_index >= pdfa->max_indexes)
+    resize_dfa(pdfa, pdfa->max_states,
+              pdfa->max_indexes + DFA_RESIZE_STEP);
+
+  memset(&(pdfa->indexes[pdfa->last_index]), 0, sizeof(attrib_t));
+  pdfa->states[new_state].att = pdfa->last_index;
+
+  pdfa->indexes[pdfa->states[new_state].att].val = att_val;
+  pdfa->indexes[pdfa->states[new_state].att].next = 0;
+  pdfa->last_state = new_state;
+}
+
+
+/**************************
+ * Test array with a      *
+ * hash table             *
+ **************************/
+/* used by sync_product   *
+ * to store visited states*
+ **************************/
+
+#define MAX_HASH_VALUE 4096
+
+typedef struct entry {
+  int l, r; /* key */
+  int val; /* value */
+  struct entry *pnext; /* NULL if end of list */
+} entry_t;
+
+typedef struct test_array {
+  entry_t *hash[MAX_HASH_VALUE];
+} test_array_t;
+
+
+/* initialize empty lists */
+static void
+new_test_array(test_array_t *pta)
+{
+  int h;
+
+  for (h = 0; h != MAX_HASH_VALUE ; h++)
+    pta->hash[h] = NULL;
+}
+
+/* Searh for (l, r) in the linked list plist */
+static int 
+get_from_entry_list(entry_t *plist, int l, int r)
+{
+  int val = 0;
+  
+  while (plist != NULL) {
+    if (plist->l == l && plist->r == r)
+      val = plist->val;
+    plist = plist->pnext;
+  }
+  return val;
+}
+
+/* get the value associated with (l, r) or 0 if none */
+static int
+get_from_test_array(test_array_t *pta, int l, int r)
+{
+  return get_from_entry_list(pta->hash[(l+r) % MAX_HASH_VALUE], l, r);
+}
+
+
+/* insert a new entry at the beginning of the linked list pplist */
+static void
+add_to_entry_list(entry_t **pplist, int l, int r, int val)
+{
+  entry_t *new_entry;
+
+  /* make sure val > 0: val = 0 is used in get_from_entry_list */
+  assert(val > 0);
+  assert(!get_from_entry_list(*pplist, l, r));
+
+  new_entry = malloc(sizeof(*new_entry));
+  if (new_entry == NULL) {
+    fprintf(stderr, "No memory left for new entry\n");
+    exit(EXIT_FAILURE);
+  }
+  new_entry->pnext = *pplist;
+  new_entry->l = l;
+  new_entry->r = r;
+  new_entry->val = val;
+  *pplist = new_entry;
+}
+
+
+/* add a value at (l, r) */
+static void
+add_to_test_array(test_array_t *pta, int l, int r, int val)
+{
+  add_to_entry_list(&(pta->hash[(l+r) % MAX_HASH_VALUE]), l, r, val);
+}
+
+/* free the elements of the linked list plist */
+static void
+free_entry_list(entry_t *plist)
+{
+  entry_t *pentry;
+  
+  while (plist != NULL) {
+    pentry = plist;
+    plist = plist->pnext;
+    free(pentry);
+  }
+}
+
+/* free allocated memory */
+static void
+free_test_array(test_array_t *pta)
+{
+  int h;
+
+  for (h = 0; h != MAX_HASH_VALUE; h++) {
+    free_entry_list(pta->hash[h]);
+    pta->hash[h] = NULL;
+  }
+}
+
+
+/* 
+ * Synchronization product between two automata.
+ *
+ * L(A) is the set of patterns recognized by the automaton A.
+ *
+ * A syncronized product betwenn two acyclic deterministic automata
+ * A1 and A2 is an acyclic deterministic classifier A1xA2 that 
+ * recognize and classify the languages 
+ * L(A1), L(A2), L(A1 Union A2) and L(A1 Inter A2).
+ *
+ * This algorithm do the product and the reduction at the same time.
+ *
+ * See Hopcroft & Ullman "The design and analysis of computer algorithms"
+ * Ed. Addison-Wesley, Reading MA, 1974
+ * For the theorical aspects.
+ */
+
+/* globals used to improve readability */
+static dfa_t *gpout, *gpleft, *gpright;
+
+/* Hash table used to test if a state has already been
+   visited and then give its position in the new automaton. */
+static test_array_t gtest;
+
+static void
+do_sync_product(int l, int r)
+{
+  int c;
+  int nextl, nextr;
+  int state;
+
+  state = gpout->last_state;
+
+  /* unify the attributes of states l and r */
+  gpout->states[state].att = union_att(gpout, gpleft, gpleft->states[l].att,
+                                      gpright, gpright->states[r].att);
+
+  /* scan each possible out-transition */
+  for (c = 0; c != 4; c++) {
+    nextl = gpleft->states[l].next[c];
+    nextr = gpright->states[r].next[c];
+    assert(nextl < gpleft->last_state + 1);
+    assert(nextr < gpright->last_state + 1);
+    
+    /* transition to (0,0) mean no transition at all */
+    if (nextl != 0 || nextr != 0) {
+      /* if the out-state doesn't already exist */
+      if (get_from_test_array(&gtest, nextl, nextr) == 0) {
+       /* create it! */
+       gpout->last_state++;
+       if (gpout->last_state >= gpout->max_states)
+         resize_dfa(gpout, gpout->max_states + DFA_RESIZE_STEP,
+                    gpout->max_indexes);
+       
+       add_to_test_array(&gtest, nextl, nextr, gpout->last_state);
+       
+       /* link it */
+       gpout->states[state].next[c] = gpout->last_state;
+       
+       /* create also its sub-automaton */
+       do_sync_product(nextl, nextr);
+      }
+      else {
+       /* link it */
+       gpout->states[state].next[c] =
+         get_from_test_array(&gtest, nextl, nextr);
+      }
+    }
+    else {
+      /* no output by c from the actual state */
+      gpout->states[state].next[c] = 0;
+    }
+  }
+}
+
+static void
+sync_product(dfa_t *pout, dfa_t *pleft, dfa_t *pright)
+{
+  pout->last_index = 0;
+
+  if (dfa_verbose > 2) {
+    fprintf(stderr, "Product between %s and %s\n", pleft->name, pright->name);
+    fprintf(stderr, "result in %s\n", pout->name);
+  }
+
+
+  gpout = pout;
+  gpleft = pleft;
+  gpright = pright;
+  new_test_array(&gtest);
+  add_to_test_array(&gtest, 1, 1, 1);
+  pout->last_state = 1;
+
+  do_sync_product(1, 1);
+
+  free_test_array(&gtest);
+}
+
+/* 
+ * Init/end functions
+ */
+
+void
+dfa_init(void)
+{
+  int j;
+
+  if (dfa_verbose > 1)
+    fprintf(stderr, "dfa: init\n");
+  dfa_was_initialized++;
+
+  build_spiral_order();
+  dfa_prepare_rotation_data();
+
+  for (j = 0; j < DFA_BINS; j++)
+    new_dfa(&(aux_dfa[j]), "binAux ");
+  new_dfa(&aux_temp, "tempAux ");
+}
+
+void
+dfa_end(void)
+{
+  int j;
+
+  if (dfa_verbose > 1)
+    fprintf(stderr, "dfa: end\n");
+
+  for (j = 0; j < DFA_BINS; j++)
+    kill_dfa(&(aux_dfa[j]));
+  kill_dfa(&aux_temp);
+  dfa_was_initialized--;
+}
+
+
+/*
+ * Returns max or min jump distance from state to next[next_index] for
+ * all states.  If next_index < 0, then max/min for all for states.
+ */
+
+int 
+dfa_minmax_delta(dfa_t *pdfa, int next_index, int isMin)
+{
+
+  int ret, i, j;
+  assert(next_index <= 3);
+  if (isMin)
+    ret = 99999;
+  else
+    ret = -1;
+
+  for (i = 0; i <= pdfa->last_state; i++) {
+    for (j = 0; j < 4; j++) {
+      if (j == next_index || next_index < 0) { 
+        int next = pdfa->states[i].next[j];
+        if (!next)
+          continue;
+        if (isMin) {
+          if (ret > next - i)
+            ret = next - i;
+        }
+       else {
+          if (ret < next - i)
+            ret = next - i;
+        }
+      }
+    }
+  }
+
+  return ret;
+}
+
+#define DFA_ALIGN      2
+
+/*
+ * Re-orders DFA into a canonical form, which does a half-hearted 
+ * attempt to reduce the size of jumps for all states entries.
+ */
+void
+dfa_shuffle(dfa_t *pdfa)
+{
+  struct state *old_states;
+  int *state_to;
+  int *state_from;
+  int *queue1;
+  int *queue2;
+  int *tempq;
+  int next_new_state;
+  int q1p;
+  int q2p;
+  int i, j;
+
+  state_to = calloc(pdfa->last_state+1, sizeof(*state_to));
+  state_from = calloc(pdfa->last_state+1, sizeof(*state_from));
+
+  queue1 = malloc((pdfa->last_state+1) * sizeof(*queue1));
+  queue2 = malloc((pdfa->last_state+1) * sizeof(*queue2));
+  q1p = 1;
+  q2p = 0;
+  queue1[0] = 1;  /* i.e. start at state 1. */
+  state_from[0] = state_to[0] = 0;
+  state_from[1] = state_to[1] = 1;
+  next_new_state = 2;
+
+  while (q1p) {
+    for (i = 0; i < q1p; i++) {
+      for (j = 0; j < 4; j++) {
+        int n = pdfa->states[queue1[i]].next[j];
+       /* next_new_state = DFA_ALIGN * ((next_new_state-1) / DFA_ALIGN) + 1;*/
+        while (n && !state_to[n]) {
+          state_to[n] = next_new_state;
+          state_from[next_new_state] = n;
+          next_new_state++;
+          queue2[q2p++] = n;
+         n = pdfa->states[n].next[0];
+        }
+      }
+    }
+    tempq = queue1;
+    queue1 = queue2;
+    queue2 = tempq;
+    q1p = q2p;
+    q2p = 0;
+  }
+
+  old_states = malloc((pdfa->last_state+1) * sizeof(*old_states));
+  for (i = 1; i <= pdfa->last_state; i++) {
+    for (j = 0; j < 4; j++) {
+      old_states[i].next[j] = pdfa->states[i].next[j];
+      old_states[i].att = pdfa->states[i].att;
+    }
+  }
+  for (i = 1; i <= pdfa->last_state; i++) {
+    for (j = 0; j < 4; j++) {
+      assert(state_to[i] > 0);
+      pdfa->states[i].next[j] = state_to[old_states[state_from[i]].next[j]];
+    } 
+    pdfa->states[i].att = old_states[state_from[i]].att;
+  } 
+}
+
+
+/* Calculate the maximal number of patterns matched at one point for
+ * one transformation.  Multiplying this number by 8 gives an upper
+ * bound for the total number of matched patterns for all
+ * transformation.
+ */
+int
+dfa_calculate_max_matched_patterns(dfa_t *pdfa)
+{
+  int total_max = 0;
+  int *state_max = calloc(pdfa->last_state + 1, sizeof(int));
+  char *queued = calloc(pdfa->last_state + 1, sizeof(char));
+  int *queue = malloc(pdfa->last_state * sizeof(int));
+  int queue_start = 0;
+  int queue_end = 1;
+
+  queue[0] = 1;
+  while (queue_start < queue_end) {
+    int state = queue[queue_start++];
+    int k;
+
+    /* Increment maximal number of matched patterns for each pattern
+     * matched at current `state'.
+     */
+    for (k = pdfa->states[state].att; k; k = pdfa->indexes[k].next)
+      state_max[state]++;
+
+    if (total_max < state_max[state])
+      total_max = state_max[state];
+
+    for (k = 0; k < 4; k++) {
+      int next = pdfa->states[state].next[k];
+
+      if (next != 0) {
+       if (!queued[next]) {
+         queue[queue_end++] = next;
+         queued[next] = 1;
+       }
+
+       if (state_max[next] < state_max[state])
+         state_max[next] = state_max[state];
+      }
+    }
+  }
+
+  assert(queue_end == pdfa->last_state);
+
+  free(state_max);
+  free(queued);
+  free(queue);
+
+  return total_max;
+}
+
+
+/*
+ * Merges cached dfas into the master DFA
+ */
+void 
+dfa_finalize(dfa_t *pdfa) 
+{
+  int j;
+  int next_bin = aux_count;
+  int last_bin = aux_count + DFA_BINS - 1;
+  while (next_bin + 1 != last_bin) {
+    for (j = aux_count + 1; j <= last_bin; j += 2) {
+      if (j+1 == next_bin)
+        copy_dfa(&aux_dfa[next_bin % DFA_BINS], &aux_dfa[j % DFA_BINS]);
+      else
+        sync_product(&aux_dfa[next_bin % DFA_BINS], 
+                     &aux_dfa[j % DFA_BINS], 
+                     &aux_dfa[(j+1) % DFA_BINS]);
+      next_bin++;
+    }
+    last_bin = next_bin - 1;
+    aux_count--;
+    next_bin = aux_count;
+  }
+  copy_dfa(pdfa, &aux_dfa[last_bin % DFA_BINS]);
+  
+  compactify_att(pdfa);
+}
+
+/*
+ * Add a new string with attribute att_val into the dfa.
+ * if the new size of the dfa respect some size conditions
+ * return increase in kB or -1 if the pattern was rejected.
+ * This function never rejects string of length <= 1.
+ */
+
+float
+dfa_add_string(dfa_t *pdfa, const char *str, int pattern_index, int ll)
+{
+  dfa_t *new_dfa = &(aux_dfa[aux_count % DFA_BINS]);
+  dfa_t *old_dfa = &(aux_dfa[(aux_count+1) % DFA_BINS]);
+  float ratio;
+
+  if (dfa_verbose > 1) {
+    fprintf(stderr, "Adding to dfa %s the string: %s\n", pdfa->name, str);
+    fprintf(stderr, "  pat_ind: %d; rotation: %d at bin: %d\n",
+           pattern_index, ll, aux_count);
+  }
+
+  assert(dfa_was_initialized > 0);
+  assert(pdfa != NULL);
+
+  create_dfa(&aux_temp, str, pattern_index);
+
+  /* then we do the synchronization product with dfa */
+  sync_product(new_dfa, old_dfa, &aux_temp);
+  aux_count++;
+
+  ratio = 1;
+  if (dfa_size(old_dfa) > 0)
+    ratio = (float) (dfa_size(new_dfa) / dfa_size(old_dfa));
+
+  return ratio;
+}
+
+
+/* Used for quick string rotation. */
+static int dfa_rotation_data[DFA_BASE * DFA_BASE];
+
+static void
+dfa_prepare_rotation_data(void)
+{
+  int k;
+
+  for (k = 0; k < DFA_MAX_ORDER; k++)
+    dfa_rotation_data[DFA_POS(0, 0) + spiral[k][0]] = k;
+}
+
+
+/* Create a transformation of `string' and store it in
+ * `rotated_string'.  The latter must be of at least DFA_MAX_ORDER
+ * characters in length. */
+void
+dfa_rotate_string(char *rotated_string, const char *string, int transformation)
+{
+  if (transformation > 0) {
+    int k;
+    int length = strlen(string);
+    int new_length = 0;
+
+    memset(rotated_string, '$', DFA_MAX_ORDER);
+
+    for (k = 0; k < length; k++) {
+      if (string[k] != '$') {
+       int string_position = dfa_rotation_data[DFA_POS(0, 0)
+                                               + spiral[k][transformation]];
+       rotated_string[string_position] = string[k];
+       if (string_position + 1 > new_length)
+         new_length = string_position + 1;
+      }
+    }
+
+    rotated_string[new_length] = 0;
+  }
+  else
+    strcpy(rotated_string, string);
+}
+
+
+/*
+ * Build a pattern string from a pattern.  `str' must refer a buffer
+ * of size greater than DFA_MAX_ORDER.
+ */
+void
+pattern_2_string(struct pattern *pat, struct patval_b *elements,
+                char *str, int ci, int cj)
+{
+  char work_space[DFA_MAX_BOARD * 4][DFA_MAX_BOARD * 4];
+  int m, n;                    /* anchor position */
+  int edges, borders, to_test;
+  int i, j, k;
+  char c;
+
+  m = DFA_MAX_BOARD * 2 + ci;
+  n = DFA_MAX_BOARD * 2 + cj;  /* position of the anchor */
+
+  assert(dfa_was_initialized);
+  memset(str, 0, DFA_MAX_ORDER);
+  memset(work_space, '#', sizeof(work_space));
+
+  if (dfa_verbose > 0)
+    fprintf(stderr, "converting pattern into string.\n");
+
+  /* basic edge constraints */
+  for (i = DFA_MAX_BOARD; i != DFA_MAX_BOARD * 3; i++)
+    for (j = DFA_MAX_BOARD; j != DFA_MAX_BOARD * 3; j++)
+      work_space[i][j] = '$';
+
+  /* pattern mask */
+  for (i = pat->mini + m; i != pat->maxi + m + 1; i++)
+    for (j = pat->minj + n; j != pat->maxj + n + 1; j++)
+      work_space[i][j] = '?';
+
+  /* more advanced edge constraints */
+
+  /* South constraint */
+  if (pat->edge_constraints & SOUTH_EDGE) {
+    for (i = m + pat->maxi + 1; i != DFA_MAX_BOARD * 3; i++)
+      for (j = 0; j != DFA_MAX_BOARD * 3; j++)
+       work_space[i][j] = '-';
+  }
+
+  /* East constraint */
+  if (pat->edge_constraints & EAST_EDGE) {
+    for (i = 0; i != DFA_MAX_BOARD * 3; i++)
+      for (j = n + pat->maxj + 1; j != DFA_MAX_BOARD * 3; j++)
+       work_space[i][j] = '|';
+  }
+  
+  /* North constraint */
+  if (pat->edge_constraints & NORTH_EDGE) {
+    for (i = 0; i != m + pat->mini; i++)
+      for (j = 0; j != DFA_MAX_BOARD * 4; j++)
+       work_space[i][j] = '-';
+  }
+
+  /* West constraint */
+  if (pat->edge_constraints & WEST_EDGE) {
+    /* take care not to erase the south edge constraint */
+    for (i = 0; i != m + pat->maxi + 1; i++)
+      for (j = 0; j != n + pat->minj; j++)
+       work_space[i][j] = '|';
+
+    /* complete the last corner only if necessary */
+    if (!(pat->edge_constraints & SOUTH_EDGE)) {
+      for (i = m + pat->maxi + 1; i != DFA_MAX_BOARD * 3; i++)
+       for (j = 0; j != n + pat->minj; j++)
+         work_space[i][j] = '|';
+    }
+  }
+
+  /* dump */
+  if (dfa_verbose > 4) {
+    for (i = DFA_MAX_BOARD - 1; i != DFA_MAX_BOARD * 3 + 1; i++) {
+      for (j = DFA_MAX_BOARD - 1; j != DFA_MAX_BOARD * 3 + 1; j++) {
+       if (i == m && j == n)
+         fprintf(stderr, "s"); /* mark the anchor */
+       else
+         fprintf(stderr, "%c", work_space[i][j]);
+      }
+      fprintf(stderr, "\n");
+    }
+    fprintf(stderr, "\n");
+  }
+
+  /* pattern representation on the work space */
+  for (k = 0; k != pat->patlen; k++) {
+    c = EXPECTED_VAL(elements[k].att);
+    assert(work_space[m + elements[k].x - ci][n + elements[k].y - cj] == '?');
+    work_space[m + elements[k].x - ci][n + elements[k].y - cj] = c;
+  }
+
+  /* dump */
+  if (dfa_verbose > 3) {
+    for (i = DFA_MAX_BOARD - 1; i != DFA_MAX_BOARD * 3 + 1; i++) {
+      for (j = DFA_MAX_BOARD - 1; j != DFA_MAX_BOARD * 3 + 1; j++) {
+       if (i == m && j == n)
+         fprintf(stderr, "s"); /* mark the anchor */
+       else
+         fprintf(stderr, "%c", work_space[i][j]);
+      }
+      fprintf(stderr, "\n");
+    }
+    fprintf(stderr, "\n");
+  }
+
+  /* Now we can build the smallest pattern string possible 
+   * from the anchor */
+
+  to_test = pat->patlen;       /* How many positions left to test ? */
+  edges = pat->edge_constraints;       /* how many constraint tested ? */
+  borders = 0xF; 
+  /* we must test at least one intersection by border for 
+   * patterns like
+   * 
+   * ???
+   * O.O
+   * ???
+   * 
+   * To ensure edge position.
+   */
+
+  for (k = 0;
+       (k != DFA_MAX_ORDER - 1) && ((borders > 0) || edges || to_test > 0);
+       k++) {
+    j = spiral[k][0] % DFA_BASE;
+    if (j >= DFA_MAX_BOARD)
+      j -= DFA_BASE;
+    if (j <= -DFA_MAX_BOARD)
+      j += DFA_BASE;
+    i = (spiral[k][0] - j) / DFA_BASE;
+
+    if (i == pat->maxi)
+      borders &= ~SOUTH_EDGE;
+    if (i == pat->mini)
+      borders &= ~NORTH_EDGE;
+    if (j == pat->maxj)
+      borders &= ~EAST_EDGE;
+    if (j == pat->minj)
+      borders &= ~WEST_EDGE;
+    
+    assert(m + i < DFA_MAX_BOARD * 3 && m + i < DFA_MAX_BOARD * 3);
+    str[k] = work_space[m + i][n + j];
+    assert(strchr("XOxo.,a!?$#|-+", str[k]));
+    
+    if (strchr("XOxo.,a!", str[k]))
+      to_test--;
+    if (strchr("#|-+", str[k])) {
+      if (i > pat->maxi)
+       edges &= ~SOUTH_EDGE;
+      if (i < pat->mini)
+       edges &= ~NORTH_EDGE;
+      if (j > pat->maxj)
+       edges &= ~EAST_EDGE;
+      if (j < pat->minj)
+       edges &= ~WEST_EDGE;
+    }
+  }
+  
+  assert(k < DFA_MAX_ORDER);
+  str[k] = '\0';               /* end of string */
+
+  if (0 && dfa_verbose > 0)
+    fprintf(stderr, "converted pattern %s into string: %s\n", pat->name, str);
+}
+
+
+/**************************************
+ *     Experimental DFA builder      *
+ **************************************/
+
+/* This builder differs from the one above in that it builds the whole dfa
+ * at once. That is, it must have all the patterns to build and cannot add
+ * pattern by pattern. Currently, it is only used in DFA size optimization
+ * (it seems to be significantly faster).
+ */
+
+
+/* Allocate a new dfa_attrib structure from a dynamic array. */
+static dfa_attrib *
+dfa_attrib_new(dfa_attrib_array *array, int string_index)
+{
+  dfa_attrib *attribute;
+
+  if (array->allocated == DFA_ATTRIB_BLOCK_SIZE) {
+    dfa_attrib_block *new_block = malloc(sizeof(*new_block));
+    assert(new_block);
+
+    new_block->previous = array->last_block;
+    array->last_block = new_block;
+    array->allocated = 0;
+  }
+
+  attribute = &(array->last_block->attrib[array->allocated++]);
+  attribute->next = NULL;
+  attribute->string_index = string_index;
+
+  return attribute;
+}
+
+
+/* Initialize dfa_attrib_array structure. */
+static void
+dfa_attrib_array_reset(dfa_attrib_array *array)
+{
+  array->last_block = NULL;
+  array->allocated = DFA_ATTRIB_BLOCK_SIZE;
+}
+
+
+/* Clear a dynamic array by freeing all blocks befor `cutoff_point'. */
+static void
+dfa_attrib_array_partially_clear(dfa_attrib_block *cutoff_point)
+{
+  if (cutoff_point) {
+    dfa_attrib_block *block = cutoff_point->previous;
+
+    while (block) {
+      dfa_attrib_block *previous = block->previous;
+      free(block);
+      block = previous;
+    }
+
+    cutoff_point->previous = NULL;
+  }
+}
+
+
+/* Clear a dynamic array completely. All blocks are freed. */
+static void
+dfa_attrib_array_clear(dfa_attrib_array *array)
+{
+  if (array->last_block) {
+    dfa_attrib_array_partially_clear(array->last_block);
+    free(array->last_block);
+    array->last_block = NULL;
+  }
+
+  array->allocated = DFA_ATTRIB_BLOCK_SIZE;
+}
+
+
+/* Allocate a new dfa_node structure in a DFA graph. */
+static dfa_node *
+dfa_node_new(dfa_graph *graph)
+{
+  dfa_node *node;
+
+  if (graph->allocated == DFA_NODE_BLOCK_SIZE) {
+    dfa_node_block *new_block = malloc(sizeof(*new_block));
+    assert(new_block);
+
+    new_block->previous = graph->last_block;
+    graph->last_block = new_block;
+    graph->allocated = 0;
+  }
+
+  graph->num_nodes++;
+  node = &(graph->last_block->node[graph->allocated++]);
+  memset(node, 0, sizeof(dfa_node));
+
+  return node;
+}
+
+
+/* This is a hash table used to quickly find a DFA node using a linked list
+ * of its attributes as a key.
+ */
+static dfa_hash_entry *dfa_hash_table[DFA_HASH_TABLE_SIZE];
+static dfa_hash_block *dfa_hash_last_block = NULL;
+static int dfa_hash_allocated;
+
+
+/* Allocate a dfa_entry structure dynamically. */
+static dfa_hash_entry *
+dfa_hash_entry_new(void)
+{
+  if (dfa_hash_allocated == DFA_HASH_BLOCK_SIZE) {
+    dfa_hash_block *new_block = malloc(sizeof(*new_block));
+    assert(new_block);
+
+    new_block->previous = dfa_hash_last_block;
+    dfa_hash_last_block = new_block;
+    dfa_hash_allocated = 0;
+  }
+
+  return &(dfa_hash_last_block->entry[dfa_hash_allocated++]);
+}
+
+
+/* Clear the hash table completely. Used after having finished a graph level. */
+static void
+dfa_hash_clear(void)
+{
+  memset(dfa_hash_table, 0, DFA_HASH_TABLE_SIZE * sizeof(dfa_hash_entry *));
+
+  if (dfa_hash_last_block) {
+    dfa_hash_block *block = dfa_hash_last_block->previous;
+
+    while (block) {
+      dfa_hash_block *previous = block->previous;
+      free(block);
+      block = previous;
+    }
+
+    dfa_hash_last_block->previous = NULL;
+    dfa_hash_allocated = 0;
+  }
+  else
+    dfa_hash_allocated = DFA_HASH_BLOCK_SIZE;
+}
+
+
+/* Compute the hash value of a key (linked list of attributes). */
+static int
+dfa_hash_value(dfa_attrib *key)
+{
+  int hash_value = DFA_HASH_VALUE_1 * key->string_index;
+  if (key->next) {
+    hash_value += DFA_HASH_VALUE_2 * key->next->string_index;
+    if (key->next->next)
+      hash_value += DFA_HASH_VALUE_3 * key->next->next->string_index;
+  }
+
+  return hash_value % DFA_HASH_TABLE_SIZE;
+}
+
+
+/* Search for a node with a given key in the hash table. */
+static dfa_node *
+dfa_hash_search(dfa_attrib *key)
+{
+  int hash_value = dfa_hash_value(key);
+  dfa_hash_entry *entry;
+
+  for (entry = dfa_hash_table[hash_value]; entry; entry = entry->next) {
+    dfa_attrib *left = key;
+    dfa_attrib *right = entry->key;
+
+    while (left && right) {
+      if (left->string_index != right->string_index)
+       break;
+
+      left = left->next;
+      right = right->next;
+    }
+
+    if (!left && !right)
+      return entry->value;
+  }
+
+  return NULL;
+}
+
+
+/* Add a node to the table. The list of strings which pass through it is used
+ * as a key.
+ */
+static void
+dfa_hash_add_node(dfa_node *node)
+{
+  int hash_value = dfa_hash_value(node->passing_strings);
+  dfa_hash_entry *entry;
+
+  entry = dfa_hash_entry_new();
+  entry->next = dfa_hash_table[hash_value];
+  dfa_hash_table[hash_value] = entry;
+
+  entry->key = node->passing_strings;
+  entry->value = node;
+}
+
+
+/* DFA iterator. Used to walk the array of nodes in backward direction. */
+static dfa_node_block *dfa_iterator_block;
+static int dfa_iterator_node_num;
+
+
+/* Reset the iterator. The last added node of the specified graph becomes
+ * the current node.
+ */
+static dfa_node*
+dfa_iterator_reset(dfa_graph *graph)
+{
+  assert(graph->last_block);
+
+  if (graph->allocated > 0) {
+    dfa_iterator_block = graph->last_block;
+    dfa_iterator_node_num = graph->allocated - 1;
+  }
+  else {
+    dfa_iterator_block = graph->last_block->previous;
+    assert(dfa_iterator_block);
+    dfa_iterator_node_num = DFA_NODE_BLOCK_SIZE - 1;
+  }
+
+  return &(dfa_iterator_block->node[dfa_iterator_node_num]);
+}
+
+
+/* Shift the current node pointer one node backwards. */
+static dfa_node*
+dfa_iterate(void)
+{
+  dfa_iterator_node_num--;
+  if (dfa_iterator_node_num < 0) {
+    dfa_iterator_block = dfa_iterator_block->previous;
+    assert(dfa_iterator_block);
+    dfa_iterator_node_num = DFA_NODE_BLOCK_SIZE - 1;
+  }
+
+  return &(dfa_iterator_block->node[dfa_iterator_node_num]);
+}
+
+
+/* Initialize a dfa_graph structure. */
+void
+dfa_graph_reset(dfa_graph *graph)
+{
+  graph->num_nodes = 0;
+  graph->root = NULL;
+
+  graph->last_block = NULL;
+  graph->allocated = DFA_NODE_BLOCK_SIZE;
+  dfa_attrib_array_reset(&(graph->attributes));
+}
+
+
+/* Free all resources associated with the specified DFA graph. */
+static void
+dfa_graph_clear(dfa_graph *graph)
+{
+  dfa_node_block *block = graph->last_block;
+  graph->num_nodes = 0;
+  graph->root = NULL;
+
+  while (block) {
+    dfa_node_block *previous = block->previous;
+    free(block);
+    block = previous;
+  }
+
+  graph->last_block = NULL;
+  graph->allocated = DFA_NODE_BLOCK_SIZE;
+
+  dfa_attrib_array_clear(&(graph->attributes));
+}
+
+
+/* dfa_graph_build_level() builds a level of a graph. Level `n' is a set of
+ * nodes which correspond to n's element of a string. When matching using a
+ * dfa, nodes of level `n' are only checked at (n + 1)'s iteration (root node
+ * is considered to be level -1, but is matched at iteration 0).
+ */
+static void
+dfa_graph_build_level(dfa_graph *graph, char **strings, int level,
+                     dfa_node *terminal_node,
+                     dfa_attrib_array *passing_strings_array)
+{
+  int save_num_nodes = graph->num_nodes;
+  dfa_attrib_block *cutoff_point;
+  dfa_node *node;
+  dfa_node *this_terminal_node = dfa_iterator_reset(graph);
+
+  cutoff_point = passing_strings_array->last_block;
+  dfa_hash_clear();
+
+  /* Walk through all nodes of the previous level (backwards, but that doesn't
+   * matter - it's just because iterator works that way).
+   */
+  for (node = this_terminal_node; node != terminal_node; node = dfa_iterate()) {
+    int k;
+    int num_masks = 0;
+    char mask[4];
+    dfa_attrib *passing_string;
+    dfa_attrib **link = &(node->attributes);
+    dfa_attrib *new_passing_strings[4];
+    dfa_attrib **new_link[4];
+
+    /* Calculate all different masks for subnodes. For instance, if there are
+     * three strings passing through a node of level 1, say "X$...", "Xx..."
+     * and "XO...", there will be three masks: 8 (stands for '#'), 5 ('X' and
+     * '.') and 2 ('O'). String "X$..." will pass further through all three
+     * subnodes, "Xx..." - through subnode corresponding to mask 5 and string
+     * "XO..." - through subnode corresponding to mask 2.
+     */
+    for (passing_string = node->passing_strings;
+        passing_string && num_masks < 4;
+        passing_string = passing_string->next) {
+      int index = passing_string->string_index;
+      char string_mask = strings[index][level];
+
+      if (string_mask) {
+       int limit = num_masks;
+
+       for (k = 0; k < limit; k++) {
+         char common_branches = string_mask & mask[k];
+
+         if (common_branches && common_branches != mask[k]) {
+           /* Split a mask, since the string passes through a "part" of it. */
+           mask[k] ^= common_branches;
+           mask[num_masks++] = common_branches;
+         }
+         
+         string_mask ^= common_branches;
+       }
+
+       if (string_mask) {
+         /* If there is no mask corresponding to a (part) of the string's
+          * mask, add it now.
+          */
+         mask[num_masks++] = string_mask;
+       }
+      }
+      else {
+       /* If the string ends at this level, add its index to the list of
+        * matched strings of the current node. Not used at the moment,
+        * since this builder isn't used for actual DFA building.
+        */
+       *link = dfa_attrib_new(&(graph->attributes), index);
+       link = &((*link)->next);
+      }
+    }
+    
+    for (k = 0; k < num_masks; k++)
+      new_link[k] = &(new_passing_strings[k]);
+
+    /* Now, for each mask, create a list of all strings which will follow it
+     * (pass through a node corresponding to it). It is possible to merge this
+     * loop with the previous one, but it is simplier to keep them separated.
+     */
+    for (passing_string = node->passing_strings; passing_string;
+        passing_string = passing_string->next) {
+      int index = passing_string->string_index;
+
+      for (k = 0; k < num_masks; k++) {
+       if (strings[index][level] & mask[k]) {
+         *(new_link[k]) = dfa_attrib_new(passing_strings_array, index);
+         new_link[k] = &((*(new_link[k]))->next);
+       }
+      }
+    }
+
+    /* Finally, create new nodes for the masks when necessary. */
+    for (k = 0; k < num_masks; k++) {
+      int i;
+
+      /* Maybe we have already added such a node? */
+      dfa_node *new_node = dfa_hash_search(new_passing_strings[k]);
+
+      if (!new_node) {
+       /* If not, create it, save the list of passing strings and add the
+        * new node to hash table.
+        */
+       new_node = dfa_node_new(graph);
+       new_node->passing_strings = new_passing_strings[k];
+
+       dfa_hash_add_node(new_node);
+      }
+
+      /* At this moment we convert the masks to actual transitions. These are
+       * also unused till we use this builder for actual DFA creation.
+       */
+      for (i = 0; i < 4; i++) {
+       if (mask[k] & (1 << i))
+         node->branch[i] = new_node;
+      }
+    }
+  }
+
+  /* Free the lists of passing strings for the previous level. Useful if we
+   * building an exceptionally huge DFA.
+   */
+  dfa_attrib_array_partially_clear(cutoff_point);
+
+  if (graph->num_nodes != save_num_nodes) {
+    /* If we have added any nodes, this level is not the last one. */
+    dfa_graph_build_level(graph, strings, level + 1, this_terminal_node,
+                         passing_strings_array);
+  }
+}
+
+
+/* Convert a pattern to a string of masks. */
+static char *
+dfa_prepare_string(const char *string)
+{
+  int k;
+  int l = strlen(string);
+  char *dfa_string = malloc(l + 1);
+  assert(dfa_string);
+
+  for (k = 0; k < l; k++) {
+    switch (string[k]) {
+    case '$': dfa_string[k] = 15; break;       /* 1111 */
+    case '-':
+    case '|':
+    case '+':
+    case '#': dfa_string[k] =  8; break;       /* 1000 */
+    case '.':
+    case ',':
+    case '!':
+    case 'a': dfa_string[k] =  1; break;       /* 0001 */
+    case '?': dfa_string[k] =  7; break;       /* 0111 */
+    case 'O': dfa_string[k] =  2; break;       /* 0010 */
+    case 'X': dfa_string[k] =  4; break;       /* 0100 */
+    case 'o': dfa_string[k] =  3; break;       /* 0011 */
+    case 'x': dfa_string[k] =  5; break;       /* 0101 */
+
+    default: assert(0);                        /* Shouldn't happen. */
+    }
+  }
+
+  dfa_string[l] = 0;
+  return dfa_string;
+}
+
+
+/* Initialize a dfa_patterns structure. */
+void
+dfa_patterns_reset(dfa_patterns *patterns)
+{
+  patterns->num_patterns = 0;
+  patterns->patterns = NULL;
+  patterns->last_pattern = NULL;
+
+  dfa_graph_reset(&(patterns->graph));
+}
+
+
+/* Clear the graph and reset all fields of a dfa_patterns structure. */
+void
+dfa_patterns_clear(dfa_patterns *patterns)
+{
+  dfa_pattern *pattern = patterns->patterns;
+
+  while (pattern) {
+    int k;
+    dfa_pattern *next = pattern->next;
+
+    for (k = 0; k < pattern->num_variations; k++)
+      free(pattern->variation[k]);
+
+    free(pattern);
+    pattern = next;
+  }
+
+  patterns->num_patterns = 0;
+  patterns->patterns = NULL;
+  patterns->last_pattern = NULL;
+
+  dfa_graph_clear(&(patterns->graph));
+}
+
+
+/* Add a pattern to a list. If `index' is equal to the index of the last
+ * added pattern, add a variation to that pattern instead.
+ */
+void
+dfa_patterns_add_pattern(dfa_patterns *patterns, const char *string, int index)
+{
+  dfa_pattern *pattern = NULL;
+
+  if (index == patterns->num_patterns - 1) {
+    assert(patterns->last_pattern);
+    assert(patterns->last_pattern->num_variations < 8);
+
+    pattern = patterns->last_pattern;
+  }
+  else {
+    assert(patterns->num_patterns <= index);
+
+    while (patterns->num_patterns <= index) {
+      patterns->num_patterns++;
+      pattern = malloc(sizeof(*pattern));
+      pattern->num_variations = 0;
+
+      if (patterns->last_pattern)
+        patterns->last_pattern->next = pattern;
+      else
+        patterns->patterns = pattern;
+      patterns->last_pattern = pattern;
+    }
+
+    pattern->current_variation = 0;
+    pattern->next = NULL;
+  }
+
+  pattern->variation[pattern->num_variations++] = dfa_prepare_string(string);
+}
+
+
+/* Set the variation of the last pattern. Can be used in actual DFA building
+ * or to set a hint (results of the previous optimization) for optimization.
+ */
+void
+dfa_patterns_set_last_pattern_variation(dfa_patterns *patterns, int variation)
+{
+  assert(patterns->last_pattern);
+  assert(patterns->last_pattern->num_variations > variation);
+
+  patterns->last_pattern->current_variation = variation;
+}
+
+
+/* Make the shortest variation of the last pattern its current variation. It
+ * is used as a starting point in DFA optimization process.
+ */
+void
+dfa_patterns_select_shortest_variation(dfa_patterns *patterns)
+{
+  int k;
+  int min_length;
+  dfa_pattern *pattern = patterns->last_pattern;
+  assert(pattern);
+
+  pattern->current_variation = 0;
+  min_length = strlen(pattern->variation[0]);
+  for (k = 1; k < pattern->num_variations; k++) {
+    int length = strlen(pattern->variation[k]);
+
+    if (length < min_length) {
+      pattern->current_variation = k;
+      min_length = length;
+    }
+  }
+}
+
+
+/* Build a DFA graph for a list of patterns. */
+void
+dfa_patterns_build_graph(dfa_patterns *patterns)
+{
+  int k = 0;
+  char **strings;
+  dfa_attrib_array passing_strings_array;
+  dfa_attrib **link;
+  dfa_node *error_state;
+  dfa_graph *graph = &(patterns->graph);
+  dfa_pattern *pattern;
+  
+  strings = malloc(patterns->num_patterns * sizeof(*strings));
+  assert(strings);
+
+  dfa_graph_clear(graph);
+  dfa_attrib_array_reset(&passing_strings_array);
+
+  /* Error state node is used as a terminator for level -1 (root node). */
+  error_state = dfa_node_new(graph);
+  graph->root = dfa_node_new(graph);
+  
+  /* Add all strings as passing through root node (level -1). */
+  link = &(graph->root->passing_strings);
+  for (pattern = patterns->patterns; pattern; pattern = pattern->next, k++) {
+    if (pattern->num_variations > 0) {
+      assert(pattern->current_variation < pattern->num_variations);
+      strings[k] = pattern->variation[pattern->current_variation];
+
+      *link = dfa_attrib_new(&passing_strings_array, k);
+      link = &((*link)->next);
+    }
+    else
+      strings[k] = NULL;
+  }
+
+  dfa_graph_build_level(graph, strings, 0, error_state, &passing_strings_array);
+
+  free(strings);
+  dfa_attrib_array_clear(&passing_strings_array);
+}
+
+
+/* dfa_patterns_optimize_variations() tries to reduce the size of DFA by
+ * altering pattern variations (in fact, transformations). The algorithm
+ * is to change several patterns' variations and if this happens to give
+ * size reduction, to keep the change, otherwise, revert.
+ *
+ * This function contains many heuristically chosen values for variation
+ * changing probability etc. They have been chosen by observing algorithm
+ * effectiveness and seem to be very good.
+ *
+ * Note that we subtract 1 from the number of nodes to be consistent with
+ * the standard builder, which doesn't count error state.
+ */
+int *
+dfa_patterns_optimize_variations(dfa_patterns *patterns, int iterations)
+{
+  int k = 0;
+  int failed_iterations = 0;
+  int min_nodes_so_far;
+  int num_nodes_original;
+  int *best_variations;
+  double lower_limit = 2.0 / patterns->num_patterns;
+  double upper_limit = 6.0 / patterns->num_patterns;
+  double change_probability = 4.0 / patterns->num_patterns;
+  dfa_pattern *pattern;
+
+  best_variations = malloc(patterns->num_patterns * sizeof(*best_variations));
+  assert(best_variations);
+  for (pattern = patterns->patterns; pattern; pattern = pattern->next, k++)
+    best_variations[k] = pattern->current_variation;
+
+  dfa_patterns_build_graph(patterns);
+  num_nodes_original = patterns->graph.num_nodes;
+  min_nodes_so_far = num_nodes_original;
+
+  fprintf(stderr, "Original number of DFA states: %d\n", min_nodes_so_far - 1);
+  fprintf(stderr, "Trying to optimize in %d iterations\n", iterations);
+
+  gg_srand(num_nodes_original + patterns->num_patterns);
+
+  while (iterations--) {
+    int changed_variations = 0;
+    int k = 0;
+    
+    /* Randomly change some variations. */
+    for (pattern = patterns->patterns; pattern; pattern = pattern->next, k++) {
+      if (gg_drand() < change_probability && pattern->num_variations > 1) {
+       int new_variation = gg_rand() % (pattern->num_variations - 1);
+       if (new_variation >= pattern->current_variation)
+         new_variation++;
+       pattern->current_variation = new_variation;
+       changed_variations++;
+      }
+      else
+       pattern->current_variation = best_variations[k];
+    }
+
+    if (changed_variations == 0) {
+      iterations++;
+      continue;
+    }
+
+    fprintf(stderr, ".");
+    dfa_patterns_build_graph(patterns);
+
+    if (patterns->graph.num_nodes < min_nodes_so_far) {
+      /* If the new set of variations produces smaller dfa, save it. */
+      int k = 0;
+      for (pattern = patterns->patterns; pattern; pattern = pattern->next, k++)
+       best_variations[k] = pattern->current_variation;
+
+      fprintf(stderr, "\nOptimized: %d => %d states (%d iterations left)\n",
+             min_nodes_so_far - 1, patterns->graph.num_nodes - 1, iterations);
+      min_nodes_so_far = patterns->graph.num_nodes;
+      failed_iterations = 0;
+    }
+    else
+      failed_iterations++;
+
+    if (failed_iterations >= 30) {
+      /* If haven't succeded in 30 last iterations, try to alter variation
+       * change probability.
+       */
+      double delta = gg_drand() / patterns->num_patterns;
+      if (change_probability > upper_limit
+         || (change_probability >= lower_limit && gg_rand() % 2 == 0))
+       delta = -delta;
+
+      change_probability += delta;
+      failed_iterations = 0;
+    }
+  }
+
+  fprintf(stderr, "\nTotal optimization result: %d => %d states\n",
+         num_nodes_original - 1, min_nodes_so_far - 1);
+
+  dfa_graph_clear(&(patterns->graph));
+  return best_variations;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/dfa.dsp b/patterns/dfa.dsp
new file mode 100644 (file)
index 0000000..af627f7
--- /dev/null
@@ -0,0 +1,104 @@
+# Microsoft Developer Studio Project File - Name="dfa" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=dfa - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "dfa.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "dfa.mak" CFG="dfa - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "dfa - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "dfa - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "dfa - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "dfa___Win32_Release"\r
+# PROP BASE Intermediate_Dir "dfa___Win32_Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I ".." /I "../sgf" /I "../engine" /I "../utils" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /Fd"Release/dfa" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "dfa - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "dfa___Win32_Debug"\r
+# PROP BASE Intermediate_Dir "dfa___Win32_Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /Zi /Od /I ".." /I "../sgf" /I "../engine" /I "../utils" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FR /Fd"Debug/dfa" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "dfa - Win32 Release"\r
+# Name "dfa - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\dfa.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\transform.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\dfa.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/dfa.h b/patterns/dfa.h
new file mode 100644 (file)
index 0000000..a75b256
--- /dev/null
@@ -0,0 +1,95 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009  by the Free Software Foundation.                   *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _DFA_H_
+#define _DFA_H_
+
+#if MAX_BOARD > 11
+#define DFA_MAX_BOARD          MAX_BOARD
+#else
+#define DFA_MAX_BOARD          11
+#endif
+#define DFA_MAX_ORDER          ((2 * DFA_MAX_BOARD - 1)        \
+                                * (2 * DFA_MAX_BOARD - 1))
+#define DFA_BASE               (3 * DFA_MAX_BOARD)
+#define DFA_POS(i, j)          (((i) + DFA_MAX_BOARD) * DFA_BASE       \
+                                + ((j) + DFA_MAX_BOARD))
+
+#ifndef EMPTY
+#define EMPTY     0            /* . */
+#define WHITE     1            /* O */
+#define BLACK     2            /* X */
+#endif
+#define OUT_BOARD 3            /* # */
+
+
+/* Maximum pattern matched at one positions. */
+#define DFA_MAX_MATCHED                (8 * 24)
+
+
+/* DFA spiral order. */
+extern int spiral[DFA_MAX_ORDER][8];
+
+void build_spiral_order(void);
+
+
+/* The run-time data structures declared here are different from those
+ * used internally to build the DFA. */
+
+/* Attribute list. */
+typedef struct attrib_rt
+{
+  short val;
+  short next;
+} attrib_rt_t;
+
+/* DFA state. */
+typedef struct state_rt
+{
+  short next[4];
+  short att;
+} state_rt_t;
+
+typedef struct dfa_rt
+{
+  /* File header. */
+  const char name[80];
+
+  /* Transition graph. */
+  const state_rt_t *states;
+
+  /* Attributes sets. */
+  const attrib_rt_t *indexes;
+} dfa_rt_t;
+
+
+
+#endif /* _DFA_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/endgame.db b/patterns/endgame.db
new file mode 100644 (file)
index 0000000..fc67454
--- /dev/null
@@ -0,0 +1,1770 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The Endgame Pattern Database.
+#
+#  Further documentation may be found in the Texinfo documentation.
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  After the pattern, some supplementary information in the format:
+#
+# :trfno, classification, [values], helper_function
+#   
+#  These and other aspects of the pattern database are documented
+#  in the Texinfo documentation. 
+#
+#################
+#
+#  Any line beginning with #, or any part of a line following
+#  whitespace is a comment. 
+#
+#  The patterns are classified into a number of different categories:
+#  
+#  EE    edge endgame
+#  EF    edge followups
+#  CE    center endgame
+#  CF    center followups
+#  EY    eye stealing/saving endgame
+#
+#  The patterns are grouped in the file by category. New patterns
+#  should be added close to a similar pattern or at the end of the
+#  category where it belongs. When a new pattern is added, the names
+#  of later patterns in the category should usually not be changed.
+#  This can be accomplished by introducing names like CC35b and so on.
+#
+
+
+######################################################################
+#
+# Edge endgame patterns
+#
+# These patterns need to be revised.
+#
+# Moves along the edge with small weights, intended to come into play
+# in the endgame.
+#
+# These patterns are further subdivided into the following classes
+#
+# first line descents (except in corner)
+# first line hanes (except in corner)
+# first line pushes (except in corner)
+# first line blocks (except in corner)
+# first line corner moves
+# miscellaneous first line moves
+# second line descents
+# second line hanes
+# second line extensions
+# second line clamps
+# miscellaneous second line moves
+# third line moves
+#
+######################################################################
+
+
+attribute_map general
+
+goal_elements none
+# Several patterns here have a or d class, so we need these elements.
+callback_data XOxo
+
+
+# first line descents (except in corner)
+########################################
+
+Pattern EE1
+# gf Removed terri(1) value because move might be inside own territory. (3.3.7)
+
+?OOx      block on edge
+..*x      1 point gote
+----
+
+:8,OXe
+
+?ccx
+ba*x
+----
+
+;marginal_eye(*) && proper_eye(a) && proper_eye(b) && !xplay_attack(*,c)
+
+
+Pattern EE1a
+
+?OOx      block on edge
+..*x      2 point gote
+----
+
+:8,OXe,terri(2)
+
+?ccx
+ba*x
+----
+
+; marginal_eye(*) && proper_eye(a) && proper_eye(b)
+; && xplay_attack(*,a,c) && !xplay_attack(*,c)
+
+
+Pattern EE2
+
+OXXx
+xOOX      Start by backfilling
+*..x      At least 1 point gote
+----
+
+:8,OX,terri(1)
+
+OXXx
+xbbX
+*.ax
+----
+
+;xplay_attack(a,b)
+
+
+Pattern EE2b
+
+OXXx
+*OOX      Start by backfilling
+...x      At least 1 point gote
+----
+
+:8,OX,terri(1)
+
+OXXx
+*ddX
+cbax
+----
+
+;marginal_eye(a) && proper_eye(b) && proper_eye(c) && xplay_attack(a,d)
+
+
+Pattern EE2c
+
+OXX?     Start by backfilling if block is unsafe
+*OO?     At least 1 point gote
+...?
+----
+
+:8,OX,terri(1)
+
+OXX?
+*OOb
+..ac
+----
+
+;x_alive_somewhere(b,c) && oplay_attack(a,a) && !oplay_attack(*,?,a,a)
+
+
+Pattern EE4
+
+XOO.
+.X*.            one point sente
+----
+
+:8,OXe,terri(1),followup(1)
+
+XOO.
+.X*.
+----
+
+;marginal_eye(*)
+
+
+Pattern EE5
+
+???
+XO?       descend to edge
+.*?       may quite possibly be 0 points gote
+---
+
+:8,OXe,terri(0.1)
+
+eab
+XOc
+.*d
+---
+
+;o_somewhere(a,b,c,d,e)
+
+
+Pattern EE6
+
+.OOOXX
+...*..
+------
+
+:8,OXe,terri(2)
+
+.OOOXX
+..a*bc
+------
+
+; proper_eye(a) && !oplay_attack(*,*) && oplay_attack(b,*,a,c,*,a)
+; && xplay_attack(*,a,b,a)
+
+
+Pattern EE7
+# tm New Pattern (3.1.19)
+#   s classification, in case of ko (see trevorc:180)
+# pp Revised (3.3.18) the pattern to match on edge only.
+
+?.X?
+O.*.
+----
+
+:8,sOXe,terri(0.75)
+
+?.X?
+O.*a
+----
+
+;proper_eye(a) && safe_omove(*)
+
+
+# first line hanes (except in corner)
+#####################################
+
+Pattern EE101
+
+OOXX     endgame move
+..*.     2 points gote
+----
+
+:8,OXe,terri(2)
+
+OOXX
+b.*a
+----
+
+;proper_eye(a) && proper_eye(b)
+
+
+Pattern EE102
+
+???X?        sente hane
+OXX..        1 or 2 points sente
+.*..?
+-----
+
+:8,OXe,terri(2),followup(7)
+
+???X?
+OAA..
+.*..?
+-----
+
+;lib(A)==3
+
+
+Pattern EE103
+
+?OX?        one point gote (and a little extra)
+?.*.
+----
+
+:8,OXe
+
+?OX?
+?.*a
+----
+
+;proper_eye(a)
+
+
+Pattern EE104
+
+?OX?        two points gote
+..*.
+----
+
+:8,OXe
+
+?OX?
+b.*a
+----
+
+;proper_eye(a) && proper_eye(b)
+
+
+#
+# If both EE105 and EE106 match, it's a double sente situation.
+# (followup and reverse followup probably bigger in reality.)
+#
+
+Pattern EE105
+
+?OX..      three points sente
+..*..
+-----
+
+:8,OXe
+
+?OE..
+bc*a.
+-----
+
+;proper_eye(a) && proper_eye(b) && oplay_attack_either(*,a,c,a,E)
+
+
+Pattern EE106
+
+..OX?      three points reverse sente
+...*.
+-----
+
+:8,OXe,reverse_followup(6)
+
+..dX?
+.bc*a
+-----
+
+;proper_eye(a) && proper_eye(b) && xplay_attack_either(c,b,*,b,d)
+;&& !xplay_attack(c,b,*,*)
+
+
+Pattern EE107
+#tm New Pattern (3.1.16)
+#   see trevor:163
+# FIXME: move this pattern to appropriate place
+
++--    very special corner position
+|.*
+|.O
+|OX
+
+:8,Oa
+
++--
+|.*
+|.O
+|OB
+
+; defend(B) && !oplay_defend(*,B) && safe_xmove(*)
+
+
+Pattern EE108
+# pp New pattern (see endgame:890) (3.5.1)
+
+?OX?       very small endgame move
+O.*.
+----
+
+:8,OXes,value(0.5)
+
+?OX?
+Oa*b
+----
+
+; proper_eye(b) && oplay_attack(*,b,a,a) && oplay_defend(a,*,a)
+
+
+Pattern EE109
+# gf New pattern. (3.5.3)
+# Generic hane, let the territorial evaluation determine its value.
+
+OX        hane on first line
+.*
+--
+
+:8,OXe
+
+
+Pattern EE110
+# gf New pattern. (3.5.3)
+# Followup value obviously imprecise, usually an underestimation.
+
+OX.O        followup to save dead stones
+.*..
+----
+
+:8,Xe,followup(5)
+
+aX.b
+d*c.
+----
+
+;alive(a) && dead(b) && oplay_defend(*,c,d,b)
+
+
+# first line pushes (except in corner)
+######################################
+
+Pattern EE201
+
+?XX                     push on first line.
+O*.                     one point gote (and a little extra)
+---
+
+:8,OXe,terri(1)     
+
+?XX
+O*a
+---
+
+;marginal_eye(*) && proper_eye(a) && max_eye_value(a) > 0
+
+
+Pattern EE201b
+# nando New pattern. (3.7.11)
+
+?XX                     push deeper on first line.
+O.*
+---
+
+:8,sOXe
+
+?XX
+Oa*
+---
+
+;marginal_eye(a) && proper_eye(*) && max_eye_value(*) > 0
+;&& (safe_omove(*) || oplay_attack(*,a,a))
+
+>if (!safe_omove(*)) known_safe_move(*)
+
+
+Pattern EE202
+
+OXX.           endgame move
+.O*.           1 point reverse sente
+----
+
+:8,OXe,terri(1),reverse_followup(1)
+
+OXX.
+.O*a
+----
+
+;marginal_eye(*) && marginal_eye(a)
+
+
+Pattern EE203
+
+OXX.           1 point double sente
+.O*.
+----
+
+:8,OXe,terri(1),reverse_followup(2)
+
+ODDc
+bO*a
+----
+
+;marginal_eye(*) && marginal_eye(a) && marginal_eye(c)
+;&& (oplay_attack(*,a,b,a) || oplay_attack(*,a,b,D))
+
+
+Pattern EE204
+
+?X.        endgame move
+O*.        2 points gote
+---
+
+:8,OXe,terri(2)
+
+?Cb
+O*a
+---
+
+;marginal_eye(*) && proper_eye(a)
+;&& (!oplay_defend(*,a,b,a) || !oplay_defend(*,a,b,C))
+
+
+Pattern EE205
+
+X.X    at least 2 points, possibly more (followup)
+O*.
+---
+
+:8,OXe,terri(2)
+
+XaX
+O*b
+---
+
+;marginal_eye(*) && proper_eye(a) && proper_eye(b)
+
+
+Pattern EE206
+# gf New pattern. (3.1.20)
+
+X.
+O*
+--
+
+:8,OXe
+
+
+# first line blocks (except in corner)
+######################################
+
+Pattern EE301
+
+O.        endgame move
+X*        1 points gote
+--
+
+:8,OXe,terri(1)
+
+Oa
+X*
+--
+
+;marginal_eye(*) && proper_eye(a) && oplay_attack(*,a,a)
+
+
+Pattern EE302
+# gf Revised constraint. (3.3.10)
+
+O.        endgame move
+X*        2 points reverse sente
+--
+
+:8,OXe,terri(2),reverse_followup(5)
+
+ba
+X*
+--
+
+;eye(*) && proper_eye(a) && oplay_defend_both(*,a,*,b)
+
+
+Pattern EE303
+# al1 Revised symmetry. (3.7.11)
+
+OXO
+.*.
+---
+
+:|,OXe,terri(2)
+
+
+# first line corner moves
+#########################
+
+Pattern EE401
+# gf Added n classification. (3.5.2)
+
+|.O?        big endgame move
+|.OX        at least 2 points gote
+|.*x
++---
+
+:8,nOXed,terri(2)
+
+
+Pattern EE402
+# May look risky, but if it is, the safe_move test will reject it.
+
+|xxXO       big endgame move
+|.XO.       at least 3 points reverse sente
+|.*..
++----
+
+:8,OXed,terri(3),reverse_followup(5)
+
+
+Pattern EE403
+
+|OX       endgame move
+|.*       one point gote
++--
+
+:8,OXe,terri(1)
+
+|OX
+|.*
++--
+
+;marginal_eye(*)
+
+
+Pattern EE404
+# gf Revised constraint. (3.3.10)
+
+|OX?       endgame move
+|.*.       half point gote as sacrifice
++---
+
+:8,sOXe,terri(0.5)
+
+|OX?
+|.*a
++---
+
+;marginal_eye(*) && proper_eye(a)
+
+
+Pattern EE404b
+# gf New pattern. See nngs:1480. (3.3.7)
+
+|.OX
+|OX.       endgame move
+|.*.       at least 1.5 points gote as sacrifice
++---
+
+:8,sOXe,value(1.5)
+
+|.OX
+|OX.
+|.*.
++---
+
+;marginal_eye(*)
+
+
+Pattern EE405
+# gf Made main diagram consistent with constraint diagram. (3.1.18)
+# gf Revised constraint. (3.3.10)
+
+|XO?      endgame move
+|.*.      one point gote
++---
+
+:8,OXe,terri(1)
+
+|XO?
+|.*a
++---
+
+;marginal_eye(*) && proper_eye(a)
+
+
+Pattern EE406
+
+|XO     endgame move
+|.*     possibly only filling dame
++--
+
+:8,OXe,terri(0.1)
+
+
+Pattern EE407
+# gf Increased value. (3.3.14)
+# Give it a little more than 0.5 points in order to fill before capturing.
+
+|OX?     fill ko at end of game
+|*OX     1/2 point gote
++---
+
+:8,X,terri(0.6)
+
+|aX?
+|*OX
++---
+
+;!dead(a)
+
+
+Pattern EE408
+# gf Increased value. (3.3.14)
+# Give it a little more than 0.5 points in order to fill before capturing.
+
+|XO?     fill ko at end of game
+|O*O     1/2 point gote
++---
+
+:8,X,terri(0.6)
+
+|Xa?
+|O*O
++---
+
+;!dead(a)
+
+
+Pattern EE409
+
+|OX?     take ko at end of game
+|X*X     1/2 point
++---
+
+:8,sO,terri(0.5)
+
+|OA?
+|X*X
++---
+
+;!dead(A)
+
+
+Pattern EE410
+
+|XO?     take ko at end of game
+|*XO     1/2 point
++---
+
+:8,sO,terri(0.5)
+
+|AO?
+|*XO
++---
+
+;!dead(A)
+
+
+Pattern EE411
+
+|*O     endgame ko
+|XO     zero points sente or better
+|.X
++--
+
+:8,OX,terri(0.1),followup(0.5)
+
+
+Pattern EE412
+
+|.X     endgame ko
+|OX     zero points reverse sente or better
+|*O
++--
+
+:8,OX,terri(0.1),reverse_followup(0.5)
+
+
+Pattern EE413
+
+|.X?    endgame ko
+|OXO    1/2 point
+|.O*
++---
+
+:8,OX,terri(0.5)
+
+
+Pattern EE414
+
+|xX?        three points gote 
+|*OX        plus possibly more for the eye in the corner
+|.OX
+|..O
++---
+
+:8,OXed,terri(3)
+
+
+Pattern EE415
+# pp New pattern (3.3.18)
+# Currently necessary (see trevorb:170, where N11 is otherwise rejected
+# as "strategically or tactically unsafe) /ab
+
+|*O?
+|OXX
+|.OX
++---
+
+:8,X,terri(0.1),reverse_followup(2)
+
+|*A?
+|OXX
+|.OX
++---
+
+;alive(A)
+
+
+Pattern EE416
+# pp New pattern (3.3.18)
+
+|.OO?
+|..*X
++----
+
+:8,OXe
+
+|.aa?
+|..*X
++----
+
+;xplay_attack(*,a) && !oplay_attack(*,a)
+
+>prevent_attack_threat(a)
+
+
+# miscellaneous first line moves
+################################
+
+Pattern EE501
+# gf Increased value. (3.3.14)
+# Give it a little more than 0.5 points in order to fill before capturing.
+
+?OX?     fill ko at end of game
+O*OX     1/2 point gote
+----
+
+:8,X,terri(0.6)
+
+?aX?
+O*OX
+----
+
+;!dead(a)
+
+
+Pattern EE502
+
+?OX?     take ko at end of game
+OX*X     1/2 point
+----
+
+:8,sO,terri(0.5)
+
+?OA?
+OX*X
+----
+
+;!dead(A)
+
+
+Pattern EE504
+
+...           jump on the edge
+*.O
+---
+
+:8,Oe
+
+...
+*.O
+---
+
+;!omoyo(*)
+
+
+# second line descents
+######################
+
+Pattern EE601
+# gf Revised constraint to avoid cyclic redistribution. (3.5.1)
+
+??O?         It's better to push down before blocking
+.X*X
+....
+----
+
+:8,OX,terri(3),followup(5)
+
+??O?
+aA*X
+....
+----
+
+; oplay_attack(*,a,A) && !oplay_attack(a,*,A)
+
+> replace(a,*)
+
+
+# second line hanes
+###################
+
+# second line extensions
+########################
+
+Pattern EE801
+# 1: not really gote and larger than 2.5 points
+# 2: Well, without making the pattern more specific we should be
+#    prepared that the x really is in place and that there is an X two
+#    steps below * too. Then it is usually gote and about this size.
+#    We certainly can and should add patterns to deal with the case
+#    that there is more space below, when it very likely is sente,
+#    unless such patterns already exist in the EB class.
+# gf Actually this pattern doesn't even guarantee a single point, see
+#    gifu03:204. Removed fixed territorial value. (3.5.3)
+
+|.O?      endgame move
+|.*X      2.5 points gote
+|..x
+
+:8,OXe
+
+
+Pattern EE802
+
+|.X             extend on second line
+|.*             2 points gote
+|.O
+
+:8,OXe,terri(2)
+
+|bX
+|.*
+|aO
+
+;proper_eye(a) && proper_eye(b)
+
+
+Pattern EE803
+
+?xx?
+X.*O           extend on second line
+....           about 2 points gote
+----
+
+:8,OXe,terri(2)
+
+?xx?
+X.*O
+b..a
+----
+
+;proper_eye(a) && proper_eye(b)
+
+
+Pattern EE804
+# gf Revised value. (3.3.15)
+
+O*X            endgame move
+..X            not guaranteed to be more than 0 points gote
+---
+
+:8,OXe,terri(0.1)
+
+O*X
+a.X
+---
+
+;marginal_eye(a)
+
+
+Pattern EE805
+
+XX.           extend on second line
+OO*           not guaranteed to yield a single point
+...
+---
+
+:8,OXe,terri(0.1)
+
+
+Pattern EE806
+# evand new (3.7.1)
+# see kgs:70
+
+|.O??
+|.OX.
+|.*X.
+|....
++----
+
+:8,OXe,terri(3)
+
+|bO??
+|.OX.
+|.*Xa
+|....
++----
+
+;xmoyo(a) && omoyo(b)
+
+
+# second line extensions
+########################
+
+Pattern EE851
+
+Ox.           clamp on second line
+OX*           almost too big to be classified as endgame move
+...
+---
+
+:8,OXe,terri(8)
+
+Ox.
+OX*
+.a.
+---
+
+;oplay_attack(*,a,a)
+
+
+# miscellaneous second line moves
+#################################
+
+
+Pattern EE901
+# al1 Revised symmetry. (3.7.11)
+
+?.?       endgame move
+X*X       one point reverse sente
+O.O
+---
+
+:|,OXe,terri(1),reverse_followup(2)
+
+?a?
+X*X
+O.O
+---
+
+;marginal_eye(*) && proper_eye(a)
+
+
+Pattern EE902
+# al1 Revised symmetry. (3.7.11)
+# Why does this have followup value? -ab
+
+?.?       endgame move
+O*O       one point sente
+X.X
+---
+
+:|,OXe,terri(1),followup(2)
+
+?a?
+O*O
+X.X
+---
+
+;marginal_eye(*) && proper_eye(a)
+
+
+Pattern EE903
+# gf New pattern. (3.1.23)
+
+??XO?
+?OO*.
+X....
+-----
+
+:8,OXe
+
+??XO?
+?OO*.
+Xa...
+-----
+
+;!safe_omove(a)
+
+
+# third line moves
+##################
+
+
+Pattern EE1002
+
+??X?           endgame move
+?X*O           at least one point reverse sente
+OO..
+....
+----
+
+:8,OXe,terri(1),reverse_followup(4)
+
+??X?
+?X*O
+aa..
+....
+----
+
+;lib(a)>3
+
+
+Pattern EE1003
+# gf New pattern. (3.1.12)
+
+O*X?           at least one point and usually sente
+?X.o
+?X.o
+----
+
+:8,OXe,terri(1)
+
+O*X?
+?Abo
+?A.o
+----
+
+;lib(A)==3 && proper_eye(b)
+
+
+# reverse followups
+######################################
+
+
+Pattern EF101
+# This is the least value for the followup. A more precise value can
+# only be had by dynamic reading.
+
+O..
+X*.
+---
+
+:8,OX,reverse_followup(4)
+
+Oa.
+X*.
+---
+
+;marginal_eye(*) && proper_eye(a) && oplay_attack(*,a,a)
+
+
+Pattern EF102
+# tm New Pattern (3.1.16)
+# tm modified (3.1.17)
+# tm modified (3.1.20)
+# gf Removed terri(1) value. (3.1.29)
+# FIXME: see endgame:218, trevord:1030, trevorc:430
+# FIXME: This is no edge pattern, move it.
+
+O.
+*O
+
+:8,O,reverse_followup(3)
+
+ac
+*b
+
+;proper_eye(c) && oterri(c) && !oplay_attack(*,*)
+;&& !xplay_attack(*,*) && xplay_attack_either(*,a,b)
+
+
+######################################################################
+#
+# Center endgame patterns
+#
+# Moves in the center with small weights, intended to come into play
+# in the endgame.
+#
+######################################################################
+
+Pattern CE1
+# gf Increased value. (3.3.14)
+# Give it a little more than 0.5 points in order to fill before capturing.
+
+?OX?     fill ko at end of game
+O*OX     1/2 point gote
+?OX?
+
+:-,X,terri(0.6)
+
+?OX?
+a*OX
+?OX?
+
+;!dead(a)
+
+
+Pattern CE2
+
+?OX?     take ko at end of game
+OX*X     1/2 point
+?OX?
+
+:-,sO,terri(0.5)
+
+?OX?
+OX*A
+?OX?
+
+;!dead(A)
+
+
+Pattern CE3
+# al1 Revised symmetry. (3.7.11)
+
+...           push against opponent
+O*X           about 1 point gote
+...
+
+:-,OXe,terri(1)
+
+
+Pattern CE4a
+# gf Split and revised pattern. (3.3.10)
+# gf Revised constraint. (3.3.16)
+
+??X     endgame move
+O*.     about 1 point reverse sente
+?.O
+
+:8,OXe,terri(1),reverse_followup(1)
+
+??X
+O*.
+?aO
+
+;marginal_eye(*) && proper_eye(a) && (!halfeye(a) || false_eye_territory(a))
+
+
+Pattern CE4b
+# gf Split and revised pattern. (3.3.10)
+
+??X     endgame move
+O*.     about 1 point reverse sente
+x.O
+
+:8,OXe,terri(1),reverse_followup(2)
+
+??X
+O*.
+baO
+
+;marginal_eye(*) && proper_eye(a) && proper_eye(b)
+
+
+Pattern CE6
+
+X?        push in
+*O        0 points gote
+
+:8,OXe,terri(0.1)
+
+
+Pattern CE9
+# gf Revised constraint. (3.3.15)
+
+.X        push in
+*O        1 points gote
+
+:8,nOXe,terri(1)
+
+aX
+*O
+
+;marginal_eye(*) && max_eye_value(*)>0
+;&& !safe_omove(a) && !obvious_false_xeye(a)
+
+
+Pattern CE12
+
+X*O                               worth a point in chinese rules
+
+:-,OXe,terri(0.1)
+
+
+Pattern CE13
+# al1 Revised symmetry. (3.7.11)
+
+X.X      sometimes double sente endgame move
+.*.      one point gote
+O.O
+
+:|,OXe,terri(1)
+
+XbX
+.*.
+OaO
+
+;proper_eye(a) || proper_eye(b)
+
+
+Pattern CE14
+# al1 Revised symmetry. (3.7.11)
+
+X.X      sometimes double sente endgame move
+.*.      two points gote
+O.O
+
+:|,OXe,terri(2)
+
+XbX
+.*.
+OaO
+
+;proper_eye(a) && proper_eye(b)
+
+
+Pattern CE15
+
+.X?       sente endgame move
+.*.       one point sente
+X.O
+
+:8,OXe,terri(1)
+
+.X?
+a*.
+X.O
+
+;marginal_eye(*) && proper_eye(a)
+
+
+Pattern CE15b
+
+XX?       gote endgame move
+.*.       one point gote
+X.O
+
+:8,OXe,terri(1)
+
+XX?
+a*.
+X.O
+
+;marginal_eye(*) && proper_eye(a)
+
+
+Pattern CE16
+
+.X?       sente endgame move
+.*O       one point sente
+X??
+
+:8,OXe,terri(1)
+
+.X?
+a*O
+X??
+
+;marginal_eye(*) && proper_eye(a) && olib(*)>2
+
+
+Pattern CE16b
+# gf Revised constraint. (3.3.15)
+
+.O?       sente endgame move
+.*X       one point reverse sente
+O??
+
+:8,OXe,terri(1),reverse_followup(2)
+
+.O?
+a*X
+O??
+
+;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0 && xlib(*)>2
+
+
+Pattern CE17
+# gf Revised constraint. (3.3.20)
+
+XO          endgame move
+.*          one point sente
+xX
+
+:8,OXe,terri(1)
+
+XO
+a*
+xX
+
+;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0 && olib(*)>2
+
+
+Pattern CE18
+# tm removed reverse_followup value
+#   see trevorb:700
+# gf Revised constraint. (3.3.15)
+
+OX          endgame move
+.*          one point gote.
+oO
+
+:8,OXe,terri(1)
+
+OX
+a*
+oO
+
+;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0
+
+
+Pattern CE19
+# gf Revised constraint. (3.3.15)
+
+?.?       endgame move
+X*X       one point gote
+O.O
+
+:|,OXe,terri(1)
+
+?b?
+X*X
+OaO
+
+;marginal_eye(*) && proper_eye(b) && max_eye_value(b)>0 && oplay_attack(*,a,a)
+
+
+Pattern CE20a
+# gf Split and revised pattern. (3.3.10)
+# gf Revised constraint. (3.3.15)
+
+?.?         Smallish endgame
+O*O         one point, possibly reverse sente
+?X?
+
+:|,nOXe,terri(1),reverse_followup(1)
+
+?a?
+O*O
+?X?
+
+;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0
+
+
+Pattern CE20b
+# gf Split and revised pattern. (3.3.10)
+
+?.x         Smallish endgame
+O*O         one point reverse sente
+?X?
+
+:8,nOXe,terri(1),reverse_followup(2)
+
+?ab
+O*O
+?X?
+
+;marginal_eye(*) && proper_eye(a) && proper_eye(b)
+
+
+Pattern CE20c
+# gf Split and revised pattern. (3.3.10)
+
+x.x         Smallish endgame
+O*O         one point reverse sente
+?X?
+
+:|,nOXe,terri(1),reverse_followup(3)
+
+cab
+O*O
+?X?
+
+;marginal_eye(*) && proper_eye(a) && proper_eye(b) && proper_eye(c)
+
+
+Pattern CE21
+# gf Constraint revised. (3.1.8)
+
+*OX         Smallish endgame
+O.O         one point reverse sente
+
+:8,nOXe,terri(1),reverse_followup(2)
+
+*bX
+OaO
+
+;proper_eye(a) && lib(b)==2 && !oterri(*)
+
+
+Pattern CE22
+# gf Territory not guaranteed by pattern. Removed terri(1). (3.7.2)
+# al1 Revised symmetry. (3.7.11)
+
+?X?
+.*.      one point gote
+O.O
+ooo
+
+:|,OXe
+
+
+Pattern CE23
+
+O??
+*Xx      endgame move
+..X      two points gote
+xXO
+
+:8,OXe,terri(2)
+
+O??
+*Xx
+baX
+xXO
+
+;proper_eye(a) && proper_eye(b)
+
+
+Pattern CE24
+#tm revised terri from 5 to 4 (3.1.20) (see trevord:180 O6)
+
+??OX        rescue one stone making territory
+X*.O
+?O..
+
+:8,X,terri(4)
+
+??OX
+X*.A
+?Ob.
+
+; omoyo(b) && lib(A)==2
+
+
+# Pattern CE25
+# # tm New pattern (3.1.15)  (see trevora:320)
+# # gf Bad pattern, see olympiad2004:121.
+# # gf Also no longer needed in trevora:320, removed. (3.7.1)
+# 
+# O*X
+# XX.
+# 
+# :8,OX,terri(1)
+# 
+# O*X
+# Xa.
+# 
+# ;lib(a)==2
+
+
+Pattern CE26
+# gf New pattern. (3.1.18)  (see trevorb:870)
+
+O*O
+X.X
+
+:|,OXe
+
+
+Pattern CE27
+# tm New Pattern (3.1.18)
+# al1 Revised symmetry. (3.7.11)
+
+...   moyo breakin worth a lot.
+X*X
+?O?
+
+:|,-,terri(3)
+
+.b.
+A*C
+?O?
+
+; xmoyo(b) && oplay_break_through(*,b,A,b,C) == WIN
+
+
+Pattern CE28
+# tm New Pattern (3.1.20)
+# gf Revised constraint. (3.3.10)
+
+OX
+.*
+O.
+
+:8,nOXe,terri(1)
+
+OX
+A*
+OB
+
+;proper_eye(A) && oplay_attack(*,B,B)
+
+
+Pattern CE28b
+# gf New pattern. (3.3.10)
+
+OX
+.*
+O.
+
+:8,nOXe
+
+
+Pattern CE29
+# tm New Pattern (3.1.20)  (see trevord:950)
+# FIXME: this pattern better in patterns.db?
+# gf Added constraint. (3.3.13) (see gunnar:18)
+# nando Added s classification and action. (3.7.11)
+
+X*X    Wedge
+O.X
+
+:8,sOXe
+
+B*X
+OaX
+
+;oplay_attack_either(*,a,a,B)
+
+>if (!safe_omove(*)) known_safe_move(*)
+
+
+Pattern CE31
+# gf New pattern. (3.3.6)
+
+X.X
+?*?
+?O?
+
+:|,OXe,terri(0.1)
+
+
+Pattern CE32
+# gf New pattern. (3.3.17)
+
+X*X
+O.o
+?O?
+
+:8,OXe
+
+
+Pattern CE33
+# gf New pattern. (3.5.3)
+# If both colors are alive this does at best fill a dame.
+
+OOO
+O*O
+?X?
+
+:8,OX,maxterri(0.1)
+
+
+Pattern CE34
+# gf New pattern. (3.7.4)
+# See gunnar:77.
+
+X.*
+?O.
+??X
+
+:/,OXe
+
+
+######################################################################
+#
+# Center followup patterns
+#
+# Patterns in the center which enhance the precision of the CE patterns.
+#
+######################################################################
+
+# Pattern CF3
+# # tm New Pattern (3.1.23) (see arend:36)
+# # FIXME: Perhaps better in patterns.db?
+# # gf This pattern is redundant because the followup has already been
+# #    found by find_worm_threats(). (This was broken in 3.1.23 and 3.1.24.)
+# # al1 Remove pattern. (3.7.11)
+# 
+# O*.O  threaten to save
+# 
+# :-,-
+# 
+# b*ca
+# 
+# ; dead(a) && !dead(b) && oplay_disconnect(*,*,a) && !oplay_attack(*,?,c,a)
+# 
+# > threaten_to_save(a)
+
+
+######################################################################
+#
+# Eye patterns
+#
+# Moves which steal or save a few points by making eye points false.
+#
+######################################################################
+
+
+Pattern EY1
+# gf Revised constraint. (3.3.10)
+
+X*O
+.X?
+
+:8,nOXe,terri(1)
+
+X*b
+aX?
+
+;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a) && !weak(b)
+
+
+Pattern EY2
+# gf Revised constraint. (3.3.10)
+
+?.O
+X*.
+.X?
+
+:/,nOXe,terri(1)
+
+?.b
+X*.
+aX?
+
+;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a) && !weak(b)
+
+
+Pattern EY3
+# gf Revised constraint. (3.3.10)
+
+O*X
+.O?
+
+:8,nOXe,terri(1)
+
+O*X
+aO?
+
+;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a)
+
+
+Pattern EY4
+# gf Revised constraint. (3.3.10)
+
+?.X
+O*.
+.O?
+
+:/,nOXe,terri(1)
+
+?.X
+O*.
+aO?
+
+;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a)
+
+
+Pattern EY5
+# gf Revised constraint. (3.3.10)
+
+?.X
+O.*
+.O?
+
+:8,nOXe,terri(1)
+
+?.X
+Ob*
+aO?
+
+;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a)
+;&& oplay_attack(*,b,b) == WIN
+
+
+# END OF FILE
diff --git a/patterns/extract_fuseki.c b/patterns/extract_fuseki.c
new file mode 100644 (file)
index 0000000..c5fb4bf
--- /dev/null
@@ -0,0 +1,1711 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Extract fuseki patterns from the initial moves of a collection
+ * of games.
+ *
+ * This program finds the most common positions from the initial moves
+ * of a collection of games, and generates patterns in patterns.db
+ * format for the most common moves in these positions.
+ *
+ * Positions are identified by Zobrist hash values, completely
+ * ignoring the risk for hash collisions. In order to take all
+ * symmetries into account, we compute 8 hash values, one for each
+ * transformation of the board. Rather than playing on 8 boards in
+ * parallel, we construct 8 transformed copies of the Zobrist hash
+ * tables and compute one hash value for each of these. To get a
+ * transformation invariant hash, we finally sort the 8 hash values.
+ *
+ * Example:
+ * extract_fuseki sgflist 9 8 400
+ *
+ * generates (up to) 400 patterns, considering the 8 first moves of
+ * the 9x9 games listed in the file sgflist, and writes the patterns
+ * to stdout. sgflist is a file containing sgf filenames, one per line.
+ *
+ * The generated patterns may look like, e.g.
+ * Pattern Fuseki33
+ * # 3/18
+ * 
+ * |.........
+ * |.........
+ * |...*.X...
+ * |.........
+ * |....O....
+ * |.........
+ * |.........
+ * |.........
+ * |.........
+ * +---------
+ * 
+ * :8,-,value(3)
+ * 
+ * The comment line gives the information that this position has been
+ * found 18 times among the analyzed games, and 3 out of these 18 times,
+ * the move * has been played. The same number 3 is entered as pattern
+ * value on the colon line for use by the fuseki module.
+ */
+
+/*
+ * Notes on the statistics:
+ * 
+ * The statistics code assumes that every input file is valid. Use
+ * the output file option to sort out which input files are valid, and
+ * check output for problems. Rerun after fixing/removing invalid files.
+ *
+ * Outcome is defined by RE in sgf. Files without a parsable RE, or which
+ * do not have a winner, are invalid and need to be excluded.
+ * 
+ * Pearson chi squared at 5% is used to test significance of
+ * differences among moves at a given position. Moves excluded by
+ * popularity rules are grouped together and considered as one.  A
+ * positive result means that among all possible moves in a position,
+ * there's a difference somewhere. The next question is where. One
+ * clue comes from dchisq, which is the contribution to the overall
+ * chi squared for each move, with larger meaning higher impact on
+ * significance of overall result. Another comes from post hoc tests.
+ * Each pair of moves from a position with a statistically significant
+ * impact of move choice is compared, again with Pearson chi squared
+ * at 5%, and the positive tests printed. No correction is done for
+ * multiple tests. Pairs with less than 6 total moves are not tested,
+ * so it's possible for there to be a significant overall result
+ * without any positive post hocs. In this case, the overall result is
+ * doubtful as well. 
+ *
+ * If the interest is solely in statistics, using min_pos_freq to
+ * avoid positions without enough data to hope for significance makes
+ * sense: 6 at a minimum. 
+ *
+ * Note that the popularity exclusion rules can result in patterns being
+ * left in the db which have no parent in the db.
+ * 
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <math.h>
+#include "liberty.h"
+#include "gg_utils.h"
+#include "random.h"
+#include "../sgf/sgftree.h"
+
+#define USAGE "\n\
+Usage: extract_fuseki files boardsize moves patterns handicap strength half_board min_pos_freq min_move_percent min_move_freq [output file]\n\
+files:     The name of a file listing sgf files to examine,\n\
+           one filename per line.\n\
+boardsize: Only consider games with this size.\n\
+moves:     Number of moves considered in each game.\n\
+handicap:  0 - no handicap, 1 - any game, 2-9 - two to nine handicap stones\n\
+           10 any handicap game\n\
+strength:  The lowest strength of the players (1k-30k)\n\
+half_board: 0 - full board patterns, 1 - half board patterns\n\
+min_pos_freq: how many times a position must occur before patterns\n\
+           from it are generated\n\
+min_move_percent: minimum popularity relative to most popular move \n\
+           (counted by unique players) required of a move \n\
+           in a given position before it gets a pattern\n\
+min_move_freq: minimum number of unique players who must play a move\n\
+            before it gets a pattern\n\
+output file: Optional (if this exists, extract_fuseki will sort the games instead)\n\
+"
+
+/* Maximum length of sgf filename. */
+#define BUFSIZE 1000
+
+/* Number of moves to consider in each game, given as argument.*/
+int moves_per_game;
+
+/* Flag checking the setting for generating half board patterns */
+int half_board_patterns = 0;
+
+/* Maximum number of patterns to generate */
+#define MAX_PATTERNS_TO_EXTRACT 100000
+
+
+/* Handicap value, given as argument.*/
+int handicap_value;
+
+/* Lowest strength, given as argument.*/
+int player_strength;
+
+
+/* Min # of times a position must be seen before moves from it become
+ * patterns.
+ * Might want this larger to ensure reasonable statistics, 6 or more, say
+ * or smaller to hit every move down to unique games, 2 say;
+ * or even keep churning out moves with 1.
+ *
+ * Given as argument.
+*/
+
+int min_position_freq;
+
+
+/* popularity arguments */
+double min_move_percent;
+int min_move_freq;
+
+
+/* Number of games to analyze. */
+int number_of_games;
+
+/* Dynamically allocated array marking the games that could not be
+ * used for some reason.
+ */
+int *unused_games;
+
+/* WARN 1 warns about unused games. */
+/* WARN 2 also notes assumptions about metainfo. */
+#define WARN 1
+
+
+/* Dynamically allocated list of sgf file names. */
+char **sgf_names;
+
+/* Zobrist hash tables, rotated and reflected into all 8 transformations. */
+unsigned int O_hash[8][MAX_BOARD][MAX_BOARD];
+unsigned int X_hash[8][MAX_BOARD][MAX_BOARD];
+unsigned int move_hash[8][MAX_BOARD][MAX_BOARD];
+
+/* A board is hashed 8 times, once for each transformation, and these
+ * numbers are sorted into a transformation invariant hash.
+ */
+struct invariant_hash {
+  unsigned int values[8];
+};
+
+/* This is defined in engine/matchpat.c */
+extern const int transformations[8][2][2];
+
+
+/* A situation is the combination of a board position and the move to
+ * be made. We use the invariant hashes excluding and including the move
+ * as identification. If are interested in positions, we only use the first
+ * hash value.
+ *
+ * We ignore the possibility of a hash collision.
+ *
+ * outcome is the color which won the game
+ * player is the (hashed) name of the player who made the move
+ */
+struct situation {
+  struct invariant_hash pre;
+  struct invariant_hash post;
+  int outcome;
+  unsigned int player;
+};
+
+/* Dynamically allocated table of situations encountered in the analysis. */
+struct situation *situation_table;
+int number_of_situations;
+
+/* Data type for frequencies of e.g. situations or positions. 'index'
+ * is the index into situation_table.
+ */
+struct frequency {
+  int index;
+  int n;
+  int n_win;
+  int n_player;
+};
+
+/* Position frequency table. */ 
+struct frequency *frequency_table;
+int number_of_distinct_positions;
+
+/* The most common situations are called winners. These are the ones
+ * we generate patterns for.
+ * 
+ * 'index' is normally an index into situation_table, or -1 for
+ * special aggregate entry (with no pattern) to collect stats for
+ * unpopular moves
+ *
+ * pre is hash[0], and must be stored here for aggregate
+ */
+struct winner {
+  int index;
+  unsigned int pre;
+  int position_frequency;
+  int move_frequency;
+  int n_player;
+  int position_success;
+  int move_success;
+  char pattern[MAX_BOARD][MAX_BOARD];
+};
+
+/* Dynamically allocated table of winners. */
+struct winner *winning_moves;
+int number_of_winning_moves;
+
+/* critical values of chisquare distribution with n degrees of freedom */
+/* p < 0.05
+ */
+double chisquarecrit05[] = {
+  3.8415, 5.9915, 7.8147, 9.4877, 11.0705, 12.5916, 14.0671, 15.5073,
+  16.9190, 18.3070, 19.6751, 21.0261, 22.3620, 23.6848, 24.9958, 26.2962,
+  27.5871, 28.8693, 30.1435, 31.4104, 32.67057, 33.92444, 35.17246,
+  36.41503, 37.65248, 38.88514, 40.11327, 41.33714, 42.55697, 43.77297,
+  44.98534, 46.19426, 47.39988, 48.60237, 49.80185, 50.99846, 52.19232,
+  53.38354, 54.57223, 55.75848, 56.94239, 58.12404, 59.30351, 60.48089,
+  61.65623, 62.82962, 64.00111, 65.17077, 66.33865, 67.50481};
+
+/* p < 0.10, should be same size as 05 */
+double chisquarecrit10[] = {
+  2.7055, 4.6052, 6.2514, 7.7794, 9.2364, 10.6446, 12.0170, 13.3616,
+  14.6837, 15.9872, 17.2750, 18.5493, 19.8119, 21.0641, 22.3071, 23.5418,
+  24.7690, 25.9894, 27.2036, 28.4120, 29.61509, 30.81328, 32.00690,
+  33.19624, 34.38159, 35.56317, 36.74122, 37.91592, 39.08747, 40.25602,
+  41.42174, 42.58475, 43.74518, 44.90316, 46.05879, 47.21217, 48.36341,
+  49.51258, 50.65977, 51.80506, 52.94851, 54.09020, 55.23019, 56.36854,
+  57.50530, 58.64054, 59.77429, 60.90661, 62.03754, 63.16712};
+
+double chisquarecrit01[] = {
+  6.63489660102121, 9.21034037197618, 11.3448667301444, 13.2767041359876,
+  15.086272469389, 16.8118938297709, 18.4753069065824, 20.0902350296632,
+  21.6659943334619, 23.2092511589544, 24.7249703113183, 26.2169673055359,
+  27.6882496104570, 29.1412377406728, 30.5779141668925, 31.9999269088152,
+  33.4086636050046, 34.8053057347051, 36.1908691292701, 37.5662347866250,
+  38.9321726835161, 40.2893604375938, 41.6383981188585, 42.9798201393516,
+  44.3141048962192, 45.6416826662832, 46.9629421247514, 48.2782357703155,
+  49.5878844728988, 50.8921813115171, 52.1913948331919, 53.4857718362354,
+  54.7755397601104, 56.0609087477891, 57.3420734338592, 58.619214501687,
+  59.8925000450869, 61.1620867636897, 62.4281210161849, 63.6907397515645,
+  64.9500713352112, 66.2062362839932, 67.4593479223258, 68.7095129693454,
+  69.9568320658382, 71.2014002483115, 72.4433073765482, 73.6826385201058,
+  74.9194743084782, 76.1538912490127};
+
+double chisquarecrit001[] = {
+  10.8275661706627, 13.8155105579643, 16.2662361962381, 18.4668269529032,
+  20.5150056524329, 22.4577444848253, 24.3218863478569, 26.1244815583761,
+  27.8771648712566, 29.5882984450744, 31.26413362024, 32.9094904073602,
+  34.5281789748709, 36.1232736803981, 37.6972982183538, 39.2523547907685,
+  40.7902167069025, 42.31239633168, 43.8201959645175, 45.3147466181259,
+  46.7970380415613, 48.2679422908352, 49.7282324664315, 51.1785977773774,
+  52.6196557761728, 54.0519623885766, 55.4760202057452, 56.8922853933536,
+  58.3011734897949, 59.7030643044299, 61.0983060810581, 62.4872190570885,
+  63.870098522345, 65.2472174609424, 66.618828843701, 67.9851676260242,
+  69.3464524962412, 70.702887411505, 72.0546629519878, 73.401957518991,
+  74.7449383984238, 76.0837627077, 77.418578241314, 78.749524228043,
+  80.076732010819, 81.40032565871, 82.720422519124, 84.0371337172235,
+  85.350564608593, 86.6608151904032};
+
+/*
+ * Append the files that are sorted to a specific file
+ */
+
+static void
+write_sgf_filenames(const char *name, char *filenames[])
+{
+  int n;
+  FILE *namefile = fopen(name, "a");
+  if (!namefile) {
+    fprintf(stderr, "Fatal error, couldn't open %s.\n", name);
+    exit(EXIT_FAILURE);
+  }
+  
+  for (n = 0; n < number_of_games; n++) {
+    if (unused_games[n] == 0)
+      fprintf(namefile, "%s\n", filenames[n]);
+  }
+}
+
+
+/* Read the sgf file names. These are assumed to be stored one per
+ * line in the file with the name given by 'name'. The sgf file names
+ * are copied into dynamically allocated memory by strdup() and
+ * pointers to the names are stored into the 'filenames[]' array. It
+ * is assumed that 'filenames' has been allocated sufficiently large
+ * before this this function is called. If 'filenames' is NULL, the
+ * sgf file names are only counted. The number of sgf file names is
+ * returned.
+ */
+static int
+read_sgf_filenames(const char *name, char *filenames[])
+{
+  int n;
+  char buf[BUFSIZE];
+  FILE *namefile = fopen(name, "r");
+  if (!namefile) {
+    fprintf(stderr, "Fatal error, couldn't open %s.\n", name);
+    exit(EXIT_FAILURE);
+  }
+
+  n = 0;
+  while (fgets(buf, BUFSIZE, namefile) != NULL) {
+    if (filenames != NULL) {
+      if (buf[strlen(buf) - 2] == '\r') {
+       buf[strlen(buf) - 2] = '\0'; 
+       /* Delete carriage return character, if any. */
+      }
+      else {
+       buf[strlen(buf) - 1] = '\0'; 
+       /* Delete newline character. */
+      }
+      
+      filenames[n] = strdup(buf);
+      if (filenames[n] == NULL) {
+       fprintf(stderr, "Fatal error, strdup() failed.\n");
+       exit(EXIT_FAILURE);
+      }
+    }
+    n++;
+  }
+  
+  return n;
+}
+
+/* Fill one of the zobrist hash tables with random numbers. */
+static void
+init_zobrist_table(unsigned int hash[8][MAX_BOARD][MAX_BOARD])
+{
+  unsigned int k;
+  int m, n;
+  int i, j;
+  int mid = board_size/2;
+  
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) {
+      hash[0][m][n] = 0;
+      for (k = 0; 32*k < CHAR_BIT*sizeof(hash[0][0][0]); k++)
+       hash[0][m][n] |= gg_urand() << k*32;
+    }
+  
+  /* Fill in all transformations of the hash table. */
+  for (k = 1; k < 8; k++)
+    for (m = 0; m < board_size; m++)
+      for (n = 0; n < board_size; n++) {
+       TRANSFORM2(m-mid, n-mid, &i, &j, k);
+       hash[k][m][n] = hash[0][i+mid][j+mid];
+      }
+  
+  /* Debug output. */
+  if (0) {
+    for (k = 0; k < 8; k++) {
+      for (m = 0; m < board_size; m++) {
+       for (n = 0; n < board_size; n++)
+         fprintf(stderr, "%8x ", hash[k][m][n]);
+       fprintf(stderr, "\n");
+      }
+      fprintf(stderr, "\n");
+      fprintf(stderr, "\n");
+    }
+  }
+}
+
+/* Initialize all Zobrist hash tables with random numbers. */
+static void
+init_zobrist_numbers(void)
+{
+  gg_srand(1);
+  init_zobrist_table(O_hash);
+  init_zobrist_table(X_hash);
+  init_zobrist_table(move_hash);
+}
+
+/* Initialize the situation_table array. */
+static void
+init_situations(void)
+{
+  situation_table = calloc(moves_per_game * number_of_games,
+                          sizeof(*situation_table));
+  if (!situation_table) {
+    fprintf(stderr, "Fatal error, failed to allocate situations table.\n");
+    exit(EXIT_FAILURE);
+  }
+  number_of_situations = 0;
+}
+
+/* Compare two hash values. Used for sorting the hash values in the
+ * invariant hash.
+ */
+static int
+compare_numbers(const void *a, const void *b)
+{
+  unsigned int aa = *((const unsigned int *) a);
+  unsigned int bb = *((const unsigned int *) b);
+  if (aa > bb)
+    return 1;
+  if (aa < bb)
+    return -1;
+  return 0;
+}
+
+/* Compute hash values for all transformations of the position
+ * currently in the p[][] array. The hash values are not sorted by
+ * this function.
+ */
+static void
+common_hash_board(struct invariant_hash *hash, int color_to_play)
+{
+  int m, n;
+  int k;
+  
+  for (k = 0; k < 8; k++)
+    hash->values[k] = 0;
+  
+  for (m = 0; m < board_size; m++)
+    for (n = 0; n < board_size; n++) {
+      for (k = 0; k < 8; k++) {
+       if (BOARD(m, n) == color_to_play)
+         hash->values[k] ^= O_hash[k][m][n];
+       else if (BOARD(m, n) != EMPTY)
+         hash->values[k] ^= X_hash[k][m][n];
+      }
+    }
+}
+
+/* Compute invariant hash for the current position. */
+static void
+hash_board(struct invariant_hash *hash, int color_to_play)
+{
+  common_hash_board(hash, color_to_play);
+  /* Sort the 8 hash values. */
+  gg_sort(hash->values, 8, sizeof(hash->values[0]), compare_numbers);
+}
+
+/* Compute invariant hash for the current situation, i.e. position
+ * plus a move to be made.
+ */
+static void
+hash_board_and_move(struct invariant_hash *hash, int color_to_play,
+                   int m, int n)
+{
+  int k;
+  
+  common_hash_board(hash, color_to_play);
+  
+  for (k = 0; k < 8; k++)
+    hash->values[k] ^= move_hash[k][m][n];
+  
+  /* Notice that we of course must wait with sorting until we have
+   * added the move to the hash values.
+   */
+  gg_sort(hash->values, 8, sizeof(hash->values[0]), compare_numbers);
+}
+
+
+/* the so called X31 hash from gtk, for hashing strings */
+static unsigned int
+hash_string(const char *v)
+{
+  unsigned int h = 0;
+  while (*v != '\0') {
+    h = (h << 5) - h + *v;
+    v++;
+  }
+  return h;
+}
+
+/* Adapted from play_sgf_tree() in engine/sgfutils.c. Returns the
+ * next move from the game record in (*m, *n) and color in *color. If
+ * handicap stones are encountered, these are put on the board
+ * immediately. Return value is 1 if another move was found in the
+ * game record, 0 otherwise.
+ */
+static int
+get_move_from_sgf(SGFNode *node, int *m, int *n, int *color)
+{
+  SGFProperty *prop;
+  int i, j;
+  
+  for (prop = node->props; prop; prop = prop->next) {
+    if (!prop || !prop->name || !node) {
+      /* something wrong with the SGF file properties */
+      if (1)
+       fprintf(stderr, "Something wrong with the SGF file properties.\n");
+      return 0;
+    }
+    switch (prop->name) {
+    case SGFAB:
+      get_moveXY(prop, &i, &j, board_size);
+      /* Put handicap stones on the board at once. */
+      add_stone(POS(i, j), BLACK);
+      break;
+      
+    case SGFAW:
+      if (0)
+       fprintf(stderr, "Warning: white stone added.\n");
+      return 0;
+      break;
+      
+    case SGFPL:
+      if (0)
+       fprintf(stderr, "Warning: PL property encountered.\n");
+      return 0;
+      break;
+      
+    case SGFW:
+    case SGFB:
+      *color = (prop->name == SGFW) ? WHITE : BLACK;
+      
+      if (!get_moveXY(prop, m, n, board_size)) {
+       if (0)
+         fprintf(stderr, "Warning: failed to get move coordinates.\n");
+       return 0;
+      }
+      return 1;
+      break;
+    }
+  }
+  
+  return 0;
+}
+
+/* Add a situation to the situation_table array. */
+static void
+add_situation(struct invariant_hash *pre, struct invariant_hash *post,
+             int outcome, unsigned int player)
+{
+  situation_table[number_of_situations].pre = *pre;
+  situation_table[number_of_situations].post = *post;
+  situation_table[number_of_situations].outcome = outcome;
+  situation_table[number_of_situations].player = player;
+  number_of_situations++;
+}
+
+/* Compare two situations. Used (indirectly, see compare_situations2)
+ * for sorting the situation_table array
+ * and when building frequency tables for the different moves at the
+ * same position.
+ */
+static int
+compare_situations(const void *a, const void *b)
+{
+  const struct situation *aa = a;
+  const struct situation *bb = b;
+  int k;
+  
+  for (k = 0; k < 8; k++) {
+    if (aa->pre.values[k] > bb->pre.values[k])
+      return 1;
+    if (aa->pre.values[k] < bb->pre.values[k])
+      return -1;
+  }
+  
+  for (k = 0; k < 8; k++) {
+    if (aa->post.values[k] > bb->post.values[k])
+      return 1;
+    if (aa->post.values[k] < bb->post.values[k])
+      return -1;
+  }
+  
+  return 0;
+}
+
+static int
+compare_situations2(const void *a, const void *b)
+{
+  const struct situation *aa = a;
+  const struct situation *bb = b;
+  int r = compare_situations(a, b);
+  if (r != 0) 
+    return r;
+  if (aa->player > bb->player)
+    return 1;
+  if (aa->player < bb->player)
+    return -1;
+
+  return 0;
+}
+
+/* Compare two positions. Used when building frequency table for the
+ * different positions encountered.
+ */
+static int
+compare_positions(const void *a, const void *b)
+{
+  const struct situation *aa = a;
+  const struct situation *bb = b;
+  int k;
+  
+  for (k = 0; k < 8; k++) {
+    if (aa->pre.values[k] > bb->pre.values[k])
+      return 1;
+    if (aa->pre.values[k] < bb->pre.values[k])
+      return -1;
+  }
+  
+  return 0;
+}
+
+/* Compare two frequency table entries. The returned values are
+ * "backwards" because we always want to sort frequencies in falling
+ * order.
+ * 
+ * The first version counts every game equally, the second version
+ * counts a game only once per unique player.
+ */
+static int
+compare_frequencies(const void *a, const void *b)
+{
+  const struct frequency *aa = a;
+  const struct frequency *bb = b;
+  
+  if (aa->n < bb->n)
+    return 1;
+  
+  if (aa->n > bb->n)
+    return -1;
+  
+  return 0;
+}
+
+static int
+compare_frequencies2(const void *a, const void *b)
+{
+  const struct frequency *aa = a;
+  const struct frequency *bb = b;
+  
+  if (aa->n_player < bb->n_player)
+    return 1;
+  
+  if (aa->n_player > bb->n_player)
+    return -1;
+  
+  return 0;
+}
+
+/*
+ * find_region answers in what region the move is.
+ * There are 9 regions, corners, sides and center.
+ */
+
+static int
+find_region(int m, int n)
+{
+  if (m < 7) {
+    if (n < 7)
+      return 0;
+    else if (n > 11)
+      return 1;
+    else if (n > 6 && m < 5)
+      return 6;
+  }
+  else if (m > 11) {
+    if (n < 7)
+      return 2;
+    else if (n > 11)
+      return 3;
+    else if (n > 6 && m > 13)
+      return 7;
+  }
+  else if (m > 6) {
+    if (n < 5)
+      return 4;
+    else if (n > 13)
+      return 5;
+  }
+  /* otherwise in center */
+  return 8;
+}
+
+/* If this situation is listed among the winners, fill in the pattern
+ * entry of the winner struct.
+ */
+static void
+store_pattern_if_winner(struct invariant_hash *pre,
+                       struct invariant_hash *post,
+                       int color, int m, int n)
+{
+  int k;
+  struct situation s;
+  int region = 8;
+  int i, j;
+  int move_number = 1;
+  s.pre = *pre;
+  s.post = *post;
+
+  for (k = 0; k < number_of_winning_moves; k++) {
+    if (winning_moves[k].index != -1
+       && compare_situations(&situation_table[winning_moves[k].index],
+                             &s) == 0) {
+      /* This is a winner. Record the pattern. */
+      for (i = 0; i < board_size; i++)
+       for (j = 0; j < board_size; j++) {
+         if (BOARD(i, j) == EMPTY)
+           winning_moves[k].pattern[i][j] = '.';
+         else if (BOARD(i, j) == color) {
+           winning_moves[k].pattern[i][j] = 'O';
+           move_number++;
+         }
+         else if ((color == WHITE && BOARD(i, j) == BLACK)
+                  || (color == BLACK && BOARD(i, j) == WHITE)) {
+           winning_moves[k].pattern[i][j] = 'X';
+           move_number++;
+         }
+         else { /* something is wrong */
+           fprintf(stderr, "Error in store_pattern_if_winner: %d\n", k);
+           winning_moves[k].pattern[i][j] = '.';
+         }
+       }
+      winning_moves[k].pattern[m][n] = '*';
+      /* Add ? in areas far away from the move. */
+      if (half_board_patterns == 1 && move_number > 3 && board_size == 19)
+        region = find_region(m, n);
+      if (region != 8) {
+        for (i = 0; i < board_size; i++) {
+          for (j = 0; j < board_size; j++) {
+            if (region == 0) {
+              if (i + j > 23)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+            else if (region == 1) {
+              if (i - j > 5)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+            else if (region == 2) {
+              if (i + board_size - j < 14)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+           else if (region == 3) {
+              if (i + j < 13)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+            else if (region == 4) {
+              if (j > 10)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+            else if (region == 5) {
+              if (j < 8)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+            else if (region == 6) {
+              if (i > 10)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+            else if (region == 7) {
+              if (i < 8)
+               winning_moves[k].pattern[i][j] = '?';
+           }
+          }
+        }
+      }
+    }
+  }
+}
+
+/* Play through the initial moves of a game. If 'collect_statistics'
+ * is set, store all encountered situations in the situation_table
+ * array. 'collect_statistics' will be set to the color which won the
+ * game.  Otherwise, see if there are any winners among the situations
+ * and store the corresponding pattern so that it can subsequently be
+ * printed. Return 0 if there was some problem with the game record,
+ * e.g. fewer moves than expected.
+ */
+static int
+examine_game(SGFNode *sgf, int collect_statistics)
+{
+  int k;
+  int m, n;
+  SGFNode *node = sgf;
+  struct invariant_hash prehash;
+  struct invariant_hash posthash;
+  int color;
+  char *PW, *PB;
+  unsigned int white_player, black_player;
+
+  if (!sgfGetCharProperty(sgf, "PW", &PW))
+    white_player = hash_string("");
+  else
+    white_player = hash_string(PW);
+
+  if (!sgfGetCharProperty(sgf, "PB", &PB))
+    black_player = hash_string("");
+  else
+    black_player = hash_string(PB);
+  
+  /* Call the engine to clear the board. */
+  clear_board();
+  
+  /* Loop through the first moves_per_game moves of each game. */
+  for (k = 0; k < moves_per_game && node != NULL; node = node->child) {
+    if (!get_move_from_sgf(node, &m, &n, &color)) {
+      if (k > 0) {
+       /* something is wrong with the file */
+       if (0)
+         fprintf(stderr, "move number:%d\n", k);
+       return 0;
+      }
+      continue;
+    }
+    gg_assert(m >= 0 && m < board_size && n >= 0 && n <= board_size);
+    hash_board(&prehash, color);
+    hash_board_and_move(&posthash, color, m, n);
+    if (collect_statistics != EMPTY)
+      add_situation(&prehash, &posthash, collect_statistics == color, 
+                   color == WHITE ? white_player : black_player);
+    else
+      store_pattern_if_winner(&prehash, &posthash, color, m, n);
+    play_move(POS(m, n), color);
+    
+    /* Debug output. */
+    if (0) {
+      int l;
+      for (l = 0; l < 8; l++)
+       fprintf(stderr, "%8x ", prehash.values[l]);
+      fprintf(stderr, " ");
+      for (l = 0; l < 8; l++)
+       fprintf(stderr, "%8x ", posthash.values[l]);
+      fprintf(stderr, "\n");
+      showboard(0);
+    }
+    k++;
+  }
+  if (!node) {
+    if (0)
+      fprintf(stderr, "Node error\n");
+    return 0;
+  }
+  
+  return 1;
+}
+
+/* Tests if the player has enough strength in the game to be interesting 
+ * for the library
+ */
+  
+static int
+enough_strength(char *strength)
+{
+  int length = 0;
+  int i = 0;
+  int kyu = 30;
+  if (player_strength >= 30)
+    return 1;
+  
+  length = strlen(strength);
+  /* check if dan or pro player */
+  for (i = 0; i < length; i++)
+    if (strength[i] == 'd' || strength[i] == 'D' 
+       || strength[i] == 'p' || strength[i] == 'P')
+      return 1;
+  
+  /* get the kyu strength as an integer */
+  for (i = 0; i < length; i++) {
+    if (strength[i] == 'k')
+      strength[i] = '\0';
+    kyu = atoi(strength);
+    if (kyu == 0) {
+      if (player_strength >= 30)
+       return 1;
+      else
+       return 0;
+    }
+  }
+  
+  if (kyu <= player_strength)
+    return 1;
+
+  /* not enough strength */
+  return 0;
+}
+
+    
+/* 
+ * used by both sort_games and collect_situations to
+ * check validity of a game record
+ * 0 means failure for any reason
+ * 1 means probably okay, without going through moves
+ */
+static int
+check_game(SGFNode *sgf, char *sgfname)
+{
+  int handicap, size;
+  char *WR, *BR; /* white rank */
+  char thirty_kyu[] = "30k";
+  char *RE;
+  
+  size = 19;
+  if (!sgfGetIntProperty(sgf, "SZ", &size)) {
+    if (WARN > 1)
+      fprintf(stderr, "Warning: no SZ in sgf file %s , assuming size %d\n",
+             sgfname, size);
+  }
+  if (size != board_size) {
+    if (WARN)
+      fprintf(stderr, "Warning: wrong size of board %d in sgf file %s .\n",
+             size, sgfname);
+    return 0;
+  }
+    
+  /* No handicap games */
+  if (handicap_value == 0) {
+    if (sgfGetIntProperty(sgf, "HA", &handicap) && handicap > 1) {
+      if (WARN)
+       fprintf(stderr,
+               "No handicap games allowed, sgf file %s has handicap %d\n",
+               sgfname, handicap);
+      return 0;
+    }
+  }
+    
+  /* Only handicap games */
+  if (handicap_value > 1) {
+    if (!sgfGetIntProperty(sgf, "HA", &handicap)) {
+      if (WARN)
+       fprintf(stderr, "Sgf file %s is not a handicap game\n", sgfname);
+      return 0;
+    }
+      
+    /* only specific handicap games */
+    if (handicap_value != 10 && handicap != handicap_value) {
+      if (WARN)
+       fprintf(stderr,
+               "Sgf file %s has wrong number of handicap stones %d\n",
+               sgfname, handicap);
+      return 0;
+    }
+
+    /* any reasonable handicap games */
+    if (handicap_value == 10 && (handicap < 2 || handicap > 9)) {
+      if (WARN)
+       fprintf(stderr,
+               "Sgf file %s has wrong/weird number of handicap stones %d\n",
+               sgfname, handicap);
+      return 0;
+    }
+  }
+
+  /* Examine strength of players in the game and compare it 
+   * with minimum player strength.
+   */
+  
+  BR = thirty_kyu;
+  if (!sgfGetCharProperty(sgf, "BR", &BR)) {
+    if (WARN > 1)
+      fprintf(stderr, "No black strength in sgf file %s assuming %s\n",
+             sgfname, BR);
+  }
+  if (!enough_strength(BR)) {
+    if (WARN)
+      fprintf(stderr, "Wrong black strength %s in sgf file %s\n", BR, sgfname);
+    return 0;
+  }
+      
+  WR = thirty_kyu;
+  if (!sgfGetCharProperty(sgf, "WR", &WR)) {
+    if (WARN > 1)
+      fprintf(stderr, "No white strength in sgf file %s assuming %s\n",
+             sgfname, WR);
+  }
+  if (!enough_strength(WR)) {
+    if (WARN)
+      fprintf(stderr, "Wrong white strength %s in sgf file %s\n", WR, sgfname);
+    return 0;
+  }
+
+  /* Must have result. */
+  if (!sgfGetCharProperty(sgf, "RE", &RE)) {
+    if (WARN)
+      fprintf(stderr, "No result in game %s\n", sgfname);
+    return 0;
+  }
+  
+  if (strncmp(RE, "B+", 2) != 0 && strncmp(RE, "W+", 2) != 0) {
+    if (WARN)
+      fprintf(stderr, "Couldn't parse winner in result %s from game %s\n",
+             RE, sgfname);
+    return 0;
+  }
+  
+  /* Looks okay. */
+  return 1;
+}
+
+/*
+ * Sort out the games that can be used.
+ */
+
+static void
+sort_games(void)
+{
+  int k;
+
+  for (k = 0; k < number_of_games; k++) {
+    SGFNode *sgf;
+    
+    /* Progress output. */
+    if (k % 500 == 0)
+      fprintf(stderr, "Sorting number %d, %s\n", k, sgf_names[k]);
+    
+    sgf = readsgffilefuseki(sgf_names[k], 0);
+    
+    
+    if (!sgf) {
+      if (WARN)
+       fprintf(stderr, "Warning: Couldn't open sgf file %s number %d.\n",
+               sgf_names[k], k);
+      unused_games[k] = 1; /* the game could not be used */
+      continue;
+    }
+
+    if (!check_game(sgf, sgf_names[k]))
+      unused_games[k] = 1;
+    
+    /* Free memory of SGF file */
+    sgfFreeNode(sgf);
+  }
+}
+
+
+/* Play through the initial moves of all games and collect hash values
+ * for the encountered situations.
+ */
+static void
+collect_situations(void)
+{
+  int k;
+  int winner; /* who won the game in question */
+  
+  init_situations();
+  for (k = 0; k < number_of_games; k++) {
+    SGFNode *sgf;
+    char *RE;
+    
+    /* Progress output. */
+    if (k % 500 == 0)
+      fprintf(stderr, "Reading number %d, %s\n", k, sgf_names[k]);
+    
+    sgf = readsgffilefuseki(sgf_names[k], moves_per_game);
+    
+    if (!sgf) {
+      if (WARN)
+       fprintf(stderr, "Warning: Couldn't open sgf file %s.\n", sgf_names[k]);
+      unused_games[k] = 1; /* the game could not be used */
+      continue;
+    }
+    
+    if (!check_game(sgf, sgf_names[k])) {
+      unused_games[k] = 1; 
+      sgfFreeNode(sgf);
+      continue;
+    }
+    
+    if (!sgfGetCharProperty(sgf, "RE", &RE)) {
+      gg_assert(0);
+    }
+
+    if (strncmp(RE, "B+", 2) == 0)
+      winner = BLACK;
+    else if (strncmp(RE, "W+", 2) == 0)
+      winner = WHITE;
+    else {
+      gg_assert(0);
+    }
+    
+    if (!examine_game(sgf, winner)) {
+      if (WARN)
+       fprintf(stderr, "Warning: Problem with sgf file %s\n", sgf_names[k]);
+      unused_games[k] = 1; /* the game could not be used */
+    }
+    
+    /* Free memory of SGF file */
+    sgfFreeNode(sgf);
+  }
+}
+
+/* Find the most common positions and moves, for which we want to
+ * generate patterns.
+ */
+static void
+analyze_statistics(void)
+{
+  int k;
+  /* Sort all the collected situations. */
+  gg_sort(situation_table, number_of_situations, sizeof(*situation_table),
+         compare_situations2);
+  
+  /* Debug output. */
+  if (0) {
+    int i, k;
+    for (i = 0; i < number_of_situations; i++) {
+      fprintf(stderr, "%4d ", i);
+      for (k = 0; k < 8; k++)
+       fprintf(stderr, "%8x ", situation_table[i].pre.values[k]);
+      fprintf(stderr, "  ");
+      for (k = 0; k < 8; k++)
+       fprintf(stderr, "%8x ", situation_table[i].post.values[k]);
+      fprintf(stderr, "\n");
+    }
+  }
+  
+  /* Set up frequency table. */
+  frequency_table = calloc(number_of_situations, sizeof(*frequency_table));
+  if (!frequency_table) {
+    fprintf(stderr, "Fatal error, failed to allocate frequency table.\n");
+    exit(EXIT_FAILURE);
+  }
+  number_of_distinct_positions = 0;
+
+  /* Make frequency analysis of the positions before the moves. */
+  for (k = 0; k < number_of_situations; k++) {
+    if (k == 0 || compare_positions(&situation_table[k],
+                                   &situation_table[k-1]) != 0) {
+      frequency_table[number_of_distinct_positions].index = k;
+      frequency_table[number_of_distinct_positions].n = 0;
+      frequency_table[number_of_distinct_positions].n_win = 0;
+      frequency_table[number_of_distinct_positions].n_player = 0;
+      number_of_distinct_positions++;
+    }
+    frequency_table[number_of_distinct_positions-1].n++;
+    frequency_table[number_of_distinct_positions-1].n_win += situation_table[k].outcome;
+    if (frequency_table[number_of_distinct_positions-1].n == 1 
+       || situation_table[k].player != situation_table[k-1].player) 
+      frequency_table[number_of_distinct_positions-1].n_player++; 
+  }
+  
+  /* Sort the frequency table, in falling order. */
+  gg_sort(frequency_table, number_of_distinct_positions,
+         sizeof(*frequency_table), compare_frequencies);
+  
+  /* Debug output. */
+  if (0) {
+    int l;
+    for (l = 0; l < number_of_distinct_positions; l++) {
+      fprintf(stderr, "%4d %5d\n", frequency_table[l].n,
+             frequency_table[l].index);
+    }
+  }
+  
+  /* Set up winners array. */
+  winning_moves = calloc(MAX_PATTERNS_TO_EXTRACT, sizeof(*winning_moves));
+  if (!winning_moves) {
+    fprintf(stderr, "Fatal error, failed to allocate winning moves table.\n");
+    exit(EXIT_FAILURE);
+  }
+  number_of_winning_moves = 0;
+  
+  /* Starting with the most common position, find the most common
+   * moves for each position, until the number of patterns to be
+   * generated is reached.
+   */
+  for (k = 0; k < number_of_distinct_positions; k++) {
+    int index = frequency_table[k].index;
+    int i;
+    
+    /* Build a new frequency table for the different moves in this position. */
+    struct frequency move_frequencies[MAX_BOARD * MAX_BOARD];
+    int number_of_moves = 0;
+
+    /* A position must occur a minimum before we analyze and record
+     * the moves from it.
+     */
+    if (frequency_table[k].n < min_position_freq)
+      break;
+
+    for (i = index; ;i++) {
+      if (i == number_of_situations
+         || (i > index
+             && compare_positions(&situation_table[i],
+                                  &situation_table[i-1]) != 0))
+       break;
+      
+      if (i == index || compare_situations(&situation_table[i],
+                                          &situation_table[i-1]) != 0) {
+       move_frequencies[number_of_moves].index = i;
+       move_frequencies[number_of_moves].n = 0;
+       move_frequencies[number_of_moves].n_win = 0;
+       move_frequencies[number_of_moves].n_player = 0;
+       number_of_moves++;
+      }
+      move_frequencies[number_of_moves-1].n++;
+      move_frequencies[number_of_moves-1].n_win += situation_table[i].outcome;
+      
+      if (move_frequencies[number_of_moves-1].n == 1 
+         || situation_table[i].player != situation_table[i-1].player) 
+       move_frequencies[number_of_moves-1].n_player++;
+    }
+    
+    /* Sort the moves, in falling order. */
+    gg_sort(move_frequencies, number_of_moves,
+           sizeof(*move_frequencies), compare_frequencies2);
+    
+    /* Debug output. */
+    if (0) {
+      for (i = 0; i < number_of_moves; i++) {
+       fprintf(stderr, "%4d %3d %4d\n", index, move_frequencies[i].n,
+               move_frequencies[i].index);
+      }
+    }
+    
+    /* Add the moves to the list of winners. */
+    for (i = 0; i < number_of_moves; i++) {
+      /* This is where the cut-off of moves is decided 
+       * based on popularity from command line arguments.
+       */
+       
+      if (0.01 * min_move_percent*move_frequencies[0].n_player
+         > move_frequencies[i].n_player 
+         || move_frequencies[i].n_player < min_move_freq) {
+       winning_moves[number_of_winning_moves].index = -1;
+       winning_moves[number_of_winning_moves].pre =
+         situation_table[frequency_table[k].index].pre.values[0];
+       winning_moves[number_of_winning_moves].position_frequency =
+         frequency_table[k].n;
+       winning_moves[number_of_winning_moves].n_player = 0;    
+       winning_moves[number_of_winning_moves].move_frequency = 0;
+       winning_moves[number_of_winning_moves].position_success =
+         frequency_table[k].n_win;
+       winning_moves[number_of_winning_moves].move_success = 0;
+       
+       while (i < number_of_moves) {
+         gg_assert(0.01 * min_move_percent*move_frequencies[0].n_player 
+                    > move_frequencies[i].n_player
+                    || move_frequencies[i].n_player < min_move_freq);
+         gg_assert(situation_table[move_frequencies[i].index].pre.values[0]
+                   == winning_moves[number_of_winning_moves].pre);
+         winning_moves[number_of_winning_moves].n_player +=
+           move_frequencies[i].n_player;       
+         winning_moves[number_of_winning_moves].move_frequency +=      
+           move_frequencies[i].n;
+         winning_moves[number_of_winning_moves].move_success +=
+           move_frequencies[i].n_win;
+         i++;
+       }
+       number_of_winning_moves++;
+       continue;
+      }
+      
+      winning_moves[number_of_winning_moves].index = move_frequencies[i].index;
+      winning_moves[number_of_winning_moves].pre =
+       situation_table[frequency_table[k].index].pre.values[0];
+      winning_moves[number_of_winning_moves].position_frequency =
+       frequency_table[k].n;
+      winning_moves[number_of_winning_moves].move_frequency =
+       move_frequencies[i].n;
+      winning_moves[number_of_winning_moves].n_player =
+       move_frequencies[i].n_player;   
+
+      winning_moves[number_of_winning_moves].position_success =
+       frequency_table[k].n_win;
+      winning_moves[number_of_winning_moves].move_success =
+       move_frequencies[i].n_win;
+      number_of_winning_moves++;
+      
+      if (number_of_winning_moves == MAX_PATTERNS_TO_EXTRACT)
+       break;
+    }
+    
+    if (number_of_winning_moves == MAX_PATTERNS_TO_EXTRACT)
+      break;
+  }
+  
+  /* Debug output. */
+  if (0) {
+    int i;
+    for (i = 0; i < number_of_winning_moves; i++) {
+      fprintf(stderr, "%4d %3d %3d\n",
+             winning_moves[i].index,
+             winning_moves[i].position_frequency,
+             winning_moves[i].move_frequency);
+    }
+  }
+}
+
+/* Scan through the games a second time to pick up the patterns
+ * corresponding to the winning moves.
+ */
+static void
+generate_patterns(void)
+{
+  int k;
+  SGFNode *sgf;
+  for (k = 0; k < number_of_games; k++) {
+    
+    /* Progress output. */
+    if (k % 500 == 0)
+      fprintf(stderr, "Generating number %d, %s\n", k, sgf_names[k]);
+    
+    /* Check if this game is a valid game. */
+    if (unused_games[k]) {
+      if (0)
+       fprintf(stderr, "Not used\n");
+      continue;
+    }
+    
+    sgf = readsgffilefuseki(sgf_names[k], moves_per_game);
+    if (!sgf) {
+      fprintf(stderr, "Warning: Couldn't open sgf file %s.\n", sgf_names[k]);
+      continue;
+    }
+    
+    examine_game(sgf, 0);
+    
+    /* Free memory of SGF file. */
+    sgfFreeNode(sgf);
+  }
+}
+
+/* Print the winning patterns in patterns.db format on stdout. */
+static void
+print_patterns(void)
+{
+  int k, l;
+  int m, n;
+  double chisq = 0.0;
+  int df = 0;
+  unsigned int pre = situation_table[winning_moves[0].index].pre.values[0];
+  int first_in_set = 0;
+  gg_assert(winning_moves[0].index != -1);
+  l = 1;
+  for (k = 0; k < number_of_winning_moves; k++) {
+    /* Do not print erroneous patterns. */
+    if (winning_moves[k].pattern[0][0] != '\0'
+       || winning_moves[k].index == -1) {
+      double grand_sum = winning_moves[k].position_frequency;
+      double grand_wins = winning_moves[k].position_success;
+#if 0
+      double grand_losses = grand_sum - grand_wins;
+#endif
+      double row_sum = winning_moves[k].move_frequency;
+      double wins =  winning_moves[k].move_success;
+      double losses = row_sum - wins;
+      double expect_wins = row_sum*grand_wins/grand_sum;
+      double expect_losses = row_sum - expect_wins;
+      /* We're _not_ using a Yates corrected chisquare.
+       * Two reasons: 1. It's never correct for > 2x2 table
+       *              2. Our marginals are sampled, not fixed, so
+       *                Yates and usual Fisher exact are wrong distribution.
+       *  Straight chi squared is best.
+       */
+      double dchisq = 0.0;
+      /* This was Yates line. It's wrong. */
+#if 0
+      if (expect_wins > 0.0)
+       dchisq += pow(gg_abs(wins - expect_wins) - 0.5, 2) / expect_wins;
+#endif
+      
+      if (expect_wins > 0.0)
+       dchisq += pow(wins - expect_wins, 2) / expect_wins;
+      if (expect_losses > 0.0)
+       dchisq  += pow(losses - expect_losses, 2) / expect_losses;
+      
+      gg_assert(winning_moves[k].index == -1
+               || (situation_table[winning_moves[k].index].pre.values[0]
+                   == winning_moves[k].pre));
+      
+      /* Did we just finish a set? If so, print totals and reset. */
+      if (winning_moves[k].pre != pre) { 
+       /* p-value is 1 - incomplete gamma function(d.o.f/2, chisq/2)
+        * variable df is number of moves, actual d.o.f is df-1
+        * k is referring to the pattern _after_ the set we just completed.
+        */
+       printf("\n### Summary of pattern pre 0x%08x\n### N Chi_squared df: %d %g %d ",
+              pre, winning_moves[k-1].position_frequency, chisq, df - 1);
+       /* and array is indexed at zero for d.o.f = 1... */
+       if (df-1 < 1)
+         printf("NS\n\n");
+       else if (df - 1 < (int) (sizeof(chisquarecrit05) / sizeof(double))
+                && chisq > chisquarecrit05[df-2]) { 
+         /* The overall result is significant at 5%. In this case, at
+          * least some authorities will allow us to examine several
+          * individual contrasts w/o futher correction. We compare
+          * every pair of moves, which is perhaps too many, but the
+          * purpose is to give the human expert (who would in any
+          * case be required to examine the output) some sense of
+          * where the differences are. Something like a Bonferroni
+          * correction could result in a significant test overall,
+          * but no significant contrasts, which is obviously
+          * nonsense. The significance of the overall result must
+          * come from somewhere.
+          */
+         int m, n;
+         if (chisq > chisquarecrit001[df-2]) 
+           printf("!!! p < 0.001\n");
+         else if (chisq > chisquarecrit01[df-2]) 
+           printf("!!! p < 0.01\n");
+         else
+           printf("!!! p < 0.05\n");
+         for (m = first_in_set; m < k; m++) {
+           for (n = m + 1; n < k; n++) {
+             double grand_sum = (winning_moves[m].move_frequency
+                                 + winning_moves[n].move_frequency);
+             double grand_wins = (winning_moves[m].move_success
+                                  + winning_moves[n].move_success);
+#if 0
+             double grand_losses = grand_sum - grand_wins;
+#endif
+             double row_sum_m = winning_moves[m].move_frequency;
+             double row_sum_n = winning_moves[n].move_frequency;
+
+             double wins_m =  winning_moves[m].move_success;
+             double losses_m = row_sum_m - wins_m;
+             double wins_n =  winning_moves[n].move_success;
+             double losses_n = row_sum_n - wins_n;
+
+             double expect_wins_m = row_sum_m * grand_wins/grand_sum;
+             double expect_losses_m = row_sum_m - expect_wins_m;
+             double expect_wins_n = row_sum_n * grand_wins/grand_sum;
+             double expect_losses_n = row_sum_n - expect_wins_n;
+             double dchisq_m = 0.0;
+             double dchisq_n = 0.0;
+             if (expect_wins_m > 0.0)
+               dchisq_m += pow(wins_m - expect_wins_m, 2) / expect_wins_m;
+             if (expect_losses_m > 0.0)
+               dchisq_m  += pow(losses_m - expect_losses_m, 2) / expect_losses_m;
+             if (expect_wins_n > 0.0)
+               dchisq_n += pow(wins_n - expect_wins_n, 2) / expect_wins_n;
+             if (expect_losses_n > 0.0)
+               dchisq_n  += pow(losses_n - expect_losses_n, 2) / expect_losses_n;
+             /* We demand at least N=6. Nonsense with smaller N. */
+             if (dchisq_m + dchisq_n > chisquarecrit05[0] && grand_sum > 5) {
+               printf("#### 0x%08x %c 0x%08x (p < 0.05) chisq = %g N = %g\n", 
+                      situation_table[winning_moves[m].index].post.values[0],
+                      (1.0 * wins_m / row_sum_m
+                       > 1.0 * wins_n / row_sum_n) ? '>' : '<',
+                      situation_table[winning_moves[n].index].post.values[0],
+                      dchisq_m + dchisq_n, grand_sum);
+             }
+           }
+         }
+         printf("\n\n");
+       }
+       else if (df-1 < (int) (sizeof(chisquarecrit10) / sizeof(double))
+                && chisq > chisquarecrit10[df - 2])
+         printf("??? p < 0.10\n\n");
+       else if (!(df - 1 < (int) (sizeof(chisquarecrit05) / sizeof(double))))
+         printf("df out of range...\n\n");
+       else
+         printf("NS\n\n");
+       
+       pre = winning_moves[k].pre;
+#if 0
+       pre = situation_table[winning_moves[k].index].pre.values[0];
+#endif
+       first_in_set = k;
+       chisq = 0.0;
+       df = 0;
+      }
+      /* increment totals */
+      chisq += dchisq;
+      df++;
+      
+      if (winning_moves[k].index == -1) {
+       printf("# Unpopular moves\n");
+       printf("# pre: 0x%08x\n", winning_moves[k].pre);
+       printf("# post: could be various\n");
+       printf("# frequency: %d/%d\n", 
+              winning_moves[k].move_frequency,
+              winning_moves[k].position_frequency);
+       printf("# unique players: %d\n", winning_moves[k].n_player);
+       printf("# wins: %d/%d\n\n", 
+              winning_moves[k].move_success,
+              winning_moves[k].position_success);
+       printf("# success: %.1f%% vs %.1f%% for this position overall, dchisq = %g\n\n", 
+              100.0 * winning_moves[k].move_success / winning_moves[k].move_frequency,
+              100.0 * winning_moves[k].position_success / winning_moves[k].position_frequency,
+              dchisq);
+      }
+      else {
+       printf("Pattern F-H%d-%d\n", handicap_value, l);
+       printf("# pre : 0x%08x\n",
+              situation_table[winning_moves[k].index].pre.values[0]);
+       printf("# post: 0x%08x\n",
+              situation_table[winning_moves[k].index].post.values[0]);
+       printf("# frequency: %d/%d\n", winning_moves[k].move_frequency,
+              winning_moves[k].position_frequency);
+       printf("# unique players: %d\n", winning_moves[k].n_player);
+       printf("# wins: %d/%d\n\n", winning_moves[k].move_success,
+              winning_moves[k].position_success);
+       printf("# success: %.1f%% vs %.1f%% for this position overall, dchisq = %g\n\n", 
+              100.0 * winning_moves[k].move_success / winning_moves[k].move_frequency,
+              100.0 * winning_moves[k].position_success / winning_moves[k].position_frequency,
+              dchisq);
+       
+       printf("+");
+       for (n = 0; n < board_size; n++)
+         printf("-");
+
+       printf("+\n");
+       for (m = 0; m < board_size; m++) {
+         printf("|");
+         for (n = 0; n < board_size; n++) {
+           if (winning_moves[k].pattern[m][n] == '\0') {
+             fprintf(stderr, "Something wrong in print pattern\n");
+             printf(".");
+           }
+           else
+             printf("%c", winning_moves[k].pattern[m][n]);
+         }
+         printf("|\n");
+       }
+       
+       printf("+");
+       for (n = 0; n < board_size; n++)
+         printf("-");
+       printf("+");
+       
+       printf("\n\n:8,-,value(%d)\n\n\n", winning_moves[k].n_player);
+       l++;
+      }
+    }
+    else {
+      fprintf(stderr,
+             "Skipping pattern pre 0x%08x post 0x%08x, stats may be wrong...\n", 
+             situation_table[winning_moves[k].index].pre.values[0], 
+             situation_table[winning_moves[k].index].post.values[0]);
+    }
+  }
+}
+
+int
+main(int argc, char *argv[])
+{
+  int number_of_unused_games = 0;
+  int i = 0;
+  
+  /* Check number of arguments. */
+  if (argc < 10) {
+    fprintf(stderr, USAGE);
+    exit(EXIT_FAILURE);
+  }
+  
+  /* Check arguments. */
+  board_size = atoi(argv[2]);
+  if (board_size % 2 == 0) {
+    fprintf(stderr, "Fatal error, only odd boardsizes supported: %d.\n",
+           board_size);
+    exit(EXIT_FAILURE);
+  }
+  if (board_size < 9 || board_size > 19)
+    fprintf(stderr, "Warning: strange boardsize: %d.\n", board_size);
+  
+  moves_per_game = atoi(argv[3]);
+  if (moves_per_game < 1 || moves_per_game > 20)
+    fprintf(stderr, "Warning: strange number of moves per game: %d.\n",
+           moves_per_game);
+  
+  handicap_value = atoi(argv[4]);
+  if (handicap_value < 0 || handicap_value > 10)
+    fprintf(stderr, "Warning: unusual handicap value: %d.\n",
+           handicap_value);
+  
+  player_strength = atoi(argv[5]);
+  if (player_strength < 0 || player_strength > 30)
+    fprintf(stderr, "Warning: wrong lowest strength: %d.\n",
+           player_strength);
+  
+  half_board_patterns = atoi(argv[6]);
+  if (half_board_patterns != 0 && half_board_patterns != 1) {
+    fprintf(stderr,
+           "Warning: incorrect half_board_flag (0 or 1). Setting the value to 0.\n");
+    half_board_patterns = 0;
+  }
+
+  min_position_freq = atoi(argv[7]);
+  if (min_position_freq < 1) {
+    fprintf(stderr, "Warning: setting min_position_freq to 1\n");
+    min_position_freq = 1;
+  }
+
+  min_move_percent = atof(argv[8]);
+  if (min_move_percent < 0. || min_move_percent > 100.) {
+    fprintf(stderr, "Warning: strange min_move_percent %g, setting to 1%%\n", 
+           min_move_percent);
+    min_move_percent = 1.0;
+  }
+
+  min_move_freq = atoi(argv[9]);
+  if (min_move_freq < 0)
+    fprintf(stderr, "Warning: strange min_move_freq %d\n", min_move_freq);
+
+  /* Count the number of sgf files. */
+  number_of_games = read_sgf_filenames(argv[1], NULL);
+  
+  /* Allocate space for the list of unused files. */
+  unused_games = calloc(number_of_games, sizeof(*unused_games));
+  if (unused_games == NULL) {
+    fprintf(stderr, "Fatal error, failed to allocate memory.\n");
+    exit(EXIT_FAILURE);
+  }
+  
+  /* Allocate space for the list of sgf file names. */
+  sgf_names = calloc(number_of_games, sizeof(*sgf_names));
+  if (sgf_names == NULL) {
+    fprintf(stderr, "Fatal error, failed to allocate memory.\n");
+    exit(EXIT_FAILURE);
+  }
+  
+  /* Read the list of sgf files and store in memory. */
+  read_sgf_filenames(argv[1], sgf_names);
+  
+  /* Save memory by sorting out the games that can be used first */
+  if (argv[10] != NULL) {
+    fprintf(stderr, "Starting game sort\n");
+    sort_games();
+    fprintf(stderr, "Starting game writes\n");
+    write_sgf_filenames(argv[10], sgf_names);
+  }
+  else {
+    /* Build tables of random numbers for Zobrist hashing. */
+    init_zobrist_numbers();
+    
+    /* Play through the initial moves of all games and collect hash values
+     * for the encountered situations.
+     */
+    collect_situations();
+    fprintf(stderr, "collect OK.\n");
+    
+    /* Find the most common positions and moves, for which we want to
+     * generate patterns.
+     */
+    analyze_statistics();
+    fprintf(stderr, "analyze OK.\n");
+    
+    /* Generate patterns from the chosen positions and moves.
+     */
+    generate_patterns();
+    fprintf(stderr, "generate OK.\n");
+
+    printf("attribute_map value_only\n\n\n");
+    printf("# ");
+    for (i = 0; i < argc; i++)
+      printf("%s ", argv[i]);
+    printf("\n\n\n");
+
+    /* Write the patterns to stdout in patterns.db format.
+     */
+    print_patterns();
+    
+    /* Tell the user everything worked out fine */
+    fprintf(stderr, "The pattern database was produced with no errors.\n");
+
+    for (i = 0; i < number_of_games; i++)
+      if (unused_games[i])
+       number_of_unused_games++;
+
+    fprintf(stderr, "Out of %d games, %d were not used.\n", 
+           number_of_games, number_of_unused_games);
+  }
+  
+  return 0;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/eyes.db b/patterns/eyes.db
new file mode 100644 (file)
index 0000000..f996267
--- /dev/null
@@ -0,0 +1,6482 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#                                                               #
+#                  Eye Shape Database                           #
+#                                                               #
+#     . - ordinary eye space                                    #
+#     * - ordinary eye space and key point, attack/defense      #
+#     < - ordinary eye space and attack key point (shrinks)     #
+#     > - ordinary eye space and defense key point (expands)    #
+#     ! - marginal eye space                                    #
+#     @ - marginal eye space and key point, attack/defense      #
+#     $ - marginal eye space containing an opponent stone       #
+#     ( - marginal eye space and attack key point               #
+#     ) - marginal eye space and defense key point              #
+#     X - dead opponent stone                                   #
+#     x - . or X                                                #
+#                                                               #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+#
+# The patterns are sorted as follows within each size, with the primary
+# criterium first: 
+#
+# 1. Edge and corner specific patterns.
+# 2. Number of rows, lowest first.
+# 3. Number of marginal vertices.
+# 4. Number of possible eyes
+#
+# In addition to 2, there is also the requirement that all patterns
+# with the same topology come together. E.g. among the four vertices,
+# two rows patterns, those with topology
+#
+#  .
+# ...
+#
+# come together and those with topology
+#
+# ..
+# ..
+#
+# follows later.
+#
+# Similarly, in addition to 3, patterns with the same configuration of
+# marginal vertices are grouped together.
+#
+# To make best use of the "x" wildcard, it is occasionally
+# advantageous to have a specific exceptional pattern before a more
+# general one. In these cases criterium 4 above may be violated.
+#
+# #######
+#
+# The colon line below the pattern gives the eye value of the matched
+# eye shape. This consists of four digits, each of which is the number
+# of eyes obtained during the following conditions:
+#
+# 1. The attacker moves first and is allowed yet another move because
+#    the defender plays tenuki.
+# 2. The attacker moves first and the defender responds locally.
+# 3. The defender moves first and the attacker responds locally.
+# 4. The defender moves first and is allowed yet another move because
+#    the attacker plays tenuki.
+#
+# Notice that 1 does not necessarily mean that the attacker is
+# allowed two consecutive moves. This is explained with an example
+# later.
+#
+# Also, since two eyes suffice to live, all higher numbers also count
+# as two.
+#
+# The following 15 cases are of interest:
+#
+# 0000   0 eyes.
+# 0001   0 eyes, but the defender can threaten to make one eye.
+# 0002   0 eyes, but the defender can threaten to make two eyes.
+# 0011   1/2 eye, 1 eye if defender moves first, 0 eyes if attacker does.
+# 0012   3/4 eyes, 3/2 eyes if defender moves first, 0 eyes if attacker does.
+# 0022   1* eye, 2 eyes if defender moves first, 0 eyes if attacker does.
+# 0111   1 eye, attacker can threaten to destroy the eye.
+# 0112   1 eye, attacker can threaten to destroy the eye,
+#               defender can threaten to make another eye.
+# 0122   5/4 eyes, 2 eyes if defender moves first, 1/2 eye if attacker does.
+# 0222   2 eyes, attacker can threaten to destroy both.
+# 1111   1 eye.
+# 1112   1 eye, defender can threaten to make another eye.
+# 1122   3/2 eyes, 2 eyes if defender moves first, 1 eye if attacker does.
+# 1222   2 eyes, attacker can threaten to destroy one eye.
+# 2222   2 eyes.
+#
+# The 3/4, 5/4, and 1* eye values are the same as in Howard Landman's paper
+# Eyespace Values in Go. Attack and defense points are only marked in
+# the patterns when they have definite effects on the eye value,
+# i.e. pure threats are not marked.
+#
+#
+# Examples of all different cases can be found among the patterns in
+# this file. Some of them might be slightly counterintuitive, so we
+# explain one important case here. Consider
+# 
+# Pattern 6141
+# 
+#  X
+# XX.@x
+# 
+# :1122
+#
+# which e.g. matches in this position:
+#
+# .OOOXXX
+# OOXOXOO
+# OXXba.O
+# OOOOOOO
+#
+# Now it may look like X could take away both eyes by playing a
+# followed by b, giving 0122 as eye value. This is where the subtlety
+# of the definition of the first digit in the eye value comes into
+# play. It does not say that the attacker is allowed two consecutive
+# moves but only that he is allowed to play "another move". The
+# crucial property of this shape is that when X plays at a to destroy
+# (at least) one eye, O can answer at b, giving:
+#
+# .OOOXXX
+# OO.OXOO
+# O.cOX.O
+# OOOOOOO
+#
+# Now X has to continue at c in order to keep O at one eye. After this
+# O plays tenuki and X cannot destroy the remaining eye by another
+# move. Thus the eye value is indeed 1122.
+#
+#
+# As a final note, some of the eye values indicating a threat depend
+# on suicide to be allowed, e.g.
+#
+# Pattern 301
+# 
+# X.X
+# 
+# :1222
+#
+# We always assume suicide to be allowed in this database. It is easy
+# enough to sort out such moves at a higher level when suicide is
+# disallowed.
+
+
+###############################
+#          1 element          #
+###############################
+
+Pattern 101
+
+x
+
+:1111
+
+
+Pattern 102
+
+$
+
+:0000
+
+
+Pattern 103
+
+!
+
+:0000
+
+
+###############################
+#          2 elements         #
+###############################
+
+Pattern 201
+
+xx
+
+:1111
+
+
+Pattern 202
+
+@x
+
+:0011
+
+
+Pattern 203
+
+$.
+
+:0000
+
+
+###############################
+#          3 elements         #
+###############################
+
+Pattern 301
+# Must be matched before 302.
+
+X.X
+
+:1222
+
+
+Pattern 302
+
+x*x
+
+:1122
+
+
+Pattern 303
+
+xXx
+
+:1111
+
+
+Pattern 304
+
+!.x
+
+:0111
+
+
+Pattern 305
+
+@Xx
+
+:0011
+
+
+Pattern 306
+# A chimera.
+
+x@x
+
+:0022
+
+
+Pattern 307
+
+$*.
+
+:0011
+
+
+Pattern 308
+
+$.X
+
+:1111
+
+
+Pattern 309
+
+$X.
+
+:0001
+
+
+Pattern 310
+
+!x!
+
+:0001
+
+
+###############################
+#          4 elements         #
+###############################
+
+# Special cases in corners and on edges. These must be matched before
+# the same shape is matched in the center.
+
+Pattern 401
+# Bent four in the corner. The attack depends on a ko and sufficiently
+# few outer liberties.
+
+|.
+|.*.
++---
+
+:1122
+
+
+Pattern 402
+#tm new pattern (3.1.14)
+#see trevor:1001
+
+@
+..!
+---
+
+:0011
+
+
+#
+# Topology: ....
+#
+
+
+Pattern 410
+# The XXXX pattern is a special case. It can only come up when dealing
+# with false marginals. In that case it is equivalent
+# to .... which yields 2 eyes.
+
+XxxX
+
+:2222
+
+
+Pattern 411
+
+x...
+
+:1222
+
+
+Pattern 412
+
+x*Xx
+
+:1122
+
+
+Pattern 413
+
+XXX.
+
+:1112
+
+
+Pattern 414
+
+.XX.
+
+:1111
+
+
+Pattern 416
+
+@X.X
+
+:0122
+
+
+Pattern 417
+
+x@.x
+
+:0122
+
+
+Pattern 418
+
+x@Xx
+
+:0022
+
+
+Pattern 419
+
+!.Xx
+
+:0111
+
+
+Pattern 420
+
+!..x
+
+:1112
+
+
+Pattern 421
+
+!X..
+
+:0112
+
+
+Pattern 422
+
+@XXX
+
+:0012
+
+
+Pattern 423
+
+@XX.
+
+:0011
+
+
+Pattern 424
+
+@..@
+
+:0011
+
+
+Pattern 425
+
+(.X@
+
+:0011
+
+
+Pattern 426
+
+!x@x
+
+:0012
+
+
+Pattern 427
+
+!XX!
+
+:0001
+
+
+Pattern 428
+
+!.x$
+
+:0001
+
+
+Pattern 429
+
+@X.$
+
+:0011
+
+
+Pattern 430
+
+.XX$
+
+:1111
+
+
+Pattern 431
+
+$.X$
+
+:0001
+
+
+Pattern 432
+
+$xx$
+
+:0000
+
+
+#            .
+# Topology: ...
+#
+
+Pattern 441
+# Match before 442
+
+ X
+X.X
+
+:1222
+
+
+Pattern 442
+
+ x
+x*x
+
+:1122
+
+
+Pattern 443
+
+ .
+XXX
+
+:1112
+
+
+Pattern 444
+
+ x
+xXx
+
+:1111
+
+
+Pattern 445
+
+ !
+X*X
+
+:1122
+
+
+Pattern 446
+
+ !
+x*x
+
+:0122
+
+
+Pattern 447
+
+ x
+x@x
+
+:0022
+
+
+Pattern 448
+
+ )
+)*x
+
+:0011
+
+
+Pattern 449
+
+ X
+@XX
+
+:0012
+
+
+Pattern 450
+
+ x
+@Xx
+
+:0011
+
+
+Pattern 451
+
+ x
+!X!
+
+:0001
+
+
+#           ..
+# Topology: ..
+#
+
+Pattern 461
+
+*X
+X.
+
+:1122
+
+
+Pattern 462
+
+..
+x.
+
+:1112
+
+
+Pattern 463
+
+XX
+X.
+
+:1112
+
+
+Pattern 464
+
+xx
+xx
+
+:1111
+
+
+Pattern 465
+# Must be matched before 466.
+
+@X
+X.
+
+:0022
+
+
+Pattern 466
+
+@x
+x.
+
+:0012
+
+
+Pattern 467
+
+@X
+XX
+
+:0012
+
+
+Pattern 468
+
+@x
+xX
+
+:0011
+
+
+Pattern 469
+
+!@
+.x
+
+:0011
+
+#
+# Completely dead patterns.
+#
+
+Pattern 491
+
+!!
+XX
+
+:0001
+
+
+Pattern 492
+
+!x
+x!
+
+:0002
+
+
+Pattern 493
+
+ !
+!x!
+
+:0000
+
+
+###############################
+#          5 elements         #
+###############################
+
+
+#
+# 5 vertices.  Now it is getting tricky...  
+# At least we will get all the linear patterns correct.
+#
+
+# Special cases in corners and on edges. These must be matched before
+# the same shape is matched in the center.
+#
+# Special care must be taken to get these patterns in the right order.
+# In particular the bent four in the corner patterns must be matched
+# before the patterns of topology
+#
+# |...
+# |. .
+# +---
+
+Pattern 5001
+# Bent four in the corner.
+
+|.
+|X
+|.X.
++---
+
+:1112
+
+
+Pattern 5002
+# Bent four in the corner.
+
+|.
+|X
+|XX.
++---
+
+:1111
+
+
+Pattern 5003
+# Bent four in the corner.
+
+|.
+|XXX.
++---
+
+:1111
+
+
+Pattern 5004
+# Bent four in the corner.
+#
+# This one is tricky. Black has two certain eyes if there are at least
+# two outside liberties, but at most one if they are fewer.
+# It seems likely that calling this only one eye leads to the fewest
+# errors in the surrounding code. (Unfortunately we have no provisions
+# to check the number of liberties at this point.)
+
+|.
+|X
+|.XX
++---
+
+:1111
+
+
+Pattern 5005
+# Bent four in the corner.
+#
+# This pattern is similar to the previous one. Black has two certain eyes
+# if there are at least two outside liberties, but needs to fight a ko
+# if there is only one.
+
+|.
+|X
+|XXX
++---
+
+:1111
+
+
+Pattern 5006
+# Bent four in the corner.
+#
+# This pattern behaves identically to the previous one.
+
+|X
+|XXX.
++---
+
+:1111
+
+
+Pattern 5007
+# Bent four in the corner. The attack depends on ko and sufficiently
+# few outer liberties if the corner vertex is empty.
+
+|.
+|xX*.
++---
+
+:1122
+
+
+Pattern 5008
+# Bent four in the corner. The attack depends on ko and sufficiently
+# few outer liberties if the corner vertex is empty.
+
+|.
+|x*X.
++---
+
+:1122
+
+
+Pattern 5009
+# Bent four in the corner. An O move in the corner may or may not give
+# another eye (depending on ko and/or outer liberties). An X move in
+# the corner definitely settles the number of eyes to 1.
+
+|.
+|.XX.
++---
+
+:1111
+
+
+Pattern 5010
+# Bent four in the corner.
+
+|.
+|*
+|xX.
++---
+
+:1122
+
+
+Pattern 5011
+# Bent four shape that X must fight. Ko if at most one outer liberty.
+
+|X
+|XX*.
++---
+
+:1122
+
+
+Pattern 5012
+
+xxxxx
+-----
+
+:2222
+
+
+Pattern 5021
+
+|XX*
+|. .
++---
+
+:1122
+
+
+Pattern 5022
+
+|X*X
+|. .
++---
+
+:1122
+
+
+Pattern 5023
+
+|*XX
+|. .
++---
+
+:1122
+
+
+Pattern 5024
+
+|.X>
+|< X
++---
+
+:1122
+
+
+Pattern 5025
+
+|XXX
+|. .
++---
+
+:1111
+
+
+Pattern 5031
+
+|.X
+| X*.
++----
+
+:1122
+
+
+Pattern 5032
+
+|.X
+| *X.
++----
+
+:1122
+
+
+Pattern 5033
+
+|.*
+| XX.
++----
+
+:1122
+
+
+Pattern 5034
+
+|.X
+| XX.
++----
+
+:1111
+
+
+#
+# Topology: .....
+#
+
+#
+# Linear, no marginal vertices.
+#
+
+Pattern 5101
+# Usually at least seki.
+#
+# There are rare exceptions where this is only
+# one eye. See strategy test 38 for an example
+# where .XXX. gives only one eye since one of
+# the . is not a liberty of the dragon.
+
+xxxxx
+
+:2222
+
+#
+# Linear, one marginal vertex.
+#
+
+
+Pattern 5111
+
+@X.<.
+
+:1122
+
+  
+Pattern 5112
+
+@..<x
+
+:1122
+
+  
+Pattern 5113
+
+@x..x
+
+:1122
+
+  
+Pattern 5114
+
+!.X*x
+
+:1122
+
+
+Pattern 5115
+
+@XXXX
+
+:0022
+
+
+Pattern 5116
+
+@XXX.
+
+:0011
+
+
+Pattern 5117
+
+@X.XX
+
+:0122
+
+
+Pattern 5118
+
+!X.X.
+
+:0112
+
+
+Pattern 5119
+
+@XX.X
+
+:0122
+
+
+Pattern 5120
+
+!XX..
+
+:0112
+
+
+Pattern 5121
+
+!..Xx
+
+:1112
+
+
+Pattern 5122
+
+!.XXX
+
+:1112
+
+
+Pattern 5123
+
+!.XX.
+
+:0111
+
+
+Pattern 5131
+
+x@.Xx
+
+:0122
+
+
+Pattern 5132
+
+x@..x
+
+:1122
+
+
+Pattern 5133
+
+x@X.x
+
+:0122
+
+
+Pattern 5134
+
+x@XXx
+
+:0022
+
+
+Pattern 5141
+
+x.@.x
+
+:1122
+
+
+Pattern 5142
+
+x.@Xx
+
+:0122
+
+
+Pattern 5143
+
+xX@Xx
+
+:0022
+
+
+#
+# Linear, two marginal vertices.
+#
+
+Pattern 5151
+
+!.x.!
+
+:0111
+
+
+Pattern 5152
+
+!.>X@
+
+:0011
+
+
+Pattern 5153
+
+@X.X@
+
+:0011
+
+
+Pattern 5154
+
+!XXX!
+
+:0001
+
+
+Pattern 5155
+
+@Xxx!
+
+:0011
+
+
+Pattern 5156
+
+!x!.x
+
+:0112
+
+
+Pattern 5157
+
+!x@Xx
+
+:0012
+
+
+Pattern 5158
+# Must be matched before 5159.
+
+!.x@x
+
+:0022
+
+
+Pattern 5159
+
+!x.@x
+
+:0012
+
+
+Pattern 5160
+
+!XX@x
+
+:0012
+
+
+Pattern 5161
+
+x!x!x
+
+:0112
+
+
+#
+# Linear, three marginal vertices.
+#
+
+Pattern 5171
+
+!x@x!
+
+:0011
+
+
+Pattern 5181
+
+xx.x$
+
+:1111
+
+
+Pattern 5182
+
+x*XX$
+
+:1122
+
+
+#            .
+# Topology: ....
+#
+
+Pattern 5201
+
+ x
+x..X
+
+:2222
+
+
+Pattern 5202
+
+ x
+x...
+
+:1222
+
+
+Pattern 5203
+
+ x
+xXXX
+
+:2222
+
+
+Pattern 5204
+
+ X
+XXX.
+
+:1112
+
+
+Pattern 5205
+
+ x
+xXX.
+
+:1111
+
+
+Pattern 5211
+
+ x
+xX*.
+
+:1122
+
+
+Pattern 5212
+
+ x
+x*X.
+
+:1122
+
+
+Pattern 5213
+# Must be matched before 5214.
+
+ X
+!..X
+
+:1222
+
+
+Pattern 5214
+
+ x
+)*.x
+
+:1122
+
+
+Pattern 5215
+# Must be matched before 5216.
+
+ X
+!.XX
+
+:0222
+
+
+Pattern 5216
+
+ x
+!*Xx
+
+:0122
+
+
+Pattern 5217
+
+ X
+@X.X
+
+:0122
+
+
+Pattern 5218
+
+ x
+!X.x
+
+:0112
+
+
+Pattern 5219
+
+ X
+@XXX
+
+:0022
+
+
+Pattern 5220
+
+ x
+@XXx
+
+:0011
+
+
+Pattern 5221
+
+ x
+x@.x
+
+:0122
+
+
+Pattern 5222
+
+ x
+x@Xx
+
+:0022
+
+
+Pattern 5223
+
+ x
+x.!x
+
+:0222
+
+
+Pattern 5224
+
+ x
+xX@x
+
+:0022
+
+
+Pattern 5225
+
+ X
+XX.!
+
+:1112
+
+
+Pattern 5226
+
+ x
+xX.!
+
+:0111
+
+
+Pattern 5227
+
+ X
+XXX@
+
+:0012
+
+
+Pattern 5228
+
+ x
+xXX@
+
+:0011
+
+
+Pattern 5231
+
+ ! 
+!..x
+
+:0111
+
+
+Pattern 5232
+
+ !
+!*Xx
+
+:0011
+
+
+Pattern 5233
+
+ )
+)X<X
+
+:0011
+
+
+Pattern 5234
+
+ )
+)X<.
+
+:0011
+
+
+Pattern 5235
+
+ !
+!XXx
+
+:0001
+
+
+Pattern 5236
+
+ x
+!..!
+
+:0112
+
+
+Pattern 5237
+
+ x
+@X.(
+
+:0011
+
+
+Pattern 5238
+
+ x
+!*X!
+
+:0012
+
+
+Pattern 5239
+
+ x
+!XX!
+
+:0001
+
+
+Pattern 5240
+
+ x
+!.@x
+
+:0122
+
+
+Pattern 5241
+
+ x
+!X@x
+
+:0012
+
+
+Pattern 5242
+
+ x
+x*.!
+
+:1122
+
+
+Pattern 5243
+
+ X
+X*X!
+
+:1122
+
+
+Pattern 5244
+
+ x
+x*X!
+
+:0122
+
+
+Pattern 5245
+
+ x
+x@x!
+
+:0022
+
+
+Pattern 5251
+
+ !
+!x@x
+
+:0011
+
+
+Pattern 5252
+
+ !
+!.x!
+
+:0001
+
+
+Pattern 5253
+
+ !
+!X.!
+
+:0001
+
+
+#           ..
+# Topology: ...
+#
+
+Pattern 5301
+
+X.
+XXX
+
+:1222
+
+
+Pattern 5302
+
+XX
+X.X
+
+:1222
+
+
+Pattern 5303
+
+Xx
+xxX
+
+:2222
+
+
+Pattern 5304
+
+xx
+x*x
+
+:1122
+
+
+Pattern 5305
+
+x.
+.Xx
+
+:1112
+
+
+Pattern 5306
+
+.X
+XXX
+
+:1112
+
+
+Pattern 5307
+
+xx
+xXx
+
+:1111
+
+
+Pattern 5311
+
+..
+@.x
+
+:1122
+
+
+Pattern 5312
+
+X.
+@.x
+
+:0122
+
+
+Pattern 5313
+
+Xx
+@XX
+
+:0022
+
+
+Pattern 5314
+
+x.
+@Xx
+
+:0012
+
+
+Pattern 5315
+
+xX
+@Xx
+
+:0011
+
+
+Pattern 5316
+
+.X
+!*x
+
+:0122
+
+
+Pattern 5317
+
+XX
+@.X
+
+:0122
+
+
+Pattern 5318
+
+xX
+!.x
+
+:0112
+
+
+Pattern 5321
+
+xx
+x@x
+
+:0022
+
+
+Pattern 5331
+
+.X 
+X*!
+:0122
+
+
+Pattern 5332
+
+.x 
+x.!
+:0112
+
+
+Pattern 5333
+
+XX 
+X.!
+:0112
+
+
+Pattern 5334
+
+Xx 
+x.!
+:0111
+
+
+Pattern 5335
+
+X. 
+.X@
+:0012
+
+
+Pattern 5336
+
+xx 
+xX@
+:0011
+
+
+Pattern 5341
+
+@X 
+XXX
+:0012
+
+
+Pattern 5342
+
+@x 
+xXx
+:0011
+
+
+Pattern 5343
+
+@X 
+X.X
+:0122
+
+
+Pattern 5344
+
+!x 
+x.x
+:0112
+
+
+Pattern 5351
+
+!.
+!.x
+
+:0112
+
+
+Pattern 5352
+
+..
+!@.
+
+:0022
+
+
+Pattern 5353
+
+xx
+@.!
+
+:0011
+
+
+Pattern 5354
+
+X.
+@X(
+
+:0011
+
+
+Pattern 5355
+
+..
+@X(
+
+:0011
+
+
+Pattern 5356
+
+xx
+!X!
+
+:0001
+
+
+Pattern 5357
+
+@X
+X.(
+
+:0012
+
+
+Pattern 5358
+
+@x
+x.(
+
+:0011
+
+
+Pattern 5359
+
+!x
+xX!
+
+:0001
+
+
+Pattern 5360
+
+!x
+x@x
+
+:0012
+
+
+Pattern 5361
+
+x)
+)<x
+
+:0011
+
+
+Pattern 5362
+
+x!
+!Xx
+
+:0002
+
+
+Pattern 5371
+
+!X
+!X!
+
+:0000
+
+
+Pattern 5372
+
+!x
+!x!
+
+:0001
+
+
+Pattern 5373
+
+x!
+!x!
+
+:0001
+
+
+#            .
+# Topology: ...
+#            .
+
+Pattern 5401
+# This pattern must be matched before 5402. The vital point would be
+# suicide for X.
+
+ X
+X.X
+ X
+
+:1222
+
+
+Pattern 5402
+
+ x
+x*x
+ x
+
+:1122
+
+
+Pattern 5403
+
+ X
+XXX
+ .
+
+:1112
+
+
+Pattern 5404
+
+ x
+xXx
+ x
+
+:1111
+
+
+Pattern 5411
+
+ !
+X*X
+ X
+
+:1122
+
+
+Pattern 5412
+
+ !
+x*x
+ x
+
+:0122
+
+
+Pattern 5413
+
+ @
+XXX
+ X
+
+:0012
+
+
+Pattern 5414
+
+ @
+xXx
+ x
+
+:0011
+
+
+Pattern 5421
+
+ x 
+x*!
+ ! 
+
+:0022
+
+
+Pattern 5422
+
+ x 
+xX!
+ ! 
+
+:0001
+
+
+Pattern 5431
+
+ !
+x*!
+ ! 
+
+:0011
+
+
+###############################
+#          6 elements         #
+###############################
+
+#
+# Topology: ......
+#
+
+Pattern 6000
+# Bent four in the corner.
+
+|.
+|*
+|...!
++---
+
+:1122
+
+
+Pattern 6001
+# Bent four in the corner.
+
+|.
+|*X..!
++---
+
+:1122
+
+
+Pattern 6002
+# Bent four in the corner.
+
+ !
+|.
+|.XX.
++---
+
+:1111
+
+
+Pattern 6003
+# Bent four in the corner.
+
+ !
+|.
+|X
+|.*.
++---
+
+:1122
+
+
+Pattern 6004
+# Special corner shape
+
+|*X.
+|. .)
++----
+
+:1122
+
+
+Pattern 6005
+
+$X>.*x
+
+:1122
+
+
+Pattern 6006
+
+$X..Xx
+
+:1112
+
+
+Pattern 6011
+
+xxxxxx
+
+:2222
+
+
+Pattern 6021
+
+!.x..x
+
+:1222
+
+
+Pattern 6022
+
+@..xXx
+
+:1122
+
+
+Pattern 6023
+
+@.XX>.
+
+:1122
+
+
+Pattern 6024
+
+!..X.x
+
+:1222
+
+
+Pattern 6026
+
+!.XXXX
+
+:0222
+
+
+Pattern 6028
+
+!.XxxX
+
+:1222
+
+
+Pattern 6029
+
+@.X.X.
+
+:1122
+
+
+Pattern 6030
+
+@.XXX.
+
+:0122
+
+
+Pattern 6031
+
+@X.XXX
+
+:1122
+
+
+Pattern 6032
+
+!X.X.X
+
+:1222
+
+
+Pattern 6033
+
+@X.XX.
+
+:0122
+
+
+Pattern 6034
+
+@X.xxx
+
+:1122
+
+
+Pattern 6035
+
+@XX.Xx
+
+:0122
+
+
+Pattern 6036
+
+@Xx.xx
+
+:1122
+
+
+Pattern 6037
+
+@XXX.x
+
+:0122
+
+
+Pattern 6038
+
+@XXXXx
+
+:0022
+
+
+Pattern 6041
+
+x!.X.X
+
+:1222
+
+
+Pattern 6042
+
+x@.XX.
+
+:0122
+
+
+Pattern 6043
+
+x@.XXX
+
+:1122
+
+
+Pattern 6044
+
+x@.xxx
+
+:1122
+
+
+Pattern 6045
+
+x@X.Xx
+
+:0122
+
+
+Pattern 6046
+
+x@X..x
+
+:1122
+
+
+Pattern 6047
+
+x@XX.x
+
+:0122
+
+
+Pattern 6048
+
+x@XXXx
+
+:0022
+
+
+Pattern 6051
+
+x.!..x
+
+:1222
+
+
+Pattern 6052
+
+x.@.Xx
+
+:1122
+
+
+Pattern 6053
+
+x.@XXx
+
+:0122
+
+
+Pattern 6054
+
+x.@X.x
+
+:1122
+
+
+Pattern 6055
+
+xX@.Xx
+
+:0122
+
+
+Pattern 6056
+
+xX@..x
+
+:1122
+
+
+Pattern 6057
+
+xX@X.x
+
+:0122
+
+
+Pattern 6058
+
+xX@XXx
+
+:0022
+
+
+Pattern 6061
+
+!x@..x
+
+:1122
+
+
+Pattern 6062
+
+!x@X.x
+
+:0122
+
+
+Pattern 6063
+
+!x!.Xx
+
+:0112
+
+
+Pattern 6064
+
+!x@XXX
+
+:0022
+
+
+Pattern 6065
+
+!x@XX.
+
+:0012
+
+
+Pattern 6066
+
+!.x@.x
+
+:0122
+
+
+Pattern 6067
+
+!Xx!.x
+
+:0112
+
+
+Pattern 6068
+
+!Xx@Xx
+
+:0012
+
+
+Pattern 6069
+
+!.x@Xx
+
+:0022
+
+
+Pattern 6070
+
+!XX.@x
+
+:0012
+
+
+Pattern 6071
+
+!xx.@x
+
+:0122
+
+
+Pattern 6072
+
+!XXX@x
+
+:0012
+
+
+Pattern 6073
+
+!xxX@x
+
+:0022
+
+
+Pattern 6074
+
+!....!
+
+:1112
+
+
+Pattern 6075
+
+!.X.x!
+
+:0112
+
+
+Pattern 6076
+
+!.XX.!
+
+:0111
+
+
+Pattern 6077
+
+!x..X!
+
+:0112
+
+
+Pattern 6078
+
+@XX>X!
+
+:0011
+
+
+Pattern 6079
+
+@XXx.!
+
+:0011
+
+
+Pattern 6080
+
+!XXXX!
+
+:0002
+
+
+Pattern 6082
+
+x@x!.x
+
+:1122
+
+
+Pattern 6083
+
+x!x!Xx
+
+:0112
+
+
+Pattern 6084
+
+x@..@x
+
+:1122
+
+
+Pattern 6085
+
+x@X.!x
+
+:0122
+
+
+Pattern 6086
+
+x!XX!x
+
+:0112
+
+
+Pattern 6087
+
+x@x!x!
+
+:0012
+
+
+Pattern 6091
+
+!....$
+
+:0111
+
+
+Pattern 6092
+
+@Xx..$
+
+:0011
+
+
+#            .
+# Topology: .....
+#
+
+Pattern 6101
+
+ X
+X..x!
+
+:1222
+
+
+Pattern 6102
+
+ x
+x*x.!
+
+:1122
+
+
+Pattern 6103
+
+ X
+XX*.(
+
+:1122
+
+
+Pattern 6104
+
+ X
+XX>X@
+
+:1122
+
+
+Pattern 6105
+
+ x
+xX..!
+
+:1112
+
+
+Pattern 6106
+
+ X
+XXX.!
+
+:1112
+
+
+Pattern 6107
+
+ x
+xXX.!
+
+:0111
+
+
+Pattern 6108
+
+ x
+xX.X@
+
+:0122
+
+
+Pattern 6109
+
+ x
+xXXX@
+
+:0022
+
+
+Pattern 6111
+
+ x
+x@..x
+
+:1122
+
+
+Pattern 6112
+
+ x
+x@XXx
+
+:0022
+
+
+Pattern 6113
+
+ x
+x@xxx
+
+:0122
+
+
+Pattern 6121
+
+ x
+@X..x
+
+:1122
+
+
+Pattern 6122
+
+ x
+@XXXx
+
+:0022
+
+
+Pattern 6123
+
+ x
+@Xxxx
+
+:0122
+
+
+Pattern 6131
+
+ x
+xX@.x
+
+:0122
+
+
+Pattern 6132
+
+ x
+xX@Xx
+
+:0022
+
+
+Pattern 6141
+
+ X
+XX.@x
+
+:1122
+
+
+Pattern 6142
+
+ x
+xX.@x
+
+:0122
+
+
+Pattern 6143
+
+ x
+xXX@x
+
+:0022
+
+
+Pattern 6151
+
+ !
+x*x.!
+
+:0122
+
+
+Pattern 6152
+
+ !
+!..x@
+
+:0011
+
+
+#             .
+# Topology: .....
+#
+
+Pattern 6201
+
+  x
+.*X.!
+
+:1122
+
+
+Pattern 6202
+
+  .
+X>X.@
+
+:1122
+
+
+Pattern 6203
+
+  x
+.X*.!
+
+:1122
+
+
+Pattern 6204
+
+  X
+XXX.!
+
+:0222
+
+
+Pattern 6205
+
+  .
+XXX.@
+
+:0122
+
+
+Pattern 6206
+
+  x
+.XX.!
+
+:0111
+
+
+Pattern 6207
+
+  x
+..*X)
+
+:1122
+
+
+Pattern 6208
+
+  x
+.X*X!
+
+:0122
+
+
+Pattern 6209
+
+  x
+..XX!
+
+:0112
+
+
+Pattern 6210
+
+  x
+.XXX@
+
+:0011
+
+
+Pattern 6211
+
+  x
+X.XX@
+
+:0122
+
+
+Pattern 6212
+
+  x
+XXXX@
+
+:0022
+
+
+Pattern 6221
+
+  x
+x.@.x
+
+:1122
+
+
+Pattern 6222
+
+  x
+x.@Xx
+
+:0122
+
+
+Pattern 6223
+
+  x
+xX@Xx
+
+:0022
+
+
+Pattern 6231
+
+  x
+x@X.x
+
+:0122
+
+
+Pattern 6232
+
+  x
+x@XXx
+
+:0022
+
+
+Pattern 6241
+
+  @
+x.X.x
+
+:1122
+
+
+Pattern 6242
+
+  @
+x.XXx
+
+:0122
+
+
+Pattern 6243
+
+  @
+xXXXx
+
+:0022
+
+
+Pattern 6251
+
+  x
+!.*.!
+
+:1122
+
+
+Pattern 6252
+
+  x
+!X*X!
+
+:0022
+
+
+Pattern 6253
+
+  x
+!.*X!
+
+:0122
+
+
+Pattern 6254
+
+  !
+X...!
+
+:1112
+
+
+Pattern 6255
+
+  !
+X.<X)
+
+:0122
+
+
+Pattern 6256
+
+  !
+...X!
+
+:0112
+
+
+Pattern 6261
+# tm New Pattern (3.1.22) (see owl:111)
+
+  )
+@.>.@
+
+:0011
+
+
+Pattern 6262
+# FIXME: I don't understand this pattern. Is it correct? -pp
+
+  !
+!x..!
+ ---
+
+:0000
+
+
+Pattern 6263
+# tm modified (3.1.22)
+
+  !
+@X*.!
+
+:0011
+
+
+#            ..
+# Topology: ....
+#
+
+Pattern 6301
+
+ .X
+!.*.
+----
+
+:0122
+
+
+Pattern 6302
+
+ xx
+XXXX
+
+:2222
+
+
+Pattern 6303
+
+ *x
+XXX.
+
+:1122
+
+
+Pattern 6304
+
+ XX
+XXX.
+
+:1112
+
+
+Pattern 6305
+
+ xx
+xXXx
+
+:1111
+
+
+Pattern 6306
+
+ xX
+X.XX
+
+:2222
+
+
+Pattern 6307
+
+ .X
+X.X.
+
+:1222
+
+
+Pattern 6308
+
+ XX
+X*X.
+
+:1122
+
+
+Pattern 6309
+
+ xX
+x*Xx
+
+:1122
+
+
+Pattern 6310
+
+ X.
+X*X.
+
+:1122
+
+
+Pattern 6311
+
+ x.
+.*X.
+
+:1122
+
+
+Pattern 6312
+
+ Xx
+!..X
+
+:1222
+
+
+Pattern 6313
+
+ xx
+!.*x
+
+:1122
+
+
+Pattern 6314
+
+ XX
+!*XX
+
+:1122
+
+
+Pattern 6315
+
+ X.
+!.XX
+
+:0222
+
+
+Pattern 6316
+
+ x.
+!.Xx
+
+:0112
+
+
+Pattern 6317
+
+ xX
+!.Xx
+
+:0111
+
+
+Pattern 6318
+
+ XX
+@X.X
+
+:0122
+
+
+Pattern 6319
+
+ .x
+!X*x
+
+:0122
+
+
+Pattern 6320
+
+ Xx
+@X.X
+
+:0122
+
+
+Pattern 6321
+
+ Xx
+!X..
+
+:0112
+
+
+Pattern 6322
+
+ X.
+@XXX
+
+:0022
+
+
+Pattern 6323
+
+ XX
+@XXX
+
+:0012
+
+
+Pattern 6324
+
+ xx
+@XXx
+
+:0011
+
+
+Pattern 6331
+
+ .x
+x@.x
+
+:1122
+
+
+Pattern 6332
+
+ Xx
+x@.x
+
+:0122
+
+
+Pattern 6333
+
+ xx
+x@Xx
+
+:0022
+
+
+Pattern 6341
+
+ !x
+.*.x
+
+:1122
+
+
+Pattern 6342
+
+ !.
+.*Xx
+
+:0122
+
+
+Pattern 6343
+
+ (.
+X>Xx
+
+:1122
+
+
+Pattern 6344
+
+ @X
+x..x
+
+:1122
+
+
+Pattern 6345
+
+ @X
+X.Xx
+
+:0122
+
+
+Pattern 6346
+
+ !X
+..Xx
+
+:0112
+
+
+Pattern 6347
+
+ !x
+.X.x
+
+:0112
+
+
+Pattern 6348
+
+ @x
+XX.x
+
+:0122
+
+
+Pattern 6349
+
+ @x
+.XXx
+
+:0011
+
+
+Pattern 6350
+
+ @x
+XXXx
+
+:0022
+
+
+Pattern 6361
+
+ !!
+!.*.
+
+:0011
+
+
+Pattern 6362
+
+ .@
+!..!
+
+:0011
+
+
+#           ..
+# Topology: ....
+#
+
+Pattern 6400
+
+|.x
+|xX*.
++----
+
+:1122
+
+
+Pattern 6401
+
+|XX
+|<XX>
++----
+
+:1122
+
+
+Pattern 6402
+
+|.x
+|X.*.
++----
+
+:1122
+
+
+Pattern 6403
+
+|.X
+|x.*.
++----
+
+:1122
+
+
+Pattern 6404
+
+|.<
+|.>X.
++----
+
+:1122
+
+
+Pattern 6405
+# Not possible to do better than bent four in the corner.
+
+|..
+|.XX.
++----
+
+:1111
+
+
+Pattern 6406
+# Nothing to do.
+
+|.X
+|..X.
++----
+
+:1111
+
+
+Pattern 6407
+# Nothing to do.
+
+|.x
+|X.X.
++----
+
+:1111
+
+
+Pattern 6411
+
+xX
+X*X.
+
+:1122
+
+
+Pattern 6412
+
+.*
+XXX.
+
+:1122
+
+
+Pattern 6413
+
+..
+.XX.
+
+:1222
+
+
+Pattern 6414
+
+XX
+*XX>
+
+:1122
+
+
+Pattern 6416
+
+XX
+XXX.
+
+:1112
+
+
+Pattern 6417
+
+xX
+XXX.
+
+:1111
+
+
+Pattern 6418
+
+xX
+XX*.
+
+:1122
+
+
+Pattern 6421
+
+.x
+x*.!
+
+:1122
+
+
+Pattern 6422
+
+.x
+x*X!
+
+:0122
+
+
+Pattern 6423
+
+XX
+X*x!
+
+:1122
+
+
+Pattern 6424
+
+Xx
+x.X@
+
+:0122
+
+
+Pattern 6425
+
+XX
+XXX@
+
+:0012
+
+
+Pattern 6426
+
+Xx
+xXX@
+
+:0022
+
+
+Pattern 6427
+
+X.
+x..!
+
+:1112
+
+
+Pattern 6429
+
+X.
+.X.!
+
+:1112
+
+
+Pattern 6430
+
+..
+.X.!
+
+:0112
+
+
+Pattern 6431
+
+xx
+xX.!
+
+:0111
+
+
+Pattern 6432
+
+.x
+xXX@
+
+:0011
+
+
+Pattern 6433
+
+xx
+@..x
+
+:1122
+
+
+Pattern 6434
+
+.x
+@.Xx
+
+:1122
+
+
+Pattern 6435
+
+xx
+@.Xx
+
+:0122
+
+
+Pattern 6436
+
+xx
+@X.x
+
+:0122
+
+
+Pattern 6437
+
+xx
+@XXx
+
+:0022
+
+
+Pattern 6441
+
+@x
+x..x
+
+:1122
+
+
+Pattern 6442
+
+@x
+x.XX
+
+:0122
+
+
+Pattern 6443
+
+!x
+x.X.
+
+:0112
+
+
+Pattern 6444
+
+@.
+.X.X
+
+:0122
+
+
+Pattern 6445
+
+!.
+.X..
+
+:0112
+
+
+Pattern 6446
+
+!X
+xX..
+
+:0112
+
+
+Pattern 6447
+
+@X
+xX.X
+
+:0122
+
+
+Pattern 6448
+
+@X
+xXX.
+
+:0011
+
+
+Pattern 6449
+
+@x
+xXXX
+
+:0022
+
+
+Pattern 6450
+
+@x
+xXX.
+
+:0011
+
+
+Pattern 6461
+
+xx
+x@.x
+
+:0122
+
+
+Pattern 6462
+
+xx
+x@Xx
+
+:0022
+
+
+Pattern 6471
+
+XX
+X.@x
+
+:1122
+
+
+Pattern 6472
+
+.X
+X.!x
+
+:0222
+
+
+Pattern 6473
+
+.x
+x.@x
+
+:1122
+
+
+Pattern 6474
+
+xx
+x.@x
+
+:0122
+
+
+Pattern 6475
+
+xx
+xX@x
+
+:0022
+
+
+#           ...
+# Topology: ...
+#
+
+Pattern 6501
+
+>XX
+X<X
+---
+
+:1122
+
+
+Pattern 6502
+
+.*.
+..X
+---
+
+:1122
+
+
+Pattern 6503
+
+.x.
+X.X
+---
+
+:1111
+
+
+Pattern 6504
+
+.X.
+x.X
+---
+
+:1111
+
+
+Pattern 6511
+
+XX.
+..X
+
+:1222
+
+
+Pattern 6512
+
+XXX
+X.X
+
+:2222
+
+
+Pattern 6513
+
+xXx
+x*x
+
+:1122
+
+
+Pattern 6514
+# Need to mark both empty vertices. In the corner one of them may not
+# be a valid defense (suicide move).
+
+XX*
+*XX
+
+:1122
+
+
+Pattern 6515
+
+XXX
+XX.
+
+:1112
+
+
+Pattern 6516
+
+xXx
+xXx
+
+:1111
+
+
+Pattern 6521
+
+!.x
+..x
+
+:0112
+
+
+Pattern 6522
+
+@XX
+X.x
+
+:0022
+
+
+Pattern 6523
+
+@Xx
+x.x
+
+:0012
+
+
+Pattern 6524
+
+@XX
+XXX
+
+:0012
+
+
+Pattern 6525
+
+@XX
+XX.
+
+:0022
+
+
+Pattern 6526
+
+@Xx
+xXx
+
+:0011
+
+
+Pattern 6527
+
+@.X
+X..
+
+:0122
+
+
+Pattern 6528
+
+@.X
+X.X
+
+:0022
+
+
+Pattern 6529
+
+!..
+X.x
+
+:0112
+
+
+Pattern 6530
+
+!.x
+.X.
+
+:0112
+
+
+Pattern 6531
+
+@xX
+.XX
+
+:0011
+
+
+Pattern 6532
+
+@x.
+xXx
+
+:0011
+
+
+Pattern 6533
+
+@xX
+XXx
+
+:0022
+
+
+Pattern 6541
+
+.@.
+x.x
+
+:0122
+
+
+Pattern 6542
+
+x@x
+xXx
+
+:0022
+
+
+Pattern 6543
+
+x@x
+x.x
+
+:0022
+
+
+Pattern 6551
+
+!.x
+!.x
+
+:0111
+
+
+#            ...
+# Topology: ...
+#
+
+Pattern 6601
+
+ ...
+...
+
+:2222
+
+
+Pattern 6602
+
+ *Xx
+.XX
+
+:1122
+
+
+Pattern 6603
+
+ X*X
+.XX
+
+:1122
+
+
+Pattern 6604
+
+ X*.
+xXX
+
+:1122
+
+
+Pattern 6605
+
+ XX.
+.XX
+
+:1111
+
+
+Pattern 6606
+
+ XXX
+.XX
+
+:1112
+
+
+Pattern 6611
+
+ x*x
+!.x
+:1122
+
+
+Pattern 6612
+
+ XXX
+!.X
+
+:1112
+
+
+Pattern 6613
+
+ xXx
+!.x
+
+:0111
+
+
+Pattern 6614
+
+ x..
+!Xx
+
+:0112
+
+
+Pattern 6615
+
+ x.X
+@Xx
+
+:0122
+
+
+Pattern 6616
+
+ XXX
+@XX
+
+:0012
+
+
+Pattern 6617
+
+ xXX
+@Xx
+
+:0022
+
+
+Pattern 6618
+
+ xX.
+@Xx
+
+:0011
+
+
+Pattern 6621
+
+ x.x
+x@x
+:0122
+
+
+Pattern 6622
+
+ xXx
+x@x
+:0022
+
+
+Pattern 6631
+
+ x.x
+x.@
+:1122
+
+
+Pattern 6632
+
+ x.x
+xX@
+:0122
+
+
+Pattern 6633
+
+ xXx
+xX@
+:0022
+
+
+#            .
+# Topology: ....
+#            .
+
+Pattern 6701
+
+ x
+xX*.
+ x
+
+:1122
+
+
+Pattern 6702
+
+ x
+x*X.
+ x
+
+:1122
+
+
+Pattern 6703
+
+ X
+XXX.
+ X
+
+:1112
+
+
+Pattern 6704
+
+ x
+xXX.
+ x
+
+:1111
+
+
+Pattern 6711
+
+ x
+!*..
+ x
+
+:1122
+
+
+Pattern 6712
+
+ x
+!..X
+ x
+
+:1222
+
+
+Pattern 6713
+
+ x
+!.XX
+ x
+
+:0222
+
+
+Pattern 6714
+
+ x
+!*Xx
+ x
+
+:0122
+
+
+Pattern 6715
+
+ x
+@X.X
+ x
+
+:0122
+
+
+Pattern 6716
+
+ x
+!X..
+ x
+
+:0112
+
+
+Pattern 6717
+
+ x
+@XXX
+ x
+
+:0022
+
+
+Pattern 6718
+
+ x
+@XX.
+ x
+
+:0011
+
+
+Pattern 6721
+# Cannot exist.
+
+ x
+x.!x
+ x
+
+:0222
+
+
+Pattern 6722
+# Cannot exist.
+
+ x
+xX@x
+ x
+
+:0022
+
+
+Pattern 6731
+
+ x
+x*.!
+ x
+
+:1122
+
+
+Pattern 6732
+
+ X
+X*X!
+ X
+
+:1122
+
+
+Pattern 6733
+
+ x
+x*X!
+ x
+
+:0122
+
+
+Pattern 6734
+
+ X
+XX.!
+ X
+
+:1112
+
+
+Pattern 6735
+
+ x
+xX.!
+ x
+
+:0111
+
+
+Pattern 6736
+
+ X
+XXX@
+ X
+
+:0012
+
+
+Pattern 6737
+
+ x
+xXX@
+ x
+
+:0011
+
+
+#            .
+# Topology: ....
+#             .
+
+Pattern 6801
+
+ x
+xX.!
+  X
+
+:0222
+
+
+Pattern 6802
+
+ x
+xX*!
+  .
+
+:0122
+
+
+Pattern 6803
+
+ x
+x.X!
+  X
+
+:0222
+
+
+Pattern 6804
+
+ x
+x*X!
+  .
+
+:0122
+
+
+Pattern 6805
+
+ x
+xXX@
+  .
+
+:0011
+
+
+Pattern 6806
+
+ x
+xXX@
+  X
+
+:0022
+
+
+Pattern 6811
+# Cannot exist.
+
+ x
+x.!x
+  x
+
+:0222
+
+
+Pattern 6812
+# Cannot exist.
+
+ x
+xX@x
+  x
+
+:0022
+
+
+#           ..
+# Topology: ...
+#            .
+
+
+Pattern 6901
+# This pattern must be matched before 6902.
+
+XX
+X.X
+ X
+
+:1222
+
+
+Pattern 6902
+
+.x
+x*x
+ x
+
+:1122
+
+
+Pattern 6903
+
+XX
+X*x
+ x
+
+:1122
+
+
+Pattern 6904
+
+X.
+.XX
+ X
+
+:2222
+
+
+Pattern 6905
+
+X.
+.Xx
+ x
+
+:1222
+
+
+Pattern 6906
+
+XX
+.XX
+ X
+
+:1222
+
+
+Pattern 6907
+
+XX
+*Xx
+ x
+
+:1122
+
+
+Pattern 6908
+
+..
+.Xx
+ x
+
+:1112
+
+
+Pattern 6909
+
+XX
+XXX
+ .
+
+:1112
+
+
+Pattern 6910
+
+.X
+XXX
+ X
+
+:1112
+
+
+Pattern 6911
+
+xx
+xXx
+ x
+
+:1111
+
+
+Pattern 6912
+
+!.
+.*x
+ x
+
+:0122
+
+
+Pattern 6913
+
+!X
+X*X
+ X
+
+:1122
+
+
+Pattern 6914
+
+!x
+x*x
+ x
+
+:0122
+
+
+Pattern 6915
+
+@.
+.Xx
+ x
+
+:0011
+
+
+Pattern 6916
+
+@X
+XXX
+ X
+
+:0012
+
+
+Pattern 6917
+
+@x
+xXx
+ x
+
+:0011
+
+
+Pattern 6921
+
+.!
+.*x
+ x
+
+:1122
+
+
+Pattern 6922
+
+.!
+X*x
+ x
+
+:0122
+
+
+Pattern 6923
+
+.@
+.Xx
+ x
+
+:0012
+
+
+Pattern 6924
+
+.@
+XXx
+ x
+
+:0011
+
+
+Pattern 6925
+
+X@
+xXx
+ x
+
+:0022
+
+
+Pattern 6931
+
+.x
+x*!
+ x
+
+:0122
+
+
+Pattern 6932
+
+Xx
+x*!
+ .
+
+:0122
+
+
+Pattern 6933
+
+XX
+X*!
+ X
+
+:1122
+
+
+Pattern 6934
+
+Xx
+x.!
+ X
+
+:0222
+
+
+Pattern 6935
+
+.x
+xX@
+ x
+
+:0011
+
+
+Pattern 6936
+
+XX
+XX@
+ X
+
+:0012
+
+
+Pattern 6937
+
+Xx
+xX@
+ X
+
+:0022
+
+
+Pattern 6938
+
+Xx
+xX@
+ x
+
+:0011
+
+
+###############################
+#          7 elements         #
+###############################
+
+#            
+# Topology: .......
+#
+
+Pattern 70000
+# There is some ko potential here.
+
+|.
+|X
+|X
+|...@
++----
+
+:1122
+
+
+Pattern 70001
+# tm added (3.1.15)
+# Though pattern 7003 matches with a defense point at
+# the proper place, the code doesn't seem to provide
+# more than one defense point.
+|(
+|.
+|.
+|>..(
++----
+
+:1122
+
+
+Pattern 70002
+# Special corner shape.
+
+|X*.
+|. ..$
++-----
+
+:1122
+
+
+Pattern 70003
+# Special corner shape.
+
+|XX.
+|. ..$
++-----
+
+:1112
+
+
+Pattern 70010
+
+@..>X.(
+
+:1122
+
+
+Pattern 70011
+
+@..>..@
+
+:1122
+
+
+Pattern 70012
+
+(.x..X@
+
+:1122
+
+
+Pattern 70013
+
+@..X..@
+
+:1122
+
+
+Pattern 70014
+
+(.X*X.(
+
+:1122
+
+
+Pattern 70015
+
+@X.X.X@
+
+:0122
+
+
+Pattern 70016
+
+@X.X..!
+
+:0122
+
+
+Pattern 70017
+
+@XXXX.!
+
+:0022
+
+
+Pattern 70018
+
+@XxxX.(
+
+:0122
+
+
+Pattern 70019
+
+!Xx..x!
+
+:0112
+
+
+Pattern 70020
+
+!.XX..!
+
+:0112
+
+
+Pattern 70021
+
+!.XXX.!
+
+:0111
+
+
+Pattern 70022
+
+@XXX.x!
+
+:0012
+
+
+Pattern 70023
+
+@XX*XX@
+
+:0011
+
+
+Pattern 70024
+
+!XXXXX!
+
+:0002
+
+
+Pattern 70030
+# FIXME: This pattern looks like 1112 to me. "$...<." seems to be
+#       attackable at '<'. -pp
+
+$.....@
+
+:1122
+
+
+#            .
+# Topology: ......
+#
+
+Pattern 70500
+
+ x
+!<XXX)
+
+:0022
+
+
+Pattern 70501
+
+ X
+!..X.!
+
+:1222
+
+
+Pattern 70502
+
+ X
+!.XX.!
+
+:0222
+
+
+Pattern 70503
+
+ x
+!..XX@
+
+:0122
+
+
+Pattern 70504
+
+ .
+!*X.X)
+
+:0122
+
+
+Pattern 70505
+
+ .
+!*XX.!
+
+:0122
+
+
+Pattern 70506
+
+ x
+!*xxx!
+
+:1122
+
+
+Pattern 70507
+
+ )
+)*x..x
+
+:1122
+
+
+#             .
+# Topology: ......
+#
+
+Pattern 71000
+
+  . @|
+!...x|
+-----+
+
+:1122
+
+
+Pattern 71010
+
+  !
+!..X.X
+
+:1222
+
+
+Pattern 71011
+
+  !
+@.>XXX
+
+:1122
+
+
+Pattern 71012
+# Defending the other marginal vertex is sometimes incorrect,
+# see regression/games/owl27.sgf.
+
+  )
+(..x.x
+
+:1122
+
+
+Pattern 71013
+
+  (
+@...Xx
+
+:1122
+
+
+Pattern 71014
+
+  !
+)X<XXx
+
+:0022
+
+
+Pattern 71015
+
+  !
+)x<xXx
+
+:0122
+
+
+Pattern 71016
+
+  !
+@X*..x
+
+:1122
+
+
+Pattern 71017
+
+  !
+!X*X.x
+
+:0122
+
+
+Pattern 71020
+
+  x
+!X*XX!
+
+:0022
+
+
+Pattern 71021
+
+  X
+!.>xX(
+
+:1122
+
+
+Pattern 71022
+
+  .
+!.*XX!
+
+:0122
+
+
+Pattern 71023
+
+  .
+!X*.x!
+
+:0122
+
+
+Pattern 71024
+
+  x
+!X*X.!
+
+:0122
+
+
+Pattern 71025
+
+  x
+!x*xx!
+
+:1122
+
+
+Pattern 71030
+
+  )
+..>..@
+
+:1122
+
+
+Pattern 71040
+
+  !
+!..x.!
+
+:0112
+
+
+#            . .
+# Topology: .....
+#
+
+
+Pattern 71500
+
+ . !
+!...!
+
+:0112
+
+
+#            .
+# Topology: .....
+#            .
+
+Pattern 72000
+
+ x
+x*X.!
+ x 
+
+:1122
+
+
+Pattern 72001
+
+ x
+x..X!
+ x 
+
+:1222
+
+
+Pattern 72002
+
+ X
+X...!
+ X 
+
+:1222
+
+
+Pattern 72003
+
+ x
+x*..)
+ x 
+
+:1122
+
+
+#             .
+# Topology: .....
+#            .
+
+# Pattern 72500
+
+#             .
+# Topology: .....
+#             .
+
+
+# Pattern 73000
+
+#             .
+# Topology:   .
+#           .....
+
+Pattern 73500
+
+  @
+  .
+x...@
+
+:1122
+
+
+Pattern 73501
+
+  !
+  .
+.*X.!
+
+:1122
+
+
+#           ..
+# Topology: .....
+#
+
+Pattern 74000
+# Bent four in the corner
+
+|..
+|.*..!
++----
+
+:1122
+
+
+Pattern 74001
+
+XX
+X*x.!
+
+:1122
+
+
+Pattern 74002
+
+X.
+x.X.!
+
+:1222
+
+
+Pattern 74003
+
+Xx
+x>x.@
+
+:1122
+
+
+#            ..
+# Topology: .....
+#
+
+Pattern 74500
+
+|.
+|X
+|XX.
+|.X
++--
+
+:1111
+
+
+Pattern 74510
+
+ ..
+.X*.!
+
+:1122
+
+
+Pattern 74511
+
+ .x
+....!
+
+:1222
+
+
+Pattern 74512
+
+ xx
+.*x.!
+
+:1122
+
+
+Pattern 74513
+
+ Xx
+.X..!
+
+:1112
+
+
+Pattern 74514
+
+ Xx
+.XX.!
+
+:0111
+
+
+Pattern 74515
+
+ .x
+!...!
+
+:1112
+
+
+Pattern 74516
+
+ xX
+!.X.!
+
+:0111
+
+
+Pattern 74517
+
+ xx
+!.x.!
+
+:0112
+
+
+#             ...
+# Topology: ....
+#
+
+Pattern 75000
+
+|.
+|X
+|XX
+|.*.
++---
+
+:1122
+
+
+Pattern 75001
+
+|.
+|*
+|XX
+|.X.
++---
+
+:1122
+
+
+Pattern 75002
+
+|.
+|*
+|Xx
+|x.!
++---
+
+:1122
+
+
+Pattern 75003
+
+|.
+|X
+|XX
+|.X.
++---
+
+:1111
+
+
+Pattern 75004
+
+|.
+|*
+|X.
+|..!
++---
+
+:1122
+
+
+Pattern 75010
+
+  XX.
+!..X
+
+:1112
+
+
+Pattern 75011
+
+  XXX
+(.*X
+
+:1122
+
+
+Pattern 75012
+
+  xXx
+@..x
+
+:1122
+
+
+Pattern 75020
+
+  X.(
+(.*X
+
+:1122
+
+
+Pattern 75021
+
+  x.!
+!..x
+
+:0112
+
+
+Pattern 75022
+
+  x.!
+!.Xx
+
+:0111
+
+
+#           ..
+# Topology: ....
+#            .
+
+Pattern 75500
+
+xX
+XX*.
+ x
+
+:1122
+
+
+Pattern 75501
+# O here may give ko.
+
+xX
+X*X.
+ x
+
+:1122
+
+
+Pattern 75502
+# X here gives ko.
+
+.*
+X.X.
+ x
+
+:1122
+
+
+Pattern 75504
+# X here gives ko.
+
+.X
+X.*.
+ x
+
+:1122
+
+
+Pattern 75505
+
+xX
+*XX.
+ x
+
+:1122
+
+
+Pattern 75506
+
+XX
+XXX.
+ X
+
+:1112
+
+
+Pattern 75507
+
+xX
+XXX.
+ x
+
+:1111
+
+
+#            ..
+# Topology: ....
+#            .
+
+Pattern 76000
+
+ Xx
+x*X.
+ x
+
+:1122
+
+
+Pattern 76001
+
+ Xx
+xX*.
+ x
+
+:1122
+
+
+Pattern 76002
+
+ *x
+xXX.
+ x
+
+:1122
+
+
+Pattern 76003
+
+ XX
+XXX.
+ X
+
+:1112
+
+
+Pattern 76004
+
+ Xx
+xXX.
+ x
+
+:1111
+
+
+#            .
+# Topology: ...
+#            ...
+
+Pattern 76500
+
+ x
+x*X
+ XX.
+
+:1122
+
+
+Pattern 76501
+
+ x
+xXX
+ X*.
+
+:1122
+
+
+Pattern 76502
+
+ X
+XX*
+ XX>
+
+:1122
+
+
+Pattern 76503
+
+ x
+xX*
+ XX.
+
+:1122
+
+
+Pattern 76504
+
+ X
+XXX
+ XX.
+
+:1112
+
+
+Pattern 76505
+
+ x
+xXX
+ XX.
+
+:1111
+
+
+#            .
+# Topology:  ..
+#           ....
+
+Pattern 77000
+
+ x
+ XX
+.*.!
+
+:1122
+
+
+Pattern 77001
+
+ x
+ XX
+.X.!
+
+:0111
+
+
+Pattern 77010
+
+ !
+ .x
+!.*x
+
+:1122
+
+
+#             .
+# Topology: ....
+#           ..
+
+# Pattern 77500
+
+
+#           ..
+# Topology: ...
+#            ..
+
+Pattern 78000
+
+..
+XXX
+ X.
+
+:1111
+
+
+Pattern 78001
+
+.*
+*X*
+ X.
+
+:1122
+
+
+Pattern 78002
+
+..
+xXx
+ X.
+
+:1112
+
+
+Pattern 78003
+
+.X
+x.X
+ X.
+
+:1112
+
+
+Pattern 78004
+
+.X
+x*x
+ X.
+
+:1122
+
+
+Pattern 78005
+
+.x
+x*X
+ Xx
+
+:1122
+
+
+Pattern 78006
+
+.x
+xX*
+ Xx
+
+:1122
+
+
+Pattern 78010
+
+.X
+xXx
+ X.
+
+:1111
+
+
+Pattern 78011
+
+.X
+.XX
+ XX
+
+:1111
+
+
+Pattern 78012
+
+.x
+xXX
+ Xx
+
+:1112
+
+
+#           ...
+# Topology: ....
+#
+
+Pattern 78500
+
+---
+X.X
+.XX.
+
+:1111
+
+
+Pattern 78501
+
+---
+X.X
+.X*.
+
+:1122
+
+
+Pattern 78502
+
+----
+X.X.
+.Xx
+
+:1111
+
+
+Pattern 78503
+
+----
+X.X.
+xX.
+
+:1111
+
+
+Pattern 78504
+
+----
+X.*.
+.Xx
+
+:1122
+
+
+Pattern 78505
+
+----
+..*.
+.XX
+
+:1122
+
+
+Pattern 78506
+
+----
+X.*.
+xX.
+
+:1122
+
+
+Pattern 78507
+
+----
+*.X.
+.Xx
+
+:1122
+
+
+Pattern 78508
+
+----
+*.X.
+xX.
+
+:1122
+
+
+Pattern 78509
+
+----
+X.X.
+.*x
+
+:1122
+
+
+Pattern 78510
+
+----
+X.X.
+x*.
+
+:1122
+
+
+Pattern 78511
+
+----
+..*.
+.XX
+
+:1122
+
+
+Pattern 78520
+
+|.
+|Xx
+|XX
+|.X
++--
+
+:1111
+
+
+Pattern 78521
+
+|xx
+|XX
+|.X.
++---
+
+:1111
+
+
+Pattern 78522
+
+|X
+|XX.
+|.X.
++---
+
+:1111
+
+
+Pattern 78523
+
+|.
+|XX
+|*X
+|.X
++--
+
+:1122
+
+
+Pattern 78524
+
+  .
+|XX
+|*X
+|.X
++--
+
+:1122
+
+
+Pattern 78525
+
+  
+|XX
+|*X
+|.X.
++---
+
+:1122
+
+
+Pattern 78526
+
+|xx
+|XX
+|.*.
++---
+
+:1122
+
+
+Pattern 78527
+
+  .
+|XX
+|XX
+|.X
++--
+
+:1111
+
+
+Pattern 78550
+
+..X
+X..!
+
+:1222
+
+
+Pattern 78551
+
+X.X
+X..!
+
+:0222
+
+
+Pattern 78552
+
+x.x
+x..@
+
+:1122
+
+
+Pattern 78553
+
+.XX
+...!
+
+:0112
+
+
+Pattern 78554
+
+.XX
+X>*)
+
+:1122
+
+
+Pattern 78555
+
+.xx
+x*.!
+
+:1122
+
+
+#            .
+# Topology: ...
+#           ...
+
+Pattern 79000
+
+|X.
+|XX.
+|.X
++--
+
+:1111
+
+
+Pattern 79010
+# Big nakade.
+ x
+.X.
+.*.
+
+:1122
+
+
+Pattern 79011
+# Big nakade.
+ .
+.X.
+.*X
+
+:1122
+
+
+Pattern 79012
+# Big nakade.
+
+ X
+..x
+XX.
+
+:1222
+
+
+Pattern 79013
+# Big nakade.
+
+ x
+x*x
+xX.
+
+:1122
+
+
+Pattern 79014
+# X here may give ko.
+
+ .
+X.X
+X..
+
+:1222
+
+
+Pattern 79015
+# X here may give ko.
+
+ .
+X>X
+.*.
+
+:1122
+
+
+Pattern 79016
+# Big nakade.
+
+ x
+XXx
+x*.
+
+:1122
+
+
+Pattern 79017
+# Big nakade.
+
+ X
+XX.
+..X
+
+:1222
+
+
+Pattern 79018
+# Big nakade.
+
+ x
+XXx
+.*x
+
+:1122
+
+
+Pattern 79019
+# Big nakade.
+
+ X
+XX*
+.XX
+
+:1122
+
+
+Pattern 79020
+# Big nakade.
+
+ .
+XX.
+.XX
+
+:1112
+
+
+Pattern 79021
+# Big nakade.
+
+ X
+xX*
+.XX
+
+:1122
+
+
+Pattern 79022
+# Big nakade.
+
+ X
+.X.
+.X.
+
+:1112
+
+
+Pattern 79023
+# Big nakade.
+
+ .
+.X.
+XX.
+
+:1112
+
+
+Pattern 79024
+# Big nakade.
+
+ .
+xX.
+xX.
+
+:1111
+
+
+Pattern 79025
+# Big nakade.
+
+ x
+xXx
+.X.
+
+:1111
+
+
+Pattern 79026
+# Big nakade.
+
+ X
+XXX
+XX.
+
+:1112
+
+
+Pattern 79027
+# Big nakade.
+
+ x
+XXX
+xX.
+
+:1111
+
+
+Pattern 79028
+# Big nakade.
+
+ x
+XXx
+XX.
+
+:1111
+
+
+###############################
+#          8 elements         #
+###############################
+
+#           
+# Topology: ........
+#
+
+Pattern 80000
+# Bent four in the corner, some ko potential
+
+ !
+ .
+|X
+|X
+|...!
++---
+
+:1111
+
+
+Pattern 80010
+# Special corner shape.
+
+|)
+|*..
+|. ..$
++-----
+
+:1122
+
+
+#           ....
+# Topology:  ....
+#
+
+Pattern 80100
+
+!...
+ ...!
+
+:1112
+
+
+#             .
+# Topology:   .
+#           ......
+
+Pattern 80200
+
+  !
+  .
+!..X.X
+
+:2222
+
+
+Pattern 80201
+
+  !
+  .
+!..Xxx
+
+:1222
+
+
+Pattern 80202
+
+  !
+  .
+!.X.XX
+
+:1222
+
+
+Pattern 80203
+
+  @
+  .
+@.X>X.
+
+:1122
+
+
+Pattern 80204
+
+  !
+  .
+!.x..x
+
+:1222
+
+
+Pattern 80205
+
+  ( 
+  . 
+(.*..(
+
+:1122
+
+
+#             ..
+# Topology: ......
+#
+
+Pattern 80300
+
+  ..
+@.>>.@
+
+:1122
+
+
+Pattern 80301
+
+  ..
+!.X*.!
+
+:1122
+
+
+
+#            ..
+# Topology: ......
+#
+
+Pattern 80400
+# nn New pattern (3.3.12)
+
+|@ ..
+|....!
++-----
+
+:1122
+
+
+Pattern 80401
+
+ X.
+!..X.!
+
+:1222
+
+
+Pattern 80402
+
+ ..
+)>>..@
+
+:1122
+
+
+Pattern 80403
+
+ X.
+!*>..@
+
+:1122
+
+
+Pattern 80404
+
+ XX
+)*>X.!
+
+:1122
+
+
+Pattern 80405
+
+ xx
+!.*x.@
+
+:1122
+
+
+#           ...
+# Topology:  .....
+#
+
+Pattern 80500
+
+ !
+|.
+|.
+|XX
+|.*.
++---
+
+:1122
+
+
+Pattern 80501
+
+!.x
+ x*x.!
+
+:1122
+
+
+Pattern 80502
+# in some cases this could become seki
+
+!.x
+ xX..!
+
+:0112
+
+
+Pattern 80503
+# in some cases this could become seki
+
+!.x
+ xXX.!
+
+:0111
+
+
+#              .
+# Topology: .......
+#
+
+Pattern 80600
+
+   !
+(..*..(
+
+:1122
+
+
+#             ....
+# Topology: ....
+#
+
+Pattern 80700
+
+|.
+|*
+|XX
+|...!
++----
+
+:1122
+
+
+Pattern 80701
+
+|.
+|X
+|XX
+|...!
++----
+
+:1111
+
+
+#            . .
+# Topology:  . .
+#           ....
+
+Pattern 80800
+# tm New Pattern (3.1.20) (see viking:9)
+
+  ! @
+  . .
+ .X..
+
+:1122
+
+
+#            .
+# Topology: ...
+#           ....
+
+Pattern 80900
+# gf New pattern. (3.3.18)
+
+  .
+|XX.
+|.XX.
++----
+
+:1111
+
+
+#           . 
+# Topology: ...
+#           ....
+
+Pattern 81000
+# gf New pattern. (3.3.18)
+
+|. 
+|XX.
+|.XX.
++----
+
+:1111
+
+
+#           ..
+# Topology: ..
+#           ....
+
+Pattern 81100
+# gf New pattern. (3.3.18)
+
+|..
+|XX
+|.XX.
++----
+
+:1111
+
+
+#           ..
+# Topology: ...
+#           ...
+
+Pattern 81200
+# gf New pattern. (3.3.18)
+
+|..
+|XX.
+|.XX
++---
+
+:1111
+
+
+###############################
+#          9 elements         #
+###############################
+
+
+Pattern 90100
+
+@.>..
+  ...!
+
+:1122
+
+
+Pattern 90200
+
+  ! .
+!.....!
+
+:1222
+
+
+Pattern 90300
+
+  !
+  .
+ ..
+!...!
+
+:1112
+
+
+Pattern 90400
+
+ !
+ ..
+!.*..!
+
+:1122
+
+
+Pattern 90500
+
+ .....!
+!..
+
+:1222
+
+Pattern 90600
+
+ !
+|.
+|.
+|*X
+|...!
++----
+
+:1122
+
+
+Pattern 90700
+
+   !
+@..>...!
+
+:1122
+
+
+Pattern 90800
+
+|!
+|.
+|X.
+|X
+|...@
++---
+
+:1122
+
+
+###############################
+#         10 elements         #
+###############################
+
+
+Pattern 100001
+
+|!
+|.
+|.*.
+|.*..$
++-----
+
+:1122
+
+
+Pattern 100002
+# `analyze_eyegraph' believes it is 0012, but I doubt.  Must be some
+# liberty shortage artifact or something.  /pp
+
+|!
+|.
+|.X.
+|....$
++-----
+
+:0112
+
+
+Pattern 100100
+
+ @
+ .
+ ..
+xX*
+ x.
+  !
+
+:1122
+
+
+Pattern 100200
+
+   !
+ ! .
+ ..*
+!...
+
+:1122
+
+
+Pattern 100300
+
+
+  !
+  *.
+  .>
+@...@
+
+:1122
+
+
+Pattern 100400
+
+   (
+  ..
+  *.
+(.X.(
+
+:1122
+
+
+Pattern 100401
+
+   (
+  ..
+  >.
+@...(
+
+:1122
+
+
+Pattern 100500
+
+  )
+@.>
+  .
+ .>
+)*.
+
+:1122
diff --git a/patterns/eyes.h b/patterns/eyes.h
new file mode 100644 (file)
index 0000000..62db7f7
--- /dev/null
@@ -0,0 +1,73 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "liberty.h"
+
+
+#define CAN_BE_EMPTY           1
+#define CAN_CONTAIN_STONE      2
+#define EYE_DEFENSE_POINT      4
+#define EYE_ATTACK_POINT       8
+
+/*
+ * The vertices of each eye are defined by an array of struct eye_vertex.
+ */
+
+struct eye_vertex {
+  signed char marginal;                  /* 1 if marginal vertex, 0 otherwise     */
+  signed char edge;              /* 0 = center, 1 = edge, 2 = corner      */
+  /* A corner vertex may only be matched at the corner.
+   * An edge vertex may be matched at the corner or on the edge.
+   * A center vertex may be matched anywhere.
+   */
+  signed char flags;             /* see the #defines above                */
+
+  signed char neighbors;         /* number of neighbors                   */
+  signed char n[4];              /* position in array of vertex neighbors */
+};
+
+
+/*
+ * Each eye is described by one struct eye_graph and the vertices
+ * in the struct eye_vertex array.
+ */
+
+struct eye_graph {
+  struct eye_vertex *vertex;
+  int patnum;                    /* number of pattern                     */
+  int esize;                      /* number of vertices                    */
+  int msize;                      /* number of marginal vertices           */
+  int ends;                       /* number of vertices with one neighbor  */
+  int two_neighbors;              /* number of vertices with 2 neighbors   */
+  int three_neighbors;            /* number of vertices with 3 neighbors   */
+  struct eyevalue value;          /* eye value                             */
+};
+
+extern struct eye_graph graphs[];
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/fuseki.db b/patterns/fuseki.db
new file mode 100644 (file)
index 0000000..94a7fea
--- /dev/null
@@ -0,0 +1,2891 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The General Fuseki Pattern Database, fuseki.db
+#
+#  Further documentation may be found in the Texinfo documentation
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  After the pattern, some supplementary information in the format:
+#
+# :trfno, classification, [values], helper_function
+#   
+#  These and other aspects of the pattern database are documented
+#  in the Texinfo documentation.
+#
+#################
+#
+#  Any line beginning with #, or any part of a line following
+#  whitespace is a comment. 
+#
+#  The patterns are classified into two different categories:
+#  
+#  F     fuseki
+#  J     joseki
+#
+#  The patterns are grouped in the file by category. New patterns
+#  should be added close to a similar pattern or at the end of the
+#  category where it belongs. When a new pattern is added, the names
+#  of later patterns in the category should usually not be changed.
+#  This can be accomplished by introducing names like F10b and so on.
+#
+
+
+######################################################################
+#
+# Fuseki patterns
+#
+# These patterns need to be revised.
+#
+# Various corner enclosures, kakaris, and extensions along the edges.
+#
+# These patterns are further subdivided into the following classes
+#
+# Approach moves
+# Corner enclosures
+# Edge extensions from corner positions
+# Center extensions from wide positions
+# Edge extensions
+# Edge extensions combined with approach moves
+# Pincers
+# Invasions in the middle of the edge
+# Jumps
+#
+######################################################################
+
+
+attribute_map general
+
+goal_elements none
+callback_data XOxo
+
+
+################
+# Approach moves
+################
+
+
+#### Low (keima) kakari
+
+
+Pattern F1
+
+|..???...ooo   approach star
+|...X.....O.
+|.....*.....
+|...........
+|...........
++-----------
+
+:8,FEad
+
+
+Pattern F2
+# Made attack dependent on extension space (3.1.25) /ab
+
+|..???.ooo   low kakari against star
+|...X.....
+|.....*...
+|.........
+|.........
++---------
+
+:8,FeE
+
+
+Pattern F3
+
+|..???.oooo   low kakari against star with space for extension
+|...X......
+|.....*...o
+|..........
+|..........
++----------
+
+:8,FeEat,shape(1)
+
+
+Pattern F3h
+# db added (3.3.9)
+
+|..........     keima kakari against star, high handicap game
+|...X.....x
+|.....*...x
+|..........
+|..........
++----------
+
+:8,FEj,shape(.025)
+
+|..........
+|...X.....a
+|.....*...b
+|..........
+|..........
++----------
+
+; x_alive_somewhere(a,b)
+
+
+#### High (ikken taka) kakari
+#### not so good in relation to the corner since the
+####     3-3 point relationship is inferior.
+
+
+Pattern F4
+# Made attack dependent on extension space (3.1.25) /ab
+
+|.........   high kakari against star
+|...X.*...
+|.........
+|.........
+|.........
++---------
+
+:8,FE
+
+
+Pattern F4a
+
+|.........oo   high kakari against star
+|...X.*...oo
+|.........oo
+|...........
+|...........
++-----------
+
+:8,FEa
+
+
+Pattern F5d
+# db added (3.3.9)
+
+|..........      high kakari against star
+|...X.*...x
+|.........x
+|..........
+|..........
++----------
+
+:8,FEj
+
+|..........
+|...X.*...a
+|.........b
+|..........
+|..........
++----------
+
+; x_alive_somewhere(a,b)
+
+
+#### Two space high (nikken taka) kakari
+
+
+Pattern F5
+# Made attack dependent on extension space (3.1.25) /ab
+
+|.........   far high kakari against star
+|...X..*..
+|.........
+|.........
+|.........
++---------
+
+:8,FE
+
+
+Pattern F5a
+
+|.........oo   far high kakari against star
+|...X..*..oo
+|.........oo
+|.........oo
+|.........oo
++-----------
+
+:8,FEa
+
+
+Pattern F5h
+# db added (3.3.9)
+
+|..........   far high kakari against star
+|...X..*..x
+|.........x
+|..........
+|..........
++----------
+
+:8,FEj,shape(.01)
+
+|..........
+|...X..*..a
+|.........b
+|..........
+|..........
++----------
+
+; x_alive_somewhere(a,b)
+
+
+Pattern F6
+
+|....??   3-3 point invasion
+|.....?
+|...X..
+|..*...
+|......
+|......
++------
+
+:/,FI
+
+
+Pattern F7
+# similar to F6, but the difference makes it worthwhile to have both
+
+|...??         san san
+|...X?
+|..*..
+|.....
+|.....
++-----
+
+:/,FI,shape(-2)
+
+
+Pattern F8
+
+|.......   Low kakari against 3-4
+|.......
+|..X....
+|....*..
+|.......
+|.......
++-------
+
+:8,FeEaj
+
+
+Pattern F9
+
+|.........   Low kakari against 3-4
+|.........
+|..X.....o
+|....*...o
+|.........
+|.........
++---------
+
+:8,FeEaj,shape(4)
+
+
+Pattern F10
+
+|.......   High kakari against 3-4
+|.......
+|..X.*..
+|.......
+|.......
+|.......
++-------
+
+:8,FeEaj
+
+
+Pattern F11
+
+|.........   High kakari against 3-4
+|.........
+|..X.*..oo
+|.......oo
+|.........
+|.........
++---------
+
+:8,FeEaj,shape(4)
+
+
+Pattern F12
+
+|..????   3-3 point invasion under 5-3
+|....??
+|....??
+|..*.X?
+|.....?
+|......
++------
+
+:8,FIj,shape(2)
+
+
+Pattern F13
+
+|......  3-4 point kakari against 5-3
+|......
+|......
+|..*..?
+|....X?
+|.....?
+|......
++------
+
+:8,FeEaj,shape(1)
+
+
+Pattern F14a
+
+|......  high kakari against 5-3
+|......
+|......
+|......
+|......
+|...*..
+|.....?
+|....X?
+|.....?
+|......
++------
+
+:8,FeEaj,shape(1)
+
+
+Pattern F14b
+
+|......      takamoku joseki
+|...X..
+|......
+|...*..
+|......
+|......
++------
+
+:8,FeEaj,shape(2)
+
+
+Pattern F15
+
+|..????  3-3 point invasion under 5-4
+|...???
+|...X??
+|......
+|..*...
+|......
+|......
++------
+
+:8,FIj,shape(1)
+
+
+Pattern F16a
+
+|......   shoulder hit on san-san
+|......
+|...*..
+|..X...
+|......
+|......
++------
+
+:/,FEaj,shape(1)
+
+
+Pattern F16b
+
+|........   ogeima approach to san-san
+|........
+|........
+|........
+|...*....
+|........
+|........
+|..X.....
+|........
+|........
++--------
+
+:8,FEaj,shape(1)
+
+
+Pattern F17
+
+|..oo......   low kakari against star with space for extension
+|..........
+|..........
+|..........
+|...X.....o
+|.....*...o
+|..........
+|..........
++----------
+
+:8,FeEaj,shape(3)
+
+
+Pattern F18
+
+|..oo......   high kakari against star with space for extension
+|..........
+|..........
+|..........
+|...X.*...o
+|.........o
+|..........
+|..........
++----------
+
+# The shape value is carefully chosen so that the low kakari will be
+# played much more often, but not always.
+:8,FeEaj,shape(2.98)
+
+
+Pattern F19
+
+|..xxX     go-go invasion at san-san
+|....x
+|..*.x
+|.....
+|.....
++-----
+
+:/,FeEaj, shape(1)
+
+|..abX
+|....c
+|..*.d
+|.....
+|.....
++-----
+
+; x_alive_somewhere(a) + x_alive_somewhere(b)
+; + x_alive_somewhere(c) + x_alive_somewhere(d) <= 1
+
+
+Pattern F20
+
+|...????    go-go invasion at hoshi
+|.....??
+|....X.?
+|...*..?
+|.......
+|.......
+|.......
++-------
+
+# I think this is suboptimal, thus the worse shape. /ab
+:/,FeEaj, shape(0.94)
+
+
+Pattern F21
+
+|..?xx??    go-go invasion at komoku
+|.....??
+|....X.?
+|..*...?
+|......?
+|.......
+|.......
++-------
+
+:8,FeEaj, shape(1)
+
+
+Pattern F22
+
+|..o???
+|..oo??
+|......    5-3 approach move to go-go
+|......
+|..*.X.
+|......
+|......
+|......
+|......
++------
+
+:8,FEaj,shape(1)
+
+
+###################
+# Corner enclosures
+###################
+
+Pattern F101
+
+|......        ikken shimari
+|......
+|..*.O.
+|......
+|......
+|......
++------
+
+:8,FeEj,shape(3)
+
+
+Pattern F102
+
+|.........        lower shimari is better if X can approach
+|.........        at 7-3 (left of a) too easily
+|..O.*.ooo
+|......ooo
+|.........
+|.........
++---------
+
+:8,FeEj,shape(3)
+
+|.........
+|.........
+|..O.*.ooo
+|......oao
+|.........
+|.........
++---------
+
+;!xmoyo(a)
+
+
+Pattern F103
+
+|.......        kogeima shimari
+|.......
+|..O....
+|....*..
+|.......
+|.......
++-------
+
+:8,FeEj,shape(3)
+
+
+Pattern F104
+
+|........        ogeima shimari
+|........
+|..O.....
+|.....*..
+|........
+|........
++--------
+
+:8,Fj,shape(1)
+
+
+Pattern F105
+
+|.......        kogeima shimari
+|.......
+|..*....
+|....O..
+|.......
+|.......
++-------
+
+:8,FeEj,shape(3)
+
+
+Pattern F106
+
+|...O..        defend corner from star
+|......
+|...O..
+|....*.
+|......
+|......
++------
+
+:8,Fet,shape(-3)
+
+
+Pattern F107a
+# This is a large move since it closes the corner. It
+# is not large enough to warrant the j classification.
+
+|..O...        defend corner from star
+|......
+|...O..
+|....*.
+|......
+|......
++------
+
+:8,Fet,shape(-1)
+
+
+Pattern F107b
+
+|..O...        defend corner from star
+|......
+|......
+|...O..
+|...*..
+|......
+|......
++------
+
+:8,Fet,shape(-1)
+
+
+Pattern F108
+
+|..O...        defend corner from star
+|......
+|...O..
+|.....X
+|...*..
+|......
++------
+
+:8,Fet
+
+
+Pattern F109
+# gf Added constraint. (3.1.22)
+# See nngs:1030.
+
+|.......       enclosure from star
+|..*....
+|.......
+|...O...
+|.......
+|.......
+|.......
++-------
+
+:8,FEt,shape(-2)
+
+|...a...
+|..*....
+|.......
+|...O...
+|.......
+|.......
+|.......
++-------
+
+;!omoyo(a)
+
+
+Pattern F109b
+# gf New pattern. (3.1.22)
+
+|.......       enclosure from star
+|.......
+|.......
+|.......
+|..*....
+|.......
+|...O...
+|.......
+|.......
+|.......
++-------
+
+:8,FEt,shape(-2)
+
+
+Pattern F110
+
+|..xx......       extend between two stones on 4-th line
+|..........
+|...O.....O
+|.....*....
+|..........
+|..........
++----------
+
+:8,FEt,shape(-1)
+
+
+#######################################
+# Edge extensions from corner positions
+#######################################
+
+Pattern F201
+# gf Increased value. (3.1.17)
+
+|...O.........    wide extension from ikken shimari
+|.............
+|...O.....*...
+|.............
+|.............
++-------------
+
+:8,FeEj,shape(0.5)
+
+
+Pattern F202
+# gf Increased value. (3.1.17)
+
+|..O..........    wide extension from kogeima shimari
+|.............
+|...O.....*...
+|.............
+|.............
++-------------
+
+:8,FeEj,shape(0.5)
+
+
+Pattern F203
+
+.O......         4 space extension from 1 space jump
+........
+.O....*.
+........
+........
+--------
+
+:8,FeEt
+
+
+Pattern F204
+
+O.......?         4 space extension from knight's move
+........?
+.O....*..
+........?
+........?
+---------
+
+:8,FeEt
+
+
+Pattern F205
+
+O........         4 space extension from knight's move
+.........
+.O....*.X
+.........
+.........
+---------
+
+:8,FeEt,shape(1)
+
+
+Pattern F206
+
+|.............    wide extension from ikken shimari
+|..O.O........
+|.........*...
+|.............
+|.............
++-------------
+
+:8,FEt
+
+
+Pattern F207
+
+|.............    wide extension from kogeima shimari
+|..O..........
+|....O....*...
+|.............
+|.............
++-------------
+
+:8,FEt,shape(-1)
+
+
+Pattern F208
+
+.O.......         3 space extension from 1 space jump
+.....*...
+.O......O
+.........
+.........
+---------
+
+:8,eE,shape(-2)
+
+
+Pattern F209
+
+|...................|      San ren sei!
+|...................|
+|...O.....*.....O...|
+|...................|
+|...................|
+|...................|
++-------------------+
+
+:8,FEt,shape(3)
+
+
+Pattern F210
+
+|............      Wide extension from star
+|............
+|............
+|...O.....*..
+|............
+|............
+|............
++------------
+
+:8,FEt,shape(1)
+
+
+#######################################
+# Center extensions from wide positions
+#######################################
+
+
+Pattern F301
+
+?????.??    jump up to claim space from 4 point extension
+?....*..
+........
+O....O.X
+........
+........
+--------
+
+:8,FEt
+
+
+Pattern F302
+
+.......           jump up to claim space from 4 point extension
+?....*.
+.......
+O....O.
+.......
+.......
+-------
+
+:8,E
+
+
+Pattern F303
+
+......      seal the largest area
+..*...
+O....O
+......
+O....O
+......
+......
+------
+
+:8,E,shape(-2)
+
+
+Pattern F304
+
+......       light reducing move
+......
+.....X
+.*....
+X....X
+......
+......
+------
+
+:8,FEt
+
+
+Pattern F305
+
+X.*oo         usually bad
+...oo
+.O.oo
+.....
+.....
+-----
+
+:8,F,shape(-5)
+
+
+Pattern F306
+
+oo......       jump to expand
+oo...*..
+oo.....x
+.....O.x
+........
+........
+--------
+
+:8,E
+
+oo......
+oo...*..
+ab.....x
+.....O.x
+........
+........
+--------
+
+; o_alive_somewhere(a,b)
+
+
+Pattern F307
+
+?......o        stand to defend extension
+X.*..ooo
+.XO..ooo
+........
+........
+--------
+
+:8,FJ
+
+?......o
+X.*..abc
+.XO..def
+........
+........
+--------
+
+; o_alive_somewhere(a,b,c,d,e,f)
+
+
+#################
+# Edge extensions
+#################
+
+
+Pattern F401
+# gf Added constraint. See gunnar:92. (3.7.10)
+
+x......xx     make 2 space extension on third row
+x.*..O.xx
+.......??
+.......??
+---------
+
+:8,edj
+
+x.e....ab
+x.*..O.cd
+.......??
+.......??
+---------
+
+; x_alive_somewhere(a,b,c,d) && !oterri(e)
+
+
+Pattern F402
+
+......x?    make 2 space extension on third row
+.O..*.x?
+......x?
+........
+--------
+
+:8,ed
+
+
+Pattern F403
+# This should only be j or J if the O stones do not already
+#      have a base, t otherwise. But they usually do not
+#      have a base as this pattern most naturally comes up.
+
+......o?  make 3 space extension from two stones
+......O?
+..*...O?
+?.......
+?.......
+--------
+
+:8,Fedj,shape(1)
+
+
+Pattern F404
+
+......o?  make 3 space extension from two stones
+..*...O?
+......O?
+?.......
+?.......
+--------
+
+:8,FEdj,shape(1)
+
+
+Pattern F405
+# FIXME: This seems overconcentrated.  See also F406
+#   Probably best to remove this pattern.
+
+?.....o?
+...*..O?  make 3 space extension from two stones
+O.....O?
+........
+........
+--------
+
+:8,e
+
+?.....o?
+...*..O?
+O..a..O?
+........
+........
+--------
+
+;!oterri(*) && !oterri(a)
+
+
+# tm Removed (3.1.24)  This is just overconcentrated.
+#Pattern F406
+## dee trevord:1000
+#
+#......o?  make 2 space extension from two stones
+#O..*..O?
+#......O?
+#.......o
+#........
+#--------
+#
+#:8,FtEd
+
+
+
+Pattern F407
+#tm modified (3.1.20) 
+#     (see nngs:1150, nngs:1030, nngs:1230)
+
+.....???
+......??   make 2 space extension on third row
+.O..*...
+......??
+......??
+--------
+
+:8,ed
+
+
+Pattern F408
+# gf Added constraint to avoid overconcentration. See 13x13:12,
+#    13x13b:42. (3.3.17)
+
+.......        extend
+oO..*..
+.......
+.......
+-------
+
+:8,ed
+
+.....a.
+oO..*..
+.......
+.......
+-------
+
+;!omoyo(a)
+
+
+Pattern F409
+
+?......??     3 space high extension
+.....*...
+.O.......
+.........
+.........
+---------
+
+:8,Ed
+
+
+Pattern F410
+
+???......?            extend
+???.O....?
+???....*.?
+???.......
+???.......
+----------
+
+:8,Ed
+
+
+Pattern F410a
+
+?xx......?            extend
+?xx.O....?
+?xx....*.?
+?xx.......
+?xx.......
+----------
+
+:8,FEdt,shape(3)
+
+?xx......?
+?ab.O....?
+?cd....*.?
+?xx.......
+?xx.......
+----------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern F410b
+# gf Made constraint diagram consistent with main diagram. (3.1.18)
+
+x........??           extend
+x...O....xx
+x......*..?
+x.........?
+x.........?
+-----------
+
+:8,FEdj,shape(2)
+
+x........??
+a...O....xx
+b......*..?
+x.........?
+x.........?
+-----------
+
+; x_alive_somewhere(a,b)
+
+
+Pattern F410c
+# evand changed from j to t class. (3.5.2)
+# It was causing too many slow moves early.  See nngs4:660
+
+x.........xx
+x.........xx
+x..........?
+x...O.....O.
+x.......*...
+x...........
+x...........
+------------
+
+:8,FEdt
+
+x.........cd
+x.........ef
+x..........?
+a...O.....O.
+b.......*...
+x...........
+x...........
+------------
+
+; x_alive_somewhere(a,b,c,d,e,f)
+
+
+Pattern F410d
+# gf Revised pattern. (3.3.15)
+
+o......xxx      extend while limiting opponent
+oO.....xxx
+o...*..xxx
+..........
+..........
+----------
+
+:8,Fedt
+
+o......xxx
+oO.....abx
+o...*..cdx
+..........
+..........
+----------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern F410e
+
+......xxx      extend while limiting opponent
+......xxx
+O..*..xxx
+.........
+.........
+---------
+
+:8,edt
+
+......xxx
+......abx
+O..*..cdx
+.........
+.........
+---------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern F410f
+
+??..?x?
+oO...xx
+o..*.xx
+......?
+......?
+-------
+
+:8,ed
+
+??..?x?
+oO...ax
+o..*.bx
+......?
+......?
+-------
+
+; x_alive_somewhere(a,b)
+
+
+Pattern F411
+# gf Revised pattern. (3.3.17)
+
+.......       extend between two stones on 4-th line
+O..*..O
+.......
+.......
+.......
+-------
+
+:|,FEd,shape(-2)
+
+
+Pattern F412
+
+?xX.??       short extension
+......
+.O.*..
+......
+......
+......
+------
+
+:8,FEadj,shape(-1)
+
+
+Pattern F413
+
+.........      2 space extension is less urgent if both sides are open
+.........
+....O..*.
+.........
+.........
+---------
+
+:8,F,shape(-5)
+
+
+Pattern F420
+
+|..........     Take an empty corner in high handicap games ...
+|..........
+|..*.......
+|..........
+|...O.....O    
+|..........     
+|..........     
+|..........
++----------
+
+:8,FEt,shape(-2)
+
+
+Pattern F421
+
+|..........
+|..........       ... close that corner so it stays closed ...
+|..O.......
+|..........
+|...O.....O
+|...*......
+|..........
+|..........
++----------
+
+:8,FeEt,shape(-3)
+
+
+Pattern F423
+
+|.............      ... make an iron pillar ...
+|.............
+|..O..........
+|.............
+|...O.....O...
+|...O.....*...
+|.............
+|.............
++-------------
+
+:8,FEt,shape(-3)
+
+
+Pattern F424
+
+|.............      ... and jump out!
+|.............
+|..O......*...
+|.............
+|...O.....O...
+|...O.....O...
+|.............
+|.............
++-------------
+
+:8,FEt,shape(-4)
+
+
+Pattern F425
+
+xxX......       two space jump
+XxOO..*.x
+x........
+.........
+---------
+
+:8,Fj
+
+
+Pattern F426
+
+xxX..*...        stabilize the side
+XxOO....O
+x........
+.........
+---------
+
+:8,Fj
+
+
+##############################################
+# Edge extensions combined with approach moves
+##############################################
+
+
+Pattern F501
+
+X......  make 2 space extension on third row combined with approach move
+..*..O.
+.......
+.......
+-------
+
+:8,eadj
+
+
+Pattern F502
+
+.......  make 2 space extension on third row combined with approach move
+X.*..O.
+.......
+.......
+-------
+
+:8,eadt,shape(1)
+
+
+Pattern F504
+
+xx.....O.
+xx.*....O
+.........
+.........
+---------
+
+:8,Feadj
+
+ac.....O.
+bd.*....O
+.........
+.........
+---------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern F505
+
+.......        extend
+.O.....
+....*.X
+.......
+-------
+
+:8,ead,shape(1)
+
+
+Pattern F506
+
+......     Extend along edge
+O..*.X
+o....x
+......
+------
+
+:8,Feadt,shape(1)
+
+
+#########
+# Pincers
+#########
+
+Pattern F601
+
+.......         prevent extension
+.*..X.O
+....XO.
+.......
+.......
+-------
+
+:8,FEaj
+
+
+Pattern F602
+
+........o      block extension
+O.X.*...o
+.........
+.........
+---------
+
+:8,Feaj
+
+
+Pattern F603
+
+xxx..        time to defend
+.....
+O.*.O
+.....
+.....
+.....
+-----
+
+:8,Fj
+
+abc..
+.....
+O.*.O
+.....
+.....
+.....
+-----
+
+;x_alive_somewhere(a,b,c)
+
+
+Pattern F604a
+#evand new pattern. (3.5.2)
+#see nngs4:750
+
+.....o     pincer a stone against a wall
+.....o
+.....o
+..*.XO
+.....o
+.....o
+------
+
+:8,Fae
+
+.....a
+.....b
+f....c
+e.*.XG
+.....o
+.....o
+------
+
+;o_alive_somewhere(a,b,c) && !omoyo(e) && !omoyo(f) && !weak(G)
+
+
+Pattern F604b
+#evand new pattern. (3.5.2)
+#see nngs4:750
+
+.......o           pincer a stone against a wall
+.......o
+.......o
+...*..XO
+.......o
+.......o
+--------
+
+:8,Fae
+
+.......a
+.......b
+f......c
+e..*..XG
+.......o
+.......o
+--------
+
+;o_alive_somewhere(a,b,c) && !omoyo(e) && !omoyo(f) && !weak(G)
+
+
+#####################################
+# Invasions in the middle of the edge
+#####################################
+
+Pattern F701
+
+X.........xx    invade with space to extend in both directions
+x....*....xx
+............
+............
+------------
+
+:8,sFIt,shape(1)
+
+X.........ab
+x....*....cd
+............
+............
+------------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern F702
+
+x.........xx    invade with space to extend in both directions
+X....*....xx
+............
+............
+------------
+
+:8,sFIt,shape(1)
+
+x.........ab
+X....*....cd
+............
+............
+------------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern F703
+
+X.......X    invade
+....*....
+.........
+.........
+---------
+
+:8,sFIt
+
+
+Pattern F704
+# gf Added constraint. (3.1.22)
+# See nngs:1030.
+# evand revised. (3.5.2)
+# See nngs4:750
+
+????????
+?.....??       invade 4 space extension
+.X......
+....*.X.
+........
+........
+--------
+
+:8,sFIt,shape(-1)
+
+???c?d??
+?.....??
+.A......
+....*.B.
+........
+........
+--------
+
+;weak(A) || weak(B) || !xmoyo(c) || !xmoyo(d)
+
+
+Pattern F705
+
+?......?       invade 5 space extension
+.X......
+...*...X
+........
+........
+--------
+
+:8,sFIt
+
+
+Pattern F706
+
+O..O..O         respond to an invasion
+o..X*..
+o......
+.......
+-------
+
+:8,sFIj
+
+
+# tm - removed (3.1.20)
+# This is almost an antisuji, much less a joseki move!
+#Pattern F707
+#
+#.....         attack to make local shape
+#O.X.O
+#..*..
+#.....
+#.....
+#-----
+#
+#:8,FsjE
+
+
+################
+# Jumps
+################
+
+
+Pattern F709
+# gf Revised and devalued. See 13x13b:26.
+
+?......      urgent jump
+?..*..?
+xX....?
+x..O..X
+x......
+.......
+-------
+
+:8,Ej
+
+
+############################################
+# Stop edge extensions from corner positions
+############################################
+
+
+Pattern F801
+
+|...X..........    stop wide extension from ikken shimari
+|............oo
+|...X.....*..oo
+|..............
+|..............
++--------------
+
+:8,FEj,shape(2)
+
+
+Pattern F802
+
+|...X..........    stop wide extension from ikken shimari
+|.........*..oo
+|...X........oo
+|..............
+|..............
++--------------
+
+:8,FEj,shape(2)
+
+
+Pattern F803
+
+|..X...........    stop wide extension from kogeima shimari
+|............oo
+|...X.....*..oo
+|..............
+|..............
++--------------
+
+:8,FEj,shape(2)
+
+
+Pattern F804
+
+|..X...........    stop wide extension from kogeima shimari
+|.........*..oo
+|...X........oo
+|..............
+|..............
++--------------
+
+:8,FEj,shape(2)
+
+
+Pattern F805
+
+|..............    stop wide extension from ikken shimari
+|..X.X.......oo
+|.........*..oo
+|..............
+|..............
++--------------
+
+:8,FEt,shape(4)
+
+
+Pattern F806
+
+|..............    stop wide extension from kogeima shimari
+|..X.........oo
+|....X....*..oo
+|..............
+|..............
++--------------
+
+:8,FEt,shape(3)
+
+
+Pattern F807
+
+|...................|      Invade nirensei.
+|...................|
+|...X.....*.....X...|
+|...................|
+|...................|
+|...................|
++-------------------+
+
+:8,FEj,shape(1)
+
+
+Pattern F808
+
+|...................|      Invade nirensei.
+|...................|
+|...X...........X...|
+|.........*.........|
+|...................|
+|...................|
++-------------------+
+
+:8,FEj,shape(1)
+
+
+Pattern F809
+
+|...X..........    approach shimari and strengthen own stone
+|.........o.xxx
+|...X..*..o.xxx
+|..............
+|..............
++--------------
+
+:8,FEj,shape(4)
+
+|...X..........
+|.........g.abc
+|...X..*..h.def
+|..............
+|..............
++--------------
+
+;x_alive_somewhere(a,b,c,d,e,f) && o_alive_somewhere(g,h)
+
+
+Pattern F810
+
+|...X...........    approach shimari and strengthen own stone
+|..........o.xxx
+|....X..*..o.xxx
+|...............
+|...............
++---------------
+
+:8,FEj,shape(4)
+
+|...X...........
+|..........g.abc
+|....X..*..h.def
+|...............
+|...............
++---------------
+
+;x_alive_somewhere(a,b,c,d,e,f) && o_alive_somewhere(g,h)
+
+
+Pattern F811
+
+|..............    approach shimari and strengthen own stone
+|..X.x......xxx
+|....x.*..O.xxx
+|..............
+|..............
++--------------
+
+:8,FEj,shape(4)
+
+|..............
+|..X.g......abc
+|....h.*..O.def
+|..............
+|..............
++--------------
+
+;x_alive_somewhere(a,b,c,d,e,f) && x_alive_somewhere(g,h)
+
+
+Pattern F812
+
+|..xxx.........xxx..|             wariuchi
+|..xxx.........xxx..|
+|..xxx.........xxx..|
+|..Xxx....*....xxx..|
+|...................|
+|...................|
++-------------------+
+
+:8,Fj
+
+|..xxx.........xxx..|
+|..xxx.........abc..|
+|..xxx.........def..|
+|..Xxx....*....ghi..|
+|...................|
+|...................|
++-------------------+
+
+; x_somewhere(a,b,c,d,e,f,g,h,i)
+
+
+Pattern F813
+
+|..xxx.........xxx..|             wariuchi
+|..xxx.........xxx..|
+|..xxx.........xxx..|
+|..xXx....*....xxx..|
+|...................|
+|...................|
++-------------------+
+
+:8,Fj
+
+|..xxx.........xxx..|
+|..xxx.........abc..|
+|..xxx.........def..|
+|..xXx....*....ghi..|
+|...................|
+|...................|
++-------------------+
+
+; x_somewhere(a,b,c,d,e,f,g,h,i)
+
+
+Pattern F814
+
+|..xxx.........xxx..|             wariuchi
+|..xxx.........xxx..|
+|..xxx.........xxx..|
+|..xxX....*....xxx..|
+|...................|
+|...................|
++-------------------+
+
+:8,Fj
+
+|..xxx.........xxx..|
+|..xxx.........abc..|
+|..xxx.........def..|
+|..xxX....*....ghi..|
+|...................|
+|...................|
++-------------------+
+
+; x_somewhere(a,b,c,d,e,f,g,h,i)
+
+
+Pattern F815
+
+|..xxx.........xxx..|             wariuchi
+|..xxx.........xxx..|
+|..xXx.........xxx..|
+|..xxx....*....xxx..|
+|...................|
+|...................|
++-------------------+
+
+:8,Fj
+
+|..xxx.........xxx..|
+|..xxx.........abc..|
+|..xXx.........def..|
+|..xxx....*....ghi..|
+|...................|
+|...................|
++-------------------+
+
+; x_somewhere(a,b,c,d,e,f,g,h,i)
+
+
+Pattern F816
+
+|..xxx.........xxx..|             wariuchi
+|..xxx.........xxx..|
+|..xxX.........xxx..|
+|..xxx....*....xxx..|
+|...................|
+|...................|
++-------------------+
+
+:8,Fj
+
+|..xxx.........xxx..|
+|..xxx.........abc..|
+|..xxX.........def..|
+|..xxx....*....ghi..|
+|...................|
+|...................|
++-------------------+
+
+; x_somewhere(a,b,c,d,e,f,g,h,i)
+
+
+################
+# Miscellaneous
+################
+
+Pattern F901
+
+......x     mandatory reinforcement
+......x
+....*.X
+.O..OX.
+.......
+.......
+-------
+
+:8,FEdJ
+
+
+Pattern F902
+
+......x     mandatory reinforcement
+......x
+o...*.X
+o...OX.
+.......
+.......
+-------
+
+:8,FEdJ
+
+......x
+......x
+a...*.X
+b...OX.
+.......
+.......
+-------
+
+;o_alive_somewhere(a,b)
+
+
+######################################################################
+#
+# Joseki patterns.
+#
+# Corner joseki moves. Notice that the very first approach move in a
+# corner is not classified as a joseki move but as a fuseki move.
+#
+# The bulk of our Joseki patterns are automatically built from
+# the files patterns/*.sgf. Sometimes it is easier to add a pattern
+# here.
+#
+######################################################################
+
+
+Pattern J1
+
+|.....?        hane if attached under hoshi stone
+|...O.x
+|..*X.?
+|.....?
+|.....?
++------
+
+:8,sFedJ
+
+
+Pattern J2
+
+|.......   don't tenuki when star is approached
+|...X...
+|.......
+|...O.*.
+|.......
+|.......
+|.......
++-------
+
+:8,sFadJ
+
+
+Pattern J3
+
+|....???   don't tenuki when star is approached
+|...X...
+|.......
+|.......
+|...O.*.
+|.......
+|.......
+|.......
++-------
+
+:8,sFadJ
+
+
+Pattern J4
+
+|....???   don't tenuki when star is approached
+|..X....
+|.......
+|..*....
+|...O...
+|.......
+|.......
+|.......
++-------
+
+:8,sFadj
+
+
+Pattern J5
+
+|..X???   defend slide with kosumi
+|......
+|.X.O.O
+|..*...
+|......
+|......
++------
+
+:8,sFeadJ
+
+
+Pattern J6
+
+|.......        jump to 3-3
+|..O....
+|.......
+|...X...
+|..*..O.
+|.......
+|.......
++-------
+
+:8,sFeJ
+
+
+Pattern J7
+# gf Made pattern more specific. (3.7.1)
+# See trevorc:1180.
+
+|...........       block after 3-3 invasion
+|...........
+|...O....ooo
+|..X*....ooo
+|...........
+|...........
++-----------
+
+:8,sFedJ
+
+|...........
+|...........
+|...O....abc
+|..X*....def
+|...........
+|...........
++-----------
+
+;o_somewhere(a,b,c,d,e,f)
+
+
+Pattern J7b
+# gf New pattern. (3.7.1)
+# See arend:28.
+
+|..oo.......
+|...........
+|..X........       block after 3-3 invasion
+|...........
+|...O....ooo
+|..X*....ooo
+|...........
+|...........
++-----------
+
+:8,sFedJ
+
+|..gh.......
+|...........
+|..X........
+|...........
+|...O....abc
+|..X*....def
+|...........
+|...........
++-----------
+
+;o_somewhere(a,b,c,d,e,f) && o_somewhere(g,h)
+
+
+Pattern J7c
+# gf New pattern. (3.7.1)
+
+|..oo.......
+|...........
+|...........
+|..X........       block after 3-3 invasion
+|...........
+|...O.....oo
+|..X*.....oo
+|...........
+|...........
++-----------
+
+:8,sFedJ
+
+|..ef.......
+|...........
+|...........
+|..X........
+|...........
+|...O.....ab
+|..X*.....cd
+|...........
+|...........
++-----------
+
+;o_somewhere(a,b,c,d) && o_somewhere(e,f)
+
+
+Pattern J8
+
+|.....          defend when pressed
+|.....
+|..*X.
+|..O..
+|....X
+|.....
+|.....
++-----
+
+:8,sFedJ
+
+
+Pattern J9
+
+.X......           follow up the slide with extension
+X..O..*.
+.O......
+........
+--------
+
+:8,sFedJ
+
+
+Pattern J10
+
+|.xxx....???       cap the kogeima shimari with double wing formation
+|.xxx....???
+|.xxx....???
+|...........
+|...........
+|...........
+|..X.*......
+|........xxx
+|...X....xxx
+|........xxx
+|...........
++-----------
+
+:8,sFEj
+
+|.abc....???
+|.def....???
+|.ghi....???
+|...........
+|...........
+|...........
+|..X.*......
+|........jkl
+|...X....mnp
+|........qrs
+|...........
++-----------
+
+;x_alive_somewhere(a,b,c,d,e,f,g,h,i) && x_alive_somewhere(j,k,l,m,n,p,q,r,s)
+
+
+Pattern J11
+
+|.....      defend san san
+|.....
+|..*X.
+|..Ox.
+|.....
+|.....
++-----
+
+:8,sFedJ
+
+
+Pattern J12
+
+|.......        attach at 3-3 point
+|.......
+|..X.O..
+|..*....
+|.......
+|.......
++-------
+
+:8,sFedJ
+
+
+Pattern J13
+
+|.......        defend at 3-3
+|..X....
+|.......
+|.X.O...
+|..*..O.
+|.......
+|.......
++-------
+
+:8,sFedJ
+
+
+Pattern J14
+
+|.......   Joseki move
+|.......
+|.......
+|...*...
+|..O....
+|....X..
+|.......
+|.......
++-------
+
+:8,sFEadj
+
+
+Pattern J15
+
+|.......   Joseki move
+|.......
+|...*...
+|.......
+|..O....
+|....X..
+|.......
+|.......
++-------
+
+:8,sFEdj
+
+
+Pattern J16
+
+|.......   Joseki move
+|.......
+|.......
+|.......
+|..O.*..
+|....X..
+|.......
+|.......
++-------
+
+:8,sFEdj
+
+
+Pattern J17
+
+|..........   Joseki move
+|..........
+|..........
+|..O......o
+|....X.*..o
+|..........
+|..........
++----------
+
+:8,FEaj
+
+
+Pattern J18
+# pincer or attachment below X might be best in many cases
+
+|...X..             follow up the slide by taking the corner
+|..*..O
+|...O..
+|......
++------
+
+:8,Fedj,shape(-1)
+
+
+Pattern J19
+
+|.........    joseki move
+|...X*XO..
+|.....OX..
+|.........
+|.........
++---------
+
+:8,Fadj,shape(5)
+
+
+Pattern J20
+
+|.xx?????      make life in the corner
+|.Xx?????
+|.OXXxx??
+|.OOOX...
+|....*...
+|........
++--------
+
+:8,FedJ
+
+
+Pattern J21
+
+|..X.??          sente and not aji keshi
+|......
+|...X*.
+|..XO.O
+|..XO..
+|......
++------
+
+:8,FEdj
+
+
+Pattern J22
+
+|.xX.??          sente and not aji keshi
+|......
+|...X*.
+|..XO.O
+|..XOO.
+|...X..
++------
+
+:8,FEdj
+
+
+Pattern J23
+
+|..X.       both attack and defense          
+|....
+|.X.O
+|.*O.
+|....
+|....
++----
+
+:8,Fead,shape(2)
+
+
+Pattern J24
+
+|..X.X...     knight's move to defend
+|.....*..
+|...O....
+|........
+|........
++--------
+
+:8,FJ
+
+
+Pattern J25
+
+|..O.O...     enclose the opponent
+|........
+|...X.*..
+|........
+|........
+|........
++--------
+
+:8,FJ,value(30)
+
+
+Pattern J26
+
+|..X.X...     don't get enclosed!
+|........
+|...O.*..
+|........
+|........
+|........
++--------
+
+:8,FJ,value(30)
+
+
+Pattern J27
+
+|..X.???      limit X to small life in corner
+|....???
+|..*O.??
+|..XO.??
+|.......
+|.......
++-------
+
+:8,FU
+
+|..X.???
+|....???
+|..*O.ab
+|..XO.cd
+|.......
+|.......
++-------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern J28
+
+|..X.....
+|........
+|..*..???
+|...O.???
+|........
+|........
++--------
+
+:8,FJ
+
+|..X.....
+|........
+|..*..abc
+|...O.def
+|........
+|........
++--------
+
+; x_alive_somewhere(a,b,c,d,e,f)
+
+
+Pattern J29
+# The owl code should be able to read this out correctly now.
+
+|.xx???           Defend correctly (leaves ko)
+|.Xx???
+|.OXX??
+|.OOX??
+|...OXx
+|..*...
++------
+
+:8,F,value(35)
+
+|.xx???
+|.Xx???
+|.OXX??
+|.OOX??
+|..aOXx
+|..*...
++------
+
+> antisuji(a);
+
+
+Pattern J30
+
+?.....         block before cutting
+?..O..
+?O.OX.
+..*X..
+......
+......
+------
+
+:8,FadJ
+
+?.....
+?..O..
+?O.OX.
+..*Xa.
+......
+......
+------
+
+> antisuji(a)
+
+
+Pattern J31
+
+|...X.....          make bamboo joint
+|...*.O...
+|...O.OX..
+|...OXX...
+|.........
+|.........
++---------
+
+:8,FU
+
+
+Pattern J32
+
+|..X......          take corner to secure group when pressed
+|.........
+|.X.O.....
+|.*O..O.X.
+|.........
+|.........
++---------
+
+:8,FJ
+
+
+Pattern J33
+
+|..X....
+|...X...
+|..XO*..
+|..O..oo
+|.......
+|.......
++-------
+
+:8,FJ
+
+|..X....
+|...X...
+|..XO*..
+|..O..ab
+|.......
+|.......
++-------
+
+; o_alive_somewhere(a,b)
+
+
+Pattern J34
+
+|..X....         atari first
+|...X...
+|.*XO.O.
+|..O....
+|.......
+|.......
++-------
+
+:8,FJ
+
+
+Pattern J35
+
+|..X....        connect for safety
+|.xxX...
+|.OXO.O.
+|..O*...
+|.......
+|.......
++-------
+
+:8,FJ
+
+
+Pattern J36
+
+|..oo?      large!
+|...o?
+|...O?
+|..OXX
+|..*..
+|.....
++-----
+
+:8,Fadj
+
+
+Pattern J37
+
+|..oo??       seal the corner
+|...O??
+|....*X
+|....OX
+|......
++------
+
+:8,Ft
+
+|..oo??
+|...O??
+|....*X
+|....OX
+|.....a
++------
+
+> antisuji(a)
+
+
+Pattern J38
+
+|......         atari to build up the top
+|....*.
+|..OOX.
+|..OXO.
+|..XX..
+
+:8,FJ
+
+
+Pattern J39
+
+|.......        push again to build up the top
+|....O*.
+|..OOXX.
+|..OXO..
+|..XX...
+
+:8,Fj
+
+
+Pattern J40
+# db added (3.1.4)
+
+|..Xx.....
+|..o....x.       seal the side      
+|..oO.O...
+|..o..*.X.
+|.........
+|.........
++---------
+
+:8,FJ
+
+
+Pattern J41
+# db added (3.3.3)
+# see nngs1:48
+
+|......          Play the Joseki!
+|......
+|..*X..
+|..OX.O
+|......
+|......
++------
+
+:8,J
+
+|......
+|.....a
+|..*X..
+|..OX.O
+|......
+|......
++------
+
+> replace(a,*)
+
+
+Pattern J42
+# db added (3.3.6)
+# see strategy5:17
+
+|...XX??          attack positively
+|....OO.
+|..O....
+|.......
+|.......
+|..X....
+|...*...
+|..O....
+|.......
+
+:8,j
+
+|...XX??
+|....OO.
+|..O....
+|.......
+|.......
+|..X....
+|.a.*...
+|..O....
+|.......
+
+> replace(a,*)
+
+
+Pattern J43
+# db added (3.3.6)
+
++-------        attach to defend cut
+|.......
+|.......
+|..*XX.X
+|....OO.
+|..O....
+|...xxxx
+|...????
+
+:8,J
+
++-------
+|.......
+|.......
+|..*XX.X
+|....OO.
+|..O....
+|...abcd
+|...efgh
+
+; x_alive_somewhere(a,b,c,d,e,f,g,h)
+
+> replace(c,*);
+> replace(d,*)
+
+
+Pattern J44
+# added 3.3.12 evand
+
+?O....??         fixing this defect is often urgent
+XO.*..??
+xXO...??
+xx....??
+--------
+
+:8,j
+
+?O...ab?
+XO.*..??
+xcO...??
+xx....??
+--------
+
+; (!omoyo(a) || !omoyo(b)) && !attack(c)
+
+
+Pattern J45
+# added 3.3.12 evand
+
+???.....???          develop the side
+??o......??
+?oO........
+oO.....*...
+...........
+...........
+-----------
+
+:8,j
+
+
+Pattern J46
+# nn added 3.3.14
+
+------+            needed generalization of a hoshi.db pattern
+?.....|
+?.....|
+?.....|
+?.X...|
+...X..|
+.*XO..|
+..O...|
+......|
+
+:8,Jad
+
+
+Pattern J47
+# db added (3.3.14)
+
++-------        general hanetsugi
+|.......
+|...*...
+|..OX.O.
+|..OX.??
+|..ox.??
+|..??...
+
+:8,J
+
+
+Pattern J47b
+# db added (3.3.14)
+
++-------        general hanetsugi
+|.......
+|..*OX..
+|..OX.O.
+|..OX.??
+|..ox.??
+|..??...
+
+:8,J
+
+
+Pattern J48
+# db added (3.3.14)
+
++--------        stabilize the corner
+|........
+|..O.*...
+|..XO....
+|..X.....
+|...X....
+
+:8,J
+
+
+# END OF FILE
diff --git a/patterns/fuseki.dsp b/patterns/fuseki.dsp
new file mode 100644 (file)
index 0000000..dcee372
--- /dev/null
@@ -0,0 +1,105 @@
+# Microsoft Developer Studio Project File - Name="fuseki" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=fuseki - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "fuseki.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "fuseki.mak" CFG="fuseki - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "fuseki - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "fuseki - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "fuseki - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "fuseki___Win32_Release"\r
+# PROP BASE Intermediate_Dir "fuseki___Win32_Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /W3 /GX /O2 /I "." /I ".." /I "../sgf" /I "../engine" /I "../utils" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FD /c\r
+# SUBTRACT CPP /nologo /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 sgf.lib engine.lib utils.lib /nologo /subsystem:console /machine:I386 /out:"Release/extract_fuseki.exe" /libpath:"../sgf/Release/" /libpath:"../engine/Release/" /libpath:"../utils/Release/" /libpath:"./Release/"\r
+\r
+!ELSEIF  "$(CFG)" == "fuseki - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "fuseki___Win32_Debug"\r
+# PROP BASE Intermediate_Dir "fuseki___Win32_Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W3 /Gm /GX /Zi /Od /I "." /I ".." /I "../sgf" /I "../engine" /I "../utils" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FR /FD /GZ /c\r
+# SUBTRACT CPP /nologo /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /out:"Debug/extract_fuseki.exe" /pdbtype:sept\r
+# SUBTRACT LINK32 /incremental:no /nodefaultlib\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "fuseki - Win32 Release"\r
+# Name "fuseki - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\extract_fuseki.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/fuseki13.dbz b/patterns/fuseki13.dbz
new file mode 100644 (file)
index 0000000..5986897
--- /dev/null
@@ -0,0 +1,864 @@
+F-H0-1 93 dj
+F-H0-2 80 jc
+F-H0-3 29 kc
+F-H0-4 9 gg
+F-H0-5 5 ek
+F-H0-6 2 id
+F-H0-7 1 df
+F-H0-8 27 djkd
+F-H0-9 15 kdjk
+F-H0-10 12 ckjc
+F-H0-11 12 djkj
+F-H0-12 7 jijk
+F-H0-13 5 djjk
+F-H0-14 4 cckd
+F-H0-15 4 kdcj
+F-H0-16 4 kjkd
+F-H0-17 4 kkkd
+F-H0-18 3 kddk
+F-H0-19 3 ggjc
+F-H0-20 3 eckd
+F-H0-21 3 ikkj
+F-H0-22 2 jijc
+F-H0-23 1 cejc
+F-H0-24 1 jkjc
+F-H0-25 1 jckd
+F-H0-26 1 kikd
+F-H0-27 1 ijcd
+F-H0-28 24 cjjd
+F-H0-29 22 djjd
+F-H0-30 14 jddd
+F-H0-31 13 jkdj
+F-H0-32 7 ckjd
+F-H0-33 4 cjjj
+F-H0-34 3 iddj
+F-H0-35 3 kfjd
+F-H0-36 3 ekjd
+F-H0-37 2 kcjj
+F-H0-38 1 kdjd
+F-H0-39 1 dejd
+F-H0-40 1 dedj
+F-H0-41 1 ggjd
+F-H0-42 1 kcjd
+F-H0-43 15 jkdjkd
+F-H0-44 7 dkddkj
+F-H0-45 5 ddjddk
+F-H0-46 5 cddjkd
+F-H0-47 2 icdjkd
+F-H0-48 2 kkdjkd
+F-H0-49 2 dddjjc
+F-H0-50 1 ggdjjc
+F-H0-51 1 kkjdcj
+F-H0-52 1 fkdjkd
+F-H0-53 1 ijdjjc
+F-H0-54 6 kjgg
+F-H0-55 5 ddgg
+F-H0-56 3 ckgg
+F-H0-57 2 kegg
+F-H0-58 1 jggg
+F-H0-59 1 kfgg
+F-H0-60 1 kggg
+F-H0-61 1 jegg
+F-H0-62 14 jkdjjd
+F-H0-63 13 djddjj
+F-H0-64 5 jkjddj
+F-H0-65 2 ikdjjd
+F-H0-66 2 jijddj
+F-H0-67 1 jgdjjd
+F-H0-68 1 khjjdd
+F-H0-69 1 kcjddj
+F-H0-70 1 kkjddj
+F-H0-71 1 ggjjdd
+F-H0-72 4 ekcjgg
+F-H0-73 3 ijkjgg
+F-H0-74 1 gkkdgg
+F-H0-75 1 jkjcgg
+F-H0-76 1 kckdgg
+F-H0-77 1 kkkdgg
+F-H0-78 1 gkkjgg
+F-H0-79 1 gcjcgg
+F-H0-80 1 kkjcgg
+F-H0-81 1 kdkjgg
+F-H0-82 1 djjcgg
+F-H0-83 1 jckdgg
+F-H0-84 1 jjjcgg
+F-H0-85 6 cdkk
+F-H0-86 6 djkc
+F-H0-87 5 kdkk
+F-H0-88 3 ggkc
+F-H0-89 2 kccc
+F-H0-90 2 jdkc
+F-H0-91 1 ckkc
+F-H0-92 1 kick
+F-H0-93 1 jkkc
+F-H0-94 1 idck
+F-H0-95 6 ddjkdj
+F-H0-96 5 cjdcjd
+F-H0-97 5 ijkjjd
+F-H0-98 4 dkjcdd
+F-H0-99 3 jjjcdd
+F-H0-100 2 kccddj
+F-H0-101 1 cijcdd
+F-H0-102 1 dkkdjj
+F-H0-103 1 kijkdj
+F-H0-104 1 ikdcjd
+F-H0-105 5 jjdkjd
+F-H0-106 5 jjcjjd
+F-H0-107 5 jkcjjd
+F-H0-108 3 ekcjjd
+F-H0-109 3 cjcdjj
+F-H0-110 2 cccjjd
+F-H0-111 2 kjdkjd
+F-H0-112 2 didkjd
+F-H0-113 2 ckkjdd
+F-H0-114 2 cedkjd
+F-H0-115 1 edkddj
+F-H0-116 3 dcjkdjjd
+F-H0-117 2 edjkdjjd
+F-H0-118 2 ccjkdjjd
+F-H0-119 2 ecjkdjjd
+F-H0-120 2 ijkjjddj
+F-H0-121 1 ekjjddcj
+F-H0-122 1 jjjddjcd
+F-H0-123 7 jdjjdddj
+F-H0-124 4 dcjjdjjd
+F-H0-125 1 kcjjddjd
+F-H0-126 1 khjjjddj
+F-H0-127 7 dcjkcj
+F-H0-128 5 cjdckd
+F-H0-129 2 dkdckd
+F-H0-130 2 kkcjdc
+F-H0-131 2 jjdckd
+F-H0-132 1 icdckd
+F-H0-133 1 khkdjk
+F-H0-134 1 djdckd
+F-H0-135 3 ejcjjjdc
+F-H0-136 2 kkkddjdc
+F-H0-137 2 jjdkjdcd
+F-H0-138 2 cekddjdc
+F-H0-139 1 didkjdcd
+F-H0-140 1 kijkddkd
+F-H0-141 1 djdkddkj
+F-H0-142 1 ekjkddkd
+F-H0-143 1 dkjkddkd
+F-H0-144 5 cjkdjjdc
+F-H0-145 2 ddjkdjkd
+F-H0-146 2 jecddjjc
+F-H0-147 1 cidkjdkj
+F-H0-148 1 kjcjjddc
+F-H0-149 1 ccjkdjkd
+F-H0-150 1 ejjkddcj
+F-H0-151 5 dcjjcj
+F-H0-152 4 ikdjkj
+F-H0-153 2 cdjjcj
+F-H0-154 1 ikddkd
+F-H0-155 1 ckddkd
+F-H0-156 1 jjdjdc
+F-H0-157 1 cddjkj
+F-H0-158 1 jhjjjc
+F-H0-159 2 didkjddd
+F-H0-160 2 ikdkjddd
+F-H0-161 2 ddjjdjjc
+F-H0-162 1 ijdkjddd
+F-H0-163 1 dkjkddjd
+F-H0-164 4 kfjdjjcddj
+F-H0-165 2 ckdjjjdcjd
+F-H0-166 2 cedjjjdcjd
+F-H0-167 1 idkdjjdddj
+F-H0-168 1 gdjjjdcjdd
+F-H0-169 1 gkdjjjdcjd
+F-H0-170 1 fjdjjjdcjd
+F-H0-171 2 jdddgg
+F-H0-172 1 gkjdgg
+F-H0-173 1 gcjdgg
+F-H0-174 1 jkddgg
+F-H0-175 1 jcjdgg
+F-H0-176 1 djjdgg
+F-H0-177 1 kfjdgg
+F-H0-178 4 djjjjd
+F-H0-179 3 jkdddj
+F-H0-180 2 jjddjd
+F-H0-181 2 dkjddd
+F-H0-182 1 ckddjd
+F-H0-183 1 jcdddj
+F-H0-184 3 icdjjkdckd
+F-H0-185 2 cedjjkdckd
+F-H0-186 1 dedjjkdckd
+F-H0-187 1 fkkjcddjjc
+F-H0-188 1 khkdjkddcj
+F-H0-189 1 hdjkcjjddc
+F-H0-190 1 ekdjjkdckd
+F-H0-191 1 jhkdjkddcj
+F-H0-192 1 idjjkdcjdc
+F-H0-193 1 jgkjcddjjc
+F-H0-194 2 cdckkd
+F-H0-195 2 icckkd
+F-H0-196 1 jkckkd
+F-H0-197 1 jdkcdk
+F-H0-198 1 kkckjc
+F-H0-199 1 djccjk
+F-H0-200 1 kekccj
+F-H0-201 1 dcckkd
+F-H0-202 1 ekckkd
+F-H0-203 1 kekkdc
+F-H0-204 1 ddkcdk
+F-H0-205 3 dkccjj
+F-H0-206 3 jjckjd
+F-H0-207 2 cdckjd
+F-H0-208 1 djckjd
+F-H0-209 1 ciccjj
+F-H0-210 1 kkkcdj
+F-H0-211 1 jejkdddj
+F-H0-212 1 djjdjjdc
+F-H0-213 1 dikjddjd
+F-H0-214 1 kjdddjjc
+F-H0-215 3 keggjc
+F-H0-216 2 jkggkd
+F-H0-217 2 kjggjc
+F-H0-218 1 kgggkd
+F-H0-219 1 kkggjc
+F-H0-220 3 jcdjjkdd
+F-H0-221 2 ckjdkjdd
+F-H0-222 2 cdjjdkjd
+F-H0-223 1 kgjjdcjd
+F-H0-224 1 cijdkjdd
+F-H0-225 1 chjjkddj
+F-H0-226 2 fkdjjkdcjd
+F-H0-227 1 fjdjjkdcjd
+F-H0-228 1 dedjjkdcjd
+F-H0-229 1 kidjjkdcjd
+F-H0-230 1 kijjkdcjdd
+F-H0-231 1 cedjjkdcjd
+F-H0-232 1 ckdjjkdcjd
+F-H0-233 1 bddjjkdcjd
+F-H0-234 1 dfdkjkddkd
+F-H0-235 1 fcdkjkddkd
+F-H0-236 1 hcdkjkddkd
+F-H0-237 1 icdkjkddkd
+F-H0-238 4 jccdkk
+F-H0-239 3 ccdkkc
+F-H0-240 1 ejcjkc
+F-H0-241 1 ijcjkc
+F-H0-242 1 ggdkkc
+F-H0-243 5 jcckkj
+F-H0-244 2 dckcjk
+F-H0-245 2 djcckd
+F-H0-246 1 didkjkddjd
+F-H0-247 1 chkjkddjdd
+F-H0-248 1 cidkjkddjd
+F-H0-249 1 khdkjkddjd
+F-H0-250 2 ijkjdddjjc
+F-H0-251 1 kgkdjkdddj
+F-H0-252 1 jgkdjkdddj
+F-H0-253 1 kfkjdddjjc
+F-H0-254 2 jccjjkdc
+F-H0-255 2 ckjkdckd
+F-H0-256 1 dicdkjjc
+F-H0-257 1 jdcjjkdc
+F-H0-258 1 icjkdckd
+F-H0-259 1 jhjkdkkdddhc
+F-H0-260 1 ekjkjdcjcdkh
+F-H0-261 1 khjkdkkdddhc
+F-H0-262 1 jijkdkkdddhc
+F-H0-263 3 cjdcjc
+F-H0-264 2 dckjkd
+F-H0-265 1 cejcdc
+F-H0-266 3 jkdjkc
+F-H0-267 2 ddjdck
+F-H0-268 1 kkdjkc
+F-H0-269 1 dcdjkc
+F-H0-270 3 hjjijk
+F-H0-271 2 kejejc
+F-H0-272 1 jjjejc
+F-H0-273 1 cgdidk
+F-H0-274 1 dkcdkkjc
+F-H0-275 1 kecdkkjc
+F-H0-276 1 ckjkcckd
+F-H0-277 1 edkjckjc
+F-H0-278 1 kjkdckdc
+F-H0-279 1 bhjkcckd
+F-H0-280 1 jjkdddic
+F-H0-281 1 kcikdjkj
+F-H0-282 1 kjkdddic
+F-H0-283 1 jikdddic
+F-H0-284 1 jkcdjdec
+F-H0-285 1 djkdddic
+F-H0-286 1 dkekcjgg
+F-H0-287 1 kgggkdic
+F-H0-288 1 hdggjcke
+F-H0-289 1 jeggjcke
+F-H0-290 4 jcdjkjdd
+F-H0-291 1 jijddkdd
+F-H0-292 1 ddjjcjjd
+F-H0-293 1 ccjjcjjd
+F-H0-294 2 cjjdkjcd
+F-H0-295 1 ckjdkjcd
+F-H0-296 1 kjdkjcdd
+F-H0-297 1 ekjkdcjd
+F-H0-298 4 kfjdjjdddj
+F-H0-299 1 ggjjdjjddd
+F-H0-300 2 kkcjdcjd
+F-H0-301 2 jdjkcjdd
+F-H0-302 1 chdjcdjc
+F-H0-303 1 kicjdcjd
+F-H0-304 2 gjjjjddjddkf
+F-H0-305 1 dcjjdjjdddfc
+F-H0-306 1 fifkdjjjddjd
+F-H0-307 1 ebjjdjjdddfc
+F-H0-308 1 kkjjdjjdddfc
+F-H0-309 1 hdggkc
+F-H0-310 1 ccggkc
+F-H0-311 1 ckggkc
+F-H0-312 4 ecdkjjcdjd
+F-H0-313 1 jkcjjjdcjd
+F-H0-314 1 cecjjjdcjd
+F-H0-315 1 kcicgg
+F-H0-316 1 kdicgg
+F-H0-317 1 jjicgg
+F-H0-318 1 gckegg
+F-H0-319 1 dkjjjcgg
+F-H0-320 1 ekjjjcgg
+F-H0-321 2 djkkkd
+F-H0-322 2 kjccjc
+F-H0-323 1 jcckjk
+F-H0-324 1 cjkkkd
+F-H0-325 1 cddkkd
+F-H0-326 1 ickddk
+F-H0-327 1 cckddk
+F-H0-328 1 cdcjjc
+F-H0-329 1 kicdjk
+F-H0-330 1 jjdkkd
+F-H0-331 3 kkkddjic
+F-H0-332 2 kjkddjic
+F-H0-333 1 jjkddjic
+F-H0-334 1 ddkjggjc
+F-H0-335 1 kekjggjc
+F-H0-336 1 dcjkggkd
+F-H0-337 1 djkjggjc
+F-H0-338 1 ckjkggkd
+F-H0-339 2 dedkjkdcjd
+F-H0-340 1 ekkjjdcjcd
+F-H0-341 1 chkjjdcjcd
+F-H0-342 1 ejkjjdcjcd
+F-H0-343 1 cdjkkddj
+F-H0-344 1 khjjdckd
+F-H0-345 1 icjjdckd
+F-H0-346 1 hckjdkjd
+F-H0-347 1 ckjjdckd
+F-H0-348 1 dddkjjjcgg
+F-H0-349 1 dckjdjjd
+F-H0-350 1 ddkjdjjd
+F-H0-351 1 ckjjddkd
+F-H0-352 1 cejkjddj
+F-H0-353 1 didkddjj
+F-H0-354 1 kcggkdjc
+F-H0-355 3 cjjkkddc
+F-H0-356 1 iccjdckd
+F-H0-357 1 kkcjdckd
+F-H0-358 1 cijjdkggjcdd
+F-H0-359 1 gdcidkjdkjdd
+F-H0-360 1 gjekcjjjdcjd
+F-H0-361 1 ijikkjdjjcdd
+F-H0-362 1 gkikkjdjjcdd
+F-H0-363 1 dcjjdkjdcdec
+F-H0-364 2 jjggddjd
+F-H0-365 1 gcjjjdgg
+F-H0-366 2 jddjjk
+F-H0-367 1 dcjjkd
+F-H0-368 1 jjjddc
+F-H0-369 1 ikddjc
+F-H0-370 1 hcdkjjciggjcdd
+F-H0-371 1 cidkjjkeggjcdd
+F-H0-372 1 cgdkjjciggjcdd
+F-H0-373 2 dckdcj
+F-H0-374 2 jdcdkj
+F-H0-375 1 jkdkjc
+F-H0-376 1 kkdckc
+F-H0-377 1 jjcjcc
+F-H0-378 1 ckdckc
+F-H0-379 1 dkkjkc
+F-H0-380 1 djkdkk
+F-H0-381 2 kjjddkcd
+F-H0-382 1 ccjkcjjd
+F-H0-383 1 iddkkjdd
+F-H0-384 1 jdjjdccj
+F-H0-385 2 cjek
+F-H0-386 2 dcke
+F-H0-387 1 djic
+F-H0-388 1 ldkcggjckd
+F-H0-389 1 jdkdggkcjc
+F-H0-390 2 kjkddjcd
+F-H0-391 1 cckjjdcj
+F-H0-392 1 edjkdjjc
+F-H0-393 1 jdcjjj
+F-H0-394 1 djjkjd
+F-H0-395 1 kdjcjj
+F-H0-396 1 jijkjd
+F-H0-397 1 ikkjdj
+F-H0-398 2 chjjjddjcd
+F-H0-399 1 fcdjjkddjd
+F-H0-400 1 khdjjkddjd
+F-H0-401 1 jedjjjddjc
+F-H0-402 2 cededcjd
+F-H0-403 1 jkijkjjd
+F-H0-404 1 gddedcjd
+F-H0-405 1 kgdjjkji
+F-H0-406 1 gcickd
+F-H0-407 1 iiikkj
+F-H0-408 1 jfickd
+F-H0-409 1 jkickd
+F-H0-410 1 gkjjdjkddchc
+F-H0-411 1 cfkfkjdddjjc
+F-H0-412 1 kgkeggjc
+F-H0-413 1 kjkdggic
+F-H0-414 1 kgkdggic
+F-H0-415 2 djjjggddjd
+F-H0-416 1 kcjjdkjdcd
+F-H0-417 1 edjjdkjdcd
+F-H0-418 1 ckdjjkddkd
+F-H0-419 1 cidjjkddkd
+F-H0-420 1 ikkkjddjcd
+F-H0-421 1 fkdjjkccjd
+F-H0-422 1 dddjjkccjd
+F-H0-423 1 ckkkjddjcd
+F-H0-424 1 chkjkddjcd
+F-H0-425 1 cedjjkdcjc
+F-H0-426 1 gkdkjkddjc
+F-H0-427 1 kfdkjkddjc
+F-H0-428 1 dhfkdjjjdcjd
+F-H0-429 1 khjjjddjcdkf
+F-H0-430 1 jhkhjjjdcjdd
+F-H0-431 1 cffkdjjjdcjd
+F-H0-432 1 echcjd
+F-H0-433 1 jhkhjj
+F-H0-434 1 ddkfjd
+F-H0-435 1 djkfjd
+F-H0-436 2 ckkdkjdc
+F-H0-437 1 dkkdkjdc
+F-H0-438 2 dcdjjkjd
+F-H0-439 1 cfjjjcdd
+F-H0-440 1 cjjjjcdd
+F-H0-441 1 kijkdjkddcic
+F-H0-442 1 hkjkdjkddcic
+F-H0-443 1 jijkdjkddcic
+F-H0-444 2 jkeckd
+F-H0-445 1 kckejk
+F-H0-446 2 kgdjjjggddjd
+F-H0-447 1 hkjjdjggjddd
+F-H0-448 1 chjjdjggjddd
+F-H0-449 1 ichdggkc
+F-H0-450 1 kehdggkc
+F-H0-451 1 jdjfggkc
+F-H0-452 1 gcjfggkc
+F-H0-453 2 khijkjgg
+F-H0-454 1 keggjcje
+F-H0-455 2 dkkkcdjc
+F-H0-456 1 kijkcjkc
+F-H0-457 3 dddjjjjd
+F-H0-458 1 chdjddjd
+F-H0-459 1 kikgggkdic
+F-H0-460 1 ddjcgggcke
+F-H0-461 1 ikkjkcdd
+F-H0-462 1 jkcjccjd
+F-H0-463 1 ccdjkkkd
+F-H0-464 1 djckjdkjdd
+F-H0-465 1 gfkdjjccdj
+F-H0-466 1 kecdjjkcdj
+F-H0-467 2 cddjjkecjd
+F-H0-468 1 fkdjjkecjd
+F-H0-469 1 bcdjjjcgcedcjd
+F-H0-470 1 eedjjjcgcedcjd
+F-H0-471 2 cidkccjj
+F-H0-472 1 dckjckjd
+F-H0-473 1 fidkjkcididdjd
+F-H0-474 1 chdkjkcididdjd
+F-H0-475 1 cjdkjkcididdjd
+F-H0-476 1 cihkjkdkkhddjd
+F-H0-477 1 chhkjkdkkhddjd
+F-H0-478 1 fkhkjkdkkhddjd
+F-H0-479 1 fkjjdjjgdcjd
+F-H0-480 1 ekjdjjgdcjdd
+F-H0-481 1 hcidggkckdjcjd
+F-H0-482 1 hdjeggkdjdkcjc
+F-H0-483 1 kkjdckdd
+F-H0-484 1 ddjjckjd
+F-H0-485 1 cdjjckjd
+F-H0-486 1 cikjdkjcdd
+F-H0-487 1 ejcjjkdcjd
+F-H0-488 1 cidkjdkjcd
+F-H0-489 2 cgjjdjcedcjd
+F-H0-490 1 kicjdcjc
+F-H0-491 1 jkcjdcjc
+F-H0-492 1 dcjkdkjd
+F-H0-493 1 jcjjcdcj
+F-H0-494 1 cijkdkjd
+F-H0-495 1 ikijkjdddjjc
+F-H0-496 1 cgjjdjdedckd
+F-H0-497 1 jfjkkddjddid
+F-H0-498 1 ccdjjjggjddd
+F-H0-499 1 cgggjjjddjdd
+F-H0-500 1 gkjjjddjddgg
+F-H0-501 2 jkiddj
+F-H0-502 1 dkdijd
+F-H0-503 3 dcjkdjkc
+F-H0-504 1 gkkcgg
+F-H0-505 1 gckcgg
+F-H0-506 1 ikckgg
+F-H0-507 1 lcggjdkekckd
+F-H0-508 1 kdggjdjckcic
+F-H0-509 1 kjikdkjddd
+F-H0-510 1 ckekjkddjd
+F-H0-511 2 ecdkkkcdjc
+F-H0-512 1 idjkckkddc
+F-H0-513 1 kgggjdgc
+F-H0-514 1 djggjdgc
+F-H0-515 2 kdkkdj
+F-H0-516 1 dkkcjj
+F-H0-517 1 dkkjkdgg
+F-H0-518 1 djggkjkd
+F-H0-519 1 ekjjcjejdc
+F-H0-520 1 ijdidkddkj
+F-H0-521 1 hdjjcdjejc
+F-H0-522 1 chcdkkkcdj
+F-H0-523 1 cidkjjcckc
+F-H0-524 2 eckkkddj
+F-H0-525 1 kjjdcjcc
+F-H0-526 1 ikkjkfdjddcfjc
+F-H0-527 1 dfchjkkddjddkh
+F-H0-528 1 ehchjkkddjddkh
+F-H0-529 1 dddkjjdcjd
+F-H0-530 1 gdjkdjjcdd
+F-H0-531 1 dedkjjdcjd
+F-H0-532 2 cekkcjdcjd
+F-H0-533 1 ddkjdkccjd
+F-H0-534 1 cijkdkdiddjd
+F-H0-535 1 hjdkjkjikdddhc
+F-H0-536 1 kgdkjkjikdddhc
+F-H0-537 1 gkdkjkjikdddhc
+F-H0-538 2 fcjjdjddjd
+F-H0-539 1 hjjjdjddjd
+F-H0-540 2 cdkkkcdj
+F-H0-541 1 fcjcgghcje
+F-H0-542 1 kgjcgghcje
+F-H0-543 1 djkjijkhgg
+F-H0-544 2 ekcjjkkddc
+F-H0-545 1 cdjkcjdckd
+F-H0-546 1 kcggjdjc
+F-H0-547 1 ddkkdjcckd
+F-H0-548 1 cekkdjcckd
+F-H0-549 1 ickkdjcckd
+F-H0-550 1 ckekjd
+F-H0-551 1 jjcijd
+F-H0-552 1 ikcijd
+F-H0-553 1 icjdggkcjc
+F-H0-554 1 cjjkkcdc
+F-H0-555 1 ekcjkkkd
+F-H0-556 1 ckjkkcdc
+F-H0-557 2 ikkjccjc
+F-H0-558 1 ckkdkkdc
+F-H0-559 2 kkjkjihj
+F-H0-560 1 kkjfidkd
+F-H0-561 1 eckkcdcjjc
+F-H0-562 1 djckkdkjdc
+F-H0-563 1 deckkdkjdc
+F-H0-564 1 diekcjjd
+F-H0-565 1 ejekcjjd
+F-H0-566 1 kjcidkjd
+F-H0-567 2 dcjkckjc
+F-H0-568 1 jjkdckcd
+F-H0-569 1 jkdjkcdc
+F-H0-570 1 kkjdckcd
+F-H0-571 1 fkdjjkdckc
+F-H0-572 1 cedjjkdckc
+F-H0-573 1 kidjjkdckc
+F-H0-574 1 hkjkdkkhddjd
+F-H0-575 1 kijkeckd
+F-H0-576 1 idjkeckd
+F-H0-577 1 jijkeckd
+F-H0-578 1 ddikdjjd
+F-H0-579 1 dcikdjjd
+F-H0-580 1 keggjcgc
+F-H0-581 1 cjggjcgc
+F-H0-582 1 dekkkddjic
+F-H0-583 1 jjdjkeccjc
+F-H0-584 1 dckkcjkc
+F-H0-585 1 cfkcdkcc
+F-H0-586 1 gkkggg
+F-H0-587 1 jjkggg
+F-H0-588 1 jeggkdjdkcjc
+F-H0-589 1 hclcggkcldjckd
+F-H0-590 1 hblcggkcldjckd
+F-H0-591 1 ekckdkdjjjdhfjdcjd
+F-H0-592 1 dkkikgggkdic
+F-H0-593 1 dkggjckegcec
+F-H0-594 1 cickjjcdjd
+F-H0-595 1 gjcjjjccjd
+F-H0-596 1 flikekfkdjfidcjd
+F-H0-597 1 dgikekfkdjfidcjd
+F-H0-598 1 hcdjjjjdddfc
+F-H0-599 1 ekfkdjjjjddd
+F-H0-600 1 gfkekfkdjejc
+F-H0-601 1 jfkekfkdjejc
+F-H0-602 1 jfdjjkjikcdc
+F-H0-603 1 ikijckjdkjcd
+F-H0-604 1 edkkdkcdkd
+F-H0-605 1 cekkdkdckd
+F-H0-606 2 kikdckic
+F-H0-607 1 idkkkddjdc
+F-H0-608 1 cickjkddkd
+F-H0-609 1 dkjjicgg
+F-H0-610 1 cjckdjjjdcjd
+F-H0-611 1 iddkcfkjkdchdc
+F-H0-612 1 jhkkcddjkcch
+F-H0-613 1 didkkdjj
+F-H0-614 1 kkjjdkkd
+F-H0-615 1 kfchjjjddjdc
+F-H0-616 1 ijfkdjkjddjd
+F-H0-617 2 jcckkjdd
+F-H0-618 1 dhckkdjjcd
+F-H0-619 1 ekjdkjcccj
+F-H0-620 2 cejkdkdedcjd
+F-H0-621 1 cfkkkdckdc
+F-H0-622 1 icckjkcckd
+F-H0-623 1 bkdkjkcgciddjd
+F-H0-624 1 ejcjjjcd
+F-H0-625 1 djkjddkd
+F-H0-626 1 kidjcckd
+F-H0-627 1 kkdjcckd
+F-H0-628 1 chcfdkkdkjdc
+F-H0-629 1 dkdjkkjdckcd
+F-H0-630 2 eedjjkcgcedckd
+F-H0-631 1 hkdjjkjikddcic
+F-H0-632 1 kidjjkjikddcic
+F-H0-633 2 kkdkdckd
+F-H0-634 1 kgckjkdcjc
+F-H0-635 1 ceckjkdcjc
+F-H0-636 1 hekdggjdjckcic
+F-H0-637 1 kfkdggjdjckcic
+F-H0-638 1 hdgjjjjddjddkf
+F-H0-639 1 hkgjjjjddjddkf
+F-H0-640 1 lhjhkkcddjkcch
+F-H0-641 1 edjhkkcddjkcch
+F-H0-642 1 ekikdjfkdcjd
+F-H0-643 1 cffkdkjjciggkeddjchc
+F-H0-644 1 cikjdkggkddc
+F-H0-645 1 ekjkcjggjccd
+F-H0-646 1 ejkkdjdkjdckcd
+F-H0-647 2 kfkejejc
+F-H0-648 1 jijkdjdcjd
+F-H0-649 1 cejkdjdcjd
+F-H0-650 2 chdkdicijd
+F-H0-651 1 jikjkijjkdcjdd
+F-H0-652 1 hhkikjjijjihcjkdiidd
+F-H0-653 1 dkdjck
+F-H0-654 1 kkjdkc
+F-H0-655 1 hikjkijjjicjihiikdhhdd
+F-H0-656 1 ijkjkijjjicjihiikdhhdd
+F-H0-657 1 dhjkdjfkddjd
+F-H0-658 1 ecchjjjddjcd
+F-H0-659 1 cjdkjjkdggicdd
+F-H0-660 1 cidkjjkdggicdd
+F-H0-661 1 khkdjkcdcj
+F-H0-662 1 ekjkcjjcdc
+F-H0-663 1 kfcfdkkdkjidchdc
+F-H0-664 1 kgcfdkkdkjidchdc
+F-H0-665 1 cjejkkdjdkjdckcd
+F-H0-666 1 biejkkdjdkjdckcd
+F-H0-667 2 dejkdjjdeccd
+F-H0-668 1 ekcjjkjddd
+F-H0-669 1 edjjdjcdjc
+F-H0-670 1 cgckggkcgccc
+F-H0-671 1 kgckggkccgcc
+F-H0-672 1 cfdkkdkjdc
+F-H0-673 1 kcjkjedjddjc
+F-H0-674 1 hkjkdjddjijc
+F-H0-675 2 cididkjd
+F-H0-676 1 cfcededcjd
+F-H0-677 1 jjikijkjjd
+F-H0-678 1 jijkcjekkddc
+F-H0-679 1 gjjkcjekkddc
+F-H0-680 1 gkjkiddj
+F-H0-681 1 didkedjj
+F-H0-682 1 ljdkjkkhkdddhc
+F-H0-683 1 eifkjkjdcjcdkh
+F-H0-684 1 kjkijjkdcjdd
+F-H0-685 1 cjjjjddc
+F-H0-686 1 jjdjddjc
+F-H0-687 1 ekdkdjckcjjjdcjd
+F-H0-688 1 cfjjdjkgggddjd
+F-H0-689 1 fkdjjjcgggjddd
+F-H0-690 1 chdjcdkc
+F-H0-691 1 kjckdcjd
+F-H0-692 1 dcijdjjc
+F-H0-693 1 ccijdjjc
+F-H0-694 1 ejekdkdjckcjjjdcjd
+F-H0-695 1 bidkckkjcjdjjdcidd
+F-H0-696 1 jiikkjccjc
+F-H0-697 1 ecckjkickd
+F-H0-698 1 ecdkkjcdjd
+F-H0-699 1 didkddkjjc
+F-H0-700 1 ekjkdjfkdcjd
+F-H0-701 1 ickhjjkdcjdd
+F-H0-702 1 eicidkccjj
+F-H0-703 1 deckjdcedc
+F-H0-704 2 jijkdjkcdc
+F-H0-705 1 jkcjkddc
+F-H0-706 1 icjkcjkd
+F-H0-707 1 kikkgkckggkcgc
+F-H0-708 1 kgckgkkcggccgc
+F-H0-709 1 kdjkddck
+F-H0-710 1 ddkkdjkd
+F-H0-711 2 klkkjkjihj
+F-H0-712 1 ecdkkkcdkc
+F-H0-713 1 decjkkdckc
+F-H0-714 1 kejjdkggciddjchc
+F-H0-715 1 fcggickc
+F-H0-716 1 jfjkkdcjddiegcic
+F-H0-717 1 gcjkdjeecgcedckd
+F-H0-718 1 kikkikdkjddd
+F-H0-719 1 chjkekckddjd
+F-H0-720 1 cddjjkidkd
+F-H0-721 1 hddjcdjejc
+F-H0-722 1 kgkjgkcjggjcgc
+F-H0-723 1 kkcejcdc
+F-H0-724 1 dkkedcjc
+F-H0-725 2 dfdkjkcecfcddedcjd
+F-H0-726 1 gcgkkggg
+F-H0-727 1 gdgkkggg
+F-H0-728 1 jkkgkdggic
+F-H0-729 1 jkggkegcjc
+F-H0-730 1 djkkjdckcd
+F-H0-731 1 cbjjdjcecgjcdcbc
+F-H0-732 1 gkjkdkbkcgciddjd
+F-H0-733 1 kdkkcjdc
+F-H0-734 1 icckdckd
+F-H0-735 2 cdjkdkcfcededcjd
+F-H0-736 1 fjikkjckjcdd
+F-H0-737 1 kgdjjkickdcc
+F-H0-738 2 jdjjggdjdd
+F-H0-739 1 dedcke
+F-H0-740 1 jcdcke
+F-H0-741 1 fkdjikdcjd
+F-H0-742 1 cfjkcjekdckc
+F-H0-743 1 gdkkdkjccdec
+F-H0-744 1 icdkkjkdgg
+F-H0-745 1 dcdkkjkdgg
+F-H0-746 1 iikikjjijjkdcjdd
+F-H0-747 2 dkkjcdjd
+F-H0-748 2 cicddkkcjj
+F-H0-749 1 dfjddkeccd
+F-H0-750 1 eddjkdcedc
+F-H0-751 1 kdggkgkejdgc
+F-H0-752 1 jeggkgkejdgc
+F-H0-753 1 jddi
+F-H0-754 1 kdid
+F-H0-755 1 lcggkcldjckd
+F-H0-756 1 bididkchcijd
+F-H0-757 1 cjdidkchcijd
+F-H0-758 1 jkkidjjccc
+F-H0-759 1 gkkdkkecdj
+F-H0-760 2 cjicjkdckd
+F-H0-761 1 ihkjkijjjicjkdiidd
+F-H0-762 1 jkggidjfkckdjcjd
+F-H0-763 1 dkggjejdkdhdkcjc
+F-H0-764 1 jdcjjkkcdc
+F-H0-765 1 ekkkcjdckd
+F-H0-766 1 kekgggjdgc
+F-H0-767 2 djggjjdd
+F-H0-768 1 dcjjdjkc
+F-H0-769 1 fjckjddd
+F-H0-770 1 fiekikdjfkdcjd
+F-H0-771 1 cijkdkdfcecfcddedcjd
+F-H0-772 1 fcjkdkdfcecfcddedcjd
+F-H0-773 1 ddjijc
+F-H0-774 1 kejijc
+F-H0-775 1 cgckjkdckd
+F-H0-776 1 hcckjkdckd
+F-H0-777 1 cdkjkddjic
+F-H0-778 1 edkjkddjic
+F-H0-779 1 gkjjdkcikeggjcdd
+F-H0-780 2 fkdjkjddjd
+F-H0-781 1 fkdkjjciggkeddjchc
+F-H0-782 1 gkjkdjkidcjd
+F-H0-783 1 hcjkdjkidcjd
+F-H0-784 1 dkkkcdkejc
+F-H0-785 1 jekkcdkejc
+F-H0-786 1 dcijdjjd
+F-H0-787 1 dddjjdji
+F-H0-788 1 djjkjcgg
+F-H0-789 1 cjjkjcgg
+F-H0-790 1 jbicggfckc
+F-H0-791 1 dcicggfckc
+F-H0-792 1 jidjjkkijd
+F-H0-793 1 kcekjjddcj
+F-H0-794 2 kdkfkejejc
+F-H0-795 1 cjjkddgg
+F-H0-796 1 jjggdjjc
+F-H0-797 1 dddkjjicgg
+F-H0-798 1 deckkdkiic
+F-H0-799 1 kkckkdkiic
+F-H0-800 1 kcjkccdj
+F-H0-801 1 cddkkcjj
+F-H0-802 1 ckdkdjjjdhfjdcjd
+F-H0-803 1 kkkeggjcgc
+F-H0-804 1 jjkeggjcgc
+F-H0-805 1 ecdkkjcdkejc
+F-H0-806 1 jijkiccjdckd
+F-H0-807 2 kjklkkjkjihj
+F-H0-808 1 jhhkjjckkddcic
+F-H0-809 1 kfkhdkcdjjkcci
+F-H0-810 1 kjggjd
+F-H0-811 1 cdggjd
+F-H0-812 1 cekicjdcjc
+F-H0-813 1 cdkjdkeckd
+F-H0-814 2 jkdjddjijc
+F-H0-815 2 khdkcdjjkcci
+F-H0-816 1 gcjjdjeecgcedcjd
+F-H0-817 1 fdjjdjeecgcedcjd
+F-H0-818 1 cfdjjkdejdeccd
+F-H0-819 1 cedjjkdejdeccd
+F-H0-820 2 dkdjckcjjjdcjd
+F-H0-821 1 iggkkjkgcjggjcgc
+F-H0-822 1 ecgkdkggkdcgcdgc
+F-H0-823 2 ikkjckjcdd
+F-H0-824 1 eededjjddc
+F-H0-825 1 ddijkjjddj
+F-H0-826 1 chdkfkcijjcfggkeddjchc
+F-H0-827 1 kgdkfkcijjcfggkeddjchc
+F-H0-828 1 dkjjkdddic
+F-H0-829 1 ckjjkdddic
+F-H0-830 1 hkcjek
+F-H0-831 1 idjcke
+F-H0-832 1 dkdjjjdhfjdcjd
+F-H0-833 1 jdjehdkdjckckb
+F-H0-834 1 ilkkklkjjkjihj
+F-H0-835 1 khekjdjjgdcjdd
+F-H0-836 1 jhekjdjjgdcjdd
+F-H0-837 1 jfdjkdiddd
+F-H0-838 1 jjdidkjddd
+F-H0-839 1 lcdkjjciggjckegcdd
+F-H0-840 1 kggkjjdkcikeggjcdd
+F-H0-841 1 djggjckegcdd
+F-H0-842 1 cjggjckegcdd
+F-H0-843 1 dhjjdjfjdcjd
+F-H0-844 1 cgjkdjcedckd
+F-H0-845 2 dcckjkkc
+F-H0-846 1 cgjkdkciddjd
+F-H0-847 2 cfdkjkcededcjd
+F-H0-848 1 fkdjjkedjd
+F-H0-849 1 ccdjjkedjd
+F-H0-850 1 ekcjkkcedcjd
+F-H0-851 1 jijkcjekkcdd
+F-H0-852 1 kjkccc
+F-H0-853 1 jjcckc
+F-H0-854 1 kdjjdkggicdd
+F-H0-855 1 dcdekkkddjic
+F-H0-856 1 ccdekkkddjic
+F-H0-857 1 cccedkjd
+F-H0-858 1 dccedkjd
+F-H0-859 1 clekckdkdjjjdhfjdcjd
+F-H0-860 1 cjekckdkdjjjdhfjdcjd
+F-H0-861 1 cejkckdckc
+F-H0-862 1 jijkckdckc
+F-H0-863 1 jcgkkjgg
+F-H0-864 1 dkggkdgc
diff --git a/patterns/fuseki19.dbz b/patterns/fuseki19.dbz
new file mode 100644 (file)
index 0000000..4673fea
--- /dev/null
@@ -0,0 +1,24955 @@
+F-H0-1 3977 pd
+F-H0-2 1136 pc
+F-H0-3 201 od
+F-H0-4 158 jj
+F-H0-5 137 qe
+F-H0-6 101 qc
+F-H0-7 46 oe
+F-H0-8 2591 dppd
+F-H0-9 1353 dppp
+F-H0-10 847 dcpd
+F-H0-11 429 pcdp
+F-H0-12 156 ecpd
+F-H0-13 146 pqpd
+F-H0-14 143 eppd
+F-H0-15 127 edpd
+F-H0-16 79 cqpd
+F-H0-17 78 qodd
+F-H0-18 64 qfpd
+F-H0-19 57 pedd
+F-H0-20 57 ccpd
+F-H0-21 51 jjpd
+F-H0-22 29 oqpd
+F-H0-23 27 eopd
+F-H0-24 1505 pqdppd
+F-H0-25 1452 ppdppd
+F-H0-26 541 qpdppd
+F-H0-27 145 oqdppd
+F-H0-28 115 opdppd
+F-H0-29 103 fqdppd
+F-H0-30 44 podppd
+F-H0-31 36 qcddpp
+F-H0-32 32 ecdppd
+F-H0-33 17 jjddpp
+F-H0-34 1207 dpppddpd
+F-H0-35 1113 dcppdppd
+F-H0-36 193 eqppddpd
+F-H0-37 139 opdppddd
+F-H0-38 115 cdppdppd
+F-H0-39 52 nqppdppd
+F-H0-40 46 cqppddpd
+F-H0-41 41 deppdppd
+F-H0-42 17 nqpppddp
+F-H0-43 14 qjppddpd
+F-H0-44 14 ceppdppd
+F-H0-45 14 ncpddpdd
+F-H0-46 13 ncppdppd
+F-H0-47 893 pqddpd
+F-H0-48 860 pddppp
+F-H0-49 286 qpddpd
+F-H0-50 276 pddddp
+F-H0-51 114 cddppp
+F-H0-52 61 cepppd
+F-H0-53 55 cppppd
+F-H0-54 46 opddpd
+F-H0-55 23 popddd
+F-H0-56 18 cqpppd
+F-H0-57 18 qoddpd
+F-H0-58 15 poddpd
+F-H0-59 15 qnpppd
+F-H0-60 12 fqdpdd
+F-H0-61 11 qqddpd
+F-H0-62 952 dppc
+F-H0-63 671 ddqd
+F-H0-64 296 qppc
+F-H0-65 209 ddpc
+F-H0-66 65 cpqd
+F-H0-67 56 pccp
+F-H0-68 47 odqd
+F-H0-69 45 ecqd
+F-H0-70 42 popc
+F-H0-71 34 pqqd
+F-H0-72 34 pqpc
+F-H0-73 29 qpqd
+F-H0-74 28 ndqd
+F-H0-75 21 qcdq
+F-H0-76 17 eppc
+F-H0-77 15 epqd
+F-H0-78 15 ccqd
+F-H0-79 14 jjpc
+F-H0-80 13 ocqd
+F-H0-81 12 deqd
+F-H0-82 11 qqqd
+F-H0-83 1087 ddpqdppd
+F-H0-84 461 dcpqdppd
+F-H0-85 129 opqppddp
+F-H0-86 114 ecpqdppd
+F-H0-87 72 cdpqdppd
+F-H0-88 71 edpqdppd
+F-H0-89 43 pnpqdppd
+F-H0-90 37 ccpqdppd
+F-H0-91 29 qopqdppd
+F-H0-92 22 depqdppd
+F-H0-93 12 oqpddpcd
+F-H0-94 793 fqdppqddpd
+F-H0-95 283 qkdppqddpd
+F-H0-96 267 pkdppqddpd
+F-H0-97 190 qfpdppddcp
+F-H0-98 100 oqpdqpdddp
+F-H0-99 34 jcpdppddcp
+F-H0-100 33 jpdppqddpd
+F-H0-101 25 cndppqddpd
+F-H0-102 18 cfdppqddpd
+F-H0-103 12 podppqddpd
+F-H0-104 10 fcpppddpcd
+F-H0-105 755 fqdpppddpd
+F-H0-106 461 jppdppdddp
+F-H0-107 49 cndpppddpd
+F-H0-108 35 qjppdppddd
+F-H0-109 24 jjdpppddpd
+F-H0-110 12 jddpppddpd
+F-H0-111 12 dfpdppdddp
+F-H0-112 12 qjdpppddpd
+F-H0-113 10 djdpppddpd
+F-H0-114 9 jqdpppddpd
+F-H0-115 640 ppdcpd
+F-H0-116 544 dcpqdp
+F-H0-117 358 dpqppd
+F-H0-118 169 qddqpp
+F-H0-119 99 dqqppd
+F-H0-120 79 cpqppd
+F-H0-121 57 pepcdd
+F-H0-122 32 oqdcpd
+F-H0-123 30 opdcpd
+F-H0-124 20 dodcpd
+F-H0-125 16 npqppd
+F-H0-126 11 cedcpd
+F-H0-127 11 odcpdd
+F-H0-128 11 codcpd
+F-H0-129 10 qqdcpd
+F-H0-130 9 cqdcpd
+F-H0-131 9 qodcpd
+F-H0-132 602 odqdppdddp
+F-H0-133 345 pjdqppddpd
+F-H0-134 259 fqdpppdcpd
+F-H0-135 84 oqqppddpdd
+F-H0-136 59 dfdpppdcpd
+F-H0-137 51 cfdpppdcpd
+F-H0-138 21 ncpdppcddp
+F-H0-139 21 jjqppddpdd
+F-H0-140 14 jqqppddpdd
+F-H0-141 11 jqqdppdddp
+F-H0-142 10 jpdpppdcpd
+F-H0-143 9 jddpppdcpd
+F-H0-144 8 jqdqppddpd
+F-H0-145 366 qppddq
+F-H0-146 113 ppdpqd
+F-H0-147 112 pqdppc
+F-H0-148 106 qpdppc
+F-H0-149 89 pdddpq
+F-H0-150 20 ecpddq
+F-H0-151 15 qqdpqd
+F-H0-152 11 oqdpqd
+F-H0-153 10 cndpqd
+F-H0-154 9 dedpqd
+F-H0-155 8 cqddqp
+F-H0-156 7 qodppc
+F-H0-157 6 ceppdc
+F-H0-158 6 podpqd
+F-H0-159 5 fqdpqd
+F-H0-160 5 qpdpqd
+F-H0-161 5 podppc
+F-H0-162 4 qodpqd
+F-H0-163 335 cnfqdpppddpd
+F-H0-164 230 qhpppddpddqf
+F-H0-165 158 dnfqdpppddpd
+F-H0-166 147 pkqnpppddpdd
+F-H0-167 58 pjqnpppddpdd
+F-H0-168 26 qipppddpddqf
+F-H0-169 21 pfpppddpddqf
+F-H0-170 19 ncfqdpppddpd
+F-H0-171 17 qmnqppdppddd
+F-H0-172 15 hpfqdpppddpd
+F-H0-173 12 qjqnpppddpdd
+F-H0-174 12 jpqnpppddpdd
+F-H0-175 9 qnpppddpddqf
+F-H0-176 8 qfppdppdddfc
+F-H0-177 6 qffqdpppddpd
+F-H0-178 5 fofqdpppddpd
+F-H0-179 4 jccnpppddpdd
+F-H0-180 584 dppqddpd
+F-H0-181 106 dqpqddpd
+F-H0-182 102 cppqddpd
+F-H0-183 93 popqddpd
+F-H0-184 56 eqpqddpd
+F-H0-185 52 eppqddpd
+F-H0-186 20 pnpqddpd
+F-H0-187 19 cqpqddpd
+F-H0-188 14 qopqddpd
+F-H0-189 11 deppdppc
+F-H0-190 7 ocqpdddp
+F-H0-191 7 fqdpppdc
+F-H0-192 297 cnpqdpfqddpd
+F-H0-193 169 hqpqdpfqddpd
+F-H0-194 167 popqdpfqddpd
+F-H0-195 165 ippqdpfqddpd
+F-H0-196 161 dnpqdpfqddpd
+F-H0-197 68 djcnpppddpcd
+F-H0-198 31 pnpqdpfqddpd
+F-H0-199 18 qopqdpfqddpd
+F-H0-200 16 fppqdpfqddpd
+F-H0-201 13 hppqdpfqddpd
+F-H0-202 13 jqpqdpfqddpd
+F-H0-203 12 djpqdpfqddpd
+F-H0-204 11 qfcnpppddpcd
+F-H0-205 10 gcpppdcpddcf
+F-H0-206 9 qiqppddpddqf
+F-H0-207 449 ddqpdppd
+F-H0-208 268 dcqpdppd
+F-H0-209 137 opqpdppd
+F-H0-210 62 oqqpdppd
+F-H0-211 32 qedqddpp
+F-H0-212 30 npqpdppd
+F-H0-213 24 edqpdppd
+F-H0-214 16 cpppddqd
+F-H0-215 10 ccqpdppd
+F-H0-216 8 deqpdppd
+F-H0-217 251 cppdqpdd
+F-H0-218 224 dpppdcpd
+F-H0-219 86 dqpdqpdd
+F-H0-220 80 copdqpdd
+F-H0-221 32 epppdcpd
+F-H0-222 26 cqppdcpd
+F-H0-223 22 coppdcpd
+F-H0-224 12 qfpdqpdd
+F-H0-225 11 pedppqdd
+F-H0-226 10 nqppdcpd
+F-H0-227 7 qjppdcpd
+F-H0-228 5 ncpdqpdd
+F-H0-229 3 qfppdqpd
+F-H0-230 271 pldppqpopddd
+F-H0-231 263 eqeppppdcpdd
+F-H0-232 120 mcppqddpddod
+F-H0-233 83 fdppdpdedcpd
+F-H0-234 35 ooopqppddpdd
+F-H0-235 26 dgppdpdedcpd
+F-H0-236 16 ncppdpdedcpd
+F-H0-237 14 fcppdpdedcpd
+F-H0-238 13 dkppdqdoddpd
+F-H0-239 12 fcdppqpopddd
+F-H0-240 10 gdppdpdedcpd
+F-H0-241 8 cndppqpopddd
+F-H0-242 4 pdppqddpddod
+F-H0-243 4 qnppdpdedcpd
+F-H0-244 3 gcppdpdedcpd
+F-H0-245 3 cippdpdedcpd
+F-H0-246 355 pqddqd
+F-H0-247 100 cpddqd
+F-H0-248 92 ppddqd
+F-H0-249 41 ppdpdc
+F-H0-250 26 fcddqd
+F-H0-251 19 dqddqd
+F-H0-252 12 cqddqd
+F-H0-253 10 ocddqd
+F-H0-254 7 ocdddq
+F-H0-255 6 qpddqd
+F-H0-256 6 qqddqd
+F-H0-257 6 poddqd
+F-H0-258 6 oqddqd
+F-H0-259 5 ncddqd
+F-H0-260 5 eppppc
+F-H0-261 5 depppc
+F-H0-262 283 fqdppqdcpd
+F-H0-263 182 dedppqdcpd
+F-H0-264 115 pkdppqdcpd
+F-H0-265 112 kqpdqpcddp
+F-H0-266 34 cedppqdcpd
+F-H0-267 30 ecqppddpcd
+F-H0-268 18 nqqppddpcd
+F-H0-269 12 jpdppqdcpd
+F-H0-270 12 pnpqdppddc
+F-H0-271 5 podppqdcpd
+F-H0-272 4 pjdqppddpc
+F-H0-273 4 jpdqppddpc
+F-H0-274 4 dmppqdcpdd
+F-H0-275 510 qnpppdjpdddp
+F-H0-276 76 djppdppjddpd
+F-H0-277 43 jdppdppjddpd
+F-H0-278 18 jjpppdjpdddp
+F-H0-279 10 npppdppjddpd
+F-H0-280 286 fqdpqpddpd
+F-H0-281 154 oqdpqpddpd
+F-H0-282 45 ncdpppddqd
+F-H0-283 18 cipppddpdc
+F-H0-284 15 oddpppddqd
+F-H0-285 12 fqdpppddqd
+F-H0-286 4 pjdpppddqd
+F-H0-287 3 qipdpqdddp
+F-H0-288 343 ddpqdpqd
+F-H0-289 174 dcpqdpqd
+F-H0-290 61 pecddppc
+F-H0-291 19 qocddppc
+F-H0-292 19 opdqpdqp
+F-H0-293 16 pocddppc
+F-H0-294 14 ndpqdpqd
+F-H0-295 12 cqqdppdc
+F-H0-296 10 ocpqdpqd
+F-H0-297 9 cdpqdpqd
+F-H0-298 4 qopqdpqd
+F-H0-299 225 ocdppqddqd
+F-H0-300 162 fcdppqddqd
+F-H0-301 52 ncdppqddqd
+F-H0-302 40 qnppqddpdc
+F-H0-303 21 oddppqddqd
+F-H0-304 12 kcdppqddqd
+F-H0-305 11 qfppdqpdcd
+F-H0-306 7 qjppcppddc
+F-H0-307 6 cfdpqpddpc
+F-H0-308 5 nddppqddqd
+F-H0-309 5 jcdppqddqd
+F-H0-310 3 djdppqddqd
+F-H0-311 243 pppcdp
+F-H0-312 203 pqcppd
+F-H0-313 127 ppdqpd
+F-H0-314 64 pqdqpd
+F-H0-315 49 dcdqpd
+F-H0-316 31 qpdqpd
+F-H0-317 24 dodqpd
+F-H0-318 16 opcppd
+F-H0-319 15 cedqpd
+F-H0-320 5 codqpd
+F-H0-321 4 qocppd
+F-H0-322 4 oqdqpd
+F-H0-323 4 docdpp
+F-H0-324 3 dndqpd
+F-H0-325 3 jjcppd
+F-H0-326 199 lqnqppdppjddpd
+F-H0-327 76 pfdpppddpjncpd
+F-H0-328 57 jdnqppdppjddpd
+F-H0-329 32 pnqnpppdjpdddp
+F-H0-330 25 kpnqppdppjddpd
+F-H0-331 25 oedpppddpjncpd
+F-H0-332 16 pjpppddpjdqfdd
+F-H0-333 16 nedpppddpjncpd
+F-H0-334 8 fcnqppdppjddpd
+F-H0-335 6 qnnqppdppjddpd
+F-H0-336 4 kcdpppddpjncpd
+F-H0-337 4 phpppddpjdqfdd
+F-H0-338 348 dppqddqd
+F-H0-339 88 odpqddqd
+F-H0-340 88 ocpqddqd
+F-H0-341 76 dqpqddqd
+F-H0-342 24 npqpdppc
+F-H0-343 15 qpdqpdcd
+F-H0-344 13 popqddqd
+F-H0-345 12 eqpqddqd
+F-H0-346 11 cqcdpppc
+F-H0-347 10 eppqddqd
+F-H0-348 4 epcdpppc
+F-H0-349 321 nqppdqpjddpd
+F-H0-350 143 nqppdppjdcpd
+F-H0-351 30 dippdppjdcpd
+F-H0-352 26 jdppdppjdcpd
+F-H0-353 11 kqpdqpjddpdd
+F-H0-354 10 ocppqdjpdddp
+F-H0-355 9 jpppdppjdcpd
+F-H0-356 6 doppdqpjddpd
+F-H0-357 4 kqppdppjdcpd
+F-H0-358 4 kdppdppjdcpd
+F-H0-359 134 pddppqdc
+F-H0-360 107 cppqdcpd
+F-H0-361 104 pcdppqdc
+F-H0-362 47 copdqpcd
+F-H0-363 37 popqdcpd
+F-H0-364 28 cqpdqpcd
+F-H0-365 19 eppqdcpd
+F-H0-366 15 copqdcpd
+F-H0-367 14 qopqdcpd
+F-H0-368 8 ncpqdcpd
+F-H0-369 5 dopqdcpd
+F-H0-370 5 pnpqdcpd
+F-H0-371 2 qjppdqpc
+F-H0-372 2 qnpqdcpd
+F-H0-373 2 cepqdcpd
+F-H0-374 284 ddppdpqd
+F-H0-375 162 dcppdpqd
+F-H0-376 63 odppdpqd
+F-H0-377 22 copdppdc
+F-H0-378 16 pfdddppc
+F-H0-379 15 dopdppdc
+F-H0-380 9 oqqpddpd
+F-H0-381 8 cpqpddpd
+F-H0-382 6 cqqpddpd
+F-H0-383 6 doqpddpd
+F-H0-384 3 qnppdpqd
+F-H0-385 3 coqpddpd
+F-H0-386 201 dpod
+F-H0-387 93 ddpe
+F-H0-388 44 ddod
+F-H0-389 30 dcod
+F-H0-390 28 qpod
+F-H0-391 15 qdod
+F-H0-392 15 ecpe
+F-H0-393 11 epod
+F-H0-394 10 ecod
+F-H0-395 8 edod
+F-H0-396 7 pcdo
+F-H0-397 6 eppo
+F-H0-398 5 cppe
+F-H0-399 5 jjod
+F-H0-400 5 pqod
+F-H0-401 4 cope
+F-H0-402 4 ocpe
+F-H0-403 3 pdpe
+F-H0-404 3 eppe
+F-H0-405 122 dddpqppd
+F-H0-406 101 pqdpdcpd
+F-H0-407 58 dcdpqppd
+F-H0-408 43 ccdpqppd
+F-H0-409 28 oqdpdcpd
+F-H0-410 20 qodpdcpd
+F-H0-411 16 podpdcpd
+F-H0-412 13 fqdpqppd
+F-H0-413 11 dedpqppd
+F-H0-414 6 fcpppcdd
+F-H0-415 3 cfdpdcpd
+F-H0-416 2 fpdpqppd
+F-H0-417 163 cnfqdpppdcpd
+F-H0-418 80 qlqnpppdcpdd
+F-H0-419 65 dnfqdpppdcpd
+F-H0-420 64 ipfqdpppdcpd
+F-H0-421 30 djppqddpddcf
+F-H0-422 9 qjpppddpcdqf
+F-H0-423 9 nddppqddpdnc
+F-H0-424 9 mqqnpppdcpdd
+F-H0-425 9 iqfqdpppdcpd
+F-H0-426 5 qnfqdpppdcpd
+F-H0-427 4 ncfqdpppdcpd
+F-H0-428 4 hpfqdpppdcpd
+F-H0-429 3 nqfqdpppdcpd
+F-H0-430 3 kqfqdpppdcpd
+F-H0-431 2 jqpppddpcdqf
+F-H0-432 190 jpdpfqcnppddpd
+F-H0-433 157 dbdpppcfpdddfc
+F-H0-434 24 fcdpfqcnppddpd
+F-H0-435 16 dipdppdddpfccf
+F-H0-436 11 jqdpfqcnppddpd
+F-H0-437 10 kcdpppcfpdddfc
+F-H0-438 7 onnqqnpppddpdd
+F-H0-439 5 pjdpfqcnppddpd
+F-H0-440 5 mqdpfqcnppddpd
+F-H0-441 4 iqdpfqcnppddpd
+F-H0-442 2 lcpdppdddpncqf
+F-H0-443 2 dmdpfqcnppddpd
+F-H0-444 139 qniqpdppddcp
+F-H0-445 135 mppqdpqkddpd
+F-H0-446 54 djpdppcddpic
+F-H0-447 34 djpqdpqkddpd
+F-H0-448 25 lppqdpqkddpd
+F-H0-449 16 cjpdppcddpic
+F-H0-450 12 opkqpdqpdddp
+F-H0-451 11 qkkqpdqpdddp
+F-H0-452 10 kdppdpqiddpc
+F-H0-453 9 nqpqdpqkddpd
+F-H0-454 8 jdpqdpqkddpd
+F-H0-455 8 gqpqdpqkddpd
+F-H0-456 7 nppqdpqkddpd
+F-H0-457 5 qfpqdpqkddpd
+F-H0-458 4 okpqdpqkddpd
+F-H0-459 3 qopqdpqkddpd
+F-H0-460 2 fcpdppcddpic
+F-H0-461 2 pgpdppcddpic
+F-H0-462 2 jjkqpdqpdddp
+F-H0-463 2 pnpqdpqkddpd
+F-H0-464 2 cjpqdpqkddpd
+F-H0-465 2 ndpqdpqkddpd
+F-H0-466 2 qjpdppcddpic
+F-H0-467 2 pjpqdpqkddpd
+F-H0-468 2 ojpqdpqkddpd
+F-H0-469 168 pqdcqd
+F-H0-470 55 pqcpdc
+F-H0-471 48 dpdcqd
+F-H0-472 36 cpqppc
+F-H0-473 34 ddqppc
+F-H0-474 10 dedcqd
+F-H0-475 8 ocdcqd
+F-H0-476 7 eqqppc
+F-H0-477 7 cedcqd
+F-H0-478 4 opdcqd
+F-H0-479 3 qqdcqd
+F-H0-480 3 dfdcqd
+F-H0-481 2 qpdcqd
+F-H0-482 2 oqdcqd
+F-H0-483 2 ccdqqp
+F-H0-484 2 odpqcp
+F-H0-485 2 dodcqd
+F-H0-486 2 qodcqd
+F-H0-487 2 ncdcqd
+F-H0-488 237 dpjj
+F-H0-489 29 pqjj
+F-H0-490 23 pejj
+F-H0-491 13 jpjj
+F-H0-492 12 kjjj
+F-H0-493 11 jhjj
+F-H0-494 8 oqjj
+F-H0-495 7 eojj
+F-H0-496 6 lkjj
+F-H0-497 5 qqjj
+F-H0-498 4 pnjj
+F-H0-499 3 jmjj
+F-H0-500 170 opqppdcpdd
+F-H0-501 113 jdqppdcpdd
+F-H0-502 31 cjdqppdcpd
+F-H0-503 23 cedqppdcpd
+F-H0-504 18 dfdqppdcpd
+F-H0-505 13 djdqppdcpd
+F-H0-506 8 cfdqppdcpd
+F-H0-507 4 jjdqppdcpd
+F-H0-508 2 mcdqppdcpd
+F-H0-509 2 qjqppdcpdd
+F-H0-510 2 jpdqppdcpd
+F-H0-511 215 jpdppqcnfqddpd
+F-H0-512 98 ipdppqcnfqddpd
+F-H0-513 40 drdppqcnfqddpd
+F-H0-514 9 fcdppqcnfqddpd
+F-H0-515 5 pkdppqcnfqddpd
+F-H0-516 4 qndppqcnfqddpd
+F-H0-517 3 qodppqcnfqddpd
+F-H0-518 105 cnfqdpqpddpd
+F-H0-519 81 qhpqpddpddqf
+F-H0-520 61 opfqdpqpddpd
+F-H0-521 61 idppdpqdddfc
+F-H0-522 40 dnfqdpqpddpd
+F-H0-523 26 npfqdpqpddpd
+F-H0-524 21 jpfqdpqpddpd
+F-H0-525 12 oqfqdpqpddpd
+F-H0-526 7 hpfqdpqpddpd
+F-H0-527 6 ncfqdpqpddpd
+F-H0-528 6 jqfqdpqpddpd
+F-H0-529 5 iqfqdpqpddpd
+F-H0-530 4 pfpqpddpddqf
+F-H0-531 3 ncppdpqdddfc
+F-H0-532 3 cmfqdpqpddpd
+F-H0-533 2 kqfqdpqpddpd
+F-H0-534 149 ncpqdppkddpd
+F-H0-535 102 mppqdppkddpd
+F-H0-536 47 jppqdppkddpd
+F-H0-537 29 djpqdppkddpd
+F-H0-538 20 lppqdppkddpd
+F-H0-539 17 jqpqdppkddpd
+F-H0-540 14 nqpqdppkddpd
+F-H0-541 10 jdpqdppkddpd
+F-H0-542 10 nppqdppkddpd
+F-H0-543 10 popqdppkddpd
+F-H0-544 9 qfpqdppkddpd
+F-H0-545 7 kqpqdppkddpd
+F-H0-546 6 kdppdppiddpc
+F-H0-547 5 gqpqdppkddpd
+F-H0-548 5 jjpqdppkddpd
+F-H0-549 4 pgpdppiddpcd
+F-H0-550 3 jcpqdppkddpd
+F-H0-551 2 qipqdppkddpd
+F-H0-552 2 npppdppiddpc
+F-H0-553 2 oqqppdkpdddp
+F-H0-554 2 cjpqdppkddpd
+F-H0-555 68 ncqfpd
+F-H0-556 38 ndqfpd
+F-H0-557 24 qhqfpd
+F-H0-558 19 ddfqdp
+F-H0-559 17 ppqfpd
+F-H0-560 13 pfqfpd
+F-H0-561 12 ppfcdd
+F-H0-562 7 qgncpd
+F-H0-563 6 pqncpd
+F-H0-564 5 jdncpd
+F-H0-565 4 piqfpd
+F-H0-566 3 obncpd
+F-H0-567 3 cpqfpd
+F-H0-568 3 qiqfpd
+F-H0-570 2 edqfpd
+F-H0-571 2 qpqfpd
+F-H0-572 2 phqfpd
+F-H0-573 2 ofqfpd
+F-H0-574 2 eqnqpp
+F-H0-575 98 qlqnppqdjpdddp
+F-H0-576 42 ndqppddpjdqfdd
+F-H0-577 34 kpnqppdqpjddpd
+F-H0-578 25 jpdpppncpjdcpd
+F-H0-579 22 pnqnppqdjpdddp
+F-H0-580 15 oedpppncpjdcpd
+F-H0-581 13 ofqppddpjdqfdd
+F-H0-582 12 jpnqppdqpjddpd
+F-H0-583 10 dedpppncpjdcpd
+F-H0-584 4 qfdpppncpjdcpd
+F-H0-585 2 oqnqppdqpjddpd
+F-H0-586 164 qppddqdd
+F-H0-587 66 dppdpqdd
+F-H0-588 20 ecppcppd
+F-H0-589 17 ncppcdpd
+F-H0-590 13 depppcdp
+F-H0-591 4 deppcppd
+F-H0-592 4 ncppcppd
+F-H0-593 3 pqpddqdd
+F-H0-594 3 qfppcppd
+F-H0-595 3 cqpdpqdd
+F-H0-596 157 fqdpqpdcpd
+F-H0-597 79 ceqppddpdc
+F-H0-598 30 nqdpqpdcpd
+F-H0-599 29 dedpqpdcpd
+F-H0-600 12 kqdpqpdcpd
+F-H0-601 3 oddqppddqd
+F-H0-602 3 ecpdpqcddp
+F-H0-603 3 dfdpqpdcpd
+F-H0-604 2 cfdpqpdcpd
+F-H0-605 157 dpqe
+F-H0-606 106 ddqe
+F-H0-607 27 ppqe
+F-H0-608 20 dcqe
+F-H0-609 14 edqe
+F-H0-610 11 qeoq
+F-H0-611 10 pcqe
+F-H0-612 7 qpqe
+F-H0-613 7 pqoc
+F-H0-614 6 cpqe
+F-H0-615 6 doqe
+F-H0-616 6 odqe
+F-H0-617 4 poqe
+F-H0-618 3 dooq
+F-H0-619 3 dqqe
+F-H0-620 2 pdoc
+F-H0-621 2 epqe
+F-H0-622 2 oeqe
+F-H0-623 2 deqe
+F-H0-624 2 cqqe
+F-H0-625 2 qqoc
+F-H0-626 2 oqec
+F-H0-627 2 qoqe
+F-H0-628 153 dddppppd
+F-H0-629 98 dcdppppd
+F-H0-630 16 podpddpd
+F-H0-631 15 ecdppppd
+F-H0-632 14 ccdppppd
+F-H0-633 8 qfdppppd
+F-H0-634 117 ppecpd
+F-H0-635 81 cdqopd
+F-H0-636 76 dpecpd
+F-H0-637 24 qpecpd
+F-H0-638 15 cpecpd
+F-H0-639 14 cdecpd
+F-H0-640 8 coecpd
+F-H0-641 7 dqecpd
+F-H0-642 6 epqopd
+F-H0-643 5 opecpd
+F-H0-644 5 ppqopd
+F-H0-645 4 ceqopd
+F-H0-646 3 poecpd
+F-H0-647 2 qqcodd
+F-H0-648 2 qqecpd
+F-H0-649 2 epecpd
+F-H0-650 2 ecqopd
+F-H0-651 2 opqopd
+F-H0-652 228 fqeqeppppdcpdd
+F-H0-653 49 dpdqppcododdpd
+F-H0-654 4 fpeqeppppdcpdd
+F-H0-655 99 cnpqdpfqdcpd
+F-H0-656 48 ippqdpfqdcpd
+F-H0-657 45 hqpqdpfqdcpd
+F-H0-658 40 dnpqdpfqdcpd
+F-H0-659 39 popqdpfqdcpd
+F-H0-660 18 jppqdpfqdcpd
+F-H0-661 8 qopqdpfqdcpd
+F-H0-662 7 ncpqdpfqdcpd
+F-H0-663 6 pnpqdpfqdcpd
+F-H0-664 5 mcqppddpcdqf
+F-H0-665 4 hppqdpfqdcpd
+F-H0-666 4 jqpqdpfqdcpd
+F-H0-667 4 nqqppddpcdqf
+F-H0-668 4 fppqdpfqdcpd
+F-H0-669 3 icppdqpcddfc
+F-H0-670 2 dipqdpfqdcpd
+F-H0-671 163 peoqdpqpddpc
+F-H0-672 72 qjpqdpqdddoc
+F-H0-673 34 qnpqdpqdddoc
+F-H0-674 17 qopqdpqdddoc
+F-H0-675 16 pnpqdpqdddoc
+F-H0-676 16 djpqdpqdddoc
+F-H0-677 13 qkpqdpqdddoc
+F-H0-678 6 kcqeppcddppc
+F-H0-679 5 pjpqdpqdddoc
+F-H0-680 4 jppqdpqdddoc
+F-H0-681 3 dfceppqddpdc
+F-H0-682 2 jcoqdpqpddpc
+F-H0-683 154 cqhqfqdpppddpd
+F-H0-684 86 ofqhpppddpddqf
+F-H0-685 13 npppqndppdqldd
+F-H0-686 13 cnhqfqdpppddpd
+F-H0-687 10 hddpppddpdhcfc
+F-H0-688 7 cfhqfqdpppddpd
+F-H0-689 6 fchqfqdpppddpd
+F-H0-690 2 gohqfqdpppddpd
+F-H0-691 134 mppqdpplpopddd
+F-H0-692 49 ofqdpplddpddod
+F-H0-693 32 qoqpoplppddpdd
+F-H0-694 28 pnqpoplppddpdd
+F-H0-695 15 gedpppdhdedcpd
+F-H0-696 13 cqppephppdcpdd
+F-H0-697 7 plqpoplppddpdd
+F-H0-698 4 jdppdpphpepcdd
+F-H0-699 3 cnqpoplppddpdd
+F-H0-700 3 cndpppdhdedcpd
+F-H0-701 2 dkdpppdhdedcpd
+F-H0-702 123 jpdpfqdnppddpd
+F-H0-703 67 drdpfqdnppddpd
+F-H0-704 11 iddpppdfpdddfc
+F-H0-705 8 fcdpfqdnppddpd
+F-H0-706 5 qlppnqpndppddd
+F-H0-707 4 fodpfqdnppddpd
+F-H0-708 4 cjpdppfddpddcf
+F-H0-709 4 kqdpfqdnppddpd
+F-H0-710 3 pjdpppdfpdddfc
+F-H0-711 3 qipdppnddpddqf
+F-H0-712 2 pippqnnppddpdd
+F-H0-713 181 dodqpdqpdd
+F-H0-714 52 jpqdppdcdp
+F-H0-715 32 codqpdqpdd
+F-H0-716 19 opdqpdqpdd
+F-H0-717 12 fddqppcdpd
+F-H0-718 5 jjdqppcdpd
+F-H0-719 4 cndqpdqpdd
+F-H0-720 3 cjqdppdcdp
+F-H0-721 2 jdcpppdcpd
+F-H0-722 2 qjcpppdcpd
+F-H0-723 2 codqppcdpd
+F-H0-724 2 dndqppcdpd
+F-H0-725 2 cjdqppcdpd
+F-H0-726 97 cfpqdppdddfc
+F-H0-727 61 qhpppdcpddqf
+F-H0-728 48 fdqppddpddcf
+F-H0-729 34 pipppdcpddqf
+F-H0-730 17 popqdppdddfc
+F-H0-731 14 jpfqdpppddpc
+F-H0-732 7 qipppdcpddqf
+F-H0-733 5 ecqnpppddpcd
+F-H0-734 5 pfpppdcpddqf
+F-H0-735 3 ncpqdppdddfc
+F-H0-736 3 cgpqdppdddfc
+F-H0-737 3 qjqnpppddpcd
+F-H0-738 2 nqpppdcpddqf
+F-H0-739 33 ddppjj
+F-H0-740 29 dddpjj
+F-H0-741 22 qnppjj
+F-H0-742 17 jpdpjj
+F-H0-743 8 pnppjj
+F-H0-744 7 pedpjj
+F-H0-745 6 qcpdjj
+F-H0-746 5 popdjj
+F-H0-747 5 pqdpjj
+F-H0-748 4 qopdjj
+F-H0-749 3 jpddjj
+F-H0-750 2 oedpjj
+F-H0-751 2 qddpjj
+F-H0-752 2 eepdjj
+F-H0-754 2 dnpdjj
+F-H0-755 2 mdpdjj
+F-H0-756 2 oepdjj
+F-H0-757 2 depdjj
+F-H0-758 77 cddpppecpd
+F-H0-759 77 pjdpppecpd
+F-H0-760 59 fceqppddpd
+F-H0-761 32 doeqppddpd
+F-H0-762 13 cfeqppddpd
+F-H0-763 9 cjdpppecpd
+F-H0-764 7 eqpppdcodd
+F-H0-765 6 jjdpppecpd
+F-H0-766 5 ccdpppecpd
+F-H0-767 4 pdppdpocdd
+F-H0-768 4 jcdpppecpd
+F-H0-769 4 cidpppecpd
+F-H0-770 3 djqeppdddp
+F-H0-771 2 gqoqdppddd
+F-H0-772 2 djpppdcodd
+F-H0-773 112 qcqhpppddpjdqfdd
+F-H0-774 100 ofqhpppddpjdqfdd
+F-H0-775 28 qnlqnqppdppjddpd
+F-H0-776 25 lplqnqppdppjddpd
+F-H0-777 10 pnlqnqppdppjddpd
+F-H0-778 4 nclqnqppdppjddpd
+F-H0-779 195 qjoqdpqpddpd
+F-H0-780 39 ncoqdpqpddpd
+F-H0-781 26 qkoqdpqpddpd
+F-H0-782 11 djoqdpqpddpd
+F-H0-783 6 pjoqdpqpddpd
+F-H0-784 6 kccepppddpdc
+F-H0-785 6 qnppdpqdddoc
+F-H0-786 5 ndppdpqdddoc
+F-H0-787 3 jpppdpqdddoc
+F-H0-788 2 rpoqdpqpddpd
+F-H0-789 2 fdeqppcppddd
+F-H0-790 106 ddpopd
+F-H0-791 82 cppepp
+F-H0-792 53 dppopd
+F-H0-793 14 qpedpd
+F-H0-794 9 doedpd
+F-H0-795 8 dqpopd
+F-H0-796 5 depopd
+F-H0-797 5 pqpopd
+F-H0-798 4 oqedpd
+F-H0-799 3 qeopdp
+F-H0-800 2 pcopdp
+F-H0-801 2 pdpepp
+F-H0-802 222 dqfqeqeppppdcpdd
+F-H0-803 8 beppdpcfcededcpd
+F-H0-804 164 ddoqdppd
+F-H0-805 74 dcoqdppd
+F-H0-806 14 edoqdppd
+F-H0-807 13 qpoqdppd
+F-H0-808 9 ecoqdppd
+F-H0-809 5 cdoqdppd
+F-H0-810 4 ccoqdppd
+F-H0-811 3 pooqdppd
+F-H0-812 3 qfoqdppd
+F-H0-813 3 ppoqdppd
+F-H0-814 2 ncoqdppd
+F-H0-815 2 qooqdppd
+F-H0-816 2 qqoqdppd
+F-H0-817 126 dfdpppcecfcddedcpd
+F-H0-818 48 dgdpppcecfcddedcpd
+F-H0-819 44 qneqfqdqeppppdcpdd
+F-H0-820 15 fqpqnqoqopqppddpdd
+F-H0-821 11 fmeqfqdqeppppdcpdd
+F-H0-822 109 ocdppqdcqd
+F-H0-823 48 opqpcddppc
+F-H0-824 18 ncdppqdcqd
+F-H0-825 15 cedppqdcqd
+F-H0-826 15 fqdppqdcqd
+F-H0-827 7 oddppqdcqd
+F-H0-828 5 cfdppqdcqd
+F-H0-829 4 jcdppqdcqd
+F-H0-830 3 dfdppqdcqd
+F-H0-831 64 cfpqdpqdddfc
+F-H0-832 43 hcpqdpqdddfc
+F-H0-833 42 pkqnppcddppc
+F-H0-834 39 odpqdpqdddfc
+F-H0-835 26 dfpqdpqdddfc
+F-H0-836 19 pfqnppcddppc
+F-H0-837 11 jdpqdpqdddfc
+F-H0-838 6 ocpqdpqdddfc
+F-H0-839 5 icpqdpqdddfc
+F-H0-840 3 hdpqdpqdddfc
+F-H0-841 3 popqdpqdddfc
+F-H0-842 2 djpqdpqdddfc
+F-H0-843 2 qjqnppcddppc
+F-H0-844 83 dcppqd
+F-H0-845 42 ddppqd
+F-H0-846 36 cdppqd
+F-H0-847 24 dpddpc
+F-H0-848 24 cpppqd
+F-H0-849 18 dqppqd
+F-H0-850 9 ceppqd
+F-H0-851 4 cedppq
+F-H0-852 3 cqppqd
+F-H0-853 3 qnppqd
+F-H0-854 2 ecppqd
+F-H0-855 2 epppqd
+F-H0-856 129 qnpqdpfqcnjpddpd
+F-H0-857 30 pnpqdpfqcnjpddpd
+F-H0-858 27 popqdpfqcnjpddpd
+F-H0-859 24 ncpqdpfqcnjpddpd
+F-H0-860 8 qopqdpfqcnjpddpd
+F-H0-861 6 qfpqdpfqcnjpddpd
+F-H0-862 6 jqpppdcpdddjfccf
+F-H0-863 5 qkpqdpfqcnjpddpd
+F-H0-864 3 jdpqdpfqcnjpddpd
+F-H0-865 144 popqpddpdd
+F-H0-866 44 jdpqpddpdd
+F-H0-867 20 qopqpddpdd
+F-H0-868 20 qfpdppdcdp
+F-H0-869 9 fddpppcdpd
+F-H0-870 4 cndqpdppdd
+F-H0-871 2 cjdpppcdpd
+F-H0-872 143 opqpdpddpd
+F-H0-873 62 oqqpdpddpd
+F-H0-874 13 nqppdpdcpd
+F-H0-875 9 jjppdpcdpd
+F-H0-876 8 npqpdpddpd
+F-H0-877 8 fqdpppqddd
+F-H0-878 5 qfdppppcdd
+F-H0-879 101 ddqpdp
+F-H0-880 74 cdpqpd
+F-H0-881 26 dppqpd
+F-H0-882 14 dcpqpd
+F-H0-883 13 popqpd
+F-H0-884 12 cppqpd
+F-H0-885 4 cepqpd
+F-H0-886 3 dqpqpd
+F-H0-887 3 pecppp
+F-H0-888 2 cqpqpd
+F-H0-889 2 ccpqpd
+F-H0-890 2 ecpqpd
+F-H0-891 2 qopqpd
+F-H0-892 143 epcppqdcpd
+F-H0-893 36 eqcppqdcpd
+F-H0-894 28 qkcppqdcpd
+F-H0-895 17 pkcppqdcpd
+F-H0-896 12 opdqpdqpcd
+F-H0-897 10 fpcppqdcpd
+F-H0-898 5 oqdqpdqpcd
+F-H0-899 3 qncppqdcpd
+F-H0-900 3 cepqdpqddc
+F-H0-901 2 qfcdqppcdp
+F-H0-902 2 cfcppqdcpd
+F-H0-903 2 jpcppqdcpd
+F-H0-904 44 pldppqpofqddpd
+F-H0-905 44 cndppqpofqddpd
+F-H0-906 40 dneppppdcpddcf
+F-H0-907 38 oodppqpofqddpd
+F-H0-908 34 qodppqpofqddpd
+F-H0-909 19 qmdppqpofqddpd
+F-H0-910 4 ncdppppepcddfc
+F-H0-911 3 dndppqpofqddpd
+F-H0-912 3 pmdppqpofqddpd
+F-H0-913 2 mpdppqpofqddpd
+F-H0-914 95 qnfqdpppcnjpddpd
+F-H0-915 45 nqppdppdcfjdddfc
+F-H0-916 39 jccnfqdjpppddpdd
+F-H0-917 12 qffqdpppcnjpddpd
+F-H0-918 2 jdfqdpppcnjpddpd
+F-H0-919 2 drfqdpppcnjpddpd
+F-H0-920 2 pjppdppdcfjdddfc
+F-H0-921 2 dfqnnqpjpppddpdd
+F-H0-922 131 ddpqdppc
+F-H0-923 35 cpqdppcd
+F-H0-924 9 cppqddpc
+F-H0-925 8 popqdppc
+F-H0-926 7 ecpqdppc
+F-H0-927 5 ndqddpcd
+F-H0-928 4 odqddpcd
+F-H0-929 4 edpqdppc
+F-H0-930 2 qqqddpcd
+F-H0-931 2 opqddpcd
+F-H0-932 2 pnpqdppc
+F-H0-933 2 jcqddpcd
+F-H0-934 86 ppdopd
+F-H0-935 50 ppeppd
+F-H0-936 41 pqdopd
+F-H0-937 38 pqeppd
+F-H0-938 7 opdopd
+F-H0-939 7 oqdopd
+F-H0-940 7 qpdopd
+F-H0-941 5 dedopd
+F-H0-942 5 qpeppd
+F-H0-943 5 cdedpp
+F-H0-944 3 qodopd
+F-H0-945 3 qopedp
+F-H0-946 2 epedpp
+F-H0-947 29 dedpod
+F-H0-948 17 opdpod
+F-H0-949 17 dpddpo
+F-H0-950 16 podpod
+F-H0-951 11 dpppde
+F-H0-952 7 pqdpod
+F-H0-953 7 oqdppe
+F-H0-954 7 pqdppe
+F-H0-955 7 oqdpod
+F-H0-956 5 fqdppe
+F-H0-957 5 ecdpod
+F-H0-958 4 qodpod
+F-H0-959 3 cpppde
+F-H0-961 2 doppde
+F-H0-962 2 cndppe
+F-H0-963 2 oodpod
+F-H0-964 66 cppdqpdc
+F-H0-965 53 ddppdqqd
+F-H0-966 30 opqpdcpd
+F-H0-967 15 eqqpdcpd
+F-H0-968 8 epqpdcpd
+F-H0-969 8 cpqpdcpd
+F-H0-970 8 cqqpdcpd
+F-H0-971 7 cepdqpdc
+F-H0-972 3 dfpdqpdc
+F-H0-973 3 qedppqcd
+F-H0-974 44 eqepppddcp
+F-H0-975 42 dcopqppddp
+F-H0-976 38 pldppqpopd
+F-H0-977 26 npdppqpopd
+F-H0-978 20 mqopqppddp
+F-H0-979 19 dddppqpopd
+F-H0-980 11 pmdppqpopd
+F-H0-981 10 oodppqpopd
+F-H0-982 3 nqdppqpopd
+F-H0-983 2 dedppqpopd
+F-H0-984 2 cndppqpopd
+F-H0-985 59 dppqdcqd
+F-H0-986 40 dqpqdcqd
+F-H0-987 38 ocpqdcqd
+F-H0-988 17 odpqdcqd
+F-H0-989 13 cdqpdqpc
+F-H0-990 10 cqpqdcqd
+F-H0-991 7 eppqdcqd
+F-H0-992 5 eqpqdcqd
+F-H0-993 4 popqdcqd
+F-H0-994 51 fqdpoqddpd
+F-H0-995 37 qpdpoqddpd
+F-H0-996 11 fcdpoqddpd
+F-H0-997 5 cfdpoqddpd
+F-H0-998 4 qjppeqpddd
+F-H0-999 4 podpoqddpd
+F-H0-1000 4 fqppcedppd
+F-H0-1001 3 djdpoqddpd
+F-H0-1002 2 oodpoqddpd
+F-H0-1003 2 pjdpppddoc
+F-H0-1004 2 fpdpoqddpd
+F-H0-1005 107 dpqc
+F-H0-1006 60 ddqc
+F-H0-1007 17 ppqq
+F-H0-1008 14 cpcc
+F-H0-1009 11 cpqc
+F-H0-1010 6 pqqc
+F-H0-1011 5 edqc
+F-H0-1012 3 eoqc
+F-H0-1013 3 coqq
+F-H0-1014 2 doqc
+F-H0-1015 2 cqqq
+F-H0-1016 70 pldppqpopddc
+F-H0-1017 57 cepqdpdedcpd
+F-H0-1018 32 cgpqdpdedcpd
+F-H0-1019 17 fdpqdpdedcpd
+F-H0-1020 10 eepqdpdedcpd
+F-H0-1021 9 popqdpdedcpd
+F-H0-1022 5 mpopqppddpcd
+F-H0-1023 4 qnpqdpdedcpd
+F-H0-1024 4 qopqdpdedcpd
+F-H0-1025 2 gdpqdpdedcpd
+F-H0-1026 2 qnopqppddpcd
+F-H0-1027 117 cqhqpqdpfqddpd
+F-H0-1028 54 onppqndpqdqldd
+F-H0-1029 13 cnhqpqdpfqddpd
+F-H0-1030 11 ndqhqppddpddqf
+F-H0-1031 5 hphqpqdpfqddpd
+F-H0-1032 5 qohqpqdpfqddpd
+F-H0-1033 3 fchqpqdpfqddpd
+F-H0-1034 3 cfhqpqdpfqddpd
+F-H0-1035 58 pjdpppedpd
+F-H0-1036 50 fqdpppedpd
+F-H0-1037 48 dcdepppddp
+F-H0-1038 13 qnppdpoddd
+F-H0-1039 10 jcdepppddp
+F-H0-1040 5 jqopdppddd
+F-H0-1041 4 coepppddpd
+F-H0-1042 2 jpdppdpodd
+F-H0-1043 2 jjdepppddp
+F-H0-1044 2 cqpppddodd
+F-H0-1045 2 djpppddodd
+F-H0-1046 102 dcpqcppd
+F-H0-1047 39 ddpqcppd
+F-H0-1048 18 dedpqddc
+F-H0-1049 8 qopddqcd
+F-H0-1050 7 edpqcppd
+F-H0-1051 4 pnpqcppd
+F-H0-1052 4 qopqcppd
+F-H0-1053 3 oppddqcd
+F-H0-1054 157 nqppdpddpd
+F-H0-1055 9 jjppdpddpd
+F-H0-1056 5 jdppdpddpd
+F-H0-1057 3 qkppdpddpd
+F-H0-1058 2 fpdppppddd
+F-H0-1059 2 jqppdpddpd
+F-H0-1060 2 cnppdpddpd
+F-H0-1061 69 qldpoqqjqpddpd
+F-H0-1062 22 fqdpppqjqdddoc
+F-H0-1063 21 jqppcedppdjcdc
+F-H0-1064 12 qhdpoqqjqpddpd
+F-H0-1065 9 cgppeqcjcppddd
+F-H0-1066 8 cfdpoqqjqpddpd
+F-H0-1067 6 cnppcedppdjcdc
+F-H0-1068 2 cfdpppqjqdddoc
+F-H0-1069 2 jcdpoqqjqpddpd
+F-H0-1070 126 jpdppqdnfqddpd
+F-H0-1071 39 ipdppqdnfqddpd
+F-H0-1072 15 bpppcnfppddpcd
+F-H0-1073 2 iqdppqdnfqddpd
+F-H0-1074 2 qkdppqdnfqddpd
+F-H0-1075 2 jqdppqdnfqddpd
+F-H0-1076 60 cqdrdpfqcnppddpd
+F-H0-1077 32 qndrdpfqcnppddpd
+F-H0-1078 20 qfbpfqcnpppddpdd
+F-H0-1079 20 nqdrdpfqcnppddpd
+F-H0-1080 17 mqprppnqqndppddd
+F-H0-1081 13 qhpppddpddqfncrd
+F-H0-1082 6 qjdrdpfqcnppddpd
+F-H0-1083 4 qnppdppdcffcdddb
+F-H0-1084 59 foippqdpfqddpd
+F-H0-1085 54 cqippqdpfqddpd
+F-H0-1086 51 qfppdppdnckddc
+F-H0-1087 9 dnippqdpfqddpd
+F-H0-1088 3 hoippqdpfqddpd
+F-H0-1089 3 kpippqdpfqddpd
+F-H0-1090 2 ceppdppdnckddc
+F-H0-1091 78 onppqndppdpkdd
+F-H0-1092 59 qqppqndppdpkdd
+F-H0-1093 42 qnppnqkpdppddd
+F-H0-1094 6 dnipfqdpppddpd
+F-H0-1095 4 kpipfqdpppddpd
+F-H0-1096 3 olppqndppdpkdd
+F-H0-1097 3 nnppnqkpdppddd
+F-H0-1098 3 kcdpppidpdddfc
+F-H0-1099 57 nqppcpddpd
+F-H0-1100 45 coppdqddpd
+F-H0-1101 21 ncdppppddc
+F-H0-1102 11 ncppdpddqd
+F-H0-1103 5 nqppdpddpc
+F-H0-1104 4 qfdppppddc
+F-H0-1105 3 odppdpddqd
+F-H0-1106 54 ceppdqdedcpd
+F-H0-1107 47 lpopqppdcpdd
+F-H0-1108 16 cmppdqdodcpd
+F-H0-1109 12 eeppdqdedcpd
+F-H0-1110 12 pnopqppdcpdd
+F-H0-1111 11 mpopqppdcpdd
+F-H0-1112 6 ceppdqdodcpd
+F-H0-1113 3 cnppdqdedcpd
+F-H0-1114 2 qnopqppdcpdd
+F-H0-1115 2 qfopqppdcpdd
+F-H0-1116 112 ddopdppd
+F-H0-1117 68 dcopdppd
+F-H0-1118 10 qdppddod
+F-H0-1119 8 podedppd
+F-H0-1120 7 ecopdppd
+F-H0-1121 3 ccopdppd
+F-H0-1122 2 cdopdppd
+F-H0-1123 2 qoopdppd
+F-H0-1124 43 cnfqdpqpdcpd
+F-H0-1125 42 pipqpddpcdqf
+F-H0-1126 37 clcnqppddpdc
+F-H0-1127 32 opfqdpqpdcpd
+F-H0-1128 12 jpfqdpqpdcpd
+F-H0-1129 11 npfqdpqpdcpd
+F-H0-1130 10 dnfqdpqpdcpd
+F-H0-1131 3 cnpqpddpcdqf
+F-H0-1132 2 jqfqdpqpdcpd
+F-H0-1133 2 ecdppqcdpdnc
+F-H0-1134 2 cmfqdpqpdcpd
+F-H0-1135 2 hpfqdpqpdcpd
+F-H0-1136 2 kqfqdpqpdcpd
+F-H0-1137 97 ppcpddpd
+F-H0-1138 35 pcppdpcd
+F-H0-1139 17 dodqpppd
+F-H0-1140 16 pqdpddpc
+F-H0-1141 13 qqcpddpd
+F-H0-1142 7 cedqpppd
+F-H0-1143 5 codqpppd
+F-H0-1144 2 ecdqpppd
+F-H0-1145 2 pfdpddpc
+F-H0-1146 38 dpodppddqd
+F-H0-1147 32 oqopqpdppd
+F-H0-1148 30 cdopqpdppd
+F-H0-1149 29 lpopqpdppd
+F-H0-1150 22 mqopqpdppd
+F-H0-1151 13 pnopqpdppd
+F-H0-1152 7 deopqpdppd
+F-H0-1153 6 dcopqpdppd
+F-H0-1154 5 ooopqpdppd
+F-H0-1155 2 coodppddqd
+F-H0-1156 65 fqdppqecpd
+F-H0-1157 40 cddppqecpd
+F-H0-1158 28 pkdppqecpd
+F-H0-1159 27 icdppdqocd
+F-H0-1160 9 odqeppddcp
+F-H0-1161 9 ceoqdppddc
+F-H0-1162 7 cjdppqecpd
+F-H0-1163 6 cndppqecpd
+F-H0-1164 3 ecceqppddp
+F-H0-1165 3 ccdppqecpd
+F-H0-1166 2 jjdppqecpd
+F-H0-1167 67 ocdpppdcqd
+F-H0-1168 62 dedpppdcqd
+F-H0-1169 22 nqdqqpddpd
+F-H0-1170 8 eqpppdcpdc
+F-H0-1171 8 fcdqqpddpd
+F-H0-1172 7 kqdqqpddpd
+F-H0-1173 6 cndqqpddpd
+F-H0-1174 4 oddpppdcqd
+F-H0-1175 2 pgqdpqdddp
+F-H0-1176 2 dndqqpddpd
+F-H0-1177 2 pjqpdddppc
+F-H0-1178 75 cnfqdppd
+F-H0-1179 27 hqfqdppd
+F-H0-1180 21 ppfqdppd
+F-H0-1181 14 ddfqdppd
+F-H0-1182 14 dnfqdppd
+F-H0-1183 10 ipfqdppd
+F-H0-1184 6 hpfqdppd
+F-H0-1185 5 jpfqdppd
+F-H0-1186 4 qpfqdppd
+F-H0-1187 4 pqfqdppd
+F-H0-1188 4 fpfqdppd
+F-H0-1189 3 dcfqdppd
+F-H0-1190 2 eqfqdppd
+F-H0-1191 135 dqfqhqcqdpppddpd
+F-H0-1192 18 cpfqhqcqdpppddpd
+F-H0-1193 47 cmdodqpdqpdd
+F-H0-1194 44 eqppcpepdcpd
+F-H0-1195 41 plpopqpdcpdd
+F-H0-1196 9 dfppdqpdcded
+F-H0-1197 9 eododqpdqpdd
+F-H0-1198 5 fqopqpdppcdd
+F-H0-1199 5 pmpopqpdcpdd
+F-H0-1200 4 ipppcpepdcpd
+F-H0-1201 3 nqppcddppcpe
+F-H0-1202 2 qnopqpdppcdd
+F-H0-1203 2 icppdqpdcded
+F-H0-1204 2 fqdppqodqddd
+F-H0-1205 69 lqnqppdppjdcpd
+F-H0-1206 18 pnnqppdppjdcpd
+F-H0-1207 14 jdnqppdppjdcpd
+F-H0-1208 12 npnqppdppjdcpd
+F-H0-1209 12 kpnqppdppjdcpd
+F-H0-1210 6 nonqppdppjdcpd
+F-H0-1211 4 jpnqppdppjdcpd
+F-H0-1212 3 lpnqppdppjdcpd
+F-H0-1213 3 oonqppdppjdcpd
+F-H0-1214 2 denqppdppjdcpd
+F-H0-1215 2 jcnqppdppjdcpd
+F-H0-1216 62 cnkqpdqpcddp
+F-H0-1217 34 mppqdpqkdcpd
+F-H0-1218 14 jppqdpqkdcpd
+F-H0-1219 7 jqpqdpqkdcpd
+F-H0-1220 7 dipqdpqkdcpd
+F-H0-1221 6 lppqdpqkdcpd
+F-H0-1222 5 qkkqpdqpcddp
+F-H0-1223 5 pkkqpdqpcddp
+F-H0-1224 4 jpppdqqiddpc
+F-H0-1225 3 cipqdpqkdcpd
+F-H0-1226 3 nqpqdpqkdcpd
+F-H0-1227 2 cfpqdpqkdcpd
+F-H0-1228 2 opkqpdqpcddp
+F-H0-1229 73 fcdpppcfddpd
+F-H0-1230 19 pnnqppdpddpd
+F-H0-1231 18 kpnqppdpddpd
+F-H0-1232 13 lqnqppdpddpd
+F-H0-1233 9 qmnqppdpddpd
+F-H0-1234 8 jpnqppdpddpd
+F-H0-1235 5 iqnqppdpddpd
+F-H0-1236 4 fddppppdddfc
+F-H0-1237 2 kqnqppdpddpd
+F-H0-1238 2 jjnqppdpddpd
+F-H0-1239 40 oqnpqppddpdd
+F-H0-1240 23 fdppdpdfdcpd
+F-H0-1241 11 qldppqpnpddd
+F-H0-1242 10 nqppdpdfdcpd
+F-H0-1243 9 pqnpqppddpdd
+F-H0-1244 8 ncppdpdfdcpd
+F-H0-1245 7 gdppdpdfdcpd
+F-H0-1246 4 kpnpqppddpdd
+F-H0-1247 3 nonpqppddpdd
+F-H0-1248 3 iqfppppdcpdd
+F-H0-1249 3 djppdpdfdcpd
+F-H0-1250 2 qjppdpdfdcpd
+F-H0-1251 2 qnppdpdfdcpd
+F-H0-1252 101 dddqpppc
+F-H0-1253 16 pqcpddqd
+F-H0-1254 15 odcpddqd
+F-H0-1255 14 qqcpddqd
+F-H0-1256 11 qedqpppc
+F-H0-1257 5 oqcpddqd
+F-H0-1258 3 qpcpddqd
+F-H0-1259 3 pocpddqd
+F-H0-1260 3 epcpddqd
+F-H0-1261 2 opcpddqd
+F-H0-1262 84 pdppdpdc
+F-H0-1263 23 cddppppc
+F-H0-1264 19 epcppppd
+F-H0-1265 10 ocdpddqd
+F-H0-1266 7 ccdppppc
+F-H0-1267 7 pqdqddpd
+F-H0-1268 3 cedppppc
+F-H0-1269 2 nddpddqd
+F-H0-1270 80 ocppcedpqdoddc
+F-H0-1271 36 pldppqpoqdddoc
+F-H0-1272 23 qgdpoqpeqpddpc
+F-H0-1273 4 oodppqpoqdddoc
+F-H0-1274 2 npdppqpoqdddoc
+F-H0-1275 67 jpdpfqcnppdcpd
+F-H0-1276 41 drdpfqcnppdcpd
+F-H0-1277 7 iddqppcfpdddfc
+F-H0-1278 7 opfqcnqppddpdd
+F-H0-1279 4 ofpdppcddpncqf
+F-H0-1280 3 kqdpfqcnppdcpd
+F-H0-1281 2 mqdpfqcnppdcpd
+F-H0-1282 2 cedpfqcnppdcpd
+F-H0-1283 2 pjdpfqcnppdcpd
+F-H0-1284 133 dofqhqcqdqppdpcpddpd
+F-H0-1285 3 bqdqppcqdpcncppdcldd
+F-H0-1286 141 cphqfqdqcqdpppddpd
+F-H0-1287 107 epcppqddpd
+F-H0-1288 24 eqcppqddpd
+F-H0-1289 12 kqddqppcdp
+F-H0-1290 12 pkcppqddpd
+F-H0-1291 9 fqcppqddpd
+F-H0-1292 8 fpcppqddpd
+F-H0-1293 4 fccppqddpd
+F-H0-1294 2 ipcppqddpd
+F-H0-1295 32 epppedpd
+F-H0-1296 27 pedpopdd
+F-H0-1297 19 dppdpodd
+F-H0-1298 11 cppdpodd
+F-H0-1299 8 oqdpoddd
+F-H0-1300 5 coppedpd
+F-H0-1301 4 oodpoddd
+F-H0-1302 4 qfpdpodd
+F-H0-1303 3 fpppedpd
+F-H0-1304 2 dfppeppd
+F-H0-1305 82 podppqqnfqcnjpddpd
+F-H0-1306 58 dcfqcnppdjdppdfccd
+F-H0-1307 4 qldppqqnfqcnjpddpd
+F-H0-1308 3 fcdppqqnfqcnjpddpd
+F-H0-1309 2 pldppqqnfqcnjpddpd
+F-H0-1310 105 pmppqnjppddpddpn
+F-H0-1311 7 odppdppjddpdncnd
+F-H0-1312 7 rdpdqfnc
+F-H0-1313 5 ddqfncpd
+F-H0-1314 4 pcnqqnpp
+F-H0-1315 4 lcpdqfnc
+F-H0-1316 3 qcpdqfnc
+F-H0-1317 3 qdpdqfnc
+F-H0-1318 3 popdqfnc
+F-H0-1319 2 pjpdqfnc
+F-H0-1320 2 pipdqfnc
+F-H0-1321 2 pgqfncpd
+F-H0-1322 2 ofqfncpd
+F-H0-1323 2 qpqfncpd
+F-H0-1324 2 cpddcffc
+F-H0-1325 46 dpoe
+F-H0-1326 35 ddoe
+F-H0-1327 8 dcoe
+F-H0-1328 8 pdoe
+F-H0-1329 5 edoe
+F-H0-1330 4 dqoe
+F-H0-1331 4 jjoe
+F-H0-1332 3 eooe
+F-H0-1333 3 opoe
+F-H0-1334 3 qdoe
+F-H0-1335 3 epoe
+F-H0-1336 2 qooe
+F-H0-1337 2 pqoe
+F-H0-1338 2 dfoe
+F-H0-1339 127 eqdrercrhqfqdqcqdpppdocpddpd
+F-H0-1340 7 fbppdppddecdddfchcccdcdbebcb
+F-H0-1341 139 crerdrhqfqdqcqdpppdocpddpd
+F-H0-1342 139 drhqfqdqcqdpppdocpddpd
+F-H0-1343 133 erdrhqfqdqcqdpppdocpddpd
+F-H0-1344 42 oqopqpdpddpd
+F-H0-1345 32 lpopqpdpddpd
+F-H0-1346 30 qmdppqpoddpd
+F-H0-1347 17 npdppqpoddpd
+F-H0-1348 7 oodppqpoddpd
+F-H0-1349 4 nqdppqpoddpd
+F-H0-1350 4 qfdppppdcded
+F-H0-1351 4 qfdpppdedcpd
+F-H0-1352 3 gddpppdedcpd
+F-H0-1353 2 didpppdedcpd
+F-H0-1354 2 fqdppqpoddpd
+F-H0-1355 2 cndpppdedcpd
+F-H0-1356 55 jcppdpqeddpc
+F-H0-1357 49 qkoqpdqpdddp
+F-H0-1358 22 fqdpppcepddc
+F-H0-1359 22 jppqdpqoddpd
+F-H0-1360 5 djpqdpqoddpd
+F-H0-1361 2 qnppdpqeddpc
+F-H0-1362 2 pnpqdpqoddpd
+F-H0-1363 2 gqpqdpqoddpd
+F-H0-1364 2 ckdpppcepddc
+F-H0-1365 2 qjppdpqeddpc
+F-H0-1366 2 fqpqdpqoddpd
+F-H0-1367 135 cnerdrhqcreqfqdqcqdpppdocpddpd
+F-H0-1368 54 qfppdpcfdepdddcdhcfcecccdcdbebcb
+F-H0-1369 53 nqdrercrhqfqeqcqdqppdpcpdocnddpd
+F-H0-1370 11 ckppchdpcecfbebdpdfceddcddcccdbc
+F-H0-1371 7 egppdpcfdepdddcdhcfcecccdcdbebcb
+F-H0-1372 5 ncdrercrhqfqeqcqdqppdpcpdocnddpd
+F-H0-1373 2 pfppqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-1374 2 qfdrercrhqfqeqcqdqppdpcpdocnddpd
+F-H0-1375 81 pfdppqddqkncpd
+F-H0-1376 13 qhpppddpcdqfic
+F-H0-1378 6 jdnqppdpqiddpc
+F-H0-1379 5 pipppddpcdqfic
+F-H0-1380 2 qfcnkqpdqpdddp
+F-H0-1381 2 qgdppqddqkncpd
+F-H0-1382 18 nedpppmdpjddpdncnd
+F-H0-1384 5 qoqnpppmjppddpddpn
+F-H0-1385 42 cqdrdpfqdnppddpd
+F-H0-1386 10 qgpppddpndqfddrd
+F-H0-1387 8 nqppdppddffcdddb
+F-H0-1388 7 qhpppddpndqfddrd
+F-H0-1389 2 ncppdppddffcdddb
+F-H0-1390 2 godrdpfqdnppddpd
+F-H0-1391 2 hodrdpfqdnppddpd
+F-H0-1392 132 fcppdpdfcecfcddedcpd
+F-H0-1393 5 epppdqdocpdncocnddpd
+F-H0-1394 69 qcqdppdddpmcod
+F-H0-1395 64 neqdppdddpmcod
+F-H0-1396 6 pmpqdpqmpopddd
+F-H0-1397 6 bedpppcgdedcpd
+F-H0-1398 5 dddpppcgdedcpd
+F-H0-1399 4 fqdpppcgdedcpd
+F-H0-1400 2 depdppcddpgced
+F-H0-1401 2 cndpppcgdedcpd
+F-H0-1402 2 cddpppcgdedcpd
+F-H0-1403 2 pjdpppcgdedcpd
+F-H0-1404 2 cndqppcmdoddpd
+F-H0-1405 112 eeppdpdedhpddcgd
+F-H0-1406 18 ppmppqdpplpopddd
+F-H0-1407 15 nomppqdpplpopddd
+F-H0-1408 3 qfppqddpldpgddod
+F-H0-1409 17 qepepc
+F-H0-1410 12 pqodqd
+F-H0-1411 9 pfodqd
+F-H0-1412 8 pppepc
+F-H0-1413 6 dhdedc
+F-H0-1414 5 mcodqd
+F-H0-1415 5 ddpepc
+F-H0-1416 4 dppepc
+F-H0-1417 4 pmpopq
+F-H0-1418 4 dcodqd
+F-H0-1419 4 ncpepc
+F-H0-1420 2 dqpepc
+F-H0-1421 2 oeodqd
+F-H0-1422 2 dqodqd
+F-H0-1423 83 popqdpdcpd
+F-H0-1424 42 qopqdpdcpd
+F-H0-1425 5 npqpdpcdpd
+F-H0-1426 3 jjqpdpcdpd
+F-H0-1427 46 ncpqdppkdcpd
+F-H0-1428 37 mppqdppkdcpd
+F-H0-1429 12 djpdqpiddpcd
+F-H0-1430 6 dhpdqpiddpcd
+F-H0-1431 6 kqpqdppkdcpd
+F-H0-1432 5 jqpqdppkdcpd
+F-H0-1433 4 jdpqdppkdcpd
+F-H0-1434 4 dipqdppkdcpd
+F-H0-1435 4 kppqdppkdcpd
+F-H0-1436 4 cfpdqpiddpcd
+F-H0-1437 3 cipqdppkdcpd
+F-H0-1438 3 nppqdppkdcpd
+F-H0-1439 3 kdpqdppkdcpd
+F-H0-1440 3 opqppdkpcddp
+F-H0-1441 2 qeppdqpiddpc
+F-H0-1442 2 gqpqdppkdcpd
+F-H0-1443 77 ppcqpd
+F-H0-1444 44 pqcqpd
+F-H0-1445 18 dpcqpd
+F-H0-1446 13 qpcqpd
+F-H0-1447 8 opcqpd
+F-H0-1448 6 oqcqpd
+F-H0-1449 36 qmpopqpddpdd
+F-H0-1450 35 hdppdppdcded
+F-H0-1451 26 ecppdppdcded
+F-H0-1452 10 dnppcpepddpd
+F-H0-1453 7 eeppdppdcded
+F-H0-1454 5 nqpopqpddpdd
+F-H0-1455 3 pmpopqpddpdd
+F-H0-1456 3 qnppcpepddpd
+F-H0-1457 2 ncppdppdcded
+F-H0-1458 35 epqppdcpcd
+F-H0-1459 32 popqdppcdc
+F-H0-1460 26 idqppdcpcd
+F-H0-1461 18 qkdqpqdcpd
+F-H0-1462 15 qodqpqdcpd
+F-H0-1463 8 pjqdqpcddp
+F-H0-1464 5 pnpqdppcdc
+F-H0-1465 5 qopqdppcdc
+F-H0-1466 5 oqqpqdcpdd
+F-H0-1467 5 cjdqpqdcpd
+F-H0-1468 2 jpqppdcpcd
+F-H0-1469 2 qfpqdqpcdd
+F-H0-1470 2 jppqdppcdc
+F-H0-1471 70 djdpppcedfcdcffcdedcpd
+F-H0-1472 44 cjdpppcedfcdcffcdedcpd
+F-H0-1473 7 qfpqdpnqpoqpqnqopnpddd
+F-H0-1474 3 ckdpppcedfcdcffcdedcpd
+F-H0-1475 2 dkdpppcedfcdcffcdedcpd
+F-H0-1476 44 fqdppqddpc
+F-H0-1477 28 qedppqddpc
+F-H0-1478 12 jqppqddpcd
+F-H0-1479 9 cfdppqddpc
+F-H0-1480 7 podppqddpc
+F-H0-1481 4 qjdppqddpc
+F-H0-1482 3 jdppqddpcd
+F-H0-1483 2 ncppqddpcd
+F-H0-1484 52 onppqnjpqddpddql
+F-H0-1485 51 cqppcnjppddpcdcl
+F-H0-1486 16 qfppdppjncpddclc
+F-H0-1487 8 ldppdppjncpddclc
+F-H0-1488 6 pfppdppjncpddclc
+F-H0-1489 33 qnfqdpppdnjpddpd
+F-H0-1490 32 ncfqdpppdnjpddpd
+F-H0-1491 18 qjfqdpppdnjpddpd
+F-H0-1492 6 drfqdpppdnjpddpd
+F-H0-1493 4 qffqdpppdnjpddpd
+F-H0-1494 4 jqcnppdjfppddpdd
+F-H0-1495 2 djpppddpndpjddqf
+F-H0-1496 2 hofqdpppdnjpddpd
+F-H0-1497 2 djfqdpppdnjpddpd
+F-H0-1498 13 oqdpqe
+F-H0-1499 9 ecdpqe
+F-H0-1500 8 odddqo
+F-H0-1501 7 pqdpqe
+F-H0-1502 6 oqdpoc
+F-H0-1503 6 ppdpoc
+F-H0-1504 6 ppdpqe
+F-H0-1505 6 pqdpoc
+F-H0-1506 5 podpqe
+F-H0-1507 4 qodpqe
+F-H0-1508 4 podpoc
+F-H0-1509 3 opdpoc
+F-H0-1510 2 qpdpqe
+F-H0-1511 2 qpdpoc
+F-H0-1512 56 pfdppqddpkncpd
+F-H0-1513 26 qhpppddpidqfcd
+F-H0-1514 15 kddppqddpkncpd
+F-H0-1515 11 qfdppqddpkncpd
+F-H0-1516 4 dncnqppdkpdddp
+F-H0-1517 3 jpdppqddpkncpd
+F-H0-1518 3 lddppqddpkncpd
+F-H0-1519 2 qgdppqddpkncpd
+F-H0-1520 2 kcdppqddpkncpd
+F-H0-1521 2 djcnqppdkpdddp
+F-H0-1522 2 nedppqddpkncpd
+F-H0-1523 2 jcdppqddpkncpd
+F-H0-1524 47 fqdpopddpd
+F-H0-1525 19 fcdpopddpd
+F-H0-1526 8 cjdpopddpd
+F-H0-1527 7 jppddpddpo
+F-H0-1528 3 icdpppddod
+F-H0-1529 3 kppddpddpo
+F-H0-1530 3 fqppdedppd
+F-H0-1531 2 dlppdedppd
+F-H0-1532 2 ccppdedppd
+F-H0-1533 2 fddpppddod
+F-H0-1534 2 qkdpopddpd
+F-H0-1535 2 eqpdppdddo
+F-H0-1536 2 cfdpopddpd
+F-H0-1537 25 popqcpepdcpd
+F-H0-1538 25 phqpcddppcpe
+F-H0-1539 25 eqpqcpepdcpd
+F-H0-1540 24 gqpqcpepdcpd
+F-H0-1541 10 qopqcpepdcpd
+F-H0-1542 8 dnpqcpepdcpd
+F-H0-1543 6 eopqcpepdcpd
+F-H0-1544 4 dfdppqodqddc
+F-H0-1545 3 ippqcpepdcpd
+F-H0-1546 2 iqpqcpepdcpd
+F-H0-1547 38 dodqpqddpd
+F-H0-1548 19 qkdqpqddpd
+F-H0-1549 17 fqdpppdcpc
+F-H0-1550 14 pkdqpqddpd
+F-H0-1551 9 dndqpqddpd
+F-H0-1552 8 ecpppdcpcd
+F-H0-1553 7 oqqpqddpdd
+F-H0-1554 6 jpdqpqddpd
+F-H0-1555 3 cndqpqddpd
+F-H0-1556 2 fqdqpqddpd
+F-H0-1557 36 popqdpfqdnjpddpd
+F-H0-1558 32 qnpqdpfqdnjpddpd
+F-H0-1559 23 ncpqdpfqdnjpddpd
+F-H0-1560 11 pnpqdpfqdnjpddpd
+F-H0-1561 8 qopqdpfqdnjpddpd
+F-H0-1562 5 djpqdpfqdnjpddpd
+F-H0-1563 5 drpqdpfqdnjpddpd
+F-H0-1564 3 cjpqdpfqdnjpddpd
+F-H0-1565 3 pjpqdpfqdnjpddpd
+F-H0-1566 2 geppdpjddfpcddfc
+F-H0-1567 2 qjpqdpfqdnjpddpd
+F-H0-1568 2 qkpqdpfqdnjpddpd
+F-H0-1569 42 popdepdd
+F-H0-1570 15 dppdopdd
+F-H0-1571 11 ecppdopd
+F-H0-1572 9 ceppdopd
+F-H0-1573 9 dqppdepd
+F-H0-1574 6 doppdepd
+F-H0-1575 4 pcppeddp
+F-H0-1576 3 ncppdepd
+F-H0-1577 3 qjppdepd
+F-H0-1578 2 npppdopd
+F-H0-1579 44 pomppqdpqkddpd
+F-H0-1580 29 pjpmkqpdqpdddp
+F-H0-1581 24 kpmppqdpqkddpd
+F-H0-1582 9 opmppqdpqkddpd
+F-H0-1583 3 qfdmiqpdppddcp
+F-H0-1584 2 kqmppqdpqkddpd
+F-H0-1585 2 dfpppddpcddgic
+F-H0-1586 2 oomppqdpqkddpd
+F-H0-1587 87 qfpdqpjdcpdd
+F-H0-1588 6 pjpdqpjdcpdd
+F-H0-1589 5 coppdqpjdcpd
+F-H0-1590 4 jqpdqpjdcpdd
+F-H0-1591 3 jjpdqpjdcpdd
+F-H0-1592 2 fqpdqpjdcpdd
+F-H0-1593 71 popqdpqddcoc
+F-H0-1594 21 jqdqpdqpcdco
+F-H0-1595 17 qnpqdpqddcoc
+F-H0-1596 8 npdqpdqpcdco
+F-H0-1597 6 qopqdpqddcoc
+F-H0-1598 5 qkpqdpqddcoc
+F-H0-1599 3 kcqeqpcddppc
+F-H0-1600 2 cepqdpqddcoc
+F-H0-1601 2 kpqeqpcddppc
+F-H0-1602 105 qddpppddpjqcpdnclc
+F-H0-1603 5 qdppqhdppdqfjdqcdd
+F-H0-1604 58 hpeqpppdcpdd
+F-H0-1605 17 pooqqppddpdd
+F-H0-1606 14 mqoqqppddpdd
+F-H0-1607 10 cippdpcedcpd
+F-H0-1608 6 chppdpcedcpd
+F-H0-1609 6 dgppdpcedcpd
+F-H0-1610 4 fqdpppqepcdd
+F-H0-1611 4 dfpppddpcdec
+F-H0-1612 2 kpoqqppddpdd
+F-H0-1613 2 edpppddpcdec
+F-H0-1614 2 qddpppqepcdd
+F-H0-1615 2 ncoqqppddpdd
+F-H0-1616 2 qnppqddpddoc
+F-H0-1617 26 eqppecpd
+F-H0-1618 18 cppdqodd
+F-H0-1619 16 dpppecpd
+F-H0-1620 14 eqpdqodd
+F-H0-1621 12 dopdqodd
+F-H0-1622 8 pedpoqdd
+F-H0-1623 5 ncppecpd
+F-H0-1624 2 qnppecpd
+F-H0-1625 53 ppjjpd
+F-H0-1626 30 dpjjpd
+F-H0-1627 21 pqjjpd
+F-H0-1628 6 qdjjpp
+F-H0-1629 3 opjjdp
+F-H0-1630 3 dojjpp
+F-H0-1631 3 djjjdp
+F-H0-1632 3 oqjjpd
+F-H0-1633 2 ijjjdp
+F-H0-1634 2 ikjjpd
+F-H0-1635 32 eqeppppdcp
+F-H0-1636 26 plpopqddpd
+F-H0-1637 20 cppopqddpd
+F-H0-1638 19 dfpppdedcd
+F-H0-1639 17 dppopqddpd
+F-H0-1640 9 qgdppppepc
+F-H0-1641 7 pmpopqddpd
+F-H0-1642 3 oopopqddpd
+F-H0-1643 2 mqpopqddpd
+F-H0-1644 2 nqpopqddpd
+F-H0-1645 44 dddqqppd
+F-H0-1646 35 cddqqppd
+F-H0-1647 10 dodqqppd
+F-H0-1648 9 ccdqqppd
+F-H0-1649 7 cddppqqd
+F-H0-1650 7 oqcpdcpd
+F-H0-1651 3 qeppdqcd
+F-H0-1652 3 podpcdpc
+F-H0-1653 2 eqcpdcpd
+F-H0-1654 2 oqdqqppd
+F-H0-1655 2 pocpdcpd
+F-H0-1656 44 pjeqppdcpd
+F-H0-1657 40 deeqppdcpd
+F-H0-1658 13 cpeqppdcpd
+F-H0-1659 10 doeqppdcpd
+F-H0-1660 6 dfeqppdcpd
+F-H0-1661 4 qopqdpocdd
+F-H0-1662 4 cfeqppdcpd
+F-H0-1663 3 cjeqppdcpd
+F-H0-1664 2 jjpqdpocdd
+F-H0-1665 2 ckeqppdcpd
+F-H0-1666 2 jpeqppdcpd
+F-H0-1667 2 pjpqdpocdd
+F-H0-1668 35 ccppcqpd
+F-H0-1669 28 dcppcqpd
+F-H0-1670 9 dpppccpd
+F-H0-1671 5 ecppcqpd
+F-H0-1672 3 cpppccpd
+F-H0-1673 2 jpppccdp
+F-H0-1674 2 qnppqcdp
+F-H0-1675 2 popdcqdd
+F-H0-1676 111 pcppdppjddqdqcpdnclc
+F-H0-1677 95 nbppdppjddqdqcpdpcodnclc
+F-H0-1678 11 rqlqqqqppqppnqopdppjddpd
+F-H0-1679 8 nplqqqqppqppnqopdppjddpd
+F-H0-1680 105 oddpppddpjqcqdpcpdnclc
+F-H0-1681 97 dqpqhqfqdpcqddpd
+F-H0-1682 10 cppqhqfqdpcqddpd
+F-H0-1683 80 jcceqppddpdc
+F-H0-1684 10 qkoqdpqpdcpd
+F-H0-1685 8 nqppdqqdddoc
+F-H0-1686 7 qfoqdpqpdcpd
+F-H0-1687 6 jdceqppddpdc
+F-H0-1688 3 dkppdqqdddoc
+F-H0-1689 2 cfoqdpqpdcpd
+F-H0-1690 2 qioqdpqpdcpd
+F-H0-1691 84 ndppqhdppdqfjdofdd
+F-H0-1692 3 mpnqlqdpppnopjddpd
+F-H0-1693 28 codqdcpd
+F-H0-1694 23 ddcpqppd
+F-H0-1695 21 qpdqdcpd
+F-H0-1696 13 dodqdcpd
+F-H0-1697 10 qqdqdcpd
+F-H0-1698 7 pqdqdcpd
+F-H0-1699 2 fpcpqppd
+F-H0-1700 2 fqdpcdqd
+F-H0-1701 2 qodqdcpd
+F-H0-1702 2 oqdqdcpd
+F-H0-1703 98 kqdpfqcnqpddpd
+F-H0-1704 8 drdpfqcnqpddpd
+F-H0-1705 3 lqdpfqcnqpddpd
+F-H0-1706 3 jpdpfqcnqpddpd
+F-H0-1707 81 piqhpppddpndqfjdofdd
+F-H0-1708 6 rpppqnnponjppddpddql
+F-H0-1709 4 ngppdppjnepfddpdnclc
+F-H0-1710 2 qqlqnqppdppnnopjddpd
+F-H0-1711 2 leppdppjnepfddpdnclc
+F-H0-1712 2 jqlqnqppdppnnopjddpd
+F-H0-1713 33 qnnqpppddpdd
+F-H0-1714 22 clppdpcnddpd
+F-H0-1715 14 pfpppddpddnc
+F-H0-1716 8 pjdpppqfpddd
+F-H0-1717 7 kpnqpppddpdd
+F-H0-1718 3 kcpppddpddnc
+F-H0-1719 2 ncppdpcfddpd
+F-H0-1720 41 cqhqfqdpppdcpd
+F-H0-1721 27 onppqncppdqldd
+F-H0-1722 5 ncqhpppddpcdqf
+F-H0-1723 5 phqhpppddpcdqf
+F-H0-1724 4 dnhqfqdpppdcpd
+F-H0-1725 2 dehqfqdpppdcpd
+F-H0-1726 101 efdpppdhdeeepddcgd
+F-H0-1727 2 eddpppdhdeeepddcgd
+F-H0-1728 72 jpdppqcnfqdcpd
+F-H0-1729 19 ipdppqcnfqdcpd
+F-H0-1730 14 bpfqcnqppddpcd
+F-H0-1731 2 pkdppqcnfqdcpd
+F-H0-1732 2 qndppqcnfqdcpd
+F-H0-1733 54 popqpddpcd
+F-H0-1734 23 cnpqpddpcd
+F-H0-1735 12 qkdppqcdpd
+F-H0-1736 12 qopqpddpcd
+F-H0-1737 9 qodppqcdpd
+F-H0-1738 9 pkdppqcdpd
+F-H0-1739 2 ndppdqqddd
+F-H0-1740 2 jpdppqcdpd
+F-H0-1741 2 qfddpppccp
+F-H0-1742 78 ndppqhdppdqfddof
+F-H0-1743 16 cnfqhqppdpfoddpd
+F-H0-1744 21 qodppqpnpd
+F-H0-1745 20 pcfpppddcp
+F-H0-1746 14 dddppqpnpd
+F-H0-1747 9 qldppqpnpd
+F-H0-1748 8 npdppqpnpd
+F-H0-1749 3 qpdppqpnpd
+F-H0-1750 2 nqppdqdndd
+F-H0-1751 2 qkdppqpnpd
+F-H0-1752 2 pkdppqpnpd
+F-H0-1753 107 cphqpqdqfqdpcqddpd
+F-H0-1754 111 feppdpefdhdeeepddcgd
+F-H0-1755 52 opppnqnpmpmodppjddpd
+F-H0-1756 14 plppqnjppmdppdpnddom
+F-H0-1757 11 qmppqnjppmdppdpnddom
+F-H0-1758 4 olppqnjppmdppdpnddom
+F-H0-1759 3 qeogpppfdppdpgjdqfdd
+F-H0-1760 2 dcegppdfdppddgjdcfdd
+F-H0-1761 95 dopqhqfqdqcqdpcpddpd
+F-H0-1762 2 ocqpqhdpqdqfpdqcddpc
+F-H0-1763 2 crpqhqfqdqcqdpcpddpd
+F-H0-1764 57 jdpqdpqkddpfncpd
+F-H0-1765 41 bdqdppfddpddcfkc
+F-H0-1766 4 diqdppfddpddcfkc
+F-H0-1767 3 mppqdpqkddpfncpd
+F-H0-1768 2 kcpqdpqkddpfncpd
+F-H0-1769 96 dddpppdheffedeeepddcgd
+F-H0-1770 4 ffdpppdheffedeeepddcgd
+F-H0-1771 2 ccdpppdheffedeeepddcgd
+F-H0-1772 35 fqdppqedpd
+F-H0-1773 21 cddppqedpd
+F-H0-1774 20 pkdppqedpd
+F-H0-1775 18 qkdppqedpd
+F-H0-1776 5 qjopdppddc
+F-H0-1777 4 ceopdppddc
+F-H0-1778 3 qjdppdpocd
+F-H0-1779 2 cedppqedpd
+F-H0-1780 36 qhqppdcpjdqfdd
+F-H0-1781 19 ndqppdcpjdqfdd
+F-H0-1782 13 piqppdcpjdqfdd
+F-H0-1783 10 pnqnppqdjpcddp
+F-H0-1784 7 nonqppdqpjdcpd
+F-H0-1785 7 jdnqppdqpjdcpd
+F-H0-1786 5 oonqppdqpjdcpd
+F-H0-1787 3 jddqppncpjdcpd
+F-H0-1788 3 epqppdcpjdcfdd
+F-H0-1789 38 coppdqddpc
+F-H0-1790 32 fcppcpddqd
+F-H0-1791 10 fqdppqpddc
+F-H0-1792 6 ncppcpddqd
+F-H0-1793 4 odppcpddqd
+F-H0-1794 2 kcppcpddqd
+F-H0-1795 2 jjppcpddqd
+F-H0-1796 34 qnpqdpfqcnipddpd
+F-H0-1797 28 popqdpfqcnipddpd
+F-H0-1798 23 pnpqdpfqcnipddpd
+F-H0-1799 6 ncpqdpfqcnipddpd
+F-H0-1800 4 qjpqdpfqcnipddpd
+F-H0-1801 3 cicnfqdkpppddpcd
+F-H0-1802 2 cocnfqdkpppddpcd
+F-H0-1803 2 qfpqdpfqcnipddpd
+F-H0-1804 2 qopqdpfqcnipddpd
+F-H0-1805 105 drhqpqdqfqdpcqdocpddpd
+F-H0-1806 94 eqdrercrhqpqdqfqdpcqdocpddpd
+F-H0-1807 2 frdrercrhqpqdqfqdpcqdocpddpd
+F-H0-1808 105 crerdrhqpqdqfqdpcqdocpddpd
+F-H0-1809 95 erdrhqpqdqfqdpcqdocpddpd
+F-H0-1810 105 cnerdrhqcreqpqdqfqdpcqdocpddpd
+F-H0-1811 70 qfoqdpqpqjqlddpd
+F-H0-1812 33 mccepppddphcjcdc
+F-H0-1813 40 podrercrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-1814 29 qodrercrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-1815 11 kqdrercrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-1816 5 qffqppdqepcqdpbqcpbpcocnbopdclcd
+F-H0-1817 4 egppdpcfdecdddpchcfcecccdcdbebcb
+F-H0-1818 3 fqqrorprpqqqoqnqlqdqppqppoqnpddd
+F-H0-1819 3 pndrercrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-1820 2 qndrercrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-1821 2 qfdrercrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-1822 34 ceqppdcpdc
+F-H0-1823 31 dodqqpdcpd
+F-H0-1824 15 cfqppdcpdc
+F-H0-1825 9 dedqqpdcpd
+F-H0-1826 5 kqdqqpdcpd
+F-H0-1827 3 cedqppdcqd
+F-H0-1828 2 cjdqqpdcpd
+F-H0-1829 61 qldpfqqnppcnjpddpd
+F-H0-1830 12 nqdpfqqnppcnjpddpd
+F-H0-1831 7 npnqpppddpddpjncqf
+F-H0-1832 7 pkdpfqqnppcnjpddpd
+F-H0-1833 7 npdpfqqnppcnjpddpd
+F-H0-1834 3 phdpppqfpdcfjdddfc
+F-H0-1835 2 kcnqqnpppjdppdncdd
+F-H0-1836 36 ppdepd
+F-H0-1837 17 dqpedd
+F-H0-1838 11 dpdepd
+F-H0-1839 10 cdpodp
+F-H0-1840 4 qpoppd
+F-H0-1841 3 dqoppd
+F-H0-1842 15 oqddqe
+F-H0-1843 10 poddqe
+F-H0-1844 6 dqpdce
+F-H0-1845 6 pddpec
+F-H0-1846 6 qoddqe
+F-H0-1847 4 cpddqe
+F-H0-1848 3 coddqe
+F-H0-1849 3 deppoc
+F-H0-1850 2 epppoc
+F-H0-1851 2 dqddqe
+F-H0-1852 40 jddppqcfpdddfc
+F-H0-1853 28 dbdppqcfpdddfc
+F-H0-1854 10 cfpdppddcpncqf
+F-H0-1855 3 qkpdppddcpncqf
+F-H0-1856 3 dkfqcnppqddpdd
+F-H0-1857 2 fedppqcfpdddfc
+F-H0-1858 2 jqdpfqcnppddpc
+F-H0-1859 34 cqddqq
+F-H0-1860 15 pqdpqc
+F-H0-1861 8 ppdpqc
+F-H0-1862 7 qpdpqc
+F-H0-1863 2 epddqq
+F-H0-1864 2 fqdpqc
+F-H0-1865 2 dnpdcq
+F-H0-1866 2 oqdpqc
+F-H0-1867 49 ppccpd
+F-H0-1868 28 cdqqpd
+F-H0-1869 15 pdqqdp
+F-H0-1870 8 pdqcdd
+F-H0-1871 6 qpccpd
+F-H0-1872 2 dqqqpd
+F-H0-1873 2 cccqpp
+F-H0-1874 2 oqccpd
+F-H0-1875 23 opddpe
+F-H0-1876 6 dpppod
+F-H0-1877 5 pddppo
+F-H0-1878 5 epppod
+F-H0-1879 5 cdppod
+F-H0-1880 5 coddpe
+F-H0-1881 4 oqddpe
+F-H0-1882 3 dcdppo
+F-H0-1883 3 qoddpe
+F-H0-1884 2 npddpe
+F-H0-1885 2 poddpe
+F-H0-1886 2 eeppod
+F-H0-1887 2 cppdde
+F-H0-1888 40 pomppqdppkddpd
+F-H0-1889 20 jpmppqdppkddpd
+F-H0-1890 14 opmppqdppkddpd
+F-H0-1891 11 kpmppqdppkddpd
+F-H0-1892 4 qnpppddpiddgcd
+F-H0-1893 4 kqmppqdppkddpd
+F-H0-1894 3 pnmppqdppkddpd
+F-H0-1895 3 npmppqdppkddpd
+F-H0-1896 2 oomppqdppkddpd
+F-H0-1897 88 medpppddpjqcqdpcpdncodnblc
+F-H0-1898 9 nddpppddpjqcqdpcpdncodnblc
+F-H0-1899 88 fcppdpefdhdefepdeegddcdd
+F-H0-1900 11 poppqpoplpnodppmoopdondd
+F-H0-1901 7 qoppqpoplpnodppmoopdondd
+F-H0-1902 23 eppppdcpdcde
+F-H0-1903 18 hppqcpepddpd
+F-H0-1904 16 eqpqcpepddpd
+F-H0-1905 14 qopqcpepddpd
+F-H0-1906 12 gqpqcpepddpd
+F-H0-1907 5 pnpqcpepddpd
+F-H0-1908 4 dnpqcpepddpd
+F-H0-1909 4 qnpqcpepddpd
+F-H0-1910 3 eopqcpepddpd
+F-H0-1911 40 ppcopd
+F-H0-1912 24 pqcopd
+F-H0-1913 13 qpcopd
+F-H0-1914 11 cdcopd
+F-H0-1915 8 ppeqpd
+F-H0-1916 4 pqqodd
+F-H0-1917 2 qoqedp
+F-H0-1918 2 edeqpd
+F-H0-1919 2 deeqpd
+F-H0-1920 2 occepp
+F-H0-1921 2 qpeqpd
+F-H0-1922 83 ncceppqddpocoddc
+F-H0-1923 19 pppqdpqopoqdddoc
+F-H0-1924 61 qjkqdpfqcnqpddpd
+F-H0-1925 29 nckqdpfqcnqpddpd
+F-H0-1926 4 peqnnqqippdddppc
+F-H0-1927 2 pjkqdpfqcnqpddpd
+F-H0-1928 2 mdqnnqqippdddppc
+F-H0-1929 2 jdkqdpfqcnqpddpd
+F-H0-1930 2 qkkqdpfqcnqpddpd
+F-H0-1931 31 pjdoppedpd
+F-H0-1932 22 qpopdppedd
+F-H0-1933 14 qpoppddodd
+F-H0-1934 8 jqeppdpodd
+F-H0-1935 7 kcpeppeddp
+F-H0-1936 5 qjpeppeddp
+F-H0-1937 4 cedoppedpd
+F-H0-1938 3 eqdoppedpd
+F-H0-1939 3 jqdoppedpd
+F-H0-1940 2 jjdoppedpd
+F-H0-1941 40 qippqhdppdpindqfjdofdd
+F-H0-1942 27 plqnpponnppkjppddpddql
+F-H0-1943 10 qeppqhdppdpindqfjdofdd
+F-H0-1944 2 qjppqhdppdpindqfjdofdd
+F-H0-1945 91 ccdpppfddedcpd
+F-H0-1946 3 onqpopdppdpndd
+F-H0-1947 3 cidpppfddedcpd
+F-H0-1948 49 jpdpppdjpjddpd
+F-H0-1949 30 fcdpppdjpjddpd
+F-H0-1950 11 jjdpppdjpjddpd
+F-H0-1951 2 qjpppdjpjddpdd
+F-H0-1952 36 ocdqpqddqd
+F-H0-1953 22 fcdqpqddqd
+F-H0-1954 12 dedpqpdcpc
+F-H0-1955 6 codqpqddqd
+F-H0-1956 5 ncdqpqddqd
+F-H0-1957 2 deqpqddpdc
+F-H0-1958 2 nddqpqddqd
+F-H0-1959 22 nqqnppjj
+F-H0-1960 18 pnnqppjj
+F-H0-1961 5 mqqnppjj
+F-H0-1962 4 ndjjpdnc
+F-H0-1963 4 qhjjpdqf
+F-H0-1964 3 ddfqdpjj
+F-H0-1965 3 ofjjpdqf
+F-H0-1966 3 pijjpdqf
+F-H0-1967 3 pdqnppjj
+F-H0-1968 2 ooqnppjj
+F-H0-1969 62 nqppdppjddmeqcqdpcpdncodnblc
+F-H0-1970 15 pjchppegdpdecfpdbfjdcdddccdc
+F-H0-1971 5 qnppdppjddmeqcqdpcpdncodnblc
+F-H0-1972 3 jclqnrqpqqpppqopnqmodppjddpd
+F-H0-1973 38 iqcqdrdpfqdnppddpd
+F-H0-1974 3 djpdppfddpddcfccbd
+F-H0-1975 2 dkcqbpppcnfppddpdd
+F-H0-1976 49 cpddpqocqd
+F-H0-1977 11 ddoqqpdppc
+F-H0-1978 11 phppcdqepc
+F-H0-1979 7 peddpqocqd
+F-H0-1980 4 mdddpqocqd
+F-H0-1981 2 mcddpqocqd
+F-H0-1982 2 pfddpqocqd
+F-H0-1983 54 iphqfqdpppdnfoddpd
+F-H0-1984 9 rpppqnnpondppdqldd
+F-H0-1985 6 mfqhpppddpndqfddof
+F-H0-1986 3 ohqhpppddpndqfddof
+F-H0-1987 2 qippqnnpondppdqldd
+F-H0-1988 27 cedppqdedcpd
+F-H0-1989 18 pldppqpodcpd
+F-H0-1990 11 qmdppqpodcpd
+F-H0-1991 8 fddppqdedcpd
+F-H0-1992 5 eedppqdedcpd
+F-H0-1993 4 cndppqpodcpd
+F-H0-1994 4 pkdppqpodcpd
+F-H0-1995 2 qodppqdedcpd
+F-H0-1996 76 rppqdpfqqnjpcnpoddpd
+F-H0-1997 3 pnpqdpfqqnjpcnpoddpd
+F-H0-1998 14 depppecp
+F-H0-1999 14 ppqddodd
+F-H0-2000 14 popqedpd
+F-H0-2001 11 dopqedpd
+F-H0-2002 7 copdpocd
+F-H0-2003 4 dqpqedpd
+F-H0-2004 3 ncpqedpd
+F-H0-2005 2 pnpqedpd
+F-H0-2006 61 dpoqddpd
+F-H0-2007 23 dcppdpoc
+F-H0-2008 9 qpoqddpd
+F-H0-2009 3 pooqddpd
+F-H0-2010 2 dqcepppd
+F-H0-2011 2 poqedpdd
+F-H0-2012 61 jpppnqpndppjddpd
+F-H0-2013 16 prppnqpndppjddpd
+F-H0-2014 8 ncppnqpndppjddpd
+F-H0-2015 4 kdppdppjddpfncpd
+F-H0-2016 2 qqppnqpndppjddpd
+F-H0-2017 2 efpdppjddpfdcfdd
+F-H0-2018 72 pmppqnjpqddpddpn
+F-H0-2019 29 cpeqpqddpd
+F-H0-2020 11 qkeqpqddpd
+F-H0-2021 8 fceqpqddpd
+F-H0-2022 8 nqpppdcocd
+F-H0-2023 7 peppdpocdc
+F-H0-2024 7 idpppdcocd
+F-H0-2025 7 qoeqpqddpd
+F-H0-2026 4 cjeqpqddpd
+F-H0-2027 3 djpppdcocd
+F-H0-2028 2 cqeqpqddpd
+F-H0-2029 2 ckeqpqddpd
+F-H0-2030 9 lqppqnnp
+F-H0-2031 4 qcpdqfnd
+F-H0-2032 3 rdpdqfnd
+F-H0-2033 2 ecpfncpd
+F-H0-2034 2 popdqfnd
+F-H0-2035 2 lpppqnnp
+F-H0-2036 19 ndppqedpddpc
+F-H0-2037 15 fcdpppqdocdd
+F-H0-2038 11 deppdppdeccd
+F-H0-2039 9 nqpqdppdqodd
+F-H0-2040 6 kqppeqcpddpd
+F-H0-2041 6 dgppdppdeccd
+F-H0-2042 6 gqdqpppdcodd
+F-H0-2043 3 jcppdppdeccd
+F-H0-2044 3 icppdppdeccd
+F-H0-2045 2 qfppdppdeccd
+F-H0-2046 2 dgdqpppdcodd
+F-H0-2048 5 onqnpppmjpqddpddpn
+F-H0-2049 5 qoqnpppmjpqddpddpn
+F-H0-2050 34 cpodpqddqd
+F-H0-2051 22 eqppcpepdc
+F-H0-2052 14 phppcdpepc
+F-H0-2053 7 dpodpqddqd
+F-H0-2054 6 pfodpqddqd
+F-H0-2055 4 mqopqpdppc
+F-H0-2056 2 oeodpqddqd
+F-H0-2057 2 fqdodqddqp
+F-H0-2058 15 fqdpppddpfncpdkcqcpb
+F-H0-2059 14 qfppdppddficddfcccdb
+F-H0-2060 3 cjdrcqiqdpfqdnppddpd
+F-H0-2061 3 qjdrcqiqdpfqdnppddpd
+F-H0-2062 2 qfdrcqiqdpfqdnppddpd
+F-H0-2063 74 cbppdpdefdpddccc
+F-H0-2064 90 cddpppfddedcpdcbcc
+F-H0-2065 25 qnppnqpjdppdddjd
+F-H0-2067 10 pfppdpjpddpjncpd
+F-H0-2068 10 hqppdpjpddpjncpd
+F-H0-2069 5 pjdjpppddpjdqfdd
+F-H0-2070 3 djppnqpjdppdddjd
+F-H0-2071 3 pgppdpjpddpjncpd
+F-H0-2072 2 ooppnqpjdppdddjd
+F-H0-2073 2 cndjpppddpjdqfdd
+F-H0-2074 2 cfdjpppddpjdqfdd
+F-H0-2075 2 cmdjpppddpjdqfdd
+F-H0-2076 2 qcpjpppddpjdcfdd
+F-H0-2077 2 qnppdpjpddpjncpd
+F-H0-2078 41 pfdppqncqkdcpd
+F-H0-2079 4 dkcnkqpdqpcddp
+F-H0-2080 4 dncnkqpdqpcddp
+F-H0-2081 3 clcnkqpdqpcddp
+F-H0-2082 36 ncppdppjecpd
+F-H0-2083 17 nqppdppjecpd
+F-H0-2084 13 dcppcejppddp
+F-H0-2085 3 dipdppjdcodd
+F-H0-2086 2 kqppeqpjddpd
+F-H0-2087 2 jdppeqpjddpd
+F-H0-2088 68 pcppcedpqdodocncdc
+F-H0-2089 40 qqlqnqppdppjdcpd
+F-H0-2090 22 nolqnqppdppjdcpd
+F-H0-2091 11 qnlqnqppdppjdcpd
+F-H0-2092 5 lplqnqppdppjdcpd
+F-H0-2093 3 ndqhpppdcpjdqfdd
+F-H0-2094 48 mdceppqddppcodocncdc
+F-H0-2095 25 ndceppqddppcodocncdc
+F-H0-2096 12 rdpqdpqppoqoqnqdddoc
+F-H0-2097 65 ebppdpdefdpddccdcbcc
+F-H0-2098 6 bbppdpdefdpddccdcbcc
+F-H0-2099 3 dhppdpdefdpddccdcbcc
+F-H0-2100 2 cfdqbqcqppepcppddndd
+F-H0-2101 49 pppddpec
+F-H0-2102 21 dcqodppd
+F-H0-2103 4 popddpec
+F-H0-2104 4 opqodppd
+F-H0-2105 2 pqqodppd
+F-H0-2106 2 qopddpec
+F-H0-2107 44 ffdpppdheffedeeepdfcgddcdd
+F-H0-2108 38 qcqfppofdpoepgqdneldpdddod
+F-H0-2109 20 qpdpoqdcpd
+F-H0-2110 18 dedpoqdcpd
+F-H0-2111 15 fqdpoqdcpd
+F-H0-2112 5 cedpoqdcpd
+F-H0-2113 51 opqpdpdcpd
+F-H0-2114 33 ceqpdpdcpd
+F-H0-2115 5 pfcppppcdd
+F-H0-2116 66 npqnppondppdpkdd
+F-H0-2117 5 cnfqipppdpfoddpd
+F-H0-2118 2 gqenppcndppddkdd
+F-H0-2119 36 bdppdpddcffcpd
+F-H0-2120 29 pjdppppdqfncdd
+F-H0-2121 3 fqdpppqfddpdnc
+F-H0-2122 3 nqppdpddcffcpd
+F-H0-2123 2 cippdpddcffcpd
+F-H0-2124 2 iqppnqqndpddpd
+F-H0-2125 18 oqopqppd
+F-H0-2126 10 qppepcdd
+F-H0-2127 8 fddedcpd
+F-H0-2128 7 dhdedcpd
+F-H0-2129 7 qpdedcpd
+F-H0-2130 6 oeppqdod
+F-H0-2131 5 dpdedcpd
+F-H0-2132 5 mqopqppd
+F-H0-2133 5 pdepcpdd
+F-H0-2134 4 qnopqppd
+F-H0-2135 3 qeppdqdo
+F-H0-2136 3 pqdedcpd
+F-H0-2137 2 ocdpcded
+F-H0-2138 2 pmopqppd
+F-H0-2139 2 cdppqdod
+F-H0-2140 28 qldpoqqjqpdcpd
+F-H0-2141 18 opqpcedppdjcdc
+F-H0-2142 6 qgdpoqqjqpdcpd
+F-H0-2143 5 ecjqpqpddpcdqo
+F-H0-2144 5 nqqpcedppdjcdc
+F-H0-2145 5 qhdpoqqjqpdcpd
+F-H0-2146 3 cndpoqqjqpdcpd
+F-H0-2147 2 fqdpoqqjqpdcpd
+F-H0-2148 2 djdpoqqjqpdcpd
+F-H0-2149 50 ddjjdppd
+F-H0-2150 18 dcjjdppd
+F-H0-2151 8 peppddjj
+F-H0-2152 3 cfjjppdd
+F-H0-2153 2 cedppdjj
+F-H0-2154 42 qnfqdpppcnjpdcpd
+F-H0-2155 19 ncfqdpppcnjpdcpd
+F-H0-2156 16 qjfqdpppcnjpdcpd
+F-H0-2157 5 qnppdqpdcfjdddfc
+F-H0-2158 2 jdfqdpppcnjpdcpd
+F-H0-2159 2 drfqdpppcnjpdcpd
+F-H0-2160 40 qlrppqdpfqqnjpcnpoddpd
+F-H0-2161 24 pnrppqdpfqqnjpcnpoddpd
+F-H0-2162 12 plrppqdpfqqnjpcnpoddpd
+F-H0-2163 30 qpdpfqcnpd
+F-H0-2164 7 drdpfqcnpd
+F-H0-2165 5 pqdpfqcnpd
+F-H0-2166 4 ppdpfqcnpd
+F-H0-2167 3 ppfqcndppd
+F-H0-2168 3 chcfppddfc
+F-H0-2169 2 jpdpfqcnpd
+F-H0-2170 29 fqdpopdcpd
+F-H0-2171 14 dedpopdcpd
+F-H0-2172 5 qpdpopdcpd
+F-H0-2173 3 iqdpopdcpd
+F-H0-2174 3 oqqpdedppd
+F-H0-2175 3 pjdpopdcpd
+F-H0-2176 2 dfdpopdcpd
+F-H0-2177 30 nqhqfqdpqpddpd
+F-H0-2178 27 cqhqfqdpqpddpd
+F-H0-2179 13 ofqhpqpddpddqf
+F-H0-2180 7 oqhqfqdpqpddpd
+F-H0-2181 4 cfdpppddqdhcfc
+F-H0-2182 12 dppdqocd
+F-H0-2183 10 dqpqecpd
+F-H0-2184 8 popqecpd
+F-H0-2185 7 eppdqocd
+F-H0-2186 5 pnpqecpd
+F-H0-2187 4 eqpdqocd
+F-H0-2188 4 dopdqocd
+F-H0-2189 4 qopqecpd
+F-H0-2190 3 cppqecpd
+F-H0-2191 3 eqpqecpd
+F-H0-2192 2 nqppeqpc
+F-H0-2193 31 jpdpfqdnppdcpd
+F-H0-2194 15 bpqpcnfppddpdd
+F-H0-2195 3 mqdpfqdnppdcpd
+F-H0-2196 2 pjdpfqdnppdcpd
+F-H0-2197 2 nepqdppfddpdnc
+F-H0-2198 2 ipdpfqdnppdcpd
+F-H0-2199 29 qcqhpppdcpddqf
+F-H0-2200 17 ofqhpppdcpddqf
+F-H0-2201 8 cfdppqddpdhcfc
+F-H0-2202 6 plppqndppdqlcd
+F-H0-2203 2 dfdppqddpdhcfc
+F-H0-2204 13 nqppeppdde
+F-H0-2205 5 dmpppedped
+F-H0-2206 4 cjdpopddpe
+F-H0-2207 4 gddppoddod
+F-H0-2208 4 jddpopddpe
+F-H0-2209 3 cnpppedped
+F-H0-2210 3 pidppoddod
+F-H0-2211 3 djdpopddpe
+F-H0-2212 3 jjdppoddod
+F-H0-2213 2 ocdpopddpe
+F-H0-2214 2 qpdpopddpe
+F-H0-2215 2 fpdpopddpe
+F-H0-2216 2 nqppdedpod
+F-H0-2217 24 fcdqppcfddpd
+F-H0-2218 13 qldpppqnddpc
+F-H0-2219 11 pedpppqnddpc
+F-H0-2220 10 kpnqppcpddpd
+F-H0-2221 8 pnnqppcpddpd
+F-H0-2222 5 dndqppcfddpd
+F-H0-2223 3 jpnqppcpddpd
+F-H0-2224 2 lpnqppcpddpd
+F-H0-2225 21 cppqqddd
+F-H0-2226 19 ddcppqpd
+F-H0-2227 10 oddpdcqd
+F-H0-2228 7 qpdpdcqd
+F-H0-2229 7 qedpqppc
+F-H0-2230 4 ccdpqppc
+F-H0-2231 2 nddpdcqd
+F-H0-2232 2 podpdcqd
+F-H0-2233 57 qjoqdqqpddpd
+F-H0-2234 8 qippdpqddcoc
+F-H0-2235 5 eqcepppdcpdc
+F-H0-2236 4 nqppdpqddcoc
+F-H0-2237 4 jdcepppdcpdc
+F-H0-2238 3 fcqeqpdddppc
+F-H0-2239 2 ipcepppdcpdc
+F-H0-2240 2 ckoqdqqpddpd
+F-H0-2241 28 qhdpoqqjqpqfqlddpd
+F-H0-2242 10 nddpoqqjqpqfqlddpd
+F-H0-2243 9 ncdpoqqjqpqfqlddpd
+F-H0-2244 4 mcdpoqqjqpqfqlddpd
+F-H0-2245 22 dcqpdqpd
+F-H0-2246 18 cpppdcqd
+F-H0-2247 17 dpddqppc
+F-H0-2248 8 peddqppc
+F-H0-2249 8 ocppdcqd
+F-H0-2250 7 eqppdcqd
+F-H0-2251 3 ccqpdqpd
+F-H0-2252 53 qjnqdpqpddpd
+F-H0-2253 11 nqppdpqdddnc
+F-H0-2254 9 djppdpqdddnc
+F-H0-2255 4 iccfpppddpdc
+F-H0-2256 4 pjnqdpqpddpd
+F-H0-2257 2 nccfpppddpdc
+F-H0-2258 16 ppdpecpd
+F-H0-2259 8 qpdpecpd
+F-H0-2260 8 cedpqopd
+F-H0-2261 7 pqdpecpd
+F-H0-2262 6 dedpqopd
+F-H0-2263 6 qodpecpd
+F-H0-2264 5 peppeqdd
+F-H0-2265 4 qfdpqopd
+F-H0-2266 31 cnoqdpfqddpd
+F-H0-2267 22 dnoqdpfqddpd
+F-H0-2268 11 dipppdcoddcf
+F-H0-2269 5 jpoqdpfqddpd
+F-H0-2270 5 hqoqdpfqddpd
+F-H0-2271 4 pooqdpfqddpd
+F-H0-2272 3 iqoqdpfqddpd
+F-H0-2273 2 qjqnppqedpdd
+F-H0-2274 22 ncppdpjjddpd
+F-H0-2275 21 qjppdpjjddpd
+F-H0-2276 13 jdppdpjjddpd
+F-H0-2277 13 jppppddpddjj
+F-H0-2278 6 jpjjpppddpdd
+F-H0-2279 3 qnppdpjjddpd
+F-H0-2280 2 npppdpjjddpd
+F-H0-2281 46 dpopddpd
+F-H0-2282 13 dqopddpd
+F-H0-2283 7 eqopddpd
+F-H0-2284 6 qpopddpd
+F-H0-2285 5 popedpdd
+F-H0-2286 3 cdppdpod
+F-H0-2287 2 ecdepppd
+F-H0-2288 24 fqdpppccpd
+F-H0-2289 19 dpcqppddpd
+F-H0-2290 16 jppdppccdp
+F-H0-2291 9 fddpppccpd
+F-H0-2292 4 cndpppccpd
+F-H0-2293 4 jjdpppccpd
+F-H0-2294 3 fqcqppddpd
+F-H0-2295 2 cjcqppddpd
+F-H0-2296 41 ncpjqppddpddqf
+F-H0-2297 21 cqppcndppddjcd
+F-H0-2298 12 fojppqdpfqddpd
+F-H0-2299 5 dnjppqdpfqddpd
+F-H0-2300 31 nqqppddpcdpjncqf
+F-H0-2301 20 popqdpfqcnjpdcpd
+F-H0-2302 9 ncpqdpfqcnjpdcpd
+F-H0-2303 5 fdcnfqdjqppddpcd
+F-H0-2304 3 qopqdpfqcnjpdcpd
+F-H0-2305 18 qnpppddpec
+F-H0-2306 7 fqdpqoddpd
+F-H0-2307 3 npdpqoddpd
+F-H0-2308 2 oqdpqoddpd
+F-H0-2309 2 nqpppddpec
+F-H0-2310 2 pjdpppddqe
+F-H0-2311 23 cfdpppjdpdddfc
+F-H0-2312 16 cqjpfqdpppddpd
+F-H0-2313 14 onppqndppdpjdd
+F-H0-2314 5 npppqndppdpjdd
+F-H0-2315 3 phpjpppddpddqf
+F-H0-2316 3 mqjpfqdpppddpd
+F-H0-2317 2 lqjpfqdpppddpd
+F-H0-2318 2 dmjpfqdpppddpd
+F-H0-2319 2 drjpfqdpppddpd
+F-H0-2320 2 hqjpfqdpppddpd
+F-H0-2321 37 clppdpdjcedfcdcffcdedcpd
+F-H0-2322 17 qjppdpdjcedfcdcffcdedcpd
+F-H0-2323 8 cmppdpdjcedfcdcffcdedcpd
+F-H0-2324 5 nqppdpdjcedfcdcffcdedcpd
+F-H0-2325 4 qnppdpdjcedfcdcffcdedcpd
+F-H0-2326 3 qfppdpdjcedfcdcffcdedcpd
+F-H0-2327 2 pjppdpdjcedfcdcffcdedcpd
+F-H0-2328 43 odppdppjmdmencpddcnd
+F-H0-2330 9 dlppcnjpdmdppddncdem
+F-H0-2331 4 cmppcnjpdmdppddncdem
+F-H0-2332 19 dqpqcdpd
+F-H0-2333 17 dppdpqcd
+F-H0-2334 7 edpdpqcd
+F-H0-2335 5 ecpdpqcd
+F-H0-2336 4 ncpqcdpd
+F-H0-2337 3 edppcppc
+F-H0-2338 2 pnpqcdpd
+F-H0-2339 2 eppdpqcd
+F-H0-2340 41 kcdppqcfqdddfc
+F-H0-2341 8 kddppqcfqdddfc
+F-H0-2342 6 cffqcnppqddpdc
+F-H0-2343 5 dbdppqcfqdddfc
+F-H0-2344 2 jddppqcfqdddfc
+F-H0-2345 2 ncppnqqncppddc
+F-H0-2346 62 dnpqipfqdpfoddpd
+F-H0-2347 6 ncqppidppdqfddof
+F-H0-2348 34 ncppdppjedpd
+F-H0-2349 17 qfpdppjddodd
+F-H0-2350 5 pcpppejpdddp
+F-H0-2351 3 djppdppjedpd
+F-H0-2352 2 jpppdppjedpd
+F-H0-2353 2 cipddpjdpodd
+F-H0-2354 2 kpppeppjddpd
+F-H0-2355 22 foipfqdpppdcpd
+F-H0-2356 18 cqipfqdpppdcpd
+F-H0-2357 7 cnipfqdpppdcpd
+F-H0-2358 2 ndpipppddpcdqf
+F-H0-2359 2 deipfqdpppdcpd
+F-H0-2360 35 cnfqdpopddpd
+F-H0-2361 19 dnfqdpopddpd
+F-H0-2362 11 ipfqdpopddpd
+F-H0-2363 5 hqfqdpopddpd
+F-H0-2364 5 pjdppdpoddqf
+F-H0-2365 4 pcqnpppedpdd
+F-H0-2366 3 iqfqdpopddpd
+F-H0-2367 40 pdqqddcq
+F-H0-2368 27 dcqqdpqc
+F-H0-2369 3 edqqdpqc
+F-H0-2370 2 ecqqdpqc
+F-H0-2371 2 ppqqdpqc
+F-H0-2372 2 npqqdpqc
+F-H0-2373 2 cdqqdpqc
+F-H0-2374 2 pdqqdpqc
+F-H0-2375 12 oodpoe
+F-H0-2376 4 fdpdeo
+F-H0-2377 3 podpoe
+F-H0-2378 3 odddoo
+F-H0-2379 2 eodpoe
+F-H0-2380 2 qodpoe
+F-H0-2381 2 pndpoe
+F-H0-2382 2 oqdpoe
+F-H0-2383 31 pcppqddpddodmcqc
+F-H0-2384 24 rcppqddpddodmcqc
+F-H0-2385 6 ddppdpdecgpddccc
+F-H0-2386 2 emcqdqppcmdoddpd
+F-H0-2387 28 pqcpdcqd
+F-H0-2388 18 ppcpdcqd
+F-H0-2389 10 qqcpdcqd
+F-H0-2390 3 qopqcpdc
+F-H0-2391 3 qpcpdcqd
+F-H0-2392 3 epcppqqd
+F-H0-2393 3 pocpdcqd
+F-H0-2394 2 occpdcqd
+F-H0-2395 53 rpppqnnpondppdpkdd
+F-H0-2396 8 mfpipppddpndqfddof
+F-H0-2397 6 kddpppdffeidpdddfc
+F-H0-2398 2 kqipfqdpppdnfoddpd
+F-H0-2399 41 gpdqppdldoddpc
+F-H0-2400 10 qoqpoplppddpcd
+F-H0-2401 9 nppqdpplpopddc
+F-H0-2402 8 fedppqdhdedcpd
+F-H0-2403 5 qcqdppldcpddod
+F-H0-2404 4 ogqdppldcpddod
+F-H0-2405 27 edcdppqcdp
+F-H0-2406 16 pjcqppdcpd
+F-H0-2407 16 dpcqppdcpd
+F-H0-2408 5 dfcqppdcpd
+F-H0-2409 4 cecqppdcpd
+F-H0-2410 2 fpcqppdcpd
+F-H0-2411 2 jccqppdcpd
+F-H0-2412 22 dcpqdqpd
+F-H0-2413 14 cdpqdqpd
+F-H0-2414 11 ddpqdqpd
+F-H0-2415 4 edpqdqpd
+F-H0-2416 3 cqppdcpc
+F-H0-2417 3 ecpqdqpd
+F-H0-2418 2 cepqdqpd
+F-H0-2419 28 opqpdqddpd
+F-H0-2420 19 nqppcpdcpd
+F-H0-2421 10 qopqdpddqd
+F-H0-2422 8 ecdqpppdcd
+F-H0-2423 2 cfpqdpddqd
+F-H0-2424 43 iccnfqdjpppddpcdfcdc
+F-H0-2425 16 pjpqdpfqqnqpcnjpddpd
+F-H0-2426 19 dddpppodqd
+F-H0-2427 13 cepppddedc
+F-H0-2428 12 dcdpppodqd
+F-H0-2429 9 lddpppodqd
+F-H0-2430 6 ooopqpddpd
+F-H0-2431 5 eqopqpddpd
+F-H0-2432 4 mcdpppodqd
+F-H0-2433 2 mpopqpddpd
+F-H0-2434 2 fdpppddedc
+F-H0-2435 44 cidpppfddedcpdebcdcbcc
+F-H0-2436 30 chdpppfddedcpdebcdcbcc
+F-H0-2437 2 cjercqcrppdqcpfpdoddpd
+F-H0-2438 33 qodppqpoqddcoc
+F-H0-2439 15 qmdppqpoqddcoc
+F-H0-2440 13 pldppqpoqddcoc
+F-H0-2441 2 pkdppqpoqddcoc
+F-H0-2442 24 qndppqqjqdddoc
+F-H0-2443 15 coppdqcjcdpdec
+F-H0-2444 14 lcppqedpcdjcpc
+F-H0-2445 9 lcppcedpqdjcdc
+F-H0-2446 5 fqdppqqjqdddoc
+F-H0-2447 4 fcdppqqjqdddoc
+F-H0-2448 2 mqjqdqpdqpddco
+F-H0-2449 42 cdppdpcfdcpd
+F-H0-2450 11 clppdqcnddpd
+F-H0-2451 8 ncppdpcfdcpd
+F-H0-2452 6 deppdpcfdcpd
+F-H0-2453 2 ceppdpcfdcpd
+F-H0-2454 2 cippdpcfdcpd
+F-H0-2455 2 dippdpcfdcpd
+F-H0-2456 26 lpoqqpdpddpd
+F-H0-2457 10 opdppqqoddpd
+F-H0-2458 9 qmdppqqoddpd
+F-H0-2459 7 kqoqqpdpddpd
+F-H0-2460 7 pnoqqpdpddpd
+F-H0-2461 4 kpoqqpdpddpd
+F-H0-2462 2 qldppqqoddpd
+F-H0-2463 42 ddopdppe
+F-H0-2464 13 qpdedpod
+F-H0-2465 3 podedpod
+F-H0-2466 2 qoopdppe
+F-H0-2467 2 pcpepped
+F-H0-2468 30 nppqdppdpodd
+F-H0-2469 16 qqpqdppdpodd
+F-H0-2470 5 ecppdedppddc
+F-H0-2471 4 mppqdppdpodd
+F-H0-2472 3 cnppepcpddpd
+F-H0-2473 3 cfpqdppdpodd
+F-H0-2474 3 ncppdppdedcd
+F-H0-2475 23 qnerdrnqcrhqfqeqcqdqppdpcpdocnddpd
+F-H0-2476 20 pnerdrnqcrhqfqeqcqdqppdpcpdocnddpd
+F-H0-2477 5 pnqnppqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-2478 3 kperdrnqcrhqfqeqcqdqppdpcpdocnddpd
+F-H0-2479 35 pqcpqd
+F-H0-2480 14 ppcpqd
+F-H0-2481 7 qpdqpc
+F-H0-2482 5 dppqdc
+F-H0-2483 4 ecpcdq
+F-H0-2484 2 cdcpqd
+F-H0-2485 18 eddpoppd
+F-H0-2486 11 dddppopd
+F-H0-2487 5 eddppopd
+F-H0-2488 4 oqdpedpd
+F-H0-2489 3 qfdppopd
+F-H0-2490 3 qpdpdepd
+F-H0-2491 2 eedppopd
+F-H0-2492 2 ecdppopd
+F-H0-2493 2 qqdpedpd
+F-H0-2494 5 nddpppqfpddficddfcccdb
+F-H0-2495 4 qlcqdrdpiqqnfqdnppddpd
+F-H0-2496 3 pkcqdrdpiqqnfqdnppddpd
+F-H0-2497 2 clcqdrdpiqqnfqdnppddpd
+F-H0-2498 2 pfdpppqfpddficddfcccdb
+F-H0-2499 21 cpeqpqdcpd
+F-H0-2500 17 opqppdcocd
+F-H0-2501 10 cipqdpocdc
+F-H0-2502 8 pkeqpqdcpd
+F-H0-2503 4 oqqppdcocd
+F-H0-2504 4 qoeqpqdcpd
+F-H0-2505 3 pepqdpocdc
+F-H0-2506 2 cqeqpqdcpd
+F-H0-2507 2 jqeqpqdcpd
+F-H0-2508 49 cfdppqcededcpd
+F-H0-2509 16 ppoqopqppddpcd
+F-H0-2510 57 qnnqppqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-2511 5 mqerdrhqcreqfqdqcqdpppdocpqncnddpd
+F-H0-2512 3 lcqprqppqqoppqdpnqrorpqoqnqlpdncdd
+F-H0-2513 2 pidpppqfcfdepdddcdhcfcecccdcdbebcb
+F-H0-2514 2 nddpppqfcfdepdddcdhcfcecccdcdbebcb
+F-H0-2515 19 ccfccfdbdd
+F-H0-2516 4 qgqfpdrdnc
+F-H0-2517 3 qhqfpdrdnc
+F-H0-2518 3 pjncqfpbpd
+F-H0-2519 2 ddqfpdrdnc
+F-H0-2520 20 qgdpkqcnfqqjqpddpd
+F-H0-2521 15 qkdpkqcnfqqjqpddpd
+F-H0-2522 13 pkdpkqcnfqqjqpddpd
+F-H0-2523 7 qhdpkqcnfqqjqpddpd
+F-H0-2524 5 ncfqcnppcidppdjcdc
+F-H0-2525 4 fcdpkqcnfqqjqpddpd
+F-H0-2526 3 qldpkqcnfqqjqpddpd
+F-H0-2527 23 copdoqdd
+F-H0-2528 9 dcppcopd
+F-H0-2529 7 deppcopd
+F-H0-2530 4 qodpqedd
+F-H0-2531 4 dopdoqdd
+F-H0-2532 3 ddppocdp
+F-H0-2533 39 jdpqdppkddpfncpd
+F-H0-2534 19 rdpdppnddpidqfcd
+F-H0-2535 6 kdpqdppkddpfncpd
+F-H0-2536 24 eppppdcpddjc
+F-H0-2537 8 oqqppddpddjc
+F-H0-2538 6 npqppddpddjc
+F-H0-2539 5 qnpqdpcjddpd
+F-H0-2540 4 clpqdpcjddpd
+F-H0-2541 2 qgdqppqjpddd
+F-H0-2542 2 ncpqdpcjddpd
+F-H0-2543 2 lqjqpppddpcd
+F-H0-2544 25 pmqpoplppdcpdd
+F-H0-2545 11 qoqpoplppdcpdd
+F-H0-2546 8 fodqppdldodcpd
+F-H0-2547 7 gedqppdhdedcpd
+F-H0-2548 5 fddqppdhdedcpd
+F-H0-2549 5 qqqpoplppdcpdd
+F-H0-2550 3 dedqppdldodcpd
+F-H0-2551 2 hpdqppdldodcpd
+F-H0-2552 2 fcqdpplddpcdod
+F-H0-2553 13 dddppqodqd
+F-H0-2554 13 qedpcdpepc
+F-H0-2555 11 dcdppqodqd
+F-H0-2556 6 pqdpcdpepc
+F-H0-2557 6 lddppqodqd
+F-H0-2558 5 oedpcdpepc
+F-H0-2559 4 nddpcdpepc
+F-H0-2560 2 ecdppqodqd
+F-H0-2561 32 lqnqppdppjddmeqcqdpcpdncodnblc
+F-H0-2562 14 ndnrlqqqqppqppnqopdpmoddpjncpd
+F-H0-2563 7 pfnrlqqqqppqppnqopdpmoddpjncpd
+F-H0-2564 7 nonqppdppjddmeqcqdpcpdncodnblc
+F-H0-2565 2 kdnrlqqqqppqppnqopdpmoddpjncpd
+F-H0-2566 43 drippqdpfqdnfoddpd
+F-H0-2567 4 fmippqdpfqdnfoddpd
+F-H0-2568 4 kpippqdpfqdnfoddpd
+F-H0-2569 49 qhqnpponnpoljppkdppjqlpiplpdqkddqj
+F-H0-2570 3 iqnqlqkpkqjpjqipppdplpnopnlopjddpd
+F-H0-2571 6 pjdpppcedfdcpd
+F-H0-2572 5 nqoqnpqppddpdd
+F-H0-2573 5 cndpppcedfdcpd
+F-H0-2574 5 dedpppcedfdcpd
+F-H0-2575 3 fqdpppcedfdcpd
+F-H0-2576 2 cjdpppcedfdcpd
+F-H0-2577 2 ckdpppcedfdcpd
+F-H0-2578 32 iqfqhqppdpipdnfoddpd
+F-H0-2579 22 plqnpponnppkdppdqldd
+F-H0-2580 5 eqfqhqppdpipdnfoddpd
+F-H0-2581 17 depqdpdcqd
+F-H0-2582 16 cepqdpdcqd
+F-H0-2583 15 opqpdqcdpd
+F-H0-2584 10 coqpdqcdpd
+F-H0-2585 3 oqqpdqcdpd
+F-H0-2586 3 fqpqcpdcpd
+F-H0-2587 2 fpcppqqddd
+F-H0-2588 23 cnopfqdpqpddpd
+F-H0-2589 21 mqopfqdpqpddpd
+F-H0-2590 15 lpopfqdpqpddpd
+F-H0-2591 4 pnopfqdpqpddpd
+F-H0-2592 2 mpopfqdpqpddpd
+F-H0-2593 25 cqdrdpfqcnppdcpd
+F-H0-2594 11 cgppqddpddcffcbd
+F-H0-2595 10 ncdrdpfqcnppdcpd
+F-H0-2596 9 qndrdpfqcnppdcpd
+F-H0-2597 4 nqdrdpfqcnppdcpd
+F-H0-2598 3 hqdrdpfqcnppdcpd
+F-H0-2599 22 nqfqeqepdqqnpppdcpdd
+F-H0-2600 12 cmfqdpppcecfcddedcpd
+F-H0-2601 9 ipfqdpppcecfcddedcpd
+F-H0-2602 5 hqfqdpppcecfcddedcpd
+F-H0-2603 3 dnfqdpppcecfcddedcpd
+F-H0-2604 3 dffqdpppcecfcddedcpd
+F-H0-2605 2 jpfqdpppcecfcddedcpd
+F-H0-2606 22 fedpppidqdddfc
+F-H0-2607 16 ncpipqpddpddqf
+F-H0-2608 7 cndidqpdppddcf
+F-H0-2609 7 cqipfqdpqpddpd
+F-H0-2610 7 kqipfqdpqpddpd
+F-H0-2611 5 dnipfqdpqpddpd
+F-H0-2612 4 hoipfqdpqpddpd
+F-H0-2613 3 oqipfqdpqpddpd
+F-H0-2614 32 popqdpqdddnc
+F-H0-2615 12 qnpqdpqdddnc
+F-H0-2616 9 qjpqdpqdddnc
+F-H0-2617 6 pnpqdpqdddnc
+F-H0-2618 4 qkpqdpqdddnc
+F-H0-2619 3 pjdqppcdpdfc
+F-H0-2620 2 qopqdpqdddnc
+F-H0-2621 2 qipqdpqdddnc
+F-H0-2622 20 cpeppqddpd
+F-H0-2623 13 qkeppqddpd
+F-H0-2624 10 fqdpppedpc
+F-H0-2625 6 pkeppqddpd
+F-H0-2626 5 ecpppddocd
+F-H0-2627 4 qjppdpoddc
+F-H0-2628 2 pjdpqdpodd
+F-H0-2629 2 poeppqddpd
+F-H0-2630 50 qpqqppqndppdpkdd
+F-H0-2631 10 pcpppidppdqfddqc
+F-H0-2632 20 pfdpfqcnppddjpncpd
+F-H0-2633 13 kddpfqcnppddjpncpd
+F-H0-2634 10 qlqnpppddpdddjfccf
+F-H0-2635 5 npnqppdppdcfjdddfc
+F-H0-2636 5 qnnqppdppdcfjdddfc
+F-H0-2637 3 djnqqnpppjdppdcfdd
+F-H0-2638 21 fqdppqjdqkddpfncpd
+F-H0-2639 18 jpdppqjdqkddpfncpd
+F-H0-2640 4 cfdppqjdqkddpfncpd
+F-H0-2641 4 picnkqdjqppdfpdddp
+F-H0-2642 2 jqpppddpndpjcdqfic
+F-H0-2643 2 icnqppjppndpqiddpc
+F-H0-2644 15 ndpppdqfdd
+F-H0-2645 11 ddnqppdppd
+F-H0-2646 9 pnqnpppddp
+F-H0-2647 7 lqnqppdppd
+F-H0-2648 7 dqpppdqfdd
+F-H0-2649 4 qnnqppdppd
+F-H0-2650 4 jpqnpppddp
+F-H0-2651 4 jpnqppdppd
+F-H0-2652 3 nonqppdppd
+F-H0-2653 54 iqcqdrdpfqcnppddpd
+F-H0-2654 2 fedpppcfpdddfcccdb
+F-H0-2655 2 pjpdppdddpqcqfncrd
+F-H0-2656 16 fqdppoddpd
+F-H0-2657 10 qnpppddped
+F-H0-2658 3 qjdppoddpd
+F-H0-2659 3 cppdppddep
+F-H0-2660 2 pidppoddpd
+F-H0-2661 2 gpdppoddpd
+F-H0-2662 2 jpdppoddpd
+F-H0-2663 2 qidppoddpd
+F-H0-2664 22 ceppdpdedcqd
+F-H0-2665 13 dlqpdqdoddpd
+F-H0-2666 9 odppdpdedcqd
+F-H0-2667 8 fpqpdqdoddpd
+F-H0-2668 6 cmqpdqdoddpd
+F-H0-2669 3 oqqpdqdoddpd
+F-H0-2670 2 dmqpdqdoddpd
+F-H0-2671 46 qqfqdpppqnjpcnqlddpd
+F-H0-2672 9 onfqdpppqnjpcnqlddpd
+F-H0-2673 4 nqfqdpppqnjpcnqlddpd
+F-H0-2674 2 plfqdpppqnjpcnqlddpd
+F-H0-2675 37 jdnqppjppndppjddpd
+F-H0-2676 11 fqdpppjdpjddpfncpd
+F-H0-2677 3 cfdpppjdpjddpfncpd
+F-H0-2678 3 cjdpppjdpjddpfncpd
+F-H0-2679 42 ddpodppd
+F-H0-2680 21 dcpodppd
+F-H0-2681 2 pqpodppd
+F-H0-2682 18 cnpqdpfqddqd
+F-H0-2683 12 dkcnppcddppc
+F-H0-2684 11 popqdpfqddqd
+F-H0-2685 9 fpcnppcddppc
+F-H0-2686 3 pecnppcddppc
+F-H0-2687 3 hqpqdpfqddqd
+F-H0-2688 3 jppqdpfqddqd
+F-H0-2689 3 jpqnppqddpdc
+F-H0-2690 2 pnqnppqddpdc
+F-H0-2691 2 qopqpdcpddcf
+F-H0-2692 29 jddppqdfpdddfc
+F-H0-2693 18 bdpdqpfddpddcf
+F-H0-2694 2 fqdppqdfpdddfc
+F-H0-2695 2 kqdpfqdnppddpc
+F-H0-2696 15 dnpqdpfqecpd
+F-H0-2697 11 ippqdpfqecpd
+F-H0-2698 10 cnpqdpfqecpd
+F-H0-2699 6 popqdpfqecpd
+F-H0-2700 3 jppqdpfqecpd
+F-H0-2701 3 pnpqdpfqecpd
+F-H0-2702 2 hqpqdpfqecpd
+F-H0-2703 23 dppf
+F-H0-2704 17 ddpf
+F-H0-2705 6 ppfp
+F-H0-2706 3 oond
+F-H0-2707 3 pond
+F-H0-2708 2 qopf
+F-H0-2709 2 pdnd
+F-H0-2710 2 dcnd
+F-H0-2711 22 pjdpppdepd
+F-H0-2712 19 qpoppddpdd
+F-H0-2713 18 fqdpppdepd
+F-H0-2714 2 ckdpppdepd
+F-H0-2715 2 ecdpppdepd
+F-H0-2716 20 cdoqqpdppd
+F-H0-2717 17 ppdppdcedc
+F-H0-2718 9 lpoqqpdppd
+F-H0-2719 8 pooqqpdppd
+F-H0-2720 3 dcoqqpdppd
+F-H0-2721 2 chdppdcedc
+F-H0-2722 2 cddppdcedc
+F-H0-2723 2 kqoqqpdppd
+F-H0-2724 2 mqoqqpdppd
+F-H0-2725 19 fpppeqhppdcpdd
+F-H0-2726 9 fodqppdlcoddpd
+F-H0-2727 9 eodqppdlcoddpd
+F-H0-2728 7 eddpppdhcedcpd
+F-H0-2729 3 dddpppdhcedcpd
+F-H0-2730 2 ccdpppdhcedcpd
+F-H0-2731 2 mqpqdpplqopddd
+F-H0-2732 50 qjqnpponnpoljppkdppjqlpdplddqk
+F-H0-2733 28 nddpppddpepc
+F-H0-2734 16 cnppoddpddqd
+F-H0-2735 6 ccppdppddedc
+F-H0-2736 5 qoqpoppddpdd
+F-H0-2737 3 fqppoddpddqd
+F-H0-2738 2 ncqpoppddpdd
+F-H0-2739 60 cpppdqdpcododdpd
+F-H0-2740 35 cfppdpdecepdcddddcec
+F-H0-2741 12 nppppqopoqqoqppddpdd
+F-H0-2742 11 cqeqdqppcpdpcododdpd
+F-H0-2743 2 dbppdpdecepdcddddcec
+F-H0-2744 11 cqddqc
+F-H0-2745 10 qcdpqq
+F-H0-2746 6 pqddqc
+F-H0-2747 3 pedpqq
+F-H0-2748 3 dcppqc
+F-H0-2749 3 qppdcc
+F-H0-2750 3 ppddqc
+F-H0-2751 2 ceppqc
+F-H0-2752 2 dqddqc
+F-H0-2753 2 coddqc
+F-H0-2754 49 eqdqppcpdpcododdpd
+F-H0-2755 40 omqlppqjdpqipkqhpjphpipdohndqfjdofdd
+F-H0-2756 3 pmppqnnponjpoldppkqlpjplpiqkpdqjddqh
+F-H0-2757 3 ocqlppqjdpqipkqhpjphpipdohndqfjdofdd
+F-H0-2758 2 nclqnqkqkpjqjphqipppdplpnopnlopjddpd
+F-H0-2759 2 hdppdppjnepflepdkdldjdlcidkcddjcnchc
+F-H0-2760 2 molqnqkqkpjqjphqipppdplpnopnlopjddpd
+F-H0-2761 39 ppeppdde
+F-H0-2762 6 dqopddpe
+F-H0-2763 6 eqopddpe
+F-H0-2764 4 edpodpod
+F-H0-2765 2 qddeppod
+F-H0-2766 2 qipodpod
+F-H0-2767 14 hcppeqpdddfc
+F-H0-2768 13 dnfqdpppecpd
+F-H0-2769 12 ipfqdpppecpd
+F-H0-2770 7 cfppeqpdddfc
+F-H0-2771 6 jpnqppdpocdd
+F-H0-2772 2 mqqnpppdcodd
+F-H0-2773 2 iqfqdpppecpd
+F-H0-2774 7 meqfpdlcnd
+F-H0-2775 6 nfqfpdlcnd
+F-H0-2776 5 jqlqppqnnp
+F-H0-2777 4 icqfpdlcnd
+F-H0-2778 4 qllqppqnnp
+F-H0-2779 2 ddqfpdlcnd
+F-H0-2780 2 eqlqppqnnp
+F-H0-2781 28 pppddpddjj
+F-H0-2782 4 jdpdppddjj
+F-H0-2783 3 podpjjddpd
+F-H0-2784 3 dcppdppdjj
+F-H0-2785 2 qnppjjdppd
+F-H0-2786 2 qodpjjddpd
+F-H0-2787 53 pippqnnponjpoldppkqlpjplpdqkddqj
+F-H0-2788 27 dcqpcppd
+F-H0-2789 14 depddqdc
+F-H0-2790 6 pppddqdc
+F-H0-2791 6 ecdpqdcd
+F-H0-2792 3 qqpddqdc
+F-H0-2793 2 qopddqdc
+F-H0-2794 42 npqnpponjpqddpddql
+F-H0-2795 47 kqdpfqcnqpdcpd
+F-H0-2796 4 drdpfqcnqpdcpd
+F-H0-2797 3 kpdpfqcnqpdcpd
+F-H0-2798 2 djfqcnqppddpdc
+F-H0-2799 2 jqppnqqncppcdd
+F-H0-2800 18 qopqcpddpd
+F-H0-2801 16 popqcpddpd
+F-H0-2802 7 ecdppppccd
+F-H0-2803 4 qnppdpdcqd
+F-H0-2804 2 fpcppppddc
+F-H0-2805 2 fqpqcpddpd
+F-H0-2806 34 popqddcpocqd
+F-H0-2807 8 qopqddcpocqd
+F-H0-2808 4 pfpqddcpocqd
+F-H0-2809 4 pnpqddcpocqd
+F-H0-2810 3 eppqddcpocqd
+F-H0-2811 53 dqpqipfqdpcqddpd
+F-H0-2812 3 pcqppidppdqfddqc
+F-H0-2813 47 kplqnqppdqpnnopjddpd
+F-H0-2814 50 cfdqppcededcpd
+F-H0-2815 8 pppqdpqopopcdd
+F-H0-2816 34 cqhqpqdpfqdcpd
+F-H0-2817 13 ofqhqppddpcdqf
+F-H0-2818 4 cnhqpqdpfqdcpd
+F-H0-2819 2 hphqpqdpfqdcpd
+F-H0-2820 30 dbegppefdpcfdgeeffcefepdedhdddcdcc
+F-H0-2821 24 cbdpppdhffgeeffedeeepdfcgdecdddccc
+F-H0-2822 32 qndrcqiqdpfqcnppddpd
+F-H0-2823 17 ncdrcqiqdpfqcnppddpd
+F-H0-2824 5 qjdrcqiqdpfqcnppddpd
+F-H0-2825 2 qfdrcqiqdpfqcnppddpd
+F-H0-2826 19 cnpqdpfqddpc
+F-H0-2827 11 dnpqdpfqddpc
+F-H0-2828 10 qlqnppqddpcd
+F-H0-2829 9 popqdpfqddpc
+F-H0-2830 6 pkqnppqddpcd
+F-H0-2831 3 pnpqdpfqddpc
+F-H0-2832 35 fqeqepppddcp
+F-H0-2833 7 pppqdpqopopd
+F-H0-2834 48 qqrpppqnnpondppdpkdd
+F-H0-2835 3 gpdripfqdpppdnfoddpd
+F-H0-2836 2 mnrpppqnnpondppdpkdd
+F-H0-2837 18 gcppdpefcgdedcpd
+F-H0-2838 12 meppqddpddnemcod
+F-H0-2839 12 pnopmqnoqppddpdd
+F-H0-2840 5 pqopmqnoqppddpdd
+F-H0-2841 5 dippdpefcgdedcpd
+F-H0-2842 2 pgppqddpddnemcod
+F-H0-2843 2 jpepgqfopppdcpdd
+F-H0-2844 49 cqdrippqdpfqdnfoddpd
+F-H0-2845 2 pgqppidppdqfndofddrd
+F-H0-2846 28 fqpppddpcdcjec
+F-H0-2847 6 ncjqdqppcopddd
+F-H0-2848 3 nqpppddpcdcjec
+F-H0-2849 3 lqjqpqdpqoddpd
+F-H0-2850 2 jpppdppdcejcdc
+F-H0-2851 2 cjjqpqdpqoddpd
+F-H0-2852 8 dpppjjpd
+F-H0-2853 7 pjppjjpd
+F-H0-2854 5 ncppjjpd
+F-H0-2855 4 dcppjjpd
+F-H0-2856 3 qopdjjdd
+F-H0-2857 2 jdppjjdp
+F-H0-2858 2 qfppjjpd
+F-H0-2859 14 fcjppqdpqkddpd
+F-H0-2860 12 dhpppddpcddjic
+F-H0-2861 11 jdjppqdpqkddpd
+F-H0-2862 6 cnjppqdpqkddpd
+F-H0-2863 4 cjjppqdpqkddpd
+F-H0-2864 3 lqjppqdpqkddpd
+F-H0-2865 3 dmdjiqpdppddcp
+F-H0-2866 38 jdpqdpqkncpfdcpd
+F-H0-2867 5 prppnqpndqqiddpc
+F-H0-2868 4 kdpqdpqkncpfdcpd
+F-H0-2869 51 cpdqpqipfqdpcqddpd
+F-H0-2870 40 ndqpqhdppdqfddof
+F-H0-2871 11 nqqnppondpqdqldd
+F-H0-2872 42 nddpppqfpdnckddc
+F-H0-2873 7 dnpqipfqdpcnddpd
+F-H0-2874 2 eopqipfqdpcnddpd
+F-H0-2875 51 dopqdqfqipcqdpcpddpd
+F-H0-2876 2 bqdqppcqdpcncppddkcd
+F-H0-2877 18 plpopqdcpd
+F-H0-2878 11 pdpqdpdedc
+F-H0-2879 10 cppopqdcpd
+F-H0-2880 9 ecqppdedcd
+F-H0-2881 5 dfqppdedcd
+F-H0-2882 4 gcqppdedcd
+F-H0-2883 2 mppopqdcpd
+F-H0-2884 25 qldpfqqnppdnjpddpd
+F-H0-2885 6 nqdpfqqnppdnjpddpd
+F-H0-2886 6 npdpfqqnppdnjpddpd
+F-H0-2887 3 pjdpfqqnppdnjpddpd
+F-H0-2888 3 npnqpppddpndpjddqf
+F-H0-2889 2 pkdpfqqnppdnjpddpd
+F-H0-2890 9 fqeqepcp
+F-H0-2891 3 pdqepepc
+F-H0-2892 2 qdqepepc
+F-H0-2893 20 cfpddqjdppdd
+F-H0-2894 8 cfpdpqjddpdd
+F-H0-2895 8 fqppcppjddpd
+F-H0-2896 5 ecppdppjcdpd
+F-H0-2897 3 djppcppjddpd
+F-H0-2898 44 kcfqcnppdjdppdiccdfcdc
+F-H0-2899 5 ncppnqqndqcnjpckcppddd
+F-H0-2900 9 nonqppopnpmpmodppjddpd
+F-H0-2901 18 fpdqppqddodd
+F-H0-2902 15 edpqdppdpocd
+F-H0-2903 9 ccpqdppdedcd
+F-H0-2904 4 qnpppecpddpc
+F-H0-2905 4 codqppqdoddd
+F-H0-2906 3 qoqpopdppddc
+F-H0-2907 2 fdpqdppdpocd
+F-H0-2908 25 oqppnqnpopnompmodppjddpd
+F-H0-2909 17 dqfpfqdpppgogpfoepdjpddd
+F-H0-2910 10 oopppojpqndppmpnpdonddom
+F-H0-2911 17 pqecqd
+F-H0-2912 10 dpecqd
+F-H0-2913 6 cpecqd
+F-H0-2914 5 ddqopc
+F-H0-2915 4 ocecqd
+F-H0-2916 4 dqecqd
+F-H0-2917 3 pqqopc
+F-H0-2918 2 deqopc
+F-H0-2919 20 dpoqdcpd
+F-H0-2920 12 dqoqdcpd
+F-H0-2921 8 qpoqdcpd
+F-H0-2922 6 dqceqppd
+F-H0-2923 2 edceqppd
+F-H0-2924 2 cqceqppd
+F-H0-2925 2 edppdqoc
+F-H0-2926 27 cdpqpc
+F-H0-2927 7 ddpqpc
+F-H0-2928 4 ddpcpq
+F-H0-2929 3 cdcpqp
+F-H0-2930 2 eccdqd
+F-H0-2931 24 kqnqlqdqppkppnnopjddpd
+F-H0-2932 13 lpnqlqdqppkppnnopjddpd
+F-H0-2933 8 ocdpppnepjkdpfncpddclc
+F-H0-2934 20 pldppqqodcpd
+F-H0-2935 8 qmdppqqodcpd
+F-H0-2936 6 eddppqcedcpd
+F-H0-2937 5 qkdppqqodcpd
+F-H0-2938 2 fddppqcedcpd
+F-H0-2939 2 didppqcedcpd
+F-H0-2940 26 npqnpponcppdqldd
+F-H0-2941 12 ncppqhdppdqfcdof
+F-H0-2942 49 cnerdreqcrdqpqipfqdpcqdocpddpd
+F-H0-2943 51 erdrdqpqipfqdpcqdocpddpd
+F-H0-2944 49 drdqpqipfqdpcqdocpddpd
+F-H0-2945 51 eqdrercrdqpqipfqdpcqdocpddpd
+F-H0-2946 22 podrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2947 7 qodrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2948 6 nqdrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2949 5 emdrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2950 4 fpdrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2951 3 mqdrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2952 3 lqdrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2953 2 dndrercreqpqdqfqipcqdpcpdocnddpd
+F-H0-2954 27 cdpopc
+F-H0-2955 10 ppedqd
+F-H0-2956 8 dppopc
+F-H0-2957 4 cpedqd
+F-H0-2958 3 ocedqd
+F-H0-2959 2 coedqd
+F-H0-2960 2 cppopc
+F-H0-2961 10 nppqdppdqocd
+F-H0-2962 9 poqpoqdppddc
+F-H0-2963 7 edpqdppdqocd
+F-H0-2964 5 cfpqdppdeccd
+F-H0-2965 4 dgpqdppdeccd
+F-H0-2966 3 ecpqdppdqocd
+F-H0-2967 2 jcpqdppdeccd
+F-H0-2968 2 ncpqdppdeccd
+F-H0-2969 2 fdpqdppdqocd
+F-H0-2970 35 ircqdrippqdpfqdnfoddpd
+F-H0-2971 2 fmcqdrippqdpfqdnfoddpd
+F-H0-2972 51 pqqpqqppqndppdpkdd
+F-H0-2973 21 pjcqppccpd
+F-H0-2974 18 ddcqppccpd
+F-H0-2975 3 fpcqppccpd
+F-H0-2976 3 cjcqppccpd
+F-H0-2977 2 jpqqpdcqdd
+F-H0-2978 49 crerdrdqpqipfqdpcqdocpddpd
+F-H0-2979 36 onppdpqlqnqhqjqdddoc
+F-H0-2980 10 rhoqdpqpqjqlqfqhddpd
+F-H0-2981 25 qfpdpqjdcpdd
+F-H0-2982 12 ocdppqdjqddd
+F-H0-2983 10 qnppqdjpdcdp
+F-H0-2984 3 pjppqdjpdcdp
+F-H0-2985 2 cnpddqjdqpdd
+F-H0-2986 46 lqfqjqppiqkphqjphpipdphodnfoddpd
+F-H0-2987 23 pfdppqncpkdcpd
+F-H0-2988 8 lcdppqncpkdcpd
+F-H0-2989 4 ncqppddpidqfcd
+F-H0-2990 3 kddppqncpkdcpd
+F-H0-2991 3 jpdppqncpkdcpd
+F-H0-2992 2 oedppqncpkdcpd
+F-H0-2993 2 onqnppqdipddcp
+F-H0-2994 45 opqqqppqppqndppdpkdd
+F-H0-2995 4 crfqdqcqipppdpcpddpd
+F-H0-2996 42 prppnqdpqhqnreqfqerdqdrcpdqcodpcddnc
+F-H0-2997 3 lqdrercrhqnqeqfqdqcqdpppdocpqncnddpd
+F-H0-2998 15 lpopqpdpdcpd
+F-H0-2999 11 cedpqpdedcpd
+F-H0-3000 5 cgdpqpdedcpd
+F-H0-3001 5 fddpqpdedcpd
+F-H0-3002 3 ceopqpdpdcpd
+F-H0-3003 2 cfopqpdpdcpd
+F-H0-3004 2 qfdppqpdcded
+F-H0-3005 2 ooopqpdpdcpd
+F-H0-3006 2 fcdpqpdedcpd
+F-H0-3007 23 endqdoqppdcmdd
+F-H0-3008 16 cqgqppcpepdcpd
+F-H0-3009 5 ergqppcpepdcpd
+F-H0-3010 4 mdpqdpqdodmcdd
+F-H0-3011 3 cdcgppqddpdcde
+F-H0-3012 26 deqqdpdcpd
+F-H0-3013 17 oqqpdpccpd
+F-H0-3014 11 ppqqdpdcpd
+F-H0-3015 33 molqfqjqppiqkphqjphpipdphodnfoddpd
+F-H0-3016 3 golqfqjqppiqkphqjphpipdphodnfoddpd
+F-H0-3017 3 lddpppdfhehdfeddpdlckdjcjdicidhcfc
+F-H0-3018 2 fmlqfqjqppiqkphqjphpipdphodnfoddpd
+F-H0-3019 20 dcpqcpqd
+F-H0-3020 19 ddpqcpqd
+F-H0-3021 3 opqpcdpc
+F-H0-3022 2 ecpqcpqd
+F-H0-3023 2 oqqpcdpc
+F-H0-3024 2 popqcpqd
+F-H0-3025 2 cqqpcdpc
+F-H0-3026 13 nqppdpcjcedfcdcffcdedcpd
+F-H0-3027 12 qjppdpcjcedfcdcffcdedcpd
+F-H0-3028 11 lcppcfdppdfdcdedecjcdcfc
+F-H0-3029 5 qnppfqdodqdncpcncocjddpd
+F-H0-3030 5 qnppdpcjcedfcdcffcdedcpd
+F-H0-3031 4 cmppdpcjcedfcdcffcdedcpd
+F-H0-3032 18 cpcdpq
+F-H0-3033 11 pqpccp
+F-H0-3034 9 pqcppc
+F-H0-3035 7 ppdqqd
+F-H0-3036 5 pdcdpq
+F-H0-3037 2 ccdqqd
+F-H0-3038 48 jppqmppodpqkddpd
+F-H0-3039 3 jqpqmppodpqkddpd
+F-H0-3040 2 ippqmppodpqkddpd
+F-H0-3041 23 qldqoqqjqpddpd
+F-H0-3042 10 epppcecppdjcdc
+F-H0-3043 8 codqoqqjqpddpd
+F-H0-3044 6 cfdpppqjqddcoc
+F-H0-3045 3 qgdqoqqjqpddpd
+F-H0-3046 44 ccdpppdhffgeeffedeeepdfcgddcdd
+F-H0-3047 10 ceppdqdfdcpd
+F-H0-3048 5 chppdqdfdcpd
+F-H0-3049 4 coppdqdfdcpd
+F-H0-3050 3 nqppdqdfdcpd
+F-H0-3051 2 fcfpqppdcpdd
+F-H0-3052 2 efppdqdfdcpd
+F-H0-3053 2 npdppqpnpcdd
+F-H0-3054 38 kqdpfqdnqpddpd
+F-H0-3055 5 drdpfqdnqpddpd
+F-H0-3056 3 pjppqnnpdddppc
+F-H0-3057 3 pipdpqnddpddqf
+F-H0-3058 49 dqcqppcnjppddpcdcl
+F-H0-3059 16 qoerdrhqcreqpqdqfqdpcqpocpdocnddpd
+F-H0-3060 15 nqerdrhqcreqpqdqfqdpcqpocpdocnddpd
+F-H0-3061 12 nperdrhqcreqpqdqfqdpcqpocpdocnddpd
+F-H0-3062 6 mqerdrhqcreqpqdqfqdpcqpocpdocnddpd
+F-H0-3063 3 qmerdrhqcreqpqdqfqdpcqpocpdocnddpd
+F-H0-3064 2 plerdrhqcreqpqdqfqdpcqpocpdocnddpd
+F-H0-3065 13 dnfqdpppedpd
+F-H0-3066 11 hqfqdpppedpd
+F-H0-3067 8 ipfqdpppedpd
+F-H0-3068 6 jpfqdpppedpd
+F-H0-3069 4 cfppeppdddfc
+F-H0-3070 3 cmfqdpppedpd
+F-H0-3071 2 ncfqdpppedpd
+F-H0-3072 2 cjcndppdpodd
+F-H0-3073 42 cdpqdpcfcededcpd
+F-H0-3074 2 bepqdpcfcededcpd
+F-H0-3075 13 cepqdpdedcqd
+F-H0-3076 11 lpopqpcddppc
+F-H0-3077 8 odpqdpdedcqd
+F-H0-3078 7 pfpqqdcpddod
+F-H0-3079 4 eepqdpdedcqd
+F-H0-3080 4 mqopqpcddppc
+F-H0-3081 2 pmopqpcddppc
+F-H0-3082 45 fcppdpdgcecfcddedcpd
+F-H0-3083 3 pjdppqpoqpqnqopmpddd
+F-H0-3084 2 efppdpdgcecfcddedcpd
+F-H0-3085 23 fqdppqccpd
+F-H0-3086 9 iqddppqccp
+F-H0-3087 9 dddppqccpd
+F-H0-3088 6 pkdppqccpd
+F-H0-3089 3 fddppqccpd
+F-H0-3090 3 cndppqccpd
+F-H0-3091 2 pjcqqdppdd
+F-H0-3092 12 mppqdpfqpoplddpd
+F-H0-3093 11 oqpqdpfqpoplddpd
+F-H0-3094 7 nopqdpfqpoplddpd
+F-H0-3095 3 ippqdpfqpoplddpd
+F-H0-3096 3 nppqdpfqpoplddpd
+F-H0-3097 3 omqpoplppddpddqf
+F-H0-3098 15 prppnqdppdqndd
+F-H0-3099 4 cffqppdpcnddpd
+F-H0-3100 2 cidpppddcffcpd
+F-H0-3101 2 jqppnqdppdqndd
+F-H0-3102 49 docqdqcpppcnjppddpcdcl
+F-H0-3103 20 nqppqddpddqioc
+F-H0-3104 12 fqkqpqdpqoddpd
+F-H0-3105 6 fqdpppddqekcpc
+F-H0-3106 6 cfkqpqdpqoddpd
+F-H0-3107 3 qiqkoqpdqpdddp
+F-H0-3108 2 cjkqpqdpqoddpd
+F-H0-3109 2 mqkqpqdpqoddpd
+F-H0-3110 39 rkqqrpppqnnpondppdpkdd
+F-H0-3111 4 kqcqdripfqdpppdnfoddpd
+F-H0-3112 3 fgdpppdffeidpdddfcccdb
+F-H0-3113 29 bndqcqppcpjpcndppddocdcl
+F-H0-3114 14 rcppdppjqcqdpcpdncoddclc
+F-H0-3115 4 pfqhqppedppdqfjdqdddqcpc
+F-H0-3116 2 rdppdppjqcqdpcpdncoddclc
+F-H0-3117 50 cpdqcqppcnjppddpcdcl
+F-H0-3118 50 geppdpffdheffedeeepdfcgddcdd
+F-H0-3119 2 dfppdpffdheffedeeepdfcgddcdd
+F-H0-3120 46 jqfqiqpphqjphpipdphodnfoddpd
+F-H0-3121 18 rdqfpdlcnc
+F-H0-3122 3 ldqfpdlcnc
+F-H0-3123 2 kcqhqfncpd
+F-H0-3124 2 reqfpdlcnc
+F-H0-3125 44 kpjqfqiqpphqjphpipdphodnfoddpd
+F-H0-3126 30 ocdqpqdcqd
+F-H0-3127 5 dedqpqdcqd
+F-H0-3128 4 ncdqpqdcqd
+F-H0-3129 4 edqdpqcdcp
+F-H0-3130 2 cedqpqdcqd
+F-H0-3131 2 dfdqpqdcqd
+F-H0-3132 2 cfdqpqdcqd
+F-H0-3133 32 jpdpppjdpjddpd
+F-H0-3134 9 ncppdpjpdjpddd
+F-H0-3135 3 cldjpppdjpdddp
+F-H0-3136 2 jppppddpjdpjdd
+F-H0-3137 2 nqpppddpjdpjdd
+F-H0-3138 2 qnpjpppdjpdddp
+F-H0-3139 32 fcppdpfedhdedcpd
+F-H0-3140 21 qgppqddpldofddod
+F-H0-3141 40 ceppegdpefdgcfffeefepdedhdddcdcc
+F-H0-3142 11 dbppdpffdhefgedefepdeegdfcdddccc
+F-H0-3143 17 oqqpcpddpd
+F-H0-3144 14 oddpppqdcd
+F-H0-3145 3 qepqdpddpc
+F-H0-3146 22 dfdppqcecfcddedcpd
+F-H0-3147 12 mdqdppddcppcodocnc
+F-H0-3148 10 fqdppqcecfcddedcpd
+F-H0-3149 3 cndppqcecfcddedcpd
+F-H0-3150 16 qldpnqqjqpddpd
+F-H0-3151 6 fqdpppqjqdddnc
+F-H0-3152 4 qmdpppqjqdddnc
+F-H0-3153 3 fqdpnqqjqpddpd
+F-H0-3154 3 cjdpnqqjqpddpd
+F-H0-3155 2 lqjqdqpdppddcn
+F-H0-3156 2 qkdpnqqjqpddpd
+F-H0-3157 28 poircqdrippqdpfqdnfoddpd
+F-H0-3158 4 qoircqdrippqdpfqdnfoddpd
+F-H0-3159 3 cjircqdrippqdpfqdnfoddpd
+F-H0-3160 3 ncircqdrippqdpfqdnfoddpd
+F-H0-3161 2 nqqppidppdrindqfddofqcrd
+F-H0-3162 16 ddfqdpqpcnpd
+F-H0-3163 15 dcfqdpqpcnpd
+F-H0-3164 7 npfqdpqpcnpd
+F-H0-3165 4 odppcfqdddfc
+F-H0-3166 2 nqfqdpqpcnpd
+F-H0-3167 16 hpeqppqdcpdd
+F-H0-3168 7 mqoqqppddpcd
+F-H0-3169 6 popqdpcedcpd
+F-H0-3170 5 edpqdpcedcpd
+F-H0-3171 4 dgpqdpcedcpd
+F-H0-3172 3 kpoqqppddpcd
+F-H0-3173 2 qfpqdpcedcpd
+F-H0-3174 2 kqoqqppddpcd
+F-H0-3175 2 fdpqdpcedcpd
+F-H0-3176 47 cdppdqcfcededcpd
+F-H0-3177 37 dqfqeqepppddcp
+F-H0-3178 36 jpdppqdnfqdcpd
+F-H0-3179 9 ipdppqdnfqdcpd
+F-H0-3180 6 drdppqdnfqdcpd
+F-H0-3181 17 ncfqdpppdnjpdcpd
+F-H0-3182 16 qnfqdpppdnjpdcpd
+F-H0-3183 5 qjfqdpppdnjpdcpd
+F-H0-3184 32 cpocpqdcqd
+F-H0-3185 7 dpocpqdcqd
+F-H0-3186 4 ldocpqdcqd
+F-H0-3187 4 odqpcdqepc
+F-H0-3188 3 odocpqdcqd
+F-H0-3189 2 deocpqdcqd
+F-H0-3190 38 qqerdrhqcreqnqdqfqrpcqdpppdocpqncnddpd
+F-H0-3191 5 qmerdrhqcreqnqdqfqrpcqdpppdocpqncnddpd
+F-H0-3192 4 qkprppnqdpqhqnreqfqerdqdrcpdqcodpcddnc
+F-H0-3193 3 jqerdrhqcreqnqdqfqrpcqdpppdocpqncnddpd
+F-H0-3194 2 fcdpqoddpe
+F-H0-3195 2 jppdoqddep
+F-H0-3196 2 nddppoddqe
+F-H0-3197 2 qnppeddpoc
+F-H0-3198 22 qldpfqcnppqjjpddpd
+F-H0-3199 14 qnfqcnppdjdppdjcdd
+F-H0-3200 6 hqjqpppddpddpjncqf
+F-H0-3201 6 qmdpfqcnppqjjpddpd
+F-H0-3202 18 hcppnqpnjppjdppdddjd
+F-H0-3203 7 jpdjpppddpndpjjdqfdd
+F-H0-3204 7 qfppnqpnjppjdppdddjd
+F-H0-3205 5 gqppdpjpjdpjddpfncpd
+F-H0-3206 4 gdppnqpnjppjdppdddjd
+F-H0-3207 3 qnpjpppddpjddjfdcfdd
+F-H0-3208 2 ncppnqpnjppjdppdddjd
+F-H0-3209 18 fpeqfqdqepppddcp
+F-H0-3210 9 pmpqdpqppoqoqnpd
+F-H0-3211 4 ncpqdpqppoqoqnpd
+F-H0-3212 2 fcqdppddodpcncoc
+F-H0-3213 13 popqdpqdcfkcddfc
+F-H0-3214 9 qjpqdpqdcfkcddfc
+F-H0-3215 9 qkpqdpqdcfkcddfc
+F-H0-3216 7 ndcnfqcippqddpdc
+F-H0-3217 5 qnpqdpqdcfkcddfc
+F-H0-3218 2 qopqdpqdcfkcddfc
+F-H0-3219 46 rpqpqqpppqopqndppdpkdd
+F-H0-3220 26 qfrqqpqqpppqopnqdprproqnqopdpkdd
+F-H0-3221 6 fpdrercreqfqdqcqipppdpcpdocnddpd
+F-H0-3222 4 qndrercreqfqdqcqipppdpcpdocnddpd
+F-H0-3223 4 emdrercreqfqdqcqipppdpcpdocnddpd
+F-H0-3224 2 dfppdpcfdepdidcdddfcecccdcdbebcb
+F-H0-3225 25 fecnfqdjpppddpcdickcfcdc
+F-H0-3226 7 ncpqdpfqqnqpcnjpqkqiddpd
+F-H0-3227 5 iecnfqdjpppddpcdickcfcdc
+F-H0-3228 2 nopqdpfqqnqpcnjpqkqiddpd
+F-H0-3229 12 nedpppodpjmdmencpddcnd
+F-H0-3230 44 roqqqppqpprpopqndppdpkdd
+F-H0-3231 26 qjkqdpfqcnqpdcpd
+F-H0-3232 12 nckqdpfqcnqpdcpd
+F-H0-3233 3 qfkqdpfqcnqpdcpd
+F-H0-3234 2 opkqdpfqcnqpdcpd
+F-H0-3235 29 jdppdpjpdjpjddpd
+F-H0-3236 12 ncppdpjpdjpjddpd
+F-H0-3237 6 jjppdpjpdjpjddpd
+F-H0-3238 2 nqppdpjpdjpjddpd
+F-H0-3239 46 rqqpqqpppqoprpdpqnropdpkdd
+F-H0-3240 37 qfppcedpqdodpcmdocncdc
+F-H0-3241 3 pjdppqpoqpqnqopmqdddoc
+F-H0-3242 20 pfdpfqdnppddjpncpd
+F-H0-3243 11 cnfqdpppjdpfddpdnc
+F-H0-3244 8 pippcnfpdjdppdqfdd
+F-H0-3245 4 qhppcnfpdjdppdqfdd
+F-H0-3246 4 npnqppdppddfjdddfc
+F-H0-3247 23 dodqppcecfcddedcpd
+F-H0-3248 17 dfdqppcecfcddedcpd
+F-H0-3249 9 dmdqppcpdococndcpd
+F-H0-3250 16 enhpppcpepdcpd
+F-H0-3251 15 mppqpocppdpldd
+F-H0-3252 9 fddhppqddpdcde
+F-H0-3253 3 eqdqdoqppddldd
+F-H0-3254 3 godqdoqppddldd
+F-H0-3255 2 onpqpocppdpldd
+F-H0-3256 24 dppj
+F-H0-3257 5 jpjd
+F-H0-3258 4 cpjd
+F-H0-3259 3 pcjd
+F-H0-3260 3 ppjp
+F-H0-3261 3 jjjd
+F-H0-3262 46 nqqprqppqqoppqdprproqnqopdpkdd
+F-H0-3263 26 ocppdppjodnemdmencpddcnd
+F-H0-3264 17 pcppdppjodnemdmencpddcnd
+F-H0-3265 5 oeppdppjodnemdmencpddcnd
+F-H0-3266 43 qorqqpqqpppqoprpdpqnropdpkdd
+F-H0-3267 25 ppdqpdec
+F-H0-3268 12 pqdqpdec
+F-H0-3269 5 dodqpdec
+F-H0-3270 3 qpoqdppc
+F-H0-3271 2 qeoqdppc
+F-H0-3272 36 pnpqrpfqdpjpqnpocnqlddpd
+F-H0-3273 6 qqpqrpfqdpjpqnpocnqlddpd
+F-H0-3274 21 foippqdpfqdcpd
+F-H0-3275 15 cqippqdpfqdcpd
+F-H0-3276 14 cnippqdpfqdcpd
+F-H0-3277 2 dnippqdpfqdcpd
+F-H0-3278 15 pjeqppecpd
+F-H0-3279 15 cpeqppecpd
+F-H0-3280 9 jqqopdcodd
+F-H0-3281 6 doeqppecpd
+F-H0-3282 3 djeqppecpd
+F-H0-3283 25 ddoqpd
+F-H0-3284 8 pqcepd
+F-H0-3285 4 dpoqpd
+F-H0-3286 3 cpoqpd
+F-H0-3287 2 qpcepd
+F-H0-3288 35 pgpfpppddpddqf
+F-H0-3289 51 fqeqppcpepdcpd
+F-H0-3290 14 qmpopqpddpcd
+F-H0-3291 8 ecpqdppdcded
+F-H0-3292 7 hdpqdppdcded
+F-H0-3293 5 dfpqdppdcded
+F-H0-3294 4 popqdppdcded
+F-H0-3295 2 nqpopqpddpcd
+F-H0-3296 2 qnpqdppdcded
+F-H0-3297 17 dcpqqd
+F-H0-3298 12 ddpqqd
+F-H0-3299 6 dppqqd
+F-H0-3300 4 cppqqd
+F-H0-3301 3 cdpqqd
+F-H0-3302 2 qopqqd
+F-H0-3303 2 ocpqqd
+F-H0-3304 21 ccppdppccffcdddb
+F-H0-3305 12 podrdppqcnfqddpd
+F-H0-3306 5 ncdrdppqcnfqddpd
+F-H0-3307 4 cmbpfqcnpppddpcd
+F-H0-3308 3 npqppddpddqfncrd
+F-H0-3309 2 fcbpfqcnpppddpcd
+F-H0-3310 36 rfppdpqhqfpecfpdqdjdddpcqcfc
+F-H0-3311 8 pnpqqqfqqpppdpjpqnpocnqlddpd
+F-H0-3312 4 qbppdpqhqfpecfpdqdjdddpcqcfc
+F-H0-3313 46 poqqpqqpfqdpppqnjpcnqlddpd
+F-H0-3314 16 onppqndpcdpkpc
+F-H0-3315 10 cfdppqidqdddfc
+F-H0-3316 8 ccdppqidqdddfc
+F-H0-3317 3 dfdppqidqdddfc
+F-H0-3318 3 ncdppqidqdddfc
+F-H0-3319 2 kqipfqdpqpddpc
+F-H0-3320 40 dqfqeqppcpepdcpd
+F-H0-3321 3 bododqcnqppdcodd
+F-H0-3322 19 nqppdqpjecpd
+F-H0-3323 13 nqppeqpjdcpd
+F-H0-3324 9 cpppeqpjdcpd
+F-H0-3325 3 jpppdqpjecpd
+F-H0-3326 17 jdjppqdppkddpd
+F-H0-3327 9 fcjppqdppkddpd
+F-H0-3328 9 lpjppqdppkddpd
+F-H0-3329 3 mpjppqdppkddpd
+F-H0-3330 2 qfpjqppdkpdddp
+F-H0-3331 2 cnjppqdppkddpd
+F-H0-3332 48 qppqqqfqdpppqnjpcnqlddpd
+F-H0-3333 7 ofqhqfpd
+F-H0-3334 4 qcqhqfpd
+F-H0-3335 3 cnhqfqdp
+F-H0-3336 2 phqhqfpd
+F-H0-3337 19 qqpqpodppdqmdd
+F-H0-3338 17 nomqopqpdppddd
+F-H0-3339 19 eopqdpfqpocnddpd
+F-H0-3340 16 dnpqdpfqpocnddpd
+F-H0-3341 10 fppqdpfqpocnddpd
+F-H0-3342 41 ckdpppcedgcdcffcdedcpd
+F-H0-3343 2 cffqppdqdocpcncodmddpd
+F-H0-3344 14 opqppddodd
+F-H0-3345 12 pjepppdcpd
+F-H0-3346 10 dqqppddodd
+F-H0-3347 3 coepppdcpd
+F-H0-3348 3 jqopdppcdd
+F-H0-3349 3 qjopdppcdd
+F-H0-3350 3 cfepppdcpd
+F-H0-3351 13 ncdppqddqdhcfc
+F-H0-3352 12 ccdppqddqdhcfc
+F-H0-3353 5 ocdppqddqdhcfc
+F-H0-3354 4 onppqndpcdqlpc
+F-H0-3355 2 cfdppqddqdhcfc
+F-H0-3356 2 hddppqddqdhcfc
+F-H0-3357 4 pppdjjncqf
+F-H0-3358 3 popdjjncqf
+F-H0-3359 3 rpnqqnppjj
+F-H0-3360 2 pjpdjjncqf
+F-H0-3361 13 decoppdcpd
+F-H0-3362 10 dqcoppdcpd
+F-H0-3363 8 epcoppdcpd
+F-H0-3364 7 pjcoppdcpd
+F-H0-3365 3 eqcoppdcpd
+F-H0-3366 2 cjeqpdqpdd
+F-H0-3367 2 djeqpdqpdd
+F-H0-3368 25 ncppdpcjddpd
+F-H0-3369 7 jqpppddpddjc
+F-H0-3370 4 qldpppqjpddd
+F-H0-3371 3 qnppdpcjddpd
+F-H0-3372 3 cmppdpcjddpd
+F-H0-3373 2 cfppdpcjddpd
+F-H0-3374 38 dqfqhqcqdpppdcpd
+F-H0-3375 2 cpfqhqcqdpppdcpd
+F-H0-3376 12 fofqfpppdpgpddpd
+F-H0-3377 6 ceppdfdppddgddcf
+F-H0-3378 4 ogpppfdppdpgddqf
+F-H0-3379 8 dpndqd
+F-H0-3380 7 ddndqd
+F-H0-3381 7 pqndqd
+F-H0-3382 7 pfndqd
+F-H0-3383 5 cpndqd
+F-H0-3384 5 qepfpc
+F-H0-3385 3 ddpfpc
+F-H0-3386 2 nendqd
+F-H0-3387 2 edndqd
+F-H0-3388 17 opcqpdqpcd
+F-H0-3389 10 pkcqpqdcpd
+F-H0-3390 5 qkcqpqdcpd
+F-H0-3391 4 eccqpdqpcd
+F-H0-3392 4 fpcqpqdcpd
+F-H0-3393 3 dpcqpqdcpd
+F-H0-3394 3 oqcqpdqpcd
+F-H0-3395 2 fqcqpqdcpd
+F-H0-3396 28 gpippqfpfqdpcnddpd
+F-H0-3397 12 cqippqfpfqdpcnddpd
+F-H0-3398 2 odppdppdqfndnckddc
+F-H0-3399 44 pqqqfqdpppqnjpcnqlddpd
+F-H0-3400 14 qnpppddpeddjcddgic
+F-H0-3401 12 qfppdppdcijddegddc
+F-H0-3402 10 jdmppqjppodpqkddpd
+F-H0-3403 5 jqpppddpeddjcddgic
+F-H0-3404 14 npdpppqnqlonqhqjqdddoc
+F-H0-3405 7 ncdpoqqjqpqfqlofqhddpd
+F-H0-3406 22 neppdppjncpddckd
+F-H0-3407 10 qqppnqkpdqpjddpd
+F-H0-3408 5 qfppdppjncpddckd
+F-H0-3409 4 leppdppjncpddckd
+F-H0-3410 2 pnppnqkpdqpjddpd
+F-H0-3411 14 jdpopddodd
+F-H0-3412 11 jqpopddodd
+F-H0-3413 8 pqpopddodd
+F-H0-3414 3 jqepppedpd
+F-H0-3415 3 ceepppedpd
+F-H0-3416 2 jjepppedpd
+F-H0-3417 2 djpopddodd
+F-H0-3418 2 mcopdpoddd
+F-H0-3419 43 pjqippqhdppdpindqfjdofdd
+F-H0-3420 2 lplqnqkqkpppdppnnopjddpd
+F-H0-3421 15 qfpqdppdcfjdddfc
+F-H0-3422 15 popqdppdcfjdddfc
+F-H0-3423 11 qnpqdppdcfjdddfc
+F-H0-3424 6 pnpqdppdcfjdddfc
+F-H0-3425 2 qopqdppdcfjdddfc
+F-H0-3426 2 qjfqdpppcnjpddpc
+F-H0-3427 37 endqppeododdpd
+F-H0-3428 12 ccdpppeededcpd
+F-H0-3429 2 ppqpopdppdoodd
+F-H0-3430 37 dofqhqcqdqppdpcpdcpd
+F-H0-3431 18 cnppcldpcjemcidkdhdjchdipdehjdeffdcfdd
+F-H0-3432 9 qmppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-3433 7 jqppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-3434 7 omqnpponnpoljppkdppjqlpiplogqkpdqjddqh
+F-H0-3435 16 jpceppocdp
+F-H0-3436 8 dqcoppecpd
+F-H0-3437 5 epcoppecpd
+F-H0-3438 5 dqoqpdcodd
+F-H0-3439 2 opeqpdqodd
+F-H0-3440 2 coeqpdqodd
+F-H0-3441 2 djeqpdqodd
+F-H0-3442 24 ccefpppddpjdcfdd
+F-H0-3443 11 ldppdppjddnencpd
+F-H0-3444 2 dbdpppdjpdfefcdd
+F-H0-3445 2 qfppdppjddnencpd
+F-H0-3446 2 qdppdppjddnencpd
+F-H0-3447 2 kqppnqnodppjddpd
+F-H0-3448 39 cphqfqdqcqdpppdcpd
+F-H0-3449 30 piqhqppddpndqfddof
+F-H0-3450 4 cjchpppdcpfdefddcf
+F-H0-3451 4 rdqhqppddpndqfddof
+F-H0-3452 3 kqhqpqdpfqdnfoddpd
+F-H0-3453 2 fmhqpqdpfqdnfoddpd
+F-H0-3454 7 eeppoe
+F-H0-3455 4 edppoe
+F-H0-3456 3 pqddoe
+F-H0-3457 2 eoddoe
+F-H0-3458 2 epddoe
+F-H0-3459 2 npddoe
+F-H0-3460 2 dpppoe
+F-H0-3461 2 dppdee
+F-H0-3462 40 fpeqfqdqppcpepdcpd
+F-H0-3463 9 gpeqfqdqppcpepdcpd
+F-H0-3464 33 qdppqhcppdqfddqc
+F-H0-3465 3 qddqppddpdqclcnc
+F-H0-3466 28 cmppdpckcedgcdcffcdedcpd
+F-H0-3467 5 qnppdpckcedgcdcffcdedcpd
+F-H0-3468 5 nqppdpckcedgcdcffcdedcpd
+F-H0-3469 2 qjppdpckcedgcdcffcdedcpd
+F-H0-3470 13 qndrercrhqfqeqcqdqppdpcpdocndcpd
+F-H0-3471 10 nqdrercrhqfqeqcqdqppdpcpdocndcpd
+F-H0-3472 8 ncdrercrhqfqeqcqdqppdpcpdocndcpd
+F-H0-3473 3 qjppdqcfdepdddcdhcfcecccdcdbebcb
+F-H0-3474 2 gofqqpdqepcqdpbqcpbpcocnbopdcldd
+F-H0-3475 15 cnipfqdpqpdcpd
+F-H0-3476 9 nqipfqdpqpdcpd
+F-H0-3477 9 ofpipqpddpcdqf
+F-H0-3478 8 cqipfqdpqpdcpd
+F-H0-3479 2 dnipfqdpqpdcpd
+F-H0-3480 2 kqipfqdpqpdcpd
+F-H0-3481 37 eqdrercrhqfqdqcqdpppdocpdcpd
+F-H0-3482 37 erdrhqfqdqcqdpppdocpdcpd
+F-H0-3483 39 crerdrhqfqdqcqdpppdocpdcpd
+F-H0-3484 19 jccipppddpdc
+F-H0-3485 12 qfcipppddpdc
+F-H0-3486 5 jpcipppddpdc
+F-H0-3487 3 nccipppddpdc
+F-H0-3488 2 iccipppddpdc
+F-H0-3489 39 drhqfqdqcqdpppdocpdcpd
+F-H0-3490 12 eqcpqppc
+F-H0-3491 11 ppdqdcqd
+F-H0-3492 7 dodqdcqd
+F-H0-3493 3 qpdqdcqd
+F-H0-3494 2 pqdqdcqd
+F-H0-3495 2 qqdqdcqd
+F-H0-3496 31 qorppqdpfqqnjppnpocnqlddpd
+F-H0-3497 5 onrppqdpfqqnjppnpocnqlddpd
+F-H0-3498 27 nppqpodpddpd
+F-H0-3499 6 qqqpopdpddpd
+F-H0-3500 5 fcppdpqdoddd
+F-H0-3501 3 mppqpodpddpd
+F-H0-3502 2 cnqpopdpddpd
+F-H0-3503 33 pjpdqpnddpjdqfdd
+F-H0-3504 8 kdppdppjncpfdcpd
+F-H0-3505 6 prppnqpndqpjddpd
+F-H0-3506 25 dppoddqe
+F-H0-3507 10 dqpoddqe
+F-H0-3508 6 eqpoddqe
+F-H0-3509 2 odpoddqe
+F-H0-3510 15 pnqpoppddpcd
+F-H0-3511 14 edqpoppddpcd
+F-H0-3512 3 pnpqdppddedc
+F-H0-3513 2 qoqpoppddpcd
+F-H0-3514 2 eqppodcpddqd
+F-H0-3515 22 gqnqpqiqoqopdqmpqppdcoddqn
+F-H0-3516 9 qjppeqckcpdgcecfcddefcpddc
+F-H0-3517 5 nqppqfdpceodqdmdpcncocicdc
+F-H0-3518 2 cfdppqponqqnqppmqoqiqdddoc
+F-H0-3519 2 qnppcfdpqegdcdedpckcecfcdc
+F-H0-3520 22 peqpopcddppc
+F-H0-3521 12 pfpqodcpddqd
+F-H0-3522 8 eppqodcpddqd
+F-H0-3523 2 qepqodcpddqd
+F-H0-3524 42 jppqmppodppkddpd
+F-H0-3525 2 ncpqmppodppkddpd
+F-H0-3526 45 icqfppcedpqdodpcmdocncdc
+F-H0-3527 20 mdphppdddppcpe
+F-H0-3528 11 enhpppcpepddpd
+F-H0-3529 5 ndphppdddppcpe
+F-H0-3530 5 cqhpppcpepddpd
+F-H0-3531 3 cedppphdpdcded
+F-H0-3532 39 cnerdrhqcreqfqdqcqdpppdocpdcpd
+F-H0-3533 9 efdpppdedfcecfdcpd
+F-H0-3534 20 jpdppqjdpkddpfncpd
+F-H0-3535 12 fqdppqjdpkddpfncpd
+F-H0-3536 2 ipdppqjdpkddpfncpd
+F-H0-3537 2 cfdppqjdpkddpfncpd
+F-H0-3538 30 podppqqnfqcnipddpd
+F-H0-3539 5 qpdppqqnfqcnipddpd
+F-H0-3540 2 hqfqpppdcpdddifccf
+F-H0-3541 20 jqdqppcoddpd
+F-H0-3542 13 ckeqppcpddpd
+F-H0-3543 6 qfdqppcoddpd
+F-H0-3544 3 qnppdpcdpdec
+F-H0-3545 3 jpdqppcoddpd
+F-H0-3546 19 popqpdcpcd
+F-H0-3547 8 qkdqpqcdpd
+F-H0-3548 5 ceqdqpdcdp
+F-H0-3549 5 pkdqpqcdpd
+F-H0-3550 3 dodqpqcdpd
+F-H0-3551 2 fpcpppdcpc
+F-H0-3552 15 popqdpfqdnipddpd
+F-H0-3553 9 ncpqdpfqdnipddpd
+F-H0-3554 8 qnpqdpfqdnipddpd
+F-H0-3555 3 drpqdpfqdnipddpd
+F-H0-3556 3 pnpqdpfqdnipddpd
+F-H0-3557 2 qkpqdpfqdnipddpd
+F-H0-3558 20 eqcpppqdddoc
+F-H0-3559 13 odeqppcpddqd
+F-H0-3560 3 jqdqppcoddpc
+F-H0-3561 3 ckeqppcpddqd
+F-H0-3562 2 fpcpppqdddoc
+F-H0-3563 2 fqcpppqdddoc
+F-H0-3564 32 odppqhcpqdqfpdqcddpc
+F-H0-3565 2 qbdqppqdpdddpcqclcnc
+F-H0-3566 33 cqppepcppddnddcf
+F-H0-3567 4 kddpppfddencpddc
+F-H0-3568 2 hqpqdpfqponpddpd
+F-H0-3569 2 dnpqdpfqponpddpd
+F-H0-3570 2 cnpqdpfqponpddpd
+F-H0-3571 21 lqnqpppddpddqfncrd
+F-H0-3572 7 ncdpppqfpdcffcdddb
+F-H0-3573 5 npdpdrqnfqcnppddpd
+F-H0-3574 4 pkdpdrqnfqcnppddpd
+F-H0-3575 3 cqdpdrqnfqcnppddpd
+F-H0-3576 2 pndpdrqnfqcnppddpd
+F-H0-3577 2 mqdpdrqnfqcnppddpd
+F-H0-3578 30 phppqidpqhpjpdpindqfjdofdd
+F-H0-3579 8 qjppqidpqhpjpdpindqfjdofdd
+F-H0-3580 11 edpppe
+F-H0-3581 4 opddod
+F-H0-3582 4 doddod
+F-H0-3583 3 oppded
+F-H0-3584 3 qnpppe
+F-H0-3585 3 oqddod
+F-H0-3586 3 eqpppe
+F-H0-3587 2 dppdpo
+F-H0-3588 28 dpqoddpd
+F-H0-3589 9 dqqoddpd
+F-H0-3590 3 eqqoddpd
+F-H0-3591 2 pqqoddpd
+F-H0-3592 2 doqoddpd
+F-H0-3593 18 ncdppqqfpddd
+F-H0-3594 10 qhdppqqfpddd
+F-H0-3595 4 npdpppqnpcdd
+F-H0-3596 4 kpnqpppdcpdd
+F-H0-3597 2 jdpppddpcdnc
+F-H0-3598 2 qidppqqfpddd
+F-H0-3599 8 qppqppoqnpnqooopnompmodppjddpd
+F-H0-3600 42 qpqqlqnqppdppjdcpd
+F-H0-3601 18 cfcpppqdddfc
+F-H0-3602 6 qldqppqnddpc
+F-H0-3603 6 odnqppcpddqd
+F-H0-3604 5 kpnqppcpddqd
+F-H0-3605 4 jdcpppqdddfc
+F-H0-3606 4 fpnqppcpddqd
+F-H0-3607 4 odcpppqdddfc
+F-H0-3608 2 npdqppqnddpc
+F-H0-3609 28 pcqhppqdcppdqfddqc
+F-H0-3610 13 ccppdpcfddpdfcbd
+F-H0-3611 3 lqprppnqdppdqndd
+F-H0-3612 2 ncppfqbpdpcnddpd
+F-H0-3613 2 cfdrppfqdppdcndd
+F-H0-3614 2 qjppdpcfddpdfcbd
+F-H0-3615 2 cmppfqbpdpcnddpd
+F-H0-3616 22 phogpppfdpofpgoeqfpdqejdpeddqdpc
+F-H0-3617 19 qqqppqppoqnpnqooopnompmodppjddpd
+F-H0-3618 15 nqfqlqppjqkpiqjphqiphpmodphodnfoddpd
+F-H0-3619 14 qjfqlqppjqkpiqjphqiphpmodphodnfoddpd
+F-H0-3620 4 monqlqkpkqjpjqiphqdpppnolplopngopddd
+F-H0-3621 4 mcppdpmedfhehdfeddpdlckdjcjdicidhcfc
+F-H0-3622 19 ccdpppcfddpdfcbd
+F-H0-3623 9 nqppdpqfpdrdncdd
+F-H0-3624 7 cfppdpqfpdrdncdd
+F-H0-3625 3 fqprppnqqndpddpd
+F-H0-3626 2 ncdpppcfddpdfcbd
+F-H0-3627 2 mqprppnqqndpddpd
+F-H0-3628 29 kpnqlqlpppdppjddpd
+F-H0-3629 3 qippqhdppdphjdqfdd
+F-H0-3630 2 qmqnpppljppddpddql
+F-H0-3631 13 ccpqcqpd
+F-H0-3632 11 pqdpqcdc
+F-H0-3633 3 pppdcqcd
+F-H0-3634 2 odqdqqdd
+F-H0-3635 20 roopqpqolppddpdd
+F-H0-3636 13 ppopqpqolppddpdd
+F-H0-3637 12 poopqpqolppddpdd
+F-H0-3638 39 pqlqqqqpnqppdppjdcpd
+F-H0-3639 42 opqqlqpqqpnqppdppjdcpd
+F-H0-3640 36 cfppdpcededcpd
+F-H0-3641 6 ppoqopqpdpddpd
+F-H0-3642 12 cddppqqopd
+F-H0-3643 8 pldppqqopd
+F-H0-3644 7 qmdppqqopd
+F-H0-3645 3 qldppqqopd
+F-H0-3646 3 pnoqqppddp
+F-H0-3647 2 dpppqdocdd
+F-H0-3648 2 pkdppqqopd
+F-H0-3649 2 qkdppqqopd
+F-H0-3650 5 iccffcdddbcc
+F-H0-3651 2 rcpdqfqcrdnc
+F-H0-3652 14 nqcqerppcrcpdqdofpckddpd
+F-H0-3653 7 qnppdpcifddedcpdebcdcbcc
+F-H0-3654 7 cicqerppcrcpdqdofpckddpd
+F-H0-3655 5 nqppdpcifddedcpdebcdcbcc
+F-H0-3656 2 qfppdpcifddedcpdebcdcbcc
+F-H0-3657 2 qjppdpcifddedcpdebcdcbcc
+F-H0-3658 18 dppppdjj
+F-H0-3659 11 ddpppdjj
+F-H0-3660 4 pqdpddjj
+F-H0-3661 2 pjpppdjj
+F-H0-3662 2 cojjpppd
+F-H0-3663 26 mppqdpplpoqdddoc
+F-H0-3664 9 nopqdpplpoqdddoc
+F-H0-3665 4 oqpqdpplpoqdddoc
+F-H0-3666 2 nppqdpplpoqdddoc
+F-H0-3667 14 jpdppqjdqkncpfdcpd
+F-H0-3668 12 fcnqppdqpnjpqiddpc
+F-H0-3669 3 odqniqpjppqdnpddcp
+F-H0-3670 2 cjdppqjdqkncpfdcpd
+F-H0-3671 2 ipdppqjdqkncpfdcpd
+F-H0-3672 11 lpopqppddpcdqf
+F-H0-3673 9 dfqpcndppdedcd
+F-H0-3674 9 qodppqpofqdcpd
+F-H0-3675 5 cndppqpofqdcpd
+F-H0-3676 5 oeppqncpqdoddd
+F-H0-3677 2 nqdppqpofqdcpd
+F-H0-3678 2 pfpqdpdencpddc
+F-H0-3679 37 qnpqdpfqpoqoddpd
+F-H0-3680 6 pppqdpfqpoqoddpd
+F-H0-3681 20 pfdpoqddqpncpd
+F-H0-3682 8 lcdpoqddqpncpd
+F-H0-3683 5 qfdpoqddqpncpd
+F-H0-3684 4 kpnqppdpqdddoc
+F-H0-3685 18 lcdpppncpjecpd
+F-H0-3686 7 pfdpppncpjecpd
+F-H0-3687 5 pfdppdqojdqfdd
+F-H0-3688 4 jdnqppeqpjddpd
+F-H0-3689 3 kddpppncpjecpd
+F-H0-3690 2 oedpppncpjecpd
+F-H0-3691 29 bndqcqppcpjpcndpqddoddcl
+F-H0-3692 8 rqlqqqqppqppnqopdppjdcpd
+F-H0-3693 2 nplqqqqppqppnqopdppjdcpd
+F-H0-3694 31 ooopqppnlppddpdd
+F-H0-3695 4 qfppqddpldpfddod
+F-H0-3696 4 qonppqdpplpopddd
+F-H0-3697 27 dpppddqc
+F-H0-3698 16 dcqqdppd
+F-H0-3699 22 qldpfqqnppcnjpdcpd
+F-H0-3700 5 pndpfqqnppcnjpdcpd
+F-H0-3701 3 jpnqpppddpcdpjncqf
+F-H0-3702 3 npdpfqqnppcnjpdcpd
+F-H0-3703 2 pkdpfqqnppcnjpdcpd
+F-H0-3704 2 nqdpfqqnppcnjpdcpd
+F-H0-3705 30 qeppqhcpreqfqdrdpdrcodqcddpc
+F-H0-3706 2 fbpqdppddecdddfchcccdcdbebcb
+F-H0-3707 32 reppqhcpqdqfpdrdodqcddpc
+F-H0-3708 26 rdqhppqdcppdqfodqcddpc
+F-H0-3709 16 opnqoqnpqppddpdd
+F-H0-3710 33 olppqnnponjppkdppdqlddpl
+F-H0-3711 15 ccpqdppdcffcdddb
+F-H0-3712 12 popqdppdcffcdddb
+F-H0-3713 3 pfdrdpfqcnppddpc
+F-H0-3714 3 nqpppdcpddqfncrd
+F-H0-3715 2 qgpppdcpddqfncrd
+F-H0-3716 8 nddpppedpjncpd
+F-H0-3717 7 lcdpppedpjncpd
+F-H0-3718 5 pnnqppeppjddpd
+F-H0-3719 3 jdnqppeppjddpd
+F-H0-3720 3 eocnppdejppddp
+F-H0-3721 2 nedpppedpjncpd
+F-H0-3722 26 rcqhpprecpqdqfpdrdodqcddpc
+F-H0-3723 10 dppnpqddpd
+F-H0-3724 9 qopnpqddpd
+F-H0-3725 7 pqdpqdnddd
+F-H0-3726 5 nddppppfpc
+F-H0-3727 2 qlpnpqddpd
+F-H0-3728 2 oqdpqdnddd
+F-H0-3729 2 oedppppfpc
+F-H0-3730 2 qppnpqddpd
+F-H0-3731 2 eppnpqddpd
+F-H0-3732 16 popqdqqdddoc
+F-H0-3733 10 jqdqqdqpddco
+F-H0-3734 5 occeqpqddpdc
+F-H0-3735 2 kpceqpqddpdc
+F-H0-3736 2 qfoqdpqpdcpc
+F-H0-3737 17 qpdppqqnqdddoc
+F-H0-3738 8 lcppcedpqdncdc
+F-H0-3739 4 kqnqdqpdqpddco
+F-H0-3740 3 podppqqnqdddoc
+F-H0-3741 2 qjdppqqnqdddoc
+F-H0-3742 2 fqdppqqnqdddoc
+F-H0-3743 17 jdmppqjppodppkddpd
+F-H0-3744 11 fcmppqjppodppkddpd
+F-H0-3745 3 jqdpppmdpijdpeddpc
+F-H0-3746 2 cjmppqjppodppkddpd
+F-H0-3747 2 cnmppqjppodppkddpd
+F-H0-3748 11 qjppdqjjddpd
+F-H0-3749 8 cnpppddpcdjj
+F-H0-3750 7 pjppqddpddjj
+F-H0-3751 3 pjppdpjjdcpd
+F-H0-3752 2 qnppdpjjdcpd
+F-H0-3753 2 nqppqddpddjj
+F-H0-3754 6 fpeqfqdqepcp
+F-H0-3755 2 rfqeqfqdpepc
+F-H0-3756 2 mdqdodpcncoc
+F-H0-3757 16 dqfqeqepcp
+F-H0-3758 29 fpfqipppdpcnddpd
+F-H0-3759 11 pnnqppdpkpqnpddd
+F-H0-3760 14 occppqddqd
+F-H0-3761 10 opqpdqpdcd
+F-H0-3762 4 qopqqddpdc
+F-H0-3763 3 nccppqddqd
+F-H0-3764 3 fqdpqpcdpc
+F-H0-3765 9 idpopddocd
+F-H0-3766 6 pqpopddocd
+F-H0-3767 6 iqpeppdecp
+F-H0-3768 6 pcpeqpdedp
+F-H0-3769 5 cjeppqedpd
+F-H0-3770 2 qjpopddocd
+F-H0-3771 26 ddpodpqe
+F-H0-3772 9 dcpodpqe
+F-H0-3773 3 edpodpqe
+F-H0-3774 2 ecpodpqe
+F-H0-3775 25 qkqnpponnpoljppkdppdqlddpl
+F-H0-3776 5 oippqhdpphpipdohndqfjdofdd
+F-H0-3777 27 qqrppqdpfqrojpqnqopnpocnqlddpd
+F-H0-3778 4 rmrppqdpfqrojpqnqopnpocnqlddpd
+F-H0-3779 33 ropqrpfqdpjpqnqopnpocnqlddpd
+F-H0-3780 21 ccppqddpfdcfddbdkc
+F-H0-3781 7 fqdppqddqkncpfpbpd
+F-H0-3782 3 lcdppqddqkncpfpbpd
+F-H0-3783 3 jpdppqddqkncpfpbpd
+F-H0-3784 11 qnircqdripfqdpppdnfoddpd
+F-H0-3785 10 ncircqdripfqdpppdnfoddpd
+F-H0-3786 5 jqbpcqenppcnfpbkdppddkdd
+F-H0-3787 3 nqircqdripfqdpppdnfoddpd
+F-H0-3788 3 cippdpfedfpdidfcddibccdb
+F-H0-3789 2 djircqdripfqdpppdnfoddpd
+F-H0-3790 2 gnbpcqenppcnfpbkdppddkdd
+F-H0-3791 27 onpqdpfqpoooddpd
+F-H0-3792 11 qqpqdpfqpoooddpd
+F-H0-3793 13 copqdqdoddpd
+F-H0-3794 10 dlpqdqdoddpd
+F-H0-3795 6 cgppdpdedcpc
+F-H0-3796 4 dneppppdcpcd
+F-H0-3797 2 popqdqdoddpd
+F-H0-3798 7 dhpqdpcedcqd
+F-H0-3799 5 odpqdpcedcqd
+F-H0-3800 4 dgpqdpcedcqd
+F-H0-3801 3 edpqdpcedcqd
+F-H0-3802 3 cgpqdpcedcqd
+F-H0-3803 3 cipqdpcedcqd
+F-H0-3804 2 popqdpcedcqd
+F-H0-3805 2 pnoqqpcddppc
+F-H0-3806 18 edqdppcddpoc
+F-H0-3807 6 qiqdppcddpoc
+F-H0-3808 4 qopqdpqeddpc
+F-H0-3809 3 cjqdppcddpec
+F-H0-3810 3 fdqdppcddpoc
+F-H0-3811 3 fcqdppcddpoc
+F-H0-3812 2 pjoqpdqpddcp
+F-H0-3813 2 djqdppcddpoc
+F-H0-3814 11 mdpppephddpc
+F-H0-3815 8 nopqdpplpopd
+F-H0-3816 6 nppqdpplpopd
+F-H0-3817 3 oqpqdpplpopd
+F-H0-3818 2 dcpqdpplpopd
+F-H0-3819 9 pcqpogdppfpgofqfoeqepdpejdqddd
+F-H0-3820 2 qcdpppodpjmdoepcneocmencpddcnd
+F-H0-3821 13 lddppqocqddc
+F-H0-3822 6 popqcpeqdcpd
+F-H0-3823 5 qopqcpeqdcpd
+F-H0-3824 4 dnpqcpeqdcpd
+F-H0-3825 3 dopqcpeqdcpd
+F-H0-3826 2 cnoqqpdqpcdd
+F-H0-3827 2 iqpqcpeqdcpd
+F-H0-3828 2 ippqcpeqdcpd
+F-H0-3829 24 ncqhpprecpqeqfqdrdpdrcodqcddpc
+F-H0-3830 13 nqppdpqddfkcddfc
+F-H0-3831 6 qjkqdpfqdnqpddpd
+F-H0-3832 4 qfkqdpfqdnqpddpd
+F-H0-3833 2 opkqdpfqdnqpddpd
+F-H0-3834 13 qnppqhcpreqfqerdqdrcpdqcodpcddnc
+F-H0-3835 8 popqdpcfdepdddcdhcfcecccdcdbebcb
+F-H0-3836 4 qndrercrhqfqeqcqdqppdpcpdocnddpc
+F-H0-3837 3 kqdrercrhqfqeqcqdqppdpcpdocnddpc
+F-H0-3838 3 qopqdpcfdepdddcdhcfcecccdcdbebcb
+F-H0-3839 15 phdpoqpepcdd
+F-H0-3840 8 cgppeqdedcpd
+F-H0-3841 6 fpppdqdoecpd
+F-H0-3842 3 ceppeqdedcpd
+F-H0-3843 2 cpppeqdedcpd
+F-H0-3844 2 jqopqppdcodd
+F-H0-3845 2 qnppdqdoecpd
+F-H0-3846 15 ocpqcpddqd
+F-H0-3847 11 deppcpdcqd
+F-H0-3848 4 eqpqcpddqd
+F-H0-3849 3 ceppcpdcqd
+F-H0-3850 2 fcpqcpddqd
+F-H0-3851 2 fqppcpdcqd
+F-H0-3852 30 hpfqiqpphqjpdpipdnfoddpd
+F-H0-3853 3 qjqnpponnppkdppjqlpdqkdd
+F-H0-3854 32 jpiqfqhqppdpipdnfoddpd
+F-H0-3855 26 hqnqlqdqkqkpjqjpppiplpnopnlopjddpd
+F-H0-3856 2 icdpppnepjlepfkdpdjdldidlcnckcdcjc
+F-H0-3857 2 oqnqlqdqkqkpjqjpppiplpnopnlopjddpd
+F-H0-3858 8 qjppcqpdcc
+F-H0-3859 6 cfpdqqddcq
+F-H0-3860 2 cfdpqqddqc
+F-H0-3861 2 qjdpqqddqc
+F-H0-3862 2 pjdpqqddqc
+F-H0-3863 2 gddpqqddqc
+F-H0-3864 16 fppqjpfqdpcnddpd
+F-H0-3865 12 ndqppjdppdqfddnc
+F-H0-3866 8 eopqjpfqdpcnddpd
+F-H0-3867 28 jqnqlqdqkqkpppjplpnopnlopjddpd
+F-H0-3868 21 pldppqpofqdnjpddpd
+F-H0-3869 5 qodppqpofqdnjpddpd
+F-H0-3870 4 nddpppdfjdpepcddfc
+F-H0-3871 3 qmdppqpofqdnjpddpd
+F-H0-3872 3 nqdppqpofqdnjpddpd
+F-H0-3873 28 qjppdqqddcoc
+F-H0-3874 3 icceqppdcpdc
+F-H0-3875 3 qfceqppdcpdc
+F-H0-3876 3 npoqdqqpdcpd
+F-H0-3877 9 pepcjj
+F-H0-3878 3 ppdcjj
+F-H0-3879 2 pjpqjj
+F-H0-3880 10 cnopfqdpqpddpc
+F-H0-3881 10 mcdppqodqdddfc
+F-H0-3882 9 lddppqodqdddfc
+F-H0-3883 3 qeppqndpcdpepc
+F-H0-3884 2 dgppcndpqddedc
+F-H0-3885 2 oedppqodqdddfc
+F-H0-3886 2 cippcndpqddedc
+F-H0-3887 6 epppqdcpcd
+F-H0-3888 5 cnqpqddpcd
+F-H0-3889 5 qedppqdcpc
+F-H0-3890 4 fqppqdcpcd
+F-H0-3891 4 oqqpqddpcd
+F-H0-3892 4 dfdppqdcpc
+F-H0-3893 2 odqpqddpcd
+F-H0-3894 2 cfdqpqddpc
+F-H0-3895 6 cnppcedpqd
+F-H0-3896 4 qpdpoqddpc
+F-H0-3897 4 qnppdqpdec
+F-H0-3898 3 nqppdqpdec
+F-H0-3899 2 cjdppqddoc
+F-H0-3900 2 qfppdqpdec
+F-H0-3901 34 qeppqfdpofpgoeneqdpdldodddqc
+F-H0-3902 6 rdppqfdpofpgoeneqdpdldodddqc
+F-H0-3903 18 nppqppoqopnqqoqppddpdd
+F-H0-3904 6 drdqeqcpppcodpcndoddpd
+F-H0-3905 6 pjdpppcfdecepdcddddcec
+F-H0-3906 3 jddpppcfdecepdcddddcec
+F-H0-3907 2 qcqdppdddppcqeocpdncod
+F-H0-3908 13 nqdpppqnddqd
+F-H0-3909 8 popqdpfqpddd
+F-H0-3910 7 lcppdpncpddc
+F-H0-3911 3 dnpqdpfqpddd
+F-H0-3912 2 eqcpppcfddpd
+F-H0-3913 17 cfqedqddpp
+F-H0-3914 10 oceqppddqd
+F-H0-3915 5 cddpqpecpd
+F-H0-3916 4 nqdpqpecpd
+F-H0-3917 25 ocppqddpddpdpcodmcqc
+F-H0-3918 4 crcqdqppcpdpcmdoddpd
+F-H0-3919 2 rqqqpqppqpdpqmpopddd
+F-H0-3920 36 pdqdppdddppcodmcqc
+F-H0-3921 24 pjdpppcldjcedfcdcffcdedcpd
+F-H0-3922 4 lecfpppddpcdjdlcfdeceddcfc
+F-H0-3923 3 qnlqfqeqjpdqfpppepcppdcndd
+F-H0-3924 3 jqdpppcldjcedfcdcffcdedcpd
+F-H0-3925 3 nqlqfqeqjpdqfpppepcppdcndd
+F-H0-3926 8 qnpqdpjpddpd
+F-H0-3927 6 popqdpjpddpd
+F-H0-3928 6 qkpqdpjpddpd
+F-H0-3929 5 qhqppddpddpj
+F-H0-3930 5 ncpqdpjpddpd
+F-H0-3931 4 pnpqdpjpddpd
+F-H0-3932 2 pjpppdcpdddj
+F-H0-3933 2 jddjpppddpcd
+F-H0-3934 18 popqdpecpd
+F-H0-3935 9 oqqpdpcepd
+F-H0-3936 7 qpoqdpdcpd
+F-H0-3937 3 depqdpecpd
+F-H0-3938 16 cfqodppdddfc
+F-H0-3939 6 npqnpppddpec
+F-H0-3940 5 ipfqdpppddqe
+F-H0-3941 5 qlqnpppddpec
+F-H0-3942 3 jdqodppdddfc
+F-H0-3943 7 oqopqpdcpd
+F-H0-3944 6 dpopqpdcpd
+F-H0-3945 5 lpopqpdcpd
+F-H0-3946 5 dqopqpdcpd
+F-H0-3947 4 mqopqpdcpd
+F-H0-3948 4 qpepcppcdd
+F-H0-3949 4 pnopqpdcpd
+F-H0-3950 16 ldpopqddcpocqd
+F-H0-3951 8 pepopqddcpocqd
+F-H0-3952 4 mdpopqddcpocqd
+F-H0-3953 3 plpopqddcpocqd
+F-H0-3954 7 depqeppd
+F-H0-3955 7 ddpqeppd
+F-H0-3956 7 deqppedp
+F-H0-3957 5 ecpqeppd
+F-H0-3958 3 edpddocd
+F-H0-3959 2 dcpqeppd
+F-H0-3960 2 qopqeppd
+F-H0-3961 35 fcqeqpcddppcedec
+F-H0-3962 5 pppqdpqopoqddcoc
+F-H0-3963 13 epcpqpdcpd
+F-H0-3964 11 eqcpqpdcpd
+F-H0-3965 5 cedqpdqpdc
+F-H0-3966 2 fpcpqpdcpd
+F-H0-3967 2 ncdqppcdqd
+F-H0-3968 11 fcdpqqddpd
+F-H0-3969 11 fqdpqqddpd
+F-H0-3970 7 nddpppddqc
+F-H0-3971 2 pjppdddpqc
+F-H0-3972 2 cjdpqqddpd
+F-H0-3973 33 ogdppprfqhqfpecfpdqdjdddpcqcfc
+F-H0-3974 3 dncqnqppdqcpjpqndpcndobnclpddd
+F-H0-3975 25 pddpppde
+F-H0-3976 5 cppdpped
+F-H0-3977 2 eqpoddpd
+F-H0-3978 29 iplqnqkqdqjqkpppjplpnopnlopjddpd
+F-H0-3979 17 dpopdcpd
+F-H0-3980 9 dqopdcpd
+F-H0-3981 5 cpeppcdd
+F-H0-3982 4 eqopdcpd
+F-H0-3983 3 cpopdcpd
+F-H0-3984 4 ddpqdpqopnpd
+F-H0-3985 3 qnpqdpqopnpd
+F-H0-3986 3 popqdpqopnpd
+F-H0-3987 2 cndpdfcepddc
+F-H0-3988 2 dcpqdpqopnpd
+F-H0-3989 12 nomqopqpdppd
+F-H0-3990 9 qqmqopqpdppd
+F-H0-3991 5 ormqopqpdppd
+F-H0-3992 2 pmpqpodppdqm
+F-H0-3993 2 qomqopqpdppd
+F-H0-3994 9 nqppdppjddoencpd
+F-H0-3995 8 cceepppddpjdcfdd
+F-H0-3996 4 jddpppdjpdeefcdd
+F-H0-3997 3 kqppnqoodppjddpd
+F-H0-3998 3 kdppdppjddoencpd
+F-H0-3999 2 neppdppjddoencpd
+F-H0-4000 2 prppnqoodppjddpd
+F-H0-4001 2 lpppnqoodppjddpd
+F-H0-4002 29 cnfqeqppdqfpcpepdcpd
+F-H0-4003 4 ponqpqopoqnpqpdppcdd
+F-H0-4004 31 qkdrercrhqqqeqnqdqfqrpcqdpppdocpqncnddpd
+F-H0-4005 13 rmqqrppqdpfqrojpqnqopnpocnqlddpd
+F-H0-4006 11 nnqqrppqdpfqrojpqnqopnpocnqlddpd
+F-H0-4007 4 onqqrppqdpfqrojpqnqopnpocnqlddpd
+F-H0-4008 3 plqqrppqdpfqrojpqnqopnpocnqlddpd
+F-H0-4009 34 nqoqopqpdppd
+F-H0-4010 11 dnfqdpopdcpd
+F-H0-4011 10 cnfqdpopdcpd
+F-H0-4012 7 ipfqdpopdcpd
+F-H0-4013 4 qmnqppeppcdd
+F-H0-4014 4 hqfqdpopdcpd
+F-H0-4015 2 ofdppppgpfqfpddficddfcccdb
+F-H0-4016 32 pqnqoqopqpdppd
+F-H0-4017 23 nppqnqoqopqpdppd
+F-H0-4018 5 gpeqfqdqppcpepdd
+F-H0-4019 3 ddpqnqoqopqpdppd
+F-H0-4020 3 dcpqnqoqopqpdppd
+F-H0-4021 3 gpdpooddpd
+F-H0-4022 2 qodpooddpd
+F-H0-4023 2 fqdpooddpd
+F-H0-4024 11 qodppqpnfqddpd
+F-H0-4025 9 cndppqpnfqddpd
+F-H0-4026 7 oodppqpnfqddpd
+F-H0-4027 4 dfppcndppdfdcd
+F-H0-4028 3 qpdppqpnfqddpd
+F-H0-4029 2 feppcndppdfdcd
+F-H0-4030 2 qldppqpnfqddpd
+F-H0-4031 2 jpdppqpnfqddpd
+F-H0-4032 6 dnpqdpfqedpd
+F-H0-4033 6 hqpqdpfqedpd
+F-H0-4034 5 dipppecpddcf
+F-H0-4035 5 cnpqdpfqedpd
+F-H0-4036 3 popqdpfqedpd
+F-H0-4037 2 pjqpdedppdqf
+F-H0-4038 2 eopqdpfqedpd
+F-H0-4039 16 popqdppddfjdddfc
+F-H0-4040 8 qfpqdppddfjdddfc
+F-H0-4041 3 pffqdpppdnjpddpc
+F-H0-4042 3 qopqdppddfjdddfc
+F-H0-4043 12 fqdppqdjqkddpd
+F-H0-4044 8 jpdppqdjqkddpd
+F-H0-4045 7 fcdppqdjqkddpd
+F-H0-4046 3 pipdkqjdqpdddp
+F-H0-4047 2 jcdppqdjqkddpd
+F-H0-4048 2 cipdkqjdqpdddp
+F-H0-4049 16 lolqnqpplpkpdppjddpd
+F-H0-4050 7 mdppdppjldpdddkdnclc
+F-H0-4051 10 pjdqppdepd
+F-H0-4052 7 popqdppedd
+F-H0-4053 3 pnpqdppedd
+F-H0-4054 2 jcdqppdepd
+F-H0-4055 2 cpqppdepdd
+F-H0-4056 2 cfdoppdcpd
+F-H0-4057 18 ppeopd
+F-H0-4058 9 pqeopd
+F-H0-4059 3 qpeopd
+F-H0-4060 2 opeopd
+F-H0-4061 2 oqeopd
+F-H0-4062 12 opdppedc
+F-H0-4063 7 ddpqdopd
+F-H0-4064 6 edpdepcd
+F-H0-4065 4 dcpqdopd
+F-H0-4066 4 pgppdppfqfpddficddfcccdb
+F-H0-4067 28 pnpqdpqppoqoqnddpd
+F-H0-4068 7 pmpqdpqppoqoqnddpd
+F-H0-4069 8 eqeppppdcpddjc
+F-H0-4070 4 mqopqppddpddjc
+F-H0-4071 3 pnopqppddpddjc
+F-H0-4072 2 pldppqpocjddpd
+F-H0-4073 2 oodppqpocjddpd
+F-H0-4074 19 cidpppcdcfdcpd
+F-H0-4075 11 djdpppcdcfdcpd
+F-H0-4076 37 cddpppcfcededcpd
+F-H0-4077 30 qpdppqpofqqnqoddpd
+F-H0-4078 11 eppqpocpddpd
+F-H0-4079 7 pfpqdpqdoddd
+F-H0-4080 7 qfpqpocpddpd
+F-H0-4081 5 qopqdpqdoddd
+F-H0-4082 5 qcpqdpqdoddd
+F-H0-4083 12 popqdpfqdnjpdcpd
+F-H0-4084 11 qnpqdpfqdnjpdcpd
+F-H0-4085 4 ncpqdpfqdnjpdcpd
+F-H0-4086 3 pnpqdpfqdnjpdcpd
+F-H0-4087 2 cipqdpfqdnjpdcpd
+F-H0-4088 2 qopqdpfqdnjpdcpd
+F-H0-4089 33 eoppdqgpdldoddpc
+F-H0-4090 3 ofppqdcpldpgddod
+F-H0-4091 12 nppqnqoqopqppddpddqf
+F-H0-4092 12 mppqnqoqopqppddpddqf
+F-H0-4093 4 ncpqdpfqpoqpqnqoddpd
+F-H0-4094 3 hqpqdpfqpoqpqnqoddpd
+F-H0-4095 3 cnpqdpfqpoqpqnqoddpd
+F-H0-4096 13 cnppdqcjdcpd
+F-H0-4097 9 fcdppqqjpcdd
+F-H0-4098 4 qjppdqcjdcpd
+F-H0-4099 3 coppdqcjdcpd
+F-H0-4100 2 qnppdqcjdcpd
+F-H0-4101 2 clppdqcjdcpd
+F-H0-4102 12 cdppdpecpd
+F-H0-4103 7 nqppdpecpd
+F-H0-4104 6 cfoqdpddpd
+F-H0-4105 5 opqodpddpd
+F-H0-4106 3 ppoqdpddpd
+F-H0-4107 15 pppqmpjpdpqkddpd
+F-H0-4108 9 popqmpjpdpqkddpd
+F-H0-4109 7 oopqmpjpdpqkddpd
+F-H0-4110 2 hqpqmpjpdpqkddpd
+F-H0-4111 2 dldjpppddpcddgic
+F-H0-4112 14 cfqdddfc
+F-H0-4113 7 ppqdddfc
+F-H0-4114 3 dfqdddfc
+F-H0-4115 3 idqdddfc
+F-H0-4116 3 hcqdddfc
+F-H0-4117 2 dpqdddfc
+F-H0-4118 2 ndqdddfc
+F-H0-4119 2 peqnpppc
+F-H0-4120 7 qpoqdppedd
+F-H0-4121 3 pjeqppdepd
+F-H0-4122 2 pjoppdcodd
+F-H0-4123 2 ckeqppdepd
+F-H0-4124 2 doeqppdepd
+F-H0-4125 24 rppqdpfqqnipcnpoddpd
+F-H0-4126 4 qkpqdpfqqnipcnpoddpd
+F-H0-4127 2 pnpqdpfqqnipcnpoddpd
+F-H0-4128 23 opnqqppddpcdpjncqf
+F-H0-4129 10 qpdppqqnfqcnjpdcpd
+F-H0-4130 15 onqpoplpdpddpd
+F-H0-4131 9 pmqpoplpdpddpd
+F-H0-4132 3 nppqdpplpoddpd
+F-H0-4133 3 ecppdpdhdedcpd
+F-H0-4134 20 qcqhqppdcpjdqfdd
+F-H0-4135 11 ofqhqppdcpjdqfdd
+F-H0-4136 2 qfppdqpjncpddclc
+F-H0-4137 2 hphqpqdpfqdjpcdd
+F-H0-4138 9 cfqpcndppdcldc
+F-H0-4139 8 nolqnqppcppcdd
+F-H0-4140 7 cqhqfqdpqpdcpd
+F-H0-4141 5 oqhqfqdpqpdcpd
+F-H0-4142 3 cnhqfqdpqpdcpd
+F-H0-4143 30 dqpqhqfqdpcqdcpd
+F-H0-4144 2 cppqhqfqdpcqdcpd
+F-H0-4145 11 plcppqpoepdcpd
+F-H0-4146 7 pnopqpcddppcpe
+F-H0-4147 6 oocppqpoepdcpd
+F-H0-4148 6 ecdqdoqppdedcd
+F-H0-4149 2 dncppqpoepdcpd
+F-H0-4150 2 pmcppqpoepdcpd
+F-H0-4151 12 qlcqdrdpiqqnfqcnppddpd
+F-H0-4152 10 npcqdrdpiqqnfqcnppddpd
+F-H0-4153 4 pidpppqfpdcficddfcccdb
+F-H0-4154 2 qedpppqfpdcficddfcccdb
+F-H0-4155 2 pfdpppqfpdcficddfcccdb
+F-H0-4156 2 obqqrpnqqnppqkdppdncdd
+F-H0-4157 15 pmdppqqnfqonqpcnjpqkqiddpd
+F-H0-4158 11 dgfqcnppdjdppdfecdickcfcdc
+F-H0-4159 3 fqdpppqiqkqfqdofjdcfpcddfc
+F-H0-4160 2 dniqkqfqdqfopppdcpdddjfccf
+F-H0-4161 10 dppjpdjj
+F-H0-4162 9 dpjjddjd
+F-H0-4163 8 ppjpdpjj
+F-H0-4164 4 qpjjdpdj
+F-H0-4165 3 jdpjpdjj
+F-H0-4166 13 qnppnqpjdqpdddjd
+F-H0-4167 6 jdppdpjpncpjdcpd
+F-H0-4168 5 efpjpppdcpjdcfdd
+F-H0-4169 4 hqppdpjpncpjdcpd
+F-H0-4170 3 pfppdpjpncpjdcpd
+F-H0-4171 2 qqppdpjpncpjdcpd
+F-H0-4172 2 dkppnqpjdqpdddjd
+F-H0-4173 18 dpopddod
+F-H0-4174 9 dcopdpod
+F-H0-4175 2 edopdpod
+F-H0-4176 2 jqpodddo
+F-H0-4177 19 fqpqdpcnddpd
+F-H0-4178 5 clpqdpcnddpd
+F-H0-4179 3 npdqppqnpddd
+F-H0-4180 2 cjpqdpcnddpd
+F-H0-4181 2 ipfqpppddpcd
+F-H0-4182 2 popqdpcnddpd
+F-H0-4183 10 clcnqpqddpdc
+F-H0-4184 6 cfpqdqqdddfc
+F-H0-4185 4 fpcnqpqddpdc
+F-H0-4186 4 idpqdqqdddfc
+F-H0-4187 3 odpqdqqdddfc
+F-H0-4188 19 golqnqkqdqjqkphqjpppiplpnopnlopjddpd
+F-H0-4189 3 pgqlqpqjdpqipkqhpjphpipdohndqfjdofdd
+F-H0-4190 3 plqlqpqjdpqipkqhpjphpipdohndqfjdofdd
+F-H0-4191 2 mfqlqpqjdpqipkqhpjphpipdohndqfjdofdd
+F-H0-4192 2 meppdppjnepflepdkdldjdlcidkcncjcdchc
+F-H0-4193 11 qopqpccp
+F-H0-4194 8 dcqpcppc
+F-H0-4195 6 odpqcdqd
+F-H0-4196 6 dpcdpqpc
+F-H0-4197 17 fcerdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnddpd
+F-H0-4198 10 kqerdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnddpd
+F-H0-4199 9 jqerdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnddpd
+F-H0-4200 17 nqppdppjpdqfncdd
+F-H0-4201 6 fqdppppdcfjdddfc
+F-H0-4202 4 djnqppjpqndpddpd
+F-H0-4203 2 cffqdpppcnjppddd
+F-H0-4204 17 opqpdpecpd
+F-H0-4205 7 pqqodpdcpd
+F-H0-4206 6 ceqodpdcpd
+F-H0-4207 3 opqodpdcpd
+F-H0-4208 2 jjqpdpecpd
+F-H0-4209 12 qqlqnqppdppjddmeqcqdpcpdncodnblc
+F-H0-4210 11 nolqnqppdppjddmeqcqdpcpdncodnblc
+F-H0-4211 9 qnlqnqppdppjddmeqcqdpcpdncodnblc
+F-H0-4212 27 fqeqeppppdcp
+F-H0-4213 6 ppoqopqpdddp
+F-H0-4214 10 jpmppqdppkdcpd
+F-H0-4215 7 kpmppqdppkdcpd
+F-H0-4216 7 pomppqdppkdcpd
+F-H0-4217 5 opmppqdppkdcpd
+F-H0-4218 9 hpeqcpppdcpd
+F-H0-4219 7 iqeqcpppdcpd
+F-H0-4220 5 doeqcpppdcpd
+F-H0-4221 4 qmqopqpdcpdd
+F-H0-4222 3 gpeqcpppdcpd
+F-H0-4223 3 dkcodqpdqpdd
+F-H0-4224 2 qfppdqpdcdec
+F-H0-4225 2 hqeqcpppdcpd
+F-H0-4226 2 dfppdqpdcdec
+F-H0-4227 23 npqnpponcppdpkdd
+F-H0-4228 2 cnfqipppdpfodcpd
+F-H0-4229 6 cidpqpcedcpd
+F-H0-4230 6 lpoqqpdpdcpd
+F-H0-4231 6 pooqqpdpdcpd
+F-H0-4232 2 ceoqqpdpdcpd
+F-H0-4233 2 mqoqqpdpdcpd
+F-H0-4234 2 didpqpcedcpd
+F-H0-4235 22 cnfqeqfpdqepppddcp
+F-H0-4236 2 opdppqpoqpqnqopnpd
+F-H0-4237 24 phogqppfdpofpgoeqfpdqejdpeddqdpc
+F-H0-4238 10 cqdqcpppdojpcodpcneodmenpddncdem
+F-H0-4239 5 edcdpepc
+F-H0-4240 3 pfpqodqd
+F-H0-4241 2 qepqodqd
+F-H0-4242 2 mdcdpepc
+F-H0-4243 2 qeqpoppc
+F-H0-4244 17 ddoqdpod
+F-H0-4245 10 dcoqdpod
+F-H0-4246 4 ecoqdpod
+F-H0-4247 3 edoqdpod
+F-H0-4248 2 qpoqdpod
+F-H0-4249 11 jpmppqdpqkdcpd
+F-H0-4250 10 pomppqdpqkdcpd
+F-H0-4251 8 pkpmkqpdqpcddp
+F-H0-4252 22 hedpppdhfefcdedcpd
+F-H0-4253 10 qcppdpphpepcnencdd
+F-H0-4254 2 dkdpppdhfefcdedcpd
+F-H0-4255 12 cjpdqpcddpec
+F-H0-4256 8 kqpqdpqodcpd
+F-H0-4257 5 fqdppqcepddc
+F-H0-4258 3 qjpqdpqodcpd
+F-H0-4259 3 jppqdpqodcpd
+F-H0-4260 2 dipqdpqodcpd
+F-H0-4261 21 epppdqdoeoenddpd
+F-H0-4262 10 foppdqdoeoenddpd
+F-H0-4263 6 podcod
+F-H0-4264 6 opdcod
+F-H0-4265 4 oqdcod
+F-H0-4266 3 epqppe
+F-H0-4267 2 deqdpo
+F-H0-4268 2 dpqdpo
+F-H0-4269 2 codcod
+F-H0-4270 2 pqdcod
+F-H0-4271 2 rerdqfpdlcnc
+F-H0-4272 12 pfndpd
+F-H0-4273 3 qfpfpd
+F-H0-4274 2 ddpfpd
+F-H0-4275 2 pppfpd
+F-H0-4276 11 pqcdcp
+F-H0-4277 5 dqpcdc
+F-H0-4278 5 ppdcpc
+F-H0-4279 4 dpqpqd
+F-H0-4280 3 cpqpqd
+F-H0-4281 3 dqqpqd
+F-H0-4282 32 cphqpqdqfqdpcqdcpd
+F-H0-4283 13 cnfqeqfpdqepcp
+F-H0-4284 16 neppdppjddpdnckd
+F-H0-4285 10 qcppdppjddpdnckd
+F-H0-4286 7 qnppnqkpdppjddpd
+F-H0-4287 2 leppdppjddpdnckd
+F-H0-4288 19 cpppdpcoddpc
+F-H0-4289 3 doppdpcoddpc
+F-H0-4290 26 dopqhqfqdqcqdpcpdcpd
+F-H0-4291 4 rcqpqhdpqdqfpdqccdpc
+F-H0-4292 31 ppopqppolppndppdoodd
+F-H0-4293 14 ddeqcpqppd
+F-H0-4294 5 qpcodqdcpd
+F-H0-4295 4 dlcodqdcpd
+F-H0-4296 3 pecddpocqd
+F-H0-4297 2 npeqcpqppd
+F-H0-4298 10 hpepqppdcpcd
+F-H0-4299 9 ecppqdcpcded
+F-H0-4300 6 cmpqdqdodcpd
+F-H0-4301 2 dmpqdqdodcpd
+F-H0-4302 2 dnepqppdcpcd
+F-H0-4303 16 ofpipppdcpddqf
+F-H0-4304 9 qcpipppdcpddqf
+F-H0-4305 4 qnppnqkpdppddc
+F-H0-4306 3 dfdppqidpdddfc
+F-H0-4307 9 nonqoqnpqpoooppddpdd
+F-H0-4308 4 epppdqeododncocnddpd
+F-H0-4309 9 cjdpppfddfdcpd
+F-H0-4310 2 pjdqppfpdnddpd
+F-H0-4311 2 nqppfpcppddndd
+F-H0-4312 12 dpeepppd
+F-H0-4313 5 dqooddpd
+F-H0-4314 2 cqooddpd
+F-H0-4315 19 nqppdpqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-4316 6 qlqnnqpjppmedpqdqcpdpcodncddnblc
+F-H0-4317 3 qfpqqqfqqpppdpjprnpoqnomcnqlddpd
+F-H0-4318 3 jpppdpqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-4319 33 dqbqcqppepcppddnddcf
+F-H0-4320 11 nephppddpepc
+F-H0-4321 8 pgppodqdddld
+F-H0-4322 5 qoqpoplpdppd
+F-H0-4323 2 ppdhdppddedc
+F-H0-4324 2 pnqpoplpdppd
+F-H0-4325 15 ccdpppcfpdddfchcdb
+F-H0-4326 6 ofqhpppddpddqfncrd
+F-H0-4327 2 dhchpppddpddcffcbd
+F-H0-4328 16 fcoqdpcfddpd
+F-H0-4329 7 dioqdpcfddpd
+F-H0-4330 6 choqdpcfddpd
+F-H0-4331 3 fdoqdpcfddpd
+F-H0-4332 2 pooqdpcfddpd
+F-H0-4333 2 gcoqdpcfddpd
+F-H0-4334 23 poqpoplppndppdoodd
+F-H0-4335 32 bodqbqcqppepcppddnddcf
+F-H0-4336 5 qfncppdcpd
+F-H0-4337 4 pfncppdcpd
+F-H0-4338 4 dpncppdcpd
+F-H0-4339 2 jdpcdpfcdd
+F-H0-4340 2 qhqppdqfdd
+F-H0-4341 2 piqppdqfdd
+F-H0-4342 20 ppijpd
+F-H0-4343 5 ppjkpd
+F-H0-4344 2 dpijpd
+F-H0-4345 2 pjijpd
+F-H0-4346 28 qfoqdpqpqjqldcpd
+F-H0-4347 5 qgoqdpqpqjqldcpd
+F-H0-4348 15 npqpoppppolppndppdoodd
+F-H0-4349 7 efdpppdhdeeepdddfddced
+F-H0-4350 3 oqqpoppppolppndppdoodd
+F-H0-4351 24 qonppqdppdpodd
+F-H0-4352 6 nqnppqdppdpodd
+F-H0-4353 2 cnnppqdppdpodd
+F-H0-4354 8 jpdpfqcnopddpd
+F-H0-4355 7 drdpfqcnopddpd
+F-H0-4356 5 ipdpfqcnopddpd
+F-H0-4357 4 jqdpfqcnopddpd
+F-H0-4358 2 iqdpfqcnopddpd
+F-H0-4359 34 bqcqppepcppddnddcf
+F-H0-4360 27 mpppnqnpdppjdcpd
+F-H0-4361 11 oqdpqpddqc
+F-H0-4362 6 fcdpqqddqd
+F-H0-4363 12 qfdppqdnfqddjpncpd
+F-H0-4364 10 pfdppqdnfqddjpncpd
+F-H0-4365 5 lcdppqdnfqddjpncpd
+F-H0-4366 2 kddppqdnfqddjpncpd
+F-H0-4367 25 fnppcqhpepcpdpeofocodmenpdcndd
+F-H0-4368 3 bddpppdheffedeeepdfcgdecdddccc
+F-H0-4369 3 cfdpppdheffedeeepdfcgdecdddccc
+F-H0-4370 2 mdqfppofdpqepgoeneqdpdldodddqc
+F-H0-4371 32 emcqdqcpppcnjpbndppddocdcl
+F-H0-4372 2 dfppchcpdecfpdbfjdcdddccdc
+F-H0-4373 4 olqnpppmjppldppdpnddom
+F-H0-4374 2 efppegdpdfdhpddgjdcfdd
+F-H0-4375 31 ohqippqhdpphpjpdpindqfjdofdd
+F-H0-4376 13 mqerdrhqcreqpqdqfqdpcqqocpdocnddpd
+F-H0-4377 9 plerdrhqcreqpqdqfqdpcqqocpdocnddpd
+F-H0-4378 4 qmerdrhqcreqpqdqfqdpcqqocpdocnddpd
+F-H0-4379 3 operdrhqcreqpqdqfqdpcqqocpdocnddpd
+F-H0-4380 3 nperdrhqcreqpqdqfqdpcqqocpdocnddpd
+F-H0-4381 2 qkerdrhqcreqpqdqfqdpcqqocpdocnddpd
+F-H0-4382 12 ncppdopjedpd
+F-H0-4383 6 ncppeppjdepd
+F-H0-4384 3 jpppdopjedpd
+F-H0-4385 2 cdppdopjedpd
+F-H0-4386 18 gdqeqpcddppcedecfcdc
+F-H0-4387 11 dfeqpqcpcfcedecdpddc
+F-H0-4388 6 rdpqdpqppoqoqnqddcoc
+F-H0-4389 11 qoqdpqdccp
+F-H0-4390 8 eddqqpcdpc
+F-H0-4391 5 eqcppqdcqd
+F-H0-4392 2 odcppqdcqd
+F-H0-4393 17 nomqopqpdpddpd
+F-H0-4394 10 qqmqopqpdpddpd
+F-H0-4395 5 ropqdpqmpoddpd
+F-H0-4396 10 eoppeepd
+F-H0-4397 3 dnpdoodd
+F-H0-4398 3 deppeopd
+F-H0-4399 2 dqppeepd
+F-H0-4400 2 dfppeopd
+F-H0-4401 2 ddppeopd
+F-H0-4402 15 cccipppddpddcf
+F-H0-4403 11 ofqipppddpddqf
+F-H0-4404 3 nqppqndppdqkdd
+F-H0-4405 29 dcqpqedpcdedpcfcec
+F-H0-4406 18 qodppqpnfqcnjpddpd
+F-H0-4407 4 npdppqpnfqcnjpddpd
+F-H0-4408 4 qpdppqpnfqcnjpddpd
+F-H0-4409 4 qldppqpnfqcnjpddpd
+F-H0-4410 3 eefqcnppdjdppdfdcd
+F-H0-4411 2 pkdppqpnfqcnjpddpd
+F-H0-4412 2 ondppqpnfqcnjpddpd
+F-H0-4413 13 jddpppdipjdcpd
+F-H0-4414 5 mppqdppkdjpddd
+F-H0-4415 5 fqdpppdipjdcpd
+F-H0-4416 3 pjpppdipjdcpdd
+F-H0-4417 2 jjdpppdipjdcpd
+F-H0-4418 26 jpeqfqdqppcpfpcnepdcpd
+F-H0-4419 6 jqeqfqdqppcpfpcnepdcpd
+F-H0-4420 3 difqdodqdnqpcncppdcodd
+F-H0-4421 28 hoiqfqhqpphpjpdpipdnfoddpd
+F-H0-4422 7 cepqdqdedcpd
+F-H0-4423 7 pldppqpopcdc
+F-H0-4424 3 fdpqdqdedcpd
+F-H0-4425 3 eepqdqdedcpd
+F-H0-4426 3 ecopqppdcpcd
+F-H0-4427 3 mqopqppdcpcd
+F-H0-4428 2 copqdqdedcpd
+F-H0-4429 24 qjnqdpqpdcpd
+F-H0-4430 4 ncnqdpqpdcpd
+F-H0-4431 4 iqdqqdppddcn
+F-H0-4432 2 pjppdqqdddnc
+F-H0-4433 19 ocppcedppdmchcjcdc
+F-H0-4434 8 mqdpppqmqhqjqdddoc
+F-H0-4435 35 endqppeogpdldoddpc
+F-H0-4436 25 hqbqdqppcqcpepbopddnddcf
+F-H0-4437 6 kqrqqqqppqdpopropdpnddqf
+F-H0-4438 28 cpppeqdoddpd
+F-H0-4439 14 pldppqpofqcnipddpd
+F-H0-4440 10 oodppqpofqcnipddpd
+F-H0-4441 3 qodppqpofqcnipddpd
+F-H0-4442 3 pmdppqpofqcnipddpd
+F-H0-4443 2 npdppqpofqcnipddpd
+F-H0-4444 12 pqqodppddd
+F-H0-4445 10 jdeqpdppdd
+F-H0-4446 5 eddpppcepd
+F-H0-4447 2 jddpppcepd
+F-H0-4448 9 pmppqnpn
+F-H0-4449 2 pepfqfpd
+F-H0-4450 13 dcdppqdepd
+F-H0-4451 13 fqdppqdepd
+F-H0-4452 2 qkdppqdepd
+F-H0-4453 2 qodppqdepd
+F-H0-4454 2 pkdppqdepd
+F-H0-4455 10 pqpodpddpd
+F-H0-4456 9 nqppdpedpd
+F-H0-4457 6 qnppdpedpd
+F-H0-4458 2 cjeppppddd
+F-H0-4459 7 monqppmpnpdppjdcpd
+F-H0-4460 4 encnppdmjpqddpdddn
+F-H0-4461 7 qjpqdpnqpoqpqnqopnpd
+F-H0-4462 6 jpeqfqdqfpppepcpddcn
+F-H0-4463 3 qfpqdpnqpoqpqnqopnpd
+F-H0-4464 2 npeqfqdqfpppepcpddcn
+F-H0-4465 17 jpdppqdjpkddpd
+F-H0-4466 7 fqdppqdjpkddpd
+F-H0-4467 3 jddppqdjpkddpd
+F-H0-4468 2 fcdppqdjpkddpd
+F-H0-4469 9 popqpddpdc
+F-H0-4470 8 fqdpqpcdpd
+F-H0-4471 8 cepqpddpdc
+F-H0-4472 3 nccpppddqd
+F-H0-4473 2 eqcpppddqd
+F-H0-4474 13 popqmpkpdpqkddpd
+F-H0-4475 7 oopqmpkpdpqkddpd
+F-H0-4476 7 pppqmpkpdpqkddpd
+F-H0-4477 10 dcpnpqpddp
+F-H0-4478 8 ddnpqpdppd
+F-H0-4479 4 dcnpqpdppd
+F-H0-4480 4 oqnpqpdppd
+F-H0-4481 3 pnnpqpdppd
+F-H0-4482 2 pmnpqpdppd
+F-H0-4483 2 lqnpqpdppd
+F-H0-4484 30 emcqdqcpppcnjpbndpqddoddcl
+F-H0-4485 13 cnopfqdpqpdcpd
+F-H0-4486 10 mqopfqdpqpdcpd
+F-H0-4487 8 lpopfqdpqpdcpd
+F-H0-4488 2 qhppqncpddpepc
+F-H0-4489 9 plcqiripdrdppqpofqdnfoddpd
+F-H0-4490 5 qmcqiripdrdppqpofqdnfoddpd
+F-H0-4491 5 qocqiripdrdppqpofqdnfoddpd
+F-H0-4492 4 npcqiripdrdppqpofqdnfoddpd
+F-H0-4493 4 oocqiripdrdppqpofqdnfoddpd
+F-H0-4494 12 fpnqhqfqdpqpddpd
+F-H0-4495 7 kqnqhqfqdpqpddpd
+F-H0-4496 6 qjnqhqfqdpqpddpd
+F-H0-4497 4 eqnqhqfqdpqpddpd
+F-H0-4498 2 dnnqhqfqdpqpddpd
+F-H0-4499 9 jpcqfqppeqgpdqdpgobpfodoeofndlenddpd
+F-H0-4500 8 ncppdpffdhefgedefepdeegdfcddecbddccc
+F-H0-4501 7 cidrppcqhpepcpdpeofocofnendmcnpdemdd
+F-H0-4502 5 jcppdpffdhefgedefepdeegdfcddecbddccc
+F-H0-4503 4 jdqfodqdndpcncoc
+F-H0-4504 3 ppeqfqdqfpcpepcn
+F-H0-4505 2 qoqeqfqdpfpcpenc
+F-H0-4506 2 icqfodqdndpcncoc
+F-H0-4507 2 lcqeqfqdpfpcpenc
+F-H0-4508 2 jcqfodqdndpcncoc
+F-H0-4509 11 pfqdod
+F-H0-4510 5 qeqdod
+F-H0-4511 2 pgqdod
+F-H0-4512 20 podppqqnfqdnjpddpd
+F-H0-4513 8 qpdppqqnfqdnjpddpd
+F-H0-4514 2 cnppqnnppjdpqdncdd
+F-H0-4515 2 pkdppqqnfqdnjpddpd
+F-H0-4516 29 ncqdppdddppcpdocodmcqc
+F-H0-4517 8 efdjppqddpddcf
+F-H0-4518 4 dhqpcndppddjdd
+F-H0-4519 3 qcpjpppddpcdqf
+F-H0-4520 3 cnjpfqdpppdcpd
+F-H0-4521 2 dnjpfqdpppdcpd
+F-H0-4522 7 qlqnpppdjpjddpdd
+F-H0-4523 6 dfppdppjdjpdddfc
+F-H0-4524 5 jpppdppjdjpdddfc
+F-H0-4525 4 pkqnpppdjpjddpdd
+F-H0-4526 3 qfcnpppdjpjddpdd
+F-H0-4527 2 npnqppdppjdjpddd
+F-H0-4528 2 jpfqdpppdjpjddpd
+F-H0-4529 15 jpdpppjdpjncpfdcpd
+F-H0-4530 6 qnpppdcpjddjfdcfdd
+F-H0-4531 4 cfdpppjdpjncpfdcpd
+F-H0-4532 2 opqppddpndpjjdqfdd
+F-H0-4533 10 pkppqnnponcppdqldd
+F-H0-4534 5 rpppqnnponcppdqldd
+F-H0-4535 3 mfqhpppddpndqfcdof
+F-H0-4536 17 fppqjqqodpcnddpd
+F-H0-4537 4 lcoqqjqppddpddnc
+F-H0-4538 3 pidpppqfpdcejcdc
+F-H0-4539 2 fcppdpcfddqejcpc
+F-H0-4540 2 dnpqjqqodpcnddpd
+F-H0-4541 21 phqpqidpqhpjpdpindqfjdofdd
+F-H0-4542 2 jqnqlqdqkqkpppjppnnopjddpd
+F-H0-4543 12 qqfqdpppqnjpdnqlddpd
+F-H0-4544 5 ofppdpqhqfpddfjdddfc
+F-H0-4545 3 plfqdpppqnjpdnqlddpd
+F-H0-4546 2 nqfqdpppqnjpdnqlddpd
+F-H0-4547 5 qodppqpnqd
+F-H0-4548 3 cddppqpnqd
+F-H0-4549 2 qpdppqpnqd
+F-H0-4550 2 dddppqpnqd
+F-H0-4551 26 cfpqdpcededcpd
+F-H0-4552 4 ddpqdpcededcpd
+F-H0-4553 10 pfdpfqddppncpd
+F-H0-4554 6 qnppnqpddpfcdd
+F-H0-4555 4 qfdpfqddppncpd
+F-H0-4556 4 chppqndppdcfdd
+F-H0-4557 10 fqdpoqddqe
+F-H0-4558 7 qnppcedpoc
+F-H0-4559 3 cjdpoqddqe
+F-H0-4560 2 dnpdeqddqo
+F-H0-4561 21 jjjpppdppjdjpdddjd
+F-H0-4562 7 fqdpppdjjpjdpjddpd
+F-H0-4563 3 fpdpppdjjpjdpjddpd
+F-H0-4564 15 efdppqcgdedcpd
+F-H0-4565 12 qcppdqqgpepcdd
+F-H0-4566 4 obqdppddcpmcod
+F-H0-4567 22 jplqnqkqdqppkppnnopjddpd
+F-H0-4568 9 pldppqpoqdddnc
+F-H0-4569 8 ocppcfdpqdoddc
+F-H0-4570 4 qmdppqpoqdddnc
+F-H0-4571 2 nddpnqpeqpddpc
+F-H0-4572 32 foppdqgpeododlenddpc
+F-H0-4573 29 pjppqnnponjpoldppkqlpdplddqk
+F-H0-4574 13 ncppdpjpjdpjddpd
+F-H0-4575 4 jdppdjjppddpddpj
+F-H0-4576 3 jjppdpjpjdpjddpd
+F-H0-4577 2 hqppdpjpjdpjddpd
+F-H0-4578 2 gcppjppjdppdddjd
+F-H0-4579 9 qqpprpnpqndppdqldd
+F-H0-4580 5 ofqhpppddpndqfddrd
+F-H0-4581 31 dpdqppfogpeododlenddpc
+F-H0-4582 4 ccdppqdheffedeeepddcgd
+F-H0-4583 8 qkdpkqcnfqqjqpdcpd
+F-H0-4584 8 pkdpkqcnfqqjqpdcpd
+F-H0-4585 5 qgdpkqcnfqqjqpdcpd
+F-H0-4586 4 qldpkqcnfqqjqpdcpd
+F-H0-4587 3 qfdpkqcnfqqjqpdcpd
+F-H0-4588 2 qldqppqjqdcfkcddfc
+F-H0-4589 12 djqhqpogdpperfpdqfjdqdddqcpc
+F-H0-4590 11 qndqcqppcpjpcndpbndopdemcdcl
+F-H0-4591 12 qndqcqppcpjpcndpbndoqdemddcl
+F-H0-4592 9 jdlqnrqpqqpppqopnqmodppjdcpd
+F-H0-4593 5 kdlqnrqpqqpppqopnqmodppjdcpd
+F-H0-4594 2 pkdppqdjpdgefceddcddcccdfbhc
+F-H0-4595 12 dhoqdpdedcpd
+F-H0-4596 10 ceoqdpdedcpd
+F-H0-4597 3 cgoqdpdedcpd
+F-H0-4598 3 fdoqdpdedcpd
+F-H0-4599 16 qonppqpodpddpd
+F-H0-4600 4 fcppdpdepdfddc
+F-H0-4601 4 fcopqppndpddpd
+F-H0-4602 12 pldppqpofqcnjpddpd
+F-H0-4603 4 oodppqpofqcnjpddpd
+F-H0-4604 4 mpopqppddpddpjncqf
+F-H0-4605 3 npdppqpofqcnjpddpd
+F-H0-4606 3 ecfqcnppdjdppdedcd
+F-H0-4607 30 coeqppcpdoddpd
+F-H0-4608 14 qiqpqhdppdpindqfddof
+F-H0-4609 10 hppqhqfqdpipdnfoddpd
+F-H0-4610 4 qeqpqhdppdpindqfddof
+F-H0-4611 12 ckppdqddcffcpd
+F-H0-4612 7 dbppdpcfqdddfc
+F-H0-4613 3 jdppdpcfqdddfc
+F-H0-4614 2 cfppnqqncpddpd
+F-H0-4615 15 ppij
+F-H0-4616 5 pdkj
+F-H0-4617 3 kjij
+F-H0-4618 2 cdjk
+F-H0-4619 15 oqopqpdppdpndd
+F-H0-4620 10 qfpfppoddpddqd
+F-H0-4621 2 eddpppdepdfddc
+F-H0-4622 2 fqopqpdppdpndd
+F-H0-4623 24 bqcqppephppdcpdd
+F-H0-4624 7 eqepqppdcpdc
+F-H0-4625 6 opqpdqdodcpd
+F-H0-4626 5 dlqpdqdodcpd
+F-H0-4627 3 eoqpdqdodcpd
+F-H0-4628 3 oqqpdqdodcpd
+F-H0-4629 2 dnepqppdcpdc
+F-H0-4630 2 dmqpdqdodcpd
+F-H0-4631 2 cmqpdqdodcpd
+F-H0-4632 21 ndppqddpddpdpcodocqcmcnc
+F-H0-4633 4 rfdpppqfqgpeqepdqdddpcqc
+F-H0-4634 7 edqpoqpddpcd
+F-H0-4635 5 ecqpoqpddpcd
+F-H0-4636 5 fdqpoqpddpcd
+F-H0-4637 5 poqpoqpddpcd
+F-H0-4638 4 pnqpoqpddpcd
+F-H0-4639 3 qlqpoqpddpcd
+F-H0-4640 2 fcqpoqpddpcd
+F-H0-4641 10 eoppdpdocpcoddpc
+F-H0-4642 9 epppdpdocpcoddpc
+F-H0-4643 3 boppdpdocpcoddpc
+F-H0-4644 6 monqoqnpqpooopondppdnodd
+F-H0-4645 2 bfppdpdfefcfdefeceeedcpd
+F-H0-4646 2 ffppdpdfefcfdefeceeedcpd
+F-H0-4647 15 popqoccpdcqd
+F-H0-4648 11 qopqoccpdcqd
+F-H0-4649 2 pepqoccpdcqd
+F-H0-4650 7 ppiccffcdddbcc
+F-H0-4651 6 ddqipdqfqcrdnc
+F-H0-4652 3 cdqipdqfqcrdnc
+F-H0-4653 2 pjncqfkcpdpbqc
+F-H0-4654 9 cfpppdfcdd
+F-H0-4655 6 lcdppdncdd
+F-H0-4656 3 pfdppdncdd
+F-H0-4657 3 dddpppqfpd
+F-H0-4658 2 pfdpppqfpd
+F-H0-4659 2 pqdppdncdd
+F-H0-4660 3 ofppdppfpgqeqfpddficddfcccdb
+F-H0-4661 11 dnpqeqcpddpd
+F-H0-4662 8 popqeqcpddpd
+F-H0-4663 2 iqpqeqcpddpd
+F-H0-4664 2 qopqeqcpddpd
+F-H0-4665 2 gdppcecppddc
+F-H0-4666 2 qgppdppfpgqeqfpeofpddficddfcccdb
+F-H0-4667 13 onqpoqlpdpcdpd
+F-H0-4668 4 pnpqdpplqodcpd
+F-H0-4669 15 nomqopdqpdqpddco
+F-H0-4670 12 qcoqdpqppeqgddpc
+F-H0-4671 2 ropqdpqmpoqdddoc
+F-H0-4672 15 ceqpdqdcpd
+F-H0-4673 11 opqpcpdcpd
+F-H0-4674 3 popqdpcdqd
+F-H0-4675 26 nqdppqpoqpqnqopnddpd
+F-H0-4676 3 eddpppdfcecfcddedcpd
+F-H0-4677 18 qqpqdpnppopd
+F-H0-4678 2 cdqpopdppdpn
+F-H0-4679 26 eqdrercrhqpqdqfqdpcqdocpdcpd
+F-H0-4680 27 crerdrhqpqdqfqdpcqdocpdcpd
+F-H0-4681 21 bpppeqdocpcoddpd
+F-H0-4682 6 ddppdpdecdceecpd
+F-H0-4683 13 dncpeqpdqpdd
+F-H0-4684 5 epdqcoppdcpd
+F-H0-4685 4 cfcpeqpdqpdd
+F-H0-4686 3 ncdqcoppdcpd
+F-H0-4687 2 gpdqcoppdcpd
+F-H0-4688 11 peppdqcfdecdddpchcfcecccdcdbebcb
+F-H0-4689 3 kqdrercrhqpqeqfqdqcqdpcpdocndcpd
+F-H0-4690 3 qodrercrhqpqeqfqdqcqdpcpdocndcpd
+F-H0-4691 2 ncdrercrhqpqeqfqdqcqdpcpdocndcpd
+F-H0-4692 2 nqdrercrhqpqeqfqdqcqdpcpdocndcpd
+F-H0-4693 2 emdrercrhqpqeqfqdqcqdpcpdocndcpd
+F-H0-4694 12 dqbqcqppephppdcpdd
+F-H0-4695 12 qldqoqqjqpdcpd
+F-H0-4696 8 dodqppqjqddcoc
+F-H0-4697 4 dodqoqqjqpdcpd
+F-H0-4698 2 qgdqoqqjqpdcpd
+F-H0-4699 26 dqfqhqcqdpqpddpd
+F-H0-4700 5 dqcqppcndppdcldc
+F-H0-4701 27 cnerdrhqcreqpqdqfqdpcqdocpdcpd
+F-H0-4702 11 jpdpppjdpjdcpd
+F-H0-4703 6 fqdpppjdpjdcpd
+F-H0-4704 3 dedpppjdpjdcpd
+F-H0-4705 2 hppqdpjpdjpddd
+F-H0-4706 2 codqppjppjddpd
+F-H0-4707 18 ipdpoqcnfqddpd
+F-H0-4708 8 jpdpoqcnfqddpd
+F-H0-4709 32 fcdpppcdpdeced
+F-H0-4710 11 ncpqdppkecpd
+F-H0-4711 4 cpppeqpiddpc
+F-H0-4712 3 jppqdppkecpd
+F-H0-4713 3 mppqdppkecpd
+F-H0-4714 2 kppqdppkecpd
+F-H0-4715 2 qjqpcekppddp
+F-H0-4716 24 pqppoqnpnqooopnompmodppjddpd
+F-H0-4717 2 lpppoqnpnqooopnompmodppjddpd
+F-H0-4718 25 dqfqeqeppppdcp
+F-H0-4719 2 ropopqqnqoddpd
+F-H0-4720 26 erdrhqpqdqfqdpcqdocpdcpd
+F-H0-4721 27 drhqpqdqfqdpcqdocpdcpd
+F-H0-4722 8 nppqqodppddd
+F-H0-4723 4 cfqpoqpddpdd
+F-H0-4724 3 qlqpoqpddpdd
+F-H0-4725 3 pmqpoqpddpdd
+F-H0-4726 3 oppqqodppddd
+F-H0-4727 2 qnppdddpocqd
+F-H0-4728 12 ppdnpd
+F-H0-4729 5 pqfppd
+F-H0-4730 4 cdfppd
+F-H0-4731 2 ppfppd
+F-H0-4732 2 dpdnpd
+F-H0-4733 13 ddoodppd
+F-H0-4734 9 dcoodppd
+F-H0-4735 3 edoodppd
+F-H0-4736 2 ecoodppd
+F-H0-4737 25 dcppdppdcdedecfc
+F-H0-4738 17 dpoqddqe
+F-H0-4739 4 qdqodpoc
+F-H0-4740 4 qpqedpec
+F-H0-4741 2 coceppoc
+F-H0-4742 8 fdppdnpd
+F-H0-4743 11 fqdpqpedpd
+F-H0-4744 10 oqdpqpedpd
+F-H0-4745 2 kqdpqpedpd
+F-H0-4746 2 fcopdppdcd
+F-H0-4747 7 oooqppnqnpopnompmodppjddpd
+F-H0-4748 14 ofqhpppddpidqfcd
+F-H0-4749 8 qcqhpppddpidqfcd
+F-H0-4750 3 phqhpppddpidqfcd
+F-H0-4751 3 qfpqdppkddpdnclc
+F-H0-4752 2 pfpqdppkddpdnclc
+F-H0-4753 17 dppopddd
+F-H0-4754 6 cdeppppd
+F-H0-4755 2 nqppdpde
+F-H0-4756 7 lcdppqndqdddfc
+F-H0-4757 5 cfdppqndqdddfc
+F-H0-4758 2 pjppqndpcdpfpc
+F-H0-4759 2 ocdppqndqdddfc
+F-H0-4760 2 ndppqndpcdpfpc
+F-H0-4761 12 cqpdqqcd
+F-H0-4762 8 dppqccpd
+F-H0-4763 5 pcdpqqdc
+F-H0-4764 2 qopqccpd
+F-H0-4765 13 qfdppqcnfqddjpncpd
+F-H0-4766 11 pfdppqcnfqddjpncpd
+F-H0-4767 3 pifqcnppdjdppdqfcd
+F-H0-4768 9 fcpqdpcfddpd
+F-H0-4769 7 lqnqpppddpcd
+F-H0-4770 3 pnnqpppddpcd
+F-H0-4771 3 pjdpppqnpddc
+F-H0-4772 2 dipqdpcfddpd
+F-H0-4773 19 ohqiqpqhdpphpjpdpindqfjdofdd
+F-H0-4774 5 qpdodqpd
+F-H0-4775 4 ppepcppd
+F-H0-4776 4 eqepcppd
+F-H0-4777 3 cddodqpd
+F-H0-4778 3 oqepcppd
+F-H0-4779 3 phdppcpe
+F-H0-4780 2 odppdcde
+F-H0-4781 16 opdppqpofqonooddpd
+F-H0-4782 11 nodppqpofqonooddpd
+F-H0-4783 10 jpppdppjdjjjddpd
+F-H0-4784 4 ncppdppjdjjjddpd
+F-H0-4785 2 jlpppdjpjddpddjj
+F-H0-4786 2 jmpppdjpjddpddjj
+F-H0-4787 10 epcppqqddc
+F-H0-4788 8 ocpqcpdcqd
+F-H0-4789 6 cepqcpdcqd
+F-H0-4790 9 opdcpe
+F-H0-4791 4 codcpe
+F-H0-4792 4 dodcpe
+F-H0-4793 2 edqpod
+F-H0-4794 2 opqpod
+F-H0-4795 2 oqqpod
+F-H0-4796 3 ddhqfqdppd
+F-H0-4797 3 dhchppddcf
+F-H0-4798 3 cqdpcnclpd
+F-H0-4799 2 cdhqfqdppd
+F-H0-4800 2 pqhqfqdppd
+F-H0-4801 2 cnhqfqdppd
+F-H0-4802 2 fohqfqdppd
+F-H0-4803 2 pphqfqdppd
+F-H0-4804 7 djppjjdd
+F-H0-4805 6 qfdpjjpd
+F-H0-4806 4 ppdpjjpd
+F-H0-4807 3 podpjjpd
+F-H0-4808 2 fpdpjjpd
+F-H0-4809 5 qeqfrdrepdlcnc
+F-H0-4810 4 qdqfrdrepdlcnc
+F-H0-4811 4 qcqfrdrepdlcnc
+F-H0-4812 2 kdqhqfncpdobpb
+F-H0-4813 2 dpqfrdrepdlcnc
+F-H0-4814 15 ncqprqppqqoppqdpnqrorpqoqnpkpdqfdd
+F-H0-4815 9 pnerdrnqcreqfqdqcqipppdpcpdocnddpd
+F-H0-4816 2 nddpppdecfidpdddcdncfcecccdcdbebcb
+F-H0-4817 17 iqcqdrdpfqcnppdcpd
+F-H0-4818 8 nolqnqpppddpdd
+F-H0-4819 6 ccdpppchcfddpd
+F-H0-4820 3 fqdpppclcnddpd
+F-H0-4821 2 nqhqfqpppddpdd
+F-H0-4822 16 cfhqbqdqppcqcpepbopddndd
+F-H0-4823 5 qfppdpchfddedcpdebcdcbcc
+F-H0-4824 4 qjppdpchfddedcpdebcdcbcc
+F-H0-4825 3 qfhqbqdqppcqcpepbopddndd
+F-H0-4826 2 qnppdpchfddedcpdebcdcbcc
+F-H0-4827 9 fpcqpqddpd
+F-H0-4828 6 qncqpdppcd
+F-H0-4829 3 pkcqpqddpd
+F-H0-4830 2 ocqqqddpdd
+F-H0-4831 2 ckqqdqpddd
+F-H0-4832 2 cfcqpqddpd
+F-H0-4833 2 dpcqpqddpd
+F-H0-4834 14 kkkjjj
+F-H0-4835 5 jikjjj
+F-H0-4836 6 edqpeppc
+F-H0-4837 6 dppqedqd
+F-H0-4838 4 pecdpopc
+F-H0-4839 3 epcdpopc
+F-H0-4840 2 eqpqedqd
+F-H0-4841 2 ocpqedqd
+F-H0-4842 9 nopqdpplpodcpd
+F-H0-4843 8 pmqpoplpdpcdpd
+F-H0-4844 4 ecpqdpdhdedcpd
+F-H0-4845 4 qqpqdpplpodcpd
+F-H0-4846 2 nppqdpplpodcpd
+F-H0-4847 21 bodqbqcqppephppdcpdd
+F-H0-4848 2 qmqqrqpqqpoplppddpdd
+F-H0-4849 10 ppdodcpd
+F-H0-4850 7 qpdodcpd
+F-H0-4851 3 opdodcpd
+F-H0-4852 3 cpepqppd
+F-H0-4853 3 pqdodcpd
+F-H0-4854 27 pnpqpoqpqndppdqodd
+F-H0-4855 3 gddpppcdpdeceddcfc
+F-H0-4856 2 fgdpppcdpdeceddcfc
+F-H0-4857 17 gpipfqfpppdpcnddpd
+F-H0-4858 13 cqipfqfpppdpcnddpd
+F-H0-4859 10 qlrppqdpfqqnipcnpoddpd
+F-H0-4860 8 pnrppqdpfqqnipcnpoddpd
+F-H0-4861 5 qorppqdpfqqnipcnpoddpd
+F-H0-4862 3 plrppqdpfqqnipcnpoddpd
+F-H0-4863 2 rorppqdpfqqnipcnpoddpd
+F-H0-4864 12 qhdpoqqjqpqfqldcpd
+F-H0-4865 4 ncdpoqqjqpqfqldcpd
+F-H0-4866 3 qedpoqqjqpqfqldcpd
+F-H0-4867 3 nddpoqqjqpqfqldcpd
+F-H0-4868 11 popqdqqddcoc
+F-H0-4869 4 qopqdqqddcoc
+F-H0-4870 3 qnpqdqqddcoc
+F-H0-4871 2 qkpqdqqddcoc
+F-H0-4872 2 jcqeqpcdcppc
+F-H0-4873 19 cdnpqpdppc
+F-H0-4874 4 ddnpqpdppc
+F-H0-4875 2 ocndpqddqd
+F-H0-4876 2 nendpqddqd
+F-H0-4877 6 opqpjjdp
+F-H0-4878 4 pjpqjjpd
+F-H0-4879 4 ddqpjjdp
+F-H0-4880 2 fpppjjcp
+F-H0-4881 19 qjppdpqdddod
+F-H0-4882 3 ncqpdpopddpd
+F-H0-4883 2 kqdqpdppdddo
+F-H0-4884 2 qjpeppdddppc
+F-H0-4885 2 djppdpqdddod
+F-H0-4886 8 dnpqepcpddpd
+F-H0-4887 6 ccppdpcdedpc
+F-H0-4888 4 popqepcpddpd
+F-H0-4889 2 oqqppedpddpc
+F-H0-4890 2 qnpqepcpddpd
+F-H0-4891 2 pnpqepcpddpd
+F-H0-4892 2 copqepcpddpd
+F-H0-4893 4 ncdppqciqddc
+F-H0-4894 4 mppqcpqkdcpd
+F-H0-4895 3 copddqcdqpic
+F-H0-4896 3 djpddqcdqpic
+F-H0-4897 3 ncpqcpqkdcpd
+F-H0-4898 3 cjpddqcdqpic
+F-H0-4899 3 lppqcpqkdcpd
+F-H0-4900 11 fcpqdpcfddpc
+F-H0-4901 3 clpqdpcnddpc
+F-H0-4902 2 qmnqppqddpcd
+F-H0-4903 2 dnfqppqddpcd
+F-H0-4904 2 ipfqppqddpcd
+F-H0-4905 14 ncppdpjpddpd
+F-H0-4906 6 qjppdppdddjd
+F-H0-4907 3 ncpjpppddpdd
+F-H0-4908 2 hcppdppdddjd
+F-H0-4909 20 pcppdppjodoemdneocmencpddcnd
+F-H0-4910 3 opppqojppodpqnoopmpnqdonddom
+F-H0-4911 3 dlppdojpcodpcneodmenpddncdem
+F-H0-4912 10 cepqpdcpdc
+F-H0-4913 6 nccpppdcqd
+F-H0-4914 5 dodqddqppc
+F-H0-4915 4 qopqpdcpdc
+F-H0-4916 15 nddpppqfpjddpdnclc
+F-H0-4917 6 oonqlqdpppqnpjddpd
+F-H0-4918 4 qqnqlqdpppqnpjddpd
+F-H0-4919 2 pnnqlqdpppqnpjddpd
+F-H0-4920 8 oedpppodpjmdneocmencpddcnd
+F-H0-4921 12 ocdppqecqd
+F-H0-4922 10 pqdpcdqopc
+F-H0-4923 3 dedppqecqd
+F-H0-4924 18 oomppqdpplpoqdddoc
+F-H0-4925 3 ppmppqdpplpoqdddoc
+F-H0-4926 2 nomppqdpplpoqdddoc
+F-H0-4927 25 fqppdqgpfodpeododlenddpc
+F-H0-4928 4 poppqpoplpnodppmoopdoncd
+F-H0-4929 10 ndqddpddodpcncoc
+F-H0-4930 7 gpeqfqdqeppppdcp
+F-H0-4931 4 fcqddpddodpcncoc
+F-H0-4932 2 ngqddpddodpcncoc
+F-H0-4933 2 qfpdppcdedecfcdc
+F-H0-4934 10 ncpjpqpddpddqf
+F-H0-4935 9 nqjpfqdpqpddpd
+F-H0-4936 4 fojpfqdpqpddpd
+F-H0-4937 3 cqjpfqdpqpddpd
+F-H0-4938 15 pfdpkqcnfqddqpncpd
+F-H0-4939 5 qnnqppdpqdcfkcddfc
+F-H0-4940 5 lcdpkqcnfqddqpncpd
+F-H0-4941 3 qgdpkqcnfqddqpncpd
+F-H0-4942 19 ddqodpqe
+F-H0-4943 6 dqqoddqe
+F-H0-4944 5 npdppqpoddqd
+F-H0-4945 5 mqdqqpopddpd
+F-H0-4946 5 dodqqpopddpd
+F-H0-4947 5 lpdqqpopddpd
+F-H0-4948 5 ocdppqpoddqd
+F-H0-4949 3 ecdpppedcdpc
+F-H0-4950 8 cedpqqdedcpd
+F-H0-4951 7 cgdpqqdedcpd
+F-H0-4952 5 pldppqpoccpd
+F-H0-4953 2 qnopqpdpccpd
+F-H0-4954 2 didpqqdedcpd
+F-H0-4955 14 dneqppfphppdcpdd
+F-H0-4956 4 eeppdpdfdhcedcpd
+F-H0-4957 2 bdppdpdfdhcedcpd
+F-H0-4958 17 pjpqdpnqpoqpqnqopnddpd
+F-H0-4959 5 jqpqnqoqopqpnpqndpddpd
+F-H0-4960 2 pipqdpnqpoqpqnqopnddpd
+F-H0-4961 7 ceqpdpdedcpd
+F-H0-4962 5 gcpqpddpcded
+F-H0-4963 5 dhqpdpdedcpd
+F-H0-4964 4 oqqpdpdedcpd
+F-H0-4965 4 fdqpdpdedcpd
+F-H0-4966 2 odppdqdoddqd
+F-H0-4967 3 encnkqdmqppddpcddn
+F-H0-4968 15 noppnqkpdpddpd
+F-H0-4969 8 qqppnqkpdpddpd
+F-H0-4970 8 omqnpppmjpqddpcdpn
+F-H0-4971 4 nedqppmdpjncpddcnd
+F-H0-4972 9 icqqpdcqcd
+F-H0-4973 5 qocqpqccpd
+F-H0-4974 4 fpcqpqccpd
+F-H0-4975 3 pkcqpqccpd
+F-H0-4976 2 pocqpqccpd
+F-H0-4977 2 jqqqqdcqdd
+F-H0-4978 2 dpcqpqccpd
+F-H0-4979 10 dcppcpqd
+F-H0-4980 7 dppdpqdc
+F-H0-4981 4 depdpqdc
+F-H0-4982 12 cnnpfqdpqpddpd
+F-H0-4983 6 lqnpfqdpqpddpd
+F-H0-4984 3 pippqndpddpfpc
+F-H0-4985 2 jqnpfqdpqpddpd
+F-H0-4986 2 oqnpfqdpqpddpd
+F-H0-4987 11 fpcqppbqhpepcpdpeofocofnendmcnpdemdd
+F-H0-4988 6 jdppdpffdhefgedefepdeegdfcddecccdccb
+F-H0-4989 4 ncppdpffdhefgedefepdeegdfcddecccdccb
+F-H0-4990 4 jcppdpffdhefgedefepdeegdfcddecccdccb
+F-H0-4991 2 kcppdpffdhefgedefepdeegdfcddecccdccb
+F-H0-4992 11 popqdpqdddod
+F-H0-4993 4 qnpqdpqdddod
+F-H0-4994 3 qjpqdpqdddod
+F-H0-4995 2 qopqdpqdddod
+F-H0-4996 2 jcpqdpqdddod
+F-H0-4997 2 djpqdpqdddod
+F-H0-4998 13 ndqfqhofpd
+F-H0-4999 2 ncqfqhofpd
+F-H0-5000 21 dfpqdpfedjpdddfchc
+F-H0-5001 2 noqnpponjppddpcdql
+F-H0-5002 6 dnpqdpfqjdqkddpfncpd
+F-H0-5003 5 qlqnppqddpfddjddcfkc
+F-H0-5004 4 djcnpppddpndpjcdqfic
+F-H0-5005 4 cnpqdpfqjdqkddpfncpd
+F-H0-5006 4 ippqdpfqjdqkddpfncpd
+F-H0-5007 2 fppqdpfqjdqkddpfncpd
+F-H0-5008 9 dpqdqpdc
+F-H0-5009 6 dcpqdqqd
+F-H0-5010 5 pecdcppc
+F-H0-5011 3 coqdqpdc
+F-H0-5012 2 qopqcdcp
+F-H0-5013 7 qpopdppedc
+F-H0-5014 5 ckpodqoddd
+F-H0-5015 3 cpeppdpocd
+F-H0-5016 3 djeppdpocd
+F-H0-5017 2 pkdopqedpd
+F-H0-5018 2 kqeppdpocd
+F-H0-5019 9 qedpoq
+F-H0-5020 5 ppddoc
+F-H0-5021 2 coddoc
+F-H0-5022 2 opddoc
+F-H0-5023 2 ceppqe
+F-H0-5024 12 cedpqqdcqc
+F-H0-5025 4 dedpqqdcqc
+F-H0-5026 2 pjdpqqdcqc
+F-H0-5027 2 cfdpqqdcqc
+F-H0-5028 3 fqdppoddoe
+F-H0-5029 2 qodpooddpe
+F-H0-5030 18 pmppqnjpqddpcdpn
+F-H0-5031 15 opppnqnpmpmodppjdcpd
+F-H0-5032 3 mqppnqnpmpmodppjdcpd
+F-H0-5033 2 olppqnjppmdppdpncdom
+F-H0-5034 5 dmkqcnqppddpcddn
+F-H0-5035 14 ddqpdpqc
+F-H0-5036 8 dcqpdpqc
+F-H0-5037 4 opqpdpqc
+F-H0-5038 6 odpodpijddqe
+F-H0-5039 6 qjpodpijddqe
+F-H0-5040 4 pqpodpijddqe
+F-H0-5041 3 pjpodpijddqe
+F-H0-5042 2 kdpodpijddqe
+F-H0-5043 2 jppodpijddqe
+F-H0-5044 2 pcpodpijddqe
+F-H0-5045 14 jdfqdpppdnjpddpfncpd
+F-H0-5046 2 qnfqdpppdnjpddpfncpd
+F-H0-5047 2 pbfqdpppdnjpddpfncpd
+F-H0-5048 5 enbqdqppcqhpepcppdbodd
+F-H0-5049 3 fddpppdhdedcpdebcdcbcc
+F-H0-5050 25 nbqdppnddpddpdpcodocqcmcnc
+F-H0-5051 3 cogqfqeqcqdqepppdpfppdcpdd
+F-H0-5052 4 pnqqpprpnprodpqnqopdqldd
+F-H0-5053 21 fedpppdgdedcpd
+F-H0-5054 4 qqqpopmppddpdd
+F-H0-5055 12 lqnqdrdpfqcnppddpd
+F-H0-5056 5 nqqnpppddpddqfncrd
+F-H0-5057 4 cqnqdrdpfqcnppddpd
+F-H0-5058 2 kpnqdrdpfqcnppddpd
+F-H0-5059 2 lpnqdrdpfqcnppddpd
+F-H0-5060 25 fqeqpqcpepdcpd
+F-H0-5061 2 dpdqdoqppdcocd
+F-H0-5062 4 qoqqpprpnpqndppdqldd
+F-H0-5063 7 qfpddpcdqoic
+F-H0-5064 4 dckqceqppddp
+F-H0-5065 4 mppqdpqkecpd
+F-H0-5066 3 jppqdpqkecpd
+F-H0-5067 2 kppqdpqkecpd
+F-H0-5068 7 qfdpppddcjncpd
+F-H0-5069 5 ndppjqdppdqfdd
+F-H0-5070 3 phppjqdppdqfdd
+F-H0-5071 2 pjppjqdppdqfdd
+F-H0-5072 17 nqppjppjdpjjdjpdddjd
+F-H0-5073 4 jmppdpjpdjpjjdjjddpd
+F-H0-5074 4 npppjppjdpjjdjpdddjd
+F-H0-5075 9 fqeqeppppdcpddjc
+F-H0-5076 4 pppqdpqopocjddpd
+F-H0-5077 16 fdqpdpcdpdeceddcfc
+F-H0-5078 8 dgpqdpcecfcddedcpd
+F-H0-5079 2 edpqnqoqopqpdpcdpd
+F-H0-5080 9 pheqppcpcjpepcdd
+F-H0-5081 8 ceoqdpqpqjdedcpd
+F-H0-5082 5 mqopqpcedppdjcdc
+F-H0-5083 3 eeoqdpqpqjdedcpd
+F-H0-5084 12 iopqnqoqiqgqopdqmpqppdcoddqn
+F-H0-5085 6 djpqdpnqpoqpqnqopmqgqiqdddoc
+F-H0-5086 2 cjqfppcedpqdodpcmdocncgcicdc
+F-H0-5087 12 ppeepd
+F-H0-5088 4 dpoopd
+F-H0-5089 4 cdoopd
+F-H0-5090 6 nplppqdpqkddpd
+F-H0-5091 6 polppqdpqkddpd
+F-H0-5092 5 nqlppqdpqkddpd
+F-H0-5093 3 jplppqdpqkddpd
+F-H0-5094 2 pjpppddpcddhic
+F-H0-5095 20 gpfppqdpfqddpd
+F-H0-5096 17 ekdpppcmckcedgcdcffcdedcpd
+F-H0-5097 7 jdpqnqoqiqgqopqpmpdppdqndd
+F-H0-5098 13 qqpqpocpqdqmdd
+F-H0-5099 12 fogqpqcpepdcpd
+F-H0-5100 18 eqfpfqdpppfogpddpd
+F-H0-5101 2 dqfpfqdpppfogpddpd
+F-H0-5102 17 onqpoqlpdpddpd
+F-H0-5103 5 pnpqdpplqoddpd
+F-H0-5104 4 oopqdpplqoddpd
+F-H0-5105 2 egppdpdhcedcpd
+F-H0-5106 9 ocpopqodcpddqd
+F-H0-5107 4 oepopqodcpddqd
+F-H0-5108 3 pnopqpdpcdpepc
+F-H0-5109 2 ldpopqodcpddqd
+F-H0-5110 2 cgdppqdeqdoddc
+F-H0-5111 2 qfpopqodcpddqd
+F-H0-5112 2 nppopqodcpddqd
+F-H0-5113 17 prqpnqoppddpcdpjncqf
+F-H0-5114 5 pnpqdpfqqnjpcnpodcpd
+F-H0-5115 9 roppqqnprpdpqnqopdqldd
+F-H0-5116 15 ddoqdpqe
+F-H0-5117 3 ecoqdpqe
+F-H0-5118 3 qpoqdpqe
+F-H0-5119 2 dcoqdpqe
+F-H0-5120 2 cdoqdpqe
+F-H0-5121 2 ccpppddpjddcdd
+F-H0-5122 20 ddqqdpqd
+F-H0-5123 4 dcqqdpqd
+F-H0-5124 16 mqnqlqlpppdpkplopjddpd
+F-H0-5125 2 pfdppplepjldpdddkdnclc
+F-H0-5126 2 oipppidpqhphpdohjdqfdd
+F-H0-5127 27 pcqdppdddprcodmcqc
+F-H0-5128 20 cnqqqrqpordppqpofqqlnpddpd
+F-H0-5129 2 fpppcndpdfedbehcpddccdccbc
+F-H0-5130 13 cnfqdpppqjqdddoc
+F-H0-5131 4 idoqdpqpqjpdddfc
+F-H0-5132 4 dnfqdpppqjqdddoc
+F-H0-5133 4 hcoqdpqpqjpdddfc
+F-H0-5134 8 pmppqqnprpdproqoqnpnpdqldd
+F-H0-5135 2 gcdpppdfpdfdfcddcchcebecdb
+F-H0-5136 16 kcdppqdfqdddfc
+F-H0-5137 4 dbdppqdfqdddfc
+F-H0-5138 3 pjppqnnpcddppc
+F-H0-5139 9 neppdpqdodmcddfc
+F-H0-5140 9 qqmqopfqdpqpddpd
+F-H0-5141 3 ormqopfqdpqpddpd
+F-H0-5142 9 qfdppopddd
+F-H0-5143 4 nqppdoddpd
+F-H0-5144 4 cfppdpddod
+F-H0-5145 3 qnppdoddpd
+F-H0-5146 2 qpdpoppddd
+F-H0-5147 26 ciqdppfddpddcfkcbdcc
+F-H0-5148 11 qndrcqiqdpfqcnppdcpd
+F-H0-5149 9 ncdrcqiqdpfqcnppdcpd
+F-H0-5150 22 cddppqcfcededcpd
+F-H0-5151 16 qnnqpqopoqnpqpdppd
+F-H0-5152 5 ponqpqopoqnpqpdppd
+F-H0-5153 7 cfdppqqdddfc
+F-H0-5154 5 lqnqppcpdcpd
+F-H0-5155 4 epnqppcpdcpd
+F-H0-5156 2 codqqpcfddpd
+F-H0-5157 7 iphqfqdpppcnfodcpd
+F-H0-5158 4 ohqhpppddpcdqfncof
+F-H0-5159 9 djoqdpoddd
+F-H0-5160 5 jqqopddodd
+F-H0-5161 4 cdepppecpd
+F-H0-5162 3 djepppecpd
+F-H0-5163 2 cpepppecpd
+F-H0-5164 2 jjepppecpd
+F-H0-5165 10 qfpdqpidcpcd
+F-H0-5166 3 mppqdqpkdcpd
+F-H0-5167 2 copqdqpkdcpd
+F-H0-5168 2 djpdqpidcpcd
+F-H0-5169 2 dipdqpidcpcd
+F-H0-5170 2 djpqdqpkdcpd
+F-H0-5171 8 qfppdppjddpdncjd
+F-H0-5172 7 enppcnjppddpdddj
+F-H0-5173 5 qcpjpppddpjdqfdd
+F-H0-5174 3 pnppnqjpdppjddpd
+F-H0-5175 3 cokqcnqpdmdppdencddn
+F-H0-5176 3 cpcokqcnqpdmdppdencddn
+F-H0-5177 11 cqbpppcnfppddpcd
+F-H0-5178 6 qgqppddpndqfddrd
+F-H0-5179 3 peppdppcdffcdddb
+F-H0-5180 22 emcqppephpdpcpfoeofncodmenpdcndd
+F-H0-5181 3 dfppdpffdheffedeeepdfcgdecdddccc
+F-H0-5182 2 cbppdpffdheffedeeepdfcgdecdddccc
+F-H0-5183 6 dppejj
+F-H0-5184 3 pcpejj
+F-H0-5185 3 pjopjj
+F-H0-5186 2 nopojj
+F-H0-5187 2 edopjj
+F-H0-5188 2 ecdejj
+F-H0-5189 13 ocdppqedqd
+F-H0-5190 4 cddppqedqd
+F-H0-5191 4 fqdppqedqd
+F-H0-5192 12 cqippqfpfqdpgpfocnddpd
+F-H0-5193 10 qoppnqdpqnpnpmonqdpkdd
+F-H0-5194 5 dqippqfpfqdpgpfocnddpd
+F-H0-5195 8 podppqqnqopnpd
+F-H0-5196 6 qidpoqqkqpddpd
+F-H0-5197 5 mqkqpqpddpddqo
+F-H0-5198 5 cjdpoqqkqpddpd
+F-H0-5199 4 qgdpoqqkqpddpd
+F-H0-5200 2 fcdpoqqkqpddpd
+F-H0-5201 5 djdppj
+F-H0-5202 3 pjppjd
+F-H0-5203 2 idpdjp
+F-H0-5204 8 phdpqppepcdd
+F-H0-5205 5 cgppcpdedcpd
+F-H0-5206 4 dneppqpdcpdd
+F-H0-5207 4 oqopdqpdqpdd
+F-H0-5208 2 eeppcpdedcpd
+F-H0-5209 11 djpppddpndqicdqfqcrdic
+F-H0-5210 7 qnppqddpfdciddcfkcbdcc
+F-H0-5211 2 pibpkqcncqckqppdfpdddp
+F-H0-5212 14 oonqppdppjqnpdddjd
+F-H0-5213 5 npnqppdppjqnpdddjd
+F-H0-5214 4 pfdpppqfjpddpjncpd
+F-H0-5215 17 jccfqppdcpdc
+F-H0-5216 2 qippdqqddcnc
+F-H0-5217 17 ddoodpoe
+F-H0-5218 3 dcoodpoe
+F-H0-5219 8 popqdpjpjdpkddpfncpd
+F-H0-5220 6 hqpqdpjpjdpkddpfncpd
+F-H0-5221 5 djpqdpjpjdpkddpfncpd
+F-H0-5222 4 gcppnqpnjppidpjdddpc
+F-H0-5223 2 gppqdpjpjdpkddpfncpd
+F-H0-5224 6 eqppcpeppd
+F-H0-5225 5 qgppdppepc
+F-H0-5226 3 ddppdppepc
+F-H0-5227 2 hpppcpeppd
+F-H0-5228 15 qgppqddpddodrcqcmcpc
+F-H0-5229 8 reppqddpddodrcqcmcpc
+F-H0-5230 14 cfdpppcededcqd
+F-H0-5231 11 dpdqqpcododdpd
+F-H0-5232 9 qfoqdpqpqjcjddpd
+F-H0-5233 7 gcjqppcedppdjcdc
+F-H0-5234 4 choqdpqpqjcjddpd
+F-H0-5235 13 rdrqqpqqpppqopnqdprproqnqopdqlddqfnc
+F-H0-5236 6 dkfqcnppchdpcecfbebdpdfceddcddcccdbc
+F-H0-5237 2 ncdrercrnqfqhqcqeqppdqcpdpqndocnddpd
+F-H0-5238 2 pqdrercrnqfqhqcqeqppdqcpdpqndocnddpd
+F-H0-5239 4 ppdfdcpd
+F-H0-5240 3 cedfdcpd
+F-H0-5241 3 dqnpqppd
+F-H0-5242 2 dqdfdcpd
+F-H0-5243 2 dpnpqppd
+F-H0-5244 2 qodfdcpd
+F-H0-5245 2 fddfdcpd
+F-H0-5246 27 fopqipfqfpgpdpcnddpd
+F-H0-5247 18 ooopqppmlppdcpdd
+F-H0-5248 4 nomppqdpplpopcdd
+F-H0-5249 2 ppopqppmlppdcpdd
+F-H0-5250 12 jdfqdpppcnjpddpfncpd
+F-H0-5251 6 pbfqdpppcnjpddpfncpd
+F-H0-5252 2 icfqdpppcnjpddpfncpd
+F-H0-5253 25 qfppcedpqdodpcndocncdc
+F-H0-5254 20 qfoqdqqpqjqlddpd
+F-H0-5255 7 qmppdpqhqjqddcoc
+F-H0-5256 4 nddppepc
+F-H0-5257 2 ocdppepc
+F-H0-5258 12 ddnppd
+F-H0-5259 6 dpdfpd
+F-H0-5260 2 pppndp
+F-H0-5261 13 idfqdpppcnpdddfc
+F-H0-5262 6 hcfqdpppcnpdddfc
+F-H0-5263 2 dnfqdpppcfpdddfc
+F-H0-5264 2 jpfqdpppcfpdddfc
+F-H0-5265 25 rcqdppnddpddpdpcodocqcmcncqbnb
+F-H0-5266 11 pjjjpppdjpdddp
+F-H0-5267 4 cjdpppjjpjddpd
+F-H0-5268 3 qfjjpppdjpdddp
+F-H0-5269 22 dqpqeqfqcpepdcpd
+F-H0-5270 2 erpqeqfqcpepdcpd
+F-H0-5271 8 dmhppqcpepdcpd
+F-H0-5272 4 nephqpcddppcpe
+F-H0-5273 4 pfpqdpqdodlddc
+F-H0-5274 3 qcphqpcddppcpe
+F-H0-5275 2 mephqpcddppcpe
+F-H0-5276 2 eqdqdoqppddlcd
+F-H0-5277 10 ncpppdqf
+F-H0-5278 5 ddfqdppp
+F-H0-5279 5 qlqnpppd
+F-H0-5280 3 ddqnpppd
+F-H0-5281 21 nqppdppjcldjcedfcdcffcdedcpd
+F-H0-5282 2 qjfqlqjpeqfpdqeppppdcpjdcndd
+F-H0-5283 6 emdodqenqppdcmdd
+F-H0-5284 4 dqppgqepcpfodcpd
+F-H0-5285 4 nppopqoncppdqmdd
+F-H0-5286 4 cmppgqepcpfodcpd
+F-H0-5287 3 dkdodqenqppdcmdd
+F-H0-5288 17 rpppqnnponcppdpkdd
+F-H0-5289 2 fmipfqdpppdnfodcpd
+F-H0-5290 20 qbppqddpndpdddodpcqcocncmcnb
+F-H0-5291 5 qopqcpeqddpd
+F-H0-5292 4 hppqcpeqddpd
+F-H0-5293 3 popqcpeqddpd
+F-H0-5294 3 dopqcpeqddpd
+F-H0-5295 2 ippqcpeqddpd
+F-H0-5296 2 qmqopqqddpdd
+F-H0-5297 2 fpcodqpdppcd
+F-H0-5298 7 epcoppdepd
+F-H0-5299 5 dqdoppcepd
+F-H0-5300 4 pjdoppcepd
+F-H0-5301 3 cpeqpdopdd
+F-H0-5302 2 eqcoppdepd
+F-H0-5303 19 nqpopqqnqppndppdqodd
+F-H0-5304 2 deppdppdcdfdeceddcfc
+F-H0-5305 13 ddpodpoe
+F-H0-5306 8 cfopdppdddfc
+F-H0-5307 6 hcopdppdddfc
+F-H0-5308 5 idopdppdddfc
+F-H0-5309 3 dfopdppdddfc
+F-H0-5310 2 ndepppddpdnc
+F-H0-5311 2 qoopdppdddfc
+F-H0-5312 22 qgpqdpqnqjqdddoc
+F-H0-5313 4 nkqppqqopppojpqndppmooplpnpdonddom
+F-H0-5314 3 qcppogdppfphofpgoeqfpdqejdpeddqdpc
+F-H0-5315 2 ohppogdppfphofpgoeqfpdqejdpeddqdpc
+F-H0-5316 18 fcdofqdndqcnqpdjcppdcodd
+F-H0-5317 2 cefqeqppdqjpcpfpcnepdcpd
+F-H0-5318 2 qnppcedpqddjcddffccfdcde
+F-H0-5319 9 ecppcddpqced
+F-H0-5320 5 dhppcqdedcpd
+F-H0-5321 3 qfppqddpccod
+F-H0-5322 2 dippcqdedcpd
+F-H0-5323 2 cgppcqdedcpd
+F-H0-5324 2 dfppcddpqced
+F-H0-5325 15 cjfqppdqdocpdncocncdpdec
+F-H0-5326 9 jdqfppcedpqdodpcndocncdc
+F-H0-5327 9 ecpqcopd
+F-H0-5328 4 qppdeqcd
+F-H0-5329 3 edpqcopd
+F-H0-5330 2 qopqcopd
+F-H0-5331 2 cepqcopd
+F-H0-5332 2 ddpqcopd
+F-H0-5333 11 dfppdpcfjdpdddfc
+F-H0-5334 8 pnnqppqndppdpjdd
+F-H0-5335 3 oepppjdppdqfddnc
+F-H0-5336 10 dcppefdppdcfjdccdd
+F-H0-5337 3 pcdpppddpjqcnencpd
+F-H0-5338 16 qjnqdqqpddpd
+F-H0-5339 2 qknqdqqpddpd
+F-H0-5340 2 dippdpqddcnc
+F-H0-5341 2 kcpqqddpddqn
+F-H0-5342 9 pqcqqd
+F-H0-5343 4 ppcqqd
+F-H0-5344 4 pqcqpc
+F-H0-5345 3 ppcqpc
+F-H0-5346 2 cecqqd
+F-H0-5347 15 ccdppqdheffedeeepdfcgddcdd
+F-H0-5348 12 fnfqppdqgpfodpeododlenddpc
+F-H0-5349 20 cphqfqdqcqdpqpddpd
+F-H0-5350 4 opqpecpd
+F-H0-5351 3 eqqpecpd
+F-H0-5352 2 dfpdqodc
+F-H0-5353 2 oqqpecpd
+F-H0-5354 2 eqpdqodc
+F-H0-5355 2 doqpecpd
+F-H0-5356 2 dcppeqqd
+F-H0-5357 2 dpqpecpd
+F-H0-5358 21 olppqnnpondppkqlpdpldd
+F-H0-5359 19 obppqddpndpdddodpcrcocqcmcncqbnb
+F-H0-5360 6 npdppf
+F-H0-5361 3 fddppf
+F-H0-5362 2 npdpnd
+F-H0-5363 5 lijhjj
+F-H0-5364 4 dphjjj
+F-H0-5365 2 njljjj
+F-H0-5366 2 jdjljj
+F-H0-5367 2 ihjhjj
+F-H0-5368 7 dnfqdpopddpe
+F-H0-5369 6 cnfqdpopddpe
+F-H0-5370 3 ipfqdpopddpe
+F-H0-5371 2 jdpodpodddfc
+F-H0-5372 10 coppdqdocecfcddedcpd
+F-H0-5373 6 dfppdqdocecfcddedcpd
+F-H0-5374 4 pldppqpoqeqfqdpepcdd
+F-H0-5375 2 jpnqpqopoqepqppdcpdd
+F-H0-5376 3 hqfqppcddppc
+F-H0-5377 3 fcqpdpcfddpc
+F-H0-5378 2 djqpdpcfddpc
+F-H0-5379 7 fopqfpfqdpgpddpd
+F-H0-5380 7 ceppdfcppddgddcf
+F-H0-5381 2 gopqfpfqdpgpddpd
+F-H0-5382 6 niqpogdppfphofpgoeqfpdqejdpeddqdpc
+F-H0-5383 3 olqppqqopppojpqndppmooplpnqdonddom
+F-H0-5384 3 qqqppqqopppojpqndppmooplpnqdonddom
+F-H0-5385 24 fcpqdpdfcecfcddedcpd
+F-H0-5386 20 drhqfqdqcqdpqpdocpddpd
+F-H0-5387 7 plcppqqoddpd
+F-H0-5388 4 eddpppcedcqd
+F-H0-5389 3 peoqqpdpddpc
+F-H0-5390 3 qeoqqpdpddpc
+F-H0-5391 2 pkcppqqoddpd
+F-H0-5392 4 qgjjpcpe
+F-H0-5393 3 ndjjpcpe
+F-H0-5394 3 phjjpcpe
+F-H0-5395 2 qejjpcpe
+F-H0-5396 2 oejjqdod
+F-H0-5397 4 qcppdpqhqfpddficddfcccdb
+F-H0-5398 24 eqdrercrhqfqdqcqdpqpdocpddpd
+F-H0-5399 7 nppqpoplddpd
+F-H0-5400 6 mppqpoplddpd
+F-H0-5401 5 nopqpoplddpd
+F-H0-5402 2 cepdpphdedcd
+F-H0-5403 4 cfdpfqdd
+F-H0-5404 3 nqppqndp
+F-H0-5405 2 pgppncpd
+F-H0-5406 10 hpeqcpppddpd
+F-H0-5407 3 gpeqcpppddpd
+F-H0-5408 3 opqopqpddpdd
+F-H0-5409 9 dedpqodcpd
+F-H0-5410 3 pnpqdppdce
+F-H0-5411 2 jpdpqodcpd
+F-H0-5412 25 erdrhqfqdqcqdpqpdocpddpd
+F-H0-5413 6 opdppqooqoqnpopnpd
+F-H0-5414 3 ondppqooqoqnpopnpd
+F-H0-5415 2 nqdppqooqoqnpopnpd
+F-H0-5416 2 rndppqooqoqnpopnpd
+F-H0-5417 10 qeqdppnddpddpdpcodocrcmcqcqbncobnb
+F-H0-5418 9 mbqdppnddpddpdpcodocrcmcqcqbncobnb
+F-H0-5419 3 endqcrbqcqcpppcodpbododncncmbnddpd
+F-H0-5420 2 aedpppcgcfdfbfcedebepdcddddcccbccb
+F-H0-5421 6 ocdpppndqd
+F-H0-5422 6 dddpppndqd
+F-H0-5423 3 dqnpqpddpd
+F-H0-5424 2 ecdpppndqd
+F-H0-5425 21 gpnqfqeqepdqqnpppdcpdd
+F-H0-5426 21 dqfqipcqdpppdcpd
+F-H0-5427 2 pqqqppqncppdpkdd
+F-H0-5428 25 dofqhqcqdqqpdpcpddpd
+F-H0-5429 9 popqdpqddjocdd
+F-H0-5430 5 jdeqppcppjdcpd
+F-H0-5431 4 jcceppqdjpdcdp
+F-H0-5432 2 dfeqppcppjdcpd
+F-H0-5433 14 qpopdpedpd
+F-H0-5434 4 cjopdpedpd
+F-H0-5435 2 qqopdpedpd
+F-H0-5436 2 jppodpdepd
+F-H0-5437 7 dnfqdpppccpd
+F-H0-5438 6 nqqncqpdppdd
+F-H0-5439 4 qlqncqpdppdd
+F-H0-5440 2 pjqncqpdppdd
+F-H0-5441 18 pbppdppjnepfncpddckd
+F-H0-5442 3 plpiqppddpndqfjdofdd
+F-H0-5443 2 ngppdppjnepfncpddckd
+F-H0-5444 21 cnerdrhqcreqfqdqcqdpqpdocpddpd
+F-H0-5445 10 chdqpdqpjdcfdd
+F-H0-5446 4 pfpqpdcpjdqfdd
+F-H0-5447 2 nonqppcppjdcpd
+F-H0-5448 2 pjpqpdcpjdqfdd
+F-H0-5449 2 oonqppcppjdcpd
+F-H0-5450 2 pkqnppcdjppcdp
+F-H0-5451 23 pcqpqhcppdqfjdqcdd
+F-H0-5452 2 pqqqlqnqppdqpjdcpd
+F-H0-5453 12 dhppdqcedcpd
+F-H0-5454 3 edppdqcedcpd
+F-H0-5455 3 cmppdqcodcpd
+F-H0-5456 2 cippdqcedcpd
+F-H0-5457 19 dmdqppepdoeoenddpd
+F-H0-5458 5 fpppepcpfoeopddodd
+F-H0-5459 10 deeppqdcpd
+F-H0-5460 7 cpeppqdcpd
+F-H0-5461 3 qkeppqdcpd
+F-H0-5462 3 pkeppqdcpd
+F-H0-5463 2 qoeppqdcpd
+F-H0-5464 9 rpppqnnpqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-5465 4 pkppqnnpqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-5466 3 chppdppfdecfddpdnccdhcfcecccdcdbebcb
+F-H0-5467 16 opdrercrhqfqeqcqdqqpdpcpdocnddpd
+F-H0-5468 5 oqdrercrhqfqeqcqdqqpdpcpdocnddpd
+F-H0-5469 2 nqppdpcfdeqdddcdhcfcecccdcdbebcb
+F-H0-5470 15 fedpppcddebdceecpd
+F-H0-5471 5 boeqppcpdobpcoddpd
+F-H0-5472 20 crerdrhqfqdqcqdpqpdocpddpd
+F-H0-5473 8 qqmqopqppddp
+F-H0-5474 7 onpqdpqmpopd
+F-H0-5475 2 ropqdpqmpopd
+F-H0-5476 16 pfdpppnejpddpjncpd
+F-H0-5477 4 pmnqppdppjnopdddjd
+F-H0-5478 18 pfdpppnepjncpddckd
+F-H0-5479 10 ipdpoqdnfqddpd
+F-H0-5480 8 jpdpoqdnfqddpd
+F-H0-5481 17 doppdqfppdcodd
+F-H0-5482 3 odqeppnddpddpc
+F-H0-5483 6 pcpqdpqedc
+F-H0-5484 4 pkcopqdcpd
+F-H0-5485 4 epcopqdcpd
+F-H0-5486 3 qkcopqdcpd
+F-H0-5487 2 eceqpdqpcd
+F-H0-5488 2 ocqdppeccp
+F-H0-5489 4 qnppqedpde
+F-H0-5490 2 jjppeqpded
+F-H0-5491 7 dqfqeqeppppdcpddjc
+F-H0-5492 7 hqpqdpjpjdqkddpfncpd
+F-H0-5493 4 djpqdpjpjdqkddpfncpd
+F-H0-5494 3 popqdpjpjdqkddpfncpd
+F-H0-5495 2 gqpqdpjpjdqkddpfncpd
+F-H0-5496 22 qmpqrpfqdpjpqnpocnpnddpd
+F-H0-5497 2 qqpqrpfqdpjpqnpocnpnddpd
+F-H0-5498 8 fpcnpqpddpcd
+F-H0-5499 3 cnpqdpfqcdpd
+F-H0-5500 2 ippqdpfqcdpd
+F-H0-5501 2 hqpqdpfqcdpd
+F-H0-5502 2 popqdpfqcdpd
+F-H0-5503 5 clpqfqcjcppcdd
+F-H0-5504 3 dodqnqqjqpdcpd
+F-H0-5505 2 qkdqnqqjqpdcpd
+F-H0-5506 2 opqpcfcppdjcdc
+F-H0-5507 2 codqnqqjqpdcpd
+F-H0-5508 10 qodppqpnfqcnipddpd
+F-H0-5509 8 oodppqpnfqcnipddpd
+F-H0-5510 2 ondppqpnfqcnipddpd
+F-H0-5511 10 dqfqfpeqdpppfogpddpd
+F-H0-5512 9 dppnpd
+F-H0-5513 8 dppfpp
+F-H0-5514 3 cdpnpd
+F-H0-5515 2 pppnpd
+F-H0-5516 17 oopqmpppdpplpopddd
+F-H0-5517 3 cedpppdhdeddpddcgd
+F-H0-5518 12 qffqdpppcnjpqjqlddpd
+F-H0-5519 5 qgfqdpppcnjpqjqlddpd
+F-H0-5520 12 nqppcqpjccpd
+F-H0-5521 2 qjppqcjpccdp
+F-H0-5522 5 ofpgpfqfpd
+F-H0-5523 3 ogpgpfqfpd
+F-H0-5524 2 qoqnpppmpn
+F-H0-5525 2 ocmeqfpdlcnd
+F-H0-5526 15 mppppqopoqnpnqqoqppddpdd
+F-H0-5527 2 ccppdpdfcfdecepdcddddcec
+F-H0-5528 2 dreqdqppcpdpcodocndnddpd
+F-H0-5529 8 chdqpdppjdcfdd
+F-H0-5530 6 pfpqpddpjdqfdd
+F-H0-5531 3 pfdpppcdpjncpd
+F-H0-5532 2 pjdqpdppjdcfdd
+F-H0-5533 2 kddpppcdpjncpd
+F-H0-5534 16 pjpqponqqnqppndppdqodd
+F-H0-5535 6 jqeqfqdqppcpfpcnepddpd
+F-H0-5536 2 qipqponqqnqppndppdqodd
+F-H0-5537 7 plcppqpoepddpd
+F-H0-5538 7 oocppqpoepddpd
+F-H0-5539 6 qocppqpoepddpd
+F-H0-5540 2 dneppppdcpdcde
+F-H0-5541 13 qfpppedpndqeddpc
+F-H0-5542 6 ddppdppddfcdedec
+F-H0-5543 5 qppqnpqodppdpodd
+F-H0-5544 5 npdpqqdcpd
+F-H0-5545 4 fqdpqqdcpd
+F-H0-5546 4 dedpqqdcpd
+F-H0-5547 4 cfdpqqdcpd
+F-H0-5548 2 cedpqqdcpd
+F-H0-5549 10 ccdqppcgdedcpd
+F-H0-5550 8 endqppcmdodcpd
+F-H0-5551 2 bedqppcgdedcpd
+F-H0-5552 6 ompopqondppdqmdd
+F-H0-5553 4 qmopmqdpqpnopddd
+F-H0-5554 2 dnppgqepcpfoddpd
+F-H0-5555 2 pjpopqondppdqmdd
+F-H0-5556 9 qnnqppcppd
+F-H0-5557 4 dpcdppncpd
+F-H0-5558 3 dkcnppdcdp
+F-H0-5559 4 dgdpppqjcfcedecdpddc
+F-H0-5560 4 fdjqpppddpcdedecfcdc
+F-H0-5561 2 qneqfqdqeppppdcpddjc
+F-H0-5562 14 oomppqdpfqpoplddpd
+F-H0-5563 3 ppmppqdpfqpoplddpd
+F-H0-5564 13 djdppqcedfcdcffcdedcpd
+F-H0-5565 9 cjdppqcedfcdcffcdedcpd
+F-H0-5566 18 jdpqdppkncpfdcpd
+F-H0-5567 3 kdpqdppkncpfdcpd
+F-H0-5568 3 pbpqdppkncpfdcpd
+F-H0-5569 10 ncpppdcoddqf
+F-H0-5570 6 dfoqdppdddfc
+F-H0-5571 4 hcoqdppdddfc
+F-H0-5572 2 pcdpppqfqhdfpdddicqcfcccdb
+F-H0-5573 2 qpqqdrcqiqdpfqqnppdnqlddpd
+F-H0-5574 4 fcnqppdpjjddpd
+F-H0-5575 3 pjppjjdppdqfdd
+F-H0-5576 3 npnqppdpjjddpd
+F-H0-5577 3 hqfqdpppjjpddd
+F-H0-5578 2 pjdpppddjjncpd
+F-H0-5579 2 dnppjjdppdqfdd
+F-H0-5580 2 kddpppddjjncpd
+F-H0-5581 2 nonqppdpjjddpd
+F-H0-5582 7 epppcecppd
+F-H0-5583 6 qpdqoqddpd
+F-H0-5584 2 pjdpppdcoc
+F-H0-5585 2 fcdqoqddpd
+F-H0-5586 12 lqnqppdppjpdqfncdd
+F-H0-5587 3 pippdpqfpdcfjdddfc
+F-H0-5588 3 nqdpfqqnppcnjppddd
+F-H0-5589 2 pjppdpqfpdcfjdddfc
+F-H0-5590 7 jqdqfqfpeqdpppfogpddpd
+F-H0-5591 5 kcdpppfepdfdgdddfcdcec
+F-H0-5592 5 godqfqfpeqdpppfogpddpd
+F-H0-5593 7 nperdreqcrdqpqipfqdpcqpocpdocnddpd
+F-H0-5594 7 nqerdreqcrdqpqipfqdpcqpocpdocnddpd
+F-H0-5595 3 mqerdreqcrdqpqipfqdpcqpocpdocnddpd
+F-H0-5596 2 qedppppecfdecdidpcddfcecccdcdbebcb
+F-H0-5597 16 bpfqpqdpcnddpd
+F-H0-5598 17 qqdrcqiqdpfqqnppcnqlddpd
+F-H0-5599 2 ofppdpqhqfpdcficddfcccdb
+F-H0-5600 8 pfpqdpqdoddc
+F-H0-5601 5 depqdpqdoddc
+F-H0-5602 14 dpqqddpd
+F-H0-5603 6 dqqqddpd
+F-H0-5604 4 nqppqfpd
+F-H0-5605 4 ncppqfpd
+F-H0-5606 3 qnppqfpd
+F-H0-5607 2 pnppqfpd
+F-H0-5608 5 opqpcfdppdjcdc
+F-H0-5609 5 qldpnqqjqpdcpd
+F-H0-5610 4 cfdpnqqjqpdcpd
+F-H0-5611 2 codqppqjqdddnc
+F-H0-5612 2 mqjqdqqdppddcn
+F-H0-5613 2 qmdpnqqjqpdcpd
+F-H0-5614 6 qlpjpppdcpjddjfdcfdd
+F-H0-5615 5 dippdpjpjdpjncpfdcpd
+F-H0-5616 2 gdppnqpndqpjjppdddjd
+F-H0-5617 2 doppnqpndqpjjppdddjd
+F-H0-5618 2 gqppdpjpjdpjncpfdcpd
+F-H0-5619 2 jjppdpjpjdpjncpfdcpd
+F-H0-5620 8 ckppdpcicdcfdcpd
+F-H0-5621 4 gcppdpcicdcfdcpd
+F-H0-5622 4 nqppdpcicdcfdcpd
+F-H0-5623 3 qjppdpcicdcfdcpd
+F-H0-5624 2 ncppdpcicdcfdcpd
+F-H0-5625 8 ppdqddqd
+F-H0-5626 4 epcppppc
+F-H0-5627 3 qecppppc
+F-H0-5628 3 qqdqddqd
+F-H0-5629 2 opdqddqd
+F-H0-5630 19 qdqhqppdcpjdqfddqcpc
+F-H0-5631 6 dnpqeqcpdcpd
+F-H0-5632 4 popqeqcpdcpd
+F-H0-5633 3 gpdqqppdcocd
+F-H0-5634 2 qfdppqqdocdc
+F-H0-5635 2 qopqeqcpdcpd
+F-H0-5636 6 cpqopqddpd
+F-H0-5637 3 cgppdpcedc
+F-H0-5638 3 hdpppdeccd
+F-H0-5639 2 depppdeccd
+F-H0-5640 2 dppppdeccd
+F-H0-5641 2 qppppnnp
+F-H0-5642 2 pepfndpd
+F-H0-5643 13 prppnqpndpddpd
+F-H0-5644 8 djppdpfdcfddpd
+F-H0-5645 13 iqcqdrdppqcnfqddpd
+F-H0-5646 3 jddpppcfpcddfcccdb
+F-H0-5647 2 dipdppddcpfccfccbd
+F-H0-5648 9 rdpqdppdqfncdd
+F-H0-5649 2 opqpfqdppdcndd
+F-H0-5650 15 cpdqfqipcqdpppdcpd
+F-H0-5651 18 icppdphedffehdpdddidhcfc
+F-H0-5652 2 okqnpponnpoldppkqlpdpldd
+F-H0-5653 14 fqdppqqjqnqgqdddoc
+F-H0-5654 5 jqdppqqjqnqgqdddoc
+F-H0-5655 14 dnppdpfpddpd
+F-H0-5656 4 fcppdppdddfd
+F-H0-5657 2 nqppdpfpddpd
+F-H0-5658 2 hqppdpfpddpd
+F-H0-5659 14 qpqqpqpodppdqmdd
+F-H0-5660 3 bqcqgqppcpepddpd
+F-H0-5661 14 nrlqqqqppqppnqopdqpjdcpd
+F-H0-5662 5 rqlqqqqppqppnqopdqpjdcpd
+F-H0-5663 13 pnqpopdppedd
+F-H0-5664 3 nqppepcpdepd
+F-H0-5665 8 qnnqppcddppc
+F-H0-5666 3 pidqppqfpdcd
+F-H0-5667 3 penqppcddppc
+F-H0-5668 3 lqnqppcddppc
+F-H0-5669 2 qmnqppcddppc
+F-H0-5670 17 fpeqpqdqfqcpepdcpd
+F-H0-5671 5 gpeqpqdqfqcpepdcpd
+F-H0-5672 9 qqlqnqpppddpddqfncrd
+F-H0-5673 8 ccppdpqhqfpdcffcdddb
+F-H0-5674 2 qnlqnqpppddpddqfncrd
+F-H0-5675 2 ofppdpqhqfpdcffcdddb
+F-H0-5676 7 qocppqpopd
+F-H0-5677 6 fddedpqddc
+F-H0-5678 2 ddcppqpopd
+F-H0-5679 18 qmkqdpfqcnqpqjqgddpd
+F-H0-5680 3 pmkqdpfqcnqpqjqgddpd
+F-H0-5681 15 oqppnqnpmpnodppjddpd
+F-H0-5682 5 qcppdppjmdneddpdncnd
+F-H0-5683 14 eofqppcndppd
+F-H0-5684 5 fpfqdpcnddpd
+F-H0-5685 2 pfdpppqfpdnc
+F-H0-5686 6 pjdpfqdnppjdjpddpfncpd
+F-H0-5687 4 cfdpfqdnppjdjpddpfncpd
+F-H0-5688 4 qjdpfqdnppjdjpddpfncpd
+F-H0-5689 20 onpqmpoodpplpoqdddoc
+F-H0-5690 10 eofqopqpdpcnddpd
+F-H0-5691 7 dnfqopqpdpcnddpd
+F-H0-5692 3 fpfqopqpdpcnddpd
+F-H0-5693 17 cnfqnqgpeqepdqqnpppdcpdd
+F-H0-5694 2 enppdqdocpcncodmcfpdddfc
+F-H0-5695 22 qmoqdpqpqjqhddpd
+F-H0-5696 10 dedppodcpd
+F-H0-5697 3 jpdppodcpd
+F-H0-5698 3 cnqppddped
+F-H0-5699 7 nopqdpfqpojpdnplddpd
+F-H0-5700 6 mppqdpfqpojpdnplddpd
+F-H0-5701 5 oqpqdpfqpojpdnplddpd
+F-H0-5702 2 qqpqdpfqpojpdnplddpd
+F-H0-5703 2 oppqdpfqpojpdnplddpd
+F-H0-5704 7 ncpqdqqkddpd
+F-H0-5705 6 mdppdpqidcpc
+F-H0-5706 3 jppqdqqkddpd
+F-H0-5707 2 dippdpqidcpc
+F-H0-5708 10 pnnqppdppdcffcdddb
+F-H0-5709 5 qhfqbpppcndppdqfdd
+F-H0-5710 3 fcnqrpppqndppdcfdd
+F-H0-5711 2 jddpdrcnfqddppncpd
+F-H0-5712 2 cqdpdrcnfqddppncpd
+F-H0-5713 4 cnppqedpddmcpcjchc
+F-H0-5714 2 leppcedppdjclcgcdc
+F-H0-5715 2 kojqlqgqdqpdppddco
+F-H0-5716 2 jcdpoqqmqpqjqhddpd
+F-H0-5717 22 dqfqeqppcpepdc
+F-H0-5718 14 nqpppqmpoodpnopoplonqdddoc
+F-H0-5719 3 oddpoqofqppephpdoemdneddpc
+F-H0-5720 5 cnpqdpfqccpd
+F-H0-5721 5 dnpqdpfqccpd
+F-H0-5722 5 popqdpfqccpd
+F-H0-5723 3 hqpqdpfqccpd
+F-H0-5724 4 fcdpppqjjjddpd
+F-H0-5725 4 qldpppqjjjddpd
+F-H0-5726 3 jqppjjdppdjcdd
+F-H0-5727 2 jddpppqjjjddpd
+F-H0-5728 2 ojdpppqjjjddpd
+F-H0-5729 2 npppdpcjjjpddd
+F-H0-5730 2 pjppdpcjjjpddd
+F-H0-5731 14 kplqnqppdppnnopjdcpd
+F-H0-5732 6 dbdppqdjfedfpdddfchc
+F-H0-5733 16 fpeqfqdqppcpepdc
+F-H0-5734 2 mdpqodqdddpcncoc
+F-H0-5735 17 cippdpddcffcpdccbd
+F-H0-5736 3 pidppppdqfqcrdncdd
+F-H0-5737 18 nomppqdpoopoplonqdddoc
+F-H0-5738 20 pppqmpoodpnopoplonqdddoc
+F-H0-5739 8 oqeqqpddpd
+F-H0-5740 6 nqeqqpddpd
+F-H0-5741 5 cddpppecqd
+F-H0-5742 17 hcppdphedhfefcdedcpd
+F-H0-5743 2 ceppdphedhfefcdedcpd
+F-H0-5744 20 fqeqppcpepdc
+F-H0-5745 10 qfpqmppojppkdppdddjd
+F-H0-5746 4 djpqmppojppkdppdddjd
+F-H0-5747 4 hcpqmppojppkdppdddjd
+F-H0-5748 2 qnpjpppddpiddjeddgcd
+F-H0-5749 2 gdpqmppojppkdppdddjd
+F-H0-5750 9 cnjppqdpfqdcpd
+F-H0-5751 4 ndpjqppddpcdqf
+F-H0-5752 3 cqjppqdpfqdcpd
+F-H0-5753 10 lqnqppdppjecpd
+F-H0-5754 4 pfpppdcojdqfdd
+F-H0-5755 2 kpnqppdppjecpd
+F-H0-5756 2 oonqppdppjecpd
+F-H0-5757 2 djpppdcojdqfdd
+F-H0-5758 9 iqfqhqppdpipdnfodcpd
+F-H0-5759 5 plqnpponnppkcppdqldd
+F-H0-5760 4 eqfqhqppdpipdnfodcpd
+F-H0-5761 23 peqpqhcppdqfjdqdddqcpc
+F-H0-5762 8 cpodpqdcqd
+F-H0-5763 4 dpodpqdcqd
+F-H0-5764 4 ocodpqdcqd
+F-H0-5765 3 ldodpqdcqd
+F-H0-5766 2 pfodpqdcqd
+F-H0-5767 10 gqnqlqdqkqkpjqjphqipppnolplopngopjddpd
+F-H0-5768 2 mddpppnepjlepfgepdkdldjdlcidkcncjcdchc
+F-H0-5769 2 medpppnepjlepfgepdkdldjdlcidkcncjcdchc
+F-H0-5770 2 ncppdpmedjhedffehdkdddjdlcidjcpcicfchc
+F-H0-5771 5 pldppqqofqddpd
+F-H0-5772 4 mcppqndpqdocdd
+F-H0-5773 3 fqppcndppdeccd
+F-H0-5774 3 oddpppqepcddfc
+F-H0-5775 2 qldppqqofqddpd
+F-H0-5776 2 npdppqqofqddpd
+F-H0-5777 8 opppnqnpdqmomppjdcpd
+F-H0-5778 6 plppqnjppmdpqdpncdom
+F-H0-5779 10 qjkqdpqpdcpd
+F-H0-5780 4 mqiqppcppcdd
+F-H0-5781 4 nckqdpqpdcpd
+F-H0-5782 2 qfkqdpqpdcpd
+F-H0-5783 12 qcppdppjncnedcpd
+F-H0-5784 6 phofqppddpjdqfdd
+F-H0-5785 2 nqppdppjncnedcpd
+F-H0-5786 20 dqhqfqdpcqcpppddpd
+F-H0-5787 8 cpqopqdcpd
+F-H0-5788 3 qmqopqdcpd
+F-H0-5789 2 pmqopqdcpd
+F-H0-5790 2 poqopqdcpd
+F-H0-5791 2 plqopqdcpd
+F-H0-5792 6 qqpqdppdpndd
+F-H0-5793 4 cfpqdppdpndd
+F-H0-5794 4 qfpqdppdpndd
+F-H0-5795 18 oppqmpnodpplpopddd
+F-H0-5796 2 fddpppdhdefepddcgd
+F-H0-5797 5 qfpdcqddqp
+F-H0-5798 4 podppqddqc
+F-H0-5799 3 cfpdcqddqp
+F-H0-5800 3 cjdppqddqc
+F-H0-5801 2 qodppqddqc
+F-H0-5802 12 cpppcqdpccpd
+F-H0-5803 4 dcppcqpdccdd
+F-H0-5804 5 fpnqppdqdoddpd
+F-H0-5805 4 jddpppncdedcpd
+F-H0-5806 4 piqpopdppdqfdd
+F-H0-5807 2 qfdpppncdedcpd
+F-H0-5808 2 lcdpppncdedcpd
+F-H0-5809 12 dmhppqcpepddpd
+F-H0-5810 5 enhppqcpepddpd
+F-H0-5811 2 cohppqcpepddpd
+F-H0-5812 14 drdqfqipcqdpppdocpdcpd
+F-H0-5813 4 pppddpcdjj
+F-H0-5814 4 qdppjjcpdd
+F-H0-5815 2 popqdppdjj
+F-H0-5816 2 oqqpjjdppd
+F-H0-5817 6 pfdpfqdnppncjpdcpd
+F-H0-5818 3 ncqpcnfpdjdppdqfdd
+F-H0-5819 2 lcdpfqdnppncjpdcpd
+F-H0-5820 8 dnfqdpppcepddc
+F-H0-5821 3 pipppddpcdqfec
+F-H0-5822 2 fqdppqddqoncpd
+F-H0-5823 2 pjpppddpcdqfec
+F-H0-5824 2 qfdppqddqoncpd
+F-H0-5825 2 lqnqppdpqeddpc
+F-H0-5826 15 lqnqppdppjcldjcedfcdcffcdedcpd
+F-H0-5827 5 kpnqppdppjcldjcedfcdcffcdedcpd
+F-H0-5828 14 iphqfqdpppcnfoddpd
+F-H0-5829 2 dbdpppcffeddpdhcfc
+F-H0-5830 7 fqdpopcipddc
+F-H0-5831 4 mppqdpqkedpd
+F-H0-5832 16 orqqqrqppqdpnppopd
+F-H0-5833 2 rrqqqrqppqdpnppopd
+F-H0-5834 10 qqlqnqppdpddpd
+F-H0-5835 9 nolqnqppdpddpd
+F-H0-5836 19 qrqqpqdpnppopd
+F-H0-5837 6 lqnqppdqpjecpd
+F-H0-5838 4 npnqppdqpjecpd
+F-H0-5839 3 pfeqppncpjdcpd
+F-H0-5840 3 kdeqppncpjdcpd
+F-H0-5841 2 nonqppdqpjecpd
+F-H0-5842 18 dfppdpfeidqdddfc
+F-H0-5843 3 cnfqipqpdpfoddpd
+F-H0-5844 6 ncpppddpdcqf
+F-H0-5845 5 hqfqdpppcdpd
+F-H0-5846 5 fpcnpqpddpdd
+F-H0-5847 2 idppcppdddfc
+F-H0-5848 2 cfqndqpdppdd
+F-H0-5849 14 dddqppqd
+F-H0-5850 5 cddqppqd
+F-H0-5851 9 ddpqdpqc
+F-H0-5852 7 dcpqdpqc
+F-H0-5853 3 cdpqdpqc
+F-H0-5854 16 fcppdpfedgdedcpd
+F-H0-5855 4 gcppdpfedgdedcpd
+F-H0-5856 4 edppdopc
+F-H0-5857 3 oqdqpedd
+F-H0-5858 14 fqdpppjjddpd
+F-H0-5859 5 pjdpppjjddpd
+F-H0-5860 3 qjppdpjjpddd
+F-H0-5861 5 dodqppcedcpd
+F-H0-5862 5 lpoqqpcpddpd
+F-H0-5863 4 pfdppqqoddpc
+F-H0-5864 3 eddqppcedcpd
+F-H0-5865 20 qlqpqjdpqipkqhpjphpipdohndqfddof
+F-H0-5866 5 eqdrhqfqdpcqcnppddpd
+F-H0-5867 3 pfppqhdppdqfddrdncqc
+F-H0-5868 12 cnjppqdpqoddpd
+F-H0-5869 3 cjjppqdpqoddpd
+F-H0-5870 3 fqdpppjdqeddpc
+F-H0-5871 2 qlpjoqpdqpdddp
+F-H0-5872 9 cqdrdpfqdnppdcpd
+F-H0-5873 4 qfbpqpcnfppddpdd
+F-H0-5874 3 gqdrdpfqdnppdcpd
+F-H0-5875 16 dfpqdpfeddpdhcfc
+F-H0-5876 2 ncppqhcppdqfddof
+F-H0-5877 7 qhpppddojdqfdd
+F-H0-5878 5 pfpppddojdqfdd
+F-H0-5879 3 kpnqppdppjedpd
+F-H0-5880 2 pnnqppdppjedpd
+F-H0-5881 2 jdnqppdppjedpd
+F-H0-5882 8 nplppqdppkddpd
+F-H0-5883 3 polppqdppkddpd
+F-H0-5884 3 cfpppddpiddhcd
+F-H0-5885 2 iplppqdppkddpd
+F-H0-5886 11 onppqnjppmdppdqoddpn
+F-H0-5887 2 mcppdppjmdpdddndncoc
+F-H0-5888 4 ndpppepc
+F-H0-5889 3 qcpppepc
+F-H0-5890 2 eppqpopd
+F-H0-5891 2 ecdpdedc
+F-H0-5892 2 ddpqpopd
+F-H0-5893 20 dofqdqcqipppdpcpdcpd
+F-H0-5894 6 fqdpkqqjqpddpd
+F-H0-5895 3 mcppcidppdjcdc
+F-H0-5896 2 lcppcidppdjcdc
+F-H0-5897 18 cqdppqpofqeocnddpd
+F-H0-5898 18 qpqrqqpqdpnppopd
+F-H0-5899 8 ncppdppjdepd
+F-H0-5900 5 ncppdopjddpd
+F-H0-5901 2 ndppdppjdepd
+F-H0-5902 8 qidpppdepc
+F-H0-5903 4 dqdopqddpd
+F-H0-5904 4 idpppdepcd
+F-H0-5905 2 fcdopqddpd
+F-H0-5906 14 oqopqpdppdpncd
+F-H0-5907 3 cnopqpdppdpncd
+F-H0-5908 2 qnopqpdppdpncd
+F-H0-5909 8 pkrppqdpfqqnjpcnpoqmpnddpd
+F-H0-5910 7 pmrppqdpfqqnjpcnpoqmpnddpd
+F-H0-5911 4 plrppqdpfqqnjpcnpoqmpnddpd
+F-H0-5912 2 rqrppqdpfqqnjpcnpoqmpnddpd
+F-H0-5913 9 ceppdqdcqd
+F-H0-5914 3 edppdqcdqd
+F-H0-5915 3 qnppdqcdqd
+F-H0-5916 2 eqqpcpddpc
+F-H0-5917 2 nqppdqcdqd
+F-H0-5918 14 cfpqdqpdddfc
+F-H0-5919 2 jpfqdpppdcpc
+F-H0-5920 2 npnqppdppcdc
+F-H0-5921 11 qleqfqdqppcpjpqnfpcnepdcpd
+F-H0-5922 5 dfpqdpqfodcfndqdjdpcddocnc
+F-H0-5923 2 pfpqponqqnqppncppjqopdncdd
+F-H0-5924 2 nqeqfqdqppcpjpqnfpcnepdcpd
+F-H0-5925 16 epcpppecpd
+F-H0-5926 3 jdpqpdcodd
+F-H0-5927 2 eqcpppecpd
+F-H0-5928 2 pqdqpdqodd
+F-H0-5929 13 pdcqddqp
+F-H0-5930 5 pqdqpdcc
+F-H0-5931 8 mqppdpqoqmqhqjqdddoc
+F-H0-5932 4 qfcepppddpocmchcjcdc
+F-H0-5933 2 jcppdpqoqmqhqjqdddoc
+F-H0-5934 2 jecepppddpocmchcjcdc
+F-H0-5935 9 ccqppddpfdcfddbd
+F-H0-5936 3 clbpppcnfpqddpdd
+F-H0-5937 2 edrpppqnnppddpcd
+F-H0-5938 2 gepqdppddffcdddb
+F-H0-5939 20 jddpppdfhehdfeddpdicidhcfc
+F-H0-5940 11 hpeqcpppqdddoc
+F-H0-5941 2 ipeqcpppqdddoc
+F-H0-5942 2 doeqcpppqdddoc
+F-H0-5943 2 dneqcpppqdddoc
+F-H0-5944 21 dnpqipfqdpfodcpd
+F-H0-5945 5 oooqqpdplponcdpd
+F-H0-5946 4 mcppdqqephnepcdd
+F-H0-5947 2 nqdppqqoplnodcpd
+F-H0-5948 19 erdrdqfqipcqdpppdocpdcpd
+F-H0-5949 14 crerdrdqfqipcqdpppdocpdcpd
+F-H0-5950 13 qdjjpdqc
+F-H0-5951 19 eqdrercrdqfqipcqdpppdocpdcpd
+F-H0-5952 14 omqlqpqjdpqipkqhpjphpipdohndqfddof
+F-H0-5953 3 lplqpqjqfqiqkphqjphpipdphodnfoddpd
+F-H0-5954 2 gplqpqjqfqiqkphqjphpipdphodnfoddpd
+F-H0-5955 21 dqppcqdpcncppddjcd
+F-H0-5956 8 pnnqmqnplqlpppdpkplopjddpd
+F-H0-5957 4 jqnqmqnplqlpppdpkplopjddpd
+F-H0-5958 3 prnqmqnplqlpppdpkplopjddpd
+F-H0-5959 2 mddppplepjndpdldkdddmcnclc
+F-H0-5960 17 qcdppppfodqddd
+F-H0-5961 19 cpcqppcndppddjcd
+F-H0-5962 13 oeppphdpddpepcmd
+F-H0-5963 3 pdppphdpddpepcmd
+F-H0-5964 8 fcjqpqdpqkddpd
+F-H0-5965 2 cmcjiqpdppddcp
+F-H0-5966 2 lpjqpqdpqkddpd
+F-H0-5967 2 jpppdppdcijcdc
+F-H0-5968 10 mnppqnnponjppddpdddj
+F-H0-5969 4 jdppdpjpnepjddpfncpd
+F-H0-5970 3 qcppdpjpnepjddpfncpd
+F-H0-5971 2 hcppnqpndppjnopdddjd
+F-H0-5972 4 kddpfqcnppncjpdcpd
+F-H0-5973 3 npnqppdqpdcfjdddfc
+F-H0-5974 3 jddpfqcnppncjpdcpd
+F-H0-5975 3 pfdpfqcnppncjpdcpd
+F-H0-5976 2 qlqnppqddpdddjfccf
+F-H0-5977 19 epdqppcqdpcncppddjcd
+F-H0-5978 9 ncpqdppkedpd
+F-H0-5979 3 mppqdppkedpd
+F-H0-5980 3 jdppeppiddpc
+F-H0-5981 20 pkqjqpqidpqhpjphpipdohndqfddof
+F-H0-5982 9 jpdppqcnfqddpc
+F-H0-5983 3 cnnqqnppqddpcd
+F-H0-5984 3 drdppqcnfqddpc
+F-H0-5985 15 npmqnqlqlpppdpkplopjddpd
+F-H0-5986 3 qnnqppdppddffcdddb
+F-H0-5987 2 npnqppdppddffcdddb
+F-H0-5988 12 ddoqdpqd
+F-H0-5989 4 qpcedppc
+F-H0-5990 4 cnppdqdjdcpd
+F-H0-5991 3 ceppdqdjdcpd
+F-H0-5992 3 ncppdqdjdcpd
+F-H0-5993 3 clppdqdjdcpd
+F-H0-5994 2 qjppdqdjdcpd
+F-H0-5995 9 fcppdpgedhdedcpd
+F-H0-5996 7 gcppdpgedhdedcpd
+F-H0-5997 2 eeppdpgedhdedcpd
+F-H0-5998 13 cnerdreqcrdqfqipcqdpppdocpdcpd
+F-H0-5999 8 cqpqfqbpdpcnddpd
+F-H0-6000 5 gcppcfcppdfcdddb
+F-H0-6001 5 popqfqbpdpcnddpd
+F-H0-6002 7 qndppqqjqddcoc
+F-H0-6003 4 qhdppqqjqddcoc
+F-H0-6004 3 dedppqqjqddcoc
+F-H0-6005 2 ecqpqedpcdjcpc
+F-H0-6006 2 cedppqqjqddcoc
+F-H0-6007 2 lqjqdqpdqpcdco
+F-H0-6008 10 cnppfqdppd
+F-H0-6009 4 ddppfqdppd
+F-H0-6010 2 pqdpcnddpd
+F-H0-6011 2 edppfqdppd
+F-H0-6012 7 nqdpppqnpd
+F-H0-6013 4 lqnqpppddp
+F-H0-6014 3 fpfqppdddp
+F-H0-6015 2 dpqfppddpd
+F-H0-6016 13 dqdpcqpd
+F-H0-6017 8 rnppdpqoqnqlonqhqjqdddoc
+F-H0-6018 6 dppopdjj
+F-H0-6019 3 ppjjpded
+F-H0-6020 2 cdpopdjj
+F-H0-6021 14 ddpqdpoc
+F-H0-6022 5 cpceppqd
+F-H0-6023 19 qjqpqidpqhpjphpipdohndqfddof
+F-H0-6024 8 eoqrqqorqppqdpfqponpqlcnddpd
+F-H0-6025 6 fpqrqqorqppqdpfqponpqlcnddpd
+F-H0-6026 5 dnqrqqorqppqdpfqponpqlcnddpd
+F-H0-6027 4 iqfqhqppdpipcnfodcpd
+F-H0-6028 2 eqfqhqppdpipcnfodcpd
+F-H0-6029 2 hpfqhqppdpipcnfodcpd
+F-H0-6030 18 ccdpppcgefgcdedcpd
+F-H0-6031 4 dlgqppdqdocmenddpd
+F-H0-6032 8 oopqmpjpdppkddpd
+F-H0-6033 7 pppqmpjpdppkddpd
+F-H0-6034 5 popqmpjpdppkddpd
+F-H0-6035 2 hqpqmpjpdppkddpd
+F-H0-6036 9 jppppjdpjjpddjddjd
+F-H0-6037 2 qnppjpdppjpdjjddjd
+F-H0-6038 7 nqppcpddpc
+F-H0-6039 6 coppdqddqd
+F-H0-6040 6 nqppdqddqd
+F-H0-6041 9 qnppnqpjdppddcjd
+F-H0-6042 3 noppnqpjdppddcjd
+F-H0-6043 2 nddjpppdcpjdqfdd
+F-H0-6044 10 dqppcqdpddpd
+F-H0-6045 9 cdppdppdccdd
+F-H0-6046 8 jpdpfqcmppddpd
+F-H0-6047 7 qqppnqqmdppddd
+F-H0-6048 3 bdpdppdddpgccf
+F-H0-6049 2 qngqcnpppddpdd
+F-H0-6050 8 popqdpfqcnipdcpd
+F-H0-6051 5 qnpqdpfqcnipdcpd
+F-H0-6052 4 pnpqdpfqcnipdcpd
+F-H0-6053 12 qqfqdpppqnjpcnqldcpd
+F-H0-6054 5 onfqdpppqnjpcnqldcpd
+F-H0-6055 2 plfqdpppqnjpcnqldcpd
+F-H0-6056 12 qpdpppqoddpc
+F-H0-6057 11 onopqpnppppolppndppdoodd
+F-H0-6058 5 mooppqnpppdpoopoplpnpddd
+F-H0-6059 3 neppoedpqdpfpdpeldodddnd
+F-H0-6060 17 poqpoplpqodppdrodd
+F-H0-6061 2 ncppdpphpepcddoboc
+F-H0-6062 6 qjqpdpjpddpd
+F-H0-6063 5 ncqpdpjpddpd
+F-H0-6064 3 qfqpdpjpddpd
+F-H0-6065 2 qlpjppdddppc
+F-H0-6066 2 pjqpdpjpddpd
+F-H0-6067 9 ddeppdoo
+F-H0-6068 4 qpeedpod
+F-H0-6069 2 opdopdee
+F-H0-6070 17 ocppdppjodoemdnepcmencpddcnd
+F-H0-6071 3 ddpqdpqlpnpd
+F-H0-6072 2 ompqdpqlpnpd
+F-H0-6073 5 pqdoqd
+F-H0-6074 4 dddoqd
+F-H0-6075 4 pqeppc
+F-H0-6076 2 dcdoqd
+F-H0-6077 2 dqdoqd
+F-H0-6078 2 ppdoqd
+F-H0-6079 5 eqdqppdkdoddpd
+F-H0-6080 4 qcqdppkddpddod
+F-H0-6081 4 gddpppdidedcpd
+F-H0-6082 3 fpdqppdkdoddpd
+F-H0-6083 2 ofqdppkddpddod
+F-H0-6084 5 pqepqd
+F-H0-6085 4 dcepqd
+F-H0-6086 3 dpdepq
+F-H0-6087 2 pqdopc
+F-H0-6088 2 ppdopc
+F-H0-6089 11 nppqdpfqpocqeocnddpd
+F-H0-6090 2 gppqdpfqpocqeocnddpd
+F-H0-6091 2 qqpqdpfqpocqeocnddpd
+F-H0-6092 2 qpqqppnqoodqdoqnpddd
+F-H0-6093 8 qnppcejpocdp
+F-H0-6094 5 cnppcejpocdp
+F-H0-6095 20 bpppdqepcqdpcncppddjcd
+F-H0-6096 7 fqjppppjdpjjpddjddjd
+F-H0-6097 5 pgjppppjdpjjpddjddjd
+F-H0-6098 4 mqjppppjdpjjpddjddjd
+F-H0-6099 2 gjjppppjdpjjpddjddjd
+F-H0-6100 2 pnjppppjdpjjpddjddjd
+F-H0-6101 8 cnfqdpdd
+F-H0-6102 3 dpcfddpd
+F-H0-6103 3 pnnqpppd
+F-H0-6104 11 jdoqdpqpddpfncpd
+F-H0-6105 4 kcoqdpqpddpfncpd
+F-H0-6106 3 pboqdpqpddpfncpd
+F-H0-6107 2 diqeppfddpddcfpc
+F-H0-6108 17 rppqdpfqqnjpdnpoddpd
+F-H0-6109 3 pnpqdpfqqnjpdnpoddpd
+F-H0-6110 16 frhqfqepdqdpcqcpppddpd
+F-H0-6111 4 qrpqqqppqpdpqnpopdqldd
+F-H0-6112 11 qjqqdpqdddoc
+F-H0-6113 6 pdoqdpqpddqc
+F-H0-6114 2 djoqdpqpddqc
+F-H0-6115 7 pfdpppjdjpddpjncpd
+F-H0-6116 4 fqdpppjdjpddpjncpd
+F-H0-6117 2 dncnppdjjppddpddpj
+F-H0-6118 2 jjdpppjdjpddpjncpd
+F-H0-6119 11 ppdpjjpddd
+F-H0-6120 3 qfdppppdjj
+F-H0-6121 5 qfdppdnccd
+F-H0-6122 2 dddppqqfpd
+F-H0-6123 2 hqfqqppddp
+F-H0-6124 2 dcdppqqfpd
+F-H0-6125 11 pedepppcdp
+F-H0-6126 3 pjcpppedpd
+F-H0-6127 19 drippqdpfqdnfodcpd
+F-H0-6128 4 ncppdpdjfddfdcpd
+F-H0-6129 2 jcppdpdjfddfdcpd
+F-H0-6130 4 npnqfqlqppjqkpiqjphqiphpmodphodnfodjpddd
+F-H0-6131 3 ogqnppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-6132 3 ooqnppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-6133 2 jcppenjpcnfpeldpdkdldjcldickegcjpdchddcf
+F-H0-6134 2 pcppdppjnepflepdgeldkdlcjdkcidjcddhcncfc
+F-H0-6135 8 nqppeqpjecpd
+F-H0-6136 7 oqppnqnpopnompmodppjdcpd
+F-H0-6137 6 cdegqpefdpdfdgpdcfjddedd
+F-H0-6138 2 ooppnqnpopnompmodppjdcpd
+F-H0-6139 19 noqpoplppmcppdoodd
+F-H0-6140 9 oedpppodpjmdnepcmencpddcnd
+F-H0-6141 5 pdppdppjddoe
+F-H0-6142 3 nqppdppjddoe
+F-H0-6143 4 gqeqcpppqcdd
+F-H0-6144 3 pkdppqqoccpd
+F-H0-6145 3 lpoqqpdpccpd
+F-H0-6146 3 odppcqqepcdd
+F-H0-6147 2 kqoqqpdpccpd
+F-H0-6148 13 cdpqdpcfdcpd
+F-H0-6149 4 depqdpcfdcpd
+F-H0-6150 7 pooqdpfqcnipddpd
+F-H0-6151 4 qpoqdpfqcnipddpd
+F-H0-6152 4 ncoqdpfqcnipddpd
+F-H0-6153 2 oooqdpfqcnipddpd
+F-H0-6154 2 qfoqdpfqcnipddpd
+F-H0-6155 12 qkpqdpqpqnqdddoc
+F-H0-6156 3 pjpqdpqpqnqdddoc
+F-H0-6157 2 qjpqdpqpqnqdddoc
+F-H0-6158 5 pqodcpddqd
+F-H0-6159 3 phppdqpepc
+F-H0-6160 3 qeppdqpepc
+F-H0-6161 2 ppodcpddqd
+F-H0-6162 2 mcodcpddqd
+F-H0-6163 10 fcdpopddod
+F-H0-6164 4 pjdpopddod
+F-H0-6165 4 dcdppqndqd
+F-H0-6166 4 dddppqndqd
+F-H0-6167 3 ocdppqndqd
+F-H0-6168 11 nqoqopqppd
+F-H0-6169 5 qnppoedpee
+F-H0-6170 3 pmppoedpee
+F-H0-6171 2 qodpooddoe
+F-H0-6172 7 fqdppqcipcdc
+F-H0-6173 3 mppqdqqkdcpd
+F-H0-6174 3 jppqdqqkdcpd
+F-H0-6175 2 nqpqdqqkdcpd
+F-H0-6176 2 gdppdppddfgcfdfcddcchcebecdb
+F-H0-6177 18 ppqpoplpnocppmoopdondd
+F-H0-6178 17 epfqhqdqdpcqcpppddpd
+F-H0-6179 7 pfqqpqqpfqdppprnjpqnpocnomddqlncpd
+F-H0-6180 5 lcqqpqqpfqdppprnjpqnpocnomddqlncpd
+F-H0-6181 4 kpnqppdpqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-6182 2 qmnqppdpqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-6183 9 qnjqdqppcoddpd
+F-H0-6184 4 fcjqdqppcoddpd
+F-H0-6185 2 fcppdpqjqdddoc
+F-H0-6186 2 qhppdpqjqdddoc
+F-H0-6187 2 jdjqdqppcoddpd
+F-H0-6188 9 qldpfqdnppqjjpddpd
+F-H0-6189 5 fcdpfqdnppqjjpddpd
+F-H0-6190 2 qmdpfqdnppqjjpddpd
+F-H0-6191 7 mppqpopldcpd
+F-H0-6192 2 oqpqpopldcpd
+F-H0-6193 5 qlppnqpnjj
+F-H0-6194 2 popdjjndqf
+F-H0-6195 2 pnpdjjndqf
+F-H0-6196 6 popqdpjpjdqkncpfdcpd
+F-H0-6197 3 hqpqdpjpjdqkncpfdcpd
+F-H0-6198 2 pnpqdpjpjdqkncpfdcpd
+F-H0-6199 18 onopqpnolppmcppdoodd
+F-H0-6200 4 dppqqedd
+F-H0-6201 4 pqdpecqd
+F-H0-6202 3 qopqqedd
+F-H0-6203 3 dodqcepd
+F-H0-6204 2 eddpqopc
+F-H0-6205 12 ncdppqponqqnqppnqopjddpd
+F-H0-6206 7 qfdpppdjcedfcdcffcdedcpd
+F-H0-6207 7 eofqfpdqdpppgogpfoepdjpddd
+F-H0-6208 17 eqfpfqdpdqgoppfogpeoepdjpddd
+F-H0-6209 5 fcopqpdppdcfdd
+F-H0-6210 3 lqnqppdppddedc
+F-H0-6211 3 dkcnppoddpddqd
+F-H0-6212 2 pnopqpdppdcfdd
+F-H0-6213 2 cenqppdppddedc
+F-H0-6214 6 dpqqpdcc
+F-H0-6215 6 pqcqddqc
+F-H0-6216 7 qpoqpddpcd
+F-H0-6217 4 qodppqcepd
+F-H0-6218 2 ecdppqcepd
+F-H0-6219 2 eddppqcepd
+F-H0-6220 9 popqdpqddcnc
+F-H0-6221 4 fcqfqpcddppc
+F-H0-6222 3 qjpqdpqddcnc
+F-H0-6223 2 pnpqdpqddcnc
+F-H0-6224 2 nddpqoddqe
+F-H0-6225 2 nqppcopdce
+F-H0-6226 2 pjdpqoddqe
+F-H0-6227 16 dmdppqpofqdncnddpd
+F-H0-6228 13 nqdrercreqfqdqcqipppdpcpdocndcpd
+F-H0-6229 3 fpdrercreqfqdqcqipppdpcpdocndcpd
+F-H0-6230 10 coppdqfpqddodd
+F-H0-6231 8 cfdppqdfpdedcd
+F-H0-6232 7 cnpqdpfqpddc
+F-H0-6233 4 dnpqdpfqpddc
+F-H0-6234 2 odcpppqnddqd
+F-H0-6235 2 pkcpppqnddqd
+F-H0-6236 10 qqpqpodppdqmcd
+F-H0-6237 6 fedppqcdpdgced
+F-H0-6238 2 obppdqqdodmcdd
+F-H0-6239 2 gddppqcdpdgced
+F-H0-6240 10 cnppcdjpqcdp
+F-H0-6241 5 nqppcqpjdcpd
+F-H0-6242 7 lpqqqppqppoqnpnqooopnompmodppjddpd
+F-H0-6243 2 bqfqfpeqdpdqcpcqgoppfogpeoepdjpddd
+F-H0-6244 6 nonqppopnpmpmodppjdcpd
+F-H0-6245 15 qhdqoqqjqpqfqlddpd
+F-H0-6246 3 ncdqoqqjqpqfqlddpd
+F-H0-6247 7 oceqppcpdcqd
+F-H0-6248 3 odeqppcpdcqd
+F-H0-6249 3 ceeqppcpdcqd
+F-H0-6250 9 omppqnjpondppmqopdpoddpn
+F-H0-6251 2 rfpfppqedppepgpdqfjdofdd
+F-H0-6252 5 poqnpponjppmdppdqoddpn
+F-H0-6253 7 phqgppqddpldofddod
+F-H0-6254 5 hedpppdhfegcdedcpd
+F-H0-6255 4 ccdpppdhfegcdedcpd
+F-H0-6256 2 digqppdqfodldoddpd
+F-H0-6257 16 qnppqpoplpnocppmoopdondd
+F-H0-6258 2 edppdqefdhdefepdeegddcdd
+F-H0-6259 15 pjpdqpndcpjdqfdd
+F-H0-6260 2 pbppdqpjncpfdcpd
+F-H0-6261 2 kdppdqpjncpfdcpd
+F-H0-6262 3 ocppqdcpddnd
+F-H0-6263 3 fdpqdpdfdcpd
+F-H0-6264 2 chpqdpdfdcpd
+F-H0-6265 2 fqdppqpnpddc
+F-H0-6266 10 nnpqppnqmpoodpnopoplonqdddoc
+F-H0-6267 7 qqpqppnqmpoodpnopoplonqdddoc
+F-H0-6268 6 dncnppcfdpqdcldc
+F-H0-6269 5 popqdpqdddnchcfc
+F-H0-6270 2 cfpqdpqdddnchcfc
+F-H0-6271 3 piqhqfpdofnd
+F-H0-6272 3 mfqhqfpdofnd
+F-H0-6273 2 rpppqnnponql
+F-H0-6274 12 qpqqdrcqiqdpfqqnppcnqlddpd
+F-H0-6275 6 pqqqdrcqiqdpfqqnppcnqlddpd
+F-H0-6276 20 fqppdqepcqdpbqcpbpcocnbopddjcd
+F-H0-6277 3 pnqpoqdp
+F-H0-6278 2 pppdeccd
+F-H0-6279 15 qhdpfqcnppqjjpqfqlddpd
+F-H0-6280 10 poircqdrippqdpfqdnfodcpd
+F-H0-6281 2 ciircqdrippqdpfqdnfodcpd
+F-H0-6282 2 gpircqdrippqdpfqdnfodcpd
+F-H0-6283 2 ncircqdrippqdpfqdnfodcpd
+F-H0-6284 8 cqjqpqdpfqddpd
+F-H0-6285 7 cnjqpqdpfqddpd
+F-H0-6286 19 codqppcqepbqdpbpcpcnbopddjcd
+F-H0-6287 8 qpdppqqnqddcoc
+F-H0-6288 7 qldppqqnqddcoc
+F-H0-6289 7 dnfqppdqepcqdpbqcpbpcocnbopddjcd
+F-H0-6290 4 podrercreqpqdqfqjpcqdpcpdocnddpd
+F-H0-6291 3 emdrercreqpqdqfqjpcqdpcpdocnddpd
+F-H0-6292 5 cnfqdpqpecpd
+F-H0-6293 3 jpfqdpqpecpd
+F-H0-6294 2 didqqeppddcf
+F-H0-6295 2 qhpqcedppdqf
+F-H0-6296 2 npfqdpqpecpd
+F-H0-6297 14 jppqnqoqopqpnpqndppd
+F-H0-6298 2 dcpqnqoqopqpnpqndppd
+F-H0-6299 3 fqcnpppddp
+F-H0-6300 3 dddpppncpd
+F-H0-6301 2 nddpppncpd
+F-H0-6302 2 pfdpppncpd
+F-H0-6303 2 lcdpppncpd
+F-H0-6304 11 pldppqpofqcnjpdcpd
+F-H0-6305 2 qmdppqpofqcnjpdcpd
+F-H0-6306 2 eefqcnqpdjdppdedcd
+F-H0-6307 2 qodppqpofqcnjpdcpd
+F-H0-6308 5 fqdppqddqe
+F-H0-6309 4 cjdpqoddpc
+F-H0-6310 9 nqppdpciddcffcpdccbd
+F-H0-6311 4 qfppdpciddcffcpdccbd
+F-H0-6312 2 ncdrcqiqppfqdppdcndd
+F-H0-6313 7 dppeqpddpc
+F-H0-6314 3 dcdppqpoqd
+F-H0-6315 3 hddpcdedpc
+F-H0-6316 6 qodppqpnqdddoc
+F-H0-6317 3 kdppcedpqdnddc
+F-H0-6318 3 npdppqpnqdddoc
+F-H0-6319 2 qpdppqpnqdddoc
+F-H0-6320 2 qldppqpnqdddoc
+F-H0-6321 14 cfqpqedpcdgdpcedecfcdc
+F-H0-6322 2 pjdppqpoqpqnqopmqddcoc
+F-H0-6323 12 qnoqpqppqpdpqopoqdddoc
+F-H0-6324 3 qqoqpqppqpdpqopoqdddoc
+F-H0-6325 2 bdppqedpcdcepcedecdddc
+F-H0-6326 5 pcqdjjpdqc
+F-H0-6327 7 drfqdpppcnckcedgcdcffcdedcpd
+F-H0-6328 2 eqfqdpppcnckcedgcdcffcdedcpd
+F-H0-6329 2 pjkqnqfqeqgpdqepppqncppdcndd
+F-H0-6330 9 cidpppddcffcpdccbd
+F-H0-6331 5 pldppqqoqdddoc
+F-H0-6332 4 kcppcedpqdocdc
+F-H0-6333 3 pmdppqqoqdddoc
+F-H0-6334 2 opdppqqoqdddoc
+F-H0-6335 2 qjdppqqoqdddoc
+F-H0-6336 10 onpqmpfqdpoopoplddpd
+F-H0-6337 12 pnnqppqddpddqioc
+F-H0-6338 3 fqpqkqqodpcnddpd
+F-H0-6339 2 dkpqkqqodpcnddpd
+F-H0-6340 9 qcppdppjncoedcpd
+F-H0-6341 3 ldppdppjncoedcpd
+F-H0-6342 2 jdppdppjncoedcpd
+F-H0-6343 6 drdpfqdnopddpd
+F-H0-6344 5 pjpddpndpoddqf
+F-H0-6345 2 jqdpfqdnopddpd
+F-H0-6346 2 ipdpfqdnopddpd
+F-H0-6347 2 qpdpfqdnopddpd
+F-H0-6348 9 pmqpoplpdpdcpd
+F-H0-6349 6 nopqdpplpocdpd
+F-H0-6350 9 oqeqqpdcpd
+F-H0-6351 4 opqppdcodc
+F-H0-6352 2 doeqqpdcpd
+F-H0-6353 15 cfqpdpcededcpd
+F-H0-6354 10 efchpppdcojdcfdd
+F-H0-6355 4 qnlqnqppeqpjddpd
+F-H0-6356 4 ccchpppdcojdcfdd
+F-H0-6357 19 oqpqppqpdpqopoqdddoc
+F-H0-6358 4 mpkqpqdpqkddpd
+F-H0-6359 3 fqpppddpcdciic
+F-H0-6360 2 ekckiqpdppddcp
+F-H0-6361 2 qnpppddpcdciic
+F-H0-6362 11 cppqipfqfpcqdpcnddpd
+F-H0-6363 4 eqpqipfqfpcqdpcnddpd
+F-H0-6364 9 jkkkkjjj
+F-H0-6365 10 pppqmpfqdpooponoonplddpd
+F-H0-6366 4 kddpppncpdeccd
+F-H0-6367 4 pfdpppncpdeccd
+F-H0-6368 2 hddpppncpdeccd
+F-H0-6369 2 lcdpppncpdeccd
+F-H0-6370 2 ipnqppeqcpddpd
+F-H0-6371 2 donqppeqcpddpd
+F-H0-6372 2 qfdpppncpdeccd
+F-H0-6373 15 gddpppcfpdddfcgcdb
+F-H0-6374 3 mrmqprppnqqndppddd
+F-H0-6375 2 fddpppcfpdddfcgcdb
+F-H0-6376 5 pnpqndcpddqd
+F-H0-6377 4 qqqpnpcddppc
+F-H0-6378 4 popqndcpddqd
+F-H0-6379 3 qodcqe
+F-H0-6380 3 ppdcqe
+F-H0-6381 2 dqqpoc
+F-H0-6382 17 fqeqpqcpepddpd
+F-H0-6383 3 dpeqpqcpepddpd
+F-H0-6384 5 eoppdpdocpcoddpd
+F-H0-6385 3 edppdpdeddcecdpd
+F-H0-6386 7 oodpqpqopppoddpc
+F-H0-6387 5 opdpqpqopppoddpc
+F-H0-6388 6 pldppqpoecpd
+F-H0-6389 3 cedpoqdedcpd
+F-H0-6390 3 gcdpqopdcded
+F-H0-6391 2 ooopqpdpcepd
+F-H0-6392 20 cqdrippqdpfqdnfodcpd
+F-H0-6393 19 bodqppcqepbpdpcncppddjcd
+F-H0-6394 15 qqrpppqnnponcppdpkdd
+F-H0-6395 2 gqdripfqdpppdnfodcpd
+F-H0-6396 7 cpppdpcoddpd
+F-H0-6397 5 cnfqdppoddpd
+F-H0-6398 5 dnfqdppoddpd
+F-H0-6399 3 hcppdppeddfc
+F-H0-6400 2 kddpppdepdnc
+F-H0-6401 19 ircqdrippqdpfqdnfodcpd
+F-H0-6402 14 bpjqpqfpqodpcnddpd
+F-H0-6403 2 djjqpqfpqodpcnddpd
+F-H0-6404 13 dqcqgqppcpepdcpd
+F-H0-6405 3 bqcqgqppcpepdcpd
+F-H0-6406 9 ocjjqdqcpdpc
+F-H0-6407 3 edjjdddccdcc
+F-H0-6408 2 ncjjqdqcpdpc
+F-H0-6409 5 deppefdppdcfjdcdddccdc
+F-H0-6410 3 mcdpppddpjqcnepcqdncpd
+F-H0-6411 2 ehppefdppdcfjdcdddccdc
+F-H0-6412 12 qqpqppoqopnqnpqpqomppddpdd
+F-H0-6413 2 mopqppoqopnqnpqpqomppddpdd
+F-H0-6414 14 nomppqdpfqpoooonplddpd
+F-H0-6415 11 jpdppqcnfqecpd
+F-H0-6416 6 ipdppqcnfqecpd
+F-H0-6417 5 plpopqpdcpcd
+F-H0-6418 5 ecpqdqpdcded
+F-H0-6419 2 edpopqpdcpcd
+F-H0-6420 18 qppppqdpqopoqdddoc
+F-H0-6421 9 qiqhppqedppdpindqfjdofdd
+F-H0-6422 6 rfqhppqedppdpindqfjdofdd
+F-H0-6423 11 fcppdpdedhpddcedebec
+F-H0-6424 8 rnopqpqolppodppdrodd
+F-H0-6425 17 ccdfpppdedcd
+F-H0-6426 17 kqnqfqeqgpdqepppqncppdcndd
+F-H0-6427 11 qfcqpppddd
+F-H0-6428 5 ddppdpccpd
+F-H0-6429 10 onpqdpfqpoqmddpd
+F-H0-6430 7 qqmqopqppddpddqf
+F-H0-6431 8 jpdppqcnfqddqd
+F-H0-6432 2 bpfqcnppcddppc
+F-H0-6433 16 ndpppicppdqfddof
+F-H0-6434 15 qcdpppnepjncpfdcpdpbkd
+F-H0-6435 7 popqdpqddfkcddfc
+F-H0-6436 3 qjpqdpqddfkcddfc
+F-H0-6437 2 jppqdpqddfkcddfc
+F-H0-6438 2 qnpqdpqddfkcddfc
+F-H0-6439 2 jqcnppcifpqddpdc
+F-H0-6440 6 cqdpfqcmppcecfcddedcpd
+F-H0-6441 5 dfdpfqcmppcecfcddedcpd
+F-H0-6442 6 fdpqdppdpncd
+F-H0-6443 3 qqqpnpdppddc
+F-H0-6444 3 peppfpcpddpc
+F-H0-6445 2 fcpqdppdpncd
+F-H0-6446 3 fcdpnpddpf
+F-H0-6447 2 fqdpnpddpf
+F-H0-6448 14 ccdpppgddedcpd
+F-H0-6449 13 nqpppqmpfqdpooponoonplddpd
+F-H0-6450 9 qcpipppdcpjdqfdd
+F-H0-6451 5 qnppnqkpdppjdcpd
+F-H0-6452 4 noppnqkpdppjdcpd
+F-H0-6453 7 qkqrqqorqppqdpnppopd
+F-H0-6454 7 qlqrqqorqppqdpnppopd
+F-H0-6455 7 ncpqdpjpdjpkddpd
+F-H0-6456 6 jdpqdpjpdjpkddpd
+F-H0-6457 2 cjqppdkpjddpddpj
+F-H0-6458 18 cdefpppddpjdcfddccdc
+F-H0-6459 7 ceppdpdgeeefeddedcpd
+F-H0-6460 5 fnppdqdoepeneodmddpd
+F-H0-6461 3 nqppdqdoepeneodmddpd
+F-H0-6462 5 fqdpppcdpjecpd
+F-H0-6463 4 jddpppcdpjecpd
+F-H0-6464 3 jpppdpqddjocdd
+F-H0-6465 2 jjcepppdjpdcdp
+F-H0-6466 12 jpppnqpndppjdcpd
+F-H0-6467 3 prppnqpndppjdcpd
+F-H0-6468 11 pndpkqcnfqqmqpqjqgddpd
+F-H0-6469 5 pkdpkqcnfqqmqpqjqgddpd
+F-H0-6470 9 edjqppqddpcd
+F-H0-6471 4 ecjqppqddpcd
+F-H0-6472 2 pjpqdpcjddpc
+F-H0-6473 12 pmiqqnpppdcpddpn
+F-H0-6474 20 bqppdqepcqdpbpcpcnbopddjcd
+F-H0-6475 9 qqpqpndpddpd
+F-H0-6476 3 fqdppppdfdcd
+F-H0-6477 2 fqqpnpdpddpd
+F-H0-6478 6 odqfmeocpdlcnd
+F-H0-6479 5 iqfqhqppdpipcnfoddpd
+F-H0-6480 4 hpfqhqppdpipcnfoddpd
+F-H0-6481 4 eqfqhqppdpipcnfoddpd
+F-H0-6482 14 nqoqpqopnpmpnodpplpopddd
+F-H0-6483 7 qfppdppdcfidddfc
+F-H0-6484 3 qnpppddpdddifccf
+F-H0-6485 3 ncppdppdcfidddfc
+F-H0-6486 3 qjfqdpppcnipddpd
+F-H0-6487 4 moopmqdpqpnoddpd
+F-H0-6488 4 qmopmqdpqpnoddpd
+F-H0-6489 4 cddpppefcgdedcpd
+F-H0-6490 2 djdpppefcgdedcpd
+F-H0-6491 5 fqdppqdjqdddoc
+F-H0-6492 4 qodppqdjqdddoc
+F-H0-6493 3 jpdppqdjqdddoc
+F-H0-6494 2 djppdqpjcdpdec
+F-H0-6495 14 npoppqmpnodpplpopddd
+F-H0-6496 9 rnpqqqfqqpppdpjpqnpodnqlddpd
+F-H0-6497 3 pnpqqqfqqpppdpjpqnpodnqlddpd
+F-H0-6498 6 ohcnppdjjpqhfppddpddpj
+F-H0-6499 3 cnnqppjppndppjddpdhcjd
+F-H0-6500 2 djhqppdpjpjdpjddpfncpd
+F-H0-6501 9 cqipfqfpppdpgpfocnddpd
+F-H0-6502 6 eqipfqfpppdpgpfocnddpd
+F-H0-6503 2 dqipfqfpppdpgpfocnddpd
+F-H0-6504 9 qppqmpppdpqopopnooplqnpddd
+F-H0-6505 6 mcqdpppddpndpgldoeddodocnc
+F-H0-6506 2 mdqdpppddpndpgldoeddodocnc
+F-H0-6507 14 pnmppqdppppoqoooplqnpddd
+F-H0-6508 7 nedpppdjjpjdpjddjjncpd
+F-H0-6509 5 npnqppjppjdpjjdjpdddjd
+F-H0-6510 3 pfdpppdjjpjdpjddjjncpd
+F-H0-6511 2 fqdpppdjjpjdpjddjjncpd
+F-H0-6512 14 efdqppeededcpd
+F-H0-6513 5 ccdqppeededcpd
+F-H0-6514 8 qmpqdpfqqnqponjpcnpmqkqiddpd
+F-H0-6515 5 pnpqdpfqqnqponjpcnpmqkqiddpd
+F-H0-6516 6 coppdqdopd
+F-H0-6517 2 dnepcpddpd
+F-H0-6518 2 gqepcpddpd
+F-H0-6519 2 hpepcpddpd
+F-H0-6520 2 cfdpmqrnppqnqoonqlpkqhqjqdddoc
+F-H0-6521 7 pldppqpopdedcd
+F-H0-6522 5 ecdppqpopdedcd
+F-H0-6523 2 npdppqpopdedcd
+F-H0-6524 15 enpqdpfqpocndndmddpd
+F-H0-6525 16 icdppqcfpdddfcccdb
+F-H0-6526 13 pgpipqpfdppdqfddnc
+F-H0-6527 3 qcppdppdqfndcdkdnc
+F-H0-6528 12 epdqdpcqpd
+F-H0-6529 2 fpdqdpcqpd
+F-H0-6530 9 dfqpdpcecfcddedcpd
+F-H0-6531 4 dgqpdpcecfcddedcpd
+F-H0-6532 2 depqnqoqopqpdpdcpd
+F-H0-6533 5 ecppqddpcdedoc
+F-H0-6534 4 ldppqddpcdodec
+F-H0-6535 3 gdppqddpcdedoc
+F-H0-6536 2 npdppqpoqeddpc
+F-H0-6537 4 jdppqnnpondpolqlpkplpjqkpiqjogqhpdqfdd
+F-H0-6538 3 npnqfqlqppjqkpiqjphqiphpmodphodnfoddpd
+F-H0-6539 2 pnnqfqlqppjqkpiqjphqiphpmodphodnfoddpd
+F-H0-6540 4 dndqqpcedcpd
+F-H0-6541 3 lpoqqpcpdcpd
+F-H0-6542 3 didqqpcedcpd
+F-H0-6543 2 dodqqpcedcpd
+F-H0-6544 2 kqoqqpcpdcpd
+F-H0-6545 5 qnnqppdpcjcedfcdcffcdedcpd
+F-H0-6546 4 pnnqppdpcjcedfcdcffcdedcpd
+F-H0-6547 3 lqnqppdpcjcedfcdcffcdedcpd
+F-H0-6548 2 kpnqppdpcjcedfcdcffcdedcpd
+F-H0-6549 9 nqpppqopoqqoqppddpcd
+F-H0-6550 4 nppppqopoqqoqppddpcd
+F-H0-6551 2 ropppqopoqqoqppddpcd
+F-H0-6552 2 rppppqopoqqoqppddpcd
+F-H0-6553 14 qomppqdppppoploopddd
+F-H0-6554 5 mqopqppdcocd
+F-H0-6555 3 dhpqeqdedcpd
+F-H0-6556 2 oqopqppdcocd
+F-H0-6557 10 qodqpqpoqdddoc
+F-H0-6558 5 pldqpqpoqdddoc
+F-H0-6559 2 gcppqecpcdedpc
+F-H0-6560 9 cepppddodc
+F-H0-6561 3 ncdpppedqd
+F-H0-6562 2 fcepqpddpd
+F-H0-6563 5 qmdppqpoddpc
+F-H0-6564 4 fqopqpcpddpd
+F-H0-6565 4 ldppdpodqdcd
+F-H0-6566 2 cedqppdedcpd
+F-H0-6567 8 ddpjdpjj
+F-H0-6568 6 dpjjpddj
+F-H0-6569 2 dpjpddjj
+F-H0-6570 2 cdjppdjj
+F-H0-6571 8 bbdpppcgdegcpddccdcbcc
+F-H0-6572 7 egdpppcgdegcpddccdcbcc
+F-H0-6573 5 pecdqopc
+F-H0-6574 3 dppqecqd
+F-H0-6575 2 copqecqd
+F-H0-6576 2 dqpqecqd
+F-H0-6577 14 dbdpppdffeidqdddfc
+F-H0-6578 3 lpipfqdpqpdnfoddpd
+F-H0-6579 7 nqqnpppddpddcifccfccbd
+F-H0-6580 6 pfcqdrdpiqcnfqddppncpd
+F-H0-6581 10 qcdppqddpkncpfpbpd
+F-H0-6582 3 fqdppqddpkncpfpbpd
+F-H0-6583 3 jpdppqddpkncpfpbpd
+F-H0-6584 2 qgpppddpndqfidrdcd
+F-H0-6585 5 popqdpfqpnjpcnqoddpd
+F-H0-6586 5 qnpqdpfqpnjpcnqoddpd
+F-H0-6587 3 pipqdpfqpnjpcnqoddpd
+F-H0-6588 3 qfpqdpfqpnjpcnqoddpd
+F-H0-6589 5 nnpqppnqmpfqdpooponoonplddpd
+F-H0-6590 5 qqpqppnqmpfqdpooponoonplddpd
+F-H0-6591 11 dpnpddpf
+F-H0-6592 3 dodfppnd
+F-H0-6593 2 cpdfppnd
+F-H0-6594 14 pppqqqqppodppdqmdd
+F-H0-6595 11 cddpqpcfcededcpd
+F-H0-6596 7 hpeppppdcpddqf
+F-H0-6597 3 cmppdqdoddpdnc
+F-H0-6598 3 qodppqpopdddfc
+F-H0-6599 2 cfdppqpopdddfc
+F-H0-6600 9 oodppqpofqdnipddpd
+F-H0-6601 5 pldppqpofqdnipddpd
+F-H0-6602 2 pmdppqpofqdnipddpd
+F-H0-6603 2 fdppdppfkddencpddc
+F-H0-6604 5 kpjqfqiqpphqjphpipdphocnfodcpd
+F-H0-6605 3 chpqpddpjdcfdd
+F-H0-6606 3 dfpqpddpjdcfdd
+F-H0-6607 17 poqqpqqpfqdpppqnjpdnqlddpd
+F-H0-6608 13 qjqnpponnpolcppkqlpjplpdqkdd
+F-H0-6609 9 peodpd
+F-H0-6610 4 qppopp
+F-H0-6611 3 oeodpd
+F-H0-6612 17 qnpqmpppdpqopoploopddd
+F-H0-6613 14 lqprqpnqoppddpcdpjncqf
+F-H0-6614 2 plrppqdpfqqnjpcnpodcpd
+F-H0-6615 11 nqppdpqjddpd
+F-H0-6616 3 jppdppdddpjc
+F-H0-6617 2 qjpdppdddpjc
+F-H0-6618 16 ccdppqfddedcpd
+F-H0-6619 4 molqfqjqppiqkphqjphpipdphocnfodcpd
+F-H0-6620 2 lplqfqjqppiqkphqjphpipdphocnfodcpd
+F-H0-6621 2 ncppdpdjgddfdcpd
+F-H0-6622 2 clppdpdjgddfdcpd
+F-H0-6623 5 lqfqjqppiqkphqjphpipdphocnfodcpd
+F-H0-6624 5 jqfqiqpphqjphpipdphocnfodcpd
+F-H0-6625 13 qoqqpqppqppodppdqmdd
+F-H0-6626 14 docqppcpdpccpd
+F-H0-6627 6 fcppdqdocpcncocfddpd
+F-H0-6628 4 jpnqpqfqoqopqppddpdd
+F-H0-6629 2 kpnqeqfqdqeppppdcpdd
+F-H0-6630 2 clppdpcncecfcddedcpd
+F-H0-6631 2 kcpppddpcdedecncdcfc
+F-H0-6632 6 plcppqpoddpd
+F-H0-6633 4 fddpppdedcqd
+F-H0-6634 3 qmcppqpoddpd
+F-H0-6635 2 epcppqpoddpd
+F-H0-6636 2 ecdqpppdcded
+F-H0-6637 17 cnfqeqppdqfpcpepdc
+F-H0-6638 12 qppqqqfqdpppqnjpdnqlddpd
+F-H0-6639 4 ppjjpc
+F-H0-6640 3 pqjjqd
+F-H0-6641 2 dpjjpc
+F-H0-6642 2 oejjqp
+F-H0-6643 2 ddjjpc
+F-H0-6644 15 kbppdppjnepfncpddckdpbqc
+F-H0-6645 2 ngppdppjnepfncpddckdpbqc
+F-H0-6646 17 fofqipppfpgpdpcnddpd
+F-H0-6647 17 nrpqoqnqopnpmpnodpplpopddd
+F-H0-6648 11 jpeqfqdqppcpfpcnepdc
+F-H0-6649 2 ddpqnqoqopqpnpqndppc
+F-H0-6650 2 jpdppjpdjjdddj
+F-H0-6651 2 pjppjpdpjjpdjd
+F-H0-6652 6 occqpqddqd
+F-H0-6653 5 fccqpqddqd
+F-H0-6654 4 dpcqpqddqd
+F-H0-6655 7 gpppepcpfoeopddoddcf
+F-H0-6656 5 nnpqdpfqpooponooddpd
+F-H0-6657 5 pnpqdpfqpooponooddpd
+F-H0-6658 9 ppcqddpd
+F-H0-6659 4 ddpppdcc
+F-H0-6660 2 pqdpddqc
+F-H0-6661 6 qhdpppqjqdddod
+F-H0-6662 2 mcppdedppdjcdc
+F-H0-6663 3 cpppeqpdcd
+F-H0-6664 2 fqdpoqddqd
+F-H0-6665 12 codppqpofqencndndmddpd
+F-H0-6666 2 cpdppqpofqencndndmddpd
+F-H0-6667 2 cqdppqpofqencndndmddpd
+F-H0-6668 17 pqqqfqdpppqnjpdnqlddpd
+F-H0-6669 9 cfdrercrhqqqeqnqdqfqrpcqdpppdocpqncnqkpdddfc
+F-H0-6670 8 hcdrercrhqqqeqnqdqfqrpcqdpppdocpqncnqkpdddfc
+F-H0-6671 9 crppeqhpfpcppddndd
+F-H0-6672 4 ccdpppdhdffdcedcpd
+F-H0-6673 9 popqdppdcficddfcccdb
+F-H0-6674 3 nqpppdcpddqiqcqfncrd
+F-H0-6675 3 qnpqdppdcficddfcccdb
+F-H0-6676 16 pfpqpidppdqfddnc
+F-H0-6677 7 dhopdpdedcpd
+F-H0-6678 4 ceopdpdedcpd
+F-H0-6679 2 qpopdpdedcpd
+F-H0-6680 2 mqopqpdedppd
+F-H0-6681 2 ndeppppepcdd
+F-H0-6682 4 pldppqpopddfjdddfc
+F-H0-6683 3 npdppqpopddfjdddfc
+F-H0-6684 3 qmdppqpopddfjdddfc
+F-H0-6685 3 qodppqpopddfjdddfc
+F-H0-6686 13 jpdppqjdpkncpfdcpd
+F-H0-6687 2 fqdppqjdpkncpfdcpd
+F-H0-6688 4 dbdpqocfpdddfc
+F-H0-6689 4 jddpqocfpdddfc
+F-H0-6690 18 oqpqopnpmpnodpplpopddd
+F-H0-6691 12 oomppqdpkppoqkddpd
+F-H0-6692 16 qopqppoqopqppddpcd
+F-H0-6693 4 qfdpncpd
+F-H0-6694 3 fqdpqfpd
+F-H0-6695 18 pqppoqopqppddpcd
+F-H0-6696 12 cfdpqppdcdfdeceddcfc
+F-H0-6697 2 eddppqdfcecfcddedcpd
+F-H0-6698 8 onqpoqlppddpcd
+F-H0-6699 4 eddppqdhcedcpd
+F-H0-6700 3 fpppeqhpqdcpdd
+F-H0-6701 3 eedppqdhcedcpd
+F-H0-6702 7 ncdppqjdqdddfc
+F-H0-6703 6 nqppqndpcdpjpc
+F-H0-6704 3 qqppqndpcdpjpc
+F-H0-6705 5 qoiqqnpppmcppdpnddon
+F-H0-6706 4 qqiqqnpppmcppdpnddon
+F-H0-6707 8 qlrppqdpfqqnjpdnpoddpd
+F-H0-6708 4 plrppqdpfqqnjpdnpoddpd
+F-H0-6709 4 pnrppqdpfqqnjpdnpoddpd
+F-H0-6710 13 pqoqppnqnpmpnodppjddpd
+F-H0-6711 11 nnqppplpopcpnooopmqnpdondd
+F-H0-6712 6 qqqppplpopcpnooopmqnpdondd
+F-H0-6713 13 erdrdqfqjpcqdpppdocpddpd
+F-H0-6714 9 lqnqpppddpndpjcdqf
+F-H0-6715 2 npnqpppddpndpjcdqf
+F-H0-6716 2 npdpfqqnppdnjpdcpd
+F-H0-6717 7 qfpdpojddodd
+F-H0-6718 3 ejppeppjedpd
+F-H0-6719 2 jppdpojddodd
+F-H0-6720 6 mppqjppkdppdddjd
+F-H0-6721 3 djpqjppkdppdddjd
+F-H0-6722 2 edpjpppddpiddjcd
+F-H0-6723 2 qlpjpppddpiddjcd
+F-H0-6724 16 rcppdpodpfddqdqc
+F-H0-6725 17 bcppdfedpdcccd
+F-H0-6726 3 cnpqdpfqdcqd
+F-H0-6727 3 ippqdpfqdcqd
+F-H0-6728 3 popqdpfqdcqd
+F-H0-6729 2 fpcnqpcddppc
+F-H0-6730 2 odpqdpfqdcqd
+F-H0-6731 2 jppqdpfqdcqd
+F-H0-6732 5 pjdpppeepd
+F-H0-6733 4 fceoppddpd
+F-H0-6734 3 dddpppeepd
+F-H0-6735 2 cddpppeepd
+F-H0-6736 2 jcdpppeepd
+F-H0-6737 7 qcppdppjncpddcjd
+F-H0-6738 5 neppdppjncpddcjd
+F-H0-6739 4 qfppdppjncpddcjd
+F-H0-6740 2 pmppnqjpdqpjddpd
+F-H0-6741 14 dqfqjpcqdpppddpd
+F-H0-6742 13 npqnppondppdpjdd
+F-H0-6743 2 ncpppjdppdqfddof
+F-H0-6744 5 idpqmppojpqkdppdddfc
+F-H0-6745 4 cfpqmppojpqkdppdddfc
+F-H0-6746 2 jdpqmppojpqkdppdddfc
+F-H0-6747 2 npqnpppddpeddjcddgic
+F-H0-6748 2 hcpqmppojpqkdppdddfc
+F-H0-6749 10 ppcqddqd
+F-H0-6750 3 occqddqd
+F-H0-6751 15 qpppqq
+F-H0-6752 6 qfpqdppkddpdnckd
+F-H0-6753 6 nepqdppkddpdnckd
+F-H0-6754 3 qcpqdppkddpdnckd
+F-H0-6755 2 ndpipppddpidqfcd
+F-H0-6756 17 lolqnqppdqlpkppnnopjddpd
+F-H0-6757 5 djppcnfpdddp
+F-H0-6758 3 rdpdppndqfdd
+F-H0-6759 2 lqppqnnppddp
+F-H0-6760 2 nqppddpfncpd
+F-H0-6761 2 ckpddpfdcfdd
+F-H0-6762 8 kcppcpcfqdddfc
+F-H0-6763 5 prppnqqncpddqd
+F-H0-6764 8 popqdddpocqd
+F-H0-6765 3 dncpeqpdppdc
+F-H0-6766 3 pnpqdddpocqd
+F-H0-6767 2 qeqpoqdddppc
+F-H0-6768 3 djppdpcnecpd
+F-H0-6769 3 cfppqedpddfc
+F-H0-6770 2 fpppdpcnecpd
+F-H0-6771 2 kpnqpppdcodd
+F-H0-6772 2 chppeqcfddpd
+F-H0-6773 8 npqqpqnqoqppmqopqpdppddd
+F-H0-6774 5 rnqqpqppqppodpqnqopdqmdd
+F-H0-6775 4 poedqe
+F-H0-6776 2 ocepqo
+F-H0-6777 11 qhdppqqnfqcnqppjjpddpd
+F-H0-6778 2 qldppqqnfqcnqppjjpddpd
+F-H0-6779 7 jqpqoqppnqnpmpnodppjddpd
+F-H0-6780 4 egefppdfdppddgjdcfddcecd
+F-H0-6781 2 ckppcojpcndpdmcppdendddn
+F-H0-6782 8 jdprppnqpndppjddpd
+F-H0-6783 6 qcdpppddpjncpfpbpd
+F-H0-6784 2 cfrpppqnnppdjpdddp
+F-H0-6785 7 cepodpdcpd
+F-H0-6786 6 depodpdcpd
+F-H0-6787 8 ddijppmipd
+F-H0-6788 3 ddmkppijpd
+F-H0-6789 2 pkmkppijpd
+F-H0-6790 12 oqqppqppopnppodppdqodd
+F-H0-6791 5 eoppdqfpepdpdocppdcodd
+F-H0-6792 6 dpqpedpd
+F-H0-6793 4 epqpedpd
+F-H0-6794 14 cnpqeqfqdqfpcpepdcpd
+F-H0-6795 2 dopqeqfqdqfpcpepdcpd
+F-H0-6796 16 dcdfpppdedcdccbc
+F-H0-6797 4 pcqfmeocpdncodlcnd
+F-H0-6798 3 kdqfmeocpdncodlcnd
+F-H0-6799 14 cpdqppepfpdodppdcodd
+F-H0-6800 11 cnoqdpfqdcpd
+F-H0-6801 2 jpoqdpfqdcpd
+F-H0-6802 2 ipoqdpfqdcpd
+F-H0-6803 6 jdjqpqdppkddpd
+F-H0-6804 5 fcjqpqdppkddpd
+F-H0-6805 2 fccjpppdipddcp
+F-H0-6806 2 lqjqpqdppkddpd
+F-H0-6807 2 cjjqpqdppkddpd
+F-H0-6808 12 cndpppqjdjcedfcdcffcdedcpd
+F-H0-6809 2 qldpppqjdjcedfcdcffcdedcpd
+F-H0-6810 4 mqopqpdpecpd
+F-H0-6811 3 cedpqodedcpd
+F-H0-6812 3 hddpoqpdcded
+F-H0-6813 14 cpppcqdpdcpd
+F-H0-6814 2 qdppcddpqcpd
+F-H0-6815 10 erppcqdpcpdoccpd
+F-H0-6816 2 dqppcqdpcpdoccpd
+F-H0-6817 11 qhqnpponnpolcppkqlpjplpiqkpdqjdd
+F-H0-6818 2 ecppdqhedffehdpdddkdjcjdicidhcfc
+F-H0-6819 15 cdppcidppdcfddcc
+F-H0-6820 5 cpeppqdepd
+F-H0-6821 4 pidoppedpc
+F-H0-6822 13 qfnqdpqpqjqlddpd
+F-H0-6823 5 qgnqdpqpqjqlddpd
+F-H0-6824 9 ccdpppdhhehcfefcdedcpd
+F-H0-6825 3 dkdpppdhhehcfefcdedcpd
+F-H0-6826 16 cpdqfqjpcqdpppddpd
+F-H0-6827 14 cmeqppcpcjcgpddd
+F-H0-6828 10 rdpipppdcpndqfddof
+F-H0-6829 2 fgdppqdffeidpdddfc
+F-H0-6830 17 epppdqfpdodppdcodd
+F-H0-6831 13 fcppdqdfcecfcddedcpd
+F-H0-6832 3 edppdqdfcecfcddedcpd
+F-H0-6833 16 drdqfqjpcqdpppdocpddpd
+F-H0-6834 5 cndppqdjfqddpd
+F-H0-6835 4 jddpppdjpcddfc
+F-H0-6836 3 dndppqdjfqddpd
+F-H0-6837 2 fodppqdjfqddpd
+F-H0-6838 2 fcdppqdjfqddpd
+F-H0-6839 13 qjoqdpqpedpd
+F-H0-6840 2 npoqdpqpedpd
+F-H0-6841 9 pnnqlqnopppddpdd
+F-H0-6842 8 pqdeqd
+F-H0-6843 3 cpdeqd
+F-H0-6844 9 fqdpppciddcffcpdccbd
+F-H0-6845 3 qfdpppciddcffcpdccbd
+F-H0-6846 17 pkkqdpfqcnqpqjqkddpd
+F-H0-6847 6 pmppqndpqhpnreqfqerdqdrcpdqcodpcddnc
+F-H0-6848 5 qjppdppddcjd
+F-H0-6849 5 qfppdppddcjd
+F-H0-6850 2 hdppdppddcjd
+F-H0-6851 10 ppdqpdce
+F-H0-6852 3 qpqddpec
+F-H0-6853 2 eqpqddqe
+F-H0-6854 15 pjkqdpfqcnqppkqlqjqkddpd
+F-H0-6855 2 plkqdpfqcnqppkqlqjqkddpd
+F-H0-6856 12 fpfqhqppdpcnddpd
+F-H0-6857 2 fpfqppcndppdcldd
+F-H0-6858 9 pkppdpnpqnqlonqhqjqdddoc
+F-H0-6859 6 rdoqdpqpqjqlqfqhofpdddnd
+F-H0-6860 6 dnfqdpppjdpjddpfncpd
+F-H0-6861 4 ipfqdpppjdpjddpfncpd
+F-H0-6862 2 cnfqdpppjdpjddpfncpd
+F-H0-6863 2 jpfqdpppjdpjddpfncpd
+F-H0-6864 13 onpqdpqmpoqddcoc
+F-H0-6865 4 qqpqdpqmpoqddcoc
+F-H0-6866 10 pippqnnponcpolqlpkplpjqkpdqjdd
+F-H0-6867 15 qldpkqcnfqpkqpqjqkddpd
+F-H0-6868 11 pbpfpppddpddnc
+F-H0-6869 7 pkmqdppprnqoqnqlonqhqjqdddoc
+F-H0-6870 9 qndrercrhqpqeqfqdqcqdpcppoqodocnddpd
+F-H0-6871 5 ppdrercrhqpqeqfqdqcqdpcppoqodocnddpd
+F-H0-6872 6 fddpdedcpd
+F-H0-6873 3 pmqpopdppd
+F-H0-6874 3 qqpqdppdpo
+F-H0-6875 2 deqpopdppd
+F-H0-6876 14 qqppnqoodppjqnpdddjd
+F-H0-6877 2 rpppnqoodppjqnpdddjd
+F-H0-6878 2 qopnpqpddpdd
+F-H0-6879 2 qfppdppdcdfd
+F-H0-6880 7 pfdppqddfqncpd
+F-H0-6881 3 nccnqppddpddqf
+F-H0-6882 3 qfdppqddfqncpd
+F-H0-6883 2 lcdppqddfqncpd
+F-H0-6884 9 npnqlqdqppqnpjddpd
+F-H0-6885 3 oedpppqfpjncpddclc
+F-H0-6886 2 pfdpppqfpjncpddclc
+F-H0-6887 4 onqnpppmdpqhpnreqfqerdqdrcpdqcodpcddnc
+F-H0-6888 10 fohpfqdpppddpd
+F-H0-6889 4 ccdppphdpdddfc
+F-H0-6890 10 qqqpopmpondppdqndd
+F-H0-6891 5 hedpppdgfefcdedcpd
+F-H0-6892 5 dpcqqppdcd
+F-H0-6893 4 ocqqcpddqd
+F-H0-6894 3 fcqqcpddqd
+F-H0-6895 2 nqppdqccpc
+F-H0-6896 7 mdpeppqddpddoc
+F-H0-6897 5 kqqpoqdppdpodd
+F-H0-6898 6 qmoqqpdplponddpd
+F-H0-6899 5 qnoqqpdplponddpd
+F-H0-6900 2 dedpppfedhcedcpd
+F-H0-6901 2 eoppdqfodlcopddd
+F-H0-6902 6 dpjpjj
+F-H0-6903 4 ppjdjj
+F-H0-6904 2 njpjjj
+F-H0-6905 2 dfdpopdcpe
+F-H0-6906 2 gddqpoddod
+F-H0-6907 5 ippqdpfqjdqkncpfdcpd
+F-H0-6908 4 hqpqdpfqjdqkncpfdcpd
+F-H0-6909 3 dfppnqpndqqijppcddfc
+F-H0-6910 2 jddppqdnfqcijpncpddc
+F-H0-6911 2 cnpqdpfqjdqkncpfdcpd
+F-H0-6912 14 dofqdqcqjpppdpcpddpd
+F-H0-6913 5 odppdpqdcd
+F-H0-6914 3 codqpdppdc
+F-H0-6915 3 ncdpppcdqd
+F-H0-6916 3 qepqdddppc
+F-H0-6917 14 dpdqppdofppdcodd
+F-H0-6918 6 qldpfqcnppqjjpdcpd
+F-H0-6919 4 dedpfqcnppqjjpdcpd
+F-H0-6920 2 cfppnqqnjpcjdppcdd
+F-H0-6921 2 gcfqcnqpdjdppdjcdd
+F-H0-6922 10 kqnqlqdqppkplpnopnlopjddpd
+F-H0-6923 3 oiqpqhdpphpipdohndqfjdofdd
+F-H0-6924 4 dqnppddndd
+F-H0-6925 3 epdnppfdpd
+F-H0-6926 2 pjdnppfdpd
+F-H0-6927 2 jpdnppfdpd
+F-H0-6928 8 cpcqgqppdqdocmenddpd
+F-H0-6929 7 cbppdpefcgdegcpddccc
+F-H0-6930 17 pcdppppfodqdddrcqc
+F-H0-6931 5 cedppqdedcqd
+F-H0-6932 4 oddppqdedcqd
+F-H0-6933 3 plcppqpodcpd
+F-H0-6934 2 fpqpdqdopcdd
+F-H0-6935 2 qmcppqpodcpd
+F-H0-6936 8 prnrpqoqnqopnpmpnodpplpopddd
+F-H0-6937 5 qmopqpqolppodprnqnpmpnpdondd
+F-H0-6938 8 ncpqdqpkddpd
+F-H0-6939 2 lppqdqpkddpd
+F-H0-6940 2 mppqdqpkddpd
+F-H0-6941 14 reppdpodpfddqdqcrcpc
+F-H0-6942 2 bbdpppdefdpddccdcbcc
+F-H0-6943 15 mdlqnrqpqqpppqopnqmodppjddpdncnd
+F-H0-6944 12 qjqpdpopdcpd
+F-H0-6945 4 ncfqdpppdepd
+F-H0-6946 4 dfppdopdddfc
+F-H0-6947 3 cfppdopdddfc
+F-H0-6948 3 pkqnpppdepdd
+F-H0-6949 2 jpfqdpppdepd
+F-H0-6950 2 hcppdopdddfc
+F-H0-6951 12 mqqpqqpppqnpoqlpnqooopnompmodppjddpd
+F-H0-6952 2 prpqqqppqpjpqodppoooqnpnpmonpdomddpl
+F-H0-6953 2 peppdppjodoemdneddmeqcqdpcpdocndncld
+F-H0-6954 8 onqniqpmpppdcpddpn
+F-H0-6955 9 qnjqqdppdddp
+F-H0-6956 2 kcjqqdppdddp
+F-H0-6957 13 dfpqdpfeidqdddfc
+F-H0-6958 4 nqqnppondpcdpkpc
+F-H0-6959 9 ncppdpqdpfddodoc
+F-H0-6960 5 qppqnpdppoqoddpd
+F-H0-6961 4 pppqnpdppoqoddpd
+F-H0-6962 2 ncmeqfpdocodlcnd
+F-H0-6963 17 mdpjqppddpndqfddnc
+F-H0-6964 8 lqnqppcqpjccpd
+F-H0-6965 2 pnnqppcqpjccpd
+F-H0-6966 2 dncnppqcjpccdp
+F-H0-6967 13 qnpqqqqpppdppoqopdqmdd
+F-H0-6968 9 mppqdpplpoqddcoc
+F-H0-6969 2 fdeqpqcpdedhpddc
+F-H0-6970 2 oqpqdpplpoqddcoc
+F-H0-6971 8 ofpqpocpddqdocld
+F-H0-6972 6 qqpqpocpddqdocld
+F-H0-6973 2 mepqpocpddqdocld
+F-H0-6974 5 npddpf
+F-H0-6975 2 eoppnd
+F-H0-6976 12 ebpqdpdefdpddccdcbcc
+F-H0-6977 2 dhpqdpdefdpddccdcbcc
+F-H0-6978 8 pldppqpoqedd
+F-H0-6979 3 ceppcodedcpd
+F-H0-6980 2 pgqgqfpdrdnc
+F-H0-6981 2 rgqgqfpdrdnc
+F-H0-6982 6 cfpodppdddfc
+F-H0-6983 5 qlqnpppddped
+F-H0-6984 2 pfdoppddpdnc
+F-H0-6985 2 pedpppqfqhdfpdqdpcddicqcfcccdb
+F-H0-6986 5 qldqnqqjqpddpd
+F-H0-6987 3 dodqnqqjqpddpd
+F-H0-6988 3 cfdpppqjqddcnc
+F-H0-6989 2 cedpppqjqddcnc
+F-H0-6990 6 qonppqpocpddqd
+F-H0-6991 3 qfdppqpfqdoddc
+F-H0-6992 2 cedppqpfqdoddc
+F-H0-6993 5 qjppdpjpdjpdgefceddcddcccdfbhc
+F-H0-6994 3 qffrhqfqepdqdpcqcpppgopddjjddd
+F-H0-6995 2 fqnrlqqqqppqppnqopdpmojdpjddpd
+F-H0-6996 2 mcnrlqqqqppqppnqopdpmojdpjddpd
+F-H0-6997 17 monrlqqqqppqppnqopdqpjdcpd
+F-H0-6998 4 qodppqpocfdepdddcdhcfcecccdcdbebcb
+F-H0-6999 3 qmdppqpocfdepdddcdhcfcecccdcdbebcb
+F-H0-7000 2 ldppfqepdqdpcqcpbqcobpbocnclqdoddd
+F-H0-7001 11 opqpdpdepd
+F-H0-7002 3 qpopdpdcpd
+F-H0-7003 5 opqppddpcdqfncrd
+F-H0-7004 4 gqdrdppqcnfqdcpd
+F-H0-7005 3 cqbpfqcnqppddpcd
+F-H0-7006 13 eqdrercrdqfqjpcqdpppdocpddpd
+F-H0-7007 7 ecopqpdppdedcd
+F-H0-7008 5 gcopqpdppdedcd
+F-H0-7009 3 pldppqpopddedc
+F-H0-7010 2 omqqdrcqpqqpiqdpfqrnppqnpodnqlddpd
+F-H0-7011 2 rnqnpponjppmdpomqopdpoddpn
+F-H0-7012 2 mcdpppnepjmepdmdodddndncoc
+F-H0-7013 11 ndqpqhdppdqfcdof
+F-H0-7014 2 cnpqhqfqdpfodcpd
+F-H0-7015 11 eogpdqdoqppddldd
+F-H0-7016 3 neppphdpcdpepcmd
+F-H0-7017 2 ppmppqpocppdpldd
+F-H0-7018 4 qnfqdpppdnjpjdpjddpfncpd
+F-H0-7019 2 jqqnpppjnppddpjddjfdcfdd
+F-H0-7020 2 djfqdpppdnjpjdpjddpfncpd
+F-H0-7021 2 cgfqdpppdnjpjdpjddpfncpd
+F-H0-7022 9 nqdrercreqfqdqcqjpppdpcpdocnddpd
+F-H0-7023 2 fdppdpcfdepdjdcdddfcecccdcdbebcb
+F-H0-7024 9 pgqhpppfdppdqfjdncdd
+F-H0-7025 5 qcppdppjqfpdddndnclc
+F-H0-7026 15 crerdrdqfqjpcqdpppdocpddpd
+F-H0-7027 12 clppdpdjcdcfdcpd
+F-H0-7028 10 nclqnrqpqqpppqopnqmodqpjdcpd
+F-H0-7029 15 cnerdreqcrdqfqjpcqdpppdocpddpd
+F-H0-7030 9 pnnqppdpqddfkcddfc
+F-H0-7031 4 fqcnpqpddpndqkddqf
+F-H0-7032 6 pqqodpdjddpd
+F-H0-7033 5 qfjppppddpec
+F-H0-7034 2 opqodpdjddpd
+F-H0-7035 2 jpqodpdjddpd
+F-H0-7036 5 dcqpcecppd
+F-H0-7037 4 dedqoqdcpd
+F-H0-7038 5 qjppeqcmcpcjcgpddd
+F-H0-7039 3 fcdpoqqmqpqjqgddpd
+F-H0-7040 8 pjppqnnppdcodd
+F-H0-7041 4 drdpfqdnppecpd
+F-H0-7042 10 ccpqcqqd
+F-H0-7043 2 ceqdqqdc
+F-H0-7044 2 ddpqcqqd
+F-H0-7045 7 fqoqdpcnddod
+F-H0-7046 4 gqoqdpcnddod
+F-H0-7047 12 orqqqrqppqponpddpd
+F-H0-7048 3 bbppdfedpddccdccbc
+F-H0-7049 4 pnqpoqdppd
+F-H0-7050 2 qmqpoqdppd
+F-H0-7051 2 ppdpcedcpd
+F-H0-7052 2 oqdpcedcpd
+F-H0-7053 8 pnnqppdpkpnoddpd
+F-H0-7054 2 qnnqppdpkpnoddpd
+F-H0-7055 9 jdpqdpfqdnjpddqfncpd
+F-H0-7056 3 pbpqdpfqdnjpddqfncpd
+F-H0-7057 4 fpeqfqdqepcpdd
+F-H0-7058 3 dgcecfcddedcpd
+F-H0-7059 2 dqpqnqoqopqppd
+F-H0-7060 15 cbpqdpdefdpddccc
+F-H0-7061 4 qfdppqdecfddpdnccdhcfcecccdcdbebcb
+F-H0-7062 4 pfdppqdecfddpdnccdhcfcecccdcdbebcb
+F-H0-7063 3 pnqnppqhcpreqfqerdqdrcpdqcodpcddnc
+F-H0-7064 2 qlqnppqhcpreqfqerdqdrcpdqcodpcddnc
+F-H0-7065 2 rfppdpqhqfpedfpdqdpcddicqcfcccdb
+F-H0-7066 7 qjppdpekcmckcedgcdcffcdedcpd
+F-H0-7067 3 qnppdpekcmckcedgcdcffcdedcpd
+F-H0-7068 3 cfnqpqiqoqopgqmpqpiodppdqndd
+F-H0-7069 2 qjppcfdppdkecdgdmcedeckcdcfc
+F-H0-7070 16 cddppqfddedcpdcbcc
+F-H0-7071 12 edppcidppdcfdddccdcc
+F-H0-7072 3 bqdqppcqdpcncppdckdd
+F-H0-7073 10 jpeqfqdqppcpfpcnepqddd
+F-H0-7074 2 edpqnqoqopqpnpqndpcdpd
+F-H0-7075 4 cqqpqc
+F-H0-7076 3 qqdcqc
+F-H0-7077 2 dqqdqq
+F-H0-7078 2 pddqqq
+F-H0-7079 10 jijkkkkjjj
+F-H0-7080 5 lkjkkkkjjj
+F-H0-7081 3 hqppepdodpcocpcmddpc
+F-H0-7082 2 nqppepdodpcocpcmddpc
+F-H0-7083 7 onfqopqpdplpddpd
+F-H0-7084 5 pmfqopqpdplpddpd
+F-H0-7085 2 pnfqopqpdplpddpd
+F-H0-7086 7 dcopcppd
+F-H0-7087 4 dddppcpo
+F-H0-7088 2 qodedqpd
+F-H0-7089 2 peppdcdo
+F-H0-7090 6 pidppqponqqnqppnqoqfpddd
+F-H0-7091 4 pjdppqponqqnqppnqoqfpddd
+F-H0-7092 2 clppdpcncedfcdcffcdedcpd
+F-H0-7093 2 ckppdpcncedfcdcffcdedcpd
+F-H0-7094 4 prlqnqppnodppdpndd
+F-H0-7095 2 didpppcheffdcfddpd
+F-H0-7096 10 oqopqppndppedd
+F-H0-7097 5 nqnppqeppdpodd
+F-H0-7098 7 cfdppqjdpdddfc
+F-H0-7099 5 ofpjpppdcpddqf
+F-H0-7100 2 pqpdcded
+F-H0-7101 2 mqopqpdp
+F-H0-7102 2 nqpopqpd
+F-H0-7103 2 cppopqpd
+F-H0-7104 14 pqnqoqopqppd
+F-H0-7105 4 occqpqdcqd
+F-H0-7106 3 odqdpqcccp
+F-H0-7107 2 cecqpqdcqd
+F-H0-7108 7 qpdpoqedpd
+F-H0-7109 5 fqdpoqedpd
+F-H0-7110 9 qcdppqqfpdrdncdd
+F-H0-7111 2 cmppfqbpdpcndcpd
+F-H0-7112 4 ocdppqcedcqd
+F-H0-7113 4 dhdppqcedcqd
+F-H0-7114 2 kpoqqpdpcdpc
+F-H0-7115 3 dhopdpdedc
+F-H0-7116 3 qopopqedpd
+F-H0-7117 2 nppopqedpd
+F-H0-7118 2 cppopqedpd
+F-H0-7119 11 rkqqrpppqnnponcppdpkdd
+F-H0-7120 2 chdippqddpfdefddcfccbd
+F-H0-7121 5 qhfqppdpcnqjdjcedfcdcffcdedcpd
+F-H0-7122 4 qlfqppdpcnqjdjcedfcdcffcdedcpd
+F-H0-7123 2 qgfqppdqdocpdncocnqjdjddcffcpd
+F-H0-7124 2 enfqppdpcnqjdjcedfcdcffcdedcpd
+F-H0-7125 7 cjpdppeddpcd
+F-H0-7126 3 jppqdppoddpd
+F-H0-7127 2 qjpqdppoddpd
+F-H0-7128 2 ckpppdepddcp
+F-H0-7129 11 cndpfqddpd
+F-H0-7130 7 cfppdpcjdcpd
+F-H0-7131 2 qfjqqppddpdd
+F-H0-7132 2 qhdpppqjpcdd
+F-H0-7133 2 cjdppqqjpddd
+F-H0-7134 2 nqppdpcjdcpd
+F-H0-7135 9 ccdpppfcdedcpd
+F-H0-7136 3 onqpopdppdqndd
+F-H0-7137 2 cjdpppfcdedcpd
+F-H0-7138 14 cddpppgddedcpdcbcc
+F-H0-7139 5 edpjpppdjpcddp
+F-H0-7140 4 jdjpppdppjdcpd
+F-H0-7141 2 nqqppddpjddjdd
+F-H0-7142 6 ccegqpefdpdfdgeecfpddejdceddcddc
+F-H0-7143 5 lpqppqppoqnpnqooopnompmodppjdcpd
+F-H0-7144 5 fqdpppqdcfkcddfc
+F-H0-7145 3 jddpnqqnppqiddpc
+F-H0-7146 2 iqdqppckddcffcpd
+F-H0-7147 2 jqdqppckddcffcpd
+F-H0-7148 2 fqdqppckddcffcpd
+F-H0-7149 10 fcdppppjpddd
+F-H0-7150 3 qldppppjpddd
+F-H0-7151 3 pjppdpdjddpd
+F-H0-7152 7 oqopcqpdqpcd
+F-H0-7153 2 pnopcqpdqpcd
+F-H0-7154 2 nqdppqpoqcdc
+F-H0-7155 2 qopqcqdedcpd
+F-H0-7156 11 fpeqpqdqfqcpepddpd
+F-H0-7157 6 gpeqpqdqfqcpepddpd
+F-H0-7158 6 gcpqdpefcgdedcpd
+F-H0-7159 4 egpqdpefcgdedcpd
+F-H0-7160 7 eqppcpepqdddoc
+F-H0-7161 5 mcppeqodcpddqd
+F-H0-7162 7 qnercqcrppnqcpdqdofpckddpd
+F-H0-7163 2 qmercqcrppnqcpdqdofpckddpd
+F-H0-7164 2 pfdpppfdcincdedcpdebcdcbcc
+F-H0-7165 2 kddpppfdcincdedcpdebcdcbcc
+F-H0-7166 2 kcdpppfdcincdedcpdebcdcbcc
+F-H0-7167 5 qheppdpojdqfdd
+F-H0-7168 4 npnqppeppjdepd
+F-H0-7169 13 dqpqeqfqcpepddpd
+F-H0-7170 3 pldppqpoqdcfkcddfc
+F-H0-7171 3 qmdppqpoqdcfkcddfc
+F-H0-7172 3 pkdppqpoqdcfkcddfc
+F-H0-7173 2 ecnqqnppqidpcdedpc
+F-H0-7174 2 qdppdpqhqfpddfpcddicqcfcccdb
+F-H0-7175 4 lqnqppeqpjecpd
+F-H0-7176 3 kpnqppeqpjecpd
+F-H0-7177 2 jdnqppeqpjecpd
+F-H0-7178 13 oeqdppdddpmcoc
+F-H0-7179 2 ccdpppcgcedcpd
+F-H0-7180 5 odqpdqqecdedpc
+F-H0-7181 3 qopopqoccpdcqd
+F-H0-7182 3 ldpopqoccpdcqd
+F-H0-7183 2 dfqpdqqecdedpc
+F-H0-7184 4 npdppqooopnoqoqnpopnpd
+F-H0-7185 3 mpdppqooopnoqoqnpopnpd
+F-H0-7186 7 qcpjqpnedppdqfndmdddnc
+F-H0-7187 7 cojppqdpfqencndndmddpd
+F-H0-7188 2 qdppdppfpgofqfpdncjddc
+F-H0-7189 5 ncppdppjccpd
+F-H0-7190 5 nqppdppjccpd
+F-H0-7191 3 djpppdjpccdp
+F-H0-7192 9 qppecped
+F-H0-7193 3 dpopdcpe
+F-H0-7194 2 cdpodqod
+F-H0-7195 15 dccipppddpddcfcdcc
+F-H0-7196 14 feqeqpdddppcjclcfchc
+F-H0-7197 2 rhoqdqqpqjqlqfqhddpd
+F-H0-7198 13 bqcqppepcpddpd
+F-H0-7199 6 fqpqcppkdcpd
+F-H0-7200 4 eqpqcppkdcpd
+F-H0-7201 3 qnppqdipdccp
+F-H0-7202 3 mppqcppkdcpd
+F-H0-7203 6 popqdpqdddjc
+F-H0-7204 3 djpqdpqdddjc
+F-H0-7205 2 qopqdpqdddjc
+F-H0-7206 6 dcqqqd
+F-H0-7207 2 dqccpc
+F-H0-7208 2 ddqqqd
+F-H0-7209 5 cfpqjpqkdppdddfc
+F-H0-7210 3 dfpqjpqkdppdddfc
+F-H0-7211 2 pjiqdjpppdcpddqf
+F-H0-7212 2 kqnqppdppdcijddc
+F-H0-7213 2 idpqjpqkdppdddfc
+F-H0-7214 9 cgdqppcocjcdpdec
+F-H0-7215 3 jqpqdpqoqjqdddoc
+F-H0-7216 6 dcqpegdpefdgdfcfeedepdcejdcddd
+F-H0-7217 9 cbppdpdegdpddccc
+F-H0-7218 11 neqppjdppdqfndmdddnc
+F-H0-7219 10 djqppdcpndpjjdqfdd
+F-H0-7220 3 dodqppjdpjncpfdcpd
+F-H0-7221 4 ncpqcppkddpd
+F-H0-7222 3 eqpqcppkddpd
+F-H0-7223 2 dgpddqidppcd
+F-H0-7224 2 fqpqcppkddpd
+F-H0-7225 8 doprqqkrppnqkpdqpnnopjddpd
+F-H0-7226 2 fqdpppnepjncpfdcpdpbkdkbqc
+F-H0-7227 2 gfppdicppdbijdeffdcfddbdcc
+F-H0-7228 11 kcdppppfodreddqdqcrcpc
+F-H0-7229 4 chppdpfddedcpdebcdcbcc
+F-H0-7230 10 ccoqdpcfddpdfcbd
+F-H0-7231 3 cgoqdpcfddpdfcbd
+F-H0-7232 13 pjqiqpqhdppdpindqfddof
+F-H0-7233 2 ldppdppfnepdkdlcnckcdc
+F-H0-7234 4 oqopqppddpddcffcbd
+F-H0-7235 4 pldppqpopdcffcdddb
+F-H0-7236 2 dfnqrpppqndppdedcd
+F-H0-7237 2 iqfqhqpphpipdphocnfodcpd
+F-H0-7238 13 gofrhqfqepdqdpcqcpppddpd
+F-H0-7239 2 fpfrhqfqepdqdpcqcpppddpd
+F-H0-7240 5 emcnppdmjpdedppddn
+F-H0-7241 3 nedpppmdpjedpdncnd
+F-H0-7242 9 dppoddpe
+F-H0-7243 4 cpodpped
+F-H0-7244 4 pqeqpdqocd
+F-H0-7245 3 epcopqecpd
+F-H0-7246 2 pkcopqecpd
+F-H0-7247 14 qlppqjcpqipkqhpjphpipdohndqfjdofdd
+F-H0-7248 7 dnfqdppoddoe
+F-H0-7249 4 ipfqdppoddoe
+F-H0-7250 3 hqfqdppoddoe
+F-H0-7251 6 fcbqhqppdqcpcqboepdnpdcfdd
+F-H0-7252 5 fdbqhqppdqcpcqboepdnpdcfdd
+F-H0-7253 5 nonqppmpnppddpddpjncqf
+F-H0-7254 3 gofqppgpfppddpdddjfccf
+F-H0-7255 7 qidppqqnqpqkqdddoc
+F-H0-7256 3 cjdpoqqiqpqfqdddpc
+F-H0-7257 2 fqdppqqnqpqkqdddoc
+F-H0-7258 2 cfdppqqnqpqkqdddoc
+F-H0-7259 4 eqppcpepecpd
+F-H0-7260 3 gqppcpepecpd
+F-H0-7261 3 eododqpdqodd
+F-H0-7262 3 dldodqpdqodd
+F-H0-7263 7 qpdpfqdnpd
+F-H0-7264 3 pnerdrnqcreqfqdqcqipppdpcpdocndcpd
+F-H0-7265 3 fqcnppdidpcecfbebdqdfceddcddcccdbc
+F-H0-7266 5 pjdpjjpddj
+F-H0-7267 4 jddppjpdjj
+F-H0-7268 2 jdpppjddjj
+F-H0-7269 9 cidpppgddedcpdebcdcbcc
+F-H0-7270 4 chdpppgddedcpdebcdcbcc
+F-H0-7271 7 lqjqpqfqeqfpdqepcppdqoddcn
+F-H0-7272 4 cjdppqponqqnqppnqoqjqdddoc
+F-H0-7273 11 omqqpqqpfqdppprnjpqnpodnqlddpd
+F-H0-7274 4 fpfrhqfqppdqepcqdppdcpfddjddcf
+F-H0-7275 7 pqqodpcepd
+F-H0-7276 6 pooqdpecpd
+F-H0-7277 4 oddppqpodcqd
+F-H0-7278 4 fdcppqdedcpd
+F-H0-7279 3 cecppqdedcpd
+F-H0-7280 2 lpdqqpopcdpd
+F-H0-7281 13 nddppprcpjqcqdpcpdncoddclc
+F-H0-7282 2 rddppprcpjqcqdpcpdncoddclc
+F-H0-7283 12 neppphdpoeofddpepcmd
+F-H0-7284 11 dqippqfpfqdpcqcpcnddpd
+F-H0-7285 3 epfpfqdpppgogpddpd
+F-H0-7286 3 ohogpppfdppdpgddqf
+F-H0-7287 2 plppqndppmpnpdomdd
+F-H0-7288 2 qgogpppfdppdpgddqf
+F-H0-7289 8 pqccqd
+F-H0-7290 3 dpqqpc
+F-H0-7291 2 ddqqpc
+F-H0-7292 5 dfdppppdeccd
+F-H0-7293 5 qfpqqodpddpd
+F-H0-7294 2 oppqqodpddpd
+F-H0-7295 7 cnfqdpppddpfncpdkcqcpb
+F-H0-7296 4 pfcqdrdpiqdnfqddppncpd
+F-H0-7297 2 lccqdrdpiqdnfqddppncpd
+F-H0-7298 8 iddppqdffeddpdhcfc
+F-H0-7299 3 rdqhpppdcpndqfddof
+F-H0-7300 11 pfdpppnepjddpdnckd
+F-H0-7301 9 cbppdpdfdgdecfpdceddcdecdcccdbbc
+F-H0-7302 3 roqrpqqqoqppnqoprpnpqpqomppddpdd
+F-H0-7303 7 ccppdqchcfddpd
+F-H0-7304 2 qeppdpqlqnddpc
+F-H0-7305 2 nolqnqppcpddpd
+F-H0-7306 2 fcppdqchcfddpd
+F-H0-7307 7 qlcqdqcpppqnjpcndpbndoqdemddcl
+F-H0-7308 2 pfnrlqqqqppqppnqopdpmoncpjdcpd
+F-H0-7309 2 ndnrlqqqqppqppnqopdpmoncpjdcpd
+F-H0-7310 2 nenrlqqqqppqppnqopdpmoncpjdcpd
+F-H0-7311 9 ebppdpdegdpddccdcbcc
+F-H0-7312 5 qqrpnqqnppjj
+F-H0-7313 14 jppqmpopdppkddpd
+F-H0-7314 4 hpeppqpocpddpd
+F-H0-7315 3 phdppppecdedpc
+F-H0-7316 2 eqeppqpocpddpd
+F-H0-7317 2 qmdppqpoqdoddd
+F-H0-7318 6 pppqmpjpdpqkdcpd
+F-H0-7319 6 popqmpjpdpqkdcpd
+F-H0-7320 2 oopqmpjpdpqkdcpd
+F-H0-7321 6 ncpopqqnnqpnqppjdppdqodd
+F-H0-7322 4 nqppdppdcfjdcdfdeceddcfc
+F-H0-7323 3 qjppdppdcfjdcdfdeceddcfc
+F-H0-7324 9 nqpopqnocppdpldd
+F-H0-7325 6 cmpphpepcpendcpd
+F-H0-7326 6 eqpqipfqfpdqdpcqcpcnddpd
+F-H0-7327 5 eppqipfqfpdqdpcqcpcnddpd
+F-H0-7328 10 pldpkqcnfqpkqpqjqlpjqkddpd
+F-H0-7329 3 qfdpkqcnfqpkqpqjqlpjqkddpd
+F-H0-7330 3 cpppdqdncdpd
+F-H0-7331 2 fdppcpdfdcpd
+F-H0-7332 11 pbppdppjnepfddpdnckd
+F-H0-7333 2 hpppnqkpdppnnopjddpd
+F-H0-7334 2 ngppdppjnepfddpdnckd
+F-H0-7335 3 jpppnqqndppddffcdddb
+F-H0-7336 5 feqpdpcicedcpd
+F-H0-7337 3 oqqpdpcicedcpd
+F-H0-7338 2 gqkqoqqpdpdcpd
+F-H0-7339 2 ppkqoqqpdpdcpd
+F-H0-7340 4 djoqdpqcdd
+F-H0-7341 4 cdcqppecpd
+F-H0-7342 2 cjcqppecpd
+F-H0-7343 2 decqppecpd
+F-H0-7344 10 qndppqqkqdcfkcddfc
+F-H0-7345 2 icfqcnppcidpqdkcdc
+F-H0-7346 5 ppcodqdcqd
+F-H0-7347 2 decodqdcqd
+F-H0-7348 2 cdeqcpqppc
+F-H0-7349 2 doeqcpqppc
+F-H0-7350 10 bpfqcqeqppdqgpgodpfodoeofndlenddpc
+F-H0-7351 6 cbdppqdhffgeeffedeeepdfcgdecdddccc
+F-H0-7352 4 npqnfqcnppdjdppdjcdd
+F-H0-7353 4 dippjqdppdpjddqfnccf
+F-H0-7354 3 jdfqdpppcnjpqjpdddfc
+F-H0-7355 2 cffqdpppcnjpqjpdddfc
+F-H0-7356 9 qnnqpqopoqmpqppddpddqf
+F-H0-7357 2 npdppqpofqqnqppmqoddpd
+F-H0-7358 9 qnopqpdplponddpd
+F-H0-7359 5 qmopqpdplponddpd
+F-H0-7360 12 pnnqlqdpppnopjddmeqcqdpcpdncodnblc
+F-H0-7361 2 nddpqppfpc
+F-H0-7362 12 qrpqqqoqppnqoprpnpqpqomppddpdd
+F-H0-7363 9 rmrpqqdppqrofqqnjppnqonnpocnqlddpd
+F-H0-7364 2 mprpqqdppqrofqqnjppnqonnpocnqlddpd
+F-H0-7365 8 hqpqkqfqdpqoddpd
+F-H0-7366 4 eqpqkqfqdpqoddpd
+F-H0-7367 5 mqerdrhqcreqfqdqcqopqpdpcpdocnddpd
+F-H0-7368 4 pnerdrhqcreqfqdqcqopqpdpcpdocnddpd
+F-H0-7369 3 oqerdrhqcreqfqdqcqopqpdpcpdocnddpd
+F-H0-7370 2 lperdrhqcreqfqdqcqopqpdpcpdocnddpd
+F-H0-7371 10 fohppqdpfqddpd
+F-H0-7372 4 cqhppqdpfqddpd
+F-H0-7373 11 mpppnqnppddpddpjncqf
+F-H0-7374 11 rpqqpqppoqopnqnpqpqomppddpdd
+F-H0-7375 15 ofphppoedpddpepcmd
+F-H0-7376 11 ecpqdpefdhdefepdeegdfcdddccc
+F-H0-7377 5 prqqpqppnqmpoodpnopoplonpddc
+F-H0-7378 14 pcqcpd
+F-H0-7379 3 nqpqqopdcodd
+F-H0-7380 3 deppeqpdeccd
+F-H0-7381 2 dfppeqpdeccd
+F-H0-7382 5 boepdqdpcqpd
+F-H0-7383 4 cpepdqdpcqpd
+F-H0-7384 5 obqdjjpdqcocpc
+F-H0-7385 9 onppdqqlqnqhqjqdddoc
+F-H0-7386 4 rhoqdpqpqjqlqfqhdcpd
+F-H0-7387 11 mdppdppjedpdncnd
+F-H0-7388 7 nqdpppqnqlonqhqjpdcfjdddfc
+F-H0-7389 6 nddpfqcnppqjjpqfqlofqhddpd
+F-H0-7390 8 qlcqdqcpppqnjpcndpbndopdemcdcl
+F-H0-7391 2 npnqppdppjqcmepcqdncpddcodnblc
+F-H0-7392 2 ofppchcpegqfdecfpdbfjdcdddccdc
+F-H0-7393 10 offqdpppcnjpqjqlqfqhddpd
+F-H0-7394 14 jpeqpqdqfqcpfpcnepdcpd
+F-H0-7395 5 ocdppqccqd
+F-H0-7396 2 cfcqqdppdc
+F-H0-7397 2 cfddpqqccp
+F-H0-7398 6 popqdpfqcnjpddqd
+F-H0-7399 2 ncqnnqpjppqddpdc
+F-H0-7400 2 deqnnqpjppqddpdc
+F-H0-7401 2 ocpqdpfqcnjpddqd
+F-H0-7402 7 dhppepdedcpd
+F-H0-7403 2 qmdppqpooddd
+F-H0-7404 2 fdppepdedcpd
+F-H0-7405 2 eqepcppdpodd
+F-H0-7406 3 iqoppddpddjj
+F-H0-7407 2 qjpodpjjddpd
+F-H0-7408 2 ncpodpjjddpd
+F-H0-7409 2 dqdoppjjpddd
+F-H0-7410 5 qjdpppqdddnc
+F-H0-7411 4 qidpppqdddnc
+F-H0-7412 2 pjdpppqdddnc
+F-H0-7413 13 nplqprqpnqoppddpcdpjncqf
+F-H0-7414 7 jpdpfqcmppdcpd
+F-H0-7415 2 cqgqcnqppddpdd
+F-H0-7416 3 dkcndpqd
+F-H0-7417 2 fqcndpqd
+F-H0-7418 2 clcndpqd
+F-H0-7419 11 edppdpfecddebdceecpd
+F-H0-7420 3 mddpppqerdpeqdneocdd
+F-H0-7421 12 docqppcpdpdcpd
+F-H0-7422 2 dncqppcpdpdcpd
+F-H0-7423 11 ppdqddoc
+F-H0-7424 2 qqcoddqd
+F-H0-7425 10 cndqpqcododdpd
+F-H0-7426 6 dpdqpqcododdpd
+F-H0-7427 6 lcdpppdjjpddpjncpd
+F-H0-7428 3 pfdpppdjjpddpjncpd
+F-H0-7429 2 oedpppdjjpddpjncpd
+F-H0-7430 14 gpjppqfpfqdpcnddpd
+F-H0-7431 7 qmpqdpqhqjqdddoc
+F-H0-7432 5 qfoqdpqpqjqlddpc
+F-H0-7433 3 ecqeppcddppcjclc
+F-H0-7434 7 onpqmpkpdpoopoqkddpd
+F-H0-7435 2 qqpqmpkpdpoopoqkddpd
+F-H0-7436 2 oppqmpkpdpoopoqkddpd
+F-H0-7437 7 ndjjppqfpd
+F-H0-7438 4 ncjjppqfpd
+F-H0-7439 9 nqerdrhqcreqfqdqcqdpppdocpqncndcpd
+F-H0-7440 2 qlerdrhqcreqfqdqcqdpppdocpqncndcpd
+F-H0-7441 2 mqerdrhqcreqfqdqcqdpppdocpqncndcpd
+F-H0-7442 7 ogppqnnponcpolqlpkplpjqkpiqjpdqhdd
+F-H0-7443 4 qkdqpqecpd
+F-H0-7444 3 epcppdqocd
+F-H0-7445 2 pcqeppcdcp
+F-H0-7446 2 qeoqdppcdc
+F-H0-7447 2 pkdqpqecpd
+F-H0-7448 8 ccdpqqpd
+F-H0-7449 3 dcdpqqpd
+F-H0-7450 9 nenrlqqqqppqppnqopdpmomdpjddpdncnd
+F-H0-7451 2 ocnrlqqqqppqppnqopdpmomdpjddpdncnd
+F-H0-7452 7 popqcpqdddoc
+F-H0-7453 2 nccepqqddpdc
+F-H0-7454 2 ndcepqqddpdc
+F-H0-7455 4 cndpfqdjppddpd
+F-H0-7456 3 ccdpppdjpdddfc
+F-H0-7457 3 jpdpfqdjppddpd
+F-H0-7458 2 pjdpfqdjppddpd
+F-H0-7459 14 kccfqpqedpcdgdpcedecfcdc
+F-H0-7460 3 nqfqlqppjqkpiqjphqiphpmodphocnfodcpd
+F-H0-7461 11 jdkqdpfqcnqpddpfncpd
+F-H0-7462 3 prppnqpndpqdcfkcddfc
+F-H0-7463 12 fpfqipqpdpcndcpd
+F-H0-7464 3 dnfqipqpdpcndcpd
+F-H0-7465 3 dfdppnpd
+F-H0-7466 2 ncdpfdpd
+F-H0-7467 2 oqdpdfpd
+F-H0-7468 2 epppnddd
+F-H0-7469 7 qgppqnnpondpolqlpkplpjqkpiqjogqhpdjcdd
+F-H0-7470 3 cllqfqjqppiqkphqjphpipdpmodnhoqjfoddpd
+F-H0-7471 2 golqfqjqppiqkphqjphpipdpmodnhoqjfoddpd
+F-H0-7472 2 jpiqfqhqpphpipdphocnfodcpd
+F-H0-7473 4 kqpqdqqodcpd
+F-H0-7474 3 djpdqpcdcpec
+F-H0-7475 2 dopqdqqodcpd
+F-H0-7476 2 cepqdqqodcpd
+F-H0-7477 2 ncpqdqqodcpd
+F-H0-7478 10 rpppqnnpondppdpjdd
+F-H0-7479 5 bddpppdhffgeeffedeeepdfcgddcdddbcc
+F-H0-7480 4 cfdpppdhffgeeffedeeepdfcgddcdddbcc
+F-H0-7481 2 ngogppqfdpofpgoenfrdneqdpdldodddqc
+F-H0-7482 2 rqrpqqqppplpopdpnooonnqnpmonpdomdd
+F-H0-7483 8 kqnqlqkpppdppnnopjdcpd
+F-H0-7484 7 phppqhcppdpindqfjdofdd
+F-H0-7485 4 lpjppqdpqkdcpd
+F-H0-7486 3 mpjppqdpqkdcpd
+F-H0-7487 2 cnjppqdpqkdcpd
+F-H0-7488 2 jdjppqdpqkdcpd
+F-H0-7489 9 kddpppldpjncpddclc
+F-H0-7490 4 fqdpppjdjjddpd
+F-H0-7491 4 pjdpppjdjjddpd
+F-H0-7492 2 fpdpppjdjjddpd
+F-H0-7493 5 mppqdpfqpoipcnplddpd
+F-H0-7494 4 nopqdpfqpoipcnplddpd
+F-H0-7495 4 oqpqdpfqpoipcnplddpd
+F-H0-7496 2 efdpppchcfddpdfcbd
+F-H0-7497 2 qqlqprppnqdppdqndd
+F-H0-7498 8 clpqdpdjcedfcdcffcdedcpd
+F-H0-7499 2 nqqpcfdppdjdcdfdeceddcfc
+F-H0-7500 2 dedppqponqqnqppnqopjpddc
+F-H0-7501 7 jdppdqjpdkpjddpd
+F-H0-7502 2 hcppdppjdipddcjd
+F-H0-7503 2 hohqfqhpppdpipcnfodcpd
+F-H0-7504 10 podrcqpqdpiqcnfqddpd
+F-H0-7505 3 cnqppddpddqiqcqfncrd
+F-H0-7506 2 qodrcqpqdpiqcnfqddpd
+F-H0-7507 7 nqoqopqpdppdpncd
+F-H0-7508 3 pqoqopqpdppdpncd
+F-H0-7509 7 pjnqdpppqnddqd
+F-H0-7510 3 dbppdpcfpcddfc
+F-H0-7511 7 qpcedqpd
+F-H0-7512 3 pocedqpd
+F-H0-7513 2 ddoqcppd
+F-H0-7514 2 oceqqpdd
+F-H0-7515 12 fppqipfqdpcndcpd
+F-H0-7516 2 dnpqipfqdpcndcpd
+F-H0-7517 4 eqoqcpdcpd
+F-H0-7518 4 popqdpecqd
+F-H0-7519 2 qopqdpecqd
+F-H0-7520 2 qpoqcpdcpd
+F-H0-7521 7 ocppqedpcdedpcfcecpbdc
+F-H0-7522 5 redppqpoqpqnqordqdddoc
+F-H0-7523 2 rcdppqpoqpqnqordqdddoc
+F-H0-7524 10 ldppqhdppdqfndofddmf
+F-H0-7525 5 dfpqdppdpofcdd
+F-H0-7526 4 qnnqppdpdedcpd
+F-H0-7527 2 pnqpopdppdcfdd
+F-H0-7528 2 qhppepcppdqfdd
+F-H0-7529 8 qcqprqppqqoppqdpnqrorpqoqnqlpdqfddrdnc
+F-H0-7530 3 fcprdrercrnqfqhqcqeqppdqcpdpqndocnddpd
+F-H0-7531 12 dqpqipfqdpcqdcpd
+F-H0-7532 2 cppqipfqdpcqdcpd
+F-H0-7533 11 gperppcqdpcpdoccpd
+F-H0-7534 5 qmppqnjpondppmqoompopdrnddpn
+F-H0-7535 2 rfqeqfrdrepdlcnc
+F-H0-7536 7 gpdppqcpfqpocoencndndmddpd
+F-H0-7537 3 emdppqcpfqpocoencndndmddpd
+F-H0-7538 5 nbqdjjpdqcocpcncob
+F-H0-7539 3 qnnqppdpdfdcpd
+F-H0-7540 2 kpnqppdpdfdcpd
+F-H0-7541 2 pnnqppdpdfdcpd
+F-H0-7542 6 dcqopqpccp
+F-H0-7543 2 pecdpqocqd
+F-H0-7544 2 cgdqqdcedc
+F-H0-7545 8 piqhppchdpegqfdeofpdcfndbfjdcdddccdc
+F-H0-7546 12 omqlppqjcpqipkqhpjphpipdohndqfjdofdd
+F-H0-7547 2 hplqnqkqkpjqjphqipppdplpnopnlopjdcpd
+F-H0-7548 3 eqhqdrfpfqdpcqcnppddpd
+F-H0-7549 3 qgqhpppfdppdqfddrdncqc
+F-H0-7550 2 qpcpecpd
+F-H0-7551 2 eqcpecpd
+F-H0-7552 2 ppcpecpd
+F-H0-7553 13 eqcqgqppdqepcpdpdcpd
+F-H0-7554 4 lpoqqpqddpdd
+F-H0-7555 2 cmpqdqcoddpd
+F-H0-7556 2 hqeqpppdcpcd
+F-H0-7557 5 mppqdpfqpojpcnplddpd
+F-H0-7558 2 qqpqdpfqpojpcnplddpd
+F-H0-7559 5 dodqopddpd
+F-H0-7560 3 codqopddpd
+F-H0-7561 2 fdpdppcddo
+F-H0-7562 9 ncjjqdqcpdpcocob
+F-H0-7563 9 qqdrercrhqpqeqnqdqfqdpcqpocpdocnddpd
+F-H0-7564 2 qkdrercrhqpqeqnqdqfqdpcqpocpdocnddpd
+F-H0-7565 2 nodrercrhqpqeqnqdqfqdpcqpocpdocnddpd
+F-H0-7566 6 oceqpqddqd
+F-H0-7567 4 fceqpqddqd
+F-H0-7568 2 cpeqpqddqd
+F-H0-7569 6 occqpqccqd
+F-H0-7570 2 ddcqpqccqd
+F-H0-7571 2 kccqpqccqd
+F-H0-7572 2 fdcqpqccqd
+F-H0-7573 6 ccqpcqpd
+F-H0-7574 4 dcqpcqpd
+F-H0-7575 12 fqppdpcnqjdjcedfcdcffcdedcpd
+F-H0-7576 2 gqppdpcnqjdjcedfcdcffcdedcpd
+F-H0-7577 4 pjeoppeepd
+F-H0-7578 3 cjeoppeepd
+F-H0-7579 2 dpeoppeepd
+F-H0-7580 2 jdoeppeedp
+F-H0-7581 7 ipdppqdnfqecpd
+F-H0-7582 5 jpdppqdnfqecpd
+F-H0-7583 2 drdppqdnfqecpd
+F-H0-7584 13 qpqqppnqoodppjqnpdddjd
+F-H0-7585 5 hcpqmppojpqkdppdddjd
+F-H0-7586 5 qfpqmppojpqkdppdddjd
+F-H0-7587 6 cdnqpqopoqnpqpjpqndppd
+F-H0-7588 2 ddnqpqopoqnpqpjpqndppd
+F-H0-7589 2 cenqpqopoqnpqpjpqndppd
+F-H0-7590 6 dnoqdpfpddpd
+F-H0-7591 12 dcpqdpqdddfchccc
+F-H0-7592 2 cdpqdpqdddfchccc
+F-H0-7593 5 nddppqqfpdcfjdddfc
+F-H0-7594 5 qhdppqqfpdcfjdddfc
+F-H0-7595 2 cffqcnppdjdpqdfcdd
+F-H0-7596 14 pdphppoedpneofddpepcmd
+F-H0-7597 4 jqpqdpqnddpd
+F-H0-7598 3 qfpdppcddpfc
+F-H0-7599 3 jdnqpdqpdddp
+F-H0-7600 2 cipdppcddpfc
+F-H0-7601 8 dddpppqjpd
+F-H0-7602 2 doqjppddpd
+F-H0-7603 2 cpqjppddpd
+F-H0-7604 6 ocpfqdod
+F-H0-7605 4 ncpepcnd
+F-H0-7606 5 rdrqqpqqpppqopnqdprproqnqopdpkddqfnc
+F-H0-7607 4 ncdrercrnqfqeqcqdqppipcpdpqndocnddpd
+F-H0-7608 2 nodrercrnqfqeqcqdqppipcpdpqndocnddpd
+F-H0-7609 4 cqipfqdpppecpd
+F-H0-7610 3 foipfqdpppecpd
+F-H0-7611 3 cnipfqdpppecpd
+F-H0-7612 15 fopqjpfqfpgpdpcnddpd
+F-H0-7613 3 djqodpqeddnd
+F-H0-7614 3 qjqodpqeddnd
+F-H0-7615 3 opqodpqeddnd
+F-H0-7616 2 pcnpdpqoddqe
+F-H0-7617 5 qcqhpppfdppdqfddnc
+F-H0-7618 5 gphqfqfpppdpcnddpd
+F-H0-7619 2 cphqfqfpppdpcnddpd
+F-H0-7620 3 popqdpqdedoc
+F-H0-7621 2 qjpqdpqdedoc
+F-H0-7622 2 qnpqdpqdedoc
+F-H0-7623 2 kcqedpcdpopc
+F-H0-7624 4 ijddkj
+F-H0-7625 2 cndpji
+F-H0-7626 12 qorppqdpfqqnjppnpocnqldcpd
+F-H0-7627 2 noprlqnqqpnpoppddpcdpjncqf
+F-H0-7628 14 pqqpqqppnqoodppjqnpdddjd
+F-H0-7629 8 fqdpqpccpd
+F-H0-7630 2 oqdpqpccpd
+F-H0-7631 6 cedpppjjdcpd
+F-H0-7632 2 nqppdqjjpddd
+F-H0-7633 2 eddpppjjcdpd
+F-H0-7634 2 dnppdqjjpddd
+F-H0-7635 2 fcppcpjjpddd
+F-H0-7636 10 qpqqpqpocpqdqmdd
+F-H0-7637 2 qrqqpqpocpqdqmdd
+F-H0-7638 5 popqeqfqdqjpcpfpcnepdcpd
+F-H0-7639 4 pnpqeqfqdqjpcpfpcnepdcpd
+F-H0-7640 2 fcdofqdndqcnqpdjcppdcocd
+F-H0-7641 10 qfcnfqdjppdgdppdfecdickcfcdc
+F-H0-7642 5 pfrfqeqfrdrepdlcnc
+F-H0-7643 2 nerfqeqfrdrepdlcnc
+F-H0-7644 14 cqcpppdnepddpd
+F-H0-7645 7 pooqdpfqdnipddpd
+F-H0-7646 2 qooqdpfqdnipddpd
+F-H0-7647 2 qfoqdpfqdnipddpd
+F-H0-7648 2 qjoqdpfqdnipddpd
+F-H0-7649 11 fqgqcqeqppdqepcpdpdcpd
+F-H0-7650 12 dpgqcqdqppcpepdcpd
+F-H0-7651 11 cqpqjqbpfpqodpcnddpd
+F-H0-7652 2 cmpqjqbpfpqodpcnddpd
+F-H0-7653 10 qppppqmpjpdpqkddpd
+F-H0-7654 3 oppppqmpjpdpqkddpd
+F-H0-7655 7 opqpcfdpqegdcdedpckcecfcdc
+F-H0-7656 5 qgdppqponqqnqppmqoqiqddcoc
+F-H0-7657 3 ecnqpqiqoqopdqmpqppdcocdqn
+F-H0-7658 5 opqpeppd
+F-H0-7659 4 epppedqd
+F-H0-7660 2 edpqpedp
+F-H0-7661 6 prppnqqndppdcfjdddfc
+F-H0-7662 2 jpppnqqndppdcfjdddfc
+F-H0-7663 7 djdqppcedfcdcffcdedcpd
+F-H0-7664 4 jcqfppqddpcdodpcndocnc
+F-H0-7665 3 dodqppcedfcdcffcdedcpd
+F-H0-7666 9 qcpppfdppdncddpb
+F-H0-7667 2 hqdrppfqdppddndd
+F-H0-7668 2 cfdrppfqdppddndd
+F-H0-7669 8 cfppdpcedepdfddc
+F-H0-7670 3 pqoqopqpdppdpndd
+F-H0-7671 3 dpeqppcpeppddndd
+F-H0-7672 7 odoepd
+F-H0-7673 6 fqpqcpqkddpd
+F-H0-7674 3 pjkqddqppcdp
+F-H0-7675 2 mppqcpqkddpd
+F-H0-7676 5 fqdpoqddpe
+F-H0-7677 4 fqdppoddoc
+F-H0-7678 7 jpdppqjdpkddpd
+F-H0-7679 2 cjdppqjdpkddpd
+F-H0-7680 7 ocdppqcdqd
+F-H0-7681 4 popqcddppc
+F-H0-7682 2 oqqpcppddc
+F-H0-7683 7 clcnppqedpddmcpcjchc
+F-H0-7684 3 cfoqdpqpqmqhqjpdddfc
+F-H0-7685 2 dkcnppqedpddmcpcjchc
+F-H0-7686 2 fpcnppqedpddmcpcjchc
+F-H0-7687 6 qlcqdrdpiqqnfqcnppdcpd
+F-H0-7688 9 cdpodpedpd
+F-H0-7689 2 epqood
+F-H0-7690 2 deqood
+F-H0-7691 9 qcniqpogdppfphofpgoeqfpdqejdpeddqdpc
+F-H0-7692 2 qndqcpppdojpcodpcneodmendldnpdemcdfk
+F-H0-7693 2 pjdqcpppdojpcodpcneodmendldnpdemcdfk
+F-H0-7694 6 omdppqpoqmonqdddoc
+F-H0-7695 4 qmopmqnodqpdqpddco
+F-H0-7696 3 nddpoqofqppeqgddpc
+F-H0-7697 8 mqopqppddpdddjfccf
+F-H0-7698 2 npdppqpopdcfjdddfc
+F-H0-7699 2 qodppqpopdcfjdddfc
+F-H0-7700 2 npnqppdppjdjjjddpd
+F-H0-7701 7 cceqppddpdhcfc
+F-H0-7702 5 fohqfqdpppecpd
+F-H0-7703 5 ofpqodqdddld
+F-H0-7704 2 mdphppcdpepc
+F-H0-7705 13 poqqppqp
+F-H0-7706 2 fqpqqpppqojppodpqnoopmpnplonpdomddnk
+F-H0-7707 2 pjdqcpppdojpcodpcneodmendldnpdemddfk
+F-H0-7708 2 qqpqqpppqojppodpqnoopmpnplonpdomddnk
+F-H0-7709 2 pipqqpppqojppodpqnoopmpnplonpdomddnk
+F-H0-7710 2 cnpqqpppqojppodpqnoopmpnplonpdomddnk
+F-H0-7711 2 jofpfqdpeqcpdqgoppfohpeogpinepdjpddd
+F-H0-7712 8 ncppphdpoeofnepeddpdpcmd
+F-H0-7713 4 odppphdpoeofnepeddpdpcmd
+F-H0-7714 11 ocqcqdpcpd
+F-H0-7715 3 peqdpdqcpc
+F-H0-7716 3 ncppdppjjjpdddjd
+F-H0-7717 3 djppjjjppddpddpj
+F-H0-7718 2 jdppjjjppddpddpj
+F-H0-7719 2 ncppdpjpjjpjddpd
+F-H0-7720 2 dnppjjjppddpddpj
+F-H0-7721 10 mpqqqppqppnqoodppjqnpdddjd
+F-H0-7722 4 medpppqfjpddpjqcoepcqdncpd
+F-H0-7723 9 epeqcpqppddndd
+F-H0-7724 2 pooqqpcppdpndd
+F-H0-7725 6 popqdpqdddkc
+F-H0-7726 2 pnpqdpqdddkc
+F-H0-7727 10 bqcqcpppdnepddpd
+F-H0-7728 10 ponqpqdppkddpd
+F-H0-7729 2 kpnqpqdppkddpd
+F-H0-7730 11 qkkqdpfqcnqpqjpkddpd
+F-H0-7731 14 hcppdppdcfgdddfcgcdb
+F-H0-7732 7 piqhqppddpndqfcdof
+F-H0-7733 2 fmhqpqdpfqdnfodcpd
+F-H0-7734 2 drhqpqdpfqdnfodcpd
+F-H0-7735 8 cnppoddpcd
+F-H0-7736 3 fqdppoddpc
+F-H0-7737 2 pkdppqddpe
+F-H0-7738 6 cqjppqfpfqdpgpfocnddpd
+F-H0-7739 4 dqjppqfpfqdpgpfocnddpd
+F-H0-7740 4 eqjppqfpfqdpgpfocnddpd
+F-H0-7741 6 cddppqqnpd
+F-H0-7742 5 qpdppqqnpd
+F-H0-7743 3 qldppqqnpd
+F-H0-7744 9 mcjjqdqcpdpcocobncnb
+F-H0-7745 5 cededcqd
+F-H0-7746 2 cdpqqdod
+F-H0-7747 5 mqpqlqfqjqkpiqjphqiphpmodphodnfoddpd
+F-H0-7748 4 medpppnepflepdgeldkdlcjdkcidjcnchcdc
+F-H0-7749 2 kqqpqldpqjomqipkqhpjphpipdohndqfddof
+F-H0-7750 2 fohqfqppcddppc
+F-H0-7751 4 onqnppqmjppmdppdpnddom
+F-H0-7752 6 gcppdpdedhpddcfdebcdcbcc
+F-H0-7753 5 dedppqcfpdeccd
+F-H0-7754 5 eddppqcfpdeccd
+F-H0-7755 9 fcdpqpcfddpd
+F-H0-7756 2 lqnqppdpdcpd
+F-H0-7757 11 qqqpoppndppd
+F-H0-7758 3 dqppodpfddqd
+F-H0-7759 2 cnfqhqfoppcddppc
+F-H0-7760 6 qqlqnqppdppjcldjcedfcdcffcdedcpd
+F-H0-7761 5 offqlqjpeqfpdqepppqhcppdcnjdqfdd
+F-H0-7762 2 qnlqnqppdppjcldjcedfcdcffcdedcpd
+F-H0-7763 3 ihjllkjkkkkjjjkiij
+F-H0-7764 2 mkjkklikkkljjjkjji
+F-H0-7765 2 llljjkkjjjjikiiikh
+F-H0-7766 2 lgkkjjkjijjilijhki
+F-H0-7767 5 qpqqpqdppdpndd
+F-H0-7768 4 qrqqpqdppdpndd
+F-H0-7769 14 dqbqcqcpppdnepddpd
+F-H0-7770 8 pppqmpkpdppkddpd
+F-H0-7771 3 popqmpkpdppkddpd
+F-H0-7772 2 oopqmpkpdppkddpd
+F-H0-7773 9 qcppqhdppdqfndofddrd
+F-H0-7774 2 cibpppenfpcndppdcldd
+F-H0-7775 9 nprqlqqqqppqppnqopdppjddpd
+F-H0-7776 2 qeppqhdppeqfpdqdjdqcddqbpc
+F-H0-7777 5 dfppjppddpfcdd
+F-H0-7778 11 hphqdrgqfqdpppcngpddpd
+F-H0-7779 3 eddpppcfpdddgdhcfcgcdb
+F-H0-7780 11 cfcepppddedc
+F-H0-7781 10 icqfppqdcpddodpcmdocnc
+F-H0-7782 2 cjfqppdqdocpcncodmddpc
+F-H0-7783 6 popqdpjpjdpkncpfdcpd
+F-H0-7784 3 hqpqdpjpjdpkncpfdcpd
+F-H0-7785 2 gppqdpjpjdpkncpfdcpd
+F-H0-7786 3 pmcppqqoepddpd
+F-H0-7787 3 plcppqqoepddpd
+F-H0-7788 2 npcppqqoepddpd
+F-H0-7789 2 opcppqqoepddpd
+F-H0-7790 2 qkcppqqoepddpd
+F-H0-7791 3 epcppppepcdc
+F-H0-7792 3 lpopqpqddpdc
+F-H0-7793 3 gqepppcdcppc
+F-H0-7794 12 qfppqdcpddodpcmdocnc
+F-H0-7795 4 ppdodqdcpd
+F-H0-7796 2 dcqpcpeppd
+F-H0-7797 4 qldpoqqjqpdcpc
+F-H0-7798 3 fcppqecpcdjcpc
+F-H0-7799 2 dodqpqqjqdddoc
+F-H0-7800 2 ocqpcedpqdjcdc
+F-H0-7801 10 dpoppded
+F-H0-7802 2 cddopppe
+F-H0-7803 5 fqdpppqjcjcedfcdcffcdedcpd
+F-H0-7804 4 rdqdjjpdqcocpcncobmcnb
+F-H0-7805 5 cfdppqdnfqjdjpddqfncpd
+F-H0-7806 3 edppcnfpdjdppdpjcdqfnc
+F-H0-7807 2 jdppcnfpdjdppdpjcdqfnc
+F-H0-7808 5 eqqqcpddpd
+F-H0-7809 4 ddppdqccpd
+F-H0-7810 2 npqqcpddpd
+F-H0-7811 2 fqqqcpddpd
+F-H0-7812 7 bodqbqcqcpppdnepddpd
+F-H0-7813 2 bbppdppddfedcddcbccc
+F-H0-7814 5 ocppcqddqd
+F-H0-7815 4 fqdpqppdcc
+F-H0-7816 2 jjppcqddqd
+F-H0-7817 4 nppopqecpd
+F-H0-7818 4 eqepppqecp
+F-H0-7819 2 plpopqecpd
+F-H0-7820 2 dqqopdedcd
+F-H0-7821 2 dppopqecpd
+F-H0-7822 2 pjdpppdnfpddpd
+F-H0-7823 2 djppdnfppddpdd
+F-H0-7824 11 ccppdpfedfqdidfcdddb
+F-H0-7825 2 gdppdpfedfqdidfcdddb
+F-H0-7826 4 bddppqddcffcpc
+F-H0-7827 5 pjhqnqfpfqdpqpddpd
+F-H0-7828 3 cjhqnqfpfqdpqpddpd
+F-H0-7829 2 fqdpppfdqdddnchcfc
+F-H0-7830 2 eddpppfdqdddnchcfc
+F-H0-7831 11 jpdpfqdnppedpd
+F-H0-7832 2 dbepppdfpdddfc
+F-H0-7833 8 mdoqdpphpepcdd
+F-H0-7834 3 onqpoplppdcodd
+F-H0-7835 3 pnqpoplppdcodd
+F-H0-7836 4 kccfqdddfc
+F-H0-7837 3 pqcfqdddfc
+F-H0-7838 3 ppcfqdddfc
+F-H0-7839 3 popqdqddpd
+F-H0-7840 2 qnppdpdcpc
+F-H0-7841 2 opqppecped
+F-H0-7842 2 opqpdecpod
+F-H0-7843 2 pjqdopcddo
+F-H0-7844 2 pmqpdecpod
+F-H0-7845 6 fcerdrkqcrhqfqeqcqdqppdpcpdocnddpd
+F-H0-7846 3 cnckppchdpcecfbebdpdfceddcddcccdbc
+F-H0-7847 5 pldppqpoqddc
+F-H0-7848 3 oqopdqpdqpcd
+F-H0-7849 2 peppdqdocdpc
+F-H0-7850 4 rdqdqfpdqcnd
+F-H0-7851 4 loppnqopmpnplpmodppjddpd
+F-H0-7852 13 bccippbedppdcfedbddddccdcc
+F-H0-7853 6 omdppqpoqmonqddcoc
+F-H0-7854 5 mqdppqpoqmonqddcoc
+F-H0-7855 2 qipdjjqcqfncrd
+F-H0-7856 2 rcpdjjqcqfncrd
+F-H0-7857 6 pfdpppjdjpncpjdcpd
+F-H0-7858 2 qnpppjcppddjjdcfdd
+F-H0-7859 9 fpfqgqcqeqppdqepcpdpdcpd
+F-H0-7860 4 frfqgqcqeqppdqepcpdpdcpd
+F-H0-7861 13 bdcipppddpedcfdddccdcc
+F-H0-7862 6 pndrercrhqpqeqfqdqcqdpqppocpdoqoqncnddpd
+F-H0-7863 4 pmdrercrhqpqeqfqdqcqdpqppocpdoqoqncnddpd
+F-H0-7864 3 opfqdpqpedpd
+F-H0-7865 2 ipfqdpqpedpd
+F-H0-7866 2 hqfqdpqpedpd
+F-H0-7867 2 pjpqdedppdqf
+F-H0-7868 2 qipqdedppdqf
+F-H0-7869 14 pqrqqqqpopcppdpndd
+F-H0-7870 3 pnqpoqdcpd
+F-H0-7871 2 dpqpoqdcpd
+F-H0-7872 2 depqdpcdec
+F-H0-7873 2 cpqpoqdcpd
+F-H0-7874 8 ddnpdppf
+F-H0-7875 2 qodfdpnd
+F-H0-7876 8 fqfodqdoppdddl
+F-H0-7877 5 mcppphpeddnepc
+F-H0-7878 9 pnqpopdpedpd
+F-H0-7879 6 qddpoqpeqpddqgqcpc
+F-H0-7880 4 rqqqmqopdqpdqpddco
+F-H0-7881 12 ofpqpidppfpgpdqfddnc
+F-H0-7882 9 pqdpcedjqddfcdcffcdedc
+F-H0-7883 4 pdfqeqppdqjpcpfpcnepdc
+F-H0-7884 14 qqqpopcppdpndd
+F-H0-7885 6 efdipppdcoddcf
+F-H0-7886 4 cnipoqdpfqddpd
+F-H0-7887 3 qqppqndpqepkdd
+F-H0-7888 7 mcdppplepjldpdnckddclc
+F-H0-7889 7 bnppergpcqdpcpdoccpd
+F-H0-7890 5 ddjppppjdpjj
+F-H0-7891 4 ddpjppjjpdjd
+F-H0-7892 7 eppqqdcpdcqo
+F-H0-7893 3 qopqcpqddcoc
+F-H0-7894 9 eopqhpepcpdmddpd
+F-H0-7895 2 enpqhpepcpdmddpd
+F-H0-7896 12 erppcqdpcpdodcpd
+F-H0-7897 3 ecdfppedcd
+F-H0-7898 2 ncpedpndpc
+F-H0-7899 13 fccippcedpbecfpdbdeddcddcccdbc
+F-H0-7900 5 pfppdpqdoddc
+F-H0-7901 3 codqopqpddpd
+F-H0-7902 2 qeppdpqdoddc
+F-H0-7903 2 qqdqopqpddpd
+F-H0-7904 2 dodqopqpddpd
+F-H0-7905 9 nopqdppmpopd
+F-H0-7906 3 qqpqdppmpopd
+F-H0-7907 12 ceppcidpbecfpdbdeddcddcccdbc
+F-H0-7908 4 ddeqqppc
+F-H0-7909 2 odcodcqd
+F-H0-7910 2 dqcodcqd
+F-H0-7911 4 elcnppdmjpdldppddncdem
+F-H0-7912 2 onqnpppmjppldpqdpnddom
+F-H0-7913 7 mprpqqdppqrofqrnjpqnqopnponnrmcnqlddpd
+F-H0-7914 2 plrpqqdppqrofqrnjpqnqopnponnrmcnqlddpd
+F-H0-7915 6 pldppqpofqdnjpdcpd
+F-H0-7916 4 pmdppqpofqdnjpdcpd
+F-H0-7917 9 orppqqpoqp
+F-H0-7918 3 pcpeqdpdqc
+F-H0-7919 2 rnppqqpoqp
+F-H0-7920 3 cppfpqodqd
+F-H0-7921 11 qdqfpdqcnd
+F-H0-7922 10 pnpqoqqpppqodpqnpoqdddoc
+F-H0-7923 2 rdceppqddppcqeocpdncoddc
+F-H0-7924 10 ndppqidppdqfddof
+F-H0-7925 6 nqppdpqiqdddoc
+F-H0-7926 4 cfppeqckcpddpd
+F-H0-7927 3 qnppeqckcpddpd
+F-H0-7928 5 dfdpppcecfcddedcqd
+F-H0-7929 4 nqeqfqdqeppppdcpdc
+F-H0-7930 4 fcdqqpcpdococnddpd
+F-H0-7931 2 rdqhpppddpndqfldofddmf
+F-H0-7932 2 piqhpppddpndqfldofddmf
+F-H0-7933 2 jphqfqdpppdnfodlfmddpd
+F-H0-7934 2 jcdpppdhfgdffeddpdhcfc
+F-H0-7935 9 jdfqdpppdnjpncpfdcpd
+F-H0-7936 2 edppcopc
+F-H0-7937 2 qoqdeqdd
+F-H0-7938 2 cppdoqcd
+F-H0-7939 8 leppdppjldpdnckddclc
+F-H0-7940 4 ippqdpfqqjqnqgqdddoc
+F-H0-7941 3 cnpqdpfqqjqnqgqdddoc
+F-H0-7942 3 hqpqdpfqqjqnqgqdddoc
+F-H0-7943 2 fpcnppqedpcdmcpcjcfc
+F-H0-7944 4 cndppqpofqecpd
+F-H0-7945 3 npdppqpofqecpd
+F-H0-7946 2 dndppqpofqecpd
+F-H0-7947 2 hpepppqecpddcf
+F-H0-7948 5 popqdqpdec
+F-H0-7949 3 fqdpoqdcpc
+F-H0-7950 5 nopqdpfqpopldcpd
+F-H0-7951 4 mppqdpfqpopldcpd
+F-H0-7952 2 oqpqdpfqpopldcpd
+F-H0-7953 2 pnqpoplppddpcdqf
+F-H0-7954 10 dnfqopqpdpcndcpd
+F-H0-7955 3 fpfqopqpdpcndcpd
+F-H0-7956 7 jdmppqjpopdppkddpd
+F-H0-7957 2 cjmppqjpopdppkddpd
+F-H0-7958 2 fcmppqjpopdppkddpd
+F-H0-7959 6 qfdhpppddpcddjic
+F-H0-7960 2 djpqjplpdpqkddpd
+F-H0-7961 2 jdpqjplpdpqkddpd
+F-H0-7962 13 cqppfqdpcneopd
+F-H0-7963 3 fcppdqddoc
+F-H0-7964 4 fcmqdppprnqoqnqlonqhpkcfqjqdddoc
+F-H0-7965 8 qpdppqqnqdddnc
+F-H0-7966 3 qldppqqnqdddnc
+F-H0-7967 5 pqocqd
+F-H0-7968 2 phqepc
+F-H0-7969 4 hcpqdpfqcnpdddfc
+F-H0-7970 3 idpqdpfqcnpdddfc
+F-H0-7971 2 dfpqdpfqcnpdddfc
+F-H0-7972 4 popqdpqdcfkdddfc
+F-H0-7973 3 qjpqdpqdcfkdddfc
+F-H0-7974 2 qkpqdpqdcfkdddfc
+F-H0-7975 2 qnpqdpqdcfkdddfc
+F-H0-7976 11 pfppqddpddoemcoc
+F-H0-7977 2 fcdpppdhdegcpddcfdebcdcbcc
+F-H0-7978 4 qdpdqcpc
+F-H0-7979 3 ncpqdpjpdcpd
+F-H0-7980 3 qnpqdpjpdcpd
+F-H0-7981 2 qkpqdpjpdcpd
+F-H0-7982 2 qopqdpjpdcpd
+F-H0-7983 2 popqdpjpdcpd
+F-H0-7984 10 dbdppqdffeidqdddfc
+F-H0-7985 4 jdnqppjppndppjdcpd
+F-H0-7986 3 cnnqppjppndppjdcpd
+F-H0-7987 9 roqqrqpqqpopcppdpndd
+F-H0-7988 2 brcqcrppdqcpfpdodcpd
+F-H0-7989 6 eqiqpqpdcpddqo
+F-H0-7990 4 qidppqqkqdddoc
+F-H0-7991 3 fcppqedpcdicpc
+F-H0-7992 5 qpqqpqpndpddpd
+F-H0-7993 4 rcdpppndqdqcdd
+F-H0-7994 6 jddqpqcfpdddfc
+F-H0-7995 4 bdqdqpdddpfccf
+F-H0-7996 5 cnkqpdqpdcdp
+F-H0-7997 3 mppqdpqkcdpd
+F-H0-7998 2 fcpqdpqkcdpd
+F-H0-7999 3 nddpppncjjdcpd
+F-H0-8000 2 clcnpppddpcdjj
+F-H0-8001 2 pjqnppqddpddjj
+F-H0-8002 10 cdppcecfpddedc
+F-H0-8003 2 obdpppodqdncoc
+F-H0-8004 8 fcpddqcdqpeced
+F-H0-8005 5 dddppqcededcqd
+F-H0-8006 8 qqlqnqppdppjpdqfncdd
+F-H0-8007 7 enhppqcpeqdcpd
+F-H0-8008 3 oepqdpqdoclddc
+F-H0-8009 2 egdhppqdcpdcce
+F-H0-8010 7 qopdeqdc
+F-H0-8011 2 qppdeqdc
+F-H0-8012 13 cdppdpcfcededcqd
+F-H0-8013 12 beppcidppdcfedbddddccdcc
+F-H0-8014 4 cgdqpddedc
+F-H0-8015 3 cdopqpcppd
+F-H0-8016 2 qepqddpepc
+F-H0-8017 2 ddopqpcppd
+F-H0-8018 12 kqdpfqdnqpdcpd
+F-H0-8019 2 nqdpfqdnqpdcpd
+F-H0-8020 7 clpqjpqodpcnddpd
+F-H0-8021 2 pjdpppqfpdcejddc
+F-H0-8022 2 fqpqjpqodpcnddpd
+F-H0-8023 2 pnnqppqddpddpjoc
+F-H0-8024 12 onpqdpfqqnqpcnjppjqhddpd
+F-H0-8025 4 dekqpqdppkdcpd
+F-H0-8026 3 mpkqpqdppkdcpd
+F-H0-8027 2 fqkqpqdppkdcpd
+F-H0-8028 2 cfkqpqdppkdcpd
+F-H0-8029 11 fppqhqfqdpcnddpd
+F-H0-8030 8 edppdqefeededcpd
+F-H0-8031 4 feppdqefeededcpd
+F-H0-8032 2 dedpoqdcod
+F-H0-8033 8 kljkkkljjjkjji
+F-H0-8034 2 ihijkjjijjjhii
+F-H0-8035 14 ndppqhdppdqfidofcd
+F-H0-8036 3 gqeqpqpocpddpd
+F-H0-8037 2 ecppdqcopdedcd
+F-H0-8038 2 mcdppqqoqdoddd
+F-H0-8039 2 pleqpqpocpddpd
+F-H0-8040 5 poqdepdc
+F-H0-8041 2 dopqdeqd
+F-H0-8042 2 ocpqdeqd
+F-H0-8043 14 pnpqrpfqdpjpqnpocnplddpd
+F-H0-8044 3 pncqiripdrdpfqqnppdnfoddpd
+F-H0-8045 3 pfqqrpppqnnpondprkpkpdncdd
+F-H0-8046 2 qlcqiripdrdpfqqnppdnfoddpd
+F-H0-8047 9 gperppcqdpcpdodcpd
+F-H0-8048 2 fqerppcqdpcpdodcpd
+F-H0-8049 4 lcppdpddjjncpd
+F-H0-8050 3 fddpppcfjjpddd
+F-H0-8051 3 cnfqdpppjjddpd
+F-H0-8052 11 cppqdpfqpocoencndndmddpd
+F-H0-8053 7 dddppppjpd
+F-H0-8054 8 qepipqpfdpofpgpdqfddnc
+F-H0-8055 5 ccdpppfecfidqdfdgdddfc
+F-H0-8056 5 qnerdrnqcrhqfqeqcqdqppdpcpdocndcpd
+F-H0-8057 3 ndqprqppqqoppqcpnqrorpqoqnqlpdqfdd
+F-H0-8058 2 mqqnppqhdpreqfqerdqdrcpdqcodpccdnc
+F-H0-8059 10 qrpqqqoqppnqmpoodpnopomoonplnnqdddoc
+F-H0-8060 2 rdoqdpqpofphnfoepenepdmemdpcddocqcnc
+F-H0-8061 7 dedqppcncjdcpd
+F-H0-8062 4 cedqppcncjdcpd
+F-H0-8063 2 cgdqppcncjdcpd
+F-H0-8064 4 hqpqdpfqjdpkddpfncpd
+F-H0-8065 2 jppqdpfqjdpkddpfncpd
+F-H0-8066 2 dnpqdpfqjdpkddpfncpd
+F-H0-8067 4 dpqpddqd
+F-H0-8068 4 dcqpdpqd
+F-H0-8069 2 copqdddq
+F-H0-8070 2 opqpdpqd
+F-H0-8071 3 ojqqpqqpppqojppodpqnooqmpnpmonpdomddpl
+F-H0-8072 2 ercqdqcpppdojpcodpcneodmencmdnpdemdddl
+F-H0-8073 8 piqhpppddpndqfidofcd
+F-H0-8074 5 rdqhpppddpndqfidofcd
+F-H0-8075 4 copdopdc
+F-H0-8076 2 dppdopdc
+F-H0-8077 2 qocppedd
+F-H0-8078 2 dopdopdc
+F-H0-8079 4 idpqmppojppkdppdddfc
+F-H0-8080 4 hcpqmppojppkdppdddfc
+F-H0-8081 2 cfpqmppojppkdppdddfc
+F-H0-8082 2 dfpqmppojppkdppdddfc
+F-H0-8083 5 mppqepqkddpd
+F-H0-8084 2 jcdpppcioddc
+F-H0-8085 2 fqdpppcioddc
+F-H0-8086 7 onrppqdpfqqnjppnpocnplddpd
+F-H0-8087 5 qorppqdpfqqnjppnpocnplddpd
+F-H0-8088 11 phqpqidpqhpjpdpindqfddof
+F-H0-8089 6 qhdpppcipdqfjddegddc
+F-H0-8090 3 ndkqpmqppjoppddpddnc
+F-H0-8091 2 ncdpppcipdqfjddegddc
+F-H0-8092 6 cnppcidpcecfbebdpdfceddcddcccdbc
+F-H0-8093 2 morqqpqqpppqopnqdprproqnqopdqkdd
+F-H0-8094 2 dfppdpcfdepdddcdicfcecccdcdbebcb
+F-H0-8095 6 onpqdpqmpodcpd
+F-H0-8096 4 qqpqdpqmpodcpd
+F-H0-8097 4 jpcnppdjfppddpddpjncqf
+F-H0-8098 2 qkdpfqcnppjdjpddpfncpd
+F-H0-8099 2 cfdpfqcnppjdjpddpfncpd
+F-H0-8100 2 qjdpfqcnppjdjpddpfncpd
+F-H0-8101 7 pnqpoppddodd
+F-H0-8102 2 cocpeppdpodd
+F-H0-8103 2 dgpppedpedcd
+F-H0-8104 13 mfmeppqddpddnemcod
+F-H0-8105 8 nddppppfpjncpddclc
+F-H0-8106 3 oedppppfpjncpddclc
+F-H0-8107 5 cippdpedcedcpd
+F-H0-8108 2 dgppdpedcedcpd
+F-H0-8109 2 qlpqdpopqoddpd
+F-H0-8110 7 pfppcecppdnelcnchcjcdc
+F-H0-8111 3 ncdqoqqjqpqfqlofqhddpd
+F-H0-8112 2 qodpppqnqlonqhqjqddcoc
+F-H0-8113 9 qqprppnqpndpddpd
+F-H0-8114 2 mqprppnqpndpddpd
+F-H0-8115 5 ecdppqqopdedcd
+F-H0-8116 3 pldppqpopdeccd
+F-H0-8117 3 pldppqqopdedcd
+F-H0-8118 4 hqpqdpfqcfpdddfc
+F-H0-8119 2 ippqdpfqcfpdddfc
+F-H0-8120 2 fdpppdcpddqfnccf
+F-H0-8121 2 popqdpfqcfpdddfc
+F-H0-8122 12 rqqqqpopcppdpndd
+F-H0-8123 4 gqqpcpepdcpd
+F-H0-8124 3 dldodqpdqpdc
+F-H0-8125 2 eqqpcpepdcpd
+F-H0-8126 4 pepdoe
+F-H0-8127 6 dodqpdqocd
+F-H0-8128 4 qkcppqecpd
+F-H0-8129 10 ndpqqhdppdqfddof
+F-H0-8130 4 cnfqhqqpdpfoddpd
+F-H0-8131 3 dnfqdpqppd
+F-H0-8132 3 qfcddpncpd
+F-H0-8133 3 clcndpdcpd
+F-H0-8134 2 idqdppfcdd
+F-H0-8135 6 ljkkjkjjkjji
+F-H0-8136 3 qnnqppdcpd
+F-H0-8137 2 dfpqdpfcdd
+F-H0-8138 2 dddqppncpd
+F-H0-8139 4 phcopppepcdd
+F-H0-8140 4 ceqodpdedcpd
+F-H0-8141 5 pooqpdjpddep
+F-H0-8142 2 qcqodppjddpe
+F-H0-8143 5 fqppcndppdcjdd
+F-H0-8144 3 qqppqndppdqjdd
+F-H0-8145 2 bdcjpppddpddcf
+F-H0-8146 8 nppnppjj
+F-H0-8147 2 fqfpdpjj
+F-H0-8148 11 qqrppqdpfqrojpqnqopnpocnqldcpd
+F-H0-8149 11 opqqdrpqiqcqfqdpqpqnppcnqlddpd
+F-H0-8150 2 oooqornqnrmqrqqpqqpppqrorpqnjj
+F-H0-8151 5 eqepppcecppdjcdc
+F-H0-8152 4 dhppdpdeqjqddcoc
+F-H0-8153 3 pdpqdpcdpo
+F-H0-8154 3 fdqpdedcpd
+F-H0-8155 2 ecqpdedcpd
+F-H0-8156 9 cpfqipcqfpppdpcnddpd
+F-H0-8157 3 eqfqipcqfpppdpcnddpd
+F-H0-8158 2 fcppdpdgqjcfcedecdpddc
+F-H0-8159 9 fpppdqeodlcoddpd
+F-H0-8160 3 gcppdpeedhcedcpd
+F-H0-8161 12 pcppdppjqcnencqddcpd
+F-H0-8162 11 depqdpqdddcdhcfcdccc
+F-H0-8163 8 epcppqddpc
+F-H0-8164 2 qopqqddpcd
+F-H0-8165 7 cidppqfddedcpdebcdcbcc
+F-H0-8166 5 lcpfpprecpqdodddqcrcpc
+F-H0-8167 7 opqpqhdpogdjperfpdqfjdqdddqcpc
+F-H0-8168 2 hqppdpjpdjpcgefceddcddcccdfbhc
+F-H0-8169 6 dgcgppqddpddcffcbd
+F-H0-8170 3 pnnqrpppqncppdqmdd
+F-H0-8171 12 pppqdpfqpoooonnoddpd
+F-H0-8172 10 qqqppplpopdpnopopmoopdondd
+F-H0-8173 2 fnppephpdpcpfoeodmdopdendd
+F-H0-8174 8 dodqceqppd
+F-H0-8175 3 eqcpoqdcpd
+F-H0-8176 4 gqnqlqkpkqjpjqiphqdpppnolplopngopjdcpd
+F-H0-8177 2 ogppqlcpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-8178 2 fcdqppnepjlepfgepdkdldjdlcidkcddjcnchc
+F-H0-8179 2 mpnqlqkpkqjpjqiphqdpppnolplopngopjdcpd
+F-H0-8180 2 jqppqlcpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-8181 3 mqdppqpoqmonpd
+F-H0-8182 3 mpdppqooopnonpmoqoqnpopnpd
+F-H0-8183 2 rndppqooopnonpmoqoqnpopnpd
+F-H0-8184 2 lqdppqooopnonpmoqoqnpopnpd
+F-H0-8185 8 jqpqqqppqpdprnpoqnompdqldd
+F-H0-8186 3 djhqfrepfqdpdqcpcqgoppddpd
+F-H0-8187 2 cihqfrepfqdpdqcpcqgoppddpd
+F-H0-8188 8 dppdqpcc
+F-H0-8189 3 qldpqpqjopdcpd
+F-H0-8190 8 rejjqdrdpdqcocpcncobmcnb
+F-H0-8191 8 onqpopmppdcpdd
+F-H0-8192 7 qippqhdpchpiegqfdeofpdcfndbfjdcdddccdc
+F-H0-8193 3 lpnqlqkpppdppnnopjddmeqcqdpcpdncodnblc
+F-H0-8194 4 mpdppqqnfqonqpcnjpqmpmqkqiddpd
+F-H0-8195 2 fcdppqqnfqonqpcnjpqmpmqkqiddpd
+F-H0-8196 2 ncdppqqnfqonqpcnjpqmpmqkqiddpd
+F-H0-8197 6 oddpppqcpjpcnencqddcpd
+F-H0-8198 3 mcdpppqcpjpcnencqddcpd
+F-H0-8199 11 dopqdqfqipcqdpcpdcpd
+F-H0-8200 13 pkqjppqidpqhpjpdpindqfjdofdd
+F-H0-8201 10 qddpppqcpjncnedcpd
+F-H0-8202 8 iqpqhqfqhpipdphodnfoddpd
+F-H0-8203 2 iopqhqfqhpipdphodnfoddpd
+F-H0-8204 5 jpdpfqcnppqjqdddoc
+F-H0-8205 3 drdpfqcnppqjqdddoc
+F-H0-8206 7 cqhqfqdpppedpd
+F-H0-8207 3 efchpppedpddcf
+F-H0-8208 4 cnoqfqdpqpddpd
+F-H0-8209 3 kqoqfqdpqpddpd
+F-H0-8210 2 mqoqfqdpqpddpd
+F-H0-8211 2 lqoqfqdpqpddpd
+F-H0-8212 2 lddpppddqdocfc
+F-H0-8213 11 roqppplpopdpqopopdqndd
+F-H0-8214 8 qldpoqqjqpedpd
+F-H0-8215 5 hqpqdpfqdjqkddpd
+F-H0-8216 3 dnpqdpfqdjqkddpd
+F-H0-8217 2 jppqdpfqdjqkddpd
+F-H0-8218 7 endqdoqppdeodd
+F-H0-8219 4 cqdqdoqppdeodd
+F-H0-8220 6 hdqqpdcqcdec
+F-H0-8221 2 ciqqdpcedcqc
+F-H0-8222 2 edqqdpcedcqc
+F-H0-8223 8 qrnrpqqqoqnqmqppqpopnpdppddd
+F-H0-8224 6 podppqqnfqdnjpdcpd
+F-H0-8225 5 dcqpcnfpdjdppdfccd
+F-H0-8226 10 nrpqqqoqnqmqppqpopnpdppddd
+F-H0-8227 5 cppopqddqd
+F-H0-8228 2 plpopqddqd
+F-H0-8229 2 qopopqddqd
+F-H0-8230 12 qnppqpoplpqodppdpodd
+F-H0-8231 7 nedppqmdpdddndnc
+F-H0-8232 3 qepppfdppdpgcdqf
+F-H0-8233 4 qgqnpponnpolcppkqlpjplpiqkogqjpdqhdd
+F-H0-8234 3 nqfqlqppjqkpiqjphqiphpmodphodnfodcpd
+F-H0-8235 2 gofqlqppjqkpiqjphqiphpmodphodnfodcpd
+F-H0-8236 12 qqppqpoplprodpqopopdqndd
+F-H0-8237 7 lqnqfqdpppddpd
+F-H0-8238 2 kpnqfqdpppddpd
+F-H0-8239 2 qjqnpppddpddqf
+F-H0-8240 2 ipqqdrcqpqqpiqjpfqdppprnpoqnomdnqlddpd
+F-H0-8241 5 jddpppcepjdcpd
+F-H0-8242 2 kqpqdpqodjpddd
+F-H0-8243 2 jcdpppcepjdcpd
+F-H0-8244 5 onqnpppmjpoldppdpnddom
+F-H0-8245 11 nbppdppjrcqdqcpdpcodncnddclc
+F-H0-8246 8 nepqdpqkddpdnclc
+F-H0-8247 2 qcpqdpqkddpdnclc
+F-H0-8248 2 ncqhpppddpcdqfic
+F-H0-8249 2 jqqqdrcqpqqpiqjpfqdpppjoiprnpoqnomdnqlddpd
+F-H0-8250 5 qnppnqpddpdd
+F-H0-8251 4 cfppnqpddpdd
+F-H0-8252 11 eqdqqpcpdpcododdpd
+F-H0-8253 4 ncircqdripfqdpppdnfodcpd
+F-H0-8254 2 qfrpqqqnpponnprkcppdpkdd
+F-H0-8255 12 qfqedpcdpepc
+F-H0-8256 9 popqdpdjddpd
+F-H0-8257 2 qopqdpdjddpd
+F-H0-8258 2 jodrqqpqcqiqqpfqjpppdpiprnpoqnomdnqlddpd
+F-H0-8259 4 bqppdpbpcpdoeocoddpd
+F-H0-8260 12 jqnqlqkpkqjpppdplpnopnlopjdcpd
+F-H0-8261 12 ohqiqpqhdpphpjpdpindqfddof
+F-H0-8262 6 cnnpfqdpqpdcpd
+F-H0-8263 3 qlpnpqpddpcdqf
+F-H0-8264 3 doppcnjpdmdpdddnpcem
+F-H0-8265 2 cgegpqdfdppddgjdcfdd
+F-H0-8266 5 nqppeppjdcpd
+F-H0-8267 4 jdppeppjdcpd
+F-H0-8268 12 eedpppedfecddebdceecpd
+F-H0-8269 2 pppqdpqlpnpddd
+F-H0-8270 2 ccdpppchdfdcpd
+F-H0-8271 2 eddpppchdfdcpd
+F-H0-8272 2 egdpppchdfdcpd
+F-H0-8273 9 rnqqrppqdpfqrojpqnqopnponnrmcnqlddpd
+F-H0-8274 3 clgqeqppeocppddndd
+F-H0-8275 3 qbpfppqddpddoemcoc
+F-H0-8276 2 dlgqeqppeocppddndd
+F-H0-8277 2 fedpppcgeefdcedcpd
+F-H0-8278 6 ponppqdppkddpd
+F-H0-8279 3 oonppqdppkddpd
+F-H0-8280 2 kpnppqdppkddpd
+F-H0-8281 3 ndppcidppdqfdc
+F-H0-8282 2 lcdpkqddqpncpd
+F-H0-8283 9 dpqjppdcpd
+F-H0-8284 10 epeqpqdncpddpd
+F-H0-8285 13 qdqfpppedpndqeddpc
+F-H0-8286 5 qipqdppdqfqcrdncdd
+F-H0-8287 11 ppqpoplpqodppdpodd
+F-H0-8288 10 oopqqpoqppopnppodppdqodd
+F-H0-8289 2 dedqppcedfdcpd
+F-H0-8290 2 opeqfpqppdcpdd
+F-H0-8291 9 rokqdpfqcnqpqmpnqjqgddpd
+F-H0-8292 3 pmkqdpfqcnqpqmpnqjqgddpd
+F-H0-8293 4 cndppqqddcoc
+F-H0-8294 3 cfeqpqcpdcpd
+F-H0-8295 2 jqdqqpcocdpd
+F-H0-8296 4 deqopqoccpdcqd
+F-H0-8297 4 peqopqoccpdcqd
+F-H0-8298 2 qmqopqoccpdcqd
+F-H0-8299 3 jdjjppqddpdd
+F-H0-8300 3 popqdpjjddpd
+F-H0-8301 10 rnqqppqpoplprodpqopopdqndd
+F-H0-8302 5 drhpfqdpppdnfoddpd
+F-H0-8303 2 fgdpppdffehdpdddfc
+F-H0-8304 2 jddpppdffehdpdddfc
+F-H0-8305 9 rqqrnrpqqqoqnqmqppqpopnpdppddd
+F-H0-8306 7 qhppdpqfpdcfjdcdfdeceddcfc
+F-H0-8307 2 cnfqdpppdjcedfcdcffcdedcpd
+F-H0-8308 8 cidppqcdcfdcpd
+F-H0-8309 4 pjpqdpqpqnpddc
+F-H0-8310 3 hcqpdppdddfc
+F-H0-8311 2 ipfqdpppddqd
+F-H0-8312 2 qnnqppdppdcd
+F-H0-8313 2 dnfqdpppddqd
+F-H0-8314 3 cnpqdpfqdepd
+F-H0-8315 3 odqnppqdepdd
+F-H0-8316 2 pnpqdpfqdepd
+F-H0-8317 4 odpepdoe
+F-H0-8318 3 pcoepdod
+F-H0-8319 4 cfqqdppdddfc
+F-H0-8320 3 hqfqdpppddqc
+F-H0-8321 3 kpnqppdppdcc
+F-H0-8322 12 poqpopppqolppddpdd
+F-H0-8323 6 oonqppdqpjqnpdddjd
+F-H0-8324 3 pfdpppqfjpncpjdcpd
+F-H0-8325 5 qfpqdppdcdjdnc
+F-H0-8326 2 cqjpfqdpqpdcpd
+F-H0-8327 13 cpdqpqipfqdpcqdcpd
+F-H0-8328 9 gpipfqfpqpdpcndcpd
+F-H0-8329 3 cqipfqfpqpdpcndcpd
+F-H0-8330 9 gpdqqpdldoddpd
+F-H0-8331 5 ofpiqppdcpjdqfdd
+F-H0-8332 5 qqppnqkpdqpjdcpd
+F-H0-8333 2 loppnqkpdqpjdcpd
+F-H0-8334 6 qfppdppdcfkcddfc
+F-H0-8335 3 qjkqdpfqcnppddpd
+F-H0-8336 10 fpfqhqppdpdnddpd
+F-H0-8337 11 pnqppqppoqnpopdppoqopdoodd
+F-H0-8338 8 jppqmpopdpqkddpd
+F-H0-8339 10 npdpfqqnpponjpcnqlddpd
+F-H0-8340 6 jqnqlqmppplpkpdppjddpd
+F-H0-8341 2 oqnqlqmppplpkpdppjddpd
+F-H0-8342 10 fccdppqcdpeced
+F-H0-8343 3 ddcqppcededcpd
+F-H0-8344 3 qnpppddpddcj
+F-H0-8345 2 jppppddpddcj
+F-H0-8346 2 jqpppddpddcj
+F-H0-8347 2 qfjqdpppddpd
+F-H0-8348 5 cmpqdpckcedgcdcffcdedcpd
+F-H0-8349 4 popqdpckcedgcdcffcdedcpd
+F-H0-8350 12 bodqbqcqppepcpddpd
+F-H0-8351 11 pqdrqqiqcqfqdpqpqnppcnqlddpd
+F-H0-8352 3 egpqdfdppddgjdcfdd
+F-H0-8353 4 dgdfpqpddpjdcfdd
+F-H0-8354 5 mpdppqqnfqonqpcnjppjqhddpd
+F-H0-8355 5 pmdppqqnfqonqpcnjppjqhddpd
+F-H0-8356 2 npppqnjpondpqmqopmpoomrnpdpnddrm
+F-H0-8357 2 rlppqnjpondpqmqopmpoomrnpdpnddrm
+F-H0-8358 4 nqdpppqnpdcfjdddfc
+F-H0-8359 2 pidpfqcnppqfjpddpd
+F-H0-8360 2 qhdpfqcnppqfjpddpd
+F-H0-8361 12 dpdqppfodoeoenddpd
+F-H0-8362 3 hofrhqpqfpfqepdqdpcqcpbqdjpddd
+F-H0-8363 3 mcdppprcpjqcqdpcpdncoddcndnblc
+F-H0-8364 2 rddppprcpjqcqdpcpdncoddcndnblc
+F-H0-8365 2 donrlqrqqpqqpppqopnqnpdqpjddpd
+F-H0-8366 6 ccbpfqcncqckqppddpddfchc
+F-H0-8367 2 nqdrcqiqdpfqqnppcnqldcpd
+F-H0-8368 7 cqkqpqhqfqdpqoddpd
+F-H0-8369 2 dnkqpqhqfqdpqoddpd
+F-H0-8370 7 qqpqponqpddpdd
+F-H0-8371 5 nopqponqpddpdd
+F-H0-8372 5 pqqqmqopqpdppd
+F-H0-8373 4 rqqqmqopqpdppd
+F-H0-8374 10 pdjppppjdpjjddjd
+F-H0-8375 3 djdppppjjjddpd
+F-H0-8376 3 fqdppppjjjddpd
+F-H0-8377 2 hqjppppddpddjj
+F-H0-8378 11 hohqpqhpfqdpipdnfoddpd
+F-H0-8379 3 pkdpppqnoddd
+F-H0-8380 2 chppepcfddpd
+F-H0-8381 2 kqnqpppddodd
+F-H0-8382 5 cnpqdpfqcecfcddedcpd
+F-H0-8383 2 hqpqdpfqcecfcddedcpd
+F-H0-8384 10 mdpqdppdddndnc
+F-H0-8385 7 jpdpfqdnopdcpd
+F-H0-8386 2 jqdpfqdnopdcpd
+F-H0-8387 5 prqqpqppnqmpfqdpooponoonmonnplddpd
+F-H0-8388 4 oqqqpqppnqmpfqdpooponoonmonnplddpd
+F-H0-8389 11 ropqrpfqdpjpqnqopnpocnqldcpd
+F-H0-8390 6 doppcnjpdmdpdednpdem
+F-H0-8391 2 dlppcnjpdmdpdednpdem
+F-H0-8392 8 ccdqppdfpdcded
+F-H0-8393 3 pjndppcddppcpe
+F-H0-8394 6 beppdpfeedeecddebdceecpd
+F-H0-8395 3 pferdrhqcreqfqdqcqdpppdocpnccndcpd
+F-H0-8396 3 qferdrhqcreqfqdqcqdpppdocpnccndcpd
+F-H0-8397 2 rmqnpponjpqmdppmqoompopdrnddpn
+F-H0-8398 4 nppqpodpdcpd
+F-H0-8399 3 ccdppqpddedc
+F-H0-8400 2 fqpqpodpdcpd
+F-H0-8401 2 cepqpodpdcpd
+F-H0-8402 8 rdoqdpqpqjqlqfpdddnc
+F-H0-8403 2 ofoqdpqpqjqlqfpdddnc
+F-H0-8404 2 ldqfppcedppdnchcjcdc
+F-H0-8405 11 iplqnqkqkpjqjpppdplpnopnlopjdcpd
+F-H0-8406 4 ckdpppqjdgcecfcddefcpddc
+F-H0-8407 10 qcpppicppdqfndofddrd
+F-H0-8408 4 cnfqdpopddod
+F-H0-8409 2 qhpopddoddqf
+F-H0-8410 2 dfopdpodddfc
+F-H0-8411 2 pkqnpppedpde
+F-H0-8412 9 mopppqmpnqdpooponoonplnnqdddoc
+F-H0-8413 5 qoerdrhqcreqpqdqfqdpcqpocpdocndcpd
+F-H0-8414 3 mcdqpppecfdecdddpchcfcecccdcdbebcb
+F-H0-8415 2 pnopqpqhdpreqfqerdqdrcpdqcodpccdnc
+F-H0-8416 3 pjqdppnddpmdqeddnepcpdocodmcrcqbqcobncmbnb
+F-H0-8417 3 pjdpppdgefcgcfbgbfdfdecepdbeddcdecdcccbccb
+F-H0-8418 3 qngrfrerfqcrcqgqbqeqepdqdpppfogpcofppdcpdd
+F-H0-8419 2 cfdqcrbqeqcpcqcoppbodpdndodmencmcnbmbnddpd
+F-H0-8420 4 nppqcppdqodd
+F-H0-8421 2 kqppeqcpdcpd
+F-H0-8422 2 nqppeqcpdcpd
+F-H0-8423 2 fqdqqppdcodd
+F-H0-8424 9 ddfqppcqdpcneopd
+F-H0-8425 2 dqfqppcqdpcneopd
+F-H0-8426 10 qqpqppoqopqpqonppddpdd
+F-H0-8427 6 pfdpkqcnfqncqpdcpd
+F-H0-8428 3 fqcnpqpddpcdqkncqf
+F-H0-8429 2 lcdpkqcnfqncqpdcpd
+F-H0-8430 2 pjdpkqcnfqncqpdcpd
+F-H0-8431 2 odppdpcfdememdpdddndnccdhcfcecccdcdbebcb
+F-H0-8432 3 ndpopdqfdd
+F-H0-8433 3 qfedppncpd
+F-H0-8434 2 dpedppncpd
+F-H0-8435 9 npdppqpoqkddpd
+F-H0-8436 2 oqopkqpdqpdddp
+F-H0-8437 2 chppiccffcdddbcc
+F-H0-8438 7 pfqedpqdqfcdpepc
+F-H0-8439 3 pgqedpqdqfcdpepc
+F-H0-8440 5 qqpqppnqmpfqdpooponoonmonnplddpd
+F-H0-8441 10 cddppqddqdhcfcdccc
+F-H0-8442 5 pqqqmqopqppdcpdd
+F-H0-8443 4 cbppdqdecgpddccc
+F-H0-8444 9 qqdrercrhqpqeqfqdqcqdpnppocpdocnddpd
+F-H0-8445 2 lqdrercrhqpqeqfqdqcqdpnppocpdocnddpd
+F-H0-8446 2 pfcqppncpjdcpd
+F-H0-8447 2 lqnqppdqpjccpd
+F-H0-8448 2 dncnppcdjpqcdp
+F-H0-8449 5 qqmqqnppqddpdd
+F-H0-8450 4 jpdppqcmfqddpd
+F-H0-8451 2 dipdppddcpgccf
+F-H0-8452 7 oqcqqpdcpd
+F-H0-8453 2 fpcqqpdcpd
+F-H0-8454 2 nqcqqpdcpd
+F-H0-8455 3 oqpdcocd
+F-H0-8456 2 ecpqeqpd
+F-H0-8457 2 epqdqodd
+F-H0-8458 7 pfppqfdppeqendqdddpc
+F-H0-8459 5 gdppdppddfcdedecfcdc
+F-H0-8460 5 cfpqjqqodppdddfc
+F-H0-8461 3 dfpqjqqodppdddfc
+F-H0-8462 2 hcpqjqqodppdddfc
+F-H0-8463 5 rpnqdpfqqnppcnjpddpd
+F-H0-8464 4 qknqdpfqqnppcnjpddpd
+F-H0-8465 5 qffqdpppcnjpddpdnckd
+F-H0-8466 5 qqppnqkpdppdcfjdddfc
+F-H0-8467 2 pffqdpppcnjpddpdnckd
+F-H0-8468 4 cfdpfqcnppidpdddfc
+F-H0-8469 3 fedpfqcnppidpdddfc
+F-H0-8470 2 pjdpfqcnppidpdddfc
+F-H0-8471 2 phppdppeqnddpc
+F-H0-8472 2 fcppdqdocfddpd
+F-H0-8473 5 cqppcnjpdmdpcmenpddnddem
+F-H0-8474 4 olppqnjpqmdppmpnpdonddom
+F-H0-8475 8 qqmqopqpnodppdpndd
+F-H0-8476 4 lpmqopqpnodppdpndd
+F-H0-8477 5 iqcqdrdppqdnfqddpd
+F-H0-8478 2 dkcqbpppcnfppddpcd
+F-H0-8479 2 jddpppdfpcddfcccdb
+F-H0-8480 2 jpdrqqpqcqiqqpfqdppprnpoqnomdnqlddpd
+F-H0-8481 8 qfjjrerdqdrcpdqcocpcncobmcnb
+F-H0-8482 6 gddpppciocdc
+F-H0-8483 2 cppqeqqkddpd
+F-H0-8484 2 ncpqeqqkddpd
+F-H0-8485 2 nqpqeqqkddpd
+F-H0-8486 5 qjjqdpfqcnppddpd
+F-H0-8487 5 qnjqdpfqcnppddpd
+F-H0-8488 3 cnpppddpddqjncqf
+F-H0-8489 11 onrpqqdppqrofqqnjppnqocnpormqlddpd
+F-H0-8490 6 eddjpppddpndqicdqfqcrdic
+F-H0-8491 2 fqpqdpjpddqkncpfkcpdpbqc
+F-H0-8492 8 cneqdqqpcpdpcododdpd
+F-H0-8493 2 cqeqdqqpcpdpcododdpd
+F-H0-8494 8 leppmedpqdmfddnemcod
+F-H0-8495 3 gpepgqfoppgncppdgodd
+F-H0-8496 6 ppqqpqdpfqpoooddpd
+F-H0-8497 3 opqqpqdpfqpoooddpd
+F-H0-8498 5 phppqjdpqipkqhpjpdpindqfjdofdd
+F-H0-8499 2 qhqnpponnppkjppjdppiqlpdqkddqj
+F-H0-8500 8 qldpppqnqhqjqdddnc
+F-H0-8501 3 mcdpnqqjqpqfqlddpd
+F-H0-8502 2 ncdpnqqjqpqfqlddpd
+F-H0-8503 2 olqnpppmjppldpqdpncdom
+F-H0-8504 2 onqnpppmjppldpqdpncdom
+F-H0-8505 9 cqdqppclcnddpd
+F-H0-8506 10 ooopqpqopppolppddpdd
+F-H0-8507 3 ceppdpdedhpdddeddcec
+F-H0-8508 4 lqnqppeqpjdcpd
+F-H0-8509 2 jpdqppncpjecpd
+F-H0-8510 2 cfpqdpocdjfcdd
+F-H0-8511 6 jdpqdpfqcnjpddqfncpd
+F-H0-8512 2 pnpqdpfqcnjpddqfncpd
+F-H0-8513 2 qnpppecpde
+F-H0-8514 2 pjdpopdcod
+F-H0-8515 7 iphqpqdpfqcnfoddpd
+F-H0-8516 3 qjnqqnppondpqdqldd
+F-H0-8517 3 hdpqdppdcdec
+F-H0-8518 3 popqdppdcdec
+F-H0-8519 2 qmqopqpddpcd
+F-H0-8520 4 rcrejjqdrdpdqcocpcncobmcnb
+F-H0-8521 12 dnfqhpppdpfoddpd
+F-H0-8522 12 cpqpdqdpcododdpd
+F-H0-8523 4 qfdrercrhqpqeqmqdqfqdpcqqocpdocnddpd
+F-H0-8524 3 npdrercrhqpqeqmqdqfqdpcqqocpdocnddpd
+F-H0-8525 2 kqdrercrhqpqeqmqdqfqdpcqqocpdocnddpd
+F-H0-8526 8 cqgqpqcpepddpd
+F-H0-8527 2 fogqpqcpepddpd
+F-H0-8528 12 dqbqcqppepcpddpd
+F-H0-8529 6 qqprlqnqppnodppdpndd
+F-H0-8530 8 mopppqmpnqdpfqpoooonnonnplddpd
+F-H0-8531 8 qmppdpqhqjqdddod
+F-H0-8532 4 qnppdpqhqjqdddod
+F-H0-8533 7 rmqqrppqdpfqrojpqnqopnpocnqldcpd
+F-H0-8534 4 nnqqrppqdpfqrojpqnqopnpocnqldcpd
+F-H0-8535 8 qpqqpqpodppdqmddqf
+F-H0-8536 2 rqqqmqopfqdpqpddpd
+F-H0-8537 4 qqdrnqlqdpfqcnppddpd
+F-H0-8538 2 hqdrnqlqdpfqcnppddpd
+F-H0-8539 3 codqqpopcdpc
+F-H0-8540 2 dnpqcpepqddc
+F-H0-8541 2 pedqqpedcdpc
+F-H0-8542 2 qocppqpodcqd
+F-H0-8543 4 ncpqqqfqqpppdpjprnpoqnomdnqlddpd
+F-H0-8544 11 eqdrercrdqpqipfqdpcqdocpdcpd
+F-H0-8545 9 fcppfqdodqdncpcncodfcecfcddedcpd
+F-H0-8546 2 edppfqdodqdncpcncodfcecfcddedcpd
+F-H0-8547 11 rpqqpqppoqopqpqonppddpdd
+F-H0-8548 3 dqcopqddpd
+F-H0-8549 2 peddqpocdp
+F-H0-8550 2 pkcopqddpd
+F-H0-8551 2 dpedpc
+F-H0-8552 2 cpedpc
+F-H0-8553 2 pcdocd
+F-H0-8554 5 popqjpqkdppdddjd
+F-H0-8555 4 qfpqjpqkdppdddjd
+F-H0-8556 11 jplqnqkqdqppkplpnopnlopjddpd
+F-H0-8557 8 nepqdpqdodmcddfc
+F-H0-8558 2 qcpqdpqdodmcddfc
+F-H0-8559 6 dbdpppdhdefcpddcedebec
+F-H0-8560 3 rfqfppredpqdqeldpeddod
+F-H0-8561 9 dppqeqepdncpddpd
+F-H0-8562 6 qdpdqcdd
+F-H0-8563 4 qpppqqpd
+F-H0-8564 3 qoerdrkqcrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-8565 3 fcerdrkqcrhqpqeqfqdqcqdpcpdocnddpd
+F-H0-8566 4 dcdppqocqd
+F-H0-8567 3 lddppqocqd
+F-H0-8568 12 pppqqqqppocpqdqmdd
+F-H0-8569 2 dhdqppcedcqd
+F-H0-8570 3 jpqrpqqqoqppnqmpoodpnopomoonplnnqdddoc
+F-H0-8571 3 pnqrpqqqoqppnqmpoodpnopomoonplnnqdddoc
+F-H0-8572 4 cedqqpdedcpd
+F-H0-8573 3 qedppqpocdpc
+F-H0-8574 4 rddpppddpjrcqdqcpdpcodncndnblc
+F-H0-8575 2 hofrhqfqfpdqepcqdpbqcpppdjpddd
+F-H0-8576 2 pjppchdpdfcfdebfpdcdjdccddcbdc
+F-H0-8577 8 mbppqddpndqeddpdpcodocrcmcqcqbncobnb
+F-H0-8578 7 deppdodcpd
+F-H0-8579 2 codqpppdde
+F-H0-8580 7 eqfppqdpfqfogpddpd
+F-H0-8581 6 cqiqfqdpppdcpd
+F-H0-8582 2 fedqppddpdicfc
+F-H0-8583 4 ncppdpjpdcpd
+F-H0-8584 4 fqppqddpdddj
+F-H0-8585 3 qjppdpjpdcpd
+F-H0-8586 7 npnqlqdpppqnpjdcpd
+F-H0-8587 2 pnnqlqdpppqnpjdcpd
+F-H0-8588 7 cqhqpqfpfqdpcnddpd
+F-H0-8589 3 gphqpqfpfqdpcnddpd
+F-H0-8590 10 fcqdppcdcpeced
+F-H0-8591 2 dpdqpqcododcpd
+F-H0-8592 12 drdqpqipfqdpcqdocpdcpd
+F-H0-8593 4 ncppdpokddpd
+F-H0-8594 3 djppdpokddpd
+F-H0-8595 3 qfppdpokddpd
+F-H0-8596 5 ddeqqppd
+F-H0-8597 3 qpcodcpd
+F-H0-8598 3 qqcodcpd
+F-H0-8599 2 gqjqppcedppdjcmcgcdc
+F-H0-8600 2 nqppdpqmqjcjqgqdddoc
+F-H0-8601 2 qleqppcpcmqjcjcgpddd
+F-H0-8602 8 mdppqddpndqeddnepcpdocodmcrcqbqcobncmbnb
+F-H0-8603 6 opqppddpcdcjec
+F-H0-8604 4 cnjqpqdpqodcpd
+F-H0-8605 2 hcdppqdgcedcqd
+F-H0-8606 11 oqpppqdpfqpoooonnoddpd
+F-H0-8607 11 qperdrhqcreqpqdqfqdpcqpocpdoqoqncnddpd
+F-H0-8608 3 ddqpdppepc
+F-H0-8609 2 pqoddpdcqd
+F-H0-8610 2 deoddpdcqd
+F-H0-8611 2 mcoddpdcqd
+F-H0-8612 11 bpkqpqfpqodpcnddpd
+F-H0-8613 11 dffqppdqdocpdncocncecfcddedcpd
+F-H0-8614 12 cnerdreqcrdqpqipfqdpcqdocpdcpd
+F-H0-8615 6 pnqpopdpdcpd
+F-H0-8616 3 qqqpopdpdcpd
+F-H0-8617 11 pqqqfqdpppqnjpcnqldcpd
+F-H0-8618 5 ddppdpdeeepddccc
+F-H0-8619 2 cbppdpdeeepddccc
+F-H0-8620 2 dncqdqppeododdpd
+F-H0-8621 3 rdjjpdqfnclc
+F-H0-8622 2 pnlqnqqnppjj
+F-H0-8623 9 eqppdqdpfodoeoenddpd
+F-H0-8624 10 plqqrppqdpfqrojpqnqopnpocnonrmqlddpd
+F-H0-8625 2 omqqrppqdpfqrojpqnqopnpocnonrmqlddpd
+F-H0-8626 9 bcppdpcfchpdcddddccc
+F-H0-8627 3 dohpeqcpppddpd
+F-H0-8628 3 efdppphdpdcdec
+F-H0-8629 10 qrpqqqoqpprpopqpqonppddpdd
+F-H0-8630 4 nepdoeod
+F-H0-8631 11 cedpppdepdeccd
+F-H0-8632 3 rcreqfqdrdpdqcnd
+F-H0-8633 10 dndqeqcqppcpdpcododdpd
+F-H0-8634 2 dfpdppcddpeccedcedccdd
+F-H0-8635 10 goppfqgpdqdpfodoeofndlenddpc
+F-H0-8636 8 ponppqdppdqocd
+F-H0-8637 6 drjppqdpfqdnfoddpd
+F-H0-8638 3 mnppqnnpondpqdpjdd
+F-H0-8639 2 lpjppqdpfqdnfoddpd
+F-H0-8640 5 bbdpppdhdefdpddccdcbcc
+F-H0-8641 2 ecdpppdhdefdpddccdcbcc
+F-H0-8642 3 epppbqbpdpdocpcoeoboddpd
+F-H0-8643 3 jppqdpqkdjpddd
+F-H0-8644 3 djkqpdqpjddpdd
+F-H0-8645 2 fqdpppcipjdcpd
+F-H0-8646 4 qnpqdpqopocfdepdddcdhcfcecccdcdbebcb
+F-H0-8647 3 ndpcqe
+F-H0-8648 4 mqdppqpofqonqmddpd
+F-H0-8649 3 npdppqpofqonqmddpd
+F-H0-8650 11 ecpqdpqddecdddfchcccdcdbebcb
+F-H0-8651 6 cnoqdpfqddqe
+F-H0-8652 3 dnoqdpfqddqe
+F-H0-8653 2 ipoqdpfqddqe
+F-H0-8654 11 ebpqdpqddecdddfchcccdcdb
+F-H0-8655 5 efdpppcldjcdcfdcpd
+F-H0-8656 4 nopqqqoqqpnqppopnppodppnqopdoodd
+F-H0-8657 3 foppeqfpdqepcqcpdpdoeocodncnddpd
+F-H0-8658 2 ocdpqdndcd
+F-H0-8659 3 qnppdedpoc
+F-H0-8660 2 pmppdedpoc
+F-H0-8661 2 fqdpopddqe
+F-H0-8662 3 popqdpfqpnqoddpd
+F-H0-8663 3 cnpqdpfqpnqoddpd
+F-H0-8664 2 hqpqdpfqpnqoddpd
+F-H0-8665 8 qnnqpqopoqnpqppddpddqf
+F-H0-8666 2 deppcndppdfdcdedecfcdc
+F-H0-8667 2 dnfqeqfpdqeppppdcpddcf
+F-H0-8668 2 ldodppdcqd
+F-H0-8669 2 cpodppdcqd
+F-H0-8670 2 ndqpddpepc
+F-H0-8671 5 qpodcpdd
+F-H0-8672 3 dppdqped
+F-H0-8673 11 ckjqpqcqbpfpqodpcnddpd
+F-H0-8674 3 iqcqdrdpfqdnppdcpd
+F-H0-8675 6 ppdedpqd
+F-H0-8676 5 ikkljkkkljjjkjji
+F-H0-8677 3 qjkqdpfqdnqpdcpd
+F-H0-8678 3 nckqdpfqdnqpdcpd
+F-H0-8679 10 qoqqpqppqppocpqdqmdd
+F-H0-8680 10 qfdpqdodddndpcncoc
+F-H0-8681 9 mdppdppjqfpdncnddclc
+F-H0-8682 4 ppddcpocqd
+F-H0-8683 2 hdpdqpeccd
+F-H0-8684 2 gcpdqpeccd
+F-H0-8685 2 odppdqqepc
+F-H0-8686 4 cqdpcnqopddkcd
+F-H0-8687 4 cnippqdpfqecpd
+F-H0-8688 3 foippqdpfqecpd
+F-H0-8689 11 qpqqlqnqppdppjddmeqcqdpcpdncodnblc
+F-H0-8690 5 eqcpppqdcfkcddfc
+F-H0-8691 3 jcdqnqqnppqiddpc
+F-H0-8692 3 epcpppqdcfkcddfc
+F-H0-8693 5 cnqqdpfqddpd
+F-H0-8694 2 qlqnppdddpqc
+F-H0-8695 2 dnqqdpfqddpd
+F-H0-8696 7 rfppqhdpqeqipdpindqfjdofdd
+F-H0-8697 2 plppqnjppmdpolpnpdonddom
+F-H0-8698 9 cmdreqcrcqdqbqcpppcodpcndodmdnddpd
+F-H0-8699 2 bbdpppdgdfcfdecepdcddddcecdbcccbbc
+F-H0-8700 6 pnqpoqdppedd
+F-H0-8701 3 doppeqcpdepd
+F-H0-8702 5 beppcndppdcehdedcd
+F-H0-8703 4 ppoqpqdpfqpoplddpd
+F-H0-8704 3 opoqpqdpfqpoplddpd
+F-H0-8705 9 dddpppjjpd
+F-H0-8706 2 djppdpjjdd
+F-H0-8707 2 pgpfrfqeqfrdrepdlcnc
+F-H0-8708 7 fppqipfqdpdnddpd
+F-H0-8709 2 efppdpdfidpcddfc
+F-H0-8710 2 oonpppqndpqdpkdd
+F-H0-8711 2 mpppnqnpdppjdjjjddpd
+F-H0-8712 12 qnpqqqqpppcppoqoqdqmdd
+F-H0-8713 4 qqmqopqpdpqmnopddd
+F-H0-8714 3 hpgqppcpepcmfoddpd
+F-H0-8715 4 nppopqondppdqm
+F-H0-8716 2 moopmqdpqpnopd
+F-H0-8717 2 didpcgefpddedc
+F-H0-8718 2 jcneppodqdddmc
+F-H0-8719 4 edpqdpnqpoqpqnqopnpdqjcd
+F-H0-8720 4 qfpqdpnqpoqpqnqopnpdqjcd
+F-H0-8721 5 pqqodpdepd
+F-H0-8722 3 deopdpecpd
+F-H0-8723 9 nrlqqqqppqppnqopdppjddmeqcqdpcpdncodnblc
+F-H0-8724 3 rqlqqqqppqppnqopdppjddmeqcqdpcpdncodnblc
+F-H0-8725 2 cnppdedpqd
+F-H0-8726 2 cfdppqddod
+F-H0-8727 2 jddpopddpc
+F-H0-8728 5 qfcnppdkfppddpdd
+F-H0-8729 4 qfppdppddfidddfc
+F-H0-8730 6 qoqrnrorrqpqqqoqnqmqppqpopnpdppddd
+F-H0-8731 3 mrqrnrorrqpqqqoqnqmqppqpopnpdppddd
+F-H0-8732 5 ncnqpppddpddqf
+F-H0-8733 3 pfppqndppdncdd
+F-H0-8734 8 ornrqrrqpqqqoqnqmqppqpopnpdppddd
+F-H0-8735 12 qddpqeqfcdpepc
+F-H0-8736 9 bqppdpbpcpdoeocoddpc
+F-H0-8737 8 qkqrqqorqppqdppdpodd
+F-H0-8738 2 hqbqdqppcqcpepboddpd
+F-H0-8739 2 lpopdqcoqpddpd
+F-H0-8740 2 qopopqdddpocqd
+F-H0-8741 2 mdpopqdddpocqd
+F-H0-8742 2 doeqcppppddedc
+F-H0-8743 2 kdpopqdddpocqd
+F-H0-8744 4 nppqnqoqopqpdppdpncd
+F-H0-8745 2 gpeqfqdqppcpepqddndd
+F-H0-8746 11 rpdrqqiqpqfqcqqpdpppqnopcnqlddpd
+F-H0-8747 10 cpcqdqppclcnddpd
+F-H0-8748 8 odpqdpcfdeqdddcdhcfcecccdcdbebcb
+F-H0-8749 2 qerqqpqqpppqopnqdprproqnqocdqlpc
+F-H0-8750 5 jdpqdppkddqfncpd
+F-H0-8751 5 pbpqdppkddqfncpd
+F-H0-8752 5 kcpqdpcfqdddfc
+F-H0-8753 2 prppnqqncpdcpd
+F-H0-8754 3 qpopdpcjddpd
+F-H0-8755 2 ncopdpcjddpd
+F-H0-8756 4 odqddpcdpo
+F-H0-8757 12 pqlqqqqpnqppdppjddmeqcqdpcpdncodnblc
+F-H0-8758 4 ccqodppdcffcdddb
+F-H0-8759 2 qmrpnqqnpppddpec
+F-H0-8760 6 cddppqponqqnqppnqoqjpd
+F-H0-8761 3 oeppqddpodneddndocnc
+F-H0-8762 3 fdppdpefdedfcecfdcpd
+F-H0-8763 2 djppdpefdedfcecfdcpd
+F-H0-8764 2 pnnqppeppjedpd
+F-H0-8765 2 pnqnpppejpdedp
+F-H0-8766 2 dipopddojdcfdd
+F-H0-8767 10 dnpqhpfqdpfoddpd
+F-H0-8768 10 frhqpqepfqdpdqcpcqddpd
+F-H0-8769 10 cfdppqdeqdddcdhcfcecccdcdbebcb
+F-H0-8770 9 qqpqqpoqppopnppodppnqopdoodd
+F-H0-8771 6 jcnqpqiqoqopgqmpdqioqppdcoddqn
+F-H0-8772 3 fqdpoqqkqpokqmpgqeqfqdpepcddnc
+F-H0-8773 9 qfoqdqqpqjqldcpd
+F-H0-8774 2 qgoqdqqpqjqldcpd
+F-H0-8775 8 onpqdpoopopd
+F-H0-8776 2 qqpqdpoopopd
+F-H0-8777 4 pcdppqqnfqonqpcnmpqkjpddqincpd
+F-H0-8778 3 ndfqcnppdjdpdgqfpdfecdickcfcdc
+F-H0-8779 10 eppqhqfqdpdqcpcqddpd
+F-H0-8780 10 fcrqdrqqiqpqfqnqqpcqpprpopdproqnqocnqlddpd
+F-H0-8781 10 omppqpoplpnocpnnoopmqnpdondd
+F-H0-8782 5 ipdpoqcnfqdcpd
+F-H0-8783 3 jpdpoqcnfqdcpd
+F-H0-8784 2 drdpoqcnfqdcpd
+F-H0-8785 3 pojppqdpjddjpcdffcdd
+F-H0-8786 3 eqdjqppdcpndpjjdqfdd
+F-H0-8787 2 qnppdqjpjdpjncpfdcpd
+F-H0-8788 9 roqrpqqqoqpprpopqpqonppddpdd
+F-H0-8789 2 fdppdpdedfpdceddcdecdcccdbbc
+F-H0-8790 6 roopqpqolppdcpdd
+F-H0-8791 3 pdppqddpldqecdod
+F-H0-8792 5 fedqppdhcedcpd
+F-H0-8793 5 dndqppdlcodcpd
+F-H0-8794 6 qonppqdpfqpocqeocnddpd
+F-H0-8795 3 dqnppqdpfqpocqeocnddpd
+F-H0-8796 10 dbdppqdeqdddcdhcfcdccc
+F-H0-8797 3 opqmqpqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-8798 4 ldppdppjlenemdmencpddcnd
+F-H0-8799 4 coppcnjpdmdpelenpddncdem
+F-H0-8800 2 mcppdppjlenemdmencpddcnd
+F-H0-8801 4 ocpcpd
+F-H0-8802 4 qcpcpd
+F-H0-8803 2 peqdpd
+F-H0-8804 4 lddddpocqd
+F-H0-8805 2 ppdddpocqd
+F-H0-8806 2 dceqcppppd
+F-H0-8807 9 pnqqpqppqppocpqnqoqdqmdd
+F-H0-8808 5 qqpqppoqdpfqpoooonnoddpd
+F-H0-8809 4 pkpqppoqdpfqpoooonnoddpd
+F-H0-8810 2 pmpqppoqdpfqpoooonnoddpd
+F-H0-8811 8 fdpqdpcfidqdddfc
+F-H0-8812 3 npnqppqndpcdpkpc
+F-H0-8813 5 pjdpkqcnfqjdqpddpfncpd
+F-H0-8814 2 qjnqppjppndpqdcfkcddfc
+F-H0-8815 7 gpippqfpfqdpcndcpd
+F-H0-8816 3 cqippqfpfqdpcndcpd
+F-H0-8817 6 fedpppdhefeedecepdddfddced
+F-H0-8818 10 epdqppcqdpddpd
+F-H0-8819 6 enppcndpcddkpc
+F-H0-8820 4 cnippqdpfqddqd
+F-H0-8821 9 djpqcnfppddpcd
+F-H0-8822 9 ocpfpqodcpddqd
+F-H0-8823 11 nqdrrqiqqqfqpqqpcqpprpopdproqnqocnqlddpd
+F-H0-8824 2 lnnqpplpnodppjddpd
+F-H0-8825 4 qpoqcpddpd
+F-H0-8826 3 pddppqqedd
+F-H0-8827 2 eqoqcpddpd
+F-H0-8828 11 nqqqpqqpoqppopnppodppnqopdoodd
+F-H0-8829 11 qorqdrqqiqpqfqcqqprpppdpopqnrocnqlddpd
+F-H0-8830 5 qgpppfdpodqfddqd
+F-H0-8831 5 gdppdppddefcfddc
+F-H0-8832 8 ncdpppndqdddoc
+F-H0-8833 3 deppcedppddfdc
+F-H0-8834 11 reqfqdrdpdqcnd
+F-H0-8835 3 depood
+F-H0-8836 2 coedpe
+F-H0-8837 2 doedpe
+F-H0-8838 8 roqpopppnplppodppnoopdondd
+F-H0-8839 3 dhdqqdppdcce
+F-H0-8840 3 epcodqpdqpdc
+F-H0-8841 2 hqeqcpqpdcpd
+F-H0-8842 5 qodppqpnfqdnjpddpd
+F-H0-8843 2 podppqpnfqdnjpddpd
+F-H0-8844 2 oodppqpnfqdnjpddpd
+F-H0-8845 10 ooppqqopqprolpqodprnpopdqndd
+F-H0-8846 10 pqnqoqopqpdppdpncd
+F-H0-8847 5 fopqfpfqdpgpgohodjpddd
+F-H0-8848 5 pbdppplepjndpdldkdncmcdclc
+F-H0-8849 3 pfdppplepjndpdldkdncmcdclc
+F-H0-8850 4 popqodcpdcqd
+F-H0-8851 2 pnpqodcpdcqd
+F-H0-8852 2 nddqqpcdpepc
+F-H0-8853 7 ndppdppjlepdldkdncmcdclc
+F-H0-8854 6 dpqoddod
+F-H0-8855 5 dcopdpqe
+F-H0-8856 3 oqecqe
+F-H0-8857 2 pcqeoq
+F-H0-8858 6 cfppdpodpfddreqcqdpcrckc
+F-H0-8859 3 nqppdpodpfddreqcqdpcrckc
+F-H0-8860 9 dpdqcqcpppclcnddpd
+F-H0-8861 11 ibdppqdffeidqdddfcccdb
+F-H0-8862 5 pmqpoplpcddppc
+F-H0-8863 5 onqpoplpcddppc
+F-H0-8864 5 dlcqdqcpppdojpcodpcneodmenpddncdem
+F-H0-8865 8 prppnqkpdppnnoddpd
+F-H0-8866 8 dcpqcppc
+F-H0-8867 3 dpqdpqcd
+F-H0-8868 11 rqdrqqiqpqfqcqqprpppdpopqnrocnqlddpd
+F-H0-8869 3 ofppdppjqfpddd
+F-H0-8870 3 cqppfqjppddpdd
+F-H0-8871 10 cbdppqdeqdddcdhcfcdcccebdb
+F-H0-8872 7 drhppqdpfqdnfoddpd
+F-H0-8873 2 jphppqdpfqdnfoddpd
+F-H0-8874 2 fmhppqdpfqdnfoddpd
+F-H0-8875 3 ddppodqd
+F-H0-8876 3 ndddpepc
+F-H0-8877 3 eqppcpfpdcpd
+F-H0-8878 3 dfppdqpdcdfd
+F-H0-8879 11 opqqlqpqqpnqppdppjddmeqcqdpcpdncodnblc
+F-H0-8880 3 dpqppepcdd
+F-H0-8881 3 deqdppdcod
+F-H0-8882 3 eqdqppcddo
+F-H0-8883 5 ncpqjqbpcqqofpcndpckddpd
+F-H0-8884 3 cgdrcqiqppfqdppddncdcjec
+F-H0-8885 2 ncdrcqiqppfqdppddncdcjec
+F-H0-8886 2 qcnfqfpdlcnd
+F-H0-8887 2 oqpplqnpqnnn
+F-H0-8888 6 dnfqopqpdpcnddpc
+F-H0-8889 3 eepqdpcfodqdddfc
+F-H0-8890 2 pnnqppqndpcdpepc
+F-H0-8891 8 mppqdpplpoqdddnc
+F-H0-8892 2 nopqdpplpoqdddnc
+F-H0-8893 2 nppqdpplpoqdddnc
+F-H0-8894 3 cnppddjpocdp
+F-H0-8895 6 oopqdpqmqoddpd
+F-H0-8896 4 edppdpcgcedcpd
+F-H0-8897 6 podrercreqpqdqfqipcqdpcpdocndcpd
+F-H0-8898 2 fpdrercreqpqdqfqipcqdpcpdocndcpd
+F-H0-8899 6 nqppdppdjjdd
+F-H0-8900 2 dgpdpoiddocd
+F-H0-8901 2 qfpdpoiddocd
+F-H0-8902 2 fcdqqoddpd
+F-H0-8903 2 dedpppdcqe
+F-H0-8904 8 qqpqdpnqpoddpd
+F-H0-8905 2 ofdpppqfodqddd
+F-H0-8906 5 cmfqeqepdqfmpppdcpdd
+F-H0-8907 3 jcnqpqopoqnmqppddpdd
+F-H0-8908 6 icdfppbeedpddccdccbc
+F-H0-8909 6 qlqrqqorqppqponpddpd
+F-H0-8910 5 pjpppddpcddiic
+F-H0-8911 2 mddpppkdqiddpc
+F-H0-8912 11 dqhqpqdpfqcpcqddpd
+F-H0-8913 4 dqpecdedpc
+F-H0-8914 4 mqopqpdpdepd
+F-H0-8915 2 dhdpopdedcpd
+F-H0-8916 2 fddpopdedcpd
+F-H0-8917 10 neqdppnddpddqepcpdocodmcrcqbqcobncmbnb
+F-H0-8918 10 eqpqipfqfpcqdpgpfocnddpd
+F-H0-8919 4 popqdpqdecoc
+F-H0-8920 2 qnpqdpqdecoc
+F-H0-8921 5 roopqpqolppddpcd
+F-H0-8922 3 ppopqpqolppddpcd
+F-H0-8923 3 poopqpqolppddpcd
+F-H0-8924 5 fpdqqppddodd
+F-H0-8925 5 qqpqcppdpodd
+F-H0-8926 9 qqpqppnqmpoodpnopomoonplnnqdddoc
+F-H0-8927 12 crerdrdqpqipfqdpcqdocpdcpd
+F-H0-8928 6 qcofppqedpoeneqdpdddod
+F-H0-8929 3 dgdpppfeefeedeecpddcdd
+F-H0-8930 2 dkeqppdqdpfodoeoenddpd
+F-H0-8931 5 lpjppqdppkdcpd
+F-H0-8932 3 opqppddpiddjcd
+F-H0-8933 2 jdjppqdppkdcpd
+F-H0-8934 5 nqppeqqdddoc
+F-H0-8935 4 qjoqdpqpecpd
+F-H0-8936 6 nqdpppqnccpd
+F-H0-8937 3 pnpqdpfqcnjpecpd
+F-H0-8938 3 qnpqdpfqcnjpecpd
+F-H0-8939 4 qcppqhdppdqfddofncrd
+F-H0-8940 4 oqopqppddpddqfncrd
+F-H0-8941 2 qmdpdrpopqcnfqddpd
+F-H0-8942 4 cfpppddpjddfdd
+F-H0-8943 3 pfdpppndpjddpd
+F-H0-8944 2 jpdpppndpjddpd
+F-H0-8945 2 kpnpppdppjddpd
+F-H0-8946 9 qqrpppqnnpondppdpjdd
+F-H0-8947 3 pmcppqqoepdcpd
+F-H0-8948 2 oddqppqeedcdpc
+F-H0-8949 2 lpoqqpcddppcpe
+F-H0-8950 2 qmcppqqoepdcpd
+F-H0-8951 2 dncppqqoepdcpd
+F-H0-8952 4 enppephppdcpcd
+F-H0-8953 2 nppqdqplpopddd
+F-H0-8954 2 gpdqpqdldoddpd
+F-H0-8955 6 ppcppdde
+F-H0-8956 2 edpodpqd
+F-H0-8957 2 odpodpqd
+F-H0-8958 3 qjdppqqnpdcfjdddfc
+F-H0-8959 2 opnqqppddpdddjfccf
+F-H0-8960 2 qpdppqqnpdcfjdddfc
+F-H0-8961 11 erdrdqpqipfqdpcqdocpdcpd
+F-H0-8962 3 ccdpppdhgefcdedcpd
+F-H0-8963 2 poqpoplpomdppdqndd
+F-H0-8964 10 qldpkqcnfqqkqpqjpkddpd
+F-H0-8965 2 pldpkqcnfqqkqpqjpkddpd
+F-H0-8966 5 ogpgpfrfqeqfrdrepdlcnc
+F-H0-8967 11 roqqdrpqiqcqfqrpqpdpppqnopcnqlddpd
+F-H0-8968 8 pqqqlqnqppdpddpd
+F-H0-8969 7 nrlqrqqpqqpppqopnqnpdppjddpd
+F-H0-8970 3 gopqgqepcpfodcpd
+F-H0-8971 2 cmpqgqepcpfodcpd
+F-H0-8972 7 eofqnpqpdpcnddpd
+F-H0-8973 4 dnfqnpqpdpcnddpd
+F-H0-8974 8 oqqqpqppnqmpoodpnopomoonplnnqdddoc
+F-H0-8975 8 qodqpqpoqddcoc
+F-H0-8976 6 pqqqmqopqppddpcd
+F-H0-8977 6 qbdqpppeqgddpcqc
+F-H0-8978 4 ddjdpd
+F-H0-8979 2 eqjppp
+F-H0-8980 2 cdpjpd
+F-H0-8981 2 dcoqqppd
+F-H0-8982 2 ccppdpefchcfddpdfcbd
+F-H0-8983 11 ceppdpefdhdeeepdddfddced
+F-H0-8984 4 jdppcejppddpdc
+F-H0-8985 3 fcdpoqdjqpddpd
+F-H0-8986 2 fqdpoqdjqpddpd
+F-H0-8987 11 dnpqjpfqdpfoddpd
+F-H0-8988 2 fddpoqdhdedcpd
+F-H0-8989 2 dgpddphdqocded
+F-H0-8990 11 dgdpppdfcfjdpdddfc
+F-H0-8991 6 enhpeqcpppqdddoc
+F-H0-8992 4 fphpeqcpppqdddoc
+F-H0-8993 3 lceqppcepjncpd
+F-H0-8994 2 pnqnppcejpocdp
+F-H0-8995 3 qpcpqc
+F-H0-8996 2 ccdqqc
+F-H0-8997 2 ppcpqc
+F-H0-8998 4 popqdpfedfqdidfcddibccdb
+F-H0-8999 4 odpqdpfedfqdidfcddibccdb
+F-H0-9000 3 opecod
+F-H0-9001 2 epqope
+F-H0-9002 2 edqope
+F-H0-9003 10 rdoqdpqpqjqlqfpdddnd
+F-H0-9004 4 popqmpjpdppkdcpd
+F-H0-9005 3 eedjqppddpiddgcd
+F-H0-9006 2 pppqmpjpdppkdcpd
+F-H0-9007 5 ddpqdpod
+F-H0-9008 3 dcpqdpod
+F-H0-9009 9 dpodppcd
+F-H0-9010 2 qfdpnqddqpncpd
+F-H0-9011 2 qgdpnqddqpncpd
+F-H0-9012 2 kpnqppdpqdddnc
+F-H0-9013 2 ndppcfdppdqfdc
+F-H0-9014 3 nqqnpppdcocd
+F-H0-9015 2 hcpqeqpdddfc
+F-H0-9016 2 dfpqeqpdddfc
+F-H0-9017 4 qpdppqpoqoqncfdepdddcdhcfcecccdcdbebcb
+F-H0-9018 2 qmjqppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-9019 2 pmppqnnponjpoldppkqlpjplpiqkogqjpdqhddjc
+F-H0-9020 5 dpoqddqd
+F-H0-9021 4 dqoqddqd
+F-H0-9022 6 nfphppoedpneofddpepcpdncmd
+F-H0-9023 4 ccdpppefdgcffeeepdhdedcddd
+F-H0-9024 3 rgppqhdprfqiqepipdqgndqfjdofdd
+F-H0-9025 2 cfdpppnepjkdpfddpdncocmclckcnb
+F-H0-9026 4 qfjqpopddodd
+F-H0-9027 3 hcpppedpdejc
+F-H0-9028 11 qppqqqfqdpppqnjpcnqldcpd
+F-H0-9029 3 dripfqdpppcnfoddpd
+F-H0-9030 8 ofpqddqdocld
+F-H0-9031 2 pfphppcdqepc
+F-H0-9032 5 pjpdppddconcqf
+F-H0-9033 6 croqcqeqdpdqdnfpddpd
+F-H0-9034 8 pnpqrpfqdpipqnpocnqlddpd
+F-H0-9035 3 nqppbqbpepdodpcocpboeockddpd
+F-H0-9036 2 cippbqbpepdodpcocpboeockddpd
+F-H0-9037 11 ergqfqcqppbqhpgpfpepcpdpeofocofnendmcnpdemdd
+F-H0-9038 5 mpircqdrippqdpfqpofodnplddpd
+F-H0-9039 3 noircqdrippqdpfqpofodnplddpd
+F-H0-9040 11 fdppchcopdefjdcfdd
+F-H0-9041 8 qgppqhdppfpgpdqfjdncdd
+F-H0-9042 2 nonqlqmpppdpnpqnpjddpd
+F-H0-9043 3 pinqppqfpd
+F-H0-9044 3 pdfqdpcfdd
+F-H0-9045 2 qnnqppqfpd
+F-H0-9046 3 pfdpppncdfdcpd
+F-H0-9047 6 cqoqdpdqdnfpddpd
+F-H0-9048 9 qlppqjdpqipkqhpjphpichohegqfdeofpdcfndbfjdcdddccdc
+F-H0-9049 3 qdogpgpfqfofqeoepepd
+F-H0-9050 3 ofpgogqfpfpepd
+F-H0-9051 3 epcpppdedcqd
+F-H0-9052 2 cecpppdedcqd
+F-H0-9053 2 occppqpoddqd
+F-H0-9054 5 idqhppqfdpqdohldofddodrcqc
+F-H0-9055 3 cddpppdhhehcfefcdedcpdcbcc
+F-H0-9056 4 npdpdrqnfqcnppdcpd
+F-H0-9057 4 qhdqppqfpdcffcdddb
+F-H0-9058 2 cfppdoddqe
+F-H0-9059 2 cfppcoddpe
+F-H0-9060 3 ncfqbpcqcnqpckdppdqfdd
+F-H0-9061 2 dkcnpppddpcdqiqcqfncrd
+F-H0-9062 2 pfcqdrdpiqcnfqncppdcpd
+F-H0-9063 7 qioippqhdpphpipdohndqfjdofdd
+F-H0-9064 3 dddpppcicedcpd
+F-H0-9065 3 ncppcnfpdkdppdqfcd
+F-H0-9066 3 jddppqdnfqddipncpd
+F-H0-9067 2 kddppqdnfqddipncpd
+F-H0-9068 2 cedpfqdnppjdjpncpfdcpd
+F-H0-9069 2 bpcnppdjfppddpndpjcdqf
+F-H0-9070 2 fpeqfqdqepppqhcpreqfqerdqdrcpdqcodpcddnc
+F-H0-9071 10 cfppdpefdhfecededdpddcfdtted
+F-H0-9072 4 poppqnjppmdpplpnpdomddol
+F-H0-9073 4 pkppqnjppmdpplpnpdomddol
+F-H0-9074 2 dcdpppocqd
+F-H0-9075 2 qgdpddqepc
+F-H0-9076 4 oceppqedqd
+F-H0-9077 2 cpeppqedqd
+F-H0-9078 2 cdeppqedqd
+F-H0-9079 3 ddpqdpnppnpd
+F-H0-9080 8 ncppdpjpjdpjdcpd
+F-H0-9081 7 cfqpcndpqdcldc
+F-H0-9082 2 cqhqfqdpqpdcpc
+F-H0-9083 9 deppdpcfchpdcddddcccbccb
+F-H0-9084 9 gqfqcqppbqhpgpfpepcpdpeofocofnendmcnpdemdd
+F-H0-9085 3 depqdpcedgqddchc
+F-H0-9086 10 pppjdpjjpddjddjd
+F-H0-9087 4 ncpodpqfpddd
+F-H0-9088 4 pnnqppepddpd
+F-H0-9089 2 hcdpppodddfc
+F-H0-9090 9 gofrhqpqepfqdpdqcpcqddpd
+F-H0-9091 6 jqpqnqoqopdqnpqppdcocdqn
+F-H0-9092 5 djeqpqcpdfcecfcddefcpddc
+F-H0-9093 2 qnqpoqddpd
+F-H0-9094 2 pmqpoqddpd
+F-H0-9095 5 oclqnrqpqqpppqopnqmodppjmdneddpdncnd
+F-H0-9096 3 qcchppegdppfpgofqfdecfpdbfjdcdddccdc
+F-H0-9097 2 pqppnqnpmpnodppjddmeqcqdpcpdncodnblc
+F-H0-9098 9 qdpipppddpddqfpcqc
+F-H0-9099 2 pdpeqeqdpc
+F-H0-9100 10 rpdrcqiqdpfqqnppcnnpddpd
+F-H0-9101 4 lqnqppdpciddcffcpdccbd
+F-H0-9102 5 ceqqdqdcpd
+F-H0-9103 2 opqpcpccpd
+F-H0-9104 2 oqcoqpecpd
+F-H0-9105 2 qdcepqocdp
+F-H0-9106 2 pqeqpdqodc
+F-H0-9107 2 eqcoqpecpd
+F-H0-9108 4 podppqpnqoddpd
+F-H0-9109 3 fcdppqpnqoddpd
+F-H0-9110 2 fcpppddpcdfdec
+F-H0-9111 2 phogpgpfrfqeqfrdrepdlcnc
+F-H0-9112 10 cpppdqdococncecfcddedcpd
+F-H0-9113 9 jqfqiqpphqjphpipdphocnfoddpd
+F-H0-9114 6 oceppqddqd
+F-H0-9115 2 fceppqddqd
+F-H0-9116 11 fcpqeqdfcpcfcedecdpddc
+F-H0-9117 3 jdpqdpfqcnjpddpfncpd
+F-H0-9118 3 pbpqdpfqcnjpddpfncpd
+F-H0-9119 2 kdpqdpfqcnjpddpfncpd
+F-H0-9120 7 rnpqqqfqqpppdpjpqnpocnqldcpd
+F-H0-9121 3 pnpqqqfqqpppdpjpqnpocnqldcpd
+F-H0-9122 11 pqrqqqqpoppndppd
+F-H0-9123 2 dqdpoqdnfpddpd
+F-H0-9124 2 qjoqcreqcqdqdpfpdnpdddjc
+F-H0-9125 8 bbdpppchcfdepdceedcddddcccbccb
+F-H0-9126 7 oonqppdppjddoencpd
+F-H0-9127 2 jccroqcqeqdpdqdnfpddpd
+F-H0-9128 10 kpjqfqiqpphqjphpipdphocnfoddpd
+F-H0-9129 7 iqcqdrdpfqqnppcnqlddpd
+F-H0-9130 3 pfdpppqfqhcfpdddfcccdb
+F-H0-9131 2 ppfqdpqd
+F-H0-9132 9 endqgpqpdoeopddldd
+F-H0-9133 3 ipfqdpppqjqdddnc
+F-H0-9134 3 hqfqdpppqjqdddnc
+F-H0-9135 2 dnfqdpppqjqdddnc
+F-H0-9136 5 dodqecpd
+F-H0-9137 2 qpdqecpd
+F-H0-9138 2 eqcqoqdpdqdnfpddpd
+F-H0-9139 2 ekdpppcmckqjdgcecfcddefcpddc
+F-H0-9140 3 obqdqcpdpcoc
+F-H0-9141 7 qcdpppnepjddpfncpdpbkd
+F-H0-9142 6 ripipppdcpndqfddofqcrd
+F-H0-9143 5 qnpqdpfqcnjpddpc
+F-H0-9144 6 pjdrfqdpppdnjpddpd
+F-H0-9145 2 fedpppdfpdddjddbfc
+F-H0-9146 7 pkqjppqidpqhpjphpichohegqfdeofpdcfndbfjdcdddccdc
+F-H0-9147 9 qpqrerdrqqcrhqpqeqfqdqcqdpnppocpdocnddpd
+F-H0-9148 3 dpddpqncpd
+F-H0-9149 2 dnfqdpppdc
+F-H0-9150 7 ncdrercrhqqqeqnqdqkqrpfqdpcqdoppqncpqkcnddpd
+F-H0-9151 7 qiqpqhdppdpindqfcdof
+F-H0-9152 6 coopfqdpqpencndndmddpd
+F-H0-9153 3 cpopfqdpqpencndndmddpd
+F-H0-9154 2 cqopfqdpqpencndndmddpd
+F-H0-9155 3 qqddcqpc
+F-H0-9156 2 opqpccpd
+F-H0-9157 2 dqqpccpd
+F-H0-9158 8 prqqppqpoplprodpqopornoopdqndd
+F-H0-9159 2 focqepppdphpcocpboeobndopdcndd
+F-H0-9160 7 qhpqdpqnqkqdcfkcddfc
+F-H0-9161 4 rpnqqnpppd
+F-H0-9162 2 fecfpdddfc
+F-H0-9163 2 ppcfpdddfc
+F-H0-9164 11 frgqereqfqcqppbqhpgpfpepcpdpeofocofnendmcnpdemdd
+F-H0-9165 6 qcpqdpqhqfpddd
+F-H0-9166 2 ofpqdpqhqfpddd
+F-H0-9167 3 hcpqdpqkdjpdddfc
+F-H0-9168 2 jppqdpqkdjpdddfc
+F-H0-9169 2 oonqppdppjcipddc
+F-H0-9170 11 poqqpqqpfqdpppqnjpcnqldcpd
+F-H0-9171 4 dbppdpdfdhdefepdeefdddeddceb
+F-H0-9172 2 ecppdpdfdhdefepdeefdddeddceb
+F-H0-9173 2 oropqpnppprolppodppnoopdondd
+F-H0-9174 11 fqcqppbqhpgpfpepcpdpeofocofnendmcnpdemdd
+F-H0-9175 9 dmdqbqcqppephpencppdbodd
+F-H0-9176 2 qmqqrqpqqpoplpondppdrodd
+F-H0-9177 9 dmipfqdpppdncnddpd
+F-H0-9178 2 poppnqkpdppnqnpddd
+F-H0-9179 4 fqdppqqipdqfqcrdncdd
+F-H0-9180 8 ncdrercrkqpqhqfqeqcqdqcpdpqodocnddpd
+F-H0-9181 2 nqdrercrkqpqhqfqeqcqdqcpdpqodocnddpd
+F-H0-9182 9 qppqqqlqnqppdpddpd
+F-H0-9183 9 frdrhqfqgqppdphpcngpddpd
+F-H0-9184 7 cnpqeqfqdqfpcpepddpd
+F-H0-9185 3 mfqipppddpndqfddof
+F-H0-9186 2 hqkqnqppdppnnopddd
+F-H0-9187 2 rdqipppddpndqfddof
+F-H0-9188 4 oddppqqoddqd
+F-H0-9189 3 lpoqqpdqddpd
+F-H0-9190 2 ocdppqqoddqd
+F-H0-9191 4 cqdrdpfqcnqpddpd
+F-H0-9192 2 gqdrdpfqcnqpddpd
+F-H0-9193 2 opdrdpfqcnqpddpd
+F-H0-9194 2 qppedo
+F-H0-9195 2 oqdope
+F-H0-9196 2 popqdpfqpnipcnqoddpd
+F-H0-9197 2 qfpqdpfqpnipcnqoddpd
+F-H0-9198 2 qjpqdpfqpnipcnqoddpd
+F-H0-9199 2 qfcnfqdkpppddpcdfdec
+F-H0-9200 8 ircqdripfqdpqpdnfoddpd
+F-H0-9201 8 qgqhpprfdpqeqipdpindqfjdofdd
+F-H0-9202 5 qcpfodqd
+F-H0-9203 2 pjdpppdhefcffecededdpddcfdtted
+F-H0-9204 2 qnfqepeqfoppdohpendpdncppdttdd
+F-H0-9205 5 fcoqdpqpqjcfddpd
+F-H0-9206 3 clppdpcnqjqdddoc
+F-H0-9207 10 efppdpdgdfcfjdpdddfc
+F-H0-9208 5 eqqqcpdcqd
+F-H0-9209 2 deqqcpdcqd
+F-H0-9210 5 qiqdqpdddpoc
+F-H0-9211 2 cjpdppcdcpec
+F-H0-9212 6 cnpphpepcpenddpd
+F-H0-9213 5 cmpphpepcpenddpd
+F-H0-9214 9 eqergqfqcqppbqhpgpfpepcpdpeofocofnendmcnpdemdd
+F-H0-9215 4 dfppdppdccfd
+F-H0-9216 4 doppcqfpddpd
+F-H0-9217 5 eppqpocpdcpd
+F-H0-9218 3 nppqpocpdcpd
+F-H0-9219 2 qcpqcpqdoddd
+F-H0-9220 10 rqqqqpoppndppd
+F-H0-9221 5 jcqedqddqppc
+F-H0-9222 2 qnppcpqddcoc
+F-H0-9223 6 oqppnqnpmpjpdpnoqnpddd
+F-H0-9224 4 qqppnqdpqnpnpmonpdpjdd
+F-H0-9225 5 pfdpppqfpdcdjdnc
+F-H0-9226 4 pfpqpjdppdqfddnc
+F-H0-9227 4 kcppdgdpbeedpdiccddcbccc
+F-H0-9228 3 ncppdpcigddedcpdebcdcbcc
+F-H0-9229 2 nccqerppcrcpdqdogpckddpd
+F-H0-9230 4 fqoqdpcndcod
+F-H0-9231 3 cloqdpcndcod
+F-H0-9232 9 qjppqidpqhpjphpichohegqfdeofpdcfndbfjdcdddccdc
+F-H0-9233 3 eqpopdqfnc
+F-H0-9234 2 dqpopdqfnc
+F-H0-9235 2 dppopdqfnc
+F-H0-9236 10 ffdppqdheffedeeepdfcgdecdddccc
+F-H0-9237 11 dmopfqdpqpdncnddpd
+F-H0-9238 5 cphqfqfpppdpdnddpd
+F-H0-9239 5 gphqfqfpppdpdnddpd
+F-H0-9240 4 jdppjppjdppdddfc
+F-H0-9241 2 qfdpppdjjpddpdnc
+F-H0-9242 5 boppdqepcqdpddpd
+F-H0-9243 3 pqppqqpoqppddpdd
+F-H0-9244 10 orerqrqqdrhqcreqpqdqfqqpcqdpnppocpdocnddpd
+F-H0-9245 6 ddppdpcedhpddced
+F-H0-9246 3 ecppdpcedhpddced
+F-H0-9247 4 cfdpoqcededcpd
+F-H0-9248 3 dddpoqcededcpd
+F-H0-9249 5 qfpqmpopjppkdppdddjd
+F-H0-9250 3 hcpqmpopjppkdppdddjd
+F-H0-9251 2 jppjppdedppddjiddgcd
+F-H0-9252 7 ppcoddpe
+F-H0-9253 4 cedippdedppdcfddcddccc
+F-H0-9254 3 qgpipppedppdqfddqdpcqc
+F-H0-9255 7 jpdpppdjpjjdjjddpd
+F-H0-9256 3 dfpqeppdddfc
+F-H0-9257 3 odcndpqdpodd
+F-H0-9258 2 ipfqdpppedpc
+F-H0-9259 9 dndqppcpdococncecfcddedcpd
+F-H0-9260 3 npdpqqddpe
+F-H0-9261 7 dqcqnqppjpqndpcnclddpd
+F-H0-9262 2 pqqqlqnqppdppjpdqfncdd
+F-H0-9263 4 qcpqdpqdnddd
+F-H0-9264 2 eqpqpncpddpd
+F-H0-9265 2 ncppdpcjedpd
+F-H0-9266 2 qnppdedppdjc
+F-H0-9267 2 cdppdpcjedpd
+F-H0-9268 4 cqdrqpfqdppdcn
+F-H0-9269 4 fqdpppclcjcedfcdcffcdedcpd
+F-H0-9270 8 onnqppqndppmpnpdpjdd
+F-H0-9271 3 qqlqnqppdppjecpd
+F-H0-9272 3 nolqnqppdppjecpd
+F-H0-9273 2 qnlqnqppdppjecpd
+F-H0-9274 3 qeogpgpfqfofpepd
+F-H0-9275 3 pfdpppddqjncpd
+F-H0-9276 2 lqnqppdpqjddpd
+F-H0-9277 2 qkqnjqpdppdddp
+F-H0-9278 3 jdfqdpppddpfncpd
+F-H0-9279 2 dnfqdpppddpfncpd
+F-H0-9280 2 pnqnppqdjpdcdp
+F-H0-9281 2 lqnqppdqpjcdpd
+F-H0-9282 4 qnfqeqppdqjpcpfpcnepqddd
+F-H0-9283 2 qodppqdjcedfcdcffcdedcpd
+F-H0-9284 8 mcdpppqfpjmdpdncnddclc
+F-H0-9285 5 jdjppppjdpjjpddjdd
+F-H0-9286 2 pgjppppjdpjjpdjddd
+F-H0-9287 2 cmppdpckqjdgcecfcddefcpddc
+F-H0-9288 2 popqdpfqdnipdcpd
+F-H0-9289 2 qopqdpfqdnipdcpd
+F-H0-9290 2 qnpqdpfqdnipdcpd
+F-H0-9291 5 djdpppcedfbecfdddedcpd
+F-H0-9292 2 gedpppcedfbecfdddedcpd
+F-H0-9293 2 fqdpppcedfbecfdddedcpd
+F-H0-9294 3 jqdpfqcnopdcpd
+F-H0-9295 2 drdpfqcnopdcpd
+F-H0-9296 2 jpdpfqcnopdcpd
+F-H0-9297 10 cndqppcodocecfcddedcpd
+F-H0-9298 9 frpqeqfqipcqfpgpdpcpfocnddpd
+F-H0-9299 4 cdppdpcjecpd
+F-H0-9300 2 cmppdpcjecpd
+F-H0-9301 2 cfjqpppdcodd
+F-H0-9302 3 enhpeqcpppdcpd
+F-H0-9303 2 fphpeqcpppdcpd
+F-H0-9304 2 eohpeqcpppdcpd
+F-H0-9305 3 oepgogqfpfqeofpepd
+F-H0-9306 8 cbdpppchcfcdpddcddbccc
+F-H0-9307 4 nppnppqfpd
+F-H0-9308 2 dppnppqfpd
+F-H0-9309 2 pjpnppqfpd
+F-H0-9310 3 nqppepddjj
+F-H0-9311 2 jjjpppdppjdipddcjd
+F-H0-9312 2 epppdjippdcpjdpjdd
+F-H0-9313 6 dfqqdpgdddqc
+F-H0-9314 2 pdqqdpgdddqc
+F-H0-9315 6 pmoqpqppqpdpqopoqnpnqdddoc
+F-H0-9316 10 qqrppqdpfqroipqnqopnpocnqlddpd
+F-H0-9317 3 qepfpgofqfpd
+F-H0-9318 2 roppqnpnpmon
+F-H0-9319 4 qhdpqqqjqdddoc
+F-H0-9320 3 cjdpqqqjqdddoc
+F-H0-9321 4 nqppeppddfjdddfc
+F-H0-9322 3 ncqnpppjnppddodd
+F-H0-9323 2 jqpppedpfddjddcf
+F-H0-9324 3 cbdpppcffeddpdhcfcccdb
+F-H0-9325 2 gnfqbpcqenppcndppdcldd
+F-H0-9326 2 qjqhpppddpddqfqcofncrd
+F-H0-9327 4 qqfqdpppqnjpdnqldcpd
+F-H0-9328 2 qnlqnqpppddpndpjcdqf
+F-H0-9329 2 onfqdpppqnjpdnqldcpd
+F-H0-9330 2 lplqnqpppddpndpjcdqf
+F-H0-9331 5 cndqppcofpqddodd
+F-H0-9332 4 pppqnpqodppdpocd
+F-H0-9333 10 qorppqdpfqqnippnpocnqlddpd
+F-H0-9334 2 cooqephppdcpdd
+F-H0-9335 2 gdcoppdhdedcpd
+F-H0-9336 6 mppqcpeppopldcpd
+F-H0-9337 2 oqpqcpeppopldcpd
+F-H0-9338 2 nopqcpeppopldcpd
+F-H0-9339 6 feppdpcfchpddeedceddcdccdccbbcbb
+F-H0-9340 3 gdppdpcfchpddeedceddcdccdccbbcbb
+F-H0-9341 5 epppbqbpdpdocpcoeoboddpc
+F-H0-9342 2 enppbqbpdpdocpcoeoboddpc
+F-H0-9343 10 qfkqdpfqcnqppkqlqjplpjqkddpd
+F-H0-9344 4 oqpqdpfqpojpcnpldcpd
+F-H0-9345 4 mppqdpfqpojpcnpldcpd
+F-H0-9346 4 piphqhqfpd
+F-H0-9347 7 ippqhqfqdphpddpd
+F-H0-9348 4 qmdpoqqkqpdcpd
+F-H0-9349 2 qidpoqqkqpdcpd
+F-H0-9350 10 pfqpqhdppdqfddnd
+F-H0-9351 6 jpdpfqcnppjdpfddpdnc
+F-H0-9352 3 kdfqdpppdnjpddqfncpd
+F-H0-9353 10 roqqrqpqqpoppndppd
+F-H0-9354 3 cdeppqecpd
+F-H0-9355 2 dqqopddocd
+F-H0-9356 6 ppqqdpccpd
+F-H0-9357 9 qppppojpoodpqnqopmpnpdonddom
+F-H0-9358 11 cpeqpqipfqfpcqdpgpfocnddpd
+F-H0-9359 4 qodppqpoqdddod
+F-H0-9360 3 pldppqpoqdddod
+F-H0-9361 2 qmdppqpoqdddod
+F-H0-9362 9 gpppcqhpbqfpepcpdpeofocofnendmcnpdemdd
+F-H0-9363 5 gddhpppddedc
+F-H0-9364 3 ofppdpqdodld
+F-H0-9365 8 ccpqdpfddedcpd
+F-H0-9366 7 dnfqdpppciddcffcpdccbd
+F-H0-9367 2 clqqprppnqqnkqcndpddpd
+F-H0-9368 5 pcqhqpqgdppfpgpdqfjdncdd
+F-H0-9369 3 odppdppjqfpdmdndncmcdclc
+F-H0-9370 10 enpphpepcpfoeodmdcpd
+F-H0-9371 5 cnipfqdpppcecfcddedcpd
+F-H0-9372 2 dnipfqdpppcecfcddedcpd
+F-H0-9373 10 pmppnqdpqnpnpdpjdd
+F-H0-9374 10 dfppdpcedepdeccd
+F-H0-9375 5 ppqdddoc
+F-H0-9376 3 peogpgpfqfpd
+F-H0-9377 5 qhdpoqqjqpqfqlrdpdddnd
+F-H0-9378 4 qqrpppdpnpqnqhqjqdddoc
+F-H0-9379 6 qqpqdpfqpoipcnooddpd
+F-H0-9380 4 onpqdpfqpoipcnooddpd
+F-H0-9381 5 nomqopfqdpqpdcpd
+F-H0-9382 4 qqmqopfqdpqpdcpd
+F-H0-9383 3 epcppqedpd
+F-H0-9384 2 qkcppqedpd
+F-H0-9385 2 codqpdpocd
+F-H0-9386 5 podppqqnqopnqd
+F-H0-9387 6 nqppdppjddqdqcpdpcodncndnblc
+F-H0-9388 10 pepppidppdqfddqdpcqc
+F-H0-9389 7 cneqppcpckqjdgcecfcddefcpddc
+F-H0-9390 2 lcpqkqeqfqdqgpcpepqopdcnddjc
+F-H0-9391 2 lqjqppqfdpceodqdmdpcncocicdc
+F-H0-9392 3 popqcpfpdcpd
+F-H0-9393 3 eqpqcpfpdcpd
+F-H0-9394 2 dnpqcpfpdcpd
+F-H0-9395 4 hcppdpdedhpdgcgddcfdebcdcbcc
+F-H0-9396 7 kcppdppjnepfkdpdncocdclc
+F-H0-9397 2 nroqnqlqdqppkppnnopjddpd
+F-H0-9398 5 pldppqpofqddqd
+F-H0-9399 10 ndqpqhcppdqfjdofdd
+F-H0-9400 11 cqfqppdqgpgodpfodoeofndlenddpc
+F-H0-9401 3 dncpeppddd
+F-H0-9402 2 cpppdedcpd
+F-H0-9403 2 eqdqpppddo
+F-H0-9404 2 pqdppepcdd
+F-H0-9405 5 efdipppecpddcf
+F-H0-9406 8 qdppdpphpepcnencddqbqc
+F-H0-9407 2 hocrcqfqppdqfodldoddpd
+F-H0-9408 4 ndnrlqqqqppqppnqopdpmoqfpjddpdnclc
+F-H0-9409 3 pnnqlqdpppqnpjddmeqcqdpcpdncodnblc
+F-H0-9410 2 qqnqlqdpppqnpjddmeqcqdpcpdncodnblc
+F-H0-9411 6 djdpjjddjd
+F-H0-9412 2 djpdpjddjj
+F-H0-9413 5 qpppqqdpdcpd
+F-H0-9414 5 pqppqqdpdcpd
+F-H0-9415 7 eeppdhdpqddedcfd
+F-H0-9416 2 qonppqpocppdpldd
+F-H0-9417 9 oomppqdpplpopd
+F-H0-9418 7 pfppdjdppdqfjdnddd
+F-H0-9419 7 kcpqdppkddpfncpdpbqc
+F-H0-9420 3 kdpqdppkddpfncpdpbqc
+F-H0-9421 5 lcnrlqqqqppqppnqopdqmoncpjdcpd
+F-H0-9422 3 pnnqppdqpjqcmepcqdncpddcodnblc
+F-H0-9423 2 ndnrlqqqqppqppnqopdqmoncpjdcpd
+F-H0-9424 4 dhpqdqcedcqd
+F-H0-9425 2 odpqdqcedcqd
+F-H0-9426 3 prppnqqndpdfdcpd
+F-H0-9427 3 jpppnqqndpdfdcpd
+F-H0-9428 2 chppnqqndpdfdcpd
+F-H0-9429 8 piqhqppdcpndqfjdofdd
+F-H0-9430 3 lcpdqiddqfqcrdnc
+F-H0-9431 2 fcpdqiddqfqcrdnc
+F-H0-9432 8 ccdpppefdgdfcfjdpdddfc
+F-H0-9433 2 ocpjppnedppdqfndmdddnc
+F-H0-9434 8 fdppdjdpqdefddcf
+F-H0-9435 2 cfppdqfejdpdddfc
+F-H0-9436 5 fqdppqciocdc
+F-H0-9437 5 cppqeqqkdcpd
+F-H0-9438 10 qqqppplpopcpnooonnqnpmonpdomdd
+F-H0-9439 2 jkjjkjji
+F-H0-9440 2 iikjjijj
+F-H0-9441 4 dfppdqpdddfd
+F-H0-9442 3 fcppdqpdddfd
+F-H0-9443 2 dfdppopdedcd
+F-H0-9444 9 grfrgqereqfqcqppbqhpgpfpepcpdpeofocofnendmcnpdemdd
+F-H0-9445 10 rnpqqqqpppcppoqoqnpnqdqmdd
+F-H0-9446 2 popqncpd
+F-H0-9447 5 jqoqdpqpqiqkqfqdddpc
+F-H0-9448 2 onpqdpqpqnqiqkqdddoc
+F-H0-9449 9 ceppdpcfchpddeedcddddcccbccb
+F-H0-9450 5 ehppdpcfefhdpdcded
+F-H0-9451 3 jpqpoplpdpqnonddpd
+F-H0-9452 6 rmqqrppqdpfqroipqnqopnpocnqlddpd
+F-H0-9453 2 kddppqdgcedeqddchc
+F-H0-9454 8 qkqqrpppqnnppddpcd
+F-H0-9455 3 cnipfqdppd
+F-H0-9456 2 dcipfqdppd
+F-H0-9457 10 qpqqppnqkpdqpjddpd
+F-H0-9458 4 qjdpoqjdqpddpfncpd
+F-H0-9459 2 fqdpoqjdqpddpfncpd
+F-H0-9460 10 ccpqdpfedfqdidfcdddb
+F-H0-9461 8 eddpppchcfdepdcddddcccbccb
+F-H0-9462 3 pcopdpcjddpe
+F-H0-9463 3 jcjqppdedpod
+F-H0-9464 2 qipodpcjddod
+F-H0-9465 8 qhdppqponqqnqppnqopjqdddoc
+F-H0-9466 2 cjdppqponqqnqppnqopjqdddoc
+F-H0-9467 7 gddpppdfpdddfcgcdb
+F-H0-9468 2 pfqgpppddpndqfddrd
+F-H0-9469 5 jdqfdpqdodddndpcncoc
+F-H0-9470 2 nccfpppdfdcdedecfcdc
+F-H0-9471 2 jcqfdpqdodddndpcncoc
+F-H0-9472 6 qopoppoojpqndppmpnpdonddom
+F-H0-9473 6 cjeqqeppddcp
+F-H0-9474 3 icdpoqcepddc
+F-H0-9475 3 cqbpfqcnpppddpddpjncqf
+F-H0-9476 2 lqprppnqqndppdcfjdddfc
+F-H0-9477 10 ncqcqdpcpdoboc
+F-H0-9478 7 dedppppdddcdhcfcdccc
+F-H0-9479 2 qfqepepdqdpc
+F-H0-9480 2 qcqepepdqdpc
+F-H0-9481 7 bddppqddcffcpd
+F-H0-9482 4 ondppqooqoqnpopnqd
+F-H0-9483 3 dofqpqfpeqeoepddcp
+F-H0-9484 4 dodqpqedpd
+F-H0-9485 3 qkdqpqedpd
+F-H0-9486 11 qbdppppephnepcddncqc
+F-H0-9487 7 eqcqfqppdqgpgodpfodoeofndlenddpc
+F-H0-9488 3 bpcqppephpdpcpfoeofnendmcnqdemdd
+F-H0-9489 6 qoqqqppplpopcpnooonnqnpmonpdomdd
+F-H0-9490 3 rdppogdpqfpgofnfoeneqdpdldodcdqc
+F-H0-9491 8 lqfqjqppiqkphqjphpipdphocnfoddpd
+F-H0-9492 8 ropqrpfqdpipqnqopnpocnqlddpd
+F-H0-9493 9 dddopppd
+F-H0-9494 2 pqdpddpe
+F-H0-9495 8 qqrpppqnnpqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-9496 4 qhdppqqfpddfjdddfc
+F-H0-9497 2 npnqpppdcpndpjddqf
+F-H0-9498 6 epeodppd
+F-H0-9499 5 cepodpdedcpd
+F-H0-9500 4 dhpodpdedcpd
+F-H0-9501 11 qrerdrqqcrhqpqeqfqdqcqdpnppocpdocnddpd
+F-H0-9502 10 jppqmppodpqkdcpd
+F-H0-9503 3 gpdqpqdldodcpd
+F-H0-9504 2 enqpephppdcpcd
+F-H0-9505 2 fpdqpqdldodcpd
+F-H0-9506 6 dpoqddod
+F-H0-9507 3 dcopdpoc
+F-H0-9508 6 pfdppqncpkecpd
+F-H0-9509 2 kddppqncpkecpd
+F-H0-9510 3 pfdpdrcnfqncppdcpd
+F-H0-9511 2 lcdpdrcnfqncppdcpd
+F-H0-9512 2 jdppprqnnqpcdpfcdd
+F-H0-9513 4 edcnpqdjfppddpcd
+F-H0-9514 2 fdcnpqdjfppddpcd
+F-H0-9515 5 pldppqpopedd
+F-H0-9516 5 fqdpoppded
+F-H0-9517 2 mpppepddod
+F-H0-9518 4 foipfqdpopddpd
+F-H0-9519 2 cqipfqdpopddpd
+F-H0-9520 7 qqfqeqppdqjpcpfpqnepcnqldcpd
+F-H0-9521 2 phppdqqhqfpdcfjdcdfdeceddcfc
+F-H0-9522 2 npfqeqppdqjpcpfpqnepcnqldcpd
+F-H0-9523 2 qkdqppqjjjddpd
+F-H0-9524 2 qnppjjcppdjcdd
+F-H0-9525 2 qldpppqjjjdcpd
+F-H0-9526 2 djdpppqjjjdcpd
+F-H0-9527 3 odofpeoepd
+F-H0-9528 3 pfofpeoepd
+F-H0-9529 2 qfoepdneod
+F-H0-9530 7 jpdppqdnfqddpc
+F-H0-9531 7 pkfqdpppqnnponjpcnqlddpd
+F-H0-9532 2 dfdpqodcpe
+F-H0-9533 7 enfqopqpdpcndndmddpd
+F-H0-9534 9 dichpppdcojdeffdcfdd
+F-H0-9535 8 cqpqkqbpfpqodpcnddpd
+F-H0-9536 2 cmpqkqbpfpqodpcnddpd
+F-H0-9537 4 ddoqjj
+F-H0-9538 2 pdqejj
+F-H0-9539 2 ddqejj
+F-H0-9540 2 eocojj
+F-H0-9541 3 gcppdqefcgdedcpd
+F-H0-9542 2 moopmqnoqppdcpdd
+F-H0-9543 2 pfppqddpcdnemcod
+F-H0-9544 7 iqpqnqoqopqpmpdppdqnddqf
+F-H0-9545 2 fqpqnqoqopqpmpdppdqnddqf
+F-H0-9546 2 popqdqqdcfkcddfc
+F-H0-9547 2 qnpqdqqdcfkcddfc
+F-H0-9548 4 qjiqqoqpqnpppmcppdpnddon
+F-H0-9549 6 fcdpqpdfcecfcddedcpd
+F-H0-9550 3 pnqpoqdpdcpd
+F-H0-9551 2 dedppqpdeccd
+F-H0-9552 2 pmqpoqdpdcpd
+F-H0-9553 6 eeqpegdpefdgdfcfpddejdcddd
+F-H0-9554 6 qlfqppdqdocpdncocnqjdjcedfcdcffcdedcpd
+F-H0-9555 2 qgfqppdqdocpdncocnqjdjcedfcdcffcdedcpd
+F-H0-9556 3 remppqjppodppkqfpdddjd
+F-H0-9557 2 qemppqjppodppkqfpdddjd
+F-H0-9558 4 ppoqopqppndppedd
+F-H0-9559 3 fcppdopddfcdedec
+F-H0-9560 2 dcppdopddfcdedec
+F-H0-9561 4 qcqipppdcpddqf
+F-H0-9562 3 nqppqndppdqkcd
+F-H0-9563 10 dpepeqcpqppddndd
+F-H0-9564 7 dphpppcpepeofoendmdcpd
+F-H0-9565 5 ncppdopjdcpd
+F-H0-9566 2 djpdqpjdepdd
+F-H0-9567 5 mqerdreqcrdqfqipcqfpppdpcpdocnddpd
+F-H0-9568 2 qiqprqppqqoppqdpnqrorpqoqnpnpdpkdd
+F-H0-9569 9 pmppqndppdpn
+F-H0-9570 8 oonppqdpplpopddc
+F-H0-9571 2 fcpqdpdedhpddcfd
+F-H0-9572 2 fqdppoddpe
+F-H0-9573 7 cddpqqcfcededcpd
+F-H0-9574 3 decqpqecpd
+F-H0-9575 2 cdcqpqecpd
+F-H0-9576 2 fpcqpqecpd
+F-H0-9577 3 ncrpqqqnppqknppddpcd
+F-H0-9578 7 pnpqqroqqqrpppqpopnpqodppdrodd
+F-H0-9579 2 qnpqqroqqqrpppqpopnpqodppdrodd
+F-H0-9580 6 pnpqqqppqpjpqndppdpoddpk
+F-H0-9581 2 ocppdppjddqdqcpdpcodnckd
+F-H0-9582 9 dcpqdppdedcdccbc
+F-H0-9583 8 hoiqfqhqpphpjpdpipdnfodcpd
+F-H0-9584 10 nqdppqpoqpqnqopmpd
+F-H0-9585 3 coqpdqdopd
+F-H0-9586 2 pqepcpdcpd
+F-H0-9587 5 gcppqicpddjcpc
+F-H0-9588 3 fqdpkqqjqpdcpd
+F-H0-9589 5 qperdrqqcrhqpqeqnqdqfqdpcqpocpdocnddpd
+F-H0-9590 5 qrerdrqqcrhqpqeqnqdqfqdpcqpocpdocnddpd
+F-H0-9591 4 qfdppqpfqdoddd
+F-H0-9592 3 ocdppqpfqdoddd
+F-H0-9593 5 dlerppcqgpcpdpbndoccpd
+F-H0-9594 2 ddqoqd
+F-H0-9595 2 dcqoqd
+F-H0-9596 4 oonpppqnjppddpddql
+F-H0-9597 3 npnqlqdppppnpjddpd
+F-H0-9598 2 neppqhdppdqfjdnddd
+F-H0-9599 2 drdpfqcnqpdd
+F-H0-9600 2 dcppnqqncppd
+F-H0-9601 4 henqppdppjddpdhcjd
+F-H0-9602 7 cpppeqdodcpd
+F-H0-9603 3 gqepqppdcodd
+F-H0-9604 4 fppdpndd
+F-H0-9605 3 dnpdpndd
+F-H0-9606 2 lcdpppdddjncpd
+F-H0-9607 4 qqdqcqppcpjpqndpcndobnempdqlcdcl
+F-H0-9608 7 cpkqpqhqfqdqcqdpqoddpd
+F-H0-9609 8 pppqnppodppdqocd
+F-H0-9610 6 pjppjpdpjj
+F-H0-9611 2 jdppjpdpjj
+F-H0-9612 10 cqqqqrqpordppqpofqeonpqlcnddpd
+F-H0-9613 4 qpqoiqqnpppmcppdpnddon
+F-H0-9614 10 cqcppqdnepdcpd
+F-H0-9615 2 hcdrrqiqqqfqpqqpnqppcqoprprodpqoqnqlcnpdddfc
+F-H0-9616 2 iddrrqiqqqfqpqqpnqppcqoprprodpqoqnqlcnpdddfc
+F-H0-9617 2 dfdrrqiqqqfqpqqpnqppcqoprprodpqoqnqlcnpdddfc
+F-H0-9618 7 dcppqdcpcdedecfc
+F-H0-9619 10 qpnqppqodpqnpnpmonqdpkdd
+F-H0-9620 6 kqiqnqppdpddpd
+F-H0-9621 2 pniqnqppdpddpd
+F-H0-9622 6 qqpqppqpmpjpdpqkddpd
+F-H0-9623 4 qopqppqpmpjpdpqkddpd
+F-H0-9624 3 opqppedped
+F-H0-9625 2 nqppdecpod
+F-H0-9626 9 ddpodpoc
+F-H0-9627 8 oppppqnppodppdqocd
+F-H0-9628 5 opqpqqpppqmpnqoodppjqnpdddjd
+F-H0-9629 4 ndppdpjpqfpjddoeqcqdpcpdncmd
+F-H0-9630 3 fqdpqpqopppoopqmddpc
+F-H0-9631 2 cqjqfqdpppdcpd
+F-H0-9632 2 ofqjpppddpcdqf
+F-H0-9633 9 dmopfqdpqpdncndcpd
+F-H0-9634 9 dqpqeqepdpcpdndoddpd
+F-H0-9635 8 mqorprnrpqoqnqopnpmpnodpplpopddd
+F-H0-9636 4 qnoqpqppqpdpqopopd
+F-H0-9637 3 ccdppdcecdedecdddc
+F-H0-9638 6 qnnqppdqcjdcpd
+F-H0-9639 2 ndqpjqcppdqfdd
+F-H0-9640 3 cnppdjjppddpjdpjddqf
+F-H0-9641 3 fdpppjjppddpjddjddcf
+F-H0-9642 2 jjppjppjdppddjjdddfc
+F-H0-9643 8 bqpqcpcqdnepdcpd
+F-H0-9644 4 ncdpoqqjqpqfcjddpd
+F-H0-9645 2 qhdpoqqjqpqfcjddpd
+F-H0-9646 2 nddpoqqjqpqfcjddpd
+F-H0-9647 9 cpdqfqppcqdpcndnpddkdd
+F-H0-9648 3 pldppqqoecpd
+F-H0-9649 9 omrpqqdppqrofqqnjppnqocnpormonplqlddpd
+F-H0-9650 3 npdppqpodedcpd
+F-H0-9651 3 pldppqpodedcpd
+F-H0-9652 2 qodppqpodedcpd
+F-H0-9653 4 onpqmpjpdpoopoqkddpd
+F-H0-9654 3 oppqmpjpdpoopoqkddpd
+F-H0-9655 2 qqpqmpjpdpoopoqkddpd
+F-H0-9656 3 medpppneqdodmcddfc
+F-H0-9657 3 qmopmqdpfqnoqpddpd
+F-H0-9658 2 pqopmqdpfqnoqpddpd
+F-H0-9659 2 nppopqondppdqmddqf
+F-H0-9660 8 cjcrppeqhpfpcppddndd
+F-H0-9661 2 icppdpdfdhcefdpddcbc
+F-H0-9662 5 nqcqfqppeqgpdqdpgobpfodoeofndlenddpc
+F-H0-9663 2 jcpqdpffdhefgedefepdeegdfcddecbddccc
+F-H0-9664 2 kcpqdpffdhefgedefepdeegdfcddecbddccc
+F-H0-9665 6 qfjjdpncpd
+F-H0-9666 2 pqfqdpjjpd
+F-H0-9667 10 omqpnqppqodpqnpnpmonqdpkdd
+F-H0-9668 5 fqdpoqdjoddd
+F-H0-9669 8 qddpppddpjqcpdnckd
+F-H0-9670 5 qpoqdpciddcffcpdccbd
+F-H0-9671 5 qfoqdpciddcffcpdccbd
+F-H0-9672 10 mcqcqdpcpdobocnbnc
+F-H0-9673 2 demppqjppodpqkdcpd
+F-H0-9674 2 jdmppqjppodpqkdcpd
+F-H0-9675 2 cjmppqjppodpqkdcpd
+F-H0-9676 8 gepqdpffdheffedeeepdfcgdecdddccc
+F-H0-9677 6 rqqqqppplpopdpnopopmoopdondd
+F-H0-9678 3 ebppdpefdhdefepdeegdeddddccc
+F-H0-9679 5 hqbqdqcpcqboppdnepddpd
+F-H0-9680 5 iqbqdqcpcqboppdnepddpd
+F-H0-9681 2 dddpppchcedcpd
+F-H0-9682 2 eddpppchcedcpd
+F-H0-9683 2 pkqnjqqdppdddp
+F-H0-9684 2 pfdpppncqjdcpd
+F-H0-9685 3 ncpqcqpkdcpd
+F-H0-9686 2 mppqcqpkdcpd
+F-H0-9687 2 lppqcqpkdcpd
+F-H0-9688 4 pooqpddodd
+F-H0-9689 2 pjepppcepd
+F-H0-9690 2 cdpeppecdp
+F-H0-9691 4 qqppnqqmdpddpd
+F-H0-9692 2 djppdpddcfgcpd
+F-H0-9693 3 fpnqipfqdpqpdcpd
+F-H0-9694 2 qjnqipfqdpqpdcpd
+F-H0-9695 7 dppjppjjpd
+F-H0-9696 3 pjjjpdjddd
+F-H0-9697 9 djfqppdqdocpdncocncedfcdcffcdedcpd
+F-H0-9698 2 qfpddpddnclc
+F-H0-9699 7 odpfppdddpocqd
+F-H0-9700 2 opnppqqodppddd
+F-H0-9701 4 qidppppiqhqfpdofndcfjdddfc
+F-H0-9702 4 phdppppiqhqfpdofndcfjdddfc
+F-H0-9703 10 opqqqppqppnqkpdqpjddpd
+F-H0-9704 3 doeqppcncpddpd
+F-H0-9705 3 npnqpqdppdqodd
+F-H0-9706 2 eddpppcfpdeccd
+F-H0-9707 2 qoqqqppppnnp
+F-H0-9708 10 bcdppqedpdcccd
+F-H0-9709 5 okdpkqcnfqpkqpqjqlpjplqfqkddpd
+F-H0-9710 3 ncdpkqcnfqpkqpqjqlpjplqfqkddpd
+F-H0-9711 3 qgdpkqdnfqqjqpddpd
+F-H0-9712 2 qldpkqdnfqqjqpddpd
+F-H0-9713 2 qhdpkqdnfqqjqpddpd
+F-H0-9714 2 pmqpoplppd
+F-H0-9715 6 oeqfdpncpd
+F-H0-9716 6 qqppqndpqdqlcd
+F-H0-9717 2 fohqpqdpfqddpc
+F-H0-9718 8 efdppqeededcpd
+F-H0-9719 3 cnpqnpqppddpdd
+F-H0-9720 2 cedpppcddfdcpd
+F-H0-9721 8 oddpppddpjqcqdpcpdnckd
+F-H0-9722 4 qpqqdrcqiqdpfqqnppcnqldcpd
+F-H0-9723 2 cdfqbpcqcnqpckdppdfcddcchc
+F-H0-9724 3 cppdqpec
+F-H0-9725 3 dpqodcpd
+F-H0-9726 2 pqqodcpd
+F-H0-9727 8 cippdpfdcfddpdccbd
+F-H0-9728 7 qhdqoqqjqpqfqldcpd
+F-H0-9729 3 qfqpcecppdnchcjcdc
+F-H0-9730 6 qodpppqnnponqlpkqhqjqdddoc
+F-H0-9731 2 bpppfpendpcncldkchcjcdpdec
+F-H0-9732 2 qjphpipgqhqfpd
+F-H0-9733 10 rqqqqpopmpondppdqndd
+F-H0-9734 4 clppprqnnqcndpddpd
+F-H0-9735 3 pnnqppdpqfpdrdncdd
+F-H0-9736 4 qfcqiripdrdpfqdnppddfoncpd
+F-H0-9737 3 jdcqiripdrdpfqdnppddfoncpd
+F-H0-9738 2 lccqiripdrdpfqdnppddfoncpd
+F-H0-9739 3 cmppdpckcedfcdcffcdedcpd
+F-H0-9740 2 qnppdpckcedfcdcffcdedcpd
+F-H0-9741 9 pkqqrppqdpfqrojpqnqopnpocnonrmomplqlddpd
+F-H0-9742 4 qnppnqkpcpddpd
+F-H0-9743 3 feppdpidqdddfc
+F-H0-9744 2 reqgjjpcpe
+F-H0-9745 2 eccgjjdcde
+F-H0-9746 2 qcqgjjpcpe
+F-H0-9747 2 qfdppqpdcjdd
+F-H0-9748 2 jqppqjdpdcpd
+F-H0-9749 2 nqppjqdpcdpd
+F-H0-9750 7 qppppqdpqopopd
+F-H0-9751 2 cepqepdedcpd
+F-H0-9752 2 hdqppedpcded
+F-H0-9753 2 popqepdedcpd
+F-H0-9754 3 opqpdqccpd
+F-H0-9755 3 eqqqcpdcpd
+F-H0-9756 2 ppqqcpdcpd
+F-H0-9757 3 popqdpqdddnd
+F-H0-9758 2 qnpqdpqdddnd
+F-H0-9759 3 qkdrpqdpfqdnjpddpd
+F-H0-9760 2 podrpqdpfqdnjpddpd
+F-H0-9761 7 dcppcddpqcedecfc
+F-H0-9762 3 cnfqdppoddpe
+F-H0-9763 3 dkcnppoddped
+F-H0-9764 3 bcpqdppdcdedgccc
+F-H0-9765 2 qpqqpqpodppdqmcd
+F-H0-9766 2 ppqqpqpodppdqmcd
+F-H0-9767 7 fopqfpfqdpgppocnddpd
+F-H0-9768 3 eqpqfpfqdpgppocnddpd
+F-H0-9769 8 dedpppcdpdccdd
+F-H0-9770 3 rnqprqppqqnprproqnqo
+F-H0-9771 2 obreqfqerdqdrcpdqcnd
+F-H0-9772 8 dmqpcnkppddpdddn
+F-H0-9773 3 qhdppqqfpkddpd
+F-H0-9774 3 qedppqqfpkddpd
+F-H0-9775 2 rdqdqcpdpcocobncnbmc
+F-H0-9776 2 ncoqepqpddpd
+F-H0-9777 2 jccepppddodc
+F-H0-9778 2 qnppdpqdedoc
+F-H0-9779 3 fpdodqdcqd
+F-H0-9780 2 ppdodqdcqd
+F-H0-9781 2 mcoddqcdqd
+F-H0-9782 2 ldoddqcdqd
+F-H0-9783 8 kcppdppiddpencpc
+F-H0-9784 5 plqqrpppqnnpqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-9785 3 kpdrprcrerqqnqfqhqcqeqppdqcpdppndocnddpd
+F-H0-9786 6 djppcnfpcddppc
+F-H0-9787 2 drdppqdnfqddqd
+F-H0-9788 8 oqpqppqpdpqopopcdd
+F-H0-9789 6 ldppdjdppdqfndofjdmfdd
+F-H0-9790 2 qoqnpponnpmnjppddpdddj
+F-H0-9791 9 qjppfqdodqdncpcncodjcedfcdcffcdedcpd
+F-H0-9792 7 bnppergpcqdpcpdodcpd
+F-H0-9793 10 qeqfrerdqdrcpdqcnd
+F-H0-9794 5 pldppqpoqddjocdd
+F-H0-9795 2 ceppeqpjcpdedcpd
+F-H0-9796 6 nqdppqpoplnoqdddoc
+F-H0-9797 3 mqdppqpoplnoqdddoc
+F-H0-9798 4 mfqhpppddpndqfddofqcrd
+F-H0-9799 3 kcdpppdffeddpdhcfcccdb
+F-H0-9800 2 jcdpppdffeddpdhcfcccdb
+F-H0-9801 2 hppqcpepddqd
+F-H0-9802 2 popqcpepddqd
+F-H0-9803 2 fddodqcdpppc
+F-H0-9804 3 dpppqdcc
+F-H0-9805 3 pqcqdcpd
+F-H0-9806 2 decqqppd
+F-H0-9807 2 dqppqdcc
+F-H0-9808 3 mpkqpqdppkddpd
+F-H0-9809 2 jdkqpqdppkddpd
+F-H0-9810 8 jpiqfqhqppdpipdnfodcpd
+F-H0-9811 4 rdoqdpqpqjqlqgpdddmc
+F-H0-9812 3 jcmqdpppqmqhqjqdddoc
+F-H0-9813 8 qnpqdpqopoqdddnc
+F-H0-9814 2 pdcfppqddpocoddc
+F-H0-9815 4 qqppqndppdqldddjfccf
+F-H0-9816 4 nolqnqppdppdcfjdddfc
+F-H0-9817 8 dfdpppcecfbededcpd
+F-H0-9818 7 qfoqdpqppeqedcpc
+F-H0-9819 2 pppqdqqopoqdddoc
+F-H0-9820 6 coeqpqdqepdpcpdndoddpd
+F-H0-9821 2 oopqdqoqqpppoppnpopddd
+F-H0-9822 5 ocdpppndpjddqdqcpdpcodnclc
+F-H0-9823 4 noqqlqpqqpnqppnpopdppjddpd
+F-H0-9824 8 qppqppopnppodppdqocd
+F-H0-9825 9 pqrqqqqpopmpondppdqndd
+F-H0-9826 10 gpfppqdpfqpocnddpd
+F-H0-9827 6 pjqippqhdpchpiegqfdeofpdcfndbfjdcdddccdc
+F-H0-9828 10 cbppdphedhfehcdefcpddccc
+F-H0-9829 8 kqrqqqqppqcpopropdpndd
+F-H0-9830 5 lcdppqedpkncpd
+F-H0-9831 2 pfdppqedpkncpd
+F-H0-9832 3 ncpqdpqocdpd
+F-H0-9833 2 jppqdpqocdpd
+F-H0-9834 2 noppnqjpdpddpd
+F-H0-9835 2 qqppnqjpdpddpd
+F-H0-9836 4 pfdqpqncpkdcpd
+F-H0-9837 3 lcdqpqncpkdcpd
+F-H0-9838 7 nqdppqpopmnopd
+F-H0-9839 6 qodpppqnpjddpd
+F-H0-9840 5 fqcnppcidppdjcdc
+F-H0-9841 2 fpcnppcidppdjcdc
+F-H0-9842 5 bopqbqdqcpcqdnepdcpd
+F-H0-9843 5 coopfqdpqpencndndmdcpd
+F-H0-9844 3 cpopfqdpqpencndndmdcpd
+F-H0-9845 2 cqopfqdpqpencndndmdcpd
+F-H0-9846 6 ckdpppgepcedfcdddccdcchcfb
+F-H0-9847 5 qlqrerorqqdrhqcreqpqdqfqqpcqdpnppocpdocnddpd
+F-H0-9848 4 qkqrerorqqdrhqcreqpqdqfqqpcqdpnppocpdocnddpd
+F-H0-9849 5 cgefppdedppdcfjdcdddccdc
+F-H0-9850 3 rcppdppjddneqcqdpcpdncod
+F-H0-9851 10 pdjpppjjdpjd
+F-H0-9852 6 djqpdpcedfcdcffcdedcpd
+F-H0-9853 4 qcdpndqd
+F-H0-9854 2 ppdppfpc
+F-H0-9855 5 ddpjppoc
+F-H0-9856 8 pmppnpdpqnpnqdqldd
+F-H0-9857 2 pcqhqppfdppdqfddnd
+F-H0-9858 3 qfnpoqpdqpjddpdd
+F-H0-9859 3 nqppdppjcedfdcpd
+F-H0-9860 3 jpppnqqidpjdddpc
+F-H0-9861 2 qfpqdpjpddqkncpd
+F-H0-9862 2 pnppnqqidpjdddpc
+F-H0-9863 4 fdppdppjncdedcpd
+F-H0-9864 2 eeppdppjncdedcpd
+F-H0-9865 10 eqfrdrhqfqgqppdphpcngpddpd
+F-H0-9866 3 qfdpqqpdcc
+F-H0-9867 3 jjppcqddqc
+F-H0-9868 5 ceqqpdcqdc
+F-H0-9869 2 nqcqqpccpd
+F-H0-9870 5 qqprorpqnrnqoqmqopnpmpnodpplpopddd
+F-H0-9871 3 grdrfrgqerfqeqdqppfpgpfoepdldoddpd
+F-H0-9872 2 cddpppdhdefepdfdgdgcedfcecdcfbdbeb
+F-H0-9873 3 fqqqqrqpordppqponpqkpd
+F-H0-9874 2 deqqqrqpordppqponpqkpd
+F-H0-9875 2 ddqqqrqpordppqponpqkpd
+F-H0-9876 2 cdqqqrqpordppqponpqkpd
+F-H0-9877 2 plerdreqcrdqpqipfqdpcqqocpdocnddpd
+F-H0-9878 2 mqerdreqcrdqpqipfqdpcqqocpdocnddpd
+F-H0-9879 2 eporqrpqproqqqppnqkpdqpoqpcoqnpddd
+F-H0-9880 10 dqpqkqfqhqcqdpqoddpd
+F-H0-9881 4 jpqmppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-9882 2 pnqmppqldpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-9883 2 nqppdppjnepflepdgeldkdlcjdkcidjcddhcncgc
+F-H0-9884 2 qfdhpppddpiddjcd
+F-H0-9885 6 jdpqdpfqdnjpddpfncpd
+F-H0-9886 2 kdpqdpfqdnjpddpfncpd
+F-H0-9887 2 qlqqrpppqnnpondppdpjdd
+F-H0-9888 2 rqqqrpppqnnpondppdpjdd
+F-H0-9889 2 fmcqdrjpfqdpppdnfoddpd
+F-H0-9890 2 idqqdpqcddfc
+F-H0-9891 2 iqqqdpfqddqc
+F-H0-9892 2 qhqqpdcqddqf
+F-H0-9893 7 qfdppqqkqnqhqdcfkcddfc
+F-H0-9894 2 fqdppqqkqnqhqdcfkcddfc
+F-H0-9895 10 dqbqpqcpcqdnepdcpd
+F-H0-9896 4 popqdpcdpepc
+F-H0-9897 3 nppqpocpddpc
+F-H0-9898 4 gddpppcdedecfcdc
+F-H0-9899 3 dfcepppdcfcddedc
+F-H0-9900 4 nqppdqcjcocgcdpdec
+F-H0-9901 2 cjdppqqjqoqgqdddoc
+F-H0-9902 5 dlqqprppkrkpnqdodqpnnopjddpd
+F-H0-9903 3 eeppdppjnepfncdedcpdpbkdkbqc
+F-H0-9904 2 ncfqdpqpcdpd
+F-H0-9905 9 pqqpqqppnqkpdqpjddpd
+F-H0-9906 7 phppqidpqhpjchpiegqfdeofpdcfndbfjdcdddccdc
+F-H0-9907 8 jqdrfrfqhqeqgqppdphpcngpddpd
+F-H0-9908 2 iqdrfrfqhqeqgqppdphpcngpddpd
+F-H0-9909 4 lpdrprcrerqqnqfqhqcqeqppdqcpdpqndocnddpd
+F-H0-9910 2 pirqqpqqpppqopnqdprproqnqopdqlddqfqcrdnc
+F-H0-9911 5 epcpopdcpd
+F-H0-9912 2 ipcpopdcpd
+F-H0-9913 4 icppdpfedjiddfocddfchc
+F-H0-9914 3 lddpppnepjkdpfncpdeclc
+F-H0-9915 2 coenppcnjpdkfpcedppdcl
+F-H0-9916 7 qkpqdpfqqnqpcnjpdcpd
+F-H0-9917 2 pjpqdpfqqnqpcnjpdcpd
+F-H0-9918 7 pnnqlqdpppnoddpd
+F-H0-9919 3 nqdpppqnqlonddpd
+F-H0-9920 3 qnppnqpjdqpddcjd
+F-H0-9921 2 coppdqjpncpjdcpd
+F-H0-9922 2 efpjqppdcpjdcfdd
+F-H0-9923 9 eqfpdqdpppcpepcododcpd
+F-H0-9924 7 oqpqppqpdpqopopd
+F-H0-9925 2 dripfqdpppcnfodcpd
+F-H0-9926 3 qnoqpqppqpdpqopopcdd
+F-H0-9927 2 qqpppqopoqqoqppdcpdd
+F-H0-9928 3 cpqrqqorqppqdpfqpocqeonpqlcnddpd
+F-H0-9929 3 qfqrqqorqppqdpfqpocqeonpqlcnddpd
+F-H0-9930 2 ncqrqqorqppqdpfqpocqeonpqlcnddpd
+F-H0-9931 4 qmcqdrdppqpoiqcnfqddpd
+F-H0-9932 2 qocqdrdppqpoiqcnfqddpd
+F-H0-9933 7 qipqdpnqpoqpqnqopmpd
+F-H0-9934 5 qnpqdpfqpoqodcpd
+F-H0-9935 3 pppqdpfqpoqodcpd
+F-H0-9936 5 poqnpponjppmdpqdqoddpn
+F-H0-9937 3 hcqqdpqdddfc
+F-H0-9938 2 cfqqdpqdddfc
+F-H0-9939 5 qjoqeqqpdcpd
+F-H0-9940 3 cpoqeqqpdcpd
+F-H0-9941 6 bedppqedpddccdccbc
+F-H0-9942 4 mqqqqrqppqdppdpocd
+F-H0-9943 10 cppqdqdococnddpd
+F-H0-9944 3 lpoqqppddpddjc
+F-H0-9945 2 opdppqqocjddpd
+F-H0-9946 2 qmdppqqocjddpd
+F-H0-9947 4 ncpqdppkcdpd
+F-H0-9948 2 fcpqdppkcdpd
+F-H0-9949 2 ecpqdppkcdpd
+F-H0-9950 3 qkdopqdcpd
+F-H0-9951 2 pkdopqdcpd
+F-H0-9952 4 ncmeppledpqdmfddnemcod
+F-H0-9953 3 ccdpppehfgegefcgdedcpd
+F-H0-9954 2 gndqppemdocmenelfmddpd
+F-H0-9955 3 deeppopd
+F-H0-9956 2 edeppopd
+F-H0-9957 2 oqdoedpd
+F-H0-9958 6 rjrippoidpqhqiphpipdohndqfjdofdd
+F-H0-9959 8 ooopqppllppddpdd
+F-H0-9960 5 rlkqdpfqcnqpqkqlqjpkddpd
+F-H0-9961 2 plkqdpfqcnqpqkqlqjpkddpd
+F-H0-9962 9 dopqkqfqhqcqdqcpdpqoddpd
+F-H0-9963 3 ocqepeqdpdpc
+F-H0-9964 5 odqdppcdcpeceddcfc
+F-H0-9965 3 dndqpqcpdococndcpd
+F-H0-9966 4 pdpjdpdj
+F-H0-9967 2 pppjdpdj
+F-H0-9968 4 qjoqcqqpdcpd
+F-H0-9969 2 qkoqcqqpdcpd
+F-H0-9970 7 pkkqdpfqcnqpqjqkdcpd
+F-H0-9971 10 pcppdppjddqdqcpdnckd
+F-H0-9972 3 pmqppdjpdddp
+F-H0-9973 2 qopqdppjddpd
+F-H0-9974 2 ncpqdppjddpd
+F-H0-9975 9 doeqepqpcpdppddndd
+F-H0-9976 7 oomppqdpjppoqkddpd
+F-H0-9977 7 kqrqqqqppqrooppndppd
+F-H0-9978 2 lqrqqqqppqrooppndppd
+F-H0-9979 5 peqopqddcpocqd
+F-H0-9980 2 mdqopqddcpocqd
+F-H0-9981 6 fpnqhqfqdpqpdcpd
+F-H0-9982 2 qpqrqqpqdppdpndd
+F-H0-9983 9 qkkqdpfqcnqpqjpkdcpd
+F-H0-9984 2 dedqppqjcjdcpd
+F-H0-9985 2 oqqpjqcppdjcdd
+F-H0-9986 6 qqpqdpnppoqkddpd
+F-H0-9987 3 fedpppcidefdpddc
+F-H0-9988 3 jqpppddpcdcj
+F-H0-9989 2 qfppdppddcjc
+F-H0-9990 2 ogjjpdqfndlc
+F-H0-9991 2 omnqppqlpnjj
+F-H0-9992 2 dpnqppqlpnjj
+F-H0-9993 4 cknqdqqpqjcodcpd
+F-H0-9994 2 dlnqdqqpqjcodcpd
+F-H0-9995 5 pipqponqnocppdpldd
+F-H0-9996 2 qcpqdpqfofqdodlddd
+F-H0-9997 2 hofqfodqdoqppddldd
+F-H0-9998 6 pnnqlqcpppnopcdd
+F-H0-9999 4 cnfqhqqpdpfodcpd
+F-H0-10000 6 jpppnqpndpqddfkcddfc
+F-H0-10001 3 nddpoqqjqprhqlqfqhddpd
+F-H0-10002 3 qodpppqnqlrlqhqjqdddoc
+F-H0-10003 9 ddoqdpoc
+F-H0-10004 5 dbcfpppdfcdd
+F-H0-10005 5 pjppjpdpjjpd
+F-H0-10006 5 qqqppppnnp
+F-H0-10007 4 dppodcod
+F-H0-10008 3 qpdecpod
+F-H0-10009 4 nqppcpqidcpc
+F-H0-10010 2 ecpqdqqkcdpd
+F-H0-10011 3 eepqeopd
+F-H0-10012 2 depqeopd
+F-H0-10013 2 ecpqeopd
+F-H0-10014 7 molqfqjqppiqkphqjphpipdphocnfoddpd
+F-H0-10015 2 lplqfqjqppiqkphqjphpipdphocnfoddpd
+F-H0-10016 6 qqprppnqdppdpnddqiqcqfncrd
+F-H0-10017 2 fccqdrrpiqdpfqqnppcnnpddpd
+F-H0-10018 6 onppqnjppmdpqdqoddpn
+F-H0-10019 2 nppqqocpdcpd
+F-H0-10020 2 eppqqocpdcpd
+F-H0-10021 6 qfqpdpopqjqldcpd
+F-H0-10022 4 qgqpdpopqjqldcpd
+F-H0-10023 5 jpdppqjdqkddpd
+F-H0-10024 3 fqdppqjdqkddpd
+F-H0-10025 2 ocpdqfmc
+F-H0-10026 4 dppoddqd
+F-H0-10027 2 dqpoddqd
+F-H0-10028 6 fcdppocfddpd
+F-H0-10029 4 omppqnjpondppmqoqdpoddpn
+F-H0-10030 3 qmppqnjpondppmqoqdpoddpn
+F-H0-10031 2 nqppdpcjfddfdcpd
+F-H0-10032 2 hqjqqpnpdppdpndd
+F-H0-10033 2 qjppdqdnfpcjddpd
+F-H0-10034 2 ncppdpcjfddfdcpd
+F-H0-10035 4 pdjjppdjdd
+F-H0-10036 3 ppjpdpjjpd
+F-H0-10037 5 kcdqpqcfqdddfc
+F-H0-10038 3 eqnqjpfqdpqpddpd
+F-H0-10039 9 idppdppdddhdhcfc
+F-H0-10040 10 enfqopqpdpcndndmdcpd
+F-H0-10041 8 qqpqpocpddpeocqd
+F-H0-10042 5 qqpqpndppddc
+F-H0-10043 5 prorpqoqnqppopnpmpnodpmooopjddpd
+F-H0-10044 2 qqorpqoqnqppopnpmpnodpmooopjddpd
+F-H0-10045 3 cqdrdpfqcnpd
+F-H0-10046 2 dddrdpfqcnpd
+F-H0-10047 8 npdppqpopkddpd
+F-H0-10048 3 ofphogpgpfrfqeqfrdrepdlcnc
+F-H0-10049 2 nfphogpgpfrfqeqfrdrepdlcnc
+F-H0-10050 9 jpdpfqdnppcepddc
+F-H0-10051 6 gdcdppqcdpeceddcfc
+F-H0-10052 4 dfcqppcecfcddedcpd
+F-H0-10053 4 nqpppdcoddpjncqf
+F-H0-10054 2 qpoqdppdcfjdddfc
+F-H0-10055 2 pooqdppdcfjdddfc
+F-H0-10056 2 pcpgogqfpfqeofpeoeqdpd
+F-H0-10057 3 popqdpipjdqkddpfncpd
+F-H0-10058 2 mcdpfqdnppcijpkdpddc
+F-H0-10059 4 pfdqpqddpkncpd
+F-H0-10060 2 kddqpqddpkncpd
+F-H0-10061 6 gdppdpdjclefcdcfdcpd
+F-H0-10062 2 gqppdqencpcnchdjddpd
+F-H0-10063 8 ddpqdpqe
+F-H0-10064 5 rpqpopppqolppodppdoodd
+F-H0-10065 2 ndoeppqddppdqeldpeddod
+F-H0-10066 2 oqqpopppqolppodppdoodd
+F-H0-10067 3 nbqdqcpdpcocobnc
+F-H0-10068 4 pqqqmqopqpdpddpd
+F-H0-10069 4 rqqqmqopqpdpddpd
+F-H0-10070 2 dddppppdcdedgccc
+F-H0-10071 6 ceegqpefdpdfdgeecfpddejdcddd
+F-H0-10072 5 dndqpqcpdococnddpd
+F-H0-10073 3 fcdqpqcpdococnddpd
+F-H0-10074 2 mppqnqoqopqpqddpdd
+F-H0-10075 5 fpfqipppdpcndcpd
+F-H0-10076 4 fpfqqpcndppddkdd
+F-H0-10077 6 roqppppojpoodpqnqopmpnpdonddom
+F-H0-10078 3 fqdpqpdepd
+F-H0-10079 3 ceoppddpdc
+F-H0-10080 2 cfoppddpdc
+F-H0-10081 5 fqdpppdjjpjdpjddpfncpd
+F-H0-10082 5 qofrpqeqfqipcqfpgpdpcpfocnddpd
+F-H0-10083 2 fcfrpqeqfqipcqfpgpdpcpfocnddpd
+F-H0-10084 5 oddpnqqnpppjddqd
+F-H0-10085 8 nqdppqpoplnopd
+F-H0-10086 4 plcqiripdrdppqpofqdnfodcpd
+F-H0-10087 4 dfcqbpqpenfpcndpbkdkpdedcd
+F-H0-10088 9 rqqqpqppqppocprnqoqnpnqdqmdd
+F-H0-10089 5 oqqpcqddqc
+F-H0-10090 5 oqqppqppopnppodppdqocd
+F-H0-10091 3 eedppqdfdeddpdeceddccd
+F-H0-10092 8 doeqpqdpepdncpddpd
+F-H0-10093 4 pbdrdpfqcnppddpfncpd
+F-H0-10094 4 jpppnqpndppdcffcdddb
+F-H0-10095 8 qppppqdpqopopcdd
+F-H0-10096 6 ponqpqdpqkddpd
+F-H0-10097 2 npnqpqdpqkddpd
+F-H0-10098 7 qkpqdpqpqnqdddnc
+F-H0-10099 7 qgfqdpppdnjpqjqlddpd
+F-H0-10100 2 qnppdpqhqjpddfjdddfc
+F-H0-10101 5 cccnqpdfdppdedcd
+F-H0-10102 2 piqpopdppdpncdqf
+F-H0-10103 5 cpepqpdcpd
+F-H0-10104 4 oqepqpdcpd
+F-H0-10105 5 dgdqppeeefeddedcpd
+F-H0-10106 4 ffdqppeeefeddedcpd
+F-H0-10107 2 lopqdpjpjdpkddpd
+F-H0-10108 5 dqpqfpfqdpeqfogpddpd
+F-H0-10109 2 depqdpqdeccd
+F-H0-10110 2 ocpqdpqdeccd
+F-H0-10111 2 dfpqdpqdeccd
+F-H0-10112 4 piqhpqpddpndqfddof
+F-H0-10113 3 qjppqnnpondpddqlpc
+F-H0-10114 2 drhqfqdpqpdnfoddpd
+F-H0-10115 9 cqopfqdpqpeocnddpd
+F-H0-10116 7 frgqfqeqcqdqppfpepcpdpdcpd
+F-H0-10117 8 rpdrercrhqnqeqfqdqcqdpppdocpqncndcpd
+F-H0-10118 7 ccchdqpdqpjdcfdd
+F-H0-10119 2 lplqnqppcppjdcpd
+F-H0-10120 4 qjoqcpqpdcpd
+F-H0-10121 3 ncoqdpqpcdpd
+F-H0-10122 2 jccepqpddpdc
+F-H0-10123 4 rippoidpqhqiphpipdohndqfjdofdd
+F-H0-10124 4 cqpqccqd
+F-H0-10125 2 dqpqccqd
+F-H0-10126 5 qbphppoedpneofmenfddpepcpdocmdncqc
+F-H0-10127 3 dbdpppegdgefffcffeeepdceedhdddcdcc
+F-H0-10128 9 fqppdqdocpdncocncecfcddedcpd
+F-H0-10129 6 ddeqpppd
+F-H0-10130 5 coppdqdodcqd
+F-H0-10131 3 dhqpdqdedcpd
+F-H0-10132 5 jpppdpqidjjdddpc
+F-H0-10133 3 ncpqdpjpdjqkddpd
+F-H0-10134 7 cgdpppdfcedepdeccd
+F-H0-10135 3 cfdpppdfcedepdeccd
+F-H0-10136 9 hpfqiqpphqjpdpipdnfodcpd
+F-H0-10137 5 qnerdrnqcreqfqdqcqjpppdpcpdocnddpd
+F-H0-10138 2 ndqprqppqqoppqdpnqrorpqoqnpjpdqfdd
+F-H0-10139 9 roqrrqqqpqppqppocprnqoqnpnqdqmdd
+F-H0-10140 3 opdppqqofqdcpd
+F-H0-10141 3 pldppqqofqdcpd
+F-H0-10142 2 pmdppqqofqdcpd
+F-H0-10143 7 oqrqqrpqqqqpppcpporornqoqnpnqdqmdd
+F-H0-10144 2 endqcrbqcqqpdpcpdococnbobndnpdcmcd
+F-H0-10145 7 oqopqppndpedpd
+F-H0-10146 2 cnepppdncpoddd
+F-H0-10147 4 ndppdppjqcqdpcpdncoddckd
+F-H0-10148 3 ocppdppjqcqdpcpdncoddckd
+F-H0-10149 2 rpnqqnpponql
+F-H0-10150 3 pfdpppdhffgeeffedeeepdncgdfcddecbddccc
+F-H0-10151 3 pnnpqpdpddpd
+F-H0-10152 2 cnnpqpdpddpd
+F-H0-10153 2 qfpeqepdqdocpc
+F-H0-10154 7 cmeqdqppcqdpcpdocodnddpd
+F-H0-10155 3 ebppdpdfcedecdpddcddccec
+F-H0-10156 4 qfpqdpqkddpdnckd
+F-H0-10157 3 qcpipppddpcdqfic
+F-H0-10158 2 ofpipppddpcdqfic
+F-H0-10159 9 orprnrpqoqnqopnpmpnodpplpopddd
+F-H0-10160 4 jqdqpqfpfqdpeqfogpddpd
+F-H0-10161 2 clppcodpcncpdmenpddncd
+F-H0-10162 2 ogpfqpofdpqdpgpdqfddqe
+F-H0-10163 10 dqepeqcpqpdodppddndd
+F-H0-10164 7 dpjpppjjddjd
+F-H0-10165 10 qrrqqqpqppqppocprnqoqnpnqdqmdd
+F-H0-10166 9 kbppdppjnepfddpdnckdpbqc
+F-H0-10167 5 oomppqdpplpoqddcoc
+F-H0-10168 2 ppmppqdpplpoqddcoc
+F-H0-10169 2 nomppqdpplpoqddcoc
+F-H0-10170 9 ooopqpdplppmddpd
+F-H0-10171 5 npnqqpqoppqndppmpnomonqdpkdd
+F-H0-10172 5 gnpqdqfqipeqfpgpdpgofocnddpd
+F-H0-10173 4 nqppdppjddoc
+F-H0-10174 3 qdppdppjddoc
+F-H0-10175 8 cfqqdpcededcpd
+F-H0-10176 2 jjjpppdppjdjpddfjdddfc
+F-H0-10177 5 oqopqpdopdpndd
+F-H0-10178 2 cnepcppopddndd
+F-H0-10179 4 peppdpciddcffcbdccpc
+F-H0-10180 3 qopqfqbpcqcndpckddpd
+F-H0-10181 2 fcdrcqiqppfqdppdcncd
+F-H0-10182 7 ndpqpidppdqfcdof
+F-H0-10183 2 cnfqipqpdpfodcpd
+F-H0-10184 8 nppqppoqopnqqoqppddpcd
+F-H0-10185 5 dqfqqppdcpdd
+F-H0-10186 2 chppdqcfdcpd
+F-H0-10187 7 cqeqpppdcodd
+F-H0-10188 3 npdppqpnfqcnjpdcpd
+F-H0-10189 2 qodppqpnfqcnjpdcpd
+F-H0-10190 6 kqdpfqcnqpecpd
+F-H0-10191 2 qcphogpgpfqfofqeoepepdqdpc
+F-H0-10192 4 olppqnnponcppkqlpdpldd
+F-H0-10193 7 ereqpqipfqfpdqdpcqcpcnddpd
+F-H0-10194 5 onqpoqlpoodppdpndd
+F-H0-10195 2 bqdqppfpeodlcoddpd
+F-H0-10196 4 cfqpnppddpdd
+F-H0-10197 3 qqqpnppddpdd
+F-H0-10198 3 pkdopqecpd
+F-H0-10199 2 cpeppdqocd
+F-H0-10200 7 qeppqddpndpdddodpcrcocqcmcncqbnbobmb
+F-H0-10201 2 rrnrqrmrorrqpqqqoqnqmqppqpopnppddpdd
+F-H0-10202 9 qmpqrpfqdpipqnpocnpnddpd
+F-H0-10203 7 dfppdpcecfpddecdfddc
+F-H0-10204 7 nereppqddpddodrcqcmcpc
+F-H0-10205 2 fddpppcgdedcpdebcdcbcc
+F-H0-10206 7 enpqipfqdpcndndmddpd
+F-H0-10207 6 ofqhppcedppdqfdc
+F-H0-10208 6 oepgppodqdddld
+F-H0-10209 2 ppopqpdplppmpd
+F-H0-10210 6 eqcpppqdddnc
+F-H0-10211 2 epcpppqdddnc
+F-H0-10212 8 fcdppqcdpdeced
+F-H0-10213 2 eqepppcecppd
+F-H0-10214 2 dnepppcecppd
+F-H0-10215 9 qnorqrpqproqqqlqnqppqpdppdpoddqfncrd
+F-H0-10216 7 qnpqcpqopopd
+F-H0-10217 8 cqdqeqcpqpcodpcndodmdnddpd
+F-H0-10218 4 mpoqnpnqdpqpddpd
+F-H0-10219 2 qkqpqnpppddpdd
+F-H0-10220 5 dgdpppedbeicpddccdccbc
+F-H0-10221 4 npqqqrqpordppqpopdqkdd
+F-H0-10222 4 brbqdqppcqdpcncppdcldd
+F-H0-10223 4 pppqqqmqopqpdpqmnopddd
+F-H0-10224 5 qqpqdpqdpndd
+F-H0-10225 3 qfpqdppoddpc
+F-H0-10226 4 qeqfqhrdrercqdqcpdpcod
+F-H0-10227 5 cdpqdppdccdd
+F-H0-10228 4 ncfqdpopdnjpdcpd
+F-H0-10229 3 pfdppqdjjpddpkncpd
+F-H0-10230 2 nedppqdjjpddpkncpd
+F-H0-10231 2 qlqnpppdipjdcpdddj
+F-H0-10232 7 efdfppcedppddgddcf
+F-H0-10233 4 ncdrercrhqqqeqnqdqjqrpfqdpcqdoppqncpqkcnddpd
+F-H0-10234 2 fpdrercrhqqqeqnqdqjqrpfqdpcqdoppqncpqkcnddpd
+F-H0-10235 2 cnfqeqfpdqepppqhcpreqfqerdqdrcpdqcodpcddnc
+F-H0-10236 6 eqeppqdncpddpd
+F-H0-10237 2 cfdpppdfcdedpc
+F-H0-10238 3 phogpgpfqfofqeoepepdqdpc
+F-H0-10239 6 eopqdpfqpncnddpd
+F-H0-10240 2 dnpqdpfqpncnddpd
+F-H0-10241 2 oqopqpcndp
+F-H0-10242 2 fqdpopecpd
+F-H0-10243 2 dccedppdpo
+F-H0-10244 2 rgppridpoirjqhqiphpipdohndqfjdofdd
+F-H0-10245 4 rdqhqfqdqcpdpcod
+F-H0-10246 5 qnppqddpddcj
+F-H0-10247 2 jqppqddpddcj
+F-H0-10248 2 qnppdqpdddjc
+F-H0-10249 5 prqpqqlpppcpopqonooonnqnpmonpdomdd
+F-H0-10250 4 cbdqppdhffgeeffedeeepdfcgdecdddccc
+F-H0-10251 8 roqppqmpppdpqopopnooplqnpddd
+F-H0-10252 3 cepopddodc
+F-H0-10253 2 djepqpedpd
+F-H0-10254 3 ppqppqdpddpc
+F-H0-10255 7 qcceppqddplcncdc
+F-H0-10256 9 pppqmpoodpnopoplonpd
+F-H0-10257 3 popqdpcjcedfcdcffcdedcpd
+F-H0-10258 2 qopqdpcjcedfcdcffcdedcpd
+F-H0-10259 2 cfdppqponqqnqppnqoqjpddc
+F-H0-10260 3 ohogphpfpgofqfoeqepdpeqcqdpc
+F-H0-10261 5 qcdpfqcnppddjpncpfpbpd
+F-H0-10262 9 dcqppdedcdfcec
+F-H0-10263 3 qcdpqfoencpd
+F-H0-10264 7 qirpqqdppqrofqqnjppnqocnpormonplompkqlddpd
+F-H0-10265 6 proroqnqqpnpopoodponnopdmodd
+F-H0-10266 4 qppqdpfqpnipcnooddpd
+F-H0-10267 4 qqpqdpnqpoplnopd
+F-H0-10268 2 lopqdpnqpoplnopd
+F-H0-10269 5 ncfqdpppdnjpcepddc
+F-H0-10270 2 jqdppqjdqoddpfncpd
+F-H0-10271 3 qdpdpe
+F-H0-10272 2 pepdod
+F-H0-10273 9 qrorprpqqqlqnqppqpdppdpoddqfncrd
+F-H0-10274 7 onpqdpoopoddpd
+F-H0-10275 5 qqprppnqkpdppnnoddpd
+F-H0-10276 7 ofppdjdppfpgpdqfjdnddd
+F-H0-10277 2 pldppqpoqddfkcddfc
+F-H0-10278 2 qmdppqpoqddfkcddfc
+F-H0-10279 2 qodppqpoqddfkcddfc
+F-H0-10280 5 fcdpoqddoc
+F-H0-10281 2 jpppqedpce
+F-H0-10282 9 pcdppppfqdodddncoc
+F-H0-10283 4 qepqdpqdodldddfc
+F-H0-10284 3 pgpqdpqdodldddfc
+F-H0-10285 6 ncpqpfcpodqdddoc
+F-H0-10286 2 pqoqopqpdpcdpnpc
+F-H0-10287 9 fofqipqpfpgpdpcndcpd
+F-H0-10288 4 qndppqqjqdcfkcddfc
+F-H0-10289 4 nqdppqpoplnodcpd
+F-H0-10290 3 qmopqpdplponcdpd
+F-H0-10291 5 qkpqdpqpqnqddcoc
+F-H0-10292 3 pjpqdpqpqnqddcoc
+F-H0-10293 2 popqdpfedfpdidfcddibccdb
+F-H0-10294 2 qopqdpfedfpdidfcddibccdb
+F-H0-10295 2 jcpppicppdrindqfddofqcrd
+F-H0-10296 2 dnfqdpqpccpd
+F-H0-10297 2 qhpqpddpccqf
+F-H0-10298 2 cmfqdpqpccpd
+F-H0-10299 5 pippdpqhqfpdofnddfjdddfc
+F-H0-10300 7 ebdppppddecdddfchcccdcdb
+F-H0-10301 7 dnfpeqdpdqcpppeoepcododcpd
+F-H0-10302 2 ofpfppoedppdqecdpepcqdocod
+F-H0-10303 8 fdpqdpcfddpdhcfc
+F-H0-10304 6 qndppqqjqdddnc
+F-H0-10305 2 ipdppqpodjddpd
+F-H0-10306 5 hocqpqfpfqdpeqcpdqgohpfogpeoepdjpddd
+F-H0-10307 9 enpqhpepcpfoeodmddpd
+F-H0-10308 4 eqcppqqddcoc
+F-H0-10309 3 epcppqqddcoc
+F-H0-10310 3 ddnn
+F-H0-10311 2 dqnf
+F-H0-10312 4 cpqopqecpd
+F-H0-10313 2 plqopqecpd
+F-H0-10314 4 opdqpdqpjdcffdcdedecfcdc
+F-H0-10315 3 qopqdpcedjqddfcdcffcdedc
+F-H0-10316 4 pjppqnnponcpolqlpkplpdqkdd
+F-H0-10317 3 cnfqdpqoddpd
+F-H0-10318 2 ipfqdpqoddpd
+F-H0-10319 4 opqodpjjddpd
+F-H0-10320 2 fodpfqcnopddpe
+F-H0-10321 2 ipdpfqcnopddpe
+F-H0-10322 5 cpqjppddpc
+F-H0-10323 4 qodppqqnfqpnjpcnpodcpd
+F-H0-10324 3 ondppqqnfqpnjpcnpodcpd
+F-H0-10325 2 cdppdqcopd
+F-H0-10326 5 ccppdppddccd
+F-H0-10327 2 ddppdppddccd
+F-H0-10328 2 cqdripfqdpppcnfodcpd
+F-H0-10329 3 lephppddpepcnenc
+F-H0-10330 2 cqfqfodqdoppdddl
+F-H0-10331 2 jpqpoplpdpqnonpd
+F-H0-10332 8 pdoqdpqppeqgddqdqcpc
+F-H0-10333 4 nddppdqocdqfic
+F-H0-10334 2 kddppqncqkecpd
+F-H0-10335 5 ponppqdpqkddpd
+F-H0-10336 2 oonppqdpqkddpd
+F-H0-10337 3 ddcqqpqc
+F-H0-10338 2 cdcqqpqc
+F-H0-10339 2 cccqpqqc
+F-H0-10340 3 cfdppqcnfqjdjpddqfncpd
+F-H0-10341 3 podppqcnfqjdjpddqfncpd
+F-H0-10342 3 cpippqdpfqencndndmddpd
+F-H0-10343 3 cqippqdpfqencndndmddpd
+F-H0-10344 4 ncqhqfrerdqercqdqcpdpcod
+F-H0-10345 3 jpdpfqdnopddpe
+F-H0-10346 3 ipdpfqdnopddpe
+F-H0-10347 6 ooopqpdplppmdcpd
+F-H0-10348 5 mporppqqpoqp
+F-H0-10349 2 qpqdpeqcpdob
+F-H0-10350 4 pcqhqfqdqcpd
+F-H0-10351 6 pcpppidpqdpgkdpddd
+F-H0-10352 9 cfdqpqcededcpd
+F-H0-10353 3 cddpoqecpd
+F-H0-10354 2 dedpoqecpd
+F-H0-10355 2 dqqeppddco
+F-H0-10356 5 nonqppmpnpdppd
+F-H0-10357 2 omqnpppmdppdpn
+F-H0-10358 2 ecpddpgdfdfcdd
+F-H0-10359 3 pjdnppccpd
+F-H0-10360 5 edoqdopd
+F-H0-10361 2 pqdppeec
+F-H0-10362 5 nddpoqqjqpqfqlofqhdcpd
+F-H0-10363 2 qodqppqnqlonqhqjqdddoc
+F-H0-10364 4 qnnqppjjpd
+F-H0-10365 9 pcpippqdcppdqfddqc
+F-H0-10366 4 ccdpppqfqhcfrerdqeddqdrcpdqcodpcfcncdb
+F-H0-10367 2 qnnqpppddpec
+F-H0-10368 6 nepqdppkncpddclc
+F-H0-10369 2 qfpqdppkncpddclc
+F-H0-10370 5 fdppdicppeefddcf
+F-H0-10371 3 oceqppdcqd
+F-H0-10372 3 qopqqqoqppmqopqpdpqmnopddd
+F-H0-10373 2 nqpqqqoqppmqopqpdpqmnopddd
+F-H0-10374 4 hqfqdpppqddd
+F-H0-10375 4 qfppcpddpdnc
+F-H0-10376 7 pmqnpponnpnmjpoldppkompjqlpiplogqkpdqjddqh
+F-H0-10377 6 fcppcqddpd
+F-H0-10378 2 jjppcqddpd
+F-H0-10379 2 idpqjppkdppdddfc
+F-H0-10380 2 mppqjppkdppdddfc
+F-H0-10381 2 jdpqjppkdppdddfc
+F-H0-10382 4 qjppdpndddqc
+F-H0-10383 2 ncqqdpnpddpd
+F-H0-10384 2 cocedcqd
+F-H0-10385 2 ppcedcqd
+F-H0-10386 4 opqppidppdriddqfqcofncrd
+F-H0-10387 2 pnircqdrippqdpfqcnfoddpd
+F-H0-10388 8 ompqrpfqdpjpqnpopnoncnplddpd
+F-H0-10389 3 qdoqdpocdc
+F-H0-10390 2 cdeqpqecpd
+F-H0-10391 6 lnlqnqkqkpjqjphqipppdpmpnolplomogopnmnpjddpd
+F-H0-10392 4 ceqpdpdcqd
+F-H0-10393 2 deqpdpdcqd
+F-H0-10394 5 beppdpdgeeefcecfeddedcpd
+F-H0-10395 2 cdppdpdgeeefcecfeddedcpd
+F-H0-10396 6 cdppeedppdcfjdccdd
+F-H0-10397 5 ddcqppqjpdcc
+F-H0-10398 2 clqqdpcjddqc
+F-H0-10399 2 pfjqppqcdpcc
+F-H0-10400 7 dreqdqcqcpqpcodpcndodmdnddpd
+F-H0-10401 2 epdqppcmcoddpc
+F-H0-10402 2 qqmqoqqppddpcd
+F-H0-10403 2 eedppqcgcedcpd
+F-H0-10404 8 cleqdrcqcrbqdqppcpdpcodocndndmcmddpd
+F-H0-10405 6 qpppqojppodpqnoopmpnpdoncdom
+F-H0-10406 2 poppoqnpnqooopnompmodppjdcpd
+F-H0-10407 7 onopqpnolppldppdoodd
+F-H0-10408 2 rpprqqpqppnqmpfqdpooponoonmonnplddpd
+F-H0-10409 6 pjkqdpfqcnqppkqlqjqkdcpd
+F-H0-10410 4 rpfqdpppqnnpdnjpddpd
+F-H0-10411 2 pjfqdpppqnnpdnjpddpd
+F-H0-10412 5 mdppeqcjcpphpepcdd
+F-H0-10413 8 rdpiqppddpddqfncof
+F-H0-10414 4 gddppqfdcfddpdhcfc
+F-H0-10415 4 cqhqfqfpppdpcnddpc
+F-H0-10416 8 eqdrercrkqpqhqfqdqcqdpcpdoqoddpd
+F-H0-10417 6 hedpppidpdddhdhcfc
+F-H0-10418 3 mplqnqpplpkpdppddd
+F-H0-10419 4 prppnqdpcdqnpc
+F-H0-10420 4 odqfqhqcqdpcpd
+F-H0-10421 7 dmeqdqqpcpdpcodocndnddpd
+F-H0-10422 8 pgdjpppfdppdqfjdnddd
+F-H0-10423 2 fkcqdqcpppdojpcodpcneodmencmdnpdemcddl
+F-H0-10424 2 ejcqdqcpppdojpcodpcneodmencmdnpdemcddl
+F-H0-10425 5 pcpppicppdqfjdqcdd
+F-H0-10426 2 pqqqppnqkpdppjdcpd
+F-H0-10427 4 coerfrcrfqgqcqeqbqdqppfpepcpdpdcpd
+F-H0-10428 2 grerfrcrfqgqcqeqbqdqppfpepcpdpdcpd
+F-H0-10429 7 qpcppqpoqoqnpd
+F-H0-10430 3 qniqpeppdecp
+F-H0-10431 6 ebppdpdecdpdccdd
+F-H0-10432 2 cdpppddpdcedccdd
+F-H0-10433 2 kcpqdqqdddnchcfc
+F-H0-10434 2 dncnqpcfdpqdcldc
+F-H0-10435 2 popqdqqdddnchcfc
+F-H0-10436 9 erdrkqpqhqfqdqcqdpcpdoqoddpd
+F-H0-10437 5 bddipppecpfdefddcf
+F-H0-10438 3 pecdpqpccp
+F-H0-10439 2 codqqdqpdc
+F-H0-10440 2 fqnrlqqqqppqppnqopdpmojdpjdcpd
+F-H0-10441 2 fpppqhcpogdjperfpdqfjdqdddqcpc
+F-H0-10442 2 denrlqqqqppqppnqopdpmojdpjdcpd
+F-H0-10443 4 qcdpoqqjqpqfqlofqhrdpdddnd
+F-H0-10444 2 ohdpoqqjqpqfqlofqhrdpdddnd
+F-H0-10445 2 pidpoqqjqpqfqlofqhrdpdddnd
+F-H0-10446 5 icpqdpfedfpdddidhcfc
+F-H0-10447 3 hdpqdpfedfpdddidhcfc
+F-H0-10448 3 pqpodpijdcqe
+F-H0-10449 2 pcpodpijdcqe
+F-H0-10450 3 popqcpfpddpd
+F-H0-10451 2 eqpqcpfpddpd
+F-H0-10452 3 qnppfqdpcqeocnddpd
+F-H0-10453 3 nqppfqdpcqeocnddpd
+F-H0-10454 3 cpppfqdpcqeocnddpd
+F-H0-10455 4 oqppnqnpmpnodppjpnpdddjd
+F-H0-10456 3 qcdjpppfdpofpgpdqfjdnddd
+F-H0-10457 4 qdqfqhqcpd
+F-H0-10458 2 cfjqoppddodd
+F-H0-10459 2 cnmppqjppodppkdcpd
+F-H0-10460 2 demppqjppodppkdcpd
+F-H0-10461 4 ppkqpmqppddpcdpk
+F-H0-10462 4 ookqpmqppddpcdpk
+F-H0-10463 4 fpcnpqpddpddqf
+F-H0-10464 3 cndpfqddqpncpd
+F-H0-10465 3 cnfqdppppd
+F-H0-10466 2 pddpppcfdd
+F-H0-10467 2 pfdddpncpd
+F-H0-10468 7 cnpphpepcpdpeofoendmdcpd
+F-H0-10469 2 dopphpepcpdpeofoendmdcpd
+F-H0-10470 7 nmppqnnponjpoldppkompjqlpiplogqkpdqjddqh
+F-H0-10471 2 qfdpppnccfdcpd
+F-H0-10472 2 jpnqppdqcnddpd
+F-H0-10473 2 ooeejj
+F-H0-10474 4 rcpfpdqendqdqc
+F-H0-10475 2 clppnqqnjpcndppddffcdddb
+F-H0-10476 5 qddqppqfpc
+F-H0-10477 4 qfjqdpfqcnopddpd
+F-H0-10478 2 qpjqdpfqcnopddpd
+F-H0-10479 2 ncjqdpfqcnopddpd
+F-H0-10480 5 rrqqrqpqqpopmpondppdqndd
+F-H0-10481 4 bodqbqcqppepgpencppdcndd
+F-H0-10482 3 popqepcpdcpd
+F-H0-10483 2 cqpqepcpdcpd
+F-H0-10484 2 fpdqqppddocd
+F-H0-10485 7 bqcrfrgqfqeqcqdqppfpepcpdpdcpd
+F-H0-10486 7 cdpqdpdeecpd
+F-H0-10487 5 nddpppqfqhofpddfjdddfc
+F-H0-10488 8 fqppdqdocpcncodmdcpd
+F-H0-10489 9 cfdpppeedgceefeddedcpd
+F-H0-10490 6 creqdrcqdqbqcpqpcodpcndodmdnddpd
+F-H0-10491 8 ckfqpqcqbpdpcnddpd
+F-H0-10492 4 qrqqpqpocpddpeocqd
+F-H0-10493 2 qkqqpqpocpddpeocqd
+F-H0-10494 2 kcqqpqpocpddpeocqd
+F-H0-10495 3 qdpeqeodpdpcnd
+F-H0-10496 3 pqqqmqopqpdpqmnopddd
+F-H0-10497 6 crerdrkqpqhqfqdqcqdpcpdoqoddpd
+F-H0-10498 5 opdppqpoooonpd
+F-H0-10499 4 nodppqpoooonpd
+F-H0-10500 5 rdoqdpqpqjqlqfqhofpdddnc
+F-H0-10501 4 pioqdpqpqjqlqfqhofpdddnc
+F-H0-10502 8 gcceppqddplcjcdc
+F-H0-10503 5 ogpqpfdppdpgjdqfdd
+F-H0-10504 6 gcppdpfedhcedcpd
+F-H0-10505 2 eeppdpfedhcedcpd
+F-H0-10506 5 qqdrercreqpqdqfqipcqdpnppocpdocnddpd
+F-H0-10507 2 hcdpppqfpeqddefdpdqckdncpcdcocqbobpb
+F-H0-10508 5 freqerippqfpfqepdqdpcqcpcnddpd
+F-H0-10509 2 greqerippqfpfqepdqdpcqcpcnddpd
+F-H0-10510 8 monrlqqqqppqppnqopdppjddmeqcqdpcpdncodnblc
+F-H0-10511 4 gdpdqpcdedecfcdc
+F-H0-10512 2 pnpqpoqpqnqodcpd
+F-H0-10513 5 pfdppqcnfqncjpdcpd
+F-H0-10514 2 qfdppqcnfqncjpdcpd
+F-H0-10515 6 cqiqpqdpfqddpd
+F-H0-10516 2 ofqiqppddpddqf
+F-H0-10517 4 dpdepppc
+F-H0-10518 2 odopddqd
+F-H0-10519 2 fqcnppoddpcd
+F-H0-10520 2 dkcnppoddpcd
+F-H0-10521 3 ncdrcqiqdpfqdnppdcpd
+F-H0-10522 2 jcbpcqcnqpckfppddpdd
+F-H0-10523 8 erfrcrfqgqcqeqbqdqppfpepcpdpdcpd
+F-H0-10524 7 ncpqpocpodqdddoc
+F-H0-10525 6 qldpkqcnfqqkqpqjpkdcpd
+F-H0-10526 2 pldpkqcnfqqkqpqjpkdcpd
+F-H0-10527 3 ppdrercrhqpqeqfqdqcqdpcpqocndoplddpd
+F-H0-10528 2 oodrercrhqpqeqfqdqcqdpcpqocndoplddpd
+F-H0-10529 9 eoeqfpdqdpppcpepcododcpd
+F-H0-10530 2 dpocppdcqd
+F-H0-10531 3 nqppqndpqdodcd
+F-H0-10532 2 pldppqpofqddpc
+F-H0-10533 7 pgpfpqpddpjdqfdd
+F-H0-10534 4 jdmqfqeqjpdqfpppepcppdcndd
+F-H0-10535 2 jpdpppcmdjcedfcdcffcdedcpd
+F-H0-10536 5 pcqhppqddppdqfjdqcdd
+F-H0-10537 8 qrprqqppqpoplprodpqopornoopdqndd
+F-H0-10538 3 njlqnrqpqqpppqopnqmodppjddmeqcqdpcpdncodnblc
+F-H0-10539 2 gclqnrqpqqpppqopnqmodppjddmeqcqdpcpdncodnblc
+F-H0-10540 4 rcqhqfrerdqdqcpdpcod
+F-H0-10541 6 dqpqcpfqddpd
+F-H0-10542 2 poqnpqqddpdd
+F-H0-10543 3 fccqiripdrdppqdnfqcjfoddpd
+F-H0-10544 6 epereqpqipfqfpdqdpcqcpcnddpd
+F-H0-10545 5 dqppcoepdcpd
+F-H0-10546 2 dpppcoepdcpd
+F-H0-10547 3 qmpopqpddpdc
+F-H0-10548 2 ecqpdppdcded
+F-H0-10549 2 nppopqpddpdc
+F-H0-10550 5 foipfqdpppedpd
+F-H0-10551 3 cqipfqdpppedpd
+F-H0-10552 7 pnqpoqdppoqopddc
+F-H0-10553 2 dgpqdpcedepdeccd
+F-H0-10554 2 fqdppqqdcfkcddfc
+F-H0-10555 2 cfnqppiqqncpdcpd
+F-H0-10556 2 cenqppiqqncpdcpd
+F-H0-10557 6 pqqrprqqppqpoplprodpqopornoopdqndd
+F-H0-10558 2 noqrprqqppqpoplprodpqopornoopdqndd
+F-H0-10559 6 qpqqpqdpqmpopd
+F-H0-10560 2 qrqqpqdpqmpopd
+F-H0-10561 3 pjppjpdpddpd
+F-H0-10562 5 dpfpppddpd
+F-H0-10563 2 djppdpnddd
+F-H0-10564 9 fohppqcpepeodmddpd
+F-H0-10565 5 onqpoqlpdppd
+F-H0-10566 2 ooqpoqlpdppd
+F-H0-10567 6 pcdpppqcpjncoedcpd
+F-H0-10568 2 dqcqppcnjppddpcdeo
+F-H0-10569 5 qkqnpponnpolcppkqlpdpldd
+F-H0-10570 3 omqoiqqnqppmppqjcppdpnddon
+F-H0-10571 4 qdpgpfqfofqepd
+F-H0-10572 8 eqfqipcqfpppdpgpfocnddpd
+F-H0-10573 3 qbqpnidpogphpfpgofqfoeqepdpejdqdddqcpc
+F-H0-10574 2 jdppdphddjgdifedgepcfefceeecfddcddcccd
+F-H0-10575 7 cqppfqdpcneopddjcd
+F-H0-10576 5 ofqhdppdpojdqfdd
+F-H0-10577 3 qcppdppjedpdnclc
+F-H0-10578 2 lnpqlpnpdppkddpd
+F-H0-10579 3 plpopqpmdppdqm
+F-H0-10580 3 foepeodppd
+F-H0-10581 2 deedppddee
+F-H0-10582 6 pnpqrpfqdpjpqnpodnqlddpd
+F-H0-10583 2 qqpqrpfqdpjpqnpodnqlddpd
+F-H0-10584 4 pfdpoqqfqppeqgpdqeddqdqcpc
+F-H0-10585 2 rfdpoqqfqppeqgpdqeddqdqcpc
+F-H0-10586 4 pnnqdrdpfqqncqcnppddpd
+F-H0-10587 2 oonqdrdpfqqncqcnppddpd
+F-H0-10588 6 noqpoplppldppdoodd
+F-H0-10589 3 oqqqpqppmqopqpdpqmnopddd
+F-H0-10590 3 qnppdrhpcqcpepeodpcofoenfncndmempddjdd
+F-H0-10591 3 lcdpppdhffgeeffedeeepdjdgdfcddecbddccc
+F-H0-10592 7 mpppnqnppddpcdpjncqf
+F-H0-10593 7 kcpfpppddpddncqcpb
+F-H0-10594 2 cddppqpopc
+F-H0-10595 2 hddpqdedcd
+F-H0-10596 2 ecdpqdedcd
+F-H0-10597 5 qnpppddpcdcmic
+F-H0-10598 2 cdppnqqndqdfjppddccc
+F-H0-10599 2 rdrqqpqqpppqopnqdprproqnqopdpkndqfdd
+F-H0-10600 6 nqpppqmpoodpnopoplonpd
+F-H0-10601 2 qoppqpoplpnodppmoopdon
+F-H0-10602 4 qqpqpoqmddpd
+F-H0-10603 3 neqddpddodmc
+F-H0-10604 2 oepppjdppdqfjdncdd
+F-H0-10605 2 nddpppqfpjddpdncjd
+F-H0-10606 6 onpqdpfqpoipdnooddpd
+F-H0-10607 2 qqpqdpfqpoipdnooddpd
+F-H0-10608 3 phdppppiqhqfpdofnddfjdddfc
+F-H0-10609 2 qodpfqqnpponnpdnjppkqlddpd
+F-H0-10610 7 dcppeqpdddfchccc
+F-H0-10611 5 krqqprppnqkpdppnnoddpd
+F-H0-10612 3 pldppqqoqddcoc
+F-H0-10613 2 qmdppqqoqddcoc
+F-H0-10614 3 qnppdrhpcqcpepeodpcofoenfncndmempdcidd
+F-H0-10615 2 dkdpppdhffgeeffedeeepdkcgdfcddecbddccc
+F-H0-10616 6 qddppppeocdc
+F-H0-10617 3 dpqopdfdcd
+F-H0-10618 2 lqnpqpcedp
+F-H0-10619 2 cppnpqecpd
+F-H0-10620 9 jppqmppodppkdcpd
+F-H0-10621 2 eqeppqpocpdcpd
+F-H0-10622 8 rppqqpppmprodpqopopnooplqnpddd
+F-H0-10623 5 cqipfqdpppencndndmddpd
+F-H0-10624 2 cpipfqdpppencndndmddpd
+F-H0-10625 8 noqpoplpdpoopmddpd
+F-H0-10626 6 drkqpqhqfqdqcqdpcpdoqoddpd
+F-H0-10627 8 cnfqeqppdqgpcpepdcpd
+F-H0-10628 6 qcqppidppdqfddofncrd
+F-H0-10629 6 fqppdqfodldodcpd
+F-H0-10630 2 gqppdqfodldodcpd
+F-H0-10631 2 dbppdpdfqdddfc
+F-H0-10632 2 ckppdqfdcfddpd
+F-H0-10633 2 jddppppfcdpdnc
+F-H0-10634 3 cndpdepopd
+F-H0-10635 2 icepppddod
+F-H0-10636 4 qpqqpqdpqdpndd
+F-H0-10637 3 qbpfqpdddpqcpc
+F-H0-10638 7 qpqqpqdpnqpopddd
+F-H0-10639 2 cbppdpdefcpddccc
+F-H0-10640 3 fcfqppcppjddpd
+F-H0-10641 3 qjppdpqddjncdd
+F-H0-10642 2 jdfqppcppjddpd
+F-H0-10643 5 beppdqpddfedcddcbccc
+F-H0-10644 7 qooqqppodppddc
+F-H0-10645 4 jpdpppddpincpekcpc
+F-H0-10646 4 fcnqpqkqpodppkddpd
+F-H0-10647 6 cgdhqpegdpefdgdfcfeedepdcejdcdddccdc
+F-H0-10648 2 cbpppddpjdecdddccc
+F-H0-10649 4 cppqeqqoddpd
+F-H0-10650 2 cipdppcdcoec
+F-H0-10651 2 qjpqeqqoddpd
+F-H0-10652 3 copqdqdnddpd
+F-H0-10653 2 popqdqdnddpd
+F-H0-10654 2 clpqdqdnddpd
+F-H0-10655 3 djppdppjcdpdfc
+F-H0-10656 3 lqnqpppdcocd
+F-H0-10657 2 fcpqeqcfddpd
+F-H0-10658 2 djpqeqcfddpd
+F-H0-10659 6 ohqippqhdpphpjchpiegqfdeofpdcfndbfjdcdddccdc
+F-H0-10660 9 qppqqqlqnqpppddpddqfncrd
+F-H0-10661 8 nopqcpplqoddpd
+F-H0-10662 2 hdqqrpnqqnppqkdppdedcd
+F-H0-10663 2 eqeppppdcpddqiqcqfncrd
+F-H0-10664 2 qmdppqpopdcficddfcccdb
+F-H0-10665 2 fqdppqdiqkdcpd
+F-H0-10666 2 jpdppqdiqkdcpd
+F-H0-10667 2 jpopmqdpfqnoqpddpc
+F-H0-10668 2 pcdppqneqdodmcddfc
+F-H0-10669 2 medppqneqdodmcddfc
+F-H0-10670 3 cqdrdpfqcnopddpd
+F-H0-10671 2 ncdrdpfqcnopddpd
+F-H0-10672 2 fqdppdpoddqfncrd
+F-H0-10673 2 noqrorprpqqqnqqppproqoooqnrnqmjj
+F-H0-10674 2 nfjjqfoererdqdrcpdqcocpcncobmcnb
+F-H0-10675 3 bpbrbqdqppcqdpcncppdcldd
+F-H0-10676 4 oopqdpplqopd
+F-H0-10677 8 crfrgqfqeqcqdqppfpepcpdpdcpd
+F-H0-10678 3 jpppnqqndqdfdcpd
+F-H0-10679 7 odqepepdpcnd
+F-H0-10680 9 jpeqpqdqfqcpfpcnepddpd
+F-H0-10681 4 gcppdqgedhdedcpd
+F-H0-10682 5 qferdrhqcreqqqdqnqrpkqdpfqdocqqnppqkcpddcnncpd
+F-H0-10683 2 lcerdrhqcreqqqdqnqrpkqdpfqdocqqnppqkcpddcnncpd
+F-H0-10684 4 oeqepeqdodpdpcnd
+F-H0-10685 4 ocqepeqdodpdpcnd
+F-H0-10686 7 qdpdpc
+F-H0-10687 6 ddppdpdfcecfbededcpd
+F-H0-10688 2 qoqdddnc
+F-H0-10689 2 ppqdddnc
+F-H0-10690 3 bpbrbqdqppcqhpepcppddndd
+F-H0-10691 7 peqepcnd
+F-H0-10692 6 mppqdpplpopcdc
+F-H0-10693 7 mppppqopoqnpnqqoqppddpcd
+F-H0-10694 9 fcpdqpcdedec
+F-H0-10695 7 rndpkqrofqcnqpqmpnqjqgddpd
+F-H0-10696 5 ncpqdpqkccpd
+F-H0-10697 2 djiqddppqccp
+F-H0-10698 3 ncfqdpopcnjpddpd
+F-H0-10699 3 qqfqdpopcnjpddpd
+F-H0-10700 2 qpfqdpopcnjpddpd
+F-H0-10701 6 cnpqhpepcpdpeofoendmddpd
+F-H0-10702 3 deppdpdgeffeeeedhdddcdpc
+F-H0-10703 3 ncdpppcfdepdddcdhcfcecccdcdbebcb
+F-H0-10704 3 qfdpppcfdepdddcdhcfcecccdcdbebcb
+F-H0-10705 9 pqqqlqnqpppddpddqfncrd
+F-H0-10706 3 egdfppdedpcedgpdefddcf
+F-H0-10707 3 qgpfppqedppepgpdqfddof
+F-H0-10708 4 popqdpqddcjc
+F-H0-10709 4 fqdpppckcicdcfdcpd
+F-H0-10710 2 fokqiqdqfqpppdcpdd
+F-H0-10711 6 cofqdqcqppcpdpcndnpddkdd
+F-H0-10712 2 epfqipdqfpcqdpppcpcnddpd
+F-H0-10713 5 qfpdqqcdcqic
+F-H0-10714 6 cdpqdqcfcededcpd
+F-H0-10715 4 dqfpeqeppppdcpdd
+F-H0-10716 3 ddppdpdfcededcpd
+F-H0-10717 2 cfppdpdfcededcpd
+F-H0-10718 3 ncqnmqpjpppdcpdd
+F-H0-10719 3 moqrqqorqppqdpmppoplnopddd
+F-H0-10720 2 jqbqdqppcqhpepcpenbopddmdd
+F-H0-10721 6 deppdfdpcedgpdefddcf
+F-H0-10722 9 onpqmpoodpplpopd
+F-H0-10723 3 prppnqqndpdcpd
+F-H0-10724 3 djqpdpddcffcpd
+F-H0-10725 3 qodppqpoqddcnc
+F-H0-10726 2 pldppqpoqddcnc
+F-H0-10727 2 qmdppqpoqddcnc
+F-H0-10728 2 hdppjqdpqdedcd
+F-H0-10729 2 ecppjqdpqdedcd
+F-H0-10730 4 odppqhdpqdqfpdqcjdpcdd
+F-H0-10731 5 qhdpppqfdedcpd
+F-H0-10732 3 podppqdcqc
+F-H0-10733 2 edpdcqcdqp
+F-H0-10734 2 jdmppqjpopdpqkddpd
+F-H0-10735 2 oidpppmdqijdodddpc
+F-H0-10736 4 npnqppdppjqnpddcjd
+F-H0-10737 3 pnnqppdppjqnpddcjd
+F-H0-10738 3 qnpqeqfqdqjpcpfpcnepddpd
+F-H0-10739 3 pdpeqepcnd
+F-H0-10740 7 dmippqdpfqdncnddpd
+F-H0-10741 5 fohpfqdpqpddpd
+F-H0-10742 2 cqhpfqdpqpddpd
+F-H0-10743 4 rprrrqqqmqpqqpopdppdqmdd
+F-H0-10744 3 jcppdpdecgpdgccddccccbbb
+F-H0-10745 5 pnfqopcqdpqpeocnddpd
+F-H0-10746 2 dqfqopcqdpqpeocnddpd
+F-H0-10747 4 pmrppqdpfqqnipcnpoqmpnddpd
+F-H0-10748 2 pkrppqdpfqqnipcnpoqmpnddpd
+F-H0-10749 6 brdreqcrcqdqbqcpppcodpcndodmdnclcmddpd
+F-H0-10750 3 bmdreqcrcqdqbqcpppcodpcndodmdnclcmddpd
+F-H0-10751 7 qldpkqcnfqpkqpqjqkdcpd
+F-H0-10752 4 chpppdipjdcpddcf
+F-H0-10753 2 dnpqdpfqdjpkddpd
+F-H0-10754 3 cnnqppjppndpqddfkcddfc
+F-H0-10755 2 pjdpkqdnfqjdqpddpfncpd
+F-H0-10756 3 oddqppcoddqd
+F-H0-10757 3 ocdqppcoddqd
+F-H0-10758 2 iqdqppcoddqd
+F-H0-10759 4 cfppdppdqjdd
+F-H0-10760 3 jcppdppdqjdd
+F-H0-10761 3 pqdpqdqocd
+F-H0-10762 2 cocnppcfdpqddjdc
+F-H0-10763 8 edqpdidppdcfdddccdcc
+F-H0-10764 2 cdpqdpcedgqddekddchc
+F-H0-10765 4 nqppeqcjecpd
+F-H0-10766 2 qjppeqcjecpd
+F-H0-10767 4 rcppdppjqcnepcqdncpddcod
+F-H0-10768 8 qfoqdpqppeqgpdqeddqdqcpc
+F-H0-10769 7 dndqeqcpqpcodpcndoddpd
+F-H0-10770 6 dfqqdpcecfcddedcpd
+F-H0-10771 2 dgqqdpcecfcddedcpd
+F-H0-10772 6 cdpqdpcfdcqd
+F-H0-10773 2 chpqdpcfdcqd
+F-H0-10774 9 prpqqqlqnqppqpdppdpoddqfncrd
+F-H0-10775 7 fqeqppcpeppd
+F-H0-10776 6 gddppqidcffdqdddfc
+F-H0-10777 2 peppdpjdjjpcdd
+F-H0-10778 4 dngpdpooddpd
+F-H0-10779 9 cddpppcfcedepdfddc
+F-H0-10780 4 dppqpnqoddpd
+F-H0-10781 3 fcpdppcdfdec
+F-H0-10782 8 ripiqppddpddqfqcofncrd
+F-H0-10783 6 eddhppeedpqddedcfd
+F-H0-10784 3 qiqnnqonpppddpdd
+F-H0-10785 2 ncqnnqonpppddpdd
+F-H0-10786 9 orprpqqqlqnqppqpdppdpoddqfncrd
+F-H0-10787 5 kpnqlqlpppdppjdcpd
+F-H0-10788 8 cbppdpdepdddcdhcfcdcccebdb
+F-H0-10789 6 pcqhppqgdppfpgpdqfjdncdd
+F-H0-10790 3 qqmqnqlqmpppdpnpqnpjddpd
+F-H0-10791 5 cqdpdrcnfqqjppddpd
+F-H0-10792 3 cfjqpppddpddqfncrd
+F-H0-10793 8 dcdqppdfpdcdedbccc
+F-H0-10794 9 qdpppicppdqfddqc
+F-H0-10795 2 qfjpdppoddpd
+F-H0-10796 2 pjdjpppddped
+F-H0-10797 3 dedpppcgpdeccd
+F-H0-10798 3 dogqdqpppdcodd
+F-H0-10799 3 cnnqppdpckcedgcdcffcdedcpd
+F-H0-10800 3 qnnqppdpckcedgcdcffcdedcpd
+F-H0-10801 2 lqnqppdpckcedgcdcffcdedcpd
+F-H0-10802 9 dcdqpdqpcdedecfc
+F-H0-10803 9 oqqrorprpqqqlqnqppqpdppdpoddqfncrd
+F-H0-10804 9 dphppqcpepeofoendmddpd
+F-H0-10805 7 eoqpdqgpdldoddpd
+F-H0-10806 2 dpqpdqgpdldoddpd
+F-H0-10807 7 dberdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcncfpdddfc
+F-H0-10808 2 jderdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcncfpdddfc
+F-H0-10809 4 fpdqqpopdoddpd
+F-H0-10810 2 oqdqqpopdoddpd
+F-H0-10811 2 oepeodpd
+F-H0-10812 2 ocpeodpd
+F-H0-10813 2 pcpeodpd
+F-H0-10814 8 bqdreqdqcqcpqpcodpcndodmdnddpd
+F-H0-10815 8 jpiqpqhqfqhpipdphodnfoddpd
+F-H0-10816 2 qodppqpnqddcoc
+F-H0-10817 2 dkppdqdncdpcec
+F-H0-10818 4 reqfqhrdqdqcpdpcod
+F-H0-10819 8 cmdqcqppcpjpdodpcoeocnendmdnpdemcddl
+F-H0-10820 7 ecdppppddecdddfchcccdcdbebcb
+F-H0-10821 6 dfdpppcecfpddecdfddc
+F-H0-10822 2 mdppdpqdpfddodpcncoc
+F-H0-10823 4 dnpqjpfqdpcndcpd
+F-H0-10824 3 fppqjpfqdpcndcpd
+F-H0-10825 2 eofqqpcndppddjcd
+F-H0-10826 7 dnpqdpfqcipcdc
+F-H0-10827 2 npnqppdqqidcpc
+F-H0-10828 9 nomppqdpoopoplonpd
+F-H0-10829 7 fdpddqcdqpeceddcfc
+F-H0-10830 5 dnpqcqfpddpd
+F-H0-10831 2 copqcqfpddpd
+F-H0-10832 7 npdqjqcoppqnddpd
+F-H0-10833 4 epcppqdcpc
+F-H0-10834 3 qopqqdcpcd
+F-H0-10835 2 ircqdripfqdpppcnfodcpd
+F-H0-10836 3 qgdpppqiqddcoc
+F-H0-10837 3 cedpppqiqddcoc
+F-H0-10838 2 dedpppqiqddcoc
+F-H0-10839 5 fdpddqcdedecfcdc
+F-H0-10840 3 ddeqqd
+F-H0-10841 2 dceqqd
+F-H0-10842 2 cdeqqd
+F-H0-10843 2 pidppqponqqnqppnqoqfpd
+F-H0-10844 2 cnnqpqfqoqopqpnpdppdqn
+F-H0-10845 2 pjdppqponqqnqppnqoqfpd
+F-H0-10846 2 pkdppqponqqnqppnqoqfpd
+F-H0-10847 5 opdqdoqpddpd
+F-H0-10848 6 bcppdqpddfedcdcc
+F-H0-10849 5 dhqpegdpefdgdfcfeedepdcejdcdddccdc
+F-H0-10850 9 poqqpqnqlqqppppddpddqfncrd
+F-H0-10851 2 pjppjjpddjdd
+F-H0-10852 7 rbdppppephnepcqdncddqbqc
+F-H0-10853 4 qcdpppqfpdrdnc
+F-H0-10854 2 qgdpppqfpdrdnc
+F-H0-10855 4 eqipfqfpqpdpgpfocndcpd
+F-H0-10856 4 cqipfqfpqpdpgpfocndcpd
+F-H0-10857 7 pqqqppnqkpdpddpd
+F-H0-10858 2 fcppjpdpjjpjdjpdjddd
+F-H0-10859 3 hohqpqipfqdphpddpd
+F-H0-10860 2 eqbqbrppdqdpcqcpcnbppdcldd
+F-H0-10861 6 ncqdpfocod
+F-H0-10862 2 cdcededcfd
+F-H0-10863 9 enfqipppdpcndndmddpd
+F-H0-10864 4 oooqppnqnpopnompmodppjdcpd
+F-H0-10865 5 jdeqppcfpdddfc
+F-H0-10866 5 dfdpppdecfdcpd
+F-H0-10867 4 bddpppdecfdcpd
+F-H0-10868 5 ddjjppdjpd
+F-H0-10869 3 jpjjppjddp
+F-H0-10870 8 dbppdpdepdddcdhcfcdccc
+F-H0-10871 6 qedpoqpeqppdqgddqdqcpc
+F-H0-10872 4 ccpqdpcfddpdfcbd
+F-H0-10873 2 popqdpcfddpdfcbd
+F-H0-10874 5 popqdpcicdcfdcpd
+F-H0-10875 3 ckpqdpcicdcfdcpd
+F-H0-10876 2 qnppdidppdbijdeffdcfddbdcc
+F-H0-10877 8 cfppdpdepdddcdhcfcecccdcdbebcb
+F-H0-10878 4 nedppppdnclcdc
+F-H0-10879 2 cqhqpqdpfqpddd
+F-H0-10880 2 qldppqqofqcnjpddpd
+F-H0-10881 2 qmdppqqofqcnjpddpd
+F-H0-10882 2 pmdppqqofqcnjpddpd
+F-H0-10883 2 pldppqqofqcnjpddpd
+F-H0-10884 7 eopqhpepcpdmdcpd
+F-H0-10885 6 nbdpppnepjkdpfncpdkcocdclc
+F-H0-10886 4 edpqnqoqopqpnpqnjppddpcd
+F-H0-10887 2 fcpqnqoqopqpnpqnjppddpcd
+F-H0-10888 7 qmnpppqndppmpnqdqldd
+F-H0-10889 3 fphqpqgqfqiphpdphoddpd
+F-H0-10890 3 jcdpppdjfdcfddpd
+F-H0-10891 2 cndppppddfjdddfc
+F-H0-10892 4 dhpqcqcedcqd
+F-H0-10893 2 ocpqcqcedcqd
+F-H0-10894 3 dhoqdqqpqjdedcpd
+F-H0-10895 2 mqopqpcecppdjcdc
+F-H0-10896 6 pppqqqmqopqpdppd
+F-H0-10897 8 dqfqhqcqdpqpdcpd
+F-H0-10898 6 bpbrereqdrcqcrbqdqqpcpdpcodocndnbncmdmbmclblddpd
+F-H0-10899 8 erdrhqfqdqcqdpqpdocpdcpd
+F-H0-10900 7 qldppppkqjpjqipiqhohphqfpdofndcfjdddfc
+F-H0-10901 5 cnfqdpppqjcjcedfcdcffcdedcpd
+F-H0-10902 4 pfppoddpdcqd
+F-H0-10903 2 cnppoddpdcqd
+F-H0-10904 6 qqdrercrhqpqeqmqdqfqdpcqpocpdocnddpd
+F-H0-10905 7 docqnqppdqcpjpqndpcnclddpd
+F-H0-10906 3 qfqqrqpqqpkqcpopropdpndd
+F-H0-10907 4 onpqdpfqpnooddpd
+F-H0-10908 3 hqpqdpfqpnooddpd
+F-H0-10909 2 dfqppddpiddhcd
+F-H0-10910 2 djqppddpiddhcd
+F-H0-10911 2 ipqqprrppqppnqmpfqdpooponoonmonnplddpd
+F-H0-10912 2 cnqqprrppqppnqmpfqdpooponoonmonnplddpd
+F-H0-10913 5 nqqnppjjdppddd
+F-H0-10914 4 qldppqpnqdcfkcddfc
+F-H0-10915 2 oodppqpnqdcfkcddfc
+F-H0-10916 2 ocfqcnppcidpqdnddc
+F-H0-10917 3 pnjqfqopqppdcpdd
+F-H0-10918 2 mpjqfqopqppdcpdd
+F-H0-10919 6 qnopqponmppdcpdd
+F-H0-10920 2 gcppdqfedgdedcpd
+F-H0-10921 4 podppqqnjpddpd
+F-H0-10922 6 mppqcpeppoplddpd
+F-H0-10923 3 pcdppqndqdqcdc
+F-H0-10924 2 qbdpqppfcdqcpc
+F-H0-10925 8 crerdrjqpqdqfqdpcqdocpddpd
+F-H0-10926 8 dedppqcdpdccdd
+F-H0-10927 5 pndpkqcnfqqmqpqjqhddpd
+F-H0-10928 2 pkdpkqcnfqqmqpqjqhddpd
+F-H0-10929 8 onopqpdplpnooopmddpd
+F-H0-10930 3 pooqdpfqdnjpddpd
+F-H0-10931 2 eccnppdjfpcedppd
+F-H0-10932 2 ncoqdpfqdnjpddpd
+F-H0-10933 3 qqorprnroqnqqpnpopoodponnopdmodd
+F-H0-10934 2 fcppdpdfegcfefbfdefeceeebdbedcpd
+F-H0-10935 8 ohqjppqidpqhpkphpjpdpindqfjdofdd
+F-H0-10936 3 jdjqpqdpqkdcpd
+F-H0-10937 2 dejqpqdpqkdcpd
+F-H0-10938 5 ldpppidppdqfndofddmf
+F-H0-10939 4 dddpppdhdffdcedcpdcbcc
+F-H0-10940 4 nomppqdpkppoooonqkddpd
+F-H0-10941 3 opmppqdpkppoooonqkddpd
+F-H0-10942 3 hqfqdpppdcqd
+F-H0-10943 2 dnfqdpppdcqd
+F-H0-10944 8 drdqfqipcqdpqpdocpdcpd
+F-H0-10945 3 nedpppqnpephddpc
+F-H0-10946 8 rerdqdqcpdpcocobncnbmc
+F-H0-10947 6 qbppcedpqdpdpcqclcncdc
+F-H0-10948 2 poqqpqppqpdpqlqnqdddoc
+F-H0-10949 6 oedpppodpjddpdncnd
+F-H0-10950 3 cmppcnjpdmdppddndcem
+F-H0-10951 2 peogpqpfdppdpgjdqfdd
+F-H0-10952 4 opdrercrhqfqeqcqdqqpdpcpdocndcpd
+F-H0-10953 2 oqdrercrhqfqeqcqdqqpdpcpdocndcpd
+F-H0-10954 5 cnerdrkqcrhqpqeqfqdqcqdpcpdoqoddpd
+F-H0-10955 3 eccnfqdjppcedppd
+F-H0-10956 2 qjoqdpfqcnjpddpd
+F-H0-10957 2 ncoqdpfqcnjpddpd
+F-H0-10958 2 qqppnqoodppjddoencpd
+F-H0-10959 3 dbppdppjcfdecepdcddddcec
+F-H0-10960 5 pkppdpqjpjqipiqhohphqfpdofndcfjdddfc
+F-H0-10961 4 griqfrgqhqfqeqppdpipcnfoddpd
+F-H0-10962 5 oonppqpoplddpd
+F-H0-10963 2 cedpoqqmqpqjqgdcpd
+F-H0-10964 4 ocpqdpcfdeqdidcdddfcecccdcdbebcb
+F-H0-10965 2 opdrercreqfqdqcqipqpdpcpdocnddpc
+F-H0-10966 2 fdpqdpcfdeqdidcdddfcecccdcdbebcb
+F-H0-10967 4 lcdpdrcnpqddfqncpd
+F-H0-10968 5 qnqrpqqqoqpprpopqpqonppndppdrodd
+F-H0-10969 3 dfppeppdedcd
+F-H0-10970 3 nqppepcpedpd
+F-H0-10971 6 mbdpppnepjkdpfncpdmcockclcdcnb
+F-H0-10972 4 popqdqjpdcpd
+F-H0-10973 3 ndnrlqqqqppqppnqopdpnpddpjncpd
+F-H0-10974 3 lcnrlqqqqppqppnqopdpnpddpjncpd
+F-H0-10975 3 doppcpepeofodcpd
+F-H0-10976 3 fododqenqppdeodd
+F-H0-10977 5 ncppdpqfdjcedfcdcffcdedcpd
+F-H0-10978 6 pppqmpoodpnopoplonddpd
+F-H0-10979 7 dappdpdedhpdfceddcecebfbcbdb
+F-H0-10980 5 lpnqlqkpkqjpppdppnnopjdcpd
+F-H0-10981 3 jqnqlqkpkqjpppdppnnopjdcpd
+F-H0-10982 5 oopqdpqmqodcpd
+F-H0-10983 5 ceepqdpodc
+F-H0-10984 4 qpqopppojpqndppdooddpn
+F-H0-10985 3 nooqppnqnpopoodppjddpd
+F-H0-10986 5 qpcqiripdrdppqpofqqnqodnfoddpd
+F-H0-10987 7 qqpqoqqpppqodpqnpopmpnqdddoc
+F-H0-10988 5 dfpqdpcfjdpdddfc
+F-H0-10989 2 eepqdpcfjdpdddfc
+F-H0-10990 6 lcdpppdepjncpd
+F-H0-10991 8 dofqdqcqipqpdpcpdcpd
+F-H0-10992 5 qjnqdpppddpd
+F-H0-10993 2 ncnqdpppddpd
+F-H0-10994 7 qdpqpidppfpgofqfpdqeddnc
+F-H0-10995 3 npnqppdqpjqnpddd
+F-H0-10996 2 eopqdpfqdjcnddpd
+F-H0-10997 3 mooqpqnqppjqnpmpnodppjddpd
+F-H0-10998 2 mdpppfdpofqjqdpgpdqfjdqedd
+F-H0-10999 4 ifppdpfedfpdidkdddfc
+F-H0-11000 2 ecppdpfedfpdidkdddfc
+F-H0-11001 5 neppoedpqdpfpdpeldodddoc
+F-H0-11002 4 pmfqopqpdplpdcpd
+F-H0-11003 6 epcpppqjpddc
+F-H0-11004 4 qgpopqofcpddqdocld
+F-H0-11005 2 oepopqofcpddqdocld
+F-H0-11006 6 gcdpppdhdefcpddcedebeccbfbda
+F-H0-11007 7 pnircqdrippqdpfqpoqpqnqodnfoddpd
+F-H0-11008 5 qqpqdpnqpopmnopd
+F-H0-11009 3 elppepgpencpddcn
+F-H0-11010 7 dqfqipeqfpppdpgpfocnddpd
+F-H0-11011 8 ecpqdpqddecdidfcddccdcdbebcb
+F-H0-11012 5 pnnqppdqqdddoc
+F-H0-11013 5 jpeqfqdqfpppepcpqdcndc
+F-H0-11014 2 jccfdqpdqpcdfdeceddcfc
+F-H0-11015 7 eqdrercrhqfqdqcqdpppdocpedpd
+F-H0-11016 5 noppnqkpdpqdddoc
+F-H0-11017 3 qnppnqkpdpqdddoc
+F-H0-11018 6 eqgqcqdqppcpdpcodocmenddpd
+F-H0-11019 2 cfdpppcgefcedecdpdgcdddccc
+F-H0-11020 4 iqhqfqeqppdpipcnfoddpd
+F-H0-11021 5 cfdrcqiqppfqdppddndd
+F-H0-11022 7 onpqdpfqqnjppnqodnpoddpd
+F-H0-11023 4 fobqbrppdqhpcqcpepbppddndd
+F-H0-11024 4 ocqqdpddqd
+F-H0-11025 2 nqppcpccpd
+F-H0-11026 6 oodppqqnfqpnjponqodnpoddpd
+F-H0-11027 3 qfprqqnqppkqpndpddpd
+F-H0-11028 3 fqdpppcifdcfddpdccbd
+F-H0-11029 3 pfdppqqnfqcnqpqkjpddqincpd
+F-H0-11030 2 qfdppqqnfqcnqpqkjpddqincpd
+F-H0-11031 8 cddppqidqdddfcdccc
+F-H0-11032 2 plpopqqdcpdc
+F-H0-11033 2 gqpqcpepdcqd
+F-H0-11034 7 oonppqdpplpopd
+F-H0-11035 8 cnerdreqcrdqfqipcqdpqpdocpdcpd
+F-H0-11036 2 cpeqopddpd
+F-H0-11037 2 peppdpoced
+F-H0-11038 4 jpqpoqlpdpqmonddpd
+F-H0-11039 2 ipqpoqlpdpqmonddpd
+F-H0-11040 3 pldppqpofqcnipdcpd
+F-H0-11041 2 pmdppqpofqcnipdcpd
+F-H0-11042 2 oodppqpofqcnipdcpd
+F-H0-11043 6 prpqqqppnqkpqppodpddpd
+F-H0-11044 7 ecppeqpddecdddfchcccdcdbebcb
+F-H0-11045 6 gddhqppddpdcde
+F-H0-11046 4 qjqpqidpqhpjpdpindqfcdof
+F-H0-11047 3 phqpqidpqhpjpdpindqfcdof
+F-H0-11048 4 nnlqjqloppqnnp
+F-H0-11049 4 kqpqhqfqdpqoddpd
+F-H0-11050 4 qnhrgriqfrgqhqfqeqppdpipcnfoddpd
+F-H0-11051 2 odpiqpqhdpqgphrdohpdqfjdpfdd
+F-H0-11052 2 nbppdppjlepdndkdldmcnclcdcpb
+F-H0-11053 4 fcfqdpppcmdfcecfcddedcpd
+F-H0-11054 2 cjfqdpppcmdfcecfcddedcpd
+F-H0-11055 6 endqdoqppdeocd
+F-H0-11056 2 cqcppqeoepdcpd
+F-H0-11057 5 bidipppecpfdefddcfccbd
+F-H0-11058 3 cpodpqecqd
+F-H0-11059 2 ocodpqecqd
+F-H0-11060 3 qnppdpdedhpdfceddcgcebeccbfbda
+F-H0-11061 3 qfepbqdoppcohpbncpcmappdboddcn
+F-H0-11062 7 qkpqdpfqqnqpdnjpddpd
+F-H0-11063 2 coeqppqjpddd
+F-H0-11064 2 ncoqdpcjddpd
+F-H0-11065 8 cdpqdpfddedcpdcbcc
+F-H0-11066 6 bnbrereqdrcqcrbqdqqpcpdpcodocndndmcmclbmddpd
+F-H0-11067 7 cdeqppddpdhcfcdccc
+F-H0-11068 3 qjppdqjjcdpd
+F-H0-11069 2 qfjjdqpdqpdd
+F-H0-11070 7 fcdppqdgcecfcddedcpd
+F-H0-11071 5 qqpqdpnppopkddpd
+F-H0-11072 3 nopqdpnppopkddpd
+F-H0-11073 2 prppnqqnpd
+F-H0-11074 2 pdepppddjj
+F-H0-11075 3 ceqqdpdedcqc
+F-H0-11076 2 mcqqqdcqddod
+F-H0-11077 3 popqdpqedcpc
+F-H0-11078 3 nqppdpddoc
+F-H0-11079 2 nqppeqddpd
+F-H0-11080 2 cfppeqddpd
+F-H0-11081 2 opcppqqoeqdcpd
+F-H0-11082 2 plcppqqoeqdcpd
+F-H0-11083 2 pmcppqqoeqdcpd
+F-H0-11084 5 ckdqppcedgcdcffcdedcpd
+F-H0-11085 2 dodqppcedgcdcffcdedcpd
+F-H0-11086 2 fcdpqocfddpd
+F-H0-11087 2 jpnqppdpecpd
+F-H0-11088 6 cqdrhppqdpfqdnfoddpd
+F-H0-11089 8 cpdqfqipcqdpqpdcpd
+F-H0-11090 4 nqcqiripdrdppqpofqqnqppnqodnfoddpd
+F-H0-11091 8 qrrqqqpqppqppodprnqoqnpnpdqmddqf
+F-H0-11092 2 nqqsorrrpqprqprqppqqpddpddpn
+F-H0-11093 2 bdpqdppddjgdgeedfegceefchdecfddcddcccd
+F-H0-11094 2 diqpdhdpegdgefcgdfcfeedepdcejdcdddccdc
+F-H0-11095 5 dqfqeqppcpeppd
+F-H0-11096 7 nprqlqqqqppqppnqopdppjdcpd
+F-H0-11097 2 endoppcnjpdmdpdednpdem
+F-H0-11098 7 dcpqdppdcdedecfc
+F-H0-11099 6 jdjpppdppddffcdd
+F-H0-11100 8 ebpqdpqddecdidfcddccdcdb
+F-H0-11101 4 orerqrqqdrhqcreqpqdqmqqpfqdpcqpocpdocnddpd
+F-H0-11102 3 hdppdpgfcheffdcfddpdccbd
+F-H0-11103 4 efeqppcgdedcpd
+F-H0-11104 3 qqmqopqppdcodd
+F-H0-11105 2 pjppjpdpjjpddd
+F-H0-11106 3 ncdpnqqjqpqfqlofqhddpd
+F-H0-11107 3 nddpnqqjqpqfqlofqhddpd
+F-H0-11108 5 fqcnppcedppdjcdc
+F-H0-11109 5 jpdpoqdnfqdjpddd
+F-H0-11110 2 kdppdppjncpfecpd
+F-H0-11111 4 popqocdpdcqd
+F-H0-11112 2 qopqocdpdcqd
+F-H0-11113 4 qfppeqcfdepdddcdhcfcecccdcdbebcb
+F-H0-11114 2 ncdrercrhqfqeqcqdqppdpcpdocnecpd
+F-H0-11115 4 pqdrqqiqcqfqdpqpqnppdnqlddpd
+F-H0-11116 2 ccdpppdhgegcdedcpd
+F-H0-11117 2 dkppephpemcppdcmdd
+F-H0-11118 7 cbppdpdedhpdfceddcecebdb
+F-H0-11119 3 fmjpfqdpppdnfodcpd
+F-H0-11120 4 cldjpppddpndqfjdrddd
+F-H0-11121 2 qqppprpnnqpjdppdddjd
+F-H0-11122 2 qjpqqocpddpeocqd
+F-H0-11123 2 mppqqocpddpeocqd
+F-H0-11124 4 gqnqpqiqoqopqpmpdppdqnddqf
+F-H0-11125 2 ncnqpqiqoqopqpmpdppdqnddqf
+F-H0-11126 7 dqfqhqcqdpppedpd
+F-H0-11127 8 qqpqppoqopnqnpqpqomppddpcd
+F-H0-11128 3 jpdpppkdpjncpfdcpd
+F-H0-11129 2 fqdpppkdpjncpfdcpd
+F-H0-11130 4 pcpppedpqdmdddoc
+F-H0-11131 7 drhqfqdqcqdpppdocpedpd
+F-H0-11132 2 iepdqfndlcic
+F-H0-11133 2 ocpdqfndlcic
+F-H0-11134 3 qnppfqepdqdpcqcpbqcobpbocndnpddjcd
+F-H0-11135 2 mqerdreqcrdqpqjpfqfpcqdpcpdocnddpd
+F-H0-11136 4 ccpqdpcfddbdfcpc
+F-H0-11137 5 cqdrpqjqlqfqdppdqoddcn
+F-H0-11138 2 qhdpoqqjqpqfqlrdpdddnc
+F-H0-11139 6 ddppdhdpeedeqdfddced
+F-H0-11140 2 pnnpqpdpcdpd
+F-H0-11141 2 qodppqpndcpd
+F-H0-11142 4 fqdpjpjj
+F-H0-11143 2 pkdppqdgcedeqdcdkddchc
+F-H0-11144 3 ddfqdppe
+F-H0-11145 2 cnfqdppe
+F-H0-11146 5 ccppdicppeeffdcfddbd
+F-H0-11147 3 fcdoppkjpddd
+F-H0-11148 8 ppoppqnpoodpplpopddc
+F-H0-11149 2 dldodqceqppd
+F-H0-11150 2 cmdodqceqppd
+F-H0-11151 2 pprrqrrqpqqqqpdppdpndd
+F-H0-11152 3 dmdqepcqdpbopd
+F-H0-11153 2 dpcdppccdeebdd
+F-H0-11154 8 qopqrpfqppopdpjpoopoqnonpnnncnpmomplddpd
+F-H0-11155 7 podppqqnfqdnipddpd
+F-H0-11156 6 ocqdppdddppcod
+F-H0-11157 6 oedpoqpephmdpcdd
+F-H0-11158 2 ppopqppmlppdcodd
+F-H0-11159 8 qfrdrercqdqcpdpcocobncnbmc
+F-H0-11160 2 pqopqopd
+F-H0-11161 2 ooopqopd
+F-H0-11162 7 qjdppppjqipiqhohphqfpdofndcfjdddfc
+F-H0-11163 4 qldppqcnfqqjjpddpd
+F-H0-11164 2 mqjqpppdcpdddjfccf
+F-H0-11165 6 qpdppqpoqoqnqdddnc
+F-H0-11166 3 ocdppqoddedcqd
+F-H0-11167 2 dodqpppdeccd
+F-H0-11168 2 pfpqdpqdocdd
+F-H0-11169 2 eqpqqocpddpd
+F-H0-11170 2 djdppjddjj
+F-H0-11171 7 ipfrdrjqfqhqeqgqppdphpcngpddpd
+F-H0-11172 5 dhoqdpcedcpd
+F-H0-11173 5 pippqnnpondppkqlpjqkpdqjdd
+F-H0-11174 4 qjkqdqqpddpd
+F-H0-11175 6 onopqpdplpnooopmdcpd
+F-H0-11176 7 crerdrhqfqdqcqdpppdocpedpd
+F-H0-11177 8 pfdppqneqkddpdnclc
+F-H0-11178 6 cqdqqpfpdoddpd
+F-H0-11179 6 qmdppqqofqdnjpddpd
+F-H0-11180 2 geppdppddfgdfdfcddcchcfbgcebecdb
+F-H0-11181 3 cekqpqdpqodcpd
+F-H0-11182 2 cnkqpqdpqodcpd
+F-H0-11183 2 fqkqpqdpqodcpd
+F-H0-11184 3 cnnqpqopoqnpqpdppdpndd
+F-H0-11185 2 fqnqpqopoqnpqpdppdpndd
+F-H0-11186 2 fcdpppdfcecfpddecdfddc
+F-H0-11187 2 nndrcqiqdpfqqnpponqodnpoqmpnpmomddpd
+F-H0-11188 4 fpeqfqdqppcpeppd
+F-H0-11189 2 dmdqdocpcncoddpd
+F-H0-11190 2 cdcppqqopd
+F-H0-11191 2 opcppqqopd
+F-H0-11192 8 pnqqpqppqppodpqnqopdqmddqf
+F-H0-11193 7 dceepppddpjdcfddcccd
+F-H0-11194 6 pcpppfdppdpeddqdocod
+F-H0-11195 6 pmpqdpqppoqoqnqerdqdddoc
+F-H0-11196 4 cbppdpdfdhcefdpddccc
+F-H0-11197 5 jpdppqdipkdcpd
+F-H0-11198 2 fqdppqdipkdcpd
+F-H0-11199 7 pepfpppddpddqdocod
+F-H0-11200 3 oqnpfqdpqpcnpd
+F-H0-11201 2 qlpnpqpddpncqf
+F-H0-11202 6 dpnc
+F-H0-11203 3 qodpppqmqhqjqdddod
+F-H0-11204 3 qlgrhrfriqhqgqeqfqdpppqnipcnfoddpd
+F-H0-11205 2 pngrhrfriqhqgqeqfqdpppqnipcnfoddpd
+F-H0-11206 8 cdoqdpqpqjcfcededcpd
+F-H0-11207 2 opppnqnpmpnmdppjddpd
+F-H0-11208 6 pdpppfdpddqdocod
+F-H0-11209 7 dopqjqfqdqcqdpcpddpd
+F-H0-11210 2 dfpqjqqkdppdddfc
+F-H0-11211 4 qmqqpprpnprodpqnqopmpnpdqldd
+F-H0-11212 2 idpopdcocd
+F-H0-11213 2 monqppmpnppddpcdpjncqf
+F-H0-11214 2 nonqppmpnppddpcdpjncqf
+F-H0-11215 3 pkqnppqddpfdciddcfkcbdcc
+F-H0-11216 2 popqdpfqddqkncpfkcpdpbqc
+F-H0-11217 3 nckqdpfqcnqpecpd
+F-H0-11218 2 qjkqdpfqcnqpecpd
+F-H0-11219 4 norppqppfqdpopqojpooonqnnnpnpmcnplompddd
+F-H0-11220 2 nprppqppfqdpopqojpooonqnnnpnpmcnplompddd
+F-H0-11221 7 poqqpqnqppqpkpdpddpd
+F-H0-11222 7 ebdppqdefdpddccdcbcc
+F-H0-11223 8 rnpqqqqpppdppoqoqnpnpdqmddqf
+F-H0-11224 3 ecpqdpfedjiddfpcddfchc
+F-H0-11225 2 qiqpqhcppdpindqfjdofdd
+F-H0-11226 2 lddqppnepjkdpfncpddclc
+F-H0-11227 3 qjfqdpppcmjpddpd
+F-H0-11228 3 qfppdppdcgjdddfc
+F-H0-11229 2 ncfqdpppcmjpddpd
+F-H0-11230 6 peedpppcdp
+F-H0-11231 6 nbqdppdddppcodoboc
+F-H0-11232 4 jddpopcfpdddfc
+F-H0-11233 2 iddpopcfpdddfc
+F-H0-11234 5 dqfqiqcqdpppdcpd
+F-H0-11235 7 crerdrhqfqdqcqdpqpdocpdcpd
+F-H0-11236 7 bmerbrdreqcrcqdqbqcpqpcodpcndodmdnclcmddpd
+F-H0-11237 7 deppeqpdddcdhcfcdccc
+F-H0-11238 2 fddppqpoqddedc
+F-H0-11239 6 nqoqopcqpdqpcd
+F-H0-11240 2 ddcqpqcededcpd
+F-H0-11241 7 ebppeqpddecdddfchcccdcdb
+F-H0-11242 8 pppqrpfqdpjpoopoqnonpnnncnpmomplddpd
+F-H0-11243 3 dodqpopd
+F-H0-11244 2 dopppedc
+F-H0-11245 2 ccdqpopd
+F-H0-11246 6 npdppqpojpjdpkddpfncpd
+F-H0-11247 8 pppqqqqppodppdqmddqf
+F-H0-11248 2 doedod
+F-H0-11249 2 oqedod
+F-H0-11250 7 cmdreqcrcqdqbqcpqpcodpcndodmdnddpd
+F-H0-11251 5 eqpqdpfqcpgppocoencndndmddpd
+F-H0-11252 3 mqerdrhqcreqfqdqcqopqpdpcpdocnddpc
+F-H0-11253 2 ocdppqdecfodqdddcdhcfcecccdcdbebcb
+F-H0-11254 2 leqfmeldpdocodncndlckd
+F-H0-11255 2 dppqdcpc
+F-H0-11256 3 dfdpoqqjqpcecfcddedcpd
+F-H0-11257 3 mppqnqoqopqpcedppdjcdc
+F-H0-11258 2 fqdpoqqjqpcecfcddedcpd
+F-H0-11259 5 nccnfqdjqppddpddjchc
+F-H0-11260 2 qgfqdpppcnjpqjqldcpd
+F-H0-11261 2 nqopmqmpqpdplpmopd
+F-H0-11262 4 qopqqpoqoppppodppdpndd
+F-H0-11263 4 oepfpppddpddpepcqdocod
+F-H0-11264 4 qkdpkqdnfqqjqpdcpd
+F-H0-11265 2 ecpqdpqdidncddfc
+F-H0-11266 2 fdpqdpqdidncddfc
+F-H0-11267 4 eedppqdedhpddcgd
+F-H0-11268 2 odpqdpqdedcd
+F-H0-11269 2 edpqdpcdpopc
+F-H0-11270 2 pfdqppqdodcd
+F-H0-11271 2 peppdpfedjiddfpcddichcgcecfcgbhbfb
+F-H0-11272 2 jpdpppnepjkdpfncpdmcockclcdcnblbmb
+F-H0-11273 6 cpnqcqdqppjpqndpcnclddpd
+F-H0-11274 7 pdceppqddppcqclcncdc
+F-H0-11275 8 depqdpqdidcdddfcdccc
+F-H0-11276 6 oprppqppfqdpjpoopoqnonpnnncnpmomplddpd
+F-H0-11277 6 nnrppqdpfqoojpqnpopnoncnpmomplddpd
+F-H0-11278 3 ebppdpefcgdegcpddccdcbcc
+F-H0-11279 2 dippdpefcgdegcpddccdcbcc
+F-H0-11280 2 cjppdpefcgdegcpddccdcbcc
+F-H0-11281 8 pppqqqnqdpqppoddpd
+F-H0-11282 4 ncppfqdodqcncpdmcopjcgciddpd
+F-H0-11283 2 chppdpckcmpjcedgcdcffcdedcpd
+F-H0-11284 3 dddppopc
+F-H0-11285 2 pedppopc
+F-H0-11286 3 qplqnqppdpnpqnpjdcpd
+F-H0-11287 3 mplqnqppdpnpqnpjdcpd
+F-H0-11288 3 nqppcpqddcnc
+F-H0-11289 2 qjnqdqqpcdpd
+F-H0-11290 2 qldpfqqnppcnipddpd
+F-H0-11291 8 noqpoplpdpoopmdcpd
+F-H0-11292 4 cnnqdpfqqjqpddpd
+F-H0-11293 2 ipnqdpfqqjqpddpd
+F-H0-11294 8 eqdrercrdqfqipcqdpqpdocpdcpd
+F-H0-11295 3 lqnqppdqpc
+F-H0-11296 2 cpncpqdcpd
+F-H0-11297 3 qicqppdcpc
+F-H0-11298 2 dodqpqccpd
+F-H0-11299 2 qeppdppfpgofqfpddficddfcccdb
+F-H0-11300 7 pjqippqhcpphpipdohndqfjdofdd
+F-H0-11301 3 rcpdqfqcqdnc
+F-H0-11302 2 rdpdqfqcqdnc
+F-H0-11303 7 pjqiqpqhdppdpindqfcdof
+F-H0-11304 2 hcdppqdhcedcqd
+F-H0-11305 7 cnerdrhqcreqfqdqcqdpqpdocpdcpd
+F-H0-11306 7 fqerbrdreqcrcqdqbqcpqpbpdpcodocndnbncmdmbmclblddpd
+F-H0-11307 2 coppfqdpcnendmdnqddkdc
+F-H0-11308 2 ccdppqfecfidqdfdgdddfc
+F-H0-11309 2 dcdppqfecfidqdfdgdddfc
+F-H0-11310 4 pnnqppdppjddpfncpd
+F-H0-11311 3 lcnqppdppnddpjncpd
+F-H0-11312 2 eppppdcped
+F-H0-11313 3 onfqdpppqnjpcnpkddpd
+F-H0-11314 2 pnppnqkppddpddpjncqf
+F-H0-11315 2 qqppnqkppddpddpjncqf
+F-H0-11316 5 goppdqgpfodoeofndlenddpd
+F-H0-11317 4 oqdpqpdcqc
+F-H0-11318 2 nddqqoddqe
+F-H0-11319 5 qidppqqnqpqkqdddnc
+F-H0-11320 4 nqppcnjpdjfppddpddpjncqf
+F-H0-11321 6 qmoqqponlppddpcd
+F-H0-11322 2 fcpqdpfedhcedcpd
+F-H0-11323 3 qodppqpofqonoppmooddpd
+F-H0-11324 3 nndppqpofqonoppmooddpd
+F-H0-11325 4 gqfriqhqfqeqppdpipcnfoddpd
+F-H0-11326 7 nqoqopqpdcpd
+F-H0-11327 3 qfncdpecpd
+F-H0-11328 3 djoqdpooddpd
+F-H0-11329 2 qjoqdpooddpd
+F-H0-11330 2 kfppdppjlelfmdneldmeddpdocndncpc
+F-H0-11331 5 qnppqpoplpdpoonoonpmdcpd
+F-H0-11332 4 ppqddcoc
+F-H0-11333 3 dqqddcoc
+F-H0-11334 8 cfdppqdeqdidcdddfcecccdcdbebcb
+F-H0-11335 2 oopplqnpqnql
+F-H0-11336 2 onpplqnpqnql
+F-H0-11337 4 qqppnqnodqpjdcpd
+F-H0-11338 2 ldppdqpjncnedcpd
+F-H0-11339 5 dnfqdpopcipddc
+F-H0-11340 5 ccfddedcpd
+F-H0-11341 3 qqpqppqpmpkpdppkddpd
+F-H0-11342 3 ocpippqddpkdpgddpdpc
+F-H0-11343 3 qnoqqpdplponddpc
+F-H0-11344 2 gddpppfedhcedcqd
+F-H0-11345 4 mdppdppjpfpdncnddclc
+F-H0-11346 8 cpeqfqipcqfpppdpgpfocnddpd
+F-H0-11347 8 oppqnpoodpplpopddc
+F-H0-11348 3 nolqnqfqdpppddpd
+F-H0-11349 3 qqppqndppdqlddqf
+F-H0-11350 8 drjqpqdqfqdpcqdocpddpd
+F-H0-11351 5 pldpkqcnfqpkqpqjqlpjqkdcpd
+F-H0-11352 3 qfdpkqcnfqpkqpqjqlpjqkdcpd
+F-H0-11353 2 jdqfmekeleldpdocodncndlckd
+F-H0-11354 3 pnqpoppdcpdd
+F-H0-11355 2 cqdqdoppdcpd
+F-H0-11356 2 qfcpqppdepdd
+F-H0-11357 5 ddjjdppe
+F-H0-11358 2 ppjjdppe
+F-H0-11359 2 mppqdpplpopdedcd
+F-H0-11360 2 ppkjpd
+F-H0-11361 2 dpkjpd
+F-H0-11362 8 qmoqdpqpqjqgdcpd
+F-H0-11363 3 mqfqlqppjqkpiqjphqiphpmodphocnfoddpd
+F-H0-11364 2 nqfqlqppjqkpiqjphqiphpmodphocnfoddpd
+F-H0-11365 4 efdhppeedpqddeddfddced
+F-H0-11366 2 fphpppdpepcpdoeodndcpd
+F-H0-11367 7 fepqdpcfidqdfdgdddfc
+F-H0-11368 2 nckqdpfqdnppddpd
+F-H0-11369 4 cjdpoqjjpddd
+F-H0-11370 2 ncppdpjjecpd
+F-H0-11371 5 jddpppjjjpdjpjddpd
+F-H0-11372 2 ncppdppjdjjjjdpddd
+F-H0-11373 8 erdrdqfqipcqdpqpdocpdcpd
+F-H0-11374 2 ppcoecpd
+F-H0-11375 2 qpcoecpd
+F-H0-11376 2 opcoecpd
+F-H0-11377 5 gddppqcdpdeceddcfc
+F-H0-11378 3 qjdppqdnfqjdjpddpfncpd
+F-H0-11379 2 cfdppqdnfqjdjpddpfncpd
+F-H0-11380 7 cnerdrhqcreqfqdqcqdpppdocpedpd
+F-H0-11381 4 onpqdpqmpopdcfjdddfc
+F-H0-11382 3 qqpqdpqmpopdcfjdddfc
+F-H0-11383 3 opcddopc
+F-H0-11384 2 edpqepqd
+F-H0-11385 3 ippqdpfqddqkncpfpbpd
+F-H0-11386 4 fdppdpdecgbedcpd
+F-H0-11387 3 ncpqeqpkdcpd
+F-H0-11388 2 kppqeqpkdcpd
+F-H0-11389 7 cphqfqdqcqdpppedpd
+F-H0-11390 3 qferdrkqcrhqpqeqfqdqcqdpcpdoqoddcnncpd
+F-H0-11391 2 kderdrkqcrhqpqeqfqdqcqdpcpdoqoddcnncpd
+F-H0-11392 5 jdcnppcfdppdfdcdedecfcdc
+F-H0-11393 2 jqpqnqoqopqpnpdppdqnddqf
+F-H0-11394 5 nonqppdqnpopmomppjdcpd
+F-H0-11395 3 qkdpoqqiqpddpd
+F-H0-11396 2 mcppcedppdkcdc
+F-H0-11397 5 kcdppqnepkkdpfddpdnclc
+F-H0-11398 2 phppqhdppdpindqfidofcd
+F-H0-11399 8 cocqgqppdqdpcpdocmenddpd
+F-H0-11400 2 cfpeppjddpdd
+F-H0-11401 2 ccdpppdjpded
+F-H0-11402 2 pqjppddpddpo
+F-H0-11403 2 orrrqrprpqrqqpqqppdppdpndd
+F-H0-11404 3 lcqpqhdpqgpgpfqfqeqcpdpcjdncdd
+F-H0-11405 2 opqpqhdpqgpgpfqfqeqcpdpcjdncdd
+F-H0-11406 8 qoqqpqppqppodppdqmddqf
+F-H0-11407 5 epdqcoppecpd
+F-H0-11408 2 fpdqcoppecpd
+F-H0-11409 2 qppppnnpjj
+F-H0-11410 3 oqdoqpddpd
+F-H0-11411 5 ekercqcrppdqcpfpdocickddpd
+F-H0-11412 4 cfdrercrkqfqhqcqeqppdqcpdpcndopdddfc
+F-H0-11413 4 pldqpqpopdec
+F-H0-11414 2 qmdqpqpopdec
+F-H0-11415 8 eqdrercrhqfqdqcqdpqpdocpdcpd
+F-H0-11416 7 dcdpppefdgdfcfcepdjdfcddcc
+F-H0-11417 6 nrmqnqlqnppplpkpdppnlopjddpd
+F-H0-11418 2 oeppdppjlepfndpdldkdddmcnclc
+F-H0-11419 8 qrpqrpppqprompqodprnpopnooplqnpddd
+F-H0-11420 3 oiqppidppdohddqf
+F-H0-11421 7 eqdrercrjqpqdqfqdpcqdocpddpd
+F-H0-11422 2 fqdppqcldjcedfcdcffcdedcpd
+F-H0-11423 2 pkdppqcldjcedfcdcffcdedcpd
+F-H0-11424 3 qqlqprppnqqndppdcfjdddfc
+F-H0-11425 7 cfdpoqqjqpcededcpd
+F-H0-11426 5 oqqqpqppmqopqpdppd
+F-H0-11427 8 qnpqqqqpppdppoqopdqmddqf
+F-H0-11428 6 pnpqopppnpoodpplpopddc
+F-H0-11429 2 endqppdpfpeoepdldoddpc
+F-H0-11430 2 fppqjpcndpqkddpd
+F-H0-11431 2 jpnqppqddpddpjkc
+F-H0-11432 4 jpdpfqdnppciddcffcpdccbd
+F-H0-11433 7 eopqeqepdqcpdpdodncoddpd
+F-H0-11434 8 cddpppcgefgcdedcpdcbcc
+F-H0-11435 6 gqpqhqfqiphpdphoddpd
+F-H0-11436 5 ohogpppfdpofphoepgpdqfjdqeddpeqcqdpc
+F-H0-11437 5 qedpfqdnppqjjpqgqlddpd
+F-H0-11438 2 mcdpfqdnppqjjpqgqlddpd
+F-H0-11439 7 qqqpoplpqodpporopdrndd
+F-H0-11440 3 oqmqppdpqoqmqhqjqdddoc
+F-H0-11441 2 npmqppdpqoqmqhqjqdddoc
+F-H0-11442 3 qhdpppqfpdcfkcddfc
+F-H0-11443 2 pfnqqnppqidppdncdd
+F-H0-11444 4 eddpppdheffedeeepdecgddcdd
+F-H0-11445 3 qqqppplpopdpnoqopmoopdondd
+F-H0-11446 7 drhqfqdqcqdpqpdocpdcpd
+F-H0-11447 6 djdppjpdjjddjd
+F-H0-11448 6 qoqqpqqpfqdpppqnjppnpocnqlddpd
+F-H0-11449 2 ofdpppqfqhpfpecfpdqdjdddpcqcfc
+F-H0-11450 5 epfppqdpfqgogpddpd
+F-H0-11451 4 popdepdc
+F-H0-11452 2 ecqpdopd
+F-H0-11453 8 dofqhqcqdqqpdpcpdcpd
+F-H0-11454 6 fbdpppdhdefcpddcedebeccbdb
+F-H0-11455 6 pmrppqdpfqqnjppnpocnonomplddpd
+F-H0-11456 2 mpqpoqpodppd
+F-H0-11457 2 dcqpoqpodppd
+F-H0-11458 2 qnnqppcpddpc
+F-H0-11459 2 dodqppqdddfc
+F-H0-11460 3 cfppjqdppdfdcdedecfcdc
+F-H0-11461 5 pcdpppodqdqcmcdc
+F-H0-11462 2 bqpqgqcqcpepddpd
+F-H0-11463 3 cpeppqdcqd
+F-H0-11464 2 oceppqdcqd
+F-H0-11465 7 pcppcedpqdqclcncdc
+F-H0-11466 4 friqhqfqeqppdpipcnfoddpd
+F-H0-11467 2 oeqfrdrercqdqcpdpcocobncnbmc
+F-H0-11468 2 jdqpcedppdncdc
+F-H0-11469 2 qhdpoqqfqpdcpd
+F-H0-11470 2 pidpoqqfqpdcpd
+F-H0-11471 5 qomppqdpjpoopkddpd
+F-H0-11472 2 pomppqdpjpoopkddpd
+F-H0-11473 6 qpqrerdrqqcrhqpqeqmqdqfqdpcqpocpdocnddpd
+F-H0-11474 8 rqqqpqppqppodprnqoqnpnpdqmddqf
+F-H0-11475 4 kplqnqppdppnnoqiddpc
+F-H0-11476 2 gfchppqddpfdefddcfkc
+F-H0-11477 3 qjoqeqqpddpd
+F-H0-11478 2 ncoqeqqpddpd
+F-H0-11479 2 djdpppcdocec
+F-H0-11480 4 ccopcqpd
+F-H0-11481 2 dcopcqpd
+F-H0-11482 6 kqeqfqdqppcpgpcnepdcpd
+F-H0-11483 2 mqeqfqdqppcpgpcnepdcpd
+F-H0-11484 3 chpqkqqodpcfddpd
+F-H0-11485 2 qnnqpppddpcdciec
+F-H0-11486 7 mcppdppjnepfkdpdncockclcdcnb
+F-H0-11487 2 qpdpoqpofqcnipddpd
+F-H0-11488 2 qmdpoqpofqcnipddpd
+F-H0-11489 7 qrrqqqpqppnqdpqppoddpd
+F-H0-11490 3 ojoqdpqpqjqlqgqeddpc
+F-H0-11491 2 ompqdpqoqmqhqjqdddoc
+F-H0-11492 6 cleqdrcqcrbqdqqpcpdpcodocndndmcmddpd
+F-H0-11493 8 onrpqqdppqrofqqnjppnqocnpormqldcpd
+F-H0-11494 8 cdoqdpcfcededcpd
+F-H0-11495 2 dffqdpppdnpdddfc
+F-H0-11496 2 idfqdpppdnpdddfc
+F-H0-11497 7 rpqqpqppoqopnqnpqpqomppddpcd
+F-H0-11498 7 cbeqppdepdddcdhcfcdcccebdb
+F-H0-11499 4 qfcnfqdkppchdpcecfbebdpdfceddcddcccdbc
+F-H0-11500 8 oopqrpfqdpjpqnpopnoncnpmomplddpd
+F-H0-11501 3 djpqdpnqpoqpqnqopnqhqjqdddoc
+F-H0-11502 2 jopqjqlqfqeqfpdqepcppdqoddcn
+F-H0-11503 5 ccchdqpdppjdcfdd
+F-H0-11504 4 pqqodpecpd
+F-H0-11505 5 hqqqpqjqppqpdprnpoqnompdqldd
+F-H0-11506 5 qcppqhcppdqfndofjdrddd
+F-H0-11507 8 onppdpqlqnqhqjqdddnc
+F-H0-11508 8 crerdrdqfqipcqdpqpdocpdcpd
+F-H0-11509 4 ofqhpppddojdqfdd
+F-H0-11510 3 qcppeppjddpdnclc
+F-H0-11511 5 icdqppdfpdbeedcddcbccc
+F-H0-11512 2 hqbqdqcpcqboppdnepdcpd
+F-H0-11513 2 dmqpcnkppddpcddn
+F-H0-11514 4 ocqdpdpc
+F-H0-11515 4 dkdqcpppdojpcodpcneodmendldnpdemcdel
+F-H0-11516 3 cqdqcpppdojpcodpcneodmendldnpdemcdel
+F-H0-11517 4 lojqlqppqnnp
+F-H0-11518 5 hpeqpppdcpdc
+F-H0-11519 3 eeppdpcgeddeddcecdpd
+F-H0-11520 8 dcpqdpqdidfcddcc
+F-H0-11521 7 plqqrppqdpfqrojpqnqopnpocnonrmqldcpd
+F-H0-11522 7 roqrrqqqpqppqppodprnqoqnpnpdqmddqf
+F-H0-11523 4 ddpqndqd
+F-H0-11524 2 ddfqdpqpdnpd
+F-H0-11525 2 eqfqdpqpdnpd
+F-H0-11526 2 qeqnppddnppc
+F-H0-11527 3 qldpppqncifddedcpdebcdcbcc
+F-H0-11528 2 ndercqcrppdqcpfpdoqfckddpd
+F-H0-11529 7 qippqhcpphpipdohndqfjdofdd
+F-H0-11530 2 lqnqppeqpjedpd
+F-H0-11531 2 ndqopddojdqfdd
+F-H0-11532 7 cphqfqdqcqdpqpdcpd
+F-H0-11533 8 qmkqdpfqcnqpqjqhddpd
+F-H0-11534 8 cbdppqdeqdidcdddfcdcccebdb
+F-H0-11535 5 fpeqpqdqepdpcpeododncoddpd
+F-H0-11536 4 qmdpppomqlpkqjpjqipiqhohphqfpdofndcfjdddfc
+F-H0-11537 2 omdpfqqnpponnpcnjpolqlpkplpjqkpiqjogqhddpd
+F-H0-11538 5 hddpppdfpdddgdhcfcgcdb
+F-H0-11539 7 dbeqppdepdddcdhcfcdccc
+F-H0-11540 2 phqhqfpdrdnc
+F-H0-11541 2 qcqhqfpdrdnc
+F-H0-11542 2 qgqhqfpdrdnc
+F-H0-11543 5 djpqdpnqpoqpqnqopnqhpjqdddoc
+F-H0-11544 3 dppqddpeocqd
+F-H0-11545 2 qprrqrqqpqdppdpndd
+F-H0-11546 8 cbdppqdefdpddccc
+F-H0-11547 4 dgpqdpcfdfpdedcd
+F-H0-11548 3 mqpqnpnqdppdpocd
+F-H0-11549 4 nqoqopqppddpddcffcbd
+F-H0-11550 2 ppoqopqppddpddcffcbd
+F-H0-11551 4 ocppdqpjodnemdmencpddcnd
+F-H0-11552 3 dqfppqdpfqgogpfoepdjpcdd
+F-H0-11553 2 qjpdpfndqercqdqc
+F-H0-11554 7 ohqhppphcppdpindqfjdofdd
+F-H0-11555 7 dqpqjqfqdpcqddpd
+F-H0-11556 4 qcpqdpqdnddc
+F-H0-11557 5 opdrercreqfqdqcqipqpdpcpdocndcpd
+F-H0-11558 2 dnfqqpdqepcqdpbqcpbpcocnbopddkdc
+F-H0-11559 3 dqoqdcod
+F-H0-11560 7 bcdppqdgdfcfdecepdcddddcecdbcc
+F-H0-11561 6 erbrdreqcrcqdqbqcpqpcodpcndodmdnclcmddpd
+F-H0-11562 7 erdrjqpqdqfqdpcqdocpddpd
+F-H0-11563 4 fcfqhqppdpcfddpd
+F-H0-11564 3 chfqhqppdpcfddpd
+F-H0-11565 2 podppqqjqlqgqdddoc
+F-H0-11566 2 qjppcedpqdjclcgcdc
+F-H0-11567 6 coqpcnkpdmdppdendddn
+F-H0-11568 4 qndrercrhqfqeqcqdqppdpcpdocnedpd
+F-H0-11569 2 nqdrercrhqfqeqcqdqppdpcpdocnedpd
+F-H0-11570 4 qcppcqpjncpdcclc
+F-H0-11571 3 qldpppqnqdddoc
+F-H0-11572 8 ceppdpdgefcfdfpdjdfcddcc
+F-H0-11573 3 pfnepd
+F-H0-11574 4 qoqqpqppkqpmqppddpddpj
+F-H0-11575 2 qoqqpqppqpmpjpdpqkddpd
+F-H0-11576 2 fdpppjjpqddpddcf
+F-H0-11577 2 lqnqppdpjddjpcdd
+F-H0-11578 4 fqdpppqfpjqdpdmdndddocqcmcnclc
+F-H0-11579 2 fqqqoqnqmqqplqmpppdpnpqnpjddpd
+F-H0-11580 2 lcppqhdpqgpgpfqfqeqcpdpcjdncdd
+F-H0-11581 5 qqerdrhqcreqnqdqfqrpcqdpppdocpqncndcpd
+F-H0-11582 4 rqqqpqppnqdpqppoddpd
+F-H0-11583 5 hohqpqdpjpjdpkddpfncpd
+F-H0-11584 3 rmrpqqdppqrofqqnjppnqocnpoplqlddpd
+F-H0-11585 2 fefqcnppdjdppdhdedfdcdfchcebecdbcc
+F-H0-11586 7 rqrpqpdpppqooopoddpc
+F-H0-11587 5 cddqppcgdedcpdcbcc
+F-H0-11588 2 jpppnqqndppd
+F-H0-11589 2 rdpdppddqfnc
+F-H0-11590 3 sirippoidpqhrjphqirgpipdohndqfjdofdd
+F-H0-11591 7 qfoqdpqpqjqledpd
+F-H0-11592 8 dqfqipcqdpqpdcpd
+F-H0-11593 6 nqpqqqoqppmqopqpdppd
+F-H0-11594 3 qnpqdpqddcod
+F-H0-11595 2 oddeppqdcpdc
+F-H0-11596 2 qjpqdpqddcod
+F-H0-11597 3 fpdrercrjqpqeqfqdqcqdpcpdocnddpd
+F-H0-11598 2 mqdrercrjqpqeqfqdqcqdpcpdocnddpd
+F-H0-11599 2 ogdpppqfpeqdpdqcpcncocdcjcqbobpb
+F-H0-11600 4 qnpqdqqopoqddcoc
+F-H0-11601 3 pppqdqqopoqddcoc
+F-H0-11602 8 rnppqqnprpdproqoqnpnpmqmpdqldd
+F-H0-11603 6 qrerdrqqcrhqpqeqmqdqfqdpcqpocpdocnddpd
+F-H0-11604 4 dqcqqpcnkppddpddcl
+F-H0-11605 2 qdppqhdppdqfidqccd
+F-H0-11606 4 pmdqopqppdlpdd
+F-H0-11607 2 neqpdpphpepcdd
+F-H0-11608 3 ecppdpdfdhcefdpddcddcbcc
+F-H0-11609 4 npqqpqnqoqppmqopqpdppd
+F-H0-11610 5 nqdppqpofqnoplddpd
+F-H0-11611 2 mqdppqpofqnoplddpd
+F-H0-11612 7 jplqnqkqkpppdppnnopjdcpd
+F-H0-11613 2 pjpopqqfcpddpd
+F-H0-11614 6 eeoqdpdedhpddcfd
+F-H0-11615 2 fcoqdpdedhpddcfd
+F-H0-11616 3 fdppdpeedddecdceecpd
+F-H0-11617 2 dippdpeedddecdceecpd
+F-H0-11618 5 edpqdpefeededcpd
+F-H0-11619 3 nedqppofoepepcdd
+F-H0-11620 2 qldppqpnpedd
+F-H0-11621 4 opdqpdqpcdcoic
+F-H0-11622 2 jpeqpqcpqkdcpd
+F-H0-11623 4 qdpeoc
+F-H0-11624 4 ebpqdpdecdpdccdd
+F-H0-11625 2 cnppdqdjcedfcdcffcdedcpd
+F-H0-11626 2 clppdqdjcedfcdcffcdedcpd
+F-H0-11627 2 coppdqdjcedfcdcffcdedcpd
+F-H0-11628 5 dfdqpqcecfcddedcpd
+F-H0-11629 2 dodqpqcecfcddedcpd
+F-H0-11630 4 oceqpqdcqd
+F-H0-11631 8 dbdppqdeqdidcdddfcdccc
+F-H0-11632 2 qddppppgpfqfofdfpdqeicddfcccdb
+F-H0-11633 8 cpjqpqdqfqdpcqddpd
+F-H0-11634 7 erdrhqfqdqcqdpppdocpedpd
+F-H0-11635 6 mppqpocppdplcd
+F-H0-11636 3 ckoqdqqpqjcoddpd
+F-H0-11637 2 hpeqppcecppdjcdc
+F-H0-11638 2 gcdqjqpppdcocdec
+F-H0-11639 4 encnqpdmkppddpdddn
+F-H0-11640 5 bnnqcqdqppjpcpdpqndocnclddpd
+F-H0-11641 3 poircqdrippqdpfqdnfoedpd
+F-H0-11642 2 coppdqcdpdec
+F-H0-11643 2 jqdqqpcoddpd
+F-H0-11644 7 cfeqppdepdddcdhcfcecccdcdbebcb
+F-H0-11645 3 fdpppf
+F-H0-11646 2 fdppfp
+F-H0-11647 3 oopqdpqmqopd
+F-H0-11648 2 pmpqdpqmqopd
+F-H0-11649 3 ncppcopjdcpd
+F-H0-11650 2 fcdppqdjqedd
+F-H0-11651 7 blerbrdreqcrcqdqbqcpqpcodpcndobndndmcmclbmddpd
+F-H0-11652 7 bddiqppddpedcfdddccdcc
+F-H0-11653 7 rnrppqqpppmprodpqopopnooplqnpddd
+F-H0-11654 5 omppdpqlpkqjpjqipiqhohphqfpdofndcfjdddfc
+F-H0-11655 2 gqfqeqcqipppfpgpdpcpfocnddpd
+F-H0-11656 2 frfqeqcqipppfpgpdpcpfocnddpd
+F-H0-11657 2 geppdpcffepdidgdfdcdddfceccc
+F-H0-11658 2 clfqeqcqipppfpgpdpcpfocnddpd
+F-H0-11659 4 hrgriqfrgqhqfqeqppdpipcnfoddpd
+F-H0-11660 7 brdreqcrcqdqbqcpqpcodpcndodmdnclcmddpd
+F-H0-11661 3 rcqidpqfpdrdqclcnc
+F-H0-11662 2 efchppiccffcdddbcc
+F-H0-11663 6 oomppqpopldcpd
+F-H0-11664 2 ddqppddghdedcd
+F-H0-11665 2 qqqppqdpppqoddpc
+F-H0-11666 2 poqppqdpppqoddpc
+F-H0-11667 6 qomppqdpjpooqkddpd
+F-H0-11668 2 pomppqdpjpooqkddpd
+F-H0-11669 3 cqkqnqhqfqdpqpddpd
+F-H0-11670 2 qjdpppddqdkcnchcfc
+F-H0-11671 5 npdppqpojpjdqkncpfdcpd
+F-H0-11672 2 qpdppqpojpjdqkncpfdcpd
+F-H0-11673 5 pmpqrpfqdpjpqnpocnpnqmpkddpd
+F-H0-11674 3 qqpqrpfqdpjpqnpocnpnqmpkddpd
+F-H0-11675 2 ompqpodppmqmpdpl
+F-H0-11676 5 qqdrcqiqdpfqqnppcnpkddpd
+F-H0-11677 5 ofcnppdjfppidppdqfdd
+F-H0-11678 5 dcqpopdedppd
+F-H0-11679 2 fdopdppddedc
+F-H0-11680 4 oomppqdpplpoqdddnc
+F-H0-11681 6 cnfqeqgpdqeppppdcp
+F-H0-11682 8 ppqpoplpdpoonoonpmdcpd
+F-H0-11683 4 dlerppcqgpcpdpbndodcpd
+F-H0-11684 4 fccipppddpmcjcdc
+F-H0-11685 4 gccipppddpmcjcdc
+F-H0-11686 3 cepqdpdfdcqd
+F-H0-11687 6 qcqfpdqdnc
+F-H0-11688 7 dppjppjjpddjdd
+F-H0-11689 2 rcrerdqdqcpdpcocobncnbmc
+F-H0-11690 4 fpcnppcedpqd
+F-H0-11691 2 cnoqdpfqddpc
+F-H0-11692 7 lbppdppjnepfkdpdncocmclckcnbdcmb
+F-H0-11693 8 cnerdrjqcreqpqdqfqdpcqdocpddpd
+F-H0-11694 4 cfdrcqiqppfqdppddncdciec
+F-H0-11695 3 ncpqkqbpcqqofpcndpckddpd
+F-H0-11696 3 nqppdpqidepc
+F-H0-11697 6 ddpqdppe
+F-H0-11698 3 pepqdpqdndlcddfc
+F-H0-11699 2 dfpqdpqdndlcddfc
+F-H0-11700 7 qnircqdrippqdpfqpoqodnfoddpd
+F-H0-11701 2 lqnpqppdcodd
+F-H0-11702 2 ceppeqdfdcpd
+F-H0-11703 7 ocppdppjodoeddpdncnd
+F-H0-11704 3 cppqhqfqfpcqdpcnddpd
+F-H0-11705 3 eqpqhqfqfpcqdpcnddpd
+F-H0-11706 4 rqqqmqopqpnodppdpndd
+F-H0-11707 3 cdppdpefcgdefdpddccc
+F-H0-11708 8 dpgqcqdqppcpdocmenddpd
+F-H0-11709 3 popqdpcifddedcpdebcdcbcc
+F-H0-11710 6 fedpppeepdcded
+F-H0-11711 2 cqdqdopppdeodd
+F-H0-11712 2 dfdpoqcecfcddedcpd
+F-H0-11713 2 opqqdrpqiqcqfqdpqpqnppdnqlddpd
+F-H0-11714 4 peddjjpc
+F-H0-11715 2 fddqppcodedcpd
+F-H0-11716 2 eqdqppcedodcpd
+F-H0-11717 4 qpqqpqdpnqpoddpd
+F-H0-11718 2 fqdpppdhdffdcejcpddcbc
+F-H0-11719 2 cjjqbqdqppfpcodldnddpd
+F-H0-11720 7 omrpqqdppqrofqqnjppnqocnpormonplqldcpd
+F-H0-11721 5 qqqpopdpcdpnpcpe
+F-H0-11722 2 cmdodqdfqppdedcd
+F-H0-11723 3 dpopdcqd
+F-H0-11724 2 pedeqppc
+F-H0-11725 2 oqdppejj
+F-H0-11726 7 dofqhqcqdqppdpcpedpd
+F-H0-11727 2 hcppnqpjdppdddfc
+F-H0-11728 2 jpfqdpppddpjncpd
+F-H0-11729 5 dbppdpcfdheedfdebfpdcegdbecdddbddccb
+F-H0-11730 3 qqqrpqrpppqprompqodprnpopnooplqnpddd
+F-H0-11731 2 dferdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnddpdhcfc
+F-H0-11732 2 cferdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnddpdhcfc
+F-H0-11733 2 hderdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnddpdhcfc
+F-H0-11734 7 qcqhppoedppdqfjdncdd
+F-H0-11735 8 ckkqpqcqbpfpqodpcnddpd
+F-H0-11736 3 drpqhqfqgqhpipfpdphoddpd
+F-H0-11737 3 dnpqhqfqgqhpipfpdphoddpd
+F-H0-11738 7 qppqqqppnqkpdpddpd
+F-H0-11739 6 mcppphqecdnepc
+F-H0-11740 8 cfdqpdqpcdfdeceddcfc
+F-H0-11741 7 hcppdppddfgdddfcgcdb
+F-H0-11742 2 qdpeqepdpc
+F-H0-11743 4 gcpqdpfedhdedcpd
+F-H0-11744 4 fcpqdpfedhdedcpd
+F-H0-11745 3 pmqpoplpdcpd
+F-H0-11746 2 onqpoplpdcpd
+F-H0-11747 2 cdfqdpppdnjpecpd
+F-H0-11748 2 ncqnpppjnppdcodd
+F-H0-11749 2 qjppeqpddfjdddfc
+F-H0-11750 4 opircqdripfqdpqpdnfoddpd
+F-H0-11751 4 cddppqponqqnqppmqoqipd
+F-H0-11752 2 qgdppqponqqnqppmqoqipd
+F-H0-11753 3 fpopdqdoqpddpd
+F-H0-11754 6 gqfqhqppfpgpdpcnddpd
+F-H0-11755 5 qppppqmpkpdpqkddpd
+F-H0-11756 7 qddpoqqfqppeqedcpc
+F-H0-11757 7 coeqppcpdodcpd
+F-H0-11758 3 qpcqoqdcpd
+F-H0-11759 2 fpcqoqdcpd
+F-H0-11760 2 qocppqpnepddpd
+F-H0-11761 2 ndnpqpdddppcpe
+F-H0-11762 2 npcppqpnepddpd
+F-H0-11763 4 fddpppcidedcpd
+F-H0-11764 2 fqdpppcidedcpd
+F-H0-11765 2 ogpfofpeoepd
+F-H0-11766 6 foqpdqgpeododlenddpd
+F-H0-11767 3 prcqerppcrcpnqdodqqnfpckddpd
+F-H0-11768 2 nccqerppcrcpnqdodqqnfpckddpd
+F-H0-11769 4 gddpppcddeccpdebdd
+F-H0-11770 5 qqprppnqpndqpjddpd
+F-H0-11771 2 cndpppeedgceefbecfeddedcpd
+F-H0-11772 2 gfdpppeedgceefbecfeddedcpd
+F-H0-11773 3 pdceppdc
+F-H0-11774 3 qpqddpoc
+F-H0-11775 5 bpppeqdocpcodcpd
+F-H0-11776 2 dpppeqdocpcodcpd
+F-H0-11777 3 onqpoqlpdpdcpd
+F-H0-11778 5 dqjppqdpfqcocqencndndmddpd
+F-H0-11779 2 mcpjqpnedppdqfndmdddqcocnc
+F-H0-11780 4 pfqfrerdqercqdqcpdobnd
+F-H0-11781 3 nbqfrerdqercqdqcpdobnd
+F-H0-11782 7 qodppqqmqhqjqdddoc
+F-H0-11783 6 nddpqoddpepc
+F-H0-11784 4 noppnqkppddpdd
+F-H0-11785 2 fcdpppdicfddpd
+F-H0-11786 2 dcpqdpfqcnpd
+F-H0-11787 2 popqdpfqcnpd
+F-H0-11788 3 qomppqpodpedpd
+F-H0-11789 5 lqnqhqjqdqpeppddco
+F-H0-11790 7 fohppqcpepeodmdcpd
+F-H0-11791 6 oqqrorprpqqqppnqkpqppodpddpd
+F-H0-11792 4 qpdppqqnfqcnjpddpc
+F-H0-11793 2 qldppqqnfqcnjpddpc
+F-H0-11794 4 qeqpqhdpqgpgpfqfpdpcjdncdd
+F-H0-11795 6 qkqqrppqdpfqrojpqnqopnpocnonrmomplqlpkqiddpd
+F-H0-11796 2 hppqmpkpdpqoooqkddpd
+F-H0-11797 2 iqpqmpkpdpqoooqkddpd
+F-H0-11798 4 qmqrrqprqqpqoqqpppqodpqnpopmpnqdddoc
+F-H0-11799 3 rrqrrqprqqpqoqqpppqodpqnpopmpnqdddoc
+F-H0-11800 3 gddoppdhdedcpd
+F-H0-11801 6 hofqppdqfodldodcpd
+F-H0-11802 4 jpppnqqndppjddpd
+F-H0-11803 2 kdppdppjddqfncpd
+F-H0-11804 7 poqpoplpqocppdrodd
+F-H0-11805 3 nodrercrhqmqeqfqdqcqopqpdpcpdocnddpd
+F-H0-11806 2 cjqqdpcedfcdcffcdedcpd
+F-H0-11807 2 djqqdpcedfcdcffcdedcpd
+F-H0-11808 6 fcdpqqdfcecfcddedcpd
+F-H0-11809 6 qeqodppeddndpc
+F-H0-11810 3 mcpqdpmedfhehdfeddpdlckdjcjdicidhcfc
+F-H0-11811 3 ncpqdpmedfhehdfeddpdlckdjcjdicidhcfc
+F-H0-11812 2 opcpod
+F-H0-11813 3 qirpqqdppqrofqqnjppnqocnpormonplompkqldcpd
+F-H0-11814 3 forpqqdppqrofqqnjppnqocnpormonplompkqldcpd
+F-H0-11815 5 ocpqdpnemdpdddndnc
+F-H0-11816 3 opqpcedppdpindqf
+F-H0-11817 5 pnqppqppoqnpopdppoqopdoocd
+F-H0-11818 6 orprpqqqppnqkpqppodpddpd
+F-H0-11819 7 qgpqdpqnqjqddcoc
+F-H0-11820 2 pedpppqdpjddneqcpdncpc
+F-H0-11821 3 cnnqpqopoqmpqpdppdpncd
+F-H0-11822 5 qcqhqpqgdppfpgqeqfpdpcjdncdd
+F-H0-11823 2 efdpoqdicfddpd
+F-H0-11824 4 fnhppqcpepeodpenfocndmdcpd
+F-H0-11825 3 cqhppqcpepeodpenfocndmdcpd
+F-H0-11826 5 nbqfqepfqdpepcnd
+F-H0-11827 2 qfpfqdodpcndocnc
+F-H0-11828 7 qdpipppdcpjdqfddqcpc
+F-H0-11829 4 hdpqjqdppdqocdec
+F-H0-11830 6 cpfqppcqdpcneopddjcd
+F-H0-11831 3 nppnpqjjpd
+F-H0-11832 6 poqqdrcqpqqpiqdpfqqnppcnqlddpd
+F-H0-11833 3 rpnqdpppqnqlonqhqjpdcfjdddfc
+F-H0-11834 2 pifqdpppcnjpqjqlqfqhofpdddnc
+F-H0-11835 6 eeppdpdedhceddpddced
+F-H0-11836 5 prqqpqoqqpppqodpqnpopmpnqdddoc
+F-H0-11837 5 kqpqnqpodpqkddpd
+F-H0-11838 4 qppppqmpjpdpqkdcpd
+F-H0-11839 5 deppcnfpdkdpeefepdedcd
+F-H0-11840 2 nodppqpofqonipdnooddpd
+F-H0-11841 3 qldpoqqjqpdcqc
+F-H0-11842 4 bddpoqqjqpddcffcpd
+F-H0-11843 4 ddjjdpqd
+F-H0-11844 2 dppqddjj
+F-H0-11845 6 qnorqrpqproqqqppnqkpqppodpddpd
+F-H0-11846 6 nqerdrhqcreqpqdqfqdpcqpoqpdocpqnqopncnddpd
+F-H0-11847 7 pqqqppnqqmdppddd
+F-H0-11848 6 efppdpcfcheefepddeedceddcdccdccbbcbb
+F-H0-11849 2 pepqdpfqdnjpddpc
+F-H0-11850 2 ndopdpjjpdqf
+F-H0-11851 2 pcdppplepjmdneddmeocpdncnd
+F-H0-11852 3 qfppncdpdcpd
+F-H0-11853 7 nmpqdpqmpoomonqdddoc
+F-H0-11854 5 dedpppdhceddpddced
+F-H0-11855 7 ndpqpidppfpgofogqdqfpdqeddnc
+F-H0-11856 7 fcdqpqcdpdeced
+F-H0-11857 3 mplqnqpplpkpdppjdcpd
+F-H0-11858 2 lolqnqpplpkpdppjdcpd
+F-H0-11859 3 pjqedpqdqfcdpfpcpenc
+F-H0-11860 2 qjqedpqdqfcdpfpcpenc
+F-H0-11861 5 oopqqpoqppopnppodppdqocd
+F-H0-11862 2 qodppqpnpddedc
+F-H0-11863 2 fqrpoqdpqpqkqopgqeqfqdpepcddnc
+F-H0-11864 2 qgdppqponqqnqppmqoqiqerdqdddoc
+F-H0-11865 3 hcpqnqoqiqgqopdqmpqpiocopdqnddjc
+F-H0-11866 5 qidppqqnfqdnqpqkjpddpd
+F-H0-11867 2 cfnqpqkqqppddpndpjddqf
+F-H0-11868 3 cqfppqdpfqcpeqgodqfogpeoepddpd
+F-H0-11869 3 hpfppqdpfqcpeqgodqfogpeoepddpd
+F-H0-11870 3 nppqqodpdcpd
+F-H0-11871 2 qfpqqodpdcpd
+F-H0-11872 5 neppqddppdpgndoeldodddncocmc
+F-H0-11873 2 cfpqdpqojjddpd
+F-H0-11874 6 emcqnqppdqcpjpqndpcndobnclddpd
+F-H0-11875 3 dmfpeqepdqcpcqdoqpcodpcneopddndd
+F-H0-11876 3 enfqcqeqfpdqdpppcpepeodocodndcpd
+F-H0-11877 3 ocpppfcpcenepdkdlcnchcjcdc
+F-H0-11878 3 dbqpdfdpqefeddidpcjclcfchc
+F-H0-11879 7 rbppqedpqdpfndpdddodpcrcocqcmcncqbnbobmb
+F-H0-11880 3 qqdqcqppcpjpqndpcndobnemqdqlddcl
+F-H0-11881 2 nelqnrqpqqpppqopnqmodppjncpddclc
+F-H0-11882 5 qcppdpqhcipdqfjddegddc
+F-H0-11883 2 qopqdqpdcfjdddfc
+F-H0-11884 2 qfppdpcjqjqdddnc
+F-H0-11885 2 qfnqdpqpqjcjddpd
+F-H0-11886 4 qedppqqfqkddpd
+F-H0-11887 3 qhdppqqfqkddpd
+F-H0-11888 5 jdpqqqfqqpppdpjprnpoqnomcnqlddpfncpd
+F-H0-11889 2 dnpqdpfqqipdqfqcrdncdd
+F-H0-11890 3 popqmpkpdppkdcpd
+F-H0-11891 2 pppqmpkpdppkdcpd
+F-H0-11892 2 oopqmpkpdppkdcpd
+F-H0-11893 4 qjnqqnpppjdpmeqlqdqcpdpcodncddnblc
+F-H0-11894 3 phnrlqqqqppqppnqopqhdppdmoddpjncqf
+F-H0-11895 5 pepppicppdqfjdqdddqcpc
+F-H0-11896 5 qqqppplpopoodpqnnoonpmdcpd
+F-H0-11897 2 nnpqppnqmpoodpnopoploncdpd
+F-H0-11898 7 qppppqdpfqpoqoddpd
+F-H0-11899 5 fnhpppcpepeodpenfocndmdcpd
+F-H0-11900 7 enpqhpepcpfoeodmdcpd
+F-H0-11901 4 rpqpoplpqodppoqnrnpnpmonpdqmdd
+F-H0-11902 2 gbdpppdhdefepdfdgdgcedfcecdcfb
+F-H0-11903 2 qcppnqnojppjdpjjdjpdddjd
+F-H0-11904 3 fddqppcpdococndndedcpd
+F-H0-11905 2 cgdqppdfdocecfcddedcpd
+F-H0-11906 6 omqqpqqpfqdppprnjpqnpocnqldcpd
+F-H0-11907 7 fqcqeqfpdqdpppcpepeodocodndcpd
+F-H0-11908 3 foipfqdpopdcpd
+F-H0-11909 5 qpdpoqpofqdnipddpd
+F-H0-11910 4 pnqnppqedpddqlpc
+F-H0-11911 5 oomppqdpfqpojpcnplddpd
+F-H0-11912 3 qjppergpcqdpcpdobndlccpd
+F-H0-11913 2 cfhpfrepqqdpdqdmcqpdbodd
+F-H0-11914 6 pqqqdrnqlqdpfqcnppddpd
+F-H0-11915 7 beqpdidppdcfedbddddccdcc
+F-H0-11916 6 ndqdpfpcodocnc
+F-H0-11917 2 chpppddpedcjcd
+F-H0-11918 2 cnjqpqdppoddpd
+F-H0-11919 3 nqppdppdddmc
+F-H0-11920 2 qjmqdpppddpd
+F-H0-11921 2 pjnqqnppjjdppddd
+F-H0-11922 6 nepppgoeodqdddld
+F-H0-11923 2 qpqqppnqjpdqpjddpd
+F-H0-11924 2 pcdpppqcpjncpddcjd
+F-H0-11925 4 cgdpppbefeedeecddebdceecpd
+F-H0-11926 2 jdereqdrepdqeoppendopdcodd
+F-H0-11927 4 cidppqcdcfdcqd
+F-H0-11928 3 eepqdqdghdpdcded
+F-H0-11929 6 jpdppqdnfqjdqkddpfncpd
+F-H0-11930 4 fcdppqponqqnqppmqodjqgqiqdddoc
+F-H0-11931 6 rcppqdcpldodddqc
+F-H0-11932 4 ndpqpocpodqdddpcncoc
+F-H0-11933 2 mdpqpocpodqdddpcncoc
+F-H0-11934 6 cocrbrhqfqeqcqdqbqppdpepeocpdofopdendd
+F-H0-11935 5 qppppqmpjpdppkddpd
+F-H0-11936 2 oppppqmpjpdppkddpd
+F-H0-11937 3 qqppnqnodppjdcpd
+F-H0-11938 4 qcppdppjdepdnclc
+F-H0-11939 3 neppdppjdepdnclc
+F-H0-11940 3 qbpipppecppdqfjdqdddqcpc
+F-H0-11941 3 npqpqqpppqopnqkpdppjdcpd
+F-H0-11942 3 iqbqpqcpdqbocqdnepdcpd
+F-H0-11943 2 hqbqpqcpdqbocqdnepdcpd
+F-H0-11944 6 qrorprpqqqppnqkpqppodpddpd
+F-H0-11945 6 qipqdpnqpoqpqnqopmqerdqdddoc
+F-H0-11946 7 pppqqqnqpoqppddpdd
+F-H0-11947 3 ppcdqe
+F-H0-11948 7 qqfqnpcqdpqpeocnddpd
+F-H0-11949 3 jdpqdpfqddpfncpd
+F-H0-11950 5 ndpgpd
+F-H0-11951 3 eddpppcdod
+F-H0-11952 6 freqeripfqfpdqepcqdpppcpcnddpd
+F-H0-11953 3 chpqdpfddedcpdebcdcbcc
+F-H0-11954 3 cipqdpfddedcpdebcdcbcc
+F-H0-11955 2 eqnqipfqdpqpddpd
+F-H0-11956 2 fpnqipfqdpqpddpd
+F-H0-11957 4 nbqfpppfdppeqendqdddpc
+F-H0-11958 2 mcdpppdfpdfdcdedecfcdc
+F-H0-11959 3 doedpooc
+F-H0-11960 3 fpfqppcndpddpd
+F-H0-11961 3 oonqppdppdqndd
+F-H0-11962 4 qjdrercrhqpqeqnqdqfqdpcqpoqpdocpqnqopncnddpd
+F-H0-11963 7 cdchdqpdqpjdcfddccdc
+F-H0-11964 7 onrpqqdppqrofqqnippnqocnpormqlddpd
+F-H0-11965 2 ncppqdcpddodocnd
+F-H0-11966 7 poqqpqeqfqdqppqpjpcpfpqnepcnqldcpd
+F-H0-11967 2 mpopqpcfdpqegdcdedpckcecfcdc
+F-H0-11968 3 ompopqondppdqmcd
+F-H0-11969 3 ldnqdpppqnodpjddqd
+F-H0-11970 5 pedpppmdqidcpc
+F-H0-11971 2 pjpmkqqdqpdddp
+F-H0-11972 5 pifqdpppcnjpqjqlqfqhofpdddnd
+F-H0-11973 2 popqdpfqdnjpjdqkddpfncpd
+F-H0-11974 6 qdppdppjddneqcpdncpc
+F-H0-11975 6 plqqrppqdpfqroipqnqopnpocnonrmqlddpd
+F-H0-11976 6 fcdppqponqqnqppnqopjqhdjqdddoc
+F-H0-11977 4 cndpppcfcjdcpd
+F-H0-11978 2 cmdpppcfcjdcpd
+F-H0-11979 5 oomppqcpeppopldcpd
+F-H0-11980 3 pgqgqppddpndqfddrd
+F-H0-11981 7 ppoppqnpoodpplpopd
+F-H0-11982 2 enppcndpqeclddmcpcjchc
+F-H0-11983 4 eqippqfpfqdpgpfocndcpd
+F-H0-11984 2 cqippqfpfqdpgpfocndcpd
+F-H0-11985 3 qnfqjppppjdpjjpddjddjd
+F-H0-11986 3 nddpppqfpjncpddckd
+F-H0-11987 6 bfchdqdeqppdcfjdcdddccdc
+F-H0-11988 2 pfqqpqqpfqdppprnjpqnpodnomddqlncpd
+F-H0-11989 2 piqhpppddpndqfldofddmfqcrd
+F-H0-11990 4 ckfrhqpqepfqdpdqcpcqgociddpd
+F-H0-11991 2 cmppdpckgepcedfcdddccdcchcfb
+F-H0-11992 6 nomppqdpoopoplonpcdc
+F-H0-11993 7 cddqppcfchpdddcc
+F-H0-11994 2 qodppqpnfqdcpd
+F-H0-11995 2 cndppqpnfqdcpd
+F-H0-11996 2 oodppqpnfqdcpd
+F-H0-11997 2 bdppnqqndqdfjppdcddddccc
+F-H0-11998 6 kddppqdfhehdfeddpdjcjdicidhcfc
+F-H0-11999 5 nqdppqpoqpqnqopmddpd
+F-H0-12000 2 nonqpqopoqmpqpdpddpd
+F-H0-12001 7 dedqchqppdcfjdcdddccdc
+F-H0-12002 6 efdfppcecppddgddcf
+F-H0-12003 4 mqpqnpnqdppdpodd
+F-H0-12004 2 opqpodcpdd
+F-H0-12005 2 dedqpodcpd
+F-H0-12006 5 gdepppdhdedcpd
+F-H0-12007 4 pmpqdpqppoqoqnqdddnc
+F-H0-12008 2 pnpqdpqppoqoqnqdddnc
+F-H0-12009 4 dpqdnddd
+F-H0-12010 2 eqeppqqdcpdcqo
+F-H0-12011 2 kpopdqcdqppcco
+F-H0-12012 2 plcppqpoqddcoc
+F-H0-12013 5 godqfqipeqfpppdpgpfocnddpd
+F-H0-12014 6 dofqdqcqppcpdpbococndnpddkdd
+F-H0-12015 2 djfreqerippqfpfqepdqdpcqcpcnddpd
+F-H0-12016 3 popqdpqdcdoc
+F-H0-12017 4 ceppdppddfcdedecdddc
+F-H0-12018 2 qqpqppqpnpqodppdpodd
+F-H0-12019 5 nmpqdpqmpoomonqddcoc
+F-H0-12020 7 qppqqqfqeqppdqjpcpfpqnepcnqldcpd
+F-H0-12021 6 qeppdpqdpeocdc
+F-H0-12022 5 hohqpqdpjpjdqkddpfncpd
+F-H0-12023 6 qnopfqdpqponlpddpd
+F-H0-12024 6 cmpqhpeqcpendcpd
+F-H0-12025 2 nodppqqnfqpnjponqocnpoddpd
+F-H0-12026 2 pjdppqqnfqpnjponqocnpoddpd
+F-H0-12027 5 cneqpqdqfpcqepdpcpeododncoddpd
+F-H0-12028 2 jcppdpdfdhcefdpdecdddccccbbc
+F-H0-12029 3 djqppdcpjdpjdd
+F-H0-12030 2 cedqppjdpjdcpd
+F-H0-12031 4 phqnpponnpoldppkqlpjplpiqkqgqjogqhpdjcdd
+F-H0-12032 2 lrmqlqfqjqppiqkphqjphpipdpmodnhoqjfoddpd
+F-H0-12033 3 mceqcjppqdcpddod
+F-H0-12034 3 lpopqppddpcdcjec
+F-H0-12035 2 oqrqqrpqqqqpppdpporornqoqnpnpdqmddqf
+F-H0-12036 2 mrqrnrorrqpqqqoqnqmqppfqopqpdpnpddpd
+F-H0-12037 2 sorqqrpqqqqpppdpporornqoqnpnpdqmddqf
+F-H0-12038 6 qppqqqfqdppppoooddpd
+F-H0-12039 2 qippqndpcdqepc
+F-H0-12040 4 cqdqqpcmdoddpd
+F-H0-12041 3 endqqpcmdoddpd
+F-H0-12042 5 onqpopmppddpcd
+F-H0-12043 2 dmfpiqfmpppdcpdd
+F-H0-12044 7 eedpppchcffepddeedceddcdccdccbbcbb
+F-H0-12045 3 qfpqqodpdepd
+F-H0-12046 7 eddqppcfchpddddccdcc
+F-H0-12047 5 nolqnqppdppd
+F-H0-12048 2 qqlqnqppdppd
+F-H0-12049 4 eqfppqdpfqpogpfocnddpd
+F-H0-12050 2 cqppfqdpcnendmdnpdedcd
+F-H0-12051 7 dcppdqchcfddpdcdcc
+F-H0-12052 4 prrqqrpqqqnqppqpdpoppoddpd
+F-H0-12053 5 dcpqdqpdcdedecfc
+F-H0-12054 4 dpqppdcc
+F-H0-12055 6 rmkqdpfqroqpqnqocnrnqmpnqjqgddpd
+F-H0-12056 4 qcppqhdppdqfndofldmfddrd
+F-H0-12057 7 qfppfqdodqdncpcncoqlqjdjcedfcdcffcdedcpd
+F-H0-12058 2 ecfqbpcqenppcndpbkdkpdedcd
+F-H0-12059 2 dffqbpcqenppcndpbkdkpdedcd
+F-H0-12060 2 roqqdrpqiqcqfqrpqpdpppqnopdnqlddpd
+F-H0-12061 4 ecdoppcepddced
+F-H0-12062 3 dpdqppcoepdepd
+F-H0-12063 5 oomppqpoplddpd
+F-H0-12064 3 cpppdojpcndpdmendednpdem
+F-H0-12065 2 qopppojpqndppmpnpeonddom
+F-H0-12066 4 popqoddpdcqd
+F-H0-12067 5 meppphdpoeofnenfddpepcpdncmd
+F-H0-12068 5 qoppqpoplpnodpploopdondd
+F-H0-12069 2 edppdpefdhdefepdeehddcdd
+F-H0-12070 5 fqnqiqkqppdpddpd
+F-H0-12071 6 oppqnpoodpplpopd
+F-H0-12072 2 opqodppedc
+F-H0-12073 2 dqdopqcepd
+F-H0-12074 4 fqkqpqhqmqpddpddqo
+F-H0-12075 4 piohppogdppfphofpgoeqfpdqejdpeddqdpc
+F-H0-12076 2 qqpqqpppqojppodpqnoopmpnplonpdomddol
+F-H0-12077 5 qorppqdpfqqnjppnpodnqlddpd
+F-H0-12078 3 fddppppfodcfddreqcqdpcrckc
+F-H0-12079 3 lcqrqqorqppqdpnppoddqkncpd
+F-H0-12080 3 pdqippcddppcqe
+F-H0-12081 4 kqdrfrfqjqeqhqppgqipdphpcngpddpd
+F-H0-12082 2 krdrfrfqjqeqhqppgqipdphpcngpddpd
+F-H0-12083 4 fqcnppcidpcecfbebdpdfceddcddcccdbc
+F-H0-12084 3 fdppfqepdqdpcqcpbqcobpbocnckpdcfdd
+F-H0-12085 2 oiqiqfpd
+F-H0-12086 6 mcdppppfpjmdpdncnddclc
+F-H0-12087 4 fqdppqeepd
+F-H0-12088 4 pecnppdjfpcddppc
+F-H0-12089 3 jjdppqdjjpjdpkddpd
+F-H0-12090 3 fqdppqdjjpjdpkddpd
+F-H0-12091 2 qffqppcecppdjcdc
+F-H0-12092 2 cpoqdqqpqjcnddpd
+F-H0-12093 2 cloqdqqpqjcnddpd
+F-H0-12094 5 qhfqppdqdocpdncocnqjqlqfdjcedfcdcffcdedcpd
+F-H0-12095 5 chpqdpcgdgdfcfdecepdcddddcecdbcccbbc
+F-H0-12096 2 ofrdqfpdreqclcnc
+F-H0-12097 2 ncpqdpfqcnipecpd
+F-H0-12098 2 jjdpppdijpjdpjncpfdcpd
+F-H0-12099 2 ocpfpeoepdod
+F-H0-12100 2 ncpepdoeodnd
+F-H0-12101 2 qdpepdoeodnd
+F-H0-12102 5 pqqqdqcqppcpjpqndpcndobnempdqlcdcl
+F-H0-12103 5 nqcqppqnddpc
+F-H0-12104 4 odppqldpqjpkqipjqhpiphohpdqfndofjdocdd
+F-H0-12105 3 pfoeppqddppdpeldodddoc
+F-H0-12106 5 jddrcqiqdpfqcnppddpfncpd
+F-H0-12107 3 ppqddpnc
+F-H0-12108 2 ddqddpnc
+F-H0-12109 4 rpoqdpqpqfqepeqddcpc
+F-H0-12110 2 gppqfqeqepdqpdcpcdqo
+F-H0-12111 3 dldodqecpd
+F-H0-12112 2 dcepcpqopd
+F-H0-12113 3 cippdpcdpcec
+F-H0-12114 2 qoeqpqcpddpd
+F-H0-12115 3 ohppdpqhpiphqfpdofnddfjdddfc
+F-H0-12116 4 efqqdpcgdedcpd
+F-H0-12117 3 ccqqdpcgdedcpd
+F-H0-12118 4 mrnrqrrqorqqpqnqoqppmqopqpdpnpqopddd
+F-H0-12119 4 edopdopd
+F-H0-12120 7 ceqpdidpbecfpdbdeddcddcccdbc
+F-H0-12121 2 decqdrdpiqdnfqcippkdpddc
+F-H0-12122 2 cecqdrdpiqdnfqcippkdpddc
+F-H0-12123 3 kqqpoqpndpddpd
+F-H0-12124 6 nqdppqpoqpqnqopmqerdqdddoc
+F-H0-12125 2 cfdpppcgfecdcebdpdgcedecdddccc
+F-H0-12126 4 dnpqdpfqcepddc
+F-H0-12127 7 cdqpdpcfcededcpd
+F-H0-12128 5 pkqqrppqdpfqroipqnqopnpocnonrmomplqlddpd
+F-H0-12129 4 jpdppqddpkncpfkcpdpbqc
+F-H0-12130 5 cfdpppdhffgeeffedeeepdjdgdfcddecccdccb
+F-H0-12131 4 pnpqopppnpoodpplpopd
+F-H0-12132 3 qdpqdpdfdc
+F-H0-12133 2 dppnpqdcpd
+F-H0-12134 4 eqippqfpfqepdqdpcqcpcnddpd
+F-H0-12135 4 npqqqppplpopcpnoqonnoopmqnpdondd
+F-H0-12136 2 gocqfqppeqgpdqdpfodoeofndlendcpd
+F-H0-12137 4 rdqhppqddppdqfodqcjdpcdd
+F-H0-12138 4 fqdppqdjjpjdpkddpfncpd
+F-H0-12139 2 fpdppqdjjpjdpkddpfncpd
+F-H0-12140 5 hohqfqhpppdpipcnfoddpd
+F-H0-12141 7 pfqeppqddpndpdddodpcrcocqcmcncqbnbobmb
+F-H0-12142 3 pfdppqqfpdcdjdnc
+F-H0-12143 2 fpfqjpqpdpcndcpd
+F-H0-12144 4 lpopqpepddpd
+F-H0-12145 2 qmdppqpoddpe
+F-H0-12146 3 dodqqqddpd
+F-H0-12147 2 codqqqddpd
+F-H0-12148 3 qldppqpnpcdc
+F-H0-12149 2 cepqdqdfdcpd
+F-H0-12150 3 bcdpppdhdffdceecpddcddcbcc
+F-H0-12151 2 qorqdrqqiqpqfqcqqprpppdpopqnrodnqlddpd
+F-H0-12152 2 efdejjddee
+F-H0-12153 2 fqpqdpcnecpd
+F-H0-12154 2 mqoqdqpdqpcd
+F-H0-12155 6 bdpqdpdecdceecpd
+F-H0-12156 4 qrpqqqfqeqppdqjpqpfpcpepqnpocnqldcpd
+F-H0-12157 2 rnpqqqfqeqppdqjpqpfpcpepqnpocnqldcpd
+F-H0-12158 7 fcdiqpcedpbecfpdbdeddcddcccdbc
+F-H0-12159 3 jpdppqdnfqpddd
+F-H0-12160 6 oomppqdpplpopcdc
+F-H0-12161 4 cqoqfqbpdpcnddod
+F-H0-12162 4 fccjeqqeppddcp
+F-H0-12163 3 dnpqjqfqdpcnddpd
+F-H0-12164 2 pnnqppqndpqdqjdd
+F-H0-12165 4 qcppdqpjodoemdnepcmeocqdncpddcnd
+F-H0-12166 3 ldppdqpjodoemdnepcmeocqdncpddcnd
+F-H0-12167 3 dofqdqcqdpppcmcpcecfcddedcpd
+F-H0-12168 2 fpfqppekdpijpdmidd
+F-H0-12169 2 nqkoppqndpjkpdigdd
+F-H0-12170 6 prppnqpndpqjqdddoc
+F-H0-12171 4 fqeqppcpepqdddoc
+F-H0-12172 2 dpeqppcpepqdddoc
+F-H0-12173 3 nqdrrqiqqqfqpqqpcqpprpopdproqnqodnqlddpd
+F-H0-12174 3 cepqdqdcpd
+F-H0-12175 2 depqdqdcpd
+F-H0-12176 2 popqdqdcpd
+F-H0-12177 6 icerdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcncfpdddfcccdb
+F-H0-12178 4 pgppqgdpqdphldofddod
+F-H0-12179 3 hcppdpfedhdegcpddchd
+F-H0-12180 3 mppqnqoqopqpdcpd
+F-H0-12181 2 pddppqcdedecfcdc
+F-H0-12182 5 qrrqprqqpqoqqpppqodpqnpopmpnqdddoc
+F-H0-12183 2 ncppdpokdcpd
+F-H0-12184 2 dippdpokdcpd
+F-H0-12185 2 nolqnqppdppjddoe
+F-H0-12186 5 pcqdppldcpddodrcqc
+F-H0-12187 5 fcdpppcfqfpdrdncdd
+F-H0-12188 6 cqpqeqfpdqepdpcpeododncoddpd
+F-H0-12189 3 lccnfqdjpppddpndpjddqf
+F-H0-12190 2 qnfqdpppcnjpjdpfddpdnc
+F-H0-12191 2 cidpfqdnppjdjpddqfncpd
+F-H0-12192 4 plqqrppqdpfqromprnjpqnqopnponnrmcnqlddpd
+F-H0-12193 2 lqnqfqdpppdcpd
+F-H0-12194 4 cfppqdddfc
+F-H0-12195 2 cpppqdddfc
+F-H0-12196 3 mddpppkdpiddpc
+F-H0-12197 3 jphppqcpeqcmendcpd
+F-H0-12198 2 kphppqcpeqcmendcpd
+F-H0-12199 5 fddqpqcdpdeceddcfc
+F-H0-12200 2 pmpqpoqpqncppdqocd
+F-H0-12201 3 fpdqpopddocd
+F-H0-12202 3 rqdrqqiqpqfqcqqprpppdpopqnrodnqlddpd
+F-H0-12203 5 ponppqeppdqodd
+F-H0-12204 4 opoqqppndp
+F-H0-12205 3 qnfqhqcqgqppeqgpfpcpdpcnddpd
+F-H0-12206 2 ncfqhqcqgqppeqgpfpcpdpcnddpd
+F-H0-12207 2 dbcpppcfpdddfc
+F-H0-12208 2 pjpdppncdpdcqf
+F-H0-12209 4 rpfqdpppqnnpcnjpddpd
+F-H0-12210 2 qkfqdpppqnnpcnjpddpd
+F-H0-12211 2 ndqfppncpd
+F-H0-12212 2 oeqfpdncdd
+F-H0-12213 5 oqppnqnpmpdppdnoddpjncqf
+F-H0-12214 2 qdppdppfpgofqfpdcfjdddfc
+F-H0-12215 7 cedppqcddeecpd
+F-H0-12216 3 fqppjqdpcejcpdgcdc
+F-H0-12217 2 cmdpoqqmqpqjcjddpd
+F-H0-12218 3 fpfqdpppddcnncpd
+F-H0-12219 2 pnnqppdppdqnfcdd
+F-H0-12220 3 cedppqqjqnqgqddcoc
+F-H0-12221 2 dedppqqjqnqgqddcoc
+F-H0-12222 3 qldpppqnckcedgcdcffcdedcpd
+F-H0-12223 2 qnnqppcfdppdgdcdedeckcdcfc
+F-H0-12224 5 onpqcpeppoooddpd
+F-H0-12225 2 qqpqcpeppoooddpd
+F-H0-12226 3 jdnqpqkqpodpqkddpd
+F-H0-12227 4 fqdpqpdjcedfcdcffcdedcpd
+F-H0-12228 4 rdrqqpqqpppqopnqcprproqnqopdpkndqfdd
+F-H0-12229 2 emdrercrnqfqeqcqdqppipcpdppndocndcpd
+F-H0-12230 7 qopqppoqopqpdpddpd
+F-H0-12231 4 opqrrqqqpqppnqdpqppoddpd
+F-H0-12232 3 nolqnqpppddpcd
+F-H0-12233 2 fcdppqchcfddpd
+F-H0-12234 4 jpdppqdnfqcipcdc
+F-H0-12235 4 qppqqqppnqqmdppddd
+F-H0-12236 3 drdqfqdpcqcmppddpd
+F-H0-12237 5 rdpipqpddpndqfcdof
+F-H0-12238 3 qfppeqcncpckqjdgcecfcddefcpddc
+F-H0-12239 5 pppedpec
+F-H0-12240 6 rddpppqeqdpeocdc
+F-H0-12241 3 cbppdpdepdccdc
+F-H0-12242 2 nqppdpedpdcccd
+F-H0-12243 2 kqqqqpopdpddpd
+F-H0-12244 2 pdjmjj
+F-H0-12245 3 qqdrercreqpqdqnqipfqdpcqpocpdocnddpd
+F-H0-12246 4 fcppeedppdcfjddcddcccd
+F-H0-12247 2 lpoqqpdcpd
+F-H0-12248 5 jppqmpopdppkdcpd
+F-H0-12249 6 ofppdpqeqfpepfjdcfpcddfc
+F-H0-12250 7 bcdiqpbedppdcfedbddddccdcc
+F-H0-12251 5 pfdqpqddqkncpd
+F-H0-12252 6 ppqpoplpnodpploopdondd
+F-H0-12253 7 omrpqqdppqrofqqnippnqocnpormonplqlddpd
+F-H0-12254 4 ceppeqoccpdcqd
+F-H0-12255 2 popqcpeqqdddoc
+F-H0-12256 2 plcppqpoqdddoc
+F-H0-12257 2 epcppqpoqdddoc
+F-H0-12258 2 oocppqpoqdddoc
+F-H0-12259 4 dpqppdjj
+F-H0-12260 4 plcqpqqoddqc
+F-H0-12261 7 bcppdqchcfbepdedbddddccdcc
+F-H0-12262 4 qnoqqppodppnqopddc
+F-H0-12263 2 mqoppqnpoqdppdqocd
+F-H0-12264 4 dhfqdpppcndedcpd
+F-H0-12265 2 mqopfqcnqppddpdd
+F-H0-12266 3 qjqpqoppqnjppmdpqdpnddon
+F-H0-12267 2 kcppdppjmdneocpdncnddcpc
+F-H0-12268 5 poqqpqcqdqqpppcpjpqndpcndobnempdqlcdcl
+F-H0-12269 5 oopqdpfqqojpdnqmddpd
+F-H0-12270 2 qqpqdpfqqojpdnqmddpd
+F-H0-12271 5 hqppfqhodqfodldodcpd
+F-H0-12272 3 ncdqpppdqfdd
+F-H0-12273 2 edppnqpddpcd
+F-H0-12274 5 qorqqqqppplpopdpnopopmoopdondd
+F-H0-12275 5 cnfqeqfpdqepcpdd
+F-H0-12276 4 cnjpfqdpppedpd
+F-H0-12277 2 cqjpfqdpppedpd
+F-H0-12278 6 cpdqfqdpcqcmppcecfcddedcpd
+F-H0-12279 4 qrrqqqpqppnqpoqppddpdd
+F-H0-12280 3 ecpdppcddpfcdedcddbccc
+F-H0-12281 3 lpopqpecpd
+F-H0-12282 6 fpkqipfqdpqpddpd
+F-H0-12283 6 pqppnpdpqnpnpmqmqdqldd
+F-H0-12284 4 rpnqdpfqqnppdnjpddpd
+F-H0-12285 5 oomppqdpfqpojpdnplddpd
+F-H0-12286 3 pbppdppjnepfddpdncjd
+F-H0-12287 2 ippqlppodpqkddpd
+F-H0-12288 2 ncpqlppodpqkddpd
+F-H0-12289 3 rpnqdpppqnpd
+F-H0-12290 4 pcppqhdpoeqfpdqcjdncdd
+F-H0-12291 2 ciqpdpcedcpc
+F-H0-12292 2 opqpdpcedcpc
+F-H0-12293 5 hrcqdrhppqdpfqdnfoddpd
+F-H0-12294 7 endqqpeogpdldoddpd
+F-H0-12295 5 cndqppcodopd
+F-H0-12296 2 dpdqppcodopd
+F-H0-12297 3 fqdppdpondpjddqf
+F-H0-12298 2 jqdppdpondpjddqf
+F-H0-12299 7 bdppdqchcfedpddddccdcc
+F-H0-12300 7 dcdqchqppdcfjdccdd
+F-H0-12301 4 ofoqdqqpqjqlqfqhdcpd
+F-H0-12302 6 cppqjpfqdpcoencndndmddpd
+F-H0-12303 7 ogpipqpfdpofpgqdqfpdqeddnc
+F-H0-12304 3 dfppdjdppdqindqfcdrdqcedic
+F-H0-12305 2 qpdppqpojpddqkncpfkcpdpbqc
+F-H0-12306 3 prppnqqndqddpc
+F-H0-12307 2 jpppnqqndqddpc
+F-H0-12308 3 ncpodpqfpdde
+F-H0-12309 4 rnopqpqolppocppdrodd
+F-H0-12310 2 fcppdqdedhpddcedebec
+F-H0-12311 3 pkppdpnpqnqlonddpd
+F-H0-12312 2 prlqnqppdppnnoddpd
+F-H0-12313 3 dnqpepcppd
+F-H0-12314 3 reppqhdpqdqfpdrdodqcjdpcdd
+F-H0-12315 4 dbppdpdedhpddcedfbecebcc
+F-H0-12316 3 rqqqqpoplpqodpporopdrndd
+F-H0-12317 2 djppcnfpdddpoc
+F-H0-12318 2 rpppqnnppddpec
+F-H0-12319 3 dppopdjjncqf
+F-H0-12320 2 qefqdpopcnjj
+F-H0-12321 2 ccpppdcecdedecdddc
+F-H0-12322 2 ropppqopoqqoqpdddp
+F-H0-12323 2 qfdppppeqepdqdocpc
+F-H0-12324 3 pnqpopdppedc
+F-H0-12325 2 pmqpopdppedc
+F-H0-12326 2 qqpqeppdpocd
+F-H0-12327 2 ldpqqdcpcdod
+F-H0-12328 7 cqnpfqdpqpeocnddpd
+F-H0-12329 3 fqppdpcncedfdcpd
+F-H0-12330 5 qppddqec
+F-H0-12331 2 fddppqdfdhcedcpd
+F-H0-12332 3 npdppqpojpjdqkddpfncpd
+F-H0-12333 3 kqpqdpfqcnqnddpd
+F-H0-12334 4 eppqqocppcdc
+F-H0-12335 2 pepqcdcpocqd
+F-H0-12336 2 iddppopdddfc
+F-H0-12337 2 qnnqppdpdepd
+F-H0-12338 3 hpppcpepdepd
+F-H0-12339 2 gqppcpepdepd
+F-H0-12340 3 pfppcnjpdjfpqhdppdpjddoh
+F-H0-12341 3 fqpphqjpdphojdpjddpfncpd
+F-H0-12342 4 pqqqfqnpcqdpqpeocnddpd
+F-H0-12343 4 dqfqeqepcppd
+F-H0-12344 6 cqjppqdpqoclcnddpd
+F-H0-12345 6 qidppqqnfqcnqpqkjpdcpd
+F-H0-12346 2 pfqrorprpqqqoqnqlqqpfqdpppqnipcnpoddpdnc
+F-H0-12347 2 qhfqcnppdkdpchqfcecfbebdpdfceddcddcccdbc
+F-H0-12348 4 jpdppqkdpkddpfncpd
+F-H0-12349 5 ocpodpijneqeodoeddnd
+F-H0-12350 5 cnfqdpqpqjjpddpd
+F-H0-12351 2 ofreppqdcpldodddqcrcpc
+F-H0-12352 2 fddppqdhdedcpdebcdcbcc
+F-H0-12353 2 qpqdcfkcddfc
+F-H0-12354 2 ppqdcfkcddfc
+F-H0-12355 5 efpqdpdgdfcfodqdddfc
+F-H0-12356 6 pdjppppjdpdjddjd
+F-H0-12357 3 pjpdqpddqfnc
+F-H0-12358 2 kpppnqqndqpd
+F-H0-12359 3 qpqopp
+F-H0-12360 2 odocpd
+F-H0-12361 5 qomppqdpkpooqkddpd
+F-H0-12362 3 fpeqfqdqepcppd
+F-H0-12363 2 qincqfqbpdpbqc
+F-H0-12364 3 qqppnqnodppjddmeqcqdpcpdncodnblc
+F-H0-12365 2 qflqnrqpqqpppqopnqmodppjddnencpd
+F-H0-12366 3 pnqqpqqpfqdppppoooddpd
+F-H0-12367 2 qoqqpqqpfqdppppoooddpd
+F-H0-12368 3 eqfppqdpfqgogpfoepddpd
+F-H0-12369 2 dqfppqdpfqgogpfoepddpd
+F-H0-12370 3 jqppeqcpdocodncmddpd
+F-H0-12371 2 cfppdpcgdfcedepdeccd
+F-H0-12372 2 pqdpdepood
+F-H0-12373 3 prppnqpndpcjddpd
+F-H0-12374 2 pjjqpppddpndqfdd
+F-H0-12375 2 pomppqjppkdppdddjd
+F-H0-12376 2 opmppqjppkdppdddjd
+F-H0-12377 3 cphqfqgqppfpgpdpcnddpd
+F-H0-12378 3 cqhqfqgqppfpgpdpcnddpd
+F-H0-12379 5 pqqqmqopqppddpddqf
+F-H0-12380 2 qrqqpqdpfqpoqmddpd
+F-H0-12381 2 fckqppeqcpddpd
+F-H0-12382 2 dokqppeqcpddpd
+F-H0-12383 2 gpkqppeqcpddpd
+F-H0-12384 6 dcdpppdfpdedcdddec
+F-H0-12385 5 rppqdpfqqnipdnpoddpd
+F-H0-12386 2 fdcnppdkfppddpedfccd
+F-H0-12387 4 dieqpdqoddcf
+F-H0-12388 2 nqqnppcedpoc
+F-H0-12389 3 lqnqppqfdpceodqdmdpcncocicdc
+F-H0-12390 2 cnfqppcfdpqegdcdedpckcecfcdc
+F-H0-12391 6 oqpqppfqdpqppoqoddpd
+F-H0-12392 3 cfdpppdheffedeeepdfcgddcdddbcc
+F-H0-12393 2 nfqfppofdpoepgrdneqdpdldodddqc
+F-H0-12394 7 cgppdpdgefcfdfpdcefcjddcddcc
+F-H0-12395 4 qqpqdpqlqnqddcoc
+F-H0-12396 3 qpdjdpdfcecfcddefcpddc
+F-H0-12397 2 qhdppqponqqnqppnqopjpd
+F-H0-12398 5 peqdpdqcdd
+F-H0-12399 7 ccdrercrhqqqeqnqdqfqrpcqdpppdocpqncnqkpdcffcdddb
+F-H0-12400 7 fopqipfqfpgpdpcndcpd
+F-H0-12401 7 qpdrqqpqcqiqdpfqqnppcnqlddpd
+F-H0-12402 6 nrlqrqqpqqpppqopnqnpdppjdcpd
+F-H0-12403 5 ckpqdpcedgcdcffcdedcpd
+F-H0-12404 3 qcdpppqhqfpdcfjdcdfdeceddcfc
+F-H0-12405 2 cnhqfqdpppdjcedfcdcffcdedcpd
+F-H0-12406 2 fohqfqdpppdjcedfcdcffcdedcpd
+F-H0-12407 5 monrlqqqqppqppnqoppddpddqiqcqfncrd
+F-H0-12408 7 qnkqdpfqroqpcnrnqmpnqjqgddpd
+F-H0-12409 6 dqfqipcqdpqpddpd
+F-H0-12410 2 hdoqqpdppdedcd
+F-H0-12411 4 mdpipqpfdpofpgqdogpdqfndqeddnc
+F-H0-12412 2 pooqqpqddpcd
+F-H0-12413 2 dhpqdpcedcpc
+F-H0-12414 4 jpdpfqdnppccpd
+F-H0-12415 2 drdpfqdnppccpd
+F-H0-12416 5 qjircqdrippqdpnqpofqqnqppnqodnfoddpd
+F-H0-12417 7 rqprqqpqoqqpppqodpqnpopmpnqdddoc
+F-H0-12418 3 qenqppjppndppjqfpdddjd
+F-H0-12419 7 rndrqqpqcqiqqpfqdpppqnpocnqlddpd
+F-H0-12420 3 dfpqdpdecfpdeccd
+F-H0-12421 6 nepodpijodqeddoe
+F-H0-12422 3 ncnqcqdqppjpcpdpqndocnembnclddpd
+F-H0-12423 6 pppqmpoodpnopoplonpcdc
+F-H0-12424 3 pqoqopqppndpedpd
+F-H0-12425 3 qnpqnpdppoqodepd
+F-H0-12426 2 icppdpefdhdefdpddccddbcccbbb
+F-H0-12427 7 cqeqfpdqdpppcpepeodocodndcpd
+F-H0-12428 4 nqdppqpofqnojpdnplddpd
+F-H0-12429 2 mqdppqpofqnojpdnplddpd
+F-H0-12430 7 bodqfqppcqdpcpcocndnpddkdd
+F-H0-12431 3 pcpppjdppdqfjdqcdd
+F-H0-12432 3 cdppdjdppdcfjdccdd
+F-H0-12433 2 omqlppqjdpqipkqhpjphpipdohodqfndofjdocdd
+F-H0-12434 5 cpiqfqdqcqdpppdcpd
+F-H0-12435 2 djkjddij
+F-H0-12436 2 ppkjddij
+F-H0-12437 6 qcphppoedpneofmenfddpepcpdncmd
+F-H0-12438 5 nnpqqqoqppnqmpoodpnopoplonqdddoc
+F-H0-12439 5 ereqpqdpfqcpgppocoencndndmddpd
+F-H0-12440 3 idqfppqddpldofddodrcqcrbpc
+F-H0-12441 2 mcppdpphpepcnencqdrbddqbqc
+F-H0-12442 7 cnpqhpepcpdpeofoendmdcpd
+F-H0-12443 2 nccnfqcfppqddpdc
+F-H0-12444 2 popqdpqdcfncddfc
+F-H0-12445 4 nqqqpqqpoqppopnppodppnqopdoocd
+F-H0-12446 3 ddqfdpqcoencpd
+F-H0-12447 2 pgqfdpqcoencpd
+F-H0-12448 7 bedqppcfchpdedbddddccdcc
+F-H0-12449 7 qjoqdpqpdcqc
+F-H0-12450 2 mnmqopqpnodppdmo
+F-H0-12451 5 rfoqdpqpqfqgpepfpdqeddqdqcpc
+F-H0-12452 7 lqpqjqfqiqkphqjphpipdphocnfoddpd
+F-H0-12453 6 onpqmpoodpplpopcdc
+F-H0-12454 5 ddqqdppe
+F-H0-12455 4 qhfqppdqdocpcncodmqjeicgciddpd
+F-H0-12456 2 qqpqdpnqpoplnoqdddoc
+F-H0-12457 2 lopqdpnqpoplnoqdddoc
+F-H0-12458 4 cndqppcododdpepc
+F-H0-12459 3 ddqpoppddpcdedec
+F-H0-12460 4 ncpqeqpkddpd
+F-H0-12461 4 qjqqdpnpdcpd
+F-H0-12462 2 qfdfqppddpcc
+F-H0-12463 2 ecppqedpcdkcpc
+F-H0-12464 2 qgdppqqiqdddoc
+F-H0-12465 2 cqppcndpqddkcd
+F-H0-12466 2 nqppqndpqdpkcd
+F-H0-12467 4 dqfqdpcqcmppcecfcddedcpd
+F-H0-12468 2 qjpodpecpd
+F-H0-12469 5 fqdpppcgdgefcfdfpdcefcjddcddcc
+F-H0-12470 3 qdiqbqdqcpcqboppdnepdd
+F-H0-12471 3 ddqqrqpqqpkqrooppndppd
+F-H0-12472 3 qqqpppdp
+F-H0-12473 3 lpopqpdppddedc
+F-H0-12474 2 fdopqpdppddedc
+F-H0-12475 4 ppqqdpccpc
+F-H0-12476 5 dmopfqdpqpdncnddpc
+F-H0-12477 6 cbpqdpdfdgdecfpdceddcdecdcccdbbc
+F-H0-12478 3 jdppjpdppjpdjjdd
+F-H0-12479 2 qnpppjdpjjpdjddd
+F-H0-12480 3 jdpppjdpjjpddjdd
+F-H0-12481 7 jqpqiqfqhqjphpipdphocnfoddpd
+F-H0-12482 3 ofdppqneoeodqd
+F-H0-12483 2 oddpoeofcdpepc
+F-H0-12484 3 nppqpopddocd
+F-H0-12485 2 pmqpopdpoddc
+F-H0-12486 3 qfdppqncpd
+F-H0-12487 2 kddppqncpd
+F-H0-12488 2 pfdppqncpd
+F-H0-12489 3 meppredpqdneddodrcqcmcpc
+F-H0-12490 2 gdppdpefcgdedcpdebcdcbcc
+F-H0-12491 4 fohpfqdppd
+F-H0-12492 7 deppdfcpcedgpdefddcf
+F-H0-12493 3 qmqqdpqhqjqdddoc
+F-H0-12494 2 qoqqdpqhqjqdddoc
+F-H0-12495 2 pfoqdpqpqjqlddqc
+F-H0-12496 2 popqdqjpddpd
+F-H0-12497 6 hqpqkqmqpddpddqo
+F-H0-12498 5 onppqnjppddpjdqldd
+F-H0-12499 2 cqhqfqdpppdjpjddpd
+F-H0-12500 4 jdfqdpppdnjpdjpjddpd
+F-H0-12501 4 fqdpqpcecfcddedcpd
+F-H0-12502 2 nppqnqoqopqppddpdc
+F-H0-12503 6 pcpfqdodocnc
+F-H0-12504 6 pejjpdoe
+F-H0-12505 4 podppqqnfqcnjpecpd
+F-H0-12506 3 qpdppqqnfqcnjpecpd
+F-H0-12507 2 pmqpoplpdpcepd
+F-H0-12508 6 ddoqdppe
+F-H0-12509 4 fpenppcnjppddpdddj
+F-H0-12510 7 dqppcoepdepd
+F-H0-12511 4 qoppqnjppmdpqdpnddon
+F-H0-12512 6 pqnqoqopqpdcpd
+F-H0-12513 3 qcqfpdrdnd
+F-H0-12514 6 molqpqjqfqiqkphqjphpipdphocnfoddpd
+F-H0-12515 3 cnpqdpfqddqc
+F-H0-12516 3 ndcqpdqpddqf
+F-H0-12517 4 fcfqpqcpqkddpd
+F-H0-12518 2 djdqpdppcdcnic
+F-H0-12519 2 qodcoc
+F-H0-12520 2 edqpqe
+F-H0-12521 3 cfppqndppdfcdd
+F-H0-12522 3 qhdpfqqfppddpd
+F-H0-12523 5 mpdppqqnfqpnqponjpcnpmpjqhddpd
+F-H0-12524 2 jpdrfqdpppcnckcedgcdcffcdedcpd
+F-H0-12525 3 rpdrqqiqpqfqcqqpdpppqnopdnqlddpd
+F-H0-12526 7 dphppqcpepeofoendmdcpd
+F-H0-12527 7 cgdppqdgdfcfdecepdcddddcecdbcccbbc
+F-H0-12528 3 fddppqdfdecfpdeccd
+F-H0-12529 2 fedppqdfdecfpdeccd
+F-H0-12530 3 doppcndpcfdnqdcldc
+F-H0-12531 6 qopqppoqopqpdddp
+F-H0-12532 4 popqdpipddpd
+F-H0-12533 4 jpppnqpndppjddmeqcqdpcpdncodnblc
+F-H0-12534 2 kpppnqpndppjddmeqcqdpcpdncodnblc
+F-H0-12535 2 qcnfqfpdlendlcjc
+F-H0-12536 2 ocnfqfpdlendlcjc
+F-H0-12537 7 kdpfppcecppdnelcnchcjcdc
+F-H0-12538 3 cfppcedpqddfdc
+F-H0-12539 2 ocppcedpqddfdc
+F-H0-12540 4 fqeqepqppdcpdc
+F-H0-12541 3 dpdqqpcododcpd
+F-H0-12542 3 ccdpppqdcffcdddb
+F-H0-12543 2 dodqppcfddpdfcbd
+F-H0-12544 2 pfppqnnponcpolqlpkplpjqkpiqjogqhpdqgdd
+F-H0-12545 2 pfpqdpfqqnqponmpcnjpqkqiddpdncpc
+F-H0-12546 4 nppmppoedpee
+F-H0-12547 4 oaqeppqddpndpfddpdpcodocrcmcqcrbncqbnbobmb
+F-H0-12548 3 chdpppcgbgdfcfcebfbedecdpdecfddcddbcccbbcb
+F-H0-12549 5 qddqppodpjmdoepcneocmencpddcnd
+F-H0-12550 2 fedpoqdhcedcpd
+F-H0-12551 3 qopopqjjpd
+F-H0-12552 3 hphqdrgqfqdpppcngpdcpd
+F-H0-12553 2 dfdqcqppcpjpcndpbndopjempdclcded
+F-H0-12554 2 nqppjppjdpmeqcdepcqdncpddcodnblc
+F-H0-12555 3 rpnqqnpppddpddcifccfccbd
+F-H0-12556 2 jddrcqiqdpfqcnppddqfncpd
+F-H0-12557 7 pnpqdpfqqnqponjpcnpmpjqhddpd
+F-H0-12558 4 ocqppjdpneqfpdmdndqcddnc
+F-H0-12559 2 dddqpqpd
+F-H0-12560 4 ddnpdppd
+F-H0-12561 3 dcnpdppd
+F-H0-12562 2 qpnppddodd
+F-H0-12563 7 kpjqpqiqfqhqjphpipdphocnfoddpd
+F-H0-12564 4 nodppqpoooonddpd
+F-H0-12565 2 eddpppefeededcpd
+F-H0-12566 6 medppqdfhehdfeddpdlckdjcjdicidhcfc
+F-H0-12567 4 mpqpopponoooddpd
+F-H0-12568 2 nnqpopponoooddpd
+F-H0-12569 4 cnfqdpnpddpf
+F-H0-12570 3 dnfqdpnpddpf
+F-H0-12571 7 ncdpqeqfqdpfcdpepc
+F-H0-12572 3 pnoqpqppfqdpqppoqoddpd
+F-H0-12573 2 qnoqpqppfqdpqppoqoddpd
+F-H0-12574 2 ncpqdpqdpfocoddc
+F-H0-12575 2 pppqnpcppoqoddqd
+F-H0-12576 7 cfdpqpcededcpd
+F-H0-12577 3 mcqdppdddppcodpbocobnb
+F-H0-12578 2 qoprnroroqpqopqppddpdd
+F-H0-12579 3 gcppdqdecgpddccdcbcc
+F-H0-12580 5 nqdqppqnpdec
+F-H0-12581 2 qldqppqnpdec
+F-H0-12582 7 noqpopooddpd
+F-H0-12583 3 ncqqrqpqqpkqdpopropdpnddqf
+F-H0-12584 4 dcqodpqd
+F-H0-12585 3 dpqpddqe
+F-H0-12586 2 djdppjddjd
+F-H0-12587 2 pnlqnqjqmppplpkpdppjddpd
+F-H0-12588 2 eqpqnqoqopqpnpqnpd
+F-H0-12589 2 dppqnqoqopqpnpqnpd
+F-H0-12590 6 pppqqqnqdpqppopddd
+F-H0-12591 3 ccdpfqcnppddpdhcfc
+F-H0-12592 2 fedpfqcnppddpdhcfc
+F-H0-12593 4 reqeqdod
+F-H0-12594 3 fpdmpppfdpfd
+F-H0-12595 5 clcnqppddpcdqf
+F-H0-12596 4 bdqqdpddcffcpd
+F-H0-12597 3 pjnqdpppqnccpd
+F-H0-12598 4 ncjqpppddpddjc
+F-H0-12599 4 pjdpppdjjjddpd
+F-H0-12600 2 cnppjjjppddpdd
+F-H0-12601 3 qfjqpppddpeddjcddgic
+F-H0-12602 2 clpqmppojpqkdpcjddpd
+F-H0-12603 2 qnppdedppc
+F-H0-12604 4 eprqqrpqqqqpoqcpppropoqornpnqnrmonqmqdpmdd
+F-H0-12605 4 iqpqhqfqdpipcnfoddpd
+F-H0-12606 3 hppqhqfqdpipcnfoddpd
+F-H0-12607 2 pjdpppcgdfcedecdpddcddccec
+F-H0-12608 2 jpdqeqcqppcpdpcodocmdnddpd
+F-H0-12609 4 nqjqfqdpqpddpd
+F-H0-12610 2 cfdpppddqdjcfc
+F-H0-12611 6 chppcgdpqddgddcffcbd
+F-H0-12612 2 oqpqopppoo
+F-H0-12613 6 jddpppdjpjdfpdddfc
+F-H0-12614 4 fcdpppqfpeqdpdddpcqclcncobqbnbpb
+F-H0-12615 5 qodpppqmqhqjqddcoc
+F-H0-12616 7 pcpopqodcpddqdncoc
+F-H0-12617 5 ocppphdpoeofnenfmepeddpdpcmdncqc
+F-H0-12618 4 deqpdodcpd
+F-H0-12619 2 edpqdpcdpe
+F-H0-12620 2 cjdrcqpqdpiqdnfqddpd
+F-H0-12621 2 qjdrcqpqdpiqdnfqddpd
+F-H0-12622 4 dnppepcpddpepc
+F-H0-12623 3 hdqpqddpcdec
+F-H0-12624 4 gddpppiddffdpcddfc
+F-H0-12625 2 cqippqfpfqdpdnddpd
+F-H0-12626 5 nqpppqmpoodpnopoplonpcdc
+F-H0-12627 6 reppqdcpldodddqcrcpc
+F-H0-12628 3 qpqqpqponqpddpdd
+F-H0-12629 5 deqpoppddpdc
+F-H0-12630 3 rqqqpqppnqpoqppddpdd
+F-H0-12631 7 pqqqfqeqppdqjpcpfpqnepcnqldcpd
+F-H0-12632 5 hqcqeqpppdcodd
+F-H0-12633 2 pjdooqedpd
+F-H0-12634 4 dgppdpegcgdegcpddccdcbcc
+F-H0-12635 3 cjppdpegcgdegcpddccdcbcc
+F-H0-12636 3 ohpqdpqnqkqfqhqdcfkcddfc
+F-H0-12637 4 rlkqdpfqcnqpqkqlqjpkdcpd
+F-H0-12638 2 plkqdpfqcnqpqkqlqjpkdcpd
+F-H0-12639 7 onrqqrpqqqqpoqcpppropoqornpnqnrmqdqmdd
+F-H0-12640 5 neppdprdqeqdpeocdc
+F-H0-12641 7 lcpqdphedffehdpdddkdjcjdicidhcfc
+F-H0-12642 6 cedqppcfchpdbebdeddcddcccdbc
+F-H0-12643 6 pqppoqopqpdddp
+F-H0-12644 7 rmqrrqqqpqoqqpppcpporornqoqnpnqdqmdd
+F-H0-12645 2 fqdpqpcepc
+F-H0-12646 7 ofoedpcdpepc
+F-H0-12647 3 qnjqeqfqdqppcpfpcnepdcpd
+F-H0-12648 3 qjjqeqfqdqppcpfpcnepdcpd
+F-H0-12649 2 mdmeqfpdocodncndlcpc
+F-H0-12650 5 nddpppqfpjddpdnckd
+F-H0-12651 2 ncfqdpppcnpjddpd
+F-H0-12652 2 icppdppjcfpdddfc
+F-H0-12653 7 jcpqdphedffehdpdddjdicidhcfc
+F-H0-12654 2 fcqhpppendqdpcddqbqcob
+F-H0-12655 2 ddqqqrqpordppqponpqlpd
+F-H0-12656 2 rpqqpqppoqopmqdpqpqoqmnopddd
+F-H0-12657 3 lqnqppcqpjddpd
+F-H0-12658 5 nopqpopmddpd
+F-H0-12659 2 dedpoqpdeccd
+F-H0-12660 2 nppqqodpcepd
+F-H0-12661 2 fqoqqpdpecpd
+F-H0-12662 2 dhdpqocedcpd
+F-H0-12663 3 dmppephppdcpddqf
+F-H0-12664 2 onqpoplppddpddcf
+F-H0-12665 6 pkqqrppqdpfqrojpqnqopnpocnonrmomplqldcpd
+F-H0-12666 3 bdjqpppddpddcffc
+F-H0-12667 2 pjjqpppddpddqfnc
+F-H0-12668 4 dppqepeqdncpddpd
+F-H0-12669 3 cndqppcofppddocd
+F-H0-12670 2 rjpqdpfqqnqppnmponjpcnpmpjqhddpd
+F-H0-12671 2 ncpqdpfqqnqppnmponjpcnpmpjqhddpd
+F-H0-12672 2 ohpqdpfqqnqppnmponjpcnpmpjqhddpd
+F-H0-12673 7 eedpppdddecdceecpd
+F-H0-12674 5 qqpqqpoqppopnppodppnqopdoocd
+F-H0-12675 3 mnlqnqkqkpjqjphqipppdplpnomolopngopddd
+F-H0-12676 2 popqdpfqdjcedfcdcffcdedcpd
+F-H0-12677 2 qleqfqdqppcpjpqnfpcnepqddd
+F-H0-12678 4 jpdpfqcnppddpfncpdkcqcpb
+F-H0-12679 2 prppnqqndppddficddfcccdb
+F-H0-12680 6 poopqpnoooddpd
+F-H0-12681 3 bnppendpcndodmcopddncd
+F-H0-12682 2 cgdfppdecpcedgpdefddcf
+F-H0-12683 2 qldpppqncjcedfcdcffcdedcpd
+F-H0-12684 5 nqpppqopoqdpqpqoddpd
+F-H0-12685 2 qcppdppeqepdqdddpcoc
+F-H0-12686 6 cnqpdidpcecfbebdpdfceddcddcccdbc
+F-H0-12687 6 cfdpppdepdddcdhcfcdcccfbdbebcb
+F-H0-12688 5 mdppmedpcemfqdnemcoddc
+F-H0-12689 6 oprprqdpqproppqooopoddpc
+F-H0-12690 2 qidppppiqhohphqfpdofnddfjdddfc
+F-H0-12691 4 oqcqqpddpd
+F-H0-12692 2 fpcqqpddpd
+F-H0-12693 6 qcpfpqqdcpddod
+F-H0-12694 6 qlpqrpfqdpjpqnpocnpnqmpmddpd
+F-H0-12695 4 qcoqdpqpqjqlqfqhrdpdddnd
+F-H0-12696 3 qnfqdpppcnipdcpd
+F-H0-12697 3 cfppfqepdqdpcqcpbqgobpcocnbopdcldd
+F-H0-12698 3 cmerdrhqcreqfqdqcqdpppdocpemcnddpd
+F-H0-12699 5 pkqnpppldppdqlcd
+F-H0-12700 7 pmqrrqqqpqoqqpppcpporornqoqnpnonrmqdqmdd
+F-H0-12701 3 pppecpde
+F-H0-12702 3 dqopdcod
+F-H0-12703 4 fqqrorprpqqqoqnqppqpkpdppoqnddpd
+F-H0-12704 4 nrpqqqoqnqmqppqpopnpdppd
+F-H0-12705 2 qopqqqoqnqmqppqpopnpdppd
+F-H0-12706 4 qppqqqdqcqppcpjpqndpcndobnempdqlcdcl
+F-H0-12707 5 oqqqpqppnqmpoodpnopoplonqdddoc
+F-H0-12708 4 cpqpdqcnddpd
+F-H0-12709 2 odppdpcfdcqd
+F-H0-12710 7 qodpkqrofqqnqpcnrnqmpnqjqgddpd
+F-H0-12711 3 ddfqdpppcnpd
+F-H0-12712 2 dqppcfpdddfc
+F-H0-12713 2 ecfqdpppcnpd
+F-H0-12714 3 qcjqpppjdppdqfdd
+F-H0-12715 3 fccnppqfdpqdodddndpcjdocnc
+F-H0-12716 2 lqnqppdpdjcedfcdcffcdedcpd
+F-H0-12717 4 fqeqepcppd
+F-H0-12718 3 ncppdppkddpd
+F-H0-12719 3 nqppdppkddpd
+F-H0-12720 4 ccppdppdqfnccffcdddb
+F-H0-12721 2 rpdrdpnqqnfqcnppddpd
+F-H0-12722 3 rnpqqqdqcqppqpjpcpdpqnpocndobnempdqlcdcl
+F-H0-12723 2 dppopqcdpd
+F-H0-12724 2 dqpqpdedcd
+F-H0-12725 4 polppqdpqkdcpd
+F-H0-12726 3 fpcnkqpdqpdcdp
+F-H0-12727 2 dncnkqpdqpdcdp
+F-H0-12728 2 qjqpdqopddpd
+F-H0-12729 5 ncpqdpfqqnqponmpcnjppjqhddpd
+F-H0-12730 6 gdppdpfdpdddfc
+F-H0-12731 2 kpnqppdppdgd
+F-H0-12732 4 doppcnjpdmdpdldnpdemcdel
+F-H0-12733 6 nedpoqofphpeoemdpcdd
+F-H0-12734 2 polqnpfqdpqpddpd
+F-H0-12735 2 jpdqpqjdqkncpfdcpd
+F-H0-12736 2 dodqpqjdqkncpfdcpd
+F-H0-12737 5 qeppqhdpqgpgpfqfpdpcjdncdd
+F-H0-12738 6 oomppqcpeppoplddpd
+F-H0-12739 4 bdhqbqdqppcqcpepbopddnddcffc
+F-H0-12740 3 mqorprnrpqoqnqppopnpmpnodpmooopjddpd
+F-H0-12741 2 dnqpeqcpddpd
+F-H0-12742 4 fcdpppefdhdefepdeegddcdd
+F-H0-12743 6 pqnqoqopcqpdqpcd
+F-H0-12744 6 beppdpcfchpdedbddddccdcc
+F-H0-12745 5 egdqchqpdecfpdbfjdcdddccdc
+F-H0-12746 2 kddppqcnfqddipncpd
+F-H0-12747 2 hqpqdpfqdjpedd
+F-H0-12748 2 nddoppncpjdcpd
+F-H0-12749 6 mpppnqnpdppjqnpdddjd
+F-H0-12750 3 qrpqqqoqppnqmpfqdpooponoonmonnplddpd
+F-H0-12751 2 rppqqqoqppnqmpfqdpooponoonmonnplddpd
+F-H0-12752 3 oqrqqrpqqqqppprodpqopopnrnqmqnqdddoc
+F-H0-12753 2 rgoqdpqprfqgqfpfperepdqeddqdqcrcqbpc
+F-H0-12754 3 mppqcpplpoddpd
+F-H0-12755 4 blerbrdreqcrcqdqbqcpppcodpcndobndndmcmclbmddpd
+F-H0-12756 2 fqerbrdreqcrcqdqbqcpppcodpcndobndndmcmclbmddpd
+F-H0-12757 2 dcppjqdppdfdcd
+F-H0-12758 2 pnnpqppddpddjc
+F-H0-12759 3 pjqnpppdcpjddjfdcfdd
+F-H0-12760 2 eddqpecdndpc
+F-H0-12761 4 eqdrercriqfqdqcqdpppdocpdcpd
+F-H0-12762 3 qpdpoqpoecpd
+F-H0-12763 5 eeqpdhdppddedcgd
+F-H0-12764 2 qqpqdpqmpoddpc
+F-H0-12765 4 qfdrercrhqfqeqcqdqcpppcndppddodd
+F-H0-12766 5 fbeepppddpjdcfdddccdccfc
+F-H0-12767 2 fcrpqqdppqrofqqnjppnqocnpormonplomqkqlpkqiddpd
+F-H0-12768 6 qpqqppqndpqdqlcd
+F-H0-12769 5 onpqmpoodpplpoqddcoc
+F-H0-12770 5 onpqmpfqdpjppooodnplddpd
+F-H0-12771 2 hcfqhqppdppdddfc
+F-H0-12772 2 pepqdpciddcffcbdccpc
+F-H0-12773 4 rhqhpprgdprfqiqepipdqgndqfjdofdd
+F-H0-12774 6 pdoqdpphofoepenemdpcdd
+F-H0-12775 3 qcdpppqfpjofpdrdnddd
+F-H0-12776 2 nolqnqppeppiddpc
+F-H0-12777 3 jppqnqoqopqpnppodppd
+F-H0-12778 2 jdkppqdppkecpd
+F-H0-12779 3 qopqppqpmpjpdpqkdcpd
+F-H0-12780 2 qqpqppqpmpjpdpqkdcpd
+F-H0-12781 6 rqqqpqppnqdpqppopddd
+F-H0-12782 4 qpdppqqnqhqjqdddoc
+F-H0-12783 5 oqpqmqnqnpmpeppdpodd
+F-H0-12784 2 ppcpcdqd
+F-H0-12785 2 cccpqpqd
+F-H0-12786 6 fddpppidheddpdhchdgcfc
+F-H0-12787 3 eofpppdndpddpd
+F-H0-12788 3 lcdoppddpjncpd
+F-H0-12789 2 jdfqpqcppkdcpd
+F-H0-12790 2 jpfqpqcppkdcpd
+F-H0-12791 3 ncdppqqnfqcnjpqjqoqfpoddpd
+F-H0-12792 6 cfprqqnqppkqdppdpnddqiqcqfncrd
+F-H0-12793 3 nceqdrppdqjpcpdpcodocnpjddpd
+F-H0-12794 6 eqdqpqcpdpcododdpd
+F-H0-12795 2 dcppeqdedfpdddedeccd
+F-H0-12796 6 poqrrqqqpqppqpdpqlqnqddcoc
+F-H0-12797 2 ncppdpdgegffeffecfpdeeedceddhdcccdbc
+F-H0-12798 4 okpqdpfqqnqppnmponjpcnpmqkqiddpd
+F-H0-12799 2 doeqqdqodd
+F-H0-12800 2 jdpqkqmqhqfqpddpddqo
+F-H0-12801 5 djfqppdqdocpdncocnddcffcpd
+F-H0-12802 6 pbpqdppknepfddpdnckd
+F-H0-12803 6 qqpppqdpnpqoqnpnpmqmqdqldd
+F-H0-12804 5 ropqrpfqdpjpqnqopnpodnqlddpd
+F-H0-12805 6 pdpppgofneoeodqdddld
+F-H0-12806 3 djpodpddcffcpd
+F-H0-12807 3 rpnqdpppqndepd
+F-H0-12808 6 oqoppqqodpdjddpd
+F-H0-12809 4 denrlqqqqppqppnqopdpmokdpjdcpd
+F-H0-12810 2 ndpjqfpd
+F-H0-12811 3 pippdpqfpdcded
+F-H0-12812 2 qfpqdpddponcpd
+F-H0-12813 3 ekdppqcmckcedgcdcffcdedcpd
+F-H0-12814 5 dpdqqpfogpeododlenddpd
+F-H0-12815 4 mqprppnqpndpqjqdddoc
+F-H0-12816 3 qqpqppnqmpoodpnopoplonqddcoc
+F-H0-12817 2 nnpqppnqmpoodpnopoplonqddcoc
+F-H0-12818 3 qlrrqqqrqppqdpnppopddd
+F-H0-12819 3 cidpppfddedcpdcbcdbbcc
+F-H0-12820 5 qdqfpdqcnc
+F-H0-12821 5 oqqqpqppnqmpfqdpooponoonplddpd
+F-H0-12822 3 cnnrpqopppnpqodpqnpoplnopdonttdd
+F-H0-12823 6 cqdrdqeqcpppcodpcndoddpd
+F-H0-12824 2 jddpqqdfgdddqc
+F-H0-12825 6 bbdppqchcgdgdfcfdecepdcddddcecdbcccbbc
+F-H0-12826 6 fcppdqchcfcepdbebdeddcddcccdbc
+F-H0-12827 3 jpdppqdnfqqipdqfqcrdncdd
+F-H0-12828 3 fcdpqpdgcecfcddedcpd
+F-H0-12829 6 dqppfqdpcqcpcneopddjcd
+F-H0-12830 2 rdqdqfpdqcnc
+F-H0-12831 4 edppepcdpd
+F-H0-12832 2 cfpqdoddpd
+F-H0-12833 5 cqdqppfpdoecpd
+F-H0-12834 4 nopsnrqroqorlqqqqppqppnqopnppjdppddd
+F-H0-12835 6 lopqdpnqpofqnoplddpd
+F-H0-12836 4 cqpqqc
+F-H0-12837 5 qodppqqnfqcnjpqjpoddpd
+F-H0-12838 4 reppqicpqdqfpdrdodqcddpc
+F-H0-12839 3 qfdppppdddjd
+F-H0-12840 2 qfdpppdjddpd
+F-H0-12841 5 rqdrqqiqpqfqcqqprpppdpopqnrocnpkddpd
+F-H0-12842 5 fpbrcrfqhqcqeqbqdqdpppeoepdocpcofopdendd
+F-H0-12843 6 bddpppchcfedpddddccdcc
+F-H0-12844 4 mpqqqppqppnqoodqpjqnpdddjd
+F-H0-12845 2 medpppqfjpqcpjpcoencqddcpd
+F-H0-12846 2 fddhpppddpdcdeebcdcbcc
+F-H0-12847 4 rrqqqrqppqdpnppojpjdqkncpfdcpd
+F-H0-12848 4 qpqrqqircqdrippqdpfqponpdnfoddpd
+F-H0-12849 2 qhoqcnqpdjfppddpddqf
+F-H0-12850 4 qfoqdpqppfqeddpc
+F-H0-12851 3 nrmqqqqppqppnqnodppjddpd
+F-H0-12852 4 opqqdrpqiqcqfqdpqpqnppcnpkddpd
+F-H0-12853 3 jdjqpqdpqocfpdddfc
+F-H0-12854 5 dqbqcqhpppcpepddpd
+F-H0-12855 4 oprqqrpqqqqppppodpqlqnqddcoc
+F-H0-12856 2 pgqdpplddpcdodec
+F-H0-12857 2 efqdpphddpcdedoc
+F-H0-12858 3 cfqjdppdpodd
+F-H0-12859 2 ldppdppjncpfdcpdpbqc
+F-H0-12860 2 kqqqprppnqpndqpjddpd
+F-H0-12861 5 nqdrrqiqqqfqpqqpcqpprpopdproqnqocnpkddpd
+F-H0-12862 2 npdppqooopnoqoqnpopnqd
+F-H0-12863 3 qlcqdrdpiqcnfqqjppddpd
+F-H0-12864 2 fqdpppqjpdcficddfcccdb
+F-H0-12865 6 dcdpppchcfddpdcdcc
+F-H0-12866 3 cfpqcqpdddfc
+F-H0-12867 5 onqpoqlpcpddpd
+F-H0-12868 4 qpqoppqnjppmdpqdpnddon
+F-H0-12869 2 pfpqdpqdodld
+F-H0-12870 2 pgpqdpqdodld
+F-H0-12871 4 orerqrqqdreqcrdqpqqpfqipcqdpnppocpdocnddpd
+F-H0-12872 3 dekppqdpqkdcpd
+F-H0-12873 4 kplqnqppcppnnopcdd
+F-H0-12874 5 cqdrjpfqdpppddpd
+F-H0-12875 3 hqdpfqhoppdnjpddpd
+F-H0-12876 3 qfppqdcpldogddod
+F-H0-12877 2 gcpqdpgedhdedcpd
+F-H0-12878 5 qqprppnqpndqqiddpc
+F-H0-12879 3 eofqnpqpdpcndcpd
+F-H0-12880 2 dnfqnpqpdpcndcpd
+F-H0-12881 2 clcnpqqddpdc
+F-H0-12882 2 cnfqdpqpcdpc
+F-H0-12883 2 lnlqnqkqkpjqjphqipppdpmpnolplomogopnmnpddd
+F-H0-12884 3 nbppcqpjqcqdpcpdncodcclc
+F-H0-12885 5 nomppqdpfqpoiponoocnplddpd
+F-H0-12886 5 cqhppqcpepeodpenfocndmddpd
+F-H0-12887 4 pliqqoqpqnpppmcpqjpnpdonddom
+F-H0-12888 4 gpdqqpdldodcpd
+F-H0-12889 2 hddqppdhdedcqd
+F-H0-12890 6 jcppdphedjfedfjdhdidddocicfchc
+F-H0-12891 4 ncqipprecpqeqfqdrdpdrcodqcddpc
+F-H0-12892 3 hddppqdhfegccedcpd
+F-H0-12893 2 qqqpoqlpondppdqmcd
+F-H0-12894 5 noqrnrorrqmrqqpqnqoqppmqopqpdpnpqopddd
+F-H0-12895 5 cpiqpqdqfqdpcqddpd
+F-H0-12896 2 pjppeqqfpddd
+F-H0-12897 2 fcdpoqcfddpd
+F-H0-12898 2 cndppqpdce
+F-H0-12899 2 kcppeqddqd
+F-H0-12900 3 qmqqdqqhqjqdddoc
+F-H0-12901 2 qeoqdpqpqjqldcqc
+F-H0-12902 4 ncqnfqcnpppjnpdjdppdjcdd
+F-H0-12903 2 qnpqcqqdddoc
+F-H0-12904 5 dodqpdopcd
+F-H0-12905 5 driqfqdqcqdpppdocpdcpd
+F-H0-12906 4 bqcrcqdqppcpdpcmdoddpd
+F-H0-12907 5 crcqdqqpfpdoddpd
+F-H0-12908 3 ddkqeqfqdqgpppepcppdcn
+F-H0-12909 2 cmppdpckcedgcdcffcdedc
+F-H0-12910 3 qmdppqpoqdddkc
+F-H0-12911 3 ogpfppqedppepgpdqfcdof
+F-H0-12912 6 qkdrercrhqqqeqnqdqfqrpcqdpppdocpqncndcpd
+F-H0-12913 3 fqppdpcnqeddpc
+F-H0-12914 3 rdppdppjqfpdofnddd
+F-H0-12915 6 dpekppijpdmidd
+F-H0-12916 6 dqpqiqfqdpcqddpd
+F-H0-12917 6 cpdqfqipcqdpqpddpd
+F-H0-12918 3 cfcqpppdddfc
+F-H0-12919 4 dfppdpeffedeeepdecdddccc
+F-H0-12920 3 jpppnqqndqcjdcpd
+F-H0-12921 4 djdpppjjjpjdpjddpd
+F-H0-12922 5 qqprppnqdpcdqnpc
+F-H0-12923 4 mcqippddcppcjcgc
+F-H0-12924 4 pcnrlqqqqppqppnqopdpmomdpjddneocpdncnd
+F-H0-12925 5 dgdppqdfcfjdpdddfc
+F-H0-12926 3 nqhqjqpppddpddpjncqf
+F-H0-12927 2 cmnqppjpqndpcjchpddd
+F-H0-12928 5 qppppqdpqopoqddcoc
+F-H0-12929 5 opqrrqqqpqppnqdpqppopddd
+F-H0-12930 3 cfcqdrdpiqcnfqjdppddpfncpd
+F-H0-12931 4 qorqdrqqiqpqfqcqqprpppdpopqnrocnpkddpd
+F-H0-12932 3 fqdreqgqcqdqppcpdpcodocmenddpd
+F-H0-12933 2 ebdpppcgefcedecdpdgcdddcecdbcc
+F-H0-12934 3 dbbpfqcnppdfdppdfcdd
+F-H0-12935 2 fofqfpgpdppd
+F-H0-12936 5 nqpppqmpoodpnopoplonqddcoc
+F-H0-12937 5 mpppnqnpdppdcfjdddfc
+F-H0-12938 4 qpqqdrcqiqdpfqqnppcnpkddpd
+F-H0-12939 2 dmdodqpdppdc
+F-H0-12940 2 lddpppodqdcd
+F-H0-12941 2 fdpqdppdqncd
+F-H0-12942 2 edpqdppdqncd
+F-H0-12943 5 qpppqqdpccpc
+F-H0-12944 5 gpfpfqdppd
+F-H0-12945 5 ddppdqdedhpdeefddced
+F-H0-12946 5 pmdppqpoqmonomnmqddcoc
+F-H0-12947 4 rrrqqrpqqqqpppqooppodpqlqnqddcoc
+F-H0-12948 4 cfppcddpqcgdeceddcfc
+F-H0-12949 6 dreqgqcqdqppcpdpcodocmenddpd
+F-H0-12950 4 iqfqhqpphpipdphocnfoddpd
+F-H0-12951 2 qocdeqpc
+F-H0-12952 3 idppdpjpngpjnephddpfncpd
+F-H0-12953 2 qipqmppojppkdpreqfpdddjd
+F-H0-12954 6 nolppqdpnpqoqmoodcpd
+F-H0-12955 3 fpcnqpdidpcecfbebdpdfceddcddcccdbc
+F-H0-12956 3 dnfqdpppcipdhdjddc
+F-H0-12957 2 qhppdhdppddjcdqfic
+F-H0-12958 4 docqdqcpqpcnkppddpddcl
+F-H0-12959 5 oomppqdpjppoqkdcpd
+F-H0-12960 2 eppqcodqdcpd
+F-H0-12961 2 mcppnqodcpddqd
+F-H0-12962 5 poqqdrnqpqqplqdpfqcnppddpd
+F-H0-12963 2 dfdpoqdhdeeepdddfddced
+F-H0-12964 3 odpppedpndmdedpcocncmcnb
+F-H0-12965 2 nonroqpqmqnqnpmpeppdpodd
+F-H0-12966 3 efcpppcgdedcpd
+F-H0-12967 3 dpqnpqqkqpdcpd
+F-H0-12968 3 idpqdpnqpoqpqnqopnqhpjqddjocddfc
+F-H0-12969 5 oqpqppqpdpqopoqddcoc
+F-H0-12970 6 jpdpfqdnppjdpjddpfncpd
+F-H0-12971 5 qrerdrqqcreqpqdqfqipcqdpnppocpdocnddpd
+F-H0-12972 6 pqoqppnqnpmpjpdpnoqnpddd
+F-H0-12973 2 nqppdppjcepddcjd
+F-H0-12974 4 repqpfcpqdodddqcrcpc
+F-H0-12975 2 dhpqdpdefdqddccdcbcc
+F-H0-12976 5 icpqdpbeedpddccdccbc
+F-H0-12977 4 cpcoqpcnkpdmdppdendddn
+F-H0-12978 5 eeppdqdedhpddcfd
+F-H0-12979 2 eceppdedcd
+F-H0-12980 2 plpopqdopd
+F-H0-12981 6 gcppdpheidpdddhdhcfc
+F-H0-12982 6 qoqqqppplpopcpnooopmqnpdondd
+F-H0-12983 6 cddpppcgdeddpddccc
+F-H0-12984 6 ddjppppjdpjjpd
+F-H0-12985 4 fohqpqdpfqjdqkncpfdcpd
+F-H0-12986 5 empphpepcpdpeofoenfncndmdcpd
+F-H0-12987 4 cnppcijppddpdc
+F-H0-12988 2 fqcnppdfdppdfdcd
+F-H0-12989 4 ncdjpppdjpjddpddqf
+F-H0-12990 2 jdjpppdppjdjpdddfc
+F-H0-12991 5 dppppdjjddjd
+F-H0-12992 3 cddpppcfdcpd
+F-H0-12993 5 fpfqipppdpdnddpd
+F-H0-12994 5 pfdppqnepkncpddclc
+F-H0-12995 2 mpdppqponqnofqloplddpd
+F-H0-12996 2 lqdppqponqnofqloplddpd
+F-H0-12997 2 pqqodqqeddnd
+F-H0-12998 2 dinpdpqodcqe
+F-H0-12999 3 nqppqndpcdqkpc
+F-H0-13000 2 ccdppqddqdicfc
+F-H0-13001 3 neeqppcpodqdddmc
+F-H0-13002 3 qceqppcpodqdddmc
+F-H0-13003 5 qrrqqqpqppqpdpqlqnqdddoc
+F-H0-13004 5 qqppnqnpmpnodppjqnpdddjd
+F-H0-13005 3 efdpppcgdedcpc
+F-H0-13006 3 qqmqopqpqddpdd
+F-H0-13007 2 coopdqdoddpd
+F-H0-13008 2 dlopdqdoddpd
+F-H0-13009 6 ceppdpcfchpdbebdeddcddcccdbc
+F-H0-13010 4 lcpqponqqnqppndppjqopdncdd
+F-H0-13011 2 qleqnqqjqpddpd
+F-H0-13012 2 fcpopqqnnqpmqpqicppdqodd
+F-H0-13013 2 qnkqeqfqdqppcpgpcnepdcpd
+F-H0-13014 2 qjppdqpdcfgdcdedeckcdcfc
+F-H0-13015 5 eddqppdhdeeepddcfd
+F-H0-13016 2 efdpoqchcfddpd
+F-H0-13017 6 fpenppcndpqeclddmcpcjchc
+F-H0-13018 3 nckqdpfqcnqppkqlqjplpjqkqfokddpd
+F-H0-13019 6 rqrpqpopppqolppodppdoodd
+F-H0-13020 4 pppqmpfqdpjppoooonnocnplddpd
+F-H0-13021 6 nnqpqqlpppcpopqonooopmqnpdondd
+F-H0-13022 2 epnqppcpqndcpd
+F-H0-13023 3 cfgrfrerfqcrcqgqbqeqppdqepgpdpfpfocpcoddpd
+F-H0-13024 6 qdcqppqcpjncpdcclc
+F-H0-13025 5 mopqoqppnqnpmpjpdpnoqnpddd
+F-H0-13026 5 qrqqpqdpnppojpjdqkncpfdcpd
+F-H0-13027 5 ncppdpffdhefgecffedeeepdjdgdfcddecccdccb
+F-H0-13028 2 phpqofqgddqdocld
+F-H0-13029 5 rpdrcqiqdpfqqnppdnnpddpd
+F-H0-13030 3 ooopqppmlpcddppc
+F-H0-13031 3 fpoqhqfqdpqpdcpd
+F-H0-13032 2 qjoqhqfqdpqpdcpd
+F-H0-13033 2 ocqdcpddqo
+F-H0-13034 2 epppcecpqd
+F-H0-13035 3 efdpppcgdefdbedcpd
+F-H0-13036 4 chdpppcidhcgeffddedcpdebcdcbcc
+F-H0-13037 3 cpcqdpcnclpd
+F-H0-13038 2 ckdrdpfqcncqqjppddpd
+F-H0-13039 2 ndepppdepjncpd
+F-H0-13040 2 dkcnpppejpeddp
+F-H0-13041 5 qboqdpqprfqgqfpfpeqepdqdddrcqcpc
+F-H0-13042 5 fofqipppfpgpdpcndcpd
+F-H0-13043 5 rfppdppjqdqfqcoencpddcpc
+F-H0-13044 5 ompqdpqmpoplpmpddd
+F-H0-13045 4 qqrppqdpfqroipqnqocnpoddpd
+F-H0-13046 2 iqdqfqdpqpqopppoopqmddpc
+F-H0-13047 4 ppqqpqdpfqpoipcnooddpd
+F-H0-13048 2 opqqpqdpfqpoipcnooddpd
+F-H0-13049 3 ciqpcnfpqddpdc
+F-H0-13050 3 qqqpopmpondppdqncd
+F-H0-13051 3 qqlqnqppdppjdjpdddjd
+F-H0-13052 2 nolqnqppdppjdjpdddjd
+F-H0-13053 3 pnppdpqoqnpjddpd
+F-H0-13054 6 eqdrercrdqfqipcqdpqpdocpddpd
+F-H0-13055 4 qqpqcpnppopd
+F-H0-13056 2 pqdpdefdqddc
+F-H0-13057 2 obpedpocpc
+F-H0-13058 2 fppqhqjpdphojdpkddpfncpd
+F-H0-13059 3 nperdreqcrdqpqipfqdpcqpocpdocndcpd
+F-H0-13060 2 mcdqpppecfdecdidpcddfcecccdcdbebcb
+F-H0-13061 5 eqpqjpfqfpcqdpgpfocnddpd
+F-H0-13062 4 qhdppqcnfqqfjpddpd
+F-H0-13063 2 drfqdqcqdpppdocpcmcocecfcddedcpd
+F-H0-13064 2 fcdpppqjpdddjd
+F-H0-13065 2 qhdpppqjjpddpd
+F-H0-13066 2 fpdrercrnqfqeqcqdqppjpcpdpqndocnddpd
+F-H0-13067 2 ncdrercrnqfqeqcqdqppjpcpdpqndocnddpd
+F-H0-13068 3 nddpppqfpjofpddd
+F-H0-13069 2 qdppdppjpfpdmdndncmcdclc
+F-H0-13070 4 cppqdqdpcododdpd
+F-H0-13071 2 ncpqdppkccpd
+F-H0-13072 2 jdpqdppkccpd
+F-H0-13073 4 ornrqrrqpqqqoqnqmqppqpopnpdppd
+F-H0-13074 4 fcdodqpdqpcdedec
+F-H0-13075 2 pppqcpeppoqodcpd
+F-H0-13076 4 gpfpfqdpcnddpd
+F-H0-13077 6 ddoqdpdedhpdeefddced
+F-H0-13078 2 qckqdpfqcnqpddpdnclc
+F-H0-13079 2 qfkqdpfqcnqpddpdnclc
+F-H0-13080 2 ckjppqdpfqcpcoencndndmddpd
+F-H0-13081 3 cqdrjppqdpfqdnfoddpd
+F-H0-13082 2 gpdrjppqdpfqdnfoddpd
+F-H0-13083 3 qqpqpomqnocppdpldd
+F-H0-13084 2 qnnqpppddpcdcjec
+F-H0-13085 2 lqnqpppddpcdcjec
+F-H0-13086 4 neoeppqdod
+F-H0-13087 2 npdpkqrofqsnrpqnqpcnqormpnqmqgqjpddd
+F-H0-13088 2 mpdpkqrofqsnrpqnqpcnqormpnqmqgqjpddd
+F-H0-13089 3 oqqpcpddqd
+F-H0-13090 2 opqpcpddqd
+F-H0-13091 4 nqrprqopoqnpqproppqolppodppdoodd
+F-H0-13092 2 efppdpdfdhdeeepdceedddecdcebcbdb
+F-H0-13093 4 nlpqdpqmpopmonomnmqddcoc
+F-H0-13094 4 orppqqdpqppoccpd
+F-H0-13095 5 djkqcnqpqdfpdddp
+F-H0-13096 5 nroqpqmqnqnpmpeppdpodd
+F-H0-13097 2 noprqrpqqqppqpoplprodpqopornoopdqndd
+F-H0-13098 2 dfppdpdedhpdeeddedcdfcbddcecccfbbceb
+F-H0-13099 4 rcdpoqrfqpqfqgpepfpdqeddqdqcpc
+F-H0-13100 2 ppncdpdcpd
+F-H0-13101 3 qopqdpedcedcpd
+F-H0-13102 2 pmpqdpopqodcpd
+F-H0-13103 5 qnoqpqppqpdpqopoqddcoc
+F-H0-13104 4 olfqopqpdplponqnddpd
+F-H0-13105 6 pqppoqopqpdpddpd
+F-H0-13106 2 cepqdqcjdcpd
+F-H0-13107 2 cnpqdqcjdcpd
+F-H0-13108 6 kqeqfqdqgpppepcppdcn
+F-H0-13109 3 qddpoqpdqpddqc
+F-H0-13110 2 qdppcedpqcpddc
+F-H0-13111 4 pohrcqdrhppqdpfqdnfoddpd
+F-H0-13112 3 jpdppqcdpkecpd
+F-H0-13113 3 dnfqhqppgqhpipfpdphoddpd
+F-H0-13114 2 cfppdpheidpdddhdhcfdgcfc
+F-H0-13115 2 ccdpppdiefcgdedcpd
+F-H0-13116 2 fqdqppcmdodkenddpd
+F-H0-13117 2 pfqhpgqgqfpdrdnc
+F-H0-13118 4 cmeqhpppcpenqdddoc
+F-H0-13119 2 qfppeqofcpddqdocld
+F-H0-13120 6 mnlppqdpnpqonoooqmnnqlpmdcpd
+F-H0-13121 3 pnopkqdpfqdnqpddpd
+F-H0-13122 2 fqdppqddqekcpc
+F-H0-13123 6 pppqqqmqopqppddpcd
+F-H0-13124 4 cnpqeqfqdqgpcpepddpd
+F-H0-13125 4 qffqdpppcnjpqjqmddpd
+F-H0-13126 4 fbppdpdfcecfpddecdfddc
+F-H0-13127 5 cmerdreqcrdqfqipcqdpppdocpemcnddpd
+F-H0-13128 6 pfdppqnepkddpdnckd
+F-H0-13129 3 nlqnppqmjppmdpolpnpdonddom
+F-H0-13130 5 pcpfodqdqcrc
+F-H0-13131 2 ppcpddqe
+F-H0-13132 2 ncpqqqfqqpppdpjprnpoqnomcnqldcpd
+F-H0-13133 2 jpppdqqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-13134 2 clcnfqdjqpgedppdfceddcddcccdfbhc
+F-H0-13135 2 lplqnqppcpdcpd
+F-H0-13136 2 dodqooddpd
+F-H0-13137 2 jppopdeodd
+F-H0-13138 3 poerdrnqcreqpqdqfqipcqdpcpdocnddpd
+F-H0-13139 2 pfdpkqdnfqddppncpd
+F-H0-13140 2 nddpkqdnfqddppncpd
+F-H0-13141 6 qgppdpqmqjqdddnc
+F-H0-13142 2 ppqqjj
+F-H0-13143 4 qdppqicppdqfddqc
+F-H0-13144 6 qrqqpqdpnppoqkddpd
+F-H0-13145 2 qodppqpjqdddoc
+F-H0-13146 4 ebdefdpddccdcbcc
+F-H0-13147 4 dqpqjpcqdpqoclcnddpd
+F-H0-13148 2 qddpppqfqhcepdqcjddc
+F-H0-13149 4 jpdpoqcnfqddqe
+F-H0-13150 3 nnpqdpfqqnjppnqoonpodnooddpd
+F-H0-13151 4 coqqqrqpordppqpofqennpdncnqldmddpd
+F-H0-13152 5 erhqdreqfqdpcqcnppddpd
+F-H0-13153 3 dfeqpppcddfc
+F-H0-13154 2 cpeoppdfpd
+F-H0-13155 2 mdppdppidepc
+F-H0-13156 2 copdppidepcd
+F-H0-13157 5 qfpgppneofpdoeodqdddld
+F-H0-13158 2 qjjqeqfqdqppcpfpcnepddpd
+F-H0-13159 4 dndqppcpfpcodoqdcndd
+F-H0-13160 2 cnnqppjppndppjgdpdddjd
+F-H0-13161 4 qqpqdpmqpoqmonqddcoc
+F-H0-13162 2 plpqdpmqpoqmonqddcoc
+F-H0-13163 4 onpqdpfqqnqpcnjpqkqidcpd
+F-H0-13164 2 ncpqdpfqqnqpcnjpqkqidcpd
+F-H0-13165 6 cpdqcqppcndppdcldc
+F-H0-13166 2 edprqqnqppkqdpcdqnpc
+F-H0-13167 2 peprqqnqppkqdpcdqnpc
+F-H0-13168 3 fqdpppqjqmqgqdddnc
+F-H0-13169 4 dbdpppcgdecepdddcddccc
+F-H0-13170 4 nrprorpqoqnqppopnpmpnodpmooopjddpd
+F-H0-13171 5 nprqrpoqopqproppqolppodppdoodd
+F-H0-13172 2 occopqecqd
+F-H0-13173 3 cpcndqpdppdd
+F-H0-13174 5 rqqqqpoplppdcpdd
+F-H0-13175 2 fohqfqdpppcecfcddedcpd
+F-H0-13176 2 ppdqoc
+F-H0-13177 2 ncpqeppkddpd
+F-H0-13178 6 nomppqpoooonpldcpd
+F-H0-13179 5 obppdppjndqdddpdqcodpcocnclc
+F-H0-13180 2 cfqqqrqporpopqqknppdcpdd
+F-H0-13181 5 rpqqpqqpfqdppprojpqnqopnpocnqlddpd
+F-H0-13182 5 mqpqnpnqeppdpodd
+F-H0-13183 4 rfppdpqhcipeqfpddejdqdgdqcpcdc
+F-H0-13184 5 qoqqpqppqpdpqmpopd
+F-H0-13185 3 onpqqqoqqpnqppopnppodppnqopdoocd
+F-H0-13186 2 efpqdpcfdfdeeeceddpdecfddcedcccd
+F-H0-13187 6 jdkqdpfqcnqpncpfdcpd
+F-H0-13188 5 onpqmpepcpoopoplddpd
+F-H0-13189 2 ncpqdppodcpd
+F-H0-13190 6 reodpfqcqdpcrc
+F-H0-13191 4 dedpppdgpdeccd
+F-H0-13192 2 hqfqdpppddqekcpc
+F-H0-13193 5 pppqnppoeppdqodd
+F-H0-13194 3 cdppeqdeecpd
+F-H0-13195 2 hddpppdhfegccedcpd
+F-H0-13196 3 ocdqcoppdcqd
+F-H0-13197 2 oddqcoppdcqd
+F-H0-13198 6 cnerdreqcrdqfqipcqdpqpdocpddpd
+F-H0-13199 5 cippdpdhcgeffddedcpdebcdcbcc
+F-H0-13200 2 oqcoqpdcpd
+F-H0-13201 2 cfdpfqddpp
+F-H0-13202 2 qfdmpppdjpdddp
+F-H0-13203 3 cnoqdpfqddpe
+F-H0-13204 2 dnoqdpfqddpe
+F-H0-13205 3 fcqprqppqqoppqdpnqrorpqoqnqlpdcfdd
+F-H0-13206 2 kderdrhqcreqfqdqcqdpppdocpddcnncpd
+F-H0-13207 2 cmppfqcjcpddpd
+F-H0-13208 2 qhppdpqjqdddnc
+F-H0-13209 4 qnpqnpfqdpcqpoqoeocnddpd
+F-H0-13210 2 qppqnpfqdpcqpoqoeocnddpd
+F-H0-13211 2 nqppdppdgd
+F-H0-13212 2 jjjpppdpqidjjdddpc
+F-H0-13213 2 fqdppqdjjpjdqkddpd
+F-H0-13214 3 ereqdqppdkdoddpd
+F-H0-13215 3 ncqfnfocpdlcnd
+F-H0-13216 6 crerdrdqfqipcqdpqpdocpddpd
+F-H0-13217 4 nnpqppnqmpoodpnopoplonpd
+F-H0-13218 3 ncoqdpfqcnipdcpd
+F-H0-13219 2 qpoqdpfqcnipdcpd
+F-H0-13220 6 qrrqqqpqppnqdpqppopddd
+F-H0-13221 6 cpppdqfpcodoqdcndd
+F-H0-13222 4 qhpgqgqfpdrdnc
+F-H0-13223 3 pmppqndpplqlpdpkcd
+F-H0-13224 2 ehdiqpchdppddhddcf
+F-H0-13225 5 dcoqcqpd
+F-H0-13226 2 ecppnqqndqdfjppdcdddbdccdcbcbbdb
+F-H0-13227 2 bbppnqqndqdfjppdcdddbdccdcbc
+F-H0-13228 6 snkqdpfqrorpqnqpcnqormrnqmpnqjqgddpd
+F-H0-13229 3 jqhqcqeqpppdcodd
+F-H0-13230 2 nqppdpchecceccpd
+F-H0-13231 5 fcqdppcddpocedec
+F-H0-13232 2 ckqpcokpcndpdmcppdendddn
+F-H0-13233 3 nrqqpqnqoqppmqopqppddpcd
+F-H0-13234 2 npqqpqnqoqppmqopqppddpcd
+F-H0-13235 4 qeppqgdppfpgodqfddqd
+F-H0-13236 3 npdppqpnpdce
+F-H0-13237 4 kqqqprppnqdpcdqnpc
+F-H0-13238 6 qpqqppnqoodqpjqnpdddjd
+F-H0-13239 5 qooqdpfqpoqpdnipddpd
+F-H0-13240 4 ofpfppqedppdpgcdqf
+F-H0-13241 2 popqdpiqddpd
+F-H0-13242 4 nmqoqpqnpppmdpompnpdondd
+F-H0-13243 5 feoqdpdfdhdeeepdddfddced
+F-H0-13244 2 qqqpoplpdpqnonpddd
+F-H0-13245 2 elhpppcpepcnenddpd
+F-H0-13246 3 dmppcndpcidnpddkdc
+F-H0-13247 2 epipkqfpfqdpqpddpd
+F-H0-13248 2 gdppdqffchdfdcpd
+F-H0-13249 4 nqpqqroqqqrpppqpopnpqodppnropdqndd
+F-H0-13250 4 mpnrqrrqorqqmrnqpqppoqopmqdpqpqonpnopddd
+F-H0-13251 6 pqlqqqqpnqppdppjcldjcedfcdcffcdedcpd
+F-H0-13252 3 qqpqdpqmpoqdddnc
+F-H0-13253 2 onpqdpqmpoqdddnc
+F-H0-13254 4 dndqppcpdococnddcffcpd
+F-H0-13255 3 rddpfqcnppqjjppiqlqfqhofpdddnd
+F-H0-13256 3 qedpfqcnppqjjppiqlqfqhofpdddnd
+F-H0-13257 3 cgpqdpcfdfcedepdeccd
+F-H0-13258 3 pmqpoqdppoqopnqnpddc
+F-H0-13259 2 qjpqeqqdddoc
+F-H0-13260 2 popqeqqdddoc
+F-H0-13261 6 dmqqqrqpordppqpofqdnnpqlcnddpd
+F-H0-13262 3 prqqpqrpfqdpjpqnpocnqlddpd
+F-H0-13263 2 pnqqpqrpfqdpjpqnpocnqlddpd
+F-H0-13264 4 qnfqdpppcnjpqjqdddoc
+F-H0-13265 2 cnnqppjppndppjddpdgcjd
+F-H0-13266 2 npgqppdpjpjdpjddpfncpd
+F-H0-13267 3 pocppqqnepddpd
+F-H0-13268 2 dncppqqnepddpd
+F-H0-13269 5 fpenppcndpcddkpc
+F-H0-13270 4 cfppdpjjqjpdddfc
+F-H0-13271 4 ogpppfdopdpgjdqfdd
+F-H0-13272 3 opqpcecopdjcdc
+F-H0-13273 3 qleqoqqjqpdcpd
+F-H0-13274 5 ebpqdpcgchdfdgdecfpdceddcdecdcccdbbccbbb
+F-H0-13275 2 nppqkpqkdppdddjd
+F-H0-13276 2 qpcodqqddd
+F-H0-13277 2 dppqpdeccd
+F-H0-13278 2 drdpfqcnppqjcjcedfcdcffcdedcpd
+F-H0-13279 2 hqfqdpooddoe
+F-H0-13280 5 edppdppddcddcccd
+F-H0-13281 4 rdoqdpqpqjqlqfpddcnc
+F-H0-13282 4 pjlqnrqpqqpppqopnqdppdmoddqiqcqfncrd
+F-H0-13283 6 qpqqlqnqppdppjcldjcedfcdcffcdedcpd
+F-H0-13284 3 omqnpppmjpqedpddpn
+F-H0-13285 2 ofdppfqopdpgjdqfdd
+F-H0-13286 6 idpqdppknepflepdkdldjdlcddkcncjc
+F-H0-13287 3 qepqdppgqgqfpfqdoddc
+F-H0-13288 6 lqpqjqfqiqkphqjphpipdphodnfodcpd
+F-H0-13289 2 djfqdpppjdjpddpjncpd
+F-H0-13290 6 drdqfqipcqdpqpdocpddpd
+F-H0-13291 4 ndppqhdpceqfpdofdc
+F-H0-13292 3 ppdppqpoqopnpd
+F-H0-13293 2 qpdppqpoqopnpd
+F-H0-13294 4 qnnqppdqddqd
+F-H0-13295 3 jdpqdpqkedpfncpd
+F-H0-13296 2 ipdpfqdnopcipddc
+F-H0-13297 4 nhqpofdppdphjdqfdd
+F-H0-13298 3 olpppjcppdqljddjfdcfdd
+F-H0-13299 4 rcqipprecpqdqfpdrdodqcddpc
+F-H0-13300 2 cnfqdppppdcfjdddfc
+F-H0-13301 2 pippdpqfdjddcffcpd
+F-H0-13302 2 lcppnqqnjpdddpncpd
+F-H0-13303 5 norrrqqrpqqqqpppqooppodpqlqnqddcoc
+F-H0-13304 5 qmrrqqqrqppqdpnppoqkddpd
+F-H0-13305 3 opdrercreqfqdqcqipqpdpcpdocnddpd
+F-H0-13306 4 npdppqqoqmooddpd
+F-H0-13307 4 fpcpndqd
+F-H0-13308 3 jnpqjplpdpqkdcpd
+F-H0-13309 4 oqqppqppopnppoeppdqodd
+F-H0-13310 5 dmppcnjpqddpdcdn
+F-H0-13311 5 popqpdcqdd
+F-H0-13312 6 efpqdpdhdeeepddcgd
+F-H0-13313 2 gcppdpdicedcpd
+F-H0-13314 4 cqdrdppqdnfqdcpd
+F-H0-13315 5 pedpppciqhqfpddejdqdgdqcpcdc
+F-H0-13316 4 dofqiqcqdqppdpcpdcpd
+F-H0-13317 2 jdpqdpjpdipkdcpd
+F-H0-13318 2 cnpqdpfqddqe
+F-H0-13319 2 ppqqpqmpkpdpoopoqkddpd
+F-H0-13320 4 fedppqefdhdeeepddcgd
+F-H0-13321 5 oqdrercrhqpqeqfqdqcqppqpdpcppoqodocnddpd
+F-H0-13322 4 jpdppqcnfqedpd
+F-H0-13323 2 drdppqcnfqedpd
+F-H0-13324 4 mnmqoqlqmpqpdppnooonnnnmplcdpd
+F-H0-13325 2 ddeppppc
+F-H0-13326 5 onpqmpfqdpippooocnplddpd
+F-H0-13327 4 pppqqqqpdpqlqnqddcoc
+F-H0-13328 6 rcpqpfcpqdodddqc
+F-H0-13329 2 oceqqqcpdcqd
+F-H0-13330 2 cfeqqqcpdcqd
+F-H0-13331 2 gqpqdpipjdpkddpfncpd
+F-H0-13332 5 pjqnppjjpdqfnd
+F-H0-13333 3 ppdqpdcedc
+F-H0-13334 6 nqpqqqoqppmqopqppddpcd
+F-H0-13335 6 ddpqdpdheffedeeepddcgd
+F-H0-13336 3 fqcnpppddpidqfcd
+F-H0-13337 2 dnpqdpfqddpkncpd
+F-H0-13338 3 qqerdroqcrhqpqeqfqdqcqppqpdpcppoqodocnddpd
+F-H0-13339 2 qnerdroqcrhqpqeqfqdqcqppqpdpcppoqodocnddpd
+F-H0-13340 2 pkpmkqqeqpdddp
+F-H0-13341 2 poeqpqmpqkddpd
+F-H0-13342 3 bddpppcgdecdpdecdddccccbbc
+F-H0-13343 6 qddppqqfqhddpdqc
+F-H0-13344 4 bndqcqppcpdpcndopdcldc
+F-H0-13345 2 fphqfqepdqdpcqcpqpddpd
+F-H0-13346 3 mpppnqnpeppjdepd
+F-H0-13347 2 npnqppdpkpqnpjdcpd
+F-H0-13348 6 pgpfdppdqojdqfdd
+F-H0-13349 2 qodppqpnqdddnc
+F-H0-13350 2 fdppfqdfcppddc
+F-H0-13351 2 cmpqdpippodjddpd
+F-H0-13352 6 rqqqpqppqpdpqlqnqddcoc
+F-H0-13353 6 cpdqcqqpcnkppddpddcl
+F-H0-13354 4 pnpqdpfqpoqpqnjpdnqoddpd
+F-H0-13355 2 nnqqrppqdpfqrojpqnqopnpodnqlddpd
+F-H0-13356 2 qedpnqqnpppjodqdddld
+F-H0-13357 5 pqdrqqiqcqfqdpqpqnppcnpkddpd
+F-H0-13358 3 deppdpfeeepdcded
+F-H0-13359 2 efppdpfeeepdcded
+F-H0-13360 6 hcdppqnepklepfkdpdjdldidlcddkcncjc
+F-H0-13361 2 fqpqnqoqopqppddpcdqf
+F-H0-13362 2 pmpqdpfqpoqpqnqodcpd
+F-H0-13363 2 lpfqdrppdpjpdnpjddpd
+F-H0-13364 2 ncppdppjdfpdddjddbfc
+F-H0-13365 3 cqdppqclcnddpd
+F-H0-13366 2 qnhqfqpppddpcd
+F-H0-13367 2 ecfqcnppdjdppdiccd
+F-H0-13368 4 qqpqdpnppojpjdpkddpfncpd
+F-H0-13369 2 nopqdpnppojpjdpkddpfncpd
+F-H0-13370 2 oppqqodpecpd
+F-H0-13371 2 nppqqodpecpd
+F-H0-13372 3 mporppqqdpqppoccpd
+F-H0-13373 2 ceqqdpcddeccpdebdd
+F-H0-13374 3 kcppdppjddpfncpdpbqc
+F-H0-13375 2 kdppdppjddpfncpdpbqc
+F-H0-13376 2 popqcedppd
+F-H0-13377 4 dodqppcfchpdcebdbefceddcddcccdbc
+F-H0-13378 6 qpqqpqdpqlqnqddcoc
+F-H0-13379 5 qdppdpqhcipdqfjddegdqcpcdc
+F-H0-13380 3 qgpqdpnqpoqpqnqopncjqjqdddoc
+F-H0-13381 6 pcpfpqodcpddqdncoc
+F-H0-13382 2 nqppdpdjdcpd
+F-H0-13383 4 opdqcoqpdcpd
+F-H0-13384 5 qcpqdpqhqfpdcfjdddfc
+F-H0-13385 3 djppdpcnddcffcpd
+F-H0-13386 2 fcppfqcndpcfddpd
+F-H0-13387 3 pgogpfofpeoepd
+F-H0-13388 3 qkqrerorqqdrhqcreqpqdqmqqpfqdpcqpocpdocnddpd
+F-H0-13389 2 qlqqoqnqmqdqlqqpppmpnppnpddd
+F-H0-13390 2 popqhqfqgqcqeqgpfpcpdpdnddpd
+F-H0-13391 2 ocqqpppqdpnpqoqnpnpmqmqdqldd
+F-H0-13392 2 feqfppqddpidodddndpcncocfc
+F-H0-13393 2 pkpqdpnqpoqpqnqopnpiqfpddd
+F-H0-13394 3 pepppfdpqepgpdqfcdof
+F-H0-13395 2 ccdppqefdgdfcfodqdddfc
+F-H0-13396 2 ndncppecpd
+F-H0-13397 2 pjdoppdepd
+F-H0-13398 2 cjdoppdepd
+F-H0-13399 2 clppegdpefdgcfffeefepdedhdddcdccbddb
+F-H0-13400 5 ndpqpfcpodqdddpcncoc
+F-H0-13401 3 dlqpdqcoopddpd
+F-H0-13402 5 pmpqlpnpdpnoqoqmoodcpd
+F-H0-13403 2 ccqpdpcfddbdfcpc
+F-H0-13404 4 qmdpkqcnfqrlqpqkqlqjpkddpd
+F-H0-13405 2 pjdpkqcnfqrlqpqkqlqjpkddpd
+F-H0-13406 4 pldppqpofqdnjpcdpd
+F-H0-13407 3 dqqqdcqd
+F-H0-13408 2 eqqqdcqd
+F-H0-13409 6 rpdpkqrofqqnqpcnqormrnqmpnqjqgddpd
+F-H0-13410 3 pqqqqpnpdppddc
+F-H0-13411 3 qrqqpqdppdpncd
+F-H0-13412 2 qppooqpdjpddep
+F-H0-13413 4 bndqcqqpcpkpcndppddoddcl
+F-H0-13414 5 qbppdppjndqdddpdqcodpcocnclcobpb
+F-H0-13415 5 nprqlqqqqppqppnqopdqpjdcpd
+F-H0-13416 4 dmdodqenqpfmempdcmdd
+F-H0-13417 2 hoppgqepcpfogogndcpd
+F-H0-13418 3 gepqdppknepflepdkdldjdlcidkcddjcnchc
+F-H0-13419 4 cocqhpppcpepeodpenfocnfnemdmdcpd
+F-H0-13420 2 prqqpqppnqmpcppoooonnonnmopdpldd
+F-H0-13421 2 popqdpfqdnjppddd
+F-H0-13422 3 qgofpqodqdddld
+F-H0-13423 4 pnnqppfqjpnodpjjdn
+F-H0-13424 4 dnfqdqeqipppfpgpdpgofocnddpd
+F-H0-13425 5 kbpqdppknepfddpdnckdpbqc
+F-H0-13426 2 cgcqcrpphqhofqfodqdodldiddpd
+F-H0-13427 4 ofqhjjpdqf
+F-H0-13428 4 qnopqponmppddpcd
+F-H0-13429 3 nnqppplpopoodpqnnoonpmpd
+F-H0-13430 2 qcpppgqfneofpdoeodqdddld
+F-H0-13431 4 orqqqrcqirqpdrippqdpfqponpdnfoddpd
+F-H0-13432 2 odjjppqdcpdd
+F-H0-13433 6 qnpqcpeppoqoddpd
+F-H0-13434 4 ddefqpeedgpdfehdedcd
+F-H0-13435 3 pjdpppdjqfdfcecfcddefcpddcnc
+F-H0-13436 2 rddpppdjqfdfcecfcddefcpddcnc
+F-H0-13437 3 qodppqpnpdcfjdddfc
+F-H0-13438 3 oqopqppndppd
+F-H0-13439 2 qpdedppddcfd
+F-H0-13440 4 ncdpoqofphpeoepdnemdpcdd
+F-H0-13441 2 doephpdpcpfoqodmeopdendd
+F-H0-13442 3 cidppqcddebdceecpd
+F-H0-13443 5 doqpdqfppdcocd
+F-H0-13444 6 bgdppqchcgdgdfcfdecepdcddddcecebccdbbccbbb
+F-H0-13445 3 gpipfqfpppdpdnddpd
+F-H0-13446 2 pqppnpdpqnpnpdpkdd
+F-H0-13447 6 bcdpppchcfbepdedbddddccdcc
+F-H0-13448 2 cmdodqpdqocd
+F-H0-13449 3 ceeqppdfdeddpdeceddccd
+F-H0-13450 2 eeeqppdfdeddpdeceddccd
+F-H0-13451 5 crerdriqfqdqcqdpppdocpdcpd
+F-H0-13452 5 pappdppjndqdddpdqcodpcocnclcqbpbobnb
+F-H0-13453 6 odcqppqcpjpcqdncpdcclc
+F-H0-13454 5 molqpqjqfqiqkphqjphpipdphodnfodcpd
+F-H0-13455 2 reqepqodqd
+F-H0-13456 5 efpqdpeededcpd
+F-H0-13457 2 oodppqpofqcnjpddqd
+F-H0-13458 2 gppqmpjpdpqoooqkddpd
+F-H0-13459 3 hcdrprcrerqqnqfqhqcqeqppdqcplpqndpcndopdddfc
+F-H0-13460 5 qjoqcqqpccpd
+F-H0-13461 2 fedpopddpdhcfc
+F-H0-13462 2 ccdpopddpdhcfc
+F-H0-13463 3 dnfqdpppclcjcedfcdcffcdedcpd
+F-H0-13464 3 lqfqeqjpdqfpppepcpqdcndc
+F-H0-13465 2 popqqfcpqdodddndpcjdocnc
+F-H0-13466 3 qdppdcjj
+F-H0-13467 3 prdrercrnqfqhqcqeqppdqcpdpqndocndcpd
+F-H0-13468 4 qlhqnqdpfqqjqpddpd
+F-H0-13469 3 olqpopmponcppdqndd
+F-H0-13470 3 gqppcpepqjpddc
+F-H0-13471 2 nqppjqdpcdpepc
+F-H0-13472 5 foqrqqorqppqfpfqdpnppogpqlcnddpd
+F-H0-13473 5 nooppqnpppdpoopoplpnpddc
+F-H0-13474 6 oqrprqopqproppqolppodppdoodd
+F-H0-13475 5 cnerdriqcreqfqdqcqdpppdocpdcpd
+F-H0-13476 4 opqqmqpqqpqnppqddpdd
+F-H0-13477 6 qperdrhqcreqpqdqfqppcqdpcppoqodocnddpd
+F-H0-13478 6 fmdqdoqpenempdcmdd
+F-H0-13479 6 qfdpppqdpjqcoencpddcpc
+F-H0-13480 4 qoqrnrorrqpqqqoqnqmqppqpopnpdppd
+F-H0-13481 3 fohqoqdpfqddpd
+F-H0-13482 2 cqhqoqdpfqddpd
+F-H0-13483 2 cjdodqdeqppddc
+F-H0-13484 5 qqrpppqnnponjppddpddql
+F-H0-13485 4 erdriqfqdqcqdpppdocpdcpd
+F-H0-13486 6 jcdppqnepklepfkdpdjdldddlcnckc
+F-H0-13487 3 chqqprppnqdpkqpnpdqiddqfqccfncrd
+F-H0-13488 2 fopqeqfpdqepcqcpdpdoeocodncnddpd
+F-H0-13489 2 dmpqeqfpdqepcqcpdpdoeocodncnddpd
+F-H0-13490 3 jdpqdpffdhefgedefepdeegdfcddecccdccb
+F-H0-13491 2 fohqpqdpfqjdqkddpfncpd
+F-H0-13492 2 qqppqndpqdqlfddjddcfkc
+F-H0-13493 2 pedpqereodqd
+F-H0-13494 4 iqdqpqcpfqddpd
+F-H0-13495 3 cqhqpqdpfqedpd
+F-H0-13496 6 qdppdqqgpepcddqbqc
+F-H0-13497 2 jpfqopqpdppcdd
+F-H0-13498 2 lqnqppcpepdcpd
+F-H0-13499 3 fdpqdpcfjdqdddfc
+F-H0-13500 3 oonqppqndpcdpjpc
+F-H0-13501 2 fdpqdpcfdepdddcdicfcecccdcdbebcb
+F-H0-13502 2 qnppqicpreqfqerdqdrcpdqcodpcddnc
+F-H0-13503 3 lpopqpqddpcd
+F-H0-13504 2 cepqdpdedcpc
+F-H0-13505 2 ddppeqpddfedeccd
+F-H0-13506 4 ddppdpqdndoc
+F-H0-13507 4 qrrqqqpqppqpdpqlqnqddcoc
+F-H0-13508 2 gddpppdhpjnepfncdedcpdpbkdkbqc
+F-H0-13509 2 gedpppdhpjnepfncdedcpdpbkdkbqc
+F-H0-13510 4 rcqipdqfddrdqclcnc
+F-H0-13511 3 drfreqerfppqdpfqcpgppocoencndndmddpd
+F-H0-13512 4 mdppdppjqfpdddndnckd
+F-H0-13513 2 qqppnqnpdpkpqnpjddpd
+F-H0-13514 5 mpmqpqnpnqeppdpodd
+F-H0-13515 4 qeepddqopc
+F-H0-13516 4 qqpqdpnppojpjdqkncpfdcpd
+F-H0-13517 5 pppqqqqppndpddpd
+F-H0-13518 4 cqdrdpfqdnopddpd
+F-H0-13519 3 qdppdppjodoemdnepcmeocpdncnddcqc
+F-H0-13520 2 qjqprqppqqoppqcpnqrorpqoqnqlqfncpdkcddpbqc
+F-H0-13521 2 peqepfpc
+F-H0-13522 4 opqqpppqdpdcpd
+F-H0-13523 3 rfppoedpnepfqdpepdodldocddqb
+F-H0-13524 2 bbppdpdedhceefpdeefdddeddcbc
+F-H0-13525 4 gppqmpjpdpqooopkddpd
+F-H0-13526 5 ccqdppcdcpgced
+F-H0-13527 3 opoqqppndcpd
+F-H0-13528 3 cnppjddpddpfncpd
+F-H0-13529 4 dqqpcqdppdcd
+F-H0-13530 2 qpppqqcpddqd
+F-H0-13531 6 kddpppdjhedffehdjdddidjcocicfchc
+F-H0-13532 2 efdpppdgdfcfddpd
+F-H0-13533 4 fpereqpqdpfqcpgppocoencndndmddpd
+F-H0-13534 2 pnnqppdpqiqdddoc
+F-H0-13535 2 nqdqiqcoppqnddpd
+F-H0-13536 3 ppcpedqd
+F-H0-13537 5 oppppqnppoeppdqodd
+F-H0-13538 5 pgpfpppddojdqfdd
+F-H0-13539 4 cpfqopqpdpcoencndndmddpd
+F-H0-13540 2 qfpdeqjdopdd
+F-H0-13541 6 pgqgpppfdpodqfddqd
+F-H0-13542 5 onpqcpeppooodcpd
+F-H0-13543 3 qmdppqqkjpddpd
+F-H0-13544 4 bbppdppdeddddccdccbc
+F-H0-13545 2 dqfqdpppcmcjcedfcdcffcdedcpd
+F-H0-13546 2 drfqdpppcmcjcedfcdcffcdedcpd
+F-H0-13547 3 pppqmpkqdppkddpd
+F-H0-13548 2 popqmpkqdppkddpd
+F-H0-13549 4 redpoqrfqpqfqgpepfpdqeddqdqcrcqbpc
+F-H0-13550 2 eqpnpqndcpddqd
+F-H0-13551 5 cdfddedcpdcbcc
+F-H0-13552 4 pppqmpfqdpjppoooonnodnplddpd
+F-H0-13553 2 fpdqqpopdodcpd
+F-H0-13554 2 lpdqqpopdodcpd
+F-H0-13555 2 redppqpoqpqnqordqddcoc
+F-H0-13556 4 noppnqkpdppjcldjcedfcdcffcdedcpd
+F-H0-13557 5 opqqqppqppqndpqdqlcd
+F-H0-13558 5 pbdpppndpjddqdqcpdpcodncocoblc
+F-H0-13559 2 pdgpdppoddoe
+F-H0-13560 5 efpqdpdgdfcfjdpdddfc
+F-H0-13561 2 depqdpqdocdc
+F-H0-13562 2 jpppnqqndqdnddpd
+F-H0-13563 2 eddpoqdhdeeepddcfd
+F-H0-13564 2 knppnqopmpnplpmodplnlopjddpd
+F-H0-13565 2 mnppnqopmpnplpmodplnlopjddpd
+F-H0-13566 5 idppdphedhfegcdedcpd
+F-H0-13567 2 qqrpnqdpfqqnppcnjpddpd
+F-H0-13568 2 qmrpnqdpfqqnppcnjpddpd
+F-H0-13569 2 ocoddqddqd
+F-H0-13570 5 codqfqdpcqdoppcmcpcecfcddedcpd
+F-H0-13571 4 jqnrmqnqlqnppplpkpdppnlopjddpd
+F-H0-13572 2 icdppplepjndpfldpdddkdncmcnblc
+F-H0-13573 6 qjnqeqqpddpd
+F-H0-13574 2 ceppdpdeqfpdrdncdc
+F-H0-13575 2 qmfqpqdpbppocnddpd
+F-H0-13576 5 qjppfqdodqdncpcncodjddcffcpd
+F-H0-13577 6 erbrdreqcrcqdqbqcpppcodpcndodmdnclcmddpd
+F-H0-13578 4 oqpqnppodppkddpd
+F-H0-13579 6 oomppqdpfqpoipcnplddpd
+F-H0-13580 4 jpdppqdnfqedpd
+F-H0-13581 5 nomppqdpoopoplonqddcoc
+F-H0-13582 4 jdpqdppkncpfecpd
+F-H0-13583 6 dofqdqcqipqpdpcpddpd
+F-H0-13584 2 djppqhcppfrfpeqfpdqdjdqcddqbpc
+F-H0-13585 2 rpnrlqrqqpqqpppqopnqnpdppjdcpd
+F-H0-13586 5 deeqppdfpdddedeccd
+F-H0-13587 4 eedpppdgcedcpd
+F-H0-13588 2 efdpppdgcedcpd
+F-H0-13589 2 qmdppqpoqdddjc
+F-H0-13590 2 qodppqpoqdddjc
+F-H0-13591 2 dlpqdqcodcpd
+F-H0-13592 5 bedpppedcddcpcccbc
+F-H0-13593 3 dpqqqrqporpopqqlnpddpd
+F-H0-13594 2 cpqqqrqporpopqqlnpddpd
+F-H0-13595 2 pooqpdcojdcfdd
+F-H0-13596 2 npqnppqejpecdp
+F-H0-13597 3 qpdrqqpqnqlqdpfqcnppddpd
+F-H0-13598 2 dqpqcdpepc
+F-H0-13599 3 mpeqfqdqepppfmcppdcmdd
+F-H0-13600 5 rfdpppreqeqdpepcdd
+F-H0-13601 5 ccpqdpdheffedeeepdfcgddcdd
+F-H0-13602 2 cfqoiqqnqppmppplcpqjpnpdonddom
+F-H0-13603 6 dcppdpcdedpcccbc
+F-H0-13604 3 ncppdppjjdjjddpd
+F-H0-13605 2 jpppdppjjdjjddpd
+F-H0-13606 6 cbdefdpddccc
+F-H0-13607 2 nopqdpfqpojpdnpldcpd
+F-H0-13608 3 fohpfqdpppdcpd
+F-H0-13609 3 cqhpfqdpppdcpd
+F-H0-13610 6 fdoqdpefdicfddpd
+F-H0-13611 3 cddpqdpo
+F-H0-13612 2 dddpqdpo
+F-H0-13613 2 popqdpddpdnc
+F-H0-13614 4 epdodqenqppdeocd
+F-H0-13615 2 kpipoqdpfqdnfoddpd
+F-H0-13616 2 bddipppdcofdefddcf
+F-H0-13617 2 cfpdppddcpic
+F-H0-13618 2 bfppnqqndqdfjppdcdddbdccecbcdcdbbbcb
+F-H0-13619 5 lcppdphedjfedfkdhdjdddidjcocicfchc
+F-H0-13620 5 freqerfppqdpfqcpgppocoencndndmddpd
+F-H0-13621 2 fqdpppcecfoddecdqddc
+F-H0-13622 2 npdppqpojpjdpkncpfdcpd
+F-H0-13623 5 rorqrpqpopppqolppodppdoodd
+F-H0-13624 5 bqcqhpppcpepddpd
+F-H0-13625 5 docqdqcpppcndppdcldc
+F-H0-13626 3 nndppqpofqpnoponooddpd
+F-H0-13627 2 qpdppqpofqpnoponooddpd
+F-H0-13628 5 nolqnqppdqpjecpd
+F-H0-13629 3 qfpdppdddpic
+F-H0-13630 2 fqdpppckpddd
+F-H0-13631 3 ipoqdpfqedpd
+F-H0-13632 2 cgdppodedcpd
+F-H0-13633 2 cedppodedcpd
+F-H0-13634 6 qqppnqoodqpjqnpdddjd
+F-H0-13635 3 pbdppppdqdndddqcpc
+F-H0-13636 2 rqqqpqppqppndpddpd
+F-H0-13637 2 nplqqqqppqppnqopdppjcldjcedfcdcffcdedcpd
+F-H0-13638 2 nrlqqqqppqppnqopdppjcldjcedfcdcffcdedcpd
+F-H0-13639 2 rqlqqqqppqppnqopdppjcldjcedfcdcffcdedcpd
+F-H0-13640 5 pppqqqqpdpqmpopd
+F-H0-13641 6 poqqppqpdpccpd
+F-H0-13642 4 qeppqicpreqfqdrdpdrcodqcddpc
+F-H0-13643 4 roqqdrpqiqcqfqrpqpdpppqnopcnpkddpd
+F-H0-13644 5 roqqrqpqqpoplppdcpdd
+F-H0-13645 6 mpdppqqnfqpnqponjpcnpmqkqiddpd
+F-H0-13646 2 qgdqppcfpcpefcdddb
+F-H0-13647 2 oqopqppddpcdqfncrd
+F-H0-13648 2 eedpqqdhcedcqc
+F-H0-13649 6 opqqlqpqqpnqppdppjcldjcedfcdcffcdedcpd
+F-H0-13650 5 qqmqopqpnodppdqmcd
+F-H0-13651 2 qldqppqnqhqjqdddod
+F-H0-13652 5 bodqbqcqhpppcpepddpd
+F-H0-13653 6 npdppqqoqmoodcpd
+F-H0-13654 3 dddpppdhdfeecedcpd
+F-H0-13655 4 rppqdpfqqnjpdnpodcpd
+F-H0-13656 2 pnpqdpfqqnjpdnpodcpd
+F-H0-13657 2 pnopmqdpqpnocdpd
+F-H0-13658 3 qnppjpdppjpddjddjd
+F-H0-13659 6 oqpqopmqnoqppddpdd
+F-H0-13660 4 ppdppqpofqpnjpcnqoddpd
+F-H0-13661 2 dndqppdpfpeoepdldodcpd
+F-H0-13662 2 endqppdpfpeoepdldodcpd
+F-H0-13663 3 enbqdqqpcqhpepcppdbodd
+F-H0-13664 3 qqpqppnqmpoodpnopoplonpcdc
+F-H0-13665 2 nnqppplpopcpnooopmqnpdoncd
+F-H0-13666 6 rnppdpnpqnqoonqlpkqhqjqdddoc
+F-H0-13667 4 jqdppprnnpqnqoonqlpkqhqjqdddoc
+F-H0-13668 3 ecdppqpnpdfdcd
+F-H0-13669 2 hqnqpqopoqnpqpjpdpddqn
+F-H0-13670 4 qrqqpqpocpddqdocld
+F-H0-13671 3 popqepqdddoc
+F-H0-13672 4 pqoqppdpddpd
+F-H0-13673 6 qopqppnpdpqnpnpmqmqdqldd
+F-H0-13674 2 demppqjpopdppkdcpd
+F-H0-13675 2 popqcqqdccoc
+F-H0-13676 5 qpdppqpofqqnqodcpd
+F-H0-13677 5 lopqdpnqpoplnodcpd
+F-H0-13678 4 cfoqdpocddfc
+F-H0-13679 2 jpdpppqjpddcjd
+F-H0-13680 5 fcprdrercrnqqqhqfqeqcqdqpplpcpdpqndocnddpd
+F-H0-13681 2 cqipfqfpppdpgpfocndcpd
+F-H0-13682 2 dqipfqfpppdpgpfocndcpd
+F-H0-13683 6 edppdpcfchpddddccdcc
+F-H0-13684 4 dnpqdpfqciocdc
+F-H0-13685 3 jpdppqcmfqdcpd
+F-H0-13686 5 bhdppqchcgdgbgcfdfbfdecepdcddddcecebccdbbccbbb
+F-H0-13687 4 pcppcqpjqcqdncpdcclc
+F-H0-13688 6 dhdpppcgeffddedcpdebcdcbcc
+F-H0-13689 4 qgpqdpqnqjqdddnc
+F-H0-13690 5 ofppfqdodqdncpcncoqlqjdjqfqhcedfcdcffcdedcpd
+F-H0-13691 5 gccnfqcipppddpncjcdc
+F-H0-13692 6 erdrdqfqipcqdpqpdocpddpd
+F-H0-13693 4 qfppdppdncdd
+F-H0-13694 4 nddpppmfpjlfpfnemelepdgemdkdldjdlcidkcddjcnchc
+F-H0-13695 2 nnnqlqkpkqjpjqiphqdpppnomplolpgomomnpnlnpjddpd
+F-H0-13696 4 dqfqppqdcpcd
+F-H0-13697 2 odpodqijddqe
+F-H0-13698 3 ecppdpcffeqdidgdfdfcddcc
+F-H0-13699 5 nomppqdpfqpojponoodnplddpd
+F-H0-13700 3 pddpqoqepeddndpc
+F-H0-13701 2 cndqfpppdococepd
+F-H0-13702 4 fmdqdoppenempdcmdd
+F-H0-13703 2 opnqfqlqppjqkpiqjphqiphpmodphocnfodcpd
+F-H0-13704 5 qppqppopnppoeppdqodd
+F-H0-13705 2 hqjpdqpdppddco
+F-H0-13706 4 cfdqpdfdcdedecfcdc
+F-H0-13707 2 emcnppdmdppddnddpjncqf
+F-H0-13708 2 nedpfqcnppmdjpddpdncnd
+F-H0-13709 2 dedppqponqqnqppnqoqjqddcoc
+F-H0-13710 2 ecnqpqjqoqopdqnpqppdcocdqn
+F-H0-13711 2 ccdppqefdgdfcfjdpdddfc
+F-H0-13712 2 cedppqefdgdfcfjdpdddfc
+F-H0-13713 3 jdppdpifchgfhdeffdcfddpdccbd
+F-H0-13714 3 qgpqdpqfpfqdoddc
+F-H0-13715 2 dfhqnqfpfqdpqpdcpd
+F-H0-13716 5 ofphpppddpjdqfdd
+F-H0-13717 3 pjppefdpdecgpdcfjdcdddccdc
+F-H0-13718 2 jpdpfqcnppccpd
+F-H0-13719 2 rpnqqncqpdppdd
+F-H0-13720 3 cidppqddcffcbdccpc
+F-H0-13721 4 obdqpppeqgqdpcddqbqc
+F-H0-13722 2 gcpqdpdecgpddccdcbcc
+F-H0-13723 4 dneodpendopd
+F-H0-13724 6 qllppqdpnpqonoooqmpmdcpd
+F-H0-13725 4 qfdpppdhffgeeffecfeedejdpdncgdfcddecccdccb
+F-H0-13726 6 rrqqqrqppqdpnppoqkddpd
+F-H0-13727 4 odppqicpqdqfpdqcddpc
+F-H0-13728 5 enqrqqorqppqdpfqponpdncnqldmddpd
+F-H0-13729 6 pcpfpqqdcpddodrcqc
+F-H0-13730 4 pppjdpdjddjd
+F-H0-13731 2 djqppdopjddpdd
+F-H0-13732 2 fqdpppdepjdcpd
+F-H0-13733 2 ppopqpdplpqopd
+F-H0-13734 2 poopqpdplpqopd
+F-H0-13735 2 roopqpdplpqopd
+F-H0-13736 2 deeoqd
+F-H0-13737 2 pqeoqd
+F-H0-13738 2 qippdqqdqfpc
+F-H0-13739 3 cmeqgqepdqfopppdcpdd
+F-H0-13740 2 qnoqpqopmqnoqppddpdd
+F-H0-13741 3 pbpqdppknepfncpddclc
+F-H0-13742 3 kdpqdppknepfncpddclc
+F-H0-13743 4 pereqeqdod
+F-H0-13744 5 jpiqfqhqpphpipdphocnfoddpd
+F-H0-13745 2 qqlqnqppcpddqd
+F-H0-13746 4 pgpfpppdcojdqfdd
+F-H0-13747 2 qodppqpocffdpdedcdjcecfcdc
+F-H0-13748 2 gcdppqponqqnqppnqoqjpdedcd
+F-H0-13749 3 pedppqocdedcqd
+F-H0-13750 3 jccfdqpdfdcdedecfcdc
+F-H0-13751 5 qfdppppdcffdcdedecjcdcfc
+F-H0-13752 3 pgdppqqgqfpfqdoddc
+F-H0-13753 4 onpqmpfqdpjppooocnplddpd
+F-H0-13754 6 cdppdpcfchpdddcc
+F-H0-13755 5 ropqrpfqdpipqnqocnpoddpd
+F-H0-13756 2 fcqeppoddpdd
+F-H0-13757 2 ncoqdppoddpd
+F-H0-13758 2 pdqqdpjddfgdddqc
+F-H0-13759 3 phpiqhqfpdofnd
+F-H0-13760 2 dpppqeddpc
+F-H0-13761 2 cpppqdddoc
+F-H0-13762 5 lppqdpnpqoqmoodcpd
+F-H0-13763 4 ocdqpqecqd
+F-H0-13764 2 dodqpqecqd
+F-H0-13765 4 ncdpppqfchfddedcpdebcdcbcc
+F-H0-13766 3 npdppqroqmpoddpd
+F-H0-13767 5 gpipfqfpppdpcndcpd
+F-H0-13768 6 bcdpppedcdccpc
+F-H0-13769 2 qqmqopqpdpqmnoddpd
+F-H0-13770 2 dhppdpcgefgcdedcpd
+F-H0-13771 6 bnbrereqdrcqcrbqdqppcpdpcodocndndmcmclbmddpd
+F-H0-13772 6 qcdppqnepkddpfncpdpbkd
+F-H0-13773 3 nddppqqfpkddpdnckd
+F-H0-13774 3 ndpppidppdqfidnccd
+F-H0-13775 5 pcdpppciqhqfpddejdqcgddc
+F-H0-13776 2 popqnddpddqd
+F-H0-13777 2 qeqpnpdddppc
+F-H0-13778 3 pnpqoqqpppqodpqnpoqddcoc
+F-H0-13779 2 prpqoqqpppqodpqnpoqddcoc
+F-H0-13780 5 frdrhqfqgqppdphpdngpddpd
+F-H0-13781 6 qoqrrqqqpqppqpoppodpqlqnqddcoc
+F-H0-13782 6 qdppdppjqcoencpddcpc
+F-H0-13783 6 fcdpppchcfcepdbebdeddcddcccdbc
+F-H0-13784 3 cpqqqrqporpopqqknpddpd
+F-H0-13785 2 dpppdfedbeicpddccdccbc
+F-H0-13786 3 qfqrqqorqppqdpnppopdqkdd
+F-H0-13787 5 pldppqpoqmpmpddd
+F-H0-13788 2 eofqdpppdjcnddpd
+F-H0-13789 2 dnfqppcnjppddpdd
+F-H0-13790 2 ofqdodld
+F-H0-13791 4 grfrerfqcrcqgqbqeqppdqepfpdpcpcodcpd
+F-H0-13792 5 pqrqqqqpoplppdcpdd
+F-H0-13793 6 qnoqdpqpqkqiddpd
+F-H0-13794 3 gpeqepdqcoppdcpd
+F-H0-13795 2 fpeqepdqcoppdcpd
+F-H0-13796 3 nqdrercriqfqeqcqdqppdpcpdocndcpd
+F-H0-13797 5 edeqppdfpdeccd
+F-H0-13798 5 qqrppqdpfqrojpqnqopnpodnqlddpd
+F-H0-13799 2 oqcpecqd
+F-H0-13800 4 pcppqhdppfqfpdqcddnc
+F-H0-13801 5 ofpgppneoeodqdddld
+F-H0-13802 3 mqoppqnpoqqodpdjddpd
+F-H0-13803 3 nqoppqnpoqqodpdjddpd
+F-H0-13804 2 prppnqqndpcjcedfcdcffcdedcpd
+F-H0-13805 2 jpppnqqndpcjcedfcdcffcdedcpd
+F-H0-13806 3 pidpoqqjqpqfqlofqhrdpdddnc
+F-H0-13807 4 rdqippqdcppdqfodqcddpc
+F-H0-13808 2 efppcqdfdcpd
+F-H0-13809 4 pcqippqdcppdqfddqc
+F-H0-13810 6 bmerbrdreqcrcqdqbqcpppcodpcndodmdnclcmddpd
+F-H0-13811 2 bddpqpddcffcpc
+F-H0-13812 2 popqcpfpqddd
+F-H0-13813 4 qdqhppoedppdqfjdqcddncpc
+F-H0-13814 2 pbqhppoedppdqfjdqcddncpc
+F-H0-13815 5 cflqpqiqeqpdcpddqo
+F-H0-13816 6 qpqrqqpqdpnppoqkddpd
+F-H0-13817 2 plcppqqodcqd
+F-H0-13818 2 eqcppqcedcqd
+F-H0-13819 3 jdppjpdpjjdddj
+F-H0-13820 3 cnpqdqeqcpdpcododdpd
+F-H0-13821 2 gcppdpgfdidfdcpd
+F-H0-13822 6 ofoqdpphpeoemdpcdd
+F-H0-13823 5 nbdpppndpjddqdqcpdpcodncocqblcobpb
+F-H0-13824 5 pqmqqqqpqnppqddpdd
+F-H0-13825 4 fcrqdrqqiqpqfqnqqpcqpprpopdproqnqocnpkddpd
+F-H0-13826 2 mcqnppqhnpredpqeqfqdrdpdrcodqcddpclcnc
+F-H0-13827 3 qirpqqdppqrofqqnippnqocnpormonplompkqlddpd
+F-H0-13828 2 korpqqdppqrofqqnippnqocnpormonplompkqlddpd
+F-H0-13829 3 jpdpfqdnppddoc
+F-H0-13830 2 jddqppdfpdddfd
+F-H0-13831 5 qpqqmqqnppqddpdd
+F-H0-13832 5 qcpqodpfddqd
+F-H0-13833 6 kqqqprppnqdppdpnddqiqcqfncrd
+F-H0-13834 4 oqopqppndpdcpd
+F-H0-13835 4 jddpppcfpjcedecdpddcdddbec
+F-H0-13836 5 onpqmpoopopldcpd
+F-H0-13837 2 oeppnqdppdqfddnc
+F-H0-13838 6 pqqpqqppqndpqdqlcd
+F-H0-13839 6 lqpqiqeqpdcpddqo
+F-H0-13840 2 fqnqlqdqkqkpjqjphqipppnolploqngopddd
+F-H0-13841 2 qjpqlqfqjqkpiqjphqiphpmodphocnfoddpd
+F-H0-13842 4 jpdppqdmfqddpd
+F-H0-13843 2 noppnqjpdpocdd
+F-H0-13844 2 cfeqppjdpdddfc
+F-H0-13845 5 pppqmpoodpnopoplonqddcoc
+F-H0-13846 2 ndpdpeodoe
+F-H0-13847 2 jddppocfpdddfc
+F-H0-13848 3 iqcqdrdpfqcnpd
+F-H0-13849 3 mpnqlqkpkqjpjqiphqdpppnolplomogopnmnpddd
+F-H0-13850 2 peppdopcde
+F-H0-13851 5 cbdpppdepdccdc
+F-H0-13852 5 nomppqdpfqpojponoocnplddpd
+F-H0-13853 4 fddpppcfdecepdcddddcecccdb
+F-H0-13854 2 jpdqdrcqeqcpppcodpcndoddpd
+F-H0-13855 5 nnpqlpnpdpnoqoqmooqlpmdcpd
+F-H0-13856 5 pcpqdpqhqfqdddpdqc
+F-H0-13857 6 cqdppqeofqpncnddpd
+F-H0-13858 3 iqdqppcoddqc
+F-H0-13859 2 jqdqppcoddqc
+F-H0-13860 4 mqdppqpoplnocdpd
+F-H0-13861 2 fcdpqpfedhdedcpd
+F-H0-13862 2 pqkppddpddpo
+F-H0-13863 3 nqiqfqdpqpddpd
+F-H0-13864 3 onpqdpfqqnqpdnjpqkqiddpd
+F-H0-13865 4 qqircqdrippqdpfqponpdnfoddpd
+F-H0-13866 4 qpppqqdpccpd
+F-H0-13867 2 jpdppqdjqoddpd
+F-H0-13868 2 fqdppqdjqoddpd
+F-H0-13869 6 pqqpqqppnqoodqpjqnpdddjd
+F-H0-13870 4 kcpfodreqcqdpcrc
+F-H0-13871 3 ckppcndppdcpcd
+F-H0-13872 2 fqppcndppdcpcd
+F-H0-13873 5 qpqrerdrqqcreqpqdqfqipcqdpnppocpdocnddpd
+F-H0-13874 6 eqepdqcoppdcpd
+F-H0-13875 6 ceppdpdecgpdddcddccc
+F-H0-13876 2 ooopqpcddppcqe
+F-H0-13877 2 dfdqcoqppdedcd
+F-H0-13878 3 qepppidppeqfpdpfjdqdddqcpc
+F-H0-13879 3 cqhqppfqhodqfodldodcpd
+F-H0-13880 4 fcdppqefdhdefepdeegddcdd
+F-H0-13881 5 kccfppcddpqcgdeceddcfc
+F-H0-13882 2 ojoqdpqpqjqlqfqdddpc
+F-H0-13883 6 fdppdicopdefddcf
+F-H0-13884 4 qboeppnedpqdpfpdpeldodddoc
+F-H0-13885 2 ppddqfncpd
+F-H0-13886 3 epqdde
+F-H0-13887 2 pldppqpocedcpd
+F-H0-13888 4 qrqqircqdrippqdpfqponpdnfoddpd
+F-H0-13889 5 gpqqqrqporfppqdpfqponpqlcnddpd
+F-H0-13890 4 eqcqcrbqdqppcpdpcmdoddpd
+F-H0-13891 6 oqqqpqppmqopqppddpcd
+F-H0-13892 5 qedpppqdpepcdd
+F-H0-13893 4 cffqdpppdnjpqjpdddfc
+F-H0-13894 3 lcmqqnpppjcppdncdd
+F-H0-13895 4 qpqrqqpqdpnppojpjdqkncpfdcpd
+F-H0-13896 4 dnpqhqfqdpfojdqkncpfdcpd
+F-H0-13897 2 odoeqfrdrercqdqcpdpcocobncnbmc
+F-H0-13898 2 rgrfqgreqfoeqeqdpdqcpcqbncpbob
+F-H0-13899 2 nnqrorprpqqqnqqppproqoooqnrnqm
+F-H0-13900 6 ropqqqfqqpppdpjpqnqopnpocnqlddpd
+F-H0-13901 2 qndpppqiqkqfqdddoc
+F-H0-13902 2 joiqkqfqdqpdppddco
+F-H0-13903 5 rpdrqqiqpqfqcqqpdpppqnopcnpkddpd
+F-H0-13904 5 gpfqppdqdpcqcpcneopddjcd
+F-H0-13905 3 fqdppqdipded
+F-H0-13906 3 djppjppddpjddffcdd
+F-H0-13907 6 rcodpfqcqd
+F-H0-13908 2 qfpqjqpkdppdddjd
+F-H0-13909 5 nppqnqoqopcqpdqpcd
+F-H0-13910 2 iqlqppqnnppddpdd
+F-H0-13911 5 bfpqdpcgchbgdgdfcfdecepdcddddcecebccdbbccbbb
+F-H0-13912 5 nonqppmpnpdppjqnpdddjd
+F-H0-13913 5 cqhpppcpepeodpenfocnfnemdmdcpd
+F-H0-13914 6 qpcppqpoepqnqoddpd
+F-H0-13915 3 plrppqdpfqqnjpcnpoqmpnqlpmddpd
+F-H0-13916 4 qqpqdpfqeocqpncnddpd
+F-H0-13917 3 opqpcedppdjddc
+F-H0-13918 2 qldpoqpjqpdcpd
+F-H0-13919 3 eqiqnqfqkqppdpddpd
+F-H0-13920 3 pdfpppfd
+F-H0-13921 2 kqqpoqpodpdcpd
+F-H0-13922 2 dgqpdpedcedcpd
+F-H0-13923 2 pomppqdpqkedpd
+F-H0-13924 5 rqdrqqiqpqfqcqqprpppdpopqnrocnqldcpd
+F-H0-13925 3 fohqfqdpppcdpd
+F-H0-13926 2 cqhqfqdpppcdpd
+F-H0-13927 3 cpfqopqpdpcoencndndmdcpd
+F-H0-13928 4 eqdrercrkqnqhqfqdqcqdpqpdocpddpd
+F-H0-13929 5 jdpqdppknepfkdpdddlcnckc
+F-H0-13930 2 nqppqndpjj
+F-H0-13931 3 cqppcndpddcloc
+F-H0-13932 2 onppqndppdqlec
+F-H0-13933 3 dnfqqpcndppdcldd
+F-H0-13934 3 qnjqbpcqenppcnfpbkdppddkdd
+F-H0-13935 2 jdqqrpjqqnpponnprkdppdpkdd
+F-H0-13936 3 qeppdppfpgofqfpdcdjdnc
+F-H0-13937 2 cqjpfqdpqpencndndmddpd
+F-H0-13938 2 kdpqdppfdecfddpdnccdhcfcecccdcdbebcb
+F-H0-13939 2 rpppqnnpqhcpreqfqerdqdrcpdqcodpcddnc
+F-H0-13940 3 dnfqipppdpfoedpd
+F-H0-13941 3 qcqqrpppqnnpqkdppfncpdpbdd
+F-H0-13942 3 rpnqdqppqnpdec
+F-H0-13943 2 ccpqdpeecfcefdpdeceddccd
+F-H0-13944 2 dqcpppdojpcodpcneodmendednpdem
+F-H0-13945 2 fpeqfqdqepcppopddndd
+F-H0-13946 2 rpppqnjpondppdnocdql
+F-H0-13947 5 iplqnqkqdqjqkpppjplpnopnlopjecpd
+F-H0-13948 5 ncppdpqdpdpcodocqcmcdc
+F-H0-13949 4 nddqoqqjqpqfqlofqhdcpd
+F-H0-13950 5 qqpqdpnqpofqdnjpddpd
+F-H0-13951 2 qldpnqcnfqqjqpddpd
+F-H0-13952 2 qfqodppdcfjdddfc
+F-H0-13953 2 pqqodppdcfjdddfc
+F-H0-13954 4 dqcqppcnjpdmdpcmenpddnddem
+F-H0-13955 2 ncpqcqqkdcpd
+F-H0-13956 3 okqqrrqpqrdppqponpqmqkddpd
+F-H0-13957 2 noqoopoopd
+F-H0-13958 2 qcdppfncpdpbdd
+F-H0-13959 3 clppdpcjcedfcdcffcdedcqd
+F-H0-13960 4 lcppcndpcfjdpdfdcdedecfcdc
+F-H0-13961 2 fpfrfqgqcqeqppdqepcpdpddpd
+F-H0-13962 2 oqpqqqqpppdppoqoqnrnpdqmdd
+F-H0-13963 5 qqpqdpfqqnjpcnqlddpd
+F-H0-13964 2 nopqdpplqoqdddoc
+F-H0-13965 4 pppqmpfqdpippoooonnocnplddpd
+F-H0-13966 5 podppqqnfqpnjpcnqoddpd
+F-H0-13967 2 deeqoqcpqpdcpd
+F-H0-13968 2 nqppdppjjjddpd
+F-H0-13969 4 qqpqqpppnpqodppdpodd
+F-H0-13970 3 popqdpjpddpkncpfkcpdpbqc
+F-H0-13971 2 hqpqdpjpddpkncpfkcpdpbqc
+F-H0-13972 4 qrdrercrqqrqhqpqeqnqdqfqppcqdpqppocpdocnddpd
+F-H0-13973 3 cqdrdpfqqnppcnpkddpd
+F-H0-13974 3 bpppdqfodoeocoboendnemcndcpd
+F-H0-13975 2 epbrbqeqppdqdpcqcpcnbppdcldd
+F-H0-13976 3 pqgrhrfriqqqgqhqfqeqppdpipqnfocnqlddpd
+F-H0-13977 4 rqqqmqopfqdpqpdcpd
+F-H0-13978 4 prppnqkpdppnnoqdddoc
+F-H0-13979 4 ompqrpfqdpjpqnpopnoncnqlddpd
+F-H0-13980 2 ncrpnqqnpppddpcdedecfcdc
+F-H0-13981 2 nppqnqoqopqppddpddcffcbd
+F-H0-13982 3 nqppdpdgedbeicpddccdccbc
+F-H0-13983 2 qfqrqqorqppqdpmppopdqkdd
+F-H0-13984 3 fpppeqdocpcobpboddpd
+F-H0-13985 2 dippdpdecdcebdbeecpd
+F-H0-13986 2 doeqpqcncpdcpd
+F-H0-13987 2 odpqdpqfqdocdc
+F-H0-13988 5 cpdqcqppcnjpdmdpcmenpddnddem
+F-H0-13989 2 cnjpoqdpfqddpd
+F-H0-13990 2 cqjpoqdpfqddpd
+F-H0-13991 2 ecdpopdhdedc
+F-H0-13992 2 popqcecppd
+F-H0-13993 2 cqbpfpcndppdqodd
+F-H0-13994 3 mppqdpplpoqddc
+F-H0-13995 5 eedppqcfpdfdedeccd
+F-H0-13996 2 qhdpfqcnppqjjpqfqldcpd
+F-H0-13997 4 hcpqdpnqpoqpqnqopmqgdjqdqiocddfc
+F-H0-13998 3 hpdpfqfoppddpd
+F-H0-13999 4 qfnqdpqpqjqldcpd
+F-H0-14000 3 qrqqpqdpfqponpecpd
+F-H0-14001 2 dcodqfndqdjdpcncoc
+F-H0-14002 3 dnfqhqppdpfoecpd
+F-H0-14003 3 nnqppplpopoonoqnpmonddpd
+F-H0-14004 2 ccdhppfeefeedepdgdfcdddc
+F-H0-14005 5 rfqgpppfdpqepgodqfddqd
+F-H0-14006 2 jqqqprlqnqppdppnnopjdcpd
+F-H0-14007 2 ohqhpppdcpndqfjdofddrdqc
+F-H0-14008 4 cqdripfqdpqpdnfodcpd
+F-H0-14009 3 qfchdqegqpdecfpdbfjdcdddccdc
+F-H0-14010 3 cpkqnqhqfqdqcqdpqpddpd
+F-H0-14011 5 qndppqpofqonopnnoopmpnddpd
+F-H0-14012 2 olqqrppqdpfqroiprnqoqnpopnrmnnqlcnplddpd
+F-H0-14013 3 doppdqdncocndcpd
+F-H0-14014 2 pnnqppjjcp
+F-H0-14015 2 ncjjpqqfpd
+F-H0-14016 4 qndppqpoqmpmplompddd
+F-H0-14017 2 iddpppdfpdccfd
+F-H0-14018 2 jddpppdfpdccfd
+F-H0-14019 3 nqnppqpopldcpd
+F-H0-14020 5 pcppdppjoeneodmemdpdncnddcoc
+F-H0-14021 2 ffefqpcfdgeefepdedhdddcd
+F-H0-14022 2 ccefqpcfdgeefepdedhdddcd
+F-H0-14023 3 qjnqdpqpecpd
+F-H0-14024 2 cfqfppddcopc
+F-H0-14025 4 pqqqlqnqppdpciddcffcpdccbd
+F-H0-14026 3 fcdgcecfcddedcpd
+F-H0-14027 5 efdhqpeedppddedcgd
+F-H0-14028 2 obdpppqdpjqcpencpddcjdpbpc
+F-H0-14029 2 qqpqdpqmpopddedc
+F-H0-14030 4 drbrcrfqdqcqipppdpcpddpd
+F-H0-14031 4 dqbqcqppepcppddncd
+F-H0-14032 5 dpdqqpdofppdcocd
+F-H0-14033 2 fcrpqqdpfqqnppdnnpqkjpddpd
+F-H0-14034 4 qnfqdpppdnjpciddcffcpdccbd
+F-H0-14035 4 cqhpppcpepcmenddpd
+F-H0-14036 2 pbpfdppdncdd
+F-H0-14037 2 qhdpppqfciddcffcpdccbd
+F-H0-14038 2 qopqppoqopqppndppedd
+F-H0-14039 2 qqpqppqpnpqoeppdpodd
+F-H0-14040 2 oddhppcfdpceefqdfedddedcfdtted
+F-H0-14041 5 pnnqlqnopppddpcd
+F-H0-14042 5 rcpqdpqhqfrerdqdddpdqcodpc
+F-H0-14043 3 enppdqeododncocndcpd
+F-H0-14044 3 qemppqjpopdppkqfpdddjd
+F-H0-14045 5 opqqqppqppnqkpdqpjdcpd
+F-H0-14046 2 pjpppddpjddidd
+F-H0-14047 5 oqrqrrpqqrqpqqqopppoopnodponooqlqnqdddoc
+F-H0-14048 4 qnprorpqnrnqqqmqoqnpopnomppndpplpopddd
+F-H0-14049 2 cfdppqnepkddpfncpdpbkdkbqc
+F-H0-14050 5 fdpppjcppdefjdcfdd
+F-H0-14051 5 pppqmpoodpnopoplonqdddnc
+F-H0-14052 4 ebdppqdhdffedeeepdddfddced
+F-H0-14053 2 ooqppqopoqqopppopndcpd
+F-H0-14054 3 ipcqerppcrhphqgpgqfpdqcpdldoddpd
+F-H0-14055 2 pomppqcpqkdcpd
+F-H0-14056 5 cdpqdpdeceqddcdd
+F-H0-14057 5 decnppbedppdcehdedcd
+F-H0-14058 2 dodqpdqpec
+F-H0-14059 2 qddpqpocdd
+F-H0-14060 5 qqpqqpppnpdppoqoddpd
+F-H0-14061 3 dkppdojpcodpcneodmendldnpdemcdel
+F-H0-14062 2 cpppdojpcodpcneodmendldnpdemcdel
+F-H0-14063 3 mppqdpfqpoipdnplddpd
+F-H0-14064 3 nppqqpoqopppqooopopndcpd
+F-H0-14065 3 rkpqrpfqdpjpqnpocnpnqmompmpkddpd
+F-H0-14066 5 ppoppqnpoopoplddpd
+F-H0-14067 4 oqqqpqppmqopqppdcpdd
+F-H0-14068 2 qjppdqckcedgcdcffcdedcpd
+F-H0-14069 2 likkjjjkkikjji
+F-H0-14070 3 coceqopd
+F-H0-14071 3 ndpppdpfdd
+F-H0-14072 2 cndppqpofqqnqppmnpqiqooiqgddpd
+F-H0-14073 3 ccdppqponqqnqppnqopjqhdjqdidocddfc
+F-H0-14074 2 fedppqponqqnqppnqopjqhdjqdidocddfc
+F-H0-14075 3 gdqdppcddpocedecfcdc
+F-H0-14076 2 gcppeedppdcfjddcddcccdfbfcebgb
+F-H0-14077 3 rddppprcpjqcnepcqdncpddcod
+F-H0-14078 5 ccdppqdfpdcded
+F-H0-14079 4 eqqqqrqporfppqdpfqponpfogpqlcnddpd
+F-H0-14080 3 prqrhrgrpqfriqqqgqhqfqeqppqpipdppornfoqnpncnqlddpd
+F-H0-14081 3 roopqpdppdqodd
+F-H0-14082 2 cqdrjpfqdpppdcpd
+F-H0-14083 2 fpdrjpfqdpppdcpd
+F-H0-14084 3 pogrhrfrpqqqiqhqgqeqfqqpppdpipqnfocnqlddpd
+F-H0-14085 3 crerdrkqnqhqfqdqcqdpqpdocpddpd
+F-H0-14086 2 jqdqpdppidcocd
+F-H0-14087 3 ofdpppqgpepc
+F-H0-14088 2 eqeppppdcped
+F-H0-14089 5 ropqrpfqdpjpqnqopnpocnplddpd
+F-H0-14090 3 bqpqcpcqdnepddpd
+F-H0-14091 3 dddpoqdecdceecpd
+F-H0-14092 4 fpfqppcndppdcjdd
+F-H0-14093 2 qkqrerorqqdreqcrdqpqqpfqipcqdpnppocpdocnddpd
+F-H0-14094 2 qlqrerorqqdreqcrdqpqqpfqipcqdpnppocpdocnddpd
+F-H0-14095 5 qndrnqfqdpcqcnppddpd
+F-H0-14096 3 qnppnqfpdqdoddpd
+F-H0-14097 3 fedpopidpdddfc
+F-H0-14098 2 djqdppcdjpjcdp
+F-H0-14099 3 cfqqpqqpfqdppprnjpqnpocnomjdqlddpfncpd
+F-H0-14100 3 oppqmpjpdpoopopkddpd
+F-H0-14101 3 fcdppqdnfqdjjpddpd
+F-H0-14102 2 qphrgrpqfriqqqgqhqfqeqppdpipqnfocnqlddpd
+F-H0-14103 5 qqrpppqnnponcppdqldd
+F-H0-14104 2 ngpqdppknepfddpdncqcpblc
+F-H0-14105 2 qfcqnqppdqcpjpqndpcndobnemddclncpd
+F-H0-14106 2 cepqdppddcgd
+F-H0-14107 2 epdmppqdcpdd
+F-H0-14108 3 qrorprdrqqpqnqlqqpfqdpppcnpoddpd
+F-H0-14109 5 qnpqdpfqpojpdnqoddpd
+F-H0-14110 5 orprdrqqpqnqlqqpfqdpppcnpoddpd
+F-H0-14111 3 qlcqoqqjqpdcpd
+F-H0-14112 2 cqqpcndppdclcdqf
+F-H0-14113 5 dcppdppdceed
+F-H0-14114 5 qrorprpqqqlqnqppqppodpciddcffcpdccbd
+F-H0-14115 4 epereqdqppdkdoddpd
+F-H0-14116 4 qgerdrhqcreqpqdqnqdpfqpocqdoqpqncppmqoqicnddpd
+F-H0-14117 3 cfpqjqpkdppdddfc
+F-H0-14118 3 opqpeqddpc
+F-H0-14119 3 ccdpoqddpdhcfc
+F-H0-14120 2 fedpoqddpdhcfc
+F-H0-14121 5 cdchdqpdppjdcfddccdc
+F-H0-14122 4 npdpfqqnpponjpcnqldcpd
+F-H0-14123 5 chdpppehcfefhdpdcded
+F-H0-14124 4 qopqppqpmpjpdppkddpd
+F-H0-14125 3 pnormqopqpdppd
+F-H0-14126 3 pppqqqqpdpqdpndd
+F-H0-14127 3 ecppdpcecipddcdd
+F-H0-14128 2 fepdqpcdedgc
+F-H0-14129 3 eqfrdrhqfqgqppdphpdngpddpd
+F-H0-14130 3 lqnqppdppjddrdrcqdqcpdpcodncndnblc
+F-H0-14131 3 nbpodpijneqeodoeddndocnc
+F-H0-14132 4 dpdqppgogpfodoeofndlenddpd
+F-H0-14133 5 beqpcndpdfedpddccdccbc
+F-H0-14134 2 pbrpnqqnpppfcppdncdd
+F-H0-14135 2 gqpqjqlqpddpddqkncqf
+F-H0-14136 2 qfkqdpfqcnqpqjqlddpd
+F-H0-14137 2 qidppqqkqddcoc
+F-H0-14138 3 popqqqkqppqppmdppdqoddpj
+F-H0-14139 5 gperfqeqdqppepfpeodpdocppdcodd
+F-H0-14140 4 fcdppqchbhdgcgcfbgbfdfcedecdpdbddddcecebccdbbccbbb
+F-H0-14141 2 mcodpqedqd
+F-H0-14142 2 cnfqdpppqdcfkcddfc
+F-H0-14143 3 bbdqppcgdegcpddccdcbcc
+F-H0-14144 4 chpqdpqkjdpfddcfncpd
+F-H0-14145 2 rfqhqpqgdppfpgqeqfpdqcjdpcddnclc
+F-H0-14146 4 omdppqooqonopoqnonpnqd
+F-H0-14147 5 bcpqdppddfedcdcc
+F-H0-14148 4 jpdpppjdpjncpfecpd
+F-H0-14149 3 pmpqdqqppoqoqnqddcoc
+F-H0-14150 5 frhqergqdreqfqfpcqdpppcngpddpd
+F-H0-14151 3 pepphqdoepcodpcmcpckddpc
+F-H0-14152 5 feqpdhdpeeefpddedcgd
+F-H0-14153 5 qoqrrqqqpqppqpoppodpqlqnqdddoc
+F-H0-14154 5 mnmqopqpdpmonoddpd
+F-H0-14155 2 ijjjjhli
+F-H0-14156 2 iijjhjih
+F-H0-14157 3 cpcepqpd
+F-H0-14158 3 gbppeedppdcfjddcddcccdfbfc
+F-H0-14159 2 prqpqqlpppqoopoonoqnnnonpmomddpd
+F-H0-14160 2 cbdhppgefffeefeedepdgdfcddecccdc
+F-H0-14161 5 pippqhdppdphcdqf
+F-H0-14162 2 jcceppqccpdc
+F-H0-14163 2 pnqqdpqddcoc
+F-H0-14164 2 kpippqdpfqdnfodlfmddpd
+F-H0-14165 5 pqdrqqiqcqfqdpqpqnppcnqldcpd
+F-H0-14166 3 ddppdqdeeepddccc
+F-H0-14167 2 dfppdqdeeepddccc
+F-H0-14168 2 ncfqdpppdnjpcipjdcpd
+F-H0-14169 2 qqrpppqnjpondppdnocdql
+F-H0-14170 3 ecppdpdecgpddcdd
+F-H0-14171 2 ccppdpdecgpddcdd
+F-H0-14172 3 dpeqdqppcoepdcpd
+F-H0-14173 2 dreqdqppcoepdcpd
+F-H0-14174 3 pifqlqjpeqfpdqepppqhcppdcnndqfjdofdd
+F-H0-14175 2 prlqnqppdppnnopjcldjcedfcdcffcdedcpd
+F-H0-14176 4 qjdrercreqmqdqfqipcqfpppdpcpdocnddpd
+F-H0-14177 4 fcpqdppdqocdedec
+F-H0-14178 3 rprqqrpqqqnqppqpdpoppopddd
+F-H0-14179 2 rpqrrqpqqqqpppdpoppopdqndd
+F-H0-14180 5 epqpdqfpdodppdcocd
+F-H0-14181 2 pooqqppndpciddcffcpdccbd
+F-H0-14182 2 opoqqppndpciddcffcpdccbd
+F-H0-14183 2 pedpppqdpjqcpdncjddcpc
+F-H0-14184 3 drkqnqhqfqdqcqdpqpdocpddpd
+F-H0-14185 2 cqdqdoqpencmpddkdd
+F-H0-14186 5 pfdpppnepjncpddcjd
+F-H0-14187 5 cpcrcqdqqpfpdoddpd
+F-H0-14188 2 dnqpepcpdcpd
+F-H0-14189 2 pcdpppnejpddpjqcpfncpd
+F-H0-14190 2 dipdppjddofdcfdd
+F-H0-14191 2 jpppnqpneppjddpd
+F-H0-14192 5 npdpppqnqopnpjddpd
+F-H0-14193 3 qoeqpqdqfqcpjppnfpcnepdcpd
+F-H0-14194 3 eqqpdqfpepdpdocppdcocd
+F-H0-14195 2 oepqdppfpepdqdpcodocdc
+F-H0-14196 4 rppqdpfqqnipcnpodcpd
+F-H0-14197 5 qnpqdpfqpnjpdnqoddpd
+F-H0-14198 3 pqceqd
+F-H0-14199 3 eopqdpfqpocndcpd
+F-H0-14200 2 dfppepcpqdcfddfc
+F-H0-14201 4 dppjppjd
+F-H0-14202 3 qlrrerqrqqdrhqcreqpqdqnqqpfqdpcqpocpdocnddpd
+F-H0-14203 2 qkrrerqrqqdrhqcreqpqdqnqqpfqdpcqpocpdocnddpd
+F-H0-14204 3 qfkqdpfqcnqppkqlqjplpjqkdcpd
+F-H0-14205 3 cidppqjdpfcdcfncpddc
+F-H0-14206 2 jdcnqpdjfppddpcdfcdc
+F-H0-14207 2 dcdfgddd
+F-H0-14208 2 npqndqpdppcd
+F-H0-14209 3 onrpqqdppqrofqqnippnqocnpoddpd
+F-H0-14210 2 djcnpppedped
+F-H0-14211 4 qqpqdpfqponpecpd
+F-H0-14212 5 efdhppeedepdgddc
+F-H0-14213 2 deppeqpjcppddcjd
+F-H0-14214 2 nqpqkqiqdpqoddpd
+F-H0-14215 3 qqrpnqdpfqqnppdnjpddpd
+F-H0-14216 4 pnqnpppidppdpkdd
+F-H0-14217 5 onrrrqqrpqqqqpppqooppodpnoooqlqnqdddoc
+F-H0-14218 3 qfppqnpdjj
+F-H0-14219 5 prpqqqlqnqppqppodpciddcffcpdccbd
+F-H0-14220 2 emdqppdpfpgoepeododldnddpd
+F-H0-14221 2 erdqppdpfpgoepeododldnddpd
+F-H0-14222 4 pojppqdpqdddoc
+F-H0-14223 2 mdppdppjeepd
+F-H0-14224 4 rrqqqrqppqdpnppopkddpd
+F-H0-14225 2 nqpppqmpoodpnopoplonqdddnc
+F-H0-14226 2 bbppdpcechpdecdddccccbbc
+F-H0-14227 2 hdoqqpdppdeccd
+F-H0-14228 2 nqppdpodcfidddfc
+F-H0-14229 5 oprqqrpqqqqppppodpqlqnqdddoc
+F-H0-14230 3 qcppdopjedpdnclc
+F-H0-14231 2 ofqheppdpojdqfdd
+F-H0-14232 2 ccdfqppdedcd
+F-H0-14233 3 pooqqpppoppndcpd
+F-H0-14234 2 ncdjpppddpidqfcd
+F-H0-14235 2 ebdppqdedhpddcec
+F-H0-14236 4 bmppfqdpcpdobococnendmdnpddkcd
+F-H0-14237 3 qlqrqqorcqirqpdrippqdpfqponpdnfoddpd
+F-H0-14238 2 pcppdppjnepflepdgemdkdldjdlcidkcncjcdchc
+F-H0-14239 4 dgdppqeeefeddedcpd
+F-H0-14240 5 gphqereqdrfpfqdpcqcnppddpd
+F-H0-14241 2 qjppqhdppdohndqfddof
+F-H0-14242 4 eeppepdedhpddcgd
+F-H0-14243 5 cpppdqdococnpd
+F-H0-14244 5 nomppqcpeppoooonpldcpd
+F-H0-14245 5 qpqrerdrqqcrhqpqeqnqdqfqdpcqpocpdocnddpd
+F-H0-14246 2 podpjjddpe
+F-H0-14247 4 qkqrqqorqppqpocpddqdocld
+F-H0-14248 3 qoqnpppmjppldppkpnpdomddol
+F-H0-14249 5 onpqmpoopoplddpd
+F-H0-14250 4 jddppqdffeddpdicidhcfc
+F-H0-14251 2 qpdppqqnpdfdcd
+F-H0-14252 3 qkkqdpfqcnqpqmpkqjqgddpd
+F-H0-14253 2 omkqdpfqcnqpqmpkqjqgddpd
+F-H0-14254 2 pnqpdqdoopddpd
+F-H0-14255 2 eoppcpepdedcpd
+F-H0-14256 2 kppqdoqkedpd
+F-H0-14257 2 gpdqpockoddd
+F-H0-14258 2 pnnqppdpkpnoqdddoc
+F-H0-14259 4 qopopqnonqpddpdd
+F-H0-14260 5 qdppdppjqcpdncjddcpc
+F-H0-14261 4 nrlqrqqpqqpppqopnqnpdqpjdcpd
+F-H0-14262 3 fohqpqdpfqjdpkddpfncpd
+F-H0-14263 4 ncpqdpjpjjpkddpd
+F-H0-14264 4 dqnqkqfqhqcqdpqpddpd
+F-H0-14265 3 nqppdpqfdhffgeeffecfeedejdpdncgdfcddecccdccb
+F-H0-14266 4 fpfqipppdpcncecfcddedcpd
+F-H0-14267 4 cfqipdqfddrdrclcqcfcnc
+F-H0-14268 4 dopqiqfqdqcqdpcpddpd
+F-H0-14269 2 jpdppqdifqdcpd
+F-H0-14270 5 poqrrqqqpqppqpdpqlqnqdddoc
+F-H0-14271 5 qedpfqcnppqjjpqgqlddpd
+F-H0-14272 3 onpqdpoopoqdddoc
+F-H0-14273 2 qqpqdpoopoqdddoc
+F-H0-14274 3 efeqpqcgdedcpd
+F-H0-14275 2 qqmqopqppdcocd
+F-H0-14276 2 iphqpqdpfqdnfojdqkncpfdcpd
+F-H0-14277 3 ippqlppodpqkdcpd
+F-H0-14278 2 nqdpppqndcpc
+F-H0-14279 2 qldpppqndcpc
+F-H0-14280 2 qldpppqnpjddmeqcqdpcpdncodnblc
+F-H0-14281 2 qodpppqnpjddmeqcqdpcpdncodnblc
+F-H0-14282 3 pbppdpjpnepjddpfqcpdncpc
+F-H0-14283 3 qpqqppnqnpmpnodppjqnpdddjd
+F-H0-14284 3 qnoqdpqpqkcjddpd
+F-H0-14285 3 eqppdqepcmcopddd
+F-H0-14286 2 roqqrqpqqpopdpcepnpdqf
+F-H0-14287 4 qldpfqdnppqjjpdcpd
+F-H0-14288 3 pppqmpepcpooponoonplddpd
+F-H0-14289 2 qqpqmpepcpooponoonplddpd
+F-H0-14290 3 dgdppqdfqfodcfndqdjdpcddocnc
+F-H0-14291 2 fqdppqjdjpddqkncpd
+F-H0-14292 2 cjnqppjpqidpjdddpc
+F-H0-14293 2 eeppcnfpdkdppdfeedfdcdfcec
+F-H0-14294 3 gpfqgqeqppdpfpdcpd
+F-H0-14295 3 olqpoplpjpqndplnonddpd
+F-H0-14296 4 pqqqppnqkpdppdcfjdddfc
+F-H0-14297 2 hbdpppdhcfdfeebfdecepdbegdddcddcbdgbccdbcb
+F-H0-14298 2 cgdpppdhcfdfeebfdecepdbegdddcddcbdgbccdbcb
+F-H0-14299 2 dfppdpdeeepdddcddccc
+F-H0-14300 2 efppdpdeeepdddcddccc
+F-H0-14301 3 oqnqppmpnpeppjdepd
+F-H0-14302 2 fccoppcfddpe
+F-H0-14303 3 qldppqqopdddfc
+F-H0-14304 4 rqqrnrpqqqoqnqmqppqpopnpdppd
+F-H0-14305 2 pfpopqodcpdcqd
+F-H0-14306 3 npqqqppqppnqmpopoodppjqnpdddjd
+F-H0-14307 2 edpppjdpdgcfeedepdcdjdfcddccdc
+F-H0-14308 2 mqprnroroqpqopqpdpddpd
+F-H0-14309 2 poerdroqcrhqfqeqcqdqqpdpcpdocnddpd
+F-H0-14310 2 ncppqfdpddpd
+F-H0-14311 2 ncpqdpfqqnqponmpcnjpqmpmqkqiddpd
+F-H0-14312 2 ncpqdpjpjdqkddpd
+F-H0-14313 2 qkpqdpqpqnpd
+F-H0-14314 3 jpcqpqdnfpddpd
+F-H0-14315 3 cpdepopd
+F-H0-14316 2 dodepopd
+F-H0-14317 3 foeqppcpdobpcodcpd
+F-H0-14318 4 npdppqqofqoojpdnqmddpd
+F-H0-14319 2 dhdqqqcedcpd
+F-H0-14320 2 dodqqqcedcpd
+F-H0-14321 4 jdpqdpfqcnjpncpfdcpd
+F-H0-14322 2 rpqooqpoqppdjpddep
+F-H0-14323 2 rdrepeqeqdpdqcpcqbncpbob
+F-H0-14324 3 pcppdppjqfnemdqdqcpdncnddckd
+F-H0-14325 2 qepepdod
+F-H0-14326 2 qdpepdod
+F-H0-14327 2 hqfqdpppcedfdcpd
+F-H0-14328 2 dnfqdpppcedfdcpd
+F-H0-14329 4 rbqhqpqddppdqfcdqcrcpc
+F-H0-14330 2 pnpqcpoppoeponoodcpd
+F-H0-14331 2 pmpqcpoppoeponoodcpd
+F-H0-14332 2 eqpqhqjqdpfqdnfoddpd
+F-H0-14333 3 dnpqdpfqqjqdddoc
+F-H0-14334 4 nppqppoqopnqdpqpqoddpd
+F-H0-14335 3 pqoqfqnqpplqnpjqkpiqjphqiphpmodphodnfodjpddd
+F-H0-14336 2 jccnqpcifpqddpdc
+F-H0-14337 3 ndppcophpepcdd
+F-H0-14338 2 gddpqodhdedcpd
+F-H0-14339 4 gqfqhqppfpgpdpdnddpd
+F-H0-14340 3 qpqqlqnqppdppdcfjdddfc
+F-H0-14341 2 qpqqppqndppdqldddjfccf
+F-H0-14342 4 qrqqpqqpppnpdppoqoddpd
+F-H0-14343 2 jcpeppddjppcdp
+F-H0-14344 2 cjdepppdjpdcdp
+F-H0-14345 2 iqqqrqpqqpkqdpoproqhpnreqfqerdqdrcpdqcodpcddnc
+F-H0-14346 3 onqqqppqdpfqpnipcnooddpd
+F-H0-14347 4 qopopqndcpddqd
+F-H0-14348 2 fqoqdpenclcndcod
+F-H0-14349 2 popqdpfqdnjpecpd
+F-H0-14350 3 nqerdrhqcreqfqdqcqdpppdocpqncnecpd
+F-H0-14351 2 pdppjdjj
+F-H0-14352 2 nqpppqmpkpdpooponoonqkddpd
+F-H0-14353 4 ckeqqqcpddpd
+F-H0-14354 4 fdoqdpefchcfddpd
+F-H0-14355 2 idppdppjnepfddpdncld
+F-H0-14356 2 rdphpppddpndqfjdofdd
+F-H0-14357 5 cphqfqgqppfpgpdpdnddpd
+F-H0-14358 2 pqdpqfoeqcpdncdd
+F-H0-14359 2 nomqopqpcedppdjcdc
+F-H0-14360 3 dcppqdcpcdedgccc
+F-H0-14361 2 mppqdpfqcnpkddpd
+F-H0-14362 4 mecqppqcpjpcqdncpdccodnblc
+F-H0-14363 2 dncnppddjpocdp
+F-H0-14364 2 qocppqpnepdcpd
+F-H0-14365 4 ndppphdppdqfjdofdd
+F-H0-14366 2 pldppqpoecqd
+F-H0-14367 5 nqerdrhqcreqpqdqfqdpcqpoqpdocpqnqopmcnddpd
+F-H0-14368 2 ljdphjjj
+F-H0-14369 2 dnfqpppddpcdpjncqf
+F-H0-14370 4 codrbrcrfqdqcqipppdpcpddpd
+F-H0-14371 4 pnqqrppqdpfqroipqnqocnpoddpd
+F-H0-14372 5 pkrpnqdpppqnqlonqhqjpdcfjdddfc
+F-H0-14373 2 rhppridpoirjqhsiphqirgpipdohndqfjdofdd
+F-H0-14374 2 cfqqqrqporpopqqknppddpdd
+F-H0-14375 2 qniqbqdqcpcqboppdnepddpd
+F-H0-14376 2 fqdpppqfpecfpdqdpcddocqclcncfcqbobpbdb
+F-H0-14377 5 pppqqqmqopqppdcpdd
+F-H0-14378 4 eqepdqcoppecpd
+F-H0-14379 3 rfqhpqpedppdqfjdqdddqcpc
+F-H0-14380 2 cbchdqdepppdcfjdcdddccdc
+F-H0-14381 2 ormqopqpdpecpd
+F-H0-14382 2 nomqopqpdpecpd
+F-H0-14383 4 onopdqnoqppmlppdoodd
+F-H0-14384 2 jpdpqqcnfqddpd
+F-H0-14385 3 ceppdpdfdecfdcpd
+F-H0-14386 5 lepqdppknepfkdpdjdldddlcnckc
+F-H0-14387 4 poqqppqpdpdcpd
+F-H0-14388 3 prppnqkpdppnnoqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-14389 2 pqqpoqoppppopndcpd
+F-H0-14390 5 pooqqpdplpnooooncdpd
+F-H0-14391 4 foippqdpfqjdqkncpfdcpd
+F-H0-14392 3 qidppqqnqpqkqddcoc
+F-H0-14393 2 cedppqqnqpqkqddcoc
+F-H0-14394 2 qddpppnejpddpjqcpfncpdpbpc
+F-H0-14395 4 npdppqqoqmoopd
+F-H0-14396 2 idqfmekelejepdldodocndnckdlcjd
+F-H0-14397 5 eqpqipfqfpdqdpgpfocnddpd
+F-H0-14398 4 ecdpppcepddced
+F-H0-14399 4 pnnqppdpkpnoqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-14400 5 rmpqrqfqqqppspjpqpqodpporornqnonpnqlcnpddd
+F-H0-14401 3 cpqkpqddpd
+F-H0-14402 3 pnoqpqnqppmpnpdpjpmonoqnpddd
+F-H0-14403 2 fmfqppcodpcncpemendmdnpddjdd
+F-H0-14404 3 cnerdrkqcrhqnqeqfqdqcqdpqpdocpddpd
+F-H0-14405 5 pppqmpooponoonplddpd
+F-H0-14406 2 dodqopqpdcpd
+F-H0-14407 2 fdcpqppddedc
+F-H0-14408 4 neqnppoecpqdoddd
+F-H0-14409 4 pnnpppqndppdpjdd
+F-H0-14410 5 erfqeqdqppepfpeodpdocppdcodd
+F-H0-14411 5 qooqdpqppoecpd
+F-H0-14412 3 cdeqpc
+F-H0-14413 5 cpcrcqdqppfpdoecpd
+F-H0-14414 4 pmrqpqqqfqspppqpjpdpqoropoqnrnpnoncnqlrmpddd
+F-H0-14415 3 pppqmpepcpooponoonpldcpd
+F-H0-14416 2 pbdrercrhqqqeqnqdqkqrpfqdpcqdoppqncpqkcnddqfncpd
+F-H0-14417 2 djqqprfqnqppkqdpcnqnqhqkreqfqerdqdrcpdqcodpcddnc
+F-H0-14418 2 phdpppjjjdpepcdd
+F-H0-14419 2 oqfqnqpplqnpjqkpiqjphqiphpmodphodnfoddpd
+F-H0-14420 2 ldppdpmedfhehdfeddpdncndlckdjcjdicidhcfc
+F-H0-14421 4 mrnrqrrqorqqpqnqoqppmqopqpdpnpqopd
+F-H0-14422 2 ocjjpdpc
+F-H0-14423 3 qnorqrdrprpqqqoqnqlqqpfqdpppcnpoddpd
+F-H0-14424 2 qqprppnqqncpddqd
+F-H0-14425 5 mpppnqnpdqpjecpd
+F-H0-14426 4 qorqdrqqiqpqfqcqqprpppdpopqnrocnqldcpd
+F-H0-14427 4 qiqhqpqedppdpindqfddof
+F-H0-14428 3 mqpopqnoplddpd
+F-H0-14429 2 nqpopqnoplddpd
+F-H0-14430 4 gmppdqdoepeneofmfndmddpd
+F-H0-14431 3 oqpqnppodpqkddpd
+F-H0-14432 2 mpopmqdpqpnomomnddpd
+F-H0-14433 2 hedpppgfgefecdpdgced
+F-H0-14434 3 qmopqponlpcddppc
+F-H0-14435 2 fcpqdpfedhdedcqd
+F-H0-14436 3 cdqqdpcfdcpd
+F-H0-14437 2 chqqdpcfdcpd
+F-H0-14438 5 ebeepppddpjdcfdddccdccfcfbgb
+F-H0-14439 2 dnfqdpppckcicdcfdcpd
+F-H0-14440 5 pdppdpqdodpcqcmcdc
+F-H0-14441 4 qedpppqjqlqgpddd
+F-H0-14442 2 fgdqppdffeddpdhcfcccdb
+F-H0-14443 2 ndfppppecpddpc
+F-H0-14444 2 pldppqpopdfdcd
+F-H0-14445 4 ncfqdpppdnjpcdpjecpd
+F-H0-14446 2 dhppeqcedcpd
+F-H0-14447 2 qgdppqpofqqnqppmnpqiqoddpd
+F-H0-14448 2 ppcodqpd
+F-H0-14449 3 erpqcrcqdqcpfpdoddpd
+F-H0-14450 3 dncnppcejppddpndpjdcqf
+F-H0-14451 2 nqppeqpdjjdd
+F-H0-14452 2 qnppjjdpocdd
+F-H0-14453 2 mpkppqdppkdcpd
+F-H0-14454 3 ncpqjplpdppkdcpd
+F-H0-14455 2 eqfpppddcpocqd
+F-H0-14456 5 qnpqqqoqppfqdpooponoonpnddpd
+F-H0-14457 2 ocdppqdnfqodjpddqd
+F-H0-14458 2 phppcnfpdjdpcdpepc
+F-H0-14459 3 oorqrrpqqrqpqqqopppoopnodpqlqnqddcoc
+F-H0-14460 2 prpqqqppnqpoqpnodppjddpd
+F-H0-14461 5 onpqmpoodpplpoqdddnc
+F-H0-14462 3 qmdppqpoqdddnchcfc
+F-H0-14463 4 nddppppephjdpcdd
+F-H0-14464 3 qcdpppjjddpdnclc
+F-H0-14465 2 qqprppnqdpceqnpdjcdc
+F-H0-14466 2 gpcoppcndpdmcpcjenpddncd
+F-H0-14467 5 dcdppqqopdedcdfcec
+F-H0-14468 2 ncdppqponqqnqppnqoqjpdqfcd
+F-H0-14469 5 pioqdpqpqjqlqfqhofpddcnd
+F-H0-14470 3 qdopdppjddod
+F-H0-14471 5 eeppdhdepdgddc
+F-H0-14472 5 dccnqpdfdppdedcdccbc
+F-H0-14473 2 pfppcedppdqfocmchcjcdc
+F-H0-14474 2 qeppcedppdqfocmchcjcdc
+F-H0-14475 2 dgpjppjjjpdjdpjgpdjddd
+F-H0-14476 3 jpdppqdnfqciocdc
+F-H0-14477 2 dpddpdhcfc
+F-H0-14478 3 fedppqefeededcpd
+F-H0-14479 2 ncpqdpqjddpd
+F-H0-14480 5 rodppqpofqonopnnooqmqnpmpnddpd
+F-H0-14481 5 qrqqpqdpnqpopmnopd
+F-H0-14482 2 cnqpfqdppd
+F-H0-14483 2 ddqpfqdppd
+F-H0-14484 4 oqpppqdpooponoonddpd
+F-H0-14485 5 qnppfqcndpdjqjqhcedfcdcffcdedcpd
+F-H0-14486 3 npnqpqopoqdpqpdcpd
+F-H0-14487 3 poqpppqopd
+F-H0-14488 2 cdecpddcdd
+F-H0-14489 4 feppdpdfidgdfdpcddfc
+F-H0-14490 4 pnorprnrpqqqnqoqmqopnpmpnodpplpopddd
+F-H0-14491 2 nopqdpfqpoplddqd
+F-H0-14492 4 poqqppqpdpccpc
+F-H0-14493 2 qnpppfcpreodqdqcddpcrclc
+F-H0-14494 2 ofpiqfpd
+F-H0-14495 2 nfpiqfpd
+F-H0-14496 2 qhpojqdopdqfdd
+F-H0-14497 4 npjppqdpqkpopdddjd
+F-H0-14498 2 pfqdoddc
+F-H0-14499 4 qqpqppoqdpooponoonddpd
+F-H0-14500 4 orprpqqqlqnqppqppodpciddcffcpdccbd
+F-H0-14501 3 qqrppqdpfqrojpqnqopnpocnplddpd
+F-H0-14502 2 rmrppqdpfqrojpqnqopnpocnplddpd
+F-H0-14503 5 oorqrrpqqrqpqqqopppoopnodpqlqnqdddoc
+F-H0-14504 3 fcpdqiddqfrcrdqclcnc
+F-H0-14505 3 orqqqrqppqponppddpcd
+F-H0-14506 2 bbpqdppddfedcddcbccc
+F-H0-14507 4 qnrqqqrpppqpoplpqodpnopopmoopdondd
+F-H0-14508 4 jcpqdpnemdpdddndocpcnc
+F-H0-14509 5 cpdqqpepfpdodppdcocd
+F-H0-14510 3 pmqpoplppddpidcicd
+F-H0-14511 2 qgppcfdppdmchcjcdc
+F-H0-14512 4 donqkqfqhqcqdqqpdpcpddpd
+F-H0-14513 5 cddppqdecepddcdd
+F-H0-14514 2 mqdrercreqpqdqfqipcqdpcpqocndoplddpd
+F-H0-14515 5 rrrqqrpqqqqpppqooppodpqlqnqdddoc
+F-H0-14516 2 dfdrrqiqqqfqpqqpnqppcqoprprodpqoqnpkcnpdddfc
+F-H0-14517 5 kplqnqppdqpnnopjecpd
+F-H0-14518 2 qmopmqdpfqnoqpdcpd
+F-H0-14519 2 moopmqdpfqnoqpdcpd
+F-H0-14520 2 pqqqiqqnpppmcppdpnddon
+F-H0-14521 3 eqppcpepdcqd
+F-H0-14522 3 cnorqrpqproqqqfqnqppqpkpdppoqnddpd
+F-H0-14523 3 nddpfqcnppqfjpddpdnckd
+F-H0-14524 2 pfdpfqcnppqfjpddpdnckd
+F-H0-14525 5 pldrercrhqnqeqfqdqcqrpppdpcpdocnqnqmpmqlddpd
+F-H0-14526 4 qmoqqpdplponpd
+F-H0-14527 4 qemppqjppodpqkqfpdddjd
+F-H0-14528 2 qdqpcccp
+F-H0-14529 2 ccpqcqpc
+F-H0-14530 2 nddpppqfqhofpd
+F-H0-14531 3 mppsnrqroqorlqmrqpqqpppqopnqnonppjdppddd
+F-H0-14532 2 jdjqpqdppkdcpd
+F-H0-14533 2 dejqpqdppkdcpd
+F-H0-14534 4 erdrkqnqhqfqdqcqdpqpdocpddpd
+F-H0-14535 4 pbppdppjnepfncpddcjd
+F-H0-14536 3 fccqiripdrdpfqdnppckfoddpd
+F-H0-14537 2 gcdpqpfecicedcpd
+F-H0-14538 2 edfqbpcqcnqpckdppdfcdddccdcchc
+F-H0-14539 2 fohqfqdpopddpd
+F-H0-14540 2 qcqhdppdpoddqf
+F-H0-14541 2 pndrdppqpofqqnqpcnqoddpd
+F-H0-14542 2 qfdrdppqpofqqnqpcnqoddpd
+F-H0-14543 4 ccqpdpfddedcpd
+F-H0-14544 3 dcpqdpeecfpdfdedeccd
+F-H0-14545 2 qcqnpppidpcdpfpc
+F-H0-14546 2 pfdppqddjpncpd
+F-H0-14547 2 pfdpfqdnppddipncpd
+F-H0-14548 5 rdpqdpqhqfqdddpdqcodpc
+F-H0-14549 2 derqdrqqiqpqfqnqqpcqpprpopdproqnqocnqldcpd
+F-H0-14550 4 pqoqppnqnpmpdppdnoddpjncqf
+F-H0-14551 4 dmdqppcqepbodpddpd
+F-H0-14552 3 drppcqhpepcpdpbpfoeofnendmcnqdemdd
+F-H0-14553 2 cfdppqdhffgeeffedeeepdfcgddcdddbcc
+F-H0-14554 2 nqpqlqfqjqkpiqjphqiphpmodphodnfodcpd
+F-H0-14555 4 fcoqdpdgcecfcddedcpd
+F-H0-14556 4 qnnqppdpcifddedcpdebcdcbcc
+F-H0-14557 2 nbppdppjoeneodmemdpdpcndncocdcob
+F-H0-14558 4 pgppdppfqfpdcdjdnc
+F-H0-14559 2 bppqcnfppddpdd
+F-H0-14560 3 iedgppbedppdedcdickcdcbccc
+F-H0-14561 5 ercqcrqpdqcpfpdoddpd
+F-H0-14562 4 qgppdpqlqjpddd
+F-H0-14563 2 jpqpoqlpoodponpnpdpmdd
+F-H0-14564 2 ccdppqcdedgc
+F-H0-14565 2 nomqopqpdcpd
+F-H0-14566 4 qpqrqqpqdpfqponpecpd
+F-H0-14567 2 cdddce
+F-H0-14568 3 ecppdqpdddfdfcgc
+F-H0-14569 3 edppdpcfdfdecepdcdfdfcdddcecebccdbbc
+F-H0-14570 4 eohpppdpepcpdmddpd
+F-H0-14571 5 feppdhefeedepdgddc
+F-H0-14572 2 ecpppjjppddpcded
+F-H0-14573 3 nqdrercreqfqdqcqipppdpcpdocnemcmddpd
+F-H0-14574 3 djfqcnppcedppdjcdc
+F-H0-14575 2 oroqpqdpfqpojpdnplddpd
+F-H0-14576 2 ppoqpqdpfqpojpdnplddpd
+F-H0-14577 4 noppnqkpdpqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-14578 3 pooqdpfqcnjpddqe
+F-H0-14579 4 onpqmpepcpoopopldcpd
+F-H0-14580 3 kpmppqepqkddpd
+F-H0-14581 2 fqdqoqpdcodd
+F-H0-14582 2 dnppeqcpcepd
+F-H0-14583 2 fqdpopjjpddd
+F-H0-14584 2 pedqiqdpfqqoqppoppcnopqmddpc
+F-H0-14585 5 mpppnqnpjppjdpjjdjpdddjd
+F-H0-14586 5 qrqqpqdpnppopkddpd
+F-H0-14587 5 pmoqqpoolpondppdpndd
+F-H0-14588 3 dgdppqcnfqcecfcddedcpd
+F-H0-14589 3 fqcnqpdddpoc
+F-H0-14590 5 pmdrnqfqdpcqqnppcnpnddpd
+F-H0-14591 4 qcdqppnepjncpfdcpdpbkd
+F-H0-14592 3 fbbpfqcncqckqppddpedfcdddccdcchc
+F-H0-14593 2 qnerdrnqcriqfqeqcqdqppdpcpdocndcpd
+F-H0-14594 2 dnpqkqfqeqfpdpqoddpd
+F-H0-14595 2 cnpqkqfqeqfpdpqoddpd
+F-H0-14596 4 cmerdreqcrdqpqipfqdpcqdocpemcnddpd
+F-H0-14597 3 nciqdpppddpd
+F-H0-14598 3 qfnqdqqpqjqlddpd
+F-H0-14599 2 qmppdpqhqjqddcnc
+F-H0-14600 4 fedhppeedpceefqddeddfddced
+F-H0-14601 2 pddpppgd
+F-H0-14602 2 djopqppddpfdcfdd
+F-H0-14603 4 qlfqppdpcnqndjqjqhcedfcdcffcdedcpd
+F-H0-14604 4 hdpqdpfedfpdddjdicidhcfc
+F-H0-14605 3 dnpqnqoqjqqpopqnnpcndpddpd
+F-H0-14606 2 ndppdpqfpdcffdcdedecjcdcfc
+F-H0-14607 5 qqlqnqppdpciddcffcpdccbd
+F-H0-14608 4 lqnqppeppjdcpd
+F-H0-14609 4 opqqdrpqiqcqfqdpqpqnppcnqldcpd
+F-H0-14610 2 qcpqdpfqdnjpddpdnclc
+F-H0-14611 2 nepqdpfqdnjpddpdnclc
+F-H0-14612 5 pnqpoqqodppdpocd
+F-H0-14613 2 onpqdpfqpojpcnooddqd
+F-H0-14614 2 pppqdpfqpojpcnooddqd
+F-H0-14615 4 nodqopqppmlppdoodd
+F-H0-14616 2 fchqpqdpjpddpd
+F-H0-14617 2 ncqhqppddpddpj
+F-H0-14618 4 pppqqqqpdppdpndd
+F-H0-14619 4 pdepppnddd
+F-H0-14620 2 cmpqjpfqdpdqcocqencndndmddpd
+F-H0-14621 5 fpfqipqpdpdnddpd
+F-H0-14622 2 npdpjqqnfqcnppddpd
+F-H0-14623 2 qldpjqqnfqcnppddpd
+F-H0-14624 5 qpqqppnqkpdqpjdcpd
+F-H0-14625 3 qfpqpdncdd
+F-H0-14626 5 pmqqpqppoqdpfqpoooqnnoonpnddpd
+F-H0-14627 2 pnqnppqedpcdqlpc
+F-H0-14628 2 qnpqdpqdddochcfc
+F-H0-14629 2 ppqpoqoppndcpd
+F-H0-14630 5 qmoqdpqpqjqhdcpd
+F-H0-14631 3 gdppdpdedgpdeccd
+F-H0-14632 4 qjdpppqdddod
+F-H0-14633 3 oonqppcppdqndd
+F-H0-14634 2 ndqfppcddpncpd
+F-H0-14635 3 cqdqnppddndd
+F-H0-14636 2 eccgdedcpd
+F-H0-14637 5 ocdpqqdcqd
+F-H0-14638 2 ceppdpdfjdpddc
+F-H0-14639 2 qqpqdppdpoec
+F-H0-14640 5 epereqpqipfqfpdqdpgpfocnddpd
+F-H0-14641 2 kdppdpchehcfefhdpdcded
+F-H0-14642 2 qqqpoplpdpqnonqlolddpd
+F-H0-14643 4 fpkqpqeqfqdpqoddpd
+F-H0-14644 4 dddhqpfedpeeefpddedcgd
+F-H0-14645 2 pjdqoqcoqpddpd
+F-H0-14646 4 pnrrrqqrpqqqqpoqqopppoopnodponooqlqnqdddoc
+F-H0-14647 3 onppqndppdqled
+F-H0-14648 2 ccdppoddpdhcfc
+F-H0-14649 5 dqfqeqepppcecppdjcdc
+F-H0-14650 3 qjpodpqeddnd
+F-H0-14651 3 gpipfqfpqpdpdnddpd
+F-H0-14652 2 cqipfqfpqpdpdnddpd
+F-H0-14653 2 dfpqfppd
+F-H0-14654 2 icppnqqniqcfcpdcpd
+F-H0-14655 3 pdpqdpofneoeodqd
+F-H0-14656 3 lpoqqppdcocd
+F-H0-14657 5 qorqqpqqpppqoprpdpqnroqdqlcd
+F-H0-14658 3 monqppmpnppddpndpjddqf
+F-H0-14659 2 fqppcndppdpjndqfdd
+F-H0-14660 3 nddppppdqdodpcqcocncmcdc
+F-H0-14661 2 frpqgqfqeqcqdqepcpdpddpd
+F-H0-14662 3 fodqcodlddpd
+F-H0-14663 3 oqppnqnpdqnomppjdcpd
+F-H0-14664 2 femppqjppodpqkidpdddfc
+F-H0-14665 2 qeeqppcpcmqjqlqgcjcgpddd
+F-H0-14666 2 jjfqdpppdjjpjdpjddpfncpd
+F-H0-14667 2 dnfqdpppdjjpjdpjddpfncpd
+F-H0-14668 2 pooqcpddqd
+F-H0-14669 3 fdppdqdfdhcedcpd
+F-H0-14670 2 enpqephppocpddpd
+F-H0-14671 2 pjqppddpcdciic
+F-H0-14672 2 dekqpqdpqkdcpd
+F-H0-14673 2 pfdppqdhffgeeffedeeepdncgdfcddecbddccc
+F-H0-14674 2 kddppqdhffgeeffedeeepdncgdfcddecbddccc
+F-H0-14675 5 pppqdpooponoonddpd
+F-H0-14676 4 mpnrqrrqorqqmrnqpqppoqopmqdpqpqonpnopd
+F-H0-14677 3 qcfqdpppcnjpncpddckd
+F-H0-14678 2 qpjqdpfqcnopdcpd
+F-H0-14679 2 ncjqdpfqcnopdcpd
+F-H0-14680 2 defqepdqdpcqcpbqcoppbobpclcndcpd
+F-H0-14681 3 endoppcnjpdmdpdddnpcem
+F-H0-14682 4 rpqqrqppqpoplpqodpnopopmoopdondd
+F-H0-14683 3 qfkqdpqpddpdnckd
+F-H0-14684 2 ocdpppqdpjqcpencpddcjdqbpcpbob
+F-H0-14685 5 pnnqlqdpppnopd
+F-H0-14686 3 cqfqhqppfpcpdpdnddpd
+F-H0-14687 2 ecppdpdffdpdddcdhcfc
+F-H0-14688 5 pmdrercrhqnqeqfqdqcqrpppdpcpdocnqnqmddpd
+F-H0-14689 2 djpqcnfqpddpndqkddqf
+F-H0-14690 4 oqfqnqpplqnpjqkpiqjphqiphpmodphodnfodjpddd
+F-H0-14691 4 fperhqdreqfqdpcqcnppddpd
+F-H0-14692 2 qhcpppqjqddcoc
+F-H0-14693 2 cdqindpepcqdqbqcob
+F-H0-14694 3 dppppdpjndqfdd
+F-H0-14695 3 oloqmqmplqdpqpoopnnnonmnnmplcdpd
+F-H0-14696 2 cddppqfgchdgcgffgfeefecefdpddchd
+F-H0-14697 4 fppqhqfqdpcndcpd
+F-H0-14698 4 chdpppdgcfdfcedepdeccd
+F-H0-14699 4 onnqdrdpfqqncqcnpppmpnddpd
+F-H0-14700 3 pidpkqcnfqqfqpddpc
+F-H0-14701 3 gdcqppdhdedcpd
+F-H0-14702 5 oomppqdpjppopkddpd
+F-H0-14703 4 qedpoqqjqppiqlqfqhofpddcnd
+F-H0-14704 2 qlpjppefdpdecgpdcfjdcdddccdc
+F-H0-14705 3 gqppcpepccpd
+F-H0-14706 2 qopopqpdcqdd
+F-H0-14707 2 cjdppqcdqkecpd
+F-H0-14708 2 hcqpqedpddfcpc
+F-H0-14709 2 qnjqeqppcpcickcfcdpddc
+F-H0-14710 3 jdjppqdpqkcfpdddfc
+F-H0-14711 2 bdpjkqpdqpdddpfccf
+F-H0-14712 2 odpqjjqd
+F-H0-14713 2 dodqjjcd
+F-H0-14714 2 qippdpoipiqhohphqfpdofnddfjdddfc
+F-H0-14715 5 noqpoqlpdpoooncdpd
+F-H0-14716 2 ridpoqqjqprhqlqfqhdcpd
+F-H0-14717 2 qjoqfqbpcqcndpckdcod
+F-H0-14718 2 qpoqfqbpcqcndpckdcod
+F-H0-14719 2 ofppdppfpgqeqfpdcfjdddfc
+F-H0-14720 5 pppqqqmqopqppddpddqf
+F-H0-14721 3 eeoqdpqpqjdedhpddcgd
+F-H0-14722 2 pdeqppcpcjpephmdpcdd
+F-H0-14723 3 dbdppqcfqdjdncddfc
+F-H0-14724 2 qkfqdpopdnjpddpe
+F-H0-14725 4 mdqdpeqcpdobdd
+F-H0-14726 2 jqlqrqqpqqqopppnnp
+F-H0-14727 3 bdppdpqfcfrdpdddncfc
+F-H0-14728 3 hccnqpdfdpbeedpddccdccbc
+F-H0-14729 2 qkqrqqorqppqdpfqponpdcpd
+F-H0-14730 4 monqppdqnpmppjecpd
+F-H0-14731 5 pbppdppjqdpeqcpdncjddcpc
+F-H0-14732 5 dcdppppdccdd
+F-H0-14733 4 opmppqdpjppoooonqkddpd
+F-H0-14734 5 mpqpnqppqonpqndppmpnomonqdpkdd
+F-H0-14735 4 ppdpoqqofqpoqpdnipddpd
+F-H0-14736 5 ocdppppdqdodpcqcmcdc
+F-H0-14737 2 mnoqpqnqppmpnpdpnomopjddpd
+F-H0-14738 2 kqerqrqqorhqdreqcrdqpqqpfqdpcqponpdocpqlcnddpd
+F-H0-14739 5 oqqrorprdrqqpqnqlqqpfqdpppcnpoddpd
+F-H0-14740 3 qgnqqnpppddpddqfncrd
+F-H0-14741 2 prdrnqfqdpppcnqnddpd
+F-H0-14742 4 gcppdqfedhcedcpd
+F-H0-14743 3 cnepppdphpfocpdmeopdendc
+F-H0-14744 3 opdppqqoqeddpc
+F-H0-14745 2 ldppqddpcdocec
+F-H0-14746 3 pbqhpppfdppdqfjdqcddncpc
+F-H0-14747 4 qppopqnonqqndppdqodd
+F-H0-14748 5 rgdppprfpjqdqfqcoencpddcpc
+F-H0-14749 4 ckercqcrqpdqcpfpdoddpd
+F-H0-14750 2 qcppdppjldlfncnedcpd
+F-H0-14751 4 qpqrqqpqdpnqpopmnopd
+F-H0-14752 4 chpqdpfqdnjpjdqfddcfncpd
+F-H0-14753 4 qqqppqdpfqpnipcnooddpd
+F-H0-14754 2 qfnqdpqpqjdedcpd
+F-H0-14755 2 dcqpqfdpcdfcpc
+F-H0-14756 4 dncpppedepcdpd
+F-H0-14757 2 onppqnjppddpjdpkdd
+F-H0-14758 3 cpeqpqjpfqfpcqdpgpfocnddpd
+F-H0-14759 2 gqeqpqjpfqfpcqdpgpfocnddpd
+F-H0-14760 3 peppqgdppfpgqerfodqfddqd
+F-H0-14761 5 ndqppicppdqfjdofdd
+F-H0-14762 2 qqpqdpnqpofqpddd
+F-H0-14763 2 rpmqqqqppqppqnopqddpdd
+F-H0-14764 2 eqgqdqppcqepcndppdcpcd
+F-H0-14765 5 pnnqlqdqppnopjecpd
+F-H0-14766 2 gddpqpdhdedcpd
+F-H0-14767 5 qpdppqpofqqnjpdnqoddpd
+F-H0-14768 2 qjppqhdppdohcdqfncof
+F-H0-14769 3 deppdppdeccc
+F-H0-14770 2 cdppdppdeccc
+F-H0-14771 2 epfpfqdpjj
+F-H0-14772 2 mdpdjjndnc
+F-H0-14773 2 qfpqmppojppkdppdddjc
+F-H0-14774 2 gcpqmppojppkdppdddjc
+F-H0-14775 2 dipqdpnqpoqpqnqopmqgqiqddcoc
+F-H0-14776 3 pcdppqndqdqcdd
+F-H0-14777 5 qbppdppjqdpeqcpdncjddcpcpbob
+F-H0-14778 5 qcppqhdppdqfndofidrdcd
+F-H0-14779 3 cjdpfqcmppcedfcdcffcdedcpd
+F-H0-14780 3 dpeqhpppcpdoddpd
+F-H0-14781 4 qmfqdpqpcnjpqjqhddpd
+F-H0-14782 3 dnfqdpppcdpjecpd
+F-H0-14783 4 qjppdpnjdcpd
+F-H0-14784 2 odrqqpqqpppqopnqdprproqnqoqdqlcd
+F-H0-14785 2 ocrqqpqqpppqopnqdprproqnqoqdqlcd
+F-H0-14786 2 jcfqdpqpcnopqmjpqjqhddpd
+F-H0-14787 2 oppqdpfqpnqlddpd
+F-H0-14788 3 qqqpopqnpd
+F-H0-14789 2 dpqpopqnpd
+F-H0-14790 2 hpfpfqdpppgogpdjoddd
+F-H0-14791 2 poppqnjppmdpdepnpdom
+F-H0-14792 2 hqdqpqipfqfpeqdpgpfogogncnddpd
+F-H0-14793 5 qnnqpqopoqnpcqpdqpcd
+F-H0-14794 5 gbppdpcfdheedfdebfpdcegdbecdddbddcccdbcb
+F-H0-14795 5 dcppqddpcdedocfcec
+F-H0-14796 4 jdppdpqimdpedcpc
+F-H0-14797 4 kcfqdpppcnjpddpfncpdpbqc
+F-H0-14798 4 odppdpjpqfpjddoeqcmepcqdncpd
+F-H0-14799 2 qcppdppjpfpdqdndmdocncmcdclc
+F-H0-14800 5 pqrqqqmqopqpnodppdpndd
+F-H0-14801 2 fcdqppjppidkjdddpc
+F-H0-14802 2 jjdppqdijpjdpkdcpd
+F-H0-14803 2 dpmg
+F-H0-14804 2 peoqdpqpqjqldcpc
+F-H0-14805 4 peqpdpfedfpcidfcddibccdb
+F-H0-14806 2 popqqkcpddpd
+F-H0-14807 2 qopqqkcpddpd
+F-H0-14808 2 qkoqdpfqqoqppoppoonpdnipddpd
+F-H0-14809 2 dfppjppjdppddjjdddfd
+F-H0-14810 4 cqppepcppddncd
+F-H0-14811 4 qjoqfrfqeqcqipqpfpgpdpcpfocnddpd
+F-H0-14812 4 pnpqponqnoqpqndppdqodd
+F-H0-14813 2 mpdppqqoplpnddpd
+F-H0-14814 2 fddpppdfdhcedcpd
+F-H0-14815 2 qnppdqqfqepfqdpecdndpc
+F-H0-14816 3 eedpppdeddcecdpd
+F-H0-14817 3 dnfqdpppcgdgefcfdfpdcefcjddcddcc
+F-H0-14818 2 jpfqdpppcgdgefcfdfpdcefcjddcddcc
+F-H0-14819 3 hohqppdpjpjdpjddpd
+F-H0-14820 5 cqbpppenfpcndpcddkpc
+F-H0-14821 4 qkqqrpfqdpppqnnpdnjpddpd
+F-H0-14822 2 qjdrercrkqnqhqfqeqcqdqqpdpcpdocnddpd
+F-H0-14823 3 nooqqorppoqppdjpddep
+F-H0-14824 5 rnrqpqqqfqqprpdppprojpqnqopnpocnqlddpd
+F-H0-14825 4 lppqdpnpqoqmooddpd
+F-H0-14826 4 dripfqdpopdnfoddpd
+F-H0-14827 5 ofdppppgpfqfpdcdjdnc
+F-H0-14828 5 odpqdpjjddqd
+F-H0-14829 4 dfppdqpdcdedgceb
+F-H0-14830 2 odpfpqddcpocqd
+F-H0-14831 2 qopqocqd
+F-H0-14832 3 cdppnqqnjpdfdppddccc
+F-H0-14833 2 dodqppcedjdcpd
+F-H0-14834 2 noircqdrippqdpfqpofodnpldcpd
+F-H0-14835 3 rfpeqdpdqcmdob
+F-H0-14836 2 ecdopdedcd
+F-H0-14837 4 nomppqdpoopoplonqdddnc
+F-H0-14838 3 pqqqqpnpcddppc
+F-H0-14839 2 rcndpqddcpqcqd
+F-H0-14840 3 qfoqqpkqdppdpodd
+F-H0-14841 2 edpdqicdqfqcrdnc
+F-H0-14842 3 fqdodqpdec
+F-H0-14843 3 ecoqdpdfdhdefepdeefdddeddceb
+F-H0-14844 3 rfdppqqgpgpfqfqeqdoddc
+F-H0-14845 3 eqepppdncpdcpd
+F-H0-14846 2 fqqpdqfppddodd
+F-H0-14847 5 nqdrrqiqqqfqpqqpcqpprpopdproqnqocnqldcpd
+F-H0-14848 3 rokqdpfqcnqpqmpnqjqhddpd
+F-H0-14849 2 cnkqpqdqqodcpd
+F-H0-14850 3 gcdqppddpdfcfd
+F-H0-14851 5 jqnqlqdqkqkpppjplpnopnlopjecpd
+F-H0-14852 3 obdpppoepjodnemdmepcpdncnddcoc
+F-H0-14853 4 oboeqpqddppdqfjdqcddpcncnbmb
+F-H0-14854 2 dkqnnqcnppqddpcd
+F-H0-14855 5 ocdppppfpjqdpdmdndncmcdclc
+F-H0-14856 3 qipqdpfqpoqpqnnppmqoddpd
+F-H0-14857 5 qcqhppqgdppfpgqeqfpdpcjdncdd
+F-H0-14858 2 nqdrcqfqjpppdphpddpd
+F-H0-14859 2 lddqppphqepcnemcdd
+F-H0-14860 2 nnpqqqoqppnqmpfqdpooponoonplddpd
+F-H0-14861 2 poppqnjppmdpcepnpdom
+F-H0-14862 2 fcprdrercrnqqqhqfqeqcqdqpplpcpdppndocnddpd
+F-H0-14863 2 qjprdrercrnqqqhqfqeqcqdqpplpcpdppndocnddpd
+F-H0-14864 2 cedpppdepdgdfcfddc
+F-H0-14865 2 gcdpppdepdgdfcfddc
+F-H0-14866 2 ccpqdpdeceqdcddddcec
+F-H0-14867 2 cfpqdpdeceqdcddddcec
+F-H0-14868 3 pkppqnnponjppddpjdqldd
+F-H0-14869 2 ddpqdppdpocdedec
+F-H0-14870 2 fcpqdppdpocdedec
+F-H0-14871 2 fqdpoqecqe
+F-H0-14872 3 cfdqqpcededcpd
+F-H0-14873 2 dpdqppcododcqd
+F-H0-14874 2 nqppdpjpjjpjdjpdddjd
+F-H0-14875 2 fqdppqddpkncqfpbpd
+F-H0-14876 4 cfpqdpcededcqd
+F-H0-14877 3 pqppoqdppd
+F-H0-14878 2 qedppppfpjqdpdmdndqcocncmcdclc
+F-H0-14879 3 eqfqhqppgqgpfpcpdpdnddpd
+F-H0-14880 3 fcdpnpddpd
+F-H0-14881 2 qqcqqnpppdqldd
+F-H0-14882 2 cpppdqdoepeneodnddpd
+F-H0-14883 2 fnfpppepcpfoeopddodd
+F-H0-14884 5 podppqqnfqpnjpdnqoddpd
+F-H0-14885 5 pnqqpqppoqdpfqpoooonnoddpd
+F-H0-14886 2 qrpqqqoqppnqmpfqdpjppoooonnonnmocnplddpd
+F-H0-14887 2 oocqhrhpdrdppqpofqdnfoddpd
+F-H0-14888 4 qmpqqqoqppfqdpooponoqnpnonpmddpd
+F-H0-14889 5 rqpqqqfqqprpdppprojpqnqopnpocnqlddpd
+F-H0-14890 5 fqpqdqdocpdncocnddpd
+F-H0-14891 4 dnfqhpqpdpfoddpd
+F-H0-14892 4 qidrercrhqpqeqnqdqfqdpcqpoqpdocpqnqopmcnddpd
+F-H0-14893 4 djqpoppddpddcffc
+F-H0-14894 2 gdppcpdhdedcpd
+F-H0-14895 2 fqdpnpddoe
+F-H0-14896 4 qqqpoplpqocpporopdrndd
+F-H0-14897 4 pnnqppeqqdddoc
+F-H0-14898 3 jdkqdpfqcnqpddqfncpd
+F-H0-14899 2 prppnqqndpqdcfkcddfc
+F-H0-14900 3 cnpqqhjppfdppdqnddqf
+F-H0-14901 4 gqerhqdreqfqfpcqdpppcngpddpd
+F-H0-14902 2 ccppbqbpepdodpcocpboeockcipdddcd
+F-H0-14903 2 ckqodqpedd
+F-H0-14904 2 fqqrorprpqqqoqnqlqqpppdppoqnciddcffcpdccbd
+F-H0-14905 5 pndppqpofqonopnnooddpd
+F-H0-14906 2 mcdqpqodqd
+F-H0-14907 2 dnpqepcpddqd
+F-H0-14908 2 mdofppqeneoepdqdod
+F-H0-14909 2 qcofppqeneoepdqdod
+F-H0-14910 2 gepqdpqddjgdfdfcdd
+F-H0-14911 3 gdcfpppdcpddfcgcdb
+F-H0-14912 4 rpppqnnpondppdpkfddjddcf
+F-H0-14913 4 cnfqeqppdqgpcpepdd
+F-H0-14914 4 doeqdrepdqenpppdcocd
+F-H0-14915 3 ddpqhqfqdppd
+F-H0-14916 2 dcpqhqfqdppd
+F-H0-14917 4 ebdepppddpecdc
+F-H0-14918 2 pidpoqqjqpqfqlrdqhddpdqcnd
+F-H0-14919 4 dlpqipfqdpfodnfmddpd
+F-H0-14920 5 rrerqrqqdrhqcreqpqdqnqqpfqdpcqpocpdocnddpd
+F-H0-14921 3 ccppdpdecgpddccd
+F-H0-14922 2 olrrqqrqpqqpopmpondppdqndd
+F-H0-14923 2 gqbrdqbqcqppepgpencppdcndd
+F-H0-14924 2 nckqdpfqcnppdcpd
+F-H0-14925 2 qnkqdpfqcnppdcpd
+F-H0-14926 4 rdqhpppdcpddqfncof
+F-H0-14927 2 qqpqqpppqojppodpqnoopmpnpeonddom
+F-H0-14928 5 onrqpqqqfqspppqpjpdpqoropoqnrnpnqlcnpddd
+F-H0-14929 4 nqjpppqndppjpddjddjd
+F-H0-14930 4 cfdppocededcpd
+F-H0-14931 5 rpdrqqiqpqfqcqqpdpppqnopcnqldcpd
+F-H0-14932 3 copqhpcqcpepeodpenfocndmddpd
+F-H0-14933 2 prqqpqppnqmpdppoooonnoqdpldd
+F-H0-14934 3 eppppdcpndpjcdqfic
+F-H0-14935 2 fccnkqdjqpqdfpdddp
+F-H0-14936 3 poqpoqlpdpqnonddpd
+F-H0-14937 4 npdpoqqofqpoqpooppdnipddpd
+F-H0-14938 2 kcppcqcfqdddfc
+F-H0-14939 4 dnpqepcpdepd
+F-H0-14940 2 qjrpqqdppqrofqrnjpqnqopnpocnrmplqlddpd
+F-H0-14941 2 fcdppqpopdcfdd
+F-H0-14942 2 ecnqppdppdedcd
+F-H0-14943 2 qqpqdpplpoccpd
+F-H0-14944 2 pmqpoplpdpccpd
+F-H0-14945 5 qpqrqqpqpocpddqdocld
+F-H0-14946 2 qodppqpnqkmnpd
+F-H0-14947 2 keppdpifchgfjdefhdcffdpdddbdcclc
+F-H0-14948 2 ofcnppdjjppddpjdpjddqf
+F-H0-14949 2 jjdpfqdjppjdjpddpjncpd
+F-H0-14950 3 dhpqkqpkdpdedcpd
+F-H0-14951 4 dfpqdpcfndqdddfc
+F-H0-14952 5 ebdpppdepdcddccccb
+F-H0-14953 4 lolqnqkqkpppjplpdppnnopjdcpd
+F-H0-14954 2 nnpqmpopdpjppoooonqkddpd
+F-H0-14955 2 pmpqmpopdpjppoooonqkddpd
+F-H0-14956 4 ceppdhdpeeefqddeddfddced
+F-H0-14957 3 pfppdpnepdnclcdc
+F-H0-14958 2 cnpqhqfqdpfopddd
+F-H0-14959 2 oqpppqmpfqdpjppoooonnodnplddpd
+F-H0-14960 2 cfppcnfpdjdpefdgeefepdedhdddcd
+F-H0-14961 2 epqpopcppc
+F-H0-14962 3 pnnqppcqpjdcpd
+F-H0-14963 3 fohqfqdpppncqfdcpdpb
+F-H0-14964 2 coppdojpcndpdmendddnpcem
+F-H0-14965 2 qodrnqfqdpcqqnppcnpnpmonddpd
+F-H0-14966 2 pcqqnqrpppqndpneqfpdmdndncdd
+F-H0-14967 4 podppqqnfqcnipdcpd
+F-H0-14968 3 iqhqfqeqppdpipdnfoddpd
+F-H0-14969 4 qqppnqoodqpjdcpd
+F-H0-14970 3 fqppdpcncfcjdcpd
+F-H0-14971 2 pfdpppqfpjqdpeqcpdncjddcpcqbocpbob
+F-H0-14972 4 nonqppmpnpjppjdpjjdjpdddjd
+F-H0-14973 3 oqrqrrpqqrqpqqqopppoopnodponooqlqnqddcoc
+F-H0-14974 2 onpqdpfqqnjppnqocnpodcpd
+F-H0-14975 2 jjdpfqdnppcgjpjdpjddpfncpd
+F-H0-14976 4 cfdpppdfeffedeeepdecdddccc
+F-H0-14977 2 ldqodpdjddnencpd
+F-H0-14978 2 fcpqlqeqiqcppdqoddcf
+F-H0-14979 3 olqqrppqdpfqrojprnqoqnpopnrmnnqlcnplddpd
+F-H0-14980 3 qjchppegdppfpgofqfdecfqdbfpdqejdcdddccdc
+F-H0-14981 5 ppqppqnpqodppdpodd
+F-H0-14982 2 ncbqbrppfqdpdqcpcqbpepclddpd
+F-H0-14983 2 qnppdpchedpdfcdddccdccbdbbbc
+F-H0-14984 2 nmorprnrqqnqoqnpqplpopoodponnopdmodd
+F-H0-14985 2 ehppdpdhegdfefcfdebfcefebdeedcbeccpd
+F-H0-14986 4 qfdpppgdchncdedcpdebcdcbcc
+F-H0-14987 2 qcpqdpcdpfpc
+F-H0-14988 5 lddppqnepkkdpfjdpdddlcnckc
+F-H0-14989 2 ncppnqopmpnplpmodpmnlopjddpd
+F-H0-14990 3 qqpqppnqmpfqdpjppoooonnonnmocnplddpd
+F-H0-14991 3 dpjjppdcpd
+F-H0-14992 2 pjdqppjjpd
+F-H0-14993 4 oqqqpqppmqopqppddpddqf
+F-H0-14994 3 popqdpqfoeqcpdncdd
+F-H0-14995 2 qpqqppnqoocppdqndd
+F-H0-14996 4 ecpqdpcedecdpddcdd
+F-H0-14997 2 npqnppqedpcdjcpc
+F-H0-14998 2 hcpqdpqdqjocddfc
+F-H0-14999 4 nqpppqmpooponoonplddpd
+F-H0-15000 5 pqrqqqqpopdpcdpnpcpe
+F-H0-15001 2 nnpqdpoppoooonpd
+F-H0-15002 2 pmpqdpoppoooonpd
+F-H0-15003 4 dcppdppdhdfcddcc
+F-H0-15004 2 ebdpoqdhdffedeeepdddfddced
+F-H0-15005 3 onpqmpjpdpoopoqkdcpd
+F-H0-15006 2 oppqmpjpdpoopoqkdcpd
+F-H0-15007 5 ecdppqcedecdqddcdd
+F-H0-15008 3 cfpqdppdcdgdeceddcfc
+F-H0-15009 2 doppjjpded
+F-H0-15010 2 peppjjdpde
+F-H0-15011 2 dnfpdppd
+F-H0-15012 5 fecnppdkfppddpedfdcdfcec
+F-H0-15013 5 qooqpoqppdjpddep
+F-H0-15014 2 ooopfqdpqppmlpddpd
+F-H0-15015 2 gcdqppfedhcedcpd
+F-H0-15016 2 noppnqkppdcpdd
+F-H0-15017 2 dpopecpd
+F-H0-15018 4 dpjkppigpd
+F-H0-15019 5 bcqpcndpdfedpdcccd
+F-H0-15020 3 hopqhqkqdpfqdnfoddpd
+F-H0-15021 3 popqdpddqc
+F-H0-15022 3 qcppdppjqfnemdpdncnddckd
+F-H0-15023 3 ccoqdpefdicffdpdddbd
+F-H0-15024 2 dgoqdpefdicffdpdddbd
+F-H0-15025 3 qqnqrpppdpqlqnpkonqhqjpdcfjdddfc
+F-H0-15026 2 qcqdodmc
+F-H0-15027 2 ofqgpepc
+F-H0-15028 3 ceppdqdgeeefeddedcpd
+F-H0-15029 2 cfppdqdoepeneodmdcpd
+F-H0-15030 2 qqhrgriqfrgqhqfqeqppdpipqnfocnqlddpd
+F-H0-15031 5 sppqrqfqqqrpqpppdpjproqoqnpopnrncnqlddpd
+F-H0-15032 2 qkrippoidprhrjqhsiphqirgpipdohndqfjdofdd
+F-H0-15033 3 ckpqdpcicdcfdcqd
+F-H0-15034 2 odpqdpcicdcfdcqd
+F-H0-15035 4 rnqqrppqdpfqrojpqnqopnpoonrmcnqlddpd
+F-H0-15036 2 cpppnqqndcpd
+F-H0-15037 2 dfdppqedbeicpddccdccbc
+F-H0-15038 2 cnqqqrqpordppqpopdqkcd
+F-H0-15039 3 oodppqpofqccpd
+F-H0-15040 4 dpdqcqeoppdndoddpd
+F-H0-15041 3 bfppcndpbedepdcehdedcd
+F-H0-15042 2 nqoqoroppqdpfqpoplddpd
+F-H0-15043 2 ipfqdpppdipjdcpd
+F-H0-15044 2 jdfqdpppdipjdcpd
+F-H0-15045 3 bcdpppchceecpddcddcbcc
+F-H0-15046 2 dckpqppddp
+F-H0-15047 3 mkqnppqmjppmdpolpnnkonpdomddnl
+F-H0-15048 2 okqnppqmjppmdpolpnnkonpdomddnl
+F-H0-15049 2 fqdppopdjjncqf
+F-H0-15050 2 deppdppjjdpfnccfdcpd
+F-H0-15051 2 cdppdppjjdpfnccfdcpd
+F-H0-15052 2 cippdppddedccdebcccb
+F-H0-15053 2 qnppqedpdddj
+F-H0-15054 2 dffqbpcqcnppckdpqdfcdd
+F-H0-15055 2 dcpppdddcd
+F-H0-15056 2 deqocpdcpd
+F-H0-15057 4 oqqrorprpqqqlqnqppqppodpciddcffcpdccbd
+F-H0-15058 2 qqdrercrhqmqeqfqdqcqdpppdocpqncnddpd
+F-H0-15059 2 kqdrercrhqmqeqfqdqcqdpppdocpqncnddpd
+F-H0-15060 5 ccdpqqpc
+F-H0-15061 4 dnppfpdpddpd
+F-H0-15062 5 nomppqpoooonplddpd
+F-H0-15063 4 oqopfqdpcqeoqppncnddpd
+F-H0-15064 2 gedpppdhffdfeffedeeepdfcgdecdddccc
+F-H0-15065 3 bqcqppepcpdcpd
+F-H0-15066 5 roqqqppqpprpopqndpqdqlcd
+F-H0-15067 5 oddppqqfqhddqdqcpdpc
+F-H0-15068 3 qfdppqckcedgcdcffcdedcpd
+F-H0-15069 3 pqqqppnqdpqnpnpdqlcd
+F-H0-15070 2 dqfqhqcqfpppdpcnddpc
+F-H0-15071 3 rdpqdppdqfndcfjdddfc
+F-H0-15072 2 popqdppdqfndcfjdddfc
+F-H0-15073 5 cqcppqdnepddpd
+F-H0-15074 3 gfpjpppdcpjdeffdcfdd
+F-H0-15075 3 fcjjpppddpddjclc
+F-H0-15076 2 qgppdpqlqjjjddpd
+F-H0-15077 4 pdpqdpddjj
+F-H0-15078 2 fcdpjqcnfqqjppddpd
+F-H0-15079 2 qmdpjqcnfqqjppddpd
+F-H0-15080 2 cndpqipdqfrcrdqclcnc
+F-H0-15081 2 eddpqipdqfrcrdqclcnc
+F-H0-15082 5 ccdpppdhcfdfeebfdecepdbegdddcddcbddbcb
+F-H0-15083 3 qneqfqdqepppcecppdjcdc
+F-H0-15084 3 rpqqpqppqpdpqdpndd
+F-H0-15085 3 dcbpfqcncqckqppddpddfccdcchc
+F-H0-15086 5 ppqppqnpdppoqoddpd
+F-H0-15087 2 fdpddpcdceeceddcddcc
+F-H0-15088 4 mrnrpsoqqrlqorqpqqpppqopnqnonppjdppddd
+F-H0-15089 4 fcppdppdeddddccdccbdbbbc
+F-H0-15090 4 bqcqppepcppddncd
+F-H0-15091 3 pooqpqrpfqppopdpjpqonoooonqnnnpnpmcnplompddd
+F-H0-15092 3 fppqdpfqdjqedd
+F-H0-15093 4 rppqqqoqppnqmpooponoonmonnpldcpd
+F-H0-15094 4 cddpppfecfidqdfdgdddfceccc
+F-H0-15095 3 jpdpfqcnppmdqijdpeddpc
+F-H0-15096 4 fopqjqlqfqhqdedppdqo
+F-H0-15097 3 pfnqppdqqnjpcncpckddpdnc
+F-H0-15098 3 fcjppqdppkdjpdddjd
+F-H0-15099 2 lpjppqdppkdjpdddjd
+F-H0-15100 2 pfdppqncqkccpd
+F-H0-15101 2 qhcqppqjqdccoc
+F-H0-15102 2 fohqfqdpopdcpd
+F-H0-15103 2 cqhqfqdpopdcpd
+F-H0-15104 5 ppdrercrqqpqhqnqeqfqdqcqdpqppocpdocnddpd
+F-H0-15105 5 cfqpefdgeefepdedhdddcd
+F-H0-15106 4 poqqppqppd
+F-H0-15107 2 qjprqqkrppnqkpdppnnoddpd
+F-H0-15108 4 poqpoplpqodppdrocd
+F-H0-15109 2 ohqhpiphqfpdofnd
+F-H0-15110 4 ercqcrppdqcpfpdoecpd
+F-H0-15111 4 rmrpqqdppqrofqqnjppnqoonpocnqlddpd
+F-H0-15112 5 oooqdpfqqoqppoppdnipddpd
+F-H0-15113 2 pnmpppdppiddpc
+F-H0-15114 2 mnqqrpppqnnponjppddpddql
+F-H0-15115 2 kdppdppjnepfddpdncqcpblc
+F-H0-15116 2 ijppkj
+F-H0-15117 4 hqnqlqdqkqkpjqjpppiplpnopnlopjecpd
+F-H0-15118 5 pcdppqmdneddpdocndnc
+F-H0-15119 5 pqqpqqppnqkpdqpjdcpd
+F-H0-15120 2 ncfqdpppcnjpqjqlqgqeddpd
+F-H0-15121 3 pnqrhrgrpqfriqqqgqhqfqeqppqpipdppoqnfocnqlddpd
+F-H0-15122 4 nqppdppjddrdrcqdqcpdpcodncndnblc
+F-H0-15123 5 qnorqrpqproqqqlqnqppqppodpciddcffcpdccbd
+F-H0-15124 2 mpoqqpdpdedcpd
+F-H0-15125 2 fdoqqpdpdedcpd
+F-H0-15126 3 mpppnqnpdppddc
+F-H0-15127 2 nhppdpoiqiqhpiphohogqfpdofnddfjdddfc
+F-H0-15128 3 cqdrdpfqdnqpddpd
+F-H0-15129 2 ncdrdpfqdnqpddpd
+F-H0-15130 3 cfpqdqpdcdfdeceddcfc
+F-H0-15131 2 fpfqppcndpdfkepdgdcdedmckcecfcdc
+F-H0-15132 3 qqpqpocpocpedcqd
+F-H0-15133 2 dfdqqpodqecdedpc
+F-H0-15134 3 bnfqeqgpdqepppdncpddpd
+F-H0-15135 2 gdcnppdkfpeedpdefepdedcd
+F-H0-15136 3 kplqnqppnodppdpncd
+F-H0-15137 2 qfprqpqqlpppcpopqonooonnqnpmonpdomdd
+F-H0-15138 4 fppqjpfqdpdnddpd
+F-H0-15139 5 dcdqchpppdcfjdccdd
+F-H0-15140 2 cfjppqdpfqcodqencqdncncmdmddpd
+F-H0-15141 3 rcppqnnppjdpqfodqdqcdd
+F-H0-15142 3 jdpqdppkncqfdcpd
+F-H0-15143 2 rdpdqpiddpcdqfnc
+F-H0-15144 5 ndlqfqeqjpdqfpppepcpqhcnpdqfjdofdd
+F-H0-15145 2 nnqppplpopdpnoqoploopdondd
+F-H0-15146 2 ccdpppdheffedeeepdechddcdd
+F-H0-15147 2 pbrepeqeqdpdqcpc
+F-H0-15148 4 mcpcpencnd
+F-H0-15149 5 dddhppfeefeedepdgddc
+F-H0-15150 3 ocpeqeoeqdodpdpcnd
+F-H0-15151 5 cdppdppddedccccb
+F-H0-15152 2 pomqoqqppddpddqf
+F-H0-15153 2 noppnqkpcpddqd
+F-H0-15154 5 oqoppqqodppddd
+F-H0-15155 5 qooqqpdppdpocd
+F-H0-15156 2 fppqdpfqdjqdddoc
+F-H0-15157 3 qpqjqeqfqdpfpcpenc
+F-H0-15158 2 qnnqppdqcdpd
+F-H0-15159 2 ppeopdfd
+F-H0-15160 2 dcnpdpoe
+F-H0-15161 5 fqppdqdocpdncocnddcffcpd
+F-H0-15162 2 djpdppddepfccf
+F-H0-15163 5 qodrercrhqnqeqfqdqcqrpppdpcpdornqncnpmqmplqlddpd
+F-H0-15164 2 eqprqqnqppkqqncpddpd
+F-H0-15165 4 rqqrpqqqoqppnqoprpnpqpdpmpqoddpd
+F-H0-15166 4 cqoqfqbpdpcndcod
+F-H0-15167 2 dfqppedpndcdedpc
+F-H0-15168 4 ppjjdpoe
+F-H0-15169 5 rnerdrhqcreqnqdqfqrpcqdpppdocpqncnpmqmplqlddpd
+F-H0-15170 2 pcneppqddppdpgndoeldodddncocmc
+F-H0-15171 3 oonppppndpedpd
+F-H0-15172 3 qopqppqpmpkpdpqkddpd
+F-H0-15173 2 qqpqppqpmpkpdpqkddpd
+F-H0-15174 2 qnppdqfpcpdocodnqdcndd
+F-H0-15175 2 bfdppqdfpdfdcdedecfcdc
+F-H0-15176 3 oqqqpqppnqmpfqdpjppoooonnonnmocnplddpd
+F-H0-15177 4 pkdpkqcnfqqmqpqjqgdcpd
+F-H0-15178 2 qoqqppnqdpqnpnpmonpdpjdd
+F-H0-15179 5 opcppqpoeponoodcpd
+F-H0-15180 2 qcqepeqdoepdodndpcoc
+F-H0-15181 2 qfpfpeqeoepdqdpcodoc
+F-H0-15182 4 efpqdpdgdfqfodcfndqdjdpcddocnc
+F-H0-15183 3 cqhqpqdpfqdjqkddpd
+F-H0-15184 5 qnpqponqnodppdqodd
+F-H0-15185 2 ncfqcnppdjdpdgiepdfegdfdcdickcfcdc
+F-H0-15186 3 ncfqppdqdocpdncocnqjqlqfdjofqhcedfcdcffcdedcpd
+F-H0-15187 2 ndfqppdqdocpdncocnqjqlqfdjofqhcedfcdcffcdedcpd
+F-H0-15188 3 prdrqqpqnqlqqpfqdpppcnpoddpd
+F-H0-15189 4 cqippqdpfqqjqnqgqdddoc
+F-H0-15190 2 pnmqnqlqnpjqlpppdpkplopjddpd
+F-H0-15191 2 pomqnqlqnpjqlpppdpkplopjddpd
+F-H0-15192 2 qcpqqqfqqpppdpjprnpoqnomcnqlddpdnclc
+F-H0-15193 2 nolqnqppdpqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-15194 4 jdjqcnppdjfppddpdd
+F-H0-15195 3 qmdppqqofqcnjpdcpd
+F-H0-15196 2 epcpppjjddqd
+F-H0-15197 4 noqpopoodppd
+F-H0-15198 5 dedqchpppdcfjdcdddccdc
+F-H0-15199 2 qejjrdqfpdrenclc
+F-H0-15200 3 femppqjppodppkidpdddfc
+F-H0-15201 3 qnppnqfpcpddpd
+F-H0-15202 5 oppqnpoopoplddpd
+F-H0-15203 2 cfdppqjdpkddqfncpd
+F-H0-15204 2 jpdppqjdpkddqfncpd
+F-H0-15205 4 rcdppqodqdqcdd
+F-H0-15206 4 qndrdppqpofqcnqoddpd
+F-H0-15207 3 qepqdpqppoqoqnrerdqdddoc
+F-H0-15208 4 fqppcndppdpjndqfcd
+F-H0-15209 3 nedpppqfpjmdpdncnddckd
+F-H0-15210 4 pppqmpkpdpooponoonqkddpd
+F-H0-15211 2 hplqnqkqeqjqkphqjpppiplpnopnlopjddpd
+F-H0-15212 2 qdqldpqjqoqipkqhpjphpipdohndqfjdofdd
+F-H0-15213 2 dqpqpdqfnc
+F-H0-15214 4 poqqpqnqlqqpppdpciddcffcpdccbd
+F-H0-15215 3 nomqdqqpopddpd
+F-H0-15216 5 dnfqipopdpfoddpd
+F-H0-15217 2 cnpqhpepcpenddpd
+F-H0-15218 2 cmpqhpepcpenddpd
+F-H0-15219 3 nerqqpqqpppqopnqdprproqnqopdqlddnclc
+F-H0-15220 2 npdrercrhqfqeqcqdqppdpcpdocnqnqlddpd
+F-H0-15221 5 qpppqopd
+F-H0-15222 2 bnppeqepdqcpdpeocodobocndndmddpd
+F-H0-15223 5 ooopdqpmqppdlpdd
+F-H0-15224 5 jddqpqcfpdcdfdeceddcfc
+F-H0-15225 2 drdppqcnfqccpd
+F-H0-15226 2 jpdppqcnfqccpd
+F-H0-15227 3 jqpqoqppnqnpmpdppdnoddpjncqf
+F-H0-15228 2 fpppdqdoqepjqdqfcdpfpcpenc
+F-H0-15229 5 pcpqodpfddqdqcrc
+F-H0-15230 2 cfdppqdheffedeeepdfcgddcdddbcc
+F-H0-15231 2 nnprqqpqppnqmpoodpnopoplonpddc
+F-H0-15232 3 qjkqdqqpdcpd
+F-H0-15233 2 qfkqdqqpdcpd
+F-H0-15234 3 cppopqdcqd
+F-H0-15235 2 mqopdqcdqp
+F-H0-15236 3 qlopqpdplponqnolcdpd
+F-H0-15237 3 dqpqipfqdpcqencndndmddpd
+F-H0-15238 2 jdppdpqoqmqhqjqddcoc
+F-H0-15239 2 mqppdpqoqmqhqjqddcoc
+F-H0-15240 4 pgpippqhdppdphcdqf
+F-H0-15241 3 ncdpkqcnfqpkqpqjqlpjplqfqkdcpd
+F-H0-15242 4 bdpqdpbhchcgdgbgcfdfbfdecepdcddddcecebccdbbccbbb
+F-H0-15243 5 onrrrqqrpqqqqpppqooppodpnoooqlqnqddcoc
+F-H0-15244 3 oomppqdppdpodd
+F-H0-15245 5 oqpqrpfqppopdpjpqonoooonqnnnpnpmcnplompddd
+F-H0-15246 4 pnrrrqqrpqqqqpoqqopppoopnodponooqlqnqddcoc
+F-H0-15247 4 qpqqppnqnodqpjdcpd
+F-H0-15248 4 fqeqepppcecppdjcdc
+F-H0-15249 5 obpeqdpdqcdd
+F-H0-15250 2 jdpqdqpkddpfncpd
+F-H0-15251 3 nopqdpqkqodcpd
+F-H0-15252 3 fmhqpqdpkqhofqdnfoddpd
+F-H0-15253 3 nqpopqnopmddpd
+F-H0-15254 3 lppopqnonqpicppdpldd
+F-H0-15255 2 ndqpcidppdqfdc
+F-H0-15256 5 rpqpqqpppqopqndpqdqlcd
+F-H0-15257 2 dqfqipcqdpppencndndmddpd
+F-H0-15258 2 cofqipcqdpppencndndmddpd
+F-H0-15259 3 jpdpfqdnpoddpd
+F-H0-15260 3 gqppfqgpdqdpcqcpcneopddjcd
+F-H0-15261 3 iopqnqoqiqgqopqpmpdppdqnddqf
+F-H0-15262 5 qedppqqfqhrdreddqdrcpdqcodpc
+F-H0-15263 2 kpmppqdppkdjpddd
+F-H0-15264 2 jpppnqqndpqdddoc
+F-H0-15265 5 bpppenfpcndpcddkpc
+F-H0-15266 2 qfdrpqjqlqfqcqhpdppdqoddcn
+F-H0-15267 2 cfdrpqjqlqfqcqhpdppdqoddcn
+F-H0-15268 2 qnfqcnppdjdppdiecdickcfcdc
+F-H0-15269 2 mppqopoqqodppddd
+F-H0-15270 4 poqqppqpdpddpd
+F-H0-15271 2 fqqqrrqpqrdppqponpqmjpjdqkncpfdcpd
+F-H0-15272 2 fpcnppjjdppdpjdd
+F-H0-15273 3 pepdqdocpc
+F-H0-15274 2 frfqeqcqipqpfpgpdpcpfocnddpd
+F-H0-15275 4 cqdripfqdpopdnfoddpd
+F-H0-15276 2 npdpfqqnppdcpd
+F-H0-15277 4 piqhdppdpondqfjdofdd
+F-H0-15278 4 roqqdrpqiqcqfqrpqpdpppqnopcnqldcpd
+F-H0-15279 3 dndqpqcpeqcodpcndoddpd
+F-H0-15280 4 qoqqqppplpopoodpqnnoonpmdcpd
+F-H0-15281 3 rpdppqroqoooponoonqnompnqd
+F-H0-15282 4 nkppqnjpqmdppmpnolonpdomddnl
+F-H0-15283 5 rqqpqqpppqoprpdpqnroqdqlcd
+F-H0-15284 3 qpqqpqpndppddc
+F-H0-15285 2 rqqqqpnppddpcd
+F-H0-15286 2 dfdpppqdeccd
+F-H0-15287 2 epqpoqcpddpd
+F-H0-15288 3 jdepppcfpdddfc
+F-H0-15289 2 mqqpqqpppqopnqkpdqpjdcpd
+F-H0-15290 2 ndppdqpjqcqdpcpdncoddckd
+F-H0-15291 5 jpiqfqhqppdpipcnfoddpd
+F-H0-15292 2 qpqqpqdpfqqnjpcnqlddpd
+F-H0-15293 2 ppqqpqdpfqqnjpcnqlddpd
+F-H0-15294 2 pkeopqeepd
+F-H0-15295 2 iqoeppeecp
+F-H0-15296 3 fcpqdqdfcecfcddedcpd
+F-H0-15297 3 pcdppqqfqhcfpdddjdqcfc
+F-H0-15298 2 eeppeqpdceed
+F-H0-15299 2 dqppcoepecpd
+F-H0-15300 2 nppqpodqpddd
+F-H0-15301 2 eddppqdgpdeccd
+F-H0-15302 2 dedppqdgpdeccd
+F-H0-15303 3 ocdppplepjmdneldmencpddcnd
+F-H0-15304 2 popqdpqdcffcdddb
+F-H0-15305 3 qdqhpppfdppdqfddqcpcnc
+F-H0-15306 2 nfppdppjqfqepfpdddnd
+F-H0-15307 2 plqopqpdcpcd
+F-H0-15308 2 dedpqpdcqd
+F-H0-15309 4 kqqqnqrpppdpqlqnpkonqhqjpdcfjdddfc
+F-H0-15310 2 qjprdrercrnqqqhqfqeqcqdqppkpcpdppndocnddpd
+F-H0-15311 4 nopqpocppdpmdd
+F-H0-15312 5 nddpqhpopdqfjdofdd
+F-H0-15313 2 kplqnqppdppnnopd
+F-H0-15314 2 prlqnqppdppnnopd
+F-H0-15315 5 pmpqdpfqpooponoonnpnddpd
+F-H0-15316 4 cpppcqdpqjpdcc
+F-H0-15317 2 oqeqqpecpd
+F-H0-15318 2 qdppdpddpfpcqcqb
+F-H0-15319 5 mppppqopoqnpnqdpqpqoddpd
+F-H0-15320 3 oqerdreqcrdqfqopcqipqpdpcpdocndcpd
+F-H0-15321 3 fqdpppmdqijdpedcpc
+F-H0-15322 2 opqpqddpodpjddpgkc
+F-H0-15323 3 qferdrhqcreqpqdqfqdpcqdocpnccndcpd
+F-H0-15324 5 rcodpqddpfqcqd
+F-H0-15325 2 qdjjqgpepcqc
+F-H0-15326 5 qfppcddpncpd
+F-H0-15327 2 ohogphpfpgofrfqeqfrdrepdlcnc
+F-H0-15328 3 mdppdppjqfpdncnddckd
+F-H0-15329 5 oqppnqnpmpnodppd
+F-H0-15330 3 ekcqdqcpppcnjpdmdpcmenpddnddem
+F-H0-15331 2 pkqqpqqpppqnjpqmdppmpnpdonddom
+F-H0-15332 5 rpqqpqppoqopnqnpqpdpmpqoddpd
+F-H0-15333 3 phrqqpqqpppqopnqdprproqnqopdpkddqfqcrdnc
+F-H0-15334 2 ofrqqpqqpppqopnqdprproqnqopdpkddqfqcrdnc
+F-H0-15335 5 qcppqhcppdqfndofddrd
+F-H0-15336 3 qhdppqponqqnqppnqopjqddcoc
+F-H0-15337 5 pqppoqopqppndppedd
+F-H0-15338 5 qcqprqppqqoppqdpnqrorpqoqnpkpdqfddrdnc
+F-H0-15339 4 jqpqnqoqopcqnpqppdqncd
+F-H0-15340 4 qkpqdpfqqnqpcnipddpd
+F-H0-15341 3 cidqppcdcfdcpd
+F-H0-15342 3 cpcqdqnppddndd
+F-H0-15343 2 qniqdpfqcnppddpd
+F-H0-15344 3 phdppppjqipiqhqfpdofndcfjdddfc
+F-H0-15345 2 medpoqofqpnfphpeoepdnemdpcddocqcnc
+F-H0-15346 2 qrqqpqppoqmpnqdpooponoonplnnqdddoc
+F-H0-15347 5 nqqprqppqqoppqdprproqnqoqdqlcd
+F-H0-15348 2 qddpppqjocdc
+F-H0-15349 4 qnpqqqqpppqodpqmpopd
+F-H0-15350 5 qmkqdpfqcnqpqjqgdcpd
+F-H0-15351 4 opoqqppndppd
+F-H0-15352 3 dddpppqipdqfqcrdnc
+F-H0-15353 3 ocdpppoepjodnemdmencpddcnd
+F-H0-15354 2 qfjqpqcqbpfpqodpcnddckncpd
+F-H0-15355 3 mpppnqnpdppjddoe
+F-H0-15356 2 ceppeqodcpdcqd
+F-H0-15357 2 mcppeqodcpdcqd
+F-H0-15358 3 qncrbrhqfqeqcqdqbqppdpfpeoepdocpcofopdendd
+F-H0-15359 3 lgppdppjlenemdmeldpdncnddcoc
+F-H0-15360 2 qlfroqeqfqipcqfpqpdpgpfocpqjcnddpd
+F-H0-15361 2 fcfroqeqfqipcqfpqpdpgpfocpqjcnddpd
+F-H0-15362 5 qpdqpqpoqoqnqddcoc
+F-H0-15363 2 fpcnppcijppddpdc
+F-H0-15364 2 oqpqdpqppoqoqnpjpmqdddoc
+F-H0-15365 4 ndqqpdcqcdqfic
+F-H0-15366 2 ncpqepqoddpd
+F-H0-15367 2 cipdppcddoec
+F-H0-15368 2 lpipfqdpppdnfodlfmddpd
+F-H0-15369 2 qjqpdpjpdcpd
+F-H0-15370 4 cfppdhdpceefqdfedddedcfdtted
+F-H0-15371 2 opcope
+F-H0-15372 3 pdpqdpce
+F-H0-15373 2 dceqppqd
+F-H0-15374 3 ddfqhqppdppd
+F-H0-15375 3 fdpqdppdcfedeccd
+F-H0-15376 3 idfqcnppdjdpdgffpdhdedfdcdfchcfbecebccdbgb
+F-H0-15377 2 qjrpqqdppqrofqrnmpqnjppnqonnpocnrmplqlddpd
+F-H0-15378 4 qfqppdncdd
+F-H0-15379 5 rqqqqpopdpcdpnpcpe
+F-H0-15380 4 hcppdphedgfefcdedcpd
+F-H0-15381 4 pgpjpqpfdppdqfddnc
+F-H0-15382 5 npqnpponjppddpjdqldd
+F-H0-15383 3 qkdppqqncjddpd
+F-H0-15384 2 dbdppqefdhdefepdeegdfcdddccc
+F-H0-15385 2 qoqqqppplpopoodpqnnoonpmcdpd
+F-H0-15386 3 ppeqddqd
+F-H0-15387 5 norrrqqrpqqqqpppqooppodpqlqnqdddoc
+F-H0-15388 2 ogppeqcmcpqlqjcjqgqecgpddd
+F-H0-15389 2 pjdoppeepd
+F-H0-15390 3 fqdodqcnqpdmcppdcocd
+F-H0-15391 5 redppqqfqhrdqdddpdqcodpc
+F-H0-15392 2 jqqqprlqnqppdppnnopddc
+F-H0-15393 2 jqqqpqhqoqqpnqppopnpmpoolpnodpmolopjdcpd
+F-H0-15394 2 edqdppcdod
+F-H0-15395 2 dcpqdoqd
+F-H0-15396 5 cedppqcfeefdpdeceddccd
+F-H0-15397 3 ndjjqhqfpdof
+F-H0-15398 4 orqqqrqppqpocpddqdocld
+F-H0-15399 5 hppqdrlqjqcqfqdppdqoddcn
+F-H0-15400 5 hoiqfqhqpphpjpdpipcnfoddpd
+F-H0-15401 5 lpqqqrqpordppqpompnoplmopddd
+F-H0-15402 2 cgppdfdpdeegcedgpdefddcf
+F-H0-15403 2 molqppqnnponql
+F-H0-15404 5 eqdqppepfpeodpdocppdcodd
+F-H0-15405 3 qddpppqfpjmdneqcpdncnddckd
+F-H0-15406 3 nelqnrqpqqpppqopnqmodqpjncpddclc
+F-H0-15407 4 dndqppcpdococnpd
+F-H0-15408 4 qqrpfqdpppqnnpdnjpddpd
+F-H0-15409 4 ofppoeneqdod
+F-H0-15410 5 dcdppqdfpdcdedbccc
+F-H0-15411 2 hcppcejpqddpdcjc
+F-H0-15412 3 npqpoqlpdpponooooncdpd
+F-H0-15413 2 cgpqdpdhefeefeedcedcpd
+F-H0-15414 2 qfjqqopddodd
+F-H0-15415 2 nppqdpplpopdcffcdddb
+F-H0-15416 2 iporqrpqproqqqlqnqfqqpppdppoqnddpd
+F-H0-15417 3 pnpqopppnpoopoplddpd
+F-H0-15418 2 ocpqceqd
+F-H0-15419 3 dpcpppeoepenfodcpd
+F-H0-15420 5 omrppqdpfqqnjpcnpoqmpnpmpkddpd
+F-H0-15421 3 qeppcppfpcdd
+F-H0-15422 4 edeqppcppdcd
+F-H0-15423 5 dqqrqqorqppqfpfqdpeqponpfogpqlcnddpd
+F-H0-15424 2 qgppeqcmcpqlqjcjcgpddd
+F-H0-15425 5 qjerdrhqcreqnqdqfqrpcqdpppqocpdornqncnpmqmplqlddpd
+F-H0-15426 5 jpdppqjjpkddpd
+F-H0-15427 3 hcpqgqqkdppdddfc
+F-H0-15428 2 pkqnpppddpcdcmic
+F-H0-15429 2 dddqdoqppd
+F-H0-15430 2 fpdqdoqppd
+F-H0-15431 5 crcqdqppfpdoecpd
+F-H0-15432 3 qcqnppnddpddpepc
+F-H0-15433 3 qqqpdqpnopddpd
+F-H0-15434 5 qfppdppjqdpeqcpdncjddcpcqbocpbob
+F-H0-15435 3 cnipfqdpppddqe
+F-H0-15436 2 fedpqoidpdddfc
+F-H0-15437 2 qqpqdpplpoqddjocdd
+F-H0-15438 5 qmpqdpfqpooponoonnqnpmpnddpd
+F-H0-15439 5 qlerdrhqcreqnqdqfqrpcqdpppdocpqncnpmqmddpd
+F-H0-15440 3 pjppdpqipiqhqfpdofndcfjdddfc
+F-H0-15441 4 mppqdqplpoqdddoc
+F-H0-15442 3 nooppqnpppdpoopoplpnpd
+F-H0-15443 5 rdpiqppdcpndqfjdofdd
+F-H0-15444 3 fqcnqpqddpcd
+F-H0-15445 4 opqpqddpddqioc
+F-H0-15446 3 fcdpppcfddod
+F-H0-15447 2 dbcfqipdqfddrdrclcqcfcnc
+F-H0-15448 3 qrnrpqqqoqnqmqppqpopnpdppd
+F-H0-15449 2 cqdqppcmdoqddd
+F-H0-15450 2 nomqopqpdpdcpd
+F-H0-15451 3 nqoqopqpdopdpndd
+F-H0-15452 5 cddpppeededdpddccc
+F-H0-15453 3 qmrrqqqrqppqdpnppojpjdqkncpfdcpd
+F-H0-15454 3 qdppdppjpdpeddoe
+F-H0-15455 2 peoeppoddpjdpddd
+F-H0-15456 3 dmqqqrdqorqppqfpfqdpeqponpfogpqlcnddpd
+F-H0-15457 3 ncpqfrfqeqcqipgpfpcpdpqofocnddpd
+F-H0-15458 3 icppdpbeedcddcpcccbc
+F-H0-15459 3 emppdqfodoeocodnencndcpd
+F-H0-15460 4 nqdppqpofqnopldcpd
+F-H0-15461 2 ofqfjjnfoererdqdrcpdqcocpcncobmcnb
+F-H0-15462 4 qhdpfqcnppqjjpqfqmddpd
+F-H0-15463 3 cnqqdpfqdcpd
+F-H0-15464 2 qippdppdqfqcrdnc
+F-H0-15465 2 fqfpdqpopddocd
+F-H0-15466 2 eqeppqdncpedpd
+F-H0-15467 3 djdqppepdocpdncocnddpd
+F-H0-15468 4 mprpqqdppqrofqrnjpqnqopnpoonrmcnqlddpd
+F-H0-15469 4 qmoqqpdpqopopdpncd
+F-H0-15470 2 jqdpppclcjcecgddpd
+F-H0-15471 3 dfpqdpfejdpdddfc
+F-H0-15472 3 nqfqppdqdocpdncocnqncjddpd
+F-H0-15473 5 nmnqqpmpppqonpqndppmpnomonqdpkdd
+F-H0-15474 3 qndrercrhqpqeqfqdqcqdpcppoqodocndcpd
+F-H0-15475 2 ppdrercrhqpqeqfqdqcqdpcppoqodocndcpd
+F-H0-15476 2 rqqqpqppqpdppdpndd
+F-H0-15477 2 pcdppqqnfqonqpcnmppjjpddqhncpd
+F-H0-15478 2 cjdpppcedfcdcffcdedcpc
+F-H0-15479 2 djfqpqdqdocpdncocnddpd
+F-H0-15480 2 pnrppqdpfqqnipdnpoddpd
+F-H0-15481 4 gpipfqfpppdpcncecfcddedcpd
+F-H0-15482 2 pneqopqpddpd
+F-H0-15483 2 qqeqopqpddpd
+F-H0-15484 3 loqqpqqpoqppnqnpopoompnolpmodppjdcpd
+F-H0-15485 2 ccrpnqqnppchdppdcfdd
+F-H0-15486 2 nedrdpfqcnppddpdnclc
+F-H0-15487 4 cffqpqcpcjclpcdd
+F-H0-15488 4 onqpopmppddpddpjncqf
+F-H0-15489 3 gpopfqdpqpcpcoencndndmddpd
+F-H0-15490 2 emopfqdpqpcpcoencndndmddpd
+F-H0-15491 2 gdpqdppdqocdedecfcdc
+F-H0-15492 2 dkdpppdhheidfegcdedcpd
+F-H0-15493 2 fqrprqdpqproppqooppoooqmddpc
+F-H0-15494 5 qppqqqlqnqppdpciddcffcpdccbd
+F-H0-15495 2 jpfrhqergqdreqfqfpcqdpppcngpddpd
+F-H0-15496 2 geppdppdcfgdfdfcddcchcfbgcebecdb
+F-H0-15497 3 cqdrhpfqdpppdnfoddpd
+F-H0-15498 2 gqdrhpfqdpppdnfoddpd
+F-H0-15499 4 nqpppqmpfqdpjppoooonnocnplddpd
+F-H0-15500 2 jdgqpqdppkddpd
+F-H0-15501 5 fcppdheffedeeegdpddddc
+F-H0-15502 2 hemppqjppodpqkddpdhcjd
+F-H0-15503 5 rqerdrqqcrhqpqeqnqdqfqppcqdpqppocpdocnddpd
+F-H0-15504 2 ccbpcqenppcnfpbkdppddkcdedgc
+F-H0-15505 3 ponppqqodpddpd
+F-H0-15506 2 qjdpoqddqpncpfkcpd
+F-H0-15507 4 popqdqqdddnc
+F-H0-15508 5 nomppqcpeppoooonplddpd
+F-H0-15509 4 noqrnrorrqmrqqpqnqoqppmqopqpdpnpqopd
+F-H0-15510 3 jpdppqdnfqccpd
+F-H0-15511 3 fepdpqcddpgced
+F-H0-15512 2 ccdpqpcgdedcpd
+F-H0-15513 2 dhqqdpdedcpd
+F-H0-15514 2 gqpqcpeqdcqd
+F-H0-15515 5 qddpppqfpjddpdqcndnclc
+F-H0-15516 4 roqqrqpqqpopdpcdpnpcpe
+F-H0-15517 5 fmdqppepdoeoenfndmddpd
+F-H0-15518 3 ldeqppnepjkdpfncpddclc
+F-H0-15519 2 kqnqlqdqppkppnnopjecpd
+F-H0-15520 2 pldqpqqoqdddoc
+F-H0-15521 2 oqqpeqddpd
+F-H0-15522 3 oipqdpfqpoqpqnnppmqoqiqgddpd
+F-H0-15523 3 cfcqdrdpiqcnfqpdppfcdd
+F-H0-15524 4 mqpqqqhqjqppqpdprnpoqnompdqldd
+F-H0-15525 3 cqdqqpeododcpd
+F-H0-15526 2 endqqpeododcpd
+F-H0-15527 4 cfcededcqd
+F-H0-15528 2 olqpoplpdpqmonddpd
+F-H0-15529 2 eeppdhdppddedcfd
+F-H0-15530 5 brcrfqdqcqipppdpcpddpd
+F-H0-15531 5 fqeqdqppepfpeodpdocppdcodd
+F-H0-15532 4 pnqqpqppqpdpqopoqmqnpd
+F-H0-15533 2 qpcepc
+F-H0-15534 3 kilkjkkkkjjj
+F-H0-15535 2 qffqdpppdjjpjdpjddjjncpd
+F-H0-15536 3 fdfqcnppcidppdjcncgcdc
+F-H0-15537 2 pidpppqjqnqgqdcfkcddfc
+F-H0-15538 2 popqdqpdcc
+F-H0-15539 2 copqdqpdcc
+F-H0-15540 3 pbrpqqqnpponnprkdppfpkpdncdd
+F-H0-15541 3 rcqfpdrdqcqdnc
+F-H0-15542 2 pjceqppddpndqfdc
+F-H0-15543 2 dndqpqcedfcdcffcdedcpd
+F-H0-15544 2 dodqpqcedfcdcffcdedcpd
+F-H0-15545 4 qedpoqqjqpqgqldcpd
+F-H0-15546 2 ocdpppmdpjddneqcpdncnd
+F-H0-15547 2 dqcqppcnjpdmdppdendddn
+F-H0-15548 2 fqpqlpnqdpqkddpd
+F-H0-15549 5 hpfqiqpphqjpdpipcnfoddpd
+F-H0-15550 3 lfmeppcedpqdmfmdnemcoddc
+F-H0-15551 3 kqnqlqkpppnodppdpncd
+F-H0-15552 2 pepqdppgqgrfpfqfqeqdoddc
+F-H0-15553 4 reodpqddpfqcqdpcrc
+F-H0-15554 5 ncpqdpqhqfrerdqeddqdrcpdqcodpc
+F-H0-15555 5 qqpqppoqopnqnpqpdpmpqoddpd
+F-H0-15556 5 eqdqppcoepdcpd
+F-H0-15557 2 pkqeqfqdpfpcpenbnd
+F-H0-15558 5 qrpqqqoqppnqoprpnpqpdpmpqoddpd
+F-H0-15559 4 rqqqmqopqpnodppdqmcd
+F-H0-15560 3 ocdppppfqdoddc
+F-H0-15561 2 dicqdrppiqdpfqdnpdcfdd
+F-H0-15562 2 dedpppcgcfdfpdedcd
+F-H0-15563 4 rdoqdpqpqjqlqfpdddmc
+F-H0-15564 4 gccipppddplcjcdc
+F-H0-15565 2 leqfmemdpdocodncndlcpc
+F-H0-15566 3 cfdppqdecepdcddddcec
+F-H0-15567 2 hohqppdpjpddpjncpfpbpd
+F-H0-15568 2 iohqppdpjpddpjncpfpbpd
+F-H0-15569 4 rnpqdpfqpooponronnooqmqnpmpnddpd
+F-H0-15570 3 eqcpqqqdddoc
+F-H0-15571 3 dfqpdppdeccd
+F-H0-15572 2 cfqpdppdeccd
+F-H0-15573 4 ncdpppciedcedcpd
+F-H0-15574 2 dnppdpgpddpd
+F-H0-15575 2 cjppnqqnjppddpicdffcdddbcc
+F-H0-15576 5 ereqpqipfqfpdqdpgpfocnddpd
+F-H0-15577 2 cjeqpqcppkdcpd
+F-H0-15578 3 nqppdqpjddpc
+F-H0-15579 3 cgdppqdgcfdfpdedcd
+F-H0-15580 2 ecdppqdgcfdfpdedcd
+F-H0-15581 3 qjmqdpfqcnppddpd
+F-H0-15582 5 qpqrqqpqdpnppopkddpd
+F-H0-15583 4 pqnqoqopqppddpddcffcbd
+F-H0-15584 3 qopqqpoqoppppopndcpd
+F-H0-15585 5 cjdpppcedfcdcffcdedcqd
+F-H0-15586 4 pqoqppnqnpmpnodppd
+F-H0-15587 2 qrhrgrpqfriqqqgqhqfqeqppqpipdppoqnfocnqlddpd
+F-H0-15588 4 qlpqrpfqdpipqnpocnpnqmpmddpd
+F-H0-15589 5 ndppcnfpdjdppiqfpdofdd
+F-H0-15590 5 bkcqbpppenfpcndpcddkpc
+F-H0-15591 3 nnpqppnqmpfqdpjppoooonnocnplddpd
+F-H0-15592 5 pqnqoqopqpdopdpndd
+F-H0-15593 2 fqdpppqjjpdjpdgefceddcddcccdfbhc
+F-H0-15594 2 chlqnrqpqqpppqopnqmodppjjdcjddpd
+F-H0-15595 3 ceppdpcgefcddedcpd
+F-H0-15596 2 dhppdpcgefcddedcpd
+F-H0-15597 4 pqopqodpddpd
+F-H0-15598 2 dedqppcndjdcpd
+F-H0-15599 2 lqnqqpcedppdjcdc
+F-H0-15600 2 cdoqdpqpqjcfdcpd
+F-H0-15601 3 kqqqprppnqpndqqiddpc
+F-H0-15602 4 epppfqfpgpdpcocpcnenemdndmfmpddkcd
+F-H0-15603 2 qbrepeqeqdpdqcpcpbob
+F-H0-15604 4 roqqrqpqmqopqpnodppdpndd
+F-H0-15605 3 ogpppfcopdpgjdqfdd
+F-H0-15606 4 fqppdqgpgodpfodoeofndlenddpd
+F-H0-15607 3 nocppqpoeponooddpd
+F-H0-15608 2 opcppqpoeponooddpd
+F-H0-15609 5 fcppdpdfcecfcddedcqd
+F-H0-15610 3 mpppnqnppddpndpjddqf
+F-H0-15611 3 gqpqnqoqopqpmpqndpddpd
+F-H0-15612 2 qipqdpnqpoqpqnqopmddpd
+F-H0-15613 2 oopqdpqmqoqddcoc
+F-H0-15614 3 qfcjpppdjpdddp
+F-H0-15615 2 pjcjpppdjpdddp
+F-H0-15616 2 oecqppqgqepcdd
+F-H0-15617 2 nqdppqpofqnoipcnplddpd
+F-H0-15618 3 qqpqrpfqdpjproqoqnpopnrmcnqlddpd
+F-H0-15619 2 rnpqrpfqdpjproqoqnpopnrmcnqlddpd
+F-H0-15620 2 pnnqppdppdjjfcdd
+F-H0-15621 2 pcpepdqd
+F-H0-15622 2 qcpepdqd
+F-H0-15623 2 qfppeqpdcfjdddfc
+F-H0-15624 3 oocqirmpdrippqdpfqpofodnplddpd
+F-H0-15625 2 ppcqirmpdrippqdpfqpofodnplddpd
+F-H0-15626 3 pleqpqdqfqcpjppofpcnepdcpd
+F-H0-15627 2 rnhrqrpqgriqfrgqqqfqhqppeqipqppodpfoqnpncnqlddpd
+F-H0-15628 2 dcqqdpoc
+F-H0-15629 2 dpceppqc
+F-H0-15630 2 cndppopddc
+F-H0-15631 3 rmqrrqprqqpqoqqpppqodpqnpopmpnqlqmqdddoc
+F-H0-15632 2 rrqrrqprqqpqoqqpppqodpqnpopmpnqlqmqdddoc
+F-H0-15633 4 nqpppqmpfqdpippoooonnocnplddpd
+F-H0-15634 4 ddqpdpqe
+F-H0-15635 3 npqqrqpprpopqpqolpnodpqnpopmoopdondd
+F-H0-15636 3 rrqqqrqppqdpnqpoplnopd
+F-H0-15637 2 cpppfpjpcoepcndpdmenpddnddpj
+F-H0-15638 2 cfrqqqqppqrokqpnoppddpdd
+F-H0-15639 2 bpepdqdpcqcpcnclpd
+F-H0-15640 2 pepppidpqdpgkdpdddocpc
+F-H0-15641 2 rhppdpoiqiqhpiphohognhpfqfpdofnddfjdddfc
+F-H0-15642 2 qpeqddoc
+F-H0-15643 2 dpqopdce
+F-H0-15644 2 jqpqdppnddpd
+F-H0-15645 4 rqqqpqppqpdpqopopnrnqmqnpd
+F-H0-15646 2 ccdpqqcfddpdfcbd
+F-H0-15647 4 qnoqdpqpqkqgddpd
+F-H0-15648 3 ideqppcpofqgddqdocld
+F-H0-15649 2 cqdpdrhofqdnppddpd
+F-H0-15650 2 eeppjjdpoe
+F-H0-15651 3 ndnqqnppondppdncdd
+F-H0-15652 4 mopppqmpnqdpooponoonplnnpd
+F-H0-15653 2 ddppjjqfncpd
+F-H0-15654 2 jdppdppjndpfddpd
+F-H0-15655 2 endqdoqpddcm
+F-H0-15656 2 qqmqopqpdppc
+F-H0-15657 4 mpppnqnpdppjqnpddcjd
+F-H0-15658 3 jdpqcppkddpfncpd
+F-H0-15659 3 drippqdpfqdnfojdqkncpfdcpd
+F-H0-15660 3 bnfqeqfpdqepcppopddndd
+F-H0-15661 2 qgdqkqqjqpddpd
+F-H0-15662 4 rmrpqqdppqrofqqnjppnqonnpocnqldcpd
+F-H0-15663 4 qoppqndppmpnqhonreqfqerdqdrcpdqcodpcddnc
+F-H0-15664 3 onrppqdpfqqnjppnpodnplddpd
+F-H0-15665 4 roerdrqqcrpqrqhqfqeqcqdqqpopcpdppndocnddpd
+F-H0-15666 4 qeppofneoepdqdod
+F-H0-15667 2 qqrpnqqnpponql
+F-H0-15668 2 qkqfqhofpdrdnc
+F-H0-15669 2 qfpopqodcpndqdddpcncoc
+F-H0-15670 2 pbpqdpjpdjqkddpfncpd
+F-H0-15671 2 mpdppqooopnonpmoqoqnpopnqd
+F-H0-15672 3 gpqqqrqpordppqcpfqponpencodncnqldmddpd
+F-H0-15673 3 dopqcpeqqddcoc
+F-H0-15674 2 drdpfqcnppdjcedfcdcffcdedcpd
+F-H0-15675 2 cnppdqedcedcpd
+F-H0-15676 4 qfpfppqedppdpeddoepcqdocod
+F-H0-15677 2 ceeqoqcpdcpd
+F-H0-15678 2 cjeqoqcpdcpd
+F-H0-15679 3 jpdppqdnfqcepddc
+F-H0-15680 3 pcpjppoedpqdqfpdqcddnc
+F-H0-15681 2 bmdqpqipfqdpcqdocpcoboencndndmddpd
+F-H0-15682 3 gphqereqdrppfqfpcqdppddndd
+F-H0-15683 4 jpdppqcnfqcdpd
+F-H0-15684 3 cnhqpqdpfqcfpdddfc
+F-H0-15685 2 eqeppqdncpdepd
+F-H0-15686 2 cippdpceqjqddcnc
+F-H0-15687 2 mcdppqdffeodqdidfcddibccdb
+F-H0-15688 4 rqerdrqqcrhqfqeqcqdqqpopcpdppndocnddpd
+F-H0-15689 3 ncjqpppjdpreqfqerdqdrcpdqcodpcdd
+F-H0-15690 4 bdprqqnqppkqdpchpnpdqiedqfddcfcdrdqcdcnccc
+F-H0-15691 4 ccdpoqqjqpddpdhcfc
+F-H0-15692 2 oppqdpfqpnqpcnjpddpd
+F-H0-15693 2 qoeqpqpocpdcpd
+F-H0-15694 2 opdrercrhqpqeqfqdqcqdpcpqocndoqmddpd
+F-H0-15695 3 rdqpqhdpqdqfpdqccdpcrcrb
+F-H0-15696 2 nopqdpfqpojpdnpmdcpd
+F-H0-15697 3 cddhpppddpgcfedcdecbcc
+F-H0-15698 4 ceeqppcddeecpd
+F-H0-15699 2 cddppqpnnppjpd
+F-H0-15700 3 pqrqqqqpdqpnopddpd
+F-H0-15701 2 ndqpbpfpcndppdqfdd
+F-H0-15702 4 qbppdppjndqdqcpdpcodnckddcocobpb
+F-H0-15703 4 qffqmqjpeqfpdqeppppdcpjdcndd
+F-H0-15704 4 dnpqipfqdpfojdqkncpfdcpd
+F-H0-15705 3 prpqoqfqrpopppjpdppoqonoqnonpnnncnpmomplddpd
+F-H0-15706 4 ccpqcpfddedcpd
+F-H0-15707 4 onpqmpfqdpjppooocnpldcpd
+F-H0-15708 3 drpqdqeqcoepdcpd
+F-H0-15709 2 bdeepppddpjdcfdddccdccgcfbfcebgb
+F-H0-15710 4 ceppdqdgdfcgcfffeeefbebfeddedcpd
+F-H0-15711 4 gpppfqfpcndppdcjdd
+F-H0-15712 3 dnfqipopdpfodcpd
+F-H0-15713 2 pnpqcpqppoepqnqodcpd
+F-H0-15714 2 gddodqpdqpcdedecfcdc
+F-H0-15715 2 qorqqpqqpppqoprprodpqlqncjcedfcdcffcdedcpd
+F-H0-15716 2 qherdrhqcreqpqdqnqdpfqpocqdoqpqncppnqoqjcnddpd
+F-H0-15717 3 orppqqdpqppoccpc
+F-H0-15718 3 efdppqhdpdcdec
+F-H0-15719 2 pnqrpqqqfqeqppdqjpqpfpcpepqnpocnqldcpd
+F-H0-15720 2 lqppnqnpmpnmdppjddoe
+F-H0-15721 4 ccppdpgddedcpd
+F-H0-15722 3 dfppdpcedepdeccc
+F-H0-15723 2 qorqqrpqproqqqnqppqpdpoppoddpd
+F-H0-15724 2 rprqqrpqproqqqnqppqpdpoppoddpd
+F-H0-15725 2 fqqpdqfpopdoddpd
+F-H0-15726 4 bhppdpdhcichcgeffddedcpdebcdcbcc
+F-H0-15727 3 mpmqprppnqpndpqjqdddoc
+F-H0-15728 2 cndpppqjchfddedcpdebcdcbcc
+F-H0-15729 2 qcjpppqhdppdqfdd
+F-H0-15730 2 neppdpdjddpdnclc
+F-H0-15731 2 jcqeepddqopc
+F-H0-15732 2 edppdqdoqdcd
+F-H0-15733 2 qmdppqpocdqd
+F-H0-15734 3 cqgqepppcdcppc
+F-H0-15735 2 ncppdqjjdcpd
+F-H0-15736 3 ccdppqdnfqchjpjdqfddcfncpd
+F-H0-15737 3 qnpqdpfqpopppnjpcnqoddpd
+F-H0-15738 3 peoqdpqppdqdddqc
+F-H0-15739 2 cdfqdpqfpd
+F-H0-15740 4 cedpppdepdeccc
+F-H0-15741 4 qcqpqhdppdqfndofddrd
+F-H0-15742 3 eldoppcojpcndpdmeodlenpddncdem
+F-H0-15743 3 kqopmqlpqpnodppdpndd
+F-H0-15744 3 pjohppqgdppgphqdogldofddod
+F-H0-15745 3 nfpodpijneqeodoeddmeocndnbnc
+F-H0-15746 2 qppqppoqdppd
+F-H0-15747 2 onppqndpcepkpdjcdc
+F-H0-15748 3 fpppdqfoepeododncocnddpd
+F-H0-15749 4 qrqqpqcpnppopd
+F-H0-15750 3 onpqmpfqdpippooodnplddpd
+F-H0-15751 2 qiprqpqqlpppcpopqonooonnqnpmonpdomcd
+F-H0-15752 2 didpoqqkqpchefpgcfqfqepeqdfdpcddnc
+F-H0-15753 2 oqopqppnpd
+F-H0-15754 3 dqpqcqdpddqd
+F-H0-15755 2 oooqpqopqpdppppoqoqnpjpmqdddoc
+F-H0-15756 2 qqppqndpqdqldddjfccf
+F-H0-15757 4 ohppqgdppgphqdogldofddod
+F-H0-15758 2 ccdppqchqkjdpfddcfncpd
+F-H0-15759 4 qqpqponponcppdqmdd
+F-H0-15760 2 monqppmpnpdppjdjpddd
+F-H0-15761 2 popqdpfqcnjpjdqkddpfncpd
+F-H0-15762 2 eqgqppdqepcpfodcpd
+F-H0-15763 2 hpgqppdqepcpfodcpd
+F-H0-15764 2 ncpppdqfcdedecfcdc
+F-H0-15765 2 iddpoqcfocddfc
+F-H0-15766 2 fcdpoqcnfqddoc
+F-H0-15767 2 qepiqppedppdqfddqdpcqc
+F-H0-15768 3 qfpqdpnqpoqpqnqopmpdqicd
+F-H0-15769 3 pferdrnqcreqfqdqcqipppdpcpdoqnddcnncpd
+F-H0-15770 2 dnfqdpppclcnddpd
+F-H0-15771 2 eeppdpcfchpdddfc
+F-H0-15772 4 meppdpjpqfpjndoeddneqcqdpcpdncmd
+F-H0-15773 3 fqppdpcncedfpdcfcddedcfdfb
+F-H0-15774 3 cefrhqpqepfqdpdqcpcqgocickcfddpd
+F-H0-15775 3 ppqqdpedpd
+F-H0-15776 2 ocqeoepc
+F-H0-15777 4 deppchcopdcfjdcdddccdc
+F-H0-15778 3 gpfrfqdrcqgqppeqfpdqepbqdpcpcobpbodcpd
+F-H0-15779 2 pepdodpc
+F-H0-15780 2 qrqqpqnqoqppfqopnpdpooponoqnpnonpmqmplqlpkddpd
+F-H0-15781 2 nrqqpqnqoqppfqopnpdpooponoqnpnonpmqmplqlpkddpd
+F-H0-15782 4 cqfqppcpdpbodocncodmenbmdnpddkcd
+F-H0-15783 2 qdppjqdppjqfpdqcdd
+F-H0-15784 2 qqqpoplpjpqndplnonqlolddpd
+F-H0-15785 3 emcqdqcpqpcnkpbndppddoddcl
+F-H0-15786 3 opnqoqmpppepnpnopjdepd
+F-H0-15787 3 qpqqppnpdppnooedpd
+F-H0-15788 2 cedpppdhdedcpdfbedebecdbcc
+F-H0-15789 4 pnfqdpppqnjpdnqojdpjddpfncpd
+F-H0-15790 4 fohppqdpfqdcpd
+F-H0-15791 3 hppqjqfqiqkphqjpdpipdnfodcpd
+F-H0-15792 2 ccchpppdipjdcpddcf
+F-H0-15793 2 fqppdpcnccpd
+F-H0-15794 2 qnqlppogdppfphofohoepgpdqfjdqeddpeqcqdpc
+F-H0-15795 3 pkfqdpppqnnponjpcnqldcpd
+F-H0-15796 4 qoppqndppmpnpionpdpkdd
+F-H0-15797 4 dgdppqdfcfndqdddfc
+F-H0-15798 2 qnppnqkpeqpjecpd
+F-H0-15799 2 dqdpcqcpcnclpd
+F-H0-15800 2 idppeopdddfc
+F-H0-15801 3 qdpjpppddpjdqfddqcpc
+F-H0-15802 3 poeqpqnppdqocd
+F-H0-15803 3 dnfqjpqpdpfoddpd
+F-H0-15804 2 opppnqnpdqmomppjecpd
+F-H0-15805 2 hofppqdpfqgogpdjocdd
+F-H0-15806 3 rmqrrrprrqorqqpqoqqpppqodpqnpopmpnqlqmqddcoc
+F-H0-15807 4 nedpppndpjqcqdpcpdncoddckdqbocobnbpa
+F-H0-15808 3 eedpppdddedcpd
+F-H0-15809 3 prqrdrercrqqrqhqpqeqnqdqfqppcqdpqppocpdocnddpd
+F-H0-15810 3 pdofppoeneqdod
+F-H0-15811 2 oeqeqdpepd
+F-H0-15812 3 nqqprpnpoplpqodppoqnrnpnpmonpdqmdd
+F-H0-15813 2 cjdqppjjpjdcpd
+F-H0-15814 2 ppqppqdpqddcoc
+F-H0-15815 4 epdqqpcqdppdcd
+F-H0-15816 2 okqqrppqdpfqromprnjpqnqopnpoonrmcnqlddpd
+F-H0-15817 3 qqpqrpfqdpjpqnpocnpnqmplddpd
+F-H0-15818 2 qpdppqqnqdecoc
+F-H0-15819 2 qldppqqnqdecoc
+F-H0-15820 2 plqqrppqdpfqroipqnqopnpocnonddpd
+F-H0-15821 3 eopqdqgpdldodcpd
+F-H0-15822 3 ckerbrdreqcrcqdqbqcpppbpdpcodocndnbncmdmbmclblddpd
+F-H0-15823 2 ocdpppjjpjddpdncjd
+F-H0-15824 3 endoppcnjpdmdpdldnpdemcdel
+F-H0-15825 3 qpqqppnqoodqpjdcpd
+F-H0-15826 2 fdppcpefcgdedcpd
+F-H0-15827 4 ccprqqnqppkqdpchpnpdqiddqfqccfncrd
+F-H0-15828 2 cqoqqc
+F-H0-15829 2 ppcodcpe
+F-H0-15830 4 plqqrpppdpnpqnqhqjqdddoc
+F-H0-15831 3 okrpqqdppqrofqrnipqnqopnponnrmcnqlolplddpd
+F-H0-15832 3 dfppdppdddgdfcfdecgc
+F-H0-15833 2 fqdpopcjedpd
+F-H0-15834 2 jderdrkqcrhqfqeqcqdqppdpcpdocncfpdddfc
+F-H0-15835 2 nolqnqfqdpppdcpd
+F-H0-15836 3 ocpqdpodpodcqd
+F-H0-15837 2 hccqpqdhcedcqd
+F-H0-15838 3 dfdpoqqjqpdhcedcpd
+F-H0-15839 3 fcppepefdhdefepdeegddcdd
+F-H0-15840 4 friqhqfqeqppdpipdnfodcpd
+F-H0-15841 4 hqdrgqpqdpfqcngpdcpd
+F-H0-15842 2 qfppdpjpdjpjjdjjddpdnc
+F-H0-15843 4 dcoqdpqpqjpdddfchccc
+F-H0-15844 3 ndppcfdppdlecdjdlcfdeceddcfc
+F-H0-15845 2 bkdrfqdqcqdpppdocpdncocmcnclbmckblcecfcddedcpd
+F-H0-15846 3 qppppqmpkpdpqkdcpd
+F-H0-15847 4 qrrqqqpqppqpdpqopopnrnqmqnpd
+F-H0-15848 4 coqrqqordqpqqpfqfpeqdpnppogpfocnqldmddpd
+F-H0-15849 3 rqqqqpopdppdpnddjc
+F-H0-15850 2 nqdrppcqhpepcpdpeofocoqnenfncndmempdcidd
+F-H0-15851 2 qfkqdpfqcnqpqjqldcpd
+F-H0-15852 2 qgkqdpfqcnqpqjqldcpd
+F-H0-15853 2 fcppnqpjdpheddpdhcjd
+F-H0-15854 2 fcnqlqkpkqjpjqiphqdpgqnopplolpgopndjpjddpd
+F-H0-15855 3 hcppdpcecipdecdddccccbbc
+F-H0-15856 2 rqqpqqpppqoprprodpqlqncjcedfcdcffcdedcpd
+F-H0-15857 4 dddqppfeefeededcpd
+F-H0-15858 4 pnqnpppicppdpkdd
+F-H0-15859 3 eecfppqdddfc
+F-H0-15860 2 pjohqhqfpdofnd
+F-H0-15861 3 qppppqdpqopocjddpd
+F-H0-15862 3 dgppdqdicfdfpdddfc
+F-H0-15863 2 rpkqdpfqqnppcnnpddpd
+F-H0-15864 3 ciqpdqcncpckddpd
+F-H0-15865 4 qepppfdppdpeddoepcqdocod
+F-H0-15866 2 eddqppdhdefepddcgd
+F-H0-15867 3 cfppdppipdqfqcrdncdd
+F-H0-15868 4 ofoqdpciqfqhddcffcpdccbd
+F-H0-15869 2 pnqrpqqqoqppnqmpfqdpooponoonmonnplddpd
+F-H0-15870 2 fcqqpqrpoqppnqmpfqdpjppoooonnonnmocnplddpd
+F-H0-15871 2 qcppqhcppdqfddofncrd
+F-H0-15872 3 jccnfqdjppdfdppdfdcd
+F-H0-15873 3 cfdpppdhffgeeffedeeepdjcgdfcddecccdccb
+F-H0-15874 2 bddidppdpmfdefddcf
+F-H0-15875 2 cfpqdpqcddfc
+F-H0-15876 3 nodrercrnqfqhqcqeqppdqkpdpcpdocnddpd
+F-H0-15877 3 qqprppnqjpdqpnnopjddpd
+F-H0-15878 4 qidppppiqhohphqfpdofndcfjdddfc
+F-H0-15879 3 cfppdoddod
+F-H0-15880 2 pjcnppdkfppddpcdqfnc
+F-H0-15881 2 eppqhqfqfpdqdpcqcpcnddpd
+F-H0-15882 2 jpdqppcodjcedfcdcffcdedcpd
+F-H0-15883 3 qepjpqpfdpofpgpdqfddnc
+F-H0-15884 4 pmppqndppipnpdpkdd
+F-H0-15885 3 gqpqipfqfpeqepdqdpcqcpcnddpd
+F-H0-15886 2 pffqppdpbpddcnncpd
+F-H0-15887 3 oqqqpqppnqmpfqdpippoooonnocnplddpd
+F-H0-15888 2 nqppdppjjdcjddpfncpd
+F-H0-15889 3 oedqppodpjmdneocmencpddcnd
+F-H0-15890 2 qqppnpdppnooedpd
+F-H0-15891 2 jjpdjddd
+F-H0-15892 3 qlrqqrqqproqpqppqpdpqopoqnpnpmqmqdddoc
+F-H0-15893 4 orppqqdpqppoddpd
+F-H0-15894 2 nppppndp
+F-H0-15895 2 ceppqedppcdedc
+F-H0-15896 2 dfppeqpdcpedcd
+F-H0-15897 3 qppqppoqdpddpd
+F-H0-15898 3 boqqqrdqorqppqfpfqdpeqponpfogpcocnqldmddpd
+F-H0-15899 4 driqpqdqfqdpcqdocpddpd
+F-H0-15900 2 odqqqrqporpopqqkcpddqdocld
+F-H0-15901 4 rfqpqhdpqeqipdpindqfddof
+F-H0-15902 2 jdppdpjpdjpjddpfncpd
+F-H0-15903 2 pppqdpfqqojpcnqmdcpd
+F-H0-15904 2 jppqnqppbqbpepdodpcocpbonoqneockddpd
+F-H0-15905 3 nppqqpoqopppqodppooopdpndd
+F-H0-15906 4 fofqppgpfpepdpcocpcndoemendmdnclfmpddkcd
+F-H0-15907 4 pqdrercrqqrqhqfqeqcqdqqpopcpdppndocnddpd
+F-H0-15908 3 nolqnqppqfdpceodqdmdpcncocicdc
+F-H0-15909 3 ceppdpdgeffecfpdeeedhdddcdcc
+F-H0-15910 2 opqqqppqppqndpqepkdd
+F-H0-15911 2 lqnqpppdcoddpjncqf
+F-H0-15912 3 eoqpdqgpdldodcpd
+F-H0-15913 2 ppqpoplpnodppmoocdonpc
+F-H0-15914 4 bfchppdecopdcfjdcdddccdc
+F-H0-15915 2 pidppqokqkddpd
+F-H0-15916 4 pmoqpqppqpdpqopoqnpnqddcoc
+F-H0-15917 3 gpjppqfpfqdpdnddpd
+F-H0-15918 2 godqpqjpfqfpeqdpgpfocnddpd
+F-H0-15919 2 hqdqpqjpfqfpeqdpgpfocnddpd
+F-H0-15920 2 qqprppnqkpdppnnoqdddoc
+F-H0-15921 4 rqqqpqppqpdpqopopnrnqmqndcpd
+F-H0-15922 4 ecoqdpqpqjpddecdddfchcccdcdbebcb
+F-H0-15923 4 pqrqqqmqopdqpdqpddco
+F-H0-15924 3 fcdppqdnfqcjjpddpd
+F-H0-15925 4 cpeqpqipfqfpcqdpcnddpd
+F-H0-15926 3 pfppdjjppddpjdqfddnc
+F-H0-15927 3 qkpqdpfqqnqpcnjpddpc
+F-H0-15928 2 kddpfqncppdcpd
+F-H0-15929 4 pjoqdpqipiciohqhqfphofcfddpdfcndccbd
+F-H0-15930 2 kplqnqppdppnnopjddoe
+F-H0-15931 3 ofcnppdjfpqhdppdqfdd
+F-H0-15932 3 ijjklkkjkkkijj
+F-H0-15933 2 odpqdpcjddqe
+F-H0-15934 2 qqmqopqpdppnnopd
+F-H0-15935 2 plpqponpondppdqm
+F-H0-15936 4 qppppqnpqodppdpocd
+F-H0-15937 2 cpdqgpppeodpdococndnpddldd
+F-H0-15938 4 rnpqqqqpppqodppnpoqmqndcpd
+F-H0-15939 2 qeppjqdppjqfrerdqdrcpdqcodpcdd
+F-H0-15940 3 cfdpppdhdecepddcfd
+F-H0-15941 2 qqppnqjpdppjdcpd
+F-H0-15942 2 ncdrcqiqdpfqdnopddpd
+F-H0-15943 3 lonqoqmqppmpopdpnpnomonnpjddpd
+F-H0-15944 4 pnpqrpfqdpipqnpocnplddpd
+F-H0-15945 2 ipfqdpppqjqmqgqdddnc
+F-H0-15946 2 mqeqppcpcjqnddpd
+F-H0-15947 2 cfdqjqcopppdddfc
+F-H0-15948 2 ocdppqpdqdndpcqcdc
+F-H0-15949 2 mprpqqdppqrofqrnjpqnqopnponnrmcnqldcpd
+F-H0-15950 3 dpeqdqppcoepddpd
+F-H0-15951 4 pppqmpfqdpjppoooonnocnpldcpd
+F-H0-15952 4 omqpqoppqndppmpnpionpdpkdd
+F-H0-15953 2 qgdqpqponqqnqppmqoqiqddcoc
+F-H0-15954 2 deppdqcopdeccd
+F-H0-15955 2 cnnqppjpqndppjddpd
+F-H0-15956 2 fqdpppjdpjddqfncpd
+F-H0-15957 3 jppqnqoqopqpnppodppcdd
+F-H0-15958 2 jcphogohpfpgofrfqeqfrdrepdlcnc
+F-H0-15959 2 fckqppdppcdd
+F-H0-15960 3 mopppqmpnqdpfqpojponoonnnocnplddpd
+F-H0-15961 3 pdpodpdc
+F-H0-15962 2 fqppdpcnfddjncdfdcpd
+F-H0-15963 3 qqpqdpnppopcdc
+F-H0-15964 3 fppqipfqdpcnecpd
+F-H0-15965 2 hcqpopdppnpdddfc
+F-H0-15966 3 dqcpppdojpcodpcneodmendldnpdemcdel
+F-H0-15967 2 ldiqqnpppjnpqdcpddod
+F-H0-15968 2 cgpqdpqkjdpfncdedcpd
+F-H0-15969 3 eqfqhqppgqgpfpcpdpcnddpd
+F-H0-15970 4 pgpfpqpddpddqf
+F-H0-15971 4 cgdpppdgefdfcffedeeepdecdddccc
+F-H0-15972 2 cdppdpefcgdefdbedcpd
+F-H0-15973 2 dippdpefcgdefdbedcpd
+F-H0-15974 2 ccdqppcfpdddfchcdb
+F-H0-15975 2 dnoqdpfqddqd
+F-H0-15976 4 prppnqkpnodppdpndd
+F-H0-15977 3 ndmppqjppodpqkqfqepfpdddjd
+F-H0-15978 2 qnppdqecpd
+F-H0-15979 2 dfircqdripfqdpppdnfockpdddfc
+F-H0-15980 2 eqfppqdpfqgodqfogpeoepddpd
+F-H0-15981 2 cfppdqodpfddreqcqdpcrckc
+F-H0-15982 2 qfdpqpcifddedcpdebcdcbcc
+F-H0-15983 4 pappdppjndqdqcpdpcodnckddcocqbpbobnb
+F-H0-15984 3 qdpiqppddpddqfpcqc
+F-H0-15985 3 cbppdpffdhefgecffedeeepdfcgddcdddbcc
+F-H0-15986 3 edpopddoiddgcd
+F-H0-15987 4 pedppqqfqhcfpdqdjdddpcqcfc
+F-H0-15988 3 icdfpppdedcddcbcccbb
+F-H0-15989 4 dqeppqdpeqdncpddpd
+F-H0-15990 3 dqpqjpfqdpcqdcpd
+F-H0-15991 3 qcqfppcedppdnekdnclcjchcpbdc
+F-H0-15992 2 jddrercrhqfqeqcqdqppdpcpdocnncpfdcpd
+F-H0-15993 2 plpopqodcpecqd
+F-H0-15994 3 rnqqppqpoplprodpqopopdqncd
+F-H0-15995 2 cedqppdhdeeepdddeddcec
+F-H0-15996 3 ereqdrepdqeoppendopdcocd
+F-H0-15997 3 rpdrercrhqnqeqfqdqcqdpppdocpqncnddpc
+F-H0-15998 2 fdpqdnpd
+F-H0-15999 4 qodppqpofqrnoponronnooqmqnpmpnddpd
+F-H0-16000 2 jjpqdpqodjqdddoc
+F-H0-16001 2 jppqdpqodjqdddoc
+F-H0-16002 4 friqhqfqeqppdpipdnfoddpd
+F-H0-16003 2 oqopqpmpponoooddpd
+F-H0-16004 2 qqpqrpfqdpjpqnpodnpnddpd
+F-H0-16005 2 qfpqdqqkecpd
+F-H0-16006 2 jqoqmqppdpqoqmqhqjqdddoc
+F-H0-16007 3 ofopqppidppdqfdd
+F-H0-16008 2 djcepppddfcdcffcdedc
+F-H0-16009 2 okdppqdjjpjdqkddpfncpd
+F-H0-16010 3 qoqdecoc
+F-H0-16011 2 nnpqppoqdpooponoonpd
+F-H0-16012 2 nqppdppjdfpdddfc
+F-H0-16013 2 jpppnqqndpdedcpd
+F-H0-16014 4 endqqpeogpdldodcpd
+F-H0-16015 2 nnqpqqlpppqoopoodpqnnoonpmdcpd
+F-H0-16016 4 qqpqppnqmpoodpnopomoonplnnpd
+F-H0-16017 2 gofqeqppdqgpfpepfodpeododlenddpd
+F-H0-16018 3 ipqpoplpdpqnonqlolcdpd
+F-H0-16019 4 qdpqdpqhqfpdcfjdddpcqcfc
+F-H0-16020 3 fpeqnqjpfqdpqpddpd
+F-H0-16021 2 lcnqlqdpppddpjncpd
+F-H0-16022 2 npnqlqdpppddpjncpd
+F-H0-16023 2 rpqpqqpppqopdpqlqncjcedfcdcffcdedcpd
+F-H0-16024 2 qqpqdpmqpoplnocdpd
+F-H0-16025 2 opdppqpofqonipcnooddpd
+F-H0-16026 2 nodppqpofqonipcnooddpd
+F-H0-16027 4 dmjqpqdpfqdncnddpd
+F-H0-16028 3 cmepppenhppdcpcd
+F-H0-16029 2 qfnqjpppqndppjpddjddjd
+F-H0-16030 2 dpnpddoe
+F-H0-16031 4 bqcqhpppcpepcmenddpd
+F-H0-16032 2 odppjqdppjqfqdqcpdpcdd
+F-H0-16033 4 pppqdpooponoonpd
+F-H0-16034 2 nqqprqppqqoppqrorpqodpqlqncjcedfcdcffcdedcpd
+F-H0-16035 4 fqppdqdocpdncocnpd
+F-H0-16036 3 oonqppqnddpd
+F-H0-16037 2 ocdodqodppcdqd
+F-H0-16038 3 eqdrercrjqfqdqcqdpppdocpdcpd
+F-H0-16039 4 eqdqpqcoepdcpd
+F-H0-16040 4 cdchpppdcojdcfddccdc
+F-H0-16041 2 lopqdpnqpofqnopldcpd
+F-H0-16042 4 qpqoppqncppmpnpionpdpkdd
+F-H0-16043 2 ooorprnrpqqqnqoqmqqpnpopqompnodppnpoplqnpddd
+F-H0-16044 2 ooqopqpnpodcpd
+F-H0-16045 2 eqdqqpcqepbodppdcd
+F-H0-16046 2 kdfqppdqdocpdncocncgpjdddjncpd
+F-H0-16047 2 qhmqfqeqjpdqfpppepcppdcnjdqfdd
+F-H0-16048 4 ecpoqe
+F-H0-16049 2 plcppqqoqddcoc
+F-H0-16050 3 bodqepcqdpbpcpcnclpd
+F-H0-16051 4 qnorqrpqproqqqppnqkpqppodppdcfjdddfc
+F-H0-16052 3 cfpqfqqkcppdddfc
+F-H0-16053 4 fcprqqnqppkqdpchpnceqibeqfpdcfedrdddbdcddcqcccncbc
+F-H0-16054 2 ecdppqdfcded
+F-H0-16055 2 irpqhqiqhpfqdpipiohodnfoddpd
+F-H0-16056 2 qmoqqpdplpondcpd
+F-H0-16057 3 odpqpndpddqd
+F-H0-16058 3 deppdppddcfd
+F-H0-16059 4 ddepppdheffedeeepddcgd
+F-H0-16060 3 omdppqpoqmonpdcfjdddfc
+F-H0-16061 4 qfpqdpfqpooprnroonqonnooqmqnpmpnddpd
+F-H0-16062 3 olqnpponjpnndpqmqopmpoqdpnddom
+F-H0-16063 3 focppqeoepddpd
+F-H0-16064 2 qjqnpppmdpplqlpdpkcd
+F-H0-16065 2 dhoqdpdicheffdcfddpd
+F-H0-16066 2 jdoqdpqpdjpjddpd
+F-H0-16067 3 qidppqqnfqcnqpqkjpddpc
+F-H0-16068 2 mejjogofqfoenfnererdqdrcpdqcocpcncobmcnb
+F-H0-16069 3 feppdpcfdfeecedeedpdcdfdfcdddcccebbcdb
+F-H0-16070 2 npqqdqddqd
+F-H0-16071 2 gdqnnqqippcddppcedecfcdc
+F-H0-16072 4 dffqdpppcnfeidpdddfc
+F-H0-16073 4 cdpodpcfcededcpd
+F-H0-16074 2 qpmqnqlqmpppdpnpqnpjdcpd
+F-H0-16075 3 prpqqqppnqpoqpqmdppddd
+F-H0-16076 4 cgdqppdfdgcfffeeefeddedcpd
+F-H0-16077 2 jdfqdpqpddpfncpd
+F-H0-16078 2 kpqqqppqppnqmpnpoodpnomopjqnpdddjd
+F-H0-16079 2 djrqqrpqqqqpoqroppqodppnpormrnqmqnpmonqdddoc
+F-H0-16080 4 ccbqhqppdqcpcqboepdnpdcfddbdfc
+F-H0-16081 3 mqnqlqmpppdpnpqnpjdcpd
+F-H0-16082 4 pqrqqqmqopfqdpqpdcpd
+F-H0-16083 3 pfcppqddpkncpd
+F-H0-16084 2 clppnqpnjpcndppjddpdhcjd
+F-H0-16085 2 cnbrdrfqcrcqdqppipcpdpcododnddpd
+F-H0-16086 2 enbrdrfqcrcqdqppipcpdpcododnddpd
+F-H0-16087 2 rcppdppjqdpeodoemdnepcmeocpdncnddcqc
+F-H0-16088 2 mqnqlqlpppdpkplopjdcpd
+F-H0-16089 3 cqbpppenfpcndpqeclddmcpcjchc
+F-H0-16090 3 jdircqdripfqdpppdnfoddqfncpd
+F-H0-16091 2 cqipppcpepdcpd
+F-H0-16092 3 rpdrercrhqnqeqfqdqcqdpppdocpqncnecpd
+F-H0-16093 3 nooppqnpfqdppppooopnplddpd
+F-H0-16094 2 odqhqprddpqdqfpdqccdpcrcrb
+F-H0-16095 2 codrbrcrpqhqfqdqcqdpcpdcpd
+F-H0-16096 2 fqdpppfdqdddochcfc
+F-H0-16097 4 rodppqpofqqnpppnjpcnqoddpd
+F-H0-16098 2 dppodcqe
+F-H0-16099 4 dnqrqqordqpqqpfqfpeqdpnppogpfobococnqldmddpd
+F-H0-16100 2 efdpppdgegcgdegcpddccdcbcc
+F-H0-16101 4 mdqnpppecpoeneqdoddd
+F-H0-16102 3 jpdpfqdnppcipdhdjddc
+F-H0-16103 2 djppdppjcdpdecjd
+F-H0-16104 2 qnqpoqdpfqcnipddpd
+F-H0-16105 2 qpqqppdpqlqncjcedfcdcffcdedcpd
+F-H0-16106 3 npqqpqnqoqppmqopqppdcpdd
+F-H0-16107 2 pomppqdpqkecpd
+F-H0-16108 3 rcppqddpkdodddqc
+F-H0-16109 3 onopqpnolppmdpcdoopc
+F-H0-16110 2 cfppdpgdcdedecfcdc
+F-H0-16111 3 eogqdqppdocopddndd
+F-H0-16112 3 rdqpqhdpqeqfpepfpdrejdqdddqcpc
+F-H0-16113 2 ppqqpqpocppdoodd
+F-H0-16114 2 dncqdqdoqppdeodd
+F-H0-16115 3 qnppqpoplpnodppmoopdonidcicd
+F-H0-16116 3 qipqdqnqpoqpqnqopmqddcoc
+F-H0-16117 2 dpdqcqcpnppddndd
+F-H0-16118 4 cfqppdgdcdedecfcdc
+F-H0-16119 2 cppqipfqfpcqdpcndcpd
+F-H0-16120 2 eqpqipfqfpcqdpcndcpd
+F-H0-16121 3 dmdodqenppfmempdcmdd
+F-H0-16122 3 ofppdpphqfpdcfjdddfc
+F-H0-16123 3 qddpppqfpdcdndqckdnc
+F-H0-16124 3 rbdpppdfndpejdqdpcddfcqcqb
+F-H0-16125 4 lpdrercrqqrqpqfqhqcqeqqpdqcpoprodppndocnddpd
+F-H0-16126 3 ppdoddod
+F-H0-16127 3 fdfqcnppdjdppdfceddcddcccdbchc
+F-H0-16128 3 rfpeqdpdqcmdobdd
+F-H0-16129 4 qeqpqhdppeqfpdpfjdqdddqcpc
+F-H0-16130 2 bodqpqipfqdpcqcocpencndndmddpd
+F-H0-16131 2 ojqhppohdppdqjndqfldofddmfqcrd
+F-H0-16132 4 nepqpocpodoeddqd
+F-H0-16133 4 crerdriqpqdqfqdpcqdocpddpd
+F-H0-16134 2 qfkqdpfqcmqpddpd
+F-H0-16135 4 repppfdpqeqfpdpeddoepcqdocod
+F-H0-16136 3 gnlqpqjqfqiqkphqjphpipdpmogohodnfoddpd
+F-H0-16137 3 fedppqbepdcdedgcdcbccc
+F-H0-16138 3 ccmppqjppodppkddpdhcfc
+F-H0-16139 2 ccppdqdfegcfefbfdefeceeebdbedcpd
+F-H0-16140 2 ckfqdrcqdqppdpcpdocodncncmbmclblcecfcddedcpd
+F-H0-16141 2 qnppdqedpc
+F-H0-16142 2 opqqqppqppoqdppd
+F-H0-16143 3 pqdqpcec
+F-H0-16144 3 fcqnnqqippcddppcedec
+F-H0-16145 3 qnpqpocpndqoddqd
+F-H0-16146 2 opdppqooroqnqopnpormrnqlpd
+F-H0-16147 3 kdfqdpppcnjpnepfddpdnclc
+F-H0-16148 3 fofqppgpfpcndppdcjdd
+F-H0-16149 2 cepqdpdgeeefeddedcpd
+F-H0-16150 4 ofpqpfdppdpgddqf
+F-H0-16151 3 fcdpppeepddeddcecd
+F-H0-16152 2 fccnppdjfpdddpoc
+F-H0-16153 2 pfdpoqcnfqddipncpd
+F-H0-16154 3 cqhqpqfpfqdpcndcpd
+F-H0-16155 2 ncqpcnfpdjdppdqfcd
+F-H0-16156 4 ocdpppndpjqcqdpcpdncoddckd
+F-H0-16157 3 eoppdqgpdkdoddpd
+F-H0-16158 2 phdppqpnqppjqd
+F-H0-16159 2 djqppdcondpjcdqfic
+F-H0-16160 3 dodqfqipeqfpqpdpgpfogogncndndmddpd
+F-H0-16161 2 olqnnqqjpppjdpmeqlqdqcpdpcodncddnblc
+F-H0-16162 2 qfdjkqpdqpcddp
+F-H0-16163 3 qqkqnqdqpdqpddco
+F-H0-16164 2 fqprnroroqpqmqqpopdppdqndd
+F-H0-16165 2 fppqjqqodpcndcpd
+F-H0-16166 4 prqpqqlpppcpopqonooonnqnpmonpdomcd
+F-H0-16167 2 oqpqdpplpoddpc
+F-H0-16168 2 pgdpppqdodldcd
+F-H0-16169 2 jpdpppkdpjdcpd
+F-H0-16170 2 cnfqeqfpdqepcppd
+F-H0-16171 2 dmfqcqeqppdqgpfodpeododnfndlendcpd
+F-H0-16172 3 nsnrpsoqqrlqorqpmrppqqoppqmpnqnonppjdppddd
+F-H0-16173 2 rpnqqnpppdcocd
+F-H0-16174 2 gddfpppddpidedcddcbcccbb
+F-H0-16175 4 pbppqedpqdpfndpdddodpcrcocqcmcncrbnbqbmboboa
+F-H0-16176 3 pgpppidprfogofqfqepfperepdsdjdqdddrcpcqc
+F-H0-16177 2 rqrppqdpfqqnipcnpoqmpnqlpmddpd
+F-H0-16178 3 qippqhdopdpindqfjdofdd
+F-H0-16179 2 rrqqqrqppqdpnqpopmnopd
+F-H0-16180 4 orppqqdpqppodcpd
+F-H0-16181 3 nqnppqpodpdcpd
+F-H0-16182 2 efdpppdhdfcfdeeepdceedddecdcebcbdb
+F-H0-16183 2 pnnqfqdpppqnjpcnqlddpd
+F-H0-16184 3 pnpqopfqnpppdpoopoplddpd
+F-H0-16185 4 prpqqqppnqkpqppodppdcfjdddfc
+F-H0-16186 3 cdpdppddcc
+F-H0-16187 4 qmpqqqoqppoodpnopopnqnpmonddpd
+F-H0-16188 2 edpdoocd
+F-H0-16189 2 geppdpfecidefdpddc
+F-H0-16190 3 ppdqopqpnolppmoopdondd
+F-H0-16191 2 qnppjqdppjqfrerdqercqdqcpdpcodncdd
+F-H0-16192 2 dndqdfdcpd
+F-H0-16193 3 hdcipppddpidjcfdiclcgcdc
+F-H0-16194 2 qdpdpcoc
+F-H0-16195 4 fofqfpgpdpcnddpd
+F-H0-16196 4 cqfrdrkqfqjqeqhqppgqipdphpcngpddpd
+F-H0-16197 3 frfqeqcqipqpfpgpdpcpfocndcpd
+F-H0-16198 4 ccppdpfddedcqd
+F-H0-16199 2 pmpqcpopqoddpd
+F-H0-16200 4 gcdpppddpdfcfd
+F-H0-16201 4 ecpqdpceodqddced
+F-H0-16202 3 ccdpppciceecpddcdd
+F-H0-16203 4 oqpppqdpooponoonpd
+F-H0-16204 2 cfpqdpqopnpdddfc
+F-H0-16205 2 mppqdpplpopddfjdddfc
+F-H0-16206 2 onqpoplppddpfddjddcf
+F-H0-16207 4 gcpqdpcffdpdddgdhcfc
+F-H0-16208 4 nonqppmpnpdppjqnpddcjd
+F-H0-16209 3 hohqpqdpjpjdpkddpd
+F-H0-16210 3 cofqdqeqipppfpgpdpgofocndndmddpd
+F-H0-16211 2 dlfqjpppdpfodnfmdcpd
+F-H0-16212 2 qfqpdqncpddc
+F-H0-16213 4 pqrqqqqpopdppdpnddjc
+F-H0-16214 4 nddppqqfpkddpdnclc
+F-H0-16215 2 oodqpqmpplpoqdddoc
+F-H0-16216 2 ppdqpqmpplpoqdddoc
+F-H0-16217 2 dfoqdpqpdjpdddfc
+F-H0-16218 2 qdqqcdcq
+F-H0-16219 2 dpqqdcqc
+F-H0-16220 2 fqdppqdjqdddod
+F-H0-16221 3 dncqdqcpppcodpcndopddkdd
+F-H0-16222 3 npqnppondpcdqlpc
+F-H0-16223 3 rqprqqpqoqqpppqodpqnpopmpnqddcoc
+F-H0-16224 2 peoeodpd
+F-H0-16225 2 obreqfqerdqdrcpdqcnc
+F-H0-16226 3 encqfqppeqfpdqdpepcpdoeodncopdemdd
+F-H0-16227 3 qfppdpedcinccedcpd
+F-H0-16228 2 pjcqppdofpddpd
+F-H0-16229 2 rdoqdpqpqjcjqfpdddnc
+F-H0-16230 2 proqpqnppodppkddpd
+F-H0-16231 2 iojqbqdqppcqhpepcpenbopddmdd
+F-H0-16232 3 qcppdpofpgpeneoepdqdodlddd
+F-H0-16233 2 emdppqcldkcjdjcididhehcheffdcfddpd
+F-H0-16234 3 qlopqpjplpdpqnonlnolddpd
+F-H0-16235 4 ooqppqopoqqopppodppdpndd
+F-H0-16236 4 eqdrercriqpqdqfqdpcqdocpddpd
+F-H0-16237 4 pnnqppnokppddpdd
+F-H0-16238 2 kqnqlqkpppdppnnopjecpd
+F-H0-16239 4 ohppqnnpondpolqlpkplpjqkpiqjqgqhogphpdjcdd
+F-H0-16240 2 iphqfqdpqpcnfodcpd
+F-H0-16241 3 fpfqipppdpcnecpd
+F-H0-16242 2 odqodpqedd
+F-H0-16243 2 qjjqdoppedpd
+F-H0-16244 3 gdeqpqdhdedcpd
+F-H0-16245 2 jddpoqqjqpdfpdddfc
+F-H0-16246 2 iqhqfqeqppdpipdnfodcpd
+F-H0-16247 4 qpqrqqpqdpplpodcpd
+F-H0-16248 2 hpcqdrdppqdnfqdcpd
+F-H0-16249 2 iqcqdrdppqdnfqdcpd
+F-H0-16250 2 nppqqopddodd
+F-H0-16251 2 cnhqfqdpppddcffcpd
+F-H0-16252 3 rnopqpqolppodppdrocd
+F-H0-16253 3 pmdppqqnfqonqpcnjpqkqidcpd
+F-H0-16254 3 qcppdppcpencddfc
+F-H0-16255 3 cndrfqdqcqdpppdocpcmcocecfcddedcpd
+F-H0-16256 2 eddpoopd
+F-H0-16257 2 eedpoopd
+F-H0-16258 4 pppqnppocppdqodd
+F-H0-16259 2 rdqpdpopqjqlqfpddcnc
+F-H0-16260 3 nolqnqppcddppc
+F-H0-16261 3 jpceppqddpodpjdc
+F-H0-16262 4 qrqqpqdpnppojpjdpkddpfncpd
+F-H0-16263 3 qippqhdpcepipdqfndofdc
+F-H0-16264 4 fdppdpeedgcedcpd
+F-H0-16265 3 roqqrqpqmqopdqpdqpddco
+F-H0-16266 2 nqcqbpppcnfpckdppdpjndqfdd
+F-H0-16267 2 qqpqdpmqpofqonqmddpd
+F-H0-16268 2 opqpcedppc
+F-H0-16269 2 fqdpoqdcqd
+F-H0-16270 2 jcppdqdecgpdgccddccccbbb
+F-H0-16271 2 kedppplepjncpddckd
+F-H0-16272 2 ecppdqqecdpc
+F-H0-16273 3 dbdppqdffejdpdddfc
+F-H0-16274 2 mdpedpndpcmcnc
+F-H0-16275 4 depqdqcedhqddchc
+F-H0-16276 2 enpqjqfqdpcndndmddpd
+F-H0-16277 4 ebcppqdefdpddccdcbcc
+F-H0-16278 3 kplqnqppdppnnopjecpd
+F-H0-16279 4 qddpppdepjqcpdnclc
+F-H0-16280 4 erdriqpqdqfqdpcqdocpddpd
+F-H0-16281 3 onpqdpqmpoedpd
+F-H0-16282 2 rgpppidppgqgrfogofqfqepfperepdsdjdqdddrcpcqc
+F-H0-16283 3 ccppdoceedpd
+F-H0-16284 4 poqqpqnqppqpqmdppddd
+F-H0-16285 3 pdqqddep
+F-H0-16286 3 dcdqpppdccdd
+F-H0-16287 3 pppqmpfqdpippoooonnodnplddpd
+F-H0-16288 2 ncjqdpfqdnppddpd
+F-H0-16289 2 oidrercrhqpqeqnqdqfqdpcqpoqpdocpqnqopmcnqiqgddpd
+F-H0-16290 2 oonppppnpd
+F-H0-16291 4 lqqrrqqqpqmqoqppnqoprpnpqpdpmpqoddpd
+F-H0-16292 4 ircqdripfqdpqpdnfodcpd
+F-H0-16293 2 pnoqnqopmqmpqpdplpmopd
+F-H0-16294 2 opqpqqpppqmpnqoodqpjqnpdddjd
+F-H0-16295 2 npqpqqpppqmpnqoodqpjqnpdddjd
+F-H0-16296 2 dqqpoppndcpd
+F-H0-16297 4 oqpqopqodpddpd
+F-H0-16298 2 clerpqcrcqdqcpfpdoddpd
+F-H0-16299 2 omqnpppmjpcedpocpn
+F-H0-16300 4 pfoqdpqpqjqlqfqedcpd
+F-H0-16301 2 pnnqppdppdcfjdcdfdeceddcfc
+F-H0-16302 4 qqpqoqqpppqodpqnpopmpnpcdd
+F-H0-16303 4 qcppdpnddfjdpepcddfc
+F-H0-16304 4 lqrqqqqppqdpoprocdpnpcpe
+F-H0-16305 3 fldqdoqpenemfmdmpdcmdd
+F-H0-16306 3 qqprppnqkpdppnnoqhrfogqfpecfpdqdjdddpcqcfc
+F-H0-16307 3 qhdpkqdnfqqfqpddpd
+F-H0-16308 3 ddeqpppe
+F-H0-16309 4 kccfqppdgdcdedecfcdc
+F-H0-16310 2 oqnqopmqmpqpdplpmopd
+F-H0-16311 3 qpdpdrpopqqnfqcnqoddpd
+F-H0-16312 2 pqqqmqopqpdddppc
+F-H0-16313 2 crcqdqqpcmdoddpd
+F-H0-16314 4 ppcnpd
+F-H0-16315 4 pppqqqqpdpqmpodcpd
+F-H0-16316 2 pierdrhqcreqfqdqcqppcpdpcndopdqfdd
+F-H0-16317 2 ncerdrhqcreqfqdqcqppcpdpcndopdqfdd
+F-H0-16318 2 ocpqdpodqoddqd
+F-H0-16319 2 kcppdppjnfmenelemdpdncodmcnddcoc
+F-H0-16320 2 dcppfqdodqdncpcncodjchpdddfc
+F-H0-16321 3 cqnpfqdpqpeocndcpd
+F-H0-16322 2 ncdpoqqjqpqfqlpfqedcpd
+F-H0-16323 2 lpoqcqpdqpdd
+F-H0-16324 3 qidppqqnfqcnqpqkipddpd
+F-H0-16325 2 kdcqiripdrdpfqdnppncfodcpd
+F-H0-16326 2 fdqqrpppqnnponcprkpkpdcfdd
+F-H0-16327 4 rrqqqrqppqdpnppojpjdpkddpfncpd
+F-H0-16328 3 cpppdqdococnddpepc
+F-H0-16329 3 pmpqlpnpdpnoqoqmooddpd
+F-H0-16330 3 qnoqpqppqpdpqopocjddpd
+F-H0-16331 2 cfppeppdjjdd
+F-H0-16332 2 jpdpfqcnppqddd
+F-H0-16333 2 pbcpppqfddpdnc
+F-H0-16334 3 nolppqdpnpqoqmooddpd
+F-H0-16335 3 nnpqqqoqppnqmpdppoooonnopdpldd
+F-H0-16336 2 opoqpqdpplpoqdddoc
+F-H0-16337 3 gperfqeqdqfpppdpepcpeocododdpd
+F-H0-16338 2 gpipfqfpcqdpqpcpcndcpd
+F-H0-16339 2 ppoqopdqpdqpcd
+F-H0-16340 2 engqercpppdnepdcpd
+F-H0-16341 4 ecppdqeffedeeepddcdd
+F-H0-16342 2 dqpqipfqdpcqqjqnqgqdddoc
+F-H0-16343 2 ofjqdpfqcnopqfqhddpd
+F-H0-16344 2 qcjqdpfqcnopqfqhddpd
+F-H0-16345 2 eofqqpcndppd
+F-H0-16346 2 ednqppdpcedcpd
+F-H0-16347 3 pnqqpqppoqdpooponoonddpd
+F-H0-16348 4 rmdpkqdnfqqmqpplqlpkqkqjpjdcpd
+F-H0-16349 3 nnoqnqppmqopmpnpdpmonopjddpd
+F-H0-16350 2 dbppcfchddfc
+F-H0-16351 3 qnppdpjpddpincpekcpc
+F-H0-16352 2 emcnppdmjpqcdpccdn
+F-H0-16353 2 celppqippodpqkdcpd
+F-H0-16354 4 qeqfrerdqdrcpdqcnc
+F-H0-16355 3 iqcqdrdpfqqnppcnpkddpd
+F-H0-16356 3 omqlppqjdpqipkqhpjphpiqeohpdrfndqfjdofdd
+F-H0-16357 4 qdppdpnddfjdpepcddfcqcqb
+F-H0-16358 2 qopqqpoqopppdppnpopd
+F-H0-16359 2 oopqqpoqopppdppnpopd
+F-H0-16360 3 dfdpppqfcfceoecddeqcpdncfddc
+F-H0-16361 3 qmqpqldpqjplqipkqhpjphpipdohndqfjdofdd
+F-H0-16362 3 nmpqdpfqpooponoopmnnddpd
+F-H0-16363 4 qpqqpqdpfqeocqpncnddpd
+F-H0-16364 4 cnfqeqppdqfpcpeppd
+F-H0-16365 3 noqpoplppmdppdooidcicd
+F-H0-16366 2 qpopdppeddjd
+F-H0-16367 2 qqpppqmpqpdpjpqoqkddpd
+F-H0-16368 2 oppppqmpqpdpjpqoqkddpd
+F-H0-16369 2 qqqpopcedpdcpd
+F-H0-16370 2 pnqpopcedpdcpd
+F-H0-16371 2 feppdodhdedcpd
+F-H0-16372 2 qpqqpqdpqmpoqddcoc
+F-H0-16373 2 qrqqpqdpqmpoqddcoc
+F-H0-16374 2 qfppdpjpjdpjddjjncpd
+F-H0-16375 2 cfoppddodc
+F-H0-16376 4 nqerdrhqcreqfqdqcqdpppdocpqncnddpc
+F-H0-16377 2 dgdpfqdnppcecfcddedcpd
+F-H0-16378 3 dedqppnepjncpfdcpdpbkdkbqc
+F-H0-16379 4 oddpppdepjqcqdpcpdnclc
+F-H0-16380 3 drjpfqdpqpdnfoddpd
+F-H0-16381 2 mcpfqfrerdqercqdqcpdobnd
+F-H0-16382 2 pdppdpqdodocncob
+F-H0-16383 3 dlppdqdopdeccd
+F-H0-16384 3 cfppdqefgdpdcded
+F-H0-16385 3 qqrpnqqnpppd
+F-H0-16386 4 ohppdpqhpiphqfpdofndcfjdddfc
+F-H0-16387 2 qpqqpqpp
+F-H0-16388 2 odpdpcqc
+F-H0-16389 3 cifddedcpdebcdcbcc
+F-H0-16390 3 gpqpfqfpcndppddkdd
+F-H0-16391 3 nppqqodd
+F-H0-16392 2 fedpppjjpdddfchc
+F-H0-16393 2 cqhqfqdpppjjpddd
+F-H0-16394 4 onpqmpfqdpoopopldcpd
+F-H0-16395 2 lcppcpndqdddfc
+F-H0-16396 4 odpeppqddpddmdpcoc
+F-H0-16397 4 roqrrqqqpqppqpdpqopopnrnqmqnpd
+F-H0-16398 2 gdpdppcdqfncedecfcdc
+F-H0-16399 2 deepppjdpjdcpd
+F-H0-16400 2 fddppodhdedcpd
+F-H0-16401 4 qppqqqppnqkpdppdcfjdddfc
+F-H0-16402 2 cipqcpfddedcpdebcdcbcc
+F-H0-16403 2 nppqnqppbqmpjpbpepdodpcocpbonoqneockddpd
+F-H0-16404 4 ofoqdpqpqfqepfpeddpc
+F-H0-16405 4 pcqdppkddpddodrcqc
+F-H0-16406 4 cfdpoqqjqpdepdddcdhcfcecccdcdbebcb
+F-H0-16407 2 pierdrhqcreqpqdqmqdpfqqocqdocpqfcnddpd
+F-H0-16408 2 idpqmppkdppdddfc
+F-H0-16409 4 pqrqqqqpopmppddpdd
+F-H0-16410 4 lppqoqppnqnpjqnompmodppjddpd
+F-H0-16411 3 rrqrqqpqqpppnpdppoqoddpd
+F-H0-16412 3 cphqfqfpppdpdndcpd
+F-H0-16413 3 pmpqdpqppoqoqnqfncpd
+F-H0-16414 2 fcdpnqqnfqcnppqkjpddpd
+F-H0-16415 2 fqdppqjdpkncpfecpd
+F-H0-16416 4 pqqpqqppnqnpmpnodppjqnpdddjd
+F-H0-16417 2 dqpqhpfqdpcqddpd
+F-H0-16418 2 qnnqppdpcicdcfdcpd
+F-H0-16419 2 ppdppdpm
+F-H0-16420 2 dddppdpm
+F-H0-16421 4 dqpqfpfqdpeqpogpfocnddpd
+F-H0-16422 2 meppdppjndneqcqdpcpdncoddckdqbocobnbpa
+F-H0-16423 2 pbppdpchgdqfncdedcpdebcdcbcc
+F-H0-16424 2 fodqdodlecpd
+F-H0-16425 2 lqnqppdppijjjdddpc
+F-H0-16426 4 rlqrrrprrqorqqpqoqqpppqodprnpoqnpnpmrmqlqmqdddoc
+F-H0-16427 4 npnqppcpkpqnddpd
+F-H0-16428 2 nedqppphpepcqdqbddobqc
+F-H0-16429 2 npqrqqorqppqdpplpodcpd
+F-H0-16430 3 becqbpqpenfpcndpbkdkdfedpddccdccbc
+F-H0-16431 4 nqpqqqoqppmqopqppdcpdd
+F-H0-16432 2 jdpopddndd
+F-H0-16433 2 eodoppcojpcndpdmendddnpcem
+F-H0-16434 4 pedpoqqfqppfqeddpc
+F-H0-16435 2 qqppnpjpqndppdooddql
+F-H0-16436 2 iqcqdrdpfqcnppqjcjcedfcdcffcdedcpd
+F-H0-16437 3 nodrercrhqmqeqfqdqcqopqpdpcpdocnddpc
+F-H0-16438 3 crdreqdqcqepppeodpdndoddpd
+F-H0-16439 2 pdildp
+F-H0-16440 3 dcqqdqpd
+F-H0-16441 2 ncoqdpqpqjqlqgqedcpd
+F-H0-16442 3 gddpfqcnppidcffdpdddfc
+F-H0-16443 3 pgjqppredpqcpdpcodcc
+F-H0-16444 2 pcdpppddqdncfc
+F-H0-16445 2 qrpqqqoqppnqmpoodpnopomoonplnnqddcoc
+F-H0-16446 2 qqpqppqpnpqodpqdpodd
+F-H0-16447 3 qmrrqrqqprqppqnpppdpqoroqnpopdrndd
+F-H0-16448 2 qkoqdpdjddpd
+F-H0-16449 4 qqprppnqkpdppnnopjcldjcedfcdcffcdedcpd
+F-H0-16450 2 hpqqcpeqqdddoc
+F-H0-16451 2 dnqqcpeqqdddoc
+F-H0-16452 2 rpnqqnppondpcdpkpc
+F-H0-16453 2 pjpdpondqfdd
+F-H0-16454 4 emfqcqcpppbpdpbodocncodmenbmdnpddkcd
+F-H0-16455 3 cqgqpqcpepcmfodcpd
+F-H0-16456 2 opqqqppqppdpqlqncjcedfcdcffcdedcpd
+F-H0-16457 4 cdppdpfddedcqdcbcc
+F-H0-16458 2 qpppnqpndponqnpjpmpdddjd
+F-H0-16459 2 oqjpqpjjdp
+F-H0-16460 2 nepqdpoepfqdodlddc
+F-H0-16461 2 odphqpoedpcdpepcnd
+F-H0-16462 2 lrmqlqfqjqppiqkphqjplpiphpmodplodnhoqjfoddpd
+F-H0-16463 2 ofoqdpqpqjqlqfqhrdpddcnc
+F-H0-16464 2 qffqdppppeqeddpc
+F-H0-16465 2 dnfqjpppdpcnedpd
+F-H0-16466 2 bmppdqdoemencmcnelfmddpd
+F-H0-16467 3 reppqddpkdodddqcrcpc
+F-H0-16468 3 qmqrrqprqqpqoqqpppqodpqnpopmpnqddcoc
+F-H0-16469 2 pjdqcqppcpjpdodpcoeocnendmdncmempddlddej
+F-H0-16470 2 cenqpqopoqnpqpdpqnpd
+F-H0-16471 3 qnfqdpppcnjpmdqijdpeddpc
+F-H0-16472 4 nmrqpqqqfqspppqpjpdpqoroposnonqnpmpnqlcnpdrmttdd
+F-H0-16473 3 eedpppdfcfcedeedpdcdfdfcdddcccebbcdb
+F-H0-16474 3 oqqqpqppnqmpoodpnopomoonplnnpd
+F-H0-16475 2 efdppqcgdedcpdebcdcbcc
+F-H0-16476 2 pbpqdpqfdecfddpdnccdhcfcecccdcdbebcb
+F-H0-16477 4 nqpqqqoqppfqopnpdpooponoqnpnonpmqmplqlpkddpd
+F-H0-16478 2 qfpfppoddpdcqd
+F-H0-16479 3 hedppqdhfefcdedcpd
+F-H0-16480 3 rprrqrrqprqqoroqpqppqpdpqopornpnqnrmpmqmqlrlqdddoc
+F-H0-16481 4 eboqdpqpqjpddecdddfchcccdcdb
+F-H0-16482 4 cdqpdpfddedcpdcbcc
+F-H0-16483 3 peqdpppddpldqecdod
+F-H0-16484 2 fpercqcrppdqcpemdocmenelfmddpd
+F-H0-16485 2 qfreppmedplemfqdneddodrcqcmcpc
+F-H0-16486 2 nopqopoqmpnpqodppddd
+F-H0-16487 2 mqpqdpqdqocd
+F-H0-16488 3 qfpodppdcfjdddfc
+F-H0-16489 4 cbcppqdefdpddccc
+F-H0-16490 4 oopqqpoqppopnppoeppdqodd
+F-H0-16491 3 ircqdripfqdpopdnfoddpd
+F-H0-16492 2 pkppdpojqioipiqhrhphohognhngmhpfqfpdofnddfjdddfc
+F-H0-16493 2 qgpqdpqnqjqdcfkcddfc
+F-H0-16494 4 dopqdqcqjpcpdpqoclcnddpd
+F-H0-16495 3 ppqpoqoppndp
+F-H0-16496 3 gqfriqhqfqeqppdpipdnfoddpd
+F-H0-16497 4 lcqeppqddpndpfddpdpcodocrcmcqcrbncqbnbpbmboboa
+F-H0-16498 4 gpgqdrdppqcnfqdcpd
+F-H0-16499 3 bfppdpdecdpdccgdebdd
+F-H0-16500 4 npoppqmpoqqodppddd
+F-H0-16501 3 cdnqdpqpqjcfdcpd
+F-H0-16502 2 ccppdpefdicffdpdddbd
+F-H0-16503 4 nlqpqoppqndppmpnomonpinmpdpkdd
+F-H0-16504 3 ncppdpqfdedcpd
+F-H0-16505 4 ncppdpchgddedcpdebcdcbcc
+F-H0-16506 3 jdpqcqqkncpfccpd
+F-H0-16507 4 oqqqpqppmqopqpdpddpd
+F-H0-16508 4 orprpqqqppnqkpqppodppdcfjdddfc
+F-H0-16509 2 pldppqpockcedgcdcffcdedcpd
+F-H0-16510 4 pppqqqmqopqpdpddpd
+F-H0-16511 4 dnfqhpfodppd
+F-H0-16512 3 pcjqpppjdpqdqfpdqcdd
+F-H0-16513 3 jddoppdfpdddfc
+F-H0-16514 2 onqppqdpppqopopnddpc
+F-H0-16515 2 pnerdrnqcreqfqdqcqipppdpcpdocnemcmddpd
+F-H0-16516 4 fbppdpdepdfdgdgcfcecdc
+F-H0-16517 3 qpqrqqpqponpecpd
+F-H0-16518 2 cccjppdddpqccf
+F-H0-16519 2 fccjppdddpqccf
+F-H0-16520 2 qedpppqfpepfjdcfpcddfc
+F-H0-16521 3 foqpdqgpeododlendcpd
+F-H0-16522 2 oqpqppqpnpqodppdpocd
+F-H0-16523 2 ccpqdppddfcdedecdddc
+F-H0-16524 2 dngqfqppeqgpdpfpdcpd
+F-H0-16525 3 cjeqpqcpqoddpd
+F-H0-16526 3 qjqpdpopddpe
+F-H0-16527 4 qbdpppdfndpejdddpcqcfc
+F-H0-16528 2 qqdrercreqpqdqfqipcqdpnppocpdocndcpd
+F-H0-16529 4 nqdqpqpoqpqnqopmqddcoc
+F-H0-16530 3 fdppqnnppjdpddcfpc
+F-H0-16531 2 cpppdojpcodpcneodmendddnpcem
+F-H0-16532 2 qldpppqnqhqjqdddod
+F-H0-16533 2 opqodppdcficddfcccdb
+F-H0-16534 3 olqoqpqnpppmcpompnnlonpinmpdpkdd
+F-H0-16535 2 pipddpndqocdqfic
+F-H0-16536 2 jdpqdpqkncpfecpd
+F-H0-16537 4 ogpipprfdpofqfqepfperepdsdjdqdddrcpcqc
+F-H0-16538 4 pooqqpppoppndp
+F-H0-16539 3 popqcqqddcoc
+F-H0-16540 2 dhoqdpqpqmqgqjcedcpd
+F-H0-16541 3 rrqrrqprqqpqoqqpppqodpqnpopmpnqlqmqddcoc
+F-H0-16542 3 rnrrqrrqprqqoroqpqppqpdpqopoqnpnpmrmqlqmqddcoc
+F-H0-16543 2 kpnqppeqcjecpd
+F-H0-16544 3 pqqqfqdpppqnjpdnqldcpd
+F-H0-16545 2 dpqodcqe
+F-H0-16546 4 oonppqdpfqpoplddpd
+F-H0-16547 2 qhdpnqqjqpqfqldcpd
+F-H0-16548 2 mcdpnqqjqpqfqldcpd
+F-H0-16549 2 qpdpoqdjqcdd
+F-H0-16550 2 pjnqppjppndopdee
+F-H0-16551 4 snpqrqfqqqppspjpqpqodpporornqnonpnpmcnqlrmpddd
+F-H0-16552 4 jddpppdjfedfidddocicfchc
+F-H0-16553 3 erdrjqfqdqcqdpppdocpdcpd
+F-H0-16554 3 pfpqdpqkqfqeddpd
+F-H0-16555 2 nmprqqkrppnqkpdppnnopjcldjcedfcdcffcdedcpd
+F-H0-16556 2 qepejjndpc
+F-H0-16557 4 kbppdqpjnepfncpddckdpbqc
+F-H0-16558 2 qdohppogdppfphofpgpdqfjdpedd
+F-H0-16559 2 onqpoqlppddpddjc
+F-H0-16560 2 gqiqdqppcnddpd
+F-H0-16561 3 qqpqppnqmpooponoonmonnpldcpd
+F-H0-16562 4 bpcqfqppcpdpbodocncodmenbmdnpddkcd
+F-H0-16563 2 cicqerppcrcpdqdofpckecpd
+F-H0-16564 4 npdpfqqnpppnjpdnqojdpjddpfncpd
+F-H0-16565 3 hdcgppqedpcdfepcedgc
+F-H0-16566 2 gomqfqlqppjqkpiqjphqiphpmodphocnfoddpd
+F-H0-16567 2 qcpqdppkddpdncld
+F-H0-16568 3 oqqppqppopnppocppdqodd
+F-H0-16569 3 pqppoqdpddpd
+F-H0-16570 3 jdppjpdppjdddj
+F-H0-16571 2 qldpppqnpdcffcdddb
+F-H0-16572 3 poorprnrpqoqnqppmqnpopnompmodponoopjddpd
+F-H0-16573 2 ecdpqpjjcdpd
+F-H0-16574 3 foipfqdpppjdpjddpfncpd
+F-H0-16575 3 npnqppdpkpqnpddc
+F-H0-16576 2 crerdrjqfqdqcqdpppdocpdcpd
+F-H0-16577 2 dlcqfqppcpdpbpdobococnendmdnbmempddkcd
+F-H0-16578 2 odpqdpdjddqd
+F-H0-16579 4 nmqoqpqnpppmdpompnpionpdpkdd
+F-H0-16580 2 qdqppfdpddpcqcqb
+F-H0-16581 4 dpqopdjjdd
+F-H0-16582 2 pldqpqqoqddcoc
+F-H0-16583 2 dncnqpdhdppddjdd
+F-H0-16584 2 hpppnqepcpdcpd
+F-H0-16585 2 nopqdpplpopdeccd
+F-H0-16586 3 orqqqrqppqdpplpodcpd
+F-H0-16587 4 dgppdpcfdfcedepdeccd
+F-H0-16588 3 dddqpqqd
+F-H0-16589 4 ebdpppdefdqddccdcbcc
+F-H0-16590 3 dfopdpocddfc
+F-H0-16591 3 dmdqfqipeqfpppdpgpfogodncnddpd
+F-H0-16592 2 dfpqdpcecfcddedcqd
+F-H0-16593 3 qhdpoqqjqpqfqlrdpddcnc
+F-H0-16594 3 piohppogdppfphpepgpdqfjdqedd
+F-H0-16595 2 ooopppqnnp
+F-H0-16596 2 doppcnjpdmdpqcdnccem
+F-H0-16597 2 qorqqqqppplpopdpnopopmoopdoncd
+F-H0-16598 4 rmqrrrprrqorqqpqoqqpppqodpqnpopmpnqlqmqdddoc
+F-H0-16599 4 qpqrqqpqdpnqpoplnopd
+F-H0-16600 3 rnppqnjppmdpplqopkpnpdomddol
+F-H0-16601 2 oppqoqfqnqpplqnpjqkpiqjphqiphpmodphodnfodjpddd
+F-H0-16602 2 gopqoqfqnqpplqnpjqkpiqjphqiphpmodphodnfodjpddd
+F-H0-16603 2 dcpppdedcdccgc
+F-H0-16604 2 qrqqpqpoqmddpd
+F-H0-16605 4 opqpqopppojpqndppdooddpn
+F-H0-16606 3 qlcpoqqjqpdcpd
+F-H0-16607 2 ccdpppchceecpddcdd
+F-H0-16608 2 fpdncqpdqpcd
+F-H0-16609 2 ddfpcpndqd
+F-H0-16610 2 fofqppgpfpdddp
+F-H0-16611 3 jpqpoqlpdpqmonpd
+F-H0-16612 2 qpdppqqnpdcficddfcccdb
+F-H0-16613 2 qldppqqnpdcficddfcccdb
+F-H0-16614 2 jpppdppjqcmepcqdncpdecodnblc
+F-H0-16615 3 rdppdpchqfdefdpddccdebnccbcc
+F-H0-16616 4 piqhppcedppdqfndofdc
+F-H0-16617 4 jpiqfqhqppdpipcnfodcpd
+F-H0-16618 2 ppoqpqdpqppoqoqnpjpmqdddoc
+F-H0-16619 4 qorppqdpfqqnjppnpocnqlecpd
+F-H0-16620 3 pjdpkqcnfqrlqpqkqlqjpkdcpd
+F-H0-16621 3 cbppdpfedhdegcpddccc
+F-H0-16622 2 qbppdpjpnepjddpfqcqdncpdrbrcpbpc
+F-H0-16623 4 ceppdpefdgdfcfddpd
+F-H0-16624 2 qjppeqdjecpd
+F-H0-16625 2 jdjpppdopjedpd
+F-H0-16626 2 popqeqfqipcqfpcpdpcnddpd
+F-H0-16627 4 qpprorpqnrnqqqmqoqnpopqompnodppnpoplqnpddd
+F-H0-16628 2 rnqrrrprqqpqqpppnpdproqopoqnddpd
+F-H0-16629 2 omqqqppplpopcpnoqonnoopmqnpdoncd
+F-H0-16630 2 qmdpfqqnppdnjpplqlolpkddpd
+F-H0-16631 4 rhqhqprgdprfqiqepipdqgndqfddof
+F-H0-16632 3 nomqorqpoppndppd
+F-H0-16633 2 nqqnppodcped
+F-H0-16634 4 nqpqqqoqppmqopqppddpddqf
+F-H0-16635 2 foipoqdpfqdjpddd
+F-H0-16636 2 rbppdpjpnepjddpfqcqdncpdpbpc
+F-H0-16637 3 kcppdpchfdqfncdedcpdpbcdebqccbcc
+F-H0-16638 2 ooopfqdpqppmlpdcpd
+F-H0-16639 3 qfopdppdcfjdddfc
+F-H0-16640 4 fgdppqegefcgdedcpd
+F-H0-16641 2 rmqrrqqqpqoqqppprodpqopopnrnqmqnqdddoc
+F-H0-16642 2 qomppqdpkpooqkdcpd
+F-H0-16643 2 dnpqcpeppodcpd
+F-H0-16644 3 dofqjqcqdqppdpcpdcpd
+F-H0-16645 3 kqdpfqcmqpddpd
+F-H0-16646 2 onpqdpfqqnippnqocnpoddpd
+F-H0-16647 4 hqnqlqkpkqjpjqipppnolplodppdpncd
+F-H0-16648 3 erfrdrkqfqjqeqhqcqgqppdpipcphpcngpddpd
+F-H0-16649 2 cepqeqodcpdcqd
+F-H0-16650 2 prqqpqppfqnpcqdpqpeocnddpd
+F-H0-16651 3 onpqdpfqpojpcnooddpd
+F-H0-16652 3 eppqqocpecpd
+F-H0-16653 3 cfpqnqbpkqqocqcnfpckdppdddfc
+F-H0-16654 3 hpfqhqqpdpipdnfoddpd
+F-H0-16655 4 pmoqpqppqpdpqopoqnpnpcdd
+F-H0-16656 3 rppqqqoqppnqmpoodpnopomoonplnnpd
+F-H0-16657 2 qjppepqdedoc
+F-H0-16658 4 nomppqdpfqpojponoocnpldcpd
+F-H0-16659 2 jpeqfqdqppcpfpcneppd
+F-H0-16660 2 hckqdpfqcnqpqmpnplpkqkqhqjpdddfc
+F-H0-16661 3 qodppqpoqdecoc
+F-H0-16662 4 dcbpcqenqpcnfpbkdpdfdkpdedcdccbc
+F-H0-16663 2 qeqddpqcpepcpd
+F-H0-16664 2 dndqepcqdpcppd
+F-H0-16665 3 fqdppqpnqlddpd
+F-H0-16666 2 pnnqppdpdgcgcfcdfebdcegcpdeceddcddbccc
+F-H0-16667 3 cpcqdpcnqopddkcd
+F-H0-16668 3 oqpqopqodppd
+F-H0-16669 4 ecppdppdddfdfcgc
+F-H0-16670 2 pmpqlpnpdpnoqoqmooqddcoc
+F-H0-16671 3 nroqpsmqnslqqrqporppmropqqmppqnonqpjnppddpttdd
+F-H0-16672 2 gddppqcddeccpdebdd
+F-H0-16673 2 qkqrqqorqppqpocpddpeocqd
+F-H0-16674 2 gpipnqfpfqdpqpdcpd
+F-H0-16675 2 epipnqfpfqdpqpdcpd
+F-H0-16676 2 qqprhqnqdqjqppqdcoddpn
+F-H0-16677 3 cfdpopcededcpd
+F-H0-16678 2 qrorprnrpqqqnqoqmqqpopppmpnpdpnoqomopoonoopjddpd
+F-H0-16679 3 noqpoplppmdpcdoopc
+F-H0-16680 4 mcppdqpjodoemdneqcmepcqdocpdncnddcld
+F-H0-16681 3 pepppjdppdqfjdqdddqcpc
+F-H0-16682 4 oomppqdpfqpojpcnpldcpd
+F-H0-16683 2 oqfrfqeqcqipqpfpgpdpcpfocnddpd
+F-H0-16684 2 gqpqjqlqqdcpddqo
+F-H0-16685 4 qrqqpqdpnqpoplnopd
+F-H0-16686 2 qmopqppnlppmdpcdqn
+F-H0-16687 2 mpprqqnqppiqkpdppnnopddd
+F-H0-16688 2 fqkqpqdpqoecpd
+F-H0-16689 2 qfoqdppdceicdc
+F-H0-16690 4 pqrqqqmqopqpnodppdqmcd
+F-H0-16691 3 ddppdpjjpd
+F-H0-16692 2 eohqdreqfqfpcqdpppcnepddpd
+F-H0-16693 3 npdppqqoplooddpd
+F-H0-16694 2 edppdqcjcncedcpd
+F-H0-16695 4 oomppqdpfqpopldcpd
+F-H0-16696 2 qhppqgdppfpgqerfpeqfodreddqd
+F-H0-16697 2 popqpddpndpiddqf
+F-H0-16698 2 ncfqdpqpdnipddpd
+F-H0-16699 2 qcqnnqqippnddpddpepc
+F-H0-16700 2 efpjppdjjppddpddcf
+F-H0-16701 3 dobrdrfqcrcqdqppipcpdpcoddpd
+F-H0-16702 2 ddpeppndpc
+F-H0-16703 4 qpircqdripfqdpopdnfoddpd
+F-H0-16704 2 iplqnqfqdpppnopndcpd
+F-H0-16705 4 qpnppqdpfqpocqeoqoqncnddpd
+F-H0-16706 3 ehpqdpfgegefcgdedcpd
+F-H0-16707 3 hemppqjppodppkddpdhcjd
+F-H0-16708 3 kcrpqqqnpponnprkdppfpkpdncddpbqc
+F-H0-16709 3 rpdrercrhqnqeqfqdqcqdpppdocpqncnedpd
+F-H0-16710 2 qffqdpppdnjpqjqldcpd
+F-H0-16711 2 qgfqdpppdnjpqjqldcpd
+F-H0-16712 2 pnnqppdpkpnopdgd
+F-H0-16713 3 qnpqdpqiqkqdddoc
+F-H0-16714 4 qoqqpqppqpdpqmpodcpd
+F-H0-16715 2 pjjqpppddpfddjddqfnccf
+F-H0-16716 2 bbpqdpcgedpddccdccbc
+F-H0-16717 2 lqjqpqdpqnddpd
+F-H0-16718 4 qkqqqrqporpopqonnpplcppdqmdd
+F-H0-16719 3 roppqqoppqdpdcpd
+F-H0-16720 4 oppppqnppocppdqodd
+F-H0-16721 2 fqqrpqqqoqppnqmpjpdpooponoqnmoonplnnqdddoc
+F-H0-16722 2 fcqrpqqqoqppnqmpjpdpooponoqnmoonplnnqdddoc
+F-H0-16723 4 poqqpqnqppqpkpdppdcfjdddfc
+F-H0-16724 4 qlqpqjcpqipkqhpjphpipdohndqfjdofdd
+F-H0-16725 2 fqdpppqifeqfpddfndrdqcidfcddibccdb
+F-H0-16726 2 qnnqppjpdppjqfjjpddjddjd
+F-H0-16727 2 jcppmdneddpdocndncpc
+F-H0-16728 4 qlrqqrqqproqpqppqpdpqopoqnpnpmqmqddcoc
+F-H0-16729 4 reqhqpqedppeqfpdpfjdqdddqcpc
+F-H0-16730 4 enfqnpqpdpcndndmddpd
+F-H0-16731 3 fogrfrerfqcrcqgqbqeqppdqepfpdpcpcodcpd
+F-H0-16732 4 cddqqpcfcededcpd
+F-H0-16733 2 cqippqdpfqdcqd
+F-H0-16734 4 cdcfcededcqd
+F-H0-16735 2 mqerdrhqcreqfqdqcqopqpdpcpdocndcpd
+F-H0-16736 3 bepqdppdcdedgcdcbccc
+F-H0-16737 4 onpqdpqmpoqdddnchcfc
+F-H0-16738 2 fpfqeqpphpepdpeocpdmddpd
+F-H0-16739 2 cnnqppjppndppiddjdgcpc
+F-H0-16740 2 rmkqdpfqcnqprlqmqkqlqjpkddpd
+F-H0-16741 2 pjkqdpfqcnqprlqmqkqlqjpkddpd
+F-H0-16742 2 cfqfppqddpddodpcndocncgcjc
+F-H0-16743 2 pjdpppcmcjcedfcdcffcdedcpd
+F-H0-16744 3 gndqppepdoeoenfnfmgmdmddpd
+F-H0-16745 2 qqmqopqppddpddjc
+F-H0-16746 2 ofppdpcjpeqgddpc
+F-H0-16747 4 qpqrqqpqpocpddpeocqd
+F-H0-16748 2 ecppdpcechpddcdd
+F-H0-16749 2 fppqdpfqjdcnddpfncpd
+F-H0-16750 2 ppoopddndd
+F-H0-16751 3 fceqcpqppdcfdd
+F-H0-16752 2 odeqpqcpddqd
+F-H0-16753 3 ncqpcedppdlcgcicdc
+F-H0-16754 2 plppdpqoqnqlrlqhqjqdddoc
+F-H0-16755 4 pfpqmppojpqkdpqeqfpdddjd
+F-H0-16756 2 ogjjqfofnfoererdqdrcpdqcocpcncobmcnb
+F-H0-16757 2 iqcpeqdoppddpd
+F-H0-16758 2 fphqnqeqfqdpqpddpd
+F-H0-16759 2 qhdppppjpdjddd
+F-H0-16760 2 hpbpcqgnppenfpcndppdcldd
+F-H0-16761 3 qnppdpqhqjndddqc
+F-H0-16762 4 bpqrqqordqpqqpfqfpeqdpnppogpfobococndnbnqldmddpd
+F-H0-16763 3 qhqpqgdppdpgndqfddrd
+F-H0-16764 2 fqdppqkdqkncpfdcpd
+F-H0-16765 4 ebdpqpdefdpddccdcbcc
+F-H0-16766 3 dgdppocecfcddedcpd
+F-H0-16767 2 noqpqqoppqnpoqqopppoooqnpndcpd
+F-H0-16768 3 nddppqqfqkddpdnckd
+F-H0-16769 2 oppqoqqpdppppoqoqnpjpmqdddoc
+F-H0-16770 2 oopqqpoqopppdppnpo
+F-H0-16771 2 qopqqpoqopppdppnpo
+F-H0-16772 4 bofrfqdrcqgqppeqfpdqepcpdpbpcodcpd
+F-H0-16773 3 jqnqlqmppplpkpdppcdd
+F-H0-16774 2 cdppdpciecpd
+F-H0-16775 3 gqfqppdqfpdldoddpd
+F-H0-16776 2 kcpqodpfddreqcqdpcrc
+F-H0-16777 4 cdqqprppnqdpkqpnchqipdqfddcfqcrdnccc
+F-H0-16778 4 qnppqfdppfqepeqdndpcddnb
+F-H0-16779 3 pnnqlqdpppnopjecpd
+F-H0-16780 2 lcdppqcdpkncpd
+F-H0-16781 2 ooqpoqpocppdpndd
+F-H0-16782 4 bqcqpqepcppddndd
+F-H0-16783 4 cpqrqqorqppqdpfqponpencodncnqldmddpd
+F-H0-16784 4 qrorprpqqqppnqkpqppodppdcfjdddfc
+F-H0-16785 3 qkkqdpfqcnqpqmpkqjqgdcpd
+F-H0-16786 4 pqopqodppd
+F-H0-16787 2 qcpqdppdqeddqdpc
+F-H0-16788 3 hqpqdpjpkdpkddpfncpd
+F-H0-16789 4 pcppdppjdeqdqcpdnclc
+F-H0-16790 4 cddppphdpdddfcdccc
+F-H0-16791 2 molqqqqppqppnqopnpnodppjddpd
+F-H0-16792 4 dmnpfqdpqpdncnddpd
+F-H0-16793 2 rbniqpogdppfphofpgoeqfpdqejdpeddqdpcqcqb
+F-H0-16794 2 nedpnqqnpppjddpdnckd
+F-H0-16795 2 qcdppppiqfpdcfjdddfc
+F-H0-16796 2 fqdppqjdqkedpfncpd
+F-H0-16797 3 npqqpqnqoqppmqopqppddpddqf
+F-H0-16798 2 nppppqopoqqoqppddpcdqf
+F-H0-16799 2 qpdppqqnqdddod
+F-H0-16800 4 ncdppqpofqrnoponronnqoqmoopmqnqfpnddpd
+F-H0-16801 2 plcqiripdrdppqqofqdnfoddpd
+F-H0-16802 3 depqdppdeccc
+F-H0-16803 2 qnpqdpfqcnjpcdpd
+F-H0-16804 3 iqdqfqppqdcpcd
+F-H0-16805 2 fppdpncd
+F-H0-16806 3 cfidqdddfc
+F-H0-16807 3 pcdppqqepdqddd
+F-H0-16808 2 fcipgqhpfqfpeqdpdqcpcqgoppfogpeoepdjpddd
+F-H0-16809 3 oqrqqrpqqqqppprodpqopopnrnqmqndcpd
+F-H0-16810 4 omqqpqcqdqqpppcpjprndpqnpocndobnempdqlcdcl
+F-H0-16811 2 mrlrqqrqpqmqlqkqopqplpdpnoropdpndd
+F-H0-16812 2 mmdppqpofqonoppmoonmnnddpd
+F-H0-16813 2 jdppqnnpondpolqlpkplpjqkpiqjogqhpdqgdd
+F-H0-16814 2 npppdpqmomqlpkqjpjqipiqhohphqfpdofndcfjdddfc
+F-H0-16815 4 pooqqpppoppndppd
+F-H0-16816 3 pepopqnecpodoeddqd
+F-H0-16817 3 mpppnqnpdppddfjdddfc
+F-H0-16818 3 qddppqqfqepepccd
+F-H0-16819 3 qnqqqppqopoqnpppqooopopndcpd
+F-H0-16820 2 hcdqpqdhcedcqd
+F-H0-16821 3 onrqqrpqqqqpoqroppqodppnpormrnqmqnqdddoc
+F-H0-16822 4 rpnqdpppqnpdcfjdddfc
+F-H0-16823 2 ppqppqdpddpd
+F-H0-16824 3 oqpqopqodpqeddnd
+F-H0-16825 3 oepqpocpddqdocmd
+F-H0-16826 2 eddpppcicehcpdecdddccccbbc
+F-H0-16827 3 epcpppdcpe
+F-H0-16828 2 gqfriqhqfqeqppdpipdnfodcpd
+F-H0-16829 2 qnppcnjpcifppddpdc
+F-H0-16830 2 opdqcqqpcpkpcndpbndopdemddcl
+F-H0-16831 3 ncpqcpqkecpd
+F-H0-16832 3 fqdpoqqjqppiqlqfqhofpdrdndddqc
+F-H0-16833 4 hoiqpqhqfqhpjpdpipcnfoddpd
+F-H0-16834 4 qqqppplpopdpnopopmoopdoncd
+F-H0-16835 2 pmqrrqqqpqoqqppprodpqopopnrnrmqnqmonqdddoc
+F-H0-16836 2 qfdofqdndqcnqpdjcppdcocdfdec
+F-H0-16837 2 nbpepcndncmc
+F-H0-16838 2 dcppcppe
+F-H0-16839 3 fcqpdhdpfeefeedepdgddcdd
+F-H0-16840 3 dqpqcqbqepcppddndd
+F-H0-16841 2 dnpqdpfpddpd
+F-H0-16842 4 dfppdqffeeefeddedcpd
+F-H0-16843 3 cqhqdrppfqdppddndd
+F-H0-16844 2 djdqdnqppdfpdd
+F-H0-16845 2 pjdppopdqfncde
+F-H0-16846 3 rfpppidpqeqfpepfrdrepdqdjdrcddqcpc
+F-H0-16847 2 hqfqdpqppdjcdd
+F-H0-16848 3 bodqpqcqbqepcppddndd
+F-H0-16849 2 qferdrhqcreqqqdqnqrpjqdpfqdocqqnppqkcpddcnncpd
+F-H0-16850 4 dndrbrcrfqdqcqipppdpcpdocoddpd
+F-H0-16851 3 fpoqipfqdpcnddpd
+F-H0-16852 2 gcpqdpqdcded
+F-H0-16853 4 cqhppqcpepeodpenfocnfnemdmdcpd
+F-H0-16854 2 ecppqfdpqdodcdndpcncocjc
+F-H0-16855 2 cnppdqcjcedfcdcffcdedcpd
+F-H0-16856 3 pmqmqpqldpqjplqipkqhpjphpipdohndqfjdofdd
+F-H0-16857 3 nprpqpoplpqodppoqnrnpnpmonpdqmdd
+F-H0-16858 4 pnnqppdpkpnopjcldjcedfcdcffcdedcpd
+F-H0-16859 2 jddppqcgpdddfc
+F-H0-16860 3 gpppfqfpdddp
+F-H0-16861 4 qnpqqqqpppqodpqmpodcpd
+F-H0-16862 4 cippdpgddedcpdebcdcbcc
+F-H0-16863 2 qjppdqjpdcpd
+F-H0-16864 2 chdppqfddedcqdebcdcbcc
+F-H0-16865 2 kcpfpqrecpqdodddqcrcpc
+F-H0-16866 2 gqhppqfpfqdpeqcpdqgocqfogpeoepddpd
+F-H0-16867 3 qldpqqqjnpdcpd
+F-H0-16868 2 pnnqppdppjnopddcjd
+F-H0-16869 2 oippohdpogpipfphofpgoeqfpdqejdpeddqdpc
+F-H0-16870 2 idppcidppdjcmcgcdc
+F-H0-16871 3 qqppqpoplprodpqopopdqncd
+F-H0-16872 2 oqdrcqiqdpfqcnqpddpd
+F-H0-16873 2 nqppdpqdcficddfcccdb
+F-H0-16874 2 qmppdpqhqjpdcficddfcccdb
+F-H0-16875 2 qfdrcqiqdpfqcnppqjqlddpd
+F-H0-16876 2 gddpppjddffdpdddfc
+F-H0-16877 3 erhqdreqfqppcqdppddndd
+F-H0-16878 3 frdrhqfqgqppdphpcngpdcpd
+F-H0-16879 2 dodqqppdcc
+F-H0-16880 2 qnppcqdcqd
+F-H0-16881 2 ncppdpfpdnpjddpd
+F-H0-16882 2 jpppdpfpdnpjddpd
+F-H0-16883 4 qppopqqncpndqoddqd
+F-H0-16884 4 cfqpdqcededcpd
+F-H0-16885 2 pdpqdpqdndpcqcdc
+F-H0-16886 4 fqeqpphpepdpeocpdmddpd
+F-H0-16887 4 plqqpqppoqdpfqpoooqnnoonpnqmpmddpd
+F-H0-16888 2 dfqpdppdedcd
+F-H0-16889 2 odppepcpddqd
+F-H0-16890 4 qnopqponmppddpddpjncqf
+F-H0-16891 2 rodppqooqoqnpopnrnrmpd
+F-H0-16892 3 rnpqqqfqqpppdpjpqnpocnqlddpc
+F-H0-16893 4 cddpoqqjqpddpdhcfcdccc
+F-H0-16894 2 ecpqdpcedhpddced
+F-H0-16895 2 ddpqdpcedhpddced
+F-H0-16896 2 qfpqjpnpdppkddpd
+F-H0-16897 2 clqpdqdncedcpd
+F-H0-16898 2 fpfrhqfqppdqepcqdppdcpcddjec
+F-H0-16899 4 cgcfpppddpjddfdd
+F-H0-16900 3 rdoqdpqpqjqlqfpddcnd
+F-H0-16901 2 beppcqpddcedccdd
+F-H0-16902 2 foippqdpfqcfpdddfc
+F-H0-16903 2 fqdpppchfddedcpdebcdcbcc
+F-H0-16904 4 pnnqppdpkpnopjdcpd
+F-H0-16905 2 popqdqqdecoc
+F-H0-16906 2 qioiqpqhdpphpipdohndqfjdofdd
+F-H0-16907 2 jolqnqppdqlpkpkonopnlopjddpd
+F-H0-16908 3 ppoqpqdpfqpojpcnpldcpd
+F-H0-16909 3 jddrcqiqdpfqdnppddpfncpd
+F-H0-16910 3 coppcnjpdmdpqdendddn
+F-H0-16911 2 drjqfqdqcqdpppdocpdcpd
+F-H0-16912 3 oomppqdpjppopkdcpd
+F-H0-16913 2 epcncqpdppdd
+F-H0-16914 4 cfhqfreppqdpfqcpdqgocqckciddpd
+F-H0-16915 2 depqcqcedhqddchc
+F-H0-16916 4 onqnpppmcppipnpdpkdd
+F-H0-16917 2 lceqpqddpkncpd
+F-H0-16918 4 bldrfqdqcqdpppdocpdncocmcnclbmcecfcddedcpd
+F-H0-16919 2 fdqdqphddpcdec
+F-H0-16920 2 qqqpopmpondppdqnddpjncqf
+F-H0-16921 2 lopqdpnqpofqnojpcnpmddpd
+F-H0-16922 3 ccdpppfedfidgdfdpcddfc
+F-H0-16923 2 popqepqdedoc
+F-H0-16924 3 qqpqoqqpppqodpqnpopmpnqddcoc
+F-H0-16925 4 qppppqnpdppoqoddpd
+F-H0-16926 2 npnqppdppjpmpdddjd
+F-H0-16927 4 qqpqppnqmpfqdpippoooonnocnplddpd
+F-H0-16928 3 coppcnjpdmdpdjenpddnjdpjddjj
+F-H0-16929 2 cddpppdgefcfdfceddpd
+F-H0-16930 3 nopqdppmpoqeddpc
+F-H0-16931 2 ofpqdpqhqfpddfjdddfc
+F-H0-16932 4 ohoqdpcipiqhqfphofcfddpdfcndccbd
+F-H0-16933 3 nopqdpplqoecpd
+F-H0-16934 2 iqcqdrdpnqqnfqcnppddpd
+F-H0-16935 4 dmjppqdpfqdncndcpd
+F-H0-16936 2 ppoqopdqpdqpdd
+F-H0-16937 2 fccdpppcdpeced
+F-H0-16938 2 djjjppoedpee
+F-H0-16939 4 enpqjpfqdpcndndmdcpd
+F-H0-16940 2 ccdpqqddqdhcfc
+F-H0-16941 4 oppqqqoqppfqdpooponoqnpnonpmqmplqlpkddpd
+F-H0-16942 2 eqepppodcpndqfjdqdddpcncoc
+F-H0-16943 2 pqdodcpe
+F-H0-16944 2 pedppqpoqpqnqoqererdqdddoc
+F-H0-16945 4 cddppqcfcededcqd
+F-H0-16946 2 qqmqopqpcddppc
+F-H0-16947 2 jddrercrhqfqeqcqdqppdpcpdocnncqfdcpd
+F-H0-16948 3 rdoqdqqpqjqlqfqhofpddcnd
+F-H0-16949 2 qldpnqpjqpddpd
+F-H0-16950 3 qmrrqqqrqppqdpnppojpjdpkddpfncpd
+F-H0-16951 3 pidpfqdnppqfjpddpd
+F-H0-16952 2 cndpppcdcigccfdcpd
+F-H0-16953 3 eqpqfpfqdpgpdcpd
+F-H0-16954 3 jpdpfqcnppqindpepcqdqbddobqc
+F-H0-16955 2 ncpqdpqfdedcpd
+F-H0-16956 3 oppqnpfqdpoopoplddpd
+F-H0-16957 4 erppcqdpcpdoqjpdcc
+F-H0-16958 4 cqoqgqbpdpcnddod
+F-H0-16959 2 mdpqdppkqfpdddndnclc
+F-H0-16960 2 qdqpdecp
+F-H0-16961 4 rcpippqedppeqfrdpfpdrejdqdddqcpc
+F-H0-16962 3 pfppqdcpddodmcob
+F-H0-16963 2 deqdppkddpec
+F-H0-16964 2 cippdpefdgdfcfddcecdpd
+F-H0-16965 4 fdppdpcfddqdhcfc
+F-H0-16966 3 qqerdrhqcreqnqdqfqrpcqdpppdocpqncnecpd
+F-H0-16967 4 qpqrqqpqcpnppopd
+F-H0-16968 2 dpppnqpnpd
+F-H0-16969 4 qqpppqmpqpdpopqojppopkddpd
+F-H0-16970 3 cpdqpqjpfqdpcqdcpd
+F-H0-16971 3 jpppnqpnepddpd
+F-H0-16972 4 pppqqqfqnpcqdpqpeocnddpd
+F-H0-16973 3 ddoodppc
+F-H0-16974 3 qmdpnqqkqpddpd
+F-H0-16975 4 jpdpppkdpjddpfncpd
+F-H0-16976 2 cnpppdjpcddpncqf
+F-H0-16977 2 rpqqqpoplpqocpporopdrndd
+F-H0-16978 3 nqpppqmpepcpooponoonpldcpd
+F-H0-16979 3 flppfqfpgpdpepcpcofocndoemendmdnclfmpddkcd
+F-H0-16980 4 qpdpoqpofqddpd
+F-H0-16981 2 pjhqfrgqereqdrfpfqdpcqfoppdngpddpd
+F-H0-16982 2 qjqhpppdcpddqfqcofncrd
+F-H0-16983 3 fpeqepdqcoppecpd
+F-H0-16984 3 icdpqocfpdddfcccdb
+F-H0-16985 2 reppjqdppjqfqdrdpdqcodpcdd
+F-H0-16986 4 orrrqrrqprqqpqoqqpppqodpqnpopmpnqlqmqddcoc
+F-H0-16987 2 pnrppqdpfqqnipcnpodcpd
+F-H0-16988 2 plrppqdpfqqnipcnpodcpd
+F-H0-16989 2 opqrrqqqpqppnqpoqppddpdd
+F-H0-16990 2 fperhqdreqfqppcqdppddndd
+F-H0-16991 2 oqpppqmpfqdpjppoooonnocnpldcpd
+F-H0-16992 2 nqpppqmpfqdpjppoooonnocnpldcpd
+F-H0-16993 3 redppqodqdqcddpcrc
+F-H0-16994 2 qnpqdpqopoqdddod
+F-H0-16995 2 pppqdpqopoqdddod
+F-H0-16996 2 bddpmqrnppqnqoonqlpkqhqjcfddqdfcoc
+F-H0-16997 2 mrrqqrpqqqoqmqnqpplqoprpnpqpdpmpqoddpd
+F-H0-16998 2 rrrqqrpqqqoqmqnqpplqoprpnpqpdpmpqoddpd
+F-H0-16999 3 qqrpfqdpppqnnpcnjpddpd
+F-H0-17000 2 foippqdpfqpoplddpd
+F-H0-17001 2 pepopqcdcpocqd
+F-H0-17002 2 cfqoqpqnpppmjppldpqjpnpdonddom
+F-H0-17003 2 jppqdppkdjpdddjd
+F-H0-17004 2 jjpqdppkdjpdddjd
+F-H0-17005 2 pepqqopc
+F-H0-17006 2 qndppqqjqddfkcddfc
+F-H0-17007 3 qqpqppoqopqpqonppddpcd
+F-H0-17008 2 ndppchdpegqjpfpgofqfdecfqdbfpdqejdcdddccdc
+F-H0-17009 2 omerdrhqcreqpqdqfqdpcqpocpdocnonqmddpd
+F-H0-17010 3 qlpqqqoqppoodpnopopnqnpmonplqmddpd
+F-H0-17011 2 nodppqpnfqonooddpd
+F-H0-17012 2 bgcgppdfdpbfchdeegcedgpdefdd
+F-H0-17013 2 nqqqdpcjddpd
+F-H0-17014 2 ddpjdpjjpdjd
+F-H0-17015 2 onircqdrippqdpfqpooodnfoddpd
+F-H0-17016 2 qqircqdrippqdpfqpooodnfoddpd
+F-H0-17017 2 fcpqdpefdhdefepdeegddccc
+F-H0-17018 4 oppqoqfqdppppoplddpd
+F-H0-17019 3 omoqdpqlpkqjpjqipiciohqhqfphofcfddpdfcndccbd
+F-H0-17020 2 ccdpppcgeefdpdeceddccd
+F-H0-17021 2 oopooqpddodd
+F-H0-17022 2 bododqcnqopdcodd
+F-H0-17023 2 dqfqeqppcpepecpd
+F-H0-17024 3 qmqqrqpqmqopqpdppd
+F-H0-17025 4 onppfqcndpqlqndjqjqhcedfcdcffcdedcpd
+F-H0-17026 2 qipiqhohphqfpdofnd
+F-H0-17027 4 qrrqprqqpqoqqpppqodpqnpopmpnqddcoc
+F-H0-17028 2 pjdqqnppqenpddco
+F-H0-17029 2 qcppdppjmfpflfmenepdlendgemdkdldjdlcidkcddjcnchc
+F-H0-17030 2 pocpdeqd
+F-H0-17031 2 dgdpppcgcfcdfebdcegcpdeceddcddbccc
+F-H0-17032 4 nqoppqmpoqqonpnodppddd
+F-H0-17033 3 iqhqpqhpfqdpipiohodnfoddpd
+F-H0-17034 2 pkmqdpppqnqlonqhqjqdddoc
+F-H0-17035 2 npfqppdpcnqnqlondjqjqhcedfcdcffcdedcpd
+F-H0-17036 2 ncfqppdqdocpdncocnqjqlqfdjofqhddcffcpd
+F-H0-17037 4 qlpqqqoqppfqdpooponoqnpnonpmqmplddpd
+F-H0-17038 4 nnppqnjpondpqmqopmpoqdpnddom
+F-H0-17039 3 opoqqpdppdpncd
+F-H0-17040 2 idpqpocpofqgddqdocld
+F-H0-17041 3 ndjjpepc
+F-H0-17042 2 coppdojpcndpdmendldnpdemcdel
+F-H0-17043 2 cpppdojpcndpdmendldnpdemcdel
+F-H0-17044 3 conpfqdpqpencndndmddpd
+F-H0-17045 4 bpbrereqdrcqcrbqdqppcpdpcodocndnbncmdmbmclblddpd
+F-H0-17046 4 krqqprppnqkpdppnnopjcldjcedfcdcffcdedcpd
+F-H0-17047 4 pgppdpjpqfpjddpfncpd
+F-H0-17048 3 mdqfpfrdrercqeqcqdmcpdobnd
+F-H0-17049 2 fcchqppddojdcfdd
+F-H0-17050 2 mhppdpoiqiqhpiphrhogohngnhpfqfpdofnddfjdddfc
+F-H0-17051 2 npcpppqnepddpd
+F-H0-17052 2 nqcpppqnepddpd
+F-H0-17053 4 qrrqqqpqppqpdpqopopnrnqmqndcpd
+F-H0-17054 2 plrppqdpfqqnjpdnpodcpd
+F-H0-17055 2 olqnpponnpqidppdqldd
+F-H0-17056 2 nnqppplpopoonocopmqnpdondd
+F-H0-17057 2 qcoqdpphofoepenepdpcmdncdd
+F-H0-17058 3 mporppqqdpqppoddpd
+F-H0-17059 4 qpqrqqpqdpnppojpjdpkddpfncpd
+F-H0-17060 2 qhdpfqcnppqfjprdpdddnc
+F-H0-17061 2 fqrpnqdpppqnpdcfjdddfc
+F-H0-17062 4 lpoqnpnqmpmqdpqpddpd
+F-H0-17063 2 ccdqppfeefeedeecpddcdd
+F-H0-17064 2 fbppdpdgbepddcedccdd
+F-H0-17065 3 cphqfqgqppfpgpdpcnddpc
+F-H0-17066 2 jqpqdppodcqc
+F-H0-17067 2 pdpqdppodcqc
+F-H0-17068 2 qqlqnqppcopjecpd
+F-H0-17069 2 onpoppqnjppmdpplpnpdomddol
+F-H0-17070 2 pnqpopcpepdcpd
+F-H0-17071 2 qfdpnqncqpdcpd
+F-H0-17072 4 qnpqqqoqppoodpnopopnonddpd
+F-H0-17073 4 qppqqqfqdppppoipcnooddpd
+F-H0-17074 2 dkcnppqfdpceieqdodpcmdocncgcicdc
+F-H0-17075 2 dedpqpdcoc
+F-H0-17076 2 qjiqdpppdjqdddnc
+F-H0-17077 3 peqppidppdqfddqdpcqc
+F-H0-17078 4 nedpppqfjpndpjddoeqcqdpcpdncmd
+F-H0-17079 3 jpppnqpndpcjcedfcdcffcdedcpd
+F-H0-17080 3 nddpppqfjpodpjddoeqcmepcqdncpd
+F-H0-17081 3 nqppcqpjqcmepcqdncpdccodnblc
+F-H0-17082 2 cpdqpqipfqdpcqencndndmddpd
+F-H0-17083 2 qjpjqipiqhohphqfpdofnd
+F-H0-17084 2 oqqqqppqppnqnpmpnodppjqnpdddjd
+F-H0-17085 3 ckcedgcdcffcdedcpd
+F-H0-17086 3 chdpppdhcgdgefdfcffedeeepdecdddccc
+F-H0-17087 4 qppqppopnppocppdqodd
+F-H0-17088 2 oonqlqmpjqlpppdpkppnpjddpd
+F-H0-17089 2 onnqlqmpjqlpppdpkppnpjddpd
+F-H0-17090 4 dcdppqcdpdgcedbccc
+F-H0-17091 3 pnpqoqqpppqodpqnpocjddpd
+F-H0-17092 2 cpjqfqdqcqdpppdcpd
+F-H0-17093 2 ncqrorprpqqqoqnqfqqpppdpkpqnpocnddpd
+F-H0-17094 4 hedpppdjfedfjdhdidddocicfchc
+F-H0-17095 2 fdnpqpdppdcfdd
+F-H0-17096 2 popqdpciddcffcpdccbd
+F-H0-17097 2 dnpqdpfqdjjpjdpkddpfncpd
+F-H0-17098 2 qjpqqocpocpedcqd
+F-H0-17099 2 qopqdpcffdpdddgdhccdgcfceccc
+F-H0-17100 4 beqqprppnqdpkqpnchqipdqfedcfddrdcdbdqcdcnccc
+F-H0-17101 2 ccdjppdfdppdqindqfcdrdqcedic
+F-H0-17102 4 pnpqrpfqdpjpqnpodnplddpd
+F-H0-17103 4 dgppdpefdfcffedeeepdecdddccc
+F-H0-17104 2 hohqpqdpjpjdqkncpfdcpd
+F-H0-17105 2 qkqrqqorqppqcpnppopd
+F-H0-17106 2 qlqrqqorqppqcpnppopd
+F-H0-17107 3 dqfpfqdpeqgoppfogpeoepddpd
+F-H0-17108 3 qldpppqndedcpd
+F-H0-17109 2 pppqdpqlpnqdcfkcddfc
+F-H0-17110 4 qodpfqqnppdnjpjdpjddpfncpd
+F-H0-17111 3 brfrgqcrfqeqcqdqppfpgpgoepfodpeododlenddpd
+F-H0-17112 3 onopqpnolppmdppdooidcicd
+F-H0-17113 2 qejppqdpqkqfpdddjd
+F-H0-17114 3 pcpqpfcppdpeddqdocod
+F-H0-17115 3 npnqlqeqppqnpjddpd
+F-H0-17116 3 fnppcodpcncpemendmdnpdfmdd
+F-H0-17117 2 jrirpqhqiqhpfqdpipiohodnfoddpd
+F-H0-17118 2 cfjqdqppdoddpd
+F-H0-17119 2 eddppqcdqc
+F-H0-17120 2 dcnqqnppqidpcdedpcfcec
+F-H0-17121 2 orppqqpoqppd
+F-H0-17122 2 cfdpdrcnfqjdppddpfncpd
+F-H0-17123 4 qhoqdpqpqkqmdcpd
+F-H0-17124 3 cnfqdppopdjjncqf
+F-H0-17125 3 nqoqdqqpoppc
+F-H0-17126 2 fqdppqckcicdcfdcpd
+F-H0-17127 2 jcqpcgdppdfecdedgcdcbccc
+F-H0-17128 3 dnjqpqfqlqfohqdedppdqo
+F-H0-17129 2 oqopdqpdqpcdcoic
+F-H0-17130 3 rorpoqdpqpqfqepeqddcpc
+F-H0-17131 2 qnppdpjpjdpjncpfecpd
+F-H0-17132 2 dlpqhqkqdpfqhofodnfmddpd
+F-H0-17133 4 dgdqppdfffeeefeddedcpd
+F-H0-17134 2 qcqprqppqqoppqcpnqrorpqoqnpkpdqfndrddd
+F-H0-17135 2 bfppcgdpdfchdeegcedgpdefddcf
+F-H0-17136 2 foippqdpfqponpddpd
+F-H0-17137 2 dkppcnjpdmdpdldnqdemcdel
+F-H0-17138 3 qrrqqqrpnqqpppnpopmpqolpnodpqnpopmoopdondd
+F-H0-17139 2 kcdppqdjqdddfc
+F-H0-17140 2 rfqpdpopqjqlqgqfddpd
+F-H0-17141 2 pgqpdpopqjqlqgqfddpd
+F-H0-17142 3 qodppqqnfqpnipcnpoddpd
+F-H0-17143 4 npqqpqppoqopfqdpooponoqnpnonpmqmplqlpkddpd
+F-H0-17144 3 onpqdpqpqnqhpjqddcoc
+F-H0-17145 4 gcdppppddefcfddc
+F-H0-17146 2 oqnqppcnjpdjfppddpddpjncqf
+F-H0-17147 2 ncdrprcrerqqnqfqhqcqeqppdqcpkppndpcndoqjddpd
+F-H0-17148 4 pbdpppndpjqcqdpcpdncoddckdoboc
+F-H0-17149 2 oqopqpqopppojpqndppdooddpn
+F-H0-17150 2 qcppdpokddpdncld
+F-H0-17151 3 pjjpjjjd
+F-H0-17152 3 mpqqrqnqrpppqpopnpqolpnodpqnpopmoopdondd
+F-H0-17153 2 ceqpopdedppddcfd
+F-H0-17154 2 nqerdreqcrdqpqjpfqdpcqpocpdocnddpd
+F-H0-17155 3 pqqpoqopppdppnpo
+F-H0-17156 4 pjfqqnppcnnpdjdppdjcdd
+F-H0-17157 2 ohpppgphpfogpeofqdoeodndddncoc
+F-H0-17158 2 lqlppqdpopoonpnompmoqoqnpopnpd
+F-H0-17159 4 nppqeqpdqocd
+F-H0-17160 3 cqhqfqdpppqddd
+F-H0-17161 4 oedppqpfqdodlddc
+F-H0-17162 3 lqjqqppddpddpincqf
+F-H0-17163 3 crcqhqppfqhodqfodldodcpd
+F-H0-17164 2 plgrhrfrpqhqiqeqgqdpfqpoipdnfoddpd
+F-H0-17165 2 freqerppdqepdkdoddpd
+F-H0-17166 2 drnqjqqpfqdppdcndd
+F-H0-17167 2 dlfqppdpcncfcjdcpd
+F-H0-17168 4 dcdqdoqppdedcdfcec
+F-H0-17169 4 ofdppppgjpqfpjddpfncpd
+F-H0-17170 3 qcpjppoedppdqfjdncdd
+F-H0-17171 3 mfpodpijnfofneqeodoeddmeocndnbnc
+F-H0-17172 2 popqcedppdjcdc
+F-H0-17173 4 pqrqqqmqopqpdpddpd
+F-H0-17174 2 pnnpppjppjdpjjdjpdddjd
+F-H0-17175 2 pfdnppdjjppddpjdpjddjj
+F-H0-17176 2 ddcqopccpd
+F-H0-17177 3 qppqqqppnqqmdpddpd
+F-H0-17178 2 ddppepcppd
+F-H0-17179 4 mqnpoqmpnqdpqpddpd
+F-H0-17180 2 nooqnqppmpnpeppjdepd
+F-H0-17181 3 cqnqppdqdofppjddpd
+F-H0-17182 4 cnerdriqcreqpqdqfqdpcqdocpddpd
+F-H0-17183 4 roqqrqpqqpdqpnopddpd
+F-H0-17184 2 qqprppnqpndppdcffcdddb
+F-H0-17185 4 prppnqkpdppnnopjdcpd
+F-H0-17186 2 cpqopqcepd
+F-H0-17187 4 qgpipppgdprfogofqfqepfperepdsdjdqdddrcpcqc
+F-H0-17188 2 fqcnpppfdpddpc
+F-H0-17189 2 fqdpppdecfidcdfdpcddfcecccdcdbebcb
+F-H0-17190 2 cododqenqpdmeppdeocd
+F-H0-17191 2 djppjpdppjddjd
+F-H0-17192 2 ecppdpdecgpdcecdddccdcdb
+F-H0-17193 2 ooprpqqqppqpqodpqmpopddd
+F-H0-17194 3 ceeqppcpckcfddpd
+F-H0-17195 3 dqfqipcqdpppecpd
+F-H0-17196 2 mnoqqpjplpdpqmonddpd
+F-H0-17197 2 lnoqqpjplpdpqmonddpd
+F-H0-17198 2 rpdpoqqofqpoqpddpd
+F-H0-17199 2 ppdpoqqofqpoqpddpd
+F-H0-17200 4 qrqqpqponpecpd
+F-H0-17201 3 rdjqpppjdpqdqfpdqcodpcdd
+F-H0-17202 4 boqpdqepcqdppdcd
+F-H0-17203 4 orqqqrqppqcpnppopd
+F-H0-17204 2 dddpoqccpd
+F-H0-17205 2 joppnqnolplndppjddpd
+F-H0-17206 4 plqrqqorqppqponponcppdqmdd
+F-H0-17207 4 rnqrrrprqqpqqpppnpqodpqnropdpodd
+F-H0-17208 3 ipqmppqlcpqjomqipkqhpjphpipdohndqfjdofdd
+F-H0-17209 4 fcppcedfpdcfcddedc
+F-H0-17210 4 nqerdreqcrdqfqipcqdpppdocpqncnddpd
+F-H0-17211 2 nqfqppdqdocpdncocnqndjddpd
+F-H0-17212 4 docqppcpdpqjpdcc
+F-H0-17213 2 jpbqdqppcqgpepcpenbopdcndd
+F-H0-17214 3 qqpqponpecpd
+F-H0-17215 2 eqdrhqfqppcqdppddndd
+F-H0-17216 2 oqfppdpncd
+F-H0-17217 3 fedppppddegdfdfcgcdcecfb
+F-H0-17218 4 ogdpppciqhrfpeqfpddejdqdgdqcpcdc
+F-H0-17219 3 pnqppqppoqnpopeppoqopdoodd
+F-H0-17220 2 cooqdqqpqjdodcpd
+F-H0-17221 4 rfoqdpqpqjqlpiqhqfqeofpddcnd
+F-H0-17222 3 rdpppidpqeqfpepfpdrejdqdddqcpc
+F-H0-17223 4 pnnqlqdpppnopdcfjdddfc
+F-H0-17224 2 eqfpfqdpqpfogpddpd
+F-H0-17225 2 qdpfpqofdppdpgddqf
+F-H0-17226 3 ofpppidprfqfqepfperepdsdjdqdddrcpcqc
+F-H0-17227 2 pbpqdpfqqnqponmpcnjpqkqiddpfncpd
+F-H0-17228 4 cndpppcedfpdcfcddedcfdfb
+F-H0-17229 2 qedppppeciddcffcbdccpc
+F-H0-17230 2 ldqqprppnqdpkqqnqdoddd
+F-H0-17231 3 eceppppdcded
+F-H0-17232 4 ngpqpidppfpgofogqdqfpdqendmdddnc
+F-H0-17233 2 qdqpdpcdpfpcqcqb
+F-H0-17234 3 qgdpqpdffepepcidfcddibccdb
+F-H0-17235 3 qnppqpoplpqodppdpocd
+F-H0-17236 3 dedqppepdoeofncoenbobndndmcncmdcpd
+F-H0-17237 2 nppppnpd
+F-H0-17238 3 qdpppjdpoeqfpdqcddnc
+F-H0-17239 3 oqqqpqppnqmpoodpnopoplonpcdc
+F-H0-17240 2 qpdppqqoqkddpd
+F-H0-17241 2 qnppfqdodqcncpdmcoeiqjcicgqhddpd
+F-H0-17242 2 mcnqpqiqoqopgqmpqpiodppdqnddjchc
+F-H0-17243 3 copqdqfqipcqdpcpencndndmddpd
+F-H0-17244 2 qrqqpqmqhqjqppqpdprnpoqnompdqldd
+F-H0-17245 3 drhpfqdpqpdnfoddpd
+F-H0-17246 2 pepfpqpdcpddqdocod
+F-H0-17247 3 fpeqppdqepcmcopddd
+F-H0-17248 2 cppdpqcc
+F-H0-17249 2 fpcndppdpondpjcdqf
+F-H0-17250 2 kddpfqdnopncjpdcpd
+F-H0-17251 3 ccdpqpfddedcpd
+F-H0-17252 2 fcerdrqqcrpqrqhqfqeqcqdqqpopcplprodppndocnddpd
+F-H0-17253 2 nnqqrppqdpfqroipqnqopnpocnplddpd
+F-H0-17254 2 onqqrppqdpfqroipqnqopnpocnplddpd
+F-H0-17255 4 bfdqppdfdgcfcgeeffbeefeddedcpd
+F-H0-17256 2 cfoqdqqpcpdococnqjpdddfc
+F-H0-17257 3 dbpqdpdfdhdefepdeefdddeddceb
+F-H0-17258 2 hckqdpfqcnqpqjpdddfc
+F-H0-17259 2 idkqdpfqcnqpqjpdddfc
+F-H0-17260 2 lcpppjcppdncdd
+F-H0-17261 4 obppdppjndqdqcpdpcodnckddcoc
+F-H0-17262 2 nmppnqpndppjnopddcjd
+F-H0-17263 2 ffppdpefdgcffeeepdhdedcddd
+F-H0-17264 2 ccppdpdheffedeeepdfcgddcdd
+F-H0-17265 3 cqipfqfpppdpgpfocncecfcddedcpd
+F-H0-17266 3 rdoeqpqddppdqfjdqcddpcncobmcnbmb
+F-H0-17267 3 popqepfqdpdqcpcqcobqbobpclcnddpd
+F-H0-17268 4 fcpqdpfeodcefdqdecgddced
+F-H0-17269 2 cqppcndppdclcdjj
+F-H0-17270 4 iqcqdrdpfqcnqpddpd
+F-H0-17271 4 fofqqpgpfpcndppddkdd
+F-H0-17272 2 rnnqrpppqndpqdqmdd
+F-H0-17273 2 dmfqbpppcndppdcmcd
+F-H0-17274 2 qcdjdppdqojdqfdd
+F-H0-17275 2 pcppdjdppfpgofqfpdndjdqcdd
+F-H0-17276 3 qdpjppoedppdqfjdqcddncpc
+F-H0-17277 2 nopqnqppbqbpepdodpcocpboeockddpd
+F-H0-17278 3 inpqipfqdpkpdnfoddpd
+F-H0-17279 2 dnfqdpppcgdedcpd
+F-H0-17280 3 mpppnqnpdppjdjpddd
+F-H0-17281 4 qnppdqopqpnolppmoopdondd
+F-H0-17282 4 egppchcodecfpdbfjdcdddccdc
+F-H0-17283 2 dnpqipfqfpeqdpgpfocndcpd
+F-H0-17284 2 dqpqipfqfpeqdpgpfocndcpd
+F-H0-17285 4 cidppqddcffcpdccbd
+F-H0-17286 2 pfdppqqnfqonqpcnmpqmjpqkpmddqincpd
+F-H0-17287 3 icdppqdjfedfidddpchcfcec
+F-H0-17288 4 ndnqqnppqidpddpepc
+F-H0-17289 3 fqppcndppdpjnddjcdqfic
+F-H0-17290 3 pdpqpfcpddqdocod
+F-H0-17291 2 fqdpppnejpddpjqcpfncqdrbpdqbrcpbpc
+F-H0-17292 3 lqnqpppddpndpjjdqfdd
+F-H0-17293 2 lpdrqqpqcqjqqpiqjpfqdpppjoiprnpoqnomdnqlddpd
+F-H0-17294 3 nqdppqpofqqnqppnjpdnqoddpd
+F-H0-17295 4 cdpqcpfddedcpdcbcc
+F-H0-17296 3 ofpqocqddcld
+F-H0-17297 3 fqcnppcidppdhdidjcfdiclcgcdc
+F-H0-17298 4 pppqqqfqdpcqeoqppncnddpd
+F-H0-17299 2 dfqpnppddpdc
+F-H0-17300 2 nqppdppjcipddcjd
+F-H0-17301 2 dgqpdqcecfcddedcpd
+F-H0-17302 2 pjgqkqdpqpdcpd
+F-H0-17303 2 cnpqdpfqqjqoqgqdddoc
+F-H0-17304 2 pnnqppqndpjj
+F-H0-17305 2 empqdqfqipcqdpcpdobococnendmdnbmddpd
+F-H0-17306 3 qoorprnrpqqqnqoqmqopnpmpnodppnpoplqnpddd
+F-H0-17307 3 qopqdpqnpoqmpmplompddd
+F-H0-17308 2 qfqerepeqdod
+F-H0-17309 4 cbdpppdefdqddccc
+F-H0-17310 3 cpcoppcnjpdmdpelenpddncdem
+F-H0-17311 2 qlopfqdpqponlpolqnddpd
+F-H0-17312 2 rfpfppodcpndqdddpcncoc
+F-H0-17313 3 cippdpfddedcqdebcdcbcc
+F-H0-17314 4 pnqqpqppqpdpqopoqmqndcpd
+F-H0-17315 2 lqoppqmpoqqonqnonpmodppddd
+F-H0-17316 2 cddpppgepdfefdcefcgdeceddc
+F-H0-17317 2 kqnqlqkpppdppnnoqiddpc
+F-H0-17318 2 fqopqpdppddjddcffc
+F-H0-17319 2 mppqdqplpopdec
+F-H0-17320 2 ecdpoqdhdedcpc
+F-H0-17321 3 nepdppdddpkcnc
+F-H0-17322 3 ppqpoplpnodppmoopdonidcicd
+F-H0-17323 3 iphqfqdpqpcnfoddpd
+F-H0-17324 3 proqpqopqodpddpd
+F-H0-17325 3 pmqqpqppoqdpooponoqnpnonddpd
+F-H0-17326 2 dbdpppqjjjcfpdddfc
+F-H0-17327 2 chcgppdfdpdeegcedgpdefddcf
+F-H0-17328 2 popqdqiqcpfqddpd
+F-H0-17329 2 cnnqpqkqqpdqpddd
+F-H0-17330 2 pfppeddpncpd
+F-H0-17331 3 opqpcpecpd
+F-H0-17332 3 qqmqnrlqnqjqnppplpkpdppnlopjddpd
+F-H0-17333 4 dbppdopdceeddcec
+F-H0-17334 2 pnqpopmp
+F-H0-17335 3 cqppepcoddpd
+F-H0-17336 2 dppqcfqdddfc
+F-H0-17337 4 reqgpppfdpqepgperfodqfddqd
+F-H0-17338 2 idpqofqgodqdddld
+F-H0-17339 2 nqppeqcpdobndepd
+F-H0-17340 3 hedppqdffehdpdddjdicidhcfc
+F-H0-17341 4 oomppqdpfqpoipdnplddpd
+F-H0-17342 4 qnrrqrqqprqppqnpppdpqoropdpodd
+F-H0-17343 2 bqepdqdpcqcpbpbocnclpd
+F-H0-17344 4 ndppqhdopdqfjdofdd
+F-H0-17345 2 ddppqnjppddp
+F-H0-17346 2 dqcpppdojpcodpcneodmendddnpcem
+F-H0-17347 4 cbdpoqqjqpdepdddcdhcfcdcccebdb
+F-H0-17348 3 oqrqqrpqqqqppprodpqopopnrnqmqnpd
+F-H0-17349 3 ideqcjppqecpddfc
+F-H0-17350 3 dbdpqqcfpdddfc
+F-H0-17351 3 cpppgqdodqencmdlddpd
+F-H0-17352 2 ndqgpererdqeqdpdqcpcqbncpbob
+F-H0-17353 4 qlrppqdpfqqnjpcnpoecpd
+F-H0-17354 2 oedpppqfpdncdd
+F-H0-17355 3 fepqdpdhcedcqd
+F-H0-17356 3 qkqqrpnqdpfqqnppdnjpddpd
+F-H0-17357 3 pinrlqqqqppqppnqoppjdppdmoddqiqcqfncrd
+F-H0-17358 4 fcppcqdfcecfcddedcpd
+F-H0-17359 2 cbppdpcechpdecdddccc
+F-H0-17360 2 lppqdpnpqoqmooqddcoc
+F-H0-17361 2 mopqopoqmpnqqonpnodppddd
+F-H0-17362 2 pepnpqddcpocqd
+F-H0-17363 4 prrrqrqqpqqpppnpqodppdpodd
+F-H0-17364 4 ceppcfdppdcgjddfdd
+F-H0-17365 2 cqhqfqdpppqjqdddnc
+F-H0-17366 4 eqfqipcqfpqpdpgpfocndcpd
+F-H0-17367 4 prqqpqoqqpppqodpqnpopmpnpcdd
+F-H0-17368 2 dnpqdpfqedqd
+F-H0-17369 2 qkrqrrmqqqrppqqpopdppdqmdd
+F-H0-17370 4 icppdpcfqdddfcccdb
+F-H0-17371 2 qlppqjdpqipkqhpjphpiqeohpdrfndqfjdofdd
+F-H0-17372 3 cnnqqnpppjdpdicfcebdbefcpddcedccddbccd
+F-H0-17373 3 mcqpcfgdpdedcdkcecfcdc
+F-H0-17374 4 rnqqrppqdpfqrojpqnqopnponnrmcnqldcpd
+F-H0-17375 2 poppqnjppmdpcepnocom
+F-H0-17376 4 nomppqdpfqpoooonpldcpd
+F-H0-17377 2 qqpqdpfqpnjpcnqlddpd
+F-H0-17378 2 djjpppdppddc
+F-H0-17379 2 dcppqddpcdfcoc
+F-H0-17380 2 pedpppqdpjodoemdnepcmeocpdncnddcqc
+F-H0-17381 2 cofrfqgqcqeqppdqepcpdpdcpd
+F-H0-17382 2 dndqcqqpdpcpdococnbnpdcmdd
+F-H0-17383 3 ccdppqcnfqddpdhcfc
+F-H0-17384 2 pnpqcqplqoddqc
+F-H0-17385 3 rcjqpppjdpreqfqdrdpdqcodpcdd
+F-H0-17386 2 dopjopjj
+F-H0-17387 2 ckdrrqfqqqcqpqqpnqpprpopdproqnqocnqlddpd
+F-H0-17388 4 roqrrrprqqpqqpppnpqodppdpodd
+F-H0-17389 3 ncppdpcieecgeddeddcecdpd
+F-H0-17390 2 qhqppdcoidqfcd
+F-H0-17391 2 kdeqpqncpkdcpd
+F-H0-17392 2 qfnqhqfqdpqpqjqlddpd
+F-H0-17393 2 qgnqhqfqdpqpqjqlddpd
+F-H0-17394 2 pcpppjdpoeqfpdqcjdncdd
+F-H0-17395 2 fgdpppiffedfpdidkdddfc
+F-H0-17396 2 npdppqpopldcpd
+F-H0-17397 2 fqdppqpopldcpd
+F-H0-17398 3 cndppppjdjjjpddd
+F-H0-17399 3 rnrrqrrqprqqoroqpqppqpdpqopoqnpnpmrmqlqmqdddoc
+F-H0-17400 4 orqqqrqppqpocpddpeocqd
+F-H0-17401 3 oodppqqnfqpniponqocnpoddpd
+F-H0-17402 2 fofqfpppdpgpgoepddpd
+F-H0-17403 4 rqprqqpqoqqpppqodpqnpopmpnpcdd
+F-H0-17404 3 oroqpqdpfqpoipcnplddpd
+F-H0-17405 3 bcdpppciceecpddcddcbcc
+F-H0-17406 3 mppqcopkdcpd
+F-H0-17407 2 hedppqdhfegcdedcpd
+F-H0-17408 4 orqqqrqppqponponcppdqmdd
+F-H0-17409 2 qnnqppeqddpc
+F-H0-17410 2 jdnqppjpoodppjddpd
+F-H0-17411 4 ojlqnrqpqqpppqopnqdppjmopdqiddpiqcqfncrd
+F-H0-17412 3 qqprorpqnrnqoqmqqpopppmpnpdpnoqomopoonoopjddpd
+F-H0-17413 2 roqqqppqpprpopdpqlqncjcedfcdcffcdedcpd
+F-H0-17414 4 nomppqdpfqpoiponoodnplddpd
+F-H0-17415 3 roqqrqpqqpopmppddpdd
+F-H0-17416 2 qnnqircqdripfqdpppdnfoddpd
+F-H0-17417 4 oppppqmpqpdpjpqopkddpd
+F-H0-17418 3 oqpqppfqdpqppoqodcpd
+F-H0-17419 3 fdppdpefdhdefepdeegdeceddcdd
+F-H0-17420 3 qcdpoqqjqpqfqlrdpdddmc
+F-H0-17421 3 dnnqeqfqjpqpdpfpddpd
+F-H0-17422 4 dqfqeqppcpepqdddoc
+F-H0-17423 4 ccbpcqenqpcnfpbkdpdfdkpdedcd
+F-H0-17424 3 qqrpppqnnponql
+F-H0-17425 3 olfqdpppqnjpdnqlplpkddpd
+F-H0-17426 4 pkqjqpqidpqhpjpdpindqfcdof
+F-H0-17427 3 bddppqdecfdcpd
+F-H0-17428 2 fpcoppcnjpdmdpelcpdlenpddncdem
+F-H0-17429 3 efdpppdfcffeeecedeedpdcdfdfcdddcccebbcdb
+F-H0-17430 2 dfppdpcfdeceddpdhccddcfcdbcccbbb
+F-H0-17431 2 qnppnqjpdppd
+F-H0-17432 2 nddppqqfqkpfqeddpd
+F-H0-17433 2 ncdppqqfqkpfqeddpd
+F-H0-17434 4 pqqqppnqqmdpddpd
+F-H0-17435 3 nqpppqmpfqdpippoooonnodnplddpd
+F-H0-17436 2 cfdppqclcjddpd
+F-H0-17437 3 orqqqrqppqponpecpd
+F-H0-17438 2 pjnqdqppqnddqd
+F-H0-17439 2 fdoqqpdppdcfdd
+F-H0-17440 2 drhpfqdpfodnpd
+F-H0-17441 4 lcfqppdqdocpcncodmcgpjddcincpd
+F-H0-17442 3 ofpqpjdppfpgpdqfddnc
+F-H0-17443 3 jdppdppjncqfdcpd
+F-H0-17444 4 efepppdhdeeepddcgd
+F-H0-17445 3 qqrpmqdpppqmqhqjqdddoc
+F-H0-17446 2 mqoppqnpoqdpqmqoddpd
+F-H0-17447 3 efdppqeededcqd
+F-H0-17448 2 qjppdpqdccoc
+F-H0-17449 4 pcpqdpqdodddqcrc
+F-H0-17450 3 rppqdpjpqnpoddpd
+F-H0-17451 2 onqqpqqpfqdppppoipcnooddpd
+F-H0-17452 2 fodqcodldcpd
+F-H0-17453 3 jddppjpddj
+F-H0-17454 3 iccipppddpidjclcgcdc
+F-H0-17455 2 pnpqoqqpopppdpqopoooqnpjpmqdddoc
+F-H0-17456 3 gpdrhqfqfpeqdpcqcnppddpd
+F-H0-17457 4 ceqqprppnqdpkqpnchqibeqfpdcfedrdddbdcddcqcccncbc
+F-H0-17458 2 mppqdpplpoqdcfkcddfc
+F-H0-17459 2 fpfqhqdqepcqdpbqcpppddpd
+F-H0-17460 2 prqrpqqqppqpdpqnpopdqldd
+F-H0-17461 4 cpdqpqjpcqdpqoclcnddpd
+F-H0-17462 2 ccdqqqpd
+F-H0-17463 3 dqfqipeqfpqpdpgpfocndcpd
+F-H0-17464 2 fcdpooddpf
+F-H0-17465 2 qedppnddoe
+F-H0-17466 3 cgdpppegcfdecdddpchcfcecccdcdbebcb
+F-H0-17467 3 qlqrqqorqppqponponcpplqmpdqkdd
+F-H0-17468 3 kcdppqcfpdcdgdeceddcfc
+F-H0-17469 3 popqdpekcmckcedgcdcffcdedcpd
+F-H0-17470 2 cnfqdpqpddjpncpd
+F-H0-17471 2 qlerdreqcrdqmqipfqfpcqdpppdocpqjcnddpd
+F-H0-17472 2 fcerdreqcrdqmqipfqfpcqdpppdocpqjcnddpd
+F-H0-17473 2 fcdppqpdjjdd
+F-H0-17474 2 fohqfqdpppdeqfldcfddpdnccdhcqcecfcdcccpbdbebcb
+F-H0-17475 4 nqrqqqrpppqpopnpqolpnodpqnpopmoopdondd
+F-H0-17476 2 dqfqcpppdcpd
+F-H0-17477 2 qnpqdppfodreqcqdpcddkcrc
+F-H0-17478 2 npdppqqnqponqhpjqddcoc
+F-H0-17479 3 krqqprppnqkpdppnnoqdddoc
+F-H0-17480 2 qodpppqnqiqkqdddoc
+F-H0-17481 2 brdrhqcrcqfqdpppcnfoddpd
+F-H0-17482 2 kddppqcdqoncpd
+F-H0-17483 4 nddpppqcpjpcqdocpdncoddckd
+F-H0-17484 2 qnrqpqqqrpppqpdpqdpndd
+F-H0-17485 2 rrrqpqqqrpppqpdpqdpndd
+F-H0-17486 2 clppdqcndedcpd
+F-H0-17487 2 peppdqjpddpc
+F-H0-17488 3 oopqmpppdpplpoqdddoc
+F-H0-17489 2 peppdpjdcgpcddfc
+F-H0-17490 3 qdpqdppdqedd
+F-H0-17491 3 dmdqpqfpfqdpeqpogpfocnddpd
+F-H0-17492 3 jpjjjd
+F-H0-17493 4 piqhpppddondqfjdofdd
+F-H0-17494 2 pmrppqdpfqqnjppnpocnonomqlddpd
+F-H0-17495 3 qcpjppoedppdqfddnc
+F-H0-17496 3 qnpqqroqqqnqppjpmpoodpnopomoonplnnqdddoc
+F-H0-17497 3 cqpqepcppddndd
+F-H0-17498 3 ncqpphdpcdpepcne
+F-H0-17499 4 cfppdqdgdfffeeefeddedcpd
+F-H0-17500 3 dgcfppcedppdcgjddfdd
+F-H0-17501 3 epdqdpcqcpcnclpd
+F-H0-17502 3 nolqnqppeqpjecpd
+F-H0-17503 2 fqeqepppqecp
+F-H0-17504 2 qgrfpppfdpqepgpeogpdqfcdof
+F-H0-17505 2 ndppdppjdeqdqcpdpcodnclc
+F-H0-17506 2 nrlqqqqppqppnqopdopjddpd
+F-H0-17507 3 pkdpfqqnppdnjpplqlddpd
+F-H0-17508 4 qncqdrppiqdpfqdnpdcicdcfec
+F-H0-17509 3 qeqdpeoc
+F-H0-17510 2 cfqfpdfdcdedecfcdc
+F-H0-17511 2 qhfqdpppcnjpddpfncpdkcqcpb
+F-H0-17512 4 edqqprppnqdpkqpnchqipdqfddcfcdrdqcdcnccc
+F-H0-17513 3 lnopqpjplpdpqnonddpd
+F-H0-17514 4 cbdpqpdefdpddccc
+F-H0-17515 2 bppqhpcqcpepeodpenfocnfnemdmdcpd
+F-H0-17516 2 copqhpcqcpepeodpenfocnfnemdmdcpd
+F-H0-17517 4 gpfppqdpfqdcpd
+F-H0-17518 4 cqhqfqgqppeqgpfpcpdpdnddpd
+F-H0-17519 4 qgpqdpqfpfqdoddd
+F-H0-17520 2 djppdpphpendjdpcdd
+F-H0-17521 2 fqcqppjjddqc
+F-H0-17522 4 oooqpqopfqdppppoplddpd
+F-H0-17523 4 gdppdpdepdfdfcgcdc
+F-H0-17524 3 pnnqlqnoppcddppc
+F-H0-17525 3 nnpqqqoqppnqmpoodpnopoplonpcdc
+F-H0-17526 2 dneqhpppcpfpqdddoc
+F-H0-17527 2 pbppeqndcpddqdocld
+F-H0-17528 4 feppepefdhdeeepddcgd
+F-H0-17529 4 qgqhqprfdpqeqipdpindqfddof
+F-H0-17530 2 encnppdmjpcmdppddncdem
+F-H0-17531 2 jdrqrrpqqrqpqqqooqpoppnooppndponooqlqnqdddoc
+F-H0-17532 3 qcppdppjqfnemdpdddndnckd
+F-H0-17533 3 qcqqrpppqnnpondprkpkpfncpdpbdd
+F-H0-17534 4 jpdppqcnfqjdqkddpfncpd
+F-H0-17535 2 chdpppefcfdfdeeeceddpdecfddcedcccd
+F-H0-17536 2 gqerhqdreqfqppcqfpgpdppddndd
+F-H0-17537 2 qflqnrqpqqpppqopnqnpdppjddpdnclc
+F-H0-17538 2 cqhqfqfpqpdpcnddpd
+F-H0-17539 2 cddpppfdcfddqdhcfc
+F-H0-17540 2 oeodpeocpd
+F-H0-17541 2 cpdoepcodp
+F-H0-17542 3 nmpqpodponqmpdomcd
+F-H0-17543 3 pqqpoqopppdppnpopd
+F-H0-17544 2 noqpqqdppqpnfqonipcnooddpd
+F-H0-17545 2 qnppergpcqdpcpdobndldcpd
+F-H0-17546 2 eqpphpepdpeocpdmddpd
+F-H0-17547 4 pkqqpqppoqdpfqpoooqnnoonpnqmpmqlplddpd
+F-H0-17548 2 kddqpqdhcedeqddchc
+F-H0-17549 2 pepdqfrcrdqcqdnc
+F-H0-17550 4 dmdqdoqpeneppdeocd
+F-H0-17551 4 qlqpqoppqndppmpnomonnlnmpiolpdpkdd
+F-H0-17552 4 qhdpppqjndddqc
+F-H0-17553 2 epppfqfpgpdppdgodddjfccf
+F-H0-17554 4 hppqiqfqhqjpdpipcnfoddpd
+F-H0-17555 4 edcqppdcpdccdd
+F-H0-17556 2 jdpqdqpkncpfdcpd
+F-H0-17557 4 qpqqpqdpqmpodcpd
+F-H0-17558 2 epcpqopc
+F-H0-17559 3 gddpppqjdedhqddcoc
+F-H0-17560 4 ondrcqpqdpiqpofqcnqmddpd
+F-H0-17561 3 ohqpqhdppdqjndqfddofqcrd
+F-H0-17562 2 mqfqeqepdqqnpppdcpdc
+F-H0-17563 2 ipfqdpqpcecfcddedcpd
+F-H0-17564 2 pjdppqpnpdqfdd
+F-H0-17565 2 fqdppqciqkdcpd
+F-H0-17566 2 ooopqodpjjddpd
+F-H0-17567 2 qnnqppdedpod
+F-H0-17568 3 dpdqqpfogpeododlendcpd
+F-H0-17569 3 pqqpqqppqndpqepkdd
+F-H0-17570 4 ondrercrhqpqeqfqdqcqdpcppocndoqmddpd
+F-H0-17571 4 jpiqpqhqfqdpipcnfoddpd
+F-H0-17572 3 cbppdpcecipdecdddccc
+F-H0-17573 2 nokqnqppdpciddcffcpdccbd
+F-H0-17574 4 fqeqppcpepecpd
+F-H0-17575 4 lqnqppcqpjqcmepcqdncpdccodnblc
+F-H0-17576 2 ncppdpchdgcfdfcedepdeccd
+F-H0-17577 2 gqprppnqkpdppnnopjdcpd
+F-H0-17578 2 qqprppnqkpdppnnopjdcpd
+F-H0-17579 2 eogqeqcpppdcpd
+F-H0-17580 4 roqrrqqqpqppqpdpqopopnrnqmqndcpd
+F-H0-17581 3 drhpcqcpppeoepcodpenfocnfnemdmdcpd
+F-H0-17582 2 cgppdpcjqfpeqdpdddjdqcpcncocqbfcpbob
+F-H0-17583 2 qpoqfqbpcqcndpckddod
+F-H0-17584 2 egppeqefcgdedcpd
+F-H0-17585 2 reqeqfpdlcnc
+F-H0-17586 2 mqdppqpoqpqnqomnqdddoc
+F-H0-17587 2 qfnqqqkqrpppdpqlqnpkonqhqjpdcfjdddfc
+F-H0-17588 2 hdppdpcgbefeedeecddebdceecpd
+F-H0-17589 2 pqqpqqppdpqlqncjcedfcdcffcdedcpd
+F-H0-17590 3 dnpqipfqdpcnddqd
+F-H0-17591 2 pipqdpfqpooprnroonqonnooqmqnpmpnqfpdddnc
+F-H0-17592 2 rdpqdpfqpooprnroonqonnooqmqnpmpnqfpdddnc
+F-H0-17593 2 fcmppqjppodppkdjpdddjd
+F-H0-17594 4 dqpqcoepdcpd
+F-H0-17595 3 ddppeqdecdceecpd
+F-H0-17596 2 cnppqddpndpjmdqeddnepcpdocodmcrcqbqcobncmbnb
+F-H0-17597 2 qncrdqeqbqcqcpppcojpbodpdndodmencmcnbmbnddpd
+F-H0-17598 2 mcdppepcndnc
+F-H0-17599 3 hphqdrgqpqdpfqcngpdcpd
+F-H0-17600 3 bnqqqrdqorqppqfpfqdpeqponpfogpcobodncnqldmddpd
+F-H0-17601 2 ocoepepdodpc
+F-H0-17602 2 pnpqeqqddcoc
+F-H0-17603 2 pjdjeppdpondqfdd
+F-H0-17604 3 qfdpppdfedbehcpddccdccbc
+F-H0-17605 2 rddpoqqjqppiqlqfqhofpdddnc
+F-H0-17606 3 qqrppqdpfqrojpqnqopnpocnqlecpd
+F-H0-17607 2 fmipfqdpppdnfocfpdddfc
+F-H0-17608 4 pjppdpqipiqhohphqfpdofndcfjdddfc
+F-H0-17609 2 rcdpppnejpddpjqcpfncqdrbpdpbpc
+F-H0-17610 3 qoorprnrpqoqnqqpmqppopnpmpnodpmopoonoopjddpd
+F-H0-17611 3 qhdppqqnqppjpddc
+F-H0-17612 2 qepppcdpdc
+F-H0-17613 2 cqppbpfpcndpqdcldd
+F-H0-17614 2 ncoqdpqpqjcfdepdddcdhcfcecccdcdbebcb
+F-H0-17615 2 ncrqqpqqpppqopnqdprproqnqoceqlpdjcdc
+F-H0-17616 2 omqppqdpppqopopnonpmddpc
+F-H0-17617 3 ccppdfdcpd
+F-H0-17618 3 eqfpfqdpppgogpfoepddpd
+F-H0-17619 3 qqpqppqpnpdppoqoddpd
+F-H0-17620 3 dopqdqfqipcqdpcpcoboencndndmddpd
+F-H0-17621 3 ocppdpqgqfrfpeqepdqdddpcqc
+F-H0-17622 2 cnerdrjqcreqfqdqcqdpppdocpdcpd
+F-H0-17623 3 qqrpppqnnpondppdpkfddjddcf
+F-H0-17624 4 rqqqqpopmppddpdd
+F-H0-17625 3 opppnqnpmpdppdmocdpjncqf
+F-H0-17626 4 eodreqdqepppendopdcocd
+F-H0-17627 4 qhdppqqnqppjqddcoc
+F-H0-17628 2 cnrqqpqqpppqopnqrorpqodpqlqncjcedfcdcffcdedcpd
+F-H0-17629 2 hdqpdqpdcdec
+F-H0-17630 2 hddqppqdcded
+F-H0-17631 3 fqppcndppdjcdd
+F-H0-17632 4 rgqpqhdprfqiqepipdqgndqfddof
+F-H0-17633 3 edpqdpoccedcqd
+F-H0-17634 4 mqrqqrpqqqoqppnqoprpnpqpdpmpqoddpd
+F-H0-17635 2 eofqfpeqdpppgogpfoepddpd
+F-H0-17636 2 qppppnnpqfpd
+F-H0-17637 2 oroqpqdpplpopd
+F-H0-17638 4 qrqqpqponponcppdqmdd
+F-H0-17639 3 ccdppqponqqnqppmqodjqgqiqdddochcfc
+F-H0-17640 4 ponppqcppdqodd
+F-H0-17641 2 qfdpppdhffgeeffedeeepdncgdfcddecccdccb
+F-H0-17642 2 jdppnqpndppjddpfncpd
+F-H0-17643 2 conpdqdoqpddpd
+F-H0-17644 3 oeppqddppdqeldpecdod
+F-H0-17645 2 deppdpjpjdqfncpddc
+F-H0-17646 2 lpjppqdppkdjpddfjdddfc
+F-H0-17647 2 cqdqcpppdojpcodpcneodmendddnpcem
+F-H0-17648 3 chpqfqcjcpcfclpcdd
+F-H0-17649 2 cgqpqddpddcffcbd
+F-H0-17650 2 jpdppqcipkdcpd
+F-H0-17651 2 cjqqqrdqorqppqfpfqdpeqbpnppogpfobococndnbnqldmddpd
+F-H0-17652 2 pcjjqpdddp
+F-H0-17653 2 dppppdjjcd
+F-H0-17654 3 qcpqdppfodqd
+F-H0-17655 3 dmppcnjpqcdpccdn
+F-H0-17656 4 prppnqkpdppnnopjcldjcedfcdcffcdedcpd
+F-H0-17657 3 qlppqjdpqipkqhpjphpiceohpdqfndofdc
+F-H0-17658 2 dropfqdpqpcnpd
+F-H0-17659 3 nddppqqfqhofpddd
+F-H0-17660 2 qkpppddpcdqfncof
+F-H0-17661 3 fpfqhqppdpdndcpd
+F-H0-17662 4 eqdqcqepppeodpdndoddpd
+F-H0-17663 2 bcdpppdfpdcecdedecdddc
+F-H0-17664 2 rcreqfqdrdpdqcnc
+F-H0-17665 3 qfppcfdpqdodpcmdocncdc
+F-H0-17666 3 qpdrdpfqcnnpddpf
+F-H0-17667 2 dhfqdpppcnjpqjdedcpd
+F-H0-17668 2 rppqqqoqppnqmpoodpnopomoonplnnqddd
+F-H0-17669 3 lqnqdrdpfqcnppdcpd
+F-H0-17670 2 lolppqdpopoonpnompmoqoqnpopnqd
+F-H0-17671 2 cfdpqocededcpd
+F-H0-17672 3 hcceqppddpccec
+F-H0-17673 4 nccnpqpddpcdqf
+F-H0-17674 4 sdpipprfdpqeqfpepfrdrepdqdjdrcddqcpc
+F-H0-17675 2 npdpfqqnppcnjpqjqhddpd
+F-H0-17676 2 qqpqppnqmpooponoonplddpd
+F-H0-17677 2 nnpqppnqmpooponoonplddpd
+F-H0-17678 2 qfcnjqdjpppdfpjddpdd
+F-H0-17679 2 dcecde
+F-H0-17680 4 nqdrdpfqqncqcnppddpd
+F-H0-17681 3 cfnpdppfddfc
+F-H0-17682 3 ecdpppcedfcddedcpd
+F-H0-17683 2 onpqdpqopnpoddpd
+F-H0-17684 2 hdpqqdcpcded
+F-H0-17685 2 eqepqpcdcppc
+F-H0-17686 2 nqppdqpijpjddkpcddfc
+F-H0-17687 4 qppppqdpfqpoqodcpd
+F-H0-17688 3 roqqrqpqmqopqpdpddpd
+F-H0-17689 3 nkqoqpqnpppmdpompnqlonnlnmpiolpdpkdd
+F-H0-17690 3 cmoqdpckcedgcdcffcdedcpd
+F-H0-17691 2 opqpeecppd
+F-H0-17692 2 edqppddpidcfcd
+F-H0-17693 4 cpdrfrfqkqeqjqcqhqppgqipdphpcngpddpd
+F-H0-17694 3 bqppcqhpepcpdpeofocofnendmcnpdemdc
+F-H0-17695 3 qfpfppoedpodpejdpdddpcoc
+F-H0-17696 2 nqppdppjjjcjddpd
+F-H0-17697 3 ncppdpqfpddc
+F-H0-17698 3 nqppdpqhciogrfpeqfpddejdqdgdqcpcdc
+F-H0-17699 3 ooopqppmlppddpidcicd
+F-H0-17700 2 dpfqppddpd
+F-H0-17701 2 djppdpncdd
+F-H0-17702 2 dcpqcpepqd
+F-H0-17703 3 qpprorpqnrnqoqmqppopnpmpnodpmopoonoopjddpd
+F-H0-17704 4 pcppdqpjodoemdneocmencpddcnd
+F-H0-17705 3 oepqddqdocmd
+F-H0-17706 3 pioqdpqpqjqlqfqhofpdrdndddqc
+F-H0-17707 2 ropqrpfqdpjpqnqopnpocnqlecpd
+F-H0-17708 4 qpqoppqndppmpnpionpdpkdd
+F-H0-17709 2 fcppdpcjqjcfddpd
+F-H0-17710 2 ocdpppnepjkdpfedpdnclc
+F-H0-17711 4 onqnpppmdppipnpdpkdd
+F-H0-17712 2 mpppeopjeepd
+F-H0-17713 3 mppqpocpddplocqd
+F-H0-17714 2 rrqqrqpqqpopdppdpnddjc
+F-H0-17715 2 fqdpqppdjj
+F-H0-17716 2 cpppjjddqd
+F-H0-17717 2 qqppnqjpqndppmpnpdoncddj
+F-H0-17718 2 oqppnqnpmpnodppjqnpddcjd
+F-H0-17719 2 nppqdpplpoqeqfqdpepcdd
+F-H0-17720 3 cpfqipcqfpqpdpcndcpd
+F-H0-17721 2 prppnqpndqddpc
+F-H0-17722 2 jpdppqdnfqpddc
+F-H0-17723 3 pknqdpqpqjqkddpd
+F-H0-17724 2 pnpqoqqpppqodpqnpopd
+F-H0-17725 3 ebdpppdegdpddccdcbcc
+F-H0-17726 3 hpfqiqpphqjpdpipcnfodcpd
+F-H0-17727 3 cqfqppcpdpcnendmdnpddjcd
+F-H0-17728 2 mdpqdpqkqfpdddndnckd
+F-H0-17729 2 qcpqdpqkqfpdddndnckd
+F-H0-17730 2 epdpeodoendnpd
+F-H0-17731 2 gofpfoepeodppd
+F-H0-17732 3 enkqcnqppddpcddk
+F-H0-17733 4 rnpqqqqpppqodppnpoqmqnpd
+F-H0-17734 3 qfpqmpopjppkdppddcjd
+F-H0-17735 2 qqlqnqppcqpjqcmepcqdncpdccodnblc
+F-H0-17736 3 qpqoppqndppmpnqhonreqfqerdqdrcpdqcodpcddnc
+F-H0-17737 2 hddpppdgeefdcedcpd
+F-H0-17738 2 pfdpfqdnppedjpncpd
+F-H0-17739 2 kpnqppeppddfjdddfc
+F-H0-17740 3 pfqppjdppdqfcdnd
+F-H0-17741 3 dqfqjqcqdpppdcpd
+F-H0-17742 2 golqnqkqdqjqkphqjpppiplpnopnlopjecpd
+F-H0-17743 2 nppqnqoqopqppc
+F-H0-17744 2 kqiqdqqdppddcn
+F-H0-17745 2 iqpqnqoqopqpmpqndppd
+F-H0-17746 4 gpfrgrfqercqcrbqgqppeqepdqdpfpfocpcodcpd
+F-H0-17747 4 qdpfpdqcnd
+F-H0-17748 2 lqnqcqdqppjpcpdpqndocndnbnclpddd
+F-H0-17749 4 opqpqhdprgqirfpiqerhpdqgndqfddof
+F-H0-17750 3 qrqqpqdpplpodcpd
+F-H0-17751 2 dndqcopppddlcd
+F-H0-17752 4 ckdqqpcpcnddpd
+F-H0-17753 2 jdkqdpqpddpfncpd
+F-H0-17754 4 fdfqdpppcncfidpdddfc
+F-H0-17755 2 gkkljkkkikjjljjikjhi
+F-H0-17756 4 qqpppqdpoqpofqonoopknoddpd
+F-H0-17757 4 repippqedppeqfpdpfjdqdddqcpc
+F-H0-17758 3 iccipppddpidjcmcgcdc
+F-H0-17759 3 qfoqdpqpqiqkddpd
+F-H0-17760 2 gelqnqppdppjnepflepdkdldjdlcidkcddjcnchc
+F-H0-17761 3 deegppdfcopddgjdcfdd
+F-H0-17762 2 lpcqiropdripfqdpqpdnfoddpd
+F-H0-17763 2 cjeqppcpccpd
+F-H0-17764 4 rqqqqpdqpnopddpd
+F-H0-17765 3 fofqipppfpgpdpcncecfcddedcpd
+F-H0-17766 2 cjcepppddpndpjjcqfdc
+F-H0-17767 3 fpeqfqdqppcpepqdddoc
+F-H0-17768 2 icdpqdodddncpcfcoc
+F-H0-17769 3 edppfqepdqdpcqcpbqcobpbocndkqdcedc
+F-H0-17770 2 qqdqnqrpppqnpdec
+F-H0-17771 3 qjoqdqqpecpd
+F-H0-17772 2 dnfqppdqepcqdpbqcpbpcocnbopdckcd
+F-H0-17773 3 cbdpppdegdpddccc
+F-H0-17774 2 qfqrqqorqppqdpnppopdqkcd
+F-H0-17775 2 cjhqpqfpjpdphojdpkddpd
+F-H0-17776 2 ohppdpqipjqhpiphqfpdofndcfjdddfc
+F-H0-17777 4 qpqrqqpqponponcppdqmdd
+F-H0-17778 4 bcprqqnqppkqdpchpnbeqipdqfedcfddrdcdbdqcdcnccc
+F-H0-17779 4 dnpqhpfqdpfodcpd
+F-H0-17780 4 fdpqdpceodqdecgddced
+F-H0-17781 2 clppdqdncedcpd
+F-H0-17782 2 qorppqdpfqqnippnpocnplddpd
+F-H0-17783 4 nqerdrhqcreqfqdqcqdpppdocpqncnedpd
+F-H0-17784 2 jpdppqjdpkdcpd
+F-H0-17785 4 qldpkqdnfqpkqpqjqkdcpd
+F-H0-17786 2 eoppnqqndqdnkppcdd
+F-H0-17787 4 dbdpoqqjqpdepdddcdhcfcdccc
+F-H0-17788 3 oqpqdpfqpojpdnplcdpd
+F-H0-17789 3 qfpopqnonqqnqppndppdqodd
+F-H0-17790 3 lddppqodqdmdmcdd
+F-H0-17791 3 qodppqpoqmonpmnmomnlqddcoc
+F-H0-17792 2 qpdppqqndedcpd
+F-H0-17793 3 ppqpoqoppndppd
+F-H0-17794 4 hdppdpfedjjddfidddocicfchc
+F-H0-17795 4 dcppchcopdcfjdccdd
+F-H0-17796 3 dfppeqpdcpfddd
+F-H0-17797 3 kqnqlqkpppcppnnopcdd
+F-H0-17798 4 pkoqdpqjpjqipiciohqhqfphofcfddpdfcndccbd
+F-H0-17799 2 nclqnrqpqqpppqopnqmodppjkddedcpd
+F-H0-17800 3 plqqpqppoqdpooponoqnpnonpmqmddpd
+F-H0-17801 2 cniqfqdpppdjpddd
+F-H0-17802 4 ecdppppddegdfdfcgcdc
+F-H0-17803 4 popqppqpmpopdpjpqopkddpd
+F-H0-17804 2 edppdedppddceceb
+F-H0-17805 2 cfppdpbecepdedcd
+F-H0-17806 2 qppqqqfqdpoppoooddpd
+F-H0-17807 2 pnpqqqfqdpoppoooddpd
+F-H0-17808 3 qkdrercrhqqqeqnqdqfqrpcqdpppdocpqncnecpd
+F-H0-17809 3 cddpqocfcededcpd
+F-H0-17810 4 beppdqdgdfcgcfffeeefeddedcpd
+F-H0-17811 2 ndjjddpepc
+F-H0-17812 2 ecdpppdhdffedeeepdddfddceddbeb
+F-H0-17813 2 nppqnqoqopqpdpecpd
+F-H0-17814 2 dopqcqfpccpd
+F-H0-17815 2 ldqfqepfqdpepcmenc
+F-H0-17816 2 mdppqedpqdpfndpdddodpcrcocqcmcncrblcqbnbpbmboboa
+F-H0-17817 3 omqlqpqjcpqipkqhpjphpipdohndqfjdofdd
+F-H0-17818 4 empqhpepcpdpeofoenfncndmdcpd
+F-H0-17819 3 popqfqdppd
+F-H0-17820 4 roqppplpopdpqopopdqncd
+F-H0-17821 4 gddpppddpdfcfdecgc
+F-H0-17822 3 hcpqdpgeodfefdcefcqdecgddced
+F-H0-17823 2 knpqkpmpdppkddpd
+F-H0-17824 2 neogjjqfofnfoererdqdrcpdqcocpcncobmcnb
+F-H0-17825 3 lopqdpnqpofqnojpdnplddpd
+F-H0-17826 3 pcdppppdocdd
+F-H0-17827 3 pmppqnjpcedpocpn
+F-H0-17828 4 nmqoqpqnpppmcpompnpionpdpkdd
+F-H0-17829 2 didpppqjpdcfdd
+F-H0-17830 2 pqoqopqppndpdcpd
+F-H0-17831 2 pqnqoqopqpcndp
+F-H0-17832 2 pnpqdpfqdnjpedpd
+F-H0-17833 3 mnpsoqnsmqqrlqorqpnrppmropqqmppqnonqpjnppddpttdd
+F-H0-17834 2 dodqqodcpd
+F-H0-17835 2 ldppdppjqfpdddqcnclc
+F-H0-17836 2 ooqqnqlqdpppqnpjddpd
+F-H0-17837 3 fcqqeqckcpddpd
+F-H0-17838 4 deoqdpqpqjpdddcdhcfcdccc
+F-H0-17839 3 gdppdpefdfcffeeecedeedpdcdfdfcdddcccebbcdb
+F-H0-17840 2 fqppdpcncecfcddedcqd
+F-H0-17841 2 dpppdcqe
+F-H0-17842 2 qcpopqqnnqpnqppjdppdqoddnclc
+F-H0-17843 2 oinrlqqqqppqppnqoppjdpojmopdqiddpiqcqfncrd
+F-H0-17844 2 fcppnqqnjpdjdpddpd
+F-H0-17845 2 djqpegdgefffcffeeeedceddpdcchddbcd
+F-H0-17846 4 dqbqpqcpcqdnepddpd
+F-H0-17847 3 cpdqgqeoppdocopddndd
+F-H0-17848 3 eqfpfqdpgpfocnddpd
+F-H0-17849 2 djjqdppprnnpqnqoonqlpkqhqjqdddoc
+F-H0-17850 2 opppnqnpmpmodppjdjpddd
+F-H0-17851 2 qnpqdpfqcnjpedpd
+F-H0-17852 2 ncfqhqcqgqppeqgpfpcpdpdnddpd
+F-H0-17853 4 pjdpkqdnfqplqppkqlqjqkdcpd
+F-H0-17854 3 rnqqrppqdpfqrojpqnqopnpocnrmplqlddpd
+F-H0-17855 4 qjqhqppddpndqfddofqcrd
+F-H0-17856 3 pppqmpfqdpooponoonpldcpd
+F-H0-17857 4 dqpqjpfqfpeqdpgpfocnddpd
+F-H0-17858 2 bopqbqdqcpcqdnepddpd
+F-H0-17859 3 qpqqppqndpqepkdd
+F-H0-17860 2 popqdqqddcnc
+F-H0-17861 2 qnpqdqqddcnc
+F-H0-17862 2 ereqdrcqdqbqcpppcodpcndodmdndcpd
+F-H0-17863 2 qrrqprqqpqoqqpppqodpqnpopmpnpcdd
+F-H0-17864 2 nndqppqpoplpnooopmqnpdondd
+F-H0-17865 3 cfqodpcededcpd
+F-H0-17866 2 dnfqoqqpdpcnddpd
+F-H0-17867 2 eofqoqqpdpcnddpd
+F-H0-17868 2 qnnqppdpddoc
+F-H0-17869 3 qpdppqqnfqdcpd
+F-H0-17870 2 ncircqdripfqdpqpdnfodcpd
+F-H0-17871 4 ciqpdpfddedcpdebcdcbcc
+F-H0-17872 2 dbdppqqkqnqhqfohqdcfkcddfc
+F-H0-17873 2 idfqcnppcidpqdhenckcfchcdc
+F-H0-17874 4 cdppdpgddedcpdcbcc
+F-H0-17875 2 pjcnppdjjppddpddjj
+F-H0-17876 3 popqodcpecqd
+F-H0-17877 3 frhqergqdreqfqppcqfpgpdppddndd
+F-H0-17878 4 qooqdpfqpoqpddpd
+F-H0-17879 2 qnhqfrppfqfpdqepcqdppdcpfddjddcf
+F-H0-17880 2 pldqpqpoqdddnc
+F-H0-17881 2 qodqpqpoqdddnc
+F-H0-17882 2 cnippqdpfqjdqkddpfncpd
+F-H0-17883 4 ppoppqnpfqdpoopoplddpd
+F-H0-17884 2 qqpppqmpqpdpjpqoqkdcpd
+F-H0-17885 4 qqqpopdppdpnddjc
+F-H0-17886 2 jqlqppqnnppddp
+F-H0-17887 3 qodppqqnfqcnipqkpoddpd
+F-H0-17888 2 cqdqdoqppdcmdc
+F-H0-17889 2 pnpqrpfqdpjpqnpocnqlecpd
+F-H0-17890 3 dqhqpqfpfqdpcqcpcnddpd
+F-H0-17891 2 djpqjpmpdppkddpd
+F-H0-17892 2 qfeqfqdqppcpjpcnfppdepdc
+F-H0-17893 4 bqfqfrcqdrppgqfpeqepdqdpcpcobpbodcpd
+F-H0-17894 3 chdppqcfeefdceecpddcedcccd
+F-H0-17895 3 obppqndpphpecdocpc
+F-H0-17896 4 qfdppqpoqpqnqoncpd
+F-H0-17897 3 ppoqopfqdpcqeoqppncnddpd
+F-H0-17898 4 olqoqpqnpppmdpompnnlonpinmpdpkdd
+F-H0-17899 2 kqerdrhqcreqqqdqnqrpfqdpcqdoppqncpqkcnecpd
+F-H0-17900 2 cjpdcqcdqpec
+F-H0-17901 2 qpqqpqdpmqpoqmonqddcoc
+F-H0-17902 2 codqepcqdpbqcpbpbocnclpd
+F-H0-17903 3 drhppqdpfqdnfodcpd
+F-H0-17904 4 rqqqqppplpopdpnopopmoopdoncd
+F-H0-17905 2 qqppdpqlqncjcedfcdcffcdedcpd
+F-H0-17906 3 ddoqnpqpdppd
+F-H0-17907 4 mcqpoedpqdqfpdqcjdpcddobncnbmb
+F-H0-17908 2 cidpqoddcffcpd
+F-H0-17909 2 nqppdpfedfpdddfc
+F-H0-17910 2 nqfqdpppdnfoddpd
+F-H0-17911 2 qgqppfdpqepgpeogpdqfjdofdd
+F-H0-17912 2 kqeqpqdqfqcpgpcnepddpd
+F-H0-17913 2 dedpoqqjqppiqlrfqhqfqeofpddcnd
+F-H0-17914 2 qmqqrqpqmqopfqdpqpdcpd
+F-H0-17915 2 redqppodqdddrcqcmcpcfc
+F-H0-17916 2 qjcpppqdddod
+F-H0-17917 2 epcpppqdddod
+F-H0-17918 2 pqopqodpqeddnd
+F-H0-17919 3 onprorpqnrnqoqmqppopnpmpnodpmooopjddpd
+F-H0-17920 3 lddqppodpjmdoeqcnepcmeocqdncpddcnd
+F-H0-17921 3 cqhqfqgqppeqgpfpcpdpcnddpd
+F-H0-17922 3 pnnqlqnoppqfdpceodqdmdpcncocicdc
+F-H0-17923 2 jddppqqnfqcnqpqkjpdfpdddfc
+F-H0-17924 2 neppdpqdodmc
+F-H0-17925 2 qqmqopqpddpd
+F-H0-17926 2 emcqdqcpppcndpbndopdcldc
+F-H0-17927 3 pfqepeoeodqdpcpdocnd
+F-H0-17928 3 ooqqpppqmpqpdpopqojppopkddpd
+F-H0-17929 2 opqqqppqppnqnodqpjdcpd
+F-H0-17930 3 cmdpoqqjqpchcjddpd
+F-H0-17931 3 qoqqpppqdpqppopddc
+F-H0-17932 4 clppfqfpgpdpepcpcodocnenemdndmfmpddkcd
+F-H0-17933 2 djpppddpjdqgdd
+F-H0-17934 4 pioqdpciqfqhofcfddpdfcndccbd
+F-H0-17935 4 rrqrqqpqqpppnpqodppdpodd
+F-H0-17936 2 cfpppdqfcdgdncedecfcdc
+F-H0-17937 2 fcqnppoddpddcf
+F-H0-17938 2 dgppdqcgcfdfpdedcd
+F-H0-17939 3 nedpppqfpjmdpdddndnckd
+F-H0-17940 2 fqdpoqqjqpphqlqfpdrdndddqc
+F-H0-17941 2 jqrpqqdpppqnnpplqhqjqdddoc
+F-H0-17942 2 plpqdpfqqonpoojpdnqmddpd
+F-H0-17943 2 oepeqeodqdpcpdocnd
+F-H0-17944 2 deceddcd
+F-H0-17945 3 kqnpoqmpnqlpmqdpqpddpd
+F-H0-17946 2 pqdpjjddqd
+F-H0-17947 2 poqpqopp
+F-H0-17948 3 nqpqqqoqppmqopqpdpddpd
+F-H0-17949 4 ppqpoplpqodppdpocd
+F-H0-17950 2 kbpqqqfqqpppdpjprnpoqnomcnqlnepfddpdnckdpbqc
+F-H0-17951 4 pqrqqqmqopqpdppd
+F-H0-17952 4 fcdpppdheffedeeepdfdgdeceddcdd
+F-H0-17953 4 kopqkqmpdpqkddpd
+F-H0-17954 2 pppqdpfqpojpcnqoddpd
+F-H0-17955 2 fccnfqdjpppddpcdedec
+F-H0-17956 3 griqfrgqhqfqeqppdpipdnfodcpd
+F-H0-17957 4 oqqrorprpqqqppnqkpqppodppdcfjdddfc
+F-H0-17958 2 cddoopedpd
+F-H0-17959 3 pldqpqpojpdcpd
+F-H0-17960 2 cfqipdqfddrdqcfcnc
+F-H0-17961 2 drdpfqcnnpddpf
+F-H0-17962 4 dhppdpcgdgefdfcffedeeepdecdddccc
+F-H0-17963 4 qrqqpqqpppnpqodppdpodd
+F-H0-17964 2 eppqqocpocdedcqd
+F-H0-17965 4 qqdrercrhqfqeqcqdqqpopcpdppndocnddpd
+F-H0-17966 2 pfppeppdnddd
+F-H0-17967 4 ckercqcrppdqcpfpdoecpd
+F-H0-17968 2 nooqpqopqpdppppoqoqnoopnpjpmqdddoc
+F-H0-17969 2 rodppqooopnonpmoqoqnpopnrnrmpd
+F-H0-17970 2 dnerdrpqhqfqgqhpipfpdphoddpd
+F-H0-17971 2 djcqppcedfcdcffcdedcpd
+F-H0-17972 2 kqqpoqdppdpoddqf
+F-H0-17973 2 rqpqqqrpppqpdpqdpndd
+F-H0-17974 2 npdppqqoploopd
+F-H0-17975 2 qqpqjpnpdpqkpopdddjd
+F-H0-17976 2 okpqjpnpdpqkpopdddjd
+F-H0-17977 3 jpdppqdnfqjdpkddpfncpd
+F-H0-17978 2 hcqpcnfpcidpqdjcdc
+F-H0-17979 3 fcdopqddqd
+F-H0-17980 3 qqqppqppoqdppd
+F-H0-17981 2 qcqjoqpdqpdddplcnc
+F-H0-17982 3 hpgqppcpepcmfodcpd
+F-H0-17983 4 peppqncpoeneqdoddd
+F-H0-17984 2 qnppfqdodqdncpcncodjqjqhddcffcpd
+F-H0-17985 2 qgppfqcndpqlqjdjcedfcdcffcdedcpd
+F-H0-17986 3 dddpppqfdecepdrdncdc
+F-H0-17987 2 qfdpppofqdodld
+F-H0-17988 2 noppnqkpdppdgd
+F-H0-17989 2 nonqppmpnpdppddfjdddfc
+F-H0-17990 2 emcnppdmdppddnndpjddqf
+F-H0-17991 4 bccqbpqpenfpcndpbkdkdfedpdcccd
+F-H0-17992 3 nqppdpcfqfpddecdrdncddkchcfcecccdcdbebcb
+F-H0-17993 3 dndqgqdopppdcodd
+F-H0-17994 2 qfdppqpofqqnqpddqoncpd
+F-H0-17995 3 pnnqppqndpbecgpddfhdbfcddeadcebced
+F-H0-17996 3 mqpsoqnslqqrqporppmropqqmppqnonqpjnppddpttdd
+F-H0-17997 3 efpqdpdgdfcfndqdddfc
+F-H0-17998 4 cpeqfqipcqfpqpdpgpfocndcpd
+F-H0-17999 3 ndppqecpcdpc
+F-H0-18000 2 qjnpdpqoddpd
+F-H0-18001 2 ndppdppjddqd
+F-H0-18002 2 cccgdqpddedc
+F-H0-18003 4 bndqpqjpcqdpcpdoqoclcnddpd
+F-H0-18004 3 cqdrdpfqcnppqjcjcedfcdcffcdedcpd
+F-H0-18005 3 pnpqoqfqopppdpoopoplddpd
+F-H0-18006 3 oqqrrqprpqqqnqppqpdpoppoddpd
+F-H0-18007 2 dddnppdfpd
+F-H0-18008 4 ogqgpppgdpqdphldofddod
+F-H0-18009 2 qqqppqopoqnpppqooopopndcpd
+F-H0-18010 3 bpppdpdocpcobobnddpc
+F-H0-18011 3 pcqpcecpqdncdc
+F-H0-18012 2 dmdqbqcqqpephpencppdbodd
+F-H0-18013 2 cojppqdpfqencndndmdcpd
+F-H0-18014 2 opdqpdqpcddjic
+F-H0-18015 3 oqqqpqppnqmpooponoonmonnpldcpd
+F-H0-18016 2 pfppocdpdcqd
+F-H0-18017 4 reqfqdrdpdqcnc
+F-H0-18018 2 mpdppqqnfqpnjponqonnpodnooddpd
+F-H0-18019 2 nodppqqnfqpnjponqonnpodnooddpd
+F-H0-18020 2 ccdpppdgfegcdedcpd
+F-H0-18021 2 fcdpdrcnfqckcqqjppddpd
+F-H0-18022 4 dlppcojpcndpdmcpelenpddncdem
+F-H0-18023 2 rppqdpfqqnjpcnpoecpd
+F-H0-18024 4 pqqpqqppnqnodqpjdcpd
+F-H0-18025 3 deppdppdhdcdddfcdccc
+F-H0-18026 2 qhdpjqcnfqqfopddpd
+F-H0-18027 2 pdjq
+F-H0-18028 2 qnqpqmdpqlpmqjplqipkqhpjphpipdohndqfjdofdd
+F-H0-18029 2 qnqqpqqpoqppnqnpopdppoqopnoopdoncd
+F-H0-18030 2 gddppqdfcffedeeeceddpdecfddcedcccd
+F-H0-18031 4 oqpqppqpdpqopocjddpd
+F-H0-18032 3 ncpqjpmpdpqkdcpd
+F-H0-18033 4 dcprqqnqppkqdpchpnpdqiddqfcdcfqcrdnccc
+F-H0-18034 2 gcdppdcecdfdeceddcddcc
+F-H0-18035 4 nbdpppndpjqcqdpcpdncoddckdqbocobpb
+F-H0-18036 2 onppdpqlqnqgqjpdcfjdddfc
+F-H0-18037 2 pnnqlqdpfqnoppdcpd
+F-H0-18038 2 rpppdpnpqnpcdd
+F-H0-18039 3 jqkqpqdpfqcnipddpd
+F-H0-18040 2 poopqpdpoonopd
+F-H0-18041 2 onopqpdpoonopd
+F-H0-18042 2 ddmpppdppd
+F-H0-18043 2 ndpppdpgdd
+F-H0-18044 2 hocqfqfpeqdpdqcpppgohpfogpeoepddpd
+F-H0-18045 4 dofqppgpfpepdpcocpcnenemdndmfmpddkcd
+F-H0-18046 4 pooqppnqnpmpnodppjpnpdddjd
+F-H0-18047 2 pnppnqjpcpddqd
+F-H0-18048 3 ncqeqdpepdoeodnd
+F-H0-18049 2 cnppdqdepd
+F-H0-18050 2 pkppqnjpondpnnqoqmpopmpnpdomddol
+F-H0-18051 3 bpcqdqnpcpdppddndd
+F-H0-18052 4 prqqpqoqqpppqodpqnpopmpnqddcoc
+F-H0-18053 2 iofqipqpdphoddpd
+F-H0-18054 2 qoqnpppknpqhdpreqfqerdqdrcpdqcodpcddnc
+F-H0-18055 2 pfrqqqqppqdpkqrooppnpdqfddnc
+F-H0-18056 4 iqcqdrdpfqdnopddpd
+F-H0-18057 2 qgpqdpfqcnjpqjqlddpd
+F-H0-18058 2 qfpqdpfqcnjpqjqlddpd
+F-H0-18059 2 edeqppcfpdeccd
+F-H0-18060 2 pqqqlqnqfqdpppddpd
+F-H0-18061 3 cndpppcdcjecpd
+F-H0-18062 2 opdrdpfqcnqpdcpd
+F-H0-18063 2 pncqirqpdripfqdpopdnfoddpd
+F-H2-1 386 qpdpttpd
+F-H2-2 264 ppdpttpd
+F-H2-3 137 qodpttpd
+F-H2-4 128 eddpttpd
+F-H2-5 12 fqdpttpd
+F-H2-7 9 qqdpttpd
+F-H2-8 8 jjdpttpd
+F-H2-10 412 ddqpdpttpd
+F-H2-11 153 dcqpdpttpd
+F-H2-12 151 opqpdpttpd
+F-H2-13 148 dcpqdpttpd
+F-H2-14 43 oqqpdpttpd
+F-H2-15 22 deqpdpttpd
+F-H2-16 21 depqdpttpd
+F-H2-17 20 npqpdpttpd
+F-H2-18 18 ecpqdpttpd
+F-H2-19 14 ecqpdpttpd
+F-H2-20 11 jjqpdpttpd
+F-H2-21 10 ccqpdpttpd
+F-H2-22 7 eepqdpttpd
+F-H2-23 5 qnpqdpttpd
+F-H2-24 210 fqdpqppdttdd
+F-H2-25 49 qfdpqppdttdd
+F-H2-26 43 nqppdcdpttpd
+F-H2-27 28 cfdppqpdttdd
+F-H2-28 17 nqdpqppdttdd
+F-H2-29 13 oqdpqppdttdd
+F-H2-30 6 kqdpqppdttdd
+F-H2-31 3 cjdpqppdttdd
+F-H2-32 3 ncdppqpdttdd
+F-H2-33 257 ddppdpttpd
+F-H2-34 143 dcppdpttpd
+F-H2-35 33 edppdpttpd
+F-H2-36 32 nqppdpttpd
+F-H2-37 18 ecppdpttpd
+F-H2-38 6 eeppdpttpd
+F-H2-39 6 ccppdpttpd
+F-H2-40 5 jjppdpttpd
+F-H2-41 4 dfppdpttpd
+F-H2-42 100 cnfqdpqppdttdd
+F-H2-43 96 dnfqdpqppdttdd
+F-H2-44 55 ipfqdpqppdttdd
+F-H2-45 51 qhpqdpqfpdttdd
+F-H2-46 33 opfqdpqppdttdd
+F-H2-47 17 jpfqdpqppdttdd
+F-H2-48 11 pnpqdpqfpdttdd
+F-H2-49 8 djfqdpqppdttdd
+F-H2-50 8 dncnppdcdpttpd
+F-H2-51 6 djpqdpqfpdttdd
+F-H2-52 5 qopqdpqfpdttdd
+F-H2-53 3 kqfqdpqppdttdd
+F-H2-54 2 dqfqdpqppdttdd
+F-H2-55 2 qjpqdpqfpdttdd
+F-H2-56 2 mcpqdpqfpdttdd
+F-H2-57 2 eqfqdpqppdttdd
+F-H2-58 2 hpfqdpqppdttdd
+F-H2-59 2 nqfqdpqppdttdd
+F-H2-60 130 fqdppppdttdd
+F-H2-61 60 qnppdddpttpd
+F-H2-62 15 cndppppdttdd
+F-H2-63 4 cjdppppdttdd
+F-H2-64 3 gpdppppdttdd
+F-H2-65 3 dgdppppdttdd
+F-H2-66 2 jddppppdttdd
+F-H2-67 2 pjdppppdttdd
+F-H2-68 160 ddqodpttpd
+F-H2-69 55 dcqodpttpd
+F-H2-70 35 cdqodpttpd
+F-H2-71 18 qpoqdpttpd
+F-H2-72 14 opqodpttpd
+F-H2-73 8 deoqdpttpd
+F-H2-74 7 edoqdpttpd
+F-H2-75 6 ecqodpttpd
+F-H2-76 2 ccqodpttpd
+F-H2-77 2 ppqodpttpd
+F-H2-78 2 ceqodpttpd
+F-H2-79 2 eeqodpttpd
+F-H2-80 139 ppeddpttpd
+F-H2-81 41 cdopdpttpd
+F-H2-82 32 dcopdpttpd
+F-H2-83 17 cdeddpttpd
+F-H2-84 12 podedpttpd
+F-H2-85 8 ecpodpttpd
+F-H2-86 6 edpodpttpd
+F-H2-87 6 cepodpttpd
+F-H2-88 3 dfpodpttpd
+F-H2-89 3 qqdedpttpd
+F-H2-90 3 oodedpttpd
+F-H2-91 2 jppodpttpd
+F-H2-92 2 jjpodpttpd
+F-H2-93 76 dnfqdppppdttdd
+F-H2-94 66 ncppdpqfpdttdd
+F-H2-95 25 hqfqdppppdttdd
+F-H2-96 15 pippdpqfpdttdd
+F-H2-97 6 fpfqdppppdttdd
+F-H2-98 6 pjppdpqfpdttdd
+F-H2-99 3 qgddppncdpttpd
+F-H2-100 2 jpddppncdpttpd
+F-H2-101 2 jdppdpqfpdttdd
+F-H2-102 2 encnppdddpttpd
+F-H2-103 2 nqppdpqfpdttdd
+F-H2-104 73 eddppqpdttcd
+F-H2-105 38 qopqcddpttpd
+F-H2-106 17 fqdpqppdttdc
+F-H2-107 15 dfdpqppdttdc
+F-H2-108 10 cfdpqppdttdc
+F-H2-109 3 qfdpqppdttdc
+F-H2-110 2 qndppqpdttcd
+F-H2-111 37 dhdpdcdettpd
+F-H2-112 25 mqopqpdpttpd
+F-H2-113 25 cdopqpdpttpd
+F-H2-114 21 dddppqpottpd
+F-H2-115 14 dcopqpdpttpd
+F-H2-116 12 oqopqpdpttpd
+F-H2-117 11 ceopqpdpttpd
+F-H2-118 7 npdppqpottpd
+F-H2-119 6 ooopqpdpttpd
+F-H2-120 6 eddppqpottpd
+F-H2-121 5 ecopqpdpttpd
+F-H2-122 4 kpopqpdpttpd
+F-H2-123 3 fqopqpdpttpd
+F-H2-124 2 nqdppqpottpd
+F-H2-125 2 edopqpdpttpd
+F-H2-126 2 mpopqpdpttpd
+F-H2-127 54 dedppqpdttdc
+F-H2-128 41 cedppqpdttdc
+F-H2-129 21 fqdpqppdttcd
+F-H2-130 17 dfdppqpdttdc
+F-H2-131 6 fqdppqpdttdc
+F-H2-132 5 fcdpqppdttcd
+F-H2-133 58 ncppecdpttpd
+F-H2-134 35 fqdpqopdttdd
+F-H2-135 13 fcdpqopdttdd
+F-H2-136 11 cfdpqopdttdd
+F-H2-137 3 ncdpoqpdttdd
+F-H2-138 3 cjdpqopdttdd
+F-H2-139 3 cndpoqpdttdd
+F-H2-140 3 pqdpqopdttdd
+F-H2-141 2 npdpqopdttdd
+F-H2-142 2 oodpqopdttdd
+F-H2-143 50 qfdppopdttdd
+F-H2-144 32 cnppeddpttpd
+F-H2-145 17 fcdppopdttdd
+F-H2-146 14 cfdppopdttdd
+F-H2-147 7 pgdppopdttdd
+F-H2-148 3 qpdpoppdttdd
+F-H2-149 3 cjdppopdttdd
+F-H2-150 2 qfppdedpttpd
+F-H2-151 2 cjdpoppdttdd
+F-H2-152 2 qodpoppdttdd
+F-H2-153 48 eddppppdttcd
+F-H2-154 30 cedppppdttdc
+F-H2-155 14 dfdppppdttdc
+F-H2-156 14 fqdppppdttdc
+F-H2-157 11 fqdppppdttcd
+F-H2-158 8 cfdppppdttdc
+F-H2-159 2 cndppppdttdc
+F-H2-160 70 kqdpfqdnqppdttdd
+F-H2-161 10 fqdppqpdqfndttdd
+F-H2-162 7 pkdppqpdqfndttdd
+F-H2-163 6 kdppcddpncpfttpd
+F-H2-164 5 drdpfqdnqppdttdd
+F-H2-165 5 jpdpfqdnqppdttdd
+F-H2-166 3 lcdppqpdqfndttdd
+F-H2-167 65 kqdpfqcnqppdttdd
+F-H2-168 13 qfdpfqcnqppdttdd
+F-H2-169 9 rddppqpdqfddttnc
+F-H2-170 6 kpdpfqcnqppdttdd
+F-H2-171 5 jpdpfqcnqppdttdd
+F-H2-172 2 cfdppqpdqfddttnc
+F-H2-173 34 fcppdpcfpdttdd
+F-H2-174 23 npqnppdddpttpd
+F-H2-175 18 chppdpcfpdttdd
+F-H2-176 11 idppdpfcpdttdd
+F-H2-177 9 pjqnppdddpttpd
+F-H2-178 7 fdppdpfcpdttdd
+F-H2-179 3 jcppdpfcpdttdd
+F-H2-180 2 gcppdpcfpdttdd
+F-H2-181 37 jdkqdpfqdnqppdttdd
+F-H2-182 17 pjkqdpfqdnqppdttdd
+F-H2-183 12 cjkqdpfqdnqppdttdd
+F-H2-184 10 qjkqdpfqdnqppdttdd
+F-H2-185 3 djkqdpfqdnqppdttdd
+F-H2-186 3 mppqdpqkpdqfndttdd
+F-H2-187 3 drkqdpfqdnqppdttdd
+F-H2-188 41 jpdpfqdnpppdttdd
+F-H2-189 11 cnppdddpncpfttpd
+F-H2-190 6 pidppppdqfndttdd
+F-H2-191 6 bpppcnfpdddpttpd
+F-H2-192 5 icdppppdqfndttdd
+F-H2-193 5 qjdppppdqfndttdd
+F-H2-194 5 cldpfqdnpppdttdd
+F-H2-195 4 cfdppppdqfndttdd
+F-H2-196 2 kqdpfqdnpppdttdd
+F-H2-197 2 fcdppppdqfndttdd
+F-H2-198 27 fcqpdpcfpdttdd
+F-H2-199 24 hcpqdpfcpdttdd
+F-H2-200 15 pnnqppdcdpttpd
+F-H2-201 13 idpqdpfcpdttdd
+F-H2-202 7 popqdpfcpdttdd
+F-H2-203 4 jdpqdpfcpdttdd
+F-H2-204 2 fdpqdpfcpdttdd
+F-H2-205 2 npqpdpcfpdttdd
+F-H2-206 27 qjkqdpfqcnqppdttdd
+F-H2-207 25 djpqdpqkpdqfddttnc
+F-H2-208 11 pjkqdpfqcnqppdttdd
+F-H2-209 9 mppqdpqkpdqfddttnc
+F-H2-210 7 qkkqdpfqcnqppdttdd
+F-H2-211 3 opkqdpfqcnqppdttdd
+F-H2-212 2 qnkqdpfqcnqppdttdd
+F-H2-213 2 qgkqdpfqcnqppdttdd
+F-H2-214 33 hdpqdpedpdttcd
+F-H2-215 24 ceqpdpdepdttdc
+F-H2-216 15 gcpqdpedpdttcd
+F-H2-217 6 fdqpdpdepdttdc
+F-H2-218 4 oqqpdpdepdttdc
+F-H2-219 4 popqdpedpdttcd
+F-H2-220 2 eeqpdpdepdttdc
+F-H2-221 2 npqpdpdepdttdc
+F-H2-222 42 pfncppecdpttpd
+F-H2-223 33 cnoqdpfqpdttdd
+F-H2-224 3 jpoqdpfqpdttdd
+F-H2-225 3 ipoqdpfqpdttdd
+F-H2-226 2 pfqodpqfpdttdd
+F-H2-227 2 opqodpqfpdttdd
+F-H2-228 2 cmoqdpfqpdttdd
+F-H2-229 2 hqoqdpfqpdttdd
+F-H2-230 25 ndqpdpqfpdttdd
+F-H2-231 22 qfncppdcdpttpd
+F-H2-232 12 opqpdpqfpdttdd
+F-H2-233 8 qhqpdpqfpdttdd
+F-H2-234 4 ippqdpfqpdttdd
+F-H2-235 2 oqqpdpqfpdttdd
+F-H2-236 29 cepqdpdepdttdc
+F-H2-237 21 dhpqdpdepdttdc
+F-H2-238 12 cgpqdpdepdttdc
+F-H2-239 6 nppopqdcdpttpd
+F-H2-240 5 popqdpdepdttdc
+F-H2-241 5 qopqdpdepdttdc
+F-H2-242 26 pjdppppdqfddttnc
+F-H2-243 12 fqdppppdqfddttnc
+F-H2-244 6 rddppppdqfddttnc
+F-H2-245 6 cfdppppdqfddttnc
+F-H2-246 5 iqdpfqcnpppdttdd
+F-H2-247 3 ipdpfqcnpppdttdd
+F-H2-248 2 cndppppdqfddttnc
+F-H2-249 2 kqdpfqcnpppdttdd
+F-H2-250 2 qjdppppdqfddttnc
+F-H2-251 24 dhpqdpcepdttdc
+F-H2-252 11 deqpdpecpdttcd
+F-H2-253 10 popqdpcepdttdc
+F-H2-254 10 gcqpdpecpdttcd
+F-H2-255 5 dgpqdpcepdttdc
+F-H2-256 5 qopqdpcepdttdc
+F-H2-257 3 hcqpdpecpdttcd
+F-H2-258 2 qkqopqdcdpttpd
+F-H2-259 2 dipqdpcepdttdc
+F-H2-260 17 fohqfqdpqppdttdd
+F-H2-261 9 cnhqfqdpqppdttdd
+F-H2-262 8 cqhqfqdpqppdttdd
+F-H2-263 7 nqhqfqdpqppdttdd
+F-H2-264 7 dnhqfqdpqppdttdd
+F-H2-265 5 phdppqqhqfpdttdd
+F-H2-266 2 gohqfqdpqppdttdd
+F-H2-267 2 qfhqfqdpqppdttdd
+F-H2-268 2 cfhqfqdpqppdttdd
+F-H2-269 30 dhppdpdepdttdc
+F-H2-270 21 ecppdpedpdttcd
+F-H2-271 13 cgppdpdepdttdc
+F-H2-272 6 dfppdpedpdttcd
+F-H2-273 5 eeppdpedpdttcd
+F-H2-274 3 cfppdpedpdttcd
+F-H2-275 3 mpopqpdddpttpd
+F-H2-276 14 ddoqqpdpttpd
+F-H2-277 13 lpoqqpdpttpd
+F-H2-278 13 cdoqqpdpttpd
+F-H2-279 6 kqoqqpdpttpd
+F-H2-280 5 kpoqqpdpttpd
+F-H2-281 4 dcoqqpdpttpd
+F-H2-282 4 deoqqpdpttpd
+F-H2-283 3 mpoqqpdpttpd
+F-H2-284 3 mqoqqpdpttpd
+F-H2-285 2 eddpdccettpd
+F-H2-286 2 qfoqqpdpttpd
+F-H2-287 29 dnfqdpoppdttdd
+F-H2-288 25 ncpodpqfpdttdd
+F-H2-289 4 ipfqdpoppdttdd
+F-H2-290 3 pjpodpqfpdttdd
+F-H2-291 2 mcpodpqfpdttdd
+F-H2-292 2 djfqdpoppdttdd
+F-H2-293 2 pqpodpqfpdttdd
+F-H2-294 20 qnfqdpppdnjppdttdd
+F-H2-295 16 djppdppjpdqfndttdd
+F-H2-296 8 cjfqdpppdnjppdttdd
+F-H2-297 3 jdppdppjpdqfndttdd
+F-H2-298 25 dhqpdpcepdttdc
+F-H2-299 7 opqopqcddpttpd
+F-H2-300 5 edqopqcddpttpd
+F-H2-301 4 mqoqqpdcdpttpd
+F-H2-302 3 dgqpdpcepdttdc
+F-H2-303 3 ciqpdpcepdttdc
+F-H2-304 3 fdqpdpcepdttdc
+F-H2-305 2 oqqpdpcepdttdc
+F-H2-306 21 cnipfqdpqppdttdd
+F-H2-307 16 ofdppqpiqfpdttdd
+F-H2-308 5 kqipfqdpqppdttdd
+F-H2-309 5 nddppqpiqfpdttdd
+F-H2-310 3 nqipfqdpqppdttdd
+F-H2-311 3 cqipfqdpqppdttdd
+F-H2-312 17 dnfqdppopdttdd
+F-H2-313 14 fqcnppeddpttpd
+F-H2-314 8 ipfqdppopdttdd
+F-H2-315 4 clcnppeddpttpd
+F-H2-316 3 jpfqdppopdttdd
+F-H2-317 21 dedpqopdttdc
+F-H2-318 10 cedpqopdttdc
+F-H2-319 10 qfdpqopdttdc
+F-H2-320 4 qnpqcedpttpd
+F-H2-321 3 dfdpqopdttdc
+F-H2-322 2 fqdpqopdttdc
+F-H2-323 25 nppqdpdcpottpd
+F-H2-324 11 edqpopcddpttpd
+F-H2-325 8 qqqpopcddpttpd
+F-H2-326 2 cepqdpdcpottpd
+F-H2-327 2 oqpqdpdcpottpd
+F-H2-328 24 qfdpkqdnfqpdqpjdttdd
+F-H2-329 8 cfdpkqdnfqpdqpjdttdd
+F-H2-330 7 cidpkqdnfqpdqpjdttdd
+F-H2-331 5 lcdppqdjqkpdqfndttdd
+F-H2-332 2 jpdppqdjqkpdqfndttdd
+F-H2-333 14 ipdpoqdnfqpdttdd
+F-H2-334 14 jpdpoqdnfqpdttdd
+F-H2-335 8 cnppncdpecpfttpd
+F-H2-336 19 qjnqdpqppdttdd
+F-H2-337 8 qknqdpqppdttdd
+F-H2-338 8 djnqdpqppdttdd
+F-H2-339 7 jdnqdpqppdttdd
+F-H2-340 6 pjnqdpqppdttdd
+F-H2-341 15 dnfqdpqopdttdd
+F-H2-342 11 ncoqdpqfpdttdd
+F-H2-343 9 hqfqdpqopdttdd
+F-H2-344 3 ipfqdpqopdttdd
+F-H2-345 2 opfqdpqopdttdd
+F-H2-346 2 djfqdpqopdttdd
+F-H2-347 2 jpfqdpqopdttdd
+F-H2-348 11 qfdpppdettpd
+F-H2-349 11 pqdpddpottpd
+F-H2-350 9 qfdppppdtted
+F-H2-351 2 ncdpppdettpd
+F-H2-352 2 cjdppppdtted
+F-H2-353 2 cndpppdettpd
+F-H2-354 21 eddpoppdttcd
+F-H2-355 7 dfdppopdttdc
+F-H2-356 7 cedppopdttdc
+F-H2-357 2 cnpqdedpttpd
+F-H2-358 2 ncpqdedpttpd
+F-H2-359 16 fdpqdpcfpdttdd
+F-H2-360 6 hcqpdpfcpdttdd
+F-H2-361 6 djpqdpcfpdttdd
+F-H2-362 4 fcpqdpcfpdttdd
+F-H2-363 3 idqpdpfcpdttdd
+F-H2-364 3 deqnppdcdpttpd
+F-H2-365 2 qopqdpcfpdttdd
+F-H2-366 23 nppqdpddpottpd
+F-H2-367 6 oqpqdpddpottpd
+F-H2-368 6 qqqpopdddpttpd
+F-H2-369 5 fcpqdpddpottpd
+F-H2-370 3 pmqpopdddpttpd
+F-H2-371 14 pmqpoplpdpttpd
+F-H2-372 12 nopqdpplpottpd
+F-H2-373 4 ecdhdpdcdettpd
+F-H2-374 3 pnqpoplpdpttpd
+F-H2-375 2 mopqdpplpottpd
+F-H2-376 2 ddpqdpplpottpd
+F-H2-377 9 qnnqppdpttpd
+F-H2-378 6 pnnqppdpttpd
+F-H2-379 5 dddpppqnttpd
+F-H2-380 5 didpddcfttpd
+F-H2-381 4 lqnqppdpttpd
+F-H2-382 3 jpnqppdpttpd
+F-H2-383 2 dcdpppqnttpd
+F-H2-384 2 kqnqppdpttpd
+F-H2-385 17 pjdpqppdqfndttdd
+F-H2-386 9 ipdppqdnfqpdttdd
+F-H2-387 2 cldppqdnfqpdttdd
+F-H2-388 2 cnppncdpdcpfttpd
+F-H2-389 13 cnopfqdpqppdttdd
+F-H2-390 11 cgppcndpdcdettpd
+F-H2-391 11 lpopfqdpqppdttdd
+F-H2-392 18 dgdppqpdedhdttcd
+F-H2-393 5 gedpqpdhdepdttdc
+F-H2-394 3 cedppqpdedhdttcd
+F-H2-395 3 fddpqpdhdepdttdc
+F-H2-396 2 hddpqpdhdepdttdc
+F-H2-397 2 fedpqpdhdepdttdc
+F-H2-398 11 bddppppdcfddttfc
+F-H2-399 7 djdppppdcfddttfc
+F-H2-400 5 qfnqqnppdddpttpd
+F-H2-401 2 ckdppppdcfddttfc
+F-H2-402 2 fqdppppdcfddttfc
+F-H2-403 25 nqppdppjpdqfddttnc
+F-H2-404 6 djppdppjpdqfddttnc
+F-H2-405 2 jpppdppjpdqfddttnc
+F-H2-406 2 qjfqdpppcnjppdttdd
+F-H2-407 14 pnqpopdcdpttpd
+F-H2-408 7 opqpdpdcdettpd
+F-H2-409 4 qoqpopdcdpttpd
+F-H2-410 3 qqqpopdcdpttpd
+F-H2-411 3 oqqpdpdcdettpd
+F-H2-412 16 qqmqopqpdpttpd
+F-H2-413 14 onpqdpqmpottpd
+F-H2-414 3 ormqopqpdpttpd
+F-H2-415 12 ofdpppqhqfpdttdd
+F-H2-416 10 qcppdddpncpdttlc
+F-H2-417 4 cnhqfqdppppdttdd
+F-H2-418 2 phdpppqhqfpdttdd
+F-H2-419 14 ddjjdpttpd
+F-H2-420 5 qpjjdpttpd
+F-H2-421 2 ljjjdpttpd
+F-H2-422 9 qfdpfqdnoppdttdd
+F-H2-423 6 jpdpfqdnoppdttdd
+F-H2-424 4 pidppopdqfndttdd
+F-H2-425 3 jqdpfqdnoppdttdd
+F-H2-426 3 cfdppopdqfndttdd
+F-H2-427 3 rddppopdqfndttdd
+F-H2-428 22 dcdpqpdettpd
+F-H2-429 6 fqdpqpdettpd
+F-H2-430 4 qfdpqpdettpd
+F-H2-431 10 cnppncdpecqfttpd
+F-H2-432 9 ipdpoqcnfqpdttdd
+F-H2-433 5 pjdpqopdqfddttnc
+F-H2-434 12 dedpoqpdttdc
+F-H2-435 6 fddpqopdttcd
+F-H2-436 6 fcdpqopdttcd
+F-H2-437 5 qfdpqopdttcd
+F-H2-438 3 ecdpqopdttcd
+F-H2-439 2 fqdpqopdttcd
+F-H2-440 25 fqdppqdjqkpdqfddttnc
+F-H2-441 3 pjdpkqcnfqpdqpjdttdd
+F-H2-442 18 dhppdpcepdttdc
+F-H2-443 4 edppdpcepdttdc
+F-H2-444 4 fdppdpcepdttdc
+F-H2-446 2 dgppdpcepdttdc
+F-H2-447 2 cippdpcepdttdc
+F-H2-448 2 gcppdpecpdttcd
+F-H2-449 11 cnjqpqdpqkpdqfddttnc
+F-H2-450 7 jcdpkqcnfqqjqppdttdd
+F-H2-451 6 pldpkqcnfqqjqppdttdd
+F-H2-452 3 fcdpkqcnfqqjqppdttdd
+F-H2-453 2 pmdpkqcnfqqjqppdttdd
+F-H2-454 17 dcdppqdettpd
+F-H2-455 5 qfdppqdettpd
+F-H2-456 2 fqdppqdettpd
+F-H2-457 2 jcdppqdettpd
+F-H2-458 20 cfdppqcedepdttdc
+F-H2-459 7 dddppqcedepdttdc
+F-H2-460 14 ceqpdpdfpdttdc
+F-H2-461 5 opqpdpdfpdttdc
+F-H2-462 4 chqpdpdfpdttdc
+F-H2-463 3 efqpdpdfpdttdc
+F-H2-464 8 eddppopdttcd
+F-H2-465 7 dfdpoppdttdc
+F-H2-466 4 qopqeddpttpd
+F-H2-467 3 fqdppopdttcd
+F-H2-468 2 qfdppopdttcd
+F-H2-469 9 ccdppqpdfcddtthc
+F-H2-470 5 cfdppqpdfcddtthc
+F-H2-471 3 fddpqpchcfpdttdd
+F-H2-472 2 dcdppqpdfcddtthc
+F-H2-473 9 fedpppdhdepdttdc
+F-H2-474 7 gddpppdhdepdttdc
+F-H2-475 4 ecdpppdhdepdttdc
+F-H2-476 13 bddpqppdcfddttfc
+F-H2-477 3 djdpqppdcfddttfc
+F-H2-478 2 cjdpqppdcfddttfc
+F-H2-479 2 lcdppqcffcpdttdd
+F-H2-480 7 cnfqdpttpd
+F-H2-481 7 pfncdpttpd
+F-H2-482 4 ddqfdpttpd
+F-H2-483 4 qhqfdpttpd
+F-H2-484 3 ppfqdpttpd
+F-H2-485 9 ndkqdpfqdnqppdqfjdttdd
+F-H2-486 5 pikqdpfqdnqppdqfjdttdd
+F-H2-487 4 hqpqdpfqdjqkpdqfndttdd
+F-H2-488 4 jppqdpfqdjqkpdqfndttdd
+F-H2-489 8 pjppqnnpdddpttpd
+F-H2-490 7 dbdpppdffcpdttdd
+F-H2-491 3 ncdpppdffcpdttdd
+F-H2-492 2 hcdppppdcffdttdd
+F-H2-493 12 dnfqhqqpdpfopdttdd
+F-H2-494 26 cfdpqpcedepdttdc
+F-H2-495 3 dddpqpcedepdttdc
+F-H2-496 8 iphqfqdpqpdnfopdttdd
+F-H2-497 4 mfdppqqhqfpdofndttdd
+F-H2-498 3 kphqfqdpqpdnfopdttdd
+F-H2-499 2 kqhqfqdpqpdnfopdttdd
+F-H2-500 9 fddppqpdechdttcd
+F-H2-501 8 efdppqpdechdttcd
+F-H2-502 4 gddpqpdhcepdttdc
+F-H2-503 12 hqpqdpfqdjqkpdqfddttnc
+F-H2-504 4 ndkqdpfqcnqppdqfjdttdd
+F-H2-505 4 pikqdpfqcnqppdqfjdttdd
+F-H2-506 2 oekqdpfqcnqppdqfjdttdd
+F-H2-507 2 jppqdpfqdjqkpdqfddttnc
+F-H2-508 11 dhpodpdepdttdc
+F-H2-509 10 cepodpdepdttdc
+F-H2-510 5 gcopdpedpdttcd
+F-H2-511 2 fdpodpdepdttdc
+F-H2-512 7 fedppqdhcepdttdc
+F-H2-513 7 dfdppqdhcepdttdc
+F-H2-514 2 egdppqdhcepdttdc
+F-H2-515 2 dgdpqppdechdttcd
+F-H2-516 9 qjoqdpqppdttdd
+F-H2-517 6 kqpqdpqopdttdd
+F-H2-518 3 pjoqdpqppdttdd
+F-H2-519 3 jdoqdpqppdttdd
+F-H2-520 7 fqdppqcecfpddecdttdc
+F-H2-521 7 gddpqppdedcdfcecttdc
+F-H2-522 3 cndppqcecfpddecdttdc
+F-H2-523 3 dfdppqcecfpddecdttdc
+F-H2-524 2 gfdppqcecfpddecdttdc
+F-H2-525 15 cedppqdedcpdttfd
+F-H2-526 5 nqnppqdpdcpottpd
+F-H2-527 2 cnnppqdpdcpottpd
+F-H2-528 21 cdqpdpcfcedepdttdc
+F-H2-529 9 jdppncdpdcqfttpd
+F-H2-530 5 ipdppqcnfqpdttdd
+F-H2-531 3 drdppqcnfqpdttdd
+F-H2-532 2 fqdpqppdqfddttnc
+F-H2-533 6 jdpqdpfqdnjppdttdd
+F-H2-534 5 opqpdppjpdqfndttdd
+F-H2-535 3 qnpqdpfqdnjppdttdd
+F-H2-536 23 cdpqdpcfcedepdttdc
+F-H2-537 9 fqdpqpcecfpddecdttdc
+F-H2-538 6 ncdppqpdedcdfcecttdc
+F-H2-539 5 fddppqpdedcdfcecttdc
+F-H2-540 3 mppqnqoqopqpdcdpttpd
+F-H2-541 10 ceppdpdfpdttdc
+F-H2-542 4 fdppdpdfpdttdc
+F-H2-543 3 hcppdpfdpdttcd
+F-H2-544 2 nqppdpdfpdttdc
+F-H2-545 20 fpfqipqpdpcnpdttdd
+F-H2-546 4 ndpqdpqfpincpdttdd
+F-H2-547 2 eofqipqpdpcnpdttdd
+F-H2-548 9 hcpodpfcpdttdd
+F-H2-549 6 fdopdpcfpdttdd
+F-H2-550 4 jdpodpfcpdttdd
+F-H2-551 2 fcopdpcfpdttdd
+F-H2-552 7 qfdpfqdnpppdjpjdttdd
+F-H2-553 6 fcdpppdjpjpdqfndttdd
+F-H2-554 2 cidpfqdnpppdjpjdttdd
+F-H2-555 8 qldpfqqnppcnjppdttdd
+F-H2-556 4 kpnqppdppjpdqfddttnc
+F-H2-557 3 nqdpfqqnppcnjppdttdd
+F-H2-558 2 npdpfqqnppcnjppdttdd
+F-H2-559 2 kqnqppdppjpdqfddttnc
+F-H2-560 11 nqnppqdpddpottpd
+F-H2-561 7 oqopqpdpddpnttpd
+F-H2-562 7 dnfqdpqppdttcd
+F-H2-563 5 ncpqdpqfpdttdc
+F-H2-564 3 edcdqpncdpttpd
+F-H2-565 2 ipfqdpqppdttcd
+F-H2-566 2 hqfqdpqppdttcd
+F-H2-567 16 cdppdpcfpdttdc
+F-H2-568 5 chppdpcfpdttdc
+F-H2-569 7 ccdppppdfcddtthc
+F-H2-570 5 efdpppchcfpdttdd
+F-H2-571 4 dhdpppchcfpdttdd
+F-H2-572 2 fcdpppchcfpdttdd
+F-H2-573 12 fqdppopdqfddttnc
+F-H2-574 2 cfdppopdqfddttnc
+F-H2-575 2 drdpfqcnoppdttdd
+F-H2-576 2 jqdpfqcnoppdttdd
+F-H2-577 2 jpdpfqcnoppdttdd
+F-H2-578 6 qfdpppcettpd
+F-H2-579 5 cddppppdttec
+F-H2-580 4 dedppppdttec
+F-H2-581 2 cjdppppdttec
+F-H2-582 10 cnfqdpqppdttdc
+F-H2-583 6 dnfqdpqppdttdc
+F-H2-584 2 npfqdpqppdttdc
+F-H2-585 2 hqfqdpqppdttdc
+F-H2-586 8 ceqodpdepdttdc
+F-H2-587 6 dhqodpdepdttdc
+F-H2-588 4 cgqodpdepdttdc
+F-H2-589 3 dcpopqcedpttpd
+F-H2-590 10 dfdpedpdttcd
+F-H2-591 3 ddpqpodpttpd
+F-H2-592 2 mppqpodpttpd
+F-H2-593 5 edqpoqcddpttpd
+F-H2-594 4 cfqpdpcdpdttec
+F-H2-595 4 deqpdpcdpdttec
+F-H2-596 3 ecqpoqcddpttpd
+F-H2-597 4 jqppcddpncdjicpfttpd
+F-H2-598 4 cidpkqdnfqpjqppdttdd
+F-H2-599 3 fcdpkqdnfqpjqppdttdd
+F-H2-600 3 ncdpkqdnfqpjqppdttdd
+F-H2-601 2 pldpkqdnfqpjqppdttdd
+F-H2-602 2 fcjppqdpqkpdqfndttdd
+F-H2-603 6 pnqpoqdpttpd
+F-H2-604 4 fqqpoqdpttpd
+F-H2-605 3 dcpqqodpttpd
+F-H2-606 2 eddpcepdttdc
+F-H2-607 8 dfqodpfcpdttdd
+F-H2-608 5 hcqodpfcpdttdd
+F-H2-609 4 fcoqdpcfpdttdd
+F-H2-610 3 jdqodpfcpdttdd
+F-H2-611 3 idqodpfcpdttdd
+F-H2-612 14 ncdppqpjqfpdttdd
+F-H2-613 2 lqjpfqdpqppdttdd
+F-H2-614 2 ofdppqpjqfpdttdd
+F-H2-615 4 cdnpqpdpttpd
+F-H2-616 3 ddnpqpdpttpd
+F-H2-617 2 qodppqpnttpd
+F-H2-618 2 nonpqpdpttpd
+F-H2-619 2 pnnpqpdpttpd
+F-H2-620 2 qldppqpnttpd
+F-H2-621 9 fcpodpcfpdttdd
+F-H2-622 5 fdpodpcfpdttdd
+F-H2-623 3 chpodpcfpdttdd
+F-H2-624 2 pqpodpcfpdttdd
+F-H2-625 11 ddoodpttpd
+F-H2-626 4 dcoodpttpd
+F-H2-627 7 deppdpcdpdttec
+F-H2-628 5 cfqpoqdddpttpd
+F-H2-629 2 qmqpoqdddpttpd
+F-H2-630 2 qnqpoqdddpttpd
+F-H2-631 8 pmqpoplpcddpttpd
+F-H2-632 3 fedppqdhdepdttdc
+F-H2-633 3 dfdpqppdedhdttcd
+F-H2-634 7 qldpfqqnppdnjppdttdd
+F-H2-635 4 nqdpfqqnppdnjppdttdd
+F-H2-636 3 jpnqppdppjpdqfndttdd
+F-H2-637 2 dippjddpddpfnccfttpd
+F-H2-638 16 eepqdpdgpdedhdttcd
+F-H2-639 3 ddqpdpdedhgdpdttdc
+F-H2-640 18 fcdppppdedcdttec
+F-H2-641 6 ecqpdpfdpdttcd
+F-H2-642 3 oqqpdpfdpdttcd
+F-H2-643 3 dfqpdpfdpdttcd
+F-H2-644 2 hdqpdpfdpdttcd
+F-H2-645 2 efpqdpdfpdttdc
+F-H2-646 8 cddppqpdttec
+F-H2-647 6 fqdpqpcettpd
+F-H2-648 2 qfdpqpcettpd
+F-H2-649 2 eddpqpcettpd
+F-H2-650 9 pnqpopcedpttpd
+F-H2-651 2 edqpopcedpttpd
+F-H2-652 2 qqpqdpecpottpd
+F-H2-653 2 gdoqdpdcdettpd
+F-H2-654 5 qldpnqqjqppdttdd
+F-H2-655 4 ncdpnqqjqppdttdd
+F-H2-656 2 fcdpnqqjqppdttdd
+F-H2-657 10 cqipfqfpqpdpcnpdttdd
+F-H2-658 8 gpipfqfpqpdpcnpdttdd
+F-H2-659 4 dedpqpcedfpdttdc
+F-H2-660 4 cndpqpcedfpdttdc
+F-H2-661 3 fqdpqpcedfpdttdc
+F-H2-662 2 cfdpqpcedfpdttdc
+F-H2-663 6 dfdpppcecfpddecdttdc
+F-H2-664 4 ncdppppdedcdfcecttdc
+F-H2-665 4 fqdpppcecfpddecdttdc
+F-H2-666 4 gddppppdedcdfcecttdc
+F-H2-667 12 fpcnppdddpncpfttpd
+F-H2-668 2 occnppdddpncpfttpd
+F-H2-669 2 fpfqdppppdqfndttdd
+F-H2-670 20 dcppdpedpdfccdttec
+F-H2-671 4 opqodppjpdqfndttdd
+F-H2-672 3 jpjdppncdpecpfttpd
+F-H2-673 2 rdqodppjpdqfndttdd
+F-H2-674 2 cjoqdpfqdnjppdttdd
+F-H2-675 5 clppdpcnpdttdd
+F-H2-676 5 ncqfppdddpttpd
+F-H2-677 3 djppdpcnpdttdd
+F-H2-678 5 jpdpfqdnpopdttdd
+F-H2-679 3 ipdpfqdnpopdttdd
+F-H2-680 2 qfdpfqdnpopdttdd
+F-H2-681 6 qnppdpcjpdttdd
+F-H2-682 3 nqppdpcjpdttdd
+F-H2-683 2 cgppdpcjpdttdd
+F-H2-684 2 clppdpcjpdttdd
+F-H2-685 15 ndpqdpqfpiofpdttdd
+F-H2-686 3 ncpqdpqfpiofpdttdd
+F-H2-687 4 cnfqdppppdqfddttnc
+F-H2-688 3 hqfqdppppdqfddttnc
+F-H2-689 3 ndfqdpppcnqfpdttdd
+F-H2-690 2 pffqdpppcnqfpdttdd
+F-H2-691 3 icdpqpdeecpdttcd
+F-H2-692 3 nqdpqpdeecpdttcd
+F-H2-693 3 chdppqpdceedttdc
+F-H2-694 6 npqpoqlpdpttpd
+F-H2-695 5 nopqdpplqottpd
+F-H2-696 2 ddqpoqlpdpttpd
+F-H2-697 6 cfdppqpdfcidttdd
+F-H2-698 4 efdpqpdicfpdttdd
+F-H2-699 3 fddpqpdicfpdttdd
+F-H2-700 2 ccdppqpdfcidttdd
+F-H2-701 16 fedppqeedgpdedhdttcd
+F-H2-702 15 efpqdpdgeefepdedhdttcd
+F-H2-703 4 ncdpkqdnfqqjqppdttdd
+F-H2-704 4 fcdpkqdnfqqjqppdttdd
+F-H2-705 3 mpjqpqdpqkpdqfndttdd
+F-H2-706 2 cidpkqdnfqqjqppdttdd
+F-H2-707 9 dnfqdppppdttcd
+F-H2-708 3 ncppdpqfpdttdc
+F-H2-709 2 lcddqpncdpttpd
+F-H2-710 3 hpfqhqqpdpipdnfopdttdd
+F-H2-711 2 iqfqhqqpdpipdnfopdttdd
+F-H2-712 8 ccqpdpcfpdbdddttfc
+F-H2-713 3 gcpqdpfccfdbpdttdd
+F-H2-714 2 popqdpfccfdbpdttdd
+F-H2-715 3 jdfqdpqpdnjppdttdd
+F-H2-716 2 jcpqdppjpdqfndttdd
+F-H2-717 8 ncfqdpqpcnqfpdttdd
+F-H2-718 3 ndfqdpqpcnqfpdttdd
+F-H2-719 2 edcnppcddpncqfttpd
+F-H2-720 2 ippqdpfqpdqfddttnc
+F-H2-721 4 djdpqppdcffdttdd
+F-H2-722 4 dbdppqdffcpdttdd
+F-H2-723 2 cnppnqdpdcpnttpd
+F-H2-724 6 chqodpcfpdttdd
+F-H2-725 4 djqodpcfpdttdd
+F-H2-726 2 fcqodpcfpdttdd
+F-H2-727 2 fdqodpcfpdttdd
+F-H2-728 5 pqqqmqopqpdpttpd
+F-H2-729 4 rqqqmqopqpdpttpd
+F-H2-730 3 ppqqpqdpqmpottpd
+F-H2-731 9 fddppppdechdttcd
+F-H2-732 6 fedpppdhcepdttdc
+F-H2-733 6 ncdppppiqfpdttdd
+F-H2-734 5 neppdddpncpdttkd
+F-H2-735 3 cqipfqdppppdttdd
+F-H2-736 7 cfjdppncdpdcqfttpd
+F-H2-737 2 pjpqdpfqcnjppdttdd
+F-H2-738 2 djqpdppjpdqfddttnc
+F-H2-739 7 jpdpfqdnqopdttdd
+F-H2-740 2 ipdpfqdnqopdttdd
+F-H2-741 2 qfdpfqdnqopdttdd
+F-H2-742 2 rddpoqpdqfndttdd
+F-H2-743 2 djpqdppkpdqfndttdd
+F-H2-744 6 cddpqppdttec
+F-H2-745 6 fqdpqppdttec
+F-H2-746 2 dedpqppdttec
+F-H2-747 10 qonppqdpcdpottpd
+F-H2-748 2 qnopqpdpdcpnttpd
+F-H2-749 5 jpdpfqcnpopdttdd
+F-H2-750 2 fqdpoppdqfddttnc
+F-H2-751 5 pooqdpfqdnippdttdd
+F-H2-752 3 jdqodppipdqfndttdd
+F-H2-753 2 jpqodppipdqfndttdd
+F-H2-754 2 jdoqdpfqdnippdttdd
+F-H2-755 11 cfpqdpdgeffeeeedpdddhdttcd
+F-H2-756 3 edqpdpefdhdefegdeeddpdttdc
+F-H2-757 2 ecqpdpefdhdefegdeeddpdttdc
+F-H2-758 15 dddppqefdgeefepdedhdttcd
+F-H2-759 6 cnfqdppppdttdc
+F-H2-760 4 dnfqdppppdttdc
+F-H2-761 2 hqfqdppppdttdc
+F-H2-762 5 cidppppdcfcdttdc
+F-H2-763 3 jddppppdfccdttdc
+F-H2-764 7 dcdppodettpd
+F-H2-765 4 qfdppodettpd
+F-H2-766 8 qqpqpodpcdqmttpd
+F-H2-767 6 fedppqpdedcdttgc
+F-H2-768 6 npdppqpoqmonttpd
+F-H2-769 2 omdppqpoqmonttpd
+F-H2-770 2 qpdppqpoqmonttpd
+F-H2-771 2 qmopmqdpqpnottpd
+F-H2-772 8 cfpqdpcededcpdttfd
+F-H2-773 4 ddpqdpcededcpdttfd
+F-H2-774 3 cdpqdpcededcpdttfd
+F-H2-775 10 pjdpkqdnfqpdqpndqfjdttdd
+F-H2-776 4 ipdppqdnfqdjqkpdqfndttdd
+F-H2-777 6 bddppqpdcffdttdd
+F-H2-778 6 jddpqpdffcpdttdd
+F-H2-779 2 ncdppqpdcffdttdd
+F-H2-780 2 cjdppqpdcffdttdd
+F-H2-781 2 jpnqppjjdpttpd
+F-H2-782 2 pnnqppjjdpttpd
+F-H2-783 9 qfdpkqdnfqcjqppdttdd
+F-H2-784 3 cfdppqpdqkndqfddttjc
+F-H2-785 5 fqcnppncdpecqfttpd
+F-H2-786 3 ipfqdpqopdqfddttnc
+F-H2-787 3 fpcnppncdpecqfttpd
+F-H2-788 5 ncdpkqcnfqpjqppdttdd
+F-H2-789 4 jcdpkqcnfqpjqppdttdd
+F-H2-790 3 cfjppqdpqkpdqfddttnc
+F-H2-791 8 ndpqdpqfpjncpdttdd
+F-H2-792 6 pfpqdpqfpjncpdttdd
+F-H2-793 8 ddnpdpttpd
+F-H2-794 2 cdnpdpttpd
+F-H2-795 10 ooopqpdplppmttpd
+F-H2-796 2 ppopqpdplppmttpd
+F-H2-797 4 fpcnppncdpecpfttpd
+F-H2-798 2 ipfqdpqopdqfndttdd
+F-H2-799 6 ndqodpqfpdttdc
+F-H2-800 5 qfncqpecdpttpd
+F-H2-801 8 dnfqopqpdpcnpdttdd
+F-H2-802 3 fpfqopqpdpcnpdttdd
+F-H2-803 11 rddppqpiqfpdofndttdd
+F-H2-804 2 pldppqpiqfpdofndttdd
+F-H2-805 8 dddpqpjjttpd
+F-H2-806 3 cddppqjjttpd
+F-H2-807 3 dcdppqjjttpd
+F-H2-808 6 cdqpdpcfpdttdc
+F-H2-809 3 chqpdpcfpdttdc
+F-H2-810 2 opqpdpcfpdttdc
+F-H2-811 6 hohqfqhpqpdpipdnfopdttdd
+F-H2-812 4 iqhqfqhpqpdpipiohodnfopdttdd
+F-H2-813 4 cfdppppdfcidttdd
+F-H2-814 3 efdpppdicfpdttdd
+F-H2-815 2 fddpppdicfpdttdd
+F-H2-816 2 ccdpppdicfpdttdd
+F-H2-817 6 lqnpfqdpqppdttdd
+F-H2-818 4 ncdppqpnqfpdttdd
+F-H2-819 2 pnnpfqdpqppdttdd
+F-H2-820 7 iphqfqdpppdnfopdttdd
+F-H2-821 3 jqhqfqdpppdnfopdttdd
+F-H2-822 2 fmhqfqdpppdnfopdttdd
+F-H2-823 4 dhoqdpdepdttdc
+F-H2-824 4 qopopqecdpttpd
+F-H2-825 2 gcqodpedpdttcd
+F-H2-826 5 cnfqdppopdqfddttnc
+F-H2-827 4 hqfqdppopdqfddttnc
+F-H2-828 2 ipfqdppopdqfddttnc
+F-H2-829 2 iofqhqqphpipdphodnfopdttdd
+F-H2-830 4 ndfqdpppdnjppdqfjdttdd
+F-H2-831 2 hqfqdpppdjpjpdqfndttdd
+F-H2-832 8 fdqpdpdfdhcepdttdc
+F-H2-833 5 pqopqodpttpd
+F-H2-834 4 mqopqodpttpd
+F-H2-835 4 eedpecdettpd
+F-H2-836 8 efdpppcgdepdttdc
+F-H2-837 5 ccdpppcgdepdttdc
+F-H2-838 9 pcddppqcdpncpdttlc
+F-H2-839 3 pcppdpqfqhqcpdttdd
+F-H2-840 12 nqoqopqpdpttpd
+F-H2-841 8 ndppdpqfqhofpdttdd
+F-H2-842 9 cddppqpdfcddcchcttdc
+F-H2-843 10 ebpqdpcddefcpdccdddbhcttdc
+F-H2-844 7 pnpqdpqppoqoqnttpd
+F-H2-845 3 mppqnqoqopqpdpttpd
+F-H2-846 7 ckppdpcipdcfcdttdc
+F-H2-847 2 cnppdpcipdcfcdttdc
+F-H2-848 2 qnppdpcipdcfcdttdc
+F-H2-849 5 fcdpppdjcfpdttdd
+F-H2-850 3 npppqndpddpjttpd
+F-H2-851 2 nnppnqjpdddpttpd
+F-H2-852 10 ecpqdpcddefcpdccdddbhccbdctteb
+F-H2-853 9 dbdppqdecdpdfcddcchcttdc
+F-H2-854 5 pqpodpdcdettpd
+F-H2-855 4 fdpodpdcdettpd
+F-H2-856 2 gdpodpdcdettpd
+F-H2-857 4 qmdppqpodcdettpd
+F-H2-858 2 dhdppqpodcdettpd
+F-H2-859 2 cedppqpodcdettpd
+F-H2-860 2 ncopqpdpcdpdtted
+F-H2-861 2 ooopqpdpcdpdtted
+F-H2-862 2 fqdpoopdttdd
+F-H2-863 2 cfdpoopdttdd
+F-H2-864 8 dhqodpcepdttdc
+F-H2-865 2 qmqopqcedpttpd
+F-H2-866 8 ddqqdpttpd
+F-H2-867 3 fqdpoqpdqfddttnc
+F-H2-868 2 qkdpoqpdqfddttnc
+F-H2-869 8 fohqpqdpfqdjqkpdqfddttnc
+F-H2-870 2 nddpkqcnfqqhqppdqfjdttdd
+F-H2-871 10 depqdpcdpdfcddcchcttdc
+F-H2-872 6 qmopqpdplponttpd
+F-H2-873 5 nqdppqpoplnottpd
+F-H2-874 11 pqnqoqopqpdpttpd
+F-H2-875 9 cbdppqdecdpdfcddcchcdbdctteb
+F-H2-876 4 qldpoqqjqppdttdd
+F-H2-877 2 ncdpoqqjqppdttdd
+F-H2-878 2 jcdpoqqjqppdttdd
+F-H2-879 8 popqdpcfdecdpdfcddcchcdbeccbdctteb
+F-H2-880 5 ndppdpqfdettpd
+F-H2-881 3 pfppdpqfdettpd
+F-H2-882 10 dcpqdpfcpdccddtthc
+F-H2-883 9 cfdppqdecdpdfcddcchcdbeccbdctteb
+F-H2-884 6 mqpqnpnqdpddpottpd
+F-H2-885 6 mppqnpnqdpddpottpd
+F-H2-886 6 efdppqcgdepdttdc
+F-H2-887 4 ccdpqppdedcdttgc
+F-H2-888 2 bedppqcgdepdttdc
+F-H2-889 4 gddppodhdepdttdc
+F-H2-890 3 ecdppodhdepdttdc
+F-H2-891 2 pnpqdpfqdnippdttdd
+F-H2-892 2 jdpqdpfqdnippdttdd
+F-H2-893 5 pldppqpocepdttdc
+F-H2-894 2 qmdppqpocepdttdc
+F-H2-895 8 eqdrercrhqfqdqcqdpqpdocppdttdd
+F-H2-896 4 fdppdpdgpdttdd
+F-H2-897 2 djppdpdgpdttdd
+F-H2-898 8 dofqhqcqdqqpdpcppdttdd
+F-H2-899 8 drhqfqdqcqdpqpdocppdttdd
+F-H2-900 5 opqodppipdqfddttnc
+F-H2-901 3 pjoqdpfqcnippdttdd
+F-H2-902 2 qpoqdpfqcnippdttdd
+F-H2-903 8 gpfpfqdppppdttdd
+F-H2-904 2 iriqhqfqhpqpdpipiohodnfopdttdd
+F-H2-905 2 qfdpppcedfpdttdc
+F-H2-906 2 dedpppcedfpdttdc
+F-H2-907 2 cndpppcedfpdttdc
+F-H2-908 2 cfdpppcedfpdttdc
+F-H2-909 5 onpqdpqmpoqfpdttdd
+F-H2-910 4 qqmqopfqdpqppdttdd
+F-H2-911 7 gcppdpfedhdepdttdc
+F-H2-912 5 fcppdpfedhdepdttdc
+F-H2-913 5 fqdpqppdttcc
+F-H2-914 5 qndppqpdttcc
+F-H2-915 8 dqfqhqcqdpqppdttdd
+F-H2-916 3 pnqpoqdcdpttpd
+F-H2-917 2 edqpdpdccettpd
+F-H2-918 2 deqpoqdcdpttpd
+F-H2-919 3 jpdpfqdnpppdqfndttdd
+F-H2-920 2 qhppcnfpdddpncpfttpd
+F-H2-921 6 ffdppqefdgcffeeeedpdddhdttcd
+F-H2-922 5 ccdpqpdheffedeeegdpdddfcttdc
+F-H2-923 4 fqdppqdjpkpdqfndttdd
+F-H2-924 4 ecdpqodfcdpdtted
+F-H2-925 3 ncopqpdpcepnttpd
+F-H2-926 2 nqnppqdpecpottpd
+F-H2-927 8 crerdrhqfqdqcqdpqpdocppdttdd
+F-H2-928 3 fofqfpppdpgppdttdd
+F-H2-929 2 gofqfpppdpgppdttdd
+F-H2-930 9 fpfqhqqpdpcnpdttdd
+F-H2-931 2 dnfqhqqpdpcnpdttdd
+F-H2-932 4 onfqopqpdplppdttdd
+F-H2-933 4 pmfqopqpdplppdttdd
+F-H2-934 2 oqpqdpplpoqfpdttdd
+F-H2-935 8 erdrhqfqdqcqdpqpdocppdttdd
+F-H2-936 8 cphqfqdqcqdpqppdttdd
+F-H2-937 7 fppqjqcndpqkpdqfddttnc
+F-H2-938 2 clpqjqcndpqkpdqfddttnc
+F-H2-939 4 nppqpodpdcdettpd
+F-H2-940 2 qodppqpodepdttdc
+F-H2-941 8 cnerdrhqcreqfqdqcqdpqpdocppdttdd
+F-H2-942 4 pldppqpofqpdttdd
+F-H2-943 3 mqopqpdpqfpdttdd
+F-H2-944 2 qfppncdpdcdettpd
+F-H2-945 8 cpfqipcqfpqpdpcnpdttdd
+F-H2-946 3 eqfqipcqfpqpdpcnpdttdd
+F-H2-947 5 opdrercrhqfqeqcqdqqpdpcpdocnpdttdd
+F-H2-948 4 oqdrercrhqfqeqcqdqqpdpcpdocnpdttdd
+F-H2-949 4 hdpodpedpdttcd
+F-H2-950 3 gcpodpedpdttcd
+F-H2-951 2 ecpodpedpdttcd
+F-H2-952 9 ircqdripfqdpqpdnfopdttdd
+F-H2-953 3 ceopdpdfpdttdc
+F-H2-954 3 fdopdpdfpdttdc
+F-H2-955 2 pqpodpfdpdttcd
+F-H2-956 3 qndrercrhqfqeqcqdqppdpcpdocnpdttdd
+F-H2-957 3 nqdrercrhqfqeqcqdqppdpcpdocnpdttdd
+F-H2-958 5 ncqpdpqfpdedcdfcecttdc
+F-H2-959 3 cmpqdpfqcecfpddecdttdc
+F-H2-960 9 peqdppdddpqcpdncpcttlc
+F-H2-961 8 dcqpdpfcpdttcd
+F-H2-962 2 opqpdpfcpdttcd
+F-H2-963 8 qbppqddpddpeqcpdncpcpblcttob
+F-H2-964 8 qfppqddpddpeqcpdncpcqbocpblcttob
+F-H2-965 9 dmppcndpdcdnttpd
+F-H2-966 5 ccppdpfcdfdbpdttdd
+F-H2-967 2 cgppdpcfpdbdfdttdd
+F-H2-968 2 chppdpcfpdbdfdttdd
+F-H2-969 9 ocqdppdddpqcpencpdqbpcpblcttob
+F-H2-970 9 obqdppdddpqcpencpdpbpcttlc
+F-H2-971 11 qcpqdpqfpiofpdrdndttdd
+F-H2-972 6 ccppdpcfpdbdddttfc
+F-H2-973 2 qnppdpcfpdbdddttfc
+F-H2-974 2 hcppdpfccfdbpdttdd
+F-H2-975 6 pfcnppncfpdcdpttpd
+F-H2-976 4 encnppdmdpdcdnttpd
+F-H2-977 2 eqfqfpqpdpgppdttdd
+F-H2-978 2 gofqfpqpdpgppdttdd
+F-H2-979 4 fedppopdfcddtthc
+F-H2-980 2 fddpopchcfpdttdd
+F-H2-981 2 cfdppopdfcddtthc
+F-H2-982 2 ccdppopdfcddtthc
+F-H2-983 10 dmopfqdpqpdncnpdttdd
+F-H2-984 5 ndkqdpfqdnqpcjqfpdttdd
+F-H2-985 2 mckqdpfqdnqpcjqfpdttdd
+F-H2-986 10 noqpoplpdpoopmttpd
+F-H2-987 2 djkqdpfqdnqppdpjndqfjdttdd
+F-H2-988 8 qdppdddpqcpdncpcttlc
+F-H2-989 8 pbppqddpddpeqcpdncpcttlc
+F-H2-990 7 enfqopqpdpcndndmpdttdd
+F-H2-991 4 ccdppqpdcffdfcddtthc
+F-H2-992 2 dgdpqpchcfdffcpdttdd
+F-H2-993 8 fdpqdpcfpdfcddtthc
+F-H2-994 6 qfdpppeettpd
+F-H2-995 8 cidpqppdcfddbdfcttcc
+F-H2-996 2 qhfqdpopdnqfpdttdd
+F-H2-997 2 djcnppeddpncpfttpd
+F-H2-998 2 cnfqdppopdqfndttdd
+F-H2-999 2 dnfqdppopdqfndttdd
+F-H2-1000 4 ncdppppjqfpdttdd
+F-H2-1001 2 qcdppppjqfpdttdd
+F-H2-1002 2 ofdppppjqfpdttdd
+F-H2-1003 5 qnpqnpqodpcdpottpd
+F-H2-1004 2 ddpqdpcddfecpdtted
+F-H2-1005 3 qhqnnqpjppdddpttpd
+F-H2-1006 2 qnppdpdjpdcfddttfc
+F-H2-1007 2 qnppdpjdcffcpdttdd
+F-H2-1008 7 opqpdpcipdcfddbdfcttcc
+F-H2-1009 6 cfdppocedepdttdc
+F-H2-1010 2 dddppocedepdttdc
+F-H2-1011 8 ppqpoplpdpoonoonpmttpd
+F-H2-1012 2 qqqpoplpdpoonoonpmttpd
+F-H2-1013 5 qkdppqpdqfcdttnc
+F-H2-1014 3 nhdppqoiqiqhpiphohogqfpdofndttdd
+F-H2-1015 5 coopfqdpqpencndndmpdttdd
+F-H2-1016 3 cpopfqdpqpencndndmpdttdd
+F-H2-1017 5 qcpqdpqfpdrdddttnc
+F-H2-1018 2 qmdpnqqkqppdttdd
+F-H2-1019 2 qfdpnqqkqppdttdd
+F-H2-1020 3 cddpqpeettpd
+F-H2-1021 2 ecdpqpeettpd
+F-H2-1022 7 ebppdpdedhecpdttdc
+F-H2-1023 2 opoqpqpodpddplttpd
+F-H2-1024 4 dedppopdttec
+F-H2-1025 2 cddppopdttec
+F-H2-1026 4 pjdpfqcnqppdqfddttnc
+F-H2-1027 4 kqdpfqcnqppdqfddttnc
+F-H2-1028 4 qfdpqqpdttdd
+F-H2-1029 3 fcdpqqpdttdd
+F-H2-1030 4 qhqnpppjnpdddpttpd
+F-H2-1031 2 cmppdpdjpdcffdttdd
+F-H2-1032 2 ngdppqoiqiqhpiphohognhpfqfpdofndttdd
+F-H2-1033 8 ooopqppmlpcddpttpd
+F-H2-1034 2 ddpqdpdedhgdpdttdc
+F-H2-1035 3 iqdqfqdpqppdttdd
+F-H2-1036 2 ncdppqqdqfpdttdd
+F-H2-1037 4 eedpqppdeccdttgc
+F-H2-1038 6 cqdrdpfqdnpppdttdd
+F-H2-1039 3 cndpfqdjqppdttdd
+F-H2-1040 3 dndpfqdjqppdttdd
+F-H2-1041 9 onopqpdplpnooopmttpd
+F-H2-1042 2 mpkqpqdpqkpdqfddttnc
+F-H2-1043 2 qidpkqcnfqqkqppdttdd
+F-H2-1044 2 pomppqdpqkpdqfddttnc
+F-H2-1045 2 kpmppqdpqkpdqfddttnc
+F-H2-1046 2 podpkqcnfqpmqppdttdd
+F-H2-1047 2 jpmppqdpqkpdqfddttnc
+F-H2-1048 4 qfdpqodettpd
+F-H2-1049 3 qfdpoqpdtted
+F-H2-1050 2 dcdpqodettpd
+F-H2-1051 6 prppnqqndpttpd
+F-H2-1052 5 bddpqpdhffgeeffedeeegdpdddfcccecttdc
+F-H2-1053 4 cbdpqpdhffgeeffedeeegdpdddfcccecttdc
+F-H2-1054 4 ecdfdpedpdttcd
+F-H2-1055 3 qnopqppndpttpd
+F-H2-1056 2 ppdedpfdpdttdc
+F-H2-1057 4 ncppdpqfpdtted
+F-H2-1058 3 kddddpncpottpd
+F-H2-1059 3 dnfqdpppdettpd
+F-H2-1060 4 dcdpoqdettpd
+F-H2-1061 6 dfppdpfdpdechdttcd
+F-H2-1062 4 rqpqqonppndpcdplttpd
+F-H2-1063 2 cjdpqpdhdfpdcefdttdc
+F-H2-1064 7 gddppppdfcfdttdd
+F-H2-1065 2 dedppppdqfndttdc
+F-H2-1066 2 cnqpdddpncpfttpd
+F-H2-1067 2 jpdpfqdnpppdttcd
+F-H2-1068 3 kqoqfqdpqppdttdd
+F-H2-1069 2 ncdppqqoqfpdttdd
+F-H2-1070 2 pldppqqoqfpdttdd
+F-H2-1071 4 jcpqdpripiqfpdofndrdddttqc
+F-H2-1072 2 opircqdripfqdpqpdnfopdttdd
+F-H2-1073 4 cfdppqpofcpdttdd
+F-H2-1074 3 fqdppopdcfddttfc
+F-H2-1075 2 djdppopdcfddttfc
+F-H2-1076 2 bddppopdcfddttfc
+F-H2-1077 5 mqopqpdpcipdcfddbdfcttcc
+F-H2-1078 2 pnopqpdpcipdcfddbdfcttcc
+F-H2-1079 5 cqhqfqfpqpdpcnpdttdd
+F-H2-1080 4 qfdpnqpdqpjdttdd
+F-H2-1081 2 cfdpnqpdqpjdttdd
+F-H2-1082 5 qfdppnpdttdd
+F-H2-1083 3 fdpqdpdfdhcepdttdc
+F-H2-1084 2 dcqpdpfdpdechdttcd
+F-H2-1085 3 cnhqfqdpqopdttdd
+F-H2-1086 3 fohqfqdpqopdttdd
+F-H2-1087 4 gcppdpefcgdepdttdc
+F-H2-1088 3 egppdpefcgdepdttdc
+F-H2-1089 5 jopqjqlpdpqkpdqfddttnc
+F-H2-1090 2 jdkqdpfqcnqpqjplpdttdd
+F-H2-1091 2 popqjqlpdpqkpdqfddttnc
+F-H2-1092 5 qqlqnqppdppjpdqfndttdd
+F-H2-1093 6 qmdppqpocfdecdpdfcddcchcdbeccbdctteb
+F-H2-1094 2 lpopqpdpcfchbdcefcbedcpdccedbcddttcd
+F-H2-1095 6 qqfqdpppqnjpcnqlpdttdd
+F-H2-1096 2 ccdppqchcfpdttdd
+F-H2-1097 2 fcdppqchcfpdttdd
+F-H2-1098 2 mqopqpdpcdpdttec
+F-H2-1099 6 cnfqdpqpcecfpddecdttdc
+F-H2-1100 4 kqdpfqdnqppdttcd
+F-H2-1101 6 dcppdpfcpdccddtthc
+F-H2-1102 2 cdppdpfcpdccddtthc
+F-H2-1103 5 chkqdpfqdnqppdcfjdttdd
+F-H2-1104 3 cjkqdpfqdnqppdcfjdttdd
+F-H2-1105 3 jdfqdpjpdnqopdttdd
+F-H2-1106 2 jdcnppdjfpecdpttpd
+F-H2-1107 2 rhdppqoiqiqhpiphohpgnhogngpfqfpdofndttdd
+F-H2-1108 4 feppdpgdpdfcfdttdd
+F-H2-1109 2 egppdpdgdfcfpdttdd
+F-H2-1110 4 lpopqpdpdcdettpd
+F-H2-1111 2 fqopqpdpdcdettpd
+F-H2-1112 3 dfdpqodhcepdttdc
+F-H2-1113 2 fedpqodhcepdttdc
+F-H2-1114 3 foipfqdppopdttdd
+F-H2-1115 3 hoipfqdppopdttdd
+F-H2-1116 7 ecdppqcedepdddcdttdc
+F-H2-1117 3 qfpqdpedpdnccdfcecttdc
+F-H2-1118 2 fdpqdpedpdnccdfcecttdc
+F-H2-1119 4 nppqdpedpottpd
+F-H2-1120 7 rqqqqpopcddpttpd
+F-H2-1121 6 cfqpdpgdpdedcdfcecttdc
+F-H2-1122 3 fqdppopdtted
+F-H2-1123 6 qrqqpqdpnppottpd
+F-H2-1124 3 fohqpqdpfqpdttdd
+F-H2-1125 2 qcdpqpqhqfpdttdd
+F-H2-1126 5 pnqpopecdpttpd
+F-H2-1127 3 qfdpkqdnfqdjqppdttdd
+F-H2-1128 3 jcdpkqdnfqdjqppdttdd
+F-H2-1129 8 onopqpnolppmdpcdoottpd
+F-H2-1130 3 cepodpdfpdttdc
+F-H2-1131 3 cqipfqfpqpdpgpfocnpdttdd
+F-H2-1132 3 qedppqpipgpfqfofncpdttdd
+F-H2-1133 2 dqipfqfpqpdpgpfocnpdttdd
+F-H2-1134 3 pqfqdpjpcnpopdttdd
+F-H2-1135 2 jdfqdpjpcnpopdttdd
+F-H2-1136 4 cnppjddpddqjncpfttpd
+F-H2-1137 2 fcdpfqdnppcjjppdttdd
+F-H2-1138 5 cbqpdpdecgccpdttdc
+F-H2-1139 2 cdqpdpdecgccpdttdc
+F-H2-1140 8 dnpqhqfqdpfodjqkpdqfddttnc
+F-H2-1141 2 fdppdpddjjttpd
+F-H2-1142 2 cfppdpddjjttpd
+F-H2-1143 3 jddpqodffcpdttdd
+F-H2-1144 7 dfpqdpcecfcddedcpdttfd
+F-H2-1145 5 fpnqhqfqdpqppdttdd
+F-H2-1146 2 jqpqdpqnqhqfpdttdd
+F-H2-1147 2 qhdpncpfttpd
+F-H2-1148 8 pqrqqqmqopqpdpttpd
+F-H2-1149 4 ccpqdpdeceddpdeccdttdc
+F-H2-1150 8 nepqdpqfpjmdpdncndttdd
+F-H2-1151 2 dgdppocecfpddecdttdc
+F-H2-1152 2 dfdppocecfpddecdttdc
+F-H2-1153 7 dddpppjjttpd
+F-H2-1154 3 qmqqrqpqmqopqpdpttpd
+F-H2-1155 2 orqqqrqppqdpqmpottpd
+F-H2-1156 3 qpdpfqcnttpd
+F-H2-1157 6 noqpoplppmdpcdoottpd
+F-H2-1158 3 ppqpoplpnodppmoocdonttpd
+F-H2-1159 2 qqqpoplpnodppmoocdonttpd
+F-H2-1160 5 dqipfqfpcqdpqpcpcnpdttdd
+F-H2-1161 3 cidpqppdceedttdc
+F-H2-1162 3 icdpqppdfccdttdc
+F-H2-1163 2 djdppqpdcfcdttdc
+F-H2-1164 8 cddppqcfcededcpdttfd
+F-H2-1165 5 cfdpqocedepdttdc
+F-H2-1166 3 dddpoqpdedcdttec
+F-H2-1167 4 iqcqdrdpfqdnpppdttdd
+F-H2-1168 7 cpfqhqcqfpqpdpcnpdttdd
+F-H2-1169 7 iphqpqdpfqdnfodjqkpdqfddttnc
+F-H2-1170 5 qcdppqpjqfnemdpdncndttdd
+F-H2-1171 3 cpjpfqdpqpencndndmpdttdd
+F-H2-1172 8 mddppqpjqfpdncndttdd
+F-H2-1173 8 fofqipqpfpgpdpcnpdttdd
+F-H2-1174 7 fpfqhqqpdpdnpdttdd
+F-H2-1175 3 qpdppqqnfqcnjppdttdd
+F-H2-1176 3 deppjddpncqfdccfttpd
+F-H2-1177 2 foippqdpfqpdttdd
+F-H2-1178 2 cnippqdpfqpdttdd
+F-H2-1179 3 fqdpqpdjpjpdqfndttdd
+F-H2-1180 2 qidpoqqkqppdttdd
+F-H2-1181 2 fqkqpqdpqopdttdd
+F-H2-1182 4 opqpdpddjjttpd
+F-H2-1183 7 cdpqdpdeceddpdttdc
+F-H2-1184 8 qqpqdpnppottpd
+F-H2-1185 4 ppoqopqpdpddpnttpd
+F-H2-1186 4 nqoqopqpdpddpnttpd
+F-H2-1187 5 qfdpnqdjqppdttdd
+F-H2-1188 3 fcdpnqdjqppdttdd
+F-H2-1189 7 qnppqpoplpdpoonoonpmttpd
+F-H2-1190 8 cdpodpcfcedepdttdc
+F-H2-1191 7 cgpqdpefpdechdttcd
+F-H2-1192 6 qidppqpdqfddrdqcttnc
+F-H2-1193 3 lperdrhqcreqfqdqcqopqpdpcpdocnpdttdd
+F-H2-1194 2 oqerdrhqcreqfqdqcqopqpdpcpdocnpdttdd
+F-H2-1195 4 qqprppnqqndpttpd
+F-H2-1196 3 ddprppnqqndpttpd
+F-H2-1197 3 olqpoplpdpqmonttpd
+F-H2-1198 3 fqdppppdpjndqfjdttdd
+F-H2-1199 2 qnppcnjpdjfpdddpttpd
+F-H2-1200 4 epfqhqdqfpcqdpqpcpcnpdttdd
+F-H2-1201 3 eqfqhqdqfpcqdpqpcpcnpdttdd
+F-H2-1202 3 dddpdhdedcpdttec
+F-H2-1203 2 ebdpdhdedcpdttec
+F-H2-1204 7 eqfqipdqfpcqdpqpcpcnpdttdd
+F-H2-1205 3 djjqpqfpcndpqkpdqfddttnc
+F-H2-1206 6 ecdpppcedcpdtted
+F-H2-1207 4 qqpqdpqmpoiccffcpddbddttcc
+F-H2-1208 2 onpqdpqmpoiccffcpddbddttcc
+F-H2-1209 7 qpqrqqpqdpnppottpd
+F-H2-1210 2 cfdppqdnfqdjjppdqkndqfjdttdd
+F-H2-1211 2 cfdpkqdnfqdjqppdpjndqfjdttdd
+F-H2-1212 3 qjkqdpqppdttdd
+F-H2-1213 2 jdkqdpqppdttdd
+F-H2-1214 4 fqdpqppdfdcdttec
+F-H2-1215 2 eddpqppdfdcdttec
+F-H2-1216 3 cnfqdpqppdttec
+F-H2-1217 2 dnfqdpqppdttec
+F-H2-1218 3 icoqqpdpcdpdttec
+F-H2-1219 2 ncoqqpdpcdpdttec
+F-H2-1220 5 fqdpppdjpjpdqfddttnc
+F-H2-1221 4 ndppdpqfpincpdttdd
+F-H2-1222 2 ndqfppdddpncpdttkd
+F-H2-1223 4 pjpqdpnqpoqpqnqopnttpd
+F-H2-1224 3 cjcedpcddffccfdcdettpd
+F-H2-1225 2 cgjqppcddpnccjicqfttpd
+F-H2-1226 2 hckqdpfqcnqpqjjcpdttdd
+F-H2-1227 2 djpqdppkpdqfddttnc
+F-H2-1228 2 qjfqdpqpcnkppdttdd
+F-H2-1229 2 pmfqdpqpcnkppdttdd
+F-H2-1230 2 jddppodffcpdttdd
+F-H2-1231 2 jppqdpqipdqfddrdqcttnc
+F-H2-1232 2 jddrcqiqdpfqcnqppdttdd
+F-H2-1233 2 qhpqdpqfdettpd
+F-H2-1234 5 ffefdpcfdgeefehdpdcdedttdd
+F-H2-1235 2 qqqppplpopoodpqnnoonpmttpd
+F-H2-1236 2 ipfqdpqpdettpd
+F-H2-1237 4 hpfqhqppdpipdnfopdttdd
+F-H2-1238 2 iqfqhqppdpipdnfopdttdd
+F-H2-1239 4 hedpppdhfepddegcttdc
+F-H2-1240 3 kqrqqqqppqrooppndpttpd
+F-H2-1241 3 qlqrqqorqppqdpnppottpd
+F-H2-1242 4 dqhqfqfpcqdpqpcpcnpdttdd
+F-H2-1243 5 cddppppdfcddcchcttdc
+F-H2-1244 5 freqeripfqfpdqepcqdpqpcpcnpdttdd
+F-H2-1245 6 cekqdpfqdnqpckcipdcfjdttdd
+F-H2-1246 2 nqdpppqncjpdttdd
+F-H2-1247 3 egpqdpefcgdepdttdc
+F-H2-1248 3 fdpqdpefcgdepdttdc
+F-H2-1249 5 ecqodpfdpdttcd
+F-H2-1250 2 hcqodpfdpdttcd
+F-H2-1251 7 roqqrqpqqpopcddpttpd
+F-H2-1252 5 dhpodpcepdttdc
+F-H2-1253 6 orqqqrqppqdpnppottpd
+F-H2-1254 2 cndqfqdppppdttdd
+F-H2-1255 2 qidpppqdqfpdttdd
+F-H2-1256 2 drdpfqdnppdjpjpdqfndttdd
+F-H2-1257 2 pjdpfqdnpppdjpndqfjdttdd
+F-H2-1258 4 qkpqqnqpcddpttpd
+F-H2-1259 2 djdpqppdcfcdttdc
+F-H2-1260 2 djfqcnppncdpecqfttpd
+F-H2-1261 3 prppnqpndpttpd
+F-H2-1262 2 pjppdpnpqnttpd
+F-H2-1263 7 cfdpkqdnfqckqppdcijdttdd
+F-H2-1264 3 hcppdppjdjqfpdfcndttdd
+F-H2-1265 2 idppdppjdjqfpdfcndttdd
+F-H2-1266 3 ojnqdpqpqjqlpdttdd
+F-H2-1267 2 jdnqdpqpqjqlpdttdd
+F-H2-1268 5 eeppdpdedhgdpdttdc
+F-H2-1269 3 rnnqpqopoqnpqpdpcdpnttpd
+F-H2-1270 2 icnqpqopoqnpqpdpcdpnttpd
+F-H2-1271 5 gphqfqfpqpdpdnpdttdd
+F-H2-1272 2 qcdppqqhqfpfndpdttdd
+F-H2-1273 3 gcqpdpefcgdepdttdc
+F-H2-1274 2 gepqdpfepdedcdttgc
+F-H2-1275 3 nqppdpddqnttpd
+F-H2-1276 3 djppcnfpncdpecpfttpd
+F-H2-1277 7 epereqfqipdqfpcqdpqpcpcnpdttdd
+F-H2-1278 3 iqpqhqfqdpipdnfodjqkpdqfddttnc
+F-H2-1279 3 hppqhqfqdpipdnfodjqkpdqfddttnc
+F-H2-1280 5 deppdpcdpdfcddcchcttdc
+F-H2-1281 4 pjdpkqdnfqcjqppdqfndttdd
+F-H2-1282 2 pjdpfqdnqppdjpjdttdd
+F-H2-1283 6 nqdppqpoqpqnqopnttpd
+F-H2-1284 2 ohdpppogpgpfqfpdttdd
+F-H2-1285 2 epfpfqdpppgogppdttdd
+F-H2-1286 4 cqdrdpfqdnqppdttdd
+F-H2-1287 4 cjdrcqiqdpfqdnpppdttdd
+F-H2-1288 2 qndrcqiqdpfqdnpppdttdd
+F-H2-1289 3 eddpppdhdepdecdctteb
+F-H2-1290 4 fohqfqppdddpttpd
+F-H2-1291 3 dnfqdpqpcettpd
+F-H2-1292 2 qhpqdpqfpdttec
+F-H2-1293 4 gcpqdpfedhcepdttdc
+F-H2-1294 4 qmopqpdpqnpnddpmttpd
+F-H2-1295 3 qonppqmpnqdpddpottpd
+F-H2-1296 6 kqrqqqqppqroopcddpttpd
+F-H2-1297 7 pqrqqqqpopcddpttpd
+F-H2-1298 2 fqqpdpcncedfpdttdc
+F-H2-1299 5 fdkqdpfqdnqpckcicedfpdcfjdttdd
+F-H2-1300 5 cidppppdcfddbdfcttcc
+F-H2-1301 5 ereqfqipdqfpcqdpqpcpcnpdttdd
+F-H2-1302 2 djpodppgpdttdd
+F-H2-1303 3 jpdppqdnfqdjpkpdqfndttdd
+F-H2-1304 4 fbppdpdedhedpdecdctteb
+F-H2-1305 3 nqoqoroppqpodpddplttpd
+F-H2-1306 6 ckkqdpfqdnqppdcijdttdd
+F-H2-1307 7 dfdpkqdnfqckqpcecipdcfjdttdd
+F-H2-1308 2 efdpqochcfpdttdd
+F-H2-1309 4 fdpqdpcfpdfcidttdd
+F-H2-1310 4 gddpqodhdepdttdc
+F-H2-1311 2 qfdppqcgefpdechdttcd
+F-H2-1312 6 ccdppppddefdttdc
+F-H2-1313 4 nrlqqqqppqppnqopdppjpdqfndttdd
+F-H2-1314 2 nqppdpcipdcffdbdddttcc
+F-H2-1315 5 qqpqponpdcdpttpd
+F-H2-1316 3 gcqpdpgedhdepdttdc
+F-H2-1317 2 fcqpdpgedhdepdttdc
+F-H2-1318 5 ecppdpcddefcpdccdddbhccbdctteb
+F-H2-1319 4 rqqqqpopdddpttpd
+F-H2-1320 5 cgqpdpdgchcfdffcpdttdd
+F-H2-1321 4 ecqpdpefdhdefegdeeddpdccfcttdc
+F-H2-1322 5 ebppdpcddefcpdccdddbhcttdc
+F-H2-1323 4 ncqodpqfpdttcd
+F-H2-1324 2 ndqodpqfpdttcd
+F-H2-1325 6 pqqqfqdpppqnjpcnqlpdttdd
+F-H2-1326 2 jdppdpedpdnccdfcecttdc
+F-H2-1327 4 efppdpfeeeedpdttcd
+F-H2-1328 4 nppqopoqdpddqottpd
+F-H2-1329 2 gdppdpeccedcpdtted
+F-H2-1330 4 roopqpdpddqottpd
+F-H2-1331 2 dffqdpppcnfcpdttdd
+F-H2-1332 2 chppdpqfpdcfddttnc
+F-H2-1333 2 qmopmqdpfqnoqppdttdd
+F-H2-1334 5 opqqlqpqqpnqppdppjpdqfndttdd
+F-H2-1335 2 ccdpqpchdgcgcfdffcpdttdd
+F-H2-1336 2 pjfqdpjpdnpopdttdd
+F-H2-1337 2 djppdppipdqfndttdd
+F-H2-1338 3 prqpqqlpppqoopoodpqnnoonnnompmttpd
+F-H2-1339 2 rqqpqqlpppqoopoodpqnnoonnnompmttpd
+F-H2-1340 2 kqdpfqdnqppdqfndttdd
+F-H2-1341 2 jdppcnfpncdpdcpfttpd
+F-H2-1342 2 npfqdpqpcnpjpdqfddttnc
+F-H2-1343 5 cfdpppdecdpdfcddcchcdbeccbdctteb
+F-H2-1344 3 pjnqdpfqqnppdnjppdttdd
+F-H2-1345 3 prppnqqndppjpdqfndttdd
+F-H2-1346 4 nqppdpqjpdqfndttdd
+F-H2-1347 2 ccpqdpfcdfdbpdttdd
+F-H2-1348 2 hcpqdpfcdfdbpdttdd
+F-H2-1349 2 fqdppnpdqfndttdd
+F-H2-1350 2 gpdppnpdqfndttdd
+F-H2-1351 6 cddppppddefdccdcttcb
+F-H2-1352 3 opoqqppndpttpd
+F-H2-1353 2 oqnppqqodpttpd
+F-H2-1354 5 fedpppeeedpdttcd
+F-H2-1355 2 cgpodpdepdttec
+F-H2-1356 2 cdpodpdepdttec
+F-H2-1357 4 lcqpdpjddffcpdttdd
+F-H2-1358 2 deqnpppjnpdcdpttpd
+F-H2-1359 3 fqdpqopdqfndttdc
+F-H2-1360 5 qpqqlqnqppdppjpdqfndttdd
+F-H2-1361 2 kqoqqpdpedpdttcd
+F-H2-1362 2 lpoqqpdpedpdttcd
+F-H2-1363 4 qcppdpqfpdrdddttnc
+F-H2-1364 3 fcdppqdjcfpdttdd
+F-H2-1365 2 ccdppqdjcfpdttdd
+F-H2-1366 3 dkdpppdhfepdcegcttdc
+F-H2-1367 2 cndpppdhfepdcegcttdc
+F-H2-1368 3 dgdpppdidhchcfpdttdd
+F-H2-1369 3 ojoqdpqpqjqlpdttdd
+F-H2-1370 3 ndppdpqfcettpd
+F-H2-1371 2 cnfqdppppdttec
+F-H2-1372 6 cbdpppdffdpdechdttcd
+F-H2-1373 3 efdpqpdgcepdttdc
+F-H2-1374 3 mppqnpnqdpdcpottpd
+F-H2-1375 3 cgqpdpcfdfcdpdtted
+F-H2-1376 6 ebppdpdepdcdfdccdcttcb
+F-H2-1377 5 oqpqmqnqnpmpdpddpottpd
+F-H2-1378 5 fcppdpdfcecfpddecdttdc
+F-H2-1379 5 kcdpqpcfgdpdedcdfcecttdc
+F-H2-1380 2 qqppnqkpdpttpd
+F-H2-1381 2 onppdppkqnttpd
+F-H2-1382 3 qniqdpfqcnpppdttdd
+F-H2-1383 2 djppdpqipdqfddttnc
+F-H2-1384 5 chdppppddefdcddcccebttcb
+F-H2-1385 5 geqpdpffdheffedeeegdpdddfcttdc
+F-H2-1386 5 cbdpppdecdpdfcddcchcdbdctteb
+F-H2-1387 5 dgdpfqcnqpcecfpddecdttdc
+F-H2-1388 4 eddpeeefdcdettpd
+F-H2-1389 2 onopqpdpoonottpd
+F-H2-1390 3 jdfqdpopdnjppdttdd
+F-H2-1391 2 jcpodppjpdqfndttdd
+F-H2-1392 6 qppqqqfqdpppqnjpcnqlpdttdd
+F-H2-1393 4 jpdppqdnfqdjqkpdqfddttnc
+F-H2-1394 2 pidpkqcnfqpdqpndqfjdttdd
+F-H2-1395 3 dedpqopdttec
+F-H2-1396 6 pfnqdpqpqjncpdttdd
+F-H2-1397 3 mcqpdpgdcfedpdkccdfcecttdc
+F-H2-1398 5 ccdpqppddefdttdc
+F-H2-1399 2 pqqodpcjpdttdd
+F-H2-1400 4 qqqpnpdddpttpd
+F-H2-1401 5 qnppdpcfdecdpdfcddcchcdbeccbdctteb
+F-H2-1402 3 dcqodpfcpdttcd
+F-H2-1403 6 ncdppqdjqfpdttdd
+F-H2-1404 5 mpmqpqnpnqdpddpottpd
+F-H2-1405 2 pjdpkqdnfqckqpcecipddfjdcffdttdd
+F-H2-1406 2 qfdpkqdnfqckqpcecipddfjdcffdttdd
+F-H2-1407 4 dippdpdhchcfpdttdd
+F-H2-1408 3 kcqpdpicpdfccdttdc
+F-H2-1409 2 ckkqdpfqdnqpqjcipdttdd
+F-H2-1410 3 ncqnnqqfppdddpttpd
+F-H2-1411 2 drdpfqcnpppdttdc
+F-H2-1412 2 pjdppppdqfcdttnc
+F-H2-1413 2 dfpodpcdpdttec
+F-H2-1414 3 kqdpfqdnqppdttdc
+F-H2-1415 4 jddpnqqjqppfncpdttdd
+F-H2-1416 2 mpdppqqoplpnttpd
+F-H2-1417 2 oooqqpnplpdpttpd
+F-H2-1418 5 ccpqdpcfpdbdfdttdd
+F-H2-1419 2 djpqdpfqdnjppdqkndqfjdttdd
+F-H2-1420 2 dnppdpgppdttdd
+F-H2-1421 3 cnqqdddpttpd
+F-H2-1422 2 dddppppdttcc
+F-H2-1423 2 dedpoopdttdc
+F-H2-1424 5 jqrqpqqonppndpddplttpd
+F-H2-1425 4 qqpqdpqmpocfdecdpdfcddcchcdbeccbdctteb
+F-H2-1426 2 onpqdpqmpocfdecdpdfcddcchcdbeccbdctteb
+F-H2-1427 3 ohdppqpiphqhqfpdttdd
+F-H2-1428 2 pgdppqpiphqhqfpdttdd
+F-H2-1429 5 ofpqdppgpjqfpfncpdttdd
+F-H2-1430 6 cbppdpdepdccfdttdc
+F-H2-1431 4 qhnqdpqppdqfjdttdd
+F-H2-1432 5 lqpqjqfqiqkphqjphpipdphodnfodjqkpdqfddttnc
+F-H2-1433 3 cnpqdpfqpdttdc
+F-H2-1434 2 cnqqrqpqqpkqroopcddpttpd
+F-H2-1435 2 pnqqrqpqqpkqroopcddpttpd
+F-H2-1436 2 qmdppqpoedpdttcd
+F-H2-1437 2 ppkqoqqpdpttpd
+F-H2-1438 2 qqkqoqqpdpttpd
+F-H2-1439 2 jcpqdppipdqfndttdd
+F-H2-1440 2 pippdpqfeettpd
+F-H2-1441 5 pqlqqqqpnqppdppjpdqfndttdd
+F-H2-1442 6 poqqpqqpfqdpppqnjpcnqlpdttdd
+F-H2-1443 5 dbdpppdecdpdfcddcchcttdc
+F-H2-1444 2 jpdpfqdnpppdtted
+F-H2-1445 3 qqppnqkpdppjpdqfddttnc
+F-H2-1446 2 pnppnqkpdppjpdqfddttnc
+F-H2-1447 6 gcppdpfedhcepdttdc
+F-H2-1448 3 dnfqdpppdjpjpdqfddttnc
+F-H2-1449 5 ndpndpqfpdttdd
+F-H2-1450 4 lopqdpnqpoplnottpd
+F-H2-1451 2 qqqpoplpdpqnonttpd
+F-H2-1452 5 eofqdpqppdcnjdttdd
+F-H2-1453 6 pgdppqpjqfpfncpdttdd
+F-H2-1454 5 pipqdpphqhqfpdttdd
+F-H2-1455 6 noqpopoodpttpd
+F-H2-1456 4 rnpqqqfqqpppdpjpqnpocnqlpdttdd
+F-H2-1457 2 jdpqdpfqdnipdjqkpdqfndttdd
+F-H2-1458 2 dfppdpcfdifcpdttdd
+F-H2-1459 2 qqpqdpnppoqmonttpd
+F-H2-1460 2 plpqdpnppoqmonttpd
+F-H2-1461 3 fdppdpcfdjfcpdttdd
+F-H2-1462 2 eeppdpcfpdfcjdttdd
+F-H2-1463 3 qkdppqpdqfncttdc
+F-H2-1464 5 icdpppdffcpddbddttcc
+F-H2-1465 2 dcdppocettpd
+F-H2-1466 2 fqdpoppdttec
+F-H2-1467 5 kcppdpqfpdicndttdd
+F-H2-1468 3 ccdpppchcfpdttdc
+F-H2-1469 4 qnppdpcipdcfddbdfcttcc
+F-H2-1470 3 cdppdpcfchccpdttdc
+F-H2-1471 2 mqqpoqkpdpttpd
+F-H2-1472 3 ddqpdpdfcedepdttdc
+F-H2-1473 2 cdqpdpdfcedepdttdc
+F-H2-1474 3 lpoqmqmpqpdpttpd
+F-H2-1475 3 cbppdpdecgccpdttdc
+F-H2-1476 2 cdppdpdecgccpdttdc
+F-H2-1477 4 cpfqopqpdpcoencndndmpdttdd
+F-H2-1478 2 pjdpkqdnfqdjqppdqfndttdd
+F-H2-1479 4 nqppdpqipdqfddrdqcttnc
+F-H2-1480 2 jcqpdpffdhefgedefegdeeddpdbdfcccecttdc
+F-H2-1481 2 jdqpdpffdhefgedefegdeeddpdbdfcccecttdc
+F-H2-1482 3 fpkqipfqdpqppdttdd
+F-H2-1483 2 jcdpqpcffcpdttdd
+F-H2-1484 2 cjppdpdhdidgchcfpdttdd
+F-H2-1485 4 opnroqpqmqnqnpmpdpddpottpd
+F-H2-1486 5 fdppdpefchcfpdttdd
+F-H2-1487 5 kpjqpqiqfqhqjphpipdphodnfodjqkpdqfddttnc
+F-H2-1488 2 lqjqppcddpncdjicpfttpd
+F-H2-1489 3 lpoqqpdedpttpd
+F-H2-1490 4 pnpqnpqpdpqopocdqnttpd
+F-H2-1491 5 qidppppdqfddrdqcttnc
+F-H2-1492 5 oqpqopqodpttpd
+F-H2-1493 5 qpnppqdpqopocdqnttpd
+F-H2-1494 3 nopqdpfqpoplpdttdd
+F-H2-1495 5 egdpqpcgdepdcdgcccdcttcb
+F-H2-1496 2 jckqdpfqdnqpcjpjpdqfndttdd
+F-H2-1497 2 fcqodpcddfecpdtted
+F-H2-1498 2 dcqodpcddfecpdtted
+F-H2-1499 4 ofdpkqdnfqpiqppdqfjdttdd
+F-H2-1500 2 pbppnedpddpfncpdttkd
+F-H2-1501 2 fmipfqdpppdnfopdttdd
+F-H2-1502 2 fofqfpppdpgpgoeppdttdd
+F-H2-1503 2 ncdpqopdfdcdttec
+F-H2-1504 4 lckqdpfqcnqppjncpdttdd
+F-H2-1505 2 pnoqmqnpqpmplpdpttpd
+F-H2-1506 3 qidppopdqfndrdddttqc
+F-H2-1507 3 ecdpoqdhdepdttdc
+F-H2-1508 2 pifqdpppdnjpcjqfpdttdd
+F-H2-1509 2 ccdpqopdfcddtthc
+F-H2-1510 2 fedpqopdfcddtthc
+F-H2-1511 3 rqqqpqppmqopqpdpttpd
+F-H2-1512 2 qoqqpqppqpdpqmpottpd
+F-H2-1513 2 depqdpegdhcepdttdc
+F-H2-1514 4 qfhqnqfpfqdpqppdttdd
+F-H2-1515 2 cnjqpqdplpjoqkpdqfddttnc
+F-H2-1516 3 qlcqdrdpiqqnfqcnpppdttdd
+F-H2-1517 3 jcpodpqipdqfndrdddttqc
+F-H2-1518 5 pfneppdddpncpdttkd
+F-H2-1519 5 qrqqpqponpdcdpttpd
+F-H2-1520 2 qjkqdpfqcnpopdttdd
+F-H2-1521 4 ceppdpfeefedeeddpdttcd
+F-H2-1522 2 pjkqdpfqcnqppdttdc
+F-H2-1523 2 cndpqocecfpddecdttdc
+F-H2-1524 5 cddpqpcgdepdccdcttcb
+F-H2-1525 5 efdpppdhdeeegdpdttdc
+F-H2-1526 2 gcdpqppdecgdttcd
+F-H2-1527 2 fedpqppdecgdttcd
+F-H2-1528 2 lqprppnqpndpttpd
+F-H2-1529 2 jcpqdpcipdcffdbdddttcc
+F-H2-1530 2 opqpdpicdffcpddbddttcc
+F-H2-1531 2 ccdppqdnfqdjippdqkndqfjdttdd
+F-H2-1532 2 oomqoqqpdcdpttpd
+F-H2-1533 2 nqdpqpcgcepdttdc
+F-H2-1534 3 deqpdpcedhgdpdttdc
+F-H2-1535 4 fcdppppdqfndicddttkc
+F-H2-1536 3 cifqdpppdnclpdttdd
+F-H2-1537 2 jppqdppjpdqfddttnc
+F-H2-1538 2 qhnqdpqpdjqfpdttdd
+F-H2-1539 2 ndnqdpqpdjqfpdttdd
+F-H2-1540 2 djpqdpdgegffeffecfedeeddceccpdbchdttcd
+F-H2-1541 2 opqpdpffdhefgedefegdeeddpdccfccbecttdc
+F-H2-1542 3 oonqppdpddqnttpd
+F-H2-1543 2 qnopqpdpecpnttpd
+F-H2-1544 2 mpopqodppipdqfddttnc
+F-H2-1545 2 pqopqodppipdqfddttnc
+F-H2-1546 5 ebqpdpdepdcdfdccdcttcb
+F-H2-1547 3 ndqpdpqfdettpd
+F-H2-1548 2 eofqfpeqdpppgogpfoeppdttdd
+F-H2-1549 3 ccpqdpcedecdpddcfdttdd
+F-H2-1550 3 rdppdpphpiohqhqfqgpfpdttdd
+F-H2-1551 5 qcpodpqfpdrdndttdd
+F-H2-1552 5 gqfqhqqpfpgpdpdnpdttdd
+F-H2-1553 4 qoqqqppplpopoodpqnnoonnnompmttpd
+F-H2-1554 2 qpdppqqnttpd
+F-H2-1555 3 oknqdpqpqkqmpdttdd
+F-H2-1556 4 orqqqrqppqponpdcdpttpd
+F-H2-1557 5 hcnqdpqpqjjdpfncpdttdd
+F-H2-1558 3 qnppqpoplpnodppmoocdonttpd
+F-H2-1559 2 eqfpfqdpppgogpfoeppdttdd
+F-H2-1560 5 cbqpdpdepdccfdttdc
+F-H2-1561 2 didpppchefpdcffdttdd
+F-H2-1562 3 fqqodpcnpdttdd
+F-H2-1563 3 fcppdpefdhdefegdeeddpdttdc
+F-H2-1564 2 dqfpfqdpeqgoppfogpeoeppdttdd
+F-H2-1565 5 ccegdpefdgcfffeefehdpdcdedttdd
+F-H2-1566 4 iqcqdrdpfqdnqppdttdd
+F-H2-1567 2 mpmqoqqpdpttpd
+F-H2-1568 5 pppqqqmqopqpdpttpd
+F-H2-1569 2 npmqoqqpmplpdpttpd
+F-H2-1570 3 qnppdpchpddefdcddcccebttcb
+F-H2-1571 3 molqpqjqfqiqkphqjphpipdphodnfodjqkpdqfddttnc
+F-H2-1572 2 lplqpqjqfqiqkphqjphpipdphodnfodjqkpdqfddttnc
+F-H2-1573 2 cndpppcedfpdcfcddefcttdc
+F-H2-1574 2 jcdpppcffdpdedcdfcecttdc
+F-H2-1575 5 geqpdpffdheffedeeegdpdddfcccecttdc
+F-H2-1576 4 nroqpqmqnqnpmpdpddpottpd
+F-H2-1577 3 ccdpppeffeeeedceddpdttcd
+F-H2-1578 2 hphqpqdpfqdjqkpdqfndttdd
+F-H2-1579 2 pfdppppiphqhohqgqfpdttdd
+F-H2-1580 4 lpopqpdppjpdqfndttdd
+F-H2-1581 5 cddpqppddefdccdcttcb
+F-H2-1582 2 cedpppjjdcdettpd
+F-H2-1583 2 mqopqpdpddjjttpd
+F-H2-1584 3 eepqdpdfpdedhdttcd
+F-H2-1585 5 cdqodpcfcedepdttdc
+F-H2-1586 2 cfdpnqqjqppfjdpdncddtthc
+F-H2-1587 2 qcdpnqqjqppfjdpdncddtthc
+F-H2-1588 2 ecdpppfegdpdfcfdttdd
+F-H2-1589 2 dcdpppfegdpdfcfdttdd
+F-H2-1590 2 efdppopdedhdttcd
+F-H2-1591 2 dgdppopdedhdttcd
+F-H2-1592 3 cnfqdpqppdttcc
+F-H2-1593 4 ccdppqpdcfidfcfdttdd
+F-H2-1594 3 coppcndpdmendcdnttpd
+F-H2-1595 4 hedpppdhfepddefcttdc
+F-H2-1596 5 cidppqpdcffdbdddttcc
+F-H2-1597 2 qpppqodpttpd
+F-H2-1598 5 cddppqdecepddcfdttdd
+F-H2-1599 4 oepqdpqfpnncpdttdd
+F-H2-1600 3 cfdppqpoddpdttfc
+F-H2-1601 4 cqdpfqeoqppdcnjdttdd
+F-H2-1602 4 idppdphedhfepddegcttdc
+F-H2-1603 2 fqpodpcnpdttdd
+F-H2-1604 3 qgppdpphpiohqhqfpdttdd
+F-H2-1605 2 fedppodhcepdttdc
+F-H2-1606 4 rrrqqqmqpqqpopqmdpttpd
+F-H2-1607 5 feppdpefdhdeeegdpdttdc
+F-H2-1608 2 mqopqodppjpdqfndttdd
+F-H2-1609 5 egdpefdgcfffeefehdpdcdedttdd
+F-H2-1610 2 jpdpfqdnpppdttdc
+F-H2-1611 3 gddpqppdqfcdedncfcecttdc
+F-H2-1612 5 dddpppdheffedeeegdpdttdc
+F-H2-1613 4 cndppppddffdttdc
+F-H2-1614 4 dgqpdpegcgdepdcdgcccdcttcb
+F-H2-1615 3 lpoqqpdpdepdttdc
+F-H2-1616 2 djpodppipdqfndttdd
+F-H2-1617 2 cjfqdpopdnippdttdd
+F-H2-1618 4 fcfqdpqpcndgcecfpddecdttdc
+F-H2-1619 3 cqnpfqdpqpeocnpdttdd
+F-H2-1620 3 pmqpoplpdpecpdttcd
+F-H2-1621 5 qpqrqqpqponpdcdpttpd
+F-H2-1622 3 ndqodpqfdettpd
+F-H2-1623 2 dcdpdfpdedcdttec
+F-H2-1624 2 qnpqnpdppoqottpd
+F-H2-1625 2 mqdppqqoplnottpd
+F-H2-1626 2 oooqqpdplponttpd
+F-H2-1627 2 hddppqdhfepdcegcttdc
+F-H2-1628 2 cqjpfqfpqpdpgpfocnpdttdd
+F-H2-1629 3 cphqfqgqqpfpgpdpdnpdttdd
+F-H2-1630 5 jqpqiqfqhqjphpipdphodnfodjqkpdqfddttnc
+F-H2-1631 3 ecppdpqfpdicndfcddttkc
+F-H2-1632 2 dnfqhqppdpcnpdttdd
+F-H2-1633 2 pfppdpqfqhncpdttdd
+F-H2-1634 2 icpqdpqkdjqfpdlcndttdd
+F-H2-1635 2 djdppopdcffdttdd
+F-H2-1636 4 cfpqdpfdpdedcdfcecttdc
+F-H2-1637 3 chdpqppddefdcddcccebttcb
+F-H2-1638 2 cidpqppddefdcddcccebttcb
+F-H2-1639 3 ccdpppdhhepdfehcdefcttdc
+F-H2-1640 2 qjnqdpqppdttcc
+F-H2-1641 4 dddpppeffeeeedpdttcd
+F-H2-1642 2 lpoqqpdpecpdttcd
+F-H2-1643 3 ndppdpqfpjncpdttdd
+F-H2-1644 2 cjdpppdhdfpdcefdbcjcttdc
+F-H2-1645 2 cnpqrqjqqonppndpddplttpd
+F-H2-1646 4 jqrqpqqonppndpcdplttpd
+F-H2-1647 2 ohdppppiphqhqfpdttdd
+F-H2-1648 5 gcqpdpdecgcdpdccdcttcb
+F-H2-1649 2 ccopqpdpdfpdttdc
+F-H2-1650 4 ffdpqpdheffedeeegdpdddfcccecttdc
+F-H2-1651 3 ndkqdpfqdnqpdjqfpdttdd
+F-H2-1652 5 ccdpqpdhffgeeffedeeegdpdddfcttdc
+F-H2-1653 3 popqdpfqcnippdttdd
+F-H2-1654 2 ccdpoppdedcdttgc
+F-H2-1655 3 pippdpphqhqfpdttdd
+F-H2-1656 5 ecqpdpffdhefgedefegdeeddpdccfcttdc
+F-H2-1657 4 pfpqdpqfpindpdttdd
+F-H2-1658 4 proqpqopqodpttpd
+F-H2-1659 2 nqdpppqncfdecdpdfcddcchcdbeccbdctteb
+F-H2-1660 2 jdqpncdpecqfttpd
+F-H2-1661 4 fdoodpcfpdttdd
+F-H2-1662 2 cdppkddpncpfecdettpd
+F-H2-1663 3 qdpqdpqfpjmdneqcpdncndttdd
+F-H2-1664 2 ocpqdpqfpjmdneqcpdncndttdd
+F-H2-1665 5 hcppdphedhfepddefcttdc
+F-H2-1666 2 fqppdpenclcnpdttdd
+F-H2-1667 2 dgqpdpcgdfcedecdpdttec
+F-H2-1668 2 qnqpoqqodpqmpocdpnttpd
+F-H2-1669 3 cidppqpddefdcddcccebttcb
+F-H2-1670 3 kqrqqqqppqroopdcdpttpd
+F-H2-1671 2 dcqpdpedpdcccdttgc
+F-H2-1672 2 bcqpdpedpdcccdttgc
+F-H2-1673 4 roopqpdpdcqottpd
+F-H2-1674 3 ccdpppdhhepdfeiddegcttdc
+F-H2-1675 3 pqqqqpnpdddpttpd
+F-H2-1676 3 bcppdpcfchddpdcccdttdc
+F-H2-1677 3 ceppdpcfcheddeddpdcccdcbdcttbc
+F-H2-1678 3 cfpqdpcedecdpddcfddbddcbecbbccttbc
+F-H2-1679 2 pgdppqpiqfpfndpdttdd
+F-H2-1680 2 cqipfqfpqpdpdnpdttdd
+F-H2-1681 3 dnqqdpfqpdttdd
+F-H2-1682 2 dddpppchcfpdcccdttdc
+F-H2-1683 2 eeqodpdedhgdpdttdc
+F-H2-1684 3 fdppdpfeefedeeddceccpdttcd
+F-H2-1685 3 fcpqdpfedhdepdttdc
+F-H2-1686 2 iofqhqpphpipdphodnfopdttdd
+F-H2-1687 2 iqfqhqpphpipdphodnfopdttdd
+F-H2-1688 2 qfdpfqdnjppdqojdttdd
+F-H2-1689 4 cbdppqdecepdcdfddcddttcc
+F-H2-1690 2 qlqnfqcnppcidpdcpdttjd
+F-H2-1691 2 dedppqeedfpdedhdttcd
+F-H2-1692 2 dfdppqcmfqcecfpddecdttdc
+F-H2-1693 4 pppqqqqpnpdddpttpd
+F-H2-1694 2 ccdpqpdgefpdcefdttdc
+F-H2-1695 3 ccdpppcgefpddegcttdc
+F-H2-1696 3 lqfqjqppiqkphqjphpipdphodnfopdttdd
+F-H2-1697 3 dnfqdppopdttcd
+F-H2-1698 3 rpnqdpfqqnppcnjppdttdd
+F-H2-1699 2 dbdpdhdedcpdfbedebecttcc
+F-H2-1700 4 dfqpdpcedecdpdttec
+F-H2-1701 2 ndppdpqfcedfpdttdc
+F-H2-1702 3 roqqrqpqqpopdcdpttpd
+F-H2-1703 4 neppdpqfpimdpdncndttdd
+F-H2-1704 3 lqoroqnrmqpqopnqnpmpdpddpottpd
+F-H2-1705 3 jddpddponcqfttpd
+F-H2-1706 2 qfdpqpdfjdpdfcddttlc
+F-H2-1707 3 bddpoqpdcfddttfc
+F-H2-1708 2 cjdpqpcedfpdcfcddefcttdc
+F-H2-1709 2 popqdpfqdnjpdjqkpdqfddttnc
+F-H2-1710 2 qcdpkqcnfqpjqppdncddttlc
+F-H2-1711 2 enjppqdpcnclqkpdqfddttnc
+F-H2-1712 3 pnopkqdpfqdnqppdttdd
+F-H2-1713 4 fdqpdpefdicfpdttdd
+F-H2-1714 2 cnfqdppppdcfddttfc
+F-H2-1715 4 ddqpdpdfeedepdedhdttcd
+F-H2-1716 4 bddeppjddpncqfdccfttpd
+F-H2-1717 3 qppqqqppdpqmpottpd
+F-H2-1718 4 kqqqprppnqqndpttpd
+F-H2-1719 2 gddpdhdedcpdfbedebcddbecttcc
+F-H2-1720 2 ebpodpdedhecpdttdc
+F-H2-1721 4 eeqpdpdfpdedhdttcd
+F-H2-1722 2 qlqnppcnjpdjfpdddpttpd
+F-H2-1723 2 cfpqdpfdqfedpdnccdfcecttdc
+F-H2-1724 2 qhpqdpqfcedfpdttdc
+F-H2-1725 2 fddppqeedfpddehdedddttcd
+F-H2-1726 2 fqdpqpdhdfpdcefdbcjcttdc
+F-H2-1727 2 opkqdpfqcnqppjjcpdttdd
+F-H2-1728 3 cedpqpdecdpdttec
+F-H2-1729 2 ccdpppdhdepdeddcecfbtteb
+F-H2-1730 2 qjrrrqqqmqpqqpopqmdpttpd
+F-H2-1731 2 cofqopqpdpcpencndndmpdttdd
+F-H2-1732 4 hohqfqhpppdpipdnfopdttdd
+F-H2-1733 3 jpdpfqdnqppdpjndqfjdttdd
+F-H2-1734 2 fcdpqpdjcfpdttdd
+F-H2-1735 2 qqfqnpcqdpqpeocnpdttdd
+F-H2-1736 2 fcdpfqdnpppjjppdttdd
+F-H2-1737 2 eddpppchcfdeddpdcccdcbdcttbc
+F-H2-1738 2 hckqdpfqcnqpqjfcpdttdd
+F-H2-1739 2 cfkqdpfqcnqpqjfcpdttdd
+F-H2-1740 2 pjdpoqpdqpjdttdd
+F-H2-1741 2 fqdppqdjqopdttdd
+F-H2-1742 3 qrrqqqkqoqqpppqodpttpd
+F-H2-1743 3 poqpoprodpddqottpd
+F-H2-1744 3 deppdpcfchddpdcccdcbdcttbc
+F-H2-1745 2 hcdpqpdiefpdcffdttdd
+F-H2-1746 2 eldpfqdnppciclpdttdd
+F-H2-1747 3 noqoopoodpttpd
+F-H2-1748 3 diqpdpehdgegcgdepdcdgcccdcttcb
+F-H2-1749 3 cgdpqpdfcedecdpdttec
+F-H2-1750 4 dfpodpfepdfcddtthc
+F-H2-1751 2 fohqpqdpfqdjqnpdttdd
+F-H2-1752 3 onpqdpqmpodcdettpd
+F-H2-1753 4 ofdpqfqhttpd
+F-H2-1754 2 edqqpppqdpnqqoqnpnpmqmcdqlttpd
+F-H2-1755 2 dnfqdpqpdjpjpdqfndttdd
+F-H2-1756 2 pjjjppeddpttpd
+F-H2-1757 4 ehdpqpdgegcgdepdcdgcccdcttcb
+F-H2-1758 3 ebqpdpcddfbdceecpddcedbcdddbfcbbccttcb
+F-H2-1759 3 fdpqdpqkpdqfndcfddttjc
+F-H2-1760 3 clqpdpdjpdcffdttdd
+F-H2-1761 4 edrqqqqppqrokqpnopcddpttpd
+F-H2-1762 4 dbdppqdecepdcdfddcddcbecbbccttbc
+F-H2-1763 2 fbdpdhdedcpdebedttec
+F-H2-1764 3 qoqqpqqpppdpqmpottpd
+F-H2-1765 2 cfdppqdnfqdjjppdpkndqfjdttdd
+F-H2-1766 4 qkpqdpfqqnqpcnjppdttdd
+F-H2-1767 3 qpqqpqdpqmpoiccffcpddbddttcc
+F-H2-1768 2 dgdpqpcgcfpdbdddttfc
+F-H2-1769 3 ooopfqdpqppmlppdttdd
+F-H2-1770 3 roqrrqqqpqppqpdpqopopnrnqmqniccffcpddbddttcc
+F-H2-1771 3 djppcnfpncdpecqfttpd
+F-H2-1772 2 qfdpfqcmpppdttdd
+F-H2-1773 4 kqrqqqqppqroopdddpttpd
+F-H2-1774 3 ncpqdpqfpdfdcdttec
+F-H2-1775 2 qqqpopqndpqmpnddpmttpd
+F-H2-1776 2 lppqnpnqmpmqdpddpottpd
+F-H2-1777 2 pnnpppqndpddpjttpd
+F-H2-1778 2 fqppdpcnpddffdttdc
+F-H2-1779 4 dbppdpdedhedpdecdcccfbtteb
+F-H2-1780 3 prpqqqppqpqodpqmpottpd
+F-H2-1781 2 kopqkqmpdpqkpdqfddttnc
+F-H2-1782 3 rmqrrqqqpqoqqppprodpqopopnrnqmqniccffcpddbddttcc
+F-H2-1783 2 dnfqdpppcecfpddecdttdc
+F-H2-1784 4 oqrqqrpqqqqppprodpqopopnrnqmqniccffcpddbddttcc
+F-H2-1785 2 mqopqpdpfcpdttdd
+F-H2-1786 4 rnpqqqqpppqodppnpoqmqniccffcpddbddttcc
+F-H2-1787 3 rqqqpqppqpdpqopopnrnqmqniccffcpddbddttcc
+F-H2-1788 4 mddppppjqfpdncndttdd
+F-H2-1789 2 qcdppppjqfnemdpdncndttdd
+F-H2-1790 2 pjdpfqcnpppdqfddttnc
+F-H2-1791 2 cedppodedcpdttfd
+F-H2-1792 2 oqfqhqcqgqqpeqgpfpcpdpdnpdttdd
+F-H2-1793 4 gddpqpefdhdfeepdeccdttgc
+F-H2-1794 4 cbppdphedhfepddehcccfcttdc
+F-H2-1795 4 efqpdpdhdfeepdeccdttgc
+F-H2-1796 3 cpcoppcndpdmendcdnttpd
+F-H2-1797 3 dddpqpdhcedegdpdttdc
+F-H2-1798 2 cidppppdcefdttdc
+F-H2-1799 2 qnqpoprodpdcqottpd
+F-H2-1800 2 edqpdpdcdeebpdttec
+F-H2-1801 4 dfdppqcedepdddcdecdcttcc
+F-H2-1802 3 qodppqpocedjcddffccfdcdettpd
+F-H2-1803 3 pjdpqpdeqfpdttnd
+F-H2-1804 2 rqqqmqopqpdpcfchbdcefcbedcpdccedbcddttcd
+F-H2-1805 2 qpqqpqdpqmpocfdecdpdfcddcchcdbeccbdctteb
+F-H2-1806 2 qcdppqpiqfpdncndttdd
+F-H2-1807 2 dmipfqdpqpdncnpdttdd
+F-H2-1808 2 ecdpppchcfefeefeeddeddceccpdcbcdbbdcttbc
+F-H2-1809 3 ddpqdpdfeedepdedhdttcd
+F-H2-1810 2 lpjppqdpfqdjqkpdqfndttdd
+F-H2-1811 2 cqjppqdpfqdjqkpdqfndttdd
+F-H2-1812 2 fdqpdpefdgcepdttdc
+F-H2-1813 2 nppqnqoqopqpdpddpnttpd
+F-H2-1814 2 dgppdpcecfcddedcpdttfd
+F-H2-1815 2 efqpdpdfeedepdfdhdedddttcd
+F-H2-1816 2 egqpdpdfeedepdfdhdedddttcd
+F-H2-1817 2 pjjqdpfqdnoppdttdd
+F-H2-1818 2 dkdpppdhhepdfehcdefcccdcttcb
+F-H2-1819 2 eeqodpcfdjfcpdttdd
+F-H2-1820 3 ccdpqpchdgcgcfdffdcedcpdttdd
+F-H2-1821 4 ccdpqocgdepdttdc
+F-H2-1822 3 qqpqppoqopqpdpddpnttpd
+F-H2-1823 2 cdpqdpcfpdfcidccfdttdd
+F-H2-1824 2 eepodpdedhgdpdttdc
+F-H2-1825 2 popqdpjcpdttdd
+F-H2-1826 4 dcdppqponqqnqppnqopjttpd
+F-H2-1827 4 ndkqdpfqdnqppiqfpdofjdttdd
+F-H2-1828 3 hofqhqqpdpkpdnfopdttdd
+F-H2-1829 3 cdppdpdepdttec
+F-H2-1830 3 monrlqqqqppqppnqopdppjpdqfndttdd
+F-H2-1831 3 dmfqdpcqeoqppdcnjdttdd
+F-H2-1832 3 qpqnpqcedpttpd
+F-H2-1833 4 ceqpdpdgchcfcgfddfdcpdttdd
+F-H2-1834 2 nppqdpdepofdpdttdc
+F-H2-1835 2 qqpqdpnqpolqnopllottpd
+F-H2-1836 2 gfdpopchefpdcffdttdd
+F-H2-1837 2 iddppodffepdfcddtthc
+F-H2-1838 3 ecpqdpcedecdpddcfdcbddbbccttbc
+F-H2-1839 4 cgqpdpdgchcfdffdpdttdd
+F-H2-1840 3 fdpqdpcfdjfcpdttdd
+F-H2-1841 3 fcdpfqdnppdjjppdpjndqfjdttdd
+F-H2-1842 2 djfqdpppdnjppdpjndqfjdttdd
+F-H2-1843 3 qrprqqpqppqpnpdddpttpd
+F-H2-1844 2 ecdppodfcdpdtted
+F-H2-1845 4 oroqnrmqpqopnqnpmpdpddpottpd
+F-H2-1846 4 qnpqqqqpppqodpqmpoiccffcpddbddttcc
+F-H2-1847 2 fqpqdpcncecfpddecdttdc
+F-H2-1848 3 pnqqpqppqpdpqopoqmqniccffcpddbddttcc
+F-H2-1849 4 ndkqdpfqcnqppiqfpdofjdttdd
+F-H2-1850 4 roqqrqpqqpopdddpttpd
+F-H2-1851 3 omqqpqqpfqdppprnjpqnpocnqlpdttdd
+F-H2-1852 3 jqoqdppnpdttdd
+F-H2-1853 3 efppdpcfcheefeeddeddceccpdcbcdbbdcttbc
+F-H2-1854 2 nnqpoppodpoonottpd
+F-H2-1855 4 dfqpdpeepdeccdttgc
+F-H2-1856 2 geqpdpdfdhdeeefdpdedddttdc
+F-H2-1857 4 nomqopqpdpqfpdttdd
+F-H2-1858 4 bddppqcfcedecdpddcfddbddcbecbbccttbc
+F-H2-1859 2 qikqdpfqcnqppdqfddttnc
+F-H2-1860 3 pqrqqqqpopdcdpttpd
+F-H2-1861 4 lqdppqponqnopllottpd
+F-H2-1862 2 ncppdpphpiohqhrfqgqfrdpfpdttdd
+F-H2-1863 2 cbdpppchcfpdddcdccdcttbc
+F-H2-1864 2 eddpqpchdfpdttdc
+F-H2-1865 2 qcdppppiqfeettpd
+F-H2-1866 2 foipfqdpppeettpd
+F-H2-1867 2 qiqnpqqkqpcddpttpd
+F-H2-1868 3 jdpqdpcfpoddpdttfc
+F-H2-1869 3 rqqqqpopdcdpttpd
+F-H2-1870 2 efqpdpdgchcfcgfddfdcceccpdttdd
+F-H2-1871 3 qoqqpqppqpdpqmpoiccffcpddbddttcc
+F-H2-1872 3 ndqfdpofqhttpd
+F-H2-1873 2 gpopfqdpqpcpcoencndndmpdttdd
+F-H2-1874 3 bcpqdpcedecdpddcfdcbddttcc
+F-H2-1875 4 mddppppiqfpdncndttdd
+F-H2-1876 3 fddppqqfedpdnccdfcecttdc
+F-H2-1877 3 qnpqpodpecqottpd
+F-H2-1878 4 fcdpqodjcfpdttdd
+F-H2-1879 3 feppdpcfcheddeddceccpdcbcdbbdcttbc
+F-H2-1880 3 cmqpdpdjpdcfddttfc
+F-H2-1881 4 bbdppqdecepdcdfddcddcbccttbc
+F-H2-1882 2 fqdppqpiripdqfndofddrdqcttjc
+F-H2-1883 3 dgdpqpchcfdffdpdttdd
+F-H2-1884 2 qqppnqoodpddqnttpd
+F-H2-1885 2 hcqpdpdhefeedfgdpdeccdttgc
+F-H2-1886 3 neppdpqfpjmdpdncndttdd
+F-H2-1887 2 ncpodpqfdettpd
+F-H2-1888 2 cqhqfqdppppdqfddttnc
+F-H2-1889 2 pjfqdpipdnpopdttdd
+F-H2-1890 2 dgdpppdicfdffcpdttdd
+F-H2-1891 2 plrppqdpfqqnjpcnpopdttdd
+F-H2-1892 2 dfppdpcfcheeefedfedddeecceccpdcbcdbbdcttbc
+F-H2-1893 3 lqppqnnppjdpddqhttpd
+F-H2-1894 2 drfqppcldpdecnttpd
+F-H2-1895 3 edpqnqoqopqpnpqnjpcddpttpd
+F-H2-1896 4 dfqpdpcfchfdpdttdd
+F-H2-1897 2 efdppochcfpdttdd
+F-H2-1898 2 ccdppochcfpdttdd
+F-H2-1899 3 pooqqpdpddqnttpd
+F-H2-1900 4 pppqqqqpdpqmpoiccffcpddbddttcc
+F-H2-1901 2 cdqpdpcfchfcdfccpdttdd
+F-H2-1902 3 jqpqdppopdttdd
+F-H2-1903 3 prqqpqppqpnpdddpttpd
+F-H2-1904 2 cnfqppdedpttpd
+F-H2-1905 4 ofdpkqcnfqpiqppdqfjdttdd
+F-H2-1906 2 qldpppqncipdcfddbdfcttcc
+F-H2-1907 2 ebpqdpdfcedepdddcdecdcttcc
+F-H2-1908 3 cfqpdpqfpdgdcdedncfcecttdc
+F-H2-1909 2 eedpppchcffeeddeddceccpdcbcdbbdcttbc
+F-H2-1910 3 dedpqpeedfpdedhdttcd
+F-H2-1911 4 dhdpqpdfeepdeccdttgc
+F-H2-1912 3 fqdpqopdpindqfjdttdd
+F-H2-1913 2 nnqpqqlpppdpopqonooopmqncdonttpd
+F-H2-1914 4 mqoppqnpoqdpddqottpd
+F-H2-1915 3 fddpqpeedfpddehdedddttcd
+F-H2-1916 2 ckkqdpfqdnqppjcipdttdd
+F-H2-1917 3 mqoqqpdppjpdqfndttdd
+F-H2-1918 4 omqqqppplpopdpnoqonnoopmqncdonttpd
+F-H2-1919 4 pqnqoqopqpdpddpnttpd
+F-H2-1920 2 frhqfqfpdqepcqdpqpcpcnpdttdd
+F-H2-1921 2 cnppjdjpncdpecpfttpd
+F-H2-1922 2 lperdroqcrhqfqeqcqdqqpdpcpdocnpdttdd
+F-H2-1923 2 dkppdpcnpdttdc
+F-H2-1924 3 cddpqpdhcedegdpdddedttdc
+F-H2-1925 2 qkdppqdeqfpdttnd
+F-H2-1926 2 icqodpecpdttcd
+F-H2-1927 2 opqodpecpdttcd
+F-H2-1928 2 opdpkqqnfqcnqppdttdd
+F-H2-1929 3 pcdppppiqfnemdpdncndttdd
+F-H2-1930 2 qlqrrqqqkqoqqpppqodpttpd
+F-H2-1931 3 edqpdpcedhgddeddpdttdc
+F-H2-1932 4 ckdpfqcnqpcedgpdcfcddefcttdc
+F-H2-1933 2 ddprqqnqppkqqndpttpd
+F-H2-1934 2 ceqpdpdgchcfcgfcdfdcpdttdd
+F-H2-1935 4 qrrqqqpqppqpdpqopopnrnqmqniccffcpddbddttcc
+F-H2-1936 2 cjppcodpcncpdmendcdnttpd
+F-H2-1937 2 dfpqdpcfpofcpdttdd
+F-H2-1938 2 bbdpppchcfdeedceddpdcccdcbdcttbc
+F-H2-1939 3 rqqqmqopfqdpqppdttdd
+F-H2-1940 2 cnkqpqdpmpkoqkpdqfddttnc
+F-H2-1941 2 dfdpppjjddpdttfd
+F-H2-1942 2 pfkqdpfqdnqpqjncpdttdd
+F-H2-1943 3 onrqqrpqqqqpoqroppqodppnpormrnqmqniccffcpddbddttcc
+F-H2-1944 4 pqppoqopqpdpddpnttpd
+F-H2-1945 4 pqrqqqqpopdddpttpd
+F-H2-1946 2 cekqdpfqdnqppdttdc
+F-H2-1947 2 kpdppqpomqnopllottpd
+F-H2-1948 3 dcdpqpchdgcgcfdffdpdttdd
+F-H2-1949 2 dfdppopdfcjdttdd
+F-H2-1950 2 nrnppqdpqppoqoqncdpnttpd
+F-H2-1951 3 cfppdpgdpdedcdfcecttdc
+F-H2-1952 2 pkdpkqcnfqpiqppdqfndofjdttdd
+F-H2-1953 2 mpqqqrqpordppqpoddqkttpd
+F-H2-1954 2 pnqqrqpqqpkqroopdddpttpd
+F-H2-1955 3 qmopfqdpqponlppdttdd
+F-H2-1956 2 mppqopoqnpmqdpddqottpd
+F-H2-1957 2 cjppdpgcceecpddcfdtted
+F-H2-1958 2 nolqnqppdpttpd
+F-H2-1959 2 cdqodpdecgccpdttdc
+F-H2-1960 2 drfqdpqpcnckcedgpdcfcddefcttdc
+F-H3-1 259 qpdpttpdttdd
+F-H3-2 128 podpttpdttdd
+F-H3-3 121 ppdpttpdttdd
+F-H3-4 115 oqdpttpdttdd
+F-H3-7 6 fqdpttpdttdd
+F-H3-8 4 cfdpttpdttdd
+F-H3-9 3 jjdpttpdttdd
+F-H3-10 3 cndpttpdttdd
+F-H3-11 435 opqpdpttpdttdd
+F-H3-12 98 oqqpdpttpdttdd
+F-H3-13 53 djpqdpttpdttdd
+F-H3-14 45 npqpdpttpdttdd
+F-H3-15 42 djqpdpttpdttdd
+F-H3-16 38 nqqpdpttpdttdd
+F-H3-17 8 jjpqdpttpdttdd
+F-H3-18 6 jppqdpttpdttdd
+F-H3-19 6 pppqdpttpdttdd
+F-H3-20 88 lpopqpdpttpdttdd
+F-H3-21 73 mqopqpdpttpdttdd
+F-H3-22 43 oqopqpdpttpdttdd
+F-H3-23 37 fqopqpdpttpdttdd
+F-H3-24 19 oodppqpottpdttdd
+F-H3-25 19 kpopqpdpttpdttdd
+F-H3-26 12 npdppqpottpdttdd
+F-H3-27 9 cfopqpdpttpdttdd
+F-H3-28 9 pmdppqpottpdttdd
+F-H3-29 5 cfdppqpottpdttdd
+F-H3-30 4 cnopqpdpttpdttdd
+F-H3-31 4 nqdppqpottpdttdd
+F-H3-32 3 pmopqpdpttpdttdd
+F-H3-33 3 ncopqpdpttpdttdd
+F-H3-34 2 cnppcddpttpdtted
+F-H3-35 2 jqopqpdpttpdttdd
+F-H3-36 2 kqopqpdpttpdttdd
+F-H3-37 154 qnppdpttpdttdd
+F-H3-38 78 jdppdpttpdttdd
+F-H3-39 7 jjppdpttpdttdd
+F-H3-40 5 npppdpttpdttdd
+F-H3-41 5 jqppdpttpdttdd
+F-H3-42 3 qfppdpttpdttdd
+F-H3-43 3 pjppdpttpdttdd
+F-H3-44 3 jcppdpttpdttdd
+F-H3-45 3 gqppdpttpdttdd
+F-H3-46 2 dgddppttdpttpd
+F-H3-47 2 moppdpttpdttdd
+F-H3-48 77 qpoqdpttpdttdd
+F-H3-49 74 pooqdpttpdttdd
+F-H3-50 57 jdoqdpttpdttdd
+F-H3-51 23 djoqdpttpdttdd
+F-H3-53 8 jpqodpttpdttdd
+F-H3-54 6 jjqodpttpdttdd
+F-H3-55 5 qkoqdpttpdttdd
+F-H3-56 5 qjqodpttpdttdd
+F-H3-57 5 jqqodpttpdttdd
+F-H3-58 4 pjqodpttpdttdd
+F-H3-60 3 dfecppttdpttpd
+F-H3-61 2 qfqodpttpdttdd
+F-H3-62 2 qqqodpttpdttdd
+F-H3-63 87 pqpodpttpdttdd
+F-H3-64 58 djpodpttpdttdd
+F-H3-65 32 djopdpttpdttdd
+F-H3-66 22 pjopdpttpdttdd
+F-H3-67 11 mqopdpttpdttdd
+F-H3-68 7 jqpodpttpdttdd
+F-H3-69 6 qqpodpttpdttdd
+F-H3-70 5 jjpodpttpdttdd
+F-H3-71 4 qfopdpttpdttdd
+F-H3-72 4 qoopdpttpdttdd
+F-H3-73 4 jcedppttdpttpd
+F-H3-74 4 pjpodpttpdttdd
+F-H3-75 2 qlopdpttpdttdd
+F-H3-76 2 cfpodpttpdttdd
+F-H3-77 2 gqopdpttpdttdd
+F-H3-78 2 qkpodpttpdttdd
+F-H3-79 2 dfedppttdpttpd
+F-H3-80 24 nqdpppqnttpdttdd
+F-H3-81 19 pkdpppqnttpdttdd
+F-H3-82 18 lqnqppdpttpdttdd
+F-H3-83 17 pjdpppqnttpdttdd
+F-H3-84 15 pnnqppdpttpdttdd
+F-H3-85 8 qfnqppdpttpdttdd
+F-H3-86 7 qfdpppqnttpdttdd
+F-H3-87 6 qmnqppdpttpdttdd
+F-H3-88 4 jqnqppdpttpdttdd
+F-H3-89 2 pmnqppdpttpdttdd
+F-H3-90 2 cnnqppdpttpdttdd
+F-H3-91 2 kqnqppdpttpdttdd
+F-H3-92 71 pmqpoplpdpttpdttdd
+F-H3-93 66 onqpoplpdpttpdttdd
+F-H3-94 16 pnqpoplpdpttpdttdd
+F-H3-95 11 oqpqdpplpottpdttdd
+F-H3-96 6 omqpoplpdpttpdttdd
+F-H3-97 3 qqpqdpplpottpdttdd
+F-H3-98 2 noqpoplpdpttpdttdd
+F-H3-99 2 jpqpoplpdpttpdttdd
+F-H3-100 79 qqmqopqpdpttpdttdd
+F-H3-101 75 nomqopqpdpttpdttdd
+F-H3-102 9 ropqdpqmpottpdttdd
+F-H3-103 3 oqpqdpqmpottpdttdd
+F-H3-104 2 djpqdpqmpottpdttdd
+F-H3-105 2 dfcdppgcdpttpdtted
+F-H3-106 2 ppmqopqpdpttpdttdd
+F-H3-107 36 lpoqqpdpttpdttdd
+F-H3-108 22 kpoqqpdpttpdttdd
+F-H3-109 22 qkdppqqottpdttdd
+F-H3-110 8 pmdppqqottpdttdd
+F-H3-111 7 fqoqqpdpttpdttdd
+F-H3-112 5 mqoqqpdpttpdttdd
+F-H3-113 3 jqoqqpdpttpdttdd
+F-H3-114 3 lqoqqpdpttpdttdd
+F-H3-115 2 cfdppqqottpdttdd
+F-H3-116 2 cnoqqpdpttpdttdd
+F-H3-117 30 nppqpodpttpdttdd
+F-H3-118 17 mppqpodpttpdttdd
+F-H3-119 14 qfpqpodpttpdttdd
+F-H3-120 4 qqqpopdpttpdttdd
+F-H3-121 4 dmppdedpttpdttdc
+F-H3-122 3 qmqpopdpttpdttdd
+F-H3-123 3 nqppeddpttpdttcd
+F-H3-124 2 fcpqpodpttpdttdd
+F-H3-125 2 fqpqpodpttpdttdd
+F-H3-126 2 oqpqpodpttpdttdd
+F-H3-127 22 fqdpppdjttpdttdd
+F-H3-128 17 qfdpppdjttpdttdd
+F-H3-129 14 cfdppppdttjdttdd
+F-H3-130 6 cjdppppdttjdttdd
+F-H3-131 5 ncdpppdjttpdttdd
+F-H3-132 23 qpdpoqpottpdttdd
+F-H3-133 18 mqopqodpttpdttdd
+F-H3-134 16 oodpoqpottpdttdd
+F-H3-135 7 qqopqodpttpdttdd
+F-H3-136 3 pmdpoqpottpdttdd
+F-H3-137 2 fcopqodpttpdttdd
+F-H3-138 65 nqoqopqpdpttpdttdd
+F-H3-139 5 ppoqopqpdpttpdttdd
+F-H3-140 2 fdcdppecdpttpdtted
+F-H3-141 21 pnqpoqdpttpdttdd
+F-H3-142 12 qfpqqodpttpdttdd
+F-H3-143 3 qnqpoqdpttpdttdd
+F-H3-144 3 oppqqodpttpdttdd
+F-H3-145 2 pmqpoqdpttpdttdd
+F-H3-146 2 kcppecdpttpdttcd
+F-H3-147 2 fcpqqodpttpdttdd
+F-H3-148 17 rqqqmqopqpdpttpdttdd
+F-H3-149 15 qpqqpqdpqmpottpdttdd
+F-H3-150 10 ppqqpqdpqmpottpdttdd
+F-H3-151 4 cnppcgdpdcdettpdttcc
+F-H3-152 2 beppcddpgcpdttedttcc
+F-H3-153 15 cgppcddpgcfettpdtted
+F-H3-154 12 moopmqdpqpnottpdttdd
+F-H3-155 10 pqopmqdpqpnottpdttdd
+F-H3-156 6 npdppqpoqmonttpdttdd
+F-H3-157 6 kpopmqdpqpnottpdttdd
+F-H3-158 4 mpdppqpoqmonttpdttdd
+F-H3-159 2 pjdppqpoqmonttpdttdd
+F-H3-160 2 ncppcddpgcfettpdtted
+F-H3-161 29 oomppqdpplpottpdttdd
+F-H3-162 13 ppopqpdplppmttpdttdd
+F-H3-163 11 onopqpdplppmttpdttdd
+F-H3-164 3 cnppdhdpdcdettpdttgd
+F-H3-165 41 pqnqoqopqpdpttpdttdd
+F-H3-166 53 nppqnqoqopqpdpttpdttdd
+F-H3-167 9 mppqnqoqopqpdpttpdttdd
+F-H3-168 4 nmpqnqoqopqpdpttpdttdd
+F-H3-169 2 pjcdppecdpdcpdttedttfc
+F-H3-170 21 qfdpoqpdttjdttdd
+F-H3-171 17 qfdpqodjttpdttdd
+F-H3-172 8 fcdpqodjttpdttdd
+F-H3-173 3 ncdpqodjttpdttdd
+F-H3-174 2 mdppcedpttpjttpd
+F-H3-175 18 lqnpqpdpttpdttdd
+F-H3-176 11 npdppqpnttpdttdd
+F-H3-177 10 oqnpqpdpttpdttdd
+F-H3-178 9 pqnpqpdpttpdttdd
+F-H3-179 4 cfdppqpnttpdttdd
+F-H3-180 4 nonpqpdpttpdttdd
+F-H3-181 3 qfppcddpttpdttfd
+F-H3-182 3 fqnpqpdpttpdttdd
+F-H3-183 3 idppcddpttpdttfd
+F-H3-184 2 cfnpqpdpttpdttdd
+F-H3-185 29 fqdpqpdjttpdttdd
+F-H3-186 6 cfdppqpdttjdttdd
+F-H3-187 5 qfdpqpdjttpdttdd
+F-H3-188 2 nqdpqpdjttpdttdd
+F-H3-189 17 hqfqopqpdpttpdttdd
+F-H3-190 12 ipfqopqpdpttpdttdd
+F-H3-191 11 qqfqopqpdpttpdttdd
+F-H3-192 7 pnfqopqpdpttpdttdd
+F-H3-193 6 jqfqopqpdpttpdttdd
+F-H3-194 6 cnfqopqpdpttpdttdd
+F-H3-195 3 dnfqopqpdpttpdttdd
+F-H3-196 2 oqpqdpqfpottpdttdd
+F-H3-197 2 jpfqopqpdpttpdttdd
+F-H3-198 19 fqdppodjttpdttdd
+F-H3-199 18 qfdppodjttpdttdd
+F-H3-200 11 cfdpoppdttjdttdd
+F-H3-201 4 ncdppodjttpdttdd
+F-H3-202 2 dmppedjpttdpttpd
+F-H3-203 2 dmppdedpttpjttpd
+F-H3-204 61 onpqdpoopottpdttdd
+F-H3-205 6 qqpqdpoopottpdttdd
+F-H3-206 33 qmopqpdplponttpdttdd
+F-H3-207 19 nqdppqpoplnottpdttdd
+F-H3-208 28 jpppnqqndpttpdttdd
+F-H3-209 23 prppnqqndpttpdttdd
+F-H3-210 3 iccfppdddpttpdttfc
+F-H3-211 3 kpppnqqndpttpdttdd
+F-H3-212 2 kccfppdddpttpdttfc
+F-H3-213 33 qnnqpqopoqnpqpdpttpdttdd
+F-H3-214 6 ponqpqopoqnpqpdpttpdttdd
+F-H3-215 13 onqpopkpdpttpdttdd
+F-H3-216 12 qoqpopkpdpttpdttdd
+F-H3-217 10 pnqpopkpdpttpdttdd
+F-H3-218 7 qqqpopkpdpttpdttdd
+F-H3-219 6 pmqpopkpdpttpdttdd
+F-H3-220 4 qgpqdppkpottpdttdd
+F-H3-221 3 iqqpopkpdpttpdttdd
+F-H3-222 2 djidppcddpttpdtted
+F-H3-223 2 cldippdcdpttdettpd
+F-H3-224 2 hpqpopkpdpttpdttdd
+F-H3-225 2 ipqpopkpdpttpdttdd
+F-H3-226 17 qfdppqdjttpdttdd
+F-H3-227 13 fcdppqdjttpdttdd
+F-H3-228 7 fqdppqdjttpdttdd
+F-H3-229 2 nqdpqppdttjdttdd
+F-H3-230 10 opdppqpoooonttpdttdd
+F-H3-231 7 nodppqpoooonttpdttdd
+F-H3-232 38 jppqnqoqopqpnpqndpttpdttdd
+F-H3-233 8 cjceppcddpfcdfdccfttdettpd
+F-H3-234 3 pipqdpnqpoqpqnqopnttpdttdd
+F-H3-235 13 hqfqdpqpdjttpdttdd
+F-H3-236 6 dnfqdpqpdjttpdttdd
+F-H3-237 5 pjpqdpqfpdttjdttdd
+F-H3-238 3 fpfqdpqpdjttpdttdd
+F-H3-239 3 ipfqdpqpdjttpdttdd
+F-H3-240 2 jdfqdpqpdjttpdttdd
+F-H3-241 39 mpqpoppodpoonottpdttdd
+F-H3-242 5 nnpqdpoppoooonttpdttdd
+F-H3-243 3 dfeeppeddpdcefttdettpd
+F-H3-244 17 onqpoqlpdpttpdttdd
+F-H3-245 9 oopqdpplqottpdttdd
+F-H3-246 7 npqpoqlpdpttpdttdd
+F-H3-247 3 ppqpoqlpdpttpdttdd
+F-H3-248 2 dehdppcddpttpdttec
+F-H3-249 2 ompqdpplqottpdttdd
+F-H3-250 12 olqpoplpdpqmonttpdttdd
+F-H3-251 12 lppqdpmqpoplnottpdttdd
+F-H3-252 8 ipqpoplpdpqmonttpdttdd
+F-H3-253 8 qqqpoplpdpqmonttpdttdd
+F-H3-254 23 qonppqpodpttpdttdd
+F-H3-255 12 nqnppqpodpttpdttdd
+F-H3-257 40 noqpoplpdpoopmttpdttdd
+F-H3-258 9 pqnqqpdpttpdttdd
+F-H3-259 8 fqnqqpdpttpdttdd
+F-H3-260 7 qldppqqnttpdttdd
+F-H3-261 5 podppqqnttpdttdd
+F-H3-262 2 jdppcddpttpdttfc
+F-H3-263 2 qkdppqqnttpdttdd
+F-H3-264 2 dippdcdpttcfttpd
+F-H3-265 28 onopqpdplpnooopmttpdttdd
+F-H3-266 38 ppqpoplpdpoonoonpmttpdttdd
+F-H3-267 2 nnpqmpoodpnopoplonttpdttdd
+F-H3-268 5 ncppeedpdefecdpdttgdtted
+F-H3-269 5 nnopqpmppodpoonottpdttdd
+F-H3-270 18 cnnqpqopoqnpqpjpqndpttpdttdd
+F-H3-271 3 cjnqpqopoqnpqpjpqndpttpdttdd
+F-H3-272 2 cfdppqponqqnqppnqopjttpdttdd
+F-H3-273 2 qnppcfdpcdpdecjddcfdttedttfc
+F-H3-274 20 fqdpopdjttpdttdd
+F-H3-275 5 cfdppopdttjdttdd
+F-H3-276 5 qfdpopdjttpdttdd
+F-H3-277 3 mdppeddpttpjttpd
+F-H3-278 33 qooqdpqppottpdttdd
+F-H3-279 3 ppoqdpqppottpdttdd
+F-H3-280 19 qnppqpoplpdpoonoonpmttpdttdd
+F-H3-281 7 oppppqmpoodpnopoplonttpdttdd
+F-H3-282 3 oqpppqmpoodpnopoplonttpdttdd
+F-H3-283 13 qoqqpqppqpdpqmpottpdttdd
+F-H3-284 2 cbppcgdpcddedcpdttddttcc
+F-H3-285 38 pppqqqqpdpqmpottpdttdd
+F-H3-286 14 rpdpoqqoqppottpdttdd
+F-H3-287 8 ppdpoqqoqppottpdttdd
+F-H3-288 9 qnppnqjpdpttpdttdd
+F-H3-289 6 onppdppjqnttpdttdd
+F-H3-290 6 qqppnqjpdpttpdttdd
+F-H3-291 3 npppdppjqnttpdttdd
+F-H3-292 21 clpqnqoqopqpnpqnjpcndpttpdttdd
+F-H3-293 3 piqfppcfdpcdpdecjddcfdttedttfc
+F-H3-294 3 ndqfppcfdpcdpdecjddcfdttedttfc
+F-H3-295 2 pjqfppcfdpcdpdecjddcfdttedttfc
+F-H3-296 7 dnfqdpqodjttpdttdd
+F-H3-297 6 hqfqdpqodjttpdttdd
+F-H3-298 5 ipfqdpqodjttpdttdd
+F-H3-299 2 ncoqdpqfpdttjdttdd
+F-H3-300 2 fofqdpqodjttpdttdd
+F-H3-301 15 nolqnqppdpttpdttdd
+F-H3-302 9 qqlqnqppdpttpdttdd
+F-H3-303 2 plppdpqlqnttpdttdd
+F-H3-304 12 ndqodpqfdjttpdttdd
+F-H3-305 4 ncqodpqfdjttpdttdd
+F-H3-306 4 jdqodpqfdjttpdttdd
+F-H3-307 3 qhqodpqfdjttpdttdd
+F-H3-308 2 pqqodpqfdjttpdttdd
+F-H3-309 30 mnqpoppompoodpnnnottpdttdd
+F-H3-310 10 pppqdpqkqottpdttdd
+F-H3-311 5 qmkqoqqpdpttpdttdd
+F-H3-312 4 onkqoqqpdpttpdttdd
+F-H3-313 3 ookqoqqpdpttpdttdd
+F-H3-314 3 qqkqoqqpdpttpdttdd
+F-H3-315 2 oppqdpqkqottpdttdd
+F-H3-316 2 mqkqoqqpdpttpdttdd
+F-H3-317 4 nmopqpmppodpoononnmnttpdttdd
+F-H3-318 12 ndpqdpqfdjttpdttdd
+F-H3-319 5 cnfqdpqppdttjdttdd
+F-H3-320 3 hqfqdpqppdttjdttdd
+F-H3-321 2 pjcdppncjpttdpttpd
+F-H3-322 2 opfqdpqppdttjdttdd
+F-H3-323 23 opoqqppndpttpdttdd
+F-H3-324 8 opnppqqodpttpdttdd
+F-H3-325 22 mmqpoppompoodpnnnonmmnttpdttdd
+F-H3-326 4 qgqpoppompoodpnnnonmmnttpdttdd
+F-H3-327 11 oqopqppmdpttpdttdd
+F-H3-328 4 qnopqppmdpttpdttdd
+F-H3-329 3 ooopqppmdpttpdttdd
+F-H3-330 3 jdmppqpodpttpdttdd
+F-H3-331 2 djmppqpodpttpdttdd
+F-H3-332 16 noppnqkpdpttpdttdd
+F-H3-333 7 qqppdppkqnttpdttdd
+F-H3-334 4 cfidppdddpttpdttfc
+F-H3-335 6 fqdpoppjttpdttdd
+F-H3-336 6 cnjppodpttpdttdd
+F-H3-337 3 fcdpoppjttpdttdd
+F-H3-338 3 ceppeddpttdjttpd
+F-H3-339 2 cjjppodpttpdttdd
+F-H3-340 6 qqprppnqqndpttpdttdd
+F-H3-341 3 cnppdddpfccfttpdttbd
+F-H3-342 2 mqprppnqqndpttpdttdd
+F-H3-343 2 qfprppnqqndpttpdttdd
+F-H3-344 2 cnprppnqqndpttpdttdd
+F-H3-345 6 cnnqppjpqndpttpdttdd
+F-H3-346 4 qjppcfdpddpdttjdttfc
+F-H3-347 15 lopqdpnqpoplnottpdttdd
+F-H3-348 5 qqpqdpnqpoplnottpdttdd
+F-H3-349 3 pipqdpnqpoplnottpdttdd
+F-H3-350 2 lppqdpnqpoplnottpdttdd
+F-H3-351 15 hqfqdpppdjttpdttdd
+F-H3-352 4 dnfqdpppdjttpdttdd
+F-H3-353 3 jpddppncdpttpjttpd
+F-H3-354 2 djcnppddjpttdpttpd
+F-H3-355 24 qnpqqqqpppqodpqmpottpdttdd
+F-H3-356 2 oqpqqqqpppqodpqmpottpdttdd
+F-H3-357 17 nnqppplpopoodpqnnoonpmttpdttdd
+F-H3-358 9 qqqppplpopoodpqnnoonpmttpdttdd
+F-H3-359 19 ooqpopppdplppmttpdttdd
+F-H3-360 2 dfdhppdddpdcdettpdttgd
+F-H3-361 7 onqpoqkpdpttpdttdd
+F-H3-362 3 ooqpoqkpdpttpdttdd
+F-H3-363 2 deidppcddpttpdttec
+F-H3-364 2 pnqpoqkpdpttpdttdd
+F-H3-365 2 gcidppcddpttpdttec
+F-H3-366 2 gcdippdcdpttcettpd
+F-H3-367 11 qfdpqopdttjdttdd
+F-H3-368 6 cfdpqopdttjdttdd
+F-H3-369 4 qfdpoqdjttpdttdd
+F-H3-370 2 mdppecdpttpjttpd
+F-H3-371 11 ndppdpqfdjttpdttdd
+F-H3-372 5 qhppdpqfdjttpdttdd
+F-H3-373 4 pippdpqfdjttpdttdd
+F-H3-374 4 cnfqdppppdttjdttdd
+F-H3-375 2 djfqdppppdttjdttdd
+F-H3-376 13 pnqqpqppqpdpqopoqmqnttpdttdd
+F-H3-377 3 nrqqpqnqoqppmqopqpdpttpdttdd
+F-H3-378 4 djlqnpqpdpttpdttdd
+F-H3-379 4 decdpphcdpttpdttfd
+F-H3-380 3 ffchppdcdpttdfttpd
+F-H3-381 3 qqlqnpqpdpttpdttdd
+F-H3-382 2 ckchppdcdpttdfttpd
+F-H3-383 2 jdlqnpqpdpttpdttdd
+F-H3-384 2 ddcdpphcdpttpdttfd
+F-H3-385 12 qmqqrqpqmqopqpdpttpdttdd
+F-H3-386 6 roqqrqpqmqopqpdpttpdttdd
+F-H3-387 21 pqrqqqmqopqpdpttpdttdd
+F-H3-388 11 nqoqopqppndpttpdttdd
+F-H3-389 6 qppqnpdppoqottpdttdd
+F-H3-390 3 ddppdedpfdcettpdttdc
+F-H3-391 11 oqopqpdpppoolppmttpdttdd
+F-H3-392 11 npnqoqopqpdpppoolppmttpdttdd
+F-H3-393 8 qppqmpppdpqopopnooplqnttpdttdd
+F-H3-394 7 qmpqmpppdpqopopnooplqnttpdttdd
+F-H3-395 4 mpoqnqqpopppdpnpoolppmttpdttdd
+F-H3-396 2 oroqnqqpopppdpnpoolppmttpdttdd
+F-H3-397 19 nqoqopqpdpppoolppmttpdttdd
+F-H3-398 3 nlopqpmppodpoononnmnnmmmttpdttdd
+F-H3-399 13 mlqpoppompoodpnnnonmmnnlmmttpdttdd
+F-H3-400 4 qgqpoppompoodpnnnonmmnnlmmttpdttdd
+F-H3-401 3 lkqpoppompoodpnnnonmmnnlmmttpdttdd
+F-H3-402 21 qrrqqqpqppqpdpqopopnrnqmqnttpdttdd
+F-H3-403 5 pppndpttpdttdd
+F-H3-404 4 pqpndpttpdttdd
+F-H3-405 3 djpndpttpdttdd
+F-H3-406 3 jppndpttpdttdd
+F-H3-407 17 ppqpoqoppndpttpdttdd
+F-H3-408 21 rnpqqqqpppqodppnpoqmqnttpdttdd
+F-H3-409 13 rqqqpqppqpdpqopopnrnqmqnttpdttdd
+F-H3-410 16 qopqqpoqopppdppnpottpdttdd
+F-H3-411 7 ooqppqppopnpdpqopottpdttdd
+F-H3-412 23 pooqqpppoppndpttpdttdd
+F-H3-413 9 hqfqdppodjttpdttdd
+F-H3-414 6 dnfqdppodjttpdttdd
+F-H3-415 4 jpfqdppodjttpdttdd
+F-H3-416 7 fohqfqopqpdpttpdttdd
+F-H3-417 3 cqhqfqopqpdpttpdttdd
+F-H3-418 2 ldppcddpncpdttedttlc
+F-H3-419 2 dnhqfqopqpdpttpdttdd
+F-H3-420 2 cnhqfqopqpdpttpdttdd
+F-H3-421 2 gcppcddpncpdttedttlc
+F-H3-422 8 ndpodpqfpdttjdttdd
+F-H3-423 5 hqfqdpopdjttpdttdd
+F-H3-424 2 fofqdpopdjttpdttdd
+F-H3-425 2 pfpodpqfpdttjdttdd
+F-H3-426 2 pipodpqfpdttjdttdd
+F-H3-427 12 roqrrqqqpqppqpdpqopopnrnqmqnttpdttdd
+F-H3-428 7 kqdpfqdnqpdjttpdttdd
+F-H3-429 2 jpdpfqdnqpdjttpdttdd
+F-H3-430 17 pqqpoqopppdppnpottpdttdd
+F-H3-431 21 mnmqopqpdpmonottpdttdd
+F-H3-432 4 qhqopqqfdpttpdttdd
+F-H3-433 4 piqopqqfdpttpdttdd
+F-H3-434 3 ndqopqqfdpttpdttdd
+F-H3-435 3 opqopqqfdpttpdttdd
+F-H3-436 2 jdncppecdpttpdttcd
+F-H3-437 2 ncqopqqfdpttpdttdd
+F-H3-438 5 fecdppbddpecdettcettpd
+F-H3-439 5 kqproqpqopqodpttpdttdd
+F-H3-440 3 pnproqpqopqodpttpdttdd
+F-H3-441 2 kpproqpqopqodpttpdttdd
+F-H3-442 2 djcdppbddpecdettcettpd
+F-H3-443 2 rooqdprpqoqppottpdttdd
+F-H3-444 6 cnfqqpopdpttpdttdd
+F-H3-445 3 dnfqqpopdpttpdttdd
+F-H3-446 2 nppopqqfdpttpdttdd
+F-H3-447 2 pjpopqqfdpttpdttdd
+F-H3-448 2 qmpopqqfdpttpdttdd
+F-H3-449 2 oqfqqpopdpttpdttdd
+F-H3-450 8 hcpqdpfcdjttpdttdd
+F-H3-451 2 fdpqdpfcdjttpdttdd
+F-H3-452 2 fdqpdpcfpdttjdttdd
+F-H3-453 2 jpnqppdcdpttpjttpd
+F-H3-454 11 jpppnqpndpttpdttdd
+F-H3-455 6 prppnqpndpttpdttdd
+F-H3-456 14 onoqdpoopottpdttdd
+F-H3-457 6 poqoopoodpttpdttdd
+F-H3-458 11 pqmqopqodpttpdttdd
+F-H3-459 3 dccgppecdpttdettpd
+F-H3-460 2 efcgppecdpttdettpd
+F-H3-461 2 ccceppgcdpttpdtted
+F-H3-462 5 ofppqfdpcfqhcdpdecjddcfdttedttfc
+F-H3-463 4 qcppqfdpcfqhcdpdecjddcfdttedttfc
+F-H3-464 2 fqnqpqopoqnpqpjpqndpcnclttpdttdd
+F-H3-465 12 oqrqqrpqqqqppprodpqopopnrnqmqnttpdttdd
+F-H3-466 5 onrqqrpqqqqppprodpqopopnrnqmqnttpdttdd
+F-H3-467 3 bgcgppdfdpcecfbebfcddedcpdbcddttccttcb
+F-H3-468 6 heppgedpcdgfgcfettpdtted
+F-H3-469 5 mpopmqdpqpnomomnttpdttdd
+F-H3-470 11 ndpodpqfdjttpdttdd
+F-H3-471 4 ncpodpqfdjttpdttdd
+F-H3-472 3 qhpodpqfdjttpdttdd
+F-H3-473 5 fcjqppdddpttpjttpd
+F-H3-474 5 pjppdpcjpdttjdttdd
+F-H3-475 4 qlqjppddjpttdpttpd
+F-H3-476 2 djjqppdddpttpjttpd
+F-H3-477 2 gqjqppdddpttpjttpd
+F-H3-478 2 qmqjppddjpttdpttpd
+F-H3-479 9 cccgppcddpgcfettpdtted
+F-H3-480 9 dhcgppgcdpdcefttdettpd
+F-H3-481 18 qqpqdpnppottpdttdd
+F-H3-482 11 chopdpcfpdttjdttdd
+F-H3-483 7 pnnqlqdpppnottpdttdd
+F-H3-484 3 qnnqlqdpppnottpdttdd
+F-H3-485 13 prqpqqlpppqoopoodpqnnoonnnompmttpdttdd
+F-H3-486 4 bcegppefdpcfdgeeffcefehdpdcdedttddttcc
+F-H3-487 10 qrqqpqdpnppottpdttdd
+F-H3-488 2 dcppdfdpcdpdttedttcc
+F-H3-489 13 qoqqqppplpopoodpqnnoonnnompmttpdttdd
+F-H3-490 4 prqqpqppnqmpoodpnopomoonplnnttpdttdd
+F-H3-491 9 pnnqppdpkpnottpdttdd
+F-H3-492 18 qqqppplpopoodpqnnoonnnompmttpdttdd
+F-H3-493 14 ooopqpdplppnttpdttdd
+F-H3-494 8 chppdpcfpdttjdttdd
+F-H3-495 4 cfppdpfcdjttpdttdd
+F-H3-496 2 jdppdpfcdjttpdttdd
+F-H3-497 6 oooqqpdplponttpdttdd
+F-H3-498 5 mqdppqqoplnottpdttdd
+F-H3-499 3 fcppdhdpdcfettcettpd
+F-H3-500 16 omppqpoplpdpoonoqnnnonpmttpdttdd
+F-H3-501 13 oqoppqqodpttpdttdd
+F-H3-502 5 fcpqdpcfpottpdttdd
+F-H3-503 2 chpqdpcfpottpdttdd
+F-H3-504 7 mpqpppqoopoodponnottpdttdd
+F-H3-505 5 qqpqppoqdpooponoonttpdttdd
+F-H3-506 3 difeppeedpecefdcdettpdttdd
+F-H3-507 15 poqpoplpdpoopnttpdttdd
+F-H3-508 7 npqpopppdplppooopnttpdttdd
+F-H3-509 5 onpqopppnpoodpplpottpdttdd
+F-H3-510 3 oqqpopppdplppooopnttpdttdd
+F-H3-511 14 ppopqpdplppooopnttpdttdd
+F-H3-512 4 pnoqpqopppdpqooottpdttdd
+F-H3-513 3 pkdpoqqoqppoppoottpdttdd
+F-H3-514 12 pppqdpooponoonttpdttdd
+F-H3-515 2 pmpqdpooponoonttpdttdd
+F-H3-516 2 npqpopoodponnottpdttdd
+F-H3-517 15 oooqdpqpqopppottpdttdd
+F-H3-518 13 nopqdppmpottpdttdd
+F-H3-519 7 jdoodpttpdttdd
+F-H3-520 3 ppoodpttpdttdd
+F-H3-521 2 qqoodpttpdttdd
+F-H3-522 2 jpoodpttpdttdd
+F-H3-523 14 ooqppqopoqdpppqopnpottpdttdd
+F-H3-524 14 nppqqpoqopppdpooqopnpottpdttdd
+F-H3-525 2 efdfppeedpdddeeccedcpdttedttcd
+F-H3-526 2 mppqopoqqodpttpdttdd
+F-H3-527 2 pnqpoqdppoqottpdttdd
+F-H3-528 3 rodppoqmttpdttdd
+F-H3-529 2 feppeddpttpdttgc
+F-H3-530 9 mqpqnpnqpodpttpdttdd
+F-H3-531 4 dgppdfdpedcfttpdttcd
+F-H3-532 9 qnmqopqpdpkpnottpdttdd
+F-H3-533 10 qoqqpqqpppdpqmpottpdttdd
+F-H3-534 6 dgppcfdpdecefdpdttcdttdc
+F-H3-535 4 dfppcfdpdecefdpdttcdttdc
+F-H3-536 12 lqdppqponqnopllottpdttdd
+F-H3-537 15 qppqqqppdpqmpottpdttdd
+F-H3-538 5 fqdpqodjqfpdttndttdd
+F-H3-539 3 ipdpoqdnfqpdttjdttdd
+F-H3-540 3 pjdpqodjqfpdttndttdd
+F-H3-541 4 qfppcddpncpjttpdttlc
+F-H3-542 3 ofdppqqhqfpdttjdttdd
+F-H3-543 2 cqhqfqdpqpdjttpdttdd
+F-H3-544 2 phdppqqhqfpdttjdttdd
+F-H3-545 6 fohqfqdpppdjttpdttdd
+F-H3-546 4 ncdpppqhqfpdttjdttdd
+F-H3-547 2 cqhqfqdpppdjttpdttdd
+F-H3-548 6 qnopqpdpkponttpdttdd
+F-H3-549 3 qmopqpdpkponttpdttdd
+F-H3-550 6 fecgppcddpgcpdbcedttdcttcc
+F-H3-551 4 gecgppcddpgcpdbcedttdcttcc
+F-H3-552 2 bbcgppcddpgcpdbcedttdcttcc
+F-H3-553 14 pqnqoqopqppndpttpdttdd
+F-H3-554 3 fgheppgedpcdgfgcfettpdtted
+F-H3-555 3 cfheppgedpcdgfgcfettpdtted
+F-H3-556 2 ffheppgedpcdgfgcfettpdtted
+F-H3-557 2 dcheppgedpcdgfgcfettpdtted
+F-H3-558 2 ccheppgedpcdgfgcfettpdtted
+F-H3-559 2 fcheppgedpcdgfgcfettpdtted
+F-H3-560 11 prpqqqppqpqodpqmpottpdttdd
+F-H3-561 2 qnpqqqppqpqodpqmpottpdttdd
+F-H3-562 12 qqqppqopoqnpppdpooqopnpottpdttdd
+F-H3-563 3 cnnqppjppndpttpdttdd
+F-H3-564 2 ncnqppjppndpttpdttdd
+F-H3-565 2 qfnqppjppndpttpdttdd
+F-H3-566 2 cfdpppqnnppjttpdttdd
+F-H3-567 4 nqdppqpopmnottpdttdd
+F-H3-568 2 qmopqpdpmponttpdttdd
+F-H3-569 4 jpqjppcfdpddpdttjdttfc
+F-H3-570 2 qhqjppcfdpddpdttjdttfc
+F-H3-571 2 qlqjppcfdpddpdttjdttfc
+F-H3-572 2 qmqjppcfdpddpdttjdttfc
+F-H3-573 10 mplppqdpmqpoplnottpdttdd
+F-H3-574 2 qlopqpdplponqmplttpdttdd
+F-H3-575 3 jdpqdpnppnttpdttdd
+F-H3-576 2 jqqpnppndpttpdttdd
+F-H3-577 2 jddfppcddpttpdttfd
+F-H3-578 13 bccgppcddpdcdecbpdttddttcc
+F-H3-579 12 qpqrqqpqdpnppottpdttdd
+F-H3-580 4 cnfqdpppqnttpdttdd
+F-H3-581 3 nqfqdpppqnttpdttdd
+F-H3-582 3 ndppnqqfdpttpdttdd
+F-H3-583 4 fqqqpqrpoqppnqmpoodpnopomoonplnnttpdttdd
+F-H3-584 4 iqqqpqrpoqppnqmpoodpnopomoonplnnttpdttdd
+F-H3-585 2 djppegdpefdgcfffeefecepdhdedcdddttccttdb
+F-H3-586 13 poqpoplpdponpmttpdttdd
+F-H3-587 7 pipqdpnqpolqnopllottpdttdd
+F-H3-588 4 qqpqdpnqpolqnopllottpdttdd
+F-H3-589 2 ojqpoplpdpqnonqlolttpdttdd
+F-H3-590 9 nodpoqpoooonttpdttdd
+F-H3-591 4 npopqodpoonottpdttdd
+F-H3-592 6 kplqnqppdppnnottpdttdd
+F-H3-593 2 prlqnqppdppnnottpdttdd
+F-H3-594 2 nmlqnqppdppnnottpdttdd
+F-H3-595 6 qfppcfdpcdpdecfddcedttjcttfc
+F-H3-596 2 qjppcfdpcdpdecfddcedttjcttfc
+F-H3-597 6 qqoqqodpttpdttdd
+F-H3-598 3 qfoqqodpttpdttdd
+F-H3-599 3 fdqpopcfdpttpdttdd
+F-H3-600 2 cjqpopcfdpttpdttdd
+F-H3-601 2 lqnqppdcdpttdettpd
+F-H3-602 9 pkopqpdplponqmolttpdttdd
+F-H3-603 2 fqopqpdplponqmolttpdttdd
+F-H3-604 5 dbceppcddpgcpddcedbcddttccttcb
+F-H3-605 3 ecceppcddpgcpddcedbcddttccttcb
+F-H3-606 2 fcceppcddpgcpddcedbcddttccttcb
+F-H3-607 2 fbceppcddpgcpddcedbcddttccttcb
+F-H3-608 9 pnopqpdplppoonpmttpdttdd
+F-H3-609 11 qnqqqppqopoqnpppdpooqopnpottpdttdd
+F-H3-610 2 mkopqpmppodpoononnmnnmmmnlmlttpdttdd
+F-H3-611 8 rmqrrqqqpqoqqppprodpqopopnrnqmqnttpdttdd
+F-H3-612 5 hdppdfdpcdpdbcedttdcttcc
+F-H3-613 2 rrqqqrqppqdpnppottpdttdd
+F-H3-614 2 roqqrqpqqpoppndpttpdttdd
+F-H3-615 7 roopqpdpkpqottpdttdd
+F-H3-616 2 edppdidpdcdettpdttec
+F-H3-617 3 qnlqnqppdedpttpjttpd
+F-H3-618 2 fddpopchcfpdttjdttdd
+F-H3-619 2 onppqnjpeddpttqlttpd
+F-H3-620 2 ccdpopchcfpdttjdttdd
+F-H3-621 2 hddppodjfcpdttddtthc
+F-H3-622 4 cfdppqjjttpdttdd
+F-H3-623 2 nqppdcdpttjjttpd
+F-H3-624 2 nqdpqpjjttpdttdd
+F-H3-625 7 prppnqkpdppnnottpdttdd
+F-H3-626 3 pippdpnpqnpkonttpdttdd
+F-H3-627 8 qopqdpqppoqmonttpdttdd
+F-H3-628 3 lppqopmqdpqpnottpdttdd
+F-H3-629 6 qnnqpqopoqmpqpdpttpdttdd
+F-H3-630 3 feppcddpecpddcgdttedttfc
+F-H3-631 5 ppoqpqdpplpottpdttdd
+F-H3-632 4 oroqpqdpplpottpdttdd
+F-H3-633 2 opoqpqdpplpottpdttdd
+F-H3-634 9 qkdppqdjqfpdttndttdd
+F-H3-635 7 cnqqfqopqpdpttpdttdd
+F-H3-636 2 kqqqfqopqpdpttpdttdd
+F-H3-637 2 mqqqfqopqpdpttpdttdd
+F-H3-638 2 rqqqfqopqpdpttpdttdd
+F-H3-639 5 dnoqdpfqdjttpdttdd
+F-H3-640 2 piqodpqfpdttjdttdd
+F-H3-641 7 nqoqnpqpdpttpdttdd
+F-H3-642 2 popqdpqopnttpdttdd
+F-H3-643 3 chpqdpcfpdttjdttdd
+F-H3-644 2 dfqpdpfcdjttpdttdd
+F-H3-645 2 dfpqdpcfpdttjdttdd
+F-H3-646 11 rnqpoplpdpqnqopnpoonpmttpdttdd
+F-H3-647 6 oqpppqdpooponoonttpdttdd
+F-H3-648 7 npoppqmpoqqodpttpdttdd
+F-H3-649 2 nqoppqmpoqqodpttpdttdd
+F-H3-650 10 pqoqopqppmdpttpdttdd
+F-H3-651 9 rqqqoqpqqpoppppmdpttpdttdd
+F-H3-652 2 cfdeppgddpcdceccpdttddttdc
+F-H3-653 11 pppqoqopqppmdpttpdttdd
+F-H3-654 12 qoqpoplpdppnpoonpmttpdttdd
+F-H3-655 5 ooopqpdpkppnttpdttdd
+F-H3-656 9 qnopqpdplpqopnpoonpmttpdttdd
+F-H3-657 6 cnopfqipqpdpttpdttdd
+F-H3-658 4 foopfqipqpdpttpdttdd
+F-H3-659 2 nddppqpoqfpittpdttdd
+F-H3-660 5 jppqoqppopqodppnoottpdttdd
+F-H3-661 2 kqpqoqppopqodppnoottpdttdd
+F-H3-662 2 nmpqoqppopqodppnoottpdttdd
+F-H3-663 10 qqoqpqqpoppppmdpttpdttdd
+F-H3-664 10 poqqpqnqlqqpppdpttpdttdd
+F-H3-665 9 qppqqqlqnqppdpttpdttdd
+F-H3-666 5 nopqqqoqqpnqppopnpdpqopooopnttpdttdd
+F-H3-667 4 noqpqqoppqnpoqdpppqooopopnqnttpdttdd
+F-H3-668 8 ooprpqqqppqpqodpqmpottpdttdd
+F-H3-669 2 jppqdpqkpdqfndttjdttdd
+F-H3-670 2 jdkqdpfqdnqpdjttpdttdd
+F-H3-671 8 oqpppqdpqkqottpdttdd
+F-H3-672 2 ccppcddpicpdttddttec
+F-H3-673 5 pmpqmqopqodpttpdttdd
+F-H3-674 2 ncppcedpgcpdttedttdc
+F-H3-675 2 qqpqmqopqodpttpdttdd
+F-H3-676 7 mpmqpqnpnqpodpttpdttdd
+F-H3-677 9 jppqlpmqdpmppolonoplmottpdttdd
+F-H3-678 4 qfdpkqdnfqdjqppdttjdttdd
+F-H3-679 3 eeppjddpddcfttpdttfc
+F-H3-680 3 npnqppdppjqnttpdttdd
+F-H3-681 4 lcnqdpppqnncpjttpdttdd
+F-H3-682 2 fpppnqqnjpcndpttpdttdd
+F-H3-683 2 piqfppcfdpddpdttjdttfc
+F-H3-684 11 mopqlpmqdpmppoplnottpdttdd
+F-H3-685 3 fqdpppdjqfpdttndttdd
+F-H3-686 3 jdppddjpncdpttpfttpd
+F-H3-687 4 cnjpqodpttpdttdd
+F-H3-688 3 qfjpqodpttpdttdd
+F-H3-689 3 kopqdpmqpokpnopllottpdttdd
+F-H3-690 2 qqqpoplpdpqmonpkolttpdttdd
+F-H3-691 2 ipqpoplpdpqmonpkolttpdttdd
+F-H3-692 2 jpqpoplpdpqmonpkolttpdttdd
+F-H3-693 10 lolppqdpmqpompnoplmottpdttdd
+F-H3-694 4 fqdppopdqfndttjdttdd
+F-H3-695 3 pjdppopdqfndttjdttdd
+F-H3-696 2 ipdpfqdnopdjttpdttdd
+F-H3-697 5 fqdppodjqfpdttndttdd
+F-H3-698 2 fcdppodjqfpdttndttdd
+F-H3-699 2 jddppodjqfpdttndttdd
+F-H3-700 10 pqqqlqnqppdpttpdttdd
+F-H3-701 4 cfdppqdjfcpdttddtthc
+F-H3-702 3 efdpqpchcfpdttjdttdd
+F-H3-703 2 ccdppqdjfcpdttddtthc
+F-H3-704 5 jcppcgdpcdfegcpdbcedttdcttcc
+F-H3-705 2 moqqrqpqmqopqpdpqmnottpdttdd
+F-H3-706 5 rpopqpdplpqoqnpopnrnonpmttpdttdd
+F-H3-707 2 qmopqpdplpqoqnpopnrnonpmttpdttdd
+F-H3-708 4 qgqpoppompoodpnnnonmmnnlmmnkmlttpdttdd
+F-H3-709 3 ljqpoppompoodpnnnonmmnnlmmnkmlttpdttdd
+F-H3-710 2 mkqpoppompoodpnnnonmmnnlmmnkmlttpdttdd
+F-H3-711 9 qrorprpqqqlqnqppqppodpttpdttdd
+F-H3-712 3 djpqnpqpdpttpdttdd
+F-H3-713 6 nrrqrroqornqqqrppqqpoppppmdpttpdttdd
+F-H3-714 2 opqrrrprqqpqqpppmpdproqopoqnttpdttdd
+F-H3-715 6 qqmqopqpdppnnottpdttdd
+F-H3-716 3 hddfppcddpgcfettpdtted
+F-H3-717 5 cdppcgdpgcdhdcefttdettpd
+F-H3-718 3 jprqqrpqqqqpoqroppqodppnpormrnqmqnpmonttpdttdd
+F-H3-719 2 qfrqqrpqqqqpoqroppqodppnpormrnqmqnpmonttpdttdd
+F-H3-720 2 gqqrnrorrqmrqqpqnqoqppmqopqpdpnpqompnottpdttdd
+F-H3-721 9 rprrrqqqoqpqqpoppppmdpttpdttdd
+F-H3-722 8 nooqnqqpnpopdpttpdttdd
+F-H3-723 10 poqpopkpdproqottpdttdd
+F-H3-724 7 npdppqroqmpottpdttdd
+F-H3-725 2 cgppcddpgcpdttedtteb
+F-H3-726 9 lceeppdedpcdfencpdttgdtted
+F-H3-727 3 jppqdpqkdjqfpdttndttdd
+F-H3-728 2 jdpqdpqkdjqfpdttndttdd
+F-H3-729 2 jqpqdpqkdjqfpdttndttdd
+F-H3-730 2 qjcdppncjpicdpttpfttpd
+F-H3-731 9 rqqrqqpqppoqdpqkqottpdttdd
+F-H3-732 10 oqqrorprpqqqlqnqppqppodpttpdttdd
+F-H3-733 3 mprqqrqqpqppoqdpqkqottpdttdd
+F-H3-734 2 oprqqrqqpqppoqdpqkqottpdttdd
+F-H3-735 2 qlqrrqqqkqoqqpppqodpttpdttdd
+F-H3-736 2 fdppcedpcdpdicddbcecttccttcb
+F-H3-737 4 cccfppgddpcdefttpdtted
+F-H3-738 3 lopqdpnqpopmnottpdttdd
+F-H3-739 9 qnorqrpqproqqqlqnqppqppodpttpdttdd
+F-H3-740 3 qfjppqdpttpdttdd
+F-H3-741 2 fcppcddpttdjttpd
+F-H3-742 3 qoqqqppplpopoodpqnnoonpmttpdttdd
+F-H3-743 2 bdppefdpcfdgeefehdpdcdedttddttcc
+F-H3-744 3 dnfqdpttpdttdd
+F-H3-745 2 ppqfdpttpdttdd
+F-H3-746 2 fcdpqojjttpdttdd
+F-H3-747 8 orrqrroqqqrppqqpoppppmdpttpdttdd
+F-H3-748 7 ppmqqqfqopqpdpttpdttdd
+F-H3-749 2 qfcdppncdpgcpdttedttcc
+F-H3-750 8 pmqrrqqqpqoqqppprodpqopopnrnrmqnqmonttpdttdd
+F-H3-751 9 nqrrrqoroqqqrppqqpoppppmdpttpdttdd
+F-H3-752 8 rrrqqqoqpqqpoppppmdpttpdttdd
+F-H3-753 3 ndqfppcfdpcdpdecfddcedttjcttfc
+F-H3-754 2 jpnqoqnpqpdpopnottpdttdd
+F-H3-755 2 oonqoqnpqpdpopnottpdttdd
+F-H3-756 2 pidppqqnqopnpoonttpdttdd
+F-H3-757 6 cnqrorprpqqqoqnqlqqpppdppoqnttpdttdd
+F-H3-758 4 qnopqpdpkpqoropottpdttdd
+F-H3-759 3 bfppbedpiddecdcettpdtted
+F-H3-760 3 qfdpfqdnqodjttpdttdd
+F-H3-761 2 jpdpfqdnqodjttpdttdd
+F-H3-762 8 ppoqdpooponoonttpdttdd
+F-H3-763 2 pqqoopoodponnottpdttdd
+F-H3-764 5 ldppeedpdefecdpdncgdttedttlc
+F-H3-765 8 qqpqppopmpoodpnopoplonttpdttdd
+F-H3-766 2 nnpqppopmpoodpnopoplonttpdttdd
+F-H3-767 10 orprpqqqlqnqppqppodpttpdttdd
+F-H3-768 10 onrqqrpqqqqpoqroppqodppnpormrnqmqnttpdttdd
+F-H3-769 4 gqopmqdpqpnokpqnttpdttdd
+F-H3-770 8 kqpqnqqpdpttpdttdd
+F-H3-771 9 prpqqqlqnqppqppodpttpdttdd
+F-H3-772 2 ndkqdpfqdnqpdjqfpdttjdttdd
+F-H3-773 6 rppqqpppmprodpqopopnooplqnttpdttdd
+F-H3-774 2 qmpqqpppmprodpqopopnooplqnttpdttdd
+F-H3-775 8 qqpqppoqdpqkqottpdttdd
+F-H3-776 3 qfjqpodpttpdttdd
+F-H3-777 2 cdppeddpttcjttpd
+F-H3-778 7 lnlppqjpmqdpmppolonoplmottpdttdd
+F-H3-779 5 ccjqppdddpfccfttpdttbd
+F-H3-780 5 qqpqdpnqpottpdttdd
+F-H3-781 8 poqpopkpdpoopnttpdttdd
+F-H3-782 3 qfppcfdpddpdccicttfcttdb
+F-H3-783 9 pcqfppcfdpcdqhqcpdecjddcfdttedttfc
+F-H3-784 7 roqppqmpppdpqopopnooplqnttpdttdd
+F-H3-785 5 kceeppdedpldfecdpdncgdttedttlc
+F-H3-786 4 kdeeppdedpldfecdpdncgdttedttlc
+F-H3-787 5 onmppqdppppoqooopnqnplqmttpdttdd
+F-H3-788 6 dnfqhqqpopfodpttpdttdd
+F-H3-789 2 cnfqhqqpopfodpttpdttdd
+F-H3-790 5 oqpqmqnqnpmppodpttpdttdd
+F-H3-791 3 nopqmqnqnpmppodpttpdttdd
+F-H3-792 4 efdpppchcfpdttjdttdd
+F-H3-793 2 fcdpppchcfpdttjdttdd
+F-H3-794 2 fqppcnjpeddpttclttpd
+F-H3-795 2 fohqfqdppodjttpdttdd
+F-H3-796 3 dnfqdpoppjttpdttdd
+F-H3-797 2 qhpojpqfdpttpdttdd
+F-H3-798 2 rfppqfdpcfqhqdpecdpdqcjdecfddcedttpcttfc
+F-H3-799 2 bqhqfqppdqepcqdpcecpcddjfcdfdccfttdettpd
+F-H3-800 4 qdppqfdpcfqhcdpdqcjdecfddcedttpcttfc
+F-H3-801 3 olqpopkpdpqnonttpdttdd
+F-H3-802 2 ldcfppiddpcdefttpdtted
+F-H3-803 9 peqfppcfdpqdqhcdpdqcjdecfddcedttpcttfc
+F-H3-804 2 jcdpppjjttpdttdd
+F-H3-805 2 cfdpppjjttpdttdd
+F-H3-806 7 kqqqprppnqqndpttpdttdd
+F-H3-807 8 qrqqpqppoqdpqkqottpdttdd
+F-H3-808 7 opnqoqnpqpdpttpdttdd
+F-H3-809 4 qhpqdpqfqnttpdttdd
+F-H3-810 2 jdcdppncdpttpdttfc
+F-H3-811 5 dcppcgdpcdfegcpdttedttcc
+F-H3-812 4 bcppcgdpcdfegcpdttedttcc
+F-H3-813 5 ppopqpdpkppooopnttpdttdd
+F-H3-814 5 fdeeppiddpdddfcddettpdtted
+F-H3-815 3 noqpopppdpkppooopnttpdttdd
+F-H3-816 6 norqqqmqpqqpoprodpttpdttdd
+F-H3-817 2 eecdppgcdpttpdttec
+F-H3-818 2 pomqoqqpdpttpdttdd
+F-H3-819 2 pmpqdpqmqottpdttdd
+F-H3-820 7 npdppqqoploottpdttdd
+F-H3-821 4 pqoqnqqpmqppopnpdplpoonopmttpdttdd
+F-H3-822 3 nopqmpppdpqopopnooonqnplqmttpdttdd
+F-H3-823 7 jppqnqoqopqpnppodpttpdttdd
+F-H3-824 3 ncppdpqfqnttpdttdd
+F-H3-825 4 lqoppqmpoqqonqnonpmodpttpdttdd
+F-H3-826 2 qpoppqmpoqqonqnonpmodpttpdttdd
+F-H3-827 2 qpqqpqdpnqpottpdttdd
+F-H3-828 5 qrqqpqppopmpoodpnopoplonttpdttdd
+F-H3-829 3 chqodpcfpdttjdttdd
+F-H3-830 3 cnnqpqopoqnpqpjppodpttpdttdd
+F-H3-831 2 qjppdedpcdpdecjddcfdttedttfc
+F-H3-832 4 efppjddpdddfttpdttfc
+F-H3-833 3 pnnpppdppjqnttpdttdd
+F-H3-834 4 choqdpcfpdttjdttdd
+F-H3-835 7 rqqqqpoplpdpqmonttpdttdd
+F-H3-836 3 bcppiddpcdpdttedttcc
+F-H3-837 7 krqqprppnqkpdppnnottpdttdd
+F-H3-838 2 nopqopoqmpnpqodpttpdttdd
+F-H3-839 4 mldppqpomqnoplpittpdttdd
+F-H3-840 4 oldppqqoplomttpdttdd
+F-H3-841 6 pqrqqqqpoplpdpqmonttpdttdd
+F-H3-842 6 oopqdppmqottpdttdd
+F-H3-843 2 fegdppcddpttpdttec
+F-H3-844 3 cnppdfdpidfeddpdccfcttibttdb
+F-H3-845 2 cnprqqkrppnqkpdppnnottpdttdd
+F-H3-846 5 qmoprpdpqprolpqoqnpopnrnonpmttpdttdd
+F-H3-847 7 qmoqqpdpkponttpdttdd
+F-H3-848 4 qmopqppndppmqnttpdttdd
+F-H3-849 2 cedeppgddpfdpdttfcttdc
+F-H3-850 6 lrlqpqlpmqjpmpdplopolnnoplmottpdttdd
+F-H3-851 3 noopqpnpppdplppooopnttpdttdd
+F-H3-852 3 omopqpnpppdplppooopnttpdttdd
+F-H3-853 2 pofqoqqpdpttpdttdd
+F-H3-854 2 cnprppnqpndpttpdttdd
+F-H3-855 7 nqoppqmpoqqonpnodpttpdttdd
+F-H3-856 4 oopqnpopqodpttpdttdd
+F-H3-857 7 roprpqqqppqpqodpoopoqmpnttpdttdd
+F-H3-858 8 lqpqlpmqjpmpdplopolnnoplmottpdttdd
+F-H3-859 6 iqpqnqoqopqpmpqndpttpdttdd
+F-H3-860 8 pnpqprppqqqoqpoodpqmpottpdttdd
+F-H3-861 3 mqdppqqoqppoqmonttpdttdd
+F-H3-862 3 nqdppqqoqppoqmonttpdttdd
+F-H3-863 5 qpppqoopoodponnottpdttdd
+F-H3-864 3 pnppoqdpooponoonttpdttdd
+F-H3-865 3 jpppnqqmdpttpdttdd
+F-H3-866 2 qqppnqqmdpttpdttdd
+F-H3-867 8 rorpopqpdplpqoqnpopnrnonpmttpdttdd
+F-H3-868 3 fpdmppdedpttpdttdc
+F-H3-869 2 ecmdppeddpttpdttcd
+F-H3-870 3 hqpqdpfqdjttpdttdd
+F-H3-871 2 pfncppdcdpttpjttpd
+F-H3-872 2 qqpqdpnpqoploottpdttdd
+F-H3-873 2 rqpqdpnpqoploottpdttdd
+F-H3-874 2 nopqdpnpqoploottpdttdd
+F-H3-875 4 ncdppppjttpdttdd
+F-H3-876 7 fedfppcddpgcpdttedtteb
+F-H3-877 7 qqprppnqkpdppnnottpdttdd
+F-H3-878 5 pqrpopqpdplproqnqopnpoonrnqmpmttpdttdd
+F-H3-879 2 mopqopoqmpnqqonpnodpttpdttdd
+F-H3-880 3 qfppcddpdcpdtticttfc
+F-H3-881 2 qfnqpqkqqpdpttpdttdd
+F-H3-882 4 pppqqqnqdpqppottpdttdd
+F-H3-883 3 beppiddpcdpdbcedttdcttcc
+F-H3-884 4 chpodpcfpdttjdttdd
+F-H3-885 2 hohqfqdpppdnfodjttpdttdd
+F-H3-886 2 kqhqfqdpppdnfodjttpdttdd
+F-H3-887 5 pnpqppoqdpooponoonqnpmttpdttdd
+F-H3-888 2 mqnqppqpopqompoodponnottpdttdd
+F-H3-889 7 opqqqppqppdppkqnttpdttdd
+F-H3-890 6 rnrppqqpppmprodpqopopnooplqnttpdttdd
+F-H3-891 5 oppqoqppdpplpottpdttdd
+F-H3-892 2 pfqfppdedpttpdttjd
+F-H3-893 2 qhqfppdedpttpdttjd
+F-H3-894 2 pmqpfqdpopcnttpdttdd
+F-H3-895 3 rqqqmqopfqdpqpcnttpdttdd
+F-H3-896 5 lqqqoqqodpttpdttdd
+F-H3-897 4 qpqrqqpqdpnqpoplnottpdttdd
+F-H3-898 5 pooqqpdplpnoooonttpdttdd
+F-H3-899 3 npqpopppdplpqooopottpdttdd
+F-H3-900 2 prpqoqppopoodpplpottpdttdd
+F-H3-901 6 nnqpqqlpppqoopoodpqnnoonpmttpdttdd
+F-H3-902 2 foipfqdpqodjttpdttdd
+F-H3-903 7 nqqprqppqqoppqrorpqodppkqnttpdttdd
+F-H3-904 3 hqfqdpqodjqfpdttndttdd
+F-H3-905 4 pnnpppdpttpdttdd
+F-H3-906 5 nppppndpttpdttdd
+F-H3-907 7 nqoqpqqpopppdpnppoqooottpdttdd
+F-H3-908 6 dcidppcddpbcpdttedttcc
+F-H3-909 2 pfidppcddpmccfgcfettpdtted
+F-H3-910 2 qfidppcddpmccfgcfettpdtted
+F-H3-911 7 qpqqppdppkqnttpdttdd
+F-H3-912 3 cnopfqdpqppnttpdttdd
+F-H3-913 6 lqqqpqqpoqppnqnpopqodpooponopnttpdttdd
+F-H3-914 3 hfgeppgddpcdgfgcfettpdtted
+F-H3-915 4 qqpqqpppnpdppoqottpdttdd
+F-H3-916 2 rppqqpppnpdppoqottpdttdd
+F-H3-917 5 oqpqqpopppdpnppoqooottpdttdd
+F-H3-918 3 efbeppiddpcdpdbcedttdcttcc
+F-H3-919 2 gdbeppiddpcdpdbcedttdcttcc
+F-H3-920 2 dhppenfpcndpdcclttdettpd
+F-H3-921 3 cfdpoopdttjdttdd
+F-H3-922 2 ncppeedpttpjttpd
+F-H3-923 3 nldppqponqnolqloplpittpdttdd
+F-H3-924 2 mldppqponqnolqloplpittpdttdd
+F-H3-925 7 qorqqpqqpppqoprprodppkqnttpdttdd
+F-H3-926 5 oooqpqopppdpplpottpdttdd
+F-H3-927 7 noqpoqlpdpooonttpdttdd
+F-H3-928 2 oonppppndpttpdttdd
+F-H3-929 7 nqppqpopqompoodponnottpdttdd
+F-H3-930 3 mqpqmpnqpodpttpdttdd
+F-H3-931 3 pnqpopdppmqnttpdttdd
+F-H3-932 4 oqqrqqpqppopmpoodpnopoplonttpdttdd
+F-H3-933 3 prqrqqpqppopmpoodpnopoplonttpdttdd
+F-H3-934 2 jqppdddpttcjttpd
+F-H3-935 2 cnjqppdpttpdttdd
+F-H3-936 3 qfppcfdpcdpdecgddcedttkcttfc
+F-H3-937 7 dnfqhqppdpfodjttpdttdd
+F-H3-938 3 jcppdfdpcdfegcpdttedtteb
+F-H3-939 6 pqqqopqodpttpdttdd
+F-H3-940 4 mqdppqpoplmottpdttdd
+F-H3-941 3 qnopqpdplpomttpdttdd
+F-H3-942 3 oooqqpnplpdpttpdttdd
+F-H3-943 2 pnoqqpnplpdpttpdttdd
+F-H3-944 7 roqqqppqpprpopdppkqnttpdttdd
+F-H3-945 3 orpqprppqqroqpqodpoopoqmpnttpdttdd
+F-H3-946 3 nqpqprppqqroqpqodpoopoqmpnttpdttdd
+F-H3-947 3 oqopqqqodpttpdttdd
+F-H3-948 2 rooqqqpodpttpdttdd
+F-H3-949 5 mporpqoqnqqpopppdpnppoqooottpdttdd
+F-H3-950 2 nrorpqoqnqqpopppdpnppoqooottpdttdd
+F-H3-951 7 rpqpqqpppqopdppkqnttpdttdd
+F-H3-952 5 qrpqrpppqprompqodprnpopnooplqnttpdttdd
+F-H3-953 3 kqnqlqkpppdppnnottpdttdd
+F-H3-954 2 lpnqlqkpppdppnnottpdttdd
+F-H3-955 3 qrrqqqpqppnqdpqppottpdttdd
+F-H3-956 3 rpprqqpqppnqmpoodpnopomoonplnnttpdttdd
+F-H3-957 2 fcegppefdpcfdgeeffhdfecdpdbdedttddttcc
+F-H3-958 2 bcegppefdpcfdgeeffhdfecdpdbdedttddttcc
+F-H3-959 5 nqnppqqoopoodpttpdttdd
+F-H3-960 2 ponppqqoopoodpttpdttdd
+F-H3-961 7 rqqpqqpppqoprprodppkqnttpdttdd
+F-H3-962 4 oorrrqoroqnrnqqqrppqqpoppppmdpttpdttdd
+F-H3-963 2 qmrrqrqqprqppqmppprodppoqornqnttpdttdd
+F-H3-964 4 ndqpdpqfdjttpdttdd
+F-H3-965 5 qrqqpqdpnqpoplnottpdttdd
+F-H3-966 4 dnfqqqqpopcndpttpdttdd
+F-H3-967 2 oeqfppcddpncpdttedttcc
+F-H3-968 5 oqqqpodpttpdttdd
+F-H3-969 6 qqlqnqqpdpttpdttdd
+F-H3-970 5 orpqoqnqqpopppdpnppoqooottpdttdd
+F-H3-971 2 rqqqpqppnqdpqppottpdttdd
+F-H3-972 6 qfrqqpqqpppqopnqrorpqodppkqnttpdttdd
+F-H3-973 7 pqqpqqppdppkqnttpdttdd
+F-H3-974 5 ecppcndpcgdedcpdttddttcc
+F-H3-975 7 ppqppqnpdppoqottpdttdd
+F-H3-976 3 cnoqprkqpqopqodpttpdttdd
+F-H3-977 6 qnorqrpqproqqqppnqjpqppodpttpdttdd
+F-H3-978 6 bddippdddpfcefttcfttpd
+F-H3-979 3 pidpqodjqfpdttddttnc
+F-H3-980 2 fqdpqodjqfpdttddttnc
+F-H3-981 6 mrkrlrlqpqlpmqjpmpdplopolnnoplmottpdttdd
+F-H3-982 2 efppeedpiddfdddecdpdttfdtted
+F-H3-983 5 bdcnppcgdpecdedcpdttddttcc
+F-H3-984 6 oqrqqrqqpqnqlqppqpdpoppottpdttdd
+F-H3-985 6 poqrrqpqqqlqnqqpppopdpttpdttdd
+F-H3-986 6 qppqqqppnqjpdpttpdttdd
+F-H3-987 4 mnqpoplpdprmonqmompmqlrlplolrknlpjttpdttdd
+F-H3-988 4 edddppcddphcdettpdttfd
+F-H3-989 2 pqfqdppodjqfpdttndttdd
+F-H3-990 2 dkcnppedjpncdpttpfttpd
+F-H3-991 5 qopqppoqopqpdpttpdttdd
+F-H3-992 6 bidippdddpfcefcccfttpdttbd
+F-H3-993 5 qjjdppddjpncdpttpfttpd
+F-H3-994 3 fgdfppjddpddfettpdttfc
+F-H3-995 2 rpppdpnpqnpjonttpdttdd
+F-H3-996 6 ndqfppofdpcfqhcdpdecjddcfdttedttfc
+F-H3-997 4 prqrpqrpppqprompqodprnpopnooplqnttpdttdd
+F-H3-998 2 qqprorrqnrpqoqnqqpopppdpnpoolppmttpdttdd
+F-H3-999 6 npdppqqopmoottpdttdd
+F-H3-1000 5 nroqpqmqnqnpmppodpttpdttdd
+F-H3-1001 2 ppcfdpttpdttdd
+F-H3-1002 6 krlrlqpqlpmqjpmpdplopolnnoplmottpdttdd
+F-H3-1003 5 eccgppcddpgcfedcpdtthdtted
+F-H3-1004 3 ipqpopkpdpqmonttpdttdd
+F-H3-1005 2 dhcgppiddpcdefttpdtted
+F-H3-1006 3 omqqqppplpopqodpoonoqnnnonpmttpdttdd
+F-H3-1007 3 nddppqpoqfqjttpdttdd
+F-H3-1008 2 cnjqfqopqpdpttpdttdd
+F-H3-1009 4 rrqqqrqppqdpnqpoplnottpdttdd
+F-H3-1010 2 djppcnjpedfpttdpttpd
+F-H3-1011 2 qfdpfqdnpodjttpdttdd
+F-H3-1012 6 ddppcddphcdettpdttfd
+F-H3-1013 6 pnopqodpoopottpdttdd
+F-H3-1014 6 pppqqqlqnqqpdpttpdttdd
+F-H3-1015 2 ciecppccdpbcdettpdttcd
+F-H3-1016 2 pnqrpqqqopqodpttpdttdd
+F-H3-1017 2 moqqrqpqmqopqpdpronottpdttdd
+F-H3-1018 2 dgppbedpcdfegcpdbcedttdcttcc
+F-H3-1019 4 rqqqmqopqpdppnnottpdttdd
+F-H3-1020 2 fpcndpttpdttdd
+F-H3-1021 3 npqpoqlpdpponoooonttpdttdd
+F-H3-1022 3 mqqpoqlpdpponoooonttpdttdd
+F-H3-1023 4 fqorqrpqproqqqlqnqppqppodpcnqnttpdttdd
+F-H3-1024 3 nnpqqpppmprodpqopopnooonqnplqmttpdttdd
+F-H3-1025 5 cdppdfdpeedecepdttedttdd
+F-H3-1026 6 oqqrorprpqqqppnqjpqppodpttpdttdd
+F-H3-1027 6 qrpqqqopqodpttpdttdd
+F-H3-1028 2 jcchppcedpcdpdgceddcddbcccttdbttcb
+F-H3-1029 2 rprqqrpqqqnqppqpdpoppottpdttdd
+F-H3-1030 4 ncqprqppqqoppqronqqorppkdpqfqnttpdttdd
+F-H3-1031 3 ofdpoqqhqfpdttjdttdd
+F-H3-1032 5 ppqqpqdpoopottpdttdd
+F-H3-1033 5 qppppqdpttpdttdd
+F-H3-1034 6 prpqqqppnqjpqppodpttpdttdd
+F-H3-1035 6 pqqqppnqjpdpttpdttdd
+F-H3-1036 2 beefppeedpiddfdddecdpdttfdtted
+F-H3-1037 2 dgefppeedpiddfdddecdpdttfdtted
+F-H3-1038 2 qfppeddpttjjttpd
+F-H3-1039 6 qrqqpqnqlqppqpdpttpdttdd
+F-H3-1040 6 rqqrqqpqnqlqppqpdpttpdttdd
+F-H3-1041 5 rqqqqpopdpttpdttdd
+F-H3-1042 2 mrqpqqoppqnpoqdpppqooopopnqnonqlttpdttdd
+F-H3-1043 2 olpqqqoqqpnqpplqnpopqodpooponopnttpdttdd
+F-H3-1044 3 nqpppqopoqdpqpqottpdttdd
+F-H3-1045 2 qqpppqopoqdpqpqottpdttdd
+F-H3-1046 5 pippqfdpofqhcfpdcdndecjddcfdttedttfc
+F-H3-1047 5 pqppoqopqpdpttpdttdd
+F-H3-1048 3 fqqrorprpqqqoqnqppqpjpdppoqnttpdttdd
+F-H3-1049 2 pnrqqpqqpppqopnqrorpqodppjqnttpdttdd
+F-H3-1050 4 ceppdddpcddehcpdttfdtted
+F-H3-1051 2 bfppdddpcddehcpdttfdtted
+F-H3-1052 5 roqqrqpqqpoplpdpqmonttpdttdd
+F-H3-1053 6 rrqrrqpqqqoqnqlqppqpdpoppottpdttdd
+F-H3-1054 6 pqqqlqnqqpdpttpdttdd
+F-H3-1055 4 roqqrqpqmqopqpdppnnottpdttdd
+F-H3-1056 2 olrqqqqppqlpoprodpqmonttpdttdd
+F-H3-1057 2 jprqqqqppqlpoprodpqmonttpdttdd
+F-H3-1058 5 oomppqdppkpottpdttdd
+F-H3-1059 6 oprqqrqqpqnqlqppqpdpttpdttdd
+F-H3-1060 6 orprpqqqppnqjpqppodpttpdttdd
+F-H3-1061 4 npdpppqnpjonttpdttdd
+F-H3-1062 5 mpppnqnpdppjqnttpdttdd
+F-H3-1063 2 jpdgppcfdpdecefdpdttcdttdc
+F-H3-1064 2 bfdfppgddpedpdfccdttecttdc
+F-H3-1065 2 qfppcedpccpdtthcttec
+F-H3-1066 4 rpqpopkpdproqoqnpottpdttdd
+F-H3-1067 2 bfcfppbedpiddecdcettpdtted
+F-H3-1068 5 fpfqopqpipcndpttpdttdd
+F-H3-1069 3 deppcgdpdfdgcecfedbfttpdttcd
+F-H3-1070 2 nonroqpqmqnqnpmppodpttpdttdd
+F-H3-1071 6 poqqpqnqppqpjpdpttpdttdd
+F-H3-1072 6 qrorprpqqqppnqjpqppodpttpdttdd
+F-H3-1073 6 ppqoopoodppnpottpdttdd
+F-H3-1074 3 onrrqrrqpqqqoqnqlqppqpdpoppottpdttdd
+F-H3-1075 3 djppdpcnpdttjdttdd
+F-H3-1076 3 mqopfqdpqpcnttpdttdd
+F-H3-1077 3 pkpqdpnpqopmoottpdttdd
+F-H3-1078 2 nopqdpnpqopmoottpdttdd
+F-H3-1079 3 qqpqdpmppoqmonttpdttdd
+F-H3-1080 2 ncpojqqfdpttpdttdd
+F-H3-1081 2 dnfqdpopqjttpdttdd
+F-H3-1082 2 fqdpopqfttpdttdd
+F-H3-1083 2 fcdpopqfttpdttdd
+F-H3-1084 2 onoqqpopppdplppooopnttpdttdd
+F-H3-1085 2 nooqqpopppdplppooopnttpdttdd
+F-H3-1086 5 roqqrqpqqpopdpttpdttdd
+F-H3-1087 3 djpqopppnpqodpqnpoplnottonttpdttdd
+F-H3-1088 2 djoqopnqdpqppoppnolppnttonttpdttdd
+F-H3-1089 5 qppqqqppdpoopottpdttdd
+F-H3-1090 3 fqdpqopdqfndttjdttdd
+F-H3-1091 4 qrqqpqqpppnpdppoqottpdttdd
+F-H3-1092 2 dhdppqchcfpdttjdttdd
+F-H3-1093 2 fqnqlqkpkqjpjqiphqdpppnolploqngottpdttdd
+F-H3-1094 5 ccdfppeedpcedecdpdttedttdd
+F-H3-1095 5 ddcgppcddpgcfedcpdttedttcc
+F-H3-1096 2 pjnqdpqpdjttpdttdd
+F-H3-1097 2 pjcfppdcjpttdpttpd
+F-H3-1098 2 dnfqdpqopdttjdttdd
+F-H3-1099 2 kqdpfqcnqppdttjdttdd
+F-H3-1100 3 qnpqqqoqppoodpnopopnonttpdttdd
+F-H3-1101 4 pnqqpqppoqdpooponoonttpdttdd
+F-H3-1102 2 fdpojpcfdpttpdttdd
+F-H3-1103 2 piopdpqfdjttpdttdd
+F-H3-1104 3 fqdpqodjqfpdttjdttdd
+F-H3-1105 5 oqrqqrpqqqqppprodpqopopnrnqmqnpmonttpdttdd
+F-H3-1106 2 jpdmppdedpttpjttpd
+F-H3-1107 3 eccgppcddpgcefdcdettcettpd
+F-H3-1108 4 pppqmpoodpnopopkonttpdttdd
+F-H3-1109 3 qipippqfdpofqhcfpdcdndecjddcfdttedttfc
+F-H3-1110 4 jqnqlqkpkqjpppdplpnopnlottpdttdd
+F-H3-1111 3 ncdppqpjqfpdttjdttdd
+F-H3-1112 4 cecgppcddpgcfeecpddcedttddttcc
+F-H3-1113 2 nqpqrpopqpdplproqnqopnpoonrnqmpmttpdttdd
+F-H3-1114 2 dfppdhdpfedefdpdgcgdfceddccddbecttfbtteb
+F-H3-1115 5 nomppqdpoopopkonttpdttdd
+F-H3-1116 3 pooqkqdpqpqmttpdttdd
+F-H3-1117 4 iplqnqkqkpjqjpppdplpnopnlottpdttdd
+F-H3-1118 3 pmqrrqqqpqppqpdpropoqornpnqnqmonttpdttdd
+F-H3-1119 5 iplqnqkqkpjqjpppdplpnoqnlottpdttdd
+F-H3-1120 2 nqppcgdpcdfegcpddchdttedttec
+F-H3-1121 5 bcppdfdpeedecepdcdedttddttcc
+F-H3-1122 5 onpqmpoodppkpottpdttdd
+F-H3-1123 4 pqrqqqqpopdpttpdttdd
+F-H3-1124 5 pqrqqqmqopqpdppnnottpdttdd
+F-H3-1125 5 lprqqqmqpqqpoprodppnnottpdttdd
+F-H3-1126 2 fohqfqdpqppdttjdttdd
+F-H3-1127 5 dddfppcddpdcpdttedttcc
+F-H3-1128 3 cqopfqipqpfpcndpttpdttdd
+F-H3-1129 2 gpopfqipqpfpcndpttpdttdd
+F-H3-1130 3 fbdfppcfdpdecefdpdttcdttdc
+F-H3-1131 2 cmdfppcfdpdecefdpdttcdttdc
+F-H3-1132 4 dfppeedpedffdcefttdettpd
+F-H3-1133 2 ccppcddpdcpdttddttec
+F-H3-1134 2 pooqpqppqpdpttpdttdd
+F-H3-1135 3 dcppefdpeeegjddfddpdttfcttcc
+F-H3-1136 2 kqnqlqkpppdpqnnottpdttdd
+F-H3-1137 5 qqpppqdpoqpooopnnoonqnpmttpdttdd
+F-H3-1138 2 lccgppcddpjcfegcpdbcedttdcttcc
+F-H3-1139 2 becgppcddpjcfegcpdbcedttdcttcc
+F-H3-1140 2 lpipfqdpqodnfodjttpdttdd
+F-H3-1141 3 pirrqqqrqppqdpnqpoplnottpdttdd
+F-H3-1142 3 dbdfppeedpcedecdpdbcedttddttcc
+F-H3-1143 5 qnoppqnpppdpqopoplnottonttpdttdd
+F-H3-1144 3 gdppcgdpcdgegcpdbcedttdcttcc
+F-H3-1145 2 mqdppqqoqmpnplpmttpdttdd
+F-H3-1146 4 dbedppcddpttpdttfc
+F-H3-1147 2 pjdpqpdjqfpdttndttdd
+F-H3-1148 3 prpqornqoqopqpmpppdpnppoqooottpdttdd
+F-H3-1149 2 fpdmppdejpttdpttpd
+F-H3-1150 2 pnpqdpqmqoplpmttpdttdd
+F-H3-1151 3 fohqfqdppppdttjdttdd
+F-H3-1152 3 cnjqqodpttpdttdd
+F-H3-1153 2 ecppdfdpcdpddcedttddttcc
+F-H3-1154 5 qooppqnpppdpoopoplonttpdttdd
+F-H3-1155 4 eofqopqpdpcnpnttpdttdd
+F-H3-1156 2 qnppqjjpdddpttdjttpd
+F-H3-1157 3 qhqfppdedpcdpdecjddcfdttedttfc
+F-H3-1158 3 cfrqqpqqpppqopnqrorpqodppkqnqfpdttddttnc
+F-H3-1159 2 cjrqqpqqpppqopnqrorpqodppkqnqfpdttddttnc
+F-H3-1160 3 cedfpphddpcdpdbcedttdcttcc
+F-H3-1161 2 bbdfpphddpcdpdbcedttdcttcc
+F-H3-1162 2 kqrqqqqppqdpoprottpdttdd
+F-H3-1163 2 fcppdedpcdpdccdcttebttcb
+F-H3-1164 5 ecppcgdpcdfegcpddcedttddttcc
+F-H3-1165 3 hqnqlqkpkqjpjqipppdplpnoqnlottpdttdd
+F-H3-1166 3 edppcddpbdfeecdettcettpd
+F-H3-1167 2 gdppcddpbdfeecdettcettpd
+F-H3-1168 2 pjpqdpmqqoplnottpdttdd
+F-H3-1169 2 kdcgpphddpcdefttpdttec
+F-H3-1170 3 rpqqpppqdpoqpooopnnoonqnpmttpdttdd
+F-H3-1171 4 eeppefdpjdegdddfttpdttfc
+F-H3-1172 2 onkqoqqpdppnoottpdttdd
+F-H3-1173 2 mppqnpnqqoopoodpttpdttdd
+F-H3-1174 4 qqdpopqottpdttdd
+F-H3-1175 4 fdfeppcddpecpddcgdttedttfc
+F-H3-1176 4 jpqqrqpqmqopqplprodppnnottpdttdd
+F-H3-1177 3 cnppjdjpdddpncqjttpfttpd
+F-H3-1178 2 qpdpttjjttpd
+F-H3-1179 5 nopqopppnpqodpoopoplonttpdttdd
+F-H3-1180 3 clcnppjdjpdddpncqjttpfttpd
+F-H3-1181 2 qfppddjpncdpttpjttpd
+F-H3-1182 3 hqnqlqkpkqjpjqipppdplpnopnlottpdttdd
+F-H3-1183 4 fqppcndpcgdeecpddcddttbdttcc
+F-H3-1184 3 qfdpfqdnppdjttpdttdd
+F-H3-1185 2 pnoqkqdpqpoottpdttdd
+F-H3-1186 5 qqmqopfqdpqpcnttpdttdd
+F-H3-1187 3 cdppecdpttpdttjc
+F-H3-1188 2 fqppdedpttcjttpd
+F-H3-1189 3 jqnqlqkpkqjpppdplpnoqnlottpdttdd
+F-H3-1190 5 kplqnqppdpqnnottpdttdd
+F-H3-1191 2 fohqfqdpopdjttpdttdd
+F-H3-1192 3 dnfqipqodpfodjttpdttdd
+F-H3-1193 3 ofpqqodpqfqhttpdttdd
+F-H3-1194 2 pldppqqoqmpmttpdttdd
+F-H3-1195 4 qpmqpqqooppmdpttpdttdd
+F-H3-1196 3 qqoqqppplpdpttpdttdd
+F-H3-1197 2 cepphddpcdpdttddttec
+F-H3-1198 5 oqpqppqpdpttpdttdd
+F-H3-1199 5 golqnqkqkpjqjphqipppdplpnoqnlottpdttdd
+F-H3-1200 2 qoqqpqqpppdpoopottpdttdd
+F-H3-1201 2 feppeedpddpdcdedttdcttcc
+F-H3-1202 2 neppeedpdefeldpdcdgdncedttlcttkc
+F-H3-1203 3 fqdpoqqkttpdttdd
+F-H3-1204 2 qfppcedpttpdttic
+F-H3-1205 2 fcdfppcddpecpddcedttddttcc
+F-H3-1206 2 cedfppcddpecpddcedttddttcc
+F-H3-1207 4 qqkqnqppdpttpdttdd
+F-H3-1208 2 qlqpopdppnqnpmqmttpdttdd
+F-H3-1209 2 plqpopdppnqnpmqmttpdttdd
+F-H3-1210 4 nqpppqmpoodpnopopkonttpdttdd
+F-H3-1211 2 ndqfppcfdpddpdccicttfcttdb
+F-H3-1212 2 fdoprqdpspqoqppokprnroqmqnpdttdd
+F-H3-1213 2 feeepphddpcdpdttfdttec
+F-H3-1214 2 kdbgppcedpdddfcddehcpdttfdtted
+F-H3-1215 2 jdbgppcedpdddfcddehcpdttfdtted
+F-H3-1216 3 bpfrhqfqppdqfpcqepbqdpcecpcddjfcdfdccfttdettpd
+F-H3-1217 3 lpnqlqkpkqjpppdppnnottpdttdd
+F-H3-1218 2 dcdgppecdpttdettpd
+F-H3-1219 4 qmrqopspdpqpqokpporornqnpdttdd
+F-H3-1220 2 becgppcddpbdfegcceecpddcedttddttcc
+F-H3-1221 2 cfcgppcddpbdfegcceecpddcedttddttcc
+F-H3-1222 4 bdppcgdpcdfegcceecpddcedttddttcc
+F-H3-1223 4 koqpqqoppqnpoqmppplpookpnodpmoqolopopnqnttpdttdd
+F-H3-1224 4 qlpkpppjdppiqjohqiqfqhofphcfpdcdndecjddcfdttedttfc
+F-H3-1225 2 nqfqqpdpttpdttdd
+F-H3-1226 3 pppqqpdpttpdttdd
+F-H3-1227 3 gofqfpqpdpgpdjttpdttdd
+F-H3-1228 3 pmpqmpppdpropoqooopnnoonqnplqmttpdttdd
+F-H3-1229 3 ofpqqodpqfpittpdttdd
+F-H3-1230 3 cqopfqdpqpeocnpnttpdttdd
+F-H3-1231 3 olpqmpppdpropoqooopnnoonqnomqmplpmttpdttdd
+F-H3-1232 4 bgppcedpdddfcddehcpdttfdtted
+F-H3-1233 2 qqpqqpoqppnpopdpttpdttdd
+F-H3-1234 2 pipqdpphqhqfpdttjdttdd
+F-H3-1235 2 mnmppqdpppporoooqonopnqnonqmompmplolttpdttdd
+F-H3-1236 4 ecchppcgdpdfdgdecfcebfedbettpdttcd
+F-H3-1237 2 beppcfdpgdefcdpdbcedttdcttcc
+F-H3-1238 4 qppqqqkqnqppdpttpdttdd
+F-H3-1239 4 cdeeppjddpddcfdcpdttfcttcc
+F-H3-1240 4 dnfqopqpipfodpttpdttdd
+F-H3-1241 4 bfdfppcfdpeedgbecgedffdcefttdettpd
+F-H3-1242 2 opqpdpttjjttpd
+F-H3-1243 2 fpcnppdhdpdcdettpdttgd
+F-H3-1244 2 pfqfppcddpncpjttpdttlc
+F-H3-1245 4 loqpqqoppqnpoqmppplpoodpnoqomopopnqnttpdttdd
+F-H3-1246 4 qrqqpqdpnqpolqnopllottpdttdd
+F-H3-1247 3 rrqrqqpqqpppnpdppoqottpdttdd
+F-H3-1248 2 fcppchdpcgdgdfcfdebfcebeedpdttcdttec
+F-H3-1249 2 lopqdpnqpolpnoplpittpdttdd
+F-H3-1250 2 ffefppcfdpeedghdfecdpdbdedttddttcc
+F-H3-1251 3 qqprqrpqrpppqprompqodprnpopnooplqnttpdttdd
+F-H3-1252 4 fpfqhqdqppcqepbqdpcecpcddjfcdfdccfttdettpd
+F-H3-1253 2 cqhqfqppdddpfcdjttcfttpd
+F-H3-1254 3 lqrqqqqppqrooppndpttpdttdd
+F-H3-1255 2 qqpqppoqmpoodpnopoplonttpdttdd
+F-H3-1256 2 ffdhppfedpeeefecdedcpdttgdttdd
+F-H3-1257 4 popqmqqpqooppmdpttpdttdd
+F-H3-1258 4 jprqrroqornqnrmqqqlqpqkqopjqnprpmpqplpppkpdppmoottpdttdd
+F-H3-1259 2 efdpoqchcfpdttjdttdd
+F-H3-1260 3 jpqqqppqopoqnpppmpoolpnokpmodploqokopopnqnttpdttdd
+F-H3-1261 4 dcidppfddpddcfcdpdttfcttcc
+F-H3-1262 2 poqqpqnqkqqpppdpttpdttdd
+F-H3-1263 3 ogrfppqfdpcfqhqdpecdpdqcjdecfddcedttpcttfc
+F-H3-1264 2 rdppqfdpcfpdcdndecjddcfdttedttfc
+F-H3-1265 4 dgdfppeedpedffdcefttdettpd
+F-H3-1266 4 nprqrroqornqnrrpqqqppqppopdppmoottpdttdd
+F-H3-1267 3 cfppdhdpcgegdcdgttdettpd
+F-H3-1268 4 poqpopdppmoottpdttdd
+F-H3-1269 4 jqrrrqoroqnrnqqqmqpqlqopkqnprpmpqplpppkpdppmoottpdttdd
+F-H3-1270 2 clproqpqkqqoopcndpttpdttdd
+F-H3-1271 3 qhqjppqfjpdddpttqlttpd
+F-H3-1272 2 fqdpppqnqfpdttddttnc
+F-H3-1273 2 ompppkdppjqlpiqjohqiqfqhofphcfpdcdndecjddcfdttedttfc
+F-H3-1274 2 moqqrqpqmqopfqdpqpnorocnttpdttdd
+F-H3-1275 3 cdppeedpedefdcdfttdettpd
+F-H3-1276 2 pfppdpqfqhncpdttjdttdd
+F-H3-1277 2 eofqhqppdpcndjttpdttdd
+F-H3-1278 2 ncppdgdpedpjttpdttcd
+F-H3-1279 3 nqoqdpqpqopppopkoottpdttdd
+F-H3-1280 3 opprqrmrqqpqrpppqprompqodprnpopnooplqnttpdttdd
+F-H3-1281 3 pfqfppcedpcdpdncedgcddttccttdb
+F-H3-1282 2 cfdpopdjfcpdttddtthc
+F-H3-1283 2 fddppochcfpdttjdttdd
+F-H3-1284 4 dfceppdddpcddehcpdttfdtted
+F-H3-1285 3 prrrqrqqpqqpppnpdppoqottpdttdd
+F-H3-1286 2 qjkqoqqpdppoqmttpdttdd
+F-H3-1287 4 lpqqqppqopoqnpppmpoodpnoqomopopnqnttpdttdd
+F-H3-1288 3 lopqdpmqpoplnomlpittpdttdd
+F-H3-1289 2 mmopqpmppodpoononnmnnmqgttpdttdd
+F-H3-1290 3 fqdppodjqfpdttddttnc
+F-H3-1291 3 prqqqroqpqppopmpoodpnopoplonttpdttdd
+F-H3-1292 2 ncdppopjttpdttdd
+F-H3-1293 3 iprqqqqpoplpdpqnonqlolttpdttdd
+F-H3-1294 2 pnoqqpdpkpoottpdttdd
+F-H3-1295 2 qmoqqpdpkpoottpdttdd
+F-H3-1296 2 dnfqdppopdqfndttjdttdd
+F-H3-1297 3 fdppefdpeeegjddfdddedcpdcbcdttfcttcc
+F-H3-1298 4 pqrqqqmqopfqdpqpcnttpdttdd
+F-H3-1299 2 pipqdpmqpoplmottpdttdd
+F-H3-1300 2 qppqqqppnpdppnoottpdttdd
+F-H3-1301 4 fdppdpefchcfpdttjdttdd
+F-H3-1302 2 rpprqrorpqoqppopoodpplpottpdttdd
+F-H3-1303 2 ccdhppfcdpdcfettcettpd
+F-H3-1304 2 ppdppqpoqopnttpdttdd
+F-H3-1305 2 kceeppdedpmdfeldpdcdkdncgdttedttlc
+F-H3-1306 4 rnrqrpqpopkpdproqoqnpottpdttdd
+F-H3-1307 2 ncdpppdjfccfttpdttdd
+F-H3-1308 4 prpqqqkqnqppqppodpttpdttdd
+F-H3-1309 3 lqdppqponqnopmlottpdttdd
+F-H3-1310 3 mooqnqqpopppmpnpdplpoonopmttpdttdd
+F-H3-1311 4 oporoqpqdpplpottpdttdd
+F-H3-1312 2 cfgqppdpttpdttdd
+F-H3-1313 3 qnrqqqrpppqpoplpdppoqooonoonpmttpdttdd
+F-H3-1314 2 qqnqlqqnppdedpttpjttpd
+F-H3-1315 2 oonqlqqnppdedpttpjttpd
+F-H3-1316 2 qqjqnqppdpttpdttdd
+F-H3-1317 2 pqqqppnpdppnoottpdttdd
+F-H3-1318 2 golqnqkqkpjqjphqipppdplpnopnlottpdttdd
+F-H3-1319 3 dedgppeedpjdcfddpddccdttfcttcc
+F-H3-1320 4 norqqqmqpqfqopqpdprocnttpdttdd
+F-H3-1321 3 hcdfppbedpjdfecdpdgchdbcedttdcttcc
+F-H3-1322 3 jplqnqkqkpppdppnnottpdttdd
+F-H3-1323 2 fpcnppdfdpidfeddpdccfcttibttdb
+F-H3-1324 4 dmqqfqopqpdpcndnttpdttdd
+F-H3-1325 3 ncqooqqfdpttpdttdd
+F-H3-1326 4 ceppdfdpcfdgeecgbeffedefdcbfttdettpd
+F-H3-1327 2 orqrprpqoqppopoodpplpottpdttdd
+F-H3-1328 2 qoqpoppppodppmoottpdttdd
+F-H3-1329 2 ecppdgdpdeeeedpdttddttcd
+F-H3-1330 3 cbppefdpeeegjddfddpddccdttfcttcc
+F-H3-1331 3 roqqrqpqmqopfqdpqpcnttpdttdd
+F-H3-1332 4 qjpjpppidpohqiqfqhofphcfpdcdndecjddcfdttedttfc
+F-H3-1333 2 sprprqopqpdpkpqoropoqnrnttpdttdd
+F-H3-1334 4 mpqqqppqopoqnpppdpooqonopopnqnttpdttdd
+F-H3-1335 3 dhppcgdpdcdgttdettpd
+F-H3-1336 2 qqppnpdppnoottpdttdd
+F-H3-1337 2 pjcdppecdpttpdttjc
+F-H3-1338 2 cjcdppecdpttpdttjc
+F-H3-1339 4 cdppiddpfdcfddpdttfcttcc
+F-H3-1340 4 cfppdfdpeedgedffdcefttdettpd
+F-H3-1341 4 qrorprpqqqkqnqppqppodpttpdttdd
+F-H3-1342 3 orpqoqnqqpmqppopnpdplpoonopmttpdttdd
+F-H3-1343 2 lpopqpdpcfpdttfdttdd
+F-H3-1344 4 dccfppgddpcdefbcpdttedttcc
+F-H3-1345 3 llpqdpnqpolqnopllonlpittpdttdd
+F-H3-1346 3 jdcfppbedpgdefcdpdbcedttdcttcc
+F-H3-1347 3 onlqoqqpdpttpdttdd
+F-H3-1348 4 fdppiddpddcfttpdttfc
+F-H3-1349 3 qmnqpqopoqdpqpnmttpdttdd
+F-H3-1350 2 rrqrrqpqqqoqppmpdpqkqottpdttdd
+F-H3-1351 2 mcdgppcedpcdpdicddbcecttccttcb
+F-H3-1352 4 mprqrroqornqnrmqqqrppqqpopppnpdppmoottpdttdd
+F-H3-1353 4 enfqqqqpopcndpdmdnttpdttdd
+F-H3-1354 2 nroqoroppqdpplpottpdttdd
+F-H3-1355 2 gfeeppeddpcdefdcdfttdettpd
+F-H3-1356 4 qnorqrpqproqqqkqnqppqppodpttpdttdd
+F-H3-1357 2 iprrrqoroqnrnqqqmqpqlqopkqnpjqmprplpqpkpppjpdppmoottpdttdd
+F-H3-1358 2 bcppcfdpgdefcdpdttedttcc
+F-H3-1359 4 kprqrroqornqnrmqqqlqpqkqoprpnpqpmppplpdppmoottpdttdd
+F-H3-1360 3 gpfpfqdpqpdjttpdttdd
+F-H3-1361 3 ofdppqqnqfqhttpdttdd
+F-H3-1362 4 cceeppjddpddcfttpdttfc
+F-H3-1363 2 npdppqpopkqgttpdttdd
+F-H3-1364 4 dccgppcddpgcfebcpdttedttcc
+F-H3-1365 3 chppcgdpdfdgdecfcebfedbettpdttcd
+F-H3-1366 4 noprpqornqoqopqpmpppdpnppoqooottpdttdd
+F-H3-1367 4 mrqrprqqpqrpppqprompqodprnpopnooplqnttpdttdd
+F-H3-1368 2 kopqdpmqpokpnopllomlpittpdttdd
+F-H3-1369 2 qrprpqoqppopoodpplpottpdttdd
+F-H3-1370 3 lpdppqponqnoplpittpdttdd
+F-H3-1371 4 beppdfdpcfdgeecgedffdcefttdettpd
+F-H3-1372 2 dfqpdpcfchfcpdttjdttdd
+F-H3-1373 2 ncppdmjpdedpttpjttpd
+F-H3-1374 4 kpqqqppqopoqnpppmpoolpnodpmoqolopopnqnttpdttdd
+F-H3-1375 4 mqrrrqoroqnrnqqqrppqqpopppnpdppmoottpdttdd
+F-H3-1376 4 lprqrroqornqnrmqqqlqpqrpopqpnpppmpdppmoottpdttdd
+F-H3-1377 2 frhqfqppdqfpcqepbqdpcecpcddjfcdfdccfttdettpd
+F-H3-1378 2 pooqdpfqdnippdttjdttdd
+F-H3-1379 4 becgppdfdpdedgcecfedbfttpdttcd
+F-H3-1380 2 pkpqmpppdpropoqooopnnoonqnmnqmompmplolttpdttdd
+F-H3-1381 3 ppqqlqnpqpdpttpdttdd
+F-H3-1382 2 cnjpfqdppodjttpdttdd
+F-H3-1383 2 rpmqpqqoqppooppmdpttpdttdd
+F-H3-1384 2 jdppdpncpjttpdttdd
+F-H3-1385 2 djqpoppompoodpnnnonmmnnlmmnkmlljqgttpdttdd
+F-H3-1386 4 qmoqkqdpqponttpdttdd
+F-H3-1387 2 oqqrorprpqqqkqnqppqppodpttpdttdd
+F-H3-1388 3 coqqfqopqpdpcnendmdnttpdttdd
+F-H3-1389 2 orprpqqqkqnqppqppodpttpdttdd
+F-H3-1390 2 mlqqrrqpqrdppqponqnoplpittpdttdd
+F-H3-1391 2 pqqqkqnqppdpttpdttdd
+F-H3-1392 2 hhppfhdpehdjbhbidgdhcgchbgeghdgfcdefttpdtted
+F-H3-1393 3 dgppeedpjdcfddpddccdttfcttcc
+F-H3-1394 4 kqrrrqoroqnrnqqqmqpqlqoprpnpqpmppplpdppmoottpdttdd
+F-H3-1395 2 romppqdppppoqooopnnoonqnplqmttpdttdd
+F-H3-1396 3 qqpqpndpttpdttdd
+F-H3-1397 3 ccefppcfdpeedgidfecdpdttedttdd
+F-H3-1398 2 qmoqqppodppnqottpdttdd
+F-H3-1399 3 ppopqppodppmoottpdttdd
+F-H3-1400 3 dfppfedpcdpdecgddcfdttedttfc
+F-H3-1401 3 qooqdpoopopnonttpdttdd
+F-H3-1402 4 pkpppjdppiqjohqiqfqhofphcfpdcdndecjddcfdttedttfc
+F-H3-1403 3 ecppiddpfdcfddpdcdfcttdcttcc
+F-H3-1404 2 qnnqppcddpttpdttfd
+F-H3-1405 3 ofdpppdjqfpittpdttdd
+F-H3-1406 2 fbfqppcqdpcneodcdettpdttfd
+F-H3-1407 2 didpppchefpdcfjdttfdttdd
+F-H3-1408 3 dcppeedpjdcfddpdttfcttcc
+F-H3-1409 2 gqkqoqqpdpqmonttpdttdd
+F-H3-1410 2 fohqfqdpoppdttjdttdd
+F-H3-1411 2 ccjdppcddpttpdttfc
+F-H3-1412 3 pmproqpqopqodpqnpnttpdttdd
+F-H3-1413 2 bpqrorprpqqqoqnqlqfqppqppodpcnqnttpdttdd
+F-H3-1414 2 rqrpqpopkpdproqoqnpottpdttdd
+F-H3-1415 4 mdppeedpdefeldpdcdkdncgdttedttlc
+F-H3-1416 3 nonqoqopqpmpppdpnpoolppmttpdttdd
+F-H3-1417 2 qfpqprnqoropoqmpqpdppppoqooottnottpdttdd
+F-H3-1418 3 oppqqpoqppdpttpdttdd
+F-H3-1419 3 opoqqpqndpttpdttdd
+F-H3-1420 2 ommppqdpppporoooqonopnqnonqmplpmttpdttdd
+F-H3-1421 2 epfpfqdpqpgogpdjttpdttdd
+F-H3-1422 3 ccbfppbedpiddecdcettpdtted
+F-H3-1423 4 lqrrrqoroqnrnqqqmqpqrpopqpnpppmpdppmoottpdttdd
+F-H3-1424 3 lolqnqkqkpppjplpdppnnottpdttdd
+F-H3-1425 4 moqpqqoppqnpoqmpppdpooqonopopnqnttpdttdd
+F-H3-1426 3 geegppeedphddfdddecdpdttfdtted
+F-H3-1427 2 dnfqhqqpdpfopdttjdttdd
+F-H3-1428 2 fqqrorprpqqqoqnqkqqpppdppoqnttpdttdd
+F-H3-1429 2 fdppegdpefdgcfffeefecepdhdedcdddttccttbc
+F-H3-1430 4 ccidppfddpddcfttpdttfc
+F-H3-1431 4 cgdfppcfdpeedgedffdcefttdettpd
+F-H4-1 344 nqppttdpttpdttdd
+F-H4-2 45 mpppttdpttpdttdd
+F-H4-3 12 jjppttdpttpdttdd
+F-H4-4 11 jcppttdpttpdttdd
+F-H4-5 8 jpppttdpttpdttdd
+F-H4-6 6 qippttdpttpdttdd
+F-H4-7 4 pfppttdpttpdttdd
+F-H4-8 4 lpppttdpttpdttdd
+F-H4-9 309 pnnqppttdpttpdttdd
+F-H4-10 231 qnnqppttdpttpdttdd
+F-H4-11 132 qlqnppttdpttpdttdd
+F-H4-12 88 pjqfppttdpttpdttdd
+F-H4-13 83 piqfppttdpttpdttdd
+F-H4-14 43 fdfcppttdpttpdttdd
+F-H4-15 16 jdfqppttdpttpdttdd
+F-H4-16 14 qjqfppttdpttpdttdd
+F-H4-17 13 jdqfppttdpttpdttdd
+F-H4-18 13 qmnqppttdpttpdttdd
+F-H4-19 13 oqnqppttdpttpdttdd
+F-H4-20 12 qiqfppttdpttpdttdd
+F-H4-21 7 djnqppttdpttpdttdd
+F-H4-22 5 nonqppttdpttpdttdd
+F-H4-23 4 qdqfppttdpttpdttdd
+F-H4-24 4 phqfppttdpttpdttdd
+F-H4-25 53 ncppfcdpttdfttpdttdd
+F-H4-26 43 pjppqfdpttpdttndttdd
+F-H4-27 38 iqppnqdpttpnttpdttdd
+F-H4-28 37 qfppfcdpttdfttpdttdd
+F-H4-29 37 gpppnqdpttpnttpdttdd
+F-H4-30 22 qlppqfdpttpdttndttdd
+F-H4-31 15 clppfqdpttdnttpdttdd
+F-H4-32 10 fcppqfdpttpdttndttdd
+F-H4-33 8 qnppfcdpttdfttpdttdd
+F-H4-34 8 qjppqfdpttpdttndttdd
+F-H4-35 8 drppfqdpttdnttpdttdd
+F-H4-36 5 pippqfdpttpdttndttdd
+F-H4-37 4 dnppcfdpttpdttfdttdd
+F-H4-38 3 fcppnqdpttpnttpdttdd
+F-H4-39 3 idppncdpttpfttpdttdd
+F-H4-40 3 qippnqdpttpnttpdttdd
+F-H4-41 2 jdppqfdpttpdttndttdd
+F-H4-42 2 qippqfdpttpdttndttdd
+F-H4-43 2 mdppfqdpttdnttpdttdd
+F-H4-44 48 qfnqqnppttdpttpdttdd
+F-H4-45 32 qfppfcdpttcfttpdttdd
+F-H4-46 28 jpppnqdpttqnttpdttdd
+F-H4-47 22 iqppnqdpttqnttpdttdd
+F-H4-48 18 gpppnqdpttqnttpdttdd
+F-H4-49 17 lqppfqdpttcnttpdttdd
+F-H4-50 11 rdppqfdpttpdttddttnc
+F-H4-51 9 qnppfcdpttcfttpdttdd
+F-H4-52 5 gdppnqdpttqnttpdttdd
+F-H4-53 4 qjppqfdpttpdttddttnc
+F-H4-54 4 dnppcfdpttpdttddttfc
+F-H4-55 4 fcppnqdpttqnttpdttdd
+F-H4-56 3 mpppqfdpttpdttddttnc
+F-H4-57 2 clppfqdpttcnttpdttdd
+F-H4-58 2 iqppfqdpttcnttpdttdd
+F-H4-59 2 pippqfdpttpdttddttnc
+F-H4-60 63 enppcndpttclttpdttdd
+F-H4-61 22 phppqfdpttqhttpdttdd
+F-H4-62 20 ndppqfdpttqhttpdttdd
+F-H4-63 20 ncppqfdpttqhttpdttdd
+F-H4-64 10 ccppfcdpttpdttddtthc
+F-H4-65 7 molqnqppttdpttpdttdd
+F-H4-66 6 qnppfcdpttpdttddtthc
+F-H4-67 4 fcppqfdpttqhttpdttdd
+F-H4-68 4 cfppqfdpttqhttpdttdd
+F-H4-69 3 pghqfqppttdpttpdttdd
+F-H4-70 3 cnppqfdpttqhttpdttdd
+F-H4-71 3 qfppqndpttqlttpdttdd
+F-H4-72 2 neppqfdpttqhttpdttdd
+F-H4-73 56 ncppqfdpttpjttpdttdd
+F-H4-74 29 pnppnqjpttdpttpdttdd
+F-H4-75 18 mdppqfdpttpjttpdttdd
+F-H4-76 3 feppfcdpttpdttjdttdd
+F-H4-77 2 chppcfdpttdjttpdttdd
+F-H4-78 2 gpppnqjpttdpttpdttdd
+F-H4-79 2 cnppqfdpttpjttpdttdd
+F-H4-80 2 nqppqfdpttpjttpdttdd
+F-H4-81 2 ncppfcdpttpdttjdttdd
+F-H4-82 46 qnppnqkpttdpttpdttdd
+F-H4-83 19 ofppqfdpttpittpdttdd
+F-H4-84 14 dnppfqipttdpttpdttdd
+F-H4-85 4 hoppfqipttdpttpdttdd
+F-H4-86 3 pmppqfdpttpittpdttdd
+F-H4-87 3 fcppqfdpttpittpdttdd
+F-H4-88 2 pmppnqkpttdpttpdttdd
+F-H4-89 56 fpenppcndpttclttpdttdd
+F-H4-90 8 ncqfppofdpttqhttpdttdd
+F-H4-91 41 jdncppfcdpttdfttpdttdd
+F-H4-92 28 pfncppfcdpttdfttpdttdd
+F-H4-93 7 nqqnppqfdpttpdttndttdd
+F-H4-94 6 lcncppfcdpttdfttpdttdd
+F-H4-95 4 jqnqppfqdpttdnttpdttdd
+F-H4-96 4 dicnppcffpttdpttpdttdd
+F-H4-97 2 pnqnppqfdpttpdttndttdd
+F-H4-98 2 eqnqppfqdpttdnttpdttdd
+F-H4-99 2 pbncppfcdpttdfttpdttdd
+F-H4-100 34 dkppenfpcndpttclttpdttdd
+F-H4-101 6 nqhqfqppfodpttdnttpdttdd
+F-H4-102 4 fmhqfqppfodpttdnttpdttdd
+F-H4-103 4 pmppqfdpofqhttpdttndttdd
+F-H4-104 4 qkppqfdpofqhttpdttndttdd
+F-H4-105 4 rdppqfdpofqhttpdttndttdd
+F-H4-106 3 jqhqfqppfodpttdnttpdttdd
+F-H4-107 3 heppfedpfcdfttpdttddtthc
+F-H4-108 2 dippenfpcndpttclttpdttdd
+F-H4-109 2 pnppqfdpofqhttpdttndttdd
+F-H4-110 34 jdncppfcdpttcfttpdttdd
+F-H4-111 28 ncqnnqqfppttdpttpdttdd
+F-H4-112 13 chcnfqcfppttdpttpdttdd
+F-H4-113 8 pkqnppqfdpttpdttddttnc
+F-H4-114 7 jqnqppfqdpttcnttpdttdd
+F-H4-115 5 npqnppqfdpttpdttddttnc
+F-H4-116 3 fpnqppfqdpttqnttpdttdd
+F-H4-117 3 lqnqppfqdpttqnttpdttdd
+F-H4-118 31 dngpppttdpttpdttdd
+F-H4-119 9 pmmpppttdpttpdttdd
+F-H4-120 8 jpmpppttdpttpdttdd
+F-H4-121 8 cedgppttdpttpdttdd
+F-H4-122 6 ncpgppttdpttpdttdd
+F-H4-123 4 djpgppttdpttpdttdd
+F-H4-124 3 jppgppttdpttpdttdd
+F-H4-125 2 mcpgppttdpttpdttdd
+F-H4-126 2 jdpgppttdpttpdttdd
+F-H4-127 26 dnnqppgpdpttpnttpdttdd
+F-H4-128 16 pjpmppqfdpttpdttndttdd
+F-H4-129 5 idmdppfcdpttdfttpdttdd
+F-H4-130 4 qmfqppmpdpttdnttpdttdd
+F-H4-131 3 eqnqppgpdpttpnttpdttdd
+F-H4-132 3 qnpmppqfdpttpdttndttdd
+F-H4-133 2 nqpmppqfdpttpdttndttdd
+F-H4-134 23 ndqfppncdpttpjttpdttdd
+F-H4-135 20 oonqppqnjpttdpttpdttdd
+F-H4-136 14 npnqppqnjpttdpttpdttdd
+F-H4-137 17 mqkqppfqdpttdnttpdttdd
+F-H4-138 11 djqkppqfdpttpdttndttdd
+F-H4-139 10 qnqkppqfdpttpdttndttdd
+F-H4-140 5 qjnqppiqdpttpnttpdttdd
+F-H4-141 4 jpqkppqfdpttpdttndttdd
+F-H4-142 3 rdqkppqfdpttpdttndttdd
+F-H4-143 3 qhqkppqfdpttpdttndttdd
+F-H4-144 2 qmkqppfqdpttdnttpdttdd
+F-H4-145 2 qiqkppqfdpttpdttndttdd
+F-H4-146 2 cnnqppiqdpttpnttpdttdd
+F-H4-147 2 jdqkppqfdpttpdttndttdd
+F-H4-148 2 eqkqppfqdpttdnttpdttdd
+F-H4-149 18 jdfqppjpdpttdnttpdttdd
+F-H4-150 15 gqnqppjpdpttpnttpdttdd
+F-H4-151 13 qlpjppqfdpttpdttndttdd
+F-H4-152 4 ncjdppfcdpttdfttpdttdd
+F-H4-153 4 jcdjppcfdpttpdttfdttdd
+F-H4-154 2 pjjdppncdpttpfttpdttdd
+F-H4-155 2 jppjppqfdpttpdttndttdd
+F-H4-156 2 gofqppjpdpttdnttpdttdd
+F-H4-157 38 ncqfppfcdpttdfttpdttdd
+F-H4-158 11 pnnqppqfdpttpdttndttdd
+F-H4-159 6 mqfqppqndpttdnttpdttdd
+F-H4-160 3 jdqfppfcdpttdfttpdttdd
+F-H4-161 2 qjnqppqfdpttpdttndttdd
+F-H4-162 2 lqnqppqfdpttpdttndttdd
+F-H4-163 49 gdppfcdpttpdttfdttdd
+F-H4-164 31 fegdppfcdpttpdttfdttdd
+F-H4-165 7 gegdppfcdpttpdttfdttdd
+F-H4-166 6 oqnqppmpnpttdpttpdttdd
+F-H4-167 16 dlenppcnfpdkdpttclttpdttdd
+F-H4-168 15 ckenppcnfpdkdpttclttpdttdd
+F-H4-169 4 qepippqfdpofqhttpdttndttdd
+F-H4-170 24 npnqppqnkpttdpttpdttdd
+F-H4-171 13 dfcfppfcdpttpdttidttdd
+F-H4-172 8 eofqppcnipttdpttpdttdd
+F-H4-173 14 qfppncdpfcdfttpdttjdttdd
+F-H4-174 12 npppqndpqfpjttpdttndttdd
+F-H4-175 3 mpppqndpqfpjttpdttndttdd
+F-H4-176 2 noppnqjpfqdpttdnttpdttdd
+F-H4-177 2 qlppqndpqfpjttpdttndttdd
+F-H4-178 2 jnppnqjpfqdpttpnttpdttdd
+F-H4-179 28 ecppgddpfcfettpdttfdttdd
+F-H4-180 8 qdpppgdpqfpfttofttpdttdd
+F-H4-181 5 repppgdpqfpfttofttpdttdd
+F-H4-182 14 qlppnqdpgppnttdnttpdttdd
+F-H4-183 6 lqpppmnpqfdpttpdttndttdd
+F-H4-184 3 jpppnqdpgppnttdnttpdttdd
+F-H4-185 2 fqpppmnpqfdpttpdttndttdd
+F-H4-186 2 jdppnqdpgppnttdnttpdttdd
+F-H4-187 2 bdppdmfpcfdpttpdttfdttdd
+F-H4-188 2 fcpppmnpqfdpttpdttndttdd
+F-H4-189 2 mnppnqdpgppnttdnttpdttdd
+F-H4-190 36 ncqfppfcdpttcfttpdttdd
+F-H4-191 3 lqnqppqfdpttpdttddttnc
+F-H4-192 3 ndqfppfcdpttcfttpdttdd
+F-H4-193 2 jqnqppqfdpttpdttddttnc
+F-H4-194 2 qmnqppqfdpttpdttddttnc
+F-H4-195 9 qnqlppqfdpttpdttndttdd
+F-H4-196 5 djqlppqfdpttpdttndttdd
+F-H4-197 5 piqlppqfdpttpdttndttdd
+F-H4-198 3 eqnqpphqdpttpnttpdttdd
+F-H4-199 2 drlqppfqdpttdnttpdttdd
+F-H4-200 2 djlqppfqdpttdnttpdttdd
+F-H4-201 2 fdcnppchfpttdpttpdttdd
+F-H4-202 2 qhqlppqfdpttpdttndttdd
+F-H4-203 2 kqnqpphqdpttpnttpdttdd
+F-H4-204 2 mqqlppqfdpttpdttndttdd
+F-H4-205 15 hqnqppjpdpttqnttpdttdd
+F-H4-206 12 qmpjppqfdpttpdttddttnc
+F-H4-207 9 jdnqppjpdpttqnttpdttdd
+F-H4-208 4 fqnqppjpdpttqnttpdttdd
+F-H4-209 8 lqnqfqppqndpttdnttpdttdd
+F-H4-210 7 nqppqfdpfcdfttpdttddttnc
+F-H4-211 6 fqppnqdpqfqnttpdttndttdd
+F-H4-212 3 cnppqfdpfcdfttpdttddttnc
+F-H4-213 2 gpppnqdpqfqnttpdttndttdd
+F-H4-214 23 elppenfpcndpdkdlttclttpdttdd
+F-H4-215 13 ckenppcnfpeldpdkdlttclttpdttdd
+F-H4-216 3 oipippohdpqfqhofphttpdttndttdd
+F-H4-217 21 qlpkpppjdppiqjohqiqfqhofphttpdttndttdd
+F-H4-218 2 gpfqjqkpiqjphqippphohpfodpttdnttpdttdd
+F-H4-219 12 nqppgpdpttdnttpdttdd
+F-H4-220 3 nqpppgdpttpdttndttdd
+F-H4-221 2 fqpppgdpttpdttndttdd
+F-H4-222 2 qipppmnpttdpttpdttdd
+F-H4-223 11 nqppqfdpfccfttpdttddttnc
+F-H4-224 6 qnppqfdpfccfttpdttddttnc
+F-H4-225 2 lcppqfdpfccfttpdttddttnc
+F-H4-226 2 gpppnqdpqfqnttpdttddttnc
+F-H4-227 19 cjenppcnfpeldpdkdldjclttckttpdttdd
+F-H4-228 23 dcgdppfcdpecfettpdttfdttdd
+F-H4-229 11 nqppqndpqfpjttpdttddttnc
+F-H4-230 8 npppqndpqfpjttpdttddttnc
+F-H4-231 2 noppnqjpfqdpttcnttpdttdd
+F-H4-232 2 jfppncdpfccfttpdttjdttdd
+F-H4-233 29 mdppqfdpncpjttpdttndttdd
+F-H4-234 2 qqppnqjpqndpttpnttpdttdd
+F-H4-235 14 jqpqoqppnqnpmpdpttnottpdttdd
+F-H4-236 4 qnpppgdpqfpfqeofttqdttpdttdd
+F-H4-237 3 qfppgddpfcfeecpdttfdttddttdc
+F-H4-238 2 hcppgddpfcfeecpdttfdttddttdc
+F-H4-239 2 cfppgddpfcfeecpdttfdttddttdc
+F-H4-240 22 pkpppjdppiqjohqiqfqhofphttpdttndttdd
+F-H4-241 21 neqfppmddpncpjttpdttndttdd
+F-H4-242 19 qcppqfdpncpittpfttpdttdd
+F-H4-243 11 pmppnqdpqnpnttpkttpdttdd
+F-H4-244 22 piphppqfdpttqhttpdttdd
+F-H4-245 6 cidhppcfdpttchttpdttdd
+F-H4-246 10 pcppqfdpmdpjncnettpdttndttdd
+F-H4-247 10 cqppfqjpcndpdmenttdnttpdttdd
+F-H4-248 8 ocppqfdpmdpjncnettpdttndttdd
+F-H4-249 11 molqfqjqkpiqjphqippphohpfodpttdnttpdttdd
+F-H4-250 5 lcpppkdppjqlpiqjohqiqfqhofphttpdttndttdd
+F-H4-251 3 mplqnqkqkpjqjphqipppnolplodpttpnttpdttdd
+F-H4-252 2 qolqnqkqkpjqjphqipppnolplodpttpnttpdttdd
+F-H4-253 16 jdnqppfqdpjppnttdnttpdttdd
+F-H4-254 5 qjjdppncdpfcpfttdfttpdttdd
+F-H4-255 3 qoqnpppjnpqfdpttpdttndttdd
+F-H4-256 10 gqnqppiqdpttqnttpdttdd
+F-H4-257 8 qnqkppqfdpttpdttddttnc
+F-H4-258 6 jpncppicdpttqfttpdttdd
+F-H4-259 3 pjkqppfqdpttcnttpdttdd
+F-H4-260 2 nqqkppqfdpttpdttddttnc
+F-H4-261 15 pjnqqnppqfdpttpdttddttnc
+F-H4-262 2 cfnqqnppqfdpttpdttddttnc
+F-H4-263 24 jdppncdpfcpfttdfttpdttdd
+F-H4-264 15 ncppqfdpttqjttpdttdd
+F-H4-265 9 ndppqfdpttqjttpdttdd
+F-H4-266 3 jojqfqppttdpttpdttdd
+F-H4-267 2 mdppqfdpttqjttpdttdd
+F-H4-268 16 npnqpppnjpttdpttpdttdd
+F-H4-269 6 neqfppnddpttpjttpdttdd
+F-H4-270 5 oonpppqndpttpjttpdttdd
+F-H4-271 2 ncqfppnddpttpjttpdttdd
+F-H4-272 8 pjpmppqfdpttpdttddttnc
+F-H4-273 5 dnnqppgpdpttqnttpdttdd
+F-H4-274 4 qhpmppqfdpttpdttddttnc
+F-H4-275 4 dmnqppgpdpttqnttpdttdd
+F-H4-276 4 nqpmppqfdpttpdttddttnc
+F-H4-277 3 pipmppqfdpttpdttddttnc
+F-H4-278 11 qnqlppqfdpttpdttddttnc
+F-H4-279 5 hqlqppfqdpttcnttpdttdd
+F-H4-280 3 iplqppfqdpttcnttpdttdd
+F-H4-281 3 djqlppqfdpttpdttddttnc
+F-H4-282 2 qiqlppqfdpttpdttddttnc
+F-H4-283 20 qcppqfdpncpjttoettpdttdd
+F-H4-284 15 djqnnqpjppqfdpttpdttddttnc
+F-H4-285 3 hqnqppfqdpjpqnttcnttpdttdd
+F-H4-286 3 jcnqppfqdpjpqnttcnttpdttdd
+F-H4-287 2 dbjdppncdpfcqfttcfttpdttdd
+F-H4-288 16 jpiqfqhqippphohpfodpttdnttpdttdd
+F-H4-289 11 gdpphddpfcpdttidttddtthc
+F-H4-290 6 olppqndpplqlttpkttpdttdd
+F-H4-291 5 ndphppttdpttpdttdd
+F-H4-292 4 djphppttdpttpdttdd
+F-H4-293 3 qfphppttdpttpdttdd
+F-H4-294 2 nplpppttdpttpdttdd
+F-H4-295 2 pmlpppttdpttpdttdd
+F-H4-296 2 mcphppttdpttpdttdd
+F-H4-297 15 qlppnqdpfqpnjpdnttpdttjdttdd
+F-H4-298 4 cippnqdpfqpnjpdnttpdttjdttdd
+F-H4-299 3 cnppjdjpncdpfcpfttdfttpdttdd
+F-H4-300 13 pfqfppncdpfcdfttpdttjdttdd
+F-H4-301 7 fdcfppncdpfcpfttpdttjdttdd
+F-H4-302 2 oonqppqndpqfpjttpdttndttdd
+F-H4-303 7 jdkqppttdpttpdttdd
+F-H4-304 4 cgckppttdpttpdttdd
+F-H4-305 4 gqiqppttdpttpdttdd
+F-H4-306 3 fqiqppttdpttpdttdd
+F-H4-307 2 ickcppttdpttpdttdd
+F-H4-308 20 ndqfppofdpttpittpdttdd
+F-H4-309 16 pqqqppnqjpqndpttoottpdttdd
+F-H4-310 2 jpqfppqcdpncpjttoettpdttdd
+F-H4-311 4 cnppefdpcfdittpdttfdttdd
+F-H4-312 4 mpppfqipfodpttdnttpdttdd
+F-H4-313 4 rdppqfdpofpittpdttndttdd
+F-H4-314 3 nmppnqkpnodpttpnttpdttdd
+F-H4-315 2 pippqnnpondpttpkttpdttdd
+F-H4-316 2 plppqfdpofpittpdttndttdd
+F-H4-317 10 nqppfqdpjpdnttpdttjdttdd
+F-H4-318 4 qhppjdjpncdpttpfttpdttdd
+F-H4-319 3 cfppnqdpjppnttpdttjdttdd
+F-H4-320 9 jdgdppncdpttdfttpdttdd
+F-H4-321 8 pnnqppgpdpttdnttpdttdd
+F-H4-322 4 qnnqppgpdpttdnttpdttdd
+F-H4-323 3 pkqnpppgdpttpdttndttdd
+F-H4-324 11 qinqppgpdpqlpnttdnttpdttdd
+F-H4-325 10 cpfqppcqipcnfpttdpttpdttdd
+F-H4-326 6 qeqfppqcdpncpittpfttpdttdd
+F-H4-327 2 qdqfppqcdpncpittpfttpdttdd
+F-H4-328 18 qppqqqppnqjpqndpttoottpdttdd
+F-H4-329 4 chppjddpfcdfttpdttddttmc
+F-H4-330 4 cfgqnqppjpdpttpnttpdttdd
+F-H4-331 3 cnpppjdpqfqmttpdttndttdd
+F-H4-332 2 fcmqfqppjpdpttdnttpdttdd
+F-H4-333 2 qigqnqppjpdpttpnttpdttdd
+F-H4-334 8 pmqqpqnqppqpjpqndpttoottpdttdd
+F-H4-335 7 omqqpqnqppqpjpqndpttoottpdttdd
+F-H4-336 9 icqfpplcdpttpdttndttdd
+F-H4-337 5 qjqhppncdpttpfttpdttdd
+F-H4-338 2 qjqfpplcdpttpdttndttdd
+F-H4-339 8 ndogppttdpttpdttdd
+F-H4-340 4 mdogppttdpttpdttdd
+F-H4-341 2 oeogppttdpttpdttdd
+F-H4-342 12 pfqfppncdpttqhttpdttdd
+F-H4-343 6 pnnqlqqnppttdpttpdttdd
+F-H4-344 3 eofqppcndpttclttpdttdd
+F-H4-345 13 pfqfppnddpttqhttpdttdd
+F-H4-346 3 oeqfppnddpttqhttpdttdd
+F-H4-347 2 onnqlqpnppttdpttpdttdd
+F-H4-348 12 pfqfppmddpttpjttpdttdd
+F-H4-349 8 oeqfppmddpttpjttpdttdd
+F-H4-350 11 fcnqqnpppjdpqfdjttpdttddttnc
+F-H4-351 2 fqppjdjpncdpfcqfttcfttpdttdd
+F-H4-352 4 qgqjpppgdpqfpfqeofttqdttpdttdd
+F-H4-353 2 qjoqpqnqppjqnpmpdpttnottpdttdd
+F-H4-354 2 mooqpqnqppjqnpmpdpttnottpdttdd
+F-H4-355 2 cmcjppdgdpcfefcedfttpdttddttcd
+F-H4-356 2 pmoqpqnqppjqnpmpdpttnottpdttdd
+F-H4-357 2 ndqjpppgdpqfpfqeofttqdttpdttdd
+F-H4-358 8 mqfqlqkpjqjpiqiphqmopphohpfodpttdnttpdttdd
+F-H4-359 2 monqlqkpkqjpjqiphqnopplolpgodpttpnttpdttdd
+F-H4-360 2 pgompppkdppjqlpiqjohqiqfqhofphttpdttndttdd
+F-H4-361 6 nqppfqdpttcmttpdttdd
+F-H4-362 3 nqppqfdpttpdttddttmc
+F-H4-363 3 iqppnqdpttqmttpdttdd
+F-H4-364 2 pmppqfdpttpdttddttmc
+F-H4-365 4 clmqkqppfqdpttdnttpdttdd
+F-H4-366 3 qnmqkqppfqdpttdnttpdttdd
+F-H4-367 2 drmqkqppfqdpttdnttpdttdd
+F-H4-368 2 okppqkdpqfqmttpdttndttdd
+F-H4-369 15 djppenfpcndpdkclttckttpdttdd
+F-H4-370 6 pkpmppqfdpofqhttpdttndttdd
+F-H4-371 4 ohpmppqfdpofqhttpdttndttdd
+F-H4-372 3 qkpmppqfdpofqhttpdttndttdd
+F-H4-373 2 nppmppqfdpofqhttpdttndttdd
+F-H4-374 7 nqpppmdpqfpjttpdttndttdd
+F-H4-375 4 njpppmdpqfpjttpdttndttdd
+F-H4-376 4 nppppmdpqfpjttpdttndttdd
+F-H4-377 9 dlenppcnfpdkdpdjclttckttpdttdd
+F-H4-378 8 qjpjpppidpqfqiofqhttpdttndttdd
+F-H4-379 6 bpnqfqhqppcndpttpnttpdttdd
+F-H4-380 2 idqfpplcdpfcdfttpdttddttnc
+F-H4-381 2 reqfpplcdpfcdfttpdttddttnc
+F-H4-382 2 neqfpplcdpfcdfttpdttddttnc
+F-H4-383 9 djjjppttdpttpdttdd
+F-H4-384 3 fcjjppttdpttpdttdd
+F-H4-385 10 pgppqfdpncpffcdfttpdttjdttdd
+F-H4-386 11 dcfcppccdpttpdttddtthc
+F-H4-387 2 cdfcppccdpttpdttddtthc
+F-H4-388 7 pnnqppfqdpjpdnttpdttjdttdd
+F-H4-389 3 cfjdppncjpfcdpttpfttpdttdd
+F-H4-390 2 pnqnpppjdpqfdjttpdttndttdd
+F-H4-391 11 hcqnnqpjppqfdpfcdjttpdttddttnc
+F-H4-392 3 ndnqppfqdpjpqnqfcnttpdttjdttdd
+F-H4-393 9 pnnqoqnpppttdpttpdttdd
+F-H4-394 3 qfndppncdpttpdttddttoc
+F-H4-395 16 mpppnqnppnjpttdpttpdttdd
+F-H4-396 17 npoqnqppttdpttpdttdd
+F-H4-397 8 jchdppgddpfcpdttidttddtthc
+F-H4-398 3 qiphpppgdpqfpittqhttpdttdd
+F-H4-399 2 dfhdppgddpfcpdttidttddtthc
+F-H4-400 13 ofpgppqfdpncpffcdfttpdttjdttdd
+F-H4-401 6 qepppgdpqfpfncoffcdfttpdttjdttdd
+F-H4-402 3 qdpppgdpqfpfncoffcdfttpdttjdttdd
+F-H4-403 3 qqppnqnpmpdpqnnoqfpjttpdttndttdd
+F-H4-404 12 cqppfqipcndptteottpdttdd
+F-H4-405 9 qlppnqdpqfpnttpdttndttdd
+F-H4-406 2 qjppnqdpqfpnttpdttndttdd
+F-H4-407 11 decdppfcdpccpdttddtthcttdc
+F-H4-408 3 cnppfqdpttpdttjdttdd
+F-H4-409 3 cfppncjpttdpttpdttdd
+F-H4-410 3 ndppqfdpttdjttpdttdd
+F-H4-411 2 fqppqfdpttdjttpdttdd
+F-H4-412 13 mpppnqnpqnjpttdpttpdttdd
+F-H4-413 3 qcppqfdpncpdttndttjdttdd
+F-H4-414 7 ndqfppncdpttqjttpdttdd
+F-H4-415 3 oeqfppncdpttqjttpdttdd
+F-H4-416 2 npnqjqqnppttdpttpdttdd
+F-H4-417 8 dqfqppcqipcndptteottpdttdd
+F-H4-418 5 mdppqfdpttpdttjdttdd
+F-H4-419 4 ndppqfdpttpdttjdttdd
+F-H4-420 3 qnppnqdpttpjttpdttdd
+F-H4-421 3 nqppqfdpttpdttjdttdd
+F-H4-422 4 cinqppfqdpjppncldnttpdttjdttdd
+F-H4-423 4 omnqppfqdpjppnqldnttpdttjdttdd
+F-H4-424 10 fpfqppdnipttdpttpdttdd
+F-H4-425 2 enfqppdnipttdpttpdttdd
+F-H4-426 7 pnnpppqndpqfpjttpdttndttdd
+F-H4-427 4 oonqppfqjppndpttdnttpdttdd
+F-H4-428 4 nonpppqndpqfpjttpdttndttdd
+F-H4-429 8 ohppqhdpgdqkncpfttdfttpdttdd
+F-H4-430 2 oippnqdpgppnqldnttqittpdttdd
+F-H4-431 15 nonqppmpnppnjpttdpttpdttdd
+F-H4-432 6 pfqfppncdpfccfttpdttjdttdd
+F-H4-433 5 oonqppqndpqfpjttpdttddttnc
+F-H4-434 5 pnnqppqndpqfpjttpdttddttnc
+F-H4-435 5 fchqnqppjpdpttqnttpdttdd
+F-H4-436 3 cfhqnqppjpdpttqnttpdttdd
+F-H4-437 2 cfppjddpncqfttpdttddtthc
+F-H4-438 2 lolqfqppjpdpttcnttpdttdd
+F-H4-439 2 ogqipppidpohoiqfqhofphttpdttndttdd
+F-H4-440 2 bidippcidpeheiefdhcfchttpdttfdttdd
+F-H4-441 12 pgppqfdpndqhttpfttpdttdd
+F-H4-442 2 cqppfpdpcndnttclttpdttdd
+F-H4-443 2 pcppqfdpndqhttpfttpdttdd
+F-H4-444 8 cdppfcdpccpdttddtthcttdc
+F-H4-445 13 oqppnqnpmpjppndpttnottpdttdd
+F-H4-446 6 qipppidpohoiqfqhofphttpdttndttdd
+F-H4-447 11 cpdqfqppcqipcndptteottpdttdd
+F-H4-448 4 dmfqdqcqppcpipcndptteottpdttdd
+F-H4-449 3 moqqqppqppnqdpqnoottpkttpdttdd
+F-H4-450 7 jpjdppttdpttpdttdd
+F-H4-451 2 gqjpppttdpttpdttdd
+F-H4-452 2 pjjpppttdpttpdttdd
+F-H4-453 8 cbppcddpfcdeccpddbddtthcttdctteb
+F-H4-454 7 nqppqkdpqfdjttpdttndttdd
+F-H4-455 11 ebcdppfcdpccdedbpdttddtthcttdc
+F-H4-456 11 eccdppfcdpccdedbpdcbddtthcttdctteb
+F-H4-457 5 cnfqppqfdpttpdttddttnc
+F-H4-458 3 pkqnppfcdpttcfttpdttdd
+F-H4-459 2 qjfqppqfdpttcnttpdttdd
+F-H4-460 8 jpjcppttdpttpdttdd
+F-H4-461 2 djjqppttdpttpdttdd
+F-H4-462 7 gpppfqipcqfpcndpttcpttpdttdd
+F-H4-463 6 pqqpqqppnqnpqnkpttdpttpdttdd
+F-H4-464 8 dbppcddpfcdeccpdttddtthcttdc
+F-H4-465 4 rhppqidppioiohqhnhphngpgqfogofpfttpdttndttdd
+F-H4-466 13 pooqppnqnpmpjppndpttnottpdttdd
+F-H4-467 7 fqpppjdpqfqmttpdttddttnc
+F-H4-468 4 fcgqnqppjpdpttqnttpdttdd
+F-H4-469 2 cfpppjdpqfqmttpdttddttnc
+F-H4-470 4 qjppqfdppfqettpdttndttdd
+F-H4-471 3 mdppfddpfcdfttpdttddttec
+F-H4-472 2 cnoqnqppnpdpttpnttpdttdd
+F-H4-473 2 jpoqnqppnpdpttpnttpdttdd
+F-H4-474 9 qcqfpprddpttpdttddttnc
+F-H4-475 5 npqnppfcdpttdfttpdttdd
+F-H4-476 3 dinqppcfdpttpnttpdttdd
+F-H4-477 2 cinqppcfdpttpnttpdttdd
+F-H4-478 2 jpfqppqfdpttpdttndttdd
+F-H4-479 4 nhppqidppioiohqhqfphofogttpdttndttdd
+F-H4-480 11 nonqppmpnpqnjpttdpttpdttdd
+F-H4-481 5 eqppfqjpgpfpcndpttfottpdttdd
+F-H4-482 4 pqppnqnpmpjpqndpttnottpdttdd
+F-H4-483 4 cqppfqjpgpfpcndpttfottpdttdd
+F-H4-484 13 efdgppcfdpfcdfttpdttidttdd
+F-H4-485 10 qcppqfdpncqhttpfttpdttdd
+F-H4-486 4 pmppnqdpqnpnttqlttpdttdd
+F-H4-487 8 cfppcddpfcdeccpddbddcbhcttecttdctteb
+F-H4-488 7 ccppdgdpcfeffcdfttpdttidttdd
+F-H4-489 3 ocppqfdpmdpincnettpdttndttdd
+F-H4-490 2 dqppfqfpgpdpcnfottdkttpdttdd
+F-H4-491 12 dgppcfdpfcdfttpdttidttdd
+F-H4-492 7 ndppqfdpqcpjpcoencqdttpdttmdttdd
+F-H4-493 3 popqqqppnqjpqpdpqnoottpmttpdttdd
+F-H4-494 2 cmdqfqppcqjpcpdpcneottdmttpdttdd
+F-H4-495 4 cnnqppfqdpqfqnttpdttddttnc
+F-H4-496 4 ipnqppfqdpqfqnttpdttddttnc
+F-H4-497 2 dnnqppfqdpqfqnttpdttddttnc
+F-H4-498 4 djqrorprpqqqoqnqlqqpppqndpttpottpdttdd
+F-H4-499 3 meqfpprddprcqhqcrepcqencqdttpdttodttdd
+F-H4-500 2 npqrorprpqqqoqnqlqqpppqndpttpottpdttdd
+F-H4-501 3 rgppqidppioirhqhohphnhpgngogqfpfofqettpdttndttdd
+F-H4-502 6 ocqfppmddppcpjncnettpdttndttdd
+F-H4-503 3 oiohppqfdpttpittpdttdd
+F-H4-504 3 ndohppqfdpttpittpdttdd
+F-H4-505 3 pfohppqfdpttpittpdttdd
+F-H4-506 2 qeohppqfdpttpittpdttdd
+F-H4-507 6 crppfqjpeqfpgpdpdnfottdottpdttdd
+F-H4-508 4 pqppoqnpnqjpmpdppnpottnottpdttdd
+F-H4-509 2 qqppoqnpnqjpmpdppnpottnottpdttdd
+F-H4-510 5 qqppnqdpqnpnpmonttpkttpdttdd
+F-H4-511 4 oqppnqnpmpkpqndpttnottpdttdd
+F-H4-512 3 dqppfqipgpfpcndpttfottpdttdd
+F-H4-513 7 pnnpppqndpqfpjttpdttddttnc
+F-H4-514 4 onnqppfqjppndpttcnttpdttdd
+F-H4-515 2 oonpppqndpqfpjttpdttddttnc
+F-H4-516 11 onnqppqndppmpnttpkttpdttdd
+F-H4-517 4 lcpppjdpqfqlttpdttndttdd
+F-H4-518 2 olpppjdpqfqlttpdttndttdd
+F-H4-519 10 gpppfqipdnfpttdpttpdttdd
+F-H4-520 3 ccnqqnpppjdpqfdjfcpdttddttnctthc
+F-H4-521 2 ofppnqdpfqqnjpcnqfqhttpdttjdttdd
+F-H4-522 2 ndppnqdpfqqnjpcnqfqhttpdttjdttdd
+F-H4-523 2 phppnqdpfqqnjpcnqfqhttpdttjdttdd
+F-H4-524 3 ngppqidppioiohqhnhphqfogofpfttpdttndttdd
+F-H4-525 3 ndppqfdpttqittpdttdd
+F-H4-526 2 pqkqnqppttdpttpdttdd
+F-H4-527 2 ofppqfdpttqittpdttdd
+F-H4-528 8 effqcnppcfdpttchttpdttdd
+F-H4-529 7 pinqppqldpqfpnttpdttndttdd
+F-H4-530 3 cmcjppcfdpttpdttfdttdd
+F-H4-531 2 jcqjppqfdpttpdttndttdd
+F-H4-532 2 jpqjppqfdpttpdttndttdd
+F-H4-533 7 dfpphddpgdpdfcidttddttjctthc
+F-H4-534 4 pgpppmnpqfdplenflcpdttndttddttic
+F-H4-535 5 qdqfppmddpqcpjncnettpdttndttdd
+F-H4-536 4 cofqppcqjpcndpdmenttdnttpdttdd
+F-H4-537 4 qcqfpprddpttpdttndttdd
+F-H4-538 3 lqprppnqdpttpnttpdttdd
+F-H4-539 11 pgppqfdpmdpjttpfttpdttdd
+F-H4-540 12 ofpgppqfdpmdpjttpfttpdttdd
+F-H4-541 8 qepppgdpqfpjmdpfttofttpdttdd
+F-H4-542 2 qdpppgdpqfpjmdpfttofttpdttdd
+F-H4-543 8 pjppqnnpqfdpttpdttddttnc
+F-H4-544 11 elppenfpcndpdkdldjclttckttpdttdd
+F-H4-545 8 nfqhppohdpgdqkncpfttdfttpdttdd
+F-H4-546 7 qnnqppqfdpfccfttpdttddttnc
+F-H4-547 8 qgpgppqfdpndqhttpfttpdttdd
+F-H4-548 2 ofpgppqfdpndqhttpfttpdttdd
+F-H4-549 8 fofqppgpipdnfpttdpttpdttdd
+F-H4-550 3 qfppjqdpttpdttjdttdd
+F-H4-551 2 nqppjqdpttpdttjdttdd
+F-H4-552 2 qfppjcjpttdpttpdttdd
+F-H4-553 4 qnppjjdpttdjttpdttdd
+F-H4-554 2 qnppjjdpttpdttjdttdd
+F-H4-555 5 leppqfdplcpdttndttddttic
+F-H4-556 9 obppqfdpmdpjpcnencpdttndttddttoc
+F-H4-557 3 lcppqkdpqfqnttpdttndttdd
+F-H4-558 2 rdppqkdpqfqnttpdttndttdd
+F-H4-559 2 fqppqkdpqfqnttpdttndttdd
+F-H4-560 6 odqfppmddppcpjncneobpdttndttddttoc
+F-H4-561 3 ipnqlqppfqdpttdnttpdttdd
+F-H4-562 3 rdppqldpqfqnttpdttndttdd
+F-H4-563 2 cnfqnqpphqdpttpnttpdttdd
+F-H4-564 2 rdppqldpqfqnttpdttddttnc
+F-H4-565 2 qjnqlqppfqdpttcnttpdttdd
+F-H4-566 3 fqppmpdpttpmttpdttdd
+F-H4-567 9 pepgppqfdprepfqdofttqettpdttdd
+F-H4-568 7 qcrgpppgdpqfpfreofqdqettpettpdttdd
+F-H4-569 9 rgpppgdpqfpfreofqdqettpettpdttdd
+F-H4-570 5 eqppfqipgpfpdndpttfottpdttdd
+F-H4-571 2 qqppnqnpmpkppndpttnottpdttdd
+F-H4-572 2 dqppfqipgpfpdndpttfottpdttdd
+F-H4-573 3 cngqnqppiqdpttqnttpdttdd
+F-H4-574 2 phppqkdpqfqmttpdttddttnc
+F-H4-575 8 mbppqfdpmdpjpcnencpdobodttndttddttoc
+F-H4-576 3 hqfqppqnnpttdpttpdttdd
+F-H4-577 3 cjfqppcfdpttdnttpdttdd
+F-H4-578 2 ndnqppqfdpttpnttpdttdd
+F-H4-579 2 icqfppfcdpttpdttndttdd
+F-H4-580 8 eccfppfcdpccpdttfdttddtthc
+F-H4-581 9 mdppqfdpncqjttpdttndttdd
+F-H4-582 5 qcqfppmddppcpjncneobpdmbodttndttddttoc
+F-H4-583 4 fccfppncjpicdpttpfttpdttdd
+F-H4-584 6 poppqndppmpnttomttpdttdd
+F-H4-585 2 ohpppgdpqfogttpfttpdttdd
+F-H4-586 10 pcpppgdpqfqhndqgttpfttpdttdd
+F-H4-587 5 qippqfdprdpdttddttqcttnc
+F-H4-588 4 hqppcnfpdjdpcfpdttfdttddttjc
+F-H4-589 3 cfppnqdpfqpnjpdnttqjttpdttdd
+F-H4-590 9 qcpppgdpqfqhndqgpcpfttqettpdttdd
+F-H4-591 7 qepgppqfdpqdpfttofttpdttdd
+F-H4-592 4 odppqfdpqcpipcoencqdttpdttmdttdd
+F-H4-593 3 dndqfqppcqipcpdpcneottdmttpdttdd
+F-H4-594 6 fpdnppcfdpttpdttfdttdd
+F-H4-595 2 jpfqppnpdpttdnttpdttdd
+F-H4-596 8 pbppqfdpmdpjpcnencpdobodmbndttddttqcttoc
+F-H4-597 3 ecdfpphddpgdpdfcidttddttjctthc
+F-H4-598 3 efdfpphddpgdpdfcidttddttjctthc
+F-H4-599 2 eedfpphddpgdpdfcidttddttjctthc
+F-H4-600 2 fqpqnqppttdpttpdttdd
+F-H4-601 7 neqfppmddpncqjttpdttndttdd
+F-H4-602 2 dfppgddpttpdttjdttdd
+F-H4-603 2 fqppmpjpttdpttpdttdd
+F-H4-604 4 djqnpppjnpqfdpttpdttddttnc
+F-H4-605 3 jcqnnqpjppqfdpttpdttndttdd
+F-H4-606 2 qknqppfqdpjppnttcnttpdttdd
+F-H4-607 4 fqppnqdpjpqnttpdttjdttdd
+F-H4-608 3 cfppnqdpjpqnttpdttjdttdd
+F-H4-609 2 nqpppjdpqfdjttpdttddttnc
+F-H4-610 5 dfnqppfcdpttpnttpdttdd
+F-H4-611 8 qepgppqfdpndqhpcqgttpfttpdttdd
+F-H4-612 4 meqfppmddppcpjncnepbpdobodmbndttddttqcttoc
+F-H4-613 4 pfqfppnddpttqjttpdttdd
+F-H4-614 3 enfqjqdnppttdpttpdttdd
+F-H4-615 3 pfppncdpfcdfttpdttddttjc
+F-H4-616 2 nojqnqppfqdpttdnttpdttdd
+F-H4-617 6 qdpgppqfdpqepjmdpfttofttpdttdd
+F-H4-618 2 pfpgppmddpocnencpdttndttjdttdd
+F-H4-619 2 djqhppttdpttpdttdd
+F-H4-620 2 pflcppttdpttpdttdd
+F-H4-621 7 repppgdpqfpfqdofttqettpdttdd
+F-H4-622 6 dhppdgdpbgegcfefbedfcddebdcefcpdttjdttddttcc
+F-H4-623 4 leqfppmddpldpjqcnepcmencqdobpdmbodttndttddttoc
+F-H4-624 2 jpqfppmddpldpjqcnepcmencqdobpdmbodttndttddttoc
+F-H4-625 6 odqfppmddpqcpjpcnencqdobpdttndttddttoc
+F-H4-626 2 kpnqhqfqppfodpttdnttpdttdd
+F-H4-627 2 kqnqhqfqppfodpttdnttpdttdd
+F-H4-628 3 molqnqkqkpjqjphqipgqnopplolpgodpttpnttpdttdd
+F-H4-629 8 pcppqfdpmdpjqcnencqdttpdttndttdd
+F-H4-630 6 meqfppmddpqcpjpcnencqdobpdmbodttndttddttoc
+F-H4-631 6 cffqnqppcndpqfqnttpdttddttnc
+F-H4-632 2 cnppnqdpqfqnfccfttpdttddttnc
+F-H4-633 8 obppqfdpmdpjqcnepcqdncpdttndttddttoc
+F-H4-634 8 mbppqfdpmdpjqcnepcqdncpdobodttndttddttoc
+F-H4-635 2 lcpgppqfdpndqhqcqgpcpfttqettpdttdd
+F-H4-636 2 jdqqoqnqmqqplqmppppnnpttdpttpdttdd
+F-H4-637 2 jppgppqfdpndqhqcqgpcpfttqettpdttdd
+F-H4-638 4 jnppfqjpmpdpttcnttpdttdd
+F-H4-639 2 nqpppmdpqfpjttpdttddttnc
+F-H4-640 4 foppnqipfqdpttqnttpdttdd
+F-H4-641 2 nqppqndpqfpkttpdttddttnc
+F-H4-642 3 qeqgppttdpttpdttdd
+F-H4-643 2 npqmppttdpttpdttdd
+F-H4-644 2 cjnqgqjpppcfdpttpnttpdttdd
+F-H4-645 2 fdnqgqjpppcfdpttpnttpdttdd
+F-H4-646 4 qcppqfdpmdqjncnettpdttndttdd
+F-H4-647 4 ocppqfdpmdqjncnettpdttndttdd
+F-H4-648 8 ldppqfdpmdpjqcnepcmencqdobpdmbodttndttddttoc
+F-H4-649 6 ocqfppmddpqcpjpcnencqdttpdttndttdd
+F-H4-650 6 pcqfppmddpocpjncnettpdttndttdd
+F-H4-651 2 fqppcndpdgdjttpdttfdttdd
+F-H4-652 2 plppqndppgpjttpdttndttdd
+F-H4-653 2 neppgddpncdfttpdttjdttdd
+F-H4-654 3 qlqnppfcdpttpdttddtthc
+F-H4-655 2 nqqnppfcdpttpdttddtthc
+F-H4-656 3 lqpppmnpqfdpttpdttddttnc
+F-H4-657 7 npomppogdpttpdttndttdd
+F-H4-658 7 fdcnfqefppcfdpttchttpdttdd
+F-H4-659 3 fqcnppqfdpttqhttpdttdd
+F-H4-660 2 clcnppqfdpttqhttpdttdd
+F-H4-661 2 qmppomdppkqlpjqjpiqiohqhogphqfpgofpfttpdttndttdd
+F-H4-662 3 pjdhppdgdpbgegcfefbedfcddebdcefcpdttjdttddttcc
+F-H4-663 2 ehdhppdgdpbgegcfefbedfcddebdcefcpdttjdttddttcc
+F-H4-664 2 edcfppgddpfcpdccidttfdttddttcd
+F-H4-665 2 eqfqppcqipgpfpcndpttcpttpdttdd
+F-H4-666 5 jqlqpppmnpqfdpttpdttndttdd
+F-H4-667 2 kqhqppdmfpcfdpttpdttfdttdd
+F-H4-668 2 fcppjdjpttdpttpdttdd
+F-H4-669 2 qjprqqoroqmrpppqopnqnpmpdplpnottmottpdttdd
+F-H4-670 2 jdphpprgdppgogqfpfreofrdqeqdpettpdttddttqc
+F-H4-671 2 feppmddpfcpgttcfttpdttdd
+F-H4-672 2 ckppnqdpgpqnttdmttpdttdd
+F-H4-673 6 rdpprgdppgpfqfofreqeqdpettpdttddttqc
+F-H4-674 3 nqpppgdpttqettpdttdd
+F-H4-675 2 rfqfppqcdppcqhncpfttqettpdttdd
+F-H4-676 2 djqfppqcdppcqhncpfttqettpdttdd
+F-H4-677 3 nqqnpppgdpttpdttmdttdd
+F-H4-678 2 ndpmppqfmpttdpttpdttdd
+F-H4-679 5 qdqfppmddpqcpincnettpdttndttdd
+F-H4-680 2 cedgppcfdpfcefccdfttpdttidttdd
+F-H4-681 5 pffqppmddpttcnttpdttdd
+F-H4-682 5 qgphppohdpqfpittqhttpdttdd
+F-H4-683 2 qjqnpppldpolqlttpkttpdttdd
+F-H4-684 3 qnnqppqfdpfcdfttpdttddttnc
+F-H4-685 2 fpnqppcndpqfqnttpdttndttdd
+F-H4-686 3 drnqkqppfqdpttcnttpdttdd
+F-H4-687 2 cnppqkdpqfqnttpdttddttnc
+F-H4-688 2 qnfqcnppcidpttcfttpdttdd
+F-H4-689 2 nqppqkdpqfpdttndttjdttdd
+F-H4-690 7 pkpppjdppiqjqfqiofqhttpdttndttdd
+F-H4-691 2 omppnqdpqlpnqfpittpdttndttdd
+F-H4-692 2 lopplqnpfqipqndpttdnttpdttdd
+F-H4-693 5 pgppqfdpmdpjocnencpdttndttddttpc
+F-H4-694 3 qnppnqdpttdjttpdttdd
+F-H4-695 2 ndppqfjpttdpttpdttdd
+F-H4-696 2 pmppnqdpttdjttpdttdd
+F-H4-697 3 qmqjppqfdpttpdttddttnc
+F-H4-698 3 djqjppqfdpttpdttddttnc
+F-H4-699 2 nmpppmdpqfpkofqhttpdttndttdd
+F-H4-700 2 nqpppmdpqfpkofqhttpdttndttdd
+F-H4-701 2 pippqfdpofqhttpdttddttnc
+F-H4-702 2 pmppqfdpofqhttpdttddttnc
+F-H4-703 2 qepmpppgnpqfdplenflcpdttndttddttic
+F-H4-704 2 mgpmpppgnpqfdplenflcpdttndttddttic
+F-H4-705 6 ogrgpppgdpqfpfreofrdqeqdpettpdttddttqc
+F-H4-706 2 opqpqqpppqdpnqooqnmottpjttpdttdd
+F-H4-707 4 nfomppognpledpttpdttndttdd
+F-H4-708 8 cdppcfdpfcpdccfdttddtthcttec
+F-H4-709 3 qdqeppttdpttpdttdd
+F-H4-710 4 qcpppgdpncoettpdttjdttdd
+F-H4-711 2 phppqfdpmdpjttoettpdttdd
+F-H4-712 2 ogppomdppkqlpjqjpiqiohqhqfphofpgttpdttndttdd
+F-H4-713 6 npnqpppmdpqfpjttpdttndttdd
+F-H4-714 5 qepgppqfdpqdpfncoffcdfttpdttjdttdd
+F-H4-715 2 pfompppkdppjqlpiqjohqiogqhqfphofpgttpdttndttdd
+F-H4-716 5 hdfeppkddpjddfidpdfcddttjcttictthc
+F-H4-717 2 qlpkpppjdppiqjqfqiofqhttpdttndttdd
+F-H4-718 4 pmppnpdpqnpnqfpjttpdttddttnc
+F-H4-719 2 repppgdpqfpfqdofncdffcqettpdttjdttdd
+F-H4-720 2 nppmppqfdpofpittpdttndttdd
+F-H4-721 3 qnjqnqppfqdpttcnttpdttdd
+F-H4-722 2 dnjqnqppfqdpttqnttpdttdd
+F-H4-723 6 nfqfppledplcpdttndttddttic
+F-H4-724 3 nqpppgdpttpdttddttnc
+F-H4-725 2 qnpppgdpttpdttddttnc
+F-H4-726 3 nqerdrhqcreqfqdqcqppcpdpcndottpjttpdttdd
+F-H4-727 2 jpnqppfqdpqfqnttpdttndttdd
+F-H4-728 3 kqmqfqppqndpttdnttpdttdd
+F-H4-729 2 qlfqnqpphqdpcnbpttpnttpdttdd
+F-H4-730 6 donqppfqjpeqfpgpdpdnfottqnttpdttdd
+F-H4-731 7 onnpppqndppmpnqfpjttpdttddttnc
+F-H4-732 5 pepgppqfdprepfqdofncdffcqettpdttjdttdd
+F-H4-733 4 ldqfppofdpmfqhttpdttndttdd
+F-H4-734 3 mooqnqppmpopnonpttdpttpdttdd
+F-H4-735 7 pmppnpdpqnpnqfpjttpdttndttdd
+F-H4-736 5 qdpgppqfdpqepfncoffcdfttpdttjdttdd
+F-H4-737 4 difqcnppefdpcfchttpdttfdttdd
+F-H4-738 2 iqlqnqppfqdpnopnttcnttpdttdd
+F-H4-739 2 cfnqppfcdpttqnttpdttdd
+F-H4-740 2 goerppfqfpgpdpttfottpdttdd
+F-H4-741 2 rdpgppqfdprepfttofttpdttdd
+F-H4-742 2 qepgppqfdprepfttofttpdttdd
+F-H4-743 4 onpoppqndppmpnttomttpdttdd
+F-H4-744 5 neqfppnddpqcpjpcoencqdttpdttmdttdd
+F-H4-745 3 mepkpppjdppiqlohqjqfqiofqhlcphttpdttndttdd
+F-H4-746 2 qkogppqfdpttqhttpdttdd
+F-H4-747 2 npqnppomdpttqlttpdttdd
+F-H4-748 6 nooqnqppmpnpttdpttpdttdd
+F-H4-749 2 qpkqmqfqppqndpttdnttpdttdd
+F-H4-750 5 qoppnpdpqnpnpmonqfpjttpdttndttdd
+F-H4-751 4 qoppnpdpqnpnpmonqfpjttpdttddttnc
+F-H4-752 4 meppqfdpndpjttnettpdttdd
+F-H4-753 3 qfppkqdpttpdttjdttdd
+F-H4-754 2 ncppckdpttpjttpdttdd
+F-H4-755 2 rgpppgdpqfpfreofqddfncqefcpettpdttjdttdd
+F-H4-756 7 gdppcfdpncpffcpdttjdttfdttdd
+F-H4-757 6 fecfppgddpncpffcpdttjdttfdttdd
+F-H4-758 4 oonqppqndpttdjttpdttdd
+F-H4-759 3 cippnqdpfqqnjpdnttpdttjdttdd
+F-H4-760 7 meppqfdpndpjqcoepcnencqdttpdttmdttdd
+F-H4-761 5 oqqqqppqppnqnpqnkpttdpttpdttdd
+F-H4-762 3 qppppodpqnpnpmonttomttpdttdd
+F-H4-763 2 coppdodpcnendmdnttemttpdttdd
+F-H4-764 3 lpppnqdpttnottpdttdd
+F-H4-765 5 phpprgdppgogqfpfreofrdqeqdpettpdttddttqc
+F-H4-766 7 onnpppqndppmpnqfpjttpdttndttdd
+F-H4-767 2 qfppkqdpfqcnttpdttjdttdd
+F-H4-768 2 cnppnqdpiqqnttpdttjdttdd
+F-H4-769 3 qippqfdprdpdttndttddttqc
+F-H4-770 4 qcrgpppgdpqfpfreofqddfncqefcpettpdttjdttdd
+F-H4-771 2 eedeppcedpttpdttddttcd
+F-H4-772 3 cnfqpppjdpqfqmttpdttddttnc
+F-H4-773 3 kdqfppmedpndpjqcoepcnencqdttpdttmdttdd
+F-H4-774 2 mcqfppmedpndpjqcoepcnencqdttpdttmdttdd
+F-H4-775 2 jpppfqdpnppnttdnttpdttdd
+F-H4-776 2 jpnqppfqdpttcmttpdttdd
+F-H4-777 6 opnqoqmpppnonpttdpttpdttdd
+F-H4-778 2 mpnqppgpjpjndpttpnttpdttdd
+F-H4-779 2 rdpprgdppgpfqfofredfqdqencpefcpdttjdttddttqc
+F-H4-780 4 oqppnqnpfqjpmpdpqnnottdnttpdttdd
+F-H4-781 5 pmlqnqppqndpttpnttpdttdd
+F-H4-782 2 efppdhdpcfcittchttpdttdd
+F-H4-783 5 pcppqfdpqcpincpfttqettpdttdd
+F-H4-784 5 oroqqqqppqppnqnpqnkpttdpttpdttdd
+F-H4-785 2 ieppqfdplenflcpdttndttddttic
+F-H4-786 3 neppncdpfcdfttpdttddttlc
+F-H4-787 2 jqhqnqppfqdpttpnttpdttdd
+F-H4-788 3 qipppidpqfqhofqettpdttndttdd
+F-H4-789 4 qgqfppqcdppcpincpfttqettpdttdd
+F-H4-790 2 pjfqeqcqppcpipcnfpttdpttpdttdd
+F-H4-791 5 ocqfppmddpqcpipcnencqdttpdttndttdd
+F-H4-792 5 fpjqfqiqkphqjpppiphphogpfodpttdnttpdttdd
+F-H4-793 4 onnqlqqnpppmdpttpnttpdttdd
+F-H4-794 2 cofqhqcnppdmdpttdnttpdttdd
+F-H4-795 3 ofppqldpqfqhttpdttddttnc
+F-H4-796 2 jpqippqfdprdpdttddttqcttnc
+F-H4-797 2 ccfqcnppcfdpgddjfcfettpdttfdttdd
+F-H4-798 2 qoppnqjpfqdpqnpnpmonttcnttpdttdd
+F-H4-799 3 cikqmqfqppcldpttdnttpdttdd
+F-H4-800 3 fcnqfqcnppqfdpcfqnttpdttddttnc
+F-H4-801 2 chnqfqcnppqfdpcfqnttpdttddttnc
+F-H4-802 6 mpppnqnppmdpqfpjttpdttndttdd
+F-H4-803 5 oporoqqqqppqppnqnpqnkpttdpttpdttdd
+F-H4-804 5 qcppqfdpndpjttoettpdttdd
+F-H4-805 6 nonqppmpnppmdpqfpjttpdttndttdd
+F-H4-806 3 dnnqppfqipfodpttqnttpdttdd
+F-H4-807 2 nqqnppondpqfpkttpdttddttnc
+F-H4-808 3 ehppchjpjddpncckfcpfttdfttpdttdd
+F-H4-809 3 emppnqdpfqpnjpdnclcittpdttjdttdd
+F-H4-810 4 knppnqkpgpdpnopnttdnttpdttdd
+F-H4-811 5 oqppnqnpmpdppmnoqfpjttpdttndttdd
+F-H4-812 2 qnpplqipfqdpttcnttpdttdd
+F-H4-813 2 gofqjqkpiqjphqipppfphphogpfodpttdnttpdttdd
+F-H4-814 2 rporoqnrqpqqpppqopnqnpqnkpttdpttpdttdd
+F-H4-815 6 ofpgppqfdpncpffccfttpdttjdttdd
+F-H4-816 5 nroqorqpqqpppqopnqnpqnkpttdpttpdttdd
+F-H4-817 2 djpippqfdpttpdttndttdd
+F-H4-818 2 jcpippqfdpttpdttndttdd
+F-H4-819 4 gocrppfqjpeqfpgpdpdnfottdottpdttdd
+F-H4-820 6 pgppqfdpncpffccfttpdttjdttdd
+F-H4-821 5 gnjqfqiqkphqjpppiphpfpgphodpfogottdnttpdttdd
+F-H4-822 2 crppnqjpfqfpeqdpgpfodndottqnttpdttdd
+F-H4-823 5 obppqfdpmdpiqcnepcqdncpdttndttddttoc
+F-H4-824 3 ogrgpppgdpqfpfreofrddfqdqencpefcpdttjdttddttqc
+F-H4-825 3 pepppgdpqfpjqepfmdofttqdttpdttdd
+F-H4-826 5 pcppqfdpmdpiqcnencqdttpdttndttdd
+F-H4-827 4 jpppnqdpfqqnqfcnttpdttddttnc
+F-H4-828 4 mbppqfdpmdpiqcnepcqdncpdobodttndttddttoc
+F-H4-829 3 qepgppqfdpmdpjocnencpdttndttddttpc
+F-H4-830 2 hnfqjqkpiqjphqipppfphphogpfodpgngottdnttpdttdd
+F-H4-831 5 odqfppmddpqcpipcnencqdobpdttndttddttoc
+F-H4-832 3 pmpqoqppnqnpmpdpqnnoqfpjttpdttndttdd
+F-H4-833 3 cknqppfqdpjppncidnttpdttjdttdd
+F-H4-834 4 qoqqppnqdpqnpnpmonttpkttpdttdd
+F-H4-835 3 qdqfppqcdpncqjttoettpdttdd
+F-H4-836 3 jqhqnqppfqkpnodpfopnttdnttpdttdd
+F-H4-837 4 enfqdqcqppcpipdndpcneottdmttpdttdd
+F-H4-838 3 emdqfqppcqipcpdpdneocnenttdmttpdttdd
+F-H4-839 2 lejfppncdpfccfttpdttjdttdd
+F-H4-840 2 dfnqppfqdpjpqnfccnttpdttjdttdd
+F-H4-841 2 cnfqppjdjpncdpfcqfttcfttpdttdd
+F-H4-842 3 eedfppgddpttpdttjdttdd
+F-H4-843 4 qqppnqdpqnooqfpjttpdttddttnc
+F-H4-844 4 noppnqkpgpdpttdnttpdttdd
+F-H4-845 3 jfppnedpgdpfncdfttpdttjdttdd
+F-H4-846 5 pmppnqdpqnpnqfpjttpdttddttnc
+F-H4-847 3 cnppdjdpcfpdttfdttddttjc
+F-H4-848 2 qlfqppqndpmdcnttpfttpdttdd
+F-H4-849 3 nqppfqdpqfcnttpdttddttnc
+F-H4-850 4 ohqnpponnpnjdppgpjttpdttndttdd
+F-H4-851 3 nqppqkdpqfpdttndttddttjc
+F-H4-852 2 pmqqpqnqppfqjpqpdpqnoottcnttpdttdd
+F-H4-853 2 pmqqqppqppnqdpqnooqfpjttpdttddttnc
+F-H4-854 3 pooqppnqnpmpdppmnoqfpjttpdttndttdd
+F-H4-855 2 pqoqppnqnpmpdppmnoqfpjttpdttndttdd
+F-H4-856 2 icppqjdppgpfqfofqeqdttpdttndttdd
+F-H4-857 4 pfneppgddpncdfttpdttjdttdd
+F-H4-858 4 cnnqppfqdpjpqnttpdttjdttdd
+F-H4-859 4 heppfedpkddfjdpdidhdfcddttjcttictthc
+F-H4-860 3 fpppfqgpttdpttpdttdd
+F-H4-861 3 pfqfppmddpttpdttjdttdd
+F-H4-862 4 qnppfqdpmdcnttpfttpdttdd
+F-H4-863 2 qqppnqjpfqdppnoottdnttpdttdd
+F-H4-864 3 qooqpqnqppmpnpmokpqndpttnottpdttdd
+F-H4-865 2 clppfqdpmpdnttqmttpdttdd
+F-H4-866 3 ldppqfdpmdpiqcnepcmencqdobpdmbodttndttddttoc
+F-H4-867 4 meqfppmddpqcpipcnencqdobpdmbodttndttddttoc
+F-H4-868 5 dqfqppeqjpgpfpcndpttfottpdttdd
+F-H4-869 2 lqnqgqiqppiodpttpnttpdttdd
+F-H4-870 5 pqoqppnqnpmpkpqndpttnottpdttdd
+F-H4-871 2 qenqppfqdpjpqnqfcnttpdttddttnc
+F-H4-872 3 dofqppeqipgpfpdndpttfottpdttdd
+F-H4-873 4 pfppphdpohpiqfqhttqgttpdttdd
+F-H4-874 2 mqiqppfqdpttcnttpdttdd
+F-H4-875 2 npomppogdpttpdttmdttdd
+F-H4-876 2 dkfqdqcqppcpipdndpcneoementtdmttpdttdd
+F-H4-877 4 iojqfqiqkphqjpppiphpfpgphodpfogognhnttdnttpdttdd
+F-H4-878 5 qcppqfdpncqjttoettpdttdd
+F-H4-879 4 nmpqqqppnqjpqpdpqnoopnonompmttpkttpdttdd
+F-H4-880 3 pooqppnqnpfqjpmpdppnnottdnttpdttdd
+F-H4-881 2 qpnpppqodpqnpnpmonqfpjttpdttndttdd
+F-H4-882 5 pcppqfdpqcqjncoettqdttpdttdd
+F-H4-883 2 qfppnqdpfcpnttdfttpdttdd
+F-H4-884 3 hokqhqfqppfodpttdnttpdttdd
+F-H4-885 2 pinqpmppqfdpttpdttddttnc
+F-H4-886 4 clcnppefdpcfdittpdttfdttdd
+F-H4-887 3 dfjdppfcjpttdpttpdttdd
+F-H4-888 5 qpqqppnqdpqnooqfpjttpdttddttnc
+F-H4-889 3 qdqfppnddpqcpjttoettpdttdd
+F-H4-890 4 pqqpqqppnqdpqnooqfpjttpdttddttnc
+F-H4-891 2 qfppmddpfcdfttpdttidttdd
+F-H4-892 3 pnfqppnpdpttcnttpdttdd
+F-H4-893 2 djdnppcfdpttpdttddttfc
+F-H4-894 3 gocrppnqjpfqfpeqdpgpfodndottqnttpdttdd
+F-H4-895 2 fpnqppfqjpdmdpttpnttpdttdd
+F-H4-896 3 fcppqldpqfdjttpdttndttdd
+F-H4-897 2 qnpplqdpfqdnttpdttjdttdd
+F-H4-898 4 cfnqhqjpppfcdpttqnttpdttdd
+F-H4-899 3 ndpfppttdpttpdttdd
+F-H4-900 3 nepppkdppjqlpiqjoiqiohqhngphmgnhqfpgpfogofnfttpdttndttdd
+F-H4-901 3 mdpppfdpncdffcpdttndttddttjc
+F-H4-902 2 iepppmnppgdpqfnfleqelcpdttndttddttic
+F-H4-903 5 onnqppqndppmpnqfpjttpdttddttnc
+F-H4-904 4 lojqlqpppmnpqfdpttpdttndttdd
+F-H4-905 3 leppqfdplcpdttndttddttjc
+F-H4-906 3 qoppnqdpqnpnpmonqfpjttpdttddttnc
+F-H4-907 2 eqnqppgpjpttdpttpdttdd
+F-H4-908 2 jcqippqfdprdpdttndttddttqc
+F-H4-909 4 mopqoqppnqnpmpkpqndpttnottpdttdd
+F-H4-910 2 ioiqfqhqhpppgpipttdpttpdttdd
+F-H4-911 4 pgppqfdpndqjttpfttpdttdd
+F-H4-912 4 qqoroqmrpppqopnqnpmpjpqndpttnottpdttdd
+F-H4-913 4 oeqfppmedpndpjttnettpdttdd
+F-H4-914 4 oqpqppnqnpmpjpqndpttnottpdttdd
+F-H4-915 3 ndqfppofdpttphttpdttdd
+F-H4-916 4 oporoqpqppnqnpmpjpqndpttnottpdttdd
+F-H4-917 2 keppqfdpmdpjldneqcmepclencqdobpdmbodttndttddttoc
+F-H4-918 3 npnqpppmdpqfpkofqhttpdttndttdd
+F-H4-919 2 fqlpppcndpttpdttjdttdd
+F-H4-920 2 ncppqfdpttjjttpdttdd
+F-H4-921 2 chppjddpfcdfttpdttddttnc
+F-H4-922 2 nqpppmdpqfqhttpdttddttnc
+F-H4-923 3 ccppcfjpfcdptteettpdttdd
+F-H4-924 3 erdrdqfqppcqjpdmdptteottpdttdd
+F-H4-925 2 qqpqppoqnpnqdpopoompnottmottpdttdd
+F-H4-926 3 edfcppdcdpccpdttddttcdtthc
+F-H4-927 2 qmnqppqfdpttpdttddttmc
+F-H4-928 2 nqppqldpqfpdttndttjdttdd
+F-H4-929 2 hcfqhqfcppttdpttpdttdd
+F-H4-930 4 ofppqfdpttphttpdttdd
+F-H4-931 3 pfqfppnddpttpdttjdttdd
+F-H4-932 4 pcpgppqcdpncoettpdttjdttdd
+F-H4-933 3 lfompplhnpogdpngnflemfttpdttndttdd
+F-H4-934 2 fbppfcdpdcpdccedttddttcdtthc
+F-H4-935 2 qolqnqppqndppmpnttonttpdttdd
+F-H4-936 2 cphqfqppcndpdmenttdnttpdttdd
+F-H4-937 2 qjnqfqcnppqfdpfcpnttcfttpdttdd
+F-H4-938 3 foppnqhpfqdpttpnttpdttdd
+F-H4-939 2 nonppppmdpqfpjttpdttndttdd
+F-H4-940 2 ckchppjddpfcdfttpdttddttmc
+F-H4-941 2 cjfqmqjpppcldpttdnttpdttdd
+F-H4-942 2 mdpgppngdpndpjldoettnettpdttdd
+F-H4-943 2 clppkqdpfqdnttqmttpdttdd
+F-H4-944 4 mroqorpppqopnqnpmpjpqndpttnottpdttdd
+F-H4-945 2 icpjppqfdplcqlttpdttndttdd
+F-H4-946 2 jcppnedpncpffcdfttpdttldttdd
+F-H4-947 2 npqnppjjdpttdjttpdttdd
+F-H4-948 4 fpppfqjpmpgpjndpttcnttpdttdd
+F-H4-949 2 cjlqjqdqfqppeqfpgpdpttfottpdttdd
+F-H4-950 3 goppfqipeqfpgpdpdnfottdottpdttdd
+F-H4-951 2 qhppqjdppgqgqfpfqeofttqdttpdttdd
+F-H4-952 4 hpppcrjpfqfpeqdpgpgodnfottdottpdttdd
+F-H4-953 2 qcqfppofdprdqhttpdttndttdd
+F-H4-954 4 pcppqfdpndpjqcoettqdttpdttdd
+F-H4-955 4 pnnqppgpkpnodpttdnttpdttdd
+F-H4-956 2 ocpppfdpmddfncnefcpdttndttddttjc
+F-H4-957 2 nohqnqppfqkpfodpttdnttpdttdd
+F-H4-958 3 rfqipppidpqfqhofqettpdttndttdd
+F-H4-959 4 prqqoroqmrpppqopnqnpmpjpqndpttnottpdttdd
+F-H4-960 2 fqlpppcndpttpnttpdttdd
+F-H4-961 2 qknqppqidpttpnttpdttdd
+F-H4-962 4 mfomppognpngdplenfttpdttndttdd
+F-H4-963 4 nnlqjqlopppmnpqfdpttpdttndttdd
+F-H4-964 3 gpfqppmpjpjndpttcnttpdttdd
+F-H4-965 2 ldpmppqfdpofqhmfohttpdttndttdd
+F-H4-966 2 pkpmppqfdpofqhmfohttpdttndttdd
+F-H4-967 2 gdqfppledpienflcpdttndttddttic
+F-H4-968 2 mcppqfdpmdpjqcnencpdttndttddttoc
+F-H4-969 2 dnnqppfqipfodpqfqnttpdttddttnc
+F-H4-970 2 rfpgppqfdpqcpipcpfncofttqettpdttdd
+F-H4-971 2 ogppqnnpondpnjpjpgohttpdttndttdd
+F-H4-972 3 gpppnqfpfqdpttqnttpdttdd
+F-H4-973 2 cfppqfdpqcpipcqgncpfttqettpdttdd
+F-H4-974 2 qngqfqeqcqppcpipcnfpttdpttpdttdd
+F-H4-975 2 gfppdfdpgdeettpdttjdttdd
+F-H4-976 2 fcppqlnpqfdpttpdttndttdd
+F-H4-977 2 ecpqttepttqkttpd
+F-H4-978 2 pcppmddpnccffcnettpdttndttdd
+F-H4-979 2 cippcrjpfqfpeqdphphogpgodnfottdottpdttdd
+F-H4-980 3 gofqppmpjpfpgpjndpttcnttpdttdd
+F-H4-981 2 qgppqidppiqhqfrfofqettpdttndttdd
+F-H4-982 4 oonqppfqjppndpomonttcnttpdttdd
+F-H4-983 3 ohqlppqfdpofqhttpdttddttnc
+F-H4-984 3 fqppnqdpjppnttpjttpdttdd
+F-H4-985 2 nhqnpponnpnjdppgpjogohttpdttndttdd
+F-H4-986 2 nkpmppomnpnjdpqfolofpjttpdttndttdd
+F-H4-987 3 oqjqnqppmpnppndpttnottpdttdd
+F-H4-988 2 cnnqppfqdpjppnttpjttpdttdd
+F-H4-989 3 dlfqppfoipfmdpttdnttpdttdd
+F-H4-990 2 qmnqppqndppmpnttqlttpdttdd
+F-H4-991 4 pqoqppnqnpfqjpmpdpqnnottdnttpdttdd
+F-H4-992 3 efgfppdfdpgdeettpdttjdttdd
+F-H4-993 2 odpppkdppjqlpiqjoiqiohqhngphmgnhqfpgpfogofnfnemfttpdttndttdd
+F-H4-994 3 qcppqfdpndqhttoettpdttdd
+F-H4-995 4 hocrppfqjpeqfphpdpgpgodnfottdottpdttdd
+F-H4-996 2 qdqfppmddpqcqjncnettpdttndttdd
+F-H4-997 2 ocqfppmddpqcqjncnettpdttndttdd
+F-H4-998 3 mfpppmdpqfqhofohttpdttndttdd
+F-H4-999 3 rippqfdpofpirdpdttndttddttqc
+F-H4-1000 2 dfnqgqjpppfcdpttqnttpdttdd
+F-H4-1001 3 ndphppohdpqfpipfqhttqgttpdttdd
+F-H4-1002 3 qooqpqnqppmpnpqndppmnoqfpjttpdttndttdd
+F-H4-1003 4 djfqnqppcndpqfqncfpdttddttncttfc
+F-H4-1004 2 rcqfppnddpqcpjpcoettqdttpdttdd
+F-H4-1005 3 hdppcfdpgdpdfcidccfdttedttddttcd
+F-H4-1006 2 ndnqppqfdpfcpnttdfttpdttdd
+F-H4-1007 2 oonqpppmdpqfqhttpdttddttnc
+F-H4-1008 3 ggppgfdpiehfhefffedfkdgejdpdidhdfdgdfcddttjcttictthc
+F-H4-1009 2 phpprgdppgogqfpfreofrddfqdqencpefcpdttjdttddttqc
+F-H4-1010 3 cnppnqdpqfqnfcdfttpdttddttnc
+F-H4-1011 3 qqppnqjpfqdppnooomonttcnttpdttdd
+F-H4-1012 4 omppnqjpfqdppnonttcnttpdttdd
+F-H4-1013 2 jdhqnqppjpdpfcqnttcfttpdttdd
+F-H4-1014 2 chfqcnpppjdpqfqlttpdttddttnc
+F-H4-1015 2 dhppgfdpdfefgdeettpdttjdttdd
+F-H4-1016 4 pbpppgdpqcoencpdttjdttddttpc
+F-H4-1017 2 moprqqoroqmrpppqopnqnpmpjpqndpttnottpdttdd
+F-H4-1018 2 mpjqnqqpqoppqndppmpnttonttpdttdd
+F-H4-1019 3 hqfqppqkdpqfqnttpdttndttdd
+F-H4-1020 4 ofpgppqfdpndqjttpfttpdttdd
+F-H4-1021 2 qeqnpppnnppjdpqfqottpdttndttdd
+F-H4-1022 2 mopqppoqnpnqjpmpdppnpottnottpdttdd
+F-H4-1023 4 pqppqqdpnqqoqnpnpmonttpkttpdttdd
+F-H4-1024 2 qqprfqnqpphqdpttpnttpdttdd
+F-H4-1025 2 ngpmppnjdpqfpjpfpgofogttpdttddttnc
+F-H4-1026 3 qnmpppqfdpttpdttddttnc
+F-H4-1027 4 qcqfppofdprdpittpdttndttdd
+F-H4-1028 2 bpfqnqppiqdpcnpnttpdttjdttdd
+F-H4-1029 2 qhppcfjpncdpicpfttpdttddttfc
+F-H4-1030 2 ndqfppoddpqcpipcoencqdttpdttmdttdd
+F-H4-1031 3 eqfqppcqjpgpfpcndpttfottpdttdd
+F-H4-1032 3 ogpppfdpncoffcdfttpdttjdttdd
+F-H4-1033 2 cicnfqdippefdpcfchttpdttfdttdd
+F-H4-1034 2 fpmpppcndpttpnttpdttdd
+F-H4-1035 2 fofqppfpgpttdpttpdttdd
+F-H4-1036 3 enppcndpefclcfdittpdttfdttdd
+F-H4-1037 3 ncppnqdpfqpnjpcnttpjttpdttdd
+F-H4-1038 3 chiqppcfdpttpdttjdttdd
+F-H4-1039 4 oroqpqppnqnpmpjpqndpttnottpdttdd
+F-H4-1040 3 qcppqfdpmepjndoettnettpdttdd
+F-H4-1041 3 jpjdppfddpncpfttdfttpdttdd
+F-H4-1042 2 qkqhppjdjpncdpttpfttpdttdd
+F-H4-1043 2 nnnqppomdpqlpnqfpittpdttndttdd
+F-H4-1044 2 fcppqnnppjdpqfdjlcmettpdttndttdd
+F-H4-1045 2 idqfppfcdpttpittpdttdd
+F-H4-1046 2 clppkqdpfqdnttpjttpdttdd
+F-H4-1047 3 ebppdfdphdpdgdidfcddttjctthcttec
+F-H4-1048 3 goppfqgpfpdpttfottpdttdd
+F-H4-1049 3 qmqqpqnqppqpjpqndppnooomonnmpmttpkttpdttdd
+F-H4-1050 3 rmpqqqppnqjpqpdpqnoopnonomqmnmpmttpkttpdttdd
+F-H4-1051 4 foppfqjpmpgpfpdpjngottcnttpdttdd
+F-H4-1052 2 qcqlppqfdprdqnttpdttddttnc
+F-H4-1053 3 pmpqoqppnqnpfqjpmpdpqnnottdnttpdttdd
+F-H4-1054 3 pcqfppmddpocqjncnettpdttndttdd
+F-H4-1055 3 fonqppfqfpgpdpttqnttpdttdd
+F-H4-1056 2 ebppdgdpcfefcedfgdpdfcjdttddttcdttec
+F-H4-1057 3 fpcnppdjdpcfpdttfdttddttjc
+F-H5-1 365 fqppttdpttjjttpdttdd
+F-H5-2 51 pgppttdpttjjttpdttdd
+F-H5-3 13 qjppttdpttjjttpdttdd
+F-H5-4 12 gqppttdpttjjttpdttdd
+F-H5-5 11 fpppttdpttjjttpdttdd
+F-H5-6 9 jpppttdpttjjttpdttdd
+F-H5-7 5 qippttdpttjjttpdttdd
+F-H5-8 4 chppttdpttjjttpdttdd
+F-H5-9 288 ndqfppttdpttjjttpdttdd
+F-H5-10 186 ncqfppttdpttjjttpdttdd
+F-H5-11 151 lqnqppttdpttjjttpdttdd
+F-H5-12 92 pjqfppttdpttjjttpdttdd
+F-H5-13 76 idfcppttdpttjjttpdttdd
+F-H5-14 53 npnqppttdpttjjttpdttdd
+F-H5-15 30 jcfcppttdpttjjttpdttdd
+F-H5-17 14 jpqfppttdpttjjttpdttdd
+F-H5-18 13 kqnqppttdpttjjttpdttdd
+F-H5-19 11 mcqfppttdpttjjttpdttdd
+F-H5-20 11 jdnqppttdpttjjttpdttdd
+F-H5-21 10 qdqfppttdpttjjttpdttdd
+F-H5-22 9 djfcppttdpttjjttpdttdd
+F-H5-23 8 phqfppttdpttjjttpdttdd
+F-H5-24 8 eefcppttdpttjjttpdttdd
+F-H5-25 7 nonqppttdpttjjttpdttdd
+F-H5-26 3 pmnqppttdpttjjttpdttdd
+F-H5-27 57 ncppfcdpttjjttdfttpdttdd
+F-H5-28 36 pjppqfdpttjjttpdttndttdd
+F-H5-29 34 qkppqfdpttjjttpdttndttdd
+F-H5-30 28 gpppnqdpttpnttjjttpdttdd
+F-H5-31 27 cfppncdpttjjttpfttpdttdd
+F-H5-32 24 qlppqfdpttjjttpdttndttdd
+F-H5-33 15 lcppqfdpttjjttpdttndttdd
+F-H5-34 6 qjppqfdpttjjttpdttndttdd
+F-H5-35 5 fcppnqdpttpnttjjttpdttdd
+F-H5-36 5 qfppnqdpttpnttjjttpdttdd
+F-H5-37 4 pkppqfdpttjjttpdttndttdd
+F-H5-38 4 npppfqdpttdnttjjttpdttdd
+F-H5-39 4 qnppfcdpttjjttdfttpdttdd
+F-H5-40 4 qippnqdpttpnttjjttpdttdd
+F-H5-41 3 jdppqfdpttjjttpdttndttdd
+F-H5-42 3 jcppqfdpttjjttpdttndttdd
+F-H5-43 3 rdppqfdpttjjttpdttndttdd
+F-H5-44 3 iqppfqdpttdnttjjttpdttdd
+F-H5-45 2 pippqfdpttjjttpdttndttdd
+F-H5-46 2 pgppnqdpttpnttjjttpdttdd
+F-H5-47 2 pgppfcdpttjjttdfttpdttdd
+F-H5-48 47 qnppqfdpttjjttpdttddttnc
+F-H5-49 23 ncnqqnppttdpttjjttpdttdd
+F-H5-50 18 pjppqfdpttjjttpdttddttnc
+F-H5-51 17 qkppqfdpttjjttpdttddttnc
+F-H5-52 12 pmppqfdpttjjttpdttddttnc
+F-H5-53 11 qlppqfdpttjjttpdttddttnc
+F-H5-54 7 qnppfcdpttjjttcfttpdttdd
+F-H5-55 6 rdppqfdpttjjttpdttddttnc
+F-H5-56 5 qjppqfdpttjjttpdttddttnc
+F-H5-57 4 qfppnqdpttqnttjjttpdttdd
+F-H5-58 3 ndppfcdpttjjttcfttpdttdd
+F-H5-59 3 qippqfdpttjjttpdttddttnc
+F-H5-60 3 chppfcdpttjjttcfttpdttdd
+F-H5-61 3 fcppnqdpttqnttjjttpdttdd
+F-H5-62 3 mpppqfdpttjjttpdttddttnc
+F-H5-63 63 nolqnqppttdpttjjttpdttdd
+F-H5-64 22 hdppfcdpttjjttpdttddtthc
+F-H5-65 22 ncppqfdpttjjttqhttpdttdd
+F-H5-66 21 dfppfcdpttjjttpdttddtthc
+F-H5-67 10 ccppfcdpttjjttpdttddtthc
+F-H5-68 8 molqnqppttdpttjjttpdttdd
+F-H5-69 5 fqlqnqppttdpttjjttpdttdd
+F-H5-70 5 dcppfcdpttjjttpdttddtthc
+F-H5-71 2 cflqnqppttdpttjjttpdttdd
+F-H5-72 2 fclqnqppttdpttjjttpdttdd
+F-H5-73 49 ncppqfdpttpjttjjttpdttdd
+F-H5-74 34 ndppqfdpttpjttjjttpdttdd
+F-H5-75 13 mdppqfdpttpjttjjttpdttdd
+F-H5-76 8 pmppqfdpttpjttjjttpdttdd
+F-H5-77 3 ncppfcdpttjjttpdttjdttdd
+F-H5-78 2 mcppqfdpttpjttjjttpdttdd
+F-H5-79 2 fnppfqjpttdpttjjttpdttdd
+F-H5-80 36 pfncppfcdpttjjttdfttpdttdd
+F-H5-81 30 pjqnppqfnpttdpttjjttpdttdd
+F-H5-82 11 qfncppfcdpttjjttdfttpdttdd
+F-H5-83 8 qhqnppqfnpttdpttjjttpdttdd
+F-H5-84 7 qjqnppqfdpttjjttpdttndttdd
+F-H5-85 4 kpnqppfqdpttdnttjjttpdttdd
+F-H5-86 3 lqnqppfqdpttpnttjjttpdttdd
+F-H5-87 3 ecncppfcdpttjjttdfttpdttdd
+F-H5-88 2 qoqnppqfdpttjjttpdttndttdd
+F-H5-89 2 iqnqppfqdpttpnttjjttpdttdd
+F-H5-90 74 pnnqlqnoppttdpttjjttpdttdd
+F-H5-91 8 cffeppfcdpttjjttpdttddtthc
+F-H5-92 2 neqfppofdpttjjttqhttpdttdd
+F-H5-93 36 ncppqfdpttjjttpittpdttdd
+F-H5-94 22 feppfcdpttjjttpdttidttdd
+F-H5-95 14 pnppnqkpttdpttjjttpdttdd
+F-H5-96 3 mdppqfdpttjjttpittpdttdd
+F-H5-97 3 qcppqfdpttjjttpittpdttdd
+F-H5-98 3 heppfcdpttjjttpdttidttdd
+F-H5-99 2 nippqfdpttjjttpittpdttdd
+F-H5-100 2 qnppqfdpttjjttpittpdttdd
+F-H5-101 2 qnppncdpttjjttpdttkdttdd
+F-H5-102 2 dmppcfdpttjjttdittpdttdd
+F-H5-103 22 iphqfqppfodpttdnttjjttpdttdd
+F-H5-104 10 pmppqfdpofjjttqhttpdttndttdd
+F-H5-105 9 lcppqfdpofjjttqhttpdttndttdd
+F-H5-106 8 fqlqnqppnodpttpnttjjttpdttdd
+F-H5-107 5 iplqnqppnodpttpnttjjttpdttdd
+F-H5-108 5 jqhqfqppfodpttdnttjjttpdttdd
+F-H5-109 4 mfppqfdpofjjttqhttpdttndttdd
+F-H5-110 4 nphqfqppfodpttdnttjjttpdttdd
+F-H5-111 3 hohqfqppfodpttdnttjjttpdttdd
+F-H5-112 2 kcppfedpfcjjttdfttpdttddtthc
+F-H5-113 19 ncqnnqqfppttdpttjjttpdttdd
+F-H5-114 14 jdncppfcdpttjjttcfttpdttdd
+F-H5-115 12 npqnppqfdpttjjttpdttddttnc
+F-H5-116 6 qjqnppqfdpttjjttpdttddttnc
+F-H5-117 6 kdncppfcdpttjjttcfttpdttdd
+F-H5-118 5 lqnqppfqdpttcnttjjttpdttdd
+F-H5-119 4 qoqnppqfdpttjjttpdttddttnc
+F-H5-120 4 hcncppfcdpttjjttcfttpdttdd
+F-H5-121 2 qeqnppqfdpttjjttpdttddttnc
+F-H5-122 2 pqnqppfqdpttcnttjjttpdttdd
+F-H5-123 2 fpnqppfqdpttqnttjjttpdttdd
+F-H5-124 2 phqnnqqfppttdpttjjttpdttdd
+F-H5-125 2 idncppfcdpttjjttcfttpdttdd
+F-H5-126 32 dngpppttdpttjjttpdttdd
+F-H5-127 11 pjpgppttdpttjjttpdttdd
+F-H5-128 9 ncpgppttdpttjjttpdttdd
+F-H5-129 7 mdpgppttdpttjjttpdttdd
+F-H5-130 6 qepgppttdpttjjttpdttdd
+F-H5-131 4 fqgpppttdpttjjttpdttdd
+F-H5-132 4 qjpgppttdpttjjttpdttdd
+F-H5-133 3 jdmpppttdpttjjttpdttdd
+F-H5-134 3 qmmpppttdpttjjttpdttdd
+F-H5-135 36 nonqppmpnpttdpttjjttpdttdd
+F-H5-136 14 eqfqppgpfpttdpttjjttpdttdd
+F-H5-137 6 gegdppfcdpttjjttpdttfdttdd
+F-H5-138 58 mpppnqnpttdpttjjttpdttdd
+F-H5-139 24 fdcfppfcdpttjjttdjttpdttdd
+F-H5-140 15 oeqfppncdpttpjttjjttpdttdd
+F-H5-141 11 pfqfppncdpttpjttjjttpdttdd
+F-H5-142 2 pjnqppqnjpttdpttjjttpdttdd
+F-H5-143 18 dnnqppgpdpttpnttjjttpdttdd
+F-H5-144 9 pjpmppqfdpttjjttpdttndttdd
+F-H5-145 5 pipmppqfdpttjjttpdttndttdd
+F-H5-146 5 ecmdppfcdpttjjttdfttpdttdd
+F-H5-147 3 kpfqppmpdpttdnttjjttpdttdd
+F-H5-148 3 ncmdppfcdpttjjttdfttpdttdd
+F-H5-149 2 dmnqppgpdpttpnttjjttpdttdd
+F-H5-150 2 ogpmppqfdpttjjttpdttndttdd
+F-H5-151 2 qhpmppqfdpttjjttpdttndttdd
+F-H5-152 2 qopmppqfdpttjjttpdttndttdd
+F-H5-153 2 qkpmppqfdpttjjttpdttndttdd
+F-H5-154 32 oqppnqnpmpdpttnottjjttpdttdd
+F-H5-155 11 dcppgddpfcjjttfettpdttfdttdd
+F-H5-156 7 repppgdpqfjjttpfttofttpdttdd
+F-H5-157 2 cpppfqfpgpdpttfottjjttpdttdd
+F-H5-158 22 jdppncdpfcjjttpfttdfttpdttdd
+F-H5-159 3 lqppqnnpqfdpttjjttpdttndttdd
+F-H5-160 12 qmqkppqfdpttjjttpdttndttdd
+F-H5-161 10 jpncppicdpttjjttpfttpdttdd
+F-H5-162 8 qnqkppqfdpttjjttpdttndttdd
+F-H5-163 5 djnqppiqdpttpnttjjttpdttdd
+F-H5-164 5 qjnqppiqdpttpnttjjttpdttdd
+F-H5-165 4 iqkqppfqdpttdnttjjttpdttdd
+F-H5-166 3 hqkqppfqdpttdnttjjttpdttdd
+F-H5-167 2 djkqppfqdpttdnttjjttpdttdd
+F-H5-168 14 cfppfcdpttjjttpdttddttjc
+F-H5-169 14 dnjqfqppttdpttjjttpdttdd
+F-H5-170 4 mdppqfdpttqjttjjttpdttdd
+F-H5-171 10 jpjdppfcdpttjjttdfttpdttdd
+F-H5-172 9 hqnqppjpdpttpnttjjttpdttdd
+F-H5-173 8 qmpjppqfdpttjjttpdttndttdd
+F-H5-174 7 fqnqppjpdpttpnttjjttpdttdd
+F-H5-175 3 pjnqppjpdpttpnttjjttpdttdd
+F-H5-176 15 ndppqnnpqfdpttpjttjjttpdttdd
+F-H5-177 6 qfppncdpfcjjttdfttpdttjdttdd
+F-H5-178 3 jfppncdpfcjjttdfttpdttjdttdd
+F-H5-179 2 neppncdpfcjjttdfttpdttjdttdd
+F-H5-180 16 ndqfppncdpttjjttpittpdttdd
+F-H5-181 15 pfqfppncdpttjjttpittpdttdd
+F-H5-182 10 oonqppqnkpttdpttjjttpdttdd
+F-H5-183 22 qnnqppqfdpttjjttpdttndttdd
+F-H5-184 8 fdcfppncdpttjjttpfttpdttdd
+F-H5-185 3 mqfqppqndpttdnttjjttpdttdd
+F-H5-186 2 piqfppfcdpttjjttdfttpdttdd
+F-H5-187 2 lqnqppqfdpttjjttpdttndttdd
+F-H5-188 2 djfqppcfdpttjjttpdttfdttdd
+F-H5-189 19 fpfqppdnjpttdpttjjttpdttdd
+F-H5-190 9 neqfppnddpttpjttjjttpdttdd
+F-H5-191 7 oeqfppnddpttpjttjjttpdttdd
+F-H5-192 2 djfqppdnjpttdpttjjttpdttdd
+F-H5-193 9 icqfpplcdpttjjttpdttndttdd
+F-H5-194 6 cjfqppcldpttdnttjjttpdttdd
+F-H5-195 3 chcfpphcdpttjjttpdttfdttdd
+F-H5-196 3 pjqhppncdpttjjttpfttpdttdd
+F-H5-197 3 meqfpplcdpttjjttpdttndttdd
+F-H5-198 2 lplqppqnnpttdpttjjttpdttdd
+F-H5-199 2 pjlqppqnnpttdpttjjttpdttdd
+F-H5-200 15 djqnpppjnpqfdpttjjttpdttndttdd
+F-H5-201 5 cjjdppncdpfcjjttpfttdfttpdttdd
+F-H5-202 3 djjdppncdpfcjjttpfttdfttpdttdd
+F-H5-203 3 gejdppncdpfcjjttpfttdfttpdttdd
+F-H5-204 2 prnqppfqdpjppnttdnttjjttpdttdd
+F-H5-205 14 kqnqlqkpppnodpttpnttjjttpdttdd
+F-H5-206 8 hpfqhqipppfodpttdnttjjttpdttdd
+F-H5-207 5 qepippqfdpofjjttqhttpdttndttdd
+F-H5-208 25 pqoqppnqnpmpdpttnottjjttpdttdd
+F-H5-209 15 jqpqoqppnqnpmpdpttnottjjttpdttdd
+F-H5-210 4 mopqoqppnqnpmpdpttnottjjttpdttdd
+F-H5-211 4 cfppgddpfcjjecfettpdttfdttddttdc
+F-H5-212 3 nqpppgdpqfjjqepfttofttqdttpdttdd
+F-H5-213 2 edppgddpfcjjecfettpdttfdttddttdc
+F-H5-214 2 qnpppgdpqfjjqepfttofttqdttpdttdd
+F-H5-215 2 kqdqfqppeqfpgpdpttfottjjttpdttdd
+F-H5-216 30 gdppcfdpfcjjttdjttpdttfdttdd
+F-H5-217 12 fqppmpdpttpnttjjttpdttdd
+F-H5-218 2 qfppgpdpttdnttjjttpdttdd
+F-H5-219 2 cfppmddpttjjttpfttpdttdd
+F-H5-220 2 pgppgpdpttdnttjjttpdttdd
+F-H5-221 22 fecfppgddpfcjjttdjttpdttfdttdd
+F-H5-222 9 qnqlppqfdpttjjttpdttndttdd
+F-H5-223 4 djqlppqfdpttjjttpdttndttdd
+F-H5-224 4 iplqppfqdpttdnttjjttpdttdd
+F-H5-225 2 jcqlppqfdpttjjttpdttndttdd
+F-H5-226 2 pjqlppqfdpttjjttpdttndttdd
+F-H5-227 2 jpqlppqfdpttjjttpdttndttdd
+F-H5-228 5 cmckppttdpttjjttpdttdd
+F-H5-229 5 cnckppttdpttjjttpdttdd
+F-H5-230 3 jdcippttdpttjjttpdttdd
+F-H5-231 2 jciqppttdpttjjttpdttdd
+F-H5-232 2 pjiqppttdpttjjttpdttdd
+F-H5-233 2 kqiqppttdpttjjttpdttdd
+F-H5-234 2 jdiqppttdpttjjttpdttdd
+F-H5-235 2 cgckppttdpttjjttpdttdd
+F-H5-236 12 ccppcfdpgdjjfcdjttfettpdttfdttdd
+F-H5-237 9 cdppdgdpcfjjfcefttdfttpdttjdttdd
+F-H5-238 6 qoppnqjpqndppmpnttonttjjttpdttdd
+F-H5-239 2 orppnqnpmpdpqnnottpjttjjttpdttdd
+F-H5-240 16 idhdppfcdpttjjttpdttddtthc
+F-H5-241 9 ichdppfcdpttjjttpdttddtthc
+F-H5-242 25 pnnqppnokpttdpttjjttpdttdd
+F-H5-243 2 cffeppfcdpttjjttpdttidttdd
+F-H5-244 16 qfqnnqncppttdpttjjttpdttdd
+F-H5-245 3 qlfqppqndpttcnttjjttpdttdd
+F-H5-246 2 qmnqppqfdpttjjttpdttddttnc
+F-H5-247 2 ecqfppfcdpttjjttcfttpdttdd
+F-H5-248 24 pfppqfdpttjjttqettpdttdd
+F-H5-249 12 pnnqoqnpppttdpttjjttpdttdd
+F-H5-250 7 ncqfpppfdpttjjttqettpdttdd
+F-H5-251 9 qmpjppqfdpttjjttpdttddttnc
+F-H5-252 7 hqnqppjpdpttqnttjjttpdttdd
+F-H5-253 3 fqnqppjpdpttqnttjjttpdttdd
+F-H5-254 2 djpjppqfdpttjjttpdttddttnc
+F-H5-255 12 pfqfppncdpttjjttqhttpdttdd
+F-H5-256 7 ndqfppncdpttjjttqhttpdttdd
+F-H5-257 4 oeqfppncdpttjjttpdttddttlc
+F-H5-258 9 lcpppmnpqfdpttjjttpdttndttdd
+F-H5-259 3 lqpppmnpqfdpttjjttpdttndttdd
+F-H5-260 2 cfppfqdpmppnttdnttjjttpdttdd
+F-H5-261 8 prppnqkpnodpttpnttjjttpdttdd
+F-H5-262 5 pmppqfdpofjjttpittpdttndttdd
+F-H5-263 3 qkppqfdpofjjttpittpdttndttdd
+F-H5-264 2 fqppnqkpnodpttpnttjjttpdttdd
+F-H5-265 2 fgppfedpfcjjttdfttpdttidttdd
+F-H5-266 2 lcppqfdpofjjttpittpdttndttdd
+F-H5-267 4 ndqgppttdpttjjttpdttdd
+F-H5-268 3 fpgqppttdpttjjttpdttdd
+F-H5-269 3 qgmcppttdpttjjttpdttdd
+F-H5-270 2 pjqgppttdpttjjttpdttdd
+F-H5-271 5 djjpppttdpttjjttpdttdd
+F-H5-272 5 nqjpppttdpttjjttpdttdd
+F-H5-273 4 gqjpppttdpttjjttpdttdd
+F-H5-274 2 djpjppttdpttjjttpdttdd
+F-H5-275 2 lqjpppttdpttjjttpdttdd
+F-H5-276 6 ndogppttdpttjjttpdttdd
+F-H5-277 4 qfogppttdpttjjttpdttdd
+F-H5-278 2 fcegppttdpttjjttpdttdd
+F-H5-279 2 qgogppttdpttjjttpdttdd
+F-H5-280 2 djogppttdpttjjttpdttdd
+F-H5-281 5 jdohppttdpttjjttpdttdd
+F-H5-282 5 pnloppttdpttjjttpdttdd
+F-H5-283 3 jpohppttdpttjjttpdttdd
+F-H5-284 2 pmloppttdpttjjttpdttdd
+F-H5-285 2 qhohppttdpttjjttpdttdd
+F-H5-286 17 pjnqqnppqfdpttjjttpdttddttnc
+F-H5-287 2 lcnqqnppqfdpttjjttpdttddttnc
+F-H5-288 6 cnppnqdpqfqnttjjttpdttndttdd
+F-H5-289 5 lcppqfdpfcjjttdfttpdttddttnc
+F-H5-290 4 prppnqdpqfqnttjjttpdttndttdd
+F-H5-291 9 ndpfppncdpfcjjttdfttpdttjdttdd
+F-H5-292 6 oonqppfqjppndpttdnttjjttpdttdd
+F-H5-293 5 neqnppqfnpnddpttpjttjjttpdttdd
+F-H5-294 16 qcppqfdpncpjttjjttoettpdttdd
+F-H5-295 2 qhppqfdpncpjttjjttoettpdttdd
+F-H5-296 8 jpjdppncdpfcjjttqfttcfttpdttdd
+F-H5-297 3 ocjdppncdpfcjjttqfttcfttpdttdd
+F-H5-298 3 cjqnnqpjppqfdpttjjttpdttddttnc
+F-H5-299 14 chppjdjpncdpfcjjttpfttdfttpdttdd
+F-H5-300 3 fcppqnnppjdpqfjjttdjttpdttndttdd
+F-H5-301 17 fddfppfcdpttjjttpdttddtthc
+F-H5-302 3 ncqfppnddpttjjttqhttpdttdd
+F-H5-303 12 lqfqjqkpiqjphqippphohpfodpttdnttjjttpdttdd
+F-H5-304 2 kcheppfedpkdjjjddfidpdfchdttddttjcttictthc
+F-H5-305 15 pjppqnnpqfdpttjjttpdttddttnc
+F-H5-306 7 mckcppfcdpttjjttcfttpdttdd
+F-H5-307 5 nqkqppfqdpttcnttjjttpdttdd
+F-H5-308 3 jdkqppfqdpttcnttjjttpdttdd
+F-H5-309 2 cmnqppiqdpttqnttjjttpdttdd
+F-H5-310 2 dbkcppfcdpttjjttcfttpdttdd
+F-H5-311 10 pkpmppqfdpofjjttqhttpdttndttdd
+F-H5-312 4 qkpmppqfdpofjjttqhttpdttndttdd
+F-H5-313 3 ohpmppqfdpofjjttqhttpdttndttdd
+F-H5-314 17 gpppfqjpdnfpttdpttjjttpdttdd
+F-H5-315 3 cqppfqjpdnfpttdpttjjttpdttdd
+F-H5-316 14 qdqfppqcdpncpjttjjttoettpdttdd
+F-H5-317 13 jqfqiqjphqippphohpfodpttdnttjjttpdttdd
+F-H5-318 12 npnqpppnkpttdpttjjttpdttdd
+F-H5-319 4 onnqpppnkpttdpttjjttpdttdd
+F-H5-320 3 eofqppdnipttdpttjjttpdttdd
+F-H5-321 7 qnqlppqfdpttjjttpdttddttnc
+F-H5-322 2 qiqlppqfdpttjjttpdttddttnc
+F-H5-323 2 jdnqpphqdpttqnttjjttpdttdd
+F-H5-324 2 lqnqpphqdpttqnttjjttpdttdd
+F-H5-325 16 pcppqfdpqcpjncjjttoettqdttpdttdd
+F-H5-326 12 kpjqfqiqjphqippphohpfodpttdnttjjttpdttdd
+F-H5-327 6 dfcfppfcdpttjjttpdttddttjc
+F-H5-328 6 eecfppfcdpttjjttpdttddttjc
+F-H5-329 5 pnlpppttdpttjjttpdttdd
+F-H5-330 4 jdlpppttdpttjjttpdttdd
+F-H5-331 3 fqhpppttdpttjjttpdttdd
+F-H5-332 3 djlpppttdpttjjttpdttdd
+F-H5-333 11 mdqfppqcdppcpjncjjttoettqdttpdttdd
+F-H5-334 3 meqfppqcdppcpjncjjttoettqdttpdttdd
+F-H5-335 2 gpfqdqcqppcpjpcndptteottjjttpdttdd
+F-H5-336 5 lqnqfqppqndpttcnttjjttpdttdd
+F-H5-337 2 ncnqfqppqndpttcnttjjttpdttdd
+F-H5-338 2 fqppnqdpqfqnttjjttpdttddttnc
+F-H5-339 8 ckchppjdjpncdpfcjjttpfttdfttpdttdd
+F-H5-340 2 qjqhppjdjpncdpfcjjttpfttdfttpdttdd
+F-H5-341 2 egchppjdjpncdpfcjjttpfttdfttpdttdd
+F-H5-342 9 qnppnqdpttjjttpdttjdttdd
+F-H5-343 2 fqppnqdpttjjttpdttjdttdd
+F-H5-344 2 cfppnqdpttjjttpdttjdttdd
+F-H5-345 15 fofqppgpjpdnfpttdpttjjttpdttdd
+F-H5-346 6 dfnqppfcdpttpnttjjttpdttdd
+F-H5-347 4 jdnqppfcdpttpnttjjttpdttdd
+F-H5-348 4 cfnqppfcdpttpnttjjttpdttdd
+F-H5-349 8 gdpphddpfcjjttpdttidttddtthc
+F-H5-350 7 hepphddpfcjjttpdttidttddtthc
+F-H5-351 8 mplqnqpppnnpttdpttjjttpdttdd
+F-H5-352 5 ccppdfdpfcjjttpdttfdttddtthc
+F-H5-353 4 pcppqfdpndjjttqhttpfttpdttdd
+F-H5-354 10 ccfcppdcdpttjjttpdttddtthc
+F-H5-355 4 epfqhqdqppttdpttjjttpdttdd
+F-H5-356 10 ndpgppncdpttjjttpdttjdttdd
+F-H5-357 5 eofqppdmjpttdpttjjttpdttdd
+F-H5-358 7 fpfqjqdnppttdpttjjttpdttdd
+F-H5-359 5 neqfppnddpttqjttjjttpdttdd
+F-H5-360 3 oonqjqpnppttdpttjjttpdttdd
+F-H5-361 5 qgqjpppgdpqfjjqepfttofttqdttpdttdd
+F-H5-362 3 dnjqdqfqppeqfpgpdpttfottjjttpdttdd
+F-H5-363 2 jcqjpppgdpqfjjqepfttofttqdttpdttdd
+F-H5-364 2 mdqjpppgdpqfjjqepfttofttqdttpdttdd
+F-H5-365 7 pfqfppncdpfcjjttdfttpdttjdttdd
+F-H5-366 4 ndqfppncdpfcjjttdfttpdttjdttdd
+F-H5-367 3 oeqfppncdpfcjjttdfttpdttjdttdd
+F-H5-368 8 djqnpppjnpqfdpttjjttpdttddttnc
+F-H5-369 2 djnqppfqdpjppnttcnttjjttpdttdd
+F-H5-370 2 roqnnqpjppqfdpttjjttpdttndttdd
+F-H5-371 15 mdppqfdpncjjttpittpdttndttdd
+F-H5-372 2 cqppfqipcndpttdnttjjttpdttdd
+F-H5-373 6 djqjppttdpttjjttpdttdd
+F-H5-374 4 lqjqppttdpttjjttpdttdd
+F-H5-375 2 jpqjppttdpttjjttpdttdd
+F-H5-376 2 qfqjppttdpttjjttpdttdd
+F-H5-377 2 gqjqppttdpttjjttpdttdd
+F-H5-378 11 eqppfqjpgpfpdndpttfottjjttpdttdd
+F-H5-379 4 qdpppgdpqfpjndjjttpfttofttpdttdd
+F-H5-380 12 hohqfqppiphpfodpttdnttjjttpdttdd
+F-H5-381 4 qippqfdpttjjttqdttpdttdd
+F-H5-382 3 qnppqfdpttjjttqdttpdttdd
+F-H5-383 2 ncppqfdpttjjttqdttpdttdd
+F-H5-384 7 iqfqhqippphohpfodpttdnttjjttpdttdd
+F-H5-385 2 oipippohdpqfjjofqhttphttpdttndttdd
+F-H5-386 4 qfppncdpfcjjttcfttpdttjdttdd
+F-H5-387 4 pnppnqjpfqdpttcnttjjttpdttdd
+F-H5-388 9 pgppqfdpncjjttpittpfttpdttdd
+F-H5-389 7 qcppqfdpncjjttpittpfttpdttdd
+F-H5-390 5 golqnqkqkpjqjphqipppnolplodpttpnttjjttpdttdd
+F-H5-391 4 cllqfqjqkpiqjphqippphohpfodpttdnttjjttpdttdd
+F-H5-392 2 qolqnqkqkpjqjphqipppnolplodpttpnttjjttpdttdd
+F-H5-393 4 chdmppcfdpttjjttpdttddttfc
+F-H5-394 3 nppmppqfdpttjjttpdttddttnc
+F-H5-395 3 qopmppqfdpttjjttpdttddttnc
+F-H5-396 3 qfmdppfcdpttjjttcfttpdttdd
+F-H5-397 11 dnfpppttdpttjjttpdttdd
+F-H5-398 2 fcfdppttdpttjjttpdttdd
+F-H5-399 2 kpnpppttdpttjjttpdttdd
+F-H5-400 13 jplqnqkqkpppnodpttpnttjjttpdttdd
+F-H5-401 4 qnkqnqppttdpttjjttpdttdd
+F-H5-402 3 nokqnqppttdpttjjttpdttdd
+F-H5-403 3 dniqfqppttdpttjjttpdttdd
+F-H5-404 2 pqkqnqppttdpttjjttpdttdd
+F-H5-405 8 lpnqlqkpkqjpppnodpttpnttjjttpdttdd
+F-H5-406 5 jqnqlqkpkqjpppnodpttpnttjjttpdttdd
+F-H5-407 5 jpoqnqppnpdpttpnttjjttpdttdd
+F-H5-408 3 ncppfddpfcjjttdfttpdttddttec
+F-H5-409 2 qfppfddpfcjjttdfttpdttddttec
+F-H5-410 2 qjppqfdppfjjttqettpdttndttdd
+F-H5-411 11 qcppqfdpmdjjncpittnettpdttndttdd
+F-H5-412 3 cpppfqipcndpdmenttdnttjjttpdttdd
+F-H5-413 4 jpfqppmpdpttpnttjjttpdttdd
+F-H5-414 4 dnfqppmpdpttpnttjjttpdttdd
+F-H5-415 3 pkqnpppgdpttjjttpdttndttdd
+F-H5-416 3 nqqnpppgdpttjjttpdttndttdd
+F-H5-417 14 neqfppmddpncjjttpittpdttndttdd
+F-H5-418 8 eecfppfcdpttpjttjjttpdttdd
+F-H5-419 4 jdnqppqndpttjjttdjttpdttdd
+F-H5-420 4 fqppnqdpttqmttjjttpdttdd
+F-H5-421 4 pmppqfdpttjjttpdttddttmc
+F-H5-422 2 fcppnqdpttqmttjjttpdttdd
+F-H5-423 5 qnppnqdpttjjttdjttpdttdd
+F-H5-424 3 ndppqfjpttdpttjjttpdttdd
+F-H5-425 3 fcppnqdpttjjttdjttpdttdd
+F-H5-426 5 dofqhqdqcqcpppttdpttjjttpdttdd
+F-H5-427 2 qopqqqnqlqqpppttdpttjjttpdttdd
+F-H5-428 2 bccdppfcdpdcjjttpdttddtthcttcc
+F-H5-429 7 ecgdppfcdpdcjjttfettpdttfdttdd
+F-H5-430 2 qcpgppqfdpqdjjttpfttofttpdttdd
+F-H5-431 3 cfnqppfcdpttqnttjjttpdttdd
+F-H5-432 2 fpcnppqfdpttjjttpdttddttnc
+F-H5-433 3 lcppqkdpqfqmttjjttpdttndttdd
+F-H5-434 2 rdppqkdpqfqmttjjttpdttndttdd
+F-H5-435 6 qcppqfdpncjjttqhttpfttpdttdd
+F-H5-436 4 qplqnqppqnnpttdpttjjttpdttdd
+F-H5-437 3 mplqnqppqnnpttdpttjjttpdttdd
+F-H5-438 5 cdppfcdpdcjjttpdttddtthcttcc
+F-H5-439 11 dofqppeqjpgpfpdndpttfottjjttpdttdd
+F-H5-440 9 jpiqfqhqippphohpfodpttdnttjjttpdttdd
+F-H5-441 9 qqppnqkpqndpttoottjjttpdttdd
+F-H5-442 13 foeqfqppgpfpttdpttjjttpdttdd
+F-H5-443 11 pgppqfdpncpjttjjttpfttpdttdd
+F-H5-444 6 ndppqfdpqcpjpcjjncoettqdttpdttmdttdd
+F-H5-445 5 odppqfdpqcpjpcjjncoettqdttpdttmdttdd
+F-H5-446 4 ogpppgdpqfjjofpfttqettpettpdttdd
+F-H5-447 4 rfpppgdpqfjjofpfttqettpettpdttdd
+F-H5-448 3 qgpppgdpqfjjofpfttqettpettpdttdd
+F-H5-449 2 nqeqfqppgpfpfoepttdpttjjttpdttdd
+F-H5-450 5 rcpppgdpqfpjqejjndpfttofttpdttodttdd
+F-H5-451 4 dqppfqjpeqfpgpdpdnfottdottjjttpdttdd
+F-H5-452 2 goppfqjpeqfpgpdpdnfottdottjjttpdttdd
+F-H5-453 4 ogrgpppgdpqfjjrepfqdofttqettpettpdttdd
+F-H5-454 2 ccgdppfcdpdcjjgbfeebpdttfdttedttddttec
+F-H5-455 4 pnppmpjpttdpttjjttpdttdd
+F-H5-456 3 mdpppgdpttpjttjjttpdttdd
+F-H5-457 2 cnppgpjpttdpttjjttpdttdd
+F-H5-458 13 epfqeqgpppfofpttdpttjjttpdttdd
+F-H5-459 7 edgdppfcdpdcjjebfettpdttfdttddttec
+F-H5-460 5 mpppnqnppnkpttdpttjjttpdttdd
+F-H5-461 3 qqppnqnppnkpttdpttjjttpdttdd
+F-H5-462 9 gbppgddpfcjjdcfeebpdttfdttedttddttec
+F-H5-463 8 cedgppcfdpcdjjfcefttdfttpdttjdttdd
+F-H5-464 2 qqnqppqpjpqndppmpnttonttjjttpdttdd
+F-H5-465 9 ebppgddpfcjjdcfettpdttfdttddttec
+F-H5-466 7 pqqqppnqkpqndpttoottjjttpdttdd
+F-H5-467 5 ehppchjpjddpncckfcjjttpfttdfttpdttdd
+F-H5-468 3 nppppmdpqfpkofjjttqhttpdttndttdd
+F-H5-469 3 nqpppmdpqfpkofjjttqhttpdttndttdd
+F-H5-470 2 ohpppmdpqfpkofjjttqhttpdttndttdd
+F-H5-471 5 qnpppgdpttjjttpdttddttnc
+F-H5-472 2 qfppgddpttjjttcfttpdttdd
+F-H5-473 8 dcfcppccdpttjjttpdttddtthc
+F-H5-474 3 cpfqhqcqppttdpttjjttpdttdd
+F-H5-475 6 epppfqfpgpdpttgottjjttpdttdd
+F-H5-476 2 loppnqnpmpdpttmottjjttpdttdd
+F-H5-477 2 gcppgddpfcjjttgettpdttfdttdd
+F-H5-478 6 ocqfppmddpqcpjncjjttnettpdttndttdd
+F-H5-479 5 cdcfppgddpfcjjccdjttfettpdttfdttdd
+F-H5-480 4 jchdppgddpfcjjttpdttidttddtthc
+F-H5-481 2 ndphpppgdpqfjjttpittqhttpdttdd
+F-H5-482 2 cfhdppgddpfcjjttpdttidttddtthc
+F-H5-483 2 ichdppgddpfcjjttpdttidttddtthc
+F-H5-484 3 cfpppjdpqfqmttjjttpdttddttnc
+F-H5-485 2 fqpppjdpqfqmttjjttpdttddttnc
+F-H5-486 2 pgmqfqppjpdpttcnttjjttpdttdd
+F-H5-487 6 pqqqppnqkpqndppmpnttonttjjttpdttdd
+F-H5-488 5 ocqfppmddpqcjjncpittnettpdttndttdd
+F-H5-489 10 ofpgppqfdpncpjttjjttpfttpdttdd
+F-H5-490 3 cfppfcdpttjjttdjttpdttdd
+F-H5-491 2 pnppnqdpttpjttjjttpdttdd
+F-H5-492 7 bgppdgdpcfjjbeefcddffcdettcettpdttjdttdd
+F-H5-493 5 ofppqnnpqfdpttjjttqhttpdttdd
+F-H5-494 8 dedgppcfdpbejjcdeffcdfttcettpdttjdttdd
+F-H5-495 5 meppqfdpndpjttjjttnettpdttdd
+F-H5-496 3 qcppqfdpndpjttjjttnettpdttdd
+F-H5-497 7 dhppdgdpbgjjcfegbeefcddfbddefccettpdttjdttddttcc
+F-H5-498 4 npomppogdpttjjttpdttndttdd
+F-H5-499 2 jomoppgodpttdnttjjttpdttdd
+F-H5-500 2 pjomppogdpttjjttpdttndttdd
+F-H5-501 7 bdppdgdpbgjjcfefbedfcddefccettpdttjdttddttcc
+F-H5-502 3 pgqfppqddpqcjjncoettpdttkdttddttpc
+F-H5-503 3 omqqpqnqppqpkpqndpttoottjjttpdttdd
+F-H5-504 2 qrqqpqnqppqpkpqndpttoottjjttpdttdd
+F-H5-505 4 ocpppfdpmdjjncdffcnettpdttndttjdttdd
+F-H5-506 3 qcpppfdpmdjjncdffcnettpdttndttjdttdd
+F-H5-507 9 dgppcfdpfcjjttdfttpdttddttjc
+F-H5-508 8 qppqqqppnqkpqndpttoottjjttpdttdd
+F-H5-509 8 egdgppbgdpcfjjbeefcddfbddefccettpdttjdttddttcc
+F-H5-510 9 nepfppmddpncjjfcdfttpdttndttjdttdd
+F-H5-511 5 djnqqqrpppqpjprodpqnqormpopmpnplonttomttjjttpdttdd
+F-H5-512 6 leppqfdplcjjttpdttndttddttic
+F-H5-513 4 nqppfpdpttdnttjjttpdttdd
+F-H5-514 2 pmpppfdpttjjttpdttndttdd
+F-H5-515 2 npppfpdpttdnttjjttpdttdd
+F-H5-516 2 lcpppfdpttjjttpdttndttdd
+F-H5-517 5 fcnqqnpppjdpqfjjttdjttpdttddttnc
+F-H5-518 2 fqppjdjpncdpfcjjttqfttcfttpdttdd
+F-H5-519 4 qhqnpponnpqfdpttqlttjjttpdttdd
+F-H5-520 4 iqnqlqfqppnodpttpnttjjttpdttdd
+F-H5-521 2 njpppmdpqfpjttjjttpdttndttdd
+F-H5-522 8 ccdgppbgdpcfjjbeefcddffcdettcettpdttjdttdd
+F-H5-523 5 fqppnqdpjppnttjjttpdttjdttdd
+F-H5-524 3 rdppqldpqfqnttjjttpdttndttdd
+F-H5-525 3 lcppqldpqfqnttjjttpdttndttdd
+F-H5-526 2 cnppqldpqfqnttjjttpdttndttdd
+F-H5-527 7 mdpppfdpncjjfcdfttpdttndttjdttdd
+F-H5-528 6 efdgppcfdpfcjjttdfttpdttddttjc
+F-H5-529 4 oqppnqnpmpjpqndpttnottjjttpdttdd
+F-H5-530 3 pqppnqnpmpjpqndpttnottjjttpdttdd
+F-H5-531 2 cqppfqjpgpfpcndpttfottjjttpdttdd
+F-H5-532 3 qhppncjpicdpttjjttpfttpdttdd
+F-H5-533 2 fcppqkdpqfjjttdjttpdttndttdd
+F-H5-534 2 cfppncjpicdpttjjttpfttpdttdd
+F-H5-535 2 gpppnqdpttoottjjttpdttdd
+F-H5-536 2 hpppfqdptteottjjttpdttdd
+F-H5-537 3 cfhqnqppjpdpttpnttjjttpdttdd
+F-H5-538 6 beppdgdpcfjjcdeffcdfttcettpdttjdttdd
+F-H5-539 9 nonqppmpnppmjpttdpttjjttpdttdd
+F-H5-540 5 pnfqppnpdpttdnttjjttpdttdd
+F-H5-541 2 jpfqppnpdpttdnttjjttpdttdd
+F-H5-542 4 gdpphddpfcjjttpdttddttictthc
+F-H5-543 2 ofppphdpqfjjttqittqhttpdttdd
+F-H5-544 2 cfpphddpfcjjttpdttddttictthc
+F-H5-545 9 qqprppnqkpnodpttpnttjjttpdttdd
+F-H5-546 5 nqppqndpqfqjttjjttpdttndttdd
+F-H5-547 3 pfppncdpfcjjttdfttpdttddttjc
+F-H5-548 3 pfogppqfdpttjjttqhttpdttdd
+F-H5-549 2 oonqlqmoppttdpttjjttpdttdd
+F-H5-550 2 lonqlqmoppttdpttjjttpdttdd
+F-H5-551 4 qlppnqdpfqpnjpcnttjjttpdttjdttdd
+F-H5-552 3 fcppqnnppjdpqfjjttdjttpdttddttnc
+F-H5-553 2 kcdmppcffphcdpttjjttpdttfdttdd
+F-H5-554 2 qjqhppgddpncjjttpfttdfttpdttdd
+F-H5-555 2 lolqnqppnodpttqnttjjttpdttdd
+F-H5-556 2 dffqenppcndpttclttjjttpdttdd
+F-H5-557 2 qnppqfdpofjjttqhttpdttddttnc
+F-H5-558 2 kplqnqppnodpttqnttjjttpdttdd
+F-H5-559 4 eqppfqfpgpdpcnfottjjttcjttpdttdd
+F-H5-560 3 cdppdgdpcfjjfcefttdfttpdttddttjc
+F-H5-561 2 cqjqfqppcndpdmenttdnttjjttpdttdd
+F-H5-562 9 mdpppgdpncjjttpdttndttjdttdd
+F-H5-563 3 qfppnqdpfcpnttjjttdfttpdttdd
+F-H5-564 4 hefeppkcdpfcjjttdfttpdttddtthc
+F-H5-565 6 mdppqfdpncjjttqhttpdttndttdd
+F-H5-566 4 egdgppcfdpbejjttefttdfttpdttdd
+F-H5-567 3 bddgppcfdpbejjttefttdfttpdttdd
+F-H5-568 6 cfchppttdpttjjttpdttdd
+F-H5-569 5 krqqprppnqkpnodpttpnttjjttpdttdd
+F-H5-570 3 cedmppcfdpttjjttdjttpdttdd
+F-H5-571 3 nppmppqfdpttpjttjjttpdttdd
+F-H5-572 3 oeqfppncdpfcjjttcfttpdttjdttdd
+F-H5-573 3 ndqfppncdpfcjjttcfttpdttjdttdd
+F-H5-574 4 ieppqfdplejjlcnfttpdttndttddttic
+F-H5-575 3 lcpppjdpqfqmttjjttpdttndttdd
+F-H5-576 3 cfgqnqppjpdpttpnttjjttpdttdd
+F-H5-577 9 ofpgppqfdpncjjttpittpfttpdttdd
+F-H5-578 7 nfqfppledplcjjttpdttndttddttic
+F-H5-579 4 bpnqfqhqppcndpttqnttjjttpdttdd
+F-H5-580 6 ofppqfdpttjjttphttpdttdd
+F-H5-581 9 nonqppmpnppnkpttdpttjjttpdttdd
+F-H5-582 8 lolqnqkqkpppjplpnodpttpnttjjttpdttdd
+F-H5-583 4 oqppnqnpmpkppndpttnottjjttpdttdd
+F-H5-584 3 lcppqkdpqfqnttjjttpdttndttdd
+F-H5-585 5 qqppnpdpqnooqfpjttjjttpdttndttdd
+F-H5-586 4 lcppqfdpfcjjttdfttpdttndttdd
+F-H5-587 5 omnqlqnoppqldpttpnttjjttpdttdd
+F-H5-588 2 ldqfppofdplcjjttqhttpdttndttdd
+F-H5-589 5 nqqnppfcdpttjjttcfttpdttdd
+F-H5-590 2 dnfqppqfdpttjjttpdttddttnc
+F-H5-591 2 neqfpplcdpfcjjttdfttpdttddttnc
+F-H5-592 2 drfqppcldpcfcnttjjttpdttfdttdd
+F-H5-593 7 gpjqfqppdnfpttdpttjjttpdttdd
+F-H5-594 3 qdpppgdpqfjjncpittpfttofttpdttdd
+F-H5-595 3 qcpppgdpqfjjncpittpfttofttpdttdd
+F-H5-596 2 eqppfqipgpfpcndpttfottjjttpdttdd
+F-H5-597 5 qepppgdpqfpjmdjjttpfttofttpdttdd
+F-H5-598 2 pqppnqnpmpjppmdpttnottjjttpdttdd
+F-H5-599 6 fofqjqgpppdnfpttdpttjjttpdttdd
+F-H5-600 3 hcncppjcdpttjjttqfttpdttdd
+F-H5-601 2 djqjppqfdpttjjttpdttddttnc
+F-H5-602 2 qmqjppqfdpttjjttpdttddttnc
+F-H5-603 5 gqnqlqkpkqjpjqiphqnopplolpgodpttpnttjjttpdttdd
+F-H5-604 2 cnhqnqppjpdpttqnttjjttpdttdd
+F-H5-605 2 jdhqnqppjpdpttqnttjjttpdttdd
+F-H5-606 7 cbppcddpfcjjccdedbpdttddtthcttdctteb
+F-H5-607 8 eccdppfcdpccjjdbdecbpdttddtthcttdctteb
+F-H5-608 4 nipmppqfdpofjjttpittpdttndttdd
+F-H5-609 2 pjqgpppgdpogjjttqfttpfttpdttdd
+F-H5-610 3 qhqfpprddpttjjttpdttddttnc
+F-H5-611 2 qgqfpprddpttjjttpdttddttnc
+F-H5-612 3 nolqnqppfqdpttcnttjjttpdttdd
+F-H5-613 2 qcppncdpfcjjttcfttpdttddttlc
+F-H5-614 8 decdppfcdpccjjttpdttddtthcttdc
+F-H5-615 5 qpqqppnpdpqnooqfpjttjjttpdttndttdd
+F-H5-616 6 rgppqjdppgjjqfqgqepfttofttqdttpdttdd
+F-H5-617 3 qnpppgdpttjjttpdttmdttdd
+F-H5-618 2 fcppdmgpttdpttjjttpdttdd
+F-H5-619 5 gcdfppgddpfcjjttpdttfdttddtthc
+F-H5-620 2 fofqhqgpppdnfpttdpttjjttpdttdd
+F-H5-621 8 pooqppnqnpmpkppndpttnottjjttpdttdd
+F-H5-622 7 ofpgppqfdpncjjfcpfttdfttpdttjdttdd
+F-H5-623 4 pgppqfdpncjjfcpfttdfttpdttjdttdd
+F-H5-624 4 qeqfppqcdpncjjttpittpfttpdttdd
+F-H5-625 3 cpfqppcqipcnfpttdpttjjttpdttdd
+F-H5-626 5 egcfppcddpfcjjccdedbpdcbddtthcttecttdctteb
+F-H5-627 8 ebcdppfcdpccjjdbdettpdttddtthcttdc
+F-H5-628 4 qqppnqdpqnoottjjttpdttjdttdd
+F-H5-629 2 nfppqfdpncjjttdjttoettpdttdd
+F-H5-630 3 ncndppfcdpttjjttcfttpdttdd
+F-H5-631 2 jdndppfcdpttjjttcfttpdttdd
+F-H5-632 6 neqfppmddpncjjttqhttpdttndttdd
+F-H5-633 3 fqoqnqppnpdpttqnttjjttpdttdd
+F-H5-634 2 nqppqfdppfjjttqettpdttddttnc
+F-H5-635 3 qfppkcdpfcjjttcfttpdttddttmc
+F-H5-636 2 rdppqkdpqfqmttjjttpdttddttnc
+F-H5-637 2 qdpppgdpqfjjncpffcofttdfttpdttjdttdd
+F-H5-638 3 ccppcfdpfcjjtteettpdttddttjc
+F-H5-639 3 jpqfppqcdppcjjncqhttpfttqettpdttdd
+F-H5-640 3 frfqhqcqeqcpppcnfpttdpttjjttpdttdd
+F-H5-641 7 cdppfcdpccjjttpdttddtthcttdc
+F-H5-642 6 qepppgdpqfqjndjjttpfttofttpdttdd
+F-H5-643 2 dqjqfqppgpfpdndpttfottjjttpdttdd
+F-H5-644 7 cfppcddpfcjjccdedbpdcbddtthcttecttdctteb
+F-H5-645 2 fqppjpdpttjjttdjttpdttdd
+F-H5-646 7 dbppcddpfcjjccdettpdttddtthcttdc
+F-H5-647 2 lcpppjdpqfqnttjjttpdttndttdd
+F-H5-648 2 cnpppjdpqfqnttjjttpdttndttdd
+F-H5-649 5 pqqpqqppnpdpqnooqfpjttjjttpdttndttdd
+F-H5-650 5 ogpgppqfdpqepjndjjrcpfttofttpdttodttdd
+F-H5-651 2 qnqrppoqnpnqjpmpdppnpottnottjjttpdttdd
+F-H5-652 3 dbppgddpfcjjdcfegbpdebfdttedttddttecttcc
+F-H5-653 2 qlppnqdpfqpnjpdnttjjttdjttpdttdd
+F-H5-654 2 fqppjddpncjjfcdjttpfttdfttpdttdd
+F-H5-655 4 crfqhqdqcqbqppcpdpttdottjjttpdttdd
+F-H5-656 4 ndqnppqfnpofdpttjjttqhttpdttdd
+F-H5-657 2 qkqnppqfdpttjjttqhttpdttdd
+F-H5-658 2 hqnqlqfqppttdpttjjttpdttdd
+F-H5-659 2 pfqnppqfdpttjjttqhttpdttdd
+F-H5-660 3 cnpqmrmqlrlqoqppnqnpjqlpmpdpttnottjjttpdttdd
+F-H5-661 3 jcppqjdprhjjrgqhpgphqfqgqepfttofttqdttpdttdd
+F-H5-662 3 njpppmnpqfdpttpjttjjttpdttdd
+F-H5-663 2 fqppcndpdgjjttdjttpdttfdttdd
+F-H5-664 4 qnjqnqppfqdpttcnttjjttpdttdd
+F-H5-665 6 rhppqjdprgjjpgqhqfqgqepfttofttqdttpdttdd
+F-H5-666 4 elppfqdpcldnttjjttcjttpdttdd
+F-H5-667 5 qhqjpprgdppgjjqfqgqepfttofttqdttpdttdd
+F-H5-668 2 fcqqnqpprpjpqpdproqoqnpormpnpmonplomttjjttdjttpdttdd
+F-H5-669 4 bqhqfqcqdqppcpdpttdottjjttpdttdd
+F-H5-670 5 lqppqnnppjdpqfjjttpdttndttddttjc
+F-H5-671 2 jpfeppfcdpibjjdbdfttpdttidttddttcc
+F-H5-672 2 ogrgpppgdpqfjjrepfrdofqdqettpettpdttddttqc
+F-H5-673 5 gchepphddpfcjjttpdttidttddtthc
+F-H5-674 2 qhqjppqfdpttjjttpdttndttdd
+F-H5-675 2 iqlqpppmnpqfdpttjjttpdttndttdd
+F-H5-676 2 rdpppnnpqfdpttjjttpdttndttdd
+F-H5-677 5 cpdqfqppcqipcndpdmenttdnttjjttpdttdd
+F-H5-678 5 phqjpprhdprgjjpgqhqfqgqepfttofttqdttpdttdd
+F-H5-679 5 pepfppmddpocjjncdffcnettpdttndttjdttdd
+F-H5-680 2 peqeppttdpttjjttpdttdd
+F-H5-681 2 qdqeppttdpttjjttpdttdd
+F-H5-682 6 cofqdqcqppcpipcndpdmenttdnttjjttpdttdd
+F-H5-683 2 noqqqppqppnpdpqnooqfpjttjjttpdttndttdd
+F-H5-684 2 qbpfppqddpqcjjncdffcoettpdttjdttddttpc
+F-H5-685 2 poqqpqnqppfqjpqpdppnoottdnttjjttpdttdd
+F-H5-686 3 qlpjppqfdppfjjttqettpdttndttdd
+F-H5-687 2 gqnqoqnpppjpdpttpnttjjttpdttdd
+F-H5-688 4 gdqfppledpiejjlcnfttpdttndttddttic
+F-H5-689 3 gcqfppledpiejjlcnfttpdttndttddttic
+F-H5-690 2 kqppnqdpttnottjjttpdttdd
+F-H5-691 2 ccppfcdpttjjttfettpdttdd
+F-H5-692 2 lpppnqdpttnottjjttpdttdd
+F-H5-693 4 qcppqfdpmdjjncqhttnettpdttndttdd
+F-H5-694 2 cphqfqppcndpdmenttdnttjjttpdttdd
+F-H5-695 6 qcppqfdpndpjttjjttoettpdttdd
+F-H5-696 2 cfnqfqcnppfcdpttpnttjjttpdttdd
+F-H5-697 2 lcfdppncdpfcjjttdfttpdttddttec
+F-H5-698 2 rnqnnqpnpppjdpqfqottjjttpdttddttnc
+F-H5-699 5 qeqfppqcdpncjjttqhttpfttpdttdd
+F-H5-700 3 pfneppncdpfcjjttcfttpdttddttlc
+F-H5-701 2 iqnqlqfqppnodpttcnttjjttpdttdd
+F-H5-702 6 fqppnqdpjppnttpjttjjttpdttdd
+F-H5-703 6 dcppcfdpgdjjfcdjccfettpdttfdttddttcd
+F-H5-704 4 mdppqfdpncjjfcdfttpdttndttjdttdd
+F-H5-705 5 oeqfppmedpndpjttjjttnettpdttdd
+F-H5-706 2 ofpppmnpqfdpttjjttpdttddttnc
+F-H5-707 2 lqpppmnpqfdpttjjttpdttddttnc
+F-H5-708 5 ocppqfdpodpjqcjjpcoencqdttpdttndttmdttdd
+F-H5-709 4 hcqnnqpjppqfdpfcjjttdjttpdttddttnc
+F-H5-710 5 qdpgppqfdpqepjmdjjttpfttofttpdttdd
+F-H5-711 4 qdqfppnddpqcpjttjjttoettpdttdd
+F-H5-712 2 cpfqppcqjpdndptteottjjttpdttdd
+F-H5-713 3 pnnqppfqdpjpdnttjjttdjttpdttdd
+F-H5-714 2 djqnpppjdpqfjjttpdttndttjdttdd
+F-H5-715 4 cdppcfdpgdjjfcdjccfettpdttfdttddttec
+F-H5-716 2 mcppqfdpmdpjqcjjncnettpdttndttddttoc
+F-H5-717 2 cqppfqjpdmdptteottjjttpdttdd
+F-H5-718 4 cddfppfcdpccjjttpdttfdttddtthc
+F-H5-719 2 qeqfppnddpqcjjttqhttpfttpdttdd
+F-H5-720 6 ndqfppoddpqcpjpcjjncoettqdttpdttmdttdd
+F-H5-721 4 ocqfppmddpqcpjpcjjncnettqdttpdttndttdd
+F-H5-722 3 oeqfppncdpfcjjttdfttpdttddttjc
+F-H5-723 2 rdppqkdpqfqnttjjttpdttddttnc
+F-H5-724 3 ffehppchdpfcjjttcjttdfttpdttdd
+F-H5-725 2 fpfqppeldpcldnttjjttcjttpdttdd
+F-H5-726 2 chnqppcfdpttpnttjjttpdttdd
+F-H5-727 2 npqnppfcdpttjjttdfttpdttdd
+F-H5-728 3 epcrfqhqdqcqbqppcpdpttdottjjttpdttdd
+F-H5-729 6 peqfppoddpqcpjpcjjocoencqdttpdttndttmdttdd
+F-H5-730 2 hojqhqfqppfodpttdnttjjttpdttdd
+F-H5-731 3 cmdqfqppcqipcpdpbodocncodmenttdnttjjttpdttdd
+F-H5-732 2 bmdqfqppcqipcpdpbodocncodmenttdnttjjttpdttdd
+F-H5-733 2 ohppqhdpncpjttjjttpfttpdttdd
+F-H5-734 4 ndqfppofdpttjjttphttpdttdd
+F-H5-735 2 cnfqppfohpttdpttjjttpdttdd
+F-H5-736 3 nolqnqhqfqppfodpttdnttjjttpdttdd
+F-H5-737 3 qjppqnnpondpqfqlttjjttqhttpdttdd
+F-H5-738 5 fofqppgpfpepdpttgottjjttpdttdd
+F-H5-739 2 poornqoqnpppttdpttjjttpdttdd
+F-H5-740 4 bodqfqppcqipcpdpcncodmenttdnttjjttpdttdd
+F-H5-741 4 qcppqfdpmepjndjjttoettnettpdttdd
+F-H5-742 4 rdppqfdpodpjqcjjpcpeocoencqdttpdttndttmdttdd
+F-H5-743 4 mcqfppmedpndpjqcjjpcoencnettqdttpdttmdttdd
+F-H5-744 2 kdqfppmedpndpjqcjjpcoencnettqdttpdttmdttdd
+F-H5-745 3 drfqcrdqhqbqcqepppcpdpttdottjjttpdttdd
+F-H5-746 5 qpnqppqojpqndppmpnttonttjjttpdttdd
+F-H5-747 4 pooqjqnqppmpnppndpttnottjjttpdttdd
+F-H5-748 2 qdpgppqfdpqeqjndjjttpfttofttpdttdd
+F-H5-749 4 dngppplodpttpnttjjttpdttdd
+F-H5-750 2 nqgqjpppttdpttjjttpdttdd
+F-H5-751 3 dnnqppfqdpjppnttjjttpdttjdttdd
+F-H5-752 6 meppqfdpndpjqcjjpcoencnettqdttpdttmdttdd
+F-H5-753 2 mpqpnqppqojpqndppmpnttonttjjttpdttdd
+F-H5-754 2 ogpkpppjdppiqlohqjqfjjofqilcqhttphttpdttndttdd
+F-H5-755 2 qcppqfdpndqjttjjttnettpdttdd
+F-H5-756 2 egppdfdpfcjjttefttpdttddttjc
+F-H5-757 6 dofqdqcqppcpipbodpcncodmenttdnttjjttpdttdd
+F-H5-758 3 nqppjqdpttjjttpdttjdttdd
+F-H5-759 2 ceppmedphejjfedfkdpdjdhdidddfcmcttlcttjcttictthc
+F-H5-760 4 qepgppqfdpqdjjncpffcofttdfttpdttjdttdd
+F-H5-761 2 qbpppfdpmdjjocdfncpefcnettpdttndttjdttdd
+F-H5-762 2 omppnpopqodpqnpnpmonqfpjttjjttpdttndttdd
+F-H5-763 2 ndnqppqfdpfcpnttjjttdfttpdttdd
+F-H5-764 6 neqfppnddpqcpjpcjjncoettqdttpdttmdttdd
+F-H5-765 3 dqppfqfpgpdpepgottfottjjttpdttdd
+F-H5-766 3 eeppdgdpcfjjdeegttefttdfttpdttdd
+F-H5-767 4 neppncdpfcjjttcfttpdttkdttdd
+F-H5-768 3 npnqpppmdpqfpkofjjttqhttpdttndttdd
+F-H5-769 4 ffehppchjpjddpncckfcjjttpfttdfttpdttdd
+F-H5-770 2 cfppkqdpfqdnttpjttjjttpdttdd
+F-H5-771 2 kcfeppncdpfcjjttcfttpdttddtthc
+F-H5-772 2 hqnqlqfqppnodpttqnttjjttpdttdd
+F-H5-773 3 pqoqppnqnpmpjpqndpttnottjjttpdttdd
+F-H5-774 2 pooqppnqnpmpjpqndpttnottjjttpdttdd
+F-H5-775 4 pcppqfdpmdjjncdffcnettpdttndttjdttdd
+F-H5-776 3 ohppqfdpofjjlcqhttmettpdttndttdd
+F-H5-777 2 icpprfdpqfjjqdqhqcogttpettpdttddttpc
+F-H5-778 2 qnnqppphdpttjjttpdttndttdd
+F-H5-779 2 lipppmdpqfjjofpimfnittpdttndttldttdd
+F-H5-780 3 lpnqlqkpkqjpjqipppnodpttpnttjjttpdttdd
+F-H5-781 2 hqnqlqkpkqjpjqipppnodpttpnttjjttpdttdd
+F-H5-782 3 pippqnnpqfdpofjjttqhttpdttndttdd
+F-H5-783 5 obppqfdpmdpjqcjjpcnencqdttpdttndttddttoc
+F-H5-784 4 pepgppqfdprejjqdpfncoffcdfttqettpdttjdttdd
+F-H5-785 2 qhppqnnpcfdpncjjttpfttpdttfdttdd
+F-H5-786 2 nqppiqdpttjjttdjttpdttdd
+F-H5-787 2 pepppgdpqfpjqejjmdpfttofttqdttpdttdd
+F-H5-788 2 lqpqoqppnqnpmpjppmdpttnottjjttpdttdd
+F-H5-789 4 qcrgpppgdpqfjjrepfqdofncdffcqettpettpdttjdttdd
+F-H5-790 4 rcppqfdprdpjodjjqcrepcpeocoencqdttpdttndttmdttdd
+F-H5-791 2 qcppqfdpndjjttpittnettpdttdd
+F-H5-792 2 omppnqkppndpttonttjjttpdttdd
+F-H5-793 2 jdnqgqiqppiodpttpnttjjttpdttdd
+F-H5-794 4 qdpppfdpmdjjncpdttndttddttmcttlc
+F-H5-795 4 qeqfpprddpodpjrcjjqcrepcpeocoencqdttpdttndttmdttdd
+F-H5-796 4 bmdqfqppcqjpcpdpbodocncodmenttdnttjjttpdttdd
+F-H5-797 2 fqnqjpppttdpttjjttpdttdd
+F-H5-798 2 qcppqfdpncjjfccfttoettpdttjdttdd
+F-H5-799 2 pgpmppnjdpqfpjttjjttpdttndttdd
+F-H5-800 2 rrrqqqrpppqnnpqfdpttjjttpdttndttdd
+F-H5-801 2 eonqppfqjpdndpttqnttjjttpdttdd
+F-H5-802 2 onnqppfqjppndpttcnttjjttpdttdd
+F-H5-803 4 odqfppmddpqcpjpcjjncneobqdttpdttndttddttoc
+F-H5-804 2 cnppnqdpiqpnttqjttjjttpdttdd
+F-H5-805 2 onfqhqmpppfokpqndppmpnttdnttjjttpdttdd
+F-H5-806 2 knppnqkpfqdpnopnttdnttjjttpdttdd
+F-H5-807 5 iplqnqkqkpjqjpppnodpttpnttjjttpdttdd
+F-H5-808 3 cfppckdpttcnttjjttpdttdd
+F-H5-809 4 frhqfqppdqepcqdpttcpttjjttpdttdd
+F-H5-810 2 phppnqdpfqqnjpcnqfjjttqhttpdttjdttdd
+F-H5-811 2 mcppqfdpmdjjqcqhncnettpdttndttddttoc
+F-H5-812 2 qdppqfdpmdjjqcqhncnettpdttndttddttoc
+F-H5-813 2 ogrgpppgdpqfjjrepfrdofqddfncqefcpettpdttjdttddttqc
+F-H5-814 4 phpppgdpqfpjqejjndogrcpfttofttpdttodttdd
+F-H5-815 2 qippqrnpoqjpnqdpmppolpnopnmottlottjjttpdttdd
+F-H5-816 3 dccfppfcdpccjjtteettpdttddttjc
+F-H5-817 2 nppppmdpqfjjttpittpdttndttdd
+F-H5-818 2 mpppnqnppmdpqfpkofjjttqhttpdttndttdd
+F-H5-819 2 rgpppgdpqfjjrepfqdofncdffcqettpettpdttjdttdd
+F-H5-820 3 ieppqnnppjdpqfjjledjlcnfttpdttndttddttic
+F-H5-821 4 epfqhqdqppcqdpttcpttjjttpdttdd
+F-H5-822 3 fjppdmdpdfjjcfdjttcettpdttfdttdd
+F-H5-823 2 qcppqnnpqfdpndpjttjjttnettpdttdd
+F-H5-824 2 egppdfdpncjjfcpfttefttpdttjdttdd
+F-H5-825 5 fdpphedphdjjfcpdttidttddtthcttgc
+F-H5-826 4 ocqfppmddpqcjjncqhttnettpdttndttdd
+F-H5-827 3 noppnqkpfqdpttdnttjjttpdttdd
+F-H5-828 3 qdqfppmedpndpjqcjjttoettnettpdttdd
+F-H5-829 3 phpprgdppgjjqfogrepfqdofttqettpettpdttdd
+F-H5-830 5 pqqqppoqnpnqkpmpdppnpottnottjjttpdttdd
+F-H5-831 3 feppncdpfcjjttcfttpdttddtthc
+F-H5-832 2 pcqfppqcdpncjjfccfttoettpdttjdttdd
+F-H5-833 2 cfpppjdpqfqnttjjttpdttddttnc
+F-H5-834 4 neqfppmddpncjjfcdfttpdttndttjdttdd
+F-H5-835 2 pjpmppqfdppfjjttqettpdttndttdd
+F-H5-836 3 mcppqfdpmdjjqcpincnettpdttndttddttoc
+F-H5-837 2 qdppqfdpmdjjqcpincnettpdttndttddttoc
+F-H5-838 2 repppgdpqfjjqdpfncoffcdfttqettpdttjdttdd
+F-H5-839 2 pnnqqnpppjdpqfqottjjttpdttddttnc
+F-H5-840 2 fqppjddpncjjfcqfttcfttpdttddttoc
+F-H5-841 2 ogqhppjddpncjjfccjttpfttdfttpdttdd
+F-H5-842 2 ejhoppemfpegdpttjjttpdttfdttdd
+F-H5-843 3 dfpphddpgdjjfcpdttidttddttjctthc
+F-H5-844 4 rfpppidpqfjjofqhttqettpdttndttdd
+F-H5-845 5 ohphpppgdpqfpjqejjndogrcpfttofttpdttodttdd
+F-H5-846 2 pnnqppfpdpttdnttjjttpdttdd
+F-H5-847 2 cnppnqdpcfqnttjjttpdttddttfc
+F-H5-848 2 ncppcfdpcdjjfcegccdedbpdcbddtthcttecttdctteb
+F-H5-849 2 ndphppohdpqfjjpfpittqhttqgttpdttdd
+F-H5-850 4 mqprpqqqppoqnpnqkpmpdppnpottnottjjttpdttdd
+F-H5-851 4 pfpppmdpqfjjttqettpdttndttdd
+F-H5-852 2 qqrpppqnnpqfdpttjjttpdttndttdd
+F-H5-853 4 gofrhqfqppdqepcqdpttcpttjjttpdttdd
+F-H5-854 2 mqfqhqkpppfodpttdnttjjttpdttdd
+F-H5-855 2 lonqlqipppnodpttpnttjjttpdttdd
+F-H5-856 2 qeqfppnddppcjjttqhttpfttpdttdd
+F-H5-857 2 qdqfppnddppcjjttqhttpfttpdttdd
+F-H5-858 3 qjnqppqfdpttpnttjjttpdttdd
+F-H5-859 2 qjnqppfqdpjppnqlcnttjjttpdttjdttdd
+F-H5-860 5 reqfpprddpodpjqcjjpcpeocoencqdttpdttndttmdttdd
+F-H5-861 2 rdpprgdppgjjqfpfreofqddfncqefcpettpdttjdttddttqc
+F-H5-862 2 nfqhppohdpncpjttjjttpfttpdttdd
+F-H5-863 5 pcppqfdpqcjjncqhttpfttqettpdttdd
+F-H5-864 3 dqhqfqppcqdpttcpttjjttpdttdd
+F-H5-865 3 emfqdqcqppcpjpbodpcndodmcobmenttdnttjjttpdttdd
+F-H5-866 3 ooppnqdpqnjjttdjttpdttjdttdd
+F-H5-867 2 rqhqfqppmpopqokpfodpqnpnpmonttdnttjjttpdttdd
+F-H5-868 4 hqnroqnqlqkpkqjpjqipppnolplodpttpnttjjttpdttdd
+F-H5-869 3 ocpfppqddpmdjjncpdttndttddttmcttlc
+F-H5-870 2 qgqnpppinpttdpttjjttpdttdd
+F-H5-871 4 nqppqldpqfjjttdjttpdttndttdd
+F-H5-872 3 oqnqlqqpppqnnpttdpttjjttpdttdd
+F-H5-873 2 qohqfqppmpkpfodpqnpnpmonttdnttjjttpdttdd
+F-H5-874 4 qgqfppqcdppcjjncpittpfttqettpdttdd
+F-H5-875 2 jdnqppfcdpttjjttdjttpdttdd
+F-H5-876 3 dldqfqppcqjpcpdpbodocncodmenbmdnttemttjjttpdttdd
+F-H5-877 4 gqfqgpppttdpttjjttpdttdd
+F-H5-878 2 nqppqldpqfjjttpittpdttndttdd
+F-H5-879 3 crjqfqppeqfpgpdpdnfottdottjjttpdttdd
+F-H5-880 4 gccfppgddpcdjjfcdjccfettpdttfdttddttec
+F-H5-881 3 kqqqprppnqdpqfqnttjjttpdttndttdd
+F-H5-882 4 pcppqfdpqcjjncpittpfttqettpdttdd
+F-H5-883 2 peppqedpttjjttqdttpdttdd
+F-H5-884 4 pfneppncdpfcjjttcfttpdttkdttdd
+F-H5-885 2 opfqhqmpppqokpfodpqnpnpmonttdnttjjttpdttdd
+F-H5-886 2 bpfqdreqcrdqhqbqcqepppcpdpttdottjjttpdttdd
+F-H5-887 2 ocqfppqedppejjqdqhpcrdqbpdttodttddttrcttqc
+F-H5-888 4 gofqgqppgpfpttdpttjjttpdttdd
+F-H5-889 3 ohphpppgdpqfjjreogttpfttofttpdttdd
+F-H5-890 3 ohphpprgdppgpjqfjjreogrdpfqdofndqettpettpdttddttqc
+F-H5-891 4 repppgdpqfpjqdjjndpfttofttqettpdttdd
+F-H5-892 3 cfppqfdpqcjjpcpincqgttpfttqettpdttdd
+F-H5-893 3 fpfqhqeqppdqepttdpttjjttpdttdd
+F-H5-894 4 cpdqfqppcqipdndptteottjjttpdttdd
+F-H5-895 3 kdqfppmedpndpjqcjjpcoencnenbqdmbpdttmdttddttmcttlb
+F-H5-896 2 ldpmppqfdpofjjmfqhttohttpdttndttdd
+F-H5-897 4 ldqfppofdpmfjjttqhttpdttndttdd
+F-H5-898 4 mrprpqqqmqoqppnqnplqkpmpdppnpottnottjjttpdttdd
+F-H5-899 4 mfpppmdpqfjjofpittnittpdttndttdd
+F-H5-900 2 oonqkqqnppttdpttjjttpdttdd
+F-H5-901 2 ndqfppncdpttjjttqittpdttdd
+F-H5-902 3 qqjqnqpppndpttoottjjttpdttdd
+F-H5-903 2 dofqppeqfpgpdpcnfottjjttcjttpdttdd
+F-H5-904 2 pcqfppmddpocqjncjjttnettpdttndttdd
+F-H5-905 4 eqdrfqcrdqhqbqcqepppcpdpttdottjjttpdttdd
+F-H5-906 3 gpppfqipcqfpcndpttcpttjjttpdttdd
+F-H5-907 2 ocqfppmddppcjjncdffcnettpdttndttjdttdd
+F-H5-908 2 qnnqppphdpttjjttdjttpdttdd
+F-H5-909 2 mqlqppkpnpqnlpttdpttjjttpdttdd
+F-H5-910 2 npqnppqgdpttjjttpdttndttdd
+F-H5-911 3 lcpppjdpqfqlpfjjttqettpdttndttdd
+F-H5-912 2 fccfppmddpttjjttpfttpdttdd
+F-H5-913 4 ogrgpppgdpqfpjrejjrdpfqdofndqettpettpdttddttqc
+F-H5-914 2 oonqjqfqppqndpttcnttjjttpdttdd
+F-H5-915 4 pcppqfdpndpjqcjjttoettqdttpdttdd
+F-H5-916 2 pmppqhdpohpjncjjttpfttnfttpdttdd
+F-H5-917 2 pnnqoqfqppnpdpttcnttjjttpdttdd
+F-H5-918 4 mqnqlqmpppqnnpttdpttjjttpdttdd
+F-H5-919 2 oeqfppmddpttqjttjjttpdttdd
+F-H5-920 3 jppgppqfdpqcjjpcqhncqgttpfttqettpdttdd
+F-H5-921 4 mbppqfdpmepjndjjqcoepcnencqdttpdttmdttddttmc
+F-H5-922 3 pcqhppncdpttjjttqfttpdttdd
+F-H5-923 4 qqprppnqdpqfqnttjjttpdttndttdd
+F-H5-924 2 qdqfppqcdpncjjttqhttoettpdttdd
+F-H5-925 2 qdqfppqcdpncjjttoettpdttddttlc
+F-H5-926 3 ncnqppqfdpttqnttjjttpdttdd
+F-H5-927 4 nbppqfdpmepjndjjqcoepcnencqdmbpdttmdttddttmcttlb
+F-H5-928 3 lrprmrqqpqoqmqnqpplqnpmpkplpdppnpottnottjjttpdttdd
+F-H5-929 4 fpgqfqgpppttdpttjjttpdttdd
+F-H5-930 3 ogpgpprfdpqfjjofpfttqettpettpdttdd
+F-H5-931 3 nqpppmdpqfqkofjjttqhttpdttndttdd
+F-H5-932 3 kcqfppicdpttjjttpdttndttdd
+F-H5-933 4 rgpppgdpqfpjrejjqdpfndofttqettpettpdttdd
+F-H5-934 3 nipppmnpqfdpofjjttpittpdttndttdd
+F-H5-935 3 pfqfppmddpttjjttpittpdttdd
+F-H5-936 2 kppplqnpqnlpttdpttjjttpdttdd
+F-H5-937 2 odqepppedpttjjttqdttpdttdd
+F-H5-938 2 phpprgdppgjjqfogrepfrdofqdqettpettpdttddttqc
+F-H5-939 2 lqfqhqnpppfodpttdnttjjttpdttdd
+F-H5-940 4 pnppqndpqfqottjjttpdttddttnc
+F-H5-941 4 phpprgdppgpjqfjjreogrdpfqdofndqettpettpdttddttqc
+F-H5-942 3 oqqqppnqnppnkpttdpttjjttpdttdd
+F-H5-943 2 nnnqppiqdpqlpnttjjttpdttjdttdd
+F-H5-944 2 odqfppnddpqcpjpcjjttoettqdttpdttdd
+F-H5-945 2 rcqfppnddpqcpjpcjjttoettqdttpdttdd
+F-H5-946 2 qmqippqfdpttjjttpdttddttnc
+F-H5-947 4 qnppqgdpttjjttpdttndttdd
+F-H5-948 2 fcnqfqppqndpnccnttjjttqfttpdttdd
+F-H5-949 4 cqppfqipdndptteottjjttpdttdd
+F-H5-950 2 cecfppgddpfcjjecfettpdttfdttddttdc
+F-H5-951 2 cfndppncdpfcjjttqfttpdttddttoc
+F-H5-952 2 fqmrpqlrmqoqlqnqppjqnpmplpcndpttnottjjttpdttdd
+F-H5-953 2 mqhrhqgrgqjqdqfqppeqhpgpfpqndpttfottjjttpdttdd
+F-H5-954 2 qdpfppmddpqcjjncdffcnettpdttndttjdttdd
+F-H5-955 2 qnnqppqldpqfjjttdjttpdttndttdd
+F-H5-956 3 jpnqppfqdpttqmttjjttpdttdd
+F-H5-957 4 qcrgpppgdpqfpjrejjqdpfndofttqettpettpdttdd
+F-H5-958 4 pfqgppogdpttjjttqfttpdttdd
+F-H5-959 2 qgpgppogdpqfjjofpfttqettpettpdttdd
+F-H5-960 3 cdppcfdpfcjjcceettpdttddttjcttdc
+F-H5-961 4 dhppdgdpcfjjbeegttefttdfttpdttdd
+F-H5-962 2 qcpppgdpncjjttoettpdttddttjc
+F-H5-963 3 dqfqppcqipdndptteottjjttpdttdd
+F-H5-964 2 pmqqpqnqjqqpppqndpttoottjjttpdttdd
+F-H5-965 2 qpmqnqlqmpppqnnpttdpttjjttpdttdd
+F-H5-966 3 jdfqppcqdpcneottpjttjjttpdttdd
+F-H5-967 4 qepgppqfdpqdpjndjjttpfttofttpdttdd
+F-H5-968 3 fqnqqnpppjdpqfjjttcjttpdttddttnc
+F-H5-969 2 oqnqppfqjpttdpttjjttpdttdd
+F-H5-970 2 qqpqkqnqppttdpttjjttpdttdd
+F-H5-971 3 dcppdfdpfcjjccpdttfdttddttcdtthc
+F-H5-972 2 okpmppninpqfdpofjjttpittpdttndttdd
+F-H5-973 3 qcqlppqfdprdqnttjjttpdttndttdd
+F-H5-974 2 rdppqfdpofjjttphttpdttndttdd
+F-H5-975 4 qcppqfdpncjjttoettpdttddttlc
+F-H5-976 2 pnnqkqnoppttdpttjjttpdttdd
+F-H5-977 2 ndpppgdpttqjttjjttpdttdd
+F-H5-978 3 npnqpppmdpqfqkofjjttqhttpdttndttdd
+F-H5-979 3 iqfrhqfqeqipppfodpttdnttjjttpdttdd
+F-H5-980 2 gqlqjqppttdpttjjttpdttdd
+F-H5-981 2 ndppqfdpqcjjpcpincoettqdttpdttmdttdd
+F-H5-982 2 phqnpppinpqfdpofjjttqhttpdttndttdd
+F-H5-983 4 lbqfppmedpndpjqcjjpcoencnembqdttpdttmdttddttmc
+F-H5-984 4 ldpmppqfdpofjjmfpittnittpdttndttdd
+F-H5-985 2 qdppqfdpqcjjnccffcoettpdttjdttddttpc
+F-H5-986 4 rdpprgdppgpjqfjjrepfqdofndqettpettpdttddttqc
+F-H5-987 2 molqfrjqfqiqkphqjpeqippphohpfodpttdnttjjttpdttdd
+F-H5-988 2 qloqnrlqnqkqkpjqjphqipppnolplodpttpnttjjttpdttdd
+F-H5-989 2 qephpppgdpqfqjndjjttpittqhttpdttdd
+F-H5-990 4 pepgppqfdprepjqdjjndpfttofttqettpdttdd
+F-H5-991 3 eqhqfqppdqepttdpttjjttpdttdd
+F-H5-992 2 fqkqnqppiqdpttpnttjjttpdttdd
+F-H6-1 362 fqppttdpttpjttdjttpdttdd
+F-H6-2 67 qfppttdpttpjttdjttpdttdd
+F-H6-3 41 mdppttdpttpjttdjttpdttdd
+F-H6-4 40 pgppttdpttpjttdjttpdttdd
+F-H6-5 15 jdppttdpttpjttdjttpdttdd
+F-H6-6 13 jcppttdpttpjttdjttpdttdd
+F-H6-7 10 mcppttdpttpjttdjttpdttdd
+F-H6-8 10 jjppttdpttpjttdjttpdttdd
+F-H6-9 6 fpppttdpttpjttdjttpdttdd
+F-H6-10 4 qgppttdpttpjttdjttpdttdd
+F-H6-11 4 ogppttdpttpjttdjttpdttdd
+F-H6-12 211 dnfqppttdpttpjttdjttpdttdd
+F-H6-13 158 lcncppttdpttpjttdjttpdttdd
+F-H6-14 105 qfncppttdpttpjttdjttpdttdd
+F-H6-15 92 jpnqppttdpttpjttdjttpdttdd
+F-H6-16 81 kdncppttdpttpjttdjttpdttdd
+F-H6-17 53 npnqppttdpttpjttdjttpdttdd
+F-H6-18 47 jqfqppttdpttpjttdjttpdttdd
+F-H6-19 43 ecfcppttdpttpjttdjttpdttdd
+F-H6-20 34 kcncppttdpttpjttdjttpdttdd
+F-H6-21 17 pcncppttdpttpjttdjttpdttdd
+F-H6-22 16 hdfcppttdpttpjttdjttpdttdd
+F-H6-23 14 jpncppttdpttpjttdjttpdttdd
+F-H6-24 13 qmnqppttdpttpjttdjttpdttdd
+F-H6-25 10 nencppttdpttpjttdjttpdttdd
+F-H6-26 9 jjfcppttdpttpjttdjttpdttdd
+F-H6-27 6 oonqppttdpttpjttdjttpdttdd
+F-H6-28 5 pgncppttdpttpjttdjttpdttdd
+F-H6-29 3 onnqppttdpttpjttdjttpdttdd
+F-H6-30 3 fcncppttdpttpjttdjttpdttdd
+F-H6-31 71 fqppnqdpttpnttpjttdjttpdttdd
+F-H6-32 37 mpppfqdpttdnttpjttdjttpdttdd
+F-H6-33 18 kcppfcdpttpjttdjttdfttpdttdd
+F-H6-34 18 jpppnqdpttpnttpjttdjttpdttdd
+F-H6-35 11 npppfqdpttdnttpjttdjttpdttdd
+F-H6-36 8 fqppncdpttpjttdjttpfttpdttdd
+F-H6-37 6 pbppncdpttpjttdjttpfttpdttdd
+F-H6-38 5 phppncdpttpjttdjttpfttpdttdd
+F-H6-39 5 cnppnqdpttpnttpjttdjttpdttdd
+F-H6-40 4 hqppnqdpttpnttpjttdjttpdttdd
+F-H6-41 3 jqppnqdpttpnttpjttdjttpdttdd
+F-H6-42 3 mqppfqdpttdnttpjttdjttpdttdd
+F-H6-43 3 cnppncdpttpjttdjttpfttpdttdd
+F-H6-44 3 idppncdpttpjttdjttpfttpdttdd
+F-H6-45 3 kdppncdpttpjttdjttpfttpdttdd
+F-H6-46 3 pgppfcdpttpjttdjttdfttpdttdd
+F-H6-47 2 qfppnqdpttpnttpjttdjttpdttdd
+F-H6-48 79 feppfcdpttpjttdjttpdttddtthc
+F-H6-49 29 qnlqnqppttdpttpjttdjttpdttdd
+F-H6-50 23 dnhqfqppttdpttpjttdjttpdttdd
+F-H6-51 21 ldppncdpttpjttdjttpdttddttlc
+F-H6-52 10 molqnqppttdpttpjttdjttpdttdd
+F-H6-53 8 qcppncdpttpjttdjttpdttddttlc
+F-H6-54 7 fqlqnqppttdpttpjttdjttpdttdd
+F-H6-55 5 dcppfcdpttpjttdjttpdttddtthc
+F-H6-56 3 qplqnqppttdpttpjttdjttpdttdd
+F-H6-57 2 fclqnqppttdpttpjttdjttpdttdd
+F-H6-58 2 jqhqfqppttdpttpjttdjttpdttdd
+F-H6-59 2 cnlqnqppttdpttpjttdjttpdttdd
+F-H6-60 56 qeqfppttdpttpjttdjttpdttdd
+F-H6-61 41 ndqfppttdpttpjttdjttpdttdd
+F-H6-62 24 fqcnppttdpttpjttdjttpdttdd
+F-H6-63 12 clcnppttdpttpjttdjttpdttdd
+F-H6-64 12 pfqfppttdpttpjttdjttpdttdd
+F-H6-65 7 qpqnppttdpttpjttdjttpdttdd
+F-H6-66 4 jpqfppttdpttpjttdjttpdttdd
+F-H6-67 3 ofqfppttdpttpjttdjttpdttdd
+F-H6-68 3 jdqfppttdpttpjttdjttpdttdd
+F-H6-69 2 gccfppttdpttpjttdjttpdttdd
+F-H6-70 2 jjqfppttdpttpjttdjttpdttdd
+F-H6-71 46 pnnqppfqdpttdnttpjttdjttpdttdd
+F-H6-72 25 jpnqppfqdpttpnttpjttdjttpdttdd
+F-H6-73 13 jcncppfcdpttpjttdjttdfttpdttdd
+F-H6-74 12 hcncppfcdpttpjttdjttpfttpdttdd
+F-H6-75 6 qnnqppfqdpttdnttpjttdjttpdttdd
+F-H6-76 5 kdncppfcdpttpjttdjttdfttpdttdd
+F-H6-77 5 ecncppfcdpttpjttdjttpfttpdttdd
+F-H6-78 4 icncppfcdpttpjttdjttpfttpdttdd
+F-H6-79 3 npnqppfqdpttdnttpjttdjttpdttdd
+F-H6-80 3 lqnqppfqdpttpnttpjttdjttpdttdd
+F-H6-81 2 pcncppfcdpttpjttdjttdfttpdttdd
+F-H6-82 38 fqppnqdpttqnttpjttdjttpdttdd
+F-H6-83 17 mpppfqdpttcnttpjttdjttpdttdd
+F-H6-84 11 jdppncdpttpjttdjttqfttpdttdd
+F-H6-85 11 ndppfcdpttpjttdjttcfttpdttdd
+F-H6-86 6 dgppncdpttpjttdjttqfttpdttdd
+F-H6-87 6 cnppnqdpttqnttpjttdjttpdttdd
+F-H6-88 6 iqppnqdpttqnttpjttdjttpdttdd
+F-H6-89 5 lqppfqdpttcnttpjttdjttpdttdd
+F-H6-90 4 ncppfqdpttcnttpjttdjttpdttdd
+F-H6-91 2 kdppncdpttpjttdjttqfttpdttdd
+F-H6-92 2 jqppnqdpttqnttpjttdjttpdttdd
+F-H6-93 27 qnppnqjpttdpttpjttdjttpdttdd
+F-H6-94 26 dnppfqjpttdpttpjttdjttpdttdd
+F-H6-95 13 gdppncdpttpjttdjttpdttjdttdd
+F-H6-96 13 dmppfqjpttdpttpjttdjttpdttdd
+F-H6-97 3 noppnqjpttdpttpjttdjttpdttdd
+F-H6-98 3 ncppfqjpttdpttpjttdjttpdttdd
+F-H6-99 3 ncppfcdpttpjttdjttpdttjdttdd
+F-H6-100 2 jfppncdpttpjttdjttpdttjdttdd
+F-H6-101 2 fpppnqjpttdpttpjttdjttpdttdd
+F-H6-102 2 pqppnqjpttdpttpjttdjttpdttdd
+F-H6-103 24 feppfcdpttpjttdjttpdttidttdd
+F-H6-104 24 qfppncdpttpjttdjttpdttkdttdd
+F-H6-105 21 pfppncdpttpjttdjttpdttkdttdd
+F-H6-106 7 leppncdpttpjttdjttpdttkdttdd
+F-H6-107 6 pgppncdpttpjttdjttpdttkdttdd
+F-H6-108 3 qcppncdpttpjttdjttpdttkdttdd
+F-H6-109 2 meppncdpttpjttdjttpdttkdttdd
+F-H6-110 2 nfppncdpttpjttdjttpdttkdttdd
+F-H6-111 69 dffeppfcdpttpjttdjttpdttddtthc
+F-H6-112 6 cnfqhqfoppttdpttpjttdjttpdttdd
+F-H6-113 3 ocneppncdpttpjttdjttpdttddttlc
+F-H6-114 2 icneppncdpttpjttdjttpdttddttlc
+F-H6-115 48 ndpgppttdpttpjttdjttpdttdd
+F-H6-116 9 ncpgppttdpttpjttdjttpdttdd
+F-H6-117 6 mdpgppttdpttpjttdjttpdttdd
+F-H6-118 5 qfpgppttdpttpjttdjttpdttdd
+F-H6-119 5 qepgppttdpttpjttdjttpdttdd
+F-H6-120 3 gqdmppttdpttpjttdjttpdttdd
+F-H6-121 2 jppgppttdpttpjttdjttpdttdd
+F-H6-122 2 qgpgppttdpttpjttdjttpdttdd
+F-H6-123 2 fgdgppttdpttpjttdjttpdttdd
+F-H6-124 2 jqpmppttdpttpjttdjttpdttdd
+F-H6-125 2 qppmppttdpttpjttdjttpdttdd
+F-H6-126 28 iphqfqppfodpttdnttpjttdjttpdttdd
+F-H6-127 9 kdppfedpfcpjttdjttdfttpdttddtthc
+F-H6-128 9 ncppfedpfcpjttdjttdfttpdttddtthc
+F-H6-129 8 icppnedpncpjttdjttpfttpdttddttlc
+F-H6-130 8 gplqnqppnodpttpnttpjttdjttpdttdd
+F-H6-131 5 hohqfqppfodpttdnttpjttdjttpdttdd
+F-H6-132 3 phppnedpncpjttdjttpfttpdttddttlc
+F-H6-133 3 jqlqnqppnodpttpnttpjttdjttpdttdd
+F-H6-134 2 dbppfedpfcpjttdjttdfttpdttddtthc
+F-H6-135 2 nphqfqppfodpttdnttpjttdjttpdttdd
+F-H6-136 2 fmhqfqppfodpttdnttpjttdjttpdttdd
+F-H6-137 54 mpppnqnpttdpttpjttdjttpdttdd
+F-H6-138 42 nonqppmpnpttdpttpjttdjttpdttdd
+F-H6-139 11 ecgdppfcdpttpjttdjttpdttfdttdd
+F-H6-140 3 gegdppfcdpttpjttdjttpdttfdttdd
+F-H6-141 32 pfmdppttdpttpjttdjttpdttdd
+F-H6-142 6 qfmdppttdpttpjttdjttpdttdd
+F-H6-143 5 ncmdppttdpttpjttdjttpdttdd
+F-H6-144 5 ocmdppttdpttpjttdjttpdttdd
+F-H6-145 4 jdmdppttdpttpjttdjttpdttdd
+F-H6-146 3 jjmdppttdpttpjttdjttpdttdd
+F-H6-147 3 pgmdppttdpttpjttdjttpdttdd
+F-H6-148 2 jqgpppttdpttpjttdjttpdttdd
+F-H6-149 2 jpmdppttdpttpjttdjttpdttdd
+F-H6-150 30 eqppfqfpgpdpttfottpjttdjttpdttdd
+F-H6-151 7 dcppgddpfcpjttdjttfettpdttfdttdd
+F-H6-152 4 qcppmddpncpjttdjttnettpdttndttdd
+F-H6-153 4 orppnqnpmpdpttnottpjttdjttpdttdd
+F-H6-154 3 qnppnqnpmpdpttnottpjttdjttpdttdd
+F-H6-155 34 jpppnqdpfqpnttdnttpjttdjttpdttdd
+F-H6-156 14 pmppqfdpttpjttdjttpdttndttdd
+F-H6-157 4 qnppqfdpttpjttdjttpdttndttdd
+F-H6-158 4 ofppqfdpttpjttdjttpdttndttdd
+F-H6-159 2 lqppqnnpttdpttpjttdjttpdttdd
+F-H6-160 2 fcppqfdpttpjttdjttpdttndttdd
+F-H6-161 2 pnppqfdpttpjttdjttpdttndttdd
+F-H6-162 2 nqppcfdpttpjttdjttpdttfdttdd
+F-H6-163 30 jpjdppncdpfcpjttdjttpfttdfttpdttdd
+F-H6-164 5 prnqppfqdpjppnttdnttpjttdjttpdttdd
+F-H6-165 5 jqjdppncdpfcpjttdjttpfttdfttpdttdd
+F-H6-166 2 ncnqppfqdpjppnttdnttpjttdjttpdttdd
+F-H6-167 16 cnjqfqppttdpttpjttdjttpdttdd
+F-H6-168 12 pnjqnqppttdpttpjttdjttpdttdd
+F-H6-169 10 pgppncdpttpjttdjttpdttddttjc
+F-H6-170 5 jeppncdpttpjttdjttpdttddttjc
+F-H6-171 3 ncjqfqppttdpttpjttdjttpdttdd
+F-H6-172 2 gpjqnqppttdpttpjttdjttpdttdd
+F-H6-173 2 feppfcdpttpjttdjttpdttddttjc
+F-H6-174 2 qfjqnqppttdpttpjttdjttpdttdd
+F-H6-175 35 pfppqfdpttpjttdjttqettpdttdd
+F-H6-176 44 ndqfpppfdpttpjttdjttqettpdttdd
+F-H6-177 7 fcdfppcfdpttpjttdjttcettpdttdd
+F-H6-178 16 cnnqppfqdpttqnttpjttdjttpdttdd
+F-H6-179 11 pnnqppfqdpttcnttpjttdjttpdttdd
+F-H6-180 8 fpnqppfqdpttqnttpjttdjttpdttdd
+F-H6-181 6 jcncppfcdpttpjttdjttcfttpdttdd
+F-H6-182 3 lqnqppfqdpttcnttpjttdjttpdttdd
+F-H6-183 2 kqnqppfqdpttcnttpjttdjttpdttdd
+F-H6-184 2 hcncppfcdpttpjttdjttcfttpdttdd
+F-H6-185 43 fdppfcdpttpjttdjttpdttddttec
+F-H6-186 24 dffdppfcdpttpjttdjttpdttddttec
+F-H6-187 13 cnfqeqfpppttdpttpjttdjttpdttdd
+F-H6-188 4 fbfdppfcdpttpjttdjttpdttddttec
+F-H6-189 4 erfqeqfpppttdpttpjttdjttpdttdd
+F-H6-190 11 qnpppgdpttpjttdjttpdttndttdd
+F-H6-191 6 ompppgdpttpjttdjttpdttndttdd
+F-H6-192 5 lcpppgdpttpjttdjttpdttndttdd
+F-H6-193 4 qlpppgdpttpjttdjttpdttndttdd
+F-H6-194 16 qnppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-195 12 fqppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-196 4 plppnqdpfqpnjpdnttpjttdjttpdttjdttdd
+F-H6-197 2 gdppnqdpfqpnjpdnttpjttdjttpdttjdttdd
+F-H6-198 2 pgppnqdpfqpnjpdnttpjttdjttpdttjdttdd
+F-H6-199 16 pmppqfdppfpjttdjttqettpdttndttdd
+F-H6-200 4 qfppqnnppndpttqottpjttdjttpdttdd
+F-H6-201 4 phppqfdppfpjttdjttqettpdttndttdd
+F-H6-202 3 lqppqnnppndpttqottpjttdjttpdttdd
+F-H6-203 2 qlppqfdppfpjttdjttqettpdttndttdd
+F-H6-204 27 dqfqppeqfpgpdpttfottpjttdjttpdttdd
+F-H6-205 2 dfgdppfcdpecpjttdjttfettpdttfdttdd
+F-H6-206 10 ncppgddpfcpjecdjttfettpdttfdttddttdc
+F-H6-207 7 jqdqfqppeqfpgpdpttfottpjttdjttpdttdd
+F-H6-208 6 cfppgddpfcpjecdjttfettpdttfdttddttdc
+F-H6-209 2 mopqoqppnqnpmpdpttnottpjttdjttpdttdd
+F-H6-210 14 oonqppqnjpttdpttpjttdjttpdttdd
+F-H6-211 13 dfcfppfcdpttpjttdjttpdttjdttdd
+F-H6-212 12 fpfqppcnjpttdpttpjttdjttpdttdd
+F-H6-213 11 cfppfcdpttpjttdjttpdttddttic
+F-H6-214 6 dfppfcdpttpjttdjttpdttddttic
+F-H6-215 6 neppncdpttpjttdjttpdttddttkc
+F-H6-216 3 ncppfcdpttpjttdjttpdttddttic
+F-H6-217 3 qqkqnqppttdpttpjttdjttpdttdd
+F-H6-218 2 mdppfcdpttpjttdjttpdttddttic
+F-H6-219 2 keppncdpttpjttdjttpdttddttkc
+F-H6-220 2 cfiqfqppttdpttpjttdjttpdttdd
+F-H6-221 12 dfgdppncdpttpjttdjttpfttpdttdd
+F-H6-222 7 hqfqppmpdpttdnttpjttdjttpdttdd
+F-H6-223 5 jdgdppncdpttpjttdjttpfttpdttdd
+F-H6-224 3 pmfqppmpdpttdnttpjttdjttpdttdd
+F-H6-225 3 fqnqppgpdpttpnttpjttdjttpdttdd
+F-H6-226 3 ipfqppmpdpttdnttpjttdjttpdttdd
+F-H6-227 2 jdfqppmpdpttdnttpjttdjttpdttdd
+F-H6-228 2 ecgdppncdpttpjttdjttpfttpdttdd
+F-H6-229 29 dffeppfcdpttpjttdjttpdttidttdd
+F-H6-230 9 nppmppqfdpttpjttdjttpdttndttdd
+F-H6-231 4 qhpmppqfdpttpjttdjttpdttndttdd
+F-H6-232 3 nqpmppqfdpttpjttdjttpdttndttdd
+F-H6-233 2 qepmppqfdpttpjttdjttpdttndttdd
+F-H6-234 2 ogpmppqfdpttpjttdjttpdttndttdd
+F-H6-235 2 njpmppqfdpttpjttdjttpdttndttdd
+F-H6-236 7 pnlpppttdpttpjttdjttpdttdd
+F-H6-237 6 mchdppttdpttpjttdjttpdttdd
+F-H6-238 4 nqlpppttdpttpjttdjttpdttdd
+F-H6-239 3 jdlpppttdpttpjttdjttpdttdd
+F-H6-240 2 jjlpppttdpttpjttdjttpdttdd
+F-H6-241 2 jqlpppttdpttpjttdjttpdttdd
+F-H6-242 2 iqlpppttdpttpjttdjttpdttdd
+F-H6-243 2 nplpppttdpttpjttdjttpdttdd
+F-H6-244 11 dbppfedpfcpjttdjttdfttpdttidttdd
+F-H6-245 4 mdppfedpfcpjttdjttdfttpdttidttdd
+F-H6-246 3 npppfqipfodpttdnttpjttdjttpdttdd
+F-H6-247 3 ipppnqkpnodpttpnttpjttdjttpdttdd
+F-H6-248 2 iqppnqkpnodpttpnttpjttdjttpdttdd
+F-H6-249 2 nmppnqkpnodpttpnttpjttdjttpdttdd
+F-H6-250 2 ncppfedpfcpjttdjttdfttpdttidttdd
+F-H6-251 2 hdppnedpncpjttdjttpfttpdttkdttdd
+F-H6-252 10 ncjcppttdpttpjttdjttpdttdd
+F-H6-253 7 jpjcppttdpttpjttdjttpdttdd
+F-H6-254 5 lcjcppttdpttpjttdjttpdttdd
+F-H6-255 4 gqjqppttdpttpjttdjttpdttdd
+F-H6-256 3 jjjcppttdpttpjttdjttpdttdd
+F-H6-257 2 jqjcppttdpttpjttdjttpdttdd
+F-H6-258 13 fcppmddpttpjttdjttpfttpdttdd
+F-H6-259 7 cfppmddpttpjttdjttpfttpdttdd
+F-H6-260 3 dgppmddpttpjttdjttpfttpdttdd
+F-H6-261 11 jpjdppttdpttpjttdjttpdttdd
+F-H6-262 5 mcjdppttdpttpjttdjttpdttdd
+F-H6-263 4 lqjpppttdpttpjttdjttpdttdd
+F-H6-264 3 ncjdppttdpttpjttdjttpdttdd
+F-H6-265 2 jjjpppttdpttpjttdjttpdttdd
+F-H6-266 2 jcjpppttdpttpjttdjttpdttdd
+F-H6-267 20 iqfqhqipppfodpttdnttpjttdjttpdttdd
+F-H6-268 7 ldneppkddpncpjttdjttpfttpdttddttlc
+F-H6-269 3 eqfqhqipppfodpttdnttpjttdjttpdttdd
+F-H6-270 12 npnqlqqnppttdpttpjttdjttpdttdd
+F-H6-271 9 dnfqhqcnppttdpttpjttdjttpdttdd
+F-H6-272 5 eofqhqcnppttdpttpjttdjttpdttdd
+F-H6-273 2 qdqfppncdpttpjttdjttpdttddttlc
+F-H6-274 16 fpfqppdnjpttdpttpjttdjttpdttdd
+F-H6-275 6 oonqpppnjpttdpttpjttdjttpdttdd
+F-H6-276 4 efdfppfcdpttpjttdjttpdttjdttdd
+F-H6-277 7 njpmppqfdppfpjttdjttqettpdttndttdd
+F-H6-278 7 nppmppqfdppfpjttdjttqettpdttndttdd
+F-H6-279 4 qhpmppqfdppfpjttdjttqettpdttndttdd
+F-H6-280 3 phpmppqfdppfpjttdjttqettpdttndttdd
+F-H6-281 2 qlpmppqfdppfpjttdjttqettpdttndttdd
+F-H6-282 2 qnpmppqfdppfpjttdjttqettpdttndttdd
+F-H6-283 7 dgfqcnppttdpttpjttdjttpdttdd
+F-H6-284 3 qnppqfdpttpjttdjttpdttddttnc
+F-H6-285 3 ofppqfdpttpjttdjttpdttddttnc
+F-H6-286 13 oeqfppncdpttpjttdjttpdttkdttdd
+F-H6-287 7 fpfqppcnipttdpttpjttdjttpdttdd
+F-H6-288 5 dnfqppcnipttdpttpjttdjttpdttdd
+F-H6-289 8 cfppncdpfcpjttdjttpfttpdttjdttdd
+F-H6-290 7 dnppnqjpfqdpttpnttpjttdjttpdttdd
+F-H6-291 3 pmppnqjpfqdpttdnttpjttdjttpdttdd
+F-H6-292 2 jfppncdpfcpjttdjttpfttpdttjdttdd
+F-H6-293 20 kdldppncdpttpjttdjttpdttddttlc
+F-H6-294 6 kqnqlqlpppttdpttpjttdjttpdttdd
+F-H6-295 10 fcppnddpncpjttdjttpfttpdttddttoc
+F-H6-296 5 jqeqfqppfpdpttdnttpjttdjttpdttdd
+F-H6-297 2 qfppfddpfcpjttdjttdfttpdttddttec
+F-H6-298 21 lqfqjqkpiqjphqippphohpfodpttdnttpjttdjttpdttdd
+F-H6-299 2 gdheppfedpkdpjjddjiddffcpdtthdttddttjcttictthc
+F-H6-300 9 ncppfcdpttpjttdjttpdttddttdc
+F-H6-301 3 kqpqnqppttdpttpjttdjttpdttdd
+F-H6-302 3 gppqnqppttdpttpjttdjttpdttdd
+F-H6-303 3 qfppncdpttpjttdjttpdttddttpc
+F-H6-304 2 jppqnqppttdpttpjttdjttpdttdd
+F-H6-305 9 oepfppncdpttpjttdjttpdttkdttdd
+F-H6-306 8 npnqpppnkpttdpttpjttdjttpdttdd
+F-H6-307 4 ofpfppncdpttpjttdjttpdttkdttdd
+F-H6-308 16 feppgddpfcpjttdjttpdttfdttddttec
+F-H6-309 2 mqoqnqppmpnpttdpttpjttdjttpdttdd
+F-H6-310 19 fpfqhqdnppttdpttpjttdjttpdttdd
+F-H6-311 4 eedfppfcdpttpjttdjttpdttddtthc
+F-H6-312 13 molqfqjqkpiqjphqippphohpfodpttdnttpjttdjttpdttdd
+F-H6-313 3 mdppnedplepjkddjjdpfidpdncldttddttlcttkcttjctthc
+F-H6-314 7 njpppmnpqfdpttpjttdjttpdttndttdd
+F-H6-315 2 mjpppmnpqfdpttpjttdjttpdttndttdd
+F-H6-316 14 lpnqlqkpkqjpppnodpttpnttpjttdjttpdttdd
+F-H6-317 6 jqfqiqjphqipppfodpttdnttpjttdjttpdttdd
+F-H6-318 7 mqoqnqppmpopnonpttdpttpjttdjttpdttdd
+F-H6-319 5 geppfedpgdpjfcdjttpdttfdttedttddttec
+F-H6-320 2 fbppfedpgdpjfcdjttpdttfdttedttddttec
+F-H6-321 10 edfeppgddpfcpjttdjttpdttfdttddttec
+F-H6-322 21 jpiqfqhqipppfodpttdnttpjttdjttpdttdd
+F-H6-323 6 gcncppicdpttpjttdjttpfttpdttdd
+F-H6-324 6 jpncppicdpttpjttdjttpfttpdttdd
+F-H6-325 2 fqnqppiqdpttpnttpjttdjttpdttdd
+F-H6-326 2 jqkcppfcdpttpjttdjttdfttpdttdd
+F-H6-327 2 lcncppicdpttpjttdjttpfttpdttdd
+F-H6-328 6 fqnqppjpdpttpnttpjttdjttpdttdd
+F-H6-329 5 gqnqppjpdpttpnttpjttdjttpdttdd
+F-H6-330 4 lcjdppfcdpttpjttdjttdfttpdttdd
+F-H6-331 3 jdnqppjpdpttpnttpjttdjttpdttdd
+F-H6-332 20 idppnedplepjkddjjdpfncpdttldttddttlcttkcttjc
+F-H6-333 19 jcneppledpkdpjjddjncpfttpdttldttddttlcttkc
+F-H6-334 6 cocnppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-335 4 fpcnppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-336 3 qlqnppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-337 2 dncnppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-338 9 mdpplddpncpjttdjttpdttkdttddttlc
+F-H6-339 8 hohqfqpphpipttdpttpjttdjttpdttdd
+F-H6-340 9 pnfqppnpdpttdnttpjttdjttpdttdd
+F-H6-341 2 cffdppncdpttpjttdjttpfttpdttdd
+F-H6-342 2 lqnqppfpdpttpnttpjttdjttpdttdd
+F-H6-343 2 ncndppfcdpttpjttdjttdfttpdttdd
+F-H6-344 12 mplqnqpppnnpttdpttpjttdjttpdttdd
+F-H6-345 5 cphqfqppdnfpttdpttpjttdjttpdttdd
+F-H6-346 8 fpfqppdmjpttdpttpjttdjttpdttdd
+F-H6-347 5 eofqppdmjpttdpttpjttdjttpdttdd
+F-H6-348 3 dnfqppdmjpttdpttpjttdjttpdttdd
+F-H6-349 2 nonqpppmjpttdpttpjttdjttpdttdd
+F-H6-350 9 eqfqppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-351 5 dnfqppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-352 2 npnqppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-353 7 qfppncjpttdpttpjttdjttpdttdd
+F-H6-354 3 pmppnqdpttpjttdjttpdttjdttdd
+F-H6-355 3 nqppfqdpttpjttdjttpdttjdttdd
+F-H6-356 14 feppfcdpttpjttdjttpdtthdttdd
+F-H6-357 2 qfppncdpttpjttdjttpdttldttdd
+F-H6-358 6 npqnpppgdpttpjttdjttpdttndttdd
+F-H6-359 3 qoqnpppgdpttpjttdjttpdttndttdd
+F-H6-360 2 dfdmppcffpttdpttpjttdjttpdttdd
+F-H6-361 2 efdmppcffpttdpttpjttdjttpdttdd
+F-H6-362 11 jpppnqdpfqqnttcnttpjttdjttpdttdd
+F-H6-363 4 hqfqppmpdpttcnttpjttdjttpdttdd
+F-H6-364 3 dfgdppncdpttpjttdjttqfttpdttdd
+F-H6-365 2 jpnqppgpdpttqnttpjttdjttpdttdd
+F-H6-366 9 nqeqfqppfpdpttcnttpjttdjttpdttdd
+F-H6-367 2 jqoqnqppnpdpttqnttpjttdjttpdttdd
+F-H6-368 4 iphqfqppfodpttcnttpjttdjttpdttdd
+F-H6-369 2 kqhqfqppfodpttcnttpjttdjttpdttdd
+F-H6-370 2 ncppfedpfcpjttdjttcfttpdttddtthc
+F-H6-371 5 cfppfcdpttpjttjjttdjttpdttdd
+F-H6-372 3 fqppnqdpttpjttjjttdjttpdttdd
+F-H6-373 6 fqppgddpncpjttdjttpfttdfttpdttdd
+F-H6-374 2 jdppmddpfcpjttdjttpfttdfttpdttdd
+F-H6-375 2 dhppmddpfcpjttdjttpfttdfttpdttdd
+F-H6-376 2 dqppnqdpgppnttdnttpjttdjttpdttdd
+F-H6-377 15 jpppnqdpfqqnttdnttpjttdjttpdttdd
+F-H6-378 8 pfqfppncdpttpjttdjttpdttddttjc
+F-H6-379 5 eofqjqcnppttdpttpjttdjttpdttdd
+F-H6-380 2 fdcfppfcdpttpjttdjttpdttddttjc
+F-H6-381 3 okpmppnjnpqfdpttpjttdjttpdttndttdd
+F-H6-382 2 phpmppnjnpqfdpttpjttdjttpdttndttdd
+F-H6-383 2 ohpmppnjnpqfdpttpjttdjttpdttndttdd
+F-H6-384 7 dnnqppgpjpttdpttpjttdjttpdttdd
+F-H6-385 3 ocgdppncdpttpjttdjttpdttjdttdd
+F-H6-386 2 hcmdppfcdpttpjttdjttpdttjdttdd
+F-H6-387 15 gpppfqjpdnfpttdpttpjttdjttpdttdd
+F-H6-388 6 dfmdppfcdpttpjttdjttpfttpdttdd
+F-H6-389 3 idmdppfcdpttpjttdjttpfttpdttdd
+F-H6-390 3 lqnqppgpdpttdnttpjttdjttpdttdd
+F-H6-391 2 jdmdppfcdpttpjttdjttpfttpdttdd
+F-H6-392 13 qqppnqjpqndpttoottpjttdjttpdttdd
+F-H6-393 15 fofqppgpjpdnfpttdpttpjttdjttpdttdd
+F-H6-394 4 qfppncdpttpjttdjttnettpdttdd
+F-H6-395 3 ldppncdpttpjttdjttnettpdttdd
+F-H6-396 3 qcppncdpttpjttdjttnettpdttdd
+F-H6-397 5 jcnqppfqdpjpqnttdnttpjttdjttpdttdd
+F-H6-398 4 jdnqppfqdpjpqnttdnttpjttdjttpdttdd
+F-H6-399 5 dnfqppncdpttpjttdjttpfttpdttdd
+F-H6-400 2 hcnqppfcdpttpnttpjttdjttpdttdd
+F-H6-401 11 eqppfqjpgpfpdndpttfottpjttdjttpdttdd
+F-H6-402 2 cqppfqjpgpfpdndpttfottpjttdjttpdttdd
+F-H6-403 11 qcppqfdpncpjttdjttoettpdttkdttdd
+F-H6-404 6 oonqjqpnppttdpttpjttdjttpdttdd
+F-H6-405 5 npnqjqpnppttdpttpjttdjttpdttdd
+F-H6-406 3 onnqjqpnppttdpttpjttdjttpdttdd
+F-H6-407 6 enppcndpttclttpjttdjttpdttdd
+F-H6-408 2 fqppcndpttclttpjttdjttpdttdd
+F-H6-409 2 qcppqfdpttpjttdjttqhttpdttdd
+F-H6-410 14 lolqnqkqkpppjplpnodpttpnttpjttdjttpdttdd
+F-H6-411 6 ncppjdjpttdpttpjttdjttpdttdd
+F-H6-412 10 dgppcfdpfcpjttdjttdfttpdttjdttdd
+F-H6-413 5 cnjqnqppfqdpttpnttpjttdjttpdttdd
+F-H6-414 3 jeppncdpfcpjttdjttdfttpdttddttjc
+F-H6-415 3 pfppncdpfcpjttdjttdfttpdttddttjc
+F-H6-416 8 fcppncdpttpjttdjttqgttpdttdd
+F-H6-417 2 jpppnqdpttqmttpjttdjttpdttdd
+F-H6-418 5 ncndppfcdpttpjttdjttcfttpdttdd
+F-H6-419 2 pfndppfcdpttpjttdjttcfttpdttdd
+F-H6-420 2 hcfdppncdpttpjttdjttqfttpdttdd
+F-H6-421 2 qfndppfcdpttpjttdjttcfttpdttdd
+F-H6-422 4 jdnqppfqdpjpqnttcnttpjttdjttpdttdd
+F-H6-423 2 ornqppfqdpjpqnttcnttpjttdjttpdttdd
+F-H6-424 2 jcnqppfqdpjpqnttcnttpjttdjttpdttdd
+F-H6-425 12 pqqqppnqjpqndpttoottpjttdjttpdttdd
+F-H6-426 12 dffeppfcdpttpjttdjttpdtthdttdd
+F-H6-427 2 effeppfcdpttpjttdjttpdtthdttdd
+F-H6-428 12 efdgppcfdpfcpjttdjttdfttpdttjdttdd
+F-H6-429 8 mplqnqppqnnpttdpttpjttdjttpdttdd
+F-H6-430 3 qqlqnqppqnnpttdpttpjttdjttpdttdd
+F-H6-431 2 qplqnqppqnnpttdpttpjttdjttpdttdd
+F-H6-432 12 ccfeppfcdpdbpjttdjttdfttpdttidttdd
+F-H6-433 4 cdppdgdpcfpjfcdjttefttdfttpdttjdttdd
+F-H6-434 3 ogpppgdpqfpjncdjttpfttofttpdttjdttdd
+F-H6-435 3 cqppfqjpcndpdmenttdnttpjttdjttpdttdd
+F-H6-436 2 ceppdgdpcfpjfcdjttefttdfttpdttjdttdd
+F-H6-437 6 mqfqlqkpjqjpiqiphqmopphohpfodpttdnttpjttdjttpdttdd
+F-H6-438 4 fcneppledpgepjkddjjdpfidpdncldttddttlcttkcttjctthc
+F-H6-439 5 iqnqlqfqppttdpttpjttdjttpdttdd
+F-H6-440 3 npnqlqfqppttdpttpjttdjttpdttdd
+F-H6-441 2 ipnqlqfqppttdpttpjttdjttpdttdd
+F-H6-442 2 hqnqlqfqppttdpttpjttdjttpdttdd
+F-H6-443 7 feppncdpfcpjttdjttpfttpdttddtthc
+F-H6-444 7 kqnqhqfqppfodpttdnttpjttdjttpdttdd
+F-H6-445 5 lcfeppncdpfcpjttdjttdfttpdttddtthc
+F-H6-446 3 hcjdppncdpttpjttdjttqfttpdttdd
+F-H6-447 3 fqnqppjpdpttqnttpjttdjttpdttdd
+F-H6-448 3 jpjdppfcdpttpjttdjttcfttpdttdd
+F-H6-449 2 mqfqppjpdpttcnttpjttdjttpdttdd
+F-H6-450 9 pgppqfdpttpjttdjttpfttpdttdd
+F-H6-451 12 qppqqqppnqjpqndpttoottpjttdjttpdttdd
+F-H6-452 5 lqnqeqfqppfpdpttdnttpjttdjttpdttdd
+F-H6-453 3 fdndppncdpfcpjttdjttpfttpdttddttoc
+F-H6-454 4 fpdmpppgdpttpjttdjttpdttndttdd
+F-H6-455 3 jpdmpppgdpttpjttdjttpdttndttdd
+F-H6-456 2 gqdmpppgdpttpjttdjttpdttndttdd
+F-H6-457 6 pgqfppqddpqcpjncdjttoettpdttjdttddttpc
+F-H6-458 2 qbqfppqddpqcpjncdjttoettpdttjdttddttpc
+F-H6-459 2 ogqfppqddpqcpjncdjttoettpdttjdttddttpc
+F-H6-460 3 gonqdqfqppeqfpgpdpttfottpjttdjttpdttdd
+F-H6-461 3 lqnqdqfqppeqfpgpdpttfottpjttdjttpdttdd
+F-H6-462 10 qdqfppqcdpncpjttdjttoettpdttkdttdd
+F-H6-463 12 fofqppgpjpcnfpttdpttpjttdjttpdttdd
+F-H6-464 2 cecfppgddpfcpjecdjttfettpdttfdttddttdc
+F-H6-465 2 pfqfppmddpocpjncdjttnettpdttndttddttpc
+F-H6-466 12 dofqppeqjpgpfpdndpttfottpjttdjttpdttdd
+F-H6-467 2 pcpppfdpmdpjocdjncpettnettpdttndttjdttdd
+F-H6-468 2 crppfqjpeqfpgpdpdnfottdottpjttdjttpdttdd
+F-H6-469 2 cqppfqjpeqfpgpdpdnfottdottpjttdjttpdttdd
+F-H6-470 2 goppfqjpeqfpgpdpdnfottdottpjttdjttpdttdd
+F-H6-471 4 nqfqjqppttdpttpjttdjttpdttdd
+F-H6-472 4 pfleppncdpttpjttdjttpdttkdttdd
+F-H6-473 3 mpnqpplokpttdpttpjttdjttpdttdd
+F-H6-474 4 qiphppqfdppfpjttdjttqettpdttndttdd
+F-H6-475 2 rfphppqfdppfpjttdjttqettpdttndttdd
+F-H6-476 2 qjphppqfdppfpjttdjttqettpdttndttdd
+F-H6-477 10 gpppfqjpcnfpttdpttpjttdjttpdttdd
+F-H6-478 10 ibppfedpfcpjdbdjttdfttpdttidttddttcc
+F-H6-479 5 ofpgppqfdpttpjttdjttpfttpdttdd
+F-H6-480 4 qepgppqfdpttpjttdjttpfttpdttdd
+F-H6-481 5 oepgppncdpttpjttdjttpdttddttjc
+F-H6-482 3 npnqjqpmppttdpttpjttdjttpdttdd
+F-H6-483 2 efdgppfcdpttpjttdjttpdttddttjc
+F-H6-484 7 leneppncdpicpjttdjttpfttpdttddttlc
+F-H6-485 2 mcfeppkcdpfcpjttdjttdfttpdttddtthc
+F-H6-486 6 dfcfppfcdpttpjttdjttpdttddttic
+F-H6-487 4 eecfppfcdpttpjttdjttpdttddttic
+F-H6-488 6 pnnqppjpdpttpjttdjttpdttjdttdd
+F-H6-489 3 qnnqppjpdpttpjttdjttpdttjdttdd
+F-H6-490 5 jpppnqlpnodpttpnttpjttdjttpdttdd
+F-H6-491 3 ncppfedpfcpjttdjttdfttpdtthdttdd
+F-H6-492 2 dlppfqhpfodpttdnttpjttdjttpdttdd
+F-H6-493 5 cqppfqjpgpfpcndpttfottpjttdjttpdttdd
+F-H6-494 3 oqppnqnpmpjpqndpttnottpjttdjttpdttdd
+F-H6-495 3 dqppfqjpgpfpcndpttfottpjttdjttpdttdd
+F-H6-496 9 mcpfppmddpncpjttdjttpdttndttddttlc
+F-H6-497 2 nonqlqmppppnnpttdpttpjttdjttpdttdd
+F-H6-498 4 jdppnddpfcpjttdjttpfttdfttpdttdd
+F-H6-499 2 qlppfqdpnppnttdnttpjttdjttpdttdd
+F-H6-500 5 fdndppncdpfcpjttdjttqfttpdttddttoc
+F-H6-501 2 oqnqeqfqppfpdpttcnttpjttdjttpdttdd
+F-H6-502 6 fqppnqdpjppnttpjttdjttpdttjdttdd
+F-H6-503 2 monqoqmqppmpopnonpttdpttpjttdjttpdttdd
+F-H6-504 2 hpnqoqmqppmpopnonpttdpttpjttdjttpdttdd
+F-H6-505 2 pgneppmddpncpjmcdjttpdttodttndttddttoc
+F-H6-506 9 pcppqfdpqcpjncdjttoettqdttpdttkdttdd
+F-H6-507 5 pfmcppttdpttpjttdjttpdttdd
+F-H6-508 3 ecgcppttdpttpjttdjttpdttdd
+F-H6-509 2 jdmcppttdpttpjttdjttpdttdd
+F-H6-510 4 idneppgddpncpjttdjttpfttpdttddttlc
+F-H6-511 4 iqnqlqgpppnodpttpnttpjttdjttpdttdd
+F-H6-512 2 lonqlqgpppnodpttpnttpjttdjttpdttdd
+F-H6-513 3 dnfqhqgoppttdpttpjttdjttpdttdd
+F-H6-514 2 oqnqlqmoppttdpttpjttdjttpdttdd
+F-H6-515 2 eegeppfcdpttpjttdjttpdttddtthc
+F-H6-516 2 npnqlqmoppttdpttpjttdjttpdttdd
+F-H6-517 7 gqfqhqhppphoipttdpttpjttdjttpdttdd
+F-H6-518 3 jqfqhqhppphoipttdpttpjttdjttpdttdd
+F-H6-519 4 jpneppncdppbpjkbdjttpfttpdttkdttddttqc
+F-H6-520 3 ngneppncdppbpjkbdjttpfttpdttkdttddttqc
+F-H6-521 6 njpppmnpqfdppfpjttdjttqettpdttndttdd
+F-H6-522 8 ccfcppdcdpttpjttdjttpdttddtthc
+F-H6-523 8 dnfqeqfpppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-524 3 dnfpppttdpttpjttdjttpdttdd
+F-H6-525 2 jploppttdpttpjttdjttpdttdd
+F-H6-526 2 gqhoppttdpttpjttdjttpdttdd
+F-H6-527 2 nploppttdpttpjttdjttpdttdd
+F-H6-528 4 meqfppqcdppcpjncdjttoettqdttpdttkdttdd
+F-H6-529 3 eccfppfcdpdcpjccdjtteettpdttidttddttcd
+F-H6-530 2 mdqfppqcdppcpjncdjttoettqdttpdttkdttdd
+F-H6-531 5 fccfppmddpttpjttdjttpfttpdttdd
+F-H6-532 3 cecfppmddpttpjttdjttpfttpdttdd
+F-H6-533 5 lonqlqipppnodpttpnttpjttdjttpdttdd
+F-H6-534 2 mcfeppkddpfcpjttdjttdfttpdttddtthc
+F-H6-535 7 fpeqfqppjdjpncdpfcpjttdjttpfttdfttpdttdd
+F-H6-536 7 qcpppfdpncpjttdjttoettpdttkdttdd
+F-H6-537 3 onppnqkppndpttoottpjttdjttpdttdd
+F-H6-538 3 kemdpplddpncpjttdjttpdttkdttddttlc
+F-H6-539 3 jchdppgddpfcpjttdjttpdttidttddtthc
+F-H6-540 2 pfmdpplddpncpjttdjttpdttkdttddttlc
+F-H6-541 2 kcmdpplddpncpjttdjttpdttkdttddttlc
+F-H6-542 2 ecncppfcdpttpjttdjttpdttddttpc
+F-H6-543 2 pcncppfcdpttpjttdjttpdttddttdc
+F-H6-544 5 jpjjppttdpttpjttdjttpdttdd
+F-H6-545 5 fdcnfqdgppttdpttpjttdjttpdttdd
+F-H6-546 4 pmppnqjpgpdpttdnttpjttdjttpdttdd
+F-H6-547 2 jnppnqjpgpdpttdnttpjttdjttpdttdd
+F-H6-548 2 dfppmddpfcpjttdjttpfttpdttjdttdd
+F-H6-549 9 qdpppfdpmdpjncdjttpdttndttddttmcttlc
+F-H6-550 3 hqfqppqfdpttpjttdjttpdttddttnc
+F-H6-551 3 cnfqppqfdpttpjttdjttpdttddttnc
+F-H6-552 3 fplpppcndpttpnttpjttdjttpdttdd
+F-H6-553 2 fqlpppcndpttpnttpjttdjttpdttdd
+F-H6-554 2 qhppnqdpfqpnjpdnqfpjpfdjttqettpdttndttjdttdd
+F-H6-555 2 dhppnqdpfqpnjpdndfpjcfdjttcettpdttjdttfdttdd
+F-H6-556 2 lqppqnnppnjpjddpncqofcpjttdjttpfttdfttpdttdd
+F-H6-557 8 dnppcnjpjddpnccofcpjttdjttpfttdfttpdttdd
+F-H6-558 4 cdppfcdpdcpjttdjttpdttddtthcttcc
+F-H6-559 7 dmhqfqppcndpttdnttpjttdjttpdttdd
+F-H6-560 2 qqlqnqppqndpttpnttpjttdjttpdttdd
+F-H6-561 6 gpppnqfpfqdpttqnttpjttdjttpdttdd
+F-H6-562 2 pgppqfdpmdpjocdjncpfttnettpdttndttddttpc
+F-H6-563 9 qcpppfdpqdpjmddjncpdttndttddttocttmcttlc
+F-H6-564 6 fpdnppcnjpjddpnccofcpjttdjttpfttdfttpdttdd
+F-H6-565 4 qnpppgdpttpjttdjttpdttddttnc
+F-H6-566 9 ocpfppqddpmdpjncdjttpdttndttddttmcttlc
+F-H6-567 6 mpppnqnppnkpttdpttpjttdjttpdttdd
+F-H6-568 3 lpoqnqppnpjpjddpncpnfcpjttdjttpfttdfttpdttdd
+F-H6-569 2 nqeqfqppfpjpjddpncdnfcpjttdjttpfttdfttpdttdd
+F-H6-570 5 fqnqpphqdpttqnttpjttdjttpdttdd
+F-H6-571 2 iclcppfcdpttpjttdjttcfttpdttdd
+F-H6-572 2 pgppnqdpfcpnttpjttdjttdfttpdttdd
+F-H6-573 6 dnnqppfqdpjppnttpjttdjttpdttjdttdd
+F-H6-574 2 eccdppfcdpdcpjttdjttpdttddtthcttcc
+F-H6-575 2 qrpqqqnqlqqpppttdpttpjttdjttpdttdd
+F-H6-576 2 rqpqqqnqlqqpppttdpttpjttdjttpdttdd
+F-H6-577 2 qopqqqnqlqqpppttdpttpjttdjttpdttdd
+F-H6-578 3 nbpfppqddpmdpjqcdjncpdttndttddttocttmcttlc
+F-H6-579 2 qhpfppqddpmdpjqcdjncpdttndttddttocttmcttlc
+F-H6-580 2 jppfppqddpmdpjqcdjncpdttndttddttocttmcttlc
+F-H6-581 5 fpenppcndpttclttpjttdjttpdttdd
+F-H6-582 7 eecfppncdpfcpjttdjttpfttpdttjdttdd
+F-H6-583 5 mqnqlqmpppqnnpttdpttpjttdjttpdttdd
+F-H6-584 2 neqfppmddpncpjttdjttpdttndttddttlc
+F-H6-585 3 cmnqppfqdpttqmttpjttdjttpdttdd
+F-H6-586 8 edgdppfcdpdcpjebdjttfettpdttfdttddttec
+F-H6-587 7 fofqppgpjpdmfpttdpttpjttdjttpdttdd
+F-H6-588 7 ecgdppfcdpdcpjttdjttfettpdttfdttdd
+F-H6-589 6 qcmdpppcdpncpjobdjmbnettpdttodttndttddttoc
+F-H6-590 3 npompppgdpttpjttdjttpdttndttdd
+F-H6-591 2 njompppgdpttpjttdjttpdttndttdd
+F-H6-592 3 fcppncdpttpjttdjttpgttpdttdd
+F-H6-593 5 qdqcppncdpttpjttdjttpdttddttlc
+F-H6-594 3 pcqcppncdpttpjttdjttpdttddttlc
+F-H6-595 8 gbppgddpfcpjdcdjebfettpdttfdttedttddttec
+F-H6-596 6 ofpgppqfdpncpjttdjttpfttpdttddttjc
+F-H6-597 6 fpnqppfqjpdndpttpnttpjttdjttpdttdd
+F-H6-598 6 gpppfqjpdmfpttdpttpjttdjttpdttdd
+F-H6-599 6 fonqppfqfpgpdpttqnttpjttdjttpdttdd
+F-H6-600 2 ocmdppncdpfcpjttdjttcfttpdttndttdd
+F-H6-601 4 qnppqfdppfpjttdjttqettpdttddttnc
+F-H6-602 3 dmppdfdpcfpjttdjttcettpdttddttfc
+F-H6-603 8 pgppqfdpncpjttdjttpfttpdttddttjc
+F-H6-604 6 kcneppledpkdpjncdjttpfttpdttldttddttlc
+F-H6-605 2 ndqfppncjpttdpttpjttdjttpdttdd
+F-H6-606 2 olpmppnjnpqfdppfpjttdjttqettpdttndttdd
+F-H6-607 2 okpmppnjnpqfdppfpjttdjttqettpdttndttdd
+F-H6-608 2 dgppdmgpttdpttpjttdjttpdttdd
+F-H6-609 6 pfneppncdpfcpjttdjttdfttpdttddttlc
+F-H6-610 8 leppnedpkdpjncdjttpfttpdttldttddttlc
+F-H6-611 2 qjqlpppgdpttpjttdjttpdttndttdd
+F-H6-612 7 kpjqfqiqjphqipppfodpttdnttpjttdjttpdttdd
+F-H6-613 6 nonqppmpnppnkpttdpttpjttdjttpdttdd
+F-H6-614 2 leneppncdpjcpjttdjttpfttpdttddttlc
+F-H6-615 2 oqnqlqjqppnodpttpnttpjttdjttpdttdd
+F-H6-616 2 kdneppncdpjcpjttdjttpfttpdttddttlc
+F-H6-617 2 oonqppqndpttpjttjjttdjttpdttdd
+F-H6-618 2 doerfqeqfpppttdpttpjttdjttpdttdd
+F-H6-619 2 qfppncdpfcpjttdjttpdttddttkctthc
+F-H6-620 7 jdppnedplepjkddjncpfttpdttldttddttlcttkc
+F-H6-621 4 qnkqnqhqfqppfodpttdnttpjttdjttpdttdd
+F-H6-622 2 pfppfedpncpjfcdjttdfttpdttddttkctthc
+F-H6-623 2 fcgqnqppjpdpttpnttpjttdjttpdttdd
+F-H6-624 2 nqppjddpncpjttdjttpfttpdttddttgc
+F-H6-625 4 hpfqjqkpiqjphqipppfodpttdnttpjttdjttpdttdd
+F-H6-626 2 kqfqjqkpiqjphqipppfodpttdnttpjttdjttpdttdd
+F-H6-627 7 pnnqppnojpttdpttpjttdjttpdttdd
+F-H6-628 4 fqnqpphqdpttpnttpjttdjttpdttdd
+F-H6-629 2 jdncpphcdpttpjttdjttpfttpdttdd
+F-H6-630 5 qqppnqjppndpttoottpjttdjttpdttdd
+F-H6-631 2 gpppnqjpnodpttpnttpjttdjttpdttdd
+F-H6-632 2 nkpmppnmnpnjdpqfokttpjttdjttpdttndttdd
+F-H6-633 6 fphqfqgqhppphoipttdpttpjttdjttpdttdd
+F-H6-634 2 nqpppmdpqfpjpfnjttdjttqettpdttndttdd
+F-H6-635 2 mppppmdpqfpjpfnjttdjttqettpdttndttdd
+F-H6-636 4 cqppnqjpfqdpcneottpnttpjttdjttpdttdd
+F-H6-637 2 hdppcfdpncpjfcdjttpftteettpdttjdttdd
+F-H6-638 2 qfppjcjpttdpttpjttdjttpdttdd
+F-H6-639 3 cqfqhqcpppdnfpttdpttpjttdjttpdttdd
+F-H6-640 3 eqfqhqcpppdnfpttdpttpjttdjttpdttdd
+F-H6-641 2 nmpppmnpnjdpqfokttpjttdjttpdttndttdd
+F-H6-642 3 nqqpqnppttdpttpjttdjttpdttdd
+F-H6-643 7 enfqhqcnppdmdpttdnttpjttdjttpdttdd
+F-H6-644 5 neppfedpncpjfcdjttdfttpdttddttlctthc
+F-H6-645 2 qeqfppfcdpttpjttdjttdfttpdttdd
+F-H6-646 2 fqnqppcndpttpnttpjttdjttpdttdd
+F-H6-647 4 eqppfqjpgpfpdmdpttfottpjttdjttpdttdd
+F-H6-648 2 dnjqdqfqppeqfpgpdpttfottpjttdjttpdttdd
+F-H6-649 2 pmoqpqnqppjqnpmpdpttnottpjttdjttpdttdd
+F-H6-650 2 qjmdppocdpncpjjcdjttnettpdttndttddttpc
+F-H6-651 4 qdpfppqcdpncpjttdjttoettpdttkdttdd
+F-H6-652 3 dqfqppcqipdndptteottpjttdjttpdttdd
+F-H6-653 3 dgppenfpcndpttclttpjttdjttpdttdd
+F-H6-654 2 qnppqfdpofpjttdjttqhttpdttndttdd
+F-H6-655 2 pnnqmqnplqlppplokpttdpttpjttdjttpdttdd
+F-H6-656 4 cohqfqppcndpdmenttdnttpjttdjttpdttdd
+F-H6-657 3 qcpppgdpqfpjncdjttpfttofttpdttddttlc
+F-H6-658 3 ecppdfdpgdpjfcdjttfettpdttidttfdttdd
+F-H6-659 7 ebppgddpfcpjdcdjttfettpdttfdttddttec
+F-H6-660 4 nmlqnqppiqdpnolottpnttpjttdjttpdttdd
+F-H6-661 3 fcppnedpncpjicdjttpfttlettpdttddttlc
+F-H6-662 2 qnppkqdpfqdnttpjttdjttpdttjdttdd
+F-H6-663 2 fqppncjpicdpttpjttdjttpfttpdttdd
+F-H6-664 2 nqppkqdpfqdnttpjttdjttpdttjdttdd
+F-H6-665 3 ndogppttdpttpjttdjttpdttdd
+F-H6-666 5 mdppqfdpncpjttdjttpdttndttkdttdd
+F-H6-667 2 cqppfqipcnfpttdpttpjttdjttpdttdd
+F-H6-668 4 qcpppfdpncpjttdjttoettpdttddttjc
+F-H6-669 2 pgppmddpfcpjttdjttdfttpdttddtthc
+F-H6-670 2 fohqfqppmpdpttdnttpjttdjttpdttdd
+F-H6-671 2 hphqfqppmpdpttdnttpjttdjttpdttdd
+F-H6-672 2 nqppfqjpjddpncdnfcpjttdjttpfttdfttpdttdd
+F-H6-673 2 gdppnqdpfqpnjpdnncpjttdjttpfttpdttjdttdd
+F-H6-674 3 fcdgppncdpttpjttdjttqfttpdttdd
+F-H6-675 3 qepppgdpqfpjttdjttpfttofttpdttdd
+F-H6-676 6 gpppnqjpfqfpdndpttpnttpjttdjttpdttdd
+F-H6-677 4 dffdppncdpfcpjttdjttpfttpdttddttec
+F-H6-678 6 pfneppncdpttpjttdjttpdttddttkc
+F-H6-679 4 pfneppfedpncpjfcdjttdfttpdttddttlctthc
+F-H6-680 3 ncppjdjpfcdpttpjttdjttcfttpdttdd
+F-H6-681 6 fdppncdpfcpjttdjttpfttpdttddttec
+F-H6-682 2 jpppnqdpttoottpjttdjttpdttdd
+F-H6-683 2 dlmqfqlqkpjqjpiqiphqmopphohpfodpttdnttpjttdjttpdttdd
+F-H6-684 3 ceppdgdpcfpjfcdjttefttdfttpdttddttic
+F-H6-685 2 qcpppgdpqfpjncdjttpfttofttpdttddttkc
+F-H6-686 4 oepgppncdpttpjttdjttpdttkdttdd
+F-H6-687 2 ndpgppncdpttpjttdjttpdttkdttdd
+F-H6-688 2 pfppncdpfcpjttdjttcfttpdttddttjc
+F-H6-689 5 eqppnqjpfqfpgpdpdnfottpnttpjttdjttpdttdd
+F-H6-690 3 cfppnqdpfqqnjpdnttpjttdjttpdttjdttdd
+F-H6-691 2 fcppnqdpfqqnjpdnttpjttdjttpdttjdttdd
+F-H6-692 2 qfppncdpfcpjttdjttdfttpdttkdttdd
+F-H6-693 2 feppncdpfcpjttdjttpfttpdttidttdd
+F-H6-694 4 ncnqfqppjpdpttdnttpjttdjttpdttdd
+F-H6-695 2 jcfqnqppjpdpttpnttpjttdjttpdttdd
+F-H6-696 2 njpppmnpqfdpttpjttdjttpdttddttnc
+F-H6-697 2 kplqnqkqlpppttdpttpjttdjttpdttdd
+F-H6-698 2 pfpplddpncpjttdjttpdttddttlcttkc
+F-H6-699 3 omppnqjppndpttonttpjttdjttpdttdd
+F-H6-700 3 pfncppfcdpttpjttdjttpdttjdttdd
+F-H6-701 2 qqprppnqdpttpnttpjttdjttpdttdd
+F-H6-702 2 jpncpppbdpttpjttdjttpfttpdttdd
+F-H6-703 3 cmdqfqppcqjpcpdpcneottdmttpjttdjttpdttdd
+F-H6-704 3 eonqjqfqppcndpttpnttpjttdjttpdttdd
+F-H6-705 2 dnnqjqfqppcndpttpnttpjttdjttpdttdd
+F-H6-706 2 fqpppgdpttpjttdjttqettpdttdd
+F-H6-707 4 fpdnppttdpttpjttdjttpdttdd
+F-H6-708 2 cndnppttdpttpjttdjttpdttdd
+F-H6-709 5 dgppcfdpfcpjttdjttdfttpdttddttic
+F-H6-710 3 pnnqfqjqppttdpttpjttdjttpdttdd
+F-H6-711 6 fonqppfqjpgpfpdndpttpnttpjttdjttpdttdd
+F-H6-712 4 fqnqppcndpttqnttpjttdjttpdttdd
+F-H6-713 3 fcppjddpttpjttdjttpdttddttmc
+F-H6-714 3 gdppnedpncpjttdjttpfttpdttddttkc
+F-H6-715 6 jdppfddpncpjfcdjttpfttdfttpdttddttec
+F-H6-716 4 cqhqfqppcndptteottpjttdjttpdttdd
+F-H6-717 2 idppfedpncpjfcdjttpfttdfttpdttddtthc
+F-H6-718 2 jqlqnqppfqdpnopnttdnttpjttdjttpdttdd
+F-H6-719 2 icppnedpncpjfcdjttpfttdfttpdttddttlc
+F-H6-720 3 hqfqppgddpncpjttdjttpfttdfttpdttdd
+F-H6-721 2 jdnqppgpdpfcpnttdnttpjttdjttpdttdd
+F-H6-722 3 ceppdgdpcfpjfcdjttefttdfttpdttddttjc
+F-H6-723 2 qpmqnqlqmpppqnnpttdpttpjttdjttpdttdd
+F-H6-724 2 qcppqfdpmdpjncdjttpdttndttddttmcttlc
+F-H6-725 2 ephqfqgqgpppcnfpttdpttpjttdjttpdttdd
+F-H6-726 5 fcppmddpttpjttdjttqfttpdttdd
+F-H6-727 3 jdnqppiqdpttqnttpjttdjttpdttdd
+F-H6-728 2 ncfeppmddpfcpjttdjttdfttpdttidttdd
+F-H6-729 2 dfneppgddpncpjttdjttpfttpdttkdttdd
+F-H6-730 3 cqjqfqppcndptteottpjttdjttpdttdd
+F-H6-731 5 pbppmddppcpjncdjobnembpdttodttndttddttqcttoc
+F-H6-732 3 ecppgddpncpjfcdjttqfttfettpdttfdttdd
+F-H6-733 3 eedfppfcdpttpjttdjttpdttddttic
+F-H6-734 2 fddfppfcdpttpjttdjttpdttddttic
+F-H6-735 6 efdgppcfdpfcpjttdjttdfttpdttddttic
+F-H6-736 4 peqdppqcdpncpjttdjttpdttddttpcttlc
+F-H6-737 2 qcpppgdpncpjttdjttoettpdttddttjc
+F-H6-738 2 jcpgpplcdpttpjttdjttpdttndttdd
+F-H6-739 2 jpnqlqnopplodpttpnttpjttdjttpdttdd
+F-H6-740 5 nonqjqmppppnnpttdpttpjttdjttpdttdd
+F-H6-741 2 qqppnqjppndpomoottonttpjttdjttpdttdd
+F-H6-742 5 gdppnddpncpjfcdjttqfttpdttfdttddttoc
+F-H6-743 3 jqlqnqeqfqppfpdpttdnttpjttdjttpdttdd
+F-H6-744 2 nolqnqeqfqppfpdpttdnttpjttdjttpdttdd
+F-H6-745 5 mpjqnqpppnnpttdpttpjttdjttpdttdd
+F-H6-746 3 eqfqppcqjpgpfpcndpttfottpjttdjttpdttdd
+F-H6-747 2 cpfqppcqjpgpfpcndpttfottpjttdjttpdttdd
+F-H6-748 3 dqfqppeqjpgpfpdmdpttfottpjttdjttpdttdd
+F-H6-749 3 ndppqcdppcpjncdjttqdttpdttodttddttlc
+F-H6-750 2 nbppqcdppcpjncdjttqdttpdttodttddttlc
+F-H6-751 3 memdpppcdpncpjpbdjobnembpdttodttndttddttqcttoc
+F-H6-752 2 mcfdppjcdpfcpjttdjttdfttpdttddttec
+F-H6-753 2 ornqoqjqppnpdpttqnttpjttdjttpdttdd
+F-H6-754 2 jcnqoqjqppnpdpttqnttpjttdjttpdttdd
+F-H6-755 3 mpppgqdpttdnttpjttdjttpdttdd
+F-H6-756 2 fqppjddpncpjfcdjttpfttdfttpdttddttdb
+F-H6-757 3 qgpppgdpttpjttdjttqfttpdttdd
+F-H6-758 3 nmlqnqppipdpnolottpnttpjttdjttpdttdd
+F-H6-759 2 fqlqnqppipdpnolottpnttpjttdjttpdttdd
+F-H6-760 3 gqfqnqppfpdpttqnttpjttdjttpdttdd
+F-H6-761 2 fqlqjqppttdpttpjttdjttpdttdd
+F-H6-762 2 fqppjcdpttpjttdjttpdttddttlc
+F-H6-763 2 jcppnedpfepjncdjfcpfttdfttpdttddttlctthc
+F-H6-764 3 pqqqppnqjppndpttoottpjttdjttpdttdd
+F-H6-765 5 dmppfqipcndpttdnttpjttdjttpdttdd
+F-H6-766 3 dfppgddpncpjttdjttpfttpdttjdttdd
+F-H6-767 5 enfqppcnipdmdpttdnttpjttdjttpdttdd
+F-H6-768 4 oqjqnqppmpnppndpttnottpjttdjttpdttdd
+F-H6-769 2 fqlqjpppttdpttpjttdjttpdttdd
+F-H6-770 2 pnnqppgpdpttcnttpjttdjttpdttdd
+F-H6-771 2 qfppmddpttpjttdjttpdttddttoc
+F-H6-772 3 eedgppncdpfcpjttdjttpfttpdttjdttdd
+F-H6-773 2 npnqppfqjppmdpttdnttpjttdjttpdttdd
+F-H6-774 2 qhphppncdpttpjttdjttpfttpdttdd
+F-H6-775 3 dfgeppfedpgdpjfcdjttpdttfdttedttddttec
+F-H6-776 2 gqfqeqgpppgofpfoepttdpttpjttdjttpdttdd
+F-H6-777 5 pcppqcdpncpjttdjttqdttpdttddttlc
+F-H6-778 2 mopqoqppnqnpfqdpmpnottcnttpjttdjttpdttdd
+F-H6-779 2 fqjqjdppncdpfcpjttdjttpfttdfttpdttdd
+F-H6-780 2 cnjqjdppncdpfcpjttdjttpfttdfttpdttdd
+F-H6-781 4 pooqppnqnpfqjpmpdppnnottdnttpjttdjttpdttdd
+F-H6-782 4 ogpppfdpncpjttdjttofttpdttkdttdd
+F-H6-783 2 dniqnqppfqdpttpnttpjttdjttpdttdd
+F-H6-784 5 neqfppmddpncpjttdjttpdttndttkdttdd
+F-H6-785 2 jdnqppgpjpnodpttpnttpjttdjttpdttdd
+F-H6-786 2 jdppjjjpttdpttpjttdjttpdttdd
+F-H6-787 2 pgppjjjpttdpttpjttdjttpdttdd
+F-H6-788 2 oknqppfqdpjppnpldnttpjttdjttpdttjdttdd
+F-H6-789 2 qfppnqdpfqqnjpcnttpjttdjttpdttjdttdd
+F-H6-790 2 ncppnqdpfqqnjpcnttpjttdjttpdttjdttdd
+F-H6-791 3 oonqpppnjpomdpttonttpjttdjttpdttdd
+F-H6-792 3 qlqnpppgdpttpjttdjttpdttddttnc
+F-H6-793 3 fendppgddpncpjfcdjttqfttpdttfdttddttoc
+F-H6-794 2 ecndppgddpncpjfcdjttqfttpdttfdttddttoc
+F-H6-795 5 odqcpppcdpncpjttdjttqdttpdttddttlc
+F-H6-796 3 ocppqfdpmdpjncdjttnettpdttndttkdttdd
+F-H6-797 3 cqppfqipcndpdmenttdnttpjttdjttpdttdd
+F-H6-798 3 gqfqgpppttdpttpjttdjttpdttdd
+F-H6-799 3 dqfqhqcqppcndptteottpjttdjttpdttdd
+F-H6-800 2 jpndppjddpfcpjttdjttpfttdfttpdttdd
+F-H6-801 2 qrppoqnpnqjpfqdpmppopnnottdnttpjttdjttpdttdd
+F-H6-802 2 mdjfppncdpfcpjttdjttpfttpdttjdttdd
+F-H6-803 2 hdjfppncdpfcpjttdjttdfttpdttjdttdd
+F-H6-804 2 qlpmppqfdpofpjttdjttqhttpdttndttdd
+F-H6-805 2 ndppqfjpttdpttpjttdjttpdttdd
+F-H6-806 2 cdcfppfcdpccpjttdjtteettpdttddttic
+F-H6-807 2 pqqqkqnqppqndpttoottpjttdjttpdttdd
+F-H6-808 2 qqprfqnqpphqdpttqnttpjttdjttpdttdd
+F-H6-809 2 oonqppgpjppmdpttdnttpjttdjttpdttdd
+F-H6-810 2 pnnqppgpjppmdpttdnttpjttdjttpdttdd
+F-H6-811 2 idppledpncpjttdjttpfttpdttkdttdd
+F-H6-812 2 qcppqfjpmddpncpjttdjttnettpdttndttdd
+F-H6-813 2 oqppnqnpmpdpqnnottpjttdjttpdttjdttdd
+F-H6-814 2 ooppnqmplokpttdpttpjttdjttpdttdd
+F-H6-815 2 dgfqnqppcndpttqnttpjttdjttpdttdd
+F-H6-816 2 qhqnppqfdpttpjttdjttpdttddttnc
+F-H6-817 4 pepgppqfdpofpjttdjttpfttqettpdttdd
+F-H6-818 3 qcpppfdpncpjttdjttoettpdttddttlc
+F-H6-819 2 dnfqppncdpttpjttdjttpdttjdttdd
+F-H6-820 4 pcpppfdpqcpjncdjttoettqdttpdttkdttdd
+F-H6-821 2 qcpppgdpncpjttdjttoettpdttkdttdd
+F-H6-822 2 fcdgppncdpttpjttdjttpfttpdttdd
+F-H6-823 2 fccfppjcdpttpjttdjttpdttddttnc
+F-H6-824 2 gccfppjcdpttpjttdjttpdttddttnc
+F-H6-825 2 pffqnqjpppncdpttdnttpjttdjttpdttdd
+F-H6-826 4 ocqdppqcdpncpjqbdjpbpettpdttddttpcttlcttob
+F-H6-827 4 qbppqddpqcpjncdjpbpettpdttddttpcttlcttob
+F-H6-828 4 obqdppqcdpncpjpbdjttpettpdttddttpcttlc
+F-H6-829 2 pcppfedpmdpjfcdjttdfttpdttddttkctthc
+F-H6-830 3 njppomnppgdpttpjttdjttpdttndttdd
+F-H6-831 2 ncqnnqpnppqfdpttqottpjttdjttpdttdd
+F-H6-832 2 lmnqlqiqppnodpnmlottpnttpjttdjttpdttdd
+F-H6-833 3 cpnqppfqjpcqdpcneottpnttpjttdjttpdttdd
+F-H6-834 4 dcgdppncdpfcpjecdjttqfttfettpdttfdttdd
+F-H6-835 2 dnfqppcndpttfottpjttdjttpdttdd
+F-H6-836 4 pbppqddpqcpjncdjttpettpdttddttpcttlc
+F-H6-837 2 dqfqppcqjpcndpdmenttdnttpjttdjttpdttdd
+F-H6-838 2 iqfqhqipppfodpttcnttpjttdjttpdttdd
+F-H6-839 2 oonqkqfqhqfoppqndpttdnttpjttdjttpdttdd
+F-H6-840 3 ogpppgdpqfpjofdjttpfttqettpettpdttdd
+F-H6-841 2 cddfppfcdpccpjttdjtteettpdttddttjc
+F-H6-842 2 pcpfppqcdpncpjttdjttoettpdttddttjc
+F-H6-843 2 jpidppncdpttpjttdjttpfttpdttdd
+F-H6-844 2 neqfppmdjpncdpttpjttdjttpdttndttdd
+F-H6-845 4 ccppcfdpfcpjttdjtteettpdttddttic
+F-H6-846 3 qeqgppttdpttpjttdjttpdttdd
+F-H6-847 2 nfogpppfdpncpjttdjttofttpdttkdttdd
+F-H6-848 2 oeogpppfdpncpjttdjttofttpdttkdttdd
+F-H6-849 2 fqppnqdpjqpnttpjttdjttpdttjdttdd
+F-H6-850 4 hojqfqiqkphqjpppiphpfodpttdnttpjttdjttpdttdd
+F-H6-851 2 qmomppnjnppgdpttpjttdjttpdttndttdd
+F-H6-852 2 nfpppmdpqfpjpfdjttqhttqettpdttndttdd
+F-H6-853 3 dofqjqeqppgpfpdndpttfottpjttdjttpdttdd
+F-H6-854 2 dfncppgcdpttpjttdjttpfttpdttdd
+F-H6-855 2 qppqqqppnqjppndpomoottonttpjttdjttpdttdd
+F-H6-856 2 nqppjddpncpjttdjttqfttpdttddtthc
+F-H6-857 3 qfppqddpqcpjncdjqbpepbpdttddttpcttocttlcttob
+F-H6-858 4 ofpppgdpqfpjttdjttpfttqettpdttdd
+F-H6-859 4 kfppnedpgdpjncdjttpfttdfttpdttkdttdd
+F-H6-860 3 qdmdppqcdpncpjttdjttnettpdttndttdd
+F-H6-861 2 pqqqppnqjppndpomoottonttpjttdjttpdttdd
+F-H6-862 3 ionqppgpkpnodpknpnttdnttpjttdjttpdttdd
+F-H6-863 3 cedgppcfdpcdpjfcdjttefttdfttpdttjdttdd
+F-H6-864 2 cphqfqlpppcndpttpnttpjttdjttpdttdd
+F-H6-865 2 nqpppmdpqfpjttdjttqhttpdttndttdd
+F-H6-866 4 cpfqhqcoppcndpdmenttdnttpjttdjttpdttdd
+F-H6-867 2 fdnqppfcdpttqnttpjttdjttpdttdd
+F-H6-868 2 nqgqjqppttdpttpjttdjttpdttdd
+F-H6-869 2 qmnqpppmdpttpjttdjttpdttjdttdd
+F-H6-870 4 mdppqfjpncdpttpjttdjttpdttndttdd
+F-H6-871 2 gbppfddpfcpjttdjttpdttddttecttfb
+F-H6-872 2 npnqpppmdpqfpjpfnjttdjttqettpdttndttdd
+F-H6-873 2 oonqpppmdpqfpjpfnjttdjttqettpdttndttdd
+F-H7-1 151 nqppttdpttpjttjjttdjttpdttdd
+F-H7-2 28 qfppttdpttpjttjjttdjttpdttdd
+F-H7-3 23 mdppttdpttpjttjjttdjttpdttdd
+F-H7-4 21 pgppttdpttpjttjjttdjttpdttdd
+F-H7-5 8 jpppttdpttpjttjjttdjttpdttdd
+F-H7-6 7 jcppttdpttpjttjjttdjttpdttdd
+F-H7-7 3 mcppttdpttpjttjjttdjttpdttdd
+F-H7-8 3 fpppttdpttpjttjjttdjttpdttdd
+F-H7-9 2 omppttdpttpjttjjttdjttpdttdd
+F-H7-10 2 dnppttdpttpjttjjttdjttpdttdd
+F-H7-11 2 clppttdpttpjttjjttdjttpdttdd
+F-H7-12 67 pnnqppttdpttpjttjjttdjttpdttdd
+F-H7-13 65 lqnqppttdpttpjttjjttdjttpdttdd
+F-H7-14 45 cnfqppttdpttpjttjjttdjttpdttdd
+F-H7-15 32 jpnqppttdpttpjttjjttdjttpdttdd
+F-H7-16 28 ndncppttdpttpjttjjttdjttpdttdd
+F-H7-17 23 idfcppttdpttpjttjjttdjttpdttdd
+F-H7-18 20 jqfqppttdpttpjttjjttdjttpdttdd
+F-H7-20 12 kcncppttdpttpjttjjttdjttpdttdd
+F-H7-21 10 pcncppttdpttpjttjjttdjttpdttdd
+F-H7-22 5 cmfqppttdpttpjttjjttdjttpdttdd
+F-H7-23 4 jqncppttdpttpjttjjttdjttpdttdd
+F-H7-24 4 jpfcppttdpttpjttjjttdjttpdttdd
+F-H7-25 4 fefcppttdpttpjttjjttdjttpdttdd
+F-H7-26 4 lpnqppttdpttpjttjjttdjttpdttdd
+F-H7-27 3 ornqppttdpttpjttjjttdjttpdttdd
+F-H7-28 2 pgncppttdpttpjttjjttdjttpdttdd
+F-H7-29 2 iqnqppttdpttpjttjjttdjttpdttdd
+F-H7-30 24 fqppnqdpttpnttpjttjjttdjttpdttdd
+F-H7-31 8 gdppncdpttpjttjjttdjttpfttpdttdd
+F-H7-32 5 lqppfqdpttdnttpjttjjttdjttpdttdd
+F-H7-33 5 ndppfcdpttpjttjjttdjttdfttpdttdd
+F-H7-34 3 qnppfqdpttdnttpjttjjttdjttpdttdd
+F-H7-35 3 jpppnqdpttpnttpjttjjttdjttpdttdd
+F-H7-36 2 iqppnqdpttpnttpjttjjttdjttpdttdd
+F-H7-37 16 ndqfppttdpttpjttjjttdjttpdttdd
+F-H7-38 15 qeqfppttdpttpjttjjttdjttpdttdd
+F-H7-39 6 ncqfppttdpttpjttjjttdjttpdttdd
+F-H7-40 5 pfqfppttdpttpjttjjttdjttpdttdd
+F-H7-41 5 qhqfppttdpttpjttjjttdjttpdttdd
+F-H7-42 2 ofqfppttdpttpjttjjttdjttpdttdd
+F-H7-43 20 nolqnqppttdpttpjttjjttdjttpdttdd
+F-H7-44 8 pfppncdpttpjttjjttdjttpdttddttlc
+F-H7-45 7 ldppncdpttpjttjjttdjttpdttddttlc
+F-H7-46 5 qnlqnqppttdpttpjttjjttdjttpdttdd
+F-H7-47 5 qcppncdpttpjttjjttdjttpdttddttlc
+F-H7-48 4 molqnqppttdpttpjttjjttdjttpdttdd
+F-H7-49 3 dcppfcdpttpjttjjttdjttpdttddtthc
+F-H7-50 3 fcppncdpttpjttjjttdjttpdttddttlc
+F-H7-51 18 nqppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-52 5 mpppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-53 4 cfppncdpttpjttjjttdjttqfttpdttdd
+F-H7-54 4 fpppnqdpttqnttpjttjjttdjttpdttdd
+F-H7-55 3 drppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-56 3 jdppncdpttpjttjjttdjttqfttpdttdd
+F-H7-57 2 dlppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-58 19 dfncppfcdpttpjttjjttdjttpfttpdttdd
+F-H7-59 7 jdncppfcdpttpjttjjttdjttpfttpdttdd
+F-H7-60 4 cfncppfcdpttpjttjjttdjttpfttpdttdd
+F-H7-61 4 hqnqppfqdpttpnttpjttjjttdjttpdttdd
+F-H7-62 3 lcncppfcdpttpjttjjttdjttpfttpdttdd
+F-H7-63 3 jcncppfcdpttpjttjjttdjttdfttpdttdd
+F-H7-64 2 fonqppfqdpttpnttpjttjjttdjttpdttdd
+F-H7-65 2 fdncppfcdpttpjttjjttdjttpfttpdttdd
+F-H7-66 33 mdppncdpttpjttjjttdjttpdttndttdd
+F-H7-67 22 nemdppncdpttpjttjjttdjttpdttndttdd
+F-H7-68 7 ocmdppncdpttpjttjjttdjttpdttndttdd
+F-H7-69 26 ndpgppttdpttpjttjjttdjttpdttdd
+F-H7-70 6 ncpgppttdpttpjttjjttdjttpdttdd
+F-H7-71 5 mdpgppttdpttpjttjjttdjttpdttdd
+F-H7-72 2 qepgppttdpttpjttjjttdjttpdttdd
+F-H7-73 2 cfdgppttdpttpjttjjttdjttpdttdd
+F-H7-74 9 cfppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-75 9 pmppnqjpttdpttpjttjjttdjttpdttdd
+F-H7-76 8 dfppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-77 3 ncppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-78 3 pqppnqjpttdpttpjttjjttdjttpdttdd
+F-H7-79 3 gpppnqjpttdpttpjttjjttdjttpdttdd
+F-H7-80 8 pnnqoqnpppttdpttpjttjjttdjttpdttdd
+F-H7-81 4 nrnqoqnpppttdpttpjttjjttdjttpdttdd
+F-H7-82 2 cnfqeqfpppttdpttpjttjjttdjttpdttdd
+F-H7-83 2 obndppncdpttpjttjjttdjttpdttddttoc
+F-H7-84 15 ocppmddpncpjttjjttdjttnettpdttndttdd
+F-H7-85 5 pqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-86 4 orppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-87 2 cqppfqfpgpdpttfottpjttjjttdjttpdttdd
+F-H7-88 14 fdppfcdpttpjttjjttdjttpdttddttec
+F-H7-89 14 feppfcdpttpjttjjttdjttpdttidttdd
+F-H7-90 5 pfppncdpttpjttjjttdjttpdttkdttdd
+F-H7-91 3 cnppfqipttdpttpjttjjttdjttpdttdd
+F-H7-92 2 pmppnqkpttdpttpjttjjttdjttpdttdd
+F-H7-93 21 pnnqlqnoppttdpttpjttjjttdjttpdttdd
+F-H7-94 2 eqfqhqfoppttdpttpjttjjttdjttpdttdd
+F-H7-95 7 cnppdgdpttpjttjjttdjttpdttfdttdd
+F-H7-96 3 ompppgdpttpjttjjttdjttpdttndttdd
+F-H7-97 3 lcpppgdpttpjttjjttdjttpdttndttdd
+F-H7-98 2 dmpppgdpttpjttjjttdjttpdttndttdd
+F-H7-99 8 jdmdppttdpttpjttjjttdjttpdttdd
+F-H7-100 7 pnmpppttdpttpjttjjttdjttpdttdd
+F-H7-101 5 nqmpppttdpttpjttjjttdjttpdttdd
+F-H7-102 4 qfmdppttdpttpjttjjttdjttpdttdd
+F-H7-103 2 jcgdppttdpttpjttjjttdjttpdttdd
+F-H7-104 2 kcmdppttdpttpjttjjttdjttpdttdd
+F-H7-105 9 qnnqppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-106 3 pfncppfcdpttpjttjjttdjttcfttpdttdd
+F-H7-107 2 hqnqppfqdpttqnttpjttjjttdjttpdttdd
+F-H7-108 2 hqnqppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-109 2 dqnqppfqdpttqnttpjttjjttdjttpdttdd
+F-H7-110 2 jdncppfcdpttpjttjjttdjttcfttpdttdd
+F-H7-111 2 npnqppfqdpttcnttpjttjjttdjttpdttdd
+F-H7-112 8 kdppnedpncpjttjjttdjttpfttpdttddttlc
+F-H7-113 3 mphqfqppfodpttdnttpjttjjttdjttpdttdd
+F-H7-114 3 fqlqnqppnodpttpnttpjttjjttdjttpdttdd
+F-H7-115 2 jqlqnqppnodpttpnttpjttjjttdjttpdttdd
+F-H7-116 2 kcppfedpfcpjttjjttdjttdfttpdttddtthc
+F-H7-117 7 qnjqnqppttdpttpjttjjttdjttpdttdd
+F-H7-118 5 pgppncdpttpjttjjttdjttpdttddttjc
+F-H7-119 4 dnjqfqppttdpttpjttjjttdjttpdttdd
+F-H7-120 10 jdppncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-121 9 jpjdppncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-122 7 jqjdppncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-123 14 pcmdppocdpncpjttjjttdjttnettpdttndttdd
+F-H7-124 2 pooqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-125 11 ndqfpppfdpttpjttjjttdjttqettpdttdd
+F-H7-126 2 ncqfpppfdpttpjttjjttdjttqettpdttdd
+F-H7-127 12 pfppqfdpttpjttjjttdjttqettpdttdd
+F-H7-128 7 pmppqfdpttpjttjjttdjttpdttndttdd
+F-H7-129 2 lqppqnnpttdpttpjttjjttdjttpdttdd
+F-H7-130 11 dffeppfcdpttpjttjjttdjttpdttidttdd
+F-H7-131 3 fqpqoqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-132 2 qfppmddpocpjncjjttdjttnettpdttndttddttpc
+F-H7-133 2 jcppmddpocpjncjjttdjttnettpdttndttddttpc
+F-H7-134 2 kcppgddpfcpjecjjttdjttfettpdttfdttddttdc
+F-H7-135 3 mbppnddpncpjttjjttdjttpdttddttocttnb
+F-H7-136 2 ponrnqoqnpppttdpttpjttjjttdjttpdttdd
+F-H7-137 11 neppmddpncpjttjjttdjttpdttndttddttoc
+F-H7-138 2 mqoqnqppmpnpttdpttpjttjjttdjttpdttdd
+F-H7-139 6 pgppqnnppndpttqottpjttjjttdjttpdttdd
+F-H7-140 2 qnppqfdppfpjttjjttdjttqettpdttndttdd
+F-H7-141 4 gdppncdpttpjttjjttdjttpdttddttpc
+F-H7-142 2 fqpqnqppttdpttpjttjjttdjttpdttdd
+F-H7-143 4 gdppnedpncpjttjjttdjttpfttpdttkdttdd
+F-H7-144 3 ncppfedpfcpjttjjttdjttdfttpdttidttdd
+F-H7-145 2 dbppfedpfcpjttjjttdjttdfttpdttidttdd
+F-H7-146 3 ofppqfdpttpjttjjttdjttqhttpdttdd
+F-H7-147 4 qnppjdjpncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-148 2 fqppjdjpncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-149 4 obndppncdpmbpjttjjttdjttpdttddttocttnb
+F-H7-150 4 ndqfppofdpttpjttjjttdjttqhttpdttdd
+F-H7-151 2 ncqfppofdpttpjttjjttdjttqhttpdttdd
+F-H7-152 6 jdjpppttdpttpjttjjttdjttpdttdd
+F-H7-153 2 gqjpppttdpttpjttjjttdjttpdttdd
+F-H7-154 2 fqormrnrnqoqnpppttdpttpjttjjttdjttpdttdd
+F-H7-155 7 npompppgdpttpjttjjttdjttpdttndttdd
+F-H7-156 4 njompppgdpttpjttjjttdjttpdttndttdd
+F-H7-157 6 odneppmddpncpjttjjttdjttpdttndttddttoc
+F-H7-158 4 nroqnqppmpopnonpttdpttpjttjjttdjttpdttdd
+F-H7-159 4 pfppncdpttpjttjjttdjttpdttddttkc
+F-H7-160 2 qnkqnqppttdpttpjttjjttdjttpdttdd
+F-H7-161 4 dnppnqjpfqdpttpnttpjttjjttdjttpdttdd
+F-H7-162 2 jfppncdpfcpjttjjttdjttpfttpdttjdttdd
+F-H7-163 5 jpjcppttdpttpjttjjttdjttpdttdd
+F-H7-164 4 mcjcppttdpttpjttjjttdjttpdttdd
+F-H7-165 6 dfgdppncdpttpjttjjttdjttpfttpdttdd
+F-H7-166 2 jdgdppncdpttpjttjjttdjttpfttpdttdd
+F-H7-167 6 kdldppncdpttpjttjjttdjttpdttddttlc
+F-H7-168 4 kcldppncdpttpjttjjttdjttpdttddttlc
+F-H7-169 5 eecfppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-170 3 dfcfppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-171 4 njpppmnpqfdpttpjttjjttdjttpdttndttdd
+F-H7-172 2 hqppcnfpdgdpttpjttjjttdjttpdttfdttdd
+F-H7-173 6 fpfqppdmjpttdpttpjttjjttdjttpdttdd
+F-H7-174 2 qnnqpppmjpttdpttpjttjjttdjttpdttdd
+F-H7-175 5 fddfppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-176 3 eofqppdnjpttdpttpjttjjttdjttpdttdd
+F-H7-177 3 nqlpppttdpttpjttjjttdjttpdttdd
+F-H7-178 8 ndpfppncdpttpjttjjttdjttpdttddttlc
+F-H7-179 2 oonqlqpnppttdpttpjttjjttdjttpdttdd
+F-H7-180 2 phpmppqfdppfpjttjjttdjttqettpdttndttdd
+F-H7-181 2 njqnpppnnppgdpttqottpjttjjttdjttpdttdd
+F-H7-182 2 qhpmppqfdppfpjttjjttdjttqettpdttndttdd
+F-H7-183 6 fqoqnqppnpdpttpnttpjttjjttdjttpdttdd
+F-H7-184 3 dnfqppncdpttpjttjjttdjttpfttpdttdd
+F-H7-185 6 cnjqjdppncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-186 6 jdppncdpfcpjttjjttdjttpfttcfttpdttdd
+F-H7-187 5 nppmppqfdpttpjttjjttdjttpdttndttdd
+F-H7-188 3 jpjdppncdpfcpjttjjttdjttqfttcfttpdttdd
+F-H7-189 2 ocjdppncdpfcpjttjjttdjttqfttcfttpdttdd
+F-H7-190 2 ldjdppncdpfcpjttjjttdjttqfttcfttpdttdd
+F-H7-191 3 pnnqjqqnppttdpttpjttjjttdjttpdttdd
+F-H7-192 3 oonqjqqnppttdpttpjttjjttdjttpdttdd
+F-H7-193 8 jpppnqdpfqqnttcnttpjttjjttdjttpdttdd
+F-H7-194 2 fqfpppttdpttpjttjjttdjttpdttdd
+F-H7-195 2 ocfdppncdpfcpjttjjttdjttdfttpdttddttec
+F-H7-196 2 clcnjqjdppncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-197 2 qenqppfqdpjppnqfdnttpjttjjttdjttpdttddttjc
+F-H7-198 6 pgppqfdpttpjttjjttdjttpfttpdttdd
+F-H7-199 4 mdpppfdpncpjttjjttdjttpdttndttddttlc
+F-H7-200 2 qdpppfdpncpjttjjttdjttpdttndttddttlc
+F-H7-201 3 nqppfqdpttcmttpjttjjttdjttpdttdd
+F-H7-202 2 fqppjpdpttpjttjjttdjttpdttjdttdd
+F-H7-203 2 qnppjpdpttpjttjjttdjttpdttjdttdd
+F-H7-204 2 eqnqpqfqppttdpttpjttjjttdjttpdttdd
+F-H7-205 2 dqnqpqfqppttdpttpjttjjttdjttpdttdd
+F-H7-206 4 pgppmddpttpjttjjttdjttpdttjdttdd
+F-H7-207 3 pfppmddpttpjttjjttdjttpdttjdttdd
+F-H7-208 2 phppgddpncpjttjjttdjttpfttdfttpdttdd
+F-H7-209 3 ofpgppqfdpttpjttjjttdjttpfttpdttdd
+F-H7-210 2 qepgppqfdpttpjttjjttdjttpfttpdttdd
+F-H7-211 3 kqnqlqkpppnodpttpnttpjttjjttdjttpdttdd
+F-H7-212 3 ldneppkddpncpjttjjttdjttpfttpdttddttlc
+F-H7-213 2 eqfqhqipppfodpttdnttpjttjjttdjttpdttdd
+F-H7-214 3 jpjdppncdpfcpjttjjttdjttpfttcfttpdttdd
+F-H7-215 2 pbjdppncdpfcpjttjjttdjttpfttcfttpdttdd
+F-H7-216 4 pnfqppmpdpttcnttpjttjjttdjttpdttdd
+F-H7-217 3 nqppgpdpttdnttpjttjjttdjttpdttdd
+F-H7-218 2 dmppmpdpttpnttpjttjjttdjttpdttdd
+F-H7-219 2 fcppnddpncpjttjjttdjttpdttddttocttob
+F-H7-220 4 fohqnqppfqdpttpnttpjttjjttdjttpdttdd
+F-H7-221 5 fpcnppdgdpttpjttjjttdjttpdttfdttdd
+F-H7-222 3 lonqlqjqppnodpttpnttpjttjjttdjttpdttdd
+F-H7-223 3 njppomnppgdpttpjttjjttdjttpdttndttdd
+F-H7-224 4 oqpqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-225 2 qqpqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-226 3 nqlqppfqdpttdnttpjttjjttdjttpdttdd
+F-H7-227 2 dnnqhqfqppfodpttpnttpjttjjttdjttpdttdd
+F-H7-228 3 qnpppgdpttpjttjjttdjttpdttddttnc
+F-H7-229 3 epfqhqdqppttdpttpjttjjttdjttpdttdd
+F-H7-230 3 ccfcppdcdpttpjttjjttdjttpdttddtthc
+F-H7-231 4 ecppdfdpgdpjfcjjttdjttfettpdttjdttfdttdd
+F-H7-232 5 fofqppgpjpdmfpttdpttpjttjjttdjttpdttdd
+F-H7-233 3 qepppgdpqfpjttjjttdjttpfttofttpdttdd
+F-H7-234 5 fedfppgddpfcpjttjjttdjttpdttjdttfdttdd
+F-H7-235 5 oporoqpqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-236 2 dffdppncdpttpjttjjttdjttpfttpdttdd
+F-H7-237 2 ldndppfcdpttpjttjjttdjttdfttpdttdd
+F-H7-238 6 gpppfqjpdmfpttdpttpjttjjttdjttpdttdd
+F-H7-239 3 pgpmppnjnpqfdpttpjttjjttdjttpdttndttdd
+F-H7-240 2 qnnqlqmoppttdpttpjttjjttdjttpdttdd
+F-H7-241 5 mroqorpppqopnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-242 3 mdpplddpncpjttjjttdjttpdttkdttddttlc
+F-H7-243 2 lepplddpncpjttjjttdjttpdttkdttddttlc
+F-H7-244 4 qqoroqmrpppqopnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-245 2 memdpppcdpncpjobjjmbdjttnettpdttodttndttddttoc
+F-H7-246 4 mqnqmpppttdpttpjttjjttdjttpdttdd
+F-H7-247 4 ndpfppncdpttpjttjjttdjttpdttkdttdd
+F-H7-248 4 eofqjqdnppttdpttpjttjjttdjttpdttdd
+F-H7-249 2 fpfqjqdnppttdpttpjttjjttdjttpdttdd
+F-H7-250 3 qmomppnjnppgdpttpjttjjttdjttpdttndttdd
+F-H7-251 2 jcomppnjnppgdpttpjttjjttdjttpdttndttdd
+F-H7-252 2 kcppncdpttpjttjjttdjttnettpdttdd
+F-H7-253 5 gdppdfdpfcpjttjjttdjttpdttjdttfdttdd
+F-H7-254 4 pmppqfdpttpjttjjttdjttpdttddttnc
+F-H7-255 2 dfppnedpncpjfcjjttdjttpfttpdttddttlcttic
+F-H7-256 2 npnqppfqjppndpttdnttpjttjjttdjttpdttdd
+F-H7-257 2 ndqfppncdpttpjttjjttdjttpdttddttlc
+F-H7-258 3 pqqqlqnqppttdpttpjttjjttdjttpdttdd
+F-H7-259 2 qdqcppncdpttpjttjjttdjttpdttddttlc
+F-H7-260 3 qqppnqjpqndpttoottpjttjjttdjttpdttdd
+F-H7-261 2 gdpphddpfcpjttjjttdjttpdttddttictthc
+F-H7-262 3 geppnedplepjkdjjjddjidpfncpdttldttddttlcttkcttjctthc
+F-H7-263 4 iqnqlqfqppnodpttpnttpjttjjttdjttpdttdd
+F-H7-264 5 jcneppledpkdpjjdjjncdjttpfttpdttldttddttlcttkc
+F-H7-265 3 dnnqppfpdpttqnttpjttjjttdjttpdttdd
+F-H7-266 2 fpdmpppgdpttpjttjjttdjttpdttndttdd
+F-H7-267 2 dccfppfcdpccpjttjjttdjtteettpdttddttjc
+F-H7-268 3 dedfppgddpfcpjecjjttdjttfettpdttjdttfdttdd
+F-H7-269 2 ogpppgdpqfpjqejjttdjttpfttofttqdttpdttdd
+F-H7-270 2 ndnqppfqdpjppnqfdnttpjttjjttdjttpdttjdttdd
+F-H7-271 2 qoqnppjdjpncdpfcpjttjjttdjttpfttdfttpdttdd
+F-H7-272 5 hcneppledpkdpjjdjjiddjncpfttpdttldttddttlcttkcttjc
+F-H7-273 2 plnqlqjqppnodpnmlottpnttpjttjjttdjttpdttdd
+F-H7-274 2 qdpgppqfdpqepjttjjttdjttpfttofttpdttdd
+F-H7-275 4 oroqpqppnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-276 3 foppfqhpttdpttpjttjjttdjttpdttdd
+F-H7-277 2 pqppnqlpttdpttpjttjjttdjttpdttdd
+F-H7-278 2 jojqncppttdpttpjttjjttdjttpdttdd
+F-H7-279 2 eqppfqjpgpfpdmdpttfottpjttjjttdjttpdttdd
+F-H7-280 2 nqppfqdpttdmttpjttjjttdjttpdttdd
+F-H7-281 2 qofqppqndpttdnttpjttjjttdjttpdttdd
+F-H7-282 4 qqjqnqppqndpttoottpjttjjttdjttpdttdd
+F-H7-283 4 oepgppncdpttpjttjjttdjttpdttddttjc
+F-H7-284 5 idppnedplepjkdjjjddjncpfttpdttldttddttlcttkcttjc
+F-H7-285 3 kqfqhqmpppfodpttdnttpjttjjttdjttpdttdd
+F-H7-286 2 nppmppqfdpttpjttjjttdjttpdttddttnc
+F-H7-287 2 idppfedpncpjfcjjttdjttpfttdfttpdttddtthc
+F-H7-288 2 fqnqppjpdpttqnttpjttjjttdjttpdttdd
+F-H7-289 2 jojqnqppfqdpttpnttpjttjjttdjttpdttdd
+F-H7-290 2 icpgpplcdpttpjttjjttdjttpdttndttdd
+F-H7-291 3 pmjqnqppqndpttpnttpjttjjttdjttpdttdd
+F-H7-292 2 fcppmddpttpjttjjttdjttqfttpdttdd
+F-H7-293 3 cdppcfdpfcpjccjjttdjtteettpdttddttjcttdc
+F-H7-294 2 pfncppfcdpttpjttjjttdjttpdttjdttdd
+F-H7-295 2 moppoqnpnqjpmpdppnpottnottpjttjjttdjttpdttdd
+F-H7-296 2 qgogppttdpttpjttjjttdjttpdttdd
+F-H7-297 2 mdjfppncdpfcpjttjjttdjttpfttpdttjdttdd
+F-H7-298 2 qqjqnqpppndpttoottpjttjjttdjttpdttdd
+F-H7-299 2 nepfppmddpncpjttjjttdjttpdttndttddttlc
+F-H7-300 2 moprqqoroqmrpppqopnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-301 2 egcfppcddpfcpjccjjttdjtteettpdttddttjcttdc
+F-H7-302 2 pfmdpplddpncpjttjjttdjttpdttkdttddttlc
+F-H7-303 2 npppomdppgpjttnjttjjttdjttpdttndttdd
+F-H7-304 2 fppqnqeqfqppttdpttpjttjjttdjttpdttdd
+F-H7-305 2 qcpppfdpncpjttjjttdjttpdttndttkdttdd
+F-H7-306 3 onnqjqqnpppmdpttpnttpjttjjttdjttpdttdd
+F-H7-307 2 kpjqnqpppmdpttoottpjttjjttdjttpdttdd
+F-H7-308 4 prqqoroqmrpppqopnqnpmpdpttnottpjttjjttdjttpdttdd
+F-H7-309 3 fcgdppncdpttpjttjjttdjttpdttddttpc
+F-H7-310 3 pnnqppnojpttdpttpjttjjttdjttpdttdd
+F-H7-311 2 kdfeppmddpfcpjttjjttdjttdfttpdttidttdd
+F-H7-312 3 ndmdppmcdpttpjttjjttdjttpdttddttnc
+F-H7-313 2 eofqppcnipttdpttpjttjjttdjttpdttdd
+F-H8-1 82 nqppttjpttdpttpjttdjttpdttjdttdd
+F-H8-2 30 pgppttjpttdpttpjttdjttpdttjdttdd
+F-H8-3 17 jjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-4 3 fpppttjpttdpttpjttdjttpdttjdttdd
+F-H8-5 3 clppttjpttdpttpjttdjttpdttjdttdd
+F-H8-6 41 ocncppttjpttdpttpjttdjttpdttjdttdd
+F-H8-7 36 dnfqppttjpttdpttpjttdjttpdttjdttdd
+F-H8-8 17 ncqfppttjpttdpttpjttdjttpdttjdttdd
+F-H8-9 12 npnqppttjpttdpttpjttdjttpdttjdttdd
+F-H8-10 8 lcncppttjpttdpttpjttdjttpdttjdttdd
+F-H8-11 4 pcncppttjpttdpttpjttdjttpdttjdttdd
+F-H8-12 2 jjqfppttjpttdpttpjttdjttpdttjdttdd
+F-H8-13 2 dbfcppttjpttdpttpjttdjttpdttjdttdd
+F-H8-14 2 pmnqppttjpttdpttpjttdjttpdttjdttdd
+F-H8-15 29 ndpgppttjpttdpttpjttdjttpdttjdttdd
+F-H8-16 4 qepgppttjpttdpttpjttdjttpdttjdttdd
+F-H8-17 3 jjpgppttjpttdpttpjttdjttpdttjdttdd
+F-H8-18 3 qfpgppttjpttdpttpjttdjttpdttjdttdd
+F-H8-19 2 mcpgppttjpttdpttpjttdjttpdttjdttdd
+F-H8-20 40 ndppncjpttdpttpjttdjttpdttjdttddttoc
+F-H8-21 31 pfndppncjpttdpttpjttdjttpdttjdttddttoc
+F-H8-22 8 nqqnpppnjpttdpttqottpjttdjttpdttjdttdd
+F-H8-23 3 nrnqoqnpppttjpttdpttpjttdjttpdttjdttdd
+F-H8-24 18 mpppfqjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-25 5 nqppfqjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-26 4 npppfqjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-27 3 qnppfqjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-28 2 drppfqjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-29 19 gdppndjpncdpttpjttdjttpfttpdttjdttddttoc
+F-H8-30 6 qnppqfjppfdpttpjttdjttqettpdttndttjdttdd
+F-H8-31 2 npeqfqppfpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-32 2 ldppndjpncdpttpjttdjttpfttpdttjdttddttoc
+F-H8-33 10 fcppmdjpttdpttpjttdjttpfttpdttjdttdd
+F-H8-34 3 pmpppgjpttdpttpjttdjttpdttndttjdttdd
+F-H8-35 2 ndppgdjpttdpttpjttdjttdfttpdttjdttdd
+F-H8-36 2 fcppmpjpttdpttpnttpjttdjttpdttjdttdd
+F-H8-37 2 ompppgjpttdpttpjttdjttpdttndttjdttdd
+F-H8-38 9 pmppqfjpttdpttpjttdjttpdttjdttddttnc
+F-H8-39 4 ncppfcjpttdpttpjttdjttcfttpdttjdttdd
+F-H8-40 2 cfppqfjpttdpttpjttdjttpdttjdttddttnc
+F-H8-41 6 fpjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-42 5 qnjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-43 2 mqjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-44 2 dgjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-45 2 jqjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-46 2 mmjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-47 2 jmjjppttjpttdpttpjttdjttpdttjdttdd
+F-H8-48 8 ldndppgdjpncdpttpjttdjttpfttpdttjdttddttoc
+F-H8-49 6 dnnqoqnpppgpjpttdpttpnttpjttdjttpdttjdttdd
+F-H8-50 3 njpmppqfjppfdpttpjttdjttqettpdttndttjdttdd
+F-H8-51 10 pnfqppmpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-52 5 njpmppqfjpttdpttpjttdjttpdttndttjdttdd
+F-H8-53 9 nonqppmpnpttjpttdpttpjttdjttpdttjdttdd
+F-H8-54 3 qoqnpppmjpttdpttpnttpjttdjttpdttjdttdd
+F-H8-55 12 mpppnqnpttjpttdpttpjttdjttpdttjdttdd
+F-H8-56 6 jnppnqjpgpdpttpnttdnttpjttdjttpdttjdttdd
+F-H8-57 2 mmppfqjpmpdpttpnttdnttpjttdjttpdttjdttdd
+F-H8-58 2 pcppmdjpfcdpttpjttdjttpfttdfttpdttjdttdd
+F-H8-59 4 npqnpppgjpttdpttpjttdjttpdttndttjdttdd
+F-H8-60 4 oqnqppgpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-61 3 clcnppdgjpttdpttpjttdjttpdttjdttfdttdd
+F-H8-62 2 dfdmppcfjpttfpttdpttpjttdjttpdttjdttdd
+F-H8-63 10 jnoqnqppnpjpgpdpttpnttdnttpjttdjttpdttjdttdd
+F-H8-64 3 geppgdjpfcdpttpjttdjttfettpdttjdttfdttdd
+F-H8-65 3 qdpppgjpqfdpttpjttdjttpfttofttpdttjdttdd
+F-H8-66 3 oqppnqnpmpjpttdpttnottpjttdjttpdttjdttdd
+F-H8-67 3 ionqoqnpppgpjpjndpttpnttdnttpjttdjttpdttjdttdd
+F-H8-68 2 knnqoqnpppgpjpjndpttpnttdnttpjttdjttpdttjdttdd
+F-H8-69 2 ohpmppnjnpqfjppfdpttpjttdjttqettpdttndttjdttdd
+F-H8-70 3 qnpmppqfjpttdpttpjttdjttpdttjdttddttnc
+F-H8-71 2 mppmppqfjpttdpttpjttdjttpdttjdttddttnc
+F-H8-72 2 qhpmppqfjpttdpttpjttdjttpdttjdttddttnc
+F-H8-73 2 dfgdppncjpttdpttpjttdjttqfttpdttjdttdd
+F-H8-74 3 ncppqfjpttdpttpjttdjttqhttpdttjdttdd
+F-H8-75 2 fohqfqppttjpttdpttpjttdjttpdttjdttdd
+F-H8-76 2 pfppncjpttdpttpjttdjttpdttjdttddttlc
+F-H8-77 6 pgnqqnpppnjpttdpttqottpjttdjttpdttjdttdd
+F-H8-78 6 mpnqppgpjpjndpttpnttdnttpjttdjttpdttjdttdd
+F-H8-79 4 nfppndjpgddpncpjttdjttpfttpdttldttjdttddttoc
+F-H8-80 2 npqnppqfjppfdpttpjttdjttqettpdttndttjdttdd
+F-H8-81 5 npppnqmpgpjpjndpttpnttdnttpjttdjttpdttjdttdd
+F-H8-82 5 pnnqppfqjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-83 5 noppnqmpnpjpgpdpjnmottpnttdnttpjttdjttpdttjdttdd
+F-H8-84 2 lpfqppnpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-85 6 monqppnpmpgpjpjndpttpnttdnttpjttdjttpdttjdttdd
+F-H8-86 2 qgpppgjpttdpttpjttdjttqfttpdttjdttdd
+F-H8-87 5 mnnqppnpmpgpjpnodpjnmottpnttdnttpjttdjttpdttjdttdd
+F-H8-88 3 nppmppqfjppfdpttpjttdjttqettpdttjdttddttnc
+F-H8-89 4 nnppnqmpnpjpgpdpnomojnpnttmnttdnttpjttdjttpdttjdttdd
+F-H8-90 2 pfqgpppgjpttdpttpjttdjttqfttpdttjdttdd
+F-H8-91 4 mrnrnqoqnpppttjpttdpttpjttdjttpdttjdttdd
+F-H8-92 3 poqnpponjppmdpttqottpnttpjttdjttpdttjdttdd
+F-H8-93 3 qfppjjjpttdpttcnttpjttdjttpdttjdttdd
+F-H8-94 2 dofrgrerfqeqfpppttjpttdpttpjttdjttpdttjdttdd
+F-H8-95 3 ormrnrnqoqnpppttjpttdpttpjttdjttpdttjdttdd
+F-H8-96 3 nqpppmjpqfdpttpjttnjttdjttpdttndttjdttdd
+F-H8-97 3 nmnqppnpmpgpjpnodpnnmojnpnttmnttdnttpjttdjttpdttjdttdd
+F-H8-98 2 gmfqppmpjpfpgpfodpjngofnpnttgnttdnttpjttdjttpdttjdttdd
+F-H8-99 3 fbppfejpgddpfcpjttdjttpdttjdttfdttedttddttec
+F-H8-100 2 pnfqeqnpppfpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-101 5 onppqnjppmdpttqottpnttpjttdjttpdttjdttdd
+F-H8-102 4 jnppnqjpfqdpttpnttdnttpjttdjttpdttjdttdd
+F-H8-103 3 cnclppttjpttdpttpjttdjttpdttjdttdd
+F-H8-104 3 ecgeppgdjpfcdpttpjttdjttfettpdttjdttfdttdd
+F-H8-105 2 qfncppfcjpttdpttpjttdjttcfttpdttjdttdd
+F-H8-106 2 gdppncjpttdpttpjttdjttpdttjdttddttpc
+F-H8-107 2 fcppcfjpttdpttpjttdjttpdttjdttddttcd
+F-H8-108 2 oonqpppmjpqfdpttpjttnjttdjttpdttndttjdttdd
+F-H8-109 2 dnnqppgpjpcndpttpnttjnttpjttdjttpdttjdttdd
+F-H8-110 4 pnnqoqnpppgpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-111 3 njpmpppgjpttdpttpjttdjttpdttndttjdttdd
+F-H8-112 3 gcppgejpgddpfcpjttdjttfettpdttjdttfdttddttec
+F-H8-113 4 npoqnqppgpjpttdpttdnttpjttdjttpdttjdttdd
+F-H8-114 2 qepgppqfjpqddpttpjttdjttpfttofttpdttjdttdd
+F-H8-115 2 ndjjppqfjpttdpttcnttpjttdjttpdttjdttdd
+F-H8-116 2 njnqqnpppgjpttdpttpjttdjttpdttndttjdttdd
+F-H8-117 2 pnnqppqfjpttdpttpjttdjttpdttndttjdttdd
+F-H8-118 2 ffgeppgdjpgcdpfcpjttdjttfettpdttjdttfdttddttec
+F-H9-1 117 nqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-2 47 mpppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-3 4 mqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-4 4 fpppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-5 4 qhppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-6 2 kjppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-7 84 qeqfppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-8 68 pfncppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-9 50 ncqfppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-10 30 fdfcppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-11 19 lcncppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-12 6 qpqnppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-13 6 fofqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-14 3 oeqfppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-15 55 pfppqfjpttdpttpjttjjttdjttqettpdttjdttdd
+F-H9-16 5 ofppqfjpttdpttpjttjjttdjttqettpdttjdttdd
+F-H9-17 61 ndqfpppfjpttdpttpjttjjttdjttqettpdttjdttdd
+F-H9-18 14 cffdppfcjpttdpttpjttjjttdjttpdttjdttddttec
+F-H9-19 3 rfqfpppfjpttdpttpjttjjttdjttqettpdttjdttdd
+F-H9-20 32 mpppfqjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-21 9 ncppfcjpttdpttpjttjjttdjttdfttpdttjdttdd
+F-H9-22 3 drppfqjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-23 3 npppfqjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-24 3 gdppnqjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-25 2 moppfqjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-26 2 qnppfqjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-27 2 qnppncjpttdpttpjttjjttdjttpfttpdttjdttdd
+F-H9-28 19 mpeqfqppfpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-29 15 qnppqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-30 3 lpoqnqppnpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-31 2 mmoqnqppnpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-32 2 iqeqfqppfpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-33 2 qfoqnqppnpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-34 31 fpdmppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-35 9 qnmpppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-36 7 mdpgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-37 4 qgpgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-38 3 qdpgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-39 3 cedgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-40 3 qmmpppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-41 2 qhpgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-42 2 qfpgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-43 2 pfpgppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-44 21 pmppqfjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-45 5 nqppfqjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-46 3 npppfqjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-47 2 nqppqfjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-48 2 moppfqjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-49 2 cfppnqjpttdpttqnttpjttjjttdjttpdttjdttdd
+F-H9-50 20 pnfqppmpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-51 8 njpmppqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-52 5 qhpmppqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-53 2 qnpmppqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-54 2 qepmppqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-55 2 cggdppncjpttdpttpjttjjttdjttpfttpdttjdttdd
+F-H9-56 2 qopmppqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-57 12 nppmppqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-58 11 jnfqeqmpppfpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-59 4 phpmppqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-60 2 eqnqoqnpppgpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-61 2 hqfqeqmpppfpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-62 6 fqppmpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-63 5 qhpppmnpttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-64 4 hpppdmjpttfpttdpttpjttjjttdjttpdttjdttdd
+F-H9-65 3 cnppmpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-66 3 ompppgjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-67 2 pmpppgjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-68 2 dmpppgjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-69 2 npppgpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-70 26 gdppfcjpttdpttpjttjjttdjttpdttjdttfdttdd
+F-H9-71 20 ofpgppqfjpttdpttpjttjjttdjttpfttpdttjdttdd
+F-H9-72 8 eqfqppgpjpttfpttdpttpjttjjttdjttpdttjdttdd
+F-H9-73 10 qhpmppqfjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-74 5 nppmppqfjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-75 3 qopmppqfjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-76 3 fqnqppgpjpttdpttqnttpjttjjttdjttpdttjdttdd
+F-H9-77 2 cnnqppgpjpttdpttqnttpjttjjttdjttpdttjdttdd
+F-H9-78 2 oqnqppgpjpttdpttqnttpjttjjttdjttpdttjdttdd
+F-H9-79 2 mpnqppgpjpttdpttqnttpjttjjttdjttpdttjdttdd
+F-H9-80 2 pmfqppmpjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-81 8 jfppgdjpncdpttpjttjjttdjttpfttdfttpdttjdttdd
+F-H9-82 6 mjpppmnpqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-83 2 cfppnqjpgpdpttpnttdnttpjttjjttdjttpdttjdttdd
+F-H9-84 10 qepppgjpqfdpttpjttjjttdjttpfttofttpdttjdttdd
+F-H9-85 3 qcpppgjpqfdpttpjttjjttdjttpfttofttpdttjdttdd
+F-H9-86 3 pcppmdjpncdpttpjttjjttdjttnettpdttndttjdttdd
+F-H9-87 3 repppgjpqfdpttpjttjjttdjttpfttofttpdttjdttdd
+F-H9-88 4 neppncjpttdpttpjttjjttdjttpdttjdttddttlc
+F-H9-89 3 ncppqfjpttdpttpjttjjttdjttqhttpdttjdttdd
+F-H9-90 2 qqlqnqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-91 2 dfppfcjpttdpttpjttjjttdjttpdttjdttddtthc
+F-H9-92 2 pqlqnqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-93 5 pmppqfjppfdpttpjttjjttdjttqettpdttjdttddttnc
+F-H9-94 2 nqppqfjppfdpttpjttjjttdjttqettpdttjdttddttnc
+F-H9-95 2 ncppfdjpfcdpttpjttjjttdjttcfttpdttjdttddttec
+F-H9-96 5 oqnqeqfqppfpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-97 3 qhqnppqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-98 2 lcfdppncjpfcdpttpjttjjttdjttdfttpdttjdttddttec
+F-H9-99 6 qfqhppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-100 8 njpppmnpqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-101 3 mjpppmnpqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-102 7 pfncppfcjpttdpttpjttjjttdjttdfttpdttjdttdd
+F-H9-103 3 hqnqppfqjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-104 4 ncpppgjpqfdpqepjttjjttdjttpfttofttqdttpdttjdttdd
+F-H9-105 3 godqfqppeqjpgpfpttdpttfottpjttjjttdjttpdttjdttdd
+F-H9-106 2 hcppgdjpfcdpecpjttjjttdjttfettpdttjdttfdttddttdc
+F-H9-107 2 dmoqnqppnpjpgpdpttpnttjnttpjttjjttdjttpdttjdttdd
+F-H9-108 3 mpnqppgpjpjndpttpnttdnttpjttjjttdjttpdttjdttdd
+F-H9-109 2 lonqppgpjpjndpttpnttdnttpjttjjttdjttpdttjdttdd
+F-H9-110 10 qdpgppqfjpqedpttpjttjjttdjttpfttofttpdttjdttdd
+F-H9-111 3 ohpmppnjnpqfjppfdpttpjttjjttdjttqettpdttndttjdttdd
+F-H9-112 3 nqpppmjpqfdpttpjttjjttdjttqhttpdttjdttddttnc
+F-H9-113 2 nppppmjpqfdpttpjttjjttdjttqhttpdttjdttddttnc
+F-H9-114 3 pgqpqnppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-115 2 ncppqfjpttdpttpjttjjttdjttqdttpdttjdttdd
+F-H9-116 3 fqppmpjpttdpttqnttpjttjjttdjttpdttjdttdd
+F-H9-117 2 qlpppgjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-118 5 mooqnqppmpopnonpttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-119 7 ofpppgjpqfdpttpjttjjttdjttpfttqettpdttjdttdd
+F-H9-120 8 pepgppqfjpofdpttpjttjjttdjttpfttqettpdttjdttdd
+F-H9-121 4 fonqoqnpppgpjpdmdpttpnttjnttpjttjjttdjttpdttjdttdd
+F-H9-122 2 eonqoqnpppgpjpdmdpttpnttjnttpjttjjttdjttpdttjdttdd
+F-H9-123 4 lpppnqjpttdpttnottpjttjjttdjttpdttjdttdd
+F-H9-124 2 cnppfqjpttdpttfottpjttjjttdjttpdttjdttdd
+F-H9-125 3 pgppmdjpfcdpttpjttjjttdjttjfttdfttpdttjdttdd
+F-H9-126 2 nqpppmjpqfdpttpjttnjttjjttdjttpdttndttjdttdd
+F-H9-127 2 qnpppgjpttdpttpjttjjttdjttpdttmdttjdttdd
+F-H9-128 3 jfppncjpfcdpttpjttjjttdjttpfttdfttpdttjdttdd
+F-H9-129 2 qnnqppfqjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-130 2 pgpmppmjnpqfjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-131 2 hejgppmdjpfcdpttpjttjjttdjttpfttdfttpdttjdttdd
+F-H9-132 2 npqnpppgjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-133 4 pfneppncjpttdpttpjttjjttdjttpdttjdttddttlc
+F-H9-134 2 ncqfppofjpttdpttpjttjjttdjttqhttpdttjdttdd
+F-H9-135 2 pnnqoqmpppnoopmonpttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-136 2 njpmppqfjpofdpttpjttjjttdjttqhttpdttndttjdttdd
+F-H9-137 5 dnfpppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-138 3 lqloppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-139 2 pnloppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-140 2 ohphppqfjpttdpttpjttjjttdjttofttpdttjdttdd
+F-H9-141 2 jnppnqjpgpdpttqnttdnttpjttjjttdjttpdttjdttdd
+F-H9-142 2 mjpppmnpqfjpttdpttpjttjjttdjttpdttjdttddttnc
+F-H9-143 2 mpppfpjpttdpttdnttpjttjjttdjttpdttjdttdd
+F-H9-144 4 fpoqnqeqfqppnpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-145 2 nqpppmjpqfdpttpjttjjttdjttqhttpdttndttjdttdd
+F-H9-146 2 ofpppmjpqfdpttpjttjjttdjttqhttpdttndttjdttdd
+F-H9-147 2 ndqfppofjpttdpttpjttjjttdjttqettpdttjdttdd
+F-H9-148 2 nqpppmjpqfdppfpjttjjttdjttphttqettpdttndttjdttdd
+F-H9-149 2 qnnqpppmjpqfdpttpjttjjttdjttqhttpdttjdttddttnc
+F-H9-150 4 epnqoqnpppgpjpeodpdmfottpnttjnttpjttjjttdjttpdttjdttdd
+F-H9-151 2 qcmdpppcjpncdpobpjmbjjttdjttnettpdttodttndttjdttddttoc
+F-H9-152 4 dnnqoqfqeqnpppfpjpttdpttpnttpjttjjttdjttpdttjdttdd
+F-H9-153 2 pnfqeqnpppfpjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-154 2 qnompppgjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-155 2 nfpgppldjpttdpttpjttjjttdjttpdttndttjdttdd
+F-H9-156 2 gohpppdmjpttfpttdpttpjttjjttdjttpdttjdttdd
+F-H9-157 3 odmdpppcjpncdpobpjttjjttdjttnettpdttndttjdttddttoc
+F-H9-158 4 mbppmdjppcdpncpjobjjttdjttnettpdttodttndttjdttddttoc
+F-H9-159 2 dfcfppgdjpfcdpecpjttjjttdjttfettpdttjdttfdttddttdc
+F-H9-160 2 pnfqppnpjpttdpttcnttpjttjjttdjttpdttjdttdd
+F-H9-161 2 pnmqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-162 3 pqqqlqnqppttjpttdpttpjttjjttdjttpdttjdttdd
+F-H9-163 3 qfpppgjpttdpttpjttjjttdjttqgttpdttjdttdd
+F-H9-164 2 jnoqnqeqfqppnpjpfpdpttpnttdnttpjttjjttdjttpdttjdttdd
+F-H9-165 3 gdppnejpncdpttpjttjjttdjttpfttpdttjdttddttlc
+F-H9-166 2 jqlqnqgpppttjpttdpttpjttjjttdjttpdttjdttdd
diff --git a/patterns/fuseki9.dbz b/patterns/fuseki9.dbz
new file mode 100644 (file)
index 0000000..0fd9857
--- /dev/null
@@ -0,0 +1,1356 @@
+F-H0-1 329 ee
+F-H0-2 32 gc
+F-H0-3 29 gd
+F-H0-4 130 df
+F-H0-5 68 fe
+F-H0-6 29 ge
+F-H0-7 104 gdee
+F-H0-8 71 cgee
+F-H0-9 54 ceee
+F-H0-10 32 dfee
+F-H0-11 21 feee
+F-H0-12 38 cddg
+F-H0-13 27 eefc
+F-H0-14 27 cfgd
+F-H0-15 27 cggd
+F-H0-16 22 ccgd
+F-H0-17 22 fdcf
+F-H0-18 19 egcf
+F-H0-19 16 dggd
+F-H0-20 15 fefg
+F-H0-21 15 fffc
+F-H0-22 11 fgdg
+F-H0-23 8 degd
+F-H0-24 8 effg
+F-H0-25 7 gggd
+F-H0-26 5 gdfc
+F-H0-27 4 dfdg
+F-H0-28 4 fgfc
+F-H0-29 2 efgd
+F-H0-30 2 gecf
+F-H0-31 38 ccgg
+F-H0-32 36 dggc
+F-H0-33 28 fccc
+F-H0-34 24 dfgc
+F-H0-35 16 eegc
+F-H0-36 11 fdgc
+F-H0-37 7 gggc
+F-H0-38 5 cdgc
+F-H0-39 4 ddgc
+F-H0-40 3 cegc
+F-H0-41 3 decg
+F-H0-42 3 efgc
+F-H0-43 2 ecgc
+F-H0-44 2 gdgc
+F-H0-45 48 cfcdee
+F-H0-46 31 gffgee
+F-H0-47 30 egcfee
+F-H0-48 19 gegdee
+F-H0-49 11 fdfcee
+F-H0-50 9 fccdee
+F-H0-51 6 dgfcee
+F-H0-52 6 gddgee
+F-H0-53 6 gccfee
+F-H0-54 5 gccdee
+F-H0-55 5 ggdgee
+F-H0-56 5 cegfee
+F-H0-57 2 gfdgee
+F-H0-58 27 dgfd
+F-H0-59 21 cgfd
+F-H0-60 18 effd
+F-H0-61 17 cddf
+F-H0-62 16 dffd
+F-H0-63 13 eefd
+F-H0-64 8 ccfd
+F-H0-65 7 fffd
+F-H0-66 6 gcfd
+F-H0-67 5 cdfd
+F-H0-68 2 eddd
+F-H0-69 2 egfd
+F-H0-70 27 gfegee
+F-H0-71 25 gdgeee
+F-H0-72 23 cegeee
+F-H0-73 16 geegee
+F-H0-74 8 ggecee
+F-H0-75 7 dfegee
+F-H0-76 5 dggeee
+F-H0-77 5 ccceee
+F-H0-78 4 fgecee
+F-H0-79 2 efegee
+F-H0-80 40 egcgee
+F-H0-81 19 fgcgee
+F-H0-82 17 ggccee
+F-H0-83 11 cgccee
+F-H0-84 9 dgcgee
+F-H0-85 8 fdgcee
+F-H0-86 6 gecgee
+F-H0-87 4 bdccee
+F-H0-88 3 fccgee
+F-H0-89 2 gfcgee
+F-H0-90 22 cddggc
+F-H0-91 13 ccgdcg
+F-H0-92 9 gefgcc
+F-H0-93 8 cdgdcg
+F-H0-94 5 cddcgg
+F-H0-95 4 cdcfgc
+F-H0-96 4 cccfgc
+F-H0-97 3 dccfgc
+F-H0-98 3 dddggc
+F-H0-99 3 gcgdcg
+F-H0-100 2 eecfgc
+F-H0-101 2 ffdggc
+F-H0-102 2 edgdcg
+F-H0-103 13 gfcddg
+F-H0-104 9 dcgdfg
+F-H0-105 7 cggdfg
+F-H0-106 7 ecgdfg
+F-H0-107 5 cggffc
+F-H0-108 4 dedcgd
+F-H0-109 3 dhfgcf
+F-H0-110 2 cddcgd
+F-H0-111 2 dgdcgd
+F-H0-112 2 eedcgd
+F-H0-113 20 egeecfcd
+F-H0-114 8 ccdgfgee
+F-H0-115 4 cfgfgdee
+F-H0-116 4 dggfgdee
+F-H0-117 4 edeefcdc
+F-H0-118 3 eceegfgd
+F-H0-119 3 defgdgee
+F-H0-120 2 fgeecfcd
+F-H0-121 2 ceeegfgd
+F-H0-122 2 dfeedcfc
+F-H0-123 20 ggcggc
+F-H0-124 16 cfccgg
+F-H0-125 6 fggccg
+F-H0-126 4 ffcggc
+F-H0-127 3 cecggc
+F-H0-128 2 dfcggc
+F-H0-129 2 cfcggc
+F-H0-130 2 eecggc
+F-H0-131 18 defe
+F-H0-132 8 ffed
+F-H0-133 5 eefe
+F-H0-134 5 dgfe
+F-H0-135 4 cdfe
+F-H0-136 2 cefe
+F-H0-137 2 gdfe
+F-H0-138 2 dgde
+F-H0-139 11 gdffcf
+F-H0-140 7 dcffcf
+F-H0-141 5 ccfdfg
+F-H0-142 4 fddfdc
+F-H0-143 3 cedddg
+F-H0-144 3 ggdddg
+F-H0-145 2 cdfdfg
+F-H0-146 2 dffffc
+F-H0-147 2 gcfdfg
+F-H0-148 11 ceeedg
+F-H0-149 6 fdeegf
+F-H0-150 5 fgeegd
+F-H0-151 4 dceefc
+F-H0-152 3 ggeedg
+F-H0-153 3 cfeegd
+F-H0-154 2 cceefg
+F-H0-155 2 dgeegd
+F-H0-156 2 fdeedg
+F-H0-157 12 dcgegcee
+F-H0-158 8 eggeggee
+F-H0-159 8 cgeegcec
+F-H0-160 5 ggegcgee
+F-H0-161 2 ffeeccce
+F-H0-162 2 gdegcgee
+F-H0-163 11 ddgefcee
+F-H0-164 8 ggeegdec
+F-H0-165 6 cfeegdec
+F-H0-166 6 geegcfee
+F-H0-167 4 gfeedgce
+F-H0-168 3 cceggfee
+F-H0-169 15 fgcfgd
+F-H0-170 4 cddcfg
+F-H0-171 4 fgdgfc
+F-H0-172 3 cdfcdg
+F-H0-173 3 eccfgd
+F-H0-174 3 gefcdg
+F-H0-175 3 ccgdcf
+F-H0-176 2 ccfcdg
+F-H0-177 2 ffdgfc
+F-H0-178 9 cdfdcg
+F-H0-179 8 ffdfgc
+F-H0-180 7 fgdfgc
+F-H0-181 7 cgdfgc
+F-H0-182 6 ccfdcg
+F-H0-183 3 eefdcg
+F-H0-184 11 gggffgee
+F-H0-185 10 ddeefcgd
+F-H0-186 6 dggffgee
+F-H0-187 5 ccdgcfee
+F-H0-188 2 effggfee
+F-H0-189 2 ffgffgee
+F-H0-190 2 gdcfdgee
+F-H0-191 9 cdfgcg
+F-H0-192 7 ccgdgg
+F-H0-193 6 cgfccc
+F-H0-194 4 gefgcg
+F-H0-195 4 cfdcgc
+F-H0-196 3 eddcgc
+F-H0-197 3 ffgfgc
+F-H0-198 3 cfgdgg
+F-H0-199 2 cddcgc
+F-H0-200 12 fceegece
+F-H0-201 7 beeegece
+F-H0-202 5 fggeceee
+F-H0-203 3 fdeeegec
+F-H0-204 2 cggeceee
+F-H0-205 7 dcegcf
+F-H0-206 4 cgcedc
+F-H0-207 3 cdcedc
+F-H0-208 3 gceggf
+F-H0-209 2 fccedg
+F-H0-210 2 fegefc
+F-H0-211 2 eegefg
+F-H0-212 9 fgcffd
+F-H0-213 8 fgdgfd
+F-H0-214 7 eccdff
+F-H0-215 4 edgddf
+F-H0-216 3 ccdgfd
+F-H0-217 3 dgcffd
+F-H0-218 3 cccffd
+F-H0-219 20 efffee
+F-H0-220 4 fcddee
+F-H0-221 3 cgdfee
+F-H0-222 2 dffdee
+F-H0-223 12 fgcggd
+F-H0-224 4 cfggdc
+F-H0-225 4 gdggcd
+F-H0-226 3 geccfg
+F-H0-227 2 decggd
+F-H0-228 2 ddccgf
+F-H0-229 2 ggcggd
+F-H0-230 8 cfgfegee
+F-H0-231 8 ecgfegee
+F-H0-232 8 dddfgd
+F-H0-233 8 dcfdcf
+F-H0-234 5 egfdcf
+F-H0-235 3 gcfdcf
+F-H0-236 3 fgfdcf
+F-H0-237 3 cddfgd
+F-H0-238 2 ggfdcf
+F-H0-239 2 cgddfg
+F-H0-240 8 hdeegegd
+F-H0-241 7 fdeegegd
+F-H0-242 4 effgegee
+F-H0-243 7 egcgfd
+F-H0-244 6 fgcgfd
+F-H0-245 4 fdgcdf
+F-H0-246 3 ffcgfd
+F-H0-247 2 ggcgfd
+F-H0-248 9 cggcggcc
+F-H0-249 7 dcggcggc
+F-H0-250 2 ffggcggc
+F-H0-251 13 fdfeee
+F-H0-252 7 edfeee
+F-H0-253 2 ccfeee
+F-H0-254 8 fgegeecfcd
+F-H0-255 6 dcfgdggeee
+F-H0-256 5 ceegeegfgd
+F-H0-257 4 ccegeegfgd
+F-H0-258 2 fcfgdggeee
+F-H0-259 5 cfgdff
+F-H0-260 3 efgffd
+F-H0-261 3 gegdff
+F-H0-262 3 ffcddf
+F-H0-263 3 cedcfd
+F-H0-264 3 fffgdf
+F-H0-265 2 gffgdf
+F-H0-266 2 dggffd
+F-H0-267 9 fgcffc
+F-H0-268 4 egcffc
+F-H0-269 4 ecdggd
+F-H0-270 2 edcdfg
+F-H0-271 2 dcdggd
+F-H0-272 2 cfcdfg
+F-H0-273 9 cgeegc
+F-H0-274 5 dgeegg
+F-H0-275 4 ffeegc
+F-H0-276 3 ggeegc
+F-H0-277 2 ddeegg
+F-H0-278 2 edeegc
+F-H0-279 6 fggfggee
+F-H0-280 6 dhdgcgee
+F-H0-281 3 gceeccdc
+F-H0-282 4 cdeg
+F-H0-283 4 eege
+F-H0-284 3 cdge
+F-H0-285 2 dege
+F-H0-286 2 ddeg
+F-H0-287 5 fgdffd
+F-H0-288 4 deddff
+F-H0-289 3 gcfddf
+F-H0-290 2 cgddff
+F-H0-291 2 dfddff
+F-H0-292 7 ffegfgee
+F-H0-293 6 hegegdee
+F-H0-294 4 edeefcec
+F-H0-295 2 eggegfee
+F-H0-296 9 ecgccd
+F-H0-297 4 dcggcf
+F-H0-298 3 cccggf
+F-H0-299 3 ddccgd
+F-H0-300 2 geggcf
+F-H0-301 7 dddefe
+F-H0-302 3 edfede
+F-H0-303 3 egdefe
+F-H0-304 2 gcedef
+F-H0-305 2 gfedef
+F-H0-306 5 cffefg
+F-H0-307 5 fddedc
+F-H0-308 3 ggedgd
+F-H0-309 2 dcfefg
+F-H0-310 2 ecedgd
+F-H0-311 2 dcedcd
+F-H0-312 12 feefffee
+F-H0-313 5 cdeeddde
+F-H0-314 2 egefffee
+F-H0-315 2 gdefffee
+F-H0-316 12 cfgdfgdc
+F-H0-317 4 ecfgcfgd
+F-H0-318 2 dgcfgddc
+F-H0-319 2 eefgcfgd
+F-H0-320 6 fdgdeegcfc
+F-H0-321 5 dggggffgee
+F-H0-322 2 hfgggffgee
+F-H0-323 16 edeefefd
+F-H0-324 2 feeededd
+F-H0-325 2 edfffeee
+F-H0-326 6 dccgegcdee
+F-H0-327 5 cegggedgee
+F-H0-328 4 fcgcgedcee
+F-H0-329 4 cfgcgedcee
+F-H0-330 2 gegfeegcec
+F-H0-331 8 ggeecggc
+F-H0-332 7 gfcggcee
+F-H0-333 3 fgcggcee
+F-H0-334 2 ffggccee
+F-H0-335 6 fggdcfdc
+F-H0-336 5 gcdgcdgf
+F-H0-337 4 gfgdcfdc
+F-H0-338 3 dffgdcgd
+F-H0-339 8 dcfgcfgc
+F-H0-340 3 cgggcdfc
+F-H0-341 2 ddcddggc
+F-H0-342 2 cecggddc
+F-H0-343 2 fefgcfgc
+F-H0-344 7 dcfgcggd
+F-H0-345 4 cegdggdc
+F-H0-346 4 ggcfgcdc
+F-H0-347 4 ffcfgcdc
+F-H0-348 3 cfdggcgf
+F-H0-349 6 dcgfdfgc
+F-H0-350 3 ecgfdfgc
+F-H0-351 2 cccgfdcd
+F-H0-352 3 ggegeeecgd
+F-H0-353 3 dcegcfecee
+F-H0-354 3 ceeggfecee
+F-H0-355 3 cgeggfecee
+F-H0-356 2 ffgeeecefc
+F-H0-357 7 ecgeegee
+F-H0-358 2 gfeeegce
+F-H0-359 2 efeeceec
+F-H0-360 4 efdefd
+F-H0-361 2 ddeffd
+F-H0-362 2 fcfedf
+F-H0-363 2 fgdefd
+F-H0-364 6 cdfgcgee
+F-H0-365 6 cceegggd
+F-H0-366 2 gfcfccee
+F-H0-367 5 dgcfggdcgc
+F-H0-368 2 gecdggfccg
+F-H0-369 2 gcfgcggdcc
+F-H0-370 2 cfdgggcdgc
+F-H0-371 2 dhcfggdcgc
+F-H0-372 5 dddgfcee
+F-H0-373 5 fceegfcd
+F-H0-374 4 egeecfgd
+F-H0-375 7 fgcggdcc
+F-H0-376 9 bfgeeebece
+F-H0-377 2 cfgeeebece
+F-H0-378 6 feeefd
+F-H0-379 2 cgeefd
+F-H0-380 2 dfeefd
+F-H0-381 6 dgegeegf
+F-H0-382 4 egfgeege
+F-H0-383 3 fgdgeece
+F-H0-384 2 fggeeefc
+F-H0-385 4 eegfdgfccd
+F-H0-386 3 decffgdcgd
+F-H0-387 9 dfdhdgegee
+F-H0-388 5 gcgeeehdgd
+F-H0-389 5 cdfgfdcf
+F-H0-390 2 cgcdfffc
+F-H0-391 8 dcdeeeeddd
+F-H0-392 6 effeeeedfd
+F-H0-393 6 edfeeefd
+F-H0-394 4 edffeefe
+F-H0-395 4 fffeeefd
+F-H0-396 9 gdggcccf
+F-H0-397 4 cggdggcc
+F-H0-398 2 defgcggc
+F-H0-399 2 fgcdcggc
+F-H0-400 5 ggcgccee
+F-H0-401 2 dfcgggee
+F-H0-402 4 bdbfgeeebece
+F-H0-403 2 cfbfgeeebece
+F-H0-404 2 cdbfgeeebece
+F-H0-405 2 fdcgfgcd
+F-H0-406 2 cfgfdcgc
+F-H0-407 2 gccgfgcd
+F-H0-408 2 cccgfgcd
+F-H0-409 2 fccgfgcd
+F-H0-410 6 fdffeffeee
+F-H0-411 3 gdfdfeedee
+F-H0-412 3 edffeffeee
+F-H0-413 8 fcfdgc
+F-H0-414 4 cgfdgc
+F-H0-415 2 ccfdgc
+F-H0-416 7 fedgcfffee
+F-H0-417 5 gcddeefcgd
+F-H0-418 6 gcfdfgcdcf
+F-H0-419 2 gdfdfgcdcf
+F-H0-420 4 ccdgggcdfc
+F-H0-421 4 gdcdcgfcgf
+F-H0-422 3 chcffgdcgc
+F-H0-423 2 dhcffgdcgc
+F-H0-424 3 eegggccgcc
+F-H0-425 3 begcggcccg
+F-H0-426 3 cecgggccgc
+F-H0-427 2 dbcgggccgc
+F-H0-428 4 cecgeegcec
+F-H0-429 3 geggegccee
+F-H0-430 2 fgcggegcee
+F-H0-431 2 egcgeegcec
+F-H0-432 4 gcfgcgfd
+F-H0-433 7 cgdfgfdcgc
+F-H0-434 2 cegdggdddg
+F-H0-435 5 gdcffgcc
+F-H0-436 2 ccfggdcg
+F-H0-437 2 fdggcddg
+F-H0-438 2 fccffgcc
+F-H0-439 9 edgfeefd
+F-H0-440 2 gddgeeff
+F-H0-441 3 deddgefcee
+F-H0-442 2 gddgeeffce
+F-H0-443 2 ecfggedfee
+F-H0-444 2 effggedfee
+F-H0-445 3 gdeefcfd
+F-H0-446 2 egfffgee
+F-H0-447 4 gfgeeefcce
+F-H0-448 3 fcfgeegece
+F-H0-449 2 gdegeegfec
+F-H0-450 4 dcfgdffd
+F-H0-451 2 ddfgdffd
+F-H0-452 2 fffgdffd
+F-H0-453 2 fcfgdffd
+F-H0-454 4 dcffdfgc
+F-H0-455 2 fgffdfgc
+F-H0-456 2 egcfddgd
+F-H0-457 2 edcfffgd
+F-H0-458 5 dcfgcffd
+F-H0-459 4 ggffdccf
+F-H0-460 6 dgcgdfgc
+F-H0-461 3 cfcgdfgfdcgc
+F-H0-462 3 gdfgfdcgcdgc
+F-H0-463 4 eggggdcfdc
+F-H0-464 4 dddffe
+F-H0-465 3 cgdfed
+F-H0-466 3 efffed
+F-H0-467 4 ffgggeee
+F-H0-468 2 eccgegee
+F-H0-469 2 cdeeecgc
+F-H0-470 4 eggeeeceec
+F-H0-471 2 dgeggeecee
+F-H0-472 2 dcegeeecce
+F-H0-473 7 effgegffee
+F-H0-474 3 fefgegffee
+F-H0-475 3 cfdhdgcgee
+F-H0-476 2 cecgcfbfee
+F-H0-477 2 ehdhdgcgee
+F-H0-478 3 cgggecee
+F-H0-479 3 fdeecegc
+F-H0-480 2 feeeegcc
+F-H0-481 3 gcdgfgdd
+F-H0-482 2 dcfgdgfd
+F-H0-483 2 ggffcdcf
+F-H0-484 2 fcffcdcf
+F-H0-485 4 fffgggeegfgd
+F-H0-486 2 hfdggggffgee
+F-H0-487 5 fccfggdc
+F-H0-488 2 ccgfcgfc
+F-H0-489 2 fggdcgdc
+F-H0-490 3 gddgfg
+F-H0-491 2 eecdcf
+F-H0-492 2 fffgdg
+F-H0-493 4 gccecgdc
+F-H0-494 3 fgcdgcec
+F-H0-495 3 egggeegdec
+F-H0-496 3 gegfeggcee
+F-H0-497 2 ccgfeggcee
+F-H0-498 4 fcfegeeefdgd
+F-H0-499 3 cgdgegefdfee
+F-H0-500 10 fegeeefdgd
+F-H0-501 2 gfcffgge
+F-H0-502 2 gcegcfdc
+F-H0-503 2 eeegcfdc
+F-H0-504 4 gcggcgccee
+F-H0-505 3 fefgcdfc
+F-H0-506 3 gefgcffc
+F-H0-507 2 dcfgcffc
+F-H0-508 5 ceeggfcfee
+F-H0-509 3 fccedgdcee
+F-H0-510 4 fgdegd
+F-H0-511 2 cceddg
+F-H0-512 3 cdegcgfd
+F-H0-513 3 gcegcgfd
+F-H0-514 5 fgcggdcd
+F-H0-515 2 ccfgfccg
+F-H0-516 5 edgcfdfc
+F-H0-517 2 ffgdfdgc
+F-H0-518 2 fccggdgc
+F-H0-519 2 cdffdgfc
+F-H0-520 2 hdgdcgfcgc
+F-H0-521 3 egcgggeeccgc
+F-H0-522 5 cecgeegc
+F-H0-523 3 ggcgeegc
+F-H0-524 2 bfcgeegc
+F-H0-525 3 cfgcgfcc
+F-H0-526 2 cecgfccc
+F-H0-527 2 fggccfcc
+F-H0-528 3 gddgcegf
+F-H0-529 3 dggdcedc
+F-H0-530 2 eecfegdc
+F-H0-531 3 cfggeedg
+F-H0-532 2 fgcfeecc
+F-H0-533 4 cecgfdcc
+F-H0-534 2 dcggdfgc
+F-H0-535 2 dgcgcedc
+F-H0-536 2 fhdgdhdfegee
+F-H0-537 2 ecdgdhdfegee
+F-H0-538 3 gdggdcce
+F-H0-539 2 cggefgcc
+F-H0-540 2 edcedggc
+F-H0-541 9 ddedeefcdc
+F-H0-542 6 egdfeffedeee
+F-H0-543 2 ffeffeeeedfd
+F-H0-544 7 fdeededdeddc
+F-H0-545 3 eceededdeddc
+F-H0-546 3 fgcffddc
+F-H0-547 2 efgfddfc
+F-H0-548 2 cegdffdc
+F-H0-549 3 cfgfdddf
+F-H0-550 2 ccgddfdd
+F-H0-551 2 fegfdddf
+F-H0-552 2 gdeegcfd
+F-H0-553 2 heeegcfd
+F-H0-554 2 gcdfcgee
+F-H0-555 5 ffeffg
+F-H0-556 2 ceeddc
+F-H0-557 2 deeeddeddcec
+F-H0-558 2 ggeedddecdce
+F-H0-559 4 dcgggd
+F-H0-560 4 ccggeecggc
+F-H0-561 2 dcggcggcee
+F-H0-562 3 fggfeegcdc
+F-H0-563 2 fgcfeeccfc
+F-H0-564 2 cccgggcdgc
+F-H0-565 3 gdfedgddfc
+F-H0-566 2 fhffdgdefc
+F-H0-567 3 feeeedde
+F-H0-568 2 ceeefeed
+F-H0-569 2 ffeffeee
+F-H0-570 5 bedgcgdfcfcegc
+F-H0-571 8 cfdgcgdfgc
+F-H0-572 4 fceegfedfd
+F-H0-573 2 ccfddedc
+F-H0-574 2 efdgdeff
+F-H0-575 2 fefddedc
+F-H0-576 5 cecgdgcfdfgc
+F-H0-577 2 gdfgfdcfcdgc
+F-H0-578 2 feeeedddfcdc
+F-H0-579 3 egeecfgc
+F-H0-580 2 dfcggdee
+F-H0-581 2 fgcgfcee
+F-H0-582 3 cgfggddc
+F-H0-583 2 fgcfdcgd
+F-H0-584 3 dcgedefc
+F-H0-585 4 gecdfgfccg
+F-H0-586 3 effeeeedfdddfc
+F-H0-587 2 edefdfdecfddee
+F-H0-588 5 gfcfdgfeffee
+F-H0-589 3 dfgfccee
+F-H0-590 2 gfeecgfc
+F-H0-591 4 cecgggdcgc
+F-H0-592 2 cggggccfcc
+F-H0-593 4 fedgfgeegegd
+F-H0-594 3 fhfgegeecfcd
+F-H0-595 7 ecgdeefcfd
+F-H0-596 4 dggggeegee
+F-H0-597 2 dccgegceee
+F-H0-598 2 eggeeegcec
+F-H0-599 4 cddgcgdfcfee
+F-H0-600 2 gcdgcgdfcfee
+F-H0-601 2 gddfdgcfcgee
+F-H0-602 2 eecgfgdcgc
+F-H0-603 2 egcgcdgfgc
+F-H0-604 2 edgdggcccf
+F-H0-605 3 dgdfegee
+F-H0-606 2 dcgedffc
+F-H0-607 3 gfcfeegdec
+F-H0-608 4 cgegdfdgee
+F-H0-609 5 ehegfgeffffeee
+F-H0-610 2 fedeeeedddecdc
+F-H0-611 2 egggfd
+F-H0-612 2 dcggdf
+F-H0-613 3 egdgffcdfc
+F-H0-614 2 fgdgffcdfc
+F-H0-615 4 ceggeeccgd
+F-H0-616 2 gggccgdcee
+F-H0-617 5 cfcgdfee
+F-H0-618 2 cgggffee
+F-H0-619 3 edeefe
+F-H0-620 3 ffeefe
+F-H0-621 3 cedgfggcee
+F-H0-622 3 fgdggeeefcdc
+F-H0-623 2 cggfgdcfecee
+F-H0-624 2 dhdgfgeegedc
+F-H0-625 4 ceegggeegdec
+F-H0-626 3 eefededd
+F-H0-627 2 fcefedfd
+F-H0-628 3 dedffffeefee
+F-H0-629 3 gdefffeefefd
+F-H0-630 2 dgefdfeededd
+F-H0-631 3 gccggg
+F-H0-632 6 dfefeefeedfd
+F-H0-633 2 cdgcgfdcdf
+F-H0-634 3 fffeeeedddfcdc
+F-H0-635 3 efdeeeedfddcfc
+F-H0-636 2 ecdeeeedfddcfc
+F-H0-637 2 gfgeeedcce
+F-H0-638 3 ddeegggccgcc
+F-H0-639 2 egeegggccgcc
+F-H0-640 2 eeddfd
+F-H0-641 2 gggffgeecgce
+F-H0-642 2 gdegcgeecddc
+F-H0-643 2 dgdegedcfc
+F-H0-644 2 efeefeedfd
+F-H0-645 2 ddffdggc
+F-H0-646 3 cfdfdg
+F-H0-647 3 dcgfeggc
+F-H0-648 3 dceefdedgcfcecfb
+F-H0-649 5 cgdffgdcgd
+F-H0-650 2 gdfdgcedfc
+F-H0-651 3 efggfhfgegee
+F-H0-652 2 cecfdgccee
+F-H0-653 2 gggffggcee
+F-H0-654 2 dgggeegdfc
+F-H0-655 3 fggfeefdedfc
+F-H0-656 2 gedgfegfeeff
+F-H0-657 2 fcdege
+F-H0-658 4 ecgcgdfcfd
+F-H0-659 5 dhegdgcgefdfee
+F-H0-660 2 ccdfgdec
+F-H0-661 2 ggffcdec
+F-H0-662 3 cfdggfcdgc
+F-H0-663 2 cfdgfcgfcc
+F-H0-664 5 hfgfgeeefcce
+F-H0-665 3 fbgfcfeegdec
+F-H0-666 2 dfeggfeecdgd
+F-H0-667 3 effgegeecf
+F-H0-668 2 bfcfceeedc
+F-H0-669 2 gffdcedc
+F-H0-670 2 egdgeegffc
+F-H0-671 2 cfgdfgdcee
+F-H0-672 3 cgeggfdcgc
+F-H0-673 2 gfcddfgc
+F-H0-674 3 dcffcgfd
+F-H0-675 2 dgfdggdd
+F-H0-676 3 geefedce
+F-H0-677 7 fcgdgcfd
+F-H0-678 2 ggegccee
+F-H0-679 2 ddgecgee
+F-H0-680 2 cggggddfdc
+F-H0-681 3 cfegdfeffedeee
+F-H0-682 3 gdgeeffeeeedfd
+F-H0-683 4 ebgdfgfdcgcdgcecfc
+F-H0-684 2 ccffcggc
+F-H0-685 2 dcffcggc
+F-H0-686 3 gefgeegd
+F-H0-687 3 dcgfeefc
+F-H0-688 3 dcfggdcgfdgccdfceceb
+F-H0-689 3 ceggegcgee
+F-H0-690 2 fgcgcegcdc
+F-H0-691 2 cggggdcedc
+F-H0-692 3 fefgegffefee
+F-H0-693 4 egggcfgcdc
+F-H0-694 4 ggcfcdgeecee
+F-H0-695 4 dgfgdfcgdcgd
+F-H0-696 2 fedggfeefccd
+F-H0-697 2 gcgdfc
+F-H0-698 2 bcgcgfdcdfcccd
+F-H0-699 5 gdgcfd
+F-H0-700 3 gdceeefdgc
+F-H0-701 4 cdgebfbeeebdce
+F-H0-702 3 ecfggdcgfdgccdfc
+F-H0-703 2 dfcfbfgeeebece
+F-H0-704 2 fcddeecdde
+F-H0-705 2 egdgefdfee
+F-H0-706 2 fefdeefced
+F-H0-707 2 fdeegfce
+F-H0-708 3 fgcggccd
+F-H0-709 2 ggcggccd
+F-H0-710 2 gcfdefcd
+F-H0-711 5 edfeeegdfdfcec
+F-H0-712 2 ceeege
+F-H0-713 3 cffgdcge
+F-H0-714 2 gfgdcfec
+F-H0-715 2 cecgfffc
+F-H0-716 4 ddgcgedceefbfcebec
+F-H0-717 2 fcgfgeheeehdgdgcec
+F-H0-718 2 ecgdfgcdcf
+F-H0-719 3 gdffeffeeeedfd
+F-H0-720 2 cccfgeee
+F-H0-721 4 cdcfeggeee
+F-H0-722 2 dececgfdcc
+F-H0-723 5 gfhegegdee
+F-H0-724 3 ggfggfdgee
+F-H0-725 3 fffeeegdfdgcedfcec
+F-H0-726 2 cedeeecdeddcddccec
+F-H0-727 4 fcgdfgfdcgcdgc
+F-H0-728 2 ceegcggegcee
+F-H0-729 2 ffeecgcegcec
+F-H0-730 5 hdefgeeefegdedfd
+F-H0-731 2 fcdggeee
+F-H0-732 2 cceeeggd
+F-H0-733 3 edfffeeefd
+F-H0-734 3 dgdfefeefeedfd
+F-H0-735 2 dedddgfcee
+F-H0-736 3 fgdecg
+F-H0-737 2 cedeeeddcddccc
+F-H0-738 3 fcdgfgeegecc
+F-H0-739 2 fgcdfd
+F-H0-740 2 cfdgdd
+F-H0-741 2 eceeggcecc
+F-H0-742 3 cddgddce
+F-H0-743 2 ddgddgec
+F-H0-744 2 cdegfccf
+F-H0-745 2 cecfeegd
+F-H0-746 2 cgfdcc
+F-H0-747 2 dhdgcgcedc
+F-H0-748 2 ecefgd
+F-H0-749 3 ccdefffd
+F-H0-750 3 dgdfcgcfee
+F-H0-751 4 hcgeeffeeehdgdedfd
+F-H0-752 2 gcggdgee
+F-H0-753 2 dfeecdgc
+F-H0-754 3 ccgdggdcce
+F-H0-755 4 ccggdccd
+F-H0-756 3 efegfggdcfdc
+F-H0-757 2 chdhdgegdfecee
+F-H0-758 3 fcfgcgfddd
+F-H0-759 2 fdcggdhdfcgc
+F-H0-760 2 gedgcfgffeffee
+F-H0-761 4 heefgeeefegdhdfdedhc
+F-H0-762 2 gfgddgdc
+F-H0-763 5 efdgdfcgcfee
+F-H0-764 2 ggdgcdgc
+F-H0-765 3 dggfcgdfcdcffc
+F-H0-766 2 fcgfcgeegdec
+F-H0-767 3 ddeecdceecgd
+F-H0-768 2 fdgfhegegdee
+F-H0-769 3 eedgefdf
+F-H0-770 2 ddedeefcec
+F-H0-771 2 egdgdhcfcgee
+F-H0-772 2 hdeegcgdfbfc
+F-H0-773 3 fgffgggeee
+F-H0-774 3 gegdeegcfd
+F-H0-775 3 egefffeefegdedfd
+F-H0-776 2 dcdfefcfdeeedded
+F-H0-777 2 hegegdeeec
+F-H0-778 3 bdcgdgcfdfbecegc
+F-H0-779 2 fgcfdcgc
+F-H0-780 2 ecfgdggccd
+F-H0-781 2 ccbfgeeebecebdcd
+F-H0-782 3 egfgggefgfeeffgd
+F-H0-783 4 dhehegfgeffffeee
+F-H0-784 2 dggfcdgc
+F-H0-785 2 dgcdgfgc
+F-H0-786 2 cgggcfdgdcgc
+F-H0-787 2 ehggfggfefffee
+F-H0-788 2 egfggecfee
+F-H0-789 3 dddgfgdeee
+F-H0-790 4 dfdhdgegeegfec
+F-H0-791 3 cgdfgfecgc
+F-H0-792 3 gdfdeegcedecfcdcfb
+F-H0-793 2 ecfgdegd
+F-H0-794 2 gffddfdc
+F-H0-795 2 edffdfefeefe
+F-H0-796 2 cgefgc
+F-H0-797 2 fceeccbd
+F-H0-798 3 ecfgcggccd
+F-H0-799 2 cdgeeeddce
+F-H0-800 2 edegeefdec
+F-H0-801 2 gdcgfgdd
+F-H0-802 3 cddgcgdfcfcebebdgc
+F-H0-803 3 eggggdcgcc
+F-H0-804 2 efeggggdcfdc
+F-H0-805 2 ffeggggdcfdc
+F-H0-806 2 bdegdfefcfdefeddee
+F-H0-807 2 egdffedeeeedddeccd
+F-H0-808 3 deeeddgdfcgc
+F-H0-809 4 ebgdgcfdfcec
+F-H0-810 2 ccdgfgeegefc
+F-H0-811 3 fffeeeedde
+F-H0-812 2 fgcdcfgc
+F-H0-813 2 cgdffgdcfd
+F-H0-814 2 cddgggeegdfc
+F-H0-815 2 fffggfeegcdc
+F-H0-816 4 ffegfgefee
+F-H0-817 2 gggffgfeffee
+F-H0-818 2 egehdhdgcgee
+F-H0-819 4 dfeedeceddcddccc
+F-H0-820 2 cfdfeedeceddcddccc
+F-H0-821 3 eccgfgddfdfc
+F-H0-822 2 gefgdgfc
+F-H0-823 3 egdggfcgdfcdcffc
+F-H0-824 2 geggeegc
+F-H0-825 3 efggfggfeeffgd
+F-H0-826 2 hccgfggcgdcc
+F-H0-827 2 fffeeeed
+F-H0-828 3 fedfeefd
+F-H0-829 2 ccefffeefeed
+F-H0-830 2 hfegcfgfdcgc
+F-H0-831 3 cdgeddeefcde
+F-H0-832 2 cggeggeegccc
+F-H0-833 3 fgggffdccf
+F-H0-834 3 dgfgccge
+F-H0-835 3 cdfgfc
+F-H0-836 2 gefceedc
+F-H0-837 3 bddgcgdfgfcecfcdbedcgc
+F-H0-838 2 eceeggceccgd
+F-H0-839 2 ecgfcgeegcce
+F-H0-840 2 cgdfcfbfgeeebece
+F-H0-841 2 gfgefefdeefcgd
+F-H0-842 3 feeefdgdgcedecfcdcfb
+F-H0-843 3 edcgeefd
+F-H0-844 2 eggfeecdgd
+F-H0-845 2 cgffcded
+F-H0-846 2 fgdfgded
+F-H0-847 2 fdedeedddedcec
+F-H0-848 2 efegfgfeffee
+F-H0-849 3 eghfhgefgfheffgeeefeed
+F-H0-850 2 ddegggcfgcdc
+F-H0-851 3 geeffeeeedfdddfc
+F-H0-852 2 egffggeffggeee
+F-H0-853 2 cfcdfe
+F-H0-854 2 egcffe
+F-H0-855 4 gceggeeeceec
+F-H0-856 2 ccggegceeegdec
+F-H0-857 2 cgcfdggcgf
+F-H0-858 3 gcgfdgde
+F-H0-859 2 gffdcfdcee
+F-H0-860 2 feegggeegegd
+F-H0-861 2 dhdggggeegee
+F-H0-862 2 cccecggc
+F-H0-863 2 ehegdgdfcgcfgfdcgc
+F-H0-864 2 efgfgccfdc
+F-H0-865 3 dfcgcedefdcc
+F-H0-866 2 gccgcdgffcgd
+F-H0-867 2 deggcgcedcgc
+F-H0-868 2 edegeefcecebdb
+F-H0-869 2 ddggdgfccdcc
+F-H0-870 2 dgfgcfcgdcgc
+F-H0-871 2 dbgcgdfcfdebec
+F-H0-872 2 ggcfgcgedcee
+F-H0-873 2 gdcgfggcfd
+F-H0-874 2 eeefdffd
+F-H0-875 2 ceffddde
+F-H0-876 2 efeeffcc
+F-H0-877 2 gdgfegeeecce
+F-H0-878 2 gfggffcdcfec
+F-H0-879 3 ccgegceedcddfbfcebec
+F-H0-880 2 dddcggcccd
+F-H0-881 3 bdbfeedebeceddedcd
+F-H0-882 2 heeggggegcee
+F-H0-883 3 fdeeedddfcec
+F-H0-884 2 cfddfggc
+F-H0-885 2 cgcfdgfc
+F-H0-886 3 efgefffeeegdfdgcedfcec
+F-H0-887 2 bedgfgdfcgcecfdcgd
+F-H0-888 2 cecdeeecgc
+F-H0-889 4 fdfgdggeeefegd
+F-H0-890 2 egggcfgddc
+F-H0-891 3 hcfeeefdgdgcedecfcdcfb
+F-H0-892 2 efdgfgeegegdfefd
+F-H0-893 2 cfgcgedceeccddfbfcebec
+F-H0-894 2 dcfdeeedddfcec
+F-H0-895 2 fcgdgfeceedbdc
+F-H0-896 3 dfcgggcfdgdcgc
+F-H0-897 2 cddgggceeegcdc
+F-H0-898 2 defffeeeed
+F-H0-899 3 efggfffggeee
+F-H0-900 2 gccedgdcgf
+F-H0-901 3 fefggfffee
+F-H0-902 2 dgeeffedfe
+F-H0-903 2 bfegcgcfcdee
+F-H0-904 2 bgcgdfcfbfgeeebece
+F-H0-905 2 cfdfcgfd
+F-H0-906 3 dcegefffeefegdedfdecdd
+F-H0-907 2 eecegc
+F-H0-908 2 cfcgdfgfecgc
+F-H0-909 2 dgcfeefccd
+F-H0-910 2 gdfgcdgcec
+F-H0-911 3 cgdfgedcfc
+F-H0-912 2 efffeegc
+F-H0-913 3 chdgdhdfegeegfec
+F-H2-1 20 cdcgttgc
+F-H2-2 19 eecgttgc
+F-H2-3 13 cccgttgc
+F-H2-4 10 ffcgttgc
+F-H2-5 8 dgcgttgc
+F-H2-6 6 gecgttgc
+F-H2-7 4 fdcgttgc
+F-H2-8 3 efcgttgc
+F-H2-9 1 chcgttgc
+F-H2-10 6 ggcccgttgc
+F-H2-11 4 cecccgttgc
+F-H2-12 4 dbcccgttgc
+F-H2-13 3 ddggcgttgc
+F-H2-14 3 ddcccgttgc
+F-H2-15 3 fgcccgttgc
+F-H2-16 2 eecccgttgc
+F-H2-17 7 ggcdcgttgc
+F-H2-18 5 cedccgttgc
+F-H2-19 5 cddccgttgc
+F-H2-20 3 ffcdcgttgc
+F-H2-21 3 eedccgttgc
+F-H2-22 2 fgcdcgttgc
+F-H2-23 2 edcdcgttgc
+F-H2-24 1 dffgcgttgc
+F-H2-25 1 hegfcgttgc
+F-H2-26 1 dcfgcgttgc
+F-H2-27 8 fgeecgttgc
+F-H2-28 8 geeecgttgc
+F-H2-29 4 ggeecgttgc
+F-H2-30 3 ddeecgttgc
+F-H2-31 2 efeecgttgc
+F-H2-32 4 cdcgccddttgc
+F-H2-33 2 cdcgggffttgc
+F-H2-34 1 becgccddttgc
+F-H2-35 1 ggcgccddttgc
+F-H2-36 4 geggcccgttgc
+F-H2-37 2 cfggcccgttgc
+F-H2-38 1 eeggcccgttgc
+F-H2-39 3 cdcgdccettgc
+F-H2-40 2 eceggfcgttgc
+F-H2-41 1 eecgfggettgc
+F-H2-42 1 gdcgdccettgc
+F-H2-43 1 decgdccettgc
+F-H2-44 1 fdcgcdgcttec
+F-H2-45 1 fdcgdccettgc
+F-H2-46 1 dbcgcdgcttec
+F-H2-47 1 ggcgcdgcttec
+F-H2-48 4 ecgeggcccgttgc
+F-H2-49 1 feggcgecgcttcc
+F-H2-50 2 hcgggecgccgcttec
+F-H2-51 1 ffggegcgcccettgc
+F-H2-52 1 dgegggcgcegcttcc
+F-H2-53 1 ghggegcgcccettgc
+F-H2-54 1 degggecgccgcttec
+F-H2-55 1 geggegcgcccettgc
+F-H2-56 1 eeggegcgcccettgc
+F-H2-57 1 fdgggecgccgcttec
+F-H2-58 4 cdcgeecettgc
+F-H2-59 2 egcgeegettgc
+F-H2-60 2 ggegeecgttgc
+F-H2-61 1 fgcgeecettgc
+F-H2-62 1 fgcgeegettgc
+F-H2-63 1 dcegeecgttgc
+F-H2-64 1 ffegeecgttgc
+F-H2-65 3 egggcdcgttgc
+F-H2-66 2 egggdccgttgc
+F-H2-67 2 egcggfgcttcc
+F-H2-68 1 eecgfggcttcc
+F-H2-69 1 bccggggcttdc
+F-H2-70 1 cfcggggcttdc
+F-H2-71 1 cfcgccgfttgc
+F-H2-72 1 fefgcccgttgc
+F-H2-73 1 ggfgcccgttgc
+F-H2-74 1 dgcgggcdttgc
+F-H2-75 1 cecggggcttdc
+F-H2-76 3 eccgcccettgc
+F-H2-77 2 ggcgccgcttec
+F-H2-78 1 fbcgccgcttec
+F-H2-79 1 edcgcccettgc
+F-H2-80 1 fccgcccettgc
+F-H2-81 1 gfcgccgcttec
+F-H2-82 1 cdcggggettgc
+F-H2-83 3 decdcgccddttgc
+F-H2-84 1 fgcdcgccddttgc
+F-H2-85 5 cdffcgttgc
+F-H2-86 2 ddffcgttgc
+F-H2-87 2 ccffcgttgc
+F-H2-88 1 ggffcgttgc
+F-H2-89 3 hdgdcgttgc
+F-H2-90 3 fdgdcgttgc
+F-H2-91 1 cfdgcgttgc
+F-H2-92 1 eedgcgttgc
+F-H2-93 2 gefgeecgttgc
+F-H2-94 1 gecgeegfttgc
+F-H2-95 1 cefgeecgttgc
+F-H2-96 1 fgcgeegfttgc
+F-H2-97 1 fcfgeecgttgc
+F-H2-98 2 ggegcgttgc
+F-H2-99 1 eeegcgttgc
+F-H2-100 1 dcgecgttgc
+F-H2-101 1 edgecgttgc
+F-H2-102 1 fggecgttgc
+F-H2-103 1 ceeccgttgc
+F-H2-104 2 cbcgccgcttdb
+F-H2-105 1 dgfhggcgttgc
+F-H2-106 1 gfcggghfttgc
+F-H2-107 1 ggcgccgcttdb
+F-H2-108 2 cccgggfffgefttgc
+F-H2-109 1 eccgcddeccddttgc
+F-H2-110 1 ebcgcddeccddttgc
+F-H2-111 1 gfcgcddeccddttgc
+F-H2-112 1 bfcgcddeccddttgc
+F-H2-113 3 cccgdccdttgc
+F-H2-114 1 gfcgcdgcttdc
+F-H2-115 1 ggcgcdgcttdc
+F-H2-116 2 cdggcgccddttgc
+F-H2-117 2 bdggcgccddttgc
+F-H2-118 1 geggcgccddttgc
+F-H2-119 4 ecgefgeecgttgc
+F-H2-120 2 dcgefgeecgttgc
+F-H2-121 1 ddgefgeecgttgc
+F-H2-122 4 eccgffcdttgc
+F-H2-123 1 bdcgffgcttdc
+F-H2-124 1 edcgffcdttgc
+F-H2-125 1 gecgffcdttgc
+F-H2-126 3 dfegggdccgttgc
+F-H2-127 1 hegeggcdcgttgc
+F-H2-128 1 edgeggcdcgttgc
+F-H2-129 1 fegeggcdcgttgc
+F-H2-130 3 fecdcgdccettgc
+F-H2-131 1 fefgeggfcgttgc
+F-H2-132 3 cecccgcbgcttdb
+F-H2-133 1 fhhgcggghfttgc
+F-H2-134 2 decgcdfedccettgc
+F-H2-135 1 fgcgcdfedccettgc
+F-H2-136 1 ggcgcdfedccettgc
+F-H2-137 1 dccgcccecbgcttdb
+F-H2-138 1 ddcgccbdbcgcttec
+F-H2-139 1 eccgcccecbgcttdb
+F-H2-140 2 dgcgcfbfttgc
+F-H2-141 2 fdcggdhdttgc
+F-H2-142 1 gbcgfcgcttfb
+F-H2-143 3 bdeecgcdcettgc
+F-H2-144 1 ehfgegeecgttgc
+F-H2-145 1 ffgfcgeegettgc
+F-H2-146 1 gefgegeecgttgc
+F-H2-147 3 geggeecgttgc
+F-H2-148 2 ccggeecgttgc
+F-H2-149 1 ehggeecgttgc
+F-H2-150 1 dcghggfggfcgccddttgc
+F-H2-151 1 cdghggfggfcgccddttgc
+F-H2-152 1 gfcgcdedttgc
+F-H2-153 1 efcgcdedttgc
+F-H2-154 1 decgcdedttgc
+F-H2-155 1 fgcgcdedttgc
+F-H2-156 1 fdcggfefttgc
+F-H2-157 3 geffcgeccdttgc
+F-H2-158 1 dfegcgddgfttgc
+F-H2-159 1 dhegcgddgfttgc
+F-H2-160 1 gfghggfgcccgttgc
+F-H2-161 2 ddggghgffgcccgttgc
+F-H2-162 1 gfegggffcgcccettgc
+F-H2-163 1 ddegggffcgcccettgc
+F-H2-164 3 ggcgceefccgcttec
+F-H2-165 1 fgcgecfecccettgc
+F-H2-166 1 fggggecgttgc
+F-H2-167 1 cfggegcgttgc
+F-H2-168 1 ceggegcgttgc
+F-H2-169 1 dggggecgttgc
+F-H2-170 1 geggegcgttgc
+F-H2-171 2 eddccgcccdttgc
+F-H2-172 1 gfdccgcccdttgc
+F-H2-173 1 ffggfggfcgttgc
+F-H2-174 2 fccggdfdttgc
+F-H2-175 1 eccgfcfdttgc
+F-H2-176 1 ggcgcdffttgc
+F-H2-177 1 egcggfddttgc
+F-H2-178 1 gfcgcdffttgc
+F-H2-179 1 cfcgcdffttgc
+F-H2-180 1 dcfggecgeegcttec
+F-H2-181 1 ggcgeegeeccdttgc
+F-H2-182 2 efggegcgdcdfttgc
+F-H2-183 1 ffggegcgdcdfttgc
+F-H2-184 1 eeggegcgdcdfttgc
+F-H2-185 2 ghggfgcccgttgc
+F-H2-186 1 dbcgggddcccdttgc
+F-H2-187 1 dccgggddcccdttgc
+F-H2-188 3 feeccgcccettgc
+F-H2-189 1 cehgggcgfggfcdddccgcttdc
+F-H2-190 1 edghggfggfcgdcddcccdttgc
+F-H2-191 2 dbgefgeecgdcgcttec
+F-H2-192 1 dfegcgeegfcdcettgc
+F-H2-193 2 gffhhgcggghfceefccgcttec
+F-H2-194 1 ddcggggeegdeccbdcbgcttdb
+F-H2-195 2 gdfdcgttgc
+F-H2-196 2 ecggcgdcddcccdttgc
+F-H2-197 3 hfggcgceefccgcttec
+F-H2-198 2 fbeccgdcceccgccbebttdb
+F-H2-199 1 fceccgdcceccgccbebttdb
+F-H2-200 3 hgcggghfceefccgcttec
+F-H2-201 1 fhfgggcgcdffttgc
+F-H2-202 1 gffgggcgcdffttgc
+F-H2-203 1 dfggcgcegcttdc
+F-H2-204 1 fegefgcccgttgc
+F-H2-205 3 fhhgcggghfceefccgcttec
+F-H2-206 2 fbggcgdcddcccdebgcttec
+F-H2-207 1 cccgggffgfgcttdc
+F-H2-208 1 cffgcdcgccddttgc
+F-H2-209 1 cefgcdcgccddttgc
+F-H2-210 1 defgcdcgccddttgc
+F-H2-211 2 cdggghgffgdccgccddttgc
+F-H2-212 1 dacgggdddccdccgcebecttfb
+F-H2-213 1 dbcgggdddccdccgcebecttfb
+F-H2-214 2 fgggcgcdffttgc
+F-H2-215 2 egdgdfcgttgc
+F-H2-216 1 fecgfdgdttgc
+F-H2-217 1 ffcgfdgdttgc
+F-H2-218 2 ceggcgccgcttec
+F-H2-219 1 ffggcgcccettgc
+F-H2-220 1 ebcgggdddccdccgcttec
+F-H2-221 2 fdcggfeettgc
+F-H2-222 1 fecgfgeettgc
+F-H2-223 1 dfcgdceettgc
+F-H2-224 2 fggdcgfdhdttgc
+F-H2-225 2 fgdecgcdfedccettgc
+F-H2-226 1 cbfggecgeegcdcecttdb
+F-H2-227 1 ccedcgfcgdecfdttgc
+F-H2-228 1 dbcdcgecdeccddttgc
+F-H2-229 2 cecggfgcttdc
+F-H2-230 1 eefgcdcgttgc
+F-H2-231 1 cdcgedgdfcfdecgcttcc
+F-H2-232 1 cfcgedgdfcfdecgcttcc
+F-H2-233 1 dgcgedgdfcfdecgcttcc
+F-H2-234 1 dbcgggdecdgcttec
+F-H2-235 1 dccgcddeecddccgcttdb
+F-H2-236 2 hehgcggfhfeegeeccdttgc
+F-H2-237 1 ddgefgeecgdcgccbecttdb
+F-H2-238 3 gfcgffgeeccdttgc
+F-H2-239 1 ccggcgcdgcttdc
+F-H2-240 1 geggcgcdgcttdc
+F-H2-241 2 cccgggddttgc
+F-H2-242 2 bfcffgdecgcdfedccettgc
+F-H2-243 2 bgcffgdecgbebfcdfedcgc
+F-H2-244 2 ffcgeeefttgc
+F-H2-245 1 cfcgcebfcdbeccbdbcgcttec
+F-H2-246 1 gfcgeccedcgcccfbcbebttdb
+F-H2-247 1 efcgeccedcgcccfbcbebttdb
+F-H2-248 1 bdggcgdcddcccdebgcdbecttfb
+F-H2-249 1 dcggfghfcggfffhegecchdttgc
+F-H2-250 2 ffeggggecgcccettgc
+F-H2-251 1 edeeggcccgttgc
+F-H2-252 1 geeeggcccgttgc
+F-H2-253 2 cccgeececdbdttgc
+F-H2-254 1 effhfgegeecgttgc
+F-H2-255 1 hefgggcggfffcdgettgc
+F-H2-256 1 ffegggeecgttgc
+F-H2-257 1 eggeggeecgttgc
+F-H2-258 1 ceegggeecgttgc
+F-H2-259 1 fgegcgddgfcdcettgc
+F-H2-260 1 edgfcgffgeeccdttgc
+F-H2-261 1 ehfgegffcgcegcttdc
+F-H2-262 2 ddcgggceccgcttec
+F-H2-263 2 hehgfhggcggfhfceefccgcttec
+F-H2-264 1 eccgdcceccgccbebttdb
+F-H2-265 2 befgcfcgdebfcdfedccettgc
+F-H2-266 2 egffcgeeefttgc
+F-H2-267 1 efffcgeefettgc
+F-H2-268 1 dfegcgeegettgc
+F-H2-269 1 ceegcgeegettgc
+F-H2-270 1 dgegcgeegettgc
+F-H2-271 1 edcgfcgdecfdttgc
+F-H2-272 2 eeggcgddceccgcttec
+F-H2-273 1 geggfggfcgcdffttgc
+F-H2-274 1 gdggfggfcghefffegecdhdttgc
+F-H2-275 2 eeegggefcgdcdfttgc
+F-H2-276 1 hdggfggfcgheffcdgettgc
+F-H2-277 1 cccgggdfcegcttdc
+F-H2-278 1 efcgeggfccdfttgc
+F-H2-279 1 fdcdcgecdedcddccgcttdb
+F-H2-280 1 edcgcddeecfddcddccgcttdb
+F-H2-281 1 fccgcddeecfddcddccgcttdb
+F-H2-282 2 cffgdecgcdfedccettgc
+F-H2-283 1 fccgcceettgc
+F-H2-284 1 dfcgcceettgc
+F-H2-285 2 hefggdcgfdhdttgc
+F-H2-286 1 gdcgfdcdfcgcttfb
+F-H2-287 2 ebdccgcccecbgcttdb
+F-H2-288 1 decgggeeddceccgcttec
+F-H2-289 1 bdcgggeeddceccgcttec
+F-H2-290 1 fefgggcggfffhegecdhdttgc
+F-H2-291 1 feggegcgffgfcccettgc
+F-H2-292 1 fdggegcgffgfcccettgc
+F-H2-293 1 fdggegcggeffcccettgc
+F-H2-294 1 feggegcggeffcccettgc
+F-H2-295 1 dgcgeeffttgc
+F-H2-296 1 decgeeddttgc
+F-H2-297 1 ggcgeeffttgc
+F-H2-298 2 feggegcgefdfdceettgc
+F-H2-299 1 deggegcgefdfdceettgc
+F-H2-300 1 ceefcgttgc
+F-H2-301 1 deefcgttgc
+F-H2-302 1 cdefcgttgc
+F-H2-303 1 geegggcdcgttgc
+F-H2-304 1 ehegggcdcgttgc
+F-H2-305 1 edgfcgecgcttcc
+F-H2-306 1 egcggggeccddttgc
+F-H2-307 1 efggcgcddedbgcttec
+F-H2-308 1 ddggcgcddedbgcttec
+F-H2-309 1 cdggcgeggeccddttgc
+F-H2-310 1 dcggcgeggeccddttgc
+F-H2-311 1 deggcgcdgcttec
+F-H2-312 1 gdfccgecfdttgc
+F-H2-313 2 cdcgggddccbdttgc
+F-H2-314 2 dcffcgccddttgc
+F-H2-315 1 gecgeccettgc
+F-H2-316 1 decgeccettgc
+F-H2-317 1 hhgghgfgcgcegfcdddccgcttdc
+F-H2-318 1 edeecgdececdddttgc
+F-H2-319 1 gggfcgfeffeegettgc
+F-H2-320 1 ecfggecgeecdcegcttdc
+F-H2-321 1 ccfgegcgeegfeccdttgc
+F-H2-322 1 defgcgcdfedccettgc
+F-H2-323 1 befgcgcdfedccettgc
+F-H2-324 1 ffgfcgfdeettgc
+F-H2-325 1 cdfdcgdceettgc
+F-H2-326 1 fdfhefdgdfcgcceettgc
+F-H2-327 1 fefhefdgdfcgcceettgc
+F-H2-328 1 dccgffddcccdttgc
+F-H2-329 1 bdcgffddccgcttdc
+F-H2-330 1 bdhgcggghffgffgfheccgettgc
+F-H2-331 1 ecggcgcdcedcbeccddbcbdttgc
+F-H2-332 2 heegggefcgfedfdceettgc
+F-H2-333 2 gffggggecgccedttgc
+F-H2-334 2 ceggcgcdddccbdttgc
+F-H2-335 1 dccgggdefdddcdgcdbfcttec
+F-H2-336 1 bcggeggecgccdddbcdttgc
+F-H2-337 1 dbggfghfcgecffcccettgc
+F-H2-338 1 egfggecgeegcdceccbebttdb
+F-H2-339 1 ffcghghfgfheeegeeccdttgc
+F-H2-340 2 cdgefgeecgcegcttdc
+F-H2-341 2 fggggecgccedttgc
+F-H2-342 1 edggegcggefffdceccgcttfc
+F-H2-343 1 gdcdcgfcdeecfddcddccgcttdb
+F-H2-344 1 gecgfdgdfccddcgcebgbttfb
+F-H2-345 1 ghfggfcghehdgdhcfdgcttfc
+F-H2-346 1 cdfgcgeegettgc
+F-H2-347 1 fffgcgeegettgc
+F-H2-348 1 fhehegggeecgccgettgc
+F-H2-349 1 dhehegggeecgccgettgc
+F-H2-350 1 bccgggdecddddcgcdbectteb
+F-H2-351 2 egggeecgccgettgc
+F-H2-352 1 becgggeeddcebdgcccecttdb
+F-H2-353 1 decgggeeddcebdgcccecttdb
+F-H2-354 1 feggcgfddecddddcgcdbfcttec
+F-H2-355 1 eccdcgccdeebddttgc
+F-H2-356 1 ggcgeggfefdfcceettgc
+F-H2-357 1 fffggecgfeeeccfdttgc
+F-H2-358 1 fgggffcggedecdddccgcttec
+F-H2-359 1 fcggegcgffcedcedccddttgc
+F-H2-360 1 fhfgggcggfffttgc
+F-H2-361 1 efcggggffgffttgc
+F-H2-362 1 cecgffgeeefettgc
+F-H2-363 1 feegffcgeeefttgc
+F-H2-364 1 fdggfgcggegfccedttgc
+F-H2-365 1 edcgggfecdgcecdcttcc
+F-H2-366 1 edegggffcgdcceccddttgc
+F-H2-367 1 cedgcgcfdfttgc
+F-H2-368 1 hcgdcgfcfdttgc
+F-H2-369 1 ddggcgfddecdgcdbfcttec
+F-H2-370 1 bhchdhegcgdgdfttgc
+F-H2-371 1 dccgggdecddddbgcttec
+F-H2-372 1 fdcgcddeccddebgcdbecttfb
+F-H2-373 1 fcggegcgffgffegecccettgc
+F-H2-374 1 bcegggffcgfegffcgecccettgc
+F-H2-375 1 ddcgdcedcccdttgc
+F-H2-376 1 ffcgdcedcccdttgc
+F-H2-377 1 dfcfggcccgttgc
+F-H2-378 1 deggcgdggcttcc
+F-H2-379 1 dbggcgddeebdceccgcttec
+F-H2-380 2 gfggcgfgffccefttgc
+F-H2-381 2 gfeecgcdceccbdttgc
+F-H2-382 1 ccfggecgcdgcttdc
+F-H2-383 1 ccfggfcgcegcttdc
+F-H2-384 1 fdgfegeccgttgc
+F-H2-385 1 bffgcgcegettgc
+F-H2-386 2 dccgggcecdbeccddbcbdttgc
+F-H2-387 1 egcggggecdgcttdc
+F-H2-388 1 cccggggecdgcttdc
+F-H2-389 1 dcggegcgffceccddttgc
+F-H2-390 1 deggcgfdgccdfcttec
+F-H2-391 1 hfcggggffgffccefttgc
+F-H2-392 1 bfcgggdecdddccgcttdc
+F-H2-393 1 eeegcgefgfccdfttgc
+F-H2-394 1 cdcgffgcttcc
+F-H2-395 1 gecgffgcttcc
+F-H2-396 2 gffghecggdhdfdhcttgc
+F-H2-397 1 hdgegghccgccgcttec
+F-H2-398 1 hbgegghccgccgcttec
+F-H2-399 1 geegggffcgfegfcccettgc
+F-H2-400 1 dbcgggdefdgccdfcttec
+F-H2-401 1 deggegcgefdffehedceettgc
+F-H2-402 1 fgehefgggecgfeeecdfdttgc
+F-H2-403 2 efeggggecgfdffedceccgcttfc
+F-H2-404 1 ceddcgccbdbcgcttec
+F-H2-405 1 fggfcgcegcttdc
+F-H2-406 2 egdhchcgdgdfttgc
+F-H2-407 2 beggcgcdceccddbcbdttgc
+F-H2-408 1 fbcdcgccdeebdddbgcttec
+F-H2-409 1 ggcgfdgccdfcttec
+F-H2-410 1 gegdcgfchdttgc
+F-H2-411 1 chdgcgcfbfttgc
+F-H2-412 2 hchefggdcgfdhdttgc
+F-H2-413 2 fcgffghecggdhdfdhcttgc
+F-H2-414 1 cefggecgeegcttdc
+F-H2-415 1 fgdgegcgdfefttgc
+F-H2-416 1 edcggefefdgdttgc
+F-H2-417 1 fcfdcgcdgcttec
+F-H2-418 1 dbcgcddeccddebgcttec
+F-H2-419 1 ebggcgcddedcdddbgcttec
+F-H2-420 1 beggcgcddedcddbcgcdbectteb
+F-H2-421 1 dfchdhdgcgttgc
+F-H2-422 1 eeegcggfgcttcc
+F-H2-423 1 gdfgcggegcttcc
+F-H2-424 2 efegdgdfcgttgc
+F-H2-425 2 fceggggecgfdffcccettgc
+F-H2-426 1 fdcgddceccbdbcgcttec
+F-H2-427 1 dfcgddceccbdbcgcttec
+F-H2-428 1 ecggegeecgttgc
+F-H2-429 1 geggegeecgttgc
+F-H2-430 2 fhefdgdfcgcceettgc
+F-H2-431 1 ehegggeecgccgettgc
+F-H2-432 1 hhggghgffgedcgdcddcccdttgc
+F-H2-433 1 cfdhchbhegcgdgdfttgc
+F-H2-434 1 cfcgfcfdecgcgbhbttfb
+F-H2-435 2 cccgffddttgc
+F-H2-436 1 ecfhggegfgcgeegcttdc
+F-H2-437 1 fgcgeegfcdceccbdttgc
+F-H2-438 1 hffgggcgecffcccettgc
+F-H2-439 1 cdcggggeegddccgcttdc
+F-H2-440 2 dgdfcgcceettgc
+F-H2-441 1 gdfdcgcddeccddebgcdbecttfb
+F-H2-442 1 efdgdfcgcceettgc
+F-H2-443 2 bccgggcecdddccbdttgc
diff --git a/patterns/gnugo-db.el b/patterns/gnugo-db.el
new file mode 100644 (file)
index 0000000..2534046
--- /dev/null
@@ -0,0 +1,279 @@
+;; This file is distributed with GNU Go, a Go program.
+;;
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005. 2006
+;; 2007, 2008 and 2009 by the Free Software Foundation.
+;;
+;; This program is free software; you can redistribute it and/
+;; modify it under the terms of the GNU General Public License
+;; as published by the Free Software Foundation - version 3
+;; or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU General Public License in file COPYIN
+;; for more details.
+;;
+;; You should have received a copy of the GNU General Public
+;; License along with this program; if not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02111, USA.
+
+
+;; GNU Emacs mode for editing pattern database files.
+;;
+;; Put this file to emacs/site-lisp directory and add
+;;
+;;     (require 'gnugo-db)
+;;
+;; to your ~/.emacs file. If you want gnugo-db-mode to be selected
+;; automatically for every .db file, add these lines also:
+;;
+;;     (setq auto-mode-alist
+;;           (append
+;;            auto-mode-alist
+;;            '(("\\.db\\'" . gnugo-db-mode))))
+
+
+(defvar gnugo-db-mode-map nil)
+(unless gnugo-db-mode-map
+  (setq gnugo-db-mode-map (make-sparse-keymap))
+  (define-key gnugo-db-mode-map "\C-c\C-p" 'gnugo-db-insert-pattern)
+  (define-key gnugo-db-mode-map "\C-c\C-c"
+    'gnugo-db-copy-main-diagram-to-constraint))
+
+(defvar gnugo-db-mode-abbrev-table nil)
+(define-abbrev-table 'gnugo-db-mode-abbrev-table ())
+
+(defvar gnugo-db-mode-syntax-table nil)
+(unless gnugo-db-mode-syntax-table
+  (setq gnugo-db-mode-syntax-table (make-syntax-table))
+  (modify-syntax-entry ?\# "<" gnugo-db-mode-syntax-table)
+  (modify-syntax-entry ?\n ">#" gnugo-db-mode-syntax-table))
+
+(defvar gnugo-db-font-lock-keywords (list "Pattern"
+                                         "goal_elements"
+                                         "callback_data"
+                                         "attribute_map"))
+
+
+(defun gnugo-db-mode()
+  "Major mode for editing pattern database files."
+  (interactive)
+  (kill-all-local-variables)
+  (use-local-map gnugo-db-mode-map)
+  (setq local-abbrev-table gnugo-db-mode-abbrev-table)
+  (set-syntax-table gnugo-db-mode-syntax-table)
+  (set (make-local-variable 'paragraph-start) "Pattern")
+  (set (make-local-variable 'paragraph-separate) paragraph-start)
+  (set (make-local-variable 'comment-start) "# ")
+  (set (make-local-variable 'comment-end) "")
+  (set (make-local-variable 'comment-start-skip) "#+ *")
+  (setq font-lock-defaults '(gnugo-db-font-lock-keywords nil nil ((?_ . "w"))))
+  (set (make-local-variable 'indent-line-function) 'gnugo-db-indent-line)
+  (set (make-local-variable 'indent-region-function) 'gnugo-db-indent-region)
+  (setq mode-name "GNU Go pattern database")
+  (setq major-mode 'gnugo-db-mode))
+
+
+(defun gnugo-db-indent-line(&optional indenting-region)
+  "Indents a line of a constraint or main diagram line with comment."
+  (let ((return-point (point)))
+    (beginning-of-line)
+    (let ((line-beginning (point))
+         (first-char (char-after)))
+      (unless (= first-char ?\;)
+       (forward-line -1)
+       (when (= (char-after) ?\;)
+         (setq first-char ?\;)))
+
+      (let* ((column)
+            (indentation
+             (if (= first-char ?\;)
+                 (progn
+                   (while (and (= (char-after) ?\;)
+                               (= (forward-line -1) 0)))
+                   (let ((paren-stack ()))
+                     (while (search-forward-regexp "[][()]" line-beginning t)
+                       (let ((char (char-before)))
+                         (if (memq char '(?\( ?\[))
+                             (push (list char (current-column)) paren-stack)
+                           (let ((pop-paren (cond ((= char ?\)) ?\()
+                                                  ((= char ?\]) ?\[))))
+                             (while (not (= (car (pop paren-stack)) pop-paren))
+                               ())))))
+                     (goto-char line-beginning)
+                     (setq column (if paren-stack
+                                      (cadr (car paren-stack))
+                                    2)))
+                   (concat ";"
+                           (make-string (/ column tab-width) ?\t)
+                           (make-string (if (< column tab-width)
+                                            (1- column)
+                                          (% column tab-width))
+                                        ? )))
+
+               (goto-char line-beginning)
+               (if (memq first-char '(?- ?+ ?| ?. ?X ?O ?x ?o
+                                         ?, ?! ?* ?? ?Y ?Q))
+                   (progn
+                     (let ((diagram-width 0))
+                       (while (not (memq (char-after) '(?  ?\t ?\n nil)))
+                         (setq diagram-width (1+ diagram-width))
+                         (forward-char))
+                       (if (< diagram-width 8)
+                           (progn (setq column 12)
+                                  "\t    ")
+                         (setq column (+ diagram-width 4))
+                         "    ")))
+                 nil))))
+
+       (when indentation
+         (let ((indentation-point (point))
+               (indentation-length (length indentation))
+               (matched 0))
+           (while (and (< matched indentation-length)
+                       (eq (char-after) (aref indentation matched)))
+             (setq matched (1+ matched))
+             (forward-char))
+           (while (memq (char-after) '(?  ?\t))
+             (forward-char))
+           (unless (or (= (current-column) column)
+                       (and indenting-region (memq (char-after) '(?\n nil))))
+             (setq return-point (+ return-point
+                                   indentation-length
+                                   (- indentation-point (point))))
+             (delete-region (+ indentation-point matched) (point))
+             (when (< matched indentation-length)
+               (insert (substring indentation matched))))
+           (when (< return-point (point))
+             (setq return-point (point)))))))
+
+    (goto-char return-point)))
+
+
+(defun gnugo-db-indent-region(start end)
+  "Indents a region.  Indents in the same way as `gnugo-db-indent-line'."
+  (interactive "r")
+  (save-excursion
+    (setq end (copy-marker end))
+    (goto-char start)
+    (while (< (point) end)
+      (or (and (bolp) (eolp))
+         (gnugo-db-indent-line t))
+      (forward-line))
+    (move-marker end nil)))
+
+
+(defun gnugo-db-insert-pattern()
+  "Inserts a new pattern after the current one. Tries to pick up a
+suitable name by incrementing numeric part of the previous pattern
+name.
+
+This function heavily depends on correctness of the current pattern."
+  (interactive)
+  (let ((first-name "")
+       (middle-name "")
+       (last-name ""))
+    (end-of-line)
+    (if (re-search-backward "^Pattern " 0 t)
+       (progn
+         (forward-char 8)
+         (when (looking-at "\\([^0-9]+\\)\\([0-9]*\\)\\(.*\\)")
+           (setq first-name (match-string-no-properties 1)
+                 middle-name (match-string-no-properties 2)
+                 last-name (match-string-no-properties 3)))
+         (re-search-forward "^:" (1+ (buffer-size)) t)
+         (backward-char)
+         (forward-line 2)
+         (unless (memq (char-after) '(?\n ?  ?\t))
+           (re-search-forward "^[;>]" (1+ (buffer-size)) t)
+           (backward-char)
+           (while (looking-at "[;>]")
+             (forward-line))
+           (forward-line)
+           (when (looking-at "[;>]")
+             (while (looking-at "[;>]")
+               (forward-line))
+             (forward-line)))
+         (when (= (forward-line) 1)
+           (end-of-line)
+           (insert "\n")))
+      (re-search-forward "^Pattern " (1+ (buffer-size)) t)
+      (beginning-of-line))
+
+    (insert "Pattern \n")
+    (let ((move-to-point (1- (point))))
+      (unless (string= first-name "")
+       (let ((pattern-name
+              (if (string= last-name "")
+                  (concat first-name
+                          (number-to-string (1+ (string-to-number middle-name))))
+                (concat first-name middle-name
+                        (char-to-string (1+ (string-to-char last-name)))))))
+         (when (string= last-name "")
+           (when (save-excursion
+                   (re-search-forward "^Pattern " (1+ (buffer-size)) t)
+                   (or (looking-at pattern-name)
+                       (looking-at (concat first-name middle-name))))
+             (setq pattern-name (concat first-name middle-name "a"))))
+         (backward-char)
+         (insert pattern-name)
+         (forward-char)))
+      (insert "\n")
+      (unless (string= first-name "")
+       (setq move-to-point (point)))
+      (insert "\n\n:\n\n\n")
+      (goto-char move-to-point))))
+
+
+(defun gnugo-db-copy-main-diagram-to-constraint()
+  "Copies pattern diagram to constraint and inserts a dummy constraint line"
+  (interactive)
+  (let ((start-point (point)))
+    (end-of-line)
+    (unless (re-search-backward "^Pattern " 0 t)
+      (re-search-forward "^Pattern" (1+ (buffer-size)) t)
+      (beginning-of-line))
+
+    (forward-line)
+    (while (not (looking-at "[-+|.XOxo,!*?YQ]"))
+      (forward-line))
+
+    (let ((diagram-beginning (point)))
+      (while (looking-at "[-+|.XOxo,!*?YQ]")
+       (forward-line))
+
+      (let ((diagram (buffer-substring diagram-beginning  (point))))
+       (re-search-forward "^:" (1+ (buffer-size)) t)
+       (backward-char)
+       (forward-line)
+       (while (looking-at "#")
+         (forward-line))
+       (when (memq (char-after) '(?\n ?  ?\t))
+         (forward-line))
+
+       (when (looking-at "[-+|.XOxo,!*?YQ;>]")
+         (goto-char start-point)
+         (error "Pattern already seems to have a constraint"))
+
+       (let ((constraint-diagram-beginning (point)))
+         (insert diagram)
+         (let ((constraint-diagram-end (point)))
+           (goto-char constraint-diagram-beginning)
+           (while (not (= (point) constraint-diagram-end))
+             (while (not (memq (char-after) '(?\n ?  ?\t)))
+               (forward-char))
+             (unless (= (char-after) ?\n)
+               (let ((diagram-line-end (point)))
+                 (end-of-line)
+                 (setq constraint-diagram-end
+                       (- constraint-diagram-end (- (point) diagram-line-end)))
+                 (delete-region diagram-line-end (point))))
+             (forward-char))
+
+           (insert "\n; \n\n")
+           (goto-char constraint-diagram-beginning)))))))
+
+
+(provide 'gnugo-db)
diff --git a/patterns/gogo.db b/patterns/gogo.db
new file mode 100644 (file)
index 0000000..a532056
--- /dev/null
@@ -0,0 +1,1494 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JG1
+
+---------+
+.........|
+.........|
+....*.X..|
+.........|
+....O....|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JG2
+
+-------+
+.......|
+.......|
+..X.O..|
+.......|
+..X.*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG3
+
+---------+
+.........|
+.........|
+....O.X..|
+.........|
+....O.X..|
+.........|
+.....*...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JG4
+
+--------+
+........|
+........|
+...O.X..|
+........|
+...O.X..|
+........|
+....OX..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JG5
+
+-------+
+.......|
+.......|
+..X.O..|
+.......|
+..X....|
+....*..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG6
+# According to KJD, Q13 is an option too.  But I think Q13 is generally
+
+-------+
+.......|
+....*..|
+..O.X..|
+.......|
+..O....|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JG7
+
+------+
+......|
+...X*.|
+.X.O..|
+......|
+.X....|
+...O..|
+......|
+
+:8,sFU
+
+
+Pattern JG8
+
+------+
+......|
+...OX.|
+.O.X..|
+...*..|
+.O....|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JG9
+
+------+
+......|
+...XO.|
+.X*O..|
+...X..|
+.X....|
+...O..|
+......|
+
+:8,sFU
+
+
+Pattern JG10
+
+------+
+......|
+...OX.|
+.OXX..|
+..*O..|
+.O....|
+...X..|
+
+:8,sFU
+
+
+Pattern JG11
+
+------+
+......|
+...XO.|
+.XOO..|
+..XX*.|
+.X....|
+...O..|
+
+:8,sFU
+
+
+Pattern JG12
+
+------+
+......|
+..*OX.|
+.OXX..|
+..OOX.|
+.O....|
+...X..|
+
+:8,sFJ
+
+
+Pattern JG13
+
+------+
+......|
+..XXO.|
+.XOO*.|
+..XXO.|
+.X....|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JG14
+
+--------+
+........|
+....OOX.|
+...OXXX.|
+....OOX.|
+...O....|
+.....X..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JG15
+
+-------+
+.......|
+...*...|
+...XO..|
+.......|
+..X....|
+.......|
+
+:8,sFJ
+
+
+Pattern JG16
+# Is it urgent enough?  /pp
+
+-------+
+.......|
+...X...|
+...OX..|
+....*..|
+..O....|
+.......|
+
+:8,sFU
+
+
+Pattern JG17
+
+-------+
+.......|
+...O...|
+..*XO..|
+....X..|
+..X....|
+.......|
+
+:8,sFU
+
+
+Pattern JG18
+
+-------+
+.......|
+...X...|
+..XOX..|
+...*O..|
+..O....|
+.......|
+
+:8,sFU
+
+
+Pattern JG19
+
+------+
+......|
+..O.*.|
+.OXO..|
+..XX..|
+.X....|
+......|
+
+:8,sFU
+
+
+Pattern JG20
+
+-------+
+.......|
+...X.X.|
+..XOX*.|
+...OO..|
+..O....|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG21
+
+------+
+......|
+..O*O.|
+.OXOX.|
+..XX..|
+.X....|
+......|
+
+:8,sFU
+
+
+Pattern JG22
+
+--------+
+........|
+....XXX.|
+..*XOXO.|
+....OO..|
+...O....|
+........|
+
+:8,sFJ
+
+
+Pattern JG23
+
+------+
+......|
+......|
+......|
+..X...|
+.O*...|
+......|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG24
+
+--------+
+........|
+........|
+........|
+....O*..|
+...XX...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JG25
+
+-------+
+.......|
+.......|
+.......|
+...XX..|
+..OO*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG26
+
+-------+
+.......|
+.......|
+.......|
+..*OO..|
+..XXX..|
+.......|
+
+:8,sFJ
+
+
+Pattern JG27
+
+---------+
+.........|
+.........|
+.........|
+...*XXX..|
+....OOO..|
+.........|
+
+:8,sFJ
+
+
+Pattern JG28
+
+-------+
+.......|
+.......|
+.*.....|
+.XOOO..|
+..XXX..|
+.......|
+
+:8,sFJ
+
+
+Pattern JG29
+
+---------+
+.........|
+.........|
+..*X.....|
+...OXXX..|
+....OOO..|
+.........|
+
+:8,sFJ
+
+
+Pattern JG30
+
+--------+
+........|
+..*.....|
+.XO.....|
+..XOOO..|
+...XXX..|
+........|
+
+:8,sFJ
+
+
+Pattern JG31
+
+--------+
+........|
+.*X.....|
+.OX.....|
+..OXXX..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG32
+
+--------+
+........|
+.XO.*...|
+.XO.....|
+..XOOO..|
+...XXX..|
+........|
+
+:8,sFJ
+
+
+Pattern JG33
+
+--------+
+........|
+.OX.X...|
+.OX.....|
+.*OXXX..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG34
+
+--------+
+........|
+........|
+..*.....|
+....OO..|
+...XXX..|
+........|
+
+:8,sFJ
+
+
+Pattern JG35
+
+--------+
+........|
+........|
+..X*....|
+....XX..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG36
+
+-------+
+.......|
+.......|
+.OX....|
+..*OO..|
+..XXX..|
+.......|
+
+:8,sFJ
+
+
+Pattern JG37
+
+--------+
+........|
+........|
+..XO....|
+..*XXX..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG38
+
+-------+
+.......|
+..*....|
+.OX....|
+.XOOO..|
+..XXX..|
+.......|
+
+:8,sFJ
+
+
+Pattern JG39
+
+--------+
+........|
+...X....|
+.*XO....|
+..OXXX..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG40
+
+--------+
+........|
+..*O....|
+.XOX....|
+..XOOO..|
+...XXX..|
+........|
+
+:8,sFU
+
+
+Pattern JG41
+
+--------+
+........|
+..XX....|
+.OXO....|
+.*OXXX..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG42
+# This empasizes the top, hence larger area.  /pp
+
+----------+
+..........|
+..........|
+....OX....|
+...*XOOO..|
+.....XXX..|
+..........|
+
+:8,sFJ
+
+
+Pattern JG43
+
+--------+
+........|
+........|
+..XO....|
+.XOXXX..|
+..*OOO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JG44
+
+---------+
+.........|
+.........|
+..*OX....|
+..OXOOO..|
+...XXXX..|
+.........|
+
+:8,sFJ
+
+
+Pattern JG45
+
+--------+
+........|
+........|
+.XXO....|
+.XOXXX*.|
+..OOOO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JG46
+
+-------+
+.......|
+...*...|
+OOX....|
+OXOOOX.|
+.XXXX..|
+
+:8,sFJ
+
+
+Pattern JG47
+# Tesuji.
+
+-------+
+.......|
+...X*..|
+XXO....|
+XOXXXO.|
+.OOOO..|
+
+:8,sFJ
+
+
+Pattern JG48
+
+-------+
+.......|
+...OX..|
+OOX*...|
+OXOOOX.|
+.XXXX..|
+
+:8,sFJ
+
+
+Pattern JG49
+
+-------+
+.......|
+...XO..|
+XXOX*..|
+XOXXXO.|
+.OOOO..|
+
+:8,sFJ
+
+
+Pattern JG50
+
+-------+
+.......|
+..*OX..|
+OOXOX..|
+OXOOOX.|
+.XXXX..|
+
+:8,sFJ
+
+
+Pattern JG51
+
+------+
+......|
+......|
+......|
+..X...|
+.OOX..|
+...*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG52
+
+------+
+......|
+......|
+......|
+..O*..|
+.XXO..|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JG53
+
+------+
+......|
+......|
+......|
+.*XX..|
+.OOX..|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JG54
+
+------+
+......|
+......|
+......|
+.XOO..|
+.XXO..|
+...X*.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG55
+
+------+
+......|
+......|
+......|
+.OXX..|
+.OOX..|
+...OX.|
+...*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG56
+
+------+
+......|
+......|
+......|
+.XOO..|
+.XXO..|
+...XO.|
+...X*.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG57
+
+-------+
+.......|
+.......|
+.......|
+..OXX..|
+..OOX..|
+....OX.|
+....OX.|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG58
+# I think so.  /pp
+
+-------+
+.......|
+..*....|
+.......|
+..XOO..|
+..XXO..|
+....XO.|
+....XO.|
+....X..|
+
+:8,sFj
+
+
+Pattern JG59
+
+--------+
+........|
+...X....|
+...*....|
+...OXX..|
+...OOX..|
+.....OX.|
+.....OX.|
+.....O..|
+
+:8,sFJ
+
+
+Pattern JG60
+
+-------+
+.......|
+..O*...|
+..X....|
+..XOO..|
+..XXO..|
+
+:8,sFJ
+
+
+Pattern JG61
+
+---------+
+.........|
+....XX...|
+..*.O....|
+....OXX..|
+....OOX..|
+......OX.|
+......OX.|
+......O..|
+
+:8,sFj
+
+
+Pattern JG62
+
+---------+
+.........|
+.........|
+....*....|
+.....O...|
+....XX...|
+.........|
+
+:8,sFJ
+
+
+Pattern JG63
+
+-------+
+.......|
+.......|
+..X....|
+...X...|
+..OO*..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG64
+
+---------+
+.........|
+.........|
+..*.O....|
+.....O...|
+....XXX..|
+.........|
+
+:8,sFJ
+
+
+Pattern JG65
+
+--------+
+........|
+........|
+.X.X.*..|
+....X...|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG66
+
+-----------+
+...........|
+...........|
+.*..O.O.X..|
+.......O...|
+......XXX..|
+
+:8,sFJ
+
+
+Pattern JG67
+
+-------+
+.......|
+.......|
+..X....|
+...X*..|
+..OO...|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG68
+
+-------+
+.......|
+.......|
+..O.*..|
+...OX..|
+..XX...|
+.......|
+
+:8,sFJ
+
+
+Pattern JG69
+
+------+
+......|
+......|
+.X.X..|
+..XO..|
+.OO*..|
+......|
+
+:8,sFU
+
+
+Pattern JG70
+
+------+
+......|
+......|
+.O.O*.|
+..OX..|
+.XXX..|
+......|
+
+:8,sFJ
+
+
+Pattern JG71
+
+-------+
+.......|
+.......|
+.*X.XX.|
+...XO..|
+..OOO..|
+.......|
+
+:8,sFJ
+
+
+Pattern JG72
+
+-------+
+.......|
+.*.....|
+.XO.OO.|
+...OX..|
+..XXX..|
+
+:8,sFJ
+
+
+Pattern JG73
+
+-------+
+.......|
+.X.....|
+.OX.XX.|
+..*XO..|
+..OOO..|
+
+:8,sFJ
+
+
+Pattern JG74
+
+-------+
+.......|
+.O.....|
+.XO*OO.|
+..XOX..|
+..XXX..|
+
+:8,sFU
+
+
+Pattern JG75
+
+--------+
+........|
+..X.....|
+.*OXXXX.|
+...OXO..|
+...OOO..|
+........|
+
+:8,sFJ
+
+
+Pattern JG76
+
+---------+
+.........|
+..*O.....|
+..XXOOOO.|
+....XOX..|
+....XXX..|
+
+:8,sFJ
+
+
+Pattern JG77
+
+---------+
+.........|
+..XX.....|
+.*OOXXXX.|
+....OXO..|
+....OOO..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JG78
+# According to KJD, this emphasizes top despite the way it 
+
+--------+
+........|
+........|
+........|
+.....X..|
+...O.*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JG79
+
+-------+
+.......|
+.......|
+.......|
+....O..|
+..X.X*.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JG80
+# I think so.  /pp
+
+------+
+......|
+......|
+......|
+...X..|
+.O*OX.|
+......|
+
+:8,sFU
+
+
+Pattern JG81
+
+------+
+......|
+......|
+......|
+...O..|
+.XXXO.|
+....*.|
+......|
+
+:8,sFU
+
+
+Pattern JG82
+
+--------+
+........|
+........|
+...*....|
+.....X..|
+...OOOX.|
+......X.|
+
+:8,sFJ
+
+
+Pattern JG83
+
+------+
+......|
+......|
+.X*...|
+...O..|
+.XXXO.|
+....O.|
+
+:8,sFJ
+
+
+Pattern JG84
+
+------+
+......|
+.*....|
+.OX...|
+...X..|
+.OOOX.|
+....X.|
+
+:8,sFJ
+
+
+Pattern JG85
+# Bad.
+
+-----+
+.....|
+.....|
+.....|
+..O..|
+XXXO.|
+..*..|
+.....|
+.....|
+
+:8,sFN
+
+
+Pattern JG86
+
+-----+
+.....|
+.....|
+.....|
+..X..|
+OOOX.|
+..X*.|
+.....|
+.....|
+
+:8,sFJ
+
+
+Pattern JG87
+# Bad too.
+
+-----+
+.....|
+.....|
+.....|
+..X*.|
+OOOX.|
+..X..|
+.....|
+.....|
+
+:8,sFN
+
+
+Pattern JG88
+
+------+
+......|
+......|
+....*.|
+...OX.|
+.XXXO.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JG89
+
+--------+
+........|
+........|
+....*...|
+.....X..|
+...O....|
+........|
+
+:8,sFJ
+
+
+Pattern JG90
+
+------+
+......|
+......|
+..X*..|
+...O..|
+.X....|
+......|
+
+:8,sFJ
+
+
+Pattern JG91
+
+-------+
+.......|
+.......|
+...OX..|
+....X..|
+..O....|
+...*...|
+.......|
+
+:8,sFJ
+
+
+Pattern JG92
+
+-------+
+.......|
+.......|
+...XO..|
+...*O..|
+..X....|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JG93
+
+------+
+......|
+......|
+..OX..|
+.*XX..|
+.O....|
+..O...|
+......|
+
+:8,sFU
+
+
+Pattern JG94
+
+-------+
+.......|
+.......|
+..*XO..|
+..XOO..|
+..X....|
+...X...|
+
+:8,sFJ
+
+
+Pattern JG95
+
+-------+
+.......|
+.......|
+.*XOX..|
+..OXX..|
+..O....|
+...O...|
+
+:8,sFU
+
+
+Pattern JG96
+
+-------+
+.......|
+...*...|
+.XOXO..|
+..XOO..|
+..X....|
+...X...|
+
+:8,sFJ
+
+
+Pattern JG97
+
+-------+
+.......|
+..*X...|
+.OX.X..|
+..OXX..|
+..O....|
+...O...|
+
+:8,sFJ
+
+
+Pattern JG98
+
+-------+
+.......|
+..XO...|
+.XO.O..|
+..XOO..|
+..X....|
+...X.*.|
+.......|
+
+:8,sFJ
+
+
+Pattern JG99
+# A trick to avoid ko.  I think it's better for GNU Go.  /pp
+
+-------+
+.......|
+..*....|
+...XO..|
+..XOO..|
+..X....|
+...X...|
+
+:8,sFJ-,shape(1)
+
+
+Pattern JG100
+
+-------+
+.......|
+..X....|
+..*OX..|
+..OXX..|
+..O....|
+...O...|
+
+:8,sFJ
+
+
+Pattern JG101
+
+------+
+......|
+.O*...|
+.XXO..|
+.XOO..|
+.X....|
+..X...|
+
+:8,sFJ
+
+
+Pattern JG102
+
+-------+
+.......|
+.*XX...|
+..OOX..|
+..OXX..|
+..O....|
+...O...|
+
+:8,sFJ
+
+
+Pattern JG103
+
+-------+
+.......|
+.XOO...|
+..XXO..|
+..XOO..|
+..X....|
+...X.*.|
+.......|
+
+:8,sFJ
+
+
+Pattern JG104
+
+------+
+......|
+......|
+..XO..|
+...O..|
+.X....|
+..X.*.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG105
+
+--------+
+........|
+....*...|
+....OX..|
+.....X..|
+...O....|
+....O.X.|
+........|
+
+:8,sFJ
+
+
+Pattern JG106
+
+------+
+......|
+..X...|
+..XO..|
+...O..|
+.X....|
+..X.O.|
+...*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JG107
+
+----------+
+..........|
+......O...|
+.*....OX..|
+.......X..|
+.....O....|
+......O.X.|
+.......X..|
+..........|
+
+:8,sFJ
+
+
diff --git a/patterns/gogo.sgf b/patterns/gogo.sgf
new file mode 100644 (file)
index 0000000..8c74161
--- /dev/null
@@ -0,0 +1,106 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by the Free Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation - version 3 or
+at your option any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19];B[oe]
+(;W[qc]N[San-san invasion]
+(;B[oc]MA[kg]
+(;W[qe]MA[mg];B[pg]MA[ki];W[qg];B[ph]MA[li])
+
+(;W[qf]MA[mi];B[qb]
+C[S
+# According to KJD, Q13 is an option too.  But I think Q13 is generally
+ too cosmic for GNU Go.  /pp]
+MA[mg];W[rb]C[U]MA[ng];B[qd]MA[ng];W[pc]C[U]MA[ng];B[pd]C[U]MA[nf];
+W[rd]C[U]MA[nf];B[pb]MA[nf];W[rc]MA[ng];B[pg]MA[lh])
+)
+
+(;B[pc]C[# Looks risky for GNU Go.  /pp];W[pb]MA[mf];B[qd]
+C[U
+# Is it urgent enough?  /pp]MA[mf];W[oc]C[U]MA[mf];B[pd]C[U]MA[mf]
+;W[rb]C[U]MA[nf];B[rc]MA[mg];W[qb]C[U]MA[nf];B[nc]MA[lf])
+)
+
+(;W[pd]N[Hoshi invasion];B[pe]MA[nh]
+(;W[qd]MA[lg];B[qe]MA[mg]
+(;W[od]MA[mf];B[nd]MA[kf];W[nc]MA[mf];B[mc]MA[kf];W[nb]MA[lf];B[mb]
+MA[lf];W[pb]MA[lf];B[md]MA[lf])
+
+(;W[nc]MA[lf];B[oc]MA[lf];W[od]MA[mf];B[nd]MA[lf]
+(;W[ob]MA[mf];B[mc]MA[lf];W[nb]C[U]MA[lf];B[md]MA[lf])
+
+(;W[md]C[# This empasizes the top, hence larger area.  /pp]MA[jf];
+B[ne]MA[lg];W[mc]MA[kf];B[rd]MA[lg];W[pb]MA[me];B[qb]C[# Tesuji.]
+MA[me];W[pc]MA[me];B[qc]MA[me];W[ob]MA[me])
+)
+)
+
+(;W[qe]C[# Looks risky for GNU Go.  /pp];B[qf]MA[nh];W[qd]MA[ng];B[od]
+MA[ng];W[rf]MA[nh];B[qg]MA[ni];W[rg]MA[ni];B[qh]MA[mj];W[ob]
+C[j
+# I think so.  /pp]MA[mh];B[oc]MA[lh];W[pb]MA[me];B[mc]C[j]MA[kh])
+
+(;W[oc]MA[kf]
+(;B[qe]MA[mh];W[mc]MA[kf];B[qc]MA[lf];W[jc]MA[ie])
+
+(;B[qd]MA[mh];W[qc]MA[mf];B[qe]C[U]MA[nf];W[rc]MA[nf];B[nc]MA[mf];
+W[nb]MA[me];B[od]MA[me];W[pc]C[U]MA[me];B[mc]MA[lf];W[mb]MA[ke];B[lc]
+MA[kg])
+)
+)
+
+(;W[qd]N[Komoku invasion]
+(;B[qe]
+C[# According to KJD, this emphasizes top despite the way it 
+looks.  /pp]
+MA[lg];W[re]MA[mg]
+(;B[pe]C[U
+# I think so.  /pp]MA[nf]
+(;W[rf]C[U]MA[ng];B[oc]MA[lf];W[pc]MA[nf];B[ob]MA[nf])
+
+(;W[qf]C[0
+# Bad.]MA[oh]
+(;B[rf]MA[oh];W[rg];B[rd];W[sf];B[qc])
+
+(;B[rd]C[0
+# Bad too.]MA[oh];W[rc]MA[ng];B[rf];W[sd];B[qg];W[oc])
+)
+)
+
+(;B[rf]C[0
+# Mistake.];W[pe];B[qf];W[pd];B[pf];W[od])
+)
+
+(;B[pc]MA[lf];W[qc]MA[nf];B[pf]MA[mg]
+(;W[pd]MA[mg];B[od]C[U]MA[ng]
+(;W[oc]MA[mf];B[nc]C[U]MA[mf];W[pb]MA[mf];B[ob]MA[mf];W[rf]MA[mg])
+
+(;W[ob]
+C[:-,shape(1)
+# A trick to avoid ko.  I think it's better for GNU Go.  /pp]
+MA[mf];B[oc]MA[mf];W[pb]MA[nf];B[nb]MA[mf];W[rf]MA[mg];B[mc];W[qg])
+)
+
+(;W[rf]MA[nh];B[pb]MA[lg];W[qg]MA[ni];B[kc]MA[jh])
+)
+)
+
+)
diff --git a/patterns/handicap.db b/patterns/handicap.db
new file mode 100644 (file)
index 0000000..cf42ac1
--- /dev/null
@@ -0,0 +1,916 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The General Fuseki Pattern Database, fuseki.db
+#
+#  Further documentation may be found in the Texinfo documentation
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#  !     : additional stones to be placed on the board (together with *)
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  After the pattern, some supplementary information in the format:
+#
+# :trfno, classification, [values], helper_function
+#   
+#  These and other aspects of the pattern database are documented
+#  in the Texinfo documentation.
+#
+#################
+#
+#  Any line beginning with #, or any part of a line following
+#  whitespace is a comment. 
+#
+#  This database has the special property that there are stones
+#  temporarily added at the very corners of the board when
+#  called. This allows us to use pattern matching for the first real
+#  stones in an empty corner but also means that the extreme corner
+#  stones must be included in all corner patterns.
+#
+#  There are no meaningful classifications that can be used in this
+#  database. All patterns need to have a specified value, which is
+#  related to the probability that the pattern will be used. Basically
+#  a pattern which has a value being N higher than another pattern is
+#  2^N times more probable to be chosen. Additionally there are some
+#  cutoffs involved, see engine/handicap.c for details.
+
+
+attribute_map value_only
+
+goal_elements none
+callback_data !
+
+
+Pattern H1
+
+|.....       4-4 in empty corner
+|...*.
+|.....
+|.....
+|O....
++-----
+
+:/,-,value(25)
+
+
+Pattern H2
+
+|....        3-3 in empty corner
+|..*.
+|....
+|O...
++----
+
+:/,-,value(23)
+
+
+Pattern H3
+
+|.....       3-4 in empty corner
+|...*.
+|.....
+|O....
++-----
+
+:8,-,value(24)
+
+
+Pattern H4
+
+|.....
+|...*.       5-4 in empty corner
+|.....
+|.....
+|.....
+|O....
++-----
+
+:8,-,value(23)
+
+
+Pattern H5
+
+|.....
+|..*..       5-3 in empty corner
+|.....
+|.....
+|.....
+|O....
++-----
+
+:8,-,value(23)
+
+
+Pattern H6
+
+|......
+|....*.      5-5 in empty corner
+|......
+|......
+|......
+|O.....
++------
+
+:8,-,value(18)
+
+
+Pattern H7
+
+|......
+|...*..      ponnuki in corner
+|..!.!.
+|...!..
+|......
+|O.....
++------
+
+:8,-,value(23)
+
+|......
+|...*..
+|..!.!.
+|...!..
+|......
+|O.....
++------
+
+;remaining_handicap_stones() > 20
+
+
+Pattern H10
+
+|.....
+|..*..       shimari
+|.....
+|...O.
+|.....
+|O....
++-----
+
+:8,-,value(21)
+
+
+Pattern H11
+
+|.....
+|...*.       shimari
+|.....
+|...O.
+|.....
+|O....
++-----
+
+:8,-,value(21)
+
+
+Pattern H12
+
+|.....
+|..*..
+|.....       shimari
+|.....
+|...O.
+|.....
+|O....
++-----
+
+:8,-,value(19)
+
+
+Pattern H13
+
+|.....
+|...*.
+|.....       shimari
+|.....
+|...O.
+|.....
+|O....
++-----
+
+:8,-,value(19)
+
+
+Pattern H14
+
+|.....
+|..O..       shimari
+|.....
+|...*.
+|.....
+|O....
++-----
+
+:8,-,value(21)
+
+
+Pattern H15
+
+|.....
+|..O..       shimari
+|.....
+|..*..
+|.....
+|O....
++-----
+
+:8,-,value(18)
+
+
+Pattern H16
+
+|.....
+|...O.       shimari
+|.....
+|...*.
+|.....
+|O....
++-----
+
+:8,-,value(21)
+
+
+Pattern H17
+
+|.....
+|...O.       shimari
+|.....
+|..*..
+|.....
+|O....
++-----
+
+:8,-,value(18)
+
+
+Pattern H18
+
+|......
+|...*..              shimari
+|......
+|..O...
+|......
+|O.....
++------
+
+:8,-,value(18)
+
+
+Pattern H19
+
+|......
+|...*..
+|......              shimari
+|......
+|..O...
+|......
+|O.....
++------
+
+:8,-,value(19)
+
+
+Pattern H20
+
+|......
+|...*..
+|......              shimari
+|...O..
+|......
+|......
+|O.....
++------
+
+:8,-,value(19)
+
+
+Pattern H21
+
+|......
+|..*...
+|......              shimari
+|...O..
+|......
+|......
+|O.....
++------
+
+:8,-,value(19)
+
+
+Pattern H22
+
+|......
+|..O.*.              make shimari extra strong
+|......
+|...O..
+|......
+|O.....
++------
+
+:8,-,value(12)
+
+
+Pattern H23
+
+|......
+|..O...
+|......              close corner
+|...O..
+|...*..
+|......
+|O.....
++------
+
+:8,-,value(11)
+
+
+Pattern H24
+
+|......
+|...O..
+|......              close corner
+|...O..
+|..*...
+|......
+|O.....
++------
+
+:8,-,value(11)
+
+
+Pattern H30
+
+|...................|    san-ren-sei
+|...O.....*.....O...|
+|...................|
+|...................|
+|O.................O|
++-------------------+
+
+:8,-,value(22)
+
+
+Pattern H31
+
+|...................|    low chinese
+|..O............O...|
+|........*..........|
+|...................|
+|O.................O|
++-------------------+
+
+:8,-,value(24)
+
+
+Pattern H32
+
+|...................|    high chinese
+|..O.....*......O...|
+|...................|
+|...................|
+|O.................O|
++-------------------+
+
+:8,-,value(24)
+
+
+Pattern H40
+
+|............    extend from shimari
+|..oo........
+|.........*..
+|..oo........
+|............
+|O...........
++------------
+
+:8,-,value(20)
+
+|............
+|..ab........
+|.........*..
+|..cd........
+|............
+|O...........
++------------
+
+;o_somewhere(a,b) && o_somewhere(c,d)
+
+
+Pattern H41
+
+|............    extend from shimari
+|..oo........
+|............
+|..oo.....*..
+|............
+|O...........
++------------
+
+:8,-,value(20)
+
+|............
+|..ab........
+|............
+|..cd.....*..
+|............
+|O...........
++------------
+
+;o_somewhere(a,b) && o_somewhere(c,d)
+
+
+Pattern H42
+
+|............    extend from shimari
+|............
+|..o......*..
+|..o.O.......
+|............
+|O...........
++------------
+
+:8,-,value(17)
+
+|............
+|............
+|..a......*..
+|..b.O.......
+|............
+|O...........
++------------
+
+;o_somewhere(a,b)
+
+
+Pattern H43
+
+|............    extend from shimari
+|............
+|..o.O.......
+|..o......*..
+|............
+|O...........
++------------
+
+:8,-,value(17)
+
+|............
+|............
+|..a.O.......
+|..b......*..
+|............
+|O...........
++------------
+
+;o_somewhere(a,b)
+
+
+Pattern H44
+
+|..oo........    extend from hoshi
+|............
+|...O........
+|.........*..
+|............
+|O...........
++------------
+
+:8,-,value(17)
+
+
+Pattern H45
+
+|..oo........    extend from hoshi
+|............
+|...O.....*..
+|............
+|............
+|O...........
++------------
+
+:8,-,value(17)
+
+
+Pattern H50
+
+|..oooo........     early edge move
+|..ooo....*....
+|..............
+|O.............
++--------------
+
+:8,-,value(16)
+
+
+Pattern H51
+
+|..oooo........
+|..ooo....*....     early edge move
+|..oooo........
+|..............
+|O.............
++--------------
+
+:8,-,value(16)
+
+
+Pattern H52
+
+|..ooo........
+|..ooo....O...     iron pillar
+|..ooo....*...
+|.............
+|O............
++-------------
+
+:8,-,value(12)
+
+
+Pattern H53
+
+|..ooo....*...
+|..ooo........     jump
+|..ooo....O...
+|.............
+|O............
++-------------
+
+:8,-,value(12)
+
+
+Pattern H60
+
+|..............
+|..............
+|..............
+|..ooo.........
+|..ooo....*....     early center move
+|..ooo.........
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+:/,-,value(14)
+
+
+Pattern H61
+
+|..............
+|..............
+|..............
+|..ooo.........
+|..ooo....*....     early center move
+|..ooo.........
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+:/,-,value(19)
+
+|..............
+|..............
+|..............
+|..ooo.........
+|..ooo....*....
+|..ooo.........
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+;remaining_handicap_stones() > 4
+
+
+Pattern H62
+
+|..............
+|..............
+|..............
+|..ooo.........
+|..ooo...*.!...     early center formation
+|..ooo.........
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+:8,-,value(19)
+
+|..............
+|..............
+|..............
+|..ooo.........
+|..ooo...*.!...
+|..ooo.........
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+;remaining_handicap_stones() > 9
+
+
+Pattern H63
+
+|..............
+|..............
+|..............
+|..ooo....!....
+|..ooo...*.!...     early center ponnuki
+|..ooo....!....
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+:8,-,value(19)
+
+|..............
+|..............
+|..............
+|..ooo....!....
+|..ooo...*.!...
+|..ooo....!....
+|..............
+|..............
+|..............
+|..ooo...ooo...
+|..ooo...ooo...
+|..ooo...ooo...
+|..............
+|O.............
++--------------
+
+;total_handicap_stones() > 18
+
+
+Pattern H70
+
++-------------------+
+|O.................O|    special influence oriented pattern
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|...................|
+|...................|
+|...................|
+|...!.....*.....!...|
+|...................|
+|...................|
+|...................|
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|O.................O|
++-------------------+
+
+:8,-,value(19)
+
++-------------------+
+|O.................O|
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|...................|
+|...................|
+|...................|
+|...!.....*.....!...|
+|...................|
+|...................|
+|...................|
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|O.................O|
++-------------------+
+
+;total_handicap_stones() >= 5
+
+
+Pattern H71
+
++-------------------+
+|O.................O|    great wall!
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|..........!........|
+|...................|
+|...................|
+|.........*.........|
+|...................|
+|...................|
+|........!..........|
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|O.................O|
++-------------------+
+
+:8,-,value(19)
+
++-------------------+
+|O.................O|
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|..........!........|
+|...................|
+|...................|
+|.........*.........|
+|...................|
+|...................|
+|........!..........|
+|...................|
+|...................|
+|.........!.........|
+|...................|
+|...................|
+|O.................O|
++-------------------+
+
+;total_handicap_stones() >= 5
+
+
+Pattern H80
+
+......
+...O..     strengthen connection
+O.....
+...*..
+.....o
+....oo
+
+:8,-,value(8)
+
+
+Pattern H81
+
+....oo
+......
+O.....     jump out
+...*..
+O.....
+......
+....oo
+
+:8,-,value(8)
+
+
+Pattern H82
+
+....oo
+O...oo     jump out
+......
+O..*..
+......
+....oo
+
+:8,-,value(8)
+
+
+Pattern H83
+
+....oo
+.....o
+O.....     jump out
+O..*..
+......
+....oo
+
+:8,-,value(8)
+
+
+Pattern H84
+
+o...oo     one space jump
+......
+O.*...
+......
+o...oo
+
+:8,-,value(5)
+
+
+Pattern H85
+
+......     strengthen
+......
+..O*..
+......
+......
+
+:8,-,value(5)
+
+
+Pattern H86
+
+o..o       one space jump
+....
+O.*.
+....
+o..o
+
+:8,-,value(1)
+
+
+Pattern H87
+
+...o       strengthen
+....
+.O*.
+....
+...o
+
+:8,-,value(1)
+
+
+# END OF FILE
diff --git a/patterns/helpers.c b/patterns/helpers.c
new file mode 100644 (file)
index 0000000..e08238c
--- /dev/null
@@ -0,0 +1,889 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include "liberty.h"
+#include "patterns.h"
+
+
+#define TRYMOVE(pos, color) trymove(pos, color, "helper", NO_MOVE)
+#define OFFSET_BY(x, y) AFFINE_TRANSFORM(OFFSET(x, y), trans, move)
+#define ARGS struct pattern *pattern, int trans, int move, int color
+
+
+/* This file contains helper functions which assist the pattern matcher.
+ * They are invoked with (move) = the position on the board marked with '*'.
+ * They are invoked with color = WHITE or BLACK: any pieces on the
+ * board marked with 'O' in the pattern will always contain color,
+ * and 'X's contain OTHER_COLOR(color)
+ *
+ * The helper must return 0 if the pattern is rejected and 1 otherwise.
+ */
+
+
+
+
+/* Jump out into nothingness. To avoid jumping into our own territory,
+ * we use the "area" measure. Also we never ever jump into our own
+ * established eyespace.
+ */
+
+int 
+jump_out_helper(ARGS)
+{
+  int own_eyespace;
+
+  UNUSED(trans); UNUSED(pattern);
+
+  own_eyespace = (white_eye[move].color == color);
+  
+  if (whose_area(OPPOSITE_INFLUENCE(color), move) != color && !own_eyespace)
+    return 1;
+  else
+    return 0;
+}
+
+
+/* Make a long jump into nothingness. Since these jumps are not
+ * securely connected we don't use them to jump into the opponent's
+ * zone of control.
+ */
+
+int 
+jump_out_far_helper(ARGS)
+{
+  if (whose_area(OPPOSITE_INFLUENCE(color), move) != OTHER_COLOR(color))
+    return jump_out_helper(pattern, trans, move, color);
+  else
+    return 0;
+}
+
+
+/* Active until the opponent has played his first stone.
+ */
+
+int
+high_handicap_helper(ARGS)
+{
+  UNUSED(trans); UNUSED(pattern); UNUSED(move);
+  
+  return !doing_scoring && stones_on_board(OTHER_COLOR(color)) == 0;
+}
+
+
+/* Active when the opponent is thought to be everywhere dead. This
+ * typically happens early in high handicap games on small boards.
+ * This helper is used by patterns intended to reinforce possible
+ * weaknesses in the position.
+ */
+
+int
+reinforce_helper(ARGS)
+{
+  UNUSED(trans); UNUSED(pattern);
+  
+  return (!doing_scoring
+         && !lively_dragon_exists(OTHER_COLOR(color)) 
+         && safe_move(move, color));
+}
+
+
+/*
+ *  
+ *  XXO      XXc            decrease eye space in sente (unless it kills)
+ *  .*X      e*a
+ *  ---      ---
+ *
+ * or
+ *
+ *  XXO      XXc            decrease eye space in sente (unless it kills)
+ *  .*X      e*a
+ *  XXO      XXd
+ *
+ * or
+ *
+ *  |XXO     |XXc           decrease eye space in sente (unless it kills)
+ *  |.*X     |e*a
+ *  |XXO     |XXd
+ *
+ * or
+ *
+ *  |XXO     |XXc           decrease eye space in sente (unless it kills)
+ *  |.*X     |e*a
+ *  +---     +---
+ *
+ */
+
+int
+throw_in_atari_helper(ARGS)
+{
+  int apos, bpos, cpos, dpos;
+  int success = 0;
+  int other = OTHER_COLOR(color);
+  int libs[2];
+  UNUSED(pattern);
+  
+  apos = OFFSET_BY(0, 1);
+  cpos = OFFSET_BY(-1, 1);
+  dpos = OFFSET_BY(1, 1);
+
+  /* Find second liberty of the stone a. */
+  findlib(apos, 2, libs);
+  if (libs[0] != move)
+    bpos = libs[0];
+  else
+    bpos = libs[1];
+  
+  if (TRYMOVE(move, color)) {
+    if (!attack(cpos, NULL) && !(ON_BOARD(dpos) && attack(dpos, NULL))) {
+      if (TRYMOVE(bpos, other)) {
+       if (attack(apos, NULL))
+         success = 1;
+       popgo();
+      }
+      else {
+       success = 1; /* X move at (bpos) would have been suicide */
+      }
+    }
+    popgo();
+  }
+
+  /* The followup is to capture the "a" string. Estimate the value to
+   * twice the size.
+   */
+  add_followup_value(move, 2 * worm[apos].effective_size);
+  TRACE("...followup value %f\n", 2 * worm[apos].effective_size);
+
+  return success;
+}
+
+
+/* This is intended for use in autohelpers. */
+
+/* Check whether the string at (str) can attack any surrounding
+ * string. If so, return false as the move to create a seki (probably)
+ * wouldn't work.
+ */
+
+int 
+seki_helper(int str)
+{
+  int r;
+  int adj;
+  int adjs[MAXCHAIN];
+  
+  adj = chainlinks(str, adjs);
+  for (r = 0; r < adj; r++)
+    if (worm[adjs[r]].attack_codes[0] != 0)
+      return 0;
+
+  return 1;
+}
+
+
+/*
+ *  XO     aO
+ *  O*     O*
+ *
+ * Increase the cutstone2 field if * is a potential cutting point,
+ * i.e.  if it does work as a cutting point once 'a' has been
+ * defended. This helper is expected to always return 0.
+ */
+
+int 
+cutstone2_helper(ARGS)
+{
+  int apos;
+  int bpos;
+  int cpos;
+  int dpos;
+  UNUSED(pattern);
+  UNUSED(color);
+
+  if (stackp > 0)
+    return 0;
+  
+  apos = OFFSET_BY(-1, -1);
+  bpos = OFFSET_BY(-1,  0);
+  cpos = OFFSET_BY( 0, -1);
+
+  if (worm[apos].defense_codes[0] == 0)
+    return 0;
+  
+  dpos = worm[apos].defense_points[0];
+
+  if (TRYMOVE(dpos, board[apos])) {
+    if (!board[bpos] || attack(bpos, NULL)
+       || !board[cpos] || attack(cpos, NULL)
+       || safe_move(move, board[apos]) != 0) {
+      popgo();
+      worm[worm[apos].origin].cutstone2++;
+      propagate_worm(worm[apos].origin);
+      return 0;
+    }
+    popgo();
+  }
+
+  return 0;
+}
+
+/*
+ *  ?x??   ?x??
+ *  ?X..   ?Xb.
+ *  O*..   c*a.
+ *
+ * Is the push at * sente? c must have exactly two liberties. This is
+ * called edge_double_sente_helper because it mainly called for edge
+ * hanes, but it can be used anywhere on the board.
+ */
+
+int 
+edge_double_sente_helper(int move, int apos, int bpos, int cpos)
+{
+  int color = board[cpos];
+  int success = 0;
+  ASSERT1((color == BLACK || color == WHITE), move);
+  
+  if (TRYMOVE(move, color)) {
+    ASSERT1(countlib(move) == 2, move);
+    success = connect_and_cut_helper(move, apos, bpos);
+    popgo();
+  }
+
+  return success;
+}
+
+/*
+ * This is intended for use in autohelpers.
+ *
+ * Give a conservative estimate of the value of saving the string (str)
+ * by capturing one opponent stone.
+ */
+
+void
+threaten_to_save_helper(int move, int str)
+{
+  add_followup_value(move, 2.0 + 2.0 * worm[str].effective_size);
+  TRACE("...followup value %f\n", 2.0 + 2.0 * worm[str].effective_size);
+}
+
+
+/* For use in autohelpers.
+ *
+ * Adds a reverse followup value if the opponent's move here would threaten
+ * to capture (str).
+ */
+void
+prevent_attack_threat_helper(int move, int str)
+{
+  add_reverse_followup_value(move, 2.0 * worm[str].effective_size);
+  TRACE("...reverse followup value %f\n", 2.0 * worm[str].effective_size);
+}
+
+
+/* This function is obsolete.  Code in `value_moves.c' is more general. */
+#if 0
+
+/*
+ * This is intended for use in autohelpers.
+ *
+ * Estimate the value of capturing the string (str) and add this as
+ * a followup value. We don't do this for too stupid looking threats,
+ * however, e.g. in a position like
+ *
+ * OOOO..
+ * XXX.*.
+ * XOOOX.
+ * XXXXO.
+ *
+ * where X can get out of atari with profit by capturing three O stones.
+ *
+ * Another case where we don't award the followup value is when the
+ * opponent can defend with a threat against our move, e.g. in this
+ * position:
+ *
+ * .OOOXX.
+ * .OXXO.X
+ * ..*.X..
+ * ..XX...
+ * 
+ */
+
+void
+threaten_to_capture_helper(int move, int str)
+{
+  int adj, adjs[MAXCHAIN];
+  int defense_move;
+  int k;
+  
+  adj = chainlinks2(str, adjs, 1);
+  for (k = 0; k < adj; k++)
+    if (worm[adjs[k]].defense_codes[0] != 0
+       && !does_defend(move, adjs[k]))
+      return;
+
+  if (!TRYMOVE(move, OTHER_COLOR(board[str])))
+    return;
+  if (find_defense(str, &defense_move) != 0
+      && defense_move != NO_MOVE
+      && TRYMOVE(defense_move, board[str])) {
+    if (board[move] == EMPTY || attack(move, NULL) != 0) {
+      popgo();
+      popgo();
+      return;
+    }
+    popgo();
+  }
+
+  /* In addition to the move found by find_defense(), also try all
+   * chain breaking moves in the same way.
+   */
+  adj = chainlinks2(str, adjs, 1);
+  for (k = 0; k < adj; k++) {
+    int lib;
+    findlib(adjs[k], 1, &lib);
+    if (TRYMOVE(lib, board[str])) {
+      if (!attack(str, NULL)
+         && (board[move] == EMPTY || attack(move, NULL) != 0)) {
+       popgo();
+       popgo();
+       return;
+      }
+      popgo();
+    }
+  }
+
+  popgo();
+  
+  add_followup_value(move, 2.0 * worm[str].effective_size);
+  TRACE("...followup value %f\n", 2.0 * worm[str].effective_size);
+}
+
+#endif
+
+
+/*
+ * This is intended for use in autohelpers.
+ *
+ * Estimate the value of defending a string which can be put into
+ * atari and add this as a reverse followup value.
+ */
+
+void
+defend_against_atari_helper(int move, int str)
+{
+  int adj, adjs[MAXCHAIN];
+  int libs[2];
+  int k;
+
+  ASSERT1(countlib(str) == 2, str);
+
+  /* No value if the string can capture out of atari. */
+  adj = chainlinks2(str, adjs, 1);
+  for (k = 0; k < adj; k++)
+    if (worm[adjs[k]].defense_codes[0] != 0
+       && !does_defend(move, adjs[k]))
+      return;
+
+  /* No value if opponent has no safe atari. */
+  findlib(str, 2, libs);
+  if (!safe_move(libs[0], OTHER_COLOR(board[str]))
+      && !safe_move(libs[1], OTHER_COLOR(board[str])))
+    return;
+  
+  TRACE("...reverse followup value %f\n", 2.0 * worm[str].effective_size);
+  add_reverse_followup_value(move, 2.0 * worm[str].effective_size);
+}
+
+
+/*
+ * This is intended for use in conn.db autohelpers.
+ *
+ * Amalgamate either a with b or c with b, depending on which of the
+ * two dragons a and c is largest.
+ *
+ * If either of these pairs already have been amalgamated somehow,
+ * do nothing.
+ */
+
+void
+amalgamate_most_valuable_helper(int apos, int bpos, int cpos)
+{
+  if (!is_same_dragon(apos, bpos) && !is_same_dragon(bpos, cpos)) {
+    if (dragon[apos].effective_size >= dragon[cpos].effective_size)
+      join_dragons(apos, bpos);
+    else
+      join_dragons(bpos, cpos);
+  }
+}
+
+
+/*
+ * This is intended for use in autohelpers.
+ *
+ * Returns 1 if (pos) is adjacent to a stone which can be captured by ko.
+ */
+
+int
+finish_ko_helper(int pos)
+{
+  int adj, adjs[MAXCHAIN];
+  int lib;
+  int k;
+
+  adj = chainlinks2(pos, adjs, 1);
+  for (k = 0; k < adj; k++) {
+    if (countstones(adjs[k]) == 1) {
+      findlib(adjs[k], 1, &lib);
+      if (is_ko(lib, board[pos], NULL))
+       return 1;
+    }
+  }
+  return 0;
+}
+
+
+/*
+ * This is intended for use in autohelpers.
+ *
+ * Returns 1 if (ai, aj) is next to a ko point.
+ */
+
+int
+squeeze_ko_helper(int pos)
+{
+  int libs[2];
+  int liberties;
+  int k;
+
+  liberties = findlib(pos, 2, libs);
+  ASSERT1(liberties == 2, pos);
+
+  for (k = 0; k < liberties; k++) {
+    int aa = libs[k];
+    if (is_ko(aa, OTHER_COLOR(board[pos]), NULL))
+      return 1;
+  }
+
+  return 0;
+}
+
+/*
+ * This is intended for use in autohelpers.
+ *
+ * If after playing a and b, the string at c can be attacked, this
+ * function adds a small fixed move value for a move which defends
+ * c.
+ */
+
+int
+backfill_helper(int apos, int bpos, int cpos)
+{
+  int color = board[cpos];
+  int other = OTHER_COLOR(color);
+  int dpos  = NO_MOVE;
+
+  if (TRYMOVE(apos, color)) {
+    if (TRYMOVE(bpos, other)) {
+      if (attack(cpos, NULL) && find_defense(cpos, &dpos)) {
+       set_minimum_move_value(dpos, 0.1);
+       TRACE("%o...setting min move value of %1m to 0.1\n", dpos);
+      }
+      popgo();
+    }
+    popgo();
+  }
+
+  return 0;
+}
+
+
+/* Returns true if (apos) kills or threatens to kill (bpos). */
+
+int
+owl_threatens_attack(int apos, int bpos)
+{
+  if (DRAGON2(bpos).owl_status == CRITICAL
+      && DRAGON2(bpos).owl_attack_point == apos)
+    return 1;
+  
+  if (DRAGON2(bpos).owl_threat_status == CAN_THREATEN_ATTACK)
+    if (DRAGON2(bpos).owl_attack_point == apos
+       || DRAGON2(bpos).owl_second_attack_point == apos)
+      return 1;
+  
+  return 0;
+}
+
+
+/* Returns true if O needs to connect at c in the position below after
+ * O at b and X at d, because X can cut at c. In general d is the
+ * second liberty of A, which must have exactly two liberties.
+ *
+ * |.X   |dX
+ * |XO  |AO
+ * |XO  |Ae
+ * |..  |bc
+ */
+   
+int
+connect_and_cut_helper(int Apos, int bpos, int cpos)
+{
+  int dpos;
+  int epos = NO_MOVE;
+  int other = board[Apos];
+  int color = OTHER_COLOR(other);
+  int libs[2];
+  int liberties = findlib(Apos, 2, libs);
+  int result = 0;
+  int k;
+
+  gg_assert(IS_STONE(color));
+  gg_assert(liberties == 2);
+
+  if (libs[0] == bpos)
+    dpos = libs[1];
+  else
+    dpos = libs[0];
+
+  for (k = 0; k < 4; k++)
+    if (board[cpos + delta[k]] == color
+       && neighbor_of_string(cpos + delta[k], Apos)) {
+      epos = cpos + delta[k];
+      break;
+    }
+
+  gg_assert(epos != NO_MOVE);
+  
+  if (TRYMOVE(bpos, color)) {
+    if (TRYMOVE(dpos, other)) {
+      if (TRYMOVE(cpos, other)) {
+       if (board[bpos] == EMPTY
+           || board[epos] == EMPTY
+           || !defend_both(bpos, epos))
+         result = 1;
+       popgo();
+      }
+      popgo();
+    }
+    popgo();
+  }
+  
+  return result;
+}
+
+
+
+/*
+ * This is similar to connect_and_cut_helper(), except it starts with
+ * a move at A and that d is found as a general defense point for A. A
+ * is no longer restricted to two liberties.
+ *
+ * |.X   |dX
+ * |XO  |XO
+ * |.O  |Ae
+ * |..  |bc
+ */
+   
+int
+connect_and_cut_helper2(int Apos, int bpos, int cpos, int color)
+{
+  int dpos;
+  int epos = NO_MOVE;
+  int other = OTHER_COLOR(color);
+  int result = 0;
+  int k;
+
+  gg_assert(IS_STONE(color));
+
+
+  if (TRYMOVE(Apos, color)) {
+    for (k = 0; k < 4; k++)
+      if (board[cpos + delta[k]] == other
+         && neighbor_of_string(cpos + delta[k], Apos)) {
+       epos = cpos + delta[k];
+       break;
+      }
+
+    gg_assert(epos != NO_MOVE);
+    
+    if (TRYMOVE(bpos, other)) {
+      if (!find_defense(Apos, &dpos) || dpos == NO_MOVE) {
+       popgo();
+       popgo();
+       return 0;
+      }
+      
+      if (TRYMOVE(dpos, color)) {
+       if (TRYMOVE(cpos, color)) {
+         if (board[bpos] == EMPTY
+             || board[epos] == EMPTY
+             || !defend_both(bpos, epos))
+           result = 1;
+         popgo();
+       }
+       popgo();
+      }
+      popgo();
+    }
+    popgo();
+  }
+  
+  return result;
+}
+
+
+
+void
+test_attack_either_move(int move, int color, int worma, int wormb)
+{
+  ASSERT_ON_BOARD1(move);
+  ASSERT1(board[move] == EMPTY, move);
+  ASSERT1(board[worma] == OTHER_COLOR(color)
+          && board[wormb] == OTHER_COLOR(color), move);
+
+  if (!defend_both(worma, wormb)) {
+    if (0)
+      gprintf("%1m: Reject attack_either_move for %1m, %1m (can't defend both)\n",
+             move, worma, wormb);
+    return;
+  }
+  if (trymove(move, color, "test_attack_either_move", worma)) {
+    if (board[worma] == OTHER_COLOR(color)
+       && board[wormb] == OTHER_COLOR(color)) {
+      if (!find_defense(worma, NULL) || !find_defense(wormb, NULL)) {
+       if (0)
+         gprintf("%1m: Rej. attack_either_move for %1m & %1m (regular attack)\n",
+                 move, worma, wormb);
+      }
+      else if (!defend_both(worma, wormb))
+        add_either_move(move, ATTACK_STRING, worma, ATTACK_STRING, wormb);
+      else {
+       if (0)
+         gprintf("%1m: Rej. attack_either_move for %1m & %1m (doesn't work)\n",
+                 move, worma, wormb);
+      }
+    }
+    else
+      if (0)
+       gprintf("%1m: Rej. attack_either_move for %1m & %1m (captured directly)\n",
+               move, worma, wormb);
+    popgo();
+  }
+}
+
+/* True if str is adjacent to a stone in atari, which is tactically
+ * attackable (to exclude pointless captures of snapback stones).
+ */
+int
+adjacent_to_stone_in_atari(int str)
+{
+  int adj;
+  int adjs[MAXCHAIN];
+  int k;
+
+  adj = chainlinks2(str, adjs, 1);
+  for (k = 0; k < adj; k++)
+    if (attack(adjs[k], NULL))
+      return 1;
+  
+  return 0;
+}
+
+
+/* True if str is adjacent to a stone in atari, which is tactically
+ * defendable.
+ */
+int
+adjacent_to_defendable_stone_in_atari(int str)
+{
+  int adj;
+  int adjs[MAXCHAIN];
+  int k;
+
+  adj = chainlinks2(str, adjs, 1);
+  for (k = 0; k < adj; k++)
+    if (attack_and_defend(adjs[k], NULL, NULL, NULL, NULL))
+      return 1;
+  
+  return 0;
+}
+
+void
+backfill_replace(int move, int str)
+{
+  int defense_move = NO_MOVE;
+
+  if (TRYMOVE(move, OTHER_COLOR(board[str]))) {
+    if (attack_and_defend(str, NULL, NULL, NULL, &defense_move)) {
+      /* Must undo the trymove before adding the replacement move. */
+      popgo();
+      add_replacement_move(move, defense_move, board[str]);
+    }
+    else
+      popgo();
+  }
+}
+
+
+/* True if
+ * 1. White to move.
+ * 2. All white stones look dead.
+ * 3. Less than 40% of the board is filled or less than 20% of the
+ *    board is filled with white stones.
+ *
+ * This is intended for patterns forcing white to thrash around early
+ * in high handicap games, instead of passing because it looks like no
+ * stones can live.
+ */
+int 
+thrash_around_helper(ARGS)
+{
+  UNUSED(pattern);
+  UNUSED(trans);
+  UNUSED(move);
+
+  /* Do not generate these moves when doing scoring or if fuseki move
+   * generation is disabled (typically used when solving life and
+   * death problems embedded on a big board).
+   */
+  if (doing_scoring
+      || disable_fuseki
+      || (stones_on_board(BLACK | WHITE) > board_size * board_size * 2 / 5
+         && stones_on_board(WHITE) > board_size * board_size / 5)
+      || color == BLACK
+      || lively_dragon_exists(WHITE))
+    return 0;
+
+  return 1;
+}
+
+
+/* Returns true if
+ *
+ * 1. The board size is odd.
+ * 2. A white move is being generated.
+ * 3. The komi is less than or equal to zero.
+ * 4. str is placed at tengen.
+ * 5. At least 10 moves have been played.
+ * 6. The board is currently mirror symmetric.
+ *
+ * This is intended for patterns to break mirror go when black starts at
+ * tengen and then mirrors white. We only care about breaking the mirroring
+ * if komi is non-positive, otherwise the mirroring is to our advantage.
+ */
+int
+break_mirror_helper(int str, int color)
+{
+  if (board_size % 2 == 1
+      && color == WHITE
+      && komi <= 0.0
+      && I(str) == (board_size - 1) / 2
+      && J(str) == (board_size - 1) / 2
+      && stones_on_board(BLACK | WHITE) > 10
+      && test_symmetry_after_move(PASS_MOVE, EMPTY, 1))
+    return 1;
+
+  return 0;
+}
+
+
+/* This helper is intended to detect semeai kind of positions where
+ * the tactical reading can't be trusted enough to allow amalgamation
+ * over presumably tactically dead strings.
+ *
+ * It has turned out to be best not to trust tactical reading of three
+ * and four liberty strings at all. Not trusting two liberty strings
+ * leads to an underamalgamation and unnecessarily many dragons on the
+ * board. Therefore we try to detect two liberty strings with an
+ * enclosed nakade, which after capturing leads to an unreliable
+ * reading at three or four liberties.
+ *
+ * More specifically we check whether the string has a neighbor with
+ * the following properties:
+ * 1. At least three stones in size.
+ * 2. All its liberties are common liberties with the string.
+ * 3. It has no second order liberties.
+ * 4. Its liberties are adjacent to no other strings than itself and
+ *    the primary string.
+ *
+ * If we find such a neighbor 1 is returned, otherwise 0.
+ */
+int distrust_tactics_helper(int str)
+{
+  int color = board[str];
+  int adj;
+  int adjs[MAXCHAIN];
+  int k;
+  int r;
+  int s;
+  int lib = countlib(str);
+
+  ASSERT1(IS_STONE(board[str]), str);
+  
+  if (lib > 2)
+    return 1;
+  else if (lib == 1)
+    return 0;
+  
+  adj = chainlinks3(str, adjs, lib);
+  for (r = 0; r < adj; r++) {
+    int nakade = 1;
+    int adjlib;
+    int adjlibs[3];
+    if (countstones(adjs[r]) < 3)
+      continue;
+    adjlib = findlib(adjs[r], 3, adjlibs);
+    for (s = 0; s < adjlib; s++) {
+      int str_found = 0;
+      for (k = 0; k < 4; k++) {
+       int pos = adjlibs[s] + delta[k];
+       if (board[pos] == EMPTY
+           && !liberty_of_string(pos, adjs[r]))
+         nakade = 0;
+       else if (board[pos] == color) {
+         if (same_string(pos, str))
+           str_found = 1;
+         else
+           nakade = 0;
+       }
+       else if (board[pos] == OTHER_COLOR(color)
+                && !same_string(pos, adjs[r]))
+         nakade = 0;
+      }
+      if (!str_found)
+       nakade = 0;
+    }
+    if (nakade)
+      return 1;
+  }
+  
+  return 0;
+}
+
+/*
+ * LOCAL Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/hoshi_keima.db b/patterns/hoshi_keima.db
new file mode 100644 (file)
index 0000000..7017a63
--- /dev/null
@@ -0,0 +1,11740 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JHK1
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+.......|
+....X..|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFj
+
+
+Pattern JHK2
+
+-------+
+.......|
+.......|
+....*..|
+...X...|
+.......|
+....O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK3
+
+------+
+......|
+......|
+..XO..|
+..X*..|
+......|
+...O..|
+......|
+...X..|
+
+:8,sFJ
+
+
+Pattern JHK4
+
+------+
+......|
+......|
+..OX..|
+..OX..|
+..*...|
+...X..|
+......|
+...O..|
+
+:8,sFU
+
+
+Pattern JHK5
+
+-------+
+.......|
+....*..|
+...XO..|
+...XO..|
+...X...|
+....O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK6
+
+-------+
+.......|
+....X..|
+...OX..|
+...OX..|
+...O...|
+...*X..|
+.......|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK7
+
+-------+
+.......|
+....O..|
+...XO..|
+...XO..|
+...X...|
+...XO*.|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK8
+
+-------+
+.......|
+....X..|
+...OX..|
+...OX..|
+...O...|
+...OXX.|
+.......|
+..*.O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK9
+
+-------+
+.......|
+....O..|
+...XO..|
+...XO..|
+...X...|
+...XO..|
+....*..|
+....X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK10
+
+-------+
+.......|
+....X..|
+...OX..|
+...OX..|
+...O...|
+...OX..|
+...*X..|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK11
+
+-------+
+.......|
+.......|
+...XO..|
+...XO..|
+...X...|
+....O*.|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK12
+
+------+
+......|
+......|
+..OX..|
+..OX..|
+..O...|
+...XX.|
+.*....|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK13
+
+-------+
+.......|
+.......|
+...XO..|
+...XO..|
+...X*..|
+....O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK14
+
+------+
+......|
+......|
+..OX..|
+..OX..|
+..OX..|
+...X..|
+.*....|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK15
+
+-----------+
+...........|
+...........|
+........X..|
+.......O*..|
+...........|
+........X..|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK16
+
+-------+
+.......|
+.......|
+...*O..|
+...XX..|
+.......|
+....O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK17
+
+-------+
+.......|
+.......|
+...XX..|
+..*OO..|
+.......|
+....X..|
+.......|
+....O..|
+.......|
+
+:8,sFJ-,reverse_followup(10),followup(15)
+
+
+Pattern JHK18
+
+-------+
+.......|
+.......|
+...OO..|
+..XXX*.|
+.......|
+....O..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK19
+
+-------+
+.......|
+.......|
+...XX..|
+..OOOX.|
+.....*.|
+....X..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK20
+
+-------+
+.......|
+.......|
+...OO*.|
+..XXXO.|
+.....X.|
+....O..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK21
+
+-------+
+.......|
+.......|
+...XXX.|
+..OOOX.|
+....*O.|
+....X..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK22
+
+-------+
+.......|
+.......|
+.*.OOO.|
+..XXXO.|
+....XX.|
+....O..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK23
+
+-------+
+.......|
+.......|
+.X.XXX.|
+..OOOX.|
+....OO.|
+...*X..|
+.......|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK24
+
+-------+
+.......|
+.......|
+..*XXX.|
+..OOOX.|
+.....O.|
+....X..|
+.......|
+....O..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK25
+
+-------+
+.......|
+.......|
+...XXX.|
+..OOOX.|
+.....O.|
+....X*.|
+.......|
+....O..|
+.......|
+
+:8,sFT
+
+
+Pattern JHK26
+
+--------+
+........|
+........|
+..*.OOO.|
+...XXXO.|
+......X.|
+.....OX.|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK27
+# Non-joseki often played against GNU Go
+
+-------+
+.......|
+.......|
+..*XX..|
+...OO..|
+.......|
+....X..|
+.......|
+....O..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK28
+
+--------+
+........|
+........|
+...XOO*.|
+....XX..|
+........|
+.....O..|
+........|
+
+:8,sFU
+
+
+Pattern JHK29
+
+--------+
+........|
+........|
+...XOOO.|
+...*XXX.|
+........|
+.....O..|
+........|
+
+:8,sFU
+
+
+Pattern JHK30
+
+--------+
+........|
+........|
+..XXOOO.|
+...OXXX.|
+....*...|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK31
+
+--------+
+........|
+........|
+..XXOOO.|
+..*OXXX.|
+...XO...|
+.....O..|
+........|
+
+:8,sFU
+
+
+Pattern JHK32
+
+--------+
+........|
+........|
+...XOOO.|
+..*OXXX.|
+...X....|
+.....O..|
+........|
+
+:8,sFU
+
+
+Pattern JHK33
+
+--------+
+........|
+........|
+..XXOOO.|
+..OOXXX.|
+...X*...|
+.....O..|
+........|
+
+:8,sFU
+
+
+Pattern JHK34
+
+---------+
+.........|
+.........|
+...XXOOO.|
+..*OOXXX.|
+....XO...|
+....X.O..|
+.........|
+
+:8,sFU
+
+
+Pattern JHK35
+
+--------+
+........|
+...X....|
+...XOOO.|
+...OXXX.|
+....*...|
+.....O..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK36
+
+------+
+......|
+......|
+...X..|
+..O...|
+......|
+..*X..|
+......|
+...O..|
+......|
+......|
+
+:8,sFN
+
+
+Pattern JHK37
+
+-------+
+.......|
+.......|
+.......|
+.*.O...|
+.......|
+..X.X..|
+.......|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK38
+
+-------+
+.......|
+.......|
+.......|
+.O.O...|
+.......|
+..X.X..|
+.......|
+....O..|
+...X*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK39
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+....X..|
+...OX..|
+...*...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK40
+
+-------+
+.......|
+.......|
+.......|
+.O.O...|
+.......|
+..X.X..|
+.......|
+...*O..|
+...XO..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK41
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+..*XX..|
+...OX..|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK42
+
+-------+
+.......|
+.......|
+.......|
+.O.O...|
+.......|
+..X.X..|
+.......|
+..XOO..|
+...XO..|
+...X*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK43
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+..OXX..|
+...OX..|
+...OX..|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK44
+
+-------+
+.......|
+.......|
+.......|
+.O.O...|
+.......|
+..X.X..|
+.......|
+..XOO..|
+...XO..|
+...XO..|
+...X...|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK45
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+...*...|
+..OXX..|
+...OX..|
+...OX..|
+...O...|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK46
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+....X..|
+...OX..|
+...OX..|
+...*...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK47
+
+-------+
+.......|
+.......|
+.......|
+.O.O...|
+.......|
+..X.X..|
+.......|
+...*O..|
+...XO..|
+...XO..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK48
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+..*XX..|
+...OX..|
+...OX..|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK49
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+..*XX..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK50
+
+-------+
+.......|
+.......|
+.......|
+.O.O...|
+.......|
+..X.X..|
+.......|
+..XOO..|
+...X*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK51
+
+-------+
+.......|
+.......|
+.......|
+.X.X...|
+.......|
+..O.O..|
+.......|
+..OXX..|
+...OX..|
+...*...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK52
+
+--------+
+........|
+........|
+........|
+..X.X...|
+........|
+...O.O..|
+........|
+...OXX..|
+...XO*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK53
+
+--------+
+........|
+........|
+........|
+..O.O...|
+........|
+...X.X..|
+...*....|
+...XOO..|
+...OXX..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK54
+
+--------+
+........|
+........|
+........|
+..X.X...|
+........|
+...O.O..|
+...X....|
+..*OXX..|
+...XOO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK55
+
+--------+
+........|
+........|
+........|
+..O.O...|
+........|
+...X.X..|
+...O*...|
+..XXOO..|
+...OXX..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK56
+
+--------+
+........|
+........|
+........|
+..X.X...|
+........|
+...O.O..|
+..*XX...|
+..OOXX..|
+...XOO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK57
+
+--------+
+........|
+........|
+........|
+..O.O...|
+........|
+...X*X..|
+..XOO...|
+..XXOO..|
+...OXX..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK58
+
+--------+
+........|
+........|
+........|
+..X.X...|
+........|
+...OXO..|
+..OXX...|
+..OOXX*.|
+...XOO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK59
+
+--------+
+........|
+........|
+........|
+..O.O...|
+........|
+..*XOX..|
+..XOO...|
+..XXOOX.|
+...OXX..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK60
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...X.XX.|
+........|
+.....O..|
+....X*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK61
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+.....X..|
+....OX..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK62
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...X.XX.|
+........|
+....*O..|
+....XO..|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK63
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+...*XX..|
+....OX..|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK64
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...X.XX.|
+........|
+...XOO..|
+....XO..|
+....X*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK65
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+...OXX..|
+....OX..|
+....OX..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK66
+
+---------+
+.........|
+.........|
+.........|
+...O.O...|
+......O..|
+....X.XX.|
+.........|
+....XOO..|
+.....XO..|
+.....XO..|
+.....X...|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK67
+
+---------+
+.........|
+.........|
+.........|
+...X.X...|
+......X..|
+....O.OO.|
+.....*...|
+....OXX..|
+.....OX..|
+.....OX..|
+.....O...|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK68
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O*OO.|
+....X...|
+...OXX..|
+....OX..|
+....OX..|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK69
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...XXXX.|
+...*O...|
+...XOO..|
+....XO..|
+....XO..|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK70
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...OOOO.|
+..*XX...|
+...OXX..|
+....OX..|
+....OX..|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK71
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...XXXX.|
+..XOO...|
+..*XOO..|
+....XO..|
+....XO..|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK72
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...OOOO.|
+..OXX...|
+..XOXX..|
+...*OX..|
+....OX..|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK73
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+..*XXXX.|
+..XOO...|
+..OXOO..|
+...XXO..|
+....XO..|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK74
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+..XOOOO.|
+.*OXX...|
+..XOXX..|
+...OOX..|
+....OX..|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK75
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+..OXXXX.|
+.XXOO...|
+..OXOO..|
+...XXO..|
+....XO..|
+....X...|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK76
+
+--------+
+........|
+........|
+.....*..|
+..X.X...|
+.....X..|
+..XOOOO.|
+.OOXX...|
+..XOXX..|
+...OOX..|
+....OX..|
+....O...|
+.....X..|
+
+:8,sFJ
+
+
+Pattern JHK77
+
+--------+
+........|
+........|
+....*X..|
+..O.O...|
+.....O..|
+..OXXXX.|
+.XXOO...|
+..OXOO..|
+...XXO..|
+....XO..|
+....X...|
+
+:8,sFJ
+
+
+Pattern JHK78
+
+--------+
+........|
+........|
+....XO..|
+..X.X*..|
+.....X..|
+..XOOOO.|
+.OOXX...|
+..XOXX..|
+...OOX..|
+....OX..|
+....O...|
+
+:8,sFJ
+
+
+Pattern JHK79
+
+--------+
+........|
+.....*..|
+....OX..|
+..O.OX..|
+.....O..|
+..OXXXX.|
+.XXOO...|
+..OXOO..|
+...XXO..|
+....XO..|
+....X...|
+
+:8,sFJ
+
+
+Pattern JHK80
+
+--------+
+........|
+.....X..|
+....XO..|
+..X.XO..|
+....*X..|
+..XOOOO.|
+.OOXX...|
+..XOXX..|
+...OOX..|
+....OX..|
+....O...|
+
+:8,sFJ
+
+
+Pattern JHK81
+
+---------+
+.........|
+......O..|
+.....OX..|
+...O.OX..|
+.....XO..|
+..*OXXXX.|
+..XXOO...|
+...OXOO..|
+....XXO..|
+.....XO..|
+.....X...|
+
+:8,sFJ
+
+
+Pattern JHK82
+
+--------+
+........|
+.....X*.|
+....XO..|
+..X.XO..|
+....OX..|
+.XXOOOO.|
+.OOXX...|
+..XOXX..|
+...OOX..|
+....OX..|
+
+:8,sFJ
+
+
+Pattern JHK83
+
+----------+
+..........|
+.......OX.|
+......OX..|
+....O.OX..|
+......XO..|
+...OOXXXX.|
+..*XXOO...|
+....OXOO..|
+.....XXO..|
+......XO..|
+......X...|
+
+:8,sFJ
+
+
+Pattern JHK84
+
+----------+
+..........|
+.......XO.|
+......XO..|
+....X.XO..|
+......OX..|
+...XXOOOO.|
+..XOOXX...|
+...*XOXX..|
+.....OOX..|
+......OX..|
+......O...|
+
+:8,sFJ
+
+
+Pattern JHK85
+
+----------+
+..........|
+.......OX.|
+......OX..|
+....O.OX..|
+......XO..|
+...OOXXXX.|
+..OXXOO...|
+...XOXOO..|
+..*..XXO..|
+......XO..|
+......X...|
+
+:8,sFJ
+
+
+Pattern JHK86
+
+----------+
+..........|
+.......XO.|
+......XO..|
+....X.XO..|
+......OX..|
+...XXOOOO.|
+..XOOXX...|
+...OXOXX..|
+..X*.OOX..|
+......OX..|
+......O...|
+
+:8,sFJ
+
+
+Pattern JHK87
+
+----------+
+..........|
+.......OX.|
+......OX..|
+....O.OX..|
+......XO..|
+...OOXXXX.|
+..OXXOO...|
+...XOXOO..|
+..OX.XXO..|
+...*..XO..|
+......X...|
+.......O..|
+
+:8,sFJ
+
+
+Pattern JHK88
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+.....X..|
+....OX..|
+....OX..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK89
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...X.XX.|
+........|
+....*O..|
+....XO..|
+....XO..|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK90
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+...*XX..|
+....OX..|
+....OX..|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK91
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+...*XX..|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK92
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...X.XX.|
+........|
+...XOO..|
+....X*..|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK93
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OO.|
+........|
+...OXX..|
+....OX..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK94
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.O..|
+........|
+.....X..|
+....O*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK95
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O..|
+...X.X*.|
+........|
+.....O..|
+....XX..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK96
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+...O.OX.|
+.....*..|
+.....X..|
+....OO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK97
+
+-------+
+.......|
+.......|
+....X..|
+.O.O*..|
+.......|
+..X.X..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK98
+
+-------+
+.......|
+.......|
+....X..|
+.O.OOX.|
+.....*.|
+..X.X..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK99
+
+-------+
+.......|
+.......|
+....XX.|
+.O.OOX.|
+....*O.|
+..X.X..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK100
+
+---------+
+.........|
+....X....|
+......XX.|
+...O.OOX.|
+......OO.|
+..*.X.X..|
+.........|
+......O..|
+.........|
+
+:8,sFt
+
+
+Pattern JHK101
+
+---------+
+.........|
+.........|
+.........|
+...O.O...|
+......*..|
+....X.X..|
+.........|
+....X.O..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK102
+
+---------+
+.........|
+.........|
+.........|
+...X.X...|
+......X..|
+....O.O*.|
+.........|
+....O.X..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK103
+
+---------+
+.........|
+.........|
+.........|
+...O.O...|
+......O..|
+....X.XX.|
+.........|
+....X.O..|
+.........|
+......*..|
+
+:8,sFJ
+
+
+Pattern JHK104
+
+---------+
+.........|
+.........|
+.........|
+...X.X...|
+......X..|
+..*.O.OO.|
+.........|
+....O.X..|
+.........|
+......X..|
+
+:8,sFJ
+
+
+Pattern JHK105
+
+---------+
+.........|
+.........|
+.........|
+.*.O.O...|
+.........|
+..X.X.X..|
+.........|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK106
+#bad for white
+
+-------+
+.......|
+.......|
+.......|
+.X.X.*.|
+.......|
+..O.O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK107
+
+---------+
+.........|
+.........|
+...*.....|
+.....X...|
+.........|
+......O..|
+.........|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK108
+
+--------+
+........|
+........|
+..X.....|
+....O...|
+........|
+....*X..|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK109
+
+--------+
+........|
+........|
+..O.....|
+....X...|
+........|
+....XO..|
+....*...|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK110
+
+--------+
+........|
+........|
+..X.....|
+....O...|
+........|
+....OX..|
+....X*..|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK111
+
+--------+
+........|
+........|
+..X..X..|
+....O...|
+.....*..|
+....OX..|
+....XO..|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK112
+
+--------+
+........|
+........|
+..O.*O..|
+....X...|
+.....X..|
+....XO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK113
+
+--------+
+........|
+........|
+..O.*...|
+....X...|
+........|
+....XO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK114
+
+--------+
+........|
+........|
+..X.X...|
+....O...|
+.....*..|
+....OX..|
+....XO..|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK115
+
+--------+
+........|
+........|
+..O.O*..|
+....X...|
+.....X..|
+....XO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK116
+
+--------+
+........|
+........|
+..O.OO..|
+....X...|
+.....X..|
+....XO*.|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK117
+
+--------+
+........|
+........|
+..X.XX..|
+....O...|
+.....O*.|
+....OXX.|
+....XO..|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK118
+
+--------+
+........|
+........|
+..O.OO..|
+....X...|
+.....XX.|
+...*XOO.|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK119
+
+--------+
+........|
+........|
+..X.XX..|
+....O...|
+....*OO.|
+...XOXX.|
+....XO..|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK120
+
+--------+
+........|
+........|
+..O.OO..|
+....X...|
+..*.XXX.|
+...OXOO.|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK121
+
+--------+
+........|
+........|
+..X.XX..|
+....O...|
+.....O..|
+....OX..|
+...*XO..|
+.....O..|
+........|
+
+:8,sFN
+
+
+Pattern JHK122
+
+--------+
+........|
+........|
+..X.X*..|
+....O...|
+........|
+....OX..|
+....XO..|
+.....O..|
+........|
+
+:8,sFN
+
+
+Pattern JHK123
+
+--------+
+........|
+........|
+..O.OX..|
+....X...|
+....*...|
+....XO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK124
+
+--------+
+........|
+........|
+..O.OX..|
+....X*..|
+....O...|
+...XXO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK125
+
+--------+
+........|
+........|
+..O.OX..|
+...XXO..|
+...*O...|
+...XXO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK126
+
+---------+
+.........|
+.........|
+...O.OX..|
+....XXO..|
+...XOO*..|
+....XXO..|
+.....OX..|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK127
+
+--------+
+........|
+........|
+..O.OX..|
+..XXXO..|
+..XOOO..|
+..*XXO..|
+....OX..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK128
+
+--------+
+........|
+........|
+..O.OX..|
+..XXXO..|
+..XOOO..|
+...XXO..|
+....OX..|
+....*X..|
+........|
+
+:8,sFN
+
+
+Pattern JHK129
+
+--------+
+........|
+........|
+..O.OX..|
+...XXO..|
+....O...|
+...XXO..|
+....OX..|
+....*X..|
+........|
+
+:8,sFN
+
+
+Pattern JHK130
+
+--------+
+........|
+........|
+..O..*..|
+....X...|
+........|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK131
+
+--------+
+........|
+........|
+..X..X..|
+....O*..|
+........|
+....OX..|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK132
+
+--------+
+........|
+........|
+..O.*O..|
+....XX..|
+........|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK133
+
+--------+
+........|
+........|
+..X.XX..|
+...*OO..|
+........|
+....OX..|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK134
+
+--------+
+........|
+........|
+..O.OO*.|
+...XXX..|
+........|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK135
+
+--------+
+........|
+........|
+..X.XXX.|
+...OOO*.|
+........|
+....OX..|
+........|
+.....O..|
+........|
+
+:8,sFj
+
+
+Pattern JHK136
+
+--------+
+........|
+........|
+..O.OO..|
+...*XX..|
+........|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK137
+
+--------+
+........|
+........|
+..O.OO..|
+...OXX..|
+..*X....|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK138
+
+--------+
+........|
+........|
+..X.*X..|
+....O...|
+........|
+....OX..|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK139
+
+--------+
+........|
+........|
+..O.XO..|
+....X*..|
+........|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK140
+
+--------+
+........|
+........|
+..X.OX..|
+....OX..|
+....*...|
+....OX..|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK141
+
+--------+
+........|
+........|
+..O.XO..|
+....XO..|
+....X...|
+....XO*.|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK142
+
+--------+
+........|
+....*...|
+..X.OX..|
+....OX..|
+....O...|
+....OXX.|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK143
+
+--------+
+........|
+....X*..|
+..O.XO..|
+....XO..|
+....X...|
+....XOO.|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK144
+
+--------+
+........|
+....OX..|
+..X.OX..|
+.*..OX..|
+....O...|
+....OXX.|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK145
+
+--------+
+........|
+........|
+..X..X..|
+....O...|
+.....*..|
+....OX..|
+........|
+.....O..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK146
+
+--------+
+........|
+........|
+..O.*O..|
+....X...|
+.....X..|
+....XO..|
+........|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK147
+
+---------+
+.........|
+.........|
+.........|
+...*.O...|
+.........|
+......X..|
+.........|
+.........|
+
+:8,sFj
+
+
+Pattern JHK148
+
+-----------+
+...........|
+...........|
+...*.......|
+.....X.X...|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFt
+
+
+Pattern JHK149
+
+-----------+
+...........|
+...........|
+...X.......|
+.....O.O...|
+...........|
+.....*..X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK150
+
+-----------+
+...........|
+...........|
+...X.......|
+.....O.O...|
+....*......|
+........X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK151
+# This is usually bad if W has already an extension to hoshi.
+
+-------+
+.......|
+.......|
+.......|
+.X.X.*.|
+.......|
+....O..|
+.......|
+.......|
+.......|
+.......|
+
+:8,sFj
+
+
+Pattern JHK152
+
+-------+
+.......|
+.......|
+....*..|
+.X.X.O.|
+.......|
+....O..|
+.......|
+.......|
+.......|
+
+:8,sFj
+
+
+Pattern JHK153
+
+-------+
+.......|
+.......|
+.......|
+.O.O.X.|
+.......|
+....X..|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK154
+
+-------+
+.......|
+.......|
+....*..|
+.X.X.O.|
+.......|
+....O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK155
+
+-------+
+.......|
+.......|
+....X..|
+.O.O.X.|
+....*..|
+....X..|
+.......|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK156
+
+-------+
+.......|
+.......|
+....O..|
+.X.X.O.|
+....X*.|
+....O..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK157
+
+--------+
+........|
+........|
+.....X..|
+..O.O.X.|
+.....OX.|
+....*X..|
+........|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK158
+
+-------+
+.......|
+.......|
+....O..|
+.X.X.O.|
+....XO.|
+...XO..|
+...*...|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+-------+
+.......|
+.......|
+....O..|
+.X.X.O.|
+....XO.|
+...XO..|
+...BA..|
+....X..|
+.......|
+.......|
+
+;!xplay_attack(A,B)
+
+
+Pattern JHK159
+
+-------+
+.......|
+.......|
+....X..|
+.O.O.X.|
+....OX.|
+...OX..|
+...X*..|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK160
+
+-------+
+.......|
+.......|
+....O..|
+.X.X.O.|
+....XO.|
+...XO*.|
+...OX..|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK161
+
+-------+
+.......|
+.......|
+....X..|
+.O.O.X.|
+....OX.|
+...OXX.|
+..*XO..|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK162
+
+-------+
+.......|
+.......|
+....X..|
+.O.O.X.|
+....OX.|
+...OXX.|
+..OXO..|
+...*O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK163
+
+-------+
+.......|
+.......|
+....X..|
+.O.O.X.|
+....OX.|
+..*OX..|
+...X...|
+....O..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK164
+
+--------+
+........|
+..*.....|
+.....O..|
+..X.X.O.|
+.....XO.|
+....XO..|
+........|
+.....X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK165
+
+--------+
+........|
+..X.....|
+.....X..|
+..O.O.X.|
+.....OX.|
+....OX*.|
+........|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK166
+
+--------+
+........|
+..O.....|
+...*.O..|
+..X.X.O.|
+.....XO.|
+....XOX.|
+........|
+.....X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK167
+
+--------+
+........|
+...*....|
+.....O..|
+..X.X.O.|
+.....XO.|
+....XO..|
+........|
+.....X..|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JHK168
+
+--------+
+........|
+...X....|
+.....X..|
+..O.O.X.|
+.....OX.|
+....OX*.|
+........|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK169
+
+--------+
+........|
+........|
+.....X..|
+..O.O.X.|
+.....OX.|
+....OXX.|
+....*...|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK170
+
+-------+
+.......|
+.......|
+.......|
+.X.X.O.|
+.......|
+..*.O..|
+.......|
+....X..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK171
+
+-------+
+.......|
+.......|
+....*..|
+.O.O.X.|
+.......|
+..X.X..|
+.......|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK172
+
+-------+
+.......|
+.......|
+....*..|
+.O.O.X.|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK173
+
+------+
+......|
+......|
+...X..|
+X.X.O.|
+......|
+...O..|
+......|
+......|
+...*..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK174
+
+------+
+......|
+......|
+...O..|
+O.O.X.|
+......|
+...X..|
+.*....|
+......|
+...X..|
+......|
+
+:8,sFt
+
+
+Pattern JHK175
+
+------------+
+............|
+............|
+..*......O..|
+......O.O.X.|
+............|
+.........X..|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JHK176
+
+-------+
+.......|
+.......|
+....X..|
+.X.X.O.|
+.......|
+....O..|
+.......|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+-------+
+.......|
+.......|
+....X..|
+.X.X.O.|
+.......|
+....O..|
+.......|
+...*...|
+.......|
+....A..|
+
+;omoyo(A)
+
+
+Pattern JHK177
+
+--------+
+........|
+........|
+.....*..|
+..X.X...|
+.....X..|
+....OO..|
+........|
+
+:8,sFt
+
+--------+
+........|
+........|
+.....*..|
+..X.X...|
+.....X..|
+....OA..|
+........|
+
+;!weak(A) || dead(A)
+
+
+Pattern JHK178
+
+-------+
+.......|
+.......|
+...*X..|
+.O.O...|
+....O..|
+...XX..|
+
+:8,sFJ
+
+
+Pattern JHK179
+
+-----+
+.....|
+.....|
+.XO..|
+.X...|
+..X*.|
+.OO..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK180
+
+-----+
+.....|
+.....|
+.OX..|
+.O.*.|
+..OX.|
+.XX..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK181
+
+-----+
+.....|
+.....|
+.XO..|
+.X*X.|
+..XO.|
+.OO..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK182
+
+-----+
+.....|
+.....|
+.OX*.|
+.OXO.|
+..OX.|
+.XX..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK183
+
+-----+
+.....|
+.....|
+.XOX.|
+.XOX.|
+.*XO.|
+.OO..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK184
+
+-----+
+.....|
+..*..|
+.OXO.|
+.OXO.|
+.X.X.|
+.XX..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK185
+
+-----+
+.....|
+.....|
+.XO..|
+.XX*.|
+..XO.|
+.OO..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK186
+
+-----+
+.....|
+.....|
+.OX*.|
+.OOX.|
+..OX.|
+.XX..|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK187
+
+------+
+......|
+......|
+......|
+X.X...|
+...X..|
+..OO..|
+......|
+......|
+......|
+..*...|
+......|
+
+:8,sFJ
+
+
+Pattern JHK188
+
+------+
+......|
+......|
+......|
+X.X...|
+...X..|
+..OO..|
+......|
+......|
+......|
+...*..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK189
+
+-------+
+.......|
+.......|
+....*..|
+.O.OX..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK190
+
+-------+
+.......|
+.......|
+....X*.|
+.X.XO..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK191
+
+-------+
+.......|
+.......|
+...*OX.|
+.O.OX..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK192
+
+------+
+......|
+......|
+..XXO.|
+X.XO..|
+....*.|
+...O..|
+......|
+
+:8,sFU
+
+
+Pattern JHK193
+
+--------+
+........|
+......X*|
+....XXO.|
+..X.XO..|
+......O.|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK194
+
+------+
+......|
+...*..|
+...OX.|
+O.OX..|
+......|
+...X..|
+......|
+
+:8,sFN
+
+
+Pattern JHK195
+
+------+
+......|
+...X..|
+...XO.|
+X.XO..|
+....*.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK196
+
+------+
+......|
+...XX.|
+...XO.|
+X.XO..|
+..*.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK197
+
+------+
+......|
+...XX*|
+...XO.|
+XXXO..|
+..O.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK198
+
+------+
+......|
+...XX.|
+...XOX|
+X*XO..|
+..O.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK199
+
+------+
+......|
+......|
+...OX.|
+O.OX..|
+...*..|
+...X..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK200
+
+------+
+......|
+......|
+...XO.|
+X.XO*.|
+...X..|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK201
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OXX.|
+...*O..|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK202
+
+------+
+......|
+......|
+...XO.|
+X.XOO.|
+..XX*.|
+...O..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK203
+
+-------+
+.......|
+....*..|
+....OX.|
+.O.OXX.|
+...OOX.|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK204
+
+-------+
+.......|
+....X..|
+....XO.|
+.X.XOO.|
+...XXO.|
+...*O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK205
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OXX.|
+....O*.|
+....X..|
+.......|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK206
+
+-------+
+.......|
+.......|
+....XO.|
+.X.XOO.|
+...*XX.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK207
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OXX.|
+...XOO.|
+....X*.|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK208
+
+-------+
+.......|
+.......|
+....XO.|
+.X.XOO.|
+...OXX.|
+...*OX.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK209
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OXX.|
+...XOO.|
+...XXO.|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK210
+
+-------+
+.......|
+.......|
+....XO.|
+.X.XOO.|
+...OXX.|
+...OOX.|
+...*X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK211
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OXX.|
+...XOO.|
+...XXO.|
+...XO..|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK212
+
+-------+
+.......|
+.......|
+...*XO.|
+.X.XOO.|
+...OXX.|
+...OOX.|
+
+:8,sFJ
+
+
+Pattern JHK213
+
+-------+
+.......|
+.......|
+...XOX.|
+.O*OXX.|
+...XOO.|
+...XXO.|
+
+:8,sFJ
+
+
+Pattern JHK214
+
+-------+
+.......|
+...*...|
+...OXO.|
+.XXXOO.|
+...OXX.|
+...OOX.|
+
+:8,sFJ
+
+
+Pattern JHK215
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OXX.|
+....O..|
+...*X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK216
+
+-------+
+.......|
+.......|
+....XO.|
+.X.XOO.|
+....X*.|
+...XO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK217
+
+-------+
+.......|
+.....*.|
+....OX.|
+.O.OX..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK218
+
+-----+
+.....|
+...X.|
+..XO.|
+.XO..|
+...*.|
+..O..|
+.....|
+
+:8,sFU
+
+
+Pattern JHK219
+
+------+
+......|
+....O.|
+...OX*|
+O.OX..|
+....X.|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK220
+
+-------+
+.......|
+.....X.|
+....XOX|
+.X.XO..|
+...*.O.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK221
+
+-------+
+.......|
+.....O.|
+....OXO|
+.O*OX..|
+...X.X.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK222
+
+------+
+......|
+....X.|
+...XOX|
+XXXO*.|
+..O.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK223
+
+------+
+......|
+..*.O.|
+...OXO|
+OOOXX.|
+..X.X.|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK224
+
+-------+
+.......|
+.....O.|
+....OXO|
+.O.OX*.|
+...X.X.|
+....X..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK225
+
+-------+
+.......|
+.....X.|
+....X.X|
+.X*XOX.|
+...O.O.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK226
+
+-------+
+.......|
+.......|
+....OX.|
+.O.OX*.|
+.......|
+....X..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK227
+
+-------+
+.......|
+.......|
+....XO.|
+.X.XOX.|
+....*..|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK228
+
+-------+
+.......|
+.....*.|
+....OX.|
+.O.OXO.|
+....X..|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK229
+
+-------+
+.......|
+.....X.|
+...*XO.|
+.X.XOX.|
+....O..|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK230
+
+-------+
+.......|
+....*O.|
+...XOX.|
+.O.OXO.|
+....X..|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK231
+
+-------+
+.......|
+....XX.|
+...OXO.|
+.X*XOX.|
+....O..|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK232
+
+-------+
+.......|
+....OO.|
+..*XOX.|
+.OXOXO.|
+....X..|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK233
+
+-------+
+.......|
+....XX.|
+..XOXO.|
+.XOXOX.|
+...*O..|
+....O..|
+.......|
+
+:8,sFU
+
+
+Pattern JHK234
+
+-------+
+.......|
+.......|
+....X..|
+.O.O*..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK235
+
+-------+
+.......|
+.......|
+...*X..|
+.O.O...|
+.......|
+....X..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK236
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+.......|
+...*X..|
+.......|
+.......|
+.......|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK237
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+.......|
+..*OX..|
+...X...|
+.......|
+.......|
+...O...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK238
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+.......|
+...*X..|
+.......|
+.......|
+.......|
+.......|
+
+:8,sFj
+
+
+Pattern JHK239
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+.......|
+...XO..|
+...*...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK240
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+.......|
+..*OX..|
+...X...|
+.......|
+
+:8,sFU
+
+
+Pattern JHK241
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+....*..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK242
+
+-------+
+.......|
+.......|
+.......|
+...O*..|
+....X..|
+..OOX..|
+...X...|
+.......|
+
+:8,sFU
+
+
+Pattern JHK243
+
+------+
+......|
+......|
+......|
+..XX..|
+...O..|
+.XXO..|
+..O...|
+......|
+......|
+...*..|
+......|
+
+:8,sFU
+
+
+Pattern JHK244
+#overconcentrated in this case
+
+-------+
+.......|
+.......|
+.......|
+.*.OO..|
+....X..|
+..OOX..|
+...X...|
+.......|
+.......|
+....X..|
+.......|
+
+:8,sFU
+
+-------+
+.......|
+.......|
+.......|
+A*.OO..|
+....X..|
+..OOX..|
+...X...|
+.......|
+.......|
+....X..|
+.......|
+
+; !oterri(A)
+
+
+Pattern JHK245
+
+------+
+......|
+......|
+......|
+..XX..|
+...O..|
+.XXO..|
+..O...|
+...*..|
+......|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK246
+
+-------+
+.......|
+.......|
+.......|
+.*.OO..|
+....X..|
+..OOX..|
+...X...|
+....X..|
+
+:8,sFU
+
+
+Pattern JHK247
+
+-------+
+.......|
+.......|
+.......|
+.O.OO..|
+..*XX..|
+..OOX..|
+...X...|
+....X..|
+
+:8,sFJ
+
+
+Pattern JHK248
+
+--------+
+........|
+........|
+........|
+..O*OO..|
+...XXX..|
+...OOX..|
+....X...|
+.....X..|
+
+:8,sFJ
+
+
+Pattern JHK249
+#Usually good in high handicap games (HL 2-nov-2000)
+
+-----------+
+...........|
+...........|
+.*.........|
+.O...O.OO..|
+........X..|
+......OOX..|
+
+:8,sFt
+
+
+Pattern JHK250
+# Don't do it!  (HL 2-nov-2000)
+
+-----+
+.....|
+.....|
+.....|
+.OO..|
+..X..|
+OOX..|
+.X.*.|
+..X..|
+.....|
+
+:8,sFN
+
+
+Pattern JHK251
+
+-------+
+.......|
+.......|
+.......|
+...XX..|
+...*O..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK252
+
+-------+
+.......|
+.......|
+.......|
+...OO..|
+..*XX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK253
+
+-------+
+.......|
+.......|
+.......|
+..*XX..|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK254
+
+-------+
+.......|
+.......|
+.......|
+.*XOO..|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK255
+
+-------+
+.......|
+.......|
+..*....|
+.XOXX..|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK256
+
+-------+
+.......|
+.......|
+..X....|
+.OXOO*.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK257
+
+-------+
+.......|
+.......|
+..O....|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...O*..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK258
+
+-------+
+.......|
+.......|
+.*X....|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK259
+
+-------+
+.......|
+...*...|
+.XO....|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK260
+
+-------+
+.......|
+.*.X...|
+.OX....|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK261
+
+-------+
+.......|
+.X.O.*.|
+.XO....|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK262
+
+-------+
+.......|
+.O.X.X.|
+.OX*...|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK263
+
+-------+
+.......|
+.X*O.O.|
+.XOX...|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK264
+
+-------+
+.......|
+.OXX*X.|
+.OXO...|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK265
+
+-------+
+....*..|
+.XOOXO.|
+.XOX...|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK266
+
+-------+
+....X..|
+.OXXOX.|
+.OXO*..|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK267
+
+-------+
+...*O..|
+.XOOXO.|
+.XOXX..|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK268
+
+-------+
+...XX*.|
+.OXXOX.|
+.OXOO..|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK269
+
+-------+
+...OOX*|
+.XOOXO.|
+.XOXX..|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK270
+
+--------+
+..*.XX.X|
+..OXXOX.|
+..OXOO..|
+..OXOOO.|
+...OXX..|
+...OOX..|
+....XX..|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK271
+
+-------+
+.......|
+.XOOXO.|
+.XOX*..|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK272
+
+-------+
+.......|
+.OXXOX.|
+.OXOX*.|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK273
+
+-------+
+....*..|
+.XOOXO.|
+.XOX.X.|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK274
+
+-------+
+....X..|
+.OXXOX.|
+.OXO*O.|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK275
+
+-------+
+...*O..|
+.XOOXO.|
+.XOXXX.|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK276
+
+-------+
+...XX..|
+.OXXOX*|
+.OXOOO.|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK277
+
+-------+
+...OO*.|
+.XOOXOX|
+.XOXXX.|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK278
+
+-------+
+.*.XXX.|
+.OXXOXO|
+.OXOOO.|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK279
+
+-------+
+...OO..|
+.XOOXOX|
+.XOXXX.|
+.XOXXX.|
+..XOO*.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK280
+
+-------+
+.*.XX..|
+.OXXOXO|
+.OXOOO.|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK281
+
+-------+
+.......|
+..*....|
+.XO....|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK282
+
+-------+
+.......|
+.*X....|
+.OX....|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK283
+
+-------+
+.......|
+.XO.*..|
+.XO....|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK284
+
+-------+
+.......|
+.OX.X*.|
+.OX....|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK285
+
+-------+
+.....*.|
+.XO.OX.|
+.XO....|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK286
+
+-------+
+.....X.|
+.OX.XO*|
+.OX....|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK287
+
+-------+
+.....O.|
+.XO.OXX|
+.XO....|
+.XOXXX.|
+..XOO*.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK288
+
+-------+
+.....X.|
+.OX.XOO|
+.OX....|
+.OXOOO*|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK289
+
+-------+
+.....O.|
+.XO.OXX|
+.XO.*..|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK290
+
+-------+
+.....X.|
+.OX.XOO|
+.OX*X..|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK291
+
+-------+
+.....O.|
+.XO*OXX|
+.XOXO..|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK292
+
+-------+
+.....X.|
+.OXXXOO|
+.OXOX*.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK293
+
+-------+
+.....O.|
+.XOOOXX|
+.XOXOX.|
+.XOXXXX|
+..XOOO*|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK294
+
+-------+
+..*..X.|
+.OXXXOO|
+.OXOXO.|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK295
+
+-------+
+.*...O.|
+.XO.OXX|
+.XO....|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK296
+
+-------+
+.X...X.|
+*OX.XOO|
+.OX....|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK297
+
+-------+
+.O...O.|
+XXO.OXX|
+.XO.*..|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK298
+
+-------+
+.X...X.|
+OOX.XOO|
+.OX*X..|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK299
+
+-------+
+.O...O.|
+XXO*OXX|
+.XOXO..|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK300
+
+-------+
+.X...X.|
+OOXXXOO|
+.OXOX*.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK301
+
+-------+
+.O..*O.|
+XXOOOXX|
+.XOXOX.|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK302
+
+-------+
+.X*.XX.|
+OOXXXOO|
+.OXOXO.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK303
+
+-------+
+.O...O.|
+XXO.OXX|
+.XO*...|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK304
+
+--------+
+..X.*.X.|
+.OOX.XOO|
+..OXX...|
+..OXOOOO|
+...OXXX.|
+...OOX..|
+....XX..|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK305
+
+-------+
+.O.X*O.|
+XXO.OXX|
+.XOO...|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK306
+
+-------+
+.X.OXX.|
+OOX.XOO|
+.OXX*..|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK307
+
+-------+
+.O.XOO.|
+XXO.OXX|
+.XOOX*.|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK308
+
+-------+
+.X*OXX.|
+OOX.XOO|
+.OXXOX.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK309
+
+-------+
+.OXXOO.|
+XXO*OXX|
+.XOOXO.|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK310
+
+--------+
+..X*.XX.|
+.OOXXXOO|
+..OXXOX.|
+..OXOOOO|
+...OXXX.|
+...OOX..|
+....XX..|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK311
+
+-------+
+.O.X.O.|
+XXO.OXX|
+.XOO*..|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK312
+
+-------+
+.X.O.X.|
+OOX.XOO|
+.OXXX*.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK313
+
+-------+
+.O.X*O.|
+XXO.OXX|
+.XOOOX.|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK314
+
+-------+
+.X*OXX.|
+OOX.XOO|
+.OXXXO.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK315
+
+-------+
+.OXXOO.|
+XXO*OXX|
+.XOOOX.|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK316
+
+-------+
+.X*.XX.|
+OOXXXOO|
+.OXXXO.|
+.OXOOOO|
+..OXXX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK317
+
+-------+
+.OX*OO.|
+XXOOOXX|
+.XOOOX.|
+.XOXXXX|
+..XOOO.|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK318
+
+-------+
+.O.OOO.|
+XXOOOXX|
+.XOOOX.|
+.XOXXXX|
+..XOOO*|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK319
+
+---------+
+..*O.OOO.|
+..XXOOOXX|
+
+:8,sFN
+
+
+Pattern JHK320
+
+----------+
+...XX.XXX.|
+..*OOXXXOO|
+
+:8,sFU
+
+
+Pattern JHK321
+
+----------+
+..*OO.OOO.|
+..XXXOOOXX|
+
+:8,sFN
+
+
+Pattern JHK322
+
+----------+
+..XXX.XXX.|
+.*OOOXXXOO|
+
+:8,sFU
+
+
+Pattern JHK323
+
+-------+
+.O.X.O.|
+XXO.OXX|
+.XOO...|
+.XOXXXX|
+..XOOO*|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK324
+
+-------+
+.X.O.X.|
+OOX.XOO|
+.OXX*..|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK325
+
+-------+
+.O.X.O.|
+XXO.OXX|
+.XOOX*.|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK326
+
+-------+
+.X.O.X.|
+OOX.XOO|
+.OXXOX*|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK327
+
+-------+
+.O.X.O.|
+XXO*OXX|
+.XOOX.X|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK328
+
+-------+
+*X.O.X.|
+OOXXXOO|
+.OXXO.O|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK329
+
+-------+
+XO.X*O.|
+XXOOOXX|
+.XOOX.X|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK330
+
+-------+
+OX*OXX.|
+OOXXXOO|
+.OXXO.O|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK331
+
+-------+
+X*XXOO.|
+XXOOOXX|
+.XOOX.X|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK332
+
+-------+
+OX*.XX.|
+OOXXXOO|
+.OXXO.O|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK333
+
+-------+
+.O.X*O.|
+XXO.OXX|
+.XOOX.X|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK334
+
+-------+
+.X*OXX.|
+OOX.XOO|
+.OXXO.O|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK335
+
+-------+
+.OXXOO.|
+XXO*OXX|
+.XOOX.X|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK336
+
+-------+
+.X*.XX.|
+OOXXXOO|
+.OXXO.O|
+.OXOOOO|
+..OXXXX|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK337
+
+-------+
+.OX*OO.|
+XXOOOXX|
+.XOOX.X|
+.XOXXXX|
+..XOOOO|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK338
+
+---------+
+..*O.OOO.|
+..XXOOOXX|
+...XOOX.X|
+...XOXXXX|
+....XOOOO|
+
+:8,sFN
+
+
+Pattern JHK339
+
+---------+
+..XX.XXX.|
+.*OOXXXOO|
+...OXXO.O|
+...OXOOOO|
+....OXXXX|
+
+:8,sFU
+
+
+Pattern JHK340
+
+----------+
+..*OO.OOO.|
+..XXXOOOXX|
+....XOOX.X|
+
+:8,sFN
+
+
+Pattern JHK341
+
+----------+
+.*XXX.XXX.|
+..OOOXXXOO|
+
+:8,sFN
+
+
+Pattern JHK342
+
+-------+
+.......|
+.XO....|
+.XO.*..|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK343
+
+-------+
+.......|
+.OX....|
+.OX*X..|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK344
+
+-------+
+.......|
+.XO*...|
+.XOXO..|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK345
+
+-------+
+.......|
+.OXX*..|
+.OXOX..|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK346
+
+-------+
+.......|
+.XOOX*.|
+.XOXO..|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK347
+
+-------+
+.......|
+.......|
+.XO*...|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK348
+
+-------+
+.......|
+....*..|
+.OXX...|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK349
+
+-------+
+.......|
+...*X..|
+.XOO...|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK350
+
+-------+
+.......|
+...XO*.|
+.OXX...|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK351
+
+-------+
+.......|
+.*.OXX.|
+.XOO...|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK352
+
+-------+
+.......|
+*X.XOO.|
+.OXX...|
+.OXOOO.|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK353
+
+-------+
+.......|
+XO.OXX.|
+.XOO..*|
+.XOXXX.|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK354
+
+-------+
+.......|
+OX.XOO.|
+.OXX..X|
+.OXOOO*|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK355
+
+-------+
+.......|
+XO.OXX*|
+.XOO..O|
+.XOXXXX|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK356
+
+-------+
+.......|
+OX.XOOX|
+.OXX*.X|
+.OXOOOO|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK357
+
+-------+
+....*..|
+XO.OXXO|
+.XOOX.O|
+.XOXXXX|
+..XOO..|
+..XXO..|
+...OO..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK358
+
+-------+
+..*.X..|
+OX.XOOX|
+.OXXO.X|
+.OXOOOO|
+..OXX..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK359
+
+-------+
+.......|
+.......|
+..O....|
+.XOXXX.|
+..XOO*.|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK360
+
+-------+
+.......|
+.......|
+..X....|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...X*..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK361
+
+-------+
+.......|
+.......|
+..O....|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OX*.|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK362
+
+-------+
+.......|
+.......|
+..X....|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....*..|
+.......|
+
+:8,sFU
+
+
+Pattern JHK363
+
+-------+
+.......|
+.......|
+..O....|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....X*.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK364
+
+-------+
+.......|
+.......|
+.*X....|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK365
+
+-------+
+.......|
+...*...|
+.XO....|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK366
+
+-------+
+.......|
+.*.X...|
+.OX....|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK367
+
+-------+
+.......|
+.X.O.*.|
+.XO....|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK368
+
+-------+
+.......|
+.O.X*X.|
+.OX....|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK369
+
+-------+
+.......|
+.X.OXO.|
+.XO.*..|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK370
+
+-------+
+.......|
+.O.XOX.|
+.OX*X..|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK371
+
+-------+
+.......|
+.X*OXO.|
+.XOXO..|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK372
+
+--------+
+........|
+..OXXOX.|
+..OXOX*.|
+..OXOOO.|
+...OXXX.|
+...OOX..|
+....XOX.|
+.....OX.|
+........|
+
+:8,sFU
+
+
+Pattern JHK373
+
+-------+
+....*..|
+.XOOXO.|
+.XOX.X.|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK374
+
+-------+
+..*.X..|
+.OXXOX.|
+.OXO.O.|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK375
+
+-------+
+..X.O..|
+.XOOXO.|
+.XOX*X.|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK376
+
+--------+
+...O.X..|
+..OXX.X.|
+..OXOXO.|
+..OXOOO.|
+...OXXX*|
+...OOX..|
+....XOX.|
+.....OX.|
+........|
+
+:8,sFU
+
+
+Pattern JHK377
+
+-------+
+.......|
+.X.O...|
+.XO..*.|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK378
+
+-------+
+.......|
+.O.X...|
+.OX..X.|
+.OXOOO.|
+..OXXX*|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK379
+
+-------+
+.......|
+.X.O...|
+.XO..O.|
+.XOXXX.|
+..XOOOX|
+..XXO*.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK380
+
+-------+
+.......|
+.O.X...|
+.OX.*X.|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK381
+
+-------+
+.......|
+.X.O*..|
+.XO.XO.|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK382
+
+-------+
+.......|
+.O.XX*.|
+.OX.OX.|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK383
+
+-------+
+.....*.|
+.X.OOX.|
+.XO.XO.|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK384
+
+-------+
+.....X.|
+.O.XXO*|
+.OX.OX.|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK385
+
+-------+
+.......|
+..*....|
+.XO....|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK386
+
+-------+
+.......|
+..X....|
+.OX....|
+.OXOOO.|
+..OXXX*|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK387
+
+-------+
+.......|
+..O....|
+.XO....|
+.XOXXX.|
+..XOOOX|
+..XXO*.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK388
+
+-------+
+.......|
+.*X....|
+.OX....|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK389
+
+-------+
+.......|
+.XO.*..|
+.XO....|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK390
+
+-------+
+.......|
+.OX.X*.|
+.OX....|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK391
+
+-------+
+.....*.|
+.XO.OX.|
+.XO....|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK392
+
+-------+
+.....X.|
+.OX.XO.|
+.OX.*..|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK393
+
+-------+
+..*..O.|
+.XO.OX.|
+.XO.X..|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK394
+
+-------+
+..X..X.|
+.OX*XO.|
+.OX.O..|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK395
+
+-------+
+..O*.O.|
+.XOXOX.|
+.XO.X..|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK396
+
+-------+
+..XX.X.|
+.OXOXO.|
+.OX*O..|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK397
+
+-------+
+..OO.O.|
+.XOXOX*|
+.XOXX..|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK398
+
+-------+
+.*XX.X.|
+.OXOXOX|
+.OXOO..|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK399
+
+-------+
+.......|
+.XO....|
+.XO.*..|
+.XOXXX.|
+..XOOOX|
+..XXOO.|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK400
+
+-------+
+.......|
+.OX....|
+.OX.X*.|
+.OXOOO.|
+..OXXXO|
+..OOXX.|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK401
+
+-------+
+.......|
+.......|
+.XO*...|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK402
+
+-------+
+.......|
+....*..|
+.OXX...|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK403
+
+-------+
+.......|
+....X..|
+.XOO*..|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK404
+
+-------+
+.......|
+....O..|
+.OXXX*.|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK405
+
+-------+
+.......|
+...*X..|
+.XOOOX.|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK406
+
+-------+
+.......|
+..*XO..|
+.OXXXO.|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK407
+
+-------+
+...*...|
+..XOX..|
+.XOOOX.|
+.XOXXX.|
+..XOOO.|
+..XXO..|
+...OXO.|
+....XO.|
+.......|
+
+:8,sFN
+
+
+Pattern JHK408
+
+-------+
+..*X...|
+..OXO..|
+.OXXXO.|
+.OXOOO.|
+..OXXX.|
+..OOX..|
+...XOX.|
+....OX.|
+.......|
+
+:8,sFU
+
+
+Pattern JHK409
+
+-------+
+.......|
+.......|
+.......|
+...XX*.|
+....O..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK410
+
+-------+
+.......|
+.......|
+.....*.|
+...OOX.|
+....X..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK411
+
+-------+
+.......|
+.......|
+.....X.|
+...XXO.|
+...*O..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK412
+
+-------+
+.......|
+.......|
+.....O.|
+...OOX.|
+..*XX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK413
+
+-------+
+.......|
+.......|
+.....X.|
+..*XXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK414
+
+-------+
+.......|
+.......|
+.....O.|
+.*XOOX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK415
+
+-------+
+.......|
+.......|
+..*..X.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK416
+
+-------+
+.......|
+...*...|
+..X..O.|
+.OXOOX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK417
+
+-------+
+.......|
+..*X...|
+..O..X.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK418
+
+-------+
+.......|
+..XO...|
+..X*.O.|
+.OXOOX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK419
+
+-------+
+.......|
+...X...|
+..O*.X.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK420
+
+-------+
+.......|
+...O...|
+..XX*O.|
+.OXOOX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK421
+
+-------+
+.......|
+..*X...|
+..OOXX.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK422
+
+-------+
+.......|
+.*XO...|
+..XXOO.|
+.OXOOX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK423
+
+-------+
+.......|
+.XOX*..|
+..OOXX.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK424
+
+-------+
+.......|
+.OXOX..|
+.*XXOO.|
+.OXOOX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK425
+
+-------+
+...*...|
+.XOXO..|
+.XOOXX.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK426
+
+--------+
+....X...|
+..OX.X*.|
+..OXXOO.|
+..OXOOX.|
+...OXX..|
+...OOX..|
+....X...|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK427
+
+-------+
+...O.*.|
+.XO.OX.|
+.XOOXX.|
+.XOXXO.|
+..XOO..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK428
+
+-------+
+...X.X.|
+.OX.XO.|
+.OXXOO.|
+.OXOOX.|
+..OXX*.|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK429
+
+-------+
+...O.O.|
+.XO.OX.|
+.XOOXX.|
+.XOXXO*|
+..XOOX.|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK430
+
+--------+
+....X.X.|
+..OX.XO.|
+..OXXOO.|
+..OXOOXX|
+...OXXO*|
+...OOX..|
+....X...|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK431
+
+-------+
+...O.O.|
+.XO.OX.|
+.XOOXX.|
+.XOXXOO|
+..XOOXX|
+..XXO*.|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK432
+
+-------+
+...X.X.|
+.OX.XO.|
+.OXXOO*|
+.OXOOXX|
+..OXXOO|
+..OOXX.|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK433
+
+-------+
+...O.O.|
+.XO.OX.|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOO.|
+...O...|
+....*..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK434
+
+-------+
+.*.X.X.|
+.OX.XO.|
+.OXXOOO|
+.OXOO..|
+..OXXOO|
+..OOXX.|
+...X...|
+....X..|
+.......|
+
+:8,sFU
+
+
+Pattern JHK435
+
+-------+
+.X*O.O.|
+.XO.OX.|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOO.|
+...O...|
+....O..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK436
+
+-------+
+.OXX.X*|
+.OX.XO.|
+.OXXOOO|
+.OXOO..|
+..OXXOO|
+..OOXX.|
+...X...|
+....X..|
+.......|
+
+:8,sFU
+
+
+Pattern JHK437
+
+-------+
+.XOO.OX|
+.XO.OX*|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOO.|
+...O...|
+....O..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK438
+
+-------+
+.XOO.O.|
+.XO.OXO|
+.XOOXXX|
+.XOXX*.|
+..XOOXX|
+..XXOO.|
+...O...|
+....O..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK439
+
+-------+
+.OXX.X.|
+.OX.XOX|
+.OXXOOO|
+.OXOOX*|
+..OXXOO|
+..OOXX.|
+...X...|
+....X..|
+.......|
+
+:8,sFU
+
+
+Pattern JHK440
+
+-------+
+...O.O.|
+.XO.OX.|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOO*|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK441
+
+-------+
+.*.X.X.|
+.OX.XO.|
+.OXXOOO|
+.OXOO..|
+..OXXOO|
+..OOXXX|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK442
+
+-------+
+.X*O.O.|
+.XO.OX.|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOOO|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK443
+
+-------+
+.OXX.X.|
+.OX.XO.|
+.OXXOOO|
+.OXOO..|
+..OXXOO|
+..OOXXX|
+...X...|
+...*...|
+.......|
+
+:8,sFU
+
+
+Pattern JHK444
+
+-------+
+.XOO.O.|
+.XO.OX.|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOOO|
+...O...|
+...X*..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK445
+
+-------+
+.OXX.X.|
+.OX.XO.|
+.OXXOOO|
+.OXOO..|
+..OXXOO|
+..OOXXX|
+..*X...|
+...OX..|
+.......|
+
+:8,sFU
+
+
+Pattern JHK446
+
+-------+
+.XOO.O.|
+.XO.OX.|
+.XOOXXX|
+.XOXX..|
+..XOOXX|
+..XXOOO|
+..XO*..|
+...XO..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK447
+
+-------+
+.OXX.X.|
+.OX.XO.|
+.OXXOOO|
+.OXOO..|
+..OXXOO|
+..OOXXX|
+..OXX..|
+...OX..|
+...*...|
+
+:8,sFU
+
+
+Pattern JHK448
+
+-------+
+...O.O.|
+.XO.OX.|
+.XOOXX.|
+.XOXXO.|
+..XOOX.|
+..XXO*.|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK449
+
+-------+
+...X.X.|
+.OX.XO.|
+.OXXOO.|
+.OXOOX*|
+..OXXO.|
+..OOXX.|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK450
+
+-------+
+...O.O.|
+.XO.OX*|
+.XOOXX.|
+.XOXX.X|
+..XOOX.|
+..XXOO.|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK451
+
+-------+
+.*.X.X.|
+.OX.XOX|
+.OXXOO.|
+.OXOO.O|
+..OXXO.|
+..OOXX.|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK452
+
+-------+
+.X*O.O.|
+.XO.OXO|
+.XOOXX.|
+.XOXX.X|
+..XOOX.|
+..XXOO.|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK453
+
+-------+
+.OXX.X.|
+.OX.XOX|
+.OXXOO*|
+.OXOO.O|
+..OXXO.|
+..OOXX.|
+...X...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK454
+
+------+
+......|
+......|
+*.....|
+..XX..|
+...O..|
+.XXO..|
+..O...|
+
+:8,sFN
+
+
+Pattern JHK455
+
+------+
+......|
+......|
+X*....|
+..OO..|
+...X..|
+.OOX..|
+..X...|
+
+:8,sFU
+
+
+Pattern JHK456
+
+------+
+......|
+......|
+OX....|
+*.XX..|
+...O..|
+.XXO..|
+..O...|
+
+:8,sFN
+
+
+Pattern JHK457
+
+------+
+......|
+......|
+XO....|
+X.OO..|
+..*X..|
+.OOX..|
+..X...|
+
+:8,sFU
+
+
+Pattern JHK458
+
+-------+
+.......|
+.......|
+.OX....|
+*..XX..|
+....O..|
+..XXO..|
+...O...|
+
+:8,sFN
+
+
+Pattern JHK459
+
+------+
+......|
+......|
+XO....|
+*.OO..|
+...X..|
+.OOX..|
+..X...|
+
+:8,sFU
+
+
+Pattern JHK460
+
+------+
+......|
+......|
+......|
+..XX..|
+...O..|
+.XXO..|
+..O...|
+...*..|
+......|
+...X..|
+......|
+
+:8,sFU
+
+
+Pattern JHK461
+
+------+
+......|
+......|
+......|
+..XX..|
+...O..|
+.XXO..|
+..O...|
+...*..|
+......|
+..X...|
+......|
+
+:8,sFU
+
+
+Pattern JHK462
+
+-------+
+.......|
+.......|
+.......|
+.*.OO..|
+....X..|
+..OOX..|
+..XX...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK463
+
+-------+
+.......|
+.......|
+.......|
+...X*..|
+.......|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK464
+
+-------+
+.......|
+.......|
+.......|
+...OX..|
+....*..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK465
+
+-------+
+.......|
+.......|
+.......|
+...XO..|
+....X*.|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK466
+
+-------+
+.......|
+.......|
+.......|
+...OX..|
+...*OX.|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK467
+
+-----+
+.....|
+.....|
+.....|
+.XO..|
+.XXO.|
+XXO..|
+.O.*.|
+.....|
+
+:8,sFJ
+
+
+Pattern JHK468
+
+------+
+......|
+......|
+...*..|
+..OX..|
+..OOX.|
+.OOX..|
+..X.X.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK469
+
+------+
+......|
+......|
+...X..|
+..XO*.|
+..XXO.|
+.XXO..|
+..O.O.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK470
+
+-------+
+.......|
+.......|
+....O..|
+...OXX.|
+...OOX.|
+..OOX..|
+..*X.X.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK471
+
+-------+
+.......|
+.......|
+....X..|
+...XOO.|
+...XXO.|
+..XXO..|
+..XO.O.|
+...*...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK472
+
+-------+
+.......|
+.......|
+....*..|
+...OX..|
+.......|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK473
+
+-------+
+.......|
+.......|
+....X..|
+...XO..|
+....*..|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK474
+
+-------+
+.......|
+.......|
+...*O..|
+...OX..|
+....X..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK475
+
+-------+
+.......|
+.......|
+...XX..|
+...XO..|
+....O..|
+..XXO..|
+...O...|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK476
+
+------------+
+............|
+............|
+..*.....OO..|
+........OX..|
+.........X..|
+.......OOX..|
+........X...|
+............|
+.........X..|
+............|
+
+:8,sFJ
+
+
+Pattern JHK477
+
+-------+
+.......|
+.......|
+....X..|
+...XO..|
+.....*.|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK478
+
+-------+
+.......|
+.......|
+....O..|
+...OX*.|
+.....X.|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK479
+
+-------+
+.......|
+.......|
+....X..|
+...XOX.|
+....*O.|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK480
+
+-------+
+.......|
+.......|
+....O*.|
+...OXO.|
+....XX.|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK481
+
+-------+
+.......|
+.......|
+....XX.|
+...XOX.|
+....OO.|
+..XXO..|
+...O...|
+.......|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK482
+
+---------+
+.........|
+.........|
+......OO.|
+...*.OXO.|
+......XX.|
+....OOX..|
+.....X...|
+.........|
+.........|
+......X..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK483
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+....*..|
+..OOX..|
+..XX...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JHK484
+
+-------+
+.......|
+.......|
+...*X..|
+...O...|
+.......|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK485
+
+-------+
+.......|
+.......|
+...XO..|
+...X*..|
+.......|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK486
+
+-------+
+.......|
+.......|
+...OX..|
+...OX..|
+....*..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK487
+
+-------+
+.......|
+.......|
+...XO..|
+...XO..|
+....X*.|
+..XXO..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK488
+
+-------+
+.......|
+.......|
+...OX..|
+...OX..|
+...*OX.|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK489
+
+-------+
+.......|
+.......|
+...XO..|
+...XO..|
+...XXO.|
+..XXO..|
+...O.*.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK490
+
+--------+
+........|
+........|
+....OX..|
+....OX..|
+....OOX.|
+...OOX..|
+...*X.X.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK491
+
+-------+
+.......|
+.......|
+....X..|
+...O...|
+....*..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK492
+
+---------+
+.........|
+....*....|
+......O..|
+.....X...|
+......X..|
+....XXO..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK493
+
+---------+
+.........|
+....X....|
+......X..|
+.....O...|
+......O..|
+....OOX..|
+.....X*..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK494
+
+---------+
+.........|
+....O....|
+..*...O..|
+.....X...|
+......X..|
+....XXO..|
+.....OX..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK495
+
+-------+
+.......|
+.......|
+...*X..|
+...O...|
+....O..|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK496
+
+-------+
+.......|
+.......|
+...OX..|
+...O*..|
+....OX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK497
+
+-------+
+.......|
+.......|
+...OX*.|
+...OOX.|
+....OX.|
+..OOX..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK498
+
+-------+
+.......|
+.......|
+.*.XX..|
+...O...|
+....O..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK499
+
+-------+
+.......|
+*X.....|
+.O.XX..|
+...O...|
+....O..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK500
+
+-------+
+.......|
+OXX....|
+*O.XX..|
+...O...|
+....O..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK501
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+.....*.|
+..XXO..|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK502
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+....*X.|
+..OOX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK503
+#reverts to as if w jumped
+
+-------+
+.......|
+.......|
+.......|
+...X*..|
+....XO.|
+..XXO..|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK504
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+....XO.|
+..XXO*.|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK505
+
+-------+
+.......|
+.......|
+....*..|
+...O...|
+....OX.|
+..OOXX.|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK506
+
+-------+
+.......|
+.......|
+.......|
+...O.*.|
+.....X.|
+..OOX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK507
+
+-------+
+.......|
+.......|
+.......|
+...X*X.|
+.....O.|
+..XXO..|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK508
+#reverts to w jump
+
+-------+
+.......|
+.......|
+....*..|
+...OXO.|
+.....X.|
+..OOX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK509
+
+-------+
+.......|
+.......|
+...X...|
+...O...|
+....*..|
+..OOX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK510
+
+-------+
+.......|
+.......|
+..XX*..|
+...O...|
+....O..|
+..OOX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK511
+
+-------+
+.......|
+....X..|
+..XXO*.|
+...O...|
+....O..|
+..OOX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK512
+
+-----------+
+...........|
+...........|
+....*.XX...|
+.O.....O...|
+........O..|
+......OOX..|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK513
+
+-----------+
+...........|
+...........|
+....O.XX...|
+.O..*X.O...|
+........O..|
+......OOX..|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK514
+
+-----------+
+...........|
+...........|
+....O.XX...|
+.O..OX.O...|
+.....X..O..|
+...*..OOX..|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK515
+
+-----------+
+...........|
+...........|
+....O.XX...|
+.O..OX.O...|
+.....X..O..|
+...O..OOX..|
+....X.*X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK516
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+....*..|
+...OX..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK517
+
+------+
+......|
+......|
+......|
+..X...|
+...X..|
+.*XO..|
+..O...|
+......|
+
+:8,sFU
+
+
+Pattern JHK518
+
+------+
+......|
+......|
+......|
+..O...|
+..*O..|
+.XOX..|
+..X...|
+......|
+
+:8,sFJ
+
+
+Pattern JHK519
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...XX..|
+..OXO..|
+..*O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK520
+
+-------+
+.......|
+.......|
+.......|
+.*.O...|
+...OO..|
+..XOX..|
+..XX...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK521
+
+------+
+......|
+......|
+......|
+..O...|
+..OO..|
+.XOX..|
+.XX*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK522
+
+------+
+......|
+......|
+......|
+..X...|
+..XX..|
+.OXO..|
+.OOX..|
+...*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK523
+
+------+
+......|
+......|
+......|
+..O...|
+..OO..|
+.XOX*.|
+.XXO..|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK524
+
+------+
+......|
+......|
+......|
+..X...|
+..XX..|
+.OX.X.|
+.OOX*.|
+...O..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK525
+
+-------+
+.......|
+.......|
+.......|
+.*.O...|
+...OO..|
+..XO.O.|
+..XXOX.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK526
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...XX..|
+..OXO..|
+...O*..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK527
+
+-------+
+.......|
+.......|
+.......|
+.*.O...|
+...OO..|
+..XOX..|
+...XX..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK528
+
+------+
+......|
+......|
+...*..|
+X.X...|
+..XX..|
+.OXO..|
+
+:8,sFN
+
+
+Pattern JHK529
+
+------+
+......|
+..*...|
+...X..|
+O.O...|
+..OO..|
+.XOX..|
+
+:8,sFJ
+
+
+Pattern JHK530
+
+------+
+......|
+..X...|
+...O..|
+X.X.*.|
+..XX..|
+.OXO..|
+
+:8,sFN
+
+
+Pattern JHK531
+
+------+
+......|
+..O...|
+...X..|
+O.O.X.|
+..OO*.|
+.XOX..|
+
+:8,sFJ
+
+
+Pattern JHK532
+
+------+
+......|
+..X...|
+..*O..|
+X.X.O.|
+..XXX.|
+.OXO..|
+
+:8,sFN
+
+
+Pattern JHK533
+
+------+
+......|
+..O...|
+.*XX..|
+O.O.X.|
+..OOO.|
+.XOX..|
+
+:8,sFJ
+
+
+Pattern JHK534
+
+------+
+......|
+..X*..|
+.XOO..|
+X.X.O.|
+..XXX.|
+.OXO..|
+
+:8,sFN
+
+
+Pattern JHK535
+
+------+
+......|
+.*OX..|
+.OXX..|
+O.O.X.|
+..OOO.|
+.XOX..|
+
+:8,sFJ
+
+
+Pattern JHK536
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...XX..|
+..OXO*.|
+...O...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK537
+
+--------+
+........|
+........|
+........|
+....O...|
+....OO..|
+...XOXX.|
+...*X...|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK538
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...XX..|
+..OXOO.|
+..XO...|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK539
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+...OO..|
+.*XOXX.|
+..OX...|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK540
+
+--------+
+........|
+........|
+........|
+....X...|
+....XX..|
+..XOXOO.|
+...XO...|
+...*O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK541
+
+--------+
+........|
+........|
+........|
+....O...|
+....OO..|
+..OXOXX.|
+..*OX...|
+...XX...|
+........|
+
+:8,sFJ
+
+
+Pattern JHK542
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...XX*.|
+.XOXOO.|
+.XXO...|
+..OO...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK543
+
+------+
+......|
+......|
+...*..|
+..O...|
+..OOX.|
+OXOXX.|
+OOX...|
+.XX...|
+
+:8,sFJ
+
+
+Pattern JHK544
+
+------+
+......|
+......|
+...*..|
+..X.X.|
+..XXO.|
+XOXOO.|
+XXO...|
+.OO...|
+
+:8,sFJ
+
+
+Pattern JHK545
+
+-------+
+.......|
+.......|
+...*O..|
+...XXX.|
+...XXO.|
+.XOXOO.|
+.XXO...|
+..OO...|
+
+:8,sFJ
+
+
+Pattern JHK546
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+.......|
+...OX..|
+...X*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK547
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...*...|
+...XO..|
+...OX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK548
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+...X...|
+..*OX..|
+...XO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK549
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+...O*..|
+..XXO..|
+...OX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK550
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..*XX..|
+..OOX..|
+...XO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK551
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+..XOO..|
+..XXO..|
+...OX..|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK552
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..OXX..|
+..OOX..|
+...XO*.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK553
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+..XOO..|
+..XXO..|
+...OXX.|
+....O*.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK554
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..OXX..|
+..OOX..|
+..*XOO.|
+....XX.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK555
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+..XOO..|
+..XXO..|
+..XOXX.|
+...*OO.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK556
+
+-------+
+.......|
+.......|
+.......|
+...O*..|
+..OXX..|
+..OOX..|
+..OXOO.|
+...XXX.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK557
+
+-------+
+.......|
+.......|
+.......|
+...XX..|
+..XOO..|
+..XXO*.|
+..XOXX.|
+...OOO.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK558
+
+-------+
+.......|
+.......|
+.......|
+...OO..|
+..OXX*.|
+..OOXX.|
+..OXOO.|
+...XXX.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK559
+
+-------+
+.......|
+.......|
+.......|
+...XX..|
+..XOOX.|
+..XXOO.|
+..XOXX*|
+...OOO.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK560
+
+-------+
+.......|
+.......|
+.*.....|
+...OO..|
+..OXXO.|
+..OOXX.|
+..OX..X|
+...XXX.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK561
+
+------+
+......|
+......|
+......|
+..O...|
+..*X..|
+..OX..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK562
+
+------+
+......|
+......|
+......|
+..O.X.|
+...*..|
+..OX..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK563
+
+------+
+......|
+......|
+......|
+..O.X.|
+...OX.|
+..OX..|
+...*..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK564
+
+------+
+......|
+......|
+......|
+..O.X.|
+...OX.|
+..OXX.|
+..*O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK565
+
+------+
+......|
+......|
+...X..|
+..O...|
+...*..|
+..OX..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK566
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+...X*..|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+-------+
+.......|
+.......|
+.......|
+...OB..|
+..AX*..|
+...CX..|
+.......|
+.......|
+.......|
+
+;!oplay_attack(*,A,B,C)
+
+
+Pattern JHK567
+
+-------+
+.......|
+.......|
+.......|
+...O*..|
+..XXO..|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK568
+
+-------+
+.......|
+.......|
+.......|
+.*.OO..|
+..XXO..|
+...OX..|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK569
+
+--------+
+........|
+........|
+........|
+..O.OO..|
+.*XXXO..|
+....OX..|
+.....X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK570
+
+--------+
+........|
+........|
+...*....|
+..OXOO..|
+.OXXXO..|
+....OX..|
+.....X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK571
+
+--------+
+........|
+........|
+...O....|
+.*OXOO..|
+.OXXXO..|
+....OX..|
+...X.X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK572
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..XXO*.|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK573
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..XXO..|
+...OX..|
+...*...|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK574
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..*X...|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+-------+
+.......|
+.......|
+.......|
+...OB..|
+..*XA..|
+...CX..|
+.......|
+.......|
+.......|
+
+;!oplay_attack(A,*,B,C)
+
+
+Pattern JHK575
+
+-------+
+.......|
+.......|
+.......|
+..*O...|
+..OXX..|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK576
+
+-------+
+.......|
+.......|
+.......|
+..OO...|
+..OXX..|
+..*OX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK577
+
+-------+
+.......|
+.......|
+....*..|
+..OOX..|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK578
+
+-------+
+.......|
+.....*.|
+....OX.|
+..OOX..|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK579
+
+-------+
+.......|
+....XO.|
+...*OX.|
+..OOX..|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK580
+
+-------+
+.......|
+...*XO.|
+...OOX.|
+..OOXX.|
+..OXX..|
+..OOX..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK581
+
+-------+
+.......|
+....XOX|
+...OOX.|
+..OOX..|
+..OXX..|
+..OOX..|
+...X*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK582
+
+-------+
+.......|
+....XOX|
+...OOX.|
+..OOX..|
+..OXX..|
+..OOX..|
+...XO*.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK583
+
+-------+
+.....X.|
+....X.X|
+...OOX.|
+..OOX..|
+..OXX..|
+..OOX..|
+...XOO.|
+....X..|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK584
+
+-------+
+.....X.|
+....X.X|
+...OOX.|
+..OOX..|
+..OXX..|
+..OOX..|
+..XXOO.|
+....X*.|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK585
+
+---------+
+.......X.|
+......X.X|
+.....OOX.|
+.*..OOX..|
+....OXX..|
+....OOX..|
+...XXXOO.|
+......XO.|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK586
+
+-------+
+.......|
+.......|
+.......|
+...O*..|
+..OXX..|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK587
+
+-------+
+.......|
+.......|
+.......|
+..*XX..|
+..XOO..|
+...XO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK588
+
+-------+
+.......|
+.......|
+..*....|
+.XOXX..|
+..XOO..|
+...XO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK589
+
+-------+
+.......|
+...*...|
+.XO....|
+.XOXX..|
+..XOO..|
+...XO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK590
+
+-------+
+.......|
+.X.O...|
+.XO.*..|
+.XOXX..|
+..XOO..|
+...XO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK591
+
+-------+
+.......|
+.X.O...|
+.XO.O*.|
+.XOXXX.|
+..XOO..|
+...XO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK592
+
+-------+
+.......|
+.......|
+...*...|
+...O...|
+..OXX..|
+...OX..|
+.......|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK593
+
+--------+
+........|
+........|
+..*.....|
+....O...|
+........|
+.....X..|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JHK594
+
+-------+
+.......|
+.......|
+.X.....|
+...X.*.|
+.......|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK595
+
+------+
+......|
+......|
+O..*..|
+..O.X.|
+......|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK596
+
+-------+
+.......|
+.......|
+.X..X..|
+...X.O.|
+.......|
+....O..|
+.......|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK597
+
+-----------+
+...........|
+...........|
+...*.X..X..|
+.......X.O.|
+...........|
+........O..|
+...........|
+...........|
+........O..|
+...........|
+
+:8,sFj
+
+
+Pattern JHK598
+
+----------+
+..........|
+..........|
+..O.X..X*.|
+......X.O.|
+..........|
+.......O..|
+..........|
+..........|
+.......O..|
+..........|
+
+:8,sFj
+
+
+Pattern JHK599
+
+---------+
+.........|
+.....*.X.|
+.O.X..XO.|
+.....X.O.|
+.........|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK600
+
+---------+
+.........|
+.....OXX.|
+.O.X*.XO.|
+.....X.O.|
+.........|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK601
+
+-------+
+.......|
+.......|
+.X..X..|
+...X.O.|
+.......|
+....O..|
+.......|
+...*...|
+.......|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK602
+
+-------+
+.......|
+.......|
+.X..X..|
+...X.O.|
+.......|
+....O..|
+.......|
+...*...|
+.......|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK603
+
+-----------+
+...........|
+...........|
+...*.X..X..|
+.......X.O.|
+...........|
+........O..|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK604
+
+-------+
+.......|
+.......|
+.O..*..|
+...OX..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK605
+
+-------+
+.......|
+.......|
+.X..X*.|
+...XO..|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK606
+
+-------+
+.......|
+.......|
+.O.*OX.|
+...OX..|
+.......|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK607
+
+------+
+......|
+......|
+X.XXO.|
+..XO..|
+....*.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK608
+
+-------+
+.......|
+.....X*|
+.X.XXO.|
+...XO..|
+.....O.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK609
+
+------+
+......|
+...X..|
+X..XO.|
+..XO..|
+....*.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK610
+
+------+
+......|
+...XX.|
+X..XO.|
+..XO..|
+..*.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK611
+
+------+
+......|
+...XX*|
+X..XO.|
+.XXO..|
+..O.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK612
+
+------+
+......|
+...XX.|
+X..XOX|
+.*XO..|
+..O.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK613
+
+------+
+......|
+......|
+O..OX.|
+..OX..|
+...*..|
+...X..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK614
+
+------+
+......|
+......|
+X..XO.|
+..XO*.|
+...X..|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK615
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OXX.|
+...*O..|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK616
+
+------+
+......|
+......|
+X..XO.|
+..XOO.|
+..XX*.|
+...O..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK617
+
+-------+
+.......|
+....*..|
+.O..OX.|
+...OXX.|
+...OOX.|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK618
+
+-------+
+.......|
+....X..|
+.X..XO.|
+...XOO.|
+...XXO.|
+...*O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK619
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OXX.|
+....O*.|
+....X..|
+.......|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK620
+
+-------+
+.......|
+.......|
+.X..XO.|
+...XOO.|
+...*XX.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK621
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OXX.|
+...XOO.|
+....X*.|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK622
+
+-------+
+.......|
+.......|
+.X..XO.|
+...XOO.|
+...OXX.|
+...*OX.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK623
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OXX.|
+...XOO.|
+...XXO.|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK624
+
+-------+
+.......|
+.......|
+.X..XO.|
+...XOO.|
+...OXX.|
+...OOX.|
+...*X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK625
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OXX.|
+...XOO.|
+...XXO.|
+...XO..|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK626
+
+-------+
+.......|
+.......|
+.X.*XO.|
+...XOO.|
+...OXX.|
+...OOX.|
+
+:8,sFJ
+
+
+Pattern JHK627
+
+-------+
+.......|
+.......|
+.O.XOX.|
+..*OXX.|
+...XOO.|
+...XXO.|
+
+:8,sFJ
+
+
+Pattern JHK628
+
+-------+
+.......|
+...*...|
+.X.OXO.|
+..XXOO.|
+...OXX.|
+...OOX.|
+
+:8,sFJ
+
+
+Pattern JHK629
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OXX.|
+....O..|
+...*X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHK630
+
+------+
+......|
+......|
+X..XO.|
+..XOO.|
+...X*.|
+..XO..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK631
+
+-------+
+.......|
+.....*.|
+.O..OX.|
+...OX..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK632
+
+------+
+......|
+....O.|
+O..OX*|
+..OX..|
+....X.|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK633
+
+-------+
+.......|
+.....X.|
+.X..XOX|
+...XO..|
+...*.O.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK634
+
+-------+
+.......|
+.....O.|
+.O..OXO|
+..*OX..|
+...X.X.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK635
+
+------+
+......|
+....X.|
+X..XOX|
+.XXO*.|
+..O.O.|
+...O..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK636
+
+------+
+......|
+..*.O.|
+O..OXO|
+.OOXX.|
+..X.X.|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHK637
+
+-------+
+.......|
+.....O.|
+.O..OXO|
+...OX*.|
+...X.X.|
+....X..|
+.......|
+
+:8,sFN
+
+
+Pattern JHK638
+
+-------+
+.......|
+.....X.|
+.X..X.X|
+..*XOX.|
+...O.O.|
+....O..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK639
+
+-------+
+.......|
+.......|
+.O..OX.|
+...OX*.|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK640
+
+-------+
+.......|
+.......|
+.X..XO.|
+...XOX.|
+....*..|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK641
+
+-------+
+.......|
+.....*.|
+.O..OX.|
+...OXO.|
+....X..|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK642
+
+-------+
+.......|
+.....X.|
+.X.*XO.|
+...XOX.|
+....O..|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK643
+
+-------+
+.......|
+....*O.|
+.O.XOX.|
+...OXO.|
+....X..|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK644
+
+-------+
+.......|
+....XX.|
+.X.OXO.|
+..*XOX.|
+....O..|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK645
+
+-------+
+.......|
+.......|
+.O..X..|
+...O*..|
+.......|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK646
+
+-------+
+.......|
+.......|
+.O..X..|
+...OOX.|
+.....*.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK647
+
+-------+
+.......|
+.......|
+.O..XX.|
+...OOX.|
+....*O.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK648
+
+-------+
+.......|
+.....X.|
+.O..X..|
+...OOX*|
+.....O.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK649
+
+-------+
+.......|
+.....X.|
+.O..X*X|
+...OOXO|
+.....O.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK650
+
+-------+
+.......|
+.....X.|
+.O..XX.|
+...OOXO|
+....*O.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK651
+
+------+
+......|
+......|
+......|
+..X...|
+......|
+.X.O..|
+......|
+..*...|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHK652
+
+---------+
+.........|
+.........|
+...*.....|
+.....X...|
+.........|
+......O..|
+.........|
+
+:8,sFt
+
+
+Pattern JHK653
+
+-------+
+.......|
+.......|
+.X.....|
+...O...|
+..*....|
+....X..|
+.......|
+
+:/,sFJ
+
+
+Pattern JHK654
+
+-------+
+.......|
+.......|
+.O..*..|
+...X...|
+..X....|
+....O..|
+.......|
+
+:/,sFJ
+
+
+Pattern JHK655
+
+-------+
+.......|
+.......|
+.X..X..|
+...O*..|
+..O....|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK656
+
+-------+
+.......|
+.......|
+.O.*O..|
+...XX..|
+..X....|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK657
+
+--------+
+........|
+........|
+..X.XX..|
+....OO..|
+.*.O....|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHK658
+
+-------+
+.......|
+.......|
+.O.OO..|
+..*XX..|
+X.X....|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK659
+
+-------+
+.......|
+.......|
+.X.XX..|
+..XOO..|
+O.O*...|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK660
+
+-------+
+.......|
+.......|
+.O.OO..|
+..OXX*.|
+X.XX...|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK661
+
+-------+
+.......|
+.......|
+.X.XX..|
+..XOOX.|
+O.OO.*.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK662
+
+-------+
+.......|
+.......|
+.O.OO*.|
+..OXXO.|
+X.XX.X.|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK663
+
+-------+
+.......|
+.......|
+.X.XXX.|
+..XOOX.|
+O.OO*O.|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK664
+
+---------+
+.........|
+.........|
+...X.....|
+...*.O...|
+.........|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK665
+
+---------+
+.........|
+.........|
+...O.....|
+..*X.X...|
+.........|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK666
+
+---------+
+.........|
+.........|
+...X.....|
+..XO.O...|
+...*.....|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK667
+
+---------+
+.........|
+.........|
+...O..*..|
+..OX.X...|
+...X.....|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK668
+
+---------+
+.........|
+.........|
+...X*.X..|
+..XO.O...|
+...O.....|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK669
+
+---------+
+.........|
+.........|
+...OX.O..|
+..OX.X*..|
+...X.....|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK670
+
+---------+
+.........|
+.........|
+..*XO.X..|
+..XO.OX..|
+...O.....|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK671
+
+---------+
+.........|
+.........|
+...O.*O..|
+..OX.XX..|
+...X.....|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHK672
+
+--------+
+........|
+........|
+..X.....|
+..*.O...|
+........|
+.....X..|
+........|
+........|
+........|
+.....O..|
+
+:8,sFJ
+
+
+Pattern JHK673
+
+---------+
+.........|
+.........|
+.........|
+...*.X...|
+.........|
+......O..|
+.........|
+
+:8,sFt
+
+
+Pattern JHK674
+
+-------+
+.......|
+.......|
+.......|
+.X.O...|
+..*....|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK675
+
+-------+
+.......|
+.......|
+....*..|
+.O.X...|
+..X....|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK676
+
+-------+
+.......|
+.......|
+....X..|
+.X.O*..|
+..O....|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK677
+
+-------+
+.......|
+.......|
+...*O..|
+.O.XX..|
+..X....|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK678
+
+-------+
+.......|
+.......|
+...XX*.|
+.X.OO..|
+..O....|
+....X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK679
+
+-------+
+.......|
+.......|
+...OOX.|
+.O*XX..|
+..X....|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK680
+
+-------+
+.......|
+.......|
+...XXO.|
+.XXOO..|
+..O....|
+...*X..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK681
+
+-------+
+.......|
+.....*.|
+...OOX.|
+.OOXX..|
+..X....|
+...XO..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK682
+
+-------+
+.......|
+.....X.|
+...XXO.|
+.XXOO*.|
+..O....|
+...OX..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK683
+
+-------+
+.......|
+.......|
+.......|
+.O.X...|
+.......|
+...XO..|
+...*...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHK684
+
+-----------+
+...........|
+...........|
+........X..|
+.......O*..|
+...........|
+........X..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK685
+
+--------+
+........|
+........|
+....*O..|
+....XX..|
+........|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK686
+
+--------+
+........|
+........|
+....XX..|
+...*OO..|
+........|
+.....X..|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK687
+
+--------+
+........|
+........|
+....OO..|
+...XXX*.|
+........|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK688
+
+--------+
+........|
+........|
+....XX..|
+...OOOX.|
+......*.|
+.....X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK689
+
+--------+
+........|
+........|
+....OO*.|
+...XXXO.|
+......X.|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK690
+
+--------+
+........|
+........|
+....XXX.|
+...OOOX.|
+.....*O.|
+.....X..|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JHK691
+
+--------+
+........|
+........|
+..*.OOO.|
+...XXXO.|
+.....XX.|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK692
+
+--------+
+........|
+........|
+..X.XXX.|
+...OOOX.|
+.....OO.|
+....*X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHK693
+
+-----------+
+...........|
+...........|
+.....O.OOO.|
+......XXXO.|
+........XX.|
+......*.O..|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFj
+
+
+Pattern JHK694
+
+-----------+
+...........|
+...........|
+.....X.XXX.|
+.....*OOOX.|
+........OO.|
+......X.X..|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JHK695
+
+-----------+
+...........|
+...........|
+....*O.OOO.|
+.....XXXXO.|
+........XX.|
+......O.O..|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JHK696
+
+-----------+
+...........|
+...........|
+....XX.XXX.|
+....*OOOOX.|
+........OO.|
+......X.X..|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFj
+
+
+Pattern JHK697
+
+-----------+
+...........|
+...........|
+...........|
+.O.....O...|
+...........|
+........X..|
+...........|
+........*..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK698
+
+------------+
+............|
+............|
+.........*..|
+..X.....X...|
+............|
+.........O..|
+............|
+.........X..|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JHK699
+
+-----------+
+...........|
+...........|
+.......*X..|
+.O.....O...|
+...........|
+........X..|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK700
+
+-----------+
+...........|
+...........|
+...........|
+.O.....O...|
+...........|
+........X..|
+...........|
+...........|
+.......*...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK701
+
+-----------+
+...........|
+...........|
+...........|
+.X.....X...|
+...........|
+......*.O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK702
+
+-----------+
+...........|
+...........|
+...........|
+.O...*.O...|
+...........|
+......X.X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK703
+
+-----------+
+...........|
+...........|
+...........|
+.X...X.X.*.|
+...........|
+......O.O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK704
+
+-----------+
+...........|
+...........|
+........*..|
+.O...O.O.X.|
+...........|
+......X.X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK705
+
+-----------+
+...........|
+...........|
+........X..|
+.X...X.X.O.|
+...........|
+......O.O..|
+...........|
+...........|
+.......X.*.|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK706
+
+-----------+
+...........|
+...........|
+........O..|
+.O...O.O.X.|
+...........|
+....*.X.X..|
+...........|
+...........|
+.......O.X.|
+...........|
+
+:8,sFj
+
+
+Pattern JHK707
+
+-----------+
+...........|
+...........|
+........X..|
+.X...X.X.O.|
+...........|
+....*.O.O..|
+...........|
+...........|
+.......X.O.|
+...........|
+
+:8,sFj
+
+
+Pattern JHK708
+
+-----------+
+...........|
+...........|
+........O..|
+.O...O.O.X.|
+...........|
+......X.X..|
+.......*...|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK709
+
+-----------+
+...........|
+...........|
+........X..|
+.X...X.X.O.|
+...........|
+......O*O..|
+.......X...|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK710
+
+-----------+
+...........|
+...........|
+........O..|
+.O...O.O.X.|
+...........|
+......XXX..|
+.......O*..|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK711
+
+-----------+
+...........|
+...........|
+........X..|
+.X...X.X.O.|
+...........|
+......OOO..|
+.......XX*.|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK712
+
+-----------+
+...........|
+...........|
+........O..|
+.O...O.O.X.|
+...........|
+......XXX..|
+.......OOX.|
+.........*.|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK713
+
+-----------+
+...........|
+...........|
+........X..|
+.X...X.X.O.|
+...........|
+......OOO*.|
+.......XXO.|
+.........X.|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK714
+
+-----------+
+...........|
+...........|
+...........|
+.X.....X.*.|
+.....X.....|
+......O.O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK715
+
+-----------+
+...........|
+...........|
+........*..|
+.O.....O.X.|
+.....O.....|
+......X.X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK716
+
+-----------+
+...........|
+...........|
+........X..|
+.X.....X.O.|
+.....X.....|
+......O.O..|
+...........|
+...........|
+.......X.*.|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK717
+
+-----------+
+...........|
+...........|
+...........|
+.......O...|
+...........|
+........X..|
+...........|
+...........|
+.......*...|
+...........|
+
+:8,sFj
+
+
+Pattern JHK718
+
+-----------+
+...........|
+...........|
+........*..|
+.......X...|
+...........|
+........O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK719
+
+-----------+
+...........|
+...........|
+........X..|
+.......O*..|
+...........|
+........X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK720
+
+-----------+
+...........|
+...........|
+.......*O..|
+.......XX..|
+...........|
+........O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK721
+
+-----------+
+...........|
+...........|
+.......XX..|
+......*OO..|
+...........|
+........X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK722
+
+-----------+
+...........|
+...........|
+.......OO..|
+......XXX*.|
+...........|
+........O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK723
+
+-----------+
+...........|
+...........|
+.......XX..|
+......OOOX.|
+.........*.|
+........X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK724
+
+-----------+
+...........|
+...........|
+.......OO*.|
+......XXXO.|
+.........X.|
+........O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK725
+
+-----------+
+...........|
+...........|
+.......XXX.|
+......OOOX.|
+........*O.|
+........X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK726
+
+-----------+
+...........|
+...........|
+.....*.OOO.|
+......XXXO.|
+........XX.|
+........O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK727
+
+-----------+
+...........|
+...........|
+...........|
+.......X...|
+...........|
+......*.O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK728
+
+-----------+
+...........|
+...........|
+...........|
+.....*.O...|
+...........|
+......X.X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK729
+
+-----------+
+...........|
+...........|
+...........|
+.....X.X.*.|
+...........|
+......O.O..|
+...........|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK730
+
+-----------+
+...........|
+...........|
+........*..|
+.....O.O.X.|
+...........|
+......X.X..|
+...........|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK731
+
+-----------+
+...........|
+...........|
+........X..|
+.....X.X.O.|
+...........|
+......O.O..|
+...........|
+...........|
+.......X.*.|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK732
+
+-----------+
+...........|
+...........|
+.*......O..|
+.....O.O.X.|
+...........|
+......X.X..|
+...........|
+...........|
+.......O.X.|
+...........|
+
+:8,sFJ
+
+
+Pattern JHK733
+
+-----------+
+...........|
+...........|
+.X......X..|
+.....X.X.O.|
+...........|
+......O.O..|
+...........|
+...........|
+.......X*O.|
+...........|
+
+:8,sFj
+
+
diff --git a/patterns/hoshi_keima.sgf b/patterns/hoshi_keima.sgf
new file mode 100644 (file)
index 0000000..07d77eb
--- /dev/null
@@ -0,0 +1,715 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by the Free Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation - version 3 or
+at your option any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19]HA[0]
+GN[Hoshi+keima joseki database]
+;B[pd]C[0];W[qf];C[#kogeima kakari]
+(;B[qh]C[j
+]MA[mj];C[#hasami]
+(;W[qc]C[S]MA[mj];C[#w invades]
+(;B[pc]C[#Not good unless B has stone around K17];C[#b blocks on left]
+;W[qd]C[S]MA[nh];B[pe]C[U
+]MA[nh]
+(;W[qb]C[S]MA[mj];B[pf]C[S]MA[mj]
+(;W[rf]C[S]MA[mj];B[oh]C[S]MA[mj])
+
+(;W[qg]C[0]MA[mj];B[pg]C[S]MA[mj])
+)
+
+(;W[rf]C[S]MA[mj];B[og]C[S]MA[ni])
+
+(;W[qe]C[0]MA[mj];B[og]C[S]MA[ni])
+)
+
+(;B[qd]C[S]MA[ij];C[#b blocks below];W[pc]C[S]MA[mj]
+(;B[od]C[S
+:-,reverse_followup(10),followup(15)
+]MA[mi];W[rd]C[S]
+MA[mi];B[re]C[S]MA[mi];W[rc]C[S]MA[mi]
+(;B[qe]C[S]MA[mi];W[nc]C[S]MA[mi];B[pf]C[S]MA[mj])
+
+(;B[oc]C[0
+]MA[mi])
+
+(;B[rf]C[T
+]MA[mi];W[nc]C[S
+]MA[li])
+)
+
+(;B[oc]C[0
+# Non-joseki often played against GNU Go
+]MA[mi];W[rc]
+MA[lg]C[U
+];B[rd];W[od]MA[lg]C[U
+]
+(;B[nc];W[pe]MA[lg]C[S
+];B[oe];W[nd]MA[lg]C[U
+])
+
+(;B[oe];W[nd]MA[lg]C[U
+];B[nc];W[pe]MA[lg]C[U
+];B[of];W[md]MA[kg]C[U
+])
+
+(;B[ob];W[pe]MA[li])
+)
+)
+
+(;B[pf]MA[nj]C[0
+])
+)
+
+(;W[of];C[#w jumps];B[nd]MA[mj]C[S]
+(;W[pi]C[0]
+(;B[qi]MA[mk]C[S];W[pj]MA[ml]C[0]
+(;B[ph]MA[mk]C[S];W[oh]MA[mk];B[qj]MA[ml]C[S];W[pk]MA[mm];B[ql]MA[mm]
+C[S];W[pg]MA[mm])
+
+(;B[qj];W[pk]MA[ml];B[ph]MA[ml];W[oh]MA[ml])
+)
+
+(;B[ph];W[oh]MA[mk]
+(;B[qi]MA[mk];W[pj]MA[mk])
+
+(;B[oi];W[qi]MA[lk];B[og]MA[lk];W[nh]MA[lk];B[pg]MA[lk];W[ng]MA[lk];
+B[pf]MA[lk];W[rh]MA[lk];B[nf]MA[lk])
+)
+
+(;B[qe]
+(;W[rf]C[#considered outdated
+]
+(;B[qi]MA[lk];W[pj]MA[lk]
+(;B[ph]MA[lk];W[oh]MA[lk];B[qj]MA[ll];W[pk]MA[ll]
+(;B[ql]MA[km];W[pg]MA[km])
+
+(;B[pg];W[pf]MA[ll];B[og]MA[ll];W[ng]MA[ll];B[nh]MA[ll];W[oi]MA[ll];
+B[nf]MA[ll];W[mg]MA[ll];B[ql]MA[ln];W[qc]MA[ll];B[pc]MA[lk];W[qd]
+MA[lk];B[qb]MA[lk];W[pe]MA[lk];B[mf]MA[kk];W[rb]MA[lj];B[lg]MA[jk];
+W[mh]MA[jk];B[li]MA[jk];W[mi]MA[jk];B[mj]MA[jl])
+)
+
+(;B[qj];W[pk]MA[ll];B[ph]MA[ll];W[oh]MA[ll])
+)
+
+(;B[ph];W[oh]MA[lk];B[qi]MA[ll];W[pj]MA[lk])
+)
+
+(;W[qi]MA[lk];B[rf]MA[lk];W[qg]MA[lk])
+)
+)
+
+(;W[qc]C[0
+];B[qd]MA[mi];W[rd];B[re]MA[mi];W[rc];B[qe]MA[mi];W[ob];
+B[mf]C[t
+]MA[ki])
+
+(;W[oh];B[qe]MA[kj];W[rf]MA[kj];B[qj]MA[kj];W[mf]MA[kj])
+
+(;W[mf]C[#bad for white
+];B[ld]MA[ki])
+
+(;W[rd]MA[mj]C[0
+#bad for white
+])
+)
+
+(;W[nc]MA[ki];B[pf]MA[li]
+(;W[pg]MA[li];B[qg]MA[li]
+(;W[qc];B[qe]MA[li];W[pc]MA[li])
+
+(;W[pc]MA[li]
+(;B[qe]MA[li];W[qc]MA[li]
+(;B[tt];W[rf]MA[li];B[re]MA[li];W[of]MA[li];B[pe]MA[li];W[ne]MA[li])
+
+(;B[og]MA[li]C[0
+])
+)
+
+(;B[qc]MA[li]C[0
+];W[pe]MA[li];B[of];W[qd]MA[li];B[od]
+(;W[oe]MA[li];B[ne];W[qe]MA[ki];B[nd]
+(;W[nf]MA[li])
+
+(;W[ph]MA[li]C[0
+])
+)
+
+(;W[ph]C[0
+]MA[li])
+)
+)
+)
+
+(;W[qc]MA[li]
+(;B[qd]MA[li];W[pc]MA[li]
+(;B[od]MA[li];W[rc]MA[li];B[rd]MA[li]C[j
+])
+
+(;B[tt];W[od]MA[li];B[oe];W[ne]MA[li])
+)
+
+(;B[pc]MA[li];W[qd]MA[li];B[pe]MA[li];W[rf]MA[li];B[pb]MA[li];W[qb]
+MA[li];B[md]MA[li])
+
+(;B[qe]MA[li];W[pc]MA[li])
+)
+)
+)
+
+(;B[nd]C[j
+]MA[kh];C[#ikken tobi]
+(;W[lc]C[t
+]MA[ih]
+(;B[nf]C[S]MA[ih])
+
+(;B[me]MA[ih]C[S])
+)
+
+(;W[rd]
+C[j
+# This is usually bad if W has already an extension to hoshi.
+]
+MA[mj]
+(;B[tt];W[qc]C[j
+]MA[mi])
+
+(;B[qh]C[S]MA[mj]
+(;W[qc]C[S]MA[mj];B[qe]C[S]MA[mj];W[re]C[S]MA[mj];B[pf]C[S]MA[lj]
+(;W[pg]C[;!xplay_attack(A,B)
+]MA[mj]LB[qg:A][pg:B]
+(;B[qg]C[S]MA[mj];W[rf]C[S]MA[mj]
+(;B[og]C[S]MA[mj];W[tt];B[ph]C[S]MA[mj])
+
+(;B[of])
+)
+
+(;B[of]MA[mi]C[A
+])
+)
+
+(;W[nb]MA[lj];B[rf]MA[lj];W[oc]MA[lj])
+
+(;W[ob]C[j
+]MA[lj];B[rf]MA[lj])
+
+(;W[rf]C[0
+];B[pg]MA[lj])
+)
+
+(;W[of]C[0]MA[mi];B[qc]C[S]MA[mj])
+)
+
+(;B[qc]C[S]MA[mh]
+(;W[qi]C[S]MA[nj]
+(;B[og]MA[nj]C[t
+])
+
+(;B[jc]MA[hh]C[S])
+)
+
+(;W[ph]C[S
+;omoyo(A)
+]LB[qj:A]MA[mj])
+)
+)
+
+(;W[tt];B[qe]C[0];W[pf]C[0];B[tt]
+(;W[qc]C[t
+;!weak(A) || dead(A)
+]MA[lg]LB[qf:A];B[pc]C[S]MA[mf];W[re]
+C[S]MA[og]
+(;B[rd]C[S]MA[og];W[qd]C[S]MA[og];B[rc]C[S]MA[og];W[pe]C[S]MA[og];
+B[qb]C[S]MA[og])
+
+(;B[qd];W[rd]MA[og];B[rc]MA[og])
+)
+
+(;W[pj]MA[nk])
+
+(;W[qj]MA[nk])
+)
+
+(;W[qd];B[qc]MA[mg]C[S];W[rc]MA[mg]C[S]
+(;B[pc]MA[mh]C[S];W[re]MA[ng]C[U
+];B[rb];W[sb]C[J
+]MA[lh])
+
+(;B[qb]C[0]MA[ng];W[re]MA[ng]C[S];B[rb];W[pe]MA[ng]C[S]
+(;B[od];W[sb]MA[ng]C[S])
+
+(;B[sc];W[od]MA[ng]C[S])
+)
+
+(;B[qe]MA[nh]C[S];W[rd]MA[ng]C[S]
+(;B[pe]MA[mh]C[S];W[re]MA[nh]C[S];B[qb]MA[mh]C[S];W[pf]MA[mh]C[S])
+
+(;B[re]MA[mi]C[0];W[pe]MA[mh]C[S];B[rf]MA[mi]C[S];W[pf]MA[mh]C[S];
+B[qg]MA[mi]C[S];W[pg]MA[mi]C[S];B[qh]MA[mi]C[S];W[pc]MA[mf]C[S];B[od]
+MA[mf]C[S];W[pb]MA[mf]C[S])
+
+(;B[pf]MA[mh]C[0
+];W[re]MA[mh])
+)
+
+(;B[rb]MA[mg]C[S];W[re]MA[og]C[U
+];B[sc]MA[ng]C[S];W[pe]MA[mh]C[S]
+(;B[od]MA[mg]C[S];W[rd]MA[ng]C[S];B[pb]MA[ng]C[S;D])
+
+(;B[rd]MA[mg]C[0];W[od]MA[mh]C[S])
+)
+
+(;B[rd]MA[mg]C[0];W[qe]MA[mg]C[S];B[rb]MA[mg];W[pc]MA[mg]C[S];B[qb]
+MA[mg];W[od]MA[mg]C[S];B[oc]MA[mg];W[pe]MA[mg]C[U
+])
+)
+
+(;W[qc]
+(;B[qd]MA[mg])
+
+(;B[pc]MA[mg]C[0
+])
+)
+)
+
+(;B[pj]C[0]PL[B];B[pf]MA[ml];C[#tsuke nobi 6-9 stone games];W[pg];
+B[of]MA[ml]C[U];C[#tsuke nobi 6-9 stone games])
+
+(;B[pf]MA[mj]C[j
+];C[#tsuke nobi normal]
+(;W[pg]MA[mi]C[U]
+(;B[of]MA[mh]C[U];C[#nobi]
+(;W[qe]MA[mi]C[U];C[#w crawls];B[qd]MA[mh]C[U]PL[W]
+(;W[qj]MA[nk]C[U];C[#standard joseki];B[nd]
+C[U
+; !oterri(A)
+#overconcentrated in this case
+]MA[mk]LB[md:A])
+
+(;W[qh]MA[nk]C[S];C[#alternative joseki];B[nd]MA[mh]C[U
+]PL[B]
+(;W[pe]PL[W]
+(;B[oe]MA[mh])
+
+(;W[oe];B[od]MA[lh]C[S
+])
+)
+
+(;B[jd]PL[B];B[jc]MA[if]PL[B]
+C[t
+#Usually good in high handicap games (HL 2-nov-2000)
+];B[jf]C[t
+])
+
+(;B[rg]C[0
+# Don't do it!  (HL 2-nov-2000)
+]MA[oi])
+)
+
+(;W[pe]MA[mi]C[0];C[#trick_I3_p121_d4];B[oe]MA[mi]C[U];W[od]MA[mi]C[0]
+;B[nd]MA[mi]C[U];W[oc]MA[mi]C[0];B[rd]MA[mi]C[U]
+(;W[qg]MA[mi]C[0];C[#trick_I3_p121_d5];B[nc]MA[mi]C[U]
+(;W[pb]MA[mi]C[0];B[nb]MA[mi]C[U];W[rb]MA[mi]C[0];B[pc]MA[mi]C[U];
+W[ob]MA[mi]C[0];B[qb]MA[mi]C[U]
+(;W[qa]MA[mi]C[0];B[qc]MA[mi]C[U];W[pa]MA[mi]C[0];B[ra]MA[mi]C[U];
+W[sa]MA[mi]C[0];B[na]MA[li]C[U])
+
+(;W[qc]MA[mi]C[0];B[rc]MA[mi]C[U];W[qa]MA[mi]C[0];B[qc]MA[mi]C[U];
+W[pa]MA[mi]C[0];B[sb]MA[mi]C[U]
+(;W[ra]MA[mi]C[0];B[na]MA[mi]C[U];C[# wrong plays Bsc ])
+
+(;W[re]MA[mi]C[0];B[na]MA[mi]C[U])
+)
+)
+
+(;W[ob]MA[mi]C[0];B[nb]MA[mi]C[U]
+(;W[qb]MA[mi]C[0];B[rb]MA[mi]C[U];W[ra]MA[mi]C[0];B[sb]MA[mi]C[U];
+W[re]MA[mi]C[0];B[sd]MA[mi]C[U]
+(;W[qc]MA[mi]C[0];B[pc]MA[mi]C[U];W[pb]MA[mi]C[0];B[rc]MA[mi]C[U];
+W[se]MA[mi]C[0];B[oa]MA[mi]C[U])
+
+(;W[na]MA[mi]C[0];C[#trick_SK1_1121];B[mb]MA[mi]C[U];
+C[#wrong here it plays Bog]
+(;W[qc]MA[mi]C[0];B[pc]MA[mi]C[U];W[pb]MA[mi]C[0];B[rc]MA[mi]C[U];
+W[qa]MA[mi]C[0];B[oa]MA[mi]C[U])
+
+(;W[pc]MA[mi]C[0];B[pa]MA[li]C[U]
+(;W[qa]MA[mi]C[0];B[qc]MA[mi]C[U];W[rc]MA[mi]C[0];B[oa]MA[mi]C[U];
+W[pb]MA[mi]C[0];B[oa]MA[li]C[U])
+
+(;W[qc]MA[mi]C[0];B[rc]MA[mi]C[U];W[qa]MA[mi]C[0];B[oa]MA[mi]C[U];
+W[pb]MA[mi]C[0];B[oa]MA[mi]C[S];W[pa]MA[mi]C[0];B[tt];W[se]MA[mi]C[0];
+B[tt];W[ma]MA[kb]C[0];B[lb]MA[jb]C[U];W[la]MA[jb]C[0];B[kb]MA[jb]C[U])
+
+(;W[se]MA[mi]C[0];B[qc]MA[mi]C[U];W[rc]MA[mi]C[0];B[sc]MA[mi]C[U]
+(;W[pb]MA[mi]C[0];B[ma]MA[mi]C[U];W[qa]MA[mi]C[0];B[oa]MA[mi]C[U];
+W[na]MA[mi]C[0];B[oa]MA[mi]C[U])
+
+(;W[qa]MA[mi]C[0];B[oa]MA[mi]C[U];W[pb]MA[mi]C[0];B[oa]MA[mi]C[U];
+W[pa]MA[mi]C[0];B[tt];W[ma]MA[ke]C[0];B[lb]MA[ke]C[U];W[la]MA[jc]C[0]
+(;B[kb])
+
+(;B[ka]MA[jb]C[0])
+)
+)
+)
+)
+)
+
+(;W[qc]MA[mi]C[0];C[#stupid move];B[pc]MA[mi]C[U];W[pb]MA[mi]C[0];
+B[qb]MA[mi]C[U];W[rb]MA[mi]C[0])
+)
+
+(;W[pc]MA[mi]C[0];C[stupid move];B[qb]MA[mi]C[U];C[improve that];W[pb]
+MA[mi]C[0];B[rb]MA[mi]C[U];W[nb]MA[mi]C[0];B[mb]MA[mi]C[U];W[sc]MA[mi]
+C[0];B[sd]MA[mi]C[U];W[sb]MA[mi]C[0];B[qc]MA[mi]C[U];W[qa]MA[mi]C[0];
+B[oa]MA[mi]C[U])
+)
+
+(;W[re]MA[mi]C[0];C[#trick_I3_p121_d6];B[qg]MA[mi]C[U];W[rg]MA[mi]C[0]
+;B[qh]MA[mi]C[U];W[rh]MA[mi]C[0];B[nc]MA[mi]C[U]
+(;W[pb]MA[mi]C[0];B[nb]MA[mi]C[U]
+(;W[rb]MA[mi]C[0];B[qb]MA[mi]C[U];W[qc]MA[mi]C[0];B[pc]MA[mi]C[U];
+W[ob]MA[mi]C[0];B[rc]MA[li]C[U];W[qa]MA[mi]C[0];B[oa]MA[mi]C[U];W[qc]
+MA[mi]C[0];B[se]MA[li]C[U])
+
+(;W[rc]MA[mi]C[0];C[#trick_SK1_1124];B[se]MA[mi]C[U];W[rf]MA[mi]C[0];
+B[qc]MA[mi]C[U];W[qb]MA[mi]C[0];B[rb]MA[mi]C[U];W[ra]MA[mi]C[0];B[sb]
+MA[mi]C[U];C[# here it doesnt know how to continue])
+)
+
+(;W[ob]MA[mi]C[0];C[#trick_SK1_1125];B[se]MA[mi]C[U];W[rf]MA[mi]C[0];
+B[nb]MA[mi]C[U]
+(;W[qb]MA[mi]C[0];B[rb]MA[mi]C[U];W[ra]MA[mi]C[0];B[qc]MA[mi]C[U];
+W[oa]MA[mi]C[0];B[pb]MA[mi]C[U];W[pa]MA[mi]C[0];B[pc]MA[mi]C[U];W[sb]
+MA[mi]C[0];B[na]MA[mi]C[U])
+
+(;W[qc]MA[mi]C[0];C[#maybe this needs more];B[rc]MA[mi]C[U])
+)
+
+(;W[pc]MA[mi]C[0];C[#stupid move];B[qb]MA[mi]C[U];W[qc]MA[mi]C[0];
+B[rc]MA[mi]C[U];W[pb]MA[mi]C[0];B[ob]MA[mi]C[U];W[pa]MA[mi]C[0];B[oa]
+MA[mi]C[U])
+)
+)
+
+(;W[rd]MA[mi]C[0];C[#trick_I3_p121_d8];B[rc]MA[mi]C[U];W[pe]MA[mi]C[0]
+;B[oe]MA[mi]C[U];W[od]MA[mi]C[0];B[nd]MA[mi]C[U];W[oc]MA[mi]C[0];B[pb]
+MA[mi]C[U];C[#trick_I3_p122_d9]
+(;W[ob]MA[mi]C[0];B[pc]MA[mi]C[U])
+
+(;W[pc]MA[mi]C[0];C[#trick_I3_p122_d10];B[qc]MA[mi]C[U];W[ob]MA[mi]
+C[0];B[nb]MA[mi]C[U];W[qb]MA[mi]C[0];B[nc]MA[mi]C[U];W[pa]MA[mi]C[0];
+B[rb]MA[li]C[U];W[ra]MA[mi]C[0];B[re]MA[mi]C[U]
+(;W[sd]MA[mi]C[0];B[se]MA[li]C[U];W[rf]MA[mi]C[0];B[sc]MA[mi]C[U]
+(;W[qh]MA[mi]C[0];B[na]MA[mi]C[U];W[oa]MA[mi]C[0];B[sa]MA[mi]C[U];
+W[sb]MA[mi]C[0];B[tt];W[rd]MA[mi]C[0];B[sd]MA[mi]C[U])
+
+(;W[sf]MA[mi]C[0];C[#trick_SK1_1127];B[na]MA[mi]C[U];W[oa]MA[mi]C[0];
+B[ph]MA[mi]C[U];W[qh]MA[mi]C[0];B[og]MA[mi]C[U];W[qg]MA[mi]C[0];B[pi]
+MA[mi]C[U])
+)
+
+(;W[rf]MA[mi]C[0];C[#trick_SK1_1128];B[sd]MA[mi]C[U];W[sb]MA[mi]C[0];
+B[na]MA[mi]C[U];W[oa]MA[mi]C[0];B[sc]MA[mi]C[U])
+)
+)
+
+(;W[nc]MA[ng]C[0];C[# w invades];B[oc]MA[ng]C[U]
+(;W[nd]MA[ng]C[0];B[pe]MA[ng]C[U])
+
+(;W[md]MA[mg]C[0];B[nd]MA[ng]C[U])
+)
+
+(;B[qj];W[qh]C[U
+]MA[nk])
+
+(;B[pj];W[qh]MA[nk]C[U
+])
+
+(;W[og];B[nd]MA[mi])
+)
+
+(;W[qd]MA[mi]C[S];C[# w jumps ]
+(;B[qe]MA[mi]C[S];W[re]MA[mi]C[S];B[pe]MA[mi]C[S];W[rg]MA[oh]C[S];
+B[qc]MA[ni]C[S];W[rd]MA[ni]C[S];B[og]MA[mi]C[S];W[ph]MA[mi]C[S])
+
+(;B[qc]MA[mi]
+(;W[qe]MA[mi];B[pc]MA[mi];W[qi]MA[mk];B[jc]MA[hj])
+
+(;W[re]MA[mi];B[rd]MA[mi];W[qe]MA[mi];B[rc]MA[mi];W[qj]MA[ml];B[nd]
+MA[kl])
+)
+)
+
+(;W[og];B[qe]MA[mi]C[U
+])
+
+(;W[qc]
+(;B[pc]MA[mi];W[qd]MA[mi];B[qe]MA[mi];W[re]MA[mi]PL[B];B[pe]MA[mi];
+W[rg]MA[mi];B[og]MA[li])
+
+(;B[qe]MA[mi]
+(;W[ob]MA[ki];B[qg]MA[ki];W[mc]MA[ki])
+
+(;W[qg]C[0
+];B[pc]MA[mi];W[re];B[qd]MA[mi];W[rd];B[rc]MA[mi])
+
+(;W[pc]C[0
+];B[nc]MA[mi];W[nb];B[mb]MA[mi];W[ob];B[mc]MA[mi])
+)
+
+(;B[qd]C[0
+];W[pc];B[oc];W[ob];B[nc];W[nb];B[mc];W[rd];B[re];W[rc];
+B[qe])
+)
+
+(;W[re]MA[mh]
+(;B[qe]MA[mh]
+(;W[qd]C[#reverts to as if w jumped
+]MA[mh])
+
+(;W[rf]MA[mh];B[qc]MA[mh])
+)
+
+(;B[rd]MA[mh];W[qd]MA[mh];B[qc]C[#reverts to w jump
+]MA[mh])
+)
+
+(;W[pc]C[0
+#trick play
+];B[qe]MA[mh]
+(;W[qc]C[#reverts to entering at the 3,3 point
+])
+
+(;W[oc]
+(;B[qc]MA[mh];W[qb];B[rc]MA[mh];W[lc])
+
+(;B[jd];W[tt]C[#if b has extension, for handicap games
+];B[mc]MA[ii];
+W[nd];B[md]MA[ii];W[ne];B[lf]MA[ii];W[mg];B[og]MA[ii])
+)
+)
+)
+
+(;B[qe]MA[mh]C[S];C[#osae];W[of]MA[nh]C[U
+];B[pe]MA[nh]C[S]
+(;W[og]MA[mi]C[S]
+(;B[nd]MA[mh]C[S])
+
+(;B[qg]MA[ni]C[S];W[qh]MA[nj]C[S];B[rf]MA[ni]C[S;D];W[rg]MA[nj]C[S];
+B[nd]MA[mi]C[S])
+)
+
+(;W[qg]MA[mj]C[S];B[nd]MA[mh]C[S];W[qc]C[0]MA[nf];B[pb]MA[nf]C[S];
+W[rd]MA[nf]C[0];B[re]MA[nf]C[S];W[pc]MA[nf]C[0];B[oc]MA[nf]C[S];W[qb]
+MA[nf]C[0];B[ob]MA[nf]C[S])
+
+(;W[rf]MA[mi]C[0];B[og]MA[lj]C[S];W[ph]MA[mj]C[S];B[nf]MA[mj]C[S];
+W[oh]MA[lj]C[S];B[ng]MA[li]C[S];W[re]MA[mi]C[S]
+(;B[qc]MA[nh]C[S])
+
+(;B[rd]C[0];W[qc]MA[nh]C[S];B[qd]C[0];W[pc]MA[mh]C[S])
+)
+)
+
+(;B[qg]MA[mi]C[S];W[pe]MA[mi]C[S];B[of]MA[mi]C[S];W[qe]MA[mi]C[S];
+B[oe]MA[mi]C[S];W[qh]MA[mi]C[S];B[rg]MA[mi]C[S];W[rh]MA[mi]C[S];B[og]
+MA[mi]C[S];W[ph]MA[mi]C[S];B[qd]MA[mi]C[S];W[rf]MA[mi]C[S];B[re]MA[mi]
+C[S];W[sg]MA[mi]C[S];B[nc]MA[mi]C[S])
+)
+
+(;W[qe];B[pe]MA[ng]C[S])
+
+(;W[rd];B[qe]MA[nh]C[S];W[re];B[qg]MA[nh]C[S];W[rf];B[pg]MA[nh]C[S])
+
+(;W[qc];B[qe]MA[nh])
+
+(;W[pe]
+(;B[qe]LB[oe:A][qd:B][pf:C]MA[mi]C[;!oplay_attack(*,A,B,C)
+];W[oe]
+(;B[qd]MA[mi];W[qg];B[nd]MA[mi];W[ne];B[me]MA[li];W[od];B[oc]MA[li];
+W[og];B[md]MA[li])
+
+(;B[re]MA[mi]C[0
+])
+
+(;B[pg]MA[mi]C[0
+])
+)
+
+(;B[oe]MA[mi]LB[qe:A][qd:B][pf:C]C[;!oplay_attack(A,*,B,C)
+];W[qe]
+(;B[od]MA[mi];W[pg];B[of]MA[mi];W[qd];B[qc]MA[mi];W[rc];B[rb]MA[mi];
+W[qb];B[pc]MA[mi]
+(;W[rd];B[pb]MA[mi];W[qj])
+
+(;W[sb];B[qg]MA[mi];W[qh];B[rg]MA[mi];W[ra];B[qi]MA[mj];W[og];B[rh]
+MA[mj];W[ng];B[ld]MA[kj])
+)
+
+(;B[qd]MA[mi]C[0
+];W[od]MA[mi];B[nd];W[oc]MA[mi];B[nc];W[pb]MA[mi];
+B[nb];W[qc]MA[mi];B[rd];W[rc]MA[mi])
+
+(;B[pc]MA[mi]C[0
+])
+)
+)
+)
+
+(;B[nc]MA[lh]C[j
+];C[#kogeima]
+(;W[rd]C[S]MA[mh];B[qc]MA[ng]C[S]
+(;W[qi]MA[mk]C[S];B[tt];W[lc]C[j
+]MA[ij];B[tt];W[rc]C[j
+]MA[jj];B[rb]
+C[0];W[pb]MA[kg]C[S];B[qb]C[0];W[oc]C[S]MA[kg])
+
+(;W[tt]PL[W]
+(;B[pj];W[ph]C[S]MA[mk])
+
+(;W[qk]C[0];B[tt];W[ph]C[S]MA[ml])
+)
+
+(;W[ph]C[0];B[tt];W[lc]C[S]MA[ii])
+)
+
+(;W[qd]C[S];B[qc]MA[mg]C[S];W[rc]MA[mg]C[S]
+(;B[pc]MA[mh]C[S];W[re]MA[ng]C[S];B[rb]C[0];W[sb]C[S]MA[mh])
+
+(;B[qb]C[0];W[re]MA[ng]C[S];B[rb];W[pe]MA[ng]C[S]
+(;B[od];W[sb]MA[ng]C[S])
+
+(;B[sc];W[od]MA[ng]C[S])
+)
+
+(;B[qe]MA[nh]C[S];W[rd]MA[ng]C[S]
+(;B[pe]MA[mh]C[S];W[re]MA[nh]C[S];B[qb]MA[mh]C[S];W[pf]MA[mh]C[S])
+
+(;B[re]MA[mi]C[0];W[pe]MA[mh]C[S];B[rf]MA[mi]C[S];W[pf]MA[mh]C[S];
+B[qg]MA[mi]C[S];W[pg]MA[mi]C[S];B[qh]MA[mi]C[S];W[pc]MA[mf]C[S];B[od]
+MA[mf]C[S];W[pb]MA[mf]C[S])
+
+(;B[pf]MA[mh]C[0
+];W[re]MA[ng])
+)
+
+(;B[rb]MA[mg]C[S];W[re];B[sc]MA[ng]C[S];W[pe]MA[mh]C[S]
+(;B[od]MA[mg]C[S];W[rd]MA[ng]C[S];B[pb]MA[ng]C[S;D])
+
+(;B[rd]MA[mg]C[0];W[od]MA[mh]C[S])
+)
+
+(;B[rd]MA[mg];W[qe]MA[mg]C[S];B[rb]MA[mg];W[pc]MA[mg]C[S];B[qb]MA[mg];
+W[od]MA[mg]C[S])
+)
+
+(;W[qc];B[qd]MA[mg];W[rd];B[re]MA[mg]
+(;W[rc];B[qe]MA[mg])
+
+(;W[rb];B[sd]MA[mg]
+(;W[sc];B[rc]MA[mg])
+
+(;W[rc];B[qe]MA[mg])
+)
+)
+)
+
+(;B[of]C[0];W[ph]MA[nj]C[S])
+
+(;B[tt]
+(;W[nc]MA[kg]C[t
+]
+(;B[oe]MA[mg]C[S];W[qc]MA[mg]C[S];B[qd]MA[mg]C[S];W[pc]MA[mg]C[S];
+B[me]MA[lg]C[S];W[od]MA[mg]C[S];B[pe]MA[mg]C[S];W[rd]MA[mg]C[S];B[re]
+MA[mg]C[S];W[rc]C[S]MA[mg];B[qe]C[S]MA[mg])
+
+(;B[nd]MA[kg]C[S];W[md]MA[kg]C[S];B[ne]MA[kg]C[S];W[qc]MA[kg]C[S]
+(;B[oc]MA[kg]C[S];W[qd]MA[kg]C[S];B[mc]MA[kg]C[S])
+
+(;B[qd];W[pc]MA[kg])
+)
+
+(;B[qj]C[0];W[tt];B[nd]C[S]MA[lj])
+)
+
+(;W[nd]MA[kg]C[t
+]
+(;B[oe]MA[mg]C[S];W[qc]MA[mg]C[S];B[qd]MA[mg]C[S];W[pc]MA[mg]C[S];
+B[rc]MA[mg]C[S];W[od]MA[mg]C[S];B[pf]MA[mg]C[S];W[rb]MA[mg]C[S];B[rd]
+MA[mg]C[S])
+
+(;B[pf];W[pg]MA[mh])
+)
+
+(;W[qc];B[qd]MA[ii];W[pc]MA[lh];B[od]MA[lh]C[U
+];W[rd]MA[lh];B[re]
+MA[lh];W[rc]MA[lh];B[qe]MA[lh]C[U
+];W[nc]MA[lh]
+(;B[pf]MA[lh])
+
+(;B[tt];W[of]MA[ij]C[j
+];B[nd]MA[ij]C[U
+];W[mc]MA[ij]C[U
+];B[md]MA[ij]
+C[j
+])
+)
+)
+
+(;B[jd]C[0];W[tt]
+(;B[qh]MA[ij]C[S];W[qc]C[S]MA[hj];B[pc]MA[ij]C[S])
+
+(;B[pi]MA[ij];W[of]MA[ij]
+(;B[nd]MA[ij];W[rd]MA[ij];B[qc]MA[ij]
+(;W[ri]MA[ij]
+(;B[mf]C[j
+]MA[ij])
+
+(;B[tt];W[mf]C[j
+]MA[ij])
+)
+
+(;W[tt]C[#this is why w must play S11
+];B[pg]MA[ij];W[pf]MA[ij];B[qg]
+MA[ij];W[rg]MA[ij];B[rh]MA[ij];W[rf]MA[ij])
+)
+
+(;B[ne]C[0
+#gg has trouble here; I assume this is reasonable  /evan
+];
+W[rd]MA[ij];B[qc]MA[ij];W[ri]MA[ij])
+)
+)
+
+(;B[pi]MA[ij]C[j
+]
+(;W[qc]MA[ij];B[qd]MA[ij];W[pc]MA[ij];B[od]MA[ij];W[rd]MA[ij];B[re]
+MA[ij];W[rc]MA[ij];B[qe]MA[ij];W[nc]MA[ij];B[pf]C[j
+])
+
+(;W[of]MA[ij];B[nd]MA[ij];W[rd]MA[ij];B[qc]MA[ij];W[ri]MA[ij];B[jc]
+MA[ij];W[qi]MA[ij]C[j
+])
+)
+
+)
diff --git a/patterns/hoshi_other.db b/patterns/hoshi_other.db
new file mode 100644 (file)
index 0000000..385067f
--- /dev/null
@@ -0,0 +1,3880 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JHO1
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+....*..|
+....X..|
+.......|
+.......|
+.......|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO2
+
+-------+
+.......|
+.......|
+.......|
+...X...|
+....X..|
+...*O..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO3
+
+-------+
+.......|
+.......|
+.......|
+.*.O...|
+....O..|
+...XX..|
+.......|
+.......|
+.......|
+...O...|
+.......|
+
+:8,sFU
+
+
+Pattern JHO4
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....O*.|
+....XX..|
+........|
+....X...|
+........|
+....O...|
+........|
+
+:8,sFj
+
+
+Pattern JHO5
+
+-------+
+.......|
+.......|
+.......|
+..*X...|
+....X..|
+...OO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO6
+
+-------+
+.......|
+.......|
+.XX*...|
+.OOX...|
+....X..|
+...OO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO7
+
+-------+
+.......|
+...*...|
+.XXOX..|
+.OOX...|
+....X..|
+...OO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO8
+
+-------+
+.......|
+...OX..|
+.XXOX..|
+.OOX...|
+...*X..|
+...OO..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO9
+
+--------+
+........|
+........|
+........|
+...*O...|
+...X.O..|
+.....X..|
+........|
+........|
+........|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHO10
+# playable if ladder works but dangerous for GNU Go
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+..X.O..|
+...*X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JHO11
+
+------+
+......|
+......|
+......|
+..O...|
+......|
+...X..|
+......|
+...*..|
+......|
+..O...|
+......|
+......|
+
+:8,sFj
+
+
+Pattern JHO12
+
+---------+
+.........|
+.........|
+.........|
+.X.O*O...|
+....X....|
+...O.....|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO13
+
+-------+
+.......|
+.......|
+.......|
+...O...|
+....*..|
+.......|
+....X..|
+.......|
+.......|
+...O...|
+.......|
+.......|
+
+:8,sFj-,shape(0.015)
+
+
+Pattern JHO14
+
+--------+
+........|
+........|
+..*.....|
+....O...|
+........|
+........|
+.....X..|
+........|
+........|
+....O...|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JHO15
+
+---------+
+.........|
+.........|
+..*......|
+.....O...|
+.........|
+.........|
+......X..|
+.........|
+.........|
+.....O...|
+.........|
+.........|
+
+:8,sFj
+
+
+Pattern JHO16
+
+-------+
+.......|
+.......|
+.......|
+.*.O...|
+.......|
+.......|
+....X..|
+.......|
+.......|
+...O...|
+.......|
+
+:8,sFj-,shape(-0.02)
+
+
+Pattern JHO17
+
+-----------+
+...........|
+...........|
+...........|
+.O.....O...|
+...........|
+...........|
+......*.X..|
+...........|
+...........|
+.O.....O...|
+...........|
+
+:8,sFj-,shape(-0.02)
+
+
+Pattern JHO18
+
+-------+
+.......|
+.......|
+.......|
+*..O...|
+.......|
+.......|
+....X..|
+.......|
+.......|
+...O...|
+
+:8,sFN
+
+
+Pattern JHO19
+
+-----+
+.....|
+.....|
+.....|
+.X...|
+...*.|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO20
+
+-----+
+.....|
+.....|
+.....|
+.O...|
+..*X.|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFJ
+
+
+Pattern JHO21
+
+-----+
+.....|
+.....|
+.*...|
+.X...|
+..XO.|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO22
+
+-----+
+.....|
+.....|
+.X...|
+.O*..|
+..OX.|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFJ
+
+
+Pattern JHO23
+
+-----+
+.....|
+.....|
+.....|
+.X...|
+.....|
+..*..|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO24
+
+-----+
+.....|
+.....|
+.....|
+.O...|
+.....|
+..X..|
+.*O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO25
+
+-----+
+.....|
+.....|
+.....|
+.X...|
+.*...|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO26
+
+-----+
+.....|
+.....|
+.....|
+.O*..|
+.X...|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO27
+
+-----+
+.....|
+.....|
+.....|
+.X*..|
+.....|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO28
+
+-----+
+.....|
+.....|
+.....|
+.OX..|
+..*..|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO29
+
+-----+
+.....|
+.....|
+.....|
+.XO..|
+..X*.|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO30
+
+-----+
+.....|
+.....|
+.....|
+.OX..|
+.*OX.|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO31
+
+-----+
+.....|
+.....|
+.....|
+.XO*.|
+.XXO.|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO32
+
+-----+
+.....|
+.....|
+.....|
+.OXX.|
+.OOX.|
+...*.|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO33
+
+-----+
+.....|
+.....|
+.*...|
+.XOO.|
+.XXO.|
+...X.|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO34
+
+-----+
+.....|
+.....|
+*X...|
+.OXX.|
+.OOX.|
+...O.|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO35
+
+-----+
+.....|
+.*...|
+XO...|
+.XOO.|
+.XXO.|
+...X.|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO36
+
+-----+
+.....|
+*X...|
+OX...|
+.OXX.|
+.OOX.|
+...O.|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO37
+
+-----+
+.....|
+XO.*.|
+XO...|
+.XOO.|
+.XXO.|
+...X.|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO38
+
+-----+
+.....|
+.....|
+..*..|
+.X...|
+.....|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO39
+
+-----+
+.....|
+.....|
+.*X..|
+.O...|
+.....|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO40
+
+-----+
+.....|
+.....|
+.XO..|
+.X*..|
+.....|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO41
+
+-----+
+.....|
+..*..|
+.OX..|
+.OX..|
+.....|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO42
+
+-----+
+.....|
+..X..|
+.XO..|
+.XO..|
+.....|
+..*..|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO43
+
+-----+
+.....|
+..O..|
+.OX..|
+.OX..|
+.....|
+.*X..|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO44
+
+-----+
+.....|
+..X..|
+.XO..|
+.XO..|
+..*..|
+.XO..|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO45
+
+-----+
+.....|
+..O..|
+.OX..|
+.OX..|
+..X..|
+.OX..|
+.*O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO46
+
+-----+
+.....|
+..X*.|
+.XO..|
+.XO..|
+..O..|
+.XO..|
+.XX..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO47
+
+-----+
+.....|
+.*OX.|
+.OX..|
+.OX..|
+..X..|
+.OX..|
+.OO..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO48
+
+-----+
+.....|
+.XXO.|
+.XO..|
+.XO..|
+..O..|
+.XO..|
+.XX*.|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO49
+
+-----+
+.....|
+.OOX.|
+.OX..|
+.OX..|
+..X..|
+.OX..|
+.OOX.|
+...*.|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO50
+
+-----+
+.....|
+.XXO.|
+.XO..|
+.XO..|
+..O..|
+.XO..|
+.XXO*|
+...X.|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO51
+
+-----+
+.....|
+..X*.|
+.XO..|
+.XO..|
+.....|
+.....|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO52
+
+-----+
+.....|
+.*OX.|
+.OX..|
+.OX..|
+.....|
+.....|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO53
+
+-----+
+.....|
+.XXO.|
+.XO..|
+.XO..|
+.....|
+..*..|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO54
+
+-----+
+.....|
+.OOX.|
+.OX..|
+.OX..|
+.....|
+.*X..|
+..O..|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO55
+
+-----+
+.....|
+.XXO.|
+.XO..|
+.XO..|
+..*..|
+.XO..|
+..X..|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO56
+
+-----+
+.....|
+.OOX.|
+.OX..|
+.OX..|
+..X..|
+.OX..|
+..O*.|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO57
+
+-----+
+...*.|
+.XXO.|
+.XO..|
+.XO..|
+..O..|
+.XO..|
+..XX.|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO58
+
+-----+
+...X.|
+.OOX.|
+.OX..|
+.OX.*|
+..X..|
+.OX..|
+..OO.|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO59
+
+-----+
+.....|
+.XXO.|
+.XO..|
+.XO..|
+..O..|
+.XO*.|
+..XX.|
+.....|
+.....|
+.X...|
+.....|
+
+:8,sFN
+
+
+Pattern JHO60
+
+-----+
+...*.|
+.OOX.|
+.OX..|
+.OX..|
+..X..|
+.OXX.|
+..OO.|
+.....|
+.....|
+.O...|
+.....|
+
+:8,sFU
+
+
+Pattern JHO61
+
+--------+
+........|
+........|
+........|
+..*.O...|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO62
+
+-------+
+.......|
+.......|
+.......|
+.X.X*..|
+.......|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO63
+
+-------+
+.......|
+.......|
+....*..|
+.O.OX..|
+.......|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO64
+
+-------+
+.......|
+.......|
+....X..|
+.X.XO..|
+....*..|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO65
+
+-------+
+.......|
+.......|
+....O*.|
+.O.OX..|
+....X..|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO66
+
+-------+
+.......|
+.......|
+....XX.|
+.X.XO..|
+....O..|
+...O...|
+.......|
+.......|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO67
+
+-----------+
+...........|
+...........|
+.*......OO.|
+.....O.OX..|
+........X..|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JHO68
+
+-------+
+.......|
+.......|
+....X..|
+.O.O*..|
+.......|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO69
+
+------+
+......|
+......|
+......|
+X.X...|
+......|
+..O...|
+......|
+......|
+......|
+..*...|
+......|
+......|
+
+:8,sFj
+
+
+Pattern JHO70
+
+--------+
+........|
+........|
+........|
+..O.O...|
+........|
+....X*..|
+........|
+........|
+
+:8,sFt
+
+
+Pattern JHO71
+
+--------+
+........|
+........|
+........|
+..X.X...|
+........|
+....OX..|
+.....*..|
+........|
+........|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHO72
+
+--------+
+........|
+........|
+........|
+..O.O...|
+.....*..|
+....XO..|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHO73
+
+--------+
+........|
+........|
+........|
+..X.X...|
+.....X..|
+....OX..|
+....*O..|
+........|
+........|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JHO74
+#applicable in isolation or if b makes a pincer on the right
+
+----------+
+..........|
+..........|
+..........|
+....*.X...|
+..........|
+......O...|
+..........|
+
+:8,sFj
+
+
+Pattern JHO75
+
+-------+
+.......|
+.......|
+.......|
+.X.O...|
+..*....|
+...X...|
+.......|
+
+:/,sFJ
+
+
+Pattern JHO76
+
+-------+
+.......|
+.......|
+....*..|
+.O.X...|
+..X....|
+...O...|
+.......|
+
+:/,sFJ
+
+
+Pattern JHO77
+
+----------+
+..........|
+..........|
+.......X..|
+....X.O*..|
+.....O....|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO78
+
+----------+
+..........|
+..........|
+......*O..|
+....O.XX..|
+.....X....|
+......O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO79
+
+----------+
+..........|
+..........|
+......XX..|
+....X.OO..|
+.....O....|
+.....*X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO80
+
+----------+
+..........|
+..........|
+......OO..|
+....O*XX..|
+.....X....|
+.....XO...|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO81
+
+----------+
+..........|
+..........|
+......XX..|
+....XXOO..|
+.....O....|
+.....OX...|
+......*...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO82
+
+-------+
+.......|
+.......|
+...*...|
+.X.O...|
+.......|
+...X...|
+.......|
+
+:8,sFj
+
+
+Pattern JHO83
+
+--------+
+........|
+........|
+....X...|
+..O.X...|
+........|
+..*.O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO84
+
+--------+
+........|
+..*.....|
+....O...|
+..X.O...|
+........|
+..X.X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO85
+
+-------+
+.......|
+.......|
+....*..|
+.X.O...|
+.......|
+...X...|
+.......|
+
+:/,sFj
+
+
+Pattern JHO86
+
+--------+
+........|
+........|
+.....X..|
+..O.X...|
+........|
+..*.O...|
+........|
+........|
+
+:/,sFJ
+
+
+Pattern JHO87
+#no reason not to answer at O16
+
+--------+
+........|
+........|
+..*.....|
+....O...|
+........|
+....X...|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JHO88
+
+--------+
+........|
+........|
+..X.....|
+....X*..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO89
+
+--------+
+........|
+........|
+..O..*..|
+....OX..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO90
+
+--------+
+........|
+........|
+..X..X..|
+....XO..|
+.....*..|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO91
+
+--------+
+........|
+........|
+..O..O*.|
+....OX..|
+.....X..|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO92
+
+--------+
+........|
+........|
+..X..XX.|
+....XO..|
+.....O..|
+....O...|
+........|
+........|
+........|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO93
+
+---------+
+.........|
+.........|
+...X.....|
+.....X...|
+.........|
+.....O...|
+.........|
+.........|
+.........|
+.....*...|
+.........|
+.........|
+
+:8,sFj
+
+
+Pattern JHO94
+
+---------+
+.........|
+.........|
+...O.....|
+.....O...|
+.........|
+.....X*..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO95
+
+---------+
+.........|
+.........|
+...X.....|
+.....X...|
+.........|
+.....OX..|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO96
+
+---------+
+.........|
+.........|
+...O.....|
+.....O...|
+......*..|
+.....XO..|
+......X..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO97
+
+---------+
+.........|
+.........|
+...X.....|
+.....X...|
+......X..|
+.....OX..|
+.....*O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO98
+
+------+
+......|
+......|
+..*O..|
+..XX..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO99
+
+------+
+......|
+......|
+.*XX..|
+..OO..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO100
+
+------+
+......|
+.*....|
+.XOO..|
+..XX..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO101
+
+-------+
+.......|
+..X....|
+.*OXX..|
+...OO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO102
+
+-------+
+.......|
+.*O....|
+.XXOO..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO103
+
+--------+
+........|
+..XX....|
+.*OOXX..|
+....OO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO104
+
+------+
+......|
+OO....|
+XXOO..|
+..XX*.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO105
+
+------+
+......|
+XX....|
+OOXX..|
+..OOX.|
+....*.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO106
+
+------+
+......|
+OO....|
+XXOO*.|
+..XXO.|
+....X.|
+......|
+
+:8,sFJ
+
+
+Pattern JHO107
+
+-------+
+.......|
+.XX....|
+OOOXXX.|
+...OOX.|
+.....O.|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO108
+
+------+
+......|
+......|
+.OXX..|
+..OOX.|
+....*.|
+......|
+
+:8,sFJ
+
+
+Pattern JHO109
+
+------+
+......|
+......|
+.XOO*.|
+..XXO.|
+....X.|
+......|
+
+:8,sFJ
+
+
+Pattern JHO110
+
+------+
+......|
+......|
+.OXXX.|
+..OOX.|
+....O.|
+...*..|
+......|
+
+:8,sFj
+
+
+Pattern JHO111
+
+------+
+......|
+.*....|
+.XOOO.|
+..XXO.|
+....X.|
+...X..|
+
+:8,sFJ
+
+
+Pattern JHO112
+
+-------+
+.......|
+..X....|
+.*OXXX.|
+...OOX.|
+.....O.|
+....O..|
+
+:8,sFJ
+
+
+Pattern JHO113
+
+-------+
+.......|
+.*O....|
+.XXOOO.|
+...XXO.|
+.....X.|
+....X..|
+
+:8,sFJ
+
+
+Pattern JHO114
+
+--------+
+........|
+..XX....|
+.*OOXXX.|
+....OOX.|
+......O.|
+.....O..|
+
+:8,sFJ
+
+
+Pattern JHO115
+#depending on circumstances, P18 might be possible ?
+
+-------+
+.......|
+.......|
+..OXXX.|
+..*OOX.|
+.....O.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO116
+
+------+
+......|
+......|
+.OXX..|
+.*OOX.|
+......|
+......|
+
+:8,sFN
+
+
+Pattern JHO117
+
+-------+
+.......|
+.......|
+.......|
+...O*..|
+....X..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO118
+
+-------+
+.......|
+.......|
+.......|
+...OO..|
+..*XX..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO119
+
+--------+
+........|
+........|
+........|
+...XOO..|
+...OXX*.|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO120
+
+-------+
+.......|
+.......|
+.......|
+..XOO*.|
+..OXXO.|
+.....X.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO121
+
+--------+
+........|
+........|
+........|
+....OO..|
+..*OXX..|
+...X....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO122
+
+-------+
+.......|
+.......|
+.......|
+...OOX.|
+...*X..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO123
+
+------+
+......|
+......|
+....*.|
+..OOX.|
+..OX..|
+...X..|
+......|
+
+:8,sFJ
+
+
+Pattern JHO124
+
+------+
+......|
+......|
+....X.|
+..OOX.|
+..OX..|
+...*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO125
+
+-------+
+.......|
+.......|
+.....X.|
+...OOX.|
+...OXX.|
+...*O..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO126
+
+-------+
+.......|
+.......|
+....X..|
+O..O*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO127
+
+-------+
+.......|
+.......|
+...*O..|
+X..XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO128
+
+-------+
+.......|
+.......|
+..*XX..|
+O..OO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO129
+
+-------+
+.......|
+..*....|
+..XOO..|
+X..XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO130
+
+-------+
+.......|
+..X....|
+.*OXX..|
+O..OO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO131
+
+-------+
+.......|
+..O....|
+.XXOO..|
+X..XX*.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO132
+
+-------+
+.......|
+..X....|
+.OOXX..|
+O..OOX.|
+.....*.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO133
+
+-------+
+.......|
+..O....|
+.XXOO*.|
+X..XXO.|
+.....X.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO134
+
+------+
+......|
+......|
+O..X..|
+..O*..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO135
+
+------+
+......|
+......|
+O*XX..|
+..OO..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO136
+
+------+
+......|
+......|
+OOXX..|
+..OOX.|
+....*.|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JHO137
+
+------+
+......|
+......|
+OOXXX.|
+..OOX.|
+....O.|
+...*..|
+......|
+
+:8,sFJ
+
+
+Pattern JHO138
+
+-------+
+.......|
+.......|
+.O.....|
+...O.X.|
+....*..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO139
+
+--------+
+........|
+........|
+..O..*..|
+....O.X.|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO140
+
+-------+
+.......|
+.......|
+O...X..|
+...O*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO141
+
+-------+
+.......|
+.......|
+X..*O..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO142
+
+-------+
+.......|
+.......|
+O.*XX..|
+...OO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO143
+
+-------+
+.......|
+..*....|
+X.XOO..|
+...XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO144
+
+-------+
+.......|
+.*X....|
+O.OXX..|
+...OO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO145
+
+-------+
+.......|
+.XO....|
+X.XOO..|
+..*XX..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO146
+
+-------+
+.......|
+.OX....|
+O*OXX..|
+..XOO..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO147
+
+-------+
+.......|
+.XO....|
+XXXOO..|
+..OXX*.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO148
+
+-------+
+.......|
+.OX....|
+OOOXX..|
+..XOOX.|
+.....*.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO149
+
+-------+
+.......|
+.XO....|
+XXXOO*.|
+..OXXO.|
+.....X.|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO150
+
+-------+
+.......|
+.OX....|
+OOOXXX.|
+..XOOX.|
+.....O.|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO151
+
+-------+
+...*...|
+.XO....|
+XXXOOO.|
+..OXXO.|
+.....X.|
+....X..|
+
+:8,sFJ
+
+
+Pattern JHO152
+
+-------+
+...X...|
+.OX....|
+OOOXXX.|
+..XOOX.|
+..*..O.|
+....O..|
+
+:8,sFJ
+
+
+Pattern JHO153
+
+-------+
+.......|
+.XO*...|
+XXXOOO.|
+..OXXO.|
+.....X.|
+....X..|
+
+:8,sFJ
+
+
+Pattern JHO154
+
+-------+
+.......|
+.OXX...|
+OOOXXX.|
+..XOOX.|
+..*..O.|
+....O..|
+
+:8,sFJ
+
+
+Pattern JHO155
+
+--------+
+........|
+........|
+........|
+...*O...|
+....X...|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO156
+
+-------+
+.......|
+.......|
+....*..|
+..OOX..|
+...X...|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JHO157
+
+--------+
+........|
+........|
+........|
+....X...|
+........|
+........|
+....*...|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JHO158
+
+--------+
+........|
+........|
+........|
+..*.O...|
+........|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO159
+
+--------+
+........|
+........|
+........|
+..X.X*..|
+........|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO160
+
+--------+
+........|
+........|
+.....*..|
+..O.OX..|
+........|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO161
+
+--------+
+........|
+........|
+.....X..|
+..X.XO..|
+.....*..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO162
+
+--------+
+........|
+........|
+.....O*.|
+..O.OX..|
+.....X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO163
+
+--------+
+........|
+........|
+.....XX.|
+..X.XO..|
+....*O..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO164
+
+--------+
+........|
+........|
+.....OO.|
+..O*OX..|
+....XX..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO165
+
+--------+
+........|
+........|
+.....XX.|
+..XXXO..|
+....OO..|
+........|
+....O...|
+........|
+........|
+........|
+.....*..|
+........|
+
+:8,sFJ
+
+
+Pattern JHO166
+
+------------+
+............|
+............|
+..*......OO.|
+......OOOX..|
+........XX..|
+............|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JHO167
+
+--------+
+........|
+........|
+.....X..|
+..X.XO..|
+....*...|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO168
+
+--------+
+........|
+........|
+.....O..|
+..O*OX..|
+....X...|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO169
+
+--------+
+........|
+........|
+.....X..|
+..XXXO..|
+....O.*.|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO170
+
+--------+
+........|
+........|
+.....O*.|
+..OOOX..|
+....X.X.|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO171
+
+--------+
+........|
+........|
+.....XX.|
+..XXXO..|
+....O.O.|
+........|
+....O...|
+........|
+........|
+........|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO172
+
+------------+
+............|
+............|
+..*......OO.|
+......OOOX..|
+........X.X.|
+............|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JHO173
+
+--------+
+........|
+........|
+.....X*.|
+..X.XO..|
+........|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO174
+
+--------+
+........|
+........|
+....*OX.|
+..O.OX..|
+........|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO175
+
+--------+
+........|
+........|
+....XXO.|
+..X.XO..|
+.....*..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO176
+
+--------+
+........|
+......*.|
+....OOX.|
+..O.OX..|
+.....X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO177
+
+--------+
+........|
+......X.|
+....XXO.|
+..X.XO..|
+.....O..|
+........|
+....O...|
+........|
+........|
+........|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO178
+
+------------+
+............|
+..........O.|
+..*.....OOX.|
+......O.OX..|
+.........X..|
+............|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JHO179
+
+--------+
+........|
+........|
+.....OX.|
+..O.OX..|
+.....*..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO180
+
+--------+
+........|
+........|
+.....XO.|
+..X.XO*.|
+.....X..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO181
+
+--------+
+........|
+........|
+....*OX.|
+..O.OXX.|
+.....O..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO182
+
+--------+
+........|
+........|
+....XXO.|
+..X.XOO.|
+....*X..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO183
+
+--------+
+........|
+........|
+....OOX.|
+..O.OXX.|
+....XO..|
+....*...|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO184
+
+--------+
+........|
+........|
+....XXO.|
+..X.XOO.|
+...*OX..|
+....X...|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO185
+
+--------+
+........|
+........|
+....OOX.|
+..O.OXX.|
+...XXO..|
+....O...|
+....X*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO186
+
+--------+
+........|
+........|
+....XXO.|
+..X.XOO.|
+...OOX..|
+...*X...|
+....OX..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO187
+
+--------+
+........|
+........|
+....OOX.|
+..O.OXX.|
+...XXO..|
+...XO*..|
+....XO..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO188
+
+--------+
+........|
+........|
+....XXO.|
+..X.XOO.|
+...OOX..|
+...OXX..|
+....OX..|
+....*...|
+........|
+
+:8,sFJ
+
+
+Pattern JHO189
+
+--------+
+........|
+........|
+....OOX.|
+..O.OXX.|
+...XXO..|
+...XOO..|
+....XO..|
+....X...|
+......*.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO190
+
+--------+
+........|
+........|
+....XXO.|
+..X*XOO.|
+...OOX..|
+...OXX..|
+....OX..|
+....O...|
+......X.|
+........|
+
+:8,sFJ
+
+
+Pattern JHO191
+
+--------+
+........|
+........|
+...*OOX.|
+..OXOXX.|
+...XXO..|
+...XOO..|
+....XO..|
+....X...|
+......O.|
+........|
+
+:8,sFJ
+
+
+Pattern JHO192
+
+---------+
+.........|
+.........|
+...*XXXO.|
+...XOXOO.|
+....OOX..|
+....OXX..|
+.....OX..|
+.....O...|
+.......X.|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO193
+
+---------+
+.........|
+...*.....|
+...XOOOX.|
+...OXOXX.|
+....XXO..|
+....XOO..|
+.....XO..|
+.....X...|
+.......O.|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO194
+
+---------+
+.........|
+...X.....|
+..*OXXXO.|
+...XOXOO.|
+....OOX..|
+....OXX..|
+.....OX..|
+.....O...|
+.......X.|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO195
+
+----------+
+..........|
+...*O.....|
+...XXOOOX.|
+....OXOXX.|
+.....XXO..|
+.....XOO..|
+......XO..|
+......X...|
+........O.|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO196
+
+----------+
+..........|
+...XX.....|
+..*OOXXXO.|
+....XOXOO.|
+.....OOX..|
+.....OXX..|
+......OX..|
+......O...|
+........X.|
+..........|
+
+:8,sFJ
+
+
+Pattern JHO197
+
+---------+
+.........|
+..OO...*.|
+.XXXOOOX.|
+...OXOXX.|
+....XXO..|
+....XOO..|
+.....XO..|
+.....X...|
+.......O.|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO198
+
+--------+
+........|
+........|
+....OOX.|
+..O.OXX.|
+...*XO..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO199
+
+--------+
+........|
+........|
+....XXO.|
+..X.XOO.|
+...XOX..|
+....*...|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO200
+
+--------+
+........|
+......*.|
+....OOX.|
+..O.OXX.|
+...OXO..|
+....X...|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO201
+
+--------+
+........|
+......X.|
+....XXO.|
+..X.XOO.|
+...XOX*.|
+....O...|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO202
+
+--------+
+........|
+......X*|
+....XXO.|
+..X.XOO.|
+...XOX..|
+....O...|
+....O...|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JHO203
+
+--------+
+........|
+......OX|
+....OOX.|
+..O.OXX.|
+...OXO*.|
+....X...|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO204
+
+--------+
+........|
+.....*XO|
+....XXO.|
+..X.XOO.|
+...XOXX.|
+....O...|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO205
+
+--------+
+......*.|
+.....XOX|
+....OOX.|
+..O.OXX.|
+...OXOO.|
+....X...|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO206
+
+--------+
+........|
+........|
+........|
+..O.OX..|
+.....*..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO207
+
+--------+
+........|
+........|
+........|
+..X.XO..|
+....*X..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO208
+
+--------+
+........|
+........|
+........|
+..O.OX..|
+....XO*.|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO209
+
+--------+
+........|
+........|
+........|
+..X.XO*.|
+....OXX.|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO210
+
+--------+
+........|
+........|
+........|
+..O.OXX.|
+....XOO.|
+........|
+....X.*.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO211
+
+--------+
+........|
+........|
+....*...|
+..X.XOO.|
+....OXX.|
+........|
+....O.X.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO212
+
+--------+
+........|
+........|
+....X...|
+..O*OXX.|
+....XOO.|
+........|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO213
+
+--------+
+........|
+...*....|
+....O...|
+..XXXOO.|
+....OXX.|
+........|
+....O.X.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO214
+
+--------+
+........|
+..*X....|
+....X...|
+..OOOXX.|
+....XOO.|
+........|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO215
+
+--------+
+........|
+..XO..*.|
+....O...|
+..XXXOO.|
+....OXX.|
+........|
+....O.X.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO216
+
+--------+
+........|
+..OX..X.|
+....X...|
+..OOOXX.|
+....XOO.|
+....*...|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO217
+
+--------+
+........|
+..OX....|
+....X*..|
+..OOOXX.|
+....XOO.|
+....X...|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO218
+
+--------+
+........|
+..OX.*..|
+....XOX.|
+..OOOXX.|
+....XOO.|
+....X...|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO219
+
+--------+
+........|
+..OX*OX.|
+....XOX.|
+..OOOXX.|
+....XOO.|
+....X...|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO220
+
+--------+
+.....X..|
+..OXOOX.|
+...*XOX.|
+..OOOXX.|
+....XOO.|
+....X...|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO221
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXX.|
+....XOO.|
+....X...|
+....X.O.|
+.....*X.|
+........|
+
+:8,sFJ
+
+
+Pattern JHO222
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXX.|
+....XOO.|
+....X.X.|
+....X.O.|
+.....OX.|
+......*.|
+
+:8,sFJ
+
+
+Pattern JHO223
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXX.|
+....XOO.|
+....XXX.|
+....X.O.|
+.....OX.|
+......O.|
+........|
+....*...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO224
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXX.|
+....XOO.|
+....X*X.|
+....X.O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO225
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXX.|
+....XOO.|
+....XOX*|
+....XXO.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO226
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXX.|
+....XOO.|
+....XO.O|
+....XXO.|
+......X.|
+......*.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO227
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXXX|
+....XOO*|
+....XO.O|
+....XXO.|
+......X.|
+......O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO228
+
+--------+
+.....X..|
+..OXOOX.|
+...O.OX.|
+..OOOXXX|
+....XOOO|
+....XO.O|
+....XXO.|
+.....XX*|
+......O.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO229
+
+--------+
+.....X..|
+..OXOOX*|
+...O.OX.|
+..OOOXXX|
+....XOOO|
+....XO.O|
+....XXO.|
+.....XXO|
+......O.|
+.....X..|
+........|
+
+:8,sFJ
+
+
+Pattern JHO230
+
+--------+
+........|
+........|
+....*...|
+..X.XO..|
+....OXX.|
+........|
+....O...|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JHO231
+
+--------+
+........|
+........|
+....X...|
+..O*OX..|
+....XOO.|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO232
+
+--------+
+........|
+........|
+....X.X.|
+..OOOX..|
+....XOO.|
+....*...|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JHO233
+
+--------+
+........|
+..X.....|
+....X.X.|
+..OOOX..|
+....XOO.|
+....O...|
+...*X...|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JHO234
+
+---------+
+.........|
+..*X.....|
+.....X.X.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO235
+
+---------+
+.........|
+..OXX.*..|
+.....X.X.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO236
+
+---------+
+.........|
+..OXX.OX.|
+...*.X.X.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO237
+
+---------+
+.........|
+..OXX.OX.|
+.*.O.XXX.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO238
+
+---------+
+.........|
+..OXX.O..|
+..*..XXX.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO239
+
+---------+
+.........|
+..OX*....|
+..X..X.X.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO240
+
+---------+
+.........|
+.XOXO....|
+..X.*X.X.|
+...OOOX..|
+.....XOO.|
+.....O...|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JHO241
+
+---------+
+.........|
+.........|
+.........|
+...X.X...|
+.........|
+.........|
+.....O...|
+.........|
+.........|
+.........|
+......*..|
+.........|
+.........|
+
+:8,sFj
+
+
+Pattern JHO242
+
+------------+
+............|
+............|
+..*.........|
+......O.O...|
+............|
+............|
+........X...|
+............|
+............|
+............|
+.........X..|
+............|
+
+:8,sFj
+
+
diff --git a/patterns/hoshi_other.sgf b/patterns/hoshi_other.sgf
new file mode 100644 (file)
index 0000000..e50452a
--- /dev/null
@@ -0,0 +1,268 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by the Free Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation - version 3 or
+at your option any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19]HA[0]
+GN[Hoshi+other joseki database]
+;B[pd]
+(;B[pj];C[#kosumi tsuke for 6-9 stone games]PL[W]
+(;W[qf]PL[B]
+(;B[qe]MA[mk]
+(;W[pf]C[S]MA[mi]
+(;B[nd]MA[mk]C[U]PL[W];W[ph]C[j];B[re]MA[lk]C[j])
+
+(;B[tt];W[od]MA[mi];B[oc];W[nd]TR[mi];B[nc];W[pc]MA[mi];B[qc];W[pb]
+MA[mi];B[qb];W[pe]MA[mi];B[qd])
+)
+
+(;W[oe]
+(;B[od]MA[lk])
+
+(;B[pf]C[0
+# playable if ladder works but dangerous for GNU Go
+]MA[mh])
+)
+)
+
+(;B[qh]C[j
+]MA[nl])
+)
+
+(;W[pg];B[nd];W[ld];B[nf];W[oe];B[od]MA[ki])
+
+(;W[qg]
+(;B[qe]MA[ml]C[j
+:-,shape(0.015)
+])
+
+(;B[nc]MA[ll]C[j
+])
+
+(;B[mc]MA[kl]C[j
+])
+
+(;B[nd]MA[mk]C[j
+:-,shape(-0.02)
+])
+
+(;B[jj]PL[B];B[jd]PL[B];B[og]MA[ik]C[j
+:-,shape(-0.02)
+])
+
+(;B[md]MA[mj]C[0
+])
+)
+)
+
+(;B[qg]C[0];C[#17 stone concrete];B[pj]C[0]
+(;W[re]MA[ok]C[0];B[qe]MA[ok];W[pc]MA[ok]C[0];B[qd]MA[ok])
+
+(;W[qf]MA[ok]C[0];B[pg]MA[ok]C[U])
+
+(;W[pe]MA[ok]C[0];B[qd]MA[ok]C[U])
+
+(;W[qd]MA[ok]C[0];B[qe]MA[ok]C[U];W[re]MA[ok]C[0];B[pe]MA[ok]C[U];
+W[rd]MA[ok]C[0];B[rf]MA[ok]C[U];W[pc]MA[ok]C[0];B[oc]MA[ok]C[U];W[pb]
+MA[ok]C[0];B[ob]MA[ok]C[U];W[rb]MA[ok]C[0])
+
+(;W[qc]MA[ok]C[0];C[#sansan inv];B[pc]MA[ok]C[U];W[qd]MA[ok]C[0];B[qb]
+MA[ok]C[U]
+(;W[qf]MA[ok]C[0];B[pf]MA[ok]C[U];W[qe]MA[ok]C[0];B[pg]MA[ok]C[U];
+W[rb]MA[ok]C[0];B[pb]MA[ok]C[U];W[rg]MA[ok]C[0];B[rh]MA[ok]C[U];W[sg]
+MA[ok]C[0])
+
+(;W[rb]MA[ok]C[0];B[pb]MA[ok]C[U];W[qf]MA[ok]C[0];B[pf]MA[ok]C[U];
+W[qe]MA[ok]C[0];B[rg]MA[ok]C[U]
+(;W[ra]MA[ok]C[0];B[sd]MA[ok]C[U])
+
+(;W[rf]MA[ok]C[0];B[ra]MA[ok]C[U])
+)
+)
+)
+
+(;W[pf]
+(;B[nd]MA[lh]C[S]
+(;W[qd]MA[mg]C[S];B[qc]MA[mg]C[S];W[qe]MA[mg]C[S];B[rc]MA[mg]C[S];
+W[qj]MA[ml]C[S];B[jc]MA[ig]C[S])
+
+(;W[qc]C[0];B[qd]MA[mg]C[S])
+
+(;W[pj]C[j
+]MA[nl];B[qf]MA[lh]C[t
+];W[qg]MA[lk]C[S];B[qe]MA[lh]C[S];
+W[pg]MA[lk]C[S])
+)
+
+(;B[tt];W[nd]
+C[j
+#applicable in isolation or if b makes a pincer on the right
+]
+MA[jg]
+(;B[oe]MA[mg];W[qc]MA[mg];B[qd]MA[jg];W[pc]MA[jg];B[of]MA[jh];W[od]
+MA[jg];B[pg]MA[ji])
+
+(;B[pc]C[j
+]MA[mg];W[nf]MA[lh];B[nb]MA[lh])
+
+(;B[qc]MA[mg]C[j
+];W[nf]MA[lh])
+)
+
+(;B[nc]C[0
+#no reason not to answer at O16
+]MA[lh]
+(;W[qd]MA[lh];B[qc]MA[lh];W[qe]MA[lh];B[rc]MA[lh];W[qj]MA[ll])
+
+(;W[pj]C[j
+]MA[kl];B[qf]MA[kh];W[qg]MA[kh];B[qe]MA[kh];W[pg]MA[kh])
+)
+)
+
+(;W[qc];B[qd];W[pc]C[S]MA[nf];B[oc]MA[nf]C[S]
+(;W[ob]MA[nf]C[S];B[nc]MA[mf]C[S];W[nb]MA[mf]C[S];B[mc]MA[lf]C[S];
+W[rd]MA[nf]C[S];B[re]MA[ng]C[S];W[rc]MA[nf]C[S];B[qf]MA[mg]C[S])
+
+(;W[rd]C[#Not joseki
+]
+(;B[re]MA[nf]C[S];W[rc]MA[nf]C[S]
+(;B[qf]C[j
+]MA[ng];W[ob]MA[nf]C[S];B[nc]MA[mf]C[S];W[nb]MA[mf]C[S];
+B[mc]MA[lf]C[S])
+
+(;B[od]C[#depending on circumstances, P18 might be possible ?
+S
+]
+MA[mg])
+)
+
+(;B[od]MA[nf]C[0
+])
+)
+)
+
+(;W[qe];B[qd]MA[mg]
+(;W[pe];B[oe]MA[mh]
+(;W[od];B[re]MA[lh];W[rf];B[rd]MA[mh])
+
+(;W[of];B[ne]MA[lh])
+)
+
+(;W[rd];B[pe]MA[mh]
+(;W[qf];B[rc]MA[ng])
+
+(;W[rc];B[qf]MA[nh];W[re];B[pf]MA[mi])
+)
+)
+
+(;W[tt]
+(;B[md];W[qc];B[qd]MA[mf]C[S];W[pc]MA[mf]C[S];B[oc]MA[mf]C[S];W[ob]
+MA[mf]C[S];B[nc]MA[mf]C[S];W[rd]MA[mf]C[S];B[re]MA[mg]C[S];W[rc]MA[mf]
+C[S];B[qf]C[S])
+
+(;B[nc]
+(;W[qc];B[qd]MA[nf]C[S];W[pc];B[oc]MA[nf]C[S];W[rd];B[re]MA[ng]C[S];
+W[rc];B[qf]MA[ng]C[S])
+
+(;W[rd]
+(;B[qe]MA[mh])
+
+(;B[qc]MA[lg])
+)
+)
+
+(;B[mc];W[qc];B[qd]MA[mf]C[S];W[pc]C[S]MA[mf];B[oc]C[S]MA[mf];W[ob]
+C[S]MA[mf];B[nb]C[S]MA[mf];W[od]C[S]MA[mf];B[nc]C[S]MA[mf];W[rd]C[S]
+MA[mf];B[re]C[S]MA[mf];W[rc]C[S]MA[mf];B[qf]C[S]MA[mg]
+(;W[pa]C[S]MA[mf];B[oe]C[S]MA[mf])
+
+(;W[pb]C[S]MA[mf];B[oe]C[S]MA[mf])
+)
+)
+
+(;W[pe];B[od]MA[lh];W[qd];B[qc]MA[mh])
+
+(;W[pg]C[j
+]MA[li];B[nd]MA[li]
+(;W[qd]MA[li]
+(;B[qc]MA[li]
+(;W[qe]MA[li];B[rc]MA[li];W[pe]MA[li];B[od]MA[li];W[qk]MA[ll];B[jc]
+MA[hi])
+
+(;W[pe]MA[li];B[od]MA[li];W[re]MA[li];B[rc]MA[li];W[qk]MA[lm];B[jc]
+MA[hi])
+
+(;W[rc]MA[li]
+(;B[pc]MA[li];W[qe]MA[li];B[rb]MA[li];W[qk]MA[lm];B[jc]MA[hi])
+
+(;B[qe]MA[li];W[rd]MA[li];B[pc]MA[li];W[pe]MA[li]
+(;B[pf]MA[li];W[oe]MA[li];B[qg]MA[li];W[of]MA[li];B[qf]MA[li];W[ph]
+MA[li];B[ri]MA[lk];W[od]MA[lj];B[oc]MA[lj];W[nc]MA[kj];B[nb]MA[kj];
+W[mc]MA[kj];B[mb]MA[jj];W[lc]MA[jj];B[rb]MA[kj])
+
+(;B[oe]MA[li];W[pf]MA[li];B[rb]MA[li]
+(;W[re]MA[li])
+
+(;W[sb]C[0
+]MA[li];B[re]MA[li];W[qb]MA[li];B[ra]MA[li])
+)
+)
+)
+)
+
+(;B[qe]MA[li];W[pe]MA[li];B[re]MA[li]
+(;W[rd]MA[li];B[rg]MA[li];W[pc]MA[li];B[od]MA[li];W[ob]MA[li];B[nb]
+MA[li]
+(;W[rb]MA[li];B[pf]MA[li])
+
+(;W[pf];B[qc]MA[li];W[rc];B[qb]MA[li];W[rb];B[pb]MA[li];W[qa];B[oc]
+MA[li]
+(;W[rh];B[qh]MA[li];W[rf];B[ri]MA[li];W[qf];B[pk]MA[lm])
+
+(;W[rf];B[qf]MA[li];W[qg];B[sf]MA[li];W[rh];B[ri]MA[lk];W[sd];B[se]
+MA[lk];W[qh];B[sh]MA[lk];W[qj];B[sb]MA[lk])
+)
+)
+
+(;W[pc]MA[li]C[0
+];B[od]MA[li];W[rc];B[pf]MA[li];W[nb]
+(;B[og]MA[li]C[j
+])
+
+(;B[mb]MA[ki]
+(;W[ob];B[qb]MA[ki]
+(;W[rb];B[nc]MA[ki];W[qc];B[lc]MA[ki])
+
+(;W[qc];B[mc]MA[ki];W[rb])
+)
+
+(;W[mc]C[0
+];B[ob]MA[ki];W[lb];B[oc]MA[ki])
+)
+)
+)
+)
+
+(;W[qk]MA[km]C[j
+];B[jc]MA[hl]C[j
+])
+)
+
+)
diff --git a/patterns/influence.db b/patterns/influence.db
new file mode 100644 (file)
index 0000000..78c1312
--- /dev/null
@@ -0,0 +1,746 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Database of influence patterns.
+#
+#  ? - don't care
+#  . - empty
+#  O - color of dragon making influence
+#  X - opposite color of O
+#  o - O or empty
+#  x - X or empty
+#  , - point which influence can't pass through
+#
+#
+# Two different classes of patterns are used here.
+#
+#  E - Enhance influence.
+#  I - Invasion points.
+
+
+attribute_map value_only
+
+goal_elements none
+# callback_data is pattern class dependent for this database
+
+
+########################
+#
+# Enhancement patterns
+#
+########################
+
+callback_data O
+
+
+Pattern Enhance1
+
+o..?
+O.*.
+O...
+o.??
+
+:8,E,value(30)
+
+
+Pattern Enhance2
+
+oO....
+oo..*.
+oO....
+
+:-,E,value(30)
+
+
+Pattern Enhance3
+
+oO.....
+ooO..*.
+oO.....
+
+:-,E,value(30)
+
+
+Pattern Enhance4
+
+ooO....
+ooo..*.
+oO.....
+
+:8,E,value(20)
+
+
+Pattern Enhance5
+
+oO.....
+oO...*.
+oo.....
+oO.....
+
+:8,E,value(30)
+
+
+Pattern Enhance6
+
+oO.....
+O....*.
+oo.....
+oO.....
+
+:8,E,value(20)
+
+
+Pattern Enhance7
+
+oO......
+ooO...*.
+oo......
+oO......
+
+:8,E,value(20)
+
+
+Pattern Enhance8
+# gf Corrected symmetry. (3.1.23)
+
+oO....
+o...*.
+o.....
+oO....
+
+:8,E,value(15)
+
+
+Pattern Enhance9
+
+oO.....
+oO...*.
+o......
+O......
+
+:8,E,value(20)
+
+
+Pattern Enhance10
+
+oO....
+O...*.
+o.....
+O.....
+
+:8,E,value(30)
+
+
+Pattern Enhance11
+
+oO....
+o...*.
+O.....
+O.....
+
+:8,E,value(30)
+
+
+Pattern Enhance12
+
+oO.....
+o....*.
+oO.....
+O......
+
+:8,E,value(30)
+
+
+Pattern Enhance13
+
+oO.....
+oo...*.
+ooO....
+O......
+
+:8,E,value(30)
+
+
+Pattern Enhance14
+
+oO....
+o...*.
+o.....
+O.....
+
+:8,E,value(20)
+
+
+Pattern Enhance15
+
+??.....??
+oo.....oo
+oo.O...oo
+......*..
+.........
+---------
+
+:8,E,value(30)
+
+??.....??
+ac.....oo
+bd.O...oo
+......*..
+.........
+---------
+
+;o_somewhere(a,b,c,d)
+
+
+Pattern Enhance16
+
+oo..|
+oO.*|
+oo..|
+
+:-,E,value(20)
+
+
+Pattern Enhance17
+
+oo...|
+oO.*.|
+oo...|
+
+:-,E,value(20)
+
+
+Pattern Enhance18
+
+oo...
+oO...
+...*.
+.....
+-----
+
+:8,E,value(20)
+
+
+Pattern Enhance19
+
+oo...
+oo.*.
+oO...
+.....
+.....
+.....
+-----
+
+:8,E,value(20)
+
+
+Pattern Enhance20
+
+|..ooooo
+|.......
+|..*....
+|.......
+|.......
+|..O.oo.
+|....oo.
+|.......
+|.......
++-------
+
+:8,E,value(50)
+
+|..ooooo
+|.......
+|..*....
+|.......
+|.......
+|..O.ac.
+|....bd.
+|.......
+|.......
++-------
+
+;o_somewhere(a,b,c,d)
+
+
+Pattern Enhance21
+
+|.........o
+|.........o
+|..O.oo...o
+|....oo.*.o
+|..........
+|..........
++----------
+
+:8,E,value(50)
+
+|.........o
+|.........o
+|..O.ac...o
+|....bd.*.o
+|..........
+|..........
++----------
+
+;o_somewhere(a,b,c,d)
+
+
+Pattern Enhance22
+
+|..ooooo
+|.......
+|..*....
+|.......
+|.......
+|....oo.
+|..O.oo.
+|.......
+|.......
++-------
+
+:8,E,value(40)
+
+|..ooooo
+|.......
+|..*....
+|.......
+|.......
+|....ac.
+|..O.bd.
+|.......
+|.......
++-------
+
+;o_somewhere(a,b,c,d)
+
+
+Pattern Enhance23
+
+|.........o
+|.........o
+|....oo...o
+|..O.oo.*.o
+|..........
+|..........
++----------
+
+:8,E,value(40)
+
+|.........o
+|.........o
+|....ac...o
+|..O.bd.*.o
+|..........
+|..........
++----------
+
+;o_somewhere(a,b,c,d)
+
+
+Pattern Enhance24
+
+??....
+??O...
+.O..*.
+......
+......
+------
+
+:8,E,value(30)
+
+
+Pattern Enhance25
+
++------
+|......
+|......
+|.....o
+|.o.X.o
+|......
+|..O.*.
+|......
+|..oo..
+|..oo..
+
+:8,E,value(15)
+
+
+Pattern Enhance26
+
++------
+|......
+|......
+|.....o
+|.*.X.o
+|......
+|..O.o.
+|......
+|..oo..
+|..oo..
+
+:8,E,value(15)
+
+
+########################
+#
+# Invasion patterns
+#
+########################
+
+callback_data none
+
+
+Pattern Invade1
+
++-----
+|.....
+|.....
+|..*..
+|...O.
+|.....
+
+:\,I,value(3)
+
+
+Pattern Invade2
+
++-------
+|.......
+|.......
+|..*.OX.
+|...O.X.
+|.......
+
+:8,I,value(3)
+
+
+Pattern Invade3
+
+|.....
+|.....
+|.....
+|.....
+|..*..
+|.....
+|.....
+|.....
+|.....
+|..O..
+
+:8,sIe,value(0.2)
+
+
+Pattern Invade4
+
+|.....
+|.....
+|.....
+|.....
+|..*..
+|.....
+|.....
+|.....
+|.....
+|..oO.
+
+:8,sIe,value(0.2)
+
+
+Pattern Invade4b
+
+|.....
+|.....
+|.....
+|.....
+|..*..
+|.....
+|.....
+|.....
+|.....
+|..ooO
+
+:8,sIe,value(0.2)
+
+
+Pattern Invade4c
+
+|.....?
+|.....?
+|.....?
+|.....?
+|..*..?
+|.....?
+|.....?
+|.....?
+|.....?
+|..oooO
+
+:8,sIe,value(0.2)
+
+
+Pattern Invade5
+
+|.....
+|.....
+|.....
+|..*..
+|.....
+|.....
+|.....
+|..O..
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade6
+
+|.....
+|.....
+|.....
+|..*..
+|.....
+|.....
+|.....
+|..oO.
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade6b
+
+|.....
+|.....
+|.....
+|..*..
+|.....
+|.....
+|.....
+|..ooO
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade6c
+
+|.....?
+|.....?
+|.....?
+|..*..?
+|.....?
+|.....?
+|.....?
+|..oooO
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade7a
+
+O.....o
+.......
+.......
+...*...
+.......
+.......
+o.....o
+
+:\,Ie,value(0.2)
+
+
+Pattern Invade7b
+
+.......
+.......
+..O....
+.......
+....*..
+.......
+.......
+
+:\,Ie,value(0.2)
+
+
+Pattern Invade7c
+# gf Corrected symmetry. (3.1.23)
+
+.......
+.......
+.......
+..O.*..
+.......
+.......
+.......
+
+:-,Ie,value(0.2)
+
+
+Pattern Invade7d
+
+O.....o
+.......
+.......
+...*...
+.......
+.......
+-------
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade8
+
++-----
+|.....
+|.....
+|..*..
+|.....
+|..Ooo
+
+:8,sI,value(2)
+
+
+Pattern Invade9
+
++-----
+|.....
+|.....
+|..*..
+|.....
+|...Oo
+
+:8,sI,value(2)
+
+
+Pattern Invade10
+
++-----
+|.....
+|.....
+|..*..
+|.....
+|....O
+
+:\,sI,value(2)
+
+
+Pattern Invade11
+
++------
+|......
+|......
+|..*...
+|......
+|......
+|.....O
+
+:\,sI,value(2)
+
+
+Pattern Invade12
+
++-------
+|.......
+|.......
+|..*....
+|.......
+|.......
+|.......
+|......O
+
+:\,sI,value(2)
+
+
+Pattern Invade13
+
+|......
+|..O...
+|......
+|..*...
+|......
+|...O..
+|......
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade14
+
+|......
+|...O..
+|......
+|...*..
+|......
+|...O..
+|......
+
+:8,Ie,value(0.2)
+
+
+Pattern Invade15
+
+|......
+|......
+|......
+|.*.O..
+|......
+|......
+|......
+
+:8,Ie,value(0.4)
+
+
+Pattern Invade16
+
++------
+|......
+|......
+|..*...
+|......
+|......
+|......
+|..O...
+
+:8,sI,value(2)
+
+
+Pattern Invade17
+
++------
+|......
+|......
+|.....x
+|...O.x
+|......
+|......
+|...*..
+|......
+|......
+|...O..
+|......
+
+:8,sI,value(0.5)
+
+
+# END OF FILE
diff --git a/patterns/joseki.c b/patterns/joseki.c
new file mode 100644 (file)
index 0000000..9f442c3
--- /dev/null
@@ -0,0 +1,459 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Convert joseki from sgf format to patterns.db format. */
+
+#include "board.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#define USAGE "\
+Usage : joseki prefix filename\n\
+"
+
+/* Joseki move types. */
+#define STANDARD  0
+#define URGENT    1
+#define MINOR     2
+#define TRICK     3
+#define ANTISUJI  4
+#define TENUKI_OK 5
+
+
+/* We don't want to play moves on edges of board which might have been
+ * cropped, since there might appear an accidential capture.
+ */
+#define SAFE_ON_BOARD(i, j) ((i) >= 0 && (j) >= 0\
+                            && (i) < MAX_BOARD - 1 && (j) < MAX_BOARD - 1)
+
+static int boardsize;
+
+
+/* Identify the type of joseki move.
+ * FIXME: We might want the relax the requirement that this info comes
+ *        as the very first character.
+ */
+static int
+identify_move_type(char *text)
+{
+  if (!text)
+    return STANDARD;
+  
+  switch ((int) *text) {
+  case 'u':
+  case 'U':
+    return URGENT;
+    break;
+  case 'J':
+  case 'S':
+    return STANDARD;
+    break;
+  case 'j':
+  case 's':
+    return MINOR;
+    break;
+  case 'T':
+    return TRICK;
+    break;
+  case 't':
+    return TENUKI_OK;
+    break;
+  case '0':
+  case 'a':
+  case 'A':
+    return ANTISUJI;
+    break;
+  }
+
+  return STANDARD;
+}
+
+/* Copy the lines starting with a certain character to stdout. */
+static void
+write_selected_lines(char *text, char start_char)
+{
+  char *p;
+  if (!text)
+    return;
+  while (1) {
+    p = strchr(text, '\n');
+    if (p)
+      *p = 0;
+    if (*text == start_char)
+      printf("%s\n", text);
+    if (p) {
+      *p = '\n';
+      text = p+1;
+    }
+    else
+      break;
+  }
+}
+
+/* Is there any line starting with a certain character? */
+static int
+selected_line_exists(char *text, char start_char)
+{
+  char *p;
+  if (!text)
+    return 0;
+  while (1) {
+    if (*text == start_char)
+      return 1;
+    p = strchr(text, '\n');
+    if (p)
+      text = p+1;
+    else
+      break;
+  }
+  return 0;
+}
+
+/* Write the main diagram or the constraint diagram. In the former
+ * case, pass a NULL pointer for labels.
+ */
+static void
+write_diagram(int movei, int movej, int color, int marki, int markj,
+             char labels[MAX_BOARD][MAX_BOARD])
+{
+  int i, j;
+  
+  for (i = -1; i <= marki; i++) {
+    for (j = markj; j >= 0; j--) {
+      if (i == -1)
+       printf("-");
+      else if (labels && labels[i][j])
+       printf("%c", labels[i][j]);
+      else if (i == movei && j == movej)
+       printf("*");
+      else if (BOARD(i, j) == color)
+       printf("O");
+      else if (BOARD(i, j) == OTHER_COLOR(color))
+       printf("X");               
+      else
+       printf(".");
+    }
+    if (i == -1)
+      printf("+\n");
+    else
+      printf("|\n");
+  }
+}
+
+/* Write the colon line of the pattern. */
+static void
+write_colon_line(int move_type, char symmetry, char *text)
+{
+  char *p;
+
+  /* Locate a possible colon line in the sgf file comment. */
+  if (!text)
+    p = NULL;
+  else if (*text == ':')
+    p = text + 1;
+  else {
+    p = strstr(text, "\n:");
+    if (p)
+      p += 2;
+  }
+
+  printf(":%c,sF", symmetry);
+  switch (move_type) {
+  case URGENT:
+    printf("U");
+    break;
+  case STANDARD:
+    printf("J");
+    break;
+  case MINOR:
+    printf("j");
+    break;
+  case TRICK:
+    printf("T");
+    break;
+  case TENUKI_OK:
+    printf("t");
+    break;
+  case ANTISUJI:
+    printf("N");
+    break;
+  }
+
+  if (p) {
+    /* A little trick to guess whether the supplied colon line in the
+     * sgf file begins with a classification.
+     */
+    if (strchr(p, '(')
+       && (!strchr(p, ',') || strchr(p, ',') > strchr(p, '(')))
+      printf(",");
+    while (*p != 0 && *p != '\n')
+      fputc(*(p++), stdout);
+  }
+  printf("\n");
+}
+
+
+/* Check if the board and labels are symmetric. */
+static int
+board_is_symmetric(int n, char labels[MAX_BOARD][MAX_BOARD])
+{
+  int i;
+  int j;
+
+  for (i = 0; i <= n; i++) {
+    for (j = 0; j < i; j++) {
+      if (BOARD(i, j) != BOARD(j, i)
+         || (labels && labels[i][j] != labels[j][i]))
+       return 0;
+    }
+  }
+
+  return 1;
+}
+
+/* Write a pattern to stdout. */
+static void
+make_pattern(int movei, int movej, int color,
+            int marki, int markj, int multiple_marks,
+            char labels[MAX_BOARD][MAX_BOARD], char *text,
+            const char *prefix)
+{
+  static int pattern_number = 0;
+  int move_type;
+  char symmetry = '8';
+
+  pattern_number++;
+  move_type = identify_move_type(text);
+
+  printf("Pattern %s%d\n", prefix, pattern_number);
+
+  /* Write comments. */
+  write_selected_lines(text, '#');
+  printf("\n");
+
+  /* Write the main diagram. */
+  write_diagram(movei, movej, color, marki, markj, NULL);
+  printf("\n");
+
+  /* Write the colon line. */
+  if (movei == movej && marki == markj && board_is_symmetric(marki, labels))
+    symmetry = '/';
+  write_colon_line(move_type, symmetry, text);
+  printf("\n");
+
+  /* Write the constraint diagram if there are any labels, a
+   * constraint line, or an action line.
+   */
+  if (labels
+      || selected_line_exists(text, ';')
+      || selected_line_exists(text, '>')) {
+    write_diagram(movei, movej, color, marki, markj, labels);
+
+    printf("\n");
+
+    /* Write constraint and action lines. */
+    write_selected_lines(text, ';');
+    write_selected_lines(text, '>');
+    printf("\n");
+  }
+
+  printf("\n");
+
+  /* Basic sanity checking. We do this at the end to simplify debugging. */
+  if (multiple_marks)
+    fprintf(stderr, "Warning: Multiple square marks in pattern %s%d\n",
+           prefix, pattern_number);
+
+  if (is_suicide(POS(movei, movej), color)) {
+    fprintf(stderr, "Error: Illegal move in pattern %s%d\n",
+           prefix, pattern_number);
+    exit(EXIT_FAILURE);
+  }  
+}
+
+
+/* Analyze the node properties in order to make a pattern. Then make
+ * recursive calls for child node and siblings.
+ */
+static void
+analyze_node(SGFNode *node, const char *prefix)
+{
+  SGFProperty *prop;
+  int i, j;
+  char labels[MAX_BOARD][MAX_BOARD];
+  int label_found = 0;
+  int movei = -1;
+  int movej = -1;
+  int color = EMPTY;
+  int marki = -1;
+  int markj = -1;
+  int multiple_marks = 0;
+  char *comment = NULL;
+
+  /* Clear the labels array. */
+  memset(labels, 0, MAX_BOARD * MAX_BOARD);
+  
+  /* Check the node properties for a move, a square mark, labels, and
+   * a comment.
+   */
+  for (prop = node->props; prop; prop = prop->next) {
+    switch (prop->name) {
+    case SGFSQ: /* Square */
+    case SGFMA: /* Mark */
+      if (marki != -1)
+       multiple_marks = 1;
+      else {
+       get_moveXY(prop, &marki, &markj, boardsize);
+       markj = boardsize - 1 - markj;
+      }
+      break;
+      
+    case SGFW: /* White move */
+      color = WHITE;
+      get_moveXY(prop, &movei, &movej, boardsize);
+      movej = boardsize - 1 - movej;
+      break;
+      
+    case SGFB: /* Black move */
+      color = BLACK;
+      get_moveXY(prop, &movei, &movej, boardsize);
+      movej = boardsize - 1 - movej;
+      break;
+
+    case SGFLB: /* Label, with value like "mh:A" */
+      get_moveXY(prop, &i, &j, boardsize);
+      j = boardsize - 1 - j;
+      gg_assert(prop->value[2] == ':');
+      if (ON_BOARD2(i, j)) {
+       labels[i][j] = prop->value[3];
+       label_found = 1;
+      }
+      break;
+
+    case SGFC: /* Comment */
+      comment = prop->value;
+      break;
+    }
+  }
+
+  /* If we have a move and a square mark, produce a pattern. */
+  if (SAFE_ON_BOARD(movei, movej) && ON_BOARD2(marki, markj))
+    make_pattern(movei, movej, color, marki, markj, multiple_marks,
+                (label_found ? labels : NULL), comment, prefix);
+
+  /* Traverse child, if any. */
+  if (node->child) {
+    if (SAFE_ON_BOARD(movei, movej))
+      tryko(POS(movei, movej), color, NULL);
+    analyze_node(node->child, prefix);
+    if (SAFE_ON_BOARD(movei, movej))
+      popgo();
+  }
+
+  /* Traverse sibling, if any. */
+  if (node->next)
+    analyze_node(node->next, prefix);
+}
+
+
+int
+main(int argc, char *argv[])
+{
+  const char *filename;
+  const char *prefix;
+  SGFNode *sgf;
+
+  /* Check number of arguments. */
+  if (argc != 3) {
+    fprintf(stderr, USAGE);
+    exit(EXIT_FAILURE);
+  }
+
+  prefix = argv[1];
+  filename = argv[2];
+
+  /* Read the sgf file into a tree in memory. */
+  sgf = readsgffile(filename);
+  if (!sgf) {
+    fprintf(stderr, "%s: Couldn't open sgf file %s.\n", argv[0], filename);
+    exit(EXIT_FAILURE);
+  }
+
+#define PREAMBLE "\
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #\n\
+# http://www.gnu.org/software/gnugo/ for more information.          #\n\
+#                                                                   #\n\
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #\n\
+# 2008 and 2009 by the Free Software Foundation.                    #\n\
+#                                                                   #\n\
+# This program is free software; you can redistribute it and/or     #\n\
+# modify it under the terms of the GNU General Public License as    #\n\
+# published by the Free Software Foundation - version 3 or          #\n\
+# (at your option) any later version.                               #\n\
+#                                                                   #\n\
+# This program is distributed in the hope that it will be useful,   #\n\
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #\n\
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #\n\
+# GNU General Public License in file COPYING for more details.      #\n\
+#                                                                   #\n\
+# You should have received a copy of the GNU General Public         #\n\
+# License along with this program; if not, write to the Free        #\n\
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #\n\
+# Boston, MA 02111, USA.                                            #\n\
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\
+# This file is automatically generated by joseki. Do not edit       #\n\
+# it directly. Instead, edit the corresponding sgf file.            #\n\
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\
+\n\n\
+"
+
+  printf(PREAMBLE);
+  printf("attribute_map general\n\n");
+
+  /* Call the engine to setup and clear the board. */
+  board_size = MAX_BOARD;
+  clear_board();
+  
+  /* Determine board size of the file. */
+  if (!sgfGetIntProperty(sgf, "SZ", &boardsize)) {
+    fprintf(stderr, "joseki: error: can't determine file board size\n");
+    return 1;
+  }
+  
+  /* Walk through the tree and make patterns. */
+  analyze_node(sgf, prefix);
+    
+  return 0;
+}
+
+      
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/joseki.dsp b/patterns/joseki.dsp
new file mode 100644 (file)
index 0000000..9563ad5
--- /dev/null
@@ -0,0 +1,109 @@
+# Microsoft Developer Studio Project File - Name="joseki" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Application" 0x0101\r
+\r
+CFG=joseki - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "joseki.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "joseki.mak" CFG="joseki - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "joseki - Win32 Release" (based on "Win32 (x86) Application")\r
+!MESSAGE "joseki - Win32 Debug" (based on "Win32 (x86) Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "joseki - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I "." /I ".." /I "../sgf" /I "../engine" /I "../utils" /D "WIN32" /D "NDEBUG" /D "HAVE_CONFIG_H" /D "_CONSOLE" /D "_MBCS" /Fd"Release/joseki" /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386\r
+# ADD LINK32 sgf.lib utils.lib board.obj /nologo /subsystem:console /incremental:yes /machine:I386 /libpath:"../sgf/$(IntDir)/" /libpath:"../utils/$(IntDir)/" /libpath:"../engine/$(IntDir)/"\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF  "$(CFG)" == "joseki - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I "." /I ".." /I "../sgf" /I "../engine" /I "../utils" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FR /Fd"Debug/joseki" /FD /GZ /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 sgf.lib utils.lib board.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"../sgf/$(IntDir)/" /libpath:"../utils/$(IntDir)/" /libpath:"../engine/$(IntDir)/"\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "joseki - Win32 Release"\r
+# Name "joseki - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\patterns\joseki.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/komoku.db b/patterns/komoku.db
new file mode 100644 (file)
index 0000000..9a27278
--- /dev/null
@@ -0,0 +1,7000 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JK1
+
+-------+
+.......|
+.......|
+..*....|
+..X.O..|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK2
+
+--------+
+........|
+........|
+..*X....|
+...O.X..|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK3
+
+-------+
+.......|
+.......|
+.XO*...|
+..X.O..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK4
+
+--------+
+........|
+........|
+..OXX...|
+..*O.X..|
+........|
+........|
+........|
+
+:8,sFJ-,shape(6)
+
+
+Pattern JK5
+
+-------+
+.......|
+.......|
+.XOO...|
+.XX.O..|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK6
+
+-----------+
+...........|
+...........|
+.*...OXX...|
+.....OO.X..|
+...........|
+........X..|
+
+:8,sFU
+
+
+Pattern JK7
+
+-------------+
+.............|
+.............|
+.*.X...XOO...|
+.......XX.O..|
+.............|
+..........O..|
+.............|
+
+:8,sFt
+
+
+Pattern JK8
+
+-------------+
+.............|
+.............|
+.X.O...OXX...|
+.......OO.X..|
+...*.........|
+..........X..|
+.............|
+
+:8,sFJ
+
+
+Pattern JK9
+
+------------+
+............|
+............|
+O.X.*.XOO...|
+......XX.O..|
+............|
+.........O..|
+............|
+
+:8,sFJ
+
+
+Pattern JK10
+
+-------------+
+.............|
+.....*.......|
+.X.O.X.OXX...|
+.......OO.X..|
+.............|
+..........X..|
+.............|
+
+:8,sFJ
+
+
+Pattern JK11
+
+--------+
+........|
+........|
+..OXX...|
+..OO.X..|
+.....*..|
+........|
+........|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JK12
+
+--------+
+........|
+........|
+..XOO...|
+..XX.O..|
+.....X*.|
+........|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK13
+
+--------+
+........|
+........|
+..OXX...|
+..OO*X..|
+.....OX.|
+........|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK14
+
+--------+
+........|
+........|
+..XOO.*.|
+..XXXO..|
+.....XO.|
+........|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK15
+
+--------+
+........|
+........|
+..OXX.X.|
+..OOOX..|
+.....OX.|
+.....*..|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK16
+
+--------+
+........|
+........|
+..XOO.O.|
+..XXXO..|
+.....XO.|
+.....X*.|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK17
+
+--------+
+........|
+........|
+..OXX.X.|
+..OOOX..|
+.....OX.|
+.....OX.|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK18
+
+-----------+
+...........|
+...........|
+.....XOO...|
+..*..XX.O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK19
+
+-----------+
+...........|
+...........|
+.....OXX...|
+..X..OO.X..|
+........*..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK20
+
+-----------+
+...........|
+...........|
+.....XOO...|
+..O..XX.O..|
+........X*.|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK21
+
+-----------+
+...........|
+...........|
+.....OXX...|
+..X..OO*X..|
+........OX.|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK22
+
+-----------+
+...........|
+...........|
+.....XOO.*.|
+..O..XXXO..|
+........XO.|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK23
+#here
+
+-----------+
+...........|
+...........|
+.....OXX.X.|
+..X..OOOX..|
+........OX.|
+........*..|
+...........|
+...........|
+...........|
+
+:8,sFJ-,shape(6)
+
+
+Pattern JK24
+
+-----------+
+...........|
+...........|
+.....XOO.O.|
+..O..XXXO..|
+........XO.|
+........X*.|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK25
+
+-----------+
+...........|
+...........|
+.....OXX.X.|
+..X..OOOX..|
+........OX.|
+........OX.|
+...........|
+........*..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK26
+
+-----------+
+...........|
+...........|
+.....OXX.X.|
+..X..OOOX..|
+........OX.|
+........OX.|
+........*..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK27
+
+--------+
+........|
+........|
+..XOO...|
+..XX.O..|
+....*...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK28
+
+-----------+
+...........|
+...........|
+.*...OXX...|
+.....OO.X..|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JK29
+
+-----------+
+...........|
+...........|
+.X...XOO...|
+.....XX.O..|
+.......O...|
+...........|
+...........|
+...........|
+...........|
+........*..|
+...........|
+
+:8,sFJ
+
+
+Pattern JK30
+
+-----------+
+...........|
+...........|
+.X...XOO...|
+.....XX.O..|
+.......O...|
+.....*.....|
+...........|
+...........|
+...........|
+........O..|
+...........|
+
+:8,sFt
+
+
+Pattern JK31
+
+----------+
+..........|
+..........|
+....OXX...|
+...*.O.X..|
+..........|
+..........|
+..........|
+
+:8,sFJ-, shape(6)
+
+
+Pattern JK32
+
+-------+
+.......|
+.......|
+.XOO...|
+X.X.O..|
+.......|
+....*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK33
+
+------------+
+............|
+............|
+.*....OXX...|
+.....O.O.X..|
+............|
+.........X..|
+
+:8,sFJ
+
+
+Pattern JK34
+
+--------+
+........|
+........|
+..XOO...|
+.X.X.O..|
+..*.....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK35
+
+--------+
+........|
+........|
+..OXX...|
+.O.O.X..|
+..X*....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK36
+
+--------+
+........|
+..*.....|
+..XOO...|
+.X.X.O..|
+..OX....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK37
+
+--------+
+........|
+..X.....|
+..OXX...|
+.O.O.X..|
+..XO....|
+..*.....|
+........|
+
+:8,sFJ-,shape(6)
+
+
+Pattern JK38
+
+--------+
+........|
+.*O.....|
+..XOO...|
+.X.X.O..|
+..OX....|
+..X.....|
+........|
+
+:8,sFJ
+
+
+Pattern JK39
+
+--------+
+........|
+.XX.....|
+..OXX...|
+.O.O.X..|
+..XO.*..|
+..O.....|
+........|
+
+:8,sFJ
+
+
+Pattern JK40
+
+--------+
+........|
+.OO.....|
+..XOO...|
+.X.X.O..|
+..OX.X*.|
+..X.....|
+........|
+
+:8,sFJ
+
+
+Pattern JK41
+
+--------+
+........|
+.XX.....|
+..OXX...|
+.O.O.X..|
+..XO.OX.|
+..O.....|
+.....*..|
+
+:8,sFJ
+
+
+Pattern JK42
+#gnugo likes this move, which is bad.
+
+--------+
+........|
+.*X.....|
+..OXX...|
+.O.O.X..|
+..XO....|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK43
+
+--------+
+........|
+.XO.....|
+..XOO...|
+.X*X.O..|
+..OX....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK44
+
+--------+
+........|
+.OX.....|
+.*OXX...|
+.OXO.X..|
+..XO....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK45
+
+--------+
+........|
+.XO.....|
+.XXOO...|
+.XOX.O..|
+..OX....|
+...*....|
+........|
+
+:8,sFJ
+
+
+Pattern JK46
+
+--------+
+........|
+........|
+..OXX...|
+.O*O.X..|
+..X.....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK47
+
+--------+
+........|
+........|
+..XOO...|
+.XXX.O..|
+..O.*...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK48
+
+------------+
+............|
+............|
+.*....OXX...|
+.....OOO.X..|
+......X.X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK49
+
+------------+
+............|
+............|
+.X....XOO...|
+.....XXX.O..|
+......O.O...|
+............|
+............|
+............|
+............|
+.........*..|
+............|
+
+:8,sFt-,shape(8)
+
+
+Pattern JK50
+#bad idea without the peep first
+
+---------+
+.........|
+.........|
+...XOO...|
+..X.X.O..|
+.....*...|
+.........|
+.........|
+
+:8,sFN
+
+
+Pattern JK51
+
+------------+
+............|
+............|
+.*....OXX...|
+.....O.O.X..|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK52
+
+------------+
+............|
+............|
+.X....XOO...|
+.....X.X.O..|
+......*.O...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK53
+
+------------+
+............|
+............|
+.O....OXX...|
+.....O.O.X..|
+.....*X.X...|
+............|
+............|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK54
+
+-------+
+.......|
+.......|
+..X....|
+..O*X..|
+.......|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK55
+
+------+
+......|
+......|
+.O*...|
+.XXO..|
+......|
+......|
+
+:8,sFU
+
+
+Pattern JK56
+
+------+
+......|
+......|
+.XX...|
+.OOX..|
+...*..|
+......|
+......|
+
+:8,sFU
+
+
+Pattern JK57
+
+------+
+......|
+......|
+.OO*..|
+.XXO..|
+...X..|
+......|
+......|
+
+:8,sFJ
+
+
+Pattern JK58
+
+-------+
+.......|
+.......|
+..XXX..|
+.*OOX..|
+....O..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK59
+
+--------+
+........|
+........|
+.*.OOO..|
+..XXXO..|
+.....X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK60
+
+--------+
+........|
+........|
+.X.XXX..|
+..OOOX..|
+.....O..|
+....*...|
+........|
+
+:8,sFJ-,shape(6)
+
+
+Pattern JK61
+
+--------+
+........|
+........|
+...OOO..|
+..XXXO..|
+.....X*.|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK62
+
+--------+
+........|
+........|
+...XXX..|
+..OOOX..|
+.....OX.|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK63
+
+--------+
+........|
+........|
+...OOO..|
+..XXXO..|
+.....XO.|
+.....X*.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK64
+
+--------+
+........|
+........|
+...XXX..|
+..OOOX..|
+.....OX.|
+.....OX.|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK65
+
+---------+
+.........|
+.........|
+..*.OOO..|
+...XXXO..|
+......XO.|
+......XO.|
+......X..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK66
+
+----------+
+..........|
+..........|
+...X.XXX..|
+....OOOX..|
+..*....OX.|
+.......OX.|
+.......O..|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK67
+
+----------+
+..........|
+..........|
+..*O.OOO..|
+....XXXO..|
+..X....XO.|
+.......XO.|
+.......X..|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK68
+
+---------+
+.........|
+.........|
+....OO...|
+...*XXO..|
+......X..|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+---------+
+.........|
+......C..|
+...GOOA..|
+...*XXOB.|
+....HIXD.|
+....LKEF.|
+.....MJ..|
+.........|
+.........|
+
+; xplay_attack(A,B,C,D,E,F,G,H,I,J,K,L,M,M)
+
+
+Pattern JK69
+
+---------+
+.........|
+.........|
+....XX*..|
+...XOOX..|
+......O..|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK70
+
+---------+
+.........|
+.........|
+....OOX..|
+...OXXO*.|
+......X..|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK71
+
+---------+
+.........|
+......*..|
+....XXO..|
+...XOOXX.|
+......O..|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK72
+
+---------+
+.........|
+......X..|
+....OOX..|
+...OXXOO.|
+......X*.|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK73
+
+---------+
+.........|
+......O..|
+....XXO..|
+...XOOXX.|
+......OX.|
+.....*...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK74
+
+---------+
+.........|
+......X..|
+....OOX..|
+...OXXOO.|
+......XO.|
+.....X*..|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK75
+
+---------+
+.........|
+......O..|
+...*XXO..|
+...XOOXX.|
+......OX.|
+.....OX..|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK76
+
+---------+
+.........|
+......X..|
+...XOOX..|
+...OXXOO.|
+.....*XO.|
+.....XO..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK77
+
+---------+
+.........|
+......O..|
+...OXXO..|
+...XOOXX.|
+....*X.X.|
+.....OX..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK78
+
+---------+
+.........|
+......X..|
+...XOOX..|
+...OXXOO.|
+....XO.O.|
+....*XO..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK79
+
+---------+
+.........|
+......O..|
+...OXXO..|
+...XOOXX.|
+...*OX.X.|
+....XOX..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK80
+
+---------+
+.........|
+......X..|
+...XOOX..|
+...OXXOO.|
+...XXO.O.|
+....OXO..|
+.....*...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK81
+
+---------+
+.........|
+......O..|
+...OXXO..|
+..*XOOXX.|
+...OOX.X.|
+....X.X..|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK82
+#this is bad, and gnugo will try it.
+#actually, probably ok.  See Ishida p31.  this is simply a non-standard order.
+
+-------+
+.......|
+...*X..|
+..OOX..|
+.OXXOO.|
+....XO.|
+...X...|
+.......|
+
+:8,sFN
+
+
+Pattern JK83
+#we don't start the large avalanche.  It probably has complications to
+
+---------+
+.........|
+.........|
+...*OO...|
+....XXO..|
+......X..|
+.........|
+.........|
+
+:8,sFN
+
+
+Pattern JK84
+
+---------+
+.........|
+.........|
+...XXX...|
+...*OOX..|
+......O..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK85
+
+---------+
+.........|
+.........|
+...OOO...|
+..*XXXO..|
+......X..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK86
+
+---------+
+.........|
+.........|
+...XXX*..|
+..XOOOX..|
+......O..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK87
+
+---------+
+.........|
+.........|
+...OOOX..|
+..OXXXO*.|
+......X..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK88
+
+---------+
+.........|
+......*..|
+...XXXO..|
+..XOOOXX.|
+......O..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK89
+
+---------+
+.........|
+......X..|
+...OOOX*.|
+..OXXXOO.|
+......X..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK90
+
+----------+
+..........|
+.......O..|
+...*XXXOX.|
+...XOOOXX.|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK91
+
+----------+
+..........|
+.......X..|
+..*XOOOXO.|
+...OXXXOO.|
+.......X..|
+..........|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK92
+
+----------+
+..........|
+.......O*.|
+..XOXXXOX.|
+...XOOOXX.|
+.......O..|
+..........|
+..........|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK93
+
+----------+
+..........|
+.......XX.|
+..OXOOOXO.|
+...OXXXOO.|
+.......X*.|
+..........|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK94
+
+----------+
+..........|
+...*...OO.|
+..XOXXXOX.|
+...XOOOXX.|
+.......OX.|
+..........|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK95
+
+-----------+
+...........|
+....X*..XX.|
+...OXOOOXO.|
+....OXXXOO.|
+........XO.|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK96
+
+-----------+
+...........|
+...*OX..OO.|
+...XOXXXOX.|
+....XOOOXX.|
+........OX.|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK97
+
+-----------+
+...........|
+...XXO.*XX.|
+...OXOOOXO.|
+....OXXXOO.|
+........XO.|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK98
+
+-----------+
+...........|
+...OOX.XOO.|
+..*XOXXXOX.|
+....XOOOXX.|
+........OX.|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK99
+
+-----------+
+...........|
+...XXO.OXX.|
+..XOXOOOXO.|
+....OXXXOO.|
+....*...XO.|
+...........|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK100
+
+-----------+
+...........|
+...OOX.XOO.|
+..OXOXXXOX.|
+....XOOOXX.|
+....X...OX.|
+......*....|
+...........|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK101
+
+-----------+
+...........|
+...XXO.OXX.|
+..XOXOOOXO.|
+....OXXXOO.|
+....O...XO.|
+......X.*..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK102
+
+-----------+
+...........|
+...OOX.XOO.|
+..OXOXXXOX.|
+....XOOOXX.|
+....X...OX.|
+.....*O.X..|
+...........|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK103
+
+-----------+
+...........|
+...XXO.OXX.|
+..XOXOOOXO.|
+....OXXXOO.|
+..*.O...XO.|
+.....XX.O..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK104
+
+--------------+
+..............|
+......OOX.XOO.|
+..*..OXOXXXOX.|
+.......XOOOXX.|
+.....X.X...OX.|
+........OO.X..|
+..............|
+..............|
+..............|
+
+:8,sFJ
+
+
+Pattern JK105
+
+--------------+
+..............|
+......XXO.OXX.|
+..X..XOXOOOXO.|
+.......OXXXOO.|
+.....O.O...XO.|
+........XX.O..|
+......*.......|
+..............|
+..............|
+
+:8,sFJ
+
+
+Pattern JK106
+
+--------------+
+..............|
+......OOX.XOO.|
+..O..OXOXXXOX.|
+.......XOOOXX.|
+.....X.X...OX.|
+........OO.X..|
+......X.......|
+..............|
+.........*....|
+..............|
+..............|
+
+:8,sFJ
+
+
+Pattern JK107
+
+--------------+
+..............|
+......XXO.OXX.|
+..X..XOXOOOXO.|
+.......OXXXOO.|
+.....O.O...XO.|
+........XX.O..|
+......O.......|
+..............|
+.........X.*..|
+..............|
+..............|
+
+:8,sFJ
+
+
+Pattern JK108
+#bad
+
+---------+
+.........|
+.........|
+...XXX...|
+..XOOOX..|
+..*...O..|
+.........|
+.........|
+
+:8,sFN
+
+
+Pattern JK109
+
+-------+
+.......|
+.......|
+..OO...|
+..XXO..|
+....X*.|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK110
+
+-------+
+.......|
+.......|
+..XX...|
+..OOX*.|
+....OX.|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK111
+
+-------+
+.......|
+.......|
+..OO*..|
+..XXOX.|
+....XO.|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK112
+
+-------+
+.......|
+.......|
+..XXX..|
+..OOXO.|
+....OX.|
+.....*.|
+.......|
+
+:8,sFU
+
+
+Pattern JK113
+
+--------+
+........|
+........|
+...OOO..|
+..*XXOX.|
+.....XO.|
+......X.|
+........|
+
+:8,sFJ-,shape(6)
+
+
+Pattern JK114
+
+--------+
+........|
+........|
+...XXX..|
+..XOOXO.|
+.....OX.|
+....*.O.|
+........|
+
+:8,sFJ-,shape(6)
+
+
+Pattern JK115
+
+--------+
+........|
+........|
+...OOO..|
+..OXXOX.|
+.....XO.|
+...*X.X.|
+........|
+........|
+
+:8,sFt
+
+
+Pattern JK116
+
+-------+
+.......|
+.......|
+..XXX..|
+.XOOXO.|
+....OX.|
+..XO.O.|
+..*....|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK117
+#don't worry so much about the two stones.
+
+-------+
+.......|
+.......|
+..OOO..|
+.OXXOX.|
+.*..XO.|
+..OX.X.|
+..X....|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JK118
+
+-------+
+.......|
+.......|
+..XXX..|
+.XOOXO.|
+.X..OX.|
+..XO.O.|
+.*O....|
+.......|
+.......|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK119
+
+-------+
+.......|
+.......|
+..OOO..|
+.OXXOX.|
+.O.*XO.|
+..OX.X.|
+.XX....|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JK120
+
+-------+
+.......|
+.......|
+..XXX..|
+.XOOXO.|
+.X.XOX.|
+..XO*O.|
+.OO....|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK121
+
+--------+
+........|
+........|
+...OOO..|
+..OXXOX.|
+.....XO.|
+...OX.X.|
+..*X....|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK122
+
+--------+
+........|
+........|
+...XXX..|
+..XOOXO.|
+.....OX.|
+...XO.O.|
+..XO....|
+...*....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK123
+
+--------+
+........|
+........|
+...OOO..|
+..OXXOX.|
+..*..XO.|
+...OX.X.|
+..OX....|
+...X....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK124
+
+--------+
+........|
+........|
+...XXX..|
+..XOOXO.|
+..X..OX.|
+...XO.O.|
+..XO....|
+..*O....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK125
+#too submissive.  the hane is better.
+
+-------+
+.......|
+.......|
+..XXX..|
+.XOOXO.|
+....OX.|
+..XO.O.|
+...*...|
+.......|
+
+:8,sFN
+
+
+Pattern JK126
+
+--------+
+........|
+........|
+...XXX*.|
+..XOOXO.|
+.....OX.|
+....O.O.|
+........|
+
+:8,sFt-,shape(6)
+
+
+Pattern JK127
+
+--------+
+........|
+........|
+.*.OOOX.|
+..OXXOX.|
+.....XO.|
+....X.X.|
+........|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK128
+
+--------+
+........|
+........|
+...OOOX.|
+..OXXOX.|
+.....XO.|
+...*X.X.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK129
+
+--------+
+........|
+........|
+...XXXO.|
+..XOOXO.|
+.....OX.|
+...XO.O.|
+...*....|
+........|
+
+:8,sFJ
+
+
+Pattern JK130
+
+--------+
+........|
+........|
+...OOOX.|
+..OXXOX.|
+.....XO.|
+...OX.X.|
+..*X....|
+........|
+
+:8,sFJ
+
+
+Pattern JK131
+
+--------+
+........|
+........|
+...XXXO.|
+..XOOXO.|
+.....OX.|
+...XO.O.|
+..XO....|
+...*....|
+........|
+
+:8,sFJ
+
+
+Pattern JK132
+
+--------+
+........|
+........|
+...OOOX.|
+..OXXOX.|
+..*..XO.|
+...OX.X.|
+..OX....|
+...X....|
+........|
+
+:8,sFJ
+
+
+Pattern JK133
+
+--------+
+........|
+........|
+...XXXO.|
+..XOOXO.|
+..X.*OX.|
+...XO.O.|
+..XO....|
+...O....|
+........|
+
+:8,sFJ
+
+
+Pattern JK134
+
+---------+
+.........|
+.........|
+.*..OOOX.|
+...OXXOX.|
+...O.XXO.|
+....OX.X.|
+...OX....|
+....X....|
+.........|
+
+:8,sFJ
+
+
+Pattern JK135
+
+--------+
+........|
+........|
+...OO...|
+...XXO*.|
+.....XO.|
+......X.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK136
+
+--------+
+........|
+........|
+...OO...|
+...XXO..|
+....*XO.|
+......X.|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK137
+#not very good for b.
+
+-------+
+.......|
+.......|
+..OO...|
+..XXO*.|
+....X..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JK138
+
+--------+
+........|
+........|
+...XX...|
+..*OOXX.|
+.....O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK139
+
+--------+
+........|
+........|
+...XX...|
+..OOOXX.|
+.....OX.|
+.....*..|
+........|
+
+:8,sFJ
+
+
+Pattern JK140
+
+---------+
+.........|
+.........|
+...XXX...|
+..*OOOXX.|
+......OX.|
+......O..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK141
+#we need answers to this.
+
+--------+
+........|
+........|
+...OO...|
+...XXO..|
+....*X..|
+........|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK142
+#very bad, but gnugo likes it.
+
+--------+
+........|
+........|
+...XX...|
+...OOX..|
+....XO..|
+.....*..|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK143
+
+--------+
+........|
+........|
+........|
+...X.O..|
+........|
+....*...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK144
+
+--------+
+........|
+........|
+.....*..|
+...O.X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ-,shape(3)
+
+
+Pattern JK145
+
+--------+
+........|
+........|
+.....X*.|
+...X.O..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK146
+
+--------+
+........|
+........|
+....*OX.|
+...O.X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JK147
+
+--------+
+........|
+........|
+....XXO.|
+...X.O..|
+......*.|
+....O...|
+........|
+........|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK148
+
+----------+
+..........|
+..........|
+.*....OOX.|
+.....O.X..|
+........X.|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK149
+
+---------+
+.........|
+.......*.|
+.....XXO.|
+....X.O..|
+.........|
+.....O...|
+.........|
+
+:8,sFJ
+
+
+Pattern JK150
+
+----------+
+..........|
+........X.|
+.*....OOX.|
+.....O.X..|
+..........|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK151
+
+----------+
+..........|
+........O.|
+.X....XXO.|
+.....X.O..|
+..........|
+......O...|
+..........|
+..........|
+..........|
+.......*..|
+..........|
+
+:8,sFJ
+
+
+Pattern JK152
+
+--------+
+........|
+........|
+....*X..|
+...X.O..|
+........|
+....O...|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK153
+
+--------+
+........|
+........|
+*.......|
+...O.X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK154
+
+--------+
+........|
+........|
+........|
+...O.X..|
+........|
+..*.X...|
+........|
+........|
+
+:8,sFN
+
+
+Pattern JK155
+
+--------+
+........|
+........|
+........|
+...X.O..|
+...*....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK156
+
+--------+
+........|
+........|
+........|
+...O.X..|
+..*X....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK157
+
+--------+
+........|
+........|
+........|
+...X.O..|
+..XO*...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK158
+
+---------+
+.........|
+.........|
+.........|
+..*.O.X..|
+...OXX...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK159
+
+---------+
+.........|
+.........|
+....*....|
+..X.X.O..|
+...XOO...|
+.........|
+.........|
+
+:8,sFj
+
+
+Pattern JK160
+
+---------+
+.........|
+.........|
+...*X....|
+..O.O.X..|
+...OXX...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK161
+
+---------+
+.........|
+.........|
+.........|
+..*.O.X..|
+...OX....|
+....X....|
+.........|
+
+:8,sFJ
+
+
+Pattern JK162
+
+--------+
+........|
+........|
+........|
+.X.X*O..|
+..XO....|
+...O....|
+........|
+
+:8,sFJ
+
+
+Pattern JK163
+
+---------+
+.........|
+.........|
+....*....|
+..O.OXX..|
+...OX....|
+....X....|
+.........|
+
+:8,sFJ
+
+
+Pattern JK164
+
+-------+
+.......|
+.......|
+.......|
+.XO.X..|
+.OX*...|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JK165
+
+--------+
+........|
+........|
+........|
+..XO*X..|
+..OXO...|
+...X....|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JK166
+
+---------+
+.........|
+.........|
+...*.....|
+...XOOX..|
+..XOXO...|
+....X....|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK167
+
+---------+
+.........|
+.........|
+..*O.....|
+...XOOX..|
+..X.XO...|
+...XX....|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK168
+
+--------+
+........|
+........|
+..O.....|
+.XXOOX..|
+.XOXO...|
+...X*...|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK169
+
+---------+
+.........|
+.........|
+.........|
+.*..X.O..|
+.........|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK170
+
+---------+
+.........|
+.........|
+.........|
+.X..O.X..|
+.........|
+....*....|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK171
+
+---------+
+.........|
+.........|
+.........|
+.O..X.O..|
+.........|
+....X.*..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK172
+
+---------+
+.........|
+.........|
+.........|
+.X..O.X..|
+.........|
+....O.X..|
+.........|
+....*....|
+.........|
+
+:8,sFJ
+
+
+Pattern JK173
+
+---------+
+.........|
+.........|
+.........|
+.O..X.O..|
+.........|
+....X.O..|
+.........|
+....X.*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK174
+
+-----------+
+...........|
+...........|
+...........|
+*..X..O.X..|
+...........|
+......O.X..|
+...........|
+......O.X..|
+...........|
+
+:8,sFJ
+
+
+Pattern JK175
+
+---------+
+.........|
+.........|
+.........|
+.O..X.O..|
+.........|
+....X....|
+......*..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK176
+
+---------+
+.........|
+.........|
+.........|
+.X..O.X..|
+.........|
+....O....|
+......X..|
+....*....|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK177
+
+---------+
+.........|
+.........|
+.........|
+.O..X.O..|
+.........|
+....X....|
+......O..|
+....X....|
+.....*...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK178
+
+-------------+
+.............|
+.............|
+.............|
+..*..X..O.X..|
+.............|
+........O....|
+..........X..|
+........O....|
+.........X...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK179
+
+---------+
+.........|
+.........|
+.........|
+.X..O.X..|
+.........|
+.........|
+.....*...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK180
+
+---------+
+.........|
+.........|
+.........|
+.O..X.O..|
+....*....|
+.........|
+.....X...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK181
+
+---------+
+.........|
+.........|
+.........|
+.X..O.X..|
+...*X....|
+.........|
+.....O...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK182
+
+---------+
+.........|
+.........|
+.........|
+.O..X.O..|
+...XO....|
+....*....|
+.....X...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK183
+
+---------+
+.........|
+.........|
+.........|
+.X..O*X..|
+...OX....|
+....X....|
+.....O...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK184
+
+---------+
+.........|
+.........|
+.........|
+.O..XXO..|
+...XO*...|
+....O....|
+.....X...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK185
+
+---------+
+.........|
+.........|
+......*..|
+.X..OOX..|
+...OXX...|
+....X....|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK186
+
+---------+
+.........|
+.........|
+......X..|
+.O..XXO..|
+...XOO*..|
+....O....|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK187
+
+---------+
+.........|
+.........|
+...*..O..|
+.X..OOX..|
+...OXXX..|
+....X....|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK188
+
+---------+
+.........|
+.........|
+...X..X*.|
+.O..XXO..|
+...XOOO..|
+....O....|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK189
+
+---------+
+.........|
+......*..|
+...O..OX.|
+.X..OOX..|
+...OXXX..|
+....X....|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK190
+
+---------+
+.........|
+.........|
+.........|
+.O..XXO..|
+...XO....|
+....O.*..|
+.....X...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK191
+
+---------+
+.........|
+.........|
+......*..|
+.X..OOX..|
+...OX....|
+....X.X..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK192
+
+---------+
+.........|
+.........|
+......X..|
+.O..XXO..|
+...XO.*..|
+....O.O..|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK193
+
+---------+
+.........|
+.........|
+...*..O..|
+.X..OOX..|
+...OX.X..|
+....X.X..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK194
+
+---------+
+.........|
+.........|
+...X..X*.|
+.O..XXO..|
+...XO.O..|
+....O.O..|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK195
+
+---------+
+.........|
+......*..|
+...O..OX.|
+.X..OOX..|
+...OX.X..|
+....X.X..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK196
+
+---------+
+.........|
+......X..|
+...X..XO.|
+.O..XXO..|
+...XO.O..|
+....O.O..|
+.....X...|
+.........|
+.........|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK197
+
+---------+
+.........|
+......X..|
+...X..XO.|
+.O..XXO..|
+...XO.O..|
+....O.O..|
+.....X...|
+.........|
+.........|
+.........|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK198
+
+---------+
+.........|
+......X..|
+...X..XO.|
+.O..XXO..|
+...XO.O..|
+....O.O..|
+.....X...|
+.........|
+.........|
+.........|
+.........|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK199
+
+---------+
+.........|
+.........|
+.........|
+.X..OOX..|
+...OX....|
+...*X.X..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK200
+
+---------+
+.........|
+.........|
+.........|
+.O..XXO..|
+...XO....|
+...XO.O..|
+....*X...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK201
+
+---------+
+.........|
+.........|
+......*..|
+.X..OOX..|
+...OX....|
+...OX.X..|
+....XO...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK202
+
+---------+
+.........|
+.........|
+......X..|
+.O..XXO..|
+...XO.*..|
+...XO.O..|
+....OX...|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK203
+
+---------+
+.........|
+.....*...|
+......O..|
+.X..OOX..|
+...OX.X..|
+...OX.X..|
+....XO...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK204
+
+---------+
+.........|
+.....X...|
+......X..|
+.O..XXO..|
+...XO.O..|
+...XO.O..|
+....OX...|
+.........|
+.........|
+.........|
+.........|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK205
+
+---------+
+.........|
+.....X...|
+......X..|
+.O..XXO..|
+...XO.O..|
+...XO.O..|
+....OX...|
+.........|
+.........|
+.........|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK206
+# Requires a ladder.
+
+---------+
+.........|
+.........|
+......O*.|
+.X..OOX..|
+...OX.X..|
+...OX.X..|
+....XO...|
+.........|
+.........|
+
+:8,sFN
+
+
+Pattern JK207
+
+---------+
+.........|
+.........|
+......XX.|
+.O..XXO..|
+...XO.O..|
+...XO.O..|
+....OX...|
+.........|
+.....*...|
+.........|
+
+:8,sFJ
+
+
+Pattern JK208
+
+---------+
+.........|
+.........|
+...*..OO.|
+.X..OOX..|
+...OX.X..|
+...OX.X..|
+....XO...|
+.........|
+.....X...|
+.........|
+
+:8,sFJ
+
+
+Pattern JK209
+# Bad
+
+---------+
+.........|
+.........|
+.........|
+.X..OOX..|
+...OX*...|
+....X.X..|
+.....O...|
+.........|
+.........|
+
+:8,sFN
+
+
+Pattern JK210
+
+---------+
+.........|
+.........|
+.........|
+.O..XXO..|
+...XOX...|
+....O*O..|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK211
+
+---------+
+.........|
+.........|
+.........|
+.X..OOX..|
+...OXO*..|
+....XXX..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK212
+
+---------+
+.........|
+.........|
+.........|
+.O.*XXO..|
+...XOXX..|
+....OOO..|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK213
+
+---------+
+.........|
+.........|
+.........|
+.X.XOOX..|
+...OXOO..|
+....XXX*.|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK214
+
+---------+
+.........|
+.........|
+.........|
+.O.OXXO..|
+...XOXX..|
+....OOOX.|
+.....X.*.|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK215
+
+---------+
+.........|
+.........|
+.........|
+.X.XOOX..|
+...OXOO*.|
+....XXXO.|
+.....O.X.|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK216
+
+---------+
+.........|
+.........|
+.........|
+.O.OXXO..|
+...XOXXX.|
+....OOOX.|
+.....X*O.|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK217
+
+---------+
+.........|
+.........|
+...*.....|
+.X.XOOX..|
+...OXOOO.|
+....XXXO.|
+.....OXX.|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK218
+
+---------+
+.........|
+.........|
+...X.....|
+.O*OXXO..|
+...XOXXX.|
+....OOOX.|
+.....XOO.|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK219
+
+-----------+
+...........|
+...........|
+...........|
+......X.O..|
+...........|
+........*..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK220
+
+-----------+
+...........|
+...........|
+........*..|
+......O.X..|
+...........|
+........X..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK221
+
+-----------+
+...........|
+...........|
+.......*OX.|
+......O.X..|
+...........|
+........X..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK222
+
+-----------+
+...........|
+.........*.|
+.......XXO.|
+......X.O..|
+...........|
+........O..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK223
+
+-----------+
+...........|
+.........X.|
+..*....OOX.|
+......O.X..|
+...........|
+........X..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK224
+
+-----------+
+...........|
+...........|
+.......*X..|
+......X.O..|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFN
+
+
+Pattern JK225
+
+-----------+
+...........|
+...........|
+.......XO..|
+......O*X..|
+...........|
+........X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK226
+
+-----------+
+...........|
+........*..|
+.......OX..|
+......XXO..|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK227
+
+-----------+
+...........|
+........X..|
+.......XO*.|
+......OOX..|
+...........|
+........X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK228
+
+-----------+
+...........|
+........O..|
+.......OXX.|
+......XXO*.|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK229
+
+-----------+
+...........|
+.......*X..|
+.......XOO.|
+......OOXX.|
+...........|
+........X..|
+...........|
+...........|
+
+:8,sFN
+
+
+Pattern JK230
+
+-----------+
+...........|
+.......XO..|
+......*OXX.|
+......XXOO.|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK231
+
+-----------+
+...........|
+......*XOX.|
+......OOXX.|
+......XXOO.|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK232
+
+-----------+
+........X..|
+......OX.X.|
+....*.OOXX.|
+......XXOO.|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK233
+
+-------+
+.......|
+....X*.|
+...XOO.|
+..OOXX.|
+.......|
+....X..|
+.......|
+
+:8,sFN
+
+
+Pattern JK234
+
+-------+
+.......|
+...*OX.|
+...OXX.|
+..XXOO.|
+.......|
+....O..|
+.......|
+
+:8,sFJ
+
+
+Pattern JK235
+
+-----------+
+...........|
+........X..|
+......*XOO.|
+......OOXX.|
+...........|
+........X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK236
+
+-----------+
+...........|
+.......*O..|
+......XOXX.|
+......XXOO.|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK237
+
+-----------+
+...........|
+......*XX..|
+......OXOO.|
+......OOXX.|
+...........|
+........X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK238
+
+-----------+
+...........|
+......XOO*.|
+......XOXX.|
+......XXOO.|
+...........|
+........O..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK239
+
+-----------+
+...........|
+......OXXX.|
+..*...OXOO.|
+......OOXX.|
+...........|
+........X..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK240
+
+-------+
+.......|
+.......|
+..X....|
+....O..|
+...*...|
+.......|
+.......|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK241
+
+---------+
+.........|
+.........|
+....O....|
+..*...X..|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK242
+
+----------+
+..........|
+..........|
+.....X*...|
+...X...O..|
+......O...|
+..........|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK243
+
+---------+
+.........|
+.........|
+....OX...|
+..O.*.X..|
+.....X...|
+.........|
+.........|
+.........|
+
+:8,sFJ-,shape(5)
+
+
+Pattern JK244
+
+----------+
+..........|
+..........|
+..*..O....|
+.......X..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK245
+
+-----------+
+...........|
+........*..|
+.X.O..O....|
+........X..|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JK246
+
+-------+
+.......|
+.......|
+..X....|
+.*..O..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK247
+
+---------+
+.........|
+.........|
+..*.O....|
+...X..X..|
+.....X...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK248
+
+---------+
+.........|
+.........|
+..X.X*...|
+...O..O..|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK249
+
+--------+
+........|
+........|
+.XXXO...|
+..O..O..|
+....O...|
+........|
+........|
+........|
+........|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK250
+
+--------+
+........|
+........|
+..XX....|
+.*O..O..|
+....O...|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK251
+
+---------+
+.........|
+.........|
+.*.OO....|
+..XX..X..|
+.....X...|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK252
+
+---------+
+.........|
+.........|
+.X.XX....|
+..OO..O..|
+.....O...|
+.........|
+.........|
+.........|
+.........|
+......*..|
+.........|
+
+:8,sFJ
+
+
+Pattern JK253
+
+-----------+
+...........|
+...........|
+......X....|
+...*....O..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK254
+
+---------+
+.........|
+.........|
+....O....|
+.X....X..|
+.........|
+....*....|
+.........|
+.........|
+.........|
+
+:8,sFJ-,shape(5)
+
+
+Pattern JK255
+
+---------+
+.........|
+.........|
+....X....|
+.O....O..|
+.........|
+....X....|
+......*..|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK256
+
+----------+
+..........|
+..........|
+.....X....|
+..O....O..|
+.....*....|
+.....X....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK257
+
+---------+
+.........|
+.........|
+....O....|
+.X....X..|
+...*X....|
+....O....|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK258
+
+---------+
+.........|
+.........|
+....X....|
+.O....O..|
+...XO*...|
+....X....|
+.........|
+
+:8,sFU
+
+
+Pattern JK259
+
+---------+
+.........|
+.........|
+....O....|
+.X.*..X..|
+...OXX...|
+....O....|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK260
+
+---------+
+.........|
+.........|
+....X....|
+.O.X..O..|
+...XOO...|
+...*X....|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK261
+
+---------+
+.........|
+.........|
+....O....|
+.X.O..X..|
+...OXX...|
+..*XO....|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK262
+
+----------+
+..........|
+..........|
+.....X....|
+..O.X..O..|
+....XOO...|
+...XOX....|
+....*.....|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK263
+
+----------+
+..........|
+..........|
+.....O....|
+..X.O..X..|
+..*.OXX...|
+...OXO....|
+....X.....|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK264
+
+----------+
+..........|
+..........|
+.....X....|
+..O.X..O..|
+..X.XOO...|
+...XOX....|
+....O*....|
+..........|
+..........|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK265
+
+----------+
+..........|
+..........|
+.....O....|
+.*X.O..X..|
+..O.OXX...|
+...OXO....|
+....XX....|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK266
+
+------------+
+............|
+............|
+.......X....|
+..*.O.X..O..|
+....X.XOO...|
+.....XOX....|
+......O.....|
+............|
+............|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK267
+
+-----------+
+...........|
+...........|
+......O....|
+.X.X.O..X..|
+...O.OXX...|
+....OXO.*..|
+.....X.....|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK268
+
+----------+
+..........|
+..........|
+.....X....|
+O.O.X..O..|
+..X.XOO...|
+...XOX*X..|
+....O.....|
+..........|
+..........|
+
+:8,sFU
+
+
+Pattern JK269
+
+-----------+
+...........|
+...........|
+......O....|
+.X.X.O..X..|
+...O.OXX...|
+....OXOXO..|
+.....X*....|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK270
+
+-----------+
+...........|
+...........|
+......X....|
+.O.O.X..O..|
+...X.XOO...|
+....XOXOX..|
+.....OX*...|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK271
+
+-----------+
+...........|
+...........|
+......O....|
+.X.X.O..X..|
+...O.OXX...|
+....OXOXO..|
+.....XOX...|
+......*....|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK272
+
+-----------+
+...........|
+...........|
+......X....|
+.O.O.X..O..|
+...X.XOO...|
+....XOXOX..|
+.....OXO...|
+......X....|
+........*..|
+...........|
+...........|
+
+:8,sFU
+
+
+Pattern JK273
+
+----------+
+..........|
+..........|
+.....O....|
+..X.*..X..|
+..........|
+..........|
+..........|
+
+:8,sFJ-,shape(5)
+
+
+Pattern JK274
+
+---------+
+.........|
+.........|
+....X....|
+.O.X..O..|
+.........|
+.....*...|
+.........|
+.........|
+.........|
+
+:8,sFJ-,shape(5)
+
+
+Pattern JK275
+
+---------+
+.........|
+......*..|
+....O....|
+.X.O..X..|
+.........|
+.....X...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JK276
+
+---------+
+.........|
+......X..|
+....X....|
+.O.X..O..|
+.........|
+.....O...|
+.........|
+.........|
+.........|
+......*..|
+.........|
+.........|
+
+:8,sFJ-,shape(5)
+
+
+Pattern JK277
+
+-----------+
+...........|
+...........|
+..*...X....|
+........O..|
+...........|
+...........|
+...........|
+
+:8,sFJ-,shape(8)
+
+
+Pattern JK278
+
+---------+
+.........|
+.........|
+..*.X....|
+......O..|
+.........|
+.........|
+
+:8,sFJ
+
+---------+
+.........|
+.........|
+A.*.X....|
+......O..|
+.........|
+.........|
+
+;!xarea(A)
+
+
+Pattern JK279
+
+--------+
+........|
+........|
+.X.O....|
+.....X..|
+...*....|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK280
+
+--------+
+........|
+........|
+.O.X....|
+.....O..|
+...X....|
+....*...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK281
+
+---------+
+.........|
+.........|
+..X.O....|
+..*...X..|
+....O....|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK282
+
+---------+
+.........|
+.........|
+..X.O....|
+.XO...X..|
+..*.O....|
+.....X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK283
+
+---------+
+.........|
+.........|
+..XXO....|
+.XO.*.X..|
+..O.O....|
+.....X...|
+.........|
+
+:8,sFJ
+
+
+Pattern JK284
+
+-----------+
+...........|
+...........|
+....O.X*...|
+...X....O..|
+......X....|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK285
+
+-----------+
+...........|
+......*....|
+....X.OX...|
+...O....X..|
+......O....|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK286
+
+-----------+
+...........|
+......X....|
+...*O.XO...|
+...X....O..|
+......X....|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK287
+
+------------+
+............|
+.......O....|
+....XX.OX...|
+...*O....X..|
+.......O....|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK288
+
+------------+
+............|
+.......X....|
+....OO.XO...|
+...XX*...O..|
+.......X....|
+........O...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK289
+
+------------+
+............|
+.......O....|
+....XX.OX...|
+...OOX...X..|
+.....*.O....|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK290
+
+------------+
+............|
+.......X....|
+...*OO.XO...|
+...XXO...O..|
+.....X.X....|
+........O...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK291
+
+------------+
+............|
+.......O....|
+...XXX.OX...|
+..*OOX...X..|
+.....O.O....|
+........X...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK292
+
+-------------+
+.............|
+........X....|
+..*.OOO.XO...|
+...XXXO...O..|
+......X.X....|
+.........O...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK293
+
+-------------+
+.............|
+........O....|
+..X.XXX.OX...|
+...OOOX*..X..|
+......O.O....|
+.........X...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK294
+
+------------+
+............|
+.......X....|
+..*OOO.XO...|
+..XXXO...O..|
+.....X.X....|
+........O...|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK295
+
+-------------+
+.............|
+........O....|
+...XXXX.OX...|
+...OOOX...X..|
+......O.O....|
+........*X...|
+.............|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK296
+
+-------------+
+.............|
+........X....|
+...OOOO.XO...|
+...XXXO...O..|
+......X.X....|
+........XO...|
+.........*...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK297
+
+-------------+
+.............|
+........O....|
+...XXXX.OX...|
+..*OOOX...X..|
+......O.O....|
+........OX...|
+.........X...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK298
+
+-------------+
+.............|
+........X....|
+.*.OOOO.XO...|
+..XXXXO...O..|
+......X.X....|
+........XO...|
+.........O...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK299
+
+-----------+
+...........|
+......X....|
+.OOOO.XO...|
+*XXXO...O..|
+....X.X....|
+......XO...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK300
+
+-----------+
+...........|
+......O....|
+.XXXX.OX...|
+XOOOX...X..|
+....O.O....|
+......OX...|
+.......*...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK301
+
+-----------+
+...........|
+......X....|
+.OOOO.XO...|
+OXXXO...O..|
+....X.X....|
+......XO...|
+.......X*..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK302
+
+-----------+
+...........|
+......O....|
+.XXXX.OX...|
+XOOOX...X..|
+....O.O*...|
+......OX...|
+.......OX..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK303
+
+-----------+
+...........|
+......X....|
+.OOOO.XO...|
+OXXXO...O..|
+....X.XX...|
+......XO*..|
+.......XO..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK304
+
+-----------+
+...........|
+......O....|
+.XXXX.OX...|
+XOOOX...X..|
+....O.OO*..|
+......OXX..|
+.......OX..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK305
+
+-----------+
+...........|
+......X....|
+.OOOO.XO...|
+OXXXO...O..|
+....X.XXX*.|
+......XOO..|
+.......XO..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK306
+
+-----------+
+...........|
+......O....|
+.XXXX.OX...|
+XOOOX...X..|
+....O.OOOX.|
+......OXX..|
+.......OX..|
+........*..|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK307
+
+-----------+
+...........|
+.......*...|
+....X.OX...|
+...O....X..|
+......O....|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK308
+
+-----------+
+...........|
+.......X*..|
+....O.XO...|
+...X....O..|
+......X....|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK309
+
+-----------+
+...........|
+.......OX..|
+....X.OX...|
+...O...*X..|
+......O....|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK310
+
+-----------+
+...........|
+.......XO..|
+....O.XO*..|
+...X...XO..|
+......X....|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK311
+
+-----------+
+...........|
+.......OX..|
+....X.OXX..|
+...O*..OX..|
+......O....|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK312
+
+-----------+
+...........|
+...........|
+....O.X....|
+........O..|
+......X....|
+......*O...|
+...........|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK313
+
+-----------+
+...........|
+...........|
+....X.O....|
+....*...X..|
+......O....|
+......XX...|
+...........|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK314
+
+-----------+
+...........|
+...........|
+...*O.X....|
+....X...O..|
+......X....|
+......OO...|
+...........|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK315
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......O....|
+.....*XX...|
+...........|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK316
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......X....|
+.....XOO...|
+.....*.....|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK317
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......O....|
+....*OXX...|
+.....X.....|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK318
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......X....|
+....XXOO...|
+.....O.....|
+......*X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK319
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......O....|
+....OOXX...|
+.....X.....|
+......XO...|
+...........|
+.......*...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK320
+
+-----------+
+...........|
+...........|
+...OO.X*...|
+....X...O..|
+......X....|
+....XXOO...|
+.....O.....|
+......OX...|
+...........|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK321
+
+-----------+
+...........|
+...........|
+...XX*OX...|
+....O...X..|
+......O....|
+....OOXX...|
+.....X.....|
+......XO...|
+...........|
+.......O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK322
+
+------------+
+............|
+............|
+.*..OOXXO...|
+.....X...O..|
+.......X....|
+.....XXOO...|
+......O.....|
+.......OX...|
+............|
+........X...|
+............|
+
+:8,sFJ
+
+
+Pattern JK323
+
+-------------+
+.............|
+.............|
+..*..XX.O....|
+......O...X..|
+........O....|
+......OOXX...|
+.......X.....|
+........XO...|
+.............|
+.............|
+
+:8,sFJ
+
+
+Pattern JK324
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......X....|
+.....XOO...|
+...........|
+......*X...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK325
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......O....|
+.....OXX...|
+...........|
+......XO...|
+...........|
+.......*...|
+...........|
+
+:8,sFJ
+
+
+Pattern JK326
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......X....|
+.....XOO...|
+.....*.....|
+......OX...|
+...........|
+.......X...|
+...........|
+
+:8,sFJ
+
+
+Pattern JK327
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......O....|
+....*OXX...|
+.....X.....|
+......XO...|
+...........|
+.......O...|
+...........|
+
+:8,sFJ
+
+
+Pattern JK328
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......O*...|
+.....OXX...|
+...........|
+......XO...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK329
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......XX*..|
+.....XOO...|
+...........|
+......OX...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK330
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......OOX..|
+.....OXX...|
+......*....|
+......XO...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK331
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......XXO..|
+.....XOO...|
+.....*X....|
+......OX...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK332
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......OOX..|
+.....OXX...|
+.....XO*...|
+......XO...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK333
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......XXO..|
+.....XOO*..|
+.....OXX...|
+......OX...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK334
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......OOX..|
+....*OXXX..|
+.....XOO...|
+......XO...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK335
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......XXO..|
+....XXOOO..|
+.....OXX...|
+......OX...|
+.......*...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK336
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......OOX..|
+....OOXXX..|
+.....XOO...|
+.....*XO...|
+.......X...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK337
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......XXO..|
+....XXOOO..|
+.....OXX...|
+.....XOX...|
+......*O...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK338
+
+-----------+
+...........|
+...........|
+...XX.O....|
+....O...X..|
+......OOX..|
+....OOXXX..|
+....*XOO...|
+.....OXO...|
+......XX...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK339
+
+-----------+
+...........|
+...........|
+...OO.X....|
+....X...O..|
+......XXO..|
+....XXOOO..|
+....X.XX...|
+.....XOX*..|
+......OO...|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK340
+
+-------------+
+.............|
+.............|
+..*..XX.O....|
+......O...X..|
+........OOX..|
+......OOXXX..|
+......O.OO...|
+.......OXOX..|
+........XX...|
+.............|
+
+:8,sFJ
+
+
+Pattern JK341
+
+-------+
+.......|
+.......|
+..X....|
+..*.O..|
+.......|
+.......|
+
+:8,sFN
+
+
+Pattern JK342
+
+---------+
+.........|
+.........|
+....O....|
+...*X.X..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK343
+
+---------+
+.........|
+.........|
+....X*...|
+...XO.O..|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK344
+
+---------+
+.........|
+.........|
+....OX...|
+...OX.X..|
+....*....|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK345
+
+---------+
+.........|
+.........|
+....XO...|
+...XO*O..|
+....X....|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK346
+
+---------+
+.........|
+.........|
+...*OX...|
+...OXXX..|
+....O....|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK347
+
+---------+
+.........|
+.........|
+....X....|
+......O..|
+.........|
+.....*...|
+.........|
+.........|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK348
+
+--------+
+........|
+........|
+...O.*..|
+.....X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK349
+
+--------+
+........|
+........|
+...X.X*.|
+.....O..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK350
+
+--------+
+........|
+........|
+...O.OX.|
+....*X..|
+........|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK351
+
+--------+
+........|
+........|
+...X.XO.|
+....XO..|
+.....*..|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK352
+
+--------+
+........|
+.....*..|
+...O.OX.|
+....OX..|
+.....X..|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK353
+
+--------+
+........|
+.....X..|
+...X.XO.|
+....XO..|
+.....O..|
+....O...|
+........|
+........|
+........|
+.....*..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK354
+
+-------+
+.......|
+....*..|
+..X.XO.|
+...XO..|
+....O..|
+...O...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK355
+
+-------+
+.......|
+...*X..|
+..O.OX.|
+...OX..|
+....X..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JK356
+
+--------+
+........|
+.....*..|
+...X.XO.|
+....XO..|
+........|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK357
+
+--------+
+........|
+.....X..|
+...O.OX.|
+....OX..|
+.....*..|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK358
+
+--------+
+........|
+.....O..|
+...X*XO.|
+....XO..|
+.....X..|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK359
+
+--------+
+........|
+.....X..|
+...OX.X.|
+....OX*.|
+.....O..|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK360
+
+--------+
+........|
+.....O..|
+...XO*O.|
+....XOX.|
+.....X..|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK361
+
+--------+
+........|
+.....X..|
+...OXXX.|
+....OXO.|
+....*O..|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK362
+
+--------+
+........|
+.....O..|
+...XOOO.|
+...*XOX.|
+....XX..|
+....O...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK363
+
+--------+
+........|
+.....X..|
+...OXXX.|
+...XOXO.|
+...*OO..|
+....X...|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JK364
+
+---------+
+.........|
+......O..|
+....XOOO.|
+...*OXOX.|
+....XXX..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK365
+
+---------+
+.........|
+......O..|
+.X..XOOO.|
+...OOXOX.|
+...*XXX..|
+.....O...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK366
+
+---------+
+.........|
+......X..|
+.O..OXXX.|
+...XXOXO.|
+...XOOO..|
+....*X...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK367
+
+---------+
+.........|
+......O..|
+.X.*XOOO.|
+...OOXOX.|
+...OXXX..|
+....XO...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JK368
+
+----------+
+..........|
+..........|
+..*..O....|
+.......X..|
+..........|
+......X...|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK369
+
+----------+
+..........|
+..........|
+..X..X*...|
+.......O..|
+..........|
+......O...|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK370
+
+----------+
+..........|
+..........|
+..O..OX...|
+.....*.X..|
+..........|
+......X...|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK371
+
+----------+
+..........|
+..........|
+..X..XO...|
+.....X.O..|
+..........|
+......O...|
+..........|
+......*...|
+..........|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK372
+
+----------+
+..........|
+..........|
+..X..XO...|
+.....X.O..|
+..........|
+......O...|
+..........|
+..........|
+.......*..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK373
+
+----------+
+..........|
+..........|
+..X..X....|
+.......O..|
+..........|
+......O...|
+..........|
+..........|
+..........|
+.......*..|
+..........|
+..........|
+
+:8,sFN
+
+
+Pattern JK374
+
+----------+
+..........|
+..........|
+..O..O.*..|
+.......X..|
+..........|
+......X...|
+..........|
+..........|
+..........|
+.......X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK375
+
+----------+
+..........|
+..........|
+..X..X.X*.|
+.......O..|
+..........|
+......O...|
+..........|
+..........|
+..........|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK376
+
+----------+
+..........|
+..........|
+..O..O.OX.|
+......*X..|
+..........|
+......X...|
+..........|
+..........|
+..........|
+.......X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK377
+
+----------+
+..........|
+..........|
+..X..X.XO.|
+......XO..|
+.......*..|
+......O...|
+..........|
+..........|
+..........|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK378
+
+----------+
+..........|
+.......*..|
+..O..O.OX.|
+......OX..|
+.......X..|
+......X...|
+..........|
+..........|
+..........|
+.......X..|
+..........|
+..........|
+
+:8,sFj
+
+
+Pattern JK379
+
+----------+
+..........|
+.......*..|
+..X..X.XO.|
+......XO..|
+.......O..|
+......O...|
+..........|
+..........|
+..........|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK380
+
+----------+
+..........|
+......*X..|
+..O..O.OX.|
+......OX..|
+.......X..|
+......X...|
+..........|
+..........|
+..........|
+.......X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK381
+
+------------+
+............|
+............|
+...*...O....|
+.........X..|
+............|
+........X...|
+............|
+............|
+............|
+............|
+
+:8,sFj
+
+
+Pattern JK382
+
+------------+
+............|
+............|
+.*.X...X....|
+.........O..|
+............|
+........O...|
+............|
+............|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK383
+
+------------+
+............|
+............|
+.X.O...O.*..|
+.........X..|
+............|
+........X...|
+............|
+............|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK384
+
+------------+
+............|
+............|
+.O.X...X.X*.|
+.........O..|
+............|
+........O...|
+............|
+............|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK385
+
+------------+
+............|
+............|
+.X.O...O.OX.|
+........*X..|
+............|
+........X...|
+............|
+............|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK386
+
+------------+
+............|
+............|
+.O.X...X.XO.|
+........XO..|
+.........*..|
+........O...|
+............|
+............|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK387
+
+------------+
+............|
+.........*..|
+.X.O...O.OX.|
+........OX..|
+.........X..|
+........X...|
+............|
+............|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK388
+
+------------+
+............|
+.........X..|
+.O.X...X.XO.|
+........XO..|
+.........O..|
+........O...|
+............|
+............|
+............|
+.........*..|
+............|
+............|
+
+:8,sFJ
+
+
+Pattern JK389
+#are there other continuations of note here?
+
+-----------+
+...........|
+...........|
+..X.*.X....|
+........O..|
+...........|
+.......O...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK390
+
+-----------+
+...........|
+....*......|
+..O.X.O....|
+........X..|
+...........|
+.......X...|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK391
+
+----------+
+..........|
+..*X......|
+.X.O.X....|
+.......O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK392
+
+----------+
+..........|
+..XO......|
+.O*X.O....|
+.......X..|
+..........|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK393
+
+----------+
+..........|
+..OX*.....|
+.XXO.X....|
+.......O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK394
+
+----------+
+..........|
+..XOX.....|
+.OOX.O....|
+...*...X..|
+..........|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK395
+
+----------+
+..........|
+..OXO.....|
+.XXO*X....|
+...X...O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK396
+
+----------+
+..........|
+..XOX.....|
+.OOXXO....|
+...O*..X..|
+..........|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK397
+
+----------+
+..........|
+..OXO.....|
+.XXOOX....|
+...XX*.O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK398
+
+----------+
+..........|
+..XOX*....|
+.OOXXO....|
+...OOX.X..|
+..........|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK399
+
+----------+
+...*......|
+..OXOX....|
+.XXOOX....|
+...XXO.O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK400
+
+----------+
+...X.*....|
+..X.XO....|
+.OOXXO....|
+...OOX.X..|
+..........|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK401
+
+----------+
+...O*X....|
+..O.OX....|
+.XXOOX....|
+...XXO.O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK402
+
+----------+
+...XXO....|
+.*X.XO....|
+.OOXXO....|
+...OOX.X..|
+..........|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK403
+
+----------+
+...OOX....|
+.XO.OX....|
+.XXOOX*...|
+...XXO.O..|
+..........|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK404
+
+----------+
+...XXO....|
+.OX.XO....|
+.OOXXOX...|
+...OOX.X..|
+.....*....|
+......X...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK405
+
+----------+
+...OOX....|
+.XO.OX....|
+.XXOOXO...|
+...XXO*O..|
+.....X....|
+......O...|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK406
+
+-----------+
+...........|
+...........|
+......O....|
+........X..|
+...........|
+.......X...|
+...........|
+........*..|
+...........|
+...........|
+...........|
+
+:8,sFj
+
+
+Pattern JK407
+
+-----------+
+...........|
+...........|
+..*...X....|
+........O..|
+...........|
+.......O...|
+...........|
+........X..|
+...........|
+...........|
+...........|
+
+:8,sFJ
+
+
+Pattern JK408
+
+-----------+
+...........|
+...........|
+......X....|
+........O..|
+...........|
+.......O...|
+...........|
+........X..|
+...........|
+...........|
+.......*...|
+...........|
+
+:8,sFJ
+
+
+Pattern JK409
+
+----------+
+..........|
+..........|
+..*.X.....|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK410
+
+----------+
+..........|
+..........|
+..X.O..*..|
+.......X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK411
+#too easy for w
+
+----------+
+..........|
+..........|
+..O.X..X*.|
+.......O..|
+..........|
+..........|
+
+:8,sFN
+
+
+Pattern JK412
+
+----------+
+..........|
+..........|
+..X.O.*OX.|
+.......X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK413
+
+----------+
+..........|
+..........|
+..O.X.XXO.|
+.......O..|
+........*.|
+..........|
+
+:8,sFJ
+
+
+Pattern JK414
+
+----------+
+..........|
+..........|
+..X.O.OOX.|
+.......X..|
+....*...X.|
+..........|
+
+:8,sFJ
+
+
+Pattern JK415
+
+----------+
+..........|
+..........|
+..O.X.*X..|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK416
+
+----------+
+..........|
+..........|
+..X.O.XO..|
+......*X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK417
+
+----------+
+..........|
+.......*..|
+..O.X.OX..|
+......XO..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK418
+
+----------+
+..........|
+.......X..|
+..X.O.XO*.|
+......OX..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK419
+
+----------+
+..........|
+.......O..|
+..O.X.OXX.|
+.....*XO..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK420
+
+----------+
+..........|
+.......X..|
+..X.O.XOO.|
+.....XOX..|
+......*...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK421
+
+----------+
+..........|
+.......O..|
+..O.X*OXX.|
+.....OXO..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK422
+
+----------+
+..........|
+.......X*.|
+..X.OXXOO.|
+.....XOX..|
+......O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK423
+
+----------+
+..........|
+.......OX.|
+..O.XOOXX.|
+.....OXO..|
+......X...|
+.....*....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK424
+
+----------+
+..........|
+.......XO.|
+..X.OXXOO.|
+.....XOX..|
+.....*O...|
+.....X....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK425
+
+----------+
+..........|
+.......OX.|
+..O.XOOXX.|
+.....OXO..|
+....*XX...|
+.....O....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK426
+
+----------+
+..........|
+.......XO.|
+..X.OXXOO.|
+.....XOX..|
+....XOO*..|
+.....X....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK427
+
+----------+
+..........|
+.......OX.|
+..O.XOOXX.|
+.....OXO..|
+....OXXX..|
+....*O....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK428
+#bad for b
+
+----------+
+..........|
+..........|
+..O.X.OX..|
+.....*XO..|
+..........|
+..........|
+
+:8,sFN
+
+
+Pattern JK429
+
+----------+
+..........|
+..........|
+..X.O.XO..|
+.....XOX..|
+......*...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK430
+
+----------+
+..........|
+.......*..|
+..O.X.OX..|
+.....OXO..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK431
+
+----------+
+..........|
+.......X..|
+..X.O*XO..|
+.....XOX..|
+......O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK432
+
+----------+
+..........|
+.......O..|
+..O.XXOX*.|
+.....OXO..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK433
+
+----------+
+..........|
+......*X..|
+..X.OOX.X.|
+.....XOX..|
+......O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK434
+
+----------+
+..........|
+......XO..|
+..O.XXO*O.|
+.....OXO..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK435
+
+----------+
+..........|
+......OX..|
+..X.OOXXX.|
+.....XOX..|
+....*.O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JK436
+
+----------+
+..........|
+..........|
+....X.*...|
+.......O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK437
+
+----------+
+..........|
+..........|
+.*..O.X...|
+.......X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK438
+
+----------+
+..........|
+..........|
+....X.....|
+.....*.O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK439
+
+----------+
+..........|
+..........|
+....O.....|
+....*X.X..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK440
+
+----------+
+..........|
+..........|
+....X*....|
+....XO.O..|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK441
+
+----------+
+..........|
+..........|
+....OX....|
+....OX.X..|
+....*.....|
+..........|
+
+:8,sFJ
+
+
+Pattern JK442
+
+----------+
+..........|
+..........|
+....X.....|
+....XO.O..|
+....*.....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK443
+
+----------+
+..........|
+..........|
+....O.....|
+....OX.X..|
+...*X.....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK444
+
+----------+
+..........|
+..........|
+....X*....|
+....XO.O..|
+...XO.....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK445
+
+----------+
+..........|
+.....*....|
+....OX....|
+....OX.X..|
+...OX.....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK446
+
+----------+
+..........|
+.....X*...|
+....XO....|
+....XO.O..|
+...XO.....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK447
+
+----------+
+..........|
+....*OX...|
+....OX....|
+....OX.X..|
+...OX.....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK448
+
+----------+
+..........|
+....XXO...|
+....XO....|
+....XO.O..|
+...XO*....|
+..........|
+..........|
+
+:8,sFJ
+
+
+Pattern JK449
+
+----------+
+..........|
+....OOX...|
+....OX....|
+....OX.X..|
+...OXX....|
+...*......|
+..........|
+
+:8,sFJ
+
+
diff --git a/patterns/komoku.sgf b/patterns/komoku.sgf
new file mode 100644 (file)
index 0000000..8085340
--- /dev/null
@@ -0,0 +1,425 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by the Free Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation - version 3 or
+at your option any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19]HA[0]
+GN[Komoku joseki database]
+;B[qd]
+(;W[od]
+(;B[oc]MA[mg]
+(;W[nc]MA[lg];B[pc]MA[mf]C[U]
+(;W[nd]MA[lg]C[:-,shape(6)]
+(;B[qf]MA[mh]C[U];W[jc]MA[if]C[U];B[hc]MA[gg]C[t
+]
+(;W[je]MA[gg])
+
+(;W[tt];B[lc]MA[hg]
+(;W[ld]C[0
+#an obvious, but wrong, move
+];B[lb])
+
+(;W[lb]MA[gg])
+)
+)
+
+(;B[tt];W[qe]MA[li]C[s];B[re]MA[li];W[pd]MA[li];B[rc]MA[li];W[qf]
+MA[li];B[rf]MA[li];W[qg]MA[li])
+
+(;B[kd]MA[if];W[qe]MA[ig];B[re]MA[ig];W[pd]MA[ig];B[rc]MA[ig];
+C[:-,shape(6)
+#here
+]W[qf]MA[ii];B[rf]MA[ii]
+(;W[qh]MA[ij])
+
+(;W[qg]MA[ii])
+)
+
+(;B[pe]MA[lg];W[jc]MA[if];B[qj]MA[ik];W[tt];B[nf]C[t
+]MA[ik])
+)
+
+(;W[md]MA[jg]C[:-, shape(6)]
+(;B[qf]MA[mh];W[ic]MA[hf])
+
+(;B[ne]MA[lg]
+(;W[oe]MA[lg];B[nb]MA[lg]
+(;W[nf]MA[lg]C[:-,shape(6)
+];B[mb]MA[lg];W[qe]MA[lg];B[re]MA[lg];W[qg]
+MA[lg])
+
+(;W[mb]MA[lg]C[0
+#gnugo likes this move, which is bad.];B[nd]MA[lg];
+W[mc]MA[lg];B[of]MA[lg])
+)
+
+(;W[nd]MA[lg];B[pe]MA[lg];W[ic]MA[hg];B[qj]MA[hk]C[t
+:-,shape(8)
+])
+)
+
+(;B[pe]C[0
+#bad idea without the peep first
+]MA[kg];W[ic]MA[hg];B[ne]
+MA[hg];W[me]C[:-,shape(8)
+]MA[hg])
+)
+)
+
+(;W[pd]MA[mh];B[pc]MA[nf]C[U];W[qe]MA[ng]C[U]
+(;B[qc]MA[ng];W[nd]MA[mg]C[U]
+(;B[mc]MA[lg];W[pf]MA[lg]C[:-,shape(6)])
+
+(;B[re]MA[lh];W[qf]MA[lh];B[rf]MA[lh];W[qg]MA[li];B[mc]MA[ki];W[le]
+MA[ji]C[U];B[lc]MA[ji]C[U])
+)
+
+(;B[nd]MA[ki]
+LB[qc:A][rd:B][qb:C][re:D][qf:E][rf:F][nc:G][oe:H][pe:I][qg:J][pf:K][of:L][pg:M]
+C[; xplay_attack(A,B,C,D,E,F,G,H,I,J,K,L,M,M)
+];W[qc]MA[ki]C[U];B[rd]
+MA[ki];W[qb]MA[ki];B[re]MA[ki];W[pf]MA[ki]C[U]
+(;B[qf]MA[ki]C[U];W[nc]MA[ki]C[U];B[pe]MA[ki];W[oe]MA[ki];B[of]MA[ki];
+W[ne]MA[ki];B[pg]MA[ki];W[md]MA[ki])
+
+(;B[pb]MA[mg]
+C[0
+#this is bad, and gnugo will try it.
+#actually, probably ok.  See Ishida p31.  this is simply a non-standard order.
+])
+)
+
+(;B[nc]MA[kg]
+C[0
+#we don't start the large avalanche.  It probably has complications to
+check.]
+;W[nd]MA[kg];B[md]MA[kg]
+(;W[qc]MA[kg];B[rd]MA[kg];W[qb]MA[kg];B[rc]MA[kg];W[mc]MA[jg];B[lc]
+MA[ji];W[rb]MA[ji]C[U];B[re]MA[ji];W[mb]MA[ji];B[nb]MA[ii];W[lb]MA[ii]
+;B[pb]MA[ih];W[kc]MA[ii];B[me]MA[ii];W[of]MA[ii]C[U];B[qf]MA[ii];W[nf]
+MA[ii]C[U];B[ke]MA[ii];W[hc]MA[fi];B[lg]MA[fi];W[oi]MA[fk];B[qi]MA[fk])
+
+(;W[me]MA[kg]C[0
+#bad
+])
+)
+
+(;B[re]MA[mg]
+(;W[rd]MA[mg]C[U];B[qc]MA[mg]C[U];W[rf]MA[mg]C[U];B[nd]MA[lg]
+C[:-,shape(6)];W[pf]MA[lg]C[:-,shape(6)]
+(;B[of]C[t
+]MA[lh]
+(;W[og]C[U
+]MA[mi]
+(;B[ne]C[0
+#don't worry so much about the two stones.
+]MA[mi];W[ng]
+C[:-,shape(8)
+]MA[mi];B[pe]C[0
+]MA[mi];W[qf]C[U
+]MA[mi])
+
+(;B[ng]MA[lj];W[oh]MA[lj];B[ne]MA[lj];W[nh]MA[lj])
+)
+
+(;W[pg]C[0
+#too submissive.  the hane is better.
+]MA[mh])
+)
+
+(;B[tt];W[rc]C[t
+:-,shape(6)
+]MA[lg]
+(;B[mc]MA[lg]C[:-,shape(8)
+])
+
+(;B[of]MA[lh];W[og]MA[lh];B[ng]MA[lh];W[oh]MA[li];B[ne]MA[li];W[pe]
+MA[li];B[lc]MA[ki])
+)
+)
+
+(;W[rf]C[0
+]
+(;B[rd]MA[lh]C[J
+])
+
+(;B[pe]MA[lh]C[0
+])
+)
+)
+
+(;B[rd]MA[mg]C[0
+#not very good for b.];W[nd]MA[lg];B[re];W[qf]MA[lg];
+B[nc];W[md]MA[kg];B[lc])
+
+(;B[pe]C[0
+#we need answers to this.
+]MA[lh];W[qf]
+C[0
+#very bad, but gnugo likes it.
+]MA[lh];B[nd];W[oe];B[ne];W[of];
+B[rd])
+)
+)
+
+(;B[pf]MA[lh]
+(;W[qc]MA[lh]C[:-,shape(3)]
+(;B[rc]MA[lh];W[pc]MA[lh]C[U]
+(;B[re]MA[lh]C[:-,shape(8)];W[kc]MA[jg])
+
+(;B[rb]MA[kg];W[kc]MA[jg];B[qj]MA[jk])
+)
+
+(;B[pc]MA[lh]C[0])
+)
+
+(;W[lc]MA[lh]C[0])
+
+(;W[nf]MA[lh]C[0])
+)
+
+(;B[oe]MA[lg];W[ne]MA[lg]
+(;B[pe]MA[lg];W[md]MA[kg]C[U];B[oc]MA[kg]C[j];W[nc]MA[kg])
+
+(;B[of];W[md]MA[kg]
+(;B[oc];W[pd])
+
+(;B[pd]MA[lg];W[oc]MA[kg])
+)
+
+(;B[nd];W[pe]MA[mg]C[U];B[of];W[pd]MA[lh]C[U]
+(;B[me];W[nc]MA[kh]C[U]
+(;B[nf];W[mc]MA[kh]C[U])
+
+(;B[md];W[pf]MA[li])
+)
+
+(;B[md];W[pf];B[og];W[pg])
+)
+)
+
+(;B[ld]MA[ki]C[S]
+(;W[of]MA[ki]C[U]
+(;B[qf]MA[ki]C[S];W[oh]MA[ki]C[S];B[qh]MA[ki]C[S];W[id]MA[ii]C[S])
+
+(;B[qg]MA[ki];W[oh]MA[kj];B[pi]MA[kk];W[id]MA[gk])
+)
+
+(;W[pg]MA[ki]C[U];B[oe]MA[ki]C[U];W[ne]MA[ki]C[U];B[of]MA[ki]C[U];
+W[pd]MA[ki]C[U]
+(;B[pe]MA[ki]C[U];W[qc]MA[ki];B[qe]MA[ki];W[nc]MA[ki];B[rc]MA[ki];
+W[qb]MA[ki])
+
+(;B[qf]MA[ki]C[U]
+(;W[qc]MA[ki];B[qe]MA[ki];W[nc]MA[ki];B[rc]MA[ki];W[qb]MA[ki]
+(;B[qj]MA[kk])
+
+(;B[qk]MA[kl])
+
+(;B[ql]MA[km])
+)
+
+(;W[nf]MA[ki];B[og]MA[ki]C[U];W[qc]MA[ki];B[qe]MA[ki]C[U]
+(;W[pb]MA[ki]
+(;B[ql]MA[km])
+
+(;B[qk]MA[kl])
+)
+
+(;W[rc]MA[ki]C[0
+# Requires a ladder.];B[pi]MA[kj];W[nc]MA[kj])
+)
+
+(;W[pe]MA[ki]C[0
+# Bad];B[pf]MA[ki];W[qe]MA[ki];B[nd]MA[ki];W[rf]
+MA[ki];B[rg]MA[ki];W[re]MA[ki];B[qg]MA[ki];W[nc]MA[ki];B[md]MA[ki])
+)
+)
+)
+
+(;B[qf]MA[ii];W[qc]MA[ii]
+(;B[rc];W[pc]MA[ii];B[rb]MA[ii];W[kc]MA[ii])
+
+(;B[pc]C[0
+]MA[ih];W[pd]MA[ih];B[qb]MA[ih];W[rc]MA[ih];B[rd]MA[ih]
+(;W[pb]C[0
+]MA[ih];B[oc]MA[ih];W[rb];B[ob]MA[ih];W[qa];B[mc]MA[ih])
+
+(;W[rb]C[0
+]MA[mg];B[pb]MA[mg])
+
+(;W[oc]MA[ih];B[pb]MA[ih];W[ob]MA[ih];B[rb]MA[ih];W[kc]MA[ih])
+)
+)
+)
+
+(;W[oc]
+(;B[pe]MA[mi]
+(;W[md]MA[kg];B[pc]MA[jh]C[U];W[od]MA[kh]C[:-,shape(5)])
+
+(;W[lc]MA[jf];B[jc];W[qb]MA[if])
+
+(;B[nd]MA[mg]
+(;W[mc]MA[kh]C[U];B[pc]MA[kh];W[nc];B[qj]MA[ll])
+
+(;W[nc];B[md]MA[lh];W[lc]MA[kh];B[qj]MA[kk])
+)
+)
+
+(;B[ld]MA[ig]
+(;W[of]MA[ki]C[:-,shape(5)]
+(;B[qg]MA[ki])
+
+(;B[oe]MA[jh];W[ne]MA[ki]C[U];B[pe]MA[kg]C[U];W[nd]MA[kh]C[U];B[nf]
+MA[kh]C[U];W[mf]MA[ki]C[U];B[ng]MA[ji]C[U];W[le]MA[ji]C[U]
+(;B[og]MA[ji]C[:-,shape(8)];W[kd]MA[ji]C[U])
+
+(;B[jd]MA[hi]C[:-,shape(8)];W[qf]MA[ii]C[U];B[pf]MA[ji]C[U];W[og]
+MA[ii]C[U];B[pg]MA[ii]C[U];W[oh]MA[ij]C[U];B[qi]MA[ik]C[U];W[mh]C[U])
+)
+)
+
+(;W[nd]MA[jg]C[:-,shape(5)];B[pf]MA[ki]C[:-,shape(5)];W[qb]MA[ki]C[U];
+B[qj]MA[kl]C[:-,shape(5)])
+)
+
+(;B[kc]MA[ig]C[:-,shape(8)])
+
+(;B[mc]MA[kf]LB[kc:A]C[;!xarea(A)];W[oe]MA[lg];B[pf]MA[lh]
+(;W[md]MA[kh];B[ld];W[me]MA[kh];B[nc];W[od]MA[kg])
+
+(;W[ld];B[pc]MA[ih]
+(;W[ob]MA[ih];B[lc]MA[ih];W[kd]MA[hh];B[md]MA[hh];W[me]MA[hh];B[kc]
+MA[hh];W[jd]MA[hh]
+(;B[ic]MA[gh];W[nd]MA[gh])
+
+(;B[jc]MA[hh];W[of]MA[gi]
+(;B[pg]MA[gi];W[id]MA[gi];B[hc]MA[gi])
+
+(;B[id]MA[ii];W[pg]MA[ij];B[qg]MA[ij];W[pe]MA[ij];B[qf]MA[ij];W[qe]
+MA[ij];B[re]MA[ij];W[qh]MA[ij])
+)
+)
+
+(;W[pb]MA[ih];B[qb]MA[ih];W[pd]MA[ih];B[qc]MA[ih];W[md]MA[ih])
+)
+
+(;W[ph];B[of]MA[ij];W[md]MA[ij];B[lc]MA[ij];W[nf]MA[ij]
+(;B[ng]MA[ij];W[mf]MA[ij];B[oh]MA[ij]
+(;W[pj]MA[il];B[pc]MA[il];W[nc]MA[il];B[ic]MA[hk])
+
+(;W[ic]MA[gj])
+)
+
+(;B[oh]MA[ik]
+(;W[pj]MA[ik];B[ng]MA[ik];W[mf]MA[ik])
+
+(;W[pe]MA[ik];B[qe]MA[ik];W[og]MA[ik];B[ng]MA[ik];W[pg]MA[ik];B[qf]
+MA[ik];W[mf]MA[ik];B[pi]MA[ik];W[nh]MA[ik];B[oi]MA[ik];W[mg]MA[ik];
+B[qh]MA[ik];W[ic]MA[gj])
+)
+)
+)
+
+(;B[od]MA[mf]C[0
+];W[nd]MA[kg];B[pc]MA[kg];W[oe]MA[kg];B[pd]MA[kg];
+W[nc]MA[kg])
+
+(;B[pf]MA[kj]
+(;W[qc]MA[lh];B[rc]MA[lh];W[pd]MA[lh]
+(;B[qe]MA[lh]
+(;W[qb]MA[lh];B[qj]MA[ll])
+
+(;W[tt];B[qb]MA[mh];W[pb]MA[mh])
+)
+
+(;B[qb]MA[lh];W[qe]MA[lh];B[pc]MA[lh];W[rd]MA[lh];B[qc]MA[lh];W[pe]
+MA[lh];B[od]MA[lh];W[oe]MA[lh];B[nd]MA[kh];W[lc];B[ne]MA[kh];W[of]
+MA[kh];B[nc]MA[kh])
+)
+
+(;W[lc]MA[ji]
+(;B[pc]MA[ji];W[od]MA[ji]
+(;B[ph]MA[jk])
+
+(;B[qi]MA[jk])
+)
+
+(;B[qj]C[0
+]MA[jl];W[qc]MA[jl];B[rc]MA[jl];W[pd]MA[jl];B[qe]MA[jl]
+(;W[qb]C[j
+]MA[jl])
+
+(;W[tt];B[qb]MA[jl];W[pb]MA[jl])
+)
+)
+
+(;W[kc]MA[hj]C[j
+]
+(;B[pc]C[0
+];W[od])
+
+(;B[ic]MA[hj];W[qc]MA[hj];B[rc]MA[hj];W[pd]MA[hj];B[qe]MA[hj];W[qb]
+MA[hj];B[qj]MA[hl])
+
+(;B[mc]MA[ii]C[#are there other continuations of note here?
+];W[mb]
+MA[ii];B[lb]MA[jh];W[lc]MA[jh];B[nb]MA[jh];W[md]MA[jh];B[nc]MA[jh];
+W[nd]MA[jh];B[od]MA[jh];W[ob]MA[jh];B[ma]MA[jh];W[oa]MA[jh];B[na]
+MA[jh];W[kb]MA[jh];B[pc]MA[jh];W[oe]MA[jh];B[pd]MA[jh])
+)
+
+(;W[qh]C[j
+]MA[ik]
+(;B[kc]MA[ik])
+
+(;B[pk]MA[il])
+)
+)
+)
+
+(;W[nc]
+(;B[lc]MA[jf];W[qc]MA[jf]
+(;B[rc]C[0
+#too easy for w
+]MA[jf];W[pc]MA[jf];B[re]MA[jf];W[ne]MA[jf])
+
+(;B[pc]MA[jf];W[pd]MA[jf]
+(;B[qb]MA[jf];W[rc]MA[jf];B[od]MA[jf];W[pe]MA[jf];B[oc]MA[jf];W[rb]
+MA[jf];B[of]MA[jh];W[oe]MA[jh];B[ne]MA[jh];W[qe]MA[jh];B[nf]MA[jh])
+
+(;B[od]C[0
+#bad for b
+]MA[jf];W[pe]MA[jf];B[qb]MA[jf];W[oc]MA[jf];
+B[rc]MA[jf];W[pb]MA[jf];B[qc]MA[jf];W[ne]MA[jf])
+)
+)
+
+(;B[pc]MA[jf];W[kc]MA[jf])
+
+(;B[od]MA[jf];W[nd]MA[jf]
+(;B[oc]MA[jf];W[ne]MA[jf])
+
+(;B[ne]MA[jg];W[me]MA[jg];B[oc]MA[jg];W[ob]MA[jg];B[pb]MA[jg];W[nb]
+MA[jg];B[oe]MA[jg];W[mf]MA[jg])
+)
+)
+
+)
diff --git a/patterns/mc_mogo_classic.db b/patterns/mc_mogo_classic.db
new file mode 100644 (file)
index 0000000..ff0fcab
--- /dev/null
@@ -0,0 +1,257 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# This is an approximate adaptation to patterns of the simulation
+# policy for an early version of MoGo, as published in the report
+# "Modification of UCT with Patterns in Monte-Carlo Go", RR-6062, by
+# Sylvain Gelly, Yizao Wang, Rémi Munos, and Olivier Teytaud.
+#
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+
+# Proper eyes.
+
+oOo
+O*O
+oO?
+
+:0
+
+
+oOo
+O*O
+---
+
+:0
+
+
+|Oo
+|*O
++--
+
+:0
+
+
+# Run away from atari or capture near move.
+
+?X?
+?*?
+???
+
+:10000,ocap1+,osafe,near
+
+?O?
+?*?
+???
+
+:10000,xcap1+,osafe,near
+
+
+# 1. Patterns for hane.
+# 1.1 First figure.
+
+XOX
+.*.
+???
+
+:100,near
+
+
+OXO
+.*.
+???
+
+:100,near
+
+
+# 1.2 Second figure.
+
+XO.
+.*.
+?.?
+
+:100,near
+
+
+OX.
+.*.
+?.?
+
+:100,near
+
+
+# 1.3 Third figure.
+
+XO?
+X*.
+?.?
+
+:100,near
+
+
+OX?
+O*.
+?.?
+
+:100,near
+
+
+# 1.4 Fourth figure.
+
+OXX
+.*.
+?.?
+
+:100,near
+
+
+# 2. Patterns for cut 1.
+
+XO?
+O*X
+???
+
+:100,near
+
+
+XO?
+O*O
+?O?
+
+:100,near
+
+
+XO?
+O*.
+?.?  
+
+:100,near
+
+
+OX?
+X*.
+?.?
+
+:100,near
+
+
+OX?
+X*X
+?X?
+
+:100,near
+
+
+OX?
+X*.
+?.?
+
+:100,near
+
+  
+# 3. Patterns for cut 2.
+
+?O?
+X*X
+ooo
+
+:100,near
+
+
+?X?
+O*O
+xxx
+
+:100,near
+
+       
+# 4. Patterns on the edge.
+# 4.1 First figure.
+
+O.?
+X*?
+---
+
+:100,near
+
+
+X.?
+O*?
+---
+
+:100,near
+
+
+# 4.2 Second figure.
+
+XO?
+x*?
+---
+
+:100,near
+
+
+?X?
+O*o
+---
+
+:100,near
+
+
+# 4.3 Third figure.
+
+XO?
+?*?
+---
+
+:100,near
+
+
+# 4.4 Fourth figure.
+
+OX?
+o*?
+---
+
+:100,near
+
+
+# 4.5 Fifth figure.
+
+?XO
+O*X
+---
+
+:100,near
+
+
+# Default value.
+
+???
+?*?
+???
+
+:1
+
diff --git a/patterns/mc_montegnu_classic.db b/patterns/mc_montegnu_classic.db
new file mode 100644 (file)
index 0000000..0b04983
--- /dev/null
@@ -0,0 +1,176 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# This is an approximate adaptation to patterns of the original
+# simulation policy of GNU Go's Monte Carlo code.
+#
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+# Proper eyes.
+
+oOo
+O*O
+oO?
+
+:0
+
+oOo
+O*O
+---
+
+:0
+
+|Oo
+|*O
++--
+
+:0
+
+
+# If the opponent played self-atari, with high probability capture.
+# This also applies to capturing out of recent atari on own stones.
+
+?X%
+?*%
+%%%
+
+:10000,ocap1,near,osafe
+:13000,ocap2,near
+:20000,ocap3,near
+
+
+# Extend out of recent atari.
+
+?O%
+?*%
+%%%
+
+:2000,xcap1,osafe,near
+:4000,xcap2,osafe,near
+:6000,xcap3,osafe,near
+
+
+# If the opponent might cut, connect or at least try to connect.
+# 
+#  oYo
+#  o*o
+
+?XO
+O*?
+%%%
+
+:1000,near,osafe
+
+?X?
+O*O
+%%%
+
+:1000,near,osafe
+
+?X|
+O*|
+%%%
+
+:1000,near,osafe
+
+OX|
+?*|
+%%%
+
+:1000,near,osafe
+
+
+# If the opponent invited a cut, do cut.
+# 
+#   Y
+#  o*O
+#   X
+# 
+
+?X?
+o*O
+?X?
+
+:400,near,osafe
+
+|X?
+|*O
+|X?
+
+:400,near,osafe
+
+
+# Crosscut.
+# 
+#  YO
+# o*X
+#  o
+#
+
+?XO
+o*X
+?o?
+
+:100,near,osafe
+
+?XO
+o*X
+---
+
+:100,near,osafe
+
+|XO
+|*X
++--
+
+:100,near,osafe
+
+# Capturing stones is always fun.
+
+?X%
+?*%
+%%%
+
+:30,ocap1,far,osafe
+:40,ocap2,far
+:60,ocap3,far
+
+
+# Slightly prefer near moves.
+
+??%
+?*%
+%%%
+
+:3,near,osafe
+
+
+# Default move value.
+
+??%
+?*%
+%%%
+
+:1
diff --git a/patterns/mc_uniform.db b/patterns/mc_uniform.db
new file mode 100644 (file)
index 0000000..ae85fb7
--- /dev/null
@@ -0,0 +1,49 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# This is the so called "light playout" simulation policy where moves
+# are chosen with uniform probability over the legal moves, except for
+# playing into small proper eyes.
+#
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+# Proper eyes.
+
+oOo
+O*O
+oO?
+
+:0
+
+oOo
+O*O
+---
+
+:0
+
+|Oo
+|*O
++--
+
+:0
diff --git a/patterns/mkeyes.c b/patterns/mkeyes.c
new file mode 100644 (file)
index 0000000..56d88e7
--- /dev/null
@@ -0,0 +1,404 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Compile the eye database. This produces eyes.c. */
+
+/* see also eyes.db, eyes.h and engine/optics.c */
+
+
+#define MAXLINE 80
+#define MAXDIMEN 20
+#define MAXSIZE 20
+#define MAXPATNO 800
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "eyes.h"
+
+
+int
+main(void)
+{
+  char line[MAXLINE];
+  int patno = 0;
+  int p;
+  char vertex[MAXDIMEN][MAXDIMEN];
+  signed char marginal[MAXDIMEN][MAXDIMEN];
+  signed char edge[MAXDIMEN][MAXDIMEN];
+  unsigned char flags[MAXDIMEN][MAXDIMEN];
+  int neighbors[MAXSIZE];
+  int k, l, h;
+  int m = 0, n = 0;
+  int vi[MAXSIZE];
+  int vj[MAXSIZE];
+  int eye_number[MAXPATNO];
+  int esize[MAXPATNO];
+  int msize[MAXPATNO];
+  int value_a[MAXPATNO];
+  int value_b[MAXPATNO];
+  int value_c[MAXPATNO];
+  int value_d[MAXPATNO];
+  int ends[MAXPATNO];
+  int two_neighbors[MAXPATNO];
+  int three_neighbors[MAXPATNO];
+  int num_attacks = 0;
+  int num_defenses = 0;
+  int debug = 0;
+  int fatal_errors = 0;
+  
+  printf("\
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\\n\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *\n\
+ * http://www.gnu.org/software/gnugo/ for more information.          *\n\
+ *                                                                   *\n\
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 and 2007 *\n\
+ * by the Free Software Foundation.                                  *\n\
+ *                                                                   *\n\
+ * This program is free software; you can redistribute it and/or     *\n\
+ * modify it under the terms of the GNU General Public License as    *\n\
+ * published by the Free Software Foundation - version 3             *\n\
+ * or (at your option) any later version                             *\n\
+ *                                                                   *\n\
+ * This program is distributed in the hope that it will be useful,   *\n\
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *\n\
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *\n\
+ * GNU General Public License in file COPYING for more details.      *\n\
+ *                                                                   *\n\
+ * You should have received a copy of the GNU General Public         *\n\
+ * License along with this program; if not, write to the Free        *\n\
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *\n\
+ * Boston, MA 02111, USA.                                            *\n\
+\\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n");
+
+  printf("/* This file is automatically generated by mkeyes. Do not\n");
+  printf(" * edit it directly. Instead, edit the eye shape database.\n");
+  printf(" */\n\n");
+  printf("#include <stdio.h> /* for NULL */\n");
+  printf("#include \"eyes.h\"\n\n");
+
+  memset(ends, 0, sizeof(ends));
+  memset(two_neighbors, 0, sizeof(two_neighbors));
+  memset(three_neighbors, 0, sizeof(three_neighbors));
+  memset(esize, 0, sizeof(esize));
+
+  while (fgets(line, MAXLINE, stdin) && !fatal_errors) {
+    int last = strlen(line) - 1;
+
+    if (line[last] != '\n') {
+      fprintf(stderr, "mkeyes: line truncated: %s\n", line);
+      return 1;
+    }
+
+    /* remove trailing whitespace */
+    for (last--; last >= 0 && isspace((int) line[last]); last--) {
+      line[last]   = '\n';
+      line[last+1] = '\0';
+    }
+
+    /* New pattern. */
+    if (sscanf(line, "Pattern %d", &p)) {
+      eye_number[patno] = p;
+      if (patno > 0 && eye_number[patno] <= eye_number[patno-1]) {
+       fprintf(stderr, "mkeyes: Pattern %d out of sequence\n",
+               eye_number[patno]);
+       return 1;
+      }
+      if (debug)
+       fprintf(stderr, "parsing pattern %d\n", eye_number[patno]);
+      
+      memset(vertex, 0, sizeof(vertex));
+      memset(marginal, 0, sizeof(marginal));
+      memset(edge, 0, sizeof(edge));
+      memset(flags, 0, sizeof(flags));
+      
+      m = 0;
+      esize[patno] = 0;
+      msize[patno] = 0;
+      num_attacks = 0;
+      num_defenses = 0;
+      continue;
+    }
+    
+    /* Empty line or comment line, skip. */
+    if (strncmp("#", line, 1) == 0 || strncmp("\n", line, 1) == 0)
+      continue;
+
+    if (strncmp(":", line, 1) != 0) {
+      /* diagram line. */
+      for (n = 0; n < MAXDIMEN && strncmp("\n", line + n, 1); n++) {
+       /* space, harmless CR, or corner symbol */
+       if (line[n] == ' ' || line[n] == '\r' || line[n] == '+')
+         continue;
+
+       /* vertical edge */
+       if (line[n] == '|') {
+         if (n == 0)
+           edge[m][n+1]++;
+         else
+           edge[m][n-1]++;
+         continue;
+       }
+
+       /* horizontal edge */
+       if (line[n] == '-') {
+         if (m == 0)
+           edge[m+1][n]++;
+         else
+           edge[m-1][n]++;
+         continue;
+       }
+
+       /* All other symbols. */
+       vi[esize[patno]] = m;
+       vj[esize[patno]] = n;
+       vertex[m][n] = line[n];
+       if (debug)
+         fprintf(stderr, "%c", line[n]);
+       switch (line[n]) 
+       {
+         case '.':
+           marginal[m][n] = 0;
+           flags[m][n] = CAN_BE_EMPTY;
+           break;
+           
+         case '!':
+           msize[patno]++;
+           marginal[m][n] = 1;
+           flags[m][n] = CAN_BE_EMPTY;
+           break;
+           
+         case '@':
+           msize[patno]++;
+           marginal[m][n] = 1;
+           flags[m][n] = CAN_BE_EMPTY | EYE_DEFENSE_POINT | EYE_ATTACK_POINT;
+           num_attacks++;
+           num_defenses++;
+           break;
+           
+         case '$':
+           msize[patno]++;
+           marginal[m][n] = 1;
+           flags[m][n] = CAN_CONTAIN_STONE;
+           break;
+           
+         case '(':
+           msize[patno]++;
+           marginal[m][n] = 1;
+           flags[m][n] = CAN_BE_EMPTY | EYE_ATTACK_POINT;
+           num_attacks++;
+           break;
+           
+         case ')':
+           msize[patno]++;
+           marginal[m][n] = 1;
+           flags[m][n] = CAN_BE_EMPTY | EYE_DEFENSE_POINT;
+           num_defenses++;
+           break;
+           
+         case 'x':
+           marginal[m][n] = 0;
+           flags[m][n] = CAN_BE_EMPTY | CAN_CONTAIN_STONE;
+           break;
+           
+         case '*':
+           marginal[m][n] = 0;
+           flags[m][n] = CAN_BE_EMPTY | EYE_ATTACK_POINT | EYE_DEFENSE_POINT;
+           num_attacks++;
+           num_defenses++;
+           break;
+           
+         case '<':
+           marginal[m][n] = 0;
+           flags[m][n] = CAN_BE_EMPTY | EYE_ATTACK_POINT;
+           num_attacks++;
+           break;
+
+         case '>':
+           marginal[m][n] = 0;
+           flags[m][n] = CAN_BE_EMPTY | EYE_DEFENSE_POINT;
+           num_defenses++;
+           break;
+           
+         case 'X':
+           marginal[m][n] = 0;
+           flags[m][n] = CAN_CONTAIN_STONE;
+           break;
+           
+         default:
+           fprintf(stderr, 
+                   "mkeyes: invalid character %c in pattern %d\n",
+                   line[n], eye_number[patno]);
+           fatal_errors++;
+           break;
+       }
+       esize[patno]++;
+      }
+      m++;
+      if (debug)
+       fprintf(stderr, "\n");
+    }
+    else {
+      /* Colon line. */
+      sscanf(line, ":%1d%1d%1d%1d", &value_a[patno], &value_b[patno],
+            &value_c[patno], &value_d[patno]);
+      if (debug)
+       fprintf(stderr, "value=%d%d%d%d\n", value_a[patno], value_b[patno],
+               value_c[patno], value_d[patno]);
+
+      if (value_b[patno] != value_c[patno]) {
+       if (num_attacks == 0 || num_defenses == 0) {
+         fprintf(stderr,
+                 "mkeyes: missing attack or defense point in pattern %d\n",
+                 eye_number[patno]);
+         fatal_errors++;
+       }
+      }
+      
+      if (value_b[patno] == value_c[patno]) {
+       if (num_attacks > 0 || num_defenses > 0) {
+         fprintf(stderr,
+                 "mkeyes: attack or defense point in settled pattern %d\n",
+                 eye_number[patno]);
+         fatal_errors++;
+       }
+      }
+      
+      printf("static struct eye_vertex eye%d[] = {\n", eye_number[patno]);
+      
+      for (l = 0; l < esize[patno]; l++) {
+       int ni[4];
+       int nj[4];
+       int nb[4];
+       int mx[MAXDIMEN][MAXDIMEN];
+       int count = 0;
+       int i = vi[l];
+       int j = vj[l];
+       
+       memset(mx, -1, sizeof(mx));
+       
+       neighbors[l] = 0;
+       
+       for (h = 0; h < 4; h++) {
+         ni[h] = -1;
+         nj[h] = -1;
+         nb[h] = -1;
+       }
+       
+       mx[i][j] = 0;
+       
+       if (i > 0 && vertex[i-1][j]) {
+         ni[neighbors[l]] = i-1;
+         nj[neighbors[l]] = j;
+         neighbors[l]++;
+         count++;
+         mx[i-1][j] = l;
+       }
+       
+       if (i < MAXDIMEN-1 && vertex[i+1][j]) {
+         ni[neighbors[l]] = i+1;
+         nj[neighbors[l]] = j;
+         neighbors[l]++;
+         count++;
+         mx[i+1][j] = l;
+       }
+       
+       if (j > 0 && vertex[i][j-1]) {
+         ni[neighbors[l]] = i;
+         nj[neighbors[l]] = j-1;
+         neighbors[l]++;
+         mx[i][j-1] = l;
+       }
+       
+       if (j < MAXDIMEN-1 && vertex[i][j+1]) {
+         ni[neighbors[l]] = i;
+         nj[neighbors[l]] = j+1;
+         neighbors[l]++;
+         mx[i][j+1] = l;
+       }
+       
+       
+       if (neighbors[l] == 1)
+         ends[patno]++;
+       else if (neighbors[l] == 2)
+         two_neighbors[patno]++;
+       else if (neighbors[l] == 3)
+         three_neighbors[patno]++;
+       
+       for (h = 0; h < esize[patno]; h++) {
+         
+         for (k = 0; k < 4; k++)
+           if (ni[k] != -1 && vi[h] == ni[k] && vj[h] == nj[k])
+             nb[k] = h;
+       }
+       
+       
+       printf("  {%d, %d, %2d, %d, {%2d, %2d, %2d, %2d}}",
+              marginal[i][j], (int) edge[i][j], (int) flags[i][j],
+              neighbors[l], nb[0], nb[1], nb[2], nb[3]);
+       
+       if (l < esize[patno]-1)
+         printf(",\n");
+       else
+         printf("\n};\n\n");
+      }
+      
+      patno++;
+      if (patno >= MAXPATNO) {
+       fprintf(stderr,
+               "mkeyes: Too many eye patterns. Increase MAXPATNO in mkeyes.c\n");
+       fatal_errors++;
+      }
+    }
+  }
+
+  
+  printf("\nstruct eye_graph graphs[] = {\n");
+  for (l = 0; l < patno; l++) {
+
+    printf("  {eye%d, %d, %d, %d, %d, %d, %d, {%d, %d, %d, %d}}",
+          eye_number[l], eye_number[l], esize[l], msize[l], ends[l],
+          two_neighbors[l], three_neighbors[l],
+          value_a[l], value_b[l], value_c[l], value_d[l]);
+    if (l < patno-1)
+      printf(",\n");
+    else
+      printf(",\n  {NULL, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0}}\n};\n");
+  }
+
+  if (fatal_errors) {
+    printf("\n\n#error in eye database.  Rebuild.\n\n");
+  }
+
+  return fatal_errors;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/mkeyes.dsp b/patterns/mkeyes.dsp
new file mode 100644 (file)
index 0000000..bc3282a
--- /dev/null
@@ -0,0 +1,98 @@
+# Microsoft Developer Studio Project File - Name="mkeyes" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=mkeyes - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "mkeyes.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "mkeyes.mak" CFG="mkeyes - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "mkeyes - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "mkeyes - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "mkeyes - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I ".." /I "../engine" /I "../sgf" /I "../utils" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /Fd"Release/mkeyes" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 /nologo /subsystem:console /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "mkeyes - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I ".." /I "../engine" /I "../sgf" /I "../utils" /D "_DEBUG" /D "HAVE_CONFIG_H" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /Fd"Debug/mkeyes" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "mkeyes - Win32 Release"\r
+# Name "mkeyes - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\mkeyes.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/mkmcpat.c b/patterns/mkmcpat.c
new file mode 100644 (file)
index 0000000..d4dd0d0
--- /dev/null
@@ -0,0 +1,154 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Compile Monte Carlo local pattern database. This produces mcpat.c. */
+
+/* See also mc_*.db and engine/montecarlo.c. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "liberty.h"
+
+/* Trim leading path, a possible mc_ prefix, and a possible .db suffix
+ * from the filename. The caller has to free the returned pointer when
+ * it's no longer needed.
+ *
+ * FIXME: This code is quite ugly and should be possible to clean up.
+ */
+static char *
+copy_and_trim_name(const char *filename)
+{
+  int name_length = strlen(filename);
+  char *name = malloc(name_length + 1);
+  char *start = name;
+  char *p;
+  char *name2;
+  
+  strcpy(name, filename);
+
+  p = strrchr(name, '/');
+  if (p) {
+    p++;
+    name_length -= (p - name);
+    start = p;
+  }
+  
+  if (strncmp(start, "mc_", 3) == 0) {
+    start += 3;
+    name_length -= 3;
+  }
+  
+  if (strncmp(start + name_length - 3, ".db", 3) == 0)
+    start[name_length - 3] = '\0';
+
+  name2 = malloc(name_length + 1);
+  strcpy(name2, start);
+  free(name);
+  
+  return name2;
+}  
+
+int
+main(int argc, char *argv[])
+{
+  int N = mc_get_size_of_pattern_values_table();
+  unsigned int *values;
+  int i;
+  int k;
+  char *name;
+
+  if (argc < 2) {
+    fprintf(stderr, "Usage: ...\n");
+    exit(EXIT_FAILURE);
+  }
+
+  printf("\
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\\n\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *\n\
+ * http://www.gnu.org/software/gnugo/ for more information.          *\n\
+ *                                                                   *\n\
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *\n\
+ * 2008 and 2009 by the Free Software Foundation.                    *\n\
+ *                                                                   *\n\
+ * This program is free software; you can redistribute it and/or     *\n\
+ * modify it under the terms of the GNU General Public License as    *\n\
+ * published by the Free Software Foundation - version 3             *\n\
+ * or (at your option) any later version                             *\n\
+ *                                                                   *\n\
+ * This program is distributed in the hope that it will be useful,   *\n\
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *\n\
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *\n\
+ * GNU General Public License in file COPYING for more details.      *\n\
+ *                                                                   *\n\
+ * You should have received a copy of the GNU General Public         *\n\
+ * License along with this program; if not, write to the Free        *\n\
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *\n\
+ * Boston, MA 02111, USA.                                            *\n\
+\\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n");
+
+  printf("/* This file is automatically generated by mkmcpat. Do not\n");
+  printf(" * edit it directly. Instead, edit the pattern databases\n");
+  printf(" * mc_*.db.\n");
+  printf(" */\n\n");
+  printf("#include <stdio.h> /* for NULL */\n");
+  printf("#include \"liberty.h\"\n\n");
+  printf("#include \"patterns.h\"\n\n");
+
+  values = malloc(N * sizeof(*values));
+
+  for (i = 1; i < argc; i++) {
+    if (!mc_load_patterns_from_db(argv[i], values))
+      exit(EXIT_FAILURE);
+
+    name = copy_and_trim_name(argv[i]);
+
+    printf("static const unsigned int %s_values[] = {\n", name);
+    for (k = 0; k < N; k++) {
+      printf("%u, ", values[k]);
+      if (k % 16 == 15)
+       printf("\n");
+    }
+    printf("\n};\n\n");
+
+    free(name);
+  }
+
+  printf("struct mc_pattern_database mc_pattern_databases[] = {\n");
+  for (i = 1; i < argc; i++) {
+    name = copy_and_trim_name(argv[i]);
+    printf("  {\"%s\", %s_values},\n", name, name);
+    free(name);
+  }
+  printf("  {NULL, NULL}};\n");
+
+  return 0;
+}
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/mkmcpat.dsp b/patterns/mkmcpat.dsp
new file mode 100644 (file)
index 0000000..7cfacb8
--- /dev/null
@@ -0,0 +1,102 @@
+# Microsoft Developer Studio Project File - Name="mkmcpat" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=mkmcpat - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "mkmcpat.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "mkmcpat.mak" CFG="mkmcpat - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "mkmcpat - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "mkmcpat - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "mkmcpat - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I ".." /I "..\utils" /I "..\engine" /I "..\sgf" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /Fd"Release/mkmcpat" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 ..\utils\Release\utils.lib .\Release\dfa.lib ..\sgf\Release\sgf.lib ..\engine\Release\engine.lib /nologo /subsystem:console /debug /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "mkmcpat - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I ".." /I "..\utils" /I "..\engine" /I "..\sgf" /D "_DEBUG" /D "HAVE_CONFIG_H" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /Fd"Debug/mkmcpat" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 ..\utils\Debug\utils.lib .\Debug\dfa.lib ..\sgf\Debug\sgf.lib ..\engine\Debug\engine.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "mkmcpat - Win32 Release"\r
+# Name "mkmcpat - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\mkmcpat.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=..\engine\liberty.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/mkpat.c b/patterns/mkpat.c
new file mode 100644 (file)
index 0000000..70a6964
--- /dev/null
@@ -0,0 +1,3011 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Compile one of the pattern databases. This takes a database file,
+ * e.g. patterns.db, and produces a C code file, in this case
+ * patterns.c.
+ */
+
+/* See also patterns.h, and the *.db files.
+ */
+
+/* Differences when compiling connections patterns (-c) :
+ *  '*' means cutting point
+ *  '!' is allowed (inhibit connection there), matches as '.'.
+ *  '!' will always be written as the first elements
+*/
+
+/* FIXME: This file is a horrible mess, especially after pattern
+ *       matching went 1D. Cleaning it will make future work
+ *       with pattern mathing easier.
+ */
+
+/* As in the rest of GNU Go, co-ordinate convention (i,j) is 'i' down from
+ * the top, then 'j' across from the left
+ */
+
+#define USAGE "\
+Usage : mkpat [options] <prefix>\n\
+  General options:\n\
+       -i = one or more input files (typically *.db)\n\
+       -o = output file (typically *.c)\n\
+       -t = DFA transformations file (typically *.dtr)\n\
+       -v = verbose\n\
+       -V <level> = DFA verbiage level\n\
+  Database type:\n\
+       -p = compile general pattern database (the default)\n\
+       -c = compile connections database\n\
+       -C = compile a corner pattern database\n\
+       -D = compile a DFA database (allows fast matching)\n\
+       -d <iterations> = don't generate database, but optimize a DFA\n\
+                         transformation file instead\n\
+  Pattern generation options:\n\
+       -O = allow only O to be anchor (the default)\n\
+       -X = allow only X to be anchor\n\
+       -b = allow both colors to be anchor\n\
+       -m = try to place the anchor in the center of the pattern\n\
+            (works best with DFA databases)\n\
+       -a = require anchor in all patterns. Sets fixed_anchor flag in db\n\
+If no input files specified, reads from stdin.\n\
+If output file is not specified, writes to stdout.\n\
+"
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "liberty.h"
+#include "patterns.h"
+#include "gg-getopt.h"
+#include "gg_utils.h"
+
+#include "dfa-mkpat.h"
+
+
+#define DB_GENERAL     ((int) 'p')
+#define DB_CONNECTIONS ((int) 'c')
+#define DB_CORNER      ((int) 'C')
+#define DB_DFA         ((int) 'D')
+#define OPTIMIZE_DFA   ((int) 'd')
+
+/* code assumes that ATT_O and ATT_X are 1 and 2 (in either order)
+ * An attribute is a candidate for anchor if  (att & anchor) != 0
+ */
+#define ANCHOR_O    ATT_O
+#define ANCHOR_X    ATT_X
+#define ANCHOR_BOTH (ATT_O | ATT_X)
+
+#define MAXLINE                        500
+#define MAXCONSTRAINT          10000
+#define MAXACTION              10000
+#define MAXPATNO               5000
+#define MAXLABELS              20
+#define MAXPARAMS              20
+#define MAX_INPUT_FILE_NAMES   10
+#define MAXNAME                        80
+
+/* Avoid compiler warnings with unused parameters */
+#define UNUSED(x)  (void)x
+
+/* valid characters that can appear in a pattern
+ * position in string is att value to store
+ */
+static const char VALID_PATTERN_CHARS[]     = ".XOxo,a!*?QY";
+static const char VALID_EDGE_CHARS[]        = "+-|";
+static const char VALID_CONSTRAINT_LABELS[] = "abcdefghijklmnpqrstuvwyzABCDEFGHIJKLMNPRSTUVWZ";
+
+
+/* the offsets into the list are the ATT_* defined in patterns.h
+ * The following defns are for internal use only, and are not
+ * written out to the compiled pattern database
+ */
+
+#define ATT_star  8
+#define ATT_wild  9
+#define ATT_Q    10
+#define ATT_Y    11
+
+/* These arrays control discarding of unnecessary patval elements.
+ * Modify them using `goal_elements ...' and `callback_data ..'
+ * commands in a database. By default, we don't drop any elements.
+ */
+static int nongoal[8]          = {0, 0, 0, 0, 0, 0, 0, 0};
+static int callback_unneeded[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+/* stuff used in reading/parsing pattern rows */
+static int maxi, maxj;          /* (i,j) offsets of largest element */
+static int mini, minj;          /* offset of top-left element
+                                  (0,0) unless there are edge constraints */
+static int movei, movej;
+static unsigned int where;      /* NORTH_EDGE | WEST_EDGE, etc */
+static int el;                  /* next element number in current pattern */
+static struct patval_b elements[MAX_BOARD*MAX_BOARD]; /* elements of current pattern */
+static int num_stars;
+
+static int ci = -1, cj = -1;    /* position of origin (first piece element)
+                                  relative to top-left */
+static int patno;              /* current pattern */
+static int discard_pattern = 0;        /* Set to nonzero to discard a pattern (if e.g.
+                                * it is too large or duplicated). */
+static int pats_with_constraints = 0;  /* just out of interest */
+static int label_coords[256][2]; /* Coordinates for labeled stones in the 
+                                   autohelper patterns. */
+static int current_c_i;                /* Counter for the line number of a 
+                                  constraint diagram. */
+static char constraint[MAXCONSTRAINT]; /* Store constraint lines. */
+static char action[MAXCONSTRAINT];     /* Store action lines. */
+static char diagram[MAX_BOARD+2][MAX_BOARD+3];
+                               /* store pattern diagram*/
+static char constraint_diagram[MAX_BOARD+2][MAX_BOARD+3];
+                               /* store pattern constraint diagram */
+
+/* stuff to maintain info about patterns while reading */
+static char *prefix;
+static struct pattern pattern[MAXPATNO]; /* accumulate the patterns into here */
+static char pattern_names[MAXPATNO][MAXNAME]; /* with optional names here, */
+static int num_attributes;
+static struct pattern_attribute attributes[MAXPATNO * NUM_ATTRIBUTES];
+static char helper_fn_names[MAXPATNO][MAXNAME]; /* helper fn names here */
+static char autohelper_code[MAXPATNO*300]; /* code for automatically generated */
+                                          /* helper functions here */
+static char *code_pos;              /* current position in code buffer */
+struct autohelper_func {
+  const char *name;
+  int params;
+  int type;    /* 0 - just copy the parameters,
+                * 1 - add parameter count,
+                * 2 - add address of the current pattern.
+                */
+  float cost;
+  const char *code;
+};
+
+
+/*
+ * current_* are useful for debugging broken patterns.
+ */
+static const char *current_file = NULL;
+static int current_line_number = 0;
+
+
+struct attribute_description {
+  const char *input_name;      /* The name used in `.db' files. */
+  enum attribute_type type;
+};
+
+
+static const char *attribute_name[NUM_ATTRIBUTES + 1] = {
+  "MIN_VALUE",
+  "MAX_VALUE",
+  "MIN_TERRITORY",
+  "MAX_TERRITORY",
+  "SHAPE",
+  "FOLLOWUP",
+  "REVERSE_FOLLOWUP",
+  "THREATENS_TO_CAPTURE",
+  "THREATENS_EYE",
+  "REVERSE_SENTE",
+  "LAST_ATTRIBUTE"
+};
+
+
+/* Owl-style value stored in pattern itself. */
+#define IN_PATTERN_VALUE       NUM_ATTRIBUTES
+
+static struct attribute_description general_attribute_map[] = {
+  { "value",           MIN_VALUE },
+  { "minvalue",                MIN_VALUE },
+  { "maxvalue",                MAX_VALUE },
+  { "terri",           MIN_TERRITORY },
+  { "minterri",                MIN_TERRITORY },
+  { "maxterri",                MAX_TERRITORY },
+  { "shape",           SHAPE },
+  { "followup",                FOLLOWUP },
+  { "followup_value",  FOLLOWUP },
+  { "reverse_followup",        REVERSE_FOLLOWUP },
+  { NULL,              LAST_ATTRIBUTE }
+};
+
+static struct attribute_description value_only_attribute_map[] = {
+  { "value",           IN_PATTERN_VALUE },
+  { NULL,              LAST_ATTRIBUTE }
+};
+
+static struct attribute_description owl_attack_attribute_map[] = {
+  { "value",                   IN_PATTERN_VALUE },
+  { "threatens_to_capture",    THREATENS_TO_CAPTURE },
+  { "threatens_eye",           THREATENS_EYE },
+  { "reverse_sente",           REVERSE_SENTE },
+  { NULL,                      LAST_ATTRIBUTE }
+};
+
+static struct attribute_description owl_defense_attribute_map[] = {
+  { "value",                   IN_PATTERN_VALUE },
+  { "threatens_to_capture",    THREATENS_TO_CAPTURE },
+  { "threatens_eye",           THREATENS_EYE },
+  { "reverse_sente",           REVERSE_SENTE },
+  { NULL,                      LAST_ATTRIBUTE }
+};
+
+static struct attribute_description *attribute_map = NULL;
+static int attributes_needed = 0;
+
+
+/* ================================================================ */
+/*                                                                  */
+/*                Autohelper function definitions                   */
+/*                                                                  */
+/* ================================================================ */
+
+/* Important notice:
+ * If one function has a name which is a prefix of another name, the
+ * shorter name must come later in the list. E.g. "lib" must be preceded
+ * by "lib2", "lib3", and "lib4".
+ */
+static struct autohelper_func autohelper_functions[] = {
+  {"lib2",                     1, 0, 0.01, "worm[%s].liberties2"},
+  {"lib3",                     1, 0, 0.01, "worm[%s].liberties3"},
+  {"lib4",                     1, 0, 0.01, "worm[%s].liberties4"},
+  {"lib",                      1, 0, 0.01, "countlib(%s)"},
+  {"alive",                    1, 0, 0.01,
+               "(dragon[%s].status == ALIVE)"},
+  {"unknown",                  1, 0, 0.01,
+               "(dragon[%s].status == UNKNOWN)"},
+  {"critical",                 1, 0, 0.01,
+               "(dragon[%s].status == CRITICAL)"},
+  {"dead",                     1, 0, 0.01, "(dragon[%s].status == DEAD)"},
+  {"status",                   1, 0, 0.01, "dragon[%s].status"},
+  {"ko",                       1, 0, 0.01, "is_ko_point(%s)"},
+  {"xdefend_against",          2, 0, 1.00,
+               "defend_against(%s, OTHER_COLOR(color), %s)"},
+  {"odefend_against",          2, 0, 1.00, "defend_against(%s, color, %s)"},
+  {"defend_against_atari",     1, 0, 1.00,
+               "defend_against_atari_helper(move, %s)"},
+  {"does_defend",              2, 0, 1.00, "does_defend(%s, %s)"},
+  {"does_attack",              2, 0, 1.00, "does_attack(%s, %s)"},
+  {"attack",                   1, 0, 1.00, "ATTACK_MACRO(%s)"},
+  {"defend",                   1, 0, 1.00, "DEFEND_MACRO(%s)"},
+  {"weakness",                 1, 0, 0.01, "dragon_weakness(%s, 0)"},
+  {"weak",                     1, 0, 0.01, "dragon_weak(%s)"},
+  {"safe_xmove",               1, 0, 1.00, "safe_move(%s, OTHER_COLOR(color))"},
+  {"safe_omove",               1, 0, 1.00, "safe_move(%s, color)"},
+  {"legal_xmove",              1, 0, 0.05, "is_legal(%s, OTHER_COLOR(color))"},
+  {"legal_omove",              1, 0, 0.05, "is_legal(%s, color)"},
+  {"x_suicide",                        1, 0, 0.05, "is_suicide(%s, OTHER_COLOR(color))"},
+  {"o_suicide",                        1, 0, 0.05, "is_suicide(%s, color)"},
+  {"x_alive_somewhere",                0, 1, 0.01,
+               "somewhere(OTHER_COLOR(color), 1, %d"},
+  {"o_alive_somewhere",                0, 1, 0.01, "somewhere(color, 1, %d"},
+  {"x_somewhere",              0, 1, 0.01,
+               "somewhere(OTHER_COLOR(color), 0, %d"},
+  {"o_somewhere",              0, 1, 0.01, "somewhere(color, 0, %d"},
+  {"xmoyo_opposite",           1, 0, 0.01,
+      "(whose_moyo(INITIAL_INFLUENCE(color), %s) == OTHER_COLOR(color))"},
+  {"omoyo_opposite",           1, 0, 0.01,
+      "(whose_moyo(INITIAL_INFLUENCE(color), %s) == color)"},
+  {"xmoyo",                    1, 0, 0.01,
+      "(whose_moyo(OPPOSITE_INFLUENCE(color), %s) == OTHER_COLOR(color))"},
+  {"omoyo",                    1, 0, 0.01,
+      "(whose_moyo(OPPOSITE_INFLUENCE(color), %s) == color)"},
+  {"xarea",                    1, 0, 0.01,
+      "(whose_area(OPPOSITE_INFLUENCE(color), %s) == OTHER_COLOR(color))"},
+  {"oarea",                    1, 0, 0.01, 
+      "(whose_area(OPPOSITE_INFLUENCE(color), %s) == color)"},
+  {"xterri",                   1, 0, 0.01,
+      "(whose_territory(OPPOSITE_INFLUENCE(color), %s) == OTHER_COLOR(color))"},
+  {"oterri",                   1, 0, 0.01,
+      "(whose_territory(OPPOSITE_INFLUENCE(color), %s) == color)"},
+  {"genus",                    1, 0, 0.01, "dragon[%s].genus"},
+  {"approx_xlib",              1, 0, 0.03,
+               "approxlib(%s, OTHER_COLOR(color), MAX_LIBERTIES, NULL)"},
+  {"approx_olib",              1, 0, 0.03,
+               "approxlib(%s, color, MAX_LIBERTIES, NULL)"},
+  {"xlib",                     1, 0, 0.05,
+       "accuratelib(%s, OTHER_COLOR(color), MAX_LIBERTIES, NULL)"},
+  {"olib",                     1, 0, 0.05,
+       "accuratelib(%s, color, MAX_LIBERTIES, NULL)"},
+  {"xcut",                     1, 0, 0.01,
+       "cut_possible(%s, OTHER_COLOR(color))"},
+  {"ocut",                     1, 0, 0.05, "cut_possible(%s, color)"},
+  {"edge_double_sente",        4, 1, 3.00,
+               "edge_double_sente_helper(%s, %s, %s, %s)"},
+  {"xplay_defend_both",                2, 1, 3.00,
+               "play_attack_defend2_n(OTHER_COLOR(color), 0, %d"},
+  {"oplay_defend_both",                2, 1, 3.00, "play_attack_defend2_n(color, 0, %d"},
+  {"xplay_attack_either",      2, 1, 3.00,
+               "play_attack_defend2_n(OTHER_COLOR(color), 1, %d"},
+  {"oplay_attack_either",      2, 1, 3.00, "play_attack_defend2_n(color, 1, %d"},
+  {"xplay_defend",             1, 1, 1.00,
+               "play_attack_defend_n(OTHER_COLOR(color), 0, %d"},
+  {"oplay_defend",             1, 1, 1.00, "play_attack_defend_n(color, 0, %d"},
+  {"xplay_attack",             1, 1, 1.00,
+               "play_attack_defend_n(OTHER_COLOR(color), 1, %d"},
+  {"oplay_attack",             1, 1, 1.00, "play_attack_defend_n(color, 1, %d"},
+  {"xplay_break_through",      3, 1, 5.00,
+               "play_break_through_n(OTHER_COLOR(color), %d"},
+  {"oplay_break_through",      3, 1, 5.00, "play_break_through_n(color, %d"},
+  {"oplay_connect",            2, 1, 10.00, "play_connect_n(color, 1, %d"},
+  {"xplay_connect",            2, 1, 10.00,
+               "play_connect_n(OTHER_COLOR(color), 1, %d"},
+  {"oplay_disconnect",         2, 1, 10.00, "play_connect_n(color, 0, %d"},
+  {"xplay_disconnect",         2, 1, 10.00,
+               "play_connect_n(OTHER_COLOR(color), 0, %d"},
+  {"oplay_lib",                        1, 1, 0.06, "play_lib_n(color, %d"},
+  {"xplay_lib",                1, 1, 0.06,
+                "play_lib_n(OTHER_COLOR(color), %d"},
+  {"seki_helper",              1, 0, 0.0, "seki_helper(%s)"},
+  {"threaten_to_save",         1, 0, 0.0, "threaten_to_save_helper(move,%s)"},
+  {"threaten_to_capture",      1, 0, 0.0,
+               "threaten_to_capture_helper(move,%s)"},
+  {"prevent_attack_threat",    1, 0, 0.0,
+               "prevent_attack_threat_helper(move, %s)"},
+  {"eye",                      1, 0, 0.01, "is_eye_space(%s)"},
+  {"proper_eye",               1, 0, 0.01, "is_proper_eye_space(%s)"},
+  {"marginal_eye",             1, 0, 0.01, "is_marginal_eye_space(%s)"},
+  {"halfeye",                  1, 0, 0.01, "is_halfeye(half_eye,%s)"},
+  {"max_eye_value",            1, 0, 0.01, "max_eye_value(%s)"},
+  {"owl_topological_eye",      2, 0, 0.01, "owl_topological_eye(%s, board[%s])"},
+  {"obvious_false_oeye",       1, 0, 0.01, "obvious_false_eye(%s, color)"},
+  {"obvious_false_xeye",       1, 0, 0.01,
+               "obvious_false_eye(%s, OTHER_COLOR(color))"},
+  {"antisuji",                 1, 0, 0.0, "add_antisuji_move(%s)"},
+  {"add_connect_move",         2, 0, 0.0, "add_connection_move(move,%s, %s)"},
+  {"add_cut_move",             2, 0, 0.0, "add_cut_move(move, %s, %s)"},
+  {"test_attack_either_move",  2, 0, 0.0,
+               "test_attack_either_move(move, color, %s, %s)"},
+  {"add_defend_both_move",     2, 0, 0.0,
+               "add_all_move(move, DEFEND_STRING, %s, DEFEND_STRING, %s)"},
+  {"same_dragon",              2, 0, 0.01, "is_same_dragon(%s, %s)"},
+  {"same_string",              2, 0, 0.01, "same_string(%s, %s)"},
+  {"dragonsize",               1, 0, 0.01, "dragon[%s].size"},
+  {"wormsize",                 1, 0, 0.01, "countstones(%s)"},
+  {"effective_size",           1, 0, 0.01, "dragon[%s].effective_size"},
+  {"vital_chain",              1, 0, 0.05, "vital_chain(%s)"},
+  {"potential_cutstone",       1, 0, 0.01, "worm[%s].cutstone2 > 1"},
+  {"amalgamate_most_valuable_helper", 3, 0, 0.0,
+               "amalgamate_most_valuable_helper(%s, %s, %s)"},
+  {"amalgamate",               2, 0, 0.0, "join_dragons(%s, %s)"},
+  {"owl_escape_value",         1, 0, 0.01, "owl_escape_value(%s)"},
+  {"owl_goal_dragon",          1, 0, 0.01, "owl_goal_dragon(%s)"},
+  {"owl_eyespace",             1, 0, 0.01, "owl_eyespace(%s)"},
+  {"owl_big_eyespace",         1, 0, 0.01, "owl_big_eyespace(%s)"},
+  {"owl_mineye",               1, 0, 0.01, "owl_mineye(%s)"},
+  {"owl_maxeye",               1, 0, 0.01, "owl_maxeye(%s)"},
+  {"owl_proper_eye",           1, 0, 0.01, "owl_proper_eye(%s)"},
+  {"owl_eye_size",             1, 0, 0.01, "owl_eye_size(%s)"},
+  {"owl_lunch",                 1, 0, 0.01, "owl_lunch(%s)"},
+  {"owl_strong_dragon",                1, 0, 0.01, "owl_strong_dragon(%s)"},
+  {"has_aji",                  1, 0, 0.01,
+               "(dragon[%s].owl_threat_status == CAN_THREATEN_DEFENSE)"},
+  {"finish_ko_helper",         1, 0, 0.05, "finish_ko_helper(%s)"},
+  {"squeeze_ko_helper",                1, 0, 0.03, "squeeze_ko_helper(%s)"},
+  {"backfill_helper",          3, 0, 1.50, "backfill_helper(%s, %s, %s)"},
+  {"connect_and_cut_helper2",  3, 0, 3.00,
+               "connect_and_cut_helper2(%s, %s, %s, color)"},
+  {"connect_and_cut_helper",   3, 0, 3.00, "connect_and_cut_helper(%s, %s, %s)"},
+  {"owl_threatens",            2, 0, 0.01, "owl_threatens_attack(%s, %s)"},
+  {"replace",                  2, 0, 0.0,  "add_replacement_move(%s, %s, color)"},
+  {"backfill_replace",         2, 0, 0.0,  "backfill_replace(%s, %s)"},
+  {"non_oterritory",           1, 0, 0.0,
+               "influence_mark_non_territory(%s, color)"},
+  {"non_xterritory",           1, 0, 0.0,
+               "influence_mark_non_territory(%s, OTHER_COLOR(color))"},
+  {"remaining_handicap_stones",        0, 0, 0.0,  "free_handicap_remaining_stones()"},
+  {"total_handicap_stones",    0, 0, 0.0,  "free_handicap_total_stones()"},
+  {"o_captures_something",     1, 0, 0.02, "does_capture_something(%s, color)"},
+  {"x_captures_something",     1, 0, 0.02,
+               "does_capture_something(%s, OTHER_COLOR(color))"},
+  {"false_eye_territory",      1, 0, 0.0, "false_eye_territory[%s]"},
+  {"false_eye",                        1, 0, 0.01, "is_false_eye(half_eye, %s)"},
+  {"o_visible_along_edge",     2, 0, 0.05, "visible_along_edge(color,%s,%s)"},
+  {"x_visible_along_edge",     2, 0, 0.05, 
+                "visible_along_edge(OTHER_COLOR(color),%s,%s)"},
+  {"is_surrounded",            1, 0, 0.01, "is_surrounded(%s)"},
+  {"does_surround",            2, 0, 1.00, "does_surround(%s, %s)"},
+  {"surround_map",             2, 0, 0.01, "surround_map(%s, %s)"},
+  {"oracle_threatens",         2, 0, 0.01, "oracle_threatens(%s, %s)"},
+  {"value",                    0, 2, 0.0,  "(%s->value)"},
+  {"adjacent_to_stone_in_atari", 1, 0, 1.0,
+                "adjacent_to_stone_in_atari(%s)"},
+  {"adjacent_to_defendable_stone_in_atari", 1, 0, 1.0,
+                "adjacent_to_defendable_stone_in_atari(%s)"},
+  {"good_attack_threat",       2, 0, 0.01, "register_good_attack_threat(%s, %s)"},
+  {"known_safe_move",          1, 0, 0.01, "register_known_safe_move(%s)"},
+  {"break_mirror_helper",      1, 0, 0.01, "break_mirror_helper(%s, color)"}
+};
+
+
+/* To get a valid function pointer different from NULL. */
+static int
+dummyhelper(int transformation, int move, int color, int action)
+{
+  UNUSED(transformation); UNUSED(move); UNUSED(color);
+  UNUSED(action);
+  return 0;
+}
+
+
+#define PREAMBLE "\
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *\n\
+ * http://www.gnu.org/software/gnugo/ for more information.          *\n\
+ *                                                                   *\n\
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *\n\
+ * 2008 and 2009 by the Free Software Foundation.                    *\n\
+ *                                                                   *\n\
+ * This program is free software; you can redistribute it and/or     *\n\
+ * modify it under the terms of the GNU General Public License as    *\n\
+ * published by the Free Software Foundation - version 3 or          *\n\
+ * (at your option) any later version.                               *\n\
+ *                                                                   *\n\
+ * This program is distributed in the hope that it will be useful,   *\n\
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *\n\
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *\n\
+ * GNU General Public License in file COPYING for more details.      *\n\
+ *                                                                   *\n\
+ * You should have received a copy of the GNU General Public         *\n\
+ * License along with this program; if not, write to the Free        *\n\
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *\n\
+ * Boston, MA 02111, USA.                                            *\n\
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n\
+#include <stdio.h> /* for NULL */\n\
+#include \"liberty.h\"\n\
+#include \"patterns.h\"\n\n\
+"
+
+static int fatal_errors = 0;
+
+/* options */
+int verbose = 0;              /* -v */
+static int database_type = 0;  /* -p (default), -c, -f, -C, -D or -T */
+static int anchor = 0;                /* Whether both O and/or X may be anchors.
+                               * -b for both. -X for only X.
+                               */
+
+static int choose_best_anchor = 0;  /* -m */
+/* FIXME: `fixed anchor' option doesn't work properly yet.
+ *       Probably the first thing to implement is to add
+ *       checks for anchor validity.
+ */
+static int fixed_anchor = 0;        /* -a */
+
+static dfa_t dfa;
+static dfa_patterns dfa_pats;
+
+static int transformation_hint;
+static int labels_transformation = 0;
+
+
+struct hint_data {
+  char name[MAXNAME];
+  int transformation_hint;
+  struct hint_data *next;
+};
+
+static struct hint_data *first_hint = NULL;
+
+
+static void
+parse_transformations_file(FILE *file)
+{
+  struct hint_data **link = &first_hint;
+
+  while (!feof(file)) {
+    int n;
+    struct hint_data *hint = malloc(sizeof(*hint));
+
+    n = fscanf(file, "%s %d", hint->name, &hint->transformation_hint);
+    if (n == 2) {
+      hint->next = NULL;
+      *link = hint;
+      link = &hint->next;
+    }
+    else
+      free(hint);
+  }
+}
+
+
+static int
+find_transformation_hint(const char *pattern_name)
+{
+  struct hint_data *hint;
+
+  if (database_type == DB_DFA || database_type == OPTIMIZE_DFA) {
+    for (hint = first_hint; hint; hint = hint->next) {
+      if (!strcmp(hint->name, pattern_name))
+       return hint->transformation_hint;
+    }
+  }
+
+  return database_type == OPTIMIZE_DFA ? -1 : 0;
+}
+
+
+/**************************
+ *
+ * stuff to check the constraint diagram
+ *
+ **************************/
+
+#define CHECK_CHARS "xXoO"
+static void
+check_constraint_diagram(void)
+{
+  int i, j, ino = 0, iso = 0, jwo = 0;
+
+  int have_constraint = (pattern[patno].autohelper_flag & HAVE_CONSTRAINT);
+  if (0)
+    fprintf(stderr, "patno: %d\n", patno);
+    
+  if (where & NORTH_EDGE)
+    ino = 1;
+  if (where & SOUTH_EDGE)
+    iso = 1;
+  if (where & WEST_EDGE)
+    jwo = 1;
+    
+  if (verbose) {
+    for (i = ino; i <= maxi+ino+iso; i++)
+      fprintf(stderr, "%02d %s\n", i, diagram[i]);
+    for (i = ino; i <= maxi+ino+iso; i++)
+      fprintf(stderr, "%02d %s\n", i, constraint_diagram[i]);
+  }
+  
+  if (0)
+    fprintf(stderr, "have_constraint: %d\n", have_constraint);
+  if (have_constraint && el) {
+    for (i = ino; i <= maxi+ino; i++)
+      for (j = jwo; j <= maxj+jwo; j++) {
+       if (0)
+         fprintf(stderr, "%2d %2d %c %c\n", i, j, constraint_diagram[i][j], 
+                 diagram[i][j]);
+       if (strchr(CHECK_CHARS, constraint_diagram[i][j])
+           && constraint_diagram[i][j] != diagram[i][j]) {
+         fprintf(stderr, "%s(%d) : Error : "
+                  "xXoO not matched in constraint diagram of pattern %s\n",
+                 current_file, current_line_number, pattern_names[patno]);
+         fatal_errors++;
+       }
+    }
+  }
+}
+
+/**************************
+ *
+ * stuff to parse the input
+ *
+ **************************/
+
+/* reset state of all pattern variables */
+static void
+reset_pattern(void)
+{
+  int i, j;
+
+  maxi = 0;
+  maxj = 0;
+  ci = -1;
+  cj = -1;
+  where = 0;
+  el = 0;
+  num_stars = 0;
+  strcpy(helper_fn_names[patno], "NULL");
+  for (i = 0; i < 256; i++)
+    label_coords[i][0] = -1;
+  current_c_i = 0;
+  constraint[0] = 0;
+  action[0] = 0;
+  for (i = 0; i < MAX_BOARD+2; i++) {
+    for (j = 0; j < MAX_BOARD+3; j++) {
+      diagram[i][j] = '\0';
+      constraint_diagram[i][j] = '\0';
+    }
+  }
+  memset(&pattern[patno], 0, sizeof(struct pattern));
+}
+  
+
+/* This is called to compute the extents of the pattern, applying
+ * edge constraints as necessary.
+ */
+static void
+find_extents(void)
+{
+  /* When this is called, elements go from (mini,minj) inclusive to
+   * (maxi-1, maxj-1) [ie exclusive]. Make them inclusive.
+   * Ie maximum element lies on (maxi,maxj).
+   */
+  
+  --maxi;
+  --maxj;
+
+  /* apply edge constraints to the size of the pattern */
+
+  if (where & (NORTH_EDGE | SOUTH_EDGE | EAST_EDGE | WEST_EDGE))
+    ++pats_with_constraints;
+
+  if (verbose)
+    fprintf(stderr, "Pattern %s has constraints 0x%x\n",
+           pattern_names[patno], where);
+
+  pattern[patno].edge_constraints = where;
+
+
+  /* At this point, (mini,minj) -> (maxi,maxj) contain
+   * the extent of the pattern, relative to top-left
+   * of pattern, rather than (ci,cj).
+   *
+   * But we store them in the output file relative
+   * to (ci,cj), so that we can transform the corners
+   * of the pattern like any other relative co-ord.
+   */
+
+  pattern[patno].mini = mini - ci;
+  pattern[patno].minj = minj - cj;
+  pattern[patno].maxi = maxi - ci;
+  pattern[patno].maxj = maxj - cj;
+}
+
+
+/*
+ * Here we build the dfa.
+ */
+
+static void
+write_to_dfa(int index)
+{
+  char str[DFA_MAX_ORDER + 1];
+  char strrot[DFA_MAX_ORDER + 1];
+
+  assert(ci != -1 && cj != -1);
+#if 0
+  pattern[index].patn = elements; /* a little modification : keep in touch! */
+#endif
+  pattern[index].name = &(pattern_names[index][0]);
+
+  /* First we create the string from the actual pattern. */
+  pattern_2_string(pattern + index, elements, str, ci, cj);
+
+  if (verbose)
+    fprintf(stderr, "Add   :%s\n", pattern[index].name);
+
+  if (database_type == DB_DFA) {
+    float ratio;
+
+    dfa_rotate_string(strrot, str, transformation_hint);
+    ratio = ((dfa_add_string(&dfa, strrot, index, transformation_hint) - 1.0)
+            * 100);
+
+    /* Complain when there is more than 10% of increase */
+    if (dfa_size(&dfa) > 100 && ratio > 10.0) {
+      fprintf(stderr, "Pattern %s => %3.1f%% increase: ",
+             pattern[index].name, ratio);
+      fprintf(stderr, "another orientation may save memory.\n");
+    }
+    if (dfa_verbose > 2)
+      dump_dfa(stderr, &dfa);
+
+    labels_transformation = transformation_hint;
+  }
+  else {
+    int ll;
+    int rot_start = 0;
+    int rot_stop = pattern[index].trfno;
+
+    assert(database_type == OPTIMIZE_DFA);
+
+    if (rot_stop == 5) {
+      rot_start = 2;
+      rot_stop = 6;
+    }
+
+    for (ll = rot_start; ll < rot_stop; ll++) {
+      dfa_rotate_string(strrot, str, ll);
+      dfa_patterns_add_pattern(&dfa_pats, strrot, index);
+    }
+
+    if (transformation_hint == -1)
+      dfa_patterns_select_shortest_variation(&dfa_pats);
+    else {
+      dfa_patterns_set_last_pattern_variation(&dfa_pats, (transformation_hint
+                                                         - rot_start));
+    }
+  }
+}
+
+
+/* For good performance, we want to reject patterns as quickly as
+ * possible. For each pattern, this combines 16 positions around
+ * the anchor stone into a 32-bit mask and value. In the matcher,
+ * the same 4x4 grid is precomputed, and then we can quickly
+ * test 16 board positions with one test.
+ * See matchpat.c for details of how this works - basically, if
+ * we AND what is on the board with the and_mask, and get the
+ * value in the val_mask, we have a match. This test can be
+ * applied in parallel : 2 bits per posn x 16 posns = 32 bits.
+ * "Don't care" has and_mask = val_mask = 0, which is handy !
+ */
+
+static void
+compute_grids(void)
+{
+#if GRID_OPT
+  /*                              element: .  X  O  x  o  ,  a  ! */
+  static const unsigned int and_mask[] = { 3, 3, 3, 1, 2, 3, 3, 3 };
+  static const unsigned int val_mask[] = { 0, 2, 1, 0, 0, 0, 0, 0 };
+
+  int ll;  /* iterate over rotations */
+  int k;   /* iterate over elements */
+
+  for (ll = 0; ll < 8; ++ll) {
+    for (k = 0; k < el; ++k) {
+      int ti, tj;
+      int di, dj;
+
+      TRANSFORM2(elements[k].x - ci, elements[k].y - cj, &ti, &tj,
+                transformation_hint);
+      TRANSFORM2(ti, tj, &di, &dj, ll);
+
+      ++di;
+      ++dj;
+      if (di >= 0 && di < 4 && dj >= 0 && dj < 4) {
+       pattern[patno].and_mask[ll]
+         |= and_mask[elements[k].att] << (30 - di * 8 - dj * 2);
+       pattern[patno].val_mask[ll]
+         |= val_mask[elements[k].att] << (30 - di * 8 - dj * 2);
+      }
+    }
+  }
+#endif
+}
+
+
+/* We've just read a line that looks like a pattern line. Now process it.
+ * If the pattern becomes larger than maximal supported board, the function
+ * returns zero, so that the pattern can be discarded.
+ */
+static int
+read_pattern_line(char *p)
+{
+  const char *char_offset;
+  char *pcopy = p;
+  int j;
+  int width;
+  int jwo = 0, jeo = 0;
+
+  if (where & SOUTH_EDGE)
+    /* something wrong here : pattern line after a SOUTH_EDGE constraint */
+    goto fatal;
+
+
+  if (*p == '+' || *p == '-') {
+    /* must be a north/south constraint */
+
+    if (maxi == 0)
+      where |= NORTH_EDGE;
+    else
+      where |= SOUTH_EDGE;
+
+    if (*p == '+') {
+      if (maxi > 0 && !(where & WEST_EDGE))
+       /* if this is end of pattern, must already know about west */
+       goto fatal;
+
+      where |= WEST_EDGE;
+      ++p;
+    }
+
+    /* count the number of -'s */
+    for (width = 0; *p == '-'; ++p, ++width)
+      ;
+
+    if (width == 0)
+      goto fatal;
+
+    if (*p == '+') {
+      if (maxi > 0 && !(where & EAST_EDGE))
+       /* if this is end of pattern, must already know about west */
+       goto fatal;
+      where |= EAST_EDGE;
+    }
+
+    if (maxi > 0 && width != maxj)
+      goto notrectangle;
+
+    return 1;
+  }
+
+  /* get here => its a real pattern entry, 
+   * rather than a north/south constraint 
+   */
+
+  /* we have a pattern line - add it into the current pattern */
+  if (*p == '|') {
+    /* if this is not the first line, or if there is a north
+     * constraint, we should already know about it
+     */
+    if (!(where & WEST_EDGE) && ((where & NORTH_EDGE) || maxi > 0))
+      /* we should already know about this constraint */
+      goto fatal;
+
+    where |= WEST_EDGE;
+    ++p;
+  }
+  else if (where & WEST_EDGE)
+    /* need a | if we are already constrained to west */
+    goto fatal;
+
+
+  for (j = 0; 
+       (char_offset = strchr(VALID_PATTERN_CHARS, *p)) != NULL;
+       ++j, ++p) {
+
+    /* char_offset is a pointer within the VALID_PATTERN_CHARS string.
+     * so  (char-VALID_PATTERN_CHARS) is the att (0 to 11) to write to the
+     * pattern element
+     */
+
+    /* one of ATT_* - see above */
+    int off = char_offset - VALID_PATTERN_CHARS;
+
+    if (off == ATT_wild)
+      continue;  /* boring - pad character */
+
+    if (off == ATT_a) /* this were used by halfeye patterns */
+      goto fatal;
+
+    if (off == ATT_star) {
+      /* '*' */
+      movei = maxi;
+      movej = j;
+      ++num_stars;
+      off = ATT_dot;  /* add a '.' to the pattern instead */
+    }
+
+    if (off == ATT_Q) {
+      off = ATT_O;
+      ci = maxi;
+      cj = j;
+      pattern[patno].anchored_at_X = (off == ATT_X) ? 3 : 0;
+      /*FIXME: Make sure O is valid anchor*/
+    }
+
+    if (off == ATT_Y) {
+      off = ATT_X;
+      ci = maxi;
+      cj = j;
+      pattern[patno].anchored_at_X = (off == ATT_X) ? 3 : 0;
+      /*FIXME: Make sure X is valid anchor*/
+    }
+
+    assert(off <= ATT_not);
+
+       
+    if ((ci == -1) && (off < 3) && ((off & anchor) != 0)
+       && !fixed_anchor) {
+      /* Use this position as the pattern origin. */
+      ci = maxi;
+      cj = j;
+      pattern[patno].anchored_at_X = (off == ATT_X) ? 3 : 0;
+    }
+    
+    /* Range checking. */
+    if (el >= (int) (sizeof(elements) / sizeof(elements[0])))
+      return 0;
+    
+    elements[el].x = maxi;
+    elements[el].y = j;
+    elements[el].att = off;  /* '*' mapped to '.' and 'Q' to 'O' above */
+    
+    ++el;
+  }
+
+  if (*p == '|') {
+
+    /* if this is not the first line, or if there is a north
+     * constraint, we should already know about it
+     */
+    if (!(where & EAST_EDGE) && ((where & NORTH_EDGE) || maxi > 0))
+      goto fatal;  /* we should already know about this constraint */
+
+    where |= EAST_EDGE;
+
+  }
+  else if (where & EAST_EDGE)
+    goto fatal;  /* need a | if we are already constrained to east */
+
+
+  if (maxi > 0 && j != maxj)
+    goto notrectangle;
+
+  if (j > maxj)
+    maxj = j;
+
+
+  if (where & WEST_EDGE)
+    jwo = 1;
+  if (where & EAST_EDGE)
+    jeo = 1;
+  if (maxi <= MAX_BOARD)
+    strncpy(diagram[maxi], pcopy, maxj + jwo + jeo);
+  maxi++;
+
+  return maxi <= MAX_BOARD && maxj <= MAX_BOARD;
+
+fatal:
+ fprintf(stderr, "%s(%d) : error : Illegal pattern %s\n", 
+         current_file, current_line_number, pattern_names[patno]);
+ fatal_errors = 1;
+ return 0;
+
+notrectangle:
+ fprintf(stderr, "%s(%d) : error : Pattern %s not rectangular\n", 
+        current_file, current_line_number, pattern_names[patno]);
+ fatal_errors++;
+ return 0;
+}
+
+
+/*
+ * We've just read a line that looks like a constraint pattern line.
+ * Now process it.
+ */
+
+static void
+read_constraint_diagram_line(char *p)
+{
+  int j;
+  int jwo = 0, jeo = 0;
+  const char *pcopy = p;
+
+  /* North or south boundary, no letter to be found. */
+  if (*p == '+' || *p == '-')
+    return;
+
+  /* Skip west boundary. */
+  if (*p == '|')
+    p++;
+  
+  for (j = 0; 
+       strchr(VALID_PATTERN_CHARS, *p) || strchr(VALID_CONSTRAINT_LABELS, *p);
+       ++j, ++p) {
+    if (strchr(VALID_CONSTRAINT_LABELS, *p) 
+       && label_coords[(int)*p][0] == -1) {
+
+      /* New constraint letter */
+      label_coords[(int)*p][0] = current_c_i;
+      label_coords[(int)*p][1] = j;
+    }
+  }
+
+  /* Now j holds the width of this constraint diagram line. Require
+   * this to match the main diagram width stored in maxj. However,
+   * maxj was modified by find_extents() so we have to compensate for
+   * this.
+   */
+  if (j != maxj + 1 && !discard_pattern) {
+    fprintf(stderr, "%s(%d) : error : Mismatching width of constraint line in pattern %s\n", 
+           current_file, current_line_number, pattern_names[patno]);
+    fatal_errors++;
+    return;
+  }
+
+  if (where & WEST_EDGE)
+    jwo = 1;
+  if (where & EAST_EDGE)
+    jeo = 1;
+  if (el)
+    strncpy(constraint_diagram[current_c_i], pcopy, maxj+jwo+jeo+1);
+  current_c_i++;
+
+  return;
+}
+
+/* Check that the constraint diagram had the same number of rows as
+ * the main diagram.
+ */
+static void
+check_constraint_diagram_size(void)
+{
+  if (current_c_i != maxi + 1 && !discard_pattern) {
+    fprintf(stderr, "%s(%d) : error : Mismatching height of constraint diagram in pattern %s\n", 
+           current_file, current_line_number, pattern_names[patno]);
+    fatal_errors++;
+  }
+}
+
+
+static void
+convert_attribute_labels_to_offsets(void)
+{
+  struct pattern_attribute *attribute;
+
+  if (patno < 0 || !pattern[patno].attributes)
+    return;
+
+  for (attribute = pattern[patno].attributes;
+       attribute->type != LAST_ATTRIBUTE;
+       attribute++) {
+    if (attribute->type >= FIRST_OFFSET_ATTRIBUTE) {
+      int label = attribute->offset;
+      int x;
+      int y;
+
+      if (label_coords[label][0] == -1) {
+       fprintf(stderr,
+               "%s(%d) : error : Pattern attribute uses label '%c' that wasn't specified in the diagram\n", 
+               current_file, current_line_number, label);
+       fatal_errors++;
+       return;
+      }
+
+      TRANSFORM2(label_coords[label][0] - ci - movei,
+                label_coords[label][1] - cj - movej, &x, &y,
+                labels_transformation);
+      attribute->offset = OFFSET(x, y);
+    }
+  }
+}
+
+
+/* On reading a line starting ':', finish up and write
+ * out the current pattern 
+ */
+static void
+finish_pattern(char *line)
+{
+  int x;
+  int y;
+
+  /* end of pattern layout */
+  char symmetry;               /* the symmetry character */
+  
+  mini = minj = 0; /* initially : can change with edge-constraints */
+
+  if (num_stars > 1 || (database_type != DB_CONNECTIONS && num_stars == 0)) {
+    fprintf(stderr, "%s(%d) : error : No or too many *'s in pattern %s\n",
+           current_file, current_line_number, pattern_names[patno]);
+    fatal_errors = 1;
+  }
+
+  if (database_type == DB_CORNER) {
+    ci = 0;
+    cj = 0;
+  }
+  else if (choose_best_anchor && !discard_pattern) { 
+
+    /* Try to find a better anchor if
+     * the -m option is set.
+     */
+    int mi, mj; /* middle */
+    int d, min_d = 36100;
+    int k, min_k = -1;
+      
+    /* We seek the element of suitable value minimizing
+     * the distance to the middle.
+     */
+    mi = (maxi - 1) * 50;
+    mj = (maxj - 1) * 50 - 1;
+    for (k = 0; k != el; k++)
+      if (elements[k].att < 3 && (elements[k].att & anchor) != 0) {
+       d = gg_abs(100 * elements[k].x - mi)
+         + gg_abs(100 * elements[k].y - mj);
+       if (d < min_d) {
+         min_k = k;
+         min_d = d;
+       }
+      }
+    assert(min_k != -1);
+    ci = elements[min_k].x;
+    cj = elements[min_k].y;
+    pattern[patno].anchored_at_X = (elements[min_k].att == ATT_X) ? 3 : 0;
+    
+  }
+  else if ((ci == -1 || cj == -1) && !discard_pattern) {
+    fprintf(stderr, "%s(%d) : No origin for pattern %s\n", 
+           current_file, current_line_number, pattern_names[patno]);
+    fatal_errors = 1;
+    ci = 0;
+    cj = 0;
+  }
+
+  /* translate posn of * (or Q) to relative co-ords
+   */
+
+  if (num_stars == 1) {
+    movei -= ci;
+    movej -= cj;
+  }
+  else if (num_stars == 0) {
+    movei = ci;
+    movej = cj;
+  }
+
+  TRANSFORM2(movei, movej, &x, &y, transformation_hint);
+  pattern[patno].move_offset = OFFSET(x, y);
+
+  find_extents();
+
+  compute_grids();
+
+  pattern[patno].patlen = el;
+
+  /* Now parse the line. Only the symmetry character and the class
+   * field are mandatory. The compiler guarantees that all the fields
+   * are already initialized to 0.
+   */
+
+  {
+    int s;
+    char class[80];
+    char entry[80];
+    char *p = line;
+    char *p2;
+    int n;
+    
+    class[0] = 0;  /* in case sscanf doesn't get that far */
+    s = sscanf(p, ":%c,%[^,]%n", &symmetry, class, &n);
+    p += n;
+    
+    if (s < 2) {
+      fprintf(stderr, ": line must contain symmetry character and class\n");
+      fatal_errors++;
+    }
+
+    pattern[patno].attributes = NULL;
+    while (sscanf(p, "%*[, ]%[^,]%n", entry, &n) > 0) {
+      const char *paren;
+      p += n;
+
+      paren = strchr(entry, '(');
+      if (paren) {
+       struct attribute_description *description = NULL;
+
+       if (attribute_map) {
+         for (description = attribute_map; description->input_name;
+              description++) {
+           if (strncmp(entry, description->input_name, paren - entry) == 0) {
+             if (description->type != IN_PATTERN_VALUE) {
+               if (!pattern[patno].attributes)
+                 pattern[patno].attributes = attributes + num_attributes;
+
+               attributes[num_attributes].type = description->type;
+               if (description->type >= FIRST_OFFSET_ATTRIBUTE) {
+                 /* We store the label for now, since we don't know
+                  * its offset without having seen the constraint
+                  * diagram.
+                  */
+                 if (*(paren + 1) != '*'
+                     && !strchr(VALID_CONSTRAINT_LABELS, *(paren + 1))) {
+                   fprintf(stderr, "%s(%d) : error : '%c' is not a valid label.\n",
+                           current_file, current_line_number, *(paren + 1));
+                   fatal_errors++;
+                   continue;
+                 }
+
+                 attributes[num_attributes].offset = *(paren + 1);
+               }
+               else
+                 sscanf(paren + 1, "%f", &attributes[num_attributes].value);
+
+               num_attributes++;
+             }
+             else
+               sscanf(paren + 1, "%f", &pattern[patno].value);
+
+             if (!strchr(paren + 1, ')')) {
+               fprintf(stderr, "%s(%d) : error : ')' missed\n",
+                       current_file, current_line_number);
+               fatal_errors++;
+             }
+
+             break;
+           }
+         }
+       }
+
+       if (attribute_map == NULL || description->input_name == NULL) {
+         fprintf(stderr, "%s(%d) : error : Unknown value field: %s\n",
+                 current_file, current_line_number, entry);
+         fatal_errors++;
+         break;
+       }
+      }
+      else {
+       strncpy(helper_fn_names[patno], entry, 79);
+       break;
+      }
+    }
+
+    if (pattern[patno].attributes != NULL) {
+      attributes[num_attributes].type = LAST_ATTRIBUTE;
+      attributes[num_attributes].value = 0.0;
+      num_attributes++;
+    }
+
+    for (p2 = class; *p2; p2++) {
+      switch (*p2) {
+       case 's': pattern[patno].class |= CLASS_s; break;
+       case 'O': pattern[patno].class |= CLASS_O; break;
+       case 'o': pattern[patno].class |= CLASS_o; break;
+       case 'X': pattern[patno].class |= CLASS_X; break;
+       case 'x': pattern[patno].class |= CLASS_x; break;
+       case 'D': pattern[patno].class |= CLASS_D; break;
+       case 'C': pattern[patno].class |= CLASS_C; break;
+       case 'c': pattern[patno].class |= CLASS_c; break;
+       case 'n': pattern[patno].class |= CLASS_n; break;
+       case 'B': pattern[patno].class |= CLASS_B; break;
+       case 'A': pattern[patno].class |= CLASS_A; break;
+       case 'b': pattern[patno].class |= CLASS_b; break;
+       case 'e': pattern[patno].class |= CLASS_e; break;
+       case 'E': pattern[patno].class |= CLASS_E; break;
+       case 'a': pattern[patno].class |= CLASS_a; break;
+       case 'd': pattern[patno].class |= CLASS_d; break;
+       case 'I': pattern[patno].class |= CLASS_I; break;
+       case 'J': pattern[patno].class |= CLASS_J; break;
+       case 'j': pattern[patno].class |= CLASS_j; break;
+       case 't': pattern[patno].class |= CLASS_t; break;
+       case 'T': pattern[patno].class |= CLASS_T; break;
+       case 'U': pattern[patno].class |= CLASS_U; break;
+       case 'W': pattern[patno].class |= CLASS_W; break;
+       case 'F': pattern[patno].class |= CLASS_F; break;
+       case 'N': pattern[patno].class |= CLASS_N; break;
+       case 'Y': pattern[patno].class |= CLASS_Y; break;
+       case '-': break;
+       default:
+         if (!isgraph((int) *p2))
+           break;
+         fprintf(stderr,
+                 "%s(%d) : error : Unknown classification letter %c. (pattern %s).\n", 
+                 current_file, current_line_number, *p2,
+                 pattern_names[patno]);
+         fatal_errors++;
+         break;
+      }
+    }
+  }
+
+      
+  /* Now get the symmetry. There are extra checks we can make to do with
+   * square-ness and edges. We do this before we work out the edge constraints,
+   * since that mangles the size info.
+   */
+  
+  switch (symmetry) {
+  case '+' :
+    if (where & (NORTH_EDGE | EAST_EDGE | SOUTH_EDGE | WEST_EDGE))
+      fprintf(stderr,
+             "%s(%d) : Warning : symmetry inconsistent with edge constraints (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+    pattern[patno].trfno = 2;
+    break;
+
+  case 'X' :
+    if (where & (NORTH_EDGE | EAST_EDGE | SOUTH_EDGE | WEST_EDGE))
+      fprintf(stderr,
+             "%s(%d) : Warning : X symmetry inconsistent with edge constraints (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+    if (maxi != maxj)
+      fprintf(stderr,
+             "%s(%d) : Warning : X symmetry requires a square pattern (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+    pattern[patno].trfno = 2;
+    break;
+
+  case '-' :
+    if (where & (NORTH_EDGE | SOUTH_EDGE))
+      fprintf(stderr,
+             "%s(%d) : Warning : symmetry inconsistent with edge constraints (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+    pattern[patno].trfno = 4;
+    break;
+
+  case '|' :
+    if (where & (EAST_EDGE | WEST_EDGE))
+      fprintf(stderr,
+             "%s(%d) : Warning : symmetry inconsistent with edge constraints (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+    pattern[patno].trfno = 4;
+    break;
+
+  case '\\' :
+  case '/' :
+    /* FIXME: Can't be bothered putting in the edge tests.
+    *         (What does this mean?)
+    */
+    if (maxi != maxj)
+      fprintf(stderr,
+             "%s(%d) : Warning : \\ or / symmetry requires a square pattern (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+
+    pattern[patno].trfno = 4;
+    break;
+
+  case 'O' :
+    if (where & (NORTH_EDGE | EAST_EDGE | SOUTH_EDGE | WEST_EDGE))
+      fprintf(stderr,
+             "%s(%d) : Warning : symmetry inconsistent with edge constraints (pattern %s)\n",
+             current_file, current_line_number, pattern_names[patno]);
+    pattern[patno].trfno = 5;  /* Ugly special convention. */
+    break;
+
+  default:
+    fprintf(stderr,
+           "%s(%d) : Warning : symmetry character '%c' not implemented - using '8' (pattern %s)\n",
+           current_file, current_line_number, symmetry, pattern_names[patno]);
+    /* FALLTHROUGH */
+  case '8' :
+    pattern[patno].trfno = 8;
+    break;
+  }
+}
+
+
+static void
+read_constraint_line(char *line)
+{
+  /* Avoid buffer overrun. */
+  assert(strlen(constraint) + strlen(line) < MAXCONSTRAINT);
+
+  /* Append the new line. */
+  strcat(constraint, line);
+
+  pattern[patno].autohelper_flag |= HAVE_CONSTRAINT;
+}
+
+
+static void
+read_action_line(char *line)
+{
+  /* Avoid buffer overrun. */
+  assert(strlen(action) + strlen(line) < MAXACTION);
+
+  /* Append the new line. */
+  strcat(action, line);
+
+  pattern[patno].autohelper_flag |= HAVE_ACTION;
+}
+
+
+static void
+generate_autohelper_code(int funcno, int number_of_params, int *labels)
+{
+  int i;
+  char varnames[MAXPARAMS][8];
+  char pattern_id[MAXLINE];
+
+  for (i = 0; i < number_of_params; i++) {
+    if (labels[i] == (int) '*')
+      sprintf(varnames[i], "move");
+    /* The special label '?' represents a tenuki. We replace this
+     * with NO_MOVE value.
+     */
+    else if (labels[i] == (int) '?')
+      sprintf(varnames[i], "NO_MOVE");
+    else
+      sprintf(varnames[i], "%c", labels[i]);
+  }
+
+  switch (autohelper_functions[funcno].type) {
+  case 0:
+    /* A common case. Just use the labels as parameters. */
+    switch (number_of_params) {
+    case 0:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code);
+      break;
+    case 1:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         varnames[0]);
+      break;
+    case 2:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         varnames[0], varnames[1]);
+      break;
+    case 3:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         varnames[0], varnames[1], varnames[2]);
+      break;
+    case 4:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         varnames[0], varnames[1], varnames[2],
+                         varnames[3]);
+      break;
+    default:
+      fprintf(stderr, "%s(%d) : error : unknown number of parameters (pattern %s)",
+             current_file, current_line_number, pattern_names[patno]);
+      fatal_errors++;
+    }
+    break;
+
+  case 1:
+    /* This is a very special case where there is assumed to be a
+     * variable number of parameters and these constitute a series of
+     * moves to make followed by a final attack or defense test.
+     */
+    if (number_of_params < autohelper_functions[funcno].params) {
+      fprintf(stderr, "%s(%d) : error : too few parameters (pattern %s)",
+             current_file, current_line_number, pattern_names[patno]);
+      fatal_errors++;
+      return;
+    }
+
+    code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+               number_of_params - autohelper_functions[funcno].params);
+
+    for (i = 0; i < number_of_params; i++)
+       code_pos += sprintf(code_pos, ", %s", varnames[i]);
+
+    *code_pos++ = ')'; /* Close parenthesis. */
+    break;
+
+  default: /* 2 */
+    /* A very special case. We add the address of the current pattern
+     * before the actual parameters. So far, used only by `value'.
+     */
+    sprintf(pattern_id, "(%s + %d)", prefix, patno);
+
+    switch (number_of_params) {
+    case 0:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         pattern_id);
+      break;
+    case 1:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         pattern_id, varnames[0]);
+      break;
+    case 2:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         pattern_id, varnames[0], varnames[1]);
+      break;
+    case 3:
+      code_pos += sprintf(code_pos, autohelper_functions[funcno].code,
+                         pattern_id, varnames[0], varnames[1], varnames[2]);
+      break;
+    default:
+      fprintf(stderr, "%s(%d) : error : unknown number of parameters (pattern %s)",
+             current_file, current_line_number, pattern_names[patno]);
+      fatal_errors++;
+    }
+  }
+}
+
+
+/* Parse the constraint and generate the corresponding helper code.
+ * We use a small state machine.
+ */
+static void
+parse_constraint_or_action(char *line, float *cost)
+{
+  int state = 0;
+  char *p;
+  int n = 0;
+  int label = 0;
+  int labels[MAXLABELS];
+  int N = sizeof(autohelper_functions)/sizeof(struct autohelper_func);
+  int number_of_params = 0;
+  float cost_factor = 1.0;
+
+  *cost = 0.0;
+  for (p = line; *p; p++)
+  {
+    switch (state) {
+      case 0: /* Looking for a token, echoing other characters. */
+       for (n = 0; n < N; n++) {
+         if (strncmp(p, autohelper_functions[n].name,
+                     strlen(autohelper_functions[n].name)) == 0) {
+           state = 1;
+           p += strlen(autohelper_functions[n].name)-1;
+           *cost += autohelper_functions[n].cost * cost_factor;
+           cost_factor *= 0.6;
+           break;
+         }
+       }
+       if (state == 0 && *p != '\n')
+         *(code_pos++) = *p;
+       break;
+       
+      case 1: /* Token found, now expect a '('. */
+       if (*p != '(') {
+         if (autohelper_functions[n].params == 0) {
+           /* We allow to omit parenthesis when using functions which
+            * have no parameters. In any case, you may still place them,
+            * but having to write `value() = 50' is disgusting.
+            */
+           generate_autohelper_code(n, 0, NULL);
+           p--;
+           state = 0;
+           break;
+         }
+         fprintf(stderr,
+                 "%s(%d) : error : Syntax error in constraint or action, '(' expected (pattern %s, autohelper %s).\n", 
+                 current_file, current_line_number, pattern_names[patno],
+                 autohelper_functions[n].name);
+         fatal_errors++;
+         return;
+       }
+       else {
+         assert(autohelper_functions[n].params <= MAXPARAMS);
+         number_of_params = 0;
+         if (autohelper_functions[n].params != 0
+             || autohelper_functions[n].type == 1)
+           state = 2;
+         else
+           state = 3;
+       }
+       break;
+       
+      case 2: /* Time for a label. */
+       if ((*p != '*') && (*p != '?') && !strchr(VALID_CONSTRAINT_LABELS, *p)) {
+         if (strchr("XxOo", *p))
+           fprintf(stderr,
+                   "%s(%d) : error : '%c' is not allowed as a constraint label.\n",
+                   current_file, current_line_number, *p);
+         else
+           fprintf(stderr,
+                   "%s(%d) : error : Syntax error in constraint or action, label expected, found '%c'.\n", 
+                   current_file, current_line_number, *p);
+         fatal_errors++;
+         return;
+       }
+       else {
+         if ((*p == '?') && (number_of_params == 0)) {
+           fprintf(stderr,
+                   "mkpat: tenuki (?) cannot be the first label (pattern %s)\n", pattern_names[patno]);
+           return;
+         }
+
+         label = (int) *p;
+         /* The special label '?' represents a tenuki. */
+         if (*p != '*' && *p != '?' && label_coords[label][0] == -1) {
+           fprintf(stderr,
+                   "%s(%d) : error : The constraint or action uses a label (%c) that wasn't specified in the diagram (pattern %s).\n", 
+                   current_file, current_line_number, label, pattern_names[patno]);
+           fatal_errors++;
+           return;
+         }
+         labels[number_of_params] = label;
+         number_of_params++;
+         state = 3;
+       }
+       break;
+
+      case 3: /* A ',' or a ')'. */
+       if (*p == ',') {
+         if (autohelper_functions[n].type != 1
+             && number_of_params == autohelper_functions[n].params) {
+           fprintf(stderr,
+                   "%s(%d) : error : Syntax error in constraint or action, ')' expected (pattern %s).\n",
+                   current_file, current_line_number, pattern_names[patno]);
+           return;
+         }
+         if (number_of_params == MAXPARAMS) {
+           fprintf(stderr,
+                   "Error in constraint or action, too many parameters. (pattern %s).\n", 
+                   pattern_names[patno]);
+           return;
+         }
+         state = 2;
+         break;
+       }
+       else if (*p != ')') {
+         fprintf(stderr, 
+                 "%s(%d) : error : Syntax error in constraint or action, ',' or ')' expected (pattern %s).\n", 
+                 current_file, current_line_number, pattern_names[patno]);
+         return;
+       }
+       else { /* a closing parenthesis */
+         if ((autohelper_functions[n].type != 1)
+             && (number_of_params < autohelper_functions[n].params)) {
+           fprintf(stderr,
+                   "%s(%d) : error : Syntax error in constraint or action, %s() requires %d parameters.\n",
+                   current_file, current_line_number, autohelper_functions[n].name, autohelper_functions[n].params);
+           fatal_errors++;
+           return;
+         }
+         generate_autohelper_code(n, number_of_params, labels);
+         state = 0;
+       }
+       break;
+       
+      default:
+       fprintf(stderr,
+               "%s(%d) : error : Internal error in parse_constraint_or_action(), unknown state.\n",
+               current_file, current_line_number);
+        fatal_errors++;
+       return;
+              
+    }
+  }
+}
+
+/* Finish up a constraint and/or action and generate the automatic
+ * helper code. The constraint text is in the global variable
+ * constraint. */
+
+static void
+finish_constraint_and_action(void)
+{
+  unsigned int i;
+  float cost;
+  int have_constraint = (pattern[patno].autohelper_flag & HAVE_CONSTRAINT);
+  int have_action = (pattern[patno].autohelper_flag & HAVE_ACTION);
+  int no_labels = 1;
+
+  /* Mark that this pattern has an autohelper. */
+  pattern[patno].autohelper = dummyhelper;
+  
+  /* Generate autohelper function declaration. */
+  code_pos += sprintf(code_pos, 
+                     "static int\nautohelper%s%d(int trans, int move, int color, int action)\n{\n  int",
+                     prefix, patno);
+
+  /* Generate variable declarations. */
+  for (i = 0; i < sizeof(VALID_CONSTRAINT_LABELS); i++) {
+    int c = (int) VALID_CONSTRAINT_LABELS[i];
+
+    if (label_coords[c][0] != -1)
+      code_pos += sprintf(code_pos, " %c,", c);
+  }
+
+  /* Replace the last ',' with ';' */
+  if (*(code_pos-1) == ',')
+    *(code_pos-1) = ';';
+  else {
+    code_pos -= 3; /* no variable, erase "int" */
+    code_pos += sprintf(code_pos, "UNUSED(trans);");
+  }
+
+  /* Include UNUSED statements for two parameters */
+  code_pos += sprintf(code_pos, "\n  UNUSED(color);\n");
+  if (!have_constraint || !have_action)
+    code_pos += sprintf(code_pos, "  UNUSED(action);\n");
+  
+  /* Generate coordinate transformations. */
+  for (i = 0; i < sizeof(VALID_CONSTRAINT_LABELS); i++) {
+    int c = (int) VALID_CONSTRAINT_LABELS[i];
+
+    if (label_coords[c][0] != -1) {
+      int x;
+      int y;
+
+      TRANSFORM2(label_coords[c][0] - ci - movei,
+                label_coords[c][1] - cj - movej, &x, &y,
+                labels_transformation);
+      code_pos += sprintf(code_pos,
+                         "\n  %c = AFFINE_TRANSFORM(%d, trans, move);",
+                         c, OFFSET(x, y));
+      no_labels = 0;
+    }
+  }
+
+  /* move might be unused. Add an UNUSED statement to avoid warnings. */
+  if (no_labels)
+    code_pos += sprintf(code_pos, "\n  UNUSED(move);");
+
+  code_pos += sprintf(code_pos, "\n\n");
+  if (have_constraint && have_action)
+    code_pos += sprintf(code_pos, "  if (!action)\n  ");
+  if (have_constraint) {
+    code_pos += sprintf(code_pos, "  return ");
+    parse_constraint_or_action(constraint, &cost);
+    pattern[patno].constraint_cost = cost;
+    code_pos += sprintf(code_pos, ";\n");
+  }
+  if (have_action) {
+    code_pos += sprintf(code_pos, "  ");
+    parse_constraint_or_action(action, &cost);
+    code_pos += sprintf(code_pos, ";\n");
+    code_pos += sprintf(code_pos, "\n  return 0;\n");
+  }
+  code_pos += sprintf(code_pos, "}\n\n");
+  
+  /* Check that we have not overrun our buffer. That would be really bad. */
+  assert(code_pos <= autohelper_code + sizeof(autohelper_code));
+}
+
+
+
+/* ================================================================ */
+/*           stuff to write the elements of a pattern               */
+/* ================================================================ */
+
+/* callback function used to sort the elements in a pattern. 
+ * We want to sort the patterns by attribute.
+ *
+ *  RANK 01234567
+ *  ATT  57126340
+ *       ,!XOaxo.
+ * 
+ * so that cheaper / more specific tests are done early on
+ * For connections mode, the inhibition points (7)
+ * must be first.
+ */
+
+static int
+compare_elements(const void *a, const void *b)
+{
+  /* score for each attribute */
+  static int order[] = {7, 2, 3, 5, 6, 0, 4, 1};
+  
+  return  order[((const struct patval_b *)a)->att]
+    - order[((const struct patval_b *)b)->att];
+}
+
+struct element_node {
+  struct patval_b e;
+  struct element_node *next;
+};
+
+/* flush out the pattern stored in elements[]. Don't forget
+ * that elements[].{x,y} and min/max{i,j} are still relative
+ * to the top-left corner of the original ascii pattern, and
+ * not relative to the anchor stone ci,cj
+ */
+
+static void
+write_elements(FILE *outfile)
+{
+  int node;
+  int used_nodes = 0;
+
+  assert(ci != -1 && cj != -1);
+  assert(database_type == DB_DFA || transformation_hint == 0);
+
+  /* sort the elements so that least-likely elements are tested first. */
+  gg_sort(elements, el, sizeof(struct patval_b), compare_elements);
+
+  fprintf(outfile, "static struct patval %s%d[] = {", prefix, patno);
+
+  for (node = 0; node < el; node++) {
+    int x = elements[node].x;
+    int y = elements[node].y;
+    int att = elements[node].att;
+    int dx;
+    int dy;
+
+    assert(x >= mini && y >= minj);
+    if (!(x <= maxi && y <= maxj)) {
+      fprintf(stderr, 
+             "%s(%d) : error : Maximum number of elements exceeded in %s.\n",
+             current_file, current_line_number, prefix);
+      fatal_errors++;
+    }
+
+    /* Check if this element is not needed for goal checking and by
+     * callback function. Also, check that pattern class doesn't
+     * require dragon status checking on it.
+     */
+    if ((fixed_anchor || nongoal[att]) && callback_unneeded[att]
+       && (((pattern[patno].class & (CLASS_X | CLASS_x)) == 0)
+           || (att != ATT_X && att != ATT_x))
+       && (((pattern[patno].class & (CLASS_O | CLASS_o)) == 0)
+           || (att != ATT_O && att != ATT_o))) {
+      /* Now check that pattern matcher won't need the element for
+       * matching itself.
+       */
+
+#if GRID_OPT == 1
+      /* If we do grid optimization, we can avoid matching 9 pattern elements
+       * around its anchor (the 9 elements are the intersection of 16 grid
+       * elements for all possible transformations).
+       */
+      if ((database_type == DB_GENERAL || database_type == DB_CONNECTIONS)
+         && ci-1 <= x && x <= ci+1 && cj-1 <= y && y <= cj+1)
+       continue;
+#endif /* GRID_OPT == 1 */
+
+      /* DFA pattern matcher doesn't itself need these elements at all. But
+       * they might be needed for goal checking or by callback function, so
+       * we check it before discarding an element.
+       */
+      if (database_type == DB_DFA)
+       continue;
+    } /* If the element is discardable. */
+
+    if (used_nodes)
+      fprintf(outfile, ",");
+    fprintf(outfile, used_nodes % 4 ? "\t" : "\n  ");
+    used_nodes++;
+
+    TRANSFORM2(x - ci, y - cj, &dx, &dy, transformation_hint);
+    fprintf(outfile, "{%d,%d}", OFFSET(dx, dy), att);
+  }
+
+  /* This may happen if we have discarded all
+   * the elements as unneeded by the matcher.
+   */
+  if (!used_nodes)
+    fprintf(outfile, "{0,-1}}; /* Dummy element, not used. */\n\n");
+  else
+    fprintf(outfile, "\n};\n\n");
+
+  pattern[patno].patlen = used_nodes;
+}
+
+
+/* ================================================================ */
+/*                 Corner database creation stuff                  */
+/* ================================================================ */
+
+#define CORNER_DB_SIZE(patterns, variations)\
+  ((int) ((patterns * sizeof(struct corner_pattern)\
+   + variations * sizeof(struct corner_variation)) / 1024))
+
+static struct corner_variation_b corner_root;
+static int second_corner_offset[MAXPATNO];
+
+static int total_variations = 0;
+static int variations_written = 0;
+
+static int corner_max_width = 0;
+static int corner_max_height = 0;
+
+/* This structure is used by corner_add_pattern() */
+struct corner_element {
+  int x;
+  int y;
+  int color;
+};
+
+
+/* Initialize corner variation tree. */
+static void
+corner_init(void)
+{
+  corner_root.num_variations = 0;
+  corner_root.child = NULL;
+}
+
+
+/* corner_best_element() chooses the best element from supplied. The best
+ * element is always selected from those which don't have other elements
+ * closer to the corner
+ *
+ * +------     E.g. elements A and B are candidates to become the best
+ * |......     element, while C and D are not (A is closer to the corner
+ * |..A...     than both C and D). Note that A and B are at "incomparable"
+ * |..C.D.     distances from the corner, since their coordinates are in
+ * |.B....     opposite relations.
+ * |......
+ *
+ * If there are existing variations among candidates, all other candidates
+ * are automatically rejected. Once we have a set of candidates, we select
+ * the best candidate as the one which has the best parameters (in order
+ * of decreasing importance):
+ *     1) maximal "corner area" (see function code);
+ *     2) minimal distance to the corner bisector;
+ *     3) those which x coordinate is smaller than y one
+ *
+ * The purpose of this function is to reduce size of variation tree (by
+ * selecting similar variations) and allow rejecting variations as
+ * quickly as possible (based on num_stones field value). The latter
+ * can still be improved if a need arises.
+ */
+static int
+corner_best_element(struct corner_element *el, int n,
+                   struct corner_variation_b *variations, int color)
+{
+  int k;
+  int i;
+  int best = 0;
+  int best_value = 0;
+
+  int candidate[MAX_BOARD * MAX_BOARD];
+  int candidates = 0;
+  int existing_variation[MAX_BOARD * MAX_BOARD];
+  int have_existing_variation = 0;
+
+  /* Find candidates and mark those which correspond to existing variations. */
+  for (k = 0; k < n; k++) {
+    for (i = 0; i < n; i++) {
+      if (i == k)
+       continue;
+
+      if (el[k].x >= el[i].x && el[k].y >= el[i].y)
+        break;
+    }
+
+    if (i == n) {
+      struct corner_variation_b *v;
+      int move_offset = OFFSET(el[k].x, el[k].y);
+      int xor_att = (el[k].color == color ? ATT_O ^ ATT_O : ATT_O ^ ATT_X);
+
+      candidate[candidates] = k;
+      existing_variation[candidates] = 0;
+
+      for (v = variations; v != NULL; v = v->next) {
+       if (v->move_offset == move_offset
+           && (v->xor_att == xor_att || color == 0)) {
+         existing_variation[candidates] = 1;
+         have_existing_variation = 1;
+         break;
+       }
+      }
+
+      candidates++;
+    }
+  }
+
+  /* Select the best move. */
+  for (k = 0; k < candidates; k++) {
+    int m = candidate[k];
+    int value = 2 * MAX_BOARD * (el[m].x + 1) * (el[m].y + 1)
+               - 2 * gg_abs(el[m].x - el[m].y) + (el[m].x < el[m].y ? 1 : 0);
+
+    if (existing_variation[k] == have_existing_variation
+       && value > best_value) {
+      best = k;
+      best_value = value;
+    }
+  }
+
+  return candidate[best];
+}
+
+
+/* Dynamically allocates a new variation structure. */
+static struct corner_variation_b *
+corner_variation_new(int move_offset, signed char xor_att,
+                    unsigned char num_stones)
+{
+  struct corner_variation_b *variation;
+   
+  variation = malloc(sizeof(*variation));
+
+  variation->move_offset = move_offset;
+  variation->xor_att = xor_att;
+  variation->num_stones = num_stones;
+  variation->num_variations = 0;
+  variation->next = NULL;
+  variation->child = NULL;
+  variation->child_num = -1;
+  variation->pattern_num = -1;
+
+  total_variations++;
+
+  return variation;
+}
+
+
+/* Follow a variation. If such a variation already exists, returns
+ * a pointer to it. Otherwise, creates and initializes a new one.
+ */
+static struct corner_variation_b *
+corner_follow_variation(struct corner_variation_b *variation,
+                       int offset, int color, unsigned char num_stones)
+{
+  signed char xor_att = color ? ATT_O ^ ATT_O : ATT_O ^ ATT_X;
+  struct corner_variation_b *subvariation = variation->child;
+  struct corner_variation_b **link = &(variation->child);
+
+  while (subvariation) {
+    if (subvariation->move_offset == offset
+       && subvariation->xor_att == xor_att) {
+      assert(subvariation->num_stones == num_stones);
+      return subvariation;
+    }
+
+    link = &(subvariation->next);
+    subvariation = subvariation->next;
+  }
+
+  variation->num_variations++;
+  *link = corner_variation_new(offset, xor_att, num_stones);
+
+  return *link;
+}
+
+
+/* Adds a pattern to corner database. */
+static void
+corner_add_pattern(void)
+{
+  int k;
+  struct corner_element stone[MAX_BOARD * MAX_BOARD];
+  int stones = 0;
+  int trans;
+  int corner_x = 0;
+  int corner_y = 0;
+  int color = 0;
+  int move_pos;
+  int move_x;
+  int move_y;
+  unsigned char num_stones;
+  struct corner_variation_b *variation = &corner_root;
+
+  /* Check if we have a corner pattern and select appropriate transformation. */
+  switch (where) {
+    case SOUTH_EDGE | WEST_EDGE: trans = 5; corner_x = maxi; break;
+    case WEST_EDGE | NORTH_EDGE: trans = 0; break;
+    case NORTH_EDGE | EAST_EDGE: trans = 7; corner_y = maxj; break;
+    case EAST_EDGE | SOUTH_EDGE:
+      trans = 2; corner_x = maxi; corner_y = maxj; break;
+
+    default:
+      fprintf(stderr, "%s(%d) : error : Illegal edge constraint in pattern %s\n",
+             current_file, current_line_number, pattern_names[patno]);
+      return;
+  }
+
+  move_pos = AFFINE_TRANSFORM(pattern[patno].move_offset
+             - OFFSET_DELTA(corner_x, corner_y), trans, POS(0, 0));
+  move_x = I(move_pos);
+  move_y = J(move_pos);
+
+  /* We need to transform labels as well. */
+  labels_transformation = trans;
+
+  /* Find all pattern elements. */
+  for (k = 0; k < el; k++) {
+    if (elements[k].att == ATT_X || elements[k].att == ATT_O) {
+      TRANSFORM2(elements[k].x, elements[k].y,
+                &stone[stones].x, &stone[stones].y, trans);
+      stone[stones].x += corner_x;
+      stone[stones].y += corner_y;
+      stone[stones].color = elements[k].att;
+      stones++;
+    }
+    else if (elements[k].att != ATT_dot) {
+      fprintf(stderr, "%s(%d) : error : Illegal element in pattern %s\n",
+             current_file, current_line_number, pattern_names[patno]);
+      return;
+    }
+  }
+
+  /* Follow variations. */
+  for (k = 0; k < stones; k++) {
+    int i;
+    int best;
+    struct corner_element stone_t;
+     
+    if (k > 0) {
+      best = k + corner_best_element(stone + k, stones - k, variation->child,
+                                    color);
+      stone_t = stone[k];
+      stone[k] = stone[best];
+      stone[best] = stone_t;
+    }
+    else {
+      best = corner_best_element(stone, stones, variation->child, color);
+      stone_t = stone[0];
+      stone[0] = stone[best];
+      stone[best] = stone_t;
+      color = stone[0].color;
+
+      if (stone[0].x > stone[0].y) {
+       /* To reduce number of variations, swap coordinates of all elements
+        * unless there is one with mirrored coordinates already.
+        */
+       int t;
+
+       for (i = 1; i < k; i++) {
+         if (stone[i].x == stone[0].y && stone[i].y == stone[0].x)
+           break;
+       }
+
+       if (i == k) {
+         t = maxi;
+         maxi = maxj;
+         maxj = t;
+
+         t = move_x;
+         move_x = move_y;
+         move_y = t;
+
+         for (i = 0; i < stones; i++) {
+           t = stone[i].x;
+           stone[i].x = stone[i].y;
+           stone[i].y = t;
+         }
+       }
+      }
+    }
+
+    num_stones = 1;
+    for (i = 0; i < k; i++) {
+      if (stone[i].x <= stone[k].x && stone[i].y <= stone[k].y)
+       num_stones++;
+    }
+
+    variation = corner_follow_variation(variation,
+               OFFSET(stone[k].x, stone[k].y), stone[k].color == color,
+               num_stones);
+  }
+
+  /* Finally, follow the pattern move as a variation. */
+  num_stones = 1;
+  for (k = 0; k < stones; k++) {
+    if (stone[k].x <= move_x && stone[k].y <= move_y)
+      num_stones++;
+  }
+
+  variation = corner_follow_variation(variation, OFFSET(move_x, move_y),
+                                     ATT_O == color, num_stones);
+  if (variation->pattern_num == -1) {
+    variation->pattern_num = patno;
+    second_corner_offset[patno] = OFFSET(maxi, maxj);
+    if (maxi > corner_max_height)
+      corner_max_height = maxi;
+    if (maxj > corner_max_width)
+      corner_max_width = maxj;
+  }
+  else {
+    fprintf(stderr, "%s(%d) : warning : duplicated patterns encountered (%s and %s)\n",
+           current_file, current_line_number,
+           pattern_names[variation->pattern_num], pattern_names[patno]);
+    discard_pattern = 1;
+  }
+}
+
+
+/* Enumerates all variations so that we know addresses of subvariations
+ * when it is time to write them into a .c file.
+ */
+static int
+corner_pack_variations(struct corner_variation_b *variation, int counter)
+{
+  counter++;
+  if (variation->next)
+    counter = corner_pack_variations(variation->next, counter);
+  if (variation->child) {
+    variation->child_num = counter;
+    counter = corner_pack_variations(variation->child, counter);
+  }
+
+  return counter;
+}
+
+
+/* Write variations recursively into an array. */
+static void
+corner_write_variations(struct corner_variation_b *variation, FILE *outfile)
+{                     
+  fprintf(outfile, "  {%d,%d,%d,%d,", variation->move_offset,
+         variation->xor_att, variation->num_stones,
+         variation->num_variations);
+  if (variation->child)
+    fprintf(outfile, "&%s_variations[%d],", prefix, variation->child_num);
+  else
+    fprintf(outfile, "NULL,");
+  if (variation->pattern_num != -1)
+    fprintf(outfile, "&%s[%d]", prefix, variation->pattern_num);
+  else
+    fprintf(outfile, "NULL");
+
+  variations_written++;
+  if (variations_written != total_variations)
+    fprintf(outfile, "},\n");
+  else
+    fprintf(outfile, "}\n};\n\n\n");
+
+  if (variation->next)
+    corner_write_variations(variation->next, outfile);
+  if (variation->child)
+    corner_write_variations(variation->child, outfile);
+}
+
+
+
+static void
+write_attributes(FILE *outfile)
+{
+  int k;
+
+  fprintf(outfile, "static struct pattern_attribute attributes[] = {\n");
+  fprintf(outfile, "#ifdef HAVE_TRANSPARENT_UNIONS\n");
+
+  for (k = 0; k < num_attributes; k++) {
+    fprintf(outfile, "  {%s,", attribute_name[attributes[k].type]);
+    if (attributes[k].type >= FIRST_OFFSET_ATTRIBUTE)
+      fprintf(outfile, "{.offset=%d}}", attributes[k].offset);
+    else
+      fprintf(outfile, "{.value=%f}}", attributes[k].value);
+
+    if (k != num_attributes - 1)
+      fprintf(outfile, ",\n");
+  }
+
+  fprintf(outfile, "\n#else\n");
+
+  for (k = 0; k < num_attributes; k++) {
+    fprintf(outfile, "  {%s,", attribute_name[attributes[k].type]);
+    if (attributes[k].type >= FIRST_OFFSET_ATTRIBUTE)
+      fprintf(outfile, "0.0,%d}", attributes[k].offset);
+    else
+      fprintf(outfile, "%f,0}", attributes[k].value);
+
+    if (k != num_attributes - 1)
+      fprintf(outfile, ",\n");
+  }
+
+  fprintf(outfile, "\n#endif\n};\n\n");
+}
+
+
+/* Sort and write out the patterns. */
+static void
+write_patterns(FILE *outfile)
+{
+  int j;
+
+  /* Write out the patterns. */
+  if (database_type == DB_CORNER)
+    fprintf(outfile, "static struct corner_pattern %s[] = {\n", prefix);
+  else
+    fprintf(outfile, "static struct pattern %s[] = {\n", prefix);
+
+  for (j = 0; j < patno; ++j) {
+    struct pattern *p = pattern + j;
+
+    if (database_type == DB_CORNER) {
+      fprintf(outfile, "  {%d,%d,0x%x,\"%s\",",
+             second_corner_offset[j], (p->trfno == 4),
+             p->class, pattern_names[j]);
+
+      if (attributes_needed) {
+       fprintf(outfile, "attributes+%d,",
+               (int) (p->attributes ? p->attributes - attributes : 0));
+      }
+      else
+       fprintf(outfile, "NULL,");
+
+      fprintf(outfile, "%d,", p->autohelper_flag);
+
+      if (p->autohelper)
+       fprintf(outfile, "autohelper%s%d}", prefix, j);
+      else
+       fprintf(outfile, "NULL}");
+
+      if (j != patno - 1)
+       fprintf(outfile, ",\n");
+      else
+       fprintf(outfile, "\n};\n\n\n");
+
+      continue;
+    }
+
+    /* p->min{i,j} and p->max{i,j} are the maximum extent of the elements,
+     * including any rows of '?' which do not feature in the elements list.
+     * ie they are the positions of the topleft and bottomright corners of
+     * the pattern, relative to the pattern origin. These just transform same
+     * as the elements.
+     */
+    fprintf(outfile, "  {%s%d,%d,%d, \"%s\",%d,%d,%d,%d,%d,%d,0x%x,%d",
+           prefix, j,
+           p->patlen,
+           p->trfno,
+           pattern_names[j],
+           p->mini, p->minj,
+           p->maxi, p->maxj,
+           p->maxi - p->mini,   /* height */
+           p->maxj - p->minj,   /* width  */
+           p->edge_constraints,
+           p->move_offset);
+
+
+#if GRID_OPT
+    fprintf(outfile, ",\n    {");
+    {
+      int ll;
+
+      for (ll = 0; ll < 8; ++ll)
+       fprintf(outfile, " 0x%08x%s", p->and_mask[ll], ll < 7 ? "," : "");
+      fprintf(outfile, "},\n    {");
+      for (ll = 0; ll < 8; ++ll)
+       fprintf(outfile, " 0x%08x%s", p->val_mask[ll], ll < 7 ? "," : "");
+    }
+    fprintf(outfile, "}\n   ");
+#endif
+
+    fprintf(outfile, ", 0x%x,%f,", p->class, p->value);
+
+    if (attributes_needed) {
+      fprintf(outfile, "attributes+%d,",
+             (int) (p->attributes ? p->attributes - attributes : 0));
+    }
+    else
+      fprintf(outfile, "NULL,");
+
+    fprintf(outfile, "%d,%s,", p->autohelper_flag, helper_fn_names[j]);
+
+    if (p->autohelper)
+      fprintf(outfile, "autohelper%s%d", prefix, j);
+    else
+      fprintf(outfile, "NULL");
+    fprintf(outfile, ",%d", p->anchored_at_X);
+    fprintf(outfile, ",%f", p->constraint_cost);
+#if PROFILE_PATTERNS
+    fprintf(outfile, ",0,0");
+    fprintf(outfile, ",0");
+#endif
+
+    fprintf(outfile, "},\n");
+  }
+
+  if (database_type == DB_CORNER)
+    return;
+
+  /* Add a final empty entry. */
+  fprintf(outfile, "  {NULL, 0,0,NULL,0,0,0,0,0,0,0,0");
+#if GRID_OPT
+  fprintf(outfile, ",{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}");
+#endif
+  fprintf(outfile, ",0,0.0,NULL,0,NULL,NULL,0,0.0");
+#if PROFILE_PATTERNS
+  fprintf(outfile, ",0,0,0");
+#endif
+  fprintf(outfile, "}\n};\n");
+}
+
+/* Write out the pattern db */
+static void
+write_pattern_db(FILE *outfile)
+{
+  if (database_type == DB_CORNER) {
+    fprintf(outfile, "struct corner_db %s_db = {\n", prefix);
+    fprintf(outfile, "  %d,\n", corner_max_width + 1);
+    fprintf(outfile, "  %d,\n", corner_max_height + 1);
+    fprintf(outfile, "  %d,\n", corner_root.num_variations);
+    fprintf(outfile, "  %s_variations\n", prefix);
+    fprintf(outfile, "};\n");
+
+    return;
+  }
+
+  /* Write out the pattern database. */
+  fprintf(outfile, "\n");
+  fprintf(outfile, "struct pattern_db %s_db = {\n", prefix);
+  fprintf(outfile, "  -1,\n");  /* fixed_for_size */
+  fprintf(outfile, "  %d,\n", fixed_anchor);
+  fprintf(outfile, "  %s\n", prefix);
+  if (database_type == DB_DFA)
+    fprintf(outfile, " ,& dfa_%s\n", prefix); /* pointer to the wired dfa */
+  else
+    fprintf(outfile, " , NULL\n"); /* pointer to a possible dfa */
+
+  fprintf(outfile, "};\n");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+  static char stdin_name[] = "<stdin>";
+  int input_files = 0;
+  int ifc;
+  char *input_file_names[MAX_INPUT_FILE_NAMES];
+  char *output_file_name = NULL;
+  char *transformations_file_name = NULL;
+  FILE *input_FILE = stdin;
+  FILE *output_FILE = stdout;
+  FILE *transformations_FILE = NULL;
+  int state = 0;
+  char *save_code_pos = autohelper_code;
+  int iterations = 0;
+
+  transformation_init();
+
+  {
+    int i;
+    int multiple_anchor_options = 0;
+
+    /* Parse command-line options */
+    while ((i = gg_getopt(argc, argv, "i:o:t:vV:pcfCDd:A:OXbma")) != EOF) {
+      switch (i) {
+      case 'i': 
+       if (input_files == MAX_INPUT_FILE_NAMES) {
+         fprintf(stderr, "Error : Too many input files (maximum %d supported)\n",
+           MAX_INPUT_FILE_NAMES);
+         return EXIT_FAILURE;
+        }
+       input_file_names[input_files++] = gg_optarg;
+       break;
+
+      case 'o': output_file_name = gg_optarg; break;
+      case 't': transformations_file_name = gg_optarg; break;
+      case 'v': verbose = 1; break;
+      case 'V': dfa_verbose = strtol(gg_optarg, NULL, 10); break;
+
+      case 'p':
+      case 'c':
+      case 'f':
+      case 'C':
+      case 'D':
+      case 'd':
+       if (database_type) {
+         fprintf(stderr, "Error : More than one database type specified (-%c and -%c)\n",
+                 database_type, i);
+         return 1;
+       }
+       database_type = i;
+       if (i == 'd') {
+         iterations = strtol(gg_optarg, NULL, 10);
+         if (iterations < 0) {
+           fprintf(stderr, "Error : Expected a non-negative number of iterations\n");
+           return 1;
+         }
+       }
+       break;
+
+      case 'O':
+       if (anchor)
+         multiple_anchor_options = 1;
+       anchor = ANCHOR_O;
+       break;
+      case 'X':
+       if (anchor)
+         multiple_anchor_options = 1;
+       anchor = ANCHOR_X;
+       break;
+      case 'b':
+       if (anchor)
+         multiple_anchor_options = 1;
+       anchor = ANCHOR_BOTH;
+       break;
+
+      case 'm':
+       choose_best_anchor = 1;
+       if (fixed_anchor)
+         fprintf(stderr, "Warning : -m and -a are mutually exclusive.\n");
+       break;
+      case 'a':
+       fixed_anchor = 1;
+       if (choose_best_anchor)
+         fprintf(stderr, "Warning : -m and -a are mutually exclusive.\n");
+       break;
+
+      default:
+       fprintf(stderr, "\b ; ignored\n");
+      }
+    }
+
+    if (!database_type)
+      database_type = DB_GENERAL;
+    if (!anchor)
+      anchor = ANCHOR_O;
+
+    if (!input_files)
+      input_file_names[input_files++] = stdin_name;
+    if (output_file_name && database_type != OPTIMIZE_DFA) {
+      output_FILE = fopen(output_file_name, "wb");
+      if (output_FILE == NULL) {
+       fprintf(stderr, "Error : Cannot write to file %s\n", output_file_name);
+       return 1;
+      }
+    }
+    if (transformations_file_name
+       && (database_type == DB_DFA || database_type == OPTIMIZE_DFA)) {
+      transformations_FILE = fopen(transformations_file_name, "r");
+      if (transformations_FILE) {
+       parse_transformations_file(transformations_FILE);
+       fclose(transformations_FILE);
+      }
+      else if (database_type == DB_DFA) {
+       fprintf(stderr, "Error : Cannot read file %s\n",
+               transformations_file_name);
+       return 1;
+      }
+    }
+
+    if (multiple_anchor_options)
+      fprintf(stderr, "Warning : Multiple anchor options encountered. The last took precedence\n");
+  }
+
+  if (gg_optind >= argc) {
+    fputs(USAGE, stderr);
+    exit(EXIT_FAILURE);
+  }
+
+  prefix = argv[gg_optind];
+
+  if (database_type == DB_DFA) {
+    dfa_init();
+    new_dfa(&dfa, "mkpat's dfa");
+  }
+  else if (database_type == DB_CORNER)
+    corner_init();
+
+  if (database_type == OPTIMIZE_DFA) {
+    if (transformations_file_name == NULL) {
+      fprintf(stderr, "error : transformation file required (use -t option)\n");
+      return 1;
+    }
+    dfa_patterns_reset(&dfa_pats);
+    dfa_init();
+  }
+  else
+    fprintf(output_FILE, PREAMBLE);
+
+  /* Initialize pattern number and buffer for automatically generated
+   * helper code.
+   */
+  patno = -1;
+  autohelper_code[0] = 0;
+  code_pos = autohelper_code;
+
+  num_attributes = 1;
+  attributes[0].type = LAST_ATTRIBUTE;
+
+  /* Parse the input file, output pattern elements as as we find them,
+   * and store pattern entries for later output.
+   *
+   * We do this parsing too with the help of a state machine.
+   * state
+   *   0     Waiting for a Pattern line.
+   *   1     Pattern line found, waiting for a position diagram.
+   *   2     Reading position diagram.
+   *   3     Waiting for entry line (":" line).
+   *   4     Waiting for optional constraint diagram.
+   *   5     Reading constraint diagram.
+   *   6     Waiting for constraint line (";" line).
+   *   7     Reading a constraint
+   *   8     Reading an action
+   *
+   * FIXME: This state machine should be possible to simplify.
+   *
+   */
+
+  for (ifc = 0; ifc < input_files && !fatal_errors; ifc++) {
+    char line[MAXLINE];  /* current line from file */
+
+    if (input_file_names[ifc] != stdin_name) {
+      input_FILE = fopen(input_file_names[ifc], "r");
+      if (input_FILE == NULL) {
+       fprintf(stderr, "Error: Cannot open file %s\n", input_file_names[ifc]);
+       return 1;
+      }
+    }
+    current_file = input_file_names[ifc];
+    current_line_number = 0;
+
+    while (fgets(line, MAXLINE, input_FILE)) {
+      int command = 0;
+      char command_data[MAXLINE];
+
+      current_line_number++;
+      if (line[strlen(line)-1] != '\n') {
+       fprintf(stderr, "%s(%d) : Error : line truncated (longer than %d characters)\n",
+               current_file, current_line_number, MAXLINE - 1);
+
+       fatal_errors++;
+      }
+      
+      /* Remove trailing white space from `line' */
+      {
+       int i = strlen(line) - 2;  /* Start removing backwards just before newline */
+       while (i >= 0 && isspace((int) line[i]))
+         i--;
+       line[i+1] = '\n';
+       line[i+2] = '\0';
+      }
+      
+      if (sscanf(line, "Pattern %s", command_data) == 1)
+       command = 1;
+      else if (sscanf(line, "goal_elements %s", command_data) == 1)
+       command = 2;
+      else if (sscanf(line, "callback_data %s", command_data) == 1)
+       command = 3;
+      else if (sscanf(line, "attribute_map %s", command_data) == 1)
+       command = 4;
+
+      if (command) {
+       char *p = strpbrk(command_data, " \t");
+       
+       if (p)
+         *p = 0;
+
+       if (patno >= 0) {
+         switch (state) {
+         case 1:
+           fprintf(stderr, "%s(%d) : Warning: empty pattern %s\n",
+                   current_file, current_line_number, pattern_names[patno]);
+           break;
+         case 2:
+         case 3:
+           fprintf(stderr, "%s(%d) : Error : No entry line for pattern %s\n",
+                   current_file, current_line_number, pattern_names[patno]);
+           fatal_errors++;
+           break;
+         case 5:
+         case 6:
+           {
+             struct pattern_attribute *attribute = NULL;
+
+             if (pattern[patno].attributes) {
+               for (attribute = pattern[patno].attributes;
+                    attribute->type != LAST_ATTRIBUTE;
+                    attribute++) {
+                 if (attribute->type >= FIRST_OFFSET_ATTRIBUTE)
+                   break;
+               }
+             }
+
+             if (attribute == NULL || attribute->type == LAST_ATTRIBUTE) {
+               fprintf(stderr,
+                       "%s(%d) : Warning: constraint diagram but no constraint line or offset attributes for pattern %s\n",
+                       current_file, current_line_number, pattern_names[patno]);
+             }
+           }
+
+           break;
+         case 7:
+         case 8:
+           finish_constraint_and_action();
+                                                       /* fall through */
+         case 0:
+         case 4:
+           check_constraint_diagram();
+         }
+       }
+
+       state = 0;
+       if (command == 1) { /* Pattern `name' */
+         int k;
+
+         if (!discard_pattern) {
+           convert_attribute_labels_to_offsets();
+           patno++;
+         }
+         else
+           code_pos = save_code_pos;
+         reset_pattern();
+
+         if (strlen(command_data) > MAXNAME - 1) {
+           fprintf(stderr, "%s(%d) : Warning : pattern name is too long, truncated\n",
+                   current_file, current_line_number);
+           command_data[MAXNAME - 1] = 0;
+         }
+          /* Somewhat inefficient, but doesn't take any real time
+           * given current database sizes.
+           */
+          for (k = 0; k < patno; k++) {
+            if (strcmp(pattern_names[k], command_data) == 0) {
+              fprintf(stderr, "%s(%d) : Warning : duplicate pattern name `%s'\n",
+                      current_file, current_line_number, command_data);
+              break;
+            }
+          }
+         strcpy(pattern_names[patno], command_data);
+
+         transformation_hint = find_transformation_hint(pattern_names[patno]);
+
+         state = 1;
+         discard_pattern = 0;
+       }
+       else if (command == 2 || command == 3) {
+         int *sort_out = (command == 2 ? nongoal : callback_unneeded);
+         int k;
+
+         for (k = 0; k < 8; k++)
+           sort_out[k] = 1;
+
+         if (strcmp(command_data, "none")) {
+           char *c;
+
+           for (c = command_data; *c; c++) {
+             switch (*c) {
+             case '.':
+               sort_out[ATT_dot] = 0;
+               if (command == 2) { /* goal_elements */
+                 sort_out[ATT_comma] = 0;
+                 sort_out[ATT_not]   = 0;
+               }
+               break;
+             case 'X': sort_out[ATT_X] = 0; break;
+             case 'O': sort_out[ATT_O] = 0; break;
+             case 'x': sort_out[ATT_x] = 0; break;
+             case 'o': sort_out[ATT_o] = 0; break;
+             case ',':
+               sort_out[ATT_comma] = 0;
+               if (command != 2)
+                 break;
+             case '!':
+               sort_out[ATT_not] = 0;
+               if (command != 2)
+                 break;
+             default:
+               fprintf(stderr, "%s(%d) : Error : illegal character `%c'\n",
+                       current_file, current_line_number, *c);
+               fatal_errors++;
+             }
+           }
+         }
+       }
+       else {
+         struct attribute_description *old_map = attribute_map;
+
+         if (strcmp(command_data, "general") == 0) {
+           attribute_map = general_attribute_map;
+           attributes_needed = 1;
+         }
+         else if (strcmp(command_data, "value_only") == 0) {
+           attribute_map = value_only_attribute_map;
+           attributes_needed = 0;
+         }
+         else if (strcmp(command_data, "owl_attack") == 0) {
+           attribute_map = owl_attack_attribute_map;
+           attributes_needed = 1;
+         }
+         else if (strcmp(command_data, "owl_defense") == 0) {
+           attribute_map = owl_defense_attribute_map;
+           attributes_needed = 1;
+         }
+         else if (strcmp(command_data, "none") == 0) {
+           attribute_map = NULL;
+           attributes_needed = 0;
+         }
+         else {
+           fprintf(stderr, "%s(%d) : Error : unknown attribute map `%s'",
+                   current_file, current_line_number, command_data);
+           fatal_errors++;
+         }
+
+         if (patno != -1 && attribute_map != old_map) {
+           fprintf(stderr, "%s(%d) : Error : attribute map can only be set before the first pattern\n",
+                   current_file, current_line_number);
+           fatal_errors++;
+         }
+       }
+      }
+      else if (line[0] == '\n' || line[0] == '#') { 
+       /* nothing */
+       if (state == 2 || state == 5) {
+         if (state == 5)
+           check_constraint_diagram_size();
+         state++;
+       }
+      }
+      else if (strchr(VALID_PATTERN_CHARS, line[0])
+              || strchr(VALID_EDGE_CHARS, line[0])
+              || strchr(VALID_CONSTRAINT_LABELS, line[0])) { 
+       /* diagram line */
+       switch (state) {
+       case 0:
+       case 3:
+       case 6:
+       case 7:
+       case 8:
+         fprintf(stderr, 
+                 "%s(%d) : error : What, another diagram here? (pattern %s)\n",
+                 current_file, current_line_number, pattern_names[patno]);
+         fatal_errors++;
+         break;
+       case 1:
+         state++; /* fall through */
+       case 2:
+         if (!read_pattern_line(line)) {
+           discard_pattern = 1;
+           el = 0;
+         }
+         break;
+       case 4:
+         state++; /* fall through */
+       case 5:
+         read_constraint_diagram_line(line);
+         break;
+       }       
+      }
+      else if (line[0] == ':') {
+       if (state == 2 || state == 3) {
+         finish_pattern(line);
+         
+         if (!discard_pattern) {
+           if (database_type == DB_DFA || database_type == OPTIMIZE_DFA)
+             write_to_dfa(patno);
+           if (database_type == DB_CORNER)
+             corner_add_pattern();
+           else if (database_type != OPTIMIZE_DFA)
+             write_elements(output_FILE);
+         }
+
+         state = 4;
+         save_code_pos = code_pos;
+       }
+       else {
+         fprintf(stderr,
+                 "%s(%d) : warning : Unexpected entry line in pattern %s\n",
+                 current_file, current_line_number, pattern_names[patno]);
+       }
+      } 
+      else if (line[0] == ';') {
+       if (state == 5)
+         check_constraint_diagram_size();
+       
+       if (state == 5 || state == 6 || state == 7) {
+         read_constraint_line(line+1);
+         state = 7;
+       }
+       else {
+         fprintf(stderr, "%s(%d) : Warning: unexpected constraint line in pattern %s\n",
+                 current_file, current_line_number, pattern_names[patno]);
+       }
+      } 
+      else if (line[0] == '>') {
+       if (state == 4 || state == 5 || state == 6 
+           || state == 7 || state == 8) {
+         if (state == 5)
+           check_constraint_diagram_size();
+         read_action_line(line+1);
+         state = 8;
+       }
+       else {
+         fprintf(stderr, "Warning: unexpected action line in pattern %s\n",
+                 pattern_names[patno]);
+       }
+      } 
+      else {
+       int i = strlen(line);
+       char c = line[i-1];
+       line[i-1] = 0;  /* Chop off \n */
+       fprintf(stderr, "%s(%d) : error : Malformed line \"%s\" in pattern %s\n",
+               current_file, current_line_number, line, pattern_names[patno]);
+       line[i-1] = c;  /* Put it back - maybe not necessary at this point. */
+       fatal_errors++;
+      }
+    } /* while not EOF */
+  } /* for each file */
+
+  convert_attribute_labels_to_offsets();
+  
+  if (patno >= 0) {
+    switch (state) {
+    case 1:
+      fprintf(stderr, "Warning: empty pattern %s\n",
+             pattern_names[patno]);
+      break;
+    case 2:
+    case 3:
+      fprintf(stderr, "%s(%d) : Error : no entry line for pattern %s\n",
+             current_file, current_line_number, pattern_names[patno]);
+      fatal_errors++;
+      break;
+    case 5:
+    case 6:
+      fprintf(stderr,
+             "Warning: constraint diagram but no constraint line for pattern %s\n",
+             pattern_names[patno]);
+      break;
+    case 7:
+    case 8:
+      finish_constraint_and_action(); /* fall through */
+    case 0:
+    case 4:
+      check_constraint_diagram();
+      patno++;
+      reset_pattern();
+    }
+  }
+
+  if (discard_pattern) {
+    patno--;
+    code_pos = save_code_pos;
+  }
+
+  *code_pos = 0;
+
+  if (verbose)
+    fprintf(stderr, "%d / %d patterns have edge-constraints\n",
+           pats_with_constraints, patno);
+
+  if (database_type != OPTIMIZE_DFA) {
+    /* Forward declaration, which autohelpers might need. */
+    if (database_type != DB_CORNER)
+      fprintf(output_FILE, "static struct pattern %s[%d];\n\n", prefix, patno + 1);
+    else
+      fprintf(output_FILE, "static struct corner_pattern %s[%d];\n\n", prefix, patno + 1);
+
+    /* Write the autohelper code. */
+    fprintf(output_FILE, "%s", autohelper_code);
+
+    if (attributes_needed)
+      write_attributes(output_FILE);
+    else
+      assert(num_attributes == 1);
+
+    write_patterns(output_FILE);
+
+    if (database_type == DB_DFA) {
+      fprintf(stderr, "---------------------------\n");
+
+      dfa_finalize(&dfa);
+      dfa_shuffle(&dfa);
+
+      fprintf(stderr, "DFA for %s\n", prefix);
+      fprintf(stderr, "size: %d kB for ", dfa_size(&dfa));
+      fprintf(stderr, "%d patterns", patno);
+      fprintf(stderr, " (%d states)\n", dfa.last_state);
+
+      strcpy(dfa.name, prefix);
+      print_c_dfa(output_FILE, prefix, &dfa);
+      fprintf(stderr, "---------------------------\n");
+
+      if (DFA_MAX_MATCHED/8 < dfa_calculate_max_matched_patterns(&dfa))
+        fprintf(stderr, "Warning: Increase DFA_MAX_MATCHED in 'dfa.h'.\n");
+
+      kill_dfa(&dfa);
+      dfa_end();
+    }
+
+    if (database_type == DB_CORNER) {
+      fprintf(stderr, "---------------------------\n");
+
+      corner_pack_variations(corner_root.child, 0);
+      fprintf(output_FILE, "static struct corner_variation %s_variations[] = {\n",
+             prefix);
+      corner_write_variations(corner_root.child, output_FILE);
+
+      fprintf(stderr, "corner database for %s\n", prefix);
+      fprintf(stderr, "size: %d kB for %d patterns (%d variations)\n",
+             CORNER_DB_SIZE(patno, total_variations), patno, total_variations);
+      fprintf(stderr, "---------------------------\n");
+    }
+
+    write_pattern_db(output_FILE);
+
+    if (fatal_errors) {
+      fprintf(output_FILE, "\n#error: One or more fatal errors compiling %s\n",
+             current_file);
+    }
+  }
+  else {       /* database_type == OPTIMIZE_DFA */
+    int k;
+    int *optimized_variations;
+
+    transformations_FILE = fopen(transformations_file_name, "wb");
+    if (transformations_FILE == NULL) {
+      fprintf(stderr, "error : cannot write to file %s\n",
+             transformations_file_name);
+    }
+
+    optimized_variations = dfa_patterns_optimize_variations(&dfa_pats,
+                                                           iterations);
+    for (k = 0; k < patno; k++) {
+      fprintf(transformations_FILE, "%s\t%d\n", pattern_names[k],
+             optimized_variations[k]);
+    }
+
+    free(optimized_variations);
+    dfa_end();
+  }
+
+  return fatal_errors ? 1 : 0;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/mkpat.dsp b/patterns/mkpat.dsp
new file mode 100644 (file)
index 0000000..ee4d65a
--- /dev/null
@@ -0,0 +1,102 @@
+# Microsoft Developer Studio Project File - Name="mkpat" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=mkpat - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "mkpat.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "mkpat.mak" CFG="mkpat - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "mkpat - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "mkpat - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "mkpat - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I ".." /I "..\utils" /I "..\engine" /I "..\sgf" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /Fd"Release/mkpat" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 ..\utils\Release\utils.lib .\Release\dfa.lib /nologo /subsystem:console /debug /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "mkpat - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I ".." /I "..\utils" /I "..\engine" /I "..\sgf" /D "_DEBUG" /D "HAVE_CONFIG_H" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /Fd"Debug/mkpat" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 ..\utils\Debug\utils.lib .\Debug\dfa.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "mkpat - Win32 Release"\r
+# Name "mkpat - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\mkpat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\transform.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/mokuhazushi.db b/patterns/mokuhazushi.db
new file mode 100644 (file)
index 0000000..b4c9bb1
--- /dev/null
@@ -0,0 +1,217 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JM1
+
+-------+
+.......|
+.......|
+..O....|
+....X..|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JM2
+
+-------+
+.......|
+.......|
+..X....|
+....O..|
+...X*..|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JM3
+
+-------+
+.......|
+.......|
+..O....|
+....X..|
+...OX..|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JM4
+
+-------+
+.......|
+.......|
+..X....|
+....O..|
+...XO..|
+...X...|
+....*..|
+.......|
+
+:8,sFJ
+
+
+Pattern JM5
+
+-----------+
+...........|
+...........|
+.*....O....|
+........X..|
+.......OX..|
+.......O...|
+........X..|
+...........|
+
+:8,sFU
+
+
+Pattern JM6
+
+-------+
+.......|
+.......|
+..O....|
+....X..|
+...OX..|
+...OX..|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JM7
+
+------------+
+............|
+............|
+..*....O....|
+.........X..|
+........OX..|
+........OX..|
+........O...|
+
+:8,sFJ
+
+
+Pattern JM8
+
+-----------+
+...........|
+...........|
+.O....O....|
+........X..|
+.*.....OX..|
+.......OX..|
+.......O...|
+
+:8,sFj
+
+
+Pattern JM9
+
+-------+
+.......|
+.......|
+..O.X..|
+.......|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JM10
+
+---------+
+.........|
+.........|
+....O.X..|
+.........|
+.....OX..|
+.....*...|
+.........|
+
+:8,sFJ
+
+
+Pattern JM11
+
+---------+
+.........|
+.........|
+....O.X..|
+.........|
+.....OX..|
+.....OX..|
+.....*...|
+.........|
+
+:8,sFJ
+
+
+Pattern JM12
+
+------------+
+............|
+............|
+..*....O.X..|
+............|
+........OX..|
+........OX..|
+........O...|
+
+:8,sFJ
+
+
+Pattern JM13
+
+-----------+
+...........|
+...........|
+.O....O.X..|
+...........|
+.*.....OX..|
+.......OX..|
+.......O...|
+
+:8,sFj
+
+
diff --git a/patterns/mokuhazushi.sgf b/patterns/mokuhazushi.sgf
new file mode 100644 (file)
index 0000000..1e6659c
--- /dev/null
@@ -0,0 +1,38 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by the Free Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation - version 3 or
+at your option any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19]HA[0]
+GN[Mokuhazushi joseki database]
+;B[oc]
+(;W[qd];B[pe]MA[mg];W[qe]MA[mg];B[pf]MA[mh]
+(;W[qg]MA[mh];B[jc]MA[ih]C[U
+])
+
+(;W[qf];B[pg]MA[mi];W[qh];B[jc]MA[hg]PL[B];B[je]MA[ig]C[j
+])
+)
+
+(;W[qc];B[pe]MA[mg];W[qe];B[pf]MA[kg];W[qf];B[pg]MA[kh]PL[B];B[jc]
+MA[hg]PL[B];B[je]MA[ig]C[j
+])
+
+)
diff --git a/patterns/oracle.db b/patterns/oracle.db
new file mode 100644 (file)
index 0000000..8a44c49
--- /dev/null
@@ -0,0 +1,99 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+# This database is included as an example only to show how
+# a pattern matcher can be used with the oracle, in oracle.c.
+# It doesn't do much.
+
+# Nadare joseki variations
+
+
+attribute_map value_only
+
+
+Pattern O1
+
++-------
+|.......
+|.......
+|...*O..
+|..OXX..
+|.......
+
+:8,-,value(10)
+
+
+Pattern O2
+
++-------
+|.......
+|.......
+|...XX..
+|..XOO..
+|..*....
+|.......
+
+:8,-,value(10)
+
+
+Pattern O3
+
++-------
+|.......
+|.......
+|...OO..
+|..OXX*.
+|..X....
+|.......
+|.......
+
+:8,-,value(10)
+
++-------
+|.......
+|..c....
+|..aOOg.
+|.bOHH*.
+|.dX....
+|.fe....
+|.......
+
+; oplay_attack(*,a,b,c,d,e,f,g,H)
+
+
+Pattern O4
+
++-------
+|.......
+|.......
+|...OO*.
+|..OXX..
+|..X....
+|.......
+|.......
+
+:8,-,value(10)
+
+
+# END OF FILE
diff --git a/patterns/owl_attackpats.db b/patterns/owl_attackpats.db
new file mode 100644 (file)
index 0000000..ee75579
--- /dev/null
@@ -0,0 +1,6320 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The Owl offensive pattern database.
+#
+#  Further documentation may be found in the Texinfo documentation.
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  In the second field (classification) the following pattern attributes
+#  are possible. Friendly stones are 'O', opponent stones are 'X'.
+# 
+# s  :  "Sacrifice" pattern. Omit the usual check that an O stone here
+#       cannot be capture.
+# 
+# n  :  In addition to usual check that an O stone here cannot be
+#       captured, check also that an X move cannot be captured.
+# 
+#################
+#
+#  'Y' is the anchor stone, a unique stone of color 'X' used by the pattern
+#  matcher to find the pattern.
+#
+#################
+# The patterns in this database are sorted into the following
+# categories:
+# 
+# Axx   Limiting moves on the fourth line
+# A1xx  Limiting moves on the third line
+# A2xx  Limiting moves on the second line
+# A3xx  Limiting moves on the first line
+# A4xx  Limiting moves in the center
+# A5xx  Eye reducing moves on the second line
+# A6xx  Eye reducing moves on the first line
+# A7xx  Eye reducing moves in the center
+# A8xx  Invade the eye space
+# A9xx  Nakade patterns
+# A10xx Cuts
+# A11xx Reinforce the perimeter
+# A12xx Kill or threaten a worm of the dragon
+# A13xx Specific corner attacks
+# A14xx Invasion patterns
+# A15xx Ko patterns
+# A16xx Specific edge attacks
+#
+# ACxx  Threats to capture
+# AExx  Threats to destroy eyes
+# ARxx  Reverse sente attacking moves
+
+
+attribute_map owl_attack
+
+goal_elements Xx
+callback_data Xx
+
+#########################################################
+#                                                       #
+#          Limiting moves on the fourth line            #
+#                                                       #
+#########################################################
+
+
+Pattern A1
+# sometimes sagari is better
+
+?.*Ox        connect
+..OYX
+.....
+.....
+-----
+
+:8,n,value(80)
+
+?.*Ax
+..OYX
+.....
+.....
+-----
+
+; lib(A)<4
+
+
+Pattern A2
+
+?..X.
+?.*.x        block
+..OY.
+.....
+.....
+-----
+
+:8,-,value(65)
+
+
+Pattern A3
+# db added (3.1.8)
+# gf Reduced value. (3.1.14)
+
+.*O?        draw back
+O.YX
+....
+....
+----
+
+:8,-,value(65)
+
+
+#########################################################
+#                                                       #
+#          Limiting moves on the third line             #
+#                                                       #
+#########################################################
+
+
+Pattern A101
+
+Oo?         Block
+Y*.
+...
+...
+---
+
+:8,-,value(70)
+
+
+Pattern A102
+
+OO..?       Draw back
+XXO*.
+..Y..
+.....
+-----
+
+:8,-,value(80)
+
+
+Pattern A103
+
+?Oo?      draw back
+x*.Y
+x.OX
+?...
+----
+
+:8,-,value(50)
+
+
+Pattern A104
+
+?..O        pull back
+.*OY
+..X.
+....
+----
+
+:8,-,value(90)
+
+?..O
+.*Oa
+..X.
+....
+----
+
+; lib(a)>2
+
+
+Pattern A105
+
+?..OxX        mandatory block
+..*Y..
+......
+......
+------
+
+:8,-,value(99)
+
+
+Pattern A106
+
+?X??         push in
+..*O
+X.YO
+....
+----
+
+:8,-,value(60)
+
+
+Pattern A107
+# gf Not on second line without known support. See trevora:290. (3.1.15)
+# nn Added constraint (3.3.14)
+
+....?     block on third line
+Y.*.?
+....?
+....?
+-----
+
+:8,-,value(50)
+
+#
+# ....?
+# a.*.b
+# ....?
+# ....?
+# -----
+# 
+# ; weak(a) || oarea(b)
+
+
+Pattern A108
+
+*.x         stand on third line
+OYx
+...
+---
+
+:8,n,value(70)
+
+
+Pattern A109
+# tm Constraint added (3.1.16)
+
+oOo         block on third line
+Y*.
+...
+...
+---
+
+:8,-,value(79)
+
+aOb
+Y*.
+...
+...
+---
+
+#Pattern A232 is almost certainly better if this
+#constraint fails (avoid empty triangle)
+; (o_somewhere(a) || !o_somewhere(b))
+
+
+Pattern A110
+
+O..o        draw back --- the only move!
+XO*.
+XY..
+....
+----
+
+:8,-,value(85)
+
+
+Pattern A111
+# db added (3.1.8)
+
+?Ooo       try to confine 
+?...
+Y.*.
+x...
+....
+----
+
+:8,-,value(50)
+
+
+Pattern A112
+# db added (3.1.8)
+
+..O?        draw back
+O*YX
+....
+....
+----
+
+:8,-,value(79)
+
+..A?
+O*YX
+....
+....
+----
+
+; lib(A)>2
+
+
+Pattern A113
+# gf Moved from A212. (3.1.9)
+
+|..xX         prevent connection
+|....
+|..*O
+|..Y?
+
+:8,C,value(99)
+
+
+Pattern A114
+# gf Moved from A213. (3.1.9)
+
+|..X.         prevent connection
+|....
+|..*O
+|..Y?
+
+:8,C,value(99)
+
+
+Pattern A115
+# gf New pattern. (3.1.14)
+
+o..Y?
+o.*.X
+.....
+.....
+-----
+
+:8,-,value(85)
+
+a..Y?
+b.*.X
+.....
+.....
+-----
+
+;o_somewhere(a,b)
+
+
+#########################################################
+#                                                       #
+#          Limiting moves on the second line            #
+#                                                       #
+#########################################################
+
+
+Pattern A201
+
+OO...       Block if safe
+XXOO.
+..YX*
+.....
+-----
+
+:8,-,value(60)
+
+OOc.b
+XXOOa
+..YX*
+.....
+-----
+
+; oplay_attack(*,a,a) || !oplay_attack(*,a,b,c,*)
+
+
+Pattern A203
+# tm Modified (3.1.16)
+
+?O??              second line block
+x*Yx
+...X
+----
+
+:8,C,value(60)
+
+
+Pattern A204
+# gf Pattern revised. (3.5.1)
+
+??O??              second line block
+?.*Y?
+.....
+-----
+
+:8,-,value(60)
+
+
+Pattern A205
+
+?Oo             second line block (needs a helper)
+XY*
+...
+---
+
+:8,-,value(60)
+
+
+Pattern A205b
+
+?Oo             second line block (needs a helper)
+XY*
+.O.
+---
+
+:8,-,value(70)
+
+
+Pattern A206
+
+?O?        block
+YOo
+.X*
+...
+---
+
+:8,-,value(80)
+
+
+Pattern A206b
+
+?.O        block
+YO.
+.X*
+...
+---
+
+:8,-,value(78)
+
+
+Pattern A207
+
+O.Y         second line kosumi
+.*.
+...
+---
+
+:8,-,value(35)
+
+
+Pattern A207b
+
+O.Yx         second line kosumi
+.*.x
+...?
+----
+
+:8,-,value(58)
+
+
+Pattern A207c
+# nn Modified (3.3.11) see A207d
+
+?O.Yxx         second line kosumi
+?.*.xx
+?...??
+------
+
+:8,-,value(78)
+
+?O.Yxx
+a.*.xx
+?...??
+------
+
+;!x_somewhere(a) || attack(a)
+
+
+# nn Removal candidate (3.3.13)
+#   Success rate in regressions : 2.61% (15/560)
+
+Pattern A207d
+# nn New pattern (3.3.11) penalty for being gote
+
+?O.Yxx         second line kosumi
+X.*.xx
+?...??
+------
+
+:8,C,value(60)
+
+?O.Yxx
+a.*.xx
+?...??
+------
+
+;!attack(a)
+
+
+Pattern A208a
+# tm New Pattern (3.1.16) 
+
+O.X
+*.Y
+.oo
+---
+
+:8,-,value(55)
+
+
+Pattern A208b
+# nn New Pattern (3.3.11) 
+
+O..
+*.Y
+.oo
+---
+
+:8,-,value(35)
+
+
+Pattern A208c
+# gf New pattern. (3.3.18)
+
+?Xx
+O.X
+.*Y
+.oo
+---
+
+:8,-,value(56)
+
+
+Pattern A208d
+# gf New pattern. (3.5.3)
+
+O.X
+.*Y
+.oo
+---
+
+:8,-,value(56)
+
+OaX
+.*Y
+.oo
+---
+
+;!oplay_attack(*,a,*)
+
+
+Pattern A208e
+# gf New pattern. (3.7.3)
+
+O..
+.*Y
+.oo
+---
+
+:8,-,value(56)
+
+Oa.
+.*Y
+.oo
+---
+
+;oplay_attack(*,a,a)
+
+
+Pattern A209
+
+?Ooo
+xY*.        second line block
+x...
+----
+
+:8,-,value(70)
+
+?aoo
+xY*.
+x...
+----
+
+;lib(a)>2
+
+
+Pattern A210
+
+?OO?x
+xY*.x       second line block
+x....
+-----
+
+:8,C,value(85)
+
+?OO?x
+xY*.a
+x....
+-----
+
+;owl_escape_value(a)>0
+
+
+Pattern A211
+
+?Oo?      second line block
+o..Y
+o.*.
+?...
+----
+
+:8,-,value(80)
+
+
+Pattern A214
+
+----           connect
+....
+XO*.
+xYO?
+
+:8,-,value(85)
+
+----
+....
+XO*.
+xAO?
+
+;lib(A)>1
+
+
+Pattern A215
+
+?oOx              sagari
+?OYX
+x*..
+....
+----
+
+:8,C,value(80)
+
+
+Pattern A216
+
+??O              descend to attack
+XYO
+..*
+...
+---
+
+:8,-,value(50)
+
+
+Pattern A216b
+# gf New pattern. (3.1.11)
+
+??O              hane with support
+XYO
+.*.
+...
+---
+
+:8,-,value(60)
+
+??O
+XYO
+a*.
+...
+---
+
+;!oplay_attack(*,a,*)
+
+
+Pattern A217
+
+?OYX            sometimes more effective to just descend
+.*..
+....
+----
+
+:8,-,value(40)
+
+
+Pattern A217b
+# gf Increased value. (3.1.14)
+
+?OYX            sometimes more effective to just descend
+.*..
+....
+----
+
+:8,-,value(65)
+
+?aYX
+.*..
+....
+----
+
+;lib(a)==2
+
+
+Pattern A217c
+# gf New pattern. (3.1.14)
+
+.OYX            sometimes more effective to just descend
+.*..
+....
+----
+
+:8,-,value(60)
+
+caYX
+b*..
+....
+----
+
+;!xplay_defend_both(*,b,c,a,b)
+
+
+Pattern A218
+
+..OO             reverse sente sagari
+.OYX       
+.*..
+....
+----
+
+:8,-,value(75)
+
+
+Pattern A219
+
+O..?
+XO.?               double hane
+.Y*.
+...?
+----
+
+:8,s,value(70)
+
+ba.?
+AOc?
+eY*d
+..f?
+----
+
+;(xlib(a)==1 || lib(b)>2) && lib(A)<=3 && olib(e)>1
+;&& oplay_attack(*,c,a,d,e,f,A)
+;&& oplay_defend(*,c,a,e,*)
+
+
+Pattern A220
+# tm Modified (3.1.23)
+
+????              prevent jump
+?xx.
+xY*.
+....
+----
+
+:8,-,value(45)
+
+??bc
+?xad
+xY*.
+....
+----
+
+; (owl_escape_value(b) <= 0 && owl_escape_value(c) <= 0)
+; || !oplay_attack(*,a,d)
+
+
+Pattern A221
+# tm Modified (3.1.20) - added right hand ?s
+# tm Modified (3.1.23)
+
+?????             back off to prevent jump
+?xx.?
+xY.*?
+....?
+-----
+
+:8,-,value(50)
+
+???a?
+?xx.?
+xY.*?
+....?
+-----
+
+;owl_escape_value(a) < 1
+
+
+Pattern A222
+
+?oOo??           clamp
+?Oooo?
+XOY*..
+.X....
+------
+
+:8,-,value(35)
+
+
+Pattern A223
+
+O.Y         attach underneath
+..*
+...
+---
+
+:8,-,value(80)
+
+O.B
+.a*
+...
+---
+
+;lib(B)<=3 && oplay_attack(*,a,B)
+
+
+Pattern A224
+
+????        block if X can't cut
+OO.?
+XY*.
+....
+----
+
+:8,-,value(80)
+
+????
+OOa?
+XY*.
+....
+----
+
+; oplay_attack(*,a,a)
+
+
+Pattern A225
+
+?OY?       descend to prevent hane and eye
+.*.X
+...x
+----
+
+:8,-,value(50)
+
+
+Pattern A226
+
+.OY?       descend to prevent hane and eye in sente
+.*.X
+...x
+----
+
+:8,-,value(80)
+
+bCY?
+a*.X
+...x
+----
+
+;xplay_attack(*,a,C) || !xplay_defend_both(*,a,b,a,C)
+
+
+Pattern A227
+
+?XOxx
+?XO*.         stop escape
+X.Y..
+-----
+
+:8,C,value(35)
+
+?XOxx
+?XO*a
+X.Y..
+-----
+
+;owl_escape_value(a)>0
+
+
+Pattern A227b
+# gf New pattern. (3.1.9)
+
+?O.x
+X.*.         stop escape
+xY..
+----
+
+:8,C,value(65)
+
+?O.x
+X.*a
+xYb.
+----
+
+;owl_escape_value(a)>0 && !oplay_attack(*,a,b,*)
+
+
+Pattern A228
+
+.*O           eliminate kikashi
+..Y
+---
+
+:8,-,value(45)
+
+.*a
+..Y
+---
+
+; xplay_attack(*,a)
+
+
+Pattern A229
+
+xx.O?        stop escape
+x.*OX
+...Y.
+-----
+
+:8,C,value(80)
+
+ac.O?
+b.*OX
+...Y.
+-----
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern A229b
+
+xxx?        stop escape
+..*O
+...Y
+----
+
+:8,C,value(79)
+
+abx?
+..*O
+...Y
+----
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern A229c
+
+xx?        stop escape
+.*O
+..Y
+---
+
+:8,-,value(79)
+
+ab?
+.*O
+..Y
+---
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern A229d
+
+X?        stop escape
+*O
+.Y
+--
+
+:8,C,value(79)
+
+a?
+*O
+.Y
+--
+
+;owl_escape_value(a) > 0
+
+
+Pattern A230
+
+?Oo?       stop escape along edge
+..*Y
+....
+----
+
+:8,-,value(80)
+
+?Oo?
+a.*Y
+b...
+----
+
+;owl_escape_value(a)+owl_escape_value(b) > 0
+
+
+Pattern A231
+
+?..Y       jump to undermine
+O.*.
+....
+
+:8,-,value(50)
+
+
+Pattern A232
+# db added (3.1.7)
+
+?OO?            Jump down to block
+Y..?
+.*..
+....
+----
+
+:8,C,value(80)
+
+?OO?
+Yab?
+.*c.
+....
+----
+
+; oplay_attack(*,a,b,c,c)
+
+
+Pattern A232b
+# gf New pattern. (3.5.4)
+# See trevorc:240.
+
+?O.            Jump down to block
+Y..
+.*.
+...
+---
+
+:8,-,value(80)
+
+?ed
+Yab
+.*c
+...
+---
+
+; xlib(d)<=2 && lib(e)>3 && oplay_attack(*,a,b,c,c)
+
+
+Pattern A233
+# db added (3.1.10)
+
+OO.?            Jump and block
+....
+Y*.?
+...?
+----
+
+:8,-,value(75)
+
+
+Pattern A234
+# tm new pattern (3.1.13) 
+# Descend to attack. Possibly defend vulnerable stone.
+# Useful in arb:231
+
+xX       defend vulnerable stone.
+YO
+.*
+..
+--
+
+:8,C,value(20)
+
+
+Pattern A235
+# db new pattern (3.3.6)
+# gf Revised pattern. (3.5.7)
+
+?XXO?         prevent the hane
+?Y.*.
+..x..
+-----
+
+:8,-,value(77)
+
+
+Pattern A236
+# tm new pattern (3.3.12)
+
+---
+x..
+Y.*
+X..
+xO.
+
+:8,-,value(66)
+
+---
+x..
+Y.*
+X..
+xO.
+
+; !oplay_attack(*,*)
+
+
+Pattern A237
+# pp New pattern (3.3.18) See nngs4:370
+
+??O.       eliminate an eye in reverse sente
+xY*O
+X..o
+----
+
+:8,-,value(80)
+
+??Oc
+aY*A
+X.bo
+----
+
+; (x_somewhere(a) || ! safe_omove(a)) && !xplay_defend(*,b,c,A)
+
+
+Pattern A238
+# evand New pattern (3.3.20) See nngs4:570
+
+oO?Y   Jump down to enclose
+o..x
+.*.X
+....
+----
+
+:8,-,value(55)
+
+
+Pattern A239
+#spl added 3.5.1
+
+.Yo
+.*O Penetration
+...
+---
+
+:8,-,value(85)
+
+
+Pattern A240
+#spl added 3.5.1
+
+?YO?
+o*XO capture one stone and limiting eye
+o... maybe gote
+----
+
+:8,C,value(50)
+
+
+Pattern A241
+# gf New pattern. See gifu03:303. (3.5.3)
+
+O.YO         connect beneath
+o.*o
+....
+----
+
+:8,-,value(37)
+
+a.Yb
+o.*o
+....
+----
+
+;!oplay_disconnect(*,a,b)
+
+
+Pattern A242
+# gf New pattern. (3.5.3).
+# See e.g. nngs:1090.
+
+...o?
+..*O?
+...Yx
+-----
+
+:8,-,value(35)
+
+...o?
+ba*c?
+...Yx
+-----
+
+;xplay_disconnect(*,a,a,c) && xplay_disconnect(*,b,b,c)
+
+
+#########################################################
+#                                                       #
+#          Limiting moves on the first line             #
+#                                                       #
+#########################################################
+
+
+Pattern A301
+
+YO.X           prevent connection
+X*..
+----
+
+:8,-,value(60)
+
+YO.A
+X*..
+----
+
+;!owl_goal_dragon(A)
+
+
+Pattern A302
+# gf Revised pattern. (3.1.14)
+
+?oOX?        descend, but not on edge
+?OY.x
+x*.Xo
+-----
+
+:8,-,value(30)
+
+
+Pattern A305
+# tm New Pattern (3.1.15)
+
+xYxx?      Monkey Jump to reduce eye space
+x...O
+.*..o
+-----
+
+:8,C,value(45)
+
+
+#########################################################
+#                                                       #
+#          Limiting moves in the center                 #
+#                                                       #
+#########################################################
+
+
+Pattern A401
+# tm Modified (3.1.17)
+
+O..?       block strongly if possible
+Y*..
+?..?
+
+:8,-,value(80)
+
+ba.?
+Y*..
+?..?
+
+; oplay_defend_both(*,a,*,b) && !oplay_attack(*,a,b)
+
+
+Pattern A401a
+# tm Modified (3.1.17)
+#   identical to A401, but lower value if bad cut aji
+#   see, for example, strategy4:182
+
+O..?       block strongly if possible
+Y*..
+?..?
+
+:8,-,value(60)
+
+ba.?
+Y*..
+?..?
+
+; oplay_defend_both(*,a,*,b)
+
+
+Pattern A402
+# tm Modified (3.1.14) - doesn't make sense to match at edge.
+
+O*.?        fall back to confine
+Y...
+?..?
+????
+
+:8,-,value(70)
+
+a*.?
+Y...
+?..?
+????
+
+;lib(a)<=2 || xlib(*)>2
+
+
+Pattern A403
+# gf Devalued. See also A403b. (3.3.13)
+
+..*          knight's move to block
+O..
+OYX
+
+:8,-,value(55)
+
+cb*
+Aad
+OYX
+
+; oplay_defend_both(*,a,b,c,A,b) && oplay_defend_both(*,b,a,d,*,A)
+
+
+Pattern A403b
+# gf More specific pattern and constraint. (3.3.13)
+
+???
+..*          knight's move to block
+O..
+OYX
+
+:8,-,value(75)
+
+??e
+cb*
+Aad
+OYX
+
+; owl_escape_value(e)>0
+; && oplay_defend_both(*,a,b,c,A,b) && oplay_defend_both(*,b,a,d,*,A)
+
+
+Pattern A404
+
+xYx          attack eyeshape
+X.X
+.*.
+
+:|,-,value(75)
+
+
+Pattern A406
+
+xxx
+...         center block
+.*O
+OY?
+
+:8,-,value(85)
+
+xax
+b..
+.*O
+OY?
+
+; (owl_escape_value(a)>0)||(owl_escape_value(b)>0)
+
+
+Pattern A406b
+# nn Modifed (3.3.13)
+
+?xxx?
+o...o         center block
+..*Oo
+o.Y??
+
+:8,-,value(80)
+
+?xax?
+o...o
+..*Od
+o.Ybc
+
+;owl_escape_value(a)>0
+;&& (!x_somewhere(b,c)
+;    || o_somewhere(b,d)
+;    || (o_somewhere(c) && !safe_xmove(d)))
+
+
+Pattern A406c
+# tm New Pattern (3.1.17)
+# tm Modified (3.1.22)
+
+?xx
+*..         center keima enclosure
+..O
+.YO
+
+:8,-,value(81)
+
+?ax
+*c.
+dbO
+eYO
+
+;owl_escape_value(a)>0
+; && (xplay_attack(b,c,*,d,d) || !xplay_defend(*,b,d,e,e))
+
+
+Pattern A406d
+# gf New pattern. (3.7.1)
+
+?xxx?
+o...o         center block
+..*Oo
+o..Y?
+??Xx?
+
+:8,-,value(80)
+
+?xax?
+o...o
+..*Oo
+o..Y?
+??Xx?
+
+;owl_escape_value(a)>0
+
+
+Pattern A407
+# gf Added constraint. (3.5.3)
+
+?O.X
+?*Y.
+?...
+?...
+
+:8,-,value(45)
+
+aO.X
+b*Y.
+c...
+?...
+
+;!(o_somewhere(a) && o_somewhere(b)) || x_somewhere(c)
+
+
+Pattern A407b
+# gf New pattern. (3.5.3)
+
+OO.X
+O.Y.
+o*..
+?...
+
+:8,-,value(45)
+
+
+Pattern A408
+# gf Revised constraint. (3.1.14)
+
+?oOo        seal the opponent in
+?...
+.*.Y
+....
+???.
+???.
+
+:8,-,value(70)
+
+?oOo
+?...
+e*.Y
+....
+?ab.
+?cd.
+
+;o_somewhere(a,b,c,d) && owl_escape_value(e) > 0
+
+
+Pattern A409
+
+??xxx
+oO*..        try to contain
+O.Y.O
+?X.Oo
+
+:8,C,value(80)
+
+??abc
+oO*..
+O.Y.O
+?X.Oo
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern A410
+
+xxx          try to block
+.*.
+OYO
+?X?
+
+:|,B,value(90)
+
+xax
+.*.
+OYO
+?X?
+
+;owl_escape_value(a)>0
+
+
+Pattern A411
+# gf Revised pattern. Necessary to constrain it harder. (3.1.14)
+# gf Revised and devalued pattern. (3.1.15)
+# nn Modified constraint (3.3.11)
+
+??...???      try to stop escape into center
+??...oo?
+??.*.oo?
+??o.Y???
+??oo????
+
+:8,-,value(79)
+
+??.a.???
+??...def
+??.*.ghi
+??j.Y???
+??bc????
+
+;owl_escape_value(a)>0
+;&& ((o_somewhere(b,c,j) && o_somewhere(d,e,f,g,h,i))
+;   || (o_somewhere(j) && owl_escape_value(d)==0 && owl_escape_value(e)==0))
+
+
+Pattern A411a
+# nn New pattern (3.3.11)
+#   FIXME: there must be a way to prevent duplicate matches with A411
+
+???..??      try to stop escape into center
+??...oo
+??.*.oo
+??o.Y??
+??oo???
+??oo???
+
+:8,-,value(79)
+
+???a.??
+??...de
+??.*.bc
+??f.Y??
+??gh???
+??ij???
+
+;owl_escape_value(a)>0 && o_somewhere(f,g,h,i,j) && o_somewhere(b,c,d,e)
+
+
+Pattern A413a
+# nn New pattern (3.3.11)
+
+o.....       prevent escape
+o.....
+o..*..
+O.Y...
+
+:8,-,value(50)
+
+idf...
+jcbe..
+k.a*..
+O.Y...
+
+;(o_somewhere(j) || (o_somewhere(i) && o_somewhere(k)))
+;&& !oplay_attack(*,a,b,c,d,e,f,*) && !oplay_attack(*,a,b,e,f,*)
+
+
+Pattern A414
+# gf Revised constraint. (3.1.14)
+
+??xxx??       cap to prevent escape
+??...??
+oo.*.oo
+oo...oo
+??.Y.??
+
+:8,-,value(82)
+
+??xxx??
+??e..??
+ab.*.fg
+cd...hi
+??.Y.jk
+
+; o_somewhere(a,b,c,d) && owl_escape_value(e)>0 && o_somewhere(f,g,h,i,j,k)
+
+
+Pattern A414a
+# nn New pattern (3.3.11)
+
+......o
+......o
+..*...o
+oo.Y.oo
+
+:8,-,value(65)
+
+a.....b
+......c
+..*...d
+ef.Y.oo
+
+;owl_escape_value(a)>0
+;&& owl_escape_value(b)==0
+;&& owl_escape_value(c)==0
+;&& owl_escape_value(d)==0
+;&& o_somewhere(e,f)
+
+
+Pattern A415
+
+o..         cut off escape
+.*Y
+X.O
+
+:8,C,value(80)
+
+o..
+.*Y
+Abc
+
+;owl_escape_value(A)>0 && oplay_defend_both(*,b,*,c)
+
+
+Pattern A416
+
+?.O??        hane
+.*Y.X
+?...x
+
+:8,-,value(65)
+
+
+Pattern A417
+
+?Y.O          prevent center escape
+O.*.
+o...
+xxxx
+
+:8,-,value(75)
+
+?Y.O
+O.*.
+o...
+xabc
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern A418
+# db added (3.1.8)
+
+...O       prevent escape
+.*OX
+O.Yx
+
+:8,-,value(80)
+
+...O
+.*OA
+O.Yx
+
+; lib(A)>1
+
+
+Pattern A419
+# gf New pattern. (3.1.10)
+# gf Uncommented pattern (3.1.13)
+# tm modified (3.1.22) (see 13x13:52 --decide-dragon K10)
+
+Y.O
+.*X      cut to stop escape
+
+:8,C,value(68)
+
+Ycd
+.*A
+
+;(owl_escape_value(A)>0)
+; && oplay_defend_both(*,c,*,d)
+
+
+Pattern A419b
+# Same as A419, different anchor.
+
+X.O
+.*Y      cut to stop escape
+
+:8,C,value(68)
+
+Acd
+.*Y
+
+;(owl_escape_value(A)>0)
+; && oplay_defend_both(*,c,*,d)
+
+
+Pattern A420
+# gf New pattern. (3.1.12)
+
+?X.o          stop escape into center
+OY.O
+.O*.
+xxxx
+
+:8,-,value(75)
+
+?X.o
+cYaO
+bd*.
+xexx
+
+;owl_escape_value(e)>0 && !xplay_defend_both(*,a,b,c,d)
+
+
+Pattern A421
+# gf New pattern. (3.1.13)
+
+xx?
+..O         center block
+.*.
+OY?
+
+:8,-,value(80)
+
+ax?
+b.O
+.*.
+OY?
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern A422
+# ab New pattern. (3.3.10)
+
+?Oo?       prevent connection to another dragon
+Y*.X
+?xo?
+
+:8,-,value(85)
+
+?Oo?
+a*.b
+?xo?
+
+;(!owl_goal_dragon(b))
+;&& !xplay_disconnect(*,a,b)
+
+
+Pattern A422a
+# same as A422; different anchor.
+
+?Oo?       prevent connection to another dragon
+X*.Y
+?xo?
+
+:8,-,value(85)
+
+?Oo?
+a*.b
+?xo?
+
+;(!owl_goal_dragon(a))
+;&& !xplay_disconnect(*,a,b)
+
+
+Pattern A423
+# db New pattern (3.3.9)
+# complementary to D1358
+
+X..?         try to cut
+Y.*X
+??O?
+
+:8,C,value(61)
+
+X..?
+Y.*a
+??O?
+
+;(owl_escape_value(a) > 0)
+
+
+Pattern A423a
+# Same as A423; different anchor.
+
+X..?         try to cut
+X.*Y
+??O?
+
+:8,-,value(61)
+
+a..?
+a.*Y
+??O?
+
+;(owl_escape_value(a) > 0)
+
+
+Pattern A424
+# pp New pattern (3.3.18)
+
+XYO?        block and prevent opponent from playing double threat move
+.O.o
+XX*.
+
+:8,-,value(80)
+
+XYO?
+.O.o
+XX*a
+
+;owl_escape_value(a) > 0
+
+
+Pattern A425
+#spl added 3.5.1, counter part of D1348d
+
+O.Y        block connection
+.*.
+X.O
+
+:/,n,value(90)
+
+
+#########################################################
+#                                                       #
+#          Eye reducing moves on the second line        #
+#                                                       #
+#########################################################
+
+
+Pattern A501
+
+x.Y?      jump under
+.*.O
+....
+----
+
+:8,C,value(75)
+
+
+Pattern A502
+
+?Xo         extend to kill eye 
+O*Y
+X.X
+---
+
+:8,Cn,value(45)
+
+?Xo
+a*Y
+X.X
+---
+
+; attack(a)
+
+
+Pattern A503
+
+?XX         push in to eliminate eye
+Y*O
+X.X
+---
+
+:8,Cs,value(45)
+
+
+Pattern A503b
+# gf New pattern. (3.5.3)
+
+?XXX        atari to eliminate eye or make ko
+Y.O.
+X.X*
+----
+
+:8,s,value(32)
+
+?XXX
+Y.O.
+X.X*
+----
+
+;olib(*)>1
+
+
+Pattern A504
+
+Y*           cut off one stone
+OX
+--
+
+:8,C,value(35)
+
+
+Pattern A505
+
+?OYX       there is death in the hane
+..*.
+....
+----
+
+:8,-,value(45)
+
+
+Pattern A506
+
+?YX       undermine eyespace
+O*.
+...
+---
+
+:8,-,value(35)
+
+
+Pattern A507
+
+?O?           destroy eye space and threaten to cut
+Y*X
+...
+---
+
+:8,C,value(80)
+
+
+Pattern A508
+
+o.Xx?        undermine potential eye space
+O.*.Y
+....x
+-----
+
+:8,C,value(65)
+
+
+Pattern A509
+
+X.O           destroy eye space by damezumari
+Y*X
+x.x
+---
+
+:8,-,value(80)
+
+AbO
+A*X
+x.x
+---
+
+;lib(A)<=3 && xlib(b) <= 2 && oplay_attack(*,b,b)
+
+
+Pattern A510
+
+.XY.X       destroy eyespace in reverse sente
+OXO*.
+.O...
+-----
+
+:8,C,value(55)
+
+
+Pattern A511
+# gf New pattern. (3.1.11)
+
+?Y.x       undermine eyespace
+O*.x
+...x
+----
+
+:8,-,value(35)
+
+?Y.x
+O*ax
+...x
+----
+
+;owl_eyespace(a)
+
+
+Pattern A512
+# gf New pattern. (3.1.11)
+
+.O??        attack eye shape and stop expansion
+.*Yx
+..oX
+----
+
+:8,-,value(70)
+
+
+Pattern A513
+# tm New pattern. (3.1.15) (see trevora:620)
+#   This may be just too generic, though often useful.
+# tm Modified (3.1.16)
+#   Added ??? rows, make sure not at upper edge.
+# ab This is indeed too generic.
+# gf Added constraint to make it slightly less generic. (3.5.3)
+# See trevora:620,630 and gifu03:303 for relevant testcases.
+
+???|
+???|
+Y..|
+O*.|
+
+:8,-,value(45)
+
+???|
+?b?|
+Ya.|
+O*.|
+
+;x_somewhere(b) || oplay_attack(a,b,a)
+
+
+Pattern A514
+# tm New Pattern (3.1.15)
+#   see also Pattern A615
+
+XOo|    special edge position
+.YX|
+x*O|
+...|
+
+:8,s,value(45)
+
+XOb|
+CYW|
+A*O|
+...|
+
+; oplay_attack(*,W) && !oplay_attack(*,A,b,C,b)
+
+
+Pattern A515
+# gf New pattern. See owl1:286. (3.3.17)
+
+XXY*O          sacrifice lunch and falsify eye
+XOO..
+-----
+
+:8,-,value(35)
+
+XXY*O
+XOba.
+-----
+
+;!oplay_attack(*,a,b,*)
+
+
+Pattern A516
+# evand New pattern (3.3.20)
+
+oOXY.          Begin to falsify eye in reverse sente
+..O*X
+.....
+-----
+
+:8,-,value(70)
+
+oOXYa
+..O*X
+....b
+-----
+
+;!obvious_false_xeye(a) || !obvious_false_oeye(b)
+
+
+Pattern A517
+#spl added (3.3.23) see nando:11
+
+?OYXxx      Prevent opponent from making an eye on the first line
+.*O.X.
+.....X
+------
+
+:8,-,value(5)
+
+
+Pattern A518
+# gf New pattern. (3.5.3)
+# See nngs2:460
+
+O.xx?      destroye eye
+.*.YX
+....X
+-----
+
+:8,-,value(45)
+
+
+#########################################################
+#                                                       #
+#          Eye reducing moves on the first line         #
+#                                                       #
+#########################################################
+
+
+Pattern A601
+
+----        jump along edge
+O.*.
+Y..?
+?Xxx
+
+:8,-,value(75)
+
+
+Pattern A602
+
+--+         hane in corner
+..|
+Y*|
+Oo|
+
+:8,-,value(70)
+
+--+
+..|
+Y*|
+ao|
+
+;!attack(a)
+
+
+Pattern A603
+
+xXY.O       reduce eye space
+x.*..
+-----
+
+:8,s,value(35)
+
+xXY.a
+cb*..
+-----
+
+;!attack(a) && owl_proper_eye(b)
+;&& (x_somewhere(c) || owl_proper_eye(c))
+
+
+Pattern A603b
+# tm - modified (3.1.15) (see trevora:170)
+
+xY.x       reduce eye space
+.*.O
+----
+
+:8,s,value(35)
+
+xY.x
+b*.a
+----
+
+;owl_eyespace(b) && !attack(a)
+
+
+Pattern A604
+
+XY..O       reduce eye space
+.*...
+-----
+
+:8,s,value(35)
+
+
+Pattern A605
+
+|.Y.O       reduce eye space
+|.*..
++----
+
+:8,s,value(35)
+
+
+Pattern A606
+
+XxY.O        try to destroy eye
+xO*..
+-----
+
+:8,s,value(50)
+
+XxYaO
+xc*b.
+-----
+
+;lib(c) > 1 && !oplay_attack(*,a,b,*)
+
+
+Pattern A607a
+# gf Split pattern. (3.5.3)
+# gf Revised constraint. (3.5.4)
+# gf Comment: A607a and A607b could now be merged again but I think
+#    it may be handy for later revisions to keep them apart.
+
+XYO        there is death in the hane
+.*.
+---
+
+:8,s,value(36)
+
+XYa
+b*.
+---
+
+;owl_maxeye(b) > 0 && !oplay_attack(*,a) && !obvious_false_xeye(b)
+
+
+Pattern A607b
+# gf Split pattern and revised constraint. (3.5.3)
+# gf Reordered constraint for better performance. (3.5.4)
+
+.YO        there is death in the hane
+.*.
+---
+
+:8,s,value(36)
+
+.Ya
+b*.
+---
+
+;owl_maxeye(b)>0 && !oplay_attack(*,a) && !obvious_false_xeye(b)
+
+
+Pattern A607c
+# gf New pattern. (3.1.12)
+# gf Reordered constraint for better performance. (3.5.4)
+
+xYO        the push is also deadly
+.*O
+---
+
+:8,-,value(55)
+
+xYa
+b*a
+---
+
+;owl_eyespace(b) && !oplay_attack(*,b,a)
+
+
+Pattern A607d
+# gf New pattern. (3.5.4)
+# gf Comment: A607a and A607b could now be merged again but I think
+#    it may be handy for later revisions to keep them apart.
+
+?XYO        there is death in the hane
+o.*.
+----
+
+:8,s,value(36)
+
+dXYa
+cb*.
+----
+
+;owl_maxeye(b)==0
+;&& ((o_somewhere(c) && owl_lunch(c))
+;    || (o_somewhere(d) && owl_lunch(d)))
+;&& !oplay_attack(*,a) && !obvious_false_xeye(b)
+
+
+Pattern A608
+
+xYO        hane with atari on more than one stone
+.*.
+---
+
+:8,s,value(75)
+
+xCa
+b*.
+---
+
+;lib(C)==2 && wormsize(C)>1 && !oplay_attack(*,a) && !obvious_false_xeye(b)
+
+
+Pattern A609
+
+XOY         destroy eye
+.*.
+---
+
+:8,s,value(35)
+
+
+Pattern A610
+
+X.YO         try to damage eyespace in sente
+.*.?
+----
+
+:8,s,value(55)
+
+X.Ya
+.*.?
+----
+
+;!attack(a)
+
+
+Pattern A611
+
+?Ox?          placement where X cannot cut
+XY.X
+O.*.
+----
+
+:8,-,value(80)
+
+?Ox?
+AA.X
+O.*.
+----
+
+;lib(A)==2
+
+
+Pattern A612
+
+oOY?        threaten snapback to destroy eye
+OX.X
+*X.O
+----
+
+:8,-,value(60)
+
+oOY?
+OX.X
+*X.a
+----
+
+;lib(a) > 1
+
+
+Pattern A613
+
+X.X?        extra forceful hane
+..YO
+..*.
+----
+
+:8,-,value(65)
+
+X.D?
+.bDO
+.a*c
+----
+
+;oplay_attack(*,a,b,c,D)
+
+
+Pattern A614
+# gf New pattern. (3.1.15)
+
+XYO?        destroy eyespace when we can't capture
+..XO
+X.*.
+----
+
+:8,-,value(65)
+
+XYO?
+.aXO
+X.*.
+----
+
+;!oplay_attack(a,*,*)
+
+
+Pattern A615
+# tm New Pattern (3.1.15)
+
+OXYXO  attack shortage of liberties
+?...?
+?.*.?
+-----
+
+:|,s,value(65)
+
+OXAXO
+?...?
+?.*.?
+-----
+
+;lib(A) == 3
+
+
+# nn Removal candidate (3.3.13)
+#   Success rate in regressions : 0.75 % (2/268)
+
+Pattern A616
+# tm New Pattern (3.1.15)
+# tm Modified (3.1.17)
+
+?XOo|   special edge collapse
+?.Y.|
+?x.*|
+?x..|
+
+:8,s,value(45)
+
+?XCa|
+?.Y.|
+?b.*|
+?x..|
+
+; !attack(C)
+; && (!x_somewhere(b) || (x_somewhere(b) && o_somewhere(a)))
+
+
+Pattern A617
+# tm New Pattern (3.1.15)
+
+OY?    threaten snapback.
+X.X
+X.O
+X*.
+---
+
+:8,s,value(50)
+
+OY?
+A.X
+X.O
+X*.
+---
+
+; lib(A) == 3
+
+
+Pattern A618
+# tm New Pattern (3.1.17)
+
+XYO   falsify eye
+XOX
+X.*
+---
+
+:8,-,value(75)
+
+XYb
+XOX
+XA*
+---
+
+; oplay_defend_both(*,A,b,*)
+
+
+Pattern A619
+#tm New Pattern (3.1.17)
+
+|.Y
+|.*
++--
+
+:8,-,value(75)
+
+
+Pattern A620
+#evand New Pattern. (3.3.18)
+
+.YO    push in to destroy eyespace
+*Ox
+---
+
+:8,s,value(65)
+
+aYO
+*Ox
+---
+
+;!obvious_false_xeye(a)
+
+
+Pattern A621
+# spl added 3.3.22
+# gf Revised constraint. (3.5.3)
+
+?YOo? threaten to make ko or nakade
+X..*.
+-----
+
+:8,s,value(10)
+
+?AOo?
+X..*.
+-----
+
+;lib(A)<3 && owl_eyespace(*)
+
+
+Pattern A622
+# gf New pattern. (3.5.3)
+# Compare D704b. See nngs3:450.
+
+xY.O       half eye sometimes missed
+X.*o
+----
+
+:8,-,value(35)
+
+bYaO
+X.*o
+----
+
+; xplay_attack(*,a,a)
+; && (x_somewhere(b) || !safe_omove(b))
+
+
+Pattern A623
+# gf New pattern. (3.5.5)
+
+|.xY.O
+|....O     monkey jump into the corner
+|.*...
++-----
+
+:8,-,value(65)
+
+
+Pattern A626
+# gf New pattern. (3.7.3)
+
+??XXO?
+XX..XO       steal an eye
+.*.X.O
+------
+
+:8,s,value(75)
+
+??XXO?
+XX..XO
+a*.X.O
+------
+
+;owl_proper_eye(a)
+
+
+#########################################################
+#                                                       #
+#          Eye reducing moves in the center             #
+#                                                       #
+#########################################################
+
+
+Pattern A701
+
+?XOo        make atari
+X.YO
+x.*.
+
+:8,-,value(79)
+
+?AOo
+X.YO
+x.*.
+
+;lib(A)>1
+
+
+Pattern A702
+
+?XOo        make atari
+X.YO
+..*O
+??x?
+
+:8,-,value(80)
+
+?AOo
+X.YO
+..*O
+??x?
+
+;lib(A)>1
+
+
+Pattern A703
+
+?XX?       push in to limit eyeshape
+O*.Y
+?..x
+
+:8,-,value(80)
+
+
+Pattern A704
+
+?OY?         capture one stone
+OXOX
+.*.?
+
+:8,C,value(80)
+
+
+Pattern A705b
+
+?.?        attack eye shape
+X*Y
+?.?
+
+:8,C,value(61)
+
+?b?
+X*Y
+?a?
+
+;owl_eyespace(a) && xlib(b) <= 2 && oplay_attack(*,b,b)
+
+
+Pattern A706
+
+?*?
+X.X
+?Y.
+
+:8,C,value(70)
+
+?*?
+XaA
+?Yb
+
+; (owl_topological_eye(a,A)<=2) && (owl_topological_eye(b,A)==2)
+
+
+Pattern A707
+
+?O?
+X*X
+.Y.
+
+:8,C,value(70)
+
+?O?
+X*A
+aYb
+
+; (owl_topological_eye(a,A)==2)
+; && ((owl_topological_eye(b,A)==2) || (owl_topological_eye(b,A)==3))
+
+
+Pattern A708
+
+?Y*         attack eye with sente
+x.X
+?x?
+
+:8,n,value(80)
+
+?Y*
+xaB
+?x?
+
+;owl_topological_eye(a,B)==3 && does_attack(*,B)
+
+
+Pattern A709
+
+xX.         half eye sometimes missed
+Y.*
+?x?
+
+:8,C,value(45)
+
+xXb
+Aa*
+?x?
+
+; owl_topological_eye(a,A)==3
+; && safe_omove(b) && safe_omove(*) && xplay_attack(*,b,b)
+
+
+Pattern A710
+
+?Y*          kill a half eye with an atari
+x.X
+?x?
+
+:8,-,value(35)
+
+?A*
+xba
+?x?
+
+; lib(a)==2 && owl_topological_eye(b,A)==3
+
+
+Pattern A711
+
+O*.X        destroy eye
+X..X
+xXY?
+
+:8,C,value(35)
+
+
+Pattern A712
+
+?XX?       eye stealing tesuji
+...Y
+.*.X
+oo.?
+
+:8,C,value(60)
+
+
+Pattern A713
+
+OO?         destroy potential eye
+X.Y
+X.X
+x*x
+
+:8,-,value(45)
+
+bb?
+XaY
+X.X
+x*x
+
+;!attack(b) && xplay_attack(a,b)
+
+
+Pattern A714
+
+?XY?       capture to spoil eyespace
+O..X
+X*.x
+OX.x
+
+:8,C,value(82)
+
+?XY?
+O..X
+A*.x
+OX.x
+
+;lib(A)==1
+
+
+Pattern A715
+# gf New pattern. (3.1.11)
+# evand Modified. (3.3.18)
+
+?*YX        attack eye shape and possibly threaten to cut
+x..x
+?xXO
+
+:8,-,value(60)
+
+?*YX
+x..x
+?xXa
+
+;!owl_proper_eye(*) && !attack(a)
+
+
+Pattern A716
+# gf New pattern. (3.1.12)
+
+O*x          destroy eye in reverse sente
+X.X
+xYx
+
+:8,C,value(50)
+
+a*x
+X.X
+xYx
+
+;xplay_attack(*,a)
+
+
+Pattern A717
+# tm New Pattern (3.1.17)
+
+?.??
+XO*Y
+?X.X
+
+:8,Cs,value(75)
+
+?.??
+XO*Y
+?XAb
+
+; owl_big_eyespace(A)
+; && oplay_attack(*,b)
+
+
+Pattern A718
+# tm New Pattern (3.1.22) (see trevorc:1360)
+# see related general defense pattern D309a
+
+xYx?   reduce eye space 
+x.*O
+xXx?
+
+:8,C,value(50)
+
+xYx?
+x.*A
+xXx?
+
+; 1 || oplay_attack(*,A)
+
+
+Pattern A719
+# gf New pattern. (3.3.20)
+# gf Revised constraint. (3.5.2)
+
+?XYO   reduce eye space 
+X.*X
+?XX.
+
+:8,s,value(50)
+
+?XYc
+Xa*X
+?XXb
+
+;owl_mineye(*)==1 && xlib(b)==2 && !oplay_attack(*,c) && !oplay_attack(*,a,b,b)
+
+
+Pattern A719b
+# gf New pattern. (3.3.20)
+
+|XYO   reduce eye space 
+|.*X
+|XX.
+
+:8,s,value(50)
+
+|XYc
+|a*X
+|XXb
+
+;xlib(b)==2 && !oplay_attack(*,c) && !oplay_attack(*,a,b,b)
+
+
+Pattern A720
+# evand New pattern (3.3.20)
+
+?.??
+Y..x   Bamboo connection to reduce eyespace
+X*Ox
+?...
+?OO?
+
+:8,C,value(40)
+
+?c??
+Ya.x
+X*Ox
+?...
+?OO?
+
+;(owl_eyespace(a) || owl_eyespace(c))
+;&& oplay_attack(a,a) && xplay_attack(*,a)
+
+
+Pattern A721
+
+?XX.
+Y.*.
+?XX.
+
+:8,s,value(45)
+
+?XXe
+Yd*c
+?AAb
+
+;lib(A) == 3 && !obvious_false_xeye(d)
+;&& oplay_defend(*,b,c,*) && oplay_defend(*,e,c,*)
+;&& oplay_defend_both(*,c,b,d,e,b,e)
+
+
+#########################################################
+#                                                       #
+#            Invade the eye space                       #
+#                                                       #
+#########################################################
+#                                                       #
+#          These are patterns where a live stone        #
+#          is played where the opponent might get       #
+#          an eye. They do not include sacrifice        #
+#          patterns.                                    #
+#                                                       #
+#########################################################
+
+
+Pattern A801
+
+?xYx       attack chimera
+xX.X
+X.*O
+----
+
+:8,n,value(80)
+
+
+Pattern A802
+
+xYx       destroy eye
+X.X
+.*O
+---
+
+:8,n,value(50)
+
+
+Pattern A803
+# tm modified(3.1.16)
+
+xxX?      connect under
+oOYO
+..*.
+----
+
+:8,-,value(80)
+
+xxX?
+oAYO
+..*.
+----
+
+; attack(A) && !oplay_attack(*,A)
+
+
+Pattern A804
+
+.YO?        connect out on first line
+O*oo
+----
+
+:8,-,value(45)
+
+.YO?
+A*oo
+----
+
+; does_attack(*,A)
+
+
+Pattern A805
+
+XxxX?       connect under
+.oOYO
+...*.
+-----
+
+:8,-,value(60)
+
+
+Pattern A806
+
+O..Y        clamp
+OX*.
+....
+----
+
+:8,C,value(75)
+
+
+Pattern A807
+
+?X.         connect under
+OY*
+.O.
+---
+
+:8,-,value(65)
+
+
+Pattern A808
+
+|.OYO        avoid leaving ko by connecting on the outside
+|*XO.
++----
+
+:8,-,value(60)
+
+
+Pattern A809
+
+XX.O?       connect out
+O.YO?
+O.*..
+-----
+
+:8,-,value(80)
+
+XX.O?
+A.YO?
+A.*..
+-----
+
+; lib(A)>2
+
+
+Pattern A810
+# This looks a little weird. /ab
+
+?O?
+X.Y        safe invasion into eye
+?*?
+
+:8,-,value(45)
+
+?O?
+X.Y
+?*?
+
+;owl_eyespace(*)
+
+
+Pattern A811
+#tm New Pattern (3.1.17)
+
+.X?    
+X.Y
+.*X
+
+:8,s,value(65)
+
+aX?
+XbC
+.*X
+
+; lib(C) <= 3
+; && owl_proper_eye(a)
+; && owl_proper_eye(b)
+
+
+Pattern A812
+
+.Y?    clamp to invade eyespace
+..O
+*XO
+..o
+---
+
+:8,C,value(40)
+
+.Y?
+..O
+*XO
+..o
+---
+
+;owl_eyespace(*)
+
+
+Pattern A813
+#spl added 3.5.1 see century2002:80
+# gf Revised constraint. (3.5.1)
+
+X*.
+OYO sacrifice to eliminate eye
+.X.
+---
+
+:8,Cs,value(85)
+
+X*.
+aYb
+cXd
+---
+
+;(!attack(a) && olib(d)>=3)
+;|| (!attack(b) && olib(c)>=3)
+
+
+Pattern A814
+# gf New pattern. (3.7.2)
+# See ld_owl:321.
+
+X..        try to squeeze eyespace
+OY*
+?X.
+---
+
+:8,s,value(35)
+
+X..
+OB*
+?Ba
+---
+
+;lib(B) == 3 && owl_big_eyespace(*) && olib(*)>2 && olib(a)>1
+
+
+#########################################################
+#                                                       #
+#                Nakade patterns                        #
+#                                                       #
+#########################################################
+#                                                       #
+#          These are patterns where a sacrifice stone   #
+#          is played in the opponent's eye space to     #
+#          prevent two eyes. Use the s (sacrifice)      #
+#          classification                               #
+#                                                       #
+#########################################################
+
+
+Pattern A901
+
+|X???
+|OXYX         connect corner ko to make nakade
+|*O.X
++----
+
+:8,s,value(70)
+
+
+Pattern A902
+
+XOY           nakade trick
+O*O
+---
+
+:8,s,value(70)
+
+XbY
+a*c
+---
+
+;lib(a)==1 && lib(b)==1 && lib(c)<=2
+
+
+Pattern A902b
+
+XOY           nakade trick
+O*O
+---
+
+:8,s,value(30)
+
+XbY
+a*c
+---
+
+;lib(a)<=2 && lib(b)==1 && lib(c)<=2
+
+
+Pattern A903
+
+|xYX?
+|.O.X         try to make nakade
+|..*.
++----
+
+:8,s,value(35)
+
+
+Pattern A904
+
+|OX?        try to form nakade
+|XOY
+|*.x
++---
+
+:8,s,value(55)
+
+|aB?
+|XOY
+|*.x
++---
+
+;lib(a) == 1 && lib(B) > 1
+
+
+Pattern A905
+# gf Increased value slightly. (3.1.14)
+
+|O.X        try to form nakade
+|XOY
+|*..
++---
+
+:8,s,value(36)
+
+
+Pattern A906a
+# gf New pattern. (3.5.3)
+# See seki:303.
+
+|X???
+|.YX?
+|XO.X         try to make ko
+|*.O.
++----
+
+:8,s,value(32)
+
+|Xa??
+|.YX?
+|XO.X
+|*.O.
++----
+
+;!o_somewhere(a) || !defend(a)
+
+
+Pattern A906b
+# gf New pattern. (3.5.3)
+# See seki:303.
+
+|X???
+|.YX?
+|.OXX         try to make ko
+|*.O.
++----
+
+:8,s,value(32)
+
+|Xa??
+|.YX?
+|.OXX
+|*.O.
++----
+
+;!o_somewhere(a) || !defend(a)
+
+
+Pattern A907
+
+|.X??
+|OYX?        critical point, might kill
+|*.Xx
+|....
++----
+
+:8,s,value(65)
+
+|.X??
+|aYX?
+|*.Xx
+|....
++----
+
+;!defend(a)
+
+
+Pattern A908
+
+|X???       nakade if ko can be won
+|OYX?       
+|.OX?
+|O*.X
++----
+
+:8,s,value(35)
+
+|X???
+|OYX?
+|.OX?
+|O*aX
++----
+
+;xlib(a) == 2
+
+
+Pattern A909
+
+|.X?        capture to form nakade
+|OYX       
+|XOX
+|*O.
++---
+
+:8,s,value(35)
+
+
+Pattern A910
+# gf Revised constraint. (3.5.3)
+
+XYX|          try nakade in corner
+.*.|
+---+
+
+:8,s,value(25)
+
+XYX|
+a*.|
+---+
+
+;!obvious_false_xeye(a) && owl_maxeye(*)>1
+
+
+Pattern A911
+
+Y.Xo|          try nakade
+X.*.|
+----+
+
+:8,s,value(25)
+
+A.Xo|
+A.*.|
+----+
+
+;lib(A)==2
+
+
+Pattern A912
+
+OYOo       destroy eyespace
+X.XO
+.*..
+----
+
+:8,s,value(35)
+
+
+Pattern A913
+
+XY.X         try sente eyeshape reduction
+X.*.
+----
+
+:8,s,value(80)
+
+AAbX
+A.*.
+----
+
+;lib(A)==2 && !safe_omove(b)
+
+
+Pattern A914
+
+XY.X            try nakade 
+X.*.
+----
+
+:8,s,value(25)
+
+XYaX
+X.*.
+----
+
+;!safe_omove(a)
+
+
+Pattern A915
+
+X.Yoo      destroy eyespace
+.*.Xo
+.....
+-----
+
+:8,s,value(85)
+
+X.Yao
+.*.Xb
+.....
+-----
+
+;o_somewhere(a,b)
+
+
+Pattern A916
+
+??Yx        play inside to kill one eye
+XX.X
+..*.
+----
+
+:8,s,value(65)
+
+
+Pattern A917
+
+?X??        always worth considering
+X.Y?
+?*.X
+??X?
+
+:/,s,value(45)
+
+
+Pattern A918
+# gf New pattern. (3.1.14)
+
+?X??        always worth considering
+X.Y?
+?*.X
+????
+
+:8,s,value(40)
+
+
+Pattern A919
+# evand New pattern. (3.3.20)
+
+o?XX??
+OX..Y?
+..*..x
+------
+
+:8,s,value(35)
+
+
+Pattern A920
+# evand New pattern. (3.3.20)
+
+?XX??
+X..Y?
+xO*.x
+-----
+
+:8,s,value(35)
+
+
+Pattern A921
+# gf New pattern. (3.7.1)
+# See ld_owl:320.
+
+?XX??
+X.*Y?
+xO..x
+-----
+
+:8,s,value(30)
+
+?XX??
+X.*A?
+xO..x
+-----
+
+;oplay_defend(*,A)!=WIN
+
+
+#########################################################
+#                                                       #
+#                        Cuts                           #
+#                                                       #
+#########################################################
+
+
+Pattern A1001
+
+YO          cut if safe
+*X
+
+:8,Cn,value(80)
+
+Ba
+*C
+
+;(owl_escape_value(B)>0 || owl_escape_value(C)>0)
+;&& !oplay_attack_either(*,*,a)
+
+
+Pattern A1001b
+# Sometimes cut of small useless tail 
+# i.e.:  gq -l games/niki.sgf -L 158 --decide-dragon S8 -o x.sgf
+
+YO          cut if safe
+*X
+
+:8,Cn,value(50)
+
+Ya
+*X
+
+; !oplay_attack_either(*,*,a)
+
+
+Pattern A1002
+
+????
+?*.X     threaten to cut
+??YO
+
+:8,C,value(75)
+
+????
+?*aX
+??Yc
+
+; !safe_omove(a) && !oplay_attack_either(*,?,a,a,c) && !oplay_attack(*,a,*)
+
+
+Pattern A1003
+
+????
+?*.X     threaten to cut
+??YO
+
+:8,C,value(55)
+
+????
+?*aX
+??Yc
+
+; !safe_omove(a) && !oplay_attack_either(*,?,a,a,c)
+
+
+Pattern A1005
+
+Y?          cut!
+*O
+.X
+
+:8,C,value(90)
+
+Y?
+*b
+aC
+
+;owl_escape_value(C)>0 && xplay_attack_either(*,a,a,b)
+
+
+Pattern A1005b
+# gf Need to consider both directions. (3.3.13)
+
+X?          cut!
+*O
+.Y
+
+:8,C,value(90)
+
+C?
+*b
+aY
+
+;owl_escape_value(C)>0 && xplay_attack_either(*,a,a,b)
+
+
+Pattern A1006
+
+XOY        push out
+.*.
+?.?
+
+:8,C,value(70)
+
+
+Pattern A1006b
+# gf New pattern. (3.1.12)
+
+XOY        push out in reverse sente
+.*.
+?.?
+
+:8,C,value(75)
+
+XaY
+.*.
+?.?
+
+;lib(a) <= 2
+
+
+Pattern A1008
+
+X*Y      stop connection
+?O?
+
+:8,C,value(80)
+
+a*b
+?O?
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern A1008b
+# tm Modified (3.1.22)  (see trevorc:810)
+
+ooo
+X*Y      stop connection
+O.?
+
+:8,C,value(80)
+
+ooo
+a*b
+Oc?
+
+;(owl_escape_value(a)>0 || owl_escape_value(b)>0)
+; && oplay_attack(*,c,c)
+
+
+Pattern A1009
+
+XO*Y         stop connection underneath
+....
+----
+
+:8,C,value(55)
+
+XO*Y
+.a..
+----
+
+;xplay_attack(*,a,a)
+
+
+Pattern A1010
+
+Y.O        cut and capture to destroy eyespace
+.*X
+...
+---
+
+:8,C,value(75)
+
+YaO
+.*B
+...
+---
+
+;oplay_attack(*,a,B)
+
+
+Pattern A1011
+
+XOY      stop connection underneath
+x*x
+---
+
+:8,C,value(80)
+
+aOb
+x*x
+---
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern A1012
+
+X.??          cut
+OY*O
+oOX?
+
+:8,C,value(45)
+
+Xa??
+OY*O
+obX?
+
+; !safe_omove(a) && lib(b)>1
+
+
+Pattern A1013
+# tm New pattern. (3.1.13)
+# see owl:229
+
+?O?         enclose!
+Y..
+X*?
+
+:8,-,value(10)
+
+?c?
+YAb
+X*?
+
+; owl_escape_value(b)>0
+; && oplay_defend_both(*,A,b,c,b)
+; && oplay_defend_both(*,A,b,b,*)
+
+
+Pattern A1014
+# gf New pattern. (3.1.14)
+
+xx..Ox        stop connection underneath
+...*Y.
+------
+
+:8,C,value(55)
+
+AB..Ox
+...*Y.
+------
+
+;x_somewhere(A,B) && owl_escape_value(A) + owl_escape_value(B) > 0
+
+
+Pattern A1015
+
+X.*Y   cut!
+X..X
+
+:8,C,value(75)
+
+Ae*B
+AfgB
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && oplay_defend_both(*,g,f,e,f,*)
+
+
+Pattern A1015a
+
+Y.*X   cut!
+X..X
+
+:8,C,value(75)
+
+Ae*B
+AfgB
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && oplay_defend_both(*,g,f,e,f,*)
+
+
+Pattern A1016
+# gf New pattern. (3.1.22)
+# Converse to D1376. See lazarus:114 for an example.
+
+YxO?
+o.*X
+----
+
+:8,C,value(75)
+
+Bde?
+oc*A
+----
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && ((x_somewhere(d) && xplay_attack_either(*,c,c,e))
+;     || (!x_somewhere(d) && !xplay_defend_both(*,c,d,c,e)))
+
+
+Pattern A1016a
+# gf New pattern. (3.1.22)
+# Converse to D1376. See lazarus:114 for an example.
+
+XxO?
+o.*Y
+----
+
+:8,C,value(75)
+
+Bde?
+oc*A
+----
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && ((x_somewhere(d) && xplay_attack_either(*,c,c,e))
+;     || (!x_somewhere(d) && !xplay_defend_both(*,c,d,c,e)))
+
+
+Pattern A1017
+# nn New pattern (3.3.11)
+# gf Revised constraint, see owl1:354. (3.7.3)
+
+X.*o     threaten to cut and mess up opponent's shape
+xY.X
+
+:8,C,value(65)
+
+X.*b
+xYaC
+
+;!oplay_attack(*,a,*)
+;&& (o_somewhere(b) || !oplay_attack(*,b,*))
+;&& !attack(C)
+
+
+Pattern A1018
+# nn New pattern (3.3.11)
+
+O.Y      separate
+.*.
+X.o
+
+:8,C,value(35)
+
+
+Pattern A1019
+# nn New pattern (3.3.11)
+
+.o.O     cut / prevent escape
+X...
+.*.Y
+
+:8,C,value(65)
+
+.fgO
+Xbde
+.*cA
+
+;!owl_goal_dragon(A) && !oplay_attack_either(*,b,c,d,e,c,e)
+;&& (o_somewhere(f) || !oplay_attack_either(*,d,b,f,g,b,g))
+
+
+Pattern A1020
+# nn New pattern (3.3.11)
+#   FIXME: constraint is ugly
+
+ooooo      try to cut off and kill the moyo reducing stone
+....o
+....o
+.Y..o
+*...o
+
+:/,-,value(45)
+
+abcde
+....f
+....g
+.Y..h
+*...i
+
+;(owl_escape_value(a)>0) + (owl_escape_value(b)>0)
+;+(owl_escape_value(c)>0) + (owl_escape_value(d)>0)
+;+(owl_escape_value(e)>0) + (owl_escape_value(f)>0)
+;+(owl_escape_value(g)>0) + (owl_escape_value(h)>0)
+;+(owl_escape_value(i)>0) < 2
+
+
+Pattern A1021
+# gf New pattern. (3.3.17)
+
+??O      cut off from friendly stone
+Y*X
+?O.
+
+:8,-,value(45)
+
+??O
+B*A
+?O.
+
+;!owl_goal_dragon(A) && !oplay_connect(*,A,B)
+
+
+Pattern A1022
+# evand New pattern. (3.3.18)
+
+oY.O
+..*.
+.X.X
+...o
+
+:8,C,value(55)
+
+oA.O
+..*.
+.X.B
+...o
+
+;!oplay_connect(*,A,B)
+
+
+Pattern A1023
+# evand New pattern. (3.3.18)
+
+?Xx?
+O*.?
+?..?
+xYxx
+
+:8,C,value(45)
+
+?Bx?
+O*a?
+?..?
+xCxx
+
+;oplay_disconnect(*,a,B,C)
+
+
+Pattern A1024a
+# gf New pattern. (3.5.4)
+# gf Revised pattern. (3.7.3)
+# Converse to D1386a
+
+YO.?       connect along edge to strong dragon
+x*.X
+----
+
+:8,CEb,value(90)
+
+AO.?
+x*.B
+----
+
+;owl_strong_dragon(B) && !xplay_disconnect(*,A,B)
+
+
+Pattern A1024b
+# gf New pattern. (3.5.4)
+# Converse to D1386a
+
+XO.o       connect along edge to strong dragon
+x*.Y
+----
+
+:8,Eb,value(90)
+
+BO.o
+x*.A
+----
+
+;owl_strong_dragon(B) && !xplay_disconnect(*,A,B)
+
+
+#########################################################
+#                                                       #
+#              Reinforce the perimeter                  #
+#                                                       #
+#########################################################
+#                                                       #
+#   Patterns where the perimeter is already in place    #
+#   but has a defect which needs repair.                #
+#                                                       #
+#########################################################
+
+
+Pattern A1100
+#tm New Pattern (3.1.22) (see pattern D1100)
+# gf Fixed diagram inconsistency. (3.1.23)
+
+XO         defend connect out
+.*
+OY
+
+:8,-,value(90)
+
+cb
+a*
+OY
+
+;owl_escape_value(c)>0 && xplay_attack_either(*,a,a,b)
+
+
+Pattern A1101
+
+...
+O*O
+?Y?
+
+:|,-,value(93)
+
+.a.
+b*c
+?Y?
+
+; xplay_break_through(*,a,b,a,c) == WIN
+
+
+Pattern A1101b
+
+...
+O*O
+?Y?
+
+:|,-,value(94)
+
+.a.
+b*c
+?Y?
+
+; lib(b)<=4 && lib(c)<=4 && xplay_break_through(*,a,b,a,c) == WIN
+
+
+Pattern A1101c
+# New Pattern (before 3.1.20 - when?)
+#   see strategy3:150 for wasted move.
+#   see also lazarus:5
+# tm Modified (3.1.22)
+
+O*O   connect against threat
+?Y?
+
+:8,-,value(81)
+
+A*B
+?Y?
+
+; vital_chain(A) && vital_chain(B)
+; && !xplay_defend_both(*,A,B)
+
+
+Pattern A1102
+
+..X
+O*O
+?Y?
+
+:8,C,value(95)
+
+baX
+c*O
+?Y?
+
+;!xplay_defend_both(*,a,b,a,c)
+
+
+Pattern A1104
+
+OYO        connect to prevent double atari
+XO*
+...
+
+:8,C,value(85)
+
+OYB
+AO*
+.a.
+
+; xplay_attack(*,a,B) && !oplay_defend(*,A)
+
+
+Pattern A1105
+# gf Added n classification. (3.3.20)
+
+O..
+XO*        connect against double threat
+xYO
+x..
+---
+
+:8,Cn,value(85)
+
+Oa.
+XO*
+xAb
+x..
+---
+
+;!attack(A) && xplay_attack(*,a,b)
+
+
+Pattern A1106
+
+OO.?
+XOX*       capture cutting stone to defend
+xYO.
+xx..
+----
+
+:8,C,value(70)
+
+OO.?
+XOB*
+xAa.
+xx..
+----
+
+;!attack(A) && attack(a) && !oplay_defend(*,B)
+
+
+# tm Moved to owl_vital_apats (3.1.17)
+# tm copied back from owl_vital_apats (3.1.22)
+#      suspect that vital_chain works differently called from there??? -tm
+#      see 13x13:52 --decide-dragon K10
+Pattern A1107
+# spl never on edge (3.3.23)
+
+???          defend the surrounding chain
+O*?
+YO?
+
+:/,-,value(95)
+
+???
+a*?
+Yb?
+
+; vital_chain(a) && vital_chain(b)
+; && !xplay_defend_both(*,a,b)
+
+
+Pattern A1107b
+# gf New pattern. (3.1.9)
+# tm Modified (3.1.17) - took away from edge
+
+??          defend the surrounding chain
+*.
+O.
+YO
+
+:8,-,value(96)
+
+??
+*.
+ba
+Yc
+
+;lib(c)>2 && vital_chain(b) && vital_chain(c)
+;&& oplay_attack(*,a,a) && !xplay_defend_both(a,b,c)
+
+# nn Removal candidate (3.3.13)
+#   Success rate in regressions : 0.9 % (23/2562)
+
+Pattern A1107c
+# tm New pattern. (3.1.17)
+# tm Modified (3.1.20) - reduced value (see nngs:320)
+
+.*       defend the surrounding chain
+O.
+YO
+
+:8,-,value(60)
+
+.*
+ba
+Yc
+
+;lib(c)>2 && vital_chain(b) && vital_chain(c)
+;&& oplay_attack(*,a,a) && !xplay_defend_both(a,b,c)
+
+
+Pattern A1108
+
+?XO         don't let defender capture to escape
+*OY
+
+:8,-,value(80)
+
+?BO
+*aY
+
+;owl_escape_value(B) > 0 && does_defend(*,a)
+
+
+Pattern A1109
+
+?Xx??       connect underneath
+?OYoo
+O.*..
+.....
+-----
+
+:8,C,value(65)
+
+?Xx??
+?cYab
+O.*..
+.....
+-----
+
+; o_somewhere(a,b) && attack(c)
+
+
+Pattern A1110
+
+o..YO?       connect underneath
+O.*Ooo
+------
+
+:8,-,value(50)
+
+
+Pattern A1111
+
+?.x..|      defend bottom while emphasizing top
+.OXX.|
+.*OY.|
+?..O.|
+??...|
+
+:8,-,value(65)
+
+
+Pattern A1112
+#    Strict speaking we should not need patterns
+#    like this
+
+X.*O         save lunch
+YO..
+....
+----
+
+:8,-,value(50)
+
+X.*O
+Ya..
+....
+----
+
+; attack(a)
+
+
+Pattern A1113
+# gf New pattern. (3.1.9)
+
+xYO.?      reinforce
+?*..?
+O.O.?
+...x?
+?????
+
+:8,-,value(70)
+
+xYO.?
+?*..b
+O.O.?
+...x?
+?a???
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern A1114
+# gf New pattern. (3.1.9)
+
+xxO.?       reinforce
+?Y*.?
+O.O.?
+...x?
+?????
+
+:8,-,value(81)
+
+xxO.?
+?Y*.b
+O.O.?
+...x?
+?a???
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern A1115
+# gf New pattern. (3.1.9)
+
+xxO.       reinforce
+?YXO
+O*O.
+...x
+
+:8,-,value(81)
+
+
+Pattern A1116
+# gf New pattern. (3.1.9)
+
+?X?          Reinforce
+OYO
+*OX
+xxx
+
+:8,C,value(90)
+
+?X?
+aDO
+*bX
+xCx
+
+;owl_escape_value(C)>0 && owl_goal_dragon(D) && !xplay_defend_both(*,a,b)
+
+
+Pattern A1117
+# gf New pattern. (3.1.11)
+
+X*O         don't let defender cut and capture to escape
+?OY
+
+:8,Cn,value(80)
+
+X*b
+?aY
+
+;!xplay_defend_both(*,a,b)
+
+
+Pattern A1117a
+# Same as A1117; different anchor.
+
+Y*O         don't let defender cut and capture to escape
+?OX
+
+:8,Cn,value(80)
+
+Y*b
+?aX
+
+;!xplay_defend_both(*,a,b)
+
+
+Pattern A1118
+# tm New pattern (3.1.17)
+
+YO?           defend
+OX*
+...
+---
+
+:8,-,value(75)
+
+YO?
+AX*
+...
+---
+
+; attack(A) && !oplay_attack(*,A)
+
+
+Pattern A1119
+# tm New Pattern (3.1.17)
+#   analog to defense pattern D1348
+# tm Modified (3.1.18)  (see trevorc:100)
+# tm Modified (3.1.22)  (see trevorc:810)
+
+Y*?        cut off escape route.
+o.X
+
+:8,Cn,value(36)
+
+a*E
+Dcb
+
+;(owl_escape_value(a)>0 || owl_escape_value(b)>0)
+;&& ((o_somewhere(E) || x_somewhere(E)) || owl_escape_value(a) < 0)
+;&& !oplay_attack_either(*,c,D,*,D)
+
+
+Pattern A1121
+# tm New Pattern (3.1.20)  
+#   see also Pattern D1361 (both this and that are too generic)
+#   see trevorc:550, trevor:1050
+# gf Added constraint. (3.1.32)
+
+O.O         block to protect weakness
+Y*.
+?O?
+
+:8,C,value(35)
+
+a.b
+Y*.
+?c?
+
+;!same_string(a,b) && (lib(a) <= 4 || lib(b) <= 4 || lib(c) <= 4)
+
+
+Pattern A1122
+# tm New Pattern (3.1.22)
+#   see -l games/trevor/auto/d02.sgf -L 142 --decide-dragon P2
+# gf Revised constraint. (3.7.11)
+
+Y.
+*.
+.X
+
+:8,-,value(75)
+
+a.
+*.
+.b
+
+;!owl_goal_dragon(b) && !oplay_connect(*,a,b)
+
+
+Pattern A1122a
+# same as A1122 - different anchor.
+# gf Revised constraint. (3.7.11)
+
+X.
+*.
+.Y
+
+:8,-,value(75)
+
+a.
+*.
+.b
+
+;!owl_goal_dragon(a) && !oplay_connect(*,a,b)
+
+
+Pattern A1122b
+# gf New Pattern. (3.7.11)
+
+Y.
+*.
+.X
+
+:8,C,value(76)
+
+a.
+*.
+.b
+
+;lib(a) == 2 && !oplay_connect(*,a,b)
+
+
+Pattern A1123
+# tm New Pattern (3.1.22) (see D1376)
+# FIXME: duplicate of A1016
+
+YxO?
+o.*X
+----
+
+:8,-,value(75)
+
+bdE?
+oc*a
+----
+
+; (owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
+; && xplay_attack_either(*,c,d,c,E)
+
+
+Pattern A1123a
+# Same as A1123 - different anchor.
+
+XxO?
+o.*Y
+----
+
+:8,-,value(75)
+
+bdE?
+oc*a
+----
+
+; (owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
+; && xplay_attack_either(*,c,d,c,E)
+
+
+Pattern A1124
+# tm New Pattern (3.1.22) (see nngs:770 decide-dragon K4)
+#   see also D1140
+# ab Revised constraint. (3.3.10)
+
+?OY
+?.*
+???
+
+:8,-,value(70)
+
+?AY
+bd*
+?c?
+
+;(owl_escape_value(c) > 0
+; || owl_escape_value(b) > 0)
+;&& oplay_defend_both(*,d,A,*)
+
+
+Pattern A1124a
+# tm New Pattern (3.1.22) (see nngs:770 decide-dragon K4)
+#   see also D1140
+# gf Revised. Might still be too general. (3.5.4)
+# spl revised (3.5.5)
+
+?OY
+x*.
+xxx
+
+:8,-,value(70)
+
+?AY
+b*e
+cdx
+
+;(owl_escape_value(d) > 0
+; || owl_escape_value(b) > 0
+; || owl_escape_value(c) > 0)
+;&& !oplay_defend_both(e,*,A,e)
+
+
+Pattern A1124b
+# gf New pattern. (3.5.4) (see nngs:770 decide-dragon K4)
+
+?OY
+x.*
+xx?
+
+:8,C,value(70)
+
+?OA
+be*
+cd?
+
+;(owl_escape_value(d) > 0
+; || owl_escape_value(b) > 0
+; || owl_escape_value(c) > 0)
+;&& xplay_connect(e,*,e,A)
+;&& oplay_disconnect(*,e,e,A)
+
+
+Pattern A1125
+# tm New Pattern (3.1.22)  (see D1118)
+
+xxx?     defend threaten of escape
+O*O?
+XOYo
+?X.?
+
+:8,C,value(76)
+
+
+Pattern A1126
+# tm New Pattern (3.1.23)
+# gf Revised constraint. (3.5.3)
+# See also D1378.
+
+O*O   prevent breakout & attack
+?Y?
+
+:|,-,value(55)
+
+a*b
+?Y?
+
+; vital_chain(a) && vital_chain(b)
+; && xplay_attack_either(*,a,b) && !xplay_connect(*,a,b)
+
+
+Pattern A1127
+# tm New Pattern (3.1.23)  (see Pattern D1001)
+#   Note: there's no reason to cut the goal dragon up.
+
+O*X       prevent connection
+?YO
+
+:8,n,value(70)
+
+O*b
+?cA
+
+; (attack(A) != WIN || (wormsize(A)<=2 && does_attack(*,A)))
+; && (!owl_goal_dragon(b) || !owl_goal_dragon(c))
+
+
+Pattern A1127a
+# Same as A1127 - different anchor.
+
+O*Y       prevent connection
+?XO
+
+:8,n,value(70)
+
+O*b
+?cA
+
+; (attack(A) != WIN || (wormsize(A)<=2 && does_attack(*,A)))
+; && (!owl_goal_dragon(b) || !owl_goal_dragon(c))
+
+
+Pattern A1128
+# tm New Pattern (3.1.23)
+#   see also CB14
+
+OY*X   cut off from home
+X.X.
+
+:8,C,value(80)
+
+Ob*a
+XcXd
+
+; owl_escape_value(a) > 0
+; && oplay_attack(*,b)
+; && !oplay_attack(*,c,d,d)
+
+
+Pattern A1129
+# tm New Pattern (3.1.23) (see D1123)
+
+xO*x      stop break through
+XYO.
+XO..
+O..?
+
+:8,C,value(86)
+
+xB*x
+XYOa
+XO..
+O..?
+
+;xplay_attack(*,a,B)
+
+
+Pattern A1130
+# nn New pattern (3.3.11)
+#   FIXME: should be constrained
+
+...o?     to be considered in crosscut cases like this
+...Ox
+.*.OX
+..XYO
+...o?
+
+:8,C,value(65)
+
+
+Pattern A1131
+# gf New pattern. (3.3.18)
+
+XO.Y
+?*.?
+----
+
+:8,-,value(90)
+
+AO.B
+?*.?
+----
+
+;owl_strong_dragon(A) && !xplay_disconnect(*,A,B)
+
+
+Pattern A1132
+# gf New pattern. (3.3.18)
+
+|.O??        save one lunch and make one a false eye
+|OYX?
+|*OXX
+|..OX
++----
+
+:8,-,value(70)
+
+
+Pattern A1133a
+# evand New pattern. (3.3.20)
+
+?O.Y
+?..x
+?.*.
+?..O
+????
+
+:8,-,value(65)
+
+?O.Y
+?..x
+a.*.
+b..O
+cd??
+
+;owl_escape_value(a) + owl_escape_value(b) +
+;owl_escape_value(c) + owl_escape_value(d) > 0
+
+
+Pattern A1133b
+# evand New pattern. (3.3.20)
+
+?O.Y
+?.*.
+?...
+?..O
+????
+
+:8,-,value(45)
+
+?O.Y
+?.*.
+a...
+b..O
+cd??
+
+;owl_escape_value(a) + owl_escape_value(b) +
+;owl_escape_value(c) + owl_escape_value(d) > 0
+
+
+Pattern A1134
+# pp New pattern (3.5.3).  See trevorb:120.
+# FIXME: is it better to do this algorithmically with owl boundaries?
+# gf Added explicit anchoring. (3.5.3)
+
+XOY        prevent escaping by capturing
+.*O
+---
+
+:8,C,value(75)
+
+BOY
+.*a
+---
+
+; lib(a) == 1 && owl_escape_value(B) > 0
+
+
+Pattern A1134b
+# gf New pattern. (3.5.3).
+
+YOX        prevent escaping by capturing
+.*O
+---
+
+:8,C,value(75)
+
+YOB
+.*a
+---
+
+; lib(a) == 1 && owl_escape_value(B) > 0
+
+
+Pattern A1134c
+# gf New pattern. (3.5.3).
+
+XOY        prevent escaping by capturing
+.*O
+---
+
+:8,C,value(40)
+
+XOY
+.*a
+---
+
+; lib(a) == 1
+
+
+Pattern A1134d
+# gf New pattern. (3.5.3).
+# See 13x13b:23
+
+YOX        prevent escaping by capturing
+.*O
+---
+
+:8,C,value(40)
+
+YOX
+.*a
+---
+
+; lib(a) == 1
+
+
+Pattern A1135
+# gf New pattern. (3.5.3)
+
+..OY
+X.*.
+----
+
+:8,-,value(75)
+
+..OB
+A.*.
+----
+
+;owl_escape_value(A)>0 && !xplay_disconnect(*,A,B) && !oplay_connect(*,A,B)
+
+
+Pattern A1136
+# gf New pattern. (3.5.3)
+
+?Y?
+O*O
+..?
+?X?
+
+:8,-,value(75)
+
+?B?
+O*O
+..?
+?A?
+
+;owl_escape_value(A)>0 && !xplay_disconnect(*,A,B) && !oplay_connect(*,A,B)
+
+
+Pattern A1137
+# gf New pattern. (3.5.3)
+# Converse to D1125.
+
+xxx?
+...x
+.*O.
+?YXO
+
+:8,-,value(79)
+
+abc?
+...x
+.*O.
+?YXO
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern A1138
+# gf New pattern. (3.5.5)
+
+xx.??
+xx.O?
+..*OY
+...X.
+-----
+
+:8,-,value(30)
+
+
+Pattern A1139
+# gf New pattern. (3.5.7)
+
+.OYx        
+*XOX
+o..O
+??O?
+
+:8,-,value(60)
+
+.dYx
+*XOX
+oabc
+??O?
+
+;oplay_attack(b,d) && oplay_attack(*,a,a)
+;&& oplay_attack(*,b,?,a,a) && !oplay_attack(*,b,c)
+
+
+Pattern A1140a
+# gf New pattern. (3.7.4)
+# See gunnar:73.
+
+?XOY
+XO*o
+----
+
+:8,-,value(40)
+
+?AOB
+XO*o
+----
+
+;owl_escape_value(A) > 0 && xplay_disconnect(*,A,B) != WIN
+
+
+Pattern A1140b
+# gf New pattern. (3.7.4)
+# See gunnar:76.
+
+?YOX
+XO*o
+----
+
+:8,-,value(40)
+
+?AOB
+XO*o
+----
+
+;owl_escape_value(B) > 0 && xplay_disconnect(*,A,B) != WIN
+
+
+Pattern A1141
+# gf New Pattern. (3.7.11)
+
+OO?
+Y.O
+*.o
+.X?
+
+:8,C,value(76)
+
+OO?
+a.O
+*.o
+.b?
+
+;!oplay_connect(*,a,b)
+
+
+Pattern A1141b
+# gf New Pattern. (3.7.11)
+
+OO?
+X.O
+*.o
+.Y?
+
+:8,C,value(76)
+
+OO?
+a.O
+*.o
+.b?
+
+;!oplay_connect(*,a,b)
+
+
+#########################################################
+#                                                       #
+#       Kill or threaten a worm of the dragon           #
+#                                                       #
+#########################################################
+
+
+Pattern A1201
+
+?O?          capture one stone to rescue
+*YO
+
+:8,-,value(75)
+
+?a?
+*BO
+
+; (lib(a)==1) && (lib(B)==1)
+
+
+Pattern A1203
+
+?*?         capture 3 stones
+OYO
+
+:8,s,value(80)
+
+?*?
+OAO
+
+;wormsize(A)>3 && lib(A)==1
+
+
+Pattern A1204
+
+?*?         capture 1 or two stones
+OYO
+
+:8,s,value(30)
+
+?*?
+OAO
+
+;wormsize(A)<=3 && lib(A)==1 && olib(*) > 1
+
+
+Pattern A1205
+
+*Y          kill one string!
+XO
+
+:8,s,value(75)
+
+*Y
+AO
+
+;wormsize(A)>3 && does_attack(*,A)
+
+
+Pattern A1206
+
+*Y          kill one string, possibly with ko!
+XO
+
+:8,Cs,value(30)
+
+*Y
+AO
+
+;wormsize(A)<=3 && does_attack(*,A)
+;&& (olib(*) > 1 || ko(*))
+
+
+Pattern A1207
+
+..X         attack one stone
+.*Y
+.XO
+
+:8,C,value(45)
+
+..X
+.*Y
+.AO
+
+; does_attack(*,A)
+
+
+Pattern A1208
+
+?Ooo       cut off one stone
+Y..o
+.*XO
+....
+----
+
+:8,C,value(40)
+
+
+Pattern A1209
+
+OYX*
+.O..
+----
+
+:8,-,value(65)
+
+OYX*
+.O..
+----
+
+;owl_proper_eye(*)
+
+
+Pattern A1210
+# gf New pattern. (3.7.1)
+# See ld_owl:318.
+
+?O?     not always found as lunch defense
+Y*X
+
+:8,-,value(65)
+
+?a?
+B*C
+
+;attack(a) && !oplay_attack(*,a) && !oplay_defend_both(*,B,C)
+
+
+#########################################################
+#                                                       #
+#               Specific corner attacks                 #
+#                                                       #
+#########################################################
+
+
+Pattern A1301
+
+|..o???
+|.Oooo?              kill corner
+|.XOO.o
+|.XY..O
+|...*..
+|......
++------
+
+:8,-,value(90)
+
+|..a???
+|.Oboo?
+|.XOO.o
+|.XY..O
+|...*..
+|......
++------
+
+; o_somewhere(a,b)
+
+
+Pattern A1302
+
+|..X?         corner clamp, often resourceful
+|.*YO
+|....
++----
+
+:8,s,value(30)
+
+
+Pattern A1303
+#tm - modified (3.1.15) (see ld_owl:152)
+
+|..X?         obligatory corner attack
+|X.Yo
+|.*.?
++----
+
+:8,s,value(90)
+
+
+Pattern A1303b
+
+|..X?         followup
+|X*YO
+|.OX?
++----
+
+:8,s,value(50)
+
+
+Pattern A1303c
+# gf New pattern. (3.5.3)
+
+|..X?         variation
+|XOYo
+|.*.?
++----
+
+:8,s,value(85)
+
+|..X?
+|XaYo
+|.*.?
++----
+
+;defend(a) != WIN
+
+
+Pattern A1304
+# gf Revised constraint. (3.1.18)
+
+|.YO          throw in threatening to destroy two corner eye vertices
+|.*X
++---
+
+:8,s,value(60)
+
+|bYO
+|.*A
++---
+
+;lib(A)==2 && !obvious_false_xeye(b)
+
+
+Pattern A1305
+
+|XXY?         try to kill corner formation
+|.*.X
+|...X
++----
+
+:8,s,value(90)
+
+
+Pattern A1305b
+
+|XY.?         try to kill corner formation
+|.*.X
+|...X
++----
+
+:8,s,value(35)
+
+
+Pattern A1306
+
+|XXY?         try to make ko in corner
+|...X
+|.*.X
++----
+
+:8,s,value(85)
+
+
+Pattern A1307
+
+|XxY?          kill one eye
+|.X.X
+|.O*X
++----
+
+:8,s,value(85)
+
+
+Pattern A1308
+
+|Xx??         attack bent four in the corner
+|.YXx
+|.*.X
++----
+
+:8,s,value(90)
+
+
+Pattern A1309
+
+|.YxX         try to damage corner eye space
+|.*Ox
++----
+
+:8,s,value(90)
+
+|bYxX
+|.*ax
++----
+
+;lib(a)>1 && !obvious_false_xeye(b)
+
+
+Pattern A1310
+
+|*X.Y          try to make ko or bent four in the corner
+|.OOx
++----
+
+:8,s,value(30)
+
+
+Pattern A1310b
+
+|XxX?
+|.Y.X          better to kill without ko if we can
+|*OOX
++----
+
+:8,s,value(31)
+
+
+Pattern A1311
+
+|.XY?
+|XO.X          set up corner ko
+|..*.
++----
+
+:8,s,value(80)
+
+
+Pattern A1311b
+# gf New pattern. (3.3.13)
+
+|.XY??
+|XO.XO          kill without ko
+|.*..?
++-----
+
+:8,s,value(81)
+
+
+Pattern A1312
+
+|OX??
+|.YX?         try to kill corner formation
+|.*.X
+|...x
++----
+
+:8,s,value(35)
+
+
+Pattern A1313
+
+|.??Ooo       attack 3-3 invasion
+|.xY.oo
+|...*..
+|......
++------
+
+:8,-,value(50)
+
+
+Pattern A1314
+# gf Added constraint. (3.5.5)
+
+|x.X?        sometimes correct attack in corner
+|..YO
+|.*.o
++----
+
+:8,s,value(45)
+
+|x.X?
+|..Ya
+|.*.o
++----
+
+;!attack(a)
+
+
+Pattern A1315
+
+|.XO?        attack corner eye space
+|..Y?
+|.X*O
+|....
++----
+
+:8,-,value(55)
+
+
+Pattern A1316
+
+|.XY?         try to make ko in corner
+|.*.X
+|..OX
++----
+
+:8,s,value(35)
+
+
+Pattern A1317
+
+|..X?        try to make ko in corner
+|.XYO
+|.*.O
++----
+
+:8,s,value(55)
+
+|..A?
+|.AAO
+|.*.O
++----
+
+;lib(A) == 4 && attack(A) != WIN
+
+
+Pattern A1318
+
+|..X?        create ko
+|*XYO
+|.OXO
++----
+
+:8,s,value(55)
+
+|..A?
+|*AAO
+|.OXO
++----
+
+;lib(A) == 2 && attack(A) != WIN
+
+
+Pattern A1319
+
+|.XO?        critical point, might give ko
+|*.Y?
+|..Xx
+|....
++----
+
+:8,s,value(61)
+
+|.AO?
+|*.Y?
+|..Xx
+|....
++----
+
+;!attack(A)
+
+
+Pattern A1319b
+
+|.XO        critical point, might kill
+|O.Y
+|*.X
+|...
++---
+
+:8,s,value(30)
+
+
+Pattern A1319c
+# gf New pattern. (3.1.11)
+
+|.XO?        critical point, might give ko
+|O.Y?
+|X*Xx
+|....
++----
+
+:8,s,value(61)
+
+|.AO?
+|O.Y?
+|X*Xx
+|....
++----
+
+;!attack(A)
+
+
+Pattern A1320
+
+|X??        try to make nakade instead of playing ko
+|OYX
+|*O.
++---
+
+:8,s,value(80)
+
+
+Pattern A1321
+
+|X??        prevent throwin for ko
+|.YX
+|*O.
++---
+
+:8,s,value(45)
+
+
+Pattern A1322
+
+|X.X        sometimes correct attack point
+|..Y
+|.*.
++---
+
+:8,s,value(40)
+
+
+Pattern A1323
+
+|XXO        eye stealing move might kill
+|..Y
+|*.X
+|...
++---
+
+:8,s,value(50)
+
+
+Pattern A1324
+
+|oo???
+|..O..     even if another attack works, try this first
+|...O.
+|..Y*.
+|.....
+|.....
++-----
+
+:8,-,value(90)
+
+
+Pattern A1325
+# This pattern could be generalized
+
+OOO.|      kill the eye
+.X*.|
+X.Y.|
+?X..|
+----+
+
+:8,-,value(50)
+
+
+Pattern A1326
+
++-----      block to kill
+|.....
+|...X*
+|..Y.O
+|..OO.
+|oo???
+
+:8,-,value(85)
+
+
+Pattern A1327
+
++-----      try to kill without ko
+|.....
+|.*.XO
+|..Y.O
+|.XOO.
+|oo???
+|oo???
+
+:8,Cs,value(85)
+
+
+Pattern A1328
+
+|xX??       almost certain life if defender plays here
+|xoY?
+|.*oX
+|..xx
++----
+
+:8,s,value(45)
+
+
+Pattern A1329
+
+|X??        try to make nakade
+|OY?
+|*Ox
+|Oox
++---
+
+:8,s,value(45)
+
+
+Pattern A1330
+
+|XX?        take ko to maybe kill
+|*YX
+|XOX
+|OoO
++---
+
+:8,s,value(75)
+
+|AA?
+|*AA
+|XaA
+|OoO
++---
+
+;lib(A)<=3 && defend(a) != WIN
+
+
+Pattern A1331
+
+|*Y?        capture to deny X trivial life
+|XOX
+|O.O
++---
+
+:8,s,value(55)
+
+|*Y?
+|XOX
+|OaO
++---
+
+;oplay_attack(a,a)
+
+
+Pattern A1332
+
+|xYx?       make nakade or escape
+|O.*X
+|.X.x
++----
+
+:8,s,value(55)
+
+|xYx?
+|Oa*X
+|.X.x
++----
+
+;oplay_defend(*,a,*)
+
+
+Pattern A1333
+
+|XXY?       try to get ko
+|.*.X
+|XOOX
+|...X
++----
+
+:8,s,value(55)
+
+|XXYa
+|.*.B
+|XOOB
+|...B
++----
+
+;!x_somewhere(a) || (lib(B) <= 6)
+
+
+Pattern A1334
+
+|XXY?       try to get ko
+|XO.X
+|XOOX
+|..*X
++----
+
+:8,s,value(55)
+
+
+Pattern A1335
+
+|..X?         vital point
+|*.YO
+|.XOO
++----
+
+:8,s,value(41)
+
+|..X?
+|*aYb
+|.Xbb
++----
+
+;oplay_attack(a,a) != 0 && !oplay_attack(a,b)
+
+
+Pattern A1335b
+# gf New pattern. (3.1.1)
+
+|..X?         vital point
+|*OYO
+|.X.O
++----
+
+:8,s,value(41)
+
+|..X?
+|*cYO
+|.XaO
++----
+
+;oplay_attack(a,c) != 0 || oplay_attack(a,a)
+
+
+Pattern A1336
+
+|XXYO         very special pattern
+|...X
+|*XO.
++----
+
+:8,s,value(35)
+
+|XXYO
+|acbX
+|*Xd.
++----
+
+;!oplay_attack(*,a,b,b) && oplay_defend(*,c,d)
+
+
+Pattern A1337
+
+|XXx?       kill without ko
+|.OYx
+|XOOX
+|.*oX
++----
+
+:8,s,value(35)
+
+
+Pattern A1338
+
+|OOo
+|OXO       kill without ko
+|X.X
+|.Yx
+|*OX
++---
+
+:8,s,value(35)
+
+
+Pattern A1339
+
+|xXx      strange things happen at the 1-2 point
+|X.Y
+|.*x
++---
+
+:8,s,value(75)
+
+
+Pattern A1340
+# gf New pattern. (3.1.13)
+
+|X.X?     destroy eyespace
+|.OYx
+|.*.X
++----
+
+:8,s,value(40)
+
+
+Pattern A1341
+# tm new pattern 3.1.13
+# Useful for manyfaces:8
+
+?X?|     vital corner point
+X.X|
+Y..|
+X.*|
+...|
+---+
+
+:8,s,value(40)
+
+
+Pattern A1342
+# tm new pattern (3.1.14)
+
+|.XO
+|..X
+|*.X
+|.YX
+|.O?
+
+:8,Cs,value(50)
+
+
+Pattern A1343
+# gf New pattern. (3.1.14)
+# tm modified (3.1.15)  (cho1:150)
+
+|xxx?     destroy eyespace
+|..YX
+|.*.x
++----
+
+:8,s,value(46)
+
+
+Pattern A1344
+# tm new pattern (3.1.15) (see cho1:150)
+# This pattern shouldn't be necessary. It's definitely a vital move
+# for the eyespace.
+
+XXY?     consolidate or destroy eyespace
+X.*O
+----
+
+:8,s,value(46)
+
+
+Pattern A1345
+# tm new pattern (3.1.15) (see cho1:160)
+
+|.X.O    special corner shape
+|.*YO
+|...O
++----
+
+:8,s,value(46)
+
+
+Pattern A1346
+# tm new pattern (3.1.15) (see cho1:200)
+
+??Xx|  important 1-2 attack.
+XY.x|
+x.*.|
+----+
+
+:8,s,value(75)
+
+
+Pattern A1347
+# gf New pattern. (3.1.15)
+
+|xx?
+|..X     destroy eyespace
+|*.Y
+|OX?
++---
+
+:8,s,value(35)
+
+
+Pattern A1348
+# gf New pattern. (3.1.15)
+
+|xX?     fighting ko is only chance to kill
+|OxX     
+|OYX
+|X*X
++---
+
+:8,s,value(75)
+
+|xX?
+|axB
+|aBB
+|X*B
++---
+
+;lib(a)==1 && lib(B)<=3 && defend(a)!=WIN
+
+
+Pattern A1349a
+# gf New pattern. (3.3.20)
+
+|.O?    only chance to kill, sometimes tesuji
+|.XO
+|X.Y
+|..X     
+|*.X
+|.X?
++---
+
+:8,s,value(75)
+
+|.O?
+|.XO
+|X.Y
+|..X
+|*.X
+|.A?
++---
+
+;!attack(A)
+
+
+Pattern A1349b
+# gf New pattern. (3.3.20)
+
+|oO?    only chance to kill, sometimes tesuji
+|OXO
+|.XO
+|X.Y
+|..X     
+|*.X
+|.X?
++---
+
+:8,s,value(75)
+
+|oO?
+|OXO
+|.XO
+|X.Y
+|..X
+|*.X
+|.A?
++---
+
+;!attack(A)
+
+
+Pattern A1350
+# gf New pattern. (3.3.20)
+# See ld_owl:68.
+
+|XXX?   try to kill without ko
+|O.X?
+|X.YX
+|.*.O
++----
+
+:8,s,value(75)
+
+|AAA?
+|O.A?
+|X.AA
+|.*.O
++----
+
+;lib(A)==3
+
+
+Pattern A1351
+# mh New Pattern (3.5.4)
+# see ld_owl:406-412
+
+|OO??   better than capturing
+|XOX?
+|.Y.X
+|*.X?
+|..X?
++----
+
+:8,s,value(75)
+
+
+Pattern A1352a
+# gf New pattern. (3.7.3)
+
+|?X??     destroy eyespace
+|X.Y?
+|.*YX
+|...x
++----
+
+:8,s,value(55)
+
+|?X??
+|XaY?
+|.*YX
+|...x
++----
+
+;proper_eye(a)
+
+
+Pattern A1352b
+# gf New pattern. (3.7.3)
+
+|?X??     destroy eyespace
+|X.Y?
+|.*YX
+|...x
++----
+
+:8,s,value(75)
+
+|?X??
+|XaY?
+|c*YX
+|.b.x
++----
+
+;proper_eye(a) && oplay_defend(*,b,c,*)
+
+
+#########################################################
+#                                                       #
+#               Invasion patterns                       #
+#                                                       #
+#########################################################
+#                                                       #
+#   These are not ordinary owl attack patterns.         #
+#                                                       #
+#########################################################
+
+
+Pattern A1401
+# nn Increased value a bit (3.3.12)
+
+Y...|       don't let opponent live easily in the corner
+.*..|
+....|
+....|
+----+
+
+:\,-,value(46)
+
+
+Pattern A1403
+#evand new pattern 3.3.13
+
+Y.O.|
+.*..|
+o...|
+....|
+----+
+
+:8,-,value(55)
+
+
+#########################################################
+#                                                       #
+#               Ko patterns                             #
+#                                                       #
+#########################################################
+
+Pattern A1501
+# Necessary to have one O stone in the pattern to identify the goal.
+# The helper is reused from a similar defense pattern.
+
+?O            fill outer liberty in two-step ko
+Y*
+
+:8,-,value(35)
+
+?O
+A*
+
+;lib(A)==2 && olib(*)>1 && finish_ko_helper(A)
+
+
+Pattern A1502
+# Necessary to have one O stone in the pattern to identify the goal.
+# The helper is reused from a similar defense pattern.
+
+Y*O           fill outer liberty in two-step ko
+
+:-,-,value(35)
+
+A*O
+
+;lib(A)==2 && olib(*)>1 && finish_ko_helper(A)
+
+
+Pattern A1503
+
+OX?           capture ko to stop escape
+Y*X
+OXO
+?O?
+
+:8,Cs,value(75)
+
+OX?
+A*B
+OXO
+?O?
+
+;owl_escape_value(A) > 0 || owl_escape_value(B) > 0
+
+
+Pattern A1503a
+#Same as 1503 - differnt anchor.
+
+OX?           capture ko to stop escape
+X*Y
+OXO
+?O?
+
+:8,Cs,value(75)
+
+OX?
+A*B
+OXO
+?O?
+
+;owl_escape_value(A) > 0 || owl_escape_value(B) > 0
+
+
+Pattern A1504
+# nn New pattern (3.3.13)
+#   redundant, as long as A1107c isn't removed
+
+OXXXO         threaten to take an eye by ko
+.OY.X
+*..X.
+-----
+
+:8,-,value(60)
+
+OXXXa
+bcY.X
+*..X.
+-----
+
+;!attack(a) && !xplay_defend(b,c)
+
+
+#########################################################
+#                                                       #
+#               Specific edge attacks                   #
+#                                                       #
+#########################################################
+
+
+Pattern A1601
+
+?xx
+Y..
+.*X
+---
+
+:8,s,value(35)
+
+?xx
+Yac
+b*X
+---
+
+;!safe_omove(a) && oplay_defend(*,a,*) && !oplay_attack(*,b,c,c)
+
+
+Pattern A1602
+
+.YO?      peep to destroy eyeshape
+*.XO
+.X.?
+----
+
+:8,Cs,value(55)
+
+aYO?
+*bCO
+.X.?
+----
+
+;!oplay_defend(*,a,b,C)
+
+
+Pattern A1603
+
+.YO?      peep to destroy eyeshape
+*.XO
+..X?
+----
+
+:8,Cs,value(55)
+
+aYO?
+*bCO
+..X?
+----
+
+;!oplay_defend(*,a,b,C)
+
+
+Pattern A1604
+
+?XYO?      peep to destroy eyeshape
+O*.XO
+..X.?
+-----
+
+:8,Cs,value(55)
+
+?XYO?
+O*aBO
+..X.?
+-----
+
+;!oplay_defend(*,?,a,B)
+
+
+Pattern A1605
+
+?XYO?      peep to destroy eyeshape
+O*.XO
+...X?
+-----
+
+:8,Cs,value(55)
+
+?XYO?
+O*aBO
+...B?
+-----
+
+;!oplay_defend(*,?,a,B)
+
+
+Pattern A1606
+
+XYO?      peep to destroy eyeshape
+*.XO
+.X.?
+----
+
+:8,Cs,value(35)
+
+XYO?
+*aBO
+.X.?
+----
+
+;!oplay_defend(*,?,a,B)
+
+
+Pattern A1607
+
+XYO?      peep to destroy eyeshape
+*.XO
+..X?
+----
+
+:8,s,value(35)
+
+XYO?
+*aBO
+..X?
+----
+
+;!oplay_defend(*,?,a,B)
+
+
+Pattern A1608
+
+XYO?      throw in to destroy eyespace
+.*XO
+.X.O
+----
+
+:8,s,value(45)
+
+
+Pattern A1608b
+
+xXYO?      atari to reduce eyespace, with further reduction as followup
+...XO
+..X*O
+-----
+
+:8,s,value(50)
+
+
+# nn Removal candidate (3.3.13)
+#   Success rate in regressions : 0% (0/35)
+
+Pattern A1609
+
+?OOY?
+O.X.X
+OX.*.
+-----
+
+:8,s,value(35)
+
+
+Pattern A1610
+# gf New pattern. (3.1.11)
+
+OXYX?      edge tesuji
+X...O
+.X.*.
+-----
+
+:8,-,value(45)
+
+bAAA?
+XedfO
+.Xc*.
+-----
+
+;lib(A)==3 && !attack(b) && !oplay_attack(*,c,d,e,f,f)
+
+
+Pattern A1611
+# gf New pattern. (3.1.12)
+
+OXYXx?      edge tesuji
+X...XO
+..*...
+------
+
+:8,-,value(35)
+
+OXYXx?
+X.edXf
+.a*cb.
+------
+
+;oplay_attack(*,a,b,c,d,e,e) && !oplay_attack(*,f)
+
+
+Pattern A1612
+# tm New pattern (3.1.15)
+
+?*Y??
+?X.X.
+?.X.O
+-----
+
+:8,-,value(45)
+
+?*Y??
+?eDX.
+?BXCA
+-----
+
+;lib(A) > 2 && !oplay_defend(*,?,B,?,C,?,D,e)
+
+
+Pattern A1613
+# tm New Pattern (3.1.17)
+
+?XY?
+XO.x
+OX*X
+----
+
+:8,s,value(75)
+
+
+#########################################################
+#                                                       #
+#                 Threats to capture                   #
+#                                                       #
+#########################################################
+
+
+Pattern AC01
+# pp New pattern (3.5.5).
+
+xXO        threaten a snapback
+x.Y
+*.X
+---
+
+:8,cs, threatens_to_capture(A), value(25)
+
+xXB
+x.A
+*.A
+---
+
+; lib(A) == 2 && lib(B) > 1 && olib(*) > 1
+
+
+#########################################################
+#                                                       #
+#               Threats to destroy eyes                #
+#                                                       #
+#########################################################
+
+
+Pattern AE01
+# pp New pattern (3.5.5).
+
+|OXx       threaten to destroy the eye in ko
+|X.X
+|.Yx
+|.*.
++---
+
+:8,cs, threatens_eye(a), value(20)
+
+|BXx
+|XaX
+|.Yx
+|.*.
++---
+
+; owl_proper_eye(a) && !attack(B)
+
+
+#########################################################
+#                                                       #
+#            Reverse sente attacking moves             #
+#                                                       #
+#########################################################
+
+
+# END OF FILE
diff --git a/patterns/owl_attackpats.dtr b/patterns/owl_attackpats.dtr
new file mode 100644 (file)
index 0000000..6828202
--- /dev/null
@@ -0,0 +1,350 @@
+A1     0
+A2     0
+A3     1
+A101   5
+A102   0
+A103   7
+A104   7
+A105   7
+A106   7
+A107   6
+A108   0
+A109   1
+A110   0
+A111   6
+A112   1
+A113   4
+A114   0
+A115   0
+A201   7
+A203   7
+A204   0
+A205   7
+A205b  0
+A206   7
+A206b  0
+A207   0
+A207b  7
+A207c  7
+A207d  7
+A208a  4
+A208b  3
+A208c  6
+A209   0
+A210   0
+A211   0
+A214   1
+A215   1
+A216   0
+A216b  0
+A217   0
+A217b  0
+A217c  0
+A218   0
+A219   0
+A220   0
+A221   0
+A222   0
+A223   0
+A224   0
+A225   0
+A226   0
+A227   3
+A227b  7
+A228   3
+A229   7
+A229b  3
+A229c  3
+A229d  3
+A230   0
+A231   6
+A232   0
+A233   7
+A234   1
+A235   5
+A236   0
+A237   0
+A238   6
+A301   0
+A302   0
+A305   0
+A401   5
+A401a  5
+A402   5
+A403   1
+A403b  1
+A404   1
+A406   3
+A406b  3
+A406c  4
+A407   2
+A408   4
+A409   6
+A410   0
+A411   4
+A411a  4
+A413a  3
+A414   2
+A414a  2
+A415   3
+A416   6
+A417   0
+A418   0
+A419   6
+A419b  6
+A420   0
+A421   3
+A422   0
+A422a  0
+A423   1
+A423a  1
+A424   7
+A501   7
+A502   6
+A503   0
+A504   0
+A505   0
+A506   6
+A507   1
+A508   7
+A509   1
+A510   3
+A511   0
+A512   3
+A513   0
+A514   6
+A515   7
+A516   0
+A517   0
+A601   1
+A602   1
+A603   0
+A603b  0
+A604   7
+A605   7
+A606   0
+A607   7
+A607b  7
+A608   7
+A609   0
+A610   7
+A611   0
+A612   0
+A613   3
+A614   3
+A615   0
+A616   6
+A617   0
+A618   3
+A619   3
+A620   0
+A621   7
+A701   4
+A702   4
+A703   6
+A704   1
+A705b  1
+A706   6
+A707   6
+A708   0
+A709   1
+A710   0
+A711   6
+A712   0
+A713   6
+A714   6
+A715   0
+A716   6
+A717   7
+A718   7
+A719   0
+A720   7
+A721   0
+A801   0
+A802   1
+A803   0
+A804   0
+A805   0
+A806   0
+A807   0
+A808   7
+A809   6
+A810   1
+A811   1
+A812   2
+A901   3
+A902   0
+A902b  0
+A903   0
+A904   3
+A905   1
+A907   0
+A908   0
+A909   7
+A910   0
+A911   0
+A912   7
+A913   6
+A914   6
+A915   0
+A916   0
+A917   3
+A918   7
+A919   0
+A920   7
+A1001  0
+A1001b 0
+A1002  3
+A1003  3
+A1005  3
+A1005b 3
+A1006  7
+A1006b 7
+A1008  2
+A1008b 6
+A1009  6
+A1010  3
+A1011  7
+A1012  0
+A1013  6
+A1014  7
+A1015  6
+A1015a 6
+A1016  7
+A1016a 7
+A1017  1
+A1018  0
+A1019  1
+A1020  2
+A1021  6
+A1022  2
+A1023  7
+A1100  0
+A1101  1
+A1101b 1
+A1101c 2
+A1102  1
+A1104  4
+A1105  0
+A1106  0
+A1107  1
+A1107b 1
+A1107c 1
+A1108  0
+A1109  7
+A1110  0
+A1111  6
+A1112  6
+A1113  2
+A1114  3
+A1115  6
+A1116  0
+A1117  2
+A1117a 2
+A1118  0
+A1119  6
+A1121  1
+A1122  0
+A1122a 0
+A1123  7
+A1123a 7
+A1124  7
+A1124a 7
+A1125  1
+A1126  2
+A1127  2
+A1127a 2
+A1128  7
+A1129  6
+A1130  3
+A1131  6
+A1132  0
+A1133a 0
+A1133b 0
+A1201  0
+A1203  2
+A1204  5
+A1205  1
+A1206  1
+A1207  3
+A1208  6
+A1209  0
+A1301  0
+A1302  3
+A1303  4
+A1303b 7
+A1304  7
+A1305  0
+A1305b 7
+A1306  0
+A1307  0
+A1308  7
+A1309  7
+A1310  0
+A1310b 0
+A1311  6
+A1311b 6
+A1312  7
+A1313  6
+A1314  7
+A1315  0
+A1316  0
+A1317  7
+A1318  0
+A1319  7
+A1319b 0
+A1319c 7
+A1320  3
+A1321  0
+A1322  4
+A1323  0
+A1324  7
+A1325  0
+A1326  2
+A1327  0
+A1328  7
+A1329  7
+A1330  0
+A1331  3
+A1332  7
+A1333  7
+A1334  7
+A1335  7
+A1335b 0
+A1336  0
+A1337  0
+A1338  6
+A1339  0
+A1340  7
+A1341  0
+A1342  3
+A1343  3
+A1344  0
+A1345  3
+A1346  3
+A1347  7
+A1348  0
+A1349a 0
+A1349b 0
+A1350  7
+A1401  0
+A1403  7
+A1501  1
+A1502  1
+A1503  5
+A1503a 5
+A1504  6
+A1601  6
+A1602  3
+A1603  7
+A1604  0
+A1605  0
+A1606  3
+A1607  7
+A1608  3
+A1608b 0
+A1609  0
+A1610  0
+A1611  0
+A1612  0
+A1613  0
diff --git a/patterns/owl_defendpats.db b/patterns/owl_defendpats.db
new file mode 100644 (file)
index 0000000..9a7d6dd
--- /dev/null
@@ -0,0 +1,7642 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The Owl defensive pattern database.
+#
+#  Further documentation may be found in the Texinfo documentation
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  In the second field (classification) the following pattern attributes
+#  are possible. Friendly stones are 'O', opponent stones are 'X'.
+# 
+# s  :  "Sacrifice" pattern. Omit the usual check that an O stone here
+#       cannot be capture.
+# 
+# n  :  In addition to usual check that an O stone here cannot be
+#       captured, check also that an X move cannot be captured.
+#
+# B  :  This move is not connected to the goal dragon and should
+#       therefore not be included in the goal.
+#
+# b  :  This move is maybe not connected to the goal dragon and should
+#       therefore be included only after closer examination.
+#
+# a  :  This move connects all O stones in the pattern to the goal.
+#
+#################
+#
+# The patterns in this database are sorted into the following
+# categories:
+# 
+# Dxx   Expanding moves on the fourth line
+# D1xx  Expanding moves on the third line
+# D2xx  Expanding moves on the second line
+# D3xx  Expanding moves in the center
+# D4xx  Expanding moves in the corner
+# D5xx  Defend one worm of the dragon
+# D6xx  Make eyeshape on the edge
+# D7xx  Make eyeshape in the center
+# D8xx  Make eyeshape in the corner
+# D9xx  Prevent intrusion
+# D10xx Prevent a cut
+# D11xx Attack a defect in the perimeter
+# D12xx Kikashi
+# D13xx Escape
+# D14xx Ko
+#
+# DCxx  Threats to capture
+# DExx  Threats to create eyes
+# DRxx  Reverse sente defending moves
+
+
+attribute_map owl_defense
+
+goal_elements Oo
+callback_data none
+
+#########################################################
+#                                                       #
+#         Expanding moves on the fourth line            #
+#                                                       #
+#########################################################
+
+
+Pattern D1
+
+?X..       jump out safely
+O.*.
+O...
+....
+....
+----
+
+:8,-,value(75)
+
+?X..
+Oa*.
+Obc.
+....
+....
+----
+
+; oplay_attack(*,a,b,c,c)
+
+
+Pattern D2
+
+....        hane if attached
+.*X.
+..Oo          
+....
+....
+----
+
+:8,-,value(55)
+
+
+Pattern D3
+
+..X?       push to expand
+..*O
+....
+....
+....
+----
+
+:8,-,value(77)
+
+
+Pattern D4
+
+.X..        extend along the fourth line
+oO*.
+....
+....
+....
+----
+
+:8,-,value(83)
+
+
+#########################################################
+#                                                       #
+#          Expanding moves on the third line            #
+#                                                       #
+#########################################################
+
+
+Pattern D100
+
+?XX?       Push along third line
+?O*.
+....
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D101
+
+?Xx??      Slide from fourth to third line
+OO..?
+...*.
+.....
+.....
+-----
+
+:8,-,value(80)
+
+
+Pattern D102
+
+?x.?
+XX*.      Escape!
+OO..
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D103
+
+?O.?
+XX*.      Escape!
+OO..
+....
+----
+
+:8,-,value(85)
+
+
+Pattern D104
+
+??*O      save one stone
+XO..
+....
+----
+
+:8,-,value(75)
+
+??*O
+Xa..
+....
+----
+
+;attack(a) && !oplay_attack(*,a)
+
+
+Pattern D104b
+
+?O.O*      save two stones while extending
+XO...
+.....
+-----
+
+:8,-,value(80)
+
+?a.O*
+Xa...
+.....
+-----
+
+;attack(a) && !oplay_attack(*,a)
+
+
+Pattern D105
+
+|..O?
+|..O?       try before extension
+|.OXo
+|..*?
+
+:8,-,value(80)
+
+
+Pattern D106
+
+X.OX?        hanging connection on third line
+.*.OO
+.....
+.....
+-----
+
+:8,-,value(80)
+
+
+Pattern D107
+
+?..x         attach
+.X.O
+.*..
+....
+....
+----
+
+:8,B,value(70)
+
+
+Pattern D108
+
+?..x         pull back
+.X.O
+XO*.
+....
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D109
+# gf Added b classification. (3.3.17)
+
+?..x         extend
+.X.O
+*O..
+....
+....
+----
+
+:8,b,value(95)
+
+
+Pattern D110
+
+.....X.      one space jump to live
+.*.O.oX
+.....OO
+.......
+-------
+
+:8,-,value(75)
+
+
+Pattern D111
+
+.Xx         push on third line
+.*O
+...
+...
+---
+
+:8,-,value(79)
+
+
+Pattern D112
+
+o....?       two space jump
+O..*.?
+o...oo
+.....o
+------
+
+:8,-,value(80)
+
+
+Pattern D113
+
+?xX..      draw back on the third line
+X.O*.
+.....
+.....
+-----
+
+:8,-,value(80)
+
+
+Pattern D114
+
+..X        push to defend
+X*O
+...
+...
+---
+
+:8,-,value(77)
+
+
+Pattern D115
+
+?X.?         knight's move if safe
+?.*.
+O..o
+....
+----
+
+:8,-,value(76)
+
+?X.?
+?b*.
+Oa.o
+....
+----
+
+; !oplay_defend(*,a,b,a)
+
+
+Pattern D116
+
+O*X           climb to third line
+..O
+...
+---
+
+:8,-,value(50)
+
+O*X
+..a
+...
+---
+
+;lib(a) >= 4
+
+
+Pattern D117
+# tm modified (3.1.22)
+# gf Fixed diagram inconsistency. (3.1.23)
+
+?*O.X           extend on third line
+o...O
+?....
+-----
+
+:8,-,value(70)
+
+?*O.X
+o...a
+?....
+-----
+
+;lib(a) >= 4
+
+
+Pattern D118
+# This is usually better than D213 when both match.
+
+?OX?       hane to expand
+O.*.
+....
+....
+----
+
+:8,-,value(81)
+
+?aX?
+O.*.
+....
+....
+----
+
+;lib(a)>1
+
+
+Pattern D119
+# This is usually better than D213 when both match.
+
+OOX??           hane to expand
+..O*.
+.....
+.....
+-----
+
+:8,-,value(81)
+
+
+Pattern D120
+
+??xxx?       better to make a base than jump in the center
+?O...X
+o..*..
+......
+......
+------
+
+:8,-,value(82)
+
+
+Pattern D121
+
+......        jump to maximum eyespace on third line
+O.*.X.
+......
+......
+------
+
+:8,-,value(40)
+
+
+Pattern D122
+
+??...        hane moving out
+XX*..
+OO...
+.....
+.....
+-----
+
+:8,-,value(80)
+
+??...
+XX*..
+OOa..
+.....
+.....
+-----
+
+; oplay_attack(*,a,a)
+
+
+Pattern D123
+# tm New Pattern (3.1.17)
+# tm Modified (3.1.18)
+# spl modified (3.3.23)
+
+??x??
+??*O?  expand eye shape, not in corner
+oO.O?
+?...?
+-----
+
+:8,-,value(65)
+
+
+Pattern D124
+# tm New Pattern (3.1.20) (see trevorb:660)
+# ab Revised constraint.
+
+?X..   split off weak stones
+o*OO
+o.Xx
+o...
+----
+
+:8,-,value(81)
+
+?X..
+a*OO
+obcx
+o...
+----
+
+;oplay_attack(*,a,b,c) && !attack(c)
+
+
+Pattern D125
+# gf New pattern. (3.5.3)
+
+?oo?
+...X        escape or build further on the edge
+.X*.
+.o.O
+....
+----
+
+:8,-,value(77)
+
+?ab?
+...X
+.X*.
+.o.O
+....
+----
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D126
+# gf New pattern. (3.5.5)
+# See ld_owl:501.
+
+|..?Ooo
+|.XX.oo
+|...X.X      peep in the corner
+|..O.*.
+|......
+|......
++------
+
+:8,-,value(85)
+
+
+Pattern D127
+# ab New pattern (3.7.1)
+
+???..o
+?..*Oo
+oO.X.o
+o....o
+------
+
+:8,-,value(80)
+
+
+#########################################################
+#                                                       #
+#          Expanding moves on the second line           #
+#                                                       #
+#########################################################
+
+
+Pattern D200
+
+?XX??      Slide
+OO...
+...*.
+.....
+-----
+
+:8,-,value(80)
+
+
+Pattern D201
+
+?XX??      Slide
+OO..X
+...*.
+.....
+-----
+
+:8,-,value(81)
+
+
+Pattern D202
+
+?X..      Hane on second line
+OOX.
+..*.
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D203
+
+XX..      Push!
+O*..
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D204
+# tm Pattern revised. (3.1.13)
+# tm Pattern revised. (3.1.14)
+
+??X?          push
+?O*.
+?.x.
+----
+
+:8,-,value(60)
+
+??X?
+AO*.
+?.x.
+----
+
+;!x_somewhere(A) || !defend(A)
+
+
+Pattern D205
+
+?X?             hane
+?OX
+O.*
+...
+---
+
+:8,-,value(60)
+
+
+Pattern D206
+#tm revised 3.1.14
+
+?XxX?        extend
+oO*?x
+?....
+-----
+
+:8,-,value(65)
+
+
+Pattern D207
+# tm reduced value (3.1.22) (see nngs:710)
+# gf Modified. (3.3.6)
+
+?O.X          second line kosumi
+o.*x
+o...
+----
+
+:8,-,value(66)
+
+
+Pattern D208
+# db reduced slightly (3.1.8)
+# tm reduced some more (3.1.22) (see nngs:710)
+
+???o      second line keima
+X..O
+.*..
+....
+----
+
+:8,-,value(65)
+
+
+Pattern D209
+
+?OO        block on edge
+X*.
+...
+---
+
+:8,n,value(70)
+
+
+Pattern D209a
+# tm New pattern (3.1.15)
+
+?OO      sente block on first line.
+X..
+.*.
+---
+
+:8,n,value(35)
+
+?OO
+B..
+.*.
+---
+
+; oplay_attack(*,B)
+
+
+Pattern D209b
+#spl modified 3.5.1
+
+?O.o        block on edge
+X*.o
+....
+----
+
+:8,n,value(70)
+
+
+Pattern D210
+
+?OO?        expand eyespace
+X*.O
+....
+----
+
+:8,-,value(70)
+
+
+Pattern D211
+
+|..O
+|..O       try before hanging connection
+|.OX
+|.*x
+|.x?
+
+:8,-,value(71)
+
+
+Pattern D212
+# gf FIXME: This is not a second line move. Move the pattern.
+
+??O???     capture one stone to improve eye space
+?..OX?
+.XOX*o
+------
+
+:8,-,value(75)
+
+
+Pattern D213
+
+??X?       slide
+O..x
+..*.
+....
+----
+
+:8,-,value(80)
+
+??X?
+Oa.x
+cb*.
+....
+----
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern D214
+
+oOx
+.*X
+...
+---
+
+:8,-,value(50)
+
+
+Pattern D215
+
+??..         urgent hane
+..XX
+.XOO
+.*..
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D216
+
+.O.?
+O.*.     make eye on edge
+....
+----
+
+:8,-,value(75)
+
+
+Pattern D217
+# tm Pattern revised. (3.1.13)
+# tm Pattern revised. (3.1.17)
+# gf FIXME: This constraint is weird. (3.1.23)
+
+o...
+O.*.     expand eyespace
+xx..
+----
+
+:8,-,value(60)
+
+o...
+O.*.
+Ax..
+----
+
+; oplay_attack(*,A)
+
+
+Pattern D217a
+# tm Pattern added (3.1.14)
+# see owl:170
+
+?...
+O.*.
+.x..
+----
+
+:8,-,value(50)
+
+?...
+O.*.
+.A..
+----
+
+; !oplay_defend(*,A)
+
+
+Pattern D217b
+
+O.XO
+O.*.     expand eyespace
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D217c
+# tm added (3.1.14)
+# see trevor:401
+# Possible to sacrifice to gain tempo here.
+# nn Modified (3.3.13)
+
+O.X?     expand eye-space
+O.*.
+.x.o
+----
+
+:8,s,value(10)
+
+
+Pattern D218
+
+xx...X.        slide (usually inferior to play on third line)
+...O.oX
+.*...OO
+.......
+-------
+
+:8,-,value(70)
+
+
+Pattern D220
+# tm modified (3.1.17)
+
+?oo.x       jump to enlarge eyespace
+oO.*x
+....x
+-----
+
+:8,-,value(40)
+
+abo.x
+cO.*x
+....x
+-----
+
+; o_somewhere(a,b,c)
+
+
+Pattern D221
+
+oo?x        jump along second line
+O.*.
+....
+----
+
+:8,-,value(35)
+
+
+Pattern D221b
+# gf New pattern. (3.5.3)
+
+oo?x        jump along second line
+O.*.
+O...
+----
+
+:8,-,value(45)
+
+
+Pattern D222
+# tm Pattern revised. (3.1.13)
+
+????        come straight out
+xX.?
+OO*.
+..x.
+----
+
+:8,-,value(75)
+
+
+Pattern D223
+
+O.XX?          push
+..O*o
+....o
+-----
+
+:8,-,value(70)
+
+ObXX?
+.ac*o
+....o
+-----
+
+;xplay_attack(a,b,c) && !oplay_attack(*,a,b,c)
+
+
+Pattern D224
+
+??xX           extend
+oO*.
+o...
+----
+
+:8,-,value(30)
+
+
+Pattern D225
+
+??X??        draw back
+.O.OO
+XO*..
+.X...
+-----
+
+:8,-,value(45)
+
+
+Pattern D226
+# gf New pattern. (3.1.12)
+
+?oO         threaten to escape and cut
+X.o       
+O*X
+...
+---
+
+:8,E,value(45)
+
+?ob
+X.o
+a*X
+...
+---
+
+;owl_goal_dragon(a) && owl_escape_value(b)>0
+
+
+Pattern D227
+# gf New pattern. (3.1.13)
+
+X.O.         jump and threaten to cut, connect, or force
+OX..
+O.*.
+o...
+----
+
+:8,-,value(65)
+
+X.O.
+aX..
+a.*.
+o...
+----
+
+;owl_goal_dragon(a) && !oplay_attack(*,a)
+
+
+Pattern D228
+# gf New pattern. (3.1.13)
+
+X.O.         followup
+OXX*
+O.O.
+o...
+----
+
+:8,-,value(65)
+
+X.O.
+aXX*
+a.O.
+o...
+----
+
+;owl_goal_dragon(a) && !oplay_attack(*,a)
+
+
+Pattern D229
+# gf New pattern. (3.1.14)
+
+XOoo          capture or threaten to capture, improving eyespace
+OX*o
+....
+----
+
+:8,-,value(76)
+
+XOoo
+OX*o
+...a
+----
+
+;owl_eyespace(a)
+
+
+Pattern D230
+# tm New Pattern (3.1.16)
+# gf Not down to edge. (3.3.20)
+# gf Not if it can be cut off. Constraint added. (3.5.3)
+
+?OO...?   expand along edge.
+o....*?
+?.....?
+-------
+
+:8,-,value(80)
+
+?Ob...?
+o...a*?
+?.....?
+-------
+
+;oplay_connect(*,a,*,b)
+
+
+Pattern D231
+# tm New Pattern (3.1.20) (see nngs:1320 owl_does_attack L15 M17)
+
+----   attach under
+.ooo
+*..o
+X.Oo
+..??
+????
+
+:8,sbE,value(70)
+
+----
+.ooo
+*a.o
+XbOo
+c.??
+ed??
+
+; safe_omove(*) ||
+; ((owl_escape_value(c) > 0 || owl_escape_value(d) >0 || owl_escape_value(e)>0)
+;  && oplay_attack(*,a,b,a))
+
+
+Pattern D232
+# gf New pattern. (3.1.23)
+# See nngs:1630.
+
+??O??    defend eye against edge descent tesuji
+XO.O*
+..O.X
+-----
+
+:8,-,value(45)
+
+??O??
+XOab*
+cdOeF
+-----
+
+;lib(F)>=3 && owl_topological_eye(a,b)<=2 && !xplay_attack(c,d,e,c)
+
+
+Pattern D233
+# evand New pattern. (3.3.18)
+# see owl:257
+
+oooO?  block
+oo.*X
+ooo..
+-----
+
+:8,n,value(35)
+
+
+Pattern D234
+# gf New pattern. (3.5.3).
+# See e.g. nngs:1090.
+
+...x?
+..*X?
+...Oo
+-----
+
+:8,-,value(35)
+
+...x?
+ba*C?
+...Oo
+-----
+
+;oplay_disconnect(*,a,a,C) && oplay_disconnect(*,b,b,C)
+
+
+#########################################################
+#                                                       #
+#          Expanding moves in the center                #
+#                                                       #
+#########################################################
+
+
+Pattern D300
+# gf Revised pattern. (3.1.15)
+
+X..??          push into the open
+O*..?
+x..??
+
+:8,E,value(80)
+
+X..??
+O*.a?
+x..??
+
+;owl_escape_value(a) > 1
+
+
+Pattern D301
+
+X..?
+O.*.
+O..?
+
+:8,E,value(80)
+
+X..?
+O.*a
+O..?
+
+;owl_escape_value(a) > 1
+
+
+Pattern D302
+# FIXME: This pattern looks way too general (see owl:23)
+
+XX.?          push along
+O*..
+?..?
+
+:8,-,value(50)
+
+
+Pattern D303
+# The b classification inhibits the addition of * to the dragon.
+
+XX.?         hane to try to escape
+OOX.
+?.*.
+??.?
+
+:8,b,value(70)
+
+
+Pattern D304
+
+OO?         block
+X.?
+*..
+
+:8,-,value(75)
+
+OO?
+a.?
+*..
+
+; does_attack(*,a)
+
+
+Pattern D305
+
+??.?       attach
+..X.
+O.*.
+....
+
+:8,-,value(75)
+
+
+Pattern D306
+
+???o      keima to expand shape
+X..O
+.*..
+....
+
+:8,-,value(75)
+
+???o
+XdaO
+.*bc
+....
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,d,b,d)
+
+
+Pattern D307
+
+??.??      block
+.*X..
+O.OX?
+
+:8,-,value(75)
+
+??b??
+.*Xc.
+O.OD?
+
+; oplay_attack(*,?,c,b,D)
+
+
+Pattern D308
+# tm added b category (3.1.17)
+# tm modified & increased value (3.1.20)
+
+o.O         chimera
+.*X
+
+:8,nsb,value(77)
+
+ocO
+b*X
+
+; oplay_attack(*,b,b) && oplay_attack(*,c,c) && safe_xmove(*)
+
+
+Pattern D309
+# tm modified (3.1.16)
+# tm reduced value (3.1.20) (see dniwog:5)
+# FIXME: Adding B attribute solve niki:14 - not sure why -tm.
+#     adding it breaks a lot, however (i.e. trevorb:590)
+
+?O?        block off area
+X*.
+ooo
+
+:8,-,value(65)
+
+?O?
+b*a
+ooo
+
+;oplay_attack(*,b) && oplay_attack(*,a,a)
+
+
+Pattern D309a
+# tm modified (3.1.16)
+# tm modified (3.1.22)
+# tm modified (3.1.23) (added b attribute)
+
+?O?        block off area
+X*.
+ooo
+
+:8,b,value(60)
+
+?O?
+X*a
+ooo
+
+; oplay_attack(*,a,a)
+; && !obvious_false_oeye(a)
+
+
+Pattern D309b
+
+?O?        block off area
+X..
+.*.
+???
+
+:8,-,value(61)
+
+?O?
+Xba
+.*.
+???
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+Pattern D310a
+
+?o?
+*.O        hanging connection to make eye
+.OX
+oo?
+
+:8,-,value(55)
+
+?o?
+*ba
+.OX
+oo?
+
+; lib(a)>1 && safe_xmove(b) && oplay_attack(*,b,b)
+
+
+Pattern D310b
+# More worth if safe from atari.
+# tm Reduced value (3.1.22) (see owl:153)
+
+?o?
+*.O        hanging connection to make eye
+.OX
+oo?
+
+:8,-,value(65)
+
+?o?
+*ba
+.cX
+oo?
+
+; lib(a)>2 && lib(c)>2 && safe_xmove(b) && oplay_attack(*,b,b)
+
+
+Pattern D311
+# gf Added n classification. (3.5.4)
+
+OX?        try to seal off some space
+.*O
+.??
+
+:8,n,value(60)
+
+OX?
+a*O
+.??
+
+; oplay_attack(*,a,a)
+
+
+Pattern D313
+
+..X         move out and separate
+.*O
+...
+?XX
+
+:8,-,value(75)
+
+
+Pattern D314
+
+??.XX     push to defend!
+.XXOO
+.*O..
+.....
+
+:8,-,value(80)
+
+
+Pattern D315
+
+X*o         hane starting an eye
+O.o
+OOo
+
+:8,-,value(60)
+
+X*o
+Oao
+OOo
+
+; oplay_attack(*,a,a)
+
+
+Pattern D316
+
+?X?         connect to protect
+O*O
+...
+
+:8,-,value(50)
+
+?X?
+O*O
+.a.
+
+; oplay_attack(*,a,a)
+
+
+Pattern D317
+
+OO?         urgent block
+X*?
+...
+
+:8,-,value(95)
+
+bb?
+A*?
+...
+
+;does_attack(*,A) && does_defend(*,b)
+
+
+Pattern D318
+# nn Modified (3.3.12)
+
+OOXx        descend - don't capture
+OXOX
+o.*.
+
+:8,-,value(82)
+
+OOXx
+OAOX
+o.*.
+
+; does_attack(*,A)
+
+
+Pattern D319
+# db added (3.1.8)
+
+...X      atari!
+.*XO
+X.Oo
+
+:8,-,value(80)
+
+...X
+.*XA
+X.Oo
+
+; lib(A)>1
+
+
+Pattern D320
+# db added (3.1.8)
+
+.*.?         jump out
+...?
+XO.o
+o.O?
+
+:8,-,value(50)
+
+
+#########################################################
+#                                                       #
+#           Expanding moves in the corner               #
+#                                                       #
+#########################################################
+
+
+Pattern D400
+
+--+         sagari in corner
+..|
+O*|
+Xx|
+
+:8,-,value(70)
+
+--+
+..|
+O*|
+Ax|
+
+;!attack(A)
+
+
+Pattern D401
+
+--+         capture in corner
+..|
+O.|
+X*|
+
+:8,-,value(80)
+
+--+
+..|
+O.|
+A*|
+
+;lib(A)==1
+
+
+Pattern D402
+
+..O..|       enclose corner to live
+*....|
+.....|
+.....|
+-----+
+
+:8,-,value(60)
+
+
+Pattern D403
+
+|.O??        isolate corner stone
+|..Ox
+|.X*.
+|....
++----
+
+:8,-,value(70)
+
+
+Pattern D404
+
+?.O.|       proceed into corner for almost certain life
+X.o.|
+.*..|
+....|
+....|
+----+
+
+:8,-,value(90)
+
+
+Pattern D405
+
+?Oo.|       proceed into corner for almost certain life
+X.o.|
+.*..|
+....|
+....|
+----+
+
+:8,-,value(90)
+
+?Oc.|
+Xab.|
+.*d.|
+....|
+....|
+----+
+
+; o_somewhere(b,c)||!oplay_defend(*,a,b,c,d,c)
+
+
+Pattern D406
+
+|ooOO?         realize eyespace in corner
+|....?
+|...*x
+|....?
++-----
+
+:8,-,value(70)
+
+
+Pattern D407
+
+|..X??         easy life in corner
+|.*OX?
+|...OO
+|.....
++-----
+
+:8,-,value(80)
+
+
+Pattern D408
+
+|ooO?        slightly expand corner eyespace
+|.O*X
+|....
++----
+
+:8,-,value(30)
+
+
+Pattern D409
+#evand new pattern (3.3.13)
+
+oO.X.|        move to corner to make life
+..*..|
+.....|
+.....|
+-----+
+
+:8,-,value(45)
+
+
+#########################################################
+#                                                       #
+#            Defend one worm of the dragon              #
+#                                                       #
+#########################################################
+
+
+Pattern D500
+
+xXOO          descend to defend
+XO..
+.*..
+----
+
+:8,-,value(60)
+
+
+Pattern D502
+
+?X.O        sagari
+XO.O
+.*..
+----
+
+:8,-,value(75)
+
+
+Pattern D503
+# The first constraint is necessary because the lower O stone 
+# may be short on liberties. It might work to replace it with 
+# a liberty constraint.
+# tm modified (3.1.22)
+
+|..O
+|*.O       hanging connection to protect eyespace
+|?OX
+
+:8,-,value(70)
+
+|.bO
+|*aO
+|?Oc
+
+; oplay_attack(*,a,a)
+; && !xplay_attack_either(a,a,c)
+; && oplay_attack(*,b,a,b)
+
+
+Pattern D503b
+# gf New pattern. (3.7.1)
+# See ld_owl:319. Cf. D1004b.
+
+|o.O        try to get second eye through ko
+|.*O
+|..O
+|?OX
+
+:8,s,value(45)
+
+|oaO
+|.*O
+|c.O
+|bOX
+
+;owl_proper_eye(a)
+;&& oplay_attack(*,b,c,b)
+
+
+Pattern D504
+# Don't apply this pattern on the edge. See patterns D505 and D506
+# gf Revised constraint. (3.3.18)
+
+?*.O        hanging connection to defend and make eye
+?.OX
+
+:8,-,value(85)
+
+?*ba
+?.cX
+
+; lib(a)>1 && safe_xmove(b) && !obvious_false_oeye(b)
+; && oplay_attack(*,b,b) && does_attack(b,c)
+
+
+Pattern D505
+#tm modified (3.1.22)
+# gf Changed does_attack to xplay_defend for better ko handling. (3.3.13)
+
+OOX         hanging connection to defend and make eye
+..O
+.*.
+---
+
+:8,-,value(85)
+
+OaX
+dbc
+.*.
+---
+
+; lib(a)>1 && safe_xmove(b) && oplay_attack(*,d,b,d)
+; && xplay_defend(b,c) != WIN
+
+
+Pattern D506
+# Smaller value in this case since it leaves substantial aji. In
+# particular we want to try the solid connection (pattern D44, value
+# 80) before this pattern.
+
+.OX         hanging connection to defend and make eye
+..O
+.*.
+---
+
+:8,-,value(75)
+
+.aX
+dbc
+.*.
+---
+
+; lib(a)>1 && safe_xmove(b) && oplay_attack(*,b,b) && does_attack(b,c)
+; && oplay_attack(*,d,d)
+
+
+Pattern D507
+
+?XX.o       defend two stones
+XOO*.
+?....
+-----
+
+:8,-,value(80)
+
+?XX.o
+Xaa*.
+?....
+-----
+
+;does_defend(*,a)
+
+
+Pattern D508
+
+?XX*o
+XOO.O     defend
+?....
+-----
+
+:8,-,value(90)
+
+?XX*o
+Xaa.O
+?....
+-----
+
+;does_defend(*,a)
+
+
+Pattern D509
+# FIXME: (see trevor:360)
+# nn Fixed constraint (3.3.12)
+#   does_defend() doesn't return WIN
+
+XO?      capture to defend
+*XO
+---
+
+:8,-,value(90)
+
+Xa?
+*XO
+---
+
+;does_defend(*,a)
+
+
+Pattern D510
+# gf Devalued. (3.1.12)
+
+?OX      capture to defend
+*XO
+?O?
+
+:8,-,value(75)
+
+?aX
+*XO
+?O?
+
+;does_defend(*,a)
+
+
+Pattern D511
+
+O.o       rescue one stone
+OX.
+XO*
+xXO
+
+:8,-,value(75)
+
+A.o
+AX.
+XO*
+xXO
+
+; !oplay_attack(*,A)
+
+
+Pattern D512
+
+..*..      atari before defending
+X.XO.
+.XO..
+.....
+.....
+-----
+
+:8,-,value(85)
+
+
+Pattern D513
+
+??...     connect 
+XXO.o
+XO*.o
+....o
+....o
+-----
+
+:8,-,value(85)
+
+
+Pattern D514
+# gf New pattern. (3.1.14)
+
+?*.o       avoid double atari
+XO..
+?XOO
+
+:8,-,value(76)
+
+?*.o
+AO..
+?Bcc
+
+;lib(A)>1 && lib(B)>1 && lib(c)==2
+
+
+Pattern D515
+# gf New pattern. (3.3.20)
+
+?OOX?        hanging connection to defend and make eye
+O..OX
+.*...
+-----
+
+:8,-,value(61)
+
+?OOX?
+O.aOX
+.*.b.
+-----
+
+;!oplay_defend(*,a,b,a)
+
+
+#########################################################
+#                                                       #
+#            Make eyeshape on the edge                  #
+#                                                       #
+#########################################################
+#                                                       #
+#  Moves that do not necessarily expand the eyeshape    #
+#  but try to make what exists yield two eyes           #
+#                                                       #
+#########################################################
+
+
+Pattern D600
+# tm modified (3.1.20) (see strategy4:203)
+
+oOX?         eye with reverse sente
+OxOX
+o*..
+----
+
+:8,-,value(80)
+
+
+Pattern D600a
+# tm New Pattern (3.1.15)
+# tm modified (3.1.20)
+
+oOX??         eye with reverse sente, avoid ko
+OxOX?
+o.*.X
+-----
+
+:8,-,value(81)
+
+
+Pattern D602
+
+?OO        make eye
+O.O
+.*.
+---
+
+:8,-,value(35)
+
+?OO
+O.O
+a*b
+---
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+Pattern D603
+
+XO.        make eye
+O.O
+.*.
+---
+
+:8,-,value(35)
+
+XOc
+O.O
+a*b
+---
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b) && oplay_attack(*,c,c)
+
+
+Pattern D604
+# tm Modified (3.1.17)
+
+oOOX         descend to close eyeshape
+?.*x
+----
+
+:8,-,value(35)
+
+oOOA
+?b*x
+----
+
+#;owl_eyespace(b) && 
+;(!obvious_false_oeye(b) || oplay_attack(*,A))
+;&& !xplay_attack(*,A)
+
+
+Pattern D604a
+#tm New Pattern (3.1.15) (see maeda:70)
+
+OOOOOX     make eye by threatening large capture
+XX..*.
+------
+
+:8,-,value(35)
+
+OOOOOX
+XCAb*.
+------
+
+; !oplay_defend(*,A,b,C)
+
+
+Pattern D605
+
+oOo?
+O.*O       make an eye and threaten another, while preventing atari
+XO..
+----
+
+:8,-,value(35)
+
+
+Pattern D606
+
+XOX         try to partition eyespace rather than defend
+O.O
+.*.
+---
+
+:8,-,value(65)
+
+XaX
+O.O
+b*c
+---
+
+;lib(a) == 1 && !obvious_false_oeye(b) && !obvious_false_oeye(c)
+
+
+Pattern D607
+
+OXO           avoid nakade while probably securing eyes
+X*X
+---
+
+:8,-,value(70)
+
+OBO
+A*C
+---
+
+;lib(A)==1 && lib(B)==1 && lib(C)==2
+
+
+Pattern D608
+
+oOOX          eat lunch in the right direction
+.X*.
+----
+
+:8,-,value(50)
+
+oOOX
+.A*.
+----
+
+;does_attack(*,A)
+
+
+Pattern D608b
+# gf New pattern. (3.1.11)
+
+ooO.X          eat lunch in the right direction
+.X*..
+-----
+
+:8,-,value(50)
+
+ooO.X
+aB*..
+-----
+
+;owl_eyespace(a) && does_attack(*,B)
+
+
+Pattern D609
+
+?X?           preserve eyespace 
+O*O
+...
+---
+
+:8,-,value(80)
+
+
+Pattern D610
+
+??oOX       get out of liberty shortage
+oOO.O
+*XXO.
+-----
+
+:8,-,value(45)
+
+??oOX
+oOO.O
+*XXOa
+-----
+
+;olib(a)==1
+
+
+Pattern D611
+
+xXOo        forestall snapback threat, securing eye
+XO.O
+.O*X
+----
+
+:8,-,value(60)
+
+xXOo
+XO.O
+.O*A
+----
+
+;lib(A) == 2
+
+
+Pattern D612
+
+?OOO?         comb formation
+O.X.O
+O.*.O
+-----
+
+:8,-,value(50)
+
+
+Pattern D613
+
+?OOO?         comb formation
+O.*.O
+O.X.O
+-----
+
+:8,-,value(50)
+
+
+Pattern D614
+
+oOo           initiate ko to attempt for an extra eye
+*.O
+XOX
+---
+
+:8,-,value(30)
+
+oOo
+*.O
+AOX
+---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D614b
+# gf New pattern. (3.1.9)
+
+ooOOo           attempt to live without ko
+o...O
+.*XOX
+-----
+
+:8,-,value(31)
+
+
+Pattern D615
+
+XOo?          secure eye shape against snapback threat
+O.O?
+O.*.
+----
+
+:8,-,value(50)
+
+XOo?
+A.O?
+A.*b
+----
+
+;lib(A)==2 && xplay_attack(*,b,b)
+
+
+Pattern D616
+
+oOX??         secure eye with ko
+O.OX?
+*O.oX
+-----
+
+:8,-,value(25)
+
+oOX??
+O.OX?
+*O.oX
+-----
+
+;xlib(*)>1
+
+
+Pattern D616a
+# higher value than D616 for owl.tst number 183 where this defense 
+# gives fewer ko threats
+
+??oOX??         secure one eye with ko
+?.O.OX?
+.X*O.oX
+-------
+
+:8,-,value(45)
+
+??oOX??
+?.O.OX?
+.X*O.oX
+-------
+
+;xlib(*)>1
+
+
+Pattern D617
+
+ooOX??        secure eye with ko
+*O.OX?
+XXO.oX
+------
+
+:8,-,value(25)
+
+ooOX??
+*O.OX?
+AAO.oX
+------
+
+;lib(A)<=2
+
+
+Pattern D618
+
+oOX??        take ko to make eye
+O.OX?
+XOX*X
+-----
+
+:8,-,value(25)
+
+oOX??
+O.OX?
+AOX*X
+-----
+
+;lib(A)<=2
+
+
+Pattern D619
+
+oOX        capture to defend and maybe make eye
+OX*
+.OX
+---
+
+:8,-,value(39)
+
+
+Pattern D620
+
+XOo?        defend eye from collapse
+O.O*
+OO.X
+----
+
+:8,-,value(72)
+
+XOo?
+a.O*
+aa.B
+----
+
+;lib(a)==2 && lib(B)==3
+
+
+Pattern D621
+
+?O??       threaten two eyes simultaneously
+O.O?
+oO*X
+O..?
+----
+
+:8,-,value(45)
+
+
+Pattern D622
+
+*OX?       solidify eye and threaten to make more on the edge
+OXOo
+....
+----
+
+:8,n,value(45)
+
+*OA?
+OXOo
+b...
+----
+
+;!attack(A) && oplay_attack(*,b,b)
+
+
+Pattern D623
+
+?XxOO?          make one eye
+?XO.*X
+..xO..
+------
+
+:8,s,value(95)
+
+?XbOO?
+?XO.*X
+..aO..
+------
+
+; !x_somewhere(a) || !x_somewhere(b)
+
+
+Pattern D624
+# tm added (3.1.14)
+# Needed in trevor:403
+
+O.??      Block on first line to make eye.
+O.OX
+ox*?
+----
+
+:8,-,value(40)
+
+
+Pattern D625
+# gf New pattern. (3.1.14)
+# gf Revised constraint. (3.3.6)
+
+O*o      prevent eye stealing capture
+XO.
+---
+
+:8,n,value(45)
+
+a*o
+XOb
+---
+
+;lib(a)==1 && !obvious_false_oeye(b)
+
+
+Pattern D626
+# tm New pattern. (3.1.15)
+# special position - see ld_owl:188
+
+OOX.|
+*..X|
+----+
+
+:8,-,value(45)
+
+
+Pattern D627
+# tm New pattern (3.1.15) (see maeda:100)
+
+|.OX
+|O.O
+|..O
+|X*.
+
+:8,-,value(45)
+
+|.OX
+|O.O
+|B.O
+|A*.
+
+; oplay_defend(*,A)  && oplay_attack(*,B,A)
+
+
+Pattern D628
+# tm New pattern (3.1.15)
+
+|OO
+|.*
+|O.
+
+:8,-,value(80)
+
+|OO
+|.*
+|OA
+
+; !xplay_attack(*,*) && oplay_attack(*,A,A)
+
+
+Pattern D629
+# tm New Pattern (3.1.15)
+
+|xX?   make an eye on the edge.
+|.OO
+|*.O
+|..O
+|..O
+|xX?
+
+:8,s,value(65)
+
+
+Pattern D630
+# tm New Pattern (3.1.15)
+# gf This was classified as a 0 (zero) pattern. Removed class. (3.1.18)
+# tm added b category (3.1.18)
+
+.*O    Cut off black stone
+OX?
+???
+---
+
+:8,b,value(65)
+
+.*O
+OA?
+???
+---
+
+; defend(A) && oplay_attack(*,A)
+
+
+Pattern D631
+# tm New Pattern (3.1.15)
+
+OOOO   funny edge capture.
+.XX.
+.*O.
+----
+
+:8,s,value(75)
+
+OOOO
+.XC.
+A*OB
+----
+
+; oplay_attack(*,C)
+; && oplay_defend(*,A,*)
+; && oplay_defend(*,B,*)
+
+
+Pattern D632
+# tm New Pattern (3.1.15)
+
+OOX?     Eat lunch with snapback.
+OXOX
+OX.*
+----
+
+:8,-,value(65)
+
+OOX?
+OXOA
+OX.*
+----
+
+; oplay_attack(*,A)
+
+
+Pattern D633
+# tm New pattern (3.1.15)
+
+OOoO?   vital point for eye shape
+O..OO
+..*..
+-----
+
+:8,-,value(65)
+
+
+Pattern D634
+# tm New pattern (3.1.15)
+#   only really useful if short of liberties.
+
+XXO   Hane in sente
+.*.
+---
+
+:8,-,value(70)
+
+BBA
+.*.
+---
+
+; lib(A) < 4 && oplay_attack(*,B)
+
+
+Pattern D635
+# tm New Pattern (3.1.15)
+
+?OO?
+O..O
+O*.O
+....
+----
+
+:8,-,value(65)
+
+?OO?
+O.BO
+O*FO
+aecD
+----
+
+; !oplay_defend(*,a,B,c,D,e,F,a)
+
+
+Pattern D636
+# tm New Pattern (3.1.15)
+
+OOO.X  special eye shape on edge.
+...*.
+-----
+
+:8,-,value(65)
+
+OOOaX
+..B*.
+-----
+
+; oplay_attack(*,a,B,a)
+
+
+Pattern D637
+# tm New Pattern (3.1.20)  (see strategy4:171)
+#   FIXME: This is due to a defect in the eye space handing.
+#          This point should come through as a vital point.
+
+O*.
+XO?
+
+:8,-,value(65)
+
+A*d
+bO?
+
+; ko(b) && owl_topological_eye(*,A) > 2 && !obvious_false_oeye(d)
+
+
+Pattern D638
+#evand new pattern 3.3.12
+
+?o.x   attempt to escape or make eyeshape by forcing.
+oOX*
+O.O.
+----
+
+:8,-,value(45)
+
+
+Pattern D639
+# gf New pattern. See owl1:285. (3.3.17)
+
+oO*X          eat lunch without getting a false eye
+XX..
+----
+
+:8,-,value(50)
+
+oO*X
+AA..
+----
+
+;!oplay_defend(*,A)
+
+
+Pattern D640
+# gf New pattern. (3.3.20)
+# Compare D720.
+
+?O*.o       try to make eye on edge
+O....
+-----
+
+:8,-,value(56)
+
+?O*bo
+Oa...
+-----
+
+;!obvious_false_oeye(a) && !oplay_attack(b,*,*)
+
+
+Pattern D641
+# evand New pattern. (3.3.20)
+
+xXOO.
+..X*O
+.....
+-----
+
+:8,-,value(75)
+
+xXOOa
+..X*O
+....b
+-----
+
+;!obvious_false_oeye(a) || !obvious_false_oeye(b)
+
+
+Pattern D642
+# tm New Pattern (3.1.22) (see trevord:910)
+# gf Revised constraint. (3.5.3)
+
+X*O?     Extend side eye-space in sente
+?..o
+----
+
+:8,-,value(80)
+
+C*O?
+?bao
+----
+
+;!obvious_false_oeye(a)
+;&& oplay_attack(*,b,C) && !attack(C)
+
+
+Pattern D643
+# spl added 3.3.22
+
+?oO      try to make 2 eyes
+OO.
+o.*
+---
+
+:8,-,value(40)
+
+
+Pattern D643b
+# gf New pattern. (3.5.5)
+
+??OO     try to make 2 eyes
+OO..
+o.*.
+----
+
+:8,-,value(40)
+
+
+Pattern D644
+# gf New pattern. (3.5.3)
+# See seki:111.
+
+oOOo   make one definite eye
+.*.O
+X..O
+----
+
+:8,-,value(30)
+
+
+Pattern D645
+# gf New pattern. (3.7.2)
+# See semeai:117-119.
+
+OOX     secure eye and capture lunch
+.*.
+---
+
+:8,-,value(96)
+
+OOB
+a*.
+---
+
+;owl_proper_eye(a) && does_attack(*,B) && !obvious_false_oeye(B)
+
+
+#########################################################
+#                                                       #
+#            Make eyeshape in the center                #
+#                                                       #
+#########################################################
+#                                                       #
+#  Moves that do not necessarily expand the eyeshape    #
+#  but try to make what exists yield two eyes           #
+#                                                       #
+#########################################################
+
+
+Pattern D700
+
+oOo          make eyeshape
+O.O
+.*.
+
+:|,-,value(75)
+
+
+Pattern D701
+
+?*?          half eye sometimes missed by optics
+O.O
+?O.
+
+:8,-,value(70)
+
+?*?
+OaB
+?Ob
+
+; (owl_topological_eye(a,B)>=2) && (owl_topological_eye(b,B)==2)
+
+
+Pattern D702
+
+?X?           half eye sometimes missed by optics
+O*O
+.O.
+
+:8,n,value(70)
+
+?X?
+O*B
+aOb
+
+; (owl_topological_eye(a,B)==2)
+; && ((owl_topological_eye(b,B)==2) || (owl_topological_eye(b,B)==3))
+
+
+Pattern D703
+
+?O*          defend half eye (reverse sente)
+o.O
+?o?
+
+:8,-,value(70)
+
+?O*
+oaB
+?o?
+
+;owl_topological_eye(a,B)==3 && does_attack(*,B)
+
+
+Pattern D704
+
+oO.         half eye sometimes missed
+O.*
+?o?
+
+:8,-,value(35)
+
+oOb
+Ba*
+?o?
+
+; owl_topological_eye(a,B)==3
+; && safe_xmove(b) && safe_xmove(*) && oplay_attack(*,b,b)
+
+
+Pattern D704b
+# gf Revised constraint. (3.1.15)
+# gf Revised constraint. (3.1.23)
+# pp Revised pattern. (3.3.18)
+
+oO.?       half eye sometimes missed
+O.*?
+----
+
+:8,-,value(35)
+
+cOb?
+O.*?
+----
+
+; (safe_xmove(b) || safe_xmove(*)) && oplay_attack(*,b,b)
+; && (o_somewhere(c) || !safe_xmove(c))
+
+
+Pattern D705
+
+O.X           block to cut off one stone
+X*o
+---
+
+:8,-,value(45)
+
+O.X
+a*o
+---
+
+; does_attack(*,a)
+
+
+Pattern D706
+
+?O*          save a half eye against an atari
+o.O
+?o?
+
+:8,n,value(35)
+
+?B*
+oba
+?o?
+
+; lib(a)==2 && owl_topological_eye(b,B)==3
+
+
+Pattern D707
+
+XX?         make half eye with sente
+O*O
+O.O
+o?o
+
+:8,-,value(77)
+
+AA?
+O*O
+O.O
+o?o
+
+; oplay_attack(*,A)
+
+
+Pattern D708
+
+?X??         make half eye with sente
+O*O?
+O.O?
+?.oo
+??Oo
+
+:8,-,value(77)
+
+?A??
+O*O?
+O.O?
+?.oo
+??Oo
+
+; oplay_attack(*,A)
+
+
+Pattern D709
+
+oOOx          eat lunch in the right direction
+.X*.
+?OOx
+
+:8,-,value(50)
+
+oOOx
+.A*a
+?OOx
+
+;olib(a)<=2 && does_attack(*,A)
+
+
+Pattern D710
+# gf Revised constraint. (3.1.15)
+
+OO*             try to make center eye
+O..
+?OO
+
+:8,-,value(30)
+
+OO*
+O.a
+?OO
+
+;!owl_big_eyespace(a) && !obvious_false_oeye(a)
+
+
+Pattern D711
+
+O?          capture nakade, might give new possibilities
+X*
+
+:8,-,value(25)
+
+O?
+A*
+
+;lib(A)==1 && wormsize(A)>=3
+
+
+Pattern D712
+
+?O          capture nakade, might give new possibilities
+X*
+
+:8,-,value(25)
+
+?O
+A*
+
+;lib(A)==1 && wormsize(A)>=3
+
+
+Pattern D713
+
+.OO?      make one eye
+*..O
+.OO?
+
+:-,-,value(50)
+
+.OO?
+*.aB
+.OO?
+
+;owl_topological_eye(a,B)==3
+
+
+Pattern D714
+
+?O*?      make one eye
+O..O
+.OO?
+
+:8,n,value(35)
+
+
+Pattern D715
+
+O*           defend against atari inside eyespace
+
+:-,-,value(35)
+
+a*
+
+; lib(a)==2 && xlib(*)>1 && owl_big_eyespace(*)
+
+
+Pattern D715b
+# gf New pattern. (3.1.15)
+
+O.*
+XO.           defend against atari inside eyespace on edge
+---
+
+:8,-,value(36)
+
+O.*
+XOa
+---
+
+;xlib(a)>1 && owl_big_eyespace(a) && oplay_attack(*,a,a)
+
+
+Pattern D715c
+# gf New pattern. (3.3.20)
+
+.X*           defend against atari inside eyespace
+O.O
+XOo
+
+:8,-,value(60)
+
+.B*
+a.O
+XOo
+
+;lib(a)==2 && lib(B)==3 && owl_big_eyespace(*)
+
+
+Pattern D716
+# gf New pattern. (3.1.11)
+
+?*OO        secure eye
+O..o
+?oOX
+
+:8,-,value(60)
+
+?*OO
+O.ao
+?oOX
+
+;owl_eyespace(a) && !owl_big_eyespace(a)
+
+
+Pattern D717
+# gf New pattern. (3.1.12)
+# pp Modified (3.3.16)
+
+oOXx         eat lunch to make certain eye
+OXOx
+O.*x
+
+:8,-,value(81)
+
+oOXx
+OAOx
+O.*x
+
+;!oplay_defend(*,A)
+
+
+Pattern D718
+# tm New pattern (3.1.14)
+# see owl:111
+
+?X?
+O*O       Expand eye space
+...
+OO.
+
+:8,-,value(60)
+
+
+Pattern D720
+# tm New pattern (3.1.16)
+
+?O.o
+O.*o
+
+:8,-,value(55)
+
+?O.o
+Oa*o
+
+;owl_proper_eye(a)
+
+
+Pattern D721
+# nn New pattern. (3.3.9)
+
+OoO        good shape can help
+o.O
+O*X
+
+:8,-,value(55)
+
+
+Pattern D722
+# evand New pattern. (3.3.18)
+
+?O*X       #half eye in sente
+O.O?
+?O??
+
+:8,-,value(65)
+
+?O*A
+ObO?
+?O??
+
+;!obvious_false_oeye(b) && oplay_attack(*,A)
+
+
+Pattern D723
+# gf New pattern. (3.7.9)
+
+?..o
+.*.O       protect eyespace
+...O
+oOOX
+
+:8,-,value(75)
+
+
+#########################################################
+#                                                       #
+#           Make eyeshape in the corner                 #
+#                                                       #
+#########################################################
+#                                                       #
+#  Moves that do not necessarily expand the eyeshape    #
+#  but try to make what exists yield two eyes           #
+#                                                       #
+#########################################################
+
+
+Pattern D800
+
+O...|       claim the corner to live
+.*..|
+....|
+....|
+----+
+
+:8,-,value(60)
+
+
+Pattern D801
+
+XO.|       defend corner eye
+.*.|
+---+
+
+:8,-,value(35)
+
+
+Pattern D802
+
+Oo.|       defend corner eye
+X*.|
+---+
+
+:8,-,value(35)
+
+
+Pattern D803
+
+.O.|       defend corner eye
+X*.|
+---+
+
+:8,-,value(35)
+
+
+Pattern D804
+# We need this pattern because the optics can't be relied on coming up
+# with it when it's vital. Taking it out should cause some failures 
+# in the ld_owl test suite.
+
+OOO|       take corner eye
+.*.|
+---+
+
+:8,-,value(25)
+
+OOO|
+a*.|
+---+
+
+;!obvious_false_oeye(a)
+
+
+Pattern D804a
+#spl 3.5.1 owl1:320
+
+|OO? defend eye in the corner
+|.*X
++---
+
+:8,-,value(75)
+
+|aa?
+|.*X
++---
+
+;lib(a) > 2
+
+
+Pattern D804b
+# This is kind of obscure, but sometimes D804 leads to a shortage of
+# liberties, e.g. in the position
+#
+# .XXXXX..|
+# .X.OOXXX|
+# XXOOXOOO|
+# X.O.X...|
+# --------+
+#
+# After O playing on the 1-2 point, X fills an outer liberty and O dies.
+# This pattern avoids that bitter fate.
+
+XOOO|       take corner eye
+X*..|
+----+
+
+:8,-,value(26)
+
+
+Pattern D805
+# tm modified (3.1.15)
+#   s category incorrectly necessary - see ld_owl:53
+#   see also trevor:590 for underlying problem.
+# tm modified back (3.1.16)
+#   trevor:590 solved.
+
+|oOO?
+|...O         try to secure corner
+|.*.o
++----
+
+:8,-,value(98)
+
+
+Pattern D805a
+
+|oOOo
+|...o         try to secure corner
+|.*.o
++----
+
+:8,-,value(45)
+
+
+Pattern D805b
+
+|oO.?
+|.*.O         try to secure corner
+|...o
++----
+
+:8,-,value(30)
+
+
+Pattern D806
+
+|.XOO         miai eyes
+|.*..
++----
+
+:8,-,value(60)
+
+|bAOO
+|.*.a
++----
+
+;attack(A) && !oplay_defend(*,a,b,A)
+
+
+Pattern D807
+
+|.XOO         miai eyes with ko
+|.*..
++----
+
+:8,-,value(60)
+
+|bAOO
+|.*.a
++----
+
+;attack(A) && oplay_defend(*,a,b,A) != WIN
+
+
+Pattern D808
+
+|.XOO         life (but possibly unnecessarily small)
+|.*.O
++----
+
+:8,-,value(65)
+
+|.AOO
+|.*.O
++----
+
+;does_attack(*,A)
+
+
+Pattern D809
+
+|.XOO         might give seki
+|.*.O
++----
+
+:8,-,value(25)
+
+|.AOO
+|.*.O
++----
+
+;oplay_attack(*,A)
+
+
+Pattern D810
+
+|.XOoo        miai eyes or better
+|.*...
++-----
+
+:8,-,value(55)
+
+|aXOoo
+|.*...
++-----
+
+;!oplay_defend(*,a,a)
+
+
+Pattern D811
+
+|ooO?         miai eyes or better
+|o.Oo
+|.*..
++----
+
+:8,-,value(60)
+
+
+Pattern D811a
+# tm New Pattern (3.1.15) (see cho1:200)
+
+|oO??         miai eyes or better
+|o.O?
+|.*.?
++----
+
+:8,-,value(60)
+
+
+Pattern D812
+
+|oo?          work around eyespace generation weakness
+|.OX
+|*XO
++---
+
+:8,-,value(70)
+
+
+Pattern D813
+
+|.OX            descend in corner
+|.*?
++---
+
+:8,-,value(30)
+
+
+Pattern D814
+
+|.O?         proper defense of L+1 shape
+|.OO
+|..O
+|.*O
+|...
++---
+
+:8,-,value(85)
+
+
+Pattern D815
+
+|.OO?        proper defense of L+1 shape
+|..O?
+|*.OO
+|....
++----
+
+:8,-,value(85)
+
+
+Pattern D816
+
+|.OX        important shape point
+|X.O       
+|*.O
+|...
++---
+
+:8,s,value(35)
+
+
+Pattern D817
+
+|.OX        important shape point
+|X.O
+|*.O
+|...
++---
+
+:8,s,value(45)
+
+|.aX
+|X.O
+|*.O
+|...
++---
+
+;attack(a) && ! oplay_attack(*,a)
+
+
+Pattern D818
+
+|O??        throw in to improve eye potential
+|.OO
+|*X.
++---
+
+:8,s,value(75)
+
+|O??
+|.OO
+|*A.
++---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D818b
+
+|O??        throwin risky, try to live without
+|.OO
+|.X*
++---
+
+:8,s,value(76)
+
+|a??
+|.OO
+|.X*
++---
+
+;lib(a) == 2
+
+
+Pattern D819
+
+|ooO
+|*.O        secure corner eye
+|.O.
++---
+
+:8,-,value(30)
+
+
+Pattern D820
+
+|oo??       play ko to enlarge eyespace
+|.OX?
+|OX*X
++----
+
+:8,s,value(40)
+
+
+Pattern D820b
+
+|oXO?       play ko to enlarge eyespace
+|.OX?
+|OX*X
++----
+
+:8,s,value(40)
+
+|oAO?
+|.OX?
+|OX*X
++----
+
+;!oplay_defend(*,A)
+
+
+Pattern D821
+
+|oO??       might be passive, but almost certain life
+|o.O?
+|.*.O
+|..oo
++----
+
+:8,-,value(60)
+
+
+Pattern D822
+
+|o.O?       often best way to capture lunch
+|O*OO
+|.X.X
++----
+
+:8,-,value(60)
+
+|o.O?
+|O*OO
+|.X.A
++----
+
+;lib(A)==1
+
+
+Pattern D823a
+
+|OOO?        form false eye trying to at least get seki
+|.*.O
+|OXXO
+|.xxO
++----
+
+:8,-,value(45)
+
+
+Pattern D823b
+
+|OOOO        at least seki
+|*xxO
+|OXXO
+|.XxO
++----
+
+:8,-,value(46)
+
+
+Pattern D824
+
+|OOO?        at least secure seki
+|.O*O
+|OXXO
+|.X.O
++----
+
+:8,-,value(45)
+
+
+Pattern D825
+
+|ooO        threaten to make eyes in the corner
+|.OX
+|*X.
+|...
++---
+
+:8,-,value(85)
+
+|ooO
+|.aX
+|*B.
+|...
++---
+
+;!oplay_attack(*,a) && oplay_attack(*,B)
+
+
+Pattern D826
+
+|ooo        if nothing else works, make an eye in the corner
+|*.o
+|.O?
++---
+
+:8,-,value(25)
+
+|ooo
+|*ao
+|.O?
++---
+
+;oplay_attack(*,a,a)
+
+
+Pattern D827
+
+|.XX???        special corner shape
+|.OOXX?
+|.*.OOX
+|.....o
++------
+
+:8,-,value(80)
+
+
+Pattern D828
+
+|ooO?          block on 1-2 with atari
+|o.OX
+|.*X.
++----
+
+:8,-,value(80)
+
+
+Pattern D829
+
+|OO??          special corner shape, setting up ko
+|..O?
+|.O..
+|..*.
++----
+
+:8,-,value(55)
+
+|aa??
+|..O?
+|.O..
+|..*.
++----
+
+;lib(a)==2
+
+
+Pattern D830
+# gf New pattern. (3.1.1)
+
+|OO?          special corner shape, setting up ko
+|..O
+|XOo
+|*.O
++---
+
+:8,-,value(55)
+
+|aa?
+|..O
+|XOo
+|*.O
++---
+
+;lib(a)==2
+
+
+Pattern D831
+
+|OOo?        (at least) ko
+|.XOo
+|OXXO
+|.*xO
++----
+
+:8,s,value(35)
+
+
+Pattern D832
+# gf New pattern. (3.1.9)
+
+|O??        throw in to improve eye potential
+|.Oo
+|*XX
++---
+
+:8,s,value(35)
+
+|O??
+|.Oo
+|*AX
++---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D833
+# tm added (3.1.13)
+# useful in manyfaces:8
+# gf Revised pattern. (3.1.14)
+
+?O?|     vital corner point.
+O.O|
+O.x|
+O.*|
+o..|
+---+
+
+:8,-,value(40)
+
+
+Pattern D834
+# gf New pattern. (3.1.14)
+
+?O?|     often best defense
+O.O|
+O..|
+O*X|
+...|
+---+
+
+:8,-,value(40)
+
+
+Pattern D835
+# tm New Pattern (3.1.15)  (see trevora:400)
+
+|.*.   Special corner pattern
+|.XO
+|...
+|...
++---
+
+:8,-,value(65)
+
+
+Pattern D836
+# tm New Pattern (3.1.15)
+
+|O.
+|.*
++--
+
+:8,-,value(65)
+
+|OA
+|.*
++--
+
+; oplay_attack(*,A,A)
+
+
+Pattern D837
+# tm New Pattern (3.1.16)
+#    see trevor:200 
+
+??oO.|     special corner defend at 2-2
+?O...|
+o.X..|
+O..*.|
+.....|
+-----+  
+
+:8,-,value(55)
+
+
+Pattern D838
+# tm New Pattern (3.1.16)
+
+|.*?
+|.XO
+|OXO
+|.O?
++---
+
+:8,-,value(55)
+
+|.*?
+|.AO
+|OXO
+|.O?
++---
+
+;oplay_attack(*,A)
+
+
+Pattern D839
+# gf New pattern. (3.3.18)
+
+|.X??     Capture lunch with threat to make second eye
+|.OO?
+|.XO?
+|*XOo
+|...o
++----
+
+:8,-,value(88)
+
+|.X??
+|cOO?
+|.AO?
+|*AOo
+|.b.o
++----
+
+;does_attack(*,A) && xplay_attack(b,*,c,A)
+
+
+Pattern D840
+# gf New pattern. (3.5.3)
+# See seki:203.
+
+|OO??
+|.*O?
+|XXOO         make seki
+|.O.O
++----
+
+:8,-,value(25)
+
+
+Pattern D841
+# gf New pattern. (3.5.5)
+# See ld_owl:503.
+
+|..O?
+|..O?         make eyeshape
+|..OX
+|.*..
+|....
++----
+
+:8,-,value(45)
+
+
+Pattern D842
+# gf New pattern. (3.5.5)
+
+???X.|
+?XXO.|       aim for ko
+XOO..|
+...*.|
+.....|
+-----+
+
+:8,-,value(76)
+
+
+Pattern D843
+# pp New pattern (3.5.5)
+
+|OOOOO     workaround lunch problem (the eye is not considered a unit)
+|..*.O
+|.X..O
++-----
+
+:8,-,value(80)
+
+
+Pattern D844
+# gf New pattern. (3.7.2)
+
+|.OO        partition corner eyespace to avoid bent four complications
+|.*.
++---
+
+:8,-,value(40)
+
+|bOO
+|.*a
++---
+
+;owl_proper_eye(a) && owl_proper_eye(b) && owl_big_eyespace(a)
+
+
+Pattern D845
+# gf New pattern. (3.7.2)
+# See ld_owl:321.
+
+|OO.o         converse to A1305b
+|*X.O
+|...O
++----
+
+:8,s,value(35)
+
+|aa.o
+|*X.O
+|...O
++----
+
+;lib(a)==2
+
+
+Pattern D846
+# gf New pattern. (3.7.2)
+# See ld_owl:321.
+
+|OO.o         followup
+|OX.O
+|.*.O
++----
+
+:8,-,value(35)
+
+
+Pattern D847
+# gf New pattern. (3.7.2)
+# See ld_owl:321.
+
+|OO.o         followup
+|OX*O
+|.X.O
++----
+
+:8,-,value(35)
+
+
+#########################################################
+#                                                       #
+#                  Prevent intrusion                    #
+#                                                       #
+#########################################################
+
+
+Pattern D900
+# gf Added constraint. (3.3.20)
+
+??O?        block on edge
+XO.?
+xX*o
+----
+
+:8,-,value(75)
+
+??O?
+Xa.?
+xX*o
+----
+
+;oplay_attack(*,a)!=WIN
+
+
+Pattern D902
+
+XO.          stop connection under
+.*X
+---
+
+:8,-,value(80)
+
+XO.
+.*A
+---
+
+; does_attack(*,A)
+
+
+#FIXME:  D903 & D904 often both match, reducing the number
+#  of patterns available for other options.  Perhaps reduce
+#  the value of one or the other?
+
+Pattern D903
+# tm modified (3.1.17)
+
+XOX        descend to prevent connection
+.*.
+---
+
+:8,-,value(85)
+
+AOX
+.*.
+---
+
+; does_attack(*,A)
+
+
+Pattern D904
+
+XOX         hane to prevent connection
+*..
+---
+
+:8,-,value(84)
+
+AOX
+*..
+---
+
+; does_attack(*,A)
+
+
+Pattern D905
+
+*XOX        clamp to prevent connection
+....
+----
+
+:8,-,value(86)
+
+*AOX
+....
+----
+
+; does_attack(*,A)
+
+
+Pattern D906
+# O dragons may not be amalgamated
+
+O..O?       block connection
+..XOX
+...*.
+-----
+
+:8,-,value(45)
+
+
+Pattern D907
+# O dragons may not be amalgamated
+
+O..O?       threaten one stone
+.*XOX
+.....
+-----
+
+:8,-,value(45)
+
+
+Pattern D908
+
+?OO??       threaten one stone
+O..O?
+.*XOX
+.....
+-----
+
+:8,-,value(75)
+
+?OO??
+O.aO?
+.*XOX
+.....
+-----
+
+;oplay_attack(*,a,a)
+
+
+Pattern D909
+# gf New pattern. (3.1.14)
+
+O*           stop capture inside eyespace, not ko
+
+:-,-,value(55)
+
+a*
+
+;lib(a)==1 && owl_eyespace(*) && olib(*) > 0
+
+
+Pattern D910a
+# gf New pattern. (3.1.15)
+
+o.O.X        block
+.*X..
+.....
+-----
+
+:8,-,value(65)
+
+
+Pattern D910b
+# gf New pattern. (3.1.15)
+
+o.O.X        block in sente
+.*X..
+.....
+-----
+
+:8,-,value(75)
+
+obO.X
+.*Xa.
+.....
+-----
+
+;xplay_attack(a,*,b,b)
+
+
+Pattern D911
+# db added (3.3.4)
+
+oo????         stop the monkey jump
+oooo??
+.*...X
+..X...
+------
+
+:8,-,value(70)
+
+ob????
+acdo??
+.*...X
+..X...
+------
+
+; o_somewhere(a,b,c,d)
+
+
+#########################################################
+#                                                       #
+#                    Prevent a cut                      #
+#                                                       #
+#########################################################
+
+
+Pattern D1000
+# tm modified (3.1.22)
+
+O*          prevent opponent's safe cut
+XO
+
+:/,-,value(60)
+
+B*
+aC
+
+; (wormsize(B) > 1 && wormsize(C) > 1)
+;  && safe_xmove(*) && !xplay_attack(*,a)
+
+
+Pattern D1000a
+
+O*          save large section
+
+:-,-,value(95)
+
+A*
+
+; lib(A) == 1 && wormsize(A) > 2
+
+
+Pattern D1001
+
+X*O       connect
+?OX
+
+:8,n,value(70)
+
+X*O
+?Oa
+
+;!attack(a) || (wormsize(a)<=2 && does_attack(*,a))
+
+
+Pattern D1001b
+
+?XOOo
+XO.X*
+x.O..
+-----
+
+:8,n,value(71)
+
+
+Pattern D1002
+# Smaller value if opponent can't cut.
+# gf Revised constraint. (3.1.11)
+
+X*O       connect
+?OX
+
+:8,-,value(35)
+
+X*O
+?Oa
+
+; !attack(a) && xlib(*) > 1
+
+
+Pattern D1003
+# Notice similarity with D310a, D310b.
+# tm reduced value (3.1.22)  (see trevorc:1440)
+
+????
+?*.O       hanging connection to protect eyespace
+?.OX
+?oo?
+
+:8,-,value(55)
+
+????
+?*ab
+?.Oc
+?oo?
+
+;lib(b)>1 && oplay_attack(*,a,a) && !xplay_attack_either(*,?,a,a,c)
+
+
+Pattern D1004
+# Less attractive when making empty triangle.
+# gf Added n classification. (3.1.14)
+# tm Modified constraint (3.1.16)
+# tm Modified constraint (3.1.23)
+# nn Modified constraint (3.3.11)
+
+????
+?*.O       hanging connection to protect eyespace
+?OOX
+
+:8,n,value(69)
+
+??D?
+?*ab
+?OOc
+
+;(lib(b)>1 && oplay_attack(*,a,a) && !xplay_attack_either(*,?,a,a,c))
+;&& (!x_somewhere(D) || oplay_attack(*,a,D))
+;&& (!legal_xmove(D) || oplay_attack(*,D,D))
+
+
+Pattern D1004b
+# gf New pattern. (3.1.14)
+
+----
+oooo       sometimes useful to partion eyespace on edge or in corner
+.*.O       
+oOOX
+
+:8,-,value(45)
+
+
+Pattern D1005
+
+....       repair shape in center
+.*OX
+.OXx
+
+:8,-,value(80)
+
+
+Pattern D1006
+# gf Added n classification. (3.1.11)
+# gf Revised constraint. (3.3.6)
+
+OXO            connect underneath
+.*.
+---
+
+:|,n,value(60)
+
+aCb
+.*.
+---
+
+;lib(a)>1 && lib(b)>1 && !attack(C)
+
+
+Pattern D1006b
+# gf New pattern. (3.1.14)
+# gf Revised constraint. (3.1.32)
+
+OXO            connect underneath
+.*.
+---
+
+:|,nE,value(80)
+
+aXb
+.*.
+---
+
+;(owl_escape_value(a)>0 || owl_escape_value(b)>0) && lib(a)>1 && lib(b)>1
+
+
+Pattern D1007
+# gf Revised constraint. (3.1.14)
+# gf Revised constraint. (3.3.20)
+
+OXO            connect underneath in sente
+.*.
+---
+
+:|,a,value(90)
+
+bAc
+.*.
+---
+
+;lib(A) == 2 && lib(b)>1 && lib(c)>1 && !attack(A) && !oplay_disconnect(*,b,c)
+
+
+#########################################################
+#                                                       #
+#            Attack a defect in the perimeter           #
+#                                                       #
+#########################################################
+
+
+Pattern D1100
+# gf Split and revised pattern. (3.5.5)
+# gf Revised constraint. (3.7.9)
+
+X*          attack the surrounding chain
+OX
+
+:/,b,value(88)
+
+A*
+OB
+
+;vital_chain(A) && vital_chain(B) && !ko(*) && !oplay_defend_both(*,A,B)
+
+
+Pattern D1100b
+# gf Split and revised pattern. (3.5.5)
+
+X*          attack the surrounding chain
+OX
+
+:/,b,value(92)
+
+A*
+OB
+
+;vital_chain(A)>1 && vital_chain(B)>1 && !oplay_defend_both(*,A,B)
+
+
+Pattern D1101
+
+...          try to break out
+X*X
+?O?
+
+:|,-,value(95)
+
+.a.
+b*c
+?O?
+
+; oplay_break_through(*,a,b,a,c) == WIN
+
+
+Pattern D1102
+# tm reduced value (3.1.16)
+# gf Revised constraint. (3.5.3)
+
+...        create cutting points
+X*X
+?O?
+
+:|,-,value(50)
+
+c.d
+A*B
+?O?
+
+;(lib(A)<=3 && olib(c)>2) || (lib(B)<=3 && olib(d)>2)
+
+
+Pattern D1102a
+# nn New pattern (3.3.11)
+
+.....        create cutting points
+.X*X.
+..O..
+
+:|,-,value(45)
+
+
+Pattern D1103
+
+?OO.
+OXX*     capture or cut
+?...
+....
+----
+
+:8,-,value(85)
+
+?OOa
+OBB*
+?...
+....
+----
+
+;oplay_attack_either(*,a,B,a)
+
+
+Pattern D1104
+# The two O's may be in different dragons.
+# Normally this is enough to live.
+
+??oo?       kill one stone
+.O..O
+...*X
+.....
+-----
+
+:8,-,value(100)
+
+??oo?
+.O..O
+...*a
+.....
+-----
+
+; does_attack(*,a)
+
+
+Pattern D1105
+
+??o?       cut off stone on second line
+?X*o
+OOXo
+....
+----
+
+:8,b,value(35)
+
+
+Pattern D1106
+
+.O?           hane, threatening capture
+...
+X*.
+O.X
+
+:8,-,value(77)
+
+.O?
+...
+B*.
+OaX
+
+; oplay_attack(*,a,B)
+
+
+Pattern D1107
+
+XOXx       capture to defend
+*XO.
+----
+
+:8,-,value(35)
+
+
+Pattern D1108
+
+X....      surrounding chain collapses
+OXX*.
+.OOX.
+.....
+
+:8,B,value(95)
+
+Ba...
+OCC*.
+eOODf
+.....
+
+; !oplay_defend_both(*,f,a,B,C) && oplay_attack(*,D) && !safe_xmove(e)
+
+
+Pattern D1108b
+
+X*...      surrounding chain collapses
+OXXO.
+.OOXX
+.....
+
+:8,B,value(95)
+
+B*...
+OCCO.
+.aaXX
+.....
+
+;owl_goal_dragon(a) && !oplay_defend_both(*,B,C)
+
+
+Pattern D1109
+
+?O?         capture left or right
+X*X
+.X.
+
+:8,-,value(60)
+
+?O?
+A*B
+.X.
+
+; oplay_attack(*,A) && oplay_attack(*,B)
+
+
+Pattern D1110
+# may overlap with D1333 and D1335
+
+OOX.         double atari
+OX*.
+X..?
+
+:8,b,value(75)
+
+OOB.
+OX*.
+Xa.?
+
+; oplay_attack(*,a,B)
+
+
+Pattern D1111
+
+?..??      cutting combination
+OX*.?
+?OX..
+?OX..
+?oOX.
+
+:8,Bs,value(90)
+
+?a.??
+OX*g?
+?hXcf
+?OXbd
+?oiXe
+
+;owl_goal_dragon(h) && lib(i)>1 && oplay_attack(*,a,b,c,d,e,f,g,e)
+
+
+Pattern D1112
+
+??O.?      cutting combination, followup
+?OX..
+?OX*.
+?oOX.
+
+:8,B,value(90)
+
+??Oe?
+?fXad
+?OX*b
+?ogXc
+
+;owl_goal_dragon(f) && lib(g)>1 && oplay_attack(*,a,b,c,d,e,c)
+
+
+Pattern D1113
+
+??O.?      cutting combination, followup
+?OXX.
+?OXO*
+?oOX.
+
+:8,B,value(90)
+
+??Oc?
+?dXXb
+?OXO*
+?oeXa
+
+;owl_goal_dragon(d) && lib(e)>1 && oplay_attack(*,a,b,c,a)
+
+
+Pattern D1114
+
+??O.?      cutting combination, followup
+?OXX*
+?OXOO
+?oOXX
+
+:8,B,value(90)
+
+??Oa?
+?cXX*
+?OXOO
+?odBB
+
+;owl_goal_dragon(c) && lib(d)>1 && oplay_attack(*,a,B)
+
+
+Pattern D1115
+
+o.X?       continue ladder
+.*OX
+.XOO
+?.X?
+
+:8,-,value(80)
+
+
+Pattern D1116
+
+XXOo           capture (possibly with ko)
+.*XO
+...X
+----
+
+:8,-,value(65)
+
+XXOo
+.*XO
+..aX
+----
+
+;oplay_attack(*,a,a)
+
+
+Pattern D1117
+
+.xX?        try to push out
+..*O
+..XO
+..xx
+----
+
+:8,-,value(75)
+
+.xX?
+.a*O
+..BO
+..xx
+----
+
+;oplay_attack(*,a,B)
+
+
+Pattern D1117a
+# tm New Pattern (3.1.15)
+#   continuation of D1117
+
+.xX?        try to push out
+.*OO
+.XXO
+..xX
+----
+
+:8,-,value(75)
+
+.xX?
+a*OO
+.XXO
+..xB
+----
+
+;oplay_attack(*,a,B) && wormsize(B) > 2
+
+
+Pattern D1118
+
+ooo?       capture to defend and threaten escape
+X*X?
+OXOX
+?O.?
+
+:8,-,value(85)
+
+
+Pattern D1119
+
+oOX.?      might break through somewhere
+?*..?
+X.X.?
+...o?
+?????
+
+:8,E,value(70)
+
+oOX.?
+?*..b
+X.X.?
+...o?
+?a???
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1120
+
+ooX.?       might break through
+?O*.?
+X.X.?
+...o?
+?????
+
+:8,E,value(81)
+
+ooX.?
+?O*.b
+X.X.?
+...o?
+?a???
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1120b
+
+ooX.       might break through
+?OOX
+X*X.
+...o
+
+:8,-,value(81)
+
+
+Pattern D1121a
+# gf Split pattern. (3.3.17)
+
+OoXo       push into the open
+.*.o
+X..o
+oooo
+
+:8,-,value(70)
+
+
+Pattern D1121b
+# gf Split pattern. (3.3.17)
+
+OOXo       push into the open
+X*.o
+X..o
+oooo
+
+:8,-,value(70)
+
+
+Pattern D1121c
+# gf Split pattern. (3.3.17)
+
+O.Xo       push into the open
+X*.o
+X..o
+oooo
+
+:8,-,value(70)
+
+OaXo
+B*.o
+B..o
+oooo
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern D1122
+# gf Repaired constraint. (3.3.6)
+
+?O?        Cut and maybe capture to make eye
+X*X
+---
+
+:|,-,value(45)
+
+?O?
+A*B
+---
+
+;oplay_attack(*,A) || oplay_attack(*,B)
+
+
+Pattern D1123
+# tm modified (3.1.17) added b classification
+
+oX*o      break through
+OOX.
+OX..
+X..?
+
+:8,b,value(86)
+
+oB*o
+OOXa
+OX..
+X..?
+
+;oplay_attack(*,a,B)
+
+
+Pattern D1124
+
+OXO        double atari
+X*?
+
+:8,bE,value(90)
+
+OAc
+B*?
+
+;lib(A)==2 && owl_escape_value(c)>0 && !oplay_defend_both(*,A,B)
+
+
+Pattern D1125
+
+ooo?
+...o
+.*X.
+?OOX
+
+:8,E,value(79)
+
+abc?
+...o
+.*X.
+?OOX
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1126
+# gf Revised constraint and added B classification. (3.1.8)
+
+OX.      cut to capture something
+X*.
+..?
+
+:8,b,value(82)
+
+cB.
+A*.
+b.?
+
+;lib(c)>1 && oplay_attack(*,A) && oplay_attack(*,b,B)
+
+
+Pattern D1127
+# gf Added constraint and B classification. (3.1.8)
+
+.O.        atari!       
+X*X
+OX.
+oO?
+
+:8,b,value(35)
+
+.O.
+X*X
+aX.
+oO?
+
+;lib(a)>1
+
+
+Pattern D1128
+# gf Added B classification. (3.1.8)
+
+...o       set up multiple ataris
+...O
+.*XO
+?XO?
+
+:8,B,value(45)
+
+
+Pattern D1129
+# db added B class (3.1.8)
+
+..*o       set up multiple ataris
+..XO
+.OXO
+?XO?
+
+:8,B,value(77)
+
+
+Pattern D1130
+
+O.??         prevent cut
+XO*X
+xXO?
+
+:8,-,value(35)
+
+Oa??
+XO*X
+xbO?
+
+; !safe_xmove(a) && lib(b)>1
+
+
+Pattern D1131
+
+OX       cut to capture something and escape
+X*
+?O
+
+:8,E,value(90)
+
+bC
+D*
+?a
+
+;owl_goal_dragon(a) && owl_escape_value(b)>0
+;&& oplay_attack(*,C) && oplay_attack(*,D)
+
+
+Pattern D1132
+# db added (3.1.7)
+# tm reduced value (3.1.18)  (see trevorb:590)
+
+?X*O          cut to find defects
+OOX.
+
+:8,b,value(45)
+
+?A*O
+OOB.
+
+; oplay_attack_either(*,A,B)
+
+
+Pattern D1133
+# gf New pattern. (3.1.9)
+
+?X.o
+Ox*.         escape
+oO..
+----
+
+:8,E,value(65)
+
+?X.o
+Ox*a
+oO..
+----
+
+;owl_escape_value(a)>0
+
+
+Pattern D1134
+# tm new pattern (3.1.14)
+# Give a very low value, unless add lots of constraints.
+# See trevor:520.
+
+XXO      Cut!
+O*X
+OX.
+?..
+
+:8,b,value(5)
+
+
+Pattern D1135
+# tm new pattern (3.1.14)
+# See trevor:330
+
+O*.    connect out, threaten cut
+X.?
+
+:8,E,value(35)
+
+O*a
+B.?
+
+; owl_escape_value(a)>0
+; && oplay_attack(*,a,B)
+
+
+Pattern D1137
+# gf New pattern. (3.1.14)
+# gf Bugfix. (3.1.18)
+# See buzco:6
+
+?oo?
+?..o
+X*.o
+O.??
+
+:8,BE,value(65)
+
+?oc?
+?..d
+B*.o
+Oa??
+
+;lib(B)<=4 && owl_escape_value(c) + owl_escape_value(d) > 0
+;&& oplay_attack_either(*,a,a,B)
+
+
+Pattern D1138
+# tm New Pattern (3.1.17)
+# tm modified (3.1.23)
+
+????
+.X*?   breakout!
+XOX?
+
+:8,sbE,value(85)
+
+e?f?
+.B*?
+AOCd
+
+; lib(C) == 2
+; && (owl_escape_value(e) > 0 || vital_chain(A))
+; && (owl_escape_value(f) > 0 || vital_chain(C))
+; && olib(*) > 1
+; && oplay_attack_either(*,d,B,A)
+
+
+Pattern D1139
+# tm New Pattern (3.1.20) (see nngs:110)
+# gf Added n classification. (3.3.20)
+
+?*
+XO
+OX
+
+:8,bEn,value(75)
+
+?*
+aO
+Ob
+
+; (owl_escape_value(*) > 0) && !oplay_defend_both(*,a,b)
+
+
+Pattern D1140
+# tm New Pattern (3.1.20) (see nngs:1320 owl_does_attack L15 M17)
+
+?XO
+?*.
+???
+
+:8,bE,value(70)
+
+?aO
+b*.
+cd?
+
+;(owl_escape_value(b) > 0
+; || owl_escape_value(c) > 0
+; || owl_escape_value(d) > 0)
+;&& oplay_attack(*,a)
+
+
+Pattern D1141
+# tm New Pattern (3.1.22)
+#  (see nngs:1810  owl_attack M17, result 3 L16)
+
+...    atari for tempo
+O.X
+OX.
+X*.
+
+:8,-,value(45)
+
+...
+O.X
+OX.
+a*.
+
+; lib(a) == 2 || oplay_attack(*,a)
+
+
+Pattern D1142
+# pp New pattern (3.5.3).  See nngs4:420.
+# gf Fixed symmetry. (3.7.1)
+
+?X?        split boundary in hope that it will help;
+*OX        low value because it's not guaranteed it will
+?XO
+
+:8,b,value(30)
+
+?C?
+*AX
+?XB
+
+; does_defend(*,A) && !oplay_attack(*,B)
+; && !same_string(B,C) && vital_chain(B) && vital_chain(C)
+; && (oplay_attack(*,B) || oplay_attack(*,C)) && !oplay_connect(*,B,C)
+
+
+Pattern D1143
+# gf New pattern. (3.5.3).
+# See e.g. nngs:1090.
+
+.*XO
+XOXO
+..Oo
+----
+
+:8,-,value(65)
+
+.*Ac
+BOAc
+..do
+----
+
+;lib(A)==2 && lib(c)>1 && lib(d)>1 && oplay_attack(*,B)
+
+
+Pattern D1144
+# gf New pattern. (3.5.3).
+# See 13x13b:23.
+
+OXO        escape by capturing
+.*X
+---
+
+:8,-,value(82)
+
+bXc
+.*A
+---
+
+; lib(A) == 1 && (owl_escape_value(b) > 0 || owl_escape_value(c) > 0)
+
+
+Pattern D1144b
+# gf New pattern. (3.5.3).
+# See 13x13b:23.
+
+OXO        escape by capturing
+.*X
+---
+
+:8,-,value(40)
+
+OXO
+.*A
+---
+
+; lib(A) == 1
+
+
+########################################################
+#                                                       #
+#                       Kikashi                         #
+#                                                       #
+#########################################################
+#                                                       #
+#  Forcing moves that may improve the eyespace          #
+#                                                       #
+#########################################################
+
+
+Pattern D1200
+
+.X...|         forcing move
+.*X..|
+.OOX.|
+.....|
+-----+
+
+:8,-,value(80)
+
+
+Pattern D1201a
+# gf Split pattern. (3.5.3)
+
+XOo         atari to build eyespace
+*.O
+ooo
+
+:8,-,value(50)
+
+AOo
+*.O
+ooo
+
+; lib(A)==2
+
+
+Pattern D1201b
+# gf Split pattern and revised constraint. (3.5.3)
+
+XOo         atari to build eyespace
+*.O
+Xoo
+
+:8,-,value(50)
+
+AOo
+*.O
+Boo
+
+; lib(A)==2 && !oplay_defend_both(*,A,B)
+
+
+Pattern D1202
+# tm modified (3.1.22) (see owl:152)
+
+o*X?         move up with atari
+o.OO
+....
+----
+
+:8,-,value(75)
+
+o*A?
+B.OO
+....
+----
+
+;lib(A) <= 2 && (o_somewhere(B) || !attack(A) || defend(A))
+
+
+Pattern D1203
+
+OOX           block in sente 
+.*x
+---
+
+:8,-,value(80)
+
+OOA
+b*x
+---
+
+;!attack(A) && oplay_attack(*,A) && !obvious_false_oeye(b)
+
+
+Pattern D1204
+
+OOo           block in sente 
+.*X
+---
+
+:8,-,value(85)
+
+OOo
+b*A
+---
+
+;wormsize(A)>=3 && !attack(A) && oplay_attack(*,A) && !obvious_false_oeye(b)
+
+
+Pattern D1205
+
+?X?         connect, cut, and threaten to capture
+O*O
+?X?
+
+:|,-,value(50)
+
+?A?
+O*O
+?X?
+
+;oplay_attack(*,A)
+
+
+Pattern D1206
+
+oOo        capture, threatening to take again
+OXO
+?*X
+
+:8,-,value(40)
+
+oOo
+OXO
+?*A
+
+; oplay_attack(*,A)
+
+
+Pattern D1207
+# gf New pattern. (3.7.3)
+
+o..x       sacrifice a stone to gain tempo
+.X*.
+....
+----
+
+:8,s,value(40)
+
+ob.x
+aX*.
+....
+----
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+#########################################################
+#                                                       #
+#                       Escape                          #
+#                                                       #
+#########################################################
+
+
+Pattern D1300
+
+OX         connect out
+.*
+XO
+
+:8,Ea,value(90)
+
+cb
+a*
+XO
+
+;owl_escape_value(c)>0 && oplay_attack_either(*,a,a,b)
+
+
+Pattern D1300b
+
+OX         connect out
+*.
+XO
+
+:8,Ea,value(89)
+
+cX
+*a
+BO
+
+;owl_escape_value(c)>0 && oplay_attack_either(*,a,a,B)
+
+
+Pattern D1301
+
+?X.?       connect to another dragon
+O*.O
+....
+
+:8,a,value(90)
+
+?Xc?
+f*ag
+.ebd
+
+;(!owl_goal_dragon(f) || !owl_goal_dragon(g))
+;&& (oplay_attack(*,a,b,c,d,e,e) || oplay_attack(*,a,b,c,e,d,d))
+
+
+Pattern D1301b
+# gf New pattern. (3.3.7)
+
+?Xo?       connect to another dragon
+O*.O
+.xo?
+
+:8,a,value(90)
+
+?Xo?
+a*.b
+.xo?
+
+;(!owl_goal_dragon(a) || !owl_goal_dragon(b))
+;&& !oplay_disconnect(*,a,b)
+
+
+Pattern D1302
+# gf Revised constraint. (3.1.15)
+
+OX?        try to connect out
+.*O
+.??
+
+:8,a,value(80)
+
+bX?
+a*c
+.de
+
+;!(o_somewhere(d) && o_somewhere(e))
+;&& (!owl_goal_dragon(b) || !owl_goal_dragon(c)) && oplay_attack(*,a,a)
+
+
+Pattern D1303
+
+?????
+oooo?   try to escape
+X.*o?
+?O.o?
+??Xo?
+
+:/,E,value(80)
+
+?????
+ooca?
+X.*b?
+?O.o?
+??Xo?
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1304
+
+ooooo    try to escape
+....o
+X.*.o
+?O..o
+??X.o
+
+:/,E,value(80)
+
+oooab
+....c
+X.*.o
+?O..o
+??X.o
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1305
+
+????
+oooo
+..*.    try to escape
+X.Ox
+?O.X
+
+:8,E,value(75)
+
+????
+oabc
+..*.
+X.Ox
+?O.X
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1306
+
+??oo
+xX*.    try to escape
+X.O.
+?O.X
+
+:8,E,value(79)
+
+??ab
+xX*.
+X.O.
+?O.X
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1307
+
+???oo
+xX.*o    try to escape
+X.O.?
+?O.??
+
+:8,E,value(80)
+
+???oa
+xX.*o
+X.O.?
+?O.??
+
+;owl_escape_value(a) > 0
+
+
+Pattern D1308
+# gf Not towards edge. (3.1.15)
+
+oooo?
+O.*o?   try to escape
+....?
+....?
+-----
+
+:8,E,value(75)
+
+ooob?
+O.*a?
+....?
+....?
+-----
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1309
+
+oo..o
+O..*o    try to escape
+.....
+.....
+-----
+
+:8,E,value(81)
+
+oo..b
+O..*a
+.....
+.....
+-----
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1309b
+# More positive shape than previous pattern.
+
+?ooo?    try to escape
+o.*.o
+O...O
+.....
+.....
+-----
+
+:8,E,value(82)
+
+?ooo?
+o.*.b
+O...a
+.....
+.....
+-----
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1310
+#tm modified (3.1.15) (see trevora:400)
+#tm added b constraint (3.1.17)
+
+?ooo
+?ooo    try to escape
+X*oo
+?OX?
+
+:8,E,value(80)
+
+dabo
+eooc
+X*oo
+?OX?
+
+;(!x_somewhere(e) && !x_somewhere(d) && (owl_escape_value(a) > 0))
+;|| owl_escape_value(b) > 0
+;|| owl_escape_value(c) > 0
+
+
+Pattern D1311
+
+oooo
+o.oo    try to escape
+.*.o
+xOX?
+
+:8,E,value(80)
+
+oabo
+o.oc
+.*.o
+xOX?
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1312
+
+ooooo
+....o
+....o    try to escape
+X*..o
+?OX??
+
+:8,E,value(80)
+
+ooabo
+....c
+....o
+X*..o
+?OX??
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1313
+
+O...
+O.*.     run away
+....
+????
+
+:8,E,value(55)
+
+O..b
+O.*a
+....
+????
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1314
+# nn Modified (3.3.13)
+#   It's rather pointless to match at the edge
+
+o.o?
+O.O.     run away
+....
+....
+.*..
+????
+
+:8,E,value(55)
+
+o.o?
+O.O.
+....
+....
+.*..
+????
+
+;owl_escape_value(*) > 0
+
+
+Pattern D1315
+# db generalized (3.3.14)
+
+o.o
+O.O     run away
+...
+.*.
+?oo
+
+:8,E,value(50)
+
+o.o
+O.O
+...
+.*.
+?ab
+
+; owl_escape_value(a) > 0 || owl_escape_value(b) > 0
+
+
+Pattern D1316
+
+OX          connect out
+*O
+
+:8,n,value(35)
+
+OX
+*a
+
+;!owl_goal_dragon(a)
+
+
+Pattern D1316b
+# gf New pattern. (3.3.17)
+
+OX          connect out to strong dragon
+*O
+
+:8,n,value(90)
+
+OX
+*a
+
+;owl_strong_dragon(a)
+
+
+Pattern D1317
+
+o..X         move out, separate, and escape
+o.*O
+o...
+??XX
+
+:8,E,value(90)
+
+o..X
+a.*O
+o...
+??XX
+
+;owl_escape_value(a)>0
+
+
+Pattern D1318
+# gf Too vague, reduced. (3.1.9)
+# gf Still too vague, removed. (3.1.14)
+# evand modified and reinstated, with lower value. (3.3.18)
+
+??....      try to run towards center
+??....
+??..*.
+??...O
+
+:8,-,value(50)
+
+??bce.
+??a...
+??d.*.
+??...O
+
+;owl_escape_value(a) > 0 || owl_escape_value(b) > 0
+;|| owl_escape_value(c) > 0 || owl_escape_value(d) > 0
+;|| owl_escape_value(e) > 0
+
+
+Pattern D1319
+
+...      jump to the center
+...
+.*.
+...
+oOo
+ooo
+ooo
+---
+
+:8,-,value(82)
+
+
+Pattern D1320
+# tm modified (3.1.20)
+
+O*O      connect to friendly dragon
+
+:+,n,value(35)
+
+a*b
+
+;!owl_goal_dragon(a) || !owl_goal_dragon(b)
+
+
+Pattern D1320a
+# tm New Pattern (3.1.20)
+# gf Changed symmetry to accomodate for asymmetric constraint. (3.1.23)
+
+?X?
+O*O      connect to friendly dragon
+...
+
+:8,n,value(70)
+
+?X?
+A*B
+cd.
+
+; (!owl_goal_dragon(A) || !owl_goal_dragon(B))
+; && !xplay_attack_either(*,d,c,c,*)
+
+
+Pattern D1320b
+# gf New pattern. (3.3.17)
+
+O*O      connect to strong friendly dragon
+
+:+,n,value(90)
+
+a*b
+
+;owl_strong_dragon(a) || owl_strong_dragon(b)
+
+
+Pattern D1321
+
+*.O
+O.O      connect to friendly dragon by bamboo joint
+
+:8,na,value(36)
+
+*.b
+a.b
+
+;!owl_goal_dragon(a) || !owl_goal_dragon(b)
+
+
+Pattern D1321b
+# gf New pattern. (3.3.17)
+
+*.O
+O.O      connect to strong friendly dragon by bamboo joint
+
+:8,na,value(91)
+
+*.b
+a.b
+
+;owl_strong_dragon(a) || owl_strong_dragon(b)
+
+
+Pattern D1322
+# gf Constraint revised. (3.7.9)
+
+.*O
+OXO      connect to friendly dragon by atari
+
+:8,na,value(36)
+
+.*b
+aCb
+
+;(!owl_goal_dragon(a) || !owl_goal_dragon(b)) && lib(C) <= 2 && lib(a) > 1
+
+
+Pattern D1323
+#    without more context this is often an inferior
+#    solution (for example games/manner.sgf move 12).
+# tm Modified (3.1.17)
+# gf Removed safe_xmove(*) from constraint. This is redundant with n
+#    classification. (3.1.17)
+
+O*O      connect to escape
+
+:+,nE,value(35)
+
+a*b
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1323a
+# tm New Pattern (3.1.17)
+
+??X      connect out in sente
+?O*
+?.O
+
+:8,nE,value(55)
+
+BCd
+AO*
+?.O
+
+;(owl_escape_value(A) > 0
+; || owl_escape_value(B) > 0
+; || owl_escape_value(C) > 0)
+;&& oplay_attack(*,d)
+
+
+Pattern D1324
+
+*.O
+O.O      connect by bamboo joint to escape
+
+:8,nEa,value(86)
+
+*.b
+a.b
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1325
+# gf Constraint revised. (3.7.9)
+
+.*O
+OXO      connect to friendly dragon by atari to escape
+
+:8,nEa,value(86)
+
+.*b
+aCb
+
+;(owl_escape_value(a)>0 || owl_escape_value(b)>0) && lib(C) <= 2 && lib(a) > 1
+
+
+Pattern D1326
+
+O*O      connect to escape
+
+:+,E,value(35)
+
+a*b
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1329
+
+o....       jump towards safety
+O.*..
+o....
+
+:8,-,value(35)
+
+
+Pattern D1330
+
+?O.x          break out into the center
+X*.X
+....
+oooo
+
+:8,E,value(90)
+
+?O.x
+E*cX
+dab.
+ofoo
+
+;owl_escape_value(f)>0 && !oplay_defend_both(*,a,b,c,d,a,E)
+
+
+Pattern D1331
+
+?O.x          break out into the center, followup
+XO.X
+.X*.
+oooo
+
+:8,BE,value(90)
+
+?O.x
+COaX
+bD*.
+oeoo
+
+;owl_escape_value(e)>0 && !oplay_defend_both(*,a,b,C,D)
+
+
+Pattern D1332
+# gf Revised. (3.1.12)
+
+?O?x          break out into the center, followup
+XO*X
+xXO.
+oooo
+
+:8,E,value(95)
+
+?O?x
+XO*X
+xXO.
+oaoo
+
+;owl_escape_value(a)>0
+
+
+Pattern D1333
+
+?O?          break out into the center, followup
+XOX
+*XO
+ooo
+
+:8,BE,value(90)
+
+?O?
+AdX
+*BO
+oco
+
+;owl_escape_value(c)>0 && owl_goal_dragon(d) && !oplay_defend_both(*,A,B)
+
+
+Pattern D1333b
+
+?O?          break out into the center, followup
+XOX
+*XO
+?O?
+
+:8,E,value(90)
+
+?O?
+XdX
+*XO
+?c?
+
+;owl_escape_value(c)>0 && owl_goal_dragon(d)
+
+
+Pattern D1334
+# This is not handled as a lunch because capturing only gives a false eye.
+
+XOX          break out into the center, followup
+OXO
+o*o
+
+:|,E,value(95)
+
+XOX
+OXO
+o*o
+
+;owl_escape_value(*)>0
+
+
+Pattern D1335
+
+?O??          double atari to escape
+.XO?
+o*XO
+oo.?
+
+:/,BE,value(95)
+
+?O??
+.Xb?
+o*XO
+ao.?
+
+;owl_escape_value(a)>0 && owl_goal_dragon(b) && lib(b)>1
+
+
+Pattern D1336
+
+XOo           capture to escape
+*XO
+oOX
+
+:8,E,value(95)
+
+XOo
+*XO
+aOX
+
+; owl_escape_value(a)>0
+
+
+Pattern D1337
+
+?OO?          break out into the center
+X..X
+..*.
+oooo
+
+:8,BE,value(90)
+
+?OO?
+EbaX
+dc*.
+ofoo
+
+;owl_escape_value(f)>0 && !oplay_defend_both(*,a,b,c,d,c,E)
+
+
+Pattern D1338
+
+?OO?          break out into the center, followup
+X*XX
+..O.
+oooo
+
+:8,E,value(90)
+
+?OO?
+C*XX
+baO.
+odoo
+
+;owl_escape_value(d)>0 && !oplay_defend_both(*,a,b,a,C)
+
+
+Pattern D1339
+# tm modified (3.1.17)
+
+?O?          break out into the center, followup
+X*X
+oOo
+
+:|,E,value(93)
+
+?O?
+X*X
+odo
+
+;owl_escape_value(d)>0
+
+
+Pattern D1340
+
+o.X?          tunnel out
+OX*O
+....
+----
+
+:8,Ea,value(85)
+
+obX?
+cX*d
+.a..
+----
+
+;(owl_escape_value(c)>0 || owl_escape_value(d)>0) && oplay_attack(*,a,a)
+;&& !oplay_attack_either(*,b,a,*,a) && !oplay_attack_either(*,b,a,c,a)
+
+
+Pattern D1341
+
+?O??          break out into the center
+X*.X
+...?
+ooo?
+
+:8,E,value(60)
+
+?O??
+X*.X
+...?
+oao?
+
+;owl_escape_value(a)>0
+
+
+Pattern D1342
+
+X..?          miai to make eye or escape into center
+O*X?
+OX..
+o...
+----
+
+:8,-,value(60)
+
+
+Pattern D1343a
+#tm reduced value (3.1.16)
+
+ooo?           escape into center
+o..X
+o.*.
+?x.O
+
+:8,E,value(77)
+
+obo?
+a..X
+o.*.
+?x.O
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1343b
+#tm reduced value (3.1.16)
+
+ooo?           escape into center
+o..X
+o.*o
+?XoO
+
+:8,E,value(60)
+
+obo?
+a..X
+o.*o
+?XoO
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1343c
+#tm reduced value (3.1.16)
+
+ooo?           escape into center
+o..X
+o*.o
+?.oO
+
+:8,E,value(60)
+
+obo?
+a..X
+o*.c
+?.dO
+
+;o_somewhere(c,d) && (owl_escape_value(a) + owl_escape_value(b) > 0)
+
+
+Pattern D1343d
+#tm reduced value (3.1.16)
+
+ooo?           escape into center
+o..X
+o*..
+?..O
+
+:8,BE,value(55)
+
+obo?
+a..X
+o*..
+?..O
+
+;owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1344
+
+?XX?o
+oO*.o       escape along edge
+o....
+-----
+
+:8,E,value(85)
+
+?XX?o
+oO*.a
+o....
+-----
+
+;owl_escape_value(a)>0
+
+
+Pattern D1345
+# gf Revised constraint. (3.1.32)
+
+OXO        atari to connect
+.*.
+
+:8,bEa,value(85)
+
+cDe
+a*b
+
+;lib(D)==2 && lib(c)>1 && lib(e)>1
+;&& (owl_escape_value(c)>0 || owl_escape_value(e)>0)
+;&& !oplay_disconnect(*,b,a,c,e)
+
+
+Pattern D1346
+
+?O.X          break out into the center
+X.*.
+x...
+oooo
+
+:8,E,value(65)
+
+?O.X
+X.*.
+x...
+oabc
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1347
+
+OX?           capture (possibly with ko)
+XO*
+...
+---
+
+:8,a,value(75)
+
+OX?
+AO*
+...
+---
+
+;!oplay_defend(*,A)
+
+
+Pattern D1348
+
+O.?        connect to friendly dragon to escape
+.*O
+
+:8,nEa,value(36)
+
+a.?
+.*b
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1348b
+# gf New pattern. (3.3.17)
+
+O.?        connect to strong friendly dragon to escape
+.*O
+
+:8,nEa,value(90)
+
+a.?
+.*b
+
+;owl_strong_dragon(a) || owl_strong_dragon(b)
+
+
+Pattern D1348c
+# gf New pattern. (3.3.17)
+
+Oxx        connect to strong friendly dragon to escape
+.*O
+
+:8,nEa,value(90)
+
+axx
+.*b
+
+;(owl_strong_dragon(a) || owl_strong_dragon(b)) && !oplay_disconnect(*,a,b)
+
+
+Pattern D1348d
+# gf New pattern. (3.3.17)
+
+O.?        connect to strong friendly dragon to escape
+.*.
+?.O
+
+:8,nEa,value(90)
+
+a.?
+.*.
+?.b
+
+;owl_strong_dragon(a) || owl_strong_dragon(b)
+
+
+Pattern D1350
+
+?*..       capture lunch to escape (may be undervalued)
+OXO.
+
+:8,E,value(85)
+
+?*bc
+OAOd
+
+;lib(A) == 1
+;&& (owl_escape_value(b) + owl_escape_value(c) + owl_escape_value(d)) > 0
+
+
+Pattern D1351
+
+XO?
+.*X
+o.?
+
+:8,E,value(65)
+
+XO?
+.*X
+a.?
+
+;owl_escape_value(a)>0
+
+
+Pattern D1352
+
+O.OX          escape or threaten to
+..*O
+
+:8,a,value(80)
+
+ObaX
+dc*O
+
+;!owl_goal_dragon(a) && xplay_attack_either(b,c,d,b,d)
+
+
+Pattern D1353
+
+X...         hane to escape
+.*..
+OX..
+....
+----
+
+:8,-,value(80)
+
+
+Pattern D1354
+
+?...?        jump away
+?.*.?
+X...x
+?OOO?
+
+:8,E,value(65)
+
+?abc?
+?.*.?
+X...x
+?OOO?
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1355
+
+OXXO         connect out
+.O*.
+----
+
+:8,-,value(70)
+
+aXXb
+.O*.
+----
+
+;lib(a)>1 && lib(b)>1
+
+
+Pattern D1356
+# nn Modified (3.3.13) see also D1356a
+
+o....         jump towards safety
+O.*..
+o....
+
+:-,E,value(90)
+
+o..a.
+d.*b.
+o..c.
+
+; (owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0)
+; && !oplay_disconnect(*,d,*)
+
+
+Pattern D1356a
+# nn New pattern (3.3.13)
+#   B attribute since cut possible
+
+o....         jump towards safety
+O.*..
+o....
+
+:-,BE,value(80)
+
+o..a.
+d.*b.
+o..c.
+
+; (owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0)
+; && oplay_disconnect(*,d,*)
+
+
+Pattern D1356b
+# gf New pattern. (3.5.3)
+# See nngs4:40
+
+?....         jump towards safety
+O..*.
+o....
+.....
+-----
+
+:8,E,value(91)
+
+?..a.
+c..*.
+o..b.
+.....
+-----
+
+; (owl_escape_value(a) + owl_escape_value(*) + owl_escape_value(b) > 0)
+; && !oplay_disconnect(*,c,*)
+
+
+Pattern D1357
+
+o...o         block/connect to escape
+O....
+O.*..
+?OXOo
+
+:8,E,value(61)
+
+o...a
+O...b
+O.*.c
+?OXOo
+
+; owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1358
+
+O..?         connect to escape
+O.*O
+
+:8,Ea,value(61)
+
+bde?
+bc*a
+
+;(owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
+;&& oplay_attack_either(*,c,d,e,c,e)
+
+
+Pattern D1359
+
+?...?
+.....
+?.*X.
+?..OX
+?.Oo?
+
+:8,E,value(65)
+
+?bc.?
+a....
+?.*X.
+?..OX
+?.Oo?
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1360
+
+??..           run while connecting
+..*.
+.O..
+...x
+.O.x
+
+:8,E,value(65)
+
+??ac
+..*b
+.O..
+...x
+.O.x
+
+;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
+
+
+Pattern D1361a
+# too generic; see resultant A1121, see also trevor:1050
+# gf Added constraint. (3.1.32)
+# gf Split pattern. (3.5.7)
+
+X.X         push to expose weakness
+O*.
+?Xo
+
+:8,-,value(65)
+
+A.B
+O*.
+?Co
+
+;!same_string(A,B) && (lib(A) <= 4 || lib(B) <= 4 || lib(C) <= 4)
+
+
+Pattern D1361b
+# too generic; see resultant A1121, see also trevor:1050
+# gf Added constraint. (3.1.32)
+# gf Split pattern and revised constraint. (3.5.7)
+
+X.X         push to expose weakness
+O*.
+?XX
+
+:8,-,value(65)
+
+A.B
+O*.
+?CX
+
+;!same_string(A,B) && (lib(A) <= 4 || lib(B) <= 4 || lib(C) <= 4)
+;&& !oplay_connect(*,A,C)
+
+
+Pattern D1362
+# db added (3.1.8)
+
+?X..       try to escape
+?.*.
+O...
+o...
+....
+----
+
+:8,-,value(85)
+
+
+Pattern D1363
+# db added (3.1.8)
+
+oOX?          force the opponent to cut, exposing thinness
+.*.?
+.XOO
+..X.
+?...
+
+:8,B,value(75)
+
+
+Pattern D1364
+# db added (3.1.8)
+
+.OX?          atari!
+.XOO
+.*X.
+?...
+
+:8,B,value(85)
+
+
+Pattern D1365
+# db added (3.1.8)
+
+OX?          atari!
+XOO
+OX*
+...
+
+:8,B,value(85)
+
+
+Pattern D1366
+# db added (3.1.8)
+# gf Revised. (3.1.11)
+
+XOO?         try to break out
+OXO?
+.X*x
+o...
+?o..
+
+:8,-,value(85)
+
+Xaa?
+OXa?
+.X*x
+o...
+?o..
+
+;owl_goal_dragon(a)
+
+
+Pattern D1367
+# db added (3.1.11)
+# tm added b attribute.
+# gf Removed b class. (3.3.17)
+
+...?
+.*.?       jump out
+...X
+?OO?
+
+:8,-,value(60)
+
+
+Pattern D1368
+# gf added (3.1.12)
+
+...?       move out
+.*X?       
+..OX
+XOo?
+
+:8,E,value(70)
+
+b..?
+.*X?
+..OX
+Xao?
+
+;lib(a)>1 && owl_escape_value(b)>0
+
+
+Pattern D1370
+# gf New pattern. (3.1.13)
+
+oo?        move out
+..X        
+.*.
+XO?
+
+:8,E,value(75)
+
+ao?
+b.X
+.*.
+XO?
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1371
+# gf New pattern. (3.1.13)
+# tm Added b class (3.1.20)
+
+oOo        move out
+...        
+.*X
+.O?
+
+:8,bE,value(85)  
+
+oao
+...
+.*X
+.O?
+
+;owl_escape_value(a)>0
+
+
+Pattern D1372
+# gf New pattern. (3.1.14)
+
+OX.         escape underneath
+.*O
+---
+
+:8,E,value(85)
+
+aB.
+.*O
+---
+
+;owl_escape_value(a)>0 && !attack(B)
+
+
+Pattern D1373
+# gf New pattern. (3.1.14)
+
+o*XO        capture to escape
+
+:-,bE,value(85)
+
+a*BO
+
+;owl_escape_value(a)>0 && does_attack(*,B)
+
+
+Pattern D1374
+# gf New pattern. (3.1.14)
+
+oo..Xo        connect underneath
+...*O.
+------
+
+:8,E,value(55)
+
+ab..Xo
+...*O.
+------
+
+;o_somewhere(a,b) && owl_escape_value(a) + owl_escape_value(b) > 0
+
+
+Pattern D1375
+# tm New pattern (3.1.15)
+
+O?.?  connect out with atari.
+.*XO
+..O.
+
+:8,-,value(75)
+
+O?.?
+.*AO
+..O.
+
+; defend(A)
+
+
+Pattern D1376
+# tm New Pattern (3.1.16)
+# gf Revised constraint. (3.1.22)
+
+OoX?
+x.*O
+----
+
+:8,Ea,value(75)
+
+bdE?
+xc*a
+----
+
+; (owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
+; && ((o_somewhere(d) && oplay_attack_either(*,c,c,E))
+;     || (!o_somewhere(d) && !oplay_defend_both(*,c,d,c,E)))
+
+
+Pattern D1377
+
+?????
+OX*.o    hane into the open.
+.O..o
+-----
+
+:8,-,value(50)
+
+?????
+OA*.o
+.O..o
+-----
+
+;defend(A)
+
+
+Pattern D1378
+# tm reduced value (3.1.17)
+# gf Revised constraint. (3.3.18)
+# See also A1126.
+
+X*X   breakout & attack
+?O?
+
+:|,-,value(55)
+
+A*B
+?O?
+
+; vital_chain(A) && vital_chain(B)
+; && oplay_attack_either(*,A,B) && !oplay_connect(*,A,B)
+
+
+Pattern D1379
+# tm New Pattern (3.1.17)
+
+???     escape or attack.
+x..
+O*X
+?X?
+
+:8,E,value(65)
+
+?BC
+xeA
+O*X
+?d?
+
+; (owl_escape_value(A) > 0
+; || owl_escape_value(B) > 0
+; || owl_escape_value(C) > 0)
+; && !attack(d)
+; && oplay_attack(*,A,d)
+; && oplay_attack(*,e,d)
+
+
+Pattern D1380
+# tm (?) New Pattern (3.1.17)
+
+?..    escape
+.*.
+O.?
+
+:8,E,value(65)
+
+?AB
+.*C
+O.?
+
+; owl_escape_value(A) + owl_escape_value(B) + owl_escape_value(C) > 3
+
+
+Pattern D1381
+# tm New Pattern (3.1.19)
+
+O*.
+?XO
+
+:8,Ea,value(70)
+
+O*a
+?CB
+
+; (owl_escape_value(B) > 0 || owl_escape_value(a) > 0)
+; && oplay_attack_either(*,a,a,C)
+
+
+Pattern D1382
+# tm New Pattern (3.1.19)
+
+.O   threaten attack and connect
+*X
+O.
+
+:8,Ea,value(70)
+
+cA
+*d
+B.
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && oplay_attack(*,c,d)
+
+
+Pattern D1383
+# tm New Pattern (3.1.20)
+# tm added b attribute (3.1.23)
+# gf No escape to second line, see 9x9:550. (3.7.8)
+
+?Oo
+...
+?*.
+?.?
+???
+
+:8,sbE,value(71)
+
+?Bo
+...
+?*.
+?a?
+???
+
+;(owl_escape_value(a) > 0)
+; && !oplay_disconnect(*,*,B)
+
+
+Pattern D1384
+# tm New Pattern (3.1.22)  (see strategy2:73)
+#   may not be necessary, but probably doesn't hurt.
+#   (doesn't work for strategy2:73; no matching stones are in dragon)
+
+O..   escape or capture to escape
+.*?
+?.O
+
+:8,E,value(65)
+
+A..
+.*c
+?dB
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && (!x_somewhere(c) || oplay_attack_either(*,d,c,d))
+
+
+Pattern D1385
+# tm New Pattern (3.1.23)
+
+.O    escape or capture
+..
+X*
+?O
+
+:8,E,value(75)
+
+fB
+dc
+e*
+?A
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && (oplay_attack(*,c,d,f,e) && oplay_attack(*,c,d,f,f))
+
+
+Pattern D1386a
+# gf New pattern. (3.3.17)
+
+OX.x       connect along edge to strong dragon
+o*.O
+----
+
+:8,Eb,value(90)
+
+aX.x
+o*.b
+----
+
+;owl_strong_dragon(a) || owl_strong_dragon(b)
+
+
+Pattern D1386b
+# gf New pattern. (3.3.17)
+
+OX.x       connect along edge
+o*.O
+----
+
+:8,Eb,value(35)
+
+aX.x
+o*.b
+----
+
+;owl_escape_value(a)>0 || owl_escape_value(b)>0
+
+
+Pattern D1387
+# gf New pattern. (3.3.17)
+
+??o?       atari to break out
+o...
+*X.X
+XOo?
+
+:8,EB,value(75)
+
+?dce
+o...
+*X.X
+Bao?
+
+;(owl_escape_value(c)>0 || owl_escape_value(d)>0 || owl_escape_value(e)>0)
+;&& lib(B)==2 && olib(*)>=2 && !oplay_attack(*,a)
+
+
+Pattern D1388
+# gf New pattern. (3.3.17)
+
+??o?       atari to break out
+o...
+OX*X
+?Oo?
+
+:8,Eb,value(75)
+
+?cbd
+o...
+OX*X
+?ao?
+
+;(owl_escape_value(b)>0 || owl_escape_value(c)>0 || owl_escape_value(d)>0)
+;&& !oplay_attack(*,a)
+
+
+Pattern D1389
+# gf New pattern. (3.3.18)
+# gf Added a classification. (3.7.10)
+# See also D1340.
+
+OX.O
+?*.?
+----
+
+:8,Ea,value(84)
+
+aX.b
+?*.?
+----
+
+;(owl_strong_dragon(a) || owl_strong_dragon(b)) && !oplay_disconnect(*,a,b)
+
+
+Pattern D1390
+# pp New pattern (3.5.2)
+
+???.O      either capture or escape
+o*...
+OX..?
+?x.??
+-----
+
+:8,b,value(80)
+
+???dC
+o*bc.
+ABa.?
+?x.??
+-----
+
+; owl_escape_value(d) > 0
+; && oplay_attack_either(*,a,b,c,d,B,c) && oplay_connect(*,a,b,c,d,?,A,C)
+
+
+Pattern D1391
+# gf New pattern. (3.5.3)
+# gf Revised pattern. (3.7.2)
+# See owl1:353.
+
+.O*O       connect out
+OX??
+
+:8,a,value(80)
+
+bO*a
+dC??
+
+;owl_escape_value(a) > 0 && oplay_attack_either(*,b,C,b)
+;&& !xplay_connect(*,a,d)
+
+
+Pattern D1392
+# evand New pattern. (3.7.1)
+# sometimes forcing is better than the cut -- see gifu03:704
+
+O.X
+*XO
+
+:8,b,value(40)
+
+O.X
+*AO
+
+;lib(A) == 2
+
+
+Pattern D1393
+# pp New pattern, see kgs:500 (3.7.4)
+
+O.O.       secure escape connection by first threatening opponent
+?*XO
+
+:8,B,value(50)
+
+A.Ca
+?*DB
+
+# Note: xplay_disconnect() to avoid generating this move when it is
+# not really needed.
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && xplay_disconnect(A,C) && oplay_attack(*,a,D)
+
+
+Pattern D1394
+#pp New pattern, see kgs:500 (3.7.4)
+
+O.O*       connect out!
+??XO
+
+:8,a,value(70)
+
+A.O*
+??XB
+
+; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
+; && safe_xmove(*) && !oplay_disconnect(*,A,B)
+
+
+Pattern D1395
+# gf New pattern. (3.7.4)
+# See gunnar:73.
+
+?OXO
+OX*x
+----
+
+:8,sb,value(40)
+
+?bXa
+OX*x
+----
+
+;(owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
+;&& oplay_disconnect(*,a,b) != WIN
+
+
+#########################################################
+#                                                       #
+#                          Ko                           #
+#                                                       #
+#########################################################
+
+
+Pattern D1400
+
+----        connect (don't fight ko)
+..X?
+O*OX
+?OX?
+
+:8,-,value(95)
+
+----
+..C?
+O*OA
+?OB?
+
+;lib(A)>1 && lib(B)>1 && lib(C)>1
+
+
+Pattern D1400b
+
+----        capture, no ko
+.*X?
+O.OX
+?OX?
+
+:8,-,value(95)
+
+----
+.*A?
+O.OX
+?OX?
+
+;lib(A)==1
+
+
+Pattern D1401
+
+----        do fight ko
+.*X?
+O.OX
+?OX?
+
+:8,-,value(35)
+
+----
+.*X?
+O.OA
+?OB?
+
+; (lib(A)>1) && (lib(B)>1)
+
+
+Pattern D1402
+
+.OX?        take the ko
+OX*X
+----
+
+:8,s,value(45)
+
+aBX?
+OX*X
+----
+
+; (legal_omove(*) && owl_topological_eye(a,B)==3)
+; || (!legal_omove(*) && owl_topological_eye(a,B)==2)
+
+
+Pattern D1403
+
+|XO?         corner ko capture
+|*XO
++---
+
+:8,s,value(30)
+
+
+Pattern D1404
+
+|..O          start corner ko
+|*XO
+|.OX
++---
+
+:8,s,value(80)
+
+|..O
+|*AO
+|.OX
++---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D1405
+
+|X.O          start or continue corner ko
+|*XO
+|xOo
++---
+
+:8,s,value(80)
+
+|X.O
+|*AO
+|xOo
++---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D1405b
+
+|X.O          start or continue corner ko
+|OXO
+|.*o
++---
+
+:8,s,value(80)
+
+|X.O
+|OAO
+|.*o
++---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D1406
+
+|X*O          try to avoid corner ko
+|.XO
+|.Oo
++---
+
+:8,-,value(55)
+
+
+Pattern D1407
+
+|.OX?        defend corner eye space
+|..O?
+|.O*X
+|....
++----
+
+:8,-,value(75)
+
+
+Pattern D1408
+
+?X??       take ko
+X*X?
+OXOX
+?O.O
+
+:8,s,value(45)
+
+
+Pattern D1409
+
+?X?|       take ko
+X*X|
+OXO|
+?O.|
+
+:8,s,value(45)
+
+
+Pattern D1410
+
+?OO|       throw in to set up ko or squeeze
+O.X|
+OOX|
+o.*|
+---+
+
+:8,s,value(35)
+
+
+Pattern D1411
+
+|*XO     play corner ko
+|XO.
++---
+
+:8,s,value(45)
+
+|*AO
+|XO.
++---
+
+;attack(A) != 0
+
+
+Pattern D1411b
+
+|*XO     play corner ko
+|XOo
++---
+
+:8,s,value(35)
+
+|*AO
+|XOo
++---
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern D1412
+
+|O??        capture to finish ko
+|.OO
+|OX*
++---
+
+:8,-,value(35)
+
+
+Pattern D1413
+
+|O??        squeeze to finish ko
+|XOO
+|.X*
++---
+
+:8,-,value(35)
+
+|a??
+|XOO
+|.X*
++---
+
+;lib(a) > 1
+
+
+Pattern D1414
+
+|oo???        try to live with double ko
+|.O???
+|XOO??
+|.XO*o
+|X.X.o
++-----
+
+:8,-,value(45)
+
+
+Pattern D1415
+# Generalizes D1412. Necessary to have one O stone in the pattern to
+# identify the goal.
+
+?O            capture to finish ko
+X*
+
+:8,-,value(35)
+
+?O
+A*
+
+;lib(A)==1 && finish_ko_helper(A)
+
+
+Pattern D1416
+# Generalizes D1412. Necessary to have one O stone in the pattern to
+# identify the goal.
+
+X*O           capture to finish ko
+
+:-,-,value(35)
+
+A*O
+
+;lib(A)==1 && finish_ko_helper(A)
+
+
+Pattern D1417
+# Generalizes D1413. Necessary to have one O stone in the pattern to
+# identify the goal.
+
+?O            squeeze to finish ko
+X*
+
+:8,-,value(35)
+
+?O
+A*
+
+;lib(A)==2 && olib(*)>1 && squeeze_ko_helper(A)
+
+
+Pattern D1418
+# Generalizes D1413. Necessary to have one O stone in the pattern to
+# identify the goal.
+
+X*O           squeeze to finish ko
+
+:-,-,value(35)
+
+A*O
+
+;lib(A)==2 && olib(*)>1 && squeeze_ko_helper(A)
+
+
+Pattern D1419
+
+oOX?          take ko to preserve eye
+O.OX
+XOX*
+----
+
+:8,s,value(35)
+
+oOX?
+O.OX
+AOX*
+----
+
+;attack(A)
+
+
+Pattern D1420
+
+oOX?          take ko to preserve eye
+O.OX
+.OX*
+----
+
+:8,s,value(35)
+
+oOX?
+O.OX
+aOX*
+----
+
+;!safe_xmove(a)
+
+
+Pattern D1421
+
+xXO          avoid ko
+X.*
+---
+
+:8,s,value(25)
+
+xXa
+X.*
+---
+
+;xplay_defend(*,a) != WIN && oplay_attack(*,a) == 0
+
+
+Pattern D1422
+
+|XX??      keep ko going
+|OXOO
+|.OXX         
+|O.O*
++----
+
+:8,s,value(25)
+
+|XX??
+|OXOO
+|.OAA
+|O.O*
++----
+
+;lib(A)==1
+
+
+Pattern D1423
+# gf New pattern. (3.3.6)
+
+|OO?      throw in to make ko or better
+|.O?
+|XOO         
+|*.O
++---
+
+:8,s,value(45)
+
+
+Pattern D1424
+# pp New pattern (3.3.12)
+
+|Oo?      avoid corner ko
+|.Oo
+|oX*
++---
+
+:8,-,value(45)
+
+
+#########################################################
+#                                                       #
+#                 Threats to capture                   #
+#                                                       #
+#########################################################
+
+
+Pattern DC01a
+# pp New pattern (3.5.5).
+
+???        threaten to cut off vital chain
+X.X
+O*?
+
+:8,c, threatens_to_capture(A), value(35)
+
+abc
+AdX
+O*?
+
+; o_somewhere(a,b,c) && vital_chain(A) && !oplay_defend(*,?,d,A)
+
+
+Pattern DC01b
+# pp New pattern (3.5.5).
+
+???        threaten to cut off vital chain
+X.X
+O*?
+
+:8,c, threatens_to_capture(B), value(35)
+
+abc
+XdB
+O*?
+
+; o_somewhere(a,b,c) && vital_chain(B) && !oplay_defend(*,?,d,B)
+
+
+Pattern DC02
+# pp New pattern (3.5.5) -- see ld_owl:316.
+
+OX.?
+OX..
+.*..
+----
+
+:8,c, threatens_to_capture(A), value(35)
+
+ABb?
+AB..
+.*..
+----
+
+; lib(A) >= 3 && lib(B) == 3 && olib(b) > 2
+
+
+#########################################################
+#                                                       #
+#               Threats to create eyes                 #
+#                                                       #
+#########################################################
+
+
+Pattern DE01a
+# pp New pattern (3.5.5).
+
+?O*?
+....
+xOOO
+
+:8,c, threatens_eye(a), value(30)
+
+?O*?
+..a.
+xOOO
+
+
+Pattern DE01b
+# pp New pattern (3.5.5).
+
+?O*?
+....
+OOOo
+
+:8,c, threatens_eye(a), value(30)
+
+?O*?
+.a..
+OOOo
+
+
+Pattern DE02
+# pp New pattern (3.5.5).
+
+?O*
+O..
+---
+
+:8,c, threatens_eye(a), value(30)
+
+bO*
+Oa.
+---
+
+; o_somewhere(b)
+; || (x_somewhere(b) ? !oplay_defend(*,b) : !oplay_defend(*,b,b))
+
+
+Pattern DE03
+# pp New pattern (3.5.5) -- see owl1:326.
+
+OO?
+..*
+---
+
+:8,c, threatens_eye(a), value(30)
+
+OOb
+.a*
+---
+
+; o_somewhere(b)
+; || (x_somewhere(b) ? !oplay_defend(*,b) : !oplay_defend(*,b,b))
+
+
+Pattern DE04
+# pp New pattern (3.5.5) -- see owl1:326.
+
+xXOo?
+XO.O?
+X.OX*
+-----
+
+:8,c, threatens_eye(a), value(30)
+
+xXOo?
+XOaO?
+X.OX*
+-----
+
+
+#########################################################
+#                                                       #
+#            Reverse sente defending moves             #
+#                                                       #
+#########################################################
+
+
+Pattern DR01
+# pp New pattern (3.5.5) -- see ld_owl:316.
+# FIXME: most likely need variations for other first line moves.
+
+?.OX?      prevent X's sente move at 'a'
+..OXx
+...*.
+-----
+
+:8,c, reverse_sente(a), value(30)
+
+?.OB?
+.aOBx
+...*.
+-----
+
+; owl_proper_eye(a) && !attack(B)
+
+
+# END OF FILE
diff --git a/patterns/owl_defendpats.dtr b/patterns/owl_defendpats.dtr
new file mode 100644 (file)
index 0000000..327c0bb
--- /dev/null
@@ -0,0 +1,448 @@
+D1     5
+D2     7
+D3     7
+D4     1
+D100   0
+D101   4
+D102   0
+D103   0
+D104   0
+D104b  0
+D105   5
+D106   7
+D107   0
+D108   0
+D109   0
+D110   0
+D111   7
+D112   0
+D113   7
+D114   6
+D115   0
+D116   3
+D117   0
+D118   7
+D119   7
+D120   0
+D121   7
+D122   0
+D123   6
+D124   7
+D200   0
+D201   0
+D202   0
+D203   0
+D204   6
+D205   0
+D206   0
+D207   0
+D208   6
+D209   0
+D209a  0
+D209b  0
+D210   0
+D211   4
+D212   0
+D213   6
+D214   0
+D215   0
+D216   7
+D217   0
+D217a  0
+D217b  0
+D217c  0
+D218   0
+D220   0
+D221   0
+D222   0
+D223   7
+D224   6
+D225   7
+D226   6
+D227   7
+D228   0
+D229   3
+D230   7
+D231   4
+D232   0
+D233   0
+D300   1
+D301   6
+D302   7
+D303   6
+D304   6
+D305   7
+D306   6
+D307   7
+D308   3
+D309   6
+D309a  6
+D309b  6
+D310a  0
+D310b  0
+D311   0
+D313   3
+D314   7
+D315   1
+D316   6
+D317   6
+D318   6
+D319   7
+D320   2
+D400   1
+D401   1
+D402   6
+D403   5
+D404   6
+D405   7
+D406   0
+D407   0
+D408   0
+D409   0
+D500   0
+D502   0
+D503   3
+D504   1
+D505   0
+D506   0
+D507   0
+D508   0
+D509   7
+D510   6
+D511   7
+D512   0
+D513   0
+D514   6
+D515   0
+D600   2
+D600a  2
+D602   1
+D603   1
+D604   0
+D604a  0
+D605   7
+D606   1
+D607   7
+D608   0
+D608b  6
+D609   6
+D610   0
+D611   6
+D612   7
+D613   3
+D614   0
+D614b  0
+D615   3
+D616   2
+D616a  0
+D617   2
+D618   2
+D619   2
+D620   7
+D621   0
+D622   0
+D623   0
+D624   7
+D625   7
+D626   0
+D627   0
+D628   0
+D629   7
+D630   5
+D631   6
+D632   0
+D633   3
+D634   7
+D635   7
+D636   7
+D637   2
+D638   7
+D639   0
+D640   7
+D641   0
+D642   7
+D643   6
+D700   1
+D701   6
+D702   6
+D703   0
+D704   1
+D704b  7
+D705   0
+D706   0
+D707   0
+D708   4
+D709   1
+D710   1
+D711   0
+D712   1
+D713   0
+D714   7
+D715   1
+D715b  7
+D715c  6
+D716   6
+D717   1
+D718   6
+D720   7
+D721   3
+D722   4
+D800   0
+D801   0
+D802   0
+D803   6
+D804   0
+D804b  0
+D805   0
+D805a  6
+D805b  7
+D806   0
+D807   0
+D808   0
+D809   0
+D810   7
+D811   7
+D811a  3
+D812   0
+D813   7
+D814   7
+D815   7
+D816   3
+D817   3
+D818   0
+D818b  0
+D819   3
+D820   0
+D820b  0
+D821   7
+D822   7
+D823a  5
+D823b  0
+D824   0
+D825   7
+D826   3
+D827   0
+D828   5
+D829   7
+D830   3
+D831   0
+D832   7
+D833   0
+D834   0
+D835   7
+D836   0
+D837   0
+D838   7
+D839   0
+D900   7
+D902   7
+D903   7
+D904   0
+D905   0
+D906   3
+D907   3
+D908   3
+D909   1
+D910a  6
+D910b  6
+D911   0
+D1000  0
+D1000a 1
+D1001  5
+D1001b 0
+D1002  5
+D1003  1
+D1004  1
+D1004b 1
+D1005  7
+D1006  0
+D1006b 0
+D1007  0
+D1100  0
+D1101  1
+D1102  1
+D1102a 1
+D1103  0
+D1104  6
+D1105  0
+D1106  1
+D1107  0
+D1108  7
+D1108b 7
+D1109  6
+D1110  1
+D1111  6
+D1112  6
+D1113  4
+D1114  4
+D1115  6
+D1116  3
+D1117  3
+D1117a 0
+D1118  1
+D1119  5
+D1120  2
+D1120b 0
+D1121a 5
+D1121b 0
+D1121c 6
+D1122  0
+D1123  0
+D1124  7
+D1125  3
+D1126  1
+D1127  5
+D1128  3
+D1129  1
+D1130  0
+D1131  6
+D1132  6
+D1133  0
+D1134  5
+D1135  6
+D1136  1
+D1137  6
+D1138  0
+D1139  6
+D1140  0
+D1141  2
+D1200  0
+D1201  0
+D1202  1
+D1203  7
+D1204  7
+D1205  1
+D1206  1
+D1300  0
+D1300b 0
+D1301  0
+D1301b 0
+D1302  0
+D1303  0
+D1304  0
+D1305  3
+D1306  7
+D1307  4
+D1308  0
+D1309  0
+D1309b 0
+D1310  0
+D1311  1
+D1312  2
+D1313  1
+D1314  3
+D1315  6
+D1316  6
+D1316b 6
+D1317  3
+D1318  4
+D1319  5
+D1320  1
+D1320a 6
+D1320b 1
+D1321  1
+D1321b 1
+D1322  1
+D1323  1
+D1323a 6
+D1324  1
+D1325  1
+D1326  1
+D1327  1
+D1328  1
+D1329  1
+D1330  0
+D1331  6
+D1332  0
+D1333  0
+D1333b 7
+D1334  2
+D1335  1
+D1336  5
+D1337  0
+D1338  3
+D1339  1
+D1340  0
+D1341  0
+D1342  2
+D1343a 3
+D1343b 5
+D1343c 3
+D1343d 3
+D1344  6
+D1345  0
+D1346  0
+D1347  0
+D1348  6
+D1348b 6
+D1348c 6
+D1348d 6
+D1350  1
+D1351  7
+D1352  6
+D1353  6
+D1354  4
+D1355  0
+D1356  1
+D1356a 1
+D1357  5
+D1358  0
+D1359  7
+D1360  0
+D1361  1
+D1362  0
+D1363  6
+D1364  0
+D1365  7
+D1366  1
+D1367  1
+D1368  0
+D1370  3
+D1371  0
+D1372  7
+D1373  3
+D1374  0
+D1375  7
+D1376  7
+D1377  7
+D1378  2
+D1379  6
+D1380  1
+D1381  2
+D1382  4
+D1383  0
+D1384  6
+D1385  6
+D1386a 0
+D1386b 0
+D1387  0
+D1388  0
+D1389  0
+D1400  7
+D1400b 7
+D1401  7
+D1402  0
+D1403  7
+D1404  3
+D1405  3
+D1405b 3
+D1406  3
+D1407  7
+D1408  7
+D1409  7
+D1410  6
+D1411  7
+D1411b 7
+D1412  7
+D1413  7
+D1414  3
+D1415  1
+D1416  1
+D1417  1
+D1418  1
+D1419  2
+D1420  2
+D1421  7
+D1422  0
+D1423  7
+D1424  4
diff --git a/patterns/owl_vital_apats.db b/patterns/owl_vital_apats.db
new file mode 100644 (file)
index 0000000..e27a6b1
--- /dev/null
@@ -0,0 +1,1020 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The Owl urgent offensive pattern database. These are patterns
+#  which are always matched. The patterns in owl_attackpats.db
+#  are not matched if owl_shapes finds that the dragon has two
+#  eyes. So the patterns in this database are exceptional ones
+#  corresponding to defects in the optical code.
+#
+#  Further documentation may be found in the Texinfo documentation.
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  !    : your defense move against * (if different)
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  In the second field (classification) the following pattern attributes
+#  are possible. Friendly stones are 'O', opponent stones are 'X'.
+# 
+# s  :  "Sacrifice" pattern. Omit the usual check that an O stone here
+#       cannot be capture.
+# 
+# n  :  In addition to usual check that an O stone here cannot be
+#       captured, check also that an X move cannot be captured.
+# 
+
+
+attribute_map value_only
+
+goal_elements Xx
+callback_data !
+
+
+Pattern VA1
+
+?x??        threaten two eyes simultaneously
+X.X?
+.X*O
+X.X?
+
+:8,-,value(75)
+
+?x??
+A.d?
+cX*a
+XbX?
+
+; lib(a)>2 && owl_topological_eye(b,A)==2 && owl_topological_eye(c,A)==2 && oplay_attack(*,d)
+
+
+Pattern VA2
+
+|XXO?       remaining ko potential
+|..XO
+|*X.X
+|..XX
++----
+
+:8,s,value(45)
+
+|AAO?
+|..XO
+|*X.B
+|..BB
++----
+
+;lib(A)==2 && lib(B)==2
+
+
+Pattern VA3
+
+|XX???      may still be possible to kill through bent four in the corner
+|OXx?O
+|O.XX*
+|.....
++-----
+
+:8,-,value(45)
+
+
+Pattern VA4
+
+|XX??       may still be possible to kill through bent four in the corner
+|OXx?
+|O.XX
+|.*.X
++----
+
+:8,s,value(45)
+
+
+Pattern VA5
+
+|X??        take ko for possible nakade
+|*X?
+|XOx
+|Oox
++---
+
+:8,s,value(45)
+
+
+Pattern VA6
+# Workaround for mistake related to false margins.
+
+XXXO?
+O.OX*
+-----
+
+:8,s,value(45)
+
+XXXO?
+a.OX*
+-----
+
+;lib(a)==2
+
+
+Pattern VA7
+
+|XXx        bent four in the corner
+|O.X
+|OXx
+|*OX
++---
+
+:8,s,value(45)
+
+
+Pattern VA8
+
+*Xx
+X.X
+XXO
+
+:8,s,value(45)
+
+*Xx
+A.X
+AAO
+
+;lib(A)==2 && olib(*)>1
+
+
+Pattern VA9
+# nn Modified constraint (3.3.14)
+
+X*           atari inside eyespace
+
+:-,s,value(45)
+
+A*
+
+;lib(A)==2 && olib(*)>1 && owl_big_eyespace(*)
+;&& (owl_eye_size(*) <= 8 || !oplay_attack(*,*))
+
+
+Pattern VA10
+
+X*           atari inside eyespace with ko
+
+:-,s,value(35)
+
+A*
+
+;lib(A)==2 && olib(*)==1 && owl_big_eyespace(*) && oplay_attack(*,*)!=WIN
+
+
+Pattern VA11
+
+?XX???       chance to get nakade
+XOOXXx
+!OX*.x
+------
+
+:8,s,value(65)
+
+?XX???
+XaaXXx
+.aX*.x
+------
+
+;attack(a) && !defend(a)
+
+
+Pattern VA12
+
+|xx??
+|.X??         try to kill with bent four in the corner
+|OXXx
+|X*.x
++----
+
+:8,s,value(75)
+
+
+Pattern VA13
+# This is almost identical to attack pattern A1330. It is needed in
+# both places. 
+
+|XX?        take ko to maybe kill
+|*XX
+|XOX
+|O!O
++---
+
+:8,s,value(85)
+
+|AA?
+|*AA
+|XOA
+|OaO
++---
+
+;lib(A)<=3 && oplay_attack(a,a)
+
+
+# nn Removal candidate (3.3.14)
+#   Success rate in regressions : 0% (0/131)
+
+Pattern VA14
+
+?OX         force X to defend inside own eyespace
+OX!
+*XO
+---
+
+:8,-,value(35)
+
+?bX
+ODa
+*Dc
+---
+
+;lib(b)>1 && lib(c)>1 && owl_eyespace(a) && !attack(D)
+
+
+Pattern VA15
+
+X.?         sacrifice to destroy eye
+X*X
+OX.
+
+:8,s,value(45)
+
+Ac?
+A*X
+bXd
+
+;lib(A) == 2 && lib(b) > 1 && !oplay_attack(*,c,d,d)
+
+
+Pattern VA16
+
+----
+.X.X        play safely inside eyespace to falsify eye
+.*Xx
+X..?
+
+:8,-,value(46)
+
+----
+.X.X
+.*Xx
+X..?
+
+;owl_eyespace(*)
+
+
+Pattern VA17
+
+xXXOo         exploit shortage of liberties
+!O*XO
+.X.Xo
+
+:8,s,value(35)
+
+xXXOo
+aO*XO
+.X.Xo
+
+; oplay_attack(*,a,a)
+
+
+Pattern VA18
+
+XX!O       throw in to kill an eye
+.*X?
+XXO?
+
+:8,-,value(35)
+
+XXaO
+.*X?
+XXO?
+
+; oplay_attack(*,a,a)
+
+
+Pattern VA19
+# gf New pattern. (3.1.11)
+
+OX.x       peep at edge
+X.*.
+XX..
+----
+
+:8,s,value(75)
+
+OX.x
+A.*.
+AA..
+----
+
+;lib(A)==2 && owl_big_eyespace(*)
+
+
+Pattern VA20
+# tm New pattern. (3.1.13)
+# see trevor:450
+
+?X?
+X.X
+*X?
+X.X
+?X?
+
+:-,-,value(75)
+
+?X?
+XaX
+*C?
+XbX
+?X?
+
+; owl_topological_eye(a,C) == 2
+; && owl_topological_eye(b,C) == 2
+
+
+Pattern VA21
+# gf New pattern. (3.1.14)
+# gf Revised pattern. (3.1.17)
+
+XO?       bogus eyespace
+.*X
+...
+---
+
+:8,-,value(75)
+
+XO?
+.*X
+.a.
+---
+
+;owl_big_eyespace(a)
+
+
+Pattern VA22
+# gf New pattern. (3.1.14)
+
+x.O       bogus eyespace
+.*X
+...
+---
+
+:8,-,value(75)
+
+xaO
+.*B
+...
+---
+
+;owl_big_eyespace(*) && oplay_attack(*,a,B)
+
+
+Pattern VA23
+# gf New pattern. (3.1.14)
+
+??O?      bogus eyespace
+x.*X
+....
+....
+----
+
+:8,-,value(75)
+
+??O?
+xc*X
+.ba.
+....
+----
+
+;owl_big_eyespace(*) && oplay_attack(*,a,b,c,a)
+
+
+Pattern VA24
+# gf New pattern. (3.1.14)
+# gf Revise constraint to update for changed olib behaviour. (3.7.8)
+
+X*           capture inside eyespace, not ko
+
+:-,-,value(76)
+
+A*
+
+;lib(A)==1 && owl_eyespace(*) && olib(*) > 1
+
+
+Pattern VA25
+# tm New pattern. (3.1.15)  (see cho1:161)
+
+?OO|       special corner shape.
+*X.|
+XOX|
+XO.|
+---+
+
+:8,-,value(76)
+
+
+Pattern VA26
+# gf New pattern. (3.1.15)
+
+??XX?       making nakade is only chance to kill, unless we can capture
+?XO!X       some of the wall
+X*XOX
+X.OX?
+?XX??
+
+:8,s,value(70)
+
+
+Pattern VA26b
+# gf New pattern. (3.1.15)
+# This pattern is entirely bogus. VA25 gives the correct attack point
+# but currently we also need this pattern to get a second match, which
+# is necessary to offset the fact that X is thought to have three
+# eyes.
+
+??XX?       making nakade is only chance to kill, unless we can capture
+?XO.X       some of the wall
+X.XOX
+X*OX?
+?XX??
+
+:8,s,value(0)
+
+
+Pattern VA27
+# gf New pattern. (3.1.15)
+
+XX??        not two certain eyes
+.*xX
+OXOx
+----
+
+:8,s,value(45)
+
+XX??
+.*AX
+OXOB
+----
+
+;x_somewhere(A,B)
+
+
+Pattern VA28
+# gf New pattern. (3.1.15)
+
+XX??        not two certain eyes
+.OxX
+*XOx
+----
+
+:8,s,value(45)
+
+XX??
+.OAX
+*XOB
+----
+
+;x_somewhere(A,B)
+
+
+Pattern VA29
+# gf New pattern. (3.1.15)
+
+|XXX?        not two certain eyes
+|!O.X
+|OX*x
++----
+
+:8,s,value(45)
+
+
+Pattern VA30
+# gf New pattern. (3.1.15)
+
+?XX!         atari to destroy eye
+X.*X
+?XX?
+
+:8,s,value(45)
+
+?XXb
+Xa*X
+?CC?
+
+;lib(C)==2 && owl_eyespace(a) && oplay_attack(*,a,b,b)!=WIN
+
+
+Pattern VA31
+# tm New pattern (3.1.15)  (see maeda0:60)
+# gf Added constraint. (3.5.5)
+
+?O.|
+OX.|
+X.X|
+X!*|
+??.|
+
+:8,s,value(76)
+
+?Oa|
+OXb|
+X.X|
+X!*|
+??.|
+
+;!oplay_attack(a,?,b,a)
+
+
+Pattern VA32
+# tm New pattern (3.1.15)  (see maeda0:60)
+# gf Added constraint. (3.5.5)
+
+?O*|
+OX!|
+X.X|
+XXO|
+
+:8,s,value(76)
+
+?O*|
+OXb|
+X.X|
+XXa|
+
+;lib(a)>1 || !oplay_attack(*,?,b,*)==WIN
+
+
+Pattern VA33
+# tm New pattern (3.1.15)
+
+?X|
+XO|
+!O|
+*X|
+
+:8,-,value(76)
+
+
+Pattern VA34
+# tm New pattern (3.1.15)
+#   See also VA27
+
+?X?
+XOX
+!OX
+*XO
+
+:8,-,value(76)
+
+?X?
+XOX
+.OX
+*XA
+
+; oplay_defend_both(*,A,*)
+
+
+Pattern VA35
+
+?XX|
+X..|
+X*X|
+XO.|
+---+
+
+:8,s,value(45)
+
+?XX|
+XA.|
+X*X|
+XO.|
+---+
+
+; xlib(A)==2
+
+
+Pattern VA36
+
+?XXX|    cut black up
+X.OX|
+XX*O|
+?OX.| 
+??XX|
+
+:8,s,value(45)
+
+
+Pattern VA37
+# tm New Pattern (3.1.15)
+
+?xXO?
+?X.XO
+O.X!*
+-----
+
+:8,-,value(45)
+
+?xXO?
+?X.XO
+A.X.*
+-----
+
+;lib(A) > 2
+
+
+Pattern VA38
+# gf New pattern. (3.1.15)
+# See trevora:25
+
+??O
+x!.           capture a string at the edge of an eyespace
+.*X
+...
+---
+
+:8,-,value(80)
+
+??O
+x..
+.*A
+...
+---
+
+;owl_big_eyespace(*) && !oplay_defend(*,A)
+
+
+Pattern VA39
+# tm New Pattern (3.1.16)
+# gf Revised constraint. (3.5.4)
+
+XO*|     atari to kill eye
+!XX|
+XOO|
+
+:8,s,value(95)
+
+XO*|
+aXX|
+Xbb|
+
+;owl_eyespace(a) && olib(*)>1 && lib(b)>1
+
+
+Pattern VA40
+# tm New Pattern (3.1.16) (see trevora:550)
+
+OXx      Threaten snapback inside eyespace.
+X..
+X.*
+X..
+
+:8,s,value(95)
+
+OXx
+X..
+A.*
+X..
+
+; lib(A) == 3
+
+
+Pattern VA41
+# tm New Pattern (3.1.16)
+
+XXO
+.*X
+!.X
+
+:8,s,value(95)
+
+XBO
+.*A
+..X
+
+;lib(A) ==2 || lib(B) == 2
+
+
+Pattern VA42
+# tm New Pattern (3.1.16)
+
+X*X    double attack on safe eye
+.X.
+X.X
+OXX
+
+:8,-,value(75)
+
+b*c
+.X.
+X.X
+DXX
+
+;!attack(D) && oplay_attack(*,b) && oplay_attack(*,c)
+
+
+Pattern VA43
+# tm New Pattern (3.1.17)
+
+XXX.
+.O*.
+----
+
+:8,s,value(50)
+
+XXXb
+.O*a
+----
+
+; !oplay_attack(*,a,b,b)
+; && !oplay_attack(*,b,a,a)
+
+
+Pattern VA44
+# tm New Pattern (3.1.17)
+# gf Fixed symmetry. (3.3.6)
+# nn Modified constraint (3.3.14)
+# gf Revised constraint. (3.5.3)
+
+XoX
+o*o
+
+:|,s,value(57)
+
+XbX
+a*c
+
+; owl_proper_eye(*)
+; && (owl_proper_eye(a) + owl_proper_eye(b) + owl_proper_eye(c) > 2)
+; && safe_xmove(*)
+; && ((owl_eye_size(*) <= 8 && owl_maxeye(*)>1) || !oplay_attack(*,*))
+
+
+Pattern VA45
+# tm New Pattern (3.1.17)
+
+X*     cut to create false eye
+OX
+--
+
+:8,-,value(75)
+
+X*
+OX
+--
+
+; !ko(*)
+
+
+Pattern VA46
+# tm New Pattern (3.1.17)
+#   see trevor:650
+
+?X???
+X.X??
+?X.O*
+
+:8,-,value(75)
+
+?X???
+CbX??
+?XAO*
+
+; xlib(A) == 1
+; && olib(A) == 1
+; && owl_topological_eye(b,C) < 4 && owl_topological_eye(b,C) > 0
+
+
+Pattern VA47a
+# tm Moved from owl_attackpats (3.1.17)
+#   was A1107
+# gf Split with respect to ko. (3.7.9)
+
+O*          defend the surrounding chain
+XO
+
+:/,-,value(95)
+
+a*
+Xb
+
+;vital_chain(a) && vital_chain(b) && !ko(*) && !xplay_defend_both(*,a,b)
+
+
+Pattern VA47b
+# tm Moved from owl_attackpats (3.1.17)
+#   was A1107
+# gf Split with respect to ko. (3.7.9)
+
+O*          defend the surrounding chain
+XO
+
+:/,-,value(65)
+
+a*
+Xb
+
+;vital_chain(a) && vital_chain(b) && ko(*) && !xplay_defend_both(*,a,b)
+
+
+Pattern VA48
+# tm New Pattern (3.1.18)
+
++----
+|.*..
+|XX!O
+
+:8,s,value(75)
+
+
+Pattern VA49
+# tm New Pattern (3.1.18) (see trevor:430)
+# FIXME: This is non-sense if the ataried stone has neighbours
+# in atari (see trevorb:360)
+
+X*    atari outside eyespace
+oX
+
+:8,-,value(35)
+
+X*
+AB
+
+; lib(B) <= 2 && owl_eyespace(A)
+
+
+Pattern VA50
+# pp New pattern (3.3.10)
+
+|xx??
+|Ox??        try to kill with bent four in the corner
+|OXXx
+|X*.x
++----
+
+:8,s,value(45)
+
+
+Pattern VA51
+# pp New pattern (3.3.12)
+
+|*Oo         start an unfavourable ko
+|.XO
+|X.X
+|.Xx
+|.O.
++---
+
+:8,-,value(35)
+
+
+Pattern VA52a
+# gf New pattern. (3.3.20)
+
+|*Oo         make X short of liberties
+|.XO
+|X.X
+|..X
+|OXX
+|.X?
++---
+
+:8,-,value(65)
+
+
+Pattern VA52b
+# gf New pattern. (3.3.20)
+
+|*Oo
+|OXO         make X short of liberties
+|.XO
+|X.X
+|..X
+|OXX
+|.X?
++---
+
+:8,-,value(65)
+
+
+Pattern VA53
+# gf New pattern. (3.3.20)
+# See ld_owl:68.
+
+|XXX   nakade if X cannot squeeze
+|O.X
+|XOX
+|*OX
++---
+
+:8,s,value(75)
+
+|AAA
+|O.A
+|XOA
+|*OA
++---
+
+;lib(A)==2
+
+
+Pattern VA54
+# mh New pattern (3.5.4)
+# See ld_owl:413/414
+
+X.X    play atari inside one eye to destroy the other eye
+*XO
+
+:8,s,value(45)
+
+XaX
+*BO
+
+;lib(B)==2 && olib(*)>=2 && owl_proper_eye(*) && owl_maxeye(a)>0
+
+
+Pattern VA55
+# gf New pattern. (3.7.9)
+# See ld_owl:406.
+
+?X?    force opponent to fill one eye
+X.X
+.XO
+*.?
+---
+
+:8,s,value(45)
+
+?X?
+X.X
+bXO
+*a?
+---
+
+;xlib(a)==3 && oplay_lib(*,a,b,b)>1
+
+
+Pattern VA56
+# gf New pattern. (3.7.9)
+# See ld_owl:326.
+
+xXOo    destroy eye
+X.XO
+OX.*
+----
+
+:8,-,value(45)
+
+xXOo
+XaXO
+OX.*
+----
+
+;owl_mineye(a)==1
+
+
+# END OF FILE
diff --git a/patterns/owl_vital_apats.dtr b/patterns/owl_vital_apats.dtr
new file mode 100644 (file)
index 0000000..36611ec
--- /dev/null
@@ -0,0 +1,55 @@
+VA1    1
+VA2    6
+VA3    7
+VA4    0
+VA5    3
+VA6    7
+VA7    5
+VA8    1
+VA9    1
+VA10   1
+VA11   0
+VA12   7
+VA13   7
+VA14   0
+VA15   6
+VA16   4
+VA17   1
+VA18   3
+VA19   0
+VA20   0
+VA21   0
+VA22   3
+VA23   7
+VA24   1
+VA25   7
+VA26   0
+VA26b  0
+VA27   0
+VA28   0
+VA29   7
+VA30   6
+VA31   1
+VA32   0
+VA33   6
+VA34   0
+VA35   0
+VA36   1
+VA37   0
+VA38   3
+VA39   6
+VA40   1
+VA41   0
+VA42   7
+VA43   0
+VA44   1
+VA45   0
+VA46   0
+VA47   0
+VA48   2
+VA49   0
+VA50   0
+VA51   0
+VA52a  0
+VA52b  0
+VA53   7
diff --git a/patterns/patterns.db b/patterns/patterns.db
new file mode 100644 (file)
index 0000000..d1c3fed
--- /dev/null
@@ -0,0 +1,15118 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  The Pattern Database.
+#
+#  Further documentation may be found in the Texinfo documentation
+#
+#  First there is a pattern title of the form: Pattern [string]. The
+#  string is used for identifying the pattern while tuning or debugging.
+#
+#  Then a block of the following characters representing the pattern
+#  itself.
+#  
+#  ?     : don't care
+#  .     : empty
+#  X     : your piece,
+#  O     : my piece,
+#  x     : your piece or empty
+#  o     : my piece or empty
+#  *     : my next move
+#  -, |  : edge of board
+#  +     : corner of board
+#
+#  If a pattern must not match at the edge of the board,
+#  an extra row of ?'s in the pattern may be added. (This
+#  will not add to the time taken to check the pattern.)
+#
+#################
+#
+#  After the pattern, some supplementary information in the format:
+#
+# :trfno, classification, [values], helper_function
+#   
+#  These and other aspects of the pattern database are documented
+#  in the Texinfo documentation.
+#
+#################
+#
+#  Any line beginning with #, or any part of a line following
+#  whitespace is a comment. 
+#
+#  The patterns are classified into a number of different categories:
+#  
+#  CC    center cut/connection
+#  EC    edge cut/connection
+#  CS    center splitting
+#  ES    edge splitting
+#  EB    edge block/expand
+#  CB    center block/expand
+#  ED    edge defend/attack
+#  CD    center defend/attack
+#  CM    center miscellaneous
+#  (F     fuseki) moved to fuseki.db
+#  (J     joseki) moved to fuseki.db
+#  EJ    edge joseki
+#  S     seki
+#  HH    high handicap
+#  LE    large endgame
+#
+#  The patterns are grouped in the file by category. New patterns
+#  should be added close to a similar pattern or at the end of the
+#  category where it belongs. When a new pattern is added, the names
+#  of later patterns in the category should usually not be changed.
+#  This can be accomplished by introducing names like CC35b and so on.
+#
+
+
+attribute_map general
+
+goal_elements none
+# FIXME: try to make callback_data pattern category specific
+callback_data XOxo
+
+
+##########################
+#
+# Cutting and Connecting patterns
+#
+# Mainly patterns which actually guarantee a cut or a connection are
+# accepted. Occasionally patterns which threaten to make a cut or
+# connection. These patterns are given the C or B classification.
+# 
+# See ConnXXX and CutXXX for a new set of cutting and connecting patterns.  
+#
+##########################
+#
+# Center Cuts and Connections
+#
+##########################
+
+
+Pattern CC1
+
+?.??       connect 
+O*.O
+.X..
+
+:8,c
+
+
+Pattern CC2
+
+?.X        connect against peep (not on edge)
+O*O
+?X?
+
+:8,nBC
+
+?aX
+b*c
+?X?
+
+;xplay_attack_either(*,a,a,b) || xplay_attack(*,a,c)
+
+
+Pattern CC3
+
+?O?        break connection
+X*X
+?O?
+
+:+,OB
+
+?a?
+X*X
+?b?
+
+;alive(a) || alive(b)
+
+
+Pattern CC4
+# More accurate helper needed.
+
+O.?        break connection
+X*X
+?O?
+
+:8,B
+
+a.?
+X*X
+?b?
+
+;lib(a)>1 && (alive(a) || alive(b))
+
+
+Pattern CC5
+
+???       push in
+...
+X*X
+?O?
+
+:|,OB
+
+
+Pattern CC6
+
+?xxx?     straight extension to connect
+XOO*?
+O...?
+
+:8,C
+
+?xxx?
+XOO*?
+Oa..?
+
+;xcut(a) && odefend_against(*,a)
+
+
+Pattern CC7
+
+OX?                cut
+X*.
+?.?
+
+:\,OB
+
+aX?
+X*.
+?.?
+
+;lib(a)>2 && lib2(a)>3
+
+
+Pattern CC8
+
+??X?        push through to cut
+?OXx
+O.O*
+???X
+
+:8,OB
+
+??A?
+?OAx
+O.O*
+???B
+
+;!xplay_attack(*,A) && !xplay_attack(*,B)
+
+
+Pattern CC9
+
+?O?         cut through
+XO?
+.*X
+
+:8,OB
+
+
+Pattern CC10
+
+O.X         three crows
+.*.
+X..
+
+:\,OB
+
+
+Pattern CC10b
+
+O.X         three crows
+.*.
+X..
+
+:\,OXe
+
+
+Pattern CC11
+
+o.X         separate the opponent
+?*O
+?X?
+
+:8,nOB
+
+o.A
+?*O
+?B?
+
+;!attack(A) && !attack(B)
+
+
+Pattern CC12
+
+?.X       cut!      
+O*.
+?XO
+
+:8,B
+
+?.X
+a*B
+?Xc
+
+;(alive(a) || alive(c)) && oplay_defend(*,B,c);
+
+
+Pattern CC13
+# tm modified (3.1.10)
+# (compare Conn315)
+# gf Added n classification. (3.3.16)
+# gf Revised constraint. (3.5.4)
+
+O?        cut!
+*X
+XO
+
+:8,Bn,shape(2)
+
+O?
+*A
+Bc
+
+;lib(c)>1 && oplay_attack_either(*,A,B)
+
+
+Pattern CC13b
+# gf New pattern. (3.5.3)
+
+O?        cut!
+*X
+XO
+
+:8,e
+
+a?
+*X
+XO
+
+;alive(a)
+
+
+Pattern CC14
+# This connection is bad shape. Should have a helper to verify
+# that it's necessary.
+
+.O.          Connect
+...
+X*.
+?OO
+
+:8,OC
+
+
+Pattern CC15
+
+?X.O        break connection
+O*.X
+
+:8,B
+
+?Xac
+d*bX
+
+;(alive(c) || alive(d))
+;&& (!oplay_attack_either(*,a,b,b,c) || !oplay_attack_either(*,b,a,*,a))
+
+
+Pattern CC16
+
+X.O         break connection
+*.X
+Ox?
+
+:8,B
+
+Xac
+*bX
+dx?
+
+;(alive(c) || alive(d))
+;&& (!oplay_attack_either(*,a,b,b,c) || !oplay_attack_either(*,b,a,*,a))
+
+
+Pattern CC17
+
+?X.O        break connection
+.*.X
+O.??
+
+:8,B
+
+?Xac
+.*bX
+d.??
+
+;(alive(c) || alive(d))
+;&& (!oplay_attack_either(*,a,b,b,c) || !oplay_attack_either(*,b,a,*,a))
+
+
+Pattern CC19
+
+.O.           defend cut
+X*.
+...
+OO.
+
+:8,OC
+
+
+Pattern CC20
+
+.O.?         try to connect
+...?
+.*.X
+?.O?
+
+:8,C
+
+.O.?
+d..?
+c*aX
+?bO?
+
+;!omoyo(c) || !omoyo(d) || !xplay_attack(a,*,b,b)
+
+
+Pattern CC21
+
+?X.?         connect!
+.*.O
+O..O
+??X?
+
+:8,C
+
+
+Pattern CC22
+
+?O.?         connect!
+..*X
+X...
+?.O?
+
+:8,C
+
+
+Pattern CC23
+
+?O.O       connect!
+..*X
+X...
+?.O?
+
+:8,C
+
+
+Pattern CC24
+
+?X.?        connect!
+.OXO
+O.*O
+??X?
+
+:8,C
+
+
+Pattern CC25
+
+?X.O       break connection
+..*.
+O.XO
+
+:8,B
+
+?X.a
+..*.
+O.XO
+
+;alive(a)
+
+
+Pattern CC26
+
+?X.o?      break connection
+..*.O
+O.XO?
+
+:8,B
+
+?X.o?
+..*.b
+O.Xa?
+
+;lib(a)>1 && alive(b)
+
+
+Pattern CC27
+
+??.?           connection helper
+O*.O
+?XO?
+
+:8,nC
+
+??.?
+O*aO
+?XO?
+
+;oplay_attack(*,a,a) == WIN
+
+
+Pattern CC28
+
+O..X?           separate
+..*.?
+X...o
+....?
+???O?
+
+:8,a
+
+
+Pattern CC29
+
+?.O          atari to connect
+X*.
+O.?
+
+:8,C
+
+?.O
+A*.
+a.?
+
+;lib(a)>1 && lib(A)==2
+
+
+Pattern CC30
+# gf Revised pattern. (3.3.16)
+
+?O*        double connection 
+X.O
+?O.
+
+:8,nC
+
+?b*
+XaO
+?c.
+
+;!xplay_connect(a,b,c)
+
+
+Pattern CC31
+# gf Revised pattern. (3.3.16)
+
+?O.        double connection 
+X*O
+?O.
+
+:-,C
+
+?a.
+X*O
+?b.
+
+;!xplay_connect(*,a,b)
+
+
+Pattern CC32
+
+?X.        double break
+O*X
+?X.
+
+:-,-
+
+?ca
+O*d
+?eb
+
+;oplay_defend_both(*,a,b,*,b) && oplay_defend_both(*,b,a,*,a)
+
+>add_cut_move(c,d);
+>add_cut_move(c,e);
+>add_cut_move(d,e);
+
+
+Pattern CC33
+
+XO.?        hane to break connection
+*..x
+.X??
+
+:8,OB
+
+BO.?
+*A.x
+.X??
+
+;oplay_attack(*,A,B)
+
+
+Pattern CC34
+
+....
+O.*O
+..X?
+
+:8,C
+
+
+Pattern CC35
+
+O??           break connection
+..X
+X*X
+?O?
+
+:8,OB
+
+O??
+baX
+X*X
+?O?
+
+;!oplay_attack(*,a,b,*) && !oplay_attack(*,a,b,b)
+
+
+Pattern CC36
+
+?Oo??          connection pattern
+o.O.?
+x*X.x
+?.O??
+
+:8,XC
+
+?Oo??
+odO.?
+x*Xbx
+?ca??
+
+;lib(a)>1 && oplay_attack(*,b,c,d,d)
+
+
+Pattern CC37
+
+?Oo?           connection pattern
+o.OX
+?*X.
+?.O?
+
+:8,XC
+
+?Oo?
+odOX
+?*Xb
+?ca?
+
+;lib(a)>1 && oplay_attack(*,b,c,d,d)
+
+
+Pattern CC38
+
+?Oo?           connection pattern
+o.O.
+?*X.
+?.OX
+
+:8,XC
+
+?Oo?
+odO.
+?*Xb
+?caX
+
+;lib(a)>1 && oplay_attack(*,b,c,d,d)
+
+
+Pattern CC39
+# This pattern guarantees a strong connection.
+# The constraint is asymmetric.
+
+?O.           Connect
+.X*
+?O.
+
+:8,C
+
+?fb
+aD*
+?ec
+
+;lib(e)>1 && lib(f)>1
+;&& (!oplay_defend(*,D) || oplay_attack_either(*,a,b,c,D,c))
+
+
+Pattern CC40
+
+?O*x           Connect on the right side
+XXOX
+?O.?
+
+:8,C
+
+?O*x
+XXOX
+?Oa?
+
+;odefend_against(*,a)
+
+
+Pattern CC41
+
+?XX?           Cut or threaten to cut
+O.*O
+o.X?
+
+:8,OB
+
+
+Pattern CC42
+
+O.X.O         warikomi
+oo*oo
+O.X.O
+
+:|,OB
+
+
+Pattern CC43
+# This pattern caused a problem at move 52 in ego.sgf
+
+XO
+*.
+.X
+
+:8,OB
+
+Xb
+*a
+.X
+
+;oplay_defend_both(*,a,*,b)
+
+
+Pattern CC44
+# May be too risky.
+
+O.X           boldly cut before connecting
+XO*
+?X.
+
+:8,OB
+
+baX
+dO*
+?c.
+
+;oplay_attack(*,a,a) || oplay_attack(*,a,d)
+;|| (oplay_attack(*,a,c) && !oplay_attack(*,a,b))
+
+
+Pattern CC45
+# B classification is somewhat incorrect, but does convey the urgency
+# of the move.
+
+....      connect to contain
+O*OX
+?XXO
+
+:8,BC
+
+....
+c*OX
+?AAb
+
+;lib(A)>1 && lib(b)>1 && alive(c)
+
+
+Pattern CC46
+
+.XO      Cut
+.*.
+OXO
+
+:8,OB
+
+.XO
+b*a
+cXO
+
+;oplay_attack(*,a,a) && !oplay_attack(*,b,a,c)
+
+
+Pattern CC47
+
+.*.X       separate the opponent
+X..X
+?OO?
+
+:8,OB
+
+.*cX
+XabX
+?dO?
+
+;!oplay_attack(*,a,b,c,d) && !oplay_attack(*,a,b,c,*)
+
+
+Pattern CC48
+
+X*.        Cut
+O..
+O.X
+
+:8,OB
+
+B*.
+Oa.
+O.X
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern CC49
+
+?..X        Cut
+O*..
+?X..
+
+:8,OB
+
+?..X
+O*ac
+?Xbd
+
+;!xarea(d) && !oplay_attack_either(*,a,b,*,b)
+;&& !oplay_attack_either(*,b,a,c,d,a,d)
+
+
+Pattern CC50
+
+o.X.?      Cut
+O.*.?
+oOX.?
+
+:8,OB
+
+o.Xce
+Ob*af
+oOXdg
+
+;(!xarea(f) || !(xarea(e) && xarea(g)))
+;&& !oplay_attack_either(*,a,b,c,d,d,b)
+;&& !oplay_attack_either(*,a,b,d,c,c,b)
+
+
+Pattern CC51
+
+O*.O
+?XO?
+
+:8,nC
+
+O*aO
+?XO?
+
+;odefend_against(*,a)
+
+
+Pattern CC52a
+# Constraint probably needs revision.
+
+OX..     connect if invaded
+.*.O
+
+:8,C
+
+Odbe
+c*aO
+
+;oplay_attack(*,a,b,d) && oplay_attack(*,a,b,a)
+;&& oplay_attack(*,a,b,e,e) && oplay_attack(*,a,b,c,c)
+
+
+Pattern CC52b
+# ab New pattern. (3.3.10)
+
+?????
+.OX.?     keep loose connection
+..*.O
+?..oo
+
+:8,c
+
+?????
+.aX.?
+..*.b
+?..oo
+
+;!same_dragon(a,b) && (alive(a) || alive(b))
+
+
+Pattern CC53
+
+XXO           cut
+O*.
+??X
+
+:8,B
+
+XXb
+c*a
+??X
+
+;alive(c) && oplay_defend_both(*,a,*,b)
+
+
+Pattern CC54
+# This is a very conservative estimate of the chances to connect.
+# Other patterns are more accurate.
+# We really would need tactical reading functions for determining
+# whether a connection holds.
+
+OXO             block opponent
+.*.
+?.?
+
+:|,C
+
+OXO
+a*c
+?b?
+
+;!oplay_defend(*,a,b,c,a) && !oplay_defend(*,a,b,c,c)
+
+
+Pattern CC55
+# Analogous to the previous one.
+
+XOX             push out
+.*.
+?.?
+
+:|,OB
+
+AOB
+.*.
+?.?
+
+;!xplay_break_through(*,A,*,B)
+
+
+Pattern CC57
+# gf Removed obsolete add_connect_move actions. (3.3.16)
+
+??XO?         connect three stones
+..*.o
+O..O?
+?..??
+
+:8,C
+
+??Xc?
+..*.o
+a..b?
+?..??
+
+;lib(a)>2 && lib(b)>2 && lib(c)>3
+
+
+Pattern CC58
+
+X...             attach
+XO*X
+....
+..O.
+
+:8,OB
+
+
+Pattern CC59
+
+?X??     cut the knight's move
+..*O
+O.XO
+
+:8,OB
+
+
+Pattern CC60
+
+?X??     cut the knight's move
+.*OO
+OXXO
+
+:8,OB
+
+
+Pattern CC61
+
+X.OO            break connection
+X..X
+.*.?
+
+:8,OB
+
+
+Pattern CC62
+
+O.X           block off area
+.*.
+X.O
+
+:X,OB
+
+
+Pattern CC63
+
+?O?      cut through
+XO?
+.*X
+
+:8,OB
+
+
+Pattern CC64
+
+O..      three crows
+.*.
+x.O
+
+:/,C
+
+O..
+.*.
+x.O
+
+;!omoyo(*)
+
+
+Pattern CC65
+
+..Xx      separate the opponent
+.*.?
+X.O?
+x???
+
+:\,OB
+
+
+Pattern CC66
+
+..X.          Attach to defend connection
+O.*.
+....
+O.O.
+?X??
+
+:8,C
+
+..X.
+O.*.
+.a..
+ObO.
+?X??
+
+;!oplay_defend(*,a,b,a)
+
+
+Pattern CC67
+
+O*X        cut!
+X..
+X.O
+
+:8,OB
+
+O*X
+Xab
+Xcd
+
+;!oplay_attack_either(*,a,b,*,b) && oplay_defend_both(*,b,a,c,a,d)
+
+
+Pattern CC68
+
+?O..          cut!
+..*X
+.X..
+...O
+
+:8,OB
+
+?O..
+..*X
+.Xab
+..cd
+
+;!oplay_attack_either(*,a,b,*,b) && oplay_defend_both(*,b,a,c,a,d)
+
+
+Pattern CC69
+
+?.?      break through
+OXO
+.*.
+oXO
+
+:8,OB
+
+
+Pattern CC70
+
+?O.x           Cut
+.X*X
+?O..
+
+:8,B
+
+?fbx
+aX*E
+?gcd
+
+;(alive(f) || alive(g)) && !oplay_defend_both(*,a,b,c,d,c,E)
+
+
+Pattern CC71
+# This connection is a bit sloppy but if we can't connect
+# we do at least capture an opponent worm. Assume we are allowed
+# to connect if the worm is at least as large as our dragon.
+
+?O.x           Connect
+.X*X
+?O..
+
+:8,C
+
+?Obx
+aX*E
+?fcd
+
+;!oplay_defend_both(*,a,b,c,d,c,E) && (dragonsize(f) <= wormsize(E))
+
+
+Pattern CC72
+
+?....        atari
+.OX*X
+..O..
+?...?
+
+:8,OB
+
+
+Pattern CC73
+# gf Reduced shape value. (3.5.2)
+
+?X??          connect!
+o.*O
+O..X
+?.O?
+
+:8,scad,shape(3)
+
+
+Pattern CC74
+# gf Split pattern. (3.1.7)
+
+.O*.          connect and constrain X
+OXXO
+
+:8,C
+
+aO*b
+OXXO
+
+; oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+Pattern CC74b
+# gf Split pattern. (3.1.7)
+# Only shape bonus if X stones can't be attacked.
+
+.O*.          connect and constrain X
+OXXO
+
+:8,C,shape(2)
+
+aO*b
+OCCO
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b)
+;&& !(attack(C) && oplay_defend(*,C))
+
+
+Pattern CC75
+
+...*O         connect out
+O...X
+..O??
+
+:8,Xc
+
+
+Pattern CC76
+
+..*O         connect out
+O..X
+.O??
+
+:8,Xc
+
+
+Pattern CC77
+# tm: reduced shape value from 8 to 3 (3.1.18)
+
+X?           prevent connection
+*O
+.X
+
+:8,OB,shape(3)
+
+C?
+*b
+aD
+
+; !same_dragon(C,D) && xplay_attack_either(*,a,a,b)
+
+
+Pattern CC78
+
+..OX          connect 
+O*.O
+?Xo?
+
+:8,C
+
+..OX
+O*ba
+?Xo?
+
+;lib(a)>1 && xplay_attack(b,b)==3
+
+
+Pattern CC79
+# ab modified (3.3.10)
+# gf Reduced shape value. (3.5.2)
+
+?O.xx
+XO.*.
+XXO..
+.....
+
+:8,XCad,shape(3)
+
+?a.xx
+Xa.*.
+XXO..
+.....
+
+; lib(a)>=3 && !omoyo(*)
+
+
+Pattern CC80
+# db added (3.1.4)
+
+O*X
+XO?
+
+:8,B
+
+a*X
+XO?
+
+; does_attack(*,a)
+
+
+Pattern CC81
+# db added (3.1.4)
+
+O*X
+XO?
+?O?
+
+:8,B,shape(3)
+
+a*X
+XO?
+?O?
+
+; does_attack(*,a)
+
+
+Pattern CC82
+
+..??          reverse sente connection
+.OXX
+X*O.
+...?
+
+:8,ECad,shape(3)
+
+..??
+.AXX
+X*B.
+...?
+
+; !dead(A) && (xplay_attack(*,B) || xplay_attack(*,A))
+
+
+Pattern CC83
+# gf New pattern. (3.1.23)
+# See strategy3:142.
+
+O...
+X.*.
+?X.O
+
+:8,XC
+
+Oac.
+Xb*.
+?X.O
+
+;!oplay_defend(*,a,b,a) && oplay_attack(*,b,a,c,c)
+
+
+Pattern CC84
+# Formerly called EC37
+
+XO??           prevent double nozoki
+O.O?
+?*.O
+??OX
+
+:8,nC
+
+
+Pattern CC85
+# Formerly called EC38
+
+?XO?          prevent ko
+.O*O
+O..X
+?XXX
+
+:8,C
+
+
+Pattern CC86
+# Formerly called EC39
+
+??o?           connect out
+X..O
+O.*X
+?.??
+
+:8,C
+
+??o?
+X..O
+O.*A
+?.??
+
+; lib(A)==2
+
+
+Pattern CC87
+# Formerly called EC40
+
+??o?           connect out
+X*.O
+O.OX
+?.??
+
+:8,C
+
+
+Pattern CC88
+# Formerly called EC41
+
+.O.        cut!
+.*X
+X..
+..O
+
+:8,OB
+
+
+##########################
+#
+# General Edge Connections
+#
+##########################
+
+
+Pattern EC1
+# gf Removed obsolete add_connect_move actions. (3.3.16)
+
+O.XO?      connect under
+..*.O
+.....
+-----
+
+:8,C
+
+ObEO?
+ca*dO
+.....
+-----
+
+;odefend_against(*,d)
+;&& !oplay_defend_both(*,a,b,a,E)
+;&& oplay_attack_either(*,b,a,c,b,c)
+
+
+Pattern EC2
+# gf Removed obsolete add_connect_move actions. (3.3.16)
+
+OXXO?      connect under
+O.*.O
+.....
+-----
+
+:8,C
+
+eXXO?
+ea*dO
+.b...
+-----
+
+;odefend_against(*,d) && !oplay_attack(*,a,b,e)
+
+
+Pattern EC4
+
+?X.?      connect underneath
+O*.O
+....
+----
+
+:8,C
+
+?X.?
+d*ac
+..b.
+----
+
+;odefend_against(*,a) || !oplay_attack_either(*,a,b,c,d)
+
+
+Pattern EC5
+
+?O.?      break connection
+X*.X
+....
+----
+
+:8,OB
+
+?O.?
+D*aC
+..b.
+----
+
+;xdefend_against(*,a) || !xplay_attack_either(*,a,b,C,D)
+
+
+Pattern EC6
+
+?O.O      break connection
+X.*X
+....
+----
+
+:8,OB
+
+?OaO
+Xd*X
+.cbe
+----
+
+;odefend_against(*,a) && !oplay_attack(*,b,c,d,e,e)
+
+
+Pattern EC7
+# Probably redundant
+
+?O.X      break connection
+X*..
+....
+----
+
+:8,OB
+
+?DbX
+X*ac
+....
+----
+
+;!xplay_defend_both(*,a,b,a,D) && xplay_attack_either(*,b,a,c,b,c)
+
+
+Pattern EC8
+# gf Revised constraint. (3.5.3)
+
+?X.O      connect
+O*..
+....
+----
+
+:8,XC,shape(2)
+
+?X.b
+a*..
+....
+----
+
+;oplay_disconnect(a,b) && !oplay_disconnect(*,a,b)
+
+
+Pattern EC8a
+
+??xx?      connect
+O.xx?
+.?X.O
+.O*..
+.....
+-----
+
+:8,t
+
+??ab?
+O.cd?
+.?X.O
+.O*..
+.....
+-----
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern EC9
+# Probably redundant
+
+??O?        break connection 
+?X*X
+O..?
+----
+
+:8,OB
+
+
+Pattern EC10
+
+?OX.?         connection pattern
+?*...
+....O
+....O
+-----
+
+:8,C
+
+
+Pattern EC11
+
+?OX.?         connection pattern
+?OX..
+..*.O
+....O
+-----
+
+:8,C
+
+
+Pattern EC12
+
+..OXX?       Break connection.
+X.*.xx
+.....?
+------
+
+:8,OB
+
+
+Pattern EC13
+
+XXO?        Stop connection.
+.O*X
+----
+
+:8,B
+
+XXa?
+.O*A
+----
+
+;!dead(a) && lib(A)>2
+
+
+Pattern EC14
+
+??O?        Connect under
+X*.O
+O...
+----
+
+:8,C
+
+
+Pattern EC15
+
+XO?      separate the opponent
+.*X
+...
+---
+
+:8,OB
+
+
+Pattern EC16
+
+?..O?          hanging connection
+.*.OX
+o.OXX
+.....
+-----
+
+:8,C
+
+
+Pattern EC16a
+# gf Reduced shape value. (3.5.2)
+
+?..O?         hanging connection is best
+.*.OX
+o.OXX
+.....
+-----
+
+:8,C,shape(3)
+
+?..O?
+.*bOX
+o.OXX
+..a..
+-----
+
+; !oplay_attack(a,b,b)
+
+> antisuji(a);
+> antisuji(b);
+
+
+Pattern EC17
+
+OO?          Get up from first line.
+.*X
+.OO
+---
+
+:8,C
+
+OO?
+.*X
+.Oa
+---
+
+;lib(a)==2
+
+
+Pattern EC18
+
+X.OX?         Prevent connection
+..*xX
+.....
+-----
+
+:8,OB
+
+
+Pattern EC19
+
+?X?        Prevent connection
+x.?
+.*O
+..X
+---
+
+:8,OB
+
+
+Pattern EC20
+
+.X?        Try to prevent connection
+.*O
+...
+.XX
+---
+
+:8,OB
+
+
+Pattern EC21
+
+o.o
+XOX
+.*.
+...
+---
+
+:|,OB
+
+o.o
+aOb
+.*.
+...
+---
+
+;!xplay_break_through(*,a,*,b)
+
+
+Pattern EC22
+
+?O?
+XOX
+.*.
+...
+---
+
+:|,OB
+
+?O?
+aOb
+.*.
+...
+---
+
+;!xplay_break_through(*,a,*,b)
+
+
+Pattern EC23
+
+x.x
+OXO
+.*.
+...
+---
+
+:|,c
+
+x.x
+aXb
+.*.
+...
+---
+
+;lib(a)>1 && lib(b)>1
+
+
+Pattern EC24
+# This move does not secure a connection without a constraint, see
+#    e.g. nicklas1:502.
+
+?X?
+OXO
+.*.
+...
+---
+
+:|,c
+
+?X?
+aXb
+.*.
+...
+---
+
+;lib(a)>1 && lib(b)>1
+
+
+Pattern EC25
+
+O.X     Stop connection
+XO*
+X..
+---
+
+:8,OB
+
+ebX
+cO*
+cad
+---
+
+;!xplay_defend_both(*,a,b,a,e)
+;&& xplay_attack_either(*,b,a,d,d,b)
+;&& oplay_attack_either(*,b,b,c)
+;&& oplay_attack_either(*,a,d,b,b,c)
+
+
+Pattern EC26
+# Smaller endgame profit than EC25.
+
+O*X     Stop connection
+XO.
+X..
+---
+
+:8,OB
+
+d*X
+XOa
+Xbc
+---
+
+;(!xplay_defend(a,b,*,b) || !xplay_defend(a,b,*,d))
+;&& xplay_attack(a,*,b,c,c)
+
+
+Pattern EC27
+# gf Removed obsolete add_connect_move action. (3.3.16)
+# gf Reduced shape value. (3.5.2)
+
+?X*O          Use edge to stay connected.
+?XOX
+...O
+....
+----
+
+:8,-,shape(3)
+
+?X*O
+?XOB
+..aO
+....
+----
+
+; !attack(B) && oplay_attack(*,a,a)
+
+
+Pattern EC28
+# gf Removed obsolete add_connect_move action. (3.3.16)
+
+O.XO?        capture to connect
+OXOXO
+o..*.
+-----
+
+:8,-
+
+caXO?
+cXOXO
+ob.*.
+-----
+
+;!oplay_attack(*,a,b,c) && !oplay_attack(*,b,a,c)
+
+
+Pattern EC29
+
+X..Oo        cut
+..*X.
+.....
+-----
+
+:8,OB
+
+X.aOo
+..*B.
+.....
+-----
+
+;oplay_attack_either(*,a,B,a)
+
+
+Pattern EC30
+
+?O?         force X to connect
+X*X
+...
+---
+
+:|,a
+
+
+Pattern EC31
+
+?..??          Clamp to connect under
+X..O?
+OX*.O
+.....
+-----
+
+:8,C
+
+?..??
+X..O?
+aX*.O
+.....
+-----
+
+;!attack(a)
+
+
+Pattern EC32
+
+XO?           cut!
+.*X
+...
+---
+
+:8,OB
+
+
+Pattern EC33
+
+?O?            Take an important ko
+OXO
+X*X
+---
+
+:8,B
+
+?b?
+OAO
+X*X
+---
+
+;ko(A) && alive(b)
+
+
+Pattern EC34
+
+?X?          Take an important ko 
+X*X
+OXO
+---
+
+:8,C
+
+?X?
+X*X
+OAO
+---
+
+;ko(A)
+
+
+Pattern EC35
+
+?X?            Fill an important ko
+XOX
+O*O
+---
+
+:8,C
+
+?X?
+XaX
+O*O
+---
+
+;ko(a)
+
+
+Pattern EC36
+
+?O?          Fill an important ko 
+O*O
+XOX
+---
+
+:8,B
+
+?b?
+O*O
+XaX
+---
+
+;ko(a) && alive(b)
+
+
+Pattern EC42
+
+..OO?    cut
+X.*X?
+.....
+.....
+-----
+
+:8,OB
+
+
+Pattern EC43
+
+..OO?    cut
+X.OX?
+.*X..
+.....
+-----
+
+:8,OB
+
+
+Pattern EC44
+
+Oo.X               stop connection on edge
+X*.X
+----
+
+:8,OB
+
+
+Pattern EC45
+
+..O.             descend
+....
+.O.X
+X*..
+....
+----
+
+:8,OB
+
+
+Pattern EC46
+
+....?             cut after invasion
+O.OX?
+..X*O
+....?
+....?
+-----
+
+:8,OB
+
+
+Pattern EC47
+
+X.OX     block edge connection
+X.*.
+----
+
+:8,OB
+
+
+Pattern EC48
+
+XOXX            break connection
+X*.?
+----
+
+:8,OB
+
+
+Pattern EC49
+
+.O..        block
+X*.X
+....
+....
+----
+
+:8,OB
+
+
+Pattern EC50
+
+.O..        block
+XO.X
+.X*.
+....
+----
+
+:8,OB
+
+
+Pattern EC51
+
+..*x?      Prevent connection
+?XO.X
+.....
+.....
+-----
+
+:8,OB
+
+
+Pattern EC52
+
+.*.O?      Prevent connection
+?XO.X
+.....
+.....
+-----
+
+:8,OB
+
+
+Pattern EC53
+
+?.O??
+X.OX?
+.*X..
+.....
+-----
+
+:8,OB
+
+
+Pattern EC54
+
+..O..           prevent connection
+XO.X.
+..*..
+.....
+-----
+
+:8,OB
+
+
+Pattern EC55
+
+?.O?           break connection
+.O.X
+.X*.
+....
+----
+
+:8,OB
+
+?ce?
+dOaX
+bX*.
+....
+----
+
+;!oplay_attack(*,a,b,c,d,e)
+
+
+Pattern EC56
+# gf The constraint was too inexact, see match at B9 in score2:34.
+#    Replaced it by a connection constraint. (3.1.32)
+
+X*O?       Prevent opponent's connection under
+...X
+----
+
+:8,OB
+
+B*O?
+...A
+----
+
+;oplay_connect(A,B) && !oplay_connect(*,A,B)
+
+
+Pattern EC57
+
+??O??       Connect underneath by attaching
+O.X.O
+..*..
+.....
+-----
+
+:|,C
+
+??O??
+OdXaO
+fe*bc
+.....
+-----
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,d,e,f,d,f)
+;&& !oplay_defend_both(*,b,a,d,e,b,d)
+;&& !oplay_defend_both(*,e,d,a,b,e,a)
+
+
+Pattern EC58
+
+O.X.O       connect!
+O.*..
+.....
+.....
+-----
+
+:8,C
+
+OfIaO
+Od*bc
+hge..
+.....
+-----
+
+;!oplay_defend_both(*,b,a,b,I) && oplay_attack_either(*,a,b,c,a,c)
+;&& oplay_attack_either(*,b,a,d,e,f,g,h,f,h)
+;&& !oplay_defend_both(*,b,a,d,e,g,f,g,I)
+
+
+Pattern EC59
+
+.XO.X         hane to prevent connection
+.*..X
+-----
+
+:8,OB
+
+.Xa.X
+.*..X
+-----
+
+;!oplay_attack(*,a)
+
+
+Pattern EC60
+# tm added constraint (3.1.18)
+# gf Changed B classification to C. (3.1.18)
+
+?O..           protect cut
+XO*X
+XXO.
+....
+----
+
+:8,OC
+
+?O..
+XO*X
+XXcA
+...B
+----
+
+; xplay_attack(A,B,c) || xplay_attack(*,c)
+
+
+Pattern EC60a
+# tm New Pattern (3.1.18)
+# gf Changed B classification to C. (3.1.18)
+
+?O..           indirectly protect cut
+XO.X
+XXO*
+....
+----
+
+:8,OC
+
+?b..
+XOaX
+XXO*
+....
+----
+
+; oplay_defend_both(*,a,*,b)
+
+
+Pattern EC61
+
+OoOO?       prevent connection
+X.X*X
+.....
+-----
+
+:8,OB
+
+
+Pattern EC62
+
+.X.??         defend the extension
+O*...
+....O
+.....
+.....
+-----
+
+:8,C
+
+
+Pattern EC63
+# gf Fixed value removed and constraint revised. (3.5.2)
+
+?X?           connect underneath if X can't cut
+OXO
+.*.
+...
+---
+
+:|,XC
+
+?X?
+aXb
+.*.
+...
+---
+
+;!oplay_disconnect(*,a,b)
+
+
+Pattern EC64
+# gf Removed fixed value. (3.5.2)
+
+..xxx           threaten connection
+.O.Xx
+.*X.O
+.....
+-----
+
+:8,OXead
+
+..xxx
+.O.Xx
+.*X.a
+.....
+-----
+
+; lib(a)>2
+
+
+Pattern EC65
+# gf Reduced shape value. (3.5.2)
+
+ox..o         Connect underneath
+O*X.O
+..O..
+.....
+-----
+
+:8,XC,shape(3)
+
+
+Pattern EC66
+# gf Reduced shape value. (3.5.2)
+
+OXX.O          connect below
+.*O..
+.....
+-----
+
+:8,XCad,shape(3)
+
+OXX.O
+b*Oa.
+.....
+-----
+
+; oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+Pattern EC67
+# gf Reduced shape value. (3.5.2)
+
+OXX.O          connect below
+.O*..
+.....
+-----
+
+:8,XCad,shape(3)
+
+OXX.O
+bO*a.
+.....
+-----
+
+; oplay_attack(*,a,a)&&oplay_attack(*,b,b)
+
+
+Pattern EC68
+
+O.XOo        connect underneath
+..*.o
+.....
+-----
+
+:8,XCad
+
+O.Abo
+..*.o
+.....
+-----
+
+; lib(A)<4 && lib(b)>2 && !attack(A)
+
+
+Pattern EC69
+
+?OXx?
+X*..O
+..O..
+.....
+-----
+
+:8,XCad
+
+?OXx?
+A*..O
+..O..
+.....
+-----
+
+; does_attack(*,A)
+
+
+Pattern EC70
+# constraint looks for shortage of liberties
+
+oOX.O        connect with ko
+O.*..
+-----
+
+:8,XCd
+
+oOXbO
+Oc*ad
+-----
+
+; !oplay_attack(*,a,b,c,d,*,c)
+
+
+Pattern EC71
+# constraint looks for shortage of liberties
+
+xXO.X        prevent ko connection
+X.*..
+-----
+
+:8,Ba
+
+xXObX
+Xc*ad
+-----
+
+; !xplay_attack(*,a,b,c,d,*,c)
+
+
+Pattern EC73
+
+?OXXX?       secure connection
+..OO*O
+......
+------
+
+:8,XC,value(5)
+
+?aXXX?
+..OO*O
+......
+------
+
+; lib(a)==2 && !dead(a)
+
+
+Pattern EC74
+
+?..ooo        connect under
+..X.Oo
+O.*..o
+......
+......
+------
+
+:8,XCd,shape(2)
+
+
+Pattern EC75
+
+?..ooo        connect under
+..X*Oo
+O.OX.o
+......
+......
+------
+
+:8,Cd,shape(3)
+
+
+Pattern EC76
+#gf New pattern. (3.1.12)
+
+?..O?          cut!
+...OX
+.XOXX
+..*..
+-----
+
+:8,B
+
+?..b?
+..abX
+.XOXX
+..*..
+-----
+
+;alive(b) && oplay_attack(*,a,a)
+
+
+Pattern EC77
+#tm New Pattern (3.1.16)
+#tm modified (3.1.17)
+
+|..x     clamp!
+|.*.
+|.X.
+|XOO
+
+:8,OXe
+
+|..x
+|.*.
+|.A.
+|XOO
+
+;oplay_defend(*,A) != WIN
+
+
+Pattern EC78
+#tm New Pattern (3.1.18)
+# gf Revised constraint. (3.3.12)
+#  see trevora:610
+#FIXME: There's still a problem here, in that this sacrifice
+#       is deemed unsafe, and not played....
+# gf Is this really a cut pattern? (3.3.13)
+
+OOO    block or cut into black's territory.
+...
+*X.
+...
+---
+
+:8,sOXe
+
+OOO
+a..
+*Xb
+...
+---
+
+; safe_omove(*)
+; || !oplay_attack(*,a,b,b)
+
+
+Pattern EC79
+# gf New Pattern (3.3.13)
+
+X.O      connect
+X*.
+O..
+---
+
+:8,C
+
+
+Pattern EC80
+# gf New Pattern (3.3.15)
+
+XOOX     block edge connection
+X.*.
+----
+
+:8,OB
+
+XOOX
+Xa*.
+----
+
+;xplay_attack(*,a,a)
+
+
+Pattern EC81
+# gf New Pattern (3.3.16)
+# See nngs1:31
+
+XXX.Ox   connect all stones
+OO..*X
+....O?
+......
+------
+
+:8,XC
+
+
+##############################################
+# First line, one space, cuts and connections.
+##############################################
+
+Pattern EC101
+
+XOX       prevent connection
+.*.
+---
+
+:|,OB
+
+XOX
+a*b
+---
+
+;xdefend_against(*,a) && xdefend_against(*,b)
+
+
+Pattern EC102
+
+XOX       prevent connection
+..*
+---
+
+:8,OB
+
+XcX
+ab*
+---
+
+;xdefend_against(b,a) && xdefend_against(b,*) && !oplay_attack(*,c)
+
+
+Pattern EC103
+
+XOX?       followup
+.*OX
+----
+
+:8,B
+
+XaX?
+.*OX
+----
+
+;!dead(a)
+
+
+Pattern EC104
+
+OXO      make connection
+.*.
+---
+
+:|,C
+
+OXO
+a*b
+---
+
+;odefend_against(*,a) && odefend_against(*,b)
+
+
+Pattern EC105
+
+XO?         don't allow connection underneath
+.*X
+---
+
+:8,OB
+
+BO?
+a*X
+---
+
+;(safe_xmove(*) && xplay_defend_both(*,a,*,B)) || xdefend_against(a,*)
+
+
+Pattern EC106
+
+XO?         don't allow connection underneath
+X*X
+---
+
+:8,nOB
+
+
+Pattern EC107
+
+?O?          Cut on first line
+X*X
+---
+
+:8,OB
+
+
+Pattern EC108
+
+XOX     block edge connection
+x*x
+---
+
+:8,nOB
+
+AOB
+x*x
+---
+
+;(!attack(A)) && (!attack(B))
+
+
+Pattern EC109
+
+?X?
+O*O
+---
+
+:|,nC
+
+
+Pattern EC110
+# Probably redundant
+
+?OX*O           connect under
+o.O..
+-----
+
+:8,C
+
+
+##############################################
+# First line, two spaces, cuts and connections.
+##############################################
+
+
+Pattern EC201
+
+XO..         don't allow connection underneath
+.*.X
+----
+
+:8,OB
+
+BO..
+a*.X
+----
+
+;safe_xmove(*) && xplay_defend_both(*,a,*,B)
+
+
+Pattern EC202
+
+XO*.         don't allow connection underneath
+...X
+----
+
+:8,nOB
+
+BO*.
+ac.X
+----
+
+;xplay_defend_both(c,a,c,B)
+
+
+Pattern EC203
+
+XO..         don't allow connection underneath
+X*.X
+----
+
+:8,nOB
+
+
+Pattern EC204
+
+XO*.         don't allow connection underneath
+X..X
+----
+
+:8,OB
+
+XO*.
+Xa.X
+----
+
+;safe_xmove(a)
+
+
+Pattern EC205
+
+XO.O         don't allow connection underneath
+x.*X
+----
+
+:8,OB
+
+XOaO
+xb*X
+----
+
+;odefend_against(*,a) && oplay_defend(*,b,*)
+
+
+Pattern EC206
+# Probably redundant
+
+?XO.OX?      prevent connection
+x.X*..x
+-------
+
+:8,C
+
+
+Pattern EC207
+
+O.XO          Connect at edge
+..*.
+----
+
+:8,nC
+
+ObEO
+da*c
+----
+
+;oplay_attack_either(*,c,E,c) && oplay_attack_either(*,b,a,d,b,d)
+;&& oplay_attack(*,a,b,c,E) == WIN
+
+
+Pattern EC208
+# Followup to EC207
+
+O*XO          Connect at edge
+.XO.
+----
+
+:8,nC
+
+O*BO
+.XOa
+----
+
+;oplay_attack(*,a,B)
+
+
+Pattern EC209
+# Probably redundant.
+
+X.OX     block edge connection
+X.*.
+----
+
+:8,OB
+
+X.OB
+X.*a
+----
+
+;xdefend_against(*,a) && !xplay_attack(*,B)
+
+
+Pattern EC210
+
+X.OX          Cut at edge
+..*.
+----
+
+:8,nOB
+
+XbeX
+da*c
+----
+
+;xplay_attack_either(*,c,e,c) && xplay_attack_either(*,b,a,d,b,d)
+;&& xplay_attack(*,a,b,c,e)
+
+
+Pattern EC211
+# Probably redundant.
+
+X.OO     block edge connection
+X.*X
+----
+
+:8,OB
+
+
+Pattern EC212
+
+??XoO        Defend monkey jump
+?O*oo
+-----
+
+:8,C
+
+??XoO
+?a*oo
+-----
+
+;lib(a)>=3
+
+
+Pattern EC213
+
+?..XO        Defend monkey jump
+.O.*o
+-----
+
+:8,C
+
+
+Pattern EC214
+
+?xx..        Defend inverse monkey jump
+o.XO.
+O.*..
+-----
+
+:8,C
+
+
+Pattern EC215
+
+??OO?         Cut through monkey jump.
+X..O?
+..*Xx
+-----
+
+:8,OB
+
+
+Pattern EC216
+
+?X..O        Monkey jump edge connection
+O*..o
+-----
+
+:8,C
+
+?X..O
+a*..o
+-----
+
+;lib(a)>=3
+
+
+Pattern EC217
+
+?O??
+X*.X
+----
+
+:8,OB
+
+?O??
+B*aC
+----
+
+;lib(B)>1 && lib(C)>1 && xplay_attack(*,a,a)
+
+
+Pattern EC218
+
+??o?         Connect underneath
+OX.X
+.*.O
+----
+
+:8,C
+
+
+######################################################################
+#
+# Splitting and other strategically attacking (or defending) moves
+#
+# These patterns do not have the C or B classification but they
+# often have an effect on connections.
+#
+######################################################################
+
+
+####################################
+#
+#  Center splitting patterns
+#
+####################################
+
+Pattern CS1
+
+?X?X?         pattern to make two partial connections
+O.O.O
+.....
+..*..
+?????
+
+:|,Xd
+
+?A?B?
+O.O.O
+.....
+..*..
+?????
+
+;lib(A)>1 && lib(B)>1
+
+
+Pattern CS2
+
+??O.    pattern to connect
+X..O
+.*..
+O.??
+
+:8,OXead
+
+
+Pattern CS3
+
+...X       Move out and separate
+.*..
+X.O?
+
+:8,OXad
+
+
+Pattern CS4
+
+.X.O.??       pattern to separate the opponent
+.....??
+...*.??
+.....X.
+
+:8,OXad
+
+
+Pattern CS5
+
+??x??         Play out to separate the opponent
+.X.O.
+..*..
+.....
+.....
+...X?
+
+:8,OXad
+
+
+Pattern CS6
+
+??O.?         Play out to separate the opponent. Only play if no risk for cut at a below.
+.X.O.
+..*..
+.....
+.....
+...X?
+
+:8,OXad
+
+??Oa?
+.X.O.
+..*..
+.....
+.....
+...X?
+
+;!safe_xmove(a)
+
+
+Pattern CS7
+
+...O??       jump to separate
+.X...?
+...*..
+.....X
+
+:8,OXad
+
+
+Pattern CS8
+
+...O..      jump to separate
+.X...X
+...*..
+
+:8,OXad
+
+
+Pattern CS9
+
+??????         leap to connect
+......
+O.*..O
+......
+??????
+
+:8,OXad,jump_out_helper
+
+
+Pattern CS10
+
+??.??         jump to separate opponent
+?.O..
+X...X
+?.*..
+??.??
+
+:8,OXad
+
+
+Pattern CS11
+
+..X          Cut across large knight's move
+...
+.*O
+.X?
+
+:8,OXad
+
+b.X
+...
+.*a
+.X?
+
+;!weak(a) || !xmoyo(b)
+
+
+Pattern CS12
+
+?OO?       jump across
+...X
+X*..
+
+:8,OXad
+
+
+Pattern CS13
+
+.X..          attach
+.*.O
+....
+..X.
+
+:8,OXad
+
+
+Pattern CS14
+
+??.??         jump to separate opponent
+?.O..
+X.*.X
+?....
+?oO??
+
+:8,OXad
+
+
+Pattern CS15
+
+.O..
+X*.X
+....
+oO??
+
+:8,OXa
+
+
+Pattern CS16
+# gf Revised constraint. (3.5.3)
+# See gifu03:308.
+
+?O.x
+X*.X
+
+:8,OXa
+
+?c.x
+A*dB
+
+;!same_dragon(A,B) && (weak(c) || xplay_connect(*,d,A,B))
+
+
+Pattern CS17
+
+xXx      Even a computer answers a peep.
+O*O
+...
+
+:8,OXd
+
+xXx
+b*c
+.a.
+
+;xplay_break_through(*,a,b,a,c)
+
+
+Pattern CS18
+
+?...?
+O.*.O
+o...o
+?XxX?
+
+:|,OXad
+
+
+Pattern CS19
+# gf Corrected symmetry. (3.1.23)
+
+X...
+O.*.
+O..X
+
+:8,OXad
+
+
+Pattern CS20a
+# gf Corrected symmetry. (3.1.23)
+# gf Split pattern. (3.3.16)
+
+X..
+O*.
+?xX
+
+:8,OXa
+
+
+Pattern CS20b
+# gf Corrected symmetry. (3.1.23)
+# gf Split pattern. (3.3.16)
+
+X..
+O*.
+?xX
+
+:8,OXd
+
+A..
+O*.
+?xB
+
+;!oplay_connect(*,A,B)
+
+
+Pattern CS21
+
+OOXX           cutting tesuji
+.X..
+.*..
+..O?
+
+:8,OXa
+
+aaXX
+.X..
+.*..
+..O?
+
+;lib(a)>2
+
+
+Pattern CS22
+
+?..??     when caught in a crosscut, extend
+.OX.?
+?XO*.
+??..?
+
+:8,OXad
+
+
+Pattern CS23
+
+?.X.         good relationship
+?O*.
+....
+X...
+?.O?
+
+:8,OXad
+
+
+Pattern CS24
+# This is part of a standard sequence in 4 stone games
+
+...O.
+.....
+O.*X.
+.....
+.....
+
+:8,OXd
+
+...O.
+.....
+O.*A.
+.....
+.....
+
+;!weak(A)
+
+
+Pattern CS25
+
+...O.
+.....
+O.OX.
+..X*.
+.....
+
+:8,sOXd
+
+
+Pattern CS26
+
+?X??        make shape
+.O.?
+...?
+.*..
+?..?
+
+:8,OX,shape(1)
+
+
+####################################
+#
+#  Edge splitting patterns
+#
+####################################
+
+Pattern ES1
+
+....O         attach
+O.X..
+..*.O
+.....
+-----
+
+:8,Xd
+
+
+Pattern ES2
+
+....O         attach
+O*X..
+.XO.O
+.....
+-----
+
+:8,Xd
+
+
+Pattern ES3a
+# gf New pattern. (3.5.3)
+
+..O..
+....X         invade with support from above
+X.*..
+.....
+.....
+-----
+
+:8,OEa
+
+..a..
+....X
+X.*..
+.....
+.....
+-----
+
+;weakness(a)<0.7
+
+
+Pattern ES3b
+# gf New pattern. (3.5.3)
+
+..O..
+....X         invade with support from above
+X.*..
+.....
+.....
+-----
+
+:8,Oea
+
+..a..
+..b.X
+X.*..
+.....
+.....
+-----
+
+;!weak(a) && oplay_connect(*,b,*,a)
+
+
+######################################################################
+#
+# Edge block/expand patterns
+#
+# Moves that expand own position along the edge in some way or stops
+# opponent from expanding his position. This includes monkey jump,
+# various sliding moves, blocks, some extensions along the edge. This
+# category contains very many patterns and may need to be split sooner
+# or later. Some extensions along the edge can be found in the fuseki
+# category. 
+#
+# These patterns are further subdivided into the following classes:
+#
+# Slides
+# Jumping underneath
+# Center expansions
+# Checking extensions
+# Edge expansions
+# Third and fourth line blocks
+# Second line blocks
+# First line blocks
+# Monkey jump and other intrusions on first and second lines
+# Third line push or extend
+# Second line push or extend
+# First line push
+# Third line hane
+# Second line hane
+# First line hane
+# Hane on top
+# Attach
+# Strengthen stones
+# Block intrusion from above
+# Draw back
+# Miscellaneous
+#
+######################################################################
+
+########
+# Slides
+########
+
+Pattern EB4
+
+?X?o.     slide
+...O.
+.*...
+.....
+-----
+
+:8,OXed
+
+?X?o.
+..ac.
+.*b..
+.....
+-----
+
+;!oplay_attack(*,a,b,c)
+
+
+Pattern EB5
+# gf Constraint added. See gunnar:86. (3.7.10)
+
+??..X?            long slide
+oO....
+....*.
+......
+------
+
+:8,OXed
+
+??..X?
+oca...
+..b.*.
+......
+------
+
+;!oplay_disconnect(*,a,b,*,c)
+
+
+Pattern EB6
+
+...??              slide toward opponent's position
+.O..X
+...*.
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB7
+
+?XX..         slide
+OO..X
+...*.
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB8
+# tm added d class (3.1.20)
+
+.X..         slide
+O..X
+..*.
+....
+----
+
+:8,OXed
+
+
+Pattern EB9
+# tm added d class (3.1.20)
+
+.X.??          slide
+...OO
+.*...
+.....
+-----
+
+:8,OXed
+
+
+Pattern EB10
+# tm added d class (3.1.20)
+
+?...X?          large slide
+?O...?
+O...*.
+.....?
+------
+
+:8,OXed
+
+
+Pattern EB11
+
+?.X...          play beneath
+?....O
+..*...
+......
+......
+------
+
+:8,OXed
+
+
+####################
+# Jumping underneath
+####################
+
+
+Pattern EB102
+
+?XX.??     Jump underneath
+oO.*.?
+O....?
+.....?
+------
+
+:8,OXed
+
+
+Pattern EB104
+
+?.X.o  jump under a stone on 4-th row
+.*..o
+....O
+....o
+-----
+
+:8,OXed
+
+
+Pattern EB105
+
+.....        knight's move for defense
+.X...
+..*..
+O....
+.....
+.....
+-----
+
+:8,OXed
+
+
+Pattern EB106
+
+......?        knight's move for defense
+.X.....
+...*...
+.O.....
+.......
+.......
+-------
+
+:8,OXed
+
+
+Pattern EB107
+
+.X..       knight's move to come out
+..*.
+O...
+....
+----
+
+:8,OXead
+
+
+Pattern EB108
+
+.....       jump under
+.*.XO
+...O.
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB109
+
+?.X..       jump under
+O..*.
+O....
+.....
+-----
+
+:8,OXed
+
+
+Pattern EB110
+
+?X?.??       jump under
+O..*.?
+O....?
+o....?
+------
+
+:8,OXed
+
+
+Pattern EB111
+# if EB110 does not defend, this one may
+
+?X?.?       jump under
+O.*oo
+O....
+o....
+-----
+
+:8,OXed
+
+
+Pattern EB112
+
+|oOO?       jump under
+|...X
+|..*?
+|....
+|...?
++----
+
+:8,OXed
+
+
+Pattern EB113
+
+XX..        jump out to defend
+O.*o
+O...
+....
+----
+
+:8,OXe
+
+
+Pattern EB114
+
+??X..?
+O....?
+O..*.?
+.....?
+.....?
+------
+
+:8,OXed
+
+
+###################
+# Center expansions
+###################
+
+
+Pattern EB201
+
+.....   jump when stone on third row is approached
+.*...
+.....
+.O.X.
+.....
+.....
+-----
+
+:8,OXd
+
+
+Pattern EB202
+
+.....         Jump out!
+..*..
+.....
+X.O.X
+.....
+.....
+-----
+
+:8,OXd
+
+
+Pattern EB203
+
+....??          knight's move to come out
+..*.X?
+.....O
+...O..
+......
+------
+
+:8,Oe
+
+
+Pattern EB204
+
+....            match opponent's jump
+X.*.
+....
+X.O.
+....
+....
+----
+
+:8,OE
+
+
+Pattern EB205
+
+.*..               jump into center        
+...X
+.O..
+...O
+....
+----
+
+:8,OXd
+
+
+Pattern EB206
+
+??.??    jump out
+?.*.?
+X...?
+..O.X
+.....
+.....
+-----
+
+:8,OXd
+
+
+Pattern EB207
+
+......?      push up to expand
+.......
+..X*...
+X.XO..X
+XOO....
+.......
+.......
+-------
+
+:8,OXd
+
+
+Pattern EB208
+
+.....         attach
+..X*.
+O....
+..O..
+.....
+.....
+-----
+
+:8,OXd
+
+
+Pattern EB209
+
+ooo......        low approach
+ooo....X.
+ooo..*...
+.........
+.........
+---------
+
+:8,j,shape(-2)
+
+
+Pattern EB210
+
+??????x??         high approach deemed bad
+?????..??
+oo...*.X?
+ooo....xx
+.......??
+........?
+---------
+
+:8,-,shape(-8)
+
+
+Pattern EB211
+
+??????x??         far high approach deemed bad
+?????..??
+oo..*..X?
+ooo....xx
+.......??
+........?
+---------
+
+:8,-,shape(-8)
+
+
+#####################
+# Checking extensions
+#####################
+
+
+Pattern EB301
+
+......    defend to prevent peep
+.O.O..
+.....X
+....*.
+......
+------
+
+:8,OXed
+
+
+Pattern EB302
+
+.O.X      expand shape
+O.*.
+....
+....
+----
+
+:8,OXe
+
+
+Pattern EB303
+
+....xx             jump toward opponent's position
+.O.*.X
+......
+......
+------
+
+:8,OXe
+
+
+Pattern EB304
+
+O....     extend          
+..*.X
+.....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB305
+
+X....      extend
+..*.O
+.....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB306
+# gf Don't attach a weak stone. (3.1.18)
+
+??.?          extend and attach
+X*.O
+....
+....
+----
+
+:8,OXe
+
+??.?
+A*.O
+....
+....
+----
+
+;!weak(A)
+
+
+Pattern EB307
+
+??O?          extend and attach
+X*.O
+....
+....
+----
+
+:8,OXe
+
+
+Pattern EB308
+
+O...          block on third line
+.*.X
+....
+....
+----
+
+:8,OXe
+
+
+Pattern EB309
+
+.O..    diagonal attachment on 3-rd line
+..*X
+....
+....
+----
+
+:8,OXe
+
+
+Pattern EB310
+
+X..O.       expand base
+.*..O
+.....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB311
+
+........        extend
+.O......
+O....*.X
+........
+........
+--------
+
+:8,OXe
+
+
+Pattern EB312
+
+....?
+O....
+..*.X
+.....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB313
+
+?X.O?         double sente kosumi
+?.*.?
+?...?
+-----
+
+:8,OXe
+
+?X.O?
+b.*.a
+?...?
+-----
+
+;omoyo(a) && xmoyo(b)
+
+
+Pattern EB314
+
+?o??            extend towards opponent
+X..O
+.*..
+....
+....
+----
+
+:8,OXe
+
+
+Pattern EB315
+
+O....
+..*.X
+.....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB316
+
+XOO...        prevent opponent's slide
+O..*X.
+......
+......
+------
+
+:8,OXe
+
+
+Pattern EB317
+
+...oo        block extension if X is weak
+X..oo
+X.*.o
+....o
+....o
+-----
+
+:8,OXea
+
+...oo
+A..oo
+A.*.o
+....o
+....o
+-----
+
+;weak(A)
+
+
+#################
+# Edge expansions
+#################
+
+
+Pattern EB401
+
+O...?         jump along edge
+..*.?
+....?
+-----
+
+:8,Oe,jump_out_far_helper
+
+
+Pattern EB402
+
+....x
+O.*.x         jump along edge
+....?
+....?
+-----
+
+:8,Oe,jump_out_far_helper
+
+....a
+O.*.b
+....?
+....?
+-----
+
+; x_alive_somewhere(a,b)
+
+
+Pattern EB403
+
+?..xx         jump along edge
+O...x
+...*.
+.....
+-----
+
+:8,Oe,jump_out_far_helper
+
+?..dx
+Oa..e
+cb.*.
+.....
+-----
+
+;oplay_attack(*,a,b,c,c) && x_alive_somewhere(d,e)
+
+
+Pattern EB404
+
+oO...         jump along edge
+O..*.
+.....
+-----
+
+:8,Oe,jump_out_helper
+
+
+Pattern EB405
+
+OO...         jump along edge
+...*.
+.....
+-----
+
+:8,Oe,jump_out_helper
+
+
+Pattern EB406
+
+??x.?         jump along edge
+OO.*.
+.....
+.....
+-----
+
+:8,Oe,jump_out_helper
+
+
+Pattern EB407
+# gf Added constraint. (3.5.3)
+
+oO....        jump along edge
+O...*.
+......
+------
+
+:8,Oe,jump_out_helper
+
+oa....
+O...*.
+......
+------
+
+;!oplay_disconnect(*,*,a)
+
+
+Pattern EB408
+
+o..?        jump along edge
+O.*.
+....
+----
+
+:8,Oe,jump_out_helper
+
+
+Pattern EB409
+
+o....        jump along edge
+O..*.
+.....
+-----
+
+:8,Oe,jump_out_helper
+
+o....
+O..*.
+.....
+-----
+
+;oarea(*)
+
+
+Pattern EB410
+
+...???           defend cut
+O....?
+XO*..?
+XXO..?
+.....?
+.....?
+------
+
+:8,ad
+
+
+Pattern EB411
+# gf Reduced shape value. (3.5.2)
+
+...??oo
+O....oo
+XO*..oo
+XXO..oo
+.....oo
+.....oo
+-------
+
+:8,ead,shape(3)
+
+...??oo
+O....oo
+XO*..ab
+XXO..cd
+.....oo
+.....oo
+-------
+
+; o_alive_somewhere(a,b,c,d)
+
+
+Pattern EB412
+# db added (3.1.8)
+# gf Added OX classification. (3.3.3)
+
+X???            push along the edge
+OXX.
+.O*.
+....
+----
+
+:8,OXed,shape(3)
+
+
+##############################
+# Third and fourth line blocks
+##############################
+
+
+Pattern EB501
+# gf Reduced shape value. (3.5.2)
+
+....?         hane if attached
+.*X.X
+..O..
+.....
+.....
+-----
+
+:8,ed,shape(3)
+
+
+Pattern EB501a
+# gf Reduced shape value. (3.5.2)
+
+?..X.?         push in to stabilize
+..OX.X
+...O*.
+......
+......
+------
+
+:8,ed,shape(3)
+
+
+Pattern EB502
+
+..O.X.  block if attached
+.*X...
+......
+......
+------
+
+:8,Oe,followup(5)
+
+
+Pattern EB503
+
+..O..X  block if attached
+.*X...
+......
+......
+------
+
+:8,Oe
+
+
+Pattern EB504
+
+?.O.o       block
+xX*.o
+.....
+.....
+-----
+
+:8,Oe
+
+
+Pattern EB505
+
+??.??          hane on the 4-th line
+.*X..
+O.OO.
+?....
+?....
+-----
+
+:8,Oe
+
+
+Pattern EB506
+
+??.??          hane on the 4-th line
+.*X..
+x.OO.
+?....
+?....
+-----
+
+:8,Oe
+
+??.??
+.*B..
+xaOO.
+?....
+?....
+-----
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern EB507
+# tm Reduced shape value from 4 to 3 (3.1.20)
+# gf Removed shape value. (3.3.16)
+
+?o??
+?O..           block
+X*..
+....
+....
+----
+
+:8,Oe
+
+
+Pattern EB507a
+# tm New Pattern (3.1.20) (see strategy:26)
+# gf Reduced shape value. (3.5.2)
+
+?o??
+?O..           block
+X*..
+O...
+....
+----
+
+:8,Oe,shape(3)
+
+
+Pattern EB508
+# gf FIXME: This pattern seems to need more context or a constraint. (3.3.12)
+
+..O.   Block opponent's extension on third line
+....
+.*.X
+...?
+....
+----
+
+:8,OE
+
+
+Pattern EB509
+
+?...         block to prevent incursion
+XO.O
+X*..
+....
+....
+----
+
+:8,Oe
+
+
+Pattern EB510
+
+.O.O       blocking is very large
+X*..
+....
+....
+----
+
+:8,Oe
+
+
+Pattern EB511
+
+.O.?           endgame move
+O.*X
+....
+....
+----
+
+:8,OXe
+
+
+Pattern EB512
+
+..*X         attach to immobilize 1-st line stone
+?O..
+X...
+----
+
+:8,Oe
+
+
+Pattern EB513
+
+......         bend is urgent
+X.X*..
+.XOO..
+......
+......
+------
+
+:8,Oe
+
+
+Pattern EB514
+
+?O.?      connect against peep (third line)
+X*..
+?O.?
+....
+....
+----
+
+:8,ne
+
+
+Pattern EB515
+
+?OO??      jump down and block
+?....
+..*.X
+.....
+.....
+-----
+
+:8,Oe
+
+
+Pattern EB516
+
+o.....o         kosumi block
+O.....o
+.*.X.O.
+.......
+.......
+-------
+
+:8,Oe
+
+
+Pattern EB517
+
+?O.O?               block
+..*XX
+.....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB518
+
+o.o            block
+x*.
+XO.
+X..
+---
+
+:8,OXe
+
+
+Pattern EB519
+
+|...O          block in corner
+|..*.
+|...X
+|....
++----
+
+:8,OXe
+
+
+Pattern EB520
+
+.....           block
+XO...
+.*...
+.....
+.....
+-----
+
+:8,Oe
+
+.....
+XO...
+.*..a
+.....
+.....
+-----
+
+;omoyo(a)
+
+
+Pattern EB521
+# gf FIXED: This fixed value looks dangerous. (3.3.12)
+# gf Removed fixed value and E classification. (3.5.2)
+
+..O?        urgent atari
+..OX
+.*XO
+....
+....
+----
+
+:8,Xd
+
+..O?
+..OX
+.*Xa
+....
+....
+----
+
+; attack(a) && !defend(a)
+
+
+####################
+# Second line blocks
+####################
+
+
+Pattern EB601
+
+?Oo?            block on second line
+XO.?
+.X*o
+...?
+----
+
+:8,OXead
+
+
+Pattern EB602
+
+?Oo?            block on second line
+XO.?
+..*o
+.X.?
+----
+
+:8,OXe
+
+
+Pattern EB603
+
+?.O            block on second line if safe from cut and clamp
+.*X
+?..
+---
+
+:8,OXea
+
+?aO
+b*D
+?c.
+---
+
+;oplay_attack_either(*,a,a,D)
+;&& (oplay_attack(*,b,D) || oplay_attack_either(*,b,c,a,a,D))
+
+
+Pattern EB604
+
+?.O            block on second line if safe from cut
+O*X
+?..
+---
+
+:8,OXe
+
+?aO
+O*X
+?..
+---
+
+;odefend_against(*,a)
+
+
+Pattern EB605
+
+?.O            block on second line if safe from cut
+X*X
+?..
+---
+
+:8,OXe
+
+?.O
+A*X
+?..
+---
+
+;does_attack(*,A)
+
+
+Pattern EB606
+
+?OOO          block on second line
+X*..
+....
+----
+
+:8,OXed
+
+
+Pattern EB608
+
+OO?       block on second row
+.*X
+..?
+---
+
+:8,OXe
+
+
+Pattern EB609
+
+X.O.    Block off the edge
+.X*.
+....
+----
+
+:8,OXe
+
+
+Pattern EB610
+
+O..O?
+O..*X
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB611
+
+OOXX        block on second line
+*X..
+....
+----
+
+:8,OXe
+
+
+Pattern EB612
+
+????
+.O..
+XXO.
+..*.
+....
+----
+
+:8,OXe
+
+???b
+.Oa.
+XXO.
+..*.
+....
+----
+
+;odefend_against(*,a) || omoyo(b)
+
+
+Pattern EB615
+
+.O?            Prevent monkey jump or other incursion
+.*X
+...
+---
+
+:8,OXe
+
+
+Pattern EB615b
+# gf New pattern. (3.3.13)
+
+.O?            Prevent monkey jump or other incursion
+.*X
+...
+---
+
+:8,OXed
+
+.O?
+a*X
+...
+---
+
+;omoyo_opposite(a)
+
+
+Pattern EB616
+
+?o.O?
+?.*.X
+o...X
+-----
+
+:8,OXe
+
+
+Pattern EB617
+# gf Revised pattern. (3.1.9)
+
+oO.?           Prevent monkey jump or other incursion
+o.*X
+....
+----
+
+:8,OXe
+
+
+Pattern EB618
+
+oO.?           Prevent monkey jump or other incursion
+.*.X
+...X
+----
+
+:8,OXe
+
+
+Pattern EB619
+
+oO.?           Prevent monkey jump or other incursion
+..*X
+...X
+----
+
+:8,OXe
+
+oOa?
+..*X
+...X
+----
+
+;oplay_attack(*,a,a)
+
+
+Pattern EB624
+# gf Unified with EB625. (3.3.12)
+
+?O??        block
+?.OX
+.*X.
+....
+----
+
+:8,Oe
+
+?b??
+?.aX
+.*X.
+....
+----
+
+;lib(a)>1 && !oplay_disconnect(*,*,b)
+
+
+Pattern EB626
+
+X?O??      block after attachment
+X.O.?
+..X*.
+.....
+-----
+
+:8,Oe
+
+
+Pattern EB627
+
+?O....        block
+XO.X..
+X*....
+......
+------
+
+:8,Oe
+
+
+Pattern EB628
+
+.O..            prevent incursion
+....
+.*.X
+....
+----
+
+:8,OXe
+
+
+Pattern EB629
+
+..??             don't let the opponent undermine
+.OX?
+.*.X
+....
+----
+
+:8,Oe
+
+
+Pattern EB630
+
+..O.OX         stop incursion
+.*..OX
+..X.X.
+------
+
+:8,Oe
+
+
+Pattern EB631
+
+oO.??         clamp on second
+o..O?
+o*XOX
+o..X.
+-----
+
+:8,Oe
+
+oOb??
+o.ac?
+o*XcX
+o..X.
+-----
+
+;!oplay_attack(*,a,b,c)
+
+
+Pattern EB632
+# gf Revised pattern. (3.3.12)
+
+?oO??          clamp on second
+?O..X
+XOX*.
+.X...
+-----
+
+:8,Oe
+
+?oO??
+?a..X
+XaX*.
+.X...
+-----
+
+;!oplay_disconnect(*,*,a)
+
+
+Pattern EB633
+
+O.O.        seal opponent in
+?O..
+?X*.
+?X..
+----
+
+:8,OXe
+
+
+Pattern EB634
+
+...Oo?   Fend off territory (hopefully)
+....O?
+.....X
+...*.X
+.....x
+------
+
+:8,OXe
+
+
+Pattern EB635
+
+?OOOX?    Stop eye-stealing move         
+X*..OO
+......
+------
+
+:8,Xd
+
+
+Pattern EB637
+
+?o.?         stop intrusion on first line
+.*.O
+..XX
+----
+
+:8,OXe
+
+?od?
+e*cO
+baXX
+----
+
+;!oplay_attack_either(*,a,b,*,b) && oplay_attack_either(*,a,b,c,d,e,a,e)
+
+
+Pattern EB638
+
+?O..Oo       defend eye space
+.X*..o
+......
+------
+
+:8,OXed
+
+?Oa.Oo
+.X*..o
+......
+------
+
+;oplay_attack(*,a,a)
+
+
+Pattern EB639
+
+?OoO        block on edge
+X...
+X.*.
+....
+----
+
+:8,OXead
+
+?OoO
+Xba.
+Xc*.
+....
+----
+
+;oplay_attack(*,a,b,c,a)
+
+
+Pattern EB640a
+
+Ooo        block on edge
+x*.
+X..
+---
+
+:8,OXe
+
+Ooo
+x*.
+Xab
+---
+
+;!oplay_attack_either(*,a,b,*,b)
+
+
+Pattern EB640b
+# db modified (3.3.5)
+
+.Oo        block on edge
+x*.
+X..
+---
+
+:8,OXe,shape(3)
+
+.Oo
+x*.
+Xab
+---
+
+;!oplay_attack_either(*,a,b,*,b)
+
+
+Pattern EB640c
+
+..O        block on edge
+x*.
+X..
+---
+
+:8,OXe
+
+..O
+x*.
+Xab
+---
+
+;!oplay_attack_either(*,a,b,*,b)
+
+
+Pattern EB641a
+
+?Oo?       block on edge
+x.*.
+X...
+----
+
+:8,OXe
+
+
+Pattern EB641b
+
+?.O?       block on edge
+x.*.
+X...
+----
+
+:8,OXe
+
+
+Pattern EB641c
+
+?..O       block on edge
+x.*.
+X...
+----
+
+:8,OXe
+
+
+Pattern EB642
+
+|XOO   
+|X*.
+|...
++---
+
+:8,OXe,reverse_followup(6)
+
+
+Pattern EB643
+# gf New pattern. (3.5.3)
+# See gifu03:506.
+
+?.O       block on edge
+O*.
+X..
+---
+
+:8,OXe
+
+
+###################
+# First line blocks
+###################
+
+
+Pattern EB701
+
+|.OX        Descending in the corner for profit and eyespace
+|.OX
+|.*.
++---
+
+:8,OXe
+
+
+Pattern EB702a
+# tm modified (3.1.20) (see endgame:102)
+
+??o???           prevent incursion
+?XO.??
+..X*.?
+------
+
+:8,OXe,reverse_followup(6)
+
+??o???
+?Xab??
+.cX*.?
+------
+
+;lib(a)>2
+;|| !oplay_attack_either(*,b,c,*,a)
+
+
+Pattern EB702b
+
+??o??|           prevent incursion
+?XO.?|
+..X*.|
+-----+
+
+:8,OXe,reverse_followup(2.5)
+
+??o??|
+?Xa.?|
+..X*.|
+-----+
+
+;lib(a)>2
+
+
+Pattern EB703
+# gf Added O classification. (3.1.32)
+
+?O?         block on edge
+O.O
+X*.
+---
+
+:8,OXe
+
+
+Pattern EB704
+
+?oO           block on edge. Sometimes better to fall back...
+XO.
+.X*
+---
+
+:8,OXe
+
+
+Pattern EB705
+# FIXME: (see trevorc:1040)
+
+?????
+?O...        prevent incursion
+X*...
+-----
+
+:8,OXe
+
+?????
+?b...
+X*a..
+-----
+
+;xplay_attack(*,a,a) || weak(b)
+
+
+Pattern EB706
+
+??Oo???        prevent incursion with sente
+..XO...
+..X*...
+-------
+
+:8,OXe
+
+??Oo???
+..AO...
+..A*...
+-------
+
+;oplay_attack(*,A)
+
+
+Pattern EB707
+
+|..?        prevent incursion with sente
+|..?
+|XXO
+|*Oo
+|..?
+|..?
++---
+
+:8,OXe,followup(8)
+
+|..?
+|..?
+|AAO
+|*Oo
+|..?
+|..?
++---
+
+;oplay_attack(*,A)
+
+
+Pattern EB708
+
+O?       seal off at edge
+.O
+*X
+--
+
+:8,OXe
+
+
+Pattern EB709
+
+|.XO    extending in the corner is huge: double sente
+|*O.
+|...
++---
+
+:8,OXe,reverse_followup(3)
+
+
+Pattern EB709b
+# gf New pattern. (3.1.14)
+
+|*XO    if this move can't be captured and O is already alive, we prefer
+|.O.    hane to the descent
+|...
++---
+
+:8,OXe,reverse_followup(3)
+
+
+Pattern EB710
+# gf Removed fixed value. (3.5.2)
+
+o.OOX?              block
+.*XX.X
+------
+
+:8,OXe
+
+
+Pattern EB711
+
+o.OO              block
+.*XX
+----
+
+:8,OXe,followup(4)
+
+o.bb
+.*AA
+----
+
+;oplay_attack(*,A) && !oplay_attack(*,b)
+
+
+Pattern EB712
+# Probably bigger reverse followup in reality
+# tm Modified (3.1.17)
+# tm Modified (3.1.20)
+
+?O..          block
+XO..
+X*..
+----
+
+:8,OXe,reverse_followup(6)
+
+?O..
+XOb.
+X*a.
+----
+
+; !xplay_attack_either(*,a,b,*,b)
+
+
+Pattern EB712b
+# gf New pattern. (3.7.10)
+# Probably bigger reverse followup in reality
+# See trevora:340 and trevorb:370.
+
+?*O..          block on top
+OXO..
+.X...
+-----
+
+:8,Xe,reverse_followup(6)
+
+?*d..
+eXdb.
+.Xca.
+-----
+
+;alive(d) && !xplay_attack_either(c,a,b,c,b) && oplay_attack(*,c,c)
+;&& !oplay_connect(c,*,d,e)
+
+
+Pattern EB713
+# tm modified (3.1.17)
+# FIXME: (see trevorc:1040)
+
+?O..          block
+X*..
+----
+
+:8,OXe,reverse_followup(3)
+
+?Ob.
+X*a.
+----
+
+;!xplay_attack_either(*,a,b,*,b)
+
+
+Pattern EB714
+
+XO.X
+.X*.
+----
+
+:8,B
+
+XO.A
+.X*.
+----
+
+;oplay_attack(*,A)
+
+
+Pattern EB715
+# ab added (3.1.14)
+
+O.*      jump if blocking is impossible
+X..
+---
+
+:8,OXe
+
+ac*
+Xbd
+---
+
+;!oplay_defend_both(b,c,a,b) && !oplay_defend_both(c,b,d,*,c,d)
+
+
+Pattern EB716
+# ab added (3.1.14)
+
+O*.     pull back if blocking is impossible
+X..
+---
+
+:8,OXe
+
+a*c
+Xbd
+---
+
+;!oplay_defend_both(b,*,a,b) && oplay_defend_both(*,b,d,c,a,d)
+
+
+Pattern EB717
+# tm New Pattern (3.1.18)
+# gf FIXME: lib(A)==2 is always true in this pattern. (3.1.23)
+
+?OO..        prevent incursion
+.XX*.
+-----
+
+:8,sOXe
+
+?OB..
+.AA*.
+-----
+
+; lib(A) == 2
+; && !oplay_attack_either(*,B,*)
+
+
+Pattern EB718
+# tm New Pattern (3.1.20)
+# compare to EB715 - slightly different.
+
+O.*    jump back to block
+X..
+---
+
+:8,OXe
+
+ac*
+Xb.
+---
+
+;!oplay_defend_both(b,c,a,b) && oplay_defend_both(*,c,a,*)
+
+
+Pattern EB719
+# gf New pattern. (3.5.3)
+# Inexact followup but usually big.
+
+.XXO             block
+XOO*
+----
+
+:8,Xe,followup(6)
+
+aBBd
+Cee*
+----
+
+;alive(d) && critical(e) && !oplay_defend_both(*,?,a,B,C)
+
+
+############################################################
+# Monkey jump and other intrusions on first and second lines
+############################################################
+
+
+Pattern EB801
+# Not to first line.
+
+O.X.?    jump under on second line
+.O.*?
+....?
+-----
+
+:8,Oe
+
+
+Pattern EB802
+# gf Revised pattern and constraint. (3.3.12)
+
+??xxxx    monkey jump
+?O....
+o...*.
+------
+
+:8,OXe
+
+bcEFGx
+da....
+o...*.
+------
+
+;!weak(a) && o_alive_somewhere(b,c,d) && x_alive_somewhere(E,F,G)
+;&& !oplay_disconnect(*,*,a)
+
+
+Pattern EB803
+
+?xX..       inverse monkey jump
+O..*.
+O....
+-----
+
+:8,OXe
+
+
+Pattern EB804
+
+?Xx..       inverse monkey jump
+O..*.
+O....
+-----
+
+:8,OXe
+
+
+Pattern EB805
+
+??X.?       jump up
+O..*.
+oO...
+-----
+
+:8,OXe
+
+
+Pattern EB806
+
+??X..?       jump up
+O...*.
+oO....
+------
+
+:8,OXe
+
+
+Pattern EB808
+# tm added defend_against_atari
+
+?xxx?       jump out on first line
+OX..?
+.O.*.
+-----
+
+:8,OXe
+
+?xxx?
+aX..?
+bC.*.
+-----
+
+;!weak(a) && oplay_attack(*,b,b)
+
+>defend_against_atari(C)
+
+
+###########################
+# Third line push or extend
+###########################
+
+
+Pattern EB909
+
+?????X.?          defense is becoming urgent
+.X.O..*.
+.....O..
+........
+--------
+
+:8,d
+
+
+Pattern EB910
+
+?.X..    follow up the slide with diagonal move (another slide could be broken)
+x*..O
+..O..
+?....
+-----
+
+:8,Oe
+
+
+Pattern EB911
+
+X.XX..             extend to 3 since B hane would be severe.
+.*O..O
+...O..
+......
+------
+
+:8,Oe
+
+
+Pattern EB912
+
+?XX?               extend to defend slide
+..O*
+O...
+....
+----
+
+:8,Oe
+
+
+Pattern EB913
+# gf Unified with EB916. (3.3.12)
+
+??X.           don't let opponent block
+?O*.
+o...
+....
+----
+
+:8,OXe
+
+
+Pattern EB913b
+
+??X.           don't let opponent block
+?O*.
+....
+....
+----
+
+:8,Xd
+
+
+Pattern EB914
+# gf Removed fixed value. (3.5.2)
+
+?O??X.           an exception to the preceeding pattern
+*XOO..
+......
+......
+------
+
+:8,d
+
+?O??X.
+*AOOa.
+......
+......
+------
+
+; does_attack(*,A) && oplay_defend(a,A)
+
+> antisuji(a);
+
+
+Pattern EB915
+# gf Removed fixed value. (3.5.2)
+
+?O??X.           exception, continued
+OXOO..
+*X....
+......
+------
+
+:8,d
+
+?O??X.
+OAOOa.
+*X....
+......
+------
+
+; does_attack(*,A) && oplay_defend(a,A)
+
+> antisuji(a);
+
+
+Pattern EB917
+
+??X..??         leap out
+?OX.*..
+OoO....
+.......
+-------
+
+:8,Oe
+
+
+Pattern EB918
+
+..XX        atari to expand
+*XOO
+.O..
+....
+----
+
+:8,Oe,followup(6)
+
+..XX
+*AOO
+.O..
+....
+----
+
+;!attack(A)
+
+
+Pattern EB919
+
+..XX?           extend along the edge
+.*OX?
+...OO
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB920
+
+????..?         Two space extension
+.....O?
+.*..OXO
+......O
+.......
+-------
+
+:8,Oe
+
+
+Pattern EB921
+
+|oooX??       take corner
+|..*.X?
+|....OO
+|......
++------
+
+:8,e
+
+
+Pattern EB922
+
+??Xx?         override solid connection
+XXO*.
+OO...
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB923
+
+XO?          separate!
+.*X
+...
+...
+---
+
+:8,Oe
+
+
+Pattern EB924
+
+....         extend on third line
+O.*.
+....
+....
+----
+
+:8,Oe
+
+....
+O.*a
+....
+....
+----
+
+;!omoyo(a)
+
+
+Pattern EB924a
+
+XX...x         extend on third line
+O.O.*.
+......
+......
+------
+
+:8,O,shape(-3)
+
+
+Pattern EB924b
+
+XX...x         extend on third line
+O.O...
+....*.
+......
+------
+
+:8,O,shape(-3)
+
+
+Pattern EB925
+# gf Removed fixed value and E classification, revised constraint. (3.5.2)
+
+XX...x         extend on third line
+O.O*.x
+......
+......
+------
+
+:8,d,shape(3)
+
+XX...x
+a.O*.x
+......
+......
+------
+
+; !dead(a) && !oplay_disconnect(*,a,*)
+
+
+############################
+# Second line push or extend
+############################
+
+
+Pattern EB1001
+
+.X.O    extend to undermine opponent
+*O..
+....
+----
+
+:8,OXe
+
+
+Pattern EB1003
+
+XX..              move out on second line
+OO*.
+....
+----
+
+:8,OXe
+
+
+Pattern EB1004
+# We should climb to third line if safe. Need helper.
+# see EB1005
+
+??.XX              push out
+?.*OO
+?....
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB1005
+
+??o??              hane
+?o*XX
+?..OO
+?....
+.....
+-----
+
+:8,OXe
+
+??o??
+?o*XX
+?.aOO
+?....
+.....
+-----
+
+;odefend_against(*,a)
+
+
+Pattern EB1006
+
+?..X?              push once
+.XXOO
+.*O..
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB1007
+
+X..     overrides 113
+O*.
+...
+---
+
+:8,OXe
+
+
+Pattern EB1008
+
+..X.      Double sente, do it early!
+.O*.
+....
+----
+
+:8,OXe
+
+
+Pattern EB1008b
+# gf Added n classification. See gifu03:105. (3.5.3)
+
+?..X.      Double sente, do it early!
+x.O*.
+.....
+-----
+
+:8,OXn,reverse_followup(2)
+
+
+Pattern EB1008c
+# gf Added n classification. See gifu03:105. (3.5.3)
+
+?..X.      Double sente, do it early!
+x.O*.
+.....
+-----
+
+:8,OXn,reverse_followup(5)
+
+?..X.
+x.a*.
+.....
+-----
+
+;xplay_attack(*,a)
+
+
+Pattern EB1009
+
+OX.           magari on second line
+O*.
+...
+---
+
+:8,OXe
+
+
+Pattern EB1011
+
+?XX.??          reverse sente extend
+OOX...
+..O*..
+......
+------
+
+:8,OXe
+
+
+Pattern EB1012
+
+X.?X          extend on second line
+O*.?
+....
+----
+
+:8,OXe
+
+
+Pattern EB1013
+
+X.??          extend on second line
+O*.X
+....
+----
+
+:8,OXe
+
+
+Pattern EB1014
+
+X.X          extend on second line
+O*.
+...
+---
+
+:8,OXe
+
+
+Pattern EB1015
+
+?OXX         Reverse sente push
+..O*
+....
+----
+
+:8,OXe
+
+
+Pattern EB1016
+
+?OX..          extend on second line -- reverse sente
+OXO*.
+.....
+-----
+
+:8,Oe
+
+?OA..
+aXO*.
+.....
+-----
+
+;!attack(a) && !dead(A)
+
+
+Pattern EB1017
+
+X...         double sente push
+..XX
+O.O*
+o...
+----
+
+:8,Oe
+
+
+Pattern EB1018
+
+??O.X.      undermine the opponent and threaten two eyes
+XOoO*.
+oooo..
+------
+
+:8,OXed
+
+
+Pattern EB1019
+
+.XxoO?          make eye and undermine opponent
+.*O.OX
+...OXX
+------
+
+:8,OXed
+
+
+Pattern EB1020
+
+|....     Double sente, do it early!
+|.O.X
+|.*X.
+|....
+|....
++----
+
+:8,OXe
+
+
+Pattern EB1021
+
+?XX.            push to get one eye
+OO*.
+O...
+----
+
+:8,OXed
+
+
+Pattern EB1022
+# db New pattern (3.1.28)
+
+?Xxx??         simply extend to avoid bad aji
+oOX.x?
+o.O*..
+......
+------
+
+:8,O,shape(2)
+
+?Xxd??
+ocX.e?
+obO*a.
+......
+------
+
+; oplay_attack(a,b,*,c) || x_alive_somewhere(d,e)
+> replace(a,*)
+
+
+#################
+# First line push
+#################
+
+
+Pattern EB1101
+
+?x??       big push in sente
+?X..
+O*..
+----
+
+:8,OXe
+
+?x??
+?X.a
+O*..
+----
+
+;xmoyo(a)
+
+
+#################
+# Third line hane
+#################
+
+
+Pattern EB1201
+
+?XO?..       hane underneath
+.*.O..
+......
+......
+------
+
+:8,OXe
+
+
+Pattern EB1202
+# gf Removed fixed value. (3.5.2)
+
+?...?       hane
+O.X*.
+..O.?
+....?
+-----
+
+:8,OXeCad
+
+
+Pattern EB1203
+# gf Added constraint. (3.3.12)
+# gf Removed fixed value. (3.5.2)
+
+?..X.       extend to defend and connect
+O.XO*
+..O..
+.....
+-----
+
+:8,OXeCad
+
+?..X.
+a.XO*
+..O..
+.....
+-----
+
+;!oplay_disconnect(*,*,a)
+
+
+##################
+# Second line hane
+##################
+
+
+Pattern EB1301
+
+..XX              hane underneath
+.XOO
+.*..
+....
+----
+
+:8,OXe
+
+
+Pattern EB1302
+
+XOX              hane on second line
+O.*
+...
+---
+
+:8,OXe
+
+XaX
+O.*
+...
+---
+
+;lib(a)>1
+
+
+Pattern EB1303
+
+?XX?              block
+.XO?
+.*.O
+....
+----
+
+:8,OXe
+
+
+Pattern EB1304
+
+..XX.     hane
+O..OX
+..O.*
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB1305
+
+?.XX..    hane on second line
+.XO..O
+.*.O..
+......
+------
+
+:8,OXe
+
+
+Pattern EB1306
+
+?XO?           hane to claim space on second line
+.*.O
+....
+----
+
+:8,OXe
+
+
+Pattern EB1307
+# gf Removed shape bonus. (3.3.18)
+
+?..??         hane to undermine the opponent
+..XOo
+..*.o
+....o
+-----
+
+:8,OXead
+
+?..??
+..Xao
+..*.o
+....o
+-----
+
+; lib(a)>2
+
+
+Pattern EB1308
+
+?....
+?....
+OX...
+OX...
+.*...
+.....
+-----
+
+:8,OXed
+
+
+Pattern EB1309
+# gf Reduced shape value. (3.5.2)
+
+??.o???        urgent hane
+?.XO..O
+..*....
+.......
+-------
+
+:8,-,shape(3)
+
+
+Pattern EB1310
+# gf Removed fixed value. (3.5.2)
+
+?..X?         after hane opponent must fall back
+..XOO
+..*.o
+....o
+-----
+
+:8,OXead
+
+?.cX?
+.bXOO
+da*eo
+.f..o
+-----
+
+; !oplay_defend(*,a,b,c,d,e,f,f)
+
+
+Pattern EB1311
+# gf Removed fixed value. (3.5.2)
+
+?..X?         double sente
+.XXOO
+.*O.o
+....o
+-----
+
+:8,OXead
+
+
+#################
+# First line hane
+#################
+
+
+Pattern EB1401
+# gf Removed fixed value. (3.5.2)
+
+|.XO?          large endgame move
+|.XO?
+|.*.o
++----
+
+:8,OXe
+
+
+Pattern EB1402
+
+?.X??          hane
+..XO?
+x.*.o
+-----
+
+:8,OXe
+
+
+Pattern EB1403
+# gf Revised pattern. (3.1.3)
+# gf Revised constraint. (3.3.13)
+# ab Removed followup value (handled by influence code). (3.3.20)
+
+?oX??          sente hane
+..XO?
+?.*.o
+-----
+
+:8,Xe
+
+?oX??
+b.Xa?
+?.*..
+-----
+
+;alive(a) && xmoyo(b)
+
+
+Pattern EB1404a
+# Followup to previous pattern.
+#
+# No need to check for sente. If we found the hane to be worth
+# playing, we should continue with the tsugi too. (Unless we can
+# follow up with a ko or nakade pattern or something similar, but
+# those should have higher values.)
+#
+# In practice this pattern doesn't always kick in at a high enough
+# value to guarantee that EB1403 will be followed up.
+#
+# gf Revised pattern. (3.1.3)
+# eb revised constraint (3.3.13)
+# see nngs3:1110
+# ab FIXME: Is this still necessary?
+
+?oX??          Connect after hane.
+..XO?
+?XO*o
+-----
+
+:8,Xe,followup_value(8)
+
+?oX??
+..Xa?
+?BO*o
+-----
+
+;!dead(a) && !attack(B)
+
+
+Pattern EB1404c
+#cut followup to sente hane
+#evand new pattern (3.3.13)
+# gf Fixed value removed. (3.5.2)
+
+?oX??
+.*XO?
+?XO.o
+-----
+
+:8,Xe
+
+?oX??
+c*Xa?
+?BO.o
+-----
+
+;!dead(a) && xmoyo(c) && !oplay_defend(*,B) && !oplay_attack_either(*,*,a)
+
+
+Pattern EB1405
+
+?..X?          sente hane
+..XO?
+?.*.o
+-----
+
+:8,OXe,followup_value(8)
+
+?..X?
+ecDO?
+?a*bo
+-----
+
+;xmoyo(e) && !oplay_defend_both(*,a,b,?,c,a,D) && !oplay_attack(*,a,b,c,*)
+
+
+#############
+# Hane on top
+#############
+
+
+Pattern EB1501
+
+??oo?           Hane atop opponent's attachment on third line
+..*..
+..XO.
+.....
+.....
+-----
+
+:8,OXEad
+
+
+Pattern EB1502
+
+?oooo??                hane is urgent
+ooo*.??
+o.OX.o?
+o.OX.o?
+o....??
+o....??
+-------
+
+:8,OXead
+
+
+Pattern EB1503
+
+...?          extend instead of hane
+x*..
+.OX.
+.OX.
+....
+....
+----
+
+:8,OXed
+
+
+########
+# Attach
+########
+
+
+Pattern EB1601
+
+......     attach underneath
+.X.O.O
+.*....
+......
+------
+
+:8,OXe
+
+
+Pattern EB1603
+
+?...?    top attachment
+.O.*.
+...X.
+.....
+.....
+-----
+
+:8,OXE
+
+
+Pattern EB1604
+# The attachment is beneficial even if captured except
+#          in the case where the opponent pushes below leading
+#          leading to a complicated fight. If this happens
+#  O3X     it is unclear who will come out better. (O can
+#  421     retaliate in various ways depending on surroundings
+#  ...     and fighting strength.) Attaching is preferred
+#  ---     to EB313 if it works.
+# 
+# The final position could be:
+#
+#      O
+#    OOXX
+#    OX.X
+#    ..X.
+#    ----
+#
+#    or:
+#
+#      O
+#    OOXO
+#    .XXX
+#    ..X.
+#    ----
+#
+#   It can backfire if X pushes below. That is not always possible.
+
+????.?      attach on second line
+?....?
+oO.X.o
+o..*.?
+.....?
+------
+
+:8,OXe
+
+????.?
+?....?
+oO.A.o
+o..*.?
+.....?
+------
+
+;!weak(A)
+
+
+Pattern EB1605
+
+????.?      attach on second line in sente
+?....?
+oO.X.o
+o..*.?
+.....?
+------
+
+:8,OXe,followup(5)
+
+????.?
+?....?
+oO.Dco
+o.b*a?
+.....?
+------
+
+;!weak(D) && !oplay_attack(*,a,b,?,c,c)
+
+
+Pattern EB1606
+# Explicit followup.
+
+???.?      attach on second line
+....?
+O.X.o
+.*OX?
+....?
+-----
+
+:8,e
+
+
+Pattern EB1606b
+# Explicit followup.
+
+???.?      threat to cut
+....?
+O.X.o
+.*OX?
+....?
+-----
+
+:8,-,followup(8)
+
+???.?
+....?
+O.Xao
+.*OX?
+....?
+-----
+
+;!oplay_attack(*,?,a,a)
+
+
+Pattern EB1607
+
+X...         attach to expand
+..X.
+O.*.
+....
+----
+
+:8,OXe
+
+
+Pattern EB1608
+
+O..X.       attach below
+oO.*.
+o....
+-----
+
+:8,OXe
+
+
+Pattern EB1609
+
+..x..          attach to connect
+.....
+O.X.O
+..*..
+.....
+-----
+
+:|,OXcad
+
+..x..
+.....
+O.X.O
+.a*b.
+.....
+-----
+
+>antisuji(a);
+>antisuji(b);
+
+
+Pattern EB1610
+# gf Reduced shape value. (3.5.2)
+
+..x..          followup
+.....
+O*X.O
+.XO..
+.....
+-----
+
+:8,cad,shape(3)
+
+
+Pattern EB1611
+# gf Reduced shape value. (3.5.2)
+
+..x..          followup
+..*..
+OOX.O
+.XOX.
+.....
+-----
+
+:8,cad,shape(3)
+
+
+###################
+# Strengthen stones
+###################
+
+
+Pattern EB1701
+
+.*X?     strengthen stone to prevent undermining hane
+.OX.
+....
+....
+----
+
+:8,OXd
+
+
+Pattern EB1702
+
+.*.X    jump up when kicked
+.OX.
+....
+....
+----
+
+:8,OXd,shape(3)
+
+
+Pattern EB1702b
+# gf New pattern. (3.1.17)
+
+...*.X    jump up when kicked
+...OX.
+......
+......
+------
+
+:8,OXa,reverse_followup(8)
+
+
+Pattern EB1703
+
+O.*X    Strengthen stone on second line
+..OX
+....
+----
+
+:8,OXed
+
+
+Pattern EB1704
+
+?*.?          Stand on third line
+XO.?
+...?
+----
+
+:8,nOXed
+
+
+Pattern EB1705
+
+??o?         Stand to defend connection
+O.*X
+..OX
+....
+----
+
+:8,OXed
+
+
+Pattern EB1706
+
+??X?         Draw back to defend connection
+O*.X
+..OX
+....
+----
+
+:8,OXed
+
+
+Pattern EB1707
+
+..??         stand after attachment
+.*..
+.OXX
+....
+....
+----
+
+:8,OXed
+
+
+Pattern EB1708
+# If we are strong we prefer to connect solidly
+
+?.O?          Defend after hanetsugi
+*.OX
+.OXX
+----
+
+:8,OXe
+
+?.O?
+*acX
+bOXX
+----
+
+;xcut(a) || xplay_attack(a,b,c)
+
+
+Pattern EB1709
+
+X*.O?          make eye and reach for center
+xO.OX
+..OXX
+-----
+
+:8,OXd
+
+
+Pattern EB1710
+# Sometimes better to hane. But under which constraints?
+
+.....?         contact instability
+..X..?
+..O*.?
+.....?
+.....?
+------
+
+:8,OXed
+
+
+Pattern EB1711
+# gf Shape bonus reduced. (3.1.12)
+
+.O.X    prevent slide
+.*X.
+....
+....
+----
+
+:8,OXead,shape(1)
+
+
+#############################
+# Block intrusion from above
+#############################
+
+
+Pattern EB1801
+
+..*..     connect
+O...O
+.....
+-----
+
+:8,Oe
+
+..*..
+O...O
+.....
+-----
+
+;!omoyo(*)
+
+
+Pattern EB1802
+
+..X..     connect
+O.*.O
+.....
+-----
+
+:8,OXec
+
+
+Pattern EB1803
+
+o..Xx              defend!
+O.*..
+....O
+.....
+.....
+-----
+
+:8,OXec
+
+
+Pattern EB1804
+
+??.??              defend!
+O.*..
+....O
+.....
+.....
+-----
+
+:8,Oec
+
+??.??
+O.*..
+....O
+.....
+.....
+-----
+
+;!omoyo(*)
+
+
+Pattern EB1805
+
+??.??              defend!
+O.*.O
+.....
+.....
+.....
+-----
+
+:8,Oec
+
+??.??
+O.*.O
+.....
+.....
+.....
+-----
+
+;!omoyo(*)
+
+
+Pattern EB1806
+
+?.X.??         block intrusion into wide extension
+......
+O.*..O
+......
+......
+------
+
+:8,OXec
+
+
+Pattern EB1807
+
+?XO            don't accept position being split
+O*.
+...
+...
+---
+
+:8,OXec
+
+
+Pattern EB1808
+# evand added shape value -0.5 (3.5.4)
+
+??.??              defend!
+O.*.O
+.....
+.....
+-----
+
+:8,OXec,shape(-0.5)
+
+??.??
+O.*.O
+.....
+.....
+-----
+
+;!omoyo(*)
+
+
+Pattern EB1808a
+
+??.??              defend!
+O...O
+..*..
+.....
+-----
+
+:8,OXec
+
+??.??
+O...O
+..*..
+.....
+-----
+
+;!omoyo(*)
+
+
+Pattern EB1809
+
+..X..              secure fourth line territory
+o.O*o
+o....
+.....
+.....
+-----
+
+:8,OXe
+
+..X..
+o.O*o
+o....
+..a..
+.....
+-----
+
+;safe_xmove(*) && oterri(a)
+
+
+Pattern EB1810
+
+?X?     block below
+OXO
+.*.
+...
+---
+
+:|,OXeC
+
+?X?
+bXa
+.*.
+...
+---
+
+;!oplay_break_through(*,a,*,b)
+
+
+###########
+# Draw back
+###########
+
+
+Pattern EB1901
+
+?X??           draw back
+XO.O
+XO*.
+?X?.
+----
+
+:8,OXe
+
+
+Pattern EB1902
+
+.O*.         draw back if opponent plays below
+XX..
+....
+----
+
+:8,OXe
+
+.O*.
+XXa.
+....
+----
+
+;!odefend_against(a,*)
+
+
+Pattern EB1903
+
+....           draw back
+.*OX
+..X.
+....
+----
+
+:8,OXed
+
+
+Pattern EB1904
+
+.....           draw back
+..*OO
+...XX
+.....
+-----
+
+:8,OXe
+
+
+Pattern EB1905
+
+oo.O??           draw back
+o.*OX?
+o..X.X
+------
+
+:8,OXe
+
+oo.c??
+o.*cX?
+o.aXbX
+------
+
+;xplay_attack_either(b,a,a,c)
+
+>antisuji(a);
+
+
+Pattern EB1906
+
+O...              draw back if clamp is impossible
+.*O.
+.XOX
+..Xx
+----
+
+:8,OXe
+
+Oab.
+.*O.
+.XOX
+..Xx
+----
+
+;!xplay_attack(*,a,b,b)
+
+
+###############
+# Miscellaneous
+###############
+
+
+Pattern EB2001
+
+X...          space odyssey
+.*X.
+O.OX
+o...
+----
+
+:8,OXed
+
+
+Pattern EB2002
+# gf Reduced shape value. (3.5.2)
+
+?.....         don't jump if the edge is open
+.*....
+......
+O.....
+......
+......
+......
+------
+
+:8,-,shape(-3)
+
+
+Pattern EB2003
+# With a sufficiently strong position directly to the right of the
+#    diagram, this may be a good move to build a moyo.
+# gf Reduced shape value. (3.5.2)
+
+?......         don't jump if the edge is open
+.*.....
+?......
+?O.....
+?......
+?......
+?......
+-------
+
+:8,-,shape(-3)
+
+
+######################################################################
+#
+# Center block/expand patterns
+#
+# Moves that expand own position in the center in some way or stops
+# opponent from expanding his position. This includes moves like
+# block, bend, hane, and various extensions into empty space or
+# opponent's area. This category contains very many patterns and may
+# need to be split sooner or later.
+#
+######################################################################
+
+
+#################################################
+# safe jump out patterns, cannot (usually) be cut
+#################################################
+
+
+Pattern CB1
+# gf Removed d classification (pattern too general). (3.3.13)
+
+????????           jump into empty space
+.......?
+.O.O.*.?
+.......?
+????????
+
+:-,OE,jump_out_helper
+
+
+Pattern CB2
+# gf Removed d classification (pattern too general). (3.3.13)
+
+??????             jump into empty space
+?....x
+?.*.OO
+?....x
+??????
+
+:8,OE,jump_out_helper
+
+
+Pattern CB3
+
+?.OO.        extend
+?....
+?....
+?.*..
+?....
+?????
+
+:8,OEd,jump_out_helper
+
+
+Pattern CB4
+# gf Removed d classification (pattern too general). (3.3.13)
+
+?????          Jump out if starting to get surrounded
+?...?
+?.*.?
+?...?
+?.OO?
+
+:8,Oe,jump_out_helper
+
+
+Pattern CB5
+# gf Removed d classification (pattern too general). (3.3.13)
+
+?????          jump out
+?...O
+?.*.O
+??..?
+?????
+
+:8,Oe,jump_out_helper
+
+
+Pattern CB6
+# gf Removed d classification (pattern too general). (3.3.13)
+
+??????         jump out
+?...Oo
+?.*..o
+??..Oo
+??????
+
+:8,Oe,jump_out_helper
+
+
+Pattern CB7
+
+???.o?          jump out
+?....O
+?.*..O
+??...?
+??????
+
+:8,OEd,jump_out_helper
+
+
+Pattern CB8
+
+???.???         jump out
+?....Oo
+?.*...o
+??...Oo
+???????
+
+:8,OEd,jump_out_helper
+
+
+Pattern CB9
+
+??O..O
+?....O
+?.*...
+??.???
+??????
+
+:8,OEd,jump_out_helper
+
+
+Pattern CB10
+
+OoOo?            jump out!
+...??
+....?
+O.*.?
+??.??
+?????
+
+:8,OEd,jump_out_helper
+
+
+Pattern CB12
+
+....           atari to break X connection
+.*XO
+X.O.
+
+:8,OXeBad,shape(2)
+
+..a.
+.*XO
+XbOc
+
+; oplay_attack(*,a,b,c,c)
+
+
+Pattern CB13
+
+????          jump out to reduce and possibly expand
+x..O
+.*.O
+x..o
+????
+
+:8,Oe,jump_out_helper
+
+
+Pattern CB14
+
+?o??        attach
+...O
+.*..
+.X.O
+...?
+
+:8,OXEd,shape(2)
+
+?o??
+..bO
+.*ac
+.XdO
+...?
+
+; oplay_attack(*,a,b,c,a) || oplay_attack(*,a,d,b,a)
+
+
+Pattern CB14a
+
+?o??        followup
+...O
+.OX.
+.X*O
+...?
+
+:8,OXed,shape(3)
+
+?o??
+..aO
+.OX.
+.X*O
+...?
+
+; oplay_attack(*,a,a)
+
+
+Pattern CB14b
+
+?o??        followup
+..*O
+.OX.
+.X.O
+...?
+
+:8,OXed,shape(2)
+
+?o??
+..*O
+.OXa
+.X.O
+...?
+
+; oplay_attack(*,a,a)
+
+
+Pattern CB15
+
+.xO.       prevent push in
+xx*.
+xXO.
+xxXO
+
+:8,Oed,shape(2)
+
+.bO.
+ac*.
+xXO.
+xxXO
+
+; x_alive_somewhere(a,b,c)
+
+
+######################################
+# unsafe jump out patterns, can be cut
+######################################
+
+Pattern CB101
+
+O.....?          extend
+?...*.?
+?.....?
+???????
+
+:8,OE,shape(-1),jump_out_far_helper
+
+
+Pattern CB103
+
+O....?    extend
+?..*.?
+?....?
+??????
+
+:8,OE,shape(-3),jump_out_far_helper
+
+
+Pattern CB104
+
+???O???           extend
+??...??
+??...??
+??.*.??
+??...??
+???????
+
+:|,OE,shape(-3),jump_out_far_helper
+
+
+Pattern CB105
+
+O...?     extend
+?.*.?
+?...?
+?????
+
+:8,OE,jump_out_far_helper
+
+
+Pattern CB105b
+# gf New pattern, see 9x9:540. (3.7.8)
+
+?O...?     extend
+?..*.?
+?....?
+??????
+
+:8,OE
+
+?O...?
+?..*.?
+?a...?
+??????
+
+;xarea(*) && oarea(a)
+
+
+Pattern CB106
+
+???O???            extend
+??...??
+??.*.??
+??...??
+???????
+
+:|,OE,shape(2),jump_out_far_helper
+
+
+########################
+# Connect attacked keima
+########################
+
+Pattern CB207
+# gf Merge with CB208. (3.1.23)
+
+??x      threaten connection
+O*.
+.XO
+
+:8,nOXea,shape(2)
+
+??x
+O*.
+.ba
+
+;(lib(a)>1) && (!attack(b) || defend(b))
+
+
+Pattern CB209
+
+??O      connect
+O*.
+.XO
+
+:8,nOXe
+
+??a
+O*.
+.Xb
+
+;lib(a)>1 && lib(b)>1
+
+
+Pattern CB210
+
+??.?      connect
+O*.O
+?XO?
+
+:8,nOXea
+
+??.?
+O*.O
+?Xa?
+
+;lib(a)>1
+
+
+Pattern CB217
+
+?.O               block
+.*X
+?OX
+
+:8,OXecd
+
+?.a
+.*X
+?OX
+
+;lib(a)>1
+
+
+Pattern CB217a
+
+?.O           block attacking
+.*X
+?OX
+
+:8,a
+
+?.O
+.*A
+?OA
+
+; owl_threatens(*,A)
+
+
+Pattern CB277
+
+.*O           connect or threaten to connect
+OX?
+
+:8,nOXed
+
+.*O
+aX?
+
+;lib(a)>1
+
+
+Pattern CB327
+# gf Reduced shape value. (3.1.23)
+# See nngs:1750
+# ab increased shape value (3.1.29)
+# gf Added constraint. (3.3.3)
+
+?.?         seal opponent in
+...      
+.*O
+OX?
+
+:8,OXecd,shape(3)
+
+?.?
+...
+.*O
+OA?
+
+;!attack(A) || !oplay_defend(*,A)
+
+
+Pattern CB328
+#ab Revised constraint (3.3.3)
+# gf Reduced shape value. (3.5.2)
+
+?.?         seal opponent in and connect
+...      
+.*O
+OX?
+
+:8,OXC,shape(3)
+
+?.?
+...
+a*O
+OB?
+
+; oplay_attack_either(*,a,a,B) && (!attack(B) || does_attack(*,B))
+
+
+######
+# Hane 
+######
+
+Pattern CB202
+
+?o.?         hane if attached
+..*.
+.OX.
+....
+..X.
+
+:8,OXE
+
+
+Pattern CB212
+# constraint is complementary to CB213.
+
+.X.O.?    hane to defend
+...X*.
+
+:8,OXd
+
+.X.Oa?
+...B*.
+
+;!oplay_attack_either(*,a,a,B)
+
+
+Pattern CB213
+
+.X.O.?    extra value if X can't cut
+...X*.
+
+:8,OXed,shape(2)
+
+.X.Oa?
+...B*.
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern CB216
+
+OX..     connect if invaded
+.*.O
+...?
+
+:8,OXecd
+
+aX..
+.*.b
+...?
+
+;lib(a)>=2 && lib(b)>=2
+
+
+Pattern CB219
+
+....O            hane
+..O..
+.*X.X
+.....
+
+:8,OXE
+
+
+Pattern CB220
+# gf Added missing '-' placeholder for classification. (3.1.18)
+
+*.
+XO     hane at head of two stones.
+XO
+..
+
+:8,-,shape(2)
+
+
+Pattern CB221
+
+????O?            hane
+.XOO..
+..XX*?
+??..??
+
+:8,OXe
+
+
+Pattern CB223
+
+ooo      form eye to protect
+O.O
+.*X
+
+:8,OXed
+
+ooo
+O.a
+.*X
+
+;lib(a)>1
+
+
+Pattern CB231
+
+?ooo            form eye to protect
+?O.*
+o.OX
+?o??
+
+:8,OXed
+
+
+Pattern CB232
+
+?ooo            form eye to protect
+?O.*
+o.OX
+?OXX
+
+:8,OXed,shape(1)
+
+
+Pattern CB236
+
+XX*.     block! this can be life or death    
+?O.O
+??O?
+
+:8,OXed
+
+
+Pattern CB240
+
+..            block off area
+.*
+OX
+
+:8,OXe
+
+ab
+.*
+cD
+
+;!xarea(a) && !xarea(b) && lib(c)>2 && lib(D)<3
+
+
+Pattern CB241a
+
+..            block off area
+.*
+OX
+O?
+
+:8,OXe
+
+..
+a*
+OX
+O?
+
+;odefend_against(*,a)
+
+
+Pattern CB241b
+
+..            block off area
+.*
+OX
+.x
+
+:8,OXe
+
+..
+a*
+OX
+.x
+
+; odefend_against(*,a)
+
+
+Pattern CB244
+
+?...?        hane at the head of three stones
+OXXX*
+?OOO.
+
+:8,OXe
+
+
+Pattern CB245
+# tm modified (3.1.18)
+#   see trevorb:750
+
+?..??        hane at the head of two stones
+OXX*?
+?OO.?
+
+:8,OXe
+
+?..??
+cXe*F
+?bbAD
+
+; lib(c)>1
+; && !oplay_attack(*,b)
+; && oplay_defend_both(*,A,*,b)
+; && (oplay_attack(*,A,e) || !x_alive_somewhere(D,F))
+
+
+Pattern CB247
+
+?O..       hane
+XO..
+.X*.
+....
+
+:8,OXe
+
+
+Pattern CB262
+
+..o?       hane is urgent
+.*..
+.XOO
+..XO
+
+:8,OXe
+
+
+Pattern CB271
+
+?OX.?       hane is urgent
+..OX.
+?O.*.
+??...
+
+:8,OXe
+
+
+Pattern CB275
+
+?.X         make shape
+?..
+O.O
+X*.
+?..
+?.O
+
+:8,OXecd
+
+
+Pattern CB281
+
+O.??            block!
+O.??
+X*.?
+...?
+Ooo?
+
+:8,OXe
+
+
+Pattern CB288
+
+?...        block and expand
+..*.
+OOX.
+?X..
+
+:8,OXe
+
+
+Pattern CB296
+
+Oooo         block
+.*.o
+OX??
+
+:8,OXe
+
+
+Pattern CB297
+# gf Added a classification. (3.5.3)
+
+Oooo         block in sente
+.*.o
+OX??
+
+:8,OXea,followup(5)
+
+Oooo
+.*.o
+OA??
+
+;!attack(A) && oplay_attack(*,A)
+
+
+Pattern CB298
+
+O.Oo     protect by drawing back
+XO..
+XX*O
+
+:8,nOXed
+
+
+Pattern CB307
+
+X..?            atari 
+OX*.
+XO..
+
+:8,-,followup(5)
+
+X..?
+aX*.
+Xb..
+
+; dead(a) && !dead(b)
+
+
+Pattern CB309
+
+?..XO         hane, threatening atari
+..XOo
+..*.O
+?...?
+
+:8,OXed
+
+
+Pattern CB310
+
+?..?          hane
+.*X.
+..O?
+?Oo?
+
+:8,OXed
+
+
+Pattern CB313
+
+?.O..         block!
+X.X*.
+.....
+
+:8,OXE
+
+
+Pattern CB323
+
+O.?        block
+X*O
+
+:8,OXe
+
+
+Pattern CB329a
+# db added (3.3.6)
+
+?.??         atari
+.*.?
+OX.X
+oOX?
+
+:8,OXe,followup(5),shape(2)
+
+
+Pattern CB335
+# gf New pattern. (3.1.18)
+
+x.O           block
+X*.
+O.o
+
+:8,OXe
+
+
+Pattern CB339
+# gf New pattern. (3.3.4)
+
+?x?
+x.O
+.*X
+
+:8,OXe
+
+?x?
+xaO
+c*B
+
+;xterri(c) && oplay_attack_either(*,a,a,B)
+
+
+########
+# Kosumi
+########
+
+Pattern CB205
+
+.....        kosumi to claim space
+.....
+.*...
+O....
+?X...
+
+:8,OXe
+
+
+Pattern CB225
+# Move out diagonally instead
+
+?????        diagonal move to reduce
+.....
+.....
+..*..
+.O.X.
+.....
+
+:8,OXe
+
+?????
+.....
+ab...
+..*..
+.O.X.
+.....
+
+;xarea(a) || xarea(b)
+
+
+Pattern CB235
+
+..X.     extend and block
+O...
+.*..
+?...
+
+:8,OXe
+
+
+Pattern CB251
+
+..O?         diagonal move      
+.*..
+...X
+...X
+
+:8,OXe
+
+
+Pattern CB256
+
+..O            diagonal extension if nothing better
+.*.
+..X
+
+:8,OXe
+
+
+Pattern CB257
+
+X..O           move out
+..*.
+...X
+
+:8,OXea
+
+
+Pattern CB260
+
+....        Take opponent's vital point for moving out
+O...
+X.*.
+X..O
+
+:8,OXea
+
+
+Pattern CB267
+
+OXOX         prevent sealing
+XO..
+X.*.
+
+:8,Oed
+
+
+Pattern CB289
+
+..O.         reinforce and block
+.*.O
+.X.?
+
+:8,OXed
+
+
+###############
+# Miscellaneous
+###############
+
+Pattern CB203
+
+..O.         extend and peep
+.OXX
+.*..
+..X.
+
+:8,Xea,followup(20)
+
+.ae.
+.fXX
+.*bc
+..Xd
+
+;(alive(e) || alive(f)) && oplay_attack(*,a,a) && !oplay_attack(*,?,b,c,d,d)
+
+
+Pattern CB204
+# Kosumi is better if GNU is going to go back and defend anyway.
+
+.....        knight's move to claim space
+.....
+..*..
+O....
+?X...
+
+:8,OXE
+
+e....
+.....
+cb*..
+da...
+?X...
+
+;!xmoyo(e) && oplay_defend(*,a,b,c,d)
+
+
+Pattern CB204b
+# ab removed shape value (3.1.28)
+
+.....        knight's move to claim space
+.....
+..*..
+O....
+?X...
+
+:8,OXEd
+
+e....
+.....
+cb*..
+Oa...
+?X...
+
+;!xmoyo(e) && oplay_attack(*,a,b,c,c)
+
+
+Pattern CB206
+
+.....        block solid to claim space -- 
+.....        not so good if X (easily) can play double hane.
+.....
+O*...
+?X...
+
+:8,OXe
+
+.....
+.....
+.dc..
+O*a..
+?Xb..
+
+;!oplay_attack(*,a,b,b) || !oplay_attack(*,a,c,d,*)
+
+
+Pattern CB214
+
+O.X..    connect if invaded
+..*.O
+?...?
+
+:8,OXecd
+
+
+Pattern CB215
+
+..X..    connect if invaded
+O.*.O
+o...?
+
+:8,OXecd
+
+
+Pattern CB218
+
+?.?              extend
+.*.
+.OX
+OX?
+OX?
+
+:8,OXe
+
+?.?
+.*.
+.OA
+OX?
+OX?
+
+;!attack(A) || does_attack(*,A)
+
+
+Pattern CB224
+
+?????        knight's move to claim space
+.....
+..*..
+.....
+.O.X.
+.....
+
+:8,OXE
+
+?????
+.....
+ab*..
+.....
+.O.X.
+.....
+
+;!xarea(a) && !xarea(b)
+
+
+Pattern CB226
+
+?????        one space jump to reduce
+.....
+.*...
+.....
+.O.X.
+.....
+
+:8,OXE
+
+?????
+.....
+a*...
+.....
+.O.X.
+.....
+
+;xarea(a) || xarea(*)
+
+
+Pattern CB227
+# gf Reduced shape value. (3.5.2)
+
+?OO.             bend around
+XX*.
+....
+
+:8,OXead,shape(3)
+
+
+Pattern CB228
+# gf Sometimes it's better shape to jump. See nngs:1180. (3.3.7 )
+
+?XX.             prevent bend
+OO*.
+....
+
+:8,OXe,shape(3)
+
+?AAb
+OO*.
+....
+
+; !does_attack(b,A)
+
+
+Pattern CB229
+
+xXO             extend after hane
+XO.
+.*.
+...
+
+:8,OXed,reverse_followup(5)
+
+
+Pattern CB230
+
+?....             knight's move with good shape
+.*..O
+...O.
+??XXO
+
+:8,OXed
+
+
+Pattern CB233
+
+..X.     extend and block
+O...
+..*.
+?...
+
+:8,OXed
+
+..X.
+Obc.
+da*.
+e...
+
+;omoyo(e) || (oplay_attack(*,a,b,c,a) && oplay_attack_either(*,b,a,d,b,d))
+
+
+Pattern CB234
+
+..X.     extend and block
+O...
+O.*.
+?...
+
+:8,OXe
+
+
+Pattern CB237
+# tm Modified (3.1.23)
+# gf Corrected constraint. (3.3.12)
+
+??x?          extend
+O..X
+..*.
+?.o?
+
+:8,OXe
+
+??x?
+a..X
+..*.
+?.o?
+
+; !oplay_disconnect(*,*,a)
+
+
+Pattern CB238
+
+..?            block off area
+O*o
+?X?
+
+:8,OXe
+
+
+Pattern CB239
+# db added (3.3.3)
+# see nngs1:50
+# gf Revised to avoid bad shape. Constraint revised. (3.5.3)
+
+..x       connect to reinforce and attack
+O*O
+?X?
+
+:8,Xeda
+
+..x
+a*b
+?X?
+
+; !same_dragon(a,b) && (alive(a) || alive(b))
+
+
+Pattern CB241c
+
+..            block off area
+*.
+OX
+.O
+
+:8,OXe
+
+..
+*.
+OX
+bO
+
+;odefend_against(*,b)
+
+
+Pattern CB242
+
+?..?            default if previous pattern is not feasible
+?*.?
+?OX?
+
+:8,OXe
+
+
+Pattern CB243
+#evand new (3.5.4)
+
+?oo?           extend in center
+...?
+.*.?
+?OX?
+?ox?
+
+:8,OXead
+
+
+Pattern CB243b
+# gf New pattern. (3.7.4)
+# See gunnar:79.
+
+?oo?           block in center
+...?
+..*O
+?OX?
+?Ox?
+
+:8,OXead
+
+?oo?
+...?
+.a*O
+?OX?
+?Ox?
+
+;oplay_attack(*,a,a)
+
+
+Pattern CB246
+
+.O.O.?      block opponent
+.....?
+..X.*.
+.....?
+
+:8,OXed
+
+
+Pattern CB248
+
+?.XX?        extend
+.*OOX
+....X
+
+:8,OXed
+
+
+Pattern CB250
+
+??.O        Here X has 3 liberties.
+?O.?
+.*X?
+?..?
+
+:8,OXed
+
+??.O
+?O.?
+.*A?
+?..?
+
+;lib(A)==3
+
+
+Pattern CB252
+# gf Merged with CB253. (3.1.23)
+
+...       bend around
+O*.
+OX?
+
+:8,OXe
+
+
+Pattern CB254
+# gf Revised classification and constraint. (3.1.14)
+# db added shape value (3.1.28)
+
+..O
+o*X
+..O
+
+:-,Xead,shape(3)
+
+..a
+o*X
+..b
+
+;(alive(a) || alive(b)) && !oplay_attack(*,a) && !oplay_attack(*,b)
+
+
+Pattern CB255
+
+O.XO         bend around
+..*O
+??x?
+
+:8,OXe
+
+
+Pattern CB258
+# gf Added constraint. (3.3.13)
+
+??????          jump! (But not down to second line)
+?....?
+oO.*.?
+?....?
+?X...?
+
+:8,OXd
+
+??????
+?....?
+oa.*.?
+?....?
+?X...?
+
+;is_surrounded(a)
+
+
+Pattern CB259
+# gf Removed d classification (pattern too general). (3.3.13)
+
+?....           jump!
+oO.*.
+?....
+?X.X.
+
+:8,OX
+
+
+Pattern CB261
+
+?O.?       knight's move to block center
+XO..
+X...
+X.*.
+
+:8,OXea
+
+
+Pattern CB263
+
+?x.?       jump abreast       
+.*.O
+...O
+?X??
+
+:8,OXed
+
+
+Pattern CB263b
+# gf New pattern. (3.7.4)
+# See gunnar:74.
+
+?x.?       jump and attach
+...O
+.*.O
+OX??
+
+:8,OXed
+
+?x.?
+...O
+a*.O
+OX??
+
+;oplay_attack(*,a,a)
+
+
+Pattern CB264
+
+..O??         knight's move block
+...X?
+.O..?
+...*.
+???.?
+
+:8,OXea
+
+a.O??
+...X?
+.O..?
+...*.
+b??.?
+
+;omoyo(a) && omoyo(b)
+
+
+Pattern CB265
+
+O.???       seal the opponent in
+..X??
+.*..?
+....O
+
+:8,OXea
+
+
+Pattern CB266
+
+....O         build fence
+..*.O
+O..XO
+
+:8,OXea
+
+
+Pattern CB268
+
+O....      sketch a connection
+...*.
+?....
+??..O
+
+:8,OEcd,jump_out_helper
+
+a....
+...*.
+?....
+??..b
+
+;!attack(a) && lib(a)>2 && !attack(b) && lib(b)>2
+
+
+Pattern CB269
+
+O..?      seal the opponent
+..*.
+?X..
+??.O
+
+:8,OXEa
+
+
+Pattern CB270
+
+O...        attach to make shape
+..*.
+O.X?
+OX??
+X???
+
+:8,OXed
+
+
+Pattern CB272
+# gf Not on the edge without more support, see 9x9:540. (3.7.8)
+
+?..O.       block jump
+?....
+?....
+?.*.X
+?....
+?????
+
+:8,OXEa
+
+
+Pattern CB273
+# See global:8, global:9
+# tm modified (3.1.22)
+
+??O?        jump out
+?XOo
+X...
+..*o
+????
+
+:8,OXe
+
+??O?
+?XOa
+Xecd
+..*b
+????
+
+; o_alive_somewhere(a,b)
+; || oplay_attack(*,c,d,e,b,a)
+; || oplay_attack(*,c,d,e,a,b)
+
+
+Pattern CB274
+
+??????          extend (urgent)
+?..XX?
+?.*OOX
+?....?
+
+:8,OXed
+
+
+Pattern CB276
+
+?...?       knight's move expansion
+O..*.
+oO..?
+?XX??
+
+:8,OXe
+
+
+Pattern CB278
+
+OXO             block opponent
+.*.
+?.?
+
+:|,OXed
+
+aXb
+.*.
+?.?
+
+;lib(a)>1 && lib(b)>1
+
+
+Pattern CB279
+
+XOX             push out
+.*.
+?.?
+
+:|,OXe
+
+aOb
+.*.
+?.?
+
+;lib(a)>1 && lib(b)>1
+
+
+Pattern CB280
+
+?.?       extend to defend
+.*.
+XO?
+X.?
+XO?
+
+:8,OXe
+
+
+Pattern CB282
+
+.......?        block opponent in center
+X.X.*..?
+.......?
+
+:-,E
+
+.......?
+X.X.*..?
+.......?
+
+;!xmoyo(*)
+
+
+Pattern CB283
+
+..x?         bend around
+O*..
+OX..
+X..?
+
+:8,OXe
+
+
+Pattern CB284
+
+.O.X.?        make shape to enclose
+....OO
+..*...
+......
+
+:8,OXeca
+
+
+Pattern CB285
+
+.....           vital point for both
+..*..
+O...O
+?X.X?
+
+:|,OXEc
+
+
+Pattern CB286
+
+.....           vital point for both
+..*..
+X...X
+?O.O?
+
+:|,OXe
+
+
+Pattern CB287
+
+..O      pattern to enclose
+...
+...
+.*.
+..X
+O.?
+
+:8,OXEca
+
+
+Pattern CB290
+
+?....        jump out
+?.*.X
+....?
+.XOO?
+?.XO?
+
+:8,OXed
+
+
+Pattern CB291
+# gf Shape value removed. (3.1.9)
+
+.OX??          extend
+..OX?
+..*.?
+?..??
+
+:8,OXed
+
+.OX??
+.aOX?
+..*.?
+?..??
+
+; oplay_attack(*,a,a)
+
+
+Pattern CB292
+
+.O???          jump and block
+..O??
+....?
+.*.X?
+...??
+
+:8,OXE
+
+
+Pattern CB293
+# db reduced shape value (3.1.8)
+# gf Revised constraint. (3.3.12)
+
+?O..              knight's move
+?O..
+X...
+..*.
+?x.?
+
+:8,OXead,shape(3)
+
+?a..
+?a..
+X...
+..*.
+?x.?
+
+;!oplay_disconnect(*,*,a)
+
+
+Pattern CB294
+
+XOO??              push
+.XO??
+.X*..
+.....
+....?
+
+:8,OXe
+
+
+Pattern CB295
+
+oOo?           attach
+...?
+.*X.
+...?
+
+:8,OXE
+
+
+Pattern CB299
+
+OoO            make good shape
+Ox.
+X*O
+
+:8,OXe
+
+
+Pattern CB300
+
+...       bend around
+O*.
+OXX
+
+:8,OXe
+
+
+Pattern CB301
+
+X..
+.*.
+XO.
+?O.
+
+:8,OXead
+
+
+Pattern CB302
+
+..O.            seal the opponent
+....
+.*..
+..X.
+O...
+
+:8,OXEca
+
+
+Pattern CB303
+
+?.X?           make shape - reverse sente
+.*OX
+?..?
+?OO?
+
+:8,OXe,followup(3)
+
+?.A?
+.*OX
+?..?
+?OO?
+
+;!xplay_attack(*,A)
+
+
+Pattern CB304
+
+?X..           extend out
+OO*.
+?X..
+
+:-,OXe
+
+
+Pattern CB305
+
+?OX..           extend out
+o.O*.
+?OX..
+
+:-,OXe
+
+
+Pattern CB306
+
+?oX..           extend out
+O.O*.
+?OX..
+
+:8,OXe
+
+
+Pattern CB308
+
+?.??        Push, threatening atari -- Don't play if block at a 
+...?        doesn't leave a cut at b.
+O*..
+?X..
+
+:8,OXe,followup(5)
+
+?.??
+...?
+O*a.
+?Ab.
+
+;lib(A)==3 && !xdefend_against(a,b)
+
+
+Pattern CB311
+
+....         prevent escape
+O*..
+X...
+?.O.
+
+:8,OXeca
+
+
+Pattern CB312
+
+?.X.          extend to defend
+O.OX
+..*.
+????
+
+:8,OXe
+
+
+Pattern CB314
+# tm modified (3.1.23)
+# FIXED: See global:8 for unexpected match.
+
+xX..          jump!
+?...
+O.*.
+?o??
+
+:8,OXe
+
+xX..
+?...
+A.*.
+?o??
+
+; !oplay_disconnect(*,A,*)
+
+
+Pattern CB315
+
+??XO?         connect three stones
+..*.o
+O..O?
+?..??
+
+:8,OXe
+
+
+Pattern CB316
+
+?OO           make bamboo joint
+X..
+.*O
+O.?
+
+:8,OXe
+
+?aa
+X..
+.*O
+O.?
+
+;lib(a)<4
+
+
+Pattern CB317
+
+xX..          urgent extension
+XO*.
+O..X
+ooo?
+
+:8,OXed
+
+
+Pattern CB318
+
+o.X           break out
+O*.
+X..
+
+:8,OXed
+
+o.X
+O*.
+Cba
+
+;!xmoyo(a) && !oplay_attack(b,C)
+
+
+Pattern CB319
+
+?.X?         breakout
+.*.O
+?..O
+?.XO
+??.X
+
+:8,OXed
+
+
+Pattern CB320
+
+X.O.?        jump to move out and separate
+....X
+o.*.?
+oo.o?
+?????
+
+:8,OXad
+
+
+Pattern CB321
+# gf No moyo building on the second line, see 9x9:540. (3.7.8)
+
+???????
+??....?       block to build moyo
+xxX.*.?
+??....?
+???????
+
+:-,XE
+
+???????
+??....?
+xxX.*.a
+??....?
+???????
+
+;!xmoyo(*) && !xarea(a)
+
+
+Pattern CB322
+#FIXME: Pattern needs revision see nngs:860
+
+??.ooo?       block to attack
+??....?
+xxX.*.?
+??....?
+??.ooo?
+
+:-,XE
+
+??.ooo?
+??....?
+xxA.*.?
+??....?
+??.ooo?
+
+;!xterri(*) && weak(A)
+
+
+Pattern CB322a
+# gf Corrected symmetry. (3.1.23)
+
+??.ooo?       block to attack
+??.ooo?
+??....?
+xxX.*.?
+??....?
+??.ooo?
+
+:8,XEa
+
+??.bcd?
+??.efg?
+??....?
+xxA.*.?
+??....?
+??.ooo?
+
+;!xterri(*) && weak(A) && o_alive_somewhere(b,c,d,e,f,g)
+
+
+Pattern CB324
+
+xxX?       block
+O*..
+...O
+
+:8,OXe
+
+
+Pattern CB325
+
+*O      block
+.X
+.X
+
+:8,nOXe
+
+
+Pattern CB326
+# gf Reduced shape value. (3.5.2)
+
+?.??       seal opponent in 
+....
+O.*.
+OXXO
+
+:8,OXe,shape(3)
+
+?.??
+.bc.
+Ba*d
+BAAO
+
+;lib(A)<=3 && lib(B)>=3 && oplay_attack(*,a,b,c,d,?,A)
+
+
+Pattern CB330
+# tm removed 'd' attribute (3.1.20) (see arend:3)
+
+?.?       push
+...
+X*X
+?O?
+
+:|,OXe,shape(3)
+
+
+Pattern CB331
+
+?.?       push
+...
+X*X
+o.O
+
+:8,OXe
+
+?.?
+...
+X*X
+oaO
+
+;oplay_attack(*,a,a)
+
+
+Pattern CB332
+
+?xX..O         expand and block
+?.....
+?.*..O
+?....o
+
+:8,OXE
+
+
+Pattern CB333
+# db added (3.1.7)
+# shape only --- other patterns matched give other attributes
+
+?.?            prevent X from pushing out
+OXO
+.*.
+?.?
+
+:8,OX,shape(3)
+
+?a?
+BXC
+.*.
+?.?
+
+; !safe_omove(a) && lib(B)>1 && lib(C)>1
+
+
+Pattern CB334
+# db added (3.1.8)
+
+...O       magnificent shape
+...O
+.*OX
+O.Xx
+
+:8,OX,shape(2)
+
+
+Pattern CB337
+# db added (3.3.3)
+# see nngs1:47
+
+.X.      Don't get sealed!
+...
+O*.
+X..
+
+:8,OXeda,shape(3)
+
+
+Pattern CB338
+# gf New pattern. (3.3.3)
+# see e.g. trevorb:440
+# The diagonal move is potentially very problematic since X often
+# can play either b or c threatening to cut off *. If that move
+# simultaneously threatens something more, we're in trouble. This
+# pattern has a very conservative constraint, where it is required
+# that neither b nor c is a threat against the connection.
+
+xxx      diagonal push
+.*x
+O.x
+
+:/,OXe
+
+def
+c*g
+abh
+
+;(x_alive_somewhere(d,e,f,g,h) || xarea(f))
+;&& !oplay_disconnect(*,b,*,a) && !oplay_disconnect(*,c,*,a)
+
+
+Pattern CB338b
+# gf New pattern. (3.3.16)
+# Another safe variation of the diagonal move. See comment for CB338.
+
+?xxx      diagonal push
+?.*x
+OO.x
+?oO?
+
+:8,OXe
+
+?def
+?.*g
+aach
+?ib?
+
+;(x_somewhere(d,e,f,g,h) || xarea(f))
+;&& (same_string(a,b) || oplay_attack(*,c,?,i,i))
+
+
+Pattern CB340
+# db added (3.3.14)
+# compare CB242
+
+X...          extend to prevent hane
+..X.
+O.O*
+o...
+
+:8,OXda,shape(3)
+
+
+Pattern CB341
+# db added (3.3.14)
+# compare CB242
+
+..X.        extend to prevent hane and split
+O.O*
+o...
+..X.
+
+:8,OXda,shape(3)
+
+
+Pattern CB342
+# gf New pattern. (3.5.3)
+
+?.X.?       extend to prevent hane and split
+O..*.
+o....
+oooOo
+
+:8,OXe
+
+
+Pattern CB343
+# evand New pattern. (3.7.1)
+# Is there a better way to do this than r_followup, followup, and terri?
+# See gifu03:202.
+
+xX..
+..*.
+....
+..Oo
+....
+
+:8,OXe,reverse_followup(2),followup(1),terri(3)
+
+xXde
+..*.
+....
+..Oo
+.abc
+
+;omoyo(a) && omoyo(b) && omoyo(c) && xmoyo(d) && xmoyo(e)
+
+
+Pattern CB344a
+# evand New pattern. (3.7.1)
+# see endgame:850
+
+?X??
+.*.o
+O..O
+?..?
+
+:8,OXe
+
+?X??
+.*.o
+O..O
+?ab?
+
+;omoyo(a) || omoyo(b)
+
+
+Pattern CB344b
+# evand New pattern. (3.7.1)
+# see endgame:850
+
+?X??
+*..o
+O..O
+?..?
+
+:8,OXe
+
+?X??
+*..o
+O..O
+?ab?
+
+;omoyo(a) || omoyo(b)
+
+
+Pattern CB344c
+# evand New pattern. (3.7.1)
+# see endgame:850
+
+?X??
+..*o
+O..O
+?..?
+
+:8,OXe
+
+?X??
+..*o
+O..O
+?ab?
+
+;omoyo(a) || omoyo(b)
+
+
+######################################################################
+#
+# Edge defend/attack patterns
+#
+# Moves that threaten to capture, cut, or destroy eyes, and moves
+# defending against this or preventing such moves. Also moves that
+# actually do capture or destroy eyes are included here. 
+#
+######################################################################
+
+
+Pattern ED1
+
+?XX?       Avoid opponent's push between two stones on second line
+.O*O
+....
+----
+
+:8,OXad
+
+
+Pattern ED2
+
+.O.O..   capture 2 stones
+......
+O.X.*.
+.OX...
+......
+------
+
+:8,OXa
+
+
+Pattern ED3
+
+X.??    prevent severe attachment
+..O.
+O.*X
+....
+----
+
+:8,OXd
+
+
+Pattern ED4
+
+???.?.x    Block to defend
+?XO.O.x
+OO..*.x
+.......
+.......
+-------
+
+:8,OXd
+
+???.?.x
+?XO.O.a
+OO..*.b
+.......
+.......
+-------
+
+;x_alive_somewhere(a,b)
+
+
+Pattern ED6
+
+?X?      connect against peep (on edge)
+O*O
+?.?
+---
+
+:|,OXd
+
+
+Pattern ED7
+
+|??O?        Make sente throw in to kill eye in corner
+|XXOX
+|.*X.
++----
+
+:8,sOXa
+
+|??a?
+|XXaX
+|.*X.
++----
+
+;!oplay_attack(*,a)
+
+
+Pattern ED8
+
+XXXOX      sente throw in to kill eye on the edge
+X.*X.
+-----
+
+:8,sOXa
+
+XXXaX
+X.*X.
+-----
+
+;!oplay_attack(*,a)
+
+
+Pattern ED9
+
+??X?      Prevent capture of 2 stones, or forcing sequence
+OO*O
+....
+----
+
+:8,OXd
+
+
+Pattern ED10
+
+??O?      Capture 2 stones, or force opponent
+XX*X
+....
+----
+
+:8,OXa
+
+
+Pattern ED11
+
+xxxx????      if attached, cut!
+.......?
+.X.O..Oo
+..*X...o
+........
+--------
+
+:8,sOXBd,shape(3)
+
+
+Pattern ED12
+# bad to intercept in this case
+
+..O.???        block!
+.......
+.X.O..O
+...X*..
+.......
+-------
+
+:8,OXed,shape(3)
+
+..O.???
+.......
+.X.O..O
+..aX*..
+.......
+-------
+
+>antisuji(a);
+
+
+Pattern ED13
+# Add followup value if this is sente.
+
+.O.???        block!
+......
+X.O..O
+..X*..
+......
+------
+
+:8,OX,followup(7)
+
+.O.???
+......
+X.Ob.O
+.aX*..
+......
+------
+
+;oplay_attack(*,a,b,b)
+
+
+Pattern ED14
+
+?...Ooo       block!
+X.O...o
+.*X..oo
+.......
+-------
+
+:8,OXBd,shape(2)
+
+
+Pattern ED15
+
+??.?        atari improves our group
+.*XO
+..OO
+....
+----
+
+:8,OXd
+
+
+Pattern ED16
+
+oOX?         Make atari to kill eye
+OX.X
+.*..
+----
+
+:8,OXa
+
+
+Pattern ED17
+
+??OOO       enclose two stones
+?OX..
+oOX.*
+o??..
+-----
+
+:8,OXa
+
+
+Pattern ED18
+
+?OOO?       threatens capture
+OXX*.
+OX.X.
+O....
+-----
+
+:8,OXa,followup(8)
+
+?OOO?
+bAA*.
+bA.X.
+b....
+-----
+
+;oplay_attack(*,A) && !oplay_attack(*,b)
+
+
+Pattern ED19
+
+?XXXO       oki  --- sacrifice helper because defend2 doesn't see the tesuji
+OX..X
+..*..
+-----
+
+:8,sOXa
+
+?XXXO
+cX.bX
+.a*..
+-----
+
+;!oplay_attack(*,c) && !oplay_defend(*,a,b,a)
+
+
+Pattern ED20
+
+?O?         force X to connect
+X*X
+...
+---
+
+:|,OXa
+
+
+Pattern ED21
+
+?OO.       atari!
+XOX*
+.X..
+----
+
+:8,OXa
+
+
+Pattern ED22
+# gf Added b classification. (3.1.18)
+# gf Split pattern and revised constraint. (3.3.3)
+
+??*X          sente endgame (maybe rather middle game) move
+..XO
+..X?
+----
+
+:8,OXed,followup(5)
+
+??*X
+..Ab
+..A?
+----
+
+;oplay_attack(*,A) && !oplay_attack_either(*,*,b)
+
+
+Pattern ED22b
+# gf Added b classification. (3.1.18)
+# gf Split pattern and revised constraint. (3.3.3)
+
+??*.          sente endgame (maybe rather middle game) move
+..XO
+..X?
+----
+
+:8,OXed,followup(5)
+
+??*c
+..Ab
+..A?
+----
+
+;oplay_attack(*,A) && oplay_defend_both(*,c,*,b)
+
+
+Pattern ED23
+# gf Added b classification. (3.1.18)
+
+??*O          sente endgame (maybe rather middle game) move
+..X?
+..X?
+----
+
+:8,OXed,followup(5)
+
+??*O
+..A?
+..A?
+----
+
+;oplay_attack(*,A)
+
+
+Pattern ED24
+
+??*O          sente endgame (maybe rather middle game) move
+..XX
+..xx
+----
+
+:8,OXd,followup(7)
+
+??*O
+..AA
+..xx
+----
+
+;oplay_attack(*,A)
+
+
+Pattern ED25
+
+X.OX         Avoid peep.
+.*.O
+....
+----
+
+:8,OXd
+
+X.OA
+.*.O
+....
+----
+
+;!attack(A)
+
+
+Pattern ED26
+
+oOOo??    Capture some stones
+OX.*.?
+OX....
+?X....
+------
+
+:8,OXa
+
+
+Pattern ED27
+
+oOO*.    Punish X's weak shape
+OXOX.
+.XX..
+-----
+
+:8,OXad
+
+
+Pattern ED28
+
+?XO..
+?XO..
+..*.X
+..X..
+.....
+-----
+
+:8,OXea
+
+
+Pattern ED29
+
+OXO             Sacrifice a second stone tesuji
+XOX
+.*.
+---
+
+:|,sa
+
+aAb
+BOC
+.*.
+---
+
+;lib(A)<=2 && lib(B)>1 && lib(C)>1
+;&& !oplay_attack(*,a) && !oplay_attack(*,b)
+;&& oplay_attack(*,A) && oplay_attack(*,B) && oplay_attack(*,C)
+
+
+Pattern ED30
+
+|.o??           hane is big, often urgent
+|.*X?
+|..OO
+|....
++----
+
+:8,OXd
+
+
+Pattern ED31
+
+xxX.o            extend to defend
+..O*.
+O....
+.....
+-----
+
+:8,OXead
+
+
+Pattern ED31b
+
+x.xXx            extend to defend
+O.*O.
+.....
+.....
+-----
+
+:8,OXed
+
+
+Pattern ED31c
+
+x.X*..       hane 
+o.O..O
+o.....
+......
+------
+
+:8,OXed
+
+
+Pattern ED32
+
+X.X..         useful kikashi
+OX.*.
+.....
+.....
+-----
+
+:8,-,followup(10)
+
+X.X..
+aX.*.
+.....
+.....
+-----
+
+;lib(a)>2
+
+
+Pattern ED33
+
+|xXx???    slide to live
+|.OXX??
+|.OO..x
+|....*.
+|......
++------
+
+:8,OXd
+
+
+Pattern ED34
+
+|xXx???    hane to live
+|.OXX??
+|.OOX.x
+|...*..
+|......
++------
+
+:8,OXd
+
+
+Pattern ED35
+
+|..XX??    hane to live
+|.OOX.x
+|...*..
+|......
++------
+
+:8,OXd
+
+
+Pattern ED36
+# this can be aji keshi because 1 point above is also sente
+
+?XXOo     atari on edge
+?..XO
+.X.*.
+-----
+
+:8,OXa
+
+
+Pattern ED37
+# This should not need be a sacrifice pattern, and the constraint
+# on the O stones should be superfluous, if only the tactical reading
+# could understand a double snapback.
+
+O???O        double snapback
+X.X.X
+X.*.X
+-----
+
+:8,sX
+
+c???d
+A.X.B
+A.*.B
+-----
+
+;lib(A)==2 && lib(B)==2 && lib(c)>1 && lib(d)>1
+
+>test_attack_either_move(A,B);
+
+
+Pattern ED38
+
+XXOXX      swallow either side
+..X*.
+.....
+-----
+
+:8,s
+
+DDOCC
+.aX*.
+..b..
+-----
+
+;oplay_attack(*,b,C) && oplay_attack(a,b,D)
+
+>test_attack_either_move(C,D);
+
+
+Pattern ED39
+# This is almost always a good idea.
+
+?XXO           decrease eye space in sente (unless it kills)
+X.*X
+----
+
+# helper sets followup value
+:8,sXa,throw_in_atari_helper
+
+?bba
+Xc*A
+----
+
+;lib(A)==2 && lib(a)>1 && !alive(b) && proper_eye(c)
+
+
+Pattern ED40
+
+OXO           decrease eye space in sente (unless it kills)
+X*X
+X.X
+---
+
+# helper sets followup value
+:8,sXa,throw_in_atari_helper
+
+aAb
+X*X
+X.X
+---
+
+;lib(A)==2 && lib(a)>1 && lib(b)>1
+
+
+Pattern ED41
+
+|XXO           decrease eye space in sente (unless it kills)
+|.*X
++---
+
+# helper sets followup value
+:8,sXa,throw_in_atari_helper
+
+|XXa
+|.*A
++---
+
+;lib(A)==2 && lib(a)>1
+
+
+Pattern ED42
+
+?XX...        jump out
+OO.*..
+......
+......
+------
+
+:8,OXead
+
+?XX.g.
+HHA*..
+.EbCd.
+...f..
+------
+
+; lib(H)>4 || !oplay_defend(*,A,b,C,d,E,f,E)
+
+>antisuji(g);
+
+
+Pattern ED43
+# gf Reduced shape value. (3.5.2)
+
+?OO..o      push through and cut!
+XX*X.o
+.....o
+.....?
+------
+
+:8,OXad,shape(3)
+
+?OO..o
+AA*B.o
+.fcdeo
+...g.?
+------
+
+; oplay_attack(*,c,d,f,B) && oplay_attack(*,c,d,e,f,g,A)
+
+
+Pattern ED44
+# gf Reduced shape value. (3.5.2)
+
+O....      capture one stone
+O..*.
+O.X.O
+.....
+.....
+-----
+
+:8,OXecad,shape(3)
+
+
+Pattern ED45
+# gf Fixed value removed. (3.5.2)
+
+?XX...        defense is urgent
+OO.O*.
+?.....
+?.....
+------
+
+:8,OXead
+
+?XX...
+OOaO*.
+?cbd..
+?.....
+------
+
+; xplay_defend(a,b,c,d,c)
+
+
+Pattern ED46
+# gf Removed fixed value. (3.5.2)
+
+?X...        jump to take territory on 4-th line
+.....
+O.*..
+.....
+.....
+.....
+-----
+
+:8,OXead
+
+
+Pattern ED47
+# gf Reduced shape value. (3.5.2)
+
+X.O...x
+xXO.*.x
+?XXO...
+.......
+-------
+
+:8,OXed,shape(3)
+
+
+Pattern ED48
+# gf Reduced shape value. (3.5.2)
+
+?...       break ponnuki, threaten to cut
+?.*O
+.XOX
+?.X.
+?...
+----
+
+:8,OXead,shape(3)
+
+?...
+?.*O
+.XOA
+?.X.
+?...
+----
+
+; lib(A)==2
+
+
+Pattern ED49
+# gf Reduced shape value. (3.5.2)
+
+??..?       push to stabilize O
+?.X..
+..*O.
+.....
+.....
+-----
+
+:8,OXead,shape(3)
+
+
+Pattern ED49b
+
+oo....?       push to stabilize O and (probably) make territory
+oo..X..
+oo..*O.
+.......
+.......
+-------
+
+:8,OXJ
+
+oo....?
+bc..X..
+de..*a.
+.......
+.......
+-------
+
+;weak(a) && o_alive_somewhere(b,c,d,e)
+
+
+Pattern ED50
+# gf Removed fixed value. (3.5.2)
+
+.....        don't get sealed in!
+..*Xx
+X.O..
+....O
+.....
+.....
+-----
+
+:8,OeBad
+
+
+Pattern ED51
+# gf Reduced shape value. (3.5.2)
+
+.........        block to build influence
+o.....*Xx
+oo....O..
+oo......O
+.........
+.........
+---------
+
+:8,OXead,shape(3)
+
+
+Pattern ED52
+# gf Removed fixed value. (3.5.2)
+
+?.....        attach in sente
+......
+..X.X.
+..*..O
+...O..
+......
+......
+------
+
+:8,OXad
+
+
+Pattern ED53
+# gf Removed fixed value, added B classification. (3.5.2)
+
+?OO...        push through and cut
+XX*X..
+?.....
+?.....
+------
+
+:8,OXBead
+
+?OO...
+EE*D..
+?bac..
+?.....
+------
+
+; oplay_attack(*,a,b,c,E) && oplay_attack(*,a,c,D)
+
+
+Pattern ED54
+# gf Removed fixed value. (3.5.2)
+
+?OO...        cut
+XXOX..
+.*X...
+?.....
+------
+
+:8,sOXBad
+
+?OO...
+AAOB..
+.*Xd..
+?.....
+------
+
+; oplay_attack(*,d,A) && oplay_attack(d,B)
+
+
+Pattern ED55
+# gf Removed fixed value. (3.5.2)
+
+?OO...        cut
+XXOX..
+XOX*..
+?.....
+------
+
+:8,Bad
+
+?OO...
+XXOB..
+XOX*..
+?a....
+------
+
+; oplay_attack(*,a,B)
+
+
+Pattern ED56
+# tm modified (3.1.20) (nngs:1170)
+
+...X.?      extend to defend if attached
+O..O*.
+......
+......
+------
+
+:8,OXCad,shape(3)
+
+
+Pattern ED57
+# gf Reduced shape value. (3.5.2)
+
+OOXX??      push to defend
+.XOX..
+..O*..
+......
+------
+
+:8,-,shape(3)
+
+OOXX??
+.AOX..
+..O*..
+......
+------
+
+; does_attack(*,A)
+
+
+Pattern ED58
+# gf Removed fixed value and revised constraint. (3.5.2)
+
+??X??        connect to defend everything
+?OXO?
+.*OX.
+.....
+-----
+
+:8,BCad
+
+??G??
+?cGO?
+.*OAd
+..bef
+-----
+
+; alive(G) && !oplay_defend(*,A) && xplay_attack(*,b,c)
+
+> antisuji(b);
+> antisuji(d);
+> antisuji(e);
+> antisuji(f);
+
+
+Pattern ED59
+
+??X??        capture to defend everything
+?OXO?
+..OX*
+.....
+-----
+
+:8,Xad
+
+??X??
+?OXA?
+caOX*
+deb..
+-----
+
+; (lib(A)>1) && !oplay_defend(*,a,b,a) && oplay_attack(a,A)
+
+> antisuji(a);
+> antisuji(c);
+> antisuji(d);
+> antisuji(e);
+
+
+Pattern ED61
+
+??.??        follow up ED59
+?.O.?
+.OXOX
+..X*.
+.....
+-----
+
+:8,J
+
+
+Pattern ED62
+# gf Reduced shape value. (3.5.2)
+
+....?        if double hane is not reasonable, extend
+OO..?
+XXO*.
+..X..
+.....
+-----
+
+:8,OXead,shape(3)
+
+....?
+OOb.?
+FFO*.
+.dXac
+...e.
+-----
+
+; !oplay_attack(a,*,b,c,d,e,F)
+
+
+Pattern ED63
+
+oOXx         capture one stone---don't descend!
+OXOX
+.*..
+----
+
+:8,ad,shape(2)
+
+oOXx
+OXOX
+.*a.
+----
+
+> antisuji(a);
+
+
+Pattern ED64
+
+.....        connect solidly
+.O*..
+XXO..
+.....
+.....
+-----
+
+:8,OXead,shape(2)
+
+..a..
+.O*..
+XXO..
+.....
+.....
+-----
+
+> antisuji(a);
+
+
+Pattern ED65
+# gf Removed fixed value. (3.5.2)
+
+?o..?        pull back to stabilize
+?O..?
+XXO*.
+?xX..
+xxx..
+-----
+
+:8,OXad
+
+
+Pattern ED68
+# tm Modified (3.1.20) (see nngs:1130)
+
+?O*Xx         reinforce
+o..OO
+.....
+.....
+-----
+
+:8,OXed
+
+?O*Xx
+o.aOO
+.....
+.....
+-----
+
+; xplay_defend(a,*,a)
+
+
+Pattern ED69
+
+O..x         connect under
+.*.X
+...O
+....
+----
+
+:8,Cad,shape(3)
+
+O..x
+.*cA
+..bO
+....
+----
+
+; !attack(A) && !oplay_defend(*,b,c,b)
+
+
+Pattern ED70
+# Threaten to capture some stones.
+
+O*X
+OX.
+
+:8,OXe,followup(6)
+
+O*C
+OBa
+
+;xterri(a) && !attack(B) && !attack(C) && !oplay_attack(*,?,a,a)
+;&& !oplay_defend_both(*,?,a,B,C)
+
+
+Pattern ED71
+
+O*.X          capture correctly
+OXOX
+....
+----
+
+:8,Cad,shape(1)
+
+O*.X
+OXOX
+..a.
+----
+
+>antisuji(a)
+
+
+Pattern ED72
+
+?OXO?
+..O*X
+.....
+-----
+
+:8,Xd,shape(3)
+
+?OXB?
+.aO*X
+.....
+-----
+
+;xplay_attack(*,a,B)
+
+
+Pattern ED73
+
+?OXO??
+..O.X*
+......
+------
+
+:8,-,shape(-3)
+
+?OXO??
+..OaB*
+......
+------
+
+; !oplay_attack(*,a,B)
+
+
+Pattern ED74
+
+O*.     connect solid if descent is impossible
+XOX
+...
+---
+
+:8,d,shape(3)
+
+O*.
+AOX
+.a.
+---
+
+; !attack(A) && !oplay_attack(a,*,*)
+
+
+Pattern ED75
+
+O..     don't descend if X can cut
+XOX
+.*.
+---
+
+:8,-,shape(-3)
+
+Oa.
+XOX
+.*.
+---
+
+; !oplay_attack(*,a,a)
+
+
+Pattern ED76
+# gf The negative shape value is a temporary measure to avoid
+#    overvaluation. (3.1.17)
+# tm Added right hand side check (3.1.20) (see strategy4:195)
+# db removed 'a' classification and reduced negative shape.
+
+oOo???     stop expansion and undermine
+o..X??
+o.*.x?
+....??
+------
+
+:8,OXe,shape(-2)
+
+oOo???
+obaX?g
+oc*.xf
+....??
+------
+
+;oplay_attack_either(*,a,b,c,a,c)
+;&& !oarea(f) && !oarea(g)
+
+
+Pattern ED77
+# gf Reduced shape value. (3.5.2)
+
+?XX?            defend cut
+O*O.
+....
+....
+----
+
+:8,OXead,shape(3)
+
+?XX?
+O*Oc
+.ab.
+....
+----
+
+;xplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern ED78
+# gf Reduced shape value. (3.5.2)
+
+?OO?          push through and cut
+X*X.
+....
+....
+----
+
+:8,OXead,shape(3)
+
+?OO?
+X*Xc
+.ab.
+....
+----
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern ED79
+# avoid does_defend since some levels GNU may not see attack on B
+
+?OXX          avoid a stupid defense
+..OX
+..*O
+----
+
+:8,X,shape(-2)
+
+?OXX
+.aOX
+..*B
+----
+
+; does_attack(a,B) && !xplay_attack(a,B)
+
+
+Pattern ED80
+# descending at 'a' is almost always bad
+
+?x??       defend correctly
+x.Oo
+XOX*
+....
+----
+
+:8,d
+
+?x??
+x.Oo
+XOX*
+.a..
+----
+
+> antisuji(a);
+
+
+Pattern ED81
+
+.?.???        give up one stone
+...O..
+...*XX
+....OX
+......
+------
+
+:8,-
+
+.?.???
+..cO..
+.db*XX
+...aOX
+......
+------
+
+; oplay_defend(a,*,b,c,d,c)
+
+>antisuji(a);
+
+
+Pattern ED82
+# gf Reduced shape value. (3.5.2)
+
+|.....       atari is usually a better way to use the dead stone
+|..*..
+|.....
+|..XOO
+|..OX?
+
+:8,-,shape(-3)
+
+|.....
+|..*..
+|.....
+|..XOO
+|..aX?
+
+; dead(a)
+
+
+Pattern ED83
+
+|xXX?
+|XOOX
+|.*.x
+|..O?
+
+:8,ed,shape(2)
+
+|xXX?
+|XOOX
+|a*.x
+|..O?
+
+> antisuji(a)
+
+
+Pattern ED84
+# db added (3.1.7)
+# gf Changed antisuji action to replace action. (3.1.14)
+
+|xXXx        fall back to defend territory
+|XOOX
+|..OX
+|.*.O
+|...o
+
+:8,OXd,shape(2)
+
+|xXXx
+|XOOX
+|a.OX
+|.*.O
+|...o
+
+>replace(a,*)
+
+
+Pattern ED85
+# gf New pattern. (3.1.14)
+
+|......      attach at 3-3 to defend
+|..X.O.
+|..*...
+|......
+|......
++------
+
+:8,Xd
+
+
+Pattern ED86
+# gf New pattern. (3.1.14)
+# This is not redundant in the presence of ED85, since it also infers
+# a strategical defense of the stone on the fifth line. If the two O
+# stones are not amalgamated, this makes a difference.
+
+|..x.O.
+|......      attach at 3-3 to defend
+|..X.O.
+|..*...
+|......
+|......
++------
+
+:8,Xd
+
+
+Pattern ED87
+# db New pattern (3.1.28)
+
+ooOo?         Don't leave aji
+...*X
+...OX
+.....
+-----
+
+:8,-,shape(2)
+
+ooOo?
+...*X
+...OX
+..ba.
+-----
+
+>replace(a,*);
+>replace(b,*);
+
+
+Pattern ED87a
+# db New pattern (3.1.28)
+
+ooOX?         Don't leave aji
+..*.X
+...OX
+.....
+-----
+
+:8,-,shape(2)
+
+ooOX?
+..*.X
+...OX
+..ba.
+-----
+
+>replace(a,*);
+>replace(b,*);
+
+
+Pattern ED88
+# db New pattern (3.1.28)
+# gf Corrected the replace action. (3.1.30)
+
+??...X?          take territory on the fourth line
+oo..*OX
+oo....O
+......o
+.......
+-------
+
+:8,-,shape(2)
+
+??...X?
+oo..*OX
+oo..b.a
+......o
+.......
+-------
+
+; lib(a)>2
+> replace(b,*)
+
+
+Pattern ED89
+# db New pattern (3.1.28)
+# It is difficult to give an exact criterion for when it is good to
+# fight this ko. But it is bad to lose it, may even threaten the
+# life of the O dragon. See nngs1:11
+
+??XxOo?          Don't fight an unfavorable ko!
+..XO.Oo
+.XO*O.?
+-------
+
+:8,-
+
+??XxOo?
+.aXO.bo
+.XO*O.?
+-------
+
+; alive(b)
+> replace(a,*)
+
+
+Pattern ED90
+# db New pattern (3.1.28)
+# ab d classification added (3.1.29)
+
+???..o?          Jump under on the third line
+???X.oo
+?O..*.o
+?O....o
+o......
+-------
+
+:8,dj
+
+???..o?
+???X.oo
+?hfa*.o
+?hcbd.o
+o.e....
+-------
+
+; oplay_attack(*,a,b,c,d,e,e) && !oplay_attack(*,a,b,c,d,f,e,h)
+> replace(b,*)
+
+
+Pattern ED91
+# db New pattern (3.1.28)
+# gf Changed to connection pattern. (3.7.2)
+
+??XXoo          Extend after the push
+O..O*.
+O....o
+......
+------
+
+:8,C
+
+??XXoo
+a..O*.
+a....o
+......
+------
+
+;!oplay_disconnect(*,*,a)
+
+
+Pattern ED92
+# db New pattern (3.1.30)
+# See nngs1:18, where * is found as an owl defense
+
+oOXx??       don't do this!
+..OXx?
+...*.x
+.....?
+------
+
+:8,-,shape(-3)
+
+oOXx??
+..OAx?
+...*.x
+.....?
+------
+
+; lib(A)>2
+
+
+Pattern ED93
+# db new pattern (3.3.6)
+# see century2002:120
+# ab Added e classification (3.3.20)
+
+.....X?        don't make the wrong atari
+..X...?
+...*XO?
+....Ooo
+.......
+-------
+
+:8,edO
+
+.....X?
+..X.a.?
+...*XO?
+....Ooo
+.......
+-------
+
+> replace(a,*)
+
+
+Pattern ED94
+# gf New pattern. (3.3.13)
+
+oo.O?     Significant improvement of eyespace.
+.*.OX     Often sufficient for local life.
+..OXX
+-----
+
+:8,dX
+
+oo.O?
+.*aOB
+..OBB
+-----
+
+;!attack(B) && safe_xmove(a)
+
+
+Pattern ED95
+# gf New pattern. (3.3.14)
+# gf Added constraint. (3.3.17)
+
+...xx
+.O.Xx      fourth line sente kosumi
+..*..
+.....
+.....
+-----
+
+:8,OXea
+
+...xx
+.a.Xx
+..*..
+.....
+.....
+-----
+
+;!weak(a)
+
+
+Pattern ED96
+# ab New pattern (3.3.20)
+# See arend2:120
+
+?....
+O*.X.
+..OX.
+.....
+-----
+
+:8,OXe
+
+?....
+f*.X.
+hgeXd
+..cab
+-----
+
+;!oplay_connect(a,b,c,d,?,g,?,h,e,f)
+> replace(a,*)
+
+
+Pattern ED97
+# gf New pattern. (3.5.3)
+# See gifu03:401
+
+........
+x..O.*.X
+x.......
+........
+........
+--------
+
+:8,OXeda
+
+........
+c..a.*.B
+d.......
+........
+........
+--------
+
+;weak(a) && weak(B) && x_somewhere(c,d)
+
+
+Pattern ED98
+# evand new Pattern (3.5.4)
+
+.....
+O.*.x
+O...x
+.....
+.....
+-----
+
+:8,OXed
+
+.....
+A.*.b
+A...c
+.....
+.....
+-----
+
+;x_alive_somewhere(b,c) && weak(A)
+
+
+Pattern ED99a
+# pp New pattern (3.5.8)
+
+|..X.?     stabilize the corner in double sente
+|..XO.
+|.XO.O
+|.*...
++-----
+
+:8,OXd,reverse_followup(3)
+
+|..X.?
+|..XA.
+|.XO.O
+|.*...
++-----
+
+; weak(A)
+
+
+Pattern ED100
+# gf New pattern. (3.7.8)
+
+.....      cut through to weaken
+X.O..
+.XOX.
+..*..
+.....
+-----
+
+:8,OXae
+
+
+Pattern ED101
+# gf New pattern. (3.7.9)
+
+|oo?
+|.O?
+|.*X
++---
+
+:8,Xd
+
+|oo?
+|.a?
+|.*X
++---
+
+;weak(a)
+
+
+#####################################################################
+#
+# Center defend/attack patterns
+#
+# Moves that threaten to capture, cut, or destroy eyes, and moves
+# defending against this or preventing such moves. Also moves that
+# actually do capture or destroy eyes are included here. 
+#
+######################################################################
+
+
+Pattern CD1
+
+?xx?     protect by drawing back
+XO*.
+XX.O
+
+:8,nOXd
+
+
+Pattern CD3
+
+???      Usually better to atari on this side.
+.*.
+.XO
+XO?
+
+:8,X,followup(5)
+
+???
+.*.
+.Xa
+XO?
+
+;!oplay_attack(*,a)
+
+
+Pattern CD7
+
+?X?      attack eye  
+X.X
+.*.
+
+:|,Xa
+
+?X?
+A.B
+.*.
+
+;weak(A) || weak(B) || !xterri(*)
+
+
+Pattern CD28
+
+xXO?          urgent to attack and defend
+XOX.
+.O*.
+....
+.X.?
+
+:8,ad
+
+
+Pattern CD31
+
+?.X?       vital point
+.*.X
+X.X?
+?X??
+
+:8,Xa
+
+
+Pattern CD39
+
+?Oo?      vital point
+OX.X
+OX?*
+?O..
+?..?
+
+:8,OXa
+
+
+Pattern CD40
+
+?X??       trap
+.*..
+OX..
+?XO.
+
+:8,X
+
+?D??
+.*b.
+cEa.
+?EO.
+
+;lib(E)==2 && !oplay_attack(*,c) && !oplay_defend_both(*,a,b,E,D)
+
+>test_attack_either_move(D,E);
+
+
+# Pattern CD41
+# # gf Too general, removed. See gunnar:87. (3.7.10)
+# 
+# ?o?     don't double atari if it backfires
+# ?..
+# .OX
+# OX*
+# ?.?
+# 
+# :8,-
+# 
+# ?o?
+# ?.b
+# ceX
+# dX*
+# ?a?
+# 
+# ;!oplay_defend_both(*,a,b,c,d,e)
+# 
+# >antisuji(*);
+
+
+Pattern CD43
+
+.X.X       kosumi tesuji
+.*.X
+X.O?
+
+:8,OXa
+
+.X.B
+a*.B
+X.O?
+
+;!attack(B) && oplay_attack(*,a,B)
+
+
+Pattern CD48
+
+?xX??         prevent trouble
+..X.O
+O.O*.
+.....
+.....
+
+:8,OXed
+
+
+Pattern CD49
+
+?Xx??         prevent trouble
+..X.O
+O.O*.
+.....
+.....
+
+:8,OXed
+
+
+Pattern CD55
+
+?...         Double peep
+X.X.
+o*..
+OoX?
+
+:/,OXa
+
+
+Pattern CD56
+
+....         Double peep
+X.X.
+.*..
+O.X.
+
+:8,OXad
+
+gf..
+ibX.
+.*cd
+O.he
+
+;oplay_attack(*,b,c,d,e,d) && oplay_attack(*,b,c,d,e,h)
+;&& oplay_attack(*,c,b,f,g,f) && oplay_attack(*,c,b,f,g,i)
+
+
+Pattern CD64
+# Converse to ED68
+
+?XXO           decrease eye space in sente (unless it kills)
+X.*X
+?XXO
+
+# helper sets followup value
+:8,sXa,throw_in_atari_helper
+
+?XXa
+Xc*A
+?XXb
+
+;lib(A)==2 && lib(a)>1 && lib(b)>1 && proper_eye(c)
+
+
+Pattern CD67
+# Sometimes the cap or another move in the area kills.
+# Always advisable to move out.
+
+??X?           avoid cap      
+?O..
+X.*.
+?...
+
+:\,OXd
+
+??X?
+?a..
+X.*.
+?...
+
+;lib(a)==3
+
+
+Pattern CD76
+
+XOo            atari (not aji keshi)
+OX*
+?.o
+
+:8,X
+
+Xao
+bX*
+?.o
+
+;attack(b) && !defend(b) && !oplay_attack(*,a)
+
+# Estimate a followup value
+>threaten_to_save(b);
+
+
+Pattern CD77
+
+?oo           atari (not aji keshi)            
+X*o
+OXO
+?.o
+
+:8,X
+
+?oo
+X*o
+aXb
+?.o
+
+;attack(a) && !defend(a) && !dead(b)
+
+# Estimate a followup value
+>threaten_to_save(a);
+
+
+Pattern CD79
+# even if X can't cut, this prevents getting sealed
+# this pattern works on second or third line also
+
+?OXX.           tiger's mouth
+..O..
+.*...
+.....
+..X..
+
+:8,OXed
+
+
+Pattern CD82
+# Hard to value accurately. Wild guess that it may be worth 20 points.
+# gf Inappropriate when scoring, disabled in that case. (3.7.2)
+
+?xxxx       capture ladder to eliminate aji
+?xxxx
+O*.xx
+OXO.?
+?O???
+
+:8,O,value(20)
+
+?xxxx
+?xxxx
+O*.xx
+aCb.?
+?O???
+
+;!doing_scoring && (!same_dragon(a,b) || potential_cutstone(C))
+
+
+Pattern CD83
+
+?OOX?       tesuji to break out
+X..X?
+?*...
+??..?
+
+:8,OXed
+
+?AOX?
+Xabf?
+?*cd.
+??e.?
+
+;(lib(A)>1) && oplay_attack(*,a,b,c,d,e,f)
+
+
+Pattern CD87
+# gf Reduced shape value. (3.5.2)
+
+.XO        create cutting points
+.*.
+.XO
+
+:-,OXad,shape(3)
+
+cXO
+a*b
+dXO
+
+# The second move by X at a is intentional and has the effect of X passing.
+;oplay_attack(*,b,b)
+;&& !oplay_attack(*,a,b,a,c,c) && !oplay_attack(*,a,b,a,d,d)
+
+
+Pattern CD88
+#tm removed shape bonus (3.1.22)  (see nngs:700)
+
+X*..         attack 1 stone to defend and probably connect
+O..O
+
+:8,OXcad
+
+a*..
+O..O
+
+; does_attack(*,a)
+
+
+Pattern CD89
+# gf Reduced shape value. (3.5.2)
+
+?OXoo         prevent ponnuki
+.XO*o
+?.Xoo
+
+:8,OXead,shape(3)
+
+?OAoo
+.XO*o
+?.Xoo
+
+;lib(A)>1 || !oplay_defend(*,A)
+
+
+Pattern CD90
+# gf Reduced shape value. (3.5.2)
+
+OXx        extending usually better than capturing, but not at edge
+XOX
+?*.
+???
+
+:8,OXead,shape(3)
+
+bXx
+AOX
+?*.
+???
+
+; lib(A)==1 && lib(b)>1 && does_attack(*,A)
+
+
+Pattern CD91
+# gf Revised constraint. (3.3.18)
+# gf Reduced shape value. (3.5.2)
+
+?XO.        atari to prevent opponent's expansion
+OOX.
+..*.
+
+:8,XEd,shape(3)
+
+?Xa.
+bbX.
+..*.
+
+; alive(b) && attack(a) && !defend(a)
+
+
+Pattern CD92
+# tm Modified (3.1.20) - added constraint
+
+.X.        ponnuki is worth thirty points
+XO*
+.XO
+
+:8,ad,shape(3)
+
+.X.
+XO*
+.aO
+
+; !attack(a)
+
+
+Pattern CD92a
+# db added X class (3.3.5)
+
+.O.        ponnuki is worth thirty points
+OX*
+.Ox
+
+:8,OXead,shape(1)
+
+
+Pattern CD92b
+
+.O.        ponnuki, preventing threat to cut
+OX*
+.OX
+
+:8,Oead,shape(3),reverse_followup(8)
+
+aO.
+OX*
+.OX
+
+; !xplay_attack_either(*,?,a,*,a)
+
+
+Pattern CD93
+# gf Removed fixed value and reduced shape. (3.5.2)
+
+?OX.       break through one way or the other
+?*..
+X.X.
+...O
+
+:8,XBad,shape(3)
+
+?OF.
+?*be
+DcE.
+.d.O
+
+; oplay_break_through(*,b,c,d,D,d,E) && oplay_break_through(*,c,b,e,F,e,E)
+
+
+Pattern CD94
+# gf Split and revised. (3.3.14)
+# gf Reduced shape value. (3.5.2)
+
+????????       jump out
+????????
+........
+..*.....
+X...????
+x.O..???
+
+:8,OXEad,shape(3)
+
+????????
+????????
+........
+..*.....
+X...abcd
+x.O..???
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern CD94b
+# gf Split and revised. (3.3.14)
+# gf Reduced shape value. (3.5.2)
+
+????????       jump out
+????????
+........
+..*.....
+X...????
+O.O..???
+
+:8,OXEad,shape(3)
+
+????????
+????????
+........
+..*.....
+Xe..abcd
+f.O..???
+
+; x_alive_somewhere(a,b,c,d) && oplay_connect(*,e,*,f)
+
+
+Pattern CD95
+# One point to the left is sometimes better
+
+oO..          seal the opponent
+....
+X.*.
+....
+oO..
+
+:-,OXEad,shape(2)
+
+
+Pattern CD96
+
+.O?           hane, threatening capture
+...
+X*.
+O.X
+
+:8,OXad,shape(3)
+
+.O?
+...
+B*.
+OaX
+
+; oplay_attack(*,a,B)
+
+
+Pattern CD99
+# gf Revised constraint. (3.1.14)
+# gf Added !doing_scoring since this can generate a losing ko threat.
+#    We might want to take it out entirely. (3.3.17)
+
+OX        if a cutting stone can't be caught, 
+X*        play in opponent's territory
+
+:8,OX,followup_value(3)
+
+OA
+B*
+
+;!doing_scoring && !attack(A) && !attack(B) && xterri(*)
+
+
+# FIXME: The two following patterns may be superfluous due to the
+#        atari_atari code.
+
+Pattern CD102
+
+*X?          don't help the opponent cut
+O.O
+...
+
+:8,OX,shape(-3)
+
+*X?
+OaO
+cb.
+
+; xplay_attack(a,b,c,c) && !oplay_attack(*,a,b,c,c)
+
+
+Pattern CD104a
+# gf Revised constraint.
+# gf Split pattern. We can't have eE classification unless b is alive. (3.1.32)
+
+...          atari using dead stone
+.*.
+OX.
+XO?
+
+:8,Ed
+
+...
+.*.
+bX.
+XA?
+
+;lib(b)>1 && alive(b) && attack(A) && !defend(A)
+
+
+Pattern CD104b
+# gf Revised constraint.
+# gf Split pattern. We can't have eE classification unless b is alive. (3.1.32)
+
+...          atari using dead stone
+.*.
+OX.
+XO?
+
+:8,d,shape(3)
+
+...
+.*.
+bX.
+XA?
+
+;lib(b)>1 && attack(A) && !defend(A)
+
+
+Pattern CD105
+
+?.X?        eliminate aji and danger of misreading!
+O.*O
+x...
+xxxx
+
+:8,Ot
+
+?.A?
+O.*b
+x...
+xxxx
+
+; dead(A) && effective_size(A)>8 && lib(b)<=4
+
+
+Pattern CD107
+# db added (3.1.8)
+# gf Added O classification. (3.1.12)
+# evand modified (3.5.4)
+
+?x.??
+xX..?        good shape keima
+..*.?
+O...?
+
+:8,OXead
+
+?x.??
+xX..?
+.a*.?
+Abc.?
+
+; !dead(A) && oplay_attack(*,a,b,c,c)
+
+
+Pattern CD108
+# db added (3.1.8)
+# Exception to CD107
+
+?xX..       bad shape keima
+O..*.
+XO...
+
+:8,-,shape(-3)
+
+
+Pattern CD109
+# gf New pattern. (3.3.18)
+
+.OX        defend cut to attack
+.*O
+.OX
+
+:-,Xa,shape(2)
+
+.cX
+.*a
+.bX
+
+;lib(a)==1 && (alive(b) || alive(c))
+;&& (xplay_attack(*,b) || xplay_attack(*,c))
+
+
+######################################################################
+#
+# Edge joseki patterns.
+#
+# Standard invasions of wide extensions, sequences following
+# attachment under edge stones, and other standard patterns
+# often warranting a j or J classification.
+#
+######################################################################
+
+
+Pattern EJ1
+
+?....            sacrifice cut
+oO*X.
+o.XO.
+.....
+-----
+
+:8,sEdJ
+
+
+Pattern EJ2
+
+?....          hane if attached under fourth line stone
+x.O..
+?.X*.
+?....
+?....
+-----
+
+:8,OedJ
+
+
+Pattern EJ2b
+
+.....          create cutting points while strengthening own stones
+.O.O.
+.X*X.
+.....
+.....
+-----
+
+:8,edJ
+
+
+Pattern EJ3
+
+?...?          block on top if 2 space extension is invaded
+..*..
+O.XO.
+.....
+.....
+-----
+
+:8,EadJ
+
+
+Pattern EJ4
+#tm modified (3.1.18)
+#   added ? column.
+
+...*.?     continuation -- never play 'a' here
+.OOX.o
+..XOX?
+.....?
+------
+
+:8,Edj
+
+...*.?
+.OOX.o
+.aXOX?
+.....?
+------
+
+>antisuji(a);
+
+
+Pattern EJ6
+
+...O.?    continuation
+.OOX*.
+..X.X.
+...X.?
+------
+
+:8,Eaj
+
+
+Pattern EJ7
+
+?????...?
+........?
+.O..O.X.o
+......*..
+.........
+---------
+
+:8,ed
+
+?????...?
+........?
+.O..O.A.o
+......*..
+.........
+---------
+
+;!weak(A)
+
+
+Pattern EJ7b
+#gf New pattern. (3.1.12)
+
+?????...?
+........?
+.O..O.X.o
+.....*OX.
+.........
+---------
+
+:8,ed
+
+
+Pattern EJ8
+
+??X.....        extend from tsukenobi
+X.XO....
+XOO...*.
+........
+........
+--------
+
+:8,ed
+
+
+Pattern EJ9
+
+..*.?             tsukenobi shape
+O.OX?
+..X.x
+....?
+....?
+-----
+
+:8,Ed
+
+
+Pattern EJ12
+# Invade if we have two ladders on our side.
+
+ooooo       invade
+.oooo
+...oo
+X....
+..*.X
+.....
+.....
+-----
+
+:8,I
+
+ooooo
+.oooo
+.e.oo
+IcB..
+gD*FX
+..H..
+.....
+-----
+
+;oplay_attack(*,B,c,D,e,B) && oplay_attack(*,B,c,D,e,F,g,H,I);
+
+
+Pattern EJ13
+
+.....       invade
+.....
+.....
+X.*.X
+.....
+.....
+-----
+
+:8,I
+
+.....
+..a..
+.....
+X.*.X
+.....
+.....
+-----
+
+;!xmoyo(a)
+
+
+Pattern EJ13b
+# gf New pattern. (3.3.13)
+
+o......     invade
+o......
+O.X.*.X
+o......
+o......
+-------
+
+:8,Ia
+
+o......
+o......
+a.X.*.X
+o......
+o......
+-------
+
+;!weak(a)
+
+
+Pattern EJ14
+
+......       invade
+......
+......
+X.*..X
+......
+......
+------
+
+:8,I
+
+......
+..a...
+......
+X.*..X
+......
+......
+------
+
+;!xmoyo(a)
+
+
+Pattern EJ15
+
+??....?      cap stone on third line
+..*....
+.......
+..X..O.
+.......
+.......
+-------
+
+:8,Ea
+
+??....?
+..*....
+.......
+a.X..O.
+.......
+.......
+-------
+
+;!xmoyo(a)
+
+
+Pattern EJ17
+
+.....          cut!
+.X*O.
+.OX..
+.....
+.....
+-----
+
+:8,adJ
+
+
+Pattern EJ18
+# Override capturing single X stone.
+
+?oXXOOo       Connect underneath.
+oOXOX.o
+o.*O..o
+o.....o
+-------
+
+:8,ed
+
+?oXXOOo
+oOXOXao
+o.*Ob.o
+o..c..o
+-------
+
+>antisuji(a);
+>antisuji(b);
+>antisuji(c);
+
+
+Pattern EJ19
+# Override capturing single X stone.
+
+???.???       Punish overplay.
+?o*XOOo
+oOXOX.o
+o.XO..o
+o.....o
+-------
+
+:8,ad
+
+???.???
+?o*XOOo
+oOXOXao
+o.XOb.o
+o..c..o
+-------
+
+>antisuji(a);
+>antisuji(b);
+>antisuji(c);
+
+
+Pattern EJ20
+
+?x.XOOo       Connect underneath.
+oOXOX.o
+o.*O..o
+o.....o
+-------
+
+:8,ed
+
+?x.XOOo
+oOXOXao
+o.*Ob.o
+o..c..o
+-------
+
+>antisuji(a);
+>antisuji(b);
+>antisuji(c);
+
+
+Pattern EJ21
+
+....?             tsukeosae shape
+O.OX?
+.*X.x
+....?
+....?
+-----
+
+:8,ed
+
+
+Pattern EJ22
+
+oo.X.?    continuation
+?..*..
+?OOX.O
+?.XOX.
+?.....
+------
+
+:8,a
+
+
+Pattern EJ23
+
+oo.X.?    continuation
+?..O*.
+?OOXXO
+?.XOX.
+?.....
+------
+
+:8,a
+
+
+Pattern EJ24
+
+XX..       extend on fourth line if pushed
+.O*.
+....
+....
+....
+----
+
+:8,ed
+
+
+Pattern EJ25
+
+XXX..       extend on fourth line if pushed
+.OO*.
+.....
+.....
+.....
+-----
+
+:8,ed
+
+
+Pattern EJ26
+
+XXXX..       extend on fourth line if pushed
+.OOO*.
+......
+......
+......
+------
+
+:8,ed
+
+
+Pattern EJ27
+
+........            wedge in after invasion
+...X*X..
+.X.O....
+........
+........
+--------
+
+:8,d
+
+
+Pattern EJ28
+
+....X...            follow up
+..XXOX..
+.X.OO*..
+........
+........
+--------
+
+:8,ed
+
+
+Pattern EJ29
+
+....X...            follow up
+..XXOXX.
+.X.OOO*.
+........
+........
+--------
+
+:8,ed
+
+
+Pattern EJ30
+
+oo.X.?    continuation
+?.....
+?O.X*O
+?..OX.
+?.....
+------
+
+:8,a
+
+oo.D.?
+?.....
+?a.C*b
+?.eOX.
+?.....
+------
+
+>add_connect_move(a,b);
+>add_cut_move(C,D);
+>antisuji(e);
+
+
+Pattern EJ31
+
+??..????    connect out beneath
+xxX.....
+x.O*.X.O
+x.......
+?.......
+--------
+
+:8,ed
+
+?a..?b??
+xxX.....
+x.O*.X.O
+x.......
+?.......
+--------
+
+;!oarea(a) && !xmoyo(b)
+
+
+Pattern EJ32
+
+??..????    connect out beneath, continuation
+xxXX....
+x.OO*X.O
+x.......
+?.......
+--------
+
+:8,ed
+
+?a..?b??
+xxXX....
+x.OO*X.O
+x.......
+?.......
+--------
+
+;!oarea(a) && !xmoyo(b)
+
+
+Pattern EJ33
+# gf Sometimes it's better to play one step to the left. See
+# nngs:1180. (3.3.7)
+# gf Revised classification. (3.5.2)
+
+...XX          common important follow up 
+.O.*O
+.....
+.....
+-----
+
+:8,XCd
+
+
+Pattern EJ34
+
+....O.       break through
+.X.OX.
+...X*.
+......
+......
+------
+
+:8,J
+
+
+Pattern EJ35
+
+....O.       break through
+.X.OXX
+..*XO.
+......
+......
+------
+
+:8,J
+
+
+Pattern EJ37
+
+..X...      hane after attachment
+......
+.XO..O
+.*....
+......
+------
+
+:8,J
+
+
+Pattern EJ39
+# sometimes the solid connection would be better
+# gf Removed fixed value, added d classification. (3.5.2)
+
+?.XX.O       draw back to defend
+.O.O*.
+......
+......
+------
+
+:8,d
+
+?.XX.O
+.O.O*.
+a.....
+......
+------
+
+> antisuji(a)
+
+
+Pattern EJ40
+# This pattern is sometimes too general. But more often than not, this is
+# worth doing.
+
+XXx??        push to prevent opponent's block
+OOXX?
+..O*.
+.....
+-----
+
+:8,OXt
+
+
+Pattern EJ41
+
+?..O?        solid connection
+xX*OX
+..OXX
+.....
+-----
+
+:8,OJ
+
+?..O?
+xX*OX
+.aOXX
+.....
+-----
+
+>antisuji(a);
+
+
+Pattern EJ42
+
+.....
+..*..        jump
+....X
+X.O.x
+.....
+.....
+-----
+
+:8,t
+
+
+Pattern EJ43
+# gf Revised. (3.3.16)
+
+?...?        connect after peep
+x.O.x
+x.*Xx
+x.O.x
+?...?
+?...?
+-----
+
+:8,OJ
+
+
+Pattern EJ44
+# gf Reduced shape value. (3.5.2)
+
+......        almost an antisuji
+oO.X..
+..XO*.
+......
+......
+------
+
+:8,-,shape(-3)
+
+
+Pattern EJ45
+
+?....?       hane making shape in the center
+?.*..?
+?.XOOo
+?..XX?
+?....?
+?....?
+------
+
+:8,J
+
+?....?
+?.*..?
+?.XBBo
+?.aXX?
+?....?
+?....?
+------
+
+; !safe_omove(a) && !oplay_attack(*,B)
+
+
+Pattern EJ46
+# tm modified (3.1.23)  (see arend:3)
+
+.X.      Defend after the peep
+O*O
+...
+...
+...
+---
+
+:8,XeCd
+
+
+Pattern EJ47
+
+...........       invade on the third line
+...........
+.........xx
+X...*....xx
+...........
+...........
+-----------
+
+:8,t,shape(2)
+
+...........
+...........
+.........ab
+X...*....cd
+...........
+...........
+-----------
+
+; x_alive_somewhere(a,b,c,d)
+
+
+Pattern EJ49b
+# Actually 'a' is often playable
+
+..*..         connect on the outside
+OOX.O
+.XOX.
+.....
+.....
+-----
+
+:8,sEj
+
+..*..
+OOX.O
+bXOX.
+..a..
+.....
+-----
+
+>antisuji(a);
+>antisuji(b);
+
+
+Pattern EJ50
+# tm Modified (3.1.22) (see nngs:1740)
+
+??.....??     good extension
+?.O.....x
+OO....*.x
+.........
+.........
+---------
+
+:8,sed,shape(3)
+
+
+Pattern EJ51
+
+......       connection is urgent for local shape
+......
+.O*...
+.XO...
+X.....
+......
+------
+
+:8,J
+
+......
+......
+.O*...
+.AO...
+X.....
+......
+------
+
+; !attack(A)
+
+
+Pattern EJ52
+
+.....        extend to stabilize shape
+..*.O
+xXO..
+xxX.O
+.....
+.....
+-----
+
+:8,J
+
+
+Pattern EJ53
+
+.......xxx       extend to stabilize group
+......OO.X
+..*...OXXx
+..........
+..........
+----------
+
+:8,J
+
+
+Pattern EJ54
+
+......|          block the corner
+X.O...|        
+..OX..|
+.*X...|
+......|
+------+
+
+:8,J
+
+
+Pattern EJ55
+
+.......          tiger's mouth
+..X.O..
+..*.OX.
+...OXxx
+.....x.
+-------
+
+:8,J
+
+.......
+..X.O..
+..*.OX.
+...OXab
+.....c.
+-------
+
+; x_alive_somewhere(a,b,c)
+
+
+Pattern EJ56
+
+.......?       pull back to stabilize group
+..OX..oo
+..XO*.oo
+.......o
+........
+--------
+
+:8,J
+
+.......?
+..OX..ab
+..XO*.cd
+.......o
+........
+--------
+
+; o_alive_somewhere(a,b,c,d)
+
+
+Pattern EJ57
+
+??.x?          stop effective cut and probably connect
+OOX*O
+.XO..
+.....
+-----
+
+:8,cJ
+
+??.x?
+OOA*O
+.XO..
+.....
+-----
+
+;!attack(A)
+
+
+Pattern EJ58
+
+.......        urgent! attach at the top
+oo.*.O?
+oO.X.oo
+o......
+.......
+-------
+
+:8,J
+
+
+Pattern EJ59
+
+o...          seal with sente
+o.*O
+oOXX
+....
+....
+----
+
+:8,J
+
+o...
+o.*O
+oOAA
+....
+....
+----
+
+; owl_threatens(*,A)
+
+
+Pattern EJ60
+# sometimes the double hane is better
+
+..oOO     extend with sente
+.*OXX
+..X..
+.....
+-----
+
+:8,J
+
+..oOO
+.*OAA
+..X..
+.....
+-----
+
+; owl_threatens(*,A)
+
+
+Pattern EJ62a
+# gf Split and revised. (3.5.2)
+
+XX...       push to expand threatened dragon
+OOX..
+..*..
+.....
+-----
+
+:8,OJ
+
+XX...
+aaX..
+..*..
+.....
+-----
+
+;owl_threatens(*,a)
+
+
+Pattern EJ62b
+# gf Split and revised. (3.5.2)
+
+XX...       push to expand threatened dragon
+OOX..
+..*..
+.....
+-----
+
+:8,d,followup(8)
+
+XX...
+aaX..
+..*..
+.....
+-----
+
+;critical(a)
+
+
+Pattern EJ63a
+# gf Split and revised. (3.5.2)
+
+XX....      push again to expand threatened dragon
+OOXX..
+..O*..
+......
+------
+
+:8,J
+
+XX....
+aaXX..
+..O*..
+......
+------
+
+;owl_threatens(*,a)
+
+
+Pattern EJ63
+# gf Split and revised. (3.5.2)
+
+XX....      push again to expand threatened dragon
+OOXX..
+..O*..
+......
+------
+
+:8,d,followup(8)
+
+XX....
+aaXX..
+..O*..
+......
+------
+
+;critical(a)
+
+
+Pattern EJ64
+
+XX....      atari after double hane
+OOX*..
+..OX..
+......
+------
+
+:8,J
+
+BBa...
+OOX*..
+..OX..
+......
+------
+
+; !oplay_attack(a,*,B)
+
+
+Pattern EJ65
+
+?X........       extend from ponnuki to make a base
+?XO....*.x
+XO.O......
+..O.......
+----------
+
+:8,J
+
+?X........
+?XO....*.x
+aO.O......
+..O.......
+----------
+
+; !attack(a)
+
+
+Pattern EJ66
+
+?X......x       extend from ponnuki to make a base
+?XO...*.x
+XO.O.....
+..O......
+---------
+
+:8,J
+
+?X......x
+?XO...*.x
+aO.O.....
+..O......
+---------
+
+; !attack(a)
+
+
+Pattern EJ67
+
+........      standard move to break connection and move out
+........
+....*...
+.X.O....
+.....X..
+........
+........
+--------
+
+:8,J
+
+
+Pattern EJ68
+
+........      standard move to break connection and move out
+........
+....O...
+.X.O....
+..*X.X..
+........
+........
+--------
+
+:8,J
+
+
+Pattern EJ69
+
+........      standard move to break connection and move out
+........
+....O...
+.XXO....
+..OX*X..
+........
+........
+--------
+
+:8,J
+
+
+Pattern EJ71
+
+........      standard move to break connection and move out
+........
+....O...
+.XXO....
+..OXOX..
+...X*...
+........
+--------
+
+:8,J
+
+
+Pattern EJ72
+# If the right edge is the fourth line this is
+# not too good because it provokes X to make territory
+# but there is no really good move in this case.
+
+.....        jump again
+..*..
+....X
+..O..
+....X
+X.O..
+.....
+.....
+-----
+
+:8,J
+
+
+Pattern EJ73
+
+x..........      invade open space
+x..........
+X..........
+x.....*....
+...........
+...........
+-----------
+
+:8,t
+
+
+Pattern EJ74
+
+??X...          defend cut
+xXXO..
+XOO.*.
+......
+......
+------
+
+:8,J
+
+
+Pattern EJ75
+#tm modified (3.1.22) (see trevorc:420)
+#FIXME: Pattern still seems a bit too general
+#   consider adding appropriate constraint.
+
+.X.??           connect under
+O*.oo
+.....
+.....
+-----
+
+:8,XeE
+
+.X.??
+O*.ab
+.....
+.....
+-----
+
+; o_alive_somewhere(a,b)
+
+
+Pattern EJ76
+
+..X...     tsukenobi
+X.XO..
+.*O...
+......
+......
+------
+
+:8,j
+
+
+Pattern EJ77
+
+??oo...       connection is urgent
+?XO....
+?XO*X..
+xxXO...
+x?.....
+-------
+
+:8,j
+
+??ab...
+?XO....
+?XO*X..
+cdXO...
+e?.....
+-------
+
+; o_alive_somewhere(a,b) && x_alive_somewhere(c,d,e)
+
+
+Pattern EJ78
+
+.....         seal the side
+....O
+.*O.?
+O.XX?
+.....
+.....
+-----
+
+:8,j
+
+
+Pattern EJ79
+
+|..X??x        make a base
+|.O.X.x
+|.....x
+|..O...
+|......
+|..*...
+|......
+|..xxx?
+
+:8,j
+
+|..X??b
+|.O.X.a
+|.....x
+|..O...
+|......
+|..*...
+|......
+|..cdx?
+
+; x_alive_somewhere(a,b) && x_alive_somewhere(c,d)
+
+
+Pattern EJ80
+# db generalized (3.1.25)
+
+|...O.x        even a computer connects after nozoki
+|..X*.x
+|...O.x
+|....??
+|..x.??
+
+:8,J
+
+
+Pattern EJ81
+# db added (3.1.4)
+# gf Revised. (3.3.14)
+
+?....x..       seal the side
+?O.O....
+o..*.X.x
+........
+........
+--------
+
+:8,j
+
+?....x..
+?O.O....
+o..*.Abx
+........
+........
+--------
+
+;x_visible_along_edge(A,b)
+
+
+Pattern EJ81b
+# gf New pattern. (3.3.14)
+
+?....X....      seal the side to attack
+?O.O...ooo
+o..*.X.ooo
+..........
+..........
+----------
+
+:8,j
+
+?....X....
+?O.O...def
+o..*.X.abc
+..........
+..........
+----------
+
+;o_somewhere(a,b,c,d,e,f)
+
+
+Pattern EJ81c
+# gf New pattern. (3.3.14)
+# FIXME: May wish to prefer other pincers in some situations.
+
+?.........      pincer
+?O.O......
+o....X.*..
+..........
+..........
+----------
+
+:8,j
+
+?.........
+?O.O......
+o....Ab*..
+..........
+..........
+----------
+
+;o_visible_along_edge(A,b)
+
+
+Pattern EJ82
+# db added (3.1.4)
+
+?oO..       answer the peep!
+XXO..
+?O*X.
+.....
+-----
+
+:8,j
+
+?oA..
+XXA..
+?O*X.
+.....
+-----
+
+; !dead(A)
+
+
+Pattern EJ84
+# gf Made pattern more powerful. (3.1.9)
+# gf Added one more replacement point. (3.1.10)
+
+......       Atari before connecting
+..*...
+X.XO..
+.XO...
+......
+......
+------
+
+:8,J,reverse_followup(10)
+
+......
+..*c..
+X.XO..
+.XObe.
+.fad..
+......
+------
+
+>replace(a,*);
+>replace(b,*);
+>replace(c,*);
+>replace(d,*);
+>replace(e,*);
+>replace(f,*);
+
+
+Pattern EJ85
+# db added (3.1.8)
+
+??O.X?        Important sente block
+?XO...
+..X*..
+......
+------
+
+:8,OJ
+
+
+Pattern EJ86
+# db added (3.1.9)
+
+?.....         extend automatically
+xX..oo
+XO*.oo
+?.....
+?.....
+------
+
+:8,XJ
+
+?.....
+xX..ab
+XO*.cd
+?.....
+?.....
+------
+
+; o_alive_somewhere(a,b,c,d)
+
+
+Pattern EJ87
+#db added (3.1.9)
+
+??....       extend after the top attachment
+..X...
+..O*..
+......
+......
+......
+------
+
+:8,J
+
+
+Pattern EJ88
+# gf New pattern. (3.1.17)
+
+......       connect after invasion
+......
+.O.*.O
+...X.O
+......
+......
+------
+
+:8,J
+
+
+Pattern EJ89
+# gf New pattern. (3.1.17)
+
+......       connect after invasion
+......
+.O.X.O
+...*.O
+......
+......
+------
+
+:8,J
+
+
+Pattern EJ90
+# db New pattern (3.1.26)
+
+?XX....         extend on the fourth line
+..O*...
+O......
+.......
+.......
+-------
+
+:8,J
+
+
+Pattern EJ91
+# db New pattern (3.1.26)
+# gf Demoted from J to j. See e.g. trevorc:1180 and nngs4:485. (3.7.1)
+
+?.....         large block affecting stability of both
+..O.oo
+.X*..o
+......
+......
+------
+
+:8,j
+
+
+Pattern EJ92
+# db new pattern (3.1.28)
+
+oo.........       extend to build moyo
+oo.....*...
+oooo...OXX.
+ooo.....O.X
+.........ox
+...........
+-----------
+
+:8,j
+
+oo.........
+oo.....*...
+abcg..iOXX.
+def.....O.X
+.........hx
+...........
+-----------
+
+; o_alive_somewhere(a,b,c,d,e,f,g)
+> replace(h,*);
+> replace(i,*)
+
+
+Pattern EJ93
+# db new pattern (3.1.32)
+# db modified (3.3.9)
+
+|..xx.......            stand to defend
+|...........
+|...X.*..xxx
+|....XO..xxx
+|...........
+|...........
++-----------
+
+:8,j
+
+|..xx.......
+|...........
+|...X.*..xxx
+|....XO..xxx
+|....cba....
+|...........
++-----------
+
+> replace(a,*);
+> replace(b,*);
+> replace(c,*)
+
+
+Pattern EJ94
+# db new pattern (3.3.3)
+# See nngs1:53
+
+.....       Block!
+..O..
+..X*.
+.X.O.
+.....
+.....
+-----
+
+:8,j
+
+.....
+.aO..
+..X*.
+.X.O.
+.....
+.....
+-----
+
+> replace(a,*)
+
+
+Pattern EJ95
+# db added (3.3.6)
+
+.....?         attach below
+..X.O?
+O.*.oo
+......
+......
+------
+
+:8,j
+
+
+Pattern EJ96
+# db added (3.3.6)
+
+..XXOO        Don't allow the cut with sente!
+.OXOX.
+..*O..
+......
+------
+
+:8,j
+
+..XXOO
+.OXOA.
+..*O..
+......
+------
+
+; !oplay_defend(*,A)
+
+
+Pattern EJ97
+# db added (3.3.6)
+
+......         seal the opponent, connecting loosely
+oo.*O.
+ooo.XX
+......
+......
+------
+
+:8,j
+
+......
+ab.*O.
+cde.XX
+......
+......
+------
+
+; o_alive_somewhere(a,b,c,d,e)
+
+
+Pattern EJ98
+# db added (3.3.7)
+
+O..X.?           connect
+O..*O.
+......
+......
+------
+
+:8,j
+
+
+Pattern EJ99
+# db added (3.3.14)
+# see nngs3:330 where GNU thinks e is an owl attack
+
+........        seal the opponent
+oooO*.oo
+ooOXX.oo
+o.......
+........
+--------
+
+:8,j,shape(3)
+
+........
+oooO*.ab
+ooOXX.cd
+o.e.....
+........
+--------
+
+; o_somewhere(a,b,c,d)
+> replace(e,*)
+
+
+Pattern EJ100
+# db added (3.3.14)
+
+|...O...     seal the opponent
+|.......
+|...X*..
+|...XO..
+|..XOO..
+
+:8,jda
+
+
+Pattern EJ101
+# gf New pattern. (3.5.3)
+# See nngs:1020.
+
+......X
+.O..OX.
+.....*O
+.......
+-------
+
+:8,jcd
+
+
+######################################################################
+#
+# Seki patterns.
+#
+# Patterns to reduce territory into sekis.
+#
+# seki_helper(a) verifies that no string surrounding a can be
+# captured.
+#
+######################################################################
+
+
+Pattern S1
+# With no supporting stones, a 5 points gote seki.
+# If X does not reply, the corner point makes ko.
+# but this is not a good ko because it takes 4 moves
+# to remove the X stones, while O loses the seki
+# if it loses the ko. Moreover if X immediately plays
+# atari at one 1-2 point we have to answer at the second
+# 1-2 point, after which X can leave it without aji. So
+# this move is gote and no folloup value is assigned.
+
+|XX??
+|.XX?
+|o*XX
+|.o.X
++----
+
+:/,sXe,terri(5)
+
+|AA??
+|.AA?
+|o*AA
+|.o.A
++----
+
+;lib(A)==3 && seki_helper(A)
+
+
+Pattern S2
+# With no enemy stones, 5 points gote to defend territory.
+
+|OO??
+|.OO?
+|*xOO
+|.x.O
++----
+
+:8,Oe,terri(6)
+
+|aa??
+|.aa?
+|*xaa
+|.x.a
++----
+
+;lib(a)<=3 && seki_helper(a)
+
+
+Pattern S3
+# 7 points sente seki. If X does not answer, we can kill,
+# which at the very least is worth another 20 points.
+
+|XXXXX
+|..*.X
+|....X
++-----
+
+:8,sXe,terri(7),followup(20)
+
+|AAAAA
+|..*.A
+|.b..A
++-----
+
+;lib(A)==5 && seki_helper(A)
+
+>replace(b,*)
+
+
+Pattern S4
+# 7 points reverse sente to defend territory.
+
+|OOOOO
+|..*.O
+|....O
++-----
+
+:8,Oe,terri(7),reverse_followup(20)
+
+|aaaaa
+|..*.a
+|....a
++-----
+
+;lib(a)==5 && seki_helper(a)
+
+
+Pattern S5
+# Explicit followup to S4.
+
+|OOOOO
+|.*O.O
+|.X..O
++-----
+
+:8,Oe,terri(7)
+
+|aaaaa
+|.*a.a
+|.X..a
++-----
+
+;lib(a)==5 && seki_helper(a)
+
+
+Pattern S6
+# 6 points seki. Whether this is gote or sente depends on
+# the ko threat situation. 
+
+|XX??
+|.XXX
+|.*.X
+|...X
++----
+
+:8,sXe,terri(6),followup(14)
+
+|AA??
+|.AAA
+|.*.A
+|...A
++----
+
+;lib(A)==4 && seki_helper(A)
+
+
+Pattern S6b
+# 6 points seki. Explicit followup to S6.
+
+|XX??
+|.XXX
+|XO.X
+|.*.X
++----
+
+:8,sXe,terri(6),followup(14)
+
+|AA??
+|.AAA
+|XO.A
+|.*.A
++----
+
+;lib(A)==3 && seki_helper(A)
+
+
+Pattern S6c
+# Eliminate a potential 1000-year ko for the life of the entire
+# corner. This moves secures a seki.
+
+|OO??
+|.OOO
+|OX.O
+|.X*O
++----
+
+:8,Oe,terri(14)
+
+|aa??
+|.aaa
+|OX.a
+|.X*a
++----
+
+;lib(a)==3 && seki_helper(a)
+
+
+Pattern S7
+# 6 points seki. See S6.
+
+|OO??
+|.OOO
+|.*.O
+|...O
++----
+
+:8,Oe,terri(6),reverse_followup(14)
+
+|aa??
+|.aaa
+|.*.a
+|...a
++----
+
+;lib(a)==4 && seki_helper(a)
+
+
+Pattern S8
+# gf New pattern. (3.5.3)
+# 7 points gote seki. See seki:301.
+
+|XX???
+|.XXX?
+|.*.XX
+|....X
++-----
+
+:8,sXe,terri(7)
+
+|AA???
+|.AAA?
+|.*.AA
+|....A
++-----
+
+;lib(A)==4 && seki_helper(A)
+
+
+Pattern S9
+# gf New pattern. (3.5.3)
+# 7 points seki. Compare S8. See seki:302
+
+|OO???
+|.OOO?
+|.*.OO
+|....O
++-----
+
+:8,sXe,terri(7)
+
+|aa???
+|.aaa?
+|.*.aa
+|....a
++-----
+
+;lib(a)==4 && seki_helper(a)
+
+
+Pattern S10
+# gf New pattern. (3.5.3)
+# 8 points (mostly) sente seki. See seki:801.
+
+|XXX??
+|..XX?
+|.*.XX
+|....X
++-----
+
+:8,sXe,terri(8),followup(16)
+
+|AAA??
+|..AA?
+|.*.AA
+|....A
++-----
+
+;lib(A)==4 && seki_helper(A)
+
+
+Pattern S10b
+# gf New pattern. (3.5.3)
+# Best way to secure seki. See seki:803.
+
+|OOO??
+|..OO?
+|.X*OO
+|....O
++-----
+
+:8,sXe,terri(8),reverse_followup(16)
+
+|aaa??
+|..aa?
+|bX*aa
+|....a
++-----
+
+;lib(a)==4 && seki_helper(a)
+
+>replace(b,*);
+
+
+Pattern S10c
+# gf New pattern. (3.5.3)
+# Make seki in sente, not gote. See seki:808.
+
+|XXX??
+|..XX?
+|.O*XX
+|..X.X
++-----
+
+:8,sXe,terri(8),followup(16)
+
+|AAA??
+|..AA?
+|bO*AA
+|.cX.A
++-----
+
+;lib(A)==4 && seki_helper(A)
+
+>replace(b,*);
+>replace(c,*);
+
+
+Pattern S10d
+# gf New pattern. (3.5.3)
+# Make seki in sente, not gote. See seki:810.
+# Only replace pattern here. The seki_helper doesn't apply and the
+# semeai code should find either a or * if there's a chance to make seki.
+
+|XXX??
+|*.XX?
+|.OOXX
+|.XX.X
++-----
+
+:8,sX
+
+|XXX??
+|*.XX?
+|aOOXX
+|.XX.X
++-----
+
+>replace(a,*);
+
+
+Pattern S11
+# gf New pattern. (3.5.3)
+# 8 points (mostly) reverse sente seki. Compare S10. See seki:802.
+
+|OOO??
+|..OO?
+|.*.OO
+|....O
++-----
+
+:8,sXe,terri(8),reverse_followup(16)
+
+|aaa??
+|..aa?
+|.*.aa
+|....a
++-----
+
+;lib(a)==4 && seki_helper(a)
+
+
+Pattern S12
+# gf New pattern. (3.5.3)
+# 9 points gote seki. See seki:901.
+
+|XXXX?
+|...X?
+|.*.XX
+|....X
++-----
+
+:8,sXe,terri(9)
+
+|AAAA?
+|...A?
+|.*.AA
+|....A
++-----
+
+;lib(A)==5 && seki_helper(A)
+
+
+Pattern S13
+# gf New pattern. (3.5.3)
+# 9 points seki. Compare S12. See seki:902.
+
+|OOOO?
+|...O?
+|.*.OO
+|....O
++-----
+
+:8,sXe,terri(9)
+
+|aaaa?
+|...a?
+|.*.aa
+|....a
++-----
+
+;lib(a)==5 && seki_helper(a)
+
+
+Pattern S14b
+# gf New pattern. (3.5.3)
+# Make sente seki. See seki:905.
+
+|OOOO?
+|.X.O?
+|.XOOO
+|..*.O
++-----
+
+:8,sX
+
+|OOOO?
+|.X.O?
+|.XOOO
+|.a*.O
++-----
+
+> replace(a,*);
+
+
+Pattern S15
+# gf New pattern. (3.7.12)
+# 9 points gote seki. See seki:1201.
+
+|XX???
+|.XX??
+|..XX?
+|.*.XX
+|....X
++-----
+
+:8,sXe,terri(9)
+
+|AA???
+|.AA??
+|..AA?
+|.*.AA
+|....A
++-----
+
+;lib(A)==4 && seki_helper(A)
+
+
+Pattern S16
+# gf New pattern. (3.7.12)
+# 9 points gote seki. Compare S15. See seki:1202.
+
+|OO???
+|.OO??
+|..OO?
+|.*.OO
+|....O
++-----
+
+:8,sXe,terri(9)
+
+|aa???
+|.aa??
+|..aa?
+|.*.aa
+|....a
++-----
+
+;lib(a)==4 && seki_helper(a)
+
+
+######################################################################
+#
+# High handicap patterns.
+#
+# Patterns to place additional handicap stones when white starts by
+# passing. After white's first move these patterns are not considered
+# any more, due to the high_handicap_helper.
+#
+######################################################################
+
+
+Pattern HH1
+
+.......   Add stone where the distance is large.
+.......
+O..*..O
+.......
+.......
+
+:+,-,value(40),high_handicap_helper
+
+
+Pattern HH2
+# gf Corrected symmetry. (3.1.23)
+
+.......   Add stone where the distance is large.
+.......
+...*...
+O.....O
+.......
+.......
+
+:|,-,value(40),high_handicap_helper
+
+
+Pattern HH3
+
+?..o..?          Make iron pillar.
+?.....?
+?..*..?
+?..O..?
+?.....?
+?.....?
+-------
+
+:|,-,value(30),high_handicap_helper
+
+
+Pattern HH4
+
+..o..   Make iron pillar.
+.....
+..O..
+..*..
+.....
+.....
+-----
+
+:|,-,value(30),high_handicap_helper
+
+
+Pattern HH5
+
+.....   Jump towards center.
+..*..
+.....
+..O..
+.....
+.....
+-----
+
+:|,-,value(30),high_handicap_helper
+
+
+Pattern HH6
+
+|......   Corner enclosure from 3-3.
+|......
+|..O.*.
+|......
+|......
++------
+
+:8,-,value(30),high_handicap_helper
+
+
+Pattern HH7
+
+.....     Jump into nowhere
+.....
+..*..
+.....
+.....
+ooOoo
+
+:8,-,value(20),high_handicap_helper
+
+
+Pattern HH8
+
+.....     Yet another third line stone.
+O...o
+o.*.o
+.....
+.....
+-----
+
+:8,-,value(10),high_handicap_helper
+
+
+Pattern HH9
+
+.....     Yet another fourth line stone.
+.....
+o.*.o
+O...o
+.....
+.....
+-----
+
+:8,-,value(10),high_handicap_helper
+
+
+Pattern HH10
+
+.....     Jump
+.....
+O.*..
+.....
+.....
+
+:-,-,value(5),high_handicap_helper
+
+
+Pattern HH11
+
+.....     Keima
+O....
+..*..
+.....
+?????
+
+:8,-,value(5),high_handicap_helper
+
+
+Pattern HH12
+
+o....     Extend
+.....
+.O*.o
+.....
+o....
+
+:-,-,value(2),high_handicap_helper
+
+
+Pattern HH13
+
+o....     Extend
+....o
+.O*..
+....o
+oo...
+
+:8,-,value(3),high_handicap_helper
+
+
+Pattern HH14
+
+|..O...   Solidify corner still more.
+|...O..
+|...*.O
+|......
+|......
++------
+
+:8,-,value(1),high_handicap_helper
+
+
+Pattern HH15
+
+|....oo   Solidify corner still more.
+|..O.oo
+|..*.oo
+|......
+|......
++------
+
+:8,-,value(1),high_handicap_helper
+
+
+Pattern HH16
+
+|..ooo   Solidify corner still more.
+|....o
+|..O.o
+|..*..
+|.....
++-----
+
+:8,-,value(1),high_handicap_helper
+
+
+Pattern HH17
+
+|.....   Solidify corner still more.
+|...O.
+|..*..
+|.....
+|.....
++-----
+
+:8,-,value(1),high_handicap_helper
+
+
+######################################################################
+#
+# Reinforcement patterns.
+#
+######################################################################
+#
+# Early in high handicap games, especially on small boards, it may
+# happen that the lonely white stones are all thought to be dead.
+# These patterns are used in such positions to reinforce possible
+# weaknesses that the owl code has failed to take into account.
+#
+# All these patterns have s classification. For performance reasons,
+# the move safety is tested in the helper instead.
+#
+######################################################################
+
+Pattern Reinforce1
+
+?...?
+..*..
+O...O
+.....
+.....
+-----
+
+:|,s,value(5),reinforce_helper
+
+
+Pattern Reinforce2
+
+.....
+O.*.O
+.....
+.....
+-----
+
+:|,s,value(3),reinforce_helper
+
+
+Pattern Reinforce3
+
+X..
+.*.
+X..
+
+:-,s,value(2),reinforce_helper
+
+
+Pattern Reinforce4
+
+xx
+*O
+X.
+
+:8,s,value(1),reinforce_helper
+
+
+Pattern Reinforce5
+
+?xx
+.*O
+X..
+
+:8,s,value(1),reinforce_helper
+
+
+######################################################################
+#
+#  Reinforcement patterns for the middle game
+#
+######################################################################
+
+Pattern Reinforce102
+# FIXME: This pattern should be contingent on being clearly ahead.
+# gf In any case, don't play it while scoring. (3.7.2)
+
+.......
+O..O..O     Eliminate invasion point
+...*...
+.......
+.......
+-------
+
+:8,O,value(8)
+
+.......
+O..O..O
+...*...
+.......
+.......
+-------
+
+;!doing_scoring
+
+
+######################################################################
+#
+# Large Endgame moves
+#
+# Endgame patterns of value < 6 are in endgame.db
+# 
+# "A point with sente is worth 2 with gote."
+#
+######################################################################
+
+
+Pattern LE1
+
+O.Xx      fourth line sente kosumi
+.*..
+....
+....
+----
+
+:8,OXe
+
+
+Pattern LE2
+# gf Added e classification. (3.5.2)
+
+?????     third line sente kosumi
+O.Xxx
+.*...
+.....
+-----
+
+:8,OXe
+
+
+Pattern LE3
+# gf Added e classification. (3.5.2)
+
+xXx       expand territory
+...
+.*.
+O..
+o..
+
+:8,OXe
+
+
+Pattern LE5
+# gf Added e classification and constraint. (3.5.2)
+
+?Xxx
+O...
+..*.
+....
+----
+
+:8,OXe
+
+?Xxx
+ca..
+.b*.
+....
+----
+
+;!oplay_disconnect(*,a,b,*,c)
+
+
+Pattern LE6
+# At move 96 of ego.tst, this is matched at J8.
+# tm - revised (3.1.15) (see trevora:330)
+#   added left-hand ?s
+# gf Revised. (3.1.20)
+# see also trevora:280, arend:23
+# tm Revised. (3.1.20)
+
+?oo???
+?..*.x
+?....X
+?..O??
+
+:8,OXeE
+
+?ocbd?
+?..*.x
+?a...X
+?..O??
+
+; omoyo(a) && !(o_alive_somewhere(b) && o_alive_somewhere(c,d))
+
+
+Pattern LE8
+# gf Changed fixed value to e classification, removed constraint. (3.5.2)
+
+?OOo        prevent monkey jump
+X*..
+....
+----
+
+:8,OXe
+
+
+Pattern LE9
+# gf Added e classification. (3.5.2)
+
+oo..?       good local sente
+..O.x
+O*X..
+....X
+.....
+-----
+
+:8,OXe
+
+
+Pattern LE10
+# gf Revised constraint. (3.1.14)
+
+OX        cut with sente and try to live inside opponent's territory
+X*
+
+:\,OXW,followup_value(5)
+
+OB
+A*
+
+;xmoyo(*) && !attack(A) && !attack(B)
+;&& safe_omove(*) && oplay_attack_either(*,A,B)
+
+
+Pattern LE12
+# gf Changed fixed value to e classification, removed constraint. (3.5.2)
+
+?O..    seal the edge
+X*..
+....
+----
+
+:8,OX
+
+
+Pattern LE13
+# gf Changed fixed value to e classification, added reverse followup. (3.5.2)
+
+|??o?        take the corner
+|...O
+|..OX
+|..*X
+|....
++----
+
+:8,OXe,reverse_followup(5)
+
+|??o?
+|..aO
+|..OX
+|..*X
+|....
++----
+
+; oplay_attack(*,a,a)
+
+
+Pattern LE15
+# tm decreased value (3.1.20) (see nngs:1150 move G4)
+# gf Don't bother with this inside own territory. (3.1.29)
+
+xxx            jump towards moyo
+x.x
+.*.
+...
+...
+OoO
+?o?
+
+:|,OE
+
+xxx
+x.x
+.*.
+...
+...
+OoO
+?o?
+
+;!oterri(*)
+
+
+Pattern LE16
+
++----          it's better to bend around
+|..O.
+|.*XO
+|?.X?
+
+:8,OX,terri(3),followup(2)
+
++----
+|.aO.
+|.*XO
+|?.X?
+
+> replace(a,*)
+
+
+######################################################################
+#
+# Replacement patterns
+#
+# Patterns using the "replace" autohelper macro for when
+# "this move is better than that move"
+#
+######################################################################
+
+
+Pattern RE1
+# db added (3.1.11)
+
+XOO?      better to make an eye
+O*.O
+XO.O
+?OO?
+
+:8,-
+
+XOO?
+A*aO
+XO.O
+?OO?
+
+; lib(A)==1
+
+> replace(a,*)
+
+
+Pattern RE2
+# gf New pattern. (3.1.12)
+# See test case niki:1 for an example.
+
+..O...     connect solidly
+XO....
+XO*X..
+XXO...
+......
+------
+
+:8,-
+
+..O...
+XO....
+XO*X..
+XXOa..
+......
+------
+
+> replace(a,*)
+
+
+Pattern RE3
+# gf New pattern. (3.1.12)
+# Common invasion in handicap games. Attaching on top better than
+# capping. 
+
+.......
+.......
+.O.*.O.
+...X...
+.......
+.......
+-------
+
+:|,-
+
+.......
+...a...
+.O.*.O.
+...X...
+.......
+.......
+-------
+
+> replace(a,*)
+
+
+# Pattern RE4
+# # tm New Pattern (3.1.17)
+# # gf This is too general as gunnar:95 shows. Removed. (3.7.10)
+# 
+# ?O.| push before blocking
+# *XX|
+# OO.|
+# 
+# :8,-
+# 
+# ?O.|
+# *BX|
+# OOa|
+# 
+# ; oplay_attack(*,a,B)
+# 
+# > replace(a,*)
+
+
+# Pattern RE5
+# # tm New pattern (3.1.18)  (see trevorb:440)
+# # gf This pattern can cause a crash, see ticket #203. Removed. (3.7.12)
+# 
+# OX?  threaten snapback
+# X.X
+# X.*
+# ?O.
+# ??o
+# 
+# :8,-
+# 
+# OX?
+# B.X
+# Xa*
+# ?O.
+# ??o
+# 
+# ; lib(B) == 2
+# 
+# > replace(a,*)
+
+
+Pattern RE6
+# tm New Pattern (3.1.18)  (see trevorb:400)
+
+-----
+.*...  take it off, don't leave atari followup
+OXOX?
+?OOX?
+
+:8,-
+
+-----
+.*a..
+OXOX?
+?OBX?
+
+; lib(B) == 1
+
+> replace(a,*)
+
+
+Pattern RE8
+# db new pattern (3.3.6)
+# see century-2002:10
+
+?..O??        first line block just helps the opponent
+X.*OX?
+..OX..
+...X..
+------
+
+:8,-
+
+?..O??
+X.*OX?
+..OX..
+..aX..
+------
+
+> replace(a,*)
+
+
+Pattern RE9
+# db new pattern (3.3.6)
+# see century-2002:100
+
+?o.X??        to slide is better than kosumi
+.O...?
+...*..
+......
+------
+
+:8,-
+
+?o.X??
+.O...?
+..a*..
+......
+------
+
+> replace(a,*)
+
+
+Pattern RE10
+# db new pattern (3.3.6)
+# see century-2002:130
+
+xxxx         don't allow the cut
+...X
+x.O*
+?XXO
+
+:8,d
+
+xxxx
+.a.X
+x.O*
+?XXb
+
+; !dead(b)
+> replace(a,*)
+
+
+Pattern RE12
+# db added (3.3.14)
+# See ninestones:20, where hane is a bogus owl defense.
+
+???OX.      kosumi defense
+O.XO..
+....*.
+......
+------
+
+:8,-,shape(3)
+
+???aX.
+O.Ba..
+..c.*.
+......
+------
+
+; lib(a)==2 && lib(B)>=2 && !oplay_attack(*,a)
+> replace(c,*)
+
+
+Pattern RE13
+# gf New pattern. (3.3.17)
+# See gunnar:20.
+
+?XXO       backfill before playing into bamboo joint in gote (dame filling)
+O*..
+?XXO
+
+:-,OX
+
+?XXO
+a*b.
+?XXO
+
+;oplay_attack(*,b,*) && oplay_defend(*,b,*)
+>backfill_replace(*,a)
+
+
+Pattern RE14
+# gf New pattern. (3.3.22)
+# See filllib:35.
+
++---
+|..?       fix up corner eye shape to avoid seki or worse
+|*.O
+|..O
+|O.O
+|.O?
+
+:8,O
+
++---
+|..?
+|*.O
+|b.O
+|O.O
+|aO?
+
+;olib(a)==2 && !oplay_attack(a,b,b)
+>replace(a,*)
+
+
+######################################################################
+#
+# Thrashing patterns.
+#
+# Patterns to force early moves when playing white against high
+# handicaps instead of passing because all stones look dead.
+# These patterns are disabled by the thrash_around_helper when white has
+# managed to get living stones or when at least 40% of the board is
+# covered.
+#
+######################################################################
+
+Pattern Th1
+
+.....
+X.*.X
+.....
+.....
+-----
+
+:|,-,value(5),thrash_around_helper
+
+
+Pattern Th2
+
+xxXxx
+o...o
+o.*.o
+.....
+.....
+-----
+
+:|,-,value(5),thrash_around_helper
+
+
+Pattern Th3
+
+oo.oo
+.X*.x
+.....
+.....
+.....
+-----
+
+:8,-,value(3),thrash_around_helper
+
+
+Pattern Th4
+
+ooXoo
+o.*.o
+.....
+.....
+-----
+
+:|,-,value(3),thrash_around_helper
+
+
+Pattern Th5
+
+X..o
+..*.
+....
+oooo
+
+:8,-,value(1),thrash_around_helper
+
+
+Pattern Th6
+
+...o
+X.*.
+....
+oooo
+
+:8,-,value(1),thrash_around_helper
+
+
+Pattern Th7
+
+....x
+.X.o.
+.*.o.
+....x
+
+:8,s,value(4),thrash_around_helper
+
+....x
+.X.a.
+.*.b.
+....x
+
+;o_somewhere(a,b)
+
+
+Pattern Th8
+
+oo..?
+*X.o.
+.O.o.
+....x
+
+:8,-,value(5),thrash_around_helper
+
+oo..?
+*X.a.
+.O.b.
+....x
+
+;o_somewhere(a,b)
+
+
+Pattern Th9
+
+....
+O.*.
+...x
+
+:8,-,value(3),thrash_around_helper
+
+
+Pattern Th10
+
+?x?
+.*x
+O.O
+?o?
+
+:8,-,value(3),thrash_around_helper
+
+
+Pattern Th11
+
+?x?
+o*?
+O.O
+?o?
+
+:8,-,value(2),thrash_around_helper
+
+
+Pattern Th12
+
+?.?
+.*.
+...
+O.O
+
+:|,-,value(3),thrash_around_helper
+
+
+Pattern Th13
+
+.O.
+...
+O.*
+
+:8,-,value(3),thrash_around_helper
+
+
+Pattern Th14
+
+x*O
+o..
+O.O
+
+:8,-,value(2),thrash_around_helper
+
+
+Pattern Th15
+
+xO*
+o..
+O.O
+
+:8,-,value(2),thrash_around_helper
+
+
+Pattern Th16
+
+?.O.?
+x*.O?
+??..x
+
+:8,-,value(3),thrash_around_helper
+
+
+Pattern Th17
+# FIXME: Give value to all attack threats.
+
+?O?
+*XO
+?.?
+
+:8,-,value(4),thrash_around_helper
+
+
+Pattern Th18
+# FIXME: Give value to all attack threats.
+
+?O?
+*XO
+?.?
+
+:8,s,value(0.5),thrash_around_helper
+
+
+Pattern Th19
+
+*Ox
+O.O
+.O.
+
+:8,n,value(1),thrash_around_helper
+
+
+Pattern Th20
+
+?.o.
+.*X.
+?...
+
+:8,s,value(0.5),thrash_around_helper
+
+
+Pattern Th21
+
+.O?
+*XO
+.Oo
+
+:8,s,value(1),thrash_around_helper
+
+
+Pattern Th22
+
+..O
+*..
+...
+---
+
+:8,s,value(4),thrash_around_helper
+
+
+Pattern Th23
+
+?X?
+.*O
+...
+---
+
+:8,s,value(2),thrash_around_helper
+
+
+Pattern Th24
+
+.*x
+.XO
+...
+---
+
+:8,s,value(3),thrash_around_helper
+
+
+######################################################################
+#
+# Mirror breaking patterns.
+#
+# Patterns to break mirror go strategies being employed by the opponent.
+#
+######################################################################
+
+Pattern M1
+# gf New pattern. (3.5.11)
+
+.....
+.....
+..X..
+..*..
+.....
+
+:|,-,value(30)
+
+.mil.
+.dbgq
+.fAe.
+ph*c.
+.kjn.
+
+;oplay_attack(*,b,c,d,e,f,g,h,i,j,k,l,m,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M2
+# gf New pattern. (3.5.11)
+
+.....
+..X..
+..X..
+..O*.
+.....
+
+:8,-,value(40)
+
+.mil.
+.dXgq
+.fAe.
+phO*.
+.kjn.
+
+;oplay_attack(*,d,e,f,g,h,i,j,k,l,m,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M3
+# gf New pattern. (3.5.11)
+
+.....
+.XX..
+..X*.
+..OO.
+.....
+
+:8,-,value(40)
+
+.mil.
+.XXgq
+.fA*.
+phOO.
+.kjn.
+
+;oplay_attack(*,f,g,h,i,j,k,l,m,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M4
+# gf New pattern. (3.5.11)
+
+.....
+.XX*.
+.XXO.
+..OO.
+.....
+
+:8,-,value(40)
+
+.mil.
+.XX*q
+.XAO.
+phOO.
+.kjn.
+
+;oplay_attack(*,h,i,j,k,l,m,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M5
+# gf New pattern. (3.5.11)
+
+..*..
+.XXO.
+.XXO.
+.XOO.
+.....
+
+:8,-,value(40)
+
+.m*l.
+.XXOq
+.XAO.
+pXOO.
+.kjn.
+
+;oplay_attack(*,j,k,l,m,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M6
+# gf New pattern. (3.5.11)
+
+..O..
+.XXO.
+.XXO.
+.XOO.
+.*X..
+
+:8,-,value(40)
+
+.mOl.
+.XXOq
+.XAO.
+pXOO.
+.*Xn.
+
+;oplay_attack(*,l,m,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M7
+# gf New pattern. (3.5.11)
+
+.*OX.
+.XXO.
+.XXO.
+.XOO.
+.OX..
+
+:8,-,value(70)
+
+.*OX.
+.XXOq
+.XAO.
+pXOO.
+.OXn.
+
+;oplay_attack(*,n,p,q,A) && break_mirror_helper(A)
+
+
+Pattern M8
+# gf New pattern. (3.5.11)
+
+.OOX.
+.XXO.
+.XXO.
+*XOO.
+.OXX.
+
+:8,-,value(60)
+
+.OOX.
+.XXOq
+.XAO.
+*XOO.
+.OXX.
+
+;oplay_attack(*,q,A) && break_mirror_helper(A)
+
+
+# END OF FILE
diff --git a/patterns/patterns.dsp b/patterns/patterns.dsp
new file mode 100644 (file)
index 0000000..2452acf
--- /dev/null
@@ -0,0 +1,1058 @@
+# Microsoft Developer Studio Project File - Name="patterns" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=patterns - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "patterns.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "patterns.mak" CFG="patterns - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "patterns - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "patterns - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I "." /I ".." /I "..\engine" /I "../sgf" /I "../utils" /D "WIN32" /D "NDEBUG" /D "HAVE_CONFIG_H" /D "_MBCS" /D "_LIB" /YX"patterns.h" /Fd"Release/patterns" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /Zi /Od /I "." /I ".." /I "..\engine" /I "../sgf" /I "../utils" /D "WIN32" /D "_DEBUG" /D "HAVE_CONFIG_H" /D "_MBCS" /D "_LIB" /FR /YX"patterns.h" /Fd"Debug/patterns" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "patterns - Win32 Release"\r
+# Name "patterns - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\aa_attackpat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\apatterns.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\barriers.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\conn.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\connections.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dpatterns.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\endgame.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\eyes.c\r
+# SUBTRACT CPP /YX\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki13.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki19.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki9.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fusekipat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\handipat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\helpers.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\influence.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\josekidb.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mcpat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl_attackpat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl_defendpat.c\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+# ADD CPP /Zi /O2 /YX\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl_vital_apat.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\patterns.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\dfa.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\eyes.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\patlib.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\patterns.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "db files"\r
+\r
+# PROP Default_Filter "*.db"\r
+# Begin Group "nobuild"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\gogo.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hoshi_other.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\komoku.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mc_mogo_classic.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mc_montegnu_classic.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mokuhazushi.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\patterns2.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sansan.db\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\takamoku.db\r
+# End Source File\r
+# End Group\r
+# Begin Source File\r
+\r
+SOURCE=.\aa_attackpats.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__AA_AT="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\aa_attackpats.db\r
+\r
+"aa_attackpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\aa_attackpats.dtr aa_attackpat -i ..\patterns\aa_attackpats.db -o aa_attackpat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__AA_AT="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\aa_attackpats.db\r
+\r
+"aa_attackpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\aa_attackpats.dtr aa_attackpat -i ..\patterns\aa_attackpats.db -o aa_attackpat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\attack.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__ATTAC="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\attack.db\r
+\r
+"apatterns.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -X  attpat -i ..\patterns\attack.db -o apatterns.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__ATTAC="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\attack.db\r
+\r
+"apatterns.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -X  attpat -i ..\patterns\attack.db -o apatterns.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\barriers.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__BARRI="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\barriers.db\r
+\r
+"barriers.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -c -b barrierspat -i ..\patterns\barriers.db -o barriers.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__BARRI="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\barriers.db\r
+\r
+"barriers.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -c -b barrierspat -i ..\patterns\barriers.db -o barriers.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\conn.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__CONN_="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\conn.db\r
+\r
+"conn.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -c conn -i ..\patterns\conn.db -o conn.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__CONN_="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\conn.db\r
+\r
+"conn.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -c conn -i ..\patterns\conn.db -o conn.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\defense.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__DEFEN="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\defense.db\r
+\r
+"dpatterns.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat defpat -i ..\patterns\defense.db -o dpatterns.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__DEFEN="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\defense.db\r
+\r
+"dpatterns.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat defpat -i ..\patterns\defense.db -o dpatterns.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\endgame.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__ENDGA="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\endgame.db\r
+\r
+"endgame.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b endpat -i ..\patterns\endgame.db -o endgame.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__ENDGA="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\endgame.db\r
+\r
+"endgame.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b endpat -i ..\patterns\endgame.db -o endgame.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\eyes.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__EYES_="$(IntDir)\mkeyes.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\eyes.db\r
+\r
+"eyes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkeyes <eyes.db >eyes.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__EYES_="$(IntDir)\mkeyes.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\eyes.db\r
+\r
+"eyes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkeyes <eyes.db >eyes.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__FUSEK="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\fuseki.db\r
+\r
+"fusekipat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b fusekipat -i ..\patterns\fuseki.db -o fusekipat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__FUSEK="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\fuseki.db\r
+\r
+"fusekipat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b fusekipat -i ..\patterns\fuseki.db -o fusekipat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki13.dbz\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__FUSEKI="$(IntDir)\uncompress_fuseki.exe"      \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\fuseki13.dbz\r
+\r
+"fuseki13.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\uncompress_fuseki 13 ..\patterns\fuseki13.dbz c >fuseki13.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__FUSEKI="$(IntDir)\uncompress_fuseki.exe"      \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\fuseki13.dbz\r
+\r
+"fuseki13.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\uncompress_fuseki 13 ..\patterns\fuseki13.dbz c >fuseki13.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki19.dbz\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__FUSEKI1="$(IntDir)\uncompress_fuseki.exe"     \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\fuseki19.dbz\r
+\r
+"fuseki19.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\uncompress_fuseki 19 ..\patterns\fuseki19.dbz c >fuseki19.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__FUSEKI1="$(IntDir)\uncompress_fuseki.exe"     \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\fuseki19.dbz\r
+\r
+"fuseki19.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\uncompress_fuseki 19 ..\patterns\fuseki19.dbz c >fuseki19.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fuseki9.dbz\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__FUSEKI9="$(IntDir)\uncompress_fuseki.exe"     \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\fuseki9.dbz\r
+\r
+"fuseki9.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\uncompress_fuseki 9 ..\patterns\fuseki9.dbz c >fuseki9.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__FUSEKI9="$(IntDir)\uncompress_fuseki.exe"     \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\fuseki9.dbz\r
+\r
+"fuseki9.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\uncompress_fuseki 9 ..\patterns\fuseki9.dbz c >fuseki9.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\handicap.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__HANDI="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\handicap.db\r
+\r
+"handipat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b handipat -i ..\patterns\handicap.db -o handipat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__HANDI="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\handicap.db\r
+\r
+"handipat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b handipat -i ..\patterns\handicap.db -o handipat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hoshi_keima.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__HOSHI="$(IntDir)\mkpat.exe"   "hoshi_other.db"        "komoku.db"     "sansan.db"     "mokuhazushi.db"        "takamoku.db"   "gogo.db"       \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\hoshi_keima.db\r
+\r
+"josekidb.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -C joseki -i hoshi_keima.db -i hoshi_other.db -i komoku.db -i sansan.db -i mokuhazushi.db -i takamoku.db -i gogo.db -o josekidb.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__HOSHI="$(IntDir)\mkpat.exe"   "hoshi_other.db"        "komoku.db"     "sansan.db"     "mokuhazushi.db"        "takamoku.db"   "gogo.db"       \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\hoshi_keima.db\r
+\r
+"josekidb.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -C joseki -i hoshi_keima.db -i hoshi_other.db -i komoku.db -i sansan.db -i mokuhazushi.db -i takamoku.db -i gogo.db -o josekidb.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\influence.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__INFLU="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\influence.db\r
+\r
+"influence.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -c influencepat -i ..\patterns\influence.db -o influence.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__INFLU="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\influence.db\r
+\r
+"influence.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -c influencepat -i ..\patterns\influence.db -o influence.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mc_uniform.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\mc_uniform.db\r
+\r
+"mcpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkmcpat mc_mogo_classic.db mc_montegnu_classic.db mc_uniform.db >mcpat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\mc_uniform.db\r
+\r
+"mcpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkmcpat mc_mogo_classic.db mc_montegnu_classic.db mc_uniform.db >mcpat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl_attackpats.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__OWL_A="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\owl_attackpats.db\r
+\r
+"owl_attackpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\owl_attackpats.dtr owl_attackpat -i ..\patterns\owl_attackpats.db -o owl_attackpat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__OWL_A="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\owl_attackpats.db\r
+\r
+"owl_attackpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\owl_attackpats.dtr owl_attackpat -i ..\patterns\owl_attackpats.db -o owl_attackpat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl_defendpats.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__OWL_D="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\owl_defendpats.db\r
+\r
+"owl_defendpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\owl_defendpats.dtr owl_defendpat -i ..\patterns\owl_defendpats.db -o owl_defendpat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__OWL_D="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\owl_defendpats.db\r
+\r
+"owl_defendpat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\owl_defendpats.dtr owl_defendpat -i ..\patterns\owl_defendpats.db -o owl_defendpat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\owl_vital_apats.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__OWL_V="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\owl_vital_apats.db\r
+\r
+"owl_vital_apat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\owl_vital_apats.dtr owl_vital_apat -i ..\patterns\owl_vital_apats.db -o owl_vital_apat.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__OWL_V="$(IntDir)\mkpat.exe"   \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\owl_vital_apats.db\r
+\r
+"owl_vital_apat.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -D -m -b -t ..\patterns\owl_vital_apats.dtr owl_vital_apat -i ..\patterns\owl_vital_apats.db -o owl_vital_apat.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\patterns.db\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__PATTE="$(IntDir)\mkpat.exe"   "patterns2.db"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\patterns.db\r
+\r
+"patterns.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b pat -i patterns.db -i patterns2.db -o patterns.c\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__PATTE="$(IntDir)\mkpat.exe"   "patterns2.db"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\patterns.db\r
+\r
+"patterns.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\mkpat -b pat -i patterns.db -i patterns2.db -o patterns.c\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
+# Begin Group "sgf files"\r
+\r
+# PROP Default_Filter "sgf"\r
+# Begin Source File\r
+\r
+SOURCE=.\gogo.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__GOGO_="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\gogo.sgf\r
+\r
+"gogo.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JG gogo.sgf >gogo.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__GOGO_="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\gogo.sgf\r
+\r
+"gogo.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JG gogo.sgf >gogo.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hoshi_keima.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+# PROP Ignore_Default_Tool 1\r
+USERDEP__HOSHI_="$(IntDir)\joseki.exe" \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\hoshi_keima.sgf\r
+\r
+"hoshi_keima.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JHK hoshi_keima.sgf >hoshi_keima.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+# PROP Ignore_Default_Tool 1\r
+USERDEP__HOSHI_="$(IntDir)\joseki.exe" \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\hoshi_keima.sgf\r
+\r
+"hoshi_keima.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JHK hoshi_keima.sgf >hoshi_keima.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\hoshi_other.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+# PROP Ignore_Default_Tool 1\r
+USERDEP__HOSHI_O="$(IntDir)\joseki.exe"        \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\hoshi_other.sgf\r
+\r
+"hoshi_other.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JHO hoshi_other.sgf >hoshi_other.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+# PROP Ignore_Default_Tool 1\r
+USERDEP__HOSHI_O="$(IntDir)\joseki.exe"        \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\hoshi_other.sgf\r
+\r
+"hoshi_other.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JHO hoshi_other.sgf >hoshi_other.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\komoku.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__KOMOK="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\komoku.sgf\r
+\r
+"komoku.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JK komoku.sgf >komoku.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__KOMOK="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\komoku.sgf\r
+\r
+"komoku.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JK komoku.sgf >komoku.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\mokuhazushi.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__MOKUH="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\mokuhazushi.sgf\r
+\r
+"mokuhazushi.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JM mokuhazushi.sgf >mokuhazushi.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__MOKUH="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\mokuhazushi.sgf\r
+\r
+"mokuhazushi.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JM mokuhazushi.sgf >mokuhazushi.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sansan.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__SANSA="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\sansan.sgf\r
+\r
+"sansan.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JS sansan.sgf > sansan.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__SANSA="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\sansan.sgf\r
+\r
+"sansan.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki JS sansan.sgf > sansan.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\takamoku.sgf\r
+\r
+!IF  "$(CFG)" == "patterns - Win32 Release"\r
+\r
+USERDEP__TAKAM="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Release\r
+InputPath=.\takamoku.sgf\r
+\r
+"takamoku.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki  JT takamoku.sgf > takamoku.db\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "patterns - Win32 Debug"\r
+\r
+USERDEP__TAKAM="$(IntDir)\joseki.exe"  \r
+# Begin Custom Build\r
+IntDir=.\Debug\r
+InputPath=.\takamoku.sgf\r
+\r
+"takamoku.db" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       $(IntDir)\joseki  JT takamoku.sgf > takamoku.db\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/patterns/patterns.h b/patterns/patterns.h
new file mode 100644 (file)
index 0000000..d8a353e
--- /dev/null
@@ -0,0 +1,424 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* This file describes the compiled form of the pattern database.
+ * mkpat is used to compile various source files <name>.db into
+ * intermediate files <name>.c which define data structures
+ * describing the patterns.
+ */
+
+#ifndef _PATTERN_H_
+#define _PATTERN_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* local versions of absolute value, min and max */
+
+#define gg_abs(x) ((x) < 0 ? -(x) : (x))
+#define gg_min(a, b) ((a)<(b) ? (a) : (b))
+#define gg_max(a, b) ((a)<(b) ? (b) : (a))
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+ * Ditto for AIX 3.2 and <stdlib.h>. 
+ */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#else
+#define GRID_OPT 0
+#endif
+
+#ifndef GRID_OPT
+#error GRID_OPT should be defined as 0, 1 or 2
+#endif
+
+
+/* Include support for pattern profiling. May be turned off in stable
+ * releases to save some memory.
+ *
+ * FIXME: should probably be included in config.h
+ */
+#define PROFILE_PATTERNS 0
+
+/* this trick forces a compile error if ints are not at least 32-bit */
+struct _unused_patterns_h {
+  int unused[sizeof(unsigned int) >= 4 ? 1 : -1];
+};
+
+
+#define ATTACK_MACRO(pos) ((stackp == 0) ? (worm[pos].attack_codes[0]) : attack(pos, NULL))
+#define DEFEND_MACRO(pos) ((stackp == 0) ? (worm[pos].defense_codes[0]) : find_defense(pos, NULL))
+
+struct pattern; /* forward reference to keep gcc happy */
+
+/* this is the type of a function which the matcher can
+ * call to evaluate the score of a move.
+ * parameters:
+ *   pattern and rotation are the current pattern being considered
+ *   ti, tj: IN = posn of the 7, 8 or 9 marker
+ *           OUT = recommended move
+ * return value : weight of move, or 0 if match failed            
+ */
+typedef int (*pattern_helper_fn_ptr)(struct pattern *, int rotation,
+                                    int move, int color);
+
+typedef int (*autohelper_fn_ptr)(int rotation, int move,
+                                int color, int action);
+
+
+/* each pattern is compiled into a sequence of these elements.
+ * Each describes a relative x, y from the pattern origin,
+ * and a description of what should be there.
+ * Current attributes are
+ *  0 = .
+ *  1 = X
+ *  2 = O
+ *  3 = x
+ *  4 = o
+ *  5 = ,  (barriers only)
+ *  6 = a  (half-eye only, OBSOLETE)
+ *  7 = !  (connection and barriers only)
+ */
+
+#define ATT_dot   0
+#define ATT_X     1
+#define ATT_O     2
+#define ATT_x     3
+#define ATT_o     4
+#define ATT_comma 5
+#define ATT_a     6
+#define ATT_not   7
+
+/* Pattern classes. The semantics of these varies between different
+ * databases. The descriptions here mostly relate to patterns in
+ * patterns.db and other databases which are handled by shapes.c.
+ */
+#define CLASS_O     0x0001   /* O stones must be alive or unknown */
+#define CLASS_o     0x0002   /* O stones must be dead or unknown */
+#define CLASS_X     0x0004   /* X stones must be alive or unknown */
+#define CLASS_x     0x0008   /* X stones must be dead or unknown */
+#define CLASS_s     0x0010   /* move is a sacrifice */
+#define CLASS_n     0x0020   /* X could also make this move if we do not */
+#define CLASS_D     0x0040   /* defense pattern */
+#define CLASS_C     0x0080   /* move connects two worms */
+#define CLASS_c     0x0100   /* move weakly connects two worms */ 
+                            /* for owl databases: combinable pattern */
+#define CLASS_B     0x0200   /* move breaks connection between enemy worms */
+#define CLASS_A     0x0400   /* attack pattern */
+#define CLASS_b     0x0800   /* move is intended to block opponent */
+#define CLASS_e     0x1000   /* move is intended to expand territory */
+#define CLASS_E     0x2000   /* move is intended to expand moyo */
+#define CLASS_a     0x4000   /* strategical level attack */
+#define CLASS_d     0x8000   /* strategical level defense */
+#define CLASS_I 0x00010000   /* invasions patterns (influence.db) */
+#define CLASS_J 0x00020000   /* joseki standard move */
+#define CLASS_j 0x00040000   /* joseki move, slightly less urgent */
+#define CLASS_t 0x00080000   /* minor joseki move (tenuki OK) */
+#define CLASS_U 0x00100000   /* very urgent joseki move */
+#define CLASS_T 0x00200000   /* joseki trick move */
+#define CLASS_W 0x00400000   /* worthwhile threat move */
+#define CLASS_F 0x00800000   /* for joseki moves: a fuseki pattern */
+#define CLASS_N 0x01000000   /* antisuji move (do _not_ play) */
+#define CLASS_Y 0x80000000   /* used for experimental patterns */
+
+/* Collection of the classes inducing move reasons. */
+#define CLASS_MOVE_REASONS (CLASS_C | CLASS_B | CLASS_b | \
+                            CLASS_e | CLASS_E | CLASS_I | CLASS_a | CLASS_d | \
+                           CLASS_J | CLASS_j | CLASS_U | CLASS_T | CLASS_t | \
+                            CLASS_W | CLASS_c | CLASS_F)
+
+/* directions for applying edge-constraints */
+#define NORTH_EDGE 1
+#define SOUTH_EDGE 2
+#define EAST_EDGE  4
+#define WEST_EDGE  8
+
+/* different kinds of autohelpers */
+#define HAVE_CONSTRAINT 1
+#define HAVE_ACTION     2
+
+/* Values of the action parameter to indicate where an influence autohelper
+ * is called from.
+ */
+#define INFLUENCE_CALLBACK 1
+#define FOLLOWUP_INFLUENCE_CALLBACK 2
+
+
+typedef struct patval {
+  short offset;
+  unsigned char att;
+} Patval;
+
+/* Build-time version of patval structure. */
+typedef struct patval_b {
+  int x;
+  int y;
+  int att;
+} Patval_b;
+
+
+enum attribute_type {
+  MIN_VALUE,
+  MAX_VALUE,
+  MIN_TERRITORY,
+  MAX_TERRITORY,
+  SHAPE,
+  FOLLOWUP,
+  REVERSE_FOLLOWUP,
+
+  /* For `mkpat'. */
+  FIRST_OFFSET_ATTRIBUTE,
+
+  THREATENS_TO_CAPTURE = FIRST_OFFSET_ATTRIBUTE,
+  THREATENS_EYE,
+  REVERSE_SENTE,
+
+  NUM_ATTRIBUTES,
+  LAST_ATTRIBUTE = NUM_ATTRIBUTES
+};
+
+
+#ifdef HAVE_TRANSPARENT_UNIONS
+
+struct pattern_attribute {
+  enum attribute_type type;
+
+  /* GCC allows unnamed (and transparent) unions. */
+  union {
+    float value;
+    int offset;
+  };
+};
+
+#else
+
+struct pattern_attribute {
+  enum attribute_type type;
+  float value;
+  int offset;
+};
+
+#endif
+
+
+/*
+ * Each pattern as a whole is compiled to an instance of this structure.
+ */
+struct pattern {
+  struct patval *patn;  /* array of elements */
+  int patlen;           /* number of elements */
+  int trfno;            /* number of transformations (rotations and reflections) */
+  const char *name;     /* short description of pattern (optional) */
+
+  int mini, minj;       /* min and max (relative to anchor) extent of ... */
+  int maxi, maxj;       /* ...the pattern */
+  int height, width;    /* differences between max and min extents */
+  unsigned int edge_constraints; /* and combinations of NORTH, EAST etc.
+                                 * for edges */
+
+  int move_offset;      /* offset of the suggested move (relative to anchor) */
+
+#if GRID_OPT
+  unsigned int and_mask[8]; /* for each rotation, masks for a */
+  unsigned int val_mask[8]; /* 4x4 grid around anchor */
+#endif
+
+  unsigned int class;   /* classification of pattern */
+
+  /* Value (owl-style, used for pattern sorting) is not stored as an
+   * attribute, because it is very common.
+   */
+  float value;
+
+  /* Pattern attributes like shape, followup etc. */
+  struct pattern_attribute *attributes;
+
+  int autohelper_flag;  /* whether autohelper has constraint and/or action */
+  pattern_helper_fn_ptr helper;  /* helper function, or NULL */
+  autohelper_fn_ptr autohelper;  /* automatically generated helper */
+                                 /* function, or NULL */
+
+  int anchored_at_X;    /* 3 if the pattern has 'X' at the anchor posn */
+
+  float constraint_cost; /* mkpat's estimate of the constraint complexity.*/
+
+#if PROFILE_PATTERNS
+  int hits;
+  int dfa_hits;
+  int reading_nodes;
+#endif
+};
+
+
+struct pattern_db {
+  int fixed_for_size;
+  const int fixed_anchor;
+  struct pattern *patterns;
+  struct dfa_rt *pdfa;
+};
+
+
+struct fullboard_pattern {
+  Hash_data fullboard_hash;    /* Hash of the full board position. */  
+  int number_of_stones;                /* Number of stones on board. */
+  const char *name;            /* Pattern identifier. */
+  int move_offset;             /* position of the move relative to tengen */
+  int value;                   /* value for pattern, if matched */
+};
+
+
+/* Monte Carlo local patterns. */
+struct mc_pattern_database {
+  const char *name;
+  const unsigned int *values;
+};
+
+
+/* helper functions */
+
+#define DECLARE(x) int x(struct pattern *pattern, int transformation, int move, int color)
+
+DECLARE(jump_out_helper);
+DECLARE(jump_out_far_helper);
+DECLARE(high_handicap_helper);
+DECLARE(reinforce_helper);
+DECLARE(throw_in_atari_helper);
+DECLARE(cutstone2_helper);
+DECLARE(thrash_around_helper);
+
+/* autohelper fns */
+int seki_helper(int str);
+void threaten_to_save_helper(int move, int str);
+void threaten_to_capture_helper(int move, int str);
+void prevent_attack_threat_helper(int move, int str);
+void defend_against_atari_helper(int move, int str);
+void amalgamate_most_valuable_helper(int apos, int bpos, int cpos);
+int finish_ko_helper(int apos);
+int squeeze_ko_helper(int apos);
+int backfill_helper(int apos, int bpos, int cpos);
+int owl_threatens_attack(int apos, int bpos);
+int connect_and_cut_helper(int Apos, int bpos, int cpos);
+int connect_and_cut_helper2(int Apos, int bpos, int cpos, int color);
+int edge_double_sente_helper(int move, int apos, int bpos, int cpos);
+void test_attack_either_move(int move, int color, int worma, int wormb);
+int adjacent_to_stone_in_atari(int str);
+int adjacent_to_defendable_stone_in_atari(int str);
+void backfill_replace(int move, int str);
+int break_mirror_helper(int str, int color);
+int distrust_tactics_helper(int str);
+int disconnect_helper(int apos, int bpos);
+
+
+/* pattern arrays themselves */
+extern struct pattern_db pat_db;
+extern struct pattern_db aa_attackpat_db;
+extern struct pattern_db owl_attackpat_db;
+extern struct pattern_db owl_vital_apat_db;
+extern struct pattern_db owl_defendpat_db;
+extern struct pattern_db conn_db;
+extern struct pattern_db attpat_db;
+extern struct pattern_db defpat_db;
+extern struct pattern_db endpat_db;
+extern struct pattern_db influencepat_db;
+extern struct pattern_db barrierspat_db;
+extern struct pattern_db fusekipat_db;
+extern struct pattern_db handipat_db;
+extern struct pattern_db oracle_db;
+
+extern struct corner_db joseki_db;
+
+extern struct fullboard_pattern fuseki19[];
+extern struct fullboard_pattern fuseki13[];
+extern struct fullboard_pattern fuseki9[];
+
+extern struct mc_pattern_database mc_pattern_databases[];
+
+struct corner_db;
+struct corner_variation;
+struct corner_pattern;
+
+struct corner_db {
+  int max_width;       /* Largest possible width and... */
+  int max_height;      /* ... largest possible height of database patterns. */
+
+  unsigned char num_top_variations; /* Number of top level variations. */
+  struct corner_variation *top_variations;
+};
+
+struct corner_variation {
+  int move_offset;         /* Offset of the move in this variation. */
+  signed char xor_att;      /* 0 - the same color as the first matched stone,
+                            * 3 - the opposite color.
+                            */
+  unsigned char num_stones; /* Number of stones in the `move_offset' rectangle. */
+
+  unsigned char num_variations; /* Number of subvariations. */
+  struct corner_variation *variations; /* Pointer to subvariation array. */
+
+  struct corner_pattern *pattern; /* Address of matched pattern (if any). */
+};
+
+struct corner_pattern {
+  int second_corner_offset; /* Offset of pattern's second corner. */
+  int symmetric;       /* If the pattern is symmetric ('/' symmetry). */
+
+  unsigned int class;  /* Pattern class. */
+  const char *name;    /* Pattern name (optional). */
+
+  /* Pattern attributes like shape (the only one used currently). */
+  struct pattern_attribute *attributes;
+
+  int autohelper_flag; /* Whether autohelper has constraint and/or action. */
+  autohelper_fn_ptr autohelper; /* Automatically generated helper (or NULL). */
+};
+
+/* Build time version of corner_variation structure. */
+struct corner_variation_b {
+  int move_offset;
+  signed char xor_att;
+  unsigned char num_stones;
+
+  unsigned char num_variations;
+  struct corner_variation_b *next;
+  struct corner_variation_b *child;
+  int child_num;
+
+  int pattern_num;
+};
+
+
+#endif /* _PATTERN_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/patterns2.db b/patterns/patterns2.db
new file mode 100644 (file)
index 0000000..36019dd
--- /dev/null
@@ -0,0 +1,3713 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3,         #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA                                             #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+#  Second Generation Pattern Database.
+#
+#  New patterns that are not from patterns.db
+#
+##############################
+#
+#  The patterns are classified into a number of different categories:
+#
+#  Conn            Connection patterns
+#  Cut     Cut patterns
+#  AS      Antisuji patterns (i.e. prohibitted moves)
+#  Shape    Shape moves
+#  Sente    Followup moves (add followup or reverse_followup values)
+#  DD      Double threat moves and defense against double threats
+#  Temp     Temporary patterns to correct certain misbehaviours.
+#
+##############################
+
+
+attribute_map general
+
+goal_elements none
+# FIXME: try to make callback_data pattern category specific
+callback_data XOxo
+
+
+##############################
+#
+# Connection of one space jump
+#
+# O.O
+#
+##############################
+
+
+Pattern Conn101
+
+O*O        straight connection
+
+:+,C
+
+
+Pattern Conn102
+
+O.O        tiger connection
+?*?
+
+:|,C
+
+bac
+?*?
+
+;odefend_against(*,a) && !oplay_attack(*,b) && !oplay_attack(*,c)
+
+
+Pattern Conn103
+
+O.O        indirect connection
+*..
+
+:8,C
+
+OaO
+*bc
+
+;oplay_attack(*,a,b,c,a) || oplay_attack(*,a,b,c,c)
+
+
+Pattern Conn104
+
+.O.O        indirect diagonal connection
+*...
+
+:8,C
+
+.OaO
+*dbc
+
+;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,a,b,d,c,a,d)
+
+
+Pattern Conn105
+
+OXO         defend connection
+.*.
+
+:8,C
+
+aXb
+.*.
+
+;!oplay_break_through(*,a,*,b)
+
+
+Pattern Conn106
+
+??.?        indirect connection
+*O.O
+....
+
+:8,C
+
+??e?
+*OaO
+.dbc
+
+;oplay_attack(*,a,b,e,c,d,d)
+
+
+########################
+#
+# Connection of diagonal
+#
+# O.
+# XO
+#
+########################
+
+
+Pattern Conn201
+
+O*         solid connection
+xO
+
+:/,C
+
+
+Pattern Conn202
+
+O.*        tiger's mouth connection
+xO?
+
+:8,C
+
+ba*
+xc?
+
+;odefend_against(*,a) && !oplay_attack(*,b) && !oplay_attack(*,c)
+
+
+Pattern Conn203
+
+XO?         far away connection, might leave much aji
+O.?
+??*
+
+:\,C
+
+XO?
+Oa?
+??*
+
+;odefend_against(*,a)
+
+
+Pattern Conn204
+
+?XO         increase liberties to secure connection
+*O.
+
+:8,C
+
+?XO
+*Oa
+
+;odefend_against(*,a)
+
+
+Pattern Conn205
+
+XO*         extend to secure connection
+O.?
+
+:8,C
+
+BO*
+Oa?
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern Conn206
+# see trevord:740
+
+..O   very indirect connection
+.OX
+*X.
+
+:8,C
+
+.aO
+.OX
+*X.
+
+;oplay_attack(*,a,a)
+
+
+Pattern Conn207
+# gf New pattern. (3.7.1)
+# See olympiad2004:102.
+
+?.X   kikashi to give bad shape before connecting
+..X
+*XO
+.O.
+
+:8,C
+
+?.X
+..X
+*Xa
+.O.
+
+;lib(a)>1
+
+
+#####################
+#
+# Connection of keima
+#
+# O..
+# ..O
+#
+#####################
+
+
+Pattern Conn301
+
+O*.        solid connection
+?.O
+
+:8,C
+
+
+Pattern Conn302
+
+O.?        bumping connection
+X*O
+
+:8,C
+
+Oa?
+B*O
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern Conn303
+# gf Revised constraint. (3.3.3)
+
+O..*        kosumi connection
+..O?
+
+:8,C
+
+Obc*
+eaf?
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,e,b,e)
+;&& oplay_defend_both(*,c,*,f)
+
+
+Pattern Conn304
+# gf Revised constraint. (3.3.3)
+
+O..*        kosumi connection
+X.O?
+
+:8,C
+
+Obc*
+Eaf?
+
+;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,b,a,b,E)
+;&& oplay_defend_both(*,c,*,f)
+
+
+Pattern Conn305
+
+O..?        nobi connection
+..O*
+
+:8,C
+
+Obc?
+eaO*
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,e,b,e)
+
+
+Pattern Conn306
+
+O..?        nobi connection
+X.O*
+
+:8,C
+
+Obc?
+EaO*
+
+;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,b,a,b,E)
+
+
+Pattern Conn307
+
+O.X?        nobi connection
+..O*
+
+:8,C
+
+ObD?
+caO*
+
+;!oplay_defend_both(*,a,b,a,D) && oplay_attack_either(*,b,a,c,b,c)
+
+
+Pattern Conn308
+
+O.*
+..O
+
+:8,C
+
+Oa*
+cbO
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern Conn309
+
+O.*
+X.O
+
+:8,C
+
+Oa*
+EbO
+
+;!oplay_defend_both(*,a,b,a,E)
+
+
+Pattern Conn310
+
+..*
+O..
+..O
+
+:8,C
+
+..*
+Obc
+daO
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,d,b,d)
+
+
+Pattern Conn311
+
+O*.
+?XO
+
+:8,C
+
+O*a
+?BO
+
+;oplay_attack_either(*,a,a,B)
+
+
+Pattern Conn312
+
+O.*
+xXO
+
+:8,C
+
+Oa*
+xXO
+
+;odefend_against(*,a)
+
+
+Pattern Conn313
+
+.O.
+O.*
+xXO
+
+:8,C
+
+bOc
+Oa*
+xXO
+
+;oplay_attack_either(*,a,b,c,a,c) || oplay_attack_either(*,a,c,b,a,b)
+
+
+Pattern Conn314
+
+...
+O.*
+xXO
+
+:8,C
+
+.b.
+ca*
+xXO
+
+;!oplay_break_through(*,a,b,c,b,*)
+
+
+Pattern Conn315
+
+O*X          cut through to connect 
+.XO
+
+:8,C
+
+O*B
+.AO
+
+;!oplay_defend_both(*,A,B)
+
+
+##############################################
+#
+# Connection of one space jump from two stones
+#
+# O..
+# O.O
+#
+##############################################
+
+
+Pattern Conn401
+
+O..*        kosumi connection
+O.O?
+
+:8,C
+
+Obc*
+OaO?
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern Conn402
+
+O..?        nobi connection
+O.O*
+
+:8,C
+
+Obc?
+OaO*
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern Conn403
+
+O.O          bamboo joint
+O.*
+
+:8,C
+
+A.O
+A.*
+
+;!oplay_attack(*,A)
+
+
+##############################
+#
+# Connection of two space jump
+#
+# O..O
+#
+##############################
+
+
+Pattern Conn501
+
+O*.O
+
+:-,C
+
+O*aO
+
+;odefend_against(*,a)
+
+
+Pattern Conn502
+
+O*.O
+?...
+
+:8,C
+
+O*ac
+?.b.
+
+;!oplay_break_through(*,a,b,*,b,c)
+
+
+Pattern Conn503
+
+O..O
+*...
+
+:8,C
+
+OacO
+*bde
+
+;oplay_attack_either(*,a,b,c,d,e,c,e) && !oplay_defend_both(*,a,b,d,c,a,d)
+;&& oplay_attack(*,b,a,c,c)
+
+
+Pattern Conn504
+
+O..O
+.*..
+
+:8,C
+
+OdaO
+e*bc
+
+;oplay_attack_either(*,a,b,c,a,c)
+;&& (oplay_attack(*,d,d) || oplay_attack_either(*,d,b,e,d,e))
+
+
+Pattern Conn505
+# gf Revised constraint. (3.7.2)
+
+?..?
+OX.O
+.*..
+
+:8,C
+
+?..?
+aX.b
+.*..
+
+;!oplay_disconnect(*,a,b)
+
+
+Pattern Conn506
+
+OX.O
+*O..
+
+:8,C
+
+ODbO
+*Oac
+
+;!oplay_defend_both(*,a,b,a,D) && !oplay_defend_both(*,b,a,c,b,c)
+
+
+Pattern Conn507
+
+O..O
+X*..
+
+:8,C
+
+OabO
+X*..
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+Pattern Conn508
+
+O..O
+?*O?
+
+:8,C
+
+OabO
+?*O?
+
+;oplay_attack(*,a,a) && oplay_attack(*,b,b)
+
+
+Pattern Conn509
+
+o.X?
+OX*O
+....
+----
+
+:8,C
+
+obX?
+cX*O
+.a..
+----
+
+;oplay_attack(*,a,a)
+;&& !oplay_attack_either(*,b,a,*,a) && !oplay_attack_either(*,b,a,c,a)
+
+
+Pattern Conn509b
+# gf New pattern. (3.3.3)
+
+?.X?
+OX*O
+....
+----
+
+:8,C
+
+?.X?
+aX*b
+....
+----
+
+;!oplay_disconnect(*,a,b)
+
+
+Pattern Conn510
+
+O..O
+..*.
+....
+?..O
+
+:/,C
+
+OADO
+CB*d
+..ba
+?.cO
+
+; oplay_attack(*,a,b,c,a) && oplay_attack(*,A,B,C,A)
+; && oplay_attack_either(*,b,a,d,b,d)
+; && oplay_attack_either(*,B,A,D,B,D)
+
+
+######################
+#
+# Connection of ogeima
+#
+# O...
+# ...O
+#
+######################
+
+
+Pattern Conn601
+
+O*..          Block across large knight's move
+?X.O
+
+:8,C
+
+O*ac
+?DbO
+
+;!oplay_defend_both(*,a,b,a,D) && oplay_attack_either(*,b,a,c,b,c)
+
+
+Pattern Conn602
+
+O...
+*..O
+
+:8,C
+
+Obde
+*acO
+
+;oplay_attack_either(*,a,b,c,d,e,c,e) && !oplay_defend_both(*,a,b,d,c,a,d)
+;&& oplay_attack(*,b,a,c,c)
+
+
+Pattern Conn603
+
+...o          Block across large knight's move
+O.*.
+?.XO
+
+:8,C
+
+.b.o
+ca*.
+?.XO
+
+;!oplay_break_through(*,a,b,*,b,c)
+
+
+Pattern Conn603b
+# gf New experimental pattern. Useful in nngs1:41. (3.1.30)
+
+...o          Block across large knight's move
+O.*.
+?.XO
+
+:8,C
+
+...o
+a.*.
+?.Xb
+
+;!oplay_disconnect(*,a,b)
+
+
+Pattern Conn604
+
+O...
+.*.O
+
+:8,C
+
+Ocb.
+d*ae
+
+;!oplay_break_through(*,a,b,*,b,e) && !oplay_defend_both(*,c,d,a,b,c,a)
+
+
+Pattern Conn605
+
+O...
+X*.O
+
+:8,C
+
+Ocb.
+X*ad
+
+;!oplay_break_through(*,a,b,*,b,d) && !oplay_defend(*,c,b,c)
+
+
+Pattern Conn606
+
+O*..
+?..O
+
+:8,C
+
+O*bc
+?daO
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,d,b,d)
+
+
+Pattern Conn607
+
+O..?
+O.*.
+?X.O
+
+:8,C
+
+Obc?
+Oa*.
+?X.O
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern Conn608
+
+...?
+O.*.
+?X.O
+
+:8,C
+
+.b.?
+ca*.
+?X.O
+
+;!oplay_break_through(*,a,b,*,b,c)
+
+
+Pattern Conn609
+
+O.*.?
+..XO.
+.....
+-----
+
+:8,C
+
+Ob*c?
+eaXOd
+..d..
+-----
+
+;!oplay_defend(*,a,b,c,d,a) && oplay_attack_either(*,c,a,b,d,e,b,e)
+
+
+Pattern Conn610
+
+OXX?
+.*.O
+----
+
+:8,C
+
+dBB?
+e*ac
+----
+
+;oplay_attack(*,a,B) && !oplay_attack(*,c) && !oplay_attack(*,d)
+;&& oplay_attack_either(*,e,B,e)
+
+
+Pattern Conn611
+
+OX.o
+.*.O
+----
+
+:8,C
+
+dB.o
+a*.c
+----
+
+;oplay_attack_either(*,a,B,a) && !oplay_attack(*,c) && !oplay_attack(*,d)
+
+
+##############################################
+#
+# Connection of two space jump from two stones
+#
+# O...
+# O..O
+#
+##############################################
+
+
+Pattern Conn701
+
+O..?
+O.*O
+
+:8,C
+
+Obc?
+Oa*O
+
+;oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern Conn702
+
+O.X?
+O.*O
+
+:8,C
+
+ObC?
+Oa*O
+
+;!oplay_defend_both(*,a,b,a,C)
+
+
+Pattern Conn703
+
+O.*.
+O.XO
+
+:8,C
+
+Ob*c
+OaDO
+
+;oplay_attack_either(*,a,b,c,a,c) && oplay_attack(*,c,c)
+;&& oplay_attack(*,b,a,c,D)
+
+
+Pattern Conn704
+
+?..*
+O...
+O..O
+
+:8,C
+
+?..*
+Odbe
+OcaO
+
+# This condition is not necessary but should be sufficient.
+;oplay_attack(*,e,b,e)  && !oplay_defend_both(*,b,a,c,d,b,c)
+;&& !oplay_defend_both(*,d,c,a,b,d,a)
+
+
+Pattern Conn705
+
+O..*
+O..O
+
+:8,C
+
+Odb*
+OcaO
+
+# This condition is not necessary but should be sufficient.
+;!oplay_defend_both(*,b,a,c,d,b,c)
+;&& !oplay_defend_both(*,d,c,a,b,d,a)
+
+
+Pattern Conn706
+
+OXXO
+O.*.
+....
+----
+
+:8,C
+
+dXXO
+da*c
+.b..
+----
+
+;!oplay_attack(*,a,b,d) && oplay_attack_either(*,a,b,c,a,c)
+
+
+Pattern Conn707
+
+O.XO
+O.*.
+....
+----
+
+:8,C
+
+OdDO
+Ob*a
+ce..
+----
+
+;oplay_attack_either(*,a,a,D) && oplay_attack_either(*,b,a,c,b,D)
+;&& oplay_attack_either(*,b,a,e,b,D) && oplay_attack_either(*,b,a,d,e,c,b,c)
+
+
+Pattern Conn708
+
+O*..         bend around
+OX.O
+
+:8,C
+
+O*ac
+ODbO
+
+;!oplay_defend_both(*,a,b,a,D) && oplay_attack_either(*,b,a,c,b,c)
+
+
+###########################
+#
+# Miscellaneous connections
+#
+###########################
+
+
+Pattern Conn801
+
+.O*.
+O..O
+
+:8,C
+
+.O*.
+Oa.O
+
+;xcut(a)
+
+
+#######################
+#
+# Cut of one space jump
+#
+# X.X
+#
+#######################
+
+
+Pattern Cut101
+
+...        cut with atari
+X*X
+OoO
+
+:|,OB
+
+...
+A*B
+aob
+
+;lib(a)>1 && lib(b)>1 && (lib(A)==2 || lib(B)==2)
+
+
+#################
+#
+# Cut of diagonal
+#
+# X.
+# OX
+#
+#################
+
+
+Pattern Cut201
+
+X*         cut through diagonal
+OX
+
+:/,OB
+
+X*
+aX
+
+;!oplay_attack_either(*,*,a)
+
+
+##############
+#
+# Cut of keima
+#
+# X..
+# ..X
+#
+##############
+
+
+Pattern Cut302
+
+X*.         cut through keima
+.OX
+
+:8,OB
+
+X*a
+.bX
+
+;!xplay_attack_either(*,a,b,a)
+
+
+Pattern Cut303
+# gf Pattern and constraint revised. (3.3.3)
+
+X*O         cut through keima
+?OX
+
+:8,B
+
+C*a
+?bD
+
+;(alive(a) || alive(b)) && !xplay_disconnect(*,C,D) && !oplay_connect(*,C,D)
+
+
+Pattern Cut304
+# gf New pattern. (3.5.3)
+
+?OO
+X..         cut through keima
+?*X
+
+:8,OB
+
+?OO
+Dab
+?*C
+
+;!oplay_defend_both(*,a,b,C,D) && !oplay_connect(*,C,D)
+
+
+#######################################
+#
+# Cut of one space jump from two stones
+#
+# X..
+# X.X
+#
+#######################################
+
+#######################
+#
+# Cut of two space jump
+#
+# X..X
+#
+#######################
+
+Pattern Cut501
+
+X.OX
+..*.
+....
+----
+
+:8,OB
+
+XaeX
+cb*d
+....
+----
+
+;lib(e)==3 && xplay_attack_either(*,a,b,c,a,c)
+;&& xplay_attack_either(*,a,b,d,a,d) && !xplay_defend(*,b,a,?,d,b)
+
+
+###############
+#
+# Cut of ogeima
+#
+# X...
+# ...X
+#
+###############
+
+
+Pattern Cut601
+
+XO..
+.*.X
+....
+----
+
+:8,OB
+
+FOc.
+d*aE
+..b.
+----
+
+;!xplay_break_through(*,a,b,*,b,E) && !xplay_attack(*,a,b,d,c,F)
+
+
+#######################################
+#
+# Cut of two space jump from two stones
+#
+# X...
+# X..X
+#
+#######################################
+
+
+
+####################
+#
+# Miscellaneous cuts
+#
+####################
+
+
+
+###########################
+#
+# Antisuji moves. 
+#
+# These are moves which are locally inferior or for some other reason
+# should never be played. Obviously, a certain amount of care must be
+# taken with these patterns.
+#
+###########################
+
+Pattern AS1
+# It's tempting to make this usually bad descent an antisuji, but
+# sometimes descending is correct e.g. in the "comb formation"
+#
+#     XXX
+#   XXOOOXX
+#   XO...OX
+#   .*...O.
+#  --------
+#
+# descending is the *only* move to live. So this should not be an antisuji.
+# gf Reduced shape value. (3.5.2)
+
+?XO     don't defend by moving straight down if it gives X a free forcing move
+XO.
+.*.
+---
+
+:8,-,shape(-3)
+
+?XO
+Xb.
+a*.
+---
+
+;attack(b) && !oplay_attack(*,a,a) && oplay_attack(*,a,*)
+
+
+Pattern AS2
+
+?XO     don't play double hane at the edge
+XO.
+*..
+---
+
+:8,-
+
+?XO
+XOa
+*b.
+---
+
+;!oplay_attack(*,a,a) && oplay_attack(*,a,b,b)
+
+>antisuji(*);
+
+
+Pattern AS3
+
+OOX       don't play potentially risky gote move
+*X.
+---
+
+:8,sOX
+
+OdA
+*Bc
+---
+
+;!weak(A) && !weak(B) && oplay_attack(*,c,*)
+
+>antisuji(*);
+>backfill_helper(*,c,d);
+
+
+Pattern AS4
+# gf New pattern. (3.1.2)
+
+|*O       Connect without leaving bigger ko threat than necessary.
+|OX
+|.O
++--
+
+:8,X
+
+|*b
+|OX
+|ac
++--
+
+;alive(b) && attack(c)
+
+>replace(a,*);
+
+
+Pattern AS5
+# gf New pattern. (3.1.3)
+
+?XO?
+XO..
+XO*.
+.X..
+----
+
+:8,OX
+
+?XO?
+XOc.
+XO*.
+bDa.
+----
+
+;oplay_attack(a,*,b,c,D,a)
+
+>replace(a,*);
+
+
+Pattern AS6
+# gf New pattern. (3.1.3)
+
+|.O         if legal, take ko before filling ko
+|OX
+|X*
++--
+
+:8,s
+
+|ab
+|OC
+|X*
++--
+
+;alive(b) && alive(C) && legal_omove(*)
+
+>replace(a,*);
+
+
+Pattern AS7
+# pp New pattern (3.3.18)
+# (Work-around problem with NonTerritory11, see valuation of M19 in
+# endgame:830)
+# It is shape-penalized since it can probably be a semeai attack/defense
+# in exceptionally rare cases. But actually it is really an antisuji.
+
+?XX?       don't play stupid zero point gote
+o*.o
+----
+
+:8,X,shape(-10)
+
+aXXc
+b*ed
+----
+
+; o_alive_somewhere(a,b) && o_alive_somewhere(c,d)
+; && !oplay_attack(*,e,e)
+; && (oplay_attack(*,e,*) || (o_somewhere(c) ? oplay_attack(*,e,c)
+;                                           : oplay_attack(*,e,d)))
+
+
+###########################
+#
+# Shape moves. 
+#
+# The purpose of these patterns is to give a value to the shape
+# obtained locally.
+#
+###########################
+
+
+Pattern Shape1
+# gf Revised constraint. (3.1.9)
+# gf Revised constraint. (3.3.10)
+
+OO      empty triangle. Ok if the empty point of the triangle is an eye.
+.*
+
+:8,-,shape(-2)
+
+OO
+a*
+
+;!proper_eye(a) && !o_captures_something(*) && !x_captures_something(*)
+
+
+Pattern Shape2
+# gf Revised constraint. (3.3.10)
+
+O*      empty triangle. Ok if the empty point of the triangle is an eye.
+.O
+
+:/,-,shape(-2)
+
+O*
+aO
+
+;!eye(a) && !o_captures_something(*)
+
+
+Pattern Shape3
+# tm modified (3.1.23) (reduce shape penalty)
+#  see blunder:15, trevord:800
+# gf Revised constraint. (3.3.17)
+
+O*      dango
+OO
+
+:/,-,shape(-1)
+
+O*
+OO
+
+;!ko(*) && !o_captures_something(*)
+
+
+Pattern Shape4
+
+*.O     forcing move left behind
+.OX
+xXX
+
+:8,-,shape(-2)
+
+*.O
+aOX
+xXX
+
+;!odefend_against(*,a)
+
+
+Pattern Shape5
+# gf Reduced shape value. (3.5.2)
+
+?O.O     protect against atari or threat to atari
+?.OX
+?*XX
+
+:8,-,shape(3)
+
+
+Pattern Shape6
+# gf Added constraint. (3.1.15)
+
+*.O     classical good shape, unless it leaves a double atari
+..O
+OOX
+
+:\,-,shape(2)
+
+*.O
+.aO
+OOX
+
+;oplay_attack(*,a,a)
+
+
+Pattern Shape6b
+
+*.O     secures eye
+..O
+OOo
+
+:\,-,shape(1)
+
+
+Pattern Shape7
+
+*.X     eye-stealing move
+..X
+XXO
+
+:\,-,shape(3)
+
+
+Pattern Shape8a
+
+...     ponnuki
+.*.
+OXO
+.O.
+
+:|,-,shape(5)
+
+
+Pattern Shape8b
+
+...     ponnuki
+.*.
+OXO
+.OO
+
+:8,-,shape(5)
+
+
+Pattern Shape8c
+
+...     ponnuki
+.*o
+OXO
+.OX
+
+:8,-,shape(5)
+
+
+Pattern Shape8d
+
+...     ponnuki defense
+o*.
+OXO
+XO.
+xXx
+
+:8,-,shape(7)
+
+
+Pattern Shape9a
+# tm modified (3.1.18)
+# tm modified (3.1.20)
+
+ooo     don't give opponent ponnuki
+o*o
+XOX
+.X.
+
+:|,-,shape(5)
+
+bdB
+c*C
+eOf
+.X.
+
+; lib(e) > 1 && lib(f) > 1
+; && (o_alive_somewhere(c) + o_alive_somewhere(C) + o_alive_somewhere(d) <= 1)
+; && !(o_alive_somewhere(d) && (o_alive_somewhere(b) || o_alive_somewhere(B)))
+
+
+Pattern Shape9b
+# tm modified (3.1.18)
+# tm modified (3.1.20)
+# ab I don't understand this pattern. X has already played at LR of
+# the pattern, so ponnuki is slow. Unless * attacks the eye space of X,
+# I see no point in pulling this stone out.
+
+ooo     don't give opponent ponnuki
+o*o
+XOX
+.XX
+
+:8,-,shape(4)
+
+bdB
+c*C
+eOf
+.XX
+
+; (o_alive_somewhere(c) + o_alive_somewhere(C) + o_alive_somewhere(d) <= 1)
+; && !(o_alive_somewhere(d) && (o_alive_somewhere(b) || o_alive_somewhere(B)))
+; && !attack(e) && !attack(f)
+
+
+Pattern Shape9c
+# tm modified (3.1.20)
+
+ooo     don't give opponent ponnuki
+o*o
+XOX
+.XO
+
+:8,-,shape(5)
+
+bdB
+c*C
+eOA
+.fO
+
+; (o_alive_somewhere(c) + o_alive_somewhere(C) + o_alive_somewhere(d) <= 1)
+; && !(o_alive_somewhere(d) && (o_alive_somewhere(b) || o_alive_somewhere(B)))
+; && !attack(A) && !attack(e) && !attack(f)
+
+
+Pattern Shape10
+
+xXx     force opponent into bad shape or ko
+..X
+*XO
+oOo
+
+:8,-,shape(3)
+
+
+Pattern Shape11
+# gf Revised constraint. (3.1.3)
+
+?..x    Don't push from behind with few liberties (want to avoid double hane).
+x.*X
+?.OX
+??X?
+
+:8,-,shape(-3)
+
+?..x
+x.*X
+?.bX
+??A?
+
+;lib(A)>1 && !dead(b)
+
+
+Pattern Shape12
+
+?..x    Don't push from behind with few liberties (want to avoid double hane).
+?...
+x.*X
+?.OX
+??OX
+??X?
+
+:8,-,shape(-2)
+
+?..x
+?...
+x.*X
+?.OX
+??OX
+??A?
+
+;lib(A)>1
+
+
+Pattern Shape12b
+# gf Reduced shape value. (3.5.2)
+
+..x     Don't push from behind with few liberties if we have to bend after hane
+.*X
+.OX
+
+:8,-,shape(-3)
+
+bax
+.*C
+.OC
+
+;!oplay_attack_either(*,a,a,C) && oplay_attack(*,a,b,*)
+
+
+Pattern Shape13
+# Such huge shape values can cause problems. See handtalk12.sgf, move 37
+# (where * is actually an owl defense). -Arend
+# gf Reduced shape value. (3.5.2)
+
+?X?     don't set up double cut
+*.O
+.O.
+
+:8,-,shape(-3)
+
+?X?
+*aB
+cOb
+
+;!oplay_attack_either(*,a,b,c,a,c) && !oplay_attack_either(*,a,c,b,a,b) && !alive(B)
+
+
+Pattern Shape14
+
+xXO?    better connect solid at once than leaving a kikashi
+.O.x
+xX*?
+
+:8,X,shape(-2)
+
+xAO?
+aO.x
+xB*?
+
+;!oplay_attack(*,a,A) && !oplay_attack(*,a,B) && !oplay_attack(*,a,a)
+
+
+Pattern Shape15
+
+xXO?    better connect solid at once than leaving a kikashi
+.O.*
+xXx?
+
+:8,X,shape(-2)
+
+xAO?
+aO.*
+xBx?
+
+;!oplay_attack(*,a,A) && !oplay_attack(*,a,B) && !oplay_attack(*,a,a)
+
+
+Pattern Shape16
+# gf Added constraint. (3.3.10)
+# Usually better to capture if either stone in atari.
+
+?XO     clean cut
+*Oo
+?X?
+
+:8,-,shape(1)
+
+?BO
+*Oo
+?A?
+
+;lib(A)>1 && lib(B)>2
+
+
+Pattern Shape17
+# The solid connection is better than nothing if the descent doesn't work
+
+O*.     X can still connect underneath
+XOX
+...
+---
+
+:8,-,shape(-2)
+
+O*.
+BOC
+.a.
+---
+
+;!oplay_attack(*,a,a) && !oplay_attack(*,a,B) && !oplay_attack(*,a,C) && oplay_attack(a,*,*)
+
+
+Pattern Shape18
+# gf Added n classification. (3.3.20)
+
+O.O     tiger
+.*X
+
+:8,n,shape(2)
+
+OaO
+b*X
+
+;odefend_against(*,a) && (oplay_attack(*,b,b) || !oplay_attack(*,b,*))
+
+
+Pattern Shape18b
+# Negate shape bonus if X can force O to fill the tiger's mouth.
+
+??.    tiger
+O.O
+.*X
+
+:8,-,shape(-2)
+
+??a
+O.b
+.*C
+
+;lib(b)==2 && lib(C)>3 && !oplay_attack(*,a,a)
+
+
+Pattern Shape18c
+# Negate shape bonus if X can connect "beneath".
+# gf New pattern. (3.1.4)
+
+?O.O     tiger
+X.*X
+....
+
+:8,-,shape(-3)
+
+?OdO
+Xc*E
+.ba.
+
+;oplay_attack(*,a,b,c,d,b) && lib(E)>3
+
+
+Pattern Shape19
+# gf Revised constraint. (3.3.2)
+
+X.X     stop enemy tiger
+.*O
+
+:8,-,shape(2)
+
+XaB
+.*O
+
+;lib(B)>1 && xdefend_against(*,a)
+
+
+Pattern Shape20
+# delta_moyo currently overvalues this move, so we compensate here
+# gf Reduced shape value. (3.5.2)
+
+XO.     bad aji
+O..
+..*
+...
+---
+
+:8,-,shape(-3)
+
+
+Pattern Shape21
+# almost always best to capture immediately
+
+?XO?
+XOXO
+..*?
+----
+
+:8,-,shape(1)
+
+
+Pattern Shape22
+
+O.*X    Wrong reinforcement
+..OX
+....
+----
+
+:8,-,shape(-2)
+
+O.*X
+.cOX
+.bad
+----
+
+;oplay_attack(*,a,b,c,d,*)
+
+
+Pattern Shape23
+
+.OXx    Usually better to connect solidly
+..OX
+.*..
+----
+
+:8,-,shape(-1)
+
+
+Pattern Shape24
+# delta_terri should see the value of this move, but currently needs help
+
+?X??    Usually better to connect solidly
+O*.O
+....
+----
+
+:8,-,shape(1)
+
+
+Pattern Shape25
+# gf Reduced shape value. (3.5.2)
+
+...x
+.*.X     Don't cap with weak stone that can be cut off.
+....
+xx.O
+
+:8,-,shape(-3)
+
+...x
+.*.X
+....
+xx.a
+
+;weak(a)
+
+
+Pattern Shape26
+
+XO?    Bad shape after atari on first line
+O.*
+...
+---
+
+:8,s,shape(-1)
+
+XO?
+b.*
+a..
+---
+
+;lib(b)==2 && !oplay_attack(*,a,a)
+
+
+Pattern Shape27
+
+?XO?    Bad shape after atari on first line
+XO..
+...*
+----
+
+:8,-,shape(-1)
+
+
+Pattern Shape28
+
+O.XO    Avoid diagonal move that allows X to cut.
+.*..
+
+:8,X,shape(-4)
+
+O.XO
+.*a.
+
+;!oplay_attack(*,a,a)
+
+
+Pattern Shape29
+# gf Revised constraint. (3.1.20)
+
+O.*    Avoid setting up double threat.
+?X?
+
+:8,X,shape(-5)
+
+ba*
+?X?
+
+;(!attack(b) || defend(b)) && !oplay_defend_both(*,a,*,b)
+
+
+Pattern Shape30
+# In this position any move that defends the lower O stone will be
+# assumed to break the connection, although X might connect
+# underneath. Therefore we give some extra encourage to the real cut.
+# If this move isn't safe, it won't be suggested anyway.
+
+?O?
+o.o
+XOX
+.*.
+---
+
+:|,X,shape(1)
+
+?O?
+o.o
+XaX
+.*.
+---
+
+;attack(a)
+
+
+Pattern Shape31
+
+XOo     Very seldom the right connection.
+O..
+O*.
+---
+
+:8,-,shape(-1)
+
+
+Pattern Shape32
+
+XO?     Bad aji.
+x.*
+O.O
+?.X
+
+:8,X,shape(-1)
+
+Xa?
+x.*
+O.O
+?.X
+
+;lib(a)==2
+
+
+Pattern Shape33
+
+?O.      Never bad to make an eye.
+O.*
+oO.
+
+:8,-,shape(1)
+
+
+Pattern Shape34
+
+?X?      Don't descend if we can (and have to) capture.
+XOX
+.*.
+---
+
+:8,X,shape(-3)
+
+?X?
+BOX
+.*a
+---
+
+;lib(B)==1 && !oplay_attack(*,a,a)
+
+
+Pattern Shape35
+
+O.O      Good shape
+O..
+XO*
+???
+
+:8,-,shape(1)
+
+
+Pattern Shape36
+
+OX.O     Very inefficient move
+XO..
+.*..
+----
+
+:8,-,shape(-2)
+
+OB.O
+XOa.
+.*..
+----
+
+;oplay_defend(*,B) && oplay_attack(*,a,*)
+
+
+Pattern Shape37
+
+OX.O     Good shape
+XO*.
+....
+----
+
+:8,-,shape(1)
+
+
+Pattern Shape38
+
+X.O     Usually inefficient
+O..
+*..
+---
+
+:8,-,shape(-1)
+
+
+Pattern Shape39
+
+O..     good shape
+..O
+O*X
+
+:8,-,shape(1)
+
+b..
+..a
+O*X
+
+;lib(a)>2 && lib(b)>2
+
+
+Pattern Shape40
+
+O.X     eye-stealing move
+..X
+XX*
+
+:\,-,shape(1)
+
+
+Pattern Shape41
+# Notice that this pattern gives one more shape point for the previous
+# pattern.
+
+O.x     eye-stealing move
+..X
+xX*
+
+:\,-,shape(1)
+
+
+Pattern Shape42
+# Sometimes the life and death code comes up with both this move and
+# the more solid move one line higher. Prefer the latter.
+
+O.o
+X..
+.*.
+---
+
+:8,O,shape(-2)
+
+
+Pattern Shape43
+
+?XO.    usually better to connect solidly than leaving peep behind
+xO..
+..*.
+----
+
+:8,-,shape(-2)
+
+
+Pattern Shape44
+# This pattern may be a little too general but is probably good.
+
+?...?    extend when faced with contact instability
+?.OX?
+?.*.x
+??.??
+
+:8,-,shape(2)
+
+?...?
+a.OX?
+?.*.x
+??.??
+
+;!xmoyo(a)
+
+
+Pattern Shape45
+# gf Added constraint. (3.1.3)
+
+xxx?    usually better to connect and block on third line
+O..O
+*...
+....
+----
+
+:8,-,shape(-1)
+
+CDE?
+a..b
+*...
+....
+----
+
+;!same_dragon(a,b) || x_alive_somewhere(C,D,E)
+
+
+Pattern Shape46
+# gf Reduced shape value. (3.5.2)
+
+?XXO    blocking one step to the left usually much superior
+.O.*
+....
+----
+
+:8,-,shape(-3)
+
+?XXb
+.Oa*
+....
+----
+
+;lib(b)>=3 && oplay_attack(a,*,*)
+
+
+Pattern Shape47
+
+x.O     too vulnerable to cutting
+O.X
+.*X
+xx?
+
+:8,-,shape(-3)
+
+
+Pattern Shape48
+# gf Added constraint. (3.3.15)
+# gf Revised pattern. (3.3.16)
+
+.X.     makes it harder for X to make eyes
+*.X
+?xx
+
+:8,s,shape(1)
+
+.A.
+*.X
+?xx
+
+;weak(A)
+
+
+Pattern Shape49
+
+OXx     avoid descending if it leaves a kikashi
+XOX
+.OX
+.*.
+---
+
+:8,-,shape(-1)
+
+OXx
+XOX
+.OX
+.*a
+---
+
+;oplay_attack(*,a,*) && !oplay_attack(*,a,a)
+
+
+Pattern Shape50
+
+xO.xx     connect after nozoki
+X*.xx
+xO.xx
+
+:-,OX,shape(5)
+
+
+Pattern Shape51
+
+O..     empty triangle on the edge
+O*.
+---
+
+:8,-,shape(-2)
+
+
+Pattern Shape53
+
+?X?     good for eyespace and to avoid shortage of liberties
+O*O
+...
+---
+
+:|,-,shape(1)
+
+
+Pattern Shape54
+
+?X?     often stupid
+O.O
+..*
+---
+
+:8,-,shape(-1)
+
+
+Pattern Shape55
+# gf Reduced shape value. (3.5.2)
+
+O.      don't force opponent to cut
+X.
+.*
+
+:8,-,shape(-3)
+
+a.
+X.
+.*
+
+;weak(a)
+
+
+Pattern Shape56
+
+?XO.    don't defend by moving straight down if X can peep
+XO..
+.*..
+----
+
+:8,O,shape(-3)
+
+
+Pattern Shape57
+
+..O          avoid moves at cross purposes
+O.X
+.*.
+
+:8,OX,shape(-3)
+
+
+Pattern Shape58
+
+O.XO         effective block
+..*O
+..xx
+
+:8,-,shape(3)
+
+O.AO
+..*O
+..xx
+
+;lib(A)==3
+
+
+Pattern Shape59
+# gf Reduced shape value. (3.5.2)
+
+?X.O         usually stupid, other atari or descent generally better
+XOXO
+..*.
+----
+
+:8,-,shape(-3)
+
+
+Pattern Shape60
+
+..O?         don't connect this way because it leaves bad aji
+...O
+..*o
+----
+
+:8,-,shape(-3)
+
+
+Pattern Shape60b
+# gf New pattern. (3.1.3)
+
+..O?         this connection on the other hand is usually good
+..*O
+...o
+----
+
+:8,-,shape(1)
+
+
+Pattern Shape60c
+# gf New pattern. (3.1.14)
+
+..OX?        usually we want to avoid this connection too
+...OX
+...*O
+-----
+
+:8,-,shape(-1)
+
+
+Pattern Shape61
+
+xX...       connecting preferred to alternative defenses
+XOX..
+O*O..
+.....
+.....
+-----
+
+:8,-,shape(3)
+
+
+Pattern Shape62
+
+?OO??
+O...x        not so good shape on the edge
+O.*.x
+-----
+
+:8,-,shape(-3)
+
+
+Pattern Shape63
+
+??xO.        might connect, but horrible amounts of aji
+?X...
+.XO..
+..*..
+-----
+
+:8,-,shape(-3)
+
+
+Pattern Shape64
+
+?O..         never correct shape
+O...
+?O*.
+----
+
+:8,-,shape(-3)
+
+
+Pattern Shape65
+
+?O..         good solid shape
+O.*.
+?O..
+----
+
+:8,-,shape(1)
+
+bO..
+O.*.
+aO..
+----
+
+;o_alive_somewhere(a,b)
+
+
+Pattern Shape66
+# db increased negative shape (3.1.7)
+# ab added ??? lines added as jump is often good on 3rd line
+# gf This is way too general. Added constraint. (3.5.3)
+
+xX.         often bad to leave a gap
+O.*
+...
+???
+???
+
+:8,-,shape(-3)
+
+xX.
+ca*
+.b.
+???
+???
+
+;oplay_disconnect(*,a,b,*,c)
+
+
+Pattern Shape67
+# gf New pattern. (3.1.3)
+
+?XX?        when played as a ko threat, this is often inefficient
+X*OX
+..X?
+
+:8,sX,shape(-1)
+
+?XX?
+X*OX
+..X?
+
+;oplay_attack(*,*)
+
+
+Pattern Shape68
+# gf New pattern. (3.1.3)
+
+OXxx        usually the right place for a small ko threat in this shape
+X*.x
+XX..
+----
+
+:8,sOX,shape(1)
+
+OXxx
+A*.x
+AA..
+----
+
+;lib(A)==2
+
+
+Pattern Shape69
+# gf New pattern. (3.1.13)
+
+?XXX??      usually the right way to strengthen the position
+XO.O*.
+XO....
+......
+------
+
+:8,-,shape(1)
+
+
+Pattern Shape70
+# gf New pattern. (3.1.14)
+
+OX..      better to capture cleanly
+.*..
+----
+
+:8,-,shape(-2)
+
+OAb.
+.*..
+----
+
+;!oplay_defend(b,A)
+
+
+Pattern Shape71
+# gf New pattern. (3.1.14)
+
+?XO..     the descent leaves a peep
+XO...      
+.*...
+-----
+
+:8,-,shape(-1)
+
+
+Pattern Shape72
+# gf New pattern. (3.1.14)
+# gf Reduced shape value. (3.5.2)
+
+?XO.     don't leave double threat behind
+XO..      
+*...
+----
+
+:8,-,shape(-3)
+
+?Xc.
+Xba.
+*...
+----
+
+;!oplay_defend_both(*,a,b,c)
+
+
+Pattern Shape73
+# gf New pattern. (3.1.14)
+
+?OO      cancel empty triangle negative shape when we create an eye
+O.*
+OoO
+
+:8,-,shape(2)
+
+?OO
+Oa*
+OoO
+
+;!proper_eye(a)
+
+
+Pattern Shape73b
+# gf New pattern. (3.1.20)
+# See strategy3:120. This pattern favors C7 to D8.
+
+?OO      some more shape if opponent could atari to destroy eye
+O.*
+OoO
+
+:8,-,shape(1)
+
+?AA
+O.*
+OoO
+
+;lib(A)==2 && xlib(*)>1
+
+
+Pattern Shape74
+# gf New pattern. (3.1.14)
+
+o..?     don't leave cutting points around
+O...
+X.Ox
+?*.x
+oO.?
+
+:8,-,shape(-1)
+
+
+Pattern Shape75
+# gf New pattern. (3.1.15)
+
+?Xxx
+.OXx
+..*.
+....
+----
+
+:8,-,shape(-1)
+
+?XDx
+bOXx
+.a*c
+....
+----
+
+;(x_alive_somewhere(D) || oplay_attack(*,?,D,D)) && !oplay_defend(*,a,b,c,*)
+
+
+Pattern Shape76
+# tm New Pattern. (3.1.16) (see trevor:220)
+# gf Reduced shape value. (3.5.2)
+
+----
+....
+....
+O.*.
+
+:8,-,shape(-3)
+
+----
+....
+CbE.
+DA*.
+
+; xlib(A) > 2
+; && oplay_attack(*,A,b,C,D)
+; && oplay_attack(*,A,b,E,C,*)
+
+
+Pattern Shape77
+# gf New pattern. (3.1.18) (see trevor:382)
+
+oOO
+O..
+XO*
+---
+
+:8,-,shape(-3)
+
+
+Pattern Shape78
+# gf New pattern. (3.1.18) (see trevor:382)
+
+oOO
+O.*
+XO.
+---
+
+:8,-,shape(1)
+
+
+Pattern Shape79
+# gf New pattern. (3.1.20) (see trevord:610,630,640)
+
+OOo       Almost always better to block on second line
+X..
+*..
+---
+
+:8,O,shape(-2)
+
+OOo
+A..
+*..
+---
+
+;lib(A)==2
+
+
+Pattern Shape80
+# tm New Pattern (3.1.22) (see trevora:390)
+
+|O.O
+|..O
+|*.O
+|..o
++---
+
+:8,-,shape(1)
+
+
+Pattern Shape81
+# tm New Pattern (3.1.22) (see trevora:300)
+# FIXME: potentially bad for ko threats.
+
+.*o
+O..
+XOO
+
+:8,X,shape(1)
+
+
+Pattern Shape82
+# gf New pattern. (3.1.32) (see trevorb:280)
+
+|XXO        Prefer this as ko threat since it gives a second one
+|.*X
+|.X?
+|.??
+
+:8,sX,shape(2)
+
+|AAO
+|.*X
+|.X?
+|b??
+
+;!weak(A) && lib(A)==2 && xterri(b)
+
+
+Pattern Shape83
+# gf New pattern. (3.3.3) (see trevorc:310)
+
+*X?        don't leave double atari behind
+.OX
+..O
+
+:8,sX,shape(-2)
+
+*X?
+daX
+.cb
+
+;!oplay_defend_both(*,c,a,b) && oplay_attack(d,c,c)
+
+
+Pattern Shape84
+# gf New pattern. (3.3.3) (see trevorc:1310)
+
+OX?        connect correctly
+.OX
+.*O
+---
+
+:8,sX,shape(-2)
+
+OX?
+bOX
+.*a
+---
+
+;lib(a)>1 && xlib(b)>1 && oplay_attack(*,b,*)
+
+
+Pattern Shape85
+# gf New pattern. (3.3.10)
+# Usually less aji when attacking at c rather than *.
+
+OOX        attack correctly
+*XO
+...
+xxx
+
+:8,sX,shape(-1)
+
+aaX
+*BO
+.c.
+xxx
+
+;(xlib(*)==2 || (lib(a)>2 && xlib(*) < xlib(c)))
+;&& !oplay_defend(c,B)
+
+
+Pattern Shape86
+# gf New pattern. (3.3.15)
+# Prefer cut to peep as ko threat.
+# gf Revised constraint. (3.3.16)
+
+XO        ko threat
+*X
+
+:/,sX,shape(1)
+
+AO
+*B
+
+;oplay_attack_either(*,A,B) && !safe_omove(*)
+
+
+Pattern Shape87
+# gf New pattern. (3.5.3)
+# gf See gifu03:501
+
+.OXx       usually better to extend than atari in cross cut
+.XO.
+.*..
+
+:8,sX,shape(-1)
+
+.aXx
+.Xb.
+.*..
+
+;!dead(a) && !dead(b) && weak(a) && weak(b) && oplay_disconnect(*,a,b)
+
+
+Pattern Shape88
+# gf New pattern. (3.7.2)
+# See gunnar:55.
+
+?X.X        more potential for followup ko threats one step to the right
+X*.X
+?XXO
+
+:8,sX,shape(-1)
+
+?XbX
+X*.X
+?AAO
+
+;lib(A)==2 && olib(*)==1 && olib(b)==1
+
+
+###########################
+#
+# Followup moves. 
+#
+# The purpose of these patterns is to give a rough estimate of the
+# value of followup moves, either to this move or to moves the
+# opponent could continue with if we do not defend now.
+#
+###########################
+
+
+Pattern Sente1
+
+?X?     Defend to avoid cutting points
+XOX
+O*o
+
+:8,-,reverse_followup(5)
+
+?X?
+XOB
+a*o
+
+;lib(B)>1 && xplay_attack(*,a)
+
+
+Pattern Sente1b
+
+*X?     Capture to avoid cutting points
+XOX
+O.o
+
+:8,-,reverse_followup(5)
+
+*X?
+COX
+bao
+
+;lib(C)==1 && xplay_attack(a,b) && oplay_attack(*,a,a)
+
+
+Pattern Sente1c
+
+OX?     Capture to avoid cutting points
+XOX
+*.o
+
+:8,-,reverse_followup(5)
+
+bX?
+COX
+*ao
+
+;lib(C)==1 && xplay_attack(a,b) && oplay_attack(*,a,a)
+
+
+Pattern Sente1d
+# gf New pattern. (3.3.10)
+
+?OX?     Capture to avoid cutting points
+*XOX
+?O.o
+
+:8,-,reverse_followup(5)
+
+?OX?
+*COX
+?bao
+
+;lib(C)==1 && xplay_attack(a,b) && oplay_attack(*,a,a)
+
+
+Pattern Sente2
+
+.X.     Defend to create cutting points
+XOX
+O*O
+
+:|,-,followup(5)
+
+.B.
+AOC
+O*O
+
+# Better to capture A or C at once if either in atari
+;oplay_break_through(*,A,B,C) && lib(A)>1 && lib(C)>1
+
+
+Pattern Sente3
+
+?XOO      Block on edge.
+XOX*
+....
+----
+
+:8,-,followup(6)
+
+
+Pattern Sente4
+
+oOX.      Hanetsugi
+.*OX
+----
+
+:8,-,followup(6)
+
+oOA.
+.*OB
+----
+
+;oplay_attack_either(*,A,B) && !attack(B) && !attack(A)
+
+
+Pattern Sente5
+# The followup value is usually larger in practice.
+
+*XX           force X to make dango
+X.X
+?XO
+
+:8,X,followup(6)
+
+*AA
+X.A
+?Xa
+
+;lib(A)==2 && lib(a)>1
+
+
+Pattern Sente6
+# The followup value is usually larger in practice.
+
+XXX           force X to make dango
+X.X
+*XO
+
+:8,X,followup(10)
+
+AAA
+A.A
+*Xa
+
+;lib(A)==2 && lib(a)>1
+
+
+Pattern Sente7
+# tm modified (3.1.22) (added oplay_defend)
+
+?O?
+.X*
+...
+---
+
+:8,X,followup(6)
+
+?O?
+.A*
+...
+---
+
+;oplay_attack(*,A) && oplay_defend(*,A)
+
+
+Pattern Sente8
+
+O..
+*X.
+...
+---
+
+:8,OXd,followup(8)
+
+O..
+*A.
+...
+---
+
+;oplay_attack(*,A)
+
+
+Pattern Sente9
+
+?X*O      Cut
+.OX.
+....
+----
+
+:8,-,followup(6)
+
+
+Pattern Sente10
+# FIXME: The followup value should be related to the size of A.
+
+.O.?
+...X
+OXX*
+
+:8,-,followup(5),shape(1)
+
+.O.?
+...X
+OAA*
+
+;lib(A)==3 && oplay_attack(*,A)
+
+
+Pattern Sente11
+
+?OO?
+.XX*
+....
+----
+
+:8,X,followup(9)
+
+?OO?
+.AA*
+....
+----
+
+;oplay_attack(*,A)
+
+
+Pattern Sente13
+# gf Revised constraint. (3.1.20)
+
+*O
+
+:-,sO
+
+*a
+
+;lib(a) == 2 && !attack(a) && safe_xmove(*) && safe_omove(*)
+# Action adds a reverse followup value.
+>defend_against_atari(a)
+
+
+Pattern Sente13b
+# gf Revised constraint. (3.1.10)
+# gf Revised constraint. (3.3.16)
+# gf Revised constraint. (3.5.3)
+
+.O
+*?
+
+:8,sO
+
+ba
+*c
+
+;lib(a) == 2 && !attack(a) && olib(b) > 2 && safe_omove(*)
+;&& (safe_xmove(*) || safe_xmove(b))
+;&& (oplay_attack(*,b,b)==WIN
+;    || (x_somewhere(c) && oplay_attack_either(*,b,b,c)))
+# Action adds a reverse followup value.
+>defend_against_atari(a)
+
+
+Pattern Sente13c
+# gf New pattern. (3.3.16)
+
+O.O
+*.O
+
+:8,sO
+
+Oba
+*ca
+
+;lib(a) == 2 && !attack(a) && safe_omove(*)
+;&& (safe_xmove(b) || safe_xmove(c))
+;&& oplay_attack(*,b,b)==WIN
+;&& oplay_attack(*,c,c)==WIN
+# Action adds a reverse followup value.
+>defend_against_atari(a)
+
+
+Pattern Sente13d
+# gf New pattern. (3.3.17)
+
+..X
+*.O
+..O
+oOX
+
+:8,sO
+
+..X
+*ca
+.ba
+oOX
+
+;lib(a) == 2 && !attack(a) && safe_omove(*)
+;&& safe_xmove(*)
+;&& !oplay_defend(*,b,c,b)
+;&& xplay_attack(*,a)
+# Action adds a reverse followup value.
+>defend_against_atari(a)
+
+
+Pattern Sente13e
+# gf New pattern. (3.7.4)
+# gf Removed O classification and revised constraint. (3.7.10)
+
+*.O
+?O?
+
+:8,s
+
+*ba
+?O?
+
+;alive(a) && lib(a) == 2 && !attack(a) && olib(b) > 2 && safe_omove(*)
+;&& safe_xmove(b) && oplay_attack(*,b,b)==WIN
+# Action adds a reverse followup value.
+>defend_against_atari(a)
+
+
+Pattern Sente14
+
+OXx
+.OX
+O.*
+
+:8,OX,reverse_followup(5)
+
+aBx
+.OC
+Od*
+
+;lib(a)>1 && !attack(B) && !attack(C) && xlib(d)>1
+
+
+Pattern Sente15
+
+OX.
+oOX
+oo*
+
+:8,OX,followup(5)
+
+aBd
+eOC
+fg*
+
+;lib(a)>1 && o_alive_somewhere(e,f,g) && !attack(B) && !attack(C)
+;&& !oplay_defend_both(*,?,d,B,C)
+
+
+Pattern Sente16
+# gf New pattern. (3.1.14)
+# The constraint is unprecise, but correcting it probably
+# require a handwritten helper.
+
+.O?
+.*X
+---
+
+:8,OX,reverse_followup(5)
+
+bO?
+a*X
+---
+
+;xplay_attack(*,a,b,*) && xplay_defend_both(*,a,b,*,b)
+
+
+Pattern Sente17
+# gf New pattern. (3.1.15)
+
+.OXx
+.*oX
+----
+
+:8,X,reverse_followup(5)
+
+cdXx
+a*bX
+----
+
+;alive(d) && !xplay_defend_both(*,a,b,?,c,a,d)
+
+
+Pattern Sente18
+# gf New pattern. (3.3.13)
+# The reverse followup value is probably often bigger than 5 points.
+
+X..O..
+XOX*..
+......
+------
+
+:8,X,reverse_followup(5)
+
+C..b..
+COX*.a
+......
+------
+
+;omoyo_opposite(a) && alive(b) && alive(C)
+
+
+Pattern Sente19
+# gf New pattern. (3.3.16)
+# Usually underestimating the reverse followup, but better than nothing.
+
+?oO
+o.*
+?OX
+
+:8,OX,reverse_followup(1)
+
+?cO
+ba*
+?OX
+
+;((!o_somewhere(b) && oterri(b))
+; || (!o_somewhere(c) && oterri(c)))
+;&& safe_xmove(*) && !xplay_attack(*,a,*)
+
+
+Pattern Sente20
+# gf New pattern. (3.3.16)
+# Usually underestimating the reverse followup, but better than nothing.
+
+?.O
+..*
+?OX
+
+:8,OX,reverse_followup(2)
+
+?cO
+ba*
+?OX
+
+;oterri(b) && oterri(c) && safe_xmove(*) && !xplay_attack(*,a,*)
+
+
+Pattern Sente21
+# gf New pattern. (3.3.16)
+# Usually underestimating the reverse followup, but better than nothing.
+
+..O
+..*
+?OX
+
+:8,OX,reverse_followup(3)
+
+dcO
+ba*
+?OX
+
+;oterri(b) && oterri(c) && oterri(d) && safe_xmove(*) && !xplay_attack(*,a,*)
+
+
+Pattern Sente22
+# pp New pattern, see trevord:950 (3.3.20)
+
+?OX?
+O.*.
+?XX?
+
+:8,OX
+
+?OX?
+Oa*b
+?AA?
+
+; oplay_attack(*,A) && oplay_attack(*,a,A) && oplay_attack(*,b,a,A)
+
+> good_attack_threat(*,A)
+
+
+Pattern Sente23
+# gf New pattern. (3.5.4)
+# See trevorc:450.
+
+?OX
+O.O
+O*X
+
+:8,O
+
+?OX
+a.c
+a*B
+
+;lib(a)>3 && alive(B) && xplay_attack(*,c)
+
+>prevent_attack_threat(c);
+
+
+Pattern Sente24
+# pp New pattern (3.5.8)
+
+?*?
+XO.
+?O.
+---
+
+:8,OX,reverse_followup(8)
+
+?*?
+XAb
+?A.
+---
+
+; lib(A)==3 && safe_xmove(*) && !xplay_defend(*,?,b,A)
+
+
+########################################################
+#
+# Double threat moves and defense against double threats
+#
+########################################################
+
+
+Pattern DD1
+# FIXME: This isn't really double atari - just plain old
+#   capture also matches here.  see nngs:1260
+#   Does this matter?
+
+*X        double atari on you
+XO
+
+:\,X
+
+*A
+BO
+
+>test_attack_either_move(A,B)
+
+
+Pattern DD2
+
+*O        double atari on me
+OX
+
+:\,nO
+
+*a
+bX
+
+;!xplay_defend_both(*,a,b)
+
+>add_defend_both_move(a,b);
+
+
+Pattern DD2b
+
+*.O        double atari on me, defended by hanging connection
+?OX
+
+:8,O
+
+*ca
+?bX
+
+;!xplay_defend_both(c,a,b)
+;&& (oplay_attack(*,c,c) || oplay_defend_both(*,c,a,b))
+
+>add_defend_both_move(a,b);
+
+
+Pattern DD3
+
+OXX
+X*.
+X..
+
+:8,O
+
+OEE
+D*c
+Dba
+
+;oplay_attack(*,D) && oplay_attack_either(*,a,D,E)
+;&& !oplay_defend_both(*,b,c,D,E)
+
+>test_attack_either_move(D,E)
+
+
+Pattern DD4
+# gf Revised constraint. (3.5.2)
+
+XOO
+O..
+O.*
+
+:8,O
+
+Xee
+dac
+db*
+
+;xplay_attack(a,d) && xplay_attack_either(a,*,d,e)
+;&& !xplay_defend_both(a,b,c,d,e) && !xplay_defend_both(a,c,b,d,e)
+;&& !xplay_connect(a,d,e) && oplay_connect(*,a,d,e)
+
+>add_defend_both_move(d,e);
+
+
+Pattern DD5
+# gf Exclude this pattern when scoring. (3.3.14)
+# This is somewhat wimpy. We should do more exact reading to verify
+# whether it really is necessary.
+
+XOO
+O..
+O.*
+
+:8,O
+
+Xcc
+ba.
+b.*
+
+;!doing_scoring
+;&& lib(c)<=4 && xplay_attack(a,b) && safe_xmove(a) && odefend_against(*,a)
+
+>add_defend_both_move(b,c);
+
+
+Pattern DD6
+# al1 Revised symmetry. (3.7.11)
+
+?o?          Double attack
+X*X
+?o?
+
+:+,-
+
+?o?
+A*B
+?o?
+
+>test_attack_either_move(A,B)
+
+
+Pattern DD7
+# gf Revised constraint. (3.1.20)
+
+*OX
+?XO
+
+:8,-
+
+*dA
+?Bc
+
+;lib(d)<4 && (xlib(*)>1 || lib(d)<3)
+;&& oplay_defend(*,A) && oplay_defend(*,B)
+;&& !oplay_attack(*,c)
+
+>test_attack_either_move(A,B)
+
+
+Pattern DD8
+
+O..       extend to connect
+XO*
+
+:8,O
+
+ca.
+Xb*
+
+;safe_xmove(a) && !xplay_defend_both(a,b,c) && oplay_defend_both(*,a,b,c)
+
+>add_defend_both_move(b,c);
+
+
+Pattern DD8b
+# gf Added constraint. (3.3.20)
+# Not a problem if the opponent can't even threaten to cut after the move.
+
+O..       extend to connect
+XO*
+?o.
+
+:8,O,shape(-1)
+
+ba.
+XO*
+?o.
+
+;oplay_disconnect(*,a,*,b)
+
+
+Pattern DD9
+
+O.*       double atari on me
+XO.
+
+:8,O
+
+ca*
+Xb.
+
+;safe_xmove(a) && !xplay_defend_both(a,b,c) && oplay_defend_both(*,a,b,c)
+
+>add_defend_both_move(b,c);
+
+
+Pattern DD10
+
+*O.              generalized tsukenobi joseki
+?XO
+
+:8,-
+
+*ba
+?Xc
+
+;(alive(b) || alive(c))
+;&& safe_xmove(a)==WIN && !xplay_defend_both(a,b,c) && oplay_attack(*,a,a)==WIN
+
+>add_defend_both_move(b,c);
+
+
+Pattern DD11
+
+X.?        double attack
+O*.
+??X
+
+:8,-,shape(2)
+
+A.?
+O*.
+??B
+
+; !attack(A) && !attack(B) && oplay_attack(*,A) && oplay_attack(*,B)
+
+>test_attack_either_move(A,B)
+
+
+Pattern DD12
+# gf Revised. (3.1.9)
+
+OX?        double attack
+X*.
+X..
+X..
+---
+
+:8,-
+
+EB?
+A*d
+Ac.
+A..
+---
+
+;lib(A)==3 && !oplay_attack(*,E) && oplay_attack(*,d,A)
+;&& !oplay_defend_both(*,c,d,A,B)
+
+>test_attack_either_move(A,B)
+
+
+Pattern DD13
+# gf Revised. (3.1.9)
+
+XO?        double defense
+O*.
+O..
+O..
+---
+
+:8,-
+
+eb?
+a*d
+ac.
+a..
+---
+
+;lib(a)==3 && !attack(e) && xplay_attack(*,d,a)
+;&& !xplay_defend_both(*,c,d,a,b)
+
+>add_defend_both_move(a,b)
+
+
+###########################
+#
+# Temporary patterns to correct certain misbehaviours.
+#
+###########################
+
+
+Pattern Temp1
+# This joseki is played far too frequently.
+# existed since at least 3.0.0
+
+|........
+|........
+|.....*..
+|...O....
+|.....X..
+|........
+|........
++--------
+
+:8,-,maxvalue(25)
+
+
+Pattern Temp5
+# Don't make a short jump along the edge before shimari.
+# existed since at least 3.0.0
+# tm Modified (3.1.20)
+
+???xxxxx|
+........|
+........|
+........|
+.*..O...|
+........|
+........|
+--------+
+
+:8,-
+
+???xxxxx|
+........|
+........|
+........|
+.*..O...|
+........|
+........|
+--------+
+
+>antisuji(*);
+
+
+Pattern Temp6
+# Don't make a short extension from san-san in open surroundings.
+# existed since at least 3.0.0
+
+.........|
+.........|
+.........|
+.........|
+...*..O..|
+.........|
+.........|
+---------+
+
+:8,-
+
+.........|
+.........|
+.........|
+..b......|
+...*a.O..|
+.........|
+.........|
+---------+
+
+>antisuji(*);
+>antisuji(a);
+>antisuji(b);
+
+
+Pattern Temp7a
+# Don't make a one space jump along the edge when there is room for a
+# two space jump.
+# existed since at least 3.0.0
+# FIXME: consider using replace instead of antisuji here?
+
+......
+......
+..*.O.
+......
+......
+------
+
+:8,-
+
+>antisuji(*);
+
+
+Pattern Temp7b
+# Usually stupid
+# existed since at least 3.1.20
+
+X...xxx
+XXO.xxx
+OX*....
+.......
+-------
+
+:8,-
+
+G...abc
+GGO.def
+OG*....
+.......
+-------
+
+;!weak(G) && x_alive_somewhere(a,b,c,d,e,f)
+
+>antisuji(*);
+
+
+Pattern Temp8
+# existed since at least 3.1.20
+
+.....o         Don't crosscut
+.*X.Oo
+.XO..o
+.....o
+......
+------
+
+:8,-,shape(-10)
+
+
+Pattern Temp9
+# gf New pattern. (3.3.6)
+# ab Modified: ok after approach move (3.7.1)
+
+|............
+|............
+|............  don't play halfways between hoshi
+|...O.....O..
+|......*.....
+|............
+|............
++------------
+
+:8,-
+
+|............
+|............
+|............
+|...O..a..O..
+|......*.....
+|............
+|............
++------------
+
+>antisuji(*);
+>antisuji(a);
+
+
+# END OF FILE
diff --git a/patterns/sansan.db b/patterns/sansan.db
new file mode 100644 (file)
index 0000000..2438e2e
--- /dev/null
@@ -0,0 +1,185 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JS1
+
+---------+
+.........|
+.........|
+......X..|
+.....*...|
+.........|
+.........|
+.........|
+.........|
+.........|
+
+:/,sFj
+
+
+Pattern JS2
+
+-----+
+.....|
+.....|
+..O..|
+.X*..|
+.....|
+.....|
+
+:8,sFJ
+
+
+Pattern JS3
+
+-------+
+.......|
+.......|
+....X..|
+...OX..|
+...*...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JS4
+
+-------+
+.......|
+..*....|
+....O..|
+...XO..|
+...X...|
+.......|
+.......|
+
+:8,sFJ
+
+
+Pattern JS5
+
+--------+
+........|
+...X....|
+.....X..|
+.*..OX..|
+....O...|
+........|
+........|
+
+:8,sFJ-,shape(10)
+
+
+Pattern JS6
+
+---------+
+.........|
+....X....|
+......X..|
+..O..OX..|
+.....O...|
+.......X.|
+.....*...|
+.........|
+.........|
+
+:8,sFJ
+
+
+Pattern JS7
+
+--------+
+........|
+........|
+..*..O..|
+........|
+........|
+....X...|
+
+:8,sFJ
+
+
+Pattern JS8
+
+-------+
+.......|
+.......|
+...XO..|
+...*...|
+.......|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JS9
+
+-------+
+.......|
+.......|
+...XO..|
+...OX..|
+....*..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JS10
+
+-------+
+.......|
+.......|
+..*XO..|
+...OXX.|
+....O..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JS11
+
+-------+
+.......|
+...X...|
+..OXO..|
+...OXX.|
+..*.O..|
+.......|
+.......|
+
+:/,sFU
+
+
diff --git a/patterns/sansan.sgf b/patterns/sansan.sgf
new file mode 100644 (file)
index 0000000..4706901
--- /dev/null
@@ -0,0 +1,40 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation - version 3 or
+at your option any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19]HA[0]
+GN[Sansan joseki database]
+;B[qc]
+(;W[pd]MA[ki]C[j
+];B[qd]MA[of];W[pe]MA[mg];B[ob]MA[mg];W[md]
+MA[lg]C[:-,shape(10)
+];B[rf];W[pg]MA[ki])
+
+(;W[pf];B[nc]MA[lf])
+
+(;W[pc];B[pd]MA[mg]C[U
+];W[qd];B[qe]MA[mg]C[U
+];W[rd];B[oc]MA[mg]C[U
+]
+;W[pb];B[oe]MA[mg]C[U
+])
+
+)
diff --git a/patterns/takamoku.db b/patterns/takamoku.db
new file mode 100644 (file)
index 0000000..2ed129e
--- /dev/null
@@ -0,0 +1,1083 @@
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
+# http://www.gnu.org/software/gnugo/ for more information.          #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
+# 2008 and 2009 by the Free Software Foundation.                    #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License as    #
+# published by the Free Software Foundation - version 3 or          #
+# (at your option) any later version.                               #
+#                                                                   #
+# This program is distributed in the hope that it will be useful,   #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #
+# GNU General Public License in file COPYING for more details.      #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This file is automatically generated by joseki. Do not edit       #
+# it directly. Instead, edit the corresponding sgf file.            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+attribute_map general
+
+Pattern JT1
+
+--------+
+........|
+........|
+.....*..|
+...O.X..|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JT2
+
+--------+
+........|
+........|
+.....X*.|
+...X.O..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JT3
+
+--------+
+........|
+........|
+....*OX.|
+...O.X..|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JT4
+
+--------+
+........|
+........|
+....XXO.|
+...X.O..|
+......*.|
+........|
+
+:8,sFU
+
+
+Pattern JT5
+
+----------+
+..........|
+..........|
+.*....OOX.|
+.....O.X..|
+........X.|
+
+:8,sFJ
+
+
+Pattern JT6
+
+------+
+......|
+......|
+..XXO.|
+.X.O..|
+....O.|
+..*...|
+......|
+......|
+
+:8,sFU
+
+
+Pattern JT7
+
+--------+
+........|
+........|
+........|
+...O.X..|
+.....*..|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JT8
+
+--------+
+........|
+........|
+........|
+...X.O..|
+.....X*.|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT9
+
+--------+
+........|
+........|
+........|
+...O.X..|
+....*OX.|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JT10
+
+--------+
+........|
+........|
+........|
+...X.O..|
+....XXO.|
+.....*..|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT11
+
+--------+
+........|
+........|
+........|
+...O.X..|
+....OOX.|
+.....X*.|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT12
+
+--------+
+........|
+........|
+........|
+...X.O..|
+....XXO.|
+.....OX.|
+......*.|
+........|
+
+:8,sFU
+
+
+Pattern JT13
+
+--------+
+........|
+........|
+........|
+...O.X*.|
+....OOX.|
+.....XO.|
+......X.|
+........|
+
+:8,sFU
+
+
+Pattern JT14
+
+--------+
+........|
+........|
+........|
+...X.OX.|
+....XXO.|
+.....OX*|
+......O.|
+........|
+
+:8,sFU
+
+
+Pattern JT15
+
+--------+
+........|
+........|
+.....*..|
+...O.XO.|
+....OOX.|
+.....X.X|
+
+:8,sFU
+
+
+Pattern JT16
+
+--------+
+........|
+........|
+........|
+...O.X..|
+........|
+....*...|
+........|
+........|
+........|
+
+:8,sFj
+
+
+Pattern JT17
+
+--------+
+........|
+........|
+...*....|
+...X.O..|
+........|
+....X...|
+........|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT18
+
+---------+
+.........|
+.........|
+...*X....|
+....O.X..|
+.........|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT19
+
+--------+
+........|
+........|
+..XO*...|
+...X.O..|
+........|
+....X...|
+........|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT20
+
+--------+
+........|
+........|
+..OXX...|
+..*O.X..|
+........|
+....O...|
+........|
+........|
+........|
+
+:8,sFJ-,shape(5)
+
+
+Pattern JT21
+
+--------+
+........|
+........|
+..XOO...|
+..XX.O..|
+........|
+....X.*.|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JT22
+
+--------+
+........|
+........|
+..OXX...|
+..OO.X..|
+......*.|
+....O...|
+........|
+........|
+........|
+
+:8,sFJ
+
+
+Pattern JT23
+
+---------+
+.........|
+.........|
+....X....|
+....O*X..|
+.........|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT24
+
+--------+
+........|
+........|
+...O*...|
+...XXO..|
+........|
+....X...|
+........|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT25
+
+--------+
+........|
+........|
+...XX*..|
+...OOX..|
+........|
+....O...|
+........|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT26
+
+--------+
+........|
+........|
+...OOX*.|
+...XXO..|
+........|
+....X...|
+........|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT27
+
+--------+
+........|
+.....*..|
+...XXOX.|
+...OOX..|
+........|
+....O...|
+........|
+........|
+........|
+
+:8,sFU
+
+
+Pattern JT28
+
+---------+
+.........|
+......X*.|
+....OOXO.|
+....XXO..|
+.........|
+.....X...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT29
+
+---------+
+.........|
+......OX.|
+....XXOX.|
+....OOX..|
+......*..|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT30
+
+---------+
+.........|
+......XO.|
+....OOXO.|
+....XXO*.|
+......X..|
+.....X...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT31
+
+---------+
+.........|
+......OX.|
+...*XXOX.|
+....OOXX.|
+......O..|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT32
+
+---------+
+.........|
+....*XOX.|
+...OXXOX.|
+....OOXX.|
+......O..|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT33
+
+---------+
+......X..|
+....OX.X.|
+...OXX.X.|
+..*.OOXX.|
+......O..|
+.....O...|
+.........|
+.........|
+.........|
+
+:8,sFU
+
+
+Pattern JT34
+
+------+
+......|
+......|
+.OX...|
+.X*O..|
+......|
+..X...|
+
+:8,sFU
+
+
+Pattern JT35
+
+-------+
+.......|
+.......|
+..XO*..|
+..OXX..|
+.......|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JT36
+
+------+
+......|
+......|
+.OXX*.|
+.XOO..|
+......|
+..X...|
+......|
+
+:8,sFU
+
+
+Pattern JT37
+
+-------+
+.......|
+.....*.|
+..XOOX.|
+..OXX..|
+.......|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JT38
+
+-------+
+.......|
+.....X.|
+..OXXO.|
+..XOO*.|
+.......|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JT39
+
+-------+
+.......|
+..*..O.|
+..XOOX.|
+..OXXX.|
+.......|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JT40
+
+-------+
+.......|
+..X..X.|
+.*OXXO.|
+..XOOO.|
+.......|
+...X...|
+.......|
+
+:8,sFJ
+
+
+Pattern JT41
+
+-------+
+.......|
+.*O..O.|
+.XXOOX.|
+..OXXX.|
+.......|
+...O...|
+.......|
+
+:8,sFJ
+
+
+Pattern JT42
+
+--------+
+........|
+..XX..X.|
+.*OOXXO.|
+...XOOO.|
+........|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JT43
+
+---------+
+.........|
+...OO..O.|
+..XXXOOX.|
+....OXXX.|
+....*....|
+.....O...|
+.........|
+
+:8,sFJ
+
+
+Pattern JT44
+
+--------+
+........|
+..XX..X*|
+.OOOXXO.|
+...XOOO.|
+...X....|
+....X...|
+........|
+
+:8,sFJ
+
+
+Pattern JT45
+
+--------+
+........|
+..OO.*OX|
+.XXXOOX.|
+...OXXX.|
+...O....|
+....O...|
+........|
+
+:8,sFJ
+
+
+Pattern JT46
+
+-------+
+.......|
+.XX.XXO|
+OOOXXO.|
+..XOOO.|
+..X....|
+...X...|
+....*..|
+.......|
+.......|
+
+:8,sFU
+
+
+Pattern JT47
+
+---------+
+.........|
+...OO.OOX|
+..XXXOOX.|
+....OXXX.|
+....O....|
+.....O...|
+......X..|
+.....*...|
+.........|
+
+:8,sFJ
+
+
+Pattern JT48
+
+----------+
+..........|
+....XX.XXO|
+.*.OOOXXO.|
+.....XOOO.|
+.....X....|
+......X...|
+.......O..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JT49
+
+----------+
+..........|
+...*OO.OOX|
+.X.XXXOOX.|
+.....OXXX.|
+.....O....|
+......O...|
+.......X..|
+......O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JT50
+
+----------+
+..........|
+..*XXX.XXO|
+.O.OOOXXO.|
+.....XOOO.|
+.....X....|
+......X...|
+.......O..|
+......X...|
+..........|
+
+:8,sFJ
+
+
+Pattern JT51
+
+----------+
+..........|
+..XOOO.OOX|
+.X.XXXOOX.|
+..*..OXXX.|
+.....O....|
+......O...|
+.......X..|
+......O...|
+..........|
+
+:8,sFJ
+
+
+Pattern JT52
+
+----------+
+..........|
+..OXXX.XXO|
+.O*OOOXXO.|
+..X..XOOO.|
+.....X....|
+......X...|
+.......O..|
+......X...|
+..........|
+
+:8,sFU
+
+
+Pattern JT53
+
+---------+
+..*......|
+.XOOO.OOX|
+XXXXXOOX.|
+.O..OXXX.|
+....O....|
+.....O...|
+......X..|
+.....O...|
+.........|
+
+:8,sFJ
+
+
+Pattern JT54
+
+---------+
+..X......|
+.OXXX.XXO|
+OOOOOXXO.|
+.X..XOOO.|
+....X....|
+.....X*..|
+......O..|
+.....X...|
+.........|
+
+:8,sFJ
+
+
+Pattern JT55
+
+------------+
+.....O......|
+....XOOO.OOX|
+...XXXXXOOX.|
+....O..OXXX.|
+.......O....|
+........OX..|
+.........X..|
+........O*..|
+............|
+
+:8,sFJ
+
+
+Pattern JT56
+
+------------+
+.....X......|
+....OXXX.XXO|
+...OOOOOXXO.|
+....X..XOOO.|
+.......X....|
+........XO..|
+.........O..|
+........XX*.|
+............|
+
+:8,sFJ
+
+
+Pattern JT57
+
+------------+
+.....O......|
+....XOOO.OOX|
+...XXXXXOOX.|
+....O..OXXX.|
+.......O....|
+........OX..|
+.........X..|
+........OOX.|
+..........*.|
+............|
+
+:8,sFJ
+
+
+Pattern JT58
+
+---------+
+..X......|
+.OXXX.XXO|
+OOOOOXXO.|
+.X..XOOO.|
+....X....|
+.....XO..|
+.....*O..|
+.....XXO.|
+.......X.|
+.........|
+
+:8,sFJ
+
+
+Pattern JT59
+
+---------+
+..O......|
+.XOOO.OOX|
+XXXXXOOX.|
+.O..OXXX.|
+....O....|
+.....OX..|
+....*XX..|
+.....OOX.|
+.......O.|
+.........|
+
+:8,sFJ
+
+
+Pattern JT60
+
+---------+
+..X......|
+.OXXX.XXO|
+OOOOOXXO.|
+.X..XOOO.|
+....X....|
+.....XO..|
+....XOO..|
+....*XXO.|
+.......X.|
+.........|
+
+:8,sFJ
+
+
+Pattern JT61
+
+---------+
+..O......|
+.XOOO.OOX|
+XXXXXOOX.|
+.O..OXXX.|
+....O....|
+.....OX..|
+...*OXX..|
+....XOOX.|
+.......O.|
+.........|
+
+:8,sFJ
+
+
+Pattern JT62
+
+---------+
+..X......|
+.OXXX.XXO|
+OOOOOXXO.|
+.X..XOOO.|
+....X....|
+.....XO..|
+...XXOO.*|
+....OXXO.|
+.......X.|
+.........|
+
+:8,sFJ
+
+
+Pattern JT63
+
+---------+
+..O......|
+.XOOO.OOX|
+XXXXXOOX.|
+.O..OXXX.|
+....O....|
+.....OX..|
+...OOXX.X|
+....XOOX.|
+....*..O.|
+.........|
+
+:8,sFJ
+
+
+Pattern JT64
+
+-------------+
+......X......|
+.....OXXX.XXO|
+.*..OOOOOXXO.|
+.....X..XOOO.|
+........X....|
+.........XO..|
+.......XXOO.O|
+........OXXO.|
+........X..X.|
+.............|
+
+:8,sFJ
+
+-------------+
+......X......|
+.....OXXX.XXO|
+.*..OOOOOXXO.|
+.....X..XOOO.|
+........X....|
+.........XO..|
+.......XXOO.O|
+........AXXO.|
+........X..X.|
+.............|
+
+;!defend(A)
+
+
+Pattern JT65
+
+------------+
+.....O......|
+....XOOO.OOX|
+X..XXXXXOOX.|
+....O..OXXX.|
+.......O....|
+........OX..|
+......OOXX.X|
+......*XOOX.|
+.......O..O.|
+............|
+
+:8,sFJ
+
+
+Pattern JT66
+
+---------+
+..X......|
+.OXXX.XXO|
+OOOOOXXO.|
+.X..XOOO.|
+....X....|
+.....XO..|
+...XXOO.O|
+...*OXXO.|
+....X..X.|
+.........|
+
+:8,sFJ
+
+---------+
+..X......|
+.OXXX.XXO|
+OOOOOXXO.|
+.X..XOOO.|
+....X....|
+.....XO..|
+...XXOO.O|
+...*OXXO.|
+....X..X.|
+.........|
+
+;safe_omove(*)
+
+
+Pattern JT67
+
+--------+
+........|
+........|
+.....*..|
+...O.X..|
+........|
+....O...|
+........|
+........|
+........|
+
+:8,sFt
+
+
diff --git a/patterns/takamoku.sgf b/patterns/takamoku.sgf
new file mode 100644 (file)
index 0000000..8537ee0
--- /dev/null
@@ -0,0 +1,101 @@
+This is GNU Go, a Go program. Contact gnugo@gnu.org, or see
+http://www.gnu.org/software/gnugo/ for more information.
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+2008 and 2009 by the Free Software Foundation.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+publishedby the Free Software Foundation - version 3 or
+at your option, any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License in file COPYING for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program; if not, write to the Free
+Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02111, USA.
+
+(;GM[1]FF[3]
+SZ[19]HA[0]
+GN[Takamoku joseki database]
+;B[od];W[qd]
+(;B[qc]MA[lf]C[j
+];W[rc]MA[lf];B[pc]MA[lf];W[re]MA[lf]C[U
+];B[kc]
+MA[je];W[pf]MA[nh]C[U
+])
+
+(;B[qe]MA[lg]C[j
+];W[re]MA[lg]C[U
+];B[pe]MA[lg];W[qf]MA[lh]C[U
+];B[rf]
+MA[lh]C[U
+];W[rg]MA[lh]C[U
+];B[rd]MA[lh]C[U
+];W[sf]MA[lh]C[U
+];B[qc]
+MA[lf]C[U
+])
+
+(;B[pf]MA[li]C[j
+]
+(;W[oc]MA[li]C[U
+]
+(;B[nc]MA[ki]C[U
+];W[pc]MA[li]C[U
+];B[nd]MA[li]C[:-,shape(5)
+]
+(;W[rf]MA[li])
+
+(;W[tt];B[re]MA[li])
+)
+
+(;B[pd]MA[ki]C[U
+];W[pc]MA[li]C[U
+];B[qc]MA[li]C[U
+];W[rc]MA[li]C[U
+];
+B[qb]MA[li]C[U
+];W[rb]MA[ki]C[U
+];B[qe]MA[ki]C[U
+];W[rd]MA[ki]C[U
+];
+B[nc]MA[ki]C[U
+];W[pb]C[U
+];B[ob]MA[ki]C[U
+];W[qa]C[U
+];B[md]MA[ki]
+C[U
+])
+
+(;B[pc]
+C[This leads to very tricky fighting, so we don't initiate this sequence.
+]
+;W[pd]MA[nf]C[U
+];B[qc]MA[mg];W[rc]MA[ng]C[U
+];B[rb]MA[mg];W[rd]MA[mg]
+;B[ob]MA[mg];W[nc]MA[mg];B[nb]MA[mg];W[mc]MA[lg];B[oe]MA[kg];W[sb]
+MA[lg];B[qb]MA[lg];W[qg]MA[mi]C[U
+];B[ph]MA[ki];W[kc]MA[ji];B[mb]
+MA[ji];W[lb]MA[ji];B[ld]MA[ji];W[lc]MA[ji]C[U
+];B[ma]MA[ki];W[qf]
+MA[ki];B[qh]MA[hi];W[rh]MA[hi];B[ri]MA[hj];W[pg]MA[kj];B[og]MA[kj];
+W[oh]MA[kj];B[ng]MA[kj];W[sg]MA[kj];B[oi]MA[kj]
+(;W[hc]MA[gj]LB[oh:A]C[;!defend(A)
+];B[nh]MA[hj])
+
+(;W[nh]C[;safe_omove(*)
+]MA[kj])
+)
+)
+
+(;W[tt]C[U
+];B[qc]MA[li]C[t
+])
+)
+
+)
diff --git a/patterns/transform.c b/patterns/transform.c
new file mode 100644 (file)
index 0000000..6177fa8
--- /dev/null
@@ -0,0 +1,174 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "liberty.h"
+#include "dfa.h"
+
+#include <memory.h>
+
+/* Array for use by TRANSFORM() macro. */
+int transformation[MAX_OFFSET][8];
+
+/* Matrix array for use by TRANSFORM2() macro. */
+const int transformation2[8][2][2] = {
+  { { 1,  0}, 
+    { 0,  1}}, /* a - identity transformation matrix */
+
+  { { 0,  1}, 
+    {-1,  0}}, /* g - rotate 90 clockwise */
+
+  { {-1,  0}, 
+    { 0, -1}}, /* d - rotate 180 */
+  
+  { { 0, -1}, 
+    { 1,  0}}, /* f - rotate 90 counter-clockwise */
+  
+  { { 0, -1}, 
+    {-1,  0}}, /* h - rotate 90 clockwise and flip on x axis */
+  
+  { {-1,  0}, 
+    { 0,  1}}, /* b - flip on x axis */
+  
+  { { 0,  1}, 
+    { 1,  0}}, /* e - rotate 90 counter-clockwise and flip on x axis */
+  
+  { { 1,  0}, 
+    { 0, -1}}  /* c - flip on y axis */
+};
+
+
+/* Initialize transformation[][] array. */
+void
+transformation_init(void)
+{
+  int k;
+  int dx;
+  int dy;
+
+  for (k = 0; k < 8; k++) {
+    for (dy = -MAX_BOARD+1; dy <= MAX_BOARD-1; dy++) {
+      for (dx = -MAX_BOARD+1; dx <= MAX_BOARD-1; dx++) {
+       int tx;
+       int ty;
+
+       TRANSFORM2(dx, dy, &tx, &ty, k);
+       transformation[OFFSET(dx, dy)][k] = DELTA(tx, ty);
+      }
+    }
+  }
+}
+/* Spiral orders for DFA matching and building. */
+int spiral[DFA_MAX_ORDER][8];
+
+/* The spiral order is the way we scan the board, we begin on the
+ * anchor and we progressively scan all its neigbouring intersections,
+ * collecting all the known patterns we meet on our way:
+ *
+ *                 4      4      4
+ * 1   1     13    13    513    513  ... and so on until we reach a
+ *     2     2     2      2     827      stopping state in the DFA.
+ *                               6
+ *
+ * Build the spiral order for each transformation: instead of changing
+ * the board or changing the patterns, we only change the order.  For
+ * e.g. the same DFA can perform the pattern matching
+ *
+ * That way for identity:
+ *
+ *     40                                            04
+ *     5139     and this way for mirror symetry:    9315
+ *     827                                           728
+ *     6                                              6
+ *
+ * Anther possibility is to generate one string by pattern and by
+ * transformation in `mkpat' to avoid any runtime transformation but
+ * it drastically increases the size of DFAs.
+ */
+void
+build_spiral_order(void)
+{
+  int i;
+  int j;
+  int k;
+  char mark[2 * DFA_MAX_BOARD + 1][2 * DFA_MAX_BOARD + 1];
+  int queue_i[DFA_MAX_ORDER];
+  int queue_j[DFA_MAX_ORDER];
+  int queue_start = 0;
+  int queue_end = 1;
+
+  static const int delta_i[4] = { 1,  0, -1,  0};
+  static const int delta_j[4] = { 0, 1,  0,  -1};
+
+  /* Initialization. */
+  memset(mark, 1, sizeof(mark));
+  for (i = 1; i < 2 * DFA_MAX_BOARD; i++) {
+    for (j = 1; j < 2 * DFA_MAX_BOARD; j++)
+      mark[i][j] = 0;
+  }
+
+  queue_i[0] = DFA_MAX_BOARD;
+  queue_j[0] = DFA_MAX_BOARD;
+  mark[DFA_MAX_BOARD][DFA_MAX_BOARD] = 1;
+
+  do {
+    int transformation;
+
+    /* Transform queued coordinates and store DFA offsets in spiral[][]. */
+    for (transformation = 0; transformation < 8; transformation++) {
+      TRANSFORM2(queue_i[queue_start] - DFA_MAX_BOARD,
+                queue_j[queue_start] - DFA_MAX_BOARD,
+                &i, &j, transformation);
+      spiral[queue_start][transformation] = DFA_BASE * i + j;
+    }
+
+    for (k = 0; k < 4; k++) {
+      i = queue_i[queue_start] + delta_i[k];
+      j = queue_j[queue_start] + delta_j[k];
+
+      if (!mark[i][j]) {
+       queue_i[queue_end] = i;
+       queue_j[queue_end++] = j;
+       mark[i][j] = 1;
+      }
+    }
+  } while (++queue_start < queue_end);
+
+  if (0) {
+    int transformation;
+    for (transformation = 0; transformation < 8; transformation++) {
+      fprintf(stderr, "Transformation %d:\n", transformation);
+      for (k = 0; k < 16; k++) {
+       fprintf(stderr, "\t%d(%c); %d\n", k, 'A' + k,
+               spiral[k][transformation]);
+      }
+    }
+  }
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/uncompress_fuseki.c b/patterns/uncompress_fuseki.c
new file mode 100644 (file)
index 0000000..3290b05
--- /dev/null
@@ -0,0 +1,322 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "board.h"
+#include "liberty.h"
+#include "hash.h"
+#include "gg_utils.h"
+
+#define BUFSIZE 160
+
+#define USAGE "\
+Usage :\
+uncompress_fuseki boardsize filename c\n\
+uncompress_fuseki boardsize filename db\n\
+"
+
+#define DB_PREAMBLE "\
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\
+# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #\n\
+# http://www.gnu.org/software/gnugo/ for more information.          #\n\
+#                                                                   #\n\
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007    #\n\
+# 2008 and 2009 by the Free Software Foundation.                    #\n\
+#                                                                   #\n\
+# This program is free software; you can redistribute it and/or     #\n\
+# modify it under the terms of the GNU General Public License as    #\n\
+# published by the Free Software Foundation - version 3             #\n\
+# or (at your option) any later version.                            #\n\
+#                                                                   #\n\
+# This program is distributed in the hope that it will be useful,   #\n\
+# but WITHOUT ANY WARRANTY; without even the implied warranty of    #\n\
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     #\n\
+# GNU General Public License in file COPYING for more details.      #\n\
+#                                                                   #\n\
+# You should have received a copy of the GNU General Public         #\n\
+# License along with this program; if not, write to the Free        #\n\
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #\n\
+# Boston, MA 02111, USA.                                            #\n\
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\
+# This file is automatically generated by uncompress_fuseki. Do     #\n\
+# not edit it directly. Instead, edit the corresponding .dbz file.  #\n\
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\
+\n\n\
+"
+
+#define DB_HEADER "# Fuseki patternsboardsize %d\nattribute_map value_only\n\n"
+#define DB_FOOTER ""
+
+#define C_PREAMBLE "\
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *\n\
+ * http://www.gnu.org/software/gnugo/ for more information.          *\n\
+ *                                                                   *\n\
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006       *\n\
+ * by the Free Software Foundation.                                  *\n\
+ *                                                                   *\n\
+ * This program is free software; you can redistribute it and/or     *\n\
+ * modify it under the terms of the GNU General Public License as    *\n\
+ * published by the Free Software Foundation - version 3             *\n\
+ * or (at your option) any later version.                            *\n\
+ *                                                                   *\n\
+ * This program is distributed in the hope that it will be useful,   *\n\
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *\n\
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *\n\
+ * GNU General Public License in file COPYING for more details.      *\n\
+ *                                                                   *\n\
+ * You should have received a copy of the GNU General Public         *\n\
+ * License along with this program; if not, write to the Free        *\n\
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *\n\
+ * Boston, MA 02111, USA.                                            *\n\
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\
+\n#include <stdio.h> /* for NULL */\n\
+#include \"liberty.h\"\n\
+#include \"patterns.h\"\n\n\
+"
+
+#define C_HEADER "struct fullboard_pattern fuseki%d[] = {\n"
+#define C_FOOTER "};\n"
+  
+static const char *const db_output_strings[3] =
+  {DB_PREAMBLE, DB_HEADER, DB_FOOTER};
+static const char *const c_output_strings[3] =
+  {C_PREAMBLE, C_HEADER, C_FOOTER};
+
+#define PREAMBLE       0
+#define HEADER                 1
+#define FOOTER                 2
+
+
+/* Place a stone (or move mark) on the internal board. The board point
+ * is sgf encoded.
+ */
+static int
+set_boards(char board[MAX_BOARD + 2][MAX_BOARD + 2],
+          Intersection board1d[BOARDSIZE],
+          char *stones, char color, int boardsize)
+{
+  int i = stones[1] - 'a' + 1;
+  int j = stones[0] - 'a' + 1;
+  if (stones[0] != 't') {
+    assert(i > 0 && i < boardsize + 2);
+    board[i][j] = color;
+    if (color == 'O')
+      board1d[POS(i - 1, j - 1)] = WHITE;
+    else if (color == 'X')
+      board1d[POS(i - 1, j - 1)] = BLACK;
+    return POS(i - 1, j - 1);
+  }
+  else 
+    return NO_MOVE;
+}
+
+static void
+write_pattern(char *name, char board[MAX_BOARD + 2][MAX_BOARD + 2],
+             int value, int boardsize)
+{
+  int i, j;
+  /* Output the uncompressed pattern. */
+  printf("Pattern %s\n\n", name);
+  for (i = 0; i <= boardsize + 1; i++) {
+    for (j = 0; j <= boardsize + 1; j++)
+      printf("%c", board[i][j]);
+    printf("\n");
+  }
+  printf("\n:8,-,value(%d)\n\n\n", value);
+}
+
+
+static void
+write_pattern_c_code(char *name, Intersection board1d[BOARDSIZE],
+                    int move_pos, int value, int boardsize, int patlen)
+{
+  int k;
+  Hash_data pattern_hash;
+
+  /* Compute hash. */
+  hashdata_recalc(&pattern_hash, board1d, NO_MOVE);
+  printf("  {{{");
+  for (k = 0; k < NUM_HASHVALUES; k++) {
+    printf("0x%lx", pattern_hash.hashval[k]);
+    if (k < NUM_HASHVALUES - 1)
+      printf(",");
+  }
+  if (name)
+    printf("}},%d,\"%s\",%d,%d},\n", patlen, name,
+          OFFSET(I(move_pos) - (boardsize-1)/2,
+                 J(move_pos) - (boardsize-1)/2),
+          value);
+  else
+    printf("}},-1,NULL,0,0},\n");
+}
+
+
+
+#define DB_OUTPUT      1
+#define C_OUTPUT       2
+
+
+int
+main(int argc, char *argv[])
+{
+  const char *filename;
+  FILE *input_FILE;
+  const char *const *output_strings;
+  int mode;
+  int move_pos;
+  char line[BUFSIZE];
+  char name[BUFSIZE];
+  char stones[BUFSIZE];
+  int value;
+  char board[MAX_BOARD + 2][MAX_BOARD + 2];
+  Intersection board1d[BOARDSIZE];
+  int boardsize;
+  int i, j, k;
+  int pos;
+  char color;
+
+  /* Check number of arguments. */
+  if (argc != 4) {
+    fprintf(stderr, USAGE);
+    return EXIT_FAILURE;
+  }
+
+  boardsize = atoi(argv[1]);
+  filename = argv[2];
+  if (strncmp(argv[3], "c", 2) == 0) {
+    mode = C_OUTPUT;
+    output_strings = c_output_strings;
+    set_random_seed(HASH_RANDOM_SEED);
+    hash_init();
+  }
+  else if (strncmp(argv[3], "db", 3) == 0) {
+    mode = DB_OUTPUT;
+    output_strings = db_output_strings;
+  }
+  else {
+    fprintf(stderr, USAGE);
+    return EXIT_FAILURE;
+  }
+
+  assert(boardsize > 0);
+  if (boardsize > MAX_BOARD) {
+    printf(output_strings[PREAMBLE]);
+    printf(output_strings[HEADER], boardsize);
+    printf(output_strings[FOOTER]);
+    return EXIT_SUCCESS;
+  }
+  
+  
+  input_FILE = fopen(filename, "r");
+  if (!input_FILE) {
+    fprintf(stderr, "uncompress_fuseki: Cannot open file %s\n", filename);
+    return EXIT_FAILURE;
+  }
+  
+  /* Initialize the corners of the internal board description. */
+  board[0][0] = '+';
+  board[0][boardsize + 1] = '+';
+  board[boardsize + 1][0] = '+';
+  board[boardsize + 1][boardsize + 1] = '+';
+
+  /* Initialize the sides of the internal board description. */
+  for (k = 1; k <= boardsize; k++) {
+    board[0][k] = '-';
+    board[boardsize + 1][k] = '-';
+    board[k][0] = '|';
+    board[k][boardsize + 1] = '|';
+  }
+
+  printf(output_strings[PREAMBLE]);
+  printf(output_strings[HEADER], boardsize);
+  
+
+  /* Loop over the lines of the compressed database.
+   * Each line is one pattern.
+   */
+  while (fgets(line, BUFSIZE, input_FILE)) {
+    int num_stones = 0;
+    /* Clear the internal board. */
+    for (i = 1; i <= boardsize; i++)
+      for (j = 1; j <= boardsize; j++)
+       board[i][j] = '.';
+
+    /* Initialize private 1D-board. */
+    for (pos = 0; pos < BOARDSIZE; pos++)
+      if (I(pos) >= 0 && I(pos) < boardsize
+          && J(pos) >= 0 && J(pos) < boardsize)
+       board1d[pos] = EMPTY;
+      else
+       board1d[pos] = GRAY;
+
+    /* Assume a line from copyright notice if misformed and
+     * silently ignore it.
+     */
+    if (sscanf(line, "%s %d %s", name, &value, stones) != 3)
+      continue;
+
+    /* The first point in the stones list is the move to be played. */
+    move_pos = set_boards(board, board1d, stones, '*', boardsize);
+
+    /* Then follows alternating X and O stones. */
+    color = 'X';
+    for (k = 2; k < (int) strlen(stones); k += 2) {
+      pos = set_boards(board, board1d, stones + k, color, boardsize);
+      if (I(pos) >= 0 && I(pos) < boardsize
+          && J(pos) >= 0 && J(pos) < boardsize)
+       num_stones++;
+      if (color == 'X')
+       color = 'O';
+      else
+       color = 'X';
+    }
+
+    if (mode == DB_OUTPUT)
+      write_pattern(name, board, value, boardsize);
+    else
+      write_pattern_c_code(name, board1d, move_pos, value, boardsize,
+                          num_stones);
+  }
+
+  /* Add a dummy pattern to mark the end of the array. This can't be
+   * done statically in the footer since NUM_HASHVALUES may vary.
+   */
+  if (mode == C_OUTPUT)
+    write_pattern_c_code(NULL, board1d, NO_MOVE, 0, boardsize, -1);
+  
+  printf(output_strings[FOOTER]);
+
+  return EXIT_SUCCESS;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/patterns/uncompress_fuseki.dsp b/patterns/uncompress_fuseki.dsp
new file mode 100644 (file)
index 0000000..025579e
--- /dev/null
@@ -0,0 +1,102 @@
+# Microsoft Developer Studio Project File - Name="uncompress_fuseki" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=uncompress_fuseki - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "uncompress_fuseki.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "uncompress_fuseki.mak" CFG="uncompress_fuseki - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "uncompress_fuseki - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "uncompress_fuseki - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "uncompress_fuseki - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "uncompress_fuseki___Win32_Release"\r
+# PROP BASE Intermediate_Dir "uncompress_fuseki___Win32_Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /I ".." /I "..\engine" /I "..\sgf" /I "..\utils" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FD /c\r
+# SUBTRACT CPP /YX\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 engine.lib /nologo /subsystem:console /incremental:yes /machine:I386 /libpath:"../engine/Release/"\r
+\r
+!ELSEIF  "$(CFG)" == "uncompress_fuseki - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I ".." /I "..\engine" /I "..\sgf" /I "..\utils" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "uncompress_fuseki - Win32 Release"\r
+# Name "uncompress_fuseki - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\uncompress_fuseki.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/regression/13x13.tst b/regression/13x13.tst
new file mode 100644 (file)
index 0000000..f1727fd
--- /dev/null
@@ -0,0 +1,488 @@
+# This is a collection of blunders of GNU Go in Stefan Mertin's private
+# 13x13 - Computer Go tournament in 2001 (see
+# http://www.geocities.com/comp_go/13x13.html). I think they should be
+# quite useful as tests. 13x13-positions are specific as problems, and
+# they are quickly evaluated both by GNU Go and by us when maintaining.
+# (And of course, these are games against some opponents we would like
+# to beat :-) )
+# I also added a few test cases where GNU Go played right in the game,
+# but went wrong in a replay by a newer version (3.14 / 3.15).
+# -Arend
+# Most of the variations in the sgf-files are due to Stefan Mertin.
+
+#CATEGORY=STRATEGY
+#DESCRIPTION=M2 has the huge follow up of rescueing H3, not seen by GNU Go.
+loadsgf games/mertin13x13/goliath-gnugo1.B+11.sgf 22
+1 reg_genmove white
+#? [M2]
+
+# E10 is a little better but the difference might not be worth regressing
+# for now. 
+loadsgf games/mertin13x13/goliath-gnugo1.B+11.sgf 36
+2 reg_genmove white
+#? [E9|E10]
+
+loadsgf games/mertin13x13/goliath-gnugo1.B+11.sgf 58
+3 restricted_genmove white E2 E5
+#? [E5]
+
+#CATEGORY=OWL_TUNING
+# Of course it is nice if you can get away with J11 as GNU Go did in the
+# game, but I think L9 is urgent.
+loadsgf games/mertin13x13/goliath-gnugo2.W+9.sgf 30
+4 reg_genmove white
+#? [L9]*
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/goliath-gnugo3.W+0.sgf 42
+5 reg_genmove white
+#? [N10|N9|M1]
+
+#CATEGORY=BLUNDER
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/goliath-gnugo3.W+0.sgf 44
+6 reg_genmove white
+#? [M8]
+
+#CATEGORY=BLUNDER
+loadsgf games/mertin13x13/goliath-gnugo3.W+0.sgf 48
+7 reg_genmove white
+#? [L7|M7|M6]*
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/goliath-gnugo3.W+0.sgf 54
+8 restricted_genmove white K6 K7 J8 H8
+#? [J8]*
+
+#CATEGORY=BLUNDER
+loadsgf games/mertin13x13/goliath-gnugo3.W+0.sgf 72
+9 reg_genmove white
+#? [C4]*
+
+#CATEGORY=STRATEGY
+loadsgf games/mertin13x13/gointellect-gnugo1.B+14.sgf 12
+10 reg_genmove white
+#? [C2]
+
+#CATEGORY=TERRITORIAL_EVALUATION
+loadsgf games/mertin13x13/gointellect-gnugo1.B+14.sgf 20
+11 reg_genmove white
+#? [L11|H7|G7|F6]*
+
+#CATEGORY=TERRITORIAL_EVALUATION
+loadsgf games/mertin13x13/gointellect-gnugo1.B+14.sgf 24
+12 reg_genmove white
+#? [G7|F7|G8]
+
+##CATEGORY=STRATEGY
+#loadsgf games/mertin13x13/gointellect-gnugo2.W+8.sgf 22
+#13 reg_genmove white
+##? [!G7]*
+
+#CATEGORY=STRATEGY
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gointellect-gnugo2.W+8.sgf 28
+14 reg_genmove white
+#? [A10|E8|E6|H6]*
+
+#CATEGORY=STRATEGY
+# New failure (comparing 3.1.15 and 3.0.0)
+# See also owl:262.
+loadsgf games/mertin13x13/gointellect-gnugo2.W+8.sgf 32
+15 reg_genmove white
+#? [C7|B7|C6|B6|B5|C5]
+
+#CATEGORY=STRATEGY
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 24
+16 reg_genmove white
+#? [C6|C5]
+
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 32
+17 reg_genmove white
+#? [L5|L3]*
+
+#CATEGORY=OWL_TUNING
+# This got broke between 3.0.0 and 3.1.14.
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 42
+18 owl_attack L11
+#? [0]
+
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 48
+19 restricted_genmove white M8 N3
+#? [M8]
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 60
+20 reg_genmove white
+#? [M8]
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 66
+21 reg_genmove white
+#? [N8]
+
+#CATEGORY=BLUNDER
+loadsgf games/mertin13x13/gointellect-gnugo3.B+1.sgf 94
+22 reg_genmove white
+#? [C9]
+
+# E12 is too small.
+loadsgf games/mertin13x13/katsunari-gnugo3.B+14.sgf 16
+23 reg_genmove white
+#? [B7|M10|H2]*
+
+# At least try to connect.
+loadsgf games/mertin13x13/katsunari-gnugo3.B+14.sgf 34
+24 reg_genmove white
+#? [G5|H5|G4]*
+
+loadsgf games/mertin13x13/katsunari-gnugo3.B+14.sgf 64
+25 reg_genmove white
+#? [J5]
+
+loadsgf games/mertin13x13/katsunari-gnugo3.B+14.sgf 66
+26 reg_genmove white
+#? [J5]
+
+#CATEGORY=FUSEKI_STRATEGY
+# Too early for 3-3 invasion at L11 with both UL and LR corner open
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 10
+27 reg_genmove white
+#? [C11|E3|E4]
+
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 12
+28 reg_genmove white
+#? [L10]*
+
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 20
+29 reg_genmove white
+#? [C8]
+
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 32
+30 reg_genmove white
+#? [B7|J13|E2|J6]
+
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 64
+31 reg_genmove white
+#? [M4|N4]
+
+# A nice tesuji by GNU Go worth remembering!
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 74
+33 reg_genmove white
+#? [E7]
+
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 82
+34 reg_genmove white
+#? [K13]
+
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 102
+35 reg_genmove white
+#? [D2]
+
+loadsgf games/mertin13x13/katsunari-gnugo1.W+45.sgf 110
+36 reg_genmove white
+#? [C5]
+
+#CATEGORY=STRATEGY
+#SEVERITY=8
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 12
+37 reg_genmove white
+#? [E10]*
+
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 20
+38 reg_genmove white
+#? [G11]
+
+#CATEGORY=SEMEAI
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 44
+39 reg_genmove white
+#? [H4|J4]
+
+# CATEGORY=FOLLOWUP
+# The followup of K13 is undervalued.
+# In fact, there is none at all (3.3.8)
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 50
+40 reg_genmove white
+#? [K13]*
+
+# C8 can be cut off. Stones added to make the testcase more clear cut.
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 60
+play white H10
+play black D5
+41 restricted_genmove white C8 D7
+#? [D7]*
+
+#CATEGORY=SEMEAI
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 126
+42 reg_genmove white
+#? [N3|N2|L4|L3|L2|L1|M1|N1|M4]
+
+#CATEGORY=ENDGAME_TUNING
+# A correction in this shape would need subtle tuning, as leaving
+# the gap at D7 (by playing D6) should often be bad.
+loadsgf games/mertin13x13/gnugo-goliath1.W+11.sgf 25
+43 reg_genmove black
+#? [D6]*
+
+#CATEGORY=ENDGAME_TUNING
+# To get better evaluation for B6 one would need to
+# 1) add the follow-up value of the monkey jump (very high here as
+# it is sente)
+# 2) move the influence barrier in the current situation around B6
+# a little further down, and/or add a reverse followup value here
+# Part of the overvaluation of M11 is due to the huge shape factor (+8.00)
+# by pattern CC77, which does not make too much sense here.
+loadsgf games/mertin13x13/gnugo-goliath1.W+11.sgf 27
+44 reg_genmove black
+#? [B6]
+
+#CATEGORY=ENDGAME_TUNING
+# B4 is really huge here, appr. 20 pts.
+loadsgf games/mertin13x13/gnugo-goliath1.W+11.sgf 31
+45 reg_genmove black
+#? [B4]
+
+#CATEGORY=ENDGAME_TUNING
+# L3 is 2pt double sente.
+loadsgf games/mertin13x13/gnugo-goliath1.W+11.sgf 85
+46 reg_genmove black
+#? [L3]
+
+#CATEGORY=FUSEKI_STRATEGY
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 7
+47 restricted_genmove black K8 K9 G11
+#? [K8|K9]
+
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 11
+48 reg_genmove black
+#? [K7]
+
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 13
+49 reg_genmove black
+#? [K7]
+
+# Renumbered since there were 2 test 49's
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 19
+149 reg_genmove black
+#? [L7]*
+
+# Here N11 is generated as an "additional attack/defense move", although
+# the black dragon is still dead after black connects at N11.
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 27
+50 owl_defend L10
+#? [0]
+
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 33
+51 reg_genmove black
+#? [L5]*
+
+# GNU Go 3.1.15 wants to play F10 here (although 3.0.0 got H10)
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 35
+52 reg_genmove black
+#? [H10]
+
+#CATEGORY=BLUNDER
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 61
+53 reg_genmove black
+#? [C6]
+
+#CATEGORY=SEMEAI
+# This is very difficult. There are some variations in the .sgf-file,
+# most of them due to Stefan Mertin. Of course J13 (played by GNU Go)
+# is an annoying blunder.
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 67
+54 reg_genmove black
+#? [G10]*
+
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 83
+55 reg_genmove black
+#? [F5]*
+
+#CATEGORY=CONNECTION
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 99
+56 reg_genmove black
+#? [H3]*
+
+#CATEGORY=ENDGAME_TUNING
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 111
+57 reg_genmove black
+#? [C5|D5]
+
+#CATEGORY=OWL_TUNING
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-goliath3.B+16.sgf 55
+58 owl_attack J2
+#? [0]
+
+# Moves like C8 are severly undervalued by GNU Go. /ab
+loadsgf games/mertin13x13/gnugo-katsunari1.B+21.sgf 13
+59 restricted_genmove black J11 C8
+#? [C8]
+
+loadsgf games/mertin13x13/gnugo-katsunari1.B+21.sgf 15
+60 reg_genmove black
+#? [K5|L5]
+
+loadsgf games/mertin13x13/gnugo-katsunari1.B+21.sgf 75
+61 reg_genmove black
+#? [K8]
+
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 13
+62 reg_genmove black
+#? [M5]*
+
+# New failure (comparing 3.0.0 and 3.1.15)
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 25
+63 reg_genmove black
+#? [K4]
+
+#CATEGORY=OWL_TUNING
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 33
+64 reg_genmove black
+#? [L2|M3|L4|M5]
+
+# New failure (comparing 3.0.0 and 3.1.15)
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 35
+65 reg_genmove black
+#? [H4]
+
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 47
+66 reg_genmove black
+#? [G8|G7|H9|J9]*
+
+#CATEGORY=ATARI_ATARI + ENDGAME_TUNING
+# New failure (comparing 3.0.0 and 3.1.15)
+# EB1404b produces nonsense here. 
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 77
+67 reg_genmove black
+#? [B9]
+
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 79
+68 reg_genmove black
+#? [A8]
+
+#CATEGORY=TERRITORIAL_EVALUATION
+# There is s.th. odd in the influence function in comparison between
+# D4 and D5.
+loadsgf games/mertin13x13/gnugo-katsunari2.B+66.sgf 89
+69 restricted_genmove black D4 D5
+#? [D5]
+
+#CATEGORY=FUSEKI_STRATEGY
+# I think that securing the corner is larger.
+loadsgf games/mertin13x13/gnugo-gointellect1.W+28.sgf 11
+70 reg_genmove black
+#? [L10|L9|L11]
+
+loadsgf games/mertin13x13/gnugo-gointellect1.W+28.sgf 19
+71 reg_genmove black
+#? [J11]
+
+loadsgf games/mertin13x13/gnugo-gointellect1.W+28.sgf 29
+72 reg_genmove black
+#? [J10]
+
+# New failure (comparing 3.1.15 with 3.0.0)
+# The "attack last move played, although it seems bad" heuristic sometimes
+# produces very bad choices.
+loadsgf games/mertin13x13/gnugo-gointellect1.W+28.sgf 31
+73 reg_genmove black
+#? [J8]*
+
+#CATEGORY=OWL_TUNING, SEMEAI
+# The "attack last move played, although it seems bad" heuristic sometimes
+# produces very bad choices. Also, owl is wrong here.
+loadsgf games/mertin13x13/gnugo-gointellect1.W+28.sgf 33
+74 reg_genmove black
+#? [G10]
+
+# D11 is a no-no. /ab
+#CATEGORY=TERRITORIAL_EVALUATION
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 13
+75 restricted_genmove black D11 E12
+#? [E12]
+
+#CATEGORY=TERRITORIAL_EVALUATION
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 17
+76 reg_genmove black
+#? [K6|L6|J3]
+
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 19
+77 reg_genmove black
+#? [L6|K5]*
+
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 21
+78 reg_genmove black
+#? [L5]*
+
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 23
+79 reg_genmove black
+#? [M5]
+
+# M2 is better for eye shape here.
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 41
+80 reg_genmove black
+#? [M2]
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/gnugo-gointellect2.W+2.sgf 55
+81 reg_genmove black
+#? [M8]
+
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 11
+82 reg_genmove black
+#? [K4]
+
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 23
+83 reg_genmove black
+#? [L9]*
+
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 25
+84 reg_genmove black
+#? [L9]*
+
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 29
+85 reg_genmove black
+#? [D2]
+
+#CATEGORY=OWL_TUNING
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 45
+86 owl_attack L5
+#? [1 (H5|J4)]
+
+#CATEGORY=TACTICAL_READING
+# GNU Go claims that D6 defends the worms D9 and F9
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 65
+87 reg_genmove black
+#? [E6]
+
+#CATEGORY=BLUNDER
+# New failure (comparing 3.1.15 with 3.0.0)
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 69
+88 restricted_genmove black A9 D6
+#? [D6]
+
+#CATEGORY=OWL_TUNING
+# New failure (comparing 3.1.15 with 3.0.0)
+# (I hope I read this out correctly. See variations in sgf-file.)
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 83
+89 owl_attack K2
+#? [0]
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 99
+90 reg_genmove black
+#? [A5]
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/mertin13x13/gnugo-gointellect3.W+37.sgf 109
+91 reg_genmove black
+#? [K6]*
diff --git a/regression/13x13b.tst b/regression/13x13b.tst
new file mode 100644 (file)
index 0000000..fa46e8d
--- /dev/null
@@ -0,0 +1,286 @@
+# This is a collection of mistakes by GNU Go in Stefan Mertin's private
+# 13x13 - Computer Go tournament in 2001-2002 (see
+# http://www.geocities.com/comp_go/13x13.html).
+# 
+# While the games used in 13x13.tst were played by GNU Go 3.0, this test
+# suite covers games played at the end of the tournament by GNU Go 3.2
+# at level 15.
+# 
+# The opponents and results in these games are:
+# 
+# Game       GNU Go  Result  Opponent
+# name       color
+# DAGN1.sgf  white   +40.5   Dariush
+# DAGN2.sgf  white   +52.5   Dariush
+# DAGN3.sgf  white   + 2.5   Dariush
+# GNDA1.sgf  black   +39.5   Dariush
+# GNDA2.sgf  black   +34.5   Dariush
+# GNDA3.sgf  black   +32.5   Dariush
+# GAGN1.sgf  white   -29.5   GoAhead
+# GAGN2.sgf  white   + 0.5   GoAhead
+# GAGN3.sgf  white   +16.5   GoAhead
+# GNGA1.sgf  black   + 2.5   GoAhead
+# GNGA2.sgf  black   +67.5   GoAhead
+# GNGA3.sgf  black   - 5.5   GoAhead
+# GHGN1.sgf  white   +33.5   Goliath
+# GHGN2.sgf  white   + 6.5   Goliath
+# GHGN3.sgf  white   -48.5   Goliath
+# GNGH1.sgf  black   + 5.5   Goliath
+# GNGH2.sgf  black   +13.5   Goliath
+# GNGH3.sgf  black   -59.5   Goliath
+# GIGN1.sgf  white   +12.5   Go Intellect
+# GIGN2.sgf  white   - 0.5   Go Intellect
+# GIGN3.sgf  white   +21.5   Go Intellect
+# GNGI1.sgf  black   +31.5   Go Intellect
+# GNGI2.sgf  black   +18.5   Go Intellect
+# GNGI3.sgf  black   + 2.5   Go Intellect
+# GMGN1.sgf  white   + 3.5   GoeMate
+# GMGN2.sgf  white   -10.5   GoeMate
+# GMGN3.sgf  white   - 6.5   GoeMate
+# GNGM1.sgf  black   + 9.5   GoeMate
+# GNGM2.sgf  black   -12.5   GoeMate
+# GNGM3.sgf  black   - 6.5   GoeMate
+# GPGN1.sgf  white   - 6.5   Go Professional
+# GPGN3.sgf  white   -15.5   Go Professional
+# GPGN5.sgf  white   -16.5   Go Professional
+# GNGP1.sgf  black   +27.5   Go Professional
+# GNGP3.sgf  black   - 0.5   Go Professional
+# GNGP5.sgf  black   - 1.5   Go Professional
+# GXGN1.sgf  white   +25.5   Go4++
+# GXGN2.sgf  white   -20.5   Go4++
+# GXGN3.sgf  white   -14.5   Go4++
+# GNGX1.sgf  black   -10.5   Go4++
+# GNGX2.sgf  black   +11.5   Go4++
+# GNGX3.sgf  black   - 4.5   Go4++
+# HTGN1.sgf  white   +10.5   HandTalk
+# HTGN2.sgf  white   +23.5   HandTalk
+# HTGN3.sgf  white   + 6.5   HandTalk
+# GNHT1.sgf  black   + 5.5   HandTalk
+# GNHT2.sgf  black   -13.5   HandTalk
+# GNHT3.sgf  black   +16.5   HandTalk
+# MFGN1.sgf  white   +43.5   Many Faces of Go
+# MFGN2.sgf  white   +35.5   Many Faces of Go
+# MFGN3.sgf  white   -42.5   Many Faces of Go
+# GNMF1.sgf  black   +17.5   Many Faces of Go
+# GNMF2.sgf  black   +44.5   Many Faces of Go
+# GNMF3.sgf  black   -18.5   Many Faces of Go
+# WLGN1.sgf  white   - 1.5   Wulu
+# WLGN2.sgf  white   -41.5   Wulu
+# WLGN3.sgf  white   + 5.5   Wulu
+# GNWL1.sgf  black   +52.5   Wulu
+# GNWL2.sgf  black   +20.5   Wulu
+# GNWL3.sgf  black   -13.5   Wulu
+# 
+# The variations in the sgf-files are due to Stefan Mertin.
+
+loadsgf games/mertin13x13/GNDA3.sgf 61
+1 reg_genmove black
+#? [M4]
+
+loadsgf games/mertin13x13/GAGN1.sgf 12
+2 reg_genmove white
+#? [C12|G10|G12]
+
+# N5 is locally worse than M5.
+loadsgf games/mertin13x13/GAGN1.sgf 28
+3 restricted_genmove white M5 N5
+#? [M5]
+
+# Hane at K1 is not appropriate.
+loadsgf games/mertin13x13/GAGN1.sgf 42
+4 restricted_genmove white F4 H2 K1
+#? [F4]
+
+# Unreasonable to block at A5.
+loadsgf games/mertin13x13/GAGN1.sgf 66
+5 restricted_genmove white A5 B4 C4 C5
+#? [!A5]
+
+# B4 unreasonable. C4 locally the best move.
+loadsgf games/mertin13x13/GAGN1.sgf 68
+6 restricted_genmove white B4 C4
+#? [C4]*
+
+# H11 allows a combination attack starting with K10.
+loadsgf games/mertin13x13/GNGA3.sgf 67
+7 reg_genmove black
+#? [J11]
+
+# F10 blocks and connects in the best way. F11 is clearly inferior.
+loadsgf games/mertin13x13/GNGA3.sgf 81
+8 reg_genmove black
+#? [F10]
+
+# Most other moves are better than the game move at C6.
+loadsgf games/mertin13x13/GHGN1.sgf 26
+9 owl_attack D7
+#? [0]
+
+# Most other moves are better than the game move at M6.
+loadsgf games/mertin13x13/GHGN2.sgf 48
+10 restricted_genmove white M4 L6 M6
+#? [M4|L6]
+
+# L6 urgent.
+loadsgf games/mertin13x13/GHGN2.sgf 52
+11 reg_genmove white
+#? [L6]
+
+# J5 not joseki.
+loadsgf games/mertin13x13/GHGN3.sgf 8
+12 restricted_genmove white J5 J6
+#? [J6]*
+
+# M13 is a very odd move.
+loadsgf games/mertin13x13/GHGN3.sgf 38
+13 restricted_genmove white M11 M12 M13 K12
+#? [K12]*
+
+# J9 is huge.
+loadsgf games/mertin13x13/GNGH2.sgf 23
+14 reg_genmove black
+#? [J9]
+
+# N11 is meaningless.
+loadsgf games/mertin13x13/GNGH2.sgf 71
+15 reg_genmove black
+#? [B5]
+
+# H2 completely misses the point. Necessary to block at G4.
+loadsgf games/mertin13x13/GNGH3.sgf 57
+16 reg_genmove black
+#? [G4]
+
+# F1 gives seki.
+loadsgf games/mertin13x13/GNGH3.sgf 111
+17 reg_genmove black
+#? [F1]*
+
+# Necessary to defend the bottom.
+loadsgf games/mertin13x13/GIGN2.sgf 18
+18 reg_genmove white
+#? [F3]
+
+# One critical point left at B5. K10 is dame.
+loadsgf games/mertin13x13/GIGN2.sgf 60
+19 reg_genmove white
+#? [B5]
+
+# K10 is unreasonable.
+loadsgf games/mertin13x13/GIGN3.sgf 92
+20 reg_genmove white
+#? [J10]
+
+# J13 fails right out.
+loadsgf games/mertin13x13/GIGN3.sgf 94
+21 restricted_genmove white K11 J13
+#? [K11]
+
+# A6 bad shape.
+loadsgf games/mertin13x13/GIGN3.sgf 100
+22 reg_genmove white
+#? [B6|B7]
+
+# J1 gives ko. K1 kills unconditionally.
+loadsgf games/mertin13x13/GNGI1.sgf 95
+23 reg_genmove black
+#? [K1]
+
+# N11 is clearly the worst way to end the ko. M13 and M9 are both better.
+loadsgf games/mertin13x13/GNGI3.sgf 63
+24 reg_genmove black
+#? [M9|M13]
+
+# M13 lives independently. K13 gives a semeai.
+loadsgf games/mertin13x13/GNGI3.sgf 65
+25 reg_genmove black
+#? [M13]*
+
+# Must connect at D3.
+loadsgf games/mertin13x13/GMGN2.sgf 30
+26 reg_genmove white
+#? [D3]
+
+# B2 inefficient way to live.
+loadsgf games/mertin13x13/GMGN2.sgf 92
+27 reg_genmove white
+#? [C4]
+
+# Taken out -- H9 seems reasonable nevertheless. /ab
+## H9 can be cut off.
+#loadsgf games/mertin13x13/GMGN3.sgf 30
+#28 reg_genmove white
+##? [!H9]
+
+# Must connect at F3.
+loadsgf games/mertin13x13/GNGM3.sgf 11
+29 reg_genmove black
+#? [F3]*
+
+loadsgf games/mertin13x13/GPGN1.sgf 62
+30 reg_genmove white
+#? [N8]*
+
+loadsgf games/mertin13x13/GPGN1.sgf 64
+31 reg_genmove white
+#? [M7]*
+
+# G5 is dame. H4 is the point needed to win the game.
+loadsgf games/mertin13x13/GNGP3.sgf 55
+32 reg_genmove black
+#? [H4]
+
+# F6 clearly better than E6.
+loadsgf games/mertin13x13/GNGP5.sgf 73
+33 restricted_genmove black E6 F6
+#? [F6]
+
+# E5 is just cut off and captured.
+loadsgf games/mertin13x13/GXGN2.sgf 48
+34 reg_genmove white
+#? [E8|F9|F8|D7]
+
+# Breakin problem.
+# D10 captures on too small scale.
+loadsgf games/mertin13x13/GXGN2.sgf 52
+35 reg_genmove white
+#? [D7|E8|F9]*
+
+# Low enclosure better.
+loadsgf games/mertin13x13/GXGN3.sgf 12
+36 restricted_genmove white J3 J4 H3 H4
+#? [J3|H3]*
+
+# Must follow up A6 with A4, which in any case is sente.
+loadsgf games/mertin13x13/GNGX1.sgf 51
+37 reg_genmove black
+#? [A4]
+
+# E8 clearly bigger than E7.
+loadsgf games/mertin13x13/HTGN3.sgf 102
+38 restricted_genmove white E7 E8
+#? [E8]*
+
+# F10 needed for seki.
+loadsgf games/mertin13x13/MFGN3.sgf 58
+39 reg_genmove white
+#? [F10]*
+
+# Must connect at F8.
+loadsgf games/mertin13x13/WLGN2.sgf 74
+40 reg_genmove white
+#? [F8]
+
+loadsgf games/mertin13x13/GNWL1.sgf 61
+41 reg_genmove black
+#? [J6]
+
+# L7 way overconcentrated.
+loadsgf games/mertin13x13/GNWL2.sgf 35
+42 restricted_genmove black L7 L13
+#? [L13]
+
+# J3 is of course bigger than J1.
+loadsgf games/mertin13x13/GNWL3.sgf 109
+43 restricted_genmove black J1 J2 J3
+#? [J3]*
diff --git a/regression/13x13c.tst b/regression/13x13c.tst
new file mode 100644 (file)
index 0000000..e8290d1
--- /dev/null
@@ -0,0 +1,70 @@
+# GNU Go 3.7.8 plays A1 on levels 11 and up.
+loadsgf games/kgs/tournament11/GNU-firstgo.sgf 58
+1 reg_genmove white
+#? [E12|K4]
+
+# G4 meaningless compared to K3.
+loadsgf games/kgs/tournament11/GNU-firstgo.sgf 62
+2 restricted_genmove white G4 K3
+#? [K3]*
+
+# J13 locally better than L12.
+loadsgf games/kgs/tournament11/GNU-firstgo.sgf 104
+3 restricted_genmove white J13 L12
+#? [J13]*
+
+# G13 accomplishes nothing. Better play the last point at N7.
+loadsgf games/kgs/tournament11/GNU-firstgo.sgf 142
+4 reg_genmove white
+#? [N7]*
+
+# Urgent to defend on the left. D6 looks simplest. Does any other move work?
+loadsgf games/kgs/tournament11/GNU-viking5-1.sgf 48
+11 reg_genmove white
+#? [D6]*
+
+# H11 locally better than K10.
+loadsgf games/kgs/tournament11/GNU-viking5-1.sgf 88
+12 restricted_genmove white H11 K10
+#? [H11]*
+
+# Better to invade a corner straight away. L11 best?
+loadsgf games/kgs/tournament11/GNU-CrazyStone.sgf 12
+21 restricted_genmove white H2 L11
+#? [L11]*
+
+# L7 looks strange. J2 or L11 make more sense.
+loadsgf games/kgs/tournament11/GNU-CrazyStone.sgf 18
+22 restricted_genmove white J2 L7 L11
+#? [J2|L11]*
+
+# Best to fix up the connection along the upper edge with E12. B11 overplay.
+loadsgf games/kgs/tournament11/GNU-CrazyStone.sgf 100
+23 reg_genmove white
+#? [E12]*
+
+# Urgent to live in the upper left corner.
+loadsgf games/kgs/tournament11/GNU-CrazyStone.sgf 108
+24 reg_genmove white
+#? [B12|B13|A11]*
+
+# C1 kills cleanly. C2 doesn't even make ko.
+loadsgf games/kgs/tournament11/GNU-viking5-2.sgf 82
+31 reg_genmove white
+#? [C1]*
+
+# M9 gives a clean tactical capture which looks superior to the game move J12.
+loadsgf games/kgs/tournament11/CrazyStone-GNU.sgf 45
+41 reg_genmove black
+#? [M9]*
+
+# G13 secures two eyes for the top black stones and a trivial
+# win of the semeai.
+loadsgf games/kgs/tournament11/CrazyStone-GNU.sgf 77
+42 reg_genmove black
+#? [G13]*
+
+# G13 is still sufficient to get a seki.
+loadsgf games/kgs/tournament11/CrazyStone-GNU.sgf 87
+43 reg_genmove black
+#? [G13]
diff --git a/regression/9x9.tst b/regression/9x9.tst
new file mode 100644 (file)
index 0000000..5d956a8
--- /dev/null
@@ -0,0 +1,353 @@
+# Added E3. /ab
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf 4
+10 reg_genmove black
+#? [E5|E6|E3]
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf 6
+20 reg_genmove black
+#? [!D5]
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf 10
+30 reg_genmove black
+#? [D7]*
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf 26
+40 reg_genmove black
+#? [D4]*
+
+# H3 might also be acceptable. /ab
+loadsgf games/nngs/evand-gnugo-3.5.2-200312060932.sgf 4
+50 reg_genmove black
+#? [F4]*
+
+loadsgf games/nngs/evand-gnugo-3.5.2-200312060932.sgf 8
+60 reg_genmove black
+#? [D4|G5]*
+
+#C7 is bigger than D8
+loadsgf games/nngs/evand-gnugo-3.5.2-200312060932.sgf 22
+70 reg_genmove black
+#? [C7]
+
+loadsgf games/nngs/evand-gnugo-3.5.2-200312060932.sgf 32
+80 reg_genmove black
+#? [F8]*
+
+#something better than H6
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf 6
+90 reg_genmove black
+#? [E4|F5|E3]
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf 10
+100 reg_genmove black
+#? [F5]*
+
+#much, much safer than J2
+# yes, safe way to win the game with 77 points. :) /ab
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf 40
+110 reg_genmove black
+#? [G2]
+
+#make the ko threat
+#game move is B1, maybe a caching issue?
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf 58
+120 reg_genmove black
+#? [F1]
+
+#large endgame, white will have to pick up.
+loadsgf games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf 64
+130 reg_genmove black
+#? [B9]*
+
+loadsgf games/nngs/speciman-gnugo-3.5.2-200312091734.sgf 7
+140 reg_genmove black
+#? [D7|C7|E4]*
+
+# Removed E7. Would be huge ko that black loses. /ab
+loadsgf games/nngs/speciman-gnugo-3.5.2-200312091734.sgf 9
+150 reg_genmove black
+#? [E6]*
+
+# Only move. /ab
+loadsgf games/nngs/speciman-gnugo-3.5.2-200312091734.sgf 13
+160 reg_genmove black
+#? [E7]*
+
+#something better than C3
+loadsgf games/nngs/speciman-gnugo-3.5.2-200312091734.sgf 15
+170 reg_genmove black
+#? [D3|G7]*
+
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf 8
+180 reg_genmove black
+#? [E5]*
+
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf 10
+190 reg_genmove black
+#? [F5]*
+
+# Connect under. /ab
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf 14
+193 reg_genmove black
+#? [E8]*
+
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf 16
+197 reg_genmove black
+#? [E8|H5]
+
+#D4 only move to connect all black stones. /ab
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312130817.sgf 14
+200 reg_genmove black
+#? [D4]*
+
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312130817.sgf 26
+210 reg_genmove black
+#? [F8|E9]*
+
+#G6 is very hard for gnugo, even if playable
+loadsgf games/nngs/gnugo-3.5.2gf1-kisome-200312131322.sgf 4
+220 reg_genmove white
+#? [C7|C6|D7|D6|G7|F7]
+
+#I think D2 lives because of a threat to connect under
+#the important thing is to find a way to live, either
+#here or earlier in the game.
+loadsgf games/nngs/gnugo-3.5.2gf1-kisome-200312131322.sgf 22
+230 reg_genmove white
+#? [D2]*
+
+# Moved to filllib:45 /ab.
+##passing gets the wrong score on go servers, etc.
+##F9 and G9 are dame that need to be filled.
+#loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312150903.sgf
+##240 reg_genmove black
+##? [G9]*
+
+# See also reading:207-216.
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312161910.sgf 52
+250 reg_genmove black
+#? [A2|C1|C2]*
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf 10
+260 reg_genmove black
+#? [E6]
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf 14
+265 reg_genmove black
+#? [G6]*
+
+loadsgf games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf 24
+270 reg_genmove black
+#? [B5|F7|F8|F3]*
+
+#playing B5 now lets white connect at C6, causing problems for the top.
+loadsgf games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf 26
+280 reg_genmove black
+#? [E4]*
+
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312210441.sgf 22
+290 reg_genmove black
+#? [F5]*
+
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312210441.sgf 24
+300 reg_genmove black
+#? [D2]*
+
+loadsgf games/nngs/sjfried-gnugo-3.5.2gf1-200312210441.sgf 32
+310 reg_genmove black
+#? [H7|H8]
+
+# E5 is best, all other acceptable. /ab
+loadsgf games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf 8
+320 reg_genmove black
+#? [E5|F4|D4|E4]*
+
+# D3 is objectively best but dangerous. /ab
+loadsgf games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf 20
+330 reg_genmove black
+#? [D3|F3]*
+
+loadsgf games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf 28
+340 reg_genmove black
+#? [H8]*
+
+# Maybe C2 works, too, I am not sure. /ab
+loadsgf games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf 30
+350 owl_defend C3
+#? [1 (B4|D2)]
+
+loadsgf games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf 32
+355 owl_defend C3
+#? [1 (A5|D2)]*
+
+loadsgf games/nngs/ruud2d-gnugo-3.5.2gf1-200312292348.sgf 8
+360 reg_genmove black
+#? [F4|E6|D5]*
+
+#E7 appears to be a losing move
+loadsgf games/nngs/gnugo-3.5.2gf1-Kiskol-200401021557.sgf 10
+370 reg_genmove white
+#? [G7|F7]*
+
+loadsgf games/boardspace/GNUGo-GoFigure0.1-200503171816.sgf 9
+380 reg_genmove black
+#? [C3|D3]*
+
+loadsgf games/boardspace/GNUGo-GoFigure0.1-200503171816.sgf 17
+390 reg_genmove black
+#? [D7]*
+
+loadsgf games/boardspace/GNUGo-GoFigure0.1-200503171816.sgf 35
+400 reg_genmove black
+#? [A5|B3]
+
+loadsgf games/boardspace/GNUGo-GoFigure0.1-200503181316.sgf 11
+410 reg_genmove black
+#? [B5]*
+
+loadsgf games/boardspace/GNUGo-GoFigure0.1-200503181614.sgf 41
+420 reg_genmove black
+#? [D5]*
+
+#solve the endgame problem with one move, not 3 like in the game
+loadsgf games/boardspace/GNUGo-GoFigure0.1-200503302359.sgf 41
+430 reg_genmove black
+#? [G7|H7]*
+
+loadsgf games/bitti-gnug36.sgf 24
+440 restricted_genmove black D6 C6 B7
+#? [C6|B7]*
+
+# Not A8 as in the game
+loadsgf games/bitti-gnug36.sgf 30
+450 reg_genmove black
+#? [B5|B4]*
+
+# This is not very obvious, but B9 still wins the whole board.
+loadsgf games/bitti-gnug36.sgf 44
+460 reg_genmove black
+#? [B9]*
+
+# Need to protect lower right corner
+loadsgf games/nodan-guno.sgf 8
+470 reg_genmove black
+#? [H3|H4|G4|D3]
+
+loadsgf games/nodan-guno.sgf 24
+480 restricted_genmove black E2 F2
+#? [E2]*
+
+# E1 is non-sense.
+loadsgf games/nodan-guno.sgf 38
+490 reg_genmove black
+#? [D1|A6|H1]*
+
+loadsgf games/nodan-guno.sgf 54
+500 reg_genmove black
+#? [H6]
+
+# Mandatory to stay connected.
+loadsgf games/kgs/tournament8/GNU-AyaBot.sgf 6
+510 reg_genmove white
+#? [C4]*
+
+# Tenuki from the lower left stones is out of the question. E5 may be
+# best but is complicated. For now we accept any reasonable move that
+# stays on focus. In particular the game move at E7 is not acceptable.
+loadsgf games/kgs/tournament8/GNU-AyaBot.sgf 10
+520 reg_genmove white
+#? [E5|D5|B2|E3|F3|F4]
+
+# F2 needlessly complicated and/or backfires. F3 solid and effective.
+loadsgf games/kgs/tournament8/indigoBot-GNU.sgf 13
+530 restricted_genmove black F2 F3
+#? [F3]*
+
+# D8 is too low.
+loadsgf games/kgs/tournament8/CrazyStone-GNU.sgf 5
+540 restricted_genmove black D8 D7
+#? [D7]
+
+# B8 is nonsensical. There might be better moves but C6 is easy to see
+# that it's effective.
+loadsgf games/kgs/tournament8/CrazyStone-GNU.sgf 9
+550 restricted_genmove black B8 C6
+#? [C6]
+
+# C5 leaves too much aji for white to work with in the corner.
+loadsgf games/kgs/tournament8/CrazyStone-GNU.sgf 33
+560 reg_genmove black
+#? [B4]*
+
+# E4 is better than E7 since it splits the opponent while saving the
+# cutting stones.
+loadsgf games/kgs/tournament8/tlsBot-GNU.sgf 13
+570 reg_genmove black
+#? [E4]*
+
+# More important to close off the center than the edge.
+loadsgf games/kgs/tournament8/firstgo-GNU.sgf 7
+580 restricted_genmove black E2 E6
+#? [E6]*
+
+# Important to keep white separated in the center.
+loadsgf games/kgs/tournament8/firstgo-GNU.sgf 19
+590 reg_genmove black
+#? [E5]*
+
+# B7 is too low and in the wrong direction. Many moves are better.
+loadsgf games/kgs/tournament10/GNU-AyaBot.sgf 4
+600 restricted_genmove white B7 F4 F3 G3
+#? [F4|F3|G3]*
+
+# H9 just doesn't work. The only useful ko threat is E4.
+loadsgf games/kgs/tournament10/GNU-AyaBot.sgf 30
+610 reg_genmove white
+#? [E4]*
+
+# A7 is a wonderful move, setting up an under the stones tesuji to
+# capture three stones. The move *was* played in the game and this
+# test case is here to make sure that it won't be forgotten.
+loadsgf games/kgs/tournament10/GNU-NeuroGo.sgf 68
+620 reg_genmove white
+#? [A7]
+
+loadsgf games/9x9-4.sgf 13
+630 reg_genmove black
+#? [J5]*
+
+# A8 secures seki, winning the game. On the other hand black can't
+# start the ko anyway, so the ordinary endgame moves are also good.
+# The game move at D9 is not good at all, however.
+# See also reading:229,230, owl1:395,396, and semeai:145,146.
+loadsgf games/cgos/25811.sgf 52
+640 reg_genmove white
+#? [A8|G6|J6]*
+
+# Necessary to start capturing from the left. The game move at J1 is
+# of course futile.
+# See also reading:231.
+loadsgf games/cgos/14198.sgf 53
+650 reg_genmove black
+#? [E1]
+
+# D3 is the only possible move. Trying to kill all white stones with
+# F2 is an unreasonable overplay.
+loadsgf games/cgos/42896.sgf 33
+660 reg_genmove black
+#? [D3]*
+
+# E7 is the only way to live on the upper side.
+loadsgf games/cgos/390115.sgf 28
+670 reg_genmove white
+#? [E7]*
+
+# There's actually nothing difficult with this position, it's only
+# necessary to avoid a few obvious blunders. The real reason for this
+# test is that a fix for an atari-atari problem introduced a crash in
+# this position. Fixing the crash instead reintroduced an atari-atari
+# mistake in ninestones:220. Let's make sure we won't get a crash here
+# once more. See also tickets #77 and #161.
+loadsgf games/atari-crash.sgf
+680 reg_genmove white
+#? [H7]
diff --git a/regression/BREAKAGE b/regression/BREAKAGE
new file mode 100644 (file)
index 0000000..895ddb4
--- /dev/null
@@ -0,0 +1,7887 @@
+======================= 3.8 ============================
+
+======================= 3.7.12 =========================
+
+./regress.sh . endgame.tst 
+931 unexpected PASS!
+960 unexpected PASS!
+./regress.sh . semeai.tst 
+48 unexpected PASS!
+147 unexpected PASS!
+./regress.sh . STS-RV_1.tst 
+3 unexpected FAIL: Correct '1 1 (D8|C3|B3|A3)', got '0 0 PASS'
+5 unexpected FAIL: Correct '1 1 (M4|N4|R3|R2|R1)', got '0 0 PASS'
+20 unexpected FAIL: Correct '1 1 (R3|S4|S2|T3)', got '0 0 PASS'
+31 unexpected FAIL: Correct '1 0 PASS', got '1 0 C2'
+54 unexpected FAIL: Correct '1 0 (O2|O1|R2|Q1|S1)', got '0 0 PASS'
+56 unexpected FAIL: Correct '1 0 (J15|H15|F14|E13|E12|F10)', got '0 0 PASS'
+59 unexpected FAIL: Correct '0 0 PASS', got '1 1 C1'
+63 unexpected FAIL: Correct '1 0 PASS', got '1 1 Q16'
+64 unexpected FAIL: Correct '1 0 PASS', got '1 1 M15'
+65 unexpected FAIL: Correct '1 0 PASS', got '1 1 G7'
+68 unexpected FAIL: Correct '1 0 (G15|H15|K19|K18|G17|G19|F18|H18)', got '1 1 K19'
+70 unexpected FAIL: Correct '1 0 (C3|B4)', got '0 0 PASS'
+73 unexpected FAIL: Correct '1 0 PASS', got '1 1 T15'
+74 unexpected FAIL: Correct '1 0 PASS', got '1 1 M19'
+75 unexpected FAIL: Correct '1 1 (C18|B17|D17)', got '1 0 C18'
+79 unexpected FAIL: Correct '1 1 (E19|F18|F17)', got '0 0 PASS'
+80 unexpected FAIL: Correct '1 0 (F12|F11|F10|F9|E8|D8)', got '1 1 F12'
+81 unexpected FAIL: Correct '1 1 E1', got '1 0 E1'
+82 unexpected FAIL: Correct '1 0 B2', got '1 1 J1'
+83 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+84 unexpected FAIL: Correct '1 0 PASS', got '1 1 R8'
+85 unexpected FAIL: Correct '1 1 (N17|L16)', got '1 0 N18'
+86 unexpected FAIL: Correct '1 1 (Q17|R16)', got '1 0 T18'
+87 unexpected FAIL: Correct '1 1 (B17|D17)', got '0 0 PASS'
+89 unexpected FAIL: Correct '1 1 (T5|S6)', got '0 0 PASS'
+95 unexpected FAIL: Correct '1 1 PASS', got '0 0 PASS'
+96 unexpected FAIL: Correct '0 0 PASS', got '1 1 G19'
+97 unexpected FAIL: Correct '1 1 PASS', got '0 0 PASS'
+98 unexpected FAIL: Correct '0 0 PASS', got '1 1 D5'
+119 unexpected FAIL: Correct '1 1 C2', got '0 0 PASS'
+139 unexpected FAIL: Correct '1 1 PASS', got '1 0 R18'
+140 unexpected FAIL: Correct '0 0 PASS', got '1 0 L19'
+158 unexpected FAIL: Correct '1 1 (N3|O5|P6|Q6|R6|S6|T6)', got '0 0 PASS'
+163 unexpected FAIL: Correct '1 1 (C18|D17)', got '1 1 C12'
+164 unexpected FAIL: Correct '1 0 C18', got '1 1 C12'
+166 unexpected FAIL: Correct '1 1 D2', got '1 0 D2'
+168 unexpected FAIL: Correct '1 1 (T10|R10|S11)', got '1 0 T6'
+169 unexpected FAIL: Correct '1 1 K18', got '1 1 L17'
+173 unexpected FAIL: Correct '1 1 D17', got '1 1 B12'
+175 unexpected FAIL: Correct '1 1 H2', got '1 0 H2'
+179 unexpected FAIL: Correct '1 0 Q17', got '1 1 Q17'
+184 unexpected FAIL: Correct '1 1 C11', got '0 0 PASS'
+186 unexpected FAIL: Correct '1 1 (J2|B2|B3|D3)', got '1 1 C4'
+187 unexpected FAIL: Correct '1 1 R4', got '1 0 R4'
+188 unexpected FAIL: Correct '1 0 R4', got '1 1 R4'
+189 unexpected FAIL: Correct '1 1 L18', got '1 0 Q18'
+190 unexpected FAIL: Correct '1 0 L18', got '1 1 Q18'
+194 unexpected FAIL: Correct '1 0 PASS', got '1 1 B17'
+195 unexpected FAIL: Correct '1 1 K2', got '1 1 D3'
+196 unexpected FAIL: Correct '1 1 D3', got '1 0 K2'
+197 unexpected FAIL: Correct '1 1 (T4|S3|T1)', got '0 0 PASS'
+205 unexpected FAIL: Correct '1 1 C2', got '1 0 C2'
+./regress.sh . STS-RV_e.tst 
+2 unexpected FAIL: Correct '1 1 B17', got '1 0 B17'
+13 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+14 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+25 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+26 unexpected FAIL: Correct '1 0 PASS', got '1 1 J1'
+52 unexpected FAIL: Correct '1 0 PASS', got '1 1 A15'
+55 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+56 unexpected FAIL: Correct '1 0 PASS', got '1 1 S8'
+61 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+62 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+76 unexpected FAIL: Correct '1 0 PASS', got '1 1 B18'
+83 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+84 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+87 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+88 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+91 unexpected FAIL: Correct '1 0 C5', got '1 0 PASS'
+92 unexpected FAIL: Correct '1 1 C5', got '1 0 PASS'
+93 unexpected FAIL: Correct '1 0 B16', got '1 0 PASS'
+94 unexpected FAIL: Correct '2 2 B16', got '1 0 PASS'
+96 unexpected FAIL: Correct '2 2 Q12', got '1 1 Q11'
+98 unexpected FAIL: Correct '2 2 H5', got '1 1 J5'
+99 unexpected FAIL: Correct '3 0 J17', got '1 0 J17'
+102 unexpected FAIL: Correct '1 0 PASS', got '1 1 B11'
+106 unexpected FAIL: Correct '3 3 P18', got '1 1 Q18'
+110 unexpected FAIL: Correct '2 2 C5', got '1 0 B5'
+157 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+158 unexpected FAIL: Correct '1 0 PASS', got '1 1 S3'
+173 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+174 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+176 unexpected FAIL: Correct '1 1 S2', got '0 0 PASS'
+183 unexpected FAIL: Correct '3 3 T1', got '2 2 T1'
+188 unexpected FAIL: Correct '1 0 T19', got '1 0 R17'
+201 unexpected FAIL: Correct '1 0 L2', got '1 0 M1'
+202 unexpected FAIL: Correct '1 1 (M1|L2)', got '3 3 J2'
+225 unexpected FAIL: Correct '1 0 B9', got '0 0 PASS'
+226 unexpected FAIL: Correct '1 1 (C12|C13)', got '1 1 PASS'
+227 unexpected FAIL: Correct '1 0 (P1|N2)', got '1 0 PASS'
+228 unexpected FAIL: Correct '1 1 P1', got '1 0 PASS'
+229 unexpected FAIL: Correct '1 0 T14', got '0 0 PASS'
+230 unexpected FAIL: Correct '1 1 T14', got '1 1 Q13'
+231 unexpected FAIL: Correct '1 0 H18', got '0 0 PASS'
+232 unexpected FAIL: Correct '1 1 H18', got '1 1 J16'
+250 unexpected FAIL: Correct '1 1 T14', got '1 0 S16'
+./regress.sh . STS-RV_Misc.tst 
+1 unexpected FAIL: Correct '3 3 G2', got '1 0 G2'
+4 unexpected FAIL: Correct '1 1 A10', got '0 0 PASS'
+6 unexpected FAIL: Correct '2 2 (S11|S13)', got '0 0 PASS'
+8 unexpected FAIL: Correct '1 1 T7', got '1 1 N7'
+9 unexpected FAIL: Correct '1 1 J1', got '1 0 D4'
+12 unexpected FAIL: Correct '1 0 L11', got '0 0 PASS'
+14 unexpected FAIL: Correct '1 0 B9', got '0 0 PASS'
+33 unexpected FAIL: Correct '3 3 G1', got '1 1 D1'
+35 unexpected FAIL: Correct '1 1 J1', got '1 0 E4'
+36 unexpected FAIL: Correct '1 1 D4', got '1 0 J1'
+37 unexpected FAIL: Correct '1 1 J1', got '1 0 E4'
+42 unexpected FAIL: Correct '1 0 A9', got '0 0 PASS'
+44 unexpected FAIL: Correct '1 0 B9', got '0 0 PASS'
+45 unexpected FAIL: Correct '1 1 (D19|F19|H18)', got '0 0 PASS'
+52 unexpected FAIL: Correct '1 1 H12', got '0 0 PASS'
+53 unexpected FAIL: Correct '1 1 E18', got '1 1 H19'
+54 unexpected FAIL: Correct '1 1 E18', got '1 1 H19'
+./regress.sh . seki.tst 
+1205 unexpected FAIL: Correct 'A3', got 'B3'
+1209 unexpected FAIL: Correct 'B3', got 'B1'
+1217 unexpected FAIL: Correct 'B3', got 'C9'
+1220 unexpected FAIL: Correct 'A2|A3', got 'C1'
+1222 unexpected FAIL: Correct 'C1', got 'C9'
+1227 unexpected FAIL: Correct 'B3', got 'A2'
+1228 unexpected FAIL: Correct 'C1', got 'C9'
+./regress.sh . gifu05.tst 
+1110 unexpected PASS!
+./regress.sh . 13x13c.tst 
+
+======================= 3.7.11 pre 1 =========================
+
+./regress.sh . reading.tst 
+232 unexpected FAIL: Correct '1 (B15|C15|D15|E15)', got '0'
+233 unexpected FAIL: Correct '0', got '2 B19'
+./regress.sh . ld_owl.tst 
+530 unexpected FAIL: Correct '1 D9', got '0'
+532 unexpected FAIL: Correct '1 J2', got '0'
+533 unexpected FAIL: Correct '1 J2', got '0'
+./regress.sh . endgame.tst 
+980 unexpected PASS!
+992 unexpected FAIL: Correct 'E5', got 'J6'
+./regress.sh . lazarus.tst 
+7 unexpected PASS!
+./regress.sh . trevorb.tst 
+140 unexpected PASS!
+220 unexpected FAIL: Correct 'J3', got 'G1'
+./regress.sh . nicklas1.tst 
+1509 unexpected PASS!
+./regress.sh . trevor.tst 
+220 unexpected PASS!
+1060 unexpected PASS!
+./regress.sh . nngs.tst 
+308 unexpected PASS!
+./regress.sh . global.tst 
+16 unexpected FAIL: Correct 'O10', got 'Q11'
+./regress.sh . arend.tst 
+9 unexpected PASS!
+./regress.sh . 13x13.tst 
+1 unexpected PASS!
+35 unexpected PASS!
+./regress.sh . semeai.tst 
+47 unexpected PASS!
+130 unexpected PASS!
+144 unexpected PASS!
+147 unexpected FAIL: Correct '1 1 (B15|C15|D15|E15)', got '0 0 PASS'
+./regress.sh . trevord.tst 
+680 unexpected FAIL: Correct 'S16', got 'R15'
+./regress.sh . strategy4.tst 
+190 unexpected FAIL: Correct 'D13', got 'E7'
+./regress.sh . owl1.tst 
+372 unexpected PASS!
+./regress.sh . nngs3.tst 
+260 unexpected FAIL: Correct 'G11', got 'G12'
+330 unexpected FAIL: Correct 'P12|Q11', got 'F5'
+490 unexpected PASS!
+./regress.sh . nngs4.tst 
+270 unexpected PASS!
+./regress.sh . ninestones.tst 
+220 unexpected FAIL: Correct 'P9|P8', got 'R9'
+490 unexpected FAIL: Correct 'R10', got 'S10'
+790 unexpected FAIL: Correct 'B1', got 'A3'
+./regress.sh . tactics1.tst 
+108 unexpected FAIL: Correct '1', got '0'
+./regress.sh . gunnar.tst 
+45 unexpected PASS!
+84 unexpected PASS!
+97 unexpected FAIL: Correct 'N16', got 'B8'
+98 unexpected FAIL: Correct 'A6', got 'F7'
+99 unexpected FAIL: Correct 'C11', got 'T2'
+100 unexpected FAIL: Correct 'S6', got 'C11'
+101 unexpected FAIL: Correct 'T8', got 'T7'
+./regress.sh . arend2.tst 
+210 unexpected PASS!
+./regress.sh . nando.tst 
+23 unexpected PASS!
+./regress.sh . thrash.tst 
+23 unexpected PASS!
+27 unexpected FAIL: Correct 'J6', got 'G3'
+28 unexpected FAIL: Correct 'A2', got 'G3'
+29 unexpected FAIL: Correct 'D3', got 'G3'
+./regress.sh . gifu03.tst 
+507 unexpected FAIL: Correct 'G13', got 'G16'
+./regress.sh . seki.tst 
+1002 unexpected PASS!
+./regress.sh . 9x9.tst 
+120 unexpected PASS!
+650 unexpected PASS!
+660 unexpected FAIL: Correct 'D3', got 'F2'
+670 unexpected FAIL: Correct 'E7', got 'D7'
+./regress.sh . kgs.tst 
+220 unexpected FAIL: Correct 'T10', got 'N12'
+340 unexpected PASS!
+720 unexpected PASS!
+./regress.sh . gifu05.tst 
+1200 unexpected FAIL: Correct 'C16', got 'B18'
+1210 unexpected FAIL: Correct 'E17', got 'O6'
+1230 unexpected FAIL: Correct 'M6', got 'M8'
+
+========================== 3.7.10  ==================================
+
+./regress.sh . reading.tst 
+224 unexpected FAIL: Correct '2 PASS', got '3 C1'
+226 unexpected FAIL: Correct '2 PASS', got '3 C1'
+228 unexpected FAIL: Correct '1 (A9|A8|PASS)', got '3 J1'
+229 unexpected FAIL: Correct '3 (A7|B9)', got '2 B9'
+230 unexpected FAIL: Correct '2 PASS', got '3 A8'
+231 unexpected FAIL: Correct '2 E1', got '1 J1'
+./regress.sh . trevora.tst 
+540 unexpected FAIL: Correct 'F2|G2|E3', got 'E2'
+./regress.sh . nicklas1.tst 
+1509 unexpected FAIL: Correct 'T14', got 'H1'
+./regress.sh . semeai.tst 
+132 unexpected PASS!
+142 unexpected FAIL: Correct '2 2 (A1|A3)', got '3 3 C1'
+144 unexpected FAIL: Correct '2 2 PASS', got '3 3 C1'
+145 unexpected FAIL: Correct '2 2 PASS', got '3 3 A8'
+146 unexpected FAIL: Correct '3 3 (A7|B9)', got '2 2 B9'
+./regress.sh . trevord.tst 
+./regress.sh . strategy4.tst 
+167 unexpected PASS!
+172 unexpected FAIL: Correct 'M8', got 'T17'
+205 unexpected FAIL: Correct 'P11', got 'O11'
+207 unexpected FAIL: Correct 'S9', got 'R9'
+218 unexpected FAIL: Correct 'F12', got 'C14'
+./regress.sh . owl1.tst 
+283 unexpected PASS!
+395 unexpected FAIL: Correct '3 (A7|B9)', got '2 B9'
+396 unexpected FAIL: Correct '2 PASS', got '3 A8'
+./regress.sh . nngs4.tst 
+170 unexpected FAIL: Correct 'S6', got 'Q5'
+./regress.sh . manyfaces1.tst 
+30 unexpected PASS!
+./regress.sh . gunnar.tst 
+83 unexpected PASS!
+85 unexpected PASS!
+86 unexpected PASS!
+87 unexpected PASS!
+92 unexpected PASS!
+95 unexpected PASS!
+./regress.sh . thrash.tst 
+23 unexpected FAIL: Correct 'A5|D7', got 'J6'
+24 unexpected FAIL: Correct 'J7', got 'J1'
+26 unexpected FAIL: Correct 'E1|A1', got 'J3'
+./regress.sh . 9x9.tst 
+400 unexpected PASS!
+640 unexpected FAIL: Correct 'A8|G6|J6', got 'B9'
+650 unexpected FAIL: Correct 'E1', got 'J1'
+./regress.sh . kgs.tst 
+220 unexpected PASS!
+320 unexpected FAIL: Correct 'K12', got 'J9'
+360 unexpected PASS!
+./regress.sh . olympiad2004.tst 
+501 unexpected PASS!
+./regress.sh . 13x13c.tst 
+2 unexpected FAIL: Correct 'K3', got 'G4'
+3 unexpected FAIL: Correct 'J13', got 'L12'
+4 unexpected FAIL: Correct 'N7', got 'G13'
+11 unexpected FAIL: Correct 'D6', got 'D7'
+12 unexpected FAIL: Correct 'H11', got 'K10'
+21 unexpected FAIL: Correct 'L11', got 'H2'
+22 unexpected FAIL: Correct 'J2|L11', got 'L7'
+23 unexpected FAIL: Correct 'E12', got 'B11'
+24 unexpected FAIL: Correct 'B12|B13|A11', got 'F13'
+31 unexpected FAIL: Correct 'C1', got 'C2'
+41 unexpected FAIL: Correct 'M9', got 'J12'
+42 unexpected FAIL: Correct 'G13', got 'C4'
+
+========================== 3.7.9  ==================================
+
+./regress.sh . reading.tst 
+221 unexpected FAIL: Correct '1 Q14', got '0'
+./regress.sh . ld_owl.tst 
+70 unexpected FAIL: Correct '2 B2', got '0'
+326 unexpected PASS!
+327 unexpected PASS!
+328 unexpected FAIL: Correct '1 (N5|N3|J2)', got '1 PASS'
+329 unexpected FAIL: Correct '1 N3', got '0'
+./regress.sh . filllib.tst 
+4 unexpected FAIL: Correct 'B19|A17', got 'A19'
+./regress.sh . connection.tst 
+128 unexpected FAIL: Correct '1 B6', got '0'
+./regress.sh . blunder.tst 
+17 unexpected FAIL: Correct 'R7', got 'T7'
+./regress.sh . nngs1.tst 
+18 unexpected FAIL: Correct 'J2', got 'K2'
+21 unexpected FAIL: Correct 'N5', got 'M6'
+./regress.sh . endgame.tst 
+880 unexpected FAIL: Correct 'K5', got 'T4'
+./regress.sh . neurogo.tst 
+28 unexpected FAIL: Correct 'O2', got 'F14'
+./regress.sh . arion.tst 
+1 unexpected PASS!
+3 unexpected PASS!
+./regress.sh . viking.tst 
+3 unexpected PASS!
+./regress.sh . lazarus.tst 
+4 unexpected PASS!
+./regress.sh . trevorb.tst 
+100 unexpected PASS!
+140 unexpected FAIL: Correct 'L2|K2', got 'L1'
+260 unexpected PASS!
+280 unexpected FAIL: Correct 'B4', got 'N3'
+290 unexpected PASS!
+410 unexpected FAIL: Correct 'J12', got 'H12'
+./regress.sh . strategy2.tst 
+53 unexpected FAIL: Correct 'S15', got 'E10'
+79 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1408 unexpected PASS!
+1901 unexpected PASS!
+./regress.sh . nicklas2.tst 
+102 unexpected PASS!
+904 unexpected PASS!
+2102 unexpected PASS!
+2103 unexpected PASS!
+./regress.sh . manyfaces.tst 
+1 unexpected PASS!
+./regress.sh . niki.tst 
+5 unexpected PASS!
+./regress.sh . trevor.tst 
+220 unexpected FAIL: Correct 'E8', got 'A7'
+./regress.sh . buzco.tst 
+4 unexpected FAIL: Correct 'D13', got 'E15'
+./regress.sh . nngs.tst 
+230 unexpected PASS!
+1670 unexpected PASS!
+./regress.sh . trevorc.tst 
+280 unexpected FAIL: Correct 'N10', got 'N13'
+410 unexpected FAIL: Correct 'G12', got 'F12'
+940 unexpected FAIL: Correct 'G1', got 'E3'
+1000 unexpected PASS!
+1050 unexpected FAIL: Correct 'K11|J10', got 'C4'
+1580 unexpected PASS!
+./regress.sh . strategy3.tst 
+111 unexpected PASS!
+119 unexpected PASS!
+./regress.sh . global.tst 
+4 unexpected FAIL: Correct 'Q6', got 'F5'
+5 unexpected FAIL: Correct 'O4', got 'F5'
+./regress.sh . 13x13.tst 
+61 unexpected PASS!
+./regress.sh . semeai.tst 
+136 unexpected FAIL: Correct '0 1 (N16|O13|O12|O11)', got '0 0 PASS'
+137 unexpected FAIL: Correct '1 0 F1', got '0 0 PASS'
+138 unexpected FAIL: Correct '1 1 (D1|F1|H1)', got '1 1 A6'
+./regress.sh . trevord.tst 
+260 unexpected PASS!
+790 unexpected FAIL: Correct 'P14', got 'T13'
+./regress.sh . strategy4.tst 
+153 unexpected FAIL: Correct 'Q9', got 'O11'
+166 unexpected FAIL: Correct 'D11', got 'D8'
+201 unexpected PASS!
+./regress.sh . owl1.tst 
+385 unexpected FAIL: Correct '1 C11', got '0'
+386 unexpected FAIL: Correct '1 P19', got '0'
+387 unexpected FAIL: Correct '1 C3', got '0'
+388 unexpected FAIL: Correct '1 A2', got '0'
+389 unexpected FAIL: Correct '0', got '1 B2'
+390 unexpected FAIL: Correct '3 P14', got '1 P14'
+392 unexpected FAIL: Correct '2', got '1'
+394 unexpected FAIL: Correct '1 G9', got '0'
+./regress.sh . handtalk.tst 
+11 unexpected PASS!
+./regress.sh . nngs2.tst 
+1 unexpected PASS!
+./regress.sh . nngs3.tst 
+140 unexpected PASS!
+470 unexpected PASS!
+480 unexpected PASS!
+490 unexpected FAIL: Correct 'P15', got 'T13'
+710 unexpected FAIL: Correct 'Q2', got 'C2'
+780 unexpected PASS!
+1000 unexpected PASS!
+./regress.sh . nngs4.tst 
+250 unexpected PASS!
+560 unexpected FAIL: Correct 'B13', got 'F7'
+890 unexpected PASS!
+990 unexpected PASS!
+1050 unexpected FAIL: Correct 'O9|O10', got 'Q8'
+./regress.sh . strategy5.tst 
+296 unexpected PASS!
+298 unexpected PASS!
+./regress.sh . century2002.tst 
+60 unexpected FAIL: Correct 'Q14', got 'F10'
+150 unexpected PASS!
+./regress.sh . auto02.tst 
+7 unexpected PASS!
+8 unexpected PASS!
+./regress.sh . safety.tst 
+3 unexpected PASS!
+5 unexpected PASS!
+./regress.sh . ninestones.tst 
+20 unexpected FAIL: Correct 'H2|H3', got 'G2'
+220 unexpected PASS!
+370 unexpected FAIL: Correct 'R5', got 'E12'
+490 unexpected PASS!
+680 unexpected FAIL: Correct 'A18|A14', got 'H19'
+700 unexpected FAIL: Correct 'K15', got 'M14'
+720 unexpected FAIL: Correct 'J3|K3|K2', got 'N2'
+730 unexpected FAIL: Correct 'K2', got 'O5'
+740 unexpected FAIL: Correct 'T16', got 'T14'
+750 unexpected FAIL: Correct 'K12', got 'K13'
+770 unexpected FAIL: Correct 'Q19', got 'T9'
+780 unexpected FAIL: Correct 'B2', got 'T10'
+800 unexpected FAIL: Correct 'K1', got 'M18'
+810 unexpected FAIL: Correct 'F1', got 'A3'
+./regress.sh . gunnar.tst 
+30 unexpected PASS!
+76 unexpected PASS!
+83 unexpected FAIL: Correct 'M10', got 'N10'
+90 unexpected PASS!
+93 unexpected PASS!
+./regress.sh . arend2.tst 
+30 unexpected PASS!
+250 unexpected FAIL: Correct 'D5', got 'E5'
+260 unexpected FAIL: Correct 'E14', got 'C15'
+270 unexpected FAIL: Correct 'A11|A12', got 'B8'
+280 unexpected FAIL: Correct 'B5', got 'Q12'
+290 unexpected FAIL: Correct 'C5', got 'R9'
+300 unexpected FAIL: Correct 'D8', got 'D7'
+./regress.sh . 13x13b.tst 
+14 unexpected PASS!
+./regress.sh . seki.tst 
+403 unexpected FAIL: Correct 'C1|C2', got 'B2'
+803 unexpected PASS!
+./regress.sh . 9x9.tst 
+197 unexpected PASS!
+520 unexpected PASS!
+540 unexpected PASS!
+550 unexpected PASS!
+630 unexpected FAIL: Correct 'J5', got 'J4'
+./regress.sh . cgf2004.tst 
+./regress.sh . kgs.tst 
+180 unexpected PASS!
+230 unexpected FAIL: Correct 'J12|J11|L10|L9|J19', got 'O11'
+240 unexpected PASS!
+400 unexpected PASS!
+530 unexpected PASS!
+./regress.sh . olympiad2004.tst 
+3 unexpected PASS!
+
+========================== 3.7.8-post1 =============================
+
+./regress.sh . semeai.tst
+60 unexpected PASS!
+77 unexpected PASS!
+79 unexpected PASS!
+134 unexpected FAIL: Correct '1 1 H2', got '1 0 H2'
+
+========================== 3.7.8  ==================================
+
+./regress.sh . filllib.tst 
+50 unexpected FAIL: Correct 'T2|R2|S1', got 'PASS'
+./regress.sh . connection.tst 
+97 unexpected PASS!
+105 unexpected PASS!
+115 unexpected PASS!
+117 unexpected PASS!
+122 unexpected PASS!
+123 unexpected PASS!
+124 unexpected PASS!
+125 unexpected PASS!
+126 unexpected FAIL: Correct '1 E6', got '0'
+127 unexpected FAIL: Correct '0', got '1'
+./regress.sh . break_in.tst 
+100 unexpected FAIL: Correct '0', got '1 D9'
+./regress.sh . blunder.tst 
+33 unexpected PASS!
+./regress.sh . trevora.tst 
+370 unexpected FAIL: Correct 'F6', got 'B3'
+./regress.sh . endgame.tst 
+980 unexpected FAIL: Correct 'F4', got 'Q19'
+./regress.sh . neurogo.tst 
+13 unexpected FAIL: Correct 'M7|M8', got 'P7'
+./regress.sh . arion.tst 
+3 unexpected FAIL: Correct 'J3', got 'P7'
+./regress.sh . nicklas1.tst 
+1104 unexpected FAIL: Correct 'C1', got 'A15'
+1408 unexpected FAIL: Correct 'alive', got 'critical A6 B5'
+./regress.sh . nicklas2.tst 
+904 unexpected FAIL: Correct 'B1|E1', got 'H7'
+./regress.sh . nngs.tst 
+110 unexpected FAIL: Correct 'E2|H5|J5', got 'L2'
+120 unexpected FAIL: Correct 'S1', got 'R5'
+230 unexpected FAIL: Correct 'E9|G7|H2|K6|N5|D6', got 'C8'
+304 unexpected PASS!
+380 unexpected FAIL: Correct 'J2', got 'H2'
+400 unexpected FAIL: Correct 'N14|L13|M13', got 'S17'
+510 unexpected PASS!
+710 unexpected FAIL: Correct 'F16', got 'B12'
+810 unexpected FAIL: Correct 'J6|J8', got 'O15'
+890 unexpected FAIL: Correct 'G4', got 'H4'
+1100 unexpected FAIL: Correct 'C18|D14', got 'F2'
+1230 unexpected FAIL: Correct 'H7|B5|E7|R14', got 'Q14'
+1590 unexpected FAIL: Correct 'L5', got 'K6'
+1790 unexpected FAIL: Correct 'O16', got 'S14'
+1810 unexpected FAIL: Correct 'N15', got 'Q14'
+1880 unexpected FAIL: Correct 'F6|G7', got 'H7'
+./regress.sh . semeai.tst 
+80 unexpected PASS!
+132 unexpected FAIL: Correct 'H9|J4', got 'J8'
+./regress.sh . trevord.tst 
+260 unexpected FAIL: Correct 'Q2', got 'D6'
+./regress.sh . owl1.tst 
+300 unexpected FAIL: Correct '1 (S5|S2)', got '2 S2'
+381 unexpected FAIL: Correct '1 (L10|M11|M10)', got '1 K7'
+382 unexpected FAIL: Correct '1 (L10|K7|K5|Q10)', got '0'
+384 unexpected FAIL: Correct '1 (A2|F2)', got '0'
+./regress.sh . nngs4.tst 
+760 unexpected PASS!
+./regress.sh . strategy5.tst 
+274 unexpected FAIL: Correct 'M6', got 'L5'
+295 unexpected FAIL: Correct 'J2', got 'J4'
+296 unexpected FAIL: Correct 'G8', got 'F9'
+297 unexpected FAIL: Correct 'D8', got 'D9'
+298 unexpected FAIL: Correct 'D2|B7', got 'A5'
+299 unexpected FAIL: Correct 'H3', got 'D7'
+300 unexpected FAIL: Correct 'H3', got 'H9'
+./regress.sh . century2002.tst 
+150 unexpected FAIL: Correct 'B18', got 'A18'
+./regress.sh . ninestones.tst 
+570 unexpected PASS!
+./regress.sh . manyfaces1.tst 
+160 unexpected PASS!
+./regress.sh . gunnar.tst 
+71 unexpected PASS!
+90 unexpected FAIL: Correct 'H3', got 'PASS'
+92 unexpected FAIL: Correct 'B15', got 'G17'
+93 unexpected FAIL: Correct 'T13', got 'S5'
+94 unexpected FAIL: Correct 'H15|K16', got 'F15'
+95 unexpected FAIL: Correct 'P1|S1', got 'O3'
+./regress.sh . nando.tst 
+33 unexpected PASS!
+34 unexpected FAIL: Correct 'S8', got 'S12'
+35 unexpected FAIL: Correct '3 S8', got '0'
+36 unexpected FAIL: Correct '1 L7', got '0'
+./regress.sh . 9x9.tst 
+510 unexpected FAIL: Correct 'C4', got 'D3'
+520 unexpected FAIL: Correct 'E5|D5|B2|E3|F3|F4', got 'E7'
+530 unexpected FAIL: Correct 'F3', got 'F2'
+540 unexpected FAIL: Correct 'D7', got 'D8'
+550 unexpected FAIL: Correct 'C6', got 'B8'
+560 unexpected FAIL: Correct 'B4', got 'C5'
+570 unexpected FAIL: Correct 'E4', got 'E7'
+580 unexpected FAIL: Correct 'E6', got 'E2'
+590 unexpected FAIL: Correct 'E5', got 'E8'
+600 unexpected FAIL: Correct 'F4|F3|G3', got 'B7'
+610 unexpected FAIL: Correct 'E4', got 'H8'
+./regress.sh . kgs.tst 
+90 unexpected PASS!
+290 unexpected PASS!
+./regress.sh . olympiad2004.tst 
+106 unexpected FAIL: Correct 'D14', got 'K4'
+./regress.sh . gifu05.tst 
+1010 unexpected FAIL: Correct 'C14|C10|C6|D6|F3|F17|R11', got 'Q6'
+1030 unexpected FAIL: Correct 'C10', got 'C12'
+1040 unexpected FAIL: Correct 'E12|D11', got 'C2'
+1050 unexpected FAIL: Correct 'Q12', got 'E2'
+1060 unexpected FAIL: Correct 'E12|D11|D14', got 'C6'
+1070 unexpected FAIL: Correct 'G12', got 'C13'
+1080 unexpected FAIL: Correct 'O5', got 'L9'
+1090 unexpected FAIL: Correct 'M9', got 'P9'
+1100 unexpected FAIL: Correct 'N9', got 'S12'
+1110 unexpected FAIL: Correct 'L5', got 'K6'
+1130 unexpected FAIL: Correct 'S18', got 'A17'
+1150 unexpected FAIL: Correct 'T14|P12|Q12', got 'H10'
+
+========================== 3.7.7  ==================================
+
+./regress.sh . reading.tst 
+220 unexpected FAIL: Correct '0', got '1 M12'
+./regress.sh . atari_atari.tst 
+29 unexpected PASS!
+./regress.sh . endgame.tst 
+970 unexpected PASS!
+./regress.sh . 13x13.tst 
+8 unexpected FAIL: Correct 'J8', got 'H8'
+14 unexpected FAIL: Correct 'A10|E8|E6|H6', got 'E9'
+41 unexpected FAIL: Correct 'D7', got 'C8'
+./regress.sh . owl1.tst 
+380 unexpected FAIL: Correct '1 P4', got '0'
+./regress.sh . nando.tst 
+33 unexpected FAIL: Correct 'H11', got 'L12'
+./regress.sh . 13x13b.tst 
+12 unexpected FAIL: Correct 'J6', got 'J5'
+13 unexpected FAIL: Correct 'K12', got 'M11'
+35 unexpected FAIL: Correct 'D7|E8|F9', got 'G10'
+./regress.sh . 9x9.tst 
+470 unexpected PASS!
+480 unexpected FAIL: Correct 'E2', got 'F2'
+500 unexpected PASS!
+
+
+========================== 3.7.6  ==================================
+
+None
+
+========================== 3.7.5  ==================================
+
+./regress.sh . reading.tst 
+187 unexpected PASS!
+199 unexpected PASS!
+205 unexpected PASS!
+206 unexpected PASS!
+218 unexpected FAIL: Correct '', got '1 B5'
+219 unexpected FAIL: Correct '1 M14', got '0'
+./regress.sh . filllib.tst 
+48 unexpected FAIL: Correct 'B4|E2|B2', got 'PASS'
+./regress.sh . connection.tst 
+117 unexpected FAIL: Correct '3 E7', got '0'
+119 unexpected FAIL: Correct '1 N10', got '0'
+121 unexpected FAIL: Correct '1 M11', got '0'
+122 unexpected FAIL: Correct '3 E16', got '0'
+./regress.sh . strategy.tst 
+41 unexpected PASS!
+./regress.sh . endgame.tst 
+930 unexpected FAIL: Correct 'O14', got 'R16'
+931 unexpected FAIL: Correct 'R16', got 'E4'
+933 unexpected FAIL: Correct 'P4', got 'C11'
+941 unexpected FAIL: Correct 'R16', got 'K11'
+942 unexpected FAIL: Correct 'P4', got 'R1'
+951 unexpected FAIL: Correct 'H8', got 'C1'
+960 unexpected FAIL: Correct 'J10', got 'H8'
+./regress.sh . ego.tst 
+8 unexpected PASS!
+./regress.sh . trevorb.tst 
+900 unexpected PASS!
+./regress.sh . trevor.tst 
+671 unexpected PASS!
+./regress.sh . nngs.tst 
+510 unexpected FAIL: Correct 'G14', got 'P13'
+900 unexpected PASS!
+./regress.sh . strategy3.tst 
+101 unexpected FAIL: Correct 'M16', got 'M17'
+./regress.sh . global.tst 
+44 unexpected FAIL: Correct 'D5', got 'J7'
+./regress.sh . trevord.tst 
+680 unexpected PASS!
+./regress.sh . owl1.tst 
+366 unexpected FAIL: Correct '0', got '1 P2'
+367 unexpected FAIL: Correct '1 O4', got '1 N5'
+368 unexpected FAIL: Correct '1 (O4|N3)', got '0'
+370 unexpected FAIL: Correct '1 O4', got '0'
+371 unexpected FAIL: Correct '1 M13', got '0'
+372 unexpected FAIL: Correct '1 D18', got '0'
+374 unexpected FAIL: Correct '1 K19', got '0'
+./regress.sh . handtalk.tst 
+15 unexpected PASS!
+./regress.sh . auto04.tst 
+2 unexpected FAIL: Correct '!0', got '0'
+./regress.sh . ninestones.tst 
+150 unexpected PASS!
+./regress.sh . gunnar.tst 
+72 unexpected FAIL: Correct 'F18', got 'P11'
+75 unexpected FAIL: Correct 'C14', got 'P2'
+76 unexpected FAIL: Correct 'G17', got 'N19'
+78 unexpected FAIL: Correct 'N3', got 'M5'
+80 unexpected FAIL: Correct 'K15', got 'K14'
+82 unexpected FAIL: Correct 'T6', got 'T11'
+84 unexpected FAIL: Correct 'P13', got 'O13'
+./regress.sh . 9x9.tst 
+410 unexpected FAIL: Correct 'B5', got 'C8'
+420 unexpected FAIL: Correct 'D5', got 'E4'
+430 unexpected FAIL: Correct 'G7|H7', got 'G8'
+./regress.sh . kgs.tst 
+130 unexpected PASS!
+490 unexpected PASS!
+500 unexpected PASS!
+
+========================== 3.7.3  ==================================
+
+./regress.sh . reading.tst 
+217 unexpected FAIL: Correct '2 D4', got '0'
+./regress.sh . ld_owl.tst 
+69 unexpected PASS!
+324 unexpected PASS!
+./regress.sh . neurogo.tst 
+3 unexpected FAIL: Correct 'H3|K3|K4', got 'Q3'
+./regress.sh . nngs.tst 
+820 unexpected PASS!
+1160 unexpected PASS!
+1190 unexpected PASS!
+./regress.sh . owl1.tst 
+274 unexpected PASS!
+322 unexpected PASS!
+323 unexpected PASS!
+351 unexpected PASS!
+354 unexpected PASS!
+357 unexpected FAIL: Correct '0', got '2 F2'
+362 unexpected PASS!
+364 unexpected FAIL: Correct '1 (PASS|A7|D6|F8|F9)', got '0'
+./regress.sh . nngs4.tst 
+580 unexpected PASS!
+./regress.sh . gunnar.tst 
+68 unexpected PASS!
+70 unexpected PASS!
+./regress.sh . 9x9.tst 
+360 unexpected PASS!
+380 unexpected FAIL: Correct 'C3|D3', got 'C8'
+390 unexpected FAIL: Correct 'D7', got 'H5'
+400 unexpected FAIL: Correct 'A5', got 'J4'
+./regress.sh . kgs.tst 
+40 unexpected PASS!
+./regress.sh . olympiad2004.tst 
+10 unexpected PASS!
+./regress.sh . tiny.tst 
+201 unexpected PASS!
+301 unexpected PASS!
+401 unexpected PASS!
+
+========================== 3.7.2  ==================================
+
+./regress.sh . reading.tst 
+207 unexpected FAIL: Correct '3 (B4|C4|C1)', got '0'
+209 unexpected FAIL: Correct '3 (B4|C4)', got '0'
+211 unexpected FAIL: Correct '3 (C4|C5|C1)', got '0'
+213 unexpected FAIL: Correct '3 (C4|C5)', got '0'
+215 unexpected FAIL: Correct '3 (C4|C5)', got '0'
+./regress.sh . owl.tst 
+6 unexpected FAIL: Correct '0', got '1 B5'
+132 unexpected FAIL: Correct '(1|2) R4', got '0'
+150 unexpected FAIL: Correct '0', got '1 G13'
+./regress.sh . ld_owl.tst 
+69 unexpected FAIL: Correct '1 (T16|T18)', got '3 T16'
+./regress.sh . filllib.tst 
+45 unexpected PASS!
+./regress.sh . atari_atari.tst 
+29 unexpected FAIL: Correct 'K5', got 'PASS'
+./regress.sh . arb.tst 
+210 unexpected FAIL: Correct 'D8', got 'C8'
+./regress.sh . viking.tst 
+2 unexpected PASS!
+6 unexpected PASS!
+./regress.sh . nngs.tst 
+1750 unexpected PASS!
+./regress.sh . trevorc.tst 
+1020 unexpected PASS!
+1030 unexpected PASS!
+1440 unexpected FAIL: Correct 'E12|F11', got 'F1'
+./regress.sh . arend.tst 
+30 unexpected FAIL: Correct 'C13', got 'J13'
+./regress.sh . 13x13.tst 
+17 unexpected FAIL: Correct 'L5|L3', got 'G8'
+52 unexpected PASS!
+61 unexpected FAIL: Correct 'K8', got 'L13'
+87 unexpected PASS!
+./regress.sh . semeai.tst 
+130 unexpected FAIL: Correct '0 0 PASS', got '3 3 F2'
+./regress.sh . strategy4.tst 
+187 unexpected FAIL: Correct 'C4|E4', got 'C1'
+./regress.sh . owl1.tst 
+293 unexpected FAIL: Correct '0', got '1 S6'
+354 unexpected FAIL: Correct '0', got '1 S15'
+356 unexpected FAIL: Correct '1 L3', got '0'
+358 unexpected FAIL: Correct '0', got '1 Q17'
+359 unexpected FAIL: Correct '0', got '1 S6'
+360 unexpected FAIL: Correct '0', got '1 L14'
+361 unexpected FAIL: Correct '1 K16', got '0'
+362 unexpected FAIL: Correct '1 M16', got '0'
+363 unexpected FAIL: Correct '1 (F5|G5|G6|H6)', got '0'
+./regress.sh . nngs2.tst 
+440 unexpected FAIL: Correct 'B18|C18|E16|E18|F16|F17', got 'J7'
+./regress.sh . nngs3.tst 
+400 unexpected PASS!
+700 unexpected PASS!
+./regress.sh . nngs4.tst 
+230 unexpected FAIL: Correct 'Q18', got 'L18'
+390 unexpected PASS!
+870 unexpected PASS!
+./regress.sh . strategy5.tst 
+226 unexpected PASS!
+292 unexpected PASS!
+./regress.sh . ninestones.tst 
+150 unexpected FAIL: Correct 'C5|D5', got 'G14'
+./regress.sh . manyfaces1.tst 
+70 unexpected PASS!
+./regress.sh . gunnar.tst 
+46 unexpected FAIL: Correct 'O11', got 'O9'
+51 unexpected PASS!
+60 unexpected FAIL: Correct 'R10', got 'R11'
+61 unexpected FAIL: Correct 'D8', got 'J2'
+62 unexpected FAIL: Correct 'O19', got 'G14'
+63 unexpected FAIL: Correct 'Q2', got 'P1'
+64 unexpected FAIL: Correct '!(M1|Q2)', got 'Q2'
+65 unexpected FAIL: Correct '!P19', got 'P19'
+67 unexpected FAIL: Correct 'D9', got 'O16'
+68 unexpected FAIL: Correct 'D8', got 'F6'
+69 unexpected FAIL: Correct 'D7', got 'A9'
+70 unexpected FAIL: Correct 'A18|A13', got 'D14'
+71 unexpected FAIL: Correct 'D5', got 'C8'
+./regress.sh . arend2.tst 
+150 unexpected PASS!
+./regress.sh . seki.tst 
+103 unexpected FAIL: Correct 'B1|A2', got 'B2'
+./regress.sh . 9x9.tst 
+160 unexpected FAIL: Correct 'E7', got 'G6'
+250 unexpected FAIL: Correct 'A2|C1|C2', got 'PASS'
+260 unexpected PASS!
+./regress.sh . kgs.tst 
+520 unexpected PASS!
+
+========================== 3.7.2-pre2  ==================================
+
+./regress.sh . nngs1.tst 
+27 unexpected PASS!
+./regress.sh . strategy.tst 
+13 unexpected PASS!
+./regress.sh . endgame.tst 
+840 unexpected PASS!
+./regress.sh . golife.tst 
+3 unexpected FAIL: Correct 'E3|E2', got 'H5'
+./regress.sh . trevorb.tst 
+230 unexpected FAIL: Correct 'L5', got 'M7'
+900 unexpected FAIL: Correct 'F11', got 'E12'
+./regress.sh . nngs.tst 
+930 unexpected PASS!
+./regress.sh . trevorc.tst 
+1480 unexpected FAIL: Correct 'A8', got 'F6'
+./regress.sh . strategy3.tst 
+141 unexpected PASS!
+./regress.sh . 13x13.tst 
+43 unexpected FAIL: Correct 'D6', got 'B6'
+74 unexpected PASS!
+./regress.sh . nngs2.tst 
+440 unexpected PASS!
+550 unexpected PASS!
+./regress.sh . nngs3.tst 
+580 unexpected FAIL: Correct 'H3|J5|K3|J3', got 'A4'
+1000 unexpected FAIL: Correct 'L17', got 'H18'
+./regress.sh . nngs4.tst 
+960 unexpected PASS!
+./regress.sh . gunnar.tst 
+10 unexpected PASS!
+46 unexpected PASS!
+./regress.sh . thrash.tst 
+10 unexpected PASS!
+./regress.sh . 9x9.tst 
+250 unexpected PASS!
+./regress.sh . kgs.tst 
+110 unexpected PASS!
+230 unexpected PASS!
+./regress.sh . olympiad2004.tst 
+123 unexpected PASS!
+./regress.sh . tiny.tst 
+1 unexpected FAIL: Correct 'A1|A2|B1|B2', got 'PASS'
+101 unexpected FAIL: Correct 'B2', got 'PASS'
+104 unexpected FAIL: Correct 'B2', got 'PASS'
+201 unexpected FAIL: Correct 'B2|C2|B3|C3', got 'PASS'
+202 unexpected FAIL: Correct 'B2', got 'B3'
+207 unexpected FAIL: Correct 'A3', got 'D2'
+
+========================== 3.7.2-pre1  ==================================
+
+./regress.sh . reading.tst 
+203 unexpected FAIL: Correct '1 E9', got '0'
+205 unexpected FAIL: Correct '0', got '1 J2'
+206 unexpected FAIL: Correct '0', got '2 A3'
+./regress.sh . ld_owl.tst 
+322 unexpected FAIL: Correct '1 (N11|N13|PASS)', got '2 N12'
+324 unexpected FAIL: Correct '1 N2', got '2 M4'
+./regress.sh . atari_atari.tst 
+28 unexpected FAIL: Correct '0', got 'R3'
+./regress.sh . connection.tst 
+115 unexpected FAIL: Correct '1 H7', got '0'
+./regress.sh . blunder.tst 
+33 unexpected FAIL: Correct '!H6|J1', got 'J1'
+./regress.sh . buzco.tst 
+4 unexpected PASS!
+./regress.sh . nngs.tst 
+380 unexpected FAIL: Correct '!H2|S1', got 'H2'
+1060 unexpected FAIL: Correct 'H3|F3', got 'T3'
+./regress.sh . strategy3.tst 
+116 unexpected FAIL: Correct 'M4|N5', got 'O7'
+./regress.sh . semeai.tst 
+110 unexpected PASS!
+111 unexpected PASS!
+112 unexpected PASS!
+113 unexpected PASS!
+120 unexpected FAIL: Correct '1 1 (A14|C19)', got '0 0 PASS'
+121 unexpected FAIL: Correct '1 0', got '0 0 PASS'
+122 unexpected FAIL: Correct '2 2 C19', got '1 1 A14'
+123 unexpected FAIL: Correct '1 1 M18', got '0 0 PASS'
+125 unexpected FAIL: Correct '3 3 T17', got '0 0 PASS'
+128 unexpected FAIL: Correct '!T15', got 'T15'
+./regress.sh . strategy4.tst 
+157 unexpected FAIL: Correct 'B14|B13|B12|A14|A12', got 'C18'
+./regress.sh . nngs3.tst 
+1090 unexpected PASS!
+./regress.sh . strategy5.tst 
+292 unexpected FAIL: Correct 'F16|F17', got 'S4'
+293 unexpected FAIL: Correct 'F17', got 'L9'
+./regress.sh . gunnar.tst 
+55 unexpected PASS!
+56 unexpected PASS!
+./regress.sh . seki.tst 
+112 unexpected FAIL: Correct 'B1', got 'C9'
+
+========================== 3.7.1-pre2  ==================================
+
+./regress.sh . reading.tst 
+52 unexpected PASS!
+53 unexpected PASS!
+202 unexpected FAIL: Correct '2 F13', got '0'
+./regress.sh . owl.tst 
+191 unexpected PASS!
+./regress.sh . ld_owl.tst 
+317 unexpected FAIL: Correct '1 E13', got '0'
+520 unexpected FAIL: Correct '2 B3', got '0'
+./regress.sh . strategy.tst 
+26 unexpected PASS!
+./regress.sh . endgame.tst 
+850 unexpected PASS!
+910 unexpected PASS!
+920 unexpected PASS!
+./regress.sh . arb.tst 
+203 unexpected FAIL: Correct 'T7', got 'N3'
+./regress.sh . lazarus.tst 
+13 unexpected PASS!
+./regress.sh . trevorb.tst 
+140 unexpected PASS!
+960 unexpected PASS!
+./regress.sh . nicklas2.tst 
+2103 unexpected FAIL: Correct 'PASS', got 'A7'
+./regress.sh . trevor.tst 
+160 unexpected FAIL: Correct 'B8|C8', got 'A7'
+./regress.sh . nngs.tst 
+120 unexpected PASS!
+990 unexpected PASS!
+1260 unexpected PASS!
+1280 unexpected PASS!
+./regress.sh . trevorc.tst 
+1180 unexpected PASS!
+1580 unexpected FAIL: Correct 'C8', got 'A5'
+./regress.sh . strategy3.tst 
+119 unexpected FAIL: Correct 'D9|J3', got 'J6'
+./regress.sh . connect.tst 
+70 unexpected PASS!
+./regress.sh . global.tst 
+1 unexpected PASS!
+4 unexpected PASS!
+5 unexpected PASS!
+44 unexpected PASS!
+./regress.sh . 13x13.tst 
+42 unexpected PASS!
+./regress.sh . semeai.tst 
+115 unexpected PASS!
+./regress.sh . owl1.tst 
+347 unexpected FAIL: Correct '1 D10', got '0'
+348 unexpected FAIL: Correct '0', got '1 PASS'
+351 unexpected FAIL: Correct '1 (PASS|E11|F19|G18)', got '0'
+352 unexpected FAIL: Correct '0', got '1 H17'
+./regress.sh . nngs2.tst 
+140 unexpected FAIL: Correct 'P5', got 'Q6'
+240 unexpected FAIL: Correct 'F17', got 'B14'
+./regress.sh . nngs3.tst 
+130 unexpected FAIL: Correct 'C7|C9', got 'G6'
+140 unexpected FAIL: Correct 'D9', got 'G9'
+580 unexpected PASS!
+1080 unexpected PASS!
+./regress.sh . nngs4.tst 
+485 unexpected PASS!
+560 unexpected PASS!
+650 unexpected PASS!
+./regress.sh . century2002.tst 
+85 unexpected FAIL: Correct 'B17', got 'B19'
+180 unexpected PASS!
+./regress.sh . auto_handtalk.tst 
+3 unexpected PASS!
+./regress.sh . ninestones.tst 
+230 unexpected PASS!
+370 unexpected PASS!
+650 unexpected FAIL: Correct 'Q5', got 'Q9'
+./regress.sh . gunnar.tst 
+34 unexpected PASS!
+55 unexpected FAIL: Correct 'D13', got 'C13'
+56 unexpected FAIL: Correct 'P18|E15|O12|N11|T12|T10|S7|T5', got 'A11'
+./regress.sh . thrash.tst 
+7 unexpected PASS!
+8 unexpected PASS!
+13 unexpected PASS!
+./regress.sh . gifu03.tst 
+704 unexpected PASS!
+./regress.sh . seki.tst 
+1106 unexpected PASS!
+2020 unexpected PASS!
+2050 unexpected PASS!
+./regress.sh . 9x9.tst 
+20 unexpected PASS!
+30 unexpected FAIL: Correct 'D7', got 'C6'
+./regress.sh . kgs.tst 
+70 unexpected PASS!
+160 unexpected PASS!
+450 unexpected PASS!
+510 unexpected FAIL: Correct 'P8', got 'P9'
+520 unexpected FAIL: Correct 'R9', got 'P12'
+530 unexpected FAIL: Correct 'P14', got 'P16'
+540 unexpected FAIL: Correct 'A5|A11', got 'B14'
+550 unexpected FAIL: Correct 'Q2', got 'S4'
+560 unexpected FAIL: Correct 'B1', got 'K5'
+./regress.sh . olympiad2004.tst 
+2 unexpected PASS!
+16 unexpected PASS!
+17 unexpected PASS!
+102 unexpected PASS!
+103 unexpected PASS!
+105 unexpected PASS!
+113 unexpected PASS!
+121 unexpected PASS!
+201 unexpected FAIL: Correct 'E11', got 'C11'
+203 unexpected FAIL: Correct 'O10', got 'M13'
+301 unexpected FAIL: Correct 'D4', got 'D8'
+401 unexpected FAIL: Correct 'H6', got 'J7'
+501 unexpected FAIL: Correct 'F3', got 'G5'
+502 unexpected FAIL: Correct 'B5', got 'A6'
+503 unexpected FAIL: Correct 'F6', got 'E7'
+602 unexpected FAIL: Correct 'E6', got 'G6'
+603 unexpected FAIL: Correct 'A1', got 'A4'
+
+========================== 3.7.1-pre1  ==================================
+
+./regress.sh . reading.tst 
+201 unexpected FAIL: Correct '1 G17', got '0'
+./regress.sh . connection.tst 
+114 unexpected FAIL: Correct '1 B15', got '0'
+./regress.sh . blunder.tst 
+21 unexpected PASS!
+./regress.sh . strategy.tst 
+8 unexpected FAIL: Correct 'N2|N1', got 'F1'
+./regress.sh . arb.tst 
+210 unexpected PASS!
+./regress.sh . strategy2.tst 
+73 unexpected PASS!
+./regress.sh . trevor.tst 
+410 unexpected FAIL: Correct 'D5|E5', got 'C4'
+630 unexpected PASS!
+./regress.sh . nngs.tst 
+510 unexpected PASS!
+875 unexpected FAIL: Correct 'C5', got 'E7'
+./regress.sh . global.tst 
+34 unexpected FAIL: Correct 'N6', got 'F3'
+./regress.sh . vie.tst 
+8 unexpected PASS!
+./regress.sh . arend.tst 
+9 unexpected FAIL: Correct 'S17', got 'S2'
+./regress.sh . 13x13.tst 
+36 unexpected PASS!
+./regress.sh . semeai.tst 
+117 unexpected FAIL: Correct '3 3 E16', got '0 0 PASS'
+./regress.sh . strategy4.tst 
+182 unexpected FAIL: Correct 'E7|F8', got 'S11'
+188 unexpected PASS!
+206 unexpected FAIL: Correct 'L8', got 'K6'
+./regress.sh . owl1.tst 
+311 unexpected PASS!
+324 unexpected PASS!
+339 unexpected PASS!
+344 unexpected PASS!
+345 unexpected FAIL: Correct '1 N13', got '0'
+346 unexpected FAIL: Correct '1 N13', got '0'
+./regress.sh . nngs3.tst 
+230 unexpected PASS!
+250 unexpected FAIL: Correct 'G11', got 'G13'
+350 unexpected PASS!
+./regress.sh . nngs4.tst 
+230 unexpected PASS!
+650 unexpected FAIL: Correct 'Q2', got 'G12'
+./regress.sh . ninestones.tst 
+630 unexpected PASS!
+650 unexpected PASS!
+./regress.sh . gunnar.tst 
+39 unexpected FAIL: Correct 'N4', got 'N1'
+./regress.sh . kgs.tst 
+320 unexpected PASS!
+330 unexpected FAIL: Correct 'H1', got 'L2'
+340 unexpected FAIL: Correct 'L4', got 'L2'
+350 unexpected FAIL: Correct 'L7|K7', got 'L8'
+360 unexpected FAIL: Correct 'B18', got 'R7'
+370 unexpected FAIL: Correct 'G12', got 'H11'
+390 unexpected FAIL: Correct 'P8|P7', got 'P14'
+400 unexpected FAIL: Correct 'P8|P7|Q13', got 'N12'
+410 unexpected FAIL: Correct 'O8|O11|P11', got 'S12'
+420 unexpected FAIL: Correct '0', got '1 R16'
+450 unexpected FAIL: Correct 'L15', got 'L13'
+460 unexpected FAIL: Correct 'M19', got 'K2'
+470 unexpected FAIL: Correct 'G13', got 'F18'
+480 unexpected FAIL: Correct 'H9|G9|G8', got 'M10'
+490 unexpected FAIL: Correct 'H13', got 'F9'
+500 unexpected FAIL: Correct 'O15|P13', got 'N14'
+./regress.sh . olympiad2004.tst 
+1 unexpected FAIL: Correct '!Q12', got 'Q12'
+2 unexpected FAIL: Correct 'G14', got 'G12'
+3 unexpected FAIL: Correct '!Q10', got 'Q10'
+4 unexpected FAIL: Correct 'G10|G9|G8|G7|J7|J6|K7|H7', got 'N16'
+6 unexpected FAIL: Correct 'D11|H9|F10', got 'N18'
+7 unexpected FAIL: Correct 'D14|D11', got 'P18'
+9 unexpected FAIL: Correct 'B15', got 'E15'
+10 unexpected FAIL: Correct 'B15', got 'C14'
+11 unexpected FAIL: Correct 'S19|R19|O14|O13|S14', got 'T17'
+12 unexpected FAIL: Correct '!L9', got 'L9'
+13 unexpected FAIL: Correct 'A7', got 'O1'
+14 unexpected FAIL: Correct 'T14', got 'T4'
+15 unexpected FAIL: Correct 'G18', got 'J19'
+16 unexpected FAIL: Correct 'A7|A6|E4|A5', got 'C11'
+17 unexpected FAIL: Correct 'A7|A6|E4|A5', got 'PASS'
+101 unexpected FAIL: Correct 'E2', got 'E5'
+102 unexpected FAIL: Correct 'E2', got 'G4'
+103 unexpected FAIL: Correct 'C18', got 'C15'
+104 unexpected FAIL: Correct 'D14', got 'P16'
+105 unexpected FAIL: Correct 'O17|N17|T17', got 'F2'
+107 unexpected FAIL: Correct 'R6', got 'Q6'
+109 unexpected FAIL: Correct 'C10', got 'C2'
+112 unexpected FAIL: Correct 'T14', got 'T13'
+113 unexpected FAIL: Correct '!Q10', got 'Q10'
+114 unexpected FAIL: Correct 'M18', got 'K19'
+115 unexpected FAIL: Correct 'N19', got 'T18'
+116 unexpected FAIL: Correct 'H8', got 'M3'
+117 unexpected FAIL: Correct 'G10', got 'G9'
+118 unexpected FAIL: Correct 'T16|L17|M17|G5', got 'F11'
+120 unexpected FAIL: Correct 'M12', got 'N13'
+121 unexpected FAIL: Correct 'G5', got 'H6'
+122 unexpected FAIL: Correct 'C6', got 'E7'
+123 unexpected FAIL: Correct 'K3|L3|L1', got 'F6'
+
+========================== 3.5.10 =====================================
+
+./regress.sh . reading.tst 
+200 unexpected FAIL: Correct '1 B2', got '0'
+./regress.sh . endgame.tst 
+920 unexpected FAIL: Correct 'C4', got 'P15'
+./regress.sh . owl1.tst 
+342 unexpected FAIL: Correct '(2|3) T2', got '0'
+343 unexpected FAIL: Correct '(2|3) T3', got '0'
+./regress.sh . kgs.tst 
+180 unexpected FAIL: Correct 'C4|C3|D3', got 'B13'
+190 unexpected FAIL: Correct 'C4', got 'D2'
+200 unexpected FAIL: Correct '!K4', got 'K4'
+210 unexpected FAIL: Correct 'Q13', got 'S14'
+220 unexpected FAIL: Correct 'T10', got 'T8'
+230 unexpected FAIL: Correct 'J12|J11|L10|L9|J19', got 'F18'
+240 unexpected FAIL: Correct 'B7', got 'B3'
+250 unexpected FAIL: Correct 'P1', got 'J2'
+260 unexpected FAIL: Correct 'T10|Q11|O11', got 'F12'
+270 unexpected FAIL: Correct 'T1', got 'PASS'
+280 unexpected FAIL: Correct 'G1', got 'J6'
+290 unexpected FAIL: Correct 'B2', got 'D5'
+300 unexpected FAIL: Correct 'H4', got 'H5'
+320 unexpected FAIL: Correct 'K12', got 'J9'
+
+
+========================== 3.5.9 =====================================
+
+./regress.sh . reading.tst 
+199 unexpected FAIL: Correct '0', got '1 D1'
+
+========================== 3.5.8 =====================================
+
+./regress.sh . reading.tst 
+188 unexpected PASS!
+./regress.sh . optics.tst 
+1801 unexpected PASS!
+./regress.sh . filllib.tst 
+46 unexpected FAIL: Correct 'N3|H5|M1', got 'G2'
+./regress.sh . atari_atari.tst 
+27 unexpected FAIL: Correct '0', got 'H1'
+./regress.sh . blunder.tst 
+27 unexpected PASS!
+30 unexpected PASS!
+32 unexpected PASS!
+33 unexpected PASS!
+34 unexpected PASS!
+35 unexpected PASS!
+./regress.sh . strategy.tst 
+13 unexpected FAIL: Correct 'N18', got 'L17'
+./regress.sh . nicklas3.tst 
+401 unexpected PASS!
+./regress.sh . nngs.tst 
+1060 unexpected PASS!
+./regress.sh . trevorc.tst 
+1621 unexpected PASS!
+./regress.sh . strategy3.tst 
+115 unexpected PASS!
+119 unexpected PASS!
+./regress.sh . strategy4.tst 
+151 unexpected PASS!
+./regress.sh . gunnar.tst 
+48 unexpected PASS!
+./regress.sh . seki.tst 
+101 unexpected PASS!
+303 unexpected PASS!
+305 unexpected PASS!
+905 unexpected FAIL: Correct 'C1', got 'C9'
+
+
+========================== 3.5.7 =====================================
+
+./regress.sh . ld_owl.tst 
+301 unexpected FAIL: Correct '1 C19', got '3 B18'
+./regress.sh . connection.tst 
+111 unexpected PASS!
+112 unexpected PASS!
+./regress.sh . blunder.tst 
+11 unexpected PASS!
+34 unexpected FAIL: Correct '!A19|C19', got 'A19'
+35 unexpected FAIL: Correct '!G1', got 'G1'
+./regress.sh . nngs1.tst 
+34 unexpected PASS!
+./regress.sh . arion.tst 
+6 unexpected PASS!
+./regress.sh . nicklas3.tst 
+401 unexpected FAIL: Correct 'A5', got 'C6'
+./regress.sh . manyfaces.tst 
+9 unexpected PASS!
+./regress.sh . global.tst 
+1 unexpected FAIL: Correct 'B3', got 'A4'
+44 unexpected FAIL: Correct 'D5', got 'G7'
+./regress.sh . arend.tst 
+29 unexpected PASS!
+./regress.sh . 13x13.tst 
+31 unexpected PASS!
+./regress.sh . trevord.tst 
+280 unexpected PASS!
+880 unexpected FAIL: Correct 'R7', got 'D6'
+./regress.sh . owl1.tst 
+339 unexpected FAIL: Correct '0', got '1 Q13'
+340 unexpected FAIL: Correct '1 A11', got '0'
+341 unexpected FAIL: Correct '1 K8', got '0'
+./regress.sh . nngs2.tst 
+1 unexpected FAIL: Correct 'B1|A2', got 'A4'
+./regress.sh . nngs3.tst 
+250 unexpected PASS!
+./regress.sh . nngs4.tst 
+620 unexpected PASS!
+1090 unexpected FAIL: Correct 'O3|D5|C5|C6|O16|O17|P16|P17|C9', got 'H4'
+1100 unexpected FAIL: Correct 'J7', got 'P7'
+1110 unexpected FAIL: Correct 'S9|Q8|P8|P9', got 'T9'
+1120 unexpected FAIL: Correct 'N7', got 'Q8'
+./regress.sh . strategy5.tst 
+286 unexpected PASS!
+291 unexpected FAIL: Correct 'L9', got 'P7'
+./regress.sh . century2002.tst 
+60 unexpected PASS!
+./regress.sh . gunnar.tst 
+48 unexpected FAIL: Correct 'P11', got 'M12'
+53 unexpected PASS!
+./regress.sh . nando.tst 
+32 unexpected PASS!
+./regress.sh . thrash.tst 
+16 unexpected FAIL: Correct 'B8|B9|B10|C8|C9', got 'E17'
+17 unexpected FAIL: Correct 'L19|K19', got 'P19'
+./regress.sh . joseki.tst 
+20 unexpected PASS!
+./regress.sh . seki.tst 
+111 unexpected FAIL: Correct 'C2', got 'C1'
+703 unexpected PASS!
+903 unexpected FAIL: Correct 'C2|C1', got 'B1'
+./regress.sh . kgs.tst 
+80 unexpected FAIL: Correct 'L1|O2|Q1', got 'D13'
+90 unexpected FAIL: Correct 'T8', got 'T7'
+100 unexpected FAIL: Correct 'C1', got 'C4'
+110 unexpected FAIL: Correct 'G13', got 'C9'
+120 unexpected FAIL: Correct 'S18', got 'P7'
+130 unexpected FAIL: Correct 'S18', got 'S19'
+140 unexpected FAIL: Correct 'P14|N15|G12', got 'M3'
+150 unexpected FAIL: Correct 'M14|Q13', got 'R9'
+160 unexpected FAIL: Correct 'G12|H8|J7|G7', got 'C12'
+170 unexpected FAIL: Correct 'G12|H8|G7', got 'K5'
+
+========================== 3.5.6 =====================================
+
+With gcc 2.96 you may get the following different results:
+
+nicklas3:401 unexpected PASS!
+strategy5:286 unexpected PASS!
+
+The following results are with gcc 3.2.2.
+
+./regress.sh . owl.tst 
+262 unexpected FAIL: Correct '0', got '1 E8'
+./regress.sh . connection.tst 
+111 unexpected FAIL: Correct '0', got '1 P19'
+./regress.sh . blunder.tst 
+11 unexpected FAIL: Correct 'D4|E4|E5|F4|C6', got 'B3'
+./regress.sh . nicklas3.tst 
+401 unexpected PASS!
+./regress.sh . nngs.tst 
+875 unexpected PASS!
+./regress.sh . strategy3.tst 
+114 unexpected PASS!
+./regress.sh . global.tst 
+44 unexpected PASS!
+./regress.sh . 13x13.tst 
+31 unexpected FAIL: Correct 'M4|N4', got 'M6'
+./regress.sh . owl1.tst 
+338 unexpected FAIL: Correct '1 M16', got '0'
+./regress.sh . nngs2.tst 
+1 unexpected PASS!
+./regress.sh . century2002.tst 
+60 unexpected FAIL: Correct 'Q14', got 'R18'
+./regress.sh . ninestones.tst 
+190 unexpected FAIL: Correct '0', got '1 H8'
+./regress.sh . gunnar.tst 
+50 unexpected FAIL: Correct 'O8', got 'R13'
+51 unexpected FAIL: Correct 'S7', got 'T4'
+52 unexpected FAIL: Correct 'Q14', got 'J11'
+53 unexpected FAIL: Correct 'S17', got 'R18'
+./regress.sh . nando.tst 
+32 unexpected FAIL: Correct 'N13|O13', got 'O14'
+./regress.sh . thrash.tst 
+12 unexpected FAIL: Correct 'K10', got 'H18'
+13 unexpected FAIL: Correct 'P11', got 'H9'
+14 unexpected FAIL: Correct 'N17', got 'L18'
+15 unexpected FAIL: Correct 'P16', got 'N18'
+./regress.sh . seki.tst 
+703 unexpected FAIL: Correct 'B2', got 'B1'
+1001 unexpected PASS!
+./regress.sh . 9x9.tst 
+50 unexpected FAIL: Correct 'F4', got 'E4'
+193 unexpected FAIL: Correct 'E8', got 'D8'
+197 unexpected FAIL: Correct 'E8|H5', got 'D8'
+265 unexpected FAIL: Correct 'G6', got 'G5'
+355 unexpected FAIL: Correct '1 (A5|D2)', got '0'
+./regress.sh . kgs.tst 
+10 unexpected FAIL: Correct 'A11', got 'B15'
+20 unexpected FAIL: Correct 'C10', got 'A14'
+40 unexpected FAIL: Correct 'A6', got 'A7'
+50 unexpected FAIL: Correct 'D15', got 'D17'
+70 unexpected FAIL: Correct 'B2', got 'N15'
+
+========================== 3.5.5 =====================================
+
+./regress.sh . nicklas3.tst 
+401 unexpected FAIL: Correct 'A5', got 'C6'
+
+========================== 3.5.5 pre 2 =====================================
+
+./regress.sh . owl.tst 
+150 unexpected PASS!
+232 unexpected PASS!
+./regress.sh . ld_owl.tst 
+316 unexpected PASS!
+./regress.sh . connection.tst 
+38 unexpected FAIL: Correct '1 E1', got '0'
+56 unexpected PASS!
+69 unexpected PASS!
+87 unexpected PASS!
+103 unexpected PASS!
+110 unexpected PASS!
+./regress.sh . break_in.tst 
+60 unexpected PASS!
+./regress.sh . blunder.tst 
+11 unexpected PASS!
+./regress.sh . trevora.tst 
+290 unexpected PASS!
+530 unexpected PASS!
+550 unexpected PASS!
+./regress.sh . strategy.tst 
+13 unexpected PASS!
+50 unexpected FAIL: Correct 'Q9', got 'Q11'
+./regress.sh . endgame.tst 
+910 unexpected FAIL: Correct 'T2', got 'L14'
+./regress.sh . ego.tst 
+10 unexpected PASS!
+./regress.sh . strategy2.tst 
+73 unexpected FAIL: Correct 'F7|R17|P15', got 'E7'
+./regress.sh . nngs.tst 
+900 unexpected FAIL: Correct 'Q15', got 'S14'
+1300 unexpected PASS!
+./regress.sh . strategy3.tst 
+115 unexpected FAIL: Correct 'G2', got 'H1'
+./regress.sh . 13x13.tst 
+45 unexpected PASS!
+./regress.sh . trevord.tst 
+710 unexpected FAIL: Correct 'M2|J4|L5', got 'N3'
+./regress.sh . strategy4.tst 
+206 unexpected PASS!
+./regress.sh . owl1.tst 
+326 unexpected PASS!
+337 unexpected FAIL: Correct '1 C18', got '0'
+./regress.sh . nngs3.tst 
+1170 unexpected FAIL: Correct 'B1', got 'B7'
+./regress.sh . nngs4.tst 
+230 unexpected FAIL: Correct 'Q18', got 'L18'
+270 unexpected FAIL: Correct '!P5', got 'P5'
+420 unexpected PASS!
+470 unexpected FAIL: Correct 'R8', got 'N10'
+./regress.sh . strategy5.tst 
+286 unexpected FAIL: Correct 'K5', got 'C3'
+288 unexpected FAIL: Correct 'R12|R11|Q12|Q11', got 'M16'
+./regress.sh . ninestones.tst 
+570 unexpected PASS!
+./regress.sh . manyfaces1.tst 
+36 unexpected PASS!
+./regress.sh . gunnar.tst 
+49 unexpected PASS!
+./regress.sh . arend2.tst 
+70 unexpected PASS!
+./regress.sh . nando.tst 
+4 unexpected PASS!
+./regress.sh . seki.tst 
+101 unexpected FAIL: Correct 'C2', got 'B1'
+303 unexpected FAIL: Correct 'A2|C1|C2', got 'C9'
+305 unexpected FAIL: Correct 'C2', got 'C9'
+905 unexpected PASS!
+./regress.sh . 9x9.tst 
+350 unexpected FAIL: Correct '0', got '1 B4'
+
+========================== 3.5.5 pre 1 =====================================
+
+owl:150         FAIL 1 G13 [0]
+ld_owl:503      FAIL 1 S6 [1 S2]
+ld_owl:507      FAIL 1 S7 [1 S2]
+ld_owl:509      FAIL 1 B6 [1 A5]
+ld_owl:510      FAIL 1 A15 [1 B15]
+ld_owl:511      FAIL 1 T14 [1 (R12|R11)]
+ld_owl:513      FAIL 1 D2 [1 C2]
+ld_owl:517      FAIL 1 B8 [1 C8]
+atari_atari:26  FAIL PASS [E11|E12]
+blunder:11      FAIL B3 [D4|E4|E5|F4|C6]
+arb:210         FAIL C8 [D8]
+strategy2:53    PASS S15 [S15]
+trevorc:1360    PASS F12 [F12]
+strategy3:114   FAIL D9 [D7]
+global:4        FAIL F5 [Q6]
+global:5        FAIL F5 [O4]
+strategy4:198   PASS S18 [C10|S18]
+owl1:293        PASS 0 [0]
+owl1:333        PASS 0 [0]
+nngs4:170       PASS S6 [S6]
+nngs4:230       PASS Q18 [Q18]
+nngs4:650       PASS Q2 [Q2]
+nngs4:1040      PASS S12 [S12]
+strategy5:287   FAIL D1 [C2]
+century2002:240 FAIL C7 [F18]
+auto02:7        PASS 1 S15 [1 (S15|R15)]
+safety:3        FAIL G16 [H15|H16|G14|F13|C17]
+ninestones:40   PASS C2 [!D2]
+ninestones:640  PASS H2 [J2|H2]
+ninestones:660  PASS P1 [P1]
+seki:2020       FAIL dead [alive]
+seki:2030       FAIL dead [critical H9 H9]
+seki:2050       FAIL dead [alive]
+cgf2004:10      FAIL S16 [R15]
+cgf2004:20      FAIL Q6 [Q4]
+cgf2004:30      FAIL P10 [P7|R6]
+cgf2004:40      FAIL H9 [L6|L5|M7|M6|M5|N6|N5|N4|O5|O4|Q12]
+cgf2004:60      FAIL K14 [N4]
+cgf2004:70      FAIL M14 [N4]
+cgf2004:80      FAIL D6 [Q12|O15]
+Total nodes: 1504699114 2731519 10967147
+
+========================== 3.5.4 =====================================
+
+./regress.sh . reading.tst 
+164 unexpected PASS!
+./regress.sh . ld_owl.tst 
+315 unexpected PASS!
+406 unexpected PASS!
+407 unexpected PASS!
+408 unexpected PASS!
+409 unexpected PASS!
+410 unexpected PASS!
+411 unexpected PASS!
+412 unexpected PASS!
+413 unexpected PASS!
+414 unexpected PASS!
+./regress.sh . connection.tst 
+110 unexpected FAIL: Correct '0', got '1 F1'
+./regress.sh . trevora.tst 
+370 unexpected PASS!
+./regress.sh . strategy.tst 
+27 unexpected PASS!
+./regress.sh . endgame.tst 
+900 unexpected PASS!
+./regress.sh . neurogo.tst 
+12 unexpected PASS!
+./regress.sh . viking.tst 
+1 unexpected FAIL: Correct 'O15', got 'C3'
+./regress.sh . trevorb.tst 
+210 unexpected PASS!
+./regress.sh . nicklas1.tst 
+501 unexpected PASS!
+./regress.sh . nicklas2.tst 
+2103 unexpected PASS!
+./regress.sh . nngs.tst 
+330 unexpected PASS!
+490 unexpected FAIL: Correct 'J18', got 'G18'
+820 unexpected FAIL: Correct 'J13|L9', got 'D14'
+1680 unexpected PASS!
+./regress.sh . trevorc.tst 
+1000 unexpected FAIL: Correct 'N9|M11', got 'F11'
+1080 unexpected PASS!
+./regress.sh . semeai.tst 
+45 unexpected PASS!
+58 unexpected PASS!
+59 unexpected PASS!
+60 unexpected FAIL: Correct '0 0 PASS', got '1 1 H5'
+75 unexpected PASS!
+76 unexpected PASS!
+78 unexpected PASS!
+105 unexpected FAIL: Correct '1 1 (D6|C7)', got '1 1 C8'
+106 unexpected FAIL: Correct '1 0 (D6|C7)', got '1 1 C7'
+108 unexpected FAIL: Correct '1 1 J2', got '0 0 PASS'
+110 unexpected FAIL: Correct '1 0 (PASS|F3|E1)', got '0 0 PASS'
+111 unexpected FAIL: Correct '1 0 (PASS|F3|E1)', got '1 1 F3'
+112 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+113 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+107 unexpected FAIL: Correct 'D6|C7', got 'C8'
+115 unexpected FAIL: Correct 'alive', got 'dead'
+./regress.sh . trevord.tst 
+880 unexpected PASS!
+./regress.sh . strategy4.tst 
+167 unexpected FAIL: Correct 'D4', got 'E5'
+182 unexpected PASS!
+188 unexpected FAIL: Correct 'B6|C4', got 'A6'
+./regress.sh . owl1.tst 
+329 unexpected PASS!
+./regress.sh . nngs2.tst 
+150 unexpected PASS!
+./regress.sh . nngs4.tst 
+400 unexpected PASS!
+420 unexpected FAIL: Correct 'G6', got 'F4'
+600 unexpected PASS!
+760 unexpected FAIL: Correct 'Q15', got 'L3'
+780 unexpected FAIL: Correct '!F15', got 'F15'
+790 unexpected FAIL: Correct 'E15', got 'G6'
+820 unexpected FAIL: Correct 'Q12', got 'D6'
+830 unexpected FAIL: Correct '1 L15', got '1 K14'
+840 unexpected FAIL: Correct 'T13', got 'N7'
+850 unexpected FAIL: Correct 'M10|J10|L7|K7|K8|G7|G8|H8', got 'C6'
+860 unexpected FAIL: Correct 'J10', got 'H6'
+870 unexpected FAIL: Correct 'C3|C4|D3', got 'G9'
+880 unexpected FAIL: Correct 'O4|O5|R3|P3|R12|R11|O14|P13', got 'M17'
+890 unexpected FAIL: Correct '!B18', got 'B18'
+900 unexpected FAIL: Correct '!Q18', got 'Q18'
+910 unexpected FAIL: Correct '0', got '1 N5'
+920 unexpected FAIL: Correct 'E3|E4|F3|Q4|O4|R14|J3', got 'D8'
+940 unexpected FAIL: Correct 'M17|L17', got 'Q4'
+950 unexpected FAIL: Correct 'D9|D7|D10|C9', got 'D6'
+960 unexpected FAIL: Correct 'D7|E10|C8', got 'C11'
+970 unexpected FAIL: Correct 'E6|E5|C6', got 'L13'
+990 unexpected FAIL: Correct 'R16|R15|Q15', got 'D6'
+1000 unexpected FAIL: Correct 'F14|F15|D15|D14', got 'C10'
+1010 unexpected FAIL: Correct 'K13', got 'N14'
+1020 unexpected FAIL: Correct 'G13', got 'C13'
+1030 unexpected FAIL: Correct 'N11', got 'R13'
+1040 unexpected FAIL: Correct 'S12', got 'T13'
+1060 unexpected FAIL: Correct 'N9', got 'O6'
+1070 unexpected FAIL: Correct 'C8', got 'B3'
+./regress.sh . century2002.tst 
+140 unexpected PASS!
+240 unexpected PASS!
+./regress.sh . ninestones.tst 
+560 unexpected PASS!
+660 unexpected FAIL: Correct 'P1', got 'Q2'
+./regress.sh . gunnar.tst 
+48 unexpected PASS!
+./regress.sh . joseki.tst 
+50 unexpected FAIL: Correct 'K16', got 'F13'
+60 unexpected FAIL: Correct 'Q17', got 'P13'
+70 unexpected FAIL: Correct 'R5', got 'Q3'
+./regress.sh . seki.tst 
+206 unexpected FAIL: Correct 'A1', got 'C9'
+811 unexpected FAIL: Correct 'A1', got 'C9'
+./regress.sh . 9x9.tst 
+10 unexpected PASS!
+30 unexpected PASS!
+90 unexpected PASS!
+120 unexpected FAIL: Correct 'F1', got 'B1'
+310 unexpected PASS!
+350 unexpected PASS!
+360 unexpected FAIL: Correct 'F4|E6|D5', got 'E2'
+370 unexpected FAIL: Correct 'G7', got 'E7'
+
+========================== 3.5.3 =====================================
+
+./regress.sh . reading.tst 
+194 unexpected FAIL: Correct '0', got '1 L17'
+./regress.sh . blunder.tst 
+17 unexpected PASS!
+21 unexpected FAIL: Correct 'L9', got 'O4'
+26 unexpected PASS!
+./regress.sh . strategy.tst 
+13 unexpected FAIL: Correct 'N18', got 'L17'
+./regress.sh . rosebud.tst 
+1 unexpected PASS!
+./regress.sh . lazarus.tst 
+13 unexpected FAIL: Correct 'R13|M8|L9', got 'M12'
+./regress.sh . trevorb.tst 
+100 unexpected FAIL: Correct 'B1', got 'C4'
+./regress.sh . strategy2.tst 
+80 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1213 unexpected PASS!
+./regress.sh . nicklas4.tst 
+1103 unexpected PASS!
+./regress.sh . nngs.tst 
+220 unexpected FAIL: Correct 'L1|E7|G13|K9', got 'R4'
+320 unexpected PASS!
+380 unexpected PASS!
+1090 unexpected PASS!
+./regress.sh . trevorc.tst 
+1360 unexpected FAIL: Correct 'F12', got 'G5'
+./regress.sh . 13x13.tst 
+37 unexpected FAIL: Correct 'E10', got 'D7'
+38 unexpected PASS!
+60 unexpected PASS!
+65 unexpected PASS!
+./regress.sh . semeai.tst 
+88 unexpected FAIL: Correct '2 0 T12', got '3 0 Q17'
+90 unexpected FAIL: Correct '1 3 (Q19|S19|T18|T16)', got '1 0 S19'
+91 unexpected FAIL: Correct '2 0 Q17', got '1 1 S19'
+93 unexpected FAIL: Correct '1 3 S19', got '1 0 S19'
+97 unexpected FAIL: Correct '1 1 S19', got '1 1 T16'
+89 unexpected FAIL: Correct 'Q19|S19|T18|T16', got 'G1'
+./regress.sh . strategy4.tst 
+198 unexpected FAIL: Correct 'C10|S18', got 'F1'
+./regress.sh . owl1.tst 
+330 unexpected PASS!
+331 unexpected PASS!
+336 unexpected FAIL: Correct '1 (N2|O1)', got '0'
+./regress.sh . handtalk.tst 
+20 unexpected PASS!
+./regress.sh . nngs2.tst 
+270 unexpected PASS!
+300 unexpected PASS!
+460 unexpected PASS!
+580 unexpected PASS!
+./regress.sh . nngs3.tst 
+1110 unexpected PASS!
+./regress.sh . nngs4.tst 
+40 unexpected PASS!
+630 unexpected PASS!
+750 unexpected FAIL: Correct 'C7', got 'D5'
+./regress.sh . ninestones.tst 
+50 unexpected PASS!
+670 unexpected PASS!
+./regress.sh . tactics1.tst 
+106 unexpected PASS!
+./regress.sh . gunnar.tst 
+8 unexpected PASS!
+43 unexpected FAIL: Correct 'R18|S18', got 'Q19'
+44 unexpected FAIL: Correct 'T18', got 'T17'
+46 unexpected FAIL: Correct 'O11', got 'O9'
+47 unexpected FAIL: Correct 'F15', got 'A4'
+48 unexpected FAIL: Correct 'P11', got 'M12'
+49 unexpected FAIL: Correct 'A10', got 'M7'
+./regress.sh . arend2.tst 
+150 unexpected FAIL: Correct 'D6|C6', got 'D7'
+230 unexpected PASS!
+./regress.sh . thrash.tst 
+3 unexpected PASS!
+11 unexpected PASS!
+./regress.sh . gifu03.tst 
+205 unexpected PASS!
+302 unexpected PASS!
+./regress.sh . seki.tst 
+1001 unexpected FAIL: Correct 'B2', got 'C9'
+./regress.sh . 9x9.tst 
+10 unexpected FAIL: Correct 'E5|E6', got 'E4'
+20 unexpected FAIL: Correct '!D5', got 'D5'
+30 unexpected FAIL: Correct 'D7', got 'C6'
+40 unexpected FAIL: Correct 'D4', got 'B5'
+50 unexpected FAIL: Correct 'C7|D7|C6|G5', got 'G4'
+60 unexpected FAIL: Correct 'D4|G5', got 'D5'
+80 unexpected FAIL: Correct 'F8', got 'B5'
+90 unexpected FAIL: Correct 'E4|F5', got 'E3'
+100 unexpected FAIL: Correct 'F5', got 'H5'
+130 unexpected FAIL: Correct 'B9', got 'J8'
+140 unexpected FAIL: Correct 'D7', got 'F3'
+150 unexpected FAIL: Correct 'E6|E7', got 'E8'
+160 unexpected FAIL: Correct 'F5|F7|E7', got 'E4'
+170 unexpected FAIL: Correct 'D3|G7', got 'C3'
+180 unexpected FAIL: Correct 'E5', got 'E6'
+190 unexpected FAIL: Correct 'F5', got 'E2'
+200 unexpected FAIL: Correct 'D6|D4', got 'E4'
+210 unexpected FAIL: Correct 'F8|E9', got 'C8'
+220 unexpected FAIL: Correct 'C7|C6|D7|D6|G7|F7', got 'G6'
+230 unexpected FAIL: Correct 'D2', got 'B2'
+240 unexpected FAIL: Correct 'G9', got 'PASS'
+250 unexpected FAIL: Correct 'A2|C1|C2', got 'PASS'
+260 unexpected FAIL: Correct 'E6', got 'E3'
+270 unexpected FAIL: Correct 'B5|F7|F8', got 'J5'
+280 unexpected FAIL: Correct 'E4', got 'B5'
+290 unexpected FAIL: Correct 'D2', got 'E2'
+300 unexpected FAIL: Correct 'D2', got 'G3'
+310 unexpected FAIL: Correct 'H7|H8', got 'H2'
+320 unexpected FAIL: Correct 'E5|F4', got 'D5'
+330 unexpected FAIL: Correct 'F3', got 'G3'
+340 unexpected FAIL: Correct 'H8', got 'H4'
+350 unexpected FAIL: Correct '0', got '1 B4'
+
+========================== 3.5.3 pre 1 =====================================
+
+./regress.sh . reading.tst 
+191 unexpected FAIL: Correct '1 A3', got '0'
+./regress.sh . connection.tst 
+105 unexpected FAIL: Correct '1 G7', got '0'
+./regress.sh . blunder.tst 
+26 unexpected FAIL: Correct '!D19|F17', got 'D19'
+./regress.sh . trevora.tst 
+290 unexpected FAIL: Correct '!C8', got 'C8'
+./regress.sh . strategy.tst 
+27 unexpected FAIL: Correct 'C3', got 'H3'
+./regress.sh . ego.tst 
+10 unexpected FAIL: Correct 'S18', got 'L3'
+./regress.sh . trevorb.tst 
+510 unexpected PASS!
+./regress.sh . nicklas3.tst 
+401 unexpected PASS!
+./regress.sh . nngs.tst 
+1280 unexpected FAIL: Correct 'D13', got 'H16'
+./regress.sh . trevorc.tst 
+1000 unexpected PASS!
+1080 unexpected FAIL: Correct '!L8|K10|K9', got 'L8'
+./regress.sh . strategy3.tst 
+135 unexpected PASS!
+141 unexpected FAIL: Correct 'C7', got 'J3'
+150 unexpected PASS!
+./regress.sh . global.tst 
+16 unexpected PASS!
+./regress.sh . 13x13.tst 
+45 unexpected FAIL: Correct 'B4', got 'B3'
+./regress.sh . semeai.tst 
+51 unexpected PASS!
+61 unexpected PASS!
+62 unexpected PASS!
+65 unexpected PASS!
+66 unexpected PASS!
+68 unexpected PASS!
+./regress.sh . strategy4.tst 
+155 unexpected PASS!
+162 unexpected PASS!
+192 unexpected FAIL: Correct 'A15', got 'K3'
+./regress.sh . owl1.tst 
+327 unexpected PASS!
+./regress.sh . handtalk.tst 
+20 unexpected FAIL: Correct 'N18', got 'O16'
+./regress.sh . nngs2.tst 
+140 unexpected PASS!
+./regress.sh . nngs3.tst 
+130 unexpected PASS!
+700 unexpected FAIL: Correct 'Q2', got 'P7'
+1190 unexpected PASS!
+./regress.sh . nngs4.tst 
+160 unexpected PASS!
+410 unexpected PASS!
+420 unexpected PASS!
+./regress.sh . strategy5.tst 
+223 unexpected PASS!
+282 unexpected PASS!
+./regress.sh . safety.tst 
+3 unexpected PASS!
+./regress.sh . ninestones.tst 
+150 unexpected PASS!
+370 unexpected FAIL: Correct 'R5', got 'O4'
+630 unexpected FAIL: Correct 'F5|H7', got 'G15'
+660 unexpected PASS!
+./regress.sh . manyfaces1.tst 
+30 unexpected FAIL: Correct 'C14', got 'B10'
+./regress.sh . gunnar.tst 
+41 unexpected PASS!
+42 unexpected PASS!
+./regress.sh . arend2.tst 
+80 unexpected PASS!
+130 unexpected PASS!
+./regress.sh . nando.tst 
+26 unexpected PASS!
+./regress.sh . 13x13b.tst 
+18 unexpected PASS!
+40 unexpected PASS!
+./regress.sh . gifu03.tst 
+2 unexpected PASS!
+103 unexpected PASS!
+106 unexpected PASS!
+204 unexpected PASS!
+206 unexpected PASS!
+301 unexpected PASS!
+303 unexpected PASS!
+305 unexpected PASS!
+306 unexpected PASS!
+308 unexpected PASS!
+309 unexpected PASS!
+401 unexpected PASS!
+404 unexpected PASS!
+501 unexpected PASS!
+502 unexpected PASS!
+505 unexpected PASS!
+507 unexpected PASS!
+601 unexpected PASS!
+603 unexpected PASS!
+604 unexpected PASS!
+701 unexpected PASS!
+./regress.sh . seki.tst 
+7 unexpected FAIL: Correct 'B2', got 'C9'
+501 unexpected FAIL: Correct 'B1', got 'C9'
+502 unexpected FAIL: Correct 'C1', got 'C9'
+905 unexpected FAIL: Correct 'C1', got 'C9'
+907 unexpected FAIL: Correct 'A3', got 'C9'
+909 unexpected FAIL: Correct 'A3', got 'C9'
+1002 unexpected FAIL: Correct 'B2', got 'A2'
+1101 unexpected FAIL: Correct 'D1', got 'C9'
+1102 unexpected FAIL: Correct 'C1|C2|D2', got 'C9'
+1104 unexpected FAIL: Correct 'B1', got 'C9'
+1106 unexpected FAIL: Correct 'C1', got 'C9'
+
+========================== 3.5.2 =====================================
+
+./regress.sh . owl.tst 
+132 unexpected PASS!
+133 unexpected PASS!
+./regress.sh . trevora.tst 
+130 unexpected PASS!
+150 unexpected PASS!
+200 unexpected PASS!
+370 unexpected FAIL: Correct 'F6', got 'D9'
+570 unexpected PASS!
+./regress.sh . nngs1.tst 
+16 unexpected PASS!
+30 unexpected PASS!
+31 unexpected PASS!
+37 unexpected PASS!
+43 unexpected PASS!
+46 unexpected PASS!
+47 unexpected PASS!
+48 unexpected FAIL: Correct 'R16', got 'F15'
+50 unexpected PASS!
+52 unexpected PASS!
+./regress.sh . strategy.tst 
+6 unexpected FAIL: Correct 'E10', got 'J13'
+14 unexpected PASS!
+20 unexpected PASS!
+22 unexpected PASS!
+34 unexpected PASS!
+./regress.sh . endgame.tst 
+820 unexpected FAIL: Correct 'H4|M10|K19', got 'P6'
+./regress.sh . neurogo.tst 
+1 unexpected PASS!
+2 unexpected PASS!
+./regress.sh . rosebud.tst 
+1 unexpected FAIL: Correct 'E16', got 'C18'
+./regress.sh . viking.tst 
+1 unexpected PASS!
+./regress.sh . ego.tst 
+1 unexpected PASS!
+./regress.sh . dniwog.tst 
+1 unexpected PASS!
+./regress.sh . lazarus.tst 
+2 unexpected PASS!
+3 unexpected PASS!
+13 unexpected PASS!
+./regress.sh . trevorb.tst 
+180 unexpected PASS!
+220 unexpected PASS!
+230 unexpected PASS!
+250 unexpected PASS!
+340 unexpected PASS!
+./regress.sh . strategy2.tst 
+53 unexpected FAIL: Correct 'S15', got 'E10'
+64 unexpected PASS!
+70 unexpected FAIL: Correct 'M15|J15|N16|J16', got 'C15'
+83 unexpected PASS!
+91 unexpected PASS!
+./regress.sh . nicklas2.tst 
+601 unexpected PASS!
+./regress.sh . nicklas4.tst 
+1201 unexpected PASS!
+./regress.sh . nicklas5.tst 
+804 unexpected FAIL: Correct 'D6', got 'H6'
+1202 unexpected PASS!
+./regress.sh . manyfaces.tst 
+5 unexpected PASS!
+7 unexpected PASS!
+./regress.sh . niki.tst 
+1 unexpected PASS!
+./regress.sh . trevor.tst 
+412 unexpected PASS!
+./regress.sh . nngs.tst 
+190 unexpected FAIL: Correct 'O11|P12', got 'M13'
+280 unexpected FAIL: Correct 'E10', got 'M7'
+680 unexpected PASS!
+700 unexpected PASS!
+900 unexpected PASS!
+960 unexpected PASS!
+1020 unexpected PASS!
+1050 unexpected FAIL: Correct 'J10|H10|G10|F10', got 'H11'
+1280 unexpected PASS!
+1300 unexpected FAIL: Correct 'M2', got 'T4'
+1310 unexpected PASS!
+1420 unexpected PASS!
+1480 unexpected PASS!
+1500 unexpected PASS!
+1580 unexpected PASS!
+1760 unexpected PASS!
+1860 unexpected PASS!
+1955 unexpected PASS!
+2020 unexpected FAIL: Correct 'L2|H6|H7|J6|J7', got 'H14'
+./regress.sh . trevorc.tst 
+280 unexpected PASS!
+450 unexpected PASS!
+560 unexpected FAIL: Correct 'K2|M1', got 'E12'
+1080 unexpected PASS!
+1510 unexpected PASS!
+./regress.sh . strategy3.tst 
+104 unexpected PASS!
+111 unexpected FAIL: Correct 'K3', got 'Q8'
+119 unexpected FAIL: Correct 'D9|J3', got 'B13'
+120 unexpected PASS!
+136 unexpected PASS!
+137 unexpected FAIL: Correct 'F5', got 'Q18'
+./regress.sh . global.tst 
+17 unexpected PASS!
+25 unexpected FAIL: Correct 'D12', got 'C12'
+34 unexpected PASS!
+./regress.sh . arend.tst 
+15 unexpected FAIL: Correct 'F3', got 'L14'
+28 unexpected PASS!
+35 unexpected PASS!
+38 unexpected PASS!
+./regress.sh . 13x13.tst 
+7 unexpected FAIL: Correct 'L7|M7|M6', got 'M1'
+28 unexpected FAIL: Correct 'L10', got 'E3'
+29 unexpected PASS!
+31 unexpected PASS!
+37 unexpected PASS!
+48 unexpected PASS!
+52 unexpected FAIL: Correct 'H10', got 'N9'
+55 unexpected FAIL: Correct 'F5', got 'H6'
+76 unexpected PASS!
+85 unexpected PASS!
+./regress.sh . trevord.tst 
+490 unexpected PASS!
+500 unexpected PASS!
+520 unexpected PASS!
+670 unexpected PASS!
+860 unexpected PASS!
+870 unexpected PASS!
+1100 unexpected PASS!
+./regress.sh . strategy4.tst 
+153 unexpected PASS!
+177 unexpected PASS!
+194 unexpected FAIL: Correct 'A13', got 'D6'
+./regress.sh . handtalk.tst 
+2 unexpected FAIL: Correct 'P5|Q2|R2', got 'O4'
+7 unexpected PASS!
+8 unexpected PASS!
+10 unexpected PASS!
+./regress.sh . nngs2.tst 
+10 unexpected PASS!
+110 unexpected PASS!
+120 unexpected PASS!
+400 unexpected PASS!
+./regress.sh . nngs3.tst 
+100 unexpected PASS!
+140 unexpected PASS!
+230 unexpected FAIL: Correct '!L12', got 'L12'
+290 unexpected PASS!
+300 unexpected PASS!
+320 unexpected PASS!
+330 unexpected PASS!
+460 unexpected PASS!
+490 unexpected PASS!
+790 unexpected FAIL: Correct 'D5', got 'B18'
+880 unexpected PASS!
+1080 unexpected FAIL: Correct '!H7', got 'H7'
+./regress.sh . nngs4.tst 
+10 unexpected PASS!
+20 unexpected PASS!
+50 unexpected PASS!
+250 unexpected FAIL: Correct 'F7', got 'G9'
+420 unexpected FAIL: Correct 'G6', got 'F4'
+560 unexpected FAIL: Correct 'B13', got 'F7'
+650 unexpected FAIL: Correct 'Q2', got 'G12'
+660 unexpected PASS!
+./regress.sh . strategy5.tst 
+222 unexpected FAIL: Correct 'R14', got 'O16'
+223 unexpected FAIL: Correct 'P16', got 'S4'
+225 unexpected PASS!
+229 unexpected PASS!
+230 unexpected PASS!
+232 unexpected PASS!
+234 unexpected PASS!
+./regress.sh . century2002.tst 
+40 unexpected PASS!
+60 unexpected PASS!
+120 unexpected PASS!
+130 unexpected PASS!
+200 unexpected PASS!
+./regress.sh . auto01.tst 
+6 unexpected PASS!
+./regress.sh . auto02.tst 
+10 unexpected PASS!
+./regress.sh . safety.tst 
+1 unexpected PASS!
+7 unexpected PASS!
+./regress.sh . ninestones.tst 
+10 unexpected PASS!
+300 unexpected PASS!
+320 unexpected PASS!
+590 unexpected PASS!
+630 unexpected PASS!
+./regress.sh . tactics1.tst 
+107 unexpected PASS!
+./regress.sh . manyfaces1.tst 
+10 unexpected PASS!
+./regress.sh . gunnar.tst 
+2 unexpected PASS!
+10 unexpected FAIL: Correct 'R12|R14', got 'D11'
+13 unexpected PASS!
+39 unexpected PASS!
+./regress.sh . arend2.tst 
+70 unexpected FAIL: Correct 'N7|O9', got 'N16'
+80 unexpected FAIL: Correct 'L2', got 'N2'
+130 unexpected FAIL: Correct 'P17', got 'G16'
+160 unexpected PASS!
+./regress.sh . nando.tst 
+27 unexpected FAIL: Correct 'D6', got 'G5'
+210 unexpected PASS!
+./regress.sh . 13x13b.tst 
+11 unexpected PASS!
+28 unexpected PASS!
+43 unexpected FAIL: Correct 'J3', got 'J1'
+./regress.sh . joseki.tst 
+10 unexpected PASS!
+./regress.sh . gifu03.tst 
+205 unexpected FAIL: Correct 'P5', got 'N6'
+301 unexpected FAIL: Correct 'E2', got 'G8'
+303 unexpected FAIL: Correct 'P18', got 'Q18'
+501 unexpected FAIL: Correct 'Q14', got 'P14'
+604 unexpected FAIL: Correct 'C8|F12|E12|G13|O7|P7|P6', got 'D2'
+
+========================== 3.5.2 pre 2 =====================================
+
+./regress.sh . trevora.tst 
+470 unexpected PASS!
+./regress.sh . strategy2.tst 
+70 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1213 unexpected FAIL: Correct 'N4', got 'F12'
+./regress.sh . nicklas5.tst 
+804 unexpected PASS!
+./regress.sh . trevord.tst 
+170 unexpected PASS!
+./regress.sh . owl1.tst 
+293 unexpected FAIL: Correct '0', got '1 R5'
+333 unexpected FAIL: Correct '0', got '1 D18'
+./regress.sh . nngs2.tst 
+140 unexpected FAIL: Correct 'P5', got 'Q6'
+180 unexpected PASS!
+./regress.sh . manyfaces1.tst 
+30 unexpected PASS!
+./regress.sh . gunnar.tst 
+41 unexpected FAIL: Correct 'D13', got 'E16'
+42 unexpected FAIL: Correct 'B19', got 'PASS'
+./regress.sh . thrash.tst 
+7 unexpected FAIL: Correct 'D14', got 'C13'
+8 unexpected FAIL: Correct 'H10', got 'N4'
+./regress.sh . 13x13b.tst 
+8 unexpected PASS!
+./regress.sh . gifu03.tst 
+1 unexpected FAIL: Correct 'O19|M17|K18|N19|P14|Q14|R13|N14', got 'B5'
+2 unexpected FAIL: Correct 'R1', got 'PASS'
+101 unexpected FAIL: Correct 'O15', got 'S13'
+102 unexpected FAIL: Correct 'R11', got 'G3'
+103 unexpected FAIL: Correct 'F17', got 'F18'
+104 unexpected FAIL: Correct 'P2', got 'S10'
+105 unexpected FAIL: Correct '!G18', got 'G18'
+106 unexpected FAIL: Correct 'H1', got 'P12'
+107 unexpected FAIL: Correct 'N9|P9', got 'F5'
+201 unexpected FAIL: Correct 'C15', got 'P8'
+202 unexpected FAIL: Correct 'H7', got 'P16'
+203 unexpected FAIL: Correct 'O18', got 'R19'
+204 unexpected FAIL: Correct 'J19', got 'G18'
+206 unexpected FAIL: Correct 'C13', got 'D13'
+302 unexpected FAIL: Correct 'C1', got 'M3'
+304 unexpected FAIL: Correct 'J7', got 'G7'
+305 unexpected FAIL: Correct '!E1', got 'E1'
+306 unexpected FAIL: Correct 'B14', got 'B15'
+307 unexpected FAIL: Correct 'P9|O8|N9', got 'H8'
+308 unexpected FAIL: Correct 'L3', got 'N6'
+309 unexpected FAIL: Correct 'J1', got 'K1'
+310 unexpected FAIL: Correct 'A3', got 'K19'
+401 unexpected FAIL: Correct 'R15|O17|K16', got 'F4'
+402 unexpected FAIL: Correct 'O17', got 'H17'
+403 unexpected FAIL: Correct 'R13', got 'S17'
+404 unexpected FAIL: Correct 'S12', got 'S10'
+502 unexpected FAIL: Correct 'R9|L10|K12', got 'Q9'
+503 unexpected FAIL: Correct 'R10', got 'R9'
+504 unexpected FAIL: Correct 'L11|L10', got 'H5'
+505 unexpected FAIL: Correct 'E8', got 'D7'
+506 unexpected FAIL: Correct 'G2', got 'F6'
+507 unexpected FAIL: Correct 'G13', got 'R1'
+601 unexpected FAIL: Correct 'R12|O16', got 'Q14'
+602 unexpected FAIL: Correct 'O5', got 'E13'
+603 unexpected FAIL: Correct 'B16', got 'O6'
+605 unexpected FAIL: Correct 'O13|O14', got 'P12'
+606 unexpected FAIL: Correct 'O11', got 'Q10'
+607 unexpected FAIL: Correct 'D7', got 'T14'
+701 unexpected FAIL: Correct '!O19', got 'O19'
+702 unexpected FAIL: Correct 'N6', got 'M6'
+704 unexpected FAIL: Correct 'D3|C2', got 'J18'
+
+========================== 3.5.2 pre 1 =====================================
+
+./regress.sh . connection.tst 
+109 unexpected FAIL: Correct '0', got '1'
+./regress.sh . strategy3.tst 
+114 unexpected PASS!
+./regress.sh . owl1.tst 
+327 unexpected FAIL: Correct '1 (O19|P19|Q19|Q17|N19)', got '0'
+329 unexpected FAIL: Correct '1 T4', got '0'
+330 unexpected FAIL: Correct '1 R1', got '0'
+331 unexpected FAIL: Correct '1 (R1|S1|T2)', got '1 PASS'
+./regress.sh . nngs3.tst 
+390 unexpected PASS!
+./regress.sh . nngs4.tst 
+510 unexpected PASS!
+./regress.sh . ninestones.tst 
+650 unexpected FAIL: Correct 'Q5', got 'N11'
+660 unexpected FAIL: Correct 'P1', got 'Q2'
+670 unexpected FAIL: Correct 'H7', got 'J16'
+./regress.sh . gunnar.tst 
+37 unexpected FAIL: Correct 'Q15', got 'S8'
+38 unexpected FAIL: Correct 'M7|N1', got 'B3'
+39 unexpected FAIL: Correct 'N4', got 'R1'
+./regress.sh . nando.tst 
+211 unexpected PASS!
+212 unexpected PASS!
+
+========================== 3.5.1 =====================================
+
+This huge and mostly negative regression data is caused by
+making the cosmic patch standard.
+
+./regress.sh . owl.tst 
+132 unexpected FAIL: Correct '(1|2) R4', got '1 R1'
+133 unexpected FAIL: Correct '1 M3', got '0'
+./regress.sh . trevora.tst 
+130 unexpected FAIL: Correct 'F4', got 'B7'
+150 unexpected FAIL: Correct 'F6', got 'E8'
+200 unexpected FAIL: Correct 'E5', got 'F7'
+370 unexpected PASS!
+570 unexpected FAIL: Correct '!B5', got 'B5'
+./regress.sh . nngs1.tst 
+16 unexpected FAIL: Correct 'M4', got 'Q14'
+17 unexpected FAIL: Correct 'L3|L4|J3', got 'K16'
+30 unexpected FAIL: Correct 'P17|O18', got 'Q10'
+31 unexpected FAIL: Correct 'N17', got 'K3'
+37 unexpected FAIL: Correct 'H8|K14|L15|L14', got 'G8'
+39 unexpected FAIL: Correct 'R7', got 'S3'
+43 unexpected FAIL: Correct 'C18', got 'D10'
+46 unexpected FAIL: Correct '!J5', got 'J5'
+47 unexpected FAIL: Correct 'G15|F15|G16', got 'Q13'
+48 unexpected PASS!
+50 unexpected FAIL: Correct 'O10', got 'C3'
+52 unexpected FAIL: Correct 'L5', got 'K5'
+./regress.sh . strategy.tst 
+6 unexpected PASS!
+14 unexpected FAIL: Correct 'E9', got 'O14'
+20 unexpected FAIL: Correct 'Q11', got 'C11'
+22 unexpected FAIL: Correct 'K3', got 'K12'
+34 unexpected FAIL: Correct 'E17', got 'R6'
+./regress.sh . endgame.tst 
+820 unexpected PASS!
+./regress.sh . neurogo.tst 
+1 unexpected FAIL: Correct 'Q3', got 'F4'
+2 unexpected FAIL: Correct 'R3', got 'F4'
+./regress.sh . rosebud.tst 
+1 unexpected PASS!
+./regress.sh . viking.tst 
+1 unexpected FAIL: Correct 'O15', got 'C8'
+3 unexpected FAIL: Correct 'M15|B7', got 'G3'
+./regress.sh . ego.tst 
+1 unexpected FAIL: Correct 'K4|K3', got 'C10'
+./regress.sh . dniwog.tst 
+1 unexpected FAIL: Correct 'D15', got 'P16'
+./regress.sh . lazarus.tst 
+2 unexpected FAIL: Correct 'M4', got 'F18'
+3 unexpected FAIL: Correct 'Q8|P8', got 'M7'
+13 unexpected FAIL: Correct 'R13|M8|L9', got 'N12'
+./regress.sh . trevorb.tst 
+180 unexpected FAIL: Correct 'L12', got 'H3'
+220 unexpected FAIL: Correct 'J3', got 'G1'
+230 unexpected FAIL: Correct 'L5', got 'L7'
+250 unexpected FAIL: Correct 'C2', got 'H11'
+340 unexpected FAIL: Correct 'M11', got 'C6'
+./regress.sh . strategy2.tst 
+51 unexpected FAIL: Correct 'P3', got 'N5'
+53 unexpected PASS!
+64 unexpected FAIL: Correct 'B13|C13|C12|E14|D14', got 'P12'
+83 unexpected FAIL: Correct 'P14', got 'H17'
+90 unexpected FAIL: Correct 'B14|D17', got 'G12'
+91 unexpected FAIL: Correct 'B14|G13', got 'Q12'
+./regress.sh . nicklas2.tst 
+601 unexpected FAIL: Correct 'D8|C8|D6|D4|E6', got 'G9'
+./regress.sh . nicklas4.tst 
+1201 unexpected FAIL: Correct 'Q9', got 'S7'
+./regress.sh . nicklas5.tst 
+1202 unexpected FAIL: Correct '!L17', got 'L17'
+./regress.sh . manyfaces.tst 
+5 unexpected FAIL: Correct 'M5|M15|R3|R17', got 'J17'
+7 unexpected FAIL: Correct 'R2|S7', got 'N12'
+./regress.sh . niki.tst 
+1 unexpected FAIL: Correct 'E17', got 'O17'
+./regress.sh . trevor.tst 
+412 unexpected FAIL: Correct 'C4', got 'B3'
+./regress.sh . nngs.tst 
+190 unexpected PASS!
+280 unexpected PASS!
+680 unexpected FAIL: Correct '!H13|R13', got 'H13'
+700 unexpected FAIL: Correct 'K17', got 'O8'
+900 unexpected FAIL: Correct 'Q15', got 'O3'
+960 unexpected FAIL: Correct 'R16|R17|S16', got 'H17'
+1020 unexpected FAIL: Correct 'Q2', got 'J14'
+1050 unexpected PASS!
+1280 unexpected FAIL: Correct 'D13', got 'H16'
+1300 unexpected PASS!
+1310 unexpected FAIL: Correct 'Q15|Q14', got 'K4'
+1420 unexpected FAIL: Correct 'D12', got 'L6'
+1480 unexpected FAIL: Correct 'B1', got 'K9'
+1500 unexpected FAIL: Correct 'R16', got 'K16'
+1760 unexpected FAIL: Correct 'N7', got 'O7'
+1860 unexpected FAIL: Correct '!L7|D19', got 'D19'
+1955 unexpected FAIL: Correct 'D3', got 'F5'
+2020 unexpected PASS!
+./regress.sh . trevorc.tst 
+280 unexpected FAIL: Correct '!N13', got 'N13'
+450 unexpected FAIL: Correct 'K5', got 'J10'
+560 unexpected PASS!
+1080 unexpected FAIL: Correct '!L8|K10|K9', got 'K10'
+1510 unexpected FAIL: Correct 'L5', got 'M1'
+./regress.sh . strategy3.tst 
+104 unexpected FAIL: Correct 'P4', got 'P16'
+111 unexpected PASS!
+119 unexpected PASS!
+120 unexpected FAIL: Correct 'C7', got 'B7'
+136 unexpected FAIL: Correct 'E2', got 'B3'
+137 unexpected PASS!
+./regress.sh . global.tst 
+17 unexpected FAIL: Correct 'P9', got 'R11'
+25 unexpected PASS!
+34 unexpected FAIL: Correct 'N6', got 'F3'
+./regress.sh . arend.tst 
+15 unexpected PASS!
+28 unexpected FAIL: Correct 'C16', got 'Q6'
+35 unexpected FAIL: Correct 'H17|J19', got 'F15'
+38 unexpected FAIL: Correct 'O5', got 'Q13'
+./regress.sh . 13x13.tst 
+7 unexpected PASS!
+28 unexpected PASS!
+29 unexpected FAIL: Correct 'C8', got 'E2'
+31 unexpected FAIL: Correct 'M4|N4', got 'N5'
+37 unexpected FAIL: Correct 'E10', got 'E3'
+48 unexpected FAIL: Correct 'K7', got 'J5'
+52 unexpected PASS!
+55 unexpected PASS!
+76 unexpected FAIL: Correct 'K6|L6|J3', got 'E6'
+85 unexpected FAIL: Correct 'D2', got 'B10'
+./regress.sh . trevord.tst 
+490 unexpected FAIL: Correct 'D5', got 'G4'
+500 unexpected FAIL: Correct 'E3', got 'L7'
+520 unexpected FAIL: Correct 'D15', got 'Q7'
+670 unexpected FAIL: Correct 'O11', got 'P9'
+860 unexpected FAIL: Correct 'Q5', got 'N4'
+870 unexpected FAIL: Correct 'R6', got 'N4'
+1100 unexpected FAIL: Correct 'N5', got 'S15'
+./regress.sh . strategy4.tst 
+153 unexpected FAIL: Correct 'Q9', got 'O11'
+177 unexpected FAIL: Correct 'E2', got 'G6'
+194 unexpected PASS!
+./regress.sh . handtalk.tst 
+2 unexpected PASS!
+7 unexpected FAIL: Correct 'R4', got 'N8'
+8 unexpected FAIL: Correct '!G14', got 'G14'
+10 unexpected FAIL: Correct 'E9|F8', got 'L5'
+./regress.sh . nngs2.tst 
+10 unexpected FAIL: Correct '!H6', got 'H6'
+110 unexpected FAIL: Correct 'B14|B13', got 'L18'
+120 unexpected FAIL: Correct 'E12|D13', got 'O16'
+150 unexpected FAIL: Correct 'M3|L3', got 'J18'
+400 unexpected FAIL: Correct 'D10', got 'B8'
+./regress.sh . nngs3.tst 
+100 unexpected FAIL: Correct 'Q13|P13|Q12|P12|P11|P8|P9', got 'C14'
+140 unexpected FAIL: Correct 'D9', got 'G9'
+230 unexpected PASS!
+290 unexpected FAIL: Correct 'H5|J5|L5|M5|N5', got 'F17'
+300 unexpected FAIL: Correct 'E6|D5', got 'F13'
+320 unexpected FAIL: Correct 'F4', got 'F10'
+330 unexpected FAIL: Correct 'P12|Q11', got 'C2'
+390 unexpected FAIL: Correct 'O11', got 'L11'
+460 unexpected FAIL: Correct 'N17|M17|Q17|Q18', got 'C12'
+490 unexpected FAIL: Correct 'P15', got 'P9'
+790 unexpected PASS!
+800 unexpected PASS!
+880 unexpected FAIL: Correct 'Q3', got 'N3'
+1080 unexpected PASS!
+./regress.sh . nngs4.tst 
+10 unexpected FAIL: Correct 'E18', got 'R5'
+20 unexpected FAIL: Correct 'Q4|Q6', got 'F18'
+250 unexpected PASS!
+420 unexpected PASS!
+560 unexpected PASS!
+650 unexpected PASS!
+./regress.sh . strategy5.tst 
+222 unexpected PASS!
+223 unexpected PASS!
+225 unexpected FAIL: Correct 'O12', got 'L4'
+229 unexpected FAIL: Correct 'D7', got 'N11'
+230 unexpected FAIL: Correct 'H9', got 'J12'
+232 unexpected FAIL: Correct 'D11|E11', got 'Q10'
+234 unexpected FAIL: Correct 'H14', got 'Q10'
+./regress.sh . century2002.tst 
+40 unexpected FAIL: Correct 'J3', got 'G14'
+60 unexpected FAIL: Correct 'Q14', got 'R18'
+120 unexpected FAIL: Correct 'L3', got 'O9'
+130 unexpected FAIL: Correct 'N4', got 'N10'
+200 unexpected FAIL: Correct 'F6', got 'G6'
+./regress.sh . auto01.tst 
+6 unexpected FAIL: Correct '!0', got '0'
+./regress.sh . auto02.tst 
+10 unexpected FAIL: Correct '!0', got '0'
+./regress.sh . safety.tst 
+1 unexpected FAIL: Correct 'R6|S2', got 'O14'
+7 unexpected FAIL: Correct 'L5|L6|K6|M5|M3|K7|K6', got 'M9'
+./regress.sh . ninestones.tst 
+10 unexpected FAIL: Correct 'C5', got 'N10'
+300 unexpected FAIL: Correct 'P16', got 'C6'
+320 unexpected FAIL: Correct 'D5', got 'G4'
+590 unexpected FAIL: Correct 'P4', got 'E6'
+630 unexpected FAIL: Correct 'F5|H7', got 'H6'
+./regress.sh . tactics1.tst 
+107 unexpected FAIL: Correct 'B13|B14', got 'O12'
+./regress.sh . manyfaces1.tst 
+10 unexpected FAIL: Correct 'C17|H15|D9', got 'C5'
+30 unexpected FAIL: Correct 'C14', got 'B10'
+./regress.sh . gunnar.tst 
+2 unexpected FAIL: Correct 'E17|E18', got 'D19'
+10 unexpected PASS!
+13 unexpected FAIL: Correct 'Q5|Q12', got 'T11'
+./regress.sh . arend2.tst 
+70 unexpected PASS!
+80 unexpected PASS!
+130 unexpected PASS!
+./regress.sh . nando.tst 
+27 unexpected PASS!
+./regress.sh . 13x13b.tst 
+11 unexpected FAIL: Correct 'L6', got 'M13'
+28 unexpected FAIL: Correct '!H9', got 'H9'
+43 unexpected PASS!
+./regress.sh . joseki.tst 
+10 unexpected FAIL: Correct 'E16', got 'D13'
+
+========================== 3.5.1 pre 3 =====================================
+
+./regress.sh . reading.tst
+188 unexpected FAIL: Correct '1 A2', got '0'
+./regress.sh . connection.tst 
+108 unexpected FAIL: Correct '0', got '1'
+./regress.sh . endgame.tst 
+870 unexpected PASS!
+880 unexpected PASS!
+900 unexpected FAIL: Correct 'J19|K19|K18', got 'D16'
+./regress.sh . nicklas1.tst 
+1213 unexpected PASS!
+./regress.sh . nicklas5.tst 
+1211 unexpected PASS!
+./regress.sh . nngs.tst 
+820 unexpected PASS!
+./regress.sh . strategy4.tst 
+162 unexpected FAIL: Correct 'O7|Q7|N7', got 'M8'
+./regress.sh . owl1.tst 
+320 unexpected PASS!
+325 unexpected FAIL: Correct '1 (S18|T15)', got '1 T18'
+326 unexpected FAIL: Correct '3 S18', got '0'
+./regress.sh . nngs4.tst 
+210 unexpected PASS!
+./regress.sh . strategy5.tst 
+282 unexpected FAIL: Correct 'O13', got 'M14'
+
+========================== 3.5.1 pre 2 =====================================
+
+./regress.sh . ld_owl.tst 
+21 unexpected PASS!
+22 unexpected PASS!
+23 unexpected PASS!
+179 unexpected PASS!
+182 unexpected PASS!
+201 unexpected PASS!
+301 unexpected PASS!
+./regress.sh . atari_atari.tst 
+21 unexpected PASS!
+./regress.sh . blunder.tst 
+17 unexpected FAIL: Correct 'R7', got 'T7'
+32 unexpected FAIL: Correct 'E3|H4', got 'H2'
+./regress.sh . strategy.tst 
+26 unexpected FAIL: Correct 'D3', got 'G3'
+34 unexpected PASS!
+./regress.sh . endgame.tst 
+870 unexpected FAIL: Correct 'H1', got 'N7'
+880 unexpected FAIL: Correct 'K5', got 'H5'
+./regress.sh . viking.tst 
+2 unexpected FAIL: Correct 'E2', got 'C4'
+./regress.sh . lazarus.tst 
+16 unexpected FAIL: Correct 'L16', got 'L17'
+./regress.sh . trevorc.tst 
+240 unexpected PASS!
+1440 unexpected PASS!
+./regress.sh . global.tst 
+41 unexpected PASS!
+./regress.sh . vie.tst 
+41 unexpected PASS!
+./regress.sh . semeai.tst 
+61 unexpected FAIL: Correct '1 0 A15', got '1 0 B17'
+62 unexpected FAIL: Correct '1 1 A17', got '1 0 A17'
+65 unexpected FAIL: Correct '0 0 PASS', got '1 0 PASS'
+66 unexpected FAIL: Correct '1 1 (PASS|N13)', got '1 0 PASS'
+68 unexpected FAIL: Correct '1 1 (PASS|A5|B5|C3|D3)', got '1 0 A5'
+75 unexpected FAIL: Correct '1 0 PASS', got '1 1 PASS'
+76 unexpected FAIL: Correct '1 0 (PASS|N3|K2)', got '0 0 PASS'
+77 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+78 unexpected FAIL: Correct '1 0 (PASS|A6|C6|C1)', got '0 0 PASS'
+79 unexpected FAIL: Correct '1 0 PASS', got '0 0 PASS'
+80 unexpected FAIL: Correct '1 0 (PASS|E9|E8|J9|H5)', got '0 0 PASS'
+./regress.sh . strategy4.tst 
+192 unexpected PASS!
+200 unexpected FAIL: Correct 'P6|P7|Q7|S18', got 'S8'
+./regress.sh . owl1.tst 
+293 unexpected PASS!
+320 unexpected FAIL: Correct '0', got '1 R1'
+321 unexpected FAIL: Correct '0', got '1 F2'
+322 unexpected FAIL: Correct '0', got '1 D1'
+323 unexpected FAIL: Correct '0', got '1 H1'
+324 unexpected FAIL: Correct '0', got '1 E6'
+./regress.sh . handtalk.tst 
+10 unexpected PASS!
+./regress.sh . nngs2.tst 
+140 unexpected PASS!
+./regress.sh . nngs3.tst 
+740 unexpected PASS!
+./regress.sh . nngs4.tst 
+740 unexpected PASS!
+./regress.sh . strategy5.tst 
+280 unexpected FAIL: Correct 'P3', got 'D10'
+281 unexpected FAIL: Correct 'E13', got 'D2'
+./regress.sh . century2002.tst 
+80 unexpected PASS!
+110 unexpected FAIL: Correct 'C8', got 'M2'
+260 unexpected PASS!
+./regress.sh . arend2.tst 
+150 unexpected PASS!
+./regress.sh . nando.tst 
+12 unexpected FAIL: Correct '0', got '2 J12'
+./regress.sh . joseki.tst 
+40 unexpected FAIL: Correct 'Q15', got 'R13'
+
+========================== 3.5.1 pre 1 =====================================
+
+./regress.sh . ld_owl.tst 
+21 unexpected FAIL: Correct 'critical (A14|A17|B19) A17', got 'critical B19 A14'
+22 unexpected FAIL: Correct 'critical T18 (T18|R18|R19|Q19)', got 'alive'
+23 unexpected FAIL: Correct 'dead', got 'critical T1 R2'
+179 unexpected FAIL: Correct '3 T17', got '0'
+182 unexpected FAIL: Correct '2 S1', got '1 S1'
+201 unexpected FAIL: Correct '3 T15', got '0'
+301 unexpected FAIL: Correct '3 B18', got '0'
+./regress.sh . optics.tst 
+1201 unexpected FAIL: Correct '1 2 T8 T8', got '0 0'
+./regress.sh . atari_atari.tst 
+24 unexpected FAIL: Correct '!.*(K16|A12|R12|S12|T12|A11|B11|C11|R11|S11|T11|A10|C10|Q10|S10|D9).*', got 'K16 J13 A12 H12 J12 R12 S12 T12 A11 B11 C11 G11 H11 Q11 R11 S11 T11 A10 B10 C10 F10 G10 Q10 S10 B9 C9 D9 E9 F9 D8 E8'
+./regress.sh . trevorb.tst 
+120 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1406 unexpected PASS!
+./regress.sh . global.tst 
+44 unexpected FAIL: Correct 'D5', got 'G7'
+./regress.sh . 13x13.tst 
+31 unexpected PASS!
+53 unexpected PASS!
+./regress.sh . semeai.tst 
+58 unexpected FAIL: Correct '0 0 PASS', got '1 1 J4'
+59 unexpected FAIL: Correct '1 1 J4', got '0 0 PASS'
+./regress.sh . nngs2.tst 
+1 unexpected FAIL: Correct 'B1|A2', got 'A4'
+./regress.sh . nngs3.tst 
+390 unexpected PASS!
+./regress.sh . nngs4.tst 
+210 unexpected FAIL: Correct '!S5', got 'S5'
+660 unexpected FAIL: Correct 'O16', got 'R6'
+670 unexpected FAIL: Correct 'O14', got 'S18'
+680 unexpected FAIL: Correct 'P9', got 'P6'
+690 unexpected FAIL: Correct 'N6', got 'Q3'
+700 unexpected FAIL: Correct 'K7', got 'L3'
+710 unexpected FAIL: Correct 'J3|H7|G5|H3|G6', got 'C5'
+720 unexpected FAIL: Correct 'B15|B16|B17', got 'H11'
+730 unexpected FAIL: Correct 'C17', got 'D17'
+740 unexpected FAIL: Correct 'D2', got 'T1'
+./regress.sh . century2002.tst 
+60 unexpected PASS!
+./regress.sh . safety.tst 
+5 unexpected FAIL: Correct 'K8|L9|L7', got 'H16'
+./regress.sh . nando.tst 
+12 unexpected PASS!
+
+========================== 3.3.23 pre 2 =====================================
+
+./regress.sh . ld_owl.tst 
+314 unexpected FAIL: Correct '1 P18', got '1 Q18'
+315 unexpected FAIL: Correct '1 P18', got '0'
+316 unexpected FAIL: Correct '1 T16', got '1 P19'
+406 unexpected FAIL: Correct '1 R3', got '2 R3'
+407 unexpected FAIL: Correct '0', got '3 S3'
+408 unexpected FAIL: Correct '1 T3', got '2 T3'
+409 unexpected FAIL: Correct '0', got '3 R1'
+410 unexpected FAIL: Correct '1 T2', got '2 R3'
+411 unexpected FAIL: Correct '0', got '1 T4'
+412 unexpected FAIL: Correct '1 (R3|T2)', got '0'
+413 unexpected FAIL: Correct '0', got '1 T3'
+414 unexpected FAIL: Correct '1 S2', got '0'
+./regress.sh . owl1.tst 
+319 unexpected FAIL: Correct '1 S6', got '0'
+./regress.sh . nngs4.tst 
+640 unexpected FAIL: Correct '!R7', got 'R7'
+650 unexpected FAIL: Correct 'Q2', got 'G12'
+./regress.sh . joseki.tst 
+20 unexpected FAIL: Correct 'B4', got 'E6'
+30 unexpected FAIL: Correct 'F13', got 'F16'
+
+========================== 3.3.23 pre 1 =====================================
+
+./regress.sh . owl.tst 
+80 unexpected PASS!
+./regress.sh . lazarus.tst 
+16 unexpected PASS!
+./regress.sh . handtalk.tst 
+10 unexpected FAIL: Correct 'E9|F8', got 'C11'
+./regress.sh . nngs3.tst 
+1000 unexpected PASS!
+./regress.sh . nngs4.tst 
+470 unexpected PASS!
+./regress.sh . nando.tst 
+11 unexpected PASS!
+
+========================== 3.3.22 pre 2 =====================================
+
+./regress.sh . owl.tst 
+150 unexpected PASS!
+./regress.sh . trevora.tst 
+370 unexpected FAIL: Correct 'F6', got 'D9'
+./regress.sh . trevorb.tst 
+510 unexpected FAIL: Correct 'C6|B6', got 'A7'
+./regress.sh . strategy2.tst 
+90 unexpected PASS!
+./regress.sh . nicklas1.tst 
+203 unexpected PASS!
+./regress.sh . trevorc.tst 
+240 unexpected FAIL: Correct 'K2', got 'K3'
+./regress.sh . nngs3.tst 
+230 unexpected FAIL: Correct '!L12', got 'L12'
+./regress.sh . ninestones.tst 
+630 unexpected PASS!
+./regress.sh . manyfaces1.tst 
+30 unexpected PASS!
+
+========================== 3.3.22 pre 1 =====================================
+
+./regress.sh . reading.tst 
+58 unexpected FAIL: Correct '0', got '1 M18'
+173 unexpected PASS!
+185 unexpected FAIL: Correct '2 A16', got '1 E11'
+187 unexpected FAIL: Correct '1 E11', got '0'
+./regress.sh . filllib.tst 
+35 unexpected PASS!
+43 unexpected PASS!
+./regress.sh . connection.tst 
+94 unexpected PASS!
+./regress.sh . break_in.tst 
+60 unexpected FAIL: Correct '0', got '1 K13'
+./regress.sh . trevora.tst 
+150 unexpected PASS!
+370 unexpected PASS!
+390 unexpected PASS!
+./regress.sh . strategy.tst 
+36 unexpected PASS!
+./regress.sh . neurogo.tst 
+12 unexpected FAIL: Correct 'B10', got 'S8'
+./regress.sh . golife.tst 
+1 unexpected FAIL: Correct 'C7', got 'H5'
+./regress.sh . viking.tst 
+2 unexpected PASS!
+./regress.sh . trevorb.tst 
+590 unexpected FAIL: Correct 'H12|M9', got 'E9'
+740 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1406 unexpected FAIL: Correct 'B6', got 'B9'
+./regress.sh . nicklas3.tst 
+401 unexpected FAIL: Correct 'A5', got 'F9'
+./regress.sh . nicklas5.tst 
+1212 unexpected PASS!
+./regress.sh . nngs.tst 
+1280 unexpected PASS!
+./regress.sh . trevorc.tst 
+130 unexpected PASS!
+./regress.sh . strategy3.tst 
+120 unexpected PASS!
+141 unexpected PASS!
+./regress.sh . global.tst 
+1 unexpected PASS!
+44 unexpected PASS!
+./regress.sh . 13x13.tst 
+65 unexpected FAIL: Correct 'H4', got 'L4'
+./regress.sh . semeai.tst 
+51 unexpected FAIL: Correct '1 0 (A19|E11)', got '0 0 PASS'
+52 unexpected FAIL: Correct '1 3 A17', got '1 1 F17'
+./regress.sh . nngs2.tst 
+1 unexpected PASS!
+600 unexpected FAIL: Correct 'B5', got 'D6'
+./regress.sh . nngs4.tst 
+210 unexpected PASS!
+260 unexpected PASS!
+630 unexpected FAIL: Correct 'B6', got 'P13'
+./regress.sh . century2002.tst 
+240 unexpected FAIL: Correct 'F18', got 'C7'
+./regress.sh . ninestones.tst 
+240 unexpected PASS!
+./regress.sh . gunnar.tst 
+36 unexpected PASS!
+./regress.sh . arend2.tst 
+70 unexpected FAIL: Correct 'N7|O9', got 'N16'
+160 unexpected FAIL: Correct 'O16', got 'F17'
+170 unexpected FAIL: Correct 'O14', got 'S18'
+180 unexpected FAIL: Correct 'L17', got 'L18'
+190 unexpected FAIL: Correct 'O1|P1|Q1', got 'O4'
+200 unexpected FAIL: Correct 'Q5|R5', got 'M4'
+210 unexpected FAIL: Correct 'K2', got 'N3'
+220 unexpected FAIL: Correct 'K11|L11', got 'G12'
+230 unexpected FAIL: Correct '!H14', got 'H14'
+240 unexpected FAIL: Correct 'N7', got 'H16'
+
+========================== 3.3.21 pre 1 =====================================
+
+./regress.sh . connection.tst 
+106 unexpected FAIL: Correct '1 O16', got '0'
+./regress.sh . blunder.tst 
+26 unexpected PASS!
+./regress.sh . trevora.tst 
+610 unexpected PASS!
+./regress.sh . nngs1.tst 
+39 unexpected PASS!
+./regress.sh . endgame.tst 
+810 unexpected PASS!
+./regress.sh . trevorb.tst 
+440 unexpected PASS!
+./regress.sh . strategy2.tst 
+80 unexpected FAIL: Correct 'P4|Q4|Q3|S8', got 'S7'
+./regress.sh . buzco.tst 
+5 unexpected PASS!
+./regress.sh . nngs.tst 
+1280 unexpected FAIL: Correct 'D13', got 'H16'
+1770 unexpected PASS!
+./regress.sh . strategy3.tst 
+120 unexpected FAIL: Correct 'C7', got 'B7'
+./regress.sh . arend.tst 
+33 unexpected FAIL: Correct 'F9', got 'M5'
+./regress.sh . 13x13.tst 
+36 unexpected FAIL: Correct 'C5', got 'B2'
+./regress.sh . semeai.tst 
+48 unexpected FAIL: Correct '1 0 (D8|F8|G12|G10)', got '0 0 PASS'
+./regress.sh . trevord.tst 
+160 unexpected PASS!
+600 unexpected PASS!
+680 unexpected FAIL: Correct 'S16', got 'R15'
+./regress.sh . strategy4.tst 
+199 unexpected PASS!
+200 unexpected PASS!
+./regress.sh . owl1.tst 
+318 unexpected FAIL: Correct '0', got '1'
+./regress.sh . handtalk.tst 
+20 unexpected PASS!
+./regress.sh . nngs2.tst 
+90 unexpected PASS!
+./regress.sh . nngs3.tst 
+420 unexpected FAIL: Correct 'R14|R15', got 'O15'
+./regress.sh . nngs4.tst 
+210 unexpected FAIL: Correct '!S5', got 'S5'
+610 unexpected PASS!
+./regress.sh . century2002.tst 
+150 unexpected PASS!
+240 unexpected PASS!
+./regress.sh . arend2.tst 
+60 unexpected PASS!
+140 unexpected FAIL: Correct 'D11|H10|G9|E10', got 'C10'
+150 unexpected FAIL: Correct 'B6|C6', got 'D7'
+
+========================== 3.3.20 pre 5 =====================================
+
+./regress.sh . owl.tst 
+123 unexpected FAIL: Correct '1 C5', got '1 B1'
+150 unexpected FAIL: Correct '0', got '1 G13'
+./regress.sh . ld_owl.tst 
+68 unexpected PASS!
+./regress.sh . connection.tst 
+104 unexpected PASS!
+./regress.sh . trevor.tst 
+382 unexpected PASS!
+./regress.sh . global.tst 
+44 unexpected FAIL: Correct 'D5', got 'G7'
+
+========================== 3.3.20 pre 4 =====================================
+
+./regress.sh . connection.tst 
+103 unexpected FAIL: Correct '1 K2', got '1 K3'
+104 unexpected FAIL: Correct '1 (H2|H1|G1|J1|H3)', got '1 PASS'
+./regress.sh . strategy2.tst 
+80 unexpected PASS!
+./regress.sh . nicklas1.tst 
+501 unexpected FAIL: Correct 'G7', got 'F6'
+./regress.sh . nngs.tst 
+1280 unexpected PASS!
+./regress.sh . owl1.tst 
+313 unexpected FAIL: Correct '1 F1', got '0'
+314 unexpected FAIL: Correct '0', got '1'
+316 unexpected FAIL: Correct '0', got '1 L6'
+./regress.sh . nngs3.tst 
+100 unexpected PASS!
+./regress.sh . nngs4.tst 
+20 unexpected PASS!
+600 unexpected FAIL: Correct 'L9|L12|L10', got 'G3'
+610 unexpected FAIL: Correct 'C13|D13', got 'B14'
+620 unexpected FAIL: Correct 'G13|G14', got 'G11'
+./regress.sh . arend2.tst 
+110 unexpected PASS!
+120 unexpected PASS!
+130 unexpected FAIL: Correct 'P17', got 'G16'
+
+========================== 3.3.20 pre 3 =====================================
+
+./regress.sh . filllib.tst 
+41 unexpected PASS!
+./regress.sh . blunder.tst 
+25 unexpected PASS!
+./regress.sh . nngs1.tst 
+20 unexpected FAIL: Correct 'F17', got 'S13'
+./regress.sh . trevorb.tst 
+160 unexpected PASS!
+590 unexpected PASS!
+./regress.sh . trevorc.tst 
+100 unexpected PASS!
+240 unexpected PASS!
+820 unexpected FAIL: Correct 'A6', got 'B12'
+1420 unexpected FAIL: Correct 'J4', got 'A11'
+./regress.sh . semeai.tst 
+47 unexpected FAIL: Correct 'ALIVE ALIVE (PASS|T11|T9|R9|T10|R10|R11)', got 'ALIVE DEAD T11'
+50 unexpected PASS!
+./regress.sh . owl1.tst 
+309 unexpected PASS!
+310 unexpected PASS!
+311 unexpected FAIL: Correct '1 E2', got '0'
+312 unexpected FAIL: Correct '1 C3', got '1 E2'
+./regress.sh . nngs3.tst 
+1180 unexpected PASS!
+./regress.sh . nngs4.tst 
+340 unexpected PASS!
+570 unexpected PASS!
+590 unexpected FAIL: Correct 'E2', got 'H7'
+./regress.sh . century2002.tst 
+240 unexpected FAIL: Correct 'F18', got 'C7'
+./regress.sh . auto01.tst 
+4 unexpected PASS!
+./regress.sh . ninestones.tst 
+150 unexpected FAIL: Correct 'C5|D5', got 'G14'
+550 unexpected PASS!
+640 unexpected FAIL: Correct 'J2|H2', got 'J3'
+./regress.sh . gunnar.tst 
+24 unexpected PASS!
+26 unexpected PASS!
+./regress.sh . nando.tst 
+6 unexpected PASS!
+25 unexpected PASS!
+
+========================== 3.3.20 pre 2 =====================================
+
+./regress.sh . owl.tst 
+150 unexpected PASS!
+./regress.sh . atari_atari.tst 
+23 unexpected PASS!
+./regress.sh . strategy.tst 
+36 unexpected FAIL: Correct '!D18', got 'D18'
+./regress.sh . strategy2.tst 
+80 unexpected FAIL: Correct 'P4|Q4|Q3', got 'S8'
+./regress.sh . trevor.tst 
+740 unexpected PASS!
+./regress.sh . owl1.tst 
+304 unexpected PASS!
+308 unexpected FAIL: Correct '1 S11', got '1 R10'
+309 unexpected FAIL: Correct '1 L2|L4', got '0'
+310 unexpected FAIL: Correct '1 L2|L4', got '1 S4'
+./regress.sh . nngs3.tst 
+740 unexpected FAIL: Correct '!F2', got 'F2'
+./regress.sh . nngs4.tst 
+340 unexpected FAIL: Correct 'D2', got 'B1'
+./regress.sh . century2002.tst 
+240 unexpected PASS!
+./regress.sh . ninestones.tst 
+150 unexpected PASS!
+./regress.sh . 13x13b.tst 
+27 unexpected PASS!
+
+========================== 3.3.20 pre 1 =====================================
+
+./regress.sh . owl.tst 
+150 unexpected FAIL: Correct '0', got '1 G13'
+262 unexpected PASS!
+./regress.sh . strategy.tst 
+34 unexpected FAIL: Correct 'E17', got 'N15'
+./regress.sh . strategy2.tst 
+90 unexpected FAIL: Correct 'B14|D17', got 'G13'
+./regress.sh . trevorc.tst 
+1020 unexpected FAIL: Correct 'G2|G3', got 'B8'
+1030 unexpected FAIL: Correct 'G3', got 'B8'
+1440 unexpected FAIL: Correct 'E12|F11', got 'E10'
+./regress.sh . global.tst 
+4 unexpected PASS!
+5 unexpected PASS!
+./regress.sh . strategy4.tst 
+199 unexpected FAIL: Correct 'N5|S18', got 'B2'
+./regress.sh . century2002.tst 
+200 unexpected PASS!
+
+============================= 3.3.19 =====================================
+
+./regress.sh . ld_owl.tst 
+68 unexpected FAIL: Correct '1 B1', got '2 B2'
+./regress.sh . semeai.tst 
+45 unexpected FAIL: Correct 'ALIVE DEAD C1', got 'DEAD ALIVE PASS'
+./regress.sh . gunnar.tst 
+29 unexpected FAIL: Correct 'H5', got 'J13'
+30 unexpected FAIL: Correct 'F18', got 'B18'
+31 unexpected FAIL: Correct 'F18', got 'E17'
+32 unexpected FAIL: Correct 'C18', got 'C19'
+33 unexpected FAIL: Correct 'M11', got 'P10'
+34 unexpected FAIL: Correct 'M4|M5', got 'P7'
+
+============================= 3.3.18 =====================================
+============================= 3.3.18 pre 5 ===============================
+
+./regress.sh . reading.tst 
+180 unexpected PASS!
+./regress.sh . atari_atari.tst 
+23 unexpected FAIL: Correct 'C8', got 'PASS'
+./regress.sh . connection.tst 
+102 unexpected FAIL: Correct '1 (S7|S6|S8|R6)', got '1 T7'
+./regress.sh . endgame.tst 
+840 unexpected FAIL: Correct 'L15', got 'K19'
+850 unexpected FAIL: Correct 'K4|J4|L4', got 'P5'
+./regress.sh . neurogo.tst 
+14 unexpected FAIL: Correct 'Q4', got 'P11'
+./regress.sh . lazarus.tst 
+7 unexpected FAIL: Correct 'T5', got 'S8'
+9 unexpected PASS!
+./regress.sh . strategy2.tst 
+80 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1213 unexpected FAIL: Correct 'N4', got 'F12'
+./regress.sh . nicklas2.tst 
+903 unexpected PASS!
+./regress.sh . nicklas5.tst 
+1211 unexpected FAIL: Correct 'alive', got 'critical F12 E13'
+1212 unexpected FAIL: Correct 'dead', got 'critical M14 PASS'
+./regress.sh . tactics.tst 
+3 unexpected PASS!
+./regress.sh . nngs.tst 
+380 unexpected FAIL: Correct '!H2|S1', got 'H2'
+820 unexpected FAIL: Correct 'J13|L9', got 'D14'
+./regress.sh . strategy3.tst 
+141 unexpected FAIL: Correct 'C7', got 'J3'
+./regress.sh . 13x13.tst 
+25 unexpected PASS!
+53 unexpected FAIL: Correct 'C6', got 'N10'
+./regress.sh . semeai.tst 
+28 unexpected PASS!
+30 unexpected PASS!
+31 unexpected PASS!
+32 unexpected FAIL: Correct 'ALIVE ALIVE B6', got 'ALIVE DEAD B6'
+33 unexpected PASS!
+34 unexpected PASS!
+35 unexpected PASS!
+38 unexpected PASS!
+39 unexpected PASS!
+40 unexpected PASS!
+41 unexpected PASS!
+42 unexpected PASS!
+43 unexpected PASS!
+50 unexpected FAIL: Correct 'ALIVE DEAD (J5|J6|K7|J4|G5|G6|H7)', got 'ALIVE ALIVE H7'
+./regress.sh . strategy4.tst 
+155 unexpected FAIL: Correct 'D18', got 'E16'
+191 unexpected PASS!
+200 unexpected FAIL: Correct 'P6|P7|Q7|S18', got 'Q8'
+./regress.sh . owl1.tst 
+298 unexpected PASS!
+299 unexpected PASS!
+301 unexpected FAIL: Correct '0', got '1'
+302 unexpected FAIL: Correct '0', got '1 A18'
+303 unexpected FAIL: Correct '0', got '1'
+304 unexpected FAIL: Correct '0', got '1 T14'
+305 unexpected FAIL: Correct '0', got '1 P9'
+306 unexpected FAIL: Correct '0', got '1 PASS'
+./regress.sh . handtalk.tst 
+20 unexpected FAIL: Correct 'N18', got 'P17'
+./regress.sh . nngs2.tst 
+600 unexpected FAIL: Correct 'B5', got 'D6'
+./regress.sh . nngs3.tst 
+790 unexpected FAIL: Correct 'D5', got 'B18'
+800 unexpected FAIL: Correct 'G4', got 'B18'
+830 unexpected PASS!
+850 unexpected FAIL: Correct 'F9', got 'B18'
+1190 unexpected FAIL: Correct 'D17', got 'C17'
+./regress.sh . nngs4.tst 
+210 unexpected PASS!
+260 unexpected FAIL: Correct 'A4', got 'G9'
+420 unexpected FAIL: Correct 'G6', got 'F4'
+550 unexpected FAIL: Correct 'O3', got 'G5'
+560 unexpected FAIL: Correct 'B13', got 'F7'
+570 unexpected FAIL: Correct 'F6', got 'T4'
+580 unexpected FAIL: Correct 'E5', got 'H5'
+./regress.sh . auto02.tst 
+3 unexpected PASS!
+./regress.sh . auto_handtalk.tst 
+7 unexpected PASS!
+8 unexpected FAIL: Correct 'ALIVE DEAD (N18|O17|S15)', got 'ALIVE DEAD O18'
+./regress.sh . ninestones.tst 
+40 unexpected FAIL: Correct '!D2', got 'D2'
+370 unexpected PASS!
+500 unexpected PASS!
+./regress.sh . tactics1.tst 
+106 unexpected FAIL: Correct 'F8|F6', got 'D7'
+./regress.sh . gunnar.tst 
+24 unexpected FAIL: Correct 'K3', got 'L17'
+25 unexpected FAIL: Correct 'K3', got 'P9'
+26 unexpected FAIL: Correct 'F9', got 'K1'
+27 unexpected FAIL: Correct 'G18|M12|M19', got 'Q2'
+
+============================= 3.3.18 pre 4 ===============================
+
+./regress.sh . reading.tst 
+181 unexpected FAIL: Correct '1 E4', got '1 F5'
+./regress.sh . arb.tst 
+231 unexpected FAIL: Correct 'F5', got 'C6'
+./regress.sh . arion.tst 
+6 unexpected FAIL: Correct 'E19|F19|F18', got 'G19'
+./regress.sh . viking.tst 
+6 unexpected FAIL: Correct 'B17|B18', got 'A12'
+./regress.sh . lazarus.tst 
+4 unexpected FAIL: Correct 'R12|Q12|M8', got 'O11'
+9 unexpected FAIL: Correct 'D15|F15', got 'S12'
+./regress.sh . trevorb.tst 
+100 unexpected PASS!
+./regress.sh . trevor.tst 
+640 unexpected PASS!
+1010 unexpected PASS!
+./regress.sh . nngs.tst 
+1020 unexpected PASS!
+./regress.sh . trevorc.tst 
+1440 unexpected PASS!
+./regress.sh . strategy3.tst 
+137 unexpected FAIL: Correct 'F5', got 'Q18'
+./regress.sh . vie.tst 
+16 unexpected PASS!
+./regress.sh . 13x13.tst 
+25 unexpected FAIL: Correct 'J5', got 'L4'
+./regress.sh . trevord.tst 
+710 unexpected PASS!
+./regress.sh . owl1.tst 
+281 unexpected PASS!
+./regress.sh . nngs3.tst 
+230 unexpected PASS!
+760 unexpected FAIL: Correct 'Q14', got 'B9'
+./regress.sh . strategy5.tst 
+223 unexpected FAIL: Correct 'P16', got 'S4'
+./regress.sh . ninestones.tst 
+240 unexpected FAIL: Correct '!M19', got 'M19'
+./regress.sh . manyfaces1.tst 
+60 unexpected PASS!
+./regress.sh . thrash.tst 
+6 unexpected PASS!
+
+============================= 3.3.18 pre 3 ===============================
+
+./regress.sh . owl.tst 
+260 unexpected PASS!
+./regress.sh . nngs1.tst 
+32 unexpected FAIL: Correct 'L12|K16|H16', got 'E5'
+./regress.sh . viking.tst 
+3 unexpected PASS!
+./regress.sh . trevorb.tst 
+820 unexpected PASS!
+./regress.sh . nngs.tst 
+1700 unexpected PASS!
+./regress.sh . global.tst 
+34 unexpected PASS!
+./regress.sh . 13x13.tst 
+60 unexpected FAIL: Correct 'K5|L5', got 'H4'
+./regress.sh . semeai.tst 
+23 unexpected PASS!
+41 unexpected FAIL: Correct 'ALIVE DEAD (PASS|B3|A6|B6|C5|D4|E3|E2|E1)', got 'DEAD ALIVE PASS'
+42 unexpected FAIL: Correct 'DEAD ALIVE PASS', got 'ALIVE DEAD C1'
+43 unexpected FAIL: Correct 'ALIVE DEAD (A15|A11|B11|C14|C13|D12|D11|D10|D9|B9|A9)', got 'DEAD ALIVE PASS'
+./regress.sh . strategy4.tst 
+190 unexpected PASS!
+./regress.sh . nngs3.tst 
+310 unexpected PASS!
+./regress.sh . auto02.tst 
+1 unexpected PASS!
+./regress.sh . auto03.tst 
+9 unexpected PASS!
+./regress.sh . auto04.tst 
+3 unexpected PASS!
+./regress.sh . ninestones.tst 
+590 unexpected PASS!
+
+============================= 3.3.18 pre 2 ===============================
+
+./regress.sh . reading.tst 
+180 unexpected FAIL: Correct '2 Q3', got '0'
+./regress.sh . owl.tst 
+208 unexpected PASS!
+./regress.sh . atari_atari.tst 
+22 unexpected PASS!
+./regress.sh . endgame.tst 
+810 unexpected FAIL: Correct 'F5|F4', got 'L9'
+820 unexpected FAIL: Correct 'H4|M10|K19', got 'P6'
+./regress.sh . neurogo.tst 
+14 unexpected PASS!
+./regress.sh . trevorb.tst 
+170 unexpected PASS!
+./regress.sh . nicklas4.tst 
+1103 unexpected FAIL: Correct 'C2|C3', got 'D2'
+./regress.sh . trevor.tst 
+310 unexpected PASS!
+./regress.sh . trevorc.tst 
+1120 unexpected PASS!
+1121 unexpected PASS!
+1130 unexpected PASS!
+./regress.sh . global.tst 
+3 unexpected PASS!
+./regress.sh . semeai.tst 
+39 unexpected FAIL: Correct '!ALIVE DEAD J4', got 'ALIVE DEAD J4'
+40 unexpected FAIL: Correct 'ALIVE DEAD (J4|H4)', got 'ALIVE ALIVE J4'
+./regress.sh . owl1.tst 
+298 unexpected FAIL: Correct '2 Q3', got '1 Q3'
+299 unexpected FAIL: Correct '1 Q1', got '0'
+./regress.sh . nngs3.tst 
+400 unexpected FAIL: Correct 'N13', got 'Q15'
+980 unexpected PASS!
+./regress.sh . nngs4.tst 
+370 unexpected PASS!
+480 unexpected FAIL: Correct 'R16', got 'Q17'
+485 unexpected FAIL: Correct 'D17', got 'C16'
+487 unexpected FAIL: Correct 'P12', got 'C7'
+490 unexpected FAIL: Correct 'M14|N17|M16', got 'J15'
+510 unexpected FAIL: Correct '0', got '1 S9'
+530 unexpected FAIL: Correct 'Q2', got 'D6'
+540 unexpected FAIL: Correct 'Q2', got 'S4'
+./regress.sh . ninestones.tst 
+590 unexpected FAIL: Correct 'P4', got 'E6'
+600 unexpected FAIL: Correct 'P5', got 'B5'
+610 unexpected FAIL: Correct 'P11|O9|O7|O4', got 'B7'
+615 unexpected FAIL: Correct 'K16', got 'E18'
+620 unexpected FAIL: Correct 'G7|C8|F8', got 'N12'
+630 unexpected FAIL: Correct 'F5|H7', got 'H6'
+./regress.sh . gunnar.tst 
+19 unexpected PASS!
+
+============================= 3.3.18 pre 1 ===============================
+
+./regress.sh . atari_atari.tst 
+22 unexpected FAIL: Correct 'L10', got 'PASS'
+./regress.sh . strategy3.tst 
+123 unexpected PASS!
+./regress.sh . global.tst 
+27 unexpected PASS!
+34 unexpected FAIL: Correct 'N6', got 'S7'
+./regress.sh . nngs3.tst 
+760 unexpected PASS!
+./regress.sh . nngs4.tst 
+450 unexpected FAIL: Correct 'O8', got 'F7'
+460 unexpected FAIL: Correct 'N10', got 'O9'
+470 unexpected FAIL: Correct 'R9', got 'P10'
+./regress.sh . ninestones.tst 
+300 unexpected PASS!
+./regress.sh . gunnar.tst 
+20 unexpected PASS!
+23 unexpected PASS!
+
+============================= 3.3.17 ===============================
+
+./regress.sh . optics.tst 
+328 unexpected FAIL: Correct '0 1 (N16|N13) N16', got '0 0'
+./regress.sh . atari_atari.tst 
+21 unexpected FAIL: Correct 'Q9|N13|O13', got 'PASS'
+./regress.sh . trevora.tst 
+220 unexpected PASS!
+./regress.sh . endgame.tst 
+803 unexpected PASS!
+804 unexpected PASS!
+./regress.sh . trevorc.tst 
+1060 unexpected FAIL: Correct 'K11', got 'D13'
+1440 unexpected FAIL: Correct 'E12|F11', got 'E3'
+./regress.sh . global.tst 
+4 unexpected FAIL: Correct 'Q6', got 'F15'
+5 unexpected FAIL: Correct 'O4', got 'F15'
+./regress.sh . nngs4.tst 
+310 unexpected FAIL: Correct 'D6|D7', got 'H2'
+330 unexpected FAIL: Correct 'M15|H15', got 'R2'
+350 unexpected FAIL: Correct 'H10', got 'F14'
+360 unexpected FAIL: Correct 'M10', got 'C11'
+370 unexpected FAIL: Correct '0', got '1 M19'
+380 unexpected FAIL: Correct 'J7|K8', got 'P2'
+390 unexpected FAIL: Correct 'A11', got 'B8'
+400 unexpected FAIL: Correct '0', got '1 G2'
+410 unexpected FAIL: Correct 'E1', got 'PASS'
+430 unexpected FAIL: Correct 'H10|G9|G10|G11|M6|L7|K7', got 'E2'
+./regress.sh . tactics1.tst 
+101 unexpected PASS!
+104 unexpected PASS!
+./regress.sh . gunnar.tst 
+20 unexpected FAIL: Correct 'F16|K14', got 'H14'
+21 unexpected FAIL: Correct '!P17', got 'P17'
+22 unexpected FAIL: Correct '!E17', got 'E17'
+23 unexpected FAIL: Correct 'N5', got 'O5'
+
+========================== 3.3.17 pre 7  ============================
+
+./regress.sh . owl.tst 
+179 unexpected FAIL: Correct '3 R19', got '0'
+./regress.sh . blunder.tst 
+23 unexpected PASS!
+./regress.sh . arb.tst 
+203 unexpected PASS!
+220 unexpected PASS!
+./regress.sh . global.tst 
+44 unexpected PASS!
+45 unexpected PASS!
+./regress.sh . arend.tst 
+3 unexpected PASS!
+./regress.sh . handtalk.tst 
+20 unexpected PASS!
+./regress.sh . nngs2.tst 
+./regress.sh . nngs3.tst 
+760 unexpected FAIL: Correct 'Q14', got 'O11'
+./regress.sh . nngs4.tst 
+210 unexpected FAIL: Correct '!S5', got 'S5'
+./regress.sh . ninestones.tst 
+510 unexpected PASS!
+
+========================== 3.3.17 pre 6  ============================
+
+./regress.sh . reading.tst 
+177 unexpected PASS!
+./regress.sh . endgame.tst 
+302 unexpected PASS!
+801 unexpected PASS!
+803 unexpected FAIL: Correct 'J7', got 'F5'
+804 unexpected FAIL: Correct 'J7', got 'F5'
+./regress.sh . golife.tst 
+10 unexpected PASS!
+./regress.sh . trevorc.tst 
+1060 unexpected PASS!
+./regress.sh . 13x13.tst 
+31 unexpected FAIL: Correct 'M4|N4', got 'M6'
+./regress.sh . nando.tst 
+110 unexpected PASS!
+111 unexpected PASS!
+
+========================== 3.3.17 pre 5  ============================
+
+./regress.sh . neurogo.tst 
+14 unexpected FAIL: Correct 'Q4', got 'T4'
+./regress.sh . trevorb.tst 
+790 unexpected PASS!
+./regress.sh . buzco.tst 
+5 unexpected FAIL: Correct 'C10|C11|E9|A4|F10', got 'A9'
+./regress.sh . nngs.tst 
+1520 unexpected FAIL: Correct 'F15|F14', got 'B17'
+./regress.sh . global.tst 
+3 unexpected FAIL: Correct 'H4', got 'J4'
+44 unexpected FAIL: Correct 'D5', got 'G7'
+45 unexpected FAIL: Correct 'D5', got 'G7'
+./regress.sh . 13x13.tst 
+36 unexpected PASS!
+./regress.sh . strategy4.tst 
+191 unexpected FAIL: Correct 'C12', got 'B4'
+./regress.sh . owl1.tst 
+297 unexpected FAIL: Correct '1 A13', got '0'
+./regress.sh . nngs3.tst 
+760 unexpected PASS!
+./regress.sh . nngs4.tst 
+210 unexpected PASS!
+./regress.sh . ninestones.tst 
+540 unexpected PASS!
+./regress.sh . arend2.tst 
+80 unexpected FAIL: Correct 'L2', got 'N2'
+
+========================== 3.3.17 pre 4  ============================
+
+./regress.sh . atari_atari.tst 
+20 unexpected FAIL: Correct 'L17', got 'P9'
+./regress.sh . arb.tst 
+210 unexpected PASS!
+./regress.sh . nngs.tst 
+480 unexpected FAIL: Correct 'G14', got 'F14'
+./regress.sh . global.tst 
+32 unexpected PASS!
+34 unexpected PASS!
+./regress.sh . owl1.tst 
+285 unexpected PASS!
+286 unexpected PASS!
+290 unexpected PASS!
+292 unexpected PASS!
+294 unexpected PASS!
+./regress.sh . nngs3.tst 
+230 unexpected FAIL: Correct '!L12', got 'L12'
+310 unexpected FAIL: Correct 'C5|B5', got 'B7'
+./regress.sh . ninestones.tst 
+300 unexpected FAIL: Correct 'P16', got 'Q14'
+310 unexpected FAIL: Correct 'P16', got 'Q13'
+330 unexpected FAIL: Correct 'M17|M16', got 'N13'
+340 unexpected FAIL: Correct 'H4', got 'H5'
+350 unexpected FAIL: Correct 'L17', got 'N19'
+360 unexpected FAIL: Correct 'S5', got 'S3'
+370 unexpected FAIL: Correct 'R5', got 'O4'
+380 unexpected FAIL: Correct 'D3|E3|E7|F6', got 'O3'
+390 unexpected FAIL: Correct 'D3', got 'C4'
+490 unexpected FAIL: Correct 'R10', got 'S10'
+500 unexpected FAIL: Correct 'A8|A6', got 'K2'
+510 unexpected FAIL: Correct 'E19', got 'A6'
+520 unexpected FAIL: Correct '!G19', got 'G19'
+530 unexpected FAIL: Correct 'E13', got 'M2'
+540 unexpected FAIL: Correct 'B15', got 'L19'
+550 unexpected FAIL: Correct 'G5|J4', got 'K19'
+560 unexpected FAIL: Correct 'A9|B10|C11|F11|J15|A16', got 'L9'
+570 unexpected FAIL: Correct 'A9|B10|C11|F11|J15|A16', got 'H1'
+580 unexpected FAIL: Correct 'A10', got 'L3'
+./regress.sh . manyfaces1.tst 
+100 unexpected PASS!
+./regress.sh . nando.tst 
+7 unexpected PASS!
+8 unexpected PASS!
+9 unexpected PASS!
+20 unexpected PASS!
+21 unexpected PASS!
+24 unexpected PASS!
+./regress.sh . 13x13b.tst 
+4 unexpected PASS!
+
+========================== 3.3.17 pre 3  ============================
+
+./regress.sh . owl_rot.tst 
+244 unexpected PASS!
+./regress.sh . viking.tst 
+2 unexpected PASS!
+./regress.sh . trevorb.tst 
+130 unexpected PASS!
+./regress.sh . strategy2.tst 
+90 unexpected PASS!
+./regress.sh . nngs.tst 
+1700 unexpected FAIL: Correct '!J18', got 'J18'
+./regress.sh . trevorc.tst 
+1440 unexpected PASS!
+./regress.sh . global.tst 
+34 unexpected FAIL: Correct 'N6', got 'S7'
+./regress.sh . vie.tst 
+4 unexpected FAIL: Correct '1 G2', got '1 L3'
+./regress.sh . nando.tst 
+3 unexpected PASS!
+
+========================== 3.3.17 pre 2  ============================
+
+./regress.sh . trevorc.tst 
+130 unexpected FAIL: Correct 'H9', got 'H6'
+./regress.sh . nngs3.tst 
+630 unexpected PASS!
+./regress.sh . gunnar.tst 
+15 unexpected PASS!
+./regress.sh . nando.tst 
+31 unexpected PASS!
+112 unexpected PASS!
+./regress.sh . 13x13b.tst 
+26 unexpected PASS!
+41 unexpected PASS!
+42 unexpected PASS!
+
+========================== 3.3.17 pre 1  ============================
+
+./regress.sh . nngs3.tst 
+1010 unexpected PASS!
+./regress.sh . nando.tst 
+18 unexpected PASS!
+19 unexpected FAIL: Correct '0', got '1'
+20 unexpected FAIL: Correct 'S8|S9|T12', got 'T16'
+21 unexpected FAIL: Correct 'S9|T12', got 'T16'
+22 unexpected PASS!
+23 unexpected FAIL: Correct '0', got '1'
+24 unexpected FAIL: Correct '1 M13', got '0'
+25 unexpected FAIL: Correct '!P16', got 'P16'
+26 unexpected FAIL: Correct '0', got '1'
+27 unexpected FAIL: Correct 'D6', got 'G5'
+28 unexpected PASS!
+29 unexpected FAIL: Correct '0', got '1'
+30 unexpected FAIL: Correct '1 T6', got '0'
+31 unexpected FAIL: Correct '0', got '1 F19'
+
+========================== 3.3.16  ============================
+
+./regress.sh . thrash.tst 
+3 unexpected FAIL: Correct 'O5|N5|N4', got 'P8'
+4 unexpected FAIL: Correct 'N4|O4|M4', got 'T6'
+5 unexpected FAIL: Correct 'M3|M2|N3|L4|M5|M4', got 'D1'
+./regress.sh . 13x13b.tst 
+4 unexpected FAIL: Correct 'F4', got 'PASS'
+6 unexpected FAIL: Correct 'C4', got 'B4'
+8 unexpected FAIL: Correct 'F10', got 'F11'
+14 unexpected FAIL: Correct 'J9', got 'G12'
+17 unexpected FAIL: Correct 'F1', got 'H5'
+18 unexpected FAIL: Correct 'F3', got 'G8'
+25 unexpected FAIL: Correct 'M13', got 'M9'
+26 unexpected FAIL: Correct 'D3', got 'F5'
+27 unexpected FAIL: Correct 'C4', got 'B2'
+29 unexpected FAIL: Correct 'F3', got 'L8'
+30 unexpected FAIL: Correct 'N8', got 'H9'
+31 unexpected FAIL: Correct 'M7', got 'N7'
+36 unexpected FAIL: Correct 'J3|H3', got 'J4'
+38 unexpected FAIL: Correct 'E8', got 'E7'
+39 unexpected FAIL: Correct 'F10', got 'N9'
+41 unexpected FAIL: Correct 'J6', got 'F5'
+42 unexpected FAIL: Correct 'L13', got 'L7'
+43 unexpected FAIL: Correct 'J3', got 'J1'
+
+========================== 3.3.16 pre 5 ============================
+
+./regress.sh . connect.tst 
+35 unexpected FAIL: Correct '0', got '1 M14'
+./regress.sh . trevord.tst 
+500 unexpected PASS!
+./regress.sh . strategy5.tst 
+225 unexpected PASS!
+./regress.sh . nando.tst 
+9 unexpected FAIL: Correct 'E1|E2|F1|G1|G2', got 'T9'
+10 unexpected FAIL: Correct '1 (C11|F11|C12)', got '0'
+11 unexpected FAIL: Correct '1 (S2|T2|S1)', got '0'
+12 unexpected FAIL: Correct '1 (K19|L18|K18|H19)', got '0'
+13 unexpected FAIL: Correct '1 B1', got '0'
+14 unexpected FAIL: Correct 'P7', got 'Q6'
+15 unexpected FAIL: Correct 'P7', got 'S7'
+16 unexpected FAIL: Correct '!D1', got 'D1'
+17 unexpected FAIL: Correct 'B4|B5', got 'D5'
+
+========================== 3.3.16 pre 3 ============================
+
+./regress.sh . connection.tst 
+101 unexpected FAIL: Correct '1 M3', got '0'
+./regress.sh . owl1.tst 
+296 unexpected FAIL: Correct '1 E5|D8', got '0'
+./regress.sh . strategy5.tst 
+226 unexpected FAIL: Correct 'F5', got 'S3'
+./regress.sh . nando.tst
+1 unexpected FAIL: Correct 'M12', got 'O18'
+2 unexpected FAIL: Correct '0', got '1'
+3 unexpected FAIL: Correct '1 A12', got '0'
+4 unexpected FAIL: Correct '1 S10|T9', got '0'
+5 unexpected FAIL: Correct '0', got '1'
+6 unexpected FAIL: Correct '0', got '1'
+7 unexpected FAIL: Correct 'N16', got 'PASS'
+8 unexpected FAIL: Correct 'M16|N16', got 'PASS'
+110 unexpected FAIL: Correct '0', got '1 B17'
+111 unexpected FAIL: Correct '0', got '1 B17'
+112 unexpected FAIL: Correct '!P7', got 'P7'
+140 unexpected FAIL: Correct '1 P2', got '0'
+141 unexpected PASS!
+142 unexpected FAIL: Correct '0', got '1'
+150 unexpected FAIL: Correct '1 P4', got '0'
+151 unexpected FAIL: Correct '0', got '1 P5'
+210 unexpected FAIL: Correct 'D3', got 'C4'
+211 unexpected FAIL: Correct 'D5', got 'O17'
+212 unexpected FAIL: Correct 'E3', got 'O17'
+213 unexpected FAIL: Correct '0', got '1 C5'
+
+========================== 3.3.16 pre 2 ============================
+
+./regress.sh . reading.tst 
+178 unexpected PASS!
+./regress.sh . optics.tst 
+1201 unexpected PASS!
+./regress.sh . trevora.tst 
+390 unexpected FAIL: Correct 'A2', got 'J4'
+./regress.sh . arb.tst 
+150 unexpected PASS!
+./regress.sh . golife.tst 
+4 unexpected PASS!
+
+========================== 3.3.16 pre 1 ============================
+
+./regress.sh . atari_atari.tst 
+19 unexpected PASS!
+./regress.sh . blunder.tst 
+20 unexpected PASS!
+./regress.sh . nngs1.tst 
+31 unexpected PASS!
+40 unexpected PASS!
+./regress.sh . neurogo.tst 
+11 unexpected FAIL: Correct 'N5', got 'R12'
+./regress.sh . golife.tst 
+4 unexpected FAIL: Correct 'H5', got 'B4'
+./regress.sh . trevorb.tst 
+620 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1207 unexpected PASS!
+./regress.sh . trevorc.tst 
+580 unexpected PASS!
+./regress.sh . strategy3.tst 
+123 unexpected FAIL: Correct 'P4', got 'N3'
+./regress.sh . global.tst 
+26 unexpected FAIL: Correct 'D12', got 'B10'
+32 unexpected FAIL: Correct 'G8', got 'E13'
+./regress.sh . 13x13.tst 
+10 unexpected PASS!
+./regress.sh . trevord.tst 
+340 unexpected PASS!
+./regress.sh . nngs2.tst 
+150 unexpected PASS!
+./regress.sh . nngs4.tst 
+90 unexpected PASS!
+./regress.sh . century2002.tst 
+60 unexpected FAIL: Correct 'Q14', got 'R18'
+
+8496.910 seconds
+
+========================== 3.3.15 ============================
+
+./regress.sh . endgame.tst 
+219 unexpected PASS!
+./regress.sh . golife.tst 
+4 unexpected PASS!
+7 unexpected FAIL: Correct 'F3', got 'G1'
+./regress.sh . trevorb.tst 
+600 unexpected PASS!
+./regress.sh . nngs.tst 
+220 unexpected PASS!
+240 unexpected PASS!
+./regress.sh . trevorc.tst 
+450 unexpected PASS!
+970 unexpected PASS!
+1480 unexpected PASS!
+1520 unexpected PASS!
+./regress.sh . 13x13.tst 
+39 unexpected PASS!
+57 unexpected PASS!
+60 unexpected PASS!
+./regress.sh . nngs3.tst 
+800 unexpected PASS!
+870 unexpected PASS!
+1010 unexpected FAIL: Correct 'H16|H17', got 'O10'
+./regress.sh . century2002.tst 
+60 unexpected PASS!
+./regress.sh . ninestones.tst 
+290 unexpected PASS!
+./regress.sh . arend2.tst 
+70 unexpected PASS!
+
+========================== 3.3.15 pre 3 ============================
+
+./regress.sh . trevora.tst 
+130 unexpected PASS!
+./regress.sh . nngs1.tst 
+20 unexpected PASS!
+46 unexpected PASS!
+48 unexpected FAIL: Correct 'R16', got 'F15'
+./regress.sh . trevor.tst 
+412 unexpected PASS!
+1060 unexpected FAIL: Correct '1', got '0'
+./regress.sh . global.tst 
+26 unexpected PASS!
+./regress.sh . 13x13.tst 
+65 unexpected PASS!
+./regress.sh . nngs3.tst 
+130 unexpected FAIL: Correct 'C7|C9', got 'N14'
+1190 unexpected PASS!
+./regress.sh . safety.tst 
+5 unexpected PASS!
+7 unexpected PASS!
+./regress.sh . ninestones.tst 
+150 unexpected FAIL: Correct 'C5|D5', got 'G14'
+
+========================== 3.3.15 pre 2 ============================
+
+./regress.sh . reading.tst 
+178 unexpected FAIL: Correct '0', got '1 G9'
+./regress.sh . filllib.tst 
+43 unexpected FAIL: Correct 'C6', got 'B10'
+./regress.sh . atari_atari.tst 
+19 unexpected FAIL: Correct 'P9|Q7', got 'PASS'
+./regress.sh . connection.tst 
+100 unexpected FAIL: Correct '(2|3) J15', got '0'
+./regress.sh . neurogo.tst 
+11 unexpected PASS!
+14 unexpected PASS!
+./regress.sh . lazarus.tst 
+7 unexpected PASS!
+14 unexpected PASS!
+./regress.sh . trevorb.tst 
+220 unexpected PASS!
+./regress.sh . strategy2.tst 
+54 unexpected PASS!
+75 unexpected FAIL: Correct 'Q11', got 'F7'
+76 unexpected FAIL: Correct 'Q11', got 'F7'
+./regress.sh . nngs.tst 
+290 unexpected FAIL: Correct 'D12|D11|E12', got 'H10'
+./regress.sh . global.tst 
+3 unexpected PASS!
+./regress.sh . 13x13.tst 
+39 unexpected FAIL: Correct 'H4|J4', got 'J5'
+./regress.sh . owl1.tst 
+294 unexpected FAIL: Correct '1 M19', got '0'
+./regress.sh . nngs4.tst 
+220 unexpected PASS!
+./regress.sh . auto_handtalk.tst 
+8 unexpected PASS!
+
+========================== 3.3.15 pre 1 ============================
+
+./regress.sh . strategy.tst 
+50 unexpected PASS!
+./regress.sh . viking.tst 
+2 unexpected FAIL: Correct 'E2', got 'C4'
+./regress.sh . lazarus.tst 
+16 unexpected FAIL: Correct 'L16', got 'L17'
+./regress.sh . global.tst 
+34 unexpected PASS!
+./regress.sh . semeai.tst 
+23 unexpected FAIL: Correct 'ALIVE DEAD (F15|G15|H15|PASS)', got 'ALIVE DEAD E13'
+34 unexpected FAIL: Correct 'ALIVE DEAD S18', got 'DEAD ALIVE PASS'
+./regress.sh . strategy4.tst 
+155 unexpected PASS!
+179 unexpected FAIL: Correct 'P3|O2|P2|O4|E2', got 'O5'
+./regress.sh . nngs3.tst 
+240 unexpected PASS!
+./regress.sh . auto_handtalk.tst 
+7 unexpected FAIL: Correct 'ALIVE DEAD (O18|N18|O17|P17)', got 'ALIVE_IN_SEKI ALIVE_IN_SEKI N18'
+8 unexpected FAIL: Correct 'ALIVE DEAD (N18|O17|S15)', got 'ALIVE_IN_SEKI ALIVE_IN_SEKI N18'
+./regress.sh . ninestones.tst 
+260 unexpected FAIL: Correct 'B16', got 'C13'
+270 unexpected FAIL: Correct 'Q3', got 'Q2'
+280 unexpected FAIL: Correct 'R1|S1|S2', got 'T4'
+290 unexpected FAIL: Correct 'B1', got 'A4'
+
+========================== 3.3.14 ============================
+
+./regress.sh . ld_owl.tst 
+161 unexpected PASS!
+./regress.sh . strategy.tst 
+50 unexpected FAIL: Correct 'Q9', got 'Q11'
+./regress.sh . neurogo.tst 
+11 unexpected FAIL: Correct 'N5', got 'R12'
+./regress.sh . viking.tst 
+6 unexpected PASS!
+./regress.sh . lazarus.tst 
+7 unexpected FAIL: Correct 'T5', got 'L12'
+./regress.sh . strategy2.tst 
+54 unexpected FAIL: Correct 'P6', got 'F9'
+72 unexpected PASS!
+80 unexpected FAIL: Correct 'P4|Q4|Q3', got 'H13'
+./regress.sh . nicklas1.tst 
+1213 unexpected PASS!
+./regress.sh . nicklas2.tst 
+903 unexpected FAIL: Correct 'critical (H8|F9) H8', got 'alive'
+./regress.sh . nicklas5.tst 
+1211 unexpected PASS!
+./regress.sh . trevor.tst 
+461 unexpected PASS!
+./regress.sh . nngs.tst 
+2040 unexpected PASS!
+./regress.sh . global.tst 
+3 unexpected FAIL: Correct 'H4', got 'J9'
+34 unexpected FAIL: Correct 'N6', got 'S7'
+./regress.sh . 13x13.tst 
+36 unexpected FAIL: Correct 'C5', got 'B2'
+39 unexpected PASS!
+./regress.sh . strategy4.tst 
+162 unexpected PASS!
+179 unexpected PASS!
+188 unexpected PASS!
+./regress.sh . nngs3.tst 
+240 unexpected FAIL: Correct 'G13|G12', got 'J12'
+./regress.sh . nngs4.tst 
+160 unexpected FAIL: Correct 'K8|L8', got 'J12'
+270 unexpected PASS!
+./regress.sh . ninestones.tst 
+40 unexpected PASS!
+
+========================== 3.3.14 pre 2 ============================
+
+./regress.sh . nngs.tst 
+720 unexpected FAIL: Correct 'F16', got 'A11'
+./regress.sh . trevorc.tst 
+1360 unexpected PASS!
+./regress.sh . ninestones.tst 
+10 unexpected PASS!
+20 unexpected PASS!
+
+========================== 3.3.14 pre 1 ============================
+
+./regress.sh . nngs1.tst 
+48 unexpected PASS!
+./regress.sh . lazarus.tst 
+4 unexpected PASS!
+./regress.sh . trevorb.tst 
+960 unexpected FAIL: Correct '!D5', got 'D5'
+./regress.sh . strategy2.tst 
+55 unexpected FAIL: Correct 'C12', got 'C14'
+79 unexpected FAIL: Correct 'N3', got 'S4'
+90 unexpected FAIL: Correct 'B14|D17', got 'G13'
+./regress.sh . trevor.tst 
+412 unexpected FAIL: Correct 'C4', got 'B3'
+./regress.sh . nngs.tst 
+500 unexpected PASS!
+720 unexpected PASS!
+./regress.sh . global.tst 
+26 unexpected FAIL: Correct 'D12', got 'M5'
+34 unexpected PASS!
+./regress.sh . 13x13.tst 
+7 unexpected FAIL: Correct 'L7|M7|M6', got 'M1'
+65 unexpected FAIL: Correct 'H4', got 'L2'
+./regress.sh . nngs3.tst 
+230 unexpected PASS!
+310 unexpected PASS!
+330 unexpected PASS!
+390 unexpected FAIL: Correct 'O11', got 'M5'
+400 unexpected PASS!
+1190 unexpected FAIL: Correct 'D17', got 'C17'
+./regress.sh . nngs4.tst 
+10 unexpected PASS!
+./regress.sh . strategy5.tst 
+221 unexpected PASS!
+230 unexpected PASS!
+232 unexpected PASS!
+./regress.sh . century2002.tst 
+260 unexpected FAIL: Correct 'S12|Q12|Q13', got 'R13'
+./regress.sh . safety.tst 
+7 unexpected FAIL: Correct 'L5|L6|K6|M5|M3|K7|K6', got 'D13'
+./regress.sh . manyfaces1.tst 
+90 unexpected PASS!
+
+============================== 3.3.13 ==============================
+
+./regress.sh . nngs.tst 
+1060 unexpected FAIL: Correct 'H3|F3', got 'Q2'
+
+========================== 3.3.13 pre 5 ============================
+
+./regress.sh . owl.tst 
+170 unexpected FAIL: Correct '0', got '1 B15'
+./regress.sh . nngs1.tst 
+31 unexpected FAIL: Correct 'N17', got 'N14'
+./regress.sh . strategy.tst 
+35 unexpected PASS!
+./regress.sh . trevor.tst 
+1010 unexpected FAIL: Correct '0', got '1'
+./regress.sh . nngs.tst 
+290 unexpected PASS!
+480 unexpected PASS!
+500 unexpected FAIL: Correct 'J17', got 'C12'
+560 unexpected FAIL: Correct 'S15', got 'E11'
+1750 unexpected FAIL: Correct 'L8', got 'J9'
+./regress.sh . global.tst 
+4 unexpected PASS!
+5 unexpected PASS!
+./regress.sh . 13x13.tst 
+37 unexpected PASS!
+52 unexpected PASS!
+./regress.sh . owl1.tst 
+272 unexpected PASS!
+./regress.sh . handtalk.tst 
+2 unexpected FAIL: Correct 'P5|Q2|R2', got 'O4'
+./regress.sh . nngs3.tst 
+300 unexpected PASS!
+390 unexpected PASS!
+400 unexpected FAIL: Correct 'N13', got 'Q15'
+630 unexpected FAIL: Correct 'A17', got 'C16'
+./regress.sh . nngs4.tst 
+280 unexpected FAIL: Correct 'F3', got 'H3'
+290 unexpected FAIL: Correct '!H1', got 'H1'
+300 unexpected FAIL: Correct 'A3|D1', got '1 B1'
+./regress.sh . strategy5.tst 
+232 unexpected FAIL: Correct 'D11|E11', got 'C7'
+./regress.sh . century2002.tst 
+110 unexpected PASS!
+./regress.sh . safety.tst 
+3 unexpected FAIL: Correct 'H15|H16|G14|F13|C17', got 'M3'
+./regress.sh . ninestones.tst 
+220 unexpected FAIL: Correct 'P9|P8', got 'R9'
+230 unexpected FAIL: Correct '!P11', got 'P11'
+./regress.sh . gunnar.tst 
+4 unexpected PASS!
+
+========================== 3.3.13 pre 4 ============================
+
+./regress.sh . nngs1.tst 
+33 unexpected PASS!
+34 unexpected FAIL: Correct '!N10|N9|N11|O11|O10', got 'N10'
+35 unexpected PASS!
+51 unexpected PASS!
+./regress.sh . nngs.tst 
+820 unexpected PASS!
+1000 unexpected PASS!
+1860 unexpected PASS!
+./regress.sh . trevorc.tst 
+1580 unexpected PASS!
+./regress.sh . 13x13.tst 
+7 unexpected PASS!
+13 unexpected FAIL: Correct '!G7', got 'G7'
+39 unexpected FAIL: Correct 'H4|J4', got 'J5'
+./regress.sh . nngs3.tst 
+400 unexpected PASS!
+./regress.sh . nngs4.tst 
+./regress.sh . strategy5.tst 
+223 unexpected PASS!
+278 unexpected FAIL: Correct '!J11', got 'J11'
+./regress.sh . century2002.tst 
+240 unexpected FAIL: Correct 'F18', got 'C7'
+./regress.sh . safety.tst 
+3 unexpected PASS!
+./regress.sh . gunnar.tst 
+2 unexpected PASS!
+./regress.sh . arend2.tst 
+10 unexpected FAIL: Correct 'G3|F4', got 'M3'
+20 unexpected FAIL: Correct 'G3|H3', got 'M5'
+30 unexpected FAIL: Correct 'K3|J4|M5', got 'O7'
+40 unexpected FAIL: Correct 'R10|S10|P11', got 'T12'
+60 unexpected FAIL: Correct 'N8|M7|L7|M9|L9|N7|O9|N10', got 'R14'
+70 unexpected FAIL: Correct 'N7|O9', got 'N15'
+
+========================== 3.3.13 pre 3 ============================
+
+./regress.sh . strategy.tst 
+20 unexpected PASS!
+./regress.sh . lazarus.tst 
+4 unexpected FAIL: Correct 'R12|Q12|M8', got 'T5'
+./regress.sh . trevorb.tst 
+740 unexpected FAIL: Correct '!H10', got 'H10'
+./regress.sh . strategy2.tst 
+75 unexpected PASS!
+./regress.sh . strategy4.tst 
+163 unexpected FAIL: Correct 'O7|P8', got 'N8'
+./regress.sh . owl1.tst 
+293 unexpected FAIL: Correct '0', got '1 Q5'
+./regress.sh . nngs3.tst 
+800 unexpected FAIL: Correct 'G4', got 'E3'
+1170 unexpected PASS!
+./regress.sh . nngs4.tst 
+110 unexpected FAIL: Correct 'D17', got 'C16'
+120 unexpected FAIL: Correct 'C13', got 'B5'
+130 unexpected FAIL: Correct 'E14', got 'C8'
+140 unexpected FAIL: Correct 'R5|R4', got 'N17'
+150 unexpected FAIL: Correct 'N3|M3', got 'M2'
+170 unexpected FAIL: Correct 'S6', got 'J14'
+210 unexpected FAIL: Correct '!S5', got 'S5'
+220 unexpected FAIL: Correct '!T2', got 'T2'
+230 unexpected FAIL: Correct 'Q18', got 'L18'
+240 unexpected FAIL: Correct 'B4', got 'C4'
+250 unexpected FAIL: Correct 'F7', got 'C7'
+270 unexpected FAIL: Correct '!P5', got 'P5'
+./regress.sh . gunnar.tst 
+1 unexpected PASS!
+
+========================== 3.3.13 pre 2 ============================
+
+./regress.sh . filllib.tst 
+42 unexpected PASS!
+./regress.sh . connection.tst 
+19 unexpected PASS!
+99 unexpected FAIL: Correct '0', got '1 O3'
+./regress.sh . nngs1.tst 
+31 unexpected PASS!
+./regress.sh . lazarus.tst 
+15 unexpected PASS!
+./regress.sh . nngs.tst 
+880 unexpected FAIL: Correct 'E6', got 'H6'
+./regress.sh . 13x13.tst 
+85 unexpected PASS!
+./regress.sh . owl1.tst 
+265 unexpected PASS!
+292 unexpected FAIL: Correct '1 T4', got '0'
+./regress.sh . auto04.tst 
+1 unexpected PASS!
+./regress.sh . auto_handtalk.tst 
+9 unexpected PASS!
+./regress.sh . gunnar.tst 
+2 unexpected FAIL: Correct 'E17|E18', got 'D19'
+8 unexpected FAIL: Correct '!O13', got 'O13'
+9 unexpected FAIL: Correct 'F13', got 'C14'
+10 unexpected FAIL: Correct 'R12|R14', got 'Q15'
+14 unexpected FAIL: Correct 'Q11', got 'O13'
+15 unexpected FAIL: Correct 'O6', got 'P6'
+16 unexpected FAIL: Correct 'T5', got 'M9'
+17 unexpected FAIL: Correct 'S7', got 'T6'
+19 unexpected FAIL: Correct 'L4', got 'L3'
+
+
+========================== 3.3.13 pre 1 ============================
+
+./regress.sh . ld_owl.tst 
+302 unexpected PASS!
+./regress.sh . optics.tst 
+1201 unexpected FAIL: Correct '1 2 T8 T8', got '0 0'
+./regress.sh . atari_atari.tst 
+17 unexpected PASS!
+./regress.sh . connection.tst 
+96 unexpected PASS!
+./regress.sh . trevora.tst 
+130 unexpected FAIL: Correct 'F4', got 'B7'
+./regress.sh . arb.tst 
+150 unexpected FAIL: Correct 'J5', got 'B8'
+./regress.sh . golife.tst 
+4 unexpected FAIL: Correct 'H5', got 'B4'
+./regress.sh . lazarus.tst 
+3 unexpected PASS!
+./regress.sh . 13x13.tst 
+67 unexpected PASS!
+./regress.sh . nngs3.tst 
+770 unexpected PASS!
+
+========================== 3.3.12 ==============================
+
+./regress.sh . blunder.tst 
+30 unexpected FAIL: Correct '!O7', got 'O7'
+./regress.sh . strategy.tst 
+35 unexpected FAIL: Correct '!B17', got 'B17'
+./regress.sh . trevorc.tst 
+940 unexpected PASS!
+./regress.sh . tactics1.tst 
+30 unexpected FAIL: Correct 'J1', got 'H4'
+./regress.sh . manyfaces1.tst 
+10 unexpected PASS!
+
+======================= 3.3.12 pre 5  =========================
+
+./regress.sh . reading.tst 
+163 unexpected PASS!
+175 unexpected PASS!
+./regress.sh . connection.tst 
+95 unexpected PASS!
+./regress.sh . trevora.tst 
+220 unexpected PASS!
+290 unexpected PASS!
+420 unexpected PASS!
+./regress.sh . strategy.tst 
+20 unexpected FAIL: Correct 'Q11', got 'C18'
+22 unexpected PASS!
+40 unexpected FAIL: Correct 'E5|M11', got 'R6'
+./regress.sh . neurogo.tst 
+11 unexpected PASS!
+./regress.sh . arb.tst 
+220 unexpected FAIL: Correct '!F6', got 'F6'
+./regress.sh . dniwog.tst 
+7 unexpected PASS!
+./regress.sh . lazarus.tst 
+4 unexpected PASS!
+./regress.sh . trevorb.tst 
+740 unexpected PASS!
+790 unexpected FAIL: Correct 'K6|K5', got 'A6'
+./regress.sh . nicklas2.tst 
+102 unexpected FAIL: Correct 'D4', got 'F5'
+./regress.sh . trevor.tst 
+190 unexpected PASS!
+./regress.sh . nngs.tst 
+420 unexpected PASS!
+490 unexpected PASS!
+1280 unexpected FAIL: Correct 'D13', got 'J12'
+1860 unexpected FAIL: Correct '!L7|D19', got 'D19'
+./regress.sh . trevorc.tst 
+170 unexpected PASS!
+590 unexpected PASS!
+1580 unexpected FAIL: Correct 'C8', got 'A4'
+./regress.sh . strategy3.tst 
+119 unexpected FAIL: Correct 'D9|J3', got 'B13'
+136 unexpected PASS!
+./regress.sh . global.tst 
+5 unexpected FAIL: Correct 'O4', got 'F5'
+7 unexpected PASS!
+26 unexpected PASS!
+./regress.sh . arend.tst 
+23 unexpected PASS!
+./regress.sh . 13x13.tst 
+12 unexpected PASS!
+15 unexpected PASS!
+40 unexpected FAIL: Correct 'K13', got 'L11'
+./regress.sh . strategy4.tst 
+200 unexpected PASS!
+./regress.sh . nngs2.tst 
+140 unexpected FAIL: Correct 'P5', got 'Q6'
+290 unexpected PASS!
+550 unexpected PASS!
+./regress.sh . nngs3.tst 
+310 unexpected FAIL: Correct 'C5|B5', got 'B7'
+320 unexpected PASS!
+400 unexpected FAIL: Correct 'N13', got 'Q15'
+730 unexpected PASS!
+800 unexpected PASS!
+830 unexpected FAIL: Correct '!N13', got 'N13'
+980 unexpected FAIL: Correct '!G10', got 'G10'
+1150 unexpected PASS!
+1170 unexpected FAIL: Correct 'B1', got 'B7'
+./regress.sh . strategy5.tst 
+226 unexpected PASS!
+./regress.sh . century2002.tst 
+160 unexpected PASS!
+./regress.sh . ninestones.tst 
+150 unexpected PASS!
+./regress.sh . tactics1.tst 
+10 unexpected PASS!
+
+======================= 3.3.12 pre 4  =========================
+
+./regress.sh . ld_owl.tst 
+168 unexpected PASS!
+./regress.sh . nicklas2.tst 
+102 unexpected PASS!
+./regress.sh . trevor.tst 
+412 unexpected PASS!
+./regress.sh . trevorc.tst 
+940 unexpected FAIL: Correct 'G1', got 'F3'
+./regress.sh . 13x13.tst 
+41 unexpected PASS!
+./regress.sh . nngs3.tst 
+1080 unexpected FAIL: Correct '!H7', got 'H7'
+./regress.sh . gunnar.tst 
+2 unexpected PASS!
+
+======================= 3.3.12 pre 3  =========================
+
+./regress.sh . owl_rot.tst 
+23 unexpected PASS!
+./regress.sh . filllib.tst 
+42 unexpected FAIL: Correct 'N19', got 'PASS'
+./regress.sh . connection.tst 
+2 unexpected PASS!
+23 unexpected PASS!
+60 unexpected PASS!
+79 unexpected PASS!
+80 unexpected PASS!
+88 unexpected PASS!
+./regress.sh . trevora.tst 
+200 unexpected PASS!
+570 unexpected PASS!
+./regress.sh . trevorb.tst 
+670 unexpected PASS!
+./regress.sh . strategy2.tst 
+75 unexpected FAIL: Correct 'Q11', got 'Q13'
+./regress.sh . nicklas1.tst 
+1213 unexpected FAIL: Correct 'N4', got 'F12'
+./regress.sh . manyfaces.tst 
+9 unexpected FAIL: Correct '!P12', got 'P12'
+./regress.sh . trevor.tst 
+1100 unexpected FAIL: Correct 'D15', got 'C7'
+1110 unexpected FAIL: Correct 'O12', got 'C7'
+./regress.sh . nngs.tst 
+490 unexpected FAIL: Correct 'J18', got 'G18'
+1955 unexpected PASS!
+./regress.sh . trevorc.tst 
+230 unexpected PASS!
+940 unexpected PASS!
+./regress.sh . connect.tst 
+70 unexpected FAIL: Correct '0', got '1 O3'
+78 unexpected FAIL: Correct '0', got '1 E2'
+./regress.sh . global.tst 
+4 unexpected FAIL: Correct 'Q6', got 'F5'
+./regress.sh . owl1.tst 
+268 unexpected PASS!
+290 unexpected FAIL: Correct '1 O19', got '1 PASS'
+291 unexpected FAIL: Correct '2 O19', got '0'
+./regress.sh . nngs2.tst 
+600 unexpected PASS!
+./regress.sh . nngs3.tst 
+800 unexpected FAIL: Correct 'G4', got 'H5'
+./regress.sh . strategy5.tst 
+225 unexpected FAIL: Correct 'O12', got 'B9'
+./regress.sh . auto03.tst 
+10 unexpected PASS!
+11 unexpected PASS!
+./regress.sh . ninestones.tst 
+130 unexpected PASS!
+./regress.sh . gunnar.tst 
+1 unexpected FAIL: Correct 'M17', got 'M19'
+2 unexpected FAIL: Correct '!D19', got 'D19'
+3 unexpected FAIL: Correct 'K17', got 'L18'
+4 unexpected FAIL: Correct '!L17', got 'L17'
+5 unexpected FAIL: Correct 'F12', got 'G1'
+
+======================= 3.3.12 pre 2  =========================
+
+./regress.sh . owl_rot.tst 
+125 unexpected PASS!
+./regress.sh . strategy4.tst 
+179 unexpected FAIL: Correct 'P3|O2|P2|O4|E2', got 'O5'
+./regress.sh . nngs3.tst 
+130 unexpected PASS!
+./regress.sh . century2002.tst 
+200 unexpected FAIL: Correct 'F6', got 'G6'
+
+======================= 3.3.12 pre 1  =========================
+
+./regress.sh . reading.tst 
+176 unexpected FAIL: Correct '0', got '1 A5'
+177 unexpected FAIL: Correct '1 N1', got '0'
+./regress.sh . connection.tst 
+96 unexpected FAIL: Correct '0', got '1'
+97 unexpected FAIL: Correct '1 O5', got '0'
+./regress.sh . nngs1.tst 
+35 unexpected FAIL: Correct 'D13', got 'O6'
+46 unexpected FAIL: Correct '!J5', got 'J5'
+./regress.sh . golife.tst 
+2 unexpected PASS!
+./regress.sh . viking.tst 
+1 unexpected PASS!
+./regress.sh . trevorb.tst 
+160 unexpected FAIL: Correct '1 ..*', got '0'
+./regress.sh . trevor.tst 
+360 unexpected FAIL: Correct '(2|3) J9', got '1 E9'
+./regress.sh . tactics.tst 
+101 unexpected FAIL: Correct '1 D12', got '0'
+102 unexpected FAIL: Correct '0', got '1'
+./regress.sh . strategy3.tst 
+105 unexpected PASS!
+./regress.sh . global.tst 
+32 unexpected PASS!
+./regress.sh . strategy4.tst 
+179 unexpected PASS!
+./regress.sh . nngs2.tst 
+480 unexpected PASS!
+./regress.sh . nngs4.tst 
+30 unexpected PASS!
+./regress.sh . tactics1.tst 
+10 unexpected FAIL: Correct '!T9', got 'T9'
+20 unexpected FAIL: Correct '1 A17', got '0'
+./regress.sh . manyfaces1.tst 
+10 unexpected FAIL: Correct 'C17|H15|D9', got 'D5'
+20 unexpected FAIL: Correct 'F12|G14|G13|C17|C12|E13', got 'D2'
+30 unexpected FAIL: Correct 'C14', got 'B10'
+36 unexpected FAIL: Correct 'P16', got 'S11'
+40 unexpected FAIL: Correct 'P15', got 'O11'
+50 unexpected FAIL: Correct '1 .*', got '0'
+60 unexpected FAIL: Correct 'N18|G18', got 'C3'
+70 unexpected FAIL: Correct 'M10|L9|L8|K7', got 'F18'
+80 unexpected FAIL: Correct 'J17|N18|D18', got 'G16'
+90 unexpected FAIL: Correct '!A10', got 'A10'
+100 unexpected FAIL: Correct '!B13', got 'B13'
+150 unexpected FAIL: Correct 'N5|O6', got 'M1'
+160 unexpected FAIL: Correct 'O5', got 'P7'
+
+======================= 3.3.11  =========================
+
+./regress.sh . owl.tst 
+18 unexpected PASS!
+47 unexpected PASS!
+./regress.sh . ld_owl.tst 
+302 unexpected FAIL: Correct 'critical T19 (Q19|R18)', got 'alive'
+./regress.sh . optics.tst 
+1801 unexpected FAIL: Correct '0 1 (A19|B17) B17', got '0 0'
+./regress.sh . connection.tst 
+1 unexpected PASS!
+2 unexpected FAIL: Correct '0', got '1'
+5 unexpected PASS!
+6 unexpected PASS!
+15 unexpected PASS!
+17 unexpected PASS!
+19 unexpected FAIL: Correct '0', got '1'
+65 unexpected PASS!
+70 unexpected PASS!
+75 unexpected PASS!
+78 unexpected PASS!
+83 unexpected PASS!
+84 unexpected PASS!
+85 unexpected PASS!
+86 unexpected PASS!
+90 unexpected PASS!
+./regress.sh . trevora.tst 
+420 unexpected FAIL: Correct 'J5', got 'G6'
+480 unexpected PASS!
+./regress.sh . nngs1.tst 
+24 unexpected FAIL: Correct 'L7|J5|M6', got 'E4'
+39 unexpected FAIL: Correct 'R7', got 'S3'
+51 unexpected FAIL: Correct '!K18', got 'K18'
+./regress.sh . strategy.tst 
+18 unexpected FAIL: Correct 'E4|F3', got 'E3'
+29 unexpected FAIL: Correct 'R4', got 'E16'
+40 unexpected PASS!
+50 unexpected PASS!
+./regress.sh . neurogo.tst 
+11 unexpected FAIL: Correct 'N5', got 'D4'
+./regress.sh . golife.tst 
+2 unexpected FAIL: Correct 'H5', got 'G6'
+4 unexpected PASS!
+./regress.sh . viking.tst 
+6 unexpected FAIL: Correct 'B17|B18', got 'A12'
+./regress.sh . dniwog.tst 
+7 unexpected FAIL: Correct 'B8', got 'F12'
+./regress.sh . trevorb.tst 
+230 unexpected PASS!
+360 unexpected PASS!
+440 unexpected FAIL: Correct 'E6', got 'K5'
+650 unexpected PASS!
+670 unexpected FAIL: Correct 'L5', got 'H4'
+680 unexpected PASS!
+790 unexpected PASS!
+900 unexpected PASS!
+./regress.sh . strategy2.tst 
+51 unexpected PASS!
+70 unexpected FAIL: Correct 'M15|J15|N16|J16', got 'C15'
+80 unexpected PASS!
+./regress.sh . nicklas1.tst 
+811 unexpected FAIL: Correct 'K14|K15', got 'J15'
+1213 unexpected PASS!
+./regress.sh . nicklas5.tst 
+1212 unexpected PASS!
+./regress.sh . trevor.tst 
+190 unexpected FAIL: Correct 'B7', got 'F5'
+./regress.sh . nngs.tst 
+380 unexpected PASS!
+420 unexpected FAIL: Correct '!C4|D3|C3|B3', got 'C3'
+490 unexpected PASS!
+710 unexpected FAIL: Correct '!B12', got 'B12'
+900 unexpected PASS!
+1020 unexpected FAIL: Correct 'Q2', got 'L18'
+1070 unexpected FAIL: Correct 'K17', got 'F3'
+1260 unexpected FAIL: Correct 'G18|F18', got 'B14'
+1280 unexpected PASS!
+1420 unexpected PASS!
+./regress.sh . trevorc.tst 
+820 unexpected PASS!
+860 unexpected PASS!
+870 unexpected PASS!
+940 unexpected FAIL: Correct 'G1', got 'L10'
+1000 unexpected FAIL: Correct 'N9|M11', got 'F11'
+1200 unexpected PASS!
+1370 unexpected FAIL: Correct 'B9', got 'C9'
+./regress.sh . strategy3.tst 
+114 unexpected FAIL: Correct 'D7', got 'E7'
+126 unexpected PASS!
+./regress.sh . global.tst 
+9 unexpected FAIL: Correct 'F4', got 'F2'
+10 unexpected PASS!
+./regress.sh . arend.tst 
+23 unexpected FAIL: Correct '!H10', got 'H10'
+35 unexpected PASS!
+./regress.sh . 13x13.tst 
+7 unexpected FAIL: Correct 'L7|M7|M6', got 'M1'
+12 unexpected FAIL: Correct 'G7|F7|G8', got 'H6'
+13 unexpected PASS!
+40 unexpected PASS!
+49 unexpected PASS!
+65 unexpected PASS!
+67 unexpected FAIL: Correct 'B9', got 'A11'
+./regress.sh . semeai.tst 
+21 unexpected PASS!
+22 unexpected PASS!
+./regress.sh . trevord.tst 
+180 unexpected PASS!
+360 unexpected PASS!
+500 unexpected FAIL: Correct 'E3', got 'L15'
+570 unexpected PASS!
+670 unexpected PASS!
+880 unexpected FAIL: Correct 'R7', got 'D6'
+./regress.sh . strategy4.tst 
+194 unexpected FAIL: Correct 'A13', got 'O16'
+./regress.sh . owl1.tst 
+284 unexpected PASS!
+./regress.sh . handtalk.tst 
+2 unexpected PASS!
+7 unexpected PASS!
+./regress.sh . nngs2.tst 
+10 unexpected PASS!
+140 unexpected PASS!
+510 unexpected FAIL: Correct 'E8', got 'N8'
+580 unexpected FAIL: Correct 'K19', got 'G4'
+./regress.sh . nngs3.tst 
+400 unexpected PASS!
+490 unexpected PASS!
+510 unexpected PASS!
+700 unexpected PASS!
+790 unexpected PASS!
+830 unexpected PASS!
+850 unexpected PASS!
+1110 unexpected FAIL: Correct 'B7', got 'C7'
+1190 unexpected PASS!
+./regress.sh . century2002.tst 
+150 unexpected FAIL: Correct 'B18', got 'A18'
+./regress.sh . auto02.tst 
+6 unexpected PASS!
+./regress.sh . auto_handtalk.tst 
+8 unexpected PASS!
+
+======================= 3.3.11 pre 2  =========================
+
+./regress.sh . nngs1.tst 
+8 unexpected FAIL: Correct 'M10|L9', got 'S14'
+33 unexpected FAIL: Correct '!S9', got 'S9'
+./regress.sh . strategy.tst 
+20 unexpected PASS!
+34 unexpected PASS!
+./regress.sh . neurogo.tst 
+12 unexpected PASS!
+./regress.sh . rosebud.tst 
+1 unexpected FAIL: Correct 'E16', got 'C18'
+./regress.sh . lazarus.tst 
+6 unexpected FAIL: Correct 'H3', got 'J8'
+./regress.sh . strategy2.tst 
+89 unexpected PASS!
+./regress.sh . nngs.tst 
+510 unexpected FAIL: Correct 'G14', got 'G13'
+700 unexpected PASS!
+1320 unexpected FAIL: Correct 'O18', got 'R6'
+1700 unexpected PASS!
+1800 unexpected PASS!
+./regress.sh . strategy3.tst 
+137 unexpected PASS!
+./regress.sh . global.tst 
+1 unexpected FAIL: Correct 'B3', got 'A4'
+./regress.sh . 13x13.tst 
+149 unexpected FAIL: Correct 'L7', got 'H12'
+./regress.sh . trevord.tst 
+230 unexpected FAIL: Correct 'G6', got 'L9'
+880 unexpected PASS!
+./regress.sh . strategy4.tst 
+179 unexpected FAIL: Correct 'P3|O2|P2|O4|E2', got 'O5'
+181 unexpected FAIL: Correct 'F3', got 'R9'
+./regress.sh . owl1.tst 
+282 unexpected PASS!
+./regress.sh . handtalk.tst 
+10 unexpected PASS!
+./regress.sh . nngs2.tst 
+120 unexpected PASS!
+410 unexpected PASS!
+./regress.sh . nngs3.tst 
+110 unexpected PASS!
+140 unexpected PASS!
+280 unexpected PASS!
+460 unexpected PASS!
+680 unexpected PASS!
+./regress.sh . strategy5.tst 
+224 unexpected PASS!
+225 unexpected PASS!
+234 unexpected PASS!
+./regress.sh . auto03.tst 
+12 unexpected PASS!
+./regress.sh . safety.tst 
+5 unexpected FAIL: Correct 'K8|L9|L7', got 'C15'
+./regress.sh . ninestones.tst 
+
+======================= 3.3.11 pre 1  =========================
+
+./regress.sh . reading.tst 
+175 unexpected FAIL: Correct '1 (N1|N2)', got '0'
+./regress.sh . owl_rot.tst 
+118 unexpected FAIL: Correct '0', got '1 H2'
+./regress.sh . atari_atari.tst 
+17 unexpected FAIL: Correct 'S10', got 'PASS'
+./regress.sh . connection.tst 
+95 unexpected FAIL: Correct '1 (N1|N2)', got '0'
+./regress.sh . blunder.tst 
+28 unexpected FAIL: Correct '!(C4|E1)', got 'C4'
+./regress.sh . strategy4.tst 
+157 unexpected PASS!
+209 unexpected PASS!
+./regress.sh . owl1.tst 
+267 unexpected PASS!
+283 unexpected FAIL: Correct '0', got '1 N8'
+287 unexpected PASS!
+./regress.sh . nngs2.tst 
+550 unexpected FAIL: Correct '!H19', got 'H19'
+600 unexpected FAIL: Correct 'B5', got 'D6'
+./regress.sh . nngs3.tst 
+1150 unexpected FAIL: Correct 'G13', got 'J13'
+1160 unexpected FAIL: Correct 'B1', got 'A4'
+1180 unexpected FAIL: Correct 'A6', got 'A5'
+1190 unexpected FAIL: Correct 'D17', got 'E18'
+./regress.sh . strategy5.tst 
+275 unexpected PASS!
+./regress.sh . safety.tst 
+3 unexpected FAIL: Correct 'H15|H16|G14|F13|C17', got 'M3'
+
+======================= 3.3.10 pre 3  =========================
+
+./regress.sh . owl.tst 
+66 unexpected PASS!
+109 unexpected FAIL: Correct '1 (B5|C4)', got '1 B2'
+249 unexpected PASS!
+./regress.sh . owl_rot.tst 
+66 unexpected FAIL: Correct '1 B5', got '1 D2'
+70 unexpected FAIL: Correct '1 (J2|K2|N2)', got '0'
+./regress.sh . ld_owl.tst 
+168 unexpected FAIL: Correct '1 (R19|T16|T18|T19)', got '1 Q19'
+./regress.sh . optics.tst 
+1811 unexpected PASS!
+./regress.sh . connection.tst 
+93 unexpected PASS!
+./regress.sh . trevora.tst 
+130 unexpected PASS!
+./regress.sh . nngs1.tst 
+48 unexpected FAIL: Correct 'R16', got 'F15'
+50 unexpected PASS!
+52 unexpected PASS!
+./regress.sh . strategy.tst 
+29 unexpected PASS!
+34 unexpected FAIL: Correct 'E17', got 'N15'
+45 unexpected PASS!
+50 unexpected FAIL: Correct 'Q9', got 'D9'
+./regress.sh . golife.tst 
+4 unexpected FAIL: Correct 'H5', got 'B4'
+./regress.sh . lazarus.tst 
+6 unexpected PASS!
+./regress.sh . trevorb.tst 
+130 unexpected FAIL: Correct '!J4', got 'J4'
+590 unexpected FAIL: Correct 'H12|M9', got 'E9'
+./regress.sh . strategy2.tst 
+83 unexpected PASS!
+91 unexpected PASS!
+./regress.sh . niki.tst 
+4 unexpected PASS!
+./regress.sh . trevor.tst 
+360 unexpected PASS!
+./regress.sh . nngs.tst 
+320 unexpected FAIL: Correct 'B15|B16', got 'F12'
+630 unexpected PASS!
+710 unexpected PASS!
+1520 unexpected PASS!
+./regress.sh . trevorc.tst 
+350 unexpected PASS!
+600 unexpected PASS!
+1080 unexpected PASS!
+./regress.sh . strategy3.tst 
+105 unexpected FAIL: Correct 'J2', got 'A5'
+126 unexpected FAIL: Correct 'B19', got 'H17'
+137 unexpected FAIL: Correct 'F5', got 'P3'
+./regress.sh . global.tst 
+4 unexpected PASS!
+./regress.sh . arend.tst 
+35 unexpected FAIL: Correct 'H17|J19', got 'F15'
+./regress.sh . 13x13.tst 
+20 unexpected PASS!
+28 unexpected FAIL: Correct 'L10', got 'E3'
+149 unexpected PASS!
+./regress.sh . semeai.tst 
+21 unexpected FAIL: Correct 'ALIVE DEAD (T17|T19)', got 'DEAD ALIVE PASS'
+22 unexpected FAIL: Correct 'ALIVE DEAD (L15|L17|L18)', got 'ALIVE DEAD H18'
+./regress.sh . trevord.tst 
+870 unexpected PASS!
+./regress.sh . strategy4.tst 
+168 unexpected FAIL: Correct 'A3|A4', got 'B8'
+199 unexpected PASS!
+200 unexpected FAIL: Correct 'P6|P7|Q7|S18', got 'Q8'
+./regress.sh . owl1.tst 
+284 unexpected FAIL: Correct '1 (M7|H7)', got '1 K5'
+285 unexpected FAIL: Correct '1 B3', got '3 B5'
+286 unexpected FAIL: Correct '1 B3', got '2 A3'
+./regress.sh . handtalk.tst 
+13 unexpected PASS!
+./regress.sh . nngs2.tst 
+110 unexpected PASS!
+150 unexpected FAIL: Correct 'M3|L3', got 'M2'
+400 unexpected PASS!
+./regress.sh . nngs3.tst 
+230 unexpected FAIL: Correct '!L12', got 'L12'
+290 unexpected PASS!
+330 unexpected FAIL: Correct 'P12|Q11', got 'S9'
+400 unexpected FAIL: Correct 'N13', got 'Q15'
+460 unexpected FAIL: Correct 'N17|M17|Q17|Q18', got 'G15'
+680 unexpected FAIL: Correct '!G12', got 'G12'
+./regress.sh . strategy5.tst 
+277 unexpected PASS!
+./regress.sh . auto04.tst 
+2 unexpected PASS!
+./regress.sh . safety.tst 
+1 unexpected PASS!
+3 unexpected PASS!
+4 unexpected PASS!
+7 unexpected PASS!
+
+======================= 3.3.10 pre 2  =========================
+
+./regress.sh . owl.tst 
+23 unexpected PASS!
+180 unexpected PASS!
+262 unexpected FAIL: Correct '0', got '1 E8'
+./regress.sh . nngs1.tst 
+8 unexpected PASS!
+35 unexpected PASS!
+./regress.sh . neurogo.tst 
+12 unexpected FAIL: Correct 'B10', got 'S8'
+./regress.sh . viking.tst 
+10 unexpected PASS!
+./regress.sh . trevorb.tst 
+690 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1213 unexpected FAIL: Correct 'N4', got 'F12'
+./regress.sh . nngs.tst 
+300 unexpected PASS!
+./regress.sh . 13x13.tst 
+15 unexpected FAIL: Correct 'C7|B7|C6|B6|B5|C5', got 'E8'
+16 unexpected PASS!
+21 unexpected PASS!
+149 unexpected FAIL: Correct 'L7', got 'L9'
+./regress.sh . semeai.tst 
+./regress.sh . trevord.tst 
+./regress.sh . strategy4.tst 
+./regress.sh . owl1.tst 
+283 unexpected PASS!
+./regress.sh . nngs3.tst 
+670 unexpected PASS!
+680 unexpected PASS!
+750 unexpected FAIL: Correct 'L17|L18', got 'K18'
+./regress.sh . century2002.tst 
+200 unexpected PASS!
+261 unexpected PASS!
+./regress.sh . safety.tst 
+2 unexpected PASS!
+5 unexpected PASS!
+
+======================= 3.3.10 pre 1  =========================
+
+./regress.sh . reading.tst 
+37 unexpected PASS!
+140 unexpected PASS!
+170 unexpected PASS!
+./regress.sh . owl.tst 
+237 unexpected PASS!
+./regress.sh . trevora.tst 
+480 unexpected FAIL: Correct 'E4', got 'C4'
+./regress.sh . nngs1.tst 
+26 unexpected PASS!
+50 unexpected FAIL: Correct 'O10', got 'N17'
+./regress.sh . endgame.tst 
+218 unexpected PASS!
+603 unexpected FAIL: Correct 'C1', got 'G6'
+604 unexpected FAIL: Correct 'D1', got 'G6'
+./regress.sh . trevorb.tst 
+110 unexpected PASS!
+270 unexpected PASS!
+700 unexpected PASS!
+740 unexpected FAIL: Correct '!H10', got 'H10'
+./regress.sh . nicklas2.tst 
+601 unexpected PASS!
+./regress.sh . trevor.tst 
+180 unexpected PASS!
+./regress.sh . nngs.tst 
+1010 unexpected PASS!
+./regress.sh . trevorc.tst 
+170 unexpected FAIL: Correct 'H5', got 'H8'
+280 unexpected PASS!
+560 unexpected FAIL: Correct 'K2|M1', got 'E12'
+650 unexpected PASS!
+1510 unexpected PASS!
+./regress.sh . 13x13.tst 
+41 unexpected FAIL: Correct '!C8', got 'C8'
+./regress.sh . trevord.tst 
+970 unexpected PASS!
+1090 unexpected PASS!
+./regress.sh . nngs2.tst 
+70 unexpected PASS!
+430 unexpected PASS!
+490 unexpected PASS!
+510 unexpected PASS!
+./regress.sh . nngs3.tst 
+450 unexpected PASS!
+630 unexpected PASS!
+./regress.sh . century2002.tst 
+85 unexpected PASS!
+210 unexpected PASS!
+220 unexpected PASS!
+260 unexpected PASS!
+
+========================== 3.3.9 ============================   
+
+./regress.sh . atari_atari.tst 
+16 unexpected PASS!
+./regress.sh . trevorc.tst 
+1540 unexpected PASS!
+
+
+======================= 3.3.9 pre 3  =========================   
+
+./regress.sh . reading.tst 
+173 unexpected FAIL: Correct '1 (A2|C7|B1)', got '0'
+./regress.sh . connection.tst 
+94 unexpected FAIL: Correct '1 D9', got '0'
+./regress.sh . nngs1.tst 
+8 unexpected FAIL: Correct 'M10|L9', got 'S14'
+./regress.sh . strategy2.tst 
+93 unexpected FAIL: Correct 'D11', got 'G12'
+./regress.sh . nngs.tst 
+1700 unexpected FAIL: Correct '!J18', got 'J18'
+./regress.sh . owl1.tst 
+280 unexpected FAIL: Correct '1 F4', got '0'
+281 unexpected FAIL: Correct '1 O12', got '0'
+282 unexpected FAIL: Correct '1 .*', got '0'
+283 unexpected FAIL: Correct '0', got '1 N8'
+./regress.sh . nngs2.tst 
+480 unexpected FAIL: Correct '!H4', got 'H4'
+490 unexpected FAIL: Correct '!R14', got 'R14'
+510 unexpected FAIL: Correct 'E8', got 'K12'
+520 unexpected FAIL: Correct 'D9', got 'T11'
+530 unexpected FAIL: Correct 'A11|B8', got 'C4'
+540 unexpected FAIL: Correct 'B8|B9', got 'C12'
+./regress.sh . nngs3.tst 
+420 unexpected PASS!
+1130 unexpected FAIL: Correct 'S7', got 'T6'
+./regress.sh . century2002.tst 
+130 unexpected PASS!
+170 unexpected FAIL: Correct '0', got '1'
+261 unexpected FAIL: Correct '0', got '1 L11'
+270 unexpected PASS!
+./regress.sh . safety.tst 
+6 unexpected FAIL: Correct 'K6|K7|J6|J7|H4|H3|L5', got 'D8'
+7 unexpected FAIL: Correct 'L5|L6|K6|M5|M3|K7|K6', got 'D13'
+
+======================= 3.3.9 pre 2  =========================   
+
+./regress.sh . owl.tst
+23 unexpected FAIL: Correct '0', got '1 S10'
+262 unexpected PASS!
+./regress.sh . owl_rot.tst
+244 unexpected PASS!
+245 unexpected PASS!
+./regress.sh . atari_atari.tst
+16 unexpected FAIL: Correct 'K3', got 'A1' 
+./regress.sh . blunder.tst
+23 unexpected FAIL: Correct '!F4|F5|F6', got 'F6'
+24 unexpected FAIL: Correct '!P5', got 'P5'
+25 unexpected FAIL: Correct '!P9|M5|T9', got 'P9'
+26 unexpected FAIL: Correct '!D19|F17', got 'D19'
+27 unexpected FAIL: Correct '!R3', got 'R3'
+./regress.sh . strategy.tst
+10 unexpected PASS!
+29 unexpected FAIL: Correct 'R4', got 'E16'
+./regress.sh . rosebud.tst
+1 unexpected PASS!
+./regress.sh . lazarus.tst
+6 unexpected FAIL: Correct 'H3', got 'H2'  
+15 unexpected FAIL: Correct 'Q15|T5|H5|H3', got 'S13'
+./regress.sh . trevorb.tst
+270 unexpected FAIL: Correct 'G11', got 'G4'
+./regress.sh . strategy2.tst
+82 unexpected PASS!
+./regress.sh . nicklas2.tst
+701 unexpected FAIL: Correct 'F1', got 'B5'
+./regress.sh . nngs.tst
+150 unexpected PASS!
+160 unexpected PASS!
+170 unexpected PASS!
+320 unexpected PASS!
+500 unexpected PASS!
+510 unexpected PASS!
+1700 unexpected PASS!
+1800 unexpected FAIL: Correct '!H5|G4|F6|F7', got 'G4'
+./regress.sh . trevorc.tst
+560 unexpected PASS!
+1080 unexpected FAIL: Correct '!L8|K10|K9', got 'L8'
+./regress.sh . strategy3.tst
+111 unexpected FAIL: Correct 'K3', got 'P3'
+./regress.sh . global.tst
+14 unexpected PASS!
+./regress.sh . 13x13.tst
+16 unexpected FAIL: Correct 'C6|C5', got 'J4'
+40 unexpected FAIL: Correct 'K13', got 'M12'
+43 unexpected PASS!
+149 unexpected PASS!
+63 unexpected PASS!
+65 unexpected FAIL: Correct 'H4', got 'L4' 
+./regress.sh . trevord.tst
+340 unexpected FAIL: Correct 'H10', got 'F8'
+./regress.sh . strategy4.tst
+199 unexpected FAIL: Correct 'N5|S18', got 'B2'
+216 unexpected PASS!
+./regress.sh . owl1.tst
+269 unexpected PASS!
+277 unexpected FAIL: Correct '1 PASS', got '0'
+./regress.sh . handtalk.tst
+3 unexpected PASS!
+8 unexpected PASS!
+./regress.sh . nngs2.tst
+10 unexpected FAIL: Correct '!H6', got 'H6'
+110 unexpected FAIL: Correct 'B14|B13', got 'L15'
+150 unexpected PASS!
+400 unexpected FAIL: Correct 'D10', got 'B8'
+410 unexpected FAIL: Correct 'D7', got 'F15'
+430 unexpected FAIL: Correct 'M11', got 'M15'
+440 unexpected FAIL: Correct 'B18|C18|E16|E18|F16|F17', got 'B19'
+450 unexpected FAIL: Correct 'E14|D15|E16', got 'D12'
+460 unexpected FAIL: Correct 'J4|K2|K3|K4|K5|L2', got 'J9'
+470 unexpected FAIL: Correct 'H6|H5|H3', got 'J9'
+./regress.sh . nngs3.tst
+460 unexpected PASS!
+510 unexpected FAIL: Correct 'P4', got 'N3'
+700 unexpected FAIL: Correct 'Q2', got 'P7'
+./regress.sh . strategy5.tst
+232 unexpected PASS!
+273 unexpected FAIL: Correct 'E8|E9|F9|E7|F6|E6|D7|C7', got 'F8'
+274 unexpected FAIL: Correct '!L5|M5|N5', got 'L5'
+275 unexpected FAIL: Correct 'A18', got 'PASS'
+277 unexpected FAIL: Correct 'R19', got 'O18'
+./regress.sh . century2002.tst
+130 unexpected FAIL: Correct 'N4', got 'P9'
+./regress.sh . auto04.tst
+2 unexpected FAIL: Correct '!0', got '0'   
+./regress.sh . safety.tst
+1 unexpected FAIL: Correct 'R6|S2', got 'O14'
+
+======================= 3.3.9 pre 1  =========================   
+
+./regress.sh . owl.tst
+229 unexpected PASS!
+./regress.sh . owl_rot.tst
+170 unexpected PASS!
+./regress.sh . filllib.tst
+39 unexpected PASS!
+./regress.sh . trevora.tst
+520 unexpected PASS!
+530 unexpected FAIL: Correct 'H4', got 'F2'
+550 unexpected FAIL: Correct '1 F2', got '0'
+./regress.sh . nngs1.tst
+26 unexpected FAIL: Correct 'P3', got 'Q3' 
+30 unexpected PASS!
+46 unexpected PASS!
+./regress.sh . neurogo.tst
+13 unexpected PASS!
+./regress.sh . rosebud.tst
+1 unexpected FAIL: Correct 'E16', got 'C18'
+./regress.sh . lazarus.tst
+6 unexpected PASS!
+16 unexpected PASS!
+./regress.sh . trevorb.tst
+380 unexpected FAIL: Correct 'K4', got 'L5'
+660 unexpected PASS!
+./regress.sh . strategy2.tst
+60 unexpected FAIL: Correct 'H7', got 'D10'
+./regress.sh . nicklas1.tst
+1801 unexpected PASS!
+./regress.sh . nicklas2.tst
+701 unexpected PASS!
+./regress.sh . nicklas5.tst
+1212 unexpected FAIL: Correct 'dead', got 'critical M14 M15'
+./regress.sh . trevor.tst
+262 unexpected PASS!
+./regress.sh . nngs.tst
+500 unexpected FAIL: Correct 'J17', got 'Q1'
+510 unexpected FAIL: Correct 'G14', got 'Q1'
+600 unexpected PASS!
+1700 unexpected FAIL: Correct '!J18', got 'J18'
+./regress.sh . trevorc.tst
+940 unexpected PASS!
+./regress.sh . strategy3.tst
+122 unexpected PASS!
+./regress.sh . global.tst
+14 unexpected FAIL: Correct 'S9', got 'E1' 
+31 unexpected FAIL: Correct 'M8', got 'F11'
+32 unexpected FAIL: Correct 'G8', got 'E13'
+38 unexpected PASS!
+./regress.sh . vie.tst
+50 unexpected PASS!
+./regress.sh . arend.tst
+29 unexpected FAIL: Correct 'B14|C14', got 'F15'
+./regress.sh . trevord.tst
+120 unexpected PASS!
+1070 unexpected FAIL: Correct 'R13', got 'Q12'
+./regress.sh . nngs2.tst
+40 unexpected PASS!
+220 unexpected FAIL: Correct 'S9', got 'T11'
+230 unexpected FAIL: Correct 'G17', got 'F18'
+250 unexpected FAIL: Correct 'T18', got 'N5'
+260 unexpected FAIL: Correct 'S18', got 'T12'
+270 unexpected FAIL: Correct 'S19', got 'T13'
+280 unexpected FAIL: Correct '!A13', got 'A13'
+290 unexpected FAIL: Correct 'C17|B16', got 'C18'
+300 unexpected FAIL: Correct '!Q13', got 'Q13'
+./regress.sh . strategy5.tst
+232 unexpected FAIL: Correct 'D11|E11', got 'C7'
+./regress.sh . auto01.tst
+1 unexpected PASS!
+2 unexpected PASS!
+3 unexpected PASS!
+./regress.sh . auto04.tst
+2 unexpected PASS!
+./regress.sh . auto_handtalk.tst
+7 unexpected FAIL: Correct 'ALIVE DEAD (O18|O17|P17)', got 'ALIVE DEAD N18'
+./regress.sh . safety.tst
+5 unexpected FAIL: Correct 'K8|L9|L7', got 'C15'
+
+======================= 3.3.7 and 3.3.8 =========================   
+
+./regress.sh . blunder.tst 
+21 unexpected PASS!
+./regress.sh . nngs1.tst 
+40 unexpected FAIL: Correct 'R6', got 'H16'
+./regress.sh . strategy.tst 
+18 unexpected PASS!
+./regress.sh . nicklas5.tst 
+1202 unexpected PASS!
+1203 unexpected FAIL: Correct 'K18|N18|N19|M19', got 'L19'
+./regress.sh . trevor.tst 
+180 unexpected FAIL: Correct '!A8', got 'A8'
+./regress.sh . nngs.tst 
+390 unexpected PASS!
+600 unexpected FAIL: Correct 'H6', got 'J6'
+1560 unexpected PASS!
+./regress.sh . global.tst 
+1 unexpected PASS!
+./regress.sh . trevord.tst 
+1060 unexpected PASS!
+./regress.sh . handtalk.tst 
+21 unexpected PASS!
+./regress.sh . nngs2.tst 
+1 unexpected FAIL: Correct 'B1|A2', got 'A4'
+70 unexpected FAIL: Correct '!L18', got 'L18'
+./regress.sh . century2002.tst 
+95 unexpected PASS!
+
+======================= 3.3.7 pre 1  =========================   
+
+./regress.sh . reading.tst 
+171 unexpected PASS!
+./regress.sh . owl.tst 
+262 unexpected FAIL: Correct '0', got '1 E8'
+./regress.sh . trevora.tst 
+270 unexpected PASS!
+./regress.sh . rosebud.tst 
+1 unexpected PASS!
+./regress.sh . lazarus.tst 
+5 unexpected FAIL: Correct 'R13', got 'N11'
+14 unexpected FAIL: Correct 'Q15|T5|H5', got 'Q14'
+./regress.sh . nicklas2.tst 
+2401 unexpected PASS!
+./regress.sh . nicklas4.tst 
+1201 unexpected PASS!
+./regress.sh . tactics.tst 
+5 unexpected PASS!
+./regress.sh . nngs.tst 
+600 unexpected PASS!
+880 unexpected PASS!
+890 unexpected PASS!
+1480 unexpected PASS!
+1910 unexpected PASS!
+./regress.sh . trevorc.tst 
+1530 unexpected PASS!
+./regress.sh . global.tst 
+34 unexpected FAIL: Correct 'N6', got 'L6'
+./regress.sh . nngs2.tst 
+1 unexpected PASS!
+60 unexpected PASS!
+100 unexpected PASS!
+./regress.sh . century2002.tst 
+35 unexpected PASS!
+40 unexpected PASS!
+150 unexpected PASS!
+
+======================= 3.3.6 =========================
+
+./regress.sh . owl.tst 
+18 unexpected FAIL: Correct '1 A2', got '1 B2'
+47 unexpected FAIL: Correct '1 (E3|F1)', got '1 D2'
+65 unexpected PASS!
+66 unexpected FAIL: Correct '1 B5', got '1 D2'
+./regress.sh . ld_owl.tst 
+161 unexpected FAIL: Correct 'dead', got 'alive'
+182 unexpected PASS!
+./regress.sh . connection.tst 
+18 unexpected PASS!
+19 unexpected PASS!
+90 unexpected FAIL: Correct '0', got '1'
+./regress.sh . trevora.tst 
+480 unexpected PASS!
+./regress.sh . nngs1.tst 
+10 unexpected PASS!
+30 unexpected FAIL: Correct 'P17|O18', got 'C15'
+39 unexpected PASS!
+./regress.sh . neurogo.tst 
+8 unexpected PASS!
+13 unexpected FAIL: Correct '!P7', got 'P7'
+28 unexpected PASS!
+./regress.sh . rosebud.tst 
+1 unexpected FAIL: Correct 'E16', got 'C16'
+./regress.sh . golife.tst 
+1 unexpected PASS!
+./regress.sh . viking.tst 
+12 unexpected FAIL: Correct 'S14|S15', got 'R15'
+./regress.sh . trevorb.tst 
+220 unexpected FAIL: Correct 'J3', got 'F3'
+380 unexpected PASS!
+390 unexpected PASS!
+./regress.sh . strategy2.tst 
+100 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1405 unexpected PASS!
+1801 unexpected FAIL: Correct 'D2', got 'D5'
+./regress.sh . nicklas4.tst 
+809 unexpected PASS!
+./regress.sh . nngs.tst 
+690 unexpected PASS!
+./regress.sh . trevorc.tst 
+890 unexpected PASS!
+1580 unexpected PASS!
+./regress.sh . strategy3.tst 
+101 unexpected PASS!
+./regress.sh . global.tst 
+10 unexpected FAIL: Correct 'A5', got 'H10'
+34 unexpected PASS!
+41 unexpected FAIL: Correct 'B4', got 'A9'
+./regress.sh . vie.tst 
+37 unexpected PASS!
+41 unexpected FAIL: Correct '1 B4', got '1 A9'
+50 unexpected FAIL: Correct '1 H15', got '1 G15'
+./regress.sh . arend.tst 
+29 unexpected PASS!
+33 unexpected PASS!
+./regress.sh . 13x13.tst 
+40 unexpected PASS!
+./regress.sh . trevord.tst 
+180 unexpected FAIL: Correct 'S9', got 'P5'
+1050 unexpected PASS!
+./regress.sh . strategy4.tst 
+199 unexpected PASS!
+./regress.sh . nngs2.tst 
+40 unexpected FAIL: Correct '!K18', got 'K18'
+120 unexpected FAIL: Correct 'E12|D13', got 'P18'
+130 unexpected FAIL: Correct 'S13', got 'Q18'
+140 unexpected FAIL: Correct 'P5', got 'Q6'
+150 unexpected FAIL: Correct 'M3|L3', got 'M2'
+160 unexpected FAIL: Correct 'J14', got 'L19'
+190 unexpected PASS!
+200 unexpected PASS!
+./regress.sh . strategy5.tst 
+227 unexpected PASS!
+228 unexpected PASS!
+230 unexpected FAIL: Correct 'H9', got 'J12'
+231 unexpected FAIL: Correct 'J2|J3', got 'J17'
+233 unexpected FAIL: Correct 'E13', got 'Q14'
+234 unexpected FAIL: Correct 'H14', got 'R11'
+236 unexpected FAIL: Correct 'R12', got 'R8'
+./regress.sh . century-2002.tst 
+35 unexpected FAIL: Correct '!C13', got 'C13'
+40 unexpected FAIL: Correct 'J3', got 'M15'
+50 unexpected FAIL: Correct 'F7', got 'O13'
+55 unexpected FAIL: Correct 'F7', got 'H2'
+60 unexpected FAIL: Correct 'Q14', got 'R18'
+70 unexpected FAIL: Correct 'J11|K11', got 'D18'
+80 unexpected FAIL: Correct '1 C17', got '0'
+85 unexpected FAIL: Correct 'N9', got 'K13'
+90 unexpected FAIL: Correct 'A17', got 'B19'
+95 unexpected FAIL: Correct '!A19', got 'A19'
+110 unexpected FAIL: Correct 'C8', got 'N3'
+140 unexpected FAIL: Correct 'J3|R4|P5', got 'M5'
+150 unexpected FAIL: Correct 'B18', got 'B16'
+160 unexpected FAIL: Correct 'B7', got 'B8'
+170 unexpected FAIL: Correct 'J10', got 'J8'
+180 unexpected FAIL: Correct 'T9', got 'O11'
+190 unexpected FAIL: Correct 'D3', got 'S17'
+200 unexpected FAIL: Correct 'F6', got 'L6'
+210 unexpected FAIL: Correct '!A15', got 'A15'
+220 unexpected FAIL: Correct '!T3', got 'T3'
+260 unexpected FAIL: Correct 'S12|Q12', got 'Q13'
+270 unexpected FAIL: Correct 'O7', got 'S2'
+
+======================= 3.3.6 pre 1  =========================
+
+./regress.sh . owl.tst 
+18 unexpected FAIL: Correct '1 A2', got '1 B2'
+./regress.sh . connection.tst 
+19 unexpected PASS!
+90 unexpected FAIL: Correct '0', got '1'
+./regress.sh . nngs1.tst 
+39 unexpected PASS!
+./regress.sh . trevorb.tst 
+220 unexpected FAIL: Correct 'J3', got 'F3'
+380 unexpected PASS!
+390 unexpected PASS!
+./regress.sh . strategy2.tst 
+100 unexpected PASS!
+./regress.sh . nicklas4.tst 
+809 unexpected PASS!
+./regress.sh . nngs.tst 
+690 unexpected PASS!
+./regress.sh . strategy3.tst 
+101 unexpected PASS!
+./regress.sh . global.tst 
+10 unexpected FAIL: Correct 'A5', got 'H10'
+40 unexpected PASS!
+./regress.sh . vie.tst 
+37 unexpected PASS!
+50 unexpected FAIL: Correct '1 H15', got '1 G15'
+./regress.sh . arend.tst 
+33 unexpected PASS!
+./regress.sh . 13x13.tst 
+40 unexpected PASS!
+./regress.sh . trevord.tst 
+180 unexpected FAIL: Correct 'S9', got 'P5'
+1050 unexpected PASS!
+./regress.sh . strategy4.tst 
+166 unexpected FAIL: Correct 'D11', got 'D8'
+./regress.sh . strategy5.tst 
+228 unexpected PASS!
+
+
+======================= 3.3.5 =========================
+
+./regress.sh . reading.tst 
+169 unexpected FAIL: Correct '0', got '1 F13'
+./regress.sh . owl.tst 
+66 unexpected PASS!
+./regress.sh . nngs1.tst 
+28 unexpected PASS!
+./regress.sh . viking.tst 
+7 unexpected PASS!
+./regress.sh . lazarus.tst 
+16 unexpected FAIL: Correct '!L17|J5|K5|K6', got 'L17'
+./regress.sh . trevorb.tst 
+620 unexpected FAIL: Correct '!J10', got 'J10'
+660 unexpected FAIL: Correct 'D3', got 'H5'
+./regress.sh . strategy2.tst 
+73 unexpected PASS!
+./regress.sh . nicklas1.tst 
+502 unexpected PASS!
+./regress.sh . nicklas4.tst 
+1201 unexpected FAIL: Correct 'Q9', got 'S7'
+./regress.sh . trevor.tst 
+15 unexpected PASS!
+380 unexpected PASS!
+./regress.sh . trevorc.tst 
+770 unexpected PASS!
+890 unexpected FAIL: Correct 'J10', got 'G12'
+1480 unexpected FAIL: Correct 'A8', got 'F6'
+1530 unexpected FAIL: Correct 'A9', got 'G5'
+./regress.sh . global.tst 
+46 unexpected PASS!
+./regress.sh . arend.tst 
+17 unexpected PASS!
+./regress.sh . 13x13.tst 
+65 unexpected PASS!
+./regress.sh . semeai.tst 
+32 unexpected PASS!
+37 unexpected PASS!
+./regress.sh . trevord.tst 
+310 unexpected FAIL: Correct 'S17', got 'Q13'
+./regress.sh . owl1.tst 
+268 unexpected FAIL: Correct '2 A1', got '0'
+
+After compiling 3.3.4 with --experimental-semeai we get the following
+results. For discussion of particular failures see:
+
+http://mail.gnu.org/pipermail/gnugo-devel/2002-June/002205.html
+
+./regress.sh . strategy.tst 
+45 unexpected PASS!
+./regress.sh . lazarus.tst 
+16 unexpected FAIL: Correct '!L17|J5|K5|K6', got 'L17'
+./regress.sh . trevorb.tst 
+430 unexpected PASS!
+./regress.sh . strategy2.tst 
+72 unexpected PASS!
+73 unexpected PASS!
+75 unexpected FAIL: Correct 'Q11', got 'F7'
+76 unexpected FAIL: Correct 'Q11', got 'F7'
+80 unexpected PASS!
+93 unexpected FAIL: Correct 'D11', got 'C11'
+./regress.sh . nicklas1.tst 
+301 unexpected FAIL: Correct 'H3|H6', got 'J8'
+./regress.sh . trevor.tst 
+461 unexpected PASS!
+./regress.sh . nngs.tst 
+290 unexpected PASS!
+2040 unexpected PASS!
+./regress.sh . strategy3.tst 
+113 unexpected FAIL: Correct 'P1', got 'S9'
+135 unexpected PASS!
+./regress.sh . global.tst 
+46 unexpected PASS!
+./regress.sh . strategy4.tst 
+188 unexpected PASS!
+./regress.sh . nngs2.tst 
+50 unexpected FAIL: Correct 'K2', got 'N1'
+60 unexpected PASS!
+
+======================= 3.3.4 =========================
+
+./regress.sh . owl_rot.tst 
+66 unexpected PASS!
+./regress.sh . nngs1.tst 
+2 unexpected PASS!
+30 unexpected PASS!
+./regress.sh . strategy.tst 
+10 unexpected FAIL: Correct 'Q7', got 'Q8'
+34 unexpected PASS!
+50 unexpected PASS!
+./regress.sh . lazarus.tst 
+5 unexpected PASS!
+13 unexpected PASS!
+15 unexpected PASS!
+./regress.sh . trevorb.tst 
+270 unexpected PASS!
+920 unexpected PASS!
+930 unexpected PASS!
+./regress.sh . strategy2.tst 
+64 unexpected PASS!
+83 unexpected FAIL: Correct 'P14', got 'H17'
+./regress.sh . nicklas1.tst 
+502 unexpected FAIL: Correct 'G5', got 'H7'
+1207 unexpected FAIL: Correct 'C17', got 'R12'
+./regress.sh . nicklas5.tst 
+1202 unexpected FAIL: Correct '!L17', got 'L17'
+./regress.sh . manyfaces.tst 
+1 unexpected FAIL: Correct 'S13', got 'D18'
+7 unexpected PASS!
+./regress.sh . trevor.tst 
+190 unexpected PASS!
+420 unexpected PASS!
+./regress.sh . nngs.tst 
+320 unexpected FAIL: Correct 'B15|B16', got 'N3'
+1160 unexpected FAIL: Correct '!A8', got 'A8'
+./regress.sh . trevorc.tst 
+350 unexpected FAIL: Correct 'E3', got 'J4'
+610 unexpected PASS!
+990 unexpected PASS!
+1050 unexpected PASS!
+1080 unexpected PASS!
+1530 unexpected PASS!
+./regress.sh . strategy3.tst 
+111 unexpected PASS!
+./regress.sh . global.tst 
+17 unexpected PASS!
+./regress.sh . 13x13.tst 
+39 unexpected PASS!
+41 unexpected PASS!
+./regress.sh . trevord.tst 
+340 unexpected PASS!
+940 unexpected PASS!
+./regress.sh . strategy4.tst 
+181 unexpected PASS!
+218 unexpected PASS!
+220 unexpected PASS!
+./regress.sh . owl1.tst 
+267 unexpected FAIL: Correct '2 R3', got '0'
+
+======================= 3.3.3 =========================
+
+./regress.sh . owl.tst 
+262 unexpected PASS!
+./regress.sh . connection.tst 
+62 unexpected PASS!
+./regress.sh . trevora.tst 
+290 unexpected FAIL: Correct '!C8', got 'C8'
+./regress.sh . nngs1.tst 
+30 unexpected FAIL: Correct 'P17|O18', got 'N18'
+./regress.sh . strategy.tst 
+29 unexpected PASS!
+34 unexpected FAIL: Correct 'E17', got 'R6'
+./regress.sh . viking.tst 
+7 unexpected FAIL: Correct '!T7', got 'T7'
+./regress.sh . trevorb.tst 
+300 unexpected PASS!
+660 unexpected PASS!
+./regress.sh . nngs.tst 
+240 unexpected FAIL: Correct '!T6', got 'T6'
+320 unexpected PASS!
+400 unexpected PASS!
+1260 unexpected PASS!
+./regress.sh . trevorc.tst 
+1440 unexpected FAIL: Correct 'E12|F11', got 'E10'
+1570 unexpected PASS!
+1620 unexpected PASS!
+./regress.sh . global.tst 
+8 unexpected PASS!
+9 unexpected PASS!
+31 unexpected PASS!
+34 unexpected FAIL: Correct 'N6', got 'L6'
+./regress.sh . arend.tst 
+29 unexpected FAIL: Correct 'B14|C14', got 'F15'
+./regress.sh . 13x13.tst 
+15 unexpected PASS!
+36 unexpected PASS!
+39 unexpected FAIL: Correct 'H4|J4', got 'E2'
+./regress.sh . trevord.tst 
+800 unexpected FAIL: Correct 'Q9', got 'T12'
+./regress.sh . strategy4.tst 
+181 unexpected FAIL: Correct 'F3', got 'O8'
+./regress.sh . owl1.tst 
+265 unexpected FAIL: Correct '1 S16', got '1 R14'
+./regress.sh . handtalk.tst 
+18 unexpected PASS!
+./regress.sh . nngs2.tst 
+1 unexpected FAIL: Correct 'B1|A2', got 'A4'
+20 unexpected FAIL: Correct 'H11', got 'L6'
+30 unexpected FAIL: Correct 'L16|M16', got 'O12'
+60 unexpected FAIL: Correct '!P1', got 'P1'
+80 unexpected FAIL: Correct 'O4|P1', got 'C12'
+
+======================= 3.3.3 pre 1 =========================
+
+./regress.sh . owl.tst 
+23 unexpected PASS!
+66 unexpected FAIL: Correct '1 B5', got '1 D2'
+208 unexpected FAIL: Correct '3 A2', got '2 F1'
+./regress.sh . owl_rot.tst 
+66 unexpected FAIL: Correct '1 B5', got '1 D2'
+./regress.sh . nngs1.tst 
+30 unexpected PASS!
+45 unexpected PASS!
+47 unexpected PASS!
+48 unexpected PASS!
+50 unexpected PASS!
+53 unexpected PASS!
+./regress.sh . strategy.tst 
+18 unexpected FAIL: Correct 'E4|F3', got 'N11'
+20 unexpected FAIL: Correct 'Q11', got 'C11'
+29 unexpected FAIL: Correct 'R4', got 'E16'
+./regress.sh . neurogo.tst 
+11 unexpected PASS!
+20 unexpected PASS!
+./regress.sh . lazarus.tst 
+4 unexpected FAIL: Correct 'R12|Q12|M8', got 'T5'
+6 unexpected FAIL: Correct 'H3', got 'J8'
+14 unexpected PASS!
+15 unexpected FAIL: Correct 'Q15|T5|H5|H3', got 'S13'
+16 unexpected PASS!
+./regress.sh . strategy2.tst 
+64 unexpected FAIL: Correct 'B13|C13|C12|E14|D14', got 'P12'
+83 unexpected PASS!
+./regress.sh . nicklas1.tst 
+1405 unexpected FAIL: Correct 'B7', got 'B6'
+./regress.sh . manyfaces.tst 
+7 unexpected FAIL: Correct 'R2|S7', got 'H3'
+./regress.sh . trevor.tst 
+220 unexpected PASS!
+./regress.sh . nngs.tst 
+1700 unexpected PASS!
+./regress.sh . trevorc.tst 
+1080 unexpected FAIL: Correct '!L8|K10|K9', got 'L8'
+1440 unexpected PASS!
+./regress.sh . strategy3.tst 
+105 unexpected PASS!
+./regress.sh . global.tst 
+7 unexpected FAIL: Correct 'A5', got 'G9'
+34 unexpected PASS!
+./regress.sh . arend.tst 
+29 unexpected PASS!
+./regress.sh . 13x13.tst 
+39 unexpected PASS!
+40 unexpected FAIL: Correct 'K13', got 'B9'
+./regress.sh . semeai.tst 
+./regress.sh . trevord.tst 
+360 unexpected FAIL: Correct 'K3|K4', got 'K9'
+./regress.sh . strategy4.tst 
+./regress.sh . owl1.tst 
+263 unexpected FAIL: Correct '1 R11', got '0'
+264 unexpected FAIL: Correct '2 A18', got '0'
+./regress.sh . strategy5.tst 
+221 unexpected FAIL: Correct 'S4|C11', got 'Q7'
+222 unexpected FAIL: Correct 'R14', got 'O16'
+223 unexpected FAIL: Correct 'P16', got 'Q7'
+224 unexpected FAIL: Correct 'N15', got 'B9'
+225 unexpected FAIL: Correct 'N15', got 'B9'
+
+======================= 3.3.2 =========================
+
+./regress.sh . owl.tst 
+259 unexpected FAIL: Correct '0', got '1'
+260 unexpected FAIL: Correct '0', got '1'
+261 unexpected FAIL: Correct '1 (O6|Q7|T4|T5|R4)', got '0'
+./regress.sh . filllib.tst 
+37 unexpected PASS!
+./regress.sh . connection.tst 
+81 unexpected FAIL: Correct '1 O5', got '0'
+82 unexpected FAIL: Correct '0', got '1'
+./regress.sh . blunder.tst 
+20 unexpected FAIL: Correct 'P11', got 'O9'
+21 unexpected FAIL: Correct 'L9', got 'P10'
+./regress.sh . nngs1.tst 
+56 unexpected FAIL: Correct 'H4', got 'J6'
+57 unexpected FAIL: Correct 'J4|J5', got 'J2'
+./regress.sh . strategy.tst 
+34 unexpected PASS!
+./regress.sh . endgame.tst 
+211 unexpected PASS!
+./regress.sh . rosebud.tst 
+1 unexpected PASS!
+./regress.sh . lazarus.tst 
+4 unexpected PASS!
+./regress.sh . handtalk.tst 
+1 unexpected FAIL: Correct 'R12|R13|R14|R8|R7|R6', got 'G7'
+2 unexpected FAIL: Correct 'P5|Q2|R2', got 'E13'
+3 unexpected FAIL: Correct '!F18', got 'F18'
+4 unexpected FAIL: Correct 'Q2', got 'B13'
+7 unexpected FAIL: Correct 'R4', got 'P4'
+8 unexpected FAIL: Correct '!G14', got 'G14'
+9 unexpected FAIL: Correct 'J17', got 'C9'
+10 unexpected FAIL: Correct 'E9|F8|D8', got 'L5'
+11 unexpected FAIL: Correct 'C11|D10', got 'B9'
+12 unexpected FAIL: Correct 'G9|K8|J9|K9', got 'P18'
+13 unexpected FAIL: Correct '!P14', got 'P14'
+14 unexpected FAIL: Correct 'K4', got 'O19'
+15 unexpected FAIL: Correct 'J3', got 'M19'
+16 unexpected FAIL: Correct 'J18', got 'E18'
+17 unexpected FAIL: Correct 'B4|B6', got 'J4'
+./regress.sh . trevorb.tst 
+300 unexpected FAIL: Correct 'F2', got 'F13'
+600 unexpected FAIL: Correct 'F2|F3', got 'N7'
+./regress.sh . strategy2.tst 
+70 unexpected PASS!
+90 unexpected PASS!
+./regress.sh . nicklas2.tst 
+2103 unexpected FAIL: Correct 'PASS', got 'C1'
+./regress.sh . nicklas3.tst 
+602 unexpected PASS!
+./regress.sh . nicklas4.tst 
+1201 unexpected PASS!
+./regress.sh . nngs.tst 
+850 unexpected PASS!
+./regress.sh . trevorc.tst 
+600 unexpected FAIL: Correct '!E8', got 'E8'
+./regress.sh . global.tst 
+5 unexpected PASS!
+./regress.sh . 13x13.tst 
+15 unexpected FAIL: Correct 'C7|B7|C6|B6|B5|C5', got 'E8'
+./regress.sh . semeai.tst 
+./regress.sh . trevord.tst 
+310 unexpected PASS!
+./regress.sh . strategy4.tst 
+217 unexpected PASS!
+
+======================= 3.1.32 =========================
+
+unexpected PASS:
+
+13x13:40,70,76
+arend:32
+golife:7
+nicklas4:1103
+nngs:210,800,1160
+nngs1:24,51
+owl:157
+strategy3:119
+trevorb:300,440,480
+trevorc:340,1370,1420
+trevord:500,1070
+
+unexpected FAIL:
+
+13x13:51
+arend:3,17
+endgame:11
+global:1
+nicklas1:1216
+nngs:120
+nngs1:10
+strategy4:46
+trevorb:700
+trevorc:610,1340
+trevord:310,600,940,1050
+
+
+======================= 3.1.31 =========================
+
+./regress.sh . filllib.tst
+34 unexpected PASS!
+./regress.sh . global.tst
+1 unexpected PASS!
+./regress.sh . strategy4.tst
+194 unexpected PASS!
+199 unexpected FAIL: Correct 'N5|S18', got 'B2'
+219 unexpected FAIL: Correct 'K9', got 'M11'
+220 unexpected FAIL: Correct 'R6', got 'M11'
+
+======================= 3.1.30 =========================
+
+The unexpected FAILs are all new tests.
+
+./regress.sh . nngs1.tst
+18 unexpected PASS!
+19 unexpected PASS!
+37 unexpected PASS!
+40 unexpected PASS!
+41 unexpected PASS!
+44 unexpected FAIL: Correct 'C11|D12', got 'D10'
+45 unexpected FAIL: Correct '!B10', got 'B10'
+46 unexpected FAIL: Correct '!J5', got 'J5'
+47 unexpected FAIL: Correct 'G15|F15|G16', got 'O17'
+48 unexpected FAIL: Correct 'R16', got 'O15'
+49 unexpected FAIL: Correct 'B17', got 'B16'
+50 unexpected FAIL: Correct 'O10', got 'C3'
+./regress.sh . strategy.tst
+14 unexpected PASS!
+./regress.sh . viking.tst
+2 unexpected PASS!
+./regress.sh . nngs.tst
+1310 unexpected PASS!
+./regress.sh . trevord.tst
+490 unexpected PASS!
+520 unexpected PASS!
+860 unexpected PASS!
+./regress.sh . strategy4.tst
+216 unexpected FAIL: Correct '!B6', got 'B6'
+217 unexpected FAIL: Correct '!R9', got 'R9'
+218 unexpected FAIL: Correct '!E12', got 'E12'
+
+======================= 3.1.29  =========================
+
+./regress.sh . connection.tst
+60 unexpected FAIL: Correct '1 D15|F15|B15|D19|E19', got '1 C13'
+./regress.sh . blunder.tst
+./regress.sh . trevora.tst
+./regress.sh . nngs1.tst
+10 unexpected PASS!
+16 unexpected PASS!
+17 unexpected PASS!
+34 unexpected PASS!
+./regress.sh . strategy.tst
+./regress.sh . endgame.tst
+./regress.sh . heikki.tst
+./regress.sh . neurogo.tst
+8 unexpected FAIL: Correct 'O2', got 'Q5'
+28 unexpected FAIL: Correct 'O2', got 'Q5'
+./regress.sh . arb.tst
+./regress.sh . rosebud.tst
+./regress.sh . golife.tst
+10 unexpected FAIL: Correct 'D7', got 'B5'
+./regress.sh . arion.tst
+./regress.sh . viking.tst
+./regress.sh . ego.tst
+./regress.sh . dniwog.tst
+./regress.sh . lazarus.tst
+./regress.sh . trevorb.tst
+180 unexpected PASS!
+250 unexpected PASS!
+270 unexpected FAIL: Correct 'G11', got 'G4'
+500 unexpected PASS!
+830 unexpected PASS!
+./regress.sh . strategy2.tst
+./regress.sh . nicklas1.tst
+./regress.sh . nicklas2.tst
+./regress.sh . nicklas3.tst
+./regress.sh . nicklas4.tst
+./regress.sh . nicklas5.tst
+./regress.sh . manyfaces.tst
+1 unexpected PASS!
+./regress.sh . niki.tst
+./regress.sh . trevor.tst
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+./regress.sh . nngs.tst
+120 unexpected PASS!
+850 unexpected FAIL: Correct '!Q9|R9', got 'R9'
+1060 unexpected PASS!
+./regress.sh . trevorc.tst
+1040 unexpected PASS!
+./regress.sh . strategy3.tst
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+38 unexpected PASS!
+./regress.sh . 13x13.tst
+12 unexpected PASS!
+17 unexpected PASS!
+27 unexpected PASS!
+48 unexpected PASS!
+57 unexpected FAIL: Correct 'C5|D5', got 'N7'
+
+======================= 3.1.28 pre 4  =========================
+
+./regress.sh . reading.tst
+168 unexpected PASS!
+./regress.sh . owl.tst
+./regress.sh . owl_rot.tst
+./regress.sh . ld_owl.tst
+./regress.sh . optics.tst
+./regress.sh . filllib.tst
+./regress.sh . atari_atari.tst
+15 unexpected PASS!
+./regress.sh . connection.tst
+72 unexpected PASS!
+./regress.sh . blunder.tst
+./regress.sh . trevora.tst
+./regress.sh . nngs1.tst
+4 unexpected PASS!
+5 unexpected PASS!
+6 unexpected PASS!
+8 unexpected PASS!
+21 unexpected PASS!
+26 unexpected PASS!
+29 unexpected PASS!
+./regress.sh . strategy.tst
+27 unexpected PASS!
+./regress.sh . endgame.tst
+./regress.sh . heikki.tst
+./regress.sh . neurogo.tst
+./regress.sh . arb.tst
+./regress.sh . rosebud.tst
+./regress.sh . golife.tst
+./regress.sh . arion.tst
+./regress.sh . viking.tst
+./regress.sh . ego.tst
+./regress.sh . dniwog.tst
+./regress.sh . lazarus.tst
+16 unexpected FAIL: Correct '!L17|J5|K5|K6', got 'L17'
+./regress.sh . trevorb.tst
+./regress.sh . strategy2.tst
+./regress.sh . nicklas1.tst
+./regress.sh . nicklas2.tst
+./regress.sh . nicklas3.tst
+./regress.sh . nicklas4.tst
+./regress.sh . nicklas5.tst
+./regress.sh . manyfaces.tst
+./regress.sh . niki.tst
+./regress.sh . trevor.tst
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+./regress.sh . nngs.tst
+1050 unexpected FAIL: Correct 'J10|H10|G10|F10', got 'M5'
+./regress.sh . trevorc.tst
+./regress.sh . strategy3.tst
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+9 unexpected FAIL: Correct 'F4', got 'F2'
+38 unexpected FAIL: Correct 'C6', got 'C10'
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+./regress.sh . 13x13.tst
+./regress.sh . semeai.tst
+./regress.sh . trevord.tst
+1050 unexpected PASS!
+./regress.sh . strategy4.tst
+
+======================= 3.1.28 pre 3  =========================
+
+./regress.sh . atari_atari.tst
+14 unexpected PASS!
+./regress.sh . nngs1.tst
+2 unexpected FAIL: Correct 'K18|K19', got 'G8'
+4 unexpected FAIL: Correct 'H3|J5', got 'L2'
+5 unexpected FAIL: Correct 'H3|J5', got 'H6'
+6 unexpected FAIL: Correct 'H4', got 'H3'
+7 unexpected FAIL: Correct '!K7', got 'K7'
+8 unexpected FAIL: Correct 'M10', got 'R17'
+9 unexpected FAIL: Correct 'P15|Q14', got 'H6'
+10 unexpected FAIL: Correct 'R13', got 'T18'
+11 unexpected FAIL: Correct 'T12', got 'S10'
+12 unexpected FAIL: Correct 'A16', got 'B9'
+13 unexpected FAIL: Correct 'S14', got 'J18'
+14 unexpected FAIL: Correct 'S17', got 'L18'
+15 unexpected FAIL: Correct 'F12|G14', got 'D11'
+16 unexpected FAIL: Correct 'M4', got 'R14'
+17 unexpected FAIL: Correct 'L3|L4|J3', got 'N8'
+18 unexpected FAIL: Correct '!L2', got 'L2'
+19 unexpected FAIL: Correct 'Q14', got 'D5'
+20 unexpected FAIL: Correct 'F17', got 'E16'
+21 unexpected FAIL: Correct '!M6', got 'M6'
+22 unexpected FAIL: Correct 'E3', got 'E4'
+23 unexpected FAIL: Correct 'M8', got 'J10'
+24 unexpected FAIL: Correct 'L7|J5|M6', got 'J4'
+26 unexpected FAIL: Correct 'P3', got 'P1'
+27 unexpected FAIL: Correct 'H2', got 'L18'
+28 unexpected FAIL: Correct 'J18', got 'F15'
+29 unexpected FAIL: Correct '!R17', got 'R17'
+30 unexpected FAIL: Correct 'P17|O18', got 'N18'
+31 unexpected FAIL: Correct 'N17', got 'N14'
+./regress.sh . nngs.tst
+875 unexpected FAIL: Correct 'C5', got 'PASS'
+
+Here are the results for 3.1.27 with experimental semeai enabled.
+
+./regress.sh . strategy.tst
+45 unexpected PASS!
+./regress.sh . neurogo.tst
+11 unexpected PASS!
+./regress.sh . lazarus.tst
+6 unexpected FAIL: Correct 'H3', got 'T5'
+14 unexpected PASS!
+16 unexpected FAIL: Correct '!L17|J5|K5|K6', got 'L17'
+./regress.sh . trevorb.tst
+430 unexpected PASS!
+./regress.sh . strategy2.tst
+72 unexpected PASS!
+73 unexpected PASS!
+75 unexpected FAIL: Correct 'Q11', got 'F7'
+76 unexpected FAIL: Correct 'Q11', got 'F7'
+93 unexpected FAIL: Correct 'D11', got 'C11'
+./regress.sh . nicklas1.tst
+301 unexpected FAIL: Correct 'H3|H6', got 'J8'
+./regress.sh . nicklas3.tst
+602 unexpected PASS!
+./regress.sh . trevor.tst
+461 unexpected PASS!
+./regress.sh . nngs.tst
+290 unexpected PASS!
+1700 unexpected PASS!
+2040 unexpected PASS!
+./regress.sh . trevorc.tst
+1390 unexpected FAIL: Correct 'K9', got 'G4'
+./regress.sh . strategy3.tst
+113 unexpected FAIL: Correct 'P1', got 'M15'
+135 unexpected PASS!
+./regress.sh . global.tst
+46 unexpected PASS!
+./regress.sh . 13x13.tst
+25 unexpected FAIL: Correct 'J5', got 'L4'
+36 unexpected PASS!
+./regress.sh . strategy4.tst
+188 unexpected PASS!
+
+========================== 3.1.27 =========================
+========================== 3.1.26 =========================
+
+These versions give identical behavior on the regressions.
+
+With experimental influence, experimental and alternate connections
+enabled (now the default):
+
+./regress.sh . owl.tst
+23 unexpected FAIL: Correct '0', got '1 S11'
+132 unexpected PASS!
+./regress.sh . owl_rot.tst
+66 unexpected PASS!
+./regress.sh . trevora.tst
+450 unexpected PASS!
+470 unexpected FAIL: Correct '!E2', got 'E2'
+530 unexpected PASS!
+./regress.sh . strategy.tst
+20 unexpected PASS!
+22 unexpected FAIL: Correct 'K3', got 'J11'
+27 unexpected FAIL: Correct 'C3', got 'F2'
+34 unexpected FAIL: Correct 'E17', got 'N15'
+45 unexpected FAIL: Correct 'G17|G18|C1', got 'H1'
+./regress.sh . neurogo.tst
+20 unexpected FAIL: Correct '1 S16', got '1 T18'
+./regress.sh . rosebud.tst
+1 unexpected FAIL: Correct 'E16', got 'E18'
+./regress.sh . golife.tst
+4 unexpected PASS!
+./regress.sh . viking.tst
+3 unexpected FAIL: Correct 'M15|B7', got 'O4'
+7 unexpected PASS!
+9 unexpected PASS!
+./regress.sh . lazarus.tst
+4 unexpected FAIL: Correct 'R12|Q12|M8', got 'T5'
+7 unexpected PASS!
+14 unexpected FAIL: Correct 'Q15|T5|H5', got 'R15'
+16 unexpected PASS!
+./regress.sh . trevorb.tst
+180 unexpected FAIL: Correct 'L12', got 'H3'
+250 unexpected FAIL: Correct 'C2', got 'L8'
+440 unexpected FAIL: Correct 'E6', got 'J6'
+450 unexpected PASS!
+500 unexpected FAIL: Correct '!J11', got 'J11'
+600 unexpected PASS!
+660 unexpected FAIL: Correct 'D3', got 'H5'
+700 unexpected PASS!
+790 unexpected FAIL: Correct 'K6|K5', got 'A6'
+840 unexpected PASS!
+./regress.sh . strategy2.tst
+51 unexpected FAIL: Correct 'P3', got 'N5'
+82 unexpected FAIL: Correct 'L5', got 'Q17'
+85 unexpected FAIL: Correct 'O2', got 'N5'
+90 unexpected FAIL: Correct 'B14|D17', got 'H2'
+91 unexpected FAIL: Correct 'B14|G13', got 'H2'
+./regress.sh . nicklas5.tst
+1202 unexpected PASS!
+./regress.sh . manyfaces.tst
+1 unexpected FAIL: Correct 'S13', got 'N15'
+./regress.sh . niki.tst
+4 unexpected FAIL: Correct 'Q8', got 'R13'
+./regress.sh . trevor.tst
+190 unexpected FAIL: Correct 'B7', got 'F5'
+200 unexpected PASS!
+./regress.sh . global.tst
+1 unexpected FAIL: Correct 'B3', got 'F5'
+5 unexpected FAIL: Correct 'O4', got 'S12'
+8 unexpected FAIL: Correct 'H9', got 'G11'
+28 unexpected PASS!
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+14 unexpected FAIL: Correct 'P17', got 'G13'
+24 unexpected FAIL: Correct '!P16', got 'P16'
+28 unexpected PASS!
+32 unexpected FAIL: Correct 'F9|E8', got 'G8'
+33 unexpected FAIL: Correct 'F9', got 'M5'
+./regress.sh . 13x13.tst
+17 unexpected FAIL: Correct 'L5|L3', got 'G8'
+33 unexpected PASS!
+38 unexpected FAIL: Correct 'G11', got 'G10'
+39 unexpected FAIL: Correct 'H4|J4', got 'E2'
+41 unexpected FAIL: Correct '!C8', got 'C8'
+43 unexpected FAIL: Correct 'D6', got 'B6'
+76 unexpected FAIL: Correct 'K6|L6|J3', got 'J5'
+85 unexpected FAIL: Correct 'D2', got 'B10'
+88 unexpected PASS!
+./regress.sh . semeai.tst
+./regress.sh . trevord.tst
+120 unexpected FAIL: Correct 'B9', got 'F7'
+230 unexpected PASS!
+240 unexpected PASS!
+550 unexpected FAIL: Correct 'T8', got 'J8'
+830 unexpected PASS!
+./regress.sh . strategy4.tst
+200 unexpected PASS!
+204 unexpected FAIL: Correct 'B2', got 'G6'
+207 unexpected PASS!
+209 unexpected PASS!
+
+========================== 3.1.25 =========================
+
+configure option enabled: experimental connections
+configure option enabled: alternate connections
+
+./regress.sh . connection.tst
+72 unexpected FAIL: Correct '1 F3', got '1 E3'
+./regress.sh . trevora.tst
+140 unexpected PASS!
+220 unexpected FAIL: Correct '!B6', got 'B6'
+430 unexpected PASS!
+470 unexpected PASS!
+./regress.sh . strategy.tst
+34 unexpected PASS!
+./regress.sh . trevorb.tst
+520 unexpected PASS!
+570 unexpected PASS!
+620 unexpected PASS!
+950 unexpected FAIL: Correct 'M6', got 'L8'
+960 unexpected PASS!
+./regress.sh . strategy2.tst
+53 unexpected PASS!
+./regress.sh . nngs.tst
+560 unexpected PASS!
+680 unexpected FAIL: Correct '!H13|R13', got 'H13'
+1270 unexpected FAIL: Correct 'C16|B15', got 'C15'
+1660 unexpected FAIL: Correct '!F18', got 'F18'
+1690 unexpected PASS!
+./regress.sh . trevorc.tst
+340 unexpected PASS!
+1540 unexpected FAIL: Correct 'M10', got 'L10'
+1550 unexpected PASS!
+./regress.sh . global.tst
+4 unexpected FAIL: Correct 'Q6', got 'F5'
+16 unexpected FAIL: Correct 'O10', got 'P12'
+./regress.sh . arend.tst
+30 unexpected PASS!
+./regress.sh . 13x13.tst
+15 unexpected FAIL: Correct 'C7|B7|C6|B6|B5|C5', got 'H6'
+./regress.sh . trevord.tst
+600 unexpected PASS!
+./regress.sh . strategy4.tst
+151 unexpected FAIL: Correct '!(Q1|T5)', got 'T5'
+194 unexpected FAIL: Correct 'A13', got 'D6'
+
+========================== 3.1.24 =========================
+
+When 3.1.24 was released, the test results were updated with the configure 
+options --enable-experimental-connections --enable-alternate-connections.
+If you run the release without these configure options, you will get the
+following changes:
+
+./regress.sh . connection.tst
+26 unexpected FAIL: Correct '1 B4', got '0'
+27 unexpected FAIL: Correct '1 B4', got '0'
+30 unexpected FAIL: Correct '1 (Q11|T10|T9)', got '0'
+31 unexpected FAIL: Correct '1 Q9', got '1 PASS'
+32 unexpected FAIL: Correct '1 D9', got '1 C9'
+35 unexpected FAIL: Correct '0', got '1 J12'
+36 unexpected FAIL: Correct '1 (N4|M4|N5|N6)', got '0'
+37 unexpected FAIL: Correct '1 (N4|M4|N5|M5|M6|N6)', got '1 PASS'
+38 unexpected FAIL: Correct '1 E1', got '0'
+39 unexpected FAIL: Correct '1 (F2|F1|E2|E1|D2|D1|C2|C1|G2|H1|B1)',got '1 PASS'
+42 unexpected FAIL: Correct '1 K12', got '0'
+45 unexpected FAIL: Correct '1 (N4|M4|N5|M5|M6|M7|N8|M8)', got '1 PASS'
+46 unexpected FAIL: Correct '1 (B1|C1|C2|D2|E1|F1)', got '0'
+47 unexpected FAIL: Correct '1 (C1|E1)', got '1 PASS'
+48 unexpected FAIL: Correct '1 D2|F2', got '1 E3'
+51 unexpected FAIL: Correct '1 Q15', got '0'
+53 unexpected FAIL: Correct '1 T5', got '0'
+60 unexpected FAIL: Correct '1 D15|F15|B15|D19|E19', got '1 B14'
+63 unexpected FAIL: Correct '1 N16|O17|P16', got '0'
+72 unexpected FAIL: Correct '1 F3', got '1 E3'
+73 unexpected FAIL: Correct '1 (F3|H3|E3|G2|F2|H2|E2)', got '0'
+74 unexpected FAIL: Correct '1 F3', got '1 PASS'
+
+./regress.sh . trevorb.tst
+630 unexpected FAIL: Correct '!C5', got 'C5'
+./regress.sh . nngs.tst
+1660 unexpected FAIL: Correct '!F18', got 'F18'
+1690 unexpected PASS!
+1700 unexpected PASS!
+
+./regress.sh . connect.tst
+2 unexpected FAIL: Correct '0', got '1 J17'
+16 unexpected FAIL: Correct '1 D5', got '0'
+25 unexpected FAIL: Correct '1 G1', got '0'
+29 unexpected FAIL: Correct '0', got '1 P10'
+35 unexpected FAIL: Correct '0', got '1 M14'
+36 unexpected FAIL: Correct '0', got '1 C15'
+37 unexpected FAIL: Correct '0', got '1 E3'
+57 unexpected PASS!
+70 unexpected FAIL: Correct '0', got '1 O3'
+78 unexpected FAIL: Correct '0', got '1 E2'
+81 unexpected FAIL: Correct '0', got '1 T10'
+
+./regress.sh . global.tst
+8 unexpected FAIL: Correct 'H9', got 'J9'
+./regress.sh . arend.tst
+36 unexpected FAIL: Correct 'C5', got 'J6'
+./regress.sh . trevord.tst
+260 unexpected FAIL: Correct 'Q2', got 'J1'
+560 unexpected PASS!
+940 unexpected FAIL: Correct '!R19', got 'R19'
+950 unexpected PASS!
+./regress.sh . strategy4.tst
+181 unexpected FAIL: Correct 'F3', got 'O8'
+
+========================== 3.1.24 =========================
+
+./regress.sh . reading.tst
+166 unexpected FAIL: Correct '1 R12', got '0'
+167 unexpected FAIL: Correct '1 F5', got '0'
+./regress.sh . owl.tst
+132 unexpected FAIL: Correct '(1|2) R4', got '0'
+./regress.sh . connection.tst
+26 unexpected PASS!
+27 unexpected PASS!
+30 unexpected PASS!
+31 unexpected PASS!
+32 unexpected PASS!
+35 unexpected PASS!
+36 unexpected PASS!
+37 unexpected PASS!
+38 unexpected PASS!
+39 unexpected PASS!
+42 unexpected PASS!
+45 unexpected PASS!
+46 unexpected PASS!
+47 unexpected PASS!
+48 unexpected PASS!
+51 unexpected PASS!
+53 unexpected PASS!
+60 unexpected PASS!
+63 unexpected PASS!
+72 unexpected PASS!
+73 unexpected PASS!
+74 unexpected PASS!
+./regress.sh . blunder.tst
+15 unexpected PASS!
+./regress.sh . trevora.tst
+290 unexpected PASS!
+430 unexpected FAIL: Correct 'G4', got 'H5'
+./regress.sh . golife.tst
+4 unexpected FAIL: Correct 'H5', got 'E3'
+./regress.sh . lazarus.tst
+2 unexpected PASS!
+./regress.sh . trevorb.tst
+370 unexpected PASS!
+630 unexpected PASS!
+./regress.sh . strategy2.tst
+93 unexpected PASS!
+./regress.sh . nicklas1.tst
+1406 unexpected PASS!
+1801 unexpected PASS!
+./regress.sh . nicklas5.tst
+1202 unexpected FAIL: Correct '!L17', got 'L17'
+./regress.sh . manyfaces.tst
+7 unexpected PASS!
+./regress.sh . trevor.tst
+230 unexpected PASS!
+251 unexpected PASS!
+340 unexpected PASS!
+382 unexpected FAIL: Correct 'E8', got 'F8'
+700 unexpected PASS!
+740 unexpected FAIL: Correct '1 A1', got '0'
+1060 unexpected PASS!
+./regress.sh . buzco.tst
+5 unexpected PASS!
+./regress.sh . nngs.tst
+150 unexpected FAIL: Correct '!J13|M5', got 'M5'
+160 unexpected FAIL: Correct '!P14|P13|M5|P12', got 'M5'
+680 unexpected PASS!
+850 unexpected FAIL: Correct '!Q9|R9', got 'R9'
+1320 unexpected PASS!
+1700 unexpected FAIL: Correct '!J18', got 'J18'
+./regress.sh . trevorc.tst
+1250 unexpected FAIL: Correct '!C2', got 'C2'
+1610 unexpected FAIL: Correct '!D1', got 'D1'
+1620 unexpected PASS!
+./regress.sh . strategy3.tst
+108 unexpected FAIL: Correct 'C15', got 'A10'
+114 unexpected PASS!
+./regress.sh . connect.tst
+2 unexpected PASS!
+16 unexpected PASS!
+25 unexpected PASS!
+29 unexpected PASS!
+35 unexpected PASS!
+36 unexpected PASS!
+37 unexpected PASS!
+57 unexpected FAIL: Correct '1 (D5|C6)', got '1 C5'
+70 unexpected PASS!
+78 unexpected PASS!
+81 unexpected PASS!
+./regress.sh . global.tst
+1 unexpected PASS!
+8 unexpected PASS!
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+3 unexpected PASS!
+32 unexpected PASS!
+36 unexpected PASS!
+./regress.sh . 13x13.tst
+39 unexpected PASS!
+65 unexpected FAIL: Correct 'H4', got 'L2'
+./regress.sh . semeai.tst
+36 unexpected FAIL: Correct 'ALIVE DEAD R12', got 'ALIVE DEAD S10'
+./regress.sh . trevord.tst
+260 unexpected PASS!
+520 unexpected FAIL: Correct 'D15', got 'G16'
+560 unexpected FAIL: Correct 'E18', got 'M16'
+800 unexpected PASS!
+860 unexpected FAIL: Correct 'Q5', got 'N4'
+940 unexpected PASS!
+950 unexpected FAIL: Correct 'R9', got 'H2'
+./regress.sh . strategy4.tst
+181 unexpected PASS!
+
+========================== 3.1.23 =========================
+
+./regress.sh . ld_owl.tst
+12 unexpected PASS!
+./regress.sh . connection.tst
+44 unexpected PASS!
+./regress.sh . ego.tst
+6 unexpected PASS!
+./regress.sh . dniwog.tst
+5 unexpected FAIL: Correct 'H4|G4', got 'J2'
+./regress.sh . trevorb.tst
+360 unexpected FAIL: Correct 'K3', got 'H5'
+760 unexpected PASS!
+770 unexpected PASS!
+./regress.sh . nicklas1.tst
+1206 unexpected PASS!
+./regress.sh . nngs.tst
+270 unexpected PASS!
+1630 unexpected PASS!
+1750 unexpected PASS!
+./regress.sh . trevorc.tst
+310 unexpected PASS!
+840 unexpected PASS!
+1040 unexpected PASS!
+1080 unexpected PASS!
+1160 unexpected PASS!
+1370 unexpected PASS!
+1470 unexpected PASS!
+./regress.sh . strategy3.tst
+142 unexpected PASS!
+./regress.sh . 13x13.tst
+7 unexpected PASS!
+29 unexpected PASS!
+38 unexpected PASS!
+./regress.sh . trevord.tst
+370 unexpected PASS!
+420 unexpected PASS!
+470 unexpected PASS!
+490 unexpected FAIL: Correct 'D5', got 'L3'
+890 unexpected PASS!
+
+
+========================== 3.1.22 =========================
+
+./regress.sh . reading.tst
+./regress.sh . owl.tst
+22 unexpected FAIL: Correct '1 (PASS|S11|S14|N13)', got '1 S13'
+23 unexpected PASS!
+72 unexpected PASS!
+178 unexpected FAIL: Correct '1 (R19|T18)', got '2 S17'
+180 unexpected FAIL: Correct '1 (T16|T17|T18|S18)', got '1 R16'
+255 unexpected PASS!
+./regress.sh . owl_rot.tst
+70 unexpected PASS!
+118 unexpected FAIL: Correct '0', got '1 H2'
+150 unexpected PASS!
+152 unexpected PASS!
+192 unexpected FAIL: Correct '1 F3', got '0'
+./regress.sh . ld_owl.tst
+193 unexpected PASS!
+199 unexpected PASS!
+./regress.sh . optics.tst
+./regress.sh . filllib.tst
+31 unexpected PASS!
+./regress.sh . atari_atari.tst
+13 unexpected PASS!
+./regress.sh . connection.tst
+./regress.sh . blunder.tst
+./regress.sh . strategy.tst
+34 unexpected FAIL: Correct 'E17', got 'N15'
+44 unexpected FAIL: Correct 'G2', got 'L17'
+./regress.sh . endgame.tst
+./regress.sh . heikki.tst
+./regress.sh . neurogo.tst
+12 unexpected PASS!
+./regress.sh . arb.tst
+./regress.sh . rosebud.tst
+./regress.sh . golife.tst
+./regress.sh . arion.tst
+./regress.sh . viking.tst
+7 unexpected FAIL: Correct '!T7', got 'T7'
+8 unexpected PASS!
+./regress.sh . ego.tst
+11 unexpected FAIL: Correct 'T18', got 'Q15'
+./regress.sh . dniwog.tst
+5 unexpected PASS!
+./regress.sh . lazarus.tst
+2 unexpected FAIL: Correct 'M4', got 'S7'
+4 unexpected PASS!
+6 unexpected PASS!
+10 unexpected PASS!
+15 unexpected PASS!
+17 unexpected PASS!
+./regress.sh . strategy2.tst
+70 unexpected FAIL: Correct 'M15|J15|N16|J16', got 'C15'
+78 unexpected FAIL: Correct 'H2', got 'B14'
+84 unexpected FAIL: Correct 'Q13', got 'G5'
+./regress.sh . nicklas1.tst
+203 unexpected FAIL: Correct 'J5', got 'B6'
+502 unexpected PASS!
+1206 unexpected FAIL: Correct 'C15', got 'N10'
+1213 unexpected PASS!
+1214 unexpected PASS!
+1405 unexpected PASS!
+1408 unexpected PASS!
+1801 unexpected FAIL: Correct 'D2', got 'D5'
+./regress.sh . nicklas2.tst
+1407 unexpected PASS!
+2401 unexpected FAIL: Correct 'G3', got 'G2'
+./regress.sh . nicklas3.tst
+1403 unexpected FAIL: Correct 'J6|H9', got 'H1'
+./regress.sh . nicklas4.tst
+1201 unexpected FAIL: Correct 'Q9', got 'S7'
+./regress.sh . nicklas5.tst
+1202 unexpected PASS!
+1211 unexpected FAIL: Correct 'alive', got 'critical F12 E13'
+./regress.sh . manyfaces.tst
+./regress.sh . niki.tst
+4 unexpected PASS!
+./regress.sh . trevor.tst
+15 unexpected FAIL: Correct 'E7', got 'C6'
+160 unexpected PASS!
+251 unexpected FAIL: Correct '!G1', got 'G1'
+330 unexpected FAIL: Correct '1 P9', got '1 Q9'
+340 unexpected FAIL: Correct '1 P9', got '1 Q9'
+411 unexpected PASS!
+740 unexpected PASS!
+1070 unexpected PASS!
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+5 unexpected FAIL: Correct 'C10|C11|E9|A4|F10', got 'A10'
+./regress.sh . nngs.tst
+140 unexpected PASS!
+150 unexpected PASS!
+160 unexpected PASS!
+250 unexpected PASS!
+260 unexpected FAIL: Correct 'O13|P14', got 'E2'
+270 unexpected FAIL: Correct '!J6', got 'J6'
+320 unexpected FAIL: Correct 'B15|B16', got 'D17'
+330 unexpected FAIL: Correct 'B15|B16', got 'D15'
+380 unexpected PASS!
+400 unexpected FAIL: Correct '!J15', got 'J15'
+420 unexpected PASS!
+440 unexpected PASS!
+610 unexpected PASS!
+680 unexpected PASS!
+700 unexpected PASS!
+710 unexpected PASS!
+770 unexpected PASS!
+930 unexpected FAIL: Correct 'S8', got 'R17'
+1020 unexpected FAIL: Correct 'Q2', got 'P2'
+1030 unexpected PASS!
+1040 unexpected PASS!
+1070 unexpected PASS!
+1080 unexpected PASS!
+1110 unexpected PASS!
+1120 unexpected PASS!
+1320 unexpected FAIL: Correct 'O18', got 'R6'
+1550 unexpected PASS!
+1640 unexpected PASS!
+1660 unexpected PASS!
+1700 unexpected PASS!
+1740 unexpected PASS!
+1810 unexpected PASS!
+1860 unexpected PASS!
+1870 unexpected PASS!
+1880 unexpected PASS!
+1900 unexpected FAIL: Correct 'J18', got 'F19'
+1950 unexpected PASS!
+1955 unexpected PASS!
+1980 unexpected PASS!
+./regress.sh . strategy3.tst
+105 unexpected FAIL: Correct 'J2', got 'A5'
+119 unexpected FAIL: Correct 'D9|J3', got 'B10'
+122 unexpected FAIL: Correct '(R19|T18)', got 'S17'
+136 unexpected FAIL: Correct 'E2', got 'B3'
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+4 unexpected PASS!
+7 unexpected PASS!
+10 unexpected PASS!
+14 unexpected PASS!
+16 unexpected PASS!
+31 unexpected FAIL: Correct 'M8', got 'F15'
+33 unexpected FAIL: Correct 'Q9', got 'F15'
+37 unexpected PASS!
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+3 unexpected FAIL: Correct 'P6|Q5', got 'Q7'
+5 unexpected FAIL: Correct 'D7|E7|E6', got 'F3'
+29 unexpected FAIL: Correct 'B14|C14', got 'C15'
+./regress.sh . 13x13.tst
+2 unexpected PASS!
+17 unexpected PASS!
+33 unexpected FAIL: Correct 'E7', got 'E8'
+38 unexpected FAIL: Correct 'G11', got 'D6'
+42 unexpected FAIL: Correct 'N3|N2|L4|L3|L2|L1|M1|N1|M3', got 'C7'
+52 unexpected FAIL: Correct 'H10', got 'M7'
+53 unexpected PASS!
+63 unexpected FAIL: Correct 'K4', got 'L7'
+77 unexpected FAIL: Correct 'L6|K5', got 'B12'
+80 unexpected PASS!
+./regress.sh . trevora.tst
+290 unexpected FAIL: Correct '!C8', got 'C8'
+300 unexpected PASS!
+390 unexpected PASS!
+460 unexpected PASS!
+470 unexpected FAIL: Correct '!E2', got 'E2'
+./regress.sh . trevorb.tst
+220 unexpected PASS!
+300 unexpected FAIL: Correct 'F2', got 'F13'
+370 unexpected FAIL: Correct 'L7', got 'B10'
+500 unexpected PASS!
+570 unexpected FAIL: Correct 'N9', got 'E8'
+740 unexpected PASS!
+880 unexpected PASS!
+950 unexpected PASS!
+./regress.sh . trevorc.tst
+160 unexpected PASS!
+270 unexpected PASS!
+300 unexpected PASS!
+420 unexpected PASS!
+440 unexpected PASS!
+470 unexpected PASS!
+510 unexpected PASS!
+520 unexpected PASS!
+550 unexpected PASS!
+570 unexpected PASS!
+590 unexpected FAIL: Correct '!G9', got 'G9'
+800 unexpected PASS!
+810 unexpected PASS!
+880 unexpected PASS!
+890 unexpected PASS!
+930 unexpected PASS!
+1000 unexpected PASS!
+1030 unexpected PASS!
+1080 unexpected PASS!
+1170 unexpected PASS!
+1250 unexpected PASS!
+1540 unexpected PASS!
+1570 unexpected PASS!
+1600 unexpected PASS!
+1620 unexpected FAIL: Correct '!E11', got 'E11'
+1680 unexpected PASS!
+./regress.sh . trevord.tst
+310 unexpected PASS!
+330 unexpected PASS!
+360 unexpected PASS!
+370 unexpected FAIL: Correct '!J9', got 'J9'
+460 unexpected PASS!
+490 unexpected PASS!
+520 unexpected PASS!
+560 unexpected PASS!
+600 unexpected FAIL: Correct 'L14', got 'N12'
+700 unexpected PASS!
+830 unexpected FAIL: Correct '!G6|E6', got 'E6'
+860 unexpected PASS!
+890 unexpected FAIL: Correct '!F18', got 'F18'
+910 unexpected PASS!
+980 unexpected PASS!
+1100 unexpected PASS!
+./regress.sh . semeai.tst
+./regress.sh . strategy4.tst
+156 unexpected PASS!
+157 unexpected FAIL: Correct 'B14|B16', got 'A14'
+163 unexpected PASS!
+166 unexpected PASS!
+182 unexpected FAIL: Correct 'E7|F8', got 'C14'
+194 unexpected PASS!
+202 unexpected FAIL: Correct 'B6', got 'C4'
+
+After the test results are updated for 3.1.21, recompiling
+with configure --enable-experimental-semeai gives the following
+results:
+
+./regress.sh . reading.tst
+./regress.sh . owl.tst
+./regress.sh . owl_rot.tst
+./regress.sh . ld_owl.tst
+./regress.sh . optics.tst
+./regress.sh . filllib.tst
+./regress.sh . atari_atari.tst
+./regress.sh . connection.tst
+./regress.sh . blunder.tst
+./regress.sh . strategy.tst
+./regress.sh . endgame.tst
+./regress.sh . heikki.tst
+./regress.sh . neurogo.tst
+./regress.sh . arb.tst
+./regress.sh . rosebud.tst
+./regress.sh . golife.tst
+./regress.sh . arion.tst
+./regress.sh . viking.tst
+./regress.sh . ego.tst
+./regress.sh . dniwog.tst
+./regress.sh . lazarus.tst
+./regress.sh . strategy2.tst
+72 unexpected PASS!
+./regress.sh . nicklas1.tst
+1406 unexpected PASS!
+./regress.sh . nicklas2.tst
+./regress.sh . nicklas3.tst
+602 unexpected PASS!
+./regress.sh . nicklas4.tst
+./regress.sh . nicklas5.tst
+1204 unexpected PASS!
+./regress.sh . manyfaces.tst
+./regress.sh . niki.tst
+./regress.sh . trevor.tst
+461 unexpected PASS!
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+./regress.sh . nngs.tst
+1600 unexpected PASS!
+1700 unexpected PASS!
+1790 unexpected PASS!
+./regress.sh . strategy3.tst
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+46 unexpected PASS!
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+31 unexpected FAIL: Correct 'B13|C13', got 'O4'
+./regress.sh . 13x13.tst
+25 unexpected FAIL: Correct 'J5', got 'L4'
+./regress.sh . trevora.tst
+./regress.sh . trevorb.tst
+430 unexpected PASS!
+630 unexpected PASS!
+./regress.sh . trevorc.tst
+800 unexpected PASS!
+./regress.sh . trevord.tst
+./regress.sh . semeai.tst
+./regress.sh . strategy4.tst
+168 unexpected FAIL: Correct 'A3|A4', got 'B7'
+188 unexpected PASS!
+
+After the test results are updated, and the program is
+compiled with --enable-dfa the following test results 
+are obtained:
+
+./regress.sh . reading.tst
+./regress.sh . owl.tst
+230 unexpected FAIL: Correct '0', got '1 H6'
+./regress.sh . owl_rot.tst
+150 unexpected PASS!
+./regress.sh . ld_owl.tst
+./regress.sh . optics.tst
+./regress.sh . filllib.tst
+./regress.sh . atari_atari.tst
+./regress.sh . connection.tst
+./regress.sh . blunder.tst
+./regress.sh . strategy.tst
+./regress.sh . endgame.tst
+./regress.sh . heikki.tst
+./regress.sh . neurogo.tst
+./regress.sh . arb.tst
+./regress.sh . rosebud.tst
+./regress.sh . golife.tst
+./regress.sh . arion.tst
+./regress.sh . viking.tst
+./regress.sh . ego.tst
+./regress.sh . dniwog.tst
+5 unexpected PASS!
+./regress.sh . lazarus.tst
+./regress.sh . strategy2.tst
+73 unexpected PASS!
+./regress.sh . nicklas1.tst
+./regress.sh . nicklas2.tst
+./regress.sh . nicklas3.tst
+./regress.sh . nicklas4.tst
+./regress.sh . nicklas5.tst
+./regress.sh . manyfaces.tst
+./regress.sh . niki.tst
+./regress.sh . trevor.tst
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+./regress.sh . nngs.tst
+250 unexpected PASS!
+260 unexpected FAIL: Correct 'O13|P14', got 'E2'
+510 unexpected FAIL: Correct 'G14', got 'G13'
+1660 unexpected PASS!
+./regress.sh . strategy3.tst
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+29 unexpected FAIL: Correct 'B14|C14', got 'C15'
+30 unexpected PASS!
+./regress.sh . 13x13.tst
+29 unexpected PASS!
+33 unexpected FAIL: Correct 'E7', got 'E8'
+77 unexpected FAIL: Correct 'L6|K5', got 'B12'
+./regress.sh . trevora.tst
+./regress.sh . trevorb.tst
+./regress.sh . trevorc.tst
+./regress.sh . trevord.tst
+./regress.sh . semeai.tst
+./regress.sh . strategy4.tst
+182 unexpected FAIL: Correct 'E7|F8', got 'C14'
+
+========================== 3.1.21 =========================
+
+./regress.sh . reading.tst
+160 unexpected PASS!
+161 unexpected PASS!
+162 unexpected PASS!
+./regress.sh . lazarus.tst
+1 unexpected FAIL: Correct 'L3', got 'L2'
+3 unexpected FAIL: Correct 'Q8', got 'M7'
+4 unexpected FAIL: Correct 'R12|Q12', got 'O12'
+5 unexpected FAIL: Correct 'R13', got 'O8'
+6 unexpected FAIL: Correct 'H3', got 'Q19'
+7 unexpected FAIL: Correct 'T5', got 'K2'
+8 unexpected FAIL: Correct 'D8', got 'J5'
+10 unexpected FAIL: Correct 'P16', got 'F10'
+11 unexpected FAIL: Correct 'S15', got 'M17'
+12 unexpected FAIL: Correct 'T18', got 'T8'
+./regress.sh . strategy2.tst
+70 unexpected PASS!
+./regress.sh . trevor.tst
+670 unexpected PASS!
+./regress.sh . trevorb.tst
+490 unexpected PASS!
+780 unexpected PASS!
+./regress.sh . trevorc.tst
+710 unexpected PASS!
+1210 unexpected PASS!
+1480 unexpected PASS!
+1490 unexpected PASS!
+./regress.sh . trevord.tst
+760 unexpected PASS!
+960 unexpected PASS!
+1100 unexpected FAIL: Correct 'N5', got 'N6'
+1110 unexpected FAIL: Correct 'O17', got 'P17'
+
+========================== 3.1.20 =========================
+
+[minus the patch gunnar_1_20.10]
+
+./regress.sh . reading.tst
+159 unexpected PASS!
+./regress.sh . owl.tst
+23 unexpected FAIL: Correct '0', got '1 S11'
+170 unexpected PASS!
+207 unexpected FAIL: Correct '0', got '1 M6'
+245 unexpected PASS!
+./regress.sh . owl_rot.tst
+4 unexpected PASS!
+150 unexpected FAIL: Correct '0', got '1 G13'
+./regress.sh . ld_owl.tst
+12 unexpected FAIL: Correct 'critical B1 (E1|E2|B1)', got 'critical B1 F1'
+./regress.sh . optics.tst
+./regress.sh . filllib.tst
+./regress.sh . atari_atari.tst
+./regress.sh . connection.tst
+./regress.sh . blunder.tst
+15 unexpected FAIL: Correct 'H3', got 'J1'
+./regress.sh . strategy.tst
+6 unexpected FAIL: Correct 'E10', got 'J13'
+14 unexpected FAIL: Correct 'E9', got 'F13'
+34 unexpected PASS!
+49 unexpected FAIL: Correct 'C17|D16|B17', got 'C4'
+./regress.sh . endgame.tst
+219 unexpected FAIL: Correct 'T17', got 'J1'
+401 unexpected PASS!
+./regress.sh . heikki.tst
+./regress.sh . neurogo.tst
+12 unexpected FAIL: Correct 'B10', got 'B8'
+14 unexpected FAIL: Correct 'Q4', got 'S11'
+./regress.sh . arb.tst
+./regress.sh . rosebud.tst
+./regress.sh . golife.tst
+./regress.sh . arion.tst
+1 unexpected FAIL: Correct 'Q6', got 'D2'
+./regress.sh . viking.tst
+7 unexpected PASS!
+./regress.sh . ego.tst
+11 unexpected PASS!
+./regress.sh . dniwog.tst
+./regress.sh . strategy2.tst
+54 unexpected PASS!
+73 unexpected FAIL: Correct 'F7|R17', got 'E7'
+./regress.sh . nicklas1.tst
+1405 unexpected FAIL: Correct 'B7', got 'B6'
+1406 unexpected FAIL: Correct 'B6', got 'B9'
+./regress.sh . nicklas2.tst
+./regress.sh . nicklas3.tst
+./regress.sh . nicklas4.tst
+805 unexpected PASS!
+809 unexpected FAIL: Correct 'B10', got 'L10'
+1103 unexpected FAIL: Correct 'C2|C3', got 'D2'
+1201 unexpected PASS!
+./regress.sh . nicklas5.tst
+1211 unexpected PASS!
+./regress.sh . manyfaces.tst
+7 unexpected FAIL: Correct 'R2|S7', got 'E14'
+./regress.sh . niki.tst
+4 unexpected FAIL: Correct 'Q8', got 'O2'
+./regress.sh . trevor.tst
+190 unexpected PASS!
+200 unexpected FAIL: Correct 'D7|D4', got 'H7'
+380 unexpected FAIL: Correct '!E4', got 'E4'
+461 unexpected FAIL: Correct 'E14', got 'S8'
+1010 unexpected PASS!
+1030 unexpected PASS!
+1050 unexpected PASS!
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+./regress.sh . nngs.tst
+110 unexpected PASS!
+250 unexpected FAIL: Correct '!S15', got 'S15'
+260 unexpected PASS!
+270 unexpected PASS!
+320 unexpected PASS!
+530 unexpected FAIL: Correct 'N5', got 'M4'
+550 unexpected PASS!
+640 unexpected FAIL: Correct '!M11', got 'M11'
+800 unexpected PASS!
+810 unexpected PASS!
+820 unexpected FAIL: Correct 'J13|L9', got 'J11'
+900 unexpected PASS!
+930 unexpected PASS!
+940 unexpected PASS!
+1100 unexpected PASS!
+1130 unexpected PASS!
+1150 unexpected PASS!
+1170 unexpected PASS!
+1230 unexpected PASS!
+1240 unexpected PASS!
+1270 unexpected PASS!
+1320 unexpected PASS!
+1520 unexpected PASS!
+1590 unexpected PASS!
+1860 unexpected FAIL: Correct '!L7|D19', got 'D19'
+1920 unexpected PASS!
+./regress.sh . strategy3.tst
+120 unexpected PASS!
+140 unexpected PASS!
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+7 unexpected FAIL: Correct 'A5', got 'T11'
+37 unexpected FAIL: Correct 'B6', got 'A4'
+./regress.sh . vie.tst
+16 unexpected FAIL: Correct '0', got '1 M3'
+37 unexpected FAIL: Correct '1 B6', got '1 A6'
+./regress.sh . arend.tst
+1 unexpected FAIL: Correct 'C4', got 'C11'
+3 unexpected PASS!
+8 unexpected PASS!
+23 unexpected PASS!
+31 unexpected PASS!
+36 unexpected FAIL: Correct 'C5', got 'J6'
+./regress.sh . 13x13.tst
+6 unexpected PASS!
+15 unexpected PASS!
+16 unexpected PASS!
+17 unexpected FAIL: Correct 'L5|L3', got 'G8'
+31 unexpected PASS!
+36 unexpected FAIL: Correct 'C5', got 'B2'
+39 unexpected FAIL: Correct 'H4|J4', got 'E2'
+43 unexpected PASS!
+44 unexpected PASS!
+45 unexpected PASS!
+52 unexpected PASS!
+61 unexpected PASS!
+63 unexpected PASS!
+64 unexpected PASS!
+67 unexpected PASS!
+69 unexpected PASS!
+72 unexpected PASS!
+77 unexpected PASS!
+./regress.sh . trevora.tst
+250 unexpected PASS!
+280 unexpected PASS!
+430 unexpected PASS!
+./regress.sh . trevorb.tst
+130 unexpected PASS!
+240 unexpected PASS!
+280 unexpected PASS!
+410 unexpected PASS!
+420 unexpected PASS!
+430 unexpected FAIL: Correct '!F13', got 'F13'
+490 unexpected PASS!
+660 unexpected PASS!
+700 unexpected FAIL: Correct 'C5|D3', got 'J4'
+730 unexpected PASS!
+780 unexpected FAIL: Correct 'J9', got 'C13'
+790 unexpected PASS!
+840 unexpected FAIL: Correct '!D12', got 'D12'
+./regress.sh . trevorc.tst
+190 unexpected PASS!
+230 unexpected FAIL: Correct 'K3|K2|J2|L4|M4|M5', got 'L5'
+290 unexpected PASS!
+340 unexpected FAIL: Correct 'M3|M4', got 'L2'
+370 unexpected PASS!
+380 unexpected PASS!
+400 unexpected PASS!
+480 unexpected PASS!
+540 unexpected PASS!
+590 unexpected PASS!
+630 unexpected PASS!
+640 unexpected PASS!
+670 unexpected PASS!
+680 unexpected PASS!
+700 unexpected PASS!
+760 unexpected PASS!
+790 unexpected PASS!
+830 unexpected PASS!
+910 unexpected PASS!
+960 unexpected PASS!
+970 unexpected FAIL: Correct 'J4', got 'C13'
+1070 unexpected FAIL: Correct 'M11', got 'K10'
+1090 unexpected PASS!
+1100 unexpected PASS!
+1110 unexpected PASS!
+1150 unexpected PASS!
+1180 unexpected FAIL: Correct 'L10', got 'K11'
+1300 unexpected PASS!
+1380 unexpected PASS!
+1390 unexpected PASS!
+1480 unexpected PASS!
+1490 unexpected PASS!
+1590 unexpected PASS!
+1630 unexpected PASS!
+1670 unexpected PASS!
+g./regress.sh . trevord.tst
+120 unexpected PASS!
+140 unexpected PASS!
+180 unexpected PASS!
+190 unexpected PASS!
+210 unexpected PASS!
+360 unexpected FAIL: Correct 'K3|K4', got 'K9'
+370 unexpected PASS!
+380 unexpected PASS!
+390 unexpected PASS!
+410 unexpected PASS!
+440 unexpected PASS!
+510 unexpected PASS!
+530 unexpected PASS!
+550 unexpected PASS!
+590 unexpected PASS!
+600 unexpected PASS!
+610 unexpected PASS!
+630 unexpected PASS!
+640 unexpected PASS!
+730 unexpected PASS!
+740 unexpected PASS!
+750 unexpected PASS!
+780 unexpected PASS!
+790 unexpected PASS!
+830 unexpected PASS!
+840 unexpected PASS!
+890 unexpected PASS!
+900 unexpected PASS!
+950 unexpected PASS!
+960 unexpected PASS!
+990 unexpected PASS!
+1040 unexpected PASS!
+1100 unexpected FAIL: Correct 'N5', got 'N6'
+1120 unexpected PASS!
+./regress.sh . semeai.tst
+23 unexpected PASS!
+34 unexpected PASS!
+./regress.sh . strategy4.tst
+156 unexpected FAIL: Correct 'B14|B16', got 'C1'
+163 unexpected FAIL: Correct 'O7|P8', got 'N8'
+171 unexpected PASS!
+173 unexpected PASS!
+179 unexpected PASS!
+195 unexpected PASS!
+200 unexpected FAIL: Correct 'P6|P7|Q7|S18', got 'S9'
+202 unexpected PASS!
+212 unexpected PASS!
+
+========================== 3.1.19 =========================
+
+./regress.sh . owl.tst
+117 unexpected PASS!
+./regress.sh . owl_rot.tst
+150 unexpected PASS!
+./regress.sh . ld_owl.tst
+199 unexpected FAIL: Correct 'alive', got 'critical T3 S1'
+./regress.sh . trevor.tst
+430 unexpected PASS!
+./regress.sh . strategy3.tst
+128 unexpected PASS!
+./regress.sh . global.tst
+16 unexpected FAIL: Correct 'O10', got 'Q11'
+37 unexpected PASS!
+41 unexpected PASS!
+./regress.sh . vie.tst
+41 unexpected PASS!
+./regress.sh . arend.tst
+10 unexpected PASS!
+37 unexpected PASS!
+./regress.sh . trevorb.tst
+160 unexpected PASS!
+./regress.sh . trevorc.tst
+110 unexpected PASS!
+130 unexpected PASS!
+180 unexpected PASS!
+200 unexpected PASS!
+360 unexpected FAIL: Correct 'H11', got 'G13'
+400 unexpected FAIL: Correct '!J11', got 'J11'
+410 unexpected FAIL: Correct '!H13', got 'H13'
+460 unexpected PASS!
+610 unexpected FAIL: Correct '!N3', got 'N3'
+970 unexpected PASS!
+./regress.sh . trevord.tst
+100 unexpected PASS!
+130 unexpected PASS!
+150 unexpected PASS!
+360 unexpected PASS!
+690 unexpected PASS!
+720 unexpected PASS!
+930 unexpected PASS!
+1080 unexpected PASS!
+1100 unexpected PASS!
+
+===================== 3.1.18, experimental =========================
+
+After the test results are updated, we have the following
+results when compiling with --enable-experimental-semeai:
+
+./regress.sh . strategy2.tst
+72 unexpected PASS!
+./regress.sh . nicklas1.tst
+./regress.sh . nicklas2.tst
+904 unexpected FAIL: Correct 'B1|E1', got 'H7'
+./regress.sh . nicklas3.tst
+602 unexpected PASS!
+./regress.sh . nicklas4.tst
+./regress.sh . nicklas5.tst
+1204 unexpected PASS!
+./regress.sh . manyfaces.tst
+./regress.sh . niki.tst
+./regress.sh . trevor.tst
+461 unexpected FAIL: Correct 'E14', got 'S8'
+./regress.sh . tactics.tst
+./regress.sh . buzco.tst
+./regress.sh . strategy3.tst
+./regress.sh . capture.tst
+./regress.sh . connect.tst
+./regress.sh . global.tst
+16 unexpected FAIL: Correct 'O10', got 'Q11'
+46 unexpected PASS!
+./regress.sh . vie.tst
+./regress.sh . arend.tst
+./regress.sh . 13x13.tst
+1 unexpected PASS!
+25 unexpected FAIL: Correct 'J5', got 'L4'
+36 unexpected FAIL: Correct 'C5', got 'B2'
+39 unexpected FAIL: Correct 'H4|J4', got 'B2'
+49 unexpected FAIL: Correct 'K7', got 'E4'
+66 unexpected PASS!
+./regress.sh . trevora.tst
+./regress.sh . trevorb.tst
+./regress.sh . trevorc.tst
+270 unexpected PASS!
+340 unexpected FAIL: Correct 'M3|M4', got 'L2'
+680 unexpected PASS!
+800 unexpected PASS!
+./regress.sh . semeai.tst
+32 unexpected FAIL: Correct 'ALIVE_IN_SEKI ALIVE_IN_SEKI B6', got 'ALIVE_IN_SEKI ALIVE_IN_SEKI B7'
+33 unexpected FAIL: Correct 'ALIVE DEAD B7', got 'ALIVE DEAD B9'
+34 unexpected FAIL: Correct 'ALIVE DEAD S18', got 'ALIVE DEAD T18'
+./regress.sh . strategy4.tst
+155 unexpected FAIL: Correct 'D18', got 'E16'
+168 unexpected FAIL: Correct 'A3|A4', got 'B7'
+188 unexpected PASS!
+190 unexpected FAIL: Correct 'D13', got 'E7'
+197 unexpected FAIL: Correct 'K3|S18', got 'T18'
+199 unexpected FAIL: Correct 'N5|S18', got 'T18'
+200 unexpected FAIL: Correct 'P6|P7|Q7|S18', got 'T18'
+
+========================== 3.1.18 =========================
+
+./regress.sh . owl.tst
+196 unexpected PASS!
+./regress.sh . owl_rot.tst
+150 unexpected FAIL: Correct '0', got '1 G13'
+./regress.sh . strategy.tst
+8 unexpected PASS!
+17 unexpected PASS!
+26 unexpected PASS!
+36 unexpected PASS!
+./regress.sh . arb.tst
+101 unexpected PASS!
+./regress.sh . strategy2.tst
+73 unexpected PASS!
+./regress.sh . nicklas1.tst
+1510 unexpected PASS!
+2301 unexpected PASS!
+./regress.sh . niki.tst
+14 unexpected FAIL: Correct 'F16', got 'G15'
+./regress.sh . trevor.tst
+190 unexpected FAIL: Correct 'B7', got 'H7'
+381 unexpected PASS!
+382 unexpected PASS!
+690 unexpected PASS!
+./regress.sh . strategy3.tst
+119 unexpected PASS!
+121 unexpected PASS!
+./regress.sh . global.tst
+20 unexpected FAIL: Correct 'R15', got 'D6'
+43 unexpected PASS!
+./regress.sh . vie.tst
+16 unexpected PASS!
+19 unexpected PASS!
+./regress.sh . arend.tst
+17 unexpected PASS!
+29 unexpected PASS!
+./regress.sh . 13x13.tst
+14 unexpected PASS!
+17 unexpected PASS!
+48 unexpected FAIL: Correct 'K7', got 'K6'
+59 unexpected PASS!
+61 unexpected FAIL: Correct 'K8', got 'L13'
+64 unexpected FAIL: Correct 'L2|M3|L4|M5', got 'M9'
+72 unexpected FAIL: Correct 'J10', got 'F5'
+79 unexpected PASS!
+82 unexpected PASS!
+./regress.sh . trevora.tst
+280 unexpected FAIL: Correct '!E4', got 'E4'
+460 unexpected FAIL: Correct 'H8', got 'B4'
+600 unexpected PASS!
+./regress.sh . trevorb.tst
+180 unexpected PASS!
+250 unexpected PASS!
+310 unexpected PASS!
+340 unexpected PASS!
+400 unexpected PASS!
+440 unexpected PASS!
+510 unexpected PASS!
+530 unexpected PASS!
+540 unexpected PASS!
+560 unexpected PASS!
+590 unexpected PASS!
+610 unexpected PASS!
+720 unexpected PASS!
+750 unexpected PASS!
+780 unexpected PASS!
+840 unexpected PASS!
+860 unexpected PASS!
+870 unexpected PASS!
+890 unexpected PASS!
+910 unexpected PASS!
+./regress.sh . trevorc.tst
+350 unexpected PASS!
+360 unexpected PASS!
+400 unexpected PASS!
+410 unexpected PASS!
+610 unexpected PASS!
+1070 unexpected PASS!
+
+===================== 3.1.17, experimental =========================
+
+3.1.17 compiled with --enable-experimental-semeai gives the
+following failures:
+
+./regress.sh . strategy.tst
+37 unexpected FAIL: Correct '!A17|A18|C19', got 'A18'
+./regress.sh . arb.tst
+104 unexpected FAIL: Correct 'A7|B7', got 'B10'
+./regress.sh . golife.tst
+4 unexpected FAIL: Correct 'H5', got 'E3'
+./regress.sh . strategy2.tst
+72 unexpected PASS!
+73 unexpected PASS!
+./regress.sh . nicklas1.tst
+501 unexpected FAIL: Correct 'G7', got 'F6'
+1405 unexpected FAIL: Correct 'B7', got 'PASS'
+./regress.sh . nicklas2.tst
+1401 unexpected FAIL: Correct 'B3', got 'A2'
+./regress.sh . nicklas3.tst
+602 unexpected PASS!
+./regress.sh . strategy3.tst
+126 unexpected FAIL: Correct 'B19', got 'G10'
+./regress.sh . global.tst
+16 unexpected FAIL: Correct 'O10', got 'O13'
+46 unexpected PASS!
+./regress.sh . 13x13.tst
+1 unexpected PASS!
+25 unexpected FAIL: Correct 'J5', got 'L4'
+48 unexpected FAIL: Correct 'K7', got 'K6'
+./regress.sh . trevora.tst
+530 unexpected PASS!
+./regress.sh . trevorb.tst
+290 unexpected PASS!
+./regress.sh . semeai.tst
+./regress.sh . strategy4.tst
+168 unexpected FAIL: Correct 'A3|A4', got 'B7'
+197 unexpected FAIL: Correct 'K3|S18', got 'T18'
+199 unexpected FAIL: Correct 'N5|S18', got 'T18'
+200 unexpected FAIL: Correct 'P6|P7|Q7|S18', got 'Q8'
+
+========================== 3.1.17 =========================
+
+./regress.sh . owl.tst
+6 unexpected PASS!
+18 unexpected PASS!
+72 unexpected FAIL: Correct '1 C14', got '0'
+80 unexpected FAIL: Correct '1 J2', got '0'
+150 unexpected PASS!
+170 unexpected FAIL: Correct '0', got '1 B15'
+181 unexpected PASS!
+196 unexpected FAIL: Correct '1 (B10|A9)', got '1 B13'
+254 unexpected PASS!
+255 unexpected FAIL: Correct '1 (D14|E13|G16)', got '0'
+./regress.sh . owl_rot.tst
+4 unexpected FAIL: Correct '1 C12', got '1 B14'
+150 unexpected PASS!
+./regress.sh . ld_owl.tst
+182 unexpected FAIL: Correct '2 S1', got '1 S1'
+./regress.sh . connection.tst
+21 unexpected PASS!
+22 unexpected PASS!
+28 unexpected PASS!
+35 unexpected FAIL: Correct '0', got '1 J12'
+36 unexpected FAIL: Correct '1 (N4|M4|N5|N6)', got '0'
+37 unexpected FAIL: Correct '1 (N4|M4|N5|M5|M6)', got '1 PASS'
+38 unexpected FAIL: Correct '1 E1', got '0'
+39 unexpected FAIL: Correct '1 (F2|F1|E2|E1|D2|D1|C2|C1|G2|H1|B1)', got '1 PASS'
+42 unexpected FAIL: Correct '1 K12', got '0'
+44 unexpected FAIL: Correct '3 M6', got '0'
+45 unexpected FAIL: Correct '1 (N4|M4|N5|M5|M6|M7|N8|M8)', got '1 PASS'
+46 unexpected FAIL: Correct '1 (B1|C1|C2|D2|E1|F1)', got '0'
+47 unexpected FAIL: Correct '1 (C1|E1)', got '1 PASS'
+48 unexpected FAIL: Correct '1 D2|F2', got '1 E3'
+./regress.sh . strategy.tst
+1 unexpected PASS!
+26 unexpected FAIL: Correct 'D3', got 'G3'
+27 unexpected PASS!
+49 unexpected PASS!
+./regress.sh . endgame.tst
+108 unexpected PASS!
+./regress.sh . neurogo.tst
+11 unexpected FAIL: Correct 'N5', got 'T8'
+./regress.sh . golife.tst
+2 unexpected PASS!
+3 unexpected PASS!
+10 unexpected PASS!
+./regress.sh . strategy2.tst
+73 unexpected FAIL: Correct 'F7|R17', got 'E9'
+84 unexpected PASS!
+89 unexpected FAIL: Correct '(D16|B7|G13)', got 'Q8'
+./regress.sh . nicklas1.tst
+1207 unexpected PASS!
+1213 unexpected FAIL: Correct 'N4', got 'R2'
+1214 unexpected FAIL: Correct 'A1|A6', got 'R2'
+1901 unexpected PASS!
+2301 unexpected FAIL: Correct 'G6|F7', got 'D6'
+./regress.sh . nicklas4.tst
+1201 unexpected FAIL: Correct 'Q9', got 'S9'
+./regress.sh . nicklas5.tst
+802 unexpected PASS!
+./regress.sh . niki.tst
+4 unexpected PASS!
+8 unexpected PASS!
+9 unexpected PASS!
+./regress.sh . trevor.tst
+15 unexpected PASS!
+162 unexpected FAIL: Correct 'B1', got 'A2'
+230 unexpected FAIL: Correct 'C2|B2', got 'F2'
+290 unexpected FAIL: Correct '!A9', got 'A9'
+381 unexpected FAIL: Correct 'D7|C7|E8', got 'C6'
+401 unexpected PASS!
+440 unexpected PASS!
+470 unexpected PASS!
+471 unexpected PASS!
+650 unexpected PASS!
+660 unexpected PASS!
+680 unexpected PASS!
+./regress.sh . buzco.tst
+7 unexpected PASS!
+8 unexpected FAIL: Correct '!N11', got 'N11'
+./regress.sh . strategy3.tst
+129 unexpected PASS!
+./regress.sh . connect.tst
+3 unexpected PASS!
+4 unexpected PASS!
+7 unexpected PASS!
+8 unexpected PASS!
+10 unexpected PASS!
+11 unexpected PASS!
+12 unexpected PASS!
+18 unexpected PASS!
+26 unexpected PASS!
+31 unexpected PASS!
+32 unexpected PASS!
+33 unexpected PASS!
+38 unexpected PASS!
+40 unexpected PASS!
+46 unexpected PASS!
+47 unexpected PASS!
+51 unexpected PASS!
+53 unexpected PASS!
+54 unexpected PASS!
+55 unexpected PASS!
+56 unexpected PASS!
+57 unexpected PASS!
+58 unexpected PASS!
+65 unexpected PASS!
+66 unexpected PASS!
+69 unexpected PASS!
+73 unexpected PASS!
+76 unexpected PASS!
+77 unexpected PASS!
+./regress.sh . global.tst
+34 unexpected FAIL: Correct 'N6', got 'F3'
+./regress.sh . vie.tst
+17 unexpected PASS!
+27 unexpected FAIL: Correct '1 (H2|F3)', got '1 F1'
+./regress.sh . arend.tst
+8 unexpected FAIL: Correct '!S16', got 'S16'
+14 unexpected PASS!
+30 unexpected FAIL: Correct 'C13', got 'J13'
+./regress.sh . 13x13.tst
+16 unexpected FAIL: Correct 'C6|C5', got 'F10'
+29 unexpected FAIL: Correct 'C8', got 'C12'
+46 unexpected PASS!
+48 unexpected FAIL: Correct 'K7', got 'K6'
+50 unexpected PASS!
+52 unexpected FAIL: Correct 'H10', got 'H12'
+57 unexpected PASS!
+58 unexpected PASS!
+86 unexpected PASS!
+89 unexpected PASS!
+./regress.sh . trevora.tst
+121 unexpected PASS!
+340 unexpected PASS!
+380 unexpected PASS!
+500 unexpected PASS!
+./regress.sh . trevorb.tst
+270 unexpected PASS!
+300 unexpected PASS!
+320 unexpected PASS!
+350 unexpected PASS!
+360 unexpected PASS!
+370 unexpected PASS!
+430 unexpected PASS!
+570 unexpected PASS!
+670 unexpected PASS!
+700 unexpected PASS!
+710 unexpected PASS!
+850 unexpected PASS!
+940 unexpected PASS!
+970 unexpected PASS!
+./regress.sh . semeai.tst
+24 unexpected PASS!
+27 unexpected PASS!
+30 unexpected FAIL: Correct 'ALIVE DEAD C1', got 'ALIVE DEAD H1'
+31 unexpected FAIL: Correct 'ALIVE DEAD C1', got 'ALIVE DEAD H1'
+./regress.sh . strategy4.tst
+163 unexpected PASS!
+167 unexpected PASS!
+171 unexpected FAIL: Correct 'A5', got 'M18'
+178 unexpected PASS!
+179 unexpected FAIL: Correct 'P3|O2|P2|O4|E2', got 'O5'
+182 unexpected PASS!
+190 unexpected PASS!
+194 unexpected FAIL: Correct 'A13', got 'E7'
+204 unexpected PASS!
+
+========================== 3.1.16 =========================
+
+./regress.sh . owl.tst
+245 unexpected FAIL: Correct '1 (F11|H8|F8)', got '1 K7'
+254 unexpected FAIL: Correct '1 (M16|O14|N16|N17)', got '0'
+./regress.sh . owl_rot.tst
+228 unexpected PASS!
+./regress.sh . blunder.tst
+1 unexpected PASS!
+16 unexpected PASS!
+17 unexpected PASS!
+./regress.sh . strategy.tst
+18 unexpected PASS!
+27 unexpected FAIL: Correct 'C3', got 'F2'
+29 unexpected PASS!
+36 unexpected FAIL: Correct '!D18', got 'D18'
+44 unexpected PASS!
+49 unexpected FAIL: Correct 'C17|D16|B17', got 'C4'
+./regress.sh . neurogo.tst
+14 unexpected PASS!
+./regress.sh . arb.tst
+101 unexpected FAIL: Correct '(C2|D2|F2|G2|F1|D1|E1)', got 'B3'
+./regress.sh . ego.tst
+6 unexpected FAIL: Correct '!N5', got 'N5'
+./regress.sh . dniwog.tst
+7 unexpected PASS!
+./regress.sh . strategy2.tst
+66 unexpected FAIL: Correct 'N11', got 'O18'
+100 unexpected FAIL: Correct 'M16', got 'N13'
+./regress.sh . nicklas1.tst
+1213 unexpected PASS!
+1510 unexpected FAIL: Correct 'C12', got 'B13'
+./regress.sh . nicklas4.tst
+812 unexpected PASS!
+1201 unexpected PASS!
+./regress.sh . nicklas5.tst
+804 unexpected FAIL: Correct 'D6', got 'H6'
+./regress.sh . niki.tst
+8 unexpected FAIL: Correct 'G16|H15|G15|F15', got 'T4'
+9 unexpected FAIL: Correct 'F15', got 'O2'
+14 unexpected PASS!
+./regress.sh . trevor.tst
+15 unexpected FAIL: Correct 'E7', got 'C6'
+163 unexpected PASS!
+200 unexpected PASS!
+400 unexpected PASS!
+401 unexpected FAIL: Correct 'F8', got 'E8'
+./regress.sh . strategy3.tst
+103 unexpected PASS!
+105 unexpected PASS!
+108 unexpected PASS!
+110 unexpected PASS!
+119 unexpected FAIL: Correct 'D9|J3', got 'B10'
+121 unexpected FAIL: Correct 'C7', got 'B6'
+137 unexpected PASS!
+./regress.sh . connect.tst
+19 unexpected PASS!
+22 unexpected PASS!
+44 unexpected PASS!
+52 unexpected PASS!
+61 unexpected PASS!
+71 unexpected PASS!
+./regress.sh . global.tst
+22 unexpected PASS!
+26 unexpected FAIL: Correct 'D12', got 'H4'
+36 unexpected PASS!
+./regress.sh . vie.tst
+19 unexpected FAIL: Correct '1 S8|T8|T9|T7', got '0'
+./regress.sh . arend.tst
+2 unexpected PASS!
+17 unexpected FAIL: Correct 'C7', got 'C9'
+33 unexpected PASS!
+./regress.sh . 13x13.tst
+2 unexpected FAIL: Correct 'E9|E10', got 'H11'
+34 unexpected PASS!
+52 unexpected PASS!
+53 unexpected FAIL: Correct 'C6', got 'B6'
+64 unexpected PASS!
+65 unexpected PASS!
+./regress.sh . trevora.tst
+121 unexpected FAIL: Correct 'E8', got 'D8'
+460 unexpected PASS!
+540 unexpected PASS!
+550 unexpected PASS!
+./regress.sh . semeai.tst
+23 unexpected FAIL: Correct 'ALIVE ALIVE (F13|G13|H13|PASS)', got 'ALIVE DEAD D10'
+24 unexpected FAIL: Correct 'DEAD DEAD PASS', got 'DEAD ALIVE PASS'
+27 unexpected FAIL: Correct 'ALIVE DEAD S9', got 'ALIVE DEAD M6'
+28 unexpected FAIL: Correct 'ALIVE DEAD S9', got 'ALIVE_IN_SEKI ALIVE_IN_SEKI N7'
+29 unexpected FAIL: Correct 'F10', got 'L13'
+./regress.sh . strategy4.tst
+166 unexpected FAIL: Correct 'D11', got 'F12'
+167 unexpected FAIL: Correct 'D4', got 'C2'
+168 unexpected PASS!
+187 unexpected PASS!
+197 unexpected PASS!
+210 unexpected PASS!
+215 unexpected PASS!
+
+========================== 3.1.15 =========================
+
+./regress.sh . reading.tst
+122 unexpected PASS!
+155 unexpected PASS!
+./regress.sh . owl.tst
+4 unexpected PASS!
+6 unexpected FAIL: Correct '1 B5', got '3 B5'
+80 unexpected PASS!
+136 unexpected FAIL: Correct '1 F14', got '0'
+149 unexpected PASS!
+157 unexpected FAIL: Correct '3 (P16|Q15)', got '0'
+166 unexpected FAIL: Correct '2 P18', got '1 P18'
+./regress.sh . owl_rot.tst
+4 unexpected PASS!
+150 unexpected FAIL: Correct '0', got '1 G13'
+222 unexpected PASS!
+./regress.sh . strategy.tst
+8 unexpected FAIL: Correct 'N1', got 'T17'
+34 unexpected FAIL: Correct 'E17', got 'N14'
+49 unexpected PASS!
+./regress.sh . endgame.tst
+208 unexpected FAIL: Correct 'N1', got 'Q8'
+./regress.sh . neurogo.tst
+12 unexpected PASS!
+16 unexpected PASS!
+./regress.sh . golife.tst
+2 unexpected FAIL: Correct 'H5', got 'F4'
+3 unexpected FAIL: Correct 'E3|E2', got 'F4'
+./regress.sh . strategy2.tst
+66 unexpected PASS!
+100 unexpected PASS!
+./regress.sh . nicklas1.tst
+1106 unexpected FAIL: Correct '!F6', got 'F6'
+1214 unexpected PASS!
+1408 unexpected FAIL: Correct '!dead', got 'dead'
+./regress.sh . nicklas2.tst
+102 unexpected FAIL: Correct 'D4', got 'G2'
+1407 unexpected FAIL: Correct 'A6', got 'C9'
+./regress.sh . nicklas4.tst
+812 unexpected FAIL: Correct 'J12', got 'K14'
+./regress.sh . nicklas5.tst
+./regress.sh . manyfaces.tst
+6 unexpected FAIL: Correct 'R3', got 'M15'
+7 unexpected PASS!
+9 unexpected PASS!
+./regress.sh . niki.tst
+4 unexpected FAIL: Correct 'Q8', got 'O2'
+./regress.sh . trevor.tst
+290 unexpected PASS!
+350 unexpected PASS!
+590 unexpected PASS!
+./regress.sh . buzco.tst
+8 unexpected PASS!
+./regress.sh . strategy3.tst
+108 unexpected FAIL: Correct 'C15', got 'A10'
+145 unexpected PASS!
+146 unexpected PASS!
+./regress.sh . global.tst
+4 unexpected FAIL: Correct 'Q6', got 'F5'
+9 unexpected PASS!
+36 unexpected FAIL: Correct 'B6', got 'C5'
+41 unexpected FAIL: Correct 'B4', got 'A9'
+./regress.sh . vie.tst
+41 unexpected FAIL: Correct '1 B4', got '1 A9'
+./regress.sh . arend.tst
+15 unexpected FAIL: Correct 'F3', got 'B13'
+17 unexpected PASS!
+39 unexpected PASS!
+./regress.sh . trevora.tst
+100 unexpected PASS!
+120 unexpected PASS!
+170 unexpected PASS!
+180 unexpected PASS!
+210 unexpected PASS!
+220 unexpected PASS!
+230 unexpected PASS!
+280 unexpected PASS!
+290 unexpected PASS!
+320 unexpected PASS!
+330 unexpected PASS!
+350 unexpected PASS!
+400 unexpected PASS!
+420 unexpected PASS!
+470 unexpected PASS!
+560 unexpected PASS!
+580 unexpected PASS!
+620 unexpected PASS!
+630 unexpected PASS!
+660 unexpected PASS!
+./regress.sh . strategy4.tst
+160 unexpected PASS!
+179 unexpected PASS!
+187 unexpected FAIL: Correct '!C1', got 'C1'
+198 unexpected PASS!
+199 unexpected PASS!
+200 unexpected PASS!
+
+========================== 3.1.14 =========================
+
+./regress.sh . owl.tst
+4 unexpected FAIL: Correct '1 C12', got '1 B14'
+65 unexpected FAIL: Correct '1 M11', got '1 J12'
+150 unexpected FAIL: Correct '0', got '1 G13'
+170 unexpected PASS!
+192 unexpected FAIL: Correct '1 F3', got '0'
+228 unexpected PASS!
+229 unexpected FAIL: Correct '1 D9', got '0'
+./regress.sh . owl_rot.tst
+150 unexpected PASS!
+193 unexpected PASS!
+228 unexpected FAIL: Correct '0', got '1 D5'
+./regress.sh . ld_owl.tst
+60 unexpected PASS!
+./regress.sh . connection.tst
+32 unexpected FAIL: Correct '1 D9', got '1 PASS'
+./regress.sh . strategy.tst
+1 unexpected FAIL: Correct 'Q13', got 'Q15'
+18 unexpected FAIL: Correct 'E4|F3', got 'E5'
+49 unexpected FAIL: Correct 'C17|D16|B17', got 'C4'
+./regress.sh . endgame.tst
+208 unexpected PASS!
+218 unexpected FAIL: Correct 'H1', got 'L1'
+./regress.sh . neurogo.tst
+19 unexpected PASS!
+21 unexpected PASS!
+./regress.sh . arb.tst
+200 unexpected PASS!
+./regress.sh . golife.tst
+7 unexpected FAIL: Correct 'F3', got 'G1'
+./regress.sh . arion.tst
+1 unexpected PASS!
+./regress.sh . viking.tst
+2 unexpected FAIL: Correct 'E2', got 'R9'
+./regress.sh . ego.tst
+8 unexpected FAIL: Correct 'F12', got 'H11'
+./regress.sh . strategy2.tst
+73 unexpected PASS!
+74 unexpected PASS!
+77 unexpected PASS!
+./regress.sh . nicklas1.tst
+501 unexpected PASS!
+1509 unexpected PASS!
+1801 unexpected PASS!
+1901 unexpected FAIL: Correct 'B7', got 'B3'
+./regress.sh . nicklas2.tst
+102 unexpected PASS!
+1802 unexpected PASS!
+2202 unexpected PASS!
+./regress.sh . nicklas3.tst
+./regress.sh . nicklas4.tst
+809 unexpected PASS!
+1215 unexpected PASS!
+1501 unexpected PASS!
+./regress.sh . nicklas5.tst
+1202 unexpected FAIL: Correct '!L17', got 'L17'
+./regress.sh . manyfaces.tst
+2 unexpected PASS!
+6 unexpected PASS!
+7 unexpected FAIL: Correct 'R2|S7', got 'E3'
+9 unexpected FAIL: Correct '!P12', got 'P12'
+10 unexpected FAIL: Correct 'N3', got 'P7'
+./regress.sh . niki.tst
+4 unexpected PASS!
+./regress.sh . trevor.tst
+15 unexpected PASS!
+261 unexpected PASS!
+330 unexpected PASS!
+340 unexpected PASS!
+401 unexpected PASS!
+402 unexpected PASS!
+411 unexpected FAIL: Correct '!A3', got 'A3'
+./regress.sh . tactics.tst
+2 unexpected PASS!
+./regress.sh . buzco.tst
+4 unexpected FAIL: Correct 'D13', got 'E15'
+5 unexpected PASS!
+6 unexpected PASS!
+./regress.sh . strategy3.tst
+105 unexpected FAIL: Correct 'J2', got 'A5'
+111 unexpected FAIL: Correct 'K3', got 'Q8'
+128 unexpected FAIL: Correct 'O8', got 'R11'
+145 unexpected FAIL: Correct 'S14|T14', got 'A3'
+./regress.sh . capture.tst
+18 unexpected PASS!
+./regress.sh . global.tst
+4 unexpected PASS!
+7 unexpected PASS!
+14 unexpected FAIL: Correct 'S9', got 'L13'
+20 unexpected PASS!
+26 unexpected PASS!
+46 unexpected FAIL: Correct 'J2', got 'J4'
+./regress.sh . vie.tst
+20 unexpected PASS!
+37 unexpected PASS!
+./regress.sh . arend.tst
+1 unexpected PASS!
+4 unexpected PASS!
+5 unexpected PASS!
+7 unexpected PASS!
+8 unexpected PASS!
+9 unexpected PASS!
+11 unexpected PASS!
+12 unexpected PASS!
+15 unexpected PASS!
+16 unexpected PASS!
+18 unexpected PASS!
+20 unexpected PASS!
+21 unexpected PASS!
+24 unexpected PASS!
+25 unexpected PASS!
+30 unexpected PASS!
+34 unexpected PASS!
+35 unexpected PASS!
+36 unexpected PASS!
+40 unexpected PASS!
+41 unexpected PASS!
+./regress.sh . strategy4.tst
+157 unexpected PASS!
+162 unexpected FAIL: Correct 'O7|Q7|N7', got 'P6'
+178 unexpected FAIL: Correct 'P4|P3', got 'E2'
+184 unexpected FAIL: Correct 'H13|F15', got 'A17'
+205 unexpected PASS!
+208 unexpected PASS!
+212 unexpected FAIL: Correct 'G2', got 'H3'
+
+========================== 3.1.13 =========================
+
+./regress.sh . owl.tst
+4 unexpected PASS!
+219 unexpected PASS!
+229 unexpected PASS!
+./regress.sh . ld_owl.tst
+42 unexpected PASS!
+60 unexpected FAIL: Correct 'alive', got 'critical A2 B3'
+./regress.sh . connection.tst
+11 unexpected PASS!
+12 unexpected PASS!
+./regress.sh . blunder.tst
+15 unexpected PASS!
+./regress.sh . strategy.tst
+11 unexpected PASS!
+50 unexpected FAIL: Correct 'Q9', got 'Q11'
+./regress.sh . endgame.tst
+107 unexpected PASS!
+108 unexpected FAIL: Correct 'G1', got 'H1'
+./regress.sh . neurogo.tst
+11 unexpected PASS!
+13 unexpected PASS!
+14 unexpected FAIL: Correct 'Q4', got 'O7'
+./regress.sh . arb.tst
+150 unexpected PASS!
+200 unexpected FAIL: Correct 'F14', got 'L18'
+231 unexpected PASS!
+233 unexpected PASS!
+./regress.sh . arion.tst
+1 unexpected FAIL: Correct 'Q6', got 'D2'
+./regress.sh . viking.tst
+2 unexpected PASS!
+./regress.sh . ego.tst
+3 unexpected PASS!
+8 unexpected PASS!
+./regress.sh . strategy2.tst
+53 unexpected FAIL: Correct 'S15', got 'F9'
+54 unexpected FAIL: Correct 'P6', got 'F9'
+74 unexpected FAIL: Correct 'F7', got 'R17'
+80 unexpected FAIL: Correct 'P4|Q4|Q3', got 'H13'
+82 unexpected PASS!
+84 unexpected FAIL: Correct 'J18', got 'Q13'
+89 unexpected PASS!
+./regress.sh . nicklas1.tst
+204 unexpected FAIL: Correct 'F8', got 'J5'
+501 unexpected FAIL: Correct 'G7', got 'F6'
+502 unexpected FAIL: Correct 'G5', got 'H7'
+1206 unexpected PASS!
+1213 unexpected FAIL: Correct 'N4', got 'F12'
+1214 unexpected FAIL: Correct 'A1|A6', got 'R2'
+1509 unexpected FAIL: Correct '!L1', got 'L1'
+1603 unexpected PASS!
+./regress.sh . nicklas2.tst
+1001 unexpected FAIL: Correct 'B7', got 'H8'
+2103 unexpected PASS!
+2202 unexpected FAIL: Correct 'B1', got 'H1'
+./regress.sh . nicklas5.tst
+804 unexpected PASS!
+1204 unexpected FAIL: Correct 'H15', got 'E18'
+./regress.sh . manyfaces.tst
+2 unexpected FAIL: Correct 'S16', got 'T15'
+8 unexpected PASS!
+./regress.sh . trevor.tst
+170 unexpected PASS!
+250 unexpected PASS!
+251 unexpected PASS!
+320 unexpected PASS!
+380 unexpected PASS!
+411 unexpected PASS!
+420 unexpected FAIL: Correct 'G16', got 'A16'
+450 unexpected PASS!
+460 unexpected PASS!
+461 unexpected PASS!
+480 unexpected PASS!
+./regress.sh . buzco.tst
+3 unexpected PASS!
+./regress.sh . strategy3.tst
+105 unexpected PASS!
+111 unexpected PASS!
+134 unexpected PASS!
+136 unexpected PASS!
+137 unexpected FAIL: Correct 'F5', got 'E14'
+./regress.sh . connect.tst
+6 unexpected PASS!
+24 unexpected PASS!
+27 unexpected PASS!
+48 unexpected PASS!
+68 unexpected PASS!
+./regress.sh . global.tst
+1 unexpected FAIL: Correct 'B3', got 'F5'
+16 unexpected PASS!
+26 unexpected FAIL: Correct 'D12', got 'H4'
+36 unexpected PASS!
+./regress.sh . strategy4.tst
+160 unexpected FAIL: Correct 'K2|L2|L3', got 'O6'
+162 unexpected PASS!
+178 unexpected PASS!
+187 unexpected PASS!
+188 unexpected FAIL: Correct 'B6|C4', got 'R6'
+191 unexpected PASS!
+198 unexpected FAIL: Correct 'C10', got 'S18'
+
+========================== 3.1.12 =========================
+
+./regress.sh . owl.tst
+58 unexpected PASS!
+114 unexpected PASS!
+215 unexpected PASS!
+./regress.sh . ld_owl.tst
+42 unexpected FAIL: Correct 'dead', got 'critical Q19 Q19'
+./regress.sh . neurogo.tst
+14 unexpected PASS!
+17 unexpected PASS!
+24 unexpected PASS!
+./regress.sh . arb.tst
+220 unexpected PASS!
+./regress.sh . rosebud.tst
+1 unexpected PASS!
+./regress.sh . strategy2.tst
+65 unexpected FAIL: Correct 'M17', got 'L13'
+72 unexpected FAIL: Correct 'A8', got 'H2'
+81 unexpected FAIL: Correct 'E13|D13', got 'B12'
+./regress.sh . nicklas1.tst
+203 unexpected PASS!
+501 unexpected PASS!
+811 unexpected PASS!
+1216 unexpected PASS!
+1406 unexpected PASS!
+1603 unexpected FAIL: Correct 'B4', got 'C5'
+./regress.sh . nicklas2.tst
+1401 unexpected PASS!
+1802 unexpected FAIL: Correct 'E2', got 'D5'
+./regress.sh . nicklas5.tst
+1202 unexpected PASS!
+./regress.sh . manyfaces.tst
+5 unexpected PASS!
+./regress.sh . niki.tst
+3 unexpected PASS!
+5 unexpected FAIL: Correct 'S9|S10', got 'S14'
+./regress.sh . trevor.tst
+3 unexpected PASS!
+7 unexpected PASS!
+15 unexpected FAIL: Correct 'E7', got 'C6'
+171 unexpected PASS!
+180 unexpected PASS!
+190 unexpected PASS!
+230 unexpected PASS!
+./regress.sh . strategy3.tst
+116 unexpected PASS!
+126 unexpected PASS!
+./regress.sh . connect.tst
+6 unexpected PASS!
+24 unexpected PASS!
+27 unexpected PASS!
+48 unexpected PASS!
+68 unexpected PASS!
+./regress.sh . global.tst
+31 unexpected PASS!
+./regress.sh . strategy4.tst
+178 unexpected FAIL: Correct 'P4|P3', got 'E2'
+180 unexpected FAIL: Correct 'Q8', got 'E2'
+200 unexpected FAIL: Correct 'P6|P7|Q7', got 'S9'
+208 unexpected FAIL: Correct 'A5|A2|B1', got 'B7'
+209 unexpected FAIL: Correct '!A4', got 'A4'
+210 unexpected FAIL: Correct 'H7', got 'G3'
+
+========================== 3.1.11 =========================
+
+./regress.sh . owl.tst
+166 unexpected PASS!
+./regress.sh . owl_rot.tst
+215 unexpected FAIL: Correct '1 M2', got '1 K1'
+65 unexpected PASS!
+152 unexpected PASS!
+./regress.sh . strategy.tst
+6 unexpected PASS!
+27 unexpected PASS!
+29 unexpected FAIL: Correct 'R4', got 'E16'
+50 unexpected PASS!
+./regress.sh . neurogo.tst
+11 unexpected FAIL: Correct 'N5', got 'M1'
+13 unexpected FAIL: Correct '!P7', got 'P7'
+./regress.sh . arb.tst
+232 unexpected PASS!
+./regress.sh . arion.tst
+6 unexpected PASS!
+./regress.sh . strategy2.tst
+80 unexpected PASS!
+84 unexpected PASS!
+./regress.sh . nicklas1.tst
+1206 unexpected FAIL: Correct 'C15', got 'N10'
+1216 unexpected FAIL: Correct 'H3', got 'F3'
+./regress.sh . nicklas2.tst
+1402 unexpected PASS!
+1701 unexpected PASS!
+./regress.sh . nicklas4.tst
+812 unexpected PASS!
+./regress.sh . nicklas5.tst
+1204 unexpected PASS!
+./regress.sh . trevor.tst
+7 unexpected FAIL: Correct '!C5', got 'C5'
+14 unexpected PASS!
+370 unexpected PASS!
+381 unexpected PASS!
+390 unexpected PASS!
+420 unexpected PASS!
+421 unexpected PASS!
+./regress.sh . tactics.tst
+3 unexpected FAIL: Correct 'M18', got 'N17'
+./regress.sh . capture.tst
+7 unexpected PASS!
+./regress.sh . global.tst
+1 unexpected PASS!
+11 unexpected PASS!
+26 unexpected PASS!
+34 unexpected PASS!
+41 unexpected PASS!
+./regress.sh . vie.tst
+2 unexpected PASS!
+9 unexpected PASS!
+10 unexpected PASS!
+19 unexpected PASS!
+27 unexpected PASS!
+38 unexpected PASS!
+39 unexpected PASS!
+41 unexpected PASS!
+./regress.sh . strategy4.tst
+164 unexpected PASS!
+165 unexpected PASS!
+166 unexpected PASS!
+183 unexpected PASS!
+184 unexpected PASS!
+186 unexpected PASS!
+188 unexpected PASS!
+193 unexpected FAIL: Correct 'F16', got 'N18'
+200 unexpected PASS!
+
+========================== 3.1.10 =========================
+
+The failures in strategy4.tst, tactics.tst, connect.tst
+vie.tst and global.tst are all new tests which probably 
+failed in previous versions, too.
+
+./regress.sh . blunder.tst
+6 unexpected PASS!
+./regress.sh . strategy2.tst
+84 unexpected FAIL: Correct 'J18', got 'S15'
+./regress.sh . neurogo.tst
+28 unexpected PASS!
+./regress.sh . strategy4.tst
+175 unexpected PASS!
+187 unexpected FAIL: Correct '!C1', got 'C1'
+188 unexpected FAIL: Correct 'B6|C4', got 'R6'
+189 unexpected FAIL: Correct 'E14', got 'Q14'
+190 unexpected FAIL: Correct 'D13', got 'D14'
+191 unexpected FAIL: Correct 'C12', got 'A13'
+192 unexpected FAIL: Correct 'A15', got 'R4'
+195 unexpected FAIL: Correct '!S14', got 'S14'
+196 unexpected FAIL: Correct 'M17', got 'L17'
+197 unexpected FAIL: Correct 'K3', got 'S18'
+199 unexpected FAIL: Correct 'N5', got 'C10'
+200 unexpected FAIL: Correct 'P6|P7|Q7', got 'C10'
+201 unexpected FAIL: Correct 'D5', got 'C8'
+202 unexpected FAIL: Correct 'B6', got 'G9'
+203 unexpected FAIL: Correct 'D5', got 'E6'
+204 unexpected FAIL: Correct 'B2', got 'A2'
+205 unexpected FAIL: Correct '!O11', got 'O11'
+./regress.sh . nicklas1.tst
+1406 unexpected FAIL: Correct 'B6', got 'B9'
+./regress.sh . nicklas5.tst
+804 unexpected FAIL: Correct 'D6', got 'E8'
+./regress.sh . trevor.tst
+7 unexpected PASS!
+./regress.sh . tactics.tst
+2 unexpected FAIL: Correct 'S11|S12', got 'S9'
+./regress.sh . capture.tst
+4 unexpected FAIL: Correct '1 H5', got '0'
+5 unexpected FAIL: Correct '1 S3', got '0'
+7 unexpected FAIL: Correct '1 S3', got '1 S2'
+8 unexpected FAIL: Correct '0', got '3 R2'
+10 unexpected FAIL: Correct '1 O11', got '1 P11'
+13 unexpected FAIL: Correct '1 D8', got '0'
+18 unexpected FAIL: Correct '0', got '1 H5'
+./regress.sh . connect.tst
+2 unexpected FAIL: Correct '0', got '1 PASS'
+3 unexpected FAIL: Correct '0', got '1 D4'
+4 unexpected FAIL: Correct '0', got '1 Q4'
+6 unexpected FAIL: Correct '0', got '1 C6'
+7 unexpected FAIL: Correct '0', got '1 H6'
+8 unexpected FAIL: Correct '0', got '1 H6'
+10 unexpected FAIL: Correct '1 A6', got '1 PASS'
+11 unexpected FAIL: Correct '1 B7', got '0'
+12 unexpected FAIL: Correct '0', got '1 H8'
+15 unexpected FAIL: Correct '1 B7', got '0'
+16 unexpected FAIL: Correct '1 D5', got '0'
+18 unexpected FAIL: Correct '1 N11', got '1 PASS'
+19 unexpected FAIL: Correct '1 P13', got '1 O12'
+22 unexpected FAIL: Correct '1 O12', got '1 Q10'
+24 unexpected FAIL: Correct '0', got '1 G16'
+25 unexpected FAIL: Correct '1 G1', got '0'
+26 unexpected FAIL: Correct '1 F1', got '1 D3'
+27 unexpected FAIL: Correct '0', got '1 L14'
+29 unexpected FAIL: Correct '0', got '1 PASS'
+30 unexpected FAIL: Correct '0', got '1 PASS'
+31 unexpected FAIL: Correct '1 L10', got '0'
+32 unexpected FAIL: Correct '0', got '1 R13'
+33 unexpected FAIL: Correct '1 F14', got '1 E11'
+35 unexpected FAIL: Correct '0', got '1 M14'
+36 unexpected FAIL: Correct '0', got '1 PASS'
+37 unexpected FAIL: Correct '0', got '1 PASS'
+38 unexpected FAIL: Correct '1 G11', got '0'
+39 unexpected FAIL: Correct '1 G15', got '1 F14'
+40 unexpected FAIL: Correct '0', got '1 D15'
+44 unexpected FAIL: Correct '1 H18', got '1 G17'
+46 unexpected FAIL: Correct '1 B4', got '1 PASS'
+47 unexpected FAIL: Correct '0', got '1 J3'
+48 unexpected FAIL: Correct '0', got '1 G13'
+51 unexpected FAIL: Correct '1 O15', got '1 PASS'
+52 unexpected FAIL: Correct '1 C13', got '1 B15'
+53 unexpected FAIL: Correct '0', got '1 PASS'
+54 unexpected FAIL: Correct '0', got '1 Q16'
+55 unexpected FAIL: Correct '0', got '1 D4'
+56 unexpected FAIL: Correct '0', got '1 Q3'
+57 unexpected FAIL: Correct '1 D5', got '1 PASS'
+58 unexpected FAIL: Correct '1 B12', got '1 PASS'
+61 unexpected FAIL: Correct '1 P5', got '1 PASS'
+65 unexpected FAIL: Correct '1 G8', got '0'
+66 unexpected FAIL: Correct '1 K1', got '1 PASS'
+68 unexpected FAIL: Correct '1 E11', got '1 F11'
+69 unexpected FAIL: Correct '1 E11', got '0'
+70 unexpected FAIL: Correct '0', got '1 PASS'
+71 unexpected FAIL: Correct '1 P4', got '1 Q3'
+72 unexpected FAIL: Correct '1 O11', got '1 PASS'
+73 unexpected FAIL: Correct '0', got '1 N14'
+76 unexpected FAIL: Correct '1 J3', got '0'
+77 unexpected FAIL: Correct '1 J2', got '1 PASS'
+78 unexpected FAIL: Correct '0', got '1 PASS'
+81 unexpected FAIL: Correct '0', got '1 PASS'
+./regress.sh . global.tst
+1 unexpected FAIL: Correct 'B3', got 'F5'
+4 unexpected FAIL: Correct 'Q6', got 'E18'
+6 unexpected FAIL: Correct 'J6', got 'F5'
+7 unexpected FAIL: Correct 'A5', got 'D4'
+8 unexpected FAIL: Correct 'H9', got 'G11'
+9 unexpected FAIL: Correct 'F4', got 'F2'
+10 unexpected FAIL: Correct 'A5', got 'P9'
+11 unexpected FAIL: Correct 'D8', got 'E8'
+16 unexpected FAIL: Correct 'O10', got 'E18'
+17 unexpected FAIL: Correct 'P9', got 'O13'
+20 unexpected FAIL: Correct 'R15', got 'P4'
+21 unexpected FAIL: Correct 'G11', got 'N12'
+22 unexpected FAIL: Correct 'F2', got 'L18'
+23 unexpected FAIL: Correct 'G15', got 'F16'
+25 unexpected FAIL: Correct 'D12', got 'C12'
+26 unexpected FAIL: Correct 'D12', got 'H4'
+27 unexpected FAIL: Correct 'T18', got 'P13'
+28 unexpected FAIL: Correct 'N11', got 'N10'
+31 unexpected FAIL: Correct 'M8', got 'F15'
+34 unexpected FAIL: Correct 'N6', got 'S7'
+36 unexpected FAIL: Correct 'B6', got 'A6'
+37 unexpected FAIL: Correct 'B6', got 'A4'
+40 unexpected FAIL: Correct 'G4', got 'C3'
+41 unexpected FAIL: Correct 'B4', got 'A7'
+43 unexpected FAIL: Correct 'L8', got 'K5'
+./regress.sh . vie.tst
+2 unexpected FAIL: Correct '1 H4', got '2 H4'
+8 unexpected FAIL: Correct '1 S9', got '1 R7'
+9 unexpected FAIL: Correct '1 P15', got '1 R14'
+10 unexpected FAIL: Correct '1 P15', got '0'
+13 unexpected FAIL: Correct '1 J7', got '0'
+16 unexpected FAIL: Correct '0', got '1 M3'
+17 unexpected FAIL: Correct '1 E2', got '1 E6'
+19 unexpected FAIL: Correct '1 S8', got '0'
+20 unexpected FAIL: Correct '1 H9', got '1 Q14'
+22 unexpected FAIL: Correct '1 T18', got '0'
+27 unexpected FAIL: Correct '1 H2', got '1 F3'
+37 unexpected FAIL: Correct '1 B6', got '1 A6'
+38 unexpected FAIL: Correct '1 B6', got '1 A4'
+39 unexpected FAIL: Correct '1 C6', got '1 D7'
+41 unexpected FAIL: Correct '1 B4', got '1 A7'
+50 unexpected FAIL: Correct '1 G14', got '1 H19'
+
+Test results updated
+
+========================== 3.1.9 =========================
+
+./regress.sh . owl.tst
+221 unexpected PASS!
+222 unexpected PASS!
+./regress.sh . connection.tst
+4 unexpected PASS!
+./regress.sh . strategy.tst
+34 unexpected PASS!
+./regress.sh . strategy2.tst
+78 unexpected PASS!
+84 unexpected PASS!
+99 unexpected PASS!
+./regress.sh . neurogo.tst
+11 unexpected PASS!
+./regress.sh . arb.tst
+231 unexpected FAIL: Correct 'F5', got 'D8'
+./regress.sh . dniwog.tst
+./regress.sh . strategy3.tst
+143 unexpected PASS!
+./regress.sh . strategy4.tst
+161 unexpected PASS!
+165 unexpected FAIL: Correct 'K3|L6', got 'M2'
+./regress.sh . nicklas1.tst
+501 unexpected FAIL: Correct 'G7', got 'F6'
+./regress.sh . nicklas2.tst
+1407 unexpected PASS!
+2401 unexpected PASS!
+./regress.sh . nicklas3.tst
+1403 unexpected PASS!
+./regress.sh . nicklas4.tst
+./regress.sh . nicklas5.tst
+./regress.sh . manyfaces.tst
+7 unexpected PASS!
+10 unexpected PASS!
+./regress.sh . niki.tst
+4 unexpected FAIL: Correct 'Q8', got 'R13'
+5 unexpected PASS!
+8 unexpected PASS!
+9 unexpected PASS!
+./regress.sh . trevor.tst
+2 unexpected PASS!
+4 unexpected PASS!
+5 unexpected PASS!
+13 unexpected PASS!
+15 unexpected PASS!
+162 unexpected PASS!
+201 unexpected PASS!
+210 unexpected PASS!
+240 unexpected PASS!
+270 unexpected PASS!
+281 unexpected PASS!
+290 unexpected PASS!
+300 unexpected PASS!
+301 unexpected PASS!
+./regress.sh . buzco.tst
+4 unexpected PASS!
+
+========================== 3.1.8 =========================
+
+./regress.sh . reading.tst
+30 unexpected PASS!
+54 unexpected PASS!
+65 unexpected FAIL: Correct '0', got '1 S4'
+94 unexpected PASS!
+95 unexpected PASS!
+96 unexpected PASS!
+139 unexpected PASS!
+147 unexpected FAIL: Correct '1 H1', got '2 H1'
+149 unexpected PASS!
+./regress.sh . owl_rot.tst
+193 unexpected PASS!
+./regress.sh . filllib.tst
+29 unexpected PASS!
+./regress.sh . strategy.tst
+40 unexpected FAIL: Correct 'E5', got 'L14'
+./regress.sh . arb.tst
+204 unexpected FAIL: Correct 'S7', got 'T11'
+./regress.sh . strategy3.tst
+141 unexpected PASS!
+./regress.sh . strategy4.tst
+153 unexpected PASS!
+165 unexpected PASS!
+./regress.sh . nicklas1.tst
+203 unexpected FAIL: Correct 'J5', got 'B6'
+./regress.sh . nicklas3.tst
+401 unexpected PASS!
+./regress.sh . trevor.tst
+12 unexpected PASS!
+./regress.sh . tactics.tst
+
+Test results updated. A few new tests were fixed, too.
+
+========================== 3.1.7 =========================
+
+./regress.sh . owl.tst
+150 unexpected PASS!
+219 unexpected FAIL: Correct '0', got '1 M19'
+./regress.sh . filllib.tst
+25 unexpected PASS!
+29 unexpected FAIL: Correct 'B1|A1', got 'F19'
+./regress.sh . strategy3.tst
+117 unexpected PASS!
+./regress.sh . strategy4.tst
+160 unexpected PASS!
+./regress.sh . nicklas2.tst
+2202 unexpected PASS!
+./regress.sh . unsorted.tst
+1 unexpected PASS!
+6 unexpected PASS!
+8 unexpected PASS!
+10 unexpected PASS!
+
+Test results updated. The two broken tests are both new.
+
+========================== 3.1.5 =========================
+
+./regress.sh . strategy.tst
+26 unexpected PASS!
+./regress.sh . neurogo.tst
+13 unexpected PASS!
+./regress.sh . strategy3.tst
+144 unexpected PASS!
+149 unexpected PASS!
+
+Test results updated.
+
+========================== 3.1.4 =========================
+
+./regress.sh . blunder.tst
+15 unexpected FAIL: Correct 'H3', got 'J1'
+./regress.sh . strategy.tst
+32 unexpected PASS!
+./regress.sh . strategy2.tst
+75 unexpected PASS!
+./regress.sh . endgame.tst
+211 unexpected PASS!
+401 unexpected FAIL: Correct 'C4', got 'E5'
+./regress.sh . rosebud.tst
+1 unexpected FAIL: Correct 'E16', got 'F18'
+./regress.sh . golife.tst
+7 unexpected PASS!
+./regress.sh . arion.tst
+6 unexpected FAIL: Correct 'E19', got 'H19'
+./regress.sh . viking.tst
+3 unexpected PASS!
+./regress.sh . ego.tst
+3 unexpected FAIL: Correct 'H18', got 'K16'
+4 unexpected FAIL: Correct '!G19', got 'G19'
+./regress.sh . nicklas1.tst
+1206 unexpected PASS!
+1213 unexpected PASS!
+2001 unexpected PASS!
+./regress.sh . nicklas2.tst
+904 unexpected PASS!
+./regress.sh . strategy3.tst
+103 unexpected FAIL: Correct 'B16', got 'A15'
+111 unexpected FAIL: Correct 'K3', got 'P2'
+117 unexpected FAIL: Correct 'M2', got 'P2'
+120 unexpected FAIL: Correct 'C7', got 'B7'
+154 unexpected PASS!
+160 unexpected FAIL: Correct 'K2|L2|L3', got 'O6'
+./regress.sh niki.tst
+13 unexpected PASS!
+
+Test results updated.
+
+========================== 3.1.3 =========================
+
+./regress.sh . endgame.tst
+211 unexpected FAIL: Correct 'A5', got 'O2'
+401 unexpected PASS!
+./regress.sh . neurogo.tst
+3 unexpected PASS!
+15 unexpected PASS!
+./regress.sh . rosebud.tst
+1 unexpected PASS!
+./regress.sh . golife.tst
+7 unexpected FAIL: Correct 'F3', got 'E4'
+./regress.sh . arion.tst
+./regress.sh . viking.tst
+3 unexpected FAIL: Correct 'M15|B7', got 'P18'
+./regress.sh . ego.tst
+3 unexpected PASS!
+4 unexpected PASS!
+./regress.sh . nicklas1.tst
+1206 unexpected FAIL: Correct 'C15', got 'F18'
+./regress.sh . strategy3.tst
+160 unexpected PASS!
+170 unexpected PASS!
+171 unexpected PASS!
+172 unexpected PASS!
+174 unexpected PASS!
+
+========================== 3.1.2 =========================
+
+./regress.sh . owl.tst
+217 unexpected PASS!
+218 unexpected PASS!
+./regress.sh . filllib.tst
+25 unexpected FAIL: Correct 'J3|J5', got 'H1'
+./regress.sh . blunder.tst
+14 unexpected PASS!
+./regress.sh . neurogo.tst
+3 unexpected PASS!
+15 unexpected PASS!
+./regress.sh . golife.tst
+7 unexpected FAIL: Correct 'F3', got 'E4'
+./regress.sh . nicklas1.tst
+1213 unexpected FAIL: Correct 'N4', got 'F12'
+1604 unexpected PASS!
+./regress.sh . nicklas2.tst
+904 unexpected FAIL: Correct 'B1|E1', got 'G6'
+./regress.sh . strategy3.tst
+117 unexpected PASS!
+
+========================== 3.1.1 =========================
+
+./regress.sh . owl.tst
+217 unexpected PASS!
+218 unexpected PASS!
+./regress.sh . atari_atari.tst
+1 unexpected PASS!
+./regress.sh . blunder.tst
+13 unexpected PASS!
+./regress.sh . strategy.tst
+8 unexpected PASS!
+27 unexpected FAIL: Correct 'C3', got 'F2'
+32 unexpected FAIL: Correct 'A4', got 'A2'
+./regress.sh . neurogo.tst
+13 unexpected FAIL: Correct '!P7', got 'P7'
+./regress.sh . arb.tst
+204 unexpected PASS!
+./regress.sh . ego.tst
+3 unexpected FAIL: Correct 'H18', got 'K16'
+./regress.sh . nicklas1.tst
+2001 unexpected FAIL: Correct 'G5', got 'H2'
+./regress.sh . nicklas2.tst
+2201 unexpected PASS!
+./regress.sh . strategy3.tst
+110 unexpected FAIL: Correct 'A8', got 'R6'
+111 unexpected PASS!
+120 unexpected PASS!
+167 unexpected PASS!
+
+Test results updated.
+
diff --git a/regression/Makefile.am b/regression/Makefile.am
new file mode 100644 (file)
index 0000000..04d3aad
--- /dev/null
@@ -0,0 +1,378 @@
+TST = 13x13b.tst 13x13.tst arb.tst arend2.tst arend.tst \
+      arion.tst atari_atari.tst auto01.tst auto02.tst \
+      auto03.tst auto04.tst auto_handtalk.tst blunder.tst \
+      break_in.tst buzco.tst capture.tst century2002.tst \
+      connection.tst connect.tst \
+      dniwog.tst ego.tst \
+      endgame.tst endgame1.tst filllib.tst global.tst \
+      golife.tst gunnar.tst handtalk.tst heikki.tst \
+      joseki.tst lazarus.tst ld_owl.tst \
+      manyfaces1.tst manyfaces.tst nando.tst neurogo.tst \
+      newscore.tst nicklas1.tst nicklas2.tst nicklas3.tst \
+      nicklas4.tst nicklas5.tst niki.tst ninestones.tst \
+      nngs1.tst nngs2.tst nngs3.tst nngs4.tst \
+      nngs.tst optics.tst owl1.tst \
+      owl.tst reading.tst \
+      rosebud.tst safety.tst score2.tst \
+      score.tst semeai.tst \
+      strategy2.tst strategy3.tst strategy4.tst strategy5.tst \
+      strategy.tst tactics1.tst tactics.tst \
+      thrash.tst trevora.tst trevorb.tst trevorc.tst \
+      trevord.tst trevor.tst vie.tst viking.tst gifu03.tst seki.tst \
+      9x9.tst unconditional.tst cgf2004.tst kgs.tst olympiad2004.tst \
+      tiny.tst gifu05.tst 13x13c.tst STS-RV_0.tst STS-RV_1.tst \
+      STS-RV_e.tst STS-RV_Misc.tst
+
+noinst_SCRIPTS = eval.sh regress.sh test.sh eval3.sh
+
+EXTRA_DIST = golois games $(TST) $(noinst_SCRIPTS) regress.awk \
+             BREAKAGE regress.pl regress.plx regress.pike breakage2tst.py \
+            view.pike benchmark/*gtp regress.cmd
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *.orig *~
+
+check: first_batch
+
+regression: first_batch
+
+test: all_batches
+
+13x13: 13x13.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+13x13b: 13x13b.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arb: arb.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arend: arend.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arend2: arend2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arion: arion.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+atari_atari: atari_atari.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+auto: auto01.tst auto02.tst auto03.tst auto04.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto01.tst $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto02.tst $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto03.tst $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto04.tst $(GG_OPTIONS)
+
+auto_handtalk: auto_handtalk.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^
+
+blunder: blunder.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+break_in: break_in.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+buzco: buzco.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+capture: capture.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^  $(GG_OPTIONS)
+
+century2002: century2002.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^  $(GG_OPTIONS)
+
+connect: connect.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+connection: connection.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+dniwog: dniwog.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+ego: ego.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+endgame: endgame.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+filllib: filllib.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+gifu05: gifu05.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+golife: golife.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+global: global.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+gunnar: gunnar.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+handtalk: handtalk.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+heikki: heikki.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+joseki: joseki.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+lazarus: lazarus.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+ld_owl: ld_owl.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+manyfaces: manyfaces.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+manyfaces1: manyfaces1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nando: nando.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+neurogo: neurogo.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+newscore: newscore.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas: nicklas1 nicklas2 nicklas3 nicklas4 nicklas5
+
+nicklas1: nicklas1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas2: nicklas2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas3: nicklas3.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas4: nicklas4.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas5: nicklas5.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+niki: niki.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+ninestones: ninestones.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs: nngs.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs1: nngs1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs2: nngs2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs3: nngs3.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs4: nngs4.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+olympiad2004: olympiad2004.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+optics: optics.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+owl: owl.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+owl1: owl1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+owl_rotall: owl.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 0 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 1 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 2 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 3 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 4 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 5 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 6 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 7 $(GG_OPTIONS)
+
+reading: reading.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+rosebud: rosebud.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+safety: safety.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+score: score.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+score2: score2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+semeai: semeai.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy: strategy.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy2: strategy2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy3: strategy3.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy4: strategy4.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy5: strategy5.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_0: STS-RV_0.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_1: STS-RV_1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_e: STS-RV_e.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_Misc: STS-RV_Misc.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+tactics: tactics.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+tactics1: tactics1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+thrash: thrash.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+tiny: tiny.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevor: trevor.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevora: trevora.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevorb: trevorb.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevorc: trevorc.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevord: trevord.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+viking: viking.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+vie: vie.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+
+all_batches: first_batch second_batch third_batch fourth_batch fifth_batch
+
+first_batch: 
+       $(srcdir)/regress.sh $(srcdir) reading.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) owl.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) ld_owl.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) optics.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) filllib.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) atari_atari.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) connection.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) break_in.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) blunder.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) unconditional.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevora.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy.tst $(GG_OPTIONS)
+
+second_batch: 
+       $(srcdir)/regress.sh $(srcdir) endgame.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) heikki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) neurogo.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arb.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) rosebud.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) golife.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arion.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) viking.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) ego.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) dniwog.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) lazarus.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevorb.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy2.tst $(GG_OPTIONS)
+
+third_batch: 
+       $(srcdir)/regress.sh $(srcdir) nicklas1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas2.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas3.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas4.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas5.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) manyfaces.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) niki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevor.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) tactics.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) buzco.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevorc.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy3.tst $(GG_OPTIONS)
+
+fourth_batch: 
+       $(srcdir)/regress.sh $(srcdir) capture.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) connect.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) global.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) vie.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arend.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 13x13.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) semeai.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_0.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_e.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_Misc.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevord.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy4.tst $(GG_OPTIONS)
+
+fifth_batch:
+       $(srcdir)/regress.sh $(srcdir) owl1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) handtalk.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs2.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs3.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs4.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy5.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) century2002.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto01.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto02.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto03.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto04.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto_handtalk.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) safety.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) ninestones.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) tactics1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) manyfaces1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) gunnar.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arend2.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nando.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) thrash.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 13x13b.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) joseki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) gifu03.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) seki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 9x9.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) cgf2004.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) kgs.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) olympiad2004.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) tiny.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) gifu05.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 13x13c.tst $(GG_OPTIONS)
diff --git a/regression/Makefile.in b/regression/Makefile.in
new file mode 100644 (file)
index 0000000..118d9b0
--- /dev/null
@@ -0,0 +1,671 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = regression
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SCRIPTS = $(noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+TST = 13x13b.tst 13x13.tst arb.tst arend2.tst arend.tst \
+      arion.tst atari_atari.tst auto01.tst auto02.tst \
+      auto03.tst auto04.tst auto_handtalk.tst blunder.tst \
+      break_in.tst buzco.tst capture.tst century2002.tst \
+      connection.tst connect.tst \
+      dniwog.tst ego.tst \
+      endgame.tst endgame1.tst filllib.tst global.tst \
+      golife.tst gunnar.tst handtalk.tst heikki.tst \
+      joseki.tst lazarus.tst ld_owl.tst \
+      manyfaces1.tst manyfaces.tst nando.tst neurogo.tst \
+      newscore.tst nicklas1.tst nicklas2.tst nicklas3.tst \
+      nicklas4.tst nicklas5.tst niki.tst ninestones.tst \
+      nngs1.tst nngs2.tst nngs3.tst nngs4.tst \
+      nngs.tst optics.tst owl1.tst \
+      owl.tst reading.tst \
+      rosebud.tst safety.tst score2.tst \
+      score.tst semeai.tst \
+      strategy2.tst strategy3.tst strategy4.tst strategy5.tst \
+      strategy.tst tactics1.tst tactics.tst \
+      thrash.tst trevora.tst trevorb.tst trevorc.tst \
+      trevord.tst trevor.tst vie.tst viking.tst gifu03.tst seki.tst \
+      9x9.tst unconditional.tst cgf2004.tst kgs.tst olympiad2004.tst \
+      tiny.tst gifu05.tst 13x13c.tst STS-RV_0.tst STS-RV_1.tst \
+      STS-RV_e.tst STS-RV_Misc.tst
+
+noinst_SCRIPTS = eval.sh regress.sh test.sh eval3.sh
+EXTRA_DIST = golois games $(TST) $(noinst_SCRIPTS) regress.awk \
+             BREAKAGE regress.pl regress.plx regress.pike breakage2tst.py \
+            view.pike benchmark/*gtp regress.cmd
+
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *.orig *~
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  regression/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  regression/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       $(mkdir_p) $(distdir)/benchmark
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+       distclean-generic distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-exec \
+       install-exec-am install-info install-info-am install-man \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-info-am
+
+
+check: first_batch
+
+regression: first_batch
+
+test: all_batches
+
+13x13: 13x13.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+13x13b: 13x13b.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arb: arb.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arend: arend.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arend2: arend2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+arion: arion.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+atari_atari: atari_atari.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+auto: auto01.tst auto02.tst auto03.tst auto04.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto01.tst $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto02.tst $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto03.tst $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $(srcdir)/auto04.tst $(GG_OPTIONS)
+
+auto_handtalk: auto_handtalk.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^
+
+blunder: blunder.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+break_in: break_in.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+buzco: buzco.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+capture: capture.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^  $(GG_OPTIONS)
+
+century2002: century2002.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^  $(GG_OPTIONS)
+
+connect: connect.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+connection: connection.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+dniwog: dniwog.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+ego: ego.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+endgame: endgame.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+filllib: filllib.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+gifu05: gifu05.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+golife: golife.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+global: global.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+gunnar: gunnar.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+handtalk: handtalk.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+heikki: heikki.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+joseki: joseki.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+lazarus: lazarus.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+ld_owl: ld_owl.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+manyfaces: manyfaces.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+manyfaces1: manyfaces1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nando: nando.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+neurogo: neurogo.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+newscore: newscore.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas: nicklas1 nicklas2 nicklas3 nicklas4 nicklas5
+
+nicklas1: nicklas1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas2: nicklas2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas3: nicklas3.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas4: nicklas4.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nicklas5: nicklas5.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+niki: niki.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+ninestones: ninestones.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs: nngs.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs1: nngs1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs2: nngs2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs3: nngs3.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+nngs4: nngs4.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+olympiad2004: olympiad2004.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+optics: optics.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+owl: owl.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+owl1: owl1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+owl_rotall: owl.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 0 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 1 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 2 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 3 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 4 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 5 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 6 $(GG_OPTIONS)
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ --gtp-initial-orientation 7 $(GG_OPTIONS)
+
+reading: reading.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+rosebud: rosebud.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+safety: safety.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+score: score.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+score2: score2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+semeai: semeai.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy: strategy.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy2: strategy2.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy3: strategy3.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy4: strategy4.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+strategy5: strategy5.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_0: STS-RV_0.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_1: STS-RV_1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_e: STS-RV_e.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+STS-RV_Misc: STS-RV_Misc.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+tactics: tactics.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+tactics1: tactics1.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+thrash: thrash.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+tiny: tiny.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevor: trevor.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevora: trevora.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevorb: trevorb.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevorc: trevorc.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+trevord: trevord.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+viking: viking.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+vie: vie.tst
+       env RD=$(srcdir) $(srcdir)/eval.sh $^ $(GG_OPTIONS)
+
+all_batches: first_batch second_batch third_batch fourth_batch fifth_batch
+
+first_batch: 
+       $(srcdir)/regress.sh $(srcdir) reading.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) owl.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) ld_owl.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) optics.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) filllib.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) atari_atari.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) connection.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) break_in.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) blunder.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) unconditional.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevora.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy.tst $(GG_OPTIONS)
+
+second_batch: 
+       $(srcdir)/regress.sh $(srcdir) endgame.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) heikki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) neurogo.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arb.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) rosebud.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) golife.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arion.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) viking.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) ego.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) dniwog.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) lazarus.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevorb.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy2.tst $(GG_OPTIONS)
+
+third_batch: 
+       $(srcdir)/regress.sh $(srcdir) nicklas1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas2.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas3.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas4.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nicklas5.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) manyfaces.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) niki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevor.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) tactics.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) buzco.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevorc.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy3.tst $(GG_OPTIONS)
+
+fourth_batch: 
+       $(srcdir)/regress.sh $(srcdir) capture.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) connect.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) global.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) vie.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arend.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 13x13.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) semeai.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_0.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_e.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) STS-RV_Misc.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) trevord.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy4.tst $(GG_OPTIONS)
+
+fifth_batch:
+       $(srcdir)/regress.sh $(srcdir) owl1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) handtalk.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs2.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs3.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nngs4.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) strategy5.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) century2002.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto01.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto02.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto03.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto04.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) auto_handtalk.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) safety.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) ninestones.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) tactics1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) manyfaces1.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) gunnar.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) arend2.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) nando.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) thrash.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 13x13b.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) joseki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) gifu03.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) seki.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 9x9.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) cgf2004.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) kgs.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) olympiad2004.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) tiny.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) gifu05.tst $(GG_OPTIONS)
+       $(srcdir)/regress.sh $(srcdir) 13x13c.tst $(GG_OPTIONS)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/regression/README b/regression/README
new file mode 100644 (file)
index 0000000..ccdfb53
--- /dev/null
@@ -0,0 +1,5 @@
+The files with suffix .gtp and .res are automatically generated from
+the .tst files. Only edit the latter files.
+
+Please see the Texinfo documentation (Regression) for further
+information.
diff --git a/regression/STS-RV_0.tst b/regression/STS-RV_0.tst
new file mode 100644 (file)
index 0000000..709fe8b
--- /dev/null
@@ -0,0 +1,125 @@
+# This suite of semeai problems came from the package STS-RV
+# available at http://gobase.org/reading/preview/Semeai/#STS
+#
+# It is a very comprehensive semeai problems suite
+# compiled by Ricard Vilà. The associated tests are in GTP
+# format but it's not a perfect match for GNU Go because
+# it uses a custom command called solve-semeaiS.
+# (More info at http://trac.gnugo.org/gnugo/ticket/41)
+#
+# This file instead is based on the normal GNU Go commands
+# (analyze_semeai) and enable the execution of the tests
+# in the semeais_0.tst file from STS-RV suite of semeai problems.
+#
+# For any of the problems below, if PASS is a solution it is the best
+# solution. However the other solutions are acceptable.
+
+############## semeai tests #################
+#
+# After analyze_semeai [dragon1] [dragon2]
+# the results are returned in the form (result1) (result2).
+# These are the results of the defense of dragon1 and the attack
+# of dragon2 assuming that the dragon1 player moves first. Thus
+# a result 1 0 typically means seki, while a 1 1 result means a kill
+# and 0 0 means the semeai is lost. In addition to seki, 1 0 may mean
+# that both dragons gain independent life.
+# The result [0 1] is not possible as a correct result but GNU Go
+# has been known to return that occasionally.
+# Result 2 mean success with good ko, 3 success with bad ko.
+# A good ko is characterized by the opponent having to make the first
+# external ko threat whereas a bad ko is the opposite.
+#
+# NOTE: In some problem GNU Go suggest a move instead to PASS
+# but the result of the semeai analysis is correct, so to avoid
+# a fail not relevant for the test, the move is ignored using
+# a regular expression: #? [x y (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_001.sgf
+1 analyze_semeai A11 A10
+#? [1 1 (.*)]
+2 analyze_semeai A10 A11
+#? [0 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_002.sgf
+3 analyze_semeai L1 N1
+#? [1 0 (.*)]
+
+4 analyze_semeai N1 L1
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_003.sgf
+5 analyze_semeai H1 K1
+#? [1 0 (.*)]
+
+6 analyze_semeai K1 H1
+#? [1 0 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_004.sgf
+7 analyze_semeai A11 A10
+#? [1 1 (A9|B9|C9|D9|E9|F9|G9|H9|J9|K9|L9|M9|N9|O9|P9|Q9|R9|S9|T9)]
+
+8 analyze_semeai A10 A11
+#? [1 1 (A12|B12|C12|D12|E12|F12|G12|H12|J12|K12|L12|M12|N12|O12|P12|Q12|R12|S12|T12)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_005.sgf
+9 analyze_semeai A11 A10
+#? [0 0 PASS]
+
+10 analyze_semeai A10 A11
+#? [1 1 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_006.sgf
+11 analyze_semeai A16 A17
+#? [1 1 B18|C18|D18]
+
+12 analyze_semeai A17 A16
+#? [1 1 A15|B15|B14]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_007.sgf
+13 analyze_semeai H9 G9
+#? [1 0 (.*)]
+
+14 analyze_semeai G9 H9
+#? [1 0 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_008.sgf
+15 analyze_semeai K13 L13
+#? [1 1 (M10|M12)]
+
+16 analyze_semeai L13 K13
+#? [1 0 (H11|H12|J13)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_009.sgf
+17 analyze_semeai K13 L13
+#? [1 1 (M10|M11|M12)]
+
+18 analyze_semeai L13 K13
+#? [1 1 (H11|H12|J13)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_010.sgf
+19 analyze_semeai J14 H14
+#? [1 1 (.*)]
+
+20 analyze_semeai H14 J14
+#? [0 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_011.sgf
+21 analyze_semeai J14 H14
+#? [1 1 (G12|G13|G14)]
+
+22 analyze_semeai H14 J14
+#? [1 1 (L10|L12|L13)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_012.sgf
+23 analyze_semeai J14 H14
+#? [1 1 (G12|G13|G14)]
+
+24 analyze_semeai H14 J14
+#? [1 1 (L10|L11|L12)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C0_013.sgf
+25 analyze_semeai A10 A11
+#? [1 1 (A12|C12)]
+
+26 analyze_semeai A11 A10
+#? [1 1 (A9|C9)]
diff --git a/regression/STS-RV_1.tst b/regression/STS-RV_1.tst
new file mode 100644 (file)
index 0000000..217971f
--- /dev/null
@@ -0,0 +1,698 @@
+# This suite of semeai problems came from the package STS-RV/Class01eProblems
+# available at http://gobase.org/reading/preview/Semeai/#STS
+#
+# It is a very comprehensive semeai problems suite
+# compiled by Ricard Vilà. The associated tests are in GTP
+# format but it's not a perfect match for GNU Go because
+# it uses a custom command called solve-semeaiS.
+# (More info at http://trac.gnugo.org/gnugo/ticket/41)
+#
+# This file instead is based on the normal GNU Go commands
+# (analyze_semeai) and enable the execution of the tests
+# in the semeais_1.tst file from STS-RV suite of semeai problems.
+#
+# For any of the problems below, if PASS is a solution it is the best
+# solution. However the other solutions are acceptable.
+
+############## semeai tests #################
+#
+# After analyze_semeai [dragon1] [dragon2]
+# the results are returned in the form (result1) (result2).
+# These are the results of the defense of dragon1 and the attack
+# of dragon2 assuming that the dragon1 player moves first. Thus
+# a result 1 0 typically means seki, while a 1 1 result means a kill
+# and 0 0 means the semeai is lost. In addition to seki, 1 0 may mean
+# that both dragons gain independent life.
+# The result [0 1] is not possible as a correct result but GNU Go
+# has been known to return that occasionally.
+# Result 2 mean success with good ko, 3 success with bad ko.
+# A good ko is characterized by the opponent having to make the first
+# external ko threat whereas a bad ko is the opposite.
+#
+# NOTE: In some problem GNU Go suggest a move instead to PASS
+# but the result of the semeai analysis is correct, so to avoid
+# a fail not relevant for the test, the move is ignored using
+# a regular expression: #? [x y (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_001.sgf
+1 analyze_semeai J19 L19
+#? [0 0 PASS]
+
+2 analyze_semeai L19 J19
+#? [1 1 (.*)]
+
+3 analyze_semeai C10 C9
+#? [1 1 (D8|C3|B3|A3)]*
+
+4 analyze_semeai C9 C10
+#? [1 1 (A10|A12|B11|A8|B8|B12)]
+
+5 analyze_semeai K3 L3
+#? [1 1 (M4|N4|R3|R2|R1)]*
+
+6 analyze_semeai L3 K3
+#? [1 1 (J2|K1|H1|M2|M1|H2)]
+
+7 analyze_semeai Q10 Q11
+#? [1 1 (T16|S16|R16|Q15|Q14)]
+
+8 analyze_semeai Q11 Q10
+#? [1 1 (S8|T9|T7|R11|S11|T11|S9)]
+
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_002.sgf
+9 analyze_semeai B18 A18
+#? [1 1 (D19|D18)]
+
+10 analyze_semeai A18 B18
+#? [1 1 A17]
+
+11 analyze_semeai S18 T18
+#? [1 1 (Q19|Q18)]
+
+12 analyze_semeai T18 S18
+#? [1 1 T17]
+
+13 analyze_semeai B2 A2
+#? [1 1 (.*)]
+
+14 analyze_semeai A2 B2
+#? [0 0 PASS]
+
+15 analyze_semeai S2 T2
+#? [1 1 (.*)]
+
+16 analyze_semeai T2 S2
+#? [0 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_003.sgf
+17 analyze_semeai E19 F19
+#? [1 1 (D14|C14|C13|C12|C11|B10|B19)]
+
+18 analyze_semeai F19 E19
+#? [1 1 A16]
+
+19 analyze_semeai T5 T6
+#? [1 1 (R7|Q7|P6|O5|O4|O3|N3|M3|L3|K2)]
+
+20 analyze_semeai T6 T5
+#? [1 1 (R3|S4|S2|T3)]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_004.sgf
+21 analyze_semeai C15 C16
+#? [1 0 (.*)]
+
+22 analyze_semeai C16 C15
+#? [1 0 (.*)]
+
+23 analyze_semeai C5 C4
+#? [1 0 (C3|C2)]
+
+24 analyze_semeai C4 C5
+#? [1 1 (A5|B5)]
+
+25 analyze_semeai T5 T4
+#? [1 1 T3]
+
+26 analyze_semeai T4 T5
+#? [1 1 T7]
+
+27 analyze_semeai S15 S16
+#? [1 0 PASS]
+
+28 analyze_semeai S16 S15
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_005.sgf
+29 analyze_semeai A16 A17
+#? [1 1 (A18|A19)]
+
+30 analyze_semeai A17 A16
+#? [1 1 (A15|A14)]
+
+31 analyze_semeai C4 C3
+#? [1 0 PASS]*
+
+32 analyze_semeai C3 C4
+#? [1 0 PASS]
+
+33 analyze_semeai S5 S4
+#? [1 1 T4]
+
+34 analyze_semeai S4 S5
+#? [1 0 (T7|T6)]
+
+35 analyze_semeai T15 T16
+#? [1 0 PASS]
+
+36 analyze_semeai T16 T15
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_006.sgf
+37 analyze_semeai A16 A17
+#? [1 1 (E19|E18)]
+
+38 analyze_semeai A17 A16
+#? [1 1 (A11|B11)]
+
+39 analyze_semeai D4 D3
+#? [1 0 (E2|E1|A2|C2|A8)]
+#A8 is deprecated but also achieves seki.
+
+40 analyze_semeai D3 D4
+#? [1 1 (C6|C7)]
+
+41 analyze_semeai S4 S3
+#? [1 0 (T2|R2|T8)]
+
+42 analyze_semeai S3 S4
+#? [1 1 T4]
+
+#Unexpected behavior. Black can choose between both living or killing
+43 analyze_semeai S15 S16
+#? [1 1 S18]
+
+44 analyze_semeai S16 S15
+#? [1 0 (T13|S18|R11|R12)]
+#R11 R12 deprecated leave more ko threats
+
+45 analyze_semeai N14 N15
+#? [1 1 H12]
+
+46 analyze_semeai N15 N14
+#? [1 1 H12]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_007.sgf
+47 analyze_semeai A15 A16
+#? [1 1 (A18|A17|B18|B17)]
+
+48 analyze_semeai A16 A15
+#? [1 1 (C13|C14)]
+
+49 analyze_semeai E2 D2
+#? [1 0 (A5|B5|A3|B1)]
+
+50 analyze_semeai D2 E2
+#? [1 1 J1]
+
+51 analyze_semeai Q18 R18
+#? [1 0 PASS]
+
+52 analyze_semeai R18 Q18
+#? [1 0 PASS]
+
+53 analyze_semeai S3 S4
+#? [1 1 R6]
+
+54 analyze_semeai S4 S3
+#? [1 0 (O2|O1|R2|Q1|S1)]*
+
+55 analyze_semeai K14 L14
+#? [1 1 (P12|P11|O10|M9)]
+
+56 analyze_semeai L14 K14
+#? [1 0 (J15|H15|F14|E13|E12|F10)]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_008.sgf
+57 analyze_semeai A16 A17
+#? [1 1 B19]
+
+58 analyze_semeai A17 A16
+#? [1 1 (B13|A14)]
+
+59 analyze_semeai B4 B3
+#? [0 0 PASS]*
+
+60 analyze_semeai B3 B4
+#? [1 1 (.*)]
+
+61 analyze_semeai R2 Q2
+#? [1 1 (T3|O1|O2|P1|P3|R1)]
+
+62 analyze_semeai Q2 R2
+#? [1 0 T3]
+
+63 analyze_semeai P15 Q15
+#? [1 0 PASS]*
+
+64 analyze_semeai Q15 P15
+#? [1 0 PASS]*
+
+65 analyze_semeai K10 K9
+#? [1 0 PASS]*
+
+66 analyze_semeai K9 K10
+#? [1 0 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_009.sgf
+67 analyze_semeai E18 D18
+#? [1 1 (B14|C14|A17|B17|C17|B16)]
+
+68 analyze_semeai D18 E18
+#? [1 0 (G15|H15|K19|K18|G17|G19|F18|H18)]*
+
+69 analyze_semeai A5 A6
+#? [1 1 D6
+
+70 analyze_semeai A6 A5
+#? [1 0 (C3|B4)]*
+
+71 analyze_semeai S4 S5
+#? [0 0 PASS]
+
+72 analyze_semeai S5 S4
+#? [1 1 (.*)]
+
+73 analyze_semeai N16 N15
+#? [1 0 PASS]*
+
+74 analyze_semeai N15 N16
+#? [1 0 PASS]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_010.sgf
+75 analyze_semeai A15 A16
+#? [1 1 (C18|B17|D17)]*
+
+76 analyze_semeai A16 A15
+#? [1 1 (C18|B17|D17)]
+
+77 analyze_semeai E1 F1
+#? [1 1 (.*)]
+
+78 analyze_semeai F1 E1
+#? [0 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_011.sgf
+79 analyze_semeai A15 A16
+#? [1 1 (E19|F18|F17)]*
+
+80 analyze_semeai A16 A15
+#? [1 0 (F12|F11|F10|F9|E8|D8)]*
+
+81 analyze_semeai D2 E2
+#? [1 1 E1]*
+
+82 analyze_semeai E2 D2
+#? [1 0 B2]*
+
+83 analyze_semeai R3 Q3
+#? [1 0 PASS]*
+
+84 analyze_semeai Q3 R3
+#? [1 0 PASS]*
+
+85 analyze_semeai Q19 P19
+#? [1 1 (N17|L16)]*
+
+86 analyze_semeai P19 Q19
+#? [1 1 (Q17|R16)]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_012.sgf
+87 analyze_semeai E19 D19
+#? [1 1 (B17|D17)]*
+
+88 analyze_semeai D19 E19
+#? [1 1 (G19|J17|K17|L17|M17|G16|G15|G14|F13|E13|D13|C13|B13|A13)]
+
+89 analyze_semeai O5 P5
+#? [1 1 (T5|S6)]*
+
+90 analyze_semeai P5 O5
+#? [1 1 (B3|C3|D3|D4|D5|E6|F5|F4|F3|G3|H3|J3|J1|K4|L4)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_013.sgf
+91 analyze_semeai E19 D19
+#? [0 0 PASS]
+
+92 analyze_semeai D19 E19
+#? [1 1 (.*)]
+
+93 analyze_semeai O5 P5
+#? [0 0 PASS]
+
+94 analyze_semeai P5 O5
+#? [1 1 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_014.sgf
+95 analyze_semeai E19 D19
+#? [1 1 PASS]*
+
+96 analyze_semeai D19 E19
+#? [0 0 PASS]*
+
+97 analyze_semeai O5 P5
+#? [1 1 PASS]*
+
+98 analyze_semeai P5 O5
+#? [0 0 PASS]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_015.sgf
+99 analyze_semeai E18 F18
+#? [1 0 (.*)]
+
+100 analyze_semeai F18 E18
+#? [1 0 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_016.sgf
+101 analyze_semeai A14 A15
+#? [1 1 C17]
+
+102 analyze_semeai A15 A14
+#? [1 1 C17]
+
+103 analyze_semeai A6 A5
+#? [1 1 B3]
+
+104 analyze_semeai A5 A6
+#? [1 1 B3]
+
+105 analyze_semeai T6 T5
+#? [0 0 PASS]
+
+106 analyze_semeai T5 T6
+#? [1 1 (.*)]
+
+107 analyze_semeai T14 T15
+#? [1 1 T17]
+
+108 analyze_semeai T15 T14
+#? [1 1 T17]
+
+109 analyze_semeai F10 G10
+#? [1 1 J11]
+
+110 analyze_semeai G10 F10
+#? [1 1 J11]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_017.sgf
+111 analyze_semeai A14 A15
+#? [0 0 PASS]
+
+112 analyze_semeai A15 A14
+#? [1 1 (.*)]
+
+113 analyze_semeai A4 A3
+#? [1 1 (B2|C3|D2)]
+
+114 analyze_semeai A3 A4
+#? [1 1 B2]
+
+115 analyze_semeai T14 T15
+#? [1 1 S17]
+
+116 analyze_semeai T15 T14
+#? [1 1 S17]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_018.sgf
+117 analyze_semeai T14 T15
+#? [0 0 PASS]
+
+118 analyze_semeai T15 T14
+#? [1 1 (.*)]
+
+119 analyze_semeai A4 A3
+#? [1 1 C2]*
+
+120 analyze_semeai A3 A4
+#? [1 1 C2]
+
+121 analyze_semeai A14 A15
+#? [1 1 C17]
+
+122 analyze_semeai A15 A14
+#? [1 1 C17]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_019.sgf
+123 analyze_semeai A14 A15
+#? [1 1 B17]
+
+124 analyze_semeai A15 A14
+#? [1 1 B17]
+
+125 analyze_semeai A4 A3
+#? [0 0 PASS]
+
+126 analyze_semeai A3 A4
+#? [1 1 (.*)]
+
+127 analyze_semeai T5 T4
+#? [1 1 R3]
+
+128 analyze_semeai T4 T5
+#? [1 1 R3]
+
+129 analyze_semeai T13 T15
+#? [1 1 (S18|T16|T14)]
+
+130 analyze_semeai T15 T13
+#? [1 1 (S18|T16)]
+
+131 analyze_semeai G10 H10
+#? [1 1 K9]
+
+132 analyze_semeai H10 G10
+#? [1 1 K9]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_020.sgf
+133 analyze_semeai A14 A15
+#? [1 1 A18]
+
+134 analyze_semeai A15 A14
+#? [1 1 A18]
+
+135 analyze_semeai A4 A3
+#? [1 1 (C2|D2)]
+
+136 analyze_semeai A3 A4
+#? [1 1 C2]
+
+137 analyze_semeai T5 T4
+#? [1 1 (R3|O1)]
+
+138 analyze_semeai T4 T5
+#? [1 1 R3]
+
+139 analyze_semeai T13 T15
+#? [1 1 PASS]*
+
+140 analyze_semeai T15 T13
+#? [0 0 PASS]*
+
+141 analyze_semeai G10 H10
+#? [1 1 (.*)]
+
+142 analyze_semeai H10 G10
+#? [0 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_021.sgf
+143 analyze_semeai A14 A15
+#? [1 1 A18]
+
+144 analyze_semeai A15 A14
+#? [1 0 A18]
+
+145 analyze_semeai A4 A3
+#? [0 0 PASS]
+
+146 analyze_semeai A3 A4
+#? [1 1 (.*)]
+
+147 analyze_semeai T5 T4
+#? [1 1 (.*)]
+
+148 analyze_semeai T4 T5
+#? [0 0 PASS]
+
+149 analyze_semeai T13 T15
+#? [0 0 PASS]
+
+150 analyze_semeai T15 T13
+#? [1 1 (.*)]
+
+151 analyze_semeai G10 H10
+#? [1 1 J10]
+
+152 analyze_semeai H10 G10
+#? [1 1 J10]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_022.sgf
+153 analyze_semeai A14 A15
+#? [1 0 G19]
+
+154 analyze_semeai A15 A14
+#? [1 1 G19]
+
+155 analyze_semeai A4 A2
+#? [1 1 C2]
+
+156 analyze_semeai A2 A4
+#? [1 1 C2]
+
+157 analyze_semeai T5 T4
+#? [1 1 R3]
+
+158 analyze_semeai T4 T5
+#? [1 1 (N3|O5|P6|Q6|R6|S6|T6)]*
+
+159 analyze_semeai T13 T15
+#? [1 1 (S18|T16)]
+
+160 analyze_semeai T15 T13
+#? [1 1 (N17|017|O16|O15|O14|R13|T12)]
+
+161 analyze_semeai G10 H10
+#? [1 1 (.*)]
+
+162 analyze_semeai H10 G10
+#? [0 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_023.sgf
+163 analyze_semeai A15 A16
+#? [1 1 (C18|D17)]*
+
+164 analyze_semeai A16 A15
+#? [1 0 C18]*
+
+165 analyze_semeai E1 F1
+#? [1 1 D2]
+
+166 analyze_semeai F1 E1
+#? [1 1 D2]*
+
+167 analyze_semeai T8 T7
+#? [1 1 T6]
+
+168 analyze_semeai T7 T8
+#? [1 1 (T10|R10|S11)]*
+#Check the status of semiai if pass. Should be looser not seki. Checked and OK.
+
+169 analyze_semeai O19 N19
+#? [1 1 K18]*
+
+170 analyze_semeai N19 O19
+#? [1 0 (K18|L17|M18)]
+
+171 analyze_semeai J12 K12
+#? [1 1 J10]
+
+172 analyze_semeai K12 J12
+#? [1 1 J10]
+
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_024.sgf
+173 analyze_semeai A15 A16
+#? [1 1 D17]*
+
+174 analyze_semeai A16 A15
+#? [1 1 B12]
+#Check what is the seki value for the program. Checked: winning= 96, seki = 34 for each. Not very accurate. For black should be 44.
+
+175 analyze_semeai F1 G1
+#? [1 1 H2]*
+
+176 analyze_semeai G1 F1
+#? [1 0 H2]
+
+177 analyze_semeai T8 T7
+#? [1 1 S4]
+
+178 analyze_semeai T7 T8
+#? [1 1 S11]
+#Check the status of semiai if pass. Should be looser not seki. Checked and OK
+
+179 analyze_semeai O19 N19
+#? [1 0 Q17]*
+
+180 analyze_semeai N19 O19
+#? [1 1 Q17]
+#Check status if pass. Should be looser for black and seki for white. Checked and OK.
+
+181 analyze_semeai J12 K12
+#? [1 1 J10]
+
+182 analyze_semeai K12 J12
+#? [1 1 J10]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_025.sgf
+183 analyze_semeai A14 A15
+#? [1 1 C11]
+
+184 analyze_semeai A15 A14
+#? [1 1 C11]*
+
+185 analyze_semeai F1 G1
+#? [1 1 J2]
+
+186 analyze_semeai G1 F1
+#? [1 1 (J2|B2|B3|D3)]*
+#Though B2 is also possible it leaves more ko threads and should be avoded
+
+187 analyze_semeai T8 T7
+#? [1 1 R4]*
+
+188 analyze_semeai T7 T8
+#? [1 0 R4]*
+
+189 analyze_semeai O19 N19
+#? [1 1 L18]*
+
+190 analyze_semeai N19 O19
+#? [1 0 L18]*
+#Check status if pass. Should be looser for White and seki for Black.
+
+191 analyze_semeai J12 J13
+#? [1 1 J11]
+
+192 analyze_semeai J13 J12
+#? [1 1 J11]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_026.sgf
+193 analyze_semeai A14 A15
+#? [1 0 (.*)]
+
+194 analyze_semeai A15 A14
+#? [1 0 PASS]*
+
+195 analyze_semeai F1 G1
+#? [1 1 K2]*
+
+196 analyze_semeai G1 F1
+#? [1 1 D3]*
+
+197 analyze_semeai T8 T7
+#? [1 1 (T4|S3|T1)]*
+
+198 analyze_semeai T7 T8
+#? [1 1 (R12|R10|S10)]
+
+199 analyze_semeai O19 N19
+#? [1 0 Q17]
+
+200 analyze_semeai N19 O19
+#? [1 1 Q17]
+#Check status if pass. Should be looser for Black and seki for white.
+
+201 analyze_semeai J12 K12
+#? [1 1 H8]
+
+202 analyze_semeai K12 J12
+#? [1 1 H8]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_C1_027.sgf
+203 analyze_semeai F19 G19
+#? [1 1 B19]
+
+204 analyze_semeai G19 F19
+#? [1 1 B19]
+
+205 analyze_semeai D1 E1
+#? [1 1 C2]*
+
+206 analyze_semeai E1 D1
+#? [1 1 C2]
+
+207 analyze_semeai T5 T6
+#? [1 1 R4]
+
+208 analyze_semeai T6 T5
+#? [1 1 R4]
diff --git a/regression/STS-RV_Misc.tst b/regression/STS-RV_Misc.tst
new file mode 100644 (file)
index 0000000..61fb154
--- /dev/null
@@ -0,0 +1,218 @@
+# This suite of semeai problems came from the package STS-RV
+# available at http://gobase.org/reading/preview/Semeai/#STS
+#
+# It is a very comprehensive semeai problems suite
+# compiled by Ricard Vilà. The associated tests are in GTP
+# format but it's not a perfect match for GNU Go because
+# it uses a custom command called solve-semeaiS.
+# (More info at http://trac.gnugo.org/gnugo/ticket/41)
+#
+# This file instead is based on the normal GNU Go commands
+# (analyze_semeai) and enable the execution of the tests
+# in the semeais_Misc.tst file from STS-RV suite of semeai problems.
+#
+# For any of the problems below, if PASS is a solution it is the best
+# solution. However the other solutions are acceptable.
+
+############## semeai tests #################
+#
+# After analyze_semeai [dragon1] [dragon2]
+# the results are returned in the form (result1) (result2).
+# These are the results of the defense of dragon1 and the attack
+# of dragon2 assuming that the dragon1 player moves first. Thus
+# a result 1 0 typically means seki, while a 1 1 result means a kill
+# and 0 0 means the semeai is lost. In addition to seki, 1 0 may mean
+# that both dragons gain independent life.
+# The result [0 1] is not possible as a correct result but GNU Go
+# has been known to return that occasionally.
+# Result 2 mean success with good ko, 3 success with bad ko.
+# A good ko is characterized by the opponent having to make the first
+# external ko threat whereas a bad ko is the opposite.
+#
+# NOTE: In some problem GNU Go suggest a move instead to PASS
+# but the result of the semeai analysis is correct, so to avoid
+# a fail not relevant for the test, the move is ignored using
+# a regular expression: #? [x y (.*)]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_001.sgf
+1 analyze_semeai K1 J1
+#? [3 3 G2]*
+
+2 analyze_semeai J1 K1
+#? [1 1 G1]
+
+3 analyze_semeai A7 A8
+#? [1 1 B9]
+
+4 analyze_semeai A8 A7
+#? [1 1 A10]*
+
+5 analyze_semeai T9 T10
+#? [1 1 (T15|S13|S11)]
+
+6 analyze_semeai T10 T9
+#? [2 2 (S11|S13)]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_002.sgf
+7 analyze_semeai T6 T5
+#? [1 1 N7]
+
+8 analyze_semeai T5 T6
+#? [1 1 T7]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_003.sgf
+9 analyze_semeai F2 G2
+#? [1 1 J1]*
+
+10 analyze_semeai G2 F2
+#? [1 1 D4]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_004.sgf
+11 analyze_semeai K9 J9
+#? [1 1 L11]
+
+12 analyze_semeai J9 K9
+#? [1 0 L11]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_005.sgf
+13 analyze_semeai B12 B13
+#? [1 1 B9]
+
+14 analyze_semeai B13 B12
+#? [1 0 B9]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_006.sgf
+15 analyze_semeai D18 D19
+#? [1 1 (A18|C19)]
+
+16 analyze_semeai D19 D18
+#? [1 1 (B19|C19|A18)]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_007.sgf
+17 analyze_semeai P17 P16
+#? [1 1 (Q15|R15)]
+
+18 analyze_semeai P16 P17
+#? [1 1 N19]
+
+19 analyze_semeai T3 T4
+#? [1 1 (T5|S5|R5|Q5|O1)]
+
+20 analyze_semeai T4 T3
+#? [1 1 (O1|S2|R2|Q2)]
+
+21 analyze_semeai E19 D19
+#? [1 1 (C17|C16)]
+
+22 analyze_semeai D19 E19
+#? [1 1 (F17|F16)]
+
+23 analyze_semeai C9 C10
+#? [1 1 (D11|A10)]
+
+24 analyze_semeai C10 C9
+#? [1 1 (D11|A10)]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_008.sgf
+25 analyze_semeai P17 P16
+#? [1 1 (P15|R15)]
+
+26 analyze_semeai P16 P17
+#? [1 1 (Q18|R18|S18)]
+
+27 analyze_semeai T3 T4
+#? [1 1 (R5|Q5)]
+
+28 analyze_semeai T4 T3
+#? [1 1 (R2|Q2)]
+
+29 analyze_semeai E19 D19
+#? [1 1 (C17|C16)]
+
+30 analyze_semeai D19 E19
+#? [1 1 (F17|F16)]
+
+31 analyze_semeai C9 C10
+#? [1 1 (D11|A10)]
+
+32 analyze_semeai C10 C9
+#? [1 1 (D11|A10)]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_009.sgf
+33 analyze_semeai F2 G2
+#? [3 3 G1]*
+
+34 analyze_semeai G2 F2
+#? [1 1 G1]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_010.sgf
+35 analyze_semeai F2 G2
+#? [1 1 J1]*
+
+36 analyze_semeai G2 F2
+#? [1 1 D4]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_011.sgf
+37 analyze_semeai F2 G2
+#? [1 1 J1]*
+
+38 analyze_semeai G2 F2
+#? [1 1 D4]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_012.sgf
+39 analyze_semeai K9 J9
+#? [1 1 (L11|O10|O12)]
+
+40 analyze_semeai J9 K9
+#? [1 1 L11]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_013.sgf
+41 analyze_semeai B12 B13
+#? [1 1 (A9|C19)]
+
+42 analyze_semeai B13 B12
+#? [1 0 A9]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_014.sgf
+43 analyze_semeai B12 B13
+#? [1 1 (B9|C19)]
+
+44 analyze_semeai B13 B12
+#? [1 0 B9]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_015.sgf
+45 analyze_semeai D18 E18
+#? [1 1 (D19|F19|H18)]*
+
+46 analyze_semeai E18 D18
+#? [1 1 D19]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_016.sgf
+47 analyze_semeai C11 C12
+#? [1 1 A18]
+
+48 analyze_semeai C12 C11
+#? [1 1 A18]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_017.sgf
+49 analyze_semeai J19 K19
+#? [1 1 (S16|T19)]
+
+50 analyze_semeai K19 J19
+#? [1 1 S16]
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_018.sgf
+51 analyze_semeai K12 K13
+#? [1 1 (O14|N14|M14|K14|H12|F11)]
+
+52 analyze_semeai K13 K12
+#? [1 1 H12]*
+
+loadsgf games/STS-RV/MiscProblems/_semeai_C9_019.sgf
+53 analyze_semeai H18 G18
+#? [1 1 E18]*
+
+54 analyze_semeai G18 H18
+#? [1 1 E18]*
+
+
diff --git a/regression/STS-RV_e.tst b/regression/STS-RV_e.tst
new file mode 100644 (file)
index 0000000..f5a96e1
--- /dev/null
@@ -0,0 +1,829 @@
+# This suite of semeai problems came from the package STS-RV
+# available at http://gobase.org/reading/preview/Semeai/#STS
+#
+# It is a very comprehensive semeai problems suite
+# compiled by Ricard Vilà. The associated tests are in GTP
+# format but it's not a perfect match for GNU Go because
+# it uses a custom command called solve-semeaiS.
+# (More info at http://trac.gnugo.org/gnugo/ticket/41)
+#
+# This file instead is based on the normal GNU Go commands
+# (analyze_semeai) and enable the execution of the tests
+# in the semeais_e.tst file from STS-RV suite of semeai problems.
+#
+# For any of the problems below, if PASS is a solution it is the best
+# solution. However the other solutions are acceptable.
+
+############## semeai tests #################
+#
+# After analyze_semeai [dragon1] [dragon2]
+# the results are returned in the form (result1) (result2).
+# These are the results of the defense of dragon1 and the attack
+# of dragon2 assuming that the dragon1 player moves first. Thus
+# a result 1 0 typically means seki, while a 1 1 result means a kill
+# and 0 0 means the semeai is lost. In addition to seki, 1 0 may mean
+# that both dragons gain independent life.
+# The result [0 1] is not possible as a correct result but GNU Go
+# has been known to return that occasionally.
+# Result 2 mean success with good ko, 3 success with bad ko.
+# A good ko is characterized by the opponent having to make the first
+# external ko threat whereas a bad ko is the opposite.
+#
+# NOTE: In some problem GNU Go suggest a move instead to PASS
+# but the result of the semeai analysis is correct, so to avoid
+# a fail not relevant for the test, the move is ignored using
+# a regular expression: #? [x y (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_001.sgf
+1 analyze_semeai C19 D19
+#? [1 1 B17]
+
+2 analyze_semeai D19 C19
+#? [1 1 B17]*
+
+3 analyze_semeai A6 A5
+#? [1 0 (.*)]
+
+4 analyze_semeai A5 A6
+#? [1 0 (.*)]
+
+5 analyze_semeai T4 T3
+#? [1 1 (S2|R1)]
+
+6 analyze_semeai T3 T4
+#? [1 0 (S2|R1)]
+
+7 analyze_semeai T19 R19
+#? [1 1 P18]
+
+8 analyze_semeai R19 T19
+#? [1 0 P18]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_002.sgf
+9 analyze_semeai A19 D19
+#? [1 0 PASS]
+
+10 analyze_semeai D19 A19
+#? [1 0 PASS]
+
+11 analyze_semeai N19 M19
+#? [1 0 PASS]
+
+12 analyze_semeai M19 N19
+#? [1 0 PASS]
+
+13 analyze_semeai T15 T16
+#? [1 0 PASS]*
+
+14 analyze_semeai T16 T15
+#? [1 0 PASS]*
+
+15 analyze_semeai A4 A9
+#? [1 0 B6]
+
+16 analyze_semeai A9 A4
+#? [1 1 B6]
+
+17 analyze_semeai Q1 R1
+#? [1 0 O2]
+
+18 analyze_semeai R1 Q1
+#? [1 1 O2]
+
+19 analyze_semeai O6 O5
+#? [1 0 (.*)]
+
+20 analyze_semeai O5 O6
+#? [1 0 PASS]
+
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_003.sgf
+21 analyze_semeai T9 T10
+#? [0 0 PASS]
+
+22 analyze_semeai T10 T9
+#? [1 1 (.*)]
+
+23 analyze_semeai F19 M19
+#? [1 0 H18]
+
+24 analyze_semeai M19 F19
+#? [1 1 F16]
+
+25 analyze_semeai D1 K1
+#? [1 0 PASS]*
+
+26 analyze_semeai K1 D1
+#? [1 0 PASS]*
+
+27 analyze_semeai D12 C12
+#? [1 0 (.*)]
+
+28 analyze_semeai C12 D12
+#? [1 0 (.*)]
+
+29 analyze_semeai J14 J11
+#? [1 0 (K14|L13)]
+
+30 analyze_semeai J11 J14
+#? [1 1 (K14|L13)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_004.sgf
+31 analyze_semeai A19 E19
+#? [1 0 B18]
+
+32 analyze_semeai E19 A19
+#? [1 1 B18]
+
+33 analyze_semeai M19 L19
+#? [1 0 (.*)]
+
+34 analyze_semeai L19 M19
+#? [1 0 (.*)]
+
+35 analyze_semeai H10 H9
+#? [1 0 (.*)]
+
+36 analyze_semeai H9 H10
+#? [1 0 PASS]
+
+37 analyze_semeai R13 T16
+#? [1 0 PASS]
+
+38 analyze_semeai T16 R13
+#? [1 0 PASS]
+
+39 analyze_semeai A3 F3
+#? [1 0 C2]
+
+40 analyze_semeai F3 A3
+#? [1 1 A4]
+
+41 analyze_semeai M6 O2
+#? [1 0 O5]
+
+42 analyze_semeai O2 M6
+#? [1 1 O5]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_005.sgf
+43 analyze_semeai G19 L19
+#? [1 0 (.*)]
+
+44 analyze_semeai L19 G19
+#? [1 0 (.*)]
+
+45 analyze_semeai A14 A10
+#? [1 0 PASS]
+
+46 analyze_semeai A10 A14
+#? [1 0 PASS]
+
+47 analyze_semeai M13 Q13
+#? [1 0 N10]
+
+48 analyze_semeai Q13 M13
+#? [1 1 N10]
+
+49 analyze_semeai F8 E8
+#? [1 0 G6]
+
+50 analyze_semeai E8 F8
+#? [1 1 G6]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_006.sgf
+51 analyze_semeai A19 E19
+#? [1 0 (.*)]
+
+52 analyze_semeai E19 A19
+#? [1 0 PASS]*
+
+53 analyze_semeai L19 K19
+#? [1 0 N18]
+
+54 analyze_semeai K19 L19
+#? [1 1 N18]
+
+55 analyze_semeai R13 R7
+#? [1 0 PASS]*
+
+56 analyze_semeai R7 R13
+#? [1 0 PASS]*
+
+57 analyze_semeai F7 F8
+#? [1 0 PASS]
+
+58 analyze_semeai F8 F7
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_007.sgf
+59 analyze_semeai G19 K19
+#? [1 0 H18]
+
+60 analyze_semeai K19 G19
+#? [1 1 H18]
+
+61 analyze_semeai A13 E13
+#? [1 0 PASS]*
+
+62 analyze_semeai E13 A13
+#? [1 0 PASS]*
+
+63 analyze_semeai M13 P13
+#? [1 0 (.*)]
+
+64 analyze_semeai P13 M13
+#? [1 0 (.*)]
+
+65 analyze_semeai R6 P5
+#? [1 0 S4]
+
+66 analyze_semeai P5 R6
+#? [1 1 S4]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_008.sgf
+67 analyze_semeai Q19 P19
+#? [1 0 S17]
+
+68 analyze_semeai P19 Q19
+#? [1 1 S17]
+
+69 analyze_semeai F13 F14
+#? [1 0 PASS]
+
+70 analyze_semeai F14 F13
+#? [1 0 PASS]
+
+71 analyze_semeai A7 A8
+#? [1 0 B5]
+
+72 analyze_semeai A8 A7
+#? [1 1 B5]
+
+73 analyze_semeai M6 M7
+#? [1 0 N4]
+
+74 analyze_semeai M7 M6
+#? [1 1 N4]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_009.sgf
+75 analyze_semeai A19 E19
+#? [1 0 (.*)]
+
+76 analyze_semeai E19 A19
+#? [1 0 PASS]*
+
+77 analyze_semeai M13 M14
+#? [1 0 (N11|O12)]
+
+78 analyze_semeai M14 M13
+#? [1 1 (N11|O12)]
+
+79 analyze_semeai F7 F8
+#? [1 0 PASS]
+
+80 analyze_semeai F8 F7
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_010.sgf
+81 analyze_semeai G19 E19
+#? [0 0 PASS]
+
+82 analyze_semeai E19 G19
+#? [1 1 (.*)]
+
+83 analyze_semeai A13 A14
+#? [1 0 PASS]*
+
+84 analyze_semeai A14 A13
+#? [1 0 PASS]*
+
+85 analyze_semeai M6 M8
+#? [1 0 (O5|O4)]
+
+86 analyze_semeai M8 M6
+#? [1 1 O5]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_011.sgf
+87 analyze_semeai M19 L19
+#? [1 0 PASS]*
+
+88 analyze_semeai L19 M19
+#? [1 0 PASS]*
+
+89 analyze_semeai F13 F14
+#? [1 0 H11]
+
+90 analyze_semeai F14 F13
+#? [1 1 H11]
+
+91 analyze_semeai A7 A8
+#? [1 0 C5]*
+
+92 analyze_semeai A8 A7
+#? [1 1 C5]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_012.sgf
+93 analyze_semeai A19 E19
+#? [1 0 B16]*
+
+94 analyze_semeai E19 A19
+#? [2 2 B16]*
+
+95 analyze_semeai O13 O14
+#? [1 0 (Q11|Q12)]
+
+96 analyze_semeai O14 O13
+#? [2 2 Q12]*
+# GNU Go dont realize that w Q12 live seki
+
+97 analyze_semeai G7 G8
+#? [1 0 (J5|H5)]
+
+98 analyze_semeai G8 G7
+#? [2 2 H5]*
+# GNU Go dont realize that w H5 live seki
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_013.sgf
+99 analyze_semeai G19 E19
+#? [3 0 J17]*
+
+100 analyze_semeai E19 G19
+#? [1 1 J17]
+
+101 analyze_semeai A13 A14
+#? [1 0 (.*)]
+
+102 analyze_semeai A14 A13
+#? [1 0 PASS]*
+
+103 analyze_semeai O7 O8
+#? [1 0 Q5]
+
+104 analyze_semeai O8 O7
+#? [1 1 Q5]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_014.sgf
+105 analyze_semeai O19 N19
+#? [1 0 (Q18|P18)]
+
+106 analyze_semeai N19 O19
+#? [3 3 P18]*
+# GNU Go dont realize that w P18 live seki
+
+107 analyze_semeai G13 G14
+#? [1 0 (J12|H11)]
+
+108 analyze_semeai G14 G13
+#? [1 1 (J12|H11)]
+
+109 analyze_semeai A7 A8
+#? [1 0 (B5|C5)]
+
+110 analyze_semeai A8 A7
+#? [2 2 C5]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_015.sgf
+111 analyze_semeai A19 E19
+#? [1 0 PASS]
+
+112 analyze_semeai E19 A19
+#? [1 0 PASS]
+
+113 analyze_semeai O13 O14
+#? [1 0 Q11]
+
+114 analyze_semeai O14 O13
+#? [1 1 Q11]
+
+115 analyze_semeai G7 G8
+#? [0 0 PASS]
+
+116 analyze_semeai G8 G7
+#? [1 1 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_016.sgf
+117 analyze_semeai G19 L19
+#? [2 2 J17]
+
+118 analyze_semeai L19 G19
+#? [1 1 H16]
+
+119 analyze_semeai A4 A5
+#? [1 0 C2]
+
+120 analyze_semeai A5 A4
+#? [1 1 C2]
+
+121 analyze_semeai O7 O8
+#? [0 0 PASS]
+
+122 analyze_semeai O8 O7
+#? [1 1 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_017.sgf
+123 analyze_semeai O19 L19
+#? [1 0 (Q19|P18)]
+
+124 analyze_semeai L19 O19
+#? [1 1 (Q19|P18)]
+
+125 analyze_semeai G13 G14
+#? [1 0 (.*)]
+
+126 analyze_semeai G14 G13
+#? [1 0 (.*)]
+
+127 analyze_semeai A7 A8
+#? [1 0 (B4|C6)]
+
+128 analyze_semeai A8 A7
+#? [1 1 (B4|E3)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_018.sgf
+129 analyze_semeai A19 E19
+#? [1 0 C17]
+
+130 analyze_semeai E19 A19
+#? [1 1 B18]
+
+131 analyze_semeai O13 O14
+#? [1 0 PASS]
+
+132 analyze_semeai O14 O13
+#? [1 0 PASS]
+
+133 analyze_semeai G7 G8
+#? [1 0 K5]
+
+134 analyze_semeai G8 G7
+#? [1 1 K5]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_019.sgf
+135 analyze_semeai G19 E19
+#? [1 0 K17]
+
+136 analyze_semeai E19 G19
+#? [1 1 K17]
+
+137 analyze_semeai A13 A14
+#? [1 0 C11]
+
+138 analyze_semeai A14 A13
+#? [1 1 C11]
+
+139 analyze_semeai O7 O8
+#? [1 0 Q5]
+
+140 analyze_semeai O8 O7
+#? [1 1 Q5]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_020.sgf
+141 analyze_semeai O19 N19
+#? [1 0 R18]
+
+142 analyze_semeai N19 O19
+#? [1 1 R18]
+
+143 analyze_semeai G13 G14
+#? [0 0 PASS]
+
+144 analyze_semeai G14 G13
+#? [1 1 (.*)]
+
+145 analyze_semeai A7 A9
+#? [1 0 C5]
+
+146 analyze_semeai A9 A7
+#? [1 1 C4]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_021.sgf
+147 analyze_semeai A19 F19
+#? [1 0 PASS]
+
+148 analyze_semeai F19 A19
+#? [1 0 PASS]
+
+149 analyze_semeai O13 N13
+#? [1 0 (.*)]
+
+150 analyze_semeai N13 O13
+#? [1 0 (.*)]
+
+151 analyze_semeai G7 G8
+#? [1 0 J5]
+
+152 analyze_semeai G8 G7
+#? [1 1 J4]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_022.sgf
+153 analyze_semeai G19 F19
+#? [1 0 (.*)]
+
+154 analyze_semeai F19 G19
+#? [1 0 PASS]
+
+155 analyze_semeai A13 A8
+#? [1 0 B11]
+
+156 analyze_semeai A8 A13
+#? [1 1 B11]
+
+157 analyze_semeai O7 O8
+#? [1 0 PASS]*
+
+158 analyze_semeai O8 O7
+#? [1 0 PASS]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_023.sgf
+159 analyze_semeai O19 N19
+#? [1 0 (Q18|R17)]
+
+160 analyze_semeai N19 O19
+#? [1 1 (Q18|R17)]
+
+161 analyze_semeai G13 G14
+#? [1 0 J11]
+
+162 analyze_semeai G14 G13
+#? [1 1 J11]
+
+163 analyze_semeai A7 A8
+#? [1 0 (.*)]
+
+164 analyze_semeai A8 A7
+#? [1 0 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_024.sgf
+165 analyze_semeai A3 A4
+#? [1 1 (A5|B5)]
+
+166 analyze_semeai A4 A3
+#? [1 1 F1]
+
+167 analyze_semeai T3 T4
+#? [1 1 (Q5|R5|S5|T5)]
+
+168 analyze_semeai T4 T3
+#? [1 1 (T2|S1|S2)]
+
+169 analyze_semeai A17 A16
+#? [1 1 A19]
+
+170 analyze_semeai A16 A17
+#? [1 1 D19]
+
+171 analyze_semeai T17 T16
+#? [0 0 PASS]
+
+172 analyze_semeai T16 T17
+#? [1 1 (.*)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_025.sgf
+173 analyze_semeai A3 A4
+#? [1 0 PASS]*
+
+174 analyze_semeai A4 A3
+#? [1 0 PASS]*
+
+175 analyze_semeai T3 T4
+#? [1 1 S2]
+
+176 analyze_semeai T4 T3
+#? [1 1 S2]*
+
+177 analyze_semeai A17 A16
+#? [1 1 (F19|E16)]
+
+178 analyze_semeai A16 A17
+#? [1 1 D19]
+
+179 analyze_semeai T17 T16
+#? [1 1 (P19|P18|P17)]
+
+180 analyze_semeai T16 T17
+#? [1 1 (S19|S18|T18)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_026.sgf
+181 analyze_semeai A3 A4
+#? [1 1 (C1|A1)]
+# b A1 seem useless but is correct
+
+182 analyze_semeai A4 A3
+#? [1 1 A1]
+
+183 analyze_semeai T4 T5
+#? [3 3 T1]*
+
+184 analyze_semeai T5 T4
+#? [1 1 T1]
+
+185 analyze_semeai A17 A16
+#? [1 1 B18]
+
+186 analyze_semeai A16 A17
+#? [1 1 (D19|D18)]
+
+187 analyze_semeai T17 T16
+#? [1 1 T19]
+
+188 analyze_semeai T16 T17
+#? [1 0 T19]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_027.sgf
+189 analyze_semeai A3 A4
+#? [1 1 A1]
+
+190 analyze_semeai A4 A3
+#? [1 1 F1]
+
+191 analyze_semeai T3 T4
+#? [1 1 (.*)]
+
+192 analyze_semeai T4 T3
+#? [0 0 PASS]
+
+193 analyze_semeai A17 A16
+#? [1 1 A19]
+
+194 analyze_semeai A16 A17
+#? [1 1 D19]
+
+195 analyze_semeai T17 T16
+#? [1 1 (P19|P18)]
+
+196 analyze_semeai T16 T17
+#? [1 1 (S19|T18)]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_028.sgf
+197 analyze_semeai A15 A14
+#? [1 0 A17]
+
+198 analyze_semeai A14 A15
+#? [1 1 A17]
+
+199 analyze_semeai A2 A1
+#? [1 0 A5]
+
+200 analyze_semeai A1 A2
+#? [1 1 A3]
+
+201 analyze_semeai K1 H1
+#? [1 0 L2]*
+
+202 analyze_semeai H1 K1
+#? [1 1 (M1|L2)]*
+
+203 analyze_semeai T10 T11
+#? [1 0 PASS]
+
+204 analyze_semeai T11 T10
+#? [1 0 PASS]
+
+205 analyze_semeai Q19 R18
+#? [1 0 O19]
+
+206 analyze_semeai R18 Q19
+#? [1 1 O19]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_029.sgf
+207 analyze_semeai A9 A8
+#? [1 0 A11]
+
+208 analyze_semeai A8 A9
+#? [1 1 C13]
+
+209 analyze_semeai Q1 P1
+#? [1 0 S1]
+
+210 analyze_semeai P1 Q1
+#? [1 1 S1]
+
+211 analyze_semeai T16 T17
+#? [1 0 T14]
+
+212 analyze_semeai T17 T16
+#? [1 1 T14]
+
+213 analyze_semeai K19 L19
+#? [1 0 (.*)]
+
+214 analyze_semeai L19 K19
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_030.sgf
+215 analyze_semeai A15 A14
+#? [1 0 A16]
+
+216 analyze_semeai A14 A15
+#? [1 1 A16]
+
+217 analyze_semeai A1 D1
+#? [1 0 (A2|B2)]
+
+218 analyze_semeai D1 A1
+#? [1 1 A2]
+
+219 analyze_semeai K1 L1
+#? [1 0 PASS]
+
+220 analyze_semeai L1 K1
+#? [1 0 PASS]
+
+221 analyze_semeai T4 T3
+#? [1 0 (T7|S5)]
+
+222 analyze_semeai T3 T4
+#? [1 1 T7]
+
+223 analyze_semeai N19 M19
+#? [1 0 (P19|O19)]
+
+224 analyze_semeai M19 N19
+#? [1 1 P19]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_031.sgf
+225 analyze_semeai A8 A7
+#? [1 0 B9]*
+
+226 analyze_semeai A7 A8
+#? [1 1 (C12|C13)]*
+
+227 analyze_semeai R1 S1
+#? [1 0 (P1|N2)]*
+
+228 analyze_semeai S1 R1
+#? [1 1 P1]*
+
+229 analyze_semeai T11 T10
+#? [1 0 T14]*
+
+230 analyze_semeai T10 T11
+#? [1 1 T14]*
+
+231 analyze_semeai L19 M19
+#? [1 0 H18]*
+
+232 analyze_semeai M19 L19
+#? [1 1 H18]*
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_032.sgf
+233 analyze_semeai A15 A14
+#? [1 0 (A17|B17)]
+
+234 analyze_semeai A14 A15
+#? [1 1 D15]
+
+235 analyze_semeai A3 D1
+#? [1 0 B5]
+
+236 analyze_semeai D1 A3
+#? [1 1 B5]
+
+237 analyze_semeai P1 Q1
+#? [1 0 O1]
+
+238 analyze_semeai Q1 P1
+#? [1 1 (M2|O1)]
+
+239 analyze_semeai T11 T12
+#? [1 0 PASS]
+
+240 analyze_semeai T12 T11
+#? [1 0 PASS]
+
+241 analyze_semeai L19 K19
+#? [1 0 PASS]
+
+242 analyze_semeai K19 L19
+#? [1 0 PASS]
+
+loadsgf games/STS-RV/Class01eProblems/_semeai_Ce_033.sgf
+243 analyze_semeai A9 A8
+#? [0 0 PASS]
+
+244 analyze_semeai A8 A9
+#? [1 1 (.*)]
+
+245 analyze_semeai J1 K1
+#? [1 0 (H1|G2|F2)]
+
+246 analyze_semeai K1 J1
+#? [1 1 (H1|G2|F2)]
+
+247 analyze_semeai T5 T6
+#? [0 0 PASS]
+
+248 analyze_semeai T6 T5
+#? [1 1 (.*)]
+
+249 analyze_semeai T17 T18
+#? [1 0 S16]
+
+250 analyze_semeai T18 T17
+#? [1 1 T14]*
+
+251 analyze_semeai J19 K19
+#? [1 0 PASS]
+
+252 analyze_semeai K19 J19
+#? [1 0 PASS]
diff --git a/regression/arb.tst b/regression/arb.tst
new file mode 100644 (file)
index 0000000..a497ff1
--- /dev/null
@@ -0,0 +1,73 @@
+# ==============
+# GNU Go mistakes in games against or observed by Teun
+# ==============
+
+loadsgf games/arb/game01.sgf 53
+101 reg_genmove black
+#? [(C2|D2|F2|G2|F1|D1|E1)]
+
+loadsgf games/arb/game01.sgf 54
+102 reg_genmove white
+#? [D2|F2|A2]
+
+loadsgf games/arb/game02.sgf 69
+103 reg_genmove black
+#? [PASS]
+
+loadsgf games/arb/game02.sgf 71
+104 reg_genmove black
+#? [A7|B7]
+
+loadsgf games/arb/dumonteil-1.sgf 184
+150 reg_genmove white
+#? [J5]
+
+# Why is this move so urgent? /gf
+# tm - F14 is not necessary - removing this bad problem.
+#loadsgf games/arb/dumonteil-2.sgf 229
+#200 reg_genmove black
+##? [F14]
+
+loadsgf games/arb/dumonteil-2.sgf 247
+201 reg_genmove black
+#? [H13]
+
+loadsgf games/arb/dumonteil-2.sgf 251
+202 restricted_genmove black B19 D15 F19 F16
+#? [F19|F16]
+
+loadsgf games/arb/dumonteil-3.sgf 193
+203 reg_genmove black
+#? [T7]*
+
+# the root of the problem at test 203 lies at move 185
+loadsgf games/arb/dumonteil-3.sgf 185
+204 reg_genmove black
+#? [S7]*
+
+loadsgf games/arb/dumonteil-4.sgf 189
+210 reg_genmove black
+#? [D8]*
+
+# Ko mistake observed in gnugo-2.7.231 --level 8 -M 32
+loadsgf games/arb/dumonteil-5.sgf 83
+220 reg_genmove black
+#? [!F6]
+
+# Ko mistake observed in gnugo-2.7.231 --level 8 -M 32
+loadsgf games/arb/dumonteil-5.sgf 125
+221 reg_genmove black
+#? [J9]
+
+loadsgf games/arb/dumonteil-6.sgf 33
+231 reg_genmove black
+#? [F5]*
+
+# Defend against a combination attack.
+loadsgf games/arb/game03.sgf 109
+232 reg_genmove black
+#? [M9|M10|L10|L11]
+
+loadsgf games/arb/game04.sgf 43
+233 reg_genmove black
+#? [J9]
diff --git a/regression/arend.tst b/regression/arend.tst
new file mode 100644 (file)
index 0000000..c4aa46b
--- /dev/null
@@ -0,0 +1,232 @@
+# CATEGORY=FUSEKI_STRATEGY
+# SEVERITY=5
+loadsgf games/arend/gnugo-gnugo1.sgf 25
+1 reg_genmove black
+#? [C4]*
+
+# CATEGORY=KO
+# SEVERITY=3
+loadsgf games/arend/gnugo-gnugo1.sgf 112
+2 reg_genmove white
+#? [H15]
+
+# CATEGORY=CONNECTION
+# SEVERITY=10
+loadsgf games/arend/gnugo-gnugo1.sgf 139
+3 reg_genmove black
+#? [P6|Q5]
+
+# These kind of fights might be very difficult to do well
+# with current GNU Go methods (How should it choose between the different
+# 'correct' alternatives here? - R14 seems clearly best to me).
+# But certainly it should not tenuki.
+loadsgf games/arend/exper1.sgf 7
+4 reg_genmove black
+#? [R14|S15|R17]
+
+#CATEGORY=STRATEGY
+#DESCRIPTION=GNU Go should escape with its cutting stone.
+loadsgf games/arend/exper1.sgf 25
+5 reg_genmove black
+#? [D7|E7|E6]*
+
+#CATEGORY=STRATEGY
+#DESCRIPTION=In this position, GNU Go plays L10 because of an enormous assumed strategic effect on the M16 dragon, which is quite safe.
+loadsgf games/arend/gnugo-gnugo2.sgf 57
+7 reg_genmove black
+#? [C3]
+
+#CATEGORY=BLUNDER
+# S 16 can be captured. S17 is better, but another big move
+# should be accepted as well
+loadsgf games/arend/gnugo-gnugo2.sgf 60
+8 reg_genmove white
+#? [!S16]
+
+#CATEGORY=TACTICAL_READING
+# GNU Go rejects S17 because it is "strategically or tactically unsafe".
+# Must be a misread.
+loadsgf games/arend/gnugo-gnugo2.sgf 61
+9 reg_genmove black
+#? [S17]
+
+#CATEGORY=STRATEGY
+# J7 is extremely overvalued. This is caused by pattern CB11.
+loadsgf games/arend/gnugo-gnugo2.sgf 73
+10 reg_genmove black
+#? [!J7]
+
+#CATEGORY=STRATEGY
+# K6 is overvalued by GNU Go 3.0.0.
+loadsgf games/arend/gnugo-gnugo2.sgf 91
+11 reg_genmove black
+#? [!K6]
+
+#CATEGORY=BLUNDER
+loadsgf games/arend/gnugo-gnugo2.sgf 163
+12 reg_genmove black
+#? [C16|B16]
+
+#CATEGORY=STRATEGY
+# GNU Go does not see that P17 helps his group as well, and plays O13.
+loadsgf games/arend/gnugo-gnugo4.sgf 27
+14 reg_genmove black
+#? [P17]*
+
+#CATEGORY=FUSEKI_STRATEGY
+# C6 is clearly the wrong side for approaching LL corner.
+loadsgf games/arend/gnugo-gnugo4.sgf 31
+15 gg_genmove black 1
+#? [F3]*
+
+
+# GNU Go loves this move! (H2 is the point to play here.) It is impossible
+# to teach GNU Go not to play there with minor pattern tuning. Problem is
+# huge follow_up value; there is no check at all in the move valuation 
+# whether a sente move is actually worth something if opponent answers
+# (here it is aji-keshi).
+# This looses only a few points, but comes up very often.
+loadsgf games/arend/gnugo-gnugo4.sgf 45
+16 reg_genmove black
+#? [!G3]
+
+#CATEGORY=TACTICAL_READING
+# GNU Go moves at C9. I do not know what it is afraid of.
+loadsgf games/arend/gnugo-gnugo4.sgf 153
+17 reg_genmove black
+#? [C7]
+
+# Maybe this problem is suboptimal, because there is a ko involved, and
+# GNU Go gets it wrong even without the ko.
+loadsgf games/arend/gnugo-gnugo4.sgf 168
+18 reg_genmove white
+#? [P18|P19|R18|R19|S18|S17|S16|S14|S13|T14|T16]
+
+#CATEGORY=PATTERN_TUNING
+# GNU Go often plays this inefficient shape. Should be correctable with an
+# additional pattern. Core of the problem is however that GNU Go does not
+# understand the essence of the iken tobi -- it can be cut, but Black does
+# not mind that, since a cut only strengthens Black.
+loadsgf games/arend/gnugo-gnugo5.sgf 39
+20 reg_genmove black
+#? [!L15]
+
+#CATEGORY=STRATEGY
+# This inefficient move is produced by owl. But of course it should not
+# be owl in charge of strengthening this big dragon.
+loadsgf games/arend/gnugo-gnugo5.sgf 78
+21 reg_genmove white
+#? [!F9]
+
+# Immediately take the double sente point!
+loadsgf games/arend/gnugo-gnugo5.sgf 80
+22 reg_genmove white
+#? [D14]*
+
+# H10 is quite overvalued here.
+loadsgf games/arend/gnugo-gnugo5.sgf 105
+23 reg_genmove black
+#? [!H10]
+
+# Low Shimari clearly better here
+# See also arend2:130
+loadsgf games/arend/gnugo-gnugo6.sgf 20
+24 restricted_genmove white P16 P17
+#? [P17]*
+
+#CATEGORY=ENDGAME_TUNING
+# C19 is either double sente, or worth at least 5 pts in reverse sente,
+# which is 10 pts. T14 (chosen by GNU Go) is dame. F7 is nearly as large
+# as C19.
+loadsgf games/arend/gnugo-gnugo6.sgf 174
+25 reg_genmove white
+#? [C19|F7]
+
+#CATEGORY=FUSEKI_STRATEGY
+# D17 is wrong direction; in this position this is really bad.
+loadsgf games/arend/gnugo-gnugo7.sgf 17
+28 reg_genmove black
+#? [C16]
+
+#CATEGORY=FUSEKI_STRATEGY
+# Black C15 is sente here, so W C14 is mandatory.
+loadsgf games/arend/gnugo-gnugo7.sgf 24
+29 reg_genmove white
+#? [B14|C14]
+
+#CATEGORY=BLUNDER
+# GNU Go played F8.
+loadsgf games/arend/gnugo-gnugo7.sgf 79
+30 reg_genmove black
+#? [C13]*
+
+#CATEGORY=OWL_DEFEND (?)
+# B14 can (and should) be saved here
+loadsgf games/arend/gnugo-gnugo7.sgf 81
+31 reg_genmove black
+#? [B13|C13]
+#CATEGORY=CONNECTION
+#SEVERITY=9
+loadsgf games/arend/gnugo-gnugo7.sgf 137
+32 reg_genmove black
+#? [F9|E8|G8]
+loadsgf games/arend/gnugo-gnugo7.sgf 140
+33 reg_genmove white
+#? [F9]*
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/arend/gnugo-gnugo7.sgf 173
+34 reg_genmove black
+#? [!K8]
+# This is a serious mistake. H17 is not huge, its HUGE.
+loadsgf games/arend/gnugo-gnugo8.sgf 32
+35 reg_genmove white
+#? [H17|J19]
+
+#CATEGORY=ENDGAME_TUNING
+# Its just one point difference, but it happens a couple of times every
+# game.
+loadsgf games/arend/constructed1.sgf
+36 reg_genmove black
+#? [C5]
+
+#CATEGORY=ENDGAME_TUNING
+loadsgf games/arend/constructed2.sgf
+37 reg_genmove black
+#? [A5]
+#CATEGORY=STRATEGY
+# I think this problem summarizes well two common misjudgements 
+# of the influence function:
+# 1. Breaking into an opponents moyo is enormously
+# undervalued (that is why patterns like LE14--safe jump towards
+# oppoents moyo--need to have a fixed minimum value, which often leads
+# bad moves)
+# 2. O5 considerably weakens the influence of N5. Maybe this is not weighted
+# highly enough by GNU Go?
+loadsgf games/arend/constructed3.sgf
+38 reg_genmove white
+#? [O5]
+
+#CATEGORY=STRATEGY
+# This is an example for part 1 of my comment of the previous problem.
+# This slightly adapted from a game (to make the problem more specific).
+loadsgf games/arend/constructed4.sgf
+39 reg_genmove black
+#? [G10|H10|F13]
+
+#CATEGORY=ENDGAME_TUNING
+# EB714 is necessary here; without it, GNU Go played B6, only for the
+# reason of filling a liberty
+loadsgf games/arend/constructed5.sgf
+40 reg_genmove white
+#? [B7]
+
+#CATEGORY=ENDGAME_TUNING
+# EB715 necessary
+loadsgf games/arend/constructed6.sgf
+41 reg_genmove white
+#? [B6]
diff --git a/regression/arend2.tst b/regression/arend2.tst
new file mode 100644 (file)
index 0000000..98cef83
--- /dev/null
@@ -0,0 +1,130 @@
+
+# M3 is overplay
+loadsgf games/nngs/bconwil-gnugo-3.3.11-200211182313.sgf 18
+10 reg_genmove black
+#? [G3|F4]*
+
+# This is of course too hard for GNU Go at the moment.
+loadsgf games/nngs/bconwil-gnugo-3.3.11-200211182313.sgf 20
+20 reg_genmove black
+#? [G3|H3]*
+
+loadsgf games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf 36
+30 reg_genmove white
+#? [K3|J4|M5]
+
+# Definitely not T12 as in the game. /ab
+loadsgf games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf 50
+40 reg_genmove white
+#? [R10|S10|P11]*
+
+loadsgf games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf 52
+50 restricted_genmove white S14 T13
+#? [S14]
+
+# The cut at R14 is not dangerous. /ab
+loadsgf games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf 110
+60 reg_genmove white
+#? [N8|M7|L7|M9|L9|N7|O9|N10]
+
+loadsgf games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf 112
+70 reg_genmove white
+#? [N7|O9]
+
+# Only move.
+loadsgf games/nngs/gnugo-3.3.16-ccwills-200302151826.sgf 74
+80 reg_genmove white
+#? [L2]
+
+loadsgf games/paul.sgf 89
+90 restricted_genmove white P9 O10
+#? [O10]
+
+loadsgf games/paul.sgf 91
+100 restricted_genmove white O16 O15
+#? [O16]
+
+loadsgf games/nngs/gnugo-3.3.18-agh-200304291749.sgf 64
+110 restricted_genmove white T7 T8 R8
+#? [R8]
+
+loadsgf games/nngs/gnugo-3.3.18-joshj-200304242104.sgf 58
+120 restricted_genmove white G19 H17 J17
+#? [H17|J17]
+
+# See also arend:24
+loadsgf games/arend/gnugo-gnugo6.sgf 20
+130 restricted_genmove white P17 G16 F16 E15
+#? [P17]
+
+loadsgf games/nngs/guestu-gnugo-3.3.19-200305131943.sgf 39
+140 reg_genmove black
+#? [D11|H10|G9|E10]*
+
+loadsgf games/nngs/guestu-gnugo-3.3.19-200305131943.sgf 187
+150 reg_genmove black
+#? [D6|C6]
+
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 6
+160 reg_genmove black
+#? [O16]
+
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 12
+170 reg_genmove black
+#? [O14]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 26
+180 restricted_genmove black L17 L18
+#? [L17]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 40
+190 reg_genmove black
+#? [O1|P1|Q1]*
+
+# Q5 is clearly better, but R5 is still a lot better than everything else.
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 44
+200 reg_genmove black
+#? [Q5|R5]*
+
+# Cut off the white group!
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 106
+210 reg_genmove black
+#? [K2]
+
+# K11 should kill the white dragon. L11 might kill, too, so we accept it,
+# although K11 is better.
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 152
+220 reg_genmove black
+#? [K11|L11]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 158
+230 restricted_genmove black G14 H14 K11 L11
+#? [!H14]
+
+loadsgf games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf 208
+240 reg_genmove black
+#? [N7]*
+
+loadsgf games/kgs/TheGNUGo-Botkiller3.sgf 165
+250 restricted_genmove white D5 E5 D6
+#? [D5]*
+
+loadsgf games/kgs/simat-TheGNUGo.sgf 19
+260 reg_genmove black
+#? [E14]*
+
+loadsgf games/kgs/TheGNUGo-qsdf.sgf 83
+270 restricted_genmove white A11 A12 B8
+#? [A11|A12]*
+
+loadsgf games/hamete_joseki.sgf 37
+280 restricted_genmove black B5 P17 P16 Q12 E6 M3
+#? [B5]*
+
+loadsgf games/hamete_joseki.sgf 51
+290 reg_genmove black
+#? [C5]*
+
+loadsgf games/9x9-1.sgf 23
+300 restricted_genmove black D8 E8 F8
+#? [D8]*
diff --git a/regression/arion.tst b/regression/arion.tst
new file mode 100644 (file)
index 0000000..3db4e71
--- /dev/null
@@ -0,0 +1,33 @@
+# NNGS game of GNU Go 2.7.203 on December 28, 2000
+
+loadsgf games/arion.sgf 33
+1 gg_genmove black 1
+#? [Q6]
+
+loadsgf games/arion.sgf 63
+2 reg_genmove black
+#? [Q18|S16]
+
+# J3 is maybe not the largest move on the board but it is very clearly
+# sounder than a move near P6.
+loadsgf games/arion.sgf 69
+3 restricted_genmove black J3 O6 P7 O5 O7 N6
+#? [J3]
+
+loadsgf games/arion.sgf 139
+4 reg_genmove black
+#? [F9]
+
+# F15 is a blunder, leading to shortage of liberties and a combination
+# attack. To make this clearer, first fill out the remaining dame points.
+loadsgf games/arion.sgf 213
+play black P13
+play white D13
+play black E4
+5 reg_genmove black
+#? [D17|E17|F17|H17|J17|K17|D18|E18|F18|G18|H18|J18|K18]
+
+# F19 seems to be best way to live from a yose perspective.
+loadsgf games/arion.sgf 225
+6 reg_genmove black
+#? [E19|F19|F18]
diff --git a/regression/atari_atari.tst b/regression/atari_atari.tst
new file mode 100644 (file)
index 0000000..24dad03
--- /dev/null
@@ -0,0 +1,130 @@
+# N3 is ineffective. N2 and N1 differ in that the latter move gives
+# white the option to defend with a (disadvantageous) ko. L3 and K2
+# are also effective but miss the point and waste good ko threats.
+loadsgf games/incident107.sgf 216
+1 combination_attack black
+#? [N2|N1|L3|K2]
+
+loadsgf games/atari_atari01.sgf 235
+2 combination_attack black
+#? [PASS]
+
+loadsgf games/arb/game02.sgf 69
+3 combination_attack black
+#? [PASS]
+
+loadsgf games/incident156.sgf 232
+4 combination_attack white
+#? [K17]
+
+# K12 doesn't work.
+loadsgf games/ego.sgf 246
+5 combination_attack black
+#? [PASS]
+
+# Retired as endgame1.sgf is no longer in CVS. /ab
+# # E8 is bogus
+# loadsgf games/endgame1.sgf 3
+# 6 combination_attack black
+# #? [PASS]
+
+# D11 can be answered at C12.
+loadsgf games/scoring/score30.sgf
+7 combination_attack black
+#? [PASS]
+
+loadsgf games/atari_atari02.sgf 140
+8 combination_attack black
+#? [PASS]
+
+loadsgf games/atari_atari03.sgf 222
+9 combination_attack white
+#? [A11]
+
+# Both G5 and J4 capture (at least) the G6 string. After endgame
+# considerations, J4 turns out to be one point bigger.
+loadsgf games/atari_atari04.sgf 279
+10 combination_attack white
+#? [J4|G5]
+
+loadsgf games/viking2.sgf 140
+11 combination_attack white
+#? [M14]
+
+loadsgf games/viking2.sgf 146
+12 combination_attack white
+#? [N13|Q12]
+
+loadsgf games/trevor/auto/c24.sgf 62
+13 combination_attack black
+#? [D8]
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 104
+14 combination_attack black
+#? [PASS]
+
+loadsgf games/atari_atari05.sgf 291
+15 combination_attack black
+#? [B13]
+
+loadsgf games/atari_atari06.sgf
+16 combination_attack white
+#? [K3]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 194
+17 combination_attack white
+#? [S10]
+
+loadsgf games/nngs/gnugo-3.3.12-guest-200212171626.sgf 148
+18 combination_attack black
+#? [R11|R14]
+
+loadsgf games/nngs/gnugo-3.3.10-deye-200210211347.sgf 135
+19 combination_attack black
+#? [P9|Q7]
+
+# See also nando:25
+loadsgf games/nando/auto017.sgf
+white P16
+20 combination_attack black
+#? [L17]*
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302252226.sgf 256
+21 combination_attack black
+#? [Q9|N13|O13]
+
+loadsgf games/nngs/gnugo-3.3.16-ccwills-200303030550.sgf
+22 combination_attack black
+#? [L10]
+
+loadsgf games/atari_atari07.sgf
+23 combination_attack black
+#? [C8]
+
+loadsgf games/atari_atari08.sgf 227
+24 combination_defend black
+#? [!.*(K16|A12|R12|S12|T12|A11|B11|C11|R11|S11|T11|A10|C10|Q10|S10|D9).*]*
+
+# T14 is a blunder.  GNU Go should know how to punish it.
+loadsgf games/atari_atari09.sgf
+play black T14
+25 combination_attack white
+#? [R16]
+
+loadsgf games/self_play/354-34-2.sgf 150
+26 combination_defend white
+#? [E11|E12]*
+
+loadsgf games/filllib14.sgf
+play white H5
+27 combination_attack black
+#? [0]*
+
+# See also nngs:1060. Black has no combination attack at R3.
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 52
+28 combination_attack black
+#? [0]*
+
+loadsgf games/atari_atari10.sgf
+29 combination_attack white
+#? [K5]
diff --git a/regression/auto01.tst b/regression/auto01.tst
new file mode 100644 (file)
index 0000000..fc3034c
--- /dev/null
@@ -0,0 +1,42 @@
+#auto generated owl inconsistencies
+loadsgf games/auto_gen/auto001.sgf 136
+1 owl_defend P11
+#? [1 Q11]
+
+loadsgf games/auto_gen/auto001.sgf 139
+2 owl_attack R16
+#? [1 (O11|M10|T10)]
+
+loadsgf games/auto_gen/auto001.sgf 140
+3 owl_defend R16
+#? [1 (O11|T15|T13)]
+
+loadsgf games/auto_gen/auto002.sgf 186
+4 owl_defend N8
+#? [1 (R1|N3|N5|M5|N6|Q2)]
+
+loadsgf games/auto_gen/auto003.sgf 52
+5 owl_defend S9
+#? [1 Q10]*
+
+loadsgf games/auto_gen/auto004.sgf 9
+6 owl_defend F3
+#? [!0]
+
+loadsgf games/auto_gen/auto006.sgf 25
+8 owl_defend G4
+#? [1 (H5|J4|G5)]*
+
+loadsgf games/auto_gen/auto006.sgf 81
+11 owl_attack M17
+#? [1 J18]*
+
+loadsgf games/auto_gen/auto006.sgf 94
+13 owl_attack S11
+#? [1 (Q12|Q13)]
+
+# This is a difficult semeai problem.
+loadsgf games/auto_gen/auto006.sgf 99
+15 analyze_semeai S9 S10
+#? [1 1 S6]*
+
diff --git a/regression/auto02.tst b/regression/auto02.tst
new file mode 100644 (file)
index 0000000..2cc8d54
--- /dev/null
@@ -0,0 +1,45 @@
+loadsgf games/auto_gen/auto007.sgf 20
+1 owl_defend Q13
+#? [1 (Q11|P12)]
+
+loadsgf games/auto_gen/auto007.sgf 42
+2 owl_defend Q13
+#? [!0]*
+
+# C16 is probably best. /ab
+loadsgf games/auto_gen/auto008.sgf 58
+3 owl_defend D16
+#? [1 (C16|D17|E15|D14)]
+
+loadsgf games/auto_gen/auto008.sgf 150
+4 owl_attack C12
+#? [1 (A14|A12)]*
+
+# Good problem for connection-related owl tuning.
+loadsgf games/auto_gen/auto008.sgf 180
+5 owl_defend A15
+#? [1 (B9|D9)]*
+
+loadsgf games/auto_gen/auto009.sgf 94
+6 owl_defend F3
+#? [!0]
+
+loadsgf games/auto_gen/auto010.sgf 66
+7 owl_attack Q17
+#? [1 (S15|R15)]
+
+loadsgf games/auto_gen/auto010.sgf 64
+8 owl_attack Q17
+#? [!0]
+
+loadsgf games/auto_gen/auto010.sgf 77
+9 owl_attack C18
+#? [1 D18]*
+
+loadsgf games/auto_gen/auto011.sgf 43
+10 owl_defend D9
+#? [!0]
+
+loadsgf games/auto_gen/auto012.sgf 168
+11 owl_attack H15
+#? [0]
diff --git a/regression/auto03.tst b/regression/auto03.tst
new file mode 100644 (file)
index 0000000..3572db5
--- /dev/null
@@ -0,0 +1,44 @@
+loadsgf games/auto_gen/auto013.sgf 47
+1 owl_defend H16
+#? [!0]*
+
+loadsgf games/auto_gen/auto013.sgf 51
+2 owl_defend H16
+#? [!0]*
+
+loadsgf games/auto_gen/auto013.sgf 53
+3 owl_attack L17
+#? [1 K17]*
+
+# This is a connection problem. /ab
+loadsgf games/auto_gen/auto014.sgf 106
+6 owl_attack L14
+#? [1 N12]*
+
+loadsgf games/auto_gen/auto014.sgf 107
+7 owl_defend L14
+#? [1 N12]*
+
+loadsgf games/auto_gen/auto015.sgf 145
+8 attack T7
+#? [1 T5]*
+
+loadsgf games/auto_gen/auto016.sgf 37
+9 owl_defend J15
+#? [!0]
+
+loadsgf games/auto_gen/auto016.sgf 48
+10 owl_defend P16
+#? [1 (O16|P15)]
+
+loadsgf games/auto_gen/auto016.sgf 53
+11 owl_defend Q4
+#? [1 (P4|P3|Q3|R4)]
+
+loadsgf games/auto_gen/auto016.sgf 55
+12 owl_defend N5
+#? [!0]
+
+loadsgf games/auto_gen/auto017.sgf 45
+14 owl_defend Q4
+#? [!0]*
diff --git a/regression/auto04.tst b/regression/auto04.tst
new file mode 100644 (file)
index 0000000..3e7e159
--- /dev/null
@@ -0,0 +1,23 @@
+loadsgf games/auto_gen/auto018.sgf 103
+1 owl_attack R14
+#? [!0]
+
+loadsgf games/auto_gen/auto019.sgf 76
+2 owl_defend E18
+#? [!0]*
+
+loadsgf games/auto_gen/auto020.sgf 67
+3 owl_defend N4
+#? [1 (M5|L4|N5|L5)]
+
+loadsgf games/auto_gen/auto021.sgf 72
+7 owl_defend J15
+#? [0]
+
+loadsgf games/auto_gen/auto022.sgf 37
+11 owl_defend E18
+#? [1 (D17|F12|F13|G14|G18|H18)]
+
+loadsgf games/auto_gen/auto022.sgf 136
+12 owl_attack G4
+#? [1 D2]*
diff --git a/regression/auto_handtalk.tst b/regression/auto_handtalk.tst
new file mode 100644 (file)
index 0000000..1d6cdb8
--- /dev/null
@@ -0,0 +1,35 @@
+
+loadsgf games/handtalk/handtalk1.sgf 113
+3 owl_attack q19
+#? [2 T15]
+
+loadsgf games/handtalk/handtalk2.sgf 35
+4 owl_defend R8
+#? [1 P10]*
+
+loadsgf games/handtalk/handtalk2.sgf 70
+5 owl_defend P18
+#? [2 (S18|O17|N18)]*
+
+# O18 might work, but I don't think so. /ab
+loadsgf games/handtalk/handtalk2.sgf 78
+6 owl_defend P19
+#? [1 (N18|O17)]*
+
+7 analyze_semeai Q17 P19
+#? [1 1 (O18|N18|O17|P17)]
+
+8 analyze_semeai P19 Q17
+#? [1 1 (N18|O17|S15)]*
+
+loadsgf games/handtalk/handtalk2.sgf 134
+9 owl_attack R8
+#? [1 (T6|T7)]
+
+loadsgf games/handtalk/handtalk2.sgf 136
+10 owl_defend Q4
+#? [0]
+
+#loadsgf games/handtalk/handtalk2.sgf 160
+#11 owl_defend G15
+##? [1 E13]*
diff --git a/regression/benchmark/GnuGo-Aya.gtp b/regression/benchmark/GnuGo-Aya.gtp
new file mode 100644 (file)
index 0000000..dda8ef0
--- /dev/null
@@ -0,0 +1,82 @@
+# White: GNU Go 3.3.23
+# Black: Aya
+# Handicap: 0
+# Result: W+67.5
+# 2003-08-03
+# Gifu 2003 Round 6
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black C16
+2 reg_genmove white
+play white Q16
+play black R4
+4 reg_genmove white
+play white D3
+play black C5
+6 reg_genmove white
+play white E4
+play black P3
+8 reg_genmove white
+play white D6
+play black E17
+10 reg_genmove white
+play white C6
+play black R17
+12 reg_genmove white
+play white R16
+play black Q17
+14 reg_genmove white
+play white P17
+play black P18
+16 reg_genmove white
+play white O17
+play black O18
+18 reg_genmove white
+play white N17
+play black S16
+20 reg_genmove white
+play white S15
+play black S17
+22 reg_genmove white
+play white R14
+play black R7
+24 reg_genmove white
+play white C10
+play black C13
+26 reg_genmove white
+play white K3
+play black R11
+28 reg_genmove white
+play white N18
+play black J17
+30 reg_genmove white
+play white M4
+play black L16
+32 reg_genmove white
+play white L18
+play black N15
+34 reg_genmove white
+play white O15
+play black N3
+36 reg_genmove white
+play white E11
+play black K17
+38 reg_genmove white
+play white G11
+play black Q13
+40 reg_genmove white
+play white M6
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-GORO.gtp b/regression/benchmark/GnuGo-GORO.gtp
new file mode 100644 (file)
index 0000000..0c8075d
--- /dev/null
@@ -0,0 +1,242 @@
+# White: GNU Go 3.3.23
+# Black: GORO
+# Handicap: 0
+# Result: W+18.5
+# 2003-08-03
+# CGF 2003 Round 7
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black R17
+play white D4
+play black R3
+play white C16
+play black R10
+play white E16
+play black K3
+play white Q4
+play black R4
+play white Q5
+play black R6
+play white P7
+play black Q8
+play white Q16
+play black Q17
+play white P16
+play black O17
+play white S15
+play black Q3
+play white N15
+play black P4
+play white M17
+play black R13
+play white C10
+play black O16
+play white S13
+play black R14
+play white S14
+play black P15
+play white O15
+play black P14
+play white S12
+play black S16
+play white R16
+play black S17
+play white R15
+play black Q12
+play white L13
+play black M4
+play white G3
+play black O9
+play white P5
+play black G17
+play white N7
+play black M9
+play white J17
+play black L7
+play white G16
+play black M18
+play white F18
+play black N18
+play white F7
+play black C6
+play white B5
+play black E6
+play white B7
+play black G5
+play white O4
+play black H4
+play white P3
+play black Q2
+play white M3
+play black M6
+play white N3
+play black O2
+play white K11
+play black N5
+play white J9
+play black L3
+play white L2
+play black H3
+play white Q7
+play black D8
+play white E9
+play black E4
+play white D5
+play black E3
+play white D6
+play black E7
+play white C8
+play black E5
+play white K2
+play black H2
+play white N2
+play black O6
+play white O7
+play black P6
+play white Q6
+play black R5
+play white D3
+play black P2
+play white O5
+play black O3
+play white F9
+play black N6
+play white L18
+play black R7
+play white E2
+play black M8
+play white F2
+play black M1
+play white J7
+play black L5
+play white M19
+play black E14
+play white F13
+play black N19
+play white L19
+play black F14
+play white E8
+play black G14
+play white M11
+play black E13
+play white F12
+play black J14
+play white G18
+play black L17
+play white E12
+play black N16
+play white C13
+play black L16
+play white K15
+play black J18
+play white H18
+play black H17
+play white K16
+play black K17
+play white J16
+play black J19
+play white O13
+play black R12
+play white D7
+play black N11
+play white P13
+play black Q13
+play white N12
+play black G7
+play white G8
+play black H7
+play white F6
+play black G4
+play white H8
+play black J6
+play white O11
+play black P8
+play white O14
+play black Q14
+play white G2
+play black S11
+play white N10
+play black P11
+play white K7
+play black H12
+play white K6
+play black M7
+play white H6
+play black G6
+play white J5
+play black G15
+play white H16
+play black C14
+162 reg_genmove white
+play white B14
+play black C15
+164 reg_genmove white
+play white B15
+play black D13
+166 reg_genmove white
+play white B13
+play black N1
+168 reg_genmove white
+play white L15
+play black M16
+170 reg_genmove white
+play white O10
+play black O8
+172 reg_genmove white
+play white P10
+play black Q10
+174 reg_genmove white
+play white P12
+play black G1
+176 reg_genmove white
+play white Q11
+play black K9
+178 reg_genmove white
+play white L10
+play black K8
+180 reg_genmove white
+play white J8
+play black K10
+182 reg_genmove white
+play white J10
+play black K5
+184 reg_genmove white
+play white J4
+play black J3
+186 reg_genmove white
+play white L9
+play black L8
+188 reg_genmove white
+play white M10
+play black M15
+190 reg_genmove white
+play white M14
+play black K4
+192 reg_genmove white
+play white F1
+play black H1
+194 reg_genmove white
+play white F5
+play black F4
+196 reg_genmove white
+play white F8
+play black N9
+198 reg_genmove white
+play white P9
+play black Q9
+200 reg_genmove white
+play white H19
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-Go4.gtp b/regression/benchmark/GnuGo-Go4.gtp
new file mode 100644 (file)
index 0000000..c1200d9
--- /dev/null
@@ -0,0 +1,122 @@
+# White: Go++
+# Black: GNU Go 3.3.23
+# Handicap: 0
+# Result: W+10.5
+# 2003-08-03
+# CGF 2003 Round 9
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black Q16
+play white C17
+play black Q3
+play white C4
+play black E3
+play white C7
+play black H3
+play white R6
+play black Q5
+play white S4
+play black F16
+play white C14
+play black N3
+play white L17
+play black J17
+play white O17
+play black Q14
+play white Q18
+play black R17
+play white D3
+play black E4
+play white R18
+play black E7
+play white D9
+play black H5
+play white F9
+play black J15
+play white E17
+play black N5
+play white R9
+play black R11
+play white G13
+play black L6
+play white J13
+play black L15
+play white P9
+play black E13
+play white L13
+play black E15
+play white C12
+41 reg_genmove black
+play black E11
+play white D10
+43 reg_genmove black
+play black G14
+play white M10
+45 reg_genmove black
+play black F10
+play white J10
+47 reg_genmove black
+play black D6
+play white C6
+49 reg_genmove black
+play black D2
+play white C2
+51 reg_genmove black
+play black E2
+play white F17
+53 reg_genmove black
+play black S18
+play white Q17
+55 reg_genmove black
+play black S17
+play white H14
+57 reg_genmove black
+play black H15
+play white K16
+59 reg_genmove black
+play black K15
+play white K18
+61 reg_genmove black
+play black N15
+play white M16
+63 reg_genmove black
+play black M15
+play white N13
+65 reg_genmove black
+play black H18
+play white N16
+67 reg_genmove black
+play black E19
+play white D18
+69 reg_genmove black
+play black S2
+play white G10
+71 reg_genmove black
+play black G11
+play white H11
+73 reg_genmove black
+play black O14
+play white G17
+75 reg_genmove black
+play black J16
+play white P12
+77 reg_genmove black
+play black Q12
+play white P11
+79 reg_genmove black
+play black F13
+play white S10
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-GoInt.gtp b/regression/benchmark/GnuGo-GoInt.gtp
new file mode 100644 (file)
index 0000000..3098c6e
--- /dev/null
@@ -0,0 +1,202 @@
+# White: Go Intellect
+# Black: GNU Go 3.3.23
+# Handicap: 0
+# Result: B+14.5
+# 2003-08-02
+# CGF 2003 Round 1
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black R16
+play white C16
+play black E16
+play white C4
+play black C17
+play white D17
+play black D16
+play white E17
+play black C15
+play white H17
+play black C18
+play white F16
+play black E3
+play white P17
+play black Q14
+play white C10
+play black D5
+play white D4
+play black E4
+play white C5
+play black D6
+play white C7
+play black R4
+play white K3
+play black P3
+play white G3
+play black E8
+play white F15
+play black R10
+play white C6
+play black O14
+play white F5
+play black E5
+play white F6
+play black C2
+play white F2
+play black B3
+play white D18
+play black B16
+play white D7
+play black G8
+play white E7
+play black B4
+play white D3
+play black E2
+play white D2
+play black D1
+play white Q9
+play black B5
+play white Q10
+play black R7
+play white R8
+play black S8
+play white S9
+play black R9
+play white Q8
+play black S10
+play white B1
+play black N17
+play white O16
+play black N16
+play white R17
+play black S17
+play white Q16
+play black R18
+play white R15
+play black Q17
+play white Q15
+play black Q18
+play white P18
+play black N15
+play white S16
+play black S15
+play white T16
+play black T17
+play white R17
+play black S14
+play white R16
+play black M3
+play white R14
+play black P15
+play white S18
+play black R13
+play white Q13
+play black C12
+play white P14
+play black K17
+play white R11
+play black S11
+play white R12
+play black K15
+play white S7
+play black T9
+play white R6
+play black Q7
+play white Q6
+play black P7
+play white P6
+play black O7
+play white N5
+play black O6
+play white L4
+play black O5
+play white O13
+play black S12
+play white S13
+play black N13
+play white E10
+play black F7
+play white H10
+play black G6
+play white F9
+play black F8
+play white G5
+play black J8
+play white H6
+play black K13
+play white K10
+play black G7
+play white L8
+121 reg_genmove black
+play black O12
+play white P13
+123 reg_genmove black
+play black N4
+play white M4
+125 reg_genmove black
+play black M2
+play white S6
+127 reg_genmove black
+play black O4
+play white T12
+129 reg_genmove black
+play black T11
+play white Q4
+131 reg_genmove black
+play black Q3
+play white N12
+133 reg_genmove black
+play black S4
+play white T13
+135 reg_genmove black
+play black N11
+play white M12
+137 reg_genmove black
+play black O11
+play white C1
+139 reg_genmove black
+play black E1
+play white M13
+141 reg_genmove black
+play black N14
+play white M11
+143 reg_genmove black
+play black O9
+play white M5
+145 reg_genmove black
+play black G14
+play white L2
+147 reg_genmove black
+play black B10
+play white B11
+149 reg_genmove black
+play black C11
+play white B9
+151 reg_genmove black
+play black D10
+play white A10
+153 reg_genmove black
+play black D9
+play white D11
+155 reg_genmove black
+play black E11
+play white G9
+157 reg_genmove black
+play black D12
+play white F11
+159 reg_genmove black
+play black J18
+play white B12
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-GoeMate.gtp b/regression/benchmark/GnuGo-GoeMate.gtp
new file mode 100644 (file)
index 0000000..423b7dc
--- /dev/null
@@ -0,0 +1,162 @@
+# White: GoeMate
+# Black: GNU Go 3.3.23
+# Handicap: 0
+# Result: W+26.5
+# 2003-08-02
+# CGF 2003 Round 4
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black Q16
+play white D3
+play black C16
+play white R4
+play black D5
+play white E16
+play black C3
+play white C2
+play black H16
+play white E14
+play black C13
+play white C4
+play black P3
+play white R14
+play black Q5
+play white R5
+play black Q6
+play white R6
+play black Q7
+play white R8
+play black K3
+play white C17
+play black B17
+play white D17
+play black P9
+play white M16
+play black K5
+play white J15
+play black R12
+play white J16
+play black Q14
+play white R17
+play black R16
+play white Q17
+play black H17
+play white J17
+play black S14
+play white P16
+play black C10
+play white G3
+play black R10
+play white B6
+play black R7
+play white S7
+play black R2
+play white S9
+play black D15
+play white B18
+play black H15
+play white H13
+play black B16
+play white E15
+play black N13
+play white K7
+play black M7
+play white H6
+play black L9
+play white D7
+play black K13
+play white K9
+play black K10
+play white J9
+play black J11
+play white H14
+play black G11
+play white L6
+play black N5
+play white G9
+play black H5
+play white G6
+play black H2
+play white G5
+play black H4
+play white T12
+play black G4
+play white F4
+play black G2
+play white R15
+play black S16
+play white Q15
+81 reg_genmove black
+play black P15
+play white O15
+83 reg_genmove black
+play black P14
+play white O16
+85 reg_genmove black
+play black S17
+play white O14
+87 reg_genmove black
+play black R18
+play white O13
+89 reg_genmove black
+play black P12
+play white O12
+91 reg_genmove black
+play black P17
+play white R13
+93 reg_genmove black
+play black Q13
+play white S13
+95 reg_genmove black
+play black O17
+play white L8
+97 reg_genmove black
+play black S15
+play white M8
+99 reg_genmove black
+play black M12
+play white E11
+101 reg_genmove black
+play black E10
+play white F10
+103 reg_genmove black
+play black N17
+play white N11
+105 reg_genmove black
+play black L10
+play white O8
+107 reg_genmove black
+play black N10
+play white M11
+109 reg_genmove black
+play black O9
+play white L11
+111 reg_genmove black
+play black N16
+play white N15
+113 reg_genmove black
+play black M15
+play white M14
+115 reg_genmove black
+play black M13
+play white L15
+117 reg_genmove black
+play black K11
+play white N9
+119 reg_genmove black
+play black L18
+play white J18
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-Haruka.gtp b/regression/benchmark/GnuGo-Haruka.gtp
new file mode 100644 (file)
index 0000000..900f419
--- /dev/null
@@ -0,0 +1,282 @@
+# White: GNU Go 3.3.23
+# Black: Haruka
+# Handicap: 0
+# Result: B+40.5
+# 2003-08-02
+# CGF 2003 Round 3
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black R16
+play white D17
+play black Q4
+play white P17
+play black M17
+play white Q15
+play black Q16
+play white P16
+play black P15
+play white P14
+play black O15
+play white R14
+play black R15
+play white Q14
+play black Q18
+play white N16
+play black N15
+play white Q17
+play black R17
+play white P18
+play black R18
+play white M16
+play black L17
+play white M14
+play black O16
+play white N17
+play black O13
+play white M15
+play black N13
+play white Q11
+play black K15
+play white L13
+play black F17
+play white D15
+play black K13
+play white L12
+play black N18
+play white O18
+play black M18
+play white O17
+play black O10
+play white D4
+play black P12
+play white Q9
+play black Q12
+play white R12
+play black R7
+play white R9
+play black R11
+play white S11
+play black R13
+play white S12
+play black K12
+play white O3
+play black L10
+play white L3
+play black S14
+play white S13
+play black S15
+play white H3
+play black C3
+play white C4
+play black D3
+play white E3
+play black E2
+play white F3
+play black B4
+play white B5
+play black B3
+play white C6
+play black K6
+play white E11
+play black E16
+play white D16
+play black F13
+play white E13
+play black F14
+play white Q13
+play black E18
+play white G10
+play black G8
+play white E9
+play black E7
+play white F7
+play black F8
+play white Q2
+play black R3
+play white D7
+play black G6
+play white E6
+play black C18
+play white C13
+play black E8
+play white D8
+play black B16
+play white R2
+play black S8
+play white O9
+play black P11
+play white P10
+play black Q10
+play white F2
+play black E1
+play white S9
+play black P9
+play white P8
+play black O8
+play white P10
+play black P6
+play white N9
+play black N10
+play white P9
+play black M9
+play white N8
+play black O7
+play white R10
+play black F1
+play white F6
+play black N5
+play white G7
+play black J1
+play white H8
+play black M2
+play white M3
+play black N3
+play white N2
+play black O2
+play white N4
+play black M5
+play white S3
+play black S4
+play white J2
+play black Q11
+play white T10
+play black S2
+play white S1
+play black T3
+play white H1
+play black B14
+play white B13
+play black E14
+play white G1
+play black C1
+play white D14
+play black A13
+play white A12
+play black A14
+play white B11
+play black C17
+play white F12
+play black H6
+play white G12
+play black H13
+play white D18
+play black D19
+play white E17
+play black E15
+play white N7
+play black J10
+play white J5
+play black J6
+play white H12
+play black J12
+play white F18
+play black E19
+play white F16
+play black G17
+play white R1
+play black K8
+play white L7
+play black J8
+play white H9
+play black G13
+play white H11
+play black D2
+play white P7
+play black O6
+play white O14
+play black N14
+play white O4
+play black P3
+play white P2
+play black G4
+play white H4
+play black F5
+play white G3
+play black G18
+play white F4
+play black G5
+play white E5
+play black K4
+play white K5
+play black L4
+play white L6
+play black K3
+play white K2
+play black Q7
+play white L5
+play black M4
+play white J9
+play black K9
+202 reg_genmove white
+play white C15
+play black L2
+204 reg_genmove white
+play white N3
+play black J11
+206 reg_genmove white
+play white B15
+play black A15
+208 reg_genmove white
+play white C16
+play black B17
+210 reg_genmove white
+play white R8
+play black S7
+212 reg_genmove white
+play white A4
+play black A3
+214 reg_genmove white
+play white A5
+play black T13
+216 reg_genmove white
+play white T12
+play black T14
+218 reg_genmove white
+play white M6
+play black P4
+220 reg_genmove white
+play white O5
+play black N6
+222 reg_genmove white
+play white P5
+play black Q5
+224 reg_genmove white
+play white N1
+play black T8
+226 reg_genmove white
+play white M8
+play black L8
+228 reg_genmove white
+play white C14
+play black A16
+230 reg_genmove white
+play white K7
+play black J7
+232 reg_genmove white
+play white H10
+play black D12
+234 reg_genmove white
+play white E12
+play black H7
+236 reg_genmove white
+play white R13
+play black P13
+238 reg_genmove white
+play white T9
+play black Q3
+240 reg_genmove white
+play white H5
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-KCC.gtp b/regression/benchmark/GnuGo-KCC.gtp
new file mode 100644 (file)
index 0000000..7bde43f
--- /dev/null
@@ -0,0 +1,122 @@
+# White: KCC
+# Black: GNU Go 3.3.23
+# Handicap: 0
+# Result: W+64.5
+# 2003-08-02
+# CGF 2003 Round 5
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black Q16
+play white Q4
+play black C16
+play white D4
+play black J17
+play white R14
+play black Q14
+play white Q13
+play black P14
+play white R15
+play black R16
+play white R11
+play black O12
+play white C10
+play black E16
+play white C13
+play black F4
+play white D6
+play black D3
+play white C3
+play black E3
+play white C2
+play black K3
+play white R8
+play black O3
+play white Q3
+play black F14
+play white B15
+play black M17
+play white G12
+play black F6
+play white H14
+play black G16
+play white B16
+play black O5
+play white C17
+play black D17
+play white C18
+play black E8
+play white N7
+41 reg_genmove black
+play black D2
+play white P6
+43 reg_genmove black
+play black K14
+play white K13
+45 reg_genmove black
+play black M5
+play white L6
+47 reg_genmove black
+play black M12
+play white L14
+49 reg_genmove black
+play black L13
+play white K15
+51 reg_genmove black
+play black M14
+play white J14
+53 reg_genmove black
+play black K12
+play white K10
+55 reg_genmove black
+play black H6
+play white E7
+57 reg_genmove black
+play black F8
+play white D8
+59 reg_genmove black
+play black D18
+play white P2
+61 reg_genmove black
+play black O2
+play white N10
+63 reg_genmove black
+play black P10
+play white H16
+65 reg_genmove black
+play black H17
+play white M15
+67 reg_genmove black
+play black P17
+play white P13
+69 reg_genmove black
+play black P12
+play white O13
+71 reg_genmove black
+play black N13
+play white N14
+73 reg_genmove black
+play black M13
+play white N15
+75 reg_genmove black
+play black G8
+play white H10
+77 reg_genmove black
+play black M10
+play white L11
+79 reg_genmove black
+play black N9
+play white Q7
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-Katsunari.gtp b/regression/benchmark/GnuGo-Katsunari.gtp
new file mode 100644 (file)
index 0000000..d0618a9
--- /dev/null
@@ -0,0 +1,82 @@
+# White: Katsunari
+# Black: GNU Go 3.3.23
+# Handicap: 0
+# Result: B+47.5
+# 2003-08-03
+# CGF 2003 Round 8
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+1 reg_genmove black
+play black Q16
+play white D16
+3 reg_genmove black
+play black D4
+play white R4
+5 reg_genmove black
+play black C14
+play white F17
+7 reg_genmove black
+play black B16
+play white C17
+9 reg_genmove black
+play black C11
+play white R14
+11 reg_genmove black
+play black P4
+play white P3
+13 reg_genmove black
+play black O3
+play white Q3
+15 reg_genmove black
+play black O4
+play white R6
+17 reg_genmove black
+play black K3
+play white C6
+19 reg_genmove black
+play black D6
+play white D7
+21 reg_genmove black
+play black E6
+play white C4
+23 reg_genmove black
+play black C5
+play white B5
+25 reg_genmove black
+play black D5
+play white B7
+27 reg_genmove black
+play black C3
+play white B4
+29 reg_genmove black
+play black E7
+play white D8
+31 reg_genmove black
+play black B3
+play white R11
+33 reg_genmove black
+play black O16
+play white S16
+35 reg_genmove black
+play black R17
+play white E2
+37 reg_genmove black
+play black K17
+play white N16
+39 reg_genmove black
+play black N15
+play white M16
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/GnuGo-Martha.gtp b/regression/benchmark/GnuGo-Martha.gtp
new file mode 100644 (file)
index 0000000..75f37cd
--- /dev/null
@@ -0,0 +1,282 @@
+# White: GNU Go 3.3.23
+# Black: Martha
+# Handicap: 0
+# Result: W+371.5
+# 2003-08-02
+# CGF 2003 Round 2
+
+boardsize 19
+clear_board
+komi 6.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black C17
+play white Q4
+play black H17
+play white C3
+play black N17
+play white D16
+play black D14
+play white E15
+play black E16
+play white D15
+play black E14
+play white F15
+play black H12
+play white G17
+play black N12
+play white F14
+play black C9
+play white H16
+play black H7
+play white J17
+play black N7
+play white C14
+play black R4
+play white R5
+play black R6
+play white R3
+play black C4
+play white D4
+play black D3
+play white C5
+play black B4
+play white E3
+play black F3
+play white D2
+play black M3
+play white S4
+play black B14
+play white C13
+play black B13
+play white E13
+play black R17
+play white Q6
+play black R12
+play white R7
+play black R8
+play white Q8
+play black Q9
+play white Q16
+play black Q15
+play white F4
+play black H18
+play white J18
+play black K18
+play white B15
+play black B16
+play white G3
+play black H3
+play white H4
+play black J4
+play white R9
+play black S9
+play white S8
+play black E12
+play white B12
+play black A12
+play white B11
+play black C11
+play white D17
+play black D18
+play white B18
+play black B17
+play white C18
+play black C19
+play white E18
+play black F18
+play white R10
+play black C15
+play white A15
+play black C6
+play white B5
+play black B3
+play white D6
+play black C7
+play white C12
+play black D12
+play white J3
+play black H2
+play white K3
+play black J2
+play white L3
+play black K4
+play white L4
+play black M4
+play white K5
+play black J5
+play white L5
+play black M5
+play white J6
+play black K6
+play white L6
+play black H5
+play white G4
+play black D13
+play white D11
+play black F13
+play white C10
+play black J16
+play white K17
+play black J19
+play white L18
+play black K16
+play white L17
+play black L16
+play white H15
+play black L19
+play white M19
+play black M18
+play white K19
+play black D10
+play white M16
+play black M17
+play white M15
+play black M14
+play white L15
+play black L14
+play white K7
+play black L7
+play white J8
+play black J9
+play white K9
+play black K8
+play white L8
+play black K2
+play white L2
+play black M2
+play white O19
+play black O18
+play white N19
+play black M8
+play white H6
+play black G5
+play white L1
+play black G6
+play white G7
+play black G8
+play white F7
+play black F6
+play white F8
+play black F9
+play white D7
+play black E7
+play white E8
+play black D8
+play white E6
+play black H8
+play white E9
+play black B10
+play white G9
+play black C11
+play white C16
+play black K10
+play white L10
+play black L9
+play white M9
+play black M10
+play white J10
+play black R2
+play white E11
+play black G12
+play white E10
+play black N9
+play white D9
+play black L9
+play white K11
+play black K8
+play white H9
+play black P19
+play white J13
+play black J12
+play white C10
+play black J14
+play white K13
+play black K14
+play white H14
+play black J15
+play white N14
+play black N15
+play white N16
+play black O16
+play white O15
+play black O14
+play white O13
+play black N13
+play white P14
+play black Q14
+play white P18
+play black K15
+play white P16
+play black N15
+play white P15
+play black P17
+202 reg_genmove white
+play white Q2
+play black O14
+204 reg_genmove white
+play white Q19
+play black Q18
+206 reg_genmove white
+play white P19
+play black Q17
+208 reg_genmove white
+play white Q10
+play black Q12
+210 reg_genmove white
+play white S11
+play black R11
+212 reg_genmove white
+play white P9
+play black R1
+214 reg_genmove white
+play white S2
+play black N18
+216 reg_genmove white
+play white R19
+play black R18
+218 reg_genmove white
+play white S19
+play black F16
+220 reg_genmove white
+play white A11
+play black B7
+222 reg_genmove white
+play white C8
+play black H1
+224 reg_genmove white
+play white H19
+play black F17
+226 reg_genmove white
+play white G18
+play black O2
+228 reg_genmove white
+play white L8
+play black C2
+230 reg_genmove white
+play white K8
+play black D3
+232 reg_genmove white
+play white F2
+play black D19
+234 reg_genmove white
+play white E19
+play black A17
+236 reg_genmove white
+play white S12
+play black T12
+238 reg_genmove white
+play white S13
+play black S14
+240 reg_genmove white
+play white R16
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/golois-gnugo.gtp b/regression/benchmark/golois-gnugo.gtp
new file mode 100644 (file)
index 0000000..1c70d18
--- /dev/null
@@ -0,0 +1,160 @@
+# White: Golois
+# Black: GNU Go
+# Handicap: 0
+# 2002-07-27
+
+boardsize 19
+clear_board
+komi 5.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black Q16
+play white C17
+play black Q3
+play white C4
+play black E3
+play white R10
+play black D5
+play white K17
+play black C5
+play white C10
+play black B4
+play white K3
+play black R5
+play white R17
+play black R16
+play white Q17
+play black P17
+play white E4
+play black D4
+play white F4
+play black P18
+play white N3
+play black D16
+play white D17
+play black E16
+play white E17
+play black R8
+play white R13
+play black M17
+play white G17
+play black E14
+play white S16
+play black S15
+play white T16
+play black T15
+play white P16
+play black Q15
+play white P15
+play black P14
+play white Q14
+play black R15
+play white O14
+play black P13
+play white S18
+play black O15
+play white D12
+play black Q18
+play white C7
+play black H15
+play white E13
+play black F3
+play white M14
+play black G4
+play white E6
+play black N15
+play white G5
+play black H4
+play white R18
+play black T18
+play white H5
+play black Q12
+play white J4
+play black R12
+play white P2
+play black F16
+play white C3
+play black B3
+play white C2
+play black A6
+play white H16
+play black F14
+play white J15
+play black G13
+play white K14
+play black N14
+play white M13
+play black H14
+play white D14
+play black G11
+play white F11
+81 reg_genmove black
+play black F12
+play white J13
+83 reg_genmove black
+play black E11
+play white Q11
+85 reg_genmove black
+play black F10
+play white P11
+87 reg_genmove black
+play black J11
+play white E9
+89 reg_genmove black
+play black C16
+play white F9
+91 reg_genmove black
+play black B2
+play white C1
+93 reg_genmove black
+play black H8
+play white H7
+95 reg_genmove black
+play black J5
+play white K5
+97 reg_genmove black
+play black J6
+play white J8
+99 reg_genmove black
+play black J7
+play white S13
+101 reg_genmove black
+play black G7
+play white H3
+103 reg_genmove black
+play black G3
+play white F6
+105 reg_genmove black
+play black H9
+play white K8
+107 reg_genmove black
+play black L7
+play white L8
+109 reg_genmove black
+play black M7
+play white B16
+111 reg_genmove black
+play black B15
+play white A16
+113 reg_genmove black
+play black M8
+play white J12
+115 reg_genmove black
+play black L9
+play white H6
+117 reg_genmove black
+play black G6
+play white F5
+119 reg_genmove black
+play black K6
+play white G8
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/great5-gnugo.gtp b/regression/benchmark/great5-gnugo.gtp
new file mode 100644 (file)
index 0000000..8736616
--- /dev/null
@@ -0,0 +1,201 @@
+# White: Great5
+# Black: GNU Go 3.3.5
+# Handicap: 0
+# Result: B+68.5
+# 2002-07-28
+
+boardsize 19
+clear_board
+komi 5.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black R16
+play white D16
+play black Q3
+play white D4
+play black F17
+play white R5
+play black R9
+play white P17
+play black Q15
+play white F16
+play black G16
+play white E17
+play black F15
+play white E16
+play black O16
+play white C11
+play black G17
+play white J3
+play black O17
+play white S3
+play black P18
+play white R7
+play black F13
+play white D13
+play black D7
+play white P5
+play black O4
+play white P8
+play black L17
+play white R11
+play black Q10
+play white O10
+play black P11
+play white S8
+play black S9
+play white M3
+play black N4
+play white C9
+play black F7
+play white G4
+play black N6
+play white N8
+play black L6
+play white L8
+play black P6
+play white O5
+play black Q5
+play white O6
+play black N5
+play white O7
+play black P4
+play white J7
+play black F9
+play white Q6
+play black H9
+play white R2
+play black P2
+play white P13
+play black J6
+play white R13
+play black H7
+play white O12
+play black K7
+play white K8
+play black J8
+play white Q18
+play black O18
+play white Q4
+play black L13
+play white K9
+play black C5
+play white B7
+play black C4
+play white C3
+play black D3
+play white D2
+play black E3
+play white E4
+play black F3
+play white C2
+play black G3
+play white F4
+play black H3
+play white H4
+play black H2
+play white E2
+play black J2
+play white K2
+play black K3
+play white K4
+play black L3
+play white L2
+play black F2
+play white L4
+play black F1
+play white J1
+play black C7
+play white H1
+play black B6
+play white J11
+play black B8
+play white C8
+play black B9
+play white J13
+play black B10
+play white L11
+play black B11
+play white C17
+play black H14
+play white K12
+play black C10
+play white D10
+play black D11
+play white E11
+play black D12
+play white C12
+play black E12
+play white B12
+play black A12
+play white E10
+121 reg_genmove black
+play black C13
+play white B13
+123 reg_genmove black
+play black C14
+play white A14
+125 reg_genmove black
+play black B15
+play white A15
+127 reg_genmove black
+play black F11
+play white B16
+129 reg_genmove black
+play black C15
+play white A13
+131 reg_genmove black
+play black F18
+play white A11
+133 reg_genmove black
+play black C19
+play white A10
+135 reg_genmove black
+play black D18
+play white E14
+137 reg_genmove black
+play black E15
+play white D15
+139 reg_genmove black
+play black D14
+play white C16
+141 reg_genmove black
+play black E13
+play white E18
+143 reg_genmove black
+play black E19
+play white J14
+145 reg_genmove black
+play black H15
+play white L15
+147 reg_genmove black
+play black M14
+play white B18
+149 reg_genmove black
+play black B19
+play white A18
+151 reg_genmove black
+play black L16
+play white M15
+153 reg_genmove black
+play black K15
+play white K14
+155 reg_genmove black
+play black L14
+play white N15
+157 reg_genmove black
+play black N14
+play white O15
+159 reg_genmove black
+play black O14
+play white P15
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/benchmark/manyfaces-gnugo.gtp b/regression/benchmark/manyfaces-gnugo.gtp
new file mode 100644 (file)
index 0000000..3bb2992
--- /dev/null
@@ -0,0 +1,241 @@
+# White: Many Faces of Go
+# Black: GNU Go 3.3.5
+# Handicap: 0
+# Result: W+53.5
+# 2002-07-27
+
+boardsize 19
+clear_board
+komi 5.5
+
+reset_connection_node_counter
+reset_owl_node_counter
+reset_reading_node_counter
+reset_trymove_counter
+
+play black R16
+play white D17
+play black Q3
+play white D3
+play black C5
+play white D7
+play black E5
+play white F4
+play black C15
+play white D13
+play black E15
+play white F16
+play black B14
+play white D10
+play black P16
+play white R5
+play black R9
+play white O4
+play black B17
+play white N5
+play black C12
+play white J17
+play black D12
+play white F7
+play black O2
+play white C3
+play black B6
+play white S3
+play black B4
+play white B3
+play black C8
+play white Q4
+play black N3
+play white K4
+play black P3
+play white F10
+play black C10
+play white M3
+play black R3
+play white S2
+play black M2
+play white Q1
+play black M4
+play white L3
+play black L5
+play white N4
+play black P1
+play white O3
+play black N1
+play white N2
+play black M1
+play white N17
+play black K2
+play white P18
+play black P4
+play white R2
+play black M5
+play white H4
+play black L7
+play white P5
+play black H2
+play white F2
+play black R4
+play white S4
+play black Q5
+play white Q6
+play black Q2
+play white Q4
+play black R1
+play white L2
+play black N3
+play white Q8
+play black L1
+play white N2
+play black J3
+play white N3
+play black J1
+play white R12
+play black R8
+play white P10
+play black S6
+play white S5
+play black R7
+play white R14
+play black O15
+play white Q7
+play black S11
+play white Q11
+play black S12
+play white S13
+play black T12
+play white R18
+play black N16
+play white F15
+play black O17
+play white O18
+play black J4
+play white M18
+play black K5
+play white J7
+play black L9
+play white J5
+play black L11
+play white F5
+play black M14
+play white O13
+play black N12
+play white M10
+play black H5
+play white J6
+play black O6
+play white N6
+play black L10
+play white G4
+play black M11
+play white N10
+play black J9
+play white S15
+play black S16
+play white T16
+play black J11
+play white M16
+play black M15
+play white H3
+play black K3
+play white F13
+play black O7
+play white N7
+play black L4
+play white H12
+play black T17
+play white L16
+play black C18
+play white D18
+play black O12
+play white O8
+play black P13
+play white E12
+play black A3
+play white A2
+play black A4
+play white B1
+play black D19
+play white E19
+play black C19
+play white E18
+play black K14
+play white C9
+play black B9
+play white D9
+play black B10
+play white E6
+play black E4
+play white D5
+play black D4
+play white C17
+play black B16
+play white T13
+play black R10
+play white C13
+161 reg_genmove black
+play black B13
+play white B18
+163 reg_genmove black
+play black A18
+play white B19
+165 reg_genmove black
+play black E3
+play white E2
+167 reg_genmove black
+play black S1
+play white T6
+169 reg_genmove black
+play black T7
+play white T5
+171 reg_genmove black
+play black D11
+play white C4
+173 reg_genmove black
+play black D6
+play white F3
+175 reg_genmove black
+play black D5
+play white C7
+177 reg_genmove black
+play black B8
+play white B7
+179 reg_genmove black
+play black A7
+play white C6
+181 reg_genmove black
+play black A5
+play white D8
+183 reg_genmove black
+play black E11
+play white J15
+185 reg_genmove black
+play black F11
+play white J13
+187 reg_genmove black
+play black K13
+play white A8
+189 reg_genmove black
+play black A9
+play white G11
+191 reg_genmove black
+play black F12
+play white E13
+193 reg_genmove black
+play black E14
+play white F14
+195 reg_genmove black
+play black J12
+play white T8
+197 reg_genmove black
+play black S7
+play white T10
+199 reg_genmove black
+play black S9
+play white Q9
+
+
+10000 get_reading_node_counter
+10001 get_owl_node_counter
+10002 get_connection_node_counter
+10003 get_trymove_counter
diff --git a/regression/blunder.tst b/regression/blunder.tst
new file mode 100644 (file)
index 0000000..f7e8f57
--- /dev/null
@@ -0,0 +1,173 @@
+# This test suite is a collection of blunders. By "blunder" we here
+# mean a move which is worse than passing. Also included are moves
+# which are okay but which GNU Go incorrectly rejects thinking that
+# they would be blunders.
+
+loadsgf games/blunder1.sgf
+1 reg_genmove black
+#? [!E5]
+
+loadsgf games/blunder2.sgf
+2 reg_genmove white
+#? [C9|H9]
+
+loadsgf games/blunder3.sgf 229
+3 reg_genmove black
+#? [!D6]
+
+loadsgf games/blunder4.sgf
+4 reg_genmove white
+#? [B5|C5|C4|D4|E4|E3|F3|A4|A5]
+
+# This is an "antiblunder". After black A4, white does not have any
+# kind of double threat at C6, which is a simple snapback.
+loadsgf games/blunder5.sgf
+5 reg_genmove black
+#? [A4]
+
+loadsgf games/blunder6.sgf 1
+6 reg_genmove white
+#? [D4]
+
+# A9 is a losing ko threat
+loadsgf games/blunder6.sgf 3
+7 reg_genmove white
+#? [E3]
+
+# Both A3 and A5 are blunders due to a spectacular atari-atari sequence.
+loadsgf games/blunder7.sgf
+8 reg_genmove black
+#? [!(A3|A5)]
+
+# After black D9, white cuts at G8 and gets a ko.
+loadsgf games/blunder8.sgf
+9 reg_genmove black
+#? [G8|G9|H8]
+
+# Clearly, black can't start with J9.
+loadsgf games/blunder9.sgf
+10 reg_genmove black
+#? [G9|F9|C7]
+
+# Black B3 loses at least five stones.
+loadsgf games/blunder10.sgf 1
+11 reg_genmove black
+#? [D4|E4|E5|F4|C6]
+
+# White D4 kills at least six stones.
+loadsgf games/blunder10.sgf 2
+12 reg_genmove white
+#? [D4]*
+13 reg_genmove black
+#? [D4|E4|E5|F4]
+
+loadsgf games/blunder11.sgf 42
+14 reg_genmove black
+#? [G4]
+
+loadsgf games/blunder11.sgf 44
+15 reg_genmove black
+#? [H3]
+
+loadsgf games/blunder12.sgf 252
+16 reg_genmove white
+#? [R5|Q5|R6|S6|S7|R7]
+
+loadsgf games/blunder12.sgf 258
+17 reg_genmove white
+#? [R7]*
+
+# A simplification of incident 136. Black E6 is a bad blunder.
+loadsgf games/blunder13.sgf
+18 reg_genmove black
+#? [F5]
+
+loadsgf games/blunder14.sgf
+19 reg_genmove white
+#? [P18|P19|R18|R19]
+
+# P11 got incorrectly rejected as a blunder.
+loadsgf games/handtalk/handtalk13.sgf 123
+20 reg_genmove black
+#? [P11]
+
+# L9 got incorrectly rejected as a blunder.
+loadsgf games/handtalk/handtalk13.sgf 131
+21 reg_genmove black
+#? [L9]
+
+# R18 is suicidal
+loadsgf games/blunder15.sgf
+22 reg_genmove black
+#? [!R18|R19]
+
+# Don't play an outer liberty and let white have a ko.
+loadsgf games/blunder16.sgf
+23 reg_genmove black
+#? [!F4|F5|F6]
+
+# Don't play the outer liberty and let white make seki.
+# See also connection:113 and reading:198.
+loadsgf games/blunder17.sgf
+24 reg_genmove black
+#? [!P5]*
+
+# Don't play an outer liberty and let white make seki or better.
+loadsgf games/blunder18.sgf
+25 reg_genmove black
+#? [!P9|M6|T9]
+
+# Don't play an outer liberty and let black make seki or better.
+loadsgf games/blunder19.sgf
+26 reg_genmove white
+#? [!D19|F17]
+
+# R3 lets black play T2 and get seki.
+loadsgf games/blunder20.sgf
+27 reg_genmove white
+#? [!R3]
+
+# C4 lets black make seki with B1. E1 is even worse.
+loadsgf games/blunder22.sgf 1
+28 reg_genmove white
+#? [!(C4|E1)]*
+
+# C1 gives a ko that white can't win. Pass gives life in seki. B3 dies
+# right out.
+loadsgf games/blunder22.sgf 5
+29 reg_genmove white
+#? [!(C1|B3)]
+
+# See also reading:197.
+loadsgf games/blunder23.sgf
+30 reg_genmove black
+#? [!O7]
+
+loadsgf games/atari_atari09.sgf
+31 reg_genmove black
+#? [!T14]
+
+# E3 and H4 are not blunders, however, H2 is.
+loadsgf games/nngs/gnugo-3.4-viking4-200308191053.sgf 283
+32 reg_genmove white
+#? [E3|H4]
+
+# This needs a detect_semeai_blunder().
+loadsgf games/kisei28_g7.sgf 280
+33 reg_genmove white
+#? [!H6|J1]
+
+# Fills a common liberty in a seki similar to blunder:32.
+loadsgf games/kgs/2004-04-28-R-dokuganryu-GnuGoCVS.sgf 302
+34 gg_genmove black
+#? [!A19|C19]
+
+# An example of transforming a won semeai into a seki
+loadsgf games/blunder24.sgf
+35 gg_genmove white
+#? [!G1]
+
+loadsgf games/blunder25.sgf
+36 restricted_genmove white H5 J4 H3 J3 H2 J2
+#? [J4|H3|J3|H2|J2]*
+
diff --git a/regression/break_in.tst b/regression/break_in.tst
new file mode 100644 (file)
index 0000000..996efab
--- /dev/null
@@ -0,0 +1,59 @@
+
+loadsgf games/trevor/auto/a038.sgf 34
+10 break_in D4 J5 A4 B4 J4 A3 B3 H3 J3 A2 B2 C2 D2 F2 G2 H2 J2 A1 B1 C1 D1 E1 F1 G1 H1 J1 
+#? [1 (F2|D2)]
+
+trymove white F2
+20 block_off D4 J5 A4 B4 J4 A3 B3 H3 J3 A2 B2 C2 D2 F2 G2 H2 J2 A1 B1 C1 D1 E1 F1 G1 H1 J1 
+#? [0]
+popgo
+
+loadsgf games/break_in.sgf
+30 break_in D7 F9 G9 H9 J9 F8 G8 H8 J8 G7 H7 J7 H6 J6 G5 H5 J5 H4 J4 G3 H3 J3 H2 J2 H1 J1 
+#? [G7|G5]
+
+40 reg_genmove black
+#? [G7|G5]
+
+loadsgf games/trevor/auto/a013.sgf 20
+trymove white C4
+50 break_in D5 B3 C3 E3 F3 G3 A2 B2 C2 D2 F2 H2 J2 A1 B1 C1 D1 E1 F1 G1 H1 J1 
+#? [1 (C3|E3)]
+popgo
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 164
+trymove black R14
+60 break_in M9 B19 C19 D19 E19 F19 G19 H19 J19 K19 L19 M19 N19 O19 P19 Q19 R19 S19 T19 A18 C18 D18 E18 F18 G18 H18 J18 K18 L18 M18 O18 Q18 R18 S18 B17 C17 D17 E17 F17 G17 H17 J17 L17 M17 R17 T17 E16 G16 H16 J16 L16 M16 R16 T16 E15 F15 H15 J15 K15 L15 R15 S15 T15 F14 G14 H14 J14 K14 S14 T14 H13 K13 L13 S13 T13 K12 L12 T12 J11 K11 
+#? [0]
+popgo
+
+loadsgf games/nngs/gnugo-3.1.27-Yuuki-200203132324.sgf 90
+trymove white S10
+70 break_in Q10 T19 T18 T17 S16 T16 P15 Q15 S15 T15 Q14 R14 S14 T14 P13 R13 S13 T13 O12 P12 Q12 R12 S12 T12 O11 P11 R11 S11 T11
+#? [0]
+popgo
+
+loadsgf games/gunnar/gunnar11.sgf
+80 break_in C14 K13 J12 K12 H11 J11 H10
+#? [0]
+
+loadsgf golois/Aya991113-11.sgf
+trymove black B3
+90 block_off F4 E8 F8 E7 D6 E6 D5
+#? [0]
+popgo
+
+# See trevora:370
+loadsgf games/trevor/auto/a021.sgf 16
+trymove white F6
+100 block_off D6 E9 F9 E8 F8 G8 H8 F7 G7 H7 G6 H6 G5 H5 G4 H4 G3 H3 
+#? [0]*
+popgo
+
+# See also century2002:150
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 157
+trymove black A18
+110 break_in E19 A16 B16 A15 B15 A14
+#? [0]
+popgo
+
diff --git a/regression/breakage2tst.py b/regression/breakage2tst.py
new file mode 100755 (executable)
index 0000000..38eaf3e
--- /dev/null
@@ -0,0 +1,203 @@
+#! /usr/bin/env python
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.        #
+#                                                               #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/ #
+# for more information.                                         #
+#                                                               #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006   #
+# by the Free Software Foundation.                              #
+#                                                               #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License   #
+# as published by the Free Software Foundation - version 3      #
+# or (at your option) any later version.                        #
+#                                                               #
+# This program is distributed in the hope that it will be       #
+# useful, but WITHOUT ANY WARRANTY; without even the implied    #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR       #
+# PURPOSE.  See the GNU General Public License in file COPYING  #
+# for more details.                                             #
+#                                                               #
+# You should have received a copy of the GNU General Public     #
+# License along with this program; if not, write to the Free    #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,   #
+# Boston, MA 02111, USA.                                        #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+import string
+import sys, getopt
+import re
+
+help_string = """
+Usage:
+breakage2tst.py [--pike] <BREAKAGE_FILE 
+       This creates a command line invoking regress.pike to run all tes
+       cases that appear as unexpected PASS or FAIL in BREAKAGE_FILE.
+breakage2tst.py [--pike] --update <BREAKAGE_FILE
+       This changes all .tst files so that the expected results match
+       the behaviour of the version that produced BREAKAGE_FILE.
+In both cases, it needs to be run from the regression test directory.
+"""
+
+# This prints out the list of tests from testfile in the format
+# <tstfile>:number
+def write_tests(tstfilename, tests):
+       for number, expected in tests:
+               print "%s:%d" % (tstfilename, number),
+
+
+def toggled_result(resultline, expected):
+       if (re.search(r"\]$", resultline)):
+               if (not expected == 0):
+                       print "Result line doesn't match 'unexpected FAIL':",
+                       print resultline
+                       sys.exit(2)
+               return (re.sub(r"\]$", "]*", resultline))
+       elif (re.search(r"\]\*$", resultline)):
+               if (not expected == 1):
+                       print "Result line doesn't match 'unexpected PASS':",
+                       print resultline
+                       sys.exit(2)
+               return (re.sub(r"\]\*$", "]", resultline))
+       else:
+               print "Couldn't parse alleged result line:", resultline
+               sys.exit(2)
+
+
+# This toggles the expected result in the .tst-file "tstfilename" for
+# all tests whose id is listed in "tests"
+def update_tstfile(tstfilename, tests):
+       if len(tests) == 0:
+               print tstfilename, "unchanged."
+               return
+       print "Updating", tstfilename
+       tstfile = open(tstfilename, 'r')
+       tstlines = tstfile.readlines()
+       tstfile.close
+       new_tstfile = ''
+
+       for number, expected in tests:
+               current_line = tstlines.pop(0)
+               command_pattern = re.compile("^%d " % number)
+
+               # Look for the line containing the command with matching id,
+               # while keeping recent commands and comments
+               while (not command_pattern.match(current_line)):
+                       new_tstfile = new_tstfile + current_line
+                       current_line = tstlines.pop(0)
+
+               # Found match. Now look for the result line:
+               while (not re.match(r"^#\?", current_line)):
+                       new_tstfile = new_tstfile + current_line
+                       current_line = tstlines.pop(0)
+
+               new_tstfile = new_tstfile + toggled_result(current_line,
+                                                          expected)
+               
+       # Now copy the rest of the file without change. 
+       new_tstfile = new_tstfile + string.join(tstlines, '')
+                               
+       tstfile = open(tstfilename, 'w')
+       tstfile.write(new_tstfile)
+       tstfile.close
+
+def parse_input(do_work):
+       tests = []
+       filename = ''
+       while 1:
+               try:
+                       inputline = raw_input()
+               except EOFError:
+                       do_work(filename, tests)
+                       break
+               else:
+                       s = string.split(inputline)
+                       if len(s) == 0:
+                               continue
+                       if (re.search(r"regress\.sh", s[0])
+                           or re.search(r"eval\.sh", s[0])):
+                               if (filename != ''):
+                                       do_work(filename, tests)
+                               filename = re.search(r"[^\s]+\.tst", inputline).group()
+                               tests = []
+                       elif (re.search("PASS", string.join(s[1:3]))):
+                               tests.append([int(s[0]), 1])
+                       elif (re.search("FAIL", string.join(s[1:3]))):
+                               tests.append([int(s[0]), 0])
+
+def parse_pike_input(do_work):
+       tests = []
+       filename = ''
+       while 1:
+               try:
+                       inputline = raw_input()
+               except EOFError:
+                       if (filename != ''):
+                               do_work(filename, tests)
+                       break
+               else:
+                       s = string.split(inputline)
+                       if (not re.search(r"\:", s[0])):
+                               continue
+                       new_filename = re.search(r"[^:]+", s[0]).group() \
+                                      + ".tst"
+                       if (filename != new_filename):
+                               if (filename != ''):
+                                       do_work(filename, tests)
+                               filename = new_filename
+                               tests = []
+                       number = int(re.search(r"[\d]+$", s[0]).group())
+                       if (s[1] == "PASS"):
+                               tests.append([number, 1])
+                       elif (s[1] == "FAIL"):
+                               tests.append([number, 0])
+                       else:
+                               print "Inconsistent input line:", inputline
+                               sys.exit(2)
+
+
+def main():
+       mode = 0
+       pike = 0
+       try:
+               opts, args = getopt.getopt(sys.argv[1:], "",
+                                          ["update", "help", "pike"])
+       except getopt.GetoptError:
+               print "breakage2tst: Unrecognized option."
+               print help_string
+               sys.exit(2)
+       if (args != []):
+               print "I know nothing about arguments", args
+               print help_string
+               sys.exit(2)
+
+       for o, a in opts:       
+               if (o == "--help"):
+                       print help_string
+                       sys.exit()
+               if (o == "--update"):
+                       mode = 1
+               if (o == "--pike"):
+                       pike = 1
+       
+       if (mode == 0):
+               print "./regress.pike ",
+               do_work = write_tests
+       else:
+               do_work = update_tstfile
+
+
+       if (pike):
+               parse_pike_input(do_work)
+       else:
+               parse_input(do_work)
+
+       if (mode == 0):
+               print
+       else:
+               print "Done."
+
+
+main()
diff --git a/regression/buzco.tst b/regression/buzco.tst
new file mode 100644 (file)
index 0000000..af5d074
--- /dev/null
@@ -0,0 +1,38 @@
+# NNGS game of GNU Go 3.1.8 on October 1, 2001
+
+loadsgf games/buzco1.sgf 12
+1 reg_genmove black
+#? [P2]
+
+loadsgf games/buzco1.sgf 20
+2 reg_genmove black
+#? [N3]*
+
+loadsgf games/buzco1.sgf 28
+3 reg_genmove black
+#? [F16|D18]
+
+loadsgf games/buzco1.sgf 36
+4 reg_genmove black
+#? [D13]*
+
+loadsgf games/buzco1.sgf 70
+5 reg_genmove black
+#? [C10|C11|E9|A4|F10]
+
+loadsgf games/buzco1.sgf 82
+# tm - A12 is not unthinkable. (3.1.15)
+# tm - F9 & F10 also OK. (3.1.20)
+6 reg_genmove black
+#? [E8|E9|A12|F9|F10]
+
+loadsgf games/buzco1.sgf 94
+7 reg_genmove black
+#? [!B7]
+
+loadsgf games/buzco1.sgf 108
+8 reg_genmove black
+#? [!N11]
+
+
+
diff --git a/regression/capture.tst b/regression/capture.tst
new file mode 100644 (file)
index 0000000..3d75681
--- /dev/null
@@ -0,0 +1,84 @@
+loadsgf golois/Goemate990902-15.sgf
+1 defend S10
+#? [1 T7]
+
+loadsgf golois/Goemate990902-5.sgf
+2 defend J2
+#? [1 M1]
+
+loadsgf golois/Goemate990904-4.sgf
+3 defend Q15
+#? [0]
+
+# This problem is much harder than it may look. After black H5, white
+# can force with the sequence W E1, B F2, W H2, B J2, W H3, B J3.
+# After that, white plays H6 and black has to work hard to stop escape. /gf
+# Changed point of attack to H6, which looks correct. /db
+loadsgf golois/Goemate991109-1.sgf
+4 attack G5
+#? [1 H6]*
+
+# It looks as if the originally recommended solution [1 S3] is wrong.
+# After W:S3 B:S2 W:T2 B:S1 W:O1 B:S5 black wins the semeai. /db
+loadsgf golois/Handtalk980821-2.sgf
+5 attack R4
+#? [1 S3]*
+
+loadsgf golois/Handtalk980821-2.sgf
+6 attack O2
+#? [1 (O3|N2|P1|S3|O1|S2)]
+
+loadsgf golois/Handtalk980821-2.sgf
+7 defend R3
+#? [1 (S3|O3|N2|P1|O1|S2)]
+
+loadsgf golois/Handtalk980824-1.sgf
+8 defend K5
+#? [0]*
+
+loadsgf golois/Handtalk980826-1.sgf
+9 defend B4
+#? [0]
+
+# P11 seems to be an effective tactical defense too, albeit making
+# things much more difficult. /gf
+loadsgf golois/Jimmy990711-2.sgf
+10 defend P10
+#? [1 O11]*
+
+loadsgf golois/knippel.sgf
+11 defend C8
+#? [0]
+
+loadsgf golois/ko990604.sgf
+12 defend B3
+#? [0]
+
+loadsgf golois/Prendre990424-1.sgf
+13 attack C8
+#? [1 D8]*
+
+loadsgf golois/Prendre990430-1.sgf
+14 defend H7
+#? [0]
+
+loadsgf golois/Prendre990502-1.sgf
+15 defend G4
+#? [0]
+
+loadsgf golois/Prendre990630-1.sgf
+16 defend B12
+#? [1 (A12|A15|B17|B18|A17|A18)]
+
+loadsgf golois/test.sgf
+17 attack G7
+#? [1 G6]
+
+# This test case originally said "defend G5", which must be an error.
+# Changed it to defend the weak stone at F5 instead. /gf
+# F6 works to defend F3 -trevor
+loadsgf golois/web000103.sgf
+18 defend F5
+#? [1 F6]
+
+
diff --git a/regression/century2002.tst b/regression/century2002.tst
new file mode 100644 (file)
index 0000000..c1f6993
--- /dev/null
@@ -0,0 +1,136 @@
+loadsgf games/century21-2002/golois-gnugo.sgf 35
+10 reg_genmove black
+#? [R15]
+
+loadsgf games/century21-2002/golois-gnugo.sgf 69
+20 reg_genmove black
+#? [!A6]
+
+# same bug as nngs2:160
+loadsgf games/century21-2002/golois-gnugo.sgf 183
+30 reg_genmove black
+#? [D15|C15]
+
+# B15 and D13 are both locally better. C13 fills a dame.
+loadsgf games/century21-2002/golois-gnugo.sgf 239
+35 restricted_genmove black B15 D13 C13
+#? [B15|D13]
+
+loadsgf games/century21-2002/goint-gnugo.sgf 37
+40 reg_genmove black 
+#? [J3]
+
+loadsgf games/century21-2002/goint-gnugo.sgf 47
+50 reg_genmove black 
+#? [F7]*
+
+loadsgf games/century21-2002/goint-gnugo.sgf 55
+55 reg_genmove black 
+#? [F7]*
+
+loadsgf games/century21-2002/goint-gnugo.sgf 111
+60 reg_genmove black 
+#? [Q14]*
+
+loadsgf games/century21-2002/goint-gnugo.sgf 119
+70 reg_genmove black 
+#? [J11|K11]*
+
+loadsgf games/century21-2002/goint-gnugo.sgf 161
+80 owl_attack D17
+#? [1 C17]
+
+# White can make seki in the upper left corner and preventing that is
+# the largest move on the board. B17 is the most natural move and the
+# one leaving the least aji. Except for the upper left corner, N9 is
+# the biggest move.
+loadsgf games/century21-2002/goint-gnugo.sgf 209
+85 reg_genmove black 
+#? [B17]*
+86 restricted_genmove black N9 T15 A13 Q7 Q6 N10 N8 L13 G19 G15
+#? [N9]
+
+# A17 and A18 produce 10,000 year ko. But A17 is better
+# since B has the option of making seki. B19 is equivalent
+# to A18 since white gets the choice of ko.
+loadsgf games/century21-2002/goint-gnugo.sgf 237
+90 reg_genmove black
+#? [A17]*
+
+# A19 is horrible, dying in gote. Before that white couldn't kill without ko.
+loadsgf games/century21-2002/goint-gnugo.sgf 247
+95 reg_genmove black
+#? [!A19]
+
+# locally B7 is better
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 27
+100 reg_genmove black
+#? [!B6]
+
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 29
+110 reg_genmove black
+#? [C8]*
+
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 43
+120 reg_genmove black
+#? [L3]
+
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 45
+130 reg_genmove black
+#? [N4]
+
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 57
+140 reg_genmove black
+#? [J3|R4|P5]
+
+# B18 is better than A18 by leaving one less ko threat behind. At
+# this time we accept both moves.
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 157
+150 reg_genmove black
+#? [B18]
+
+# avoid shortage of liberties
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 177
+160 reg_genmove black
+#? [B7]
+
+# Does not work because of white J8.
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 235
+170 owl_does_defend K10 H8
+#? [0]*
+
+# prevent the seki
+loadsgf games/century21-2002/manyfaces-gnugo.sgf 253
+180 reg_genmove black
+#? [T9]
+
+loadsgf games/century21-2002/gnugo-katsunari.sgf 26
+190 reg_genmove white
+#? [D3]*
+
+loadsgf games/century21-2002/gnugo-katsunari.sgf 36
+200 reg_genmove white
+#? [F6]
+
+loadsgf games/century21-2002/gnugo-katsunari.sgf 58
+210 restricted_genmove white A15 C16
+#? [C16]
+
+# a move in the center is bigger than this monkey jump
+loadsgf games/century21-2002/gnugo-katsunari.sgf 76
+220 reg_genmove white
+#? [!T3]
+
+loadsgf games/century21-2002/gnugo-katsunari.sgf 96
+240 reg_genmove white
+#? [F18]*
+
+loadsgf games/century21-2002/gnugo-katsunari.sgf 156
+260 reg_genmove white
+#? [S12|Q12|Q13]
+261 owl_defend J12
+#? [0]
+
+loadsgf games/century21-2002/gnugo-katsunari.sgf 202
+270 reg_genmove white
+#? [O7]
diff --git a/regression/cgf2004.tst b/regression/cgf2004.tst
new file mode 100644 (file)
index 0000000..651fa7b
--- /dev/null
@@ -0,0 +1,35 @@
+# Tests from the tournament at the CGF special meeting January 2004.
+
+loadsgf games/cgf2004/aya.sgf 28
+10 reg_genmove white
+#? [R15]*
+
+loadsgf games/cgf2004/aya.sgf 44
+20 reg_genmove white
+#? [Q4]*
+
+# This is urgent!
+loadsgf games/cgf2004/aya.sgf 48
+30 reg_genmove white
+#? [P7|R6]*
+
+loadsgf games/cgf2004/aya.sgf 112
+40 reg_genmove white
+#? [L6|L5|M7|M6|M5|N6|N5|N4|O5|O4|Q12]*
+
+loadsgf games/cgf2004/aya.sgf 118
+50 reg_genmove white
+#? [G19]
+
+loadsgf games/cgf2004/aya.sgf 134
+60 reg_genmove white
+#? [N4]*
+
+loadsgf games/cgf2004/aya.sgf 162
+70 reg_genmove white
+#? [N4]*
+
+# The big white dragon can be saved.
+loadsgf games/cgf2004/aya.sgf 188
+80 reg_genmove white
+#? [Q12|O15]*
diff --git a/regression/connect.tst b/regression/connect.tst
new file mode 100644 (file)
index 0000000..1edf1a7
--- /dev/null
@@ -0,0 +1,345 @@
+loadsgf golois/Aya991113-1.sgf
+1 connect Q7 Q4
+#? [1 Q6]
+
+loadsgf golois/Basique990715-1.sgf
+2 disconnect K17 G17
+#? [0]
+
+loadsgf golois/Basique990715-1.sgf
+3 disconnect D3 C5
+#? [0]
+
+loadsgf golois/Basique990715-1.sgf
+4 disconnect Q3 Q5
+#? [0]
+
+loadsgf golois/Connecter990424-1.sgf
+5 disconnect E7 C7
+#? [0]
+
+loadsgf golois/Connecter990424-2.sgf
+6 disconnect C7 B5
+#? [0]
+
+loadsgf golois/Connecter990426-1.sgf
+7 disconnect G6 G8
+#? [0]
+
+loadsgf golois/Connecter990426-2.sgf
+8 disconnect G6 G8
+#? [0]
+
+loadsgf golois/Connecter990427-1.sgf
+9 disconnect G6 E5
+#? [0]
+
+# Added A7, A5, B7, and C6. /gf
+loadsgf golois/Connecter990428-1.sgf
+10 disconnect B5 B8
+#? [1 (A6|A7|A5|B7|C6)]
+
+# A6 also works. /gf
+loadsgf golois/Connecter990428-1.sgf
+11 connect B5 B8
+#? [1 (B7|A6)]
+
+loadsgf golois/Connecter990430-1.sgf
+12 disconnect H7 F7
+#? [0]
+
+loadsgf golois/Connecter990430-2.sgf
+13 connect C1 J4
+#? [1 B1]
+
+loadsgf golois/Connecter990430-3.sgf
+14 connect E5 J7
+#? [1 F5]
+
+loadsgf golois/Connecter990501-1.sgf
+15 connect C5 C7
+#? [1 B7]*
+
+loadsgf golois/Connecter990502-1.sgf
+16 connect G7 D6
+#? [1 D5]
+
+loadsgf golois/connecter990614-1.sgf
+17 disconnect N10 N12
+#? [1 N11]
+
+loadsgf golois/connecter990614-1.sgf
+18 disconnect Q14 N10
+#? [1 N11]
+
+# Added O12 and P11. /gf
+loadsgf golois/connecter990614-2.sgf
+19 connect O11 O13
+#? [1 (P13|O12|P11)]
+
+loadsgf golois/Connecter990621-1.sgf
+20 connect O11 P12
+#? [1 O12]
+
+loadsgf golois/Connecter990621-1.sgf
+21 connect N12 P12
+#? [1 O12]
+
+# Q10 also works, although K12 is lost in the process. /gf
+loadsgf golois/Connecter990621-1.sgf
+22 connect Q9 P12
+#? [1 (O12|Q10)]
+
+loadsgf golois/Connecter990628-1.sgf
+23 connect L6 N6
+#? [1 (M7|N5)]
+
+loadsgf golois/Connecter990628-2.sgf
+24 disconnect G15 F17
+#? [0]
+
+loadsgf golois/Connecter990628-2.sgf
+25 connect E2 J3
+#? [1 G1]
+
+# Added D3. /gf
+loadsgf golois/Connecter990630-1.sgf
+26 connect F2 D2
+#? [1 (F1|D3)]
+
+loadsgf golois/Goemate990902-11.sgf
+27 disconnect L13 K15
+#? [0]
+
+# G7 allows white to make two eyes, but it does disconnect. /gf
+loadsgf golois/Goemate990902-3.sgf
+28 disconnect J6 G6
+#? [1 (J7|G7)]
+
+loadsgf golois/Goemate990902-7.sgf
+29 disconnect P8 Q11
+#? [0]
+
+loadsgf golois/Goemate990903-1.sgf
+30 disconnect J9 H12
+#? [0]*
+
+# Lots of moves work here, probably even more than those added. /gf
+loadsgf golois/Goemate990903-3.sgf
+31 connect N10 K11
+#? [1 (L10|L11|M11|M10|K10)]
+
+loadsgf golois/Goemate990903-4.sgf
+32 disconnect R12 Q14
+#? [0]
+
+# F14 is of course the real cutting point, but technically the
+# moves (threatening) to capture either string are also effective. /gf
+loadsgf golois/Goemate990904-3.sgf
+33 disconnect J11 E10
+#? [1 (F14|J10|E11|D11|C11)]
+
+loadsgf golois/Goemate990906-1.sgf
+34 connect S7 Q7
+#? [1 R7]
+
+loadsgf golois/Goemate990906-2.sgf
+35 disconnect N14 M15
+#? [0]*
+
+loadsgf golois/Goemate990908-2.sgf
+36 disconnect C14 C17
+#? [0]
+
+loadsgf golois/Goemate990908-2.sgf
+37 disconnect F3 C3
+#? [0]
+
+loadsgf golois/Goemate990911-1.sgf
+38 connect J11 F9
+#? [1 G11]
+
+loadsgf golois/Goemate991106-2.sgf
+39 connect F15 H13
+#? [1 (F14|G15|H14)]
+
+loadsgf golois/Goemate991106-2.sgf
+40 disconnect G14 D16
+#? [0]
+
+loadsgf golois/Goemate991106-2.sgf
+41 disconnect H15 F15
+#? [1 G15]
+
+loadsgf golois/Goemate991106-4.sgf
+42 disconnect N16 L15
+#? [1 M15]
+
+loadsgf golois/Goemate991109-3.sgf
+43 disconnect L5 K6
+#? [1 H2]
+
+# Added G17 and G18. /gf
+loadsgf golois/Goemate991218-1.sgf
+44 connect H17 F17
+#? [1 (H18|G17|G18)]
+
+loadsgf golois/Goemate991218-1.sgf
+45 disconnect H17 F17
+#? [1 G17]
+
+# A7 is also okay. /gf
+loadsgf golois/GoMaster991113-3.sgf
+46 disconnect C5 B8
+#? [1 (B4|A7)]
+
+loadsgf golois/Handtalk980802.sgf
+47 disconnect J4 K3
+#? [0]
+
+loadsgf golois/Handtalk980803-2.sgf
+48 disconnect F13 H12
+#? [0]
+
+loadsgf golois/Handtalk980803-2.sgf
+49 disconnect B14 D14
+#? [1 C13]
+
+loadsgf golois/Handtalk980819-1.sgf
+50 disconnect J5 H4
+#? [1 H5]
+
+# Added O14 and P14. /gf
+loadsgf golois/Handtalk980820-1.sgf
+51 disconnect P16 Q15
+#? [1 (O15|O14|P14)]
+
+# Added B15. /gf
+loadsgf golois/Handtalk980820-2.sgf
+52 disconnect C12 B14
+#? [1 (C13|B15)]
+
+loadsgf golois/Handtalk980820-6.sgf
+53 disconnect M12 M15
+#? [0]
+
+loadsgf golois/Handtalk980821-1.sgf
+54 disconnect Q17 Q15
+#? [0]
+
+loadsgf golois/Handtalk980821-1.sgf
+55 disconnect D3 D5
+#? [0]
+
+loadsgf golois/Handtalk980822-3.sgf
+56 disconnect P3 R4
+#? [0]
+
+# This one is hard to read out. I'm not convinced that D5 works, but
+# if it does, then C6 is also okay. Added C6. /gf
+loadsgf golois/Handtalk980828-2.sgf
+57 disconnect C4 D7
+#? [1 (D5|C6)]*
+
+# Added B13, C13, and C11. /gf
+loadsgf golois/Handtalk980828-3.sgf
+58 disconnect B11 C14
+#? [1 (B12|B13|C13|C11)]
+
+loadsgf golois/Indigo20000718-3.sgf
+59 connect O10 N9
+#? [1 N10]
+
+loadsgf golois/Indigo20000718-3.sgf
+60 connect G17 F15
+#? [1 (G16|F16|G15|H15|H16)]
+
+loadsgf golois/Indigo991107-1.sgf
+61 disconnect P4 P8
+#? [1 P5]
+
+loadsgf golois/Indigo-Golois-991105-1.sgf
+62 connect G9 G7
+#? [1 G8]
+
+loadsgf golois/Indigo-Golois-991105-1.sgf
+63 connect G9 K7
+#? [1 G8]
+
+loadsgf golois/Indigo-Golois-991105-1.sgf
+64 connect G9 M3
+#? [1 G8]
+
+loadsgf golois/Indigo-Golois-991105-1.sgf
+65 connect G7 D15
+#? [1 G8]
+
+# Added L3, M2, M1, and L1. /gf
+loadsgf golois/Indigo-Golois-991105-2.sgf
+66 disconnect N2 K2
+#? [1 (K1|L3|M2|M1|L1)]
+
+loadsgf golois/Indigo-Golois-991106-1.sgf
+67 disconnect N12 N14
+#? [0]
+
+# The ladder works, so F11 is also okay.
+loadsgf golois/Indigo-Golois-991106-2.sgf
+68 connect F8 F12
+#? [1 (E11|F11|E9)]
+
+# The ladder works, so F11 is also okay.
+loadsgf golois/Indigo-Golois-991106-2.sgf
+69 connect F8 D11
+#? [1 (E11|F11)]
+
+loadsgf golois/Indigo-Golois-991106-3.sgf
+70 disconnect P3 M3
+#? [0]
+
+# gf Added Q3. /gf
+loadsgf golois/Indigo-Golois-991106-3.sgf
+71 connect R3 P3
+#? [1 (P4|Q3)]
+
+loadsgf golois/Jimmy990711-2.sgf
+72 disconnect R12 Q13
+#? [1 O11]*
+
+loadsgf golois/Jimmy990711-4.sgf
+73 disconnect N13 M15
+#? [0]
+
+loadsgf golois/Jimmy990904-2.sgf
+74 disconnect R17 P17
+#? [1 Q17]
+
+loadsgf golois/Jimmy990904-3.sgf
+75 connect R17 P17
+#? [1 R18]
+
+# Added G4 and F3. /gf
+loadsgf golois/Neurogo97-1.sgf
+76 connect H2 H4
+#? [1 (J3|G4|F3)]
+
+# Added J3 and J4. /gf
+loadsgf golois/Neurogo97-1.sgf
+77 disconnect H2 H4
+#? [1 (J2|J3|J4)]
+
+loadsgf golois/Neurogo97-3.sgf
+78 disconnect E3 C3
+#? [0]*
+
+loadsgf golois/test.sgf
+79 connect H7 G8
+#? [1 G6]
+
+loadsgf golois/test_prendre.sgf
+80 connect Q18 R17
+#? [1 S18]
+
+loadsgf golois/Vivre990710-1.sgf
+81 disconnect S12 R11
+#? [0]
diff --git a/regression/connection.tst b/regression/connection.tst
new file mode 100644 (file)
index 0000000..4a04540
--- /dev/null
@@ -0,0 +1,465 @@
+# See also test 87.
+loadsgf games/connection1.sgf
+1 same_dragon G17 K17
+#? [0]
+2 same_dragon R12 R9
+#? [0]
+
+loadsgf games/strategy11.sgf 87
+3 same_dragon A6 B4
+#? [0]
+
+loadsgf games/incident104.sgf 63
+4 same_dragon C14 E14
+#? [0]
+
+loadsgf games/strategy13.sgf
+5 same_dragon S11 R12
+#? [0]
+
+# incident 213
+loadsgf games/incident211.sgf 40
+6 same_dragon G8 J6
+#? [0]
+
+loadsgf games/strategy21.sgf 86
+7 same_dragon F4 J3
+#? [0]
+
+loadsgf games/owl19.sgf
+# A problem with rot2 rotated owl tests 128 and 129 reduces to
+# this dragon amalgamation problem.
+8 same_dragon A15 C16
+#? [1]
+9 same_dragon P19 Q17
+#? [1]
+
+# This definitely requires dynamic connection reading.
+loadsgf games/incident240.sgf 69
+10 same_dragon C10 E9
+#? [0]
+
+loadsgf games/connection2.sgf 177
+11 same_dragon G6 J7
+#? [0]
+12 same_dragon G8 J7
+#? [0]
+
+loadsgf games/strategy29.sgf 204
+13 same_dragon O6 Q8
+#? [0]
+14 same_dragon O6 R6
+#? [0]
+
+loadsgf games/strategy33.sgf 159
+15 same_dragon G7 F9
+#? [0]
+
+loadsgf games/doublecut.sgf
+16 same_dragon E16 G14
+#? [0]
+
+loadsgf games/doublecut2.sgf 151
+17 same_dragon D13 F12
+#? [0]
+
+loadsgf games/arion.sgf 63
+18 same_dragon N17 P17
+#? [1]
+
+loadsgf games/dublin1.sgf 72
+19 same_dragon B15 E16
+#? [0]
+
+loadsgf games/nicklas/nicklas12.sgf 69
+20 connect K17 N17
+#? [1 K18]*
+
+loadsgf games/trevor/trevor_09.sgf
+21 connect D4 G5
+#? [1 (E5|D5|C5|C6|E6|C7|D7|E7)]
+22 disconnect D4 G5
+#? [1 (E5|D5|E6|F6)]
+
+loadsgf games/incident169.sgf 110
+23 connect K17 N16
+#? [1 (M17|L16)]
+24 disconnect L15 L17
+#? [1 (M17|L16)]
+25 disconnect L14 M12
+#? [1 L13]
+
+loadsgf games/nicklas/nicklas16.sgf 38
+26 connect C3 C6
+#? [1 B4]
+27 connect C3 B7
+#? [1 B4]
+
+loadsgf games/golife.sgf 38
+28 disconnect H5 H7
+#? [0]
+
+loadsgf games/incident240.sgf 69
+29 disconnect B12 F7
+#? [1 D9]*
+
+loadsgf games/strategy13.sgf
+30 connect R13 S8
+#? [1 (Q11|T10|T9)]
+31 disconnect R13 S8
+#? [1 Q9]
+
+loadsgf games/incident240.sgf 69
+32 disconnect B12 E9
+#? [1 D9]
+
+# White can't cut unconditionally but black has to make the first ko threat.
+loadsgf games/trevor/auto/a035.sgf 28
+33 disconnect B4 C6
+#? [2 B5]*
+
+# Monkey jumps and relatives.
+loadsgf games/connection3.sgf
+34 disconnect B11 A9
+#? [0]
+35 disconnect L12 H13
+#? [0]
+36 connect M3 N7
+#? [1 (N4|M4|N5|N6)]
+37 disconnect M3 N7
+#? [1 (N4|M4|N5|M5|M6|N6)]
+38 connect B2 G1
+#? [1 E1]*
+39 disconnect B2 G1
+#? [1 (F2|F1|E2|E1|D2|D1|C2|C1|G2|H1|B1)]
+
+# More monkey jumps and relatives.
+loadsgf games/connection4.sgf
+40 connect B11 A8
+#? [1 B9]
+41 disconnect B11 A8
+#? [1 (B9|A10|B10|B8|A7)]
+42 connect L12 H13
+#? [1 K12]
+43 disconnect L12 H13
+#? [1 (K12|J12|J13|H12|G13)]
+44 connect M3 N7
+#? [0]
+45 disconnect M3 N7
+#? [1 (N4|M4|N5|M5|M6|M7|N8|M8)]
+46 connect B2 G1
+#? [1 (B1|C1|C2|D2|E1|F1)]
+47 disconnect B2 G1
+#? [1 (C1|E1)]
+
+loadsgf games/trevor/auto/a038.sgf 34
+48 disconnect C3 G3
+#? [1 (D2|F2)]
+
+loadsgf games/trevor/trevor_15.sgf 
+49 disconnect D7 G6
+#? [1 (E7|G7)]
+
+loadsgf games/trevor/auto/a014.sgf 16
+50 disconnect B5 C2
+#? [1 B4]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 108
+51 connect R14 Q16
+#? [1 Q15]
+52 connect R14 O15
+#? [1 Q15]*
+53 connect S7 S4
+#? [1 T5]
+
+# D8 might also disconnect.
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 164
+54 disconnect B6 D10
+#? [1 C8]*
+55 connect B6 D10
+#? [1 (D8|C8)]*
+56 connect B6 F9
+#? [1 D8]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 192
+57 connect K14 K16
+#? [1 L16]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 204
+58 disconnect D18 F17
+#? [0]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 216
+59 disconnect D18 E15
+#? [1 (D15|F15|B15|D19|E19)]
+60 connect D14 B18
+#? [1 (B14|D15|F15|B15|D19|E19|C13)]
+61 connect O9 Q9
+#? [1 (D15|F15|B15|D19|E19)]*
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 238
+62 connect S18 S14
+#? [1 (T15|T17)]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 258
+63 connect N13 N17
+#? [1 (N16|O17|P16)]
+
+loadsgf games/trevor/auto/b72.sgf 30
+64 disconnect G11 K11
+#? [1 H11]
+65 same_dragon G11 K11
+#? [0]
+
+loadsgf games/trevor/auto/b67.sgf 58
+66 disconnect M6 L3
+#? [1 (M5|M3)]
+67 connect M6 L3
+#? [1 (M3|M2|M5)]
+68 disconnect M6 L1
+#? [1 (M5|M3|M2|M1)]
+69 connect M6 L1
+#? [1 (M2|M3)]
+70 same_dragon M6 L3
+#? [0]
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 52
+71 connect D3 G3
+#? [1 (F3|H3|E3|G2|F2|H2|E2)]
+72 disconnect D3 G3
+#? [1 F3]
+73 connect D3 J2
+#? [1 (F3|H3|E3|G2|F2|H2|E2)]
+74 disconnect D3 J2
+#? [1 F3]
+75 same_dragon D3 G3
+#? [0]
+
+loadsgf games/trevor/auto/b20.sgf 38
+76 connect D2 G2
+#? [1 (E3|F1|F2)]
+77 disconnect D2 G2
+#? [1 (F2|F1)]
+78 same_dragon D2 G2
+#? [0]
+
+loadsgf games/nngs/gnugo-3.1.34-viking4-200204240801.sgf 134
+79 connect S4 R7
+#? [1 S6]
+80 connect R2 R7
+#? [1 S6]
+
+loadsgf games/handtalk/handtalk13.sgf 106
+81 connect L5 R5
+#? [1 O5]*
+
+loadsgf games/handtalk/handtalk13.sgf 116
+82 same_dragon M7 M10
+#? [0]*
+
+loadsgf games/handtalk/handtalk23.sgf 80
+83 same_dragon K3 L5
+#? [0]
+84 same_dragon H6 L5
+#? [0]
+
+loadsgf games/handtalk/handtalk23.sgf 82
+85 same_dragon K3 G3
+#? [0]
+86 same_dragon K3 M3
+#? [0]
+
+# See also test 2. Possibly some more move works.
+loadsgf games/connection1.sgf
+87 disconnect R12 R9
+#? [1 S10]
+
+# See also trevorb:670.
+loadsgf games/trevor/auto/b64.sgf 44
+88 disconnect E6 H5
+#? [0]
+
+loadsgf games/ego.sgf 191
+89 same_dragon M12 Q11
+#? [1]
+
+loadsgf games/trevor/auto/b13.sgf 48
+90 same_dragon D4 F4
+#? [0]
+
+loadsgf games/trevor/auto/c18.sgf 82
+91 same_dragon J8 J10
+#? [1]
+
+loadsgf games/olympiad2002/game1-19-goint-gnugo-1-0.sgf 91
+92 same_dragon P15 Q14
+#? [1]
+
+# See also nngs2:130
+loadsgf games/nngs/joshj-gnugo-3.3.2-200205310709.sgf 124
+93 disconnect K2 L3
+#? [3 L2]
+
+# See also nngs2:520
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 193
+94 disconnect D8 E10
+#? [1 D9]
+
+loadsgf games/reading39.sgf
+95 disconnect O4 P3
+#? [1 (N1|N2)]
+
+loadsgf games/handtalk/handtalk1.sgf 31
+96 same_dragon C16 C13
+#? [0]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 201
+97 disconnect P8 O9
+#? [1 O5]
+
+loadsgf games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf 185
+98 disconnect N4 Q6
+#? [1 O5]
+
+loadsgf games/gunnar/gunnar3.sgf 74
+99 disconnect N3 P3
+#? [0]*
+
+loadsgf games/nngs/gnugo-3.3.10-jimm-200210222018.sgf 140
+100 disconnect L12 M13
+#? [(2|3) J15]*
+
+loadsgf games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf 232
+101 disconnect O3 L5
+#? [1 (M3|N3)]*
+
+loadsgf games/nngs/gnugo-3.3.17-joshj-200304172202.sgf 222
+102 disconnect Q8 Q6
+#? [1 (S7|S6|S8|R6)]*
+
+# See also owl:114
+loadsgf games/incident169.sgf 210
+103 connect L2 G4
+#? [1 K2]
+
+loadsgf golois/Aya991113-9.sgf
+104 connect G2 L4
+#? [1 (H2|H1|G1|J1|H3)]
+
+# See also nicklas1:501
+# Strictly speaking, this is ko. But this is way beyond the readconnect
+# horizon.
+loadsgf games/nicklas/nicklas5.sgf 23
+105 disconnect F8 G6
+#? [1 G7]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 164
+trymove black R14
+trymove white P16
+106 disconnect O14 O17
+#? [1 O16]*
+popgo
+popgo
+
+loadsgf games/gunnar/gunnar11.sgf
+107 connect C14 H12
+#? [0]
+
+loadsgf games/nngs/gnugo-3.3.21-joshj-200306270402.sgf 172
+108 same_dragon E16 F10
+#? [0]*
+
+loadsgf games/nngs/gnugo-3.5.1-viking4-200309231039.sgf 123
+109 same_dragon O3 N5
+#? [0]*
+
+# See also nngs4:290
+loadsgf games/nngs/aburry-gnugo-3.3.12-200212162212.sgf 38
+110 connect E3 G3
+#? [0]
+
+# See also gunnar:53
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 290
+trymove W R18
+trymove B S17
+111 connect O18 R18
+#? [0]
+popgo
+popgo
+
+# See also nngs1:11
+loadsgf games/nngs/camel-gnugo-3.1.26-200203022335.sgf 104
+trymove B S6
+112 connect S3 S6
+#? [0]
+popgo
+
+# See also blunder:24 and reading:198.
+loadsgf games/blunder17.sgf
+trymove B P5
+113 disconnect L3 M4
+#? [1 L4]
+popgo
+
+loadsgf games/kgs/TheGNUGo-JVD.sgf 19
+trymove white C15
+114 connect C14 C18
+#? [1 B15]*
+popgo
+
+loadsgf games/gunnar/gunnar9.sgf 4
+115 disconnect D10 J7
+#? [1 H7]
+
+# See also golife:3 and connection:28.
+loadsgf games/golife.sgf 30
+116 disconnect H4 H7
+#? [0]
+
+# See also trevor:15.
+loadsgf games/trevor/trevor_15.sgf 
+117 disconnect D7 F7
+#? [3 E7]
+
+# See also reading:219.
+loadsgf games/kgs/llk-GNU.sgf 150
+118 same_dragon H12 N13
+#? [0]
+119 disconnect H12 N13
+#? [1 N10]*
+
+# See also gunnar:75.
+loadsgf games/kgs/GNU-higher.sgf 193
+120 same_dragon L10 N11
+#? [0]
+121 disconnect L10 N11
+#? [1 M11]*
+
+# This test is extremely important.
+loadsgf games/kgs/perler-GNU.sgf 246
+122 disconnect B18 E15
+#? [3 E16]
+
+loadsgf games/kgs/ben9992000-GNU.sgf 189
+123 disconnect E10 F12
+#? [3 E11]
+124 connect E10 G10
+#? [1 E11]
+125 disconnect E10 G10
+#? [3 E11]
+
+# See also trevorc:450.
+loadsgf games/trevor/auto/c23.sgf 72
+126 disconnect E8 F6
+#? [1 E6]*
+
+# See also strategy5:300.
+loadsgf games/CrazyStone2.sgf 77
+127 same_dragon A9 G6
+#? [0]*
+
+# See also nngs4:630
+loadsgf games/nngs/evand-gnugo-3.3.21-200306130638.sgf 156
+play black C5
+128 connect C4 C8
+#? [1 B6]*
diff --git a/regression/dniwog.tst b/regression/dniwog.tst
new file mode 100644 (file)
index 0000000..1dac008
--- /dev/null
@@ -0,0 +1,42 @@
+# NNGS game of GNU Go 2.7.216 on February 1, 2001
+
+loadsgf games/dniwog.sgf 14
+1 reg_genmove white
+#? [D15]
+
+loadsgf games/dniwog.sgf 28
+2 reg_genmove white
+#? [!S5]
+
+loadsgf games/dniwog.sgf 42
+3 restricted_genmove white B5 B2
+#? [B2]
+
+loadsgf games/dniwog.sgf 62
+4 reg_genmove white
+#? [D7]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=W group needs help & 2 black stones attacking.
+#SEVERITY=8
+loadsgf games/dniwog.sgf 78
+5 reg_genmove white
+#? [H4|G4]*
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=A more clear-cut case for this tesuji might help.
+#SEVERITY=7
+loadsgf games/dniwog.sgf 88
+6 reg_genmove white
+#? [G1]*
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Safing right side group is better than terrible gote move!
+#SEVERITY=10
+loadsgf games/dniwog.sgf 96
+7 reg_genmove white
+#? [B8]
+
+loadsgf games/dniwog.sgf 108
+8 reg_genmove white
+#? [!M17]
diff --git a/regression/ego.tst b/regression/ego.tst
new file mode 100644 (file)
index 0000000..281e42f
--- /dev/null
@@ -0,0 +1,78 @@
+# This regression file covers mistakes made in the Computer Go Ladder
+# game between GNU Go 2.7.218 (white) and Ego (black) on
+# February 8, 2001.
+
+# An extension to K4 or K3 is urgent here.
+loadsgf games/ego.sgf 12
+1 reg_genmove white
+#? [K4|K3]
+
+# G3 looks good here but is maybe not the only move. E5 is clearly
+# suboptimal, however.
+loadsgf games/ego.sgf 30
+2 restricted_genmove white E5 G3
+#? [G3]
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=K17 misses H18 threat.
+#SEVERITY=8
+# K18 is unreasonable. H18 is the only move locally.
+loadsgf games/ego.sgf 52
+3 reg_genmove white
+#? [H18]
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Possible replacement pattern appropriate?
+#SEVERITY=8
+# The descent at G19 is bad shape because it leaves much aji around
+# E18 and gives black an endgame sente move at H19.
+loadsgf games/ego.sgf 54
+4 restricted_genmove white G19 H19 K17 F18
+#? [F18]*
+
+#CATEGORY=
+#DESCRIPTION=Why is B15 so bad?  -Trevor
+#SEVERITY=0
+# D7 is a good move.
+loadsgf games/ego.sgf 68
+5 reg_genmove white
+#? [!B15]
+
+loadsgf games/ego.sgf 86
+6 restricted_genmove white M5 N5
+#? [M5]
+
+# Unreasonable monkey jump
+loadsgf games/ego.sgf 96
+7 restricted_genmove white Q1 P2
+#? [P2]
+
+#CATEGORY=BORDER_PROTECTION
+#DESCRIPTION=Tough moyo protection.
+#SEVERITY=5
+loadsgf games/ego.sgf 112
+8 reg_genmove white
+#? [F12]
+
+loadsgf games/ego.sgf 180
+9 reg_genmove white
+#? [S19]
+
+loadsgf games/ego.sgf 190
+10 reg_genmove white
+#? [S18]
+
+
+#CATEGORY=KO_READING
+#DESCRIPTION=Tough - Black pushthrough is troublesome.
+#SEVERITY=3
+loadsgf games/ego.sgf 198
+11 reg_genmove white
+#? [T18|R16]*
+
+# The correct move is the double sente at R10, but for the time being
+# we also accept C12.
+loadsgf games/ego.sgf 252
+12 reg_genmove white
+#? [R10|C12]
+
diff --git a/regression/endgame.tst b/regression/endgame.tst
new file mode 100644 (file)
index 0000000..4a21f2f
--- /dev/null
@@ -0,0 +1,275 @@
+# endgame2.sgf is a refinement of the endgame problems in ego.sgf
+
+loadsgf games/endgame2.sgf 1
+201 reg_genmove white
+#? [R10]*
+
+loadsgf games/endgame2.sgf 2
+202 reg_genmove black
+#? [Q9]
+
+loadsgf games/endgame2.sgf 3
+203 reg_genmove white
+#? [A7]
+
+# H19 and A12 are both 1 point sente.
+loadsgf games/endgame2.sgf 4
+204 reg_genmove black
+#? [H19|A12]
+
+loadsgf games/endgame2.sgf 5
+205 reg_genmove white
+#? [F18|E18]
+
+loadsgf games/endgame2.sgf 6
+206 reg_genmove black
+#? [A12]
+
+loadsgf games/endgame2.sgf 7
+207 reg_genmove white
+#? [A11]
+
+loadsgf games/endgame2.sgf 8
+208 reg_genmove black
+#? [N1]*
+
+loadsgf games/endgame2.sgf 9
+209 reg_genmove white
+#? [A6|O1]
+
+# A5 is sente because the followup is bigger than black's capture at O2.
+loadsgf games/endgame2.sgf 10
+210 reg_genmove black
+#? [A5]
+
+# A5 is sente because the followup is bigger than black's capture at O2.
+loadsgf games/endgame2.sgf 11
+211 reg_genmove white
+#? [A5]
+
+loadsgf games/endgame2.sgf 12
+212 reg_genmove black
+#? [A5]
+
+loadsgf games/endgame2.sgf 13
+213 reg_genmove white
+#? [Q8|C13]
+
+loadsgf games/endgame2.sgf 14
+214 reg_genmove black
+#? [R8|C12|C13]
+
+loadsgf games/endgame2.sgf 15
+215 reg_genmove white
+#? [C13]
+
+loadsgf games/endgame2.sgf 16
+216 reg_genmove black
+#? [D13]
+
+loadsgf games/endgame2.sgf 17
+217 reg_genmove white
+#? [C12]
+
+loadsgf games/endgame2.sgf 18
+218 reg_genmove black
+#? [H1]
+
+loadsgf games/endgame2.sgf 19
+219 reg_genmove white
+#? [T17]
+
+#################################################################
+# endgame3.sgf features a subtle "eventual shortage of liberties"
+# position, causing E5 to be worth a whole point.
+
+loadsgf games/endgame3.sgf
+301 reg_genmove black
+#? [E5]*
+302 reg_genmove white
+#? [E5]
+
+#################################################################
+# endgame4.sgf is a question of ending with sente or not. Black E5
+# does defend the black F3 string, but turns out to lose a point in
+# the end.
+
+loadsgf games/endgame4.sgf
+401 reg_genmove black
+#? [C4]
+
+# The basic 2/3 pt ko capture is undervalued.
+loadsgf games/endgame5.sgf
+501 reg_genmove black
+#? [E5]
+
+# An endgame sente pattern.
+loadsgf games/endgame6.sgf 1
+601 reg_genmove black
+#? [J8]
+
+loadsgf games/endgame6.sgf 1
+602 reg_genmove white
+#? [J8]
+
+loadsgf games/endgame6.sgf 2
+603 reg_genmove black
+#? [C1]*
+
+loadsgf games/endgame6.sgf 2
+604 reg_genmove white
+#? [D1]*
+
+# G5 is one point in sente or 2 points in gote for white. E3 is bigger.
+loadsgf games/endgame7.sgf 1
+701 reg_genmove black
+#? [E3]
+
+loadsgf games/endgame7.sgf 1
+702 reg_genmove white
+#? [E3]
+
+loadsgf games/endgame7.sgf 2
+703 reg_genmove black
+#? [G5]
+
+loadsgf games/endgame7.sgf 2
+704 reg_genmove white
+#? [G5]
+
+loadsgf games/nngs/gnugo-3.3.11-bconwil-200211202359.sgf 242
+801 reg_genmove white
+#? [S14]
+
+802 reg_genmove black
+#? [S14]*
+
+# No point for F5.
+loadsgf games/endgame8.sgf
+803 reg_genmove black
+#? [J7]
+804 reg_genmove white
+#? [J7]
+
+loadsgf games/nngs/gnugo-3.3.17-Wiedemann-200303251932.sgf 151
+810 reg_genmove white
+#? [F5|F4]
+
+loadsgf games/nngs/gnugo-3.3.17-Wiedemann-200303251932.sgf 203
+820 reg_genmove white
+#? [H4|M10|K19]*
+
+loadsgf games/paul.sgf 205
+830 restricted_genmove white M19 B13
+#? [B13]
+
+loadsgf games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf 110
+840 reg_genmove white
+#? [L15]
+
+loadsgf games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf 140
+850 restricted_genmove white K4 J4 L4 P5
+#? [K4|J4|L4]
+
+# Defending T12 is large and R15 is clearly the best way.
+loadsgf games/endgame9.sgf
+860 reg_genmove black
+#? [R15]
+
+# H1 is one point and N7 is about 0.5.
+loadsgf games/endgame10.sgf
+870 restricted_genmove black H1 N7
+#? [H1]
+
+# K5 is best, although in absence of other worthy moves it doesn't matter.
+loadsgf games/endgame11.sgf
+880 reg_genmove white
+#? [K5]*
+# T4 is one point in ko, while T5 and S6 are filling dame only.
+890 restricted_genmove white T4 T5 S6
+#? [T4]
+
+loadsgf games/nngs/gnugo-3.3.21-joshj-200306270402.sgf 222
+900 reg_genmove white
+#? [J19|K19|K18]
+
+loadsgf games/kgs/yagr-eddyy.sgf 198
+910 reg_genmove white
+#? [T2]
+
+loadsgf games/kgs/yagr-gab9.sgf 205
+920 reg_genmove white
+#? [C4]
+
+# C11 is one point reverse sente.
+# E4 is at the very least three points reverse sente, probably five or
+# six points reverse sente.
+# P4 is three points reverse sente.
+# R16/O14 are very very big. O14 is bigger than R16.
+loadsgf games/kgs/GNU-merlenoir.sgf 185
+930 restricted_genmove white O14 R16
+#? [O14]*
+931 restricted_genmove white R16 E4
+#? [R16]
+932 restricted_genmove white E4 P4
+#? [E4]
+933 restricted_genmove white P4 C11
+#? [P4]*
+
+# E4 is at the very least three points reverse sente, probably five or
+# six points reverse sente.
+# P4 is three points reverse sente.
+# R16 is about two points (slightly more) reverse sente.
+# K11 is three points gote.
+# R1 is about one and a half points reverse sente and in any case
+# locally smaller than P4.
+loadsgf games/kgs/GNU-merlenoir.sgf 193
+940 restricted_genmove white P4 R16
+#? [P4]
+941 restricted_genmove white R16 K11
+#? [R16]*
+942 restricted_genmove white P4 R1
+#? [P4]*
+
+# R16 is about two points (slightly more) reverse sente.
+# H8 is one point reverse sente.
+# C1 is between one and two points gote.
+loadsgf games/kgs/GNU-merlenoir.sgf 209
+950 restricted_genmove white R16 H8
+#? [R16]
+951 restricted_genmove white H8 C1
+#? [H8]*
+
+# J10 is at least four points gote, in reality probably six.
+# H8 is one point reverse sente.
+loadsgf games/kgs/GNU-merlenoir.sgf 233
+960 restricted_genmove white J10 H8
+#? [J10]
+
+# No point to gain at the top, fill ko. After white C6, black E6,
+# white has to defend and loses the ko.
+loadsgf games/endgame12.sgf
+970 reg_genmove white
+#? [G2]
+
+loadsgf games/nando/auto025.sgf 226
+980 restricted_genmove white E4 F4 Q19
+#? [F4]
+
+# E5 is about 2.5 points.
+loadsgf games/endgame13.sgf 1
+990 reg_genmove black
+#? [C1]
+991 reg_genmove white
+#? [C1]
+loadsgf games/endgame13.sgf 2
+992 reg_genmove black
+#? [E5]*
+993 reg_genmove white
+#? [E5]
+
+# E5 is two points gote, J3 one point sente, and J2 three points gote.
+# J2 wins the game by 0.5, all other moves lose.
+loadsgf games/endgame14.sgf
+1000 reg_genmove black
+#? [J2]
diff --git a/regression/endgame1.tst b/regression/endgame1.tst
new file mode 100644 (file)
index 0000000..fb70d09
--- /dev/null
@@ -0,0 +1,65 @@
+loadsgf games/endgame1.sgf 1
+101 reg_genmove black
+#? [F9]
+
+loadsgf games/endgame1.sgf 2
+102 reg_genmove white
+#? [E9]
+
+loadsgf games/endgame1.sgf 3
+103 reg_genmove black
+#? [G9]
+
+loadsgf games/endgame1.sgf 4
+104 reg_genmove white
+#? [E8|D8|E7]
+
+loadsgf games/endgame1.sgf 5
+105 reg_genmove black
+#? [J2|J3|A7]
+
+loadsgf games/endgame1.sgf 6
+106 reg_genmove white
+#? [G1|H1|F3]
+
+# J3 is 0 points double sente.
+loadsgf games/endgame1.sgf 7
+107 reg_genmove black
+#? [J3|A7]
+
+# tm - H1 also seems fine.
+loadsgf games/endgame1.sgf 8
+108 reg_genmove white
+#? [G1|H1]
+
+loadsgf games/endgame1.sgf 9
+109 reg_genmove black
+#? [A7]
+
+loadsgf games/endgame1.sgf 10
+110 reg_genmove white
+#? [A8]
+
+loadsgf games/endgame1.sgf 11
+111 reg_genmove black
+#? [A6]
+
+loadsgf games/endgame1.sgf 12
+112 reg_genmove white
+#? [B8|B9|C8]
+
+loadsgf games/endgame1.sgf 13
+113 reg_genmove black
+#? [D2|C5]
+
+loadsgf games/endgame1.sgf 14
+114 reg_genmove white
+#? [E1]
+
+loadsgf games/endgame1.sgf 15
+115 reg_genmove black
+#? [C5]
+
+loadsgf games/endgame1.sgf 16
+116 reg_genmove white
+#? [D5]
diff --git a/regression/eval.sh b/regression/eval.sh
new file mode 100755 (executable)
index 0000000..7effe3c
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if test ! "$GNUGO"; then
+       GNUGO=../interface/gnugo
+fi
+
+if test ! "$RD"; then
+       RD=.
+fi
+
+tstfile=$1
+options1=$2   # May be omitted
+options2=$3  # May be omitted
+options3=$4  # May be omitted
+options4=$5  # May be omitted  FIXME: Do multiple options better.
+
+$GNUGO --quiet $options1 $options2 $options3 $options4 --mode gtp <$tstfile |\
+       awk -f $RD/regress.awk tst=$tstfile verbose=1
diff --git a/regression/eval3.sh b/regression/eval3.sh
new file mode 100755 (executable)
index 0000000..690894e
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+nice -n 19 ./regress.pl \
+  --verbose 1  \
+  -a 1
diff --git a/regression/filllib.tst b/regression/filllib.tst
new file mode 100644 (file)
index 0000000..c4dd0b7
--- /dev/null
@@ -0,0 +1,185 @@
+# incident 72
+# A15 and A16 are ko threats. These are of no use but don't hurt the
+# position either. filllib shouldn't play these but they may get
+# played as owl_threaten_attack moves. We include them here to avoid
+# false alarms.
+loadsgf games/incident72.sgf 255
+1 reg_genmove black
+#? [T15|T13|T10|T8|T5|T1|Q1|N1|A15|A16]
+2 reg_genmove white
+#? [A14|A10|A8|A4|A1|E1|G1|J1]
+
+# incident 187
+loadsgf games/incident187.sgf 227
+3 reg_genmove white
+#? [B15|A15|A17|B14]
+4 reg_genmove black
+#? [B19|A17]*
+
+# incident 216
+loadsgf games/incident211.sgf 64
+5 reg_genmove black
+#? [PASS]
+6 reg_genmove white
+#? [PASS]
+
+# incident 296
+loadsgf games/incident291.sgf 274
+7 reg_genmove black
+#? [PASS]
+8 reg_genmove white
+#? [PASS]
+
+loadsgf games/filllib1.sgf 54
+9 reg_genmove white
+#? [PASS]
+10 reg_genmove black
+#? [PASS]
+
+loadsgf games/filllib1.sgf 58
+11 reg_genmove white
+#? [PASS]
+12 reg_genmove black
+#? [PASS]
+
+loadsgf games/filllib1.sgf 60
+13 reg_genmove white
+#? [PASS]
+14 reg_genmove black
+#? [PASS]
+
+loadsgf games/filllib2.sgf 312
+15 reg_genmove white
+#? [P19]
+16 reg_genmove black
+#? [R19]
+
+loadsgf games/filllib3.sgf 105
+17 reg_genmove white
+#? [B11|A13]
+18 reg_genmove black
+#? [A10]
+
+loadsgf games/filllib4.sgf 252
+19 reg_genmove white
+#? [A13]
+20 reg_genmove black
+#? [A13]
+
+# White A7 may give a point if there are sufficient ko threats. The
+# variation W A7, B A6, W D8, B A8, W B9, B A7 does not lose a point.
+loadsgf games/filllib5.sgf 52
+21 reg_genmove white
+#? [A7|D9|B9]
+22 reg_genmove black
+#? [A7]
+
+loadsgf games/filllib6.sgf 261
+23 reg_genmove white
+#? [P16]
+24 reg_genmove black
+#? [P16]
+
+# White J3 is best but with superior ko threats, H1 and J5 can also be
+# played with the same result.
+loadsgf games/filllib7.sgf 72
+25 reg_genmove white
+#? [J3|H1|J5]
+26 reg_genmove black
+#? [J5|H7|J7]
+
+loadsgf games/filllib8.sgf 303
+27 reg_genmove white
+#? [Q16]
+28 reg_genmove black
+#? [R14]
+
+# It's not a very good idea to throw in to start a ko, but we accept
+# it anyway.
+loadsgf games/filllib9.sgf 235
+29 reg_genmove white
+#? [B1|A1]
+30 reg_genmove black
+#? [A3|A1|B1]
+
+# Q19 for white is non-orthodox but doesn't lose points.
+loadsgf games/trevor/auto/d29.sgf 188
+31 reg_genmove white
+#? [S16|T17|O18|Q19]
+32 reg_genmove black
+#? [O18|O19|N18|P19|N19]
+
+loadsgf games/filllib10.sgf
+33 reg_genmove white
+#? [PASS]
+34 reg_genmove black
+#? [PASS]
+
+loadsgf games/nngs/speciman-gnugo-3.1.32-200204211014.sgf 53
+35 reg_genmove black
+#? [A8|B8]*
+36 reg_genmove white
+#? [A5|A8|B8]
+
+loadsgf games/filllib11.sgf
+37 reg_genmove white
+#? [H5]
+38 reg_genmove black
+#? [E4]
+
+loadsgf games/nngs/gnugo-3.1.34-guest1-200204242025.sgf 86
+39 reg_genmove white
+#? [G12|F12|G13]
+40 reg_genmove black
+#? [K13]
+
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 244
+41 reg_genmove white
+#? [M8]
+
+loadsgf games/nngs/gnugo-3.3.11-rcde05-200211090008.sgf 271
+42 reg_genmove white
+#? [N19]
+
+loadsgf games/filllib12.sgf
+43 reg_genmove black
+#? [C6]
+
+loadsgf games/filllib13.sgf
+44 reg_genmove black
+#? [F4]
+
+#Moved from 9x9:240
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312150903.sgf
+45 reg_genmove black
+#? [G9]
+
+loadsgf games/filllib14.sgf
+46 reg_genmove white
+#? [N3|H5|M1]*
+
+# L1 loses one point since we still need to play K2 and one of L2 and J1.
+loadsgf games/filllib15.sgf
+47 reg_genmove black
+#? [L2|K2|J1]
+
+# F1 is an unsafe backfilling move for J1 and must be preceded by e.g. E2.
+loadsgf games/filllib16.sgf
+48 reg_genmove white
+#? [B4|E2|B2]*
+
+# The liberty filling move at B16 is a blunder but can be played after
+# either of C18 and E18.
+loadsgf games/filllib17.sgf
+49 reg_genmove white
+#? [C18|E18]*
+
+# Black must eliminate white's seki potential so that L3 can be played.
+loadsgf games/filllib18.sgf
+50 reg_genmove black
+#? [T2|R2|S1]*
+
+# GNU Go 3.7.9  tries an illegal liberty filling move at J4.
+loadsgf games/filllib19.sgf
+51 reg_genmove black
+#? [D6|B2]
diff --git a/regression/games/9handicap.sgf b/regression/games/9handicap.sgf
new file mode 100644 (file)
index 0000000..7ea6056
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]AP[glGo:1.1]ST[1]
+
+SZ[19]HA[9]KM[6.5]
+PW[°×]PB[GNU Go]DT[2005-02-15]
+AB[jj][jd][jp][dj][pj][pp][dd][pd][dp]
+;W[ec];B[dc];W[db];B[cb];W[cf];B[ed];W[eb];B[fc];W[fb];B[gc];W[bd];B[gb];W[bb];B[bc];W[ca];B[cc];W[ac];B[be];W[bf];B[cd];W[ae];B[ad];W[ga];B[ha];W[bd];B[md];W[ce];B[qg];W[ge];B[fa];W[da];B[ga];W[ic];B[hd];W[id];B[ie];W[jc];B[jf];W[kd];B[lf];W[je];B[he];W[gf];B[cn];W[bq];B[cr];W[cq];B[dq];W[er];B[dr];W[bm];B[bk];W[cl];B[fq];W[ck];B[bj];W[el];B[cj];W[bo];B[en];W[gr];B[nq];W[rp];B[qo];W[rn];B[ql];W[qr];B[gl];W[pb];B[nb];W[od];B[oc];W[qd];B[pc];W[qc];B[fr];W[hq];B[ir];W[ho];B[jn];W[kr];B[mr];W[kp];B[ko];W[lp];B[no];W[jq];B[ip];W[iq];B[hp];W[fm];B[lo];W[gq];B[gp];W[qm];B[pl];W[rj];B[rl];W[pm];B[ol];W[pi];B[oi];W[ph];B[rh];W[oe];B[pe];W[me];B[le];W[of];B[oh];W[pg];B[qe];W[re];B[rf];W[se];B[om];W[mc];B[ld];W[lc];B[ke];W[nc];B[ob];W[nd];B[nf];W[ng];B[mf];W[nh];B[ni];W[oj];B[og];W[pf];B[rc];W[qb];B[rd];W[rb];B[sf];W[sc];B[sd];W[re];B[se];W[qf];B[nj];W[mb];B[kb];W[na];B[qj];W[qh];B[rg];W[oa];B[re];W[ri];B[sb];W[sh];B[qi];W[si];B[rk];W[kc];B[hg];W[mp];B[lr];W[qp];B[eh];W[np];B[oq];W[oo];B[po];W[mo];B[nn];W[op];B[pq];W[mn];B[ro];W[qq];B[on];W[ml];B[mm];W[lm];B[nm];W[ln];B[ll];W[jm];B[lq];W[kq];B[gs];W[os];B[ef];W[hf];B[ek];W[ei];B[dh];W[ch];B[gn];W[in];B[im];W[hm];B[il];W[go];B[fo];W[gm];B[hs];W[kl];B[kn];W[hl];B[ik];W[fn];B[fi];W[mh];B[li];W[lh];B[kh];W[ki];B[ji];W[kg];B[jg];W[jh];B[ne];W[kf];B[ih];W[mi];B[jd];W[ee];B[kh];W[nk];B[mj];W[lj];B[ok];W[mk];B[oj];W[lg];B[je];W[so];B[de];W[gd];B[fe];W[df];B[ff];W[fd];B[ee];W[eg];B[fg];W[gg];B[dg];W[gh];B[ci];W[fh];B[eg];W[cg];B[di];W[or];B[bh];W[rm];B[pn];W[ag];B[bg];W[ah];B[bi];W[gi];B[fk];W[eo];B[fp];W[dn];B[kk];W[kj];B[jh];W[lk];B[jk];W[hc];B[ia];W[hk];B[hj];W[gj];B[gk];W[hi];B[ij];W[nr];B[mq];W[ra];B[sk];W[pa];B[jb];W[pr];B[io];W[hn];B[do];W[em];B[co];W[bn];B[ep];W[cm];B[bl];W[es];B[am];W[sa];B[sj];W[sc];B[sg];W[ri];B[br];W[sh];B[en];W[ab];B[dm];W[fj];B[ba];W[aa];B[ai];W[ba];B[ja];W[ib];B[af];W[ag];B[ah];W[hh];B[ig];W[li];B[hr];W[ej];B[dk];W[fs];B[eq];W[dl];B[bp];W[ap];B[cp];W[dn];B[eo];W[ar];B[dm];W[ls];B[ms];W[bs];B[ks];W[dn];B[jr];W[js];B[ds];W[fs];B[es];W[ls];B[jl];W[km];B[jo];W[sm];B[lb];W[la];B[if];W[sp];B[si];W[rh];B[ns];W[sl];B[qn];W[sn];B[rj];W[an];B[dm];W[al];B[af];W[ks];B[hb];W[ag];B[dn];W[ll];B[af];W[pk];B[mg];W[ag];B[aq];W[af];B[ak];W[bq];B[cq];W[aq];B[cs];W[am];B[as];W[ao];B[bs];W[ka];B[tt];W[ea];B[tt];W[ii];B[tt];W[me];B[tt];W[fl];B[tt];W[aj];B[tt];W[is];B[tt];W[fs];B[tt];W[er];B[tt];W[nl];B[tt];W[qk];B[tt])
diff --git a/regression/games/9x9-1.sgf b/regression/games/9x9-1.sgf
new file mode 100644 (file)
index 0000000..58409c5
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]
+SZ[9]
+GN[GNU Go 3.7.7 Random Seed 1138713294 level 10]
+DT[2006-01-31]
+KM[0.0]RU[Japanese]AP[GNU Go:3.7.7]HA[0]RE[W+11.0]
+;B[ee];W[df];B[ef];W[de];B[ed];W[dg];B[fh];W[gc];B[fb];W[fc];B[gf]
+;W[ec];B[dd];W[eh];B[cd];W[be];B[eg];W[dh];B[bd];W[he];B[hf];W[ge]
+;B[gb];W[eb];B[hc];W[hb];B[cb];W[fi];B[gh];W[ce];B[ae];W[af];B[ad]
+;W[bf];B[ie];W[id];B[if];W[hd];B[db];W[dc];B[gi];W[cc];B[bc];W[da]
+;B[ba];W[ei];B[fe];W[fd];B[ca];W[ea];B[];W[];B[])
diff --git a/regression/games/9x9-2.sgf b/regression/games/9x9-2.sgf
new file mode 100644 (file)
index 0000000..97e635f
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]
+GN[GNU Go 3.7.7 Random Seed 1138611624 level 10]
+DT[2006-01-30]
+KM[0.0]RU[Japanese]AP[GNU Go:3.7.7]HA[0]RE[W+16.0]
+;B[fe];W[de];B[ec];W[ff];B[cd];W[ce];B[cg];W[dg];B[dh];W[eg];B[eh]
+;W[fh];B[bf];W[bh];B[ch];W[be];B[ag];W[bi];B[ei];W[ci];B[fi];W[gh]
+;B[gi];W[hh];B[hi];W[ih];B[gc];W[ah];B[bc];W[dd];B[dc];W[bd];B[cc]
+;W[ge];B[hd];W[he];B[ee];W[gd];B[hc];W[ed];B[fd];W[ef];B[fc];W[ac]
+;B[ab];W[ad];B[di];W[ai];B[bb];W[gf];B[ie];W[if];B[id];W[];B[])
+
+
+
diff --git a/regression/games/9x9-3.sgf b/regression/games/9x9-3.sgf
new file mode 100644 (file)
index 0000000..519f7f4
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]
+GN[GNU Go 3.7.7 Random Seed 1138620252 level 10]
+DT[2006-01-30]
+KM[0.0]RU[Japanese]AP[GNU Go:3.7.7]HA[0]RE[W+11.0]
+;B[ee];W[df];B[ef];W[eg];B[fg];W[dh];B[cd];W[fh];B[ge];W[gc];B[hd]
+;W[dc];B[dd];W[cc];B[gg];W[hc];B[gh];W[bf];B[bd];W[bc];B[fi];W[eh]
+;B[ec];W[eb];B[fc];W[fb];B[gd];W[id];B[ie];W[ic];B[ac];W[ab];B[ad]
+;W[bb];B[bg];W[cg];B[bh];W[ag];B[af];W[ae];B[ce];W[cf];B[be];W[af]
+;B[ei];W[di];B[gi];W[de];B[ed];W[ch];B[];W[])
+
+
+
diff --git a/regression/games/9x9-4.sgf b/regression/games/9x9-4.sgf
new file mode 100644 (file)
index 0000000..3c31619
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]AP[qGo:1.0.4]ST[1]GN[GNU Go 3.7.7 Random Seed 1138631446 level 10]
+SZ[9]HA[0]KM[0]PW[White]PB[Black]RE[W+2.0]DT[2006-01-30]
+RU[Japanese]
+;B[fd];W[ff];B[ee];W[ef];B[de];W[df];B[ce];W[gd];B[gc];W[ge]
+;B[hc];W[cf];B[if];W[ie];B[he];W[hf];B[id];W[ig]
+(
+;B[hg];W[ie];B[gg];W[hd];B[be];W[bf];B[af];W[ag];B[ae];W[bg]
+;B[ic];W[fe];B[fc];W[tt];B[tt]
+)
+(
+;B[ie];W[hd];B[ic];W[hg];B[fe];W[gf];B[bf];W[bg];B[af];W[ag]
+;B[be]C[B+8.0]
+)
+)
\ No newline at end of file
diff --git a/regression/games/9x9-5.sgf b/regression/games/9x9-5.sgf
new file mode 100644 (file)
index 0000000..72fe9be
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]SZ[9]KM[7.5]
+;B[ee];W[dc];B[ec];W[eb];B[fc];W[fg];B[df];W[cd];B[dd];W[cc]
+;B[eg];W[hg];B[fb];W[cf];B[gf];W[gh];B[eh];W[hf];B[he];W[ge]
+;B[gd];W[ie];B[hd];W[ff];B[fe];W[ch];B[ce];W[be];B[cg];W[bf]
+;B[bg];W[fh];B[ih];W[ei];B[di];W[fi];B[de];W[bc];B[db];W[dh]
+;B[dg];W[cb]
+)
diff --git a/regression/games/9x9-6.sgf b/regression/games/9x9-6.sgf
new file mode 100644 (file)
index 0000000..815e0c2
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]SZ[9]KM[7.5]
+;B[ee];W[dc];B[ec];W[eb];B[fc];W[fg];B[df];W[cd];B[dd];W[cc]
+;B[eh];W[hg];B[fb];W[bf];B[gh];W[fh];B[gg];W[gf];B[hh];W[eg]
+;B[dg];W[hf];B[dh];W[fi];B[bb];W[cb];B[ff];W[ih];B[ea];W[db]
+;B[ca];W[da];B[ce];W[bd];B[be];W[ae];B[ba];W[bh];B[bg];W[cg]
+;B[cf];W[ag];B[ch]
+)
diff --git a/regression/games/CrazyStone1.sgf b/regression/games/CrazyStone1.sgf
new file mode 100644 (file)
index 0000000..7c2dbf6
--- /dev/null
@@ -0,0 +1,15 @@
+(;FF[4]CA[ISO8859_1]GN[time-16-2]AP[TwoGtp:0.8pre2]SZ[9]KM[7.5]
+PB[Crazy Stone:0003-11]PW[GNU Go:3.6]DT[2006-01-13]
+C[Black: ./CrazyStone
+White: gnugo --mode gtp --chinese-rules --level 10 --min-level 10
+Result[Black\]: ?
+Result[White\]: B+73.5
+Host: zizi.grappa.univ-lille3.fr (AMD Athlon(tm) 64 Processor 3400+)
+Date: Friday, January 13, 2006 11:22:17 AM CET]
+;B[ee];W[cg];B[cc];W[gc];B[ge];W[he];B[hf];W[hd];B[dd];W[gf]
+;B[gg];W[ff];B[ef];W[fg];B[eg];W[fh];B[eh];W[bg];B[gh];W[fi]
+;B[ei];W[fe];B[fd];W[gd];B[gi];W[ge];B[ig];W[hh];B[fc];W[fb]
+;B[eb];W[gb];B[hi];W[if];B[ie];W[ih];B[be];W[ea];B[db];W[da]
+;B[ca];W[fa];B[id];W[ic];B[bd];W[tt];B[ch];W[tt];B[hb];W[ib]
+;B[ha];W[hg];B[ii];W[if];B[ie];W[hc];B[hh];W[tt];B[cb];W[tt]
+;B[ec];W[tt];B[dh];W[tt];B[tt])
diff --git a/regression/games/CrazyStone2.sgf b/regression/games/CrazyStone2.sgf
new file mode 100644 (file)
index 0000000..b4b8268
--- /dev/null
@@ -0,0 +1,18 @@
+(;FF[4]CA[ISO8859_1]GN[time-16-3]AP[TwoGtp:0.8pre2]SZ[9]KM[7.5]PB[GNU Go:3.6]
+PW[Crazy Stone:0003-11]DT[2006-01-13]
+C[Black: gnugo --mode gtp --chinese-rules --level 10 --min-level 10
+White: ./CrazyStone
+Result[Black\]: W+24.5
+Result[White\]: ?
+Host: zizi.grappa.univ-lille3.fr (AMD Athlon(tm) 64 Processor 3400+)
+Date: Friday, January 13, 2006 11:39:15 AM CET]
+;B[ee];W[gf];B[gd];W[cf];B[eg];W[fd];B[fe];W[gc];B[ge];W[hd]
+;B[he];W[cd];B[fc];W[ec];B[fb];W[ed];B[fa];W[hc];B[db];W[de]
+;B[hb];W[dg];B[gg];W[eh];B[fh];W[eb];B[ea];W[gb];B[ga];W[ha]
+;B[ia];W[ef];B[fg];W[ic];B[bb];W[hf];B[ff];W[ca];B[cb];W[da]
+;B[ba];W[da];B[ca];W[ie];B[ig];W[ch];B[ei];W[di];B[ae];W[fi]
+;B[hh];W[if];B[gi];W[bd];B[ad];W[bc];B[ac];W[ab];B[af];W[bg]
+;B[dc];W[dd];B[df];W[ag];B[ef];W[hi];B[ei];W[ci];B[aa];W[be]
+;B[fi];W[ih];B[ii];W[bf];B[dh];W[cc];B[ha];W[ab];B[ac];W[ad]
+;B[cg];W[ab];B[dg];W[da];B[bh];W[ah];B[bi];W[ib];B[hg];W[id]
+;B[ai];W[ci];B[ch];W[ha];B[tt];W[tt])
diff --git a/regression/games/FSF-neurogo.sgf b/regression/games/FSF-neurogo.sgf
new file mode 100644 (file)
index 0000000..c4b45b5
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[3]
+SZ[19]KM[5.5]
+PW[FSF]
+WR[NR]
+PB[neurogo]
+BR[NR]
+DT[2000-09-20]
+SY[Cgoban 1.9.10];B[cc];W[pd];B[cq];W[qp];B[qc];W[qd];B[pc];W[oc];
+B[nc];W[ob];B[rc];W[lc];B[qf];W[nd];B[nq];W[rd];B[qj];W[hd];B[qn];
+W[ch];B[pp];W[rq];B[gq];W[ce];B[ec];W[dl];B[kn];W[co];B[eo];W[ee];
+B[ml];W[iq];B[ip];W[mj];B[jq];W[pq];B[oh];W[kj];B[cn];W[bn];B[cm];
+W[dn];B[dm];W[cl];B[em];W[bm];B[gl];W[do];B[en];W[fl];B[hj];W[ni];
+B[fi];W[gi];B[gh];W[hi];B[ii];W[hh];B[hg];W[ih];B[jh];W[lg];B[ig];
+W[gj];B[fj];W[gk];B[fk];W[hk];B[ik];W[ij];B[ji];W[jj];B[hl];W[hj];
+B[fe];W[jg];B[ef];W[dj];B[kg];W[jf];B[el];W[gg];B[fh];W[gf];B[df];
+W[de];B[cf];W[lq];B[be];W[mr];B[mq];W[bd];B[bf];W[cd];B[ed];W[bc];
+B[bb];W[cb];B[db];W[dc];B[ca];W[eb];B[da];W[ba];B[cc];W[fd];B[dd];
+W[fc];B[dc];W[ff];B[fb];W[gb];B[fa];W[of];B[pr];W[nr];B[oq];W[qq];
+B[or];W[ro];B[qo];W[lp];B[jr];W[ab];B[aa];W[ng];B[ac];W[ge];B[qr];
+W[rn];B[qm];W[rm];B[bh];W[bi];B[ag];W[aq];B[cp];W[bo];B[rr];W[ql];
+B[pl];W[po];B[sq];W[op];B[on];W[no];B[nn];W[lo];B[oo];W[np];B[bk];
+W[rl];B[ck];W[br];B[dk];W[eg];B[bp];W[cr];B[dp];W[ap];B[er];W[dr];
+B[ep];W[ln];B[ci];W[pk];B[ok];W[ol];B[pm];W[oj];B[nk];W[qh];B[pj];
+W[qk];B[rj];W[om];B[pn];W[nm];B[mn];W[mm];B[pp];W[ll];B[rp];W[qg];
+B[lm];W[km];B[oi];W[nj];B[qp];W[pi];B[jn];W[fg];B[dh];W[il];B[bl];
+W[qb];B[pb];W[rb];B[pa];W[sb];B[sc];W[oa];B[rh];W[rg];B[jm];W[im];
+B[jl];W[jk];B[kl];W[lm];B[lk];W[qi];B[in];W[hm];B[gm];W[ki];B[mk];
+W[kk];B[lj];W[nh];B[ri];W[li];B[hn];W[ik];B[kr];W[lr];B[mp];W[mo];
+B[so];W[dg];B[cg];W[os];B[ps];W[ns];B[ko];W[eh];B[ch];W[ei];B[ls];
+W[ej];B[fm];W[cj];B[bj];W[kp];B[jp];W[sn];B[sp];W[ad];B[ab];W[ae];
+B[rk];W[ga];B[sl];W[nl];B[ok];W[nk];B[ea];W[rf];B[bq];W[ek];B[fl];
+W[di];B[ds];W[kq];B[cs];W[fe];B[ie];W[if];B[bs];W[af];B[id];W[ai];
+B[aj];W[ms];B[ib];W[ks];B[he];W[hf];B[hc];W[gc];B[kb];W[kd];B[lb];
+W[mb];B[jc];W[gd];B[dq];W[js];B[ar];W[ir];B[hb];W[gr];B[hp];W[fr];
+B[hr];W[hs];B[hq];W[is];B[sg];W[fq];B[fp];W[la];B[mc];W[md];B[je];
+W[jd];B[kf];W[ke];B[ja];W[ic];B[id];W[ha];B[ie];W[fs];B[ma];W[na];
+B[gn];W[ls];B[al];W[eq];B[qq];W[gs];B[ia];W[es];B[dr];W[tt];B[sk];
+W[tt];B[sh];W[tt];B[se];W[tt];B[sd];W[sf];B[pg];W[pf];B[re];W[qe];
+B[lf];W[tt];B[mf];W[kh];B[od];W[qa];B[se];W[tt];B[re];W[tt];B[ld];
+W[le];B[me];W[tt];B[je];W[ne];B[jh];W[tt];B[mh];W[tt];B[kc];W[ld];
+B[oe];W[nf];B[ig];W[tt];B[pb];W[tt];B[pa];W[tt];B[pc];W[qc];B[pb];
+W[tt];B[pa];W[tt];B[mg];W[lh];B[lk];W[tt];B[lj];W[tt];B[ii];W[tt];
+B[sa];W[tt];B[sd];W[tt]
+AE[rh][qj][pj][rj][ri][rk][sl][sk][sg][sh][oh][oi][pg][se][re][sd][od][oe][pb][pa][sa][jc][kb][lb][kc][ja][ib][hc][hb][ia][id][ie][je][nc][mc][kg][kf][lf][mf][me][mh][mg][ig][jh][ii][lk][lj][bi][ai][co][dn][do][bn][bm][bo][aq][ap]
+)
diff --git a/regression/games/FSGCBot-dr.sgf b/regression/games/FSGCBot-dr.sgf
new file mode 100644 (file)
index 0000000..805e40c
--- /dev/null
@@ -0,0 +1,246 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Japanese]SZ[19]KM[5.50]TM[1500]OT[5x30 byo-yomi]
+PW[FSGCBot]PB[dr]BR[13k]DT[2004-01-06]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[FSGCBot [?\]: GTP Engine for FSGCBot (white): GNU Go version 3.5.2
+]RE[B+13.50]
+;B[pd]BL[1645.506]CR[pd]
+;W[dp]WL[1649.882]CR[dp]
+;B[pp]BL[1641.677]CR[pp]
+;W[dd]WL[1649.661]CR[dd]
+;B[pj]BL[1638.671]CR[pj]
+;W[nq]WL[1649.258]CR[nq]
+;B[qn]BL[1636]CR[qn]
+;W[pr]WL[1648.844]CR[pr]
+;B[qq]BL[1635.03]CR[qq]
+;W[kq]WL[1648.214]CR[kq]PL[B]
+;B[fc]BL[1623.422]CR[fc]
+;W[nd]WL[1646.74]CR[nd]
+;B[pf]BL[1620.08]CR[pf]
+;W[pc]WL[1645.91]CR[pc]
+;B[qc]BL[1619.068]CR[qc]
+;W[oc]WL[1644.088]CR[oc]
+;B[qd]BL[1607.735]CR[qd]
+;W[fd]WL[1643.499]CR[fd]
+;B[gd]BL[1605.076]CR[gd]
+;W[fe]WL[1642.379]CR[fe]
+;B[dc]BL[1591.304]CR[dc]
+;W[cc]WL[1640.516]CR[cc]
+;B[ec]BL[1586.362]CR[ec]
+;W[cd]WL[1638.323]CR[cd]
+;B[jc]BL[1574.654]CR[jc]
+;W[ch]WL[1637.412]CR[ch]
+;B[cn]BL[1570.625]CR[cn]
+;W[fq]WL[1636.369]CR[fq]
+;B[bp]BL[1568.468]CR[bp]
+;W[cq]WL[1635.337]CR[cq]
+;B[ck]BL[1565.377]CR[ck]
+;W[bq]WL[1634.245]CR[bq]
+;B[bo]BL[1558.647]CR[bo]
+;W[en]WL[1633.111]CR[en]
+;B[mc]BL[1545.713]CR[mc]
+;W[no]WL[1629.854]CR[no]
+;B[om]BL[1542.51]CR[om]
+;W[mm]WL[1628.439]CR[mm]
+;B[le]BL[1519.841]CR[le]
+;W[nf]WL[1627.113]CR[nf]
+;B[ne]BL[1518.56]CR[ne]
+;W[nh]WL[1624.338]CR[nh]
+;B[oe]BL[1500.82]CR[oe]
+;W[kg]WL[1621.179]CR[kg]
+;B[ph]BL[1493.956]CR[ph]
+;W[fk]WL[1618.879]CR[fk]
+;B[ej]BL[1467.929]CR[ej]
+;W[mk]WL[1614.475]CR[mk]
+;B[eh]BL[1450.242]CR[eh]
+;W[gh]WL[1610.9]CR[gh]
+;B[gf]BL[1436.223]CR[gf]
+;W[ig]WL[1607.516]CR[ig]
+;B[cf]BL[1413.312]CR[cf]
+;W[dg]WL[1599.691]CR[dg]
+;B[bi]BL[1400.82]CR[bi]
+;W[bh]WL[1593.575]CR[bh]
+;B[dh]BL[1392.803]CR[dh]
+;W[df]WL[1579.512]CR[df]
+;B[ci]BL[1379.183]CR[ci]
+;W[ah]WL[1572.823]CR[ah]
+;B[ai]BL[1373.727]CR[ai]
+;W[ce]WL[1568.14]CR[ce]
+;B[gi]BL[1343.127]CR[gi]
+;W[hj]WL[1563.582]CR[hj]
+;B[hi]BL[1340.581]CR[hi]
+;W[ii]WL[1559.688]CR[ii]
+;B[gj]BL[1337.164]CR[gj]
+;W[gk]WL[1555.366]CR[gk]
+;B[ij]BL[1327.406]CR[ij]
+;W[hk]WL[1550.405]CR[hk]
+;B[mg]BL[1300.758]CR[mg]
+;W[mf]WL[1544.867]CR[mf]
+;B[ng]BL[1298.208]CR[ng]
+;W[lg]WL[1535.834]CR[lg]
+;B[mh]BL[1279.759]CR[mh]
+;W[ji]WL[1528.644]CR[ji]
+;B[lf]BL[1273.89]CR[lf]
+;W[ge]WL[1523.104]CR[ge]
+;B[hd]BL[1264.843]CR[hd]
+;W[fg]WL[1520.567]CR[fg]
+;B[hf]BL[1245.826]CR[hf]
+;W[he]WL[1518.379]CR[he]
+;B[if]BL[1211.964]CR[if]
+;W[ie]WL[1515.554]CR[ie]
+;B[jf]BL[1205.669]CR[jf]
+;W[jg]WL[1512.432]CR[jg]
+;B[id]BL[1193.1]CR[id]
+;W[qr]WL[1509.277]CR[qr]
+;B[rr]BL[1191.161]CR[rr]
+;W[ni]WL[1506.255]CR[ni]
+;B[mi]BL[1172.48]CR[mi]
+;W[mj]WL[1502.416]CR[mj]
+;B[nj]BL[1143.269]CR[nj]
+;W[cb]WL[1498.427]CR[cb]
+;B[db]BL[1141.299]CR[db]
+;W[dl]WL[1495.968]CR[dl]
+;B[cl]BL[1138.949]CR[cl]
+;W[nk]WL[1492.944]CR[nk]
+;B[oj]BL[1135.68]CR[oj]
+;W[je]WL[1491.101]CR[je]
+;B[kf]BL[1132.007]CR[kf]
+;W[kd]WL[1488.26]CR[kd]
+;B[kc]BL[1115.489]CR[kc]
+;W[rs]WL[1484.564]CR[rs]
+;B[rq]BL[1108.369]CR[rq]
+;W[ap]WL[1482.446]CR[ap]
+;B[ao]BL[1106.245]CR[ao]
+;W[aq]WL[1480.453]CR[aq]
+;B[el]BL[1072.353]CR[el]
+;W[gm]WL[1478.912]CR[gm]
+;B[ca]BL[1028.171]CR[ca]
+;W[dm]WL[1477.564]CR[dm]
+;B[ek]BL[1015.285]CR[ek]
+;W[ba]WL[1476.088]CR[ba]
+;B[da]BL[1013.669]CR[da]
+;W[ok]WL[1474.024]CR[ok]
+;B[pk]BL[1004.646]CR[pk]
+;W[ld]WL[1472.134]CR[ld]
+;B[md]BL[998.826]CR[md]
+;W[bb]WL[1469.858]CR[bb]
+;B[jk]BL[963.552]CR[jk]
+;W[hh]WL[1468.57]CR[hh]
+;B[fh]BL[940.652]CR[fh]
+;W[op]WL[1467.028]CR[op]
+;B[gg]BL[931.154]CR[gg]
+;W[pq]WL[1465.406]CR[pq]
+;B[po]BL[926.618]CR[po]
+;W[lc]WL[1463.442]CR[lc]
+;B[lb]BL[921.9]CR[lb]
+;W[cm]WL[1460.436]CR[cm]
+;B[bm]BL[919.422]CR[bm]
+;W[on]WL[1458.651]CR[on]
+;B[ih]BL[890.776]CR[ih]
+;W[hg]WL[1455.611]CR[hg]
+;B[ki]BL[874.944]CR[ki]
+;W[jj]WL[1451.981]CR[jj]
+;B[ik]BL[865.067]CR[ik]
+;W[kj]WL[1448.094]CR[kj]
+;B[lj]BL[829.7]CR[lj]
+;W[lk]WL[1443.867]CR[lk]
+;B[li]BL[820.685]CR[li]
+;W[kk]WL[1439.235]CR[kk]
+;B[jm]BL[789.7]CR[jm]
+;W[pm]WL[1436.538]CR[pm]
+;B[pn]BL[780.657]CR[pn]
+;W[pl]WL[1434.788]CR[pl]
+;B[ql]BL[777.372]CR[ql]
+;W[ol]WL[1433.343]CR[ol]
+;B[qm]BL[770.988]CR[qm]
+;W[oo]WL[1431.996]CR[oo]
+;B[gl]BL[751.847]CR[gl]
+;W[hl]WL[1430.237]CR[hl]
+;B[fl]BL[742.006]CR[fl]
+;W[jl]WL[1425.857]CR[jl]
+;B[ff]BL[714.285]CR[ff]
+;W[eg]WL[1422.476]CR[eg]
+;B[ed]BL[709.275]CR[ed]
+;W[ee]WL[1419.41]CR[ee]
+;B[ef]BL[693.738]CR[ef]
+;W[cg]WL[1415.954]CR[cg]
+;B[jd]BL[682.202]CR[jd]
+;W[fj]WL[1412.697]CR[fj]
+;B[fi]BL[678.37]CR[fi]
+;W[im]WL[1410.065]CR[im]
+;B[bf]BL[655.421]CR[bf]
+;W[dk]WL[1405.372]CR[dk]
+;B[dj]BL[649.313]CR[dj]
+;W[kh]WL[1403.315]CR[kh]
+;B[of]BL[630.717]CR[of]
+;W[do]WL[1401.317]CR[do]
+;B[dn]BL[623.322]CR[dn]
+;W[em]WL[1399.855]CR[em]
+;B[fm]BL[616.498]CR[fm]
+;W[fn]WL[1398.501]CR[fn]
+;B[co]BL[524.22]CR[co]
+;W[sr]WL[1397.731]CR[sr]
+;B[sq]BL[521.841]CR[sq]
+;W[qs]WL[1397.104]CR[qs]
+;B[ss]BL[506.026]CR[ss]
+;W[cp]WL[1396.257]CR[cp]
+;B[bl]BL[494.456]CR[bl]
+;W[sr]WL[1395.787]CR[sr]
+;B[gn]BL[472.701]CR[gn]
+;W[hm]WL[1393.223]CR[hm]
+;B[ss]BL[470.589]CR[ss]
+;W[gc]WL[1392.209]CR[gc]
+;B[gb]BL[443.845]CR[gb]
+;W[sr]WL[1391.66]CR[sr]
+;B[kl]BL[425.405]CR[kl]
+;W[jn]WL[1390.055]CR[jn]
+;B[ss]BL[414.688]CR[ss]
+;W[og]WL[1389.039]CR[og]
+;B[me]BL[406.214]CR[me]
+;W[sr]WL[1387.957]CR[sr]
+;B[il]BL[396.522]CR[il]
+;W[jl]WL[1384.896]CR[jl]
+;B[ss]BL[395.251]CR[ss]
+;W[di]WL[1384.112]CR[di]
+;B[ei]BL[386.89]CR[ei]
+;W[sr]WL[1383.494]CR[sr]
+;B[eo]BL[376.775]CR[eo]
+;W[fo]WL[1381.954]CR[fo]
+;B[ss]BL[375.272]CR[ss]
+;W[cj]WL[1381.135]CR[cj]
+;B[bj]BL[372.36]CR[bj]
+;W[sr]WL[1380.536]CR[sr]
+;B[fp]BL[362.495]CR[fp]
+;W[ep]WL[1378.953]CR[ep]
+;B[ss]BL[360.762]CR[ss]
+;W[bn]WL[1378.292]CR[bn]
+;B[an]BL[358.601]CR[an]
+;W[sr]WL[1377.741]CR[sr]
+;B[go]BL[357.218]CR[go]
+;W[gp]WL[1376.762]CR[gp]
+;B[ss]BL[355.389]CR[ss]
+;W[am]WL[1376.098]CR[am]
+;B[al]BL[353.459]CR[al]
+;W[sr]WL[1375.579]CR[sr]
+;B[ad]BL[333.896]CR[ad]
+;W[af]WL[1374.827]CR[af]
+;B[ss]BL[332.016]CR[ss]
+;W[jh]WL[1374.199]CR[jh]
+;B[ab]BL[302.94]CR[ab]
+;W[ae]WL[1372.057]CR[ae]
+;B[be]BL[294.707]CR[be]
+;W[bd]WL[1370.284]CR[bd]
+;B[ag]BL[288.836]CR[ag]
+;W[ae]WL[1368.412]CR[ae]
+;B[af]BL[258.075]CR[af]
+;W[de]WL[1367.78]CR[de]
+;B[ac]BL[233.94]CR[ac]
+;W[bg]WL[1367.174]CR[bg]
+;B[ae]BL[231.943]CR[ae]
+(;W[ke]WL[1366.452]CR[ke]
+;B[sr]BL[198.784]CR[sr]
+;W[lh]WL[1365.791]CR[lh]C[Split [-\]: retarded robot....a19 not L15....
+]
+;B[]BL[181.323]
+;W[]WL[1365.791]TW[ih][ij][ik][jk][il][kl][ll][ml][nl][jm][km][lm][nm][om][gn][hn][in][kn][ln][mn][nn][eo][go][ho][io][jo][ko][lo][mo][fp][hp][ip][jp][kp][lp][mp][np][dq][eq][gq][hq][iq][jq][lq][mq][oq][ar][br][cr][dr][er][fr][gr][hr][ir][jr][kr][lr][mr][nr][or][as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls][ms][ns][os][ps]TB[ea][fa][ga][ha][ia][ja][ka][la][ma][na][oa][pa][qa][ra][sa][eb][fb][hb][ib][jb][kb][mb][nb][ob][pb][qb][rb][sb][gc][hc][ic][nc][oc][pc][rc][sc][nd][od][rd][sd][pe][qe][re][se][mf][nf][qf][rf][sf][og][pg][qg][rg][sg][nh][oh][qh][rh][sh][di][ni][oi][pi][qi][ri][si][aj][cj][qj][rj][sj][ak][bk][qk][rk][sk][rl][sl][am][rm][sm][bn][rn][sn][qo][ro][so][qp][rp][sp])
+(;W[aa]CR[aa]
+;B[ke]CR[ke]
+;W[bc]CR[bc]))
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_001.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_001.sgf
new file mode 100644 (file)
index 0000000..d063db0
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[ag][bg][cg][dg][dh][di][aj][bj][cj]
+AB[ai][bi][ci][dj][bk][dk][al][bl][cl][dl]
+C[Class 0 semiai.
+White outside libs= 2
+Black outside libs= 3
+Shared libs=0
+Black wins unconditionally. 
+Black to play pass.
+White has two ko threads in either A12, B12, C12. Value of the kothread 12 points.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_002.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_002.sgf
new file mode 100644 (file)
index 0000000..8167743
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[jo][ko][lo][jp][mp][jq][mq][jr][mr][js][ms]
+AB[mo][no][kp][lp][np][kq][nq][kr][nr][or][ks][os]
+C[Class 0 semiai.
+White outside libs= 1
+Blackk outside libs= 0
+Shared libs= 3
+Seki unconditionally. None of them have to play. If white playes Mi, i=1..3 black must answer O1.
+Black to play pass.
+White has one kothread in either Mi of value 10 points.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_003.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_003.sgf
new file mode 100644 (file)
index 0000000..7be1894
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[gm][hm][im][gn][jn][go][jo][ko][gp][kp][fq][gq][kq][fr][jr][kr][fs][js]
+AB[jm][km][lm][mm][in][mn][io][mo][ip][mp][hq][iq][mq][hr][mr][hs][ls][ms]
+C[Class 0 semiai.
+Blacks outside liberties=5, 
+Whites outside liberties=6. 
+Shared liberties= 4.
+If whites fills two outside liberties, black has to answer not before. If black fills four outside liberties white has to
+answer not before. Seki unconditionally. 
+Move to play for both: Pass.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_004.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_004.sgf
new file mode 100644 (file)
index 0000000..f001336
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[ai][bi][ci][di][ei][fi][gi][hi][ii][ji][ki][li][mi][ni][oi][pi][qi][ri][si][al][bl][cl][dl][el][fl][gl][hl][il][jl][kl][ll][ml][nl][ol][pl][ql][rl][sl]
+AB[ag][bg][cg][dg][eg][fg][gg][hg][ig][jg][kg][lg][mg][ng][og][pg][qg][rg][sg][aj][bj][cj][dj][ej][fj][gj][hj][ij][jj][kj][lj][mj][nj][oj][pj][qj][rj][sj]
+C[Class 0 semiai.
+The one who plays first win. Both 19 outside liberties and 0 shared liberties.
+Possible moves for black X12, X=A..T
+Possible moves for white X9, X=A..T
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_005.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_005.sgf
new file mode 100644 (file)
index 0000000..1fa971e
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[eh][ai][bi][ci][di][ei][fi][gi][hi][ii][ji][ki][li][mi][ni][oi][pi][qi][ri][si][hk][lk][al][bl][cl][dl][el][fl][gl][hl][il][jl][kl][ll][ml][nl][ol][pl][ql][rl][sl]
+AB[ag][bg][cg][dg][eg][fg][gg][hg][ig][jg][kg][lg][mg][ng][og][pg][qg][rg][sg][hh][kh][nh][aj][bj][cj][dj][ej][fj][gj][hj][ij][jj][kj][lj][mj][nj][oj][pj][qj][rj][sj][nk]
+C[Class 0 semiai.
+White outside libs= 15
+Black outside libs= 16
+Black wins unconditionally and has only to play if white plays first.
+Black to play pass.
+White has 15 ko threads of value 40 points.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_006.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_006.sgf
new file mode 100644 (file)
index 0000000..474f5c6
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[ba][ca][da][ea][eb][ec][ad][bd][cd][ed][ce][ee][cf][ef][dg][eg]
+AB[aa][ab][ac][bc][cc][dc][dd][de][af][df][ag][bg][cg][ch][dh][eh][ei][ej][ek]
+C[Class 0 semiai.
+White outside libs= Black outside libs=3
+Shared libs=0
+The one who plays first wins.
+Possible black moves: A15, B15, B14
+Possible white moves: B18,C18,D18
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_007.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_007.sgf
new file mode 100644 (file)
index 0000000..88c93d6
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 3
+Shared libs= 2
+Seki unconditionally.
+If one fills one outside lib the other has to answer by doing the same.
+Black and white to play pass.
+Both have 3 ko threads of value 16 for white and 14 for black.
+]
+;
+AW[jf][kf][lf][mf][nf][ig][lg][hh][ih][lh][hi][li][gj][hj][lj][gk][kk][lk][hl][il][jl][kl][hm][hn][ho]
+AB[gf][hf][if][fg][gg][jg][kg][fh][jh][fi][ji][fj][jj][fk][hk][ik][jk][fl][gl]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 3
+Shared libs= 2
+Seki unconditionally.
+If one fills one outside lib the other has to answer by doing the same.
+Black and white to play pass.
+Both have 3 ko threads of value 16 for white and 14 for black.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_008.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_008.sgf
new file mode 100644 (file)
index 0000000..2c5c190
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 2
+Shared libs= 2
+If white goes first wins, if black goes first seki.
+White to play: M10, M12
+Black to play: H11, H12, J13
+]
+;
+AW[kf][lf][mf][nf][of][jg][mg][ih][jh][mh][ii][mi][hj][ij][mj][hk][lk][mk][il][jl][kl][ll][im][in][io]
+AB[hf][if][jf][gg][hg][kg][lg][gh][kh][gi][ki][li][gj][kj][gk][ik][jk][kk][gl][hl]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 2
+Shared libs= 2
+If white goes first wins, if black goes first seki.
+White to play: M10, M12
+Black to play: H11, H12, J13
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_009.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_009.sgf
new file mode 100644 (file)
index 0000000..d11791e
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 3
+Shared libs=1
+The one who plays first wins.
+Possible white moves: Mi, i=10..12
+Possible black moves: H11, H12, J13
+]
+;
+AW[kf][lf][mf][nf][of][jg][mg][ih][jh][mh][ii][mi][hj][ij][jj][mj][hk][lk][mk][il][jl][kl][ll][im][in][io]
+AB[hf][if][jf][gg][hg][kg][lg][gh][kh][gi][ki][gj][kj][gk][ik][jk][kk][gl][hl]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 3
+Shared libs=1
+The one who plays first wins.
+Possible white moves: Mi, i=10..12
+Possible black moves: H11, H12, J13
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_010.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_010.sgf
new file mode 100644 (file)
index 0000000..7174af8
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[fe][ge][he][ff][if][jf][fg][jg][fh][jh][fi][gi][ji][hj][ij][jj]
+AB[ie][je][ke][hf][kf][lf][hg][lg][hh][ih][lh][hi][ii][li][gj][lj][gk][hk][ik][jk][kk][lk]
+C[Class 0 semiai.
+White outside libs= 4
+Black outside libs= 3
+Shared libs=1
+White wins unconditionally.
+White to play pass.
+Black has 4 ko threats in Li, i=10..13.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_011.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_011.sgf
new file mode 100644 (file)
index 0000000..00363e4
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[fe][ge][he][ff][if][jf][fg][jg][fh][jh][fi][gi][ji][hj][ij][jj]
+AB[ie][je][ke][hf][kf][lf][hg][lg][hh][ih][lh][hi][ii][ki][li][gj][lj][gk][hk][ik][jk][kk][lk]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 3
+Shared libs= 1
+The one who plays first wins.
+Possible white moves= G12, G13, G14.
+Possible black moves= L10, L12, L13.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_012.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_012.sgf
new file mode 100644 (file)
index 0000000..fb630a0
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[fe][ge][he][ff][if][jf][fg][jg][kg][fh][jh][fi][gi][ji][hj][ij][jj]
+AB[ie][je][ke][hf][kf][lf][hg][lg][hh][ih][lh][hi][ii][li][gj][lj][gk][hk][ik][jk][kk][lk]
+C[Class 0 semiai.
+White outside libs= 3
+Black outside libs= 3
+Shared libs= 1
+The one who plays first wins.
+Possible white moves: G12, G13, G14.
+Possible black moves: L10, L11, L12.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C0_013.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C0_013.sgf
new file mode 100644 (file)
index 0000000..51d89bf
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[ag][bg][cg][dg][bh][dh][di][aj][bj][cj]
+AB[ai][bi][ci][dj][bk][dk][al][bl][cl][dl]
+C[Class 0 semiai.
+White outside libs= 2
+Black outside libs= 2
+Shared libs= 0
+The one who plays first wins.
+Possible white moves: A12, C12.
+Possible black moves: A9, C9
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_001.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_001.sgf
new file mode 100644 (file)
index 0000000..dcef756
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-07]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Semiai Class 1. Different eye status never seki.
+North: Black plays and loose
+West: Black plays and wins, White plays and wins
+South: Black plays and wins, White plays and wins
+West: Black plays and wins, white plays and wins
+]
+AW[da][ga][ka][na][db][kb][nb][dc][ic][jc][kc][lc][mc][nc][dd][ed][fd][gd][hd][jd][kd][qe][re][se][af][bf][cf][df][qf][dg][pg][qg][dh][ph][qh][rh][sh][ai][di][pi][dj][oj][ck][ok][pk][cl][pl][sl][am][bm][cm][pm][cn][pn][qn][co][qo][ro][so][ap][bp][cp][fp][gp][hp][ip][jp][fq][kq][lq][mq][nq][oq][pq][fr][mr][pr][fs][is][ms][ps]
+AB[ea][ia][pa][eb][hb][ib][pb][ec][fc][gc][hc][pc][qc][rc][sc][id][od][pd][ie][je][ke][le][me][ne][oe][of][ag][bg][cg][og][ch][oh][ci][oi][bj][cj][pj][qj][rj][sj][ak][bk][dk][ek][qk][el][ql][dm][em][qm][rm][dn][rn][sn][do][ko][lo][mo][no][dp][kp][np][op][pp][qp][rp][dq][gq][hq][iq][jq][rq][ar][br][cr][dr][gr][jr][kr][rr][gs][ks][ns][rs]
+PL[W]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_002.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_002.sgf
new file mode 100644 (file)
index 0000000..f972af6
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-07]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[aa][ba][ca][qa][ra][sa][ab][cb][qb][sb][cc][qc][cd][qd][ce][qe][cf][qf][sf][ag][bg][cg][qg][qh][rh][sh][ql][rl][sl][am][bm][cm][qm][cn][qn][sn][co][qo][cp][qp][cq][qq][ar][cr][qr][sr][as][bs][cs][qs][rs][ss]
+AB[ea][oa][bb][eb][ob][rb][bc][dc][ec][oc][pc][rc][ad][bd][dd][pd][rd][sd][be][de][pe][re][af][bf][df][pf][rf][dg][pg][rg][sg][ah][bh][ch][dh][ph][pi][qi][ri][si][pk][qk][rk][sk][al][bl][cl][dl][pl][dm][pm][rm][sm][an][bn][dn][pn][rn][bo][do][po][ro][ap][bp][dp][pp][rp][sp][bq][dq][pq][rq][br][dr][er][or][pr][rr][es][os]
+C[Semiai Class 1
+NE NW: The one who plays first wins
+SE SW: Black wins unconditionally. Both to play pass.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_003.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_003.sgf
new file mode 100644 (file)
index 0000000..a413f54
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-07]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Semiai Class 1 Different eye status never seki.
+
+NW: White plays only A16 and lives, Black plays and wins
+
+SE: Black plays and wins. White plays and wins.
+]
+PL[B]
+AW[ca][fa][ga][bb][cb][db][fb][cc][fc][ed][fd][ae][be][ce][de][ee][bf][bg][bh][ai][bi][aj][sm][pn][qn][rn][sn][oo][po][op][oq][rq][kr][lr][mr][nr][or][js][ks][os]
+AB[aa][da][ea][ha][ab][eb][gb][hb][ac][bc][dc][ec][gc][bd][cd][dd][gd][fe][ge][ef][ff][ag][dg][eg][dh][di][cj][dj][ak][bk][ck][ol][pl][ql][rl][sl][nm][om][rm][mn][nn][mo][qo][ro][so][jp][kp][lp][mp][pp][qp][sp][iq][jq][pq][ir][pr][qr][is][ms][qs][rs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_004.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_004.sgf
new file mode 100644 (file)
index 0000000..5fab130
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];PL[B]
+C[Semiai Class 1. Same eye status. Size eye=1
+NW: Seki unconditionally both to play pass.
+SW: White plays A5, B5 and wins. Black plays C3, C2 and seki.
+SE: The one who plays first captures and wins.
+NE: Seki unconditionally. Both to play pass. Never play T15.
+]
+AW[ab][bb][rb][sb][bc][rc][ad][bd][cd][rd][sd][de][qe][df][qf][dg][qg][dh][qh][ai][bi][ci][di][pi][qi][ri][si][bj][dj][pj][rj][ak][bk][ck][qk][rk][sk][cl][ql][cm][dm][pm][qm][dn][pn][do][po][ro][ap][bp][cp][qp][rp][sp][bq][rq][ar][br][rr][sr]
+AB[aa][ba][ca][da][fa][oa][qa][ra][sa][db][eb][fb][ob][pb][qb][dc][fc][oc][qc][dd][ed][pd][qd][ce][re][af][bf][cf][rf][sf][bg][rg][ah][bh][rh][sh][al][bl][rl][sl][bm][rm][an][bn][cn][qn][rn][sn][co][qo][so][dp][ep][pp][dq][fq][oq][pq][qq][dr][er][fr][nr][or][qr][as][bs][cs][ds][fs][ns][ps][qs][rs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_005.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_005.sgf
new file mode 100644 (file)
index 0000000..b7ad903
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Semiai Class 1. Same eye status. Eye size = 2.
+NW: First to play wins. Play inside the eye.
+SW: White plays and seki (A4|B4|A6|A7). Black plays and seki. So both to play pass.
+SE: Black plays T4 and wins. White plays (T6|T7) and seki.
+NE: Both to play pass and seki. If they play they die.
+]
+PL[B]
+AW[ba][ra][bb][rb][ac][bc][qc][rc][sc][cd][pd][sd][ce][pe][cf][pf][qf][cg][qg][sg][ah][bh][ch][qh][bi][di][qi][ri][si][bj][dj][pj][rj][ak][bk][ck][dk][pk][qk][rk][sk][cl][ql][cm][qm][cn][dn][pn][qn][do][po][dp][pp][rp][aq][bq][cq][qq][rq][sq][br][rr][bs][rs]
+AB[ca][ea][oa][qa][sa][cb][db][eb][nb][pb][qb][cc][ec][nc][oc][pc][ad][bd][dd][ed][qd][be][qe][re][se][bf][rf][ag][bg][rg][rh][sh][al][bl][rl][sl][bm][rm][bn][rn][ao][bo][co][qo][ro][so][cp][ep][fp][np][op][qp][dq][fq][nq][pq][dr][er][fr][nr][or][pr][qr][as][ds][fs][os][qs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_006.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_006.sgf
new file mode 100644 (file)
index 0000000..5a8da7e
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Class 1 semiai. Same eye status. Eye size=3
+NW: The one who plays first wins.
+SW: White plays and wins (C6|C7), Black plays and seki (E1|E2).
+SE: White plays and wins (T4), Black plays and seki (T2|R2).
+NE: Unexpected behaviour of the program. Black can kill in S18 and live in T13. S18 would be desirable.
+        White can live in S18 and make a seki in T13. Both options are equivalent for white.
+Center: Black can kill playing H12. White can kill by living playing also in H12. Unexpected result.
+]
+PL[B]
+AW[aa][ba][ca][da][qa][sa][db][qb][sb][ac][bc][cc][dc][qc][sc][ed][od][pd][qd][rd][sd][ce][de][ee][ie][je][ke][le][me][oe][af][cf][if][nf][cg][gg][hg][ig][jg][ng][og][pg][qg][ch][gh][jh][lh][ph][ci][di][ei][gi][ii][ji][oi][pi][aj][bj][cj][ej][gj][hj][ij][jj][pj][qj][rj][sj][ck][dk][ek][kk][lk][mk][nk][ok][qk][cl][el][pl][ql][am][dm][em][nm][om][qm][sm][an][dn][en][mn][on][pn][qn][sn][eo][mo][no][oo][bp][cp][ep][op][aq][bq][cq][dq][pq][qq][rq][sq][dr][pr][as][bs][cs][ds][ps][qs][rs][ss]
+AB[fa][ga][ma][pa][bb][fb][hb][mb][nb][pb][ec][fc][gc][ic][mc][oc][pc][ad][bd][cd][dd][fd][gd][hd][id][jd][kd][ld][md][nd][be][fe][he][ne][re][se][bf][ff][gf][kf][lf][mf][of][pf][qf][rf][bg][fg][kg][mg][rg][ah][bh][fh][kh][mh][rh][fi][ki][mi][ri][si][fj][kj][lj][mj][nj][ak][bk][fk][gk][hk][ik][jk][rk][sk][bl][fl][rl][bm][fm][rm][bn][fn][rn][ao][bo][co][do][fo][po][qo][ro][so][dp][fp][gp][pp][qp][rp][eq][fq][hq][mq][nq][oq][br][fr][gr][hr][lr][mr][or][rr][fs][hs][ls][ns][os]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_007.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_007.sgf
new file mode 100644 (file)
index 0000000..848a5cd
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Class Semiai 1. Same eye status. Eye size == 4.
+
+NW: Black plays and wins (A18|A17|B18|B17). White plays and wins (C14|C13) also possible (A11|A14) though not recommended.
+
+SW: Black plays (A5|B5) and seki. White plays J1 and wins.
+
+SE: Black plays R6 and wins, (T5|T8) also possible but not recommendable. White plays and seki (O2|O1).
+
+NE: The one who plays loose. NOBODY should play. Passing grants seki. So white (!T18) Black (!P19)
+
+Center: Black plays (P12|P11|O10|M9) (moves inside the eye or in the shared liberties also possible when winning but not recommended) and wins. White plays and seki
+(J15|H15|F14|E13|E12|F10).
+]
+PL[W]
+AW[aa][ba][ca][ha][ja][la][ma][na][ra][sa][cb][hb][ib][jb][qb][rb][cc][hc][jc][kc][lc][mc][nc][oc][qc][ad][bd][cd][gd][hd][id][jd][od][qd][rd][de][ee][fe][ge][je][oe][pe][re][se][df][ef][kf][lf][mf][ag][dg][kg][mg][ng][ah][ch][dh][hh][kh][nh][ci][ei][ki][mi][ni][cj][dj][ej][jj][kj][lj][mj][ak][bk][ck][ek][fk][gk][hk][jk][kk][rk][sk][cl][dl][hl][il][rl][rm][rn][eo][fo][go][ho][io][po][qo][ro][ap][bp][ep][ip][jp][kp][pp][rp][sp][bq][eq][iq][kq][mq][nq][oq][br][cr][dr][gr][ir][jr][kr][lr][mr][cs][gs][js][ms][qs]
+AB[da][ea][ga][ka][pa][db][fb][gb][kb][lb][mb][nb][ob][pb][dc][ec][fc][pc][rc][sc][dd][pd][sd][ae][be][ce][ke][le][me][ne][qe][bf][gf][hf][if][jf][nf][of][pf][qf][rf][sf][bg][fg][gg][ig][og][rg][bh][fh][ih][lh][mh][ph][rh][bi][fi][gi][ii][pi][ri][aj][bj][gj][hj][ij][oj][pj][qj][rj][sj][ik][mk][nk][ok][qk][al][bl][el][fl][jl][kl][ll][ml][ol][pl][ql][bm][dm][fm][om][qm][sm][an][bn][cn][dn][en][fn][on][pn][sn][co][oo][cp][fp][gp][hp][op][cq][dq][fq][hq][pq][qq][rq][ar][er][fr][hr][or][pr][rr][sr][as][es][hs][os][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_008.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_008.sgf
new file mode 100644 (file)
index 0000000..8648b87
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Semiai class 1. Same eye status. Eye size = 5
+
+NW: The one who plays first wins. Black to play B19 but NEVER B18. White to play B13 or A14.
+
+SW: Though playing C1 unsettles the nakade, the semiai is won for white. So black looses and plays pass and white wins unconditionally and plays pass.
+
+SE: White plays T3 and achieves seki. Black wins by living himself or by filling the eye espace. He should clearly live and avoid derived further ko threads of winning the semiai by killing. So black also to play T3
+
+NE: Black plays and seki (T16|T18|S17) S16 possible but not recommended. White plays and also seki. So both TO PLAY PASS.
+
+Center: Black plays and seki. White plays and seki. So both to play Pass.
+]
+PL[W]
+AW[aa][ea][ka][ra][sa][ab][db][eb][kb][mb][qb][rb][ac][bc][cc][dc][ec][kc][qc][dd][kd][qd][be][ee][fe][ge][he][ie][je][ke][pe][qe][re][se][bf][cf][ef][gf][kf][lf][mf][nf][of][eg][fg][gg][mg][dh][fh][nh][ai][bi][ci][di][ei][fi][ji][ni][dj][fj][nj][dk][fk][ik][jk][kk][nk][al][bl][cl][dl][gl][hl][il][kl][ll][ml][pl][ql][rl][sl][dm][em][hm][lm][pm][rm][en][hn][in][kn][ln][qn][rn][sn][bo][eo][fo][jo][ko][po][fp][np][op][pp][bq][cq][dq][eq][mq][nq][pq][ar][br][er][fr][mr][pr][as][es][ms][ps]
+AB[ca][da][fa][ha][la][oa][pa][cb][fb][gb][hb][lb][ob][fc][hc][lc][nc][oc][sc][ad][bd][cd][ed][fd][gd][hd][ld][md][nd][od][ae][ce][de][oe][df][pf][qf][rf][sf][ag][cg][dg][hg][ig][jg][kg][pg][rg][ah][bh][ch][hh][kh][lh][ph][qh][rh][sh][hi][li][gj][hj][ij][jj][kj][lj][mj][gk][mk][fl][nl][am][bm][cm][fm][jm][nm][cn][dn][fn][gn][nn][on][pn][do][go][ho][mo][no][oo][qo][ro][so][ap][bp][cp][dp][ep][gp][ip][lp][mp][qp][fq][gq][hq][iq][jq][kq][lq][qq][gr][ir][lr][or][qr][rr][gs][hs][ls][rs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_009.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_009.sgf
new file mode 100644 (file)
index 0000000..27b92a4
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];;
+C[Semiai Class 1. Same eye status. Size eye = 6
+
+NW: Black plays (B14|C14) and wins. White plays (G15|H15|K19|K18) and seki.
+
+SW: Black plays D6 and wins. White plays (C3|B4) and seki.
+
+SE: White wins unconditionally. Both to play pass.
+
+NE: Seki unconditionally both to play pass.
+]
+PL[B]
+AW[aa][ba][ca][ka][sa][cb][db][gb][kb][ob][sb][dc][jc][kc][lc][sc][ad][cd][dd][id][jd][ld][rd][sd][ae][be][ce][de][ee][ie][ke][me][ne][oe][pe][qe][re][af][ff][gf][hf][if][jf][kf][mf][nf][pf][qf][mg][qg][mh][ph][qh][mi][ni][oi][aj][bj][cj][ak][ck][dk][qk][rk][sk][dl][pl][ql][cm][dm][em][pm][an][bn][cn][en][on][pn][qn][sn][fo][no][po][qo][ro][so][fp][gp][mp][np][aq][bq][eq][fq][hq][iq][jq][kq][lq][mq][ar][br][er][fr][gr][hr][mr][qr][es][gs][ms]
+AB[ea][fa][ia][ma][na][pa][qa][eb][ib][mb][qb][bc][ec][fc][hc][ic][mc][pc][qc][fd][gd][hd][md][nd][od][pd][fe][le][df][ef][lf][sf][ag][bg][cg][dg][lg][og][rg][sg][bh][dh][kh][lh][rh][ai][bi][ci][di][ki][pi][qi][ri][si][dj][fj][kj][lj][oj][pj][qj][bk][ek][gk][lk][mk][nk][ok][pk][al][bl][cl][el][gl][ll][ml][nl][bm][fm][lm][nm][rm][fn][ln][mn][nn][ao][bo][co][do][eo][oo][ap][cp][dp][ep][op][pp][qp][rp][dq][oq][pq][rq][sq][cr][dr][or][sr][as][bs][cs][ds][ns][os][ps][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_010.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_010.sgf
new file mode 100644 (file)
index 0000000..1bc9ece
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Semiai Class 1. Same eye status. Size eye = 7, Very important how to fill the eye if it is unsettled. This test is about unsettled 7 and how to fill the eye.
+
+NW: Black wins if he unsettles the nakade. White wins if he achieves seki. Black to play 
+(C18|B17|D17) but NOT (B18|D16). White achieves seki in (C1|B17|D17) but NOT (B18|D16).
+
+SW: Black is alive in seki. White has only one eye and cant make seki. So Black wins the semiai unconditionally. Both to play pass.
+]
+PL[W]
+AW[aa][ba][ca][da][ab][db][eb][ac][ec][ad][bd][ed][be][ce][de][ee][df][bg][eg][bh][eh][bi][ei][ej][ek][al][bl][cl][dl][el][bm][dm][an][bn][cn][ao][co][do][eo][fp][gp][hp][ip][fq][iq][jq][cr][fr][jr][fs][gs][js]
+AB[ea][fa][ha][fb][gb][hb][cc][fc][hc][cd][fd][gd][hd][ae][fe][af][bf][cf][ef][ff][cg][dg][dh][ai][di][aj][bj][cj][dj][fo][go][ho][io][jo][bp][cp][dp][ep][jp][kp][aq][bq][eq][kq][ar][er][gr][hr][kr][as][ds][es][hs][ks]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_011.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_011.sgf
new file mode 100644 (file)
index 0000000..e814d10
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Semiai Class 1. Same eye status. Size eye = 7, Very important how to fill the eye if it is unsettled. This test is not about unsettled 7 space eyes but about how to win those semiais regardless the eye. 
+
+NW: Black to play (E19|F18|F17), playing inside the eye or in the shared libs also works but not recommendable, and win. White to play T16(F12|F11|F10|F9|E8|D8) and seki, Playing inside the eye also works but not recommendable.
+
+SW: Black plays E1 and wins. White plays B2 and seki.
+
+SE: Black plays and seki. White plays and seki. Seki unconditionally. Both to play pass.
+
+NE: The one who plays first wins. Black to play (N17|L16) though in this case N18 would work it SHOULDNT play there. White to play (Q17|R16) though T18 would work it is NOT a good idea.
+]
+PL[B]
+AW[aa][ba][ca][da][ka][la][ma][na][oa][ab][db][eb][jb][kb][nb][qb][rb][ac][ec][jc][nc][qc][rc][ad][bd][ed][jd][md][nd][be][ce][de][ee][je][ke][le][me][ne][oe][se][bf][ff][mf][nf][qf][sf][fg][gg][og][pg][qg][rg][sg][gh][ph][ci][di][gi][pi][qi][ri][si][cj][dj][gj][pj][rj][gk][pk][qk][rk][sk][al][bl][cl][gl][pl][bm][dm][em][fm][gm][om][an][bn][cn][dn][on][eo][no][oo][qo][ro][so][ap][bp][ep][gp][hp][ip][jp][lp][mp][np][op][rp][sp][aq][bq][cq][eq][fq][gq][jq][lq][oq][pq][er][fr][jr][lr][pr][fs][gs][js][ls][os][ps][qs][rs][ss]
+AB[fa][ga][ia][ja][pa][qa][ra][sa][cb][gb][hb][ib][lb][ob][pb][cc][gc][ic][kc][lc][oc][sc][cd][fd][gd][hd][id][ld][od][pd][rd][sd][ae][fe][ie][pe][qe][re][af][ef][if][jf][kf][lf][of][pf][rf][ag][bg][cg][dg][eg][lg][mg][ng][ah][bh][dh][eh][ai][ei][aj][ej][ak][bk][ck][dk][ek][hk][ik][jk][hl][jl][ml][nl][ol][hm][im][jm][mm][pm][qm][rm][sm][en][fn][gn][hn][jn][kn][ln][mn][pn][sn][ao][bo][co][do][fo][go][ho][io][jo][ko][po][cp][dp][fp][kp][pp][qp][dq][hq][iq][kq][nq][qq][rq][sq][ar][dr][gr][hr][ir][kr][mr][nr][as][bs][cs][ds][hs][ks][ns]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_012.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_012.sgf
new file mode 100644 (file)
index 0000000..594e2c8
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Semiai class 1. Very different eye status.
+
+NW: Black plays and wins (B17|D17). White plays and wins (G19|J17|K17|L17|M17|G16|G15|G14|F13|E13|D13|C13|B13|A13).
+
+SE: Black plays and wins (T5|S6). White plays and wins
+(B3|C3|D3|D4|D5|E6|F5|F4|F3|G3|H3|J3|J1|K4|L4)
+]
+PL[B]
+AW[aa][ba][ca][da][ha][ia][ja][ka][la][ma][ab][db][eb][mb][ac][ec][gc][hc][mc][ad][bd][ed][hd][id][jd][kd][ld][md][be][ce][de][ee][he][je][hf][if][jf][gg][hg][jg][ah][bh][ch][dh][eh][fh][gh][ih][jh][cl][dl][el][fl][gl][cm][em][gm][cn][dn][fn][gn][kn][ln][mn][nn][co][go][io][jo][ko][lo][oo][po][qo][ro][ap][bp][cp][gp][hp][ip][lp][op][rp][sp][aq][oq][sq][ar][or][pr][sr][as][bs][cs][ds][es][fs][gs][hs][ps][qs][rs][ss]
+AB[ea][fa][cb][fb][gb][hb][ib][jb][kb][lb][cc][fc][cd][fd][ae][fe][af][bf][cf][df][ef][ff][qk][rk][ol][pl][ql][sl][om][qm][rm][sm][on][pn][qn][sn][eo][mo][no][ep][mp][qp][eq][jq][kq][lq][mq][qq][br][cr][dr][er][fr][gr][hr][ir][jr][mr][qr][js][ms][ns]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_013.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_013.sgf
new file mode 100644 (file)
index 0000000..9d8bad7
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Semiai class 1. Very different eye status.
+
+NW:  White wins unconditionally. Both to play pass.
+
+SE: White wins unconditionally. Both to play pass.
+]
+PL[B]
+AW[aa][ba][ca][da][ha][ia][ja][ka][la][ma][ab][db][eb][mb][ac][ec][hc][mc][ad][bd][ed][hd][id][jd][kd][ld][md][be][ce][de][ee][he][je][hf][if][jf][gg][hg][jg][ah][bh][ch][dh][eh][fh][gh][ih][jh][cl][dl][el][fl][gl][cm][em][gm][cn][dn][en][fn][gn][kn][ln][mn][nn][co][go][io][jo][ko][lo][oo][po][qo][ro][ap][bp][cp][gp][hp][ip][lp][op][rp][sp][aq][oq][sq][ar][or][pr][sr][as][bs][cs][ds][es][fs][gs][hs][ps][qs][rs][ss]
+AB[ea][fa][ga][cb][fb][gb][hb][ib][jb][kb][lb][cc][fc][jc][cd][fd][ae][fe][af][bf][cf][df][ef][ff][qk][rk][ol][pl][ql][sl][om][qm][rm][sm][on][pn][qn][sn][eo][mo][no][ep][mp][qp][eq][jq][kq][lq][mq][qq][br][cr][dr][er][fr][gr][hr][ir][jr][mr][qr][js][ms][ns]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_014.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_014.sgf
new file mode 100644 (file)
index 0000000..36855f9
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Semiai class 1. Very different eye status.
+
+NW: Black wins unconditionally. Both to play pass.
+
+SE: Black wins unconditionally. Both to play pass.
+]
+PL[W]
+AW[aa][ba][ca][da][ha][ia][ja][ka][la][ma][ab][db][eb][mb][ac][ec][mc][ad][bd][ed][hd][id][jd][kd][ld][md][be][ce][de][ee][he][je][hf][if][jf][gg][hg][jg][ah][bh][ch][dh][eh][fh][gh][ih][jh][cl][dl][el][fl][gl][cm][em][gm][cn][dn][en][fn][gn][kn][ln][mn][nn][co][go][io][jo][ko][lo][oo][po][qo][ro][ap][bp][cp][gp][hp][ip][op][rp][sp][aq][oq][sq][ar][or][pr][sr][as][bs][cs][ds][es][fs][gs][hs][ps][qs][rs][ss]
+AB[ea][fa][cb][fb][gb][hb][ib][jb][kb][lb][cc][fc][jc][cd][fd][ae][fe][af][bf][cf][df][ef][ff][qk][rk][ol][pl][ql][sl][om][qm][rm][sm][on][pn][qn][sn][eo][mo][no][ep][mp][qp][eq][jq][kq][lq][mq][qq][br][cr][dr][er][fr][gr][hr][ir][jr][mr][qr][js][ms][ns][os]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_015.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_015.sgf
new file mode 100644 (file)
index 0000000..4144ad6
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-15]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[fa][ga][ha][ia][bb][cb][fb][ib][jb][bc][cc][dc][fc][jc][cd][fd][gd][jd][ge][he][ie][je][af][bf][cf][df][ff][bg][dg][eg][fg][ah][bh][ch][dh]
+AB[aa][ba][ca][da][ja][ka][ma][ab][db][eb][kb][lb][mb][ac][ec][hc][kc][mc][ad][ed][kd][ld][md][ae][be][ce][de][ee][fe][ke][gf][hf][if][jf][kf]
+C[Semiai Class 1. Eye size 7 & 8.
+Both groups are alive. Both to play pass "seki".
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_016.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_016.sgf
new file mode 100644 (file)
index 0000000..4b63e3a
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Testing eye shapes of size 6.
+NW: Black to play and kill, white to capture the eye.
+NE: Both to play T17 to win the semiai.
+SE White alive and winner. Both to play pass.
+SW: White has to realize that he kills by living. Black to kill. Both to play B3.
+Center: both to play J11.
+]
+AW[ca][ga][ja][ma][na][qa][ra][sa][ab][cb][db][gb][jb][mb][qb][ac][dc][fc][gc][jc][pc][qc][ad][cd][dd][fd][jd][pd][sd][ae][be][ce][fe][ge][he][ie][je][ke][le][me][pe][qe][re][se][ef][mf][ag][bg][cg][dg][eg][ng][dh][gh][hh][ih][jh][kh][nh][oh][ph][qh][rh][sh][di][gi][ki][ni][dj][gj][kj][nj][dk][gk][hk][ik][jk][kk][nk][dl][nl][ol][pl][ql][rl][sl][am][bm][cm][dm][em][mm][nm][en][fn][gn][hn][in][jn][kn][ln][mn][ao][bo][co][eo][mo][po][qo][ro][so][cp][ep][mp][pp][sp][cq][eq][fq][mq][pq][qq][cr][fr][mr][qr][as][bs][cs][fs][ms][qs][rs][ss]
+AB[aa][ba][da][ea][la][pa][bb][eb][lb][nb][ob][pb][rb][bc][ec][lc][mc][nc][oc][rc][bd][ed][od][rd][de][ee][oe][af][bf][cf][df][of][pf][qf][rf][sf][fg][gg][hg][ig][jg][kg][lg][fh][lh][fi][li][fj][ij][jj][lj][fk][lk][fl][gl][hl][il][jl][kl][ll][an][bn][cn][dn][on][pn][qn][rn][sn][do][oo][ap][bp][dp][op][qp][rp][aq][dq][oq][rq][ar][br][dr][or][rr][ds][os]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_017.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_017.sgf
new file mode 100644 (file)
index 0000000..43903b0
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[aa][ba][ca][ja][qa][ra][sa][cb][db][jb][pb][qb][dc][ic][jc][kc][pc][ad][cd][dd][gd][hd][id][kd][ld][md][pd][qd][sd][ae][be][ce][ge][je][me][qe][re][se][ff][gf][hf][if][mf][nf][eg][fg][ng][og][ah][bh][ch][dh][eh][oh][ph][qh][rh][sh][am][bm][cm][dm][em][fm][fn][gn][go][ho][bp][cp][dp][hp][ip][jp][aq][bq][dq][eq][jq][kq][ar][er][kr][as][ds][es][ks]
+AB[da][ea][ha][la][oa][pa][ab][eb][fb][gb][hb][lb][mb][nb][ob][rb][sb][bc][ec][oc][sc][ed][od][de][ee][oe][pe][af][bf][cf][df][pf][qf][rf][sf][ao][bo][co][do][eo][ap][ep][fp][fq][cr][fr][gr][hr][ir][bs][cs][fs][is]
+C[Extreme nakade situations for size 6 eye.
+NW: White is alive. Both to play pass. Not a class 2 semiai. Unexpected result
+NE: Both to play S17 and win.
+SE: Both to play B2 and win.
+]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_018.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_018.sgf
new file mode 100644 (file)
index 0000000..bf1ce88
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Extreme nakade situations for size 6 eye.
+NE: White is alive. Both to play pass.
+NW: Both to play C17 and win.
+SE: Both to play C2 and win.
+]
+AW[aa][ba][ca][ja][qa][ra][sa][ab][cb][db][eb][jb][ob][pb][qb][sb][ec][ic][jc][kc][oc][ad][cd][dd][ed][hd][id][kd][ld][od][pd][qd][sd][ae][be][ce][he][je][le][qe][re][se][gf][hf][if][lf][mf][eg][fg][gg][mg][ng][og][ah][bh][ch][dh][eh][oh][ph][qh][rh][sh][al][bl][cl][dl][el][fl][fm][gm][gn][bo][co][do][go][ho][bp][dp][hp][ip][jp][aq][bq][dq][eq][jq][kq][ar][er][kr][as][bs][ds][es][ks]
+AB[da][ea][fa][ha][la][na][oa][pa][fb][gb][hb][lb][mb][nb][ac][bc][fc][nc][pc][qc][rc][bd][fd][nd][de][ee][fe][ne][oe][pe][af][bf][cf][df][pf][qf][rf][sf][an][bn][cn][dn][en][ao][eo][ap][ep][fp][cq][fq][fr][gr][hr][ir][fs][is]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_019.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_019.sgf
new file mode 100644 (file)
index 0000000..8876069
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Extreme nakade situations for size 6 eye.
+NW: Both to play B17 and win
+NE: Both to play S18|T16 and win.
+SW: White unconditionally alive.
+SE: Both to play R3 and win.
+Center: Both to play K9 and win.
+]
+AW[aa][ba][ca][ja][qa][ra][sa][cb][db][jb][pb][qb][cc][dc][ic][jc][kc][pc][qc][cd][dd][gd][hd][id][ld][md][pd][qd][ae][be][ce][ge][je][ke][le][me][qe][re][se][ff][gf][hf][if][mf][nf][eg][fg][ng][og][ah][bh][ch][dh][eh][jh][kh][lh][oh][ph][qh][ei][hi][ii][ji][li][oi][qi][ri][si][ej][hj][lj][oj][ek][hk][kk][lk][ok][el][hl][il][jl][kl][ol][am][bm][cm][dm][em][nm][om][pm][qm][rm][sm][fn][ln][mn][nn][go][ho][ko][mo][bp][cp][dp][hp][ip][jp][lp][mp][pp][qp][rp][sp][aq][bq][cq][dq][eq][jq][kq][lq][pq][sq][ar][er][kr][pr][as][es][ks][ps][qs][rs]
+AB[da][ea][ha][la][oa][pa][eb][fb][gb][hb][lb][mb][nb][ob][sb][ac][ec][oc][rc][sc][ed][od][rd][de][ee][oe][pe][af][bf][cf][df][pf][qf][rf][ig][jg][kg][lg][mg][rg][sg][gh][hh][ih][mh][gi][mi][gj][ij][jj][kj][mj][gk][mk][gl][ll][ml][gm][hm][im][jm][km][lm][ao][bo][co][do][eo][oo][po][qo][ro][so][ap][ep][fp][op][fq][oq][rq][fr][gr][hr][ir][mr][nr][or][qr][rr][sr][fs][is][ms][os][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_020.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_020.sgf
new file mode 100644 (file)
index 0000000..adf13ad
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Extreme nakade situations for size 6 eye. t112233alfa
+NW: Both to play A18 and live
+NE: White unconditionally dead
+SW: Both to play C2 and win
+SE: Both to play R3 and win.
+Center: Black wins unconditionally since white cant play the vital point.
+]
+AW[aa][ba][ca][da][ja][pa][qa][ra][sa][db][jb][pb][cc][dc][ic][jc][kc][pc][qc][ad][cd][dd][gd][hd][id][ld][md][pd][qd][sd][ae][be][ce][ge][je][ke][le][me][qe][re][se][ff][gf][hf][if][mf][nf][eg][fg][ng][og][ah][bh][ch][dh][eh][jh][kh][lh][oh][ph][qh][ei][hi][ii][ki][li][oi][qi][ri][si][ej][hj][kj][lj][oj][ek][hk][lk][ok][el][hl][il][jl][kl][ll][ol][am][bm][cm][dm][em][nm][om][pm][qm][rm][sm][fn][ln][mn][nn][go][ho][ko][mo][bp][cp][dp][hp][ip][jp][lp][pp][qp][rp][sp][aq][bq][cq][dq][eq][jq][kq][lq][oq][pq][sq][ar][br][er][fr][kr][or][as][fs][ks][os][ps][qs][rs][ss]
+AB[ea][ha][la][oa][bb][cb][eb][fb][gb][hb][lb][mb][nb][ob][rb][bc][ec][oc][rc][ed][od][de][ee][oe][pe][af][bf][cf][df][pf][qf][rf][ig][jg][kg][lg][mg][rg][sg][gh][hh][ih][mh][gi][ji][mi][gj][jj][mj][gk][ik][jk][mk][gl][ml][gm][hm][im][jm][km][lm][mm][ao][bo][co][do][eo][oo][po][qo][ro][so][ap][ep][fp][np][op][fq][gq][nq][rq][gr][hr][ir][mr][nr][pr][qr][rr][bs][cs][ds][gs][is][ms]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_021.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_021.sgf
new file mode 100644 (file)
index 0000000..69696f2
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Extreme nakade situations for size 6 eye. Strange eye Status.
+NW: White Alive in Atari, Black Alive. White to capture and seki. Black to capture and win.
+NE: White Alive in Atari Black nakade. White wins unconditionally both to play pass.
+SW: White wins unconditionally bot to play pass.
+SE: White is dead both to play pass.
+Center: White and black to play and win.
+]
+AW[aa][ba][ca][da][ja][pa][qa][ra][sa][db][jb][pb][cc][dc][ic][jc][kc][pc][qc][ad][cd][dd][gd][hd][id][ld][md][pd][qd][sd][ae][be][ce][ge][je][ke][le][me][qe][re][se][ff][gf][hf][if][mf][nf][eg][fg][ng][og][ah][bh][ch][dh][eh][jh][kh][lh][oh][ph][qh][ei][hi][ii][ki][li][oi][qi][ri][si][ej][hj][kj][lj][oj][ek][hk][lk][ok][el][hl][il][jl][kl][ll][ol][am][bm][cm][dm][em][nm][om][pm][qm][rm][sm][fn][ln][mn][nn][go][ho][ko][mo][bp][cp][dp][hp][ip][jp][lp][pp][qp][rp][sp][aq][bq][cq][dq][eq][jq][kq][lq][oq][pq][sq][ar][br][er][fr][kr][or][as][fs][ks][os][ps][qs][rs][ss]
+AB[ea][fa][ia][la][oa][bb][cb][eb][hb][ib][lb][mb][nb][ob][qb][rb][sb][ac][bc][ec][fc][gc][hc][oc][rc][bd][ed][od][rd][de][ee][oe][pe][af][bf][cf][df][pf][qf][rf][ig][jg][kg][lg][mg][rg][sg][gh][hh][ih][mh][gi][ji][mi][gj][jj][mj][gk][ik][jk][kk][mk][gl][ml][gm][hm][im][jm][km][lm][mm][ao][bo][co][do][eo][oo][po][qo][ro][so][ap][ep][fp][np][op][fq][gq][nq][qq][rq][gr][hr][ir][mr][nr][pr][qr][rr][bs][cs][ds][es][gs][is][ms]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_022.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_022.sgf
new file mode 100644 (file)
index 0000000..8aeb9e8
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-20]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Extreme nakade situations for size 6, 5, 4 eye.
+NW: Both to G19 and seki or win (white).
+NE: Black (S18|T16) and wins white (N17|017|O16|O15|O14|R13|T12)
+SW: Black plays C2 and wins white plays C2 and wins.
+SE: Black plays R3 and wins. White plays (N3|O5|P6|Q6|R6|S6|T6)
+Center: White unconditionally dead.
+]
+PL[W]
+AW[aa][ba][ca][ja][la][qa][ra][sa][cb][db][jb][lb][pb][qb][bc][cc][dc][ic][jc][kc][lc][pc][qc][cd][dd][gd][hd][id][ld][md][pd][qd][ae][be][ce][ge][je][ke][le][me][qe][re][se][ff][gf][hf][if][mf][nf][eg][fg][ng][og][ah][bh][ch][dh][eh][jh][kh][lh][oh][ph][qh][ei][hi][ii][ji][li][oi][qi][ri][si][ej][hj][lj][oj][ek][hk][kk][lk][ok][el][hl][il][jl][kl][ol][am][bm][cm][dm][em][nm][om][pm][qm][rm][sm][en][fn][ln][mn][nn][fo][go][ho][ko][mo][gp][hp][ip][jp][lp][mp][np][pp][qp][rp][sp][bq][cq][dq][eq][iq][jq][kq][lq][nq][pq][sq][ar][br][er][jr][kr][pr][as][ds][es][js][ks][ls][ps][qs][rs]
+AB[da][ea][ia][ma][oa][pa][eb][fb][gb][hb][ib][mb][nb][ob][sb][ac][ec][oc][rc][sc][ed][od][rd][de][ee][oe][pe][af][bf][cf][df][pf][qf][rf][sf][ig][jg][kg][lg][mg][pg][rg][sg][gh][hh][ih][mh][rh][gi][mi][gj][ij][jj][kj][mj][gk][ik][mk][gl][ll][ml][gm][hm][im][jm][km][lm][ao][bo][co][do][eo][oo][po][qo][ro][so][ap][ep][fp][op][fq][oq][rq][fr][gr][hr][ir][lr][mr][nr][or][qr][rr][sr][cs][fs][is][ms][os]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_023.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_023.sgf
new file mode 100644 (file)
index 0000000..5b2eff2
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Semiai Class 1. Size eye = 7, Very important how to fill the eye if it is unsettled. This test is about unsettled 7 and how to fill the eye. Eye t2222224. Also one test for eye t112233 unsettled.
+
+NW: A15 A16  Black to play  C18 and win. White to play C18 and seki.
+
+SW: E1 F1 Black and white to play D2 and win.
+
+SE: T8 T7 Both eyes unsettled The one who plays first kills so no way to choose seki.  Black to play T6 and white to play (T10|R10|S11). Check the status of the semiai if pass.
+
+NE: O19 N19 Black to play K18 and win, white to play K18 and seki.
+
+Center: J12 K12 Black and white to play J10 and win.
+]
+PL[B]
+AW[aa][ba][ca][da][ia][la][ma][pa][qa][ab][db][eb][ib][mb][ob][pb][sb][ac][ec][ic][jc][mc][oc][pc][sc][ad][bd][ed][jd][kd][ld][md][rd][sd][be][ce][de][ee][ne][oe][pe][qe][re][df][pf][rf][sf][bg][eg][fg][gg][hg][ig][og][qg][rg][sg][bh][eh][jh][kh][ph][bi][ci][ei][gi][hi][ki][oi][ej][gj][hj][kj][oj][rj][ek][fk][hk][ik][kk][ok][rk][al][bl][cl][dl][el][fl][kl][ol][bm][dm][fm][gm][hm][im][jm][pm][qm][rm][sm][an][bn][cn][pn][qn][ao][co][do][eo][po][fp][gp][hp][ip][pp][qp][rp][cq][dq][fq][iq][jq][rq][sq][br][cr][fr][jr][cs][fs][gs][js]
+AB[ea][fa][ha][ja][ka][na][oa][ra][bb][fb][gb][hb][kb][nb][rb][bc][cc][fc][hc][nc][qc][rc][cd][fd][gd][hd][nd][od][pd][qd][ae][fe][he][ie][je][ke][le][me][af][bf][cf][ef][ff][jf][kf][cg][dg][jg][lg][mg][dh][fh][gh][hh][ih][mh][qh][rh][sh][ai][di][fi][ii][ji][li][mi][pi][qi][aj][bj][cj][dj][fj][jj][lj][pj][gk][jk][lk][pk][sk][gl][hl][il][jl][ll][pl][ql][rl][sl][km][lm][nm][om][nn][fo][go][ho][io][jo][no][ro][so][bp][cp][dp][ep][jp][kp][np][sp][aq][bq][eq][kq][nq][ar][er][hr][ir][kr][or][pr][qr][rr][as][ds][es][hs][ks][rs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_024.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_024.sgf
new file mode 100644 (file)
index 0000000..114f769
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Semiai Class 1. Size eye = 7, Very important how to fill the eye if it is unsettled. This test is about unsettled 7 and how to fill the eye. Eye t1122224. t11112234alfa.
+
+NW: A15 A16  Black to play D17 and win. White to play B12 and win. Both should avoid seki. Check what seki value does the program give.
+
+SW: F1 G1 Black and white to play H2 and win or seki.
+
+SE: T8 T7 Both eyes unsettled The one who plays first kills so no way to choose seki.  Black to play S4 and white to play S11.
+
+NE: O19 N19 Black to play Q17 and seki. White to play Q17 and winner. Check status if pass.
+
+Center: J12 K12 Black and white to play J10 and win.
+]
+PL[B]
+AW[aa][ba][da][ia][ja][la][ma][ab][bb][db][eb][ib][mb][ob][pb][sb][ac][ec][ic][jc][mc][sc][ad][bd][ed][jd][ld][md][rd][sd][be][ce][de][ee][je][ke][le][me][se][df][nf][of][pf][qf][rf][sf][eg][fg][gg][hg][ig][og][eh][jh][kh][oh][ai][bi][ci][ei][hi][ki][oi][qi][bj][ej][gj][hj][kj][oj][qj][rj][ek][hk][ik][kk][ok][bl][cl][dl][el][fl][hl][kl][ml][nl][ol][bm][dm][fm][jm][mm][pm][qm][rm][sm][an][bn][cn][gn][hn][in][jn][kn][ln][mn][pn][qn][sn][ao][co][do][eo][fo][oo][po][gp][hp][ip][jp][pp][sp][gq][jq][kq][lq][oq][pq][qq][sq][br][cr][dr][er][gr][lr][qr][rr][sr][gs][hs][js][ks][ls]
+AB[ea][fa][ha][na][oa][qa][ra][cb][fb][gb][hb][kb][lb][nb][rb][cc][fc][hc][kc][nc][qc][rc][cd][fd][gd][hd][kd][nd][od][qd][ae][fe][he][ie][ne][oe][pe][qe][re][af][bf][cf][ef][ff][if][jf][kf][lf][mf][ag][cg][dg][jg][lg][mg][pg][qg][rg][sg][ah][ch][dh][fh][gh][hh][ih][mh][ph][qh][sh][di][fi][gi][ii][ji][li][mi][pi][aj][dj][fj][jj][lj][pj][sj][ak][bk][ck][dk][fk][gk][jk][lk][pk][qk][sk][gl][il][jl][ll][pl][ql][rl][sl][gm][hm][im][km][lm][nm][om][nn][on][rn][go][ho][io][jo][ko][lo][mo][no][qo][ro][ap][bp][cp][dp][ep][fp][kp][lp][np][op][qp][aq][bq][cq][fq][hq][iq][mq][nq][ar][fr][ir][jr][mr][or][pr][as][bs][cs][es][fs][ms][ps][qs][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_025.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_025.sgf
new file mode 100644 (file)
index 0000000..c5cc7b9
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Semiai Class 1. Size eye = 7, Very important how to fill the eye if it is unsettled. This test is about unsettled 7 and how to fill the eye. Eye t1222234. 
+
+NW: A14 A15  Black to play C11 and win. White to play C11 and win. White eye status nakade, black eye status unsettled.
+
+SW: F1 G1 The one who plays first wins. Black to play J2. White to play B2|B3|D3 or J2. J2 would be desirable (less ko threads )
+
+SE: T8 T7 Black is alive. Black to play R4 and win, white to play R4 and seki.
+
+NE: O19 N19 White to play L18 and seki. Black to play L18 and winner. For black status if pass should be seki.
+
+Center: J12 J13 Black and white to play J11 and win.
+]
+PL[W]
+AW[aa][ba][ca][da][ia][ja][ka][la][ma][ab][db][eb][ib][mb][sb][ac][ec][ic][mc][oc][pc][qc][sc][ad][dd][ed][id][jd][ld][md][rd][sd][ae][be][ce][de][je][ke][le][me][se][df][nf][of][pf][qf][rf][sf][eg][gg][hg][ig][jg][kg][lg][ng][eh][fh][lh][nh][bi][fi][hi][ji][li][ni][qi][ri][bj][fj][hj][ij][jj][lj][nj][qj][ek][fk][ik][lk][nk][qk][rk][al][bl][cl][dl][el][gl][ml][nl][bm][dm][fm][gm][hm][im][jm][km][lm][mm][om][pm][qm][rm][sm][an][bn][cn][dn][en][fn][on][pn][qn][rn][sn][go][ho][io][jo][ko][oo][po][so][gp][hp][jp][kp][op][sp][cq][gq][kq][lq][oq][pq][sq][cr][dr][gr][kr][lr][pr][qr][rr][gs][hs][is][js][ks][ls]
+AB[fa][ha][na][oa][pa][qa][ra][cb][fb][gb][hb][jb][nb][rb][bc][cc][fc][hc][jc][kc][lc][nc][rc][bd][fd][gd][hd][nd][od][qd][fe][ge][he][ne][oe][pe][qe][re][af][bf][cf][ef][ff][if][jf][kf][lf][mf][ag][bg][cg][dg][fg][mg][og][pg][qg][rg][sg][ah][dh][gh][hh][ih][jh][kh][mh][oh][ph][qh][rh][sh][ai][ei][gi][ki][mi][oi][pi][si][aj][dj][ej][gj][kj][mj][oj][sj][ak][bk][ck][dk][gk][hk][jk][kk][mk][ok][pk][sk][hl][il][jl][kl][ll][ol][pl][ql][rl][sl][nm][gn][hn][in][jn][kn][ln][mn][nn][ao][bo][co][do][eo][fo][lo][mo][no][ap][bp][dp][ep][fp][ip][lp][np][rp][aq][eq][fq][hq][iq][mq][nq][ar][er][fr][mr][or][as][bs][cs][ds][es][fs][ms][os][ps][qs][rs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_026.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_026.sgf
new file mode 100644 (file)
index 0000000..b4cfba4
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-13]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[
+];
+C[Semiai Class 1. Size eye = 7, Very important how to fill the eye if it is unsettled. This test is about unsettled 7 and how to fill the eye. Eye t1112234beta. Plus 1 test for t1222234.
+
+NW: A14 A15  Seki unconditionally both to play pass. Note: the semiai module will never realize that blaying B17 is worth 10 points.
+
+SW: F1 G1 Black to play K2 and win White to play D3 and win.
+
+SE: T8 T7 Black to play (T4|S3|T1) and win White to play R12|R10|S10 and win. 
+
+NE: O19 N19 White to play Q17 and win.Black to play  and Q17 and seki. For white status if pass should be seki.
+
+Center: J12 K12 Black and white to play H8 and win.
+]
+PL[W]
+AW[aa][ba][ca][da][ea][ia][ja][la][ma][ab][eb][ib][mb][ob][pb][qb][sb][dc][ec][ic][jc][mc][qc][sc][ad][cd][dd][ed][jd][kd][md][sd][ae][be][ce][de][ee][fe][je][ke][le][me][se][gf][nf][of][pf][qf][rf][sf][cg][eg][fg][gg][hg][ig][ng][bh][ch][eh][jh][kh][nh][rh][bi][ci][ei][ii][ki][ni][qi][ri][ej][hj][ij][kj][nj][ek][gk][hk][ik][kk][nk][al][bl][cl][dl][el][kl][ml][nl][ol][bm][dm][em][jm][mm][pm][qm][rm][sm][an][bn][cn][fn][gn][hn][in][jn][kn][ln][mn][pn][rn][sn][ao][co][do][eo][fo][oo][po][so][gp][hp][ip][jp][kp][lp][pp][cq][gq][hq][lq][oq][pq][qq][sq][br][cr][dr][gr][kr][lr][qr][rr][sr][gs][hs][js][ks][ls]
+AB[fa][ha][na][oa][qa][ra][bb][cb][db][fb][gb][hb][kb][lb][nb][rb][cc][fc][hc][kc][lc][nc][oc][rc][fd][gd][hd][ld][nd][od][pd][rd][ge][he][ie][ne][oe][pe][qe][re][af][bf][cf][df][ef][ff][if][jf][kf][lf][mf][ag][bg][dg][jg][lg][mg][og][pg][qg][rg][sg][ah][dh][fh][gh][hh][ih][mh][oh][ph][sh][di][fi][gi][hi][ji][li][mi][oi][si][aj][cj][dj][fj][gj][jj][lj][oj][pj][sj][ak][bk][ck][dk][fk][jk][lk][ok][pk][qk][rk][sk][fl][gl][il][jl][ll][pl][ql][rl][sl][fm][gm][hm][im][km][lm][nm][om][nn][on][go][ho][io][jo][ko][lo][mo][no][qo][ro][ap][bp][cp][dp][ep][fp][np][op][qp][rp][aq][bq][fq][iq][jq][mq][nq][ar][er][fr][hr][ir][mr][or][pr][as][bs][ds][es][fs][ms][ns][ps][qs][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_C1_027.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_C1_027.sgf
new file mode 100644 (file)
index 0000000..6b49019
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-09]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];PL[B]
+C[Does the program detect when its necessary to capture inside the eye?
+
+D1 E1: Black to play C2 and win, white to play C2 and win.
+
+T5 T6: Black to play R4 and win, white to play R4 and win.
+
+F19 G19: Black and white to play B19 and win.
+
+
+]
+AW[aa][fa][ia][ka][ab][bb][cb][db][eb][fb][kb][hc][ic][jc][bd][cd][dd][ed][fd][gd][hd][id][kd][ae][be][qi][ri][si][pj][pk][nl][pl][sl][am][bm][cm][dm][em][gm][om][en][nn][ao][bo][co][fo][go][ho][io][mo][no][po][qo][ro][so][ap][dp][ip][jp][mp][pp][sp][aq][dq][fq][gq][kq][mq][pq][ar][dr][fr][gr][jr][mr][pr][qr][as][bs][cs][ds][js][ms][qs][rs][ss]
+AB[ca][da][ea][ga][ja][gb][hb][ib][jb][ac][bc][cc][dc][ec][fc][gc][rj][sj][rk][rl][rm][an][bn][cn][dn][on][pn][qn][rn][sn][do][eo][oo][bp][cp][ep][fp][gp][hp][op][rp][bq][cq][eq][hq][oq][qq][rq][sq][br][er][hr][or][rr][sr][es][gs][hs][os][ps]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_001.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_001.sgf
new file mode 100644 (file)
index 0000000..26f51d0
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-12]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];;
+C[Semiai Class e. Same eye status. Size eye = 6 Center Eyes.
+
+NW: Black plays B17 and wins, white plays (B17) and wins.
+
+SW: Both are alive. Both to play pass and seki.
+
+SE: Black to play (S2|R1) and seki. White to play the same and win
+
+NE: White plays P18 and wins black plays P18 and seki.
+]
+PL[W]
+AW[aa][ba][ca][ga][ja][ka][sa][cb][db][fb][gb][jb][kb][nb][pb][sb][dc][jc][kc][lc][oc][sc][ad][cd][dd][id][jd][ld][rd][sd][ae][be][ce][de][ee][ge][he][ie][ke][me][ne][oe][pe][qe][re][af][ff][gf][hf][if][jf][kf][mf][nf][pf][qf][mg][og][qg][mh][ph][qh][mi][ni][oi][aj][bj][cj][ak][ck][dk][qk][rk][sk][dl][pl][ql][cm][dm][pm][an][bn][cn][dn][en][on][pn][qn][sn][fo][no][po][qo][ro][so][bp][fp][gp][mp][np][sp][aq][eq][fq][hq][iq][jq][kq][lq][mq][nq][ar][er][fr][gr][hr][mr][nr][pr][qr][es][gs][ms][rs]
+AB[da][ea][fa][ia][ma][na][pa][qa][ab][bb][eb][ib][mb][qb][ec][fc][hc][ic][mc][pc][qc][bd][ed][fd][gd][hd][md][nd][od][pd][fe][le][bf][cf][df][ef][lf][sf][ag][bg][dg][lg][ng][rg][sg][bh][dh][kh][lh][nh][rh][ai][bi][ci][di][ki][pi][qi][ri][si][dj][kj][lj][oj][pj][qj][bk][ek][lk][mk][nk][ok][pk][cl][el][ll][ml][nl][sl][am][em][fm][lm][nm][rm][sm][fn][ln][mn][nn][ao][bo][co][eo][oo][ap][cp][dp][ep][op][pp][qp][rp][dq][oq][pq][rq][sq][cr][dr][or][sr][as][bs][cs][ds][ns][os][ps][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_002.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_002.sgf
new file mode 100644 (file)
index 0000000..a72ac4d
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-05-21]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Semiai class e. Size 6 center eyes with more than one nbNEBopp.
+Black is always alive. So the result will be seki if white reaches life or won for black in the
+other case.
+A19 D19 seki pass (the group is alive)
+N19 M19 both to play pass and seki. Unexpected result as it is a side group
+T15 T16 both to play pass and seki.
+Q1 R1 white to play O2 and seki black to play the same and win.
+A4 A9 both to play B6 seki for white win for black
+O6 O5 white is alive both to play pass. seki.
+]
+AW[aa][ba][ca][ha][ka][ma][oa][qa][ab][cb][db][hb][kb][mb][qb][bc][dc][fc][gc][hc][ic][jc][kc][mc][nc][oc][pc][qc][ad][cd][dd][fd][kd][ae][ce][fe][ke][le][me][ne][pe][qe][re][se][af][bf][cf][ef][ff][hf][if][jf][kf][nf][pf][sf][eg][hg][lg][mg][ng][pg][sg][ch][dh][eh][hh][mh][ph][sh][ci][hi][ni][oi][qi][ri][si][aj][bj][cj][dj][ej][fj][hj][lj][mj][nj][fk][hk][lk][nk][al][bl][cl][dl][fl][hl][jl][kl][nl][dm][fm][hm][jm][nm][pm][qm][rm][sm][cn][dn][fn][hn][jn][kn][ln][mn][nn][pn][rn][ao][co][fo][ho][jo][po][qo][ro][so][ap][bp][cp][ep][fp][hp][jp][lp][mp][np][op][eq][fq][gq][hq][iq][lq][oq][pq][er][ir][kr][pr][es][is][ks][ls][ms][ns][os][ps]
+AB[da][ea][ga][la][ra][eb][fb][gb][lb][ob][rb][sb][ec][lc][rc][bd][ed][ld][md][nd][od][pd][qd][rd][sd][de][ee][oe][df][of][qf][rf][ag][bg][cg][dg][ig][jg][kg][og][bh][ih][kh][nh][oh][qh][rh][ai][bi][ii][ji][ki][li][mi][pi][ij][kj][oj][pj][qj][rj][sj][ak][bk][ck][dk][ek][ik][jk][kk][mk][ok][qk][el][il][ll][ml][ol][pl][ql][rl][sl][am][bm][cm][em][im][km][om][an][en][in][on][bo][do][eo][io][ko][lo][mo][no][oo][dp][ip][kp][pp][qp][rp][sp][aq][bq][cq][dq][jq][kq][nq][qq][br][dr][jr][lr][mr][qr][rr][sr][as][cs][ds][js][qs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_003.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_003.sgf
new file mode 100644 (file)
index 0000000..430fc81
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-05-21]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Semiai class e. Size 6 center eyes with more than one nbNEBopp.
+Black is always alive. So the result will be seki if white reaches life or won for black in the
+other case.
+F19 M19 white to play H18 and seki black to play F16 and win
+T9 T10 white is unconditionally dead. both to play pass.
+D1 K1 white is alive both to play pass and seki.
+D12 C12 white is alive both to play pass. seki.
+J14 J11 white to play (K14|L13) and seki black to play the same and win.
+
+]
+AW[ba][fa][ga][ia][ja][ka][pa][bb][fb][kb][pb][bc][fc][gc][ic][jc][kc][pc][bd][gd][hd][id][pd][be][ce][de][je][ke][le][me][ne][pe][bf][ef][if][nf][pf][bg][eg][fg][gg][ig][lg][mg][ng][pg][bh][dh][gh][ih][jh][kh][lh][ph][bi][di][gi][hi][mi][ni][oi][pi][qi][ri][si][bj][dj][ej][hj][nj][bk][ek][fk][gk][hk][mk][nk][pk][qk][rk][sk][bl][ll][nl][pl][sl][bm][cm][lm][nm][pm][sm][cn][dn][en][fn][gn][hn][in][jn][kn][ln][nn][pn][sn][bo][co][lo][no][qo][ro][so][ap][bp][ep][fp][gp][hp][ip][lp][np][op][dq][eq][iq][lq][oq][pq][dr][hr][ir][lr][pr][ds][es][fs][gs][hs][ks][ls][ps][qs]
+AB[ca][ea][ha][la][na][cb][db][eb][gb][ib][jb][lb][mb][nb][cc][ec][hc][lc][nc][cd][dd][ed][jd][kd][ld][md][nd][od][ee][fe][ge][he][ie][oe][df][hf][kf][lf][of][cg][dg][hg][jg][og][ch][fh][hh][mh][nh][oh][ci][ei][ii][ji][ki][li][cj][fj][gj][jj][lj][oj][pj][qj][rj][sj][ck][dk][ik][jk][kk][lk][ok][dl][el][fl][gl][hl][il][kl][ol][ql][rl][jm][km][om][qm][on][rn][do][eo][fo][go][ho][io][jo][ko][oo][po][cp][dp][kp][pp][qp][rp][sp][aq][bq][cq][gq][jq][kq][qq][sq][br][cr][er][fr][jr][qr][rr][sr][as][cs][js][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_004.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_004.sgf
new file mode 100644 (file)
index 0000000..fdf6ce2
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-02]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Eye Test for size 5. Black is always alive so the thing is to see if white can get a seki status.
+
+We start in the upper left coin and we number the white groups from one to ten in the occidental reading sense.
+
+Number 1: B18 vital point for both.
+Number 2: White alive. Status semiai: seki
+Number 3: White alive. Status semiai: seki.
+Number 4: White alive. Status semiai: seki.
+Number 5: White alive in atari. White to play B7 and seki black to play D5 and win.
+Number 6: O5 vital point for both.
+]
+AW[aa][ba][ca][da][ha][la][na][db][hb][lb][nb][ob][cc][dc][hc][lc][oc][ad][bd][cd][hd][ld][nd][od][he][le][me][ne][qe][re][se][df][ef][ff][gf][hf][if][kf][lf][qf][ag][bg][cg][fg][ig][jg][mg][ng][qg][bh][dh][fh][gh][jh][nh][qh][sh][ai][bi][ci][di][gi][ii][ji][ni][qi][ri][si][gj][hj][ij][mj][nj][lk][nk][al][bl][cl][dl][el][il][jl][kl][ll][ml][nl][ol][pl][ql][rl][sl][em][jm][sm][en][jn][ln][mn][nn][on][pn][qn][sn][eo][fo][go][ho][io][jo][lo][qo][bp][cp][dp][jp][lp][mp][op][pp][qp][aq][bq][dq][eq][jq][mq][nq][oq][ar][er][jr][as][bs][ds][es][js][ks][ls][ms][ns]
+AB[ea][ga][ia][ka][ma][pa][ra][ab][cb][eb][fb][gb][ib][jb][kb][pb][qb][rb][sb][bc][ec][gc][ic][kc][mc][nc][pc][rc][ed][gd][id][kd][pd][qd][rd][sd][ae][be][ce][de][ee][fe][ge][ie][je][ke][pe][cf][jf][mf][nf][of][pf][sf][dg][eg][gg][kg][lg][pg][rg][eh][hh][kh][mh][ph][rh][ei][fi][hi][ki][li][mi][pi][aj][bj][cj][dj][fj][kj][pj][qj][rj][sj][dk][ek][fk][gk][hk][ik][jk][kk][fl][am][bm][cm][dm][km][lm][mm][nm][om][pm][qm][rm][bn][dn][kn][rn][ao][bo][co][do][ko][mo][oo][ro][ep][fp][gp][hp][kp][np][rp][sp][cq][fq][hq][kq][rq][br][dr][fr][gr][hr][kr][lr][mr][nr][or][pr][qr][rr][sr][cs][fs][hs][ps][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_005.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_005.sgf
new file mode 100644 (file)
index 0000000..ebb4af4
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-02]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Eye Test for size 5. Black is always alive so the thing is to see if white can get a seki status.
+
+We start in the upper left coin and we number the white groups from one to ten in the occidental reading sense.
+
+Number 1: B18 vital point for both.
+Number 2: White alive. Status semiai: seki
+Number 3: White alive. Status semiai: seki
+Number 4: White alive. Status semiai: seki
+Number 5: White alive. Status semiai: seki.
+Number 6: both to play N10.
+Number 7: White alive. Status semiai: seki.
+Number 8: White alive in atari. White to play B7 and seki black to play D5 and win.
+Number 9: Vital point G6 for both. 
+Number10: O5 vital point for both.
+]
+AW[ga][ia][ma][fb][gb][ib][jb][lb][mb][nb][ob][fc][jc][lc][nc][fd][gd][hd][id][jd][ld][md][od][pd][qd][fe][me][qe][re][af][bf][cf][df][ef][lf][rf][dg][fg][kg][lg][mg][ng][rg][ch][dh][fh][gh][hh][ih][jh][lh][nh][rh][sh][ai][bi][ci][fi][hi][ji][li][ni][oi][si][ej][fj][gj][hj][ij][jj][lj][oj][sj][ck][dk][ek][lk][nk][ok][sk][cl][fl][gl][hl][ll][ml][nl][sl][cm][fm][hm][im][lm][rm][sm][cn][fn][jn][mn][nn][on][rn][ao][bo][co][fo][ho][io][jo][lo][mo][oo][qo][ro][fp][gp][hp][lp][np][op][pp][qp][cq][dq][eq][lq][nq][cr][er][fr][lr][mr][nr][cs][ds][fs][ls][ns]
+AB[ea][ha][ka][ab][bb][cb][db][eb][kb][cc][ec][gc][ic][kc][cd][ed][kd][ae][be][ce][de][ee][ge][he][ie][je][ke][le][ff][gf][if][kf][mf][nf][of][pf][ag][cg][eg][gg][hg][ig][jg][pg][ah][eh][kh][ph][di][ei][ki][mi][pi][qi][ri][aj][bj][cj][dj][kj][pj][rj][bk][fk][gk][hk][ik][jk][kk][mk][pk][qk][rk][al][bl][el][kl][ol][pl][ql][bm][em][gm][km][mm][nm][om][qm][an][bn][en][hn][kn][ln][pn][qn][eo][ko][ap][bp][cp][dp][ep][kp][bq][fq][gq][hq][iq][jq][kq][ar][br][gr][ir][kr][bs][gs][hs][is][js][ks]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_006.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_006.sgf
new file mode 100644 (file)
index 0000000..b02c3f2
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 6. Black always alive. can white achieve seki? 
+
+A19 E19: White alive both to play pass.
+L19 K19: Both to play N18
+R13 R7: White alive both to play pass.
+F7 F8: White alive both to play pass.
+]
+AW[aa][ba][ca][da][fa][ka][na][db][fb][kb][nb][ac][dc][fc][kc][lc][nc][ad][bd][dd][fd][ld][nd][be][ce][de][fe][ge][he][ie][le][me][ne][oe][ff][if][jf][of][eg][fg][jg][kg][og][qg][rg][sg][eh][lh][mh][nh][ph][qh][ai][bi][ci][di][ei][ki][ni][pi][kj][nj][pj][rj][sj][ck][dk][ek][fk][gk][hk][ik][jk][kk][nk][pk][qk][rk][cl][kl][nl][cm][fm][gm][hm][im][km][nm][om][cn][fn][in][kn][on][pn][qn][co][fo][io][ko][qo][cp][fp][ip][kp][qp][cq][gq][hq][iq][kq][qq][cr][kr][qr][rr][sr][cs][js][ks]
+AB[ea][ha][ja][la][oa][qa][ab][bb][eb][hb][ib][jb][lb][ob][rb][cc][ec][hc][jc][mc][oc][qc][sc][cd][ed][hd][id][jd][kd][od][pd][rd][ee][ke][pe][af][bf][cf][df][ef][kf][lf][mf][nf][pf][qf][rf][sf][bg][dg][ng][pg][ah][bh][ch][dh][oh][sh][oi][qi][ri][oj][ok][dl][el][fl][gl][hl][il][jl][ol][pl][sl][dm][jm][pm][qm][rm][sm][dn][hn][jn][rn][do][go][jo][ro][so][dp][gp][jp][rp][dq][jq][rq][sq][dr][er][fr][gr][hr][ir][jr][ds][fs][hs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_007.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_007.sgf
new file mode 100644 (file)
index 0000000..0e07227
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 6. Black always alive. can white achieve seki? 
+
+G19 K19: Both to play H18
+A13 E13: White alive both to play pass.
+M13 P13: White alive both to play pass.
+R6 P5: Both to play S4.
+]
+AW[fa][ga][ia][ma][fb][ib][mb][fc][ic][mc][fd][gd][id][md][fe][ge][he][ie][me][ne][oe][qe][ef][ff][lf][pf][ag][bg][cg][dg][gg][lg][mg][ng][pg][dh][fh][gh][jh][kh][lh][nh][ph][qh][ai][di][fi][hi][ii][ki][ni][pi][qi][ri][si][aj][bj][dj][fj][hj][kj][nj][qj][bk][ck][dk][fk][hk][kk][mk][nk][fl][hl][kl][ll][ml][em][fm][hm][en][hn][on][pn][qn][rn][sn][ao][bo][co][do][eo][io][jo][ko][lo][mo][no][po][qo][lp][pp][lq][pq][rq][sq][kr][lr][pr][qr][rr][ks]
+AB[ea][ja][la][ab][cb][eb][gb][jb][kb][lb][ac][cc][ec][hc][jc][lc][ed][jd][kd][ld][de][ee][je][le][af][bf][cf][df][gf][hf][if][jf][kf][mf][nf][of][eg][fg][ig][jg][og][ah][bh][eh][ih][mh][oh][ci][ei][ji][li][oi][ej][jj][mj][oj][ek][jk][lk][ok][pk][qk][rk][sk][al][bl][cl][dl][el][jl][ol][rl][bm][dm][jm][km][lm][mm][nm][om][pm][qm][rm][sm][an][bn][cn][dn][nn][oo][so][mp][np][op][qp][sp][mq][oq][mr][nr][or][sr][ms][os][ps][qs][rs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_008.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_008.sgf
new file mode 100644 (file)
index 0000000..4e0f93d
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 6. Black always alive. can white achieve seki? 
+
+Q19 P19: Both to play S17
+F13 F14: White alive both to play pass.
+A7 A8 Both to play B5. 
+M6 M7: Bothto play N4.
+]
+AW[ma][pa][qa][ra][sa][mb][pb][cc][ec][fc][gc][hc][ic][jc][kc][lc][nc][pc][sc][dd][jd][ld][nd][pd][qd][sd][de][ke][ne][qe][re][se][df][kf][nf][dg][fg][gg][hg][ig][kg][mg][og][pg][dh][fh][ih][kh][qh][di][fi][ii][li][qi][dj][fj][ij][lj][qj][ak][bk][ck][dk][fk][gk][hk][lk][pk][rk][sk][el][kl][ll][ml][nl][ol][ql][am][bm][cm][em][jm][pm][cn][en][in][jn][ln][mn][nn][pn][qn][co][eo][fo][go][io][lo][no][po][ro][ap][cp][gp][hp][ip][kp][np][qp][sp][aq][cq][gq][iq][kq][nq][qq][rq][sq][ar][br][cr][gr][hr][ir][kr][mr][nr][gs][is][ks][ls][ms]
+AB[oa][ob][rb][oc][qc][ed][fd][gd][hd][id][od][rd][ee][ge][ie][oe][ef][ff][gf][hf][if][jf][of][pf][qf][rf][sf][eg][jg][rg][eh][hh][jh][rh][sh][ei][gi][ji][ri][ej][gj][jj][rj][sj][ek][jk][al][bl][cl][dl][fl][gl][hl][il][jl][dm][km][lm][mm][nm][om][bn][dn][kn][on][ao][do][jo][ko][mo][oo][bp][dp][ep][fp][jp][lp][op][dq][fq][jq][lq][mq][oq][dr][er][fr][jr][or][pr][qr][rr][sr][bs][cs][ds][fs][js][os][qs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_009.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_009.sgf
new file mode 100644 (file)
index 0000000..9042746
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t2222224. Black always alive, can white make seki? Semiai Class e.
+
+A19 E19: alive pass.
+M13 M14: (N11|O12) nakade or alive
+F7 F8: alive pass
+]
+AW[aa][ba][ca][ha][cb][db][hb][dc][hc][ad][dd][hd][ae][be][ce][de][he][je][ke][le][me][ne][oe][pe][qe][re][se][gf][if][jf][dg][eg][fg][hg][jg][lg][mg][ng][og][ah][bh][ch][gh][jh][lh][oh][ph][di][ei][ji][li][pi][fj][gj][hj][ij][jj][lj][mj][pj][ck][dk][ek][fk][jk][mk][nk][ok][pk][rk][cl][kl][ll][rl][sl][cm][fm][gm][hm][im][lm][nm][om][pm][qm][rm][cn][fn][in][jn][ln][nn][co][fo][ho][jo][lo][bp][dp][gp][jp][lp][dq][gq][hq][iq][jq][lq][dr][lr][ds][ls]
+AB[ea][ga][ab][eb][fb][gb][bc][ec][gc][bd][ed][gd][ee][fe][af][bf][cf][df][ef][kf][lf][mf][nf][of][pf][qf][rf][sf][kg][pg][qg][kh][mh][qh][rh][sh][ki][ni][oi][qi][kj][nj][qj][rj][sj][kk][lk][qk][el][fl][gl][hl][il][jl][ml][nl][ol][pl][ql][em][jm][km][en][hn][kn][eo][go][ko][ep][hp][ip][kp][eq][kq][er][fr][gr][hr][ir][jr][kr][es][hs][ks]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_010.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_010.sgf
new file mode 100644 (file)
index 0000000..d195c73
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t2222224. Black always alive, can white make seki? Semiai Class e.
+
+G19 E19: dead pass.
+A13 A14: alive pass
+M7 M8: O5 nakade or alive. (O4 also possible for white)
+]
+AW[da][fa][ga][ha][ia][na][ab][bb][cb][db][fb][ib][jb][nb][dc][fc][jc][nc][dd][gd][jd][nd][ae][be][ce][de][ee][ge][he][ie][je][ne][ef][mf][of][ag][bg][cg][fg][kg][lg][mg][ng][ch][dh][fh][gh][hh][ih][jh][nh][di][fi][li][aj][dj][fj][jj][ak][bk][ck][dk][fk][kk][lk][mk][nk][ok][pk][fl][jl][pl][ql][rl][fm][jm][lm][mm][nm][om][rm][en][fn][jn][ln][on][pn][sn][ao][bo][co][do][eo][jo][lo][po][ro][jp][mp][pp][rp][jq][kq][mq][nq][oq][pq][rq][jr][rr][sr][js][rs]
+AB[ea][ka][ma][eb][hb][kb][lb][mb][ec][gc][ic][kc][mc][ed][fd][kd][md][fe][ke][le][af][bf][cf][df][ff][gf][hf][if][jf][kf][dg][eg][ah][eh][bi][ei][cj][ej][ek][al][bl][cl][dl][el][kl][ll][ml][nl][ol][bm][dm][km][pm][qm][an][bn][cn][dn][kn][nn][qn][ko][mo][oo][qo][kp][lp][op][qp][lq][qq][kr][lr][mr][nr][or][pr][qr][ks][qs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_011.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_011.sgf
new file mode 100644 (file)
index 0000000..7b90af0
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t2222224. Black always alive, can white make seki? Semiai Class e.
+
+M19 L19: alive pass
+F13 F14: H11 nakade or alive (others are possible but are inferior J11|H10)
+A7 A8: C5 nakade or alive
+]
+AW[ja][la][ma][na][oa][jb][lb][ob][pb][dc][ec][fc][hc][jc][lc][pc][bd][dd][gd][jd][md][pd][ce][he][ie][je][ke][me][ne][oe][pe][se][bf][kf][rf][bg][fg][gg][hg][ig][lg][mg][ng][og][pg][qg][sg][bh][fh][ih][jh][mh][rh][bi][di][fi][ji][ni][bj][dj][gj][jj][nj][ak][bk][ck][dk][ek][gk][hk][ik][jk][nk][el][nl][am][bm][cm][fm][gm][nm][cn][dn][gn][in][nn][bo][do][go][ho][io][jo][ko][lo][mo][oo][ap][dp][gp][aq][bq][cq][dq][gq][gr][gs]
+AB[ka][pa][qa][kb][mb][nb][qb][rb][sb][kc][mc][nc][qc][ed][fd][kd][ld][od][qd][rd][sd][de][ee][ge][le][qe][cf][ef][ff][gf][hf][if][jf][lf][mf][nf][of][pf][qf][cg][dg][eg][kg][eh][hh][kh][ei][gi][ki][li][ej][fj][lj][fk][kk][lk][mk][al][bl][cl][dl][fl][gl][hl][il][jl][kl][ml][dm][em][jm][lm][mm][bn][en][fn][jn][kn][ao][fo][bp][ep][fp][eq][ar][br][cr][dr][er][cs][es]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_012.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_012.sgf
new file mode 100644 (file)
index 0000000..a2c2e3b
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1122224. Black always alive, can white make seki? Semiai Class e.
+
+A19 E19: white B16 seki, black B16 ko.
+O13 O14: U_U_Ko_A but not detected by the program.  Black plays Q12 and gets a ko.
+G7 G8: U_U_Ko_A but not detected by the program.  Black plays H5 and gets a ko.
+]
+AW[aa][ba][ca][ia][qa][cb][db][eb][ib][qb][bc][ec][hc][ic][oc][qc][ad][cd][dd][ed][hd][ld][pd][ae][be][ce][he][ke][me][ne][oe][hf][lf][gg][lg][ng][og][pg][qg][dh][eh][fh][hh][lh][nh][qh][rh][sh][ai][bi][ci][gi][li][ni][si][dj][lj][nj][oj][qj][rj][sj][ek][fk][gk][hk][ik][jk][kk][lk][nk][ok][pk][el][ll][em][gm][hm][im][mm][nm][om][pm][qm][rm][sm][en][gn][jn][kn][ln][nn][eo][go][lo][no][ep][gp][hp][jp][kp][lp][np][eq][gq][hq][iq][jq][nq][er][mr][or][es][ms][os]
+AB[ea][fa][ha][ra][bb][fb][gb][hb][rb][sb][ac][cc][fc][rc][fd][rd][sd][fe][re][af][bf][cf][df][ef][ff][mf][nf][of][pf][qf][rf][sf][bg][mg][ah][bh][mh][mi][oi][qi][mj][mk][fl][gl][hl][il][jl][kl][ml][nl][ol][pl][ql][rl][sl][fm][jm][km][lm][fn][in][mn][fo][jo][mo][fp][mp][fq][kq][lq][mq][fr][gr][hr][ir][jr][kr][lr][fs][ls]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_013.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_013.sgf
new file mode 100644 (file)
index 0000000..c72ca18
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1122224. Black always alive, can white make seki? Semiai Class e.
+
+G19 E19: white J17 ko, black J17 nakade.
+A13 A14: alive pass
+O7 O8: Unsettled Q5
+]
+AW[ca][da][ga][ha][ia][ra][cb][eb][gb][jb][kb][lb][rb][cc][ec][gc][lc][nc][oc][pc][qc][rc][cd][dd][ed][gd][hd][jd][kd][ld][nd][ae][be][ce][ee][he][ie][je][ne][ef][ff][nf][ag][bg][cg][gg][hg][ig][jg][mg][ch][dh][eh][gh][jh][kh][lh][nh][ei][gi][li][aj][cj][dj][ej][gj][lj][qj][rj][sj][ak][bk][ck][gk][lk][mk][nk][ok][pk][gl][ll][dm][fm][gm][lm][nm][om][pm][dn][en][ln][nn][qn][rn][sn][do][lo][no][so][cp][lp][np][op][qp][rp][sp][aq][bq][cq][lq][oq][pq][qq][lr][ls]
+AB[ea][fa][ka][la][ma][oa][qa][fb][ib][mb][nb][ob][pb][qb][fc][hc][jc][mc][fd][md][fe][ge][me][af][bf][cf][df][gf][hf][if][jf][kf][lf][mf][dg][eg][fg][fh][ai][ci][di][fi][fj][fk][al][bl][cl][dl][el][fl][ml][nl][ol][pl][ql][rl][sl][bm][mm][an][bn][mn][on][pn][bo][mo][oo][qo][ap][bp][mp][pp][mq][mr][nr][or][pr][qr][rr][sr][ms][qs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_014.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_014.sgf
new file mode 100644 (file)
index 0000000..8d9fcd5
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1122224. Black always alive, can white make seki? Semiai Class e.
+
+O19 N19: white Q18|P18 alive,  black P18 KO
+G13 G14: Unsettled (J12|H11)
+A7 A8: U_U_Ko_A but not detected by the program.  Black plays C5 and gets a ko.
+]
+AW[ja][na][qa][ra][sa][jb][kb][lb][nb][sb][lc][nc][oc][qc][rc][sc][ed][kd][ld][od][pd][qd][fe][ge][he][ie][je][le][me][ef][mf][eg][gg][hg][ig][jg][ng][og][pg][qg][eh][gh][jh][kh][lh][nh][qh][ei][gi][li][ni][qi][ri][si][cj][dj][ej][gj][hj][jj][kj][lj][nj][ak][bk][ck][ek][hk][ik][jk][nk][el][fl][nl][am][bm][cm][gm][hm][nm][cn][dn][en][gn][mn][nn][eo][go][io][jo][ko][lo][ap][cp][dp][ep][gp][hp][mp][aq][bq][cq][gq][gr][gs]
+AB[ka][la][ma][pa][mb][qb][mc][pc][md][nd][rd][sd][ne][re][ff][gf][hf][if][jf][kf][lf][nf][of][pf][qf][rf][sf][fg][kg][lg][mg][rg][fh][hh][mh][rh][sh][fi][ii][ji][mi][fj][ij][mj][fk][gk][kk][lk][mk][al][bl][cl][dl][gl][hl][il][jl][kl][ml][dm][em][fm][im][km][lm][mm][bn][fn][in][jn][ao][fo][fp][fq][ar][br][cr][dr][er][fr][cs][fs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_015.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_015.sgf
new file mode 100644 (file)
index 0000000..64c8fbd
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1222234. Black always alive, can white make seki? Semiai Class e.
+
+A19 E19: white alive (if black A17 white C16) pass.
+O13 O14: white Q11 alive, black Q11 nakade.
+G7 G8: white dead pass.
+
+]
+AW[aa][ba][ca][da][ia][ja][ab][db][ib][qb][bc][dc][hc][ic][rc][sc][ad][dd][hd][ld][nd][od][pd][qd][ae][be][ce][de][ge][ie][me][gf][lf][dg][eg][fg][gg][lg][ng][og][pg][qg][ch][kh][nh][qh][rh][ai][bi][ci][ei][ki][ni][ri][jj][kj][lj][nj][qj][rj][dk][fk][gk][hk][ik][jk][lk][nk][ok][pk][el][ll][dm][gm][hm][im][mm][nm][om][pm][qm][dn][gn][jn][kn][nn][qn][do][go][ko][no][qo][ro][so][dp][gp][jp][kp][np][dq][gq][hq][iq][jq][nq][dr][nr][ds][ns]
+AB[ea][fa][ha][bb][cb][fb][gb][hb][cc][fc][bd][fd][rd][sd][fe][re][af][bf][cf][df][ef][ff][mf][nf][of][pf][qf][rf][sf][bg][mg][ah][bh][mh][ph][mi][oi][si][mj][sj][mk][sk][fl][gl][hl][il][jl][kl][ml][nl][ol][pl][ql][rl][sl][fm][jm][km][lm][rm][fn][in][ln][mn][rn][sn][fo][ho][io][mo][fp][hp][mp][fq][kq][lq][mq][fr][gr][hr][ir][jr][mr][fs][ks][ms]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_016.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_016.sgf
new file mode 100644 (file)
index 0000000..bdc6333
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1222234. Black always alive, can white make seki? Semiai Class e.
+
+G19 L19: white J17 ko, black H16 and kill.
+A4 A5: black and white to play C2
+O7 O8: white dead pass.
+]
+AW[ba][ga][ha][ia][ja][oa][ab][bb][cb][gb][jb][kb][ob][bc][gc][kc][nc][pc][bd][gd][jd][kd][nd][ae][be][ce][de][ee][ge][he][ie][je][ne][ff][gf][nf][hg][ig][ng][ih][jh][kh][lh][mh][nh][qj][rj][sj][kk][mk][nk][ok][pk][ll][km][nm][om][pm][qm][kn][nn][qn][rn][ko][no][ro][ap][bp][cp][dp][ep][kp][np][qp][rp][aq][eq][kq][nq][oq][pq][qq][ar][er][kr][as][bs][ds][es][ks]
+AB[da][fa][ka][la][na][db][eb][fb][hb][ib][lb][mb][nb][dc][fc][hc][jc][lc][dd][ed][fd][id][ld][fe][ke][le][me][af][bf][cf][df][ef][hf][if][jf][kf][mf][eg][fg][gg][jg][lg][mg][ah][bh][ch][dh][eh][ml][nl][ol][pl][ql][rl][sl][mm][rm][mn][pn][sn][ao][bo][co][do][eo][fo][mo][oo][po][qo][so][fp][gp][hp][mp][op][sp][bq][fq][hq][mq][rq][sq][br][dr][fr][gr][hr][mr][nr][or][pr][qr][rr][sr][cs][fs][hs][ms][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_017.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_017.sgf
new file mode 100644 (file)
index 0000000..441222d
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1222234. Black always alive, can white make seki? Semiai Class e.
+
+O19 L19: white Q19|P18 alive,  black the same and nakade
+G13 G14: white alive (if black H11 white H10).
+A7 A8:  white B4 alive, black B4 nakade.
+]
+AW[ja][na][qa][ra][jb][nb][rb][ic][kc][nc][qc][rc][kd][nd][od][pd][qd][de][fe][ge][he][ie][je][ke][le][ef][mf][dg][gg][hg][ig][jg][mg][ng][og][pg][qg][rg][sg][dh][gh][jh][kh][nh][di][gi][ki][ni][dj][gj][jj][kj][nj][ak][bk][ck][dk][ek][gk][hk][ik][jk][nk][fl][nl][am][bm][cm][dm][fm][gm][nm][an][dn][gn][mn][do][go][ho][io][jo][ko][lo][no][ap][dp][gp][aq][bq][cq][dq][gq][gr][gs]
+AB[ka][ma][oa][sa][kb][lb][mb][pb][qb][sb][mc][pc][sc][md][rd][sd][me][ne][oe][pe][qe][se][ff][gf][hf][if][jf][kf][lf][qf][rf][sf][eg][fg][kg][lg][eh][hh][ih][lh][ei][ji][li][ej][fj][ij][lj][fk][kk][lk][mk][al][bl][cl][dl][el][gl][hl][il][jl][kl][ml][em][hm][km][lm][mm][bn][en][hn][in][jn][ao][bo][co][eo][cp][ep][fp][fq][ar][br][cr][dr][er][fr][cs][es]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_018.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_018.sgf
new file mode 100644 (file)
index 0000000..51dc7fb
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1112234a. Black always alive, can white make seki? Semiai Class e.
+
+A19 E19: black B18 and wins, white C17 and seki
+O13 O14: white alive
+G7 G8: black and white K5
+
+]
+AW[aa][ba][ca][da][ia][ab][db][eb][ib][ec][gc][ic][lc][nc][oc][pc][qc][rc][sc][ad][bd][dd][ed][gd][hd][md][qd][be][ce][de][ge][me][ff][lf][cg][dg][eg][gg][lg][ng][og][pg][qg][rg][ch][lh][nh][oh][rh][sh][ai][bi][ci][li][ni][qi][si][ej][gj][hj][lj][nj][oj][pj][rj][sj][dk][fk][ik][jk][kk][lk][pk][qk][rk][el][ll][ml][em][gm][hm][im][jm][km][nm][om][pm][qm][rm][en][gn][hn][kn][ln][nn][rn][sn][eo][go][lo][no][ro][ep][gp][hp][ip][kp][lp][np][qp][cq][eq][iq][jq][kq][nq][pq][dr][nr][or][ds][os]
+AB[ea][fa][ha][cb][fb][gb][hb][ac][bc][dc][fc][cd][fd][od][pd][rd][sd][ae][ee][fe][oe][qe][se][af][bf][cf][df][ef][mf][nf][of][pf][qf][rf][sf][bg][mg][ah][bh][mh][ph][qh][mi][pi][mj][mk][nk][sk][fl][gl][hl][il][jl][kl][nl][ol][pl][ql][rl][sl][fm][lm][mm][sm][fn][jn][mn][fo][io][ko][mo][fp][jp][mp][fq][lq][mq][fr][gr][hr][ir][jr][kr][mr][fs][ks][ls][ms]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_019.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_019.sgf
new file mode 100644 (file)
index 0000000..c3e30c6
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1112234a. Black always alive, can white make seki? Semiai Class e.
+
+G19 E19: black and white K17
+A13 a14: black and white C11
+O7 O8: black and white Q5
+]
+AW[ca][da][ga][ha][ia][ja][ka][pa][cb][eb][gb][hb][kb][lb][pb][cc][ec][gc][lc][nc][oc][pc][ad][bd][ed][gd][hd][id][kd][ld][od][be][ce][de][ee][ie][je][oe][ff][gf][of][ag][bg][cg][dg][gg][kg][mg][ng][og][ah][dh][eh][gh][kh][lh][ei][gi][ki][aj][bj][dj][ej][gj][hj][ij][jj][kj][mj][nj][oj][pj][rj][sj][bk][ck][dk][gk][lk][pk][qk][rk][gl][ll][cm][dm][em][fm][lm][nm][om][pm][qm][rm][en][gn][ln][nn][on][rn][sn][co][do][fo][lo][no][so][cp][lp][np][op][pp][rp][sp][aq][bq][cq][lq][oq][pq][qq][rq][ar][lr][ls]
+AB[ea][fa][ma][oa][fb][ib][jb][mb][nb][ob][fc][ic][kc][mc][fd][jd][md][ae][fe][ge][he][me][af][bf][cf][df][ef][hf][if][jf][kf][lf][mf][eg][fg][hg][jg][bh][fh][ih][jh][bi][di][fi][cj][fj][ak][ek][fk][sk][al][bl][cl][dl][el][fl][ml][nl][ol][pl][ql][rl][sl][bm][mm][sm][an][bn][mn][pn][bo][mo][qo][ro][ap][bp][mp][qp][mq][nq][sq][mr][nr][or][pr][qr][rr][sr][ms][qs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_020.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_020.sgf
new file mode 100644 (file)
index 0000000..551fb4d
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1112234a. Black always alive, can white make seki? Semiai Class e.
+
+O19 N19: black and white R18
+G13 G14: white dead
+A7 A9:  white C5 black C4
+]
+AW[la][na][oa][ra][sa][lb][nb][sb][dc][fc][gc][hc][jc][lc][nc][oc][pc][rc][sc][ed][id][kd][ld][pd][qd][rd][ee][ie][je][ke][le][me][ef][mf][eg][gg][hg][ig][jg][kg][ng][og][pg][qg][eh][gh][hh][kh][lh][nh][ph][ei][gi][li][ni][qi][aj][bj][ej][gj][hj][ij][kj][lj][nj][qj][bk][ck][dk][ek][ik][jk][kk][nk][qk][rk][sk][fl][gl][ol][am][bm][cm][dm][gm][hm][im][jm][km][om][an][dn][en][gn][kn][nn][on][eo][go][ko][lo][mo][ap][bp][dp][ep][gp][bq][cq][dq][gq][gr][gs]
+AB[ma][qa][mb][pb][rb][mc][fd][gd][hd][md][nd][od][sd][fe][he][oe][se][ff][gf][hf][if][jf][kf][lf][nf][of][pf][qf][rf][sf][fg][lg][mg][rg][fh][ih][mh][rh][sh][fi][ii][ji][ki][mi][ri][fj][jj][mj][rj][sj][ak][fk][gk][hk][lk][mk][al][bl][cl][dl][el][hl][il][jl][kl][ll][nl][em][fm][lm][mm][nm][bn][cn][fn][ao][bo][do][fo][fp][aq][eq][fq][ar][br][cr][dr][er][fr][cs][es]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_021.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_021.sgf
new file mode 100644 (file)
index 0000000..190b25a
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1112234b. Black always alive, can white make seki? Semiai Class e.
+
+A19 F19: white alive
+O13 N13: white alive
+G7 G8: white to play J5 black to play J4
+
+]
+AW[aa][ba][ca][da][ea][ia][ab][eb][ib][bc][dc][ec][gc][ic][pc][rc][sc][ad][cd][dd][gd][hd][kd][md][nd][od][qd][ae][be][ce][ge][le][pe][qe][ff][lf][cg][dg][eg][gg][lg][ng][og][pg][qg][rg][sg][dh][lh][nh][oh][sh][ai][bi][ci][li][ni][ri][si][lj][nj][oj][qj][rj][dk][fk][gk][hk][ik][jk][kk][lk][ok][pk][qk][rk][el][ll][ml][em][gm][hm][im][jm][km][nm][om][pm][en][gn][hn][ln][nn][qn][eo][go][ko][lo][no][ro][so][ep][gp][hp][jp][kp][lp][np][qp][cq][eq][hq][iq][jq][oq][dr][or][ds][os]
+AB[fa][ha][bb][db][fb][gb][hb][cc][fc][fd][rd][sd][ee][fe][me][ne][oe][re][af][bf][cf][df][ef][mf][of][pf][qf][rf][sf][bg][mg][ah][bh][mh][qh][mi][oi][qi][mj][pj][mk][nk][sk][fl][gl][hl][il][jl][kl][nl][ol][pl][ql][rl][sl][fm][lm][mm][rm][fn][in][jn][kn][mn][rn][sn][fo][ho][jo][mo][fp][mp][fq][gq][kq][lq][mq][fr][gr][hr][ir][jr][kr][mr][fs][ls][ms]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_022.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_022.sgf
new file mode 100644 (file)
index 0000000..9513165
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1112234b. Black always alive, can white make seki? Semiai Class e.
+
+G19 F19: white alive
+A13 A8: black and white to play B11
+O7 O8: white alive
+]
+AW[ba][ca][ea][ga][ha][ia][ja][ka][la][pa][cb][eb][gb][hb][lb][pb][cc][dc][ec][gc][kc][lc][pc][cd][ed][hd][jd][kd][nd][pd][ce][de][ee][fe][he][ie][je][oe][pe][ff][nf][ag][bg][cg][dg][eg][gg][hg][ig][jg][kg][lg][mg][ng][pg][ah][eh][gh][di][ei][gi][aj][cj][dj][ej][gj][ak][bk][ck][gk][kk][mk][nk][ok][pk][qk][rk][sk][gl][ll][cm][dm][em][fm][gm][lm][nm][om][pm][qm][rm][sm][dn][ln][nn][on][sn][do][lo][no][ro][so][cp][jp][lp][np][op][qp][rp][aq][bq][cq][kq][pq][qq][jr][lr][js][ks][ls]
+AB[fa][ma][oa][ab][bb][fb][ib][kb][mb][nb][ob][bc][fc][ic][jc][mc][oc][ad][bd][fd][gd][md][od][be][ge][me][ne][af][bf][cf][df][ef][gf][hf][if][jf][kf][lf][mf][fg][bh][ch][fh][ai][ci][fi][bj][fj][ek][fk][al][bl][cl][dl][el][fl][ml][nl][ol][pl][ql][rl][sl][bm][mm][an][bn][mn][qn][bo][mo][po][ap][bp][mp][pp][lq][mq][sq][mr][nr][or][pr][qr][rr][sr][ms][qs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_023.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_023.sgf
new file mode 100644 (file)
index 0000000..db3cf52
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-03]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Eye size 7 t1112234b. Black always alive, can white make seki? Semiai Class e.
+
+O19 N19: black and white to play Q18|R17
+G13 G14: black and white to play J11
+A7 A8:  white alive
+]
+AW[ja][ka][la][na][oa][pa][qa][ra][sa][jb][lb][nb][ob][sb][cc][ec][fc][gc][hc][kc][nc][rc][sc][bd][dd][hd][jd][kd][ld][nd][od][qd][rd][de][he][ie][je][le][oe][pe][qe][cf][lf][mf][cg][gg][hg][ig][jg][kg][ng][og][pg][qg][ch][eh][gh][hh][lh][nh][ci][ei][gi][ki][li][ni][pi][qi][ej][gj][hj][jj][kj][lj][qj][ak][bk][ck][dk][ek][fk][hk][ik][jk][kk][rk][sk][hl][pl][ql][am][bm][cm][dm][em][im][jm][km][om][an][en][gn][hn][ln][mn][nn][do][eo][go][io][ko][ap][cp][dp][gp][aq][bq][cq][gq][gr][gs]
+AB[ma][mb][qb][mc][oc][pc][ed][fd][gd][md][pd][sd][ee][ge][me][ne][re][se][df][ff][gf][hf][if][jf][kf][nf][of][pf][qf][rf][sf][dg][eg][fg][lg][mg][rg][fh][jh][mh][rh][sh][fi][hi][ji][mi][ri][fj][ij][mj][nj][oj][rj][sj][gk][lk][mk][ok][al][bl][cl][dl][el][fl][gl][il][jl][kl][ll][nl][fm][gm][hm][lm][mm][nm][bn][fn][ao][co][fo][bp][fp][eq][fq][ar][br][cr][dr][er][cs][es]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_024.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_024.sgf
new file mode 100644 (file)
index 0000000..7efc937
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-09]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Corner t2222 eye
+
+A3 A4: White plays A5|B5 and wins, black plays F1 and wins.
+
+T3 T4: White playsQ5|R5|S5|T5 and wins, black plays T2|S1 and wins.
+
+T17 T16 black wins unconditionally
+
+A17 A16: White plays A19 and wins, black plays D19 and wins
+
+]
+PL[B]
+AW[ca][ga][na][qa][cb][gb][nb][qb][ac][bc][cc][gc][nc][qc][rc][sc][ed][fd][nd][ae][be][ce][de][ee][fe][oe][pe][qe][re][se][an][bn][pn][qn][rn][sn][co][do][eo][oo][ep][hp][op][aq][bq][cq][eq][fq][gq][oq][qq][rq][sq][cr][hr][or][qr][cs][ds][es][hs][os][qs]
+AB[ba][ea][pa][ab][bb][db][eb][pb][rb][dc][ec][pc][ad][bd][cd][dd][pd][qd][rd][sd][ap][bp][cp][dp][pp][qp][rp][sp][dq][pq][ar][dr][er][fr][gr][pr][bs][gs][ps][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_025.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_025.sgf
new file mode 100644 (file)
index 0000000..6a3a8b8
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-09]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Corner t2222 eye
+
+A3 A4: Seki pass.
+
+T3 T4: White and black play S2 and win
+
+T17 T16 white P19|P18|P17 and win, black S19|S18|T18 and win.
+
+A17 A16: Black plays D19 ONLY and wins ( if plays A19 black captures winning liberties ). White plays F19|E16 and wins.
+
+]
+PL[B]
+AW[ca][ga][na][qa][cb][fb][nb][qb][ac][bc][cc][ec][nc][qc][rc][sc][fd][nd][od][ae][be][ce][de][ee][fe][oe][pe][qe][re][se][am][bm][cm][cn][pn][qn][rn][sn][co][do][eo][oo][ep][hp][op][aq][bq][cq][eq][fq][gq][oq][qq][rq][sq][cr][hr][or][qr][cs][ds][es][hs][os][qs][ss]
+AB[ea][pa][ab][bb][db][eb][pb][dc][pc][ad][bd][cd][dd][pd][qd][rd][sd][an][bn][bo][ap][bp][cp][dp][pp][qp][rp][sp][dq][pq][ar][dr][er][fr][gr][pr][bs][gs][ps]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_026.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_026.sgf
new file mode 100644 (file)
index 0000000..5079698
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-09]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Corner t2222 and t1122 eye
+
+A3 A4: Black plays A1 and wins white plays C1 and wins.
+
+T3 T4: White KO and black WIN play T1 
+
+T17 T16 black T19 and seki, white t19 and win.
+
+A17 A16: white B18 and black D19|D18 and win.
+]
+PL[W]
+AW[ca][ga][na][pa][cb][gb][nb][pb][qb][rb][ac][bc][cc][fc][nc][rc][sc][fd][nd][ae][be][ce][de][ee][fe][ne][oe][pe][qf][sf][qg][sg][qh][qi][qj][rj][sj][al][bl][cl][cm][qm][rm][sm][dn][pn][do][eo][oo][ep][hp][op][rp][sp][aq][bq][fq][gq][oq][rq][br][cr][dr][hr][nr][or][qr][rr][ds][es][hs][ns][qs]
+AB[ba][ea][oa][ra][ab][eb][ob][dc][ec][oc][ad][bd][cd][dd][od][pd][qd][rd][sd][re][rf][rg][rh][ri][si][an][bn][bo][qo][ro][so][ap][bp][cp][dp][pp][qp][dq][eq][pq][ar][er][fr][gr][pr][sr][bs][gs][ps]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_027.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_027.sgf
new file mode 100644 (file)
index 0000000..05bb7fd
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-09]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+C[Corner t2222 eye
+
+A3 A4: White A1 black F1 and win.
+
+T3 T4: White wins unconditionally
+
+T17 T16 white P19|P18 and win, black S19|T18 and win.
+
+A17 A16: Black plays D19  and wins  White plays A19 and wins.
+]
+PL[W]
+AW[ca][ga][na][qa][sa][cb][fb][nb][qb][ac][bc][cc][gc][nc][oc][qc][rc][sc][fd][nd][od][ae][be][ce][de][ee][fe][oe][pe][qe][re][se][am][bm][cm][cn][pn][qn][rn][sn][co][do][eo][oo][ep][hp][op][aq][bq][cq][eq][fq][gq][oq][qq][rq][sq][br][cr][hr][or][qr][sr][cs][ds][es][hs][os][qs][rs]
+AB[ba][ea][pa][ab][bb][db][eb][pb][rb][dc][pc][ad][bd][cd][dd][pd][qd][rd][sd][an][bn][bo][ap][bp][cp][dp][pp][qp][rp][sp][dq][pq][ar][dr][er][fr][gr][pr][bs][gs][ps]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_028.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_028.sgf
new file mode 100644 (file)
index 0000000..0083b33
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-08]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];;
+C[Size 5 side eyes. Black always alive can white make seki ?
+
+A15 A14 Unsettled w&b to play A17
+A2 A1 white to play A5 black to play A3 (better than A5)
+K1 H1 white to play L2 black to play M1
+T10 T11 white alive
+Q19 R18 b&w to play O19
+]
+AW[aa][ba][ca][ga][ja][la][pa][cb][gb][jb][lb][mb][ob][pb][cc][ec][fc][gc][jc][mc][oc][bd][cd][fd][jd][md][nd][od][ae][be][fe][je][ff][jf][qf][rf][sf][eg][gg][ig][kg][lg][mg][ng][og][pg][qg][ch][dh][eh][gh][oh][rh][sh][ai][bi][ci][di][gi][oi][ej][oj][qj][rj][sj][ek][ok][qk][dl][el][ol][ql][rl][am][bm][em][om][rm][bn][cn][en][fn][gn][hn][in][jn][kn][ln][mn][nn][on][rn][co][eo][oo][ro][so][bp][cp][ep][op][pp][bq][eq][jq][kq][lq][mq][pq][qq][ar][br][er][jr][mr][nr][qr][es][js][ns][qs]
+AB[da][fa][ka][ma][oa][qa][ab][bb][db][eb][fb][kb][nb][qb][rb][sb][bc][dc][kc][pc][qc][dd][kd][pd][qd][rd][sd][de][ke][le][me][ne][oe][pe][af][bf][cf][df][bg][ah][bh][pi][qi][ri][si][aj][bj][cj][dj][pj][bk][dk][pk][sk][al][bl][cl][pl][cm][dm][pm][sm][an][dn][pn][bo][do][po][qo][ap][dp][fp][gp][hp][ip][jp][kp][lp][mp][np][qp][rp][sp][cq][dq][fq][hq][iq][nq][oq][rq][cr][fr][gr][hr][lr][or][rr][sr][as][bs][cs][fs][hs][ks][ms][os][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_029.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_029.sgf
new file mode 100644 (file)
index 0000000..5bcf2d8
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-08]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];;
+C[Size 5 side eyes. Black always alive can white make seki ?
+
+A9 A8 white to play A11 black to play C13
+Q1 P1 b&w to play S1
+T16 T17 b&w to play T14
+K19 L19 white alive
+]
+AW[fa][ja][oa][ab][fb][gb][ib][jb][ob][ac][gc][ic][nc][oc][ad][bd][cd][gd][hd][id][ld][nd][rd][sd][ce][de][ee][le][ne][pe][qe][re][ef][ff][gf][hf][if][jf][kf][lf][nf][pf][ag][bg][fg][ng][pg][qg][rg][bh][ch][dh][fh][nh][rh][sh][di][fi][ni][bj][cj][dj][fj][oj][pj][qj][rj][sj][ak][bk][fk][nk][fl][nl][fm][nm][qm][rm][sm][fn][on][pn][qn][co][do][eo][lo][no][ap][bp][fp][mp][cq][eq][lq][pq][qq][rq][sq][lr][pr][sr][ls][ps]
+AB[ba][da][ha][ka][ma][qa][ra][bb][cb][db][kb][lb][mb][qb][sb][dc][hc][kc][pc][qc][rc][sc][dd][ed][fd][kd][od][pd][fe][ge][he][ie][je][ke][oe][se][af][bf][cf][df][of][rf][dg][eg][og][ah][eh][oh][ph][bi][ci][ei][pi][qi][ri][si][aj][ej][ck][dk][ek][al][bl][cl][el][cm][dm][em][an][bn][cn][rn][sn][ro][op][pp][qp][rp][sp][oq][mr][nr][or][ms][os][qs][ss]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_030.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_030.sgf
new file mode 100644 (file)
index 0000000..da33a33
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-08]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];;
+C[Side eye t122223. Black always alive can white make seki ?
+
+A15 A14 w&b to play A16
+A1 D1 white to play A1|B2 black to play A2
+K1 L1 white alive pass
+T4 T3 black to play T7 white to play T7|S5
+N19 M19 black to play P19 white to play P19|O19
+]
+AW[ba][ja][ma][ra][sa][bb][cb][jb][mb][pb][qb][rb][cc][gc][hc][ic][kc][mc][nc][oc][pc][cd][fd][kd][ae][be][ce][fe][le][ff][kf][mf][ag][bg][cg][dg][eg][gg][lg][ng][og][pg][qg][rg][sg][oi][pi][qi][ri][si][aj][bj][cj][dj][ej][nj][ek][nk][rk][sk][el][nl][rl][em][fm][gm][hm][im][jm][km][lm][mm][nm][qm][rm][an][bn][en][nn][qn][bo][eo][no][qo][bp][cp][fp][np][qp][rp][sp][aq][cq][eq][fq][gq][hq][nq][cr][er][hr][ir][jr][nr][as][bs][cs][es][gs][js][ns]
+AB[da][fa][ha][la][pa][ab][db][eb][fb][gb][hb][lb][nb][ob][sb][bc][dc][lc][qc][rc][sc][dd][ld][md][nd][od][pd][qd][de][oe][re][se][af][bf][cf][df][of][pf][qf][rf][pj][qj][rj][sj][ak][bk][ck][dk][ok][pk][qk][bl][dl][ol][ql][sl][am][bm][cm][dm][om][pm][dn][on][pn][rn][do][fo][go][ho][io][jo][po][so][ap][dp][ep][jp][kp][lp][mp][pp][bq][dq][kq][mq][pq][qq][rq][sq][dr][fr][kr][lr][mr][pr][rr][ds][fs][hs][ks][ms][ps][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_031.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_031.sgf
new file mode 100644 (file)
index 0000000..18d8a40
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-08]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];;
+C[Side eye t122223. Black always alive can white make seki ?
+
+A8 A7 black to play C12|C13 white to play B9
+R1 S1 black to play P1 white to play P1|N2
+T11 T10 b&w to play T14
+L19 M19 b&w to play H18
+]
+AW[ca][fa][ka][ra][sa][ab][bb][cb][fb][ib][jb][kb][pb][qb][rb][cc][fc][gc][hc][ic][nc][oc][pc][cd][nd][rd][sd][ae][be][ce][de][ne][re][ef][ff][nf][qf][rf][ag][bg][fg][gg][hg][ig][jg][kg][lg][mg][ng][qg][bh][nh][qh][bi][ci][fi][ni][qi][ri][si][cj][fj][nj][ck][fk][nk][al][bl][cl][fl][ol][fm][pm][qm][rm][sm][fn][in][kn][ln][mn][nn][on][eo][io][ko][po][qo][ro][so][ep][jp][aq][bq][cq][dq][fq][jq][lq][mq][nq][oq][jr][lr][or][pr][qr][js][ls][ns][qs]
+AB[da][ga][ia][la][na][db][lb][mb][nb][sb][dc][lc][qc][rc][sc][dd][ed][jd][kd][ld][od][pd][qd][ee][fe][ge][he][ie][je][le][oe][af][bf][cf][df][kf][lf][of][dg][og][rg][ah][dh][oh][ph][sh][ai][di][pi][bj][dj][pj][qj][rj][sj][ak][dk][pk][rk][dl][pl][ql][rl][sl][am][bm][cm][dm][bn][dn][ao][bo][co][do][lo][mo][no][kp][lp][np][op][pp][rp][sp][kq][pq][qq][rq][kr][nr][rr][sr][ks][ms][ps][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_032.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_032.sgf
new file mode 100644 (file)
index 0000000..aa21db7
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-17]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Side 6 side eye t222233. Black always alive can white make seki ?
+
+A15 A14 white to play A17|B17 black to play D15
+A3 D1 b&w to play B5
+P1 Q1 b&w to play O1
+T11 T12 white alive
+L19 K19 white alive
+]
+AW[aa][ba][ca][ha][ka][ma][oa][cb][hb][kb][ob][cc][fc][gc][hc][kc][lc][mc][nc][oc][qc][rc][sc][cd][hd][qd][ae][be][ce][he][qe][hf][nf][of][pf][qf][hg][ig][jg][kg][lg][mg][ng][ah][bh][ch][dh][eh][fh][gh][nh][ci][ni][qi][ri][si][aj][bj][nj][qj][ck][dk][ek][fk][gk][nk][qk][sk][gl][nl][ql][am][bm][cm][gm][nm][qm][rm][sm][cn][gn][nn][co][go][io][jo][ko][lo][mo][no][oo][po][qo][ro][cp][gp][ip][rp][sp][aq][bq][cq][fq][hq][kq][lq][mq][nq][oq][fr][hr][kr][or][fs][hs][ks][os]
+AB[da][fa][ja][la][na][pa][ra][ab][bb][db][eb][fb][jb][nb][pb][qb][rb][sb][dc][jc][pc][ad][bd][dd][ed][jd][pd][rd][sd][ee][fe][je][ke][le][me][ne][oe][pe][re][af][bf][cf][df][ff][rf][sf][dg][eg][fg][rg][oh][ph][qh][rh][sh][oi][oj][rj][sj][ok][rk][al][bl][cl][dl][el][ol][em][om][pm][an][en][pn][qn][rn][sn][eo][dp][ep][jp][kp][lp][mp][np][op][pp][dq][jq][pq][ar][br][cr][dr][jr][mr][nr][pr][qr][rr][sr][bs][ds][js][ls][ps][rs]
+)
diff --git a/regression/games/STS-RV/Class01eProblems/_semeai_Ce_033.sgf b/regression/games/STS-RV/Class01eProblems/_semeai_Ce_033.sgf
new file mode 100644 (file)
index 0000000..b87ca3e
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-17]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Side 6 side eye t222233. Black always alive can white make seki ?
+
+A9 A8 white dead
+J1 K1 b&w to play H1|G2
+T5 T6 white dead
+T17 T18 black to play T14 white to lay S16
+J19 K19 white alive
+]
+AW[ca][ea][ga][ia][na][ab][bb][cb][eb][ib][nb][cc][ec][fc][gc][hc][ic][nc][qc][rc][sc][cd][nd][qd][ae][be][ce][de][le][me][ne][qe][se][ef][ff][gf][hf][if][jf][kf][lf][qf][ag][bg][cg][fg][mg][qg][rg][sg][ch][fh][mh][ci][fi][mi][cj][fj][mj][nj][oj][pj][qj][rj][sj][ak][bk][ck][fk][fl][nl][ol][pl][ql][rl][sl][fm][nm][en][fn][gn][hn][in][jn][kn][ln][nn][co][do][eo][lo][mo][no][qo][ro][so][ap][bp][cp][lp][qp][eq][fq][gq][hq][iq][lq][qq][er][ir][lr][qr][es][is][ls][qs][rs][ss]
+AB[da][ja][la][pa][ra][db][gb][jb][kb][lb][pb][qb][rb][sb][dc][jc][lc][pc][dd][ed][jd][kd][ld][pd][sd][ee][fe][ge][he][ie][je][oe][pe][re][af][bf][cf][df][of][dg][eg][og][ah][eh][oh][ph][qh][rh][sh][bi][ei][aj][ej][ek][al][bl][cl][dl][el][bm][dm][an][bn][cn][dn][pn][qn][rn][sn][po][dp][ep][fp][gp][hp][ip][jp][np][op][pp][rp][sp][dq][jq][nq][pq][sq][ar][br][cr][dr][hr][jr][nr][or][pr][rr][bs][ds][fs][gs][js][ns][ps]
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_001.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_001.sgf
new file mode 100644 (file)
index 0000000..7b8022a
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-08]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[W]
+C[Strange semiai involving ko inside the eye. 
+
+J1 K1: White plays G1 and wins. If black plays G1 its useless (not enough liberties) but if he plays G2 gets a ko then threatens at Q2 white makes two eyes and black scapes.
+So black G2 and seki, white G1 and win.
+
+A8 A7: Black to play B9 and win. White to play  A10 (gaining 8 liberties) and win.
+
+A10 A9: Black to play T15|S13|S11 and win. White to play S11, S13 and gets a ko. Since black has no threats, white wins the ko and the semiai. If black answers T12 white wins the semiai on liberties.
+]
+AW[ob][pb][nc][qc][rc][sc][bd][cd][dd][nd][od][pd][qd][ae][be][de][ne][ef][nf][qf][rf][sf][ag][bg][eg][ng][qg][bh][fh][nh][qh][bi][ci][fi][ni][qi][cj][fj][mj][oj][qj][rj][sj][ck][fk][mk][ok][al][bl][cl][fl][nl][ol][pl][ql][rl][sl][fm][an][bn][cn][dn][en][jp][kp][lp][mp][np][op][eq][fq][gq][hq][jq][oq][pq][er][hr][ir][mr][pr][es][is][ls][ms][ps]
+AB[rd][sd][pe][qe][re][af][bf][cf][pf][cg][pg][sg][ah][ch][dh][ph][rh][ai][di][pi][si][bj][dj][pj][ak][dk][pk][qk][rk][sk][dl][am][bm][cm][dm][dp][ep][fp][gp][hp][ip][cq][dq][iq][kq][lq][mq][nq][cr][dr][jr][kr][nr][cs][ds][fs][hs][js][ks][ns]
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_002.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_002.sgf
new file mode 100644 (file)
index 0000000..90d4c8b
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]C[
+];
+AW[od][qd][kg][lg][mg][ng][og][pg][qg][rg][sg][jh][ji][jj][mj][nj][oj][pj][qj][kk][lk][nk][ok][sk][kl][ol][rl][km][om][kn][ln][mn][nn][on][pn][po][qo][ro][so]
+AB[li][mi][ni][oi][pi][qi][ri][si][kj][lj][rj][jk][qk][rk][jl][ml][ql][jm][qm][jn][qn][rn][sn][ko][lo][mo][no][oo][jp][pp][qp][rp][sp][or][qr]
+C[Side 6 eye against side 7 center eye.
+
+Black 19 libs, White19 libs. Fight unsettled; white and black eyes unsettled
+]
+PL[W]
+(;B[tt])
+
+(;B[mm];W[sm];B[nl];W[sh];B[nm];W[rh];B[mk];W[qh];B[ll];W[ph];B[pk];
+W[oh];B[pl];W[nh];B[pm];W[lm];B[ml];W[mh];B[nl];W[lh];B[mm];W[ki];
+B[ll];W[sl];B[mk];W[nm];B[ml];W[rm];B[sj];W[sl])
+
+(;W[mm];B[sm]C[seki
+])
+
+(;W[sm];B[mm];W[ki];B[ll];W[lh];B[lm];W[mh];B[nl];W[nh];B[mk];W[oh];
+B[pk];W[ph];B[pl];W[qh];B[pm];W[nm];B[ml];W[rh];B[ll];W[sh];B[mm];
+W[sl];B[lm];W[rm];B[sj];W[sl];B[mk];W[nl];B[ml])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_003.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_003.sgf
new file mode 100644 (file)
index 0000000..b10229e
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Corner 4 against side 5.
+Both can make two eyes but both should try to kill. The liberty count is equal, the fight is unsettled.
+White to play D4 and win, black to play J1 and win
+]
+PL[W]
+AW[am][bm][an][cn][dn][en][ao][co][fo][ep][fp][fq][hq][iq][jq][kq][gr][hr][kr][es][fs][gs][ks]
+AB[bo][do][io][jo][lo][bp][cp][gp][hp][ip][jp][kp][mp][aq][bq][cq][eq][gq][lq][mq][cr][dr][er][fr][ir][jr][lr][nr][cs][ls][ms]
+(;B[tt])
+
+(;B[is];W[dp];B[js];W[ap];B[ds];W[hs];B[is];W[dq];B[ir];W[ar];B[js];
+W[jr];B[is];W[bs];B[ir];W[bn])
+
+(;W[dp];B[is];W[ap];B[js];W[dq];B[ds];W[hs];B[js];W[ar];B[is];W[bs];
+B[ir];W[jr];B[is];W[bn];B[ir];W[br])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_004.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_004.sgf
new file mode 100644 (file)
index 0000000..1905ac5
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[B]
+AW[kd][je][le][me][oe][jf][nf][eg][fg][gg][hg][ig][og][eh][hh][kh][ph][ei][ii][li][pi][ej][fj][ij][lj][oj][fk][gk][hk][ik][ok][jl][ll][nl][jm][lm][mm][om]
+AB[hd][ee][fe][ge][cf][df][hf][if][jg][kg][lg][mg][ch][dh][gh][jh][mh][nh][fi][ji][ni][cj][dj][gj][jj][mj][jk][kk][lk][mk][dl][el][il][em][fm][gm][hm][im]
+C[This is a class e semeai.
+L11 point to play for both black to win white to seki
+]
+(;B[tt])
+
+(;W[ki];B[gf];W[mf];B[ff];W[lf];B[ef];W[kf];B[dg];W[ng];B[di];W[oh];
+B[ek];W[oi];B[fl];W[kl];B[gl];W[ml];B[hl];W[nk];B[hi];W[nj];B[gi];
+W[lh];B[hj];W[mi])
+
+(;B[ki];W[lh])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_005.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_005.sgf
new file mode 100644 (file)
index 0000000..9d64d1a
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[B]
+AW[bb][ac][bc][cc][cd][ce][cf][ag][bg][cg][eg][dh][eh][fh][ci][di][fi][ej][ak][ek][el][dm][em][an][bn][cn][dn][eo]
+AB[aa][ba][ca][ea][cb][db][eb][ec][ad][dd][ed][be][de][df][dg][bh][ch][ai][bi][bj][cj][dj][dk][bl][cl][dl][am][bm]
+C[Class e semeai
+White B9 seki, black B9 wins
+]
+(;B[tt])
+
+(;B[bk])
+
+(;W[bk];B[af];W[cm];B[ab];W[al];B[dc];W[bf];B[ae];W[aj])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_006.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_006.sgf
new file mode 100644 (file)
index 0000000..ec6ebb5
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[B]
+AW[aa][da][ea][ja][eb][fb][ib][jb][dc][fc][gc][hc][ic][dd][de][af][df][ag][bg][cg][bh][dh]
+AB[ga][ha][ka][bb][cb][db][gb][hb][kb][bc][ec][jc][kc][ad][bd][ed][fd][gd][hd][id][jd][ld][be][bf]
+C[White B19|C19|A18 wins
+Black A18|C19 wins
+]
+(;B[tt]PL[B])
+
+(;W[ba];B[ca];W[ab];B[fa];W[ia];B[ga];W[cf];B[gb];W[ce];B[hb];W[cd];
+B[ha];W[fa];B[ga];W[cc];B[gb];W[ae];B[ac];W[aa];B[hb];W[ha];B[gb])
+
+(;W[ca];B[ba];W[ab];B[fa];W[ia];B[ga];W[cf];B[gb];W[ce];B[ha];W[cd];
+B[hb];W[fa];B[ga];W[cc];B[gb];W[ae];B[ac];W[aa])
+
+(;W[ab];B[ca];W[cf];B[fa];W[ia];B[ga];W[ce];B[gb];W[cd];B[fa];W[cc];
+B[ha];W[hb];B[ga];W[ae];B[gb];W[ba];B[ac];W[aa];B[fa];W[ha];B[ga])
+
+(;B[ab];W[ca];B[ba])
+
+(;B[ca];W[ab];B[fa];W[ia];B[ga];W[cc];B[gb];W[cd];B[fa];W[ce];B[ha];
+W[hb];B[ga];W[cf];B[gb];W[ae];B[fa];W[ha];B[ga];W[ac];B[ba];W[ab];
+B[gb])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_007.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_007.sgf
new file mode 100644 (file)
index 0000000..280609f
--- /dev/null
@@ -0,0 +1,63 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]
+C[About detecting class e related to np liberties.
+];PL[W]
+AW[da][oa][pa][qa][ra][bb][cb][db][gb][ib][lb][nb][pb][dc][gc][ic][lc][nc][dd][gd][od][pd][qd][rd][sd][ee][fe][ge][re][ah][bh][ch][dh][bi][bj][cj][dj][ek][dl][el][cm][an][cn][bo][co][ko][lo][mo][kp][mp][op][pp][qp][rp][sp][aq][bq][cq][jq][lq][nq][jr][kr][lr][nr][os][ps][qs][rs]
+AB[ba][ea][na][sa][ab][eb][fb][ob][sb][bc][ec][oc][pc][qc][rc][sc][bd][ed][nd][be][ce][de][ne][oe][df][nf][of][pf][qf][rf][ag][bg][cg][dg][eg][eh][fh][qh][rh][sh][fi][ej][gj][ak][bk][ck][dk][fk][bl][bm][bn][on][pn][qn][rn][sn][ao][no][oo][np][oq][pq][qq][rq][sq][or][sr][ms][ss]
+C[NE: Black wins Q15|R15 white wins N19
+SE:  Black wins  T5|S5|R5|Q5|O1 white wins O1|S2|R2|Q2
+NW: Black wins C17|C16 white wins F17|F16
+SW: Black wins  D11|A10 white wins A10|D11
+]
+(;W[tt])
+
+(;B[ns];W[mr];B[so];W[rr];B[ro];W[ls];B[qo];W[pr])
+
+(;W[pr];B[ns];W[mr];B[so];W[ls];B[ro];W[rr];B[qo])
+
+(;B[cc];W[fc];B[cd];W[fd])
+
+(;W[fc];B[cc];W[fd];B[cd])
+
+(;W[aj]PL[W];B[di]PL[W]
+(;W[cl]
+(;B[ei];W[am];B[al];W[an])
+
+(;B[am];W[ap];B[ei];W[an])
+)
+
+(;W[am];B[ei];W[cl];B[al];W[an])
+)
+
+(;B[aj];W[am];B[di];W[ap]PL[B]
+(;B[ei];W[cl];B[ci];W[al])
+
+(;B[ai];W[cl];B[ci])
+)
+
+(;W[ma];B[pe];W[qb];B[qe];W[rb])
+
+(;B[pe];W[ma];B[qe];W[qb];B[se])
+
+(;W[di];B[aj]
+(;W[cl]
+(;B[ai];W[am];B[al];W[an])
+
+(;B[ei];W[am];B[al];W[an];B[am];W[ap])
+
+(;B[am];W[ap];B[ei];W[an])
+)
+
+(;W[am];B[ei];W[cl];B[al];W[an];B[am])
+)
+
+(;B[di];W[aj];B[ei];W[cl];B[ci])
+
+(;W[ap];B[aj];W[am];B[di];W[cl];B[ei];W[ao];B[ci];W[al])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_008.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_008.sgf
new file mode 100644 (file)
index 0000000..cfefae1
--- /dev/null
@@ -0,0 +1,52 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-04]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)]
+C[About detecting class e related to np liberties.
+];PL[B]
+AW[da][ha][oa][pa][qa][ra][bb][cb][db][hb][ib][lb][nb][dc][gc][ic][lc][nc][dd][gd][od][pd][qd][rd][sd][ee][fe][ge][pe][re][ah][bh][ch][dh][bi][bj][cj][dj][ek][dl][el][cm][an][cn][bo][co][ko][lo][mo][ro][kp][mp][op][pp][qp][rp][sp][bq][cq][jq][lq][nq][ar][br][jr][kr][lr][nr][os][ps][qs][rs]
+AB[ba][ea][ga][sa][ab][eb][fb][gb][ob][sb][bc][ec][oc][pc][qc][rc][sc][bd][ed][nd][be][ce][de][ne][df][nf][of][pf][qf][rf][ag][bg][cg][dg][eg][eh][fh][qh][rh][sh][fi][ej][gj][ak][bk][ck][dk][fk][bl][rl][sl][bm][bn][on][pn][qn][rn][ao][no][oo][ap][np][oq][pq][qq][rq][sq][or][rr]
+C[NW: black C17|C16 wins white F17|F16 wins
+NE: black P15|R15 wins white Q18|R18|S18 wins
+SW black and white D11|A10 win
+SE: black Q5|R5 wins white R2|Q2 wins
+]
+(;B[tt])
+
+(;B[cc];W[fc];B[cd];W[fd];B[ca])
+
+(;W[fd];B[cd];W[fc];B[cc];W[fa])
+
+(;W[pb];B[oe];W[qb];B[qe];W[rb])
+
+(;B[qe];W[pb];B[oe];W[qb];B[se])
+
+(;W[aj];B[di];W[am]
+(;B[ei];W[cl];B[al];W[an];B[ci];W[am])
+
+(;B[al];W[an];B[am];W[cl];B[an])
+)
+
+(;B[aj];W[cl];B[di];W[am];B[al];W[an];B[ei])
+
+(;W[qr]PL[B]
+(;B[qo];W[pr];B[po];W[sr])
+
+(;B[ss]
+(;W[sr];B[ll];W[kl];B[ss];W[kk];B[qo];W[sr];B[ol];W[nl];B[ss];W[nk];
+B[po])
+
+(;W[ns];B[qo];W[pr];B[po];W[sr])
+)
+)
+
+(;B[qo];W[qr];B[po];W[pr];B[so])
+
+(;W[di];B[aj];W[am];B[ei];W[cl];B[al];W[an];B[am];W[bp])
+
+(;B[di];W[aj];B[ei];W[am];B[ci])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_009.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_009.sgf
new file mode 100644 (file)
index 0000000..aee7f05
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];C[Corner 4 against side 5.
+]
+AW[an][bn][cn][dn][ao][do][cp][dp][ep][fp][dq][fq][hq][iq][jq][kq][gr][hr][kr][es][fs][ks]
+AB[bo][io][jo][lo][bp][gp][hp][ip][jp][kp][mp][aq][bq][cq][gq][lq][mq][cr][dr][er][fr][lr][nr][cs][is][ls]
+PL[W]
+(;B[tt]C[black G1 ko white G1 win
+])
+
+(;B[gs];W[hs];B[ir];W[ap];B[jr];W[co];B[ds];W[ar];B[gs];W[fs];B[es];
+W[bs];B[gs];W[js];B[ir];W[fs];B[is];W[eq];B[gs])
+
+(;W[gs];B[ir];W[ap];B[js];W[co];B[hs];W[eq];B[ds];W[jr];B[is];W[ar];
+B[ir];W[bs];B[js];W[br])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_010.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_010.sgf
new file mode 100644 (file)
index 0000000..e8811d1
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Corner 4 against side 5.
+black D4 seki, J1 win
+white D4 win
+]PL[W]
+AW[am][bm][an][cn][dn][en][ao][co][fo][fp][fq][hq][iq][jq][kq][gr][hr][kr][es][fs][gs][ks]
+AB[bo][do][io][jo][lo][bp][cp][gp][hp][ip][jp][kp][mp][aq][bq][cq][eq][gq][lq][mq][cr][dr][er][fr][ir][lr][nr][cs][js][ms]
+(;B[tt]C[
+])
+
+(;B[dp];W[is];B[hs]PL[W];W[jr];B[ls];W[is])
+
+(;B[is];W[dp];B[hs];W[ep]PL[B];B[ls];W[dq];B[ds];W[jr];B[is];W[ap];
+B[hs];W[bn];B[ir];W[js];B[is];W[ar];B[ir])
+
+(;W[dp]PL[B]
+(;B[is];W[ep];B[hs];W[dq];B[ls];W[ap];B[ds];W[jr];B[is];W[bn];B[ir];
+W[ar];B[hs];W[js];B[is];W[bs])
+
+(;B[ep];W[eo];B[is];W[do];B[ls];W[dq];B[hs];W[bn];B[ds];W[jr];B[is];
+W[ap];B[ir];W[ar];B[hs];W[js];B[is];W[bs])
+)
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_011.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_011.sgf
new file mode 100644 (file)
index 0000000..b4b5a67
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+C[Corner 4 against side 5.
+black J1 win, white D4 win
+]PL[W]
+AW[am][bm][an][cn][dn][en][ao][co][fo][fp][fq][hq][iq][jq][kq][gr][hr][kr][es][fs][gs][ks]
+AB[bo][do][io][jo][lo][bp][cp][gp][hp][ip][jp][kp][mp][aq][bq][cq][eq][gq][lq][mq][cr][dr][er][fr][ir][jr][lr][nr][cs][ms]
+(;B[tt])
+
+(;W[dp];B[is];W[ep];B[ls];W[ap];B[js];W[ar];B[ds];W[hs];B[is];W[dq];
+B[ir];W[bs];B[js];W[jr];B[is];W[bn])
+
+(;B[is]PL[W];W[dp];B[ls];W[ap];B[js];W[ep];B[ds];W[hs];B[is];W[ar];
+B[ir];W[bn];B[js];W[jr];B[is];W[bs];B[ir])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_012.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_012.sgf
new file mode 100644 (file)
index 0000000..a4c2aec
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[B]
+AW[le][me][oe][jf][kf][lf][nf][eg][fg][gg][hg][ig][ng][og][eh][hh][oh][ei][ii][li][oi][ej][fj][ij][lj][oj][fk][gk][hk][ik][ok][jl][ll][nl][jm][km][lm][mm][om]
+AB[hd][ge][cf][df][ef][ff][hf][if][dg][jg][kg][lg][mg][ch][dh][jh][mh][ci][fi][gi][ji][ni][cj][dj][gj][jj][mj][dk][jk][kk][lk][mk][dl][el][fl][gl][il][gm][hm][im]
+C[White L11 seki
+black O12 O10 L11 win. L11 best
+]
+(;B[tt])
+
+(;W[ki];B[gf];W[nh];B[nj];W[mf]PL[B];B[di];W[nk];B[ek];W[ml];B[hl];
+W[kl];B[hi];W[mi];B[gh];W[lh];B[hj];W[kj])
+
+(;B[ki];W[mi];B[nh])
+
+(;B[nh];W[ki];B[gf];W[nj];B[di];W[nk];B[ek];W[ml];B[hl];W[mf];B[gh];
+W[kl];B[hi];W[lh];B[hj];W[mi];B[ih])
+
+(;B[nj];W[ki];B[gf];W[nh];B[di];W[mf];B[ek];W[kl];B[hl];W[ml];B[gh];
+W[nk];B[hi];W[lh];B[hj];W[mi];B[ih])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_013.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_013.sgf
new file mode 100644 (file)
index 0000000..19870b0
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[B]C[White A9 seki black A9 win
+]
+AW[bb][ac][bc][cc][cd][ce][cf][ag][bg][cg][dh][eh][fh][ci][di][fi][ej][bk][ek][el][dm][em][an][bn][cn][dn][eo]
+AB[aa][ba][cb][db][dc][ad][dd][be][de][df][dg][bh][ch][ai][bi][bj][cj][dj][dk][bl][cl][dl][am][bm]
+(;B[tt])
+
+(;W[ak];B[af];W[cm];B[ca];W[al];B[ab];W[bf];B[ae];W[aj])
+
+(;B[ak]C[win
+])
+
+(;B[ca];W[ak];B[ab];W[cm];B[af];W[bf];B[ae];W[aj];B[ah];W[bd];B[ae];
+W[al];B[ck];W[ak];B[af]C[also wins though inferior
+])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_014.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_014.sgf
new file mode 100644 (file)
index 0000000..c949215
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];PL[B]
+C[White B9 seki black B9 win C19 also wins though is inferior
+]
+AW[bb][ac][bc][cc][cd][ce][cf][ag][bg][cg][dh][eh][fh][ci][di][fi][ej][ak][ek][el][dm][em][an][bn][cn][dn][eo]
+AB[aa][ba][cb][db][dc][ad][dd][be][de][df][dg][bh][ch][ai][bi][bj][cj][dj][dk][bl][cl][dl][am][bm]
+(;B[tt])
+
+(;W[bk];B[af];W[cm];B[ca];W[aj];B[ab]
+(;W[al];B[bf])
+
+(;W[bf]PL[B]
+(;B[ae];W[al])
+
+(;B[ah];W[ae])
+)
+)
+
+(;B[bk]C[win
+])
+
+(;B[ca];W[bk];B[ab];W[al];B[af];W[bf];B[ae];W[cm];B[ah];W[bd];B[ae];
+W[aj];B[ck];W[ak];B[af]C[C19 also wins though inferior
+])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_015.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_015.sgf
new file mode 100644 (file)
index 0000000..ed850d8
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-07-25]
+SY[Cgoban 1.9.12]TM[10:00(5x1:00)];
+AW[aa][ea][ja][ab][eb][fb][ib][jb][dc][fc][gc][hc][ic][dd][de][af][df][ag][cg][bh][dh]
+AB[ga][ha][ka][bb][cb][db][gb][kb][bc][ec][jc][kc][ad][bd][ed][fd][gd][hd][id][jd][be][bf]
+PL[B]C[white D19 win black D19 F19 H18 win
+]
+(;B[tt])
+
+(;W[da];B[ca];W[cc];B[hb];W[cd];B[ia];W[fa];B[ha];W[ce];B[hb];W[cf];
+B[ga];W[ae];B[gb];W[ia];B[ha];W[bg];B[ga];W[ba];B[ac];W[aa];B[gb];
+W[hb];B[ga])
+
+(;B[da];W[ba];B[hb];W[cc];B[fa];W[ia];B[ga];W[cd];B[ha];W[ce];B[gb];
+W[cf];B[hb];W[fa];B[gb];W[bg];B[ga];W[ae];B[ha];W[hb];B[ga];W[ca];
+B[ac];W[ba];B[gb])
+
+(;B[hb];W[da];B[ca];W[cc];B[ia];W[fa];B[ha];W[cd];B[hb];W[ce];B[gb];
+W[cf];B[ga];W[ia];B[ga];W[bg];B[ha];W[ae];B[gb];W[hb];B[ga];W[ba];
+B[ac];W[aa];B[gb])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_016.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_016.sgf
new file mode 100644 (file)
index 0000000..f0ee254
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-09-01]
+SY[Cgoban 1.9.12]TM[1:00+4:00/25];
+AW[bb][bc][ad][bd][be][ce][cf][cg][ah][bh][ch][di][ei][ej][ek][bl][cl][el][em][en][do][eo][ap][cp][dp][aq][bq][cq]
+AB[aa][ba][ca][da][db][dc][dd][ed][ee][af][ef][eg][dh][eh][ci][aj][bj][cj][dj][ak][dk][dl][am][cm][dm][an][bn][cn][bo][bp]
+PL[B]C[black and white A18 win
+]
+(;B[tt])
+
+(;W[ab])
+
+(;B[ab];W[bm];B[ac];W[bk];B[cb];W[al];B[cc];W[dn];B[cd];W[co];B[de];
+W[ao];B[df];W[bi];B[dg];W[ai];B[ck];W[bl];B[bf];W[cl];B[ag];W[bk];
+B[ae];W[bg];B[af];W[bm];B[al];W[bl])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_017.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_017.sgf
new file mode 100644 (file)
index 0000000..cda0813
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2004-03-30]
+SY[Cgoban 1.9.12]TM[30:00(5x1:00)];
+C[Black T19 S16 wins
+White S16 wins
+]PL[W]
+AW[ja][ka][la][ma][na][oa][pa][qa][ra][ab][bb][hb][ib][mb][ob][pb][qb][bc][dc][hc][mc][nc][oc][qc][ad][cd][dd][ed][fd][gd][hd][sd][ce][af][bf][cf][rk][sk][rl][rm][sm][on][pn][qn][rn][oo][ro][so][op][oq][or][os][ss]
+AB[ba][ca][da][ea][fa][ga][ha][ia][cb][eb][gb][jb][kb][lb][rb][sb][cc][ec][fc][gc][lc][pc][rc][ld][md][nd][od][pd][qd][qe][re][rf][sf][qj][rj][sj][ok][pk][qk][ol][ql][nm][om][pm][qm][nn][no][np][pp][sp][nq][pq][sq][nr][pr][sr][ns][ps]
+(;W[tt])
+
+(;W[rr];B[rq];W[rs];B[qp];W[rp];B[qr];W[qq];B[rq];W[sq];B[qs];W[sr];
+B[sp];W[sr];B[sq];W[rr])
+
+(;B[sa])
+
+(;W[rd];B[se];W[db];B[sc];W[aa])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_018.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_018.sgf
new file mode 100644 (file)
index 0000000..00447dd
--- /dev/null
@@ -0,0 +1,52 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[2]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2004-03-28]
+SY[Cgoban 1.9.12]TM[30:00(5x1:00)]AB[pd][dp];W[dc]WL[1769];B[po]
+BL[1797];W[cn]WL[1758];B[cl]BL[1796];W[jq]WL[1756];B[pq]BL[1795];W[fq]
+WL[1750];B[dq]BL[1794];W[en]WL[1748];B[eo]BL[1785];W[bp]WL[1745];B[bq]
+BL[1782];W[cp]WL[1744];B[cq]BL[1781];W[do]WL[1741];B[fp]BL[1770];W[gq]
+WL[1740];B[fn]BL[1770];W[em]WL[1737];B[cm]BL[1737];W[dl]WL[1736];B[bn]
+BL[1735];W[bo]WL[1735];B[bm]BL[1735];W[dk]WL[1734];B[ck]BL[1735]
+(;W[cj]WL[1733];B[bj]BL[1734];W[ci]WL[1732];B[bi]BL[1733];W[ch]
+WL[1731];B[dm]BL[1725];W[dn]WL[1730];B[el]BL[1724];W[fm]WL[1730];B[ek]
+BL[1722];W[dj]WL[1730];B[fj]BL[1661];W[gn]WL[1728];B[fo]BL[1660];W[hm]
+WL[1727]
+(;B[pg]BL[1653]
+(;W[hj]WL[1722];B[qk]BL[1650];W[fg]WL[1720];B[lq]BL[1647];W[nc]
+WL[1717];B[nd]BL[1646];W[md]WL[1716];B[ne]BL[1644];W[oc]WL[1714];B[pc]
+BL[1643];W[jc]WL[1707];B[me]BL[1642];W[ld]WL[1707];B[if]BL[1633];W[kf]
+WL[1706];B[ic]BL[1623];W[gc]WL[1705];B[jb]BL[1617];W[kc]WL[1704];
+AW[oa][lb][pb][fc][lc][mc][hd][fe][ke][gf][hf][ig][jg][kg][lg][mg][ng][kh][ki][ij][jj][nj][pj][qj][rj][gk][jk][lk][mk][nk][ok][pk][kl][ll][ml][nl][pl][gm][jm][km][lm][jn][kn][go][io][hp][ip]
+AB[ib][kb][qb][id][jd][kd][ge][he][je][le][hg][og][gh][ih][jh][lh][mh][nh][rh][ji][li][kj][lj][mj][hk][kk][il][jl][ol][ql][im][mm][nm][om][pm][hn][in][ln][ho][jo][ko][ep][gp][er]
+PL[W]
+(;W[tt])
+
+(;W[hh]
+C[Correct sequence
+White H12 + F11 combination wins
+Black wins by connecting at H12 or filling an outside lib
+]
+;B[hi];W[fi]
+(;B[gj];W[gi];B[fh];W[ei];B[eh];W[eg];B[nf];W[dh];B[mf];W[gg])
+
+(;B[fh];W[ei];B[eh];W[eg])
+
+(;B[gi];W[gj];B[fh];W[ei];B[eh];W[eg])
+)
+
+(;W[fi]C[Not enough
+];B[hh];W[gi];B[nf];W[fh];B[mf])
+)
+
+(;W[ij]WL[1719];B[qk]BL[1642])
+)
+
+(;B[ql]BL[1641])
+)
+
+(;W[dj]WL[1723])
+
+)
diff --git a/regression/games/STS-RV/MiscProblems/_semeai_C9_019.sgf b/regression/games/STS-RV/MiscProblems/_semeai_C9_019.sgf
new file mode 100644 (file)
index 0000000..57ebd18
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+CA[UTF-8]AP[CGoban:2]ST[2]RU[Japanese]SZ[19]KM[0.5]TM[600]
+OT[5x30 byo-yomi]
+PW[ritx2001]
+PB[Magicspain]
+WR[1k]BR[3k]
+DT[2004-02-18]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+RE[B+Resign]
+;
+AW[cb][db][gb][mb][dc][fc][gc][ic][jc][lc][mc][cd][dd][ed][jd][kd][nd][pd][rd][be][ce][fe][le][se][df][ff][gf][hf][mf][rf][sf][kg][lg][ng][og][pg][sg][hh][mh][hi][ni][oi][gj][hj][nj][hk][kk][lk][mk][ok][pk][dl][hl][kl][dm][fm][km][an][cn][dn][en][gn][jn][mn][ao][bo][co][jo][so][ap][ip][mp][pp][rp][sp][aq][fq][hq][jq][kq][mq][qq][cr][er][fr][ir][mr][nr][pr][rr][bs][cs][es][ms][os][qs]
+AB[ba][bb][hb][ib][jb][kb][lb][ac][bc][cc][hc][kc][bd][fd][gd][id][ae][ee][ge][he][ie][bf][cf][ef][nf][of][pf][qf][ag][cg][eg][fg][qg][rg][ch][dh][ph][sh][ai][di][fi][gi][mi][pi][ri][bj][ej][mj][oj][pj][ak][bk][dk][ek][gk][nk][qk][al][cl][el][il][ll][ml][nl][bm][cm][em][im][lm][qm][rm][bn][in][sn][ho][lo][mo][no][po][qo][ro][bp][cp][dp][fp][hp][lp][qp][bq][dq][eq][gq][lq][nq][oq][pq][ar][br][dr][gr][lr][or][ds]
+PL[W]
+(;B[tt])
+
+(;B[eb]C[H18 vs G18
+Black and white E18 and win
+];W[ha];B[ia];W[ga];
+B[fa];W[ec];B[ca];W[da];B[de];W[if];B[ea];W[fb];B[ea];W[je];B[hd];
+W[la];B[fa])
+
+(;W[eb];B[ga];W[fa])
+
+)
diff --git a/regression/games/STS-RV/README b/regression/games/STS-RV/README
new file mode 100644 (file)
index 0000000..f1c08fd
--- /dev/null
@@ -0,0 +1,20 @@
+This suite of semeai problems came from the package STS-RV
+available at http://gobase.org/reading/preview/Semeai/#STS
+
+It is a very comprehensive semeai problems suite
+compiled by Ricard Vilà. The associated tests are in GTP
+format but it's not a perfect match for GNU Go because
+it uses a custom command called solve_semeaiS.
+(More info at http://trac.gnugo.org/gnugo/ticket/41)
+
+
+The files STS-RV_*.tst instead are based on the normal GNU
+Go commands (analyze_semeai) and enable the execution
+of all the tests in the STS-RV suite of semeai problems.
+
+In the GNU Go distribution of STS-RV, the tests taken from "Get Strong
+at Tesuji" and "Counting Liberties and Winning Capturing Races" are
+for now excluded, due to missing knowledge about exactly how far the
+permissions given to Ricard Vilà by Richard Bozulich and Richard
+Hunter extend. The tests can still be found at the URL:s referred
+above, however.
diff --git a/regression/games/STS-RV/STS-RV_CREDITS b/regression/games/STS-RV/STS-RV_CREDITS
new file mode 100644 (file)
index 0000000..0c157e6
--- /dev/null
@@ -0,0 +1,2 @@
+The STS-RV is a work of Ricard Vilà.
+To contact me ritx@ya.com
\ No newline at end of file
diff --git a/regression/games/STS-RV/STS-RV_README b/regression/games/STS-RV/STS-RV_README
new file mode 100644 (file)
index 0000000..e47ff54
--- /dev/null
@@ -0,0 +1,106 @@
+STS-RV 1.0
+
+1. What is STS-RV?
+2. How is it distributed?
+3. Who created it?
+4. How to use it?
+5. Structure of the STS-RV
+6. Acknowledgements
+
+
+1. WHAT IS STS-RV?
+-----------------
+STS-RV is a Semeai Test Suite that uses GTP regression features with
+722 semeai problems.
+
+
+2. HOW IS IT DISTRIBUTED?
+-------------------------
+STS-RV is distributed under GPL license.
+
+
+3. WHO CREATED IT?
+------------------
+STS-RV is part of the results of Ricard Vilà's master thesis. I worked
+on my master thesis during six months at the AI research group in 
+Université Paris VIII under the direction of Tristan Cazenave and
+Marco A. Peña.
+
+To contact me: ritx@ya.com
+
+
+4. HOW TO USE IT?
+-----------------
+If your program is compatible with GTP protocol you need to copy
+the whole STS-RV contents in the folder where your executable program
+is. The solve_semeaiS gtp command is not a standard one so probably
+you will have to define your own gtp command for that purpose.
+Then edit the file regression/evalSemeais.sh and change the name
+of the solver to the one you use. Once this is done call the shell
+script evalSemeaisAll.sh and all the tests will be tried. If you
+create debug sgf files they will be redirected to the Debug folders
+(change the name of the debug files in the evalSemeaisAll.sh to fit
+your own names).
+
+If your program is not compatible with GTP protocol check the official
+GTP site at http://www.lysator.liu.se/~gunnar/gtp/
+
+If you try the STS-RV i would like to hear from you, your opinions,
+suggestions, found bugs, etc are of great interest to me so please
+contact me at ritx@ya.com
+
+5. STRUCTURE OF THE STS_RV
+--------------------------
+STS-RV is divided into six tst files containing a total of 130 sgf
+files and 722 tests.
+Every test is twice checked (playing black and white first).
+Contents of the tst files:
+
+semeais_0.tst containing semeai tests of class 0.
+semeais_1.tst containing semeai tests of class 1 and 2.
+semeais_e.tst containing semeai tests of class e.
+
+All the tests in these files are created by me in order to check the
+performance of what my module was supposed to do
+correctly. Theoretically they are supposed to be passed statically (at
+the root node).
+
+If you are not familiar with this classification check Martin Müller's
+paper: "Race to Capture: Analyzing Semeai in Go" at
+http://www.cs.ualberta.ca/~mmueller/ or my master thesis "Desarrollo
+del módulo de resolucion de semeai Semeai_01es" at
+http://www.ai.univ-paris8.fr/~ritx/ (in Spanish).
+
+semeais_RH.tst containing semeai tests obtained from "Counting
+Liberties and Winning Capturing Races" written by Richard Hunter and
+published by Slate and Shell (SSRH003). These are the most difficult
+tests in the suite both for the number of possible moves at the root 
+node and for the depth of the winning sequence.
+
+semeais_GSAT.tst containing semeai tests involving tesuji obtained
+from "Get Strong at Tesuji" written by Richard Bozulich and published
+by Kiseido Publishing Company (K56).
+
+semeais_Misc.tst containing semeai tests over class 3 created by me
+from my own games or compositions created by me.
+
+6. ACKNOWLEDGEMENTS
+-------------------
+I would like to thank Martin Müller for settling the first stone of my
+work with his interesting classification of semeais.
+
+I thank Richard Hunter and Richard Bozulich for his express permission
+to use the problems in their books as tests for machines, for the
+benefit of the Computer Go community. 
+
+I would like to thank Gunnar Farnebäck for his valuable help
+during the process of creating the suite.
+
+I would also like to thank all the people in the AI research group at
+the Université Paris VIII that have helped me to complete my work.
+
+Finally i would like to thank the two researchers that co-directed my
+work, Tristan Cazenave and Marco A. Peña.
+
+
+
diff --git a/regression/games/TSa.sgf b/regression/games/TSa.sgf
new file mode 100644 (file)
index 0000000..30f9690
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[3]
+SZ[19]KM[0.5]
+PW[GnuGo]
+WR[17k*]
+PB[TSa]
+BR[18k*]
+DT[2000-10-19]
+SY[Cgoban 1.9.10]HA[0];B[pd];W[dp];B[cd];W[ed];B[dc];W[pp];B[pj];W[ec];B[db]
+;W[jp];B[jd];W[hd];B[dj];W[ch];B[df];W[eh];B[fj];W[ff];B[if];W[gp];
+B[cn];W[ql];B[nj];W[fi];B[ci];W[dh];B[cg];W[nd];B[hc];W[gc];B[eb];
+W[ic];B[fb];W[gb];B[ga];W[hb];B[jc];W[lc];B[le];W[jb];B[ie];W[mp];
+B[fm];W[dn];B[dm];W[co];B[bn];W[pf];B[nf];W[qd];B[pc];W[nc];B[ob];
+W[qc];B[qb];W[rb];B[pe];W[qg];B[qe];W[re];B[rf];W[rd];B[qf];W[ra];
+B[qa];W[rh];B[rg];W[ph];B[of];W[pg];B[qi];W[nh];B[mh];W[mi];B[lh];
+W[ni];B[oi];W[ng];B[ri];W[qh];B[mg];W[sh];B[si];W[se];B[sc];W[sb];
+B[nb];W[ok];B[oj];W[mj];B[nk];W[nl];B[pk];W[oe];B[ne];W[od];B[mb];
+W[mc];B[lb];W[ol];B[qk];W[rk];B[rj];W[rl];B[pl];W[ih];B[mk];W[li];
+B[lk];W[ii];B[jj];W[ji];B[kj];W[ki];B[kh];W[hk];B[hj];W[gi];B[gj];
+W[ij];B[ik];W[hl];B[il];W[hm];B[im];W[hn];B[pm];W[on];B[ml];W[nn];
+B[mm];W[fl];B[gl];W[gk];B[gm];W[fk];B[em];W[ej];B[pr];W[kc];B[kb];
+W[bi];B[ek];W[ei];B[bj];W[bh];B[bo];W[dk];B[el];W[ck];B[bk];W[cj];
+B[cl];W[di];B[cp];W[do];B[en];W[cq];B[bp];W[eq];B[bq];W[nr];B[qp];
+W[qn];B[qm];W[rm];B[sk];W[qo];B[ro];W[rp];B[qq];W[rq];B[rr];W[rn];
+B[pi];W[cr];B[br];W[in];B[jn];W[ln];B[lm];W[bg];B[bf];W[aj];B[ak];
+W[bl];B[ai];W[al];B[bm];W[aj];B[dl];W[bs];B[ar];W[kn];B[am];W[km];
+B[kl];W[bk];B[jm];W[de];B[ce];W[fc];B[ha];W[ia];B[ka];W[fa];B[ea];
+W[ga];B[ja];W[ib];B[id];W[mn];B[lj];W[pn];B[go];W[fo];B[ho];W[gn];
+B[fn];W[hi];B[io];W[eo];B[cm];W[jo];B[ee];W[dd];B[ef];W[fe];B[ge];
+W[hf];B[he];W[gd];B[gf];W[hg];B[fg];W[fd];B[gg];W[eg];B[cf];W[gh];
+B[ig];W[hh];B[jh];W[af];B[ae];W[ag];B[ip];W[iq];B[sl];W[sm];B[or];
+W[sj];B[sk];W[om];B[sq];W[so];B[sr];W[os];B[ps];W[pq];B[qr];W[rs];
+B[oq];W[ns];B[nq];W[mr];B[mq];W[lr];B[lq];W[kr];B[kq];W[og];B[jq];
+W[jr];B[ir];W[hq];B[hr];W[gr];B[kp];W[ko];B[mo];W[lp];B[np];W[lo];
+B[no];W[sf];B[sg];W[nm];B[oh];W[dg];B[fh];W[ad];B[bd];W[ac];B[bc];
+W[be];B[ab];W[bb];B[ae];W[sl];B[sj];W[cs];B[as];W[tt];B[sp];W[ro];
+B[oo];W[po];B[op];W[hp];W[tt]
+)
diff --git a/regression/games/ab1_fuseki.sgf b/regression/games/ab1_fuseki.sgf
new file mode 100644 (file)
index 0000000..37491f4
--- /dev/null
@@ -0,0 +1,14 @@
+(;SZ[19];AB[jj][pp][dd][dp][pd];W[qf];B[nd];W[lc];B[nf];W[cf];B[fd];W[fq];B[hq];W[cn];B[eo];W[cq];B[dq];W[cp];B[em];W[nq];B[qn];W[jq];B[jc];W[nb];B[gr];W[jp];B[ho];W[qc];B[ef];W[bd];B[cc];W[ci];B[oq];W[no];B[qd];W[pc]C[goes after extremely
+weak stone instead of
+big fuseki pincer+extend move
+traces:
+-t --level 15
+actually two mistakes in one:
+1) pincers like R12 are not even considered
+2) F4 weighted too high
+
+F4 is not in the top 10 at level 10
+but at top1 at level 15, so level 10 (by chance) is "better".
+-------
+Version 3.5.4 (patched from 3.4)];B[fp];W[qi];B[qk];W[pf]
+;B[bc];W[oe];B[od];W[ne];B[md];W[ld];B[me];W[kf];B[jn];W[dl];B[if];W[jd];B[id];W[kc];B[jb];W[oj];B[cr];W[br];B[np];W[mp];B[op];W[nr];B[or];W[mo];B[fk];W[ej];B[fh];W[fj];B[rd];W[rc];B[mg];W[lf];B[mf];W[li];B[be];W[bf];B[cd];W[dr];B[er];W[cs];B[ns];W[mr];B[af];W[ag];B[ae];W[bg];B[je];W[kd];B[lk];W[mj];B[gk];W[gj];B[lm];W[om];B[rk];W[jh];B[sh];W[rg];B[sg];W[sf];B[ms];W[ls];B[os];W[kr];B[si];W[ri];B[sj];W[ce];B[ad];W[kb];B[ic];W[hg];B[hh];W[ig];B[hj];W[gf];B[gg];W[fg];B[gh];W[ff];B[eg];W[hf];B[dn];W[cm];B[jf];W[jg];B[ke];W[le];B[ie];W[gd];B[gc];W[hd];B[hc];W[el];B[fl];W[ii];B[dh];W[ij];B[ik];W[kj];B[hi];W[kk];B[kl];W[jk];B[jl];W[mk];B[ir];W[io];B[in];W[qm];B[rm];W[pn];B[qo];W[pk];B[ql];W[pl];B[ml];W[nl];B[nm];W[nn];B[mm];W[ko];B[jo];W[ip];B[kn];W[ln];B[mn];W[lo];B[he];W[ge];B[ih];W[ji];B[rh];W[qh];B[ek];W[dk];B[di];W[dj];B[ch];W[bh];B[jr];W[rj];B[sk];W[qj];B[pm];W[es];B[fr];W[fs];B[qm];W[gs];B[hs];W[ds];B[hp];W[ja];B[ia];W[ka];B[hb];W[ee];B[de];W[fe];B[ed];W[df];B[dg];W[bj];B[co];W[bo];B[iq];W[lq];B[js];W[ks];B[do];W[dm];B[ll];W[lj];B[hk];W[oo];B[po];W[on];B[eh];W[ei];B[cg];W[fi];B[gi];AE[md][me][mf][mg][nd][nf][od][pd][qd][rd][fq])
diff --git a/regression/games/arb/dumonteil-1.sgf b/regression/games/arb/dumonteil-1.sgf
new file mode 100644 (file)
index 0000000..e0a2b53
--- /dev/null
@@ -0,0 +1,29 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.7.200 gmp Random Seed 139917904]
+PB[GNU Go 2.7.200 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pc];W[dp];B[dd];W[pp];B[pe];W[jp];B[qn];W[pn];B[pm];W[on]
+;B[qo];W[qp];B[qj];W[np];B[cn];W[dn];B[dm];W[en];B[co];W[cp]
+;B[cj];W[fp];B[gn];W[cf];B[fc];W[cd];B[cc];W[bc];B[dc];W[bd]
+;B[kc];W[ld];B[fe];W[hp];B[mn];W[lp];B[lf];W[qg];B[rf];W[jd]
+;B[rh];W[dh];B[bh];W[dj];B[dg];W[cg];B[dk];W[ej];B[ch];W[cb]
+;B[gj];W[eh];B[df];W[bg];B[jc];W[om];B[pl];W[og];B[kd];W[ie]
+;B[lc];W[ke];B[le];W[hg];B[ek];W[fh];B[hc];W[ge];B[fj];W[di]
+;B[bj];W[bo];B[bn];W[bp];B[id];W[je];B[nj];W[md];B[nd];W[pg]
+;B[mc];W[pi];B[ij];W[jg];B[db];W[bb];B[pj];W[hd];B[ic];W[ro]
+;B[gd];W[he];B[rn];W[rp];B[hm];W[in];B[kn];W[jm];B[em];W[im]
+;B[fn];W[do];B[ol];W[ki];B[nl];W[ii];B[hi];W[jj];B[ik];W[jk]
+;B[ih];W[ji];B[hh];W[kg];B[gg];W[ff];B[gf];W[ef];B[ig];W[de]
+;B[hf];W[ee];B[fd];W[nm];B[mm];W[ml];B[mk];W[ll];B[mh];W[ln]
+;B[lm];W[lk];B[lo];W[ed];B[fb];W[il];B[hl];W[ec];B[eb];W[ah]
+;B[ai];W[ag];B[nf];W[ci];B[bi];W[lg];B[mg];W[fi];B[lj];W[kj]
+;B[kl];W[kk];B[km];W[jl];B[oi];W[li];B[mj];W[lh];B[nh];W[jh]
+;B[ph];W[mi];B[fo];W[fg];B[ca];W[ba];B[da];W[po];B[ao];W[ap]
+;B[an];W[sn];B[sm];W[so];B[rl];W[eo];B[gi];W[kf];B[if];W[go]
+;B[ho];W[gp];B[hn];W[ip];B[io];W[ko];B[jf];W[mo];B[jn];W[jo]
+;B[ni];W[nn];B[kh];W[ln];B[gh];W[lo];B[tt];W[tt])
diff --git a/regression/games/arb/dumonteil-2.sgf b/regression/games/arb/dumonteil-2.sgf
new file mode 100644 (file)
index 0000000..f120a3f
--- /dev/null
@@ -0,0 +1,41 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 975706061]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[dp];W[cd];B[pp];W[pd];B[fc];W[cn];B[fq];W[bp];B[cq];W[ck]
+;B[ic];W[nq];B[qn];W[pr];B[qq];W[kq];B[qf];W[nd];B[qd];W[qc]
+;B[rc];W[pc];B[rd];W[ql];B[lc];W[qi];B[iq];W[rg];B[qr];W[rb]
+;B[or];W[ko];B[bq];W[cp];B[ee];W[df];B[ch];W[bf];B[eh];W[ie]
+;B[dj];W[bi];B[bh];W[ci];B[cb];W[dc];B[db];W[ld];B[bc];W[kc]
+;B[be];W[ce];B[di];W[lb];B[el];W[gh];B[fg];W[fd];B[ed];W[ec]
+;B[fb];W[bd];B[gd];W[rn];B[rm];W[qm];B[ro];W[pn];B[qo];W[rl]
+;B[sn];W[gl];B[jd];W[do];B[ke];W[on];B[kg];W[dq];B[dr];W[ep]
+;B[eq];W[ki];B[jg];W[og];B[pe];W[qg];B[mg];W[nf];B[fj];W[gj]
+;B[kr];W[jr];B[jq];W[lr];B[kp];W[lq];B[ir];W[ks];B[lp];W[no]
+;B[jo];W[nr];B[oq];W[os];B[cl];W[bl];B[cm];W[bm];B[lo];W[kn]
+;B[ln];W[jn];B[io];W[go];B[in];W[op];B[jl];W[pq];B[dm];W[km]
+;B[ll];W[ni];B[hf];W[jb];B[bj];W[cj];B[ai];W[bk];B[aj];W[eb]
+;B[ea];W[rf];B[ib];W[fk];B[fi];W[gi];B[hk];W[gk];B[hl];W[ii]
+;B[gn];W[fn];B[fl];W[gm];B[hn];W[ek];B[dk];W[fm];B[fp];W[fo]
+;B[nm];W[gp];B[gq];W[pl];B[po];W[nl];B[om];W[ol];B[lm];W[mk]
+;B[cc];W[dd];B[ej];W[qs];B[ad];W[ae];B[cg];W[ac];B[mi];W[lj]
+;B[mj];W[lk];B[nj];W[pj];B[nh];W[oi];B[oh];W[aq];B[ar];W[ap]
+;B[br];W[ph];B[oj];W[pi];B[ja];W[ka];B[ia];W[mp];B[jc];W[kd]
+;B[gg];W[le];B[kf];W[is];B[hs];W[js];B[hh];W[ij];B[ih];W[oe]
+;B[ok];W[he];B[mf];W[me];B[hm];W[je];B[lf];W[bb];B[ab];W[aa]
+;B[ca];W[rr];B[rq];W[dg];B[dh];W[ik];B[fh];W[pk];B[sr];W[rs]
+;B[jk];W[il];B[kk];W[im];B[jm];W[ef];B[fe];W[ge];B[dp];W[ff]
+;B[lh];W[eo];B[kb];W[gf];B[la];W[mb];B[ma];W[na];B[nb];W[mc]
+;B[oa];W[oc];B[qa];W[qb];B[ra];W[if];B[ig];W[hg];B[hd];W[hf]
+;B[de];W[fd];B[sb];W[pf];B[re];W[se];B[sc];W[qe];B[sl];W[rk]
+;B[hp];W[sk];B[sm];W[jj];B[ob];W[jh];B[ml];W[nn];B[nk];W[pb]
+;B[pa];W[mn];B[mm];W[dq];B[hj];W[hi];B[li];W[kj];B[ng];W[kl]
+;B[kh];W[dp];B[ji];W[ho];B[jh];W[mo];B[id];W[jp];B[ip];W[jf]
+;B[oo];W[nc];B[sa];W[pm];B[fa];W[jp];B[hr];W[kp];B[da];W[ab]
+;B[ba];W[ad];B[ka];W[sf];B[na];W[sd];B[hb];W[ps];B[sq];W[ss]
+;B[tt];W[tt])
diff --git a/regression/games/arb/dumonteil-3.sgf b/regression/games/arb/dumonteil-3.sgf
new file mode 100644 (file)
index 0000000..cec635d
--- /dev/null
@@ -0,0 +1,31 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 982826560]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[dp];W[dd];B[pd];W[pp];B[qn];W[nq];B[qp];W[qq];B[rq];W[qo]
+;B[rp];W[po];B[ro];W[qr];B[pn];W[nc];B[qf];W[pb];B[qc];W[kc]
+;B[fd];W[df];B[dc];W[cc];B[ec];W[cb];B[jp];W[cj];B[fq];W[qh]
+;B[qk];W[oh];B[cm];W[hc];B[ge];W[fb];B[eb];W[fc];B[co];W[ed]
+;B[qb];W[gd];B[ob];W[fe];B[hf];W[fo];B[lq];W[gq];B[gr];W[jf]
+;B[iq];W[ih];B[mr];W[nr];B[rh];W[ri];B[gp];W[rg];B[en];W[kr]
+;B[ms];W[oq];B[gn];W[gg];B[lp];W[no];B[rj];W[mn];B[fn];W[ok]
+;B[qi];W[sh];B[nb];W[rf];B[re];W[pi];B[qj];W[gf];B[ka];W[oc]
+;B[pc];W[mc];B[mb];W[rr];B[on];W[jr];B[bk];W[bj];B[aj];W[ai]
+;B[ak];W[bh];B[sf];W[ck];B[bl];W[cl];B[bm];W[eh];B[of];W[gj]
+;B[ng];W[lh];B[fk];W[nh];B[gk];W[lb];B[la];W[km];B[jn];W[mk]
+;B[mg];W[mh];B[me];W[il];B[hm];W[hj];B[fj];W[pl];B[nm];W[jl]
+;B[ia];W[lg];B[jc];W[jb];B[ib];W[kb];B[ja];W[ic];B[lf];W[hb]
+;B[ma];W[ke];B[pg];W[ph];B[sr];W[kf];B[ql];W[lo];B[le];W[ld]
+;B[ko];W[ne];B[nf];W[md];B[mf];W[oe];B[pe];W[dl];B[ln];W[mo]
+;B[kn];W[lm];B[mm];W[fi];B[mp];W[pr];B[os];W[ns];B[op];W[oo]
+;B[np];W[ej];B[nn];W[pq];B[dm];W[el];B[od];W[nd];B[fl];W[hk]
+;B[em];W[ek];B[hl];W[pj];B[im];W[ml];B[pm];W[sj];B[ol];W[pk]
+;B[sk];W[nl];B[rs];W[om];B[sl];W[sq];B[sp];W[rn];B[ol];W[sn]
+;B[rm];W[qs];B[sq];W[ss];B[ha];W[so];B[fa];W[gb];B[ga];W[qg]
+;B[db];W[jm];B[da];W[ca];B[ea];W[mq];B[lr];W[og];B[pf];W[sg]
+;B[se];W[si];B[tt];W[tt])
diff --git a/regression/games/arb/dumonteil-4.sgf b/regression/games/arb/dumonteil-4.sgf
new file mode 100644 (file)
index 0000000..02e45cb
--- /dev/null
@@ -0,0 +1,36 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 983291017]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[jj];W[cq];B[cc];W[pp];B[qc];W[jc];B[nq];W[np];B[mp];W[no]
+;B[oq];W[pq];B[jq];W[pn];B[dn];W[fq];B[ql];W[jh];B[qi];W[qg]
+;B[ck];W[dd];B[dc];W[cd];B[nc];W[ed];B[ch];W[ec];B[bd];W[be]
+;B[bb];W[ce];B[hq];W[fo];B[rg];W[ne];B[qf];W[mc];B[mb];W[mo]
+;B[lp];W[pg];B[qh];W[pf];B[qe];W[qm];B[pl];W[lc];B[pm];W[rm]
+;B[gr];W[lb];B[nb];W[kn];B[co];W[eq];B[ds];W[eh];B[gn];W[fr]
+;B[dr];W[dq];B[fs];W[hi];B[fl];W[ad];B[gc];W[bc];B[db];W[ca]
+;B[eb];W[hp];B[io];W[hk];B[hl];W[il];B[jn];W[gl];B[gm];W[hm]
+;B[hn];W[kl];B[lj];W[fk];B[el];W[ip];B[jo];W[jp];B[ko];W[ln]
+;B[kq];W[hf];B[li];W[nl];B[oi];W[bp];B[bo];W[kf];B[bg];W[df]
+;B[on];W[oo];B[qn];W[po];B[rn];W[om];B[pr];W[qr];B[or];W[hb]
+;B[ab];W[gb];B[qs];W[fb];B[ba];W[qq];B[rr];W[rq];B[ok];W[sr]
+;B[rs];W[hc];B[ap];W[aq];B[br];W[ao];B[cr];W[bm];B[bl];W[an]
+;B[ej];W[di];B[fj];W[ek];B[fh];W[ci];B[bi];W[dj];B[dk];W[gk]
+;B[dh];W[fi];B[eg];W[ei];B[dg];W[fg];B[ff];W[gg];B[ef];W[gd]
+;B[cj];W[gh];B[ii];W[ih];B[nd];W[md];B[ol];W[nm];B[pe];W[nf]
+;B[ij];W[hj];B[oe];W[ng];B[ac];W[ni];B[nj];W[mi];B[mj];W[lh]
+;B[nh];W[mh];B[ml];W[oh];B[ph];W[mm];B[mk];W[jm];B[of];W[og]
+;B[ki];W[ee];B[ge];W[he];B[fe];W[cm];B[en];W[go];B[cl];W[dm]
+;B[fm];W[dl];B[cf];W[ak];B[aj];W[al];B[bj];W[iq];B[de];W[ir]
+;B[jr];W[gq];B[hr];W[is];B[cp];W[bq];B[fd];W[fc];B[bs];W[ar]
+;B[bk];W[am];B[ll];W[lm];B[kk];W[hs];B[eo];W[js];B[ks];W[kp]
+;B[lr];W[lo];B[jk];W[ms];B[ls];W[mr];B[mq];W[kh];B[la];W[ka]
+;B[ma];W[bf];B[df];W[fa];B[bd];W[ae];B[ag];W[ik];B[jl];W[km]
+;B[qo];W[ea];B[da];W[nk];B[qp];W[rp];B[sn];W[bc];B[cb];W[bd]
+;B[ji];W[ro];B[sm];W[so];B[rl];W[op];B[af];W[gf];B[ps];W[sq]
+;B[ss];W[tt];B[tt])
diff --git a/regression/games/arb/dumonteil-5.sgf b/regression/games/arb/dumonteil-5.sgf
new file mode 100644 (file)
index 0000000..5428952
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[ARB]
+PB[Gnu Go-2.7.231, level 8]
+GN[White (W) vs. Black (B)]
+DT[2001-04-24]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+38.5]
+;B[jj];W[dd];B[kc];W[dj];B[dh];W[kk];B[kj];W[jk];B[ik];W[il];B[hk];
+W[hl];B[gk];W[lj];B[li];W[lk];B[kh];W[gd];B[ic];W[el];B[ci];W[cj];
+B[if];W[bd];B[gl];W[cg];B[bi];W[bj];B[gb];W[fc];B[fb];W[eb];B[fj];
+W[ei];B[eg];W[fi];B[ff];W[df];B[he];W[gh];B[aj];W[ak];B[ai];W[bl];
+B[hi];W[hd];B[bf];W[bg];B[ag];W[be];B[id];W[hh];B[hm];W[jm];B[ek];
+W[dk];B[fl];W[em];B[ea];W[db];B[da];W[ca];B[ih];W[hg];B[hf];W[ig];
+B[ii];W[jg];B[gi];W[eh];B[dg];W[cf];B[ke];W[kf];B[lf];W[kg];B[lg];
+W[fe];B[gg];W[ef];B[di];W[ej];B[fh];W[fg];B[gf];W[fh];B[fa];W[cb];
+B[hb];W[ge];B[fm];W[cm];B[jh];W[ll];B[fk];W[af];B[jf];W[hc];B[mj];
+W[mk];B[mi];W[im];B[cl];W[dl];B[km]
+(;W[jl];B[lm];W[gc];B[mm];W[gm];B[ec];W[ee];B[hm];W[ib];B[jb];W[gm];
+B[al];W[bk];B[hm];W[ia];B[ja];W[gm];B[tt];W[je];B[hm];W[ie];B[jd];
+W[le];B[kd];W[ld];B[tt];W[tt];
+TW[aa][ba][ab][bb][ac][bc][cc][dc][ec][ad][cd][ed][fd][ae][ce][de][he][bf][ff][gf][hf][if][jf][ag][dg][eg][gg][ah][bh][ch][dh][ai][bi][ci][di][aj][ck][al][cl][am][bm][dm]
+TB[ga][ha][ia][ka][la][ma][ib][kb][lb][mb][jc][lc][mc][ld][md][le][me][mf][mg][lh][mh][ji][ki][gj][hj][ij]
+C[The game is over.  Final score:
+   White = 42 territory + 24 captures + 5.5 komi = 71.5
+   Black = 26 territory + 7 captures = 33
+White wins by 38.5.
+])
+
+(;W[kl];B[jl])
+
+)
diff --git a/regression/games/arb/dumonteil-6.sgf b/regression/games/arb/dumonteil-6.sgf
new file mode 100644 (file)
index 0000000..5ad625e
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[11]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-05-29]
+SY[Cgoban 1.9.10]TM[-];B[ff];W[cc];B[hd];W[di];B[ih];W[df];B[gh];W[fc]
+;B[gb];W[fb];B[fi];W[ge];B[if];W[gf];B[fe];W[gd];B[hc];W[hg];B[hh];
+W[ig];B[gg];W[hf];B[ie];W[jg];B[de];W[ce];B[jf];W[ji];B[ej];W[dj];
+B[ij];W[eg];B[gj];W[fg];B[fa];W[ea];B[ga];W[db];B[dk];W[ck];B[ek];
+W[bj];B[jh];W[kh];B[kf];W[kg];B[jj];W[kj];B[ii];W[ki];B[eh];W[dh];
+B[jk];W[gc];B[hb];W[gk];B[ei];W[he];B[fh];W[dg];B[kk];W[tt];B[tt]
+)
diff --git a/regression/games/arb/game01.sgf b/regression/games/arb/game01.sgf
new file mode 100644 (file)
index 0000000..76f4df6
--- /dev/null
@@ -0,0 +1,24 @@
+(
+;
+FF[4]
+GM[1]
+SZ[11]
+AP[Jago:Version 3.57]
+GN[]
+PB[GNU go 2.7.163]
+PW[ARB]
+BR[]
+WR[15k* IGS]
+DT[9-09-2000]
+KM[0.5]
+;B[ff];W[ic];B[ii];W[cc];B[ci];W[cg];B[if];W[fd];B[id];W[hd]
+;B[fi];W[ee];B[bg];W[bf];B[bh];W[dh];B[eg];W[ef];B[di];W[eh]
+;B[gi];W[fg];B[gg];W[fh];B[jd];W[gh];B[jc];W[hc];B[ib];W[hb]
+;B[jb];W[hg];B[ig];W[hf];B[he];W[ge];B[ie];W[hi];B[hj];W[hh]
+;B[ih];W[ei];B[ej];W[ch];B[ha];W[ag];B[ai];W[ga];B[ia];W[gb]
+;B[ah];W[af];B[];W[fj];B[dk];W[gj];B[cj];W[ij];B[jj];W[ik]
+;B[fk];W[gk];B[ek];W[jk];B[kj];W[hk];B[ji];W[kk]
+;AE[gg][ff][eg]
+TW[aa][ab][ac][ad][ae][ba][bb][bc][bd][be][ca][cb][cd][ce][cf][da][db][dc][dd][de][df][dg][ea][eb][ec][ed][eg][fa][fb][fc][fe][ff][fi][gc][gd][gf][gg][gi][hj]
+TB[aj][ak][bi][bj][bk][ck][dj][ja][je][jf][jg][jh][ka][kb][kc][kd][ke][kf][kg][kh][ki]
+)
diff --git a/regression/games/arb/game02.sgf b/regression/games/arb/game02.sgf
new file mode 100644 (file)
index 0000000..dce345c
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]CA[UTF-8]
+SZ[11]RU[Japanese]KM[0]TM[1800,0,30,5]PW[ARB]AP[Jago:Version 3.57]PB[GNU go 2.7.163]
+;B[ff];W[ic];B[cc];W[ci];B[ii];W[gi];B[fc];W[ig];B[cf];W[dg]
+;B[ie];W[he];B[hd];W[id];B[je];W[hf];B[jh];W[jg];B[hj];W[gj]
+;B[hc];W[hb];B[gb];W[jb];B[bh];W[ch];B[bi];W[jj];B[jk];W[ji]
+;B[ij];W[ih];B[cj];W[dj];B[bk];W[fg];B[ha];W[ib];B[cg];W[ef]
+;B[fe];W[ee];B[de];W[ed];B[ge];W[ec];B[eb];W[df];B[fd];W[dd]
+;B[ce];W[cd];B[bd];W[dc];B[cb];W[db];B[da];W[dh];B[dk];W[ek]
+;B[ck];W[ej];B[gf];W[gg];B[ia];W[ja];B[ga];W[jd];B[];W[bc]
+;B[bb];W[be];B[ag];W[bf];B[ac];W[bg];B[aj];W[af];B[ah];W[ae]
+;B[ad]
+;AE[hj][ii][ij][jh][jk][ie][je]TB[aa][ab][ai][ak][ba][bc][bj][ca][ea][fa][fb][gc][gd]TW[ce][cf][cg][de][di][eg][eh][ei][fh][fi][fj][fk][gh][gk][hg][hh][hi][hj][hk][ie][if][ii][ij][ik][jc][je][jf][jh][jk][ka][kb][kc][kd][ke][kf][kg][kh][ki][kj][kk])
diff --git a/regression/games/arb/game03.sgf b/regression/games/arb/game03.sgf
new file mode 100644 (file)
index 0000000..3113405
--- /dev/null
@@ -0,0 +1,141 @@
+(
+;PB[GnuGo-3.1.9]PW[ARB]FF[3]GM[1]SZ[13]AP[Jago:Version 4.18]
+;B[dk]
+;W[kj]
+;B[jc]
+;W[dc]
+;B[kf]
+;W[df]
+;B[ch]
+;W[bg]
+;B[cg]
+;W[cf]
+;B[bh]
+;W[hk]
+;B[bf]
+;W[be]
+;B[ag]
+;W[hd]
+;B[ae]
+;W[bd]
+;B[hb]
+;W[gc]
+;B[kh]
+;W[gb]
+;B[hg]
+;W[ej]
+;B[dj]
+;W[ei]
+;B[fl]
+;W[fk]
+;B[gl]
+;W[gk]
+;B[hl]
+;W[il]
+;B[ik]
+;W[ij]
+;B[jk]
+;W[jl]
+;B[kk]
+;W[kl]
+;B[lk]
+;W[ll]
+;B[lj]
+;W[el]
+;B[ek]
+;W[dl]
+;B[cl]
+;W[di]
+;B[em]
+;W[im]
+;B[ml]
+;W[cj]
+;B[dm]
+;W[ci]
+;B[bi]
+;W[bj]
+;B[ai]
+;W[jj]
+;B[li]
+;W[jg]
+;B[jh]
+;W[ig]
+;B[ih]
+;W[hh]
+;B[hf]
+;W[gh]
+;B[ic]
+;W[je]
+;B[ke]
+;W[ie]
+;B[jd]
+;W[kg]
+;B[lg]
+;W[ii]
+;B[ga]
+;W[fa]
+;B[ha]
+;W[eb]
+;B[dg]
+;W[eg]
+;B[aj]
+;W[bk]
+;B[ef]
+;W[fg]
+;B[jf]
+;W[if]
+;B[ad]
+;W[ac]
+;B[de]
+;W[ce]
+;B[bc]
+;W[cd]
+;B[ab]
+;W[cc]
+;B[cb]
+;W[db]
+;B[ca]
+;W[da]
+;B[dh]
+;W[eh]
+;B[bl]
+;W[ak]
+;B[al]
+;W[hc]
+;B[ib]
+;W[id]
+;B[ki]
+;W[ck]
+;B[ji]
+;W[lf]
+;B[tt]
+;W[kd]
+;B[kc]
+;W[le]
+;B[mg]
+;W[lc]
+;B[lb]
+;W[mc]
+;B[mb]
+;W[mf]
+;B[tt]
+;W[ka]
+;B[kb]
+;W[ja]
+;B[la]
+;W[mi]
+;B[lm]
+;W[lh]
+;B[mk]
+;W[mh]
+;B[hi]
+;W[hj]
+;B[fj]
+;W[gi]
+;B[hm]
+;W[lg]
+;B[km]
+;W[mj]
+;B[jm]
+)
+
diff --git a/regression/games/arb/game04.sgf b/regression/games/arb/game04.sgf
new file mode 100644 (file)
index 0000000..5a5b70a
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+SZ[13]AP[Jago:Version 4.18];B[dd];W[jk];B[je];W[dj];B[jc];W[jh];B[ch];
+W[dg];B[cg];W[df];B[be];W[dh];B[gc];W[gk];B[bj];W[ck];B[kg];W[kh];
+B[fe];W[gf];B[he];W[hf];B[ff];W[fg];B[bk];W[bl];B[lh];W[li];B[lg];
+W[kj];B[al];W[bm];B[if];W[jg];B[ig];W[jf];B[kf];W[hh];B[ih];W[ii];
+B[hg];W[gg];B[ji];W[ie];B[id];W[ke];B[if];W[le];B[lc];W[mh];B[ig];
+W[ih];B[ld];W[lf];B[ci];W[di];B[ef];W[de];B[eg];W[eh];B[kd];W[ee];
+B[ed];W[fd];B[fc];W[cd];B[gd];W[ce];B[bf];W[cc];B[db];W[dc];B[cb];
+W[ec];B[eb];W[fd];B[ed];W[bd];B[me];W[mg];B[bb];W[ae];B[af];W[ad];
+B[bc];W[cf];B[bg];W[cj];B[ac];W[ai];B[ge];W[bi];B[ie];W[aj];B[hg];
+W[cm];B[md];W[mf];B[fd];B[dd];
+AE[ji][af][be][bf][bg][cg][ch][ci][bj][bk][al]
+TB[aa][ab][ba][ca][da][ea][fa][fb][ga][gb][ha][hb][hc][hd][ia][ib][ic][ja][jb][jd][ka][kb][kc][la][lb][ma][mb][mc]
+TW[af][ag][ah][ak][al][am][be][bf][bg][bh][bj][bk][cg][ch][ci][cl][dk][dl][dm][ei][ej][ek][el][em][fh][fi][fj][fk][fl][fm][gh][gi][gj][gl][gm][hi][hj][hk][hl][hm][ij][ik][il][im][ji][jj][jl][jm][kf][kg][ki][kk][kl][km][lg][lh][lj][lk][ll][lm][mi][mj][mk][ml][mm]
+)
diff --git a/regression/games/arend/constructed1.sgf b/regression/games/arend/constructed1.sgf
new file mode 100644 (file)
index 0000000..a1593f1
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-05]
+SY[Cgoban 1.9.10]TM[-];
+AW[bb][db][hb][ib][bc][dc][hc][bd][dd][ed][fd][gd][hd][ae][be][de]
+AB[cb][cc][ee][fe][ge][he][ie][af][bf][cf][df][ef]
+)
diff --git a/regression/games/arend/constructed2.sgf b/regression/games/arend/constructed2.sgf
new file mode 100644 (file)
index 0000000..99ff9a1
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-07]
+SY[Cgoban 1.9.10]TM[-];
+AW[bc][hc][ic][bd][hd][be][ce][de][ee][fe][ge][he]
+AB[af][bf][cf][df][ef][ff][gf][hf][if]
+)
diff --git a/regression/games/arend/constructed3.sgf b/regression/games/arend/constructed3.sgf
new file mode 100644 (file)
index 0000000..0c8c43a
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-09]
+SY[Cgoban 1.9.10]TM[-]PL[1];PL[2]
+AW[hc][kc][co][np][dq][gq][nq][pq][qq][nr][rr][sr]
+AB[dc][pd][ce][pj][mo][op][pp][qp][rp][lq][rq]
+)
diff --git a/regression/games/arend/constructed4.sgf b/regression/games/arend/constructed4.sgf
new file mode 100644 (file)
index 0000000..ab2c993
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]
+PB[Unknown]
+HA[0]KM[5.5]
+GN[GNU Go 3.0.0 gmp Random Seed 1004683151]
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:75][ed:74][od:74][pd:74][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:74][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+;B[dd];W[pc];B[pq];W[cp];B[qe];W[qg];B[oe];W[nd];B[pg];W[ph]
+;B[og];W[ne];B[qh];W[oi];B[qi];W[po];B[qo];W[qn];B[qp];W[pn]
+;B[nq];W[fc];B[eq];W[gq];B[eo];W[dn];B[gp];W[en];B[hq];W[ic]
+;B[cf];W[db];B[cc];W[ch];B[cb];W[ck];B[kq];W[rd];B[rg];W[mo]
+;B[ip];W[dr];B[qd];W[qc];B[dq];W[cq];B[er];W[ie];B[cr];W[br]
+;B[eb];W[lc];B[ds];W[mm];B[bg];W[jn];B[qk];W[ok];B[re];W[ni]
+;B[rc];W[rb];B[sd];W[fb];B[da];W[fe];B[dg];W[dh];B[hm];W[pl]
+;B[gm];W[jl];B[bi];W[bj];B[sb];W[rl];B[qb];W[pb];B[ra];W[ej]
+;B[ql];W[rn];B[ro];W[ci];B[rk];W[el];B[rm];W[ko];B[sn];W[mg]
+)
diff --git a/regression/games/arend/constructed5.sgf b/regression/games/arend/constructed5.sgf
new file mode 100644 (file)
index 0000000..f52cc81
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-11]
+SY[Cgoban 1.9.10]TM[-];PL[2]
+AW[eb][fc][hc][be][ce][de][ee][fe][ge][he][ie]
+AB[ae][af][bf][cf][df][ef][ff][gf][hf][if]
+)
diff --git a/regression/games/arend/constructed6.sgf b/regression/games/arend/constructed6.sgf
new file mode 100644 (file)
index 0000000..f62a607
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-11]
+SY[Cgoban 1.9.10]TM[-];PL[2]
+AW[bb][eb][dc][fc][hc][dd][be][ce][ee][fe][ge][he][ie]
+AB[ae][de][af][bf][cf][df][ef][ff][gf][hf][if]
+)
diff --git a/regression/games/arend/exper1.sgf b/regression/games/arend/exper1.sgf
new file mode 100644 (file)
index 0000000..a519116
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1004687411] 
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:74][ed:74][od:74][pd:75][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:74][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[pd];W[pe];B[od];W[qd];B[qe];W[pf];B[pp];W[qc];B[md];W[qh]
+;B[dd];W[oo];B[nq];W[po];B[dp];W[qp];B[dj];W[cn];B[dn];W[do]
+;B[co];W[eo];B[cp];W[cm];B[fq];W[em];B[cg];W[ic];B[nf];W[fc]
+;B[eb];W[lc];B[jp];W[gq];B[gp];W[hq];B[hp];W[fr];B[ir];W[eq]
+;B[lp];W[fp];B[bn];W[bm];B[cr];W[ld];B[ao];W[nh];B[lf];W[lh]
+;B[jf];W[mn];B[hf];W[kn];B[kg];W[iq];B[jq];W[ji];B[qo];W[qn]
+;B[qq];W[ro];B[ip];W[ef];B[cf];W[ig];B[go];W[if];B[ob];W[nc]
+;B[nd];W[nb];B[fg];W[im];B[gj];W[fb];B[ec];W[fd];B[op];W[rq]
+;B[qr];W[ed];B[hi];W[ii];B[ij];W[jj];B[ik];W[jk];B[ck];W[dc]
+;B[cc];W[db];B[cb];W[ea];B[de];W[he];B[ie];W[ke];B[bl];W[eg]
+;B[hg];W[hh];B[gh];W[ih];B[eh];W[gf];B[am];W[cl];B[hr];W[bk]
+;B[dr];W[al];B[an];W[ci];B[ff];W[ee];B[ek];W[bh];B[dl];W[dm]
+;B[gg];W[ge];B[dh];W[rr];B[rs];W[pq];B[pr];W[np];B[oq];W[mp]
+;B[mq];W[lo];B[ko];W[jo];B[kp];W[ae];B[jn];W[jm];B[in];W[hn]
+;B[io];W[bd];B[cd];W[er];B[hm];W[jl];B[gm];W[dq];B[bp];W[cq]
+;B[bq];W[fn];B[be];W[af];B[bc];W[ad];B[gn];W[gr];B[el];W[fm]
+;B[fl];W[il];B[hl];W[di];B[ei];W[cj];B[bf];W[ag];B[dk];W[hs]
+;B[jr];W[ds];B[bs];W[es];B[cs];W[gs];B[ep];W[fo];B[bg];W[ch]
+;B[bj];W[aj];B[dg];W[is];B[sr];W[sq];B[ac];W[ah];B[df];W[js]
+;B[ks];W[ca];B[ba];W[ss];B[qs];W[sr];B[kr];W[da];B[qb];W[rb]
+;B[fe];W[tt];B[tt]
+)
diff --git a/regression/games/arend/exper2.sgf b/regression/games/arend/exper2.sgf
new file mode 100644 (file)
index 0000000..5cf026e
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.13 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.1.13 gmp Random Seed 1005210747] 
+LB[cc:74][dc:74][ec:74][oc:74][pc:74][qc:74][cd:74][dd:75][ed:74][od:74][pd:74][qd:74][ce:74][de:74][pe:74][qe:74][jj:74][co:74][do:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[dd];W[ji];B[pd];W[op];B[qq];W[po];B[dp];W[cn];B[fq];W[hq]
+;B[jq];W[ip];B[mq];W[or];B[ro];W[kq];B[kr];W[lr];B[lq];W[kp]
+;B[ir];W[mr];B[hr];W[jp];B[jd];W[df];B[fd];W[en];B[hd];W[qc]
+;B[pc];W[qd];B[qe];W[re];B[qf];W[rf];B[qg];W[pb];B[ob];W[qb]
+;B[nc];W[cd];B[cc];W[ce];B[bc];W[gg];B[pi];W[gq];B[gr];W[fp]
+;B[ep];W[fo];B[bo];W[bn];B[co];W[ao];B[ap];W[an];B[bp];W[eq]
+;B[fr];W[do];B[nq];W[nr];B[mo];W[pr];B[mm];W[oj];B[mk];W[mi]
+;B[qr];W[ol];B[nl];W[om];B[np];W[qp];B[kk];W[lj];B[rq];W[nn]
+;B[lk];W[ik];B[af];W[bf];B[bg];W[ae];B[ch];W[cj];B[ig];W[hh]
+;B[qk];W[qn];B[rp];W[rn];B[pq];W[oq];B[so];W[lc];B[ld];W[jc]
+;B[kc];W[lb];B[kb];W[ge];B[fe];W[ff];B[hf];W[gf];B[gd];W[cq]
+;B[dq];W[cp];B[bq];W[cr];B[br];W[ke];B[lf];W[kd];B[jb];W[ic]
+;B[le];W[je];B[ib];W[he];B[ie];W[id];B[if];W[jg];B[jf];W[kg]
+;B[kf];W[rg];B[nh];W[rh];B[ri];W[qh];B[ph];W[ag];B[qi];W[mh]
+;B[mg];W[ni];B[oi];W[ih];B[rl];W[ef];B[sn];W[ok];B[nj];W[mn]
+;B[ls];W[ms];B[rm];W[ks];B[qo];W[pn];B[jr];W[ee];B[de];W[ed]
+;B[eb];W[dc];B[cb];W[fc];B[db];W[hc];B[jd];W[lg];B[ng];W[fb]
+;B[ea];W[sh];B[hb];W[gc];B[fa];W[gb];B[ga];W[bd];B[pp];W[pj]
+;B[ec];W[dd];B[si];W[eo];B[dr];W[pa];B[js];W[ls];B[ps];W[os]
+;B[oo];W[qs];B[lo];W[no];B[rs];W[on];B[qj];W[ln];B[qm];W[pl]
+;B[oa];W[pm];B[ac];W[ad];B[ps];W[hg];B[qs];W[pk];B[ql];W[tt]
+;B[iq];W[tt];B[hp];W[gp];B[tt];W[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo1.sgf b/regression/games/arend/gnugo-gnugo1.sgf
new file mode 100644 (file)
index 0000000..7e4f7e5
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1004659200] 
+;B[dp];W[pp];B[dc];W[qd];B[oc];W[kc];B[pe];W[qe];B[pf];W[qf]
+;B[pg];W[qg];B[de];W[cn];B[pn];W[np];B[qp];W[qq];B[qo];W[rq]
+;B[qj];W[jq];B[cl];W[cq];B[ci];W[dq];B[ic];W[ke];B[ie];W[kg]
+;B[ei];W[ki];B[ig];W[ep];B[hh];W[go];B[qb];W[jo];B[pl];W[lo]
+;B[rh];W[md];B[ph];W[ji];B[rc];W[hi];B[gi];W[hj];B[fl];W[nh]
+;B[jb];W[bm];B[bl];W[nf];B[ne];W[nl];B[mb];W[kb];B[rp];W[jc]
+;B[ib];W[en];B[nn];W[me];B[mm];W[lk];B[hl];W[nj];B[gj];W[km]
+;B[dl];W[hn];B[cm];W[bn];B[sq];W[sr];B[sp];W[qr];B[nd];W[mc]
+;B[lb];W[la];B[nb];W[ik];B[am];W[il];B[hm];W[gm];B[gl];W[fm]
+;B[jf];W[el];B[ek];W[dm];B[jd];W[kd];B[oo];W[op];B[ml];W[fk]
+;B[gk];W[je];B[mk];W[id];B[hd];W[hc];B[gc];W[mj];B[dk];W[nk]
+;B[jh];W[ja];B[hb];W[nm];B[ln];W[im];B[kh];W[lh];B[kf];W[mo]
+;B[mn];W[jd];B[lg];W[mg];B[lf];W[mf];B[kn];W[jn];B[an];W[ao]
+;B[al];W[bo];B[ll];W[kl];B[ii];W[ij];B[of];W[om];B[ko];W[on]
+;B[po];W[no];B[pm];W[oh];B[oi];W[oj];B[pi];W[og];B[ni];W[mi]
+;B[pk];W[em];B[le];W[ia];B[ha];W[ka];B[ih];W[ma];B[na];W[he]
+;B[ge];W[if];B[hf];W[ie];B[ld];W[lc];B[jg];W[gf];B[hg];W[gh]
+;B[gg];W[pj];B[nc];W[hk];B[ok];W[ol];B[tt];W[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo2.sgf b/regression/games/arend/gnugo-gnugo2.sgf
new file mode 100644 (file)
index 0000000..9039e76
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1004669294] 
+;B[dq];W[dc];B[qd];W[qp];B[op];W[pn];B[qq];W[rq];B[pq];W[ro]
+;B[lq];W[oc];B[ld];W[nd];B[pf];W[qb];B[qj];W[co];B[dl];W[fo]
+;B[eo];W[en];B[ep];W[dn];B[fn];W[fm];B[gn];W[el];B[dj];W[fq]
+;B[fp];W[go];B[gp];W[ho];B[iq];W[hn];B[fr];W[de];B[cg];W[jc]
+;B[cl];W[gc];B[oj];W[nn];B[lf];W[ol];B[mg];W[gm];B[bp];W[lc]
+;B[ie];W[mc];B[be];W[ml];B[mj];W[cp];B[kj];W[cq];B[ij];W[rd]
+;B[gj];W[qe];B[ek];W[bm];B[qf];W[pe];B[bl];W[bn];B[hl];W[rf]
+;B[rg];W[ql];B[im];W[sg];B[rh];W[dg];B[dh];W[eg];B[rk];W[bc]
+;B[ko];W[cf];B[bf];W[of];B[og];W[gf];B[hg];W[je];B[jf];W[id]
+;B[jn];W[np];B[nq];W[dr];B[gq];W[if];B[ig];W[kf];B[kg];W[jg]
+;B[jh];W[oo];B[kl];W[pp];B[rr];W[oq];B[or];W[mq];B[nr];W[mp]
+;B[mr];W[sr];B[er];W[qr];B[cr];W[br];B[ds];W[pr];B[rm];W[nf]
+;B[ke];W[jf];B[ii];W[ng];B[nh];W[pg];B[qg];W[oh];B[ph];W[kd]
+;B[mh];W[le];B[og];W[mf];B[bs];W[bq];B[pg];W[lg];B[qm];W[kh]
+;B[ki];W[pm];B[pk];W[al];B[ak];W[am];B[bh];W[pl];B[lh];W[hf]
+;B[ce];W[rl];B[sl];W[fk];B[fj];W[gk];B[df];W[ef];B[dd];W[ee]
+;B[cc];W[cb];B[db];W[cd];B[gl];W[fl];B[bd];W[ed];B[hk];W[nk]
+;B[qn];W[lp];B[kp];W[os];B[lr];W[ll];B[lm];W[kg];B[mm];W[nm]
+;B[mn];W[nj];B[mo];W[ni];B[oi];W[lk];B[lj];W[gg];B[hh];W[cm]
+;B[qo];W[mi];B[li];W[hp];B[dm];W[hq];B[hr];W[lo];B[ar];W[aq]
+;B[ac];W[ab];B[ad];W[ln];B[km];W[gh];B[eh];W[hi];B[ih];W[gi]
+;B[fh];W[fi];B[hj];W[ei];B[ej];W[fg];B[di];W[kk];B[jk];W[as]
+;B[cs];W[do];B[sh];W[sf];B[em];W[ns];B[ip];W[io];B[jo];W[ms]
+;B[ls];W[ps];B[cf];W[rn];B[sn];W[so];B[sm];W[no];B[ar];W[jq]
+;B[jr];W[as];B[mk];W[nl];B[ar];W[kq];B[kr];W[as];B[sd];W[re]
+;B[ar];W[po];B[sk];W[as];B[rp];W[sp];B[ar];W[qk];B[rj];W[ok]
+;B[pj];W[as];B[aa];W[ba];B[ar];W[ir];B[is];W[as];B[dp];W[ar]
+;B[in];W[kn];B[hm];W[fn];B[tt];W[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo4.sgf b/regression/games/arend/gnugo-gnugo4.sgf
new file mode 100644 (file)
index 0000000..6ce0e5c
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1004973277] 
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:74][ed:74][od:74][pd:75][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:74][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[pd];W[dc];B[pq];W[dp];B[qk];W[qf];B[ce];W[cg];B[ee];W[fd]
+;B[dg];W[dh];B[eg];W[fe];B[ch];W[ei];B[ci];W[qo];B[op];W[qi]
+;B[pn];W[nc];B[nd];W[md];B[ne];W[qc];B[ng];W[oc];B[rp];W[qd]
+;B[cn];W[dn];B[dm];W[en];B[co];W[cp];B[dk];W[fp];B[hq];W[gn]
+;B[kq];W[bd];B[bg];W[gr];B[gq];W[fq];B[cd];W[cc];B[hr];W[kd]
+;B[fr];W[er];B[gs];W[if];B[ff];W[gf];B[es];W[dr];B[in];W[hi]
+;B[nn];W[lg];B[mg];W[kj];B[kn];W[rj];B[rk];W[gh];B[be];W[bc]
+;B[pc];W[pb];B[pe];W[qg];B[qe];W[re];B[nj];W[mi];B[nk];W[ik]
+;B[oi];W[ll];B[lf];W[kg];B[qj];W[ri];B[bp];W[bq];B[ao];W[fk]
+;B[aq];W[br];B[kl];W[lk];B[ej];W[fj];B[eh];W[hn];B[fi];W[io]
+;B[jo];W[im];B[ip];W[jn];B[lm];W[kf];B[le];W[ld];B[mj];W[lj]
+;B[jm];W[me];B[mf];W[gi];B[fh];W[od];B[oe];W[pf];B[of];W[og]
+;B[nf];W[ni];B[oh];W[ph];B[il];W[hl];B[jl];W[in];B[em];W[ke]
+;B[nh];W[mh];B[pg];W[el];B[ek];W[dl];B[cl];W[fl];B[fm];W[pi]
+;B[oj];W[ar];B[gm];W[hm];B[gl];W[hk];B[gk];W[gj];B[ed];W[ec]
+;B[do];W[fn];B[ck];W[cm];B[bm];W[dm];B[eo];W[gp];B[hp];W[fo]
+;B[ho];W[sk];B[sl];W[sj];B[rm];W[pj];B[pk];W[ae];B[af];W[ad]
+;B[jk];W[jj];B[ko];W[ml];B[ep];W[eq];B[bo];W[mm];B[mn];W[nl]
+;B[ol];W[nm];B[om];W[dd];B[gg];W[hg];B[de];W[ds];B[fs];W[fg]
+;B[ef];W[gg];B[og];W[ap];B[an];W[aq];B[go];W[mk];B[ok];W[kk]
+;B[km];W[tt];B[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo5.sgf b/regression/games/arend/gnugo-gnugo5.sgf
new file mode 100644 (file)
index 0000000..e46bb7f
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1004991338] 
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:74][ed:74][od:74][pd:74][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:74][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:75][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[dp];W[dd];B[pp];W[pc];B[cf];W[qf];B[ci];W[nq];B[lq];W[qq]
+;B[pq];W[qp];B[po];W[pr];B[or];W[qr];B[oq];W[qn];B[om];W[fq]
+;B[dn];W[dr];B[cq];W[iq];B[fc];W[ee];B[cc];W[ge];B[dc];W[pl]
+;B[np];W[ol];B[ed];W[hc];B[jc];W[lc];B[je];W[hf];B[ke];W[qi]
+;B[me];W[oc];B[jg];W[cl];B[cr];W[el];B[lh];W[em];B[er];W[fr]
+;B[bm];W[fd];B[ec];W[gc];B[ds];W[jb];B[ib];W[ic];B[kb];W[cm]
+;B[cn];W[lb];B[id];W[kr];B[kq];W[lr];B[mr];W[jq];B[go];W[bl]
+;B[io];W[fo];B[bn];W[gp];B[hl];W[en];B[hh];W[fk];B[de];W[gg]
+;B[gn];W[fh];B[of];W[pe];B[oi];W[pj];B[nk];W[gi];B[nl];W[nm]
+;B[on];W[dj];B[ef];W[di];B[ch];W[dh];B[jp];W[kp];B[mq];W[kc]
+;B[ja];W[fe];B[hi];W[dg];B[hj];W[cj];B[bi];W[bj];B[cg];W[df]
+;B[cd];W[hp];B[qo];W[ro];B[ko];W[kd];B[jd];W[le];B[lf];W[ld]
+;B[la];W[mb];B[md];W[nb];B[ls];W[js];B[fb];W[hb];B[ha];W[ga]
+;B[gb];W[ia];B[jb];W[ha];B[hd];W[gd];B[ph];W[qh];B[oe];W[eq]
+;B[dq];W[ip];B[jo];W[fa];B[ea];W[os];B[ns];W[ps];B[od];W[am]
+;B[pd];W[qd];B[pf];W[qe];B[qg];W[rg];B[pg];W[an];B[ao];W[al]
+;B[bo];W[pm];B[ep];W[fp];B[gj];W[fj];B[gh];W[fi];B[eo];W[fn]
+;B[aj];W[ak];B[ai];W[gm];B[hm];W[ho];B[hn];W[gl];B[gk];W[dm]
+;B[ma];W[na];B[ka];W[fs];B[es];W[hg];B[ig];W[if];B[jf];W[mc]
+;B[oj];W[nd];B[ne];W[ok];B[nc];W[pb];B[nd];W[ks];B[ms];W[pi]
+;B[mj];W[pn];B[he];W[eg];B[ie];W[ff];B[tt];W[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo6.sgf b/regression/games/arend/gnugo-gnugo6.sgf
new file mode 100644 (file)
index 0000000..36731eb
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1005005189] 
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:74][ed:74][od:74][pd:74][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:74][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:75][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[qp];W[qd];B[nq];W[dq];B[dd];W[do];B[cm];W[fc];B[hc];W[cc]
+;B[dc];W[cd];B[de];W[db];B[eb];W[cb];B[ec];W[cf];B[eg];W[od]
+;B[mc];W[nb];B[pj];W[qh];B[jp];W[hq];B[cj];W[bn];B[nc];W[oc]
+;B[mb];W[ql];B[cn];W[co];B[ob];W[pb];B[rj];W[ol];B[nj];W[nm]
+;B[no];W[pn];B[mk];W[lm];B[bm];W[oa];B[bo];W[bp];B[fd];W[pp]
+;B[pq];W[qo];B[rp];W[fo];B[an];W[cg];B[kk];W[dh];B[og];W[qe]
+;B[ap];W[bq];B[ej];W[ro];B[em];W[sp];B[rq];W[me];B[lg];W[jr]
+;B[bh];W[bg];B[ch];W[ho];B[dg];W[gl];B[ij];W[oh];B[nh];W[pg]
+;B[ce];W[be];B[le];W[of];B[gj];W[im];B[kq];W[jl];B[kr];W[iq]
+;B[gm];W[hm];B[fl];W[lo];B[hl];W[op];B[oq];W[np];B[mf];W[ng]
+;B[mh];W[md];B[ld];W[mq];B[mr];W[lq];B[gn];W[jo];B[lp];W[mp]
+;B[kp];W[lr];B[ls];W[ip];B[ne];W[nd];B[lb];W[ri];B[qi];W[pi]
+;B[qj];W[rh];B[nf];W[oj];B[ok];W[oi];B[pk];W[rk];B[si];W[il]
+;B[hk];W[js];B[ks];W[ah];B[bi];W[ko];B[ms];W[sq];B[sr];W[so]
+;B[rs];W[df];B[ef];W[ag];B[qk];W[sk];B[sj];W[rl];B[sh];W[ml]
+;B[nk];W[lk];B[lj];W[kl];B[hn];W[in];B[jk];W[ni];B[mi];W[fn]
+;B[rg];W[qg];B[rf];W[re];B[qf];W[pf];B[oe];W[pe];B[aq];W[ar]
+;B[ao];W[br];B[da];W[sf];B[sg];W[se];B[ca];W[ba];B[ea];W[bb]
+;B[ai];W[bd];B[ma];W[go];B[gk];W[fm];B[gl];W[na];B[ll];W[nl]
+;B[lk];W[pl];B[dn];W[en];B[ik];W[pr];B[or];W[rr];B[qr];W[jq]
+;B[mg];W[og];B[tt];W[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo7.sgf b/regression/games/arend/gnugo-gnugo7.sgf
new file mode 100644 (file)
index 0000000..628a280
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1005188013] 
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:74][ed:74][od:74][pd:74][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:75][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[jj];W[dp];B[dn];W[fp];B[dj];W[qq];B[cp];W[cq];B[co];W[bq]
+;B[dd];W[jq];B[pd];W[fc];B[hc];W[cc];B[dc];W[cd];B[de];W[db]
+;B[eb];W[cb];B[fb];W[pf];B[nd];W[qd];B[qc];W[qe];B[rc];W[qj]
+;B[pp];W[pq];B[op];W[ro];B[pm];W[mq];B[nm];W[oq];B[ce];W[be]
+;B[bf];W[bd];B[kc];W[ph];B[kl];W[jo];B[il];W[ho];B[nf];W[ni]
+;B[mh];W[jh];B[lf];W[ki];B[hh];W[mi];B[ii];W[lh];B[oj];W[mg]
+;B[nj];W[lk];B[ll];W[gm];B[dl];W[an];B[sf];W[rh];B[fd];W[mf]
+;B[gk];W[me];B[md];W[ne];B[le];W[od];B[oc];W[dh];B[fl];W[cf]
+;B[ci];W[cg];B[oe];W[bh];B[ng];W[nh];B[mo];W[of];B[eg];W[rl]
+;B[ig];W[jg];B[jf];W[eh];B[fh];W[fi];B[gh];W[ej];B[kn];W[bj]
+;B[mj];W[dk];B[bl];W[ck];B[lj];W[pl];B[pk];W[mp];B[qk];W[rk]
+;B[ql];W[cl];B[bm];W[cm];B[dm];W[bn];B[bo];W[cn];B[do];W[eo]
+;B[bp];W[dq];B[rm];W[rd];B[sd];W[oi];B[sl];W[sj];B[kg];W[li]
+;B[aq];W[ar];B[ap];W[fm];B[ek];W[fj];B[br];W[cr];B[as];W[el]
+;B[em];W[fk];B[en];W[gl];B[hk];W[im];B[pe];W[rf];B[se];W[jm]
+;B[np];W[km];B[lm];W[ko];B[lo];W[lp];B[nq];W[nr];B[sg];W[jn]
+;B[ln];W[qp];B[po];W[ea];B[hl];W[lg];B[pj];W[pi];B[kj];W[df]
+;B[ef];W[rn];B[jl];W[sn];B[sm];W[rg];B[re];W[qf];B[qn];W[sh]
+;B[sc];W[hm];B[fa];W[gj];B[da];W[hj];B[ca];W[ba];B[ea];W[bb]
+;B[ij];W[ji];B[qo];W[rp];B[ih];W[sk];B[qm];W[dg];B[gi];W[kh]
+;B[kf];W[el];B[hi];W[tt];B[tt]
+)
diff --git a/regression/games/arend/gnugo-gnugo8.sgf b/regression/games/arend/gnugo-gnugo8.sgf
new file mode 100644 (file)
index 0000000..9909c80
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.0.0 (level 10) gmp]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.0.0 gmp Random Seed 1005191300] 
+LB[cc:74][dc:74][ec:74][fc:74][nc:74][oc:74][pc:74][qc:74][cd:74][dd:75][ed:74][od:74][pd:74][qd:74][ce:74][de:74][ee:74][oe:74][pe:74][qe:74][cf:74][qf:74][jj:74][cn:74][qn:74][co:74][do:74][eo:74][oo:74][po:74][qo:74][cp:74][dp:74][ep:74][op:74][pp:74][qp:74][cq:74][dq:74][eq:74][fq:74][nq:74][oq:74][pq:74][qq:74]
+C[Value of move: 75]
+;B[dd];W[pp];B[dq];W[pd];B[dk];W[jp];B[nq];W[oq];B[np];W[pn]
+;B[co];W[lq];B[nc];W[mo];B[kc];W[fc];B[cf];W[db];B[cc];W[ic]
+;B[hq];W[qf];B[pb];W[qc];B[qh];W[qb];B[ib];W[jb];B[jc];W[hb]
+;B[id];W[qj];B[hc];W[gb];B[cb];W[ia];B[eb];W[ic];B[hd];W[kb]
+;B[lb];W[oj];B[ec];W[ci];B[fd];W[ei];B[oc];W[ej];B[ka];W[qi]
+;B[pg];W[ng];B[oe];W[rh];B[go];W[fl];B[cl];W[pf];B[hl];W[gj]
+;B[eo];W[dg];B[hm];W[ll];B[jr];W[ik];B[lr];W[mr];B[nf];W[bg]
+;B[gg];W[bk];B[bl];W[ii];B[bj];W[ko];B[bf];W[nr];B[jf];W[kr]
+;B[mg];W[nh];B[kh];W[li];B[em];W[ir];B[hr];W[js];B[ef];W[jm]
+;B[bi];W[cg];B[ig];W[hs];B[gr];W[af];B[ae];W[ag];B[bd];W[hk]
+;B[gl];W[fm];B[fn];W[el];B[dl];W[gm];B[gn];W[in];B[gk];W[ek]
+;B[hn];W[pa];B[oa];W[cj];B[ak];W[gs];B[fs];W[is];B[qa];W[fr]
+;B[fq];W[es];B[cr];W[lh];B[lg];W[jh];B[ki];W[kj];B[kg];W[ji]
+;B[ra];W[rb];B[ck];W[bh];B[er];W[fs];B[io];W[jo];B[im];W[ds]
+;B[jn];W[kn];B[jl];W[km];B[cs];W[il];B[dj];W[di];B[pe];W[qe]
+;B[dr];W[ip];B[hp];W[od];B[nd];W[of];B[ne];W[jq];B[in];W[pc]
+;B[sb];W[sc];B[fk];W[gi];B[hh];W[fj];B[eg];W[fh];B[eh];W[fg]
+;B[dh];W[ch];B[ff];W[gh];B[hi];W[hj];B[ih];W[mh];B[df];W[sa]
+;B[pa];W[ai];B[sb];W[na];B[jg];W[jj];B[aj];W[sa];B[ob];W[ah]
+;B[sb];W[al];B[am];W[sa];B[rg];W[sb];B[iq];W[tt];B[tt]
+)
diff --git a/regression/games/arion.sgf b/regression/games/arion.sgf
new file mode 100644 (file)
index 0000000..3fe1e1b
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[3]
+SZ[19]KM[0.5]
+PW[arion]
+WR[15k*]
+PB[GnuGo]
+BR[16k*]
+DT[2000-12-28]
+SY[Cgoban 1.9.2];B[dd];W[dp];B[pd];W[pp];B[fq];W[eq];B[fp];W[dn];B[cq]
+;W[cp];B[er];W[dq];B[cl];W[dl];B[dk];W[cm];B[qn];W[nq];B[rp];W[qq];
+B[jd];W[cf];B[bl];W[bm];B[cj];W[bc];B[on];W[pj];B[rq];W[qr];B[qh];
+W[pm];B[bq];W[bp];B[dr];W[pn];B[qm];W[qo];B[ro];W[oo];B[gc];W[nc];
+B[oc];W[nd];B[pf];W[ql];B[rl];W[qk];B[rk];W[lp];B[lc];W[ld];B[kc];
+W[kd];B[md];W[me];B[mc];W[lf];B[nb];W[oe];B[pe];W[qc];B[rj];W[re];
+B[rf];W[qd];B[se];W[sd];B[nn];W[no];B[mm];W[mn];B[nm];W[ln];B[nk];
+W[of];B[ch];W[bg];B[iq];W[lm];B[mj];W[lk];B[pb];W[qb];B[sf];W[rb];
+B[sc];W[rd];B[sb];W[oh];B[li];W[jj];B[kg];W[kf];B[cc];W[cd];B[cb];
+W[ce];B[bb];W[bd];B[lg];W[jg];B[el];W[dm];B[eo];W[al];B[lr];W[mr];
+B[bk];W[bo];B[kq];W[lq];B[kr];W[jh];B[mg];W[ng];B[fj];W[do];B[ap];
+W[ao];B[cn];W[fm];B[em];W[en];B[fn];W[am];B[bn];W[gm];B[fl];W[gl];
+B[gk];W[je];B[id];W[bj];B[ak];W[aj];B[ck];W[ek];B[ej];W[fk];B[bi];
+W[ef];B[gj];W[gn];B[fo];W[ie];B[fg];W[ee];B[fd];W[ff];B[aq];W[gg];
+B[di];W[kp];B[fh];W[hk];B[de];W[df];B[ed];W[ge];B[qa];W[io];B[jp];
+W[jo];B[ip];W[go];B[rr];W[hp];B[hq];W[gp];B[gq];W[qp];B[od];W[ne];
+B[ra];W[gh];B[sa];W[hj];B[gi];W[hi];B[rs];W[qs];B[ab];W[ac];B[pg];
+W[qi];B[ri];W[ph];B[qj];W[pi];B[pk];W[pl];B[ol];W[ml];B[nl];W[ni];
+B[bh];W[ag];B[hd];W[he];B[ms];W[ns];B[ls];W[eh];B[ei];W[eg];B[fi];
+W[dh];B[cg];W[bf];B[ah];W[gd];B[fe];W[hc];B[hb];W[fc];B[dc];W[gb];
+B[eb];W[jc];B[jb];W[ic];B[ib];W[da];B[ca];W[ea];B[ha];W[fa];B[ga];
+W[fb];B[dg];W[tt];B[og];W[tt];B[ep];W[tt];B[tt]
+)
+
diff --git a/regression/games/atari-crash.sgf b/regression/games/atari-crash.sgf
new file mode 100755 (executable)
index 0000000..34bceb9
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]SZ[9]KM[7.5]HA[0]GN[GNU Go 3.7.10 stepped on a bug]
+;B[ec];W[ee];B[cf];W[dd];B[dc];W[cd];B[ge];W[eg];B[gg];W[be];B[eh];W[dg]
+;B[fh];W[cc];B[dh];W[cg];B[fd];W[cb];B[ch];W[fa];B[bg];W[bf];B[ed];W[bh]
+;B[gf];W[gc];B[eb];W[ea];B[da];W[gb];B[db];W[hd];B[gd];W[he];B[hf];W[bi]
+;B[ie];W[ic];B[hb];W[ha];B[ib];W[fb];B[ef];W[df];B[if];W[ca];B[de];W[ff]
+;B[fg];W[ce];B[ac];W[fe];B[ab];W[ad];B[aa];W[ci];B[ah];W[di];B[ag];W[af]
+;B[fi];W[ai];B[ag];W[bg];B[ei]
+)
diff --git a/regression/games/atari_atari01.sgf b/regression/games/atari_atari01.sgf
new file mode 100644 (file)
index 0000000..99e90ae
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.188 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.188 ascii Random Seed 973842514] 
+;B[pd];W[ed];B[pp];W[dq];B[pj];W[nc];B[pf];W[jd];B[co];W[dm]
+;B[iq];W[gq];B[lq];W[cj];B[ce];W[cd];B[ch];W[pm];B[np];W[nm]
+;B[lm];W[qo];B[de];W[dd];B[qp];W[po];B[eo];W[go];B[fn];W[dp]
+;B[do];W[bp];B[eh];W[ef];B[gh];W[fl];B[hi];W[mk];B[gn];W[en]
+;B[fo];W[gp];B[nl];W[ml];B[ol];W[pl];B[nj];W[lj];B[ee];W[ff]
+;B[hf];W[fe];B[be];W[bd];B[fd];W[gd];B[fc];W[he];B[gf];W[ge]
+;B[db];W[eb];B[fb];W[cb];B[ec];W[dc];B[ea];W[bb];B[bj];W[dg]
+;B[ck];W[dj];B[bm];W[cm];B[dh];W[cg];B[bg];W[fi];B[fh];W[ei]
+;B[bk];W[hl];B[em];W[el];B[fm];W[in];B[bn];W[bo];B[dl];W[dk]
+;B[cl];W[hj];B[ho];W[hq];B[mm];W[nn];B[hm];W[im];B[hn];W[io]
+;B[il];W[ko];B[kk];W[kj];B[ik];W[ij];B[mn];W[jq];B[jj];W[ji]
+;B[jk];W[ii];B[ki];W[li];B[kh];W[gi];B[hh];W[lh];B[hk];W[gk]
+;B[gl];W[jh];B[kg];W[if];B[fk];W[jg];B[lg];W[mh];B[mg];W[nh]
+;B[gj];W[hg];B[gg];W[ig];B[ld];W[ne];B[ng];W[oh];B[qh];W[oj]
+;B[oi];W[ok];B[oc];W[le];B[jc];W[hb];B[ic];W[hc];B[kc];W[mc]
+;B[ip];W[jp];B[jm];W[hp];B[ni];W[og];B[nk];W[pk];B[qj];W[of]
+;B[ke];W[je];B[me];W[kd];B[kf];W[lc];B[ib];W[ia];B[rl];W[qk]
+;B[on];W[om];B[oo];W[no];B[rk];W[rm];B[mo];W[rp];B[rq];W[ro]
+;B[qm];W[pn];B[rn];W[op];B[oq];W[nq];B[mp];W[pq];B[oo];W[qq]
+;B[op];W[rr];B[pr];W[sq];B[nb];W[mb];B[ob];W[ph];B[pi];W[sn]
+;B[sm];W[qr];B[or];W[so];B[jn];W[jo];B[cp];W[cq];B[ao];W[bq]
+;B[kq];W[kr];B[lr];W[ir];B[ks];W[jr];B[ad];W[ac];B[ae];W[bc]
+;B[pg];W[od];B[ll];W[oe];B[pe];W[na];B[oa];W[ma];B[lk];W[mj]
+;B[qs];W[rs];B[pc];W[ps];B[mq];W[js];B[ls];W[ap];B[an];W[kn]
+;B[os];W[km];B[jl];W[qs];B[cf];W[ep];B[df];W[eg];B[bh];W[fp]
+;B[kp];W[lo];B[qn];W[ql];B[rm];W[ri];B[rj];W[qg];B[rh];W[rg]
+;B[rf];W[sh];B[qi];W[tt];B[on];W[tt];B[mi];W[md];B[ih];W[jf]
+;B[fg];W[id];B[ln];W[tt];B[lp];W[tt];B[kl];W[tt];B[tt]
+)
diff --git a/regression/games/atari_atari02.sgf b/regression/games/atari_atari02.sgf
new file mode 100644 (file)
index 0000000..b308a24
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.238 (level 10) ascii]HA[2]KM[0.5]GN[GNU Go 2.7.238 ascii Random Seed 992078397] 
+AB[pd]AB[dp]
+;W[qp];B[dd];W[oq];B[jd];W[cj];B[qj];W[cg];B[ce];W[cn];B[dn]
+;W[cm];B[jq];W[lq];B[gq];W[ql];B[co];W[ej];B[qg];W[nc];B[ob]
+;W[nb];B[fc];W[jc];B[ic];W[kc];B[dm];W[dl];B[el];W[dk];B[bn]
+;W[bm];B[bo];W[ko];B[ok];W[ol];B[hn];W[io];B[in];W[jo];B[ho]
+;W[iq];B[ir];W[ip];B[kr];W[lr];B[am];W[bl];B[rk];W[rl];B[bf]
+;W[bg];B[fk];W[jl];B[hl];W[jn];B[nl];W[nk];B[oj];W[pl];B[mk]
+;W[nm];B[nj];W[ml];B[ll];W[mm];B[kj];W[pb];B[qc];W[qb];B[rb]
+;W[ef];B[oc];W[oa];B[pc];W[na];B[lf];W[ib];B[hc];W[hb];B[gb]
+;W[ne];B[pf];W[kd];B[ng];W[fj];B[je];W[he];B[ge];W[gf];B[if]
+;W[gd];B[fe];W[gc];B[ga];W[id];B[ih];W[gh];B[ls];W[ms];B[ks]
+;W[nr];B[ag];W[ah];B[af];W[bh];B[sl];W[sm];B[sk];W[rm];B[nd]
+;W[md];B[hr];W[ji];B[lh];W[jj];B[od];W[me];B[qa];W[pa];B[fd]
+;W[hd];B[hf];W[ff];B[pk];W[hk];B[ra];W[mc];B[kk];W[jk];B[gk]
+;W[gj];B[ik];W[hj];B[il];W[ki];B[li];W[ij];B[al];W[ak];B[bk]
+;W[an];B[hg];W[gg];B[kp];W[lp];B[kq];W[lm];B[kl];W[km];B[lk]
+;W[ha];B[fb];W[qk];B[rj];W[oe];B[df];W[dg];B[cf];W[ee];B[pe]
+;W[ed];B[ec];W[de];B[dc];W[ke];B[kf];W[of];B[og];W[mf];B[mg]
+;W[jh];B[jg];W[ie];B[jf];W[hh];B[kh];W[ii];B[kg];W[le];B[ao]
+;W[am];B[hp];W[ek];B[fl];W[im];B[hm];W[jm];B[nk];W[ig];B[cl]
+;W[ck];B[ih];W[cd];B[bd];W[ig];B[ae];W[ih];B[hq];W[lo];B[jp]
+;W[cc];B[bc];W[cb];B[db];W[da];B[bb];W[tt];B[nf];W[tt];B[tt]
+)
diff --git a/regression/games/atari_atari03.sgf b/regression/games/atari_atari03.sgf
new file mode 100644 (file)
index 0000000..34aafd6
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.0.0)]WR[14k*]
+PB[journeyman]BR[13k*]
+PC[NNGS]DT[2001-08-29]AP[gnugoclient:2.0]
+RE[W+15.5]
+;B[pd];W[dp];B[pp];W[dd];B[pj];W[nc];B[pf];W[pn];B[qn];W[qm];B[qo]
+;W[pb];B[qc];W[kc];B[pm];W[ql];B[om];W[no];B[on];W[rj];B[qb];W[nq]
+;B[oq];W[nr];B[or];W[dj];B[cf];W[ce];B[df];W[fd];B[dh];W[be];B[cj]
+;W[ck];B[ci];W[dk];B[gg];W[jp];B[lm];W[rn];B[ro];W[ke];B[rh];W[qi]
+;B[qh];W[sm];B[rl];W[hc];B[rm];W[fq];B[mp];W[lr];B[np];W[co];B[bk]
+;W[bl];B[aj];W[in];B[dm];W[oc];B[pi];W[he];B[bf];W[me];B[cl];W[bm]
+;B[fm];W[fk];B[gl];W[gj];B[il];W[lh];B[ii];W[go];B[eo];W[ig];B[hh]
+;W[ng];B[oh];W[mj];B[nk];W[kj];B[kk];W[ij];B[jj];W[hi];B[ih];W[jk]
+;B[ji];W[el];B[em];W[fi];B[fg];W[ej];B[ik];W[lk];B[kl];W[hj];B[ei]
+;W[gk];B[gh];W[gi];B[dl];W[fl];B[hm];W[os];B[ps];W[ns];B[qr];W[lq]
+;B[lp];W[qa];B[ra];W[pa];B[sb];W[fn];B[gn];W[fo];B[hn];W[ho];B[jm]
+;W[en];B[dn];W[do];B[hk];W[eh];B[eg];W[di];B[ch];W[og];B[pg];W[af]
+;B[ag];W[ae];B[pc];W[ob];B[kp];W[kq];B[jo];W[io];B[jn];W[jg];B[ki]
+;W[lj];B[li];W[mi];B[nh];W[mh];B[nj];W[cn];B[im];W[ml];B[mm];W[nl]
+;B[ol];W[fh];B[ni];W[hf];B[nm];W[kh];B[jq];W[ip];B[jr];W[kr];B[ir]
+;W[hr];B[mr];W[ks];B[mq];W[is];B[ls];W[ms];B[ls];W[ms];B[ns];W[js]
+;B[ls];W[iq];B[nf];W[mf];B[of];W[mg];B[od];W[de];B[ee];W[fe];B[ed]
+;W[ec];B[ef];W[gf];B[dc];W[cc];B[db];W[cb];B[eb];W[fc];B[bd];W[ad]
+;B[bc];W[bb];B[ca];W[fb];B[da];W[al];B[ak];W[nd];B[ne];W[ms];B[ba]
+;W[ab];B[cd];W[ac];B[bd];W[ls];B[cd];W[cm];B[gm];W[ll];B[ff];W[jh]
+;B[hg];W[mk];B[];W[]
+C[final_score: W+15.5
+B19 removed
+B16 removed
+R11 removed
+S10 removed
+K9 removed
+R8 removed
+T7 removed
+Q6 removed
+S6 removed
+E5 removed
+O5 removed]
+)
diff --git a/regression/games/atari_atari04.sgf b/regression/games/atari_atari04.sgf
new file mode 100644 (file)
index 0000000..4faa3e1
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.0.0)]WR[14k*]
+PB[viking4]BR[20k*]
+PC[NNGS]DT[2001-08-26]AP[gnugoclient:2.0]
+RE[B+4.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[cn];B[fp];W[nq];B[pn];W[fc];B[df];W[nc];B[mo];W[bp];B[iq];W[pr]
+;B[jc];W[cq];B[oe];W[pb];B[me];W[kq];B[ge];W[qq];B[qc];W[qb];B[lc]
+;W[mb];B[em];W[db];B[qg];W[cc];B[rb];W[pc];B[ra];W[ro];B[qm];W[be]
+;B[jo];W[cg];B[hc];W[er];B[dg];W[en];B[fn];W[no];B[nn];W[fe];B[ff]
+;W[dm];B[np];W[ck];B[cj];W[mp];B[oo];W[lp];B[lo];W[fm];B[el];W[gl]
+;B[gn];W[il];B[in];W[hi];B[fj];W[kl];B[ch];W[ml];B[bk];W[ee];B[oq]
+;W[mq];B[or];W[lr];B[de];W[li];B[ef];W[gb];B[hb];W[nj];B[fd];W[kg]
+;B[fh];W[ig];B[cl];W[mg];B[qd];W[kb];B[lb];W[je];B[gd];W[oh];B[qi]
+;W[ir];B[jr];W[jq];B[hr];W[nr];B[is];W[os];B[eo];W[dn];B[pq];W[bg]
+;B[qr];W[ps];B[rr];W[rq];B[qp];W[rp];B[bh];W[hk];B[ed];W[ol];B[kc]
+;W[ql];B[pl];W[pk];B[qk];W[pm];B[rk];W[rl];B[rn];W[qo];B[ok];W[pl]
+;B[qn];W[sq];B[kn];W[bf];B[oj];W[le];B[nk];W[nl];B[mj];W[ni];B[mk]
+;W[ll];B[mi];W[mc];B[nh];W[la];B[ng];W[dl];B[ga];W[ek];B[dk];W[fa]
+;B[jb];W[ha];B[ia];W[bm];B[ga];W[mf];B[ne];W[sk];B[rj];W[jm];B[ha]
+;W[fr];B[po];W[sr];B[gq];W[bl];B[oi];W[hm];B[ej];W[fk];B[lh];W[ki]
+;B[mh];W[hn];B[ho];W[kr];B[jp];W[kp];B[kh];W[jh];B[lf];W[lg];B[gg]
+;W[ld];B[md];W[gm];B[im];W[sj];B[si];W[ka];B[jn];W[ke];B[gj];W[nf]
+;B[of];W[gk];B[hj];W[ij];B[ii];W[ji];B[hh];W[od];B[gi];W[ob];B[nd]
+;W[na];B[ic];W[sl];B[so];W[rs];B[oc];W[ih];B[hi];W[gr];B[od];W[dq]
+;B[ep];W[ah];B[ai];W[ag];B[qa];W[pa];B[ea];W[fb];B[ec];W[eb];B[gs]
+;W[ak];B[aj];W[al];B[cd];W[bd];B[ck];W[km];B[on];W[co];B[gf];W[ks]
+;B[fs];W[js];B[ir];W[es];B[hs];W[rm];B[sn];W[hg];B[cp];W[hf];B[cm]
+;W[bn];B[ie];W[he];B[id];W[if];B[hd];W[ln];B[ko];W[mm];B[mn];W[lm]
+;B[lk];W[jk];B[kk];W[lj];B[ja];W[ma];B[pg];W[kj];B[gc];W[dc];B[fq]
+;W[eq];B[do];W[sm];B[nm];W[ce];B[jg];W[kf];B[cf];W[jd];B[kd];W[jl]
+;B[om];W[qs];B[sp];W[]
+C[final_score: B+4.5
+E19 removed
+K13 removed
+P12 removed
+E8 removed])
diff --git a/regression/games/atari_atari05.sgf b/regression/games/atari_atari05.sgf
new file mode 100644 (file)
index 0000000..f77930c
--- /dev/null
@@ -0,0 +1,51 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.5]
+PW[GnuGo (GNU Go 3.1.25)]WR[13k*]
+PB[Logane]BR[NR]
+PC[NNGS]DT[2002-02-21]AP[gnugoclient:2.0]
+RE[W+117.5]
+AB[dd][pd][jj][dp][pp]
+;W[cn];B[cj];W[fc];B[jc];W[qf];B[qj];W[nq];B[jq];W[df]C[L:9];B[fd]
+;W[gd]C[L:7];B[ge];W[hd]C[L:4];B[he];W[qn]C[L:2];B[id];W[qq]C[L:0]
+;B[qp];W[oo];B[op];W[dh];B[pq];W[qr];B[pr];W[ch];B[de];W[ec];B[ed]
+;W[cb]C[L:1];B[dc];W[eb]C[L:2];B[db];W[gb];B[ea];W[fa]C[L:3];B[da]
+;W[hc]C[L:4];B[ic];W[ib]C[L:5];B[jb];W[ie]C[L:6];B[ia];W[hb];B[ha]
+;W[fp];B[ja];W[ga]C[L:5];B[je];W[if];B[jf];W[nc];B[nd];W[md];B[oc]
+;W[ne]C[L:3];B[od];W[lc]C[L:1];B[nb];W[le]C[L:2];B[mc];W[fh]C[L:3]
+;B[ff];W[ig]C[L:4];B[hf];W[cl]C[L:2];B[kd];W[dj];B[ck];W[bi]C[L:3]
+;B[dk];W[po]C[L:4];B[np];W[ld]C[L:1];B[kc];W[lb]C[L:2];B[mb];W[jg]
+C[L:3];B[la];W[mn]C[L:4];B[mp];W[kk]C[L:2];B[jk];W[ek];B[dl];W[ps]
+C[L:1];B[os];W[qs]C[L:0];B[or];W[rp];B[rq];W[rr];B[ro];W[sq];B[so]
+;W[qo];B[rn];W[rm];B[qm];W[pm];B[ql];W[sm];B[rl];W[sp];B[oe];W[ej]
+;B[el];W[rd]C[L:1];B[qd];W[rc]C[L:2];B[qe];W[re]C[L:3];B[pf];W[nf]
+C[L:4];B[of];W[qg]C[L:3];B[pg];W[bp]C[L:4];B[dn];W[eq]C[L:2];B[ep]
+;W[dq]C[L:3];B[co];W[cq]C[L:4];B[cm];W[hq]C[L:5];B[bm];W[ng];B[mf]
+;W[mg]C[L:4];B[lf];W[kf]C[L:3];B[ke];W[kg]C[L:4];B[kb];W[me];B[qh]
+;W[hh]C[L:5];B[rh];W[pb];B[ob];W[ir];B[iq];W[jr];B[kq];W[hk]C[L:6]
+;B[bo];W[kn];B[gg];W[nj];B[rf];W[oh];B[ph];W[qc];B[pa];W[qa]C[L:7]
+;B[oa];W[sb]C[L:8];B[ra];W[qb];B[sd];W[sf];B[rg];W[se]C[L:7];B[sg]
+;W[gh];B[fg];W[hn]C[L:8];B[hp];W[gq]C[L:6];B[ip];W[fn]C[L:7];B[en]
+;W[lr];B[mq];W[fl]C[L:8];B[fm];W[gm]C[L:9];B[em];W[eo];B[do];W[fo]
+;B[go];W[kr];B[mr];W[ms]C[L:10];B[ns];W[gn];B[ls];W[ce];B[ef];W[dg]
+;B[cd];W[be];B[bd];W[ad];B[ac];W[ae];B[bb];W[pl];B[pk];W[ok];B[pj]
+;W[sl];B[rj];W[sk];B[rk];W[oj];B[oi];W[ni];B[pi];W[bj];B[ci];W[bk]
+;B[bl];W[ak];B[al];W[gk];B[ks];W[og];B[js];W[is];B[ms];W[gp];B[ho]
+;W[lq];B[lp];W[hr];B[ko];W[in];B[jo];W[lo];B[mo];W[ln];B[jn];W[kp]
+;B[jm];W[io];B[jp];W[di];B[km];W[no];B[kl];W[il];B[im];W[jl];B[lk]
+;W[kj];B[lj];W[ki];B[lm];W[ml];B[mm];W[nn];B[nm];W[ll];B[om];W[sn]
+;B[sj];W[ol];B[fr];W[er];B[es];W[ds];B[fs];W[cp];B[hl];W[ik];B[gl]
+;W[hm];B[ap];W[aq];B[ao];W[eg];B[br];W[bq];B[fq];W[cr];B[bs];W[cs]
+;B[nl];W[mk];B[mh];W[lh];B[mi];W[nh];B[li];W[mj];B[hg];W[pc];B[];W[]
+C[final_score: W+115.5
+S19 removed
+C18 removed
+A16 removed
+T16 removed
+M14 removed
+K10 removed
+L8 removed
+C6 removed
+N5 removed
+F3 removed
+B2 removed]
+)
diff --git a/regression/games/atari_atari06.sgf b/regression/games/atari_atari06.sgf
new file mode 100644 (file)
index 0000000..eeb92ea
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[4.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[fa][la][ma][eb][fb][hb][kb][lb][rb][sb][dc][gc][ic][jc][kc][mc][nc][pc][qc][sc][cd][dd][ed][fd][hd][pd][rd][de][fe][ge][ke][le][qe][cf][gf][lf][of][pf][qf][fg][gg][hg][kg][lg][mg][ng][eh][ih][jh][kh][mh][qh][ci][gi][ji][li][mi][ej][gj][hj][mj][qj][rj][bk][gk][ik][mk][nk][ok][rk][sk][bl][cl][il][jl][kl][ol][sl][am][cm][em][hm][im][jm][lm][om][rm][sm][an][cn][dn][in][kn][ln][on][pn][qn][bo][eo][ho][io][jo][ko][mo][no][po][ap][cp][ep][fp][gp][hp][ip][mp][np][pp][bq][cq][eq][hq][lq][oq][pq][qq][ar][br][hr][or][os][ps][qs]AB[aa][ba][ca][da][ea][na][ra][cb][db][mb][ob][pb][qb][ac][cc][ec][lc][oc][bd][id][jd][kd][ld][md][nd][od][be][ce][ee][he][je][me][oe][pe][df][ef][ff][hf][jf][kf][mf][nf][dg][eg][ig][jg][dh][fh][gh][hh][oh][di][fi][hi][ii][ki][aj][bj][dj][ij][jj][kj][lj][oj][ak][ck][dk][hk][jk][lk][qk][al][dl][fl][gl][hl][ll][ml][nl][ql][rl][dm][gm][mm][qm][en][fn][gn][hn][mn][nn][rn][sn][co][do][fo][go][lo][qo][ro][dp][jp][kp][lp][qp][sp][dq][fq][gq][iq][mq][nq][rq][sq][cr][dr][er][gr][ir][lr][mr][nr][pr][qr][rr][bs][hs][ns][rs][ss]PL[B])
diff --git a/regression/games/atari_atari07.sgf b/regression/games/atari_atari07.sgf
new file mode 100644 (file)
index 0000000..9963a6f
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.17 load and print]
+DT[2003-04-16]
+KM[-0.5]AP[GNU Go:3.3.17]RU[Japanese]
+;AW[ba][ca][ja][ka][cb][db][eb][ib][jb][sb][fc][gc][ic][rc][sc]
+[hd][id][qd][rd][ie][je][ke][oe][pe][ef][gf][kf][mf][nf][qf][dg]
+[eg][fg][gg][hg][ig][ng][ch][dh][gh][jh][nh][di][hi][ji][ki][oi]
+[pi][qi][bj][cj][hj][kj][rj][ak][ck][hk][jk][rk][fl][hl][jl][ql]
+[rl][sl][dm][em][gm][im][jm][km][om][sm][cn][fn][jn][kn][ln][bo]
+[co][do][mo][gp][hp][kp][mp][np][op][cq][fq][gq][iq][kq][lq][nq]
+[pq][rq][br][cr][er][gr][ir][jr][or][pr][qr][rr][bs][ds][es][fs]
+[rs]
+AB[aa][la][ra][ab][bb][kb][lb][pb][rb][ac][cc][dc][ec][jc][qc]
+[bd][dd][fd][gd][jd][kd][ld][nd][od][pd][ae][ce][ee][fe][ge][he]
+[le][me][ne][bf][df][ff][hf][if][jf][lf][bg][cg][jg][kg][lg][mg]
+[bh][eh][fh][hh][kh][mh][ai][bi][ci][fi][gi][li][ni][aj][dj][fj]
+[jj][lj][oj][pj][qj][gk][kk][mk][qk][gl][kl][ll][pl][lm][nm][pm]
+[qm][rm][dn][en][in][mn][pn][sn][eo][fo][go][ho][io][jo][ko][lo]
+[no][oo][bp][cp][dp][ep][fp][ip][jp][pp][qp][rp][sp][bq][dq][eq]
+[hq][jq][qq][sq][ar][dr][kr][sr]
+PL[B])
diff --git a/regression/games/atari_atari08.sgf b/regression/games/atari_atari08.sgf
new file mode 100644 (file)
index 0000000..5b1380a
--- /dev/null
@@ -0,0 +1,273 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[2]KM[5.5]RE[B+18.5]
+PW[GNU Go 3.3.23 (random seed 236242294)]PB[GNU Go 3.2 (random seed 0)]
+AB[pd][dp]PL[W]
+;W[ed]
+;B[pp]
+;W[nc]
+;B[cd]
+;W[jp]
+;B[df]
+;W[ch]
+;B[lc]
+;W[qn]
+;B[nd]
+;W[mc]
+;B[pn]
+;W[pm]
+;B[on]
+;W[qo]
+;B[qp]
+;W[qj]
+;B[np]
+;W[qf]
+;B[hq]
+;W[cn]
+;B[dn]
+;W[dm]
+;B[en]
+;W[co]
+;B[cp]
+;W[cl]
+;B[fp]
+;W[gc]
+;B[cg]
+;W[dh]
+;B[ic]
+;W[fl]
+;B[ff]
+;W[gh]
+;B[of]
+;W[ph]
+;B[dc]
+;W[hd]
+;B[om]
+;W[pl]
+;B[nk]
+;W[lp]
+;B[io]
+;W[mq]
+;B[nq]
+;W[lb]
+;B[ld]
+;W[pb]
+;B[jr]
+;W[kr]
+;B[kq]
+;W[lr]
+;B[jq]
+;W[nr]
+;B[or]
+;W[kp]
+;B[ns]
+;W[mr]
+;B[ip]
+;W[kn]
+;B[jm]
+;W[qd]
+;B[il]
+;W[qc]
+;B[bo]
+;W[bn]
+;B[bp]
+;W[hj]
+;B[kb]
+;W[jj]
+;B[mb]
+;W[rp]
+;B[rq]
+;W[lk]
+;B[md]
+;W[km]
+;B[oc]
+;W[bg]
+;B[bf]
+;W[bh]
+;B[ro]
+;W[rn]
+;B[sp]
+;W[jg]
+;B[ec]
+;W[ee]
+;B[ef]
+;W[ge]
+;B[lf]
+;W[hf]
+;B[sn]
+;W[af]
+;B[ae]
+;W[ag]
+;B[sl]
+;W[be]
+;B[cf]
+;W[rk]
+;B[bd]
+;W[ad]
+;B[bb]
+;W[ab]
+;B[fb]
+;W[gb]
+;B[ba]
+;W[ib]
+;B[db]
+;W[jc]
+;B[rl]
+;W[ql]
+;B[ie]
+;W[ke]
+;B[kf]
+;W[je]
+;B[lh]
+;W[ob]
+;B[nb]
+;W[js]
+;B[is]
+;W[ks]
+;B[hr]
+;W[pe]
+;B[oe]
+;W[mo]
+;B[jb]
+;W[id]
+;B[ia]
+;W[hb]
+;B[mm]
+;W[ok]
+;B[kl]
+;W[ms]
+;B[lm]
+;W[ln]
+;B[os]
+;W[nj]
+;B[ll]
+;W[mk]
+;B[gm]
+;W[nl]
+;B[fm]
+;W[gl]
+;B[nm]
+;W[ng]
+;B[og]
+;W[nh]
+;B[le]
+;W[li]
+;B[kh]
+;W[jh]
+;B[ki]
+;W[mi]
+;B[kj]
+;W[na]
+;B[pc]
+;W[ce]
+;B[de]
+;W[ae]
+;B[dd]
+;W[oa]
+;B[fh]
+;W[fi]
+;B[eh]
+;W[ei]
+;B[gg]
+;W[hg]
+;B[dg]
+;W[em]
+;B[an]
+;W[am]
+;B[ao]
+;W[gf]
+;B[bm]
+;W[bl]
+;B[al]
+;W[ak]
+;B[am]
+;W[cm]
+;B[fg]
+;W[nf]
+;B[kk]
+;W[pf]
+;B[ma]
+;W[nc]
+;B[od]
+;W[qb]
+;B[hk]
+;W[gk]
+;B[ji]
+;W[ii]
+;B[ik]
+;W[ij]
+;B[fe]
+;W[fd]
+;B[fc]
+;W[gd]
+;B[pg]
+;W[qg]
+;B[oh]
+;W[oi]
+;B[sk]
+;W[sj]
+;B[sm]
+;W[hl]
+;B[po]
+;W[qm]
+;B[hm]
+;W[jn]
+;B[in]
+;W[mn]
+;B[mp]
+;W[lq]
+;B[jo]
+;W[ko]
+;B[jf]
+;W[if]
+;B[bc]
+;W[ac]
+;B[jk]
+;W[kd]
+;B[kg]
+;W[mh]
+;B[no]
+;W[do]
+;B[eo]
+;W[pj]
+;B[ih]
+;W[hh]
+;B[bk]
+;W[ig]
+;B[bj]
+;W[bi]
+;B[dj]
+;W[di]
+;B[ek]
+;W[el]
+;B[dk]
+;W[ai]
+;B[aj]
+;W[lj]
+;B[fa]
+;W[ol]
+;B[ha]
+;W[ga]
+;B[ja]
+;W[ck]
+;B[cj]
+;W[gj]
+;B[fj]
+;W[ej]
+;B[fk]
+;W[nn]
+;B[kc]
+;W[jd]
+;B[ml]
+;W[rm]
+;B[so]
+;W[ne]
+;B[ci]
+;W[dl]
+;B[ak]
+;W[aa]
+;B[me]
+;W[mg]
+;B[mf]
+;W[lg]
+;B[]
+;W[]
+)
diff --git a/regression/games/atari_atari09.sgf b/regression/games/atari_atari09.sgf
new file mode 100644 (file)
index 0000000..56e7d8c
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.4 load and print]
+DT[2003-08-11]
+KM[0.0]AP[GNU Go:3.4]RU[Japanese]
+;AW[da][ea][fa][fb][ec][fc][gc][jc][mc][nc][qc][dd][fd][hd][id]
+[jd][kd][md][od][ce][de][le][me][oe][pe][cf][nf][pf][qf][dg][lg]
+[mg][og][rg][dh][kh][ph][sh][di][fi][gi][li][mi][qi][ri][cj][dj]
+[ej][gj][hj][kj][mj][oj][rj][ak][bk][ck][fk][ik][kk][lk][ok][rk]
+[cl][dl][hl][jl][kl][ol][rl][cm][hm][jm][mm][om][rm][sm][cn][fn]
+[hn][in][kn][on][sn][co][eo][fo][io][no][dp][fp][mp][np][op][dq]
+[fq][lq][nq][sq][er][gr][kr][lr][mr][or][qr][rr][sr][es][fs][gs]
+[js][ls][ps]
+AB[ca][ga][ka][cb][db][eb][gb][hb][jb][lb][mb][nb][bc][dc][hc]
+[ic][kc][lc][oc][pc][bd][cd][ld][nd][pd][rd][be][qe][re][se][bf]
+[rf][cg][ng][sg][ch][lh][mh][nh][bi][ci][ni][oi][pi][aj][bj][nj]
+[pj][qj][ek][gk][hk][mk][pk][al][bl][el][gl][ll][ml][pl][bm][dm]
+[em][fm][gm][km][lm][pm][qm][bn][dn][en][gn][jn][ln][mn][nn][pn]
+[rn][bo][do][go][ho][jo][mo][oo][po][ro][so][cp][gp][ip][kp][lp]
+[pp][sp][cq][gq][jq][kq][oq][pq][qq][rq][cr][dr][hr][jr][pr][ds]
+[hs][is]
+PL[B]IL[ne][of][fj][lj][mq][fr])
diff --git a/regression/games/atari_atari10.sgf b/regression/games/atari_atari10.sgf
new file mode 100644 (file)
index 0000000..9dc34e3
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.1 load and print]
+DT[2005-01-07]
+KM[2.5]RU[Japanese]AP[GNU Go:3.7.1]AW[ea][oa][eb][nb][ob][pb]
+[ac][dc][fc][jc][kc][lc][mc][nc][pc][ad][bd][cd][dd][ed][id][kd]
+[nd][ae][ce][fe][ge][he][me][ne][pe][af][hf][nf][of][pf][qf][ag]
+[bg][lg][mg][ah][mh][nh][oh][rh][ii][ki][mi][ri][si][jj][kj][lj]
+[mj][qj][sj][ik][jk][mk][nk][qk][rk][jl][nl][pl][im][km][lm][mm]
+[pm][rm][an][kn][mn][nn][on][pn][qn][rn][sn][ao][bo][co][eo][fo]
+[go][mo][no][oo][ro][cp][fp][hp][dq][eq][fq][gq][hq][iq][nq][pq]
+[qq][rq][ir][jr][kr][mr][nr][or][pr][rr][js][ms][qs][rs][ss]
+AB[ba][ca][da][pa][qa][ab][bb][db][qb][bc][cc][oc][qc][jd][ld]
+[md][od][pd][qd][rd][be][de][ee][ie][je][ke][le][oe][qe][bf][cf]
+[ef][ff][gf][if][jf][kf][lf][mf][rf][cg][hg][kg][ng][og][pg][qg]
+[rg][sg][bh][hh][ih][jh][kh][lh][ph][qh][sh][ai][bi][ji][li][ni]
+[oi][qi][dj][hj][ij][nj][pj][hk][ok][pk][bl][hl][il][ol][ql][am]
+[jm][nm][om][bn][cn][dn][en][fn][gn][jn][ln][do][ho][io][ko][lo]
+[po][qo][so][dp][ep][ip][kp][lp][mp][np][op][pp][qp][rp][sp][jq]
+[kq][lq][mq][oq][sq][lr][sr][ks][ls]
+PL[W]
+)
diff --git a/regression/games/auto_gen/auto001.sgf b/regression/games/auto_gen/auto001.sgf
new file mode 100644 (file)
index 0000000..d1d196d
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Japanese]GC[move 135 P11, 140 R16
+]SZ[19]HA[0]KM[5.5];B[pd];W[dp];
+B[pp];W[dd];B[fc];W[df];B[id];W[md];B[pf];W[nq];B[fq];W[hq];B[cq];
+W[cp];B[dq];W[ep];B[eq];W[go];B[np];W[mp];B[no];W[oq];B[pq];W[jq];
+B[pn];W[ql];B[qn];W[dl];B[ff];W[fh];B[cc];W[cd];B[dc];W[qi];B[oc];
+W[eg];B[hh];W[hj];B[jj];W[gi];B[ii];W[kd];B[ol];W[hn];B[gg];W[oi];
+B[kf];W[jc];B[je];W[mf];B[ic];W[jl];B[ll];W[mi];B[ed];W[lh];B[kk];
+W[ln];B[lm];W[mo];B[jd];W[jb];B[ib];W[lb];B[ke];W[ld];B[le];W[ia];
+B[me];W[nb];B[mg];W[ph];B[pj];W[ok];B[nl];W[nk];B[pk];W[qh];B[rk];
+W[rf];B[rd];W[ri];B[nf];W[ci];B[lf];W[ob];B[nc];W[pb];B[mc];W[mb];
+B[lc];W[kc];B[pc];W[nd];B[od];W[ne];B[oe];W[re];B[ef];W[rj];B[rl];
+W[oj];B[dg];W[cf];B[eh];W[ei];B[fg];W[ch];B[qj];W[qe];B[rc];W[qd];
+B[qc];W[qb];B[rb];W[pe];B[qf];W[rg];B[cg];W[bg];B[lg];W[pg];B[of];
+W[og];B[nh];W[mk];B[ng];W[qg];B[dh];W[di];B[eg];W[gh];B[mh];W[li];
+B[oh];W[pi];B[sh];W[hi];B[ji];W[ni];B[ki];W[kh];B[jh];W[kg];B[jg];
+W[ij];B[jk];W[lj];B[kj];W[ik];B[lk];W[jm];B[kl];W[ml];B[mm];W[km];
+B[mn];W[ko];B[fp];W[fo];B[gp];W[hp];B[op];W[gq];B[tt];W[tt]
+)
diff --git a/regression/games/auto_gen/auto002.sgf b/regression/games/auto_gen/auto002.sgf
new file mode 100644 (file)
index 0000000..3d4f038
--- /dev/null
@@ -0,0 +1,218 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dd]
+;B[dp]
+;W[qp]
+;B[op]
+;W[lp]
+;B[on]
+;W[qn]
+;B[ol]
+;W[ql]
+;B[ip]
+;W[cn]
+;B[cf]
+;W[nc]
+;B[lc]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[od]
+;W[rc]
+;B[nd]
+;W[nb]
+;B[le]
+;W[qi]
+;B[fq]
+;W[bp]
+;B[cq]
+;W[ck]
+;B[ci]
+;W[fd]
+;B[hc]
+;W[fc]
+;B[bq]
+;W[qf]
+;B[bo]
+;W[dn]
+;B[cc]
+;W[ef]
+;B[cd]
+;W[he]
+;B[fn]
+;W[je]
+;B[kc]
+;W[jd]
+;B[jc]
+;W[rd]
+;B[ek]
+;W[dj]
+;B[gk]
+;W[gi]
+;B[ii]
+;W[ei]
+;B[hj]
+;W[dg]
+;B[cg]
+;W[oj]
+;B[pp]
+;W[jq]
+;B[iq]
+;W[ln]
+;B[en]
+;W[lr]
+;B[nn]
+;W[di]
+;B[nr]
+;W[ig]
+;B[of]
+;W[oh]
+;B[de]
+;W[dc]
+;B[kg]
+;W[ll]
+;B[qq]
+;W[rp]
+;B[mg]
+;W[kl]
+;B[il]
+;W[mi]
+;B[ki]
+;W[mk]
+;B[rq]
+;W[sq]
+;B[cp]
+;W[gc]
+;B[mc]
+;W[mb]
+;B[lb]
+;W[ma]
+;B[la]
+;W[oc]
+;B[hd]
+;W[gd]
+;B[id]
+;W[ie]
+;B[hb]
+;W[gb]
+;B[kd]
+;W[ha]
+;B[ee]
+;W[ed]
+;B[fe]
+;W[hh]
+;B[ge]
+;W[eb]
+;B[cb]
+;W[fa]
+;B[db]
+;W[ke]
+;B[da]
+;W[ea]
+;B[qe]
+;W[re]
+;B[df]
+;W[eg]
+;B[ff]
+;W[kf]
+;B[lf]
+;W[pf]
+;B[pe]
+;W[fg]
+;B[jg]
+;W[jf]
+;B[og]
+;W[pg]
+;B[ih]
+;W[hf]
+;B[gf]
+;W[gg]
+;B[mh]
+;W[nh]
+;B[ng]
+;W[hi]
+;B[li]
+;W[cj]
+;B[bi]
+;W[bj]
+;B[ej]
+;W[ai]
+;B[bh]
+;W[ah]
+;B[fj]
+;W[dh]
+;B[ch]
+;W[fi]
+;B[gj]
+;W[dk]
+;B[jl]
+;W[ok]
+;B[nl]
+;W[nk]
+;B[ml]
+;W[lj]
+;B[kj]
+;W[kk]
+;B[jk]
+;W[pl]
+;B[bn]
+;W[pm]
+;B[co]
+;W[om]
+;B[lm]
+;W[km]
+;B[mm]
+;W[rr]
+;B[qr]
+;W[ir]
+;B[jm]
+;W[kn]
+;B[jn]
+;W[do]
+;B[eo]
+;W[cm]
+;B[bm]
+;W[cl]
+;B[bl]
+;W[bk]
+;B[el]
+;W[dl]
+;B[em]
+;W[dm]
+;B[jp]
+;W[hr]
+;B[kp]
+;W[kq]
+;B[ko]
+;W[fr]
+;B[lo]
+;W[gq]
+;B[mn]
+;W[gp]
+;B[lk]
+;W[mj]
+;B[fp]
+;W[nm]
+;B[mq]
+;W[lq]
+;B[pn]
+;W[go]
+;B[gn]
+;W[fo]
+;B[hp]
+;W[ho]
+;B[hn]
+;W[io]
+;B[in]
+;W[jo]
+;B[mp]
+;W[hq]
+;B[mr]
+;W[ls]
+;B[ms]
+;W[sr]
+;B[tt]
+;W[rs]
+;B[qs]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto003.sgf b/regression/games/auto_gen/auto003.sgf
new file mode 100644 (file)
index 0000000..634c74b
--- /dev/null
@@ -0,0 +1,140 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pp]
+;W[dd]
+;B[fc]
+;W[id]
+;B[cf]
+;W[ee]
+;B[db]
+;W[nq]
+;B[ci]
+;W[qf]
+;B[fq]
+;W[fp]
+;B[gp]
+;W[fo]
+;B[eq]
+;W[dq]
+;B[jq]
+;W[dn]
+;B[cl]
+;W[qi]
+;B[nc]
+;W[rd]
+;B[qc]
+;W[cn]
+;B[qn]
+;W[pr]
+;B[qq]
+;W[lq]
+;B[kc]
+;W[if]
+;B[cc]
+;W[ge]
+;B[qk]
+;W[ei]
+;B[ce]
+;W[el]
+;B[rc]
+;W[rk]
+;B[rj]
+;W[qj]
+;B[ri]
+;W[ql]
+;B[pk]
+;W[rl]
+;B[qh]
+;W[oj]
+;B[pl]
+;W[ph]
+;B[pi]
+;W[pj]
+;B[rh]
+;W[pm]
+;B[pg]
+;W[ok]
+;B[qr]
+;W[oh]
+;B[pf]
+;W[ke]
+;B[or]
+;W[ne]
+;B[qe]
+;W[jo]
+;B[hp]
+;W[kp]
+;B[ir]
+;W[md]
+;B[mc]
+;W[fk]
+;B[ld]
+;W[le]
+;B[pq]
+;W[ng]
+;B[dc]
+;W[ol]
+;B[cd]
+;W[ni]
+;B[kd]
+;W[jd]
+;B[jc]
+;W[ic]
+;B[nd]
+;W[me]
+;B[de]
+;W[ed]
+;B[ec]
+;W[fd]
+;B[gc]
+;W[hc]
+;B[gd]
+;W[ff]
+;B[hd]
+;W[he]
+;B[of]
+;W[oe]
+;B[od]
+;W[pe]
+;B[qd]
+;W[nf]
+;B[rf]
+;W[og]
+;B[qg]
+;W[di]
+;B[cj]
+;W[dj]
+;B[dl]
+;W[dk]
+;B[bm]
+;W[ck]
+;B[bk]
+;W[cm]
+;B[dm]
+;W[em]
+;B[bl]
+;W[qm]
+;B[bn]
+;W[pn]
+;B[rn]
+;W[rm]
+;B[sn]
+;W[sm]
+;B[qo]
+;W[go]
+;B[ho]
+;W[io]
+;B[po]
+;W[hn]
+;B[ep]
+;W[eo]
+;B[ip]
+;W[jp]
+;B[kq]
+;W[mo]
+;B[oq]
+;W[nr]
+;B[ns]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto004.sgf b/regression/games/auto_gen/auto004.sgf
new file mode 100644 (file)
index 0000000..f7933e0
--- /dev/null
@@ -0,0 +1,131 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pp]
+;W[dc]
+;B[fq]
+;W[jp]
+;B[de]
+;W[eq]
+;B[fp]
+;W[dn]
+;B[cc]
+;W[cb]
+;B[cd]
+;W[eb]
+;B[ci]
+;W[fd]
+;B[cl]
+;W[cn]
+;B[lq]
+;W[jn]
+;B[pj]
+;W[qf]
+;B[qe]
+;W[pf]
+;B[nd]
+;W[lc]
+;B[nc]
+;W[ic]
+;B[qn]
+;W[qq]
+;B[pq]
+;W[qp]
+;B[qo]
+;W[pr]
+;B[or]
+;W[ro]
+;B[ff]
+;W[qr]
+;B[nq]
+;W[rn]
+;B[qm]
+;W[lo]
+;B[no]
+;W[el]
+;B[ej]
+;W[eo]
+;B[hp]
+;W[hf]
+;B[jq]
+;W[gj]
+;B[gh]
+;W[hn]
+;B[mc]
+;W[lb]
+;B[mb]
+;W[fk]
+;B[la]
+;W[ph]
+;B[dd]
+;W[nj]
+;B[nl]
+;W[oi]
+;B[ed]
+;W[ll]
+;B[ec]
+;W[mk]
+;B[fb]
+;W[ih]
+;B[gd]
+;W[nf]
+;B[ne]
+;W[hh]
+;B[pe]
+;W[hd]
+;B[ge]
+;W[gi]
+;B[fh]
+;W[mn]
+;B[fc]
+;W[ml]
+;B[he]
+;W[ie]
+;B[gf]
+;W[jg]
+;B[fi]
+;W[gg]
+;B[fg]
+;W[hg]
+;B[pi]
+;W[fj]
+;B[oj]
+;W[ni]
+;B[ek]
+;W[nk]
+;B[ok]
+;W[dl]
+;B[dk]
+;W[cm]
+;B[bl]
+;W[bm]
+;B[nm]
+;W[al]
+;B[bk]
+;W[nn]
+;B[on]
+;W[ak]
+;B[pm]
+;W[mm]
+;B[rm]
+;W[sn]
+;B[sm]
+;W[sp]
+;B[fo]
+;W[fn]
+;B[ho]
+;W[mo]
+;B[io]
+;W[in]
+;B[jo]
+;W[kp]
+;B[iq]
+;W[lp]
+;B[kq]
+;W[ko]
+;B[ep]
+;W[er]
+;B[ip]
+;W[fr]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto005.sgf b/regression/games/auto_gen/auto005.sgf
new file mode 100644 (file)
index 0000000..5d1571e
--- /dev/null
@@ -0,0 +1,195 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dd]
+;B[pq]
+;W[dq]
+;B[do]
+;W[dl]
+;B[gp]
+;W[eo]
+;B[en]
+;W[fo]
+;B[dp]
+;W[ep]
+;B[cq]
+;W[eq]
+;B[cn]
+;W[cr]
+;B[bq]
+;W[qo]
+;B[op]
+;W[pm]
+;B[qp]
+;W[po]
+;B[fc]
+;W[nd]
+;B[pf]
+;W[jd]
+;B[qk]
+;W[ec]
+;B[fd]
+;W[df]
+;B[ok]
+;W[pc]
+;B[qc]
+;W[oc]
+;B[qb]
+;W[kq]
+;B[nf]
+;W[ld]
+;B[bl]
+;W[ci]
+;B[ff]
+;W[lf]
+;B[lh]
+;W[mp]
+;B[ro]
+;W[nm]
+;B[nq]
+;W[mr]
+;B[mg]
+;W[mk]
+;B[iq]
+;W[qi]
+;B[oi]
+;W[mn]
+;B[io]
+;W[jp]
+;B[ho]
+;W[dj]
+;B[hd]
+;W[br]
+;B[jf]
+;W[aq]
+;B[ie]
+;W[fh]
+;B[kg]
+;W[kk]
+;B[hh]
+;W[hj]
+;B[pb]
+;W[lb]
+;B[ob]
+;W[ik]
+;B[gn]
+;W[gi]
+;B[fn]
+;W[hr]
+;B[ir]
+;W[gq]
+;B[hq]
+;W[gr]
+;B[kn]
+;W[lo]
+;B[im]
+;W[dm]
+;B[dn]
+;W[ed]
+;B[id]
+;W[od]
+;B[oe]
+;W[jc]
+;B[qe]
+;W[rk]
+;B[rl]
+;W[rj]
+;B[rn]
+;W[ql]
+;B[qm]
+;W[pl]
+;B[qj]
+;W[rh]
+;B[ic]
+;W[oj]
+;B[nj]
+;W[pj]
+;B[nk]
+;W[pk]
+;B[je]
+;W[ib]
+;B[hb]
+;W[jb]
+;B[ke]
+;W[nb]
+;B[le]
+;W[mj]
+;B[mi]
+;W[lm]
+;B[mf]
+;W[kd]
+;B[ne]
+;W[md]
+;B[me]
+;W[ee]
+;B[fe]
+;W[ef]
+;B[fg]
+;W[eg]
+;B[gh]
+;W[gj]
+;B[hi]
+;W[pi]
+;B[ii]
+;W[ij]
+;B[cl]
+;W[il]
+;B[nl]
+;W[ml]
+;B[ol]
+;W[cm]
+;B[bm]
+;W[em]
+;B[fm]
+;W[el]
+;B[ck]
+;W[cj]
+;B[dk]
+;W[ek]
+;B[fl]
+;W[bj]
+;B[bo]
+;W[bk]
+;B[fk]
+;W[ej]
+;B[fj]
+;W[fi]
+;B[gk]
+;W[hk]
+;B[km]
+;W[jl]
+;B[kl]
+;W[ll]
+;B[jm]
+;W[om]
+;B[ni]
+;W[ln]
+;B[qn]
+;W[oo]
+;B[pn]
+;W[np]
+;B[nr]
+;W[pp]
+;B[oq]
+;W[kr]
+;B[on]
+;W[no]
+;B[nn]
+;W[go]
+;B[jo]
+;W[ko]
+;B[fp]
+;W[ip]
+;B[hp]
+;W[fq]
+;B[jq]
+;W[kp]
+;B[mq]
+;W[ms]
+;B[lq]
+;W[lp]
+;B[jr]
+;W[lr]
+;B[qq]
+;W[ns]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto006.sgf b/regression/games/auto_gen/auto006.sgf
new file mode 100644 (file)
index 0000000..b365c52
--- /dev/null
@@ -0,0 +1,224 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dd]
+;B[pp]
+;W[dq]
+;B[do]
+;W[dl]
+;B[gp]
+;W[eo]
+;B[en]
+;W[fo]
+;B[dp]
+;W[ep]
+;B[cq]
+;W[eq]
+;B[cn]
+;W[cr]
+;B[bq]
+;W[qf]
+;B[cf]
+;W[qi]
+;B[nd]
+;W[np]
+;B[pn]
+;W[jp]
+;B[ci]
+;W[pq]
+;B[qq]
+;W[oq]
+;B[qr]
+;W[fl]
+;B[fc]
+;W[ee]
+;B[cc]
+;W[cd]
+;B[dc]
+;W[ge]
+;B[ed]
+;W[de]
+;B[bd]
+;W[be]
+;B[bc]
+;W[ce]
+;B[qk]
+;W[lc]
+;B[nf]
+;W[ic]
+;B[nc]
+;W[ei]
+;B[dg]
+;W[nn]
+;B[nl]
+;W[ll]
+;B[lj]
+;W[mm]
+;B[le]
+;W[jj]
+;B[jh]
+;W[oi]
+;B[ie]
+;W[rd]
+;B[ki]
+;W[qc]
+;B[mk]
+;W[gb]
+;B[pc]
+;W[gc]
+;B[fb]
+;W[fd]
+;B[ec]
+;W[gg]
+;B[bj]
+;W[fh]
+;B[ga]
+;W[fn]
+;B[hd]
+;W[gd]
+;B[hc]
+;W[hb]
+;B[ha]
+;W[em]
+;B[ib]
+;W[kk]
+;B[dn]
+;W[br]
+;B[bl]
+;W[aq]
+;B[jc]
+;W[rk]
+;B[rj]
+;W[qj]
+;B[ri]
+;W[rl]
+;B[qh]
+;W[ph]
+;B[ql]
+;W[rm]
+;B[rh]
+;W[pg]
+;B[sk]
+;W[pb]
+;B[ia]
+;W[rb]
+;B[qd]
+;W[ob]
+;B[mb]
+;W[nb]
+;B[lb]
+;W[sc]
+;B[oc]
+;W[he]
+;B[id]
+;W[qe]
+;B[pe]
+;W[bf]
+;B[bg]
+;W[df]
+;B[cg]
+;W[ef]
+;B[pf]
+;W[rg]
+;B[ro]
+;W[qm]
+;B[pm]
+;W[pj]
+;B[ok]
+;W[qg]
+;B[eg]
+;W[fg]
+;B[eh]
+;W[gj]
+;B[di]
+;W[ii]
+;B[ih]
+;W[og]
+;B[of]
+;W[ng]
+;B[hh]
+;W[ej]
+;B[hg]
+;W[hf]
+;B[if]
+;W[gh]
+;B[hi]
+;W[hj]
+;B[gi]
+;W[fi]
+;B[ji]
+;W[ij]
+;B[dj]
+;W[ck]
+;B[cj]
+;W[bk]
+;B[ap]
+;W[ar]
+;B[bo]
+;W[bm]
+;B[ak]
+;W[cl]
+;B[al]
+;W[am]
+;B[cp]
+;W[aj]
+;B[ai]
+;W[ak]
+;B[bh]
+;W[kj]
+;B[lh]
+;W[mg]
+;B[mf]
+;W[lg]
+;B[lf]
+;W[kg]
+;B[kf]
+;W[jg]
+;B[ig]
+;W[jf]
+;B[je]
+;W[kh]
+;B[mh]
+;W[nh]
+;B[oj]
+;W[dk]
+;B[lk]
+;W[ml]
+;B[pk]
+;W[pi]
+;B[cm]
+;W[dm]
+;B[nm]
+;W[lo]
+;B[bn]
+;W[kl]
+;B[an]
+;W[on]
+;B[om]
+;W[qn]
+;B[qo]
+;W[sj]
+;B[rn]
+;W[sl]
+;B[sn]
+;W[si]
+;B[sm]
+;W[sh]
+;B[op]
+;W[pr]
+;B[nq]
+;W[nr]
+;B[no]
+;W[mq]
+;B[mo]
+;W[mn]
+;B[mp]
+;W[oo]
+;B[nq]
+;W[lp]
+;B[np]
+;W[ps]
+;B[po]
+;W[mr]
+;B[qs]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto007.sgf b/regression/games/auto_gen/auto007.sgf
new file mode 100644 (file)
index 0000000..a835cd4
--- /dev/null
@@ -0,0 +1,179 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[qd]
+;W[pp]
+;B[dc]
+;W[dp]
+;B[cf]
+;W[od]
+;B[ld]
+;W[pg]
+;B[oe]
+;W[ne]
+;B[of]
+;W[pd]
+;B[qf]
+;W[qc]
+;B[qe]
+;W[nc]
+;B[rc]
+;W[qb]
+;B[qj]
+;W[jc]
+;B[lf]
+;W[gc]
+;B[cn]
+;W[dn]
+;B[dm]
+;W[en]
+;B[co]
+;W[cp]
+;B[cj]
+;W[fp]
+;B[nq]
+;W[lq]
+;B[qq]
+;W[pn]
+;B[hq]
+;W[qp]
+;B[pq]
+;W[fq]
+;B[ho]
+;W[hm]
+;B[nf]
+;W[oj]
+;B[me]
+;W[pi]
+;B[qi]
+;W[fm]
+;B[qg]
+;W[ej]
+;B[dj]
+;W[ek]
+;B[gr]
+;W[ql]
+;B[ir]
+;W[nd]
+;B[er]
+;W[cr]
+;B[jo]
+;W[lo]
+;B[no]
+;W[lr]
+;B[rb]
+;W[lb]
+;B[qa]
+;W[jf]
+;B[jm]
+;W[lm]
+;B[rp]
+;W[mn]
+;B[fr]
+;W[ke]
+;B[hs]
+;W[ef]
+;B[df]
+;W[nn]
+;B[kn]
+;W[pk]
+;B[lc]
+;W[mb]
+;B[kc]
+;W[kb]
+;B[mc]
+;W[cm]
+;B[bm]
+;W[cl]
+;B[bl]
+;W[ck]
+;B[bk]
+;W[dk]
+;B[kd]
+;W[jd]
+;B[le]
+;W[lh]
+;B[md]
+;W[pa]
+;B[ra]
+;W[ob]
+;B[pe]
+;W[jk]
+;B[kf]
+;W[je]
+;B[pf]
+;W[oh]
+;B[lg]
+;W[kl]
+;B[og]
+;W[ph]
+;B[qh]
+;W[mh]
+;B[mg]
+;W[nh]
+;B[ng]
+;W[il]
+;B[pj]
+;W[in]
+;B[io]
+;W[jn]
+;B[ko]
+;W[kp]
+;B[km]
+;W[kj]
+;B[qk]
+;W[rl]
+;B[rk]
+;W[jl]
+;B[sl]
+;W[pl]
+;B[im]
+;W[hn]
+;B[ln]
+;W[mo]
+;B[oo]
+;W[on]
+;B[do]
+;W[eo]
+;B[go]
+;W[gn]
+;B[fo]
+;W[fn]
+;B[po]
+;W[qo]
+;B[op]
+;W[ro]
+;B[rq]
+;W[gp]
+;B[so]
+;W[rn]
+;B[sn]
+;W[rm]
+;B[sm]
+;W[hp]
+;B[ip]
+;W[jq]
+;B[iq]
+;W[jp]
+;B[eq]
+;W[ep]
+;B[dq]
+;W[bp]
+;B[ao]
+;W[bo]
+;B[bn]
+;W[ap]
+;B[an]
+;W[mp]
+;B[np]
+;W[cq]
+;B[gq]
+;W[mq]
+;B[dr]
+;W[jr]
+;B[cs]
+;W[js]
+;B[nr]
+;W[mr]
+;B[is]
+;W[ns]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto008.sgf b/regression/games/auto_gen/auto008.sgf
new file mode 100644 (file)
index 0000000..943e496
--- /dev/null
@@ -0,0 +1,247 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dd]
+;B[pq]
+;W[dp]
+;B[qo]
+;W[jp]
+;B[cn]
+;W[cl]
+;B[cq]
+;W[dq]
+;B[cp]
+;W[do]
+;B[co]
+;W[em]
+;B[cf]
+;W[nc]
+;B[ci]
+;W[kc]
+;B[gd]
+;W[qf]
+;B[oe]
+;W[qc]
+;B[pc]
+;W[qd]
+;B[og]
+;W[pe]
+;B[od]
+;W[pb]
+;B[ob]
+;W[qb]
+;B[oc]
+;W[mq]
+;B[qh]
+;W[qj]
+;B[nh]
+;W[qm]
+;B[oj]
+;W[md]
+;B[mo]
+;W[ro]
+;B[qp]
+;W[om]
+;B[rn]
+;W[rm]
+;B[qn]
+;W[ke]
+;B[sn]
+;W[lh]
+;B[mm]
+;W[nl]
+;B[jn]
+;W[fl]
+;B[hl]
+;W[pk]
+;B[ic]
+;W[hn]
+;B[cc]
+;W[io]
+;B[dc]
+;W[ie]
+;B[mj]
+;W[rh]
+;B[ml]
+;W[qg]
+;B[im]
+;W[gf]
+;B[ph]
+;W[ri]
+;B[ed]
+;W[ig]
+;B[ii]
+;W[kh]
+;B[ef]
+;W[mp]
+;B[mf]
+;W[eh]
+;B[gh]
+;W[fi]
+;B[gi]
+;W[gj]
+;B[hj]
+;W[gk]
+;B[hk]
+;W[nb]
+;B[na]
+;W[pa]
+;B[oa]
+;W[mb]
+;B[oo]
+;W[ma]
+;B[jc]
+;W[id]
+;B[dr]
+;W[er]
+;B[cr]
+;W[hd]
+;B[hc]
+;W[jd]
+;B[of]
+;W[kj]
+;B[kl]
+;W[jb]
+;B[gc]
+;W[ib]
+;B[hb]
+;W[ia]
+;B[ha]
+;W[kb]
+;B[nd]
+;W[ge]
+;B[me]
+;W[fe]
+;B[de]
+;W[fd]
+;B[fc]
+;W[ee]
+;B[ec]
+;W[le]
+;B[ff]
+;W[fh]
+;B[lf]
+;W[kf]
+;B[pf]
+;W[qe]
+;B[eg]
+;W[fg]
+;B[gg]
+;W[hg]
+;B[lg]
+;W[ih]
+;B[hi]
+;W[kg]
+;B[pg]
+;W[hh]
+;B[mh]
+;W[li]
+;B[di]
+;W[nk]
+;B[nj]
+;W[dh]
+;B[ch]
+;W[dg]
+;B[df]
+;W[cg]
+;B[bg]
+;W[bf]
+;B[cd]
+;W[bh]
+;B[ag]
+;W[af]
+;B[fj]
+;W[ah]
+;B[ej]
+;W[bg]
+;B[lj]
+;W[mi]
+;B[ji]
+;W[ki]
+;B[jh]
+;W[jg]
+;B[ni]
+;W[qi]
+;B[pi]
+;W[jj]
+;B[ij]
+;W[pj]
+;B[kk]
+;W[fk]
+;B[jk]
+;W[dj]
+;B[mk]
+;W[be]
+;B[bd]
+;W[ce]
+;B[dd]
+;W[ok]
+;B[ad]
+;W[ae]
+;B[cj]
+;W[aj]
+;B[gl]
+;W[ei]
+;B[cm]
+;W[gm]
+;B[dm]
+;W[dk]
+;B[dl]
+;W[bl]
+;B[el]
+;W[ek]
+;B[bm]
+;W[hm]
+;B[nm]
+;W[sm]
+;B[dn]
+;W[fm]
+;B[eq]
+;W[fq]
+;B[en]
+;W[ep]
+;B[fn]
+;W[go]
+;B[gn]
+;W[in]
+;B[jm]
+;W[on]
+;B[np]
+;W[nn]
+;B[ko]
+;W[no]
+;B[oq]
+;W[mn]
+;B[lo]
+;W[ln]
+;B[lm]
+;W[kn]
+;B[jo]
+;W[km]
+;B[pn]
+;W[pm]
+;B[eo]
+;W[fo]
+;B[kp]
+;W[kq]
+;B[jq]
+;W[kr]
+;B[ip]
+;W[nr]
+;B[or]
+;W[tt]
+;B[hp]
+;W[ho]
+;B[gp]
+;W[hr]
+;B[jr]
+;W[fp]
+;B[gq]
+;W[gr]
+;B[hq]
+;W[ir]
+;B[js]
+;W[iq]
+;B[jp]
+;W[is]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto009.sgf b/regression/games/auto_gen/auto009.sgf
new file mode 100644 (file)
index 0000000..3f18994
--- /dev/null
@@ -0,0 +1,193 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pq]
+;W[dd]
+;B[fq]
+;W[hq]
+;B[fo]
+;W[dn]
+;B[fm]
+;W[po]
+;B[pl]
+;W[mp]
+;B[oo]
+;W[on]
+;B[no]
+;W[pp]
+;B[nq]
+;W[nn]
+;B[mo]
+;W[qq]
+;B[oq]
+;W[rp]
+;B[lp]
+;W[nc]
+;B[cf]
+;W[fd]
+;B[bd]
+;W[cc]
+;B[ci]
+;W[jc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[oc]
+;B[pc]
+;W[dl]
+;B[pf]
+;W[je]
+;B[er]
+;W[ho]
+;B[qi]
+;W[eg]
+;B[ep]
+;W[gp]
+;B[ip]
+;W[hp]
+;B[iq]
+;W[hm]
+;B[op]
+;W[qm]
+;B[ql]
+;W[bc]
+;B[ce]
+;W[cr]
+;B[ac]
+;W[il]
+;B[fk]
+;W[ej]
+;B[gj]
+;W[gr]
+;B[gh]
+;W[gf]
+;B[dk]
+;W[di]
+;B[ij]
+;W[ek]
+;B[kj]
+;W[ck]
+;B[bi]
+;W[kh]
+;B[mh]
+;W[kl]
+;B[ml]
+;W[ir]
+;B[pm]
+;W[pn]
+;B[lr]
+;W[rm]
+;B[lk]
+;W[kg]
+;B[mm]
+;W[ih]
+;B[ki]
+;W[dj]
+;B[lm]
+;W[fr]
+;B[dq]
+;W[io]
+;B[jr]
+;W[hs]
+;B[kr]
+;W[cp]
+;B[dr]
+;W[cq]
+;B[eo]
+;W[cd]
+;B[af]
+;W[od]
+;B[cs]
+;W[de]
+;B[me]
+;W[mc]
+;B[oe]
+;W[df]
+;B[ag]
+;W[gg]
+;B[cg]
+;W[dg]
+;B[fh]
+;W[fg]
+;B[eh]
+;W[dh]
+;B[ch]
+;W[hh]
+;B[lh]
+;W[lg]
+;B[le]
+;W[ld]
+;B[ke]
+;W[kd]
+;B[kf]
+;W[jf]
+;B[lf]
+;W[mg]
+;B[om]
+;W[mf]
+;B[nf]
+;W[ng]
+;B[nh]
+;W[og]
+;B[qh]
+;W[of]
+;B[pe]
+;W[pg]
+;B[qg]
+;W[oh]
+;B[ph]
+;W[ei]
+;B[oi]
+;W[gi]
+;B[ii]
+;W[fj]
+;B[gk]
+;W[hi]
+;B[ik]
+;W[km]
+;B[cj]
+;W[hj]
+;B[hk]
+;W[bk]
+;B[bj]
+;W[kk]
+;B[ak]
+;W[jk]
+;B[jj]
+;W[jh]
+;B[ji]
+;W[hl]
+;B[gl]
+;W[el]
+;B[fl]
+;W[ll]
+;B[rl]
+;W[sl]
+;B[em]
+;W[dm]
+;B[gm]
+;W[nm]
+;B[nl]
+;W[en]
+;B[gn]
+;W[fn]
+;B[go]
+;W[hn]
+;B[mn]
+;W[kn]
+;B[ln]
+;W[do]
+;B[fp]
+;W[ko]
+;B[lo]
+;W[kp]
+;B[kq]
+;W[jp]
+;B[jq]
+;W[gq]
+;B[mj]
+;W[tt]
+;B[js]
+;W[is]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto010.sgf b/regression/games/auto_gen/auto010.sgf
new file mode 100644 (file)
index 0000000..1ca1842
--- /dev/null
@@ -0,0 +1,124 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dc]
+;B[pp]
+;W[dq]
+;B[pj]
+;W[nq]
+;B[lq]
+;W[qq]
+;B[qp]
+;W[pq]
+;B[op]
+;W[rq]
+;B[np]
+;W[nr]
+;B[lo]
+;W[pg]
+;B[nd]
+;W[do]
+;B[de]
+;W[fd]
+;B[cc]
+;W[cb]
+;B[cd]
+;W[eb]
+;B[ci]
+;W[lc]
+;B[nc]
+;W[ic]
+;B[cm]
+;W[co]
+;B[qm]
+;W[gq]
+;B[iq]
+;W[em]
+;B[ff]
+;W[qc]
+;B[qd]
+;W[rd]
+;B[ek]
+;W[hf]
+;B[hh]
+;W[jh]
+;B[jj]
+;W[nf]
+;B[pc]
+;W[qb]
+;B[mb]
+;W[ob]
+;B[gg]
+;W[nh]
+;B[ii]
+;W[lj]
+;B[ll]
+;W[mi]
+;B[go]
+;W[fo]
+;B[hp]
+;W[ji]
+;B[hk]
+;W[ig]
+;B[kk]
+;W[ld]
+;B[kb]
+;W[lb]
+;B[la]
+;W[nb]
+;B[na]
+;W[mc]
+;B[pb]
+;W[ma]
+;B[dd]
+;W[pa]
+;B[ed]
+;W[mb]
+;B[ec]
+;W[bc]
+;B[db]
+;W[bd]
+;B[da]
+;W[ab]
+;B[ba]
+;W[gd]
+;B[fb]
+;W[fc]
+;B[gl]
+;W[gb]
+;B[ea]
+;W[ga]
+;B[fa]
+;W[fe]
+;B[ee]
+;W[gf]
+;B[fg]
+;W[hg]
+;B[ih]
+;W[kj]
+;B[lk]
+;W[el]
+;B[fl]
+;W[dm]
+;B[cl]
+;W[dl]
+;B[dk]
+;W[fm]
+;B[gm]
+;W[cn]
+;B[gp]
+;W[fp]
+;B[rp]
+;W[sp]
+;B[hq]
+;W[gr]
+;B[mq]
+;W[oq]
+;B[hr]
+;W[mr]
+;B[gs]
+;W[fr]
+;B[lr]
+;W[fs]
+;B[hs]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto011.sgf b/regression/games/auto_gen/auto011.sgf
new file mode 100644 (file)
index 0000000..6e8dbc1
--- /dev/null
@@ -0,0 +1,136 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dc]
+;B[qp]
+;W[dp]
+;B[fq]
+;W[ip]
+;B[fo]
+;W[dn]
+;B[de]
+;W[dh]
+;B[fe]
+;W[fc]
+;B[he]
+;W[hc]
+;B[dk]
+;W[oq]
+;B[po]
+;W[lq]
+;B[np]
+;W[nq]
+;B[er]
+;W[nc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[oc]
+;B[pc]
+;W[jc]
+;B[pf]
+;W[qh]
+;B[qk]
+;W[oh]
+;B[qf]
+;W[fm]
+;B[mp]
+;W[ni]
+;B[nk]
+;W[cr]
+;B[fr]
+;W[qr]
+;B[dd]
+;W[dl]
+;B[fh]
+;W[cf]
+;B[gh]
+;W[je]
+;B[li]
+;W[mh]
+;B[ng]
+;W[mi]
+;B[jg]
+;W[fd]
+;B[kh]
+;W[ed]
+;B[df]
+;W[cg]
+;B[in]
+;W[hd]
+;B[gn]
+;W[od]
+;B[lg]
+;W[mj]
+;B[rg]
+;W[kf]
+;B[ki]
+;W[kg]
+;B[ii]
+;W[lh]
+;B[mf]
+;W[ce]
+;B[ol]
+;W[cd]
+;B[ee]
+;W[ie]
+;B[hf]
+;W[me]
+;B[lf]
+;W[le]
+;B[oe]
+;W[if]
+;B[jf]
+;W[ke]
+;B[dg]
+;W[ek]
+;B[ig]
+;W[ej]
+;B[eh]
+;W[ei]
+;B[fi]
+;W[ch]
+;B[fj]
+;W[fk]
+;B[gm]
+;W[fn]
+;B[gk]
+;W[io]
+;B[ho]
+;W[hp]
+;B[eo]
+;W[do]
+;B[en]
+;W[em]
+;B[ep]
+;W[gp]
+;B[go]
+;W[fp]
+;B[lp]
+;W[kq]
+;B[kp]
+;W[jp]
+;B[op]
+;W[dq]
+;B[eq]
+;W[gq]
+;B[mq]
+;W[mr]
+;B[qq]
+;W[rr]
+;B[pq]
+;W[or]
+;B[pr]
+;W[ps]
+;B[rq]
+;W[dr]
+;B[gr]
+;W[sr]
+;B[sq]
+;W[tt]
+;B[hr]
+;W[jr]
+;B[hq]
+;W[iq]
+;B[ir]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto012.sgf b/regression/games/auto_gen/auto012.sgf
new file mode 100644 (file)
index 0000000..15a1f82
--- /dev/null
@@ -0,0 +1,210 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dd]
+;B[pp]
+;W[dp]
+;B[fc]
+;W[df]
+;B[jd]
+;W[nq]
+;B[fq]
+;W[nc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[oc]
+;B[pc]
+;W[lc]
+;B[pf]
+;W[hq]
+;B[cq]
+;W[dq]
+;B[cp]
+;W[do]
+;B[dr]
+;W[er]
+;B[cr]
+;W[eq]
+;B[fp]
+;W[kq]
+;B[qn]
+;W[pr]
+;B[qq]
+;W[qh]
+;B[qf]
+;W[ql]
+;B[qr]
+;W[co]
+;B[bo]
+;W[fr]
+;B[fn]
+;W[ci]
+;B[em]
+;W[cl]
+;B[or]
+;W[ek]
+;B[ff]
+;W[nr]
+;B[pq]
+;W[fh]
+;B[cc]
+;W[cd]
+;B[dc]
+;W[hn]
+;B[no]
+;W[io]
+;B[hh]
+;W[hj]
+;B[ol]
+;W[pj]
+;B[ns]
+;W[dn]
+;B[jj]
+;W[bn]
+;B[ap]
+;W[jl]
+;B[ll]
+;W[ln]
+;B[lm]
+;W[ed]
+;B[gc]
+;W[ec]
+;B[eb]
+;W[fd]
+;B[jc]
+;W[pb]
+;B[ii]
+;W[qb]
+;B[kk]
+;W[rd]
+;B[nj]
+;W[oh]
+;B[mh]
+;W[rj]
+;B[mf]
+;W[rn]
+;B[rm]
+;W[qm]
+;B[ro]
+;W[pn]
+;B[qo]
+;W[nn]
+;B[mo]
+;W[mn]
+;B[oo]
+;W[rl]
+;B[sn]
+;W[pl]
+;B[gg]
+;W[on]
+;B[ps]
+;W[kn]
+;B[kc]
+;W[qc]
+;B[le]
+;W[gd]
+;B[ld]
+;W[lb]
+;B[kb]
+;W[od]
+;B[oe]
+;W[qd]
+;B[pe]
+;W[fe]
+;B[la]
+;W[mc]
+;B[me]
+;W[qe]
+;B[ef]
+;W[rf]
+;B[ee]
+;W[dg]
+;B[de]
+;W[ce]
+;B[eg]
+;W[fg]
+;B[eh]
+;W[fi]
+;B[he]
+;W[hd]
+;B[gb]
+;W[gf]
+;B[hf]
+;W[ge]
+;B[hc]
+;W[id]
+;B[ic]
+;W[ie]
+;B[je]
+;W[if]
+;B[hg]
+;W[jf]
+;B[ig]
+;W[kf]
+;B[ke]
+;W[lf]
+;B[jg]
+;W[kg]
+;B[pg]
+;W[og]
+;B[ph]
+;W[oi]
+;B[of]
+;W[pi]
+;B[qg]
+;W[rg]
+;B[gh]
+;W[ng]
+;B[mg]
+;W[nf]
+;B[lg]
+;W[kh]
+;B[li]
+;W[jh]
+;B[ih]
+;W[lh]
+;B[nh]
+;W[gi]
+;B[hi]
+;W[ij]
+;B[ji]
+;W[ki]
+;B[jk]
+;W[ik]
+;B[ni]
+;W[kj]
+;B[lj]
+;W[oj]
+;B[ok]
+;W[pk]
+;B[kl]
+;W[il]
+;B[km]
+;W[sl]
+;B[jm]
+;W[im]
+;B[mm]
+;W[nm]
+;B[nl]
+;W[om]
+;B[sm]
+;W[an]
+;B[bs]
+;W[jn]
+;B[ao]
+;W[lo]
+;B[po]
+;W[np]
+;B[mp]
+;W[ms]
+;B[os]
+;W[lr]
+;B[lp]
+;W[kp]
+;B[op]
+;W[lq]
+;B[mq]
+;W[mr]
+;B[oq]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto013.sgf b/regression/games/auto_gen/auto013.sgf
new file mode 100644 (file)
index 0000000..5c6a009
--- /dev/null
@@ -0,0 +1,146 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[qd]
+;W[pp]
+;B[cd]
+;W[dp]
+;B[oc]
+;W[ed]
+;B[hd]
+;W[ef]
+;B[cf]
+;W[eh]
+;B[ch]
+;W[kd]
+;B[qn]
+;W[ql]
+;B[qq]
+;W[pq]
+;B[qp]
+;W[po]
+;B[qr]
+;W[pn]
+;B[rn]
+;W[ol]
+;B[fq]
+;W[dn]
+;B[dr]
+;W[cq]
+;B[iq]
+;W[go]
+;B[ck]
+;W[qg]
+;B[lq]
+;W[og]
+;B[md]
+;W[ni]
+;B[io]
+;W[cr]
+;B[eq]
+;W[lo]
+;B[ej]
+;W[fc]
+;B[cs]
+;W[fi]
+;B[oe]
+;W[mf]
+;B[dd]
+;W[hf]
+;B[ld]
+;W[he]
+;B[ke]
+;W[lc]
+;B[jd]
+;W[kc]
+;B[jc]
+;W[im]
+;B[lb]
+;W[hn]
+;B[gd]
+;W[nq]
+;B[gc]
+;W[mp]
+;B[fd]
+;W[ec]
+;B[ee]
+;W[fe]
+;B[de]
+;W[eb]
+;B[gb]
+;W[ff]
+;B[db]
+;W[ge]
+;B[gg]
+;W[fg]
+;B[dg]
+;W[hh]
+;B[me]
+;W[ig]
+;B[df]
+;W[ie]
+;B[id]
+;W[je]
+;B[kf]
+;W[jf]
+;B[lf]
+;W[nf]
+;B[ne]
+;W[of]
+;B[eg]
+;W[dh]
+;B[ei]
+;W[di]
+;B[ci]
+;W[dj]
+;B[cl]
+;W[ek]
+;B[cj]
+;W[dl]
+;B[dk]
+;W[fj]
+;B[qm]
+;W[cm]
+;B[pm]
+;W[pl]
+;B[om]
+;W[rl]
+;B[rm]
+;W[in]
+;B[sl]
+;W[jo]
+;B[jp]
+;W[kp]
+;B[kq]
+;W[km]
+;B[on]
+;W[ln]
+;B[lp]
+;W[ko]
+;B[ho]
+;W[mo]
+;B[oo]
+;W[fk]
+;B[no]
+;W[qo]
+;B[ro]
+;W[pr]
+;B[ps]
+;W[ep]
+;B[fp]
+;W[gp]
+;B[hq]
+;W[fo]
+;B[hp]
+;W[np]
+;B[op]
+;W[mr]
+;B[dq]
+;W[gq]
+;B[gr]
+;W[mq]
+;B[oq]
+;W[or]
+;B[lr]
+;W[os]
+;B[qs]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto014.sgf b/regression/games/auto_gen/auto014.sgf
new file mode 100644 (file)
index 0000000..a120474
--- /dev/null
@@ -0,0 +1,186 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dd]
+;B[pp]
+;W[dp]
+;B[pj]
+;W[dj]
+;B[jd]
+;W[jp]
+;B[dm]
+;W[fp]
+;B[fd]
+;W[df]
+;B[dc]
+;W[cc]
+;B[ec]
+;W[cb]
+;B[lq]
+;W[md]
+;B[pf]
+;W[qn]
+;B[qo]
+;W[pn]
+;B[np]
+;W[co]
+;B[fm]
+;W[ff]
+;B[hd]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[fj]
+;W[nf]
+;B[ph]
+;W[pl]
+;B[ek]
+;W[nl]
+;B[hf]
+;W[ll]
+;B[jl]
+;W[fh]
+;B[nn]
+;W[kk]
+;B[nh]
+;W[od]
+;B[ki]
+;W[hh]
+;B[li]
+;W[ei]
+;B[jn]
+;W[hp]
+;B[io]
+;W[jq]
+;B[ln]
+;W[ro]
+;B[rp]
+;W[rn]
+;B[db]
+;W[jj]
+;B[hj]
+;W[ii]
+;B[ik]
+;W[nj]
+;B[ed]
+;W[de]
+;B[ee]
+;W[jf]
+;B[lg]
+;W[jh]
+;B[fe]
+;W[je]
+;B[ef]
+;W[eg]
+;B[gf]
+;W[fg]
+;B[if]
+;W[ke]
+;B[kd]
+;W[ld]
+;B[ie]
+;W[ic]
+;B[kb]
+;W[mb]
+;B[ca]
+;W[lb]
+;B[ka]
+;W[la]
+;B[lc]
+;W[mc]
+;B[id]
+;W[kc]
+;B[jc]
+;W[lc]
+;B[jb]
+;W[of]
+;B[lf]
+;W[le]
+;B[kf]
+;W[ig]
+;B[mf]
+;W[me]
+;B[gg]
+;W[gh]
+;B[hg]
+;W[ng]
+;B[oh]
+;W[mg]
+;B[mh]
+;W[og]
+;B[qf]
+;W[pg]
+;B[qg]
+;W[kh]
+;B[lh]
+;W[kg]
+;B[rj]
+;W[rl]
+;B[fi]
+;W[gi]
+;B[gj]
+;W[hi]
+;B[ji]
+;W[ij]
+;B[ni]
+;W[ej]
+;B[kj]
+;W[jk]
+;B[il]
+;W[mj]
+;B[mi]
+;W[lj]
+;B[oj]
+;W[dk]
+;B[fk]
+;W[pk]
+;B[ok]
+;W[ol]
+;B[nk]
+;W[mk]
+;B[rk]
+;W[qk]
+;B[qj]
+;W[dl]
+;B[el]
+;W[cm]
+;B[kl]
+;W[lm]
+;B[km]
+;W[nm]
+;B[dn]
+;W[cn]
+;B[on]
+;W[om]
+;B[do]
+;W[ho]
+;B[jo]
+;W[hn]
+;B[in]
+;W[hm]
+;B[hl]
+;W[gm]
+;B[gl]
+;W[im]
+;B[jm]
+;W[po]
+;B[qp]
+;W[sp]
+;B[fn]
+;W[gn]
+;B[fo]
+;W[go]
+;B[oo]
+;W[ip]
+;B[kq]
+;W[kp]
+;B[ko]
+;W[lp]
+;B[lo]
+;W[mp]
+;B[mq]
+;W[mo]
+;B[mn]
+;W[mm]
+;B[no]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto015.sgf b/regression/games/auto_gen/auto015.sgf
new file mode 100644 (file)
index 0000000..ffde0e6
--- /dev/null
@@ -0,0 +1,158 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dc]
+;B[pp]
+;W[dp]
+;B[pj]
+;W[nc]
+;B[lc]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[od]
+;W[oc]
+;B[me]
+;W[pm]
+;B[np]
+;W[de]
+;B[cn]
+;W[dn]
+;B[dm]
+;W[en]
+;B[co]
+;W[cp]
+;B[cj]
+;W[fp]
+;B[cg]
+;W[lq]
+;B[nq]
+;W[jc]
+;B[qg]
+;W[iq]
+;B[je]
+;W[gc]
+;B[lo]
+;W[ce]
+;B[oo]
+;W[jo]
+;B[kf]
+;W[he]
+;B[hg]
+;W[qq]
+;B[qp]
+;W[kc]
+;B[lb]
+;W[rd]
+;B[re]
+;W[rc]
+;B[jm]
+;W[hm]
+;B[jg]
+;W[fg]
+;B[kn]
+;W[kb]
+;B[nm]
+;W[qk]
+;B[qj]
+;W[rj]
+;B[ri]
+;W[rl]
+;B[sj]
+;W[rn]
+;B[rq]
+;W[rk]
+;B[sm]
+;W[mc]
+;B[ld]
+;W[mb]
+;B[hk]
+;W[la]
+;B[il]
+;W[jd]
+;B[fi]
+;W[kd]
+;B[gh]
+;W[md]
+;B[le]
+;W[nd]
+;B[ne]
+;W[ie]
+;B[ke]
+;W[cf]
+;B[bg]
+;W[bf]
+;B[hf]
+;W[ag]
+;B[if]
+;W[dg]
+;B[dj]
+;W[ch]
+;B[gg]
+;W[bh]
+;B[fh]
+;W[ff]
+;B[gf]
+;W[ge]
+;B[eh]
+;W[eg]
+;B[dh]
+;W[ci]
+;B[di]
+;W[hl]
+;B[hj]
+;W[em]
+;B[cm]
+;W[el]
+;B[bj]
+;W[bi]
+;B[dl]
+;W[aj]
+;B[im]
+;W[ek]
+;B[ej]
+;W[dk]
+;B[ck]
+;W[fk]
+;B[fj]
+;W[gk]
+;B[gj]
+;W[jn]
+;B[in]
+;W[hn]
+;B[do]
+;W[eo]
+;B[io]
+;W[jp]
+;B[ho]
+;W[hp]
+;B[go]
+;W[gn]
+;B[fo]
+;W[fn]
+;B[ko]
+;W[gp]
+;B[ip]
+;W[lr]
+;B[jq]
+;W[jr]
+;B[kq]
+;W[kr]
+;B[kp]
+;W[lp]
+;B[pr]
+;W[mp]
+;B[sn]
+;W[mo]
+;B[mn]
+;W[on]
+;B[no]
+;W[mq]
+;B[nn]
+;W[tt]
+;B[nr]
+;W[mr]
+;B[tt]
+;W[ms]
+;B[ns]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto016.sgf b/regression/games/auto_gen/auto016.sgf
new file mode 100644 (file)
index 0000000..94f69ac
--- /dev/null
@@ -0,0 +1,182 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[qd]
+;W[dp]
+;B[pp]
+;W[od]
+;B[oc]
+;W[nc]
+;B[pc]
+;W[md]
+;B[qf]
+;W[ic]
+;B[dd]
+;W[qn]
+;B[fq]
+;W[cf]
+;B[ch]
+;W[cc]
+;B[dc]
+;W[cd]
+;B[de]
+;W[bf]
+;B[eg]
+;W[qk]
+;B[np]
+;W[dn]
+;B[dr]
+;W[cq]
+;B[hp]
+;W[ck]
+;B[qi]
+;W[lq]
+;B[mo]
+;W[fc]
+;B[fg]
+;W[cr]
+;B[ie]
+;W[hf]
+;B[df]
+;W[nr]
+;B[eq]
+;W[lo]
+;B[jq]
+;W[kq]
+;B[hh]
+;W[he]
+;B[if]
+;W[ln]
+;B[ne]
+;W[lc]
+;B[nd]
+;W[qq]
+;B[nn]
+;W[oo]
+;B[mp]
+;W[kn]
+;B[hg]
+;W[id]
+;B[ob]
+;W[qp]
+;B[cs]
+;W[on]
+;B[ek]
+;W[dl]
+;B[fn]
+;W[ri]
+;B[rj]
+;W[qj]
+;B[rh]
+;W[pi]
+;B[qh]
+;W[oi]
+;B[in]
+;W[rk]
+;B[si]
+;W[nb]
+;B[na]
+;W[ec]
+;B[sk]
+;W[db]
+;B[oe]
+;W[ed]
+;B[ce]
+;W[be]
+;B[ee]
+;W[me]
+;B[fe]
+;W[fd]
+;B[ge]
+;W[gf]
+;B[gd]
+;W[gc]
+;B[hd]
+;W[hc]
+;B[je]
+;W[jd]
+;B[gh]
+;W[cg]
+;B[dh]
+;W[dg]
+;B[dk]
+;W[ph]
+;B[ke]
+;W[kd]
+;B[le]
+;W[ld]
+;B[mf]
+;W[pg]
+;B[ng]
+;W[pf]
+;B[pe]
+;W[of]
+;B[mh]
+;W[mj]
+;B[kj]
+;W[kl]
+;B[li]
+;W[nf]
+;B[il]
+;W[og]
+;B[qg]
+;W[mi]
+;B[bh]
+;W[bg]
+;B[nh]
+;W[ag]
+;B[ah]
+;W[oh]
+;B[ni]
+;W[nj]
+;B[lg]
+;W[ok]
+;B[lj]
+;W[cj]
+;B[jk]
+;W[ci]
+;B[bi]
+;W[di]
+;B[bj]
+;W[ei]
+;B[eh]
+;W[el]
+;B[fk]
+;W[fi]
+;B[fh]
+;W[bs]
+;B[ds]
+;W[br]
+;B[gi]
+;W[bn]
+;B[dj]
+;W[ej]
+;B[fj]
+;W[bl]
+;B[bk]
+;W[cl]
+;B[kk]
+;W[fl]
+;B[jl]
+;W[ll]
+;B[lk]
+;W[mk]
+;B[fm]
+;W[em]
+;B[gl]
+;W[en]
+;B[jm]
+;W[km]
+;B[jn]
+;W[ep]
+;B[fo]
+;W[eo]
+;B[fp]
+;W[dq]
+;B[ir]
+;W[er]
+;B[fr]
+;W[es]
+;B[fs]
+;W[kr]
+;B[jr]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto017.sgf b/regression/games/auto_gen/auto017.sgf
new file mode 100644 (file)
index 0000000..050d8e3
--- /dev/null
@@ -0,0 +1,182 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pp]
+;W[dc]
+;B[fq]
+;W[cn]
+;B[ce]
+;W[cg]
+;B[ee]
+;W[fd]
+;B[dr]
+;W[cq]
+;B[dg]
+;W[nc]
+;B[ch]
+;W[qn]
+;B[iq]
+;W[qk]
+;B[ck]
+;W[mp]
+;B[pf]
+;W[pb]
+;B[qc]
+;W[kc]
+;B[me]
+;W[qh]
+;B[qb]
+;W[hc]
+;B[qf]
+;W[cr]
+;B[ob]
+;W[er]
+;B[fr]
+;W[dq]
+;B[bc]
+;W[nb]
+;B[pc]
+;W[kq]
+;B[oh]
+;W[ke]
+;B[dk]
+;W[fs]
+;B[na]
+;W[qq]
+;B[pq]
+;W[qp]
+;B[kg]
+;W[oj]
+;B[mj]
+;W[ml]
+;B[lf]
+;W[nk]
+;B[kl]
+;W[kn]
+;B[lk]
+;W[lm]
+;B[in]
+;W[cc]
+;B[bb]
+;W[cb]
+;B[ho]
+;W[fo]
+;B[jm]
+;W[ds]
+;B[ni]
+;W[oc]
+;B[oa]
+;W[cd]
+;B[be]
+;W[bd]
+;B[ad]
+;W[ed]
+;B[fg]
+;W[od]
+;B[he]
+;W[hd]
+;B[gf]
+;W[fe]
+;B[hg]
+;W[ge]
+;B[if]
+;W[le]
+;B[de]
+;W[dd]
+;B[kf]
+;W[je]
+;B[pa]
+;W[mb]
+;B[ba]
+;W[ca]
+;B[ma]
+;W[lb]
+;B[la]
+;W[ie]
+;B[hf]
+;W[oe]
+;B[of]
+;W[ne]
+;B[mf]
+;W[pe]
+;B[rf]
+;W[qe]
+;B[re]
+;W[qd]
+;B[rd]
+;W[ff]
+;B[md]
+;W[mc]
+;B[ld]
+;W[lc]
+;B[kd]
+;W[jd]
+;B[nd]
+;W[kb]
+;B[ka]
+;W[jb]
+;B[ja]
+;W[ef]
+;B[eg]
+;W[df]
+;B[cf]
+;W[jf]
+;B[jg]
+;W[nf]
+;B[ng]
+;W[qg]
+;B[pg]
+;W[rg]
+;B[ph]
+;W[sg]
+;B[sf]
+;W[pi]
+;B[oi]
+;W[qi]
+;B[nj]
+;W[ok]
+;B[mk]
+;W[ll]
+;B[jj]
+;W[km]
+;B[ik]
+;W[jn]
+;B[jl]
+;W[go]
+;B[fp]
+;W[fn]
+;B[ep]
+;W[em]
+;B[eo]
+;W[bm]
+;B[hm]
+;W[fl]
+;B[fj]
+;W[fk]
+;B[ek]
+;W[el]
+;B[dl]
+;W[en]
+;B[dm]
+;W[dn]
+;B[cm]
+;W[bl]
+;B[bg]
+;W[bk]
+;B[cl]
+;W[gn]
+;B[gm]
+;W[gl]
+;B[hl]
+;W[fm]
+;B[hn]
+;W[do]
+;B[gp]
+;W[jo]
+;B[io]
+;W[jp]
+;B[ip]
+;W[eq]
+;B[jq]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto018.sgf b/regression/games/auto_gen/auto018.sgf
new file mode 100644 (file)
index 0000000..0b513b3
--- /dev/null
@@ -0,0 +1,205 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pp]
+;W[dc]
+;B[ce]
+;W[dh]
+;B[df]
+;W[fd]
+;B[bc]
+;W[jc]
+;B[cn]
+;W[qn]
+;B[nq]
+;W[rp]
+;B[qq]
+;W[qk]
+;B[ck]
+;W[fh]
+;B[fq]
+;W[eo]
+;B[cq]
+;W[go]
+;B[iq]
+;W[qf]
+;B[qh]
+;W[qc]
+;B[nd]
+;W[je]
+;B[qd]
+;W[pc]
+;B[pg]
+;W[io]
+;B[me]
+;W[fg]
+;B[no]
+;W[jn]
+;B[rq]
+;W[qo]
+;B[co]
+;W[lo]
+;B[lq]
+;W[ek]
+;B[dq]
+;W[sq]
+;B[og]
+;W[nm]
+;B[lc]
+;W[nb]
+;B[lf]
+;W[nn]
+;B[jg]
+;W[gf]
+;B[ep]
+;W[fp]
+;B[eq]
+;W[mo]
+;B[do]
+;W[if]
+;B[lh]
+;W[lj]
+;B[nj]
+;W[cc]
+;B[bb]
+;W[cb]
+;B[cg]
+;W[ch]
+;B[oo]
+;W[on]
+;B[dn]
+;W[kc]
+;B[lb]
+;W[kb]
+;B[mb]
+;W[oc]
+;B[nc]
+;W[oa]
+;B[rc]
+;W[rb]
+;B[rd]
+;W[sb]
+;B[rj]
+;W[rk]
+;B[qj]
+;W[sj]
+;B[si]
+;W[sk]
+;B[qi]
+;W[na]
+;B[ol]
+;W[ma]
+;B[pk]
+;W[ql]
+;B[fn]
+;W[gq]
+;B[gr]
+;W[la]
+;B[fo]
+;W[gp]
+;B[hq]
+;W[sc]
+;B[em]
+;W[od]
+;B[rf]
+;W[re]
+;B[pe]
+;W[rg]
+;B[pf]
+;W[sd]
+;B[cd]
+;W[dd]
+;B[de]
+;W[oe]
+;B[ee]
+;W[ed]
+;B[fe]
+;W[ge]
+;B[ne]
+;W[qe]
+;B[ff]
+;W[jf]
+;B[ji]
+;W[jk]
+;B[kf]
+;W[mk]
+;B[ke]
+;W[hi]
+;B[kd]
+;W[ij]
+;B[jd]
+;W[id]
+;B[of]
+;W[dg]
+;B[ig]
+;W[eg]
+;B[ef]
+;W[bg]
+;B[hg]
+;W[gg]
+;B[hf]
+;W[ie]
+;B[he]
+;W[hd]
+;B[qg]
+;W[se]
+;B[hh]
+;W[gh]
+;B[rh]
+;W[sg]
+;B[sh]
+;W[sf]
+;B[ii]
+;W[hk]
+;B[li]
+;W[jj]
+;B[mj]
+;W[kj]
+;B[ki]
+;W[dk]
+;B[cj]
+;W[ci]
+;B[dj]
+;W[gl]
+;B[di]
+;W[ei]
+;B[ej]
+;W[fj]
+;B[nk]
+;W[dl]
+;B[bj]
+;W[bi]
+;B[cl]
+;W[el]
+;B[nl]
+;W[ml]
+;B[pl]
+;W[dm]
+;B[en]
+;W[cm]
+;B[bm]
+;W[om]
+;B[aj]
+;W[ai]
+;B[pm]
+;W[qm]
+;B[pn]
+;W[gn]
+;B[po]
+;W[hp]
+;B[ip]
+;W[lp]
+;B[jp]
+;W[jo]
+;B[kp]
+;W[ko]
+;B[qp]
+;W[sr]
+;B[rr]
+;W[so]
+;B[rs]
+;W[sp]
+;B[ss]
+;W[sn]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto019.sgf b/regression/games/auto_gen/auto019.sgf
new file mode 100644 (file)
index 0000000..84f80b2
--- /dev/null
@@ -0,0 +1,183 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pp]
+;W[dd]
+;B[fc]
+;W[hc]
+;B[cc]
+;W[dc]
+;B[cd]
+;W[de]
+;B[db]
+;W[eb]
+;B[cb]
+;W[ec]
+;B[fd]
+;W[kc]
+;B[cn]
+;W[qn]
+;B[pn]
+;W[pm]
+;B[on]
+;W[qo]
+;B[qp]
+;W[qj]
+;B[np]
+;W[qf]
+;B[pf]
+;W[pg]
+;B[of]
+;W[qe]
+;B[qd]
+;W[cl]
+;B[nd]
+;W[dn]
+;B[fq]
+;W[ce]
+;B[be]
+;W[lq]
+;B[iq]
+;W[lo]
+;B[nq]
+;W[co]
+;B[lm]
+;W[fb]
+;B[ff]
+;W[dk]
+;B[eg]
+;W[kr]
+;B[nm]
+;W[om]
+;B[di]
+;W[mr]
+;B[ej]
+;W[or]
+;B[he]
+;W[jm]
+;B[qr]
+;W[ke]
+;B[jk]
+;W[kn]
+;B[kl]
+;W[nr]
+;B[oj]
+;W[pj]
+;B[ol]
+;W[pl]
+;B[ok]
+;W[fo]
+;B[kg]
+;W[io]
+;B[dr]
+;W[gn]
+;B[cq]
+;W[ek]
+;B[gc]
+;W[hb]
+;B[gb]
+;W[ga]
+;B[bf]
+;W[hk]
+;B[hi]
+;W[jp]
+;B[ij]
+;W[bn]
+;B[fj]
+;W[ed]
+;B[fe]
+;W[hd]
+;B[gd]
+;W[ee]
+;B[pe]
+;W[qh]
+;B[cf]
+;W[df]
+;B[dg]
+;W[ea]
+;B[da]
+;W[fa]
+;B[ef]
+;W[ha]
+;B[kf]
+;W[og]
+;B[je]
+;W[jd]
+;B[id]
+;W[ic]
+;B[ie]
+;W[jb]
+;B[ld]
+;W[lc]
+;B[kd]
+;W[jc]
+;B[mc]
+;W[mb]
+;B[nb]
+;W[la]
+;B[lf]
+;W[ng]
+;B[me]
+;W[nf]
+;B[na]
+;W[ma]
+;B[ne]
+;W[mf]
+;B[oi]
+;W[oh]
+;B[pi]
+;W[ph]
+;B[qi]
+;W[ri]
+;B[dj]
+;W[hj]
+;B[ik]
+;W[gj]
+;B[gi]
+;W[gk]
+;B[cj]
+;W[ck]
+;B[fk]
+;W[fl]
+;B[pk]
+;W[qk]
+;B[jl]
+;W[km]
+;B[ln]
+;W[mo]
+;B[mn]
+;W[no]
+;B[nn]
+;W[oo]
+;B[ro]
+;W[rn]
+;B[rp]
+;W[po]
+;B[sn]
+;W[rm]
+;B[sm]
+;W[cp]
+;B[fp]
+;W[ep]
+;B[gp]
+;W[go]
+;B[hp]
+;W[ho]
+;B[ip]
+;W[mp]
+;B[pq]
+;W[op]
+;B[oq]
+;W[dq]
+;B[cr]
+;W[eq]
+;B[er]
+;W[jq]
+;B[mq]
+;W[pr]
+;B[rq]
+;W[tt]
+;B[ir]
+;W[jr]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto020.sgf b/regression/games/auto_gen/auto020.sgf
new file mode 100644 (file)
index 0000000..423d3aa
--- /dev/null
@@ -0,0 +1,175 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[qd]
+;W[dc]
+;B[dp]
+;W[pq]
+;B[po]
+;W[pl]
+;B[mp]
+;W[oo]
+;B[on]
+;W[no]
+;B[pp]
+;W[op]
+;B[qq]
+;W[oq]
+;B[qn]
+;W[qr]
+;B[rq]
+;W[oc]
+;B[pe]
+;W[md]
+;B[pc]
+;W[od]
+;B[ce]
+;W[ed]
+;B[ch]
+;W[df]
+;B[kc]
+;W[eg]
+;B[hc]
+;W[cn]
+;B[cl]
+;W[cq]
+;B[dq]
+;W[cp]
+;B[do]
+;W[co]
+;B[em]
+;W[qi]
+;B[hq]
+;W[de]
+;B[cf]
+;W[pg]
+;B[ei]
+;W[pd]
+;B[ho]
+;W[qc]
+;B[qf]
+;W[oi]
+;B[rc]
+;W[qb]
+;B[rb]
+;W[pb]
+;B[ke]
+;W[he]
+;B[nl]
+;W[fd]
+;B[kg]
+;W[ki]
+;B[mb]
+;W[gi]
+;B[rl]
+;W[fh]
+;B[ol]
+;W[lr]
+;B[pk]
+;W[jq]
+;B[fl]
+;W[jo]
+;B[fj]
+;W[rr]
+;B[jm]
+;W[sq]
+;B[in]
+;W[ig]
+;B[jg]
+;W[qg]
+;B[ng]
+;W[mc]
+;B[nb]
+;W[ob]
+;B[lh]
+;W[lc]
+;B[kb]
+;W[lb]
+;B[la]
+;W[nc]
+;B[of]
+;W[na]
+;B[ka]
+;W[ma]
+;B[ra]
+;W[rf]
+;B[re]
+;W[rh]
+;B[qe]
+;W[sg]
+;B[qa]
+;W[pa]
+;B[cd]
+;W[cc]
+;B[dd]
+;W[hd]
+;B[gc]
+;W[fc]
+;B[gd]
+;W[ge]
+;B[oe]
+;W[pf]
+;B[ne]
+;W[nd]
+;B[me]
+;W[og]
+;B[se]
+;W[rj]
+;B[sf]
+;W[rg]
+;B[eh]
+;W[fi]
+;B[kh]
+;W[ji]
+;B[jh]
+;W[ih]
+;B[nh]
+;W[oh]
+;B[li]
+;W[ni]
+;B[mi]
+;W[gj]
+;B[gk]
+;W[rk]
+;B[qk]
+;W[qj]
+;B[mj]
+;W[nj]
+;B[mk]
+;W[pj]
+;B[pm]
+;W[nk]
+;B[ok]
+;W[oj]
+;B[cm]
+;W[bm]
+;B[bl]
+;W[bn]
+;B[dn]
+;W[al]
+;B[jn]
+;W[mo]
+;B[lm]
+;W[lp]
+;B[ln]
+;W[kj]
+;B[lj]
+;W[kk]
+;B[lk]
+;W[kl]
+;B[jl]
+;W[jk]
+;B[ik]
+;W[ll]
+;B[ml]
+;W[km]
+;B[kn]
+;W[ij]
+;B[mn]
+;W[nn]
+;B[nm]
+;W[io]
+;B[ko]
+;W[kp]
+;B[lo]
+;W[iq]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto021.sgf b/regression/games/auto_gen/auto021.sgf
new file mode 100644 (file)
index 0000000..ee0d6e2
--- /dev/null
@@ -0,0 +1,133 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[cp]
+;B[pp]
+;W[dc]
+;B[ep]
+;W[eq]
+;B[fq]
+;W[dq]
+;B[gp]
+;W[cn]
+;B[kq]
+;W[qf]
+;B[de]
+;W[ce]
+;B[cf]
+;W[cd]
+;B[dg]
+;W[fc]
+;B[ck]
+;W[qi]
+;B[nd]
+;W[qn]
+;B[ql]
+;W[qq]
+;B[pq]
+;W[qp]
+;B[po]
+;W[qr]
+;B[pn]
+;W[rn]
+;B[ol]
+;W[lc]
+;B[nf]
+;W[ic]
+;B[nc]
+;W[lf]
+;B[fe]
+;W[he]
+;B[hg]
+;W[jg]
+;B[ji]
+;W[oj]
+;B[en]
+;W[ni]
+;B[mg]
+;W[ml]
+;B[mn]
+;W[mj]
+;B[ih]
+;W[qc]
+;B[gf]
+;W[qd]
+;B[mc]
+;W[pe]
+;B[pc]
+;W[dd]
+;B[fd]
+;W[ed]
+;B[ee]
+;W[ge]
+;B[gd]
+;W[gc]
+;B[hd]
+;W[ie]
+;B[hc]
+;W[hb]
+;B[ib]
+;W[jb]
+;B[id]
+;W[jc]
+;B[je]
+;W[jf]
+;B[if]
+;W[ke]
+;B[jd]
+;W[kd]
+;B[qb]
+;W[oe]
+;B[mf]
+;W[od]
+;B[rb]
+;W[oc]
+;B[ob]
+;W[pb]
+;B[pa]
+;W[lb]
+;B[pc]
+;W[mb]
+;B[sc]
+;W[nb]
+;B[rc]
+;W[ne]
+;B[pb]
+;W[na]
+;B[oa]
+;W[pd]
+;B[rd]
+;W[ig]
+;B[gi]
+;W[jh]
+;B[jj]
+;W[ok]
+;B[nl]
+;W[nk]
+;B[hf]
+;W[pk]
+;B[qm]
+;W[qk]
+;B[re]
+;W[rf]
+;B[sf]
+;W[qe]
+;B[pl]
+;W[mm]
+;B[nm]
+;W[rm]
+;B[rl]
+;W[rk]
+;B[dn]
+;W[sl]
+;B[cm]
+;W[bn]
+;B[bm]
+;W[am]
+;B[qo]
+;W[ro]
+;B[dp]
+;W[cq]
+;B[pr]
+;W[ps]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/auto_gen/auto022.sgf b/regression/games/auto_gen/auto022.sgf
new file mode 100644 (file)
index 0000000..2e490c5
--- /dev/null
@@ -0,0 +1,153 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5];B[pd]
+;W[dp]
+;B[pp]
+;W[dd]
+;B[fc]
+;W[hc]
+;B[fe]
+;W[cf]
+;B[fq]
+;W[qf]
+;B[qh]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[od]
+;W[rd]
+;B[re]
+;W[rc]
+;B[qe]
+;W[pf]
+;B[jc]
+;W[he]
+;B[iq]
+;W[mp]
+;B[pn]
+;W[dn]
+;B[oc]
+;W[ob]
+;B[cl]
+;W[fn]
+;B[ci]
+;W[cn]
+;B[qk]
+;W[ie]
+;B[eb]
+;W[db]
+;B[dc]
+;W[cc]
+;B[ec]
+;W[cb]
+;B[fg]
+;W[qq]
+;B[qp]
+;W[pq]
+;B[ke]
+;W[kq]
+;B[lc]
+;W[nn]
+;B[rf]
+;W[mm]
+;B[mk]
+;W[kk]
+;B[fl]
+;W[ll]
+;B[ki]
+;W[hl]
+;B[lj]
+;W[io]
+;B[hj]
+;W[hk]
+;B[ij]
+;W[op]
+;B[lh]
+;W[ed]
+;B[fd]
+;W[ee]
+;B[em]
+;W[en]
+;B[ef]
+;W[df]
+;B[cq]
+;W[cp]
+;B[dq]
+;W[kj]
+;B[jj]
+;W[ik]
+;B[kr]
+;W[jr]
+;B[jq]
+;W[lr]
+;B[kp]
+;W[ir]
+;B[lq]
+;W[hq]
+;B[hp]
+;W[hr]
+;B[gp]
+;W[ks]
+;B[ip]
+;W[mq]
+;B[kq]
+;W[mr]
+;B[bp]
+;W[il]
+;B[jk]
+;W[jl]
+;B[lk]
+;W[kl]
+;B[gl]
+;W[kn]
+;B[gk]
+;W[ml]
+;B[fi]
+;W[cm]
+;B[dm]
+;W[fm]
+;B[gm]
+;W[gn]
+;B[hm]
+;W[ho]
+;B[im]
+;W[ko]
+;B[jm]
+;W[km]
+;B[hn]
+;W[go]
+;B[in]
+;W[jo]
+;B[jn]
+;W[on]
+;B[bo]
+;W[bn]
+;B[bl]
+;W[bm]
+;B[co]
+;W[ep]
+;B[do]
+;W[fp]
+;B[gq]
+;W[al]
+;B[ek]
+;W[eo]
+;B[ao]
+;W[eq]
+;B[er]
+;W[dr]
+;B[bq]
+;W[fr]
+;B[cr]
+;W[es]
+;B[an]
+;W[am]
+;B[ar]
+;W[tt]
+;B[bk]
+;W[ak]
+;B[bj]
+;W[aj]
+;B[cs]
+;W[ds]
+;B[tt]
+;W[tt]
+)
\ No newline at end of file
diff --git a/regression/games/bitti-gnug36.sgf b/regression/games/bitti-gnug36.sgf
new file mode 100644 (file)
index 0000000..c138c88
--- /dev/null
@@ -0,0 +1,72 @@
+(;GM[1]FF[4]CA[UTF-8]AP[gGo:1.0]ST[1]
+SZ[9]HA[6]KM[0.0]
+PW[Mensch]PB[Computer]RE[W+20]DT[2005-05-21]
+AB[cc][ce][cg][gc][ge][gg]
+;W[eg]
+;B[ef]
+;W[df]
+;B[de]
+;W[dg]
+;B[bg]
+;W[ec]
+;B[fb]
+;W[cb]
+;B[bb]
+;W[gh]
+;B[fh]
+;W[fg]
+;B[hh]
+;W[gf]
+;B[hg]
+;W[hf]
+;B[ff]
+;W[he]
+;B[gd]
+;W[gi]
+;B[fi]
+;W[dc]
+;B[dd]
+;W[bc]
+;B[bd]
+;W[cd]
+;B[ac]
+;W[cc]
+;B[ab]
+;W[be]
+;B[ad]
+;W[ee]
+;B[ae]
+;W[fe]
+;B[eb]
+;W[cf]
+;B[bf]
+;W[hd]
+;B[hc]
+;W[ch]
+;B[bh]
+;W[bi]
+;B[eh]
+;W[dh]
+;B[hi]
+;W[ba]
+;B[be]
+;W[ed]
+;B[id]
+;W[ff]
+;B[db]
+;W[ca]
+;B[ig]
+;W[ci]
+;B[da]
+;W[ah]
+;B[ic]
+;W[ag]
+;B[fc]
+;W[if]
+;B[ei]
+;W[di]
+;B[ie]
+;W[fd]
+;B[tt]
+;W[tt]TB[ea][fa][ga][gb][gh][gi][ha][hb][ia][ib][ih][ii]TW[aa][ab][ac][ad][ae][af][ai][bb][bd][be][bf][bg][bh][ce][cg][dd][de][ef]
+)
diff --git a/regression/games/blunder1.sgf b/regression/games/blunder1.sgf
new file mode 100644 (file)
index 0000000..7619909
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-06]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ec][fc][gc][jc][cd][dd][ed][gd][hd][ce][ee][he][ke][cf][hf][cg][eg][fg][gg][hg][ig][ch][gh][ih][jh][ci][di][gi][ji][dj][ej][jj][ck][dk][jk][kk][bl][cl][kl][ll][bm][lm]
+AB[fd][de][fe][ge][df][ef][ff][gf][dg][dh][eh][fh][hh][fi][hi][ii][fj][gj][ij][ek][ik][dl][el][il][jl][cm][dm][jm][km]
+)
diff --git a/regression/games/blunder10.sgf b/regression/games/blunder10.sgf
new file mode 100644 (file)
index 0000000..ca1ba53
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-13]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[bc][cc][dc][ec][fc][gc][hc][bd][hd][be][ce][he][af][bf][hf][hg][ah][bh][eh][fh][gh][hh][bi][ci][di][ei]
+AB[dd][ed][fd][gd][de][ge][cf][gf][ag][cg][eg][fg][gg][ch][dh];B[bg]
+)
diff --git a/regression/games/blunder11.sgf b/regression/games/blunder11.sgf
new file mode 100644 (file)
index 0000000..9f17e9b
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[9];AB[cc][gg];W[gc];B[fd];W[gd];B[fe];W[cg];B[ge];W[eb];B[dc];W[ca]
+;B[df];W[dg];B[bf];W[bg];B[cf];W[fh];B[fc];W[fb];B[hd];W[gb];B[gh];
+W[eg];B[ag];W[ah];B[af];W[bi];B[cb];W[ha];B[hc];W[hf];B[he];W[gi];
+B[hi];W[fi];B[hh];W[ih];B[da];W[fg];B[ig];W[ec];B[ef];W[ff];B[if];
+W[gf];B[ii];W[hg];B[ie];W[hb];B[ib];W[ed];B[ee];W[dd];B[ea];W[cd];
+B[ba];W[bc];B[bd]
+)
diff --git a/regression/games/blunder12.sgf b/regression/games/blunder12.sgf
new file mode 100644 (file)
index 0000000..1c11d62
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.1.1]
+PB[GNU Go 3.0.0]
+GN[Kitani (W) vs. Go Seigen (B)]
+DT[2001-08-31]
+SY[Cgoban 1.9.10]TM[-];B[pd];W[pp];B[cd];W[dp];B[ic];W[jp];B[np];W[pn]
+;B[pq];W[qq];B[oq];W[qr];B[lq];W[qj];B[jr];W[pf];B[nd];W[qd];B[qc];
+W[qe];B[rc];W[ec];B[de];W[dj];B[fd];W[cb];B[fc];W[bc];B[ea];W[da];
+B[eb];W[db];B[dc];W[oj];B[le];W[ol];B[lc];W[cn];B[cq];W[dq];B[dr];
+W[er];B[iq];W[ip];B[ds];W[cp];B[cg];W[lo];B[bd];W[ba];B[bi];W[mi];
+B[mg];W[kh];B[nh];W[qh];B[eg];W[ih];B[fi];W[fj];B[gr];W[cr];B[gf];
+W[je];B[ie];W[kf];B[sf];W[li];B[gp];W[gj];B[nn];W[ml];B[bk];W[mm];
+B[dl];W[fo];B[ho];W[jn];B[hm];W[jl];B[il];W[ei];B[kc];W[fh];B[ij];
+W[ns];B[bm];W[bn];B[an];W[bq];B[hi];W[el];B[gi];W[em];B[dk];W[ao];
+B[am];W[kj];B[ek];W[fk];B[ej];W[gl];B[jk];W[kk];B[jm];W[km];B[kl];
+W[ll];B[ke];W[if];B[jd];W[he];B[jf];W[hf];B[gg];W[kg];B[hg];W[jg];
+B[hd];W[je];B[ac];W[ab];B[pr];W[ps];B[ad];W[jf];B[fr];W[es];B[sh];
+W[rh];B[si];W[rk];B[mr];W[oo];B[no];W[fq];B[hp];W[gq];B[hq];W[fs];
+B[gs];W[eq];B[is];W[nr];B[nq];W[os];B[kp];W[kn];B[in];W[io];B[ko];
+W[jo];B[lp];W[mo];B[mn];W[ln];B[om];W[pm];B[cc];W[bb];B[nm];W[rd];
+B[sd];W[ge];B[fe];W[oh];B[ni];W[ng];B[mf];W[nj];B[og];W[pg];B[nf];
+W[of];B[oi];W[pi];B[ng];W[cm];B[cl];W[oe];B[od];W[mp];B[mq];W[ms];
+B[ls];W[hk];B[gm];W[gn];B[go];W[fn];B[hn];W[ne];B[jq];W[jl];B[or];
+W[im];B[qs];W[ik];B[rs];W[rr];B[sr];W[qp];B[sq];W[jm];B[jj];W[ro];
+B[hl];W[hj];B[ii];W[hh];B[gh];W[ji];B[ig];W[jh];B[fm];W[fl];B[ri];
+W[me];B[lf];W[md];B[mc];W[ld];B[kd];W[gd];B[gc];W[dm];B[id];W[fp];
+B[lh];W[nl];B[qi];W[ph];B[rq];W[op];B[rj];W[qk];B[rp];W[so];B[ss];
+W[sk];B[lg];W[ki];B[pe];W[rf];B[se];W[rg];B[sg];W[re];B[on];W[sp];
+B[ps];W[sj];B[sc];W[mh];B[qo];W[po];B[qn];W[rn];B[qm];W[rm];B[pl];
+W[ql];B[pk];W[pj];B[ok];W[nk];B[pm];W[tt];B[tt]
+)
diff --git a/regression/games/blunder13.sgf b/regression/games/blunder13.sgf
new file mode 100644 (file)
index 0000000..b458123
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[fa][ga][fb][dc][ec][fc][bd][dd][ce][ee][af][bf][cf]
+AB[ha][gb][ib][gc][fd][de][df][ef][ff][gf][ag][bg][cg][dg]
+)
diff --git a/regression/games/blunder14.sgf b/regression/games/blunder14.sgf
new file mode 100644 (file)
index 0000000..c10e7a7
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.10 (level 10) load and print]PB[Unknown]HA[0]KM[0.5]GN[GNU Go 3.1.10 load and print Random Seed 1003439574] 
+AW[ha][ma][gb][hb][jb][kb][lb][mb][pb][dc][gc][mc][nc][oc][qc][rc][gd][rd][de][ge][he][ff][gf][gg][rg][sg][bh][ch][dh][eh][fh][oh][qh][rh][ai][bi][di][pi][si][aj][pj][qj][rj][rk][jl][ll][hm][im][jm][km][lm][om][pm][ln][mn][nn][on][rn][ho][io][ko][lo][qo][so][gp][mp][np][op][pp][rp][gq][jq][mq][fr][gr][es][fs]
+AB[ia][ja][ka][la][ib][hc][ic][jc][kc][lc][pc][hd][md][nd][od][pd][qd][ie][re][hf][if][pf][rf][hg][pg][qg][gh][nh][ph][ci][ei][fi][hi][oi][bj][cj][dj][ej][oj][ak][jk][kk][lk][nk][pk][qk][sk][bl][hl][il][kl][ml][ol][pl][rl][gm][mm][nm][qm][rm][gn][hn][pn][qn][eo][go][mo][no][oo][po][cp][fp][eq][fq][cr][er][ds]
+PL[W]
+IL[ok][nl][ql]
+)
diff --git a/regression/games/blunder15.sgf b/regression/games/blunder15.sgf
new file mode 100644 (file)
index 0000000..a392313
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[ja][ka][la][lb][sb][ec][jc][kc][lc][mc][rc][dd][ed][fd][gd][jd][kd][nd][od][qd][rd][ce][de][ee][fe][ge][ie][je][le][me][ne][re][df][ef][hf][jf][kf][mf][nf][of][qf][rf][sf][eg][pg][qg][sg][ch][dh][eh][kh][rh][sh][bi][ci][di][ii][aj][ej][fj][gj][ij][rj][bk][ck][dk][gk][hk][ik][jk][kk][lk][mk][nk][ok][pk][qk][rk][sk][bl][cl][jl][kl][ml][nl][bm][em][km][mm][om][pm][rm][bn][en][fn][kn][qn][co][eo][fo][go][ho][jo][ro][so][cp][ep][fp][jp][np][op][sp][cq][dq][eq][iq][jq][kq][mq][nq][dr][fr][jr][lr][nr][or][rr][fs][gs][is][js][ns]AB[ia][na][ra][eb][ib][jb][kb][nb][rb][cc][dc][fc][gc][hc][ic][nc][oc][pc][qc][cd][hd][id][pd][be][he][oe][pe][qe][af][cf][ff][gf][if][lf][pf][ag][bg][cg][dg][fg][ig][jg][kg][lg][mg][ng][og][ah][bh][fh][ih][ph][qh][ai][ei][fi][gi][hi][ji][qi][ri][si][hj][jj][kj][lj][mj][nj][oj][pj][qj][sj][ek][fk][dl][el][fl][gl][hl][il][ll][cm][dm][fm][hm][jm][lm][nm][cn][dn][gn][hn][in][jn][ln][mn][nn][on][pn][do][io][ko][lo][no][oo][qo][dp][gp][hp][ip][lp][mp][pp][qp][rp][hq][lq][oq][pq][qq][rq][sq][er][gr][hr][ir][pr][qr][hs][os][ps]PL[B]IL[ke][rg])
diff --git a/regression/games/blunder16.sgf b/regression/games/blunder16.sgf
new file mode 100644 (file)
index 0000000..0d6e60a
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[0.0]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[ba][ha][ma][na][db][fb][gb][hb][mb][cc][dc][ec][lc][mc][nc][cd][ed][md][nd][pd][sd][ee][me][oe][pe][re][se][df][ef][nf][of][pf][qf][rf][sf][fg][gg][hg][mg][ng][qg][sg][ah][ch][dh][ih][lh][nh][ai][bi][ci][di][ei][gi][ii][mi][qi][aj][bj][dj][ej][fj][gj][hj][mj][nj][oj][qj][bk][fk][mk][ok][el][kl][ll][ml][em][fm][gm][hm][km][mm][nm][pm][en][hn][in][jn][nn][sn][eo][ho][jo][ko][mo][no][oo][po][ro][so][dp][ep][np][pp][qp][rp][bq][cq][eq][fq][gq][jq][kq][lq][nq][gr][ir][nr][hs][js][ms][ns][os]AB[ca][da][ea][fa][ga][la][oa][ab][bb][cb][eb][lb][nb][ob][rb][bc][oc][pc][qc][sc][bd][dd][od][qd][rd][ce][de][qe][cf][ag][bg][cg][dg][eg][og][pg][rg][bh][eh][fh][gh][hh][oh][qh][rh][sh][fi][hi][ni][oi][pi][cj][pj][ak][ck][dk][ek][gk][nk][pk][qk][al][bl][cl][dl][fl][nl][ol][bm][dm][jm][lm][om][qm][sm][an][dn][gn][kn][ln][mn][on][pn][qn][rn][bo][do][go][io][lo][qo][bp][cp][gp][hp][ip][jp][kp][lp][mp][op][sp][dq][hq][iq][mq][oq][pq][qq][rq][sq][br][cr][dr][er][fr][hr][lr][mr][or][pr][sr][ds][fs][gs][ls][ps][rs]PL[B])
diff --git a/regression/games/blunder17.sgf b/regression/games/blunder17.sgf
new file mode 100644 (file)
index 0000000..3484bc1
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[dc][cd][dd][ed][fd][hd][kd][md][od][be][ce][ee][ge][he][le][oe][bf][df][ff][if][kf][lf][eg][fg][jg][kg][lg][ng][og][pg][bh][ch][dh][gh][mh][oh][ph][rh][ai][bi][hi][ni][oi][ri][si][aj][cj][gj][ij][jj][kj][lj][mj][nj][pj][qj][sj][bk][ck][fk][gk][ik][pk][rk][cl][el][jl][ol][pl][em][fm][gm][hm][jm][lm][qm][bn][cn][dn][mn][on][pn][qn][ao][eo][ko][lo][qo][ap][cp][dp][ep][qp][rp][aq][dq][eq][lq][mq][oq][rq][ar][cr][dr][lr][mr][nr][or][pr][qr][bs][cs][ms]AB[bb][cb][db][ac][cc][ec][fc][gc][hc][kc][lc][oc][pc][ad][bd][gd][id][ld][qd][ae][ie][je][ke][me][pe][af][cf][jf][mf][nf][of][pf][ag][bg][cg][dg][mg][qg][rg][sg][ah][eh][qh][sh][ci][di][pi][qi][dj][fj][hj][oj][dk][hk][jk][kk][lk][mk][nk][ok][fl][gl][hl][il][nl][ql][im][nm][om][pm][en][fn][gn][hn][in][nn][fo][jo][mo][no][po][fp][jp][lp][mp][np][op][pp][fq][gq][jq][kq][nq][pq][qq][er][gr][kr][ds][es][fs][gs][ks][ls]PL[B])
diff --git a/regression/games/blunder18.sgf b/regression/games/blunder18.sgf
new file mode 100644 (file)
index 0000000..14e6869
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[9.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[da][ea][la][ma][na][oa][pa][db][fb][hb][nb][ob][dc][fc][gc][hc][ic][mc][nc][cd][dd][ed][fd][gd][id][jd][ld][md][od][ce][ge][he][je][me][ne][oe][pe][qe][bf][df][ff][if][jf][mf][nf][bg][dg][eg][fg][ng][rg][ah][bh][fh][gh][kh][lh][mh][oh][ph][qh][rh][sh][bi][gi][li][mi][ni][pi][qi][ri][ej][gj][nj][oj][qj][sj][ck][ek][lk][mk][nk][bl][cl][dl][el][il][ll][am][cm][dm][em][hm][im][jm][km][lm][nm][om][pm][qm][rm][sm][cn][en][fn][in][kn][nn][pn][co][jo][ko][no][po][dp][kp][lp][mp][dq][jq][kq][mq][nq][oq][rq][cr][er][gr][kr][mr][es][fs][gs][ls][ms][ns]AB[fa][ga][ha][ia][ja][ka][qa][eb][gb][ib][jb][lb][mb][pb][rb][jc][kc][lc][oc][pc][rc][kd][pd][qd][sd][ke][le][re][cf][gf][hf][kf][lf][of][pf][qf][rf][sf][cg][gg][hg][ig][jg][kg][lg][mg][og][pg][qg][sg][ch][dh][eh][hh][ih][jh][ai][ci][ei][fi][hi][ki][aj][bj][cj][dj][fj][hj][ij][jj][kj][lj][mj][pj][rj][ak][bk][dk][fk][gk][hk][ik][jk][kk][pk][qk][rk][al][fl][gl][hl][jl][kl][ml][nl][ol][rl][sl][fm][gm][mm][dn][gn][hn][mn][on][qn][rn][do][eo][fo][io][lo][mo][oo][ep][gp][hp][ip][jp][np][op][pp][qp][rp][eq][fq][gq][iq][pq][qq][fr][hr][jr][nr][or][rr][hs][js][ks][os][ps][qs]PL[B])
diff --git a/regression/games/blunder19.sgf b/regression/games/blunder19.sgf
new file mode 100644 (file)
index 0000000..2f8fa64
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[1.0]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[ha][ab][cb][db][hb][ib][jb][lb][qb][bc][dc][ec][hc][jc][kc][mc][nc][oc][pc][rc][ad][bd][cd][jd][kd][md][pd][rd][ae][ke][qe][re][se][kf][rf][ig][jg][rg][ii][ji][ki][ri][aj][jj][kj][lj][mj][nj][qj][rj][ak][bk][fk][jk][kk][ok][sk][al][fl][gl][il][jl][kl][ll][ol][ql][rl][sl][am][bm][dm][em][fm][hm][im][jm][km][mm][nm][om][pm][qm][rm][bn][cn][dn][fn][gn][hn][mn][on][qn][sn][co][go][lo][mo][ro][so][bp][kp][mp][op][qp][rp][bq][cq][dq][eq][jq][mq][nq][oq][dr][gr][hr][ir][kr][lr][cs][ds][es][hs][ls][ms]AB[ba][ea][ga][bb][eb][fb][gb][gc][ic][lc][dd][ed][fd][hd][id][ld][nd][od][be][ce][ie][je][le][me][oe][pe][af][jf][lf][nf][of][qf][sf][bg][kg][mg][pg][qg][sg][ih][jh][kh][mh][oh][ph][qh][rh][sh][ai][bi][hi][li][mi][ni][qi][bj][cj][dj][ej][fj][hj][ij][oj][pj][sj][ck][ek][gk][hk][ik][lk][mk][nk][pk][qk][rk][bl][cl][dl][el][hl][ml][pl][cm][lm][en][in][jn][kn][ln][nn][pn][do][eo][fo][ho][ko][no][oo][po][qo][cp][dp][ep][fp][gp][ip][jp][np][pp][sp][fq][gq][hq][iq][lq][pq][qq][rq][sq][er][fr][mr][nr][or][fs][gs][ns][ps]PL[W])
diff --git a/regression/games/blunder2.sgf b/regression/games/blunder2.sgf
new file mode 100644 (file)
index 0000000..0008f34
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-07]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];;
+AW[da][ga][ia][bb][cb][hb][ib][bc][ic][bd][id][be][ce][ie][cf][if][cg][dg][eg][fg][ig][fh][gh][hh][ih][fi]
+AB[db][eb][fb][gb][cc][dc][gc][hc][cd][ed][hd][de][he][df][ef][ff][hf][gg][hg]
+PL[W]
+)
diff --git a/regression/games/blunder20.sgf b/regression/games/blunder20.sgf
new file mode 100644 (file)
index 0000000..6beda5d
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[fa][eb][fb][hb][dc][ec][fc][gc][hc][ic][jc][mc][nc][pc][qc][sc][fd][gd][hd][jd][kd][md][nd][pd][rd][sd][he][ke][me][ne][oe][pe][re][ff][if][jf][kf][of][qf][sf][ag][dg][eg][fg][gg][jg][kg][ng][og][pg][qg][rg][ah][bh][ch][eh][jh][kh][qh][ai][ci][ei][fi][gi][hi][ii][ki][pi][qi][ri][bj][cj][dj][ej][gj][hj][ij][jj][lj][hk][jk][lk][nk][ok][pk][qk][rk][sk][jl][kl][ml][nl][ol][im][jm][mm][pm][rm][gn][hn][in][jn][ln][mn][qn][bo][co][io][jo][no][oo][po][ro][so][ap][cp][dp][ep][np][op][sp][bq][dq][fq][gq][hq][mq][rq][ar][fr][qr][bs][cs][ds][es][fs][ps][qs]AB[ca][da][ea][ga][ha][ia][ka][bb][db][gb][ib][jb][mb][nb][ob][pb][qb][rb][sb][bc][cc][kc][lc][oc][rc][dd][ed][ld][od][ce][ee][fe][ge][ie][le][af][bf][df][ef][gf][hf][lf][mf][nf][bg][cg][hg][ig][lg][mg][sg][fh][gh][hh][ih][lh][nh][oh][ph][rh][sh][li][oi][si][aj][fj][mj][nj][oj][pj][qj][rj][sj][ak][bk][ck][dk][ek][fk][gk][ik][mk][fl][hl][il][ll][ql][gm][hm][km][lm][an][bn][cn][dn][fn][kn][nn][ao][do][eo][go][ho][ko][lo][mo][qo][fp][gp][hp][ip][jp][mp][pp][qp][rp][iq][lq][nq][oq][pq][sq][gr][hr][jr][nr][pr][gs][is][os]PL[W])
diff --git a/regression/games/blunder21.sgf b/regression/games/blunder21.sgf
new file mode 100644 (file)
index 0000000..eeb92ea
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[4.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[fa][la][ma][eb][fb][hb][kb][lb][rb][sb][dc][gc][ic][jc][kc][mc][nc][pc][qc][sc][cd][dd][ed][fd][hd][pd][rd][de][fe][ge][ke][le][qe][cf][gf][lf][of][pf][qf][fg][gg][hg][kg][lg][mg][ng][eh][ih][jh][kh][mh][qh][ci][gi][ji][li][mi][ej][gj][hj][mj][qj][rj][bk][gk][ik][mk][nk][ok][rk][sk][bl][cl][il][jl][kl][ol][sl][am][cm][em][hm][im][jm][lm][om][rm][sm][an][cn][dn][in][kn][ln][on][pn][qn][bo][eo][ho][io][jo][ko][mo][no][po][ap][cp][ep][fp][gp][hp][ip][mp][np][pp][bq][cq][eq][hq][lq][oq][pq][qq][ar][br][hr][or][os][ps][qs]AB[aa][ba][ca][da][ea][na][ra][cb][db][mb][ob][pb][qb][ac][cc][ec][lc][oc][bd][id][jd][kd][ld][md][nd][od][be][ce][ee][he][je][me][oe][pe][df][ef][ff][hf][jf][kf][mf][nf][dg][eg][ig][jg][dh][fh][gh][hh][oh][di][fi][hi][ii][ki][aj][bj][dj][ij][jj][kj][lj][oj][ak][ck][dk][hk][jk][lk][qk][al][dl][fl][gl][hl][ll][ml][nl][ql][rl][dm][gm][mm][qm][en][fn][gn][hn][mn][nn][rn][sn][co][do][fo][go][lo][qo][ro][dp][jp][kp][lp][qp][sp][dq][fq][gq][iq][mq][nq][rq][sq][cr][dr][er][gr][ir][lr][mr][nr][pr][qr][rr][bs][hs][ns][rs][ss]PL[B])
diff --git a/regression/games/blunder22.sgf b/regression/games/blunder22.sgf
new file mode 100644 (file)
index 0000000..2dcd950
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-10-21]
+SY[Cgoban 1.9.12]TM[5:00:00(5x1:00)];PL[W]
+AW[ab][bb][hb][ib][bc][cc][dc][ec][fc][gc][hc][ae][ce][af][bf][df][cg][dg][bh][ch][dh][di]
+AB[ac][ic][ad][bd][cd][dd][ed][fd][gd][hd][id][be][de][fe][ef][ff][ag][eg][ah][eh][fh][ci][fi]
+;W[cf];B[bi];W[ai];B[bi];W[ci];B[ai];W[bg];B[ah];W[ai];B[bi];W[tt];
+B[ai]
+)
diff --git a/regression/games/blunder23.sgf b/regression/games/blunder23.sgf
new file mode 100644 (file)
index 0000000..b3793bf
--- /dev/null
@@ -0,0 +1,21 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.42]
+GN[tactics07]
+PB[GNU Go 3.3.11 (random seed 1738578164)]
+PW[GNU Go 3.3.11 (random seed 1738578164)]
+AW[bo][cb][cn][co][cp][da][dd][df][dh][di][dm][dn][dp][eb][ec][eh][ej]
+[ek][fd][fe][gf][gk][gl][gn][go][hf][hj][hl][hn][ih][ii][ik][ip][jh][jj]
+[jl][kc][ki][km][ko][lb][lc][lh][lj][ll][lm][lo][lp][lq][mc][md][mg][ml]
+[mn][mo][mq][nc][ne][nf][nh][nj][nk][nq][nr][oc][od][oe][og][oi][oj][ol]
+[pe][pg][pk][pl][pm][po][pp][qg][qj][qk][qm][qp][qq][qs][rk][rn][rr][rs]
+AB[bp][bq][cq][do][dq][ea][ei][eo][ep][fa][fb][fc][fg][fh][fi][fj][fm]
+[fn][fo][fq][gd][gj][gp][hd][hg][hh][ho][ib][ie][if][ig][il][im][in][ir]
+[ja][jc][jd][jg][jo][jp][kb][kd][kf][kh][kn][kq][la][le][lf][lg][lr][mb]
+[mf][mm][mp][mr][nb][nl][nn][np][ns][ob][of][om][on][oo][op][oq][or][pa]
+[pc][pd][pf][pi][pj][pn][pq][pr][qb][qc][qe][qf][qi][ql][qr][rg][ri][rj]
+[rl][sk][sl]
+)
diff --git a/regression/games/blunder24.sgf b/regression/games/blunder24.sgf
new file mode 100644 (file)
index 0000000..3f5f08b
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[9]
+GN[GNU Go 3.5.6 load and print]
+DT[2004-05-27]
+KM[4.5]RU[Japanese]AP[GNU Go:3.5.6]PL[B]
+AW[ga][bb][cb][db][fb][gb][ac][bc][dc][ec][ed][gd][de][fe][he][bf][cf][df][cg][dg][gg][dh][eh][fh][gh][hh][ai][di][fi]
+AB[ha][hb][cc][fc][gc][hc][ad][bd][cd][dd][fd][hd][be][ee][af][ef][ff][gf][hf][ag][bg][eg][fg][hg][bh][ch][ih][ci][hi][ii]
+)
diff --git a/regression/games/blunder25.sgf b/regression/games/blunder25.sgf
new file mode 100755 (executable)
index 0000000..2f72070
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.10 load and print]
+DT[2007-12-01]
+KM[-17.5]HA[0]RU[Japanese]AP[GNU Go:3.7.10]AW[da][ea][ia][cb]
+[db][fb][hb][ib][ec][gc][ic][kc][ed][jd][sd][de][je][le][pe][qe]
+[re][se][cf][df][jf][kf][lf][mf][pf][bg][kg][mg][ng][pg][ah][ch]
+[lh][nh][ph][ei][fi][gi][hi][ki][qi][bj][cj][dj][hj][jj][kj][mj]
+[qj][rj][ak][ek][ik][lk][pk][qk][bl][cl][el][fl][nl][rl][cm][dm]
+[em][jm][km][nm][om][rm][dn][hn][in][jn][ln][mn][nn][on][pn][rn]
+[go][io][mo][ro][so][hp][jp][op][pp][qp][rp][dq][fq][gq][jq][kq]
+[lq][pq][ar][cr][dr][er][lr][mr][bs][cs][ls]
+AB[ba][ca][ja][bb][jb][lb][cc][dc][hc][jc][lc][rc][sc][bd][dd]
+[id][kd][ld][pd][qd][rd][be][ce][ie][ke][me][ne][oe][af][bf][nf]
+[of][ag][jg][og][mh][oh][li][mi][ni][oi][pi][ej][fj][gj][lj][pj]
+[gk][hk][jk][kk][nk][ok][rk][al][gl][il][jl][kl][ll][ml][ol][pl]
+[ql][am][bm][fm][hm][im][lm][pm][qm][cn][en][gn][kn][qn][bo][do]
+[fo][jo][ko][lo][no][qo][dp][ep][fp][gp][kp][lp][mp][np][sp][aq]
+[bq][cq][eq][mq][nq][oq][qq][rq][sq][br][nr][pr][qr][ms][ns]
+PL[W]
+)
diff --git a/regression/games/blunder3.sgf b/regression/games/blunder3.sgf
new file mode 100644 (file)
index 0000000..d3c65fc
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.236 (level 10) ascii]HA[0]KM[0.5]GN[GNU Go 2.7.236 ascii Random Seed 991442123] 
+LB[pd:75]
+C[Value of move: 75]
+;B[pd];W[cd];B[dp];W[qp];B[ed];W[dg];B[cc];W[dd];B[dc];W[ee]
+;B[fd];W[bc];B[op];W[cn];B[fq];W[dk];B[qq];W[pn];B[rp];W[qo]
+;B[pq];W[ro];B[kq];W[hc];B[pj];W[qf];B[bb];W[bd];B[pf];W[qe]
+;B[pe];W[pg];B[og];W[ph];B[nj];W[oh];B[ng];W[qd];B[ko];W[pc]
+;B[oc];W[pb];B[bo];W[bn];B[fo];W[co];B[hn];W[cp];B[nn];W[ql]
+;B[ji];W[nh];B[lc];W[mg];B[nd];W[ob];B[mj];W[fb];B[eb];W[fc]
+;B[ec];W[gd];B[fe];W[ef];B[jc];W[id];B[he];W[ie];B[ge];W[hd]
+;B[qi];W[nf];B[cq];W[bp];B[rq];W[nc];B[rk];W[rl];B[sl];W[sm]
+;B[hk];W[ol];B[ml];W[od];B[pk];W[pl];B[om];W[on];B[ib];W[hb]
+;B[jf];W[if];B[hg];W[ig];B[jg];W[ih];B[hi];W[hh];B[gh];W[ii]
+;B[jh];W[gi];B[gg];W[hj];B[ab];W[ik];B[kd];W[jm];B[in];W[jj]
+;B[fh];W[di];B[lf];W[mf];B[hl];W[nm];B[so];W[rn];B[mn];W[lm]
+;B[mm];W[pm];B[kj];W[kk];B[li];W[qk];B[en];W[rj];B[dm];W[cm]
+;B[bq];W[lk];B[nl];W[lj];B[mi];W[pi];B[qj];W[md];B[ri];W[sk]
+;B[ki];W[le];B[ke];W[lg];B[kf];W[dl];B[el];W[ek];B[fl];W[rh]
+;B[qh];W[rg];B[mb];W[si];B[il];W[jl];B[ld];W[me];B[ac];W[ad]
+;B[fi];W[do];B[fj];W[dq];B[dr];W[ep];B[er];W[fp];B[gj];W[hi]
+;B[ga];W[gb];B[kn];W[gp];B[hq];W[gq];B[gr];W[hp];B[ip];W[iq]
+;B[hr];W[io];B[jn];W[jp];B[ir];W[kp];B[lp];W[jr];B[kr];W[jq]
+;B[js];W[qg];B[ok];W[gn];B[go];W[ha];B[fa];W[ea];B[fa];W[cb]
+;B[ca];W[ic];B[jb];W[mc];B[eq];W[eo];B[oo];W[lq];B[lr];W[mq]
+;B[mr];W[lo];B[mp];W[nq];B[mo];W[nr];B[ln];W[ms];B[ks];W[oq]
+;B[is];W[aq];B[ar];W[ap];B[br];W[sp];B[sq];W[sn];B[dn];W[fn]
+;B[ho];W[em];B[nb];W[na];B[lb];W[ma];B[la];W[oa];B[fk];W[sp]
+;B[ei];W[ej];B[dh];W[ch];B[eh];W[ci];B[fm];W[gm];B[gl];W[eg]
+;B[hm];W[en];B[ff];W[pp];B[ns];W[os];B[pr];W[ps];B[rs];W[qs]
+;B[rr];W[or];B[jo];W[ip];B[da];W[ba];B[db];W[sr];B[so];W[km]
+;B[ll];W[sp];B[np];W[dp];B[so];W[mk];B[nk];W[sp];B[ce];W[de]
+;B[oi];W[cf];B[ni];W[lh];B[so];W[om];B[sp];W[po];B[fg];W[tt]
+;B[mh];W[tt];B[kg];W[tt];B[kh];W[of];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/blunder4.sgf b/regression/games/blunder4.sgf
new file mode 100644 (file)
index 0000000..af24092
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-08]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];PL[W]
+AW[ad][bd][cd][de][ee][bf][ff][dg][gg][hg][ig][fh]
+AB[bb][cb][ac][cc][dd][ed][fd][hd][fe][gf][hf][if]
+)
diff --git a/regression/games/blunder5.sgf b/regression/games/blunder5.sgf
new file mode 100644 (file)
index 0000000..b89fb6e
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-12]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ca][da][ea][fa][ga][ha][ab][bb][cb][hb][ib][dc][ec][ed][ce][de][ef][gf][bg][cg][dg][eg][fg][gg][ah][bh][gh][hh][ih]
+AB[db][eb][fb][gb][ac][bc][cc][gc][hc][ic][bd][dd][gd][ae][be][ee][fe][ge][he][ie][bf][cf][df][ff][hf][ag][hg][ig]
+)
diff --git a/regression/games/blunder6.sgf b/regression/games/blunder6.sgf
new file mode 100644 (file)
index 0000000..e5d1a3b
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-12]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];PL[W]
+AW[ba][ca][da][ea][fb][gb][bc][cc][dc][gc][bd][ed][gd][de][ee][ge][he][ie][cf][ff][hf][dg][fg][gg][hg][ig][dh][eh][ei]
+AB[ab][bb][cb][db][eb][ec][fc][ad][cd][dd][fd][be][ce][fe][bf][bg][cg][ch][fh][gh][hh][ih][ci][di][fi][hi]
+;W[ef];B[df]
+)
diff --git a/regression/games/blunder7.sgf b/regression/games/blunder7.sgf
new file mode 100644 (file)
index 0000000..c257e94
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-12]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ec][fc][gc][ad][bd][cd][dd][ed][gd][be][de][ge][he][ie][je][ke][le][me][af][bf][ag][cg][ah][dj][gj][hj][ij][jj][kj][lj][mj][ck][dk][ek][hk][al][bl][cl][el][fl][gl][hl]
+AB[fd][ce][ee][fe][cf][df][gf][hf][if][jf][kf][lf][mf][bg][dg][gg][bh][gh][bi][ci][di][gi][hi][ii][ji][ki][li][mi][aj][cj][ej][fj][bk][fk][gk]
+)
diff --git a/regression/games/blunder8.sgf b/regression/games/blunder8.sgf
new file mode 100644 (file)
index 0000000..dc53d9b
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-13]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ca][bb][bc][cc][dc][fc][bd][fd][gd][hd][be][ce][de][ee][fe][ff][cg][fg][fh][fi]
+AB[ea][cb][db][eb][fb][ec][gc][hc][cd][dd][ed][id][ge][he][ie][gf][gg][ig][gh][hh][gi]
+)
diff --git a/regression/games/blunder9.sgf b/regression/games/blunder9.sgf
new file mode 100644 (file)
index 0000000..fb86b02
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-13]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[aa][ba][ca][ab][ib][ac][bc][ec][hc][bd][ed][fd][gd][hd][be][ce][de][ee][cg][gg]
+AB[da][ha][bb][cb][db][eb][fb][hb][dc][fc][gc][cd][dd]
+)
diff --git a/regression/games/boardspace/GNUGo-GoFigure0.1-200503171816.sgf b/regression/games/boardspace/GNUGo-GoFigure0.1-200503171816.sgf
new file mode 100644 (file)
index 0000000..0897014
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GoFigure (GoFigure 0.1)]WR[NR]
+PB[GNUGo]BR[NR]
+PC[cg_nngs]DT[2005-03-17]AP[gnugoclient:3.0]
+RE[W+17.5]
+;B[gc]BL[599];W[fd]WL[590];B[gd]BL[593];W[fe]WL[589];B[ge]BL[591]
+;W[gg]WL[577];B[fc]BL[588];W[cd]WL[576];B[cb]BL[585];W[cg]WL[532]
+;B[ff]BL[576];W[gf]WL[491];B[ee]BL[563];W[eg]WL[438];B[de]BL[556]
+;W[ce]WL[418];B[he]BL[552];W[df]WL[413];B[ih]BL[549];W[dc]WL[378]
+;B[db]BL[546];W[ed]WL[364];B[ec]BL[546];W[dd]WL[354];B[bc]BL[546]
+;W[hh]WL[346];B[af]BL[545];W[ig]WL[334];B[hf]BL[543];W[hg]WL[332]
+;B[ah]BL[542];W[bh]WL[324];B[bf]BL[540];W[be]WL[312];B[if]BL[540]
+;W[bd]WL[307];B[ad]BL[539];W[ae]WL[302];B[ac]BL[539];W[ef]WL[300]
+;B[cc]BL[539];W[]WL[298]C[final_score: W+17.5
+A4 removed
+F4 removed
+A2 removed
+J2 removed]
+)
diff --git a/regression/games/boardspace/GNUGo-GoFigure0.1-200503181316.sgf b/regression/games/boardspace/GNUGo-GoFigure0.1-200503181316.sgf
new file mode 100644 (file)
index 0000000..0abcb2d
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GoFigure (GoFigure 0.1)]WR[NR]
+PB[GNUGo]BR[NR]
+PC[cg_nngs]DT[2005-03-18]AP[gnugoclient:3.0]
+RE[W+6.5]
+;B[ee]BL[599]WL[594];W[dc];B[fc]BL[596];W[fg]WL[591];B[ge]BL[590]
+;W[cg]WL[589];B[ce]BL[586];W[hf]WL[583];B[eb]BL[579];W[bf]WL[581]
+;B[cb]BL[572];W[bd]WL[473];B[he]BL[567];W[gf]WL[440];B[cc]BL[561]
+;W[ie]WL[419];B[id]BL[557];W[if]WL[397];B[hc]BL[554];W[bc]WL[385]
+;B[be]BL[552];W[ae]WL[374];B[eg]BL[548];W[eh]WL[314];B[ff]BL[535]
+;W[gg]WL[294];B[dg]BL[533];W[dh]WL[262];B[cf]BL[531];W[bg]WL[249]
+;B[bb]BL[530];W[cd]WL[244];B[de]BL[527];W[dd]WL[242];B[db]BL[526]
+;W[ed]WL[237];B[fd]BL[526];W[ab]WL[232];B[ba]BL[525];W[ac]WL[230]
+;B[ec]BL[525];W[af]WL[226];B[aa]BL[525];W[ad]WL[224];B[]BL[524];W[]
+C[final_score: W+6.5])
+
diff --git a/regression/games/boardspace/GNUGo-GoFigure0.1-200503181614.sgf b/regression/games/boardspace/GNUGo-GoFigure0.1-200503181614.sgf
new file mode 100644 (file)
index 0000000..213ff35
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GoFigure (GoFigure 0.1)]WR[NR]
+PB[GNUGo]BR[NR]
+PC[cg_nngs]DT[2005-03-18]AP[gnugoclient:3.0]
+RE[W+8.5]
+;B[fd]BL[599];W[gg]WL[594];B[df]BL[590];W[cd]WL[592];B[ge]BL[587]
+;W[he]WL[591];B[hd]BL[576];W[bf]WL[589];B[hf]BL[569];W[hg]WL[588]
+;B[dc]BL[561];W[cc]WL[579];B[dd]BL[550];W[dh]WL[528];B[cb]BL[545]
+;W[bb]WL[486];B[db]BL[530];W[if]WL[437];B[ie]BL[526];W[ig]WL[391]
+;B[ce]BL[523];W[be]WL[341];B[dg]BL[518];W[eh]WL[291];B[cg]BL[517]
+;W[ff]WL[268];B[ch]BL[516];W[ba]WL[243];B[bg]BL[515];W[gf]WL[233]
+;B[cf]BL[514];W[eg]WL[217];B[af]BL[513];W[ad]WL[206];B[di]BL[513]
+;W[ei]WL[203];B[ci]BL[512];W[he]WL[184];B[id]BL[510];W[ee]WL[180]
+;B[ef]BL[507];W[fe]WL[155];B[de]BL[492];W[gd]WL[124];B[gc]BL[484]
+;W[ge]WL[72];B[hc]BL[477];W[ca]WL[65];B[ed]BL[474];W[da]WL[62];B[fb]
+BL[469];W[ea]WL[60];B[eb]BL[469];W[fa]WL[56];B[ga]BL[469];W[bc]WL[54]
+;B[ag]BL[469];W[ae]WL[50];B[]BL[468];W[]C[final_score: W+8.5])
+
diff --git a/regression/games/boardspace/GNUGo-GoFigure0.1-200503302359.sgf b/regression/games/boardspace/GNUGo-GoFigure0.1-200503302359.sgf
new file mode 100644 (file)
index 0000000..a506a9f
--- /dev/null
@@ -0,0 +1,19 @@
+
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GoFigure (GoFigure 0.1)]WR[NR]
+PB[GNUGo]BR[NR]
+PC[cg_nngs]DT[2005-03-30]AP[gnugoclient:3.0]
+RE[W+2.5]
+;B[gd]BL[599];W[cg]WL[592];B[fg]BL[596];W[ed]WL[591];B[cd]BL[593]
+;W[de]WL[590];B[fc]BL[590];W[ce]WL[388];B[cb]BL[585];W[bd]WL[289]
+;B[bc]BL[580];W[eh]WL[203];B[ge]BL[570];W[fh]WL[164];B[be]BL[564]
+;W[gg]WL[106];B[bf]BL[562];W[hf]WL[38];B[he]BL[561];W[bg]WL[5];B[ff]
+BL[549];W[af]WL[593]OW[24];B[ae]BL[540];W[ec]WL[485]OW[23];B[eb]
+BL[528];W[ag]WL[403]OW[22];B[gf]BL[515];W[hg]WL[375]OW[21];B[dc]
+BL[513];W[dd]WL[358]OW[20];B[cc]BL[510];W[cf]WL[343]OW[19];B[ad]
+BL[510];W[ie]WL[326]OW[18];B[id]BL[510];W[if]WL[299]OW[17];B[eg]
+BL[509];W[dg]WL[282]OW[16];B[ef]BL[509];W[fd]WL[259]OW[15];B[gb]
+BL[509];W[fe]WL[256]OW[14];B[fb]BL[509];W[ee]WL[254]OW[13];B[hb]
+BL[508];W[df]WL[251]OW[12];B[]BL[508];W[]C[final_score: W+2.5])
+
diff --git a/regression/games/boardspace/GoFigure0.1-GNUGo-200503211944.sgf b/regression/games/boardspace/GoFigure0.1-GNUGo-200503211944.sgf
new file mode 100644 (file)
index 0000000..f95fa4c
--- /dev/null
@@ -0,0 +1,19 @@
+
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GNUGo]WR[NR]
+PB[GoFigure (GoFigure 0.1)]BR[NR]
+PC[cg_nngs]DT[2005-03-21]AP[gnugoclient:3.0]
+RE[B+9.5]
+;B[dg]BL[595];W[cd]WL[599];B[gc]BL[593];W[gg]WL[598];B[ec]BL[591]
+;W[bg]WL[594];B[cb]BL[589];W[fe]WL[590];B[ee]BL[588];W[gd]WL[578]
+;B[fd]BL[586];W[ge]WL[551];B[ch]BL[585];W[hc]WL[540];B[bh]BL[583]
+;W[gb]WL[531];B[fc]BL[582];W[eh]WL[519];B[fb]BL[581];W[hb]WL[499]
+;B[eg]BL[579];W[fg]WL[495];B[dh]BL[577];W[fi]WL[490];B[ga]BL[576]
+;W[ha]WL[484];B[ff]BL[575];W[gf]WL[473];B[ef]BL[573];W[fa]WL[463]
+;B[ea]BL[570];W[di]WL[453];B[ci]BL[564];W[ei]WL[448];B[ga]BL[561];W[]
+WL[443];B[fa]BL[558];W[]WL[440];B[]C[final_score: B+9.5
+C6 removed
+B3 removed]
+)
+
diff --git a/regression/games/break_in.sgf b/regression/games/break_in.sgf
new file mode 100644 (file)
index 0000000..5ebf1fb
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-05-23]
+SY[Cgoban 1.9.12]TM[3:00(5x1:00)];AW[ec][fc][gd][gf][gh]
+AB[dc][dd][ed][fd][df][eg]
+)
diff --git a/regression/games/bretz.sgf b/regression/games/bretz.sgf
new file mode 100644 (file)
index 0000000..2a658fe
--- /dev/null
@@ -0,0 +1,47 @@
+(;GM[1]FF[3]
+SZ[19]
+PB[GnuGo]
+PW[bretz]
+KM[0.5]HA[9]PC[NNGS]
+DT[2001/10/10 15:38:55 UT]
+BR[14k]WR[4k]
+RE[has adjourned.]
+;AB[dp][dj][dd][jp][jj][jd][pp][pj][pd];W[tt];B[km];W[tt];B[qm];W[tt];
+B[mp];W[tt];B[nm];W[nc];B[oc];W[oe];B[pg]C[Q15
+];W[pe];B[nb];W[mc];
+B[gc];W[cd];B[ce];W[dc];B[ed];W[be];B[bd];W[cc];B[bf];W[ec];B[fq]
+C[F16
+];W[de];B[cf];W[fc];B[fd];W[gd];B[hd];W[ge];B[gb];W[ee];B[if];
+W[cn];B[bo];W[en];B[gn];W[dl];B[ck];W[co];B[cp];W[bn];B[bp];W[dh];
+B[cl];W[fj];B[ch];W[ci];B[di];W[cg];B[bh];W[dg];B[do]C[B13
+];W[bg];
+B[dn];W[dm];B[ag];W[bi];B[ah];W[ae];B[ad];W[bc];B[af];W[fl];B[cm];
+W[ei];B[fn];W[hq];B[hp];W[gq];B[eh];W[df];B[ai];W[fr];B[fh];W[hh];
+B[hj];W[gi];B[fi];W[ej];B[gm]C[
+];W[gj];B[qd];W[qe];B[rf]C[!S14
+];
+W[re];B[rd];W[se];B[nf];W[rc];B[ne];W[od];B[pc];W[qb];B[mb];W[pb];
+B[ob];W[lc];B[sd];W[lb];B[qf];W[nd];B[sf];W[og];B[of];W[pf];B[oh];
+W[lh];B[ng];W[jh];B[mi];W[le];B[kf];W[lf];B[ic];W[jb];B[kg];W[ke];
+B[je];W[jg];B[jf];W[kh];B[he];W[ib];B[ir];W[iq];B[hr]C[K3
+];W[jq];
+B[gr];W[eq];B[fp];W[dr];B[jr];W[kq];B[es];W[gp];B[kp]C[E2
+];W[er];
+B[kr];W[lq];B[lr];W[go];B[em];W[dk];B[fo];W[cj];B[bj];W[bk];B[bl];
+W[aj];B[al]C[A6
+];W[fs];B[cs];W[cr];B[hk];W[lp];B[mq];W[ko];B[lo];
+W[ln];B[ho]C[N5
+];W[mo];B[op];W[ip];B[jo];W[io];B[jn];W[hn];B[li];
+W[no];B[lm];W[qq];B[qp];W[rp];B[pr];W[qr];B[ro];W[pq];B[or];W[np]
+C[O3|P3
+];B[in];W[nq];B[oq];W[mr];B[ho];W[br];B[ls];W[gs];B[hs];W[mn];
+B[kn];W[sq];B[rr];W[rs];B[sr];W[ql];B[qs]C[!R1
+];W[ps];B[ms];W[rn];
+B[nr];W[qo];B[rm];W[po];B[oo];W[qn];B[pn];W[so];B[pl]C[P6|P7|Q7
+];
+W[on];B[qk];W[os];B[mq];W[js];B[pm];W[nn];B[ii];W[hg];B[om];W[qs];
+B[mm];W[ns];B[mr];W[ks];B[lo];W[qg];B[mp];W[qh];B[ri];W[rg];B[bq];
+W[ma];B[ar];W[bs];B[ph];W[pa];B[qi];W[ae];B[rh];W[sg];B[me];W[md];
+B[ki];W[mh];B[nh];W[mg];B[ep];W[ds];B[gl];W[el];B[fm];W[be];B[am];
+W[ak];B[an];W[gk];B[ih];W[ig]C[----------       Game has adjourned.]
+)
diff --git a/regression/games/buzco1.sgf b/regression/games/buzco1.sgf
new file mode 100644 (file)
index 0000000..1ece42f
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[3]
+VieW[]SZ[19]
+PB[GnuGo]
+PW[buzco]
+KM[0.5]HA[3]USer[bump@match.Stanford.EDU]PC[NNGS]
+DT[2001/10/01 22:03:45 UT]
+BR[14k]WR[14k]
+RE[Black resigns. W 133.5 B 81.0]
+;AB[dp][pd][dd]C[..........       Handicap 3];W[pp];B[nq];W[jp];B[qn];
+W[np];B[mp];W[no];B[qq];W[qp];B[pq];W[oq];B[hq]C[P2
+];W[jq];B[or];
+W[op];B[mr];W[mo];B[dj];W[lp];B[jd];W[qj];B[qg];W[rm];B[ho];W[fc];
+B[ec];W[eb];B[gd]C[D19|F16
+];W[dc];B[cc]C[E16
+];W[ed];B[cd];W[cb];
+B[df];W[ef];B[cg]C[E13
+];W[fd];B[eg];W[ff];B[nc];W[cn];B[dn];W[dm];
+B[en];W[co];B[cp];W[do];B[eo];W[dl];B[qe];W[dh];B[ch];W[fg];B[di];
+W[eh];B[fl];W[dg];B[bm];W[cm];B[bl];W[ck];B[bj];W[bk];B[bb];W[ba];
+B[bp];W[bo];B[ao];W[an];B[bn]C[C10|C11|E9|A4
+];W[al];B[am];W[ak];B[an]
+;W[bi];B[cj];W[aj];B[bh];W[ai];B[dk];W[ci]C[
+];B[cf]C[E8|E9
+];W[ek];
+B[ah];W[cl];B[el];W[ap];B[ej];W[fk];B[fj];W[gk];B[gj];W[gl];B[bm];
+W[bq];B[hi];W[fn];B[fo];W[em];B[eq];W[hg];B[ji];W[jg];B[li];W[oi];
+B[gc];W[gb];B[mi]C[!N11
+];W[ng];B[mq];W[ko];B[ld];W[lq];B[hb];W[lr];
+B[ns];W[ls];B[ms];W[lf];B[mk];W[ok];B[mm];W[kl];B[il];W[in];B[hk];
+W[hl];B[ij];W[im];B[hm];W[gm];B[ih];W[ig];B[hn];W[jk];B[ml];W[jj];
+B[ki];W[ik];B[om];W[pn];B[rp];W[ro];B[rq];W[qm];B[ri];W[rj];B[of];
+W[nf];B[cr];W[cq];B[br];W[dq];B[dr];W[ep];B[fp];W[fq];B[dp];W[er];
+B[ep];W[fr];B[gq];W[qi];B[ab];W[qh];B[rh];W[pg];B[qf];W[pf];B[hd];
+W[ie];B[ga];W[fb];B[ir];W[jr];B[oe];W[pe];B[og];W[ph];B[ni];W[nh];
+B[ne];W[me];B[gf];W[hf];B[ge];W[gg];B[md];W[si];B[sg];W[id];B[ic];
+W[ke];B[kd];W[oh];B[gn];W[jl];B[so];W[sn];B[sp];W[iq];B[hs];W[hp];
+B[io];W[jo];B[gp];W[ip];B[fm];W[fn];B[fm];W[fl];B[ar];W[fn];B[go];
+W[cp];B[gr];W[js];B[is];W[sj];B[od];W[sh];B[rg];W[fe];B[fa];W[ea];
+B[ha];W[ca];B[je];W[jf];B[le];W[kf];B[mf];W[mg];B[me];W[de];B[ce];
+W[fm];B[ee];W[he];B[hc];W[de];B[sm];W[rn];B[ee];W[aa];B[bd];W[de];
+B[da];W[db];B[ee];W[ad];B[ae];W[de];B[nj];W[lj];B[ee];W[ac];B[bc];
+W[oj];B[de];W[aq];B[gs];W[tt];B[kj];W[lk];B[tt]W[tt]
+C[..........       W passed133.5 B 81.0]
+)
diff --git a/regression/games/century21-2002/gnugo-go4.sgf b/regression/games/century21-2002/gnugo-go4.sgf
new file mode 100644 (file)
index 0000000..2cb923e
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+RU[Japanese]
+PC[Edmondton]
+RE[B+52.5]
+SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.3.5]
+PB[Go4++]
+GN[White (W) vs. Black (B)]
+DT[2002-07-28]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[dp];W[pd];B[cc];W[pq];B[qf];
+W[cn];B[fq];W[bp];B[cq];W[ck];B[kq];W[po];B[qi];W[fd];B[rd];W[ce];
+B[fb];W[ch];B[ql];W[mq];B[ro];W[en];B[ip];W[gm];B[ig];W[nd];B[hj];
+W[qc];B[rc];W[og];B[lf];W[kc];B[ld];W[lc];B[id];W[ee];B[bq];W[kr];
+B[jr];W[lr];B[rb];W[mc];B[pb];W[ib];B[bd];W[jq];B[bf];W[iq];B[im];
+W[kp];B[bh];W[bi];B[cg];W[eg];B[ci];W[rq];B[bj];W[nm];B[lm];W[lh];
+B[jj];W[lj];B[kh];W[ki];B[jh];W[mg];B[mf];W[oe];B[oj];W[kk];B[jl];
+W[ml];B[hc];W[dh];B[di];W[hf];B[eh];W[fh];B[ei];W[dg];B[cf];W[df];
+B[hg];W[gg];B[ge];W[gf];B[je];W[dl];B[bo];W[fe];B[hp];W[hs];B[gr];
+W[hq];B[gd];W[bn];B[mn];W[co];B[hb];W[qb];B[qa];W[nf];B[cp];W[ao];
+B[aq];W[me];B[ph];W[bk];B[qn];W[le];B[ol];W[nk];B[cd];W[kf];B[jb];
+W[gq];B[ok];W[fr];B[er];W[fs];B[es];W[gs];B[fp];W[fk];B[gj];W[fj];
+B[fi];W[gp];B[gh];W[go];B[kb];W[io];B[mi];W[li];B[mj];W[mk];B[hn];
+W[ho];B[qp];W[fo];B[qq];W[qr];B[pp];W[oq];B[rp];W[rr];B[qd];W[pc];
+B[ob];W[pf];B[pg];W[op];B[ji];W[pn];B[pm];W[nn];B[mo];W[kd];B[ep];
+W[no];B[aj];W[jc];B[ic];W[jf];B[if];W[mm];B[kn];W[lo];B[ko];W[lp];
+B[ln];W[in];B[hm];W[hl];B[hk];W[gl];B[jk];W[il];B[jo];W[jm];B[jn];
+W[gn];B[kl];W[jp];B[ma];W[nb];B[na];W[mb];B[lb];W[oc];B[ej];W[oh];
+B[oi];W[nj];B[kj];W[ni];B[ek];W[el];B[gk];W[fl];B[kg];W[lg];B[ak];
+W[al];B[ik];W[qo];B[rn];W[om];B[sq];W[sr];B[sp];W[ap];B[bl];W[am];
+B[dk];W[cj];B[ai];W[cl];B[do];W[lk];B[dn];W[dm];B[jd];W[ke];B[mp];
+W[np];B[qe];W[pe];B[ll];W[jg];B[ir];W[is];B[js];W[hr];B[eo];W[dj];
+B[nl];W[im];B[km];W[tt];B[tt]
+)
diff --git a/regression/games/century21-2002/gnugo-katsunari.sgf b/regression/games/century21-2002/gnugo-katsunari.sgf
new file mode 100644 (file)
index 0000000..c910d0b
--- /dev/null
@@ -0,0 +1,65 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-07-28]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[pd];W[dd];B[pq]
+;W[dp];B[fq];W[dn];B[jp];W[qn]
+;B[qp];W[on];B[ci];W[qf];B[nc]
+;W[rd];B[qc];W[qi];B[cf];W[fc]
+;B[cl];W[cn];B[bd];W[cc];B[nq]
+;W[lc];B[cq];W[rc];B[dq];W[ic]
+;B[pk];W[oj];B[ne];W[go];B[hq]
+;W[mn];B[fo];W[kn];B[fn];W[bl]
+;B[ck];W[bn];B[fk];W[ni];B[bp]
+;W[ef];B[rb];W[bc];B[ok];W[rn]
+;B[io];W[jl];B[nk];W[jk];B[lp]
+;W[ko];B[gn];W[be];B[ce];W[ae]
+;B[cd];W[ad];B[de];W[ee];B[kp]
+;W[cg];B[ed];W[fd];B[dc];W[bf]
+;B[dg];W[df];B[ch];W[bg];B[qj]
+;W[ri];B[bh];W[sq];B[rq];W[ng]
+;B[gl];W[gh];B[ld];W[kd];B[le]
+;W[kg];B[ke];W[jd];B[mc];W[lb]
+;B[cb];W[je];B[db];W[dd];B[bb]
+;W[mf];B[ec];W[ab];B[fb];W[ba]
+;B[ea];W[ca];B[gb];W[hj];B[da]
+;W[mb];B[nb];W[na];B[oa];W[ma]
+;B[pb];W[dh];B[jh];W[jf];B[gc]
+;W[gd];B[sp];W[di];B[ja];W[nf]
+;B[hd];W[he];B[ge];W[hf];B[fe]
+;W[hk];B[kh];W[gg];B[lo];W[ln]
+;B[gj];W[gi];B[qd];W[mj];B[re]
+;W[rf];B[qe];W[lf];B[mk];W[in]
+;B[ep];W[cm];B[bk];W[do];B[pf]
+;W[al];B[pi];W[pj];B[nj];W[oi]
+;B[kf];W[jg];B[ih];W[ii];B[dl]
+;W[lh];B[qh];W[ji];B[rh];W[qk]
+;B[rj];W[ph];B[pg];W[sh];B[sg]
+;W[si];B[qg];W[og];B[hn];W[im]
+;B[fi];W[dj];B[fh];W[fg];B[eh]
+;W[gk];B[em];W[fj];B[fl];W[ah]
+;B[bj];W[ai];B[ej];W[gj];B[ki]
+;W[ek];B[ak];W[jb];B[mi];W[ia]
+;B[rk];W[ql];B[lj];W[om];B[sn]
+;W[sm];B[dk];W[so];B[el];W[eg]
+;B[no];W[rp];B[nn];W[rr];B[nm]
+;W[qq];B[qr];W[rq];B[pr];W[pp]
+;B[op];W[po];B[mh];W[qs];B[nh]
+;W[oh];B[pl];W[ps];B[os];W[rs]
+;B[mg];W[rl];B[lg];W[or];B[of]
+;W[sj];B[oq];W[ns];B[me];W[sk]
+;B[lr];W[ll];B[pm];W[kk];B[pn]
+;W[oo];B[ol];W[qo];B[nr];W[os]
+;B[gf];W[ms];B[ls];W[mr];B[hg]
+;W[mq];B[np];W[ig];B[lq];W[hh]
+;B[mm];W[kj];B[li];W[lm];B[qm]
+;W[hl];B[rm];W[hm];B[hc];W[hb]
+;B[id];W[ie];B[lk];W[ml];B[bo]
+;W[nl];B[ek];W[ei];B[ga];W[jo]
+;B[ha];W[ib];B[gm];W[mo];B[mp]
+;W[bi];B[cj];W[ff];B[ag];W[af]
+;B[aj];W[ag];B[tt];W[ac];B[aa]
+;W[ba];B[ca];W[aa];B[tt];W[tt]
+)
diff --git a/regression/games/century21-2002/gnugo-tsgo.sgf b/regression/games/century21-2002/gnugo-tsgo.sgf
new file mode 100644 (file)
index 0000000..1010c78
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+RU[Japanese]
+PC[Edmondton]
+RE[W+67.5]
+SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.3.5]
+PB[TSGo]
+GN[White (W) vs. Black (B)]
+DT[2002-07-27]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[pq];W[dp];B[cd];W[qo];B[pc];
+W[op];B[mq];W[ec];B[fq];W[de];B[cn];W[ce];B[be];W[fp];B[hp];W[eq];
+B[fr];W[bf];B[ad];W[bc];B[gd];W[pe];B[cc];W[bd];B[bb];W[ae];B[ch];
+W[qc];B[qb];W[qd];B[qg];W[ql];B[qj];W[rb];B[er];W[ic];B[cq];W[he];
+B[kd];W[pb];B[cp];W[fn];B[ge];W[hn];B[gc];W[ob];B[mc];W[oq];B[oc];
+W[pr];B[nb];W[je];B[go];W[kq];B[fo];W[lp];B[do];W[fl];B[dl];W[pl];
+B[en];W[lo];B[jo];W[qq];B[ej];W[ip];B[jp];W[iq];B[jq];W[jr];B[hq];
+W[ir];B[hr];W[io];B[jn];W[km];B[jm];W[jl];B[ne];W[kk];B[ke];W[nj];
+B[nl];W[ok];B[oh];W[gn];B[pj];W[mh];B[on];W[mm];B[bg];W[ff];B[hl];
+W[lq];B[eg];W[db];B[cb];W[fb];B[hb];W[gf];B[hf];W[if];B[hg];W[ib];
+B[id];W[gb];B[jd];W[ie];B[ig];W[jg];B[jh];W[kg];B[hc];W[ha];B[kh];
+W[ea];B[lg];W[ef];B[fc];W[gk];B[ed];W[dd];B[ik];W[im];B[lh];W[nh];
+B[hm];W[rf];B[in];W[il];B[hk];W[ho];B[qf];W[re];B[qe];W[od];B[nd];
+W[gj];B[rg];W[ii];B[ml];W[nm];B[om];W[ol];B[dg];W[oi];B[mr];W[jj];
+B[lj];W[pi];B[ll];W[kl];B[lm];W[lk];B[mn];W[mk];B[lr];W[qi];B[rj];
+W[ri];B[og];W[kb];B[lb];W[mi];B[pf];W[li];B[ki];W[kj];B[ph];W[em];
+B[dm];W[ng];B[oe];W[pd];B[nc];W[mf];B[lf];W[me];B[nf];W[mg];B[po];
+W[no];B[qn];W[nn];B[ro];W[qp];B[rl];W[rm];B[qm];W[rk];B[rn];W[sl];
+B[rp];W[pm];B[rq];W[rr];B[pp];W[qr];B[os];W[pn];B[ek];W[el];B[oa];
+W[qa];B[hi];W[hj];B[gi];W[fi];B[fh];W[ih];B[gg];W[ei];B[gh];W[fj];
+B[di];W[eh];B[fg];W[ji];B[df];W[ee];B[fd];W[le];B[kf];W[ld];B[lc];
+W[kc];B[ci];W[jc];B[hd];W[ma];B[ja];W[na];B[ia];W[la];B[ga];W[dc];
+B[ka];W[pa];B[cf];W[hs];B[gs];W[is];B[qh];W[rd];B[sg];W[si];B[fk];
+W[gl];B[dk];W[dh];B[rh];W[sf];B[sh];W[af];B[ag];W[be];B[md];W[fa];
+B[ha];W[hh];B[jf];W[fe];B[tt];W[oa];B[tt];W[mb];B[jb];W[tt]
+)
diff --git a/regression/games/century21-2002/goint-gnugo.sgf b/regression/games/century21-2002/goint-gnugo.sgf
new file mode 100644 (file)
index 0000000..c718191
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+RU[Japanese]
+PC[Edmondton]
+RE[W+114.5]
+SZ[19]HA[0]KM[5.5]
+PW[Go Intellect]
+PB[GNU Go 3.3.5]
+GN[White (W) vs. Black (B)]
+DT[2002-07-28]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[pd];W[qp];B[dc];W[cp];B[ep];
+W[eq];B[fq];W[dq];B[fp];W[cn];B[jq];W[nc];B[op];W[oq];B[nq];W[pq];
+B[np];W[qn];B[de];W[qf];B[oe];W[kc];B[cj];W[pj];B[ej];W[gd];B[pf];
+W[pg];B[qe];W[of];B[ne];W[pb];B[om];W[rf];B[mm];W[ip];B[le];W[iq];
+B[mh];W[mf];B[me];W[pe];B[nf];W[cl];B[pf];W[og];B[ng];W[jp];B[kq];
+W[jr];B[kp];W[em];B[fl];W[jn];B[er];W[fm];B[hr];W[ir];B[je];W[dr];
+B[hc];W[jd];B[jb];W[gc];B[gb];W[fb];B[kb];W[qc];B[hb];W[fc];B[gf];
+W[go];B[lc];W[hd];B[id];W[ie];B[jf];W[ic];B[ib];W[ed];B[dd];W[hf];
+B[fe];W[hg];B[ee];W[gg];B[re];W[eg];B[fg];W[fh];B[ff];W[dh];B[gh];
+W[fi];B[gi];W[kd];B[ih];W[ld];B[mc];W[md];B[nb];W[ob];B[mb];W[nd];
+B[oc];W[od];B[pc];W[pe];B[qd];W[rb];B[qb];W[rc];B[oa];W[qa];B[pf];
+W[cf];B[pe];W[fj];B[ei];W[hh];B[eh];W[ii];B[be];W[ek];B[gj];W[fk];
+B[dg];W[dj];B[qg];W[di];B[qh];W[hk];B[cg];W[ch];B[qk];W[bg];B[rm];
+W[db];B[cb];W[qm];B[nj];W[ec];B[rl];W[rn];B[kr];W[jh];B[nr];W[pl];
+B[pk];W[or];B[df];W[bf];B[bd];W[bb];B[ca];W[ke];B[kf];W[kk];B[ol];
+W[li];B[sn];W[so];B[sm];W[rp];B[da];W[fa];B[ll];W[lh];B[km];W[jm];
+B[ql];W[ko];B[lo];W[kl];B[kn];W[jo];B[eb];W[mi];B[ni];W[lg];B[lf];
+W[hq];B[mg];W[fr];B[gr];W[es];B[po];W[ce];B[cd];W[ns];B[ms];W[os];
+B[lm];W[ea];B[qo];W[ro];B[af];W[bh];B[rd];W[ks];B[ls];W[js];B[sc];
+W[sb];B[ig];W[sd];B[rg];W[lk];B[se];W[mk];B[nk];W[ml];B[mq];W[nl];
+B[nm];W[id];B[pm];W[pn];B[on];W[ag];B[pp];W[qr];B[if];W[hi];B[ge];
+W[he];B[ae];W[ga];B[mj];W[lj];B[kg];W[kh];B[ha];W[gq];B[db];W[bc];
+B[ba];W[ac];B[sc];W[ck];B[sd];W[bj];B[fd];W[pa];B[na];W[eh];B[aa];
+W[jc];B[jg];W[ef];B[tt];W[tt]
+)
diff --git a/regression/games/century21-2002/golois-gnugo.sgf b/regression/games/century21-2002/golois-gnugo.sgf
new file mode 100644 (file)
index 0000000..98a918d
--- /dev/null
@@ -0,0 +1,63 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-07-27]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[pd];W[cc];B[pq]
+;W[cp];B[eq];W[qj];B[do];W[jc]
+;B[co];W[cj];B[bp];W[jq];B[qo]
+;W[qc];B[qd];W[pc];B[oc];W[ep]
+;B[dp];W[fp];B[ob];W[mq];B[dd]
+;W[dc];B[ed];W[ec];B[ql];W[qg]
+;B[lc];W[gc];B[ef];W[rd];B[re]
+;W[sd];B[se];W[od];B[pe];W[oe]
+;B[of];W[pf];B[qe];W[nf];B[og]
+;W[rb];B[ne];W[dh];B[pb];W[cm]
+;B[he];W[eg];B[fq];W[lf];B[gp]
+;W[en];B[me];W[go];B[hp];W[qb]
+;B[sb];W[ho];B[ph];W[ip];B[qh]
+;W[or];B[fd];W[cq];B[bq];W[cr]
+;B[an];W[hd];B[ff];W[ie];B[gg]
+;W[jf];B[mf];W[lg];B[hf];W[df]
+;B[gi];W[fi];B[fh];W[ig];B[ei]
+;W[pi];B[fj];W[oi];B[ii];W[ek]
+;B[cd];W[fk];B[br];W[cs];B[hl]
+;W[hm];B[io];W[jo];B[in];W[il]
+;B[im];W[rg];B[gm];W[hq];B[gq]
+;W[fn];B[hk];W[jl];B[km];W[kl]
+;B[lm];W[bd];B[be];W[ad];B[ll]
+;W[ih];B[kk];W[hn];B[gn];W[fo]
+;B[jn];W[gl];B[rh];W[ji];B[nh]
+;W[jk];B[ij];W[lk];B[kj];W[jj]
+;B[hr];W[mj];B[ko];W[iq];B[jp]
+;W[gr];B[hs];W[kq];B[cf];W[bg]
+;B[cg];W[ch];B[bf];W[ag];B[pr]
+;W[bn];B[pn];W[bo];B[dq];W[ml]
+;B[nr];W[mm];B[kp];W[mn];B[ln]
+;W[on];B[oq];W[pm];B[qm];W[mr]
+;B[np];W[ni];B[mp];W[pl];B[oo]
+;W[ri];B[sh];W[sc];B[rc];W[le]
+;B[kb];W[ld];B[ib];W[hb];B[dg]
+;W[ia];B[ja];W[kc];B[jb];W[ha]
+;B[mc];W[di];B[ae];W[af];B[qi]
+;W[ce];B[om];W[rk];B[pk];W[ol]
+;B[qk];W[pj];B[ok];W[nm];B[si]
+;W[rl];B[rj];W[lp];B[lo];W[ir]
+;B[fr];W[ap];B[bs];W[hh];B[gk]
+;W[fm];B[lq];W[lr];B[ms];W[is]
+;B[gs];W[gd];B[ge];W[mg];B[mh]
+;W[ki];B[nk];W[qn];B[rn];W[lp]
+;B[mk];W[lj];B[ic];W[ng];B[id]
+;W[gb];B[oh];W[kd];B[if];W[lh]
+;B[je];W[ke];B[fc];W[fb];B[de]
+;W[ls];B[ns];W[kg];B[cf];W[lq]
+;B[cg];W[dg];B[be];W[ej];B[ae]
+;W[ac];B[hi];W[dn];B[cn];W[bm]
+;B[md];W[mi];B[eh];W[aq];B[dr]
+;W[jd];B[gh];W[fg];B[hg];W[nj]
+;B[ie];W[oj];B[ik];W[jm];B[hc]
+;W[nq];B[os];W[eo];B[ce];W[tt]
+;B[bf];W[bi];B[ds];W[ar];B[as]
+;W[ao];B[tt];W[tt]
+)
diff --git a/regression/games/century21-2002/great5-gnugo.sgf b/regression/games/century21-2002/great5-gnugo.sgf
new file mode 100644 (file)
index 0000000..9442948
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+RU[Japanese]
+RE[B+68.5]
+BR[]WR[]SZ[19]HA[0]KM[5.5]
+PW[Great5]
+PB[GNU Go 3.3.5]
+GN[White (W) vs. Black (B)]
+DT[2002-07-28]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[qd];W[dd];B[pq];W[dp];B[fc];
+W[qo];B[qk];W[oc];B[pe];W[fd];B[gd];W[ec];B[fe];W[ed];B[nd];W[ci];
+B[gc];W[iq];B[nc];W[rq];B[ob];W[qm];B[fg];W[dg];B[dm];W[oo];B[np];
+W[ol];B[kc];W[qi];B[pj];W[nj];B[oi];W[rl];B[rk];W[lq];B[mp];W[ck];
+B[fm];W[gp];B[mn];W[ml];B[kn];W[kl];B[on];W[no];B[po];W[nn];B[mo];
+W[nm];B[op];W[im];B[fk];W[pn];B[hk];W[qr];B[or];W[og];B[in];W[qg];
+B[hm];W[nh];B[jm];W[jl];B[il];W[pb];B[nb];W[pp];B[kg];W[jk];B[co];
+W[bm];B[cp];W[cq];B[dq];W[dr];B[eq];W[ep];B[fq];W[cr];B[gq];W[fp];
+B[hq];W[hp];B[hr];W[er];B[ir];W[jr];B[jq];W[jp];B[kq];W[kr];B[fr];
+W[kp];B[fs];W[is];B[cm];W[hs];B[bn];W[ii];B[bl];W[cl];B[bk];W[ig];
+B[bj];W[ki];B[bi];W[cc];B[hf];W[jh];B[cj];W[dj];B[di];W[ei];B[dh];
+W[ch];B[eh];W[bh];B[ah];W[ej];B[cg];W[bg];B[cf];W[af];B[be];W[ae];
+B[fi];W[bd];B[ce];W[ag];B[fb];W[ai];B[ca];W[aj];B[db];W[ef];B[ee];
+W[de];B[df];W[cd];B[eg];W[eb];B[ea];W[if];B[he];W[ke];B[lf];W[bb];
+B[ba];W[ab];B[kd];W[le];B[je];W[jf];B[kf];W[me];B[mf];W[ne];B[nf];
+W[oe];B[of];W[od];B[pc];W[ie];B[jd];W[qb];B[qe];W[rf];B[rc];W[re];
+B[bp];W[rb];B[sb];W[qc];B[rd];W[pd];B[pf];W[pg];B[pa];W[pc];B[bq];
+W[gs];B[br];W[es];B[id];W[gr];B[mh];W[ni];B[mi];W[mj];B[mr];W[ri];
+B[cs];W[qa];B[oa];W[lh];B[mg];W[li];B[pr];W[hg];B[qs];W[rs];B[ps];
+W[qq];B[hi];W[gh];B[gg];W[hh];B[gi];W[ij];B[lr];W[hj];B[gj];W[fh];
+B[lm];W[ll];B[jg];W[ih];B[mq];W[do];B[lp];W[jo];B[ko];W[se];B[ks];
+W[sd];B[sc];W[qf];B[dn];W[lg];B[md];W[ng];B[ld];W[kh];B[ra];W[io];
+B[en];W[pl];B[kq];W[ak];B[am];W[aa];B[jn];W[ho];B[fo];W[go];B[gn];
+W[eo];B[hn]
+)
diff --git a/regression/games/century21-2002/manyfaces-gnugo.sgf b/regression/games/century21-2002/manyfaces-gnugo.sgf
new file mode 100644 (file)
index 0000000..94b6390
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[3]
+RU[Japanese]
+PC[Edmondton]
+RE[W+53.5]
+SZ[19]HA[0]KM[5.5]
+PW[Many Faces of Go]
+PB[GNU Go 3.3.5]
+GN[White (W) vs. Black (B)]
+DT[2002-07-27]
+SY[Cgoban 1.9.10]TM[1 hr/125 moves];B[qd];W[dc];B[pq];W[dq];B[co];
+W[dm];B[eo];W[fp];B[ce];W[dg];B[ee];W[fd];B[bf];W[dj];B[od];W[qo];
+B[qk];W[np];B[bc];W[mo];B[ch];W[ic];B[dh];W[fm];B[nr];W[cq];B[bn];
+W[rq];B[bp];W[bq];B[cl];W[pp];B[mq];W[jp];B[oq];W[fj];B[cj];W[lq];
+B[qq];W[rr];B[lr];W[ps];B[lp];W[kq];B[ko];W[mp];B[os];W[nq];B[ms];
+W[mr];B[ls];W[mc];B[jr];W[ob];B[op];W[qr];B[lo];W[hp];B[km];W[oo];
+B[hr];W[fr];B[qp];W[rp];B[po];W[pn];B[pr];W[pp];B[qs];W[kr];B[mq];
+W[pl];B[ks];W[mr];B[iq];W[mq];B[is];W[qh];B[ql];W[oj];B[rn];W[ro];
+B[qm];W[qf];B[ne];W[pm];B[ri];W[pi];B[rh];W[rg];B[sh];W[qb];B[md];
+W[fe];B[nc];W[nb];B[ip];W[lb];B[jo];W[im];B[kk];W[io];B[ki];W[fo];
+B[lf];W[ng];B[mh];W[lj];B[ho];W[in];B[nn];W[mn];B[kj];W[gp];B[li];
+W[mj];B[ik];W[re];B[rd];W[sd];B[ii];W[ld];B[le];W[hq];B[jq];W[fg];
+B[nm];W[mm];B[kp];W[hh];B[sc];W[kd];B[cb];W[db];B[nh];W[nl];B[og];
+W[eh];B[aq];W[ar];B[ap];W[bs];B[da];W[ea];B[ca];W[eb];B[jf];W[ck];
+B[bk];W[dk];B[bj];W[en];B[ep];W[do];B[dp];W[cc];B[bd];W[sg];B[qj];
+W[cg];B[bg];W[bb];B[ab];W[ba];B[eq];W[er];B[rs];W[sn];B[sm];W[so];
+B[di];W[cp];B[dn];W[fq];B[do];W[cm];B[bl];W[bm];B[am];W[cn];B[ao];
+W[dl];B[ei];W[ie];B[fi];W[ig];B[jg];W[al];B[ak];W[gi];B[fh];W[eg];
+B[ef];W[ff];B[ih];W[sl];B[rm];W[sj];B[rk];W[pk];B[if];W[hf];B[gh];
+W[gj];B[hi];W[de];B[hg];W[se];B[df];W[cf];B[dd];W[cd];B[de];W[rc];
+B[gf];W[he];B[gg];W[bo];B[co];W[do];B[an];W[qn];B[hl];W[jl];B[hm];
+W[hn];B[ej];W[ek];B[gk];W[fk];B[gm];W[jk];B[gn];W[hj];B[jj];W[il];
+B[ij];W[hk];B[pc];W[ed];B[be];W[bo];B[al];W[oh];B[pg];W[qg];B[pb];
+W[ph];B[pe];W[pf];B[of];W[pa];B[ni];W[qe];B[oc];W[qc];B[pd];W[ke];
+B[gr];W[ll];B[ge];W[gd];B[nj];W[kl];B[ln];W[co];B[nk];W[ok];B[mk];
+W[lk];B[je];W[jd];B[kf];W[po];B[jn];W[sr];B[fs];W[es];B[gs];W[ml];
+B[qi];W[sk];B[jm];W[pj];B[mi];W[si];B[gq];W[oi];B[lm];W[ss];B[ps];
+W[aa];B[ac];W[tt];B[tt]
+)
diff --git a/regression/games/century21/README b/regression/games/century21/README
new file mode 100644 (file)
index 0000000..3b0ddd9
--- /dev/null
@@ -0,0 +1,3 @@
+These are games which were played at the 21-st Century Cup
+Tournament in York, Pennsylvania in July, 2001. The engine
+which played was very similar to GNU Go 3.0.0.
\ No newline at end of file
diff --git a/regression/games/century21/gnugo-aya.sgf b/regression/games/century21/gnugo-aya.sgf
new file mode 100644 (file)
index 0000000..057bf7e
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[3]
+RU[Japanese]
+SO[]
+EV[21st Century Cup]
+PC[York]
+RE[W+6.5]
+BR[]WR[]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 2.7.247]
+PB[Aya]
+GN[White (W) vs. Black (B)]
+DT[2001-07-23]
+SY[Cgoban 1.9.10]TM[1:00:00];B[cq]BL[3584];W[pd]WL[3600];B[qq]BL[3583]
+;W[cd]WL[3599];B[ec]BL[3582];W[de]WL[3595];B[ep]BL[3581];W[fd]WL[3594]
+;B[op]BL[3580];W[db]WL[3592];B[qc]BL[3575];W[qd]WL[3587];B[pc]BL[3571]
+;W[oc]WL[3585];B[ob]BL[3566];W[nc]WL[3581];B[nb]BL[3561];W[mc]WL[3579]
+;B[rd]BL[3556];W[re]WL[3578];B[rc]BL[3551];W[qf]WL[3576];B[ql]BL[3546]
+;W[mq]WL[3574];B[iq]BL[3542];W[mb]WL[3568];B[qh]BL[3537];W[or]WL[3566]
+;B[lp]BL[3533];W[lq]WL[3558];B[kq]BL[3528];W[fe]WL[3548];B[lr]BL[3523]
+;W[of]WL[3542];B[mp]BL[3516];W[ph]WL[3534];B[pj]BL[3511];W[oi]WL[3532]
+;B[qi]BL[3506];W[nk]WL[3531];B[ci]BL[3500];W[cg]WL[3529];B[cm]BL[3494]
+;W[bi]WL[3527];B[bk]BL[3489];W[ei]WL[3525];B[bh]BL[3483];W[ch]WL[3524]
+;B[bj]BL[3477];W[di]WL[3522];B[cj]BL[3472];W[ek]WL[3521];B[mm]BL[3467]
+;W[gk]WL[3518];B[fn]BL[3463];W[bg]WL[3516];B[om]BL[3459];W[ah]WL[3514]
+;B[fc]BL[3454];W[ik]WL[3509];B[gc]BL[3450];W[ic]WL[3503];B[hd]BL[3446]
+;W[hb]WL[3492];B[if]BL[3441];W[je]WL[3452];B[ie]BL[3436];W[jg]WL[3441]
+;B[hh]BL[3431];W[hn]WL[3426];B[ji]BL[3425];W[jf]WL[3411];B[jh]BL[3419]
+;W[go]WL[3393];B[gf]BL[3413];W[kj]WL[3381];B[lh]BL[3406];W[jk]WL[3360]
+;B[ig]BL[3400];W[jo]WL[3339];B[gm]BL[3393];W[hm]WL[3335];B[kg]BL[3387]
+;W[le]WL[3314];B[mi]BL[3381];W[lk]WL[3310];B[jm]BL[3374];W[ii]WL[3298]
+;B[nh]BL[3367];W[ih]WL[3278];B[nj]BL[3360];W[km]WL[3266];B[pg]BL[3352]
+;W[rg]WL[3264];B[ng]BL[3344];W[sj]WL[3263];B[rh]BL[3333];W[sh]WL[3261]
+;B[hp]BL[3323];W[ki]WL[3258];B[lm]BL[3312];W[kn]WL[3243];B[jp]BL[3302]
+;W[kh]WL[3238];B[ho]BL[3292];W[gg]WL[3228];B[gn]BL[3282];W[lg]WL[3218]
+;B[in]BL[3273];W[im]WL[3208];B[nf]BL[3264];W[ne]WL[3195];B[mk]BL[3256]
+;W[io]WL[3183];B[ll]BL[3248];W[sl]WL[3169];B[rn]BL[3241];W[na]WL[3155]
+;B[pa]BL[3233];W[og]WL[3144];B[oh]BL[3224];W[lj]WL[3139];B[dl]BL[3217]
+;W[mj]WL[3129];B[ml]BL[3209];W[pf]WL[3115];B[pi]BL[3201];W[gl]WL[3111]
+;B[fp]BL[3195];W[mf]WL[3105];B[sm]BL[3189];W[rl]WL[3103];B[rm]BL[3183]
+;W[rk]WL[3102];B[el]BL[3177];W[mg]WL[3101];B[lo]BL[3171];W[mh]WL[3094]
+;B[se]BL[3167];W[fl]WL[3087];B[fm]BL[3163];W[qg]WL[3080];B[kl]BL[3158]
+;W[jl]WL[3079];B[ln]BL[3153];W[ko]WL[3072];B[sf]BL[3148];W[sg]WL[3069]
+;B[qk]BL[3144];W[rj]WL[3066];B[ph]BL[3140];W[dk]WL[3064];B[ck]BL[3136]
+;W[dj]WL[3063];B[nr]BL[3132];W[li]WL[3057];B[ni]BL[3128];W[aj]WL[3051]
+;B[ak]BL[3125];W[ai]WL[3050];B[gq]BL[3121];W[pq]WL[3049];B[qp]BL[3117]
+;W[mr]WL[3028];B[nq]BL[3113];W[qr]WL[3017];B[rr]BL[3110];W[rf]WL[3013]
+;B[sd]BL[3107];W[kk]WL[3011];B[ip]BL[3103];W[qj]WL[3004];B[kp]BL[3100]
+;W[jn]WL[2999];B[ri]BL[3097];W[si]WL[2991];B[oj]BL[3093];W[ma]WL[2988]
+;B[hi]BL[3090];W[oa]WL[2978];B[pb]BL[3085];W[rb]WL[2977];B[ra]BL[3080]
+;W[jj]WL[2976];B[sb]BL[3077];W[tt]WL[2973];B[tt]BL[3074]
+)
diff --git a/regression/games/century21/gnugo-explorer.sgf b/regression/games/century21/gnugo-explorer.sgf
new file mode 100644 (file)
index 0000000..c368094
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[3]
+RU[Japanese]
+SO[]
+EV[21 Century Cup]
+PC[York]
+RE[W+64.5]
+BR[]WR[]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 2.7.247]
+PB[Explorer]
+GN[White (W) vs. Black (B)]
+DT[2001-07-23]
+SY[Cgoban 1.9.10]TM[1:00:00];B[cq]BL[3599];W[pp]WL[3599];B[qd]BL[3599]
+;W[dd]WL[3598];B[iq]BL[3599];W[oc]WL[3597];B[cl]BL[3598];W[pe]WL[3593]
+;B[qe]BL[3598];W[pf]WL[3592];B[qg]BL[3598];W[jc]WL[3590];B[dh]BL[3598]
+;W[dp]WL[3587];B[dq]BL[3598];W[ep]WL[3576];B[bo]BL[3598];W[oh]WL[3571]
+;B[gp]BL[3598];W[mq]WL[3566];B[eq]BL[3598];W[je]WL[3561];B[qf]BL[3597]
+;W[gc]WL[3559];B[fo]BL[3597];W[kq]WL[3551];B[cf]BL[3597];W[be]WL[3550]
+;B[bf]BL[3596];W[ce]WL[3548];B[ef]BL[3596];W[pj]WL[3547];B[rj]BL[3595]
+;W[he]WL[3545];B[qn]BL[3595];W[ro]WL[3542];B[rn]BL[3595];W[qo]WL[3539]
+;B[sm]BL[3595];W[om]WL[3537];B[pn]BL[3594];W[gg]WL[3535];B[oo]BL[3594]
+;W[op]WL[3532];B[no]BL[3593];W[gi]WL[3530];B[gm]BL[3592];W[qb]WL[3528]
+;B[kl]BL[3591];W[lh]WL[3526];B[ml]BL[3590];W[jp]WL[3524];B[ip]BL[3587]
+;W[rc]WL[3522];B[mn]BL[3586];W[nj]WL[3520];B[jn]BL[3585];W[jr]WL[3517]
+;B[ol]BL[3584];W[lo]WL[3516];B[ln]BL[3580];W[ji]WL[3514];B[ko]BL[3579]
+;W[ik]WL[3512];B[lp]BL[3578];W[ej]WL[3511];B[cj]BL[3577];W[hr]WL[3509]
+;B[pm]BL[3576];W[sf]WL[3508];B[se]BL[3574];W[re]WL[3507];B[qi]BL[3568]
+;W[fd]WL[3504];B[lq]BL[3563];W[lr]WL[3492];B[ir]BL[3553];W[is]WL[3485]
+;B[ic]BL[3543];W[el]WL[3480];B[en]BL[3534];W[jo]WL[3478];B[io]BL[3520]
+;W[dm]WL[3476];B[im]BL[3509];W[dn]WL[3473];B[id]BL[3497];W[fp]WL[3467]
+;B[fq]BL[3485];W[eo]WL[3463];B[jb]BL[3471];W[jd]WL[3445];B[kb]BL[3440]
+;W[nf]WL[3421];B[mc]BL[3410];W[ld]WL[3401];B[hb]BL[3379];W[gb]WL[3391]
+;B[ha]BL[3348];W[nb]WL[3386];B[nd]BL[3318];W[ka]WL[3380];B[la]BL[3287]
+;W[lb]WL[3372];B[ja]BL[3256];W[mb]WL[3368];B[hd]BL[3225];W[ge]WL[3363]
+;B[ie]BL[3194];W[fn]WL[3360];B[go]BL[3167];W[kp]WL[3358];B[mo]BL[3156]
+;W[bn]WL[3355];B[if]BL[3145];W[co]WL[3350];B[bp]BL[3114];W[gq]WL[3348]
+;B[ih]BL[3101];W[fr]WL[3338];B[kg]BL[3081];W[lf]WL[3325];B[kh]BL[3054]
+;W[ki]WL[3310];B[hi]BL[3028];W[gj]WL[3293];B[ij]BL[3001];W[ii]WL[3268]
+;B[hh]BL[2973];W[gh]WL[3250];B[hj]BL[2947];W[ga]WL[3227];B[gk]BL[2936]
+;W[jk]WL[3213];B[hk]BL[2910];W[er]WL[3192];B[dr]BL[2883];W[br]WL[3178]
+;B[cr]BL[2856];W[ao]WL[3163];B[bq]BL[2827];W[ds]WL[3149];B[cs]BL[2798]
+;W[ar]WL[3127];B[gr]BL[2770];W[gs]WL[3100];B[kc]BL[2756];W[lc]WL[3083]
+;B[lg]BL[2745];W[li]WL[3046];B[mg]BL[2734];W[kk]WL[3016];B[lk]BL[2724]
+;W[og]WL[3004];B[qk]BL[2713];W[oe]WL[2993];B[mf]BL[2702];W[ne]WL[2987]
+;B[me]BL[2691];W[kf]WL[2981];B[md]BL[2680];W[le]WL[2972];B[db]BL[2670]
+;W[eh]WL[2951];B[cc]BL[2659];W[cd]WL[2927];B[fk]BL[2633];W[ek]WL[2892]
+;B[ff]BL[2621];W[bc]WL[2871];B[gf]BL[2563];W[cb]WL[2856];B[cp]BL[2535]
+;W[em]WL[2799];B[aq]BL[2517];W[hf]WL[2789];B[eg]BL[2488];W[hg]WL[2775]
+;B[ig]BL[2461];W[hq]WL[2760];B[so]BL[2448];W[rp]WL[2745];B[sp]BL[2437]
+;W[sq]WL[2743];B[sn]BL[2422];W[qq]WL[2739];B[jq]BL[2412];W[kr]WL[2721]
+;B[af]BL[2396];W[gn]WL[2710];B[hp]BL[2383];W[hn]WL[2697];B[in]BL[2355]
+;W[hm]WL[2686];B[fm]BL[2328];W[rd]WL[2676];B[rh]BL[2307];W[di]WL[2673]
+;B[ci]BL[2283];W[dg]WL[2665];B[df]BL[2262];W[ch]WL[2657];B[bh]BL[2226]
+;W[bl]WL[2651];B[ai]BL[2203];W[bk]WL[2647];B[bj]BL[2186];W[ck]WL[2643]
+;B[mp]BL[2164];W[nq]WL[2640];B[pi]BL[2156];W[oi]WL[2638];B[dj]BL[2150]
+;W[es]WL[2635];B[pc]BL[2128];W[od]WL[2629];B[pb]BL[2092];W[rf]WL[2625]
+;B[hl]BL[2071];W[il]WL[2621];B[fl]BL[2057];W[jh]WL[2617];B[jg]BL[2050]
+;W[kd]WL[2613];B[oa]BL[2044];W[fg]WL[2611];B[qc]BL[2037];W[rb]WL[2610]
+;B[cg]BL[2031];W[dh]WL[2609];B[dk]BL[2025];W[dl]WL[2607];B[jl]BL[2016]
+;W[jj]WL[2606];B[pk]BL[2007];W[lj]WL[2605];B[mk]BL[1998];W[ok]WL[2604]
+;B[nl]BL[1992];W[mj]WL[2603];B[ak]BL[1986];W[mh]WL[2602];B[al]BL[1980]
+;W[cm]WL[2601];B[am]BL[1973];W[an]WL[2600];B[ng]BL[1967];W[ph]WL[2599]
+;B[fj]BL[1961];W[fi]WL[2598];B[qa]BL[1955];W[ra]WL[2597];B[pa]BL[1949]
+;W[nh]WL[2596];B[ka]BL[1944];W[hc]WL[2595];B[ib]BL[1929];W[da]WL[2594]
+;B[qh]BL[1921];W[pg]WL[2592];B[po]BL[1914];W[ee]WL[2592];B[fe]BL[1906]
+;W[de]WL[2590];B[aj]BL[1895];W[bm]WL[2588];B[ae]BL[1885];W[gd]WL[2586]
+;B[eb]BL[1876];W[ad]WL[2584];B[np]BL[1864];W[rg]WL[2583];B[sh]BL[1850]
+;W[nk]WL[2583];B[ho]BL[1836];W[en]WL[2582];B[qj]BL[1826];W[oj]WL[2582]
+;B[sg]BL[1817];W[nc]WL[2581];B[jf]BL[1808];W[ob]WL[2581];B[pd]BL[1798]
+;W[ma]WL[2581];B[na]BL[1789];W[tt]WL[2581];B[tt]BL[1780]
+)
diff --git a/regression/games/century21/gnugo-go4.sgf b/regression/games/century21/gnugo-go4.sgf
new file mode 100644 (file)
index 0000000..869ea5f
--- /dev/null
@@ -0,0 +1,68 @@
+(;GM[1]FF[3]
+RU[Japanese]
+SO[]
+EV[21st Century Cup]
+PC[York]
+RE[B+45.5]
+BR[]WR[]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 2.7.247]
+PB[Go4++]
+GN[White (W) vs. Black (B)]
+DT[2001-07-23]
+SY[Cgoban 1.9.10]TM[1:00:00];B[dp]BL[3599];W[pp]WL[3600];B[pd]BL[3598]
+;W[dd]WL[3599];B[fc]BL[3597];W[cf]WL[3593];B[db]BL[3595];W[cc]WL[3592]
+;B[ic]BL[3594];W[nc]WL[3591];B[pf]BL[3591];W[fq]WL[3585];B[cn]BL[3589]
+;W[dr]WL[3579];B[cq]BL[3586];W[iq]WL[3578];B[qn]BL[3583];W[cl]WL[3576]
+;B[cr]BL[3580];W[ci]WL[3574];B[rp]BL[3576];W[kc]WL[3569];B[oc]BL[3572]
+;W[nd]WL[3565];B[ob]BL[3568];W[qh]WL[3562];B[qq]BL[3562];W[pq]WL[3552]
+;B[cb]BL[3558];W[lq]WL[3550];B[qk]BL[3555];W[oh]WL[3543];B[qf]BL[3548]
+;W[on]WL[3534];B[pr]BL[3544];W[or]WL[3531];B[qr]BL[3541];W[pj]WL[3529]
+;B[bb]BL[3537];W[ib]WL[3527];B[hb]BL[3531];W[jb]WL[3524];B[fe]BL[3522]
+;W[fg]WL[3519];B[fo]BL[3515];W[ho]WL[3516];B[nf]BL[3501];W[mh]WL[3508]
+;B[fm]BL[3491];W[eg]WL[3505];B[fj]BL[3485];W[rg]WL[3502];B[rf]BL[3475]
+;W[bm]WL[3500];B[bn]BL[3466];W[im]WL[3498];B[dj]BL[3453];W[cj]WL[3495]
+;B[pk]BL[3443];W[ok]WL[3491];B[om]BL[3437];W[nm]WL[3486];B[nn]BL[3429]
+;W[mm]WL[3476];B[oo]BL[3417];W[pn]WL[3467];B[po]BL[3402];W[pm]WL[3459]
+;B[qm]BL[3387];W[pl]WL[3450];B[ql]BL[3374];W[ol]WL[3442];B[no]BL[3364]
+;W[nq]WL[3438];B[lo]BL[3353];W[nb]WL[3435];B[na]BL[3346];W[mf]WL[3432]
+;B[jd]BL[3327];W[me]WL[3429];B[ij]BL[3318];W[ma]WL[3423];B[oa]BL[3310]
+;W[ki]WL[3415];B[ng]BL[3300];W[ih]WL[3411];B[er]BL[3285];W[rj]WL[3407]
+;B[rk]BL[3276];W[fr]WL[3403];B[dq]BL[3265];W[jf]WL[3400];B[kp]BL[3251]
+;W[kq]WL[3385];B[bd]BL[3242];W[bc]WL[3381];B[ac]BL[3234];W[gg]WL[3377]
+;B[bf]BL[3224];W[ce]WL[3371];B[bg]BL[3209];W[cg]WL[3367];B[an]BL[3199]
+;W[bh]WL[3363];B[be]BL[3188];W[he]WL[3357];B[hd]BL[3178];W[lb]WL[3352]
+;B[nh]BL[3165];W[nj]WL[3346];B[mg]BL[3150];W[ni]WL[3342];B[qj]BL[3137]
+;W[ri]WL[3338];B[lh]BL[3129];W[mi]WL[3334];B[pi]BL[3118];W[lg]WL[3329]
+;B[ph]BL[3107];W[oi]WL[3325];B[pg]BL[3100];W[jk]WL[3319];B[kg]BL[3085]
+;W[lf]WL[3314];B[ke]BL[3067];W[km]WL[3309];B[kf]BL[3053];W[kh]WL[3303]
+;B[gp]BL[3036];W[gl]WL[3299];B[fl]BL[3023];W[hi]WL[3297];B[hq]BL[3001]
+;W[ir]WL[3291];B[hr]BL[2987];W[hp]WL[3287];B[gq]BL[2974];W[je]WL[3279]
+;B[kd]BL[2962];W[dk]WL[3276];B[jg]BL[2948];W[ig]WL[3267];B[ge]BL[2928]
+;W[ie]WL[3254];B[ee]BL[2914];W[dc]WL[3238];B[hj]BL[2892];W[jh]WL[3222]
+;B[gk]BL[2862];W[gm]WL[3212];B[jj]BL[2849];W[kj]WL[3210];B[bl]BL[2839]
+;W[bk]WL[3208];B[al]BL[2831];W[cm]WL[3205];B[dm]BL[2820];W[am]WL[3204]
+;B[jp]BL[2808];W[ej]WL[3199];B[ip]BL[2793];W[go]WL[3197];B[fp]BL[2788]
+;W[fi]WL[3192];B[jq]BL[2780];W[jr]WL[3187];B[dl]BL[2772];W[ck]WL[3183]
+;B[is]BL[2766];W[ks]WL[3171];B[lr]BL[2759];W[mr]WL[3167];B[ia]BL[2753]
+;W[og]WL[3157];B[of]BL[2749];W[id]WL[3145];B[jc]BL[2744];W[ld]WL[3138]
+;B[ka]BL[2735];W[kb]WL[3132];B[hl]BL[2728];W[gn]WL[3118];B[op]BL[2720]
+;W[io]WL[3111];B[jn]BL[2710];W[il]WL[3102];B[ek]BL[2702];W[di]WL[3096]
+;B[jm]BL[2696];W[kn]WL[3090];B[jo]BL[2688];W[oq]WL[3083];B[jl]BL[2682]
+;W[ik]WL[3081];B[kl]BL[2674];W[kk]WL[3079];B[ll]BL[2667];W[mn]WL[3075]
+;B[mo]BL[2661];W[ja]WL[3069];B[hc]BL[2657];W[ha]WL[3059];B[ec]BL[2648]
+;W[ga]WL[3051];B[hk]BL[2644];W[hm]WL[3042];B[mk]BL[2640];W[gf]WL[3037]
+;B[de]BL[2636];W[cd]WL[3034];B[ag]BL[2629];W[ea]WL[3031];B[da]BL[2626]
+;W[in]WL[3029];B[ah]BL[2621];W[ai]WL[3024];B[gb]BL[2615];W[fa]WL[3023]
+;B[eb]BL[2612];W[qp]WL[3021];B[qo]BL[2609];W[df]WL[3013];B[fn]BL[2602]
+;W[oe]WL[3011];B[pe]BL[2598];W[ps]WL[3003];B[qs]BL[2593];W[os]WL[2997]
+;B[ed]BL[2585];W[lk]WL[2992];B[ml]BL[2581];W[mj]WL[2987];B[mp]BL[2572]
+;W[nl]WL[2981];B[mq]BL[2568];W[ms]WL[2975];B[lp]BL[2564];W[kr]WL[2972]
+;B[ln]BL[2557];W[lm]WL[2970];B[rq]BL[2551];W[oj]WL[2966];B[pc]BL[2547]
+;W[sh]WL[2964];B[sj]BL[2544];W[ko]WL[2962];B[fb]BL[2537];W[ia]WL[2961]
+;B[od]BL[2532];W[ne]WL[2959];B[hf]BL[2528];W[if]WL[2958];B[gi]BL[2524]
+;W[gh]WL[2957];B[gj]BL[2520];W[ii]WL[2956];B[aj]BL[2515];W[bi]WL[2955]
+;B[fk]BL[2511];W[le]WL[2955];B[sk]BL[2507];W[ef]WL[2954];B[hs]BL[2504]
+;W[np]WL[2953];B[js]BL[2502];W[ls]WL[2952];B[ff]BL[2495];W[nk]WL[2952]
+;B[ji]BL[2492];W[tt]WL[2952];B[nr]BL[2489];W[ns]WL[2952];B[ds]BL[2486]
+;W[tt]WL[2952];B[tt]BL[2484]
+)
diff --git a/regression/games/century21/gnugo-gointellect.sgf b/regression/games/century21/gnugo-gointellect.sgf
new file mode 100644 (file)
index 0000000..b4de6ba
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[3]
+RU[Japanese]
+SO[]
+EV[]
+PC[]
+DT[]
+RE[W+10.5]
+BR[]WR[]SZ[19]
+PW[Go Intellect]
+PB[GNU Go 2.7.247]
+HA[0]KM[5.5]
+GN[GNU Go 2.7.246 gmp Random Seed 0]
+;B[dp];W[pq];B[po];W[qp];B[qo];W[qd];B[dd];W[oc];B[qj];W[jc];B[dj];
+W[kq];B[qg];W[np];B[om];W[cc];B[dc];W[cd];B[ce];W[cq];B[cp];W[dq];
+B[eq];W[de];B[cb];W[bb];B[db];W[fd];B[be];W[ep];B[bq];W[br];B[fp];
+W[bp];B[eo];W[ed];B[bo];W[aq];B[hq];W[df];B[ch];W[bd];B[ae];W[bc];
+B[ba];W[ro];B[rn];W[cf];B[bf];W[bg];B[ab];W[cg];B[rp];W[dh];B[jp];
+W[jq];B[kp];W[lq];B[mm];W[rq];B[so];W[di];B[re];W[qe];B[rd];W[rc];
+B[qf];W[iq];B[ip];W[er];B[fr];W[dr];B[mo];W[jf];B[oh];W[ji];B[mi];
+W[hr];B[gq];W[jl];B[hn];W[ik];B[nf];W[fb];B[lg];W[mc];B[gl];W[gk];
+B[fk];W[fj];B[hk];W[gj];B[ek];W[hj];B[mk];W[hl];B[kj];W[hm];B[gm];
+W[ao];B[bn];W[bj];B[cl];W[gr];B[gs];W[is];B[sq];W[kh];B[rr];W[lh];
+B[qq];W[pr];B[le];W[kd];B[oe];W[pf];B[pp];W[pe];B[mp];W[mq];B[no];
+W[op];B[mh];W[pg];B[ph];W[ll];B[bk];W[ml];B[nl];W[cj];B[ej];W[ei];
+B[jj];W[ag];B[ad];W[lk];B[lj];W[nk];B[ok];W[mj];B[li];W[kg];B[lf];
+W[ck];B[em];W[bl];B[bm];W[al];B[dk];W[aj];B[nj];W[in];B[dl];W[ho];
+B[mk];W[gn];B[kn];W[lm];B[fn];W[sd];B[sf];W[ln];B[km];W[lo];B[lp];
+W[kl];B[jn];W[oo];B[mn];W[on];B[pn];W[ko];B[jo];W[ld];B[qr];W[od];
+B[ps];W[nr];B[or];W[oq];B[os];W[ns];B[qs];W[nn];B[ij];W[ii];B[go];
+W[ne];B[hn];W[fs];B[im];W[of];B[es];W[ng];B[mf];W[og];B[mg];W[gn];
+B[nm];W[nq];B[hn];W[se];B[sc];W[qb];B[rb];W[qc];B[gn];W[ra];B[sb];
+W[ds];B[fs];W[nh];B[ni];W[am];B[an];W[ak];B[eb];W[hc];B[ec];W[fc];
+B[ke];W[je];B[me];W[md];B[ap];W[bq];B[ea];W[fa];B[jm];W[il];B[ao];
+W[hs];B[fq];W[rh];B[js];W[ir];B[ls];W[qh];B[qi];W[ks];B[kr];W[jr];
+B[mr];W[ks];B[sh];W[lr];B[sd];W[ri];B[rj];W[si];B[rf];W[sg];B[sj];
+W[af];B[ac];W[qa];B[rg];W[sa];B[sh];W[kf];B[kk];W[hk];B[ki];W[jk];
+B[tt];W[co];B[dn];W[cm];B[cn];
+)
diff --git a/regression/games/century21/gnugo-smartgo.sgf b/regression/games/century21/gnugo-smartgo.sgf
new file mode 100644 (file)
index 0000000..a17c6fe
--- /dev/null
@@ -0,0 +1,47 @@
+(;GM[1]FF[3]
+RU[New Zealand]
+SO[]
+EV[21st Century Cup]
+PC[York]
+RE[W+12.5]
+BR[]WR[]SZ[19]HA[0]KM[5.5]
+PW[Smart Go]
+PB[GNU Go 2.7.247]
+GN[White (W) vs. Black (B)]
+DT[2001-07-22]
+SY[Cgoban 1.9.10]TM[1:00:00];B[pd]BL[3600];W[pp]WL[3595];B[cd]BL[3600]
+;W[nd]WL[3588];B[pf]BL[3595];W[dp]WL[3577];B[cn]BL[3594];W[jp]WL[3561]
+;B[bp]BL[3589];W[bo]WL[3546];B[co]BL[3577];W[cp]WL[3521];B[bq]BL[3568]
+;W[cr]WL[3495];B[np]BL[3563];W[do]WL[3467];B[ec]BL[3555];W[dn]WL[3439]
+;B[bn]BL[3552];W[lp]WL[3410];B[lc]BL[3546];W[nn]WL[3386];B[me]BL[3540]
+;W[ph]WL[3363];B[qj]BL[3535];W[ql]WL[3339];B[qh]BL[3528];W[nh]WL[3311]
+;B[qg]BL[3522];W[md]WL[3283];B[oc]BL[3515];W[cf]WL[3255];B[ld]BL[3510]
+;W[le]WL[3226];B[ne]BL[3508];W[hd]WL[3197];B[ch]BL[3506];W[jc]WL[3169]
+;B[ck]BL[3501];W[kb]WL[3138];B[mq]BL[3500];W[mf]WL[3109];B[nf]BL[3468]
+;W[pk]WL[3080];B[oq]BL[3466];W[qr]WL[3052];B[oo]BL[3451];W[kr]WL[3023]
+;B[lf]BL[3440];W[mg]WL[2994];B[ke]BL[3438];W[or]WL[2965];B[nr]BL[3425]
+;W[pr]WL[2941];B[if]BL[3412];W[gc]WL[2912];B[lb]BL[3399];W[lg]WL[2883]
+;B[kg]BL[3386];W[ji]WL[2853];B[rk]BL[3385];W[rl]WL[2824];B[el]BL[3380]
+;W[fb]WL[2790];B[bf]BL[3371];W[kh]WL[2761];B[eb]BL[3354];W[gm]WL[2732]
+;B[en]BL[3351];W[fl]WL[2703];B[ej]BL[3348];W[em]WL[2679];B[be]BL[3344]
+;W[pi]WL[2648];B[gi]BL[3343];W[jg]WL[2627];B[ij]BL[3341];W[jk]WL[2607]
+;B[pj]BL[3339];W[ik]WL[2577];B[oj]BL[3334];W[nk]WL[2547];B[jj]BL[3332]
+;W[kj]WL[2527];B[kk]BL[3330];W[kl]WL[2504];B[he]BL[3324];W[ig]WL[2484]
+;B[fa]BL[3315];W[ga]WL[2461];B[hb]BL[3305];W[sk]WL[2431];B[hg]BL[3299]
+;W[ok]WL[2409];B[jf]BL[3289];W[ib]WL[2382];B[hc]BL[3280];W[gb]WL[2359]
+;B[gd]BL[3274];W[qi]WL[2322];B[ha]BL[3258];W[ri]WL[2286];B[rh]BL[3250]
+;W[hh]WL[2262];B[gh]BL[3241];W[gg]WL[2239];B[hf]BL[3230];W[ic]WL[2209]
+;B[id]BL[3224];W[hj]WL[2176];B[ih]BL[3221];W[gj]WL[2154];B[hi]BL[3212]
+;W[fh]WL[2131];B[jh]BL[3207];W[ii]WL[2109];B[fi]BL[3205];W[ek]WL[2087]
+;B[dl]BL[3201];W[fj]WL[2066];B[eh]BL[3198];W[si]WL[2030];B[dk]BL[3196]
+;W[sh]WL[1998];B[sg]BL[3193];W[pg]WL[1979];B[rf]BL[3191];W[br]WL[1948]
+;B[fk]BL[3189];W[aq]WL[1914];B[fn]BL[3187];W[dm]WL[1893];B[fm]BL[3182]
+;W[gl]WL[1862];B[ap]BL[3177];W[bl]WL[1840];B[cl]BL[3173];W[cm]WL[1822]
+;B[bm]BL[3171];W[cq]WL[1804];B[ar]BL[3169];W[gk]WL[1776];B[og]BL[3164]
+;W[am]WL[1755];B[ao]BL[3162];W[oh]WL[1735];B[an]BL[3160];W[ng]WL[1715]
+;B[of]BL[3158];W[bs]WL[1696];B[al]BL[3157];W[rb]WL[1663];B[pb]BL[3151]
+;W[as]WL[1642];B[ek]BL[3149];W[qc]WL[1629];B[qd]BL[3146];W[lk]WL[1619]
+;B[aq]BL[3144];W[ff]WL[1615];B[fg]BL[3140];W[df]WL[1610];B[ef]BL[3139]
+;W[mo]WL[1607];B[tt]BL[3136];W[li]WL[1604];B[tt]BL[3135];W[go]WL[1601]
+;B[tt]BL[3134];W[bb]WL[1598];B[tt]BL[3133];W[tt]WL[1596]
+)
diff --git a/regression/games/century21/gnugo-wulu.sgf b/regression/games/century21/gnugo-wulu.sgf
new file mode 100644 (file)
index 0000000..e26a781
--- /dev/null
@@ -0,0 +1,59 @@
+(;GM[1]FF[3]
+RU[Japanese]
+SO[]
+EV[21st Century Cup]
+PC[York]BR[]WR[]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 2.7.247]
+PB[Wulu]
+GN[White (W) vs. Black (B)]
+DT[2001-07-22]
+SY[Cgoban 1.9.10]TM[1:00:00];B[dc]BL[3598];W[dp]WL[3600];B[qd]BL[3598]
+;W[pp]WL[3600];B[fq]BL[3597];W[oc]WL[3594];B[pf]BL[3597];W[de]WL[3589]
+;B[mc]BL[3596];W[cc]WL[3584];B[cb]BL[3596];W[cd]WL[3580];B[eb]BL[3596]
+;W[ci]WL[3579];B[jc]BL[3595];W[cn]WL[3577];B[kq]BL[3595];W[qh]WL[3573]
+;B[fd]BL[3593];W[qk]WL[3567];B[ef]BL[3593];W[cg]WL[3564];B[qq]BL[3591]
+;W[pq]WL[3560];B[qp]BL[3590];W[qo]WL[3550];B[ro]BL[3590];W[qn]WL[3530]
+;B[rn]BL[3589];W[qm]WL[3520];B[pr]BL[3588];W[or]WL[3517];B[qr]BL[3587]
+;W[nq]WL[3514];B[fh]BL[3586];W[en]WL[3512];B[nk]BL[3585];W[er]WL[3511]
+;B[fr]BL[3583];W[eq]WL[3508];B[mg]BL[3581];W[ek]WL[3506];B[gk]BL[3580]
+;W[rm]WL[3504];B[gn]BL[3578];W[qb]WL[3501];B[rc]BL[3577];W[nb]WL[3491]
+;B[rb]BL[3576];W[lb]WL[3486];B[lc]BL[3575];W[kb]WL[3470];B[jb]BL[3575]
+;W[fp]WL[3465];B[gp]BL[3573];W[gq]WL[3464];B[gr]BL[3572];W[hq]WL[3456]
+;B[hr]BL[3571];W[ip]WL[3446];B[go]BL[3570];W[ir]WL[3438];B[jm]BL[3569]
+;W[no]WL[3435];B[jo]BL[3568];W[oj]WL[3432];B[mi]BL[3567];W[om]WL[3430]
+;B[pc]BL[3565];W[ln]WL[3416];B[ij]BL[3562];W[lp]WL[3413];B[pb]BL[3561]
+;W[rf]WL[3407];B[kc]BL[3560];W[lr]WL[3404];B[fl]BL[3558];W[kr]WL[3401]
+;B[el]BL[3557];W[dk]WL[3399];B[dl]BL[3556];W[cl]WL[3397];B[jp]BL[3554]
+;W[oh]WL[3395];B[of]BL[3552];W[ll]WL[3393];B[jk]BL[3550];W[nj]WL[3391]
+;B[lj]BL[3548];W[mk]WL[3389];B[fo]BL[3547];W[ep]WL[3387];B[fj]BL[3545]
+;W[bb]WL[3386];B[ba]BL[3544];W[ab]WL[3384];B[re]BL[3543];W[qf]WL[3382]
+;B[ei]BL[3541];W[pe]WL[3381];B[qe]BL[3539];W[sn]WL[3378];B[rp]BL[3538]
+;W[jq]WL[3374];B[kp]BL[3538];W[hp]WL[3371];B[sf]BL[3537];W[sg]WL[3369]
+;B[qg]BL[3536];W[se]WL[3367];B[rh]BL[3535];W[rg]WL[3364];B[ri]BL[3534]
+;W[pg]WL[3361];B[nf]BL[3533];W[sd]WL[3357];B[ni]BL[3532];W[io]WL[3354]
+;B[in]BL[3531];W[ed]WL[3352];B[fc]BL[3529];W[fm]WL[3351];B[gm]BL[3528]
+;W[ps]WL[3349];B[qs]BL[3527];W[os]WL[3347];B[ho]BL[3526];W[iq]WL[3339]
+;B[is]BL[3525];W[jr]WL[3326];B[mj]BL[3524];W[df]WL[3323];B[eg]BL[3523]
+;W[so]WL[3321];B[sp]BL[3522];W[sm]WL[3319];B[rj]BL[3521];W[rr]WL[3318]
+;B[nl]BL[3520];W[ol]WL[3316];B[nm]BL[3518];W[ok]WL[3314];B[rs]BL[3517]
+;W[sr]WL[3313];B[oi]BL[3516];W[pi]WL[3312];B[lk]BL[3515];W[ml]WL[3310]
+;B[kl]BL[3514];W[km]WL[3309];B[kn]BL[3513];W[lm]WL[3308];B[lq]BL[3512]
+;W[lo]WL[3307];B[mq]BL[3511];W[mr]WL[3306];B[cm]BL[3509];W[bl]WL[3303]
+;B[bm]BL[3508];W[bn]WL[3302];B[dm]BL[3506];W[am]WL[3302];B[eo]BL[3505]
+;W[dn]WL[3301];B[mp]BL[3504];W[dh]WL[3300];B[mo]BL[3503];W[mn]WL[3298]
+;B[np]BL[3502];W[nn]WL[3297];B[op]BL[3501];W[oq]WL[3296];B[oo]BL[3501]
+;W[sc]WL[3295];B[jg]BL[3499];W[sb]WL[3293];B[ra]BL[3498];W[nh]WL[3291]
+;B[ee]BL[3497];W[mh]WL[3290];B[lh]BL[3496];W[dd]WL[3289];B[pn]BL[3495]
+;W[po]WL[3288];B[on]BL[3494];W[ec]WL[3287];B[db]BL[3493];W[ca]WL[3286]
+;B[ko]BL[3492];W[mm]WL[3285];B[pm]BL[3491];W[aa]WL[3284];B[pl]BL[3490]
+;W[pk]WL[3282];B[ql]BL[3489];W[rl]WL[3281];B[jn]BL[3489];W[rk]WL[3280]
+;B[dj]BL[3488];W[cj]WL[3279];B[he]BL[3486];W[ba]WL[3278];B[cr]BL[3485]
+;W[da]WL[3276];B[fb]BL[3484];W[og]WL[3275];B[oe]BL[3483];W[fk]WL[3274]
+;B[bq]BL[3482];W[bo]WL[3273];B[ea]BL[3481];W[bc]WL[3271];B[hl]BL[3481]
+;W[do]WL[3270];B[bs]BL[3480];W[ar]WL[3270];B[aq]BL[3479];W[dg]WL[3268]
+;B[dr]BL[3479];W[ds]WL[3267];B[gl]BL[3478];W[fn]WL[3267];B[eh]BL[3477]
+;W[di]WL[3267];B[ej]BL[3476];W[ck]WL[3266];B[cs]BL[3476];W[es]WL[3265]
+;B[rd]BL[3476];W[em]WL[3263];B[sh]BL[3476];W[sf]WL[3261];B[sa]BL[3476]
+;W[qg]WL[3260];B[qi]BL[3475];W[ph]WL[3259];B[ng]BL[3475];W[pj]WL[3257]
+;B[br]BL[3475];W[tt]WL[3256];B[tt]BL[3475]
+)
diff --git a/regression/games/cgf2001/aya.sgf b/regression/games/cgf2001/aya.sgf
new file mode 100644 (file)
index 0000000..82decab
--- /dev/null
@@ -0,0 +1,31 @@
+(;\r
+GM[1]FF[1]SZ[19]\r
+PB[GnuGo]\r
+PW[Aya 4.71]\r
+DT[2001-08-25]\r
+RE[B+84.5]\r
+KM[5.5]TM[50]RU[Japanese]PC[The University of Electro-Communications]\r
+EV[CGF special meeting]GN[Round 1]C[Time Aya=35:30(RM=7),39:47]\r
+;B[cd];W[pq];B[qc];W[dq];B[do];W[ec];B[hd];W[od];B[db];W[qo]\r
+;B[cq];W[qe];B[dr];W[pd];B[ed];W[pb];B[jq];W[gc];B[hc];W[lc]\r
+;B[gd];W[fd];B[fe];W[fb];B[fc];W[mq];B[gq];W[jb];B[gb];W[eq]\r
+;B[cp];W[qj];B[er];W[ck];B[cm];W[cg];B[jc];W[kc];B[ib];W[eh]\r
+;B[el];W[dj];B[lp];W[dl];B[em];W[fp];B[mp];W[op];B[lr];W[gn]\r
+;B[ho];W[hl];B[fo];W[gl];B[kb];W[ki];B[lb];W[mb];B[gg];W[mc]\r
+;B[bl];W[go];B[gp];W[eo];B[fn];W[en];B[fm];W[np];B[mr];W[bk]\r
+;B[gm];W[lm];B[im];W[jg];B[kl];W[km];B[lk];W[jo];B[ml];W[jm]\r
+;B[jl];W[nn];B[ok];W[mh];B[oi];W[qh];B[il];W[jd];B[hn];W[ic]\r
+;B[ja];W[hj];B[if];W[hh];B[bf];W[ng];B[og];W[ql];B[df];W[bg]\r
+;B[fk];W[pl];B[nq];W[nr];B[lq];W[oq];B[or];W[ns];B[ms];W[mq]\r
+;B[ob];W[pc];B[nq];W[hb];B[jc];W[mq];B[id];W[nq];B[kd];W[in]\r
+;B[hm];W[ol];B[pj];W[nk];B[nj];W[mj];B[mk];W[nl];B[ke];W[af]\r
+;B[me];W[al];B[am];W[ak];B[lg];W[kg];B[lh];W[nf];B[li];W[mi]\r
+;B[lj];W[fi];B[ne];W[of];B[io];W[la];B[jn];W[kn];B[ko];W[mo]\r
+;B[lo];W[mm];B[in];W[pa];B[kj];W[ji];B[gj];W[ik];B[dg];W[dh]\r
+;B[cf];W[ad];B[bc];W[ac];B[be];W[ae];B[ln];W[bb];B[bd];W[jj]\r
+;B[cb];W[kh];B[ab];W[ag];B[ba];W[fg];B[gi];W[hi];B[gh];W[fh]\r
+;B[ih];W[ig];B[ii];W[gf];B[gk];W[ff];B[hg];W[nd];B[ej];W[oe]\r
+;B[cl];W[dm];B[dn];W[an];B[bm];W[dk];B[bo];W[le];B[mf];W[lf]\r
+;B[kf];W[ld];B[mg];W[nh];B[jf];W[mn];B[ei];W[di];B[ef];W[hf]\r
+;B[ie];W[ek];B[fj];W[hk];B[fl];W[rb];B[ka];W[ma];B[ll];W[md]\r
+;B[ge];W[pr];B[he];W[tt];B[bi];W[tt];B[ch];W[tt];B[tt])\r
diff --git a/regression/games/cgf2001/goro.sgf b/regression/games/cgf2001/goro.sgf
new file mode 100644 (file)
index 0000000..c6058dd
--- /dev/null
@@ -0,0 +1,33 @@
+(;\r
+GM[1]FF[1]SZ[19]\r
+PB[GORO]\r
+PW[GnuGo]\r
+DT[2001/08/25 13:07:29]\r
+RE[W+46.5]\r
+KM[5.5]TM[50]RU[Japanese]PC[UEC]EV[CGF special meeting]GN[Round 2]\r
+BL[0:07:42]\r
+WL[0:20:20]\r
+\r
+;B[qd];W[od];B[pq];W[qc];B[cp];W[rd];B[cd];W[eq];B[dn];W[po]\r
+;B[np];W[qq];B[hq];W[pr];B[kp];W[cr];B[ec];W[cl];B[qj];W[ci]\r
+;B[fo];W[ql];B[fq];W[bq];B[qe];W[pc];B[er];W[kc];B[cm];W[dl]\r
+;B[re];W[bp];B[bo];W[ap];B[ar];W[cf];B[pg];W[md];B[rc];W[rb]\r
+;B[sd];W[hc];B[jl];W[oq];B[kh];W[mr];B[kr];W[be];B[bd];W[rk]\r
+;B[rj];W[ng];B[gg];W[mg];B[fm];W[de];B[fk];W[eg];B[nn];W[je]\r
+;B[mi];W[fb];B[eb];W[ig];B[ih];W[ll];B[gi];W[nl];B[mq];W[lm]\r
+;B[nr];W[pm];B[kn];W[kk];B[kj];W[jk];B[ln];W[ge];B[ik];W[gf]\r
+;B[ol];W[om];B[nm];W[ok];B[ml];W[nk];B[mj];W[mm];B[mk];W[ei]\r
+;B[kf];W[fc];B[mf];W[nf];B[me];W[pf];B[qf];W[ed];B[lg];W[ea]\r
+;B[cb];W[dc];B[ba];W[ab];B[db];W[ad];B[bl];W[bk];B[bm];W[oh]\r
+;B[qh];W[oi];B[ld];W[lc];B[nd];W[mc];B[oe];W[ne];B[dp];W[le]\r
+;B[lf];W[ke];B[dr];W[pe];B[mn];W[co];B[bb];W[bn];B[ao];W[hg]\r
+;B[an];W[am];B[br];W[al];B[cq];W[hh];B[jj];W[hi];B[dd];W[da]\r
+;B[dm];W[ee];B[el];W[gj];B[gk];W[hk];B[hj];W[ij];B[il];W[hl]\r
+;B[hm];W[fj];B[jg];W[dk];B[ii];W[hj];B[pd];W[of];B[oc];W[nc]\r
+;B[ob];W[qb];B[sb];W[oa];B[gl];W[or];B[lr];W[ns];B[ms];W[os]\r
+;B[cn];W[bo];B[pp];W[qp];B[op];W[pk];B[nq];W[qr];B[mh];W[ek]\r
+;B[sk];W[sl];B[sj];W[qk];B[na];W[pa];B[nb];W[ra];B[pb];W[mb]\r
+;B[qa];W[pa];B[jf];W[if];B[an];W[ao];B[do];W[an];B[pi];W[pj]\r
+;B[ph];W[nj];B[oo];W[on];B[cc];W[ac];B[ce];W[bf];B[ak];W[aj]\r
+;B[sc];W[ma];B[sa];W[oa];B[ni];W[im];B[km];W[nh];B[hn];W[og]\r
+;B[aq];W[ak];B[cs];W[tt];B[nb];W[tt];B[tt])\r
diff --git a/regression/games/cgf2001/haruka.sgf b/regression/games/cgf2001/haruka.sgf
new file mode 100644 (file)
index 0000000..05d772e
--- /dev/null
@@ -0,0 +1,34 @@
+(;\r
+GM[1]FF[1]SZ[19]\r
+PB[haruka]\r
+PW[gnugo]\r
+DT[2001-08-26]\r
+RE[B+15.5]\r
+KM[5.5]TM[50]RU[Japanese]PC[Tokyo, The University of Electro-Communications]\r
+EV[CGF special meeting]GN[Round 5]\r
+\r
+;B[qd];W[dd];B[qp];W[cp];B[eq];W[gq];B[gp];W[hp];B[go];W[iq]\r
+;B[do];W[co];B[dn];W[cn];B[df];W[fd];B[cd];W[cc];B[ce];W[bc]\r
+;B[cj];W[dm];B[bm];W[cm];B[lq];W[bl];B[op];W[jc];B[ff];W[oc]\r
+;B[qg];W[he];B[in];W[je];B[fr];W[kr];B[hr];W[jo];B[km];W[oe]\r
+;B[cr];W[mf];B[mm];W[gr];B[gs];W[ir];B[dp];W[lr];B[mr];W[mq]\r
+;B[mp];W[nq];B[nr];W[lp];B[oq];W[kq];B[jp];W[io];B[bk];W[am]\r
+;B[pk];W[qm];B[mh];W[om];B[mo];W[rl];B[rk];W[ro];B[rp];W[ok]\r
+;B[mk];W[pl];B[pn];W[nl];B[qk];W[ih];B[jq];W[jr];B[oi];W[qb]\r
+;B[kh];W[qe];B[pe];W[pd];B[pf];W[re];B[dc];W[ec];B[bd];W[ij]\r
+;B[de];W[db];B[bn];W[ck];B[dk];W[cl];B[dj];W[bj];B[gj];W[jj]\r
+;B[is];W[hq];B[bi];W[ak];B[rf];W[se];B[og];W[ig];B[hi];W[ii]\r
+;B[em];W[hs];B[fs];W[hr];B[jn];W[fq];B[er];W[fp];B[fo];W[kf]\r
+;B[gg];W[bq];B[ko];W[kp];B[lo];W[ms];B[or];W[el];B[dl];W[br]\r
+;B[ai];W[cq];B[cs];W[dq];B[ep];W[dr];B[hl];W[ds];B[ge];W[gd]\r
+;B[hf];W[if];B[hd];W[ie];B[nf];W[ne];B[sf];W[qc];B[ac];W[of]\r
+;B[ng];W[qf];B[rg];W[pg];B[ph];W[ab];B[ad];W[bb];B[pf];W[ho]\r
+;B[hn];W[ee];B[ef];W[fe];B[lg];W[gf];B[hg];W[mg];B[lf];W[le]\r
+;B[me];W[md];B[mf];W[jl];B[ld];W[lc];B[ke];W[kd];B[le];W[kl]\r
+;B[ll];W[im];B[hm];W[aj];B[mc];W[mb];B[nd];W[lb];B[kj];W[ki]\r
+;B[li];W[nc];B[md];W[jm];B[kk];W[jk];B[ql];W[jh];B[lj];W[kg]\r
+;B[ji];W[hh];B[gh];W[hj];B[gi];W[ki];B[hk];W[ji];B[en];W[ns]\r
+;B[os];W[ls];B[od];W[pe];B[lh];W[pg];B[jg];W[jf];B[pf];W[bh]\r
+;B[ci];W[pg];B[jd];W[id];B[pf];W[fn];B[fm];W[pg];B[np];W[lq]\r
+;B[rn];W[ge];B[pf];W[gn];B[gm];W[pg];B[kc];W[kb];B[qh];W[pf]\r
+;B[pm];W[es];B[tt];W[il];B[ik];W[tt])\r
diff --git a/regression/games/cgf2001/image.sgf b/regression/games/cgf2001/image.sgf
new file mode 100644 (file)
index 0000000..8eb3be2
--- /dev/null
@@ -0,0 +1,32 @@
+(;\r
+GM[1]FF[1]SZ[19]\r
+PB[Image]\r
+PW[GNU]\r
+DT[2001-08-26]\r
+RE[W+37.5]\r
+KM[5.5]TM[50]RU[Japanese]PC[The University of Electro-Communications]\r
+EV[CGF special meeting]GN[Round 4]\r
+\r
+;B[pd];W[dp];B[cd];W[pp];B[nq];W[ed];B[ec];W[fc];B[dc];W[fd]\r
+;B[cf];W[jc];B[lc];W[pn];B[hc];W[qf];B[qd];W[qi];B[pr];W[lq]\r
+;B[qq];W[oq];B[or];W[np];B[ro];W[eg];B[nd];W[ch];B[fq];W[dn]\r
+;B[dr];W[hq];B[cq];W[eq];B[er];W[fp];B[bo];W[ck];B[he];W[ql]\r
+;B[rm];W[gg];B[je];W[nr];B[qm];W[pk];B[fb];W[gb];B[gc];W[eb]\r
+;B[db];W[fa];B[ib];W[pm];B[lh];W[fr];B[cm];W[lj];B[nh];W[ji]\r
+;B[mj];W[bg];B[bf];W[dg];B[ig];W[mk];B[nj];W[re];B[rd];W[rl]\r
+;B[pf];W[da];B[bb];W[hi];B[aa];W[fl];B[ca];W[cn];B[bn];W[dm]\r
+;B[cl];W[bl];B[bm];W[dl];B[jo];W[mq];B[gq];W[gp];B[gr];W[hr]\r
+;B[gs];W[bk];B[ff];W[gf];B[ef];W[df];B[hb];W[in];B[de];W[ge]\r
+;B[ee];W[fg];B[hs];W[is];B[fs];W[iq];B[jn];W[jm];B[km];W[jg]\r
+;B[io];W[ih];B[hn];W[jl];B[jq];W[jr];B[kp];W[im];B[go];W[hp]\r
+;B[kk];W[kl];B[lm];W[lk];B[if];W[kf];B[lf];W[ke];B[jd];W[ho]\r
+;B[le];W[sm];B[sn];W[qn];B[qp];W[rn];B[so];W[ph];B[og];W[qg]\r
+;B[pg];W[co];B[kd];W[bp];B[cp];W[kh];B[gd];W[fe];B[ea];W[fb]\r
+;B[nk];W[nl];B[kr];W[kq];B[qo];W[jp];B[po];W[oo];B[oi];W[lg]\r
+;B[mg];W[kg];B[li];W[am];B[bq];W[sd];B[sc];W[se];B[rb];W[ko]\r
+;B[qe];W[rf];B[ap];W[kn];B[pj];W[qj];B[ag];W[ah];B[af];W[ok]\r
+;B[cg];W[bh];B[pq];W[ki];B[oj];W[dd];B[ce];W[op];B[dq];W[ep]\r
+;B[pi];W[hg];B[ha];W[an];B[ao];W[al];B[oh];W[qh];B[ns];W[ms]\r
+;B[os];W[da];B[lr];W[mr];B[ea];W[aq];B[ar];W[da];B[js];W[ir]\r
+;B[ea];W[es];B[ds];W[da];B[rm];W[sl];B[ea];W[mh];B[mi];W[da]\r
+;B[mf];W[ea];B[hf];W[jf];B[ga];W[tt];B[tt])\r
diff --git a/regression/games/cgf2001/katsunari.sgf b/regression/games/cgf2001/katsunari.sgf
new file mode 100644 (file)
index 0000000..8270eaf
--- /dev/null
@@ -0,0 +1,39 @@
+(;\r
+GM[1]FF[1]SZ[19]\r
+PB[gnugo]\r
+PW[katsunari]\r
+DT[2001-08-25]\r
+RE[B+1.5 ? W+timeout]\r
+KM[5.5]TM[50]RU[Japanese]PC[The University of Electro-Communications]\r
+EV[CGF special meeting]GN[Round 3]\r
+\r
+;B[pp];W[pd];B[dd];W[cp];B[eq];W[iq];B[do];W[co];B[dn];W[cn]\r
+;B[dm];W[cl];B[ek];W[cm];B[qf];W[nc];B[rd];W[qc];B[qi];W[qn]\r
+;B[lc];W[lq];B[pn];W[fc];B[qo];W[ci];B[qm];W[ic];B[cf];W[db]\r
+;B[cc];W[rc];B[nq];W[cb];B[mo];W[bc];B[bd];W[dc];B[cd];W[mk]\r
+;B[bb];W[ba];B[ac];W[dl];B[cr];W[el];B[fo];W[fl];B[ei];W[dh]\r
+;B[qe];W[mi];B[bq];W[ie];B[mb];W[nb];B[le];W[ne];B[kf];W[ig]\r
+;B[jb];W[jc];B[ib];W[hb];B[kb];W[hc];B[kh];W[kj];B[ji];W[oi]\r
+;B[hi];W[gg];B[gh];W[ik];B[pk];W[ia];B[mg];W[ng];B[gj];W[gk]\r
+;B[mr];W[lr];B[fe];W[ge];B[nl];W[ho];B[gr];W[hr];B[kn];W[gs]\r
+;B[bh];W[gq];B[ef];W[bi];B[fg];W[er];B[dq];W[dp];B[ep];W[gn]\r
+;B[fn];W[pr];B[rr];W[qq];B[ch];W[pg];B[rh];W[qg];B[rg];W[rq]\r
+;B[rp];W[rs];B[sr];W[di];B[sq];W[ej];B[fi];W[fj];B[kl];W[ml]\r
+;B[mm];W[mp];B[im];W[nk];B[gm];W[np];B[or];W[oq];B[qr];W[pq]\r
+;B[op];W[eh];B[fh];W[ij];B[no];W[ii];B[la];W[hh];B[ol];W[dg]\r
+;B[an];W[ah];B[bg];W[df];B[fm];W[cq];B[dr];W[fq];B[ao];W[bp]\r
+;B[hn];W[ee];B[ap];W[de];B[ab];W[ce];B[be];W[al];B[jj];W[jk]\r
+;B[kk];W[lj];B[io];W[go];B[ip];W[hp];B[sc];W[hl];B[hm];W[sb]\r
+;B[sd];W[pj];B[qj];W[cg];B[bf];W[ok];B[rb];W[qb];B[sa];W[qk]\r
+;B[pl];W[lo];B[jh];W[ln];B[lm];W[mn];B[nn];W[ko];B[jo];W[mh]\r
+;B[kp];W[mf];B[ja];W[na];B[mc];W[lg];B[je];W[kd];B[me];W[kc]\r
+;B[ma];W[ke];B[lf];W[kg];B[jg];W[kq];B[lp];W[mq];B[nr];W[ms]\r
+;B[ps];W[ld];B[md];W[ns];B[qp];W[nd];B[jq];W[jr];B[ha];W[ga]\r
+;B[ia];W[fb];B[if];W[hf];B[jf];W[rk];B[ql];W[rl];B[rj];W[pf]\r
+;B[id];W[he];B[jd];W[hd];B[lh];W[pe];B[mg];W[lg];B[es];W[fr]\r
+;B[fp];W[jl];B[ed];W[fd];B[ec];W[eb];B[pi];W[jm];B[oj];W[nj]\r
+;B[oh];W[ni];B[ph];W[km];B[ll];W[ih];B[og];W[of];B[gp];W[hq]\r
+;B[em];W[jn];B[in];W[am];B[bn];W[bo];B[aq];W[bm];B[br];W[mg]\r
+;B[jp];W[gl];B[pj];W[qd];B[nh];W[qa];B[sb];W[ra];B[sf];W[li]\r
+;B[re];W[il];B[os];W[ls];B[ag];W[ai];B[aa];W[ca];B[qh];W[lk]\r
+;B[ki];W[ds];B[cs];W[fs];B[ds];W[kg];B[tt];W[tt])\r
diff --git a/regression/games/cgf2002/Aya.sgf b/regression/games/cgf2002/Aya.sgf
new file mode 100644 (file)
index 0000000..45a330e
--- /dev/null
@@ -0,0 +1,55 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.3.6]
+PB[Aya]
+DT[2002-08-24]
+RE[B+7.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 4]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)];B[qp];W[dd];B[cq]
+;W[op];B[qc];W[qq];B[do];W[rp]
+;B[od];W[mc];B[cc];W[cd];B[dc]
+;W[ec];B[eb];W[fc];B[fb];W[gc]
+;B[bd];W[be];B[bc];W[cf];B[md]
+;W[ld];B[lc];W[nc];B[nd];W[kc]
+;B[qm];W[le];B[po];W[cm];B[qh]
+;W[cj];B[ob];W[pp];B[lb];W[mg]
+;B[hq];W[og];B[lq];W[fm];B[mb]
+;W[hm];B[qo];W[oi];B[qj];W[nk]
+;B[nr];W[jm];B[pr];W[lm];B[mo]
+;W[ic];B[qr];W[ij];B[jo];W[gp]
+;B[hp];W[go];B[eq];W[qf];B[pf]
+;W[bo];B[nm];W[gq];B[bp];W[fr]
+;B[bn];W[hr];B[jr];W[bm];B[co]
+;W[dr];B[er];W[es];B[cr];W[hf]
+;B[ol];W[cs];B[br];W[ph];B[qg]
+;W[nl];B[pj];W[an];B[ao];W[am]
+;B[ir];W[dq];B[bs];W[ep];B[mm]
+;W[ml];B[kb];W[jb];B[gb];W[is]
+;B[kd];W[jc];B[je];W[lf];B[jg]
+;W[js];B[he];W[kr];B[ge];W[hb]
+;B[ef];W[gf];B[ie];W[ee];B[hh]
+;W[ih];B[ki];W[ig];B[jk];W[km]
+;B[lh];W[iq];B[eh];W[ff];B[lg]
+;W[nf];B[mj];W[nh];B[mh];W[nj]
+;B[fd];W[jj];B[ed];W[ia];B[jf]
+;W[fi];B[kn];W[fe];B[gd];W[hi]
+;B[hc];W[kk];B[eo];W[kq];B[kp]
+;W[lr];B[mq];W[ip];B[em];W[el]
+;B[dm];W[dl];B[cn];W[ln];B[lo]
+;W[fo];B[in];W[jn];B[io];W[lj]
+;B[mi];W[pg];B[pe];W[qi];B[ri]
+;W[mr];B[mn];W[ho];B[nq];W[dp]
+;B[im];W[il];B[pi];W[jp];B[ko]
+;W[en];B[dn];W[cp];B[ar];W[bo]
+;B[ds];W[ap];B[ms];W[ls];B[ns]
+;W[ni];B[of];W[jh];B[kf];W[kh]
+;B[kg];W[li];B[lk];W[mk];B[kj]
+;W[ne];B[me];W[kl];B[re];W[mf]
+;B[ji];W[hn];B[ok];W[ad];B[ac]
+;W[ae];B[ii];W[gi];B[if];W[hg]
+;B[ke];W[hj];B[oe];W[ng];B[lj]
+;W[ll];B[rr];W[de];B[hd];W[oj]
+;B[tt];W[tt]
+)
diff --git a/regression/games/cgf2002/Caren.sgf b/regression/games/cgf2002/Caren.sgf
new file mode 100644 (file)
index 0000000..5bbef63
--- /dev/null
@@ -0,0 +1,63 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Caren's wisper]
+PB[GNU Go 3.3.6]
+DT[2002-08-24]
+RE[B+144.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 3]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)];B[pd];W[dc];B[dp]
+;W[pq];B[ce];W[dh];B[fe];W[gc]
+;B[qo];W[pl];B[pn];W[np];B[rq]
+;W[jq];B[qj];W[cn];B[dn];W[dm]
+;B[en];W[co];B[cp];W[pj];B[fp]
+;W[qk];B[qi];W[nm];B[bh];W[cj]
+;B[oh];W[ch];B[jd];W[ni];B[mg]
+;W[ld];B[kc];W[bg];B[hq];W[rj]
+;B[rh];W[mn];B[io];W[pp];B[qr]
+;W[po];B[on];W[qn];B[qm];W[ql]
+;B[rn];W[lh];B[nd];W[mh];B[ke]
+;W[lg];B[qe];W[le];B[lf];W[mf]
+;B[lc];W[kf];B[jm];W[nn];B[ng]
+;W[oi];B[or];W[ie];B[id];W[bd]
+;B[jf];W[ig];B[dd];W[cc];B[jg]
+;W[kj];B[if];W[ed];B[hf];W[he]
+;B[ee];W[md];B[mc];W[ne];B[oe]
+;W[ip];B[hp];W[jo];B[in];W[em]
+;B[hd];W[gm];B[gd];W[ec];B[bp]
+;W[fn];B[gn];W[go];B[hn];W[eo]
+;B[do];W[eq];B[fo];W[fm];B[cm]
+;W[hk];B[be];W[il];B[cl];W[ep]
+;B[fq];W[jl];B[ih];W[kl];B[mq]
+;W[cr];B[hb];W[es];B[br];W[fb]
+;B[kp];W[jp];B[kq];W[fr];B[ko]
+;W[jr];B[gr];W[dr];B[dq];W[dl]
+;B[rl];W[ph];B[pg];W[bi];B[rk]
+;W[km];B[jn];W[pr];B[pi];W[ps]
+;B[nr];W[kr];B[kn];W[lr];B[mp]
+;W[no];B[gh];W[om];B[cd];W[bc]
+;B[ei];W[mr];B[nq];W[ej];B[fi]
+;W[di];B[nf];W[me];B[bk];W[hc]
+;B[ic];W[gb];B[ib];W[fj];B[gj]
+;W[gk];B[qp];W[hj];B[gi];W[fg]
+;B[gg];W[ef];B[ff];W[eg];B[ck]
+;W[ha];B[ia];W[ga];B[bj];W[jh]
+;B[dk];W[ii];B[dj];W[ci];B[df]
+;W[cf];B[ah];W[ai];B[bf];W[cg]
+;B[fk];W[af];B[ae];W[hh];B[hm]
+;W[hl];B[el];W[gl];B[hg];W[ih]
+;B[pm];W[oj];B[kg];W[lf];B[kd]
+;W[nc];B[od];W[pb];B[nb];W[qc]
+;B[rd];W[rc];B[sc];W[sb];B[ra]
+;W[sd];B[qd];W[qa];B[rb];W[oa]
+;B[ob];W[qb];B[se];W[sc];B[ri]
+;W[sa];B[qq];W[fl];B[ek];W[ag]
+;B[eh];W[ad];B[de];W[qs];B[rs]
+;W[lo];B[oo];W[op];B[ln];W[lq]
+;B[lp];W[lm];B[mo];W[cs];B[cq]
+;W[gs];B[hr];W[os];B[ns];W[nh]
+;B[og];W[ki];B[fd];W[eb];B[kh]
+;W[hi];B[fc];W[er];B[bs];W[oq]
+;B[im];W[tt];B[tt]
+)
diff --git a/regression/games/cgf2002/Image.sgf b/regression/games/cgf2002/Image.sgf
new file mode 100644 (file)
index 0000000..701a378
--- /dev/null
@@ -0,0 +1,72 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Image]
+PB[GNU Go 3.3.6]
+DT[2002-08-24]
+RE[B+17.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 5]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)];B[pd];W[dp];B[pp]
+;W[qf];B[ed];W[cd];B[cc];W[bc]
+;B[dc];W[be];B[ic];W[ee];B[cn]
+;W[fq];B[bp];W[cq];B[ck];W[qn]
+;B[np];W[rp];B[qq];W[qk];B[jq]
+;W[nc];B[nd];W[md];B[ne];W[oc]
+;B[jo];W[pc];B[qd];W[qc];B[om]
+;W[pm];B[ch];W[cb];B[ng];W[me]
+;B[oe];W[ph];B[pf];W[mh];B[gd]
+;W[mf];B[oh];W[oi];B[rc];W[lm]
+;B[qe];W[pg];B[qg];W[qh];B[rf]
+;W[nf];B[rh];W[ri];B[on];W[jm]
+;B[si];W[lj];B[qi];W[pi];B[db]
+;W[bb];B[rq];W[mn];B[lp];W[fe]
+;B[kc];W[iq];B[ip];W[hq];B[qb]
+;W[jr];B[ro];W[rn];B[qp];W[pb]
+;B[kr];W[kq];B[lq];W[jp];B[kp]
+;W[rb];B[jq];W[em];B[sb];W[qa]
+;B[rj];W[bq];B[hm];W[bo];B[ho]
+;W[rd];B[bn];W[cp];B[sn];W[sm]
+;B[so];W[rk];B[ir];W[hr];B[js]
+;W[lb];B[hf];W[de];B[ol];W[ig]
+;B[lc];W[mc];B[kb];W[if];B[mb]
+;W[nb];B[ik];W[kf];B[la];W[ek]
+;B[hj];W[cj];B[bj];W[eh];B[dj]
+;W[ej];B[hs];W[gs];B[is];W[fr]
+;B[di];W[gh];B[ie];W[gp];B[ei]
+;W[bg];B[fi];W[fh];B[cg];W[cf]
+;B[dg];W[eg];B[gi];W[je];B[he]
+;W[qj];B[fn];W[en];B[el];W[fl]
+;B[dl];W[fm];B[fk];W[fj];B[gk]
+;W[fo];B[ao];W[ap];B[an];W[mk]
+;B[jj];W[ok];B[kl];W[km];B[pl]
+;W[ql];B[sk];W[sl];B[ri];W[da]
+;B[ea];W[ca];B[fb];W[qo];B[sp]
+;W[jd];B[of];W[og];B[gn];W[ki]
+;B[bh];W[ag];B[kk];W[ah];B[ai]
+;W[jc];B[jb];W[dm];B[cm];W[no]
+;B[pn];W[in];B[nl];W[ml];B[nk]
+;W[nj];B[pk];W[pj];B[qm];W[rm]
+;B[co];W[hn];B[go];W[oo];B[po]
+;W[sj];B[eo];W[do];B[mo];W[nn]
+;B[fp];W[dn];B[ln];W[kn];B[lo]
+;W[op];B[oq];W[mm];B[hp];W[ii]
+;B[ji];W[jh];B[gq];W[gr];B[ep]
+;W[eq];B[hg];W[hh];B[ld];W[fd]
+;B[fc];W[gl];B[hl];W[id];B[hd]
+;W[na];B[dd];W[ma];B[df];W[lb]
+;B[ka];W[jl];B[kj];W[il];B[le]
+;W[lf];B[lk];W[mi];B[re];W[sc]
+;B[ef];W[ff];B[sk];W[pm];B[bp]
+;W[aq];B[qm];W[sj];B[gp];W[gg]
+;B[sk];W[pm];B[se];W[io];B[im]
+;W[jn];B[sd];W[rc];B[qm];W[sj]
+;B[ke];W[ko];B[gm];W[gf];B[hb]
+;W[nq];B[mp];W[sk];B[jp];W[pm]
+;B[dq];W[dr];B[qm];W[ij];B[jk]
+;W[ll];B[hk];W[pm];B[hi];W[ih]
+;B[qm];W[mb];B[bo];W[pm];B[nm]
+;W[mj];B[oj];W[qm];B[od];W[ok]
+;B[jf];W[jg];B[oj];W[jf];B[ok]
+;W[kd];B[dh];W[ge];B[tt];W[tt]
+)
diff --git a/regression/games/cgf2002/gnu-and.sgf b/regression/games/cgf2002/gnu-and.sgf
new file mode 100644 (file)
index 0000000..0378318
--- /dev/null
@@ -0,0 +1,59 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Ando-Kun's Go]
+PB[GNU Go 3.3.6]
+DT[2002-08-25]
+RE[B+17.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 6]
+C[It'a funny game of mirror Go. See 205th move.]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)];B[pd];W[dp];B[pq]
+;W[dc];B[fq];W[nc];B[ce];W[qo]
+;B[ed];W[op];B[ec];W[oq];B[db]
+;W[pr];B[pf];W[dn];B[dr];W[pb]
+;B[qc];W[cq];B[qj];W[cj];B[iq]
+;W[kc];B[qm];W[cg];B[me];W[go]
+;B[lq];W[hc];B[oj];W[ej];B[qb]
+;W[cr];B[ob];W[er];B[fr];W[nb]
+;B[oc];W[eq];B[na];W[fs];B[ma]
+;W[gs];B[lc];W[hq];B[kd];W[ip]
+;B[jq];W[jc];B[kn];W[if];B[kh]
+;W[il];B[ih];W[kl];B[hi];W[lk]
+;B[mn];W[gf];B[hm];W[lg];B[in]
+;W[kf];B[hk];W[li];B[hl];W[lh]
+;B[em];W[og];B[pg];W[dm];B[fl]
+;W[nh];B[dl];W[ph];B[cl];W[qh]
+;B[gn];W[mf];B[ho];W[le];B[hp]
+;W[ld];B[lb];W[hr];B[gp];W[md]
+;B[rn];W[bf];B[cc];W[qq];B[be]
+;W[ro];B[bn];W[rf];B[bk];W[ri]
+;B[rj];W[bj];B[om];W[eg];B[ml]
+;W[gh];B[re];W[bo];B[rg];W[bm]
+;B[gb];W[mr];B[jk];W[ji];B[jl]
+;W[jh];B[so];W[ae];B[ad];W[sp]
+;B[sn];W[af];B[bd];W[rp];B[hb]
+;W[lr];B[ib];W[kr];B[ic];W[kq]
+;B[jd];W[jp];B[gd];W[mp];B[ll]
+;W[hh];B[kk];W[ii];B[rh];W[bl]
+;B[qi];W[ck];B[oi];W[ek];B[el]
+;W[oh];B[nd];W[fp];B[fo];W[ne]
+;B[od];W[ep];B[mc];W[gq];B[kj]
+;W[ij];B[lj];W[hj];B[mi];W[gk]
+;B[fk];W[ni];B[fj];W[nj];B[mj]
+;W[gj];B[fi];W[nk];B[ki];W[ik]
+;B[ei];W[ok];B[pk];W[di];B[df]
+;W[pn];B[dg];W[pm];B[ql];W[ch]
+;B[eh];W[ol];B[fg];W[nm];B[ff]
+;W[nn];B[he];W[lo];B[hf];W[ln]
+;B[ie];W[ko];B[jg];W[jm];B[im]
+;W[kg];B[ig];W[km];B[jn];W[jf]
+;B[hg];W[lm];B[gi];W[mk];B[gl]
+;W[mh];B[jj];W[en];B[dk];W[dj]
+;B[cf];W[bg];B[pi];W[cn];B[qg]
+;W[fn];B[eo];W[of];B[do];W[co]
+;B[go];W[oe];B[pe];W[fm];B[qn]
+;W[io];B[jo];W[kp];B[gm];W[je]
+;B[dh];W[cm];B[pl];W[ke];B[id]
+;W[tt];B[tt]
+)
diff --git a/regression/games/cgf2002/gnu-har.sgf b/regression/games/cgf2002/gnu-har.sgf
new file mode 100644 (file)
index 0000000..ce65796
--- /dev/null
@@ -0,0 +1,57 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Haruka]
+PB[GNU Go 3.3.6]
+DT[2002-08-25]
+RE[W+155.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 8]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)];B[pd];W[dn];B[qp]
+;W[cd];B[ed];W[gc];B[fe];W[dg]
+;B[op];W[nc];B[qj];W[qc];B[qd]
+;W[pc];B[od];W[oc];B[me];W[ld]
+;B[lq];W[he];B[hq];W[gf];B[cc]
+;W[bd];B[dc];W[bb];B[fb];W[cj]
+;B[gb];W[hc];B[hb];W[ib];B[cb]
+;W[fc];B[eb];W[og];B[fn];W[dq]
+;B[el];W[om];B[qm];W[oj];B[qg]
+;W[mn];B[kf];W[jm];B[mg];W[jk]
+;B[ia];W[ja];B[ek];W[ha];B[da]
+;W[hl];B[gl];W[cl];B[ei];W[di]
+;B[jo];W[ki];B[fr];W[er];B[of]
+;W[pg];B[nh];W[pi];B[qi];W[qf]
+;B[pf];W[qh];B[rg];W[rh];B[rf]
+;W[mj];B[ng];W[fo];B[gk];W[gi]
+;B[gn];W[go];B[in];W[bc];B[oi]
+;W[pj];B[ph];W[ni];B[oh];W[qk]
+;B[rj];W[rk];B[ri];W[sj];B[sh]
+;W[hm];B[hn];W[pn];B[fq];W[eo]
+;B[hk];W[kp];B[ko];W[lp];B[lo]
+;W[mo];B[mp];W[kq];B[lr];W[ir]
+;B[iq];W[jr];B[np];W[kr];B[ln]
+;W[fm];B[em];W[gm];B[en];W[hr]
+;B[gr];W[fs];B[gs];W[km];B[mm]
+;W[nn];B[lm];W[jp];B[ho];W[ip]
+;B[hp];W[pl];B[rm];W[fl];B[fj]
+;W[es];B[fp];W[ii];B[im];W[il]
+;B[rc];W[rb];B[kd];W[ke];B[je]
+;W[le];B[lf];W[jf];B[jc];W[kc]
+;B[rd];W[jd];B[jg];W[ie];B[ig]
+;W[hh];B[sb];W[ra];B[ba];W[ff]
+;B[de];W[cf];B[ef];W[eg];B[mi]
+;W[nj];B[li];W[lj];B[kh];W[ji]
+;B[ll];W[ls];B[fk];W[do];B[if]
+;W[eh];B[df];W[gp];B[gq];W[dd]
+;B[ec];W[ce];B[ee];W[qo];B[po]
+;W[qn];B[rp];W[ro];B[oo];W[on]
+;B[ga];W[nr];B[qr];W[mq];B[or]
+;W[sp];B[sq];W[so];B[rr];W[lh]
+;B[mh];W[jh];B[kg];W[md];B[ne]
+;W[ge];B[nq];W[mr];B[ns];W[ia]
+;B[hg];W[gg];B[fd];W[je];B[gd]
+;W[hd];B[ih];W[ab];B[si];W[sk]
+;B[nd];W[ms];B[os];W[aa];B[ca]
+;W[cg];B[no];W[hf];B[sc];W[qb]
+;B[sa];W[tt];B[tt]
+)
diff --git a/regression/games/cgf2002/kat-gnu.sgf b/regression/games/cgf2002/kat-gnu.sgf
new file mode 100644 (file)
index 0000000..526a5d9
--- /dev/null
@@ -0,0 +1,69 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.3.6]
+PB[Katsunari]
+DT[2002-08-25]
+RE[W+15.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 7]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)]
+;B[pd];W[dc];B[pq];W[dp];B[de]
+;W[dh];B[fq];W[ce];B[qk];W[cd]
+;B[kq];W[pg];B[dr];W[ed];B[nd]
+;W[po];B[qo];W[qn];B[qp];W[pn]
+;B[nq];W[lc];B[cl];W[ic];B[ci]
+;W[mn];B[ok];W[nb];B[pb];W[fp]
+;B[gq];W[mp];B[mq];W[jo];B[ko]
+;W[kn];B[jp];W[lo];B[gf];W[kp]
+;B[jq];W[gd];B[ng];W[eq];B[er]
+;W[mk];B[qi];W[oh];B[nh];W[qe]
+;B[qd];W[rg];B[ri];W[rd];B[rc]
+;W[rf];B[sd];W[pe];B[oi];W[of]
+;B[nf];W[se];B[re];W[qh];B[oe]
+;W[rn];B[io];W[in];B[ro];W[df]
+;B[co];W[gm];B[cp];W[go];B[og]
+;W[ho];B[rd];W[lk];B[ch];W[hg]
+;B[dq];W[ee];B[ep];W[fk];B[gg]
+;W[li];B[eo];W[lf];B[hf];W[fj]
+;B[rl];W[kh];B[cg];W[ei];B[dg]
+;W[ig];B[eg];W[hh];B[hj];W[em]
+;B[bf];W[md];B[fn];W[ip];B[iq]
+;W[fm];B[gn];W[hn];B[gi];W[gh]
+;B[fi];W[fh];B[eh];W[di];B[cj]
+;W[dk];B[fg];W[be];B[ef];W[cf]
+;B[bg];W[hq];B[hr];W[hp];B[ck]
+;W[if];B[dl];W[dj];B[he];W[el]
+;B[ie];W[je];B[jd];W[id];B[me]
+;W[le];B[mc];W[ld];B[nc];W[mb]
+;B[hd];W[hc];B[ph];W[fo];B[en]
+;W[dm];B[cm];W[dn];B[do];W[ob]
+;B[nl];W[pa];B[qb];W[fe];B[om]
+;W[oc];B[od];W[nj];B[on];W[oo]
+;B[no];W[np];B[op];W[nn];B[ml]
+;W[ll];B[qa];W[oj];B[oa];W[pj]
+;B[pi];W[pk];B[pl];W[qm];B[ql]
+;W[cn];B[bn];W[pp];B[hl];W[qq]
+;B[rq];W[qr];B[rr];W[oq];B[pr]
+;W[or];B[qs];W[lq];B[lr];W[mr]
+;B[lp];W[nr];B[lq];W[nk];B[hm]
+;W[gl];B[lm];W[mm];B[ol];W[mf]
+;B[jm];W[km];B[na];W[ma];B[pc]
+;W[kb];B[sn];W[sm];B[rm];W[so]
+;B[sp];W[sn];B[hk];W[mi];B[jn]
+;W[ko];B[ms];W[sl];B[sk];W[qj]
+;B[rj];W[af];B[ag];W[ae];B[pa]
+;W[mg];B[pm];W[op];B[ns];W[os]
+;B[ps];W[mo];B[ls];W[mh];B[ni]
+;W[ge];B[bm];W[ne];B[ff];W[me]
+;B[gp];W[nm];B[im];W[io];B[rk]
+;W[tt];B[jl];W[ii];B[tt];W[tt]
+;
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ka][la][ab][bb][cb][db][eb][fb][gb][hb][ib][jb][lb][ac][bc][cc][ec][fc][gc][jc][kc][ad][bd][fd][jd][kd][ke][jf][kf][jg][kg][lg][ih][jh][lh][fi][gi][hi][ji][ki][ej][gj][hj][ij][jj][kj][lj][mj][ek][gk][hk][ik][jk][kk][fl][hl][il][jl][kl][hm][im][jm][jn][no]
+TB[ra][sa][rb][sb][qc][sc][pe][qe][se][of][pf][qf][rf][sf][pg][qg][rg][sg][ah][bh][oh][qh][rh][sh][ai][bi][si][aj][bj][sj][ak][bk][al][bl][am][an][ao][bo][ap][bp][dp][rp][aq][bq][cq][eq][qq][sq][ar][br][cr][fr][gr][ir][jr][kr][qr][sr][as][bs][cs][ds][es][fs][gs][hs][is][js][ks][rs][ss]
+C[The game is over.  Final score:
+   White = 74 territory + 17 captures + 5.5 komi = 96.5
+   Black = 71 territory + 16 captures = 87
+White wins by 9.5.
+]
+)
diff --git a/regression/games/cgf2002/martha.sgf b/regression/games/cgf2002/martha.sgf
new file mode 100644 (file)
index 0000000..00c4b34
--- /dev/null
@@ -0,0 +1,71 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.3.6]
+PB[Martha]
+DT[2002-08-24]
+RE[W+Time Over]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 2]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)];B[jj];W[dp];B[bb]
+;W[qo];B[eb];W[qe];B[hb];W[pq]
+;B[kb];W[pc];B[nb];W[jq];B[qb]
+;W[pb];B[cd];W[cl];B[fd];W[ci]
+;B[id];W[qh];B[ld];W[cf];B[od]
+;W[oi];B[rd];W[qc];B[bf];W[be]
+;B[df];W[ce];B[gf];W[el];B[jf]
+;W[gq];B[mf];W[mq];B[pf];W[ql]
+;B[rg];W[qf];B[ch];W[di];B[fh]
+;W[dh];B[ih];W[cp];B[lh];W[qg]
+;B[oh];W[ml];B[qi];W[pi];B[bj]
+;W[dg];B[ej];W[jl];B[mj];W[hk]
+;B[gk];W[gl];B[ok];W[ol];B[rk]
+;W[ef];B[kl];W[kk];B[bm];W[km]
+;B[em];W[bl];B[mm];W[nm];B[qm]
+;W[pm];B[gn];W[fm];B[kn];W[ln]
+;B[co];W[ko];B[no];W[do];B[ro]
+;W[rp];B[ep];W[jk];B[hp];W[eq]
+;B[kp];W[jp];B[bq];W[bp];B[oq]
+;W[jn];B[rq];W[qp];B[er];W[fr]
+;B[ir];W[rl];B[lr];W[nk];B[im]
+;W[hm];B[pr];W[mr];B[pn];W[op]
+;B[cs];W[qr];B[ns];W[qq];B[ck]
+;W[dk];B[gs];W[hq];B[ad];W[dr]
+;B[sm];W[sl];B[hj];W[ri];B[si]
+;W[sj];B[ao];W[ae];B[ik];W[in]
+;B[rs];W[hl];B[pa];W[oa];B[sb]
+;W[rc];B[ah];W[de];B[nj];W[ho]
+;B[mk];W[oo];B[nl];W[ll];B[nn]
+;W[om];B[io];W[bd];B[go];W[hn]
+;B[on];W[pl];B[np];W[mn];B[po]
+;W[pp];B[na];W[ob];B[dq];W[cq]
+;B[al];W[bk];B[pj];W[qj];B[sf]
+;W[bg];B[rj];W[qn];B[lo];W[nc]
+;B[sk];W[qk];B[eg];W[mb];B[fq]
+;W[jr];B[dq];W[gr];B[jo];W[eo]
+;B[kn];W[ip];B[js];W[nq];B[dl]
+;W[gj];B[cm];W[cj];B[ak];W[dm]
+;B[dn];W[bi];B[dl];W[ck];B[fl]
+;W[fk];B[ek];W[fl];B[rh];W[qi]
+;B[mc];W[nd];B[ne];W[md];B[oc]
+;W[lc];B[me];W[mc];B[lb];W[kc]
+;B[jc];W[kd];B[ke];W[ap];B[ar]
+;W[hi];B[ba];W[ij];B[ii];W[fg]
+;B[hj];W[gg];B[hg];W[gh];B[hh]
+;W[gi];B[ea];W[cc];B[dc];W[cb]
+;B[ha];W[oe];B[ee];W[of];B[og]
+;W[ca];B[mp];W[lq];B[jd];W[ma]
+;B[nb];W[ff];B[la];W[pd];B[bc]
+;W[dd];B[da];W[jb];B[db];W[ed]
+;B[cd];W[ge];B[od];W[fc];B[pe]
+;W[pg];B[pe];W[ib];B[nf];W[hd]
+;B[pf];W[ic];B[ja];W[he];B[hc]
+;W[ka];B[kb];W[lb];B[ia];W[kb]
+;B[kq];W[fn];B[iq];W[ko];B[jo]
+;W[kr];B[kn];W[cr];B[ks];W[gp]
+;B[kh];W[if];B[sp];W[ni];B[rr]
+;W[oe];B[rn];W[rm];B[nr];W[qs]
+;B[ms];W[or];B[of];W[fb];B[os]
+;W[fa];B[oq];W[ls];B[lp];W[lr]
+;B[gb];W[je]
+)
diff --git a/regression/games/cgf2002/shi-gnu.sgf b/regression/games/cgf2002/shi-gnu.sgf
new file mode 100644 (file)
index 0000000..ce75f77
--- /dev/null
@@ -0,0 +1,77 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.3.6]
+PB[Shiko-SakuGo]
+DT[2002-08-25]
+RE[W+90.5]
+PC[The University of Electro-Communications, Tokyo]
+EV[CGF special meeting]
+GN[Round 9]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)]
+;B[pd];W[dp];B[cd];W[pp];B[nq]
+;W[ed];B[qn];W[np];B[mp];W[cc]
+;B[bc];W[no];B[qq];W[oq];B[qp]
+;W[dc];B[be];W[ic];B[dg];W[mq]
+;B[cn];W[mo];B[lp];W[nr];B[iq]
+;W[nc];B[pf];W[pb];B[fq];W[eo]
+;B[cq];W[cp];B[dq];W[go];B[dk]
+;W[qc];B[qd];W[qh];B[lq];W[lr]
+;B[kr];W[qk];B[qg];W[ph];B[rg]
+;W[ne];B[kc];W[fl];B[ke];W[dm]
+;B[di];W[cm];B[bn];W[bo];B[jq]
+;W[bk];B[cl];W[bm];B[an];W[aj]
+;B[bl];W[am];B[al];W[ao];B[ff]
+;W[gd];B[ng];W[ni];B[nf];W[ol]
+;B[rc];W[rb];B[rd];W[kn];B[mb]
+;W[oc];B[od];W[li];B[nd];W[sb]
+;B[sc];W[nb];B[mc];W[hj];B[na]
+;W[in];B[pc];W[rh];B[hg];W[jh]
+;B[qb];W[bb];B[jb];W[ib];B[rl]
+;W[rk];B[pr];W[bq];B[br];W[ac]
+;B[bd];W[lg];B[lf];W[rm];B[ql]
+;W[sl];B[qm];W[ar];B[cr];W[ks]
+;B[js];W[ls];B[rn];W[sm];B[sn]
+;W[sk];B[fi];W[eq];B[er];W[fp]
+;B[ep];W[gq];B[eq];W[gr];B[hr]
+;W[kp];B[kq];W[hs];B[lo];W[ln]
+;B[ko];W[is];B[jr];W[jo];B[jp]
+;W[hp];B[fr];W[ds];B[io];W[ip]
+;B[jn];W[ho];B[jo];W[jm];B[im]
+;W[jl];B[hn];W[ja];B[ka];W[ia]
+;B[hl];W[gk];B[hk];W[gm];B[gj]
+;W[hi];B[gi];W[fk];B[pk];W[pl]
+;B[pj];W[qj];B[pi];W[nj];B[or]
+;W[sg];B[sf];W[sh];B[qi];W[oh]
+;B[rj];W[po];B[sj];W[de];B[ce]
+;W[os];B[ps];W[ns];B[nk];W[ok]
+;B[mk];W[oj];B[if];W[ab];B[qo]
+;W[cf];B[df];W[bf];B[cg];W[af]
+;B[bg];W[ae];B[pn];W[on];B[om]
+;W[nm];B[pm];W[ag];B[bh];W[ah]
+;B[bi];W[ai];B[nl];W[lk];B[mm]
+;W[nn];B[ml];W[mj];B[me];W[ee]
+;B[fe];W[kg];B[jf];W[jc];B[kb]
+;W[jd];B[fd];W[fc];B[fj];W[kd]
+;B[ld];W[pq];B[qr];W[ef];B[eg]
+;W[hh];B[gh];W[ek];B[ej];W[dl]
+;B[ck];W[bj];B[cj];W[ig];B[mh]
+;W[mg];B[nh];W[oi];B[hf];W[jg]
+;B[lh];W[ge];B[gf];W[og];B[kh]
+;W[ki];B[hd];W[gc];B[id];W[he]
+;B[ie];W[of];B[oe];W[rf];B[se]
+;W[qf];B[hc];W[hb];B[je];W[ga]
+;B[cs];W[fs];B[es];W[gs];B[gn]
+;W[gl];B[ij];W[ik];B[hm];W[fn]
+;B[in];W[ll];B[jk];W[jj];B[il]
+;W[ii];B[ik];W[kk];B[mf];W[qe]
+;B[hq];W[kf];B[re];W[pg];B[pe]
+;W[ri];B[ak];W[ad];B[mi];W[si]
+;B[tt];W[tt];
+TW[aa][ba][ca][da][ea][fa][ha][cb][db][eb][fb][gb][bc][ec][bd][cd][dd][be][ce][qg][rg][ih][ji][ij][kj][lj][hk][ik][jk][mk][nk][el][hl][il][kl][ml][nl][em][fm][hm][im][km][lm][mm][an][bn][cn][dn][en][gn][hn][in][jn][mn][co][do][fo][io][jo][ko][lo][oo][ap][bp][ep][gp][jp][kp][lp][mp][op][aq][cq][dq][eq][fq][hq][iq][jq][kq][lq][nq][br][cr][dr][er][fr][hr][ir][jr][kr][mr][as][bs][cs][es][js][ms]
+TB[la][ma][oa][pa][qa][ra][sa][lb][nb][ob][pb][rb][sb][lc][nc][oc][qc][md][sd][le][ne][fg][gg][ch][dh][eh][fh][ci][ei][dj][qj][qk][rk][sk][sl][rm][sm][ro][so][rp][sp][rq][sq][rr][sr][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 98 territory + 55 captures + 5.5 komi = 158.5
+   Black = 48 territory + 20 captures = 68
+White wins by 90.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-Aya.sgf b/regression/games/cgf2003/GnuGo-Aya.sgf
new file mode 100644 (file)
index 0000000..17ba291
--- /dev/null
@@ -0,0 +1,59 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.3.23]
+PB[AYA]
+GN[GNU Go (W) vs. AYA (B)]
+DT[2003-08-03]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[W+67.5]
+;B[cd];W[pd];B[qp];W[dq];B[co]
+;W[ep];B[oq];W[dn];B[ec];W[cn]
+;B[qc];W[qd];B[pc];W[oc];B[ob]
+;W[nc];B[nb];W[mc];B[rd];W[re]
+;B[rc];W[qf];B[qm];W[cj];B[cg]
+;W[jq];B[qi];W[mb];B[ic];W[lp]
+;B[kd];W[kb];B[me];W[ne];B[mq]
+;W[ei];B[jc];W[gi];B[pg];W[ln]
+;B[nf];W[ii];B[rg];W[oe];B[lh]
+;W[lk];B[kc];W[nk];B[pf];W[pe]
+;B[nh];W[lc];B[jb];W[la];B[if]
+;W[ff];B[on];W[mf];B[le];W[hl]
+;B[gf];W[fg];B[bi];W[ge];B[pj]
+;W[bj];B[kr];W[jr];B[ol];W[lr]
+;B[kq];W[kp];B[lq];W[bh];B[de]
+;W[bg];B[be];W[cf];B[ml];W[mk]
+;B[ki];W[nl];B[mm];W[nm];B[mn]
+;W[nn];B[mo];W[mp];B[no];W[ks]
+;B[jj];W[jk];B[np];W[mr];B[nq]
+;W[jo];B[kk];W[kl];B[gc];W[kj]
+;B[ji];W[ij];B[ig];W[nr];B[or]
+;W[rf];B[ef];W[ee];B[ed];W[fe]
+;B[dg];W[df];B[he];W[ng];B[of]
+;W[qg];B[ph];W[rh];B[ri];W[si]
+;B[sj];W[sh];B[rj];W[bf];B[ce]
+;W[li];B[mi];W[lj];B[ih];W[gg]
+;B[hh];W[na];B[pa];W[qh];B[nj]
+;W[ok];B[pk];W[om];B[pl];W[pn]
+;B[oo];W[pm];B[qn];W[po];B[tt]
+;W[qo];B[ro];W[pp];B[pq];W[rp]
+;B[qq];W[rn];B[rq];W[so];B[sq]
+;W[ql];B[rl];W[rm];B[oj];W[qk]
+;B[rk];W[sp];B[se];W[sf];B[sd]
+;W[hi];B[ns];W[ls];B[hf];W[lo]
+;B[gd];W[fd];B[fc];W[gh];B[af]
+;W[ag];B[ae];W[lm];B[sm];W[md]
+;B[ja];W[ka];B[ll];W[ma];B[qj]
+;W[qm];B[ld];W[oa];B[pb];W[rb]
+;B[ra];W[sb];B[qb];W[sn];B[sl]
+;W[cp];B[tt];W[mj];B[hg];W[js]
+;B[tt];W[ms];B[os];W[op];B[tt]
+;W[qr];B[rr];W[rs];B[tt];W[ss]
+;B[pr];W[tt];B[qs];W[tt];B[tt]
+;TW[lb][nd][od][qe][ef][cg][dg][eg][rg][sg][ah][ch][dh][eh][fh][ai][bi][ci][di][fi][aj][dj][ej][fj][gj][hj][ak][bk][ck][dk][ek][fk][gk][hk][ik][kk][al][bl][cl][dl][el][fl][gl][il][jl][am][bm][cm][dm][em][fm][gm][hm][im][jm][km][an][bn][en][fn][gn][hn][in][jn][kn][qn][ao][bo][co][do][eo][fo][go][ho][io][ko][ro][ap][bp][dp][fp][gp][hp][ip][jp][aq][bq][cq][eq][fq][gq][hq][iq][ar][br][cr][dr][er][fr][gr][hr][ir][as][bs][cs][ds][es][fs][gs][hs][is]
+TB[aa][ba][ca][da][ea][fa][ga][ha][ia][ab][bb][cb][db][eb][fb][gb][hb][ib][ac][bc][cc][dc][hc][ad][bd][dd][hd][id][jd][ie][je][ke][jf][kf][lf][mf][jg][kg][lg][mg][ng][og][jh][kh][mh][oh][ni][oi][pi][sk][qr][sr][ps][rs][ss]
+C[The game is over.  Final score:
+   White = 111 territory + 10 captures + 6.5 komi = 127.5
+   Black = 55 territory + 5 captures = 60
+White wins by 67.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-GORO.sgf b/regression/games/cgf2003/GnuGo-GORO.sgf
new file mode 100644 (file)
index 0000000..694dbd1
--- /dev/null
@@ -0,0 +1,58 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.3.23]
+PB[GORO]
+GN[GNU Go (W) vs. GORO (B)]
+DT[2003-08-03]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[W+18.5]
+;B[qc];W[dp];B[qq];W[cd];B[qj]
+;W[ed];B[jq];W[pp];B[qp];W[po]
+;B[qn];W[om];B[pl];W[pd];B[pc]
+;W[od];B[nc];W[re];B[pq];W[me]
+;B[op];W[lc];B[qg];W[cj];B[nd]
+;W[rg];B[qf];W[rf];B[oe];W[ne]
+;B[of];W[rh];B[rd];W[qd];B[rc]
+;W[qe];B[ph];W[kg];B[lp];W[gq]
+;B[nk];W[oo];B[gc];W[mm];B[lk]
+;W[ic];B[km];W[gd];B[lb];W[fb]
+;B[mb];W[fm];B[cn];W[bo];B[en]
+;W[bm];B[go];W[np];B[hp];W[oq]
+;B[pr];W[lq];B[ln];W[mq];B[nr]
+;W[ji];B[mo];W[ik];B[kq];W[kr]
+;B[hq];W[pm];B[dl];W[ek];B[ep]
+;W[do];B[eq];W[dn];B[em];W[cl]
+;B[eo];W[jr];B[hr];W[mr];B[nn]
+;W[nm];B[on];W[pn];B[qo];W[dq]
+;B[or];W[no];B[nq];W[fk];B[mn]
+;W[kb];B[qm];W[er];B[ll];W[fr]
+;B[ls];W[im];B[ko];W[la];B[ef]
+;W[fg];B[ma];W[ka];B[ff];W[el]
+;B[gf];W[li];B[eg];W[fh];B[if]
+;W[gb];B[kc];W[eh];B[md];W[cg]
+;B[kd];W[je];B[ib];W[hb];B[hc]
+;W[jd];B[jc];W[id];B[ia];W[ng]
+;B[qh];W[dm];B[mi];W[og];B[pg]
+;W[mh];B[gm];W[gl];B[hm];W[fn]
+;B[gp];W[hl];B[in];W[ni];B[ol]
+;W[nf];B[pf];W[gr];B[ri];W[mj]
+;B[oi];W[jm];B[hh];W[jn];B[lm]
+;W[hn];B[gn];W[io];B[ge];W[hd]
+;B[cf];W[bf];B[ce];W[be];B[dg]
+;W[bg];B[ms];W[ke];B[ld];W[nj]
+;B[nl];W[oj];B[pj];W[oh];B[gs]
+;W[pi];B[jk];W[kj];B[jl];W[il]
+;B[jj];W[ij];B[jo];W[ip];B[iq]
+;W[kk];B[kl];W[lj];B[le];W[lf]
+;B[jp];W[fs];B[hs];W[fo];B[fp]
+;W[fl];B[mk];W[ok];B[pk];W[ha]
+;B[qi];W[oi];B[ho];W[in];B[kn]
+;W[dr];B[fq];W[tt];B[tt]
+;TW[aa][ba][ca][da][ea][fa][ga][ab][bb][cb][db][eb][ac][bc][cc][dc][ec][fc][gc][hc][ad][bd][dd][fd][ae][ce][de][ee][fe][ge][he][ie][af][cf][df][ef][ff][gf][hf][if][jf][kf][mf][ag][dg][eg][gg][hg][ig][jg][lg][mg][ah][bh][ch][dh][gh][hh][ih][jh][kh][lh][nh][ai][bi][ci][di][ei][fi][gi][hi][ii][ki][mi][aj][bj][dj][ej][fj][gj][hj][ak][bk][ck][dk][gk][hk][al][bl][dl][am][cm][an][bn][cn][ao][co][ap][bp][cp][aq][bq][cq][ar][br][cr][as][bs][cs][ds][es]
+TB[ja][ka][la][na][oa][pa][qa][ra][sa][jb][kb][nb][ob][pb][qb][rb][sb][lc][mc][oc][sc][od][pd][qd][sd][pe][qe][re][se][rf][sf][rg][sg][rh][sh][si][rj][sj][qk][rk][sk][ml][ql][rl][sl][mm][nm][om][pm][rm][sm][pn][rn][sn][lo][no][oo][po][ro][so][kp][mp][np][op][pp][rp][sp][lq][mq][oq][rq][sq][ir][jr][kr][lr][mr][qr][rr][sr][is][js][ks][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 111 territory + 18 captures + 6.5 komi = 135.5
+   Black = 89 territory + 28 captures = 117
+White wins by 18.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-Go4.sgf b/regression/games/cgf2003/GnuGo-Go4.sgf
new file mode 100644 (file)
index 0000000..2d7ce79
--- /dev/null
@@ -0,0 +1,61 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Go++]
+PB[GNU Go 3.3.23]
+GN[Go++ (W) vs. GNU Go (B)]
+DT[2003-08-03]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[W+10.5]
+;B[pd];W[cc];B[pq];W[cp];B[eq]
+;W[cm];B[hq];W[qn];B[po];W[rp]
+;B[fd];W[cf];B[mq];W[kc];B[ic]
+;W[nc];B[pf];W[pb];B[qc];W[dq]
+;B[ep];W[qb];B[em];W[dk];B[ho]
+;W[fk];B[ie];W[ec];B[mo];W[qk]
+;B[qi];W[gg];B[kn];W[ig];B[ke]
+;W[ok];B[eg];W[kg];B[ee];W[ch]
+;B[ei];W[dj];B[gf];W[lj];B[fj]
+;W[ij];B[dn];W[cn];B[dr];W[cr]
+;B[er];W[fc];B[rb];W[pc];B[rc]
+;W[hf];B[he];W[jd];B[je];W[jb]
+;B[me];W[ld];B[le];W[mg];B[hb]
+;W[md];B[ea];W[db];B[rr];W[gj]
+;B[gi];W[hi];B[nf];W[gc];B[id]
+;W[oh];B[ph];W[oi];B[fg];W[rj]
+;B[ri];W[si];B[sh];W[sj];B[rg]
+;W[ib];B[hc];W[gh];B[fi];W[gl]
+;B[pj];W[jl];B[cs];W[br];B[gd]
+;W[lm];B[pk];W[rl];B[oj];W[ln]
+;B[lo];W[dp];B[nj];W[mi];B[ol]
+;W[dd];B[do];W[co];B[rq];W[qo]
+;B[qp];W[sp];B[sq];W[ro];B[bs]
+;W[pm];B[od];W[in];B[io];W[jn]
+;B[hn];W[hm];B[jo];W[km];B[oc]
+;W[ob];B[nd];W[jc];B[qa];W[mb]
+;B[gn];W[og];B[dl];W[cl];B[mk]
+;W[ko];B[kp];W[if];B[lk];W[kk]
+;B[gb];W[fm];B[fn];W[da];B[el]
+;W[ar];B[fl];W[pg];B[gm];W[gk]
+;B[qg];W[fa];B[pi];W[on];B[mn]
+;W[oo];B[op];W[of];B[oe];W[ng]
+;B[mj];W[ni];B[fb];W[eb];B[de]
+;W[ce];B[pa];W[oa];B[ra];W[mf]
+;B[ne];W[pl];B[dh];W[di];B[dg]
+;W[cg];B[no];W[nl];B[nk];W[nm]
+;B[mm];W[jf];B[fh];W[lf];B[df]
+;W[ia];B[ll];W[qf];B[pe];W[ed]
+;B[im];W[hl];B[kn];W[kl];B[jm]
+;W[il];B[pp];W[ga];B[ha];W[ea]
+;B[pn];W[om];B[ok];W[kd];B[ek]
+;W[ff];B[ge];W[kf];B[ds];W[qj]
+;B[ej];W[sf];B[rh];W[dm];B[ml]
+;W[eo];B[en];W[nn];B[as];W[tt]
+;B[tt];
+TW[aa][ba][ca][ja][ka][la][ma][na][ab][bb][cb][kb][lb][nb][ac][bc][dc][lc][mc][ad][bd][cd][ae][be][af][bf][ag][bg][hg][jg][lg][ah][bh][hh][ih][jh][kh][lh][mh][nh][ai][bi][ci][ii][ji][ki][li][aj][bj][cj][hj][jj][kj][ak][bk][ck][hk][ik][jk][rk][sk][al][bl][ql][sl][am][bm][qm][rm][sm][an][bn][rn][sn][ao][bo][so][ap][bp][aq][bq][cq]
+TB[sa][sb][sc][hd][qd][rd][sd][fe][qe][re][se][ef][ff][qf][rf][sf][sg][eh][qh][fm][in][jn][eo][fo][go][ko][fp][gp][hp][ip][jp][lp][mp][np][fq][gq][iq][jq][kq][lq][nq][oq][qq][fr][gr][hr][ir][jr][kr][lr][mr][nr][or][pr][qr][sr][es][fs][gs][hs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 82 territory + 2 captures + 6.5 komi = 90.5
+   Black = 71 territory + 9 captures = 80
+White wins by 10.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-GoInt.sgf b/regression/games/cgf2003/GnuGo-GoInt.sgf
new file mode 100644 (file)
index 0000000..13b31a5
--- /dev/null
@@ -0,0 +1,73 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Go Intellect]
+PB[GNU Go 3.3.23]
+GN[Go Intellect (W) vs. GNU Go (B)]
+DT[2003-08-02]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[B+14.5]
+;B[qd];W[cd];B[ed];W[cp];B[cc]
+;W[dc];B[dd];W[ec];B[ce];W[hc]
+;B[cb];W[fd];B[eq];W[oc];B[pf]
+;W[cj];B[do];W[dp];B[ep];W[co]
+;B[dn];W[cm];B[qp];W[jq];B[oq]
+;W[gq];B[el];W[fe];B[qj];W[cn]
+;B[nf];W[fo];B[eo];W[fn];B[cr]
+;W[fr];B[bq];W[db];B[bd];W[dm]
+;B[gl];W[em];B[bp];W[dq];B[er]
+;W[dr];B[ds];W[pk];B[bo];W[pj]
+;B[qm];W[ql];B[rl];W[rk];B[qk]
+;W[pl];B[rj];W[bs];B[mc];W[nd]
+;B[md];W[qc];B[rc];W[pd];B[qb]
+;W[qe];B[pc];W[pe];B[pb];W[ob]
+;B[me];W[rd];B[re];W[sd];B[sc]
+;W[qc];B[rf];W[qd];B[lq];W[qf]
+;B[oe];W[rb];B[qg];W[pg];B[ch]
+;W[of];B[jc];W[qi];B[ri];W[qh]
+;B[je];W[rm];B[sk];W[qn];B[pm]
+;W[pn];B[om];W[on];B[nm];W[mo]
+;B[nn];W[kp];B[no];W[ng];B[rh]
+;W[rg];B[mg];W[ej];B[fm];W[hj]
+;B[gn];W[fk];B[fl];W[go];B[il]
+;W[hn];B[jg];W[jj];B[gm];W[kl]
+;B[nh];W[og];B[mp];W[lp];B[lr]
+;W[rn];B[np];W[sh];B[si];W[pp]
+;B[pq];W[mh];B[rp];W[sg];B[mi]
+;W[lh];B[ni];W[cs];B[es];W[lg]
+;B[mf];W[li];B[nk];W[lo];B[gf]
+;W[kr];B[bj];W[bi];B[ci];W[bk]
+;B[dj];W[aj];B[dk];W[di];B[ei]
+;W[gk];B[dh];W[fi];B[ib];W[bh]
+;B[ff];W[eh];B[di];W[dl];B[ek]
+;W[fj];B[jm];W[ef];B[ee];W[cg]
+;B[dg];W[bg];B[gb];W[io];B[en]
+;W[fb];B[gc];W[km];B[jn];W[fh]
+;B[eg];W[jl];B[in];W[ne];B[kn]
+;W[ik];B[ln];W[jh];B[ck];W[bl]
+;B[bn];W[am];B[bj];W[bm];B[cj]
+;W[an];B[be];W[hm];B[br];W[ar]
+;B[ak];W[al];B[fc];W[ml];B[hl]
+;W[nl];B[mn];W[ks];B[ls];W[ig]
+;B[kq];W[jp];B[if];W[la];B[jr]
+;W[ir];B[js];W[hp];B[hg];W[kb]
+;B[ih];W[ol];B[ii];W[ji];B[is]
+;W[hr];B[lf];W[jb];B[ic];W[ao]
+;B[as];W[cs];B[bs];W[fs];B[cs]
+;W[ap];B[ja];W[lc];B[mb];W[aq]
+;B[lb];W[hs];B[cl];W[fq];B[kg]
+;W[po];B[sm];W[gh];B[sn];W[hh]
+;B[bf];W[ai];B[nb];W[na];B[ma]
+;W[oa];B[nc];W[od];B[ag];W[lm]
+;B[cf];W[ak];B[kh];W[ki];B[hi]
+;W[ij];B[gi];W[gj];B[ig];W[ho]
+;B[im];W[fp];B[mm];W[gg];B[fg]
+;W[jo];B[ko];W[hk];B[af];W[cq]
+;B[ah];W[mk];B[tt];W[tt]
+;TW[pa][qa][ra][sa][pb][qb][sb][pc][rc][sc][oe][re][se][pf][rf][sf][qg][nh][oh][ph][mi][ni][oi][pi][kj][lj][mj][nj][oj][jk][kk][lk][nk][ok][ll][bn][dn][en][bo][do][eo][bp][ep][gp][ip][bq][eq][hq][iq][br][cr][er][gr][as][bs][cs][ds][es][gs]
+TB[aa][ba][ca][da][ea][fa][ga][ha][ia][ka][la][ab][bb][db][eb][fb][hb][jb][kb][ac][bc][dc][ec][hc][kc][lc][ad][cd][fd][gd][hd][id][jd][kd][ld][ae][de][fe][ge][he][ie][ke][le][df][ef][hf][jf][kf][sj][rk][sl][rm][on][pn][qn][rn][oo][po][qo][ro][so][op][pp][sp][mq][nq][qq][rq][sq][kr][mr][nr][or][pr][qr][rr][sr][ks][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 59 territory + 35 captures + 6.5 komi = 100.5
+   Black = 85 territory + 30 captures = 115
+Black wins by 14.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-GoeMate.sgf b/regression/games/cgf2003/GnuGo-GoeMate.sgf
new file mode 100644 (file)
index 0000000..7fbf3b0
--- /dev/null
@@ -0,0 +1,66 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Goemate]
+PB[GNU Go 3.3.23]
+GN[Goemate (W) vs. GNU Go (B)]
+DT[2003-08-02]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[W+26.5]
+;B[pd];W[dq];B[cd];W[qp];B[do]
+;W[ed];B[cq];W[cr];B[hd];W[ef]
+;B[cg];W[cp];B[oq];W[qf];B[po]
+;W[qo];B[pn];W[qn];B[pm];W[ql]
+;B[jq];W[cc];B[bc];W[dc];B[ok]
+;W[ld];B[jo];W[ie];B[qh];W[id]
+;B[pf];W[qc];B[qd];W[pc];B[hc]
+;W[ic];B[rf];W[od];B[cj];W[gq]
+;B[qj];W[bn];B[qm];W[rm];B[qr]
+;W[rk];B[de];W[bb];B[he];W[hg]
+;B[bd];W[ee];B[mg];W[jm];B[lm]
+;W[hn];B[kk];W[dm];B[jg];W[jk]
+;B[jj];W[ik];B[ii];W[hf];B[gi]
+;W[kn];B[mo];W[gk];B[ho];W[gn]
+;B[hr];W[go];B[hp];W[sh];B[gp]
+;W[fp];B[gr];W[qe];B[rd];W[pe]
+;B[oe];W[ne];B[of];W[nd];B[rc]
+;W[nf];B[qb];W[ng];B[oh];W[nh]
+;B[oc];W[qg];B[pg];W[rg];B[nc]
+;W[kl];B[re];W[ll];B[lh];W[ei]
+;B[ej];W[fj];B[mc];W[mi];B[kj]
+;W[nl];B[mj];W[li];B[nk];W[ki]
+;B[md];W[me];B[le];W[lf];B[lg]
+;W[ke];B[ji];W[mk];B[kb];W[ib]
+;B[lk];W[ml];B[ni];W[lj];B[nj]
+;W[mh];B[ek];W[fi];B[em];W[sg]
+;B[en];W[sf];B[dl];W[se];B[rq]
+;W[sn];B[fq];W[ro];B[ab];W[sd]
+;B[cb];W[sc];B[pb];W[sb];B[db]
+;W[eb];B[ba];W[pl];B[ol];W[nn]
+;B[nm];W[mm];B[om];W[mn];B[no]
+;W[lo];B[lq];W[eq];B[fr];W[cm]
+;B[ea];W[fa];B[da];W[fb];B[bl]
+;W[di];B[ci];W[lp];B[mp];W[dh]
+;B[ch];W[kp];B[kq];W[cl];B[ck]
+;W[rl];B[dp];W[co];B[ep];W[bq]
+;B[fo];W[er];B[bm];W[cn];B[rj]
+;W[sj];B[in];W[im];B[lc];W[kc]
+;B[jc];W[kd];B[jb];W[fl];B[pp]
+;W[og];B[ph];W[dd];B[qq];W[df]
+;B[ce];W[rb];B[jn];W[am];B[ak]
+;W[qa];B[pa];W[ra];B[el];W[jp]
+;B[ip];W[ia];B[fk];W[fm];B[fn]
+;W[gl];B[dg];W[eg];B[cf];W[sp]
+;B[es];W[ds];B[fs];W[ri];B[qi]
+;W[rh];B[pk];W[on];B[oo];W[sq]
+;B[sr];W[rp];B[jd];W[je];B[dj]
+;W[ka];B[lb];W[ja];B[la];W[an]
+;B[al];W[ko];B[io];W[qk];B[dn]
+;W[tt];B[tt]
+;TW[ga][ha][sa][gb][hb][ec][fc][gc][hc][fd][gd][hd][fe][ge][he][le][ff][gf][if][jf][kf][mf][fg][gg][ig][jg][kg][lg][mg][eh][fh][gh][hh][ih][jh][kh][lh][gi][hi][ii][ji][si][gj][hj][ij][jj][kj][hk][kk][lk][sk][hl][il][jl][sl][gm][hm][sm][rn][ao][bo][so][ap][bp][aq][cq][ar][br][dr][as][bs][cs]
+TB[aa][ca][ma][na][oa][bb][mb][nb][ob][ac][pc][qc][ad][ae][be][af][bf][ag][bg][ah][bh][ai][bi][oi][pi][aj][bj][oj][pj][bk][dk][eo][fp][np][op][gq][hq][iq][mq][nq][pq][ir][jr][kr][lr][mr][nr][or][pr][rr][gs][hs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 72 territory + 16 captures + 6.5 komi = 94.5
+   Black = 63 territory + 5 captures = 68
+White wins by 26.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-Haruka.sgf b/regression/games/cgf2003/GnuGo-Haruka.sgf
new file mode 100644 (file)
index 0000000..089b2d5
--- /dev/null
@@ -0,0 +1,66 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.3.23]
+PB[Haruka]
+GN[GNU Go (W) vs. Haruka (B)]
+DT[2003-08-02]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[B+40.5]
+;B[qd];W[dc];B[pp];W[oc];B[lc]
+;W[pe];B[pd];W[od];B[oe];W[of]
+;B[ne];W[qf];B[qe];W[pf];B[pb]
+;W[md];B[me];W[pc];B[qc];W[ob]
+;B[qb];W[ld];B[kc];W[lf];B[nd]
+;W[mc];B[ng];W[le];B[mg];W[pi]
+;B[je];W[kg];B[fc];W[de];B[jg]
+;W[kh];B[mb];W[nb];B[lb];W[nc]
+;B[nj];W[dp];B[oh];W[pk];B[ph]
+;W[qh];B[qm];W[qk];B[qi];W[ri]
+;B[qg];W[rh];B[jh];W[nq];B[kj]
+;W[kq];B[rf];W[rg];B[re];W[hq]
+;B[cq];W[cp];B[dq];W[eq];B[er]
+;W[fq];B[bp];W[bo];B[bq];W[cn]
+;B[jn];W[ei];B[ed];W[dd];B[fg]
+;W[eg];B[ff];W[pg];B[eb];W[gj]
+;B[gl];W[ek];B[em];W[fm];B[fl]
+;W[pr];B[qq];W[dm];B[gn];W[en]
+;B[cb];W[cg];B[el];W[dl];B[bd]
+;W[qr];B[rl];W[nk];B[oi];W[oj]
+;B[pj];W[fr];B[es];W[rk];B[ok]
+;W[ol];B[nl];W[oj];B[on];W[mk]
+;B[mj];W[ok];B[lk];W[ml];B[nm]
+;W[qj];B[fs];W[fn];B[mo];W[gm]
+;B[is];W[hl];B[lr];W[lq];B[mq]
+;W[mr];B[nr];W[mp];B[lo];W[rq]
+;B[rp];W[ir];B[pi];W[sj];B[rr]
+;W[rs];B[sq];W[hs];B[bf];W[bg]
+;B[ef];W[gs];B[cs];W[df];B[ag]
+;W[ah];B[af];W[bi];B[cc];W[fh]
+;B[hn];W[gh];B[hg];W[db];B[da]
+;W[ec];B[ee];W[mm];B[ij];W[io]
+;B[in];W[hh];B[ih];W[fb];B[ea]
+;W[fd];B[gc];W[qs];B[jl];W[km]
+;B[il];W[hk];B[gg];W[hi];B[dr]
+;W[om];B[nn];W[nf];B[mf];W[np]
+;B[oq];W[or];B[gp];W[hp];B[fo]
+;W[gq];B[gb];W[fp];B[go];W[eo]
+;B[jp];W[jo];B[kp];W[kn];B[jq]
+;W[jr];B[pm];W[ko];B[lp];W[ik]
+;B[jk];W[ce];B[kr];W[mq];B[ii]
+;W[be];B[ae];W[cd];B[bc];W[ql]
+;B[rm];W[ap];B[aq];W[ao];B[sg]
+;W[sh];B[sf];W[ln];B[op];W[no]
+;B[mn];W[oo];B[po];W[ms];B[sl]
+;W[ll];B[kl];W[cf];B[ad];W[jm]
+;B[im];W[hj];B[dh];W[eh];B[hm]
+;W[qg];B[og];W[sk];B[pq];W[ho]
+;B[sr];W[iq];B[ss];W[ip];B[pn]
+;W[pl];B[tt];W[tt]
+;TW[dg][bh][ch][dh][ai][ci][di][fi][gi][si][aj][bj][cj][dj][ej][fj][rj][ak][bk][ck][dk][fk][gk][al][bl][cl][el][fl][gl][am][bm][cm][em][lm][an][bn][dn][co][do][ep][gr][hr][kr][lr][nr][is][js][ks][ls][ns][os][ps]
+TB[aa][ba][ca][fa][ga][ha][ia][ja][ka][la][ma][na][oa][pa][qa][ra][sa][ab][bb][fb][hb][ib][jb][kb][nb][ob][rb][sb][ac][hc][ic][jc][mc][nc][oc][pc][rc][sc][fd][gd][hd][id][jd][kd][ld][md][od][rd][sd][fe][ge][he][ie][ke][le][se][gf][hf][if][jf][kf][lf][ig][kg][lg][kh][lh][mh][nh][ji][ki][li][mi][ni][jj][lj][kk][sm][qn][rn][sn][qo][ro][so][qp][sp][rq][ar][br][cr][as][bs][ds]
+C[The game is over.  Final score:
+   White = 52 territory + 12 captures + 6.5 komi = 70.5
+   Black = 93 territory + 18 captures = 111
+Black wins by 40.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-KCC.sgf b/regression/games/cgf2003/GnuGo-KCC.sgf
new file mode 100644 (file)
index 0000000..105da7f
--- /dev/null
@@ -0,0 +1,62 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[KCC]
+PB[GNU Go 3.3.23]
+GN[KCC (W) vs. GNU Go (B)]
+DT[2003-08-02]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[W+64.5]
+;B[pd];W[pp];B[cd];W[dp];B[ic]
+;W[qf];B[pf];W[pg];B[of];W[qe]
+;B[qd];W[qi];B[nh];W[cj];B[ed]
+;W[cg];B[fp];W[dn];B[dq];W[cq]
+;B[eq];W[cr];B[jq];W[ql];B[nq]
+;W[pq];B[ff];W[be];B[lc];W[gh]
+;B[fn];W[hf];B[gd];W[bd];B[no]
+;W[cc];B[dc];W[cb];B[el];W[mm]
+;B[dr];W[on];B[jf];W[jg];B[lo]
+;W[kn];B[lh];W[kf];B[kg];W[je]
+;B[lf];W[if];B[jh];W[jj];B[hn]
+;W[em];B[fl];W[dl];B[db];W[or]
+;B[nr];W[mj];B[oj];W[hd];B[hc]
+;W[le];B[oc];W[og];B[oh];W[ng]
+;B[mg];W[mf];B[lg];W[me];B[gl]
+;W[hj];B[lj];W[ki];B[mk];W[pm]
+;B[re];W[da];B[ea];W[ca];B[rf]
+;W[rg];B[eb];W[sf];B[rd];W[fm]
+;B[fj];W[ln];B[gm];W[io];B[hp]
+;W[ko];B[lp];W[nd];B[nc];W[id]
+;B[kh];W[ih];B[cs];W[bs];B[ds]
+;W[br];B[os];W[ps];B[ns];W[jp]
+;B[kq];W[jc];B[jb];W[kc];B[kb]
+;W[mc];B[mb];W[ge];B[fe];W[ld]
+;B[lb];W[gc];B[fd];W[se];B[sd]
+;W[im];B[sg];W[sh];B[qj];W[rj]
+;B[qk];W[rk];B[pi];W[qh];B[ji]
+;W[kj];B[lk];W[mi];B[li];W[pk]
+;B[pj];W[ni];B[ii];W[ij];B[ok]
+;W[pl];B[hi];W[gi];B[hh];W[hg]
+;B[nl];W[nj];B[nn];W[nm];B[il]
+;W[jl];B[gf];W[eg];B[ik];W[jk]
+;B[gk];W[hk];B[hl];W[ip];B[iq]
+;W[ol];B[in];W[nk];B[jm];W[km]
+;B[gg];W[jn];B[gj];W[ei];B[fi]
+;W[fh];B[ml];W[ph];B[ej];W[di]
+;B[dk];W[ck];B[eo];W[cm];B[do]
+;W[co];B[ce];W[he];B[en];W[ig];
+B[oq];W[pr];B[dj];W[cf];B[de];
+W[oo];B[ho];W[kp];B[fg];W[eh];
+B[sf];W[dm];B[df];W[dg];B[ef];
+W[op];B[np];W[mn];B[mo];W[md];
+B[pe];W[qg];B[ep];W[cp];B[hm];
+W[jm];B[nf];W[si];B[od];W[ne];
+B[oe];W[bc];B[kd];W[ke];B[jd];
+W[tt];B[tt]
+;TW[aa][ba][ab][bb][ac][ad][ae][ie][af][bf][jf][lf][ag][bg][kg][lg][mg][ah][bh][ch][dh][hh][jh][kh][lh][mh][nh][oh][rh][ai][bi][ci][hi][ii][ji][li][oi][pi][ri][aj][bj][lj][oj][pj][qj][sj][ak][bk][kk][lk][mk][ok][qk][sk][al][bl][cl][kl][ll][ml][nl][rl][sl][am][bm][lm][om][qm][rm][sm][an][bn][cn][pn][qn][rn][sn][ao][bo][jo][po][qo][ro][so][ap][bp][qp][rp][sp][aq][bq][qq][rq][sq][ar][qr][rr][sr][as][qs][rs][ss]
+TB[fa][ga][ha][ia][ja][ka][la][ma][na][oa][pa][qa][ra][sa][fb][gb][hb][ib][nb][ob][pb][qb][rb][sb][ec][fc][gc][jc][kc][pc][qc][rc][sc][dd][ee][se][ek][fk][gn][fo][go][gp][mp][fq][gq][hq][lq][mq][er][fr][gr][hr][ir][jr][kr][lr][mr][es][fs][gs][hs][is][js][ks][ls][ms]
+C[The game is over.  Final score:
+   White = 102 territory + 27 captures + 6.5 komi = 135.5
+   Black = 66 territory + 5 captures = 71
+White wins by 64.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-Katsunari.sgf b/regression/games/cgf2003/GnuGo-Katsunari.sgf
new file mode 100644 (file)
index 0000000..a2a26cf
--- /dev/null
@@ -0,0 +1,72 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Katsunari]
+PB[GNU Go 3.3.23]
+GN[Katsunari (W) vs. GNU Go (B)]
+DT[2003-08-03]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[B+47.5]
+;B[pd];W[dd];B[dp];W[qp];B[cf]
+;W[fc];B[bd];W[cc];B[ci];W[qf]
+;B[op];W[oq];B[nq];W[pq];B[np]
+;W[qn];B[jq];W[cn];B[dn];W[dm]
+;B[en];W[cp];B[co];W[bo];B[do]
+;W[bm];B[cq];W[bp];B[em];W[dl]
+;B[bq];W[qi];B[nd];W[rd];B[qc]
+;W[er];B[jc];W[md];B[me];W[ld]
+;B[eq];W[el];B[dr];W[ne];B[oe]
+;W[rc];B[nf];W[nc];B[oc];W[nb]
+;B[ke];W[mc];B[ob];W[le];B[lf]
+;W[kf];B[je];W[lg];B[mf];W[kh]
+;B[nm];W[cg];B[bg];W[bf];B[dg]
+;W[ce];B[ch];W[be];B[de];W[nh]
+;B[na];W[ma];B[ee];W[pl];B[ge]
+;W[hd];B[oa];W[lb];B[kc];W[kb]
+;B[jb];W[mg];B[ed];W[ec];B[cd]
+;W[dc];B[bc];W[lc];B[ka];W[bb]
+;B[af];W[on];B[lm];W[hb];B[gl]
+;W[fr];B[hr];W[hp];B[kj];W[fq]
+;B[gp];W[aq];B[nr];W[ko];B[jn]
+;W[nn];B[ln];W[mo];B[lq];W[lo]
+;B[qs];W[qr];B[os];W[bk];B[rr]
+;W[ac];B[ae];W[kn];B[km];W[jm]
+;B[jo];W[jl];B[mj];W[jp];B[im]
+;W[kq];B[ip];W[ho];B[kp];W[lp]
+;B[ij];W[jp];B[kr];W[kp];B[iq]
+;W[lr];B[rq];W[rp];B[qq];W[pp]
+;B[pr];W[fp];B[gq];W[go];B[fo]
+;W[io];B[in];W[hm];B[il];W[gn]
+;B[gr];W[hl];B[hk];W[hn];B[ik]
+;W[jr];B[ir];W[fl];B[gk];W[fn]
+;B[fm];W[eo];B[js];W[fo];B[mn]
+;W[no];B[mq];W[ia];B[ja];W[es]
+;B[ar];W[ds];B[gm];W[qb];B[ih]
+;W[ap];B[cs];W[br];B[ej];W[bs]
+;B[og];W[he];B[oh];W[jf];B[if]
+;W[oj];B[ni];W[hf];B[ie];W[hg]
+;B[bj];W[ig];B[jg];W[kg];B[jh]
+;W[id];B[la];W[jd];B[kd];W[ic]
+;B[mb];W[oi];B[qh];W[rh];B[qg]
+;W[rg];B[pf];W[nj];B[mi];W[mk]
+;B[lk];W[ml];B[nl];W[nk];B[qe]
+;W[mm];B[ll];W[ab];B[rf];W[sb]
+;B[hh];W[oo];B[gg];W[fk];B[fj]
+;W[gf];B[ff];W[fg];B[gh];W[gd]
+;B[fe];W[ep];B[dq];W[cr];B[sp]
+;W[so];B[sq];W[rn];B[sg];W[si]
+;B[pi];W[pj];B[ph];W[qj];B[ck]
+;W[cl];B[ak];W[bl];B[dk];W[or]
+;B[pb];W[qa];B[qd];W[se];B[re]
+;W[sd];B[sf];W[ib];B[sh];W[ri]
+;B[al];W[am];B[aj];W[fd];B[gs]
+;W[cs];B[ad];W[ek];B[fs];W[as]
+;B[hq];W[ar];B[pa];W[mp];B[ks]
+;W[tt];B[tt]
+;TW[aa][ba][ca][da][ea][fa][ga][ha][ra][sa][cb][db][eb][fb][gb][rb][gc][hc][sc][rj][sj][ok][pk][qk][rk][sk][nl][ol][ql][rl][sl][cm][nm][om][pm][qm][rm][sm][an][bn][pn][sn][ao][po][qo][ro]
+TB[ma][kb][lb][nb][lc][mc][nc][pc][ld][md][od][be][ce][le][ne][pe][bf][df][ef][jf][kf][of][qf][ag][cg][eg][fg][kg][lg][mg][ng][pg][ah][bh][dh][eh][fh][kh][lh][mh][nh][ai][bi][di][ei][fi][gi][hi][ii][ji][ki][li][cj][dj][gj][hj][jj][lj][jk][kk][jl][kl][jm][jr][lr][mr][qr][sr][hs][is][ls][ms][ns][ps][rs][ss]
+C[The game is over.  Final score:
+   White = 46 territory + 6 captures + 6.5 komi = 58.5
+   Black = 76 territory + 30 captures = 106
+Black wins by 47.5.
+]
+)
diff --git a/regression/games/cgf2003/GnuGo-Martha.sgf b/regression/games/cgf2003/GnuGo-Martha.sgf
new file mode 100644 (file)
index 0000000..b033c7c
--- /dev/null
@@ -0,0 +1,98 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.3.23]
+PB[Martha]
+GN[GNU Go (W) vs. Martha (B)]
+DT[2003-08-02]
+SY[Cgoban 1.9.14]TM[40:00(5x1:00)]
+RE[W+371.5]
+;B[cc];W[pp];B[hc];W[cq];B[mc]
+;W[dd];B[df];W[ee];B[ed];W[de]
+;B[ef];W[fe];B[hh];W[gc];B[mh]
+;W[ff];B[ck];W[hd];B[hm];W[ic]
+;B[mm];W[cf];B[qp];W[qo];B[qn]
+;W[qq];B[cp];W[dp];B[dq];W[co]
+;B[bp];W[eq];B[fq];W[dr];B[lq]
+;W[rp];B[bf];W[cg];B[bg];W[eg]
+;B[qc];W[pn];B[qh];W[qm];B[ql]
+;W[pl];B[pk];W[pd];B[pe];W[fp]
+;B[hb];W[ib];B[jb];W[be];B[bd]
+;W[gq];B[hq];W[hp];B[ip];W[qk]
+;B[rk];W[rl];B[eh];W[bh];B[ah]
+;W[bi];B[ci];W[dc];B[db];W[bb]
+;B[bc];W[cb];B[ca];W[eb];B[fb]
+;W[qj];B[ce];W[ae];B[cn];W[bo]
+;B[bq];W[dn];B[cm];W[ch];B[dh]
+;W[iq];B[hr];W[jq];B[ir];W[kq]
+;B[jp];W[kp];B[lp];W[jo];B[io]
+;W[ko];B[lo];W[in];B[jn];W[kn]
+;B[ho];W[gp];B[dg];W[di];B[fg]
+;W[cj];B[id];W[jc];B[ia];W[kb]
+;B[jd];W[kc];B[kd];W[he];B[ka]
+;W[la];B[lb];W[ja];B[dj];W[ld]
+;B[lc];W[le];B[lf];W[ke];B[kf]
+;W[jm];B[km];W[il];B[ik];W[jk]
+;B[jl];W[kl];B[jr];W[kr];B[lr]
+;W[na];B[nb];W[ma];B[ll];W[hn]
+;B[go];W[ks];B[gn];W[gm];B[gl]
+;W[fm];B[fn];W[fl];B[fk];W[dm]
+;B[em];W[el];B[dl];W[en];B[hl]
+;W[ek];B[bj];W[gk];B[ci];W[cd]
+;B[jj];W[kj];B[kk];W[lk];B[lj]
+;W[ij];B[qr];W[ei];B[gh];W[ej]
+;B[mk];W[dk];B[kk];W[ji];B[jl]
+;W[hk];B[oa];W[ig];B[ih];W[cj]
+;B[if];W[jg];B[jf];W[hf];B[ie]
+;W[mf];B[me];W[md];B[nd];W[ne]
+;B[nf];W[ng];B[mg];W[of];B[pf]
+;W[ob];B[je];W[od];B[me];W[oe]
+;B[oc];W[pr];B[nf];W[pa];B[pb]
+;W[oa];B[pc];W[pj];B[ph];W[ri]
+;B[qi];W[ok];B[qs];W[rr];B[mb]
+;W[qa];B[qb];W[ra];B[fd];W[ai]
+;B[bm];W[cl];B[hs];W[ha];B[fc]
+;W[gb];B[nr];W[kl];B[cr];W[jl]
+;B[dq];W[fr];B[da];W[ea];B[ac]
+;W[rh];B[sh];W[rg];B[rf];W[qd]
+;B[rb];W[qg];B[qf];W[pg];B[og]
+;W[rd];B[qe];W[oh];B[sa];W[ka]
+;B[ec];W[ba];B[pi];W[nl];B[ml]
+;W[np];B[si];W[ln];B[mn];W[mo]
+;B[no];W[mp];B[mq];W[oo];B[nn]
+;W[li];B[cq];W[mi];B[ni];W[nh]
+;B[oi];W[mf];B[lh];W[jh];B[nf]
+;W[og];B[mf];W[kh];B[rj];W[re]
+;B[sf];W[sg];B[sk];W[kg];B[eg]
+;W[gg];B[fh];W[hi];B[af];W[ag]
+;B[hg];W[ii];B[gf];W[gi];B[ab]
+;W[aa];B[gd];W[ge];B[hc];W[hb]
+;B[sq];W[sr];B[ss];W[rs];B[sn]
+;W[rc];B[sb];W[sc];B[sd];W[nc]
+;B[oc];W[mj];B[nj];W[ki];B[oj]
+;W[pc];B[nk];W[nc];B[ol];W[ld]
+;B[pk];W[ql];B[sl];W[sj];B[si]
+;W[sh];B[rm];W[rn];B[oc];W[le]
+;B[md];W[lg];B[ke];W[nc];B[ro]
+;W[oc];B[qn];W[ok];B[pm];W[om]
+;B[sj];W[sp];B[nm];W[ol];B[mr]
+;W[nq];B[op];W[oq];B[lm];W[lk]
+;B[ls];W[or];B[bl];W[bk];B[ak]
+;W[aj];B[ns];W[os];B[ep];W[do]
+;B[gr];W[on];B[er];W[es];B[fs]
+;W[ar];B[fo];W[eo];B[rn];W[br]
+;B[cs];W[bn];B[am];W[al];B[an]
+;W[ao];B[gs];W[js];B[jp];W[ip]
+;B[bf];W[af];B[ap];W[bs];B[aq]
+;W[ds];B[fa];W[ga];B[ed];W[ec]
+;B[gd];W[ad];B[gj];W[fj];B[bl]
+;W[is];B[no];W[dq];B[bd];W[bc]
+;B[fd];W[cr];B[fc];W[tt];B[ni]
+;W[tt];B[qi];W[tt];B[qh];W[tt]
+;B[tt]
+TW[ca][da][fa][ia][sa][ab][db][fb][jb][lb][mb][nb][pb][qb][rb][sb][ac][cc][fc][hc][lc][mc][qc][bd][ed][fd][gd][id][jd][kd][ld][md][nd][sd][ce][ie][je][ke][le][me][pe][qe][se][bf][df][ef][gf][if][jf][kf][lf][mf][nf][pf][qf][rf][sf][bg][dg][eg][fg][gg][hg][mg][ah][dh][eh][fh][gh][hh][ih][lh][mh][ph][qh][ci][fi][ni][oi][pi][qi][si][bj][dj][gj][hj][jj][lj][nj][oj][rj][sj][ak][ck][fk][ik][kk][mk][nk][pk][rk][sk][bl][dl][gl][hl][ll][ml][sl][am][bm][cm][em][hm][im][km][lm][mm][nm][pm][rm][sm][an][cn][fn][gn][jn][mn][nn][qn][rn][sn][fo][go][ho][io][lo][no][po][ro][so][ap][bp][cp][ep][jp][lp][op][qp][aq][bq][cq][fq][hq][lq][mq][pq][rq][sq][er][gr][hr][ir][jr][lr][mr][nr][qr][as][cs][fs][gs][hs][ls][ms][ns][ps][qs][ss]
+C[The game is over.  Final score:
+   White = 179 territory + 205 captures + 6.5 komi = 390.5
+   Black = 0 territory + 19 captures = 19
+White wins by 371.5.
+]
+)
diff --git a/regression/games/cgf2004/aya.sgf b/regression/games/cgf2004/aya.sgf
new file mode 100644 (file)
index 0000000..66b16ed
--- /dev/null
@@ -0,0 +1,67 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GnuGo 3.5.3]
+PB[Aya]
+GN[CGF Special meeting 2004]
+DT[2004-01-11]
+SY[Cgoban 1.9.11]TM[40]
+RE[W+13.5]
+;B[pq];W[pd];B[cd];W[ec];B[dq]
+;W[de];B[nc];W[ce];B[me];W[bd]
+;B[pc];W[qc];B[qd];W[pe];B[rc]
+;W[do];B[cp];W[co];B[bo];W[bn]
+;B[ap];W[cm];B[ic];W[qo];B[rp]
+;W[qb];B[rb];W[rd];B[qe];W[re]
+;B[qf];W[pb];B[oc];W[rf];B[pf]
+;W[ob];B[mb];W[sd];B[rg];W[sb]
+;B[ql];W[oo];B[po];W[pn];B[pp]
+;W[ol];B[pm];W[oj];B[if];W[ei]
+;B[nq];W[iq];B[kq];W[fq];B[ip]
+;W[hp];B[in];W[jp];B[io];W[jq]
+;B[gc];W[kr];B[on];W[nn];B[om]
+;W[gf];B[pk];W[ok];B[fd];W[oh]
+;B[mh];W[nm];B[nj];W[ni];B[ml]
+;W[mj];B[li];W[mm];B[ll];W[nl]
+;B[lj];W[ng];B[pg];W[gl];B[ik]
+;W[gi];B[hh];W[ee];B[lr];W[pl]
+;B[qm];W[lq];B[ks];W[kp];B[gk]
+;W[mr];B[km];W[fk];B[nh];W[pj]
+;B[mi];W[qk];B[rk];W[rj];B[rl]
+;W[nk];B[pi];W[og];B[qi];W[oi]
+;B[qj];W[hk];B[lo];W[fb];B[hm]
+;W[ia];B[gb];W[ja];B[fn];W[jc]
+;B[he];W[ga];B[fa];W[ea];B[hb]
+;W[ha];B[kb];W[jb];B[er];W[jd]
+;B[hs];W[np];B[op];W[jf];B[je]
+;W[ke];B[ie];W[le];B[ld];W[no]
+;B[ko];W[mq];B[is];W[lc];B[md]
+;W[mf];B[kd];W[lg];B[kh];W[lp]
+;B[dm];W[em];B[en];W[dl];B[ls]
+;W[ep];B[na];W[sf];B[mo];W[jg]
+;B[ig];W[lf];B[mp];W[gr];B[mk]
+;W[gs];B[nr];W[ms];B[gh];W[fh]
+;B[hd];W[kc];B[of];W[hl];B[fe]
+;W[ff];B[ij];W[mc];B[nb];W[ns]
+;B[oa];W[ra];B[il];W[or];B[oq]
+;W[pr];B[qr];W[dn];B[pa];W[sc]
+;B[sg];W[fm];B[go];W[ho];B[gp]
+;W[hq];B[hn];W[an];B[ao];W[lb]
+;B[dp];W[hi];B[ii];W[jo];B[jn]
+;W[hj];B[fs];W[fr];B[es];W[bq]
+;B[br];W[ar];B[cr];W[bp];B[gm]
+;W[gg];B[ed];W[dd];B[la];W[ka]
+;B[cc];W[bb];B[bc];W[fc];B[cb]
+;W[be];B[gn];W[ge];B[gd];W[hg]
+;B[ih];W[ca];B[gq];W[eo];B[eq]
+;W[fp];B[fo];W[ma];B[nf];W[la]
+;B[bs];W[ds];B[id];W[qa];B[ne]
+;W[ps];B[qs];W[os];B[hf];W[ib]
+;B[ef];W[fg];B[tt];W[tt];
+TW[aa][ba][da][fa][sa][ab][cb][db][eb][kb][rb][ac][bc][cc][dc][rc][ad][cd][ae][se][af][bf][cf][df][ef][ag][bg][cg][dg][eg][ah][bh][ch][dh][eh][ai][bi][ci][di][fi][aj][bj][cj][dj][ej][fj][gj][ak][bk][ck][dk][ek][gk][al][bl][cl][el][fl][am][bm][dm][cn][ao][bo][ap][cp][dp][aq][cq][dq][eq][kq][br][cr][dr][er][hr][ir][jr][lr][as][bs][cs][es][fs][hs][is][js][ks][ls]
+TB[hc][nd][od][pd][ke][le][oe][pe][jf][kf][lf][mf][jg][kg][lg][mg][ng][og][qg][jh][lh][oh][ph][qh][rh][sh][ji][ki][ni][oi][ri][si][jj][kj][mj][nj][oj][pj][rj][sj][jk][kk][lk][nk][ok][pk][qk][sk][jl][kl][nl][ol][pl][sl][im][jm][lm][mm][nm][rm][sm][kn][ln][mn][nn][pn][qn][rn][sn][no][oo][qo][ro][so][np][qp][sp][qq][rq][sq][rr][sr][rs][ss]
+C[The game is over.  Final score:
+   White = 90 territory + 33 captures + 6.5 komi = 129.5
+   Black = 84 territory + 32 captures = 116
+White wins by 13.5.
+]
+)
diff --git a/regression/games/cgf2004/caren.sgf b/regression/games/cgf2004/caren.sgf
new file mode 100644 (file)
index 0000000..fee756c
--- /dev/null
@@ -0,0 +1,64 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GnuGo 3.5.3]
+PB[Caren's Whisper]
+GN[CGF Special meeting 2004]
+DT[2004-01-10]
+SY[Cgoban 1.9.11]TM[40]
+RE[W+70.5]
+;B[pd];W[dd];B[pq];W[dp];B[pk]
+;W[mp];B[po];W[jp];B[jd];W[qf]
+;B[re];W[of];B[nd];W[hc];B[he]
+;W[fd];B[cn];W[cl];B[cq];W[dq]
+;B[dm];W[cp];B[eo];W[pi];B[pg]
+;W[pf];B[dl];W[ck];B[en];W[ch]
+;B[rg];W[gq];B[qi];W[dk];B[oi]
+;W[mf];B[ph];W[le];B[jf];W[lc]
+;B[jc];W[nb];B[pb];W[ce];B[lg]
+;W[kb];B[jb];W[mb];B[jh];W[la]
+;B[go];W[mn];B[pm];W[jn];B[hm]
+;W[ml];B[ne];W[oc];B[nf];W[pc]
+;B[qb];W[qc];B[rb];W[rc];B[rd]
+;W[sc];B[il];W[ng];B[ij];W[od]
+;B[oe];W[pe];B[mr];W[lq];B[hq]
+;W[hp];B[iq];W[gp];B[lr];W[jq]
+;B[nq];W[rf];B[gf];W[kr];B[eq]
+;W[ep];B[fp];W[fq];B[sf];W[fh]
+;B[md];W[ld];B[gj];W[bo];B[bn]
+;W[an];B[qg];W[ek];B[og];W[qd]
+;B[qe];W[pd];B[nh];W[mg];B[mh]
+;W[kl];B[se];W[li];B[ki];W[lh]
+;B[fi];W[kg];B[fo];W[gh];B[io]
+;W[jg];B[ip];W[ig];B[ef];W[eh]
+;B[cf];W[df];B[dg];W[de];B[hb]
+;W[gb];B[ib];W[eg];B[fe];W[ic]
+;B[gd];W[gc];B[hg];W[hh];B[kd]
+;W[ii];B[fg];W[ke];B[je];W[if]
+;B[ji];W[jj];B[hj];W[jk];B[am]
+;W[hr];B[ir];W[gs];B[ao];W[bq]
+;B[ak];W[bi];B[ei];W[ap];B[di]
+;W[ci];B[dh];W[ih];B[cg];W[bf]
+;B[bg];W[be];B[af];W[ae];B[ag]
+;W[jo];B[ho];W[mq];B[op];W[ls]
+;B[nr];W[fm];B[jm];W[hs];B[fk]
+;W[km];B[in];W[jl];B[im];W[ms]
+;B[ej];W[ns];B[do];W[os];B[co]
+;W[bp];B[pr];W[ps];B[rr];W[rs]
+;B[qr];W[qs];B[mj];W[nk];B[ol]
+;W[sr];B[rq];W[sq];B[sp];W[ss]
+;B[rp];W[kj];B[oj];W[mi];B[nj]
+;W[ni];B[oh];W[lj];B[no];W[nn]
+;B[on];W[nl];B[mo];W[lo];B[an]
+;W[np];B[oo];W[or];B[oq];W[ks]
+;B[is];W[er];B[mk];W[lk];B[ik]
+;W[nm];B[bl];W[jr];B[om];W[gi]
+;B[ai];W[ok];B[cj];W[sd];B[sg]
+;W[js];B[hi];W[tt];B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ka][ma][na][oa][pa][qa][ra][sa][ab][bb][cb][db][eb][fb][hb][ib][jb][lb][ob][pb][qb][rb][sb][ac][bc][cc][dc][ec][fc][jc][kc][mc][nc][ad][bd][cd][ed][gd][hd][id][jd][kd][md][nd][ee][fe][ge][he][ie][je][me][ne][oe][ef][ff][gf][hf][jf][kf][lf][nf][fg][gg][hg][lg][jh][kh][ji][ki][kk][ll][lm][mm][kn][ln][ko][kp][lp][aq][cq][eq][kq][ar][br][cr][dr][fr][gr][as][bs][cs][ds][es][fs]
+TB[ah][bh][ch][qh][rh][sh][bi][ci][pi][ri][si][aj][bj][dj][fj][pj][qj][rj][sj][bk][ck][dk][ek][gk][hk][qk][rk][sk][al][cl][el][fl][gl][hl][pl][ql][rl][sl][bm][cm][em][fm][gm][qm][rm][sm][dn][fn][gn][hn][pn][qn][rn][sn][qo][ro][so][pp][qp][qq]
+C[The game is over.  Final score:
+   White = 104 territory + 30 captures + 6.5 komi = 140.5
+   Black = 60 territory + 10 captures = 70
+White wins by 70.5.
+]
+)
diff --git a/regression/games/cgf2004/gargoyle.sgf b/regression/games/cgf2004/gargoyle.sgf
new file mode 100644 (file)
index 0000000..16b16c8
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Gargoyle]
+PB[GnuGo 3.5.3]
+GN[CGF Special Meeting]
+DT[2004-01-10]
+SY[Cgoban 1.9.11]TM[40]
+RE[B+169.5]
+;B[pd];W[dp];B[pp];W[dd];B[fc]
+;W[cf];B[db];W[cc];B[ic];W[qf]
+;B[cn];W[dm];B[cm];W[dj];B[nd]
+;W[rd];B[qc];W[rc];B[bp];W[fp]
+;B[cq];W[hq];B[lo];W[qb];B[pb]
+;W[qa];B[pa];W[qd];B[jq];W[pc]
+;B[mq];W[lm];B[oc];W[qc];B[ob]
+;W[pe];B[qp];W[od];B[ne];W[ph]
+;B[pl];W[lk];B[bj];W[jg];B[ke]
+;W[ng];B[if];W[mf];B[hh];W[cb]
+;B[ig];W[jr];B[ir];W[iq];B[hr]
+;W[jp];B[kq];W[ho];B[jh];W[rk]
+;B[jj];W[ni];B[dn];W[cl];B[bl]
+;W[gl];B[dl];W[em];B[ck];W[hk]
+;B[el];W[ik];B[fm];W[en];B[eo]
+;W[fn];B[fo];W[gn];B[gp];W[gm]
+;B[ep];W[fl];B[gq];W[fd];B[kn]
+;W[km];B[jn];W[ln];B[ec];W[eg]
+;B[lg];W[nn];B[rl];W[pk];B[qk]
+;W[ok];B[qj];W[ol];B[pm];W[om]
+;B[rh];W[pj];B[hp];W[ip];B[io]
+;W[in];B[jo];W[jm];B[kp];W[nq]
+;B[np];W[pn];B[qn];W[qi];B[rj]
+;W[ri];B[si];W[qh];B[rg];W[oe]
+;B[mc];W[nb];B[nc];W[na];B[nf]
+;W[of];B[mg];W[qg];B[gd];W[gg]
+;B[bh];W[gh];B[ed];W[fe];B[ee]
+;W[da];B[ek];W[jk];B[ea];W[ca]
+;B[ff];W[ge];B[gf];W[he];B[hd]
+;W[lc];B[df];W[fi];B[fk];W[ii]
+;B[gj];W[kj];B[ej];W[hi];B[gi]
+;W[ki];B[fh];W[ih];B[hg];W[fg]
+;B[kh];W[eh];B[dg];W[ei];B[ef]
+;W[jf];B[ce];W[dc];B[bd];W[eb]
+;B[fb];W[fa];B[ab];W[jb];B[mb]
+;W[lb];B[ib];W[ma];B[nh];W[og]
+;B[lf];W[oh];B[mh];W[mi];B[rf]
+;W[re];B[mo];W[mn];B[po];W[on]
+;B[ji];W[li];B[go];W[hn];B[oo]
+;W[no];B[lh];W[kd];B[ja];W[ka]
+;B[ia];W[jc];B[je];W[pr];B[oq]
+;W[nr];B[or];W[os];B[qr];W[mr]
+;B[lr];W[ps];B[op];W[pq];B[qq]
+;W[rm];B[qm];W[rn];B[ro];W[rq]
+;B[rp];W[sq];B[sp];W[sf];B[sh]
+;W[ci];B[bi];W[fj];B[gk];W[ij]
+;B[sj];W[cr];B[dq];W[er];B[dr]
+;W[es];B[ds];W[br];B[bq];W[bo]
+;B[co];W[bn];B[bm];W[aq];B[an]
+;W[gs];B[eq];W[cs];B[ap];W[ar]
+;B[sg];W[se];B[hj];W[me];B[le]
+;W[md];B[ld];W[sk];B[sl];W[fq]
+;B[gr];W[js];B[kr];W[fr];B[hs]
+;W[tt];B[tt];
+TW[ra][sa][rb][sb][sc][pd][sd][qe][pf][pg][oi][pi][lj][mj][nj][oj][kk][mk][nk][hl][il][jl][kl][ll][ml][nl][fm][hm][im][mm][nm]
+TB[aa][ba][ca][da][ea][fa][ga][ha][ka][la][ma][na][oa][bb][cb][db][eb][gb][hb][jb][kb][lb][nb][ac][bc][cc][dc][gc][hc][jc][kc][lc][ad][cd][dd][fd][id][jd][kd][md][ae][be][de][fe][ge][he][ie][me][af][bf][cf][hf][jf][kf][mf][ag][bg][cg][eg][fg][gg][jg][kg][ah][ch][dh][eh][fh][gh][ai][ci][di][ei][fi][aj][cj][dj][fj][ak][bk][dk][rk][sk][al][cl][ql][am][rm][sm][bn][rn][sn][ao][bo][do][ko][qo][so][cp][dp][fp][ip][jp][lp][mp][aq][fq][hq][iq][lq][nq][pq][rq][sq][ar][br][cr][er][fr][jr][mr][nr][pr][rr][sr][as][bs][cs][es][fs][gs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 31 territory + 6 captures + 6.5 komi = 43.5
+   Black = 142 territory + 71 captures = 213
+Black wins by 169.5.
+]
+)
diff --git a/regression/games/cgf2004/gorimutyu.sgf b/regression/games/cgf2004/gorimutyu.sgf
new file mode 100644 (file)
index 0000000..92e2ca0
--- /dev/null
@@ -0,0 +1,56 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GoriMutyu]
+PB[GnuGo 3.5.3]
+GN[CGF Special Meeting]
+DT[2004-01-10]
+RE[B+, human judge for communication error ]
+SY[Cgoban 1.9.11]TM[40];B[pd];W[dq];B[cd]
+;W[ck];B[pp];W[im];B[ec];W[lr]
+;B[co];W[dn];B[do];W[eo];B[cn]
+;W[fh];B[on];W[bf];B[oq];W[lg]
+;B[lp];W[kp];B[kq];W[iq];B[kr]
+;W[hc];B[lq];W[oc];B[pc];W[ol]
+;B[lc];W[qe];B[ob];W[rm];B[nc]
+;W[me];B[od];W[of];B[km];W[kk]
+;B[he];W[if];B[jp];W[bp];B[ip]
+;W[hp];B[hq];W[hr];B[gq];W[fq]
+;B[gp];W[go];B[gr];W[bm];B[rd]
+;W[sd];B[re];W[rf];B[se];W[oa]
+;B[sf];W[sg];B[rg];W[rh];B[qf]
+;W[qg];B[sh];W[si];B[qh];W[ph]
+;B[ri];W[qj];B[jl];W[eb];B[fb]
+;W[lm];B[db];W[bd];B[il];W[hk]
+;B[ll];W[ml];B[mk];W[nj];B[mm]
+;W[pn];B[hm];W[qp];B[qq];W[fm]
+;B[qo];W[rr];B[mj];W[li];B[bc]
+;W[fr];B[fs];W[gs];B[hs];W[es]
+;B[gl];W[sj];B[gk];W[gj];B[fj]
+;W[ge];B[ek];W[mo];B[hj];W[ij]
+;B[hd];W[hi];B[ic];W[cb];B[ee]
+;W[mi];B[ln];W[gs];B[ir];W[ef]
+;B[be];W[de];B[fe];W[kd];B[gf]
+;W[gg];B[df];W[cf];B[dg];W[ch]
+;B[ce];W[fp];B[ho];W[ro];B[rp]
+;W[ae];B[rj];W[rk];B[fg];W[qi]
+;B[rh];W[sp];B[rn];W[ks];B[no]
+;W[or];B[kc];W[mq];B[nr];W[rc]
+;B[sc];W[sb];B[qc];W[dd];B[ad]
+;W[ej];B[ei];W[dj];B[fi];W[rq]
+;B[so];W[ns];B[mr];W[qr];B[pr]
+;W[ps];B[pq];W[ie];B[pg];W[og]
+;B[gh];W[qb];B[rb];W[ra];B[rc]
+;W[hh];B[hg];W[ig];B[pi];W[oi]
+;B[qk];W[pk];B[ql];W[pj];B[af]
+;W[ag];B[bg];W[cg];B[ah];W[ai]
+;B[bi];W[bj];B[ci];W[bn];B[cj]
+;W[bo];B[dk];W[fk];B[dm];W[dl]
+;B[fl];W[bh];B[dh];W[cg];B[el]
+;W[jc];B[jb];W[hn];B[gn];W[nd]
+;B[jd];W[je];B[md];W[hb];B[id]
+;W[pb];B[cl];W[cm];B[en];W[bl]
+;B[fo];W[nb];B[qm];W[mb];B[lb]
+;W[la];B[oc];W[sq];B[bk];W[ak]
+;B[aj];W[gi];B[ne];W[nf];B[ep]
+
+)
diff --git a/regression/games/cgf2004/goro.sgf b/regression/games/cgf2004/goro.sgf
new file mode 100644 (file)
index 0000000..a4606f5
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Goro]
+PB[GnuGo 3.5.3]
+GN[CGF Specail meeting]
+DT[2004-01-11]
+RE[B+, Goro crushed in his 126th move, and could not continue.] 
+SY[Cgoban 1.9.11]TM[40];B[pd];W[dp];B[pq]
+;W[dd];B[fq];W[cn];B[jp];W[gc]
+;B[dr];W[cq];B[fo];W[ce];B[qo]
+;W[qi];B[fm];W[ci];B[fk];W[dl]
+;B[fi];W[eh];B[gg];W[qf];B[nd]
+;W[lc];B[me];W[ge];B[mc];W[lb]
+;B[ld];W[ql];B[kc];W[lq];B[re]
+;W[jr];B[lo];W[iq];B[eg];W[gr]
+;B[fh];W[qc];B[qe];W[ic];B[kb]
+;W[nq];B[ha];W[cc];B[pf];W[ob]
+;B[qg];W[ip];B[cr];W[ko];B[jo]
+;W[hn];B[kn];W[cg];B[lp];W[no]
+;B[bq];W[fb];B[an];W[bp];B[ap]
+;W[eq];B[fr];W[mm];B[hl];W[im]
+;B[kl];W[mo];B[gq];W[gp];B[fp]
+;W[hq];B[ho];W[io];B[gn];W[il]
+;B[qm];W[ik];B[pl];W[pk];B[kj]
+;W[or];B[rl];W[ol];B[qk];W[oi]
+;B[pr];W[rh];B[om];W[pj];B[ph]
+;W[nl];B[co];W[cp];B[do];W[mb]
+;B[nb];W[na];B[nc];W[pc];B[bo]
+;W[je];B[dk];W[bk];B[cl];W[hr]
+;B[la];W[ii];B[rc];W[kh];B[qb]
+;W[bm];B[bl];W[ck];B[al];W[ak]
+;B[el];W[ig];B[dj];W[bh];B[mk]
+;W[mi];B[li]
+)
diff --git a/regression/games/cgf2004/katsunari.sgf b/regression/games/cgf2004/katsunari.sgf
new file mode 100644 (file)
index 0000000..1e7f80f
--- /dev/null
@@ -0,0 +1,78 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[GnuGo 3.5.3]
+PB[Katsunari]
+GN[CGF Specail meeting 2004]
+DT[2004-01-11]
+SY[Cgoban 1.9.11]TM[40]
+RE[W+77.5]
+;B[jj];W[dp];B[cd];W[ed];B[ec]
+;W[dd];B[dc];W[ce];B[fc];W[fd]
+;B[pc];W[cc];B[bd];W[cb];B[pp]
+;W[gc];B[qi];W[qn];B[qo];W[pn]
+;B[nq];W[qe];B[qd];W[pe];B[nc]
+;W[el];B[ql];W[be];B[iq];W[nn]
+;B[fq];W[po];B[qp];W[eq];B[fp]
+;W[dn];B[kc];W[fj];B[gb];W[hc]
+;B[hb];W[ib];B[jb];W[ic];B[ia]
+;W[he];B[er];W[dr];B[mo];W[ok]
+;B[ep];W[dq];B[ol];W[nl];B[pk]
+;W[om];B[oj];W[pl];B[qk];W[km]
+;B[qg];W[rf];B[rg];W[of];B[qf]
+;W[qm];B[nk];W[rd];B[rc];W[mn]
+;B[ol];W[ml];B[ci];W[gl];B[cl]
+;W[bm];B[bl];W[eo];B[bg];W[lo]
+;B[fr];W[cm];B[il];W[jc];B[kb]
+;W[mp];B[mq];W[sc];B[jn];W[rb]
+;B[qb];W[qc];B[pb];W[pd];B[pm]
+;W[sg];B[sh];W[sf];B[ri];W[lq]
+;B[lr];W[kq];B[kr];W[al];B[ak]
+;W[am];B[bj];W[db];B[fb];W[dg]
+;B[ag];W[ih];B[ae];W[bc];B[ba]
+;W[ad];B[gn];W[jo];B[hm];W[jm]
+;B[dj];W[ei];B[dk];W[in];B[fm]
+;W[es];B[fl];W[fk];B[hi];W[ij]
+;B[hk];W[hj];B[hh];W[ii];B[gk]
+;W[gj];B[dh];W[eh];B[cg];W[df]
+;B[cf];W[fs];B[gs];W[ds];B[hg]
+;W[jf];B[ig];W[jg];B[kd];W[gr]
+;B[hp];W[jr];B[jk];W[hr];B[lj]
+;W[np];B[op];W[lf];B[me];W[ks]
+;B[ik];W[mr];B[nr];W[ls];B[ie]
+;W[ns];B[qr];W[os];B[if];W[jd]
+;B[je];W[ke];B[le];W[kf];B[id]
+;W[ge];B[hd];W[gd];B[gf];W[hf]
+;B[gg];W[fg];B[or];W[ps];B[mf]
+;W[qs];B[rr];W[pr];B[lg];W[kh]
+;B[jh];W[ji];B[kg];W[jh];B[rn]
+;W[rm];B[so];W[lh];B[rs];W[oq]
+;B[mg];W[sm];B[ek];W[mh];B[em]
+;W[sn];B[ro];W[oo];B[ir];W[qa]
+;B[is];W[hs];B[pa];W[ra];B[od]
+;W[eb];B[dm];W[fa];B[cn];W[bn]
+;B[co];W[bo];B[ea];W[da];B[bp]
+;W[cp];B[ha];W[di];B[bq];W[br]
+;B[ao];W[do];B[mk];W[ch];B[bh]
+;W[rl];B[rk];W[kj];B[kk];W[ll]
+;B[ki];W[fo];B[go];W[hq];B[ip]
+;W[gp];B[ng];W[og];B[nh];W[mi]
+;B[oh];W[jp];B[io];W[im];B[hn]
+;W[pg];B[ph];W[pq];B[qq];W[ni]
+;B[pf];W[oe];B[ne];W[oi];B[pi]
+;W[af];B[sk];W[bf];B[pl];W[ej]
+;B[dh];W[ja];B[ka];W[ch];B[lk]
+;W[li];B[dh];W[oc];B[ob];W[ch]
+;B[cr];W[cq];B[dh];W[qh];B[rh]
+;W[ch];B[kj];W[dh];B[nj];W[jq]
+;B[ho];W[kl];B[fn];W[js];B[nf]
+;W[sl];B[mj];W[en];B[jl];W[ea]
+;B[tt];W[ga];B[ja];W[tt];B[tt]
+;
+TW[aa][ba][ca][sa][ab][bb][sb][ac][rc][bd][cd][hd][id][qd][sd][ae][de][ee][fe][ie][je][re][se][ef][ff][gf][if][eg][gg][hg][ig][fh][gh][hh][fi][gi][hi][lm][mm][nm][an][cn][jn][kn][ln][on][ao][co][ko][mo][no][ap][bp][ep][fp][kp][lp][aq][bq][fq][gq][mq][nq][ar][cr][er][fr][kr][lr][nr][or][as][bs][cs][gs][ms]
+TB[la][ma][na][oa][lb][mb][nb][lc][mc][oc][ld][md][nd][ah][qh][ai][bi][si][aj][cj][pj][qj][rj][sj][bk][ck][ok][dl][el][gl][hl][gm][rp][sp][rq][sq][sr][ss]
+C[The game is over.  Final score:
+   White = 76 territory + 44 captures + 6.5 komi = 126.5
+   Black = 38 territory + 11 captures = 49
+White wins by 77.5.
+]
+)
diff --git a/regression/games/cgf2004/martha.sgf b/regression/games/cgf2004/martha.sgf
new file mode 100644 (file)
index 0000000..e9a9f40
--- /dev/null
@@ -0,0 +1,98 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[martha]
+PB[GnuGo 3.5.3]
+GN[CGF Special meeting 2004]
+DT[2004-01-10]
+SY[Cgoban 1.9.11]TM[40]
+RE[B+370.5]
+;B[pd];W[cc];B[dp];W[hc];B[pp]
+;W[mc];B[oc];W[pg];B[dd];W[df]
+;B[ee];W[gh];B[qi];W[qj];B[cl]
+;W[ll];B[pi];W[pj];B[oi];W[ni]
+;B[ql];W[qm];B[oh];W[pq];B[qq]
+;W[op];B[po];W[gp];B[oq];W[pr]
+;B[nq];W[mp];B[dn];W[dq];B[eq]
+;W[qg];B[cq];W[dr];B[er];W[cr]
+;B[bq];W[fs];B[gq];W[mg];B[og]
+;W[ck];B[dk];W[ed];B[be];W[pc]
+;B[de];W[od];B[qc];W[pb];B[nd]
+;W[oe];B[nc];W[kq];B[pe];W[qd]
+;B[qe];W[fl];B[cj];W[ch];B[rd]
+;W[bl];B[bk];W[qp];B[rp];W[qo]
+;B[qn];W[ce];B[ro];W[me];B[cd]
+;W[bd];B[bc];W[bb];B[ad];W[ob]
+;B[fd];W[ec];B[fc];W[cf];B[ne]
+;W[fe];B[dc];W[eb];B[fb];W[db]
+;B[cb];W[ca];B[ge];W[of];B[nf]
+;W[pf];B[nb];W[cc];B[ff];W[ma]
+;B[mb];W[re];B[md];W[kf];B[pm]
+;W[rm];B[ng];W[oj];B[gn];W[hn]
+;B[gm];W[hl];B[hp];W[hq];B[ip]
+;W[ho];B[lr];W[ms];B[ls];W[kr]
+;B[mr];W[lc];B[lb];W[np];B[hr]
+;W[iq];B[ir];W[jq];B[jp];W[fo]
+;B[go];W[fp];B[fn];W[ic];B[gr]
+;W[sc];B[qb];W[mq];B[kp];W[rc]
+;B[or];W[qf];B[qd];W[os];B[nr]
+;W[ac];B[ab];W[aa];B[eg];W[ac]
+;B[bd];W[ak];B[ei];W[rb];B[oa]
+;W[fg];B[gl];W[gk];B[hg];W[hm]
+;B[em];W[bj];B[ck];W[kg];B[hk]
+;W[hj];B[ik];W[kj];B[il];W[im]
+;B[gj];W[gi];B[fk];W[aq];B[jm]
+;W[jn];B[km];W[jk];B[lo];W[ln]
+;B[lm];W[bo];B[mn];W[kn];B[fi]
+;W[mo];B[io];W[fj];B[ml];W[om]
+;B[ol];W[nm];B[nl];W[nj];B[mk]
+;W[gs];B[br];W[ar];B[bi];W[cp]
+;B[co];W[gk];B[le];W[qa];B[pa]
+;W[bp];B[bs];W[ap];B[bn];W[mm]
+;B[in];W[jl];B[ij];W[nn];B[ks]
+;W[lq];B[qr];W[im];B[hm];W[bh]
+;B[mj];W[mh];B[gj];W[kl];B[im]
+;W[gk];B[fh];W[ek];B[hi];W[ep]
+;B[do];W[di];B[dg];W[eh];B[gg]
+;W[hh];B[ej];W[rr];B[ii];W[dj]
+;B[dh];W[ae];B[ea];W[fa];B[ih]
+;W[pl];B[pn];W[qk];B[pk];W[ok]
+;B[pl];W[pb];B[li];W[ra];B[sd]
+;W[ji];B[rl];W[rk];B[ri];W[rg]
+;B[lh];W[jg];B[lg];W[bm];B[jh]
+;W[he];B[jb];W[ka];B[ib];W[hb]
+;B[kc];W[kb];B[jc];W[gf];B[hf]
+;W[hd];B[js];W[is];B[fr];W[ds]
+;B[es];W[jr];B[ps];W[na];B[la]
+;W[na];B[ma];W[qs];B[rs];W[ef]
+;B[bf];W[dl];B[cm];W[af];B[ci]
+;W[lf];B[mf];W[ah];B[ag];W[bg]
+;B[cg];W[se];B[pc];W[af];B[ai]
+;W[an];B[cn];W[ko];B[lp];W[pr]
+;B[pq];W[ss];B[rq];W[qs];B[sq]
+;W[ki];B[kh];W[lj];B[jj];W[ig]
+;B[if];W[id];B[ga];W[pr];B[el]
+;W[ha];B[jd];W[da];B[fa];W[ld]
+;B[kd];W[ke];B[je];W[mi];B[sk]
+;W[rj];B[sj];W[sl];B[sm];W[si]
+;B[sh];W[ld];B[lc];W[fm];B[gj]
+;W[gi];B[gh];W[en];B[eo];W[qo]
+;B[qp];W[mn];B[oo];W[ia];B[ja]
+;W[ns];B[no];W[sn];B[rn];W[rm]
+;B[qm];W[sg];B[rh];W[as];B[ao]
+;W[al];B[am];W[bo];B[bp];W[an]
+;B[ag];W[ka];B[gf];W[gc];B[gd]
+;W[ce];B[tt];W[cf];B[tt];W[df]
+;B[tt];W[bg];B[tt];W[ah];B[tt]
+;W[bh];B[tt];W[ch];B[tt];W[ae]
+;B[tt];W[di];B[tt];W[hn];B[tt]
+;W[so];B[tt];W[ap];B[tt];W[aq]
+;B[tt];W[bo];B[tt];W[as];B[tt]
+;W[ar];B[tt];W[sr];B[tt];W[tt]
+;
+TB[aa][ba][ca][da][ha][ia][ka][na][qa][ra][sa][ab][bb][cb][db][eb][gb][hb][kb][ob][pb][rb][sb][ac][cc][ec][gc][hc][ic][mc][rc][sc][ed][hd][id][ld][od][ae][ce][fe][he][ie][ke][me][oe][re][se][af][cf][df][ef][jf][kf][lf][of][pf][qf][rf][sf][ag][bg][fg][ig][jg][kg][mg][pg][qg][rg][sg][ah][bh][ch][eh][hh][mh][nh][ph][qh][di][gi][ji][ki][mi][ni][si][aj][bj][dj][fj][hj][kj][lj][nj][oj][pj][qj][rj][ak][ek][fk][gk][jk][kk][lk][nk][ok][qk][rk][al][bl][dl][fl][hl][jl][kl][ll][sl][am][bm][dm][fm][mm][nm][om][rm][an][en][hn][jn][kn][ln][mn][nn][on][sn][ao][bo][fo][ho][jo][ko][mo][qo][so][ap][cp][ep][fp][gp][mp][np][op][sp][aq][dq][fq][hq][iq][jq][kq][lq][mq][ar][cr][dr][jr][kr][pr][rr][sr][as][cs][ds][fs][gs][hs][is][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 0 territory + 12 captures + 6.5 komi = 18.5
+   Black = 185 territory + 204 captures = 389
+Black wins by 370.5.
+]
+)
diff --git a/regression/games/cgf2004/result.txt b/regression/games/cgf2004/result.txt
new file mode 100644 (file)
index 0000000..7c38988
--- /dev/null
@@ -0,0 +1,43 @@
+CGF special Meeting 2004 result\r
+\r
+CGF special meeting(small computer Go tournament in Japan) was held\r
+ at the University of Electro-Communications, Tokyo in January 10-11th.\r
+We had nine participants include GnuGo 3.5.3 as a guest.\r
+There were two new programs, gargoyle and GoriMutyu.\r
+\r
+And GnuGo won perfectly.\r
+Runners up was Goro, and 3rd was Katsunari.\r
+Haruka did not participate this year.\r
+\r
+\r
+CGF special meeting 2004 result.\r
+2003-01-10,11. The University of Electro-Communications, Tokyo\r
+\r
+                  Gnu GOR Kat Aya Car Shi Mar gar Gori Wins Rank\r
+GnuGo 3.5.3(Guest)     1   1   1   1   1   1   1   1   8-0   1\r
+GORO               0       1   1   1   1   1   1   1   7-1   2\r
+Katsunari          0   0       1   1   1   1   1   1   6-2   3\r
+Aya                0   0   0       1   1   1   1   1   5-4   4\r
+Caren's Whisper    0   0   0   0       1   1   1   1   4-4   5\r
+ShikoSakugo        0   0   0   0   0       1   1   1   3-5   6\r
+Martha             0   0   0   0   0   0       1   1   2-6   7\r
+gargoyle           0   0   0   0   0   0   0       1   1-7   8\r
+GoriMutyu          0   0   0   0   0   0   0   0       0-8   9\r
+\r
+\r
+   Program         Author             Nation Machine      CPU       Clock\r
+\r
+1. GnuGo 3.5.3     Gnu                Japan  DOS/V        Celeron    850MHz\r
+2. GORO            Yasuo OISHI        Japan  INSPIRON     Pentium4  1.6 GHz\r
+3. Katsunari       Shinichi SEI       Japan  Vaio         PentiumM   900MHz\r
+4. Aya             Hiroshi YAMASHITA  Japan  ThinkPad X24 Pentium3M 1.13GHz\r
+5. Caren's Whisper Katsumi KOBAYASHI  Japan  Endeavor     Pentium4  2.4 GHz\r
+6. ShikoSakugo     Morihiko TAJIMA    Japan  ThinkPad T30 Pentium4  2.0 GHz\r
+7. Martha          Ichiro UJIIE       Japan  Vaio         PentiumM  1.3 GHz\r
+8. gargoyle        Nariaki MATSUMURA  Japan  ThinkPad X40 PentiumM  1.0 GHz\r
+9. GoriMutyu       Hiroyuki NAGAYOSHI Japan  NotePC       Celeron   1.2 GHz\r
+\r
+I used following option in cgoban.\r
+/home/yss/gnugo-3.5.3/interface/gnugo --mode gmp --autolevel --clock 2400\r
+\r
+Hiroshi Yamashita\r
diff --git a/regression/games/cgf2004/shikosakugo.sgf b/regression/games/cgf2004/shikosakugo.sgf
new file mode 100644 (file)
index 0000000..b69d04f
--- /dev/null
@@ -0,0 +1,61 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[ShikoSakugo]
+PB[GnuGo 3.5.3]
+GN[CGF special meeting 2004]
+DT[2004-01-11]
+SY[Cgoban 1.9.11]TM[40]
+RE[B+35.5]
+;B[pd];W[dp];B[pp];W[dc];B[de]
+;W[ce];B[cf];W[cd];B[df];W[fc]
+;B[cj];W[nq];B[fq];W[cn];B[dr]
+;W[qp];B[qq];W[qo];B[iq];W[qf]
+;B[qh];W[qc];B[qd];W[pc];B[od]
+;W[rd];B[re];W[rc];B[qe];W[nc]
+;B[pf];W[rq];B[rr];W[rp];B[pq]
+;W[no];B[cq];W[cp];B[me];W[sr]
+;B[rs];W[on];B[qk];W[ld];B[lq]
+;W[id];B[ge];W[gd];B[gg];W[cl]
+;B[ek];W[el];B[oc];W[nb];B[ob]
+;W[qb];B[sb];W[pb];B[oa];W[md]
+;B[na];W[lb];B[jf];W[ra];B[pa]
+;W[qm];B[nk];W[gl];B[fk];W[fl]
+;B[ij];W[lj];B[mk];W[im];B[kk]
+;W[kj];B[lk];W[mh];B[li];W[mi]
+;B[mj];W[ki];B[lh];W[kh];B[lg]
+;W[qi];B[pi];W[ho];B[dk];W[jk]
+;B[jj];W[kg];B[lf];W[kf];B[ke]
+;W[le];B[nf];W[je];B[gk];W[hk]
+;B[hj];W[mr];B[qj];W[lr];B[ie]
+;W[kd];B[he];W[hd];B[bf];W[kn]
+;B[ac];W[bc];B[ik];W[jl];B[fo]
+;W[ab];B[bk];W[hl];B[bm];W[bn]
+;B[nd];W[dl];B[rl];W[rm];B[la]
+;W[ka];B[ma];W[kb];B[ed];W[ec]
+;B[io];W[in];B[kp];W[lo];B[hp]
+;W[hn];B[bp];W[jr];B[ir];W[jo]
+;B[jq];W[ip];B[go];W[be];B[kr]
+;W[mq];B[lp];W[mp];B[ig];W[ol]
+;B[ae];W[ad];B[af];W[nm];B[mm]
+;W[mn];B[lm];W[pk];B[ok];W[pl]
+;B[ls];W[ms];B[ks];W[fe];B[fd]
+;W[eq];B[er];W[bo];B[bq];W[sl]
+;B[sk];W[sm];B[pj];W[am];B[al]
+;W[an];B[bl];W[ap];B[aq];W[ep]
+;B[eo];W[ao];B[fp];W[cm];B[il]
+;W[jm];B[jp];W[io];B[mb];W[mc]
+;B[dd];W[ck];B[bj];W[do];B[jg]
+;W[jh];B[ih];W[en];B[fn];W[ji]
+;B[em];W[dn];B[ii];W[ke];B[fm]
+;W[ql];B[rk];W[kl];B[gm];W[hm]
+;B[ln];W[ko];B[nl];W[ll];B[ml]
+;W[km];B[ni];W[dm];B[dq];W[gn]
+;B[hq];W[tt];B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][bb][cb][db][eb][fb][gb][hb][ib][jb][ac][cc][gc][hc][ic][jc][kc][lc][bd][jd][om][pm][jn][nn][pn][qn][rn][sn][co][mo][oo][po][ro][so][np][op][pp][sp][oq][pq][qq][sq][nr][or][pr][qr][rr][ns][os][ps][qs][rs][ss]
+TB[qa][ra][sa][pb][qb][rb][pc][qc][rc][sc][rd][sd][ee][fe][ne][oe][pe][se][ef][ff][gf][hf][if][mf][of][qf][rf][sf][ag][bg][cg][dg][eg][fg][hg][mg][ng][og][pg][qg][rg][sg][ah][bh][ch][dh][eh][fh][gh][hh][mh][nh][oh][ph][rh][sh][ai][bi][ci][di][ei][fi][gi][hi][mi][oi][qi][ri][si][aj][dj][ej][fj][gj][nj][oj][rj][sj][ak][gp][gq][kq][ar][br][cr][fr][gr][hr][jr][as][bs][cs][ds][es][fs][gs][hs][is][js]
+C[The game is over.  Final score:
+   White = 62 territory + 8 captures + 6.5 komi = 76.5
+   Black = 99 territory + 13 captures = 112
+Black wins by 35.5.
+]
+)
diff --git a/regression/games/cgf2005/19x19/aya.sgf b/regression/games/cgf2005/19x19/aya.sgf
new file mode 100644 (file)
index 0000000..64c2d4c
--- /dev/null
@@ -0,0 +1,36 @@
+(;\r
+GM[1]SZ[19]\r
+PB[Aya]\r
+PW[GnuGo 3.7.3]\r
+DT[2005-04-10]\r
+RE[W+64.5]\r
+KM[6.5]TM[2400]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=4:39, Aya=13:52]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[pd];W[dp];B[pp];W[dc];B[fp];W[dn];B[ce];W[fd];B[ef];W[eq]\r
+;B[fq];W[hq];B[ep];W[go];B[dq];W[cq];B[dr];W[qn];B[do];W[cp]\r
+;B[co];W[cr];B[er];W[bo];B[cn];W[qf];B[bn];W[pj];B[bp];W[dm]\r
+;B[ed];W[ec];B[ip];W[iq];B[jp];W[kr];B[hc];W[nc];B[pb];W[kc]\r
+;B[nb];W[mb];B[kq];W[lr];B[pn];W[pm];B[qo];W[on];B[po];W[om]\r
+;B[qm];W[ql];B[rm];W[rl];B[rn];W[oe];B[rd];W[nq];B[cj];W[jn]\r
+;B[jq];W[jr];B[ek];W[fe];B[he];W[cd];B[bd];W[bc];B[dd];W[cc]\r
+;B[be];W[ff];B[hg];W[fg];B[eg];W[ob];B[oa];W[na];B[pa];W[pc]\r
+;B[qc];W[oc];B[rb];W[fh];B[hi];W[eh];B[dg];W[gc];B[or];W[hb]\r
+;B[hn];W[ho];B[io];W[in];B[hl];W[fn];B[hp];W[gp];B[lo];W[lm]\r
+;B[im];W[lq];B[kp];W[lp];B[kn];W[ko];B[jm];W[jo];B[ln];W[km]\r
+;B[mm];W[lk];B[kl];W[ll];B[np];W[no];B[ke];W[lh];B[kg];W[re]\r
+;B[ch];W[kk];B[mp];W[oq];B[pq];W[nr];B[nn];W[mo];B[mn];W[oo]\r
+;B[qr];W[gm];B[jc];W[jb];B[ic];W[ib];B[gd];W[hm];B[jk];W[jj]\r
+;B[ik];W[ld];B[mf];W[ng];B[cl];W[os];B[gr];W[pr];B[op];W[qs]\r
+;B[rs];W[rr];B[ps];W[or];B[rq];W[sm];B[ac];W[ab];B[ad];W[kd]\r
+;B[fi];W[jd];B[if];W[gl];B[gk];W[mg];B[nf];W[of];B[me];W[lf]\r
+;B[le];W[kf];B[jf];W[lg];B[ji];W[je];B[kj];W[qe];B[qd];W[kh]\r
+;B[lj];W[jl];B[il];W[mj];B[ki];W[jh];B[ih];W[jg];B[bb];W[cb]\r
+;B[aa];W[hr];B[ei];W[gh];B[gi];W[ie];B[ig];W[hd];B[ge];W[ee]\r
+;B[de];W[dh];B[di];W[cm];B[bm];W[li];B[ij];W[dl];B[dk];W[sn]\r
+;B[cg];W[ro];B[mq];W[qs];B[sr];W[mr];B[qn];W[rp];B[qq];W[gf]\r
+;B[hf];W[od];B[fl];W[fm];B[kl];W[nk];B[el];W[sd];B[sb];W[sc]\r
+;B[qa];W[gs];B[ao];W[fs];B[fr];W[es];B[ds];W[hs];B[eo];W[pe]\r
+;B[ps];W[hh];B[qs];W[ca];B[jl];W[em];B[rc];W[se];B[ab];W[fo]\r
+;B[en];W[so];B[sq];W[sl];B[sp];W[gq];B[qp];W[ba];B[tt];W[fc]\r
+;B[tt];W[gg];B[ii];W[tt];B[tt])\r
diff --git a/regression/games/cgf2005/19x19/caren.sgf b/regression/games/cgf2005/19x19/caren.sgf
new file mode 100644 (file)
index 0000000..ff0fdad
--- /dev/null
@@ -0,0 +1,34 @@
+(;\r
+GM[1]SZ[19]\r
+PB[Caren]\r
+PW[GnuGo]\r
+DT[2005-04-09]\r
+RE[W+50.5]\r
+KM[6.5]TM[2400]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=5:06, Caren=4:26]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[pd];W[dp];B[pq];W[ec];B[cd];W[de];B[ce];W[df];B[cg];W[jc]\r
+;B[lc];W[qo];B[pl];W[op];B[pp];W[po];B[oo];W[np];B[on];W[rq]\r
+;B[nr];W[qr];B[nh];W[qj];B[oj];W[qh];B[pc];W[rl];B[dg];W[lp]\r
+;B[fg];W[lr];B[hq];W[fe];B[hc];W[je];B[he];W[kf];B[kh];W[mm]\r
+;B[ig];W[ok];B[pk];W[pj];B[nk];W[ld];B[md];W[kc];B[mc];W[cb]\r
+;B[ef];W[gc];B[gd];W[lb];B[mb];W[kb];B[ie];W[hb];B[cn];W[fc]\r
+;B[bp];W[dn];B[cm];W[el];B[dl];W[ek];B[fq];W[co];B[em];W[bo]\r
+;B[cq];W[gk];B[dm];W[dq];B[dr];W[er];B[ds];W[br];B[eq];W[cr]\r
+;B[es];W[dj];B[ed];W[dd];B[ee];W[dc];B[fd];W[cf];B[ep];W[be]\r
+;B[gn];W[ik];B[bq];W[cs];B[fr];W[ar];B[qf];W[ci];B[pg];W[bg]\r
+;B[rm];W[qm];B[oh];W[qk];B[le];W[ol];B[pm];W[oi];B[nj];W[nl]\r
+;B[mn];W[lm];B[pi];W[pn];B[jr];W[eh];B[bk];W[ic];B[ah];W[eg]\r
+;B[lf];W[rg];B[rf];W[gg];B[jf];W[ff];B[kd];W[jg];B[jh];W[if]\r
+;B[jd];W[hf];B[hg];W[fh];B[id];W[bj];B[aj];W[ck];B[bl];W[ma]\r
+;B[ao];W[bn];B[bm];W[an];B[eo];W[do];B[sg];W[oa];B[rh];W[ri]\r
+;B[sh];W[qb];B[rc];W[bi];B[jo];W[ai];B[ln];W[oq];B[nm];W[mk]\r
+;B[jm];W[or];B[om];W[ql];B[in];W[ml];B[kn];W[li];B[kk];W[ih]\r
+;B[hh];W[ii];B[jj];W[ji];B[ki];W[ij];B[kg];W[jf];B[rb];W[ge]\r
+;B[hd];W[si];B[qg];W[kr];B[jq];W[mo];B[nn];W[jk];B[kj];W[kp]\r
+;B[pb];W[pa];B[ra];W[qa];B[hl];W[gl];B[il];W[nb];B[od];W[jl]\r
+;B[kl];W[fm];B[en];W[ap];B[hk];W[hi];B[jp];W[hj];B[hm];W[gm]\r
+;B[fn];W[qc];B[qd];W[nc];B[nd];W[ak];B[ks];W[ls];B[kq];W[lq]\r
+;B[js];W[dk];B[qi];W[ph];B[ni];W[pi];B[oc];W[na];B[al];W[aj]\r
+;B[lo];W[no];B[ko];W[gh];B[ke];W[la];B[am];W[cl];B[ob];W[tt]\r
+;B[tt])\r
diff --git a/regression/games/cgf2005/19x19/katsunari.sgf b/regression/games/cgf2005/19x19/katsunari.sgf
new file mode 100644 (file)
index 0000000..c5a8e05
--- /dev/null
@@ -0,0 +1,39 @@
+(;\r
+GM[1]SZ[19]\r
+PB[Katsunari]\r
+PW[GnuGo3.7.3]\r
+DT[2005-04-10]\r
+RE[W+70.5]\r
+KM[6.5]TM[2400]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=5:12, Katsunari=14:29]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[pc];W[pp];B[cd];W[cp];B[qn];W[qe];B[eq];W[do];B[hq];W[od]\r
+;B[oc];W[nd];B[nc];W[md];B[lc];W[qj];B[ql];W[fp];B[fq];W[ke]\r
+;B[ec];W[cj];B[dm];W[oj];B[qq];W[qp];B[qd];W[pq];B[ol];W[pe]\r
+;B[cr];W[lp];B[kq];W[cg];B[jc];W[lq];B[lr];W[mr];B[kr];W[bm]\r
+;B[ld];W[fm];B[qh];W[pg];B[le];W[ie];B[hd];W[ro];B[en];W[fn]\r
+;B[ep];W[eo];B[lf];W[be];B[bd];W[eg];B[he];W[if];B[hf];W[ig]\r
+;B[ph];W[og];B[cn];W[cm];B[dn];W[dl];B[el];W[em];B[cl];W[dk]\r
+;B[bn];W[bl];B[an];W[co];B[ap];W[bq];B[am];W[gk];B[hg];W[re]\r
+;B[rd];W[sd];B[rg];W[oh];B[lh];W[ih];B[hh];W[mj];B[ki];W[ii]\r
+;B[kk];W[hi];B[ml];W[sb];B[mc];W[gh];B[km];W[cf];B[oo];W[nq]\r
+;B[op];W[qb];B[rc];W[sc];B[qr];W[pr];B[rq];W[rp];B[rb];W[ra]\r
+;B[ps];W[os];B[fk];W[gj];B[nf];W[pi];B[mi];W[of];B[pk];W[ni]\r
+;B[pj];W[qi];B[ri];W[rj];B[qg];W[rh];B[sh];W[sf];B[sg];W[sj]\r
+;B[aq];W[br];B[al];W[ck];B[ar];W[bs];B[rs];W[sr];B[rn];W[kp]\r
+;B[cq];W[bp];B[sp];W[so];B[pb];W[sq];B[gp];W[cs];B[bk];W[cl]\r
+;B[gl];W[fl];B[ak];W[dr];B[er];W[dq];B[fo];W[gn];B[ao];W[hl]\r
+;B[in];W[ad];B[ej];W[ei];B[ac];W[ae];B[bb];W[mh];B[ce];W[bf]\r
+;B[eh];W[dh];B[li];W[mg];B[lg];W[mf];B[me];W[ne];B[qc];W[ee]\r
+;B[id];W[fd];B[fc];W[jq];B[jr];W[iq];B[ir];W[jo];B[io];W[rl]\r
+;B[gc];W[go];B[fp];W[qk];B[ip];W[jp];B[je];W[jf];B[kf];W[qm]\r
+;B[rm];W[pl];B[pm];W[ql];B[om];W[jd];B[ok];W[de];B[jn];W[ln]\r
+;B[qa];W[oq];B[ed];W[fe];B[nk];W[nj];B[jj];W[kd];B[kc];W[je]\r
+;B[ms];W[ns];B[ls];W[pd];B[lm];W[mn];B[nn];W[np];B[po];W[dd]\r
+;B[dc];W[ik];B[sl];W[sk];B[sm];W[ij];B[ho];W[jl];B[kl];W[no]\r
+;B[mm];W[kn];B[es];W[jm];B[gg];W[fh];B[ai];W[bj];B[hn];W[ek]\r
+;B[aj];W[bi];B[ah];W[bh];B[ff];W[ef];B[ge];W[fg];B[lk];W[im]\r
+;B[hm];W[jk];B[lj];W[ji];B[gf];W[kg];B[kh];W[jg];B[kj];W[qo]\r
+;B[hp];W[gm];B[gd];W[dp];B[mk];W[sn];B[pn];W[ds];B[jh];W[se]\r
+;B[ag];W[as];B[sa];W[hr];B[gr];W[ra];B[tt];W[sa];B[tt];W[tt]\r
+)\r
diff --git a/regression/games/cgf2005/19x19/shiko.sgf b/regression/games/cgf2005/19x19/shiko.sgf
new file mode 100644 (file)
index 0000000..c7dca1b
--- /dev/null
@@ -0,0 +1,32 @@
+(;\r
+GM[1]SZ[19]\r
+PB[GnuGo]\r
+PW[ShikoSakugo]\r
+DT[2005-04-09]\r
+RE[B+139.5]\r
+KM[6.5]TM[2400]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time Aya=2:29(RM=9),5:18]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[pd];W[dp];B[pp];W[dc];B[pj];W[nc];B[lc];W[qc];B[qd];W[pc]\r
+;B[od];W[nb];B[me];W[nq];B[lq];W[qq];B[qp];W[pq];B[op];W[nr]\r
+;B[mo];W[ce];B[cn];W[fq];B[bp];W[cq];B[ck];W[iq];B[ko];W[hc]\r
+;B[lf];W[en];B[ch];W[ek];B[ll];W[eh];B[jf];W[hf];B[ih];W[gh]\r
+;B[ij];W[in];B[jm];W[hi];B[ii];W[dj];B[cj];W[di];B[bg];W[gj]\r
+;B[ad];W[cc];B[df];W[be];B[bq];W[br];B[rc];W[rb];B[rd];W[lb]\r
+;B[kb];W[la];B[jb];W[ae];B[ga];W[hb];B[gb];W[ha];B[rq];W[rr]\r
+;B[rp];W[lr];B[kr];W[mr];B[jq];W[ir];B[im];W[hn];B[id];W[hd]\r
+;B[ar];W[cr];B[ie];W[he];B[sb];W[pb];B[oc];W[ra];B[ob];W[oa]\r
+;B[mc];W[mb];B[na];W[ma];B[nd];W[qa];B[sc];W[fc];B[sr];W[ks]\r
+;B[js];W[ls];B[jr];W[pr];B[oq];W[ns];B[is];W[rs];B[ip];W[hq]\r
+;B[hp];W[gp];B[or];W[os];B[gl];W[fl];B[gm];W[gn];B[hr];W[gq]\r
+;B[gr];W[fr];B[jo];W[dg];B[cf];W[gs];B[ef];W[hs];B[do];W[eo]\r
+;B[cp];W[dq];B[gk];W[fm];B[np];W[fg];B[mq];W[fe];B[ee];W[dl]\r
+;B[cl];W[dm];B[ed];W[cm];B[bm];W[ci];B[bi];W[ib];B[ec];W[eb]\r
+;B[ig];W[ja];B[ka];W[ia];B[ic];W[hg];B[eg];W[dh];B[cg];W[ho]\r
+;B[fk];W[fj];B[hj];W[hm];B[hl];W[io];B[jp];W[hh];B[jn];W[if]\r
+;B[fd];W[gd];B[ff];W[ge];B[dd];W[cd];B[qg];W[gf];B[bf];W[af]\r
+;B[ag];W[de];B[aj];W[dk];B[fb];W[gc];B[db];W[fa];B[cb];W[da]\r
+;B[bb];W[ac];B[ca];W[ea];B[bs];W[bc];B[ab];W[cs];B[aq];W[as]\r
+;B[ps];W[qs];B[bs];W[dn];B[co];W[as];B[fn];W[fo];B[bs];W[ss]\r
+;B[sq];W[as];B[fb];W[gb];B[bs];W[tt];B[as];W[tt];B[tt])\r
+\r
diff --git a/regression/games/cgf2005/9x9/aya1.sgf b/regression/games/cgf2005/9x9/aya1.sgf
new file mode 100644 (file)
index 0000000..38fc6fc
--- /dev/null
@@ -0,0 +1,15 @@
+(;\r
+GM[1]SZ[9]\r
+PB[GnuGo]\r
+PW[Aya]\r
+DT[2005-04-09]\r
+RE[W+57.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:53, Aya=13:34]\r
+;B[ee];W[ec];B[fd];W[gc];B[fc];W[fb];B[gd];W[hc];B[hd];W[gg]\r
+;B[eg];W[fh];B[eh];W[cd];B[cf];W[hf];B[hh];W[fi];B[hi];W[de]\r
+;B[ic];W[df];B[gb];W[dg];B[ef];W[db];B[hb];W[dh];B[ei];W[fg]\r
+;B[di];W[ed];B[ci];W[fe];B[ch];W[cg];B[bg];W[bf];B[ah];W[bi]\r
+;B[ff];W[ge];B[be];W[ce];B[af];W[bd];B[bh];W[ae];B[he];W[gf]\r
+;B[hg];W[ag];B[fa];W[if];B[af];W[eb];B[ai];W[ea];B[ig];W[ga]\r
+;B[gh];W[ag];B[ha];W[bi];B[ie];W[fa];B[tt];W[tt])\r
diff --git a/regression/games/cgf2005/9x9/aya2.sgf b/regression/games/cgf2005/9x9/aya2.sgf
new file mode 100644 (file)
index 0000000..5c7c8c4
--- /dev/null
@@ -0,0 +1,13 @@
+(;\r
+GM[1]SZ[9]\r
+PB[Aya]\r
+PW[GnuGo]\r
+DT[2005-04-09]\r
+RE[B+6.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:12, Aya=3:49]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[fg];W[ee];B[fe];W[fd];B[gd];W[fc];B[gc];W[dd];B[fb];W[eb]\r
+;B[ec];W[ed];B[cg];W[gb];B[hb];W[fa];B[ff];W[ce];B[bf];W[be]\r
+;B[ae];W[ad];B[af];W[bc];B[df];W[ha];B[ib];W[cf];B[bg];W[ef]\r
+;B[eg];W[ga];B[tt];W[ia];B[hc];W[de];B[dg];W[tt];B[tt])\r
diff --git a/regression/games/cgf2005/9x9/caren1.sgf b/regression/games/cgf2005/9x9/caren1.sgf
new file mode 100644 (file)
index 0000000..dea6564
--- /dev/null
@@ -0,0 +1,14 @@
+(;\r
+GM[1]SZ[9]\r
+PB[GnuGo]\r
+PW[Caren]\r
+DT[2005-04-09]\r
+RE[B+19.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:13, Caren=0:00]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[ee];W[gc];B[gd];W[fc];B[dc];W[hd];B[df];W[ge];B[gg];W[fd]\r
+;B[eb];W[hf];B[ha];W[ff];B[fg];W[eg];B[ef];W[dg];B[cg];W[hh]\r
+;B[fh];W[ib];B[ch];W[fb];B[fa];W[hg];B[hb];W[ic];B[gh];W[gi]\r
+;B[fi];W[hi];B[ed];W[ec];B[db];W[gf];B[eh];W[hc];B[ga];W[ia]\r
+;B[ea];W[fe];B[gb];W[tt];B[tt])\r
diff --git a/regression/games/cgf2005/9x9/caren2.sgf b/regression/games/cgf2005/9x9/caren2.sgf
new file mode 100644 (file)
index 0000000..ad7481d
--- /dev/null
@@ -0,0 +1,12 @@
+(;\r
+GM[1]SZ[9]\r
+PB[Caren]\r
+PW[GnuGo]\r
+DT[2005-04-09]\r
+RE[W+1.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:00, Caren=0:02]\r
+C[AMD Opteron(tm) Processor 248]\r
+;B[gd];W[dd];B[fe];W[df];B[ec];W[eg];B[dc];W[cd];B[fg];W[cc]\r
+;B[fh];W[eh];B[cb];W[bb];B[db];W[fi];B[gi];W[ei];B[gh];W[ba]\r
+;B[ca];W[ff];B[gf];W[ee];B[ed];W[ef];B[tt];W[tt])\r
diff --git a/regression/games/cgf2005/9x9/katsunari1.sgf b/regression/games/cgf2005/9x9/katsunari1.sgf
new file mode 100644 (file)
index 0000000..6f4447e
--- /dev/null
@@ -0,0 +1,14 @@
+(;\r
+GM[1]SZ[9]\r
+PB[Katsunari]\r
+PW[GnuGo]\r
+DT[2005-04-09]\r
+RE[W+22.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:10, Katsunari=0:27]\r
+;B[ed];W[cc];B[ce];W[eb];B[ge];W[gg];B[gb];W[dg];B[bd];W[bc]\r
+;B[ac];W[ab];B[ad];W[ba];B[ef];W[eg];B[ff];W[hg];B[fg];W[fh]\r
+;B[fd];W[bg];B[he];W[fb];B[gc];W[ga];B[ha];W[fa];B[ib];W[cd]\r
+;B[dc];W[be];B[db];W[da];B[bf];W[cf];B[de];W[ae];B[cb];W[ca]\r
+;B[df];W[cg];B[bb];W[ea];B[ec];W[ac];B[fc];W[aa];B[if];W[ig]\r
+;B[hf];W[dd];B[gf];W[tt];B[tt])\r
diff --git a/regression/games/cgf2005/9x9/katsunari2.sgf b/regression/games/cgf2005/9x9/katsunari2.sgf
new file mode 100644 (file)
index 0000000..1350192
--- /dev/null
@@ -0,0 +1,13 @@
+(;\r
+GM[1]SZ[9]\r
+PB[GnuGo]\r
+PW[Katsunari]\r
+DT[2005-04-09]\r
+RE[B+9.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:56, Katsunari=1:03]\r
+;B[fd];W[cf];B[cd];W[gg];B[ee];W[eg];B[ge];W[gc];B[fb];W[fc]\r
+;B[ec];W[cb];B[bc];W[dc];B[eb];W[gb];B[ga];W[dd];B[de];W[ha]\r
+;B[hc];W[hb];B[hd];W[db];B[ed];W[hf];B[be];W[bf];B[af];W[fa]\r
+;B[ea];W[ag];B[ae];W[bh];B[ff];W[bb];B[ce];W[fg];B[he];W[ie]\r
+;B[gf];W[hg];B[id];W[if];B[df];W[dg];B[ef];W[tt];B[tt])\r
diff --git a/regression/games/cgf2005/9x9/shiko1.sgf b/regression/games/cgf2005/9x9/shiko1.sgf
new file mode 100644 (file)
index 0000000..dbee83c
--- /dev/null
@@ -0,0 +1,12 @@
+(;\r
+GM[1]SZ[9]\r
+PB[ShikoSakugo]\r
+PW[GnuGo]\r
+DT[2005-04-09]\r
+RE[W+21.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:01, ShikoSakugo=0:00]\r
+;B[fd];W[df];B[cd];W[ff];B[bf];W[cg];B[ca];W[ge];B[cb];W[hc]\r
+;B[gb];W[bg];B[ce];W[hb];B[ha];W[gc];B[fb];W[fc];B[ec];W[ed]\r
+;B[ee];W[ef];B[dd];W[af];B[ae];W[ag];B[gd];W[hd];B[cf];W[ib]\r
+;B[ga];W[fe];B[ed];W[ia];B[eb];W[de];B[tt];W[tt])\r
diff --git a/regression/games/cgf2005/9x9/shiko2.sgf b/regression/games/cgf2005/9x9/shiko2.sgf
new file mode 100644 (file)
index 0000000..e375c09
--- /dev/null
@@ -0,0 +1,14 @@
+(;\r
+GM[1]SZ[9]\r
+PB[GnuGo]\r
+PW[Shiko]\r
+DT[2005-04-09]\r
+RE[B+29.5]\r
+KM[6.5]TM[1200]RU[Japanese]PC[Tokyo, Tyofu]EV[CGF Specail Meeting]AP[Aya 5.56]\r
+C[Time GnuGo=0:11, Shiko=0:00]\r
+;B[ge];W[dc];B[de];W[ce];B[cf];W[cd];B[df];W[fc];B[hc];W[fg]\r
+;B[fe];W[dh];B[hg];W[bh];B[bf];W[ef];B[ee];W[cg];B[ac];W[bd]\r
+;B[gb];W[fb];B[fa];W[ea];B[ga];W[eb];B[ad];W[bb];B[eg];W[ab]\r
+;B[eh];W[bg];B[ag];W[ah];B[ci];W[di];B[bi];W[ch];B[af];W[gc]\r
+;B[hb];W[ai];B[ed];W[bc];B[ae];W[gd];B[hd];W[ec];B[dd];W[be]\r
+;B[fd];W[tt];B[tt])\r
diff --git a/regression/games/cgos/13435.sgf b/regression/games/cgos/13435.sgf
new file mode 100644 (file)
index 0000000..a4f768e
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[gnugo_3.7.4]WR[1680*]
+PB[ControlBoy]BR[1524*]
+PC[9x9 Computer Go Server]DT[2006-03-10]GN[13435]
+RE[B+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[de];W[fe];B[eg];W[dd];B[ed];W[ee];B[df];W[ec];B[fd];W[gd];B[fc]
+;W[fb];B[gc];W[hc];B[gb];W[hb];B[ga];W[ha];B[ge];W[gf];B[hd];W[fa]
+;B[gd];W[he];B[id];W[ie];B[ff];W[ic];B[cd];W[cc];B[gg];W[ce];B[bd]
+;W[be];B[bc];W[cg];B[bb];W[dh];B[ef];W[hg];B[hh];W[fh];B[gh];W[ih]
+;B[eh];W[bh];B[cf];W[bf];B[cb];W[db];B[di];W[fi];B[fg];W[ci];B[ag]
+;W[ah];B[bg];W[af];B[bg];W[ag];B[dg];W[ei];B[dc];W[ed];B[gd];W[ge]
+;B[ca];W[ad];B[da];W[eb];B[ab];W[ea];B[ba];W[ac];B[ae]
+;C[white player error - KO attempted   move: A6])
diff --git a/regression/games/cgos/14198.sgf b/regression/games/cgos/14198.sgf
new file mode 100644 (file)
index 0000000..a424a46
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[ControlBoy]WR[1527*]
+PB[gnugo_3.7.4]BR[1686*]
+PC[9x9 Computer Go Server]DT[2006-03-10]GN[14198]
+RE[W+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[ee];W[fe];B[ed];W[ef];B[df];W[fd];B[ec];W[ff];B[dg];W[fc];B[fh]
+;W[eb];B[db];W[eg];B[eh];W[fb];B[da];W[dc];B[cc];W[de];B[dd];W[ce]
+;B[cf];W[dh];B[ch];W[gh];B[gg];W[fg];B[hg];W[fi];B[di];W[cd];B[dc]
+;W[bc];B[bb];W[ea];B[bd];W[hh];B[he];W[ig];B[if];W[be];B[ac];W[gf]
+;B[hf];W[hd];B[ih];W[hi];B[gd];W[gc];B[id];W[hc];B[ii];W[ig]
+;C[black player error - KO attempted   move: J2])
diff --git a/regression/games/cgos/25811.sgf b/regression/games/cgos/25811.sgf
new file mode 100644 (file)
index 0000000..69961ae
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[gnugo_3.7.4]WR[1698*]
+PB[antigoslow]BR[1340*]
+PC[9x9 Computer Go Server]DT[2006-03-21]GN[25811]
+RE[B+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[gg];W[dd];B[cc];W[cd];B[dc];W[ec];B[eb];W[fc];B[fb];W[gc];B[cg]
+;W[gb];B[bd];W[be];B[bc];W[cf];B[df];W[bg];B[ch];W[bh];B[de];W[ce]
+;B[ed];W[ee];B[fe];W[ef];B[dg];W[fd];B[eg];W[ff];B[gf];W[he];B[ge]
+;W[hd];B[hf];W[bi];B[fg];W[ed];B[db];W[fa];B[ea];W[ga];B[ae];W[af]
+;B[ad];W[bb];B[ci];W[ca];B[cb];W[aa];B[ie];W[da];B[ba]
+;C[white player error - KO attempted   move: C9])
diff --git a/regression/games/cgos/26449.sgf b/regression/games/cgos/26449.sgf
new file mode 100644 (file)
index 0000000..d400401
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[AnchorMan]WR[1500*]
+PB[gnugo_3.7.4]BR[1698*]
+PC[9x9 Computer Go Server]DT[2006-03-21]GN[26449]
+RE[W+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[fe];W[ee];B[ed];W[fd];B[dd];W[ge];B[ff];W[gf];B[ef];W[gg];B[gd]
+;W[fc];B[gc];W[df];B[de];W[ec];B[dc];W[fg];B[eg];W[fb];B[gb];W[eh]
+;B[dg];W[db];B[cb];W[fa];B[dh];W[hd];B[hc];W[ga];B[he];W[ic];B[id]
+;W[hb];B[ib];W[ha];B[hf];W[hg];B[fh];W[gh];B[ei];W[ea];B[ca];W[gi]
+;B[fi];W[da];B[ia];W[ic]
+;C[black player error - KO attempted   move: J8])
diff --git a/regression/games/cgos/30527.sgf b/regression/games/cgos/30527.sgf
new file mode 100644 (file)
index 0000000..ea60505
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[SimpleBot-0.2.8]WR[1105*]
+PB[twinbot]BR[1687*]
+PC[9x9 Computer Go Server]DT[2006-03-23]GN[30527]
+RE[W+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[ge];W[fe];B[gf];W[he];B[hd];W[hc];B[gc];W[hf];B[hg];W[id];B[gd]
+;W[hb];B[gb];W[ie];B[de];W[gg];B[fg];W[gh];B[hh];W[fh];B[eg];W[eh]
+;B[dh];W[hi];B[ic];W[ib];B[gi];W[fi];B[ig];W[ff];B[ih];W[dg];B[ef]
+;W[ee];B[df];W[ed];B[cg];W[ic];B[ha];W[ga];B[fc];W[ec];B[eb];W[fd]
+;B[fa];W[dc];B[cc];W[db];B[cb];W[bb];B[dd];W[bc];B[bd];W[da];B[ca]
+;W[ba];B[ea];W[ad];B[be];W[bg];B[bf];W[bh];B[ch];W[ah];B[ci];W[af]
+;B[bi];W[ae];B[ai];W[ab];B[ei];W[di];B[ia];W[ga]
+;C[black player error - KO attempted   move: H9])
diff --git a/regression/games/cgos/31446.sgf b/regression/games/cgos/31446.sgf
new file mode 100644 (file)
index 0000000..9f35f22
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[gnugo_3.7.4]WR[1673*]
+PB[AnchorMan]BR[1500*]
+PC[9x9 Computer Go Server]DT[2006-03-23]GN[31446]
+RE[B+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[de];W[ee];B[ed];W[gc];B[fe];W[ef];B[ff];W[df];B[fd];W[dd];B[ce]
+;W[cf];B[cd];W[eb];B[dc];W[eh];B[fg];W[he];B[fh];W[eg];B[bf];W[bg]
+;B[ei];W[be];B[bd];W[af];B[dh];W[ah];B[cg];W[ch];B[hc];W[gb];B[hd]
+;W[gd];B[hb];W[ge];B[db];W[id];B[di];W[dg];B[ga];W[ea];B[fb];W[fc]
+;B[ec];W[fa];B[ha];W[da];B[ca];W[fb];B[hf];W[cb];B[gf];W[ie];B[ic]
+;W[ba];B[if];W[ca];B[bb];W[bc];B[cc];W[ab];B[ad];W[ac];B[bi];W[ci]
+;B[ae];W[fi];B[bf];W[hi];B[ag];W[gh];B[bh];W[af];B[di];W[ag];B[ei]
+;W[dh];B[ei];W[di];B[hh];W[ih];B[hg];W[be];B[gg];W[gi];B[bf];W[ig]
+;B[ii];C[white player error - KO attempted   move: J2])
diff --git a/regression/games/cgos/37169.sgf b/regression/games/cgos/37169.sgf
new file mode 100644 (file)
index 0000000..4443bbe
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[gnugo_3.7.4]WR[1669*]
+PB[AnchorMan]BR[1500*]
+PC[9x9 Computer Go Server]DT[2006-03-26]GN[37169]
+RE[B+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[ee];W[cg];B[de];W[fg];B[fe];W[gf];B[ce];W[cc];B[ge];W[ec];B[hf]
+;W[hg];B[be];W[gc];B[he];W[bc];B[eh];W[eg];B[dg];W[dh];B[ch];W[df]
+;B[bg];W[bh];B[fh];W[gh];B[eb];W[fb];B[dc];W[dd];B[db];W[ed];B[cb]
+;W[bb];B[cd];W[hc];B[fa];W[ca];B[ea];W[ga];B[ci];W[di];B[ah];W[bi]
+;B[fd];W[fc];B[hb];W[gb];B[ib];W[hd];B[id];W[ic];B[ha];W[da];B[bf]
+;W[ie];B[if];W[bd];B[ih];W[ig];B[hi];W[gi];B[db];W[cb];B[ef];W[ff]
+;B[fi];W[ei];B[fh];W[fi];B[eb];W[ea];B[cf];W[ae];B[dg];W[ch];B[af]
+;W[ai];B[ad];W[gd];B[ae];W[df];B[ab];W[ac];B[dg];W[ag];B[id];W[df]
+;B[ah];C[white player error - KO attempted   move: J5])
diff --git a/regression/games/cgos/390115.sgf b/regression/games/cgos/390115.sgf
new file mode 100644 (file)
index 0000000..67ffac8
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[MonteGNU]WR[1660?]
+PB[AnchorMan]BR[1500*]
+PC[9x9 Computer Go Server]DT[2006-12-10]GN[390115]
+RE[B+5.5]
+TM[600]RU[TT--]
+CA[UTF-8]
+;B[ee];W[df];B[de];W[ef];B[fe];W[gc];B[ff];W[ce];B[cd];W[fg];B[cf]
+;W[cg];B[be];W[gf];B[ge];W[he];B[hd];W[hc];B[gg];W[hf];B[gd];W[gh]
+;B[id];W[dg];B[bg];W[db];B[eb];W[dc];B[hg];W[hh];B[ec];W[bh];B[ed]
+;W[ag];B[bf];W[ah];B[bc];W[ig];B[fb];W[af];B[ae];W[ie];B[bb];W[ch]
+;B[di];W[gg];B[eh];W[eg];B[gb];W[dh];B[ad];W[ci];B[dd];W[fh];B[cc]
+;W[fi];B[cb];W[ei];B[da];W[];B[fc];W[];B[ic];W[];B[hb];W[];B[ab];W[]
+;B[ba];W[];B[fa];W[];B[ia];W[];B[dc];W[];B[gc];W[];B[ha];W[];B[ii]
+;W[hi];B[ai];W[bi];B[];W[ih];B[];W[])
diff --git a/regression/games/cgos/403788.sgf b/regression/games/cgos/403788.sgf
new file mode 100644 (file)
index 0000000..2e27f24
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[Chinese]SZ[9]KM[7.5]TM[300]
+PW[MonteGNU]PB[mgtest9]WR[2042]BR[2100]DT[2008-04-21]PC[(CGOS) 9x9 Computer Go Server]RE[W+24.5]GN[403788]
+;B[ee]BL[300];W[cc]WL[300];B[fc]BL[299];W[fg]WL[299];B[dg]BL[299];W[ge]WL[299];B[ce]BL[299];W[gc]WL[299]
+;B[fd]BL[299];W[gd]WL[290];B[gf]BL[290];W[ff]WL[281];B[eh]BL[281];W[fe]WL[272];B[eb]BL[272];W[df]WL[264]
+;B[cf]BL[263];W[ef]WL[256];B[de]BL[253];W[fh]WL[248];B[ch]BL[245];W[gb]WL[240];B[fb]BL[238];W[bd]WL[233]
+;B[be]BL[231];W[ei]WL[226];B[di]BL[224];W[fi]WL[219];B[eg]BL[217];W[db]WL[213];B[bb]BL[211];W[ab]WL[206]
+;B[cb]BL[204];W[dc]WL[199];B[bc]BL[197];W[ad]WL[193];B[ba]BL[191];W[da]WL[187];B[ed]BL[184];W[cd]WL[181]
+;B[bg]BL[179];W[ac]WL[176];B[fa]BL[173];W[ci]WL[171];B[bi]BL[168];W[gg]WL[166];B[hf]BL[163];W[hg]WL[161]
+;B[ig]BL[159];W[hh]WL[156];B[ga]BL[154];W[hc]WL[152];B[ae]BL[151];W[ha]WL[149];B[bh]BL[151];W[id]WL[149]
+;B[af]BL[151];W[ii]WL[149];B[ea]BL[151];W[ih]WL[149];B[ec]BL[151];W[ib]WL[149];B[dd]BL[151];W[he]WL[149]
+;B[aa]BL[151];W[ca]WL[149];B[]BL[151];W[ba]WL[149];B[]BL[151];W[if]WL[149];B[]BL[151];W[]WL[149]
+)
+
diff --git a/regression/games/cgos/42896.sgf b/regression/games/cgos/42896.sgf
new file mode 100644 (file)
index 0000000..79e00b3
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[AnchorMan]WR[1500*]
+PB[gnugo-CVS]BR[1730*]
+PC[9x9 Computer Go Server]DT[2006-03-29]GN[42896]
+RE[W+12.5]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[fe];W[ee];B[fd];W[ff];B[ed];W[gf];B[cd];W[de];B[dd];W[ce];B[cg]
+;W[be];B[bg];W[ef];B[eh];W[bd];B[bc];W[hf];B[hd];W[cc];B[bb];W[gd]
+;B[gc];W[ge];B[hc];W[fc];B[ec];W[fb];B[db];W[cb];B[ca];W[dh];B[fh]
+;W[dg];B[hh];W[gh];B[gg];W[hg];B[he];W[gi];B[ie];W[ch];B[ad];W[ae]
+;B[ac];W[fg];B[if];W[ig];B[eb];W[hb];B[gb];W[ib];B[ba];W[ha];B[fa]
+;W[bh];B[fb];W[eg];B[da];W[ih];B[ic];W[hi];B[ga];W[fi];B[dc];W[ei]
+;B[ia];W[bf];B[ha];W[cf];B[];W[ag];B[];W[ci];B[];W[ai];B[];W[eh];B[]
+;W[cg];B[];W[cc];B[cb];W[hb];B[ib];W[ab];B[aa];W[];B[])
diff --git a/regression/games/cgos/471085.sgf b/regression/games/cgos/471085.sgf
new file mode 100644 (file)
index 0000000..7308d5e
--- /dev/null
@@ -0,0 +1,78 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[TT--]SZ[9]KM[7.5]TM[600]
+PW[MonteGNU]PB[AyaBot]WR[1881*]BR[1805*]DT[2007-02-10]PC[9x9 Computer Go Server]RE[W+0.5]GN[471085]
+;B[ff]
+;W[gd]
+;B[cc]
+;W[gf]
+;B[ge]
+;W[fe]
+;B[he]
+;W[ef]
+;B[fg]
+;W[ed]
+;B[de]
+;W[ee]
+;B[gg]
+;W[dd]
+;B[cd]
+;W[df]
+;B[db]
+;W[eh]
+;B[fc]
+;W[hd]
+;B[hf]
+;W[fd]
+;B[eg]
+;W[dg]
+;B[be]
+;W[bf]
+;B[cf]
+;W[ce]
+;B[cg]
+;W[bg]
+;B[ch]
+;W[dh]
+;B[bh]
+;W[bd]
+;B[de]
+;W[hh]
+;B[ce]
+;W[gh]
+;B[hb]
+;W[hg]
+;B[ec]
+;W[hc]
+;B[ib]
+;W[ic]
+;B[gc]
+;W[di]
+;B[dc]
+;W[bi]
+;B[ci]
+;W[if]
+;B[ai]
+;W[ig]
+;B[ga]
+;W[fi]
+;B[bc]
+;W[fh]
+;B[ca]
+;W[gf]
+;B[ad]
+;W[ff]
+;B[ea]
+;W[ie]
+;B[ab]
+;W[]
+;B[ba]
+;W[]
+;B[fb]
+;W[]
+;B[af]
+;W[]
+;B[ag]
+;W[]
+;B[]
+)
+
diff --git a/regression/games/cgos/58273.sgf b/regression/games/cgos/58273.sgf
new file mode 100644 (file)
index 0000000..7fd07e8
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[ControlBoy]WR[1580*]
+PB[gnugo_3.7.4]BR[1757*]
+PC[9x9 Computer Go Server]DT[2006-04-06]GN[58273]
+RE[W+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[ee];W[df];B[ef];W[ed];B[eg];W[de];B[dg];W[fd];B[cf];W[dd];B[gf]
+;W[gd];B[bd];W[ce];B[be];W[cc];B[he];W[bf];B[cg];W[bc];B[hc];W[hd]
+;B[id];W[bg];B[bh];W[ge];B[hf];W[ad];B[ae];W[gc];B[hb];W[gb];B[ha]
+;W[ag];B[ah];W[ff];B[eb];W[fg];B[fe];W[hg];B[gg];W[fh];B[ga];W[gh]
+;B[hh];W[if];B[ig];W[ch];B[dh];W[di];B[ci];W[fa];B[fb];W[ic];B[ie]
+;W[eh];B[ei];W[ac];B[db];W[ib];B[ea];W[cb];B[ca];W[ba];B[ab];W[cd]
+;B[af];W[da];C[black player error - KO attempted   move: C9])
diff --git a/regression/games/cgos/60311.sgf b/regression/games/cgos/60311.sgf
new file mode 100644 (file)
index 0000000..1b8757d
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[wmarkhamMC]WR[1362*]
+PB[gnugo_3.7.4]BR[1769*]
+PC[9x9 Computer Go Server]DT[2006-04-07]GN[60311]
+RE[W+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[gc];W[de];B[dc];W[fe];B[cg];W[ee];B[ce];W[ge];B[fg];W[dd];B[cc]
+;W[cd];B[ec];W[bd];B[be];W[bc];B[hf];W[he];B[gf];W[bb];B[cb];W[fc]
+;B[fb];W[fd];B[df];W[eb];B[gb];W[ef];B[eg];W[cf];B[bf];W[ie];B[ba]
+;W[ca];B[da];W[ea];B[db];W[fa];B[ib];W[ga];B[ad];W[ha];B[hb];W[if]
+;B[hh];W[hd];B[ig];W[ed];B[ia];W[ea];B[gd];W[eb];B[fa];W[eb];B[ea]
+;W[dg];B[dh];W[bg];B[af];W[bh];B[ch];W[bi];B[ci];W[ah]
+;C[black player error - suicide attempted   move: A1])
diff --git a/regression/games/cgos/879.sgf b/regression/games/cgos/879.sgf
new file mode 100644 (file)
index 0000000..4f2b254
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[twinbot]WR[11.6k]
+PB[AnchorMan]BR[13.0k]
+PC[9x9 Computer Go Server]DT[2006-02-26]GN[879]
+RE[B+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[df];W[ed];B[ef];W[cd];B[dd];W[dc];B[fe];W[gc];B[gd];W[hc];B[fd]
+;W[fc];B[cf];W[if];B[hd];W[id];B[ee];W[de];B[eb];W[ec];B[be];W[bd]
+;B[he];W[ie];B[hg];W[ce];B[hf];W[bf];B[ad];W[bg];B[ae];W[dh];B[ac]
+;W[cg];B[bc];W[cc];B[bh];W[ig];B[ch];W[dg];B[bb];W[fg];B[hh];W[hi]
+;B[eg];W[eh];B[fh];W[gh];B[fi];W[gi];B[gg];W[ei];B[ih];W[ic];B[fh]
+;W[fi];B[af];W[ag];B[ah];W[ff];B[gf];W[cb];B[fh];W[fg];B[ba];W[ca]
+;B[ci];W[ff];B[fh]
+;C[white player error - simple KO attempted   move: F3])
diff --git a/regression/games/cgos/994.sgf b/regression/games/cgos/994.sgf
new file mode 100644 (file)
index 0000000..04c5d95
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.5]
+PW[gnugo_3.7.4]WR[12.2k]
+PB[ReadyToGo]BR[16.1k]
+PC[9x9 Computer Go Server]DT[2006-02-27]GN[994]
+RE[B+Illegal]
+TM[600]RU[Tromp/Taylor]
+CA[UTF-8]
+;B[ce];W[ee];B[cd];W[fc];B[gf];W[eg];B[gd];W[cb];B[ef];W[df];B[ec]
+;W[ff];B[fd];W[gg];B[ed];W[bc];B[gh];W[hg];B[dd];W[bd];B[cf];W[gc]
+;B[eb];W[ge];B[he];W[hf];B[hd];W[ch];B[bg];W[bh];B[cg];W[hc];B[dh]
+;W[eh];B[dg];W[di];B[ba];W[be];B[fe];W[bb];B[ah];W[hh];B[ca];W[da]
+;B[db];W[aa];B[af];W[ca];B[hi];W[bi];B[gf];W[cc];B[fh];W[fb];B[fg]
+;W[ef];B[if];W[fi];B[ig];W[gi];B[ih];W[ea];B[fh];W[bf];B[ie];W[ii]
+;B[ag];W[ge];B[ic];W[ei];B[ga];W[ib];B[fa];W[ha];B[hi];W[id];B[gf]
+;W[ii];B[ic];C[white player error - simple KO attempted   move: G5])
diff --git a/regression/games/connection1.sgf b/regression/games/connection1.sgf
new file mode 100644 (file)
index 0000000..ae6b5d5
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-31]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ec][gc][jc][lc][re][bf][cf][rf][qg][sg][ch][qh][ck][qk][ql][qm][rm][sm]
+AB[gd][qd][rd][sd][ce][de][ge][ie][pe][qe][df][pf][pg][eh][ph][ei][pi][ej][pj][ek][pk][pl][bm][dm][pm][pn][qn][rn][sn]
+)
diff --git a/regression/games/connection2.sgf b/regression/games/connection2.sgf
new file mode 100644 (file)
index 0000000..47251e6
--- /dev/null
@@ -0,0 +1,36 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 979626380]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pd];W[cp];B[pp];W[dc];B[ep];W[dn];B[cq];W[de];B[jc];W[qf]
+;B[nd];W[bq];B[cl];W[rd];B[qc];W[qi];B[og];W[qn];B[ql];W[qq]
+;B[pn];W[po];B[qo];W[oo];B[rn];W[qp];B[cg];W[ro];B[eg];W[dk]
+;B[dq];W[rk];B[br];W[bp];B[ck];W[em];B[pm];W[je];B[gc];W[le]
+;B[nm];W[jq];B[rm];W[gq];B[ok];W[er];B[dr];W[eq];B[dp];W[cs]
+;B[ds];W[lm];B[rl];W[qk];B[oi];W[kh];B[oh];W[dj];B[cj];W[pq]
+;B[rc];W[qd];B[lc];W[di];B[ci];W[op];B[mn];W[cf];B[df];W[bf]
+;B[ee];W[cm];B[ce];W[dd];B[be];W[dl];B[cc];W[cb];B[cd];W[bc]
+;B[ae];W[pe];B[eb];W[db];B[da];W[ne];B[pc];W[fd];B[ed];W[ec]
+;B[mg];W[fc];B[fb];W[gd];B[hc];W[ca];B[sd];W[ab];B[se];W[rg]
+;B[gg];W[re];B[sk];W[sj];B[sl];W[rj];B[mi];W[gi];B[mk];W[sf]
+;B[sc];W[lk];B[kf];W[ke];B[ig];W[he];B[gh];W[ml];B[jg];W[ji]
+;B[ie];W[lf];B[es];W[lg];B[fr];W[fq];B[gr];W[if];B[id];W[hf]
+;B[hg];W[jf];B[kg];W[lh];B[ii];W[ij];B[bm];W[bn];B[bl];W[hq]
+;B[hi];W[hj];B[gj];W[fi];B[jj];W[kj];B[gk];W[jk];B[fn];W[fo]
+;B[en];W[eo];B[gn];W[do];B[gl];W[go];B[im];W[hr];B[nk];W[gs]
+;B[pk];W[fs];B[lj];W[mp];B[ln];W[fj];B[lp];W[lq];B[jn];W[io]
+;B[km];W[kl];B[kp];W[kq];B[li];W[il];B[mm];W[hm];B[ll];W[gm]
+;B[kk];W[jl];B[lk];W[jo];B[ko];W[fk];B[in];W[hn];B[ki];W[jh]
+;B[fe];W[fp];B[jj];W[fl];B[kj];W[ar];B[md];W[nf];B[ng];W[pj]
+;B[jm];W[hk];B[ih];W[fh];B[fg];W[on];B[mo];W[np];B[jp];W[ip]
+;B[om];W[oj];B[nj];W[am];B[pi];W[qj];B[qh];W[rh];B[al];W[an]
+;B[pg];W[sn];B[qg];W[mh];B[gf];W[nh];B[ni];W[pf];B[sm];W[so]
+;B[eh];W[dh];B[dg];W[ei];B[ch];W[of];B[od];W[ge];B[kd];W[oe]
+;B[jd];W[hd];B[ld];W[mf];B[me];W[nn];B[no];W[bd];B[af];W[ad]
+;B[bg];W[ea];B[gb];W[fa];B[ga];W[da];B[qm];W[qo];B[tt];W[tt]
+)
diff --git a/regression/games/connection3.sgf b/regression/games/connection3.sgf
new file mode 100644 (file)
index 0000000..9261d3c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-20]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];;
+AW[ba][da][ha][la][ab][bb][cb][db][kb][lb][mb][bc][lc][ld][md][ae][mg][ah][bh][bi][aj][bj][bk][lk][al][bl][jl][kl][ll][ml][gm][jm][lm]
+AB[ea][eb][cc][dc][ec][fc][gc][hc][ic][jc][kc][cd][kd][ce][ke][le][me][cf][kf][ag][bg][cg][kg][ch][kh][ci][ki][cj][kj][ck][dk][ek][fk][gk][hk][ik][jk][kk][il][im]
+)
diff --git a/regression/games/connection4.sgf b/regression/games/connection4.sgf
new file mode 100644 (file)
index 0000000..9eac2de
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-20]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];;
+AW[ba][da][ha][la][ab][bb][cb][db][kb][lb][mb][bc][lc][ld][md][af][mg][dh][eh][ci][ei][aj][bj][cj][dj][ej][bk][lk][al][bl][jl][kl][ll][ml][dm][gm][jm][lm]
+AB[ea][ja][eb][cc][dc][ec][fc][gc][hc][ic][jc][kc][cd][kd][ae][ce][ke][le][me][cf][kf][cg][dg][eg][fg][kg][bh][ch][fh][kh][mh][ai][bi][fi][ki][fj][kj][ck][dk][ek][fk][gk][hk][ik][jk][kk][il][im]
+)
diff --git a/regression/games/disaster.sgf b/regression/games/disaster.sgf
new file mode 100644 (file)
index 0000000..34fe5d8
--- /dev/null
@@ -0,0 +1,280 @@
+(;GM[1]FF[4]AP[glGo:0.0.6]ST[1]
+SZ[19]HA[9]KM[6.5]
+PW[White]PB[GNU Go]
+AB[jj][jd][jp][dj][pj][pp][dd][pd][dp]
+;W[gc]
+;B[ge]
+;W[cg]
+;B[ee]
+;W[cm]
+;B[em]
+;W[gq]
+;B[eg]
+;W[mq]
+;B[mo]
+;W[qm]
+;B[go]
+;W[qg]
+;B[og]
+;W[mc]
+;B[om]
+;W[jr]
+;B[lr]
+;W[lq]
+;B[hr]
+;W[hq]
+;B[me]
+;W[rj]
+;B[rh]
+;W[qh]
+;B[rl]
+;W[ql]
+;B[rg]
+;W[qf]
+;B[ri]
+;W[qi]
+;B[qj]
+;W[rk]
+;B[gr]
+;W[fq]
+;B[dr]
+;W[er]
+;B[ir]
+;W[iq]
+;B[jq]
+;W[kr]
+;B[eq]
+;W[ep]
+;B[dq]
+;W[fr]
+;B[qe]
+;W[rf]
+;B[re]
+;W[se]
+;B[sd]
+;W[sf]
+;B[rc]
+;W[jb]
+;B[hb]
+;W[hc]
+;B[lb]
+;W[lc]
+;B[gb]
+;W[fc]
+;B[fb]
+;W[ec]
+;B[kb]
+;W[ic]
+;B[db]
+;W[dc]
+;B[cc]
+;W[eb]
+;B[cb]
+;W[fa]
+;B[kc]
+;W[jc]
+;B[ja]
+;W[ia]
+;B[ga]
+;W[ea]
+;B[ld]
+;W[ka]
+;B[ie]
+;W[cd]
+;B[bd]
+;W[ce]
+;B[bf]
+;W[de]
+;B[ed]
+;W[dg]
+;B[be]
+;W[ef]
+;B[gd]
+;W[bg]
+;B[fg]
+;W[cj]
+;B[ci]
+;W[bj]
+;B[di]
+;W[bi]
+;B[eo]
+;W[fp]
+;B[co]
+;W[fo]
+;B[fn]
+;W[ho]
+;B[hn]
+;W[io]
+;B[jl]
+;W[jn]
+;B[kq]
+;W[mr]
+;B[ko]
+;W[km]
+;B[ml]
+;W[ll]
+;B[lj]
+;W[mm]
+;B[lp]
+;W[nl]
+;B[nj]
+;W[mk]
+;B[mj]
+;W[oh]
+;B[nh]
+;W[oi]
+;B[ff]
+;W[of]
+;B[bn]
+;W[bm]
+;B[nf]
+;W[oe]
+;B[pg]
+;W[pf]
+;B[np]
+;W[oq]
+;B[op]
+;W[pr]
+;B[ln]
+;W[md]
+;B[nb]
+;W[od]
+;B[ni]
+;W[oc]
+;B[pb]
+;W[ob]
+;B[pc]
+;W[pa]
+;B[mb]
+;W[qa]
+;B[qb]
+;W[ra]
+;B[qd]
+;W[qq]
+;B[ol]
+;W[oj]
+;B[mn]
+;W[qp]
+;B[dk]
+;W[dn]
+;B[cn]
+;W[dm]
+;B[do]
+;W[en]
+;B[el]
+;W[im]
+;B[gl]
+;W[hl]
+;B[hk]
+;W[fm]
+;B[gn]
+;W[gk]
+;B[ah]
+;W[bh]
+;B[ag]
+;W[ai]
+;B[df]
+;W[cf]
+;B[am]
+;W[al]
+;B[gm]
+;W[ik]
+;B[hj]
+;W[il]
+;B[ij]
+;W[an]
+;B[ao]
+;W[ck]
+;B[pk]
+;W[bk]
+;B[pn]
+;W[qn]
+;B[es]
+;W[fs]
+;B[ds]
+;W[dl]
+;B[jk]
+;W[af]
+;B[ab]
+;W[ae]
+;B[ad]
+;W[kn]
+;B[in]
+;W[jo]
+;B[oo]
+;W[jm]
+;B[ok]
+;W[nk]
+;B[nn]
+;W[mp]
+;B[kp]
+;W[nm]
+;B[pm]
+;W[he]
+;B[ag]
+;W[hd]
+;B[ef]
+;W[hf]
+;B[le]
+;W[ig]
+;B[qk]
+;W[rm]
+;B[rb]
+;W[sb]
+;B[pq]
+;W[nq]
+;B[ip]
+;W[hp]
+;B[lo]
+;W[lm]
+;B[na]
+;W[oa]
+;B[dh]
+;W[kg]
+;B[am]
+;W[gg]
+;B[qo]
+;W[ro]
+;B[po]
+;W[gh]
+;B[jf]
+;W[ek]
+;B[fl]
+;W[fi]
+;B[fj]
+;W[gj]
+;B[fk]
+;W[gi]
+;B[eh]
+;W[jg]
+;B[ke]
+;W[if]
+;B[lh]
+;W[lg]
+;B[la]
+;W[mg]
+;B[ei]
+;W[ng]
+;B[pi]
+;W[ph]
+;B[fd]
+;W[ls]
+;B[da]
+;W[sl]
+;B[an]
+;W[ah]
+;B[af]
+;W[ja]
+;B[sc]
+;W[sa]
+;B[gf]
+;W[is]
+;B[gp]
+;W[hs]
+;B[ch]
+;W[fh]
+;B[pe]
+;W[pl]
+;B[hm]
+;W[hg]
+;B[tt])
diff --git a/regression/games/dniwog.sgf b/regression/games/dniwog.sgf
new file mode 100644 (file)
index 0000000..65017ad
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[3]SZ[19]PB[dniwog]PW[GnuGo]KM[0.5]
+US[bump@match.Stanford.EDU]
+PC[NNGS]DT[2001/02/01 19:53:20 UT]BR[16k]WR[15k]RE[W+Resign]
+;B[qd];W[pp];B[dc];W[dp];B[jc];W[ce];B[cg];W[ee];B[fd];W[dg]
+;B[dh];W[eg];B[cf];W[oc];B[mc];W[oe];B[pf];W[md];B[ld];W[me]
+;B[nc];W[jp];B[ci];W[fq];B[bp];W[nq];B[rp];W[ro];B[df];W[qo]
+;B[nd];W[de];B[bc];W[ef];B[od];W[gg];B[ne];W[fi];B[mf];W[cq]
+;B[bq];W[bo];B[co];W[bn];B[cp];W[cr];B[br];W[cm];B[dk];W[em]
+;B[fl];W[fm];B[eh];W[hi];B[qq];W[pq];B[qj];W[qr];B[fo];W[gn]
+;B[dn];W[ql];B[oj];W[bk];B[dm];W[bi];B[en];W[el];B[dl];W[ek]
+;B[cj];W[bj];B[gr];W[gq];B[hq];W[bh];B[ch];W[be];B[gp];W[hp]
+;B[hr];W[fr];B[iq];W[ip];B[dr];W[jq];B[dq];W[rk];B[rj];W[le]
+;B[bg];W[lf];B[eq];W[gs];B[cl];W[hn];B[fh];W[gf];B[fg];W[ge]
+;B[ff];W[bl];B[cn];W[bm];B[fe];W[hj];B[ng];W[lc];B[kd];W[ol]
+;B[ie];W[gd];B[gc];W[lg];B[hd];W[ig];B[hl];W[if];B[ej];W[fk]
+;B[fj];W[hk];B[gl];W[gk];B[jl];W[nk];B[lj];W[nj];B[ji];W[il]
+;B[pk];W[jn];B[mi];W[ni];B[mh];W[lm];B[pl];W[pm];B[om];W[on]
+;B[nm];W[ml];B[qm];W[pn];B[pi];W[rl];B[hm];W[jk];B[kk];W[mg]
+;B[of];W[nh];B[kl];W[im];B[oh];W[gh];B[nf];W[nl];B[mk];W[he]
+;B[lh];W[kg];B[jf];W[jg];B[ki];W[jj];B[ll];W[id];B[ic];W[hc]
+;B[ke];W[hb];B[je];W[fc];B[ed];W[eb];B[db];W[fb];B[ib];W[da]
+;B[lp];W[lo];B[kp];W[lr];B[kq];W[ca];B[ko];W[kr];B[jo];W[cb]
+;B[cc];W[sp];B[io];W[ho];B[mp];W[mo];B[np];W[er];B[jr];W[ep]
+;B[cs];W[fp];B[go];W[is];B[ir];W[hs];B[op];W[ap];B[oq];W[kn]
+;B[rq];W[sq];B[po];W[pr]
+C[----------       Black resigns.]
+)
diff --git a/regression/games/doublecut.sgf b/regression/games/doublecut.sgf
new file mode 100644 (file)
index 0000000..3730dbb
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 2.7.246 (level 10) load and print]PB[Unknown]HA[3]KM[0.5]GN[GNU Go 2.7.246 load and print Random Seed 995645728] 
+AW[cb][db][eb][dc][bd][cd][dd][ed][hd][ld][be][de][fe][me][se][gf][lf][qf][rf][sf][fg][hg][jg][kg][mg][pg][qg][rg][eh][hh][ih][nh][rh][fi][li][ni][oi][qi][fj][hj][ij][jj][oj][qj][rj][ek][fk][gk][ik][kk][nk][qk][fl][kl][ml][ol][jm][mm][nm][pm][bn][cn][gn][in][ln][on][pn][qn][bo][fo][go][io][jo][qo][ro][bp][cp][gp][hp][op][pp][cq][dq][hq][iq][kq][oq][qq][rq][fr][mr][nr][sr]
+AB[ba][bb][fb][gb][hb][lb][nb][qb][rb][ac][bc][cc][ec][fc][hc][jc][lc][mc][oc][qc][sc][ad][fd][gd][jd][kd][nd][pd][qd][sd][ae][ce][ge][he][ie][oe][qe][re][bf][df][hf][nf][pf][cg][dg][ig][ng][og][sg][dh][mh][oh][ph][qh][di][cj][ej][bk][dk][hk][jk][ok][pk][rk][cl][dl][gl][il][jl][pl][ql][rl][sl][bm][cm][em][fm][gm][hm][im][qm][sm][dn][hn][nn][rn][sn][co][do][ho][no][oo][dp][ep][fp][ip][lp][np][nq][pq][or][pr][qr][rr]
+PL[B]
+IL[nl][om]
+)
diff --git a/regression/games/doublecut2.sgf b/regression/games/doublecut2.sgf
new file mode 100644 (file)
index 0000000..9afeecf
--- /dev/null
@@ -0,0 +1,267 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 2.7.246 (level 10) gmp]PB[Unknown]HA[3]KM[0.5]GN[GNU Go 2.7.246 gmp Random Seed 0] 
+AB[dd]AB[pd]AB[dp]
+;W[pp]
+;B[nq]
+;W[lq]
+;B[qq]
+;W[pq]
+;B[qp]
+;W[po]
+;B[pr]
+;W[or]
+;B[qr]
+;W[nr]
+;B[oq]
+;W[mq]
+;B[jc]
+;W[qo]
+;B[cj]
+;W[ro]
+;B[jq]
+;W[pf]
+;B[nd]
+;W[pj]
+;B[qf]
+;W[qg]
+;B[qe]
+;W[pg]
+;B[nj]
+;W[ol]
+;B[np]
+;W[cf]
+;B[nn]
+;W[fd]
+;B[os]
+;W[mr]
+;B[ee]
+;W[cc]
+;B[cd]
+;W[dc]
+;B[bc]
+;W[ec]
+;B[ps]
+;W[sq]
+;B[dm]
+;W[bb]
+;B[bd]
+;W[fp]
+;B[gq]
+;W[cq]
+;B[cp]
+;W[dq]
+;B[fq]
+;W[er]
+;B[ep]
+;W[bp]
+;B[fo]
+;W[dg]
+;B[bo]
+;W[ff]
+;B[bq]
+;W[br]
+;B[ap]
+;W[ar]
+;B[gp]
+;W[fh]
+;B[fe]
+;W[ge]
+;B[fj]
+;W[hc]
+;B[gf]
+;W[gg]
+;B[hf]
+;W[gi]
+;B[nh]
+;W[ii]
+;B[ki]
+;W[jj]
+;B[nl]
+;W[hk]
+;B[bf]
+;W[bg]
+;B[be]
+;W[jh]
+;B[hb]
+;W[jl]
+;B[gb]
+;W[hd]
+;B[jf]
+;W[ab]
+;B[jo]
+;W[fb]
+;B[lo]
+;W[om]
+;B[kr]
+;W[kg]
+;B[ld]
+;W[in]
+;B[nm]
+;W[lm]
+;B[mg]
+;W[fl]
+;B[ek]
+;W[gn]
+;B[kf]
+;W[lk]
+;B[mi]
+;W[ib]
+;B[ic]
+;W[gc]
+;B[jb]
+;W[he]
+;B[hg]
+;W[hs]
+;B[ie]
+;W[hh]
+;B[fr]
+;W[fs]
+;B[ok]
+;W[pk]
+;B[rf]
+;W[rg]
+;B[sg]
+;W[sh]
+;B[sf]
+;W[ri]
+;B[ei]
+;W[ga]
+;B[ia]
+;W[bi]
+;B[bj]
+;W[nf]
+;B[ci]
+;W[mf]
+;B[bh]
+;W[ah]
+;B[ch]
+;W[cg]
+;B[ai]
+;W[ag]
+;B[gj]
+;W[ig]
+;B[if]
+;W[jg]
+;B[hj]
+;W[ij]
+;B[id]
+;W[ml]
+;B[kj]
+;W[lj]
+;B[li]
+;W[kk]
+;B[eh]
+;W[fn]
+;B[eg]
+;W[fg]
+;B[ef]
+;W[oe]
+;B[fi]
+;W[od]
+;B[hi]
+;W[oc]
+;B[pc]
+;W[mb]
+;B[nc]
+;W[ob]
+;B[pb]
+;W[pa]
+;B[qa]
+;W[oa]
+;B[rb]
+;W[mc]
+;B[md]
+;W[nb]
+;B[gh]
+;W[io]
+;B[ip]
+;W[ho]
+;B[lc]
+;W[lb]
+;B[kb]
+;W[js]
+;B[lr]
+;W[rq]
+;B[rr]
+;W[sr]
+;B[ns]
+;W[ms]
+;B[en]
+;W[mp]
+;B[mn]
+;W[mo]
+;B[ln]
+;W[no]
+;B[on]
+;W[pn]
+;B[km]
+;W[kl]
+;B[kn]
+;W[kq]
+;B[jr]
+;W[el]
+;B[dl]
+;W[aq]
+;B[hp]
+;W[ka]
+;B[ih]
+;W[lg]
+;B[lh]
+;W[lf]
+;B[em]
+;W[ng]
+;B[jm]
+;W[im]
+;B[ac]
+;W[oh]
+;B[oi]
+;W[pi]
+;B[oj]
+;W[gk]
+;B[le]
+;W[oo]
+;B[fm]
+;W[gm]
+;B[fk]
+;W[gl]
+;B[ed]
+;W[mh]
+;B[ni]
+;W[bp]
+;B[ao]
+;W[bq]
+;B[ir]
+;W[is]
+;B[hr]
+;W[gs]
+;B[hh]
+;W[es]
+;B[ji]
+;W[mg]
+;B[pe]
+;W[ne]
+;B[jn]
+;W[mj]
+;B[nk]
+;W[go]
+;B[eq]
+;W[ks]
+;B[me]
+;W[ls]
+;B[ja]
+;W[la]
+;B[kh]
+;W[gr]
+;B[mk]
+;W[ll]
+;B[mm]
+;W[ik]
+;B[lp]
+;W[kp]
+;B[jp]
+;W[ko]
+;B[ha]
+;W[fa]
+;B[tt]
+;W[tt]
+)
diff --git a/regression/games/doubleko.sgf b/regression/games/doubleko.sgf
new file mode 100644 (file)
index 0000000..f59c912
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[4]
+SZ[9]KM[0];
+AW[ca][da][ea][db][fb][gb][hb][dc][ec][gc][ed][fd][ee][ge][ff][gf][fg][fh][gh][fi][hi]
+AB[ba][fa][ga][ha][ia][ab][cb][ib][ac][cc][hc][ic][ad][dd][gd][hd][id][ae][be][de][he][af][cf][ef][hf][if][bg][dg][eg][gg][ig][ch][eh][hh][ih][ci][ei][ii]
+)
diff --git a/regression/games/dragon1.sgf b/regression/games/dragon1.sgf
new file mode 100644 (file)
index 0000000..73f649d
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[3]
+SZ[19]KM[0.5]
+PW[jahy]
+WR[NR]
+PB[GnuGo]
+BR[17k*]
+DT[2000-08-31]
+SY[Cgoban 1.9.2]HA[9]AB[dd][jd][pd][dj][jj][pj][dp][jp][pp];W[fc];
+B[fd];W[dc];B[cc];W[ec];B[cb];W[db];B[mp];W[gd];B[cg];W[fe];B[cm];
+W[qf];B[pf];W[pg];B[of];W[qi];B[gp];W[og];B[pm];W[qk];B[md];W[ic];
+B[qe];W[rf];B[df];W[gf];B[pk];W[ql];B[qo];W[co];B[cp];W[bo];B[do];
+W[bp];B[dn];W[bm];B[bl];W[cn];B[am];W[bn];B[dl];W[cq];B[dq];W[br];
+B[cr];W[bq];B[an];W[ao];B[dr];W[bs];B[om];W[mg];B[oj];W[ne];B[al];
+W[nf];B[kg];W[kc];B[nd];W[oe];B[pe];W[od];B[qb];W[oc];B[re];W[le];
+B[kd];W[ld];B[na];W[lb];B[ed];W[jf];B[gh];W[eg];B[dh];W[eh];B[sf];
+W[sg];B[rg];W[qg];B[sh];W[rh];B[sg];W[si];B[se];W[fi];B[fk];W[gi];
+B[hh];W[hi];B[ji];W[ih];B[nh];W[ng];B[mj];W[jh];B[hk];W[kj];B[kk];
+W[ki];B[kh];W[li];B[lh];W[jk];B[mi];W[ij];B[lj];W[ik];B[jm];W[im];
+B[rm];W[rl];B[qm];W[jn];B[kl];W[io];B[kn];W[ip];B[jq];W[iq];B[gm];
+W[lq];B[mq];W[lr];B[lp];W[jr];B[mr];W[dg];B[ei];W[fh];B[fj];W[cf];
+B[ce];W[bf];B[bg];W[ch];B[af];W[bh];B[be];W[di];B[ej];W[ck];B[cl];
+W[cj];B[hn];W[in];B[gr];W[hm];B[ho];W[gl];B[gk];W[hr];B[hl];W[il];
+B[ls];W[ks];B[ms];W[hp];B[gn];W[mh];B[oh];W[mm];B[gq];W[qq];B[rp];
+W[oq];B[rr];W[op];B[qj];W[rj];B[hs];W[is];B[gs];W[dk];B[hj];W[ii];
+B[ek];W[sm];B[pq];W[rn];B[da];W[ea];B[ca];W[ro];B[fa];W[eb];B[gc];
+W[hc];B[gb];W[hb];B[ah];W[ai];B[bi];W[ag];B[bj];W[ci];B[ah];W[rq];
+B[qr];W[sp];B[qp];W[sq];B[sr];W[ln];B[sn];W[sl];B[ko];W[so];B[aj]
+)
+
diff --git a/regression/games/dublin1.sgf b/regression/games/dublin1.sgf
new file mode 100644 (file)
index 0000000..588d8a9
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[3]
+SZ[19]HA[0]
+PB[GoAhead]
+PW[GnuGo]
+DT[01.08.2001]
+KM[6.5];B[dc];W[dp];B[qd];W[pp];B[qn];W[ce];B[ch];W[ed]
+C[this joseki choice is strange with a black stone at r16
+];B[ec];
+W[fd];B[gc]C[
+
+];W[oc]C[this tenuki is dangerous for e16 group.
+];
+B[lc];W[oe];B[pf];W[of]
+C[i don't like this move, it helps black to make territory.
+This move maybe good whithout black stone near R6.
+]
+;B[pg];W[np];B[pj];W[lf];B[jd];W[ro]
+C[I think this is a bad move, forcing black to reinforce himself
+and destroying the NW shicho
+]
+;B[on];W[lp];B[jf];W[qb];B[fq];W[fp];B[jq];W[kq];B[jp];W[eq];B[gq];
+W[gp];B[hp];W[ho];B[hq];W[cm];B[ck];W[el];B[eh];W[ej];B[gh];W[bc];
+B[gd];W[cj];B[bj];W[ef];B[dk];W[gj];B[dj];W[mm];B[rc];W[bg];B[cg];
+W[mb];B[mc];W[lb];B[kb];W[nc];B[bf];W[fc];B[fb];W[be];B[cf];W[cb];
+B[kc];W[mh];B[af];W[mo];B[de];W[ee]C[Here is the big mistake
+];B[dd];
+W[gf];B[ge];W[bd];B[df];W[ig];B[jg];W[hg];B[ff];W[gn];B[jn];W[im];
+B[jm];W[mk];B[ih];W[ik];B[hh];W[ol];B[ql];W[ki];B[qo];W[qp];B[po];
+W[jj];B[jl];W[il];B[jr];W[kr];B[ks];W[ls];B[js];W[lr];B[rn];W[rp];
+B[dl];W[dm];B[ek];W[fk];B[db];W[ae];B[me];W[mf];B[le];W[rb];B[fr];
+W[er];B[es];W[ds];B[fs];W[cr];B[bl];W[bm];B[fl];W[em];B[am];W[an];
+B[al];W[qc];B[rd];W[bo];B[ll];W[ml];B[kh];W[lk];B[lm];W[nj];B[io];
+W[ei];B[di];W[in];B[mn];W[nn];B[ln];W[om];B[op];W[oq];B[oo];W[no];
+B[so];W[fi];B[sp];W[sq];B[sn];W[rq];B[kk];W[pk];B[qk];W[qj];B[qi];
+W[oj];B[rj];W[nd];B[kj];W[ji];B[lh];W[li];B[jh];W[kf];B[gg];W[ke];
+B[hj];W[hk];B[gi];W[gk];B[sb];W[je];B[ie];W[md];B[ld];W[pm];B[qm];
+W[lj];B[pc];W[pd];B[pe];W[pb];B[pl];W[ok];B[la];W[na];B[fh];W[fj];
+B[mg];W[ng];B[lg];W[oh];B[ph];W[jk];B[kl];W[ii];B[hi];W[kp];B[ko];
+W[da];B[ea];W[ca];B[cc];W[ab];B[oi];W[ni];B[pi];W[ne];B[ra];W[qa];
+B[og];W[nh];B[cd];W[sa];B[sc];W[ra];B[lo];W[kd];B[jc];W[ma];B[ka];
+W[cl];B[pn];W[ij];B[kg];W[nf];B[tt];
+C[Zeitverbrauch Weiss  : 58:04\r
+Zeitverbrauch Schwarz: 25:55]
+)
diff --git a/regression/games/dublin2.sgf b/regression/games/dublin2.sgf
new file mode 100644 (file)
index 0000000..f57b631
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[3]
+RU[New Zealand]SZ[19]HA[0]KM[6.5]
+PW[GnuGo]
+PB[Dariush (la chance)]
+GN[Gnugo (W) vs. Dariush (B)]
+DT[2001-08-01]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)]
+RE[W+29.5]
+;B[dq]BL[3596];W[pc]WL[3600];B[cd]BL[3589];W[ec]WL[3599];B[qp]BL[3582]
+;W[de]WL[3597];B[od]BL[3575];W[ce]WL[3590];B[kq]BL[3565];W[qe]WL[3587]
+;B[oc]BL[3555];W[do]WL[3586];B[fp]BL[3539];W[cq]WL[3581];B[cr]BL[3530]
+;W[cp]WL[3578];B[er]BL[3521];W[cl]WL[3575];B[ck]BL[3508];W[oq]WL[3569]
+;B[pq]BL[3494];W[bk]WL[3563];B[jd]BL[3479];W[dk]WL[3554];B[pl]BL[3468]
+;W[hc]WL[3549];B[ic]BL[3458];W[hd]WL[3545];B[pi]BL[3447];W[op]WL[3543]
+;B[po]BL[3434];W[mp]WL[3535];B[hk]BL[3414];W[nn]WL[3524];B[di]BL[3398]
+;W[ko]WL[3514];B[jo]BL[3376];W[ej]WL[3505];B[dc]BL[3362];W[cb]WL[3491]
+;B[be]BL[3346];W[bf]WL[3472];B[dg]BL[3331];W[mn]WL[3451];B[lh]BL[3296]
+;W[mk]WL[3434];B[ii]BL[3267];W[eb]WL[3414];B[ih]BL[3253];W[ei]WL[3401]
+;B[qd]BL[3217];W[pd]WL[3379];B[rd]BL[3198];W[pf]WL[3352];B[pg]BL[3183]
+;W[qg]WL[3337];B[rh]BL[3162];W[qh]WL[3320];B[rf]BL[3134];W[qf]WL[3302]
+;B[rg]BL[3117];W[ob]WL[3292];B[nb]BL[3094];W[qi]WL[3273];B[ph]BL[3074]
+;W[pb]WL[3247];B[oe]BL[3053];W[re]WL[3234];B[rb]BL[2984]
+C[now gnugo should connect or play a sente move 
+]
+(;W[ri]WL[3218];B[qa]BL[2941];W[ml]WL[3201];B[rk]BL[2874];W[jk]
+WL[3179];B[dn]BL[2818];W[cn]WL[3158];B[en]BL[2795];W[jm]WL[3152];B[me]
+BL[2755];W[ni]WL[3144];B[nh]BL[2720];W[mr]WL[3137];B[se]BL[2677];W[kr]
+WL[3132];B[jr]BL[2645];W[lq]WL[3128];B[jp]BL[2612];W[js]WL[3125];B[is]
+BL[2575];W[fl]WL[3120];B[ks]BL[2540];W[hl]WL[3116];B[ie]BL[2518];W[gk]
+WL[3110];B[li]BL[2495];W[go]WL[3105];B[gp]BL[2469];W[pp]WL[3100];B[pr]
+BL[2449];W[qo]WL[3096];B[qn]BL[2426];W[ro]WL[3092];B[rp]BL[2409];W[pn]
+WL[3085];B[rn]BL[2363];W[oo]WL[3080];B[nj]BL[2347];W[so]WL[3071];B[sq]
+BL[2326];W[or]WL[3064];B[qs]BL[2295];W[pm]WL[3059];B[rr]BL[2228];W[gn]
+WL[3055];B[qm]BL[2185];W[eo]WL[3050];B[fn]BL[2160];W[fo]WL[3047];B[ik]
+BL[2133];W[il]WL[3043];B[nk]BL[2109];W[id]WL[3038];B[ib]BL[2081];W[je]
+WL[3013];B[jf]BL[2052];W[jc]WL[2987];B[kc]BL[2023];W[kd]WL[2960];B[jb]
+BL[2004];W[lc]WL[2928];B[lb]BL[1986];W[kb]WL[2907];B[la]BL[1967];W[ka]
+WL[2896];B[mb]BL[1946];W[if]WL[2891];B[kf]BL[1923];W[he]WL[2886];B[bg]
+BL[1902];W[bd]WL[2852];B[cj]BL[1866];W[fg]WL[2819];B[eh]BL[1849];W[fh]
+WL[2806];B[kn]BL[1823];W[ch]WL[2790];B[lo]BL[1809];W[bh]WL[2780];B[lr]
+BL[1784];W[br]WL[2768];B[bs]BL[1770];W[ar]WL[2765];B[gj]BL[1753];W[hj]
+WL[2761];B[ij]BL[1736];W[hi]WL[2758];B[hh]BL[1712];W[gi]WL[2755];B[kl]
+BL[1689];W[km]WL[2744];B[kk]BL[1660];W[jl]WL[2741];B[lk]BL[1634];W[cg]
+WL[2739];B[gf]BL[1607];W[gg]WL[2730];B[ff]BL[1593];W[hg]WL[2727];B[sn]
+BL[1563];W[md]WL[2722];B[mc]BL[1531];W[nd]WL[2718];B[le]BL[1510];W[ld]
+WL[2715];B[nc]BL[1494];W[ne]WL[2708];B[of]BL[1478];W[jn]WL[2703];B[sp]
+BL[1460];W[ln]WL[2700];B[lp]BL[1434];W[po]WL[2697];B[mq]BL[1407];W[ms]
+WL[2693];B[in]BL[1371];W[nq]WL[2692];B[sf]BL[1346];W[mj]WL[2690];B[mi]
+BL[1329];W[jj]WL[2687];B[kj]BL[1315];W[ji]WL[2686];B[ig]BL[1300];W[jh]
+WL[2682];B[jg]BL[1281];W[im]WL[2679];B[hf]BL[1259];W[ef]WL[2671];B[gh]
+BL[1237];W[fi]WL[2665];B[ho]BL[1216];W[df]WL[2661];B[mo]BL[1194];W[fe]
+WL[2656];B[np]BL[1167];W[ge]WL[2652];B[ol]BL[1147];W[ke]WL[2648];B[mf]
+BL[1120];W[kg]WL[2647];B[lf]BL[1107];W[kh]WL[2646];B[os]BL[1082];W[hn]
+WL[2645];B[io]BL[1058];W[no]WL[2644];B[bj]BL[1031];W[bl]WL[2641];B[ep]
+BL[1017];W[nm]WL[2640];B[lg]BL[997];W[om]WL[2639];B[nf]BL[973];W[ll]
+WL[2638];B[mp]BL[946];W[dp]WL[2637];B[kp]BL[926];W[kn]WL[2636];B[ns]
+BL[911];W[nr]WL[2635];B[ps]BL[897];W[nl]WL[2634];B[oj]BL[875];W[lj]
+WL[2633];B[ki]BL[865];W[ls]WL[2633];B[sd]BL[844];W[bq]WL[2632];B[oa]
+BL[818];W[as]WL[2631];B[cs]BL[796];W[tt]WL[2631];B[tt]BL[763];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ab][bb][db][fb][gb][hb][ib][jb][ac][bc][cc][dc][fc][gc][ic][kc][ad][cd][dd][ed][fd][gd][jd][ae][be][ee][ie][af][cf][ff][gf][hf][ag][bg][dg][eg][ah][dh][eh][ai][bi][ci][di][aj][bj][cj][dj][fj][gj][ak][ck][ek][fk][al][dl][el][gl][am][bm][cm][dm][em][fm][gm][hm][lm][mm][an][bn][dn][en][fn][on][ao][bo][co][ap][bp][aq]
+TB[ma][na][pa][ra][sa][ob][pb][qb][sb][pc][qc][rc][sc][pd][pe][qe][re][pf][qf][mg][ng][og][qg][sg][mh][oh][qh][sh][ni][oi][qi][ri][si][pj][qj][rj][sj][ok][pk][qk][sk][ql][rl][sl][rm][sm][hp][ip][eq][fq][gq][hq][iq][jq][lq][qq][rq][dr][fr][gr][hr][ir][kr][qr][sr][ds][es][fs][gs][hs][js][rs][ss]
+C[The game is over.  Final score:
+   White = 89 territory + 103 living stones + 0 dame + 6.5 komi = 198.5
+   Black = 73 territory + 96 living stones + 0 dame = 169
+Gnugo wins by 29.5.
+])
+
+(;W[sd])
+
+)
diff --git a/regression/games/edge_defense1.sgf b/regression/games/edge_defense1.sgf
new file mode 100644 (file)
index 0000000..e00ba78
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.21 load and print]
+DT[2003-06-21]
+KM[6.5]AP[GNU Go:3.3.21]RU[Japanese]
+;AW[bb][fb][gb][pb][bc][gc][jc][oc][pc][gd][ld][nd][ce][de][cf]
+[ef][nf][ag][dg][bh][ch][ih][kh][ci][dj][jk][lk][cm][mm][om][bo]
+[lo][cp][ep][ip][np][op][gq][hq][jq][nq][mr][nr][ms]
+AB[da][cb][eb][qb][dc][fc][qc][ed][fd][pd][ff][gf][if][pf][ah]
+[eh][hh][oh][ai][bi][di][cj][fj][ij][oj][qj][bk][ck][dk][fl][hl]
+[pl][an][gn][in][kn][qn][hp][qp][oq][pq][or][ns][os]
+PL[W]IL[db][ec])
diff --git a/regression/games/egc2001/au-gg.sgf b/regression/games/egc2001/au-gg.sgf
new file mode 100644 (file)
index 0000000..34c23bc
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[3]
+RU[New Zealand]SZ[19]HA[0]KM[6.5]
+PW[Augos6]
+PB[gnugo2.7.246]
+GN[Augos6 (W) vs. gnugo2.7.246 (B)]
+DT[2001-08-01]
+SY[Cgoban 1.9.11]TM[2:00:00(5x1:00)];B[dp]BL[7199];W[pp]WL[7180];B[cd]
+BL[7198];W[qc]WL[7170];B[ec]BL[7197];W[qq]WL[7161];B[nd]BL[7197];W[fp]
+WL[7153];B[dn]BL[7194];W[jj]WL[7144];B[hq]BL[7193];W[jq]WL[7134];B[fq]
+BL[7191];W[hp]WL[7124];B[ep]BL[7188];W[gq]WL[7115];B[gr]BL[7184];W[gp]
+WL[7105];B[qe]BL[7178];W[oc]WL[7069];B[qh]BL[7176];W[oe]WL[7058];B[fr]
+BL[7169];W[qf]WL[7043];B[rf]BL[7161];W[pe]WL[7000];B[cj]BL[7152];W[nc]
+WL[6983];B[id]BL[7149];W[hm]WL[6966];B[pl]BL[7147];W[io]WL[6956];B[cg]
+BL[7143];W[md]WL[6942];B[ej]BL[7139];W[ne]WL[6932];B[el]BL[7136];W[qg]
+WL[6919];B[qn]BL[7116];W[rh]WL[6896];B[on]BL[7102];W[qi]WL[6845];B[ro]
+BL[7086];W[ph]WL[6830];B[nl]BL[7073];W[mj]WL[6801];B[np]BL[7071];W[rp]
+WL[6772];B[lq]BL[7069];W[mc]WL[6746];B[nr]BL[7066];W[qo]WL[6708];B[rl]
+BL[7054];W[rn]WL[6687];B[lo]BL[7039];W[pr]WL[6661];B[kn]BL[7027];W[oq]
+WL[6627];B[iq]BL[7020];W[nq]WL[6602];B[jp]BL[7014];W[mq]WL[6577];B[mr]
+BL[7011];W[mo]WL[6561];B[mp]BL[6999];W[po]WL[6544];B[ll]BL[6998];W[ip]
+WL[6525];B[jo]BL[6993];W[in]WL[6503];B[oi]BL[6991];W[kk]WL[6484];B[hj]
+BL[6989];W[gn]WL[6468];B[gl]BL[6987];W[fm]WL[6451];B[kc]BL[6985];W[il]
+WL[6435];B[jf]BL[6983];W[hk]WL[6415];B[gk]BL[6981];W[ij]WL[6396];B[hi]
+BL[6979];W[jh]WL[6378];B[ig]BL[6978];W[oj]WL[6359];B[kg]BL[6976];W[lk]
+WL[6332];B[lb]BL[6974];W[nk]WL[6313];B[rm]BL[6972];W[ml]WL[6295];B[mm]
+BL[6965];W[oo]WL[6269];B[nm]BL[6961];W[pn]WL[6241];B[sn]BL[6950];W[no]
+WL[6197];B[mg]BL[6945];W[pk]WL[6173];B[li]BL[6939];W[qk]WL[6146];B[oa]
+BL[6935];W[pm]WL[6109];B[mk]BL[6906];W[ob]WL[6086];B[ql]BL[6900];W[pa]
+WL[6056];B[rk]BL[6894];W[rj]WL[6034];B[ol]BL[6890];W[kl]WL[6007];B[km]
+BL[6874];W[lj]WL[5969];B[mi]BL[6871];W[ni]WL[5937];B[nh]BL[6870];W[lh]
+WL[5907];B[kh]BL[6864];W[nj]WL[5871];B[ki]BL[6863];W[ir]WL[5837];B[hr]
+BL[6858];W[jr]WL[5805];B[kr]BL[6857];W[kq]WL[5767];B[le]BL[6856];W[me]
+WL[5732];B[oh]BL[6855];W[jn]WL[5688];B[kp]BL[6849];W[ld]WL[5655];B[ke]
+BL[6848];W[mf]WL[5610];B[mb]BL[6847];W[gf]WL[5571];B[ii]BL[6840];W[eg]
+WL[5527];B[na]BL[6836];W[cf]WL[5491];B[bf]BL[6817];W[ce]WL[5456];B[gd]
+BL[6802];W[dc]WL[5413];B[dd]BL[6790];W[cc]WL[5358];B[bc]BL[6762];W[be]
+WL[5279];B[db]BL[6747];W[ee]WL[5239];B[bg]BL[6743];W[de]WL[5200];B[ff]
+BL[6740];W[fe]WL[5164];B[pb]BL[6733];W[fh]WL[5120];B[qb]BL[6728];W[fd]
+WL[5077];B[rc]BL[6724];W[fc]WL[5041];B[qd]BL[6719];W[eb]WL[4996];B[cb]
+BL[6709];W[cq]WL[4954];B[fb]BL[6704];W[gc]WL[4917];B[hc]BL[6694];W[ea]
+WL[4879];B[da]BL[6682];W[ed]WL[4801];B[fa]BL[6674];W[ge]WL[4763];B[hd]
+BL[6673];W[co]WL[4726];B[bd]BL[6671];W[cn]WL[4683];B[dg]BL[6669];W[ae]
+WL[4641];B[cp]BL[6667];W[bp]WL[4592];B[bl]BL[6666];W[eo]WL[4547];B[do]
+BL[6665];W[dm]WL[4500];B[em]BL[6663];W[dh]WL[4460];B[bo]BL[6658];W[ch]
+WL[4424];B[bh]BL[6643]
+)
diff --git a/regression/games/egc2001/gg-dr.sgf b/regression/games/egc2001/gg-dr.sgf
new file mode 100644 (file)
index 0000000..a70ce65
--- /dev/null
@@ -0,0 +1,65 @@
+(;GM[1]FF[3]
+RU[New Zealand]SZ[19]HA[0]KM[6.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-08-01]
+SY[Cgoban 1.9.11]TM[1:00:00(5x1:00)]
+RE[W+29.5]
+;B[dq]BL[3596];W[pc]WL[3600];B[cd]BL[3589];W[ec]WL[3599];B[qp]BL[3582]
+;W[de]WL[3597];B[od]BL[3575];W[ce]WL[3590];B[kq]BL[3565];W[qe]WL[3587]
+;B[oc]BL[3555];W[do]WL[3586];B[fp]BL[3539];W[cq]WL[3581];B[cr]BL[3530]
+;W[cp]WL[3578];B[er]BL[3521];W[cl]WL[3575];B[ck]BL[3508];W[oq]WL[3569]
+;B[pq]BL[3494];W[bk]WL[3563];B[jd]BL[3479];W[dk]WL[3554];B[pl]BL[3468]
+;W[hc]WL[3549];B[ic]BL[3458];W[hd]WL[3545];B[pi]BL[3447];W[op]WL[3543]
+;B[po]BL[3434];W[mp]WL[3535];B[hk]BL[3414];W[nn]WL[3524];B[di]BL[3398]
+;W[ko]WL[3514];B[jo]BL[3376];W[ej]WL[3505];B[dc]BL[3362];W[cb]WL[3491]
+;B[be]BL[3346];W[bf]WL[3472];B[dg]BL[3331];W[mn]WL[3451];B[lh]BL[3296]
+;W[mk]WL[3434];B[ii]BL[3267];W[eb]WL[3414];B[ih]BL[3253];W[ei]WL[3401]
+;B[qd]BL[3217];W[pd]WL[3379];B[rd]BL[3198];W[pf]WL[3352];B[pg]BL[3183]
+;W[qg]WL[3337];B[rh]BL[3162];W[qh]WL[3320];B[rf]BL[3134];W[qf]WL[3302]
+;B[rg]BL[3117];W[ob]WL[3292];B[nb]BL[3094];W[qi]WL[3273];B[ph]BL[3074]
+;W[pb]WL[3247];B[oe]BL[3053];W[re]WL[3234];B[rb]BL[2984];W[ri]WL[3218]
+;B[qa]BL[2941];W[ml]WL[3201];B[rk]BL[2874];W[jk]WL[3179];B[dn]BL[2818]
+;W[cn]WL[3158];B[en]BL[2795];W[jm]WL[3152];B[me]BL[2755];W[ni]WL[3144]
+;B[nh]BL[2720];W[mr]WL[3137];B[se]BL[2677];W[kr]WL[3132];B[jr]BL[2645]
+;W[lq]WL[3128];B[jp]BL[2612];W[js]WL[3125];B[is]BL[2575];W[fl]WL[3120]
+;B[ks]BL[2540];W[hl]WL[3116];B[ie]BL[2518];W[gk]WL[3110];B[li]BL[2495]
+;W[go]WL[3105];B[gp]BL[2469];W[pp]WL[3100];B[pr]BL[2449];W[qo]WL[3096]
+;B[qn]BL[2426];W[ro]WL[3092];B[rp]BL[2409];W[pn]WL[3085];B[rn]BL[2363]
+;W[oo]WL[3080];B[nj]BL[2347];W[so]WL[3071];B[sq]BL[2326];W[or]WL[3064]
+;B[qs]BL[2295];W[pm]WL[3059];B[rr]BL[2228];W[gn]WL[3055];B[qm]BL[2185]
+;W[eo]WL[3050];B[fn]BL[2160];W[fo]WL[3047];B[ik]BL[2133];W[il]WL[3043]
+;B[nk]BL[2109];W[id]WL[3038];B[ib]BL[2081];W[je]WL[3013];B[jf]BL[2052]
+;W[jc]WL[2987];B[kc]BL[2023];W[kd]WL[2960];B[jb]BL[2004];W[lc]WL[2928]
+;B[lb]BL[1986];W[kb]WL[2907];B[la]BL[1967];W[ka]WL[2896];B[mb]BL[1946]
+;W[if]WL[2891];B[kf]BL[1923];W[he]WL[2886];B[bg]BL[1902];W[bd]WL[2852]
+;B[cj]BL[1866];W[fg]WL[2819];B[eh]BL[1849];W[fh]WL[2806];B[kn]BL[1823]
+;W[ch]WL[2790];B[lo]BL[1809];W[bh]WL[2780];B[lr]BL[1784];W[br]WL[2768]
+;B[bs]BL[1770];W[ar]WL[2765];B[gj]BL[1753];W[hj]WL[2761];B[ij]BL[1736]
+;W[hi]WL[2758];B[hh]BL[1712];W[gi]WL[2755];B[kl]BL[1689];W[km]WL[2744]
+;B[kk]BL[1660];W[jl]WL[2741];B[lk]BL[1634];W[cg]WL[2739];B[gf]BL[1607]
+;W[gg]WL[2730];B[ff]BL[1593];W[hg]WL[2727];B[sn]BL[1563];W[md]WL[2722]
+;B[mc]BL[1531];W[nd]WL[2718];B[le]BL[1510];W[ld]WL[2715];B[nc]BL[1494]
+;W[ne]WL[2708];B[of]BL[1478];W[jn]WL[2703];B[sp]BL[1460];W[ln]WL[2700]
+;B[lp]BL[1434];W[po]WL[2697];B[mq]BL[1407];W[ms]WL[2693];B[in]BL[1371]
+;W[nq]WL[2692];B[sf]BL[1346];W[mj]WL[2690];B[mi]BL[1329];W[jj]WL[2687]
+;B[kj]BL[1315];W[ji]WL[2686];B[ig]BL[1300];W[jh]WL[2682];B[jg]BL[1281]
+;W[im]WL[2679];B[hf]BL[1259];W[ef]WL[2671];B[gh]BL[1237];W[fi]WL[2665]
+;B[ho]BL[1216];W[df]WL[2661];B[mo]BL[1194];W[fe]WL[2656];B[np]BL[1167]
+;W[ge]WL[2652];B[ol]BL[1147];W[ke]WL[2648];B[mf]BL[1120];W[kg]WL[2647]
+;B[lf]BL[1107];W[kh]WL[2646];B[os]BL[1082];W[hn]WL[2645];B[io]BL[1058]
+;W[no]WL[2644];B[bj]BL[1031];W[bl]WL[2641];B[ep]BL[1017];W[nm]WL[2640]
+;B[lg]BL[997];W[om]WL[2639];B[nf]BL[973];W[ll]WL[2638];B[mp]BL[946];
+W[dp]WL[2637];B[kp]BL[926];W[kn]WL[2636];B[ns]BL[911];W[nr]WL[2635];
+B[ps]BL[897];W[nl]WL[2634];B[oj]BL[875];W[lj]WL[2633];B[ki]BL[865];
+W[ls]WL[2633];B[sd]BL[844];W[bq]WL[2632];B[oa]BL[818];W[as]WL[2631];
+B[cs]BL[796];W[tt]WL[2631];B[tt]BL[763];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ab][bb][db][fb][gb][hb][ib][jb][ac][bc][cc][dc][fc][gc][ic][kc][ad][cd][dd][ed][fd][gd][jd][ae][be][ee][ie][af][cf][ff][gf][hf][ag][bg][dg][eg][ah][dh][eh][ai][bi][ci][di][aj][bj][cj][dj][fj][gj][ak][ck][ek][fk][al][dl][el][gl][am][bm][cm][dm][em][fm][gm][hm][lm][mm][an][bn][dn][en][fn][on][ao][bo][co][ap][bp][aq]
+TB[ma][na][pa][ra][sa][ob][pb][qb][sb][pc][qc][rc][sc][pd][pe][qe][re][pf][qf][mg][ng][og][qg][sg][mh][oh][qh][sh][ni][oi][qi][ri][si][pj][qj][rj][sj][ok][pk][qk][sk][ql][rl][sl][rm][sm][hp][ip][eq][fq][gq][hq][iq][jq][lq][qq][rq][dr][fr][gr][hr][ir][kr][qr][sr][ds][es][fs][gs][hs][js][rs][ss]
+C[The game is over.  Final score:
+   White = 89 territory + 103 living stones + 0 dame + 6.5 komi = 198.5
+   Black = 73 territory + 96 living stones + 0 dame = 169
+White wins by 29.5.
+]
+)
diff --git a/regression/games/egc2001/gg-ga.sgf b/regression/games/egc2001/gg-ga.sgf
new file mode 100644 (file)
index 0000000..40101c7
--- /dev/null
@@ -0,0 +1,33 @@
+(;
+SZ[19]
+HA[0]
+PB[ ]
+PW[ ]
+DT[01.08.2001]
+KM[6.5]
+;B[dc];W[dp];B[qd];W[pp];B[qn];W[ce];B[ch];W[ed];B[ec];W[fd]
+;B[gc];W[oc];B[lc];W[oe];B[pf];W[of];B[pg];W[np];B[pj];W[lf]
+;B[jd];W[ro];B[on];W[lp];B[jf];W[qb];B[fq];W[fp];B[jq];W[kq]
+;B[jp];W[eq];B[gq];W[gp];B[hp];W[ho];B[hq];W[cm];B[ck];W[el]
+;B[eh];W[ej];B[gh];W[bc];B[gd];W[cj];B[bj];W[ef];B[dk];W[gj]
+;B[dj];W[mm];B[rc];W[bg];B[cg];W[mb];B[mc];W[lb];B[kb];W[nc]
+;B[bf];W[fc];B[fb];W[be];B[cf];W[cb];B[kc];W[mh];B[af];W[mo]
+;B[de];W[ee];B[dd];W[gf];B[ge];W[bd];B[df];W[ig];B[jg];W[hg]
+;B[ff];W[gn];B[jn];W[im];B[jm];W[mk];B[ih];W[ik];B[hh];W[ol]
+;B[ql];W[ki];B[qo];W[qp];B[po];W[jj];B[jl];W[il];B[jr];W[kr]
+;B[ks];W[ls];B[js];W[lr];B[rn];W[rp];B[dl];W[dm];B[ek];W[fk]
+;B[db];W[ae];B[me];W[mf];B[le];W[rb];B[fr];W[er];B[es];W[ds]
+;B[fs];W[cr];B[bl];W[bm];B[fl];W[em];B[am];W[an];B[al];W[qc]
+;B[rd];W[bo];B[ll];W[ml];B[kh];W[lk];B[lm];W[nj];B[io];W[ei]
+;B[di];W[in];B[mn];W[nn];B[ln];W[om];B[op];W[oq];B[oo];W[no]
+;B[so];W[fi];B[sp];W[sq];B[sn];W[rq];B[kk];W[pk];B[qk];W[qj]
+;B[qi];W[oj];B[rj];W[nd];B[kj];W[ji];B[lh];W[li];B[jh];W[kf]
+;B[gg];W[ke];B[hj];W[hk];B[gi];W[gk];B[sb];W[je];B[ie];W[md]
+;B[ld];W[pm];B[qm];W[lj];B[pc];W[pd];B[pe];W[pb];B[pl];W[ok]
+;B[la];W[na];B[fh];W[fj];B[mg];W[ng];B[lg];W[oh];B[ph];W[jk]
+;B[kl];W[ii];B[hi];W[kp];B[ko];W[da];B[ea];W[ca];B[cc];W[ab]
+;B[oi];W[ni];B[pi];W[ne];B[ra];W[qa];B[og];W[nh];B[cd];W[sa]
+;B[sc];W[ra];B[lo];W[kd];B[jc];W[ma];B[ka];W[cl];B[pn];W[ij]
+;B[kg];W[nf];B[tt];C[Zeitverbrauch Weiss  : 58:04
+Zeitverbrauch Schwarz: 25:55]
+)
diff --git a/regression/games/egc2001/gg-ts.sgf b/regression/games/egc2001/gg-ts.sgf
new file mode 100644 (file)
index 0000000..a9f4cd3
--- /dev/null
@@ -0,0 +1,64 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Gosynier]
+PB[gnugo2.7.246]
+GN[Gosynier (W) vs. gnugo2.7.246 (B)]
+DT[2001-08-01]
+SY[Cgoban 1.9.11]TM[2:00:00(5x1:00)];B[pc]BL[7198];W[dd]WL[7200];B[dq]
+BL[7180];W[do]WL[7199];B[pq]BL[7161];W[cq]WL[7197];B[cm]BL[7149];W[dr]
+WL[7192];B[eq]BL[7131];W[cp]WL[7186];B[gq]BL[7119];W[qe]WL[7183];B[fc]
+BL[7101];W[od]WL[7177];B[oc]BL[7094];W[nd]WL[7176];B[cf]BL[7082];W[fd]
+WL[7172];B[qn]BL[7072];W[ec]WL[7163];B[gc]BL[7063];W[gd]WL[7157];B[hc]
+BL[7056];W[ff]WL[7154];B[fn]BL[7048];W[ie]WL[7144];B[kd]BL[7038];W[qh]
+WL[7141];B[di]BL[7022];W[qk]WL[7137];B[mp]BL[7011];W[kq]WL[7135];B[id]
+BL[6973];W[be]WL[7126];B[je]BL[6951];W[if]WL[7124];B[cc]BL[6939];W[mr]
+WL[7118];B[ce]BL[6929];W[cd]WL[7104];B[bc]BL[6924];W[bf]WL[7095];B[cg]
+BL[6916];W[bd]WL[7084];B[nm]BL[6903];W[eb]WL[7070];B[qc]BL[6895];W[bn]
+WL[7060];B[cn]BL[6869];W[bm]WL[7050];B[nf]BL[6842];W[ko]WL[7048];B[ip]
+BL[6833];W[of]WL[7040];B[ng]BL[6790];W[mo]WL[7038];B[lp]BL[6780];W[kp]
+WL[7026];B[lo]BL[6774];W[rd]WL[7018];B[no]BL[6764];W[hh]WL[7011];B[mn]
+BL[6753];W[kg]WL[6998];B[kf]BL[6738];W[ij]WL[6997];B[lg]BL[6726];W[kh]
+WL[6988];B[kn]BL[6719];W[ir]WL[6982];B[gj]BL[6711];W[oi]WL[6974];B[mh]
+BL[6700];W[rm]WL[6972];B[mi]BL[6689];W[rn]WL[6971];B[qo]BL[6677];W[ro]
+WL[6969];B[rp]BL[6673];W[sp]WL[6967];B[rq]BL[6668];W[pm]WL[6966];B[cl]
+BL[6660];W[bl]WL[6964];B[ck]BL[6656];W[jl]WL[6962];B[ll]BL[6647];W[kj]
+WL[6959];B[ki]BL[6637];W[li]WL[6957];B[ji]BL[6632];W[lj]WL[6944];B[og]
+BL[6619];W[pg]WL[6943];B[pf]BL[6614];W[oe]WL[6934];B[hi]BL[6609];W[ii]
+WL[6924];B[oh]BL[6604];W[jn]WL[6916];B[km]BL[6584];W[jm]WL[6907];B[qg]
+BL[6573];W[ph]WL[6883];B[hm]BL[6546];W[io]WL[6875];B[ho]BL[6539];W[hl]
+WL[6870];B[gl]BL[6529];W[gi]WL[6867];B[hk]BL[6511];W[rb]WL[6865];B[il]
+BL[6497];W[bg]WL[6862];B[hj]BL[6469];W[fi]WL[6859];B[hq]BL[6455];W[gg]
+WL[6857];B[bj]BL[6444];W[ha]WL[6855];B[nc]BL[6430];W[le]WL[6852];B[ld]
+BL[6421];W[me]WL[6849];B[bh]BL[6409];W[lf]WL[6845];B[ke]BL[6391];W[ni]
+WL[6841];B[mj]BL[6374];W[mk]WL[6839];B[ml]BL[6367];W[nk]WL[6837];B[nq]
+BL[6358];W[nr]WL[6835];B[or]BL[6342];W[er]WL[6832];B[fq]BL[6330];W[om]
+WL[6830];B[qm]BL[6284];W[ql]WL[6828];B[rh]BL[6277];W[rf]WL[6795];B[pi]
+BL[6254];W[qi]WL[6779];B[pj]BL[6245];W[qj]WL[6762];B[rc]BL[6227];W[sc]
+WL[6760];B[ek]BL[6220];W[sq]WL[6759];B[rr]BL[6211];W[so]WL[6758];B[qb]
+BL[6202];W[hr]WL[6755];B[ra]BL[6180];W[fr]WL[6753];B[sb]BL[6168];W[ib]
+WL[6750];B[sd]BL[6155];W[kb]WL[6748];B[se]BL[6149];W[rg]WL[6746];B[mc]
+BL[6140];W[hd]WL[6743];B[ic]BL[6130];W[jc]WL[6741];B[ja]BL[6121];W[ia]
+WL[6739];B[jd]BL[6114];W[kc]WL[6736];B[gr]BL[6108];W[gs]WL[6735];B[sf]
+BL[6101];W[sg]WL[6733];B[hn]BL[6093];W[eh]WL[6731];B[dh]BL[6086];W[fj]
+WL[6730];B[fk]BL[6078];W[on]WL[6729];B[oo]BL[6069];W[lh]WL[6728];B[eg]
+BL[6058];W[fg]WL[6726];B[ef]BL[6048];W[fb]WL[6725];B[ee]BL[6041];W[ed]
+WL[6716];B[lq]BL[6035];W[lr]WL[6715];B[eo]BL[6028];W[dp]WL[6714];B[dn]
+BL[6019];W[bk]WL[6713];B[gb]BL[6013];W[ga]WL[6711];B[po]BL[6006];W[sr]
+WL[6709];B[rs]BL[6001];W[os]WL[6708];B[ps]BL[5995];W[ns]WL[6707];B[in]
+BL[5991];W[jo]WL[6706];B[ei]BL[5984];W[fh]WL[6705];B[qd]BL[5977];W[re]
+WL[6705];B[sc]BL[5968];W[ah]WL[6704];B[bi]BL[5961];W[ej]WL[6703];B[dj]
+BL[5956];W[ik]WL[6702];B[lk]BL[5948];W[im]WL[6701];B[hl]BL[5943];W[kk]
+WL[6701];B[mg]BL[5937];W[nj]WL[6701];B[md]BL[5924];W[nh]WL[6700];B[pe]
+BL[5916];W[ne]WL[6699];B[sh]BL[5904];W[ri]WL[6698];B[qf]BL[5899];W[jf]
+WL[6697];B[si]BL[5882];W[sj]WL[6696];B[ai]BL[5872];W[ag]WL[6695];B[de]
+BL[5863];W[nl]WL[6694];B[nn]BL[5853];W[kl]WL[6694];B[ep]BL[5844];W[lm]
+WL[6694];B[ln]BL[5819];W[mm]WL[6694];B[fe]BL[5811];W[ge]WL[6694];B[ak]
+BL[5802];W[co]WL[6694];B[iq]BL[5793];W[kr]WL[6694];B[mq]BL[5786];W[jq]
+WL[6694];B[ad]BL[5778];W[lc]WL[6693];B[db]BL[5767];W[da]WL[6692];B[ca]
+BL[5762];W[bb]WL[6691];B[ea]BL[5757];W[mb]WL[6690];B[ba]BL[5747];W[ab]
+WL[6690];B[cb]BL[5741];W[nb]WL[6690];B[ob]BL[5728];W[oa]WL[6689];B[pa]
+BL[5724];W[na]WL[6688];B[la]BL[5717];W[ka]WL[6688];B[ac]BL[5705];W[al]
+WL[6687];B[aj]BL[5698];W[ss]WL[6686];B[jp]BL[5677];W[pn]WL[6686];B[pd]
+BL[5668];W[mf]WL[6686];B[rk]BL[5660];W[sk]WL[6686];B[rl]BL[5652];W[sm]
+WL[6686];B[hb]BL[5643];W[tt]WL[6686];B[tt]BL[5627]
+)
diff --git a/regression/games/egc2001/gs-gg.sgf b/regression/games/egc2001/gs-gg.sgf
new file mode 100644 (file)
index 0000000..ee0ff5b
--- /dev/null
@@ -0,0 +1,60 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[6.5]
+PW[Gosynier]
+PB[gnugo2.7.246]
+GN[Gosynier (W) vs. gnugo2.7.246 (B)]
+DT[2001-08-01]
+SY[Cgoban 1.9.11]TM[2:00:00(5x1:00)];B[dp]BL[7200];W[pe]WL[7188];B[ed]
+BL[7200];W[po]WL[7171];B[cd]BL[7199];W[fp]WL[7159];B[dn]BL[7197];W[qj]
+WL[7150];B[pc]BL[7196];W[kp]WL[7139];B[qe]BL[7194];W[ck]WL[7131];B[qd]
+BL[7190];W[jd]WL[7123];B[pq]BL[7189];W[dq]WL[7115];B[qo]BL[7181];W[qn]
+WL[7104];B[qp]BL[7173];W[pn]WL[7094];B[nq]BL[7173];W[nn]WL[7084];B[cq]
+BL[7172];W[eq]WL[7077];B[cr]BL[7168];W[gq]WL[7069];B[hc]BL[7158];W[ic]
+WL[7062];B[hd]BL[7156];W[kc]WL[7057];B[mc]BL[7155];W[jb]WL[7052];B[cg]
+BL[7154];W[cm]WL[7043];B[em]BL[7142];W[co]WL[7036];B[bp]BL[7131];W[fn]
+WL[7021];B[cn]BL[7120];W[bn]WL[7015];B[bo]BL[7113];W[bm]WL[7001];B[ci]
+BL[7107];W[cl]WL[6992];B[ne]BL[7106];W[np]WL[6979];B[pf]BL[7105];W[oe]
+WL[6972];B[of]BL[7103];W[od]WL[6967];B[qh]BL[7099];W[nc]WL[6961];B[nb]
+BL[7094];W[ob]WL[6955];B[lb]BL[7080];W[ib]WL[6943];B[dj]BL[7075];W[pi]
+WL[6927];B[bj]BL[7072];W[md]WL[6920];B[nd]BL[7065];W[oc]WL[6914];B[oa]
+BL[7050];W[pa]WL[6907];B[pb]BL[7037];W[na]WL[6900];B[mb]BL[7031];W[qb]
+WL[6893];B[pd]BL[7007];W[oa]WL[6875];B[rb]BL[6992];W[fb]WL[6861];B[hb]
+BL[6990];W[mr]WL[6847];B[mq]BL[6979];W[op]WL[6836];B[lr]BL[6973];W[nr]
+WL[6828];B[or]BL[6958];W[bb]WL[6817];B[db]BL[6953];W[dc]WL[6812];B[cb]
+BL[6941];W[cc]WL[6804];B[eb]BL[6929];W[ec]WL[6796];B[fc]BL[6914];W[fa]
+WL[6790];B[bc]BL[6902];W[ac]WL[6784];B[dd]BL[6894];W[kr]WL[6777];B[kq]
+BL[6889];W[jq]WL[6759];B[lq]BL[6884];W[jp]WL[6751];B[jr]BL[6882];W[pp]
+WL[6737];B[nh]BL[6879];W[ok]WL[6727];B[ld]BL[6868];W[me]WL[6719];B[nf]
+BL[6853];W[ie]WL[6711];B[le]BL[6843];W[kf]WL[6700];B[mj]BL[6842];W[rp]
+WL[6686];B[ro]BL[6820];W[rq]WL[6635];B[qq]BL[6812];W[qr]WL[6630];B[rn]
+BL[6804];W[ql]WL[6620];B[rr]BL[6796];W[sr]WL[6609];B[rs]BL[6793];W[qs]
+WL[6602];B[sp]BL[6787];W[ss]WL[6595];B[jg]BL[6778];W[jf]WL[6586];B[hf]
+BL[6770];W[ke]WL[6568];B[kd]BL[6767];W[ha]WL[6560];B[lg]BL[6762];W[if]
+WL[6549];B[kg]BL[6757];W[kb]WL[6538];B[id]BL[6754];W[lf]WL[6518];B[mf]
+BL[6749];W[rc]WL[6500];B[he]BL[6738];W[fk]WL[6491];B[ka]BL[6735];W[ja]
+WL[6482];B[la]BL[6730];W[ra]WL[6475];B[sb]BL[6727];W[sc]WL[6468];B[ri]
+BL[6724];W[rj]WL[6462];B[ii]BL[6715];W[il]WL[6452];B[fj]BL[6713];W[bk]
+WL[6441];B[jk]BL[6710];W[km]WL[6435];B[al]BL[6709];W[dr]WL[6423];B[hk]
+BL[6705];W[nl]WL[6414];B[el]BL[6702];W[cj]WL[6404];B[bi]BL[6694];W[gj]
+WL[6398];B[gl]BL[6682];W[gk]WL[6389];B[hm]BL[6673];W[fi]WL[6382];B[im]
+BL[6661];W[jl]WL[6374];B[hl]BL[6654];W[ej]WL[6368];B[dk]BL[6644];W[dh]
+WL[6361];B[di]BL[6639];W[ei]WL[6353];B[lk]BL[6636];W[ml]WL[6345];B[eh]
+BL[6634];W[gn]WL[6334];B[sj]BL[6630];W[sk]WL[6329];B[si]BL[6620];W[rk]
+WL[6324];B[rm]BL[6610];W[js]WL[6317];B[ir]BL[6608];W[hr]WL[6305];B[is]
+BL[6607];W[cs]WL[6297];B[bs]BL[6606];W[ds]WL[6291];B[br]BL[6605];W[go]
+WL[6285];B[ik]BL[6603];W[kl]WL[6278];B[eg]BL[6601];W[hh]WL[6268];B[ig]
+BL[6600];W[hi]WL[6256];B[gh]BL[6599];W[mi]WL[6247];B[ni]BL[6597];W[ko]
+WL[6240];B[eo]BL[6596];W[jj]WL[6229];B[kk]BL[6595];W[jn]WL[6222];B[iq]
+BL[6594];W[mo]WL[6212];B[hq]BL[6593];W[gr]WL[6194];B[oj]BL[6592];W[pj]
+WL[6175];B[hp]BL[6591];W[ph]WL[6167];B[qg]BL[6588];W[pk]WL[6159];B[hs]
+BL[6587];W[oh]WL[6149];B[gs]BL[6585];W[mk]WL[6137];B[fr]BL[6583];W[gp]
+WL[6128];B[ho]BL[6582];W[in]WL[6122];B[hn]BL[6581];W[og]WL[6117];B[ll]
+BL[6579];W[lm]WL[6110];B[qm]BL[6578];W[pm]WL[6102];B[ng]BL[6576];W[mm]
+WL[6095];B[io]BL[6575];W[er]WL[6087];B[fs]BL[6573];W[lp]WL[6081];B[rl]
+BL[6571];W[ls]WL[6073];B[oq]BL[6569];W[jo]WL[6061];B[sl]BL[6568];W[ip]
+WL[6054];B[jm]BL[6568];W[en]WL[6042];B[oi]BL[6567];W[mh]WL[6035];B[qi]
+BL[6566];W[lh]WL[6024];B[pg]BL[6565];W[lj]WL[6015];B[nj]BL[6563];W[jh]
+WL[6011];B[ih]BL[6559];W[nk]WL[6001];B[mp]BL[6557];W[ol]WL[5989];B[tt]
+BL[6556];W[oo]WL[5974];B[tt]BL[6556];W[om]WL[5964];B[tt]BL[6555];W[tt]
+WL[5939]
+)
diff --git a/regression/games/egc2001/tg-gg.sgf b/regression/games/egc2001/tg-gg.sgf
new file mode 100644 (file)
index 0000000..746c3c4
--- /dev/null
@@ -0,0 +1,49 @@
+(;
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]
+SZ[19]
+HA[0]
+ST[0]
+PB[Gnu Go]
+PW[TurboGo v5.01]
+DT[August 1, 2001]
+PC[Dublin]
+KM[6.5]
+TM[1 hour]
+RU[Chinese]
+RE[B+206.5]
+EV[European Computer Go Championships 2001]
+
+C[Fichier SGF créé par TurboGo pour Windows v5.0
+];B[dp];W[qc];B[pp];W[ec];B[cc];W[ce];B[pd];W[qd]
+;B[pe];W[ob];B[md];W[nd];B[qe];W[oc];B[ne];W[oe];B[nf];W[od]
+;B[qh];W[pm];B[of];W[jp];B[np];W[qp];B[qq];W[po];B[oq];W[qo]
+;B[cg];W[cn];B[cj];W[hq];B[dn];W[ic];B[co];W[eq];B[cm];W[qk]
+;B[be];W[lc];B[cf];W[mc];B[dq];W[db];B[er];W[cb];B[de];W[pc]
+;B[lq];W[re];B[rf];W[pf];B[qf];W[pg];B[oh];W[oj];B[ph];W[bb]
+;B[rd];W[rc];B[se];W[bc];B[cd];W[rq];B[rr];W[mi];B[rp];W[ro]
+;B[sq];W[gd];B[fo];W[ho];B[jr];W[kq];B[lg];W[kr];B[hr];W[gp]
+;B[mn];W[kn];B[lm];W[lo];B[fm];W[iq];B[gr];W[ir];B[lr];W[js]
+;B[mk];W[nj];B[ff];W[hf];B[rj];W[rk];B[jf];W[ih];B[jl];W[kj]
+;B[qj];W[pj];B[gh];W[hg];B[on];W[oo];B[sc];W[sb];B[le];W[kd]
+;B[sd];W[rb];B[gj];W[ij];B[fp];W[bn];B[fe];W[fd];B[no];W[pn]
+;B[hl];W[hk];B[ik];W[jk];B[gk];W[il];B[hm];W[in];B[im];W[ik]
+;B[km];W[jn];B[jm];W[lk];B[nk];W[om];B[nm];W[ok];B[mj];W[li]
+;B[ni];W[mh];B[sk];W[sl];B[sj];W[ie];B[ol];W[pl];B[rl];W[ql]
+;B[sm];W[nl];B[ml];W[rm];B[sl];W[kh];B[rn];W[so];B[qm];W[ol]
+;B[hi];W[nn];B[mm];W[on];B[mo];W[bm];B[cl];W[bl];B[ii];W[jh]
+;B[ji];W[bo];B[bp];W[ap];B[bk];W[al];B[bq];W[an];B[lj];W[ki]
+;B[lp];W[ge];B[ko];W[ln];B[kp];W[jo];B[bd];W[dd];B[je];W[jd]
+;B[mg];W[ke];B[kf];W[ee];B[ef];W[ed];B[ac];W[ab];B[ad];W[gn]
+;B[hn];W[kl];B[go];W[gg];B[fg];W[ld];B[me];W[sp];B[rq];W[qn]
+;B[gq];W[rm];B[sn];W[qm];B[hp];W[io];B[nh];W[ip];B[gp];W[jq]
+;B[kg];W[op];B[if];W[pq];B[pr];W[pp];B[gf];W[or];B[nq];W[nr]
+;B[qs];W[ao];B[hh];W[jj];B[ig];W[he];B[dc];W[kk];B[tt];W[pi]
+;B[qi];W[aq];B[br];W[ar];B[tt];W[mr];B[tt];W[ls];B[tt];W[mq]
+;B[mp];W[hs];B[tt];W[as];B[tt];W[gs];B[tt];W[fs];B[tt];W[fr]
+;B[dr];W[fq];B[tt];W[ep];B[os];W[eo];B[fn];W[ms];B[tt];W[en]
+;B[do];W[em];B[tt];W[ll];B[fl];W[dl];B[tt];W[dm];B[ck];W[ek]
+;B[tt];W[ei];B[fi];W[ej];B[tt];W[dh];B[bh];W[ci];B[bi];W[dg]
+;B[df];W[dj];B[tt];W[dk];B[tt];W[ak];B[bj];W[ch];B[eh];W[es]
+;B[bs];W[ds];B[tt];W[cs];B[tt];W[cr];B[aj];W[cq];B[am];W[cp]
+;B[tt];W[fk];B[tt];W[el];B[tt];W[fj];B[tt];W[di];B[tt];W[is]
+;B[tt];W[eg];B[fh];W[ks];B[tt];W[kb];B[tt];W[tt])
diff --git a/regression/games/ego.sgf b/regression/games/ego.sgf
new file mode 100644 (file)
index 0000000..fabe37b
--- /dev/null
@@ -0,0 +1,86 @@
+(;GM[1]FF[3]
+VW[]
+RE[B+3.5]
+SZ[19]
+PB[bwilcox (Ego)]
+PW[FSF (GNU Go 2.7.218)]
+US[bump@match.Stanford.EDU]PC[NNGS]
+DT[2001/02/08 20:26:45 UT]
+KM[5.5]BR[NR]WR[17k];B[dq];W[cd];B[qp];W[pd];B[co];W[op];B[oq];W[nq];
+B[pq];W[np];B[qm]
+C[According to Bruce Wilcox, this is a deliberate nonjoseki intended to thwart Joseki databases
+]
+;W[fc]
+C[W should extend at K3 or K4. More specific versions of F403 and F404 needed with J class.
+]
+;B[nd];W[pf];B[pc];W[qc];B[oc];W[qb];B[pb]
+C[Better to extend around L17
+];W[jp];B[kc];W[qi];B[cf];W[ci];B[ef];
+W[cl];B[qk];W[ic];B[nb];W[eo]C[G3 is better
+];B[gq];W[gf];B[ge];W[he]
+C[E15 is better
+];B[fe];W[ed];B[gc];W[gb];B[hd];W[ie]C[J16 is better
+]
+;B[id];W[nm]
+C[Bad tenuki., but the best move is not clear, so I would not tune at this point.
+]
+;B[jr];W[cn];B[do];W[go]C[D6 is better
+];B[ep];W[gg];B[ib];W[hc];B[gd]
+;W[jb]C[W must H18.
+];B[hb];W[ga];B[jc];W[ne];B[me];W[nf];B[mf];W[rj];
+B[rk];W[en];B[bn];W[bm];B[bo];W[ji];B[dn];W[be]
+C[D7 is a good local move.
+];B[bf];W[bh];B[eh];W[ip];B[iq];W[ei];B[dm]
+;W[ek];B[em];W[fm];B[dl];W[el];B[cm];W[bl];B[dk];W[ej];B[lq];W[mo];
+B[lo]C[
+];W[ln]C[L3 instead is interesting
+];B[ko];W[in];B[kn];W[lm];
+B[km];W[mr];B[lr];W[ps]
+C[Bad. B can cut at P2. GNU Go makes the monkey jump much too often.
+]
+;B[qr];W[or];B[qs];W[fp];B[fq];W[sk];B[sl];W[sj];B[rm];W[qe]
+C[Probably not necessary. GNU Go's move reasons seem a little fishy. This is valued at about 6 points.
+D13 or F12 would be good at this point.
+]
+;B[jf];W[ig];B[je];W[jj]C[F12 looks better
+];B[gi];W[hi]C[Better F12
+]
+;B[fh];W[gj];B[cc];W[dc]C[W took about 96 seconds to make this move
+];
+B[bc]C[
+];W[db]C[B has a double threat of  E18 or B16.
+];B[pi];W[qh];
+B[pj];W[bd];B[il];W[jm];B[kl];W[jl];B[jk];W[kk];B[ik];W[hj];B[fn];
+W[fo];B[fl];W[gm];B[ll];W[ml];B[lk];W[nk]
+C[GNU Go thinks the bottom group is critical, and rushes to make life.
+This may actually be correct, see variation.
+]
+;B[lj]C[B should capture
+];W[kj];B[ng];W[ol];B[oe];W[of];B[od];W[mg];
+B[nh];W[lg];B[lh];W[mh];B[mi];W[kh];B[li];W[kg];B[gl];W[jo]
+C[Leaves bad aji. H7 is better
+];B[ck]
+C[B H7 kills something. See variation.
+];W[bk];B[dh];W[cj];B[if];W[jn]
+;B[hf];W[hl];B[hg];W[gh];B[fi];W[hh];B[nj];W[hk];B[fj];W[fk];B[jg];
+W[ih];B[pn];W[ok];B[om];W[nn];B[qa];W[ph]C[W must S19
+];B[ra];W[jq];
+B[hp]C[Bad
+];W[ir];B[hq];W[kr];B[hr];W[js];B[ls];W[ho];B[sc];W[sb];
+B[rb];W[rc];B[sa];W[sd]C[Better S16
+];B[og];W[se]C[Better T18
+];B[pe];
+W[pg];B[qd];W[sb];B[pa];W[rd];B[pd]C[B can make a ko at S14
+];W[rf];
+B[md]C[
+];W[mk];B[fg];W[po];B[qo];W[on];B[pm];W[oh];B[ni];W[de];B[df];
+W[pp];B[kf];W[lf];B[le];W[pr];B[qq];W[hs];B[gs];W[bg];B[af];W[ae];
+B[is];W[jr];B[ag];W[ha];B[ja];W[kp];B[lp];W[am];B[ah];W[ai];B[pl];
+W[an];B[ao];W[cg];B[ms];W[dg];B[ff];W[jh];B[hs];W[sc]C[O1 is better
+];
+B[mq];W[nr];B[ns];W[eg]C[C12 or R10 is better
+];B[ch];W[bi];B[qj];
+W[ri];B[fd];W[fb];B[ce];W[ee];B[mp];W[ia];B[kb];W[dj];B[pk];W[oj];
+B[oi];W[mj];B[kq];W[ks];B[ki];W[gp];B[di];W[os];B[tt]
+C[..........       Black passed]
+)
diff --git a/regression/games/ego2.sgf b/regression/games/ego2.sgf
new file mode 100644 (file)
index 0000000..d801128
--- /dev/null
@@ -0,0 +1,51 @@
+On April 4, 2002, GNU Go played with Ego in the 19x19 ladder and won.
+Here is the game record.
+
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[FSF-ego(B) NNGS]
+EV[None]
+RE[W+131.5]
+PB[FSF (GNU Go 3.1.30)]BR[17k ]
+PB[ego]BR[NR ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2002-04-04]
+SZ[19]TM[1200]KM[0.5]
+
+;B[qp];W[dp];B[pc];W[oq];B[pq];W[op]C[
+ cerrand started observation.
+]
+;B[cd];W[ec];B[dc];W[ed]C[
+ gunnar started observation.
+]
+;B[df];W[pe];B[qe];W[qf];B[qd];W[pf];B[od];W[qj];B[qm];W[id];B[cq];W[cp]
+;B[dq];W[eq];B[er]C[
+ gunnar 3k : tell 50 No corner for white today. (25)
+]
+;W[fq];B[fr];W[gq];B[bp];W[bo];B[bq];W[cn];B[cg];W[kq];B[pd];W[lc];B[cl]
+;W[ff];B[el];W[dh];B[bi];W[gr];B[om];W[eb];B[db];W[rf];B[re];W[or];B[pr]
+;W[nf];B[rb];W[nk];B[ok];W[oj];B[nj];W[nl];B[ol];W[mj];B[ni];W[mi];B[mk]
+;W[mh];B[oi];W[pj];B[ml];W[nm];B[mn];W[nn];B[no];W[on];B[oo];W[pn];B[og]C[
+ duchamp started observation.
+]
+;W[qn];B[ql];W[rm];B[po];W[mp];B[mo];W[mm];B[rl];W[ro];B[pp];W[nc];B[of]
+;W[pm];B[lm];W[oe];B[oh];W[nd];B[kl];W[ln];B[rj];W[rq];B[eg];W[pl];B[rk]C[
+ coco started observation.
+]
+;W[ko];B[np];W[mq];B[fi];W[hh];B[hi];W[ii];B[hj];W[en];B[gh];W[hg];B[ij]
+;W[ji];B[jj];W[hn];B[eh];W[lj];B[kn];W[lo];B[jo];W[jn];B[kj];W[io];B[ki]
+;W[kk];B[jk];W[lk];B[jl];W[ll];B[km];W[jg];B[kg];W[qh];B[me];W[mf];B[jf]
+;W[kh];B[lh];W[jh];B[lg];W[li];B[mg];W[if];B[je];W[ie];B[jd];W[le];B[jc]
+;W[hb];B[lf];W[ng];B[kf];W[kb];B[ld];W[jb];B[di];W[da];B[ca];W[ea];B[bb]
+;W[bm];B[bl];W[gl];B[gg];W[gf];B[ob];W[nb];B[sf];W[sg];B[se];W[ri];B[fk]
+;W[fs];B[dr];W[fl];B[ek];W[ee];B[em];W[fm];B[dm];W[dn];B[de];W[es];B[ds]
+;W[gs];B[bs];W[oc];B[pb];W[gk];B[ar];W[gj];B[gi];W[oa];B[pa];W[na];B[am]
+;W[an];B[im];W[al];B[bk];W[hm];B[hl];W[hk];B[ik];W[ak];B[aj];W[am];B[in]
+;W[jp];B[ap];W[il];B[jm];W[jo];B[fg];W[fj];B[ej];W[hl];B[dd];W[ao];B[ef]
+;W[cm];B[tt];W[tt]C[
+ bump started observation.
+]
+;)
diff --git a/regression/games/ego3.sgf b/regression/games/ego3.sgf
new file mode 100644 (file)
index 0000000..50ecd73
--- /dev/null
@@ -0,0 +1,56 @@
+W is a program of Bruce Wilcox's called superego. It seems
+slower and stronger than ego. This was played after the
+ladder game on April 4, 2002.
+
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[ego-FSF(B) NNGS]
+EV[None]
+RE[B+Resign]
+PW[ego]WR[NR ]
+PB[FSF (GNU Go 3.1.30)]BR[17k ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2002-04-04]
+SZ[19]TM[1200]KM[0.5]
+
+;B[qd]C[
+ gunnar started observation.
+]
+;W[dp];B[pq];W[dd];B[oc];W[dj];B[cn];W[jd];B[en];W[fq];B[po];W[df]C[
+ cerrand started observation.
+]
+;B[fc];W[dc];B[jq];W[cl]C[
+ ingwa started observation.
+]
+;B[bp];W[cq];B[qj];W[hc];B[gn];W[mc]C[
+ coco started observation.
+]
+;B[me];W[nd];B[mg];W[mi];B[oj];W[oi];B[qg];W[nj];B[ok];W[og];B[ml];W[fd]
+;B[lh];W[nf];B[ne];W[kc];B[mq];W[nh];B[li];W[oe];B[fj];W[fi];B[gi];W[ei]
+;B[jg];W[od];B[pc];W[hh];B[hi];W[gh];B[hp]C[
+ Micke started observation.
+]
+;W[bq];B[lk];W[bo];B[bn];W[ap];B[fk];W[hq];B[iq];W[hr];B[ir];W[ji];B[ih]
+;W[ii];B[hj];W[jk];B[ij];W[jj]C[
+ duchamp started observation.
+]
+;B[hg];W[kg];B[kf];W[mf];B[lf]C[
+ pem started observation.
+]
+;W[lj];B[kh];W[kj];B[ld];W[ie];B[ph];W[kd];B[pf];W[ng];B[jm];W[ge];B[hs]
+;W[bm];B[gs];W[gq];B[nb];W[lc];B[ka];W[el];B[fl];W[em];B[er];W[kl];B[eq]
+;W[fn];B[ep]C[
+ beckham started observation.
+ guest started observation.
+ morlvera started observation.
+]
+;W[eo];B[fm];W[dn];B[fp];W[an];B[km];W[pi];B[qi];W[nk];B[nl];W[lm];B[ll]
+;W[mk];B[ia];W[gb];B[ik];W[of];B[fo];W[jc];B[jl];W[kk];B[mb];W[ek];B[pk]C[
+ bump started observation.
+]
+;W[jb];B[ja];W[en];B[pe];W[kb];B[lb];W[dr];B[dq];W[cr];B[ds];W[ib];B[ha]
+;W[mn];B[ga]
+;)
diff --git a/regression/games/endgame10.sgf b/regression/games/endgame10.sgf
new file mode 100644 (file)
index 0000000..730d83d
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.4 load and print]
+DT[2003-08-11]
+KM[0.0]AP[GNU Go:3.4]RU[Japanese]
+;AW[ea][eb][fb][rb][sb][ec][sc][dd][ed][kd][rd][ce][de][ie][oe]
+[qe][re][cf][ef][nf][of][pf][qf][rf][bg][cg][dg][fg][hg][kg][lg]
+[mg][og][pg][sg][ah][ch][eh][fh][hh][ih][jh][lh][qh][sh][hi][pi]
+[qi][ri][cj][gj][hj][ij][sj][bk][ck][gk][ik][jk][ok][rk][dl][il]
+[jl][kl][nl][ol][ql][rl][bm][cm][dm][em][im][om][bn][gn][hn][in]
+[nn][qn][bo][co][go][io][jo][mo][bp][cp][gp][ip][kp][lp][mp][np]
+[op][pp][bq][gq][hq][iq][lq][mq][qq][ar][fr][hr][pr][qr][gs][os]
+[ps]
+AB[fa][ga][ra][gb][qb][fc][kc][lc][qc][rc][fd][hd][id][od][pd]
+[qd][ee][fe][je][me][ne][pe][ff][gf][hf][kf][mf][sf][ig][jg][ng]
+[qg][rg][bh][dh][kh][mh][nh][oh][ph][bi][ci][di][ei][fi][ii][ji]
+[ki][li][ni][oi][bj][jj][oj][pj][qj][rj][dk][ek][fk][hk][kk][lk]
+[nk][qk][el][gl][hl][ll][ml][fm][hm][jm][km][lm][nm][cn][dn][en]
+[fn][jn][ln][mn][do][fo][ko][lo][ap][ep][fp][jp][cq][dq][fq][jq]
+[kq][nq][oq][pq][br][er][ir][jr][lr][mr][nr][or][bs][cs][is][ns]
+PL[B]IL[df][eg][rh][si][gr])
diff --git a/regression/games/endgame11.sgf b/regression/games/endgame11.sgf
new file mode 100644 (file)
index 0000000..22153a8
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.4 load and print]
+DT[2003-08-11]
+KM[5.5]AP[GNU Go:3.4]RU[Japanese]
+;AW[ha][ia][pa][qa][sa][hb][nb][ob][pb][qb][rb][ac][bc][ec][fc]
+[gc][hc][ic][jc][nc][pc][qc][rc][sc][bd][cd][dd][id][sd][ce][ie]
+[ke][ne][oe][pe][if][jf][kf][lf][mf][nf][gg][jg][lg][og][hh][ih]
+[lh][gi][mi][dj][gj][jj][mj][qj][hk][ik][nk][pk][qk][el][fl][hl]
+[jl][nl][pl][ql][dm][em][jm][om][rm][cn][dn][en][fn][gn][jn][pn]
+[qn][sn][co][go][oo][ro][cp][dp][ep][jp][np][op][aq][bq][dq][eq]
+[iq][jq][lq][mq][nq][cr][dr][jr][lr][es][hs][is][ls][ms]
+AB[ja][ma][na][oa][ib][jb][kb][mb][lc][mc][oc][ad][ed][fd][gd]
+[hd][jd][kd][ld][nd][od][pd][qd][rd][ae][be][de][he][je][le][me]
+[qe][se][bf][cf][df][hf][of][pf][rf][hg][ig][mg][ng][dh][fh][gh]
+[mh][nh][oh][ph][fi][ni][qi][fj][nj][oj][pj][rj][dk][ek][fk][gk]
+[ok][rk][bl][dl][gl][il][ol][rl][sl][cm][fm][gm][hm][im][sm][bn]
+[hn][in][bo][do][eo][fo][po][qo][ap][bp][fp][gp][hp][ip][mp][pp]
+[rp][fq][hq][oq][qq][er][fr][gr][hr][ir][mr][nr][pr][ns]
+PL[W]IL[md][re][qp][gq][pq])
diff --git a/regression/games/endgame12.sgf b/regression/games/endgame12.sgf
new file mode 100644 (file)
index 0000000..2b2d7a5
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[7]HA[0]KM[0.5]
+DT[2005-09-09]
+;AW[da][ea][dc][ec][ce][de][ee][ge][af][bf][cf][ef][ff][dg][fg][gg]
+AB[ba][fa][ab][bb][fb][gb][bc][fc][bd][cd][fd][gd][ae][be][fe]
+)
diff --git a/regression/games/endgame13.sgf b/regression/games/endgame13.sgf
new file mode 100644 (file)
index 0000000..dde1f00
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]HA[0]KM[0.5]
+;AW[ba][da][fa][bb][cb][db][eb][fb][ac][bc][fc][hd][he][hf][if][cg][dg][eg][fg][gg][hg][ch][eh][hh][ei][hi]
+AB[ga][ha][gb][ib][cc][dc][ec][gc][hc][ic][ad][bd][fd][gd][ce][ie][af][bf][bg][ah][bh][bi][di]
+;B[ci]
+)
diff --git a/regression/games/endgame14.sgf b/regression/games/endgame14.sgf
new file mode 100755 (executable)
index 0000000..4275225
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]
+CA[ISO8859_1]AP[GoGui:0.9.3]SZ[9]KM[6.5]
+DT[2007-01-07]
+PL[B]AW[ae][be][ce][de][fe][df][ff][gf][dg][eg][fg][hg][fh][hh][ei]
+AB[gb][ad][bd][cd][dd][ed][fd][gd][ge][he][ef][hf][if][gg][gh]
+)
diff --git a/regression/games/endgame2.sgf b/regression/games/endgame2.sgf
new file mode 100644 (file)
index 0000000..983f725
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-02-12]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ga][db][gb][jb][qb][sb][dc][fc][qc][rc][bd][cd][ed][pd][rd][sd][ae][be][de][he][ie][oe][pe][qe][se][gf][if][jf][kf][lf][mf][nf][of][qf][rf][bg][gg][qg][bh][gh][kh][lh][mh][nh][oh][ph][qh][ci][ei][fi][gi][ki][qi][cj][ej][kj][rj][sj][bk][ek][jk][kk][mk][nk][ok][sk][bl][cl][el][jl][ml][ol][bm][em][jm][lm][nm][en][in][jn][ln][nn][on][eo][fo][go][ho][jo][mo][po][fp][ip][jp][np][op][pp][jq][nq][ir][kr][mr][or][pr][js][ps]
+AB[pa][qa][ra][sa][hb][ib][pb][rb][bc][cc][gc][jc][kc][oc][pc][gd][hd][id][od][fe][ge][je][ke][le][me][ne][af][bf][cf][df][ef][ag][fg][dh][eh][fh][li][mi][ni][pi][lj][nj][pj][ck][dk][lk][qk][rk][dl][kl][ll][sl][cm][dm][km][om][pm][qm][rm][bn][dn][kn][pn][bo][co][do][ko][lo][qo][ep][hp][lp][qp][dq][fq][gq][hq][iq][lq][oq][pq][qq][hr][lr][qr][ls][qs]
+PL[W];W[qj];B[pk];W[am];B[ha];W[fb];B[ah];W[ai];B[ms];W[an];B[ns];
+W[nr];B[ao];W[pl];B[ql];W[cg];B[dg];W[ch];B[hs];W[sc]
+)
diff --git a/regression/games/endgame3.sgf b/regression/games/endgame3.sgf
new file mode 100644 (file)
index 0000000..d8832ce
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-07]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ca][cb][db][eb][fb][gb][hb][cc][hc][ic][cd][dd][id][de][he][af][cf][df][bg][cg][fg][ah][ch][dh][eh][fh][bi][fi]
+AB[ba][bb][bc][ec][fc][gc][bd][ed][gd][hd][ae][be][ce][fe][ie][bf][ef][ff][if][dg][eg][gg][hg][gh][ih][gi][hi]
+)
diff --git a/regression/games/endgame4.sgf b/regression/games/endgame4.sgf
new file mode 100644 (file)
index 0000000..48ea0db
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-12]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ca][cb][bc][cc][bd][dd][fd][ae][be][ce][de][fe][ge][hf][if][cg][gg][hg][ch][dh][eh][fh][gh][ci]
+AB[da][ga][db][gb][dc][ec][fc][gc][gd][hd][he][ie][af][bf][df][ff][gf][bg][dg][eg][fg][ah][bh][bi]
+)
diff --git a/regression/games/endgame5.sgf b/regression/games/endgame5.sgf
new file mode 100644 (file)
index 0000000..15fffce
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-09-16]
+SY[Cgoban 1.9.12]TM[30:00(5x1:00)];
+AW[fa][eb][fb][ec][ed][fd][de][fe][ef][ff][fg][gg][gh][gi]
+AB[da][ea][bb][db][cc][cd][dd][ce][cf][df][eg][eh][fh][ei][fi]
+)
diff --git a/regression/games/endgame6.sgf b/regression/games/endgame6.sgf
new file mode 100644 (file)
index 0000000..c834212
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-09-29]
+SY[Cgoban 1.9.12]TM[5:00:00(5x1:00)];
+AW[ea][eb][fb][gb][hb][ac][bc][cc][dc][ec][gc][dd][de][ee][fe][ge][cf][df][gf][cg][bh][ch]
+AB[ga][ha][ia][hc][ic][ed][fd][hd][he][ie][ef][ff][hf][dg][eg][gg][hg][ig][dh]
+PL[B]
+;B[ib]
+)
diff --git a/regression/games/endgame7.sgf b/regression/games/endgame7.sgf
new file mode 100644 (file)
index 0000000..fbef7d1
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-09-29]
+SY[Cgoban 1.9.12]TM[5:00:00(5x1:00)];PL[W]
+AW[ca][cb][ac][bc][cc][cd][dd][ed][fd][be][de][bf][cf][df][ef][ff][bg][bh][ch][dh][eh][ci]
+AB[da][db][dc][ec][fc][gc][gd][hd][ee][fe][he][ie][gf][hf][dg][fg][gg][fh][fi]
+;W[eg]
+)
diff --git a/regression/games/endgame8.sgf b/regression/games/endgame8.sgf
new file mode 100644 (file)
index 0000000..818b7f3
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-09-29]
+SY[Cgoban 1.9.12]TM[5:00:00(5x1:00)];PL[W]
+AW[da][ha][ia][ab][bb][cb][db][fb][gb][hb][dc][ec][gc][cd][ed][fd][gd][ce][ge][cf][dg][fg][dh][fh][gh][hh][ih][di][ei][fi][hi]
+AB[ib][ac][bc][cc][hc][bd][dd][hd][id][ae][de][ee][he][bf][df][ff][gf][if][bg][cg][eg][gg][hg][ig][ch][ci]
+)
diff --git a/regression/games/endgame9.sgf b/regression/games/endgame9.sgf
new file mode 100644 (file)
index 0000000..7161a5d
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.4 load and print]
+DT[2003-08-11]
+KM[1.0]AP[GNU Go:3.4]RU[Japanese]
+;AW[da][ea][eb][fb][gb][pb][qb][ec][gc][hc][ic][jc][kc][lc][mc]
+[nc][oc][pc][hd][jd][ld][ie][pe][ef][lf][mf][of][pf][dg][eg][kg]
+[ng][pg][ch][dh][eh][fh][gh][jh][lh][mh][nh][oh][bi][fi][hi][ii]
+[ki][oi][pi][si][aj][bj][cj][fj][gj][hj][jj][kj][lj][mj][oj][qj]
+[rj][sj][dk][hk][qk][cl][gl][hl][il][ql][dm][hm][km][lm][mm][qm]
+[bn][cn][dn][gn][hn][kn][pn][rn][ao][bo][do][eo][ho][ko][oo][po]
+[ap][gp][hp][jp][kp][lp][pp][qp][gq][hq][iq][lq][oq][pq][rq][lr]
+[nr][or][ks][os]
+AB[ca][qa][ra][cb][db][rb][dc][fc][qc][dd][ed][fd][gd][kd][md]
+[nd][od][pd][qd][be][ce][ee][ge][he][je][ke][le][me][ne][bf][df]
+[ff][hf][if][jf][kf][nf][qf][bg][cg][gg][jg][qg][ah][bh][hh][ih]
+[ph][qh][sh][ai][ci][di][ei][li][ni][qi][ri][ej][ij][nj][pj][ek]
+[fk][gk][ik][jk][kk][lk][mk][ok][pk][jl][ml][nl][ol][pl][em][fm]
+[gm][jm][nm][pm][fn][jn][mn][on][qn][co][fo][go][no][ro][bp][cp]
+[dp][ep][fp][np][op][rp][aq][bq][fq][jq][kq][mq][nq][gr][hr][ir]
+[jr][kr][mr][ls][ms][ns]
+PL[B]IL[og][kh][gi][ji])
diff --git a/regression/games/explorer.sgf b/regression/games/explorer.sgf
new file mode 100644 (file)
index 0000000..3516143
--- /dev/null
@@ -0,0 +1,38 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[GnuGo-ex63(B) NNGS]
+EV[None]
+RE[W+91.5]
+PW[GnuGo]WR[16k*]
+PB[ex63]BR[15k ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-12-18]
+SZ[19]TM[1200]KM[0.5]
+
+;B[qq];W[dp];B[qd];W[dd];B[kq];W[dj];B[jc];W[fc];B[ql];W[ce];B[gb];W[fq]
+;B[gc];W[co];B[iq];W[od];B[gp];W[pf];B[qf];W[qg];B[re];W[qj];B[pe];W[pg]
+;B[oe];W[qo];B[oo];W[nd];B[ld];W[ng];B[rg];W[rh];B[pn];W[ne];B[of];W[nh]
+;B[pp];W[rm];B[rl];W[nf];B[gq];W[oj];B[fr];W[qm];B[pm];W[pl];B[pk];W[ol]
+;B[qk];W[ok];B[pj];W[pi];B[rj];W[qi];B[ri];W[sg];B[sk];W[si];B[sm];W[rn]
+;B[ro];W[rp];B[rq];W[fp];B[qn];W[er];B[pb];W[fb];B[rf];W[lf];B[fo];W[go]
+;B[fn];W[gr];B[hr];W[hn];B[gs];W[hl];B[dm];W[cg];B[gm];W[cl];B[bn];W[cm]
+;B[fk];W[cn];B[hm];W[io];B[im];W[ko];B[mm];W[kp];B[km];W[mo];B[gn];W[fi]
+;B[nn];W[kd];B[kc];W[ke];B[mc];W[ob];B[pc];W[na];B[he];W[ff];B[if];W[lb]
+;B[lc];W[mk];B[hh];W[gj];B[pd];W[hi];B[gh];W[fj];B[so];W[pa];B[fh];W[dg]
+;B[mb];W[nb];B[kb];W[qa];B[rc];W[kk];B[jl];W[ik];B[ll];W[kj];B[fa];W[ea]
+;B[ga];W[db];B[es];W[dr];B[ds];W[cs];B[fs];W[cr];B[sf];W[sh];B[kh];W[gd]
+;B[ib];W[hd];B[ji];W[lh];B[kg];W[in];B[jf];W[id];B[ij];W[jk];B[ge];W[hj]
+;B[fe];W[ef];B[eh];W[gf];B[je];W[jd];B[kl];W[ek];B[fl];W[em];B[hc];W[eo]
+;B[ma];W[ln];B[kn];W[np];B[en];W[el];B[fm];W[dn];B[qp];W[lq];B[mn];W[jq]
+;B[lo];W[kr];B[lm];W[lp];B[ln];W[ho];B[hp];W[or];B[oq];W[nr];B[nq];W[ip]
+;B[ir];W[pr];B[mq];W[mr];B[mp];W[pq];B[no];W[qr];B[rr];W[jn];B[ss];W[jr]
+;B[js];W[sa];B[ks];W[lk];B[ls];W[lr];B[ms];W[ns];B[is];W[og];B[rb];W[ra]
+;B[sb];W[nl];B[qs];W[ps];B[rs];W[me];B[ic];W[gk];B[jm];W[qb];B[le];W[kf]
+;B[om];W[il];B[nm];W[gl];B[ml];W[nc];B[sj];W[qh];B[md];W[oc];B[qc];W[oa]
+;B[tt];W[tt]
+;)
+
+
diff --git a/regression/games/explorer2.sgf b/regression/games/explorer2.sgf
new file mode 100644 (file)
index 0000000..2306f6e
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+SZ[19]KM[0.5]
+PW[FSF]
+WR[17k]
+PB[ex63]
+BR[15k]
+DT[2001-01-15]
+SY[Cgoban 1.9.10];B[qq];W[dd];B[cq];W[pc];B[cl];W[pe];B[kc];W[pp];
+B[pq];W[op];B[ro];W[pm];B[nr];W[mp];B[nc];W[fc];B[iq];W[ce];B[lr];
+W[ic];B[ch];W[nd];B[jb];W[mc];B[oc];W[mb];B[md];W[od];B[ld];W[ib];
+B[jd];W[kp];B[kq];W[he];B[mf];W[qg];B[of];W[qj];B[fq];W[lp];B[do];
+W[dg];B[cg];W[bf];B[em];W[dh];B[cj];W[ai];B[bi];W[ah];B[jp];W[jf];
+B[hn];W[ne];B[ph];W[me];B[mi];W[le];B[gl];W[qh];B[pi];W[kf];B[fj];
+W[cf];B[pj];W[qi];B[ql];W[qn];B[rm];W[kn];B[io];W[gg];B[nf];W[pl];
+B[nk];W[rn];B[sn];W[mn];B[jl];W[qk];B[rk];W[qm];B[ij];W[rl];B[qo];
+W[po];B[qp];W[sm];B[aj];W[ag];B[db];W[cb];B[cc];W[bb];B[dc];W[bc];
+B[ll];W[so];B[sp];W[fh];B[ki];W[nm];B[sn];W[di];B[dj];W[so];B[hi];
+W[sn];B[jn];W[lq];B[jq];W[lh];B[li];W[mh];B[nh];W[ok];B[nj];W[oj];
+B[oi];W[hh];B[gi];W[ei];B[ej];W[oq];B[or];W[pf];B[kh];W[lg];B[ih];
+W[hg];B[lf];W[kg];B[km];W[ko];B[ol];W[pk];B[nl];W[ke];B[om];W[kd];
+B[on];W[lm];B[pn];W[no];B[lo];W[nq];B[nn];W[mm];B[ci];W[mr];B[ms];
+W[kr];B[ir];W[ls];B[oo];W[jr];B[js];W[ig];B[jh];W[ml];B[lk];W[mk];
+B[mj];W[pg];B[og];W[mg];B[ng];W[fi];B[jo];W[bg];B[oe];W[jg];B[gh];
+W[bh];B[is];W[ns];B[rq];W[pr];B[ks];W[qr];B[rr];W[lr];B[qs];W[os];
+B[rs];W[ps];B[tt]AE[lo][rk][md][ld][kc][jb][jd][nc][oc][cc][db][dc]
+)
diff --git a/regression/games/eyes1.sgf b/regression/games/eyes1.sgf
new file mode 100644 (file)
index 0000000..75d3d38
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-04-06]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ah][bi][fi][gi][hi][bj][ej][fj][ak][bk][ck][dk][fk][jk][dl][el][jl][dm][im][jm][gn][hn][in][ao][do][io][bp][dp][ip][mp][np][aq][bq][cq][dq][eq][iq][mq][er][ir][mr][nr][es][is][ms]
+AB[af][bf][bg][bh][ch][dh][di][aj][hj][ij][gk][ik][fl][gl][hl][am][bm][cm][em][gm][bn][dn][en][fn][bo][co][kp][lp][lq][ar][br][cr][dr][fr][gr][hr][kr][lr][or][pr][bs][ds][hs][js][ls][ns][ps]
+)
diff --git a/regression/games/eyes2.sgf b/regression/games/eyes2.sgf
new file mode 100644 (file)
index 0000000..a4c4237
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-04-06]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[nd][ne][af][mf][of][bg][mg][og][bh][nh][ai][bi][ni][aj][mj][oj][ak][mk][ok][bl][cl][dl][nl][bm][em][fm][gm][hm][im][nm][an][bn][cn][dn][fn][in][nn][do][fo][go][ho][io][jo][lo][mo][oo][dp][ip][kp][mp][op][pp][qp][rp][aq][dq][iq][mq][nq][oq][dr][ir][nr][ds][is][ns]
+AB[bd][be][le][me][oe][pe][qe][bf][cf][lf][qf][cg][lg][qg][ch][lh][oh][qh][ci][ki][li][mi][oi][pi][qi][bj][cj][dj][ej][kj][qj][ek][kk][qk][al][el][fl][gl][hl][il][jl][kl][ll][ml][ol][pl][ql][km][en][hn][kn][ln][mn][on][pn][qn][ao][bo][eo][ko][bp][ep][fp][gp][hp][jp][lp][np][bq][eq][hq][jq][lq][sq][ar][br][cr][er][fr][gr][hr][jr][kr][lr][mr][pr][qr][rr][cs][es][hs][ms][os][rs]
+)
diff --git a/regression/games/eyes3.sgf b/regression/games/eyes3.sgf
new file mode 100644 (file)
index 0000000..1024644
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-04-06]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ga][ha][ma][qa][sa][ab][jb][qb][dc][hc][ic][jc][oc][pc][qc][rc][sc][jd][sd][ae][ce][je][me][re][ef][if][kf][lf][nf][rf][eg][ig][kg][lg][ng][rg][bh][ih][kh][sh][ii][ji][ki][li][si][cj][fj][gj][hj][lj][qj][rj][sj][gk][ik][jk][kk][lk][mk][qk][al][cl][gl][nl][fm][hm][jm][qm][an][fn][hn][jn][kn][ln][nn][on][qn][fo][ho][jo][oo][po][qo][ro][ap][ep][fp][gp][hp][ip][jp][mp][op][rp][sp][cq][dq][eq][jq][kq][pq][rq][sq][dr][jr][pr][qr][rr][ds][js][ps][qs]
+AB[aa][ca][ea][ia][ja][ka][oa][cb][eb][fb][gb][hb][lb][mb][nb][ob][ac][bc][cc][ec][lc][mc][nc][bd][dd][ed][fd][hd][ld][od][qd][rd][be][de][fe][ge][he][ie][ke][le][ne][oe][qe][bf][df][ff][jf][mf][qf][ag][bg][cg][dg][fg][qg][dh][eh][gh][hh][jh][qh][rh][ai][bi][ci][di][hi][bj][dj][ij][jj][bk][dk][hk][nk][ok][pk][rk][sk][bl][dl][el][fl][hl][il][jl][kl][ll][ml][ql][rl][am][bm][cm][dm][em][gm][mm][nm][om][pm][rm][bn][en][mn][rn][bo][do][lo][no][so][bp][cp][dp][lp][np][pp][aq][bq][lq][nq][qq][br][cr][er][fr][gr][hr][ir][lr][mr][nr][or][sr][cs][es][is][ks][os][rs]
+)
diff --git a/regression/games/eyes_edge.sgf b/regression/games/eyes_edge.sgf
new file mode 100644 (file)
index 0000000..ba553d2
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-01-20]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[da][ma][qa][ra][sa][db][mb][cc][dc][mc][nc][oc][cd][od][pd][qd][rd][sd][ae][be][ce][ao][bo][co][do][eo][fo][go][ho][io][jo][ko][lo][mo][no][oo][po][qo][ro][so][fp][np][pp][fq][nq][oq][pq][ar][br][cr][fr][jr][kr][nr][sr][fs][js][ls][ns][rs]
+AB[ca][oa][bb][cb][ob][pb][qb][rb][bc][rc][sc][ad][bd][rp][sp][aq][bq][cq][dq][hq][iq][jq][kq][lq][mq][rq][dr][hr][mr][pr][qr][rr][bs][ds][hs][is][ms][ps]
+)
diff --git a/regression/games/filllib1.sgf b/regression/games/filllib1.sgf
new file mode 100644 (file)
index 0000000..b9d911e
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[gnugo 94]
+PB[xgo]
+GN[gnugo 94 (W) vs. xgo (B)]
+DT[2000-11-30]
+SY[Cgoban 1.9.2]TM[10:00:00+1:00/5]
+RE[B+15.5]
+;B[tt]BL[35999];W[fc]WL[36000];B[tt]BL[35998];W[hc]WL[36000];B[cf]
+BL[35996];W[cc]WL[36000];B[ge]BL[35991];W[gg]WL[36000];B[eg]BL[35985];
+W[eh]WL[35996];B[dh]BL[35984];W[fh]WL[35989];B[ef]BL[35979];W[he]
+WL[35985];B[gf]BL[35978];W[hf]WL[35980];B[dc]BL[35970];W[dd]WL[35970];
+B[gd]BL[35969];W[db]WL[35935];B[hd]BL[35947];W[gc]WL[35932];B[id]
+BL[35945];W[ic]WL[35929];B[if]BL[35937];W[ig]WL[35917];B[ie]BL[35927];
+W[hg]WL[35910];B[hi]BL[35922];W[ei]WL[35908];B[gi]BL[35918];W[di]
+WL[35906];B[ch]BL[35917];W[gh]WL[35905];B[cd]BL[35907];W[bd]WL[35902];
+B[ce]BL[35903];W[bc]WL[35899];B[be]BL[35901];W[ci]WL[35899];B[bh]
+BL[35899];W[hh]WL[35898];B[ii]BL[35897];W[de]WL[35898];B[df]BL[35891];
+W[ae]WL[35892];B[af]BL[35880];W[ad]WL[35873];B[ed]BL[35880];W[ec]
+WL[35868];B[ee]BL[35879];W[dc]WL[35867];B[fd]BL[35877];W[fi]WL[35867];
+B[tt]BL[35871];W[ih]WL[35867];B[hi]BL[35868];W[gi]WL[35866];B[tt]
+BL[35866];W[ii]WL[35866];B[tt]BL[35865];W[tt]WL[35866];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ab][bb][cb][eb][fb][gb][hb][ib][ac]
+TB[fe][he][bf][ff][hf][ag][bg][cg][dg][fg][gg][hg][ig][ah][eh][fh][gh][hh][ih][ai][bi][ci][di][ei][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 18 territory + 5 captures + 5.5 komi = 28.5
+   Black = 28 territory + 16 captures = 44
+Black wins by 15.5.
+]
+)
diff --git a/regression/games/filllib10.sgf b/regression/games/filllib10.sgf
new file mode 100644 (file)
index 0000000..d194c31
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[koba]BR[NR]
+PC[NNGS]DT[2002-03-10]AP[gnugoclient:2.0]
+RE[B+2.5]
+;B[qd];W[dp];B[qp];W[cd];B[cn];W[oc];B[mc];W[oe];B[qf];W[og];B[pc]
+;W[ob];B[pb];W[oq];B[pq];W[op];B[pn];W[ec];B[lq];W[pr];B[qr];W[nr]
+;B[ps];W[cj];B[cp];W[cq];B[dr];W[cr];B[dq];W[eq];B[er];W[fq];B[fr]
+;W[bp];B[co];W[eo];B[bo];W[dm];B[cm];W[gq];B[gr];W[hr];B[bq];W[ql]
+;B[mn];W[qi];B[qk];W[br];B[ap];W[pk];B[pj];W[pl];B[qj];W[ip];B[jq]
+;W[id];B[jc];W[ic];B[jd];W[ph];B[oj];W[rn];B[ro];W[nl];B[nn];W[os]
+;B[or];W[ni];B[nj];W[cg];B[gd];W[gb];B[ed];W[dc];B[ff];W[fh];B[cf]
+;W[df];B[de];W[bf];B[ce];W[ef];B[dg];W[eg];B[bg];W[ch];B[be];W[mg]
+;B[lj];W[ll];B[ml];W[qm];B[rl];W[qo];B[qn];W[pd];B[pe];W[od];B[rh]
+;W[ri];B[rm];W[je];B[kd];W[mk];B[mm];W[jl];B[lk];W[km];B[ko];W[in]
+;B[jj];W[hj];B[ie];W[ee];B[dd];W[bd];B[af];W[fe];B[fd];W[bh];B[hb]
+;W[gc];B[hc];W[hd];B[ib];W[he];B[fc];W[fb];B[eb];W[cb];B[fa];W[db]
+;B[ga];W[bc];B[if];W[hf];B[hg];W[ig];B[jf];W[ge];B[ih];W[pa];B[qb]
+;W[rg];B[rf];W[qh];B[qg];W[sh];B[sf];W[jg];B[kf];W[jh];B[ii];W[gg]
+;B[hh];W[lg];B[kg];W[kh];B[nh];W[oh];B[mi];W[me];B[lh];W[pf];B[qe]
+;W[ik];B[jk];W[mb];B[lb];W[nc];B[ma];W[nb];B[md];W[nd];B[nf];W[ng]
+;B[oa];W[mh];B[li];W[na];B[of];W[la];B[kb];W[pg];B[ka];W[le];B[ke]
+;W[cl];B[bl];W[bk];B[bm];W[dl];B[io];W[jp];B[ho];W[jo];B[kp];W[iq]
+;B[jr];W[qa];B[ra];W[oa];B[oi];W[rb];B[qc];W[rc];B[rd];W[sa];B[sg]
+;W[sd];B[rh];W[si];B[sc];W[gh];B[il];W[hi];B[jm];W[hl];B[im];W[hn]
+;B[hm];W[gm];B[kl];W[jn];B[jl];W[ij];B[ji];W[kn];B[lm];W[ln];B[lo]
+;W[gs];B[ar];W[bs];B[as];W[aq];B[ar];W[ds];B[hp];W[gl];B[hq];W[ir]
+;B[gn];W[fn];B[hs];W[is];B[js];W[go];B[aj];W[ah];B[ak];W[lf];B[ld]
+;W[ns];B[lr];W[mp];B[mq];W[nq];B[mo];W[ol];B[po];W[np];B[bj];W[ck]
+;B[bi];W[nk];B[mj];W[do];B[dn];W[ag];B[bf];W[ci];B[en];W[em];B[aq]
+;W[fs];B[as];W[es];B[ad];W[ba];B[ac];W[ab];B[ae];W[rj];B[rk];W[da]
+;B[sk];W[ea];B[fb];W[nh];B[ma];W[se];B[re];W[rg];B[al];W[rh];B[la]
+;W[sj];B[];W[pi];B[];W[sd];B[se];W[ai];B[];W[]
+C[R15 removed
+T17 removed
+O14 removed
+S6 removed
+R7 removed
+P4 removed
+H5 removed
+K13 removed
+final_score: B+1.5
+F14 removed
+D13 removed]
+)
diff --git a/regression/games/filllib11.sgf b/regression/games/filllib11.sgf
new file mode 100644 (file)
index 0000000..aaf1d6f
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.31 (level 10) load and print]PB[Unknown]HA[0]KM[0.5]GN[GNU Go 3.1.31 load and print Random Seed 1018605850] 
+AW[ga][ja][ka][qa][fb][gb][ib][jb][qb][rb][ec][gc][jc][rc][ad][dd][ed][hd][id][qd][rd][ae][be][ce][de][fe][ge][ie][oe][qe][ff][if][jf][kf][mf][of][qf][dg][eg][lg][mg][ng][og][qg][ch][eh][fh][kh][nh][qh][bi][ci][di][ji][ki][mi][ni][pi][qi][bj][ij][jj][kj][mj][rj][ak][bk][ck][jk][lk][nk][rk][bl][cl][el][hl][jl][ll][rl][dm][em][fm][gm][hm][im][mm][qm][dn][en][hn][mn][qn][rn][sn][co][do][eo][fo][lo][mo][no][oo][ro][so][dp][gp][hp][ip][jp][kp][lp][rp][dq][eq][hq][mq][er][ds][es][fs]
+AB[da][ea][fa][la][pa][cb][eb][kb][mb][pb][ac][bc][dc][fc][ic][kc][nc][pc][qc][bd][cd][jd][od][pd][he][je][ke][le][me][ne][pe][gf][hf][lf][nf][pf][fg][gg][ig][jg][kg][pg][gh][jh][oh][ph][ei][fi][gi][ii][oi][cj][dj][hj][nj][oj][pj][qj][dk][ek][fk][hk][ik][mk][pk][qk][al][dl][fl][gl][il][ml][nl][ol][ql][am][bm][cm][jm][lm][nm][pm][cn][fn][gn][in][jn][ln][nn][on][pn][bo][go][po][qo][bp][cp][fp][mp][np][op][qp][sp][cq][fq][gq][iq][jq][kq][lq][pq][rq][sq][cr][dr][fr][gr][hr][cs][gs][is]
+PL[W]
+IL[db][cc][ok][pl][om][pp][hs]
+)
diff --git a/regression/games/filllib12.sgf b/regression/games/filllib12.sgf
new file mode 100644 (file)
index 0000000..d781f86
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.14 load and print]
+DT[2003-01-02]
+KM[5.5]AP[GNU Go:3.3.14]RU[Japanese]
+;AW[ca][da][ea][ja][ka][ma][na][oa][bb][eb][fb][kb][nb][sb][ac]
+[cc][dc][kc][lc][mc][nc][bd][dd][ed][id][jd][kd][nd][pd][ae][ce]
+[de][ie][je][ne][oe][pe][qe][bf][cf][ff][gf][if][kf][lf][nf][pf]
+[qf][rf][cg][dg][fg][gg][hg][ig][jg][kg][ng][pg][rg][sg][ih][rh]
+[sh][li][mi][oi][ij][jj][lj][mj][oj][pj][qj][bk][gk][ik][lk][ok]
+[pk][rk][bl][el][fl][gl][hl][il][kl][ll][ml][nl][ol][ql][sl][bm]
+[em][fm][im][km][mm][rm][an][fn][hn][in][jn][kn][ln][on][sn][ao]
+[do][oo][po][qo][ro][so][ap][dp][ep][jp][mp][op][pp][qp][bq][eq]
+[fq][gq][hq][iq][jq][kq][mq][nq][oq][ar][br][cr][dr][jr][kr][mr]
+[nr][or][pr][js][ms][os]
+AB[fa][ga][ia][pa][gb][hb][jb][ob][pb][rb][ec][fc][gc][ic][jc]
+[oc][pc][qc][rc][fd][hd][ld][md][od][qd][sd][ee][fe][ge][he][ke]
+[le][me][re][se][af][df][ef][hf][mf][of][sf][ag][bg][eg][lg][mg]
+[og][qg][ah][ch][dh][eh][fh][gh][hh][jh][kh][lh][mh][nh][oh][ph]
+[qh][ai][bi][hi][ii][ji][ki][ni][pi][qi][ri][si][aj][gj][hj][kj]
+[nj][rj][sj][ak][ck][ek][fk][hk][jk][kk][mk][nk][sk][al][dl][jl]
+[pl][am][cm][dm][gm][hm][jm][nm][om][pm][qm][bn][dn][en][gn][mn]
+[nn][pn][qn][rn][co][eo][fo][go][ho][io][jo][ko][lo][mo][no][bp]
+[cp][fp][gp][hp][ip][kp][lp][np][rp][sp][cq][dq][lq][pq][qq][sq]
+[lr][qr][rr][sr][ks][ls][ps][qs]
+PL[B])
diff --git a/regression/games/filllib13.sgf b/regression/games/filllib13.sgf
new file mode 100644 (file)
index 0000000..ba3e7a4
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-12-10]
+SY[Cgoban 1.9.14]TM[-];
+AW[ea][fa][ga][ha][db][eb][dc][gc][hc][ic][cd][dd][ed][gd][ce][ge][bf][cf][df][gf][cg][gg][hg][ch][gh][bi][di][ei]
+AB[ia][fb][gb][hb][ib][ec][fc][fd][hd][de][ee][fe][he][ie][ef][hf][dg][eg][fg][ig][dh][fh][hh][ih][fi][gi][hi][ii]
+)
diff --git a/regression/games/filllib14.sgf b/regression/games/filllib14.sgf
new file mode 100644 (file)
index 0000000..278f967
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]CA[UTF-8]
+HA[2]SZ[19]RU[AGA]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[colaTurca]WR[8k]BR[10k]DT[2004-05-06]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]RE[W+Resign]
+;W[dc];B[pp];W[nc];B[ce];W[ed];B[cc];W[nq];B[oq];W[np];B[op];W[no];B[jq];W[cn];B[dn];W[dm];B[co];W[en];B[do];W[cm];B[em];W[fn];B[el]
+;W[cj];B[ej];W[kc];B[ch];W[qf];B[qc];W[qi];B[oe];W[fp];B[fq];W[gq];B[eq];W[gp];B[gm];W[ip];B[jp];W[io];B[jo];W[in];B[jn];W[im];B[gn]
+;W[jm];B[go];W[cb];B[bc];W[ql];B[qn];W[ge];B[jj];W[fm];B[gl];W[ep];B[cq];W[km];B[iq];W[hr];B[ir];W[lo];B[lr];W[nr];B[or];W[fr];B[er]
+;W[gs];B[hq];W[hp];B[es];W[bo];B[bp];W[me];B[bn];W[fl];B[fk];W[bm];B[ao];W[di];B[dk];W[ck];B[dj];W[ci];B[ln];W[kn];B[mn];W[mo];B[ml]
+;W[ko];B[nn];W[kp];B[kq];W[lq];B[mr];W[ns];B[ms];W[ks];B[is];W[kr];B[oo];W[bh];B[am];W[cd];B[bd];W[dd];B[bl];W[cg];B[dh];W[eh];B[dg]
+;W[df];B[cl];W[bf];B[be];W[ae];B[bb];W[db];B[hh];W[jf];B[hf];W[he];B[fh];W[eg];B[fg];W[os];B[pr];W[ps];B[qr];W[rm];B[rn];W[qs];B[rr]
+;W[rd];B[pl];W[rc];B[ob];W[qb];B[pb];W[rb];B[nb];W[nf];B[of];W[og];B[mc];W[nd];B[md];W[ne];B[lb];W[kb];B[ee];W[ff];B[de];W[ef];B[fe]
+;W[gf];B[fd];W[fb];B[fc];W[eb];B[gb];W[gd];B[gc];W[ga];B[ha];W[pk];B[ol];W[li];B[rl];W[rk];B[sm];W[sl];B[qm];W[rl];B[sn];W[jh];B[gj]
+;W[mj];B[lk];W[gg];B[gh];W[hg];B[ih];W[mk];B[ib];W[ic];B[jb];W[ka];B[jc];W[jd];B[id];W[je];B[le];W[ld];B[lf];W[lg];B[lc];W[kd];B[la]
+;W[ok];B[nk];W[nj];B[nl];W[hc];B[hb];W[hd];B[fa];W[bk];B[ak];W[aj];B[al];W[rs];B[sr];W[ig];B[ji];W[ki];B[kj];W[fs];B[lj];W[ad];B[ac]
+;W[kg];B[af];W[ag];B[cf];W[ae];B[ja];W[ei];B[fi];W[ik];B[hk];W[ij];B[ii];W[lm];B[ll];W[mm];B[nm];W[hj];B[hl];W[jk];B[il];W[kk];B[jl]
+;W[kl];B[hi];W[af];B[ri];W[qh];B[mi];W[pa];B[oa];W[ma];B[mb];W[oi];B[oc];W[qd];B[od];W[ng];B[ca];W[eo];B[fo];W[ss];B[da];W[ad];B[ea]
+;W[hm];B[hn])
diff --git a/regression/games/filllib15.sgf b/regression/games/filllib15.sgf
new file mode 100644 (file)
index 0000000..d63a317
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[19]
+GN[GNU Go 3.7.2 load and print]
+DT[2005-03-10]
+KM[-5]RU[Japanese]AP[GNU Go:3.7.2]PL[B]
+AW[ba][ha][ma][na][db][fb][gb][hb][mb][cc][dc][ec][lc][mc][nc][cd][ed][md][nd][pd][sd][ee][me][oe][pe][re][se][df][ef][nf][of][pf][qf][rf][sf][fg][gg][hg][mg][ng][qg][sg][ah][ch][dh][ih][lh][nh][ai][bi][ci][di][ei][gi][ii][mi][qi][aj][bj][dj][ej][fj][gj][hj][ij][mj][nj][oj][qj][bk][fk][mk][ok][el][kl][ll][ml][em][fm][gm][hm][km][mm][nm][pm][en][hn][in][jn][nn][sn][eo][ho][jo][ko][mo][no][oo][po][ro][so][dp][ep][np][pp][qp][rp][bq][cq][eq][fq][gq][jq][kq][lq][nq][gr][ir][nr][hs][js][ms][ns][os]
+AB[ca][da][ea][fa][ga][la][oa][ab][bb][cb][eb][lb][nb][ob][rb][bc][oc][pc][qc][sc][bd][dd][od][qd][rd][ce][de][qe][cf][ag][bg][cg][dg][eg][og][pg][rg][bh][eh][fh][gh][hh][oh][qh][rh][sh][fi][hi][ni][oi][pi][cj][pj][ak][ck][dk][ek][gk][nk][pk][qk][al][bl][cl][dl][fl][nl][ol][bm][dm][jm][lm][om][qm][sm][an][dn][gn][kn][ln][mn][on][pn][qn][rn][bo][do][go][io][lo][qo][bp][cp][gp][hp][ip][jp][kp][lp][mp][op][sp][dq][hq][iq][mq][oq][pq][qq][rq][sq][br][cr][dr][er][fr][hr][lr][mr][or][pr][sr][ds][fs][gs][ls][ps][rs]
+)
diff --git a/regression/games/filllib16.sgf b/regression/games/filllib16.sgf
new file mode 100644 (file)
index 0000000..e7ffb49
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]
+CA[UTF-8]
+AP[Quarry:0.1.14]
+SZ[9]
+KM[0.0]
+C[S:6, D:0];B[ee]C[S:9, D:1];W[eg];B[dg];W[cc];B[eh];W[fh]
+;B[fg];W[gg];B[ff];W[ei];B[gh];W[dh];B[hh];W[df];B[cg];W[ch]
+;B[bg];W[ef];B[fd];W[be];B[de];W[cf];B[ec];W[db];B[eb];W[ea]
+;B[fa];W[da];B[gb];W[gi];B[gf];W[hi];B[ih];W[cd];B[ce];W[bd]
+;B[dc];W[cb];B[dd]
+)
diff --git a/regression/games/filllib17.sgf b/regression/games/filllib17.sgf
new file mode 100644 (file)
index 0000000..308439e
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.4 load and print]
+DT[2005-06-19]
+KM[3.5]RU[Japanese]AP[GNU Go:3.7.4]AW[ba][fa][ga][qa][ra][ab]
+[bb][fb][gb][hb][rb][bc][cc][dc][ec][fc][rc][hd][rd][de][ge][he]
+[ie][je][re][se][bf][cf][df][ef][hf][if][jf][nf][of][qf][rf][cg]
+[eg][fg][gg][jg][mg][ng][pg][qg][rg][ch][dh][fh][jh][kh][mh][oh]
+[ph][bi][ci][ei][gi][ii][ji][ni][oi][pi][cj][dj][ej][gj][jj][kj]
+[oj][rj][sj][gk][ik][kk][mk][qk][rk][el][fl][il][ml][nl][pl][em]
+[fm][gm][hm][jm][mm][pm][an][hn][jn][ln][mn][nn][on][pn][ao][bo]
+[co][do][ho][io][jo][lo][no][qo][dp][ep][jp][kp][lp][pp][qp][fq]
+[mq][pq][dr][er][fr][pr][qr][es][qs]
+AB[ca][ea][ha][ia][pa][db][ib][pb][qb][ac][gc][hc][ic][qc][ad]
+[cd][dd][ed][fd][gd][id][jd][nd][pd][qd][ae][be][ce][ee][fe][ke]
+[le][me][ne][oe][pe][qe][af][ff][gf][kf][mf][pf][sf][bg][kg][lg]
+[sg][bh][lh][qh][rh][sh][ai][fi][ki][li][mi][qi][ri][si][aj][bj]
+[fj][lj][mj][nj][pj][qj][ck][dk][ek][fk][jk][lk][nk][ok][pk][bl]
+[dl][jl][kl][ll][ol][am][dm][km][lm][nm][om][bn][cn][dn][en][fn]
+[gn][kn][eo][fo][go][ko][mo][oo][po][fp][gp][hp][ip][mp][np][op]
+[eq][gq][iq][jq][kq][lq][oq][gr][mr][or][fs][gs][os][ps]
+PL[W]
+)
diff --git a/regression/games/filllib18.sgf b/regression/games/filllib18.sgf
new file mode 100644 (file)
index 0000000..41e5884
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.7 load and print]
+DT[2006-01-27]
+KM[-11.5]RU[Japanese]AP[GNU Go:3.7.7]AW[ha][ia][db][hb][nb][ob]
+[ec][fc][gc][hc][ic][nc][pc][qc][rc][sc][fd][jd][nd][rd][ee][ne]
+[bf][ef][ff][jf][mf][of][cg][dg][eg][fg][gg][hg][og][pg][fh][hh]
+[oh][fi][ii][ji][ki][ni][dj][ej][kj][lj][nj][oj][bk][ck][dk][kk]
+[mk][ok][el][fl][jl][kl][ll][nl][pl][ql][bm][cm][fm][gm][hm][jm]
+[km][nm][pm][qm][sm][bn][gn][hn][jn][kn][mn][on][qn][rn][sn][ho]
+[io][jo][ko][oo][po][ro][so][jp][kp][pp][qp][sp][jq][mq][nq][jr]
+[kr][mr][rr][is][js][ks][ls][ms][ns][os][qs]
+AB[ga][ja][cb][eb][fb][gb][ib][jb][mb][cc][dc][kc][lc][oc][dd]
+[ed][od][pd][qd][sd][de][le][oe][qe][re][se][cf][df][pf][rf][bg]
+[qg][ch][dh][eh][gh][ih][jh][kh][ph][qh][bi][ei][gi][hi][oi][pi]
+[qi][bj][cj][fj][gj][hj][ij][jj][pj][qj][rj][ak][ek][fk][ik][jk]
+[pk][qk][sk][bl][cl][dl][gl][hl][il][ml][rl][sl][dm][em][im][lm]
+[mm][om][rm][cn][dn][en][fn][in][ln][nn][bo][go][lo][no][bp][cp]
+[dp][fp][gp][hp][ip][lp][mp][np][op][rp][dq][gq][iq][lq][oq][pq]
+[qq][rq][sq][dr][er][hr][ir][lr][nr][or][pr][fs][gs][hs][ps]
+PL[B]
+)
diff --git a/regression/games/filllib19.sgf b/regression/games/filllib19.sgf
new file mode 100644 (file)
index 0000000..51f871a
--- /dev/null
@@ -0,0 +1,17 @@
+(;
+GM[1]FF[3]SZ[9]
+PB[GNU Go 3.7.4]
+PW[Aya 5.65a]
+DT[2006-03-16]
+RE[B+6.5]
+KM[6.5]RU[Japanese]
+;B[gc];W[dg];B[ff];W[dc];B[de];W[cd];B[ce];W[bf];B[be];W[fd]
+;B[eh];W[gd];B[dh];W[gf];B[hd];W[fc];B[gb];W[he];B[ic];W[ch]
+;B[eg];W[bg];B[gh];W[df];B[cf];W[cg];B[ee];W[fb];B[hb];W[ae]
+;B[bd];W[fe];B[ef];W[ga];B[ha];W[ie];B[id];W[bc];B[ad];W[gg]
+;B[hg];W[hf];B[hh];W[ac];B[fa];W[ea];B[cb];W[cc];B[eb];W[ga]
+;B[db];W[ec];B[fa];W[ib];B[ia];W[ga];B[bb];W[fg];B[fa];W[fh]
+;B[af];W[fi];B[ag];W[ed];B[ab];W[ga];B[da];W[ah];B[ci];W[ae]
+;B[bi];W[fa];B[gi];W[ih];B[ba];W[ig];B[ei];W[ge];B[af];W[tt]
+)
+
diff --git a/regression/games/filllib2.sgf b/regression/games/filllib2.sgf
new file mode 100644 (file)
index 0000000..33dc05d
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.200 ascii]HA[5]KM[0.5]GN[GNU Go 2.7.200 ascii Random Seed 976888515] 
+AB[dd]AB[pd]AB[jj]AB[dp]AB[pp]
+;W[cn];B[fp];W[bp];B[ck];W[fc];B[gc];W[cq];B[fb];W[nc];B[ob]
+;W[hq];B[nb];W[kq];B[ho];W[qf];B[qe];W[pf];B[bo];W[nq];B[or]
+;W[qj];B[fd];W[qn];B[nr];W[cf];B[ce];W[ci];B[dj];W[pe];B[fr]
+;W[be];B[jn];W[bg];B[ro];W[qo];B[re];W[rp];B[qc];W[co];B[qp]
+;W[rq];B[sn];W[kd];B[ec];W[id];B[oo];W[hb];B[en];W[bl];B[bk]
+;W[cl];B[dl];W[gr];B[rg];W[rn];B[rm];W[qm];B[ql];W[rl];B[pj]
+;W[pl];B[qk];W[pk];B[rk];W[rj];B[kj];W[sk];B[ic];W[jc];B[al]
+;W[oj];B[fq];W[pi];B[pq];W[bc];B[bd];W[ad];B[an];W[cp];B[dq]
+;W[dm];B[el];W[hc];B[lq];W[kr];B[hd];W[mp];B[lr];W[ir];B[lm]
+;W[lp];B[kp];W[nn];B[on];W[mm];B[ln];W[qr];B[ps];W[ie];B[ch]
+;W[dh];B[qq];W[rs];B[di];W[bh];B[bi];W[cg];B[dn];W[cd];B[de]
+;W[jp];B[ko];W[dr];B[er];W[cr];B[bj];W[rf];B[sf];W[db];B[he]
+;W[lo];B[ll];W[mn];B[ks];W[js];B[if];W[om];B[ip];W[jq];B[jb]
+;W[ib];B[kb];W[mc];B[ls];W[iq];B[ld];W[le];B[md];W[lc];B[me]
+;W[mf];B[ne];W[nf];B[lf];W[ke];B[kf];W[lb];B[ao];W[bs];B[ma]
+;W[la];B[mb];W[jo];B[io];W[kn];B[im];W[km];B[kl];W[jm];B[jl]
+;W[ko];B[ar];W[bm];B[in];W[am];B[fl];W[ak];B[mq];W[ms];B[cc]
+;W[mr];B[mj];W[cb];B[dc];W[oc];B[od];W[pc];B[qb];W[pb];B[pa]
+;W[oa];B[na];W[oe];B[bd];W[bb];B[rh];W[nj];B[fa];W[mi];B[ef]
+;W[mk];B[af];W[ae];B[eh];W[nd];B[qd];W[lg];B[ba];W[jf];B[jg]
+;W[kg];B[lj];W[ig];B[hf];W[ih];B[hj];W[ml];B[ii];W[jh];B[hg]
+;W[hh];B[ha];W[gi];B[gj];W[ia];B[hi];W[gh];B[li];W[mh];B[fj]
+;W[ga];B[fg];W[dg];B[qi];W[ri];B[qh];W[cd];B[ph];W[oh];B[bd]
+;W[gp];B[go];W[cd];B[gq];W[gs];B[bd];W[hp];B[gb];W[cd];B[pg]
+;W[bd];B[fi];W[og];B[gg];W[do];B[ag];W[bf];B[da];W[ca];B[ea]
+;W[eo];B[fo];W[em];B[fn];W[fm];B[ab];W[gm];B[ep];W[gl];B[hl]
+;W[gk];B[ha];W[hk];B[ga];W[ik];B[ns];W[il];B[aq];W[hm];B[ij]
+;W[fk];B[pr];W[ek];B[dk];W[aj];B[ai];W[ah];B[np];W[al];B[no]
+;W[oq];B[so];W[si];B[sg];W[lk];B[sr];W[rr];B[op];W[mq];B[jk]
+;W[ej];B[ei];W[ji];B[ff];W[ki];B[ds];W[lh];B[sh];W[qg];B[se]
+;W[eb];B[hn];W[kk];B[gn];W[fh];B[eg];W[df];B[sm];W[ch];B[tt]
+;W[cj];B[tt];W[tt]
+)
diff --git a/regression/games/filllib3.sgf b/regression/games/filllib3.sgf
new file mode 100644 (file)
index 0000000..3e76a4a
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]RU[Japanese]SZ[13]
+PW[GNU Go]PB[GNU Go 2.7.226 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.226 ascii Random Seed 984842282] 
+AB[dd]AB[gd]AB[jd]AB[dg]AB[gg]AB[jg]AB[dj]AB[gj]AB[jj]
+;W[ck];B[cj];W[kc];B[jc];W[cc];B[cd];W[dc];B[fc];W[kd];B[mf]
+;W[eb];B[bc];W[bb];B[db];W[bd];B[ec];W[ac];B[fb];W[dk];B[fk]
+;W[kk];B[jk];W[ek];B[fl];W[el];B[em];W[dm];B[ej];W[fm];B[bk]
+;W[bl];B[gm];W[kj];B[il];W[le];B[kb];W[lg];B[ak];W[al];B[aj]
+;W[cb];B[ba];W[lb];B[ka];W[da];B[ab];W[kg];B[jh];W[la];B[ke]
+;W[jb];B[bf];W[je];B[hc];W[id];B[kh];W[lh];B[ki];W[li];B[kl]
+;W[lk];B[ic];W[ie];B[fa];W[ib];B[hf];W[hb];B[ce];W[hd];B[jf]
+;W[gc];B[fd];W[kf];B[mk];W[ll];B[gb];W[km];B[jm];W[lm];B[gk]
+;W[hc];B[ha];W[ea];B[jl];W[be];B[ae];W[if];B[ig];W[he];B[ge]
+;W[cl];B[bg];W[em];B[mb];W[ia];B[mi];W[ml];B[mj];W[ga];B[me]
+;W[ha];B[md];W[lc];B[af];W[tt];B[ad];W[bc];B[tt];W[tt]
+)
diff --git a/regression/games/filllib4.sgf b/regression/games/filllib4.sgf
new file mode 100644 (file)
index 0000000..e234321
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.226 ascii]HA[7]KM[-1.5]GN[GNU Go 2.7.226 ascii Random Seed 984986457] 
+AB[dd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[pp]
+;W[nc];B[ne];W[ld];B[oc];W[pn];B[ol];W[fc];B[ec];W[fd];B[fe]
+;W[fq];B[dq];W[iq];B[nd];W[nq];B[on];W[io];B[po];W[qm];B[pm]
+;W[kq];B[qn];W[cf];B[ce];W[ic];B[mc];W[ed];B[eb];W[lc];B[nb]
+;W[qf];B[pf];W[pg];B[of];W[qh];B[og];W[rj];B[ql];W[fb];B[ph]
+;W[dc];B[db];W[cc];B[cd];W[bc];B[ee];W[pr];B[qr];W[pq];B[qq]
+;W[er];B[dr];W[ch];B[qg];W[rg];B[qi];W[pg];B[rh];W[sh];B[qg]
+;W[re];B[si];W[qc];B[qd];W[rd];B[qb];W[rb];B[pb];W[sg];B[ri]
+;W[ra];B[pc];W[rc];B[df];W[bf];B[cg];W[dg];B[eg];W[dh];B[eh]
+;W[fo];B[ad];W[bj];B[cb];W[bb];B[ba];W[ca];B[ab];W[aa];B[ac]
+;W[bd];B[ba];W[be];B[de];W[ln];B[lm];W[no];B[nn];W[cl];B[cm]
+;W[dm];B[cn];W[dk];B[dn];W[ej];B[em];W[ge];B[gf];W[fi];B[ei]
+;W[ek];B[di];W[he];B[ci];W[bh];B[bi];W[dl];B[ah];W[bg];B[ai]
+;W[bl];B[aj];W[ak];B[cj];W[hf];B[gg];W[bk];B[gi];W[fm];B[fj]
+;W[en];B[fk];W[ao];B[bo];W[an];B[bp];W[ap];B[bq];W[kg];B[bm]
+;W[am];B[aq];W[lf];B[bn];W[al];B[fl];W[el];B[ck];W[em];B[gm]
+;W[gn];B[eo];W[fn];B[fp];W[hn];B[im];W[hm];B[hl];W[kn];B[in]
+;W[gp];B[ep];W[jh];B[ji];W[qs];B[rs];W[ps];B[rr];W[gl];B[gk]
+;W[il];B[gm];W[jl];B[kl];W[hk];B[fh];W[gl];B[hj];W[ik];B[ij]
+;W[qe];B[jk];W[jm];B[km];W[hg];B[hh];W[ih];B[ii];W[lb];B[mg]
+;W[lh];B[li];W[mh];B[nh];W[mi];B[ki];W[mn];B[mj];W[ni];B[mm]
+;W[oi];B[pi];W[oh];B[ng];W[mf];B[nf];W[me];B[md];W[mb];B[ma]
+;W[la];B[na];W[oj];B[ok];W[nj];B[nk];W[lg];B[ig];W[pe];B[oe]
+;W[op];B[oo];W[qa];B[pa];W[es];B[ds];W[kh];B[mo];W[np];B[lp]
+;W[eq];B[mq];W[nr];B[ko];W[mr];B[lo];W[jn];B[gd];W[da];B[ea]
+;W[ca];B[gc];W[gb];B[if];W[tt];B[hd];W[ie];B[id];W[je];B[ke]
+;W[jd];B[tt];W[tt]
+)
diff --git a/regression/games/filllib5.sgf b/regression/games/filllib5.sgf
new file mode 100644 (file)
index 0000000..a32cef0
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.226gf gmp]HA[0]KM[5.5]GN[GNU Go 2.7.226gf gmp Random Seed 0] 
+;B[dd];W[fd];B[ff];W[dg];B[cf];W[cg];B[df];W[fh];B[fg];W[ec]
+;B[eg];W[eh];B[gd];W[gb];B[gc];W[hb];B[fc];W[fb];B[dc];W[eb]
+;B[ed];W[db];B[cb];W[ca];B[ba];W[bb];B[cc];W[aa];B[bc];W[gg]
+;B[bg];W[bh];B[bf];W[he];B[hf];W[gf];B[hg];W[ge];B[fe];W[hd]
+;B[hh];W[gh];B[ig];W[hc];B[hi];W[fd];B[ie];W[ah];B[ch];W[dh]
+;B[ag];W[tt];B[ci];W[di];B[bi];W[ai];B[ch];W[ci];B[gi];W[tt]
+;B[da];W[ea];B[fi];W[tt];B[ei];W[tt];B[ac];W[ba];B[ab];W[da]
+;B[tt];W[tt]
+)
diff --git a/regression/games/filllib6.sgf b/regression/games/filllib6.sgf
new file mode 100644 (file)
index 0000000..9e7512f
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.226gf2 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.226gf2 ascii Random Seed 985503631] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+LB[cc:96][fc:208][nc:205][qc:98][fd:253][gd:210][md:207][nd:253][cf:215][df:258][pf:254][qf:213][dg:210][pg:207][dm:207][pm:210][cn:213][dn:254][pn:257][qn:215][fp:247][gp:205][mp:210][np:256][cq:88][fq:204][nq:209][qq:98]
+C[Value of move: 258]
+;W[df];B[ee];W[pn];B[oo];W[nd];B[oe];W[fp];B[eo];W[oc];B[ne]
+;W[pc];B[ef];W[dg];B[fo];W[gp];B[on];W[pm];B[qc];W[qb];B[rc]
+;W[rb];B[fh];W[ce];B[ch];W[cd];B[hn];W[eq];B[hq];W[cn];B[cl]
+;W[dq];B[dh];W[cp];B[fr];W[er];B[hp];W[qd];B[bm];W[gr];B[go]
+;W[qe];B[eg];W[qo];B[qp];W[hr];B[fs];W[dc];B[sb];W[bn];B[bf]
+;W[be];B[md];W[bg];B[pg];W[dm];B[el];W[om];B[ro];W[rn];B[so]
+;W[mc];B[ld];W[kb];B[af];W[bh];B[ic];W[fc];B[cc];W[bc];B[db]
+;W[ec];B[nm];W[qk];B[sn];W[ri];B[nf];W[rm];B[sm];W[sl];B[pk]
+;W[rp];B[rq];W[sp];B[ol];W[nl];B[mm];W[lj];B[ki];W[hc];B[hb]
+;W[he];B[li];W[gb];B[jf];W[hg];B[gi];W[jg];B[kg];W[hi];B[jh]
+;W[ib];B[hj];W[em];B[fm];W[fl];B[ml];W[sq];B[rr];W[ii];B[gj]
+;W[ij];B[fk];W[ik];B[bi];W[cg];B[gm];W[kk];B[ir];W[gq];B[hl]
+;W[jk];B[nj];W[kn];B[nk];W[in];B[lp];W[is];B[cq];W[bq];B[cr]
+;W[bp];B[rg];W[gs];B[jb];W[ha];B[ja];W[jr];B[jq];W[kc];B[kr]
+;W[iq];B[ip];W[ks];B[lr];W[jc];B[lc];W[lb];B[dl];W[rf];B[kd]
+;W[sg];B[rh];W[sh];B[qi];W[rj];B[qf];W[re];B[pe];W[ai];B[bj]
+;W[id];B[hk];W[mn];B[pa];W[mp];B[mq];W[np];B[oq];W[nn];B[nq]
+;W[cm];B[mb];W[nc];B[fe];W[bl];B[ma];W[pb];B[br];W[cs];B[ig]
+;W[gg];B[ie];W[bk];B[aj];W[qj];B[qh];W[ah];B[si];W[sj];B[sd]
+;W[ck];B[ge];W[hf];B[mj];W[cj];B[ci];W[dk];B[ek];W[if];B[je]
+;W[lk];B[ak];W[am];B[ej];W[ih];B[gd];W[hd];B[fa];W[do];B[en]
+;W[ep];B[gh];W[no];B[gc];W[lo];B[kp];W[al];B[ji];W[pl];B[rd]
+;W[sf];B[sr];W[im];B[ll];W[il];B[io];W[fg];B[ar];W[ir];B[ls]
+;W[mk];B[fb];W[cb];B[da];W[ko];B[de];W[ae];B[ba];W[jo];B[jm]
+;W[km];B[kl];W[jl];B[dn];W[lm];B[nl];W[jg];B[ff];W[js];B[gf]
+;W[ig];B[hh];W[po];B[op];W[fd];B[eh];W[ed];B[hm];W[kj];B[tt]
+;W[tt]
+)
diff --git a/regression/games/filllib7.sgf b/regression/games/filllib7.sgf
new file mode 100644 (file)
index 0000000..42aae8e
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.228gf2 ascii]HA[2]KM[0.5]GN[GNU Go 2.7.228gf2 ascii Random Seed 986536828] 
+AB[gc]AB[cg]
+;W[gf];B[eg];W[dc];B[gh];W[dg];B[df];W[fg];B[dh];W[fh];B[he]
+;W[ge];B[hh];W[ee];B[hf];W[fc];B[fb];W[gd];B[gb];W[de];B[hd]
+;W[ce];B[ca];W[bh];B[eh];W[ei];B[bg];W[ci];B[di];W[fi];B[bc]
+;W[bf];B[ag];W[ef];B[cd];W[cc];B[bd];W[bb];B[cf];W[ch];B[be]
+;W[dg];B[cb];W[ab];B[eb];W[db];B[da];W[af];B[ae];W[ac];B[ec]
+;W[dd];B[ah];W[af];B[ba];W[bi];B[fd];W[ai];B[bf];W[dh];B[fe]
+;W[gg];B[ff];W[eg];B[ed];W[hg];B[ig];W[ih];B[ii];W[if];B[gi]
+;W[ih];B[tt];W[hi];B[hc];W[ie];B[id];W[ig];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/filllib8.sgf b/regression/games/filllib8.sgf
new file mode 100644 (file)
index 0000000..eba31e2
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.235 (level 10) ascii]HA[9]KM[0.5]GN[GNU Go 2.7.235 ascii Random Seed 989427445] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+LB[cc:7][fc:9][nc:9][qc:7][fd:8][gd:9][md:9][nd:9][cf:8][df:7][pf:7][qf:8][dg:7][pg:7][dm:7][pm:7][cn:8][dn:7][pn:7][qn:8][fp:9][gp:9][mp:9][np:8][cq:7][fq:9][nq:75][qq:7]
+C[Value of move: 75]
+;W[nq];B[lq];W[no];B[on];W[pr];B[qq];W[mn];B[oo];W[lp];B[kq]
+;W[qr];B[rr];W[nc];B[lc];W[ne];B[of];W[nd];B[oq];W[pb];B[mr]
+;W[nr];B[or];W[qc];B[kn];W[os];B[ns];W[ms];B[qe];W[mq];B[lr]
+;W[ml];B[ol];W[ll];B[lm];W[mm];B[jl];W[mi];B[rd];W[ki];B[lf]
+;W[ph];B[nf];W[rc];B[fc];W[ld];B[kc];W[qi];B[qj];W[cc];B[ri]
+;W[cd];B[qg];W[fq];B[hq];W[fo];B[en];W[dr];B[cq];W[cf];B[ch]
+;W[bg];B[bh];W[oh];B[de];W[mg];B[df];W[mf];B[eo];W[cr];B[br]
+;W[gn];B[gp];W[hm];B[fp];W[jf];B[ho];W[hk];B[eq];W[jg];B[hi]
+;W[el];B[fm];W[fk];B[cl];W[fi];B[ke];W[dm];B[lg];W[fg];B[lh]
+;W[fh];B[li];W[gf];B[mh];W[kj];B[ng];W[ji];B[me];W[hh];B[md]
+;W[lj];B[mc];W[ij];B[ce];W[eb];B[fb];W[be];B[pg];W[ni];B[gl]
+;W[im];B[jm];W[jk];B[il];W[hl];B[gk];W[ec];B[ed];W[pq];B[op]
+;W[rq];B[fe];W[qp];B[qo];W[ro];B[gj];W[fj];B[np];W[mp];B[dc]
+;W[db];B[in];W[qn];B[ql];W[rm];B[rl];W[mb];B[er];W[ah];B[pm]
+;W[bi];B[ci];W[bj];B[kh];W[ii];B[jh];W[ih];B[po];W[bl];B[cm]
+;W[ck];B[dk];W[dl];B[dn];W[cn];B[co];W[bn];B[lb];W[ma];B[bc]
+;W[bb];B[bd];W[cb];B[cj];W[bm];B[cg];W[bf];B[nn];W[qd];B[rf]
+;W[sd];B[re];W[fa];B[ga];W[ea];B[hb];W[bo];B[lo];W[ln];B[km]
+;W[ko];B[mo];W[no];B[jo];W[nk];B[kp];W[lo];B[oj];W[gi];B[nj]
+;W[mj];B[hj];W[gm];B[fl];W[fn];B[em];W[ik];B[ek];W[kl];B[jn]
+;W[bp];B[bq];W[qh];B[rh];W[pc];B[oe];W[ie];B[id];W[cp];B[do]
+;W[hd];B[hc];W[gd];B[fd];W[aq];B[ar];W[dq];B[ep];W[bs];B[ap]
+;W[cs];B[es];W[ok];B[pk];W[gc];B[gb];W[ge];B[la];W[nb];B[se]
+;W[sc];B[ls];W[od];B[ns];W[ps];B[nl];W[pe];B[mk];W[lk];B[nk]
+;W[ms];B[sm];W[pf];B[qm];W[rn];B[og];W[nm];B[sn];W[so];B[sl]
+;W[ff];B[ef];W[ej];B[eg];W[eh];B[dh];W[om];B[pn];W[sp];B[ds]
+;W[ao];B[as];W[di];B[ei];W[ns];B[je];W[di];B[dg];W[hf];B[ai]
+;W[aj];B[cl];W[cm];B[ab];W[ad];B[aq];W[ei];B[mo];W[nh];B[no]
+;W[kf];B[go];W[kg];B[hn];W[ig];B[pi];W[oi];B[sr];W[rp];B[sq]
+;W[qq];B[ag];W[ai];B[ae];W[ac];B[bd];W[af];B[ak];W[aa];B[bk]
+;W[al];B[tt];W[tt]
+)
diff --git a/regression/games/filllib9.sgf b/regression/games/filllib9.sgf
new file mode 100644 (file)
index 0000000..09d8b3e
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[buzco]WR[15k*]
+PB[GnuGo (GNU Go 3.0.0)]BR[14k*]
+PC[NNGS]DT[2001-09-15]AP[gnugoclient:2.0]
+RE[B+27.5]
+;B[dd];W[qq];B[pe];W[dq];B[co];W[eo];B[dm];W[np];B[pc];W[fc];B[df]
+;W[db];B[hc];W[kc];B[cc];W[he];B[lq];W[hq];B[nr];W[or];B[lo];W[nn]
+;B[lm];W[pj];B[qh];W[nd];B[ml];W[ol];B[cb];W[dc];B[id];W[ie];B[ci]
+;W[jd];B[ei];W[ed];B[de];W[bp];B[cp];W[cq];B[bo];W[jr];B[bq];W[br]
+;B[mj];W[oh];B[ap];W[ik];B[kk];W[jn];B[ki];W[nq];B[fm];W[hi];B[gj]
+;W[hj];B[kr];W[jq];B[mq];W[mr];B[kg];W[mh];B[jl];W[il];B[ih];W[hh]
+;B[lf];W[nf];B[jo];W[io];B[kn];W[jm];B[km];W[jp];B[nb];W[go];B[rj]
+;W[rl];B[qk];W[ql];B[fg];W[ig];B[ko];W[mc];B[im];W[in];B[pg];W[ph]
+;B[gl];W[hm];B[ii];W[jj];B[kj];W[jg];B[jh];W[gf];B[ib];W[hd];B[jf]
+;W[if];B[kb];W[lb];B[jc];W[kd];B[gb];W[fb];B[ha]C[L:7];W[ic];B[ja]
+C[L:5];W[jb];B[js]C[L:6];W[ir];B[jc]C[L:7];W[rf];B[rg]C[L:2];W[jb]
+;B[ka]C[L:3];W[jc];B[la]C[L:4];W[ma];B[mb]C[L:5];W[ia];B[qf]C[L:3]
+;W[ff];B[nc]C[L:4];W[od];B[pd]C[L:5];W[oc];B[ob]C[L:6];W[na];B[pb]
+C[L:7];W[of];B[md]C[L:8];W[lc];B[me]C[L:5];W[pk];B[rk]C[L:6];W[qi]
+;B[ri]C[L:7];W[lh];B[kh]C[L:5];W[gm];B[ar];W[cs];B[ij]C[L:6];W[jk]
+;B[mn];W[mp];B[kq];W[om];B[hk];W[hl];B[fl]C[L:7];W[gk];B[fk]C[L:8]
+;W[hk];B[nm]C[L:6];W[oo];B[gi]C[L:7];W[gh];B[fh]C[L:8];W[ef];B[eg]
+C[L:9];W[kl];B[li]C[L:10];W[mi];B[ll]C[L:6];W[nl];B[nk]C[L:7];W[mo]
+;B[mm]C[L:8];W[lg];B[ni]C[L:9];W[nh];B[sl]C[L:10];W[sm];B[sk];W[rm]
+;B[oi];W[ok];B[pi];W[nj];B[qj];W[mk];B[lj];W[oj];B[qi];W[mf];B[ne]
+;W[oe];B[le];W[ke];B[kf];W[lp];B[kp];W[lr];B[ls];W[ns];B[da];W[nk]
+;B[lk];W[ea];B[ca];W[is];B[ks];W[jl];B[fn];W[fo];B[ms];W[nr];B[gg]
+;W[hg];B[dp];W[eq];B[ep];W[fp];B[gn];W[hn];B[ee];W[fe];B[dn];W[je]
+;B[og];W[en];B[em];W[dr];B[oa];W[la];B[do];W[ld];B[ng];W[ji];B[mg]
+;W[];B[]
+C[final_score: B+27.5
+H19 removed
+G18 removed
+J18 removed
+H17 removed
+P17 removed
+S14 removed]
+)
diff --git a/regression/games/gg-040225.sgf b/regression/games/gg-040225.sgf
new file mode 100644 (file)
index 0000000..65e7c96
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.5.3 Random Seed 1077311653 level 15]\r
+DT[2004-02-20]\r
+KM[0.5]AP[GNU Go:3.5.3]RU[Japanese]HA[2]AB[pd][dp]\r
+RE[W+87.5]\r
+;W[pp];B[nq];W[dc];B[de];W[ce];B[dd];W[cd];B[ec];W[cc];B[df];W[nc]\r
+;B[kq];W[fq];B[ip];W[dr];B[nd];W[md];B[ne];W[pc];B[qc];W[oc];B[qd]\r
+;W[kc];B[qj];W[qn];B[pr];W[eo];B[do];W[en];B[cm];W[qq];B[cf];W[eb]\r
+;B[fc];W[fb];B[dj];W[hc];B[qr];W[cq];B[mg];W[ql];B[qg];W[kf];B[he]\r
+;W[gd];B[hg];W[fe];B[ok];W[nm];B[bf];W[bo];B[bn];W[co];B[ep];W[fp]\r
+;B[fg];W[kh];B[nj];W[gf];B[hf];W[gg];B[gh];W[ed];B[li];W[ji];B[hi]\r
+;W[ir];B[rq];W[rp];B[jr];W[iq];B[rr];W[rk];B[ac];W[sh];B[pb];W[ob]\r
+;B[qb];W[dm];B[dl];W[cn];B[bm];W[el];B[dk];W[jq];B[gk];W[kp];B[lq]\r
+;W[jp];B[ml];W[jm];B[ao];W[ap];B[dn];W[em];B[cp];W[gm];B[bq];W[br]\r
+;B[ri];W[si];B[rh];W[sg];B[kr];W[mo];B[pq];W[qp];B[op];W[oo];B[re]\r
+;W[np];B[oq];W[id];B[aq];W[ar];B[bp];W[pk];B[is];W[hs];B[js];W[gr]\r
+;B[oa];W[na];B[nl];W[pj];B[mc];W[mb];B[pi];W[oj];B[oi];W[ol];B[om]\r
+;W[nk];B[mk];W[fk];B[fj];W[me];B[nn];W[mm];B[no];W[on];B[mp];W[mn]\r
+;B[ek];W[mf];B[nf];W[lg];B[lj];W[ni];B[mj];W[mh];B[nh];W[ng];B[mi]\r
+;W[og];B[rj];W[sj];B[qk];W[rl];B[sp];W[so];B[sq];W[ro];B[lp];W[kn]\r
+;B[od];W[pa];B[qa];W[oh];B[ni];W[qf];B[rf];W[rg];B[ph];W[qh];B[qi]\r
+;W[pg];B[qh];W[pf];B[hl];W[jk];B[fl];W[hm];B[fm];W[fn];B[gl];W[ih]\r
+;B[hh];W[il];B[ij];W[jj];B[oa];W[lc];B[bb];W[cb];B[lo];W[bc];B[ad]\r
+;W[ba];B[ab];W[be];B[ae];W[ln];B[np];W[ik];B[ff];W[ge];B[ee];W[gc]\r
+;B[sf];W[sk];B[ii];W[ig];B[if];W[jf];B[ko];W[jo];B[dq];W[qe];B[er]\r
+;W[rd];B[cr];W[hk];B[hj];W[fs];B[ie];W[je];B[fr];W[eq];B[ds];W[hd]\r
+;B[es];W[gq];B[gs];W[hr];B[fs];W[ca];B[af];W[bd];B[aa];W[];B[]\r
+)\r
diff --git a/regression/games/gifu2005/gnugo-aya.sgf b/regression/games/gifu2005/gnugo-aya.sgf
new file mode 100644 (file)
index 0000000..21a6926
--- /dev/null
@@ -0,0 +1,38 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[W+49.5]
+PW[GNU Go]
+PB[AYA]
+PC[Gifu]
+DT[2005-10-29]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[qd];W[dd];B[cq];W[pp];B[np];W[pn];B[fd];W[df];B[ff];W[oc];B[qb];W[oq]
+;B[nq];W[lq]
+;B[nd];W[mo];B[jd];W[od];B[ne];W[pe];B[pi];W[nc];B[ld];W[pg];B[ni];W[fp]
+;B[rf];W[rg];B[qf];W[pf];B[no];W[mn];B[mp];W[lp];B[on];W[om];B[qk];W[qg]
+;B[qm];W[rc];B[qc];W[lb];B[mr]
+;W[kn];B[nm];W[pm];B[nk];W[nn];B[lr];W[kr];B[jr];W[ks];B[jp];W[kq];B[po]
+;W[qo];B[rd];W[ng];B[li];W[ri];B[oo];W[qn];B[pl];W[io];B[qq];W[qp];B[or]
+;W[rm];B[rp];W[jq];B[rl];W[ql];B[ol];W[so];B[rq];W[rk];B[mc];W[sl];B[hq]
+;W[gr];B[eq];W[ec];B[gb];W[jo];B[mb];W[fb];B[hg];W[fo];B[fq];W[gq];B[hp]
+;W[eh];B[dk];W[cm];B[dm];W[ch];B[bk];W[cn];B[fn];W[go];B[ho];W[hn];B[gm]
+;W[eo];B[gn];W[hr];B[fr];W[hm];B[gk];W[hl];B[do];W[dn];B[en];W[dp];B[co]
+;W[cp];B[bp];W[gl];B[fl];W[bo];B[bq];W[ij];B[gi];W[lk];B[ml];W[dl];B[el]
+;W[em];B[fj];W[fm];B[cl];W[dm];B[mg];W[gc];B[hb];W[gd];B[fg];W[ge];B[fe]
+;W[fc];B[he];W[qj];B[oh];W[nf];B[mf];W[ji];B[kh];W[id];B[ie];W[ic];B[jb]
+;W[ib];B[ia];W[jc];B[kb];W[ki];B[hc];W[hd];B[gf];W[ga];B[lj];W[jh];B[kc]
+;W[jg];B[kg];W[jf];B[ei];W[je];B[km];W[lm];B[ll];W[kl];B[kk];W[jm];B[bm]
+;W[jk];B[kj];W[pq];B[pr];W[pk];B[bi];W[bh];B[ah];W[ag];B[ai];W[bf];B[gs]
+;W[dq];B[dr];W[hs];B[fs];W[di];B[dj];W[ci];B[cj];W[bn];B[og];W[of];B[kf]
+;W[am];B[bl];W[fh];B[gh];W[pb];B[pd];W[oe];B[qa];W[fi];B[ej];W[eg];B[sg]
+;W[sh];B[sf];W[ke];B[kd];W[le];B[me];W[nh];B[mh];W[qe];B[re];W[al];B[ak]
+;W[an];B[nb];W[ob];B[ro];W[sn];B[pj];W[ok];B[oj];W[nl];B[ol];W[ph];B[hk]
+;W[ik];B[qi];W[if];B[hf];W[sp];B[sq];W[rn];B[ls];W[lf];B[oi];W[lg];B[lh]
+;W[mq];B[oa];W[pa];B[na];W[hj];B[gj];W[ap];B[aq];W[ee];B[ih];W[hi];B[ao]
+;W[hh];B[ig];W[ha];B[ja];W[ap];B[ii];W[jj];B[qh];W[rh];B[mm];W[ao];B[pc]
+;W[pl];B[nr];W[nl];B[rj];W[sj];B[ol];W[ep];B[ds];W[nl];B[mk];W[ol];B[op]
+;W[ef];B[gg];W[ed];B[tt];W[tt]
+;)
diff --git a/regression/games/gifu2005/gnugo-daigo.sgf b/regression/games/gifu2005/gnugo-daigo.sgf
new file mode 100644 (file)
index 0000000..2ee7b00
--- /dev/null
@@ -0,0 +1,44 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[W+368.5]
+PW[GNU Go]
+PB[Daigosan]
+PC[Gifu]
+DT[2005-10-29]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[dp];W[cc];B[jp];W[pd];B[pp];W[dj];B[pj];W[cn];B[jj];W[mp];B[mq];W[mn]
+;B[qd];W[qe];B[ek];W[qc];B[cj];W[lq];B[df];W[nq];B[ie];W[mr];B[bn];W[fc]
+;B[oe];W[jr];B[mm];W[fq];B[rf];W[rd];B[bc];W[bd];B[fr];W[eq];B[er];W[dq]
+;B[en];W[gr];B[fb];W[gb];B[dc];W[dd];B[mb];W[db];B[cq];W[dr];B[ib];W[pf]
+;B[og];W[cp];B[co];W[bp];B[bq];W[bo];B[be];W[bm];B[bb];W[ci];B[di];W[dh]
+;B[bh];W[ei];B[bl];W[bi];B[fh];W[cl];B[ck];W[dk];B[do];W[pn];B[rm];W[pl]
+;B[pm];W[om];B[gq];W[gp];B[hq];W[fm];B[gm];W[fn];B[em];W[el];B[fl];W[hr]
+;B[dl];W[cm];B[fp];W[fo];B[go];W[ep];B[cr];W[of];B[hp];W[nf];B[mg];W[le]
+;B[me];W[mf];B[lf];W[md];B[nl];W[qm];B[fp];W[eo];B[rp];W[ln];B[pr];W[kb]
+;B[kc];W[lc];B[lb];W[ad];B[bg];W[dn];B[do];W[lg];B[ke];W[kf];B[jf];W[ng]
+;B[kg];W[mh];B[oi];W[kd];B[lf];W[jc];B[ld];W[ic];B[ej];W[di];B[mc];W[le]
+;B[hb];W[gd];B[ld];W[kc];B[nd];W[hc];B[ec];W[ed];B[fd];W[fe];B[eg];W[rl]
+;B[rk];W[qg];B[ph];W[rg];B[rn];W[sl];B[rj];W[fi];B[gj];W[qi];B[rh];W[ri]
+;B[cd];W[ce];B[cb];W[eb];B[rb];W[gi];B[hj];W[hg];B[gg];W[hf];B[br];W[gn]
+;B[hn];W[gl];B[fk];W[hm];B[ir];W[iq];B[ip];W[jq];B[kq];W[in];B[qh];W[sh]
+;B[pg];W[ok];B[hs];W[is];B[kr];W[nk];B[jn];W[kl];B[lh];W[li];B[mg];W[ki]
+;B[mi];W[nh];B[mj];W[ii];B[ji];W[kj];B[kk];W[ij];B[hh];W[jh];B[ik];W[jk]
+;B[ds];W[ob];B[im];W[ho];B[km];W[jl];B[hk];W[lm];B[ko];W[hi];B[gk];W[gs]
+;B[ll];W[mk];B[oj];W[op];B[mo];W[jm];B[jj];W[ji];B[nn];W[nm];B[cs];W[lo]
+;B[kp];W[gp];B[ig];W[cf];B[ge];W[ff];B[oc];W[qb];B[io];W[kn];B[hn];W[go]
+;B[lp];W[no];B[lr];W[nb];B[mq];W[or];B[nr];W[ns];B[ms];W[ls];B[pb];W[pc]
+;B[oo];W[qo];B[oq];W[pq];B[qq];W[oq];B[qr];W[ro];B[po];W[qp];B[in];W[il]
+;B[sj];W[si];B[pk];W[sg];B[qf];W[rq];B[pe];W[re];B[rc];W[he];B[rr];W[sp]
+;B[hd];W[fg];B[dg];W[cg];B[ih];W[ks];B[gh];W[eh];B[gf];W[id];B[if];W[jg]
+;B[lg];W[hd];B[bf];W[ah];B[dc];W[ec];B[qa];W[ne];B[md];W[od];B[ra];W[nc]
+;B[je];W[la];B[le];W[ma];B[es];W[hl];B[ql];W[qk];B[qj];W[ql];B[sf];W[se]
+;B[pi];W[lj];B[ka];W[ja];B[na];W[oa];B[co];W[dp];B[qn];W[sm];B[so];W[on]
+;B[pp];W[po];B[sq];W[sr];B[ga];W[gc];B[aj];W[al];B[rf];W[qf];B[bs];W[aq]
+;B[do];W[co];B[ee];W[de];B[ab];W[ca];B[ap];W[an];B[ar];W[fs];B[ak];W[bk]
+;B[ai];W[bj];B[aj];W[ai];B[oe];W[pa];B[ea];W[da];B[os];W[ps];B[qs];W[os]
+;B[ss];W[rs];B[qr];W[rr];B[ol];W[ml];B[nl];W[ef];B[eg];W[cd];B[df];W[tt]
+;B[tt]
+;)
diff --git a/regression/games/gifu2005/gnugo-goint.sgf b/regression/games/gifu2005/gnugo-goint.sgf
new file mode 100644 (file)
index 0000000..2c22ea2
--- /dev/null
@@ -0,0 +1,37 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[W+98.5]
+PW[GNU Go]
+PB[Go Intellect]
+PC[Gifu]
+DT[2005-10-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[cd];W[pp];B[qd];W[fd];B[cp];W[eq];B[oc];W[do];B[dp];W[ep];B[cj]
+;W[pj];B[cr];W[iq];B[qg];W[dm];B[ic];W[ni];B[ee];W[dc];B[cc];W[ej];B[gc]
+;W[ed];B[dd];W[eb];B[he];W[fe];B[ef];W[cb];B[fc];W[ec];B[bb];W[ba];B[bc]
+;W[gf];B[fg];W[hg];B[ge];W[ff];B[fi];W[jg];B[fb];W[hj];B[hp];W[hq];B[fj]
+;W[ip];B[co];W[mp];B[ei];W[qm];B[qq];W[pq];B[pr];W[or];B[rr];W[ps];B[dn]
+;W[em];B[en];W[ek];B[fk];W[fm];B[gl];W[fn];B[qp];W[rs];B[rn];W[rm];B[qn]
+;W[pn];B[gp];W[ho];B[qr];W[qs];B[po];W[oo];B[qo];W[op];B[pm];W[on];B[pl]
+;W[qk];B[sn];W[sr];B[sq];W[hl];B[rp];W[lg];B[sm];W[rl];B[bm];W[kd];B[kc]
+;W[lc];B[kb];W[ld];B[eo]
+;W[fo];B[ng];W[mi];B[fs];W[ck];B[gq];W[bk];B[go];W[ci];B[bh];W[bj];B[gm]
+;W[gn];B[gr];W[hm];B[fp];W[ch];B[cg];W[hr];B[io];W[hn];B[pk];W[qj];B[mk]
+;W[gh];B[dh];W[rh];B[dj];W[bi];B[dk];W[el];B[di];W[cm];B[bn];W[bg];B[bf]
+;W[ah];B[cf];W[rg];B[ne];W[sd];B[rf];W[sf];B[qf];W[rc];B[jo];W[kp];B[ko]
+;W[lo];B[jp];W[jq];B[kq];W[lp];B[km];W[kk];B[ll];W[jr];B[lj];W[jl];B[mj]
+;W[qh];B[kj];W[li];B[jm];W[jj];B[ki];W[bl];B[ln];W[mm];B[mn];W[nm];B[qb]
+;W[jd];B[nb];W[lb];B[hb];W[jb];B[ia];W[jc];B[ib];W[ga];B[fa];W[hd];B[id]
+;W[gd];B[je];W[kf];B[da];W[ca];B[ke];W[le];B[sl];W[ea];B[rk];W[ql];B[ie]
+;W[cn];B[do];W[am];B[bo];W[pg];B[re];W[se];B[ok];W[oh];B[pf];W[og];B[of]
+;W[fh];B[eg];W[gk];B[md];W[fl];B[nr];W[nq];B[gb];W[rj];B[rb];W[sk];B[om]
+;W[nn];B[nl];W[nj];B[ji];W[mo];B[hi];W[lm];B[gi];W[ii];B[hh];W[ih];B[gg]
+;W[hf];B[an];W[mc];B[mf];W[lf];B[lk];W[kl];B[jk];W[ik];B[hs];W[is];B[gs]
+;W[me];B[nd];W[mb];B[ma];W[nc];B[na];W[la];B[ob];W[mg];B[nf];W[qc];B[pc]
+;W[sb];B[ra];W[al];B[rd];W[sc];B[af];W[ag];B[ab];W[nh];B[mr];W[lr];B[ss]
+;W[os];B[ns];W[sr];B[aa];W[db];B[ss];W[oq];B[nk];W[kh];B[sa];W[sg];B[dl]
+;W[sr];B[gj];W[ss];B[tt];W[cl];B[tt];W[tt]
+;)
diff --git a/regression/games/gifu2005/gnugo-igoppi.sgf b/regression/games/gifu2005/gnugo-igoppi.sgf
new file mode 100644 (file)
index 0000000..8ec5d93
--- /dev/null
@@ -0,0 +1,30 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[W+136.5]
+PW[GNU Go]
+PB[IGOPPI]
+PC[Gifu]
+DT[2005-10-29]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pc];W[dp];B[qp];W[oq];B[po];W[dd];B[fc];W[mp];B[pq];W[op];B[ql];W[qe]
+;B[nd];W[qh];B[fq];W[hc];B[cc];W[dc];B[cd];W[de];B[db];W[eb];B[cb];W[ec]
+;B[cf];W[fd];B[gc];W[gd];B[fo];W[dn];B[of];W[rc];B[kc];W[ck];B[oo];W[ch]
+;B[mo];W[lp];B[lo];W[kp];B[ko];W[jp];B[df];W[fm];B[hr];W[jo];B[dr];W[cq]
+;B[cr];W[eg];B[oh];W[ef];B[km];W[ce];B[bg];W[be];B[bd];W[da];B[ca];W[ad]
+;B[bb];W[ac];B[ea];W[fb];B[jr];W[jn];B[kn];W[il];B[kk];W[ij];B[kj];W[jh]
+;B[kh];W[jf];B[kf];W[pi];B[oi];W[pj];B[oj];W[pk];B[ok];W[pl];B[pm];W[rk]
+;B[rl];W[qk];B[qm];W[qb];B[pb];W[ol];B[om];W[nl];B[nk];W[jb];B[kb];W[ke]
+;B[le];W[kg];B[lg];W[lf];B[me];W[lh];B[mg];W[jc];B[ki];W[br];B[lr];W[kd]
+;B[ld];W[ka];B[lb];W[la];B[ma];W[ja]
+;B[mb];W[bs];B[ml];W[sl];B[sm];W[sk];B[qf];W[rf];B[mr];W[or];B[pr];W[mf]
+;B[fn];W[gm];B[hn];W[jm];B[jj];W[ng];B[mh];W[nf];B[og];W[jk];B[nh];W[pf]
+;B[pg];W[qg];B[hp];W[oe];B[od];W[ne];B[pa];W[dq];B[eq];W[iq];B[ir];W[ps]
+;B[qs];W[os];B[qr];W[nm];B[mm];W[nn];B[hm];W[hl];B[ns];W[no];B[ji];W[ii]
+;B[pd];W[pe];B[eo];W[do];B[nr];W[qd];B[en];W[em];B[ho];W[cs];B[ds];W[er]
+;B[fr];W[es];B[fs];W[mn];B[kl];W[jl];B[on];W[ln];B[gn];W[lm];B[ll];W[ep]
+;B[nq];W[np];B[kq];W[fp];B[qa];W[hq];B[gp];W[gq];B[gr];W[ra];B[ph];W[jq]
+;B[mq];W[lq];B[kr];W[qc];B[pp];W[tt];B[tt]
+;)
diff --git a/regression/games/gifu2005/gnugo-katsu.sgf b/regression/games/gifu2005/gnugo-katsu.sgf
new file mode 100644 (file)
index 0000000..6ab53bd
--- /dev/null
@@ -0,0 +1,35 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[B+23.5]
+PW[GNU Go]
+PB[Katsunari]
+PC[Gifu]
+DT[2005-10-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[qd];W[dp];B[dd];W[pp];B[qn];W[ql];B[qq];W[qp];B[pq];W[op];B[rp];W[ro]
+;B[rq];W[qo];B[nq];W[od];B[oc];W[nc];B[pc];W[md];B[qf];W[ic];B[jq];W[pn]
+;B[fq];W[fc];B[cf];W[db];B[cc];W[dn];B[dr];W[cq];B[hp];W[ch];B[cj];W[cr]
+;B[cb];W[mo];B[mq];W[qh];B[pg];W[er];B[cl];W[cn];B[qj];W[pi];B[pj];W[oi]
+;B[oj];W[ni];B[ng];W[eh];B[mh];W[mj];B[li];W[nk];B[ef];W[kd];B[fk];W[ei]
+;B[np];W[kk];B[no];W[mn];B[nn];W[jo];B[eq];W[dq];B[fr];W[nm];B[es];W[nb]
+;B[ob];W[rg];B[on];W[om];B[pm];W[po];B[pl];W[qm];B[mm];W[ml];B[rn];W[rm]
+;B[sn];W[so];B[rk];W[qk];B[ol];W[lm];B[nl];W[mm];B[fn];W[sd];B[re];W[em]
+;B[fm];W[dk];B[rc];W[ek];B[el];W[dl];B[ck];W[dj];B[fl];W[ec];B[lj];W[hn]
+;B[lk];W[mi];B[mk];W[nj];B[ok];W[rj];B[ri];W[qi];B[sj];W[pk];B[rj];W[sm]
+;B[rh];W[qg];B[ll];W[pf];B[km];W[lo];B[og];W[pe];B[rn];W[jm];B[kn];W[kl]
+;B[jl];W[jk];B[ko];W[lp];B[kp];W[lq];B[il];W[lh];B[kh];W[lg];B[ki];W[sh]
+;B[ln];W[kq];B[jp];W[mr];B[mp];W[oq];B[nr];W[kr];B[jr];W[mg];B[or];W[ik]
+;B[nh];W[nf];B[hl];W[ii];B[lf];W[kg];B[mf];W[kf];B[of];W[ne];B[ke];W[je]
+;B[le];W[jh];B[jg];W[jf];B[ks];W[ig];B[pd];W[oe];B[bm];W[bi];B[fj];W[bg]
+;B[bf];W[cs];B[fi];W[oa];B[pa];W[na];B[fh];W[se];B[sc];W[rf];B[qe];W[qb]
+;B[pb];W[fe];B[ff];W[gf];B[gg];W[hf];B[da];W[ea];B[dc];W[ca];B[ba];W[af]
+;B[ae];W[ag];B[en];W[ci];B[ep];W[be];B[dm];W[cm];B[em];W[ce];B[df];W[da]
+;B[ej];W[di];B[eg];W[bn];B[bd];W[ad];B[ed];W[ac];B[fd];W[gc];B[fa];W[eb]
+;B[bb];W[gd];B[cg];W[ji];B[lr];W[ds];B[er];W[hk];B[ab];W[gl];B[gm];W[gk]
+;B[hm];W[eo];B[fo];W[do];B[hh];W[kj];B[bc];W[ae];B[ee];W[ge];B[hi];W[gj]
+;B[si];W[hj];B[sg];W[gi];B[sh];W[ph];B[sf];W[oh];B[hg];W[ih];B[gh];W[ai]
+;B[io];W[de];B[cd];W[dh];B[dg];W[bl];B[ms];W[tt];B[tt]
+;)
diff --git a/regression/games/gifu2005/gnugo-kccigo.sgf b/regression/games/gifu2005/gnugo-kccigo.sgf
new file mode 100644 (file)
index 0000000..abae9f8
--- /dev/null
@@ -0,0 +1,23 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[B+Resign]
+PW[GNU Go]
+PB[KCC Igo]
+PC[Gifu]
+DT[2005-10-29]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[do];B[pp];W[dd];B[fc];W[cf];B[db];W[cc];B[ic];W[dq];B[jq];W[qn]
+;B[qo];W[pn];B[np];W[qj];B[gq]
+;W[nd];B[nc];W[mc];B[oc];W[md];B[qf];W[cb];B[eb];W[cl];B[lb];W[qq];B[rp]
+;W[mb];B[ma];W[na];B[la];W[nb];B[mf];W[le];B[kc];W[je];B[he];W[oe];B[pg]
+;W[og];B[pi];W[jg];B[pk];W[mh];B[ql];W[nn];B[kn];W[oo];B[op];W[rn];B[nl]
+;W[eh];B[em];W[el];B[dn];W[cn];B[eo]
+;W[ep];B[co];W[dp];B[cm];W[bn];B[bm];W[bo];B[dl];W[ck];B[dk];W[cj];B[jk]
+;W[fo];B[gl];W[en];B[fm];W[dm];B[ek];W[dn];B[er];W[dr];B[fr];W[qb];B[qc]
+;W[pb];B[rb];W[pc];B[qd];W[od];B[ho];W[fe];B[mj];W[ra];B[rc];W[es];B[kf]
+;W[ke];B[lf];W[kh];B[ng];W[nf];B[oh];W[jf];B[of];W[ne];B[mg];W[lc];B[kb]
+;W[li];B[lj];W[kj];B[kk];W[hg];B[gd];W[jj];B[ij];W[ii];B[hj]
+;)
diff --git a/regression/games/gifu2005/gnugo-nanasi.sgf b/regression/games/gifu2005/gnugo-nanasi.sgf
new file mode 100644 (file)
index 0000000..6a54409
--- /dev/null
@@ -0,0 +1,29 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[W+260.5]
+PW[GNU Go]
+PB[Nanashi]
+PC[Gifu]
+DT[2005-10-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[cc];W[pp];B[pc];W[cp];B[eb];W[dl];B[mb];W[qe];B[ci];W[ei];B[gk];W[qh]
+;B[ng];W[ep];B[kf];W[eg];B[qm];W[cg];B[pq];W[oq];B[mq];W[qq];B[eq]
+;W[fq];B[hp];W[qk];B[cn];W[pl];B[fo];W[dn];B[cm];W[dm];B[hq];W[cl];B[dp]
+;W[er];B[dr];W[dq];B[lr];W[mo];B[lk];W[gf];B[bp];W[co];B[bo];W[bq];B[an]
+;W[bm];B[bn];W[bl];B[gr];W[if];B[he];W[je];B[ih];W[jc];B[ic];W[id];B[fg]
+;W[hf];B[ef];W[hh];B[jh];W[ff];B[mc];W[df];B[ee];W[gi];B[oc];W[gd];B[hc]
+;W[mm];B[jb];W[rc];B[cd];W[fn];B[rp];W[rq];B[rm];W[oo];B[qn];W[pm];B[qp]
+;W[rk];B[hd];W[kc];B[nh];W[kb];B[jf];W[ie];B[nf];W[ib];B[cj];W[gb];B[ce]
+;W[bf];B[ae];W[ko];B[cf];W[be];B[go];W[bd];B[bb];W[kl];B[ls];W[qb];B[nr]
+;W[pr];B[ea];W[ld];B[gc];W[fc];B[ac];W[hb];B[ag];W[af];B[bj];W[bh];B[bc]
+;W[ed];B[dc];W[de];B[ec];W[fk];B[gn];W[jj];B[ns];W[ki];B[mh];W[mj];B[pe]
+;W[qf];B[og];W[hl];B[lj];W[li];B[lb];W[fm];B[pb];W[kh];B[oh];W[jg];B[ph]
+;W[qi];B[me];W[lf];B[mf];W[lg];B[na];W[ad];B[pd];W[jp];B[gs];W[ir];B[iq]
+;W[jq];B[js];W[jr];B[md];W[pa];B[es];W[is];B[nq];W[mk];B[kp];W[jm];B[ll]
+;W[lm];B[la];W[pf];B[of];W[dd];B[ob];W[fb];B[oe];W[le];B[ma];W[pi];B[ks]
+;W[nj];B[hj];W[gj];B[hi];W[ig];B[lc];W[qd];B[qc];W[rb];B[nc];W[oi];B[lh]
+;W[pg];B[mp];W[kq];B[mg];W[ka];B[mi];W[fa];B[ni];W[qa];B[oa];W[tt];B[tt]
+;)
diff --git a/regression/games/gifu2005/gostar-gnugo.sgf b/regression/games/gifu2005/gostar-gnugo.sgf
new file mode 100644 (file)
index 0000000..3971c03
--- /dev/null
@@ -0,0 +1,36 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[B+52.5]
+PW[GoStar]
+PB[GNU Go]
+PC[Gifu]
+DT[2005-10-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[qf];B[pp];W[de];B[dp];W[nq]
+;B[dc];W[gd];B[np];W[cc];B[mq];W[fq];B[cb];W[cd];B[eb];W[bb];B[gb];W[cn]
+;B[eo];W[cq];B[dq];W[cp];B[em];W[do];B[dn];W[dr];B[cm];W[nc];B[nd];W[md]
+;B[oc];W[ne]
+;B[od];W[mc];B[pf];W[qe];B[kc];W[pg];B[ke];W[of];B[qd];W[co];B[ql];W[ob]
+;B[pe];W[pb];B[re];W[hc];B[ba];W[me];B[qg];W[qh];B[rg];W[ph];B[rb];W[jd]
+;B[kd];W[fe];B[kg];W[ig];B[je];W[ji];B[ie];W[li];B[hf];W[gg];B[id];W[ib]
+;B[nl];W[hg];B[ek];W[ch];B[cj];W[jc];B[oq];W[kb];B[bm];W[ep];B[ip];W[ir]
+;B[ap];W[bp];B[bc];W[rp];B[rn];W[ll];B[bd];W[be];B[ab];W[im];B[hl];W[hm]
+;B[hk];W[hi];B[mn];W[km];B[fo];W[ei];B[pj];W[ao];B[ni];W[rj];B[rh];W[qi]
+;B[og];W[ng];B[oh];W[ko];B[ed];W[il];B[ik];W[mh];B[pi];W[jq];B[jk];W[ho]
+;B[fp];W[eq];B[ae];W[gq];B[bf];W[ce];B[ee];W[ef];B[ic];W[jb];B[hb];W[lb]
+;B[hd];W[gc];B[ge];W[ff];B[fd];W[lr];B[nr];W[lq];B[bh];W[cg];B[bg];W[so]
+;B[qq];W[rr];B[rq];W[lp];B[ci];W[gm];B[fl];W[ha];B[ga];W[gj];B[dh];W[df]
+;B[di];W[dl];B[dm];W[dk];B[gk];W[sn];B[rm];W[ej];B[dj];W[rc];B[qb];W[qc]
+;B[pc];W[oe];B[rf];W[ia];B[qa];W[hp];B[mr];W[ls];B[eh];W[fh];B[nh];W[nk]
+;B[mk];W[ok];B[ml];W[pk];B[qj];W[mj];B[lk];W[nj];B[rk];W[mg];B[lm];W[kl]
+;B[kn];W[jn];B[ln];W[no];B[mo];W[pm];B[pl];W[ol];B[om];W[on];B[nm];W[ij]
+;B[kh];W[ki];B[lf];W[kk];B[gf];W[ms];B[eg];W[fg];B[if];W[pn];B[oo];W[nn]
+;B[mp];W[lj];B[mm];W[ps];B[qr];W[ns];B[qs];W[an];B[or];W[os];B[pa];W[nb]
+;B[am];W[jh];B[bn];W[aq];B[bo];W[ap];B[jg];W[oa];B[rd];W[pr];B[pq];W[qk]
+;B[gn];W[oj];B[ri];W[hn];B[fm];W[hj];B[go];W[jl];B[fj];W[fi];B[fk];W[mf]
+;B[jj];W[lc];B[kj];W[dd];B[cf];W[dg];B[oi];W[fb];B[fc];W[le];B[lg];W[lh]
+;B[lo];W[jo];B[gp];W[ld];B[mi];W[gl];B[tt];W[tt]
+;)
diff --git a/regression/games/gifu2005/mfg-gnugo.sgf b/regression/games/gifu2005/mfg-gnugo.sgf
new file mode 100644 (file)
index 0000000..ed587b3
--- /dev/null
@@ -0,0 +1,45 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.18]
+EV[Gifu Challenge 2005]
+RE[B+13.5]
+PW[The Many Faces of Go]
+PB[GNU Go]
+PC[Gifu 2005]
+DT[2005-10-29]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[dc];B[pp];W[dq];B[pj];W[nq];B[lq]
+;W[qq];B[qp];W[pq];B[op];W[nr];B[mo];W[nc];B[lc];W[qc];B[qd];W[pc];B[od]
+;W[nb];B[me];W[qj];B[qi]
+;W[pk];B[co];W[cm];B[eo];W[fp];B[dm];W[dl];B[em];W[cn];B[do];W[oj];B[pi]
+;W[rj];B[ok];W[pl];B[rl];W[qn];B[ri];W[jc];B[ce];W[cg];B[ee];W[fd];B[dg]
+;W[ql];B[rm];W[rn];B[ro];W[qm];B[ch];W[nj];B[cf];W[rr];B[nk];W[mk];B[nl]
+;W[ml];B[nm];W[rk];B[mj];W[ni];B[lj];W[mm];B[on];W[mh];B[kh];W[el];B[fm]
+;W[qf];B[pg];W[pf];B[qg];W[ki];B[li];W[nf];B[rf];W[of];B[lf];W[re];B[fl]
+;W[ej];B[fk];W[di];B[ck];W[rd];B[rh];W[sf];B[sg];W[rg];B[ji];W[bj];B[cj]
+;W[ci];B[cl];W[nd];B[bc];W[gi];B[hj];W[lb];B[rf];W[ne];B[se];W[bk];B[bm]
+;W[bn];B[bl];W[bh];B[bg];W[jq];B[mn];W[gq];B[lm];W[gc];B[kc];W[kb];B[jf]
+;W[cp];B[bo];W[gg];B[ah];W[bi];B[dj];W[bp];B[eh];W[fi];B[ei];W[jd];B[ap]
+;W[oh];B[ph];W[aq];B[ao];W[br];B[hf];W[gf];B[sn];W[rp];B[qo];W[sl];B[in]
+;W[kf];B[ke];W[kp];B[lp];W[he];B[ie];W[kn];B[hd];W[ge];B[id];W[hc];B[km]
+;W[sd];B[sf];W[np];B[cb];W[no];B[pn];W[oo];B[po];W[db];B[jn];W[lo];B[mp]
+;W[ig];B[if];W[hg];B[sp];W[sr];B[da];W[lh];B[kg];W[ea];B[ca];W[fb];B[ih]
+;W[ho];B[kr];W[jr];B[js];W[is];B[ks];W[hr];B[kq];W[jp];B[fj];W[cc];B[ab]
+;W[kd];B[ld];W[ic];B[bb];W[cd];B[bd];W[rq];B[hh];W[fg];B[fh];W[gh];B[ed]
+;W[oq];B[ec];W[gd];B[eb];W[fa];B[og];W[ng];B[gn];W[gj];B[gk];W[hk];B[ij]
+;W[sm];B[hn];W[so];B[nn];W[bf];B[dh];W[fo];B[fc];W[hb];B[go];W[gp];B[jo]
+;W[ko];B[hp];W[sq];B[ip];W[si];B[ef];W[mr];B[iq];W[ir];B[ep];W[eq];B[fn]
+;W[lr];B[hi];W[mc];B[ls];W[ms];B[lg];W[jg];B[je];W[md];B[le];W[mi];B[jh]
+;W[hq];B[io];W[sj];B[sh];W[oi];B[mg];W[nh];B[ll];W[ol];B[ln];W[dp];B[eg]
+;W[ff];B[fe];W[om];B[pm];W[mq];B[mf];W[ai];B[ak];W[ag];B[cg];W[tt];B[tt]
+;
+TB[aa][ac][ad][ae][af][ag][ah][ai][aj][al][am][an][ba][be][bf][bh][bi][bj]
+[bk][bn][cc][cd][ci][cm][cn][db][dc][dd][de][df][di][dk][dl][dn][ej][ek]
+[el][en][gl][gm][hk][hl][hm][ho][ii][ik][il][im][jj][jk][jl][jm][kf][ki]
+[kj][kk][kl][lk][mk][ml][mm][qh][rg]
+TW[ar][as][bq][bs][cq][cr][cs][dr][ds][er][es][fq][fr][fs][ga][gb][gr][gs]
+[ha][hs][ia][ib][ja][jb][ka][la][ma][mb][na][ns][oa][ob][oc][od][oe][or]
+[os][pa][pb][pd][pe][pr][ps][qa][qb][qd][qe][qk][qr][qs][ra][rb][rc][rl]
+[rm][rs][sa][sb][sc][sk][sn][sp][ss]
+)
diff --git a/regression/games/gifu2006/caren-gnugo.sgf b/regression/games/gifu2006/caren-gnugo.sgf
new file mode 100644 (file)
index 0000000..8ef85bd
--- /dev/null
@@ -0,0 +1,32 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.20]
+EV[Gifu Challenge 2006]
+RE[B+105.5]
+PW[caren]
+PB[GNUGo]
+PC[Gifu]
+DT[2006-09-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[dc];B[qp];W[dq];B[do];W[co];B[dp];W[cp];B[eq];W[cn];B[dn];W[dm]
+;B[cq];W[dr];B[bq];W[cr];B[fp];W[kq];B[br];W[cm];B[ck];W[ce];B[el];W[em]
+;B[fm];W[dl];B[dk];W[ek];B[fl];W[ej];B[di];W[dj];B[cj];W[ci];B[ei];W[bk]
+;B[fj];W[bl];B[bj];W[bp];B[er];W[bn];B[pl];W[oq];B[jd];W[mf];B[pn];W[qr]
+;B[md];W[qc];B[pc];W[qd];B[qe];W[re];B[qf];W[rf];B[qg];W[pb];B[ob];W[qb]
+;B[rg];W[mh];B[od];W[np];B[gc];W[hq];B[ch];W[pk];B[ok];W[pj];B[oj];W[ql]
+;B[qm];W[ol];B[pm];W[nl];B[oi];W[aq];B[ar];W[ao];B[ap];W[rq];B[rl];W[rp]
+;B[hs];W[rn];B[eb];W[ec];B[fb];W[qo];B[en];W[db];B[bf];W[gr];B[gs];W[jr]
+;B[be];W[bc];B[ho];W[io];B[in];W[ip];B[jn];W[mq];B[fe];W[rm];B[pi];W[oa]
+;B[bd];W[cd];B[ee];W[ac];B[nb];W[bb];B[cf];W[og];B[kh];W[kf];B[jf];W[jg]
+;B[lg];W[kg];B[lh];W[je];B[id];W[lf];B[kd];W[mg];B[if];W[ke];B[li];W[ig]
+;B[mi];W[ii];B[hf];W[ie];B[hg];W[he];B[hh];W[jh];B[ge];W[ne];B[of];W[nf]
+;B[hd];W[hj];B[sl];W[gk];B[fk];W[il];B[gj];W[ik];B[jj];W[hm];B[hn];W[km]
+;B[jm];W[mm];B[kk];W[na];B[ma];W[pa];B[mb];W[sf];B[sg];W[rc];B[ko];W[ks]
+;B[po];W[mo];B[pq];W[pr];B[qn];W[ro];B[de];W[dd];B[nn];W[mn];B[mk];W[on]
+;B[om];W[oo];B[pp];W[nm];B[ll];W[ln];B[nk];W[sm];B[qk];W[op];B[gp];W[qq]
+;B[qj];W[fc];B[ak];W[ea];B[gb];W[fa];B[ga];W[da];B[al];W[am];B[aj];W[cl]
+;B[kl];W[fr];B[fs];W[is];B[hr];W[gq];B[ir];W[iq];B[es];W[fd];B[kp];W[lp]
+;B[ad];W[js];B[gd];W[aq];B[bs];W[jp];B[ap];W[lo];B[aq];W[kn];B[jo];W[hp]
+;B[fq];W[jq];B[ml];W[lm];B[ed];W[tt];B[tt]
+;)
diff --git a/regression/games/gifu2006/gnugo-aya.sgf b/regression/games/gifu2006/gnugo-aya.sgf
new file mode 100644 (file)
index 0000000..b896747
--- /dev/null
@@ -0,0 +1,188 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
+RU[Japanese]SZ[19]KM[6.50]TM[2400]
+PW[GNUGo]PB[Aya]DT[2006-10-01]EV[Gifu Challenge 2006]PC[Gifu]RE[W+39.50]
+;B[cd]
+;W[pp]
+;B[qd]
+;W[dp]
+;B[fq]
+;W[hq]
+;B[np]
+;W[fp]
+;B[eq]
+;W[ep]
+;B[kp]
+;W[dq]
+;B[fc]
+;W[pn]
+;B[oo]
+;W[po]
+;B[nc]
+;W[qj]
+;B[jd]
+;W[qg]
+;B[cg]
+;W[gq]
+;B[cm]
+;W[el]
+;B[dk]
+;W[fj]
+;B[di]
+;W[gh]
+;B[gf]
+;W[oq]
+;B[mq]
+;W[nm]
+;B[ld]
+;W[ng]
+;B[pf]
+;W[lg]
+;B[mf]
+;W[mg]
+;B[pg]
+;W[ph]
+;B[qf]
+;W[rg]
+;B[rf]
+;W[ig]
+;B[if]
+;W[kn]
+;B[mn]
+;W[mm]
+;B[on]
+;W[nr]
+;B[em]
+;W[dl]
+;B[cl]
+;W[dm]
+;B[dn]
+;W[en]
+;B[ip]
+;W[om]
+;B[fl]
+;W[fm]
+;B[ek]
+;W[jr]
+;B[ko]
+;W[em]
+;B[gr]
+;W[fk]
+;B[ir]
+;W[iq]
+;B[hr]
+;W[jq]
+;B[do]
+;W[jn]
+;B[gl]
+;W[jp]
+;B[io]
+;W[co]
+;B[dr]
+;W[jo]
+;B[go]
+;W[cr]
+;B[cq]
+;W[er]
+;B[fr]
+;W[ds]
+;B[gm]
+;W[cn]
+;B[fn]
+;W[eo]
+;B[fi]
+;W[ck]
+;B[cj]
+;W[ej]
+;B[dj]
+;W[gi]
+;B[gk]
+;W[gj]
+;B[kg]
+;W[lh]
+;B[im]
+;W[hn]
+;B[bj]
+;W[ih]
+;B[oh]
+;W[og]
+;B[qh]
+;W[pi]
+;B[rh]
+;W[fh]
+;B[eg]
+;W[ri]
+;B[lf]
+;W[kh]
+;B[jg]
+;W[jh]
+;B[hg]
+;W[bn]
+;B[mo]
+;W[lp]
+;B[lo]
+;W[ln]
+;B[kq]
+;W[nn]
+;B[cb]
+;W[nf]
+;B[ne]
+;W[bm]
+;B[bl]
+;W[al]
+;B[bk]
+;W[oe]
+;B[od]
+;W[me]
+;B[le]
+;W[nd]
+;B[pe]
+;W[md]
+;B[mc]
+;W[ne]
+;B[kl]
+;W[lk]
+;B[hh]
+;W[hi]
+;B[ei]
+;W[gg]
+;B[hf]
+;W[eh]
+;B[dh]
+;W[ak]
+;B[fg]
+;W[ij]
+;B[aj]
+;W[am]
+;B[si]
+;W[sj]
+;B[sh]
+;W[qi]
+;B[sg]
+;W[of]
+;B[kk]
+;W[gn]
+;B[ik]
+;W[in]
+;B[kr]
+;W[ll]
+;B[mr]
+;W[ks]
+;B[ls]
+;W[js]
+;B[lq]
+;W[ns]
+;B[ms]
+;W[nq]
+;B[no]
+;W[op]
+;B[hb]
+;W[]
+;B[rk]
+;W[rj]
+;B[rm]
+;W[qm]
+;B[ra]
+;W[]
+;B[]
+;C[スコア不一致により審判判定
+The score by both programs did not match,referee corrected the result.(in Rule 6(2))])
diff --git a/regression/games/gifu2006/gnugo-gorimu.sgf b/regression/games/gifu2006/gnugo-gorimu.sgf
new file mode 100644 (file)
index 0000000..6d3d333
--- /dev/null
@@ -0,0 +1,386 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
+RU[Japanese]SZ[19]KM[6.50]TM[2400]
+PW[GNUGo]PB[Gorimuchu]DT[2006-09-30]EV[Gifu Challenge 2006]PC[Gifu]RE[W+Repetition]
+;B[qp]
+;W[dq]
+;B[kq]
+;W[cd]
+;B[ml]
+;W[pe]
+;B[qi]
+;W[pc]
+;B[fq]
+;W[do]
+;B[gl]
+;W[ec]
+;B[jg]
+;W[fo]
+;B[go]
+;W[jc]
+;B[of]
+;W[cj]
+;B[eh]
+;W[op]
+;B[oq]
+;W[np]
+;B[eb]
+;W[fc]
+;B[no]
+;W[mc]
+;B[re]
+;W[dc]
+;B[cr]
+;W[dr]
+;B[mp]
+;W[gs]
+;B[hr]
+;W[pf]
+;B[qg]
+;W[el]
+;B[qb]
+;W[fk]
+;B[fj]
+;W[gk]
+;B[ik]
+;W[hl]
+;B[hm]
+;W[il]
+;B[jl]
+;W[im]
+;B[in]
+;W[jm]
+;B[km]
+;W[jk]
+;B[kj]
+;W[kl]
+;B[md]
+;W[nc]
+;B[fd]
+;W[ld]
+;B[le]
+;W[og]
+;B[nh]
+;W[nf]
+;B[co]
+;W[cp]
+;B[bp]
+;W[bo]
+;B[jd]
+;W[kd]
+;B[ce]
+;W[gd]
+;B[ge]
+;W[hd]
+;B[jb]
+;W[ic]
+;B[bi]
+;W[de]
+;B[ef]
+;W[bj]
+;B[mf]
+;W[he]
+;B[hf]
+;W[lk]
+;B[bd]
+;W[be]
+;B[cb]
+;W[db]
+;B[da]
+;W[cf]
+;B[oo]
+;W[ci]
+;B[nq]
+;W[mk]
+;B[nk]
+;W[nj]
+;B[pp]
+;W[ok]
+;B[pl]
+;W[nl]
+;B[nm]
+;W[pk]
+;B[rk]
+;W[qc]
+;B[rc]
+;W[pb]
+;B[pa]
+;W[rb]
+;B[jn]
+;W[ij]
+;B[ii]
+;W[rd]
+;B[ie]
+;W[gf]
+;B[gg]
+;W[if]
+;B[ff]
+;W[jf]
+;B[kf]
+;W[ig]
+;B[ds]
+;W[es]
+;B[mi]
+;W[ql]
+;B[qm]
+;W[rl]
+;B[sl]
+;W[rm]
+;B[rn]
+;W[qn]
+;B[pn]
+;W[hh]
+;B[qo]
+;W[hg]
+;B[fn]
+;W[qk]
+;B[ao]
+;W[cn]
+;B[mb]
+;W[lb]
+;B[sd]
+;W[sc]
+;B[hs]
+;W[hi]
+;B[ae]
+;W[bc]
+;B[em]
+;W[lg]
+;B[lh]
+;W[kg]
+;B[kh]
+;W[mg]
+;B[gi]
+;W[ng]
+;B[fb]
+;W[ji]
+;B[hc]
+;W[rf]
+;B[rg]
+;W[se]
+;B[gc]
+;W[gf]
+;B[ib]
+;W[fe]
+;B[la]
+;W[kb]
+;B[nb]
+;W[ka]
+;B[sm]
+;W[rj]
+;B[kc]
+;W[lc]
+;B[sj]
+;W[sk]
+;B[ri]
+;W[en]
+;B[rk]
+;W[gn]
+;B[qj]
+;W[hn]
+;B[ho]
+;W[fm]
+;B[fp]
+;W[oi]
+;B[sf]
+;W[sg]
+;B[sh]
+;W[sf]
+;B[ra]
+;W[mm]
+;B[mn]
+;W[lm]
+;B[ln]
+;W[kn]
+;B[ko]
+;W[om]
+;B[km]
+;W[nn]
+;B[ja]
+;W[gb]
+;B[ga]
+;W[hb]
+;B[oe]
+;W[pm]
+;B[hc]
+;W[er]
+;B[ha]
+;W[gc]
+;B[di]
+;W[ch]
+;B[ek]
+;W[ej]
+;B[ob]
+;W[qa]
+;B[bb]
+;W[cc]
+;B[qb]
+;W[na]
+;B[ac]
+;W[ea]
+;B[fa]
+;W[af]
+;B[cg]
+;W[dg]
+;B[sb]
+;W[sa]
+;B[pi]
+;W[oh]
+;B[sb]
+;W[qa]
+;B[ph]
+;W[gr]
+;B[qb]
+;W[sa]
+;B[gq]
+;W[ep]
+;B[sb]
+;W[qa]
+;B[ne]
+;W[on]
+;B[qb]
+;W[sa]
+;B[lj]
+;W[jh]
+;B[sb]
+;W[qa]
+;B[ki]
+;W[mh]
+;B[qb]
+;W[sa]
+;B[gh]
+;W[fi]
+;B[sb]
+;W[qa]
+;B[fh]
+;W[gj]
+;B[hk]
+;W[kn]
+;B[qb]
+;W[sa]
+;B[km]
+;W[gm]
+;B[sb]
+;W[qa]
+;B[eg]
+;W[dh]
+;B[qb]
+;W[sa]
+;B[qf]
+;W[qe]
+;B[sb]
+;W[qa]
+;B[cq]
+;W[bq]
+;B[qb]
+;W[sa]
+;B[br]
+;W[ap]
+;B[sb]
+;W[qa]
+;B[aq]
+;W[bp]
+;B[qb]
+;W[sa]
+;B[bn]
+;W[fr]
+;B[sb]
+;W[qa]
+;B[ak]
+;W[aj]
+;B[qb]
+;W[sa]
+;B[cl]
+;W[bl]
+;B[sb]
+;W[qa]
+;B[bm]
+;W[cm]
+;B[qb]
+;W[sa]
+;B[al]
+;W[eq]
+;B[sb]
+;W[qa]
+;B[bk]
+;W[dk]
+;B[qb]
+;W[sa]
+;B[qd]
+;W[hq]
+;B[iq]
+;W[hp]
+;B[sb]
+;W[qa]
+;B[ip]
+;W[gp]
+;B[qb]
+;W[sa]
+;B[gq]
+;W[io]
+;B[sb]
+;W[qa]
+;B[ho]
+;W[ir]
+;B[jr]
+;W[is]
+;B[jo]
+;W[js]
+;B[ks]
+;W[qn]
+;B[hr]
+;W[hs]
+;B[qm]
+;W[pj]
+;B[qb]
+;W[sa]
+;B[fq]
+;W[qn]
+;B[sb]
+;W[qa]
+;B[qm]
+;W[rh]
+;B[qb]
+;W[sa]
+;B[qh]
+;W[qn]
+;B[sb]
+;W[qa]
+;B[qm]
+;W[sn]
+;B[so]
+;W[qn]
+;B[qb]
+;W[sa]
+;B[qm]
+;W[go]
+;B[sb]
+;W[qa]
+;B[ed]
+;W[qn]
+;B[qb]
+;W[sa]
+;B[qm]
+;W[kr]
+;B[lr]
+;W[qn]
+;B[sb]
+;W[qa]
+;B[qm]
+;W[ls]
+;B[ms]
+;W[qn]
+;B[qb]
+;W[sa]
+;B[qm]
+;W[jq]
+;B[jp]
+;W[qn]
+;B[sb]
+;W[qa]
+;B[qm]
+;W[kn]
+;B[qb]
+;W[sa]
+;B[km]C[同形再現による審判判定
+Repetition of a position
+(in rule 8(1))])
diff --git a/regression/games/gifu2006/gnugo-igoist.sgf b/regression/games/gifu2006/gnugo-igoist.sgf
new file mode 100644 (file)
index 0000000..55b4483
--- /dev/null
@@ -0,0 +1,29 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.20]
+EV[Gifu Challenge 2006]
+RE[W+134.5]
+PW[GNUGo]
+PB[Igoist]
+PC[Gifu]
+DT[2006-09-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[de];B[pp];W[dq];B[pj];W[jd];B[dj];W[dc];B[jp];W[nc];B[cn];W[gq]
+;B[qf];W[pb];B[nq];W[qn];B[jj];W[rp];B[cq];W[cr];B[cp];W[on];B[dp];W[eq]
+;B[qc];W[qq];B[pq];W[ch];B[gh];W[fn];B[mh];W[ep];B[jm];W[ld];B[ge];W[jr]
+;B[ml];W[qb];B[rc];W[bj];B[ri];W[gc];B[gl];W[lf];B[jh];W[pl];B[ln];W[bq]
+;B[nf];W[do];B[co];W[ok];B[oj];W[nk];B[mk];W[dn];B[ck];W[cm];B[ho];W[bk]
+;B[cj];W[ci];B[jq];W[ir];B[iq];W[kq];B[kp];W[lq];B[lp];W[mp];B[lo];W[no]
+;B[eg];W[eh];B[fh];W[ei];B[fi];W[ej];B[fj];W[ek];B[fk];W[dg];B[ef];W[ne]
+;B[oe];W[go];B[hp];W[hn];B[in];W[hm];B[im];W[hl];B[il];W[hk];B[ik];W[fl]
+;B[ee];W[df];B[mf];W[gk];B[gm];W[me];B[fd];W[ec];B[ed];W[fc];B[gd];W[hj]
+;B[ii];W[hd];B[if];W[nj];B[mi];W[ni];B[nh];W[oi];B[pi];W[oh];B[pg];W[rb]
+;B[sc];W[og];B[ph];W[oc];B[od];W[mj];B[lj];W[hi];B[gi];W[hh];B[hg];W[ih]
+;B[ig];W[dd];B[ie];W[id];B[qk];W[rl];B[rk];W[ql];B[kg];W[lg];B[lh];W[ij]
+;B[ji];W[gp];B[hq];W[hr];B[je];W[kf];B[jg];W[ke];B[pr];W[mq];B[nr];W[qs]
+;B[mn];W[nm];B[op];W[mr];B[ns];W[ps];B[sf];W[mm];B[lm];W[nl];B[sk];W[nd]
+;B[he];W[sb];B[of];W[sl];B[mg];W[gn];B[jf];W[nn];B[ng];W[pk];B[po];W[qr]
+;B[cl];W[bl];B[qo];W[ro];B[dl];W[dm];B[mo];W[pc];B[np];W[ms];B[gj];W[tt]
+;B[qp];W[pn];B[oo];W[os];B[tt];W[tt]
+;)
diff --git a/regression/games/gifu2006/gnugo-indigo.sgf b/regression/games/gifu2006/gnugo-indigo.sgf
new file mode 100644 (file)
index 0000000..30f904b
--- /dev/null
@@ -0,0 +1,270 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
+RU[Japanese]SZ[19]KM[6.50]TM[2400]
+PW[GNUGo]PB[INDIGO]DT[2006-10-01]EV[Gifu Challenge 2006]PC[Gifu]RE[B+3.50]
+;B[pd]
+;W[dd]
+;B[pq]
+;W[dp]
+;B[qk]
+;W[jp]
+;B[lq]
+;W[lo]
+;B[cn]
+;W[cl]
+;B[cq]
+;W[dq]
+;B[cp]
+;W[do]
+;B[cr]
+;W[em]
+;B[bn]
+;W[nd]
+;B[pf]
+;W[pc]
+;B[qc]
+;W[oc]
+;B[jc]
+;W[qb]
+;B[ch]
+;W[qd]
+;B[fc]
+;W[qo]
+;B[rc]
+;W[qe]
+;B[cc]
+;W[op]
+;B[pp]
+;W[po]
+;B[oq]
+;W[cd]
+;B[dc]
+;W[ed]
+;B[qf]
+;W[ec]
+;B[eb]
+;W[rb]
+;B[np]
+;W[db]
+;B[cb]
+;W[fb]
+;B[da]
+;W[gc]
+;B[no]
+;W[rq]
+;B[nm]
+;W[fd]
+;B[cj]
+;W[pm]
+;B[rm]
+;W[ol]
+;B[rd]
+;W[re]
+;B[mk]
+;W[oj]
+;B[qi]
+;W[dg]
+;B[oo]
+;W[on]
+;B[nn]
+;W[rf]
+;B[cg]
+;W[df]
+;B[rg]
+;W[ei]
+;B[dk]
+;W[dl]
+;B[ek]
+;W[cf]
+;B[fj]
+;W[gh]
+;B[fn]
+;W[hj]
+;B[fm]
+;W[dr]
+;B[fq]
+;W[io]
+;B[fo]
+;W[lc]
+;B[mi]
+;W[qn]
+;B[hq]
+;W[oh]
+;B[nf]
+;W[rn]
+;B[im]
+;W[ih]
+;B[jr]
+;W[le]
+;B[mg]
+;W[pi]
+;B[qh]
+;W[kg]
+;B[pe]
+;W[sd]
+;B[lm]
+;W[rl]
+;B[ql]
+;W[qm]
+;B[rk]
+;W[sm]
+;B[dn]
+;W[ki]
+;B[ik]
+;W[qr]
+;B[hk]
+;W[ns]
+;B[pr]
+;W[ps]
+;B[nl]
+;W[bg]
+;B[bh]
+;W[fa]
+;B[bd]
+;W[be]
+;B[kk]
+;W[ah]
+;B[bc]
+;W[ai]
+;B[bk]
+;W[mr]
+;B[mq]
+;W[sk]
+;B[ok]
+;W[pk]
+;B[pl]
+;W[nk]
+;B[om]
+;W[sj]
+;B[rj]
+;W[ri]
+;B[qj]
+;W[lh]
+;B[mh]
+;W[fi]
+;B[bl]
+;W[gj]
+;B[bp]
+;W[ej]
+;B[lr]
+;W[fk]
+;B[fl]
+;W[gk]
+;B[gl]
+;W[nr]
+;B[ij]
+;W[ea]
+;B[ii]
+;W[db]
+;B[jh]
+;W[ca]
+;B[hh]
+;W[ig]
+;B[jg]
+;W[jf]
+;B[hg]
+;W[if]
+;B[hi]
+;W[gi]
+;B[hf]
+;W[jd]
+;B[id]
+;W[he]
+;B[je]
+;W[kd]
+;B[kf]
+;W[ie]
+;B[ge]
+;W[hd]
+;B[ji]
+;W[lf]
+;B[lg]
+;W[kh]
+;B[kj]
+;W[ke]
+;B[ok]
+;W[gf]
+;B[gg]
+;W[ff]
+;B[dh]
+;W[eh]
+;B[fg]
+;W[eg]
+;B[or]
+;W[os]
+;B[ol]
+;W[sf]
+;B[sg]
+;W[sc]
+;B[si]
+;W[sh]
+;B[bi]
+;W[aj]
+;B[qp]
+;W[rp]
+;B[rh]
+;W[bj]
+;B[ck]
+;W[ak]
+;B[di]
+;W[dj]
+;B[ci]
+;W[al]
+;B[bm]
+;W[am]
+;B[an]
+;W[ag]
+;B[ic]
+;W[li]
+;B[lj]
+;W[kf]
+;B[ba]
+;W[ab]
+;B[da]
+;W[eb]
+;B[nq]
+;W[ne]
+;B[kb]
+;W[hb]
+;B[lb]
+;W[mb]
+;B[nj]
+;W[mf]
+;B[of]
+;W[qq]
+;B[ng]
+;W[ls]
+;B[ks]
+;W[pn]
+;B[ms]
+;W[qs]
+;B[ib]
+;W[ja]
+;B[kn]
+;W[ls]
+;B[oe]
+;W[ms]
+;B[od]
+;W[fh]
+;B[hn]
+;W[sl]
+;B[si]
+;W[]
+;B[en]
+;W[]
+;B[ia]
+;W[]
+;B[pj]
+;W[]
+;B[oi]
+;W[]
+;B[ph]
+;W[]
+;B[ho]
+;W[]
+;B[ko]
+;W[]
+;B[kp]
+;W[]
+;B[]
+;C[スコア不一致により審判判定
+The score by both programs did not match,referee corrected the result.(in Rule 6(2)])
diff --git a/regression/games/gifu2006/gnugo-katsu.sgf b/regression/games/gifu2006/gnugo-katsu.sgf
new file mode 100644 (file)
index 0000000..94191a5
--- /dev/null
@@ -0,0 +1,37 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.20]
+EV[Gifu Challenge 2006]
+RE[W+74.5]
+PW[GNUGo]
+PB[Katsunari]
+PC[Gifu]
+DT[2006-10-01]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[dc];B[pq];W[cp];B[de];W[dh];B[gd];W[ee];B[ef];W[fe];B[dd];W[ed]
+;B[cc];W[ec];B[cf];W[cb];B[bc];W[qo];B[qk];W[op];B[oq];W[np];B[nq];W[mp]
+;B[lq];W[ko];B[eq];W[gq];B[do];W[co];B[dn];W[bm];B[cq];W[bq];B[cr];W[qf]
+;B[nc];W[rd];B[qc];W[qi];B[iq];W[gb];B[io];W[lc];B[qm];W[rc];B[ne];W[ic]
+;B[fp];W[rq];B[pp];W[po];B[gp];W[mq];B[mr];W[qr];B[rn];W[dl];B[rj];W[bg]
+;B[cg];W[ch];B[bf];W[bh];B[bb];W[rh];B[id];W[jc];B[ke];W[qb];B[pb];W[nm]
+;B[jd];W[ff];B[eg];W[fi];B[hc];W[hb];B[eh];W[ei];B[cl];W[dk];B[cm];W[cn]
+;B[dm];W[bl];B[ck];W[gl];B[br];W[ap];B[bk];W[bo];B[il];W[rb];B[hk];W[lm]
+;B[lp];W[kd];B[le];W[he];B[qp];W[ro];B[so];W[rp];B[lo];W[pl];B[ql];W[ri]
+;B[si];W[pm];B[je];W[hd];B[mo];W[ng];B[oo];W[on];B[no];W[lj];B[lh];W[jj]
+;B[hi];W[mi];B[jh];W[kn];B[md];W[pa];B[pj];W[qj];B[rk];W[pk];B[oj];W[nj]
+;B[qn];W[pn];B[gh];W[ob];B[sm];W[sj];B[rl];W[sk];B[sl];W[sj];B[mn];W[in]
+;B[hm];W[hn];B[oi];W[pg];B[oc];W[gm];B[mh];W[hl];B[nh];W[hq];B[hp];W[ik]
+;B[mm];W[nk];B[ml];W[fh];B[jk];W[ij];B[hj];W[kk];B[ll];W[gg];B[nl];W[hh]
+;B[ih];W[gi];B[ii];W[ki];B[kh];W[db];B[kl];W[jl];B[ok];W[ol];B[nn];W[km]
+;B[pr];W[sh];B[ar];W[sk];B[om];W[si];B[an];W[mg];B[ig];W[mf];B[pc];W[oe]
+;B[lf];W[nf];B[nb];W[me];B[ld];W[oa];B[kc];W[kb];B[dj];W[kd];B[di];W[fj]
+;B[dp];W[ej];B[cj];W[nd];B[mc];W[kc];B[el];W[ek];B[em];W[ba];B[og];W[of]
+;B[pe];W[gk];B[qe];W[re];B[pf];W[oh];B[ph];W[og];B[ni];W[qg];B[pi];W[na]
+;B[qh];W[sf];B[rg];W[sg];B[ma];W[qa];B[li];W[mj];B[lb];W[ka];B[fn];W[qs]
+;B[al];W[ps];B[os];W[sp];B[hg];W[sn];B[jo];W[jn];B[kp];W[so];B[ho];W[qq]
+;B[fl];W[gn];B[go];W[ab];B[ca];W[da];B[fg];W[gh];B[ac];W[be];B[af];W[dg]
+;B[df];W[cd];B[ae];W[ad];B[aa];W[bi];B[ca];W[ce];B[bd];W[ba];B[jf];W[kg]
+;B[ca];W[or];B[lg];W[od];B[ns];W[ba];B[nm];W[ab];B[fk];W[gf];B[lk];W[kj]
+;B[fm];W[ca];B[aa];W[ms];B[nr];W[ab];B[ln];W[aa];B[mk];W[tt];B[tt]
+;)
diff --git a/regression/games/gifu2006/gnugo-kccigo.sgf b/regression/games/gifu2006/gnugo-kccigo.sgf
new file mode 100644 (file)
index 0000000..27a9275
--- /dev/null
@@ -0,0 +1,36 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.20]
+EV[Gifu Challenge 2006]
+RE[B+98.5]
+PW[GNUGo]
+PB[KCCIgo]
+PC[Gifu]
+DT[2006-09-30]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[cp];B[pp];W[dc];B[de];W[dh];B[fe];W[gc];B[cc];W[cb];B[cd];W[nq]
+;B[oq];W[np];B[kq];W[nn];B[mo];W[no];B[qn];W[nd];B[nc];W[mc];B[oc];W[md]
+;B[jc];W[eq];B[ko];W[ng];B[qg];W[ck];B[nl];W[ni];B[eb];W[ec];B[db];W[fb]
+;B[bb];W[hq];B[ke];W[lg];B[hd];W[cf];B[ek];W[pi];B[mq];W[ql];B[pm];W[qi]
+;B[eo];W[dn];B[fq];W[fp];B[fo];W[gp];B[dj];W[cj];B[fh];W[gn];B[gl];W[fn]
+;B[ii];W[jg];B[hg];W[kj];B[rm];W[jr];B[kr];W[mn];B[ln];W[mp];B[ll];W[lo]
+;B[kn];W[jq];B[kp];W[if];B[hf];W[je];B[id];W[kd];B[of];W[ij];B[ci];W[di]
+;B[oh];W[oi];B[nh];W[mh];B[rh];W[ji];B[ih];W[ei];B[fi];W[ej];B[fk];W[ks]
+;B[ls];W[js];B[mr];W[mb];B[og];W[pa];B[oa];W[ob];B[pb];W[na];B[lj];W[li]
+;B[be];W[qb];B[rc];W[bf];B[dk];W[pc];B[od];W[cl];B[en];W[em];B[fm];W[el]
+;B[go];W[fl];B[dl];W[dm];B[ho];W[gk];B[fj];W[hl];B[mj];W[mi];B[ri];W[qj]
+;B[rk];W[ja];B[jb];W[ia];B[ka];W[kb];B[hb];W[ce];B[bd];W[dd];B[ee];W[qk]
+;B[ha];W[la];B[ch];W[dg];B[bj];W[bk];B[bi];W[aj];B[cm];W[bm];B[cn];W[bn]
+;B[do];W[gj];B[ai];W[bl];B[ag];W[af];B[ak];W[cg];B[bo];W[bp];B[co];W[ao]
+;B[al];W[an];B[bg];W[eg];B[fg];W[gm];B[ef];W[dp];B[ep];W[dq];B[fl];W[hm]
+;B[qc];W[nf];B[rj];W[ib];B[hc];W[ap];B[gq];W[hp];B[hr];W[gr];B[fr];W[hs]
+;B[gs];W[ir];B[is];W[bh];B[ah];W[hs];B[er];W[gr];B[pl];W[fs];B[kk];W[rl]
+;B[sl];W[hi];B[jk];W[jj];B[kc];W[lc];B[rb];W[jd];B[ic];W[ka];B[ra];W[pb]
+;B[ik];W[hk];B[ok];W[jm];B[jh];W[ig];B[hh];W[gi];B[kh];W[ki];B[kg];W[kf]
+;B[ie];W[jf];B[lf];W[le];B[km];W[jl];B[gh];W[nb];B[nj];W[oe];B[pe];W[ne]
+;B[lh];W[mg];B[ip];W[iq];B[ph];W[jp];B[io];W[kl];B[il];W[im];B[lk];W[qh]
+;B[pf];W[qm];B[jo];W[rn];B[sm];W[am];B[ae];W[pk];B[oj];W[pn];B[qo];W[hj]
+;B[in];W[jn];B[hn];W[qa];B[pj];W[dr];B[tt];W[es];B[tt];W[aj];B[ak];W[al]
+;B[eh];W[aj];B[df];W[ak];B[tt];W[tt]
+;)
diff --git a/regression/games/gifu2006/gnugo-nanasi.sgf b/regression/games/gifu2006/gnugo-nanasi.sgf
new file mode 100644 (file)
index 0000000..27a5202
--- /dev/null
@@ -0,0 +1,277 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
+RU[Japanese]SZ[19]KM[6.50]TM[2400]
+PW[GNUGo]PB[Nanasi]DT[2006-09-30]EV[Gifu Challenge 2006]PC[Gifu]RE[W+297.50]
+;B[cc]
+;W[dd]
+;B[pc]
+;W[qe]
+;B[cp]
+;W[od]
+;B[pp]
+;W[rc]
+;B[qm]
+;W[oc]
+;B[qk]
+;W[ep]
+;B[cn]
+;W[cq]
+;B[lp]
+;W[bq]
+;B[jp]
+;W[kc]
+;B[ic]
+;W[cd]
+;B[cj]
+;W[eb]
+;B[ph]
+;W[hq]
+;B[fm]
+;W[qq]
+;B[pe]
+;W[pq]
+;B[dr]
+;W[eq]
+;B[er]
+;W[dp]
+;B[fb]
+;W[pd]
+;B[re]
+;W[qf]
+;B[pf]
+;W[ec]
+;B[rf]
+;W[qg]
+;B[rg]
+;W[op]
+;B[qp]
+;W[qh]
+;B[rh]
+;W[ho]
+;B[hp]
+;W[ip]
+;B[rd]
+;W[qd]
+;B[lb]
+;W[kb]
+;B[me]
+;W[pg]
+;B[ng]
+;W[ke]
+;B[kd]
+;W[jd]
+;B[ld]
+;W[lc]
+;B[hr]
+;W[gp]
+;B[gr]
+;W[ir]
+;B[fp]
+;W[fo]
+;B[fn]
+;W[mc]
+;B[ie]
+;W[le]
+;B[fq]
+;W[gq]
+;B[eo]
+;W[fr]
+;B[oe]
+;W[nf]
+;B[pr]
+;W[oq]
+;B[or]
+;W[nr]
+;B[mr]
+;W[mq]
+;B[qr]
+;W[lr]
+;B[os]
+;W[rr]
+;B[cb]
+;W[cg]
+;B[bg]
+;W[bh]
+;B[df]
+;W[cf]
+;B[bp]
+;W[rp]
+;B[qo]
+;W[lg]
+;B[ch]
+;W[dh]
+;B[dg]
+;W[ci]
+;B[mf]
+;W[ne]
+;B[lf]
+;W[mg]
+;B[kf]
+;W[md]
+;B[og]
+;W[oh]
+;B[nh]
+;W[pi]
+;B[of]
+;W[nd]
+;B[ni]
+;W[ri]
+;B[sc]
+;W[sb]
+;B[ki]
+;W[kg]
+;B[jf]
+;W[dj]
+;B[jg]
+;W[ck]
+;B[rb]
+;W[qc]
+;B[sd]
+;W[oj]
+;B[bk]
+;W[oi]
+;B[bj]
+;W[cl]
+;B[bl]
+;W[do]
+;B[ei]
+;W[ek]
+;B[en]
+;W[eh]
+;B[de]
+;W[ee]
+;B[ce]
+;W[bf]
+;B[ef]
+;W[ff]
+;B[fe]
+;W[be]
+;B[ed]
+;W[dc]
+;B[ee]
+;W[id]
+;B[bc]
+;W[bd]
+;B[hc]
+;W[fc]
+;B[ge]
+;W[hd]
+;B[gc]
+;W[gb]
+;B[fg]
+;W[gl]
+;B[fl]
+;W[fk]
+;B[dl]
+;W[gm]
+;B[el]
+;W[dk]
+;B[gn]
+;W[hn]
+;B[dn]
+;W[il]
+;B[fi]
+;W[hj]
+;B[hb]
+;W[fh]
+;B[ga]
+;W[gd]
+;B[gf]
+;W[ea]
+;B[qb]
+;W[pb]
+;B[si]
+;W[rj]
+;B[jk]
+;W[nj]
+;B[mi]
+;W[gh]
+;B[hh]
+;W[qa]
+;B[sa]
+;W[ib]
+;B[nm]
+;W[ap]
+;B[jq]
+;W[bm]
+;B[jr]
+;W[gs]
+;B[iq]
+;W[hs]
+;B[bo]
+;W[cm]
+;B[bn]
+;W[jo]
+;B[bi]
+;W[am]
+;B[jn]
+;W[ko]
+;B[kr]
+;W[km]
+;B[mm]
+;W[ll]
+;B[np]
+;W[ms]
+;B[kn]
+;W[lo]
+;B[mk]
+;W[no]
+;B[mp]
+;W[mo]
+;B[oo]
+;W[nq]
+;B[lm]
+;W[mj]
+;B[li]
+;W[jl]
+;B[rk]
+;W[sj]
+;B[qj]
+;W[qi]
+;B[sk]
+;W[ro]
+;B[po]
+;W[rn]
+;B[lj]
+;W[rm]
+;B[ln]
+;W[pk]
+;B[ik]
+;W[lk]
+;B[ol]
+;W[ql]
+;B[qn]
+;W[hk]
+;B[kk]
+;W[kl]
+;B[nl]
+;W[pl]
+;B[pm]
+;W[hi]
+;B[go]
+;W[ao]
+;B[ij]
+;W[fp]
+;B[im]
+;W[ih]
+;B[jh]
+;W[hg]
+;B[ii]
+;W[ig]
+;B[eg]
+;W[if]
+;B[je]
+;W[he]
+;B[cr]
+;W[br]
+;B[nk]
+;W[in]
+;B[kp]
+;W[lq]
+;B[jm]
+;W[nn]
+;B[on]
+;W[hm]
+;B[]
+;W[]
+;C[スコア不一致により審判判定
+The score by both programs did not match,referee corrected the result.(in Rule 6(2))])
diff --git a/regression/games/gifu2006/shikou-gnugo.sgf b/regression/games/gifu2006/shikou-gnugo.sgf
new file mode 100644 (file)
index 0000000..be0859f
--- /dev/null
@@ -0,0 +1,33 @@
+(;
+GM[1]FF[4]AP[NNGS:1.1.20]
+EV[Gifu Challenge 2006]
+RE[B+92.5]
+PW[Shikousakugo]
+PB[GNUGo]
+PC[Gifu]
+DT[2006-10-01]
+RU[Japanese]
+SZ[19]TM[2400]KM[6.5]
+
+;B[pd];W[dp];B[pq];W[dc];B[de];W[ce];B[dd];W[cd];B[ec];W[cc];B[df];W[cg]
+;B[eh];W[di];B[lp];W[qf];B[qo];W[nc];B[pf];W[pg];B[qe];W[of];B[pe];W[qg]
+;B[nd];W[md];B[qi];W[od];B[ne];W[ob];B[oe];W[oc];B[cn];W[fq];B[bp];W[cq]
+;B[ck];W[le];B[hq];W[bq];B[ek];W[ei];B[cf];W[bf];B[oj];W[ng];B[fh];W[fi]
+;B[gh];W[dh];B[ml];W[ic];B[ge];W[lg];B[qc];W[bo];B[bn];W[qb];B[rb];W[pb]
+;B[rf];W[rg];B[rd];W[ap];B[bi];W[jp];B[jq];W[kq];B[kp];W[iq];B[jr];W[io]
+;B[ir];W[ip];B[sg];W[sh];B[ri];W[sf];B[ra];W[re];B[sc];W[hp];B[kn];W[hr]
+;B[hs];W[gr];B[kr];W[gj];B[en];W[gc];B[eb];W[db];B[ih];W[nk];B[mj];W[mk]
+;B[lk];W[gs];B[kj];W[is];B[ha];W[gb];B[ga];W[hb];B[fa];W[ia];B[ie];W[fd]
+;B[ed];W[fe];B[mf];W[ff];B[rh];W[eg];B[lf];W[kf];B[kg];W[ke];B[se];W[sd]
+;B[oh];W[og];B[dg];W[gf];B[jg];W[he];B[hf];W[hd];B[jd];W[bh];B[if];W[bj]
+;B[bk];W[ci];B[jc];W[mg];B[pc];W[aj];B[jb];W[ib];B[lc];W[mc];B[mb];W[cj]
+;B[gl];W[ok];B[pk];W[om];B[pl];W[ol];B[pm];W[ll];B[kl];W[lm];B[nj];W[mm]
+;B[km];W[on];B[op];W[im];B[gn];W[jl];B[dj];W[ej];B[dk];W[fo];B[fn];W[ik]
+;B[fk];W[jj];B[ji];W[co];B[do];W[eo];B[ij];W[jk];B[hj];W[hk];B[gi];W[fj]
+;B[js];W[lq];B[lr];W[mq];B[mr];W[nq];B[nr];W[mp];B[mo];W[lo];B[ko];W[no]
+;B[mn];W[nn];B[ln];W[dn];B[dm];W[do];B[nm];W[gk];B[an];W[hs];B[ao];W[cp]
+;B[ak];W[hm];B[gm];W[fg];B[gg];W[go];B[hn];W[in];B[hl];W[ja];B[ka];W[qp]
+;B[pp];W[np];B[nl];W[sp];B[rp];W[id];B[je];W[kk];B[il];W[jm];B[jo];W[si]
+;B[lj];W[sj];B[rm];W[nh];B[se];W[rf];B[ph];W[sd];B[nf];W[rk];B[kh];W[jn]
+;B[al];W[ho];B[tt];W[tt]
+;)
diff --git a/regression/games/glop.sgf b/regression/games/glop.sgf
new file mode 100644 (file)
index 0000000..7eb62cd
--- /dev/null
@@ -0,0 +1,79 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+FF[3]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[glop-GnuGo(B) NNGS]
+EV[None]
+RE[W+98.5]
+PW[glop]WR[10k*]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-10-24]
+SZ[19]TM[1200]KM[0.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[qf];B[pf];W[qe];B[pe];W[qd]C[
+DouglasK started observation.
+]
+;B[gp];W[df];B[fd];W[dm];B[cf];W[cg];B[ce];W[dg];B[ci];W[fj];B[fm];W[el]
+;B[fk];W[ek];B[ei];W[fi];B[bh];W[bg];B[ck];W[cl];B[bj];W[eh]C[
+sct started observation.
+]
+;B[fh];W[ej];B[di];W[fg];B[gh];W[hi];B[mp];W[hg];B[gg];W[gf];B[hd];W[hh]
+;B[mc];W[qn];B[qc];W[pg];B[qg];W[qh]C[
+wartari started observation.
+]
+;B[rg];W[rc]C[
+DouglasK started observation.
+]
+;B[ph];W[og];B[qi]C[
+DINO started observation.
+]
+;W[oh];B[rh];W[pc];B[nf];W[of];B[ne];W[oe];B[oc];W[od];B[ob];W[nd];B[md]
+;W[nc];B[nb];W[pb];B[ql];W[qp];B[qq];W[po];B[rp];W[op]C[
+fff started observation.
+]
+;B[qo];W[pq];B[qp]C[
+DINO started observation.
+]
+;W[on];B[oq];W[nq];B[or];W[np];B[lq];W[nr];B[pr];W[eq];B[fr];W[ep];B[ng]
+;W[fo];B[cq];W[co]C[
+fff started observation.
+fff started observation.
+]
+;B[er];W[dq];B[cp];W[dr];B[bo];W[cn];B[cr];W[cs];B[mi];W[br];B[am];W[bn]
+;B[an];W[bl];B[al];W[bk]C[
+ingwa started observation.
+]
+;B[dk]C[
+bump started observation.
+]
+;W[ak];B[ai];W[bp];B[oi];W[nh];B[mh];W[lf];B[rn];W[mo];B[kg];W[lp];B[mq]
+;W[kq];B[kp];W[lr];B[lo];W[mr];B[jq];W[lp];B[ln];W[jn];B[kn];W[jo];B[jm]
+;W[ho];B[nm];W[ko];B[go];W[hp];B[hq];W[iq];B[ip]C[
+NE started observation.
+]
+;W[io];B[jr];W[gq];B[ir];W[hr];B[hn];W[iq];B[fq];W[gn];B[hq];W[fp];B[bq]
+;W[ao];B[hm];W[gm];B[gk];W[im];B[gr];W[iq];B[hs];W[hq];B[jl];W[il];B[ik]
+;W[hl]C[
+guestx started observation.
+]
+;B[hk];W[fl];B[if];W[mm];B[ll];W[mn];B[ml]C[
+ingwa started observation.
+]
+;W[mb];B[lb];W[me];B[mg]C[
+abcd started observation.
+]
+;W[lc];B[ld];W[kc];B[kd];W[kb];B[ma];W[ic];B[qm];W[gb];B[fb];W[gc];B[fc]
+;W[gd];B[fe];W[ge];B[pn];W[om];B[nl];W[ol];B[oo];W[nn];B[kr];W[lq];B[ls]
+;W[ok];B[id];W[jc];B[oj];W[nk];B[hc];W[hb];B[ni];W[cc];B[bd];W[eb];B[bf]
+;W[fa];B[bb];W[af];B[aj];W[ae];B[ag];W[ah];B[bc];W[ch];B[ag];W[de];B[ah]
+;W[cd];B[be];W[dc];B[rf];W[mk];B[lj];W[lm];B[km];W[lk];B[kl];W[kj];B[jk]
+;W[kk];B[ji];W[li];B[mj];W[ki];B[ig];W[jh];B[kh];W[ih];B[ka];W[ib];B[cb]
+;W[db];B[re];W[rd];B[ja];W[jg];B[kf];W[jf];B[ie];W[os];B[ps];W[ms];B[ns]
+;W[ks];B[os];W[js];B[da];W[ea];B[ca];W[pk];B[qk];W[lh];B[lg];W[ia];B[sd]
+;W[sc];B[pa];W[qa];B[oa];W[qb];B[se];W[dh];B[je];W[dl];B[pm];W[jb];B[la]
+;W[hf];B[he];W[no];B[po];W[pl];B[nj];W[tt];B[tt]
+;)
diff --git a/regression/games/golife.sgf b/regression/games/golife.sgf
new file mode 100644 (file)
index 0000000..a0f74f3
--- /dev/null
@@ -0,0 +1,122 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[ingwa-golife(B) NNGS]
+EV[None]
+RE[W+Resign]
+PW[ingwa]WR[6k*]
+PB[golife]BR[NR ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-11-02]
+SZ[9]TM[1800]KM[0.5]
+
+;B[fd];W[gc]C[
+golife NR : Golife normally plays rather fast now. Haven't worked on it for a couple of years...
+]
+;B[cg];W[fc]C[
+golife NR : It also has a lousy interface, so I better not screw up...
+]
+;B[ed];W[db];B[ge];W[cd]C[
+NE NR : this looks good for B (8)
+]
+;B[hd];W[gg];B[bc]C[
+golife NR : wow...
+ingwa 6k*: A daring invasion (11)
+golife NR : wow...
+ingwa 6k*: And yours also (11)
+golife NR : Indeed :-)
+NE NR : B7 must be a mistake (11)
+]
+;W[hf];B[cf]C[
+bump started observation.
+jpyllman started observation.
+]
+;W[bd];B[dd]C[
+golife NR : with this speed it will be over in no time.
+ingwa 6k*: Perhaps, but computers can complicate things very much (15)
+]
+;W[ac]C[
+golife NR : The lookahead is rather shallow as set. How much lookahead does gnugo do?
+gunnar 3k : C7 is of course much better than A7. (16)
+]
+;B[ab]C[
+golife NR : A8 not much better...
+gunnar 3k : A8 looks unreasonable. (17)
+]
+;W[cc];B[gb]C[
+golife NR : hmm... getting complicated.
+]
+;W[hc];B[hb]C[
+ingwa 6k*: Lookahead: 16 plys (21)
+gunnar 3k : Black is helping white to get stronger. White has H5 for connection now. (21)
+golife NR : 16 plys is a lot. Only on a restricted set of moves, I take it.
+]
+;W[ib];B[ia]C[
+golife NR : It's getting worse and worse.
+Micke started observation.
+turvoy 5k : neverknow (23)
+ingwa 6k*: Yes, only on tactical reading (23)
+ingwa 6k*: Capturing and such (23)
+ingwa 6k*: No full width search (23)
+]
+;W[fb]C[
+NE NR : If W doesn't win this game I will be most surprised (24)
+]
+;B[bb]C[
+golife NR : both programs like suspense :-)
+gunnar 3k : Many odd moves now. (25)
+]
+;W[ha]C[
+NE NR : gnugo doesn't like to capture stones? (26)
+]
+;B[ic]C[
+strandhag started observation.
+golife NR : what is this? I played several games today, and it did not do such moves then...
+gunnar 3k : I'm still waiting for H5 to connect. (27)
+]
+;W[id]C[
+mik started observation.
+]
+;B[ga]C[
+golife NR : I predict an easy win for gnugo at this stage :-)
+teun NR : gnugo takes plenty of time here (29)
+teun started observation.
+ planar started observation.
+ NE started observation.
+ gunnar started observation.
+ teun started observation.
+]
+;W[ag];B[ie]C[
+ turvoy started observation.
+ bump started observation.
+]
+;W[ad];B[eh]C[
+ golife NR : I'm not getting it.
+]
+;W[he];B[gh]C[
+ golife NR : tie for plan B
+]
+;W[hh];B[fh]C[
+ jpyllman started observation.
+]
+;W[gd];B[ce]C[
+ teun started observation.
+]
+;W[fe];B[ee];W[gf];B[ff];W[bh];B[dh];W[fa];B[fg];W[ge];B[df];W[ch];B[bg]
+;W[af];B[di];W[hi];B[fi];W[ec]C[
+ golife NR : those moves are so thick...
+]
+;B[bi];W[ah];B[ci];W[be]C[
+ scribbler started observation.
+]
+;B[bf];W[dc];B[ai];W[ae];B[gi];W[tt];B[cb];W[tt];B[ba]C[
+ limestone started observation.
+]
+;W[tt]C[
+ pappa started observation.
+]
+;B[da];W[tt];B[if];W[tt];B[hg];W[tt];B[ig];W[tt];B[eb];W[tt];B[ea];W[tt]
+;B[ca];W[tt];B[ga];W[tt];B[gb];W[tt];B[ih];W[ii]
+;)
diff --git a/regression/games/gunnar/gunnar1.sgf b/regression/games/gunnar/gunnar1.sgf
new file mode 100644 (file)
index 0000000..e6526d7
--- /dev/null
@@ -0,0 +1,210 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5]RE[B+2.5]
+PW[GNU Go 3.3.12 (random seed 1484524796)]PB[GNU Go 3.2 (random seed 1484524796)]
+;B[pd]
+;W[dd]
+;B[pp]
+;W[dp]
+;B[pj]
+;W[nq]
+;B[lq]
+;W[qq]
+;B[qp]
+;W[pq]
+;B[op]
+;W[nr]
+;B[mo]
+;W[nd]
+;B[pf]
+;W[jd]
+;B[gd]
+;W[pc]
+;B[qc]
+;W[oc]
+;B[qb]
+;W[df]
+;B[fp]
+;W[dn]
+;B[dq]
+;W[cq]
+;B[eq]
+;W[cr]
+;B[ch]
+;W[cj]
+;B[eh]
+;W[ff]
+;B[gf]
+;W[cf]
+;B[gg]
+;W[fn]
+;B[iq]
+;W[nf]
+;B[ph]
+;W[nh]
+;B[nj]
+;W[lj]
+;B[gi]
+;W[ml]
+;B[mn]
+;W[lm]
+;B[ko]
+;W[ec]
+;B[nl]
+;W[fs]
+;B[if]
+;W[kf]
+;B[fe]
+;W[ee]
+;B[ih]
+;W[pb]
+;B[ij]
+;W[ek]
+;B[ci]
+;W[bj]
+;B[gb]
+;W[fb]
+;B[fc]
+;W[eb]
+;B[fd]
+;W[hc]
+;B[hb]
+;W[ic]
+;B[gc]
+;W[ib]
+;B[rq]
+;W[rr]
+;B[rp]
+;W[sr]
+;B[kg]
+;W[qa]
+;B[ra]
+;W[pa]
+;B[rc]
+;W[ks]
+;B[mi]
+;W[li]
+;B[lh]
+;W[jm]
+;B[in]
+;W[lf]
+;B[mh]
+;W[gl]
+;B[im]
+;W[og]
+;B[kr]
+;W[pg]
+;B[qg]
+;W[ls]
+;B[gp]
+;W[pe]
+;B[qe]
+;W[oe]
+;B[lr]
+;W[ms]
+;B[dj]
+;W[dk]
+;B[fg]
+;W[ef]
+;B[bg]
+;W[bf]
+;B[ej]
+;W[cg]
+;B[bi]
+;W[ck]
+;B[af]
+;W[ae]
+;B[ag]
+;W[bd]
+;B[fk]
+;W[ai]
+;B[bh]
+;W[fl]
+;B[gk]
+;W[hl]
+;B[il]
+;W[hk]
+;B[hj]
+;W[ik]
+;B[jl]
+;W[kl]
+;B[lk]
+;W[jk]
+;B[kk]
+;W[jj]
+;B[mk]
+;W[ji]
+;B[ia]
+;W[ja]
+;B[ha]
+;W[kb]
+;B[dr]
+;W[jr]
+;B[jq]
+;W[ds]
+;B[np]
+;W[ir]
+;B[hr]
+;W[hs]
+;B[gr]
+;W[gs]
+;B[fr]
+;W[es]
+;B[ii]
+;W[mg]
+;B[kj]
+;W[ki]
+;B[jf]
+;W[oh]
+;B[oi]
+;W[oq]
+;B[jh]
+;W[hd]
+;B[je]
+;W[ke]
+;B[he]
+;W[sq]
+;B[sp]
+;W[dh]
+;B[di]
+;W[dg]
+;B[gn]
+;W[gm]
+;B[fo]
+;W[hn]
+;B[ho]
+;W[hm]
+;B[do]
+;W[co]
+;B[eo]
+;W[en]
+;B[kh]
+;W[mq]
+;B[mp]
+;W[fa]
+;B[mr]
+;W[go]
+;B[io]
+;W[gn]
+;B[mj]
+;W[qh]
+;B[pi]
+;W[of]
+;B[qf]
+;W[od]
+;B[qd]
+;W[ed]
+;B[ep]
+;W[cp]
+;B[er]
+;W[lg]
+;B[eg]
+;W[ga]
+;B[ge]
+;W[ni]
+;B[ie]
+;W[id]
+;B[gj]
+;W[aj]
+;B[ah]
+;W[]
+;B[]
+)
diff --git a/regression/games/gunnar/gunnar10.sgf b/regression/games/gunnar/gunnar10.sgf
new file mode 100644 (file)
index 0000000..252ab2a
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-05-14]
+SY[Cgoban 1.9.12]TM[5:00:00(5x1:00)];
+AW[bb][cb][db][eb][fb][hb][ib][bc][fc][gc][hc][bd][fd][gd][id][be][ee][bf][cf][ef][ag][bg]
+AB[cd][dd][ed][hd][ce][fe][ge][he][ie][df][ff][cg][fg][ah][bh][ch][dh][eh][fh]
+;B[ic]
+)
diff --git a/regression/games/gunnar/gunnar11.sgf b/regression/games/gunnar/gunnar11.sgf
new file mode 100644 (file)
index 0000000..d2a8b10
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]
+SZ[19]
+KM[5.5]
+;AW[aa][ba][ca][da][ea][fa][ga][na][oa][ab][cb][eb][hb][nb][bc]
+[fc][gc][hc][ic][jc][nc][dd][ed][fd][hd][jd][nd][od][pd][ke][me]
+[ne][pe][ff][gf][if][jf][kf][lf][nf][pf][dg][eg][gg][hg][kg][ch]
+[eh][gh][lh][ai][bi][ci][ei][fi][ji][ki][li][mi][cj][ej][jj][mj]
+[ck][ek][jk][kl][jm][lm][dn][fn][gn][in][kn][ln][on][qn][eo][fo]
+[ho][io][jo][po][ro][dp][jp][kp][lp][mp][np][pp][qp][rp][sp][cq]
+[dq][jq][oq][pq][br][cr][pr][qr][bs][qs][rs]
+AB[pa][db][ob][ac][cc][dc][ec][oc][pc][qc][ad][bd][cd][id][kd]
+[ld][qd][de][ee][fe][ge][he][ie][je][le][qe][bf][cf][df][ef][hf]
+[mf][of][qf][cg][ig][mg][ng][og][pg][ah][bh][dh][hh][mh][di][gi]
+[ni][dj][fj][kj][lj][nj][kk][lk][mk][ll][nl][mm][pm][qm][rm][mn]
+[pn][rn][go][ko][lo][mo][no][oo][so][ep][fp][gp][hp][op][eq][fq]
+[hq][iq][kq][lq][mq][nq][rq][sq][dr][fr][ir][jr][lr][mr][nr][or]
+[rr][sr][cs][ds][gs][hs][js][ns][os][ps][ss]
+PL[W]
+)
diff --git a/regression/games/gunnar/gunnar12.sgf b/regression/games/gunnar/gunnar12.sgf
new file mode 100644 (file)
index 0000000..ce04661
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.5.1 load and print]
+DT[2003-10-24]
+KM[10.5]AP[GNU Go:3.5.1]RU[Japanese]
+;AW[aa][ca][fa][ga][ja][ra][bb][gb][hb][jb][ob][qb][rb][bc][cc]
+[fc][hc][ic][kc][lc][mc][nc][oc][fd][hd][kd][md][od][rd][sd][de]
+[fe][he][ie][ke][le][pe][qe][re][af][cf][df][ef][jf][kf][qf][ag]
+[bg][cg][eg][jg][mg][qg][ah][dh][eh][fh][gh][ih][kh][mh][oh][qh]
+[bi][ci][di][ei][fi][gi][ji][ki][li][ni][pi][qi][gj][kj][mj][nj]
+[oj][qj][ck][ek][fk][gk][hk][lk][nk][bl][cl][dl][el][gl][ll][ol]
+[ql][bm][dm][gm][hm][jm][lm][om][pm][qm][sm][cn][dn][gn][hn][in]
+[jn][kn][ln][mn][nn][on][pn][rn][sn][do][eo][fo][lo][mo][oo][po]
+[qo][ro][ep][lp][mp][rp][lq][mq][nq][pq][qq][rq][nr][pr][rr][sr]
+AB[ea][pa][ab][cb][db][eb][fb][kb][lb][mb][pb][sb][ac][ec][pc]
+[rc][sc][ad][bd][cd][dd][ed][nd][pd][qd][ae][be][ce][ee][ge][me]
+[ne][oe][se][bf][ff][gf][hf][if][lf][mf][nf][pf][rf][sf][fg][ig]
+[kg][lg][og][pg][rg][hh][lh][nh][rh][sh][ai][hi][ri][aj][bj][cj]
+[dj][ej][fj][hj][ij][jj][pj][rj][ak][bk][dk][kk][ok][pk][qk][rk]
+[al][hl][il][jl][kl][ml][nl][pl][rl][sl][am][km][rm][an][bn][en]
+[fn][bo][co][go][ho][io][jo][ko][no][bp][dp][fp][hp][jp][kp][np]
+[op][pp][qp][bq][cq][dq][eq][fq][gq][iq][jq][kq][oq][gr][hr][jr]
+[lr][mr][or][qr][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+PL[W])
diff --git a/regression/games/gunnar/gunnar13.sgf b/regression/games/gunnar/gunnar13.sgf
new file mode 100644 (file)
index 0000000..ddd1078
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.5.8 load and print]
+DT[2004-08-02]
+KM[3.5]RU[Japanese]AP[GNU Go:3.5.8]AW[ga][na][oa][pa][qa][ra]
+[ab][fb][gb][lb][mb][rb][gc][hc][mc][cd][dd][ed][fd][hd][id][jd]
+[kd][ld][qd][be][ce][ee][je][ke][oe][pe][qe][cf][ef][hf][if][kf]
+[lf][pf][dg][eg][fg][pg][qg][rg][dh][fh][kh][lh][mh][oh][ph][sh]
+[di][ei][fi][gi][hi][ii][ji][ki][mi][qi][ri][fj][hj][lj][mj][nj]
+[qj][sj][ak][ck][fk][gk][jk][mk][pk][qk][rk][al][bl][cl][fl][hl]
+[il][jl][cm][dm][fm][im][mm][en][hn][jn][ln][mn][do][io][jo][ko]
+[dp][fp][kp][cq][fq][gq][jq][kq][mq][cr][dr][er][fr][gr][hr][ir]
+[es]
+AB[ca][ea][fa][bb][db][eb][nb][ob][qb][sb][ac][cc][dc][ec][fc]
+[lc][nc][pc][qc][rc][bd][gd][md][nd][od][pd][rd][ae][fe][ge][he]
+[ie][le][ne][re][bf][df][ff][gf][jf][mf][nf][of][qf][rf][sf][cg]
+[gg][hg][jg][kg][lg][mg][og][sg][bh][ch][gh][hh][ih][jh][nh][ci]
+[ni][oi][pi][aj][bj][cj][dj][ej][ij][jj][kj][oj][bk][hk][ik][kk]
+[lk][nk][ok][sk][dl][el][gl][kl][ll][ml][ol][pl][ql][rl][sl][em]
+[jm][km][kn][fo][lo][ep][gp][hp][jp][lp][qp][dq][eq][hq][iq][lq]
+[nq][oq][jr][kr][mr][fs][gs][hs][is][js][ks]
+PL[W]
+)
diff --git a/regression/games/gunnar/gunnar14.sgf b/regression/games/gunnar/gunnar14.sgf
new file mode 100644 (file)
index 0000000..94350ac
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.5.10 load and print]
+DT[2004-10-15]
+KM[-3.5]RU[Japanese]AP[GNU Go:3.5.10]AW[da][ka][pa][qa][bb][eb]
+[ib][jb][kb][ob][pb][ac][cc][dc][ec][fc][kc][lc][nc][oc][bd][cd]
+[fd][gd][hd][ld][nd][od][ce][ge][ie][ke][le][me][oe][pe][gf][hf]
+[if][lf][mf][hg][lg][ng][og][pg][bh][eh][fh][gh][ai][bi][ci][di]
+[ei][fi][ri][fj][kj][lj][sj][fk][gk][ok][rk][sk][el][il][jl][ll]
+[nl][ol][pl][ql][rl][em][fm][gm][hm][im][lm][mm][nm][dn][hn][jn]
+[kn][on][do][eo][go][jo][no][oo][po][qo][ro][so][cp][dp][gp][ip]
+[jp][kp][lp][np][pp][sp][bq][cq][gq][hq][jq][lq][oq][pq][qq][ar]
+[br][nr][as][cs]
+AB[ea][fa][ga][ha][ia][ja][ra][fb][hb][qb][rb][gc][hc][ic][jc]
+[pc][qc][ad][ed][id][jd][kd][pd][ae][be][de][fe][je][ne][qe][re]
+[af][cf][ef][jf][kf][nf][of][pf][qf][rf][sf][ag][bg][eg][fg][gg]
+[ig][jg][mg][qg][rg][ah][ch][dh][hh][jh][kh][lh][mh][rh][sh][gi]
+[hi][ki][mi][si][gj][ij][jj][oj][pj][qj][rj][hk][ik][jk][kk][lk]
+[mk][nk][qk][fl][gl][hl][kl][ml][jm][km][pm][en][fn][gn][mn][nn]
+[fo][ko][lo][mo][ep][fp][mp][qp][rp][dq][eq][fq][kq][mq][nq][rq]
+[sq][cr][dr][er][gr][hr][ir][jr][kr][lr][mr][or][pr][qr][sr][ds]
+[fs][gs][qs][ss]
+PL[B]
+)
diff --git a/regression/games/gunnar/gunnar15.sgf b/regression/games/gunnar/gunnar15.sgf
new file mode 100644 (file)
index 0000000..70fa517
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.5.10 load and print]
+DT[2004-10-15]
+KM[5.5]RU[Japanese]AP[GNU Go:3.5.10]AW[ka][la][ma][eb][fb][ib]
+[jb][lb][dc][gc][hc][jc][lc][mc][pc][qc][cd][dd][fd][gd][jd][md]
+[nd][od][ce][oe][pe][bf][mf][nf][of][pf][bg][kg][lg][mg][ng][pg]
+[qg][ah][bh][lh][qh][ei][fi][li][qi][ri][cj][ej][gj][lj][mj][oj]
+[ck][dk][ek][fk][hk][kk][nk][ok][pk][bl][cl][fl][gl][hl][jl][kl]
+[ll][ml][nl][am][bm][em][fm][km][nm][om][pm][an][dn][gn][hn][kn]
+[on][pn][qn][do][ho][ko][po][qo][dp][ip][jp][qp][rp][dq][kq][lq]
+[nq][dr][er][lr][mr][nr][pr][qr][es][ms][ns][os][ps][rs]
+AB[na][kb][mb][nb][pb][qb][ec][ic][kc][nc][oc][ed][hd][id][kd]
+[ld][pd][qd][rd][de][fe][ge][he][je][ke][le][me][ne][qe][cf][gf]
+[if][kf][lf][qf][rf][cg][jg][og][rg][ch][eh][fh][kh][mh][oh][rh]
+[bi][ci][di][gi][hi][ki][ni][oi][pi][si][bj][dj][hj][ij][kj][nj]
+[pj][qj][rj][bk][ik][jk][qk][dl][el][il][ol][pl][ql][cm][dm][gm]
+[hm][im][mm][qm][bn][cn][in][jn][mn][nn][rn][ao][co][mo][oo][ro]
+[ap][cp][kp][lp][mp][np][pp][sp][cq][mq][oq][pq][qq][rq][cr][or]
+[rr][sr][cs][ds][ss]
+PL[B]IL[fj][gk]
+)
diff --git a/regression/games/gunnar/gunnar16.sgf b/regression/games/gunnar/gunnar16.sgf
new file mode 100644 (file)
index 0000000..2ea762a
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.1 load and print]
+DT[2004-11-25]
+KM[10.5]RU[Japanese]AP[GNU Go:3.7.1]AW[ga][na][ab][cb][db][lb]
+[mb][nb][ob][ac][bc][dc][ec][nc][ad][bd][dd][ed][fd][ld][md][nd]
+[od][be][ce][ie][le][oe][pe][se][af][ff][hf][if][kf][pf][rf][sf]
+[bg][dg][fg][hg][kg][pg][qg][ah][ch][dh][eh][fh][gh][hh][jh][kh]
+[lh][mh][nh][qh][rh][bi][fi][ki][ri][bj][dj][ej][kj][pj][qj][sj]
+[ak][ck][gk][ik][pk][rk][bl][cl][fl][gl][hl][il][jl][nl][ql][dm]
+[em][fm][im][jm][km][lm][nm][qm][rm][cn][en][kn][mn][qn][do][eo]
+[mo][ro][dp][kp][lp][mp][pp][qp][rp][cq][dq][eq][mq][qq][br][dr]
+[lr][rr][sr][cs][ds][es][fs]
+AB[aa][ba][ca][da][ea][fa][ka][la][ma][oa][qa][bb][eb][fb][kb]
+[pb][cc][fc][gc][kc][lc][mc][pc][qc][rc][gd][id][jd][kd][pd][sd]
+[ee][fe][he][je][qe][re][bf][cf][df][ef][gf][jf][nf][qf][cg][eg]
+[jg][mg][ng][og][rg][oh][ph][sh][ai][ci][gi][mi][ni][pi][qi][cj]
+[fj][gj][hj][ij][jj][lj][oj][ek][fk][hk][jk][kk][mk][nk][ok][dl]
+[el][kl][ll][ml][ol][pl][rl][gm][hm][om][fn][in][jn][on][fo][io]
+[ko][lo][po][qo][ep][fp][jp][op][fq][jq][kq][lq][oq][pq][rq][er]
+[fr][gr][mr][nr][pr][qr][bs][gs][rs]
+PL[B]
+)
diff --git a/regression/games/gunnar/gunnar17.sgf b/regression/games/gunnar/gunnar17.sgf
new file mode 100644 (file)
index 0000000..cb93acb
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.1 load and print]
+DT[2004-11-25]
+KM[5.5]RU[Japanese]AP[GNU Go:3.7.1]PL[W]
+AW[oa][qa][ib][jb][pb][cc][hc][kc][mc][nc][oc][pc][qc][cd][ed][gd][hd][kd][ld][pd][ae][be][ce][de][ee][fe][ke][me][oe][af][cf][ff][lf][mf][nf][of][cg][ig][jg][og][pg][ch][eh][fh][gh][hh][jh][qh][ei][fi][ji][ki][qi][fj][lj][nj][bk][ck][fk][lk][mk][nk][ok][sk][al][cl][fl][gl][hl][jl][kl][ml][rl][sl][bm][cm][em][gm][im][jm][mm][nm][pm][qm][bn][cn][dn][en][hn][nn][qn][rn][co][fo][ho][io][jo][no][ro][bp][fp][hp][jp][qp][sp][iq][jq][nq][qq][rq][nr][or][pr][sr][ps][qs][rs]
+AB[ra][qb][rb][sb][ic][jc][rc][jd][md][nd][qd][he][je][pe][qe][bf][df][ef][hf][jf][kf][pf][rf][ag][bg][dg][eg][fg][gg][hg][kg][lg][mg][ng][qg][rg][bh][dh][kh][mh][oh][ph][ai][ci][di][gi][li][mi][ni][aj][bj][cj][dj][ej][mj][oj][pj][qj][sj][ak][ek][qk][rk][dl][el][ll][nl][ol][pl][dm][fm][km][lm][om][an][fn][gn][in][jn][kn][mn][on][pn][ao][do][eo][go][ko][mo][oo][po][qo][ap][cp][dp][gp][kp][mp][np][pp][bq][eq][gq][hq][kq][mq][oq][pq][gr][ir][jr][lr][mr][ms][ns][os]
+)
diff --git a/regression/games/gunnar/gunnar18.sgf b/regression/games/gunnar/gunnar18.sgf
new file mode 100644 (file)
index 0000000..9afba2f
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.1 load and print]
+DT[2004-11-26]
+KM[6.5]RU[Japanese]AP[GNU Go:3.7.1]AW[ea][fa][ka][la][pa][qa]
+[fb][ib][kb][mb][pb][rb][fc][gc][jc][kc][qc][rc][gd][id][rd][fe]
+[he][pe][re][df][gf][if][jf][kf][lf][mf][pf][qf][lg][mg][pg][dh]
+[fh][ih][jh][kh][qh][gi][hi][ii][pi][ij][jj][oj][qj][ak][dk][fk]
+[hk][ik][jk][kk][mk][ok][al][bl][dl][el][fl][il][kl][ml][nl][bm]
+[cm][em][im][km][nm][fn][in][kn][ln][nn][bo][co][do][eo][fo][jo]
+[lo][mo][ro][ap][bp][dp][jp][kp][mp][np][op][pp][qp][rp][sp][bq]
+[dq][eq][lq][mq][oq][rq]
+AB[da][ma][na][oa][cb][eb][lb][ob][dc][ec][lc][mc][nc][pc][ed]
+[fd][jd][kd][pd][qd][ce][ee][le][me][oe][qe][ef][hf][nf][of][cg]
+[dg][fg][gg][hg][ig][jg][kg][ng][ch][eh][lh][mh][oh][ph][ei][ji]
+[ki][li][mi][oi][aj][bj][dj][ej][fj][gj][hj][kj][lj][mj][nj][bk]
+[ck][ek][gk][lk][nk][cl][gl][hl][ll][fm][gm][lm][mm][gn][jn][mn]
+[go][ho][io][cp][ep][fp][ip][aq][cq][fq][gq][jq][kq][nq][pq][qq]
+[sq][ar][br][cr][dr][er][lr][mr][nr][or][rr][sr]
+PL[B]
+)
diff --git a/regression/games/gunnar/gunnar19.sgf b/regression/games/gunnar/gunnar19.sgf
new file mode 100644 (file)
index 0000000..e822daf
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.1 load and print]
+DT[2004-12-07]
+KM[0.5]RU[Japanese]AP[GNU Go:3.7.1]AW[ha][ib][jb][mb][cc][jc]
+[kc][mc][nc][md][sd][ke][ne][qe][re][se][bf][if][kf][mf][qf][bg]
+[cg][ig][kg][pg][ch][dh][fh][ih][jh][oh][qh][ei][fi][gi][ii][oi]
+[pi][cj][gj][rj][ck][cl][nl][ql][cm][hm][jm][km][om][rm][bn][cn]
+[dn][hn][mn][pn][qn][sn][ao][bo][do][go][ro][ap][gp][ip][aq][eq]
+[fq][hq][jq][kq][er][jr]
+AB[ga][oa][gb][hb][nb][pb][dc][ic][oc][rc][sc][dd][fd][id][jd]
+[kd][nd][od][pd][qd][rd][ae][be][he][cf][df][hf][of][pf][dg][fg]
+[gg][jg][lg][mg][og][eh][kh][nh][ji][ni][ej][fj][jj][nj][oj][pj]
+[gk][lk][ok][dl][hl][ol][dm][gm][en][gn][co][fo][jo][qo][so][bp]
+[cp][dp][ep][fp][jp][kp][lp][mp][pp][rp][sp][bq][dq][ar][br][dr]
+[ir][lr]
+PL[W]
+)
diff --git a/regression/games/gunnar/gunnar2.sgf b/regression/games/gunnar/gunnar2.sgf
new file mode 100644 (file)
index 0000000..4d855a7
--- /dev/null
@@ -0,0 +1,216 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5]RE[B+6.5]
+PW[GNU Go 3.3.12 (random seed 1622506874)]PB[GNU Go 3.2 (random seed 1622506874)]
+;B[qd]
+;W[dc]
+;B[pq]
+;W[dp]
+;B[oc]
+;W[qj]
+;B[de]
+;W[ce]
+;B[cf]
+;W[cd]
+;B[df]
+;W[fc]
+;B[cj]
+;W[qo]
+;B[op]
+;W[pm]
+;B[fq]
+;W[fp]
+;B[gp]
+;W[fo]
+;B[eq]
+;W[dq]
+;B[jq]
+;W[dn]
+;B[qh]
+;W[jc]
+;B[lc]
+;W[cl]
+;B[jo]
+;W[ch]
+;B[di]
+;W[je]
+;B[rp]
+;W[oj]
+;B[bf]
+;W[mm]
+;B[lo]
+;W[ro]
+;B[so]
+;W[qp]
+;B[rq]
+;W[qq]
+;B[qr]
+;W[sn]
+;B[ei]
+;W[gd]
+;B[gi]
+;W[oh]
+;B[ek]
+;W[be]
+;B[pf]
+;W[mo]
+;B[mp]
+;W[no]
+;B[er]
+;W[dr]
+;B[mf]
+;W[np]
+;B[nq]
+;W[go]
+;B[hp]
+;W[gg]
+;B[ff]
+;W[bk]
+;B[bj]
+;W[kb]
+;B[lb]
+;W[ln]
+;B[ko]
+;W[af]
+;B[ii]
+;W[cg]
+;B[bg]
+;W[bh]
+;B[ki]
+;W[ag]
+;B[ig]
+;W[hg]
+;B[if]
+;W[ge]
+;B[mi]
+;W[dh]
+;B[fg]
+;W[mk]
+;B[nh]
+;W[og]
+;B[ri]
+;W[rj]
+;B[ds]
+;W[cs]
+;B[es]
+;W[br]
+;B[kk]
+;W[fl]
+;B[jf]
+;W[ke]
+;B[le]
+;W[la]
+;B[ma]
+;W[ka]
+;B[mb]
+;W[ni]
+;B[kf]
+;W[mh]
+;B[lh]
+;W[mj]
+;B[mg]
+;W[kl]
+;B[jl]
+;W[lk]
+;B[lj]
+;W[hl]
+;B[jk]
+;W[km]
+;B[hh]
+;W[he]
+;B[jm]
+;W[kd]
+;B[hm]
+;W[gm]
+;B[hn]
+;W[of]
+;B[oe]
+;W[ld]
+;B[md]
+;W[el]
+;B[dk]
+;W[sp]
+;B[sr]
+;W[fk]
+;B[oo]
+;W[on]
+;B[ie]
+;W[kc]
+;B[id]
+;W[ic]
+;B[fj]
+;W[fe]
+;B[gk]
+;W[hk]
+;B[hj]
+;W[ee]
+;B[ef]
+;W[ho]
+;B[gr]
+;W[im]
+;B[in]
+;W[il]
+;B[ck]
+;W[bl]
+;B[dd]
+;W[ed]
+;B[ik]
+;W[gl]
+;B[gn]
+;W[fn]
+;B[io]
+;W[fh]
+;B[eh]
+;W[gh]
+;B[pg]
+;W[qi]
+;B[rh]
+;W[ep]
+;B[dl]
+;W[dm]
+;B[ph]
+;W[ng]
+;B[pi]
+;W[oi]
+;B[pj]
+;W[pk]
+;B[sj]
+;W[rk]
+;B[sk]
+;W[sl]
+;B[si]
+;W[rl]
+;B[mh]
+;W[nf]
+;B[ne]
+;W[dg]
+;B[eg]
+;W[pp]
+;B[po]
+;W[pn]
+;B[oq]
+;W[kn]
+;B[hd]
+;W[hc]
+;B[fi]
+;W[ak]
+;B[bi]
+;W[gj]
+;B[jn]
+;W[gk]
+;B[sq]
+;W[so]
+;B[hf]
+;W[gf]
+;B[ci]
+;W[ah]
+;B[ai]
+;W[ae]
+;B[cc]
+;W[bc]
+;B[jd]
+;W[cb]
+;B[aj]
+;W[mq]
+;B[lp]
+;W[]
+;B[]
+)
diff --git a/regression/games/gunnar/gunnar20.sgf b/regression/games/gunnar/gunnar20.sgf
new file mode 100644 (file)
index 0000000..33fd2bf
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[0]
+DT[2004-12-29]
+SY[Cgoban 1.9.12];PL[B]
+AW[bb][cb][bc][hc][ic][cd][dd][ed][fd][gd][hd][fe][he][ff][fg][gg][hg][ig][fi][gi][hi][ii]
+AB[aa][ab][ac][cc][ad][bd][be][ce][de][ee][ef][cg][eg][dh][eh][fh][gh][hh][di]
+)
diff --git a/regression/games/gunnar/gunnar21.sgf b/regression/games/gunnar/gunnar21.sgf
new file mode 100644 (file)
index 0000000..bd0e91e
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.7 load and print]
+DT[2005-10-30]
+KM[-2.5]RU[Japanese]AP[GNU Go:3.7.7]AW[ca][da][ka][la][ma][na]
+[db][eb][fb][ib][jb][kb][mb][ec][gc][hc][mc][sc][gd][id][jd][kd]
+[qd][rd][sd][ce][de][ge][je][pe][af][bf][cf][df][ef][hf][if][jf]
+[nf][of][pf][qf][ag][eg][hg][ig][pg][ah][dh][eh][fh][gh][hh][ih]
+[oh][ph][rh][sh][fi][ii][ji][ki][ni][oi][qi][si][cj][dj][fj][jj]
+[kj][lj][mj][pj][dk][ek][gk][pk][el][gl][il][ol][pl][ql][em][fm]
+[im][jm][km][pm][qm][dn][gn][hn][in][jn][qn][co][do][eo][io][mo]
+[no][po][ro][bp][ep][ip][jp][kp][np][op][pp][rp][sp][bq][cq][fq]
+[iq][kq][nq][qq][rq][br][fr][hr][mr][nr][fs][gs][ns]
+AB[ba][oa][cb][lb][nb][pb][rb][sb][bc][cc][dc][fc][ic][jc][kc]
+[lc][nc][qc][rc][ad][cd][dd][ed][fd][ld][md][pd][ae][be][ee][fe]
+[ke][ne][oe][ff][gf][kf][mf][bg][cg][dg][fg][gg][jg][lg][mg][ng]
+[og][bh][ch][jh][kh][nh][ai][bi][ci][di][ei][gi][hi][li][mi][ri]
+[bj][ej][gj][hj][ij][nj][oj][qj][rj][sj][bk][ck][hk][ik][jk][kk]
+[lk][mk][nk][ok][qk][sk][bl][dl][hl][jl][kl][nl][rl][bm][dm][gm]
+[hm][lm][mm][om][rm][bn][cn][kn][mn][nn][on][pn][rn][sn][bo][jo]
+[ko][lo][oo][so][cp][dp][lp][mp][dq][eq][jq][lq][mq][cr][er][ir]
+[jr][kr][lr][bs][ds][es][hs][is][ls][ms]
+PL[B]
+)
diff --git a/regression/games/gunnar/gunnar22.sgf b/regression/games/gunnar/gunnar22.sgf
new file mode 100644 (file)
index 0000000..10ae81b
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.7.7 load and print]
+DT[2006-01-27]
+KM[48.5]RU[Japanese]AP[GNU Go:3.7.7]AW[db][eb][jb][bc][cc][fc]
+[gc][hc][ic][lc][mc][nc][oc][qc][rc][cd][dd][ed][id][md][pd][rd]
+[be][de][ie][je][ke][me][oe][qe][bf][ef][hf][jf][nf][of][qf][ag]
+[bg][cg][eg][gg][hg][ig][kg][lg][mg][og][pg][bh][dh][eh][fh][hh]
+[jh][oh][ai][bi][hi][ki][mi][oi][qi][ij][jj][mj][nj][oj][pj][qj]
+[rj][sj][ak][hk][ik][kk][mk][pk][rk][al][bl][cl][dl][il][jl][ll]
+[nl][ol][pl][rl][am][cm][dm][em][km][lm][nm][pm][rm][sm][dn][mn]
+[on][pn][qn][co][do][eo][fo][lo][mo][no][qo][ro][ap][bp][cp][ep]
+[gp][kp][lp][np][pp][bq][cq][eq][fq][gq][jq][lq][mq][oq][pq][dr]
+[er][gr][jr][kr][mr][or][qr][rr][es][js][ls][qs]
+AB[da][bb][cb][mb][pb][qb][jc][pc][ad][fd][gd][jd][kd][nd][ee]
+[he][le][ne][ff][gf][kf][lf][mf][pf][rf][fg][ng][qg][ch][gh][ih]
+[nh][qh][sh][ci][ei][fi][gi][ii][li][ni][ri][aj][bj][cj][dj][gj]
+[hj][lj][bk][ck][dk][ek][fk][gk][lk][ok][el][fl][hl][bm][fm][gm]
+[hm][im][jm][mm][qm][an][en][fn][gn][kn][ln][rn][sn][bo][go][ho]
+[jo][ko][oo][hp][ip][jp][op][aq][hq][qq][rq][sq][br][cr][fr][hr]
+[nr][pr][sr][cs][ds][fs][gs][hs][ns][ps]
+PL[W]
+)
diff --git a/regression/games/gunnar/gunnar3.sgf b/regression/games/gunnar/gunnar3.sgf
new file mode 100644 (file)
index 0000000..6185db8
--- /dev/null
@@ -0,0 +1,281 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5]RE[B+9.5]
+PW[GNU Go 3.3.12 (random seed 1554616589)]PB[GNU Go 3.2 (random seed 1554616589)]
+;B[pd]
+;W[dp]
+;B[qp]
+;W[dd]
+;B[fq]
+;W[op]
+;B[oq]
+;W[pp]
+;B[pq]
+;W[qo]
+;B[qq]
+;W[np]
+;B[mq]
+;W[pn]
+;B[cf]
+;W[lo]
+;B[ci]
+;W[nc]
+;B[lc]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[od]
+;W[nb]
+;B[me]
+;W[hq]
+;B[cq]
+;W[cp]
+;B[dq]
+;W[ep]
+;B[fr]
+;W[go]
+;B[ph]
+;W[cl]
+;B[fc]
+;W[ee]
+;B[cc]
+;W[ge]
+;B[hd]
+;W[qj]
+;B[oj]
+;W[cd]
+;B[dc]
+;W[rh]
+;B[ed]
+;W[de]
+;B[bd]
+;W[be]
+;B[bc]
+;W[ce]
+;B[ei]
+;W[he]
+;B[bg]
+;W[kq]
+;B[pk]
+;W[qk]
+;B[jd]
+;W[ie]
+;B[ek]
+;W[kf]
+;B[nh]
+;W[gg]
+;B[gi]
+;W[ig]
+;B[nk]
+;W[hi]
+;B[hj]
+;W[eg]
+;B[hk]
+;W[fd]
+;B[ec]
+;W[ka]
+;B[id]
+;W[nq]
+;B[nr]
+;W[en]
+;B[ls]
+;W[ro]
+;B[bq]
+;W[bp]
+;B[hm]
+;W[ii]
+;B[bk]
+;W[ki]
+;B[bl]
+;W[sr]
+;B[rp]
+;W[pl]
+;B[lr]
+;W[rf]
+;B[cm]
+;W[rd]
+;B[gd]
+;W[in]
+;B[kl]
+;W[ia]
+;B[sp]
+;W[aq]
+;B[ar]
+;W[ap]
+;B[qe]
+;W[pg]
+;B[ng]
+;W[qh]
+;B[pi]
+;W[re]
+;B[og]
+;W[pf]
+;B[br]
+;W[of]
+;B[ne]
+;W[fe]
+;B[lg]
+;W[kg]
+;B[ol]
+;W[om]
+;B[ml]
+;W[lh]
+;B[dh]
+;W[jk]
+;B[jl]
+;W[lf]
+;B[mg]
+;W[kd]
+;B[kc]
+;W[je]
+;B[ld]
+;W[hb]
+;B[gb]
+;W[ik]
+;B[il]
+;W[fp]
+;B[kn]
+;W[ko]
+;B[kk]
+;W[kj]
+;B[mi]
+;W[lj]
+;B[nm]
+;W[on]
+;B[hn]
+;W[ho]
+;B[jn]
+;W[io]
+;B[bn]
+;W[fl]
+;B[fk]
+;W[el]
+;B[dl]
+;W[gl]
+;B[em]
+;W[fm]
+;B[dm]
+;W[im]
+;B[gk]
+;W[gn]
+;B[hl]
+;W[pj]
+;B[fh]
+;W[ij]
+;B[ok]
+;W[jo]
+;B[gm]
+;W[fn]
+;B[gh]
+;W[hh]
+;B[fg]
+;W[ff]
+;B[df]
+;W[ef]
+;B[qi]
+;W[ri]
+;B[hr]
+;W[ir]
+;B[gq]
+;W[hs]
+;B[hp]
+;W[gr]
+;B[gp]
+;W[ip]
+;B[fs]
+;W[gs]
+;B[eq]
+;W[kr]
+;B[oc]
+;W[ob]
+;B[qf]
+;W[qg]
+;B[mj]
+;W[lk]
+;B[so]
+;W[sn]
+;B[rn]
+;W[ql]
+;B[rm]
+;W[rl]
+;B[qn]
+;W[po]
+;B[ks]
+;W[js]
+;B[lq]
+;W[ke]
+;B[dg]
+;W[ic]
+;B[jb]
+;W[bf]
+;B[jm]
+;W[ag]
+;B[ah]
+;W[af]
+;B[bh]
+;W[sl]
+;B[sm]
+;W[mp]
+;B[ib]
+;W[lp]
+;B[ms]
+;W[qm]
+;B[sn]
+;W[ja]
+;B[kb]
+;W[la]
+;B[ma]
+;W[mb]
+;B[hc]
+;W[ha]
+;B[ga]
+;W[lb]
+;B[li]
+;W[mn]
+;B[mm]
+;W[nn]
+;B[mk]
+;W[ll]
+;B[lm]
+;W[dn]
+;B[ln]
+;W[ad]
+;B[ac]
+;W[an]
+;B[am]
+;W[ao]
+;B[cn]
+;W[co]
+;B[ae]
+;W[os]
+;B[or]
+;W[ad]
+;B[jh]
+;W[kh]
+;B[ae]
+;W[nd]
+;B[oe]
+;W[ad]
+;B[gf]
+;W[hg]
+;B[ae]
+;W[ns]
+;B[ps]
+;W[ad]
+;B[jr]
+;W[jq]
+;B[ae]
+;W[ns]
+;B[os]
+;W[ad]
+;B[eh]
+;W[ae]
+;B[le]
+;W[mf]
+;B[nf]
+;W[mh]
+;B[bo]
+;W[pe]
+;B[mc]
+;W[md]
+;B[]
+;W[]
+)
diff --git a/regression/games/gunnar/gunnar4.sgf b/regression/games/gunnar/gunnar4.sgf
new file mode 100644 (file)
index 0000000..965c940
--- /dev/null
@@ -0,0 +1,223 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5]RE[B+23.5]
+PW[GNU Go 3.3.12 (random seed 1085649908)]PB[GNU Go 3.2 (random seed 1085649908)]
+;B[pd]
+;W[dp]
+;B[pp]
+;W[dc]
+;B[pj]
+;W[nc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[oc]
+;B[pc]
+;W[jc]
+;B[pf]
+;W[de]
+;B[cg]
+;W[np]
+;B[pn]
+;W[jp]
+;B[cj]
+;W[pq]
+;B[qq]
+;W[oq]
+;B[qr]
+;W[ce]
+;B[dn]
+;W[fp]
+;B[cp]
+;W[cq]
+;B[co]
+;W[bq]
+;B[nn]
+;W[lp]
+;B[me]
+;W[ld]
+;B[kf]
+;W[ln]
+;B[ll]
+;W[fn]
+;B[qj]
+;W[gc]
+;B[jl]
+;W[mm]
+;B[nk]
+;W[hm]
+;B[if]
+;W[hk]
+;B[kk]
+;W[hi]
+;B[dl]
+;W[ki]
+;B[ob]
+;W[nb]
+;B[pb]
+;W[pr]
+;B[lh]
+;W[li]
+;B[bp]
+;W[mi]
+;B[oh]
+;W[nm]
+;B[om]
+;W[jj]
+;B[bf]
+;W[be]
+;B[jn]
+;W[im]
+;B[kn]
+;W[io]
+;B[aq]
+;W[ar]
+;B[ap]
+;W[cr]
+;B[na]
+;W[ma]
+;B[oa]
+;W[ko]
+;B[mb]
+;W[lb]
+;B[la]
+;W[mc]
+;B[ma]
+;W[kb]
+;B[ae]
+;W[ad]
+;B[af]
+;W[bc]
+;B[fi]
+;W[mh]
+;B[fk]
+;W[qs]
+;B[rs]
+;W[ps]
+;B[rq]
+;W[jm]
+;B[km]
+;W[fe]
+;B[kh]
+;W[mg]
+;B[le]
+;W[jh]
+;B[kd]
+;W[kc]
+;B[jg]
+;W[eh]
+;B[ih]
+;W[ji]
+;B[jd]
+;W[ic]
+;B[eg]
+;W[dg]
+;B[dh]
+;W[di]
+;B[ch]
+;W[fg]
+;B[df]
+;W[ef]
+;B[fh]
+;W[cf]
+;B[dg]
+;W[bg]
+;B[bh]
+;W[ah]
+;B[bi]
+;W[fl]
+;B[gg]
+;W[ff]
+;B[ai]
+;W[ag]
+;B[hh]
+;W[gj]
+;B[el]
+;W[gk]
+;B[fj]
+;W[em]
+;B[od]
+;W[lc]
+;B[in]
+;W[hn]
+;B[dm]
+;W[lf]
+;B[kg]
+;W[en]
+;B[do]
+;W[ep]
+;B[mf]
+;W[ng]
+;B[lg]
+;W[ii]
+;B[og]
+;W[nl]
+;B[mk]
+;W[ol]
+;B[pl]
+;W[ok]
+;B[nj]
+;W[pk]
+;B[qk]
+;W[il]
+;B[oj]
+;W[jk]
+;B[ka]
+;W[ja]
+;B[ni]
+;W[he]
+;B[ie]
+;W[id]
+;B[hf]
+;W[gd]
+;B[eo]
+;W[fo]
+;B[kl]
+;W[nf]
+;B[lj]
+;W[of]
+;B[gf]
+;W[ge]
+;B[no]
+;W[op]
+;B[oo]
+;W[pe]
+;B[oe]
+;W[mo]
+;B[mn]
+;W[lm]
+;B[jo]
+;W[gi]
+;B[gh]
+;W[pg]
+;B[qe]
+;W[kj]
+;B[mj]
+;W[nh]
+;B[ip]
+;W[ho]
+;B[ml]
+;W[lo]
+;B[jq]
+;W[kq]
+;B[kp]
+;W[kr]
+;B[iq]
+;W[gq]
+;B[jp]
+;W[mq]
+;B[hr]
+;W[gr]
+;B[jr]
+;W[js]
+;B[is]
+;W[ks]
+;B[hp]
+;W[hq]
+;B[gp]
+;W[gs]
+;B[go]
+;W[gn]
+;B[ir]
+;W[hs]
+;B[]
+;W[]
+)
diff --git a/regression/games/gunnar/gunnar5.sgf b/regression/games/gunnar/gunnar5.sgf
new file mode 100644 (file)
index 0000000..400c7a0
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[19]
+GN[GNU Go 3.3.16 load and print]
+DT[2003-02-12]
+KM[5.5]AP[GNU Go:3.3.16]RU[Japanese];PL[B]
+AW[da][ja][ka][ma][db][eb][kb][mb][nb][ec][lc][nc][pc][dd][kd][od][de][ge][he][ie][ke][le][oe][pe][cf][ef][lf][nf][of][fg][gg][hg][ig][lg][ng][eh][fh][gh][mh][nh][oh][di][hi][li][oi][cj][dj][ej][fj][gk][pk][el][fl][gl][hl][jl][kl][ll][ql][dm][gm][lm][mm][nm][om][dn][en][in][jn][ln][nn][on][co][eo][go][jo][ko][mo][cp][ep][fp][gp][jp][lp][np][dq][fq][iq][jq][nq][dr][jr][lr][mr][ds][es][ks][ls]
+AB[ea][fa][ia][na][oa][fb][jb][ob][pb][fc][jc][kc][oc][ed][gd][hd][id][jd][pd][qd][ee][fe][je][qe][ff][gf][kf][pf][jg][kg][og][pg][hh][ih][kh][lh][ph][ei][fi][gi][mi][ni][pi][gj][hj][oj][pj][qj][dk][fk][hk][ik][jk][kk][lk][il][ml][nl][ol][em][fm][hm][im][jm][km][pm][cn][fn][gn][hn][kn][pn][qn][do][fo][ho][io][no][oo][hp][ip][op][pp][eq][gq][hq][oq][er][fr][gr][ir][nr][pr][fs][is][js][ms][ns]
+)
diff --git a/regression/games/gunnar/gunnar6.sgf b/regression/games/gunnar/gunnar6.sgf
new file mode 100644 (file)
index 0000000..2ea9664
--- /dev/null
@@ -0,0 +1,199 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[2]KM[0.5]RE[B+107.5]
+PW[GNU Go 3.3.17 (random seed 434243853)]PB[GNU Go 3.2 (random seed 434243853)]
+AB[pd]AB[dp]
+;W[ec]
+;B[pp]
+;W[cn]
+;B[cc]
+;W[de]
+;B[be]
+;W[qn]
+;B[ql]
+;W[on]
+;B[np]
+;W[mn]
+;B[cl]
+;W[cq]
+;B[dq]
+;W[cp]
+;B[do]
+;W[cr]
+;B[dn]
+;W[bn]
+;B[el]
+;W[lp]
+;B[gc]
+;W[fe]
+;B[jc]
+;W[qf]
+;B[nc]
+;W[rd]
+;B[qc]
+;W[qi]
+;B[ol]
+;W[iq]
+;B[cg]
+;W[eh]
+;B[di]
+;W[fq]
+;B[ef]
+;W[fc]
+;B[dr]
+;W[gd]
+;B[hc]
+;W[ie]
+;B[fg]
+;W[rp]
+;B[nq]
+;W[mr]
+;B[rq]
+;W[qq]
+;B[qp]
+;W[rr]
+;B[ml]
+;W[fi]
+;B[hg]
+;W[hi]
+;B[jg]
+;W[ke]
+;B[rc]
+;W[ld]
+;B[lb]
+;W[oe]
+;B[ro]
+;W[sq]
+;B[pq]
+;W[qo]
+;B[lg]
+;W[ee]
+;B[gj]
+;W[ij]
+;B[jk]
+;W[hk]
+;B[hm]
+;W[og]
+;B[ne]
+;W[gb]
+;B[hb]
+;W[ea]
+;B[ni]
+;W[ii]
+;B[gi]
+;W[il]
+;B[im]
+;W[ki]
+;B[ga]
+;W[dd]
+;B[jl]
+;W[nf]
+;B[me]
+;W[ak]
+;B[ei]
+;W[bj]
+;B[fm]
+;W[lm]
+;B[ll]
+;W[ds]
+;B[es]
+;W[cs]
+;B[fb]
+;W[er]
+;B[eb]
+;W[re]
+;B[lf]
+;W[sc]
+;B[sb]
+;W[sd]
+;B[rb]
+;W[oj]
+;B[nj]
+;W[jn]
+;B[rk]
+;W[od]
+;B[oc]
+;W[rm]
+;B[sh]
+;W[dj]
+;B[ej]
+;W[dk]
+;B[ck]
+;W[cj]
+;B[cm]
+;W[dl]
+;B[dm]
+;W[bh]
+;B[oi]
+;W[pj]
+;B[ph]
+;W[ri]
+;B[rh]
+;W[qh]
+;B[si]
+;W[pg]
+;B[rg]
+;W[qg]
+;B[pe]
+;W[pf]
+;B[fp]
+;W[sf]
+;B[hp]
+;W[gq]
+;B[ik]
+;W[gp]
+;B[go]
+;W[ho]
+;B[fo]
+;W[hn]
+;B[hj]
+;W[nd]
+;B[md]
+;W[of]
+;B[km]
+;W[kn]
+;B[bg]
+;W[rl]
+;B[qk]
+;W[eq]
+;B[sl]
+;W[sm]
+;B[sk]
+;W[qm]
+;B[ah]
+;W[ai]
+;B[ch]
+;W[ag]
+;B[af]
+;W[gn]
+;B[pm]
+;W[nm]
+;B[nl]
+;W[gm]
+;B[gl]
+;W[ek]
+;B[in]
+;W[io]
+;B[jm]
+;W[fk]
+;B[fl]
+;W[fn]
+;B[gk]
+;W[bm]
+;B[fj]
+;W[ah]
+;B[bk]
+;W[aj]
+;B[co]
+;W[bo]
+;B[bl]
+;W[al]
+;B[ep]
+;W[mm]
+;B[om]
+;W[pn]
+;B[ci]
+;W[am]
+;B[en]
+;W[bi]
+;B[]
+;W[]
+)
diff --git a/regression/games/gunnar/gunnar7.sgf b/regression/games/gunnar/gunnar7.sgf
new file mode 100644 (file)
index 0000000..a25ce17
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.17 load and print]
+DT[2003-04-17]
+KM[5.5]AP[GNU Go:3.3.17]RU[Japanese]
+;AW[ma][na][oa][sa][bb][cb][gb][hb][mb][nb][rb][sb][dc][ec][gc]
+[nc][qc][cd][ed][fd][gd][id][ld][md][nd][od][qd][sd][ce][ge][me]
+[ne][oe][qe][cf][df][gf][if][kf][lf][mf][qf][ag][bg][cg][gg][ig]
+[jg][kg][mg][qg][rg][sg][bh][gh][ih][jh][kh][nh][rh][ei][gi][hi]
+[ji][oi][dj][ej][hj][lj][ck][dk][fk][al][dl][el][fl][gl][ol][am]
+[bm][cm][dm][gm][hm][om][rm][an][dn][gn][qn][rn][sn][eo][go][ko]
+[no][oo][qo][ro][cp][ep][ip][jp][kp][lp][np][rp][bq][cq][dq][eq]
+[fq][gq][iq][lq][nq][qq][cr][fr][lr][mr][nr][or][pr][rr][es][ks]
+[ls][ms]
+AB[la][pa][qa][ra][db][ib][lb][ob][pb][qb][bc][cc][hc][ic][lc]
+[mc][oc][pc][dd][kd][pd][de][ee][fe][he][je][ke][le][pe][ef][ff]
+[jf][nf][of][pf][rf][dg][fg][lg][ng][pg][ah][ch][dh][eh][fh][lh]
+[mh][oh][qh][sh][ai][bi][di][fi][ii][ki][li][pi][qi][ri][si][cj]
+[fj][gj][ij][jj][pj][sj][ak][bk][gk][hk][ik][bl][cl][hl][pl][rl]
+[sl][im][pm][qm][sm][bn][cn][en][fn][hn][kn][nn][on][pn][co][do]
+[fo][ho][io][jo][lo][mo][po][bp][dp][fp][gp][hp][mp][op][pp][qp]
+[hq][mq][oq][pq][br][gr][hr][ir][jr][kr][fs][gs][js]
+PL[B])
diff --git a/regression/games/gunnar/gunnar8.sgf b/regression/games/gunnar/gunnar8.sgf
new file mode 100644 (file)
index 0000000..73c1444
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.17 load and print]
+DT[2003-04-17]
+KM[-10.5]AP[GNU Go:3.3.17]RU[Japanese]
+;AW[ba][ea][ga][oa][pa][eb][gb][hb][pb][qb][dc][fc][gc][jc][kc]
+[qc][cd][dd][hd][id][jd][rd][ae][be][ie][me][ne][oe][pe][qe][se]
+[bf][cf][jf][mf][nf][rf][sf][cg][jg][kg][lg][mg][ch][jh][ph][qh]
+[rh][di][ei][ii][mi][oi][ej][fj][hj][ij][jj][lj][mj][oj][pj][gk]
+[hk][kk][mk][ok][dl][fl][il][jl][kl][ml][ol][am][cm][dm][fm][jm]
+[lm][mm][om][an][bn][cn][en][fn][gn][mn][nn][on][sn][do][eo][lo]
+[mo][no][oo][po][ro][so][dp][mp][pp][qp][rp][sp][dq][eq][qq][sq]
+[dr][er][fr][hr][jr][mr][es][is]
+AB[da][ha][ia][ma][na][ab][bb][cb][db][ib][jb][kb][lb][ob][bc]
+[hc][ic][lc][mc][oc][pc][ad][bd][ld][md][nd][pd][je][ke][le][af]
+[kf][lf][of][pf][qf][ag][bg][ig][ng][og][qg][rg][sg][bh][dh][lh]
+[mh][nh][oh][sh][bi][ci][hi][ji][ki][ni][pi][qi][ri][aj][cj][dj]
+[kj][nj][qj][ak][dk][ek][ik][nk][qk][al][bl][cl][el][gl][hl][nl]
+[pl][rl][bm][em][gm][hm][im][km][nm][pm][sm][hn][in][jn][kn][ln]
+[pn][qn][rn][fo][go][ho][io][ko][ep][fp][gp][jp][kp][lp][np][op]
+[fq][gq][hq][jq][mq][nq][oq][pq][rq][gr][ir][kr][lr][or][qr][rr]
+[sr][fs][gs][rs]
+PL[B])
diff --git a/regression/games/gunnar/gunnar9.sgf b/regression/games/gunnar/gunnar9.sgf
new file mode 100644 (file)
index 0000000..65c019f
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.18 load and print]
+DT[2003-04-27]
+KM[4.0]AP[GNU Go:3.3.18]RU[Japanese]
+;AW[aa][ca][ka][la][ab][cb][jb][kb][bc][dc][ec][ic][jc][qc][rc]
+[bd][ed][gd][hd][jd][kd][od][pd][fe][je][ne][oe][ef][gf][jf][lf]
+[mf][nf][qf][sf][eg][lg][ng][qg][rg][sg][mh][nh][ph][rh][hi][ii]
+[ji][ki][ni][oi][pi][qi][si][dj][ej][jj][qj][rj][ck][dk][hk][ik]
+[jk][kk][cl][fl][kl][nl][ol][ql][rl][sl][bm][cm][dm][em][fm][gm]
+[im][jm][km][mm][pm][qm][an][bn][dn][gn][mn][nn][on][qn][co][go]
+[io][jo][mo][po][ro][so][ap][bp][cp][mp][op][pp][qp][sp][bq][dq]
+[hq][iq][kq][lq][nq][gr][hr][jr][kr][nr][gs][ms]
+AB[ma][lb][ob][qb][rb][cc][kc][lc][oc][pc][sc][ad][cd][dd][id]
+[ld][nd][qd][be][de][ee][ge][he][ie][ke][le][me][pe][qe][re][se]
+[df][hf][kf][pf][rf][dg][hg][kg][og][pg][dh][gh][kh][lh][oh][di]
+[gi][li][mi][bj][cj][gj][hj][kj][lj][mj][nj][oj][pj][sj][bk][ek]
+[fk][gk][lk][nk][pk][qk][rk][sk][al][bl][dl][el][gl][hl][il][jl]
+[ll][ml][pl][am][en][fn][in][jn][kn][do][fo][lo][oo][dp][fp][gp]
+[hp][ip][jp][kp][lp][rp][aq][cq][eq][gq][jq][oq][qq][rq][sq][ar]
+[br][cr][fr][or][pr][rr][fs][ns][os]
+PL[W];W[ho];B[lm];W[ln])
diff --git a/regression/games/gunnar/rbm-bobk-200303111815.sgf b/regression/games/gunnar/rbm-bobk-200303111815.sgf
new file mode 100644 (file)
index 0000000..59b5e4d
--- /dev/null
@@ -0,0 +1,59 @@
+
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[rbm-bobk(B) NNGS]
+EV[None]
+RE[W+12.5]
+PW[rbm]WR[4k*]
+PB[bobk]BR[7k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2003-03-11]
+SZ[19]TM[600]KM[5.5]
+
+HA[4]AB[pd][dp][dd][pp]
+C[
+ rbm 4k*: g'day to you too..
+]
+;W[nq];B[lq];W[no];B[qn];W[cn];B[gq];W[qf];B[qk];W[fc];B[hc];W[qi]C[
+ fuji started observation.
+]
+;B[nd];W[rd];B[qc];W[fe];B[cf];W[lc];B[he];W[le];B[rc];W[qd];B[oc];W[cj]
+;B[ch];W[fg];B[eb];W[ec];B[dc];W[fb];B[db];W[jc];B[gd];W[ee];B[hg];W[ei]
+;B[di];W[dj];B[eh];W[fh];B[jf];W[lg];B[kd];W[ld];B[kc];W[kb];B[jd];W[jb]
+;B[ic];W[mb];B[kf];W[lf];B[nb];W[pb]C[
+ fuji started observation.
+]
+;B[pc];W[pe];B[oe];W[of];B[nf];W[ng];B[og];W[pf];B[mg];W[nh];B[mh];W[mf]
+;B[ne];W[kh];B[ni];W[oh];B[oi];W[ph];B[li];W[ki];B[lj];W[kj];B[kk];W[lk]
+;B[mk];W[ll];B[jk];W[pj];B[nk];W[pk];B[nm];W[km];B[ql];W[ol];B[mm];W[om]
+;B[ln];W[po];B[qo];W[oo];B[im];W[kn];B[lo];W[in];B[hm];W[hn];B[jm];W[jn]
+;B[gm];W[gn];B[hj];W[hi];B[ii];W[ij];B[jj];W[ih];B[ji];W[jh];B[gi];W[hh]
+;B[fi];W[ej];B[gk];W[gh];B[fm];W[kp];B[lp];W[gp];B[fn];W[fq];B[hq];W[kq]
+;B[fp];W[fo];B[ep];W[eo];B[hp];W[go];B[ko];W[do];B[dm]C[
+ sjfried started observation.
+]
+;W[cp];B[eq];W[er];B[fr];W[dr];B[jo];W[cm];B[ig];W[bg];B[cg];W[bh];B[bf]
+;W[ci];B[dh];W[ia];B[hb];W[ha];B[gf];W[ff];B[ib];W[ke];B[je];W[ge];B[ie]
+;W[gb];B[gc];W[fa];B[de];W[qp];B[qq];W[rp];B[pq];W[rq];B[rr];W[sr];B[qr]
+;W[oq];B[ro];W[nr];B[sp];W[lr];B[kr];W[jr];B[jq];W[ks];B[jp];W[kr];B[ir]
+;W[dq];B[fq];W[el];B[fl];W[em];B[ik];W[rj];B[rk];W[na];B[ob];W[oa];B[qb]
+;W[pa];B[qa];W[ma];B[sc];W[sd];B[mc];W[md];B[nc];W[fk];B[gj];W[pi];B[lh]
+;W[kg];B[nj];W[jg];B[hf];W[ea];B[da];W[ai];B[ja];W[ka];B[lb];W[la];B[df]
+;W[af];B[be];W[ae];B[ad];W[ag];B[bd];W[eg];B[pn];W[on];B[pl];W[ok];B[qj]
+;W[ri];B[is];W[mq];B[io];W[pm];B[qm];W[kl];B[jl];W[en];B[es];W[ds];B[fs]
+;W[fj];B[os];W[or];B[ps];W[pr];B[sq];W[ns];B[qs];W[op];B[sj];W[si];B[sk]
+;W[mp];B[lm];W[tt];B[tt]C[
+ rbm 4k*: the group at the top was not dead :)
+ rbm 4k*: no
+ rbm 4k*: at least :)
+ rbm 4k*: well, just keep playing black and try to kill the white stones
+ rbm 4k*: i understand
+ rbm 4k*: are you sure?  do you want to try to kill them?
+ rbm 4k*: ok..a fun game...
+]
+;)
+
+---
diff --git a/regression/games/gwe.sgf b/regression/games/gwe.sgf
new file mode 100644 (file)
index 0000000..464fb35
--- /dev/null
@@ -0,0 +1,259 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.236 (level 8) gmp]HA[3]KM[0.5]GN[GNU Go 2.7.236 gmp Random Seed 0] 
+AB[dd]AB[pd]AB[dp]
+;W[po]
+;B[pq]
+;W[qq]
+;B[qr]
+;W[qp]
+;B[or]
+;W[qk]
+;B[np]
+;W[qf]
+;B[qh]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[od]
+;W[rd]
+;B[re]
+;W[rc]
+;B[qe]
+;W[nc]
+;B[pf]
+;W[cn]
+;B[cl]
+;W[en]
+;B[fp]
+;W[fc]
+;B[hc]
+;W[cc]
+;B[kc]
+;W[cd]
+;B[ok]
+;W[jq]
+;B[dh]
+;W[fe]
+;B[de]
+;W[dc]
+;B[ce]
+;W[dl]
+;B[he]
+;W[ck]
+;B[bl]
+;W[bp]
+;B[bk]
+;W[cq]
+;B[dq]
+;W[pm]
+;B[dr]
+;W[ek]
+;B[hq]
+;W[rr]
+;B[lr]
+;W[gb]
+;B[cj]
+;W[ir]
+;B[hr]
+;W[jo]
+;B[dk]
+;W[el]
+;B[jm]
+;W[jp]
+;B[gg]
+;W[lb]
+;B[hb]
+;W[qs]
+;B[pr]
+;W[ha]
+;B[ia]
+;W[ga]
+;B[ef]
+;W[ib]
+;B[ic]
+;W[jb]
+;B[jc]
+;W[kb]
+;B[rs]
+;W[ss]
+;B[sq]
+;W[ri]
+;B[rh]
+;W[qi]
+;B[rq]
+;W[rp]
+;B[md]
+;W[sh]
+;B[ph]
+;W[rg]
+;B[qg]
+;W[be]
+;B[bf]
+;W[bd]
+;B[nd]
+;W[oc]
+;B[hn]
+;W[lp]
+;B[nn]
+;W[ln]
+;B[nl]
+;W[ll]
+;B[oi]
+;W[kk]
+;B[ki]
+;W[ik]
+;B[jg]
+;W[in]
+;B[im]
+;W[ho]
+;B[gn]
+;W[hm]
+;B[fo]
+;W[hl]
+;B[mg]
+;W[cr]
+;B[hi]
+;W[af]
+;B[bg]
+;W[fn]
+;B[go]
+;W[hp]
+;B[gm]
+;W[gl]
+;B[ei]
+;W[ds]
+;B[es]
+;W[cs]
+;B[fr]
+;W[ii]
+;B[ih]
+;W[ji]
+;B[hj]
+;W[mo]
+;B[jh]
+;W[no]
+;B[jj]
+;W[ij]
+;B[jk]
+;W[jl]
+;B[kj]
+;W[km]
+;B[ej]
+;W[op]
+;B[oq]
+;W[nq]
+;B[nr]
+;W[mq]
+;B[gp]
+;W[mm]
+;B[nm]
+;W[lj]
+;B[li]
+;W[mj]
+;B[mr]
+;W[iq]
+;B[ks]
+;W[is]
+;B[kr]
+;W[fj]
+;B[fi]
+;W[gj]
+;B[bn]
+;W[bo]
+;B[bm]
+;W[gi]
+;B[hh]
+;W[hs]
+;B[gh]
+;W[gs]
+;B[eq]
+;W[gr]
+;B[hk]
+;W[il]
+;B[mi]
+;W[gq]
+;B[nj]
+;W[cm]
+;B[mk]
+;W[lk]
+;B[er]
+;W[pj]
+;B[mc]
+;W[mb]
+;B[ff]
+;W[gd]
+;B[ge]
+;W[ed]
+;B[lc]
+;W[pp]
+;B[hd]
+;W[pl]
+;B[ao]
+;W[ap]
+;B[an]
+;W[kq]
+;B[gk]
+;W[fm]
+;B[fk]
+;W[fl]
+;B[ag]
+;W[ae]
+;B[sd]
+;W[sc]
+;B[se]
+;W[sg]
+;B[rf]
+;W[oj]
+;B[on]
+;W[pn]
+;B[oo]
+;W[lq]
+;B[jr]
+;W[ml]
+;B[nk]
+;W[ni]
+;B[nh]
+;W[gc]
+;B[ee]
+;W[fd]
+;B[sf]
+;W[si]
+;B[js]
+;W[ms]
+;B[pi]
+;W[ps]
+;B[os]
+;W[pk]
+;B[ol]
+;W[ns]
+;B[ls]
+;W[ms]
+;B[rs]
+;W[qs]
+;B[sp]
+;W[ps]
+;B[rs]
+;W[qs]
+;B[so]
+;W[sn]
+;B[rn]
+;W[ro]
+;B[sm]
+;W[mn]
+;B[ni]
+;W[om]
+;B[sn]
+;W[rl]
+;B[qn]
+;W[qm]
+;B[sl]
+;W[sk]
+;B[sr]
+;W[rm]
+;B[rs]
+;W[qo]
+;B[tt]
+;W[tt]
+
+)
+
diff --git a/regression/games/hamete_joseki.sgf b/regression/games/hamete_joseki.sgf
new file mode 100644 (file)
index 0000000..2a4b8ef
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+AP[Quarry:0.1.5]
+SZ[19]
+HA[0]
+KM[6.5]
+PB[GNU Go 3.5.10]
+PW[Arend Bayer]
+;B[qd];W[cd];B[ec];W[dq];B[de];W[dd];B[ed];W[ee];B[fe];W[ef]
+;B[ce];W[be];B[cf];W[bc];B[ch];W[dc];B[fg];W[eg];B[fh];W[ff]
+;B[gf];W[fd];B[ge];W[fc];B[do];W[fp];B[cq];W[dp];B[cp];W[eo]
+;B[dn];W[cl];B[eb];W[fb];B[pp];W[bn];B[ph];W[oc];B[mc];W[qc]
+;B[rc];W[qb];B[eh];W[ea];B[jc];W[pd];B[qe];W[rb];B[bo];W[cn]
+;B[qk]
+)
diff --git a/regression/games/handtalk/handtalk1.sgf b/regression/games/handtalk/handtalk1.sgf
new file mode 100644 (file)
index 0000000..beb3ed9
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+DT[2002-03-28]
+GN[Game supplied by Jessie Annala]
+RE[W+16.5]
+;B[pd];W[dq];B[cd];W[qq];B[do];W[co];B[cn];W[cp];B[dn];W[fq];B[cj];
+W[ec];B[ic];W[cb];B[np];W[qm];B[cg];W[kq];B[nn];W[qo];B[nl];W[gc];
+B[lc];W[qi];B[pf];W[hp];B[le];W[de];B[ce];W[df];B[ch];W[qc];B[qd];
+W[rc];B[pc];W[pb];B[ob];W[pa];B[ra];W[rb];B[oa];W[qb];B[rd];W[oi];
+B[bn];W[ko];B[lm];W[mi];B[qk];W[pl];B[fn];W[nr];B[jm];W[ki];B[eh];
+W[gi];B[fj];W[gj];B[io];W[ip];B[hm];W[fk];B[gk];W[gl];B[hk];W[ek];
+B[fi];W[hl];B[il];W[ik];B[hj];W[gg];B[fl];W[ih];B[ij];W[jk];B[dk];
+W[mf];B[ie];W[lf];B[ne];W[me];B[md];W[ke];B[kd];W[cf];B[bf];W[jj];
+B[aq];W[bo];B[ao];W[bq];B[ap];W[hd];B[je];W[ld];B[jg];W[eg];B[le];
+W[kf];B[br];W[cr];B[hb];W[rf];B[fb];W[gb];B[ga];W[eb];B[fc];W[fd];
+B[fa];W[sd];B[se];W[sc];B[re];W[qf];B[sa];W[pg];B[sf];W[of];B[rg];
+W[pe];B[nd];W[fh];B[di];W[rh];B[jf];W[bc];B[hi];W[gh];B[hc];W[gd];
+B[mq];W[mr];B[jo];W[kn];B[km];W[jp];B[lq];W[lr];B[ok];W[pk];B[pj];
+W[oj];B[nk];W[lk];B[kg];W[lh];B[bd];W[bs];B[ar];W[nq];B[lp];W[kp];
+B[lo];W[op];B[oo];W[po];B[pn];W[om];B[on];W[ql];B[ln];W[nm];B[ml];
+W[ea];B[ha];W[qn];B[nf];W[ng];B[qg];W[go];B[qh];W[ph];B[sg];W[ri];
+B[jl];W[gn];B[gm];W[mj];B[jh];W[hh];B[ii];W[ad];B[ji];W[dd];B[ae];
+W[ac];B[be];W[cc];B[ag];W[ep];B[bp];W[cq];B[lg];W[mg];B[id];W[hf];
+B[ld];W[fo];B[eo];W[he];B[jn];W[sh];B[qe];W[pf];B[oe];W[hn];B[ol];
+W[pm];B[mm];W[nj];B[kk];W[kj];B[kl];W[dg];B[dh];W[in];B[im];W[ig];
+B[mk];W[cs];B[ll];W[lj];B[ho];W[dp];B[if];W[kh];B[an];W[as];B[tt];
+W[tt];
+TW[aa][ba][ca][da][ab][bb][db][dc][ed][ee][fe][ge][ef][ff][gf][fg][hg][og][mh][nh][oh][li][ni][pi][si][pj][qj][rj][sj][qk][rk][sk][rl][sl][rm][sm][rn][sn][ro][so][fp][gp][pp][qp][rp][sp][eq][gq][hq][iq][jq][oq][pq][rq][sq][dr][er][fr][gr][hr][ir][jr][kr][or][pr][qr][rr][sr][ds][es][fs][gs][hs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+TB[ia][ja][ka][la][ma][na][pa][qa][ib][jb][kb][lb][mb][nb][pb][qb][rb][sb][jc][kc][mc][nc][oc][qc][rc][sc][jd][od][sd][af][bg][ah][bh][ai][bi][ci][ei][aj][bj][dj][ej][ak][bk][ck][ek][fk][al][bl][cl][dl][el][gl][hl][am][bm][cm][dm][em][fm][en][mn][mo][no][mp]
+C[The game is over.  Final score:   White = 84
+territory + 4 captures + 5.5 komi = 93.5   
+Black = 64 territory + 13 captures = 77
+White wins by 16.5.]
+)
diff --git a/regression/games/handtalk/handtalk10.sgf b/regression/games/handtalk/handtalk10.sgf
new file mode 100644 (file)
index 0000000..30cd184
--- /dev/null
@@ -0,0 +1,63 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-05]
+RE[B+14.5]
+;B[qd];W[qp];B[dp];W[cd];B[ec]
+;W[df];B[op];W[oc];B[ld];W[nd]
+;B[pf];W[qb];B[qj];W[jc];B[qq]
+;W[lc];B[rp];W[jq];B[qo];W[gc]
+;B[cb];W[ed];B[fc];W[fd];B[gb]
+;W[hb];B[hc];W[ib];B[gd];W[ck]
+;B[gq];W[mq];B[oj];W[cn];B[co]
+;W[bn];B[bo];W[if];B[ge];W[kd]
+;B[gg];W[dh];B[md];W[mc];B[mf]
+;W[pl];B[om];W[ol];B[nl];W[nm]
+;B[ml];W[nn];B[on];W[mo];B[ne]
+;W[kg];B[nr];W[mr];B[ms];W[mj]
+;B[kl];W[kj];B[jm];W[jo];B[hm]
+;W[hp];B[ni];W[gp];B[nj];W[fq]
+;B[eq];W[fr];B[er];W[eo];B[dn]
+;W[do];B[dm];W[bl];B[cq];W[fm]
+;B[ks];W[fk];B[fp];W[gr];B[fo]
+;W[en];B[ir];W[hq];B[ep];W[kn]
+;B[gn];W[fn];B[go];W[hr];B[mk]
+;W[lj];B[bc];W[bd];B[ad];W[ae]
+;B[ac];W[be];B[gi];W[mh];B[nh]
+;W[jr];B[jh];W[mg];B[ng];W[lf]
+;B[jj];W[jk];B[ij];W[kk];B[hk]
+;W[dl];B[lm];W[rc];B[rd];W[kh]
+;B[an];W[cm];B[sc];W[sb];B[sd]
+;W[am];B[ao];W[oe];B[nf];W[qg]
+;B[qf];W[jg];B[ih];W[of];B[og]
+;W[pg];B[ph];W[rh];B[rg];W[le]
+;B[ei];W[di];B[js];W[ej];B[pe]
+;W[od];B[no];W[qh];B[rf];W[mn]
+;B[qi];W[fi];B[fh];W[eh];B[eg]
+;W[me];B[nq];W[dg];B[ef];W[es]
+;B[ds];W[fs];B[cr];W[dc];B[db]
+;W[kr];B[cc];W[dd];B[id];W[je]
+;B[gj];W[il];B[rb];W[ra];B[qc]
+;W[pb];B[jn];W[rb];B[iq];W[ip]
+;B[is];W[hs];B[ls];W[fe];B[mp]
+;W[lp];B[np];W[ff];B[fg];W[gf]
+;B[hl];W[hg];B[hh];W[ee];B[gh]
+;W[ga];B[fa];W[ha];B[lq];W[lr]
+;B[lo];W[kp];B[ln];W[ns];B[os]
+;W[ko];B[ic];W[jb];B[he];W[ms]
+;B[or];W[ji];B[ii];W[ki];B[hf]
+;W[ig];B[fj];W[mi];B[ho];W[gl]
+;B[km];W[lk];B[gm];W[io];B[gk]
+;W[fl];B[in];W[ei];B[im];W[ie]
+;B[ll];W[sh];B[ik];W[jl];B[pd]
+;W[sg];B[ri];W[jd];B[pc];W[tt];B[tt];
+TW[ia][ja][ka][la][ma][na][oa][pa][qa][sa][kb][lb][mb][nb][ob][kc][nc][ld][md][ce][de][ke][af][bf][cf][jf][kf][ag][bg][cg][lg][ah][bh][ch][lh][ai][bi][ci][li][aj][bj][cj][dj][ak][bk][dk][ek][al][cl][el][bm][dm][em][dn][jp][gq][iq][kq][lq][ir][gs][is][js][ks][ls]
+TB[aa][ba][ca][da][ea][ab][bb][eb][fb][gc][hd][qe][re][se][sf][pg][qg][sg][oh][qh][rh][sh][hi][oi][pi][si][hj][pj][rj][sj][nk][ok][pk][qk][rk][sk][ol][pl][ql][rl][sl][mm][nm][pm][qm][rm][sm][hn][mn][nn][pn][qn][rn][sn][mo][oo][po][ro][so][ap][bp][cp][pp][qp][sp][aq][bq][dq][oq][pq][rq][sq][ar][br][dr][pr][qr][rr][sr][as][bs][cs][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 65 territory + 15 captures + 5.5 komi = 85.5
+   Black = 86 territory + 14 captures = 100
+Black wins by 14.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk11.sgf b/regression/games/handtalk/handtalk11.sgf
new file mode 100644 (file)
index 0000000..a808efe
--- /dev/null
@@ -0,0 +1,64 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-05]
+RE[B+16.5]
+;B[pd];W[dp];B[pq];W[cc];B[cn]
+;W[qo];B[qk];W[rq];B[ck];W[mq]
+;B[po];W[pn];B[nr];W[qn];B[df]
+;W[mr];B[qh];W[gc];B[fq];W[eq]
+;B[fp];W[co];B[dn];W[kc];B[jp]
+;W[nc];B[oc];W[nb];B[ff];W[ec]
+;B[ek];W[mo];B[oo];W[on];B[np]
+;W[mp];B[qr];W[nq];B[rr];W[or]
+;B[no];W[nn];B[rp];W[pp];B[ci]
+;W[eo];B[ob];W[nk];B[ep];W[do]
+;B[dq];W[cq];B[dr];W[bn];B[hf]
+;W[bm];B[gn];W[jf];B[ne];W[jh]
+;B[en];W[jj];B[nh];W[jl];B[ce]
+;W[gk];B[hm];W[fh];B[ie];W[ic]
+;B[jm];W[km];B[jn];W[je];B[na]
+;W[gg];B[ma];W[lb];B[gf];W[kk]
+;B[hk];W[fl];B[hj];W[hg];B[gj]
+;W[fo];B[go];W[fn];B[fk];W[gl]
+;B[fm];W[el];B[em];W[hl];B[dl]
+;W[il];B[ei];W[bp];B[gm];W[rl]
+;B[rk];W[cr];B[ds];W[eg];B[fg]
+;W[dg];B[eh];W[ef];B[ee];W[fi]
+;B[gh];W[ig];B[hh];W[ql];B[ro]
+;W[qc];B[qd];W[jr];B[bd];W[bc]
+;B[ac];W[ab];B[ad];W[bb];B[sl]
+;W[md];B[rm];W[pk];B[pj];W[pl]
+;B[hr];W[me];B[mf];W[oj];B[pi]
+;W[iq];B[lf];W[hq];B[gq];W[jq]
+;B[lh];W[kp];B[ko];W[rn];B[sn]
+;W[cs];B[fr];W[lo];B[kn];W[ln]
+;B[bl];W[oi];B[oh];W[ip];B[pr]
+;W[la];B[os];W[ns];B[ir];W[mi]
+;B[mh];W[li];B[le];W[ps];B[dd]
+;W[dc];B[ii];W[jo];B[ji];W[ki]
+;B[in];W[fd];B[qp];W[op];B[qm]
+;W[nd];B[od];W[pb];B[rc];W[al]
+;B[ak];W[am];B[cm];W[ni];B[io]
+;W[is];B[hs];W[js];B[hp];W[id]
+;B[hd];W[hc];B[he];W[ld];B[qs]
+;W[kg];B[mb];W[cg];B[bg];W[bh]
+;B[bf];W[pm];B[sm];W[mc];B[oa]
+;W[ke];B[lg];W[fe];B[ch];W[ed]
+;B[de];W[ik];B[ih];W[if];B[fj]
+;W[jp];B[kh];W[jg];B[os];W[oq]
+;B[ps];W[of];B[nf];W[pf];B[og]
+;W[re];B[rg];W[rd];B[rb];W[ij]
+;B[cd];W[qb];B[sc];W[im];B[kf]
+;W[ge];B[gi];W[gd];B[fh];W[tt]
+;B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ka][cb][db][eb][fb][gb][hb][ib][jb][kb][fc][jc][lc][jd][kd][kj][lj][mj][nj][jk][lk][mk][ok][kl][ll][ml][nl][ol][lm][mm][nm][om][an][mn][ao][bo][no][oo][po][ap][cp][lp][np][aq][bq][kq][lq][ar][br][kr][lr][nr][as][bs][ks][ls][ms]
+TB[pa][qa][ra][sa][pb][qb][sb][pc][qc][rd][sd][ae][be][oe][pe][qe][re][se][af][cf][ef][of][pf][qf][rf][sf][ag][cg][dg][eg][mg][ng][pg][qg][sg][ah][bh][dh][ph][rh][sh][ai][bi][di][fi][hi][qi][ri][si][aj][bj][cj][dj][ej][qj][rj][sj][bk][dk][sk][cl][dm][hn][ho][so][gp][sp][eq][qq][rq][sq][er][gr][sr][es][fs][gs][rs][ss]
+C[The game is over.  Final score:
+   White = 67 territory + 7 captures + 5.5 komi = 79.5
+   Black = 79 territory + 17 captures = 96
+Black wins by 16.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk12.sgf b/regression/games/handtalk/handtalk12.sgf
new file mode 100644 (file)
index 0000000..c3ebc0a
--- /dev/null
@@ -0,0 +1,77 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.31]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-06]
+RE[W+16.5]
+;B[pd];W[cd];B[pp];W[cp];B[ed]
+;W[ec];B[fc];W[dc];B[fd];W[cf]
+;B[jc];W[ep];B[gq];W[qj];B[jq]
+;W[dj];B[gm];W[qm];B[qo];W[qg]
+;B[qe];W[mc];B[om];W[me];B[cl]
+;W[ck];B[dl];W[lq];B[kr];W[lo]
+;B[oc];W[lr];B[er];W[pn];B[mm]
+;W[or];B[eg];W[qq];B[ci];W[fj]
+;B[gi];W[gj];B[hj];W[hk];B[bk]
+;W[hm];B[gk];W[gl];B[fk];W[fl]
+;B[ek];W[gn];B[fi];W[ik];B[fb]
+;W[pk];B[ca];W[eb];B[ea];W[cb]
+;B[jg];W[da];B[mg];W[nf];B[lf]
+;W[ng];B[ij];W[fa];B[np];W[nn]
+;B[on];W[nm];B[oo];W[nl];B[rp]
+;W[rq];B[nr];W[pq];B[rn];W[rm]
+;B[ml];W[nj];B[km];W[nq];B[oq]
+;W[op];B[pm];W[qn];B[oq];W[mq]
+;B[bg];W[os];B[cr];W[mk];B[gb]
+;W[kk];B[jj];W[jk];B[ko];W[ln]
+;B[jn];W[lm];B[rf];W[ql];B[rh]
+;W[qh];B[ri];W[bf];B[cg];W[fq]
+;B[fr];W[gp];B[hq];W[kb];B[jb]
+;W[rg];B[sg];W[kd];B[jd];W[kc]
+;B[af];W[ke];B[ad];W[bb];B[im]
+;W[df];B[cn];W[do];B[ka];W[la]
+;B[ja];W[lb];B[ga];W[ip];B[hp]
+;W[io];B[ho];W[go];B[rj];W[in]
+;B[hn];W[fm];B[rk];W[sl];B[qi]
+;W[pi];B[qk];W[pl];B[pj];W[oi]
+;B[mh];W[je];B[ie];W[ef];B[ff]
+;W[qc];B[rd];W[qa];B[se];W[rb]
+;B[pb];W[if];B[jf];W[he];B[id]
+;W[dn];B[nb];W[co];B[bn];W[pf]
+;B[kp];W[bq];B[bo];W[br];B[cq]
+;W[bp];B[bs];W[pe];B[eq];W[qd]
+;B[rc];W[qb];B[qf];W[nc];B[nd]
+;W[md];B[od];W[sb];B[oa];W[sc]
+;B[sd];W[mb];B[op];W[oe];B[sa]
+;W[fp];B[na];W[li];B[ea];W[ab]
+;B[il];W[hl];B[ir];W[kh];B[jh]
+;W[bd];B[db];W[ba];B[hf];W[kj]
+;B[ge];W[kg];B[kf];W[dg];B[hd]
+;W[dh];B[di];W[eh];B[ae];W[fg]
+;B[hg];W[ch];B[bh];W[ei];B[cj]
+;W[bi];B[bj];W[ej];B[dk];W[gh]
+;B[hh];W[dm];B[iq];W[kl];B[jm]
+;W[cm];B[bm];W[nh];B[jo];W[mi]
+;B[ig];W[lp];B[pa];W[oj];B[pg]
+;W[ph];B[ne];W[mf];B[of];W[lg]
+;B[og];W[ji];B[ii];W[ki];B[dd]
+;W[da];B[gg];W[fh];B[hi];W[le]
+;B[be];W[ce];B[ag];W[sk];B[ac]
+;W[ao];B[an];W[ap];B[bc];W[el]
+;B[ls];W[ms];B[ks];W[dq];B[dr]
+;W[ee];B[fe];W[sj];B[rl];W[sn]
+;B[fa];W[si];B[sh];W[sm];B[dp]
+;W[kq];B[dq];W[oh];B[ar];W[aq]
+;B[de];W[kn];B[ma];W[jl];B[jp]
+;W[cc];B[ai];W[tt];B[sf];W[qj]
+;B[cs];W[pj];B[as];W[tt];B[tt]
+;
+TW[aa][ca][db][lc][ld][eg][mg][lh][mh][ni][lj][mj][lk][nk][ok][ll][ml][ol][em][gm][mm][om][pm][en][fn][mn][on][rn][eo][fo][mo][no][oo][po][qo][ro][so][mp][np][op][pp][qp][rp][sp][oq][sq][mr][nr][pr][qr][rr][sr][ns][ps][qs][rs][ss]
+TB[ha][ia][qa][ra][hb][ib][ob][qb][rb][sb][gc][hc][ic][pc][qc][sc][gd][qd][he][oe][pe][re][gf][if][pf][ah][ih][bi][aj][ak][ck][al][bl][am][in][io][ip][gr][hr][jr][ds][es][fs][gs][hs][is][js]
+C[The game is over.  Final score:
+   White = 57 territory + 23 captures + 5.5 komi = 85.5
+   Black = 47 territory + 22 captures = 69
+White wins by 16.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk13.sgf b/regression/games/handtalk/handtalk13.sgf
new file mode 100644 (file)
index 0000000..fa9c617
--- /dev/null
@@ -0,0 +1,64 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 3.1.31]
+PB[GNU Go 3.1.31]
+DT[2002-04-07]
+GN[Game supplied by Jessie Annala]
+RE[B+5.5]
+;B[pd];W[ep];B[dd];W[cp];B[op]
+;W[qp];B[qq];W[rq];B[pq];W[ro]
+;B[kq];W[pn];B[cj];W[jc];B[gq]
+;W[qj];B[mc];W[gc];B[ec];W[cl]
+;B[cg];W[qg];B[nn];W[fr];B[qe]
+;W[gr];B[go];W[hq];B[ol];W[gp]
+;B[ip];W[ql];B[gm];W[el];B[dn]
+;W[fn];B[fk];W[fo];B[gn];W[ek]
+;B[nj];W[fj];B[gk];W[dj];B[di]
+;W[ei];B[dh];W[fg];B[ij];W[jh]
+;B[kj];W[hi];B[kb];W[jb];B[ja]
+;W[ia];B[ka];W[hb];B[bk];W[bl]
+;B[rr];W[lh];B[sq];W[me];B[rp]
+;W[qo];B[ld];W[ke];B[fe];W[le]
+;B[he];W[nd];B[nc];W[oc];B[od]
+;W[pc];B[qc];W[jm];B[oe];W[ko]
+;B[jn];W[kn];B[mp];W[kl];B[lm]
+;W[lk];B[jo];W[km];B[lj];W[ml]
+;B[im];W[om];B[nm];W[nl];B[ok]
+;W[qb];B[rb];W[rc];B[qd];W[ra]
+;B[pb];W[sb];B[pa];W[mm];B[kp]
+;W[no];B[mn];W[mo];B[ln];W[lo]
+;B[on];W[oo];B[pm];W[qm];B[mk]
+;W[jk];B[pg];W[nh];B[qh];W[jj]
+;B[pi];W[pj];B[rg];W[oi];B[ii]
+;W[ih];B[ji];W[hj];B[ik];W[ki]
+;B[oj];W[np];B[kk];W[ll];B[jl]
+;W[nq];B[om];W[lp];B[fb];W[rd]
+;B[ri];W[ef];B[df];W[ee];B[fd]
+;W[de];B[ce];W[jr];B[rk];W[rl]
+;B[kr];W[jq];B[iq];W[ir];B[jp]
+;W[rj];B[sj];W[hf];B[gf];W[if]
+;B[ed];W[gg];B[al];W[am];B[ak]
+;W[bn];B[mq];W[lq];B[mr];W[rn]
+;B[nr];W[sm];B[sk];W[pl];B[pp]
+;W[po];B[ff];W[eg];B[oh];W[ni]
+;B[ng];W[mg];B[nf];W[ie];B[hd]
+;W[oq];B[or];W[qa];B[ob];W[cc]
+;B[cd];W[re];B[fc];W[mi];B[mj]
+;W[li];B[hp];W[fq];B[bc];W[rf]
+;B[qf];W[lr];B[kc];W[jd];B[hc]
+;W[gb];B[ls];W[mf];B[ck];W[eh]
+;B[dg];W[gj];B[qi];W[fa];B[ea]
+;W[ga];B[dk];W[dl];B[hk];W[sf]
+;B[gd];W[fl];B[gl];W[fm];B[sg]
+;W[so];B[sp];W[ic];B[js];W[is]
+;B[ks];W[qk];B[ej];W[ne];B[dj]
+;W[kd];B[md];W[sl];B[si];W[id]
+;B[pk];W[nk];B[tt];W[tt];
+TW[ha][sa][ib][rb][sc][sd][je][se][jf][kf][lf][hg][ig][jg][kg][lg][fh][gh][hh][kh][mh][fi][gi][bm][cm][dm][em][rm][an][cn][dn][en][qn][sn][ao][bo][co][do][eo][ap][bp][dp][fp][aq][bq][cq][dq][eq][gq][ar][br][cr][dr][er][hr][as][bs][cs][ds][es][fs][gs][hs]
+TB[aa][ba][ca][da][la][ma][na][oa][ab][bb][cb][db][eb][lb][mb][nb][ac][cc][dc][lc][oc][pc][ad][bd][ae][be][ge][pe][af][bf][cf][of][pf][ag][bg][og][qg][ah][bh][ch][ph][rh][sh][ai][bi][ci][aj][bj][jj][jk][hl][il][hm][hn][in][ho][io][rq][pr][qr][sr][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 63 territory + 3 captures + 5.5 komi = 71.5
+   Black = 68 territory + 9 captures = 77
+Black wins by 5.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk14.sgf b/regression/games/handtalk/handtalk14.sgf
new file mode 100644 (file)
index 0000000..f18ab76
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+RU[Japanese]
+RE[B+Resign]
+SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.31]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-09]
+;B[qd];W[qp];B[dp];W[dc];B[de];
+W[od];B[oc];W[nc];B[pc];W[nd];B[qf];W[jc];B[cc];W[cb];B[cd];W[eb];
+B[ci];W[op];B[pj];W[fd];B[mq];W[iq];B[or];W[fq];B[cn];W[ql];B[mo];
+W[lr];B[qr];W[lq];B[er];W[fr];B[ff];W[nq];B[rp];W[ro];B[en];W[rq];
+B[pq];W[mp];B[ps];W[eq];B[mm];W[dq];B[ei];W[cp];B[fl];W[lo];B[he];
+W[hc];B[rk];W[rl];B[qk];W[mn];B[nr];W[lm];B[hl];W[mr];B[je];W[qh];
+B[pg];W[ld];B[pl];W[do];B[dn];W[pm];B[ol];W[kk];B[oh];W[ki];B[nm];
+W[no];B[ii];W[ns];B[rr];W[nj];B[oj];W[ni];B[og];W[ep];B[sl];W[sm];
+B[sk];W[rm];B[jh];W[kh];B[go];W[sr];B[rs];W[ob];B[pb];W[nb];B[bb];
+W[in];B[ca];W[db];B[bo];W[bp];B[nk];W[mk];B[ap];W[aq];B[ao];W[bq];
+B[jl];W[hp];B[im];W[hn];B[ll];W[kl];B[km];W[ln];B[lk];W[lj];B[ml];
+W[mg];B[jn];W[mj];B[jo];W[gn];B[ho];W[io];B[jp];W[fo];B[kg];W[lg];
+B[kf];W[nf];B[on];W[qq];B[oq];W[ms];B[pp];W[po];B[oo];W[os];B[np];
+W[pn];B[op];W[jq];B[oa];W[jk];B[na];W[hk];B[mb];W[gk];B[gl];W[le];
+B[fk];W[of];B[ik];W[pe];B[qe];W[ij];B[il];W[hi];B[jj];W[kj];B[hj];
+W[dg];B[fe];W[dd];B[bd];W[ch];B[bi];W[eh];B[fh];W[oi];B[pi];W[dj];
+B[di];W[dl];B[kb];W[cm];B[ek];W[dk];B[bn];W[em];B[fm];W[fn];B[dm];
+W[el];B[bm];W[cl];B[ej];W[bl];B[bk];W[al];B[ak];W[ce];B[cf];W[be];
+B[df];W[ba];B[aa];W[da];B[bf];W[jb];B[ja];W[ia];B[ka];W[ib];B[gd];
+W[gc];B[ed];W[fc];B[kp];W[mq];B[nn]
+)
diff --git a/regression/games/handtalk/handtalk15.sgf b/regression/games/handtalk/handtalk15.sgf
new file mode 100644 (file)
index 0000000..d6c2354
--- /dev/null
@@ -0,0 +1,62 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.31]
+DT[2002-04-10]
+RE[W+33.5]
+GN[Game supplied by Jessie Annala]
+;B[pd];W[cd];B[pp];W[dp];B[ed]
+;W[ec];B[fc];W[dc];B[fd];W[cf]
+;B[jc];W[qj];B[fq];W[eq];B[fp]
+;W[kq];B[do];W[co];B[eo];W[nq]
+;B[pn];W[qg];B[qe];W[cq];B[pl]
+;W[dj];B[dm];W[hq];B[ql];W[oj]
+;B[cn];W[bo];B[or];W[nr];B[oq]
+;W[mc];B[fr];W[dr];B[eg];W[me]
+;B[oc];W[fj];B[fb];W[ho];B[gn]
+;W[hn];B[mo];W[gm];B[go];W[fm]
+;B[ck];W[cj];B[gg];W[bk];B[cl]
+;W[el];B[bn];W[fn];B[hj];W[np]
+;B[ke];W[no];B[nn];W[mg];B[mm]
+;W[jj];B[ca];W[jh];B[hh];W[em]
+;B[ig];W[eb];B[ea];W[dh];B[nk]
+;W[nj];B[hp];W[ip];B[bm];W[mk]
+;B[gp];W[hr];B[an];W[al];B[bc]
+;W[nl];B[bd];W[cb];B[ce];W[de]
+;B[be];W[df];B[dd];W[ok];B[bf]
+;W[bi];B[jn];W[im];B[rk];W[jm]
+;B[ll];W[km];B[ri];W[rj];B[rg]
+;W[rf];B[qf];W[rh];B[pg];W[sg]
+;B[si];W[ph];B[qi];W[qh];B[pi]
+;W[oh];B[pj];W[re];B[rd];W[pf]
+;B[ko];W[ln];B[lm];W[kn];B[mn]
+;W[lo];B[pe];W[of];B[dg];W[cg]
+;B[lb];W[mb];B[ma];W[oo];B[on]
+;W[po];B[qo];W[mp];B[lc];W[nb]
+;B[ob];W[jg];B[na];W[md];B[jf]
+;W[gi];B[hi];W[kk];B[kg];W[kh]
+;B[lg];W[lh];B[lf];W[mf];B[bg]
+;W[os];B[ps];W[ns];B[qr];W[fg]
+;B[ff];W[fh];B[ef];W[ch];B[gk]
+;W[sd];B[sc];W[se];B[rc];W[ld]
+;B[kd];W[fk];B[ik];W[jk];B[eh]
+;W[ei];B[bh];W[ai];B[lk];W[lj]
+;B[gh];W[fi];B[pk];W[ah];B[le]
+;W[ag];B[ee];W[af];B[oi];W[ni]
+;B[oe];W[ae];B[da];W[ad];B[bb]
+;W[ac];B[nf];W[og];B[ne];W[ab]
+;B[cc];W[ng];B[nd];W[ii];B[il]
+;W[gl];B[hl];W[om];B[gj];W[pm]
+;B[qm];W[op];B[pq];W[ij];B[ol]
+;W[nm];B[ml];W[nk];B[sh];W[hm]
+;B[ba];W[ih];B[hk];W[kl];B[qn]
+;W[nc];B[aa];W[jl];B[hf];W[tt]
+;B[tt];
+TW[sf][pg][rg][mh][nh][ci][di][ji][ki][li][mi][aj][bj][ej][kj][mj][ak][ck][dk][ek][bl][cl][dl][fl][am][bm][cm][dm][an][bn][cn][dn][en][gn][in][jn][ao][do][eo][fo][go][io][jo][ko][ap][bp][cp][ep][fp][gp][hp][jp][kp][lp][aq][bq][dq][fq][gq][iq][jq][lq][mq][ar][br][cr][er][fr][gr][ir][jr][kr][lr][mr][as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls][ms]
+TB[fa][ga][ha][ia][ja][ka][la][oa][pa][qa][ra][sa][cb][db][eb][gb][hb][ib][jb][kb][pb][qb][rb][sb][dc][ec][gc][hc][ic][kc][pc][qc][cd][gd][hd][id][jd][od][qd][fe][ge][he][ie][je][gf][if][kf][hg][qj][rj][sj][qk][sk][rl][sl][rm][sm][rn][sn][ro][so][qp][rp][sp][qq][rq][sq][pr][rr][sr][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 87 territory + 21 captures + 5.5 komi = 113.5
+   Black = 73 territory + 7 captures = 80
+White wins by 33.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk17.sgf b/regression/games/handtalk/handtalk17.sgf
new file mode 100644 (file)
index 0000000..eb86f59
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.31]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-17]
+RE[B+Resign]
+;B[pd];W[cp];B[pp]
+;W[cd];B[eq];W[do];B[gp];W[ec]
+;B[dj];W[qj];B[cm];W[dr];B[dh]
+;W[kq];B[jc];W[nq];B[pn];W[qg]
+;B[qe];W[er];B[pl];W[hc];B[mc]
+;W[iq];B[ql];W[dm];B[dl];W[em]
+;B[or];W[nr];B[oq];W[cn];B[bm]
+;W[oj];B[fr];W[hp];B[eo];W[ho]
+;B[fn];W[hm];B[dq];W[cq];B[mo]
+;W[np];B[fm];W[el];B[ck];W[no]
+;B[nn];W[mn];B[cf];W[lo];B[mm]
+;W[mp];B[nk];W[lm];B[ml];W[ek]
+;B[gl];W[fj];B[gj];W[gi];B[hk]
+;W[hi];B[ap];W[ji];B[fi];W[bo]
+;B[fh];W[bp];B[of];W[oh];B[hr]
+;W[gq];B[fq];W[hq];B[gr];W[go]
+;B[en];W[dn];B[jk];W[jm];B[jl]
+;W[li];B[ll];W[km];B[be];W[bd]
+;B[ib];W[hb];B[rf];W[rg];B[lf]
+;W[fp];B[ep];W[he];B[ns];W[ms]
+;B[os];W[lr];B[ee];W[mj];B[lk]
+;W[ke];B[kf];W[jf];B[le];W[kd]
+;B[jg];W[kc];B[kb];W[jd];B[ha]
+;W[hg];B[fa];W[fd];B[kh];W[ki]
+;B[db];W[dc];B[sg];W[cb];B[sh]
+;W[mg];B[ad];W[ih];B[ab];W[if]
+;B[oo];W[eb];B[ic];W[id];B[lc]
+;W[ea];B[es];W[cr];B[pg];W[ph]
+;B[qf];W[qh];B[il];W[lg];B[kg]
+;W[fe];B[ff];W[qc];B[pc];W[pb]
+;B[ob];W[rd];B[qb];W[rb];B[pa]
+;W[ra];B[ir];W[sb];B[qd];W[rc]
+;B[sd];W[se];B[re];W[jr];B[ga]
+;W[rk];B[rl];W[gf];B[fg];W[mf]
+;B[me];W[im];B[ej];W[fk];B[gk]
+;W[sl];B[sm];W[sk];B[rn];W[de]
+;B[ef];W[ci];B[ch];W[dk];B[cl]
+;W[bi];B[cj];W[nf];B[ne];W[ok]
+;B[ol];W[ri];B[og];W[ng];B[bb]
+;W[js];B[ca];W[da];B[ba];W[fb]
+;B[ia]
+)
diff --git a/regression/games/handtalk/handtalk18.sgf b/regression/games/handtalk/handtalk18.sgf
new file mode 100644 (file)
index 0000000..b905b83
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.31]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-17]
+RE[B+Resign]
+;B[pd];W[cp];B[pp]
+;W[dc];B[ep];W[de];B[cq];W[bq]
+;B[dq];W[bo];B[iq];W[dn];B[cg]
+;W[qj];B[be];W[jc];B[cj];W[cl]
+;B[qm];W[qg];B[qe];W[mc];B[eg]
+;W[gd];B[lq];W[pb];B[lo];W[qc]
+;B[rg];W[rf];B[qf];W[sf];B[of]
+;W[rh];B[pg];W[qh];B[oi];W[pl]
+;B[fn];W[pm];B[pn];W[qq];B[pq]
+;W[pr];B[or];W[qr];B[rn];W[rs]
+;B[rp];W[rq];B[sr];W[sq];B[ps]
+;W[ml];B[bc];W[kl];B[gg];W[il]
+;B[ig];W[kg];B[ie];W[ke];B[ic]
+;W[ib];B[hb];W[hc];B[br];W[id]
+;B[aq];W[bp];B[nn];W[nh];B[ji]
+;W[ni];B[oh];W[ng];B[in];W[ne]
+;B[cb];W[nf];B[eb];W[db];B[da]
+;W[ec];B[fb];W[hi];B[ii];W[hj]
+;B[bk];W[hh];B[hg];W[bl];B[jg]
+;W[kh];B[rk];W[rj];B[qk];W[pk]
+;B[pj];W[ok];B[sj];W[si];B[gb]
+;W[je];B[he];W[fj];B[sk];W[em]
+;B[hm];W[hl];B[ek];W[fk];B[fm]
+;W[fg];B[ff];W[fh];B[ee];W[fc]
+;B[dd];W[el];B[cc];W[dk];B[gc]
+;W[hd];B[fd];W[ge];B[gf];W[gp]
+;B[fp];W[ho];B[gq];W[di];B[jf]
+;W[ch];B[bh];W[nm];B[ci];W[dh]
+;B[dg];W[ki];B[gl];W[ln];B[kn]
+;W[lm];B[mn];W[gk];B[ij];W[jk]
+;B[ar];W[kf];B[jm];W[qp];B[qo]
+;W[ql];B[rl];W[ia];B[fe];W[eh]
+;B[do];W[cn];B[dj];W[ej];B[al]
+;W[am];B[ak];W[gh];B[fl];W[en]
+;B[eo];W[ha];B[jj];W[kj];B[om]
+;W[oj];B[ol];W[ga];B[nl];W[nk]
+;B[mm];W[pi];B[km];W[ll];B[ap]
+;W[ao];B[jl];W[ik];B[ck]
+)
diff --git a/regression/games/handtalk/handtalk19.sgf b/regression/games/handtalk/handtalk19.sgf
new file mode 100644 (file)
index 0000000..9811957
--- /dev/null
@@ -0,0 +1,51 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.31]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-17]
+RE[B+Resign]
+;B[pd];W[pp];B[dd]
+;W[dp];B[qn];W[qo];B[pn];W[jc]
+;B[op];W[oq];B[fq];W[oo];B[np]
+;W[po];B[qj];W[jq];B[cn];W[eo]
+;B[cq];W[dq];B[cp];W[gp];B[gq]
+;W[hp];B[er];W[dr];B[ck];W[mc]
+;B[oc];W[gc];B[ec];W[ch];B[me]
+;W[pq];B[nm];W[no];B[lm];W[mp]
+;B[qg];W[cf];B[be];W[bf];B[cd]
+;W[nd];B[ne];W[nh];B[mg];W[mh]
+;B[lh];W[li];B[kh];W[mj];B[jj]
+;W[ek];B[ih];W[dj];B[jm];W[ge]
+;B[od];W[kd];B[rn];W[gh];B[cr]
+;W[ds];B[kp];W[kq];B[bi];W[bh]
+;B[ci];W[di];B[je];W[ke];B[ie]
+;W[oj];B[nb];W[mb];B[do];W[en]
+;B[ep];W[hk];B[ir];W[jr];B[fp]
+;W[fo];B[ik];W[hj];B[hq];W[in]
+;B[jp];W[iq];B[hs];W[im];B[il]
+;W[hl];B[gb];W[hb];B[fb];W[pk]
+;B[hc];W[ib];B[gd];W[ja];B[fe]
+;W[qk];B[kk];W[rj];B[ro];W[qi]
+;B[rp];W[ha];B[qr];W[pr];B[gf]
+;W[pg];B[pf];W[ph];B[ip];W[jn]
+;B[lp];W[lq];B[kn];W[qs];B[ma]
+;W[la];B[na];W[kb];B[gg];W[eg]
+;B[hn];W[hm];B[go];W[qq];B[rr]
+;W[rq];B[sq];W[ol];B[om];W[mm]
+;B[ml];W[mn];B[nl];W[rs];B[sr]
+;W[gn];B[ho];W[rh];B[rg];W[kf]
+;B[lf];W[sg];B[sf];W[qe];B[pe]
+;W[qd];B[se];W[qf];B[sh];W[qb]
+;B[dn];W[gm];B[em];W[rb];B[fn]
+;W[fh];B[fl];W[dl];B[cl];W[fk]
+;B[rl];W[rd];B[rk];W[sj];B[cj]
+;W[pb];B[jf];W[kg];B[lg];W[jg]
+;B[jh];W[ig];B[ng];W[dm];B[ah]
+;W[cm];B[bm];W[hf];B[hg];W[if]
+;B[he];W[ag];B[ae];W[ai];B[nk]
+;W[ak];B[al];W[hh];B[nj];W[ni]
+;B[ok];W[pl];B[oi];W[pj];B[oh]
+;W[si];B[og];W[pi];B[ii];W[rf]
+;B[aj];W[bj];B[bk]
+)
diff --git a/regression/games/handtalk/handtalk2.sgf b/regression/games/handtalk/handtalk2.sgf
new file mode 100644 (file)
index 0000000..a7da60c
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+DT[2002-03-28]
+GN[Game supplied by Jessie Annala]
+RE[W+67.5]
+;B[pd];W[pp];B[dc];W[cq];B[ce];
+W[jc];B[nq];W[oq];B[np];W[kq];B[dp];W[dq];B[ep];W[hq];B[bo];W[bp];
+B[co];W[eq];B[nn];W[pn];B[ql];W[pl];B[pk];W[ol];B[qm];W[ro];B[di];
+W[on];B[mc];W[nm];B[fl];W[qh];B[mn];W[pi];B[oj];W[oi];B[ri];W[rh];
+B[rk];W[qj];B[kn];W[li];B[gc];W[je];B[gg];W[nj];B[fp];W[kl];B[in];
+W[fq];B[ij];W[il];B[im];W[hk];B[ih];W[rj];B[fj];W[me];B[od];W[qc];
+B[pg];W[ob];B[md];W[ne];B[qe];W[ng];B[pc];W[pb];B[rc];W[rb];B[qd];
+W[qb];B[sd];W[rf];B[na];W[oa];B[sb];W[nb];B[nc];W[mb];B[nr];W[lb];
+B[or];W[qf];B[qr];W[hb];B[gb];W[ik];B[id];W[jd];B[hc];W[ib];B[jj];
+W[lk];B[lg];W[le];B[og];W[qq];B[rr];W[ki];B[kh];W[ji];B[ig];W[ii];
+B[jk];W[jl];B[hj];W[hi];B[gi];W[gk];B[gj];W[ip];B[gn];W[fk];B[ek];
+W[mh];B[lr];W[kr];B[ks];W[js];B[ls];W[ir];B[rq];W[gh];B[hh];W[gp];
+B[rp];W[qo];B[so];W[rn];B[oo];W[pq];B[rm];W[sn];B[po];W[qp];B[sp];
+W[qn];B[ha];W[pr];B[ps];W[ie];B[fh];W[ge];B[he];W[hf];B[hd];W[gf];
+B[if];W[df];B[mm];W[de];B[cd];W[cf];B[qk];W[ml];B[lm];W[bh];B[bj];
+W[eg];B[ap];W[fd];B[ar];W[dh];B[be];W[bf];B[fc];W[br];B[aq];W[bq];
+B[ed];W[ee];B[ci];W[ch];B[gl];W[lp];B[bi];W[ia];B[ga];W[ae];B[ad];
+W[af];B[dd];W[go];B[fo];W[jo];B[km];W[ko];B[ic];W[jb];B[ho];W[kf];
+B[kg];W[fg];B[eh];W[ah];B[hp];W[gq];B[io];W[mf];B[ll];W[kk];B[hl];
+W[ai];B[gd];W[aj];B[fe];W[ff];B[ak];W[bk];B[al];W[bl];B[am];W[bm];
+B[an];W[el];B[ck];W[kj];B[dl];W[lo];B[jh];W[jf];B[mo];W[mq];B[mr];
+W[fd];B[pm];W[om];B[fe];W[lq];B[fd];W[mg];B[bs];W[cs];B[op];W[mk];
+B[mp];W[cp];B[hg];W[jn];B[jm];W[lh];B[ln];W[jg];B[ej];W[lf];B[gh];
+W[tt];B[ao];W[as];B[sh];W[bs];B[tt];W[tt]C[W + 67.5
+]
+)
diff --git a/regression/games/handtalk/handtalk20.sgf b/regression/games/handtalk/handtalk20.sgf
new file mode 100644 (file)
index 0000000..3c1e018
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.1.32]
+PB[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-18]
+SY[Cgoban 1.9.12]
+RE[B+54.5]
+;B[pd];W[dd];B[qp];W[dp];B[oq];W[nc];B[oc];W[nd];B[jc];W[pe];B[qe];
+W[pj];B[oe];W[pf];B[od];W[qf];B[rf];W[re];B[qd];W[rg];B[rd];W[dj];
+B[gc];W[ec];B[qm];W[cf];B[jq];W[cm];B[gq];W[dq];B[lc];W[ne];B[of];
+W[le];B[pg];W[sf];B[qg];W[qi];B[mg];W[je];B[ge];W[lg];B[mf];W[ld];
+B[lh];W[go];B[lf];W[jg];B[kf];W[jd];B[jf];W[ic];B[kb];W[if];B[ib];
+W[hf];B[id];W[hd];B[hc];W[ie];B[kg];W[hh];B[jh];W[io];B[kp];W[jm];
+B[rj];W[ri];B[pl];W[gd];B[qk];W[oh];B[og];W[fd];B[nh];W[lm];B[oi];
+W[ij];B[oj];W[mp];B[mq];W[nb];B[np];W[fq];B[gr];W[fr];B[mo];W[lj];
+B[fb];W[eb];B[gk];W[gp];B[ig];W[gs];B[hg];W[gg];B[ir];W[ob];B[pb];
+W[nm];B[ok];W[pn];B[gm];W[ih];B[el];W[fj];B[cl];W[bl];B[dm];W[bk];
+B[cn];W[bm];B[do];W[en];B[dn];W[mn];B[eo];W[fn];B[bp];W[dk];B[fp];
+W[bq];B[jo];W[in];B[aq];W[br];B[ar];W[bo];B[cp];W[cq];B[ap];W[dl];
+B[em];W[qn];B[bn];W[an];B[ds];W[hr];B[hq];W[ao];B[bs];W[eq];B[gj];
+W[ep];B[fo];W[fs];B[gi];W[gn];B[fi];W[fk];B[fl];W[hl];B[gl];W[eh];
+B[hm];W[hp];B[hs];W[il];B[oo];W[pm];B[rm];W[rn];B[am];W[al];B[sh];
+W[lo];B[lp];W[ip];B[iq];W[sm];B[kn];W[km];B[ln];W[sl];B[sj];W[rk];
+B[qj];W[ql];B[ro];W[nn];B[ji];W[hj];B[ei];W[di];B[kj];W[kk];B[fh];
+W[fg];B[ea];W[da];B[dr];W[jj];B[ki];W[pa];B[qb];W[qa];B[ra];W[oa];
+B[rb];W[ol];B[pk];W[nk];B[fa];W[cb];B[so];W[mb];B[mi];W[lb];B[ka];
+W[no];B[ko];W[on];B[po];W[fc];B[gb];W[jg];B[ig];W[sk];B[mj];W[mk];
+B[dh];W[eg];B[ch];W[bh];B[bi];W[ej];B[bg];W[bf];B[ah];W[af];B[bj];
+W[ag];B[ci];W[ck];B[aj];W[cg];B[ek];W[dg];B[co];W[gf];B[la];W[cj];
+B[hk];W[ak];B[ik];W[bh];B[jk];W[ai];B[am];W[jl];B[an];W[mc];B[kc];
+W[me];B[ma];W[hn];B[nf];W[nj];B[ic];W[rl];B[jg];W[ii];B[qo];W[ni];
+B[jp];W[im];B[sn];W[hg];B[ke];W[kd];B[jn];W[fm];B[li];W[lk];B[hi];
+W[na];B[gh];W[tt];B[tt];
+TW[aa][ba][ca][ab][bb][db][ac][bc][cc][dc][ad][bd][cd][ed][md][ae][be][ce][de][ee][fe][ge][he][df][ef][ff][bg][ah][ch][dh][bi][ci][aj][bj][cl][kl][ll][ml][nl][mm][om][qm][rm][ho]
+TB[ga][ha][ia][ja][sa][hb][jb][sb][pc][qc][rc][sc][sd][pe][re][se][pf][qf][rf][sf][lg][ng][rg][sg][kh][mh][oh][ph][qh][rh][pi][qi][ri][si][pj][ao][bo][lo][dp][ep][mp][op][pp][rp][sp][bq][cq][dq][eq][fq][kq][lq][nq][pq][qq][rq][sq][br][cr][er][fr][hr][jr][kr][lr][mr][nr][or][pr][qr][rr][sr][as][cs][es][fs][gs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 44 territory + 16 captures + 5.5 komi = 65.5
+   Black = 88 territory + 32 captures = 120
+Black wins by 54.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk21.sgf b/regression/games/handtalk/handtalk21.sgf
new file mode 100644 (file)
index 0000000..03e4f1f
--- /dev/null
@@ -0,0 +1,57 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.1.32]
+PB[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-25]
+SY[Cgoban 1.9.12]
+RE[W+6.5]
+;B[pp];W[dd];B[pe];W[cq];B[pc]
+;W[nq];B[oq];W[np];B[pj];W[po]
+;B[qo];W[pn];B[jc];W[op];B[or]
+;W[qp];B[pq];W[qn];B[mr];W[dj]
+;B[nr];W[cg];B[jq];W[gf];B[cn]
+;W[je];B[ld];W[lf];B[cl];W[bk]
+;B[gq];W[dc];B[eq];W[bo];B[dr]
+;W[cr];B[bn];W[co];B[do];W[ar]
+;B[pg];W[fk];B[en];W[hk];B[bl]
+;W[ck];B[gc];W[lh];B[lj];W[ki]
+;B[kj];W[qq];B[lm];W[ii];B[lp]
+;W[ne];B[nd];W[hm];B[ql];W[rm]
+;B[rl];W[fb];B[gb];W[fc];B[qr]
+;W[rr];B[rq];W[rp];B[me];W[ho]
+;B[mf];W[ga];B[ha];W[fa];B[ib]
+;W[sl];B[sk];W[sm];B[rj];W[mg]
+;B[nf];W[qs];B[jj];W[pr];B[ol]
+;W[gd];B[bs];W[cs];B[nn];W[on]
+;B[no];W[oo];B[jn];W[oh];B[ph]
+;W[ni];B[ip];W[nk];B[fm];W[io]
+;B[jo];W[dp];B[ep];W[dq];B[er]
+;W[nl];B[jl];W[dl];B[dm];W[el]
+;B[gl];W[hl];B[gk];W[gj];B[hj]
+;W[ij];B[ak];W[aj];B[al];W[bj]
+;B[hd];W[he];B[fd];W[ge];B[id]
+;W[an];B[ie];W[if];B[ke];W[kf]
+;B[nm];W[le];B[kd];W[lk];B[mj]
+;W[ok];B[om];W[ml];B[pi];W[oi]
+;B[pk];W[ng];B[gn];W[il];B[kl]
+;W[go];B[fo];W[gm];B[fl];W[fj]
+;B[ji];W[jh];B[mm];W[em];B[fn]
+;W[li];B[mi];W[kk];B[jk];W[am]
+;B[bm];W[ao];B[mp];W[mq];B[lq]
+;W[og];B[of];W[hp];B[hq];W[qm]
+;B[hn];W[in];B[ik];W[hi];B[gp]
+;W[im];B[mh];W[jm];B[km];W[hj]
+;B[ds];W[os];B[pm];W[ns];B[lr]
+;W[ms];B[ls];W[ps];B[ll];W[mk]
+;B[eh];W[oj];B[dg];W[cf];B[ef]
+;W[nh];B[nj];W[lg];B[sn];W[ro]
+;B[jd];W[jf];B[tt];W[tt];
+TW[aa][ba][ca][da][ea][ab][bb][cb][db][eb][ac][bc][cc][ec][ad][bd][cd][ed][fd][ae][be][ce][de][ee][fe][af][bf][df][ef][ff][hf][ag][bg][dg][eg][fg][gg][hg][ig][jg][kg][ah][bh][ch][dh][eh][fh][gh][hh][ih][kh][ai][bi][ci][di][ei][fi][gi][cj][ej][dk][ek][rn][sn][qo][so][ap][bp][cp][sp][aq][bq][rq][sq][br][qr][sr][as][bs][rs][ss]
+TB[ia][ja][ka][la][ma][na][oa][pa][qa][ra][sa][hb][jb][kb][lb][mb][nb][ob][pb][qb][rb][sb][hc][ic][kc][lc][mc][nc][oc][qc][rc][sc][md][od][pd][qd][rd][sd][ne][oe][qe][re][se][pf][qf][rf][sf][qg][rg][sg][qh][rh][sh][qi][ri][si][qj][sj][qk][rk][pl][cm][dn][kn][ln][mn][eo][ko][lo][mo][fp][jp][kp][fq][iq][kq][fr][gr][hr][ir][jr][kr][es][fs][gs][hs][is][js][ks]
+C[The game is over.  Final score:
+   White = 81 territory + 10 captures + 5.5 komi = 96.5
+   Black = 89 territory + 1 captures = 90
+White wins by 6.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk22.sgf b/regression/games/handtalk/handtalk22.sgf
new file mode 100644 (file)
index 0000000..31e531c
--- /dev/null
@@ -0,0 +1,69 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.1.32]
+PB[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-26]
+SY[Cgoban 1.9.12]TM[1:00:00(5x1:00)]
+RE[B+2.5]
+;B[qc];W[dc];B[qp];W[dp];B[ce]
+;W[ci];B[bc];W[oq];B[pq];W[op]
+;B[qn];W[pd];B[qd];W[pe];B[kq]
+;W[gc];B[hq];W[ob];B[qe];W[og]
+;B[jc];W[ph];B[mc];W[nd];B[pb]
+;W[cl];B[qk];W[el];B[bh];W[fq]
+;B[ch];W[co];B[di];W[pc];B[qb]
+;W[mp];B[md];W[on];B[cj];W[ko]
+;B[ho];W[ib];B[jb];W[ic];B[jp]
+;W[ja];B[ne];W[jd];B[kd];W[je]
+;B[nc];W[mf];B[oc];W[nf];B[ed]
+;W[ec];B[fd];W[he];B[pf];W[ok]
+;B[fi];W[hh];B[fc];W[fb];B[gj]
+;W[jk];B[gl];W[jm];B[lj];W[kl]
+;B[mk];W[nl];B[lh];W[kg];B[ji]
+;W[ij];B[kh];W[pj];B[jg];W[gg]
+;B[kf];W[ke];B[lg];W[ih];B[le]
+;W[lf];B[kc];W[hi];B[ml];W[me]
+;B[od];W[la];B[mn];W[mm];B[ri]
+;W[lm];B[kk];W[rh];B[ni];W[mi]
+;B[nh];W[mg];B[mh];W[jj];B[kj]
+;W[ll];B[qi];W[ld];B[pi];W[lc]
+;B[qh];W[or];B[pr];W[lr];B[kr]
+;W[ks];B[js];W[ls];B[ir];W[ps]
+;B[qs];W[os];B[qr];W[cb];B[bb]
+;W[pg];B[oi];W[qg];B[rg];W[rf]
+;B[sh];W[qf];B[oe];W[re];B[ef]
+;W[lq];B[nb];W[mb];B[gr];W[fr]
+;B[jo];W[pm];B[qm];W[fn];B[kn]
+;W[lo];B[jn];W[ln];B[gn];W[rd]
+;B[fo];W[fm];B[eo];W[rc];B[dn]
+;W[cn];B[dm];W[dl];B[cm];W[bm]
+;B[rb];W[ak];B[bj];W[gm];B[hm]
+;W[hl];B[fk];W[im];B[hn];W[hk]
+;B[fs];W[es];B[gs];W[dr];B[gp]
+;W[pl];B[ql];W[ig];B[nj];W[jf]
+;B[fg];W[gd];B[gf];W[hf];B[ge]
+;W[fh];B[eh];W[gh];B[ek];W[ba]
+;B[dd];W[cc];B[cd];W[sb];B[bk]
+;W[bl];B[po];W[jh];B[kg];W[of]
+;B[oo];W[no];B[pe];W[qj];B[rj]
+;W[aj];B[ai];W[al];B[ep];W[eq]
+;B[dk];W[na];B[oa];W[ma];B[da]
+;W[ca];B[eb];W[fa];B[sf];W[ea]
+;B[in];W[se];B[sg];W[ab];B[bd]
+;W[aa];B[ac];W[db];B[km];W[fp]
+;B[en];W[fl];B[gk];W[kp];B[pn]
+;W[pk];B[nk];W[nm];B[ki];W[ra]
+;B[qa];W[do];B[go];W[hj];B[gq]
+;W[pp];B[ck];W[gi];B[em];W[an]
+;B[lk];W[ng];B[oj];W[ii];B[oh]
+;W[sc];B[sa];W[qq];B[rq];W[ra]
+;B[tt];W[sa];B[tt];W[tt];
+TW[da][ga][ha][ia][ka][eb][gb][hb][jb][kb][lb][hc][jc][kc][hd][id][kd][sd][ie][le][if][hg][ik][il][jl][ol][am][om][bn][mn][nn][ao][bo][mo][ap][bp][cp][lp][np][aq][bq][cq][dq][mq][nq][ar][br][cr][er][mr][nr][as][bs][cs][ds][ms][ns]
+TB[pa][ob][pc][ad][nd][pd][ae][be][de][ee][fe][af][bf][cf][df][ff][ag][bg][cg][dg][eg][ah][dh][rh][bi][ci][ei][li][mi][si][dj][ej][fj][mj][sj][rk][sk][rl][sl][rm][sm][rn][sn][io][qo][ro][so][hp][ip][rp][sp][iq][jq][qq][sq][hr][jr][rr][sr][hs][is][rs][ss]
+C[The game is over.  Final score:
+   White = 57 territory + 9 captures + 5.5 komi = 71.5
+   Black = 63 territory + 11 captures = 74
+Black wins by 2.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk23.sgf b/regression/games/handtalk/handtalk23.sgf
new file mode 100644 (file)
index 0000000..1090b95
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.1.32]
+PB[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-26]
+SY[Cgoban 1.9.12]TM[1:00:00(5x1:00)]
+RE[B+113.5]
+;B[cd];W[pd];B[qo];W[dq];B[ed];W[co];B[pq];W[jq];B[kc];W[cj];B[ch];
+W[ei];B[nc];W[qf];B[hd];W[qj];B[mq];W[gq];B[ql];W[oc];B[nb];W[eo];
+B[ff];W[gi];B[dl];W[ko];B[fl];W[ii];B[ck];W[bk];B[bl];W[ci];B[bh];
+W[aj];B[hl];W[cm];B[cl];W[ob];B[jl];W[ki];B[ll];W[lq];B[mr];W[lr];
+B[kg];W[ih];B[pg];W[of];B[pf];W[qe];B[oe];W[pe];B[ne];W[ng];B[oh];
+W[mh];B[qg];W[mj];B[oj];W[bi];B[ol];W[dh];B[mf];W[dg];B[bf];W[rf];
+B[rg];W[if];B[je];W[mp];B[np];W[ms];B[nq];W[os];B[mo];W[qr];B[lp];
+W[hn];B[kp];W[na];B[jp];W[la];B[iq];W[ho];B[qq];W[rq];B[rp];W[sr];
+B[ns];W[rs];B[ls];W[jb];B[ie];W[gc];B[jc];W[eb];B[ib];W[cb];B[bc];
+W[ja];B[ia];W[dc];B[bb];W[da];B[fa];W[jo];B[fb];W[lb];B[hf];W[sg];
+B[sh];W[sf];B[ri];W[kb];B[hb];W[hg];B[ps];W[ln];B[nk];W[mm];B[mk];
+W[om];B[or];W[pr];B[gg];W[on];B[dd];W[gh];B[lc];W[nd];B[md];W[fg];
+B[gf];W[ef];B[nj];W[ni];B[oi];W[lj];B[nh];W[mg];B[mi];W[lh];B[lf];
+W[hr];B[ir];W[is];B[jr];W[ah];B[fp];W[bg];B[fq];W[fo];B[gp];W[go];
+B[gr];W[cf];B[ao];W[qm];B[rl];W[nl];B[pl];W[ip];B[am];W[qn];B[bp];
+W[be];B[cp];W[dp];B[hp];W[po];B[bn];W[cn];B[br];W[rn];B[gm];W[bd];
+B[ea];W[ac];B[no];W[cc];B[ba];W[ec];B[fc];W[ab];B[ep];W[od];B[sp];
+W[ro];B[qp];W[nn];B[sq];W[er];B[fj];W[fr];B[hq];W[io];B[cr];W[nf];
+B[im];W[me];B[le];W[ne];B[gj];W[ee];B[fd];W[fi];B[kk];W[hj];B[fe];
+W[jf];B[hk];W[ik];B[il];W[dj];B[ek];W[kf];B[lg];W[ke];B[kd];W[jg];
+B[jj];W[kh];B[ld];W[ij];B[mb];W[kj];B[jk];W[ak];B[lk];W[de];B[ji];
+W[jh];B[ni];W[dk];B[mc];W[ma];B[ej];W[ce];B[al];W[og];B[qi];W[li];
+B[tt];W[tt];
+TW[aa][ba][ca][ka][oa][pa][qa][ra][sa][bb][db][pb][qb][rb][sb][bc][pc][qc][rc][sc][ad][qd][rd][sd][ae][oe][re][se][af][bf][df][ag][cg][eg][ig][bh][ch][eh][fh][hh][ai][di][hi][bj]
+TB[ga][ha][gb][gc][hc][ic][gd][id][jd][ge][he][ph][qh][rh][pi][si][pj][qj][rj][sj][fk][gk][ok][pk][qk][rk][sk][el][gl][kl][ml][nl][sl][bm][cm][dm][em][fm][hm][jm][km][lm][mm][nm][om][pm][qm][rm][sm][an][cn][dn][en][fn][gn][hn][in][jn][kn][ln][mn][nn][on][pn][qn][rn][sn][bo][co][do][eo][fo][go][ho][io][jo][ko][lo][oo][po][ro][so][ap][dp][ip][mp][op][pp][aq][bq][cq][dq][eq][gq][jq][kq][lq][oq][rq][ar][dr][er][fr][hr][kr][lr][nr][pr][qr][rr][sr][as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ms][os][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 44 territory + 8 captures + 5.5 komi = 57.5
+   Black = 127 territory + 44 captures = 171
+Black wins by 113.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk24.sgf b/regression/games/handtalk/handtalk24.sgf
new file mode 100644 (file)
index 0000000..6116fe6
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[GNU Go 3.1.32]
+PB[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-27]
+SY[Cgoban 1.9.12]TM[1:00:00(5x1:00)]
+RE[B+26.5]
+;B[cp];W[dd];B[qp];W[qd];B[ip]
+;W[kq];B[jq];W[kp];B[cj];W[kn]
+;B[nc];W[oq];B[kc];W[po];B[pp]
+;W[op];B[rn];W[in];B[gp];W[gn]
+;B[hc];W[eo];B[eq];W[em];B[cg]
+;W[ce];B[qi];W[ej];B[qf];W[qb]
+;B[qk];W[nl];B[eg];W[fj];B[eb]
+;W[db];B[ec];W[nj];B[dc];W[cc]
+;B[cb];W[bb];B[pb];W[re];B[pc]
+;W[qc];B[rf];W[sb];B[gg];W[ii]
+;B[ig];W[kh];B[da];W[ba];B[bc]
+;W[cd];B[pr];W[nh];B[di];W[or]
+;B[pq];W[ke];B[mf];W[pm];B[lg]
+;W[ld];B[kg];W[nd];B[lc];W[jr]
+;B[pd];W[nf];B[me];W[md];B[ne]
+;W[mc];B[ng];W[nb];B[ir];W[lb]
+;B[oc];W[pe];B[oe];W[jc];B[qe]
+;W[kr];B[rd];W[rc];B[se];W[ra]
+;B[lh];W[ki];B[oh];W[li];B[ni]
+;W[ib];B[oj];W[mj];B[hb];W[ie]
+;B[mh];W[rm];B[qn];W[ql];B[rk]
+;W[pn];B[he];W[bf];B[cm];W[bh]
+;B[bg];W[ag];B[ok];W[sn];B[so]
+;W[sm];B[ro];W[ol];B[jo];W[jp]
+;B[io];W[is];B[hr];W[hs];B[jn]
+;W[im];B[jm];W[kk];B[ko];W[km]
+;B[jl];W[gi];B[lo];W[mq];B[gs]
+;W[js];B[gr];W[il];B[jk];W[ps]
+;B[qs];W[os];B[qr];W[dk];B[kl]
+;W[lk];B[ll];W[nk];B[ck];W[mm]
+;B[lm];W[mn];B[ln];W[fe];B[ik]
+;W[hk];B[rq];W[ho];B[iq];W[dl]
+;B[cl];W[hf];B[gd];W[gf];B[if]
+;W[hg];B[hh];W[gh];B[ih];W[fg]
+;B[ef];W[jf];B[jg];W[fd];B[fc]
+;W[id];B[fa];W[hd];B[hi];W[jj]
+;B[hj];W[gj];B[ij];W[ji];B[ca]
+;W[bd];B[no];W[mo];B[do];W[dn]
+;B[cn];W[eh];B[dh];W[ei];B[bi]
+;W[ch];B[cf];W[kf];B[ah];W[ai]
+;B[aj];W[ah];B[lp];W[ep];B[dq]
+;W[dp];B[co];W[dm];B[mp];W[np]
+;B[lq];W[lr];B[mr];W[ms];B[nq]
+;W[ls];B[go];W[fo];B[ha];W[hp]
+;B[hq];W[gl];B[hn];W[hm];B[ho]
+;W[ic];B[ia];W[ja];B[fp];W[fn]
+;B[oa];W[na];B[pk];W[rl];B[sk]
+;W[ml];B[nr];W[ns];B[mq];W[nn]
+;B[ci];W[af];B[od];W[ff];B[ee]
+;W[ed];B[df];W[ge];B[gc];W[ob]
+;B[pa];W[qa];B[dg];W[le];B[sd]
+;W[mi];B[pl];W[qm];B[qo];W[lf]
+;B[dj];W[sc];B[sl];W[jh];B[de]
+;W[tt];B[tt];
+TW[aa][ka][la][ma][sa][ab][jb][kb][mb][rb][ac][bc][kc][lc][ad][jd][kd][ae][be][he][je][gg][fh][fi][kj][lj][ek][fk][gk][mk][el][fl][hl][fm][gm][nm][om][en][on][no][oo][ks]
+TB[ea][ga][db][fb][gb][pe][re][nf][of][pf][sf][mg][og][pg][qg][rg][sg][nh][ph][qh][rh][sh][oi][pi][ri][si][bj][pj][qj][rj][sj][ak][bk][al][bl][am][bm][km][an][bn][kn][ao][bo][ap][bp][hp][rp][sp][aq][bq][cq][fq][gq][qq][sq][ar][br][cr][dr][er][fr][rr][sr][as][bs][cs][ds][es][fs][rs][ss]
+C[The game is over.  Final score:
+   White = 42 territory + 7 captures + 5.5 komi = 54.5
+   Black = 71 territory + 10 captures = 81
+Black wins by 26.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk25.sgf b/regression/games/handtalk/handtalk25.sgf
new file mode 100644 (file)
index 0000000..92b42d6
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PB[GNU Go 3.2]
+PW[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-28]
+SY[Cgoban 1.9.12]TM[1:00:00(5x1:00)]
+RE[W+37.5]
+;B[pd];W[qp];B[dd];W[dp];B[jd];W[oq];B[cn];W[co];B[dn];W[cj];B[ep];
+W[eq];B[qj];W[eo];B[fp];W[do];B[fq];W[er];B[mc];W[cg];B[ce];W[qm];
+B[qg];W[jp];B[oj];W[gd];B[qd];W[ec];B[nl];W[cc];B[bg];W[ch];B[hq];
+W[iq];B[nn];W[dc];B[if];W[cl];B[bm];W[ir];B[ln];W[lp];B[hh];W[cq];
+B[hc];W[gc];B[gb];W[fb];B[be];W[hb];B[df];W[gf];B[cf];W[fg];B[ee];
+W[bh];B[af];W[cd];B[bd];W[bc];B[ad];W[ic];B[hj];W[fn];B[il];W[fl];
+B[kf];W[ah];B[ag];W[lh];B[ii];W[lj];B[jn];W[io];B[rl];W[rm];B[ql];
+W[ni];B[jc];W[hd];B[sm];W[sn];B[sl];W[rn];B[ej];W[jb];B[kb];W[oi];
+B[mg];W[og];B[fk];W[pj];B[pk];W[pi];B[qi];W[lg];B[ng];W[lf];B[le];
+W[of];B[ne];W[ok];B[ol];W[nk];B[nf];W[mk];B[mh];W[mi];B[nj];W[kl];
+B[ki];W[jk];B[kj];W[ml];B[lm];W[kk];B[ll];W[ik];B[im];W[gk];B[hk];
+W[gj];B[gi];W[fj];B[fi];W[ek];B[ei];W[hn];B[gl];W[fk];B[gm];W[gn];
+B[fm];W[dk];B[em];W[bl];B[lk];W[dj];B[li];W[aj];B[bo];W[bp];B[ja];
+W[ib];B[ap];W[aq];B[ac];W[pm];B[pl];W[on];B[bb];W[no];B[mo];W[mp];
+B[om];W[oo];B[ed];W[cb];B[ie];W[ao];B[bn];W[ba];B[ab];W[ko];B[gg];
+W[ff];B[eh];W[hf];B[dg];W[hg];B[ig];W[gh];B[lo];W[pg];B[mm];W[mj];
+B[ia];W[qf];B[rf];W[rg];B[qh];W[re];B[rd];W[sf];B[sd];W[rh];B[ri];
+W[sh];B[oe];W[ha];B[ka];W[si];B[sj];W[di];B[pe];W[pf];B[ph];W[oh];
+B[fh];W[kn];B[km];W[fd];B[jo];W[kp];B[in];W[dm];B[en];W[fo];B[cm];
+W[dl];B[hm];W[al];B[se];W[qe];B[fe];W[ef];B[ge];W[he];B[de];W[am];
+B[an];W[gg];B[ap];W[ca];B[ao];W[dh];B[eg];W[id];B[aa];W[el];B[nh];
+W[tt];B[tt];
+TW[da][ea][fa][ga][db][eb][gb][fc][hc][rf][sg][ai][bi][ci][bj][nj][oj][ak][bk][ck][pn][qn][go][ho][po][qo][ro][so][cp][ep][fp][gp][hp][ip][np][op][pp][rp][sp][bq][dq][fq][gq][hq][jq][kq][lq][mq][nq][pq][qq][rq][sq][ar][br][cr][dr][fr][gr][hr][jr][kr][lr][mr][nr][or][pr][qr][rr][sr][as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+TB[la][ma][na][oa][pa][qa][ra][sa][lb][mb][nb][ob][pb][qb][rb][sb][kc][lc][nc][oc][pc][qc][rc][sc][kd][ld][md][nd][od][ae][je][ke][me][bf][jf][lf][mf][jg][kg][lg][ih][jh][kh][lh][hi][ji][ij][jj][rj][ik][jk][kk][qk][rk][sk][hl][jl][kl][jm][nm][mn]
+C[The game is over.  Final score:
+   White = 89 territory + 12 captures + 5.5 komi = 106.5
+   Black = 61 territory + 8 captures = 69
+White wins by 37.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk26.sgf b/regression/games/handtalk/handtalk26.sgf
new file mode 100644 (file)
index 0000000..b054a4d
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PB[GNU Go 3.2]
+PW[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-28]
+SY[Cgoban 1.9.12]TM[1:00:00(5x1:00)];B[pd];W[qp];B[cd];W[ec];B[ic];
+W[cb];B[do];W[dq];B[cq];W[cr];B[cp];W[er];B[ck];W[fp];B[oq];W[pn];
+B[cg];W[pq];B[lq];W[or];B[ql];W[iq];B[qi];W[gc];B[lc];W[qc];B[qd];
+W[rc];B[pc];W[pb];B[ob];W[pa];B[rd];W[sc];B[ra];W[rb];B[oa];W[qb];
+B[sa];W[kp];B[fn];W[de];B[ce];W[df];B[ch];W[qm];B[pl];W[nn];B[nl];
+W[ln];B[nr];W[nq];B[mq];W[op];B[kq];W[jp];B[jr];W[mr];B[ll];W[qf];
+B[of];W[mf];B[kk];W[mh];B[mj];W[nd];B[me];W[ne];B[pg];W[nf];B[le];
+W[ji];B[og];W[hi];B[qg];W[ek];B[fj];W[ej];B[ei];W[fi];B[fh];W[gi];
+B[fk];W[eh];B[di];W[eg];B[rm];W[fl];B[dm];W[gk];B[rn];W[je];B[ie];
+W[if];B[jd];W[jf];B[he];W[li];B[br];W[cf];B[bf];W[jm];B[cs];W[ik];
+B[dr];W[eq];B[go];W[ir];B[hn];W[gp];B[hb];W[gb];B[ni];W[io];B[lf];
+W[lg];B[hf];W[hg];B[bc];W[fd];B[bb];W[cc];B[ca];W[dd];B[da];W[ro];
+B[ff];W[fg];B[md];W[nc];B[kd];W[sd];B[oc];W[nb];B[rf];W[gg];B[fe];
+W[qn];B[mb];W[ea];B[eb];W[be];B[bd];W[fa];B[fb];W[ga];B[dc];W[gm];
+B[ho];W[hp];B[fo];W[db];B[dc];W[oe];B[na];W[pe];B[lj];W[re];B[qe];
+W[pf];B[se];W[om];B[jj];W[ij];B[nh];W[ol];B[ok];W[mm];B[ki];W[kh];
+B[jh];W[ii];B[hm];W[kg];B[il];W[kl];B[jl];W[km];B[jk];W[ha];B[ia];
+W[ml];B[hc];W[gd];B[nk];W[dl];B[cl];W[sn];B[rl];W[dj];B[cj];W[gj];
+B[hl];W[es];B[em];W[so];B[mi];W[kj];B[ds];W[in];B[hd];W[ki];B[dh];
+W[sm];B[sl];W[dp];B[nm];W[ee];B[pm];W[on];B[eo];W[ng];B[hk];W[od];
+B[el];W[dk];B[gl];W[fm];B[mk];W[fk];B[mc];W[mg];B[ge];W[ed];B[im]
+)
diff --git a/regression/games/handtalk/handtalk27.sgf b/regression/games/handtalk/handtalk27.sgf
new file mode 100644 (file)
index 0000000..358a719
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PB[GNU Go 3.2]
+PW[Handtalk 95.10]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-29]
+SY[Cgoban 1.9.12]
+RE[W+3.5]
+;B[pd];W[pq];B[po];W[dp];B[qq];W[qr];B[qp];W[or];B[qk];W[np];B[dd];
+W[ip];B[cn];W[co];B[dn];W[jc];B[ep];W[eq];B[cj];W[eo];B[fm];W[fp];
+B[nn];W[lp];B[mc];W[gc];B[ec];W[qh];B[cg];W[qf];B[re];W[rf];B[qd];
+W[pj];B[ge];W[fd];B[fe];W[qj];B[rk];W[id];B[if];W[je];B[hm];W[me];
+B[jh];W[ld];B[nd];W[gh];B[ii];W[gj];B[bn];W[lh];B[ol];W[bo];B[rr];
+W[ml];B[og];W[jl];B[ie];W[oi];B[qs];W[oe];B[ne];W[nf];B[pr];W[of];
+B[os];W[oq];B[ms];W[od];B[oc];W[mn];B[kb];W[jb];B[lc];W[eg];B[fh];
+W[fg];B[hk];W[ei];B[il];W[jm];B[df];W[dk];B[ck];W[dj];B[fk];W[fj];
+B[gk];W[ci];B[bi];W[ch];B[bh];W[cl];B[bl];W[dl];B[dh];W[bk];B[di];
+W[bm];B[em];W[an];B[eh];W[gg];B[fi];W[gi];B[ej];W[ki];B[nj];W[ok];
+B[mf];W[kd];B[ng];W[pg];B[nk];W[nl];B[om];W[mg];B[jk];W[kk];B[fb];
+W[jj];B[hb];W[gb];B[hc];W[ga];B[hd];W[jf];B[hi];W[ig];B[jg];W[ih];
+B[ek];W[ji];B[ik];W[ha];B[sf];W[sg];B[se];W[ia];B[rg];W[jr];B[bj];
+W[al];B[md];W[lf];B[in];W[jn];B[hh];W[hg];B[fc];W[gd];B[pk];W[oj];
+B[rj];W[io];B[rh];W[mr];B[lr];W[mq];B[kq];W[fa];B[ea];W[kr];B[lq];
+W[gn];B[hn];W[go];B[kp];W[ko];B[qi];W[lo];B[pi];W[ni];B[qg];W[ph];
+B[ri];W[qe];B[rd];W[ed];B[db];W[ee];B[nm];W[ef];B[de];W[oo];B[mm];
+W[lm];B[pe];W[pf];B[ho];W[hp];B[no];W[ks];B[ls];W[mo];B[on];W[op];
+B[jq];W[ir];B[iq];W[hq];B[gm];W[ka];B[la];W[el];B[kc];W[fl];B[gl];
+W[nr];B[ns];W[aj];B[ai];W[ak];B[cm];W[en];B[fn];W[fo];B[ja];W[pp];
+B[qo];W[ka];B[oh];W[nh];B[ja];W[dg];B[ka];W[ij];B[hj];W[jp];B[ps];
+W[do];B[dm];W[im];B[bl];W[cl];B[dl];W[am];B[bl];W[ao];B[cl];W[tt];
+B[tt];
+TW[hb][ib][hc][ic][hd][jd][fe][ge][he][ie][ke][le][ff][gf][hf][if][kf][mf][jg][kg][lg][ng][og][jh][kh][mh][oh][li][mi][kj][lj][mj][nj][lk][mk][nk][kl][ll][km][kn][ln][jo][ap][bp][cp][ep][gp][mp][aq][bq][cq][dq][fq][gq][nq][ar][br][cr][dr][er][fr][gr][hr][as][bs][cs][ds][es][fs][gs][hs][is][js]
+TB[aa][ba][ca][da][ma][na][oa][pa][qa][ra][sa][ab][bb][cb][eb][lb][mb][nb][ob][pb][qb][rb][sb][ac][bc][cc][dc][nc][pc][qc][rc][sc][ad][bd][cd][sd][ae][be][ce][af][bf][cf][ag][bg][sg][ah][ch][sh][ci][ei][si][dj][sj][dk][sk][el][fl][hl][pl][ql][rl][sl][pm][qm][rm][sm][pn][qn][rn][sn][ro][so][rp][sp][rq][sq][qr][sr][rs][ss]
+C[The game is over.  Final score:
+   White = 73 territory + 19 captures + 5.5 komi = 97.5
+   Black = 80 territory + 14 captures = 94
+White wins by 3.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk3.sgf b/regression/games/handtalk/handtalk3.sgf
new file mode 100644 (file)
index 0000000..ef9e8c1
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-03-29]
+RE[W+2.5]
+;B[qd];W[op];B[co];W[cd];B[ec];
+W[oc];B[ld];W[nd];B[de];W[ce];B[pf];W[qb];B[df];W[ph];B[cf];W[dc];
+B[ed];W[nf];B[dq];W[og];B[rf];W[rh];B[rd];W[id];B[lf];W[qp];B[qe];
+W[nl];B[qg];W[qh];B[se];W[jq];B[dj];W[gq];B[lh];W[bf];B[bg];W[be];
+B[ch];W[lp];B[lj];W[gc];B[oi];W[pj];B[ql];W[qk];B[cl];W[ge];B[ff];
+W[gf];B[ll];W[pl];B[km];W[qn];B[kf];W[if];B[db];W[cb];B[gh];W[eb];
+B[fb];W[kc];B[gn];W[lc];B[jg];W[da];B[ln];W[fc];B[in];W[pe];B[rb];
+W[qc];B[pd];W[oe];B[fq];W[rc];B[gp];W[hq];B[fr];W[ra];B[is];W[rg];
+B[kr];W[kq];B[mr];W[gr];B[pq];W[lr];B[qq];W[oq];B[or];W[jr];B[pp];
+W[rp];B[rq];W[mq];B[nr];W[po];B[gs];W[gj];B[ig];W[gl];B[nm];W[om];
+B[nn];W[fm];B[oo];W[ko];B[jp];W[ls];B[js];W[ip];B[jo];W[ks];B[hs];
+W[kp];B[mp];W[nq];B[np];W[mk];B[lq];W[lk];B[kk];W[mg];B[gg];W[ik];
+B[sp];W[mi];B[so];W[mj];B[li];W[ek];B[rl];W[rn];B[sn];W[qo];B[io];
+W[fi];B[rk];W[eh];B[fe];W[dm];B[cm];W[dn];B[il];W[hk];B[fk];W[fj];
+B[en];W[do];B[cn];W[ep];B[fn];W[hi];B[em];W[fl];B[ij];W[dl];B[cp];
+W[jj];B[ii];W[ji];B[hh];W[jk];B[jl];W[kj];B[fg];W[kl];B[on];W[pm];
+B[kk];W[lg];B[kg];W[kh];B[rj];W[fp];B[go];W[ck];B[dk];W[el];B[cj];
+W[rm];B[sm];W[qj];B[jh];W[ki];B[fh];W[ei];B[ri];W[md];B[kd];W[je];
+B[jd];W[jc];B[me];W[hm];B[gm];W[hl];B[ne];W[od];B[of];W[eq];B[er];
+W[sh];B[mf];W[ng];B[dp];W[eo];B[ke];W[ir];B[fs];W[ag];B[ah];W[af];
+B[hf];W[he];B[im];W[ml];B[mm];W[qi];B[kl];W[si];B[hn];W[mq];B[hp];
+W[fd];B[dd];W[eg];B[jf];W[hg];B[ie];W[ic];B[hf];W[di];B[ci];W[ef];
+B[dg];W[sj];B[dh];W[sk];B[sl];W[qm];B[ee];W[ro];B[sq];W[ej];B[gi];
+W[hj];B[ih];W[mh];B[pn];W[fo];B[tt];W[tt]C[W + 2.5
+]
+)
diff --git a/regression/games/handtalk/handtalk4.sgf b/regression/games/handtalk/handtalk4.sgf
new file mode 100644 (file)
index 0000000..867a9ba
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[2]KM[0.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-03-30]
+SY[Cgoban 1.9.12]AB[pd][dp]
+RE[B+1.5]
+;W[de];B[pp];W[dc];B[jc];W[jq];B[cg];W[cj];B[eg];W[cm];B[co];W[qj];
+B[be];W[hc];B[mc];W[gq];B[gg];W[qg];B[mq];W[qm];B[qo];W[dr];B[qe];
+W[cq];B[bm];W[bn];B[cn];W[bl];B[dm];W[am];B[fm];W[he];B[fp];W[gp];
+B[bo];W[lr];B[mr];W[og];B[om];W[pn];B[fe];W[fc];B[bc];W[gd];B[fj];
+W[on];B[ok];W[mm];B[mk];W[nl];B[nk];W[ol];B[pk];W[qk];B[hn];W[ed];
+B[kl];W[go];B[ig];W[mg];B[li];W[kd];B[kc];W[ld];B[nc];W[dl];B[el];
+W[ln];B[lg];W[lf];B[kg];W[lq];B[mf];W[jd];B[jn];W[oq];B[pq];W[op];
+B[or];W[pi];B[nf];W[ng];B[dk];W[cl];B[bi];W[bj];B[ci];W[dj];B[rf];
+W[ek];B[fk];W[rg];B[ej];W[di];B[rn];W[lc];B[lb];W[kf];B[rl];W[mp];
+B[ql];W[ni];B[cb];W[pl];B[eb];W[fb];B[sg];W[sh];B[sf];W[ri];B[ls];
+W[rm];B[ks];W[rk];B[ir];W[iq];B[hr];W[gr];B[sm];W[if];B[sl];W[ij];
+B[jg];W[il];B[aj];W[ak];B[gn];W[fo];B[eo];W[ai];B[bh];W[ll];B[lk];
+W[kk];B[km];W[lj];B[mj];W[kj];B[mi];W[ki];B[ml];W[lm];B[jk];W[jl];
+B[kh];W[gl];B[jm];W[fn];B[en];W[gm];B[im];W[ik];B[jo];W[ii];B[ah];
+W[dh];B[dg];W[eh];B[fh];W[gk];B[ao];W[an];B[br];W[bq];B[aq];W[hm];
+B[db];W[hq];B[fa];W[gb];B[qn];W[pm];B[cr];W[dq];B[cs];W[fq];B[ep];
+W[sk];B[sn];W[hg];B[hh];W[hf];B[ih];W[ic];B[jb];W[ib];B[ja];W[mh];
+B[ji];W[jj];B[lh];W[gj];B[gi];W[md];B[of];W[nd];B[oc];W[pf];B[oe];
+W[ds];B[jr];W[kq];B[nq];W[np];B[ck];W[ee];B[ff];W[cd];B[bd];W[cf];
+B[bf];W[jf];B[cc];W[ce];B[ec];W[fd];B[qf];W[eq];B[kr];W[me];B[ga];
+W[ha];B[ea];W[hi];B[gs];W[fs];B[hs];W[oj];B[po];W[oo];B[ch];W[ei];
+B[fi];W[aj];B[jh];W[nj];B[dd];W[bp];B[ap];W[dc];B[pe];W[pg];B[dd];
+W[fl];B[em];W[dc];B[cp];W[dd];B[gf];W[ef];B[od];W[ge];B[ne];W[ia];
+B[ka];W[bk];B[ek];W[pj];B[gh];W[df];B[tt];W[tt];
+TW[hb][gc][hd][id][ie][je][ke][le][nh][oh][ph][qh][rh][oi][qi][si][hj][rj][sj][hk][jk][al][hl][kl][bm][im][jm][km][nm][om][gn][hn][in][jn][kn][mn][nn][ho][io][jo][ko][lo][mo][no][hp][ip][jp][kp][lp][er][fr][es]
+TB[aa][ba][ca][da][la][ma][na][oa][pa][qa][ra][sa][ab][bb][kb][mb][nb][ob][pb][qb][rb][sb][ac][pc][qc][rc][sc][ad][qd][rd][sd][ae][re][se][af][ag][bg][fg][dn][do][ro][so][qp][rp][sp][qq][rq][sq][ar][nr][pr][qr][rr][sr][as][bs][is][js][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 52 territory + 14 captures + 0.5 komi = 66.5
+   Black = 65 territory + 3 captures = 68
+Black wins by 1.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk5.sgf b/regression/games/handtalk/handtalk5.sgf
new file mode 100644 (file)
index 0000000..cb696fe
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[2]KM[0.5]
+PW[Handtalk 95.10
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-03-30]
+AB[pd][dp]
+RE[B+13.5]
+;W[po];B[cd];W[ec];B[ic];W[cb];B[pq];W[qk];B[qo];W[qn];B[qp];W[rn];
+B[cg];W[jq];B[cj];W[qh];B[ne];W[gq];B[eq];W[gc];B[lc];W[mq];B[go];
+W[op];B[qe];W[or];B[cm];W[qr];B[in];W[pr];B[kn];W[de];B[ce];W[df];
+B[ch];W[fp];B[fo];W[gl];B[hk];W[hl];B[il];W[ik];B[mn];W[im];B[jl];
+W[ij];B[hj];W[fj];B[ii];W[jm];B[jk];W[km];B[hm];W[hn];B[gm];W[ho];
+B[fh];W[jn];B[lm];W[kl];B[ll];W[jj];B[kk];W[jo];B[kj];W[em];B[fl];
+W[gk];B[fm];W[nj];B[mj];W[ni];B[gi];W[rf];B[fg];W[re];B[rd];W[ng];
+B[nl];W[cf];B[bf];W[kh];B[ji];W[kd];B[ie];W[ld];B[lf];W[kf];B[lg];
+W[md];B[kg];W[jd];B[id];W[mb];B[lb];W[ib];B[jb];W[mc];B[ma];W[hb];
+B[jc];W[jf];B[rb];W[lh];B[jg];W[if];B[hf];W[ig];B[ih];W[hg];B[gd];
+W[gf];B[ff];W[he];B[hd];W[fd];B[nb];W[fe];B[ge];W[oc];B[hf];W[gg];
+B[nc];W[nd];B[ki];W[od];B[oe];W[pb];B[mh];W[me];B[mf];W[nf];B[qc];
+W[pc];B[sc];W[pa];B[ra];W[ob];B[ep];W[na];B[fr];W[gp];B[hr];W[gr];
+B[gs];W[qf];B[of];W[og];B[pe];W[on];B[bc];W[bb];B[lp];W[lq];B[ko];
+W[kp];B[ip];W[io];B[jp];W[iq];B[kq];W[kr];B[hq];W[ir];B[hp];W[ol];
+B[kp];W[ok];B[is];W[jr];B[js];W[lr];B[dd];W[ee];B[nm];W[mi];B[li];
+W[mk];B[lj];W[nk];B[ab];W[dg];B[cc];W[db];B[dh];W[cq];B[cp];W[bp];
+B[bo];W[dr];B[bq];W[br];B[ap];W[ar];B[er];W[cs];B[bs];W[cr];B[ke];
+W[je];B[le];W[om];B[ml];W[no];B[nh];W[oh];B[jh];W[mo];B[ks];W[ls];
+B[hs];W[pf];B[qd];W[mp];B[mg];W[lo];B[ln];W[eg];B[hh];W[eh];B[ei];
+W[gh];B[fi];W[bk];B[se];W[ck];B[dk];W[sf];B[ed];W[ea];B[sd];W[ca];
+B[lk];W[fc];B[qb];W[ba];B[nn];W[dc];B[ac];W[ef];B[aa];W[qa];B[tt];
+W[tt];
+TW[da][fa][ga][ha][ia][ja][ka][la][ma][oa][eb][fb][gb][jb][kb][lb][nb][hc][ic][jc][kc][lc][nc][gd][hd][id][ge][he][ie][hf][pg][qg][rg][sg][ph][rh][sh][oi][pi][qi][ri][si][oj][pj][qj][rj][sj][pk][rk][sk][pl][ql][rl][sl][pm][qm][rm][sm][pn][sn][oo][qo][ro][so][np][pp][qp][rp][sp][nq][oq][pq][qq][rq][sq][mr][nr][rr][sr][ms][ns][os][ps][qs][rs][ss]
+TB[sa][sb][rc][ad][bd][ae][be][af][ag][bg][ah][bh][kh][lh][ai][bi][ci][di][hi][aj][bj][dj][ej][fj][gj][ij][jj][ak][bk][ck][ek][fk][gk][ik][al][bl][cl][dl][el][gl][hl][kl][am][bm][dm][em][im][jm][km][mm][an][bn][cn][dn][en][fn][gn][hn][in][jn][ao][co][do][eo][ho][io][jo][bp][fp][gp][aq][cq][dq][fq][gq][ar][br][cr][dr][gr][as][cs][ds][es][fs]
+C[The game is over.  Final score:
+   White = 86 territory + 19 captures + 0.5 komi = 105.5
+   Black = 85 territory + 34 captures = 119
+Black wins by 13.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk6.sgf b/regression/games/handtalk/handtalk6.sgf
new file mode 100644 (file)
index 0000000..542dc45
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[2]KM[0.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-03-31]
+RE[B+Resign]
+AB[pd][dp];W[cd];B[pp];W[ec];B[dj]
+;W[jq];B[dh];W[qj];B[jc];W[mq];B[oq];W[qm];B[gc];W[gq];B[eq];W[qg];
+B[qe];W[dm];B[og];W[co];B[mc];W[cq];B[ni];W[cp];B[fk];W[go];B[fe];
+W[rp];B[np];W[mp];B[hk];W[qq];B[no];W[om];B[nm];W[nl];B[on];W[mm];
+B[nr];W[pr];B[li];W[pm];B[jk];W[cf];B[ch];W[mr];B[nn];W[ml];B[cl];
+W[ok];B[bn];W[bo];B[in];W[ph];B[fb];W[eb];B[cn];W[dn];B[do];W[ds];
+B[en];W[km];B[gm];W[el];B[em];W[pf];B[of];W[gf];B[bg];W[if];B[ff];
+W[lf];B[hg];W[hf];B[kg];W[kf];B[je];W[jf];B[ad];W[fh];B[gg];W[hd];
+B[me];W[hc];B[hb];W[fg];B[gh];W[eg];B[fd];W[be];B[dg];W[ae];B[ef];
+W[ih];B[ji];W[ig];B[gi];W[mf];B[fr];W[oe];B[nf];W[pe];B[pc];W[ne];
+B[nd];W[oi];B[nh];W[gr];B[fs];W[le];B[md];W[ge];B[mg];W[ie];B[jd];
+W[lg];B[rf];W[kh];B[jh];W[jg];B[lh];W[nj];B[mj];W[dr];B[rh];W[rg];
+B[sg];W[qf];B[re];W[ri];B[kn];W[ln];B[ko];W[jm];B[ho];W[hp];B[ea];
+W[da];B[fa];W[cb];B[qh];W[pg];B[oh];W[pi];B[ao];W[ap];B[an];W[lo];
+B[ip];W[iq];B[gn];W[jp];B[io];W[kp];B[fo];W[gp];B[im];W[gs];B[lk]
+)
diff --git a/regression/games/handtalk/handtalk7.sgf b/regression/games/handtalk/handtalk7.sgf
new file mode 100644 (file)
index 0000000..ea24fcf
--- /dev/null
@@ -0,0 +1,62 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-03-31]
+RE[W+24.5]
+;B[pd];W[de];B[po]
+;W[dq];B[do];W[pq];B[cq];W[cr]
+;B[qq];W[cp];B[pr];W[dc];B[jd]
+;W[qj];B[cg];W[dj];B[eg];W[cm]
+;B[fo];W[fq];B[be];W[hc];B[oq]
+;W[md];B[pf];W[qh];B[qf];W[jp]
+;B[gg];W[mq];B[nf];W[le];B[jf]
+;W[lg];B[ho];W[hq];B[ql];W[pk]
+;B[he];W[pl];B[pm];W[gd];B[bj]
+;W[co];B[ck];W[dk];B[bc];W[gk]
+;B[jg];W[mk];B[nc];W[kk];B[gm]
+;W[fl];B[im];W[ik];B[km];W[jn]
+;B[jm];W[kn];B[lm];W[ln];B[bl]
+;W[mm];B[dl];W[dm];B[em];W[el]
+;B[cl];W[fj];B[oh];W[jb];B[mc]
+;W[mh];B[ao];W[ni];B[bm];W[cn]
+;B[bq];W[dp];B[cb];W[db];B[nr]
+;W[mr];B[ms];W[bp];B[ks];W[br]
+;B[rg];W[lc];B[lb];W[jr];B[kc]
+;W[ld];B[ri];W[rj];B[rk];W[qi]
+;B[da];W[ea];B[ca];W[fb];B[kb]
+;W[jc];B[ja];W[rh];B[ia];W[hb]
+;B[cj];W[ci];B[bi];W[di];B[om]
+;W[nn];B[in];W[fm];B[kh];W[nl]
+;B[jj];W[jk];B[ki];W[hi];B[ib]
+;W[ic];B[lr];W[lq];B[js];W[ir]
+;B[no];W[mo];B[np];W[ih];B[sh]
+;W[ge];B[kd];W[oi];B[gf];W[og]
+;B[od];W[si];B[sg];W[on];B[ng]
+;W[pn];B[qn];W[nh];B[qg];W[ph]
+;B[ne];W[lf];B[sk];W[oo];B[op]
+;W[qo];B[ro];W[pp];B[qm];W[rp]
+;B[qp];W[rq];B[po];W[ha];B[ka]
+;W[kj];B[ji];W[li];B[ee];W[ed]
+;B[fe];W[fd];B[df];W[fh];B[cd]
+;W[dd];B[ce];W[bn];B[an];W[eh]
+;B[kr];W[kq];B[ls];W[is];B[ns]
+;W[gh];B[sj];W[ij];B[hg];W[ol]
+;B[ap];W[aq];B[nm];W[mn];B[mp]
+;W[lp];B[hh];W[ii];B[ig];W[id]
+;B[ie];W[of];B[ke];W[oe];B[nd]
+;W[pe];B[qe];W[fg];B[pg];W[oh]
+;B[ff];W[ch];B[bh];W[ri];B[kf]
+;W[dh];B[dg];W[qk];B[sm];W[lh]
+;B[cc];W[nq];B[kg];W[bo];B[am]
+;W[hd];B[me];W[jh];B[mf];W[mg]
+;B[tt]BL[3160];W[tt]WL[2616]PL[W]
+TW[fa][ga][eb][gb][ec][fc][gc][ei][fi][gi][mi][pi][ej][gj][hj][lj][mj][nj][oj][pj][ek][fk][hk][lk][nk][ok][gl][hl][il][jl][kl][ll][ml][em][gm][hm][im][jm][km][lm][dn][en][fn][gn][hn][in][do][eo][fo][go][ho][io][jo][ko][lo][ep][fp][gp][hp][ip][kp][bq][cq][eq][gq][iq][jq][ar][dr][er][fr][gr][hr][as][bs][cs][ds][es][fs][gs][hs]
+TB[aa][ba][la][ma][na][oa][pa][qa][ra][sa][ab][bb][mb][nb][ob][pb][qb][rb][sb][ac][oc][pc][qc][rc][sc][ad][bd][qd][rd][sd][ae][je][re][se][af][bf][cf][ef][hf][if][rf][sf][ag][bg][ah][ai][aj][ak][bk][al][rl][sl][rm][rn][sn][qo][so][pp][rp][sp][pq][rq][sq][or][qr][rr][sr][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 81 territory + 15 captures + 5.5 komi = 101.5
+   Black = 72 territory + 5 captures = 77
+White wins by 24.5.
+]
+)
diff --git a/regression/games/handtalk/handtalk8.sgf b/regression/games/handtalk/handtalk8.sgf
new file mode 100644 (file)
index 0000000..62c147d
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-01]
+RE[B+Resign]
+;B[pd];W[ec];B[dp];W[qq];B[cc];
+W[cf];B[np];W[qm];B[gc];W[ee];B[jc];W[jq];B[dj];W[qi];B[cn];W[gq];
+B[mc];W[be];B[eq];W[qf];B[qe];W[rf];B[re];W[lq];B[nn];W[qo];B[nl];
+W[ch];B[nj];W[qk];B[nh];W[bj];B[ge];W[cl];B[fg];W[el];B[fj];W[nr];
+B[kn];W[lg];B[kf];W[lf];B[li];W[kg];B[me];W[le];B[hk];W[ng];B[og];
+W[mg];B[jf];W[of];B[ji];W[pg];B[fb];W[eb];B[hn];W[oh];B[ne];W[hp];
+B[sf];W[sg];B[se];W[rh];B[fr];W[kd];B[lc];W[jg];B[hr];W[jd];B[ig];
+W[kc];B[jb];W[gr];B[gs];W[kb];B[lb];W[if];B[ie];W[hf];B[id];W[je];
+B[hg];W[io];B[gf];W[in];B[im];W[ke];B[ea];W[db];B[oi];W[bm];B[bn];
+W[ir];B[hq];W[fp];B[iq];W[jr];B[ip];W[ho];B[jp];W[hm];B[gn];W[il];
+B[en];W[jm];B[go];W[gl];B[gp];W[ll];B[lm];W[kl];B[lp];W[oq];B[mq];
+W[mr];B[he];W[jf];B[ml];W[kq];B[mh];W[da];B[kp];W[fa];B[ga];W[ik];
+B[ij];W[gk];B[gj];W[an];B[ao];W[am];B[bp];W[ka];B[jj];W[ja];B[gb];
+W[fd];B[ib];W[pl];B[ck];W[bk];B[dl];W[dm];B[dk];W[em];B[cm];W[dn];
+B[jk];W[eo];B[fk];W[fn];B[fq];W[gm];B[fl];W[bl];B[fm];W[fo];B[gq];
+W[oc];B[pc];W[ob];B[rc];W[nc];B[nd];W[mb];B[la];W[qa];B[na];W[nb];
+B[ma];W[pb];B[qb];W[ei];B[di];W[eh];B[dh];W[eg];B[dg];W[ah];B[ef];
+W[cg];B[df];W[de];B[oe]
+)
diff --git a/regression/games/handtalk/handtalk9.sgf b/regression/games/handtalk/handtalk9.sgf
new file mode 100644 (file)
index 0000000..8066d6d
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[4]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Handtalk 95.10]
+PB[GNU Go 3.1.29]
+GN[Game supplied by Jessie Annala]
+DT[2002-04-02]
+RE[W+27.5]
+;B[pd];W[dp];B[pq];W[cc];B[fq]
+;W[qo];B[qk];W[rq];B[mq];W[eq]
+;B[fp];W[rl];B[jp];W[ql];B[fd]
+;W[pk];B[ic];W[qj];B[cn];W[co]
+;B[dn];W[cg];B[dj];W[qg];B[qe]
+;W[lc];B[ep];W[er];B[fr];W[cq]
+;B[qc];W[nc];B[lm];W[ef];B[gf]
+;W[jd];B[fc];W[id];B[jc];W[hd]
+;B[ib];W[eb];B[gh];W[ge];B[lb]
+;W[mb];B[jg];W[fb];B[lk];W[ff]
+;B[bn];W[bp];B[il];W[gg];B[hf]
+;W[hg];B[hh];W[ig];B[jh];W[if]
+;B[ob];W[op];B[oq];W[np];B[lq]
+;W[mh];B[fh];W[ml];B[mm];W[mk]
+;B[pf];W[lj];B[kk];W[pg];B[kj]
+;W[bj];B[md];W[kb];B[nm];W[nd]
+;B[ld];W[kc];B[lf];W[kd];B[mg]
+;W[nh];B[bl];W[ck];B[dk];W[cl]
+;B[rf];W[dl];B[el];W[em];B[dm]
+;W[fl];B[ek];W[fm];B[of];W[gn]
+;B[bk];W[cj];B[eo];W[gk];B[rh]
+;W[fj];B[di];W[ch];B[dh];W[in]
+;B[hj];W[hp];B[cm];W[hr];B[jr]
+;W[ce];B[hq];W[jn];B[aj];W[ko]
+;B[lo];W[hl];B[ci];W[ik];B[jl]
+;W[im];B[iq];W[hk];B[bh];W[gq]
+;B[gp];W[ho];B[bg];W[go];B[bf]
+;W[cf];B[be];W[rg];B[sg];W[kp]
+;B[kn];W[jo];B[bd];W[bc];B[cd]
+;W[dd];B[es];W[ds];B[fs];W[dr]
+;B[ac];W[nq];B[nr];W[lh];B[bb]
+;W[dc];B[qr];W[on];B[ip];W[lp]
+;B[mp];W[mo];B[ln];W[no];B[rr]
+;W[ij];B[ki];W[kf];B[hi];W[hm]
+;B[mj];W[li];B[rp];W[nj];B[kg]
+;W[lg];B[mf];W[ro];B[qq];W[jf]
+;B[sp];W[ne];B[og];W[oh];B[qh]
+;W[ph];B[qi];W[kq];B[kr];W[ji]
+;B[ii];W[jj];B[rj];W[ih];B[pj]
+;W[kh];B[pl];W[ok];B[rk];W[ol]
+;B[sl];W[sm];B[sk];W[pm];B[cb]
+;W[so];B[nb];W[mc];B[ma];W[la]
+;B[db];W[ec];B[bo];W[na];B[oa]
+;W[br];B[do];W[cp];B[gj];W[fk]
+;B[oc];W[pp];B[ea];W[ao];B[fa]
+;W[gb];B[ga];W[ha];B[da];W[hb]
+;B[an];W[ap];B[ke];W[fi];B[dg]
+;W[df];B[je];W[oe];B[eg];W[ei]
+;B[pi];W[en];B[oi];W[ni];B[fo]
+;W[qp];B[sq];W[jq];B[ma];W[ie]
+;B[le];W[na];B[gc];W[ma];B[pe]
+;W[fg];B[eh];W[fn];B[od];W[oj]
+;B[qf];W[ng];B[nf];W[io];B[ir]
+;W[ej];B[me];W[gi];B[bi];W[tt]
+;B[tt];
+TW[ia][ja][ka][ib][jb][lb][fc][gc][hc][ic][jc][ed][fd][gd][de][ee][fe][he][gf][hf][jg][kg][jh][ki][mi][kj][mj][jk][kk][lk][nk][gl][il][jl][kl][ll][nl][pl][gm][jm][km][lm][mm][nm][om][qm][rm][hn][kn][ln][mn][nn][pn][qn][rn][sn][lo][oo][po][aq][bq][dq][ar][cr][as][bs][cs]
+TB[aa][ba][ca][pa][qa][ra][sa][ab][pb][qb][rb][sb][pc][rc][sc][ad][qd][rd][sd][ae][re][se][af][sf][ag][ah][sh][ai][ri][si][bj][cj][qj][sj][ak][ck][al][cl][dl][am][bm][gq][rq][gr][hr][lr][mr][or][pr][sr][gs][hs][is][js][ks][ls][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 67 territory + 28 captures + 5.5 komi = 100.5
+   Black = 63 territory + 10 captures = 73
+White wins by 27.5.
+]
+)
diff --git a/regression/games/heikki/heikki01.sgf b/regression/games/heikki/heikki01.sgf
new file mode 100644 (file)
index 0000000..3a989aa
--- /dev/null
@@ -0,0 +1,253 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.178 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.178 gmp Random Seed 134914567] 
+;B[pq]
+;W[dc]
+;B[pd]
+;W[eq]
+;B[ce]
+;W[fd]
+;B[ch]
+;W[cp]
+;B[mq]
+;W[ck]
+;B[po]
+;W[nd]
+;B[ql]
+;W[qf]
+;B[oe]
+;W[ne]
+;B[jq]
+;W[hq]
+;B[hc]
+;W[gc]
+;B[qi]
+;W[hd]
+;B[ic]
+;W[id]
+;B[jc]
+;W[jd]
+;B[gb]
+;W[fb]
+;B[ha]
+;W[kc]
+;B[kb]
+;W[lc]
+;B[eo]
+;W[lb]
+;B[ja]
+;W[ib]
+;B[hb]
+;W[cn]
+;B[hr]
+;W[gr]
+;B[ir]
+;W[gq]
+;B[ek]
+;W[em]
+;B[cj]
+;W[dk]
+;B[fn]
+;W[fm]
+;B[bc]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[dj]
+;W[od]
+;B[of]
+;W[rd]
+;B[bk]
+;W[pe]
+;B[nf]
+;W[gn]
+;B[ff]
+;W[cm]
+;B[fi]
+;W[bl]
+;B[bj]
+;W[kj]
+;B[kl]
+;W[kg]
+;B[ni]
+;W[ph]
+;B[pi]
+;W[oh]
+;B[qh]
+;W[lk]
+;B[nh]
+;W[ml]
+;B[qg]
+;W[rg]
+;B[rh]
+;W[rf]
+;B[jk]
+;W[nm]
+;B[no]
+;W[io]
+;B[mn]
+;W[lm]
+;B[gk]
+;W[kn]
+;B[mm]
+;W[ll]
+;B[pl]
+;W[nl]
+;B[li]
+;W[ki]
+;B[mj]
+;W[cc]
+;B[ok]
+;W[bd]
+;B[bb]
+;W[dd]
+;B[cd]
+;W[de]
+;B[df]
+;W[cf]
+;B[be]
+;W[bf]
+;B[ad]
+;W[ef]
+;B[dg]
+;W[eg]
+;B[fg]
+;W[dh]
+;B[cg]
+;W[ei]
+;B[fj]
+;W[fh]
+;B[hf]
+;W[ej]
+;B[ee]
+;W[gh]
+;B[ih]
+;W[eh]
+;B[fe]
+;W[hg]
+;B[if]
+;W[hi]
+;B[kf]
+;W[ig]
+;B[jg]
+;W[jh]
+;B[jf]
+;W[ii]
+;B[lg]
+;W[kh]
+;B[ij]
+;W[gm]
+;B[ed]
+;W[ec]
+;B[cb]
+;W[db]
+;B[da]
+;W[ea]
+;B[ca]
+;W[fa]
+;B[jb]
+;W[le]
+;B[lf]
+;W[ak]
+;B[gd]
+;W[ge]
+;B[la]
+;W[mb]
+;B[gf]
+;W[ci]
+;B[ag]
+;W[bi]
+;B[bg]
+;W[lp]
+;B[ga]
+;W[lq]
+;B[ko]
+;W[jo]
+;B[lr]
+;W[lo]
+;B[kr]
+;W[on]
+;B[kp]
+;W[oo]
+;B[np]
+;W[op]
+;B[nr]
+;W[oq]
+;B[or]
+;W[pp]
+;B[qq]
+;W[qp]
+;B[pn]
+;W[rp]
+;B[rq]
+;W[sm]
+;B[hl]
+;W[hm]
+;B[jm]
+;W[jn]
+;B[rn]
+;W[nq]
+;B[mp]
+;W[ln]
+;B[ro]
+;W[sq]
+;B[nn]
+;W[pm]
+;B[sr]
+;W[qm]
+;B[rm]
+;W[sp]
+;B[rr]
+;W[iq]
+;B[jj]
+;W[hj]
+;B[hk]
+;W[im]
+;B[il]
+;W[fl]
+;B[fk]
+;W[sh]
+;B[si]
+;W[sg]
+;B[jp]
+;W[ip]
+;B[gs]
+;W[fs]
+;B[hs]
+;W[er]
+;B[nk]
+;W[mf]
+;B[mg]
+;W[me]
+;B[lh]
+;W[pf]
+;B[pg]
+;W[sn]
+;B[so]
+;W[qn]
+;B[ke]
+;W[kd]
+;B[ol]
+;W[om]
+;B[he]
+;W[gd]
+;B[sl]
+;W[qo]
+;B[bh]
+;W[aj]
+;B[mk]
+;W[kq]
+;B[jr]
+;W[mo]
+;B[mr]
+;W[lj]
+;B[gg]
+;W[hh]
+;B[ie]
+;W[je]
+;B[tt]
+;W[ai]
+;B[af]
+;W[ah]
+;B[tt]
+;W[tt]
+)
diff --git a/regression/games/iken-tobi.sgf b/regression/games/iken-tobi.sgf
new file mode 100644 (file)
index 0000000..f5bbd3c
--- /dev/null
@@ -0,0 +1,37 @@
+(\r
+;US[Ph(i)Nk 0]\r
+ GM[1]\r
+ DT[2002-04-21]\r
+ RU[Japanese]\r
+ HA[0]\r
+ KM[5.5]\r
+ SZ[19]\r
+ FF[4]\r
+ RE[B+3.5]\r
+ AP[Goban:v33]\r
+ BR[13k?]\r
+ PB[GNU Go]\r
+ WR[13k?]\r
+ PW[GNU Go]\r
+;B[pd];W[dc];B[dp];W[pp];B[de];W[dh];B[fe];W[fc];B[he];W[hc];B[dk]\r
+;W[nc];B[np];W[pn];B[jp];W[gp];B[pq];W[qq];B[oq];W[qr];B[dn];W[qj]\r
+;B[pf];W[pb];B[lc];W[ne];B[qc];W[eq];B[dq];W[qb];B[le];W[ng];B[er]\r
+;W[fq];B[nn];W[ph];B[ol];W[ni];B[ff];W[pl];B[lg];W[li];B[qg];W[ml]\r
+;B[om];W[iq];B[jq];W[ip];B[pr];W[jo];B[ko];W[jn];B[kn];W[hn];B[ci]\r
+;W[cd];B[ce];W[fk];B[ej];W[gi];B[ch];W[hk];B[eh];W[fr];B[dr];W[ji]\r
+;B[jm];W[km];B[jr];W[lm];B[bd];W[bc];B[be];W[ir];B[rb];W[rh];B[rg]\r
+;W[sg];B[sf];W[sh];B[re];W[jc];B[pm];W[qm];B[ql];W[pk];B[qn];W[qo]\r
+;B[rn];W[ro];B[rl];W[gm];B[so];W[sp];B[sn];W[rq];B[kd];W[js];B[ks]\r
+;W[is];B[lr];W[ra];B[jd];W[rc];B[qh];W[ri];B[rd];W[sb];B[ac];W[bb]\r
+;B[ok];W[oj];B[qi];W[rj];B[pi];W[pj];B[oh];W[id];B[ie];W[ln];B[lp]\r
+;W[mg];B[kq];W[kb];B[hh];W[jg];B[lb];W[gh];B[ih];W[kg];B[lf];W[ig]\r
+;B[hg];W[mb];B[jh];W[kh];B[ab];W[la];B[nk];W[mk];B[pc];W[md];B[oo]\r
+;W[po];B[gg];W[kc];B[ld];W[ba];B[el];W[fj];B[fh];W[fl];B[hi];W[hj]\r
+;B[fi];W[gj];B[lh];W[nj];B[gd];W[em];B[dm];W[en];B[eo];W[fo];B[ep]\r
+;W[rk];B[gc];W[gb];B[ed];W[sl];B[ec];W[eb];B[hd];W[ic];B[dd];W[cc]\r
+;B[ek];W[on];B[nm];W[op];B[no];W[ps];B[or];W[os];B[ns];W[qs];B[nr]\r
+;W[lo];B[kp];W[og];B[pg];W[od];B[oe];W[oc];B[of];W[ii];B[nf];W[me]\r
+;B[mf];W[mc];B[mh];W[nh];B[oi];W[mi];B[fs];W[gs];B[es];W[gr];B[kf]\r
+;W[if];B[hf];W[jf];B[je];W[ki];B[sd];W[sc];B[mo];W[fp];B[fd];W[fb]\r
+;B[mm];W[sm];B[rm];W[sk];B[mn];W[aa];B[ad];W[qk];B[qm];W[nl];B[ll]\r
+;W[kl];B[];W[])\r
diff --git a/regression/games/incident104.sgf b/regression/games/incident104.sgf
new file mode 100644 (file)
index 0000000..b5b4f70
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.7 ascii]HA[4]KM[0.5]GN[GNU Go 2.5.7 ascii Random Seed 937774398] 
+AB[pd]AB[dp]AB[dd]AB[pp]
+LB[cc:70][fc:80][nc:80][qc:70][fd:71][gd:71][md:71][nd:71][cf:80][df:71][pf:71][qf:80][dg:71][pg:71][dm:71][pm:71][cn:80][dn:71][pn:71][qn:80][fp:71][gp:71][mp:71][np:71][cq:70][fq:80][nq:80][qq:70]
+C[Value of move: 82]
+;W[qf];B[nd];W[cf];B[fd];W[bd];B[ch];W[cc];B[dc];W[rd];B[qc]
+;W[qi];B[qk];W[fq];B[dn];W[nq];B[oq];W[dr];B[dk];W[np];B[pm]
+;W[cq];B[cp];W[jc];B[jd];W[hc];B[gc];W[hd];B[kc];W[kb];B[lc]
+;W[ic];B[ke];W[lb];B[mb];W[jp];B[of];W[rc];B[rb];W[ef];B[ff]
+;W[hf];B[ee];W[eg];B[fg];W[eh];B[gi];W[fo];B[fn];W[gn];B[fm]
+;W[hn];B[ei];W[di];B[ci];W[dh];B[dj];W[rk];B[rl];W[rj];B[pl]
+;W[fi];B[fh];W[dg];B[fj];W[nn];B[nl];W[lm];B[jl];W[lk];B[jn]
+;W[bg];B[cg];W[df];B[bh];W[bf];B[ce];W[be];B[ln];W[mm];B[lo]
+;W[nk];B[ok];W[ml];B[nj];W[mk];B[oh];W[oj];B[oi];W[pj];B[pk]
+;W[ni];B[mj];W[mi];B[lj];W[kj];B[li];W[lh];B[mh];W[ki];B[jj]
+;W[nh];B[mg];W[og];B[ng];W[pg];B[kh];W[lg];B[lf];W[ji];B[jg]
+;W[hh];B[ii];W[ih];B[jh];W[hi];B[ij];W[hj];B[hk];W[gj];B[gk]
+;W[if];B[kg];W[li];B[jf];W[lq];B[io];W[fp];B[hp];W[ho];B[ip]
+;W[hr];B[in];W[jq];B[lp];W[ie];B[ge];W[je];B[kd];W[bq];B[bp]
+;W[ap];B[ao];W[aq];B[bn];W[gp];B[hm];W[mp];B[nr];W[mr];B[or]
+;W[po];B[qo];W[oo];B[qq];W[cb];B[db];W[da];B[ea];W[ca];B[fb]
+;W[hb];B[ja];W[ia];B[jb];W[ib];B[la];W[ka];B[ma];W[iq];B[he]
+;W[hq];B[id];W[hg];B[mc];W[ag];B[ah];W[mo];B[om];W[ns];B[os]
+;W[ms];B[kq];W[kp];B[kr];W[jr];B[lr];W[mq];B[mn];W[kn];B[km]
+;W[ko];B[pn];W[kl];B[jm];W[sl];B[sm];W[sk];B[qm];W[eq];B[eo]
+;W[sb];B[qb];W[qe];B[qd];W[nm];B[pf];W[pe];B[oe];W[sc];B[qg]
+;W[ph];B[re];W[rf];B[sa];W[se];B[ra];W[rg];B[qj];W[ri];B[jk]
+;W[kk];B[gm];W[go];B[op];W[on];B[ol];W[dq];B[ep];W[de];B[cd]
+;W[jo];B[gh];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident107.sgf b/regression/games/incident107.sgf
new file mode 100644 (file)
index 0000000..dba7332
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.7 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.7 ascii Random Seed 937776748] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[qf];B[nd];W[rd];B[qc];W[ld];B[gq];W[nq];B[np];W[oq];B[pq]
+;W[op];B[oo];W[no];B[on];W[mo];B[cg];W[fc];B[cm];W[fq];B[fp]
+;W[eq];B[gr];W[ep];B[do];W[eo];B[gp];W[cr];B[rc];W[qd];B[nc]
+;W[kc];B[jc];W[qn];B[qo];W[pn];B[po];W[ql];B[qk];W[ol];B[pm]
+;W[qm];B[pl];W[rk];B[om];W[qj];B[pk];W[qi];B[nl];W[bp];B[ok]
+;W[fe];B[ec];W[ce];B[cd];W[de];B[fb];W[gc];B[bf];W[be];B[sd]
+;W[re];B[bd];W[ae];B[ad];W[ed];B[db];W[lf];B[nf];W[me];B[ne]
+;W[jf];B[pi];W[kr];B[qh];W[rh];B[rl];W[rj];B[rn];W[em];B[ph]
+;W[hm];B[ir];W[lq];B[gg];W[eg];B[hc];W[gb];B[hb];W[fa];B[eb]
+;W[he];B[if];W[ie];B[je];W[kf];B[hg];W[ei];B[ci];W[km];B[mh]
+;W[kh];B[gj];W[ej];B[dq];W[dr];B[af];W[dn];B[bh];W[li];B[dh]
+;W[eh];B[co];W[cn];B[bo];W[bn];B[ao];W[an];B[bl];W[fk];B[bq]
+;W[cq];B[gn];W[gm];B[dk];W[in];B[lc];W[lb];B[mc];W[kd];B[mb]
+;W[kb];B[mj];W[lj];B[fr];W[er];B[jb];W[jq];B[ip];W[iq];B[kp]
+;W[hq];B[hp];W[ll];B[hr];W[ln];B[jh];W[lh];B[ig];W[ik];B[ij]
+;W[gk];B[mg];W[gi];B[hj];W[gh];B[mk];W[lk];B[ki];W[dl];B[pf]
+;W[qg];B[pr];W[or];B[pg];W[cl];B[ck];W[bj];B[dg];W[bk];B[el]
+;W[dm];B[ek];W[fj];B[mi];W[bi];B[di];W[cf];B[ef];W[ag];B[ee]
+;W[bg];B[ah];W[ai];B[ch];W[fd];B[df];W[fl];B[ff];W[gf];B[fg]
+;W[hd];B[hf];W[ha];B[ia];W[ga];B[jk];W[ka];B[id];W[ib];B[ic]
+;W[ke];B[ge];W[il];B[gd];W[jl];B[kk];W[al];B[os];W[ns];B[ps]
+;W[jg];B[ih];W[pb];B[pc];W[se];B[ob];W[sc];B[rb];W[sb];B[hi]
+;W[fh];B[sk];W[sj];B[si];W[sl];B[rm];W[sh];B[sm];W[mm];B[hk]
+;W[hl];B[kj];W[nn];B[ma];W[pe];B[oe];W[qe];B[ra];W[ri];B[lg]
+;W[kg];B[sk];W[ml];B[sl];W[nm];B[kl];W[ja];B[ib];W[cb];B[bb]
+;W[ba];B[la];W[bc];B[ab];W[hh];B[md];W[mf];B[cj];W[sd];B[sa]
+;W[tt];B[tt]
+)
diff --git a/regression/games/incident108b.sgf b/regression/games/incident108b.sgf
new file mode 100644 (file)
index 0000000..f5fc715
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.8 ascii]HA[6]KM[0.5]GN[GNU Go 2.5.8 ascii Random Seed 937917973] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]
+;W[cn];B[dn];W[dm];B[en];W[em];B[cm];W[cl];B[bm];W[bl];B[bn]
+;W[co];B[bo];W[cp];B[dl];W[fm];B[cq];W[dq];B[bp];W[fn];B[ck]
+;W[eo];B[do];W[ep];B[jc];W[fq];B[lp];W[jp];B[qm];W[np];B[pg]
+;W[cf];B[fc];W[bd];B[cc];W[bc];B[mc];W[ef];B[mo];W[oo];B[qo]
+;W[om];B[mm];W[nk];B[ol];W[lq];B[pk];W[or];B[on];W[nn];B[pn]
+;W[nm];B[no];W[op];B[nl];W[ml];B[mn];W[lk];B[kq];W[kp];B[jq]
+;W[mq];B[iq];W[hq];B[ip];W[kn];B[hr];W[gr];B[is];W[hp];B[io]
+;W[im];B[ko];W[jn];B[jo];W[ks];B[qr];W[pq];B[qq];W[pr];B[ho]
+;W[go];B[dr];W[er];B[ll];W[mk];B[lm];W[ln];B[ch];W[eh];B[dg]
+;W[df];B[eg];W[fg];B[fh];W[ff];B[ei];W[gh];B[fi];W[gi];B[gg]
+;W[gf];B[hg];W[bh];B[bg];W[bi];B[bk];W[cg];B[dh];W[bf];B[gj]
+;W[ii];B[hi];W[hj];B[hh];W[ik];B[hk];W[ij];B[hl];W[hm];B[fk]
+;W[el];B[al];W[ek];B[il];W[jl];B[kk];W[jk];B[kl];W[li];B[bb]
+;W[ie];B[nf];W[nh];B[ke];W[jg];B[if];W[hf];B[ig];W[jf];B[he]
+;W[je];B[hd];W[cd];B[jh];W[kg];B[ih];W[kj];B[ed];W[cb];B[dc]
+;W[ba];B[db];W[ab];B[kd];W[kh];B[ej];W[ci];B[ds];W[es];B[mg]
+;W[gl];B[gk];W[fl];B[lf];W[ph];B[qh];W[og];B[pf];W[pi];B[qi]
+;W[of];B[oi];W[oh];B[oj];W[ok];B[pl];W[od];B[ob];W[oc];B[pb]
+;W[pc];B[qc];W[pe];B[qd];W[qf];B[qg];W[qe];B[re];W[rf];B[sd]
+;W[sh];B[ne];W[oe];B[mh];W[ni];B[mi];W[nj];B[mj];W[lj];B[nd]
+;W[nc];B[nb];W[rb];B[qb];W[rc];B[rd];W[rj];B[qj];W[rl];B[ra]
+;W[rm];B[rk];W[sk];B[qk];W[ri];B[rn];W[sl];B[rh];W[sg];B[id]
+;W[gd];B[ge];W[fe];B[fd];W[da];B[eb];W[ea];B[fa];W[ca];B[de]
+;W[ce];B[dk];W[ga];B[fb];W[gc];B[gb];W[hb];B[ib];W[ee];B[hc]
+;W[eq];B[br];W[di];B[eh];W[ji];B[kr];W[lr];B[js];W[ls];B[hn]
+;W[gn];B[ps];W[os];B[qs];W[sn];B[so];W[sm];B[ql];W[si];B[sj]
+;W[sk];B[sl];W[sj];B[bj];W[ag];B[ai];W[ah];B[aj];W[lo];B[kp]
+;W[mp];B[pm];W[gs];B[hs];W[km];B[in];W[jm];B[po];W[ng];B[se]
+;W[sf];B[lh];W[lg];B[mf];W[ki];B[kf];W[jd];B[rg];W[lc];B[lb]
+;W[md];B[kc];W[mb];B[ma];W[mc];B[ld];W[kb];B[la];W[na];B[oa]
+;W[me];B[cj];W[le];B[tt];W[jb];B[ic];W[tt];B[tt]
+)
diff --git a/regression/games/incident114.sgf b/regression/games/incident114.sgf
new file mode 100644 (file)
index 0000000..fea6a33
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.9 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.9 ascii Random Seed 937988264] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[fq];B[fp];W[gp];B[gq];W[eq];B[dq];W[ep];B[fo];W[eo];B[hq]
+;W[do];B[go];W[qn];B[nq];W[rp];B[qq];W[qf];B[pf];W[qg];B[cg]
+;W[nc];B[gc];W[pb];B[rd];W[pe];B[oe];W[qe];B[qd];W[od];B[of]
+;W[pc];B[rq];W[oh];B[ro];W[rn];B[qo];W[nj];B[ni];W[oi];B[sp]
+;W[qi];B[qj];W[ri];B[oj];W[rk];B[rj];W[sj];B[nh];W[mj];B[ng]
+;W[md];B[lc];W[lh];B[rb];W[re];B[lg];W[kh];B[pm];W[pn];B[ih]
+;W[ke];B[kc];W[kg];B[cm];W[bn];B[bm];W[cn];B[an];W[ao];B[am]
+;W[bp];B[bq];W[dr];B[cr];W[es];B[fr];W[er];B[gr];W[dm];B[dl]
+;W[em];B[dk];W[if];B[cp];W[co];B[gm];W[fl];B[fj];W[gl];B[gg]
+;W[hg];B[hh];W[gf];B[fg];W[ff];B[eg];W[fc];B[fb];W[ec];B[dc]
+;W[eb];B[gb];W[cb];B[db];W[ee];B[ea];W[df];B[dg];W[cf];B[ef]
+;W[de];B[fe];W[ed];B[gd];W[cd];B[cc];W[bc];B[da];W[be];B[bb]
+;W[bg];B[ab];W[ci];B[cl];W[di];B[ei];W[jl];B[bh];W[ag];B[kk]
+;W[bi];B[gi];W[lk];B[fh];W[kl];B[ch];W[ah];B[ll];W[lm];B[ml]
+;W[kj];B[jk];W[il];B[km];W[ln];B[jn];W[ko];B[jo];W[lq];B[kq]
+;W[lp];B[ki];W[lj];B[ji];W[li];B[mr];W[lr];B[kr];W[ks];B[js]
+;W[ls];B[ir];W[nn];B[mm];W[no];B[mb];W[lf];B[ms];W[np];B[hj]
+;W[hm];B[hn];W[jm];B[kn];W[kp];B[sn];W[sm];B[so];W[rm];B[fm]
+;W[el];B[ic];W[fn];B[gn];W[in];B[hp];W[io];B[jq];W[ip];B[en]
+;W[iq];B[jr];W[hs];B[hr];W[im];B[fn];W[ho];B[gp];W[dn];B[lo]
+;W[mo];B[gs];W[oq];B[or];W[mq];B[nr];W[op];B[pq];W[bk];B[is]
+;W[nb];B[mg];W[ig];B[aq];W[cq];B[br];W[ap];B[he];W[hf];B[ie]
+;W[je];B[dh];W[ge];B[fd];W[jh];B[po];W[oo];B[na];W[oa];B[ma]
+;W[mc];B[kb];W[ld];B[ek];W[fk];B[gk];W[hk];B[ik];W[gj];B[hl]
+;W[gk];B[nk];W[ol];B[ok];W[pl];B[nm];W[om];B[qk];W[ql];B[cj]
+;W[bj];B[ai];W[aj];B[pi];W[ph];B[mn];W[lo];B[bl];W[ac];B[al]
+;W[ae];B[nl];W[kd];B[ak];W[ai];B[pk];W[ck];B[ej];W[tt];B[fs]
+;W[tt];B[kl];W[tt];B[mk];W[tt];B[tt]
+)
diff --git a/regression/games/incident118.sgf b/regression/games/incident118.sgf
new file mode 100644 (file)
index 0000000..2bc58d0
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.10 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.10 ascii Random Seed 938085514] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[gp];B[dn];W[pg];B[nd];W[dg];B[fd];W[pm];B[np];W[dl];B[fn]
+;W[eo];B[do];W[en];B[em];W[dm];B[fm];W[fo];B[hq];W[gq];B[hp]
+;W[ho];B[ql];W[qm];B[pl];W[nm];B[qh];W[qg];B[ph];W[ng];B[ch]
+;W[cg];B[dh];W[ek];B[eg];W[cq];B[dq];W[dr];B[er];W[cr];B[fq]
+;W[gr];B[fg];W[bo];B[bg];W[qq];B[qp];W[rp];B[ro];W[rq];B[qn]
+;W[rm];B[hr];W[oq];B[nq];W[op];B[pq];W[oo];B[or];W[qr];B[pr]
+;W[lp];B[lq];W[kq];B[kp];W[mq];B[mr];W[lr];B[mo];W[lo];B[on]
+;W[po];B[pn];W[om];B[ce];W[rn];B[no];W[so];B[qe];W[oh];B[rl]
+;W[nk];B[li];W[oj];B[jq];W[jr];B[ir];W[jn];B[fk];W[ej];B[lk]
+;W[qi];B[pi];W[rh];B[oi];W[ni];B[ri];W[qj];B[pk];W[rj];B[rg]
+;W[si];B[rf];W[rk];B[sk];W[ok];B[sl];W[ol];B[sg];W[sm];B[sh]
+;W[sj];B[ri];W[qo];B[qk];W[ro];B[lm];W[mn];B[ln];W[ko];B[lg]
+;W[fi];B[nn];W[mm];B[nr];W[hn];B[hj];W[hi];B[hg];W[gj];B[gk]
+;W[ij];B[hk];W[ik];B[el];W[dk];B[ii];W[il];B[ih];W[ob];B[qb]
+;W[mc];B[cj];W[bm];B[kc];W[ld];B[lb];W[me];B[nf];W[mf];B[md]
+;W[ne];B[lc];W[od];B[nc];W[oc];B[mb];W[nb];B[mc];W[of];B[le]
+;W[lf];B[ke];W[kf];B[ck];W[cl];B[ml];W[if];B[hd];W[je];B[kd]
+;W[kh];B[hf];W[ji];B[kj];W[jh];B[lh];W[ig];B[hh];W[gi];B[ie]
+;W[jf];B[ei];W[bk];B[fj];W[gl];B[fl];W[gm];B[fh];W[gn];B[gh]
+;W[hl];B[ks];W[ls];B[js];W[kr];B[bj];W[qc];B[rc];W[qd];B[pc]
+;W[rd];B[rb];W[pe];B[pb];W[qf];B[re];W[aj];B[ai];W[ak];B[bh]
+;W[eb];B[cb];W[ic];B[hc];W[id];B[he];W[ib];B[hb];W[jb];B[io]
+;W[jo];B[ip];W[ma];B[in];W[im];B[hs];W[gs];B[jm];W[km];B[jl]
+;W[kl];B[jk];W[ll];B[es];W[la];B[ka];W[na];B[kb];W[pa];B[qa]
+;W[oe];B[fb];W[oa];B[mk];W[tt];B[ec];W[tt];B[ep];W[tt];B[fp]
+;W[go];B[mj];W[is];B[js];W[ks];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident121.sgf b/regression/games/incident121.sgf
new file mode 100644 (file)
index 0000000..7e9974e
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.11 ascii]HA[5]KM[0.5]GN[GNU Go 2.5.11 ascii Random Seed 938515167] 
+AB[jj]AB[pd]AB[dp]AB[dd]AB[pp]
+;W[fc];B[fd];W[gd];B[fe];W[eb];B[jq];W[cn];B[fq];W[bp];B[qj]
+;W[nd];B[cq];W[cf];B[pf];W[pc];B[qc];W[oc];B[qb];W[jc];B[mq]
+;W[di];B[ck];W[en];B[qm];W[cd];B[cc];W[de];B[dc];W[ej];B[bi]
+;W[bl];B[ch];W[dh];B[bk];W[bm];B[dg];W[ak];B[cg];W[ef];B[eg]
+;W[ff];B[ge];W[hd];B[aj];W[he];B[cj];W[bd];B[gf];W[fg];B[eh]
+;W[hf];B[gg];W[gi];B[fj];W[fh];B[fi];W[gh];B[hg];W[bf];B[al]
+;W[ii];B[bg];W[ig];B[ed];W[fm];B[db];W[bc];B[bb];W[ab];B[hk]
+;W[nq];B[np];W[qq];B[no];W[ro];B[gk];W[pq];B[ek];W[hm];B[ik]
+;W[jm];B[lq];W[qh];B[qf];W[oh];B[oq];W[or];B[nr];W[pr];B[oj]
+;W[mh];B[rn];W[qg];B[qo];W[rr];B[rp];W[rq];B[bq];W[bo];B[mj]
+;W[ho];B[nf];W[pb];B[lf];W[ld];B[lh];W[hq];B[li];W[gr];B[jo]
+;W[jn];B[kn];W[er];B[eq];W[dr];B[cp];W[kl];B[fr];W[fs];B[ir]
+;W[gq];B[mg];W[ml];B[nh];W[ol];B[ri];W[hh];B[cl];W[am];B[cr]
+;W[fo];B[ke];W[qa];B[ra];W[pa];B[sb];W[on];B[nn];W[nm];B[kk]
+;W[ep];B[dq];W[es];B[lo];W[ql];B[rl];W[qk];B[rk];W[pm];B[pk]
+;W[qp];B[pl];W[sp];B[po];W[fp];B[jl];W[km];B[lm];W[ll];B[ni]
+;W[do];B[mn];W[oe];B[of];W[me];B[od];W[qd];B[rc];W[pe];B[rd]
+;W[qe];B[rf];W[oo];B[op];W[je];B[jf];W[if];B[jd];W[kd];B[ie]
+;W[id];B[je];W[ip];B[re];W[jp];B[kp];W[el];B[lk];W[dk];B[fk]
+;W[dl];B[dj];W[ag];B[ah];W[af];B[cm];W[dm];B[ji];W[jh];B[kh]
+;W[jg];B[kg];W[nk];B[os];W[ps];B[ns];W[hs];B[is];W[io];B[mm]
+;W[iq];B[kr];W[le];B[kf];W[hr];B[df];W[ee];B[cb];W[hj];B[pn]
+;W[om];B[ok];W[nl];B[mf];W[hl];B[il];W[gl];B[im];W[ko];B[in]
+;W[jo];B[ij];W[hn];B[gj];W[hi];B[sn];W[ne];B[so];W[ss];B[rp]
+;W[sq];B[ln];W[nj];B[ro];W[fl];B[ak];W[mk];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident144.sgf b/regression/games/incident144.sgf
new file mode 100644 (file)
index 0000000..11c8314
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.13 ascii]HA[0]KM[0.5]GN[GNU Go 2.5.13 ascii Random Seed 938685709] 
+;B[qd];W[dq];B[cd];W[pp];B[do];W[fp];B[dp];W[ec];B[dc];W[ed]
+;B[de];W[dd];B[bc];W[id];B[ep];W[oc];B[od];W[nd];B[pc];W[kq]
+;B[pj];W[qh];B[pf];W[oh];B[nf];W[cj];B[cg];W[ob];B[pb];W[eq]
+;B[fo];W[gp];B[go];W[cm];B[cp];W[qm];B[ol];W[md];B[mh];W[mg]
+;B[nh];W[ng];B[og];W[pg];B[of];W[rf];B[qg];W[ph];B[qf];W[rg]
+;B[re];W[rj];B[sf];W[rh];B[me];W[lg];B[cf];W[hp];B[ke];W[lb]
+;B[ld];W[mc];B[kc];W[jc];B[oa];W[kb];B[jd];W[hd];B[nb];W[nc]
+;B[ne];W[lh];B[mi];W[li];B[mj];W[kk];B[lc];W[mb];B[na];W[cq]
+;B[bq];W[br];B[ap];W[db];B[cc];W[nq];B[cb];W[eb];B[ic];W[jb]
+;B[ib];W[hb];B[ia];W[ha];B[hc];W[gc];B[gb];W[fc];B[ga];W[je]
+;B[kd];W[kf];B[le];W[pa];B[qa];W[ja];B[ma];W[if];B[ml];W[fa]
+;B[ka];W[fb];B[la];W[qo];B[ff];W[in];B[qk];W[io];B[rl];W[ql]
+;B[pl];W[rk];B[qj];W[nn];B[sg];W[lm];B[qi];W[ri];B[pm];W[fj]
+;B[oi];W[kl];B[pi];W[gm];B[rm];W[rn];B[qn];W[se];B[sd];W[ro]
+;B[sk];W[pn];B[qm];W[bh];B[bg];W[ch];B[em];W[ar];B[bn];W[bo]
+;B[bp];W[cn];B[co];W[bm];B[ao];W[dl];B[an];W[am];B[dm];W[el]
+;B[fm];W[fl];B[gn];W[hm];B[dn];W[hi];B[eh];W[ih];B[lf];W[gg]
+;B[gd];W[ge];B[he];W[gf];B[ie];W[fe];B[jf];W[dg];B[kg];W[df]
+;B[dh];W[ee];B[ef];W[ce];B[be];W[eg];B[de];W[fg];B[hf];W[kh]
+;B[ig];W[hd];B[id];W[om];B[nm];W[on];B[da];W[lj];B[lk];W[hg]
+;B[jh];W[ji];B[jg];W[ag];B[af];W[ah];B[aq];W[di];B[mm];W[ce]
+;B[mn];W[bf];B[ln];W[ae];B[ad];W[ca];B[ba];W[ab];B[af];W[kn]
+;B[mo];W[no];B[ko];W[mp];B[jn];W[km];B[lp];W[jo];B[mq];W[np]
+;B[lq];W[lr];B[kp];W[jq];B[jp];W[ip];B[mr];W[ks];B[ls];W[ms]
+;B[nr];W[ls];B[ae];W[or];B[ns];W[jr];B[os];W[pr];B[ps];W[qr]
+;B[qs];W[rr];B[rs];W[sm];B[sl];W[sn];B[ll];W[sr];B[hn];W[ho]
+;B[hd];W[mf];B[fd];W[ss];B[lo];W[ea];B[ca];W[ac];B[bb];W[bd]
+;B[hb];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident153.sgf b/regression/games/incident153.sgf
new file mode 100644 (file)
index 0000000..efdf15f
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[9]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[1999-10-01]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fc];B[cf]
+;W[db];B[cc];W[hd];B[cb];W[qf];B[eb];W[ec];B[dc];W[nd];B[lc]
+;W[fq];B[cn];W[dr];B[nc];W[qn];B[nq];W[rp];B[md];W[ne];B[cq]
+;W[hp];B[qq];W[pl];B[rq];W[ro];B[cr];W[er];B[ic];W[hc];B[hb]
+;W[gb];B[ib];W[ir];B[qk];W[ql];B[rl];W[rm];B[rk];W[fb];B[da]
+;W[oc];B[nb];W[od];B[re];W[ob];B[rg];W[qc];B[oa];W[qd];B[qa]
+;W[pe];B[rf];W[rd];B[jn];W[hf];B[hn];W[io];B[rb];W[in];B[ih]
+;W[jo];B[kn];W[ko];B[jq];W[ch];B[lo];W[kp];B[dh];W[di];B[ci]
+;W[ei];B[bh];W[cj];B[dk];W[bi];B[dg];W[cl];B[bg];W[dl];B[ek]
+;W[ln];B[bm];W[ck];B[mo];W[bl];B[jr];W[hq];B[is];W[hs];B[js]
+;W[el];B[fk];W[hm];B[lm];W[mn];B[gn];W[im];B[nn];W[mm];B[nm]
+;W[ml];B[ll];W[km];B[en];W[nl];B[fl];W[fm];B[gm];W[em];B[fn]
+;W[gl];B[hl];W[gk];B[hk];W[gj];B[gh];W[lk];B[hj];W[fi];B[eh]
+;W[jm];B[fh];W[je];B[ke];W[of];B[ni];W[ie];B[oh];W[kf];B[le]
+;W[ee];B[qe];W[fe];B[de];W[qg];B[qh];W[lf];B[ef];W[mf];B[pg]
+;W[pf];B[mj];W[ff];B[lj];W[kl];B[lh];W[om];B[no];W[lp];B[lr]
+;W[cs];B[bs];W[ds];B[br];W[po];B[oo];W[jk];B[ik];W[sq];B[sr]
+;W[sp];B[rr];W[ep];B[eo];W[kh];B[ki];W[jh];B[ji];W[lg];B[mh]
+;W[ig];B[hh];W[fo];B[mp];W[on];B[ng];W[il];B[hi];W[go];B[ho]
+;W[dq];B[nf];W[do];B[dn];W[cp];B[bp];W[qp];B[co];W[dp];B[ip]
+;W[lq];B[mq];W[kq];B[gs];W[kr];B[hr];W[op];B[pq];W[ks];B[gq]
+;W[gp];B[gr];W[iq];B[fp];W[mr];B[nr];W[ls];B[me];W[ns];B[os]
+;W[ms];B[or];W[fg];B[ok];W[ah];B[ol];W[sl];B[sk];W[sm];B[ag]
+;W[ai];B[al];W[ak];B[am];W[cm];B[bn];W[gg];B[pk];W[pm];B[fa]
+;W[nk];B[nj];W[pb];B[pa];W[ed];B[ga];W[se];B[rc];W[sc];B[sb]
+;W[sd];B[og];W[pc];B[hg];W[jg];B[gi];W[fj];B[cg];W[sf];B[rh]
+;W[eg];B[sg];W[kk];B[df];W[qb];B[ra];W[kj];B[ci];W[ej];B[bj]
+;W[ch];B[dm];W[aj];B[ci];W[bk];B[ch];W[mg];B[mk];W[id];B[tt]
+;W[tt]
+)
diff --git a/regression/games/incident156.sgf b/regression/games/incident156.sgf
new file mode 100644 (file)
index 0000000..442d172
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.15 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.15 ascii Random Seed 938992013] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[np];B[pn];W[fq];B[fp];W[gp];B[eq];W[fo];B[ep];W[jo];B[nq]
+;W[mq];B[oq];W[hq];B[gc];W[oc];B[pc];W[od];B[ob];W[nb];B[pb]
+;W[oe];B[nc];W[mc];B[nd];W[me];B[mb];W[md];B[na];W[ne];B[cg]
+;W[pe];B[iq];W[hp];B[mp];W[lp];B[mo];W[lq];B[nn];W[pi];B[ko]
+;W[kp];B[lo];W[ip];B[jn];W[jq];B[fr];W[oj];B[gq];W[pk];B[qj]
+;W[qk];B[qi];W[ph];B[rg];W[qh];B[rh];W[rk];B[si];W[rj];B[ri]
+;W[re];B[sj];W[sk];B[hr];W[ir];B[dm];W[eo];B[do];W[em];B[nb]
+;W[qd];B[kc];W[dn];B[cn];W[cc];B[en];W[cd];B[fn];W[dc];B[el]
+;W[ed];B[de];W[ee];B[df];W[ef];B[fm];W[dg];B[bf];W[ce];B[cf]
+;W[eh];B[dh];W[eg];B[di];W[qn];B[qm];W[rm];B[pm];W[rn];B[go]
+;W[qp];B[qq];W[rp];B[rq];W[ke];B[sp];W[ki];B[if];W[je];B[ie]
+;W[ji];B[id];W[in];B[jm];W[kj];B[im];W[ij];B[jk];W[hn];B[ii]
+;W[hm];B[hj];W[kk];B[ik];W[ol];B[hl];W[ih];B[hh];W[jg];B[qg]
+;W[pg];B[qf];W[qe];B[ll];W[lk];B[kl];W[ml];B[hs];W[is];B[rb]
+;W[qc];B[qb];W[kd];B[rc];W[fc];B[gd];W[gb];B[hb];W[fb];B[be]
+;W[bd];B[fk];W[fi];B[gf];W[nr];B[or];W[ms];B[mm];W[nl];B[lc]
+;W[jf];B[ql];W[rl];B[ej];W[so];B[sq];W[os];B[pr];W[hg];B[gh]
+;W[gi];B[ig];W[jh];B[hi];W[gj];B[gk];W[bi];B[bl];W[ch];B[bj]
+;W[bg];B[bh];W[ah];B[ci];W[bh];B[af];W[ad];B[ck];W[ae];B[gm]
+;W[gn];B[ps];W[ns];B[rd];W[sd];B[om];W[pl];B[ga];W[fa];B[ha]
+;W[hc];B[ib];W[fd];B[fe];W[ff];B[gg];W[ho];B[ge];W[sc];B[fo]
+;W[sb];B[ra];W[po];B[no];W[oo];B[op];W[qo];B[ld];W[le];B[aj]
+;W[nm];B[on];W[ei];B[fj];W[se];B[fh];W[sa];B[ai];W[ag];B[fg]
+;W[lb];B[tt];W[jc];B[ic];W[jb];B[pa];W[la];B[ja];W[kb];B[ma]
+;W[ka];B[ia];W[cq];B[dr];W[cr];B[cs];W[bs];B[ds];W[br];B[cp]
+;W[bp];B[bo];W[aq];B[ao];W[ap];B[dq];W[lm];B[mn];W[km];B[jl]
+;W[tt];B[tt]
+)
diff --git a/regression/games/incident161.sgf b/regression/games/incident161.sgf
new file mode 100644 (file)
index 0000000..0bf0674
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.5.15 ascii]HA[2]KM[0.5]GN[GNU Go 2.5.15 ascii Random Seed 939030968] 
+AB[gc]AB[cg]
+;W[ee];B[dd];W[gg];B[ce];W[eg];B[ec];W[gd];B[fd];W[hd];B[hc]
+;W[fe];B[id];W[he];B[dh];W[ed];B[fc];W[de];B[be];W[eh];B[ei]
+;W[fi];B[di];W[dg];B[bh];W[gh];B[ie];W[if];B[ic];W[hf];B[df]
+;W[ef];B[cf];W[dc];B[cd];W[db];B[eb];W[bb];B[da];W[bc];B[tt]
+;W[ca];B[ea];W[cc];B[gb];W[bd];B[ad];W[ac];B[ae];W[ha];B[tt]
+;W[ga];B[fa];W[ib];B[tt];W[bi];B[ai];W[ah];B[ch];W[ag];B[ci]
+;W[bf];B[ai];W[tt];B[tt]
+)
diff --git a/regression/games/incident165.sgf b/regression/games/incident165.sgf
new file mode 100644 (file)
index 0000000..2987aa9
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.16 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.16 ascii Random Seed 939131427] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[qf];B[nd];W[rd];B[gc];W[dg];B[gq];W[qn];B[np];W[qk];B[qj]
+;W[rk];B[qc];W[ri];B[dm];W[qq];B[pq];W[qp];B[rj];W[sj];B[ch]
+;W[cg];B[dh];W[de];B[eh];W[cd];B[rc];W[ph];B[re];W[rf];B[qd]
+;W[ld];B[nf];W[nh];B[kc];W[lf];B[mg];W[jf];B[lc];W[md];B[mc]
+;W[ne];B[oe];W[mf];B[me];W[ng];B[le];W[kf];B[lg];W[kh];B[li]
+;W[lh];B[kj];W[nj];B[pk];W[nn];B[lp];W[po];B[nk];W[mj];B[mk]
+;W[lk];B[lj];W[ll];B[km];W[mm];B[eg];W[dc];B[ed];W[ee];B[ec]
+;W[cb];B[fe];W[eb];B[fb];W[fd];B[fc];W[ff];B[gd];W[ge];B[he]
+;W[gf];B[ig];W[hf];B[if];W[ie];B[je];W[hd];B[ic];W[ih];B[hg]
+;W[fh];B[fg];W[gg];B[jg];W[kg];B[jh];W[hh];B[ji];W[il];B[jl]
+;W[ik];B[kl];W[in];B[ko];W[kn];B[jn];W[ln];B[fi];W[gh];B[bg]
+;W[ce];B[oo];W[on];B[ea];W[db];B[bf];W[be];B[fn];W[io];B[jo]
+;W[im];B[jm];W[hq];B[iq];W[hr];B[hp];W[ip];B[ir];W[gp];B[fp]
+;W[go];B[gr];W[ho];B[hs];W[hp];B[co];W[oq];B[op];W[nq];B[pr]
+;W[fo];B[mq];W[fq];B[ep];W[mr];B[kq];W[jr];B[lr];W[jq];B[fr]
+;W[is];B[gs];W[eq];B[er];W[dq];B[cq];W[en];B[fm];W[em];B[eo]
+;W[el];B[fl];W[fk];B[dn];W[ek];B[gk];W[gj];B[gl];W[fj];B[ej]
+;W[cl];B[dl];W[dk];B[cj];W[ck];B[qr];W[rr];B[rs];W[sq];B[cm]
+;W[bi];B[bj];W[bk];B[ai];W[ah];B[bh];W[aj];B[pf];W[pg];B[sf]
+;W[sg];B[se];W[rh];B[bm];W[mi];B[hc];W[ij];B[qe];W[lo];B[kr]
+;W[ii];B[ke];W[mh];B[ks];W[js];B[da];W[ca];B[fa];W[lm];B[no]
+;W[mo];B[jk];W[mp];B[nr];W[lq];B[or];W[mq];B[qs];W[al];B[am]
+)
diff --git a/regression/games/incident169.sgf b/regression/games/incident169.sgf
new file mode 100644 (file)
index 0000000..94da052
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.12 ascii]HA[0]KM[0.5]GN[GNU Go 2.5.12 ascii Random Seed 939141141] 
+;B[qp];W[pd];B[dq];W[cc];B[qk];W[co];B[bp];W[jc];B[bo];W[cn]
+;B[bn];W[kq];B[bm];W[dh];B[do];W[oq];B[cp];W[dn];B[qf];W[pf]
+;B[qe];W[pe];B[gp];W[po];B[qo];W[pn];B[qn];W[op];B[gn];W[dd]
+;B[em];W[en];B[cm];W[dm];B[dl];W[fm];B[fn];W[eo];B[el];W[ep]
+;B[dp];W[eq];B[fr];W[fl];B[er];W[fk];B[ip];W[gc];B[qc];W[pc]
+;B[qd];W[md];B[qr];W[ir];B[fq];W[hq];B[hp];W[ko];B[cf];W[pr]
+;B[ef];W[cg];B[df];W[hh];B[eh];W[ei];B[fh];W[di];B[fi];W[ej]
+;B[bg];W[bh];B[bf];W[il];B[gf];W[ck];B[if];W[pi];B[ok];W[qj]
+;B[pk];W[bl];B[rj];W[ri];B[rk];W[lf];B[ih];W[ii];B[hg];W[hi]
+;B[oi];W[oh];B[ni];W[og];B[hd];W[hc];B[ke];W[id];B[lh];W[he]
+;B[kf];W[me];B[gd];W[ge];B[fd];W[fe];B[ee];W[ed];B[kc];W[kb]
+;B[lc];W[kg];B[lg];W[jh];B[ji];W[ig];B[hf];W[ki];B[kh];W[jg]
+;B[ie];W[fc];B[jj];W[kj];B[ij];W[hj];B[jk];W[kk];B[jl];W[kl]
+;B[jm];W[ik];B[km];W[lm];B[ln];W[kn];B[mc];W[im];B[in];W[jn]
+;B[pb];W[ob];B[nc];W[qb];B[nd];W[qh];B[ne];W[mf];B[rb];W[mh]
+;B[mi];W[li];B[nf];W[ng];B[qa];W[oc];B[lb];W[jb];B[nb];W[oa]
+;B[mk];W[mn];B[al];W[ak];B[bd];W[ma];B[la];W[na];B[ka];W[bc]
+;B[ja];W[am];B[jd];W[rg];B[ib];W[ic];B[ac];W[ab];B[ad];W[ba]
+;B[fj];W[jf];B[je];W[hb];B[gj];W[gk];B[hn];W[ia];B[nm];W[qg]
+;B[pm];W[rf];B[ps];W[pa];B[nn];W[os];B[lo];W[mo];B[lp];W[kp]
+;B[no];W[np];B[mp];W[mm];B[mr];W[mq];B[lr];W[lq];B[kr];W[qs]
+;B[jq];W[jr];B[rr];W[ci];B[sj];W[cl];B[fo];W[nr];B[iq];W[hr]
+;B[rs];W[re];B[hm];W[rc];B[rd];W[qb];B[sc];W[ra];B[ps];W[ks]
+;B[an];W[qs];B[pj];W[ps];B[ce];W[ms];B[ah];W[ai];B[ff];W[ag]
+;B[af];W[ls];B[hl];W[al];B[dk];W[qi];B[dg];W[mg];B[hk];W[ch]
+;B[ah];W[sb];B[ag];W[gh];B[ml];W[on];B[bj];W[cj];B[gg];W[gr]
+;B[lj];W[fs];B[es];W[gs];B[si];W[sh];B[sa];W[sd];B[qa];W[rc]
+;B[om];W[ld];B[kd];W[lk];B[oo];W[pp];B[qq];W[mj];B[nj];W[lj]
+;B[jo];W[jp];B[io];W[le];B[pq];W[gm];B[ll];W[mb];B[of];W[nh]
+;B[oe];W[cd];B[od];W[de];B[gq];W[gi];B[tt];W[ek];B[fp];W[aj]
+;B[dj];W[bi];B[tt];W[bk];B[bs];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident185.sgf b/regression/games/incident185.sgf
new file mode 100644 (file)
index 0000000..45c2a0b
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.17 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.17 ascii Random Seed 939286428] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[fc];B[cf];W[db];B[cc];W[fq];B[cn];W[np];B[pn];W[qf];B[nc]
+;W[qi];B[qj];W[pi];B[nq];W[mq];B[mp];W[oq];B[nr];W[op];B[lq]
+;W[mo];B[mr];W[or];B[no];W[oo];B[nn];W[on];B[po];W[nm];B[mn]
+;W[mm];B[lo];W[pm];B[oj];W[ln];B[mo];W[qm];B[lm];W[nh];B[kn]
+;W[mj];B[mi];W[nj];B[ni];W[oi];B[mh];W[ng];B[kg];W[mg];B[lh]
+;W[lc];B[ld];W[kd];B[md];W[ke];B[je];W[jc];B[lf];W[kf];B[mf]
+;W[lg];B[jf];W[kh];B[jg];W[li];B[jh];W[ji];B[ii];W[ki];B[hi]
+;W[dr];B[cq];W[iq];B[jq];W[ip];B[io];W[ho];B[in];W[cr];B[hn]
+;W[go];B[qe];W[pf];B[ic];W[ib];B[hc];W[hb];B[fd];W[gc];B[gd]
+;W[qc];B[he];W[re];B[pc];W[qd];B[pe];W[pb];B[ob];W[qb];B[qr]
+;W[rp];B[pq];W[pr];B[qq];W[rn];B[cb];W[mb];B[eb];W[ec];B[ed]
+;W[fb];B[dc];W[ea];B[ir];W[fl];B[jk];W[dl];B[cl];W[dk];B[ck]
+;W[ej];B[di];W[ei];B[dh];W[en];B[dm];W[em];B[br];W[eh];B[dq]
+;W[eq];B[fg];W[eg];B[ff];W[gh];B[ef];W[dg];B[cg];W[hh];B[ih]
+;W[gi];B[ql];W[rl];B[rk];W[pl];B[qk];W[ri];B[ok];W[ll];B[kl]
+;W[lk];B[bs];W[dn];B[cm];W[oe];B[nf];W[of];B[fo];W[eo];B[ep]
+;W[fp];B[gn];W[fn];B[hl];W[hr];B[jr];W[hq];B[gk];W[fk];B[hs]
+;W[gs];B[is];W[fr];B[hg];W[gg];B[hf];W[cs];B[df];W[co];B[bo]
+;W[do];B[bq];W[gl];B[gj];W[fj];B[gf];W[fh];B[gm];W[ca];B[bb]
+;W[ba];B[le];W[nd];B[kc];W[mc];B[nb];W[kb];B[jb];W[ja];B[jc]
+;W[lb];B[na];W[oc];B[od];W[oc];B[ne];W[od];B[cp];W[kj];B[ns]
+;W[os];B[ab];W[kk];B[fm];W[jl];B[km];W[ka];B[ia];W[ha];B[aa]
+;W[da];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident186.sgf b/regression/games/incident186.sgf
new file mode 100644 (file)
index 0000000..e069a14
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[1999-10-07]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];B[eb];W[ea];B[ga];W[fb];B[ec];W[fc];
+B[dc];W[gb];B[cc];W[ed];B[cb];W[dd];B[ca];W[cd];B[fd];W[bc];B[gc];
+W[bb];B[hb];W[ba];B[gd];W[bd];B[hc];W[ha]
+)
diff --git a/regression/games/incident187.sgf b/regression/games/incident187.sgf
new file mode 100644 (file)
index 0000000..74e305f
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.18 ascii]HA[3]KM[0.5]GN[GNU Go 2.5.18 ascii Random Seed 939337022] 
+AB[pd]AB[dp]AB[dd]
+;W[qq];B[nq];W[qf];B[nd];W[rd];B[jd];W[cf];B[fd];W[cn];B[fp]
+;W[bd];B[cc];W[ci];B[co];W[dn];B[jp];W[qc];B[pj];W[no];B[lp]
+;W[of];B[qn];W[ef];B[gf];W[bc];B[bb];W[pc];B[oc];W[mc];B[ob]
+;W[nb];B[lb];W[oq];B[or];W[op];B[on];W[pr];B[pg];W[nr];B[mr]
+;W[os];B[pf];W[mq];B[lq];W[np];B[mp];W[nq];B[dk];W[bk];B[ei]
+;W[cl];B[em];W[rh];B[qg];W[rg];B[qe];W[re];B[ld];W[md];B[me]
+;W[qk];B[qj];W[rj];B[rk];W[rl];B[pk];W[sk];B[ql];W[rk];B[qm]
+;W[nn];B[ln];W[om];B[pn];W[nm];B[nk];W[pl];B[rp];W[rq];B[rm]
+;W[ml];B[kl];W[mk];B[nj];W[lj];B[jj];W[fg];B[gg];W[fh];B[fi]
+;W[gh];B[gi];W[hh];B[dh];W[ch];B[df];W[dg];B[de];W[cg];B[kh]
+;W[ji];B[ii];W[hi];B[jh];W[ki];B[hj];W[ih];B[ij];W[lh];B[lg]
+;W[kg];B[jg];W[kf];B[jf];W[ke];B[kd];W[je];B[ie];W[if];B[mh]
+;W[ig];B[lf];W[he];B[id];W[ge];B[ff];W[fe];B[ee];W[eg];B[gd]
+;W[en];B[fm];W[qh];B[ph];W[pb];B[oa];W[pa];B[rf];W[si];B[fn]
+;W[sf];B[qp];W[qf];B[oe];W[sp];B[so];W[sq];B[sm];W[bo];B[bp]
+;W[bn];B[pp];W[ap];B[bq];W[mi];B[nh];W[nf];B[le];W[qi];B[pi]
+;W[dl];B[el];W[ce];B[cd];W[lr];B[kr];W[ms];B[jq];W[oo];B[po]
+;W[rf];B[mj];W[dj];B[ej];W[ck];B[ek];W[ab];B[ca];W[kk];B[ni]
+;W[jk];B[il];W[jl];B[km];W[jm];B[im];W[kn];B[jn];W[ko];B[jo]
+;W[lm];B[lo];W[ll];B[kp];W[km];B[li];W[kh];B[ik];W[mi];B[aq]
+;W[ao];B[qd];W[li];B[ol];W[pm];B[ro];W[di];B[eh];W[mn];B[kq]
+;W[dm];B[do];W[ks];B[js];W[ls];B[eo];W[hd];B[hc];W[hf];B[fc]
+;W[kj];B[pq];W[nl];B[ok];W[mo];B[sl];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident189.sgf b/regression/games/incident189.sgf
new file mode 100644 (file)
index 0000000..d1d6db6
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.21 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.21 ascii Random Seed 939819379] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[nq];B[np];W[mp];B[mq];W[op];B[no];W[oq];B[lp];W[oo];B[mo]
+;W[pl];B[pq];W[po];B[gq];W[qi];B[qg];W[qj];B[qk];W[pk];B[ql]
+;W[qm];B[rk];W[rj];B[rm];W[sk];B[rl];W[qn];B[gc];W[ic];B[jc]
+;W[cf];B[ib];W[bd];B[cm];W[cc];B[dc];W[ef];B[mc];W[dl];B[cl]
+;W[dk];B[ck];W[bj];B[cj];W[ci];B[dm];W[nc];B[nd];W[oc];B[pc]
+;W[od];B[ne];W[oe];B[nf];W[pe];B[qe];W[pg];B[re];W[jh];B[pi]
+;W[qh];B[ph];W[rg];B[qf];W[og];B[oj];W[md];B[si];W[sj];B[rh]
+;W[rn];B[ld];W[me];B[mf];W[le];B[lf];W[ke];B[mb];W[lc];B[lb]
+;W[kd];B[ob];W[kb];B[pf];W[of];B[ng];W[kf];B[kc];W[nh];B[oh]
+;W[lg];B[nb];W[jn];B[mh];W[iq];B[jq];W[ip];B[io];W[jr];B[kr]
+;W[ir];B[jo];W[hq];B[in];W[gp];B[di];W[ch];B[bk];W[cq];B[cp]
+;W[dr];B[kn];W[jm];B[km];W[fj];B[nl];W[fl];B[ek];W[el];B[ej]
+;W[gm];B[fk];W[gk];B[gj];W[fi];B[hj];W[fq];B[fn];W[gn];B[dh]
+;W[dg];B[ie];W[bq];B[il];W[bo];B[bp];W[ap];B[do];W[bm];B[eo]
+;W[go];B[eh];W[gi];B[hg];W[gg];B[ff];W[fg];B[eg];W[fe];B[gf]
+;W[hf];B[ge];W[he];B[gd];W[hh];B[ig];W[ih];B[jg];W[kg];B[if]
+;W[ki];B[ee];W[df];B[lj];W[ik];B[hk];W[hl];B[gl];W[jb];B[id]
+;W[gk];B[im];W[ij];B[gl];W[hb];B[hm];W[hc];B[hd];W[ia];B[ka]
+;W[gb];B[fm];W[fc];B[fd];W[ec];B[ld];W[db];B[lc];W[lh];B[ii]
+;W[hi];B[jk];W[mi];B[ni];W[li];B[mj];W[ji];B[ij];W[fh];B[pr]
+;W[rq];B[nr];W[or];B[os];W[mr];B[ns];W[lr];B[kq];W[ks];B[qp]
+;W[rp];B[qo];W[ro];B[qs];W[rr];B[pn];W[on];B[om];W[pm];B[nn]
+;W[pn];B[sl];W[sm];B[sg];W[cd];B[bi];W[bh];B[aj];W[cn];B[ah]
+;W[bg];B[kj];W[ag];B[dn];W[dq];B[ok];W[fo];B[rf];W[ep];B[ho]
+;W[ri];B[ai];W[sh];B[rg];W[co];B[si];W[al];B[sh];W[ak];B[bj]
+;W[bl];B[an];W[ao];B[de];W[hp];B[mg];W[ce];B[ol];W[ls];B[ps]
+;W[lq];B[mp];W[ja];B[js];W[is];B[la];W[ed];B[fe];W[ei];B[jf]
+;W[je];B[hn];W[tt];B[tt]
+)
diff --git a/regression/games/incident198.sgf b/regression/games/incident198.sgf
new file mode 100644 (file)
index 0000000..948fb25
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.5.24 ascii]HA[2]KM[0.5]GN[GNU Go 2.5.24 ascii Random Seed 940426924] 
+AB[gc]AB[cg]
+;W[gg];B[dc];W[ce];B[be];W[bd];B[bf];W[cc];B[dd];W[cd];B[ge]
+;W[eg];B[df];W[de];B[ef];W[ee];B[ff];W[fg];B[db];W[cb];B[dh]
+;W[dg];B[hf];W[cf];B[ch];W[eh];B[hh];W[ah];B[bg];W[bh];B[ii]
+;W[ae];B[ag];W[di];B[hg];W[ci];B[gh];W[fd];B[fc];W[gd];B[gf]
+;W[hd];B[hc];W[ic];B[ib];W[id];B[hb];W[if];B[ig];W[gi];B[fi]
+;W[af];B[ie];W[fh];B[hi];W[he];B[if];W[eb];B[ec];W[da];B[fa]
+;W[ea];B[fb];W[ca];B[ed];W[fe];B[tt];W[ha];B[ga];W[tt];B[tt]
+)
diff --git a/regression/games/incident199.sgf b/regression/games/incident199.sgf
new file mode 100644 (file)
index 0000000..f067234
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.5.27 ascii]HA[2]KM[0.5]GN[GNU Go 2.5.27 ascii Random Seed 940788194] 
+AB[gc]AB[cg]
+;W[dd];B[gf];W[eg];B[ef];W[df];B[dg];W[ff];B[ee];W[gg];B[de]
+;W[ed];B[fe];W[fg];B[ge];W[hf];B[eb];W[cb];B[cd];W[cc];B[dc]
+;W[ce];B[bd];W[be];B[ad];W[bc];B[fd];W[db];B[ec];W[ac];B[he]
+;W[ig];B[dh];W[eh];B[ei];W[fi];B[di];W[ie];B[hd];W[id];B[ic]
+;W[if];B[gh];W[hh];B[gi];W[hi];B[ea];W[ba];B[da];W[ab];B[ca]
+;W[bg];B[cf];W[bf];B[bh];W[bi];B[ae];W[ah];B[ch];W[ag];B[tt]
+;W[hb];B[hc];W[dd];B[ed];W[ai];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident2.sgf b/regression/games/incident2.sgf
new file mode 100644 (file)
index 0000000..7c2287b
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.1.23gf gmp]HA[0]KM[5.5]GN[GNU Go 2.1.23gf gmp Random Seed 926507198] 
+;B[cp];W[dd];B[op];W[qc];B[eq];W[qp];B[pq];W[qq];B[pd];W[pc]
+;B[pe];W[re];B[pg];W[pr];B[or];W[qr];B[pp];W[qo];B[pl];W[jq]
+;B[kr];W[qi];B[pj];W[ck];B[cl];W[dl];B[kd];W[dk];B[gc];W[ec]
+;B[fb];W[cm];B[bl];W[bm];B[dm];W[mc];B[nc];W[nb];B[nd];W[mb]
+;B[oc];W[ob];B[kb];W[eb];B[fd];W[fc];B[ga];W[gd];B[hd];W[ge]
+;B[ea];W[hc];B[gb];W[hb];B[cc];W[fe];B[db];W[ha];B[ce];W[cd]
+;B[bd];W[de];B[bf];W[jr];B[bb];W[qj];B[pk];W[rg];B[lg];W[dh]
+;B[df];W[ef];B[ca];W[dg];B[cf];W[gq];B[fr];W[gr];B[gp];W[fq]
+;B[er];W[fp];B[eo];W[ep];B[dp];W[fo];B[en];W[ho];B[cn];W[bk]
+;B[al];W[ak];B[lj];W[if];B[kp];W[id];B[jc];W[kq];B[lr];W[lq]
+;B[mq];W[lp];B[mp];W[ko];B[lo];W[mo];B[no];W[ln];B[nn];W[ml]
+;B[nl];W[rl];B[qm];W[rn];B[qn];W[rm];B[po];W[os];B[ns];W[ps]
+;B[nr];W[bn];B[bo];W[pi];B[oi];W[oh];B[og];W[ph];B[hj];W[oj]
+;B[ni];W[nh];B[mi];W[mh];B[lh];W[bh];B[mg];W[ng];B[md];W[qg]
+;B[qf];W[gl];B[of];W[gn];B[fm];W[gm];B[fl];W[nf];B[ne];W[mf]
+;B[lf];W[me];B[le];W[jl];B[lc];W[gh];B[hg];W[gg];B[ig];W[hf]
+;B[hh];W[gi];B[hi];W[km];B[gj];W[ip];B[fk];W[ej];B[fj];W[fi]
+;B[ei];W[im];B[ek];W[di];B[dj];W[cj];B[ej];W[eh];B[jf];W[rf]
+;B[qk];W[rk];B[ro];W[lb];B[ib];W[bg];B[ag];W[ia];B[ja];W[fa]
+;B[ic];W[ah];B[af];W[mk];B[jj];W[nj];B[mj];W[nk];B[jd];W[nq]
+;B[oq];W[he];B[mr];W[an];B[ao];W[am];B[je];W[mm];B[nm];W[fs]
+;B[es];W[dq];B[dr];W[cr];B[cq];W[br];B[bq];W[bs];B[ar];W[gs]
+;B[ap];W[la];B[ka];W[ks];B[ls];W[js];B[lk];W[rp];B[so];W[qd]
+;B[qe];W[jk];B[kk];W[ie];B[ij];W[mn];B[ok];W[cg];B[ik];W[ll]
+;B[hl];W[hm];B[gk];W[ql];B[pm];W[dc];B[fn];W[da];B[cb];W[il]
+;B[hk];W[el];B[em];W[kl];B[jg];W[ea];B[ci];W[bl]
+)
diff --git a/regression/games/incident201.sgf b/regression/games/incident201.sgf
new file mode 100644 (file)
index 0000000..efbfd84
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.28 gmp]HA[9]KM[0.5]GN[GNU Go 2.5.28 gmp Random Seed 941017801] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+LB[cc:70][fc:72][nc:72][qc:70][fd:71][gd:71][hd:20][ld:20][md:71][nd:71][cf:72][df:71][jf:20][pf:71][qf:72][dg:71][pg:71][dh:20][jh:20][ph:20][fj:20][hj:20][lj:20][nj:20][dl:20][jl:20][pl:20][dm:71][pm:71][cn:72][dn:71][jn:20][pn:71][qn:72][fp:71][gp:71][hp:20][lp:20][mp:71][np:71][cq:70][fq:72][nq:72][qq:70]
+C[Value of move: 83]
+;W[cf];B[fd];W[bd];B[cc];W[dh];B[bc];W[ce];B[ad];W[ae];B[ac]
+;W[fq];B[dn];W[ci];B[hq];W[fo];B[gr];W[qn];B[np];W[rp];B[qq]
+;W[pl];B[rq];W[qo];B[sp];W[so];B[sq];W[qk];B[er];W[nc];B[nd]
+;W[md];B[od];W[nb];B[fm];W[qc];B[le];W[pc];B[me];W[ld];B[ff]
+;W[fr];B[fs];W[go];B[io];W[ke];B[kd];W[eq];B[kf];W[dq];B[nn]
+;W[dr];B[es];W[ds];B[gs];W[gq];B[hr];W[ph];B[je];W[qd];B[qi]
+;W[qh];B[ri];W[ne];B[rg];W[rh];B[sh];W[nh];B[rk];W[rl];B[rj]
+;W[cp];B[do];W[hm];B[pf];W[nf];B[qe];W[hk];B[rd];W[ho];B[hp]
+;W[oi];B[fj];W[oj];B[fh];W[ok];B[pk];W[ol];B[jl];W[hi];B[hl]
+;W[gl];B[il];W[gk];B[fl];W[gm];B[im];W[fk];B[ek];W[rc];B[re]
+;W[cj];B[ck];W[bk];B[cl];W[bl];B[bm];W[fn];B[hn];W[lk];B[ei]
+;W[mk];B[jh];W[hg];B[hh];W[lm];B[gg];W[lo];B[hf];W[lq];B[mr]
+;W[mo];B[no];W[lr];B[gi];W[hj];B[ii];W[jr];B[ik];W[lb];B[ng]
+;W[oe];B[pe];W[og];B[mg];W[of];B[kn];W[ln];B[ki];W[jb];B[kc]
+;W[hc];B[kb];W[hb];B[ja];W[ia];B[ka];W[ec];B[ed];W[fc];B[lc]
+;W[mc];B[db];W[eb];B[mh];W[dc];B[cb];W[cd];B[ls];W[ks];B[ms]
+;W[mq];B[nr];W[nq];B[or];W[oq];B[pr];W[ba];B[op];W[ca];B[da]
+;W[bb];B[ab];W[ea];B[aa];W[ba];B[ij];W[gd];B[ge];W[oc];B[gj]
+;W[gn];B[in];W[jc];B[ic];W[ib];B[id];W[mi];B[pq];W[eg];B[ef]
+;W[om];B[fg];W[ko];B[jn];W[co];B[bo];W[bp];B[bn];W[on];B[kp]
+;W[km];B[lp];W[mp];B[df];W[hd];B[he];W[li];B[lh];W[kj];B[kk]
+;W[mf];B[lf];W[la];B[lj];W[mj];B[ep];W[kj];B[fp];W[gp];B[kq]
+;W[kr];B[kl];W[nm];B[po];W[lj];B[al];W[bj];B[ap];W[aq];B[ao]
+;W[bq];B[ak];W[am];B[an];W[dg];B[sl];W[sm];B[rm];W[ql];B[sn]
+;W[ro];B[pn];W[qm];B[sm];W[sk];B[sj];W[ll];B[sc];W[sb];B[sd]
+;W[sf];B[rb];W[qb];B[sa];W[rn];B[aj];W[ai];B[am];W[cn];B[cm]
+;W[mn];B[de];W[af];B[ra];W[ir];B[iq];W[di];B[dm];W[is];B[qa]
+;W[mb];B[pb];W[qg];B[rf];W[jm];B[pi];W[eo];B[em];W[jq];B[pg]
+;W[oh];B[jo];W[qp];B[pm];W[hs];B[ip];W[qf];B[na];W[oa];B[sb]
+;W[oo];B[en];W[cq];B[eh];W[br];B[qj];W[sk];B[sl];W[sm];B[tt]
+;W[sk];B[sg];W[si];B[pa];W[ma];B[tt];W[tt]
+)
diff --git a/regression/games/incident209.sgf b/regression/games/incident209.sgf
new file mode 100644 (file)
index 0000000..a1eea5c
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.40 gmp]HA[9]KM[0.5]GN[GNU Go 2.5.40 gmp Random Seed 943388032] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[nq];B[np];W[mp];B[op];W[hp];B[mn];W[hr];B[mq];W[hn];B[nr]
+;W[lq];B[oq];W[lp];B[lr];W[kr];B[ks];W[kq];B[is];W[hq];B[jr]
+;W[jq];B[jo];W[jf];B[ih];W[hf];B[hd];W[kg];B[if];W[jh];B[ji]
+;W[ki];B[hg];W[ie];B[ig];W[he];B[je];W[kf];B[il];W[qf];B[pf]
+;W[pg];B[of];W[qe];B[qg];W[qh];B[rg];W[rh];B[sg];W[sh];B[ph]
+;W[og];B[ng];W[oh];B[pi];W[nh];B[rj];W[nd];B[nf];W[lh];B[pe]
+;W[nj];B[lc];W[pl];B[nc];W[rl];B[md];W[gm];B[ok];W[hl];B[hk]
+;W[gk];B[hj];W[im];B[jl];W[jn];B[io];W[se];B[in];W[jm];B[ko]
+;W[fe];B[km];W[df];B[kn];W[bf];B[hm];W[im];B[jm];W[fc];B[gd]
+;W[gf];B[fd];W[hb];B[ec];W[id];B[ee];W[ef];B[ce];W[dg];B[be]
+;W[dl];B[bg];W[ek];B[cf];W[dn];B[co];W[fp];B[ck];W[ch];B[bi]
+;W[bh];B[ah];W[bm];B[eb];W[fi];B[gb];W[gg];B[ib];W[qo];B[qk]
+;W[ql];B[ml];W[nk];B[nl];W[ol];B[qc];W[qp];B[qr];W[jc];B[kd]
+;W[hc];B[gc];W[jb];B[ha];W[lb];B[mb];W[rq];B[kb];W[rr];B[pr]
+;W[hs];B[js];W[gi];B[ic];W[on];B[hi];W[mo];B[gh];W[fh];B[no]
+;W[lk];B[nn];W[ll];B[lm];W[bk];B[bj];W[bl];B[om];W[ap];B[pn]
+;W[qn];B[cq];W[pm];B[oo];W[an];B[fb];W[mg];B[eq];W[es];B[bo]
+;W[br];B[bq];W[dr];B[ao];W[bs];B[cr];W[cs];B[fr];W[fs];B[eo]
+;W[ho];B[mf];W[lf];B[le];W[ci];B[cj];W[hm];B[dq];W[sc];B[rd]
+;W[re];B[sd];W[cl];B[do];W[kj];B[de];W[jk];B[ik];W[mk];B[kk]
+;W[ej];B[pk];W[di];B[qd];W[gj];B[cn];W[lo];B[en];W[dm];B[em]
+;W[qq];B[fl];W[fm];B[el];W[gl];B[fo];W[rs];B[go];W[fq];B[er]
+;W[ds];B[qs];W[ak];B[ai];W[dk];B[gr];W[gs];B[aq];W[bp];B[ir]
+;W[ip];B[oi];W[ni];B[ar];W[rk];B[sk];W[sl];B[sj];W[ln];B[kp]
+;W[iq];B[ls];W[ge];B[fk];W[jg];B[gq];W[gp];B[bn];W[am];B[hh]
+;W[po];B[on];W[kl];B[jk];W[aj];B[ag];W[ke];B[cg];W[oj];B[qi]
+;W[pq];B[fn];W[fj];B[tt];W[cm];B[tt];W[as];B[tt];W[tt]
+)
diff --git a/regression/games/incident211.sgf b/regression/games/incident211.sgf
new file mode 100644 (file)
index 0000000..91e9a47
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.5.42 ascii]HA[2]KM[0.5]GN[GNU Go 2.5.42 ascii Random Seed 943529824] 
+AB[gc]AB[cg]
+;W[ee];B[gf];W[ce];B[eg];W[ec];B[be];W[bd];B[fb];W[eb];B[bf]
+;W[ff];B[fg];W[ge];B[he];W[hf];B[gd];W[gg];B[ea];W[da];B[fa]
+;W[cb];B[hd];W[gh];B[fh];W[ie];B[gi];W[hb];B[hh];W[hg];B[hi]
+;W[ih];B[ig];W[if];B[hc];W[id];B[ha];W[ib];B[ic];W[gb];B[ga]
+;W[df];B[dg];W[ae];B[ia];W[hb];B[af];W[ad];B[ef];W[de];B[fe]
+;W[fd];B[ib];W[cf];B[gb];W[bg];B[fi];W[bh];B[ch];W[fe];B[ii]
+;W[tt];B[ig];W[gf];B[dh];W[ei];B[di];W[tt];B[tt]
+)
diff --git a/regression/games/incident218.sgf b/regression/games/incident218.sgf
new file mode 100644 (file)
index 0000000..7c0625e
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.5.45 ascii]HA[9]KM[0.5]GN[GNU Go 2.5.45 ascii Random Seed 944214019] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[ff];B[gq];W[nf];B[mq];W[qn];B[pn];W[qq];B[pq];W[qp];B[qm]
+;W[rn];B[cm];W[pm];B[ql];W[om];B[fc];W[cf];B[mc];W[nn];B[po]
+;W[nj];B[pg];W[qf];B[pf];W[qe];B[oi];W[rc];B[ln];W[ni];B[rm]
+;W[qr];B[pe];W[oc];B[pc];W[nc];B[ne];W[mb];B[qg];W[qb];B[pb]
+;W[lc];B[md];W[kb];B[mf];W[ng];B[bd];W[lh];B[kg];W[kh];B[jg]
+;W[jh];B[hj];W[fj];B[gk];W[fk];B[gl];W[fl];B[dh];W[eg];B[cl]
+;W[fh];B[hh];W[hd];B[ic];W[hc];B[fi];W[ei];B[gi];W[di];B[ci]
+;W[ej];B[bi];W[dg];B[cg];W[eh];B[ch];W[ib];B[bf];W[ce];B[cd]
+;W[ig];B[ke];W[ld];B[be];W[nd];B[me];W[oe];B[od];W[of];B[nb]
+;W[gb];B[df];W[fb];B[gm];W[fm];B[en];W[fn];B[gn];W[fo];B[go]
+;W[fq];B[fp];W[ep];B[gp];W[dq];B[eo];W[eq];B[do];W[cp];B[cq]
+;W[cr];B[bq];W[br];B[bp];W[fr];B[jo];W[lk];B[kl];W[rg];B[np]
+;W[ri];B[rj];W[qi];B[pi];W[qj];B[pk];W[nl];B[rk];W[mo];B[lo]
+;W[mp];B[gr];W[ar];B[es];W[dr];B[pr];W[fs];B[gs];W[qs];B[ps]
+;W[lq];B[lp];W[nq];B[mr];W[nr];B[no];W[mn];B[ms];W[ns];B[lr]
+;W[kq];B[kr];W[op];B[oo];W[lm];B[km];W[qo];B[jq];W[if];B[ih]
+;W[mg];B[mi];W[mj];B[ec];W[eb];B[gg];W[gf];B[cb];W[db];B[kk]
+;W[ee];B[de];W[dc];B[ef];W[cc];B[fg];W[dk];B[cj];W[co];B[bo]
+;W[fe];B[ck]
+)
diff --git a/regression/games/incident221.sgf b/regression/games/incident221.sgf
new file mode 100644 (file)
index 0000000..c611286
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[1999-12-29]
+SY[Cgoban 1.9.8]TM[-]
+RE[W+38.5]
+;B[ee];W[eg];B[gg];W[ff];B[cg];W[gf];B[cd];W[fc];B[ec];W[fb];B[fg];
+W[ef];B[hg];W[hf];B[dh];W[eh];B[eb];W[ea];B[da];W[fa];B[cb];W[cf];
+B[bf];W[df];B[be];W[fd];B[de];W[ed];B[fe];W[ge];B[dd];W[ce];B[dg];
+W[bd];B[bc];W[dc];B[ad];W[db];B[ca];W[cc];B[bb];W[bd];B[cd];W[di];
+B[ag];W[ch];B[bg];W[dd];B[ae];W[bd];B[bh];W[ci];B[bi];W[ei];B[cd];
+W[tt];B[bd];W[tt];B[tt];
+TW[ga][ha][ia][eb][gb][hb][ib][ec][gc][hc][ic][gd][hd][id][de][ee][fe][he][ie][if][fg][gg][hg][ig][fh][gh][hh][ih][fi][gi][hi][ii]
+
+TB[aa][ba][ab][ac][af][ah][ai]
+C[The game is over.  Final score:
+   White = 32 territory + 11 captures + 5.5 komi = 48.5
+   Black = 7 territory + 3 captures = 10
+White wins by 38.5.
+]
+)
diff --git a/regression/games/incident223.sgf b/regression/games/incident223.sgf
new file mode 100644 (file)
index 0000000..ae148ba
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.12 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.12 ascii Random Seed 946918580] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[qf];B[of];W[qc];B[pc];W[qd];B[pe];W[pb];B[ob];W[qn];B[on]
+;W[qq];B[pq];W[qp];B[po];W[pr];B[or];W[qr];B[qh];W[fd];B[df]
+;W[ff];B[dh];W[dn];B[fp];W[cp];B[cq];W[bp];B[os];W[ic];B[co]
+;W[do];B[bo];W[bq];B[cm];W[dq];B[ep];W[dm];B[cl];W[cr];B[fn]
+;W[cc];B[dc];W[db];B[ql];W[ec];B[jc];W[jb];B[kb];W[ib];B[id]
+;W[hd];B[ig];W[fl];B[hn];W[fi];B[mb];W[ce];B[cd];W[bd];B[de]
+;W[be];B[pa];W[qa];B[qb];W[rb];B[el];W[dl];B[dk];W[em];B[fj]
+;W[ek];B[ej];W[hl];B[jn];W[gj];B[gk];W[hk];B[fk];W[hi];B[gl]
+;W[kl];B[ih];W[ii];B[ji];W[kk];B[gh];W[gi];B[cn];W[gr];B[fr]
+;W[er];B[eq];W[fs];B[li];W[fq];B[cb];W[bb];B[ca];W[gp];B[go]
+;W[hp];B[bc];W[bi];B[ac];W[ck];B[ad];W[bk];B[ao];W[ho];B[ln]
+;W[gm];B[hm];W[im];B[el];W[in];B[gn];W[eo];B[fo];W[ek];B[fm]
+;W[fh];B[il];W[ik];B[jl];W[jk];B[jm];W[io];B[jo];W[pm];B[mm]
+;W[ol];B[mk];W[nj];B[ni];W[mj];B[lj];W[nk];B[oi];W[ml];B[mi]
+;W[lk];B[bg];W[cg];B[ch];W[bh];B[ag];W[nq];B[lp];W[oq];B[mr]
+;W[nr];B[ns];W[mq];B[lr];W[lq];B[no];W[kq];B[op];W[jq];B[pb]
+;W[nm];B[nn];W[om];B[rg];W[rf];B[sf];W[se];B[sg];W[qe];B[rm]
+;W[rn];B[sn];W[so];B[sm];W[qo];B[pl];W[qm];B[sl];W[lm];B[ra]
+;W[sc];B[rd];W[qg];B[ri];W[mn];B[ka];W[hf];B[if];W[hh];B[eb]
+;W[fb];B[da];W[hg];B[fa];W[ga];B[ea];W[gb];B[ij];W[hj];B[kj]
+;W[ie];B[je];W[he];B[eg];W[fg];B[ed];W[fc];B[ap];W[aq];B[el]
+;W[ja];B[bl];W[kc];B[lc];W[kd];B[ke];W[ld];B[md];W[le];B[kg]
+;W[me];B[ei];W[nd];B[mc];W[lb];B[la];W[sa];B[rc];W[qa];B[ne]
+;W[sd];B[ra];W[ma];B[sb];W[lb];B[na];W[nf];B[oe];W[mg];B[lf]
+;W[mf];B[la];W[kb];B[og];W[ph];B[lg];W[re];B[rb];W[rh];B[qi]
+;W[sh];B[sg];W[mh];B[rg];W[lh];B[si];W[jf];B[jg];W[kf];B[kh]
+;W[ef];B[nh];W[eh];B[cf];W[ok];B[pk];W[oj];B[ee];W[fe];B[ng]
+;W[ka];B[ma];W[dg];B[eg];W[dg];B[cg];W[eg];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident225.sgf b/regression/games/incident225.sgf
new file mode 100644 (file)
index 0000000..73f5b4e
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.13 gmp]HA[3]KM[0.5]GN[GNU Go 2.7.13 gmp Random Seed 946983019] 
+AB[pd]AB[dp]AB[dd]
+;W[qq];B[dj];W[fq];B[cn];W[dr];B[cq];W[iq];B[fo];W[fc];B[cf]
+;W[db];B[cc];W[ic];B[fe];W[nc];B[qf];W[pb];B[qc];W[ld];B[ql]
+;W[qh];B[qo];W[fm];B[dl];W[op];B[ho];W[ro];B[jo];W[kp];B[jp]
+;W[jq];B[rn];W[rp];B[qn];W[ne];B[on];W[ol];B[qj];W[oh];B[rh]
+;W[jm];B[ko];W[lp];B[lf];W[lh];B[jf];W[fj];B[dh];W[en];B[hf]
+;W[rg];B[ri];W[qg];B[qb];W[pc];B[mg];W[mh];B[of];W[ng];B[nf]
+;W[cr];B[ni];W[nh];B[pa];W[ob];B[cb];W[dc];B[mn];W[oi];B[nj]
+;W[oj];B[nk];W[ok];B[kk];W[lm];B[jh];W[ln];B[lo];W[mp];B[il]
+;W[mo];B[im];W[kg];B[ij];W[kf];B[ke];W[le];B[je];W[jg];B[jc]
+;W[jb];B[kc];W[ih];B[hi];W[ji];B[ed];W[fh];B[gk];W[hh];B[gm]
+;W[gi];B[mm];W[eg];B[ei];W[od];B[gg];W[gh];B[qe];W[li];B[md]
+;W[lc];B[kb];W[me];B[mf];W[ib];B[ll];W[id];B[gd];W[gc];B[da]
+;W[fb];B[hb];W[ea];B[sn];W[ca];B[br];W[pe];B[pf];W[qd];B[bs]
+;W[re];B[ka];W[rc];B[ff];W[mb];B[fk];W[bb];B[bc];W[ef];B[dg]
+;W[fd];B[ee];W[ge];B[sh];W[ie];B[if];W[nl];B[rf];W[sg];B[ml]
+;W[qi];B[pj];W[rj];B[ab];W[ba];B[dq];W[eq];B[ep];W[rk];B[pl]
+;W[rl];B[ec];W[jj];B[eb];W[da];B[jk];W[hj];B[hk];W[ii];B[ik]
+;W[ip];B[gj];W[fi];B[hi];W[jn];B[kn];W[io];B[km];W[in];B[jl]
+;W[hn];B[gn];W[em];B[hm];W[df];B[de];W[rm];B[sm];W[pm];B[oo]
+;W[qm];B[ej];W[pk];B[so];W[es];B[cs];W[ja];B[hj];W[he];B[fg]
+;W[eh];B[pp];W[oq];B[pn];W[pq];B[qp];W[rq];B[sp];W[no];B[om]
+;W[lj];B[lk];W[kj];B[sq];W[rr];B[sr];W[mj];B[rs];W[mk];B[qr]
+;W[pr];B[qs];W[ps];B[ss];W[sl];B[ds];W[er];B[hp];W[hq];B[gp]
+;W[gq];B[lb];W[fp];B[go];W[eo];B[ma];W[oa];B[na];W[ig];B[la]
+;W[nb];B[jd];W[hg];B[gf];W[nn];B[nm];W[kd];B[be];W[fa];B[ac]
+;W[aa];B[ga];W[hd];B[tt];W[gb];B[tt];W[tt]
+)
diff --git a/regression/games/incident231.sgf b/regression/games/incident231.sgf
new file mode 100644 (file)
index 0000000..d9a7657
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 ascii]HA[0]KM[5.5]GN[GNU Go 2.6 ascii Random Seed 950721716] 
+;B[qp];W[de];B[pd];W[ep];B[jd];W[cp];B[oq];W[dc];B[pj];W[qf]
+;B[qd];W[qi];B[qj];W[of];B[nd];W[oo];B[mp];W[kp];B[mo];W[hd]
+;B[ic];W[hc];B[hb];W[gb];B[jb];W[cj];B[nl];W[ll];B[nn];W[qn]
+;B[pm];W[po];B[qq];W[hq];B[dh];W[bh];B[fh];W[qm];B[ql];W[dm]
+;B[gi];W[gk];B[hg];W[pi];B[oi];W[mf];B[ld];W[cg];B[dg];W[ej]
+;B[kn];W[ij];B[ii];W[ji];B[ih];W[ie];B[je];W[oh];B[ni];W[rl]
+;B[rk];W[rm];B[pl];W[ha];B[ib];W[ro];B[rp];W[im];B[ko];W[ik]
+;B[io];W[re];B[rd];W[ho];B[jp];W[hn];B[jq];W[ir];B[jr];W[li]
+;B[if];W[jf];B[kf];W[jg];B[he];W[jh];B[gd];W[gc];B[fd];W[ge]
+;B[hf];W[fe];B[ed];W[ee];B[cd];W[dd];B[id];W[cc];B[ia];W[ga]
+;B[gf];W[kg];B[lf];W[lg];B[me];W[nf];B[ch];W[bg];B[cf];W[df]
+;B[bf];W[ci];B[eg];W[ce];B[ef];W[mj];B[lm];W[km];B[kl];W[jm]
+;B[lk];W[ml];B[mk];W[mm];B[ln];W[kk];B[nm];W[jl];B[mn];W[kl]
+;B[lj];W[nj];B[nk];W[mi];B[oj];W[kj];B[nh];W[ph];B[mg];W[sd]
+;B[sc];W[se];B[rb];W[js];B[ks];W[is];B[kr];W[ri];B[rj];W[ff]
+;B[fg];W[ng];B[mh];W[lh];B[dq];W[dp];B[cq];W[eq];B[bp];W[bo]
+;B[br];W[ap];B[bq];W[dr];B[er];W[fr];B[cr];W[es];B[aq];W[ao]
+;B[bd];W[be];B[bc];W[bb];B[fj];W[fk];B[di];W[dj];B[ei];W[hj]
+;B[hi];W[gj];B[si];W[sh];B[sj];W[rg];B[iq];W[hr];B[hp];W[gp]
+;B[ip];W[jn];B[jo];W[fi];B[gq];W[gr];B[fj];W[in];B[fi];W[ne]
+;B[oe];W[pe];B[od];W[qe];B[cs];W[ig];B[as];W[ds];B[ec];W[eb]
+;B[cb];W[ba];B[ca];W[ac];B[tt];W[ad];B[tt];W[tt]
+)
diff --git a/regression/games/incident234.sgf b/regression/games/incident234.sgf
new file mode 100644 (file)
index 0000000..6c8713a
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.59 ascii]HA[6]KM[5.5]GN[GNU Go 2.7.59 ascii Random Seed 954406956] 
+AB[dd]AB[pd]AB[dj]AB[pj]AB[dp]AB[pp]
+;W[nc];B[ne];W[md];B[kd];W[fq];B[fo];W[nq];B[no];W[jp];B[hp]
+;W[hq];B[iq];W[ip];B[ir];W[hr];B[kr];W[lq];B[kp];W[kq];B[jr]
+;W[mo];B[ko];W[ho];B[gp];W[fp];B[go];W[in];B[km];W[np];B[il]
+;W[jn];B[kn];W[gn];B[hm];W[hn];B[jq];W[er];B[oo];W[pb];B[cr]
+;W[cn];B[qd];W[ck];B[do];W[dn];B[em];W[en];B[gm];W[gq];B[fn]
+;W[eo];B[fm];W[lr];B[ep];W[cj];B[cf];W[bp];B[cq];W[bo];B[ec]
+;W[cc];B[bd];W[db];B[hc];W[cd];B[ce];W[bc];B[ae];W[eb];B[ek]
+;W[dl];B[fj];W[fc];B[fd];W[gb];B[ic];W[me];B[pf];W[ke];B[if]
+;W[je];B[id];W[lb];B[fe];W[ci];B[ie];W[kc];B[fg];W[dg];B[dh]
+;W[di];B[eh];W[eg];B[ch];W[bh];B[ii];W[ei];B[cg];W[el];B[fk]
+;W[fi];B[pr];W[qm];B[om];W[qk];B[qo];W[qj];B[rb];W[jd];B[bq]
+;W[ar];B[aq];W[cs];B[ds];W[dr];B[bs];W[es];B[dq];W[eq];B[oc]
+;W[ob];B[gi];W[qi];B[ok];W[qg];B[rf];W[rg];B[re];W[oh];B[jb]
+;W[kb];B[bg];W[li];B[lk];W[kj];B[lg];W[mh];B[bi];W[bj];B[ah]
+;W[fl];B[jf];W[gl];B[hj];W[dk];B[mn];W[hl];B[im];W[hk];B[mp]
+;W[ej];B[gj];W[mq];B[lp];W[or];B[ac];W[ik];B[bb];W[cb];B[fa]
+;W[ga];B[rn];W[ba];B[sk];W[rm];B[jk];W[kk];B[jj];W[ji];B[mg]
+;W[jl];B[jm];W[ij];B[ih];W[ab];B[sm];W[rj];B[mj];W[ng];B[nd]
+;W[sj];B[ad];W[sl];B[rl];W[rk];B[sl];W[ql];B[sn];W[pq];B[qr]
+;W[qq];B[rq];W[qn];B[ro];W[jh];B[kg];W[jg];B[kf];W[fh];B[gg]
+;W[gh];B[hh];W[ig];B[hg];W[op];B[qb];W[pc];B[od];W[qp];B[po]
+;W[rp];B[sp];W[oq];B[rs];W[mc];B[ka];W[la];B[ja];W[jc];B[ib]
+;W[qc];B[rc];W[pg];B[pa];W[na];B[pi];W[ph];B[of];W[is];B[jo]
+;W[js];B[io];W[ks];B[gc];W[fb];B[pn];W[lj];B[mk];W[kl];B[dc]
+;W[aj];B[ai];W[ll];B[qf];W[mm];B[ml];W[lm];B[nn];W[nm];B[nl]
+;W[ln];B[lo];W[oi];B[nj];W[oj];B[pk];W[oa];B[qa];W[kh];B[pl]
+;W[pm];B[sg];W[sh];B[sf];W[ri];B[os];W[ns];B[ps];W[ms];B[dm]
+;W[cm];B[hb];W[ha];B[mi];W[nf];B[mf];W[le];B[lh];W[nh];B[og]
+;W[af];B[be];W[gk];B[hi];W[gd];B[ni];W[ge];B[ef];W[de];B[ed]
+;W[ao];B[lf];W[ia];B[df];W[tt];B[tt]
+)
diff --git a/regression/games/incident235.sgf b/regression/games/incident235.sgf
new file mode 100644 (file)
index 0000000..95e520a
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.61 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.61 ascii Random Seed 954469658] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[nc];B[ne];W[pb];B[qd];W[ld];B[le];W[pf];B[md];W[mc];B[lc]
+;W[lb];B[kd];W[oe];B[od];W[nd];B[fq];W[hq];B[mp];W[np];B[lq]
+;W[nq];B[pm];W[po];B[co];W[cm];B[em];W[cq];B[bp];W[bq];B[dq]
+;W[dr];B[es];W[er];B[fr];W[bs];B[ar];W[aq];B[hp];W[ds];B[dm]
+;W[bj];B[cl];W[bl];B[bm];W[am];B[cn];W[ck];B[dk];W[ch];B[cf]
+;W[dg];B[ph];W[qf];B[ec];W[kc];B[ld];W[jb];B[hd];W[nf];B[me]
+;W[qo];B[oo];W[op];B[pq];W[no];B[or];W[nr];B[qp];W[rp];B[rq]
+;W[rn];B[qr];W[on];B[sp];W[ro];B[og];W[of];B[fg];W[fh];B[eh]
+;W[eg];B[ei];W[ff];B[gg];W[ee];B[ci];W[bi];B[bg];W[bh];B[gc]
+;W[hi];B[iq];W[gf];B[hf];W[hg];B[ol];W[gh];B[fs];W[cc];B[cd]
+;W[bd];B[be];W[bb];B[ad];W[ac];B[bc];W[sr];B[ab];W[sq];B[ps]
+;W[rr];B[hk];W[ln];B[hm];W[jn];B[rb];W[qb];B[rd];W[re];B[qc]
+;W[ra];B[rl];W[qm];B[ql];W[rh];B[mi];W[ng];B[ba];W[oh];B[pg]
+;W[ni];B[nj];W[pi];B[qi];W[oi];B[qh];W[rg];B[sf];W[rf];B[mh]
+;W[nh];B[se];W[oj];B[pk];W[nk];B[mj];W[ok];B[ri];W[om];B[nl]
+;W[mk];B[lf];W[ml];B[rj];W[nm];B[kk];W[he];B[if];W[gd];B[jh]
+;W[hc];B[id];W[fc];B[gb];W[fb];B[fd];W[ge];B[eb];W[ie];B[ib]
+;W[hb];B[fa];W[ic];B[gj];W[ia];B[qq];W[hn];B[gn];W[im];B[ho]
+;W[in];B[il];W[ki];B[kj];W[mg];B[lg];W[jf];B[ig];W[ji];B[ih]
+;W[ii];B[kh];W[lj];B[lh];W[je];B[hh];W[gi];B[gg];W[jc];B[li]
+;W[lk];B[df];W[ef];B[pn];W[pl];B[ol];W[rm];B[si];W[kl];B[jl]
+;W[km];B[mo];W[mn];B[sm];W[sn];B[sl];W[oc];B[io];W[ko];B[sh]
+;W[sg];B[sd];W[ks];B[hr];W[fj];B[fi];W[hj];B[gk];W[fg];B[ap]
+;W[br];B[kp];W[jr];B[jm];W[gm];B[ik];W[hl];B[fk];W[fn];B[go]
+;W[fm];B[fl];W[eq];B[ep];W[cp];B[ao];W[bn];B[ak];W[bk];B[cm]
+;W[an];B[bo];W[al];B[mq];W[ms];B[mr];W[ns];B[lr];W[ls];B[kr]
+;W[ir];B[lo];W[hs];B[gq];W[jg];B[jq];W[js];B[fo];W[en];B[eo]
+;W[dn];B[do];W[kg];B[ah];W[ke];B[de];W[mf];B[dh];W[cg];B[cj]
+;W[kf];B[ij];W[hg];B[ed];W[ha];B[ai];W[aj];B[ag];W[af];B[bf]
+;W[nl];B[pl];W[ga];B[jo];W[kn];B[fe];W[hm];B[qn];W[oo];B[qg]
+;W[rk];B[sk];W[cb];B[aa];W[ca];B[ac];W[tt];B[gl];W[tt];B[gs]
+;W[is];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident236.sgf b/regression/games/incident236.sgf
new file mode 100644 (file)
index 0000000..2f308d5
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.64 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.64 ascii Random Seed 954675302] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[oo];B[mp];W[oe];B[md];W[ee];B[gd];W[eo];B[gp];W[gm];B[eg]
+;W[mg];B[om];W[qq];B[qg];W[cc];B[dc];W[cd];B[de];W[ce];B[qn]
+;W[df];B[fd];W[ed];B[ec];W[ef];B[gk];W[op];B[pq];W[oq];B[nr]
+;W[po];B[qp];W[qo];B[cm];W[ep];B[pr];W[or];B[ro];W[rn];B[rp]
+;W[rm];B[qm];W[ql];B[pl];W[qk];B[dq];W[eq];B[qj];W[rj];B[si]
+;W[ri];B[sh];W[rh];B[rg];W[sj];B[sl];W[rl];B[sk];W[sg];B[sh]
+;W[pi];B[sf];W[ph];B[pe];W[od];B[kg];W[oc];B[do];W[en];B[gf]
+;W[dg];B[eh];W[os];B[rq];W[mq];B[nq];W[np];B[ch];W[lq];B[kr]
+;W[kq];B[jq];W[ir];B[jr];W[gr];B[lo];W[mn];B[nn];W[mo];B[lp]
+;W[mr];B[no];W[mm];B[oj];W[pm];B[pn];W[nm];B[pm];W[pk];B[ok]
+;W[lj];B[io];W[im];B[fm];W[fn];B[el];W[gn];B[mb];W[qc];B[pc]
+;W[pb];B[qd];W[rc];B[ki];W[pf];B[on];W[ol];B[hp];W[ik];B[jk]
+;W[jl];B[ij];W[dh];B[hk];W[ei];B[di];W[fg];B[fh];W[ff];B[gh]
+;W[gg];B[km];W[kl];B[il];W[jm];B[kn];W[jn];B[jo];W[er];B[ll]
+;W[lk];B[lm];W[kk];B[dr];W[hh];B[fi];W[hf];B[he];W[ie];B[jc]
+;W[id];B[ic];W[hd];B[hc];W[fc];B[fb];W[ge];B[bf];W[cf];B[bg]
+;W[cb];B[li];W[mj];B[ml];W[ni];B[ac];W[ds];B[ig];W[cr];B[if]
+;W[hg];B[re];W[qf];B[rd];W[nb];B[nl];W[bq];B[nj];W[mi];B[bo]
+;W[je];B[lf];W[ke];B[mc];W[le];B[gc];W[me];B[aa];W[ii];B[ih]
+;W[hi];B[mf];W[nf];B[lr];W[be];B[ae];W[ci];B[bi];W[cj];B[bj]
+;W[ej];B[ck];W[fj];B[fk];W[dn];B[bp];W[cn];B[bn];W[dm];B[ms]
+;W[ns];B[lh];W[dl];B[ek];W[gi];B[dk];W[cl];B[bl];W[bm];B[am]
+;W[ji];B[kj];W[mh];B[bc];W[ba];B[is];W[hr];B[ls];W[jh];B[jg]
+;W[lg];B[kh];W[hl];B[kf];W[ik];B[hj];W[ab];B[ad];W[ma];B[la]
+;W[na];B[bb];W[lb];B[ka];W[kb];B[ja];W[jb];B[ia];W[ld];B[lc]
+;W[nd];B[ib];W[ap];B[gl];W[il];B[em];W[so];B[kd];W[sp];B[mk]
+;W[sq];B[sr];W[sn];B[qr];W[cq];B[cm];W[bd];B[af];W[bm];B[db]
+;W[co];B[cp];W[an];B[cm];W[nc];B[bm];W[kc];B[ps];W[ca];B[ao]
+;W[aq];B[da];W[aa];B[cg];W[fe];B[gj];W[jf];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident237.sgf b/regression/games/incident237.sgf
new file mode 100644 (file)
index 0000000..5a853d5
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[4]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-03]
+SY[Cgoban 1.9.10]TM[-]AB[cc][gc][cg][gg]
+RE[W+30.5]
+;W[ee];B[ce];W[df];B[ge];W[dg];B[cf];W[ch];B[bh];W[eh];B[ci];W[di];
+B[bi];W[fd];B[fh];W[gd];B[hd];W[fc];B[hc];W[fg];B[gh];W[ff];B[ec];
+W[fb];B[fe];W[gf];B[he];W[ed];B[hf];W[dc];B[db];W[eb];B[cb];W[cd];
+B[de];W[dd];B[ef];W[eg];B[hb];W[be];B[bf];W[af];B[ag];W[bg];B[gb];
+W[ga];B[ha];W[fa];B[fi];W[ei];B[tt];W[tt]
+)
diff --git a/regression/games/incident238.sgf b/regression/games/incident238.sgf
new file mode 100644 (file)
index 0000000..5da264e
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.98 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.98 ascii Random Seed 959113951] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[cf];B[fd];W[qf];B[pf];W[pm];B[np];W[pg];B[qe];W[cn];B[dn]
+;W[dm];B[en];W[of];B[pe];W[cq];B[qg];W[qh];B[rg];W[pi];B[dq]
+;W[cp];B[og];W[ph];B[nf];W[rh];B[rf];W[lp];B[nn];W[ol];B[ch]
+;W[mc];B[oe];W[ob];B[ml];W[oj];B[qj];W[oq];B[nq];W[pq];B[op]
+;W[qq];B[kq];W[nr];B[mr];W[or];B[gp];W[em];B[oi];W[oh];B[ni]
+;W[nh];B[mo];W[nj];B[mi];W[mh];B[mj];W[lh];B[qb];W[jb];B[jh]
+;W[fm];B[eh];W[cc];B[cd];W[bd];B[be];W[bb];B[de];W[gj];B[bf]
+;W[ej];B[ad];W[ac];B[db];W[cb];B[dc];W[ae];B[go];W[dr];B[er]
+;W[cr];B[fr];W[dk];B[ci];W[cj];B[bi];W[di];B[df];W[bj];B[ki]
+;W[hm];B[jn];W[jf];B[kg];W[hf];B[hd];W[hh];B[hi];W[fh];B[dh]
+;W[gi];B[hj];W[ge];B[id];W[hb];B[ec];W[gd];B[ce];W[le];B[ke]
+;W[kf];B[lg];W[rj];B[qk];W[rk];B[ql];W[qm];B[rl];W[rm];B[ld]
+;W[md];B[pb];W[nl];B[il];W[mm];B[nk];W[ok];B[nm];W[mk];B[ll]
+;W[lk];B[kj];W[kl];B[lf];W[me];B[mf];W[lm];B[lc];W[lb];B[nb]
+;W[mb];B[gc];W[hc];B[oc];W[gb];B[fc];W[lr];B[lq];W[ms];B[lo]
+;W[mq];B[kr];W[mp];B[ro];W[rq];B[gk];W[fk];B[gl];W[jm];B[im]
+;W[kn];B[ko];W[in];B[jo];W[fn];B[hn];W[ep];B[eq];W[do];B[fp]
+;W[eo];B[ma];W[la];B[na];W[kc];B[kd];W[qo];B[ic];W[ib];B[qp]
+;W[rp];B[qn];W[rn];B[po];W[so];B[qo];W[on];B[gm];W[ai];B[ee]
+;W[fg];B[ei];W[dj];B[ff];W[gf];B[ca];W[ba];B[da];W[ah];B[af]
+;W[ad];B[ih];W[ig];B[ds];W[cs];B[es];W[ks];B[jr];W[js];B[is]
+;W[ls];B[iq];W[gn];B[io];W[nc];B[oa];W[fb];B[jk];W[jl];B[fl]
+;W[el];B[bg];W[ln];B[eg];W[fe];B[ef];W[fi];B[sh];W[si];B[sg]
+;W[sl];B[oo];W[pn];B[no];W[om];B[nd];W[ea];B[ne];W[eb];B[ng]
+;W[pk];B[jg];W[pl];B[mn];W[kk];B[fo];W[mr];B[lj];W[aj];B[bh]
+;W[qi];B[cg];W[ag];B[li];W[kh];B[mg];W[tt];B[kp];W[tt];B[tt]
+)
diff --git a/regression/games/incident239.sgf b/regression/games/incident239.sgf
new file mode 100644 (file)
index 0000000..401991f
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.98 ascii]HA[2]KM[0.5]GN[GNU Go 2.7.98 ascii Random Seed 959204099] 
+AB[gc]AB[cg]
+;W[ge];B[cd];W[fc];B[fb];W[gd];B[hb];W[hc];B[gb];W[id];B[gg]
+;W[fg];B[ff];W[gf];B[ef];W[gh];B[eb];W[dc];B[ga];W[db];B[ec]
+;W[ed];B[dd];W[bc];B[fd];W[fe];B[ee];W[be];B[hg];W[hf];B[fh]
+;W[hh];B[ig];W[fi];B[eg];W[eh];B[fg];W[dh];B[bd];W[ad];B[ch]
+;W[bg];B[cc];W[bb];B[bh];W[cb];B[tt];W[cf];B[tt];W[dg];B[df]
+;W[ei];B[ag];W[bf];B[ah];W[ci];B[gi];W[hi];B[bi];W[af];B[di]
+;W[gi];B[ce];W[ac];B[da];W[ae];B[ii];W[ci];B[ih];W[ai];B[ca]
+;W[ba];B[ea];W[if];B[he];W[tt];B[hd];W[tt];B[ie];W[tt];B[tt]
+)
diff --git a/regression/games/incident240.sgf b/regression/games/incident240.sgf
new file mode 100644 (file)
index 0000000..eb9af0d
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]RU[Japanese]SZ[13]
+PW[GNU Go]PB[GNU Go 2.7.105 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.105 ascii Random Seed 959790719] 
+LB[cd:40][kd:40][ji:40][ck:40]
+C[Value of move: 40]
+;B[cd];W[jj];B[dk];W[jc];B[kh];W[hj];B[ke];W[kd];B[lj];W[kk]
+;B[jf];W[ec];B[ee];W[di];B[fk];W[cc];B[hl];W[ck];B[cl];W[bl]
+;B[cj];W[bk];B[dj];W[bj];B[dm];W[ci];B[cf];W[fi];B[ge];W[gc]
+;B[fg];W[bg];B[bc];W[cb];B[hg];W[je];B[ie];W[jd];B[le];W[ld]
+;B[gi];W[gj];B[jl];W[fj];B[hi];W[kl];B[lk];W[bf];B[be];W[ej]
+;B[ek];W[ii];B[cg];W[ch];B[af];W[ag];B[bh];W[ae];B[ah];W[ad]
+;B[eh];W[ei];B[bb];W[bi];B[bm];W[ai];B[ac];W[dd];B[ca];W[db]
+;B[ba];W[de];B[df];W[ce];B[ef];W[ed];B[ki];W[ih];B[ll];W[km]
+;B[jk];W[kj];B[ik];W[ij];B[md];W[mc];B[me];W[lb];B[gd];W[ig]
+;B[if];W[hd];B[fd];W[fc];B[he];W[id];B[gk];W[jm];B[dh];W[im]
+;B[hk];W[hm];B[lm];W[fm];B[fh];W[hh];B[gh];W[jg];B[kg];W[el]
+;B[fl];W[em];B[gm];W[gl];B[jh];W[gm];B[ji];W[al];B[tt];W[tt]
+;B[tt]
+)
diff --git a/regression/games/incident246.sgf b/regression/games/incident246.sgf
new file mode 100644 (file)
index 0000000..ade751d
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.111 ascii]HA[4]KM[0.5]GN[GNU Go 2.7.111 ascii Random Seed 960141445] 
+AB[dd]AB[pd]AB[jj]AB[dp]AB[pp]
+;W[of];B[mc];W[pn];B[qf];W[qp];B[qq];W[qo];B[op];W[qj];B[pg]
+;W[mq];B[kq];W[mo];B[ko];W[np];B[oo];W[mm];B[lp];W[mp];B[pl]
+;W[oj];B[od];W[og];B[mj];W[ph];B[nk];W[ok];B[nl];W[ol];B[om]
+;W[on];B[pm];W[nm];B[rm];W[rn];B[km];W[rl];B[cf];W[fp];B[dn]
+;W[dq];B[cq];W[eq];B[cr];W[jp];B[hp];W[kp];B[jq];W[lo];B[cj]
+;W[io];B[ip];W[jo];B[ho];W[kn];B[qh];W[qi];B[oh];W[pi];B[nh]
+;W[mf];B[kf];W[nj];B[lk];W[ll];B[mi];W[mk];B[lg];W[mh];B[mg]
+;W[lh];B[kh];W[lj];B[kk];W[li];B[ni];W[ng];B[ml];W[mk];B[rk]
+;W[ql];B[rh];W[rj];B[ec];W[lf];B[kg];W[nd];B[nc];W[md];B[jm]
+;W[kl];B[jl];W[eo];B[ep];W[do];B[cp];W[co];B[fq];W[gq];B[fr]
+;W[gp];B[fo];W[go];B[fn];W[hn];B[hr];W[gn];B[in];W[gr];B[hq]
+;W[fs];B[er];W[lq];B[ir];W[kr];B[jr];W[lr];B[gm];W[hm];B[gl]
+;W[hl];B[gk];W[hs];B[hk];W[is];B[rp];W[ro];B[oq];W[nr];B[sq]
+;W[qs];B[ld];W[le];B[kd];W[ic];B[gc];W[je];B[ke];W[jc];B[ne]
+;W[nf];B[me];W[lb];B[hb];W[ib];B[mb];W[kc];B[qr];W[ps];B[rs]
+;W[or];B[sr];W[pr];B[pq];W[so];B[el];W[en];B[fm];W[dm];B[bm]
+;W[cm];B[bo];W[bn];B[bp];W[bl];B[dk];W[cl];B[bk];W[am];B[di]
+;W[hc];B[gb];W[gd];B[gf];W[fd];B[ri];W[fc];B[fb];W[ed];B[sj]
+;W[sk];B[sl];W[qm];B[sm];W[qk];B[sk];W[de];B[dc];W[ce];B[ee]
+;W[ff];B[fe];W[ge];B[ef];W[hf];B[fg];W[jd];B[df];W[gg];B[gh]
+;W[hg];B[ff];W[hh];B[gi];W[hi];B[lm];W[ml];B[no];W[nn];B[la]
+;W[ka];B[ma];W[ia];B[sp];W[oi];B[ih];W[kj];B[jk];W[ji];B[ii]
+;W[hj];B[il];W[js];B[ki];W[gj];B[fj];W[pf];B[qg];W[pe];B[qe]
+;W[qc];B[rd];W[rb];B[rc];W[bf];B[be];W[cd];B[cc];W[bd];B[bg]
+;W[ae];B[bc];W[ag];B[bh];W[fh];B[fi];W[eh];B[sb];W[dh];B[cg]
+;W[ak];B[pc];W[bj];B[bi];W[ck];B[ac];W[ai];B[ah];W[aj];B[ij]
+;W[jf];B[es];W[iq];B[ig];W[if];B[jg];W[jn];B[im];W[ha];B[ao]
+;W[ga];B[ea];W[fa];B[eb];W[em];B[ln];W[mn];B[gs];W[dl];B[ek]
+;W[po];B[fs];W[lc];B[nq];W[sn];B[si];W[an];B[oe];W[tt];B[tt]
+)
diff --git a/regression/games/incident248.sgf b/regression/games/incident248.sgf
new file mode 100644 (file)
index 0000000..1892d2b
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.115 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.115 ascii Random Seed 960586088] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[mo];B[mq];W[cn];B[fq];W[qf];B[pf];W[pg];B[of];W[qe];B[qd]
+;W[nc];B[oc];W[nd];B[en];W[cp];B[lc];W[pe];B[oe];W[od];B[qg]
+;W[pc];B[qc];W[pb];B[re];W[fc];B[mb];W[cf];B[ee];W[cc];B[cd]
+;W[dc];B[ge];W[dq];B[eo];W[do];B[ch];W[ep];B[go];W[qn];B[pq]
+;W[qk];B[on];W[qh];B[rf];W[qj];B[mm];W[pi];B[pm];W[qm];B[hc]
+;W[oj];B[bb];W[bc];B[bd];W[ad];B[ae];W[ac];B[bf];W[gb];B[rp]
+;W[mi];B[df];W[kj];B[lj];W[ki];B[mk];W[kk];B[rh];W[ln];B[jn]
+;W[km];B[fr];W[oo];B[po];W[pn];B[ol];W[no];B[li];W[lh];B[cs]
+;W[bk];B[lf];W[ld];B[hb];W[mf];B[og];W[kd];B[jf];W[kc];B[nb]
+;W[ob];B[lb];W[kb];B[pk];W[ql];B[ok];W[pl];B[om];W[mj];B[lk]
+;W[oi];B[nj];W[ni];B[nk];W[hl];B[hj];W[kf];B[kg];W[ke];B[lg]
+;W[jg];B[je];W[ig];B[ph];W[qi];B[mg];W[ji];B[me];W[md];B[rb]
+;W[nq];B[or];W[nr];B[qo];W[kp];B[ko];W[lp];B[mr];W[kr];B[ii]
+;W[jk];B[ij];W[ih];B[lo];W[mp];B[mn];W[ns];B[lm];W[kn];B[rn]
+;W[gg];B[mh];W[kh];B[kl];W[jm];B[jl];W[jo];B[il];W[jh];B[ik]
+;W[fj];B[gi];W[fi];B[hh];W[hg];B[fh];W[gh];B[hi];W[im];B[fg]
+;W[hk];B[ll];W[nn];B[hm];W[gj];B[nh];W[nm];B[ip];W[hn];B[ir]
+;W[gm];B[dl];W[cl];B[fl];W[gl];B[bq];W[bp];B[br];W[bi];B[sk]
+;W[ib];B[ga];W[fb];B[fk];W[ic];B[id];W[di];B[ci];W[ei];B[ba]
+;W[cj];B[dh];W[dk];B[da];W[dm];B[fa];W[fm];B[em];W[el];B[fn]
+;W[fp];B[gp];W[bh];B[gf];W[nl];B[rm];W[eh];B[eg];W[cg];B[ab]
+;W[dg];B[ec];W[jq];B[ce];W[iq];B[qb];W[hq];B[hr];W[gq];B[gr]
+;W[er];B[es];W[js];B[dr];W[eq];B[cq];W[aq];B[bg];W[ar];B[is]
+;W[bs];B[as];W[os];B[ap];W[pr];B[qr];W[ps];B[ao];W[bn];B[qs]
+;W[oq];B[ri];W[an];B[oh];W[ml];B[ne];W[bo];B[aq];W[jc];B[rj]
+;W[he];B[hd];W[ie];B[rl];W[qa];B[ia];W[la];B[ja];W[ma];B[ka]
+;W[oa];B[na];W[la];B[ma];W[if];B[ag];W[ah];B[op];W[np];B[jr]
+;W[ks];B[hp];W[kq];B[fo];W[dp];B[hf];W[mc];B[la];W[jb];B[ha]
+;W[gd];B[fe];W[eb];B[ea];W[db];B[ed];W[ca];B[cb];W[gc];B[fd]
+;W[rk];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident251.sgf b/regression/games/incident251.sgf
new file mode 100644 (file)
index 0000000..f667a41
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.118 ascii]HA[2]KM[-4.5]GN[GNU Go 2.7.118 ascii Random Seed 961158319] 
+AB[pd]AB[dp]
+;W[qp];B[np];W[cd];B[ed];W[cf];B[ef];W[ch];B[eh];W[dj];B[fe]
+;W[dm];B[qn];W[po];B[fp];W[on];B[ql];W[ol];B[kq];W[pj];B[rj]
+;W[qi];B[pq];W[qq];B[nr];W[pr];B[pk];W[ok];B[oj];W[oi];B[nj]
+;W[qk];B[rk];W[pl];B[pm];W[om];B[rm];W[pn];B[qm];W[sl];B[ro]
+;W[qo];B[lj];W[ri];B[rl];W[rp];B[sn];W[sp];B[so];W[sm];B[sk]
+;W[qe];B[ml];W[mn];B[kl];W[kn];B[hq];W[jp];B[co];W[jq];B[kp]
+;W[jo];B[il];W[pe];B[od];W[oe];B[nd];W[jd];B[ld];W[gd];B[ne]
+;W[qd];B[cm];W[cl];B[dl];W[ck];B[dn];W[em];B[ej];W[ek];B[fj]
+;W[fk];B[gj];W[ge];B[hk];W[fm];B[lf];W[ni];B[or];W[oq];B[jr]
+;W[ir];B[kr];W[iq];B[mq];W[op];B[hr];W[js];B[qc];W[rc];B[qb]
+;W[rb];B[ra];W[re];B[kc];W[jc];B[ps];W[qr];B[de];W[ce];B[di]
+;W[ci];B[gn];W[gm];B[fn];W[en];B[no];W[nn];B[ph];W[pi];B[sd]
+;W[rd];B[og];W[nf];B[ng];W[of];B[pf];W[qf];B[mg];W[pg];B[oh]
+;W[qh];B[lm];W[ln];B[lp];W[ks];B[ls];W[is];B[mo];W[nq];B[hs]
+;W[lo];B[mr];W[oo];B[mp];W[mj];B[nk];W[mk];B[lk];W[nl];B[eo]
+;W[bm];B[bn];W[al];B[cn];W[li];B[gf];W[hf];B[gg];W[hg];B[jb]
+;W[ib];B[kb];W[hc];B[hh];W[ih];B[ig];W[if];B[jg];W[ji];B[id]
+;W[ie];B[hd];W[fb];B[kh];W[ki];B[eb];W[dc];B[ec];W[fc];B[db]
+;W[cb];B[mm];W[km];B[lh];W[jl];B[jk];W[jm];B[ll];W[ij];B[ik]
+;W[hj];B[gk];W[hi];B[dg];W[cg];B[fg];W[gh];B[mf];W[fi];B[ei]
+;W[dh];B[gi];W[hh];B[fh];W[an];B[ao];W[am];B[df];W[ap];B[bp]
+;W[bo];B[bq];W[ao];B[aq];W[hp];B[fs];W[gp];B[gq];W[go];B[hn]
+;W[fo];B[io];W[ip];B[im];W[fq];B[eq];W[ep];B[fr];W[fp];B[sb]
+;W[sc];B[fa];W[ga];B[ea];W[dq];B[er];W[cr];B[cq];W[dr];B[cs]
+;W[do];B[br];W[cp];B[ds];W[dp];B[ca];W[bb];B[ia];W[ha];B[ja]
+;W[ke];B[kj];W[jj];B[jf];W[je];B[kf];W[le];B[oc];W[me];B[md]
+;W[mh];B[qs];W[rs];B[os];W[sr];B[gl];W[fl];B[hm];W[dd];B[ba]
+;W[ab];B[si];W[sh];B[sj];W[rg];B[qj];W[pk];B[fd];W[he];B[gb]
+;W[gc];B[hb];W[ic];B[ko];W[sa];B[qa];W[aa];B[da];W[nm];B[kk]
+;W[jh];B[sb];W[jn];B[sa];W[in];B[ho];W[kd];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident252.sgf b/regression/games/incident252.sgf
new file mode 100644 (file)
index 0000000..bd015e7
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.119 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.119 ascii Random Seed 961442515] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[nc];B[qf];W[nd];B[lc];W[qn];B[nq];W[fq];B[dn];W[fc];B[fd]
+;W[gd];B[fe];W[ec];B[dc];W[hc];B[gb];W[hb];B[on];W[cf];B[ce]
+;W[df];B[jb];W[de];B[be];W[ed];B[bc];W[ee];B[ff];W[rp];B[ch]
+;W[db];B[cb];W[bf];B[ha];W[ia];B[eg];W[ae];B[ad];W[af];B[hq]
+;W[cl];B[el];W[co];B[cn];W[cq];B[dq];W[cp];B[do];W[lq];B[lp]
+;W[mp];B[mq];W[kp];B[lo];W[ko];B[kq];W[lr];B[kn];W[eh];B[dg]
+;W[cd];B[cc];W[bd];B[ei];W[eb];B[kr];W[gn];B[fn];W[jo];B[io]
+;W[jn];B[km];W[ln];B[mo];W[mn];B[no];W[jq];B[jr];W[ip];B[ho]
+;W[hp];B[iq];W[go];B[gp];W[jp];B[in];W[jm];B[im];W[jl];B[il]
+;W[kl];B[lm];W[ll];B[mm];W[ik];B[gl];W[gq];B[fp];W[hk];B[gm]
+;W[jk];B[ml];W[mk];B[ol];W[mf];B[pc];W[jf];B[mi];W[hh];B[ie]
+;W[ge];B[if];W[jg];B[gf];W[hf];B[hg];W[he];B[ig];W[ih];B[oi]
+;W[gh];B[kj];W[gg];B[ij];W[hj];B[jh];W[kh];B[ji];W[je];B[id]
+;W[li];B[lj];W[mj];B[ca];W[mh];B[ni];W[lk];B[me];W[ne];B[nf]
+;W[of];B[ng];W[mg];B[oe];W[md];B[le];W[ld];B[ke];W[kg];B[kd]
+;W[lb];B[nh];W[kc];B[lh];W[lg];B[ki];W[ii];B[lh];W[jc];B[li]
+;W[ic];B[pg];W[ci];B[ef];W[di];B[fh];W[dh];B[bi];W[fi];B[cj]
+;W[fj];B[gk];W[gj];B[bl];W[ek];B[ir];W[dk];B[fr];W[bm];B[bn]
+;W[bk];B[cm];W[al];B[ck];W[dl];B[dh];W[bj];B[aj];W[bo];B[an]
+;W[fl];B[em];W[nl];B[nm];W[oj];B[fg];W[pi];B[qj];W[ok];B[br]
+;W[pl];B[pm];W[om];B[nn];W[ol];B[qm];W[pn];B[nj];W[nk];B[rm]
+;W[ql];B[rl];W[qi];B[ri];W[rk];B[rn];W[qo];B[cr];W[qk];B[rj]
+;W[sl];B[qq];W[rq];B[sk];W[sj];B[rr];W[ro];B[ob];W[nb];B[na]
+;W[ma];B[oa];W[sr];B[qr];W[pe];B[od];W[gr];B[er];W[fk];B[fo]
+;W[si];B[rh];W[sh];B[qe];W[sf];B[rg];W[sg];B[po];W[sd];B[hl]
+;W[rc];B[qb];W[rb];B[ra];W[rd];B[sb];W[re];B[sa];W[rf];B[rs]
+;W[ph];B[sq];W[qg];B[qh];W[oc];B[pf];W[qc];B[qa];W[pb];B[pa]
+;W[qd];B[og];W[sp];B[ss];W[sn];B[sq];W[ak];B[ai];W[bg];B[sr]
+;W[bh];B[ci];W[ah];B[am];W[bl];B[qp];W[sm];B[ej];W[fm];B[kk]
+;W[dm];B[en];W[cg];B[pb];W[pk];B[qg];W[sc];B[tt];W[hd];B[tt]
+;W[tt];B[tt]
+)
diff --git a/regression/games/incident253.sgf b/regression/games/incident253.sgf
new file mode 100644 (file)
index 0000000..62cce24
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.123 ascii]HA[2]KM[0.5]GN[GNU Go 2.7.123 ascii Random Seed 962156593] 
+AB[pd]AB[dp]
+LB[kc:21][nc:29][qc:18][md:24][nd:29][pf:29][qf:29][pg:24][qi:21][ck:21][dm:24][cn:29][dn:29][fp:29][gp:24][pp:50][cq:18][fq:29][iq:21]
+C[Value of move: 50]
+;W[pp];B[on];W[dc];B[de];W[gc];B[fd];W[qf];B[pf];W[pg];B[og]
+;W[ph];B[oh];W[pi];B[oi];W[fp];B[jp];W[fn];B[dj];W[gm];B[gk]
+;W[im];B[km];W[ik];B[ii];W[kk];B[ki];W[gb];B[gd];W[ec];B[bd]
+;W[qn];B[pl];W[nc];B[nd];W[md];B[me];W[ld];B[le];W[np];B[mq]
+;W[kd];B[ke];W[dn];B[fq];W[eq];B[dq];W[er];B[cn];W[gq];B[hp]
+;W[dh];B[dl];W[co];B[cm];W[do];B[cp];W[bo];B[bp];W[fh];B[cb]
+;W[ef];B[eb];W[ed];B[ee];W[oq];B[nr];W[fc];B[ff];W[jc];B[oc]
+;W[mb];B[nb];W[mc];B[qe];W[rf];B[re];W[om];B[ol];W[or];B[qj]
+;W[ob];B[pb];W[na];B[pa];W[hj];B[rh];W[gi];B[hg];W[gf];B[eg]
+;W[di];B[eh];W[ei];B[fg];W[gg];B[ge];W[hh];B[hf];W[pm];B[gh]
+;W[fi];B[gg];W[hi];B[ih];W[cj];B[dg];W[rg];B[qh];W[qg];B[qi]
+;W[ir];B[jr];W[jq];B[kq];W[iq];B[lr];W[kp];B[lp];W[ip];B[jo]
+;W[io];B[jn];W[cg];B[cf];W[bg];B[bf];W[ne];B[od];W[nn];B[mo]
+;W[nf];B[mg];W[rl];B[ql];W[db];B[cc];W[ca];B[bh];W[ch];B[ag]
+;W[bi];B[ah];W[bb];B[bc];W[bl];B[ab];W[ba];B[hc];W[hb];B[ic]
+;W[ib];B[jd];W[rk];B[qm];W[rn];B[rm];W[sm];B[nm];W[pn];B[mn]
+;W[nl];B[no];W[pj];B[qk];W[oj];B[nk];W[ml];B[nj];W[je];B[id]
+;W[ie];B[hd];W[lj];B[mi];W[lm];B[ll];W[kl];B[mj];W[li];B[lh]
+;W[js];B[kr];W[rj];B[ok];W[ri];B[sh];W[dd];B[cd];W[ns];B[ms]
+;W[os];B[mm];W[lk];B[jj];W[fk];B[jl];W[jm];B[kn];W[jk];B[ij]
+;W[ln];B[lo];W[ll];B[dr];W[in];B[ko];W[oo];B[nn];W[ks];B[ls]
+;W[is];B[es];W[fs];B[ds];W[ap];B[aq];W[ao];B[br];W[ep];B[ck]
+;W[ai];B[af];W[nq];B[oa];W[nb];B[kc];W[jb];B[kb];W[la];B[bj]
+;W[aj];B[ci];W[ak];B[bk];W[cj];B[bm];W[ci];B[al];W[am];B[cl]
+;W[al];B[hk];W[si];B[ek];W[fj];B[fl];W[mr];B[fm];W[mp];B[nr]
+;W[da];B[em];W[mr];B[po];W[nr];B[op];W[aa];B[pq];W[oo];B[ej]
+;W[dm];B[en];W[gl];B[fo];W[gn];B[an];W[bn];B[eo];W[hl];B[an]
+;W[gj];B[op];W[qp];B[sn];W[lq];B[qo];W[ro];B[rp];W[oo];B[sl]
+;W[kp];B[sk];W[rq];B[sj];W[ac];B[ad];W[go];B[gp];W[fr];B[ab]
+;W[so];B[sm];W[ac];B[ka];W[lb];B[gr];W[hq];B[gs];W[ho];B[kj]
+;W[ab];B[gk];W[hk];B[mk];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident254.sgf b/regression/games/incident254.sgf
new file mode 100644 (file)
index 0000000..dbdb423
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.123 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.123 ascii Random Seed 962317601] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[dn];B[bp];W[fn];B[co];W[go];B[ho];W[ek];B[gn];W[fm];B[en]
+;W[eo];B[fp];W[ep];B[eq];W[np];B[do];W[em];B[fo];W[nn];B[cn]
+;W[om];B[oo];W[no];B[oq];W[cm];B[po];W[dh];B[dm];W[dl];B[en]
+;W[pf];B[pe];W[ph];B[pg];W[fh];B[pi];W[cj];B[dm];W[lp];B[oh]
+;W[nc];B[qf];W[pb];B[of];W[qc];B[qh];W[ld];B[fl];W[hd];B[gp]
+;W[fe];B[gm];W[dn];B[el];W[df];B[dm];W[bm];B[cl];W[ck];B[dk]
+;W[bl];B[ci];W[fc];B[bk];W[bj];B[bi];W[ak];B[bn];W[dl];B[aj]
+;W[di];B[al];W[ej];B[fn];W[am];B[nm];W[on];B[fk];W[ai];B[dn]
+;W[ce];B[fj];W[re];B[qe];W[rf];B[qg];W[qm];B[oi];W[rj];B[og]
+;W[rm];B[qj];W[sj];B[gl];W[lm];B[qp];W[sp];B[rp];W[rq];B[qq]
+;W[pr];B[so];W[rr];B[qk];W[nl];B[mm];W[ll];B[ml];W[mk];B[kp]
+;W[im];B[mn];W[kn];B[ln];W[lo];B[sq];W[qr];B[sp];W[lg];B[me]
+;W[le];B[lf];W[mf];B[mg];W[kf];B[ng];W[ne];B[nf];W[md];B[od]
+;W[ri];B[rh];W[qd];B[sh];W[kc];B[rl];W[sm];B[rk];W[db];B[pm]
+;W[pn];B[qn];W[pl];B[ql];W[cc];B[rn];W[ed];B[ok];W[li];B[sn]
+;W[lq];B[lr];W[mr];B[sl];W[pm];B[mi];W[or];B[nr];W[nq];B[ms]
+;W[kr];B[ki];W[ls];B[lh];W[lj];B[kk];W[ir];B[mh];W[gr];B[kh]
+;W[ds];B[lk];W[mj];B[nk];W[ol];B[pk];W[if];B[kj];W[nj];B[oj]
+;W[mo];B[io];W[bs];B[jo];W[hi];B[jq];W[cq];B[jr];W[hq];B[js]
+;W[hs];B[is];W[hk];B[gq];W[gs];B[iq];W[ii];B[hl];W[hr];B[hp]
+;W[fs];B[dq];W[cr];B[cp];W[es];B[dr];W[kg];B[br];W[bq];B[aq]
+;W[ar];B[er];W[ap];B[ao];W[fr];B[aq];W[oc];B[fq];W[cs];B[ap]
+;W[fi];B[sg];W[gj];B[gk];W[ik];B[il];W[in];B[jl];W[ij];B[jk]
+;W[jh];B[gi];W[gh];B[hh];W[ni];B[mm];W[ml];B[jg];W[sf];B[se]
+;W[nd];B[rd];W[sd];B[rg];W[rc];B[pc];W[jm];B[qb];W[rb];B[pa]
+;W[qa];B[ks];W[ns];B[ih];W[ji];B[ig];W[kq];B[hg];W[jf];B[hf]
+;W[jc];B[je];W[kl];B[he];W[nh];B[ie];W[jn];B[ob];W[oa];B[ke]
+;W[lf];B[kd];W[oe];B[ic];W[id];B[gd];W[hc];B[gc];W[hb];B[gb]
+;W[ib];B[lc];W[an];B[lb];W[ge];B[kb];W[jb];B[ka];W[ko];B[ga]
+;W[hm];B[ha];W[hn];B[ia];W[gf];B[ja];W[gg];B[dc];W[mb];B[mc]
+;W[cd];B[fb];W[tt];B[ea];W[eb];B[ec];W[de];B[tt];W[tt]
+)
diff --git a/regression/games/incident256.sgf b/regression/games/incident256.sgf
new file mode 100644 (file)
index 0000000..d2bc849
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.124 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.124 ascii Random Seed 962552985] 
+LB[pp:50]
+C[Value of move: 50]
+;B[pp];W[dd];B[qd];W[cp];B[ep];W[dq];B[en];W[dn];B[fc];W[df]
+;B[ic];W[oc];B[oe];W[md];B[fq];W[pj];B[dc];W[cc];B[cb];W[bc]
+;B[eb];W[qf];B[kd];W[me];B[og];W[mh];B[lf];W[mf];B[dh];W[pn]
+;B[np];W[qh];B[qn];W[qm];B[qo];W[pm];B[kq];W[dl];B[fh];W[ni]
+;B[pd];W[qc];B[pc];W[ob];B[qb];W[pb];B[ek];W[rc];B[rb];W[rd]
+;B[re];W[qe];B[se];W[od];B[pe];W[kc];B[rf];W[qg];B[el];W[dk]
+;B[dm];W[cm];B[ci];W[cj];B[em];W[do];B[kf];W[jc];B[ie];W[jd]
+;B[je];W[ld];B[ke];W[id];B[ib];W[hd];B[fe];W[he];B[kh];W[hg]
+;B[ce];W[cd];B[be];W[de];B[kj];W[ff];B[ed];W[ef];B[hi];W[gg]
+;B[ii];W[cg];B[bh];W[bg];B[bj];W[bk];B[nk];W[eo];B[fo];W[nm]
+;B[mj];W[lm];B[pk];W[qk];B[ol];W[pl];B[jm];W[ko];B[jo];W[kp]
+;B[lp];W[lo];B[jp];W[lq];B[mp];W[jq];B[kr];W[lr];B[iq];W[jr]
+;B[nr];W[mo];B[hq];W[jl];B[il];W[kl];B[ok];W[ik];B[hl];W[hk]
+;B[fj];W[jk];B[rm];W[rl];B[rn];W[gi];B[gh];W[gj];B[hh];W[fi]
+;B[ak];W[bl];B[er];W[ej];B[ei];W[fk];B[gl];W[fl];B[fn];W[ig]
+;B[jg];W[if];B[lg];W[ji];B[jj];W[ki];B[ih];W[li];B[jh];W[ij]
+;B[kk];W[lk];B[mi];W[lh];B[cr];W[dr];B[ds];W[cq];B[oj];W[oi]
+;B[br];W[bq];B[ge];W[gf];B[jb];W[kb];B[rg];W[rh];B[qj];W[pi]
+;B[mk];W[om];B[pf];W[mg];B[mr];W[qi];B[ne];W[nd];B[nf];W[ng]
+;B[pg];W[oh];B[sc];W[rj];B[bb];W[ac];B[kn];W[km];B[ln];W[mn]
+;B[jn];W[fm];B[gm];W[gn];B[mq];W[ks];B[pa];W[oa];B[qa];W[gk]
+;B[hn];W[go];B[fp];W[im];B[ir];W[hm];B[ho];W[gp];B[hp];W[gq]
+;B[gr];W[gm];B[in];W[ar];B[cs];W[as];B[sl];W[sk];B[sm];W[no]
+;B[oo];W[on];B[ab];W[ah];B[aj];W[ai];B[hc];W[ag];B[bi];W[ch]
+;B[di];W[dg];B[eg];W[fg];B[eh];W[dj];B[ka];W[lb];B[ms];W[ls]
+;B[sg];W[sh];B[gd];W[la];B[ja];W[al];B[is];W[js];B[kq];W[bs]
+;B[aq];W[ap];B[ar];W[eq];B[po];W[dp];B[fr];W[bo];B[ee];W[jf]
+;B[sd];W[hj];B[ph];W[kg];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident258.sgf b/regression/games/incident258.sgf
new file mode 100644 (file)
index 0000000..313d5d9
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.124 ascii]HA[0]KM[-4.5]GN[GNU Go 2.7.124 ascii Random Seed 962551735] 
+;B[dp];W[pd];B[dd];W[pp];B[qj];W[mc];B[nq];W[pm];B[kq];W[no]
+;B[kc];W[le];B[hc];W[dj];B[qg];W[of];B[dm];W[fj];B[oh];W[nh]
+;B[ek];W[cf];B[df];W[dg];B[ce];W[cg];B[fd];W[ef];B[pr];W[qq]
+;B[lh];W[nj];B[lj];W[lo];B[lp];W[lm];B[ii];W[if];B[gf];W[gg]
+;B[fg];W[gh];B[de];W[ff];B[he];W[hf];B[rd];W[qc];B[qe];W[pe]
+;B[mg];W[ng];B[mk];W[nk];B[ml];W[nl];B[rm];W[ll];B[qm];W[pl]
+;B[fm];W[hk];B[jk];W[jl];B[kf];W[ik];B[ke];W[lf];B[kg];W[ie]
+;B[id];W[jd];B[kd];W[ic];B[hd];W[jc];B[je];W[kb];B[lb];W[ib]
+;B[hb];W[lc];B[ka];W[mb];B[jb];W[jj];B[ge];W[ki];B[li];W[jh]
+;B[ig];W[hg];B[ih];W[jg];B[hq];W[ji];B[rb];W[qb];B[bf];W[bg]
+;B[be];W[eg];B[hn];W[jm];B[qr];W[rq];B[mh];W[mf];B[ro];W[qo]
+;B[ck];W[cj];B[bj];W[bi];B[bl];W[dk];B[dl];W[jp];B[iq];W[jq]
+;B[jr];W[ho];B[hm];W[io];B[fq];W[fo];B[eo];W[fn];B[gl];W[en]
+;B[dn];W[em];B[el];W[ep];B[eq];W[do];B[co];W[eo];B[go];W[gp]
+;B[gn];W[fp];B[hp];W[cp];B[dq];W[cq];B[ai];W[bo];B[cn];W[bn]
+;B[cr];W[br];B[ds];W[bs];B[ej];W[di];B[rp];W[qp];B[bm];W[bp]
+;B[mm];W[mn];B[ei];W[eh];B[op];W[oo];B[nm];W[om];B[kp];W[ko]
+;B[qn];W[pn];B[rr];W[nn];B[mp];W[np];B[oq];W[sq];B[gk];W[gj]
+;B[fk];W[oi];B[ph];W[ma];B[la];W[lg];B[kh];W[mj];B[lk];W[kk]
+;B[rc];W[jf];B[ra];W[qa];B[ee];W[mi];B[ag];W[sn];B[bh];W[ch]
+;B[ci];W[dh];B[bi];W[ld];B[ia];W[fh];B[pf];W[og];B[in];W[jn]
+;B[an];W[ao];B[am];W[aq];B[sr];W[qk];B[rk];W[pj];B[rj];W[qi]
+;B[ri];W[pg];B[qf];W[qh];B[rh];W[pi];B[so];W[sp];B[rn];W[ql]
+;B[sm];W[rl];B[sl];W[mo];B[fi];W[gi];B[qd];W[pc];B[pq];W[po]
+;B[kj];W[hj];B[cs];W[es];B[dr];W[gr];B[gq];W[jo];B[fe];W[kr]
+;B[mr];W[ir];B[hr];W[js];B[hs];W[lr];B[mq];W[ms];B[ns];W[ls]
+;B[hl];W[il];B[is];W[jr];B[im];W[cc];B[bc];W[bb];B[bd];W[dc]
+;B[ab];W[ba];B[eb];W[ec];B[ea];W[fc];B[ip];W[ga];B[gb];W[fb]
+;B[fa];W[db];B[da];W[ca];B[gc];W[fa];B[cd];W[aa];B[ac];W[ed]
+;B[lq];W[tt];B[ha];W[tt];B[tt]
+)
diff --git a/regression/games/incident261.sgf b/regression/games/incident261.sgf
new file mode 100644 (file)
index 0000000..1e41cf9
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.123 ascii]HA[2]KM[-3.5]GN[GNU Go 2.7.123 ascii Random Seed 962459283] 
+AB[pd]AB[dp]
+;W[pp];B[dd];W[pj];B[nq];W[pn];B[kq];W[qf];B[nc];W[cn];B[fp]
+;W[dj];B[pq];W[cf];B[fd];W[jd];B[ch];W[cj];B[eh];W[ef];B[hd]
+;W[jc];B[lc];W[hb];B[ff];W[ec];B[ed];W[fb];B[fi];W[fg];B[eg]
+;W[fe];B[gf];W[ge];B[gg];W[ee];B[qh];W[ph];B[pg];W[qg];B[qi]
+;W[pi];B[qj];W[qk];B[he];W[gd];B[cl];W[en];B[ek];W[dk];B[gk]
+;W[dl];B[gn];W[fl];B[re];W[pf];B[og];W[of];B[oh];W[rf];B[rc]
+;W[mg];B[nf];W[ng];B[oi];W[oj];B[ni];W[mi];B[nj];W[ol];B[rh]
+;W[rg];B[qq];W[ne];B[mf];W[me];B[lf];W[le];B[mh];W[lg];B[kf]
+;W[ke];B[lh];W[kg];B[jf];W[oe];B[mj];W[jg];B[if];W[ki];B[li]
+;W[ji];B[ml];W[kk];B[km];W[il];B[gl];W[hm];B[gm];W[jm];B[lk]
+;W[kl];B[nk];W[lm];B[kn];W[ll];B[nm];W[nl];B[no];W[mm];B[mn]
+;W[nh];B[pl];W[ok];B[mk];W[om];B[ql];W[pk];B[rk];W[rj];B[on]
+;W[nn];B[sj];W[sh];B[nm];W[ri];B[rm];W[nn];B[qn];W[qo];B[ro]
+;W[oo];B[ln];W[sl];B[sk];W[si];B[rl];W[pm];B[bi];W[bj];B[ce]
+;W[cc];B[df];W[gc];B[bf];W[de];B[cd];W[dc];B[dg];W[bd];B[hq]
+;W[be];B[cg];W[fc];B[co];W[cf];B[fk];W[bn];B[op];W[mo];B[np]
+;W[jn];B[ko];W[jo];B[kp];W[jp];B[iq];W[jq];B[kb];W[jr];B[ce]
+;W[cd];B[cf];W[hh];B[el];W[dm];B[ib];W[hc];B[kr];W[hs];B[ir]
+;W[is];B[sf];W[sg];B[se];W[qe];B[qd];W[fr];B[gq];W[gr];B[dr]
+;W[eq];B[gh];W[hi];B[ik];W[jk];B[ij];W[ii];B[er];W[fq];B[hn]
+;W[ep];B[fo];W[eo];B[em];W[fn];B[ho];W[dq];B[cr];W[cp];B[bq]
+;W[bo];B[fm];W[br];B[bp];W[cq];B[ar];W[ap];B[bs];W[es];B[od]
+;W[hj];B[hk];W[gj];B[ae];W[ad];B[af];W[ej];B[gp];W[fj];B[ip]
+;W[ks];B[lr];W[ls];B[ms];W[js];B[ns];W[qm];B[rn];W[po];B[qp]
+;W[hg];B[hf];W[jb];B[ja];W[ic];B[ia];W[kc];B[la];W[mc];B[mb]
+;W[ld];B[md];W[nd];B[mc];W[ha];B[ka];W[ai];B[ah];W[aj];B[in]
+;W[im];B[ci];W[di];B[ig];W[ih];B[je];W[gi];B[id];W[ei];B[fh]
+;W[jj];B[ds];W[fs];B[hr];W[ao];B[pe];W[aq];B[br];W[tt];B[io]
+;W[tt];B[hl];W[tt];B[dh];W[tt];B[tt]
+)
diff --git a/regression/games/incident262.sgf b/regression/games/incident262.sgf
new file mode 100644 (file)
index 0000000..bf799c8
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.128 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.128 ascii Random Seed 962983457] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+LB[cc:165][fc:208][nc:208][qc:165][fd:254][gd:210][md:210][nd:254][cf:208][df:254][pf:254][qf:208][dg:210][pg:210][dm:210][pm:210][cn:208][dn:254][pn:254][qn:208][fp:254][gp:210][mp:210][np:254][cq:165][fq:208][nq:208][qq:165]
+C[Value of move: 254]
+;W[pn];B[fc];W[dn];B[cf];W[np];B[cn];W[qo];B[qf];W[fp];B[jn]
+;W[cm];B[fj];W[co];B[nj];W[cc];B[cd];W[dc];B[ec];W[bd];B[be]
+;W[bc];B[db];W[cb];B[eb];W[nd];B[nc];W[qc];B[pc];W[qd];B[qb]
+;W[rb];B[pb];W[bn];B[qe];W[re];B[rf];W[sc];B[se];W[nm];B[rd]
+;W[jh];B[jf];W[ql];B[qk];W[hq];B[lh];W[jr];B[qq];W[hh];B[gg]
+;W[ih];B[hg];W[hj];B[gh];W[hl];B[fl];W[gj];B[gi];W[hn];B[jl]
+;W[ij];B[lj];W[bj];B[bi];W[hc];B[gd];W[ci];B[bh];W[jb];B[kb]
+;W[kc];B[lb];W[hb];B[jc];W[ib];B[gb];W[lq];B[oq];W[ck];B[nl]
+;W[nr];B[or];W[kd];B[ke];W[cj];B[ch];W[di];B[ej];W[rk];B[rj]
+;W[rl];B[qj];W[md];B[ld];W[oe];B[lc];W[mf];B[og];W[rp];B[rq]
+;W[in];B[im];W[hm];B[il];W[ll];B[kk];W[ln];B[km];W[ml];B[oo]
+;W[ji];B[kj];W[os];B[ps];W[ns];B[pr];W[ik];B[sp];W[so];B[sq]
+;W[fm];B[qp];W[ro];B[kg];W[le];B[lf];W[me];B[hd];W[eq];B[on]
+;W[om];B[mg];W[nk];B[mk];W[ol];B[ok];W[el];B[fk];W[nl];B[eh]
+;W[dh];B[dg];W[hi];B[ei];W[lm];B[kl];W[kp];B[jo];W[iq];B[ko]
+;W[mo];B[no];W[ai];B[ah];W[aj];B[nq];W[mr];B[mp];W[gk];B[lo]
+;W[mn];B[lp];W[kq];B[mq];W[ls];B[io];W[gl];B[dk];W[ho];B[dl]
+;W[em];B[cl];W[bl];B[po];W[qn];B[jq];W[ip];B[kn];W[sj];B[si]
+;W[sk];B[ri];W[ig];B[if];W[pl];B[pk];W[kh];B[ki];W[ek];B[ca]
+;W[nn];B[ad];W[lk];B[mj];W[dm];B[jg];W[jk];B[eg];W[tt];B[tt]
+;W[tt]
+)
diff --git a/regression/games/incident263.sgf b/regression/games/incident263.sgf
new file mode 100644 (file)
index 0000000..285701a
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.132 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.132 ascii Random Seed 963409333] 
+;B[qo];W[pc];B[cd];W[cq];B[cj];W[ed];B[ec];W[fc];B[dc];W[fd]
+;B[ph];W[qf];B[oj];W[mc];B[jp];W[fq];B[ho];W[lp];B[lo];W[kq]
+;B[kp];W[lq];B[mp];W[mq];B[nq];W[hm];B[no];W[qq];B[qp];W[jq]
+;B[iq];W[oq];B[op];W[fm];B[dl];W[el];B[ek];W[cn];B[em];W[en]
+;B[fl];W[gn];B[cm];W[gl];B[fj];W[jm];B[dn];W[bn];B[co];W[do]
+;B[dm];W[bo];B[eo];W[ik];B[dp];W[eq];B[fn];W[go];B[gm];W[ip]
+;B[hp];W[io];B[in];W[im];B[jo];W[fo];B[gk];W[fm];B[en];W[pr]
+;B[gm];W[nr];B[np];W[fm];B[hn];W[gm];B[cp];W[dq];B[bp];W[qm]
+;B[pp];W[qj];B[pj];W[rn];B[pq];W[rq];B[qr];W[rr];B[or];W[qs]
+;B[ns];W[pn];B[mr];W[mj];B[fp];W[qk];B[pk];W[qi];B[pm];W[gp]
+;B[ep];W[hr];B[jr];W[qn];B[hq];W[gq];B[bm];W[ch];B[dh];W[dg]
+;B[eh];W[de];B[ef];W[ce];B[df];W[bg];B[cf];W[be];B[cg];W[bd]
+;B[bc];W[ih];B[bf];W[af];B[bh];W[ro];B[ag];W[ir];B[kr];W[gh]
+;B[lr];W[nj];B[ni];W[mm];B[lm];W[nm];B[ql];W[oi];B[pi];W[oh]
+;B[og];W[ol];B[pl];W[nh];B[mi];W[ng];B[mh];W[nf];B[of];W[qg]
+;B[pg];W[eb];B[dd];W[db];B[cc];W[ee];B[ae];W[qh];B[mf];W[mg]
+;B[nl];W[ok];B[lj];W[ml];B[om];W[nk];B[lk];W[ll];B[kl];W[km]
+;B[ln];W[kk];B[mk];W[nl];B[lg];W[ne];B[oe];W[on];B[nn];W[jl]
+;B[mn];W[kl];B[nd];W[me];B[md];W[le];B[lf];W[ad];B[ke];W[ld]
+;B[kd];W[lc];B[kc];W[lh];B[li];W[kh];B[nc];W[ma];B[lb];W[mb]
+;B[nb];W[kf];B[kg];W[jg];B[lg];W[od];B[na];W[kb];B[jf];W[je]
+;B[jb];W[la];B[ja];W[jd];B[jc];W[if];B[ka];W[ic];B[ib];W[hc]
+;B[lb];W[lf];B[hb];W[ff];B[eg];W[bq];B[ao];W[af];B[an];W[ae]
+;B[gb];W[kb];B[fb];W[cb];B[ea];W[bb];B[da];W[fi];B[gc];W[hk]
+;B[id];W[hd];B[lb];W[gd];B[fh];W[gi];B[rp];W[rl];B[sp];W[ps]
+;B[so];W[ac];B[sn];W[gj];B[rm];W[pf];B[sm];W[fk];B[pe];W[qe]
+;B[sq];W[sr];B[oc];W[pd];B[gk];W[ei];B[ci];W[fk];B[ej];W[el]
+;B[dk];W[fl];B[ki];W[di];B[ji];W[fg];B[jh];W[kg];B[dj];W[is]
+;B[js];W[gs];B[sl];W[sk];B[sj];W[rk];B[ri];W[kn];B[ko];W[aq]
+;B[rh];W[os];B[rg];W[ap];B[rf];W[re];B[se];W[po];B[rj];W[jn]
+;B[rd];W[oo];B[qd];W[tt];B[qc];W[qb];B[pb];W[rb];B[fs];W[tt]
+;B[er];W[tt];B[dr];W[tt];B[cr];W[tt];B[br];W[fr];B[es];W[ar]
+;B[qa];W[rc];B[sd];W[ra];B[sf];W[sh];B[pa];W[oa];B[ob];W[tt]
+;B[sc];W[tt];B[sb];W[oa];B[sa];W[pb];B[tt];W[tt]
+)
diff --git a/regression/games/incident267.sgf b/regression/games/incident267.sgf
new file mode 100644 (file)
index 0000000..161bd94
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.133 ascii]HA[0]KM[5.5]GN[GNU Go 2.7.133 ascii Random Seed 963564082] 
+;B[pd];W[dc];B[pp];W[dq];B[pj];W[nq];B[lq];W[no];B[pn];W[nm]
+;B[pl];W[nk];B[iq];W[gq];B[mp];W[np];B[mn];W[kl];B[nn];W[hr]
+;B[mo];W[nc];B[qf];W[kc];B[ce];W[cg];B[cc];W[pb];B[dd];W[ec]
+;B[ed];W[eg];B[fc];W[hc];B[eb];W[cn];B[dm];W[go];B[cm];W[jn]
+;B[oo];W[cj];B[dn];W[co];B[do];W[ep];B[cp];W[bn];B[bm];W[bp]
+;B[an];W[bo];B[cq];W[cr];B[bq];W[qq];B[pq];W[qh];B[ph];W[rj]
+;B[qi];W[qp];B[qo];W[ro];B[rn];W[sp];B[pr];W[ri];B[rh];W[oj]
+;B[qg];W[qc];B[dh];W[ci];B[ch];W[bh];B[dg];W[bf];B[cf];W[bg]
+;B[jd];W[he];B[jc];W[jf];B[kd];W[kb];B[jb];W[ac];B[hb];W[ej]
+;B[oc];W[nb];B[ob];W[oa];B[nd];W[jr];B[jq];W[kr];B[kq];W[mr]
+;B[mc];W[mb];B[lc];W[lb];B[qd];W[na];B[rc];W[rb];B[qb];W[qa]
+;B[pc];W[rd];B[qb];W[sb];B[pa];W[ld];B[md];W[pb];B[qc];W[le]
+;B[ra];W[gb];B[gc];W[ib];B[hd];W[ha];B[id];W[ja];B[ic];W[hg]
+;B[fb];W[pa];B[ir];W[is];B[lr];W[sc];B[re];W[sa];B[ks];W[br]
+;B[dp];W[nh];B[eq];W[dr];B[fp];W[er];B[fq];W[fr];B[gp];W[eo]
+;B[hq];W[gr];B[fo];W[en];B[fn];W[ho];B[dk];W[bb];B[ar];W[hs]
+;B[ei];W[dj];B[fi];W[ef];B[fj];W[df];B[ek];W[js];B[ls];W[hm]
+;B[ii];W[kk];B[ki];W[ik];B[mi];W[mf];B[ni];W[ge];B[hb];W[hi]
+;B[hj];W[oi];B[hh];W[mm];B[oh];W[ln];B[ig];W[hc];B[gd];W[gg]
+;B[if];W[ie];B[je];W[fh];B[gi];W[mh];B[lh];W[lg];B[kg];W[kf]
+;B[jg];W[me];B[ng];W[mg];B[of];W[qr];B[qs];W[ck];B[cl];W[be]
+;B[bd];W[ad];B[bk];W[gk];B[fk];W[fl];B[em];W[hk];B[bj];W[bi]
+;B[cb];W[ba];B[bc];W[ab];B[ok];W[mj];B[om];W[lj];B[li];W[nj]
+;B[io];W[fm];B[in];W[im];B[hn];W[gn];B[hp];W[gm];B[jo];W[ko]
+;B[jj];W[kp];B[jk];W[aj];B[jm];W[jl];B[kn];W[lo];B[ak];W[ai]
+;B[ca];W[km];B[jn];W[el];B[dl];W[jp];B[ip];W[gj];B[di];W[pi]
+;B[qj];W[rk];B[sn];W[nl];B[ol];W[bs];B[kj];W[as];B[aq];W[ij]
+;B[hi];W[lm];B[lp];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident269.sgf b/regression/games/incident269.sgf
new file mode 100644 (file)
index 0000000..90a8cda
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.133 ascii]HA[2]KM[0.5]GN[GNU Go 2.7.133 ascii Random Seed 963578209] 
+AB[pd]AB[dp]
+;W[qp];B[ec];W[cd];B[oq];W[qm];B[lq];W[pr];B[cf];W[ed];B[fc]
+;W[dc];B[ci];W[cn];B[cl];W[en];B[fp];W[bp];B[gn];W[fm];B[cq]
+;W[bq];B[br];W[hq];B[fk];W[gl];B[gq];W[hp];B[in];W[jp];B[ko]
+;W[go];B[ho];W[gp];B[gr];W[fo];B[ef];W[hr];B[ep];W[gs];B[qk]
+;W[fr];B[fq];W[er];B[or];W[pq];B[ln];W[op];B[fn];W[eo];B[bm]
+;W[bn];B[nc];W[qi];B[qf];W[oj];B[em];W[dm];B[el];W[gm];B[hn]
+;W[hk];B[jq];W[iq];B[jr];W[kp];B[do];W[dn];B[lp];W[kq];B[kr]
+;W[dr];B[np];W[oo];B[rj];W[ri];B[ok];W[nj];B[lj];W[nk];B[pl]
+;W[ol];B[pk];W[nm];B[kc];W[ld];B[pj];W[ph];B[oi];W[oh];B[ni]
+;W[nh];B[mi];W[pi];B[mh];W[nf];B[lc];W[md];B[ne];W[mf];B[lg]
+;W[mg];B[nd];W[of];B[kd];W[lf];B[kg];W[kf];B[db];W[cb];B[eb]
+;W[fd];B[hf];W[jg];B[jf];W[je];B[if];W[jh];B[ki];W[ll];B[ii]
+;W[jj];B[ji];W[jk];B[gj];W[hj];B[hi];W[ke];B[me];W[le];B[pe]
+;W[pm];B[ic];W[id];B[hc];W[hd];B[be];W[gf];B[ge];W[gd];B[fe]
+;W[dl];B[dk];W[ck];B[bk];W[gk];B[bc];W[cc];B[pg];W[og];B[bb]
+;W[ba];B[da];W[ca];B[bd];W[gc];B[rk];W[gb];B[km];W[kl];B[de]
+;W[dd];B[mm];W[ml];B[nn];W[on];B[no];W[lm];B[mn];W[jm];B[kn]
+;W[jn];B[jo];W[ip];B[io];W[os];B[ns];W[ps];B[mr];W[qg];B[rg]
+;W[pf];B[sf];W[rh];B[re];W[qc];B[pc];W[pb];B[ob];W[qb];B[im]
+;W[jl];B[an];W[ao];B[am];W[cm];B[bl];W[rd];B[pa];W[qa];B[oa]
+;W[sb];B[oe];W[qd];B[qe];W[sd];B[mc];W[jc];B[jb];W[jd];B[hb]
+;W[ha];B[ib];W[ia];B[ja];W[ga];B[la];W[fj];B[gi];W[ej];B[ek]
+;W[dj];B[cj];W[fl];B[ck];W[ee];B[il];W[ij];B[ab];W[ff];B[he]
+;W[hg];B[gg];W[fg];B[ig];W[gh];B[fi];W[ih];B[eh];W[eg];B[df]
+;W[dg];B[cg];W[dh];B[di];W[ch];B[bh];W[fh];B[ei];W[ie];B[kh]
+;W[hh];B[lk];W[mj];B[ir];W[is];B[js];W[hs];B[ik];W[kj];B[se]
+;W[sh];B[sg];W[rm];B[kk];W[nl];B[aa];W[ce];B[hl];W[om];B[hm]
+;W[mk];B[li];W[bi];B[bg];W[tt];B[tt]
+)
diff --git a/regression/games/incident272.sgf b/regression/games/incident272.sgf
new file mode 100644 (file)
index 0000000..bc6e169
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.133 ascii]HA[4]KM[0.5]GN[GNU Go 2.7.133 ascii Random Seed 963659676] 
+AB[dd]AB[pd]AB[jj]AB[dp]AB[pp]
+;W[nc];B[qf];W[jc];B[lc];W[pc];B[mb];W[od];B[gc];W[ld];B[qi]
+;W[nq];B[lq];W[qq];B[pq];W[qp];B[po];W[qo];B[kd];W[kc];B[md]
+;W[le];B[ke];W[mc];B[lb];W[mf];B[nb];W[ob];B[kb];W[jb];B[ql]
+;W[fq];B[er];W[iq];B[cm];W[cf];B[ch];W[ef];B[ka];W[ja];B[ed]
+;W[ge];B[lf];W[me];B[lg];W[cc];B[hd];W[je];B[hb];W[kf];B[kg]
+;W[jf];B[io];W[kq];B[lp];W[fo];B[cd];W[dn];B[bf];W[be];B[ck]
+;W[bd];B[eo];W[ep];B[es];W[do];B[en];W[dq];B[cp];W[eq];B[gp]
+;W[go];B[fn];W[hn];B[hp];W[fp];B[bp];W[cr];B[ff];W[gf];B[he]
+;W[fe];B[fg];W[bg];B[eb];W[hg];B[ig];W[if];B[hf];W[gg];B[gs]
+;W[hq];B[dm];W[bi];B[ba];W[bb];B[ca];W[dc];B[qd];W[fc];B[fb]
+;W[ec];B[qc];W[qb];B[gj];W[ng];B[gq];W[gr];B[rb];W[fd];B[eg]
+;W[df];B[qa];W[pb];B[jg];W[hh];B[ra];W[oh];B[lj];W[oj];B[ni]
+;W[oi];B[br];W[cs];B[kr];W[jr];B[kp];W[jq];B[lr];W[jo];B[ko]
+;W[ip];B[qn];W[rn];B[rm];W[pr];B[or];W[qr];B[oq];W[ro];B[no]
+;W[pn];B[qm];W[ol];B[qk];W[qh];B[rh];W[pi];B[qj];W[qg];B[rg]
+;W[pf];B[om];W[nl];B[pl];W[nj];B[mh];W[ii];B[pe];W[of];B[mj]
+;W[nh];B[gm];W[im];B[ij];W[fh];B[dg];W[ei];B[ci];W[bj];B[di]
+;W[ej];B[bk];W[cg];B[dh];W[cj];B[dj];W[bh];B[ek];W[ga];B[ic]
+;W[ib];B[ha];W[gd];B[db];W[cb];B[mi];W[hk];B[hj];W[fk];B[fj]
+;W[fi];B[gk];W[hl];B[gl];W[jl];B[jn];W[ho];B[jp];W[nm];B[on]
+;W[mn];B[lm];W[mo];B[mp];W[ll];B[km];W[ji];B[ki];W[kk];B[kj]
+;W[mm];B[ps];W[qs];B[os];W[oe];B[ln];W[rc];B[rd];W[pk];B[aj]
+;W[ai];B[ak];W[jk];B[sn];W[so];B[sm];W[jm];B[cq];W[dr];B[jh]
+;W[mr];B[js];W[is];B[ks];W[lo];B[bs];W[in];B[mk];W[nk];B[pa]
+;W[oa];B[ik];W[ri];B[sf];W[np];B[nr];W[jo];B[kn];W[oo];B[op]
+;W[nn];B[io];W[pj];B[mq];W[hi];B[jo];W[gi];B[il];W[hm];B[ml]
+;W[mg];B[kl];W[lk];B[gn];W[ih];B[fa];W[da];B[ea];W[ab];B[dk]
+;W[eh];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident278.sgf b/regression/games/incident278.sgf
new file mode 100644 (file)
index 0000000..a404eec
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.133 ascii]HA[2]KM[4.5]GN[GNU Go 2.7.133 ascii Random Seed 963665403] 
+AB[pd]AB[dp]
+;W[qp];B[dd];W[qf];B[oq];W[qm];B[lq];W[nd];B[nc];W[od];B[oc]
+;W[md];B[mc];W[kd];B[lc];W[fc];B[cg];W[fe];B[qe];W[re];B[ec]
+;W[ed];B[eb];W[de];B[cc];W[cd];B[cj];W[fq];B[er];W[dn];B[eo]
+;W[em];B[go];W[hq];B[qr];W[rq];B[oo];W[po];B[jq];W[ip];B[dc]
+;W[ce];B[ek];W[gm];B[hn];W[gk];B[bf];W[bc];B[ch];W[fh];B[bb]
+;W[bd];B[jp];W[io];B[fk];W[fb];B[ab];W[ca];B[cb];W[ea];B[qh]
+;W[pf];B[qk];W[ol];B[oj];W[oh];B[rd];W[rf];B[da];W[db];B[ba]
+;W[fa];B[da];W[qc];B[pc];W[qd];B[rc];W[pe];B[qb];W[qe];B[hh]
+;W[gi];B[cl];W[bn];B[bp];W[cq];B[cp];W[eq];B[dq];W[fr];B[en]
+;W[cm];B[dr];W[jn];B[jh];W[mj];B[ik];W[hm];B[ie];W[ic];B[jc]
+;W[jd];B[ni];W[mi];B[nh];W[mh];B[ld];W[le];B[ke];W[je];B[jb]
+;W[kf];B[ef];W[ee];B[ff];W[he];B[im];W[in];B[ho];W[il];B[ii]
+;W[jm];B[gg];W[df];B[lo];W[ln];B[if];W[jg];B[id];W[hc];B[gd]
+;W[hd];B[ge];W[dg];B[eh];W[eg];B[dh];W[fg];B[hf];W[gc];B[gf]
+;W[ig];B[fd];W[hg];B[gh];W[fi];B[kc];W[kh];B[mn];W[lm];B[rm]
+;W[rn];B[rl];W[ji];B[jj];W[ih];B[hi];W[hj];B[ij];W[kj];B[gj]
+;W[hk];B[og];W[of];B[fj];W[ei];B[fl];W[fm];B[gl];W[hl];B[dk]
+;W[bl];B[mg];W[mf];B[bk];W[dl];B[ck];W[ak];B[aj];W[al];B[mm]
+;W[ml];B[ir];W[hr];B[nf];W[ne];B[ng];W[lg];B[ib];W[jf];B[be]
+;W[ci];B[di];W[bi];B[bh];W[ej];B[hb];W[dj];B[bj];W[el];B[ai]
+;W[do];B[ep];W[fo];B[fp];W[fn];B[gq];W[gr];B[gp];W[iq];B[jr]
+;W[ko];B[no];W[lp];B[mo];W[kp];B[rr];W[mp];B[pm];W[pn];B[mq]
+;W[om];B[pl];W[on];B[bo];W[pk];B[pj];W[ql];B[sk];W[pg];B[ph]
+;W[qj];B[rk];W[rj];B[ri];W[rg];B[an];W[bm];B[co];W[dm];B[rh]
+;W[nj];B[oi];W[ok];B[sr];W[np];B[op];W[nq];B[nr];W[kq];B[kr]
+;W[mr];B[os];W[lr];B[nm];W[nl];B[fs];W[gs];B[es];W[pq];B[pr]
+;W[ps];B[qq];W[pp];B[rp];W[ro];B[sq];W[qs];B[sg];W[sf];B[sh]
+;W[me];B[ac];W[ad];B[sd];W[rb];B[sb];W[se];B[ra];W[ms];B[sm]
+;W[ns];B[or];W[ae];B[sn];W[so];B[sj];W[sp];B[rs];W[ao];B[ap]
+;W[bq];B[rq];W[cs];B[gb];W[jk];B[ga];W[bs];B[br];W[cr];B[ar]
+;W[aq];B[af];W[as];B[ar];W[am];B[ds];W[br];B[ao];W[hp];B[cf]
+;W[gn];B[ar];W[br];B[qg];W[oe];B[cn];W[cr];B[nn];W[bq];B[aq]
+;W[cq];B[cs];W[bs];B[as];W[br];B[tt];W[bs];B[cr];W[bq];B[cq]
+;W[br];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident287.sgf b/regression/games/incident287.sgf
new file mode 100644 (file)
index 0000000..2830287
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.133 ascii]HA[2]KM[-4.5]GN[GNU Go 2.7.133 ascii Random Seed 963670925] 
+AB[pd]AB[dp]
+LB[kc:21][nc:30][qc:17][md:24][nd:29][pf:29][qf:30][pg:24][qi:21][ck:21][dm:24][cn:30][dn:29][fp:29][gp:24][pp:50][cq:17][fq:30][iq:21]
+C[Value of move: 50]
+;W[pp];B[dd];W[qf];B[pf];W[rd];B[qd];W[rc];B[qc];W[fq];B[fp]
+;W[dr];B[dq];W[gq];B[eq];W[cf];B[df];W[bd];B[cd];W[bc];B[cc]
+;W[cb];B[db];W[bb];B[be];W[ce];B[bf];W[cg];B[bg];W[ch];B[bh]
+;W[eh];B[dg];W[ci];B[bi];W[bj];B[cj];W[fh];B[dh];W[di];B[dj]
+;W[ej];B[bk];W[cr];B[bq];W[er];B[ek];W[fj];B[el];W[pg];B[qe]
+;W[qb];B[pb];W[re];B[qg];W[rf];B[qa];W[qh];B[rb];W[ff];B[de]
+;W[ei];B[ca];W[ie];B[fn];W[iq];B[gp];W[jc];B[lc];W[lq];B[hp]
+;W[km];B[hq];W[hr];B[jq];W[ip];B[jp];W[io];B[jo];W[gc];B[fe]
+;W[lb];B[mb];W[kb];B[kc];W[mc];B[md];W[mf];B[me];W[nc];B[nb]
+;W[nq];B[jr];W[kr];B[ir];W[in];B[gr];W[qo];B[es];W[fr];B[fs]
+;W[gs];B[is];W[hs];B[gr];W[gm];B[hn];W[hm];B[jn];W[ho];B[gn]
+;W[im];B[jm];W[ke];B[ld];W[qk];B[nd];W[fm];B[em];W[mo];B[gl]
+;W[go];B[hr];W[fo];B[en];W[eo];B[do];W[jl];B[il];W[hl];B[ik]
+;W[hk];B[gk];W[fl];B[fk];W[hj];B[gj];W[sb];B[hi];W[ij];B[ii]
+;W[hg];B[jj];W[jk];B[kj];W[kh];B[kk];W[kl];B[kn];W[ji];B[gi]
+;W[da];B[ea];W[ge];B[ll];W[lm];B[ln];W[lk];B[ml];W[lj];B[ks]
+;W[mm];B[mk];W[og];B[of];W[nf];B[ol];W[ls];B[kq];W[js];B[lp]
+;W[mp];B[ks];W[lr];B[mn];W[mj];B[nl];W[nm];B[nn];W[om];B[on]
+;W[pm];B[pn];W[qn];B[no];W[js];B[np];W[ks];B[oq];W[nr];B[mr]
+;W[or];B[mq];W[ms];B[os];W[op];B[pq];W[pr];B[lo];W[mq];B[qq]
+;W[qr];B[qp];W[po];B[rq];W[rp];B[ro];W[rn];B[sp];W[rr];B[qm]
+;W[rm];B[ql];W[sn];B[pl];W[rl];B[so];W[ef];B[ee];W[fd];B[gh]
+;W[ed];B[ec];W[ba];B[da];W[eg];B[dc];W[fc];B[fb];W[gb];B[ga]
+;W[ha];B[hb];W[fa];B[ia];W[eb];B[pk];W[qj];B[pj];W[jb];B[oc]
+;W[ga];B[pi];W[qi];B[ph];W[kd];B[ng];W[rg];B[oh];W[qg];B[lf]
+;W[nh];B[mg];W[sr];B[mh];W[ni];B[nj];W[oj];B[ok];W[nk];B[ne]
+;W[oi];B[mi];W[gs];B[hs];W[ds];B[gs];W[ep];B[br];W[li];B[cq]
+;W[ih];B[cs];W[ma];B[na];W[la];B[aj];W[ae];B[af];W[ad];B[bj]
+;W[kf];B[lg];W[kg];B[ra];W[gg];B[hh];W[le];B[nf];W[lh];B[fi]
+;W[oo];B[sa];W[sc];B[tt];W[tt]
+)
diff --git a/regression/games/incident290.sgf b/regression/games/incident290.sgf
new file mode 100644 (file)
index 0000000..a5ef6aa
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.138 ascii]HA[2]KM[2.5]GN[GNU Go 2.7.138 ascii Random Seed 964460010] 
+AB[pd]AB[dp]
+;W[pp];B[dd];W[mp];B[pn];W[qo];B[mn];W[pf];B[mc];W[pj];B[kn]
+;W[jp];B[gq];W[df];B[dh];W[ff];B[ce];W[cf];B[fh];W[fd];B[ec]
+;W[ch];B[qe];W[qf];B[od];W[fc];B[ph];W[oh];B[oi];W[og];B[qi]
+;W[pi];B[qg];W[qj];B[rf];W[ri];B[rh];W[qh];B[sj];W[pg];B[jc]
+;W[rg];B[hc];W[hd];B[re];W[jd];B[rk];W[pl];B[ni];W[qn];B[jr]
+;W[mr];B[hh];W[me];B[kc];W[kd];B[nk];W[on];B[le];W[ld];B[lf]
+;W[mg];B[id];W[ie];B[ic];W[he];B[je];W[md];B[jf];W[lh];B[mf]
+;W[ne];B[nf];W[oe];B[lc];W[ho];B[io];W[ip];B[fo];W[hn];B[jo]
+;W[kp];B[hp];W[hl];B[nm];W[om];B[lj];W[ki];B[gk];W[ik];B[if]
+;W[kl];B[ll];W[nl];B[ii];W[jj];B[kk];W[jl];B[km];W[ml];B[ln]
+;W[mm];B[ci];W[bh];B[cj];W[de];B[be];W[ed];B[dc];W[hf];B[ji]
+;W[kj];B[mk];W[ol];B[nn];W[lm];B[lk];W[ng];B[oo];W[po];B[no]
+;W[op];B[cm];W[fm];B[el];W[fl];B[fk];W[em];B[do];W[dl];B[ek]
+;W[dm];B[cl];W[dk];B[kr];W[lq];B[lr];W[ck];B[bk];W[dj];B[di]
+;W[ej];B[gn];W[gm];B[bf];W[dg];B[nd];W[fi];B[gi];W[fj];B[eg]
+;W[ef];B[gg];W[gf];B[gc];W[gd];B[fe];W[fg];B[eh];W[hg];B[jh]
+;W[gj];B[gh];W[hj];B[ke]
+)
diff --git a/regression/games/incident291.sgf b/regression/games/incident291.sgf
new file mode 100644 (file)
index 0000000..190552d
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.140 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.140 ascii Random Seed 964525991] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[fc];B[cf];W[md];B[pf];W[jf];B[ke];W[mf];B[hd];W[fe];B[lc]
+;W[mc];B[lb];W[hb];B[fg];W[hf];B[ge];W[gf];B[eb];W[ec];B[dc]
+;W[fb];B[db];W[kf];B[ff];W[gd];B[he];W[hc];B[ic];W[ie];B[mb]
+;W[oc];B[id];W[ib];B[jb];W[nb];B[kc];W[ia];B[ed];W[ga];B[ig]
+;W[if];B[fd];W[gc];B[fq];W[qc];B[co];W[ph];B[qh];W[qi];B[pi]
+;W[qg];B[rh];W[pg];B[sh];W[ri];B[rj];W[rg];B[si];W[sg];B[qj]
+;W[np];B[pn];W[pq];B[qq];W[oq];B[qp];W[kq];B[kp];W[lq];B[pr]
+;W[or];B[qr];W[iq];B[hr];W[jq];B[ks];W[ho];B[hp];W[ip];B[io]
+;W[hn];B[jn];W[jm];B[lp];W[mp];B[lo];W[mn];B[jo];W[km];B[mj]
+;W[hq];B[gp];W[ir];B[nm];W[nn];B[gr];W[hs];B[qd];W[pc];B[od]
+;W[ng];B[lh];W[lf];B[jg];W[hj];B[fj];W[ek];B[cl];W[dk];B[ck]
+;W[ej];B[ei];W[gq];B[fo];W[gm];B[fr];W[en];B[ll];W[mm];B[nl]
+;W[fi];B[gi];W[di];B[fh];W[cj];B[ch];W[cn];B[bn];W[bo];B[bp]
+;W[bm];B[ao];W[cm];B[bl];W[dl];B[am];W[bk];B[al];W[ak];B[an]
+;W[bi];B[bh];W[ah];B[ci];W[ag];B[il];W[im];B[nh];W[oh];B[fn]
+;W[fm];B[fk];W[hl];B[fl];W[dn];B[el];W[em];B[na];W[oa];B[ma]
+;W[ae];B[ea];W[fa];B[oi];W[mh];B[ni];W[bc];B[bb];W[ab];B[cb]
+;W[bd];B[lg];W[kl];B[ik];W[hk];B[mg];W[nf];B[ld];W[ml];B[lk]
+;W[mk];B[le];W[nd];B[me];W[ne];B[ja];W[kk];B[lj];W[kj];B[ji]
+;W[ki];B[hg];W[kh];B[kg];W[hi];B[ii];W[nk];B[gg];W[ok];B[pl]
+;W[pk];B[je];W[rd];B[re];W[rc];B[sd];W[ql];B[qm];W[om];B[ol]
+;W[pm];B[rm];W[rl];B[hh];W[jh];B[ih];W[li];B[mi];W[lm];B[qk]
+;W[sm];B[rn];W[sn];B[so];W[sl];B[qo];W[bf];B[dh];W[dj];B[bg]
+;W[ce];B[df];W[de];B[ee];W[cd];B[oo];W[no];B[eo];W[ba];B[ca]
+;W[ac];B[os];W[ns];B[ps];W[mr];B[gs];W[is];B[aa];W[go];B[ba]
+;W[fp];B[ep];W[gp];B[gj];W[do];B[op];W[gn];B[dr];W[pl];B[gl]
+;W[hm];B[on];W[ij];B[jk];W[pb];B[rk];W[sk];B[jl];W[gk];B[cc]
+;W[oj];B[nj];W[sj];B[sc];W[sb];B[rb];W[se];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident297.sgf b/regression/games/incident297.sgf
new file mode 100644 (file)
index 0000000..95de067
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.138 ascii]HA[4]KM[3.5]GN[GNU Go 2.7.138 ascii Random Seed 964297271] 
+AB[dd]AB[pd]AB[dp]AB[pp]
+LB[cc:17][fc:50][ic:22][kc:22][nc:32][qc:17][fd:32][gd:25][md:25][nd:32][cf:32][df:32][pf:32][qf:32][dg:25][pg:25][ci:22][qi:22][ck:22][qk:22][dm:25][pm:25][cn:32][dn:32][pn:32][qn:32][fp:32][gp:25][mp:25][np:32][cq:17][fq:32][iq:22][kq:22][nq:32][qq:17]
+C[Value of move: 50]
+;W[fc];B[gq];W[cf];B[qg];W[ci];B[cl];W[bd];B[mq];W[cc];B[nn]
+;W[nd];B[oc];W[nf];B[pf];W[qn];B[qo];W[mg];B[og];W[go];B[fp]
+;W[io];B[km];W[hl];B[fk];W[fm];B[el];W[nl];B[pj];W[cq];B[dq]
+;W[cp];B[co];W[bo];B[eo];W[fi];B[fl];W[cn];B[dn];W[do];B[fn]
+;W[gm];B[cm];W[jp];B[co];W[bn];B[gn];W[hn];B[em];W[ql];B[pn]
+;W[pm];B[rn];W[qm];B[nj];W[rj];B[qj];W[rm];B[rp];W[sn];B[ro]
+;W[bk];B[gl];W[hp];B[hm];W[iq];B[in];W[kq];B[kn];W[mm];B[jo]
+;W[jr];B[ho];W[mk];B[ip];W[mn];B[mo];W[mr];B[kp];W[io];B[hq]
+;W[hn];B[lq];W[lr];B[ho];W[ip];B[hn];W[on];B[po];W[no];B[oo]
+;W[nm];B[np];W[gp];B[fo];W[gs];B[ir];W[jq];B[js];W[kr];B[hr]
+;W[is];B[hs];W[or];B[nr];W[ks];B[ms];W[is];B[fq];W[ee];B[js]
+;W[dr];B[ls];W[fs];B[er];W[cr];B[es];W[bl];B[bm];W[am];B[hk]
+;W[il];B[jk];W[ri];B[mj];W[ol];B[lk];W[sf];B[re];W[se];B[rd]
+;W[sd];B[rc];W[nn];B[nk];W[ml];B[so];W[sm];B[qk];W[ic];B[ok]
+;W[ff];B[rk];W[rh];B[rf];W[rg];B[rl];W[ji];B[ii];W[dk];B[sj]
+;W[jj];B[ik];W[do];B[ll];W[co];B[ds];W[nc];B[si];W[ob];B[pb]
+;W[nb];B[qh];W[ng];B[nh];W[kj];B[kk];W[oe];B[pe];W[pa];B[qa]
+;W[oa];B[qb];W[ck];B[qi];W[ek];B[ig];W[ie];B[kg];W[lf];B[lg]
+;W[mh];B[lh];W[mi];B[lj];W[li];B[jh];W[kh];B[ki];W[hh];B[ij]
+;W[hg];B[if];W[jf];B[kf];W[ke];B[le];W[ld];B[jd];W[je];B[id]
+;W[jg];B[kh];W[me];B[ih];W[hf];B[hc];W[ib];B[hd];W[gb];B[he]
+;W[fj];B[gj];W[ni];B[oh];W[oi];B[ph];W[hi];B[gi];W[gh];B[of]
+;W[kc];B[od];W[ne];B[ln];W[dl];B[dm];W[hj];B[gk];W[cs];B[fr]
+;W[oj];B[pk];W[pi];B[pl];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident42.sgf b/regression/games/incident42.sgf
new file mode 100644 (file)
index 0000000..c1eda99
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.37 gmp]HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+KM[5.5]GN[GNU Go 2.3.37 gmp Random Seed 0] 
+;W[fq];B[fp];W[dq];B[gq];W[fr];B[cq];W[cr];B[bq];W[br];B[eq]
+;W[dr];B[er];W[es];B[ep];W[gr];B[fs];W[gs];B[ds];W[cs];B[cp]
+;W[hq];B[gp];W[hp];B[ho];W[mp];B[pn];W[pl];B[nn];W[pg];B[nd]
+;W[ld];B[nf];W[oe];B[ne];W[od];B[oc];W[of];B[nc];W[pc];B[qd]
+;W[qc];B[rc];W[rb];B[rd];W[ob];B[qh];W[qg];B[nb];W[pa];B[ph]
+;W[sb];B[og];W[pf];B[rg];W[rf];B[rh];W[sc];B[ng];W[dc];B[cc]
+;W[cd];B[bc];W[bd];B[ec];W[db];B[eb];W[de];B[ed];W[ee];B[ce]
+;W[be];B[cf];W[bf];B[cg];W[bg];B[ef];W[fe];B[eg];W[ch];B[ff]
+;W[ge];B[ci];W[dg];B[df];W[dh];B[gf];W[he];B[re];W[se];B[sd]
+;W[sf];B[sg];W[qf];B[lo];W[hf];B[mn];W[jr];B[nq];W[np];B[lr]
+;W[lq];B[kr];W[kq];B[mq];W[oq];B[mr];W[or];B[no];W[eh];B[gg]
+;W[hh];B[gh];W[gi];B[op];W[lp];B[jq];W[hg];B[ir];W[kf];B[hr]
+;W[el];B[fj];W[gj];B[fi];W[fh];B[cl];W[cm];B[dm];W[dl];B[bl]
+;W[cn];B[dn];W[ao];B[bo];W[aq];B[hs];W[bn];B[dk];W[em];B[bj]
+;W[ck];B[co];W[en];B[do];W[fk];B[di];W[bi];B[gk];W[ek];B[ej]
+;W[ei];B[cj];W[hl];B[gl];W[gm];B[hk];W[ik];B[hj];W[ij];B[hi]
+;W[ii];B[il];W[hm];B[fn];W[jl];B[fm];W[im];B[pq];W[ml];B[os]
+;W[mi];B[pr];W[oh];B[oi];W[nh];B[ai];W[rk];B[bh];W[gc];B[ae]
+;W[lb];B[ad];W[rn];B[qm];W[ql];B[rm];W[nk];B[ic];W[gb];B[hb]
+;W[le];B[ro];W[qa];B[jf];W[jh];B[lj];W[ll];B[nj];W[rj];B[mh]
+;W[mj];B[ni];W[qi];B[li];W[mk];B[lh];W[lg];B[jg];W[kh];B[kg]
+;W[je];B[ie];W[ke];B[if];W[ig];B[id];W[kb];B[mg];W[lf];B[ok]
+;W[ol];B[ko];W[gn];B[go];W[io];B[iq];W[jn];B[ip];W[rl];B[sn]
+;W[kn];B[nr];W[ln];B[nm];W[nl];B[ri];W[qj];B[si];W[oh];B[hn]
+;W[fb];B[ea];W[fa];B[jo];W[in];B[km];W[kl];B[mm];W[lm];B[bm]
+;W[fd];B[da];W[pm];B[an];W[sl];B[ag];W[qo];B[qn];W[on];B[ap]
+;W[oo];B[ar];W[po];B[rn];W[qp];B[rp];W[qq];B[qr];W[rq];B[rr]
+;W[sq];B[sr];W[fc];B[cb];W[om];B[mo];W[jb];B[mb];W[ib];B[hc]
+;W[ha];B[ia];W[ja];B[pk];W[pi];B[pe];W[qe];B[oj];B[la];B[sj]
+;B[na];B[nh];B[mf];B[oa];W[pb];B[me];B[lc];W[kc];B[mc];W[kd]
+;B[md];W[ia];B[lk];W[jk];B[ji];W[ih]
+)
diff --git a/regression/games/incident55.sgf b/regression/games/incident55.sgf
new file mode 100644 (file)
index 0000000..4f5babc
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]
+PB[Gnu Go 1.121]PW[gmp]HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+KM[0.5]GN[seed 924272829]
+;W[qf];B[nc];W[pm];B[np];W[nj];B[qo];W[qn];B[pf];W[pg];B[qe]
+;W[of];B[pe];W[og];B[qg];W[qh];B[rf];W[rg];B[rh];W[qf];B[ri]
+;W[qg];B[re];W[sg];B[ql];W[ro];B[rp];W[rn];B[fc];W[cn];B[fq]
+;W[cq];B[cp];W[bp];B[bo];W[br];B[co];W[er];B[fo];W[fr];B[gq]
+;W[qq];B[qp];W[rq];B[sp];W[or];B[gr];W[nq];B[ce];W[mp];B[lq]
+;W[mq];B[cl];W[cc];B[bn];W[be];B[bd];W[cd];B[bf];W[de];B[ae]
+;W[ed];B[dc];W[cf];B[ee];W[be];B[fd];W[db];B[ec];W[ce];B[bg]
+;W[ch];B[cg];W[dg];B[fg];W[bh];B[af];W[di];B[bc];W[eb];B[cb]
+;W[bb];B[df];W[ca];B[cc];W[ip];B[ab];W[jq];B[iq];W[kq];B[kp]
+;W[lp];B[lr];W[jo];B[ko];W[kn];B[kr];W[jr];B[lo];W[mo];B[ln]
+;W[lm];B[mn];W[nn];B[mm];W[ml];B[ba];W[lc];B[ld];W[kd];B[kc]
+;W[ke];B[lb];W[jc];B[mc];W[kb];B[jb];W[lc];B[ic];W[kc];B[id]
+;W[mb];B[nb];W[la];B[ib];W[hj];B[md];W[cj];B[fb];W[ck];B[dk]
+;W[bl];B[dl];W[fi];B[bm];W[bk];B[il];W[gl];B[eg];W[hm];B[dh]
+;W[eh];B[hp];W[nm];B[ir];W[js];B[ap];W[bq];B[ih];W[ii];B[ji]
+;W[jh];B[cm];W[jg];B[hh];W[gi];B[hi];W[ij];B[gj];W[gk];B[fj]
+;W[ej];B[ek];W[fk];B[ah];W[bi];B[oq];W[pr];B[oi];W[mi];B[nh]
+;W[mf];B[jk];W[gh];B[hg];W[gg];B[hf];W[gf];B[ok];W[pl];B[pk]
+;W[sl];B[qj];W[rk];B[qk];W[he];B[if];W[ie];B[jf];W[je];B[kf]
+;W[lh];B[kg];W[kh];B[le];W[lf];B[sq];W[rr];B[ai];W[aj];B[ag]
+;W[fm];B[en];W[em];B[dm];W[ho];B[aq];W[ar];B[ao];W[eq];B[am]
+;W[ep];B[go];W[gn];B[al];W[ak];B[ja];W[gd];B[ka];W[lb];B[na]
+;W[sf];B[se];W[oe];B[ma];W[od];B[oc];W[qc];B[pc];W[pb];B[rb]
+;W[rc];B[sc];W[qb];B[dg];W[me];B[gc];W[nd];B[fh];W[ei];B[el]
+;W[eo];B[fn];W[do];B[dn];W[dq];B[fs];W[es];B[gs];W[is];B[fl]
+;W[gm];B[mr];W[fp];B[gp];W[hr];B[nr];W[hq];B[hs];W[ff];B[sr]
+;W[os];B[qs];W[pq];B[rs];W[op];B[po];W[hd];B[oo];W[no];B[hc]
+;W[ge];B[ef];W[ra];B[sb];W[qa];B[sd];W[fe];B[tt];W[oa];B[ob]
+;W[pa];B[sa];W[tt];B[tt]
+)
diff --git a/regression/games/incident59.sgf b/regression/games/incident59.sgf
new file mode 100644 (file)
index 0000000..0c86729
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.67 ascii]KM[0.5]GN[GNU Go 2.3.67 ascii Random Seed 0]
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[nc];B[qf];W[kc];B[jc];W[of];B[nd];W[oc];B[od];W[md];B[gd]
+;W[cc];B[dc];W[cd];B[ce];W[be];B[cf];W[bf];B[cg];W[qh];B[ph]
+;W[pg];B[qg];W[pi];B[oi];W[oh];B[ni];W[qc];B[ne];W[nf];B[qd]
+;W[rd];B[re];W[rc];B[me];W[ke];B[kd];W[ld];B[le];W[kf];B[mc]
+;W[lc];B[mb];W[pc];B[kb];W[qj];B[pk];W[qk];B[pl];W[qm];B[mg]
+;W[nh];B[mf];W[mh];B[mp];W[pm];B[gp];W[nk];B[ok];W[nj];B[oj]
+;W[mi];B[nl];W[om];B[ol];W[mn];B[nn];W[nm];B[ml];W[lk];B[no]
+;W[mm];B[ll];W[kk];B[km];W[qq];B[qp];W[pq];B[oq];W[or];B[nq]
+;W[nr];B[mr];W[rp];B[ro];W[rq];B[qo];W[lq];B[lp];W[kq];B[jq]
+;W[mq];B[kp];W[jl];B[ms];W[kr];B[jr];W[ls];B[dm];W[ee];B[ed]
+;W[gf];B[de];W[dh];B[bg];W[db];B[eb];W[fj];B[cb];W[bb];B[da]
+;W[ba];B[ei];W[fh];B[eh];W[eg];B[dg];W[dk];B[fg];W[ef];B[gg]
+;W[hg];B[gh];W[fi];B[ff];W[hi];B[ck];W[dl];B[ch];W[ej];B[fe]
+;W[di];B[eh];W[ei];B[hf];W[cl];B[ci];W[cq];B[cp];W[dq];B[hh]
+;W[ih];B[eq];W[er];B[fq];W[fr];B[cj];W[bp];B[bo];W[bq];B[ig]
+;W[co];B[bn];W[do];B[ep];W[en];B[ii];W[jh];B[bl];W[hq];B[cm]
+;W[em];B[hp];W[iq];B[ip];W[gq];B[hm];W[im];B[el];W[fl];B[ek]
+;W[gm];B[fk];W[gk];B[hn];W[fo];B[fp];W[hl];B[eo];W[dn];B[hj]
+;W[gj];B[gi];W[kn];B[jm];W[in];B[jn];W[ln];B[gn];W[fn];B[lg]
+;W[ki];B[nb];W[ob];B[ir];W[gr];B[jg];W[kh];B[kg];W[io];B[jo]
+;W[ql];B[sh];W[rh];B[rg];W[si];B[sg];W[rm];B[af];W[ad];B[hr]
+;W[hs];B[gs];W[fs];B[is];W[ns];B[ho];W[il];B[rn];W[on];B[oo]
+;W[hk];B[pn];W[qn];B[ik];W[pe];B[qe];W[ae];B[bc];W[se];B[ag]
+;W[sd];B[sf];W[na];B[ma];W[oa];B[ap];W[aq];B[ao];W[kj];B[sp]
+;W[sq];B[pr];W[lr];B[so];W[qr];B[sm];W[rj];B[sk];W[ng];B[rl]
+;W[lh];B[po];W[jk];B[ji];W[ij];B[hi];W[eh];B[ik];W[ca];B[ac]
+;W[db];B[ea];W[ij];B[gs];W[dr];B[hs];W[ik];B[sj];W[ri];B[sl]
+;W[tt];B[pf];W[oe];B[cn];W[gl];B[df];W[fm];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident64.sgf b/regression/games/incident64.sgf
new file mode 100644 (file)
index 0000000..69039fd
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.87 ascii]HA[8]KM[0.5]GN[GNU Go 2.3.87 ascii Random Seed 0] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]
+;W[nq];B[pn];W[gp];B[dn];W[pr];B[qq];W[no];B[gd];W[md];B[pf]
+;W[mf];B[cg];W[ph];B[hq];W[gq];B[hp];W[ho];B[go];W[gr];B[hr]
+;W[io];B[jq];W[jo];B[ni];W[og];B[lp];W[lo];B[mq];W[mp];B[lq]
+;W[nr];B[qr];W[fo];B[gn];W[fn];B[gm];W[fm];B[fp];W[gl];B[hm]
+;W[hl];B[im];W[eq];B[ep];W[dq];B[fl];W[el];B[fk];W[ek];B[em]
+;W[fj];B[gk];W[hk];B[gj];W[gi];B[hj];W[ij];B[km];W[ko];B[mr]
+;W[mm];B[jk];W[jj];B[ll];W[ml];B[lh];W[hi];B[lj];W[cp];B[kk]
+;W[do];B[eo];W[co];B[cn];W[cl];B[ck];W[bl];B[bk];W[dk];B[cj]
+;W[pl];B[om];W[ol];B[rn];W[rl];B[rj];W[qm];B[qg];W[qh];B[rh]
+;W[qi];B[qj];W[ri];B[rg];W[sj];B[sk];W[si];B[rk];W[sl];B[nc]
+;W[pq];B[mc];W[ke];B[ld];W[le];B[lc];W[kg];B[jc];W[mg];B[if]
+;W[kh];B[oc];W[oj];B[oi];W[nj];B[pi];W[mj];B[mi];W[pk];B[ps]
+;W[os];B[oq];W[or];B[op];W[np];B[qs];W[qn];B[qp];W[ro];B[rp]
+;W[so];B[sp];W[qo];B[po];W[nm];B[al];W[am];B[ak];W[bn];B[ff]
+;W[on];B[pm];W[oo];B[ei];W[rr];B[rs];W[sr];B[fh];W[ig];B[gs]
+;W[fr];B[hf];W[hs];B[is];W[ms];B[ls];W[kp];B[kr];W[kq];B[ns]
+;W[ip];B[hg];W[iq];B[jr];W[ir];B[js];W[ms];B[lr];W[hs];B[hr]
+;W[ki];B[li];W[kj];B[ne];W[me];B[oe];W[of];B[gh];W[hh];B[jg]
+;W[ih];B[jf];W[jh];B[il];W[jn];B[je];W[pg];B[qf];W[kf];B[kd]
+;W[fi];B[nd];W[ej];B[di];W[fl];B[sh];W[mk];B[nf];W[ng];B[ns]
+;W[mn];B[hq];W[hp];B[hs];W[en];B[fs];W[fq];B[es];W[dr];B[ds]
+;W[cr];B[cs];W[br];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident66.sgf b/regression/games/incident66.sgf
new file mode 100644 (file)
index 0000000..4d2de8e
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.3.89 ascii]HA[2]KM[0.5]GN[GNU Go 2.3.89 ascii Random Seed 935660591] 
+AB[gc]AB[cg]
+;W[df];B[cd];W[cf];B[dg];W[eg];B[eh];W[fg];B[ef];W[fh];B[dh]
+;W[bg];B[bh];W[af];B[ci];W[ah];B[ei];W[bi];B[ai];W[ee];B[ff]
+;W[bi];B[ch];W[fi];B[ai];W[gf];B[ag];W[bf];B[ah];W[fe];B[ec]
+;W[hd];B[hc];W[gd];B[id];W[ie];B[fd];W[ic];B[hb];W[ib];B[ed]
+;W[bc];B[cc];W[bd];B[de];W[ce];B[dd];W[cb];B[db];W[bb];B[ha]
+;W[da];B[fb];W[ea];B[eb];W[fa];B[ca];W[ba];B[ga];W[ca];B[ia]
+;W[id];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident67.sgf b/regression/games/incident67.sgf
new file mode 100644 (file)
index 0000000..31f7535
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.3.89 gmp]HA[0]KM[5.5]GN[GNU Go 2.3.89 gmp Random Seed 935665951] 
+;B[cc];W[ee];B[dd];W[fc];B[ed];W[fd];B[gg];W[fe];B[cg];W[fg]
+;B[eg];W[gh];B[ff];W[fh];B[ef];W[gf];B[hg];W[hf];B[hh];W[ig]
+;B[hi];W[eh];B[dh];W[df];B[ei];W[dg];B[eb];W[gi];B[cf];W[ch]
+;B[de];W[fb];B[fa];W[ga];B[ea];W[ec];B[db];W[dc];B[cb];W[hb]
+;B[bh];W[di];B[cd];W[bi];B[bf];W[ah];B[bg];W[tt];B[tt]
+)
diff --git a/regression/games/incident72.sgf b/regression/games/incident72.sgf
new file mode 100644 (file)
index 0000000..d8d3e8e
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[1999-08-27]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];B[jb]BL[1799];W[kb]WL[1799];B[ja]
+BL[1797];W[lb]WL[1798];B[kc]BL[1792];W[la]WL[1796];B[lc]BL[1792];W[mb]
+WL[1795];B[mc]BL[1791];W[nb]WL[1795];B[nc]BL[1790];W[na]WL[1794];B[ob]
+BL[1790];W[jc]WL[1793];B[ic]BL[1788];W[ib]WL[1791];B[hc]BL[1788];W[hb]
+WL[1790];B[gc]BL[1787];W[ha]WL[1789];B[oa]BL[1785];W[gb]WL[1788];B[oc]
+BL[1783];W[fb]WL[1787];B[fc]BL[1782];W[fa]WL[1787];B[eb]BL[1781];W[jd]
+WL[1777];B[ea]BL[1780];W[kd]WL[1774];B[ec]BL[1774];W[kf]WL[1768];B[dc]
+BL[1772];W[he]WL[1764];B[cc]BL[1771];W[me]WL[1761];B[pd]BL[1766];W[oe]
+WL[1668];B[qd]BL[1766];W[pe]WL[1667];B[qe]BL[1765];W[qf]WL[1667];B[re]
+BL[1760];W[rf]WL[1665];B[sf]BL[1758];W[qg]WL[1661];B[rg]BL[1758];W[qh]
+WL[1660];B[rh]BL[1757];W[ri]WL[1659];B[si]BL[1757];W[qi]WL[1657];B[rj]
+BL[1756];W[qj]WL[1657];B[rk]BL[1754];W[qk]WL[1657];B[sk]BL[1753];W[ql]
+WL[1656];B[rl]BL[1752];W[rm]WL[1655];B[sm]BL[1751];W[qm]WL[1654];B[rn]
+BL[1749];W[qn]WL[1653];B[sn]BL[1745];W[qo]WL[1652];B[ro]BL[1744];W[rp]
+WL[1651];B[sp]BL[1735];W[qp]WL[1643];B[rq]BL[1732];W[qq]WL[1642];B[sq]
+BL[1732];W[rr]WL[1641];B[sr]BL[1731];W[qr]WL[1639];B[rs]BL[1730];W[pq]
+WL[1638];B[qs]BL[1729];W[oq]WL[1637];B[pr]BL[1728];W[nr]WL[1635];B[or]
+BL[1727];W[nq]WL[1582];B[ns]BL[1726];W[oo]WL[1580];B[mr]BL[1722];W[mq]
+WL[1579];B[lr]BL[1721];W[lq]WL[1578];B[kr]BL[1719];W[kq]WL[1533];B[ls]
+BL[1718];W[jr]WL[1525];B[jq]BL[1717];W[js]WL[1520];B[iq]BL[1715];W[ir]
+WL[1517];B[hr]BL[1710];W[hs]WL[1516];B[hq]BL[1709];W[gr]WL[1516];B[gq]
+BL[1708];W[fr]WL[1515];B[fq]BL[1707];W[fs]WL[1511];B[eq]BL[1706];W[er]
+WL[1511];B[dr]BL[1705];W[ds]WL[1509];B[dq]BL[1704];W[cs]WL[1496];B[cr]
+BL[1704];W[bs]WL[1495];B[br]BL[1703];W[ar]WL[1494];B[cq]BL[1700];W[bq]
+WL[1493];B[cp]BL[1699];W[bp]WL[1493];B[co]BL[1698];W[aq]WL[1490];B[bo]
+BL[1697];W[ao]WL[1489];B[bn]BL[1674];W[an]WL[1488];B[cm]BL[1674];W[bm]
+WL[1487];B[cl]BL[1673];W[bl]WL[1486];B[bk]BL[1653];W[ak]WL[1485];B[ck]
+BL[1651];W[bj]WL[1484];B[cj]BL[1650];W[bi]WL[1414];B[ci]BL[1649];W[ah]
+WL[1413];B[bh]BL[1648];W[bg]WL[1403];B[ch]BL[1647];W[ag]WL[1403];B[cg]
+BL[1646];W[cf]WL[1402];B[bf]BL[1645];W[be]WL[1401];B[cb]BL[1638];W[ce]
+WL[1397];B[bb]BL[1637];W[bd]WL[1370];B[ab]BL[1636];W[bc]WL[1369];B[qb]
+BL[1627];W[ac]WL[1363];B[kp]BL[1612];W[jp]WL[1360];B[lp]BL[1608];W[jo]
+WL[1359];B[lo]BL[1607];W[jn]WL[1358];B[ln]BL[1606];W[jm]WL[1356];B[km]
+BL[1605];W[kl]WL[1355];B[lm];W[ll];B[jl];W[ml];B[il];W[mm];B[im];W[mn]
+;B[in];W[mo];B[io];W[mp];B[ip];W[jk];B[kk];W[ik];B[kj];W[ij];B[ki];
+W[ii];B[kh];W[ih];B[kg];W[ig];B[jf];W[jg];B[if];W[lf];B[hf];W[lg];
+B[hg];W[lh];B[hh];W[li];B[hi];W[lj];B[hj];W[lk];B[hk];W[dg];B[df];
+W[dh];B[de];W[dd];B[ee];W[ed];B[fe];W[fd];B[ff];W[ge];B[fg];W[gf];
+B[eg];W[gg];B[qc];W[fh];B[gh];W[fi];B[gi];W[fj];B[gj];W[ek];B[fk];
+W[dk];B[el];W[dj];B[dl];W[di];B[gl];W[ei];B[ca];W[cd];B[id];W[gd];
+B[ie];W[ke];B[ld];W[ne];B[pb];W[le];B[je];W[md];B[nd];W[od];B[hd];
+W[am];B[os];W[ai];B[sh];W[ji]
+)
diff --git a/regression/games/incident73.sgf b/regression/games/incident73.sgf
new file mode 100644 (file)
index 0000000..27745fa
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.90 ascii]HA[9]KM[5.5]GN[GNU Go 2.3.90 ascii Random Seed 935919026] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[cd];B[cc];W[ce];B[bc];W[bd];B[gq];W[de];B[ed];W[ci];B[cj]
+;W[di];B[bi];W[bh];B[bj];W[cg];B[mc];W[qc];B[pc];W[qd];B[pe]
+;W[qe];B[mq];W[pf];B[pm];W[pi];B[dm];W[of];B[ff];W[ef];B[fe]
+;W[eg];B[gh];W[fg];B[gg];W[fi];B[ej];W[fj];B[ei];W[eh];B[fh]
+;W[cq];B[cp];W[dq];B[eq];W[bp];B[bo];W[aq];B[fq];W[ep];B[eo]
+;W[co];B[fp];W[bn];B[do];W[cn];B[em];W[dn];B[en];W[er];B[fr]
+;W[ds];B[fk];W[cm];B[gj];W[cl];B[le];W[mf];B[lf];W[lg];B[kg]
+;W[lh];B[jh];W[ni];B[qi];W[ph];B[oj];W[nj];B[ri];W[qh];B[lk]
+;W[nk];B[rh];W[ml];B[ll];W[rg];B[sg];W[sf];B[sh];W[qf];B[qj]
+;W[ol];B[pl];W[lj];B[kk];W[om];B[me];W[nf];B[no];W[pb];B[ob]
+;W[qa];B[nb];W[oe];B[oc];W[nd];B[mk];W[nl];B[mn];W[on];B[pn]
+;W[oo];B[op];W[qq];B[qp];W[pq];B[or];W[oq];B[pr];W[qr];B[nq]
+;W[rp];B[so];W[ro];B[qn];W[sn];B[rm];W[rn];B[sm];W[sp];B[lm]
+;W[nn];B[mo];W[mm];B[md];W[hc];B[hd];W[jc];B[gc];W[id];B[ie]
+;W[ic];B[kd];W[kc];B[he];W[gb];B[lb];W[kb];B[fc];W[fb];B[ec]
+;W[eb];B[db];W[ha];B[lc];W[la];B[ma];W[ka];B[nc];W[da];B[ca]
+;W[ea];B[ah];W[ag];B[ai];W[kh];B[jg];W[kj];B[oi];W[oh];B[ok]
+;W[mj];B[ad];W[ae];B[ac];W[dl];B[el];W[bk];B[dk];W[ck];B[ps]
+;W[qs];B[nr];W[po];B[oa];W[pa];B[fs];W[es];B[ji];W[ki];B[jk]
+;W[qo];B[np];W[ql];B[qm];W[rl];B[qk];W[sl];B[pk];W[sj];B[rj]
+;W[sk];B[aj];W[ak];B[gi];W[rk];B[si];W[sk];B[ee];W[rl];B[od]
+;W[rk];B[ne];W[sl];B[tt];W[sj];B[ql];W[sk];B[sj];W[sl];B[rf]
+;W[qg];B[re];W[rd];B[se];W[sd];B[rk];W[sf];B[rl];W[sl];B[tt]
+;W[sk];B[tt];W[bb];B[cb];W[tt];B[tt]
+)
diff --git a/regression/games/incident74.sgf b/regression/games/incident74.sgf
new file mode 100644 (file)
index 0000000..d309e5a
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.91 ascii]HA[4]KM[0.5]GN[GNU Go 2.3.91 ascii Random Seed 936106346] 
+AB[pd]AB[dp]AB[dd]AB[pp]
+;W[nq];B[lq];W[no];B[pn];W[ln];B[jc];W[fp];B[iq];W[dq];B[cq]
+;W[dr];B[cp];W[gn];B[dl];W[gr];B[qh];W[df];B[fd];W[cd];B[cc]
+;W[ce];B[bc];W[dj];B[fl];W[fj];B[pk];W[om];B[mc];W[pf];B[hr]
+;W[gq];B[rf];W[qe];B[oh];W[nf];B[pm];W[on];B[nr];W[or];B[mr]
+;W[oq];B[qd];W[re];B[qf];W[pe];B[od];W[rd];B[hl];W[in];B[cr]
+;W[hq];B[ir];W[jp];B[jq];W[js];B[is];W[kq];B[kp];W[kr];B[ks]
+;W[ls];B[jr];W[ip];B[ks];W[lp];B[lr];W[ko];B[mp];W[kq];B[mq]
+;W[ns];B[ms];W[os];B[np];W[op];B[ik];W[kr];B[kp];W[kq];B[ds]
+;W[es];B[cs];W[fr];B[eq];W[er];B[ep];W[en];B[le];W[lg];B[mg]
+;W[ng];B[nh];W[mf];B[mh];W[lf];B[ki];W[lj];B[jg];W[jf];B[lh]
+;W[kg];B[jh];W[if];B[gi];W[gj];B[eh];W[dh];B[fh];W[ff];B[hd]
+;W[hf];B[kl];W[ll];B[cn];W[dm];B[cm];W[el];B[dk];W[ek];B[cj]
+;W[ci];B[ck];W[bi];B[hh];W[hj];B[gf];W[ge];B[gg];W[gd];B[gc]
+;W[fc];B[fe];W[he];B[ef];W[ed];B[dc];W[ee];B[gb];W[ea];B[eg]
+;W[de];B[hc];W[ca];B[fb];W[eb];B[ec];W[fd];B[ba];W[ad];B[da]
+;W[db];B[cb];W[ac];B[nj];W[aa];B[bb];W[ab];B[da];W[bd];B[fa]
+;W[ke];B[ol];W[nl];B[ok];W[qg];B[rg];W[pg];B[ph];W[qc];B[ob]
+;W[pb];B[ld];W[kd];B[kc];W[nd];B[nc];W[md];B[jd];W[je];B[bj]
+;W[dn];B[ai];W[ah];B[aj];W[bg];B[mo];W[lo];B[mn];W[nn];B[jm]
+;W[kk];B[jk];W[km];B[jl];W[jn];B[pq];W[pr];B[qr];W[qq];B[rr]
+;W[qp];B[po];W[qo];B[mm];W[nm];B[ml];W[mk];B[lm];W[lk];B[nk]
+;W[kp];B[kn];W[kr];B[km];W[gs];B[js];W[hs];B[ls];W[qn];B[qm]
+;W[rq];B[sr];W[sq];B[rm];W[qs];B[oo];W[rs];B[ps];W[rn];B[ei]
+;W[sn];B[ej];W[rp];B[so];W[do];B[ro];W[co];B[di];W[bo];B[fk]
+;W[em];B[ch];W[bh];B[dg];W[cg];B[bp];W[am];B[ap];W[ao];B[eo]
+;W[fo];B[fm];W[fn];B[hk];W[gm];B[hm];W[hn];B[im];W[gl];B[gk]
+;W[bl];B[cl];W[bk];B[pa];W[qa];B[oa];W[qb];B[ig];W[hg];B[id]
+;W[me];B[lc];W[oe];B[oc];W[og];B[bn];W[an];B[ak];W[al];B[sf]
+;W[se];B[rh];W[fe];B[fg];W[ie];B[dh];W[fq];B[kh];W[tt];B[pc]
+;W[sc];B[dj];W[tt];B[bm];W[tt];B[tt]
+)
diff --git a/regression/games/incident79.sgf b/regression/games/incident79.sgf
new file mode 100644 (file)
index 0000000..765a48c
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.9 gmp]HA[0]KM[5.5]GN[GNU Go 2.3.9 gmp Random Seed 0] 
+;B[pc];W[ec];B[pp];W[ep];B[cd];W[cp];B[df];W[ck];B[gc];W[ch]
+;B[bg];W[ee];B[fb];W[jq];B[bi];W[bh];B[ah];W[ci];B[ed];W[fd]
+;B[dd];W[bj];B[he];W[ai];B[ag];W[cg];B[bf];W[cf];B[be];W[de]
+;B[dg];W[ce];B[qg];W[eh];B[ql];W[fe];B[hh];W[fc];B[mq];W[mo]
+;B[kr];W[jr];B[js];W[is];B[ks];W[hr];B[gj];W[kq];B[lr];W[lq]
+;B[mr];W[qq];B[pq];W[qp];B[qo];W[pr];B[rp];W[qr];B[sq];W[po]
+;B[oo];W[ro];B[pn];W[rq];B[rn];W[sp];B[qn];W[eb];B[gb];W[bc]
+;B[bd];W[cc];B[dc];W[db];B[ac];W[ae];B[cb];W[bb];B[ab];W[ca]
+;B[ad];W[bi];B[af];W[gl];B[nm];W[ik];B[ji];W[ek];B[lm];W[kk]
+;B[li];W[mk];B[lk];W[pj];B[rj];W[jm];B[ml];W[jo];B[nk];W[mj]
+;B[lj];W[mi];B[mh];W[ni];B[kl];W[jl];B[fi];W[lh];B[kh];W[lg]
+;B[nh];W[oi];B[lc];W[pl];B[pm];W[qk];B[rl];W[rk];B[ol];W[pk]
+;B[sk];W[ri];B[qj];W[qi];B[sj];W[rg];B[rf];W[rh];B[qe];W[oh]
+;B[ng];W[me];B[og];W[nc];B[mb];W[nb];B[ph];W[pi];B[od];W[mc]
+;B[lb];W[pb];B[qb];W[ob];B[jf];W[lf];B[ke];W[or];B[kg];W[oq]
+;B[np];W[pf];B[pg];W[pe];B[pd];W[ld];B[nf];W[kd];B[jd];W[jb]
+;B[kc];W[jc];B[ib];W[la];B[ka];W[ma];B[na];W[ja];B[ic];W[ma]
+;B[la];W[gf];B[hf];W[fg];B[kf];W[le];B[op];W[lp];B[kn];W[jn]
+;B[km];W[nn];B[on];W[nr];B[mn];W[no];B[lo];W[mp];B[nq];W[ko]
+;B[ej];W[dj];B[fk];W[fl];B[el];W[dk];B[em];W[cn];B[fn];W[gn]
+;B[go];W[hn];B[fo];W[hp];B[ho];W[io];B[do];W[dp];B[co];W[bo]
+;B[eo];W[gq];B[ei];W[hk];B[fp];W[fq];B[en];W[gh];B[fj];W[hj]
+;B[hi];W[gi];B[cm];W[bm];B[dm];W[hg];B[fh];W[gg];B[ig];W[fa]
+;B[ga];W[ea];B[cl];W[bl];B[gm];W[fm];B[hm];W[in];B[nd];W[ms]
+;B[md];W[oa];B[ia];W[ma];B[kb];W[kj];B[ki];W[so];B[sn];W[sr]
+;B[jj];W[jk];B[si];W[gd];B[hd];W[ij];B[ii];W[ge];B[sh];W[sg]
+;B[sl];W[sf];B[ls];W[ns];B[re];W[se];B[rd];W[sd];B[rc];W[sc]
+;B[ra];W[ln];B[sb];W[mm];B[ll];W[mn]
+)
diff --git a/regression/games/incident80.sgf b/regression/games/incident80.sgf
new file mode 100644 (file)
index 0000000..9ba8912
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.36 gmp]HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+KM[5.5]GN[GNU Go 2.3.36 gmp Random Seed 0] 
+LB[cc:70][fc:72][nc:72][qc:70][fd:71][gd:71][md:71][nd:71][cf:72][df:71][pf:71][qf:72][dg:71][pg:71][dm:71][pm:71][cn:72][dn:71][pn:71][qn:72][fp:71][gp:71][mp:71][np:71][cq:70][fq:72][nq:72][qq:70]
+C[Value of move: 74]
+;W[nc];B[qf];W[pc];B[qc];W[qb];B[rc];W[ob];B[rb];W[od];B[le]
+;W[nd];B[nf];W[mb];B[kc];W[qn];B[nq];W[qp];B[qq];W[rq];B[qr]
+;W[ro];B[rr];W[po];B[sq];W[op];B[so];W[rp];B[sn];W[sp];B[sm]
+;W[pq];B[pr];W[sr];B[ol];W[mo];B[mm];W[lq];B[mr];W[fc];B[df]
+;W[dc];B[cc];W[cb];B[bc];W[eb];B[bb];W[ed];B[kr];W[fd];B[lr]
+;W[gb];B[he];W[cn];B[fq];W[cp];B[cq];W[bq];B[cr];W[bo];B[br]
+;W[do];B[aq];W[ep];B[ao];W[bp];B[an];W[ap];B[am];W[dq];B[dr]
+;W[ar];B[ee];W[go];B[fe];W[hq];B[lp];W[mp];B[gr];W[mq];B[lo]
+;W[oq];B[kq];W[hr];B[gd];W[eq];B[er];W[or];B[np];W[no];B[nr]
+;W[os];B[ir];W[hs];B[gs];W[fp];B[is];W[gp];B[ns];W[pe];B[qd]
+;W[oe];B[of];W[pf];B[qe];W[pg];B[el];W[qg];B[gm];W[ln];B[mn]
+;W[kn];B[in];W[io];B[jo];W[jn];B[ko];W[hn];B[im];W[jm];B[jl]
+;W[il];B[hm];W[kl];B[jk];W[ll];B[hk];W[km];B[rf];W[hp];B[lj]
+;W[ml];B[qi];W[rg];B[pm];W[rm];B[sk];W[rk];B[sl];W[rn];B[sj]
+;W[rj];B[ri];W[rl];B[si];W[nm];B[nn];W[oo];B[nl];W[sf];B[mk]
+;W[pn];B[on];W[kb];B[jb];W[lc];B[jc];W[ja];B[ia];W[ka];B[ib]
+;W[hc];B[se];W[sg];B[id];W[og];B[en];W[eo];B[dm];W[ng];B[mf]
+;W[lh];B[cm];W[kf];B[jh];W[if];B[jf];W[jg];B[je];W[kg];B[ke]
+;W[ig];B[gi];W[mh];B[nj];W[fg];B[gg];W[gf];B[ih];W[hd];B[hf]
+;W[hg];B[gh];W[ff];B[ge];W[eg];B[ie];W[ei];B[ej];W[ch];B[bg]
+;W[ld];B[bi];W[bh];B[ah];W[bf];B[cg];W[dh];B[be];W[bj];B[af]
+;W[fm];B[fn];W[di];B[hh];W[me];B[lf];W[bm];B[bl];W[bn];B[al]
+;W[aj];B[ai];W[cj];B[oi];W[ne];B[cl];W[gn];B[fh];W[fl];B[hl]
+;W[fk];B[fj];W[eh];B[gc];W[hb];B[rh];W[dk];B[ck];W[ci];B[ag]
+;W[cf];B[ef];W[ek];B[gk];W[ip];B[ca];W[db];B[da];W[iq];B[jq]
+;W[ra];B[ea];W[sd];B[ha];W[fb];B[fa];W[re];B[ki];W[bs];B[fr]
+;W[as];B[cs];W[aq];B[es];W[kh];B[ph];W[oh];B[ql];W[ni];B[qk]
+;W[dn];B[gl];W[qh];B[qj];W[pi];B[oj];W[ph];B[mi];W[nh];B[li]
+;W[mg];B[sb];W[sh];B[rd];W[se];B[lg];W[gq];B[qm];W[kd];B[ga]
+;W[fo];B[em]
+)
diff --git a/regression/games/incident82.sgf b/regression/games/incident82.sgf
new file mode 100644 (file)
index 0000000..0067238
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.91 ascii]HA[4]KM[0.5]GN[GNU Go 2.3.91 ascii Random Seed 936215967] 
+AB[pd]AB[dp]AB[dd]AB[pp]
+;W[nq];B[np];W[mp];B[oq];W[mq];B[jc];W[fp];B[dn];W[dq];B[cq]
+;W[dr];B[qj];W[no];B[op];W[mn];B[ci];W[df];B[cp];W[cr];B[fd]
+;W[cd];B[cc];W[bd];B[dc];W[ff];B[pg];W[nd];B[ce];W[be];B[de]
+;W[cf];B[qm];W[pn];B[cl];W[bh];B[bc];W[ch];B[qn];W[po];B[qo]
+;W[pm];B[pl];W[oo];B[bi];W[di];B[dj];W[ei];B[fk];W[ej];B[cj]
+;W[ek];B[el];W[dk];B[em];W[ck];B[bk];W[ai];B[bj];W[dl];B[bl]
+;W[dm];B[en];W[cm];B[hn];W[bm];B[hd];W[hf];B[nk];W[ol];B[pk]
+;W[ok];B[oj];W[nj];B[oi];W[ni];B[nh];W[nl];B[mk];W[li];B[mi]
+;W[mh];B[mj];W[ml];B[lh];W[mg];B[ki];W[lj];B[lk];W[kh];B[kj]
+;W[lg];B[li];W[kf];B[jh];W[kg];B[ll];W[lm];B[ie];W[if];B[jo]
+;W[jm];B[jq];W[kr];B[jr];W[kq];B[gq];W[fq];B[hp];W[go];B[gn]
+;W[ho];B[in];W[io];B[ip];W[jn];B[hr];W[ko];B[gs];W[fr];B[gr]
+;W[iq];B[jp];W[kp];B[hh];W[is];B[ir];W[js];B[or];W[nr];B[oe]
+;W[od];B[pc];W[ne];B[nb];W[mb];B[of];W[nf];B[ik];W[il];B[gl]
+;W[hl];B[hk];W[jk];B[jj];W[gi];B[hi];W[gj];B[gk];W[hj];B[ij]
+;W[jg];B[gh];W[fh];B[ih];W[bq];B[bp];W[br];B[nc];W[mc];B[fo]
+;W[eo];B[gp];W[cn];B[ep];W[co];B[do];W[eq];B[bo];W[bn];B[ld]
+;W[md];B[le];W[ng];B[og];W[kb];B[jb];W[kc];B[kd];W[lc];B[ad]
+;W[ae];B[bf];W[ac];B[bg];W[cg];B[ab];W[af];B[oc];W[ag];B[ns]
+;W[ms];B[os];W[lr];B[ks];W[ls];B[hm];W[im];B[ka];W[la];B[ja]
+;W[na];B[oa];W[ma];B[je];W[ke];B[ee];W[ge];B[gd];W[ad];B[ba]
+;W[pa];B[ob];W[qb];B[jl];W[kl];B[kk];W[jl];B[kn];W[km];B[pb]
+;W[qc];B[pe];W[qd];B[qa];W[ra];B[rb];W[qe];B[sa];W[qf];B[qg]
+;W[rg];B[rh];W[rf];B[an];W[rc];B[am];W[aj];B[al];W[ao];B[ap]
+;W[ah];B[aq];W[ar];B[ef];W[eg];B[gg];W[fg];B[gf];W[he];B[fe]
+;W[jf];B[fj];W[fi];B[fs];W[es];B[hs];W[ks];B[ao];W[ic];B[gb]
+;W[ib];B[id];W[lf];B[me];W[qp];B[qq];W[rp];B[rq];W[sn];B[rn]
+;W[sp];B[sm];W[sl];B[so];W[rl];B[sq];W[rj];B[ak];W[sh];B[ri]
+;W[si];B[rk];W[sk];B[sj];W[sg];B[rj];W[sc];B[ra];W[se];B[pf]
+;W[sb];B[pa];W[tt];B[tt]
+)
diff --git a/regression/games/incident84.sgf b/regression/games/incident84.sgf
new file mode 100644 (file)
index 0000000..db88f03
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.92 ascii]HA[0]KM[0.5]GN[GNU Go 2.3.92 ascii Random Seed 936343411] 
+;B[cp];W[qp];B[cd];W[pd];B[dj];W[op];B[nc];W[nd];B[md];W[ne]
+;B[mc];W[eq];B[dq];W[ep];B[dp];W[ec];B[ed];W[fd];B[dc];W[ch]
+;B[cg];W[qj];B[ic];W[dg];B[cf];W[bh];B[bg];W[kq];B[fc];W[ck]
+;B[cl];W[hp];B[dk];W[bk];B[bl];W[dh];B[ef];W[df];B[de];W[pm]
+;B[gd];W[ak];B[al];W[aj];B[cj];W[ai];B[ag];W[dl];B[el];W[dm]
+;B[cm];W[em];B[fk];W[cn];B[bn];W[dn];B[bo];W[eo];B[fm];W[lf]
+;B[gf];W[fb];B[eb];W[gb];B[hb];W[mf];B[oc];W[pc];B[pb];W[pe]
+;B[qc];W[qg];B[re];W[rf];B[qe];W[pf];B[qf];W[qh];B[rg];W[rh]
+;B[sf];W[ei];B[gi];W[gj];B[fj];W[fi];B[hj];W[gk];B[gl];W[hk]
+;B[hl];W[ik];B[hh];W[gh];B[gg];W[hi];B[fh];W[gi];B[eh];W[di]
+;B[ej];W[hg];B[fn];W[ih];B[if];W[hf];B[he];W[il];B[ig];W[hh]
+;B[kg];W[kk];B[ki];W[mh];B[jh];W[kf];B[jf];W[kd];B[kc];W[gr]
+;B[jd];W[ld];B[ke];W[le];B[je];W[lj];B[li];W[mi];B[kj];W[mj]
+;B[hm];W[gn];B[hn];W[go];B[ho];W[jn];B[jo];W[ko];B[in];W[jm]
+;B[ip];W[hq];B[kp];W[iq];B[lo];W[kn];B[lq];W[lr];B[jq];W[kr]
+;B[mq];W[jr];B[jp];W[nr];B[ln];W[mr];B[np];W[oq];B[no];W[mn]
+;B[mo];W[lp];B[mp];W[lm];B[nn];W[mm];B[pn];W[qn];B[om];W[pl]
+;B[po];W[ol];B[nm];W[oo];B[on];W[qo];B[pp];W[pq];B[nl];W[er]
+;B[dr];W[ds];B[cs];W[es];B[cr];W[nk];B[ml];W[jj];B[ll];W[km]
+;B[kl];W[lk];B[jl];W[im];B[ah];W[bi];B[fo];W[jk];B[gp];W[gq]
+;B[gm];W[lh];B[kh];W[fp];B[go];W[ji];B[qd];W[od];B[lc];W[eg]
+;B[fg];W[lg];B[jg];W[sh];B[sg];W[en];B[co];W[ci];B[lp];W[bj]
+;B[do];W[mk];B[me];W[nq];B[io];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident85.sgf b/regression/games/incident85.sgf
new file mode 100644 (file)
index 0000000..b0771e0
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.93 ascii]HA[9]KM[0.5]GN[GNU Go 2.3.93 ascii Random Seed 936588656] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[fc];B[cf];W[fe];B[cm];W[nq];B[pn];W[no];B[qg];W[qe];B[qd]
+;W[pe];B[oe];W[pf];B[ne];W[nf];B[of];W[pg];B[gp];W[kq];B[jq]
+;W[kr];B[og];W[pq];B[qq];W[pr];B[ph];W[rd];B[re];W[qc];B[rc]
+;W[pc];B[qf];W[rb];B[sd];W[nc];B[mf];W[lc];B[ng];W[le];B[kc]
+;W[ld];B[ec];W[fb];B[jr];W[kp];B[oc];W[ob];B[qr];W[op];B[po]
+;W[od];B[ps];W[os];B[qs];W[or];B[eb];W[qk];B[rp];W[qm];B[qj]
+;W[rj];B[ri];W[rk];B[ol];W[pm];B[om];W[pl];B[nn];W[rn];B[fa]
+;W[ga];B[ea];W[gb];B[ln];W[kn];B[jo];W[ko];B[jn];W[km];B[lf]
+;W[ke];B[if];W[kb];B[jb];W[lb];B[kf];W[je];B[ie];W[id];B[ic]
+;W[hd];B[jf];W[fg];B[dh];W[ci];B[cj];W[bi];B[di];W[bj];B[ck]
+;W[bk];B[bl];W[bg];B[ah];W[bf];B[ce];W[be];B[fi];W[cg];B[dg]
+;W[bc];B[kh];W[kk];B[il];W[hh];B[gg];W[eq];B[dq];W[gh];B[hf]
+;W[fh];B[ep];W[co];B[ik];W[gj];B[er];W[bq];B[bn];W[bo];B[cr]
+;W[dn];B[br];W[aq];B[gl];W[el];B[em];W[dm];B[dl];W[cq];B[ek]
+;W[cn];B[nj];W[en];B[fl];W[gn];B[mo];W[mp];B[cc];W[cb];B[db]
+;W[bb];B[ml];W[ro];B[ks];W[ls];B[js];W[lo];B[mn];W[lm];B[ib]
+;W[jm];B[im];W[in];B[hn];W[io];B[ip];W[ho];B[go];W[hm];B[fn]
+;W[fo];B[fm];W[fp];B[hp];W[fq];B[eo];W[fr];B[gr];W[es];B[dr]
+;W[ar];B[mj];W[kj];B[li];W[ki];B[ji];W[lj];B[ok];W[pk];B[lk]
+;W[ll];B[mk];W[jl];B[fj];W[hj];B[gk];W[hk];B[hl];W[cp];B[eh]
+;W[an];B[bm];W[al];B[ak];W[aj];B[mm];W[gf];B[hg];W[ih];B[ge]
+;W[ff];B[gd];W[hc];B[hb];W[fd];B[jc];W[ha];B[cd];W[bd];B[jg]
+;W[jh];B[lh];W[ij];B[jk];W[kl];B[sj];W[sk];B[si];W[rl];B[so]
+;W[sn];B[sp];W[qn];B[bs];W[as];B[gq];W[am];B[cl];W[oo];B[sb]
+;W[ra];B[ch];W[bh];B[gi];W[nd];B[me];W[md];B[ed];W[ef];B[df]
+;W[ee];B[qo];W[on];B[qp];W[sr];B[ca];W[ba];B[da];W[sa];B[sc]
+;W[qb];B[ii];W[hi];B[he];W[gc];B[de];W[ia];B[ig];W[ja];B[do]
+;W[ao];B[eg];W[kd];B[rr];W[sq];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident91.sgf b/regression/games/incident91.sgf
new file mode 100644 (file)
index 0000000..b34f8c0
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.94 ascii]HA[9]KM[0.5]GN[GNU Go 2.3.94 ascii Random Seed 936675698] 
+AB[pd]AB[dp]AB[dd]AB[pp]AB[dj]AB[pj]AB[jd]AB[jp]AB[jj]
+;W[fq];B[fp];W[gp];B[gq];W[hq];B[gr];W[eq];B[dq];W[ep];B[er]
+;W[fo];B[hp];W[fr];B[hr];W[dr];B[iq];W[ho];B[gc];W[qn];B[pn]
+;W[pm];B[qm];W[qo];B[qp];W[po];B[on];W[oo];B[rm];W[rp];B[rq]
+;W[rn];B[op];W[no];B[pl];W[om];B[pk];W[mm];B[dg];W[do];B[cp]
+;W[co];B[bp];W[bo];B[ap];W[ck];B[cj];W[bj];B[bi];W[bl];B[mc]
+;W[pg];B[cr];W[es];B[sp];W[br];B[ro];W[sn];B[cq];W[cs];B[sm]
+;W[np];B[so];W[nq];B[lr];W[pr];B[qq];W[qr];B[sr];W[rr];B[qf]
+;W[qg];B[pf];W[og];B[mk];W[rk];B[qk];W[rj];B[el];W[qi];B[ek]
+;W[dm];B[aj];W[bk];B[mf];W[rl];B[ql];W[nk];B[of];W[ni];B[nl]
+;W[ml];B[ol];W[nm];B[nj];W[mj];B[ok];W[lk];B[mi];W[nk];B[oj]
+;W[mk];B[jm];W[nh];B[li];W[jk];B[ik];W[kj];B[ki];W[ji];B[ij]
+;W[jl];B[jh];W[il];B[mh];W[io];B[jo];W[jn];B[kn];W[in];B[im]
+;W[km];B[ln];W[lm];B[hm];W[lp];B[ko];W[ip];B[hl];W[kq];B[jq]
+;W[kr];B[ii];W[jr];B[ls];W[cc];B[cd];W[dc];B[ec];W[eb];B[fb]
+;W[bd];B[ed];W[be];B[db];W[cb];B[ea];W[ce];B[de];W[cg];B[dh]
+;W[df];B[ef];W[cf];B[rd];W[rf];B[re];W[he];B[rg];W[rh];B[sf]
+;W[nf];B[si];W[ri];B[sh];W[ne];B[me];W[nd];B[md];W[nc];B[hg]
+;W[pc];B[ge];W[qc];B[gf];W[rc];B[if];W[mb];B[lb];W[nb];B[ca]
+;W[bb];B[sc];W[rb];B[en];W[eo];B[em];W[ba];B[hd];W[bh];B[ci]
+;W[ah];B[ai];W[gn];B[ch];W[gm];B[bg];W[bf];B[ag];W[gl];B[hk]
+;W[fk];B[fj];W[gk];B[gj];W[la];B[kb];W[ka];B[ja];W[ma];B[jb]
+;W[dk];B[qd];W[od];B[sb];W[sd];B[se];W[sj];B[sg];W[ra];B[oe]
+;W[sa];B[sd];W[mg];B[lg];W[ng];B[dl];W[cl];B[cm];W[bm];B[dn]
+;W[cn];B[ak];W[fn];B[af];W[ae];B[lj];W[kk];B[al];W[am];B[da]
+;W[ac];B[dm];W[fm];B[hn];W[go];B[ej];W[fl];B[pq];W[or];B[rs]
+;W[tt];B[tt]
+)
diff --git a/regression/games/incident92.sgf b/regression/games/incident92.sgf
new file mode 100644 (file)
index 0000000..16679a4
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.95 ascii]HA[0]KM[0.5]GN[GNU Go 2.3.95 ascii Random Seed 936780123] 
+;B[pp];W[cd];B[dp];W[pd];B[ed];W[df];B[dh];W[fq];B[dn];W[ec]
+;B[ef];W[dr];B[cq];W[iq];B[pj];W[nq];B[oq];W[np];B[pf];W[nd]
+;B[nf];W[jc];B[fc];W[dc];B[ee];W[ce];B[cg];W[eg];B[dg];W[fb]
+;B[gc];W[gb];B[ge];W[fg];B[ie];W[fo];B[fm];W[qn];B[qp];W[cr]
+;B[bq];W[fi];B[dj];W[br];B[hh];W[le];B[lg];W[hi];B[gh];W[fh]
+;B[gi];W[gj];B[hj];W[fj];B[ii];W[ek];B[dk];W[em];B[el];W[dl]
+;B[fl];W[en];B[cl];W[dm];B[cm];W[do];B[co];W[cn];B[bn];W[qe]
+;B[qf];W[hc];B[hd];W[nl];B[hk];W[bf];B[bg];W[de];B[gf];W[kf]
+;B[jf];W[kg];B[jg];W[mg];B[ng];W[lh];B[mh];W[mf];B[kh];W[li]
+;B[ki];W[me];B[nh];W[lj];B[kj];W[kk];B[jk];W[kl];B[jl];W[km]
+;B[jm];W[io];B[hm];W[kn];B[mj];W[lk];B[mk];W[ml];B[ok];W[ro]
+;B[rp];W[rk];B[ri];W[pm];B[re];W[rd];B[rf];W[ic];B[cf];W[ae]
+;B[dd];W[oo];B[nr];W[mr];B[ns];W[ms];B[pr];W[ar];B[aq];W[sp]
+;B[sq];W[so];B[qo];W[rm];B[sd];W[rc];B[sc];W[rq];B[rr];W[sr]
+;B[qq];W[sq];B[rs];W[sb];B[se];W[ra];B[ne];W[ep];B[dn];W[oe]
+;B[pe];W[cn];B[qd];W[qb];B[qc];W[pc];B[rb];W[rc];B[dn];W[je]
+;B[eo];W[fn];B[bd];W[cc];B[be];W[bc];B[af];W[jd];B[gn];W[go]
+;B[in];W[jo];B[jn];W[po];B[ho];W[hp];B[hn];W[dq];B[gp];W[do]
+;B[oc];W[pb];B[od];W[nc];B[ob];W[pa];B[nb];W[cp];B[bp];W[mc]
+;B[mb];W[lc];B[lb];W[kb];B[ka];W[ja];B[la];W[pl];B[ol];W[om]
+;B[ia];W[jb];B[ha];W[rj];B[qj];W[qk];B[ad];W[ac];B[dp];W[cn]
+;B[cp];W[si];B[sh];W[sj];B[rh];W[nk];B[nj];W[mi];B[ni];W[pk]
+;B[oj];W[oa];B[of];W[na];B[oe];W[dn];B[gq];W[gr];B[hq];W[ip]
+;B[hr];W[fp];B[fr];W[gs];B[fs];W[ir];B[hs];W[is];B[er];W[eq]
+;B[ds];W[id];B[hf];W[op];B[cs];W[bs];B[rd];W[rb];B[ss];W[or]
+;B[os];W[qs];B[qr];W[ma];B[kd];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident93.sgf b/regression/games/incident93.sgf
new file mode 100644 (file)
index 0000000..3dca1c8
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.3.95 ascii]HA[4]KM[0.5]GN[GNU Go 2.3.95 ascii Random Seed 936776043] 
+AB[gc]AB[cg]AB[cc]AB[gg]
+;W[fg];B[ee];W[fc];B[fd];W[ec];B[gb];W[de];B[be];W[bg];B[ff]
+;W[eg];B[gh];W[ge];B[df];W[gf];B[cf];W[ef];B[dd];W[ed];B[gd]
+;W[fe];B[bh];W[dh];B[db];W[eb];B[ce];W[dc];B[cb];W[cd];B[bd]
+;W[dd];B[fh];W[hg];B[hh];W[hf];B[ih];W[ei];B[da];W[ea];B[ch]
+;W[ci];B[eh];W[dg];B[bi];W[di];B[fb];W[hd];B[hc];W[ha];B[ga]
+;W[ic];B[ib];W[id];B[he];W[ie];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/incident94.sgf b/regression/games/incident94.sgf
new file mode 100644 (file)
index 0000000..186898c
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.95 ascii]HA[0]KM[0.5]GN[GNU Go 2.3.95 ascii Random Seed 936793226] 
+;B[dd];W[qp];B[pd];W[cp];B[el];W[op];B[ke];W[eq];B[of];W[fc]
+;B[fd];W[gd];B[gc];W[ed];B[ec];W[fe];B[fb];W[dc];B[fd];W[hd]
+;B[ee];W[gf];B[cc];W[jq];B[dh];W[qk];B[qh];W[ef];B[db];W[ok]
+;B[eg];W[jo];B[df];W[ff];B[cl];W[kc];B[jc];W[jb];B[kd];W[jd]
+;B[ic];W[hc];B[kb];W[ib];B[lc];W[hb];B[ie];W[id];B[hg];W[je]
+;B[jf];W[gh];B[gg];W[fg];B[fh];W[ii];B[hf];W[ge];B[hi];W[hh]
+;B[ih];W[gi];B[gj];W[fi];B[ei];W[fj];B[fk];W[eh];B[ji];W[hj]
+;B[ij];W[gk];B[hi];W[ej];B[fh];W[ik];B[dj];W[eh];B[ek];W[di]
+;B[ci];W[dg];B[cg];W[ch];B[bh];W[cf];B[dh];W[de];B[ei];W[eo]
+;B[ce];W[ed];B[hk];W[fc];B[gj];W[di];B[fd];W[ch];B[bf];W[fc]
+;B[dh];W[hj];B[fd];W[ch];B[ee];W[hl];B[df];W[cj];B[dh];W[bj]
+;B[ei];W[dk];B[eg];W[dl];B[fh];W[di];B[eh];W[em];B[fl];W[fm]
+;B[dj];W[ii];B[ch];W[jj];B[ia];W[jh];B[ig];W[ki];B[jg];W[kg]
+;B[ja];W[kf];B[gb];W[ha];B[ka];W[kc];B[ga];W[he];B[jc];W[if]
+;B[kc];W[qc];B[rc];W[qd];B[qe];W[rd];B[pc];W[qb];B[pb];W[re]
+;B[rf];W[qf];B[pe];W[rg];B[qg];W[sf];B[pf];W[cm];B[rf];W[bl]
+;B[rh];W[mq];B[sg];W[nm];B[se];W[qa];B[pa];W[rb];B[lf];W[lg]
+;B[lh];W[li];B[mh];W[mg];B[nh];W[nj];B[mf];W[nf];B[ng];W[ne]
+;B[nd];W[le];B[md];W[me];B[sb];W[sc];B[oe];W[oi];B[ld];W[oh]
+;B[og];W[pi];B[kh];W[qi];B[od];W[ri];B[sf];W[mi];B[sd];W[sa]
+)
diff --git a/regression/games/incident96.sgf b/regression/games/incident96.sgf
new file mode 100644 (file)
index 0000000..cfe1634
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]RU[Japanese]SZ[13]
+PW[GNU Go]PB[GNU Go 2.3.97 ascii]HA[2]KM[0.5]GN[GNU Go 2.3.97 ascii Random Seed 936873769] 
+AB[jd]AB[dj]
+LB[hc:80][kc:70][gd:71][hd:71][jf:71][kf:80][dg:71][jg:71][ch:80][dh:71][fj:71][gj:71][ck:70][fk:80]
+C[Value of move: 85]
+;W[cd];B[kj];W[hc];B[hd];W[gd];B[he];W[ic];B[jc];W[fk];B[ch]
+;W[dl];B[ck];W[cl];B[gk];W[gj];B[hk];W[fl];B[hh];W[fj];B[fh]
+;W[ei];B[eh];W[fc];B[ce];W[de];B[cf];W[bd];B[be];W[bk];B[cj]
+;W[ff];B[hf];W[gg];B[gh];W[hg];B[ig];W[bj];B[bi];W[gl];B[jb]
+;W[ib];B[hl];W[hm];B[im];W[gm];B[il];W[ja];B[ka];W[ia];B[kb]
+;W[hj];B[ij];W[dg];B[dh];W[df];B[cg];W[ge];B[ad];W[ac];B[ae]
+;W[bb];B[eg];W[fg];B[aj];W[bl];B[ak];W[ef];B[al];W[em];B[ek]
+;W[bm];B[hi];W[id];B[ie];W[di];B[ci];W[fi];B[gf];W[tt];B[gi]
+;W[el];B[dk];W[ej];B[tt];W[am];B[ai];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/incident97.sgf b/regression/games/incident97.sgf
new file mode 100644 (file)
index 0000000..d803882
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.3.97 ascii]HA[0]KM[0.5]GN[GNU Go 2.3.97 ascii Random Seed 936959610] 
+C[Value of move: 87]
+;B[oc];W[dd];B[co];W[pp];B[dq];W[qd];B[pe];W[qe];B[qk];W[pf]
+;B[qn];W[qo];B[pn];W[rn];B[od];W[oe];B[pd];W[qc];B[nq];W[np]
+;B[mp];W[oq];B[of];W[ne];B[qf];W[pg];B[rf];W[re];B[qh];W[mc]
+;B[nf];W[nd];B[ob];W[pb];B[hc];W[ph];B[qg];W[pi];B[qi];W[mf]
+;B[ng];W[pj];B[qj];W[mg];B[nh];W[mi];B[mh];W[ni];B[lh];W[rm]
+;B[cf];W[fc];B[bd];W[ch];B[cc];W[ce];B[be];W[df];B[cg];W[jc]
+;B[he];W[hg];B[iq];W[dg];B[bh];W[bi];B[bg];W[di];B[qm];W[rl]
+;B[ql];W[li];B[nr];W[no];B[rk];W[mo];B[lp];W[eo];B[dm];W[eq]
+;B[ep];W[dp];B[fp];W[cq];B[do];W[dr];B[fn];W[fq];B[en];W[gp]
+;B[fo];W[ip];B[jp];W[hq];B[ir];W[dc];B[jb];W[kc];B[kb];W[lb]
+;B[ic];W[gb];B[hb];W[ka];B[io];W[ja];B[ib];W[je];B[hp];W[go]
+;B[if];W[ig];B[jf];W[jh];B[ke];W[id];B[hd];W[le];B[kf];W[kd]
+;B[lf];W[nb];B[hm];W[gn];B[gm];W[bp];B[in];W[om];B[fe];W[gf]
+;B[fd];W[cb];B[bb];W[cd];B[bc];W[db];B[km];W[jk];B[ai];W[bj]
+;B[bo];W[gj];B[lo];W[mm];B[ll];W[or];B[ff];W[fg];B[hr];W[gq]
+;B[ek];W[cl];B[cm];W[bl];B[bm];W[ej];B[oa];W[pa];B[dk];W[dl]
+;B[el];W[fk];B[ol];W[nl];B[pm];W[ok];B[pl];W[sk];B[sj];W[si]
+;B[sl];W[sg];B[sf];W[rh];B[mk];W[ri];B[kk];W[kj];B[os];W[ps]
+;B[ns];W[qr];B[jl];W[ik];B[se];W[sd];B[lj];W[mj];B[ck];W[bk]
+;B[il];W[hk];B[on];W[nm];B[gr];W[fr];B[fl];W[lk];B[ba];W[kl]
+;B[ml];W[lm];B[kk];W[kn];B[kl];W[ln];B[jn];W[ko];B[kp];W[oo]
+;B[nk];W[pk];B[nj];W[oj];B[ma];W[mb];B[oi];W[oh];B[lj];W[ki]
+;B[ap];W[aq];B[ao];W[cp];B[fs];W[es];B[gs];W[nn];B[rg];W[sh]
+;B[al];W[ak];B[am];W[cj];B[ca];W[da];B[sm];W[ro];B[dj];W[ei]
+;B[sn];W[so];B[sk];W[gl];B[hl];W[gk];B[lk];W[ho];B[ip];W[ge]
+;B[gd];W[jo];B[hn];W[po];B[rj];W[sh];B[sg];W[nc];B[rh];W[si]
+;B[ri];W[ci];B[ah];W[aj];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/jahy.sgf b/regression/games/jahy.sgf
new file mode 100644 (file)
index 0000000..6d43068
--- /dev/null
@@ -0,0 +1,104 @@
+(;GM[1]FF[3]
+SZ[19]
+PB[jahy]
+PW[GnuGo]
+KM[0.5]US[bump@localhost.localdomain]PC[NNGS]
+DT[2000-08-28]
+BR[NR]WR[17k]
+RE[B+R]
+;B[dd];W[od];B[eq];W[qq];B[dj];W[fc];B[ec];W[fd];B[df];W[cc]
+C[To early
+];B[fb];W[gb];B[eb];W[qd]C[Should be H17
+];B[id];W[if]
+C[Should be H17
+];B[gc];W[lc];B[ke];W[kg];B[pj];W[hb];B[hc];W[ib];
+B[fe];W[ih];B[qg];W[cq];B[cn];W[nq]C[Bad tenuki
+];B[po];W[gq]
+C[Should be in corner
+];B[dp];W[dr];B[er];W[jq]C[Should be B5
+];B[qp];
+W[pq];B[lq];W[lr];B[mr];W[mq];B[lp];W[kr];B[no];W[pl];B[ql];W[qm];
+B[rl];W[qk]C[should be \bQ7
+];B[pk];W[pm];B[nl];W[rk];B[rm];W[rn];B[rp]
+;W[nf]C[Should be R11
+];B[ld];W[md]C[Should be N17
+];B[lf];W[fg];B[dh]
+;W[rq];B[lg];W[dl]C[Bad. Invasion point is C8 (for later)
+];B[cl];
+W[mo];B[ko];W[io];B[mn];W[ln];B[kn];W[mm];B[nm];W[nn];B[on];W[mp];
+B[om]C[Should be R11.
+];W[qj];B[qi];W[sk];B[ri];W[fi];B[gf];W[ok];
+B[nk];W[sm]C[Should be P10
+];B[oi];W[qo];B[pp];W[ro];B[pn];W[sp];B[qn]
+;W[sl];B[kl];W[ol];B[nj];W[ml]C[
+];B[mk];W[km];B[jm];W[lm];B[jn];W[jl]
+;B[il];W[jk];B[kk];W[in];B[im];W[jj];B[kj];W[hm];B[hl];W[gl];B[gk];
+W[gm];B[hj];W[ij];B[fj];W[ck]C[Doomed.
+];B[dk];W[cj];B[ci];W[gi];B[hi]
+;W[hh];B[gg];W[kh];B[lh];W[ki];B[ii];W[ji];B[li];W[gh];B[jf];W[gj]
+C[White's swindle comes to fruition
+];B[hk];W[fk];B[ej];W[el]
+C[Now W should win.
+];B[jp];W[ip];B[iq];W[bo]C[
+];B[bk];W[do]
+C[Should be C5
+];B[eo];W[co];B[dn];W[en];B[kp];W[hq];B[ir];W[jr];B[em]
+C[
+];W[lo]C[Not necessary. Reading code kicks in.
+];B[fn];W[jg];B[fm];
+W[fl];B[gn];W[hn];B[gp];W[bn];B[bm];W[rf];B[nc];W[mb]C[Should be N17
+]
+;B[mc];W[jc]C[Should be L17.
+];B[oc];W[nd];B[lb];W[jd];B[kc];W[ie];
+B[gd];W[je];B[kb];W[pc];B[pb];W[qb];B[ob];W[he];B[rg]BL[94]WL[630];
+W[qf]BL[94]WL[614];B[pf]BL[88]WL[614];W[pe]BL[88]WL[600];B[qa]BL[68]
+WL[600];W[pg]BL[68]WL[580]C[Should be S19.
+];B[rb]BL[58]WL[580];W[qc]
+BL[58]WL[555];B[sd]BL[30]WL[555];W[ph]BL[30]WL[516];B[pi]BL[21]WL[516]
+;W[kf]BL[21]WL[477];B[og]BL[900]WL[477];W[of]BL[900]WL[457];B[re]
+BL[874]WL[457];W[ng]BL[874]WL[441];B[oh]BL[868]WL[441];W[sf]BL[868]
+WL[426];B[qe]BL[862]WL[426];W[se]BL[862]WL[393];B[rc]BL[788]WL[393];
+W[rd]BL[788]WL[378];B[sc]BL[786]WL[378];W[cd]BL[786]WL[353]
+C[Many owl code errors in the upper left. W  should have
+played before now. In this position B15 may be better than C17
+]
+;B[ce]BL[778]WL[353];W[be]BL[778]WL[326];B[bf]BL[776]WL[326];W[ad]
+BL[776]WL[900];B[bb]BL[657]WL[900];W[fq]BL[657]WL[868];B[fp]BL[645]
+WL[868];W[hg]BL[645]WL[846];B[me]BL[619]WL[846];W[ne]BL[619]WL[818];
+B[cp]BL[565]WL[818];W[bp]BL[565]WL[798];B[cs]BL[531]WL[798];W[ds]
+BL[531]WL[779];B[bq]BL[508]WL[779];W[br]BL[508]WL[755];B[hp]BL[455]
+WL[755];W[hr]BL[455]WL[735];B[es]BL[443]WL[735];W[op]BL[443]WL[714];
+B[oo]BL[348]WL[714];W[ef]BL[348]WL[694];B[eh]BL[327]WL[694];W[fh]
+BL[327]WL[680];B[eg]BL[317]WL[680];W[ff]BL[317]WL[669];B[ge]BL[312]
+WL[669];W[qh]BL[312]WL[650];B[ee]BL[264]WL[650];W[rh]BL[264]WL[636];
+B[ll]BL[225]WL[636];W[jb]BL[225]WL[615];B[ho]BL[198]WL[615];W[mn]
+BL[198]WL[594];B[np]BL[180]WL[594];W[oq]BL[180]WL[580];B[dm]BL[125]
+WL[580];W[is]BL[125]WL[560];B[an]BL[900]WL[560];W[nh]BL[900]WL[539];
+B[ni]BL[859]WL[539];W[mh]BL[859]WL[519];B[mi]BL[855]WL[519];W[fa]
+BL[855]WL[499];B[ea]BL[847]WL[499];W[ga]BL[847]WL[473];B[am]BL[795]
+WL[473];W[ka]BL[795]WL[456]C[Should be A3
+];B[la]BL[790]WL[456];W[ja]
+BL[790]WL[439];B[ao]BL[775]WL[439];W[aq]BL[775]WL[425];B[ap]BL[773]
+WL[425];W[bq]BL[773]WL[900];B[bs]BL[736]WL[900]C[A1 makes ko
+];W[cr]
+BL[736]WL[887];B[as]BL[718]WL[887];W[ei]BL[718]WL[870];B[di]BL[714]
+WL[870];W[rj]BL[714]WL[855];B[dq]BL[676]WL[855];W[ar]BL[676]WL[843]
+C[W should not play this move
+];B[bs]BL[674]WL[843];W[si]BL[674]
+WL[828];B[cs]BL[656]WL[828];W[as]BL[656]WL[817];B[cs]BL[640]WL[817];
+W[fr]BL[640]WL[803];B[bs]BL[613]WL[803];W[fs]BL[613]WL[790];B[kd]
+BL[603]WL[790];W[oj]BL[603]WL[778];B[mf]BL[595]WL[778];W[hd]BL[595]
+WL[766];B[ic]BL[587]WL[766];W[mg]BL[587]WL[760];B[cb]BL[513]WL[760];
+W[ek]BL[513]WL[752];B[bj]BL[490]WL[752];W[hf]BL[490]WL[745];B[bc]
+BL[479]WL[745];W[tt]BL[479]WL[742]
+C[..........      :291: White passed];B[bd]BL[474]WL[742];W[tt]BL[474]
+WL[740]C[..........      :293: White passed];B[dc]BL[471]WL[740];W[tt]
+BL[471]WL[738]C[..........      :295: White passed];B[ae]BL[454]
+WL[738];W[tt]BL[454]WL[736]C[..........      :297: White passed];B[ac]
+BL[900]WL[736];W[tt]BL[900]WL[734]
+C[..........      :299: White passed];B[jo]BL[895]WL[734];W[iq]BL[895]
+WL[732];B[ma]BL[886]WL[732];W[tt]BL[886]WL[730]
+C[..........      :303: White passed];B[tt]BL[886]WL[730]
+C[..........      :304: Black passed
+----------       White resigns. W 36.5 B 77.0]
+)
diff --git a/regression/games/joseki01.sgf b/regression/games/joseki01.sgf
new file mode 100644 (file)
index 0000000..2645485
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[2]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-05-09]
+SY[Cgoban 1.9.14]TM[-]AB[pd][dp]
+RE[W+29.5]
+;W[dd];B[pp];W[nc];B[lc];W[qc];B[pc];W[qd];B[pe];W[pb];B[ob];W[qb];
+B[oc];W[qf];B[nd];W[fq];B[cf];W[pn];B[np];W[qp];B[qq];W[qo];B[rq];
+W[qj];B[jq];W[ch];B[cc];W[cd];B[dc];W[ec];B[eb];W[fc];B[ef];W[ck];
+B[fg];W[cn];B[fi];W[cq];B[fp];W[fe];B[fb];W[id];B[ib];W[gp];B[fo];
+W[eq];B[fm];W[gc];B[jo];W[gb];B[cp];W[dq];B[nn];W[pl];B[og];W[nl];
+B[bp];W[lm];B[ln];W[lk];B[sn];W[ph];B[bq];W[br];B[mh];W[bc];B[ga];
+W[ha];B[oh];W[fa];B[jc];W[rn];B[so];W[jk];B[jf];W[jh];B[jd];W[ie];
+B[dh];W[di];B[cg];W[eh];B[dg];W[bh];B[ei];W[dj];B[kg];W[hr];B[ir];
+W[hq];B[rm];W[ip];B[rk];W[rj];B[sj];W[si];B[sk];W[rf];B[qm];W[pm];
+B[qn];W[po];B[oo];W[qk];B[ar];W[ro];B[sp];W[bs];B[rl];W[de];B[hi];
+W[pq];B[op];W[ii];B[pg];W[rh];B[co];W[bn];B[in];W[jp];B[kp];W[kq];
+B[lq];W[kr];B[lr];W[jr];B[km];W[ll];B[if];W[pi];B[gf];W[oa];B[he];
+W[nb];B[hd];W[en];B[gn];W[fn];B[go];W[ni];B[em];W[do];B[ep];W[dm];
+B[ks];W[iq];B[mm];W[js];B[ls];W[hj];B[hh];W[ka];B[ia];W[hl];B[hm];
+W[mi];B[lh];W[li];B[il];W[gl];B[ek];W[ik];B[dl];W[cl];B[fk];W[jl];
+B[kb];W[jm];B[kn];W[la];B[ja];W[na];B[lb];W[ma];B[gm];W[hb];B[hc];
+W[be];B[bg];W[ho];B[bi];W[ci];B[ah];W[bj];B[ai];W[aj];B[ag];W[im];
+B[io];W[dk];B[qg];W[kh];B[rg];W[sg];B[sm];W[pf];B[of];W[md];B[nh];
+W[mc];B[ne];W[me];B[mf];W[le];B[bo];W[ke];B[je];W[ee];B[ml];W[mk];
+B[nm];W[om];B[qe];W[re];B[eo];W[dn];B[an];W[am];B[ao];W[el];B[fl];
+W[qh];B[lf];W[oi];B[ej];W[gj];B[gi];W[ig];B[jg];W[ih];B[hg];W[gd];
+B[kd];W[gk];B[kl];W[kk];B[dl];W[al];B[ge];W[ql];B[rp];W[el];B[jn];
+W[dl];B[kf];W[ff];B[df];W[ce];B[ae];W[ad];B[af];W[bf];B[eg];W[on];
+B[hn];W[hp];B[ld];W[cr];B[mb];W[pa];B[fj];W[as];B[aq];W[tt];B[tt];
+TW[aa][ba][ca][da][ea][ga][qa][ra][sa][ab][bb][cb][db][eb][fb][rb][sb][ac][cc][dc][rc][sc][bd][ed][fd][rd][sd][se][sf][sh][ji][ki][qi][ri][cj][ij][jj][kj][lj][mj][nj][oj][pj][ak][bk][hk][nk][ok][pk][bl][il][ol][bm][cm][gq][jq][dr][er][fr][gr][ir][cs][ds][es][fs][gs][hs][is]
+TB[jb][ic][kc][id][od][ie][oe][hf][nf][gg][lg][mg][ng][eh][fh][gh][sl][mn][ko][lo][mo][no][ap][lp][mp][mq][nq][oq][pq][sq][mr][nr][or][pr][qr][rr][sr][ms][ns][os][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 68 territory + 10 captures + 0.5 komi = 78.5
+   Black = 44 territory + 5 captures = 49
+White wins by 29.5.
+]
+)
diff --git a/regression/games/juka1.sgf b/regression/games/juka1.sgf
new file mode 100644 (file)
index 0000000..f4c93c5
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[3]
+VieW[]SZ[19]
+PB[GnuGo]
+PW[juka]
+KM[0.5]HA[9]PC[NNGS]
+DT[2001/10/11 21:22:51 UT]
+BR[14k]WR[1d]
+RE[has adjourned.]
+;AB[dp][dj][dd][jp][jj][jd][pp][pj][pd]C[..........       Handicap 9];
+W[gp];B[dn];W[dl];B[fn];W[fl];B[ho];W[co];B[cl]C[D5
+];W[cm];B[cn];
+W[bl];B[ck];W[dm];B[gk]C[B6
+];W[bn];B[cp];W[eo];B[en]C[D5
+];W[do];
+B[fq];W[ep];B[eq];W[go];B[hr];W[bp];B[bq];W[aq];B[ar]C[B2
+];W[cq];
+B[ap];W[dq];B[cr];W[ej];B[dr];W[gd];B[df];W[qh];B[oh];W[rj];B[gn];
+W[qn];B[nq];W[og];B[ng];W[of];B[nd];W[nh];B[ni]C[!O11
+];W[mh];B[mg];
+W[lh];B[pg];W[ph];B[oi];W[pf];B[qo];W[pn];B[jh];W[lj];B[ok];W[no];
+B[ll];W[kk];B[rn];W[rm];B[mk];W[jn];B[ln];W[lo];B[jl];W[kl];B[ko];
+W[kn];B[mn];W[mo];B[nl];W[lq];B[mm];W[ld];B[me];W[le];B[lf];W[kf];
+B[kh];W[mj];B[nj];W[jk];B[il];W[je];B[lg];W[kg];B[id];W[ce];B[de];
+W[ff];B[cd];W[dh];B[cf];W[bh];B[kr];W[iq];B[lr];W[io];B[km];W[jm];
+B[lm];W[ik];B[hl];W[ir];B[jo];W[hn];B[li];W[mi];B[ij];W[ki];B[kj];
+W[ne];B[lk];W[mf]C[----------       Game has adjourned.]
+)
diff --git a/regression/games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf b/regression/games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf
new file mode 100644 (file)
index 0000000..3de13e2
--- /dev/null
@@ -0,0 +1,321 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Chinese]SZ[19]KM[0.50]TM[600]OT[25/600 Canadian]
+PW[GnuGoCVS]PB[inuyasha34]BR[30k]DT[2004-04-10]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[GnuGoCVS [?\]: GTP Engine for GnuGoCVS (white): GNU Go version 3.5.4 (compiled from CVS sources 2004-04-09 00:57)
+]RE[W+155.50]
+;B[pd]
+;W[dd]
+;B[cc]
+;W[dc]
+;B[cd]
+;W[ce]
+;B[be]
+;W[cf]
+;B[bf]
+;W[cg]
+;B[bg]
+;W[dp]
+;B[de]
+;W[ee]
+;B[df]
+;W[dg]
+;B[ef]
+;W[ff]
+;B[eg]
+;W[eh]
+;B[fg]
+;W[gg]
+;B[fh]
+;W[fi]
+;B[cq]
+;W[cp]
+;B[dq]
+;W[eq]
+;B[er]
+;W[fq]
+;B[fr]
+;W[gq]
+;B[gr]
+;W[pp]
+;B[qq]
+;W[pq]
+;B[qp]
+;W[qo]
+;B[ro]
+;W[qn]
+;B[rn]
+;W[qm]
+;B[rm]
+;W[ql]
+;B[rl]
+;W[nd]
+;B[md]
+;W[ne]
+;B[nf]
+;W[oe]
+;B[pf]
+;W[pe]
+;B[qe]
+;W[nc]
+;B[mb]
+;W[lp]
+;B[mf]
+;W[cl]
+;B[nb]
+;W[of]
+;B[og]
+;W[me]
+;B[le]
+;W[qk]
+;B[mc]
+;W[jq]
+;B[oc]
+;W[jj]
+;B[lr]
+;W[nr]
+;B[jr]
+;W[ir]
+;B[kr]
+;W[nj]
+;B[mq]
+;W[ip]
+;B[np]
+;W[oj]
+;B[hq]
+;W[hr]
+;B[hp]
+;W[ho]
+;B[gp]
+;W[fp]
+;B[fo]
+;W[ep]
+;B[go]
+;W[iq]
+;B[io]
+;W[hn]
+;B[gn]
+;W[hm]
+;B[in]
+;W[ch]
+;B[im]
+;W[jo]
+;B[hl]
+;W[gm]
+;B[fm]
+;W[gl]
+;B[gk]
+;W[gh]
+;B[fl]
+;W[cn]
+;B[dm]
+;W[cm]
+;B[bo]
+;W[bp]
+;B[co]
+;W[bq]
+;B[do]
+;W[cr]
+;B[dr]
+;W[br]
+;B[kq]
+;W[gs]
+;B[is]
+;W[ds]
+;B[js]
+;W[kp]
+;B[hs]
+;W[jp]
+;B[fs]
+;W[bn]
+;B[gs]
+;W[ao]
+;B[dn]
+;W[id]
+;B[eo]
+;W[cj]
+;B[cs]
+;W[lm]
+;B[jf]
+;W[rk]
+;B[rp]
+;W[bs]
+;B[gb]
+;W[ib]
+;B[hc]
+;W[ic]
+;B[gc]
+;W[if]
+;B[sl]
+;W[jg]
+;B[qr]
+;W[cb]
+;B[bd]
+;W[bb]
+;B[ad]
+;W[bh]
+;B[af]
+;W[bc]
+;B[qs]
+;W[or]
+;B[sn]
+;W[mh]
+;B[sp]
+;W[qh]
+;B[qi]
+;W[ri]
+;B[qj]
+;W[rj]
+;B[pi]
+;W[ph]
+;B[oi]
+;W[oh]
+;B[ni]
+;W[nh]
+;B[mi]
+;W[kg]
+;B[mj]
+;W[rf]
+;B[ok]
+;W[nk]
+;B[pj]
+;W[re]
+;B[nl]
+;W[mk]
+;B[ml]
+;W[lk]
+;B[ll]
+;W[lj]
+;B[kj]
+;W[km]
+;B[kk]
+;W[li]
+;B[pk]
+;W[ki]
+;B[ol]
+;W[nn]
+;B[kh]
+;W[kl]
+;B[jk]
+;W[jh]
+;B[ii]
+;W[qc]
+;B[ji]
+;W[lh]
+;B[ij]
+;W[qf]
+;B[od]
+;W[kf]
+;B[qd]
+;W[rd]
+;B[of]
+;W[pb]
+;B[oe]
+;W[kb]
+;B[nd]
+;W[ek]
+;B[me]
+;W[ih]
+;B[je]
+;W[ke]
+;B[ik]
+;W[hi]
+;B[jd]
+;W[kd]
+;B[hn]
+;W[lb]
+;B[gm]
+;W[pc]
+;B[il]
+;W[ob]
+;B[ab]
+;W[ac]
+;B[ba]
+;W[db]
+;B[]
+;W[fj]
+;B[]
+;W[jn]
+;B[]
+;W[dl]
+;B[]
+;W[el]
+;B[]
+;W[lc]
+;B[]
+;W[pg]
+;B[]
+;W[em]
+;B[]
+;W[en]
+;B[]
+;W[oa]
+;B[pr]
+;W[oq]
+;B[nq]
+;W[op]
+;B[oo]
+;W[no]
+;B[po]
+;W[ls]
+;B[ms]
+;W[lq]
+;B[mr]
+;W[on]
+;B[ns]
+;W[pn]
+;B[os]
+;W[mp]
+;B[ps]
+;W[hj]
+;B[sk]
+;W[gj]
+;B[sj]
+;W[na]
+;B[si]
+;W[sh]
+;B[rh]
+;W[rg]
+;B[fc]
+;W[hb]
+;B[fa]
+;W[eb]
+;B[ga]
+;W[ha]
+;B[gd]
+;W[he]
+;B[fe]
+;W[ge]
+;B[ed]
+;W[ec]
+;B[hd]
+;W[fd]
+;B[jc]
+;W[jb]
+;B[lg]
+;W[lf]
+;B[kc]
+;W[mg]
+;B[ld]
+;W[cs]
+;B[la]
+;W[ma]
+;B[ja]
+;W[ka]
+;B[]
+;W[fk]
+;B[]
+;W[hk]
+;B[]
+;W[gl]
+;B[]
+;W[gk]
+;B[]
+;W[jm]
+;B[]
+;W[es]
+;B[jl]
+;W[fn]
+;B[]
+;W[ng]
+;B[]
+;W[]TW[aa][ba][ca][da][ea][fa][ga][ia][ja][la][pa][qa][ra][sa][ab][fb][gb][qb][rb][sb][cc][fc][gc][hc][jc][kc][rc][sc][ad][bd][cd][ed][gd][hd][jd][sd][ae][be][de][fe][ie][je][se][af][bf][df][ef][gf][hf][jf][sf][ag][bg][eg][fg][hg][ig][lg][qg][sg][ah][dh][fh][hh][kh][rh][ai][bi][ci][di][ei][gi][mi][ni][oi][pi][qi][aj][bj][dj][ej][mj][pj][qj][ak][bk][ck][dk][ok][pk][al][bl][ll][ml][nl][ol][pl][am][bm][mm][nm][om][pm][an][kn][ln][mn][ko][lo][mo][oo][po][ap][aq][ar][as]TB[nc][ne][pe][jj][hm][sm][ho][so][rq][sq][rr][sr][ks][ls][rs][ss])
+
diff --git a/regression/games/kgs/2004-04-10-Shun9137-GnuGoCVS.sgf b/regression/games/kgs/2004-04-10-Shun9137-GnuGoCVS.sgf
new file mode 100644 (file)
index 0000000..0b1e818
--- /dev/null
@@ -0,0 +1,256 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Chinese]SZ[19]KM[0.50]TM[600]OT[25/600 Canadian]
+PW[Shun9137]PB[GnuGoCVS]WR[19k]BR[20k]DT[2004-04-10]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[GnuGoCVS [20k?\]: GTP Engine for GnuGoCVS (black): GNU Go version 3.5.4 (compiled from CVS sources 2004-04-10 00:32)
+]RE[B+Resign]
+;B[pd]
+;W[dp]
+;B[pp]
+;W[dd]
+;B[fc]
+;W[nq]
+;B[ic]
+;W[ec]
+;B[fd]
+;W[qf]
+;B[cn]
+;W[co]
+;B[dn]
+;W[qn]
+;B[ep]
+;W[eq]
+;B[np]
+;W[qq]
+;B[dj]
+;W[pq]
+;B[cf]
+;W[ce]
+;B[df]
+;W[po]
+;B[of]
+;W[qd]
+;B[qc]
+;W[rd]
+;B[rc]
+;W[pe]
+;B[od]
+;W[oe]
+;B[ne]
+;W[pg]
+;B[nh]
+;W[og]
+;B[ng]
+;W[op]
+;B[no]
+;W[on]
+;B[nj]
+;W[nn]
+;B[lo]
+;W[oh]
+;B[mm]
+;W[mn]
+;B[ln]
+;W[mo]
+;B[fp]
+;W[ee]
+;B[fg]
+;W[ef]
+;B[eg]
+;W[fe]
+;B[ed]
+;W[nm]
+;B[de]
+;W[cc]
+;B[ml]
+;W[nl]
+;B[dq]
+;W[cq]
+;B[kl]
+;W[fq]
+;B[dr]
+;W[bn]
+;B[cr]
+;W[bq]
+;B[gq]
+;W[gr]
+;B[hq]
+;W[br]
+;B[do]
+;W[cp]
+;B[hr]
+;W[fr]
+;B[bm]
+;W[an]
+;B[gs]
+;W[cs]
+;B[er]
+;W[ds]
+;B[fs]
+;W[am]
+;B[bl]
+;W[al]
+;B[eb]
+;W[dc]
+;B[be]
+;W[cd]
+;B[db]
+;W[bd]
+;B[bg]
+;W[ae]
+;B[bf]
+;W[cb]
+;B[ba]
+;W[ca]
+;B[ad]
+;W[ac]
+;B[bb]
+;W[ab]
+;B[ge]
+;W[lp]
+;B[ak]
+;W[bk]
+;B[aj]
+;W[bj]
+;B[ai]
+;W[bi]
+;B[ah]
+;W[af]
+;B[bo]
+;W[bh]
+;B[ao]
+;W[ko]
+;B[kp]
+;W[jp]
+;B[kq]
+;W[kn]
+;B[lm]
+;W[jq]
+;B[kr]
+;W[jr]
+;B[lr]
+;W[jo]
+;B[mp]
+;W[mq]
+;B[lq]
+;W[oo]
+;B[oi]
+;W[lp]
+;B[mp]
+;W[np]
+;B[lp]
+;W[jl]
+;B[jk]
+;W[il]
+;B[gl]
+;W[gm]
+;B[ik]
+;W[hl]
+;B[qi]
+;W[qh]
+;B[fm]
+;W[gk]
+;B[fl]
+;W[hk]
+;B[fk]
+;W[hi]
+;B[ji]
+;W[hg]
+;B[hm]
+;W[im]
+;B[gn]
+;W[hn]
+;B[ql]
+;W[jg]
+;B[ie]
+;W[jf]
+;B[ih]
+;W[hh]
+;B[ig]
+;W[lf]
+;B[le]
+;W[ke]
+;B[mf]
+;W[ld]
+;B[me]
+;W[if]
+;B[hf]
+;W[gf]
+;B[he]
+;W[ff]
+;B[gg]
+;W[jd]
+;B[lg]
+;W[jh]
+;B[ii]
+;W[ki]
+;B[kj]
+;W[md]
+;B[kc]
+;W[lc]
+;B[kd]
+;W[jc]
+;B[kb]
+;W[nd]
+;B[lb]
+;W[oc]
+;B[pc]
+;W[ob]
+;B[nc]
+;W[id]
+;B[rh]
+;W[rg]
+;B[ri]
+;W[lh]
+;B[jb]
+;W[hc]
+;B[os]
+;W[mr]
+;B[ms]
+;W[pr]
+;B[rm]
+;W[qm]
+;B[sd]
+;W[se]
+;B[sc]
+;W[nb]
+;B[re]
+;W[qe]
+;B[sf]
+;W[rf]
+;B[se]
+;W[pb]
+;B[je]
+;W[kf]
+;B[kh]
+;W[kg]
+;B[mg]
+;W[qb]
+;B[pl]
+;W[sg]
+;B[mc]
+;W[mb]
+;B[nk]
+;W[rb]
+;B[sb]
+;W[ra]
+;B[ma]
+;W[na]
+;B[pa]
+;W[sa]
+;B[nd]
+;W[ib]
+;B[hd]
+;W[ic]
+;B[gc]
+;W[gb]
+;B[fb]
+;W[la]
+;B[oa]
+;W[qa]
+;B[rn]
+;W[ka]
+;B[ga]
+;W[ja]
+;B[hb]
+;W[gh]
+;B[ro])
+
diff --git a/regression/games/kgs/2004-04-28-R-dokuganryu-GnuGoCVS.sgf b/regression/games/kgs/2004-04-28-R-dokuganryu-GnuGoCVS.sgf
new file mode 100644 (file)
index 0000000..b248958
--- /dev/null
@@ -0,0 +1,308 @@
+(;GM[1]FF[4]CA[UTF-8]
+HA[6]SZ[19]RU[AGA]KM[0.50]TM[600]OT[25/480 Canadian]
+PW[dokuganryu]PB[GnuGoCVS]WR[3k]BR[9k]DT[2004-04-28]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dj][pj][dp][pp]C[GnuGoCVS [9k\]: GTP Engine for GnuGoCVS (black): GNU Go version 3.5.6 (compiled from CVS sources 2004-04-27 19:53 - please see my user info for details)
+]RE[W+28.50]
+;W[nq]
+;B[pn]
+;W[pl]
+;B[pg]
+;W[fq]
+;B[hq]
+;W[fo]
+;B[dn]
+;W[dr]
+;B[cq]
+;W[jq]
+;B[ho]
+;W[hr]
+;B[cr]
+;W[gq]
+;B[fn]
+;W[eo]
+;B[dl]
+;W[en]
+;B[do]
+;W[em]
+;B[dg]
+;W[bj]
+;B[dm]
+;W[bl]
+;B[bh]
+;W[ci]
+;B[ei]
+;W[ch]
+;B[cg]
+;W[bi]
+;B[bf]
+;W[bn]
+;B[ck]
+;W[bk]
+;B[bp]
+;W[ah]
+;B[bg]
+;W[ai]
+;B[cm]
+;W[bm]
+;B[an]
+;W[bo]
+;B[ao]
+;W[am]
+;B[ak]
+;W[ap]
+;B[ao]
+;W[eh]
+;B[fh]
+;W[dh]
+;B[gi]
+;W[eg]
+;B[fg]
+;W[ef]
+;B[ge]
+;W[ce]
+;B[cd]
+;W[be]
+;B[ee]
+;W[ff]
+;B[fe]
+;W[gf]
+;B[bd]
+;W[ae]
+;B[ad]
+;W[df]
+;B[ie]
+;W[hc]
+;B[jc]
+;W[jb]
+;B[kb]
+;W[ib]
+;B[jd]
+;W[fb]
+;B[db]
+;W[ng]
+;B[oe]
+;W[kc]
+;B[lc]
+;W[kd]
+;B[lb]
+;W[he]
+;B[hf]
+;W[hd]
+;B[ke]
+;W[if]
+;B[hg]
+;W[ld]
+;B[ja]
+;W[ka]
+;B[md]
+;W[le]
+;B[kf]
+;W[mc]
+;B[mb]
+;W[nc]
+;B[lf]
+;W[me]
+;B[mf]
+;W[ne]
+;B[nf]
+;W[nd]
+;B[nb]
+;W[oc]
+;B[ob]
+;W[pc]
+;B[pb]
+;W[qd]
+;B[qb]
+;W[pe]
+;B[og]
+;W[od]
+;B[or]
+;W[nh]
+;B[mi]
+;W[ni]
+;B[of]
+;W[oj]
+;B[pi]
+;W[qf]
+;B[iq]
+;W[ir]
+;B[qm]
+;W[ql]
+;B[mj]
+;W[lh]
+;B[ih]
+;W[jg]
+;B[kg]
+;W[jh]
+;B[ok]
+;W[nj]
+;B[nk]
+;W[mk]
+;B[kj]
+;W[kh]
+;B[pk]
+;W[mh]
+;B[om]
+;W[qh]
+;B[ph]
+;W[lj]
+;B[qg]
+;W[ec]
+;B[ml]
+;W[lk]
+;B[ol]
+;W[dc]
+;B[cb]
+;W[bb]
+;B[eb]
+;W[fc]
+;B[ab]
+;W[bc]
+;B[cc]
+;W[ba]
+;B[aq]
+;W[ii]
+;B[er]
+;W[fj]
+;B[gj]
+;W[fk]
+;B[gn]
+;W[fi]
+;B[gg]
+;W[gk]
+;B[hj]
+;W[hk]
+;B[ij]
+;W[hh]
+;B[ik]
+;W[il]
+;B[kk]
+;W[ig]
+;B[gh]
+;W[ll]
+;B[gd]
+;W[gc]
+;B[kl]
+;W[lm]
+;B[jm]
+;W[km]
+;B[jl]
+;W[jn]
+;B[in]
+;W[hm]
+;B[im]
+;W[hl]
+;B[kn]
+;W[jo]
+;B[ko]
+;W[jp]
+;B[fa]
+;W[ga]
+;B[mo]
+;W[hn]
+;B[lq]
+;W[io]
+;B[rf]
+;W[re]
+;B[sg]
+;W[qc]
+;B[rc]
+;W[ea]
+;B[de]
+;W[cf]
+;B[da]
+;W[fa]
+;B[ac]
+;W[ia]
+;B[mm]
+;W[hb]
+;B[ln]
+;W[li]
+;B[kr]
+;W[jr]
+;B[co]
+;W[ji]
+;B[ks]
+;W[rd]
+;B[rb]
+;W[ek]
+;B[dk]
+;W[eq]
+;B[dq]
+;W[fr]
+;B[ds]
+;W[fs]
+;B[la]
+;W[ja]
+;B[pf]
+;W[qe]
+;B[es]
+;W[kq]
+;B[kp]
+;W[js]
+;B[lr]
+;W[se]
+;B[sf]
+;W[qo]
+;B[po]
+;W[qp]
+;B[qq]
+;W[rq]
+;B[qr]
+;W[rm]
+;B[rn]
+;W[qn]
+;B[rp]
+;W[pm]
+;B[ro]
+;W[qm]
+;B[rr]
+;W[hi]
+;B[el]
+;W[fl]
+;B[ep]
+;W[fp]
+;B[sc]
+;W[go]
+;B[ap]
+;W[jf]
+;B[je]
+;W[rj]
+;B[rh]
+;W[ri]
+;B[qi]
+;W[si]
+;B[sm]
+;W[sl]
+;B[rk]
+;W[sn]
+;B[sh]
+;W[]
+;B[ej]
+;W[hp]
+;B[sd]
+;W[]
+;B[an]
+;W[]
+;B[ic]
+;W[]
+;B[di]
+;W[]
+;B[cn]
+;W[]
+;B[cj]
+;W[]
+;B[cl]
+;W[]
+;B[mg]
+;W[]
+;B[lg]
+;W[]
+;B[oi]
+;W[]
+;B[id]
+;W[]
+;B[oh]
+;W[]
+;B[aa]
+;W[]
+;B[]TW[aa][ca][da][ha][ab][cb][db][eb][gb][ac][cc][ad][bd][cd][dd][ed][fd][gd][md][pd][de][ee][fe][ge][af][bf][hf][ag][bg][cg][dg][fg][gg][hg][bh][fh][gh][ih][gi][ki][mi][aj][gj][hj][ij][jj][kj][mj][ak][ik][jk][kk][al][gl][jl][kl][fm][gm][im][jm][fn][gn][in][ho][gp][ip][hq][iq][gr][gs][hs][is]TB[ma][na][oa][pa][qa][ra][sa][sb][rg][qh][ri][si][qj][rj][sj][qk][sk][nl][pl][ql][rl][sl][nm][pm][qm][rm][sm][mn][nn][on][qn][sn][lo][no][oo][qo][so][cp][lp][mp][np][op][qp][sp][bq][mq][nq][oq][pq][rq][sq][ar][br][dr][mr][nr][pr][sr][as][bs][cs][ls][ms][ns][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/20040507-GnuGoCVS-read.sgf b/regression/games/kgs/20040507-GnuGoCVS-read.sgf
new file mode 100644 (file)
index 0000000..b7f33c7
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[5.50]TM[600]OT[25/480 Canadian]
+PW[GnuGoCVS]PB[read]WR[9k]DT[2004-05-06]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+RE[B+Resign]
+;B[pd];W[dp];B[dd];W[qp];B[op];W[mq];B[qq];W[rq];B[pq];W[ro];B[pn];W[jq]
+;B[rn];W[qr];B[pr];W[rs];B[fq];W[cf];B[ch];W[fc];B[fd];W[gd];B[ec];W[fe]
+;B[ed];W[fb];B[ge];W[ff];B[hd];W[gc];B[he];W[eb];B[db];W[hc];B[ic];W[ib]
+;B[jc];W[jb];B[kc];W[pf];B[qh];W[og];B[ne];W[cn];B[dq];W[cq];B[cp];W[co]
+;B[cr];W[bp];B[bq];W[cj];B[eh];W[cp];B[eq];W[ph];B[qg];W[pi];B[qf];W[qi]
+;B[qk];W[kb];B[lb];W[nf];B[mf];W[mg];B[lg];W[oe];B[nd];W[mh];B[lh];W[od]
+;B[oc];W[cc];B[cb];W[cd];B[de];W[dc];B[ce];W[be];B[bf];W[df];B[cl];W[br]
+;B[em];W[bg];B[bh];W[gh];B[fg];W[pp];B[nq];W[mp];B[ir];W[oo];B[lr];W[jr]
+;B[mr];W[np];B[oq];W[po];B[no];W[nn];B[mo];W[lo];B[kn];W[mn];B[kq];W[qn]
+;B[ol];W[ip];B[hq];W[kr];B[kp];W[lq];B[jp];W[iq];B[gr];W[pk];B[io];W[hp]
+;B[ho];W[gp];B[fo];W[ls];B[ns];W[qm];B[ok];W[pl];B[mi];W[bl];B[bk];W[ck]
+;B[bm];W[gg];B[gf];W[fh];B[eg];W[fj];B[ek];W[jh];B[nh];W[ng];B[nj];W[dl]
+;B[cm];W[dk];B[dm];W[bj];B[ej];W[go];B[gn];W[is];B[hr];W[hn];B[in];W[fn]
+;B[eo];W[gm];B[fk];W[jf];B[hl];W[hj];B[fi];W[jj];B[gi];W[hi];B[hg];W[hh]
+;B[ig];W[ih];B[jg];W[gj];B[ei];W[gl];B[gk];W[kk];B[lm];W[hk];B[il];W[ef]
+;B[cg];W[dr];B[er];W[cs];B[en];W[ri];B[mm];W[sf];B[re];W[se];B[sd];W[rd]
+;B[sg];W[sc];B[rf];W[qd];B[pe];W[qe];B[pc];W[qb];B[qc];W[rc];B[pb];W[af]
+;B[rb];W[ak];B[fm];W[gn];B[hm];W[fs];B[hs];W[dg];B[dh];W[of];B[fp];W[ks]
+;B[nr];W[jo];B[ko];W[ps];B[os];W[qs];B[om];W[me];B[lf];W[mc];B[nc];W[id]
+;B[ie];W[lc];B[jd];W[nb];B[md];W[ld];B[le];W[mb];B[kd];W[ah];B[ai];W[es]
+;B[gs];W[bi];B[ag];W[bf];B[ah];W[bn];B[am];W[rh];B[sb];W[rg];B[sd];W[oi]
+;B[oj];W[ni];B[pj];W[qj];B[pg];W[oh];B[ql];W[pm];B[rm];W[on];B[rk];W[sn]
+;B[rj];W[si];B[sj];W[sm];B[sl];W[rl];B[rm];W[mj];B[li];W[nm];B[mk];W[lj]
+;B[lk];W[rn];B[sf];W[rl];B[fl];W[ms];B[rm];W[nl];B[kj];W[rl];B[bc];W[sk]
+;B[bd])
diff --git a/regression/games/kgs/20040516-GoBucks-GnuGoCVS.sgf b/regression/games/kgs/20040516-GoBucks-GnuGoCVS.sgf
new file mode 100644 (file)
index 0000000..a592489
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]CA[UTF-8]
+HA[2]SZ[19]RU[AGA]KM[0.50]TM[600]OT[25/480 Canadian]
+PW[GoBucks]PB[GnuGoCVS]WR[7k]BR[9k]DT[2004-05-16]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+AB[pd][dp]
+RE[B+41.50]
+;W[dd];B[pq];W[po];B[qo];W[qn];B[qp];W[pn];B[nq];W[pj];B[df];W[dh];B[fd]
+;W[ee];B[cc];W[cd];B[dc];W[bc];B[eg];W[fi];B[bb];W[bd];B[gg];W[ec];B[eb]
+;W[db];B[cb];W[fb];B[da];W[fc];B[qh];W[ic];B[rj];W[hi];B[dn];W[ig];B[ck]
+;W[cm];B[cn];W[dl];B[bm];W[bn];B[cl];W[dm];B[bo];W[bl];B[an];W[bk];B[dk]
+;W[cj];B[el];W[em];B[fm];W[ek];B[en];W[dj];B[ef];W[fe];B[nd];W[rd];B[qc]
+;W[qf];B[rc];W[pf];B[og];W[pg];B[ph];W[oh];B[kq];W[pi];B[rh];W[ql];B[rl]
+;W[rm];B[rf];W[of];B[ng];W[nf];B[mg];W[oi];B[mf];W[oc];B[od];W[nc];B[mc]
+;W[md];B[lc];W[pc];B[le];W[mb];B[lb];W[na];B[la];W[qd];B[sc];W[pe];B[ld]
+;W[re];B[qg];W[sf];B[rg];W[qb];B[rb];W[pa];B[sd];W[ob];B[ra];W[qa];B[qk]
+;W[pl];B[hm];W[mp];B[ko];W[np];B[fq];W[mq];B[gd];W[gc];B[hd];W[id];B[nr]
+;W[ie];B[km];W[mm];B[mr];W[sp];B[ro];W[so];B[fk];W[ej];B[jf];W[if];B[sm]
+;W[rn];B[ab];W[rq];B[qr];W[rr];B[qq];W[sn];B[al];W[bj];B[sl];W[li];B[lk]
+;W[mj];B[kj];W[mk];B[ih];W[hh];B[jg];W[hg];B[op];W[oo];B[hk];W[dr];B[br]
+;W[eq];B[fp];W[fr];B[gr];W[jp];B[kp];W[gq];B[hq];W[gp];B[go];W[hp];B[ip]
+;W[ho];B[io];W[jn];B[kn];W[hn];B[gn];W[in];B[hr];W[ii];B[mn];W[nn];B[mo]
+;W[no];B[lm];W[ll];B[kl];W[ml];B[lp];W[jk];B[jj];W[jb];B[rs];W[fa];B[ea]
+;W[qi];B[ri];W[pk];B[gj];W[gi];B[ma];W[nb];B[lj];W[lh];B[jh];W[ji];B[ki]
+;W[kh];B[ij];W[qj];B[rk];W[pp];B[kg];W[je];B[lg];W[mi];B[oq];W[sr];B[ak]
+;W[aj];B[am];W[rp];B[lq];W[ss];B[qs];W[ja];B[ke];W[kc];B[ac];W[ad];B[kd]
+;W[jd];B[kb];W[jc];B[nh];W[ni];B[hj];W[cr];B[ao];W[bq];B[aq];W[es];B[cq]
+;W[dq];B[cp];W[bs];B[ar];W[cs];B[ep];W[fs];B[gs];W[as];B[bp];W[iq];B[ir]
+;W[fj];B[ka];W[mh];B[];W[]
+TW[ga][ha][ia][oa][gb][hb][ib][pb][hc][ed][fd][gd][hd][ae][be][ce][de][ge]
+[he][af][bf][cf][df][ef][ff][gf][hf][ag][bg][cg][dg][eg][fg][gg][ah][bh]
+[ch][eh][fh][gh][ai][bi][ci][di][ei][nj][oj][nk][ok][nl][ol][nm][om][pm]
+[qm][on][sq][er][ds]
+TB[aa][ba][ca][sa][db][sb][md][qd][rd][me][ne][oe][pe][qe][re][se][kf][lf]
+[nf][of][pf][qf][sf][pg][sg][sh][si][sj][gk][ik][jk][kk][sk][dl][fl][gl]
+[hl][il][jl][cm][dm][em][gm][im][jm][bn][fn][hn][in][jn][ln][co][do][eo]
+[fo][ho][jo][lo][ap][gp][hp][jp][bq][gq][iq][jq][jr][kr][lr][or][pr][hs]
+[is][js][ks][ls][ms][ns][os][ps])
diff --git a/regression/games/kgs/20040517-siRNA-GnuGoCVS.sgf b/regression/games/kgs/20040517-siRNA-GnuGoCVS.sgf
new file mode 100644 (file)
index 0000000..66cca16
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]CA[UTF-8]
+HA[4]SZ[19]RU[AGA]KM[0.50]TM[300]OT[2x30 byo-yomi]
+PW[siRNA]PB[GnuGoCVS]WR[4k]BR[9k]DT[2004-05-17]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+AB[dd][pd][dp][pp]
+RE[W+86.50]
+;W[cf];B[fc];W[bd];B[cc];W[ci];B[ic];W[qf];B[pf];W[pg];B[of];W[pc];B[oc]
+;W[qd];B[qe];W[re];B[qc];W[pe];B[pb];W[od];B[nd];W[pc];B[rc];W[oe];B[ne]
+;W[nc];B[ob];W[mc];B[og];W[oh];B[ng];W[le];B[ph];W[qg];B[oi];W[nh];B[mh]
+;W[qn];B[np];W[qp];B[qq];W[rq];B[rr];W[ro];B[sq];W[pq];B[rp];W[ni];B[nj]
+;W[po];B[op];W[qr];B[rq];W[pr];B[nr];W[so];B[oq];W[sp];B[qo];W[mf];B[nf]
+;W[qp];B[rs];W[qs];B[or];W[pi];B[mi];W[qh];B[pj];W[qi];B[jp];W[cn];B[cl]
+;W[cq];B[dq];W[cp];B[do];W[bn];B[em];W[qk];B[ek];W[hp];B[io];W[gn];B[ho]
+;W[en];B[dn];W[fm];B[fl];W[dm];B[el];W[cm];B[fo];W[go];B[fn];W[gm];B[fp]
+;W[gp];B[fq];W[im];B[md];W[kc];B[bc];W[jq];B[kp];W[kq];B[lp];W[id];B[lq]
+;W[hr];B[kr];W[jr];B[lr];W[kh];B[hd];W[jd];B[be];W[bf];B[cd];W[hc];B[ib]
+;W[jb];B[gc];W[he];B[gd];W[nb];B[bl];W[fh];B[lg];W[kg];B[ge];W[hf];B[hk]
+;W[ik];B[hl];W[hm];B[hj];W[jj];B[cr];W[br];B[eo];W[km];B[hh];W[gi];B[hi]
+;W[fj];B[fk];W[dr];B[er];W[cs];B[af];W[bj];B[ck];W[gl];B[gk];W[gg];B[ah]
+;W[bh];B[ld];W[kd];B[lf];W[kf];B[me];W[ok];B[ke];W[je];B[pk];W[pl];B[nk]
+;W[nl];B[ml];W[qj];B[oj];W[mm];B[ll];W[lm];B[ol];W[pm];B[nm];W[nn];B[ai]
+;W[aj];B[ef];W[eg];B[ff];W[gr];B[pd];W[qe];B[na];W[lc];B[ma];W[oa];B[om]
+;W[on];B[jn];W[jm];B[rd];W[sd];B[pc];W[ra];B[la];W[ka];B[rb];W[qa];B[pa]
+;W[sa];B[fg];W[gh];B[dg];W[eh];B[df];W[ch];B[ce];W[ei];B[oh];W[jc];B[ia]
+;W[ja];B[hb];W[lj];B[li];W[ki];B[kl];W[jk];B[ip];W[iq];B[dh];W[di];B[jl]
+;W[il];B[js];W[is];B[ks];W[fr];B[kk];W[kj];B[kn];W[ln];B[lo];W[mo];B[mp]
+;W[qo];B[mj];W[lk];B[mk];W[no];B[le];W[bg];B[ag];W[bi];B[ae];W[gf];B[oo]
+;W[in];B[cg];W[hn];B[lh];W[];B[]
+TW[la][ma][na][oa][pa][kb][lb][mb][ob][pb][qb][rb][sb][oc][pc][qc][rc][sc]
+[pd][rd][ie][se][if][jf][rf][sf][hg][ig][jg][rg][sg][hh][ih][jh][rh][sh]
+[fi][hi][ii][ji][ri][si][cj][dj][ej][gj][hj][ij][rj][sj][ak][bk][ck][dk]
+[ek][fk][gk][hk][rk][sk][al][bl][cl][dl][el][fl][hl][ql][rl][sl][am][bm]
+[em][qm][rm][sm][an][dn][en][fn][mn][pn][rn][sn][ao][bo][co][do][eo][fo]
+[ap][bp][dp][ep][fp][aq][bq][dq][eq][fq][gq][hq][ar][cr][er][ir][as][bs]
+[ds][es][fs][gs][hs]
+TB[aa][ba][ca][da][ea][fa][ga][ha][ab][bb][cb][db][eb][fb][gb][ac][dc][ec]
+[hc][ad][bd][ed][fd][de][ee][fe][mf][mg][nh][ni][ok][nl][jo][ko][mq][nq]
+[pq][mr][pr][qr][sr][ls][ms][ns][os][ps][qs][ss])
diff --git a/regression/games/kgs/20040525-fanfan-GnuGoBot.sgf b/regression/games/kgs/20040525-fanfan-GnuGoBot.sgf
new file mode 100644 (file)
index 0000000..08bcfb2
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[AGA]SZ[19]HA[9]KM[0.50]TM[600]OT[25/600 Canadian]
+PW[fanfan]PB[GnuGoBot]WR[4d]BR[9k]DT[2004-05-25]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+RE[W+Resign]
+;W[qf];B[qe];W[pf];B[nd];W[pm];B[np];W[nj];B[oi];W[nf];B[ld];W[ni];B[gd]
+;W[lp];B[nn];W[ln];B[gp];W[ol];B[ql];W[qm];B[rm];W[rn];B[rl];W[qo];B[qi]
+;W[ph];B[qh];W[rg];B[rh];W[rj];B[rk];W[pk];B[sj];W[qj];B[oh];W[qk];B[pg]
+;W[re];B[pl];W[oj];B[ri];W[pi];B[ng];W[mg];B[pj];W[pi];B[of];W[oe];B[ne]
+;W[og];B[nh];W[mh];B[od];W[ph];B[kg];W[mm];B[im];W[cm];B[em];W[bp];B[bn]
+;W[cn];B[bo];W[co];B[cp];W[bq];B[bm];W[cl];B[bl];W[ck];B[bk];W[cj];B[bj]
+;W[ci];B[bi];W[cg];B[df];W[bh];B[al];W[be];B[di];W[bc];B[rd];W[dr];B[cc]
+;W[cd];B[cb];W[bb];B[dc];W[dg];B[fh];W[eg];B[qq];W[lr];B[fg];W[nr];B[rp]
+;W[pr];B[qr];W[om];B[oo];W[oq];B[sr];W[rs];B[qs];W[rr];B[rq];W[sp];B[el]
+;W[en];B[fn];W[eo];B[ep];W[fo];B[fp];W[go];B[ar];W[br];B[hq];W[io];B[fr]
+;W[jr];B[cq];W[cr];B[er];W[ds];B[jo];W[bs];B[gm];W[gn];B[dq];W[in];B[ip]
+;W[jm];B[hm];W[jl];B[ik];W[sd];B[sc];W[se];B[rc];W[ef];B[ce];W[bd];B[ir]
+;W[ee];B[de];W[ge];B[he];W[gf];B[fd];W[hf];B[hh];W[ie];B[hd];W[if];B[id]
+;W[kh];B[jh];W[ki];B[kj];W[jn];B[ig];W[kf];B[jq];W[kr];B[lj];W[mk];B[ji]
+;W[lg];B[pe];W[jg];B[ko];W[lo];B[lk];W[ll];B[kl];W[km];B[ap];W[aq];B[dk]
+;W[ed];B[ec];W[ca];B[da];W[ba];B[hg];W[cf];B[fm];W[ea];B[eb];W[db];B[or]
+;W[os];B[da];W[il];B[fa];W[hl];B[gk];W[hk];B[hj];W[gl];B[fl];W[jk];B[ij]
+;W[eh];B[ei];W[of];B[ao];W[me];B[md];W[le];B[kk];W[li])
diff --git a/regression/games/kgs/20050407-tfujii-GNU.sgf b/regression/games/kgs/20050407-tfujii-GNU.sgf
new file mode 100644 (file)
index 0000000..cde93af
--- /dev/null
@@ -0,0 +1,305 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[Japanese]SZ[19]KM[0.50]TM[600]OT[25/600 Canadian]
+PW[tfujii]PB[GNU]WR[12k]BR[13k]DT[2005-04-08]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]RE[W+38.50]
+;B[pd]
+;W[pq]
+;B[po]
+;W[np]
+;B[qq]
+;W[qr]
+;B[qp]
+;W[or]
+;B[qk]
+;W[cc]
+;B[dp]
+;W[cn]
+;B[fd]
+;W[nc]
+;B[fp]
+;W[qf]
+;B[nd]
+;W[qi]
+;B[oc]
+;W[mc]
+;B[en]
+;W[qc]
+;B[qd]
+;W[ob]
+;B[rc]
+;W[pc]
+;B[jq]
+;W[od]
+;B[oe]
+;W[pe]
+;B[qe]
+;W[pf]
+;B[oc]
+;W[rb]
+;B[ng]
+;W[oi]
+;B[rr]
+;W[rs]
+;B[ic]
+;W[of]
+;B[nf]
+;W[bp]
+;B[cq]
+;W[em]
+;B[od]
+;W[fm]
+;B[ce]
+;W[cg]
+;B[bd]
+;W[ed]
+;B[df]
+;W[ee]
+;B[fc]
+;W[ec]
+;B[dg]
+;W[fe]
+;B[ch]
+;W[fb]
+;B[bq]
+;W[cp]
+;B[gb]
+;W[gd]
+;B[gc]
+;W[eb]
+;B[hd]
+;W[ge]
+;B[if]
+;W[je]
+;B[he]
+;W[me]
+;B[sd]
+;W[ne]
+;B[og]
+;W[re]
+;B[pm]
+;W[rd]
+;B[sr]
+;W[lq]
+;B[cj]
+;W[cl]
+;B[do]
+;W[co]
+;B[bb]
+;W[gg]
+;B[jd]
+;W[ie]
+;B[lg]
+;W[hf]
+;B[ke]
+;W[jf]
+;B[ld]
+;W[md]
+;B[ig]
+;W[jg]
+;B[ih]
+;W[jh]
+;B[jc]
+;W[ji]
+;B[ii]
+;W[jj]
+;B[gi]
+;W[dh]
+;B[hl]
+;W[bc]
+;B[ac]
+;W[ci]
+;B[bh]
+;W[di]
+;B[bj]
+;W[kf]
+;B[lb]
+;W[lc]
+;B[kb]
+;W[hb]
+;B[ha]
+;W[ib]
+;B[hc]
+;W[kc]
+;B[dj]
+;W[kd]
+;B[mb]
+;W[nb]
+;B[jb]
+;W[fi]
+;B[li]
+;W[hk]
+;B[gj]
+;W[hj]
+;B[gh]
+;W[fh]
+;B[hg]
+;W[gf]
+;B[ej]
+;W[hi]
+;B[fj]
+;W[hh]
+;B[gk]
+;W[gl]
+;B[hm]
+;W[mj]
+;B[ap]
+;W[ao]
+;B[bl]
+;W[bm]
+;B[ak]
+;W[aq]
+;B[gn]
+;W[fn]
+;B[fo]
+;W[dq]
+;B[dr]
+;W[eq]
+;B[br]
+;W[er]
+;B[jo]
+;W[ds]
+;B[kl]
+;W[cr]
+;B[ko]
+;W[nn]
+;B[cb]
+;W[cd]
+;B[rj]
+;W[kk]
+;B[rh]
+;W[ri]
+;B[si]
+;W[qh]
+;B[rg]
+;W[bi]
+;B[bg]
+;W[ai]
+;B[fl]
+;W[gm]
+;B[dm]
+;W[el]
+;B[dl]
+;W[hn]
+;B[ek]
+;W[hq]
+;B[ho]
+;W[ip]
+;B[kq]
+;W[io]
+;B[lp]
+;W[mq]
+;B[in]
+;W[jl]
+;B[ir]
+;W[hr]
+;B[cm]
+;W[bn]
+;B[kr]
+;W[lr]
+;B[eg]
+;W[fg]
+;B[hs]
+;W[gr]
+;B[km]
+;W[jp]
+;B[kp]
+;W[ll]
+;B[nl]
+;W[ok]
+;B[ol]
+;W[pk]
+;B[pl]
+;W[qj]
+;B[rk]
+;W[lm]
+;B[jm]
+;W[ln]
+;B[il]
+;W[jk]
+;B[dc]
+;W[dd]
+;B[mo]
+;W[on]
+;B[lk]
+;W[lj]
+;B[mn]
+;W[mk]
+;B[pn]
+;W[be]
+;B[ad]
+;W[bf]
+;B[cf]
+;W[ag]
+;B[ae]
+;W[ah]
+;B[af]
+;W[kn]
+;B[jn]
+;W[gs]
+;B[op]
+;W[no]
+;B[oq]
+;W[nq]
+;B[rf]
+;W[se]
+;B[iq]
+;W[hp]
+;B[ik]
+;W[ij]
+;B[db]
+;W[am]
+;B[qg]
+;W[pg]
+;B[sh]
+;W[sj]
+;B[nk]
+;W[nj]
+;B[is]
+;W[ks]
+;B[mm]
+;W[js]
+;B[ss]
+;W[qs]
+;B[pr]
+;W[ps]
+;B[rq]
+;W[ns]
+;B[al]
+;W[aj]
+;B[ck]
+;W[ls]
+;B[na]
+;W[oa]
+;B[ma]
+;W[ep]
+;B[fq]
+;W[fr]
+;B[ml]
+;W[eo]
+;B[dn]
+;W[sf]
+;B[sk]
+;W[ef]
+;B[gp]
+;W[oo]
+;B[pp]
+;W[pr]
+;B[da]
+;W[ea]
+;B[eh]
+;W[ei]
+;B[sj]
+;W[lk]
+;B[ga]
+;W[id]
+;B[lo]
+;W[mp]
+;B[fa]
+;W[de]
+;B[sg]
+;W[jr]
+;B[gq]
+;W[nm]
+;B[om]
+;W[]
+;B[]TW[pa][qa][ra][sa][pb][qb][sb][oc][rc][sc][ld][nd][od][pd][qd][sd][ke][le][oe][qe][ff][if][lf][mf][nf][hg][ig][kg][lg][mg][ng][og][ih][kh][lh][mh][nh][oh][ph][ii][ki][li][mi][ni][pi][kj][oj][pj][an][bo][ap][bq][cq][ar][br][dr][mr][nr][as][bs][cs][es][fs][ms][os]TB[aa][ba][ca][ia][ja][ka][la][ab][hb][ib][be][bf][cg][bk][dk][fk][cl][el][gl][ql][rl][sl][em][fm][gm][im][qm][rm][sm][fn][hn][qn][rn][sn][go][qo][ro][so][rp][sp][sq]KGSDE[hb][ib][rc][ld][sd][ke][nf][lg][ng][og][li][bq][cq][br]KGSSW[94.50]KGSSB[56.00])
diff --git a/regression/games/kgs/20050408-GNU-mamassang.sgf b/regression/games/kgs/20050408-GNU-mamassang.sgf
new file mode 100644 (file)
index 0000000..c06462d
--- /dev/null
@@ -0,0 +1,196 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[Japanese]SZ[19]KM[6.50]TM[600]OT[25/600 Canadian]
+PW[GNU]PB[mamassang]WR[13k]DT[2005-04-08]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]RE[W+67.50]
+;B[co]
+;W[dd]
+;B[fp]
+;W[pd]
+;B[pn]
+;W[hq]
+;B[nq]
+;W[cq]
+;B[hp]
+;W[ip]
+;B[jd]
+;W[gq]
+;B[nm]
+;W[er]
+;B[jp]
+;W[io]
+;B[pj]
+;W[cm]
+;B[nd]
+;W[pf]
+;B[nf]
+;W[pc]
+;B[nb]
+;W[dn]
+;B[fe]
+;W[fc]
+;B[hc]
+;W[df]
+;B[eg]
+;W[gp]
+;B[dg]
+;W[qh]
+;B[ph]
+;W[jk]
+;B[rj]
+;W[ji]
+;B[jg]
+;W[cf]
+;B[cg]
+;W[qi]
+;B[pi]
+;W[mj]
+;B[nj]
+;W[pg]
+;B[og]
+;W[ri]
+;B[nh]
+;W[ob]
+;B[qj]
+;W[sj]
+;B[sk]
+;W[gj]
+;B[rl]
+;W[lm]
+;B[gi]
+;W[dk]
+;B[dj]
+;W[jq]
+;B[fj]
+;W[gk]
+;B[ek]
+;W[gd]
+;B[ck]
+;W[do]
+;B[dl]
+;W[lr]
+;B[ak]
+;W[ec]
+;B[bf]
+;W[be]
+;B[ag]
+;W[mo]
+;B[no]
+;W[mp]
+;B[np]
+;W[ge]
+;B[si]
+;W[rg]
+;B[cl]
+;W[bo]
+;B[bm]
+;W[bn]
+;B[dm]
+;W[lh]
+;B[cn]
+;W[fo]
+;B[lg]
+;W[cp]
+;B[cm]
+;W[fm]
+;B[em]
+;W[gb]
+;B[dp]
+;W[fn]
+;B[eo]
+;W[en]
+;B[gf]
+;W[ib]
+;B[ic]
+;W[jb]
+;B[kb]
+;W[ff]
+;B[jc]
+;W[fg]
+;B[fh]
+;W[gg]
+;B[ei]
+;W[hb]
+;B[hd]
+;W[ka]
+;B[hf]
+;W[nc]
+;B[he]
+;W[mb]
+;B[gh]
+;W[ef]
+;B[hg]
+;W[kc]
+;B[jh]
+;W[mi]
+;B[ni]
+;W[md]
+;B[me]
+;W[ld]
+;B[le]
+;W[hi]
+;B[hh]
+;W[ii]
+;B[kd]
+;W[lb]
+;B[gc]
+;W[fd]
+;B[ns]
+;W[sh]
+;B[mr]
+;W[lq]
+;B[ls]
+;W[ks]
+;B[ms]
+;W[kh]
+;B[kg]
+;W[mn]
+;B[nn]
+;W[oe]
+;B[ne]
+;W[fl]
+;B[el]
+;W[mk]
+;B[nk]
+;W[ml]
+;B[nl]
+;W[mh]
+;B[mg]
+;W[ih]
+;B[ig]
+;W[kr]
+;B[qr]
+;W[bp]
+;B[an]
+;W[ao]
+;B[am]
+;W[od]
+;B[of]
+;W[sj]
+;B[mq]
+;W[si]
+;B[fk]
+;W[mm]
+;B[]
+;W[ae]
+;B[af]
+;W[]
+;B[ce]
+;W[de]
+;B[cd]
+;W[bd]
+;B[cc]
+;W[bc]
+;B[cb]
+;W[bb]
+;B[ba]
+;W[dc]
+;B[ac]
+;W[ab]
+;B[ca]
+;W[da]
+;B[db]
+;W[eb]
+;B[ea]
+;W[fa]
+;B[]
+;W[]TW[aa][ba][ca][da][ea][ga][ha][ia][ja][la][ma][na][oa][pa][qa][ra][sa][cb][db][fb][kb][nb][pb][qb][rb][sb][ac][cc][lc][mc][oc][qc][rc][sc][ad][cd][ed][qd][rd][sd][ce][ee][fe][pe][qe][re][se][qf][rf][sf][qg][sg][rh][ki][li][hj][ij][jj][kj][lj][hk][ik][kk][lk][gl][hl][il][jl][kl][ll][gm][hm][im][jm][km][gn][hn][in][jn][kn][ln][eo][go][ho][jo][ko][lo][ap][dp][ep][fp][hp][jp][kp][lp][aq][bq][dq][eq][fq][iq][kq][ar][br][cr][dr][fr][gr][hr][ir][jr][as][bs][cs][ds][es][fs][gs][hs][is][js]TB[id][ie][je][ke][if][jf][kf][lf][mf][bg][ng][ah][bh][ch][dh][eh][oh][ai][bi][ci][di][fi][oi][aj][bj][cj][ej][oj][bk][dk][ok][pk][qk][rk][al][bl][ol][pl][ql][sl][om][pm][qm][rm][sm][on][qn][rn][sn][oo][po][qo][ro][so][op][pp][qp][rp][sp][oq][pq][qq][rq][sq][nr][or][pr][rr][sr][os][ps][qs][rs][ss]KGSDE[ba][ca][ea][cb][db][nb][ac][cc][cd][ce][fe][eo][dp][fp][hp][jp]KGSSW[145.50]KGSSB[78.00])
diff --git a/regression/games/kgs/20050408-janine-GNU.sgf b/regression/games/kgs/20050408-janine-GNU.sgf
new file mode 100644 (file)
index 0000000..0f45772
--- /dev/null
@@ -0,0 +1,296 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[Japanese]SZ[19]HA[2]KM[0.50]TM[600]OT[25/600 Canadian]
+PW[janine]PB[GNU]WR[11k]BR[13k]DT[2005-04-08]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]RE[B+13.50]
+;W[pp]
+;B[dd]
+;W[qf]
+;B[nd]
+;W[qd]
+;B[qc]
+;W[pe]
+;B[rd]
+;W[od]
+;B[qe]
+;W[oc]
+;B[pf]
+;W[oe]
+;B[pg]
+;W[re]
+;B[qg]
+;W[qd]
+;B[qn]
+;W[pc]
+;B[qk]
+;W[nq]
+;B[rp]
+;W[qq]
+;B[lq]
+;W[rq]
+;B[iq]
+;W[cn]
+;B[fq]
+;W[bp]
+;B[cq]
+;W[ck]
+;B[jd]
+;W[ld]
+;B[gd]
+;W[cc]
+;B[cd]
+;W[dc]
+;B[ec]
+;W[eb]
+;B[fc]
+;W[fb]
+;B[ch]
+;W[bd]
+;B[be]
+;W[bc]
+;B[bq]
+;W[bo]
+;B[cf]
+;W[ej]
+;B[me]
+;W[ke]
+;B[mg]
+;W[kg]
+;B[en]
+;W[el]
+;B[gb]
+;W[gm]
+;B[kc]
+;W[lc]
+;B[li]
+;W[om]
+;B[nc]
+;W[if]
+;B[ok]
+;W[kp]
+;B[kq]
+;W[ip]
+;B[hp]
+;W[jq]
+;B[jr]
+;W[jp]
+;B[ir]
+;W[lp]
+;B[on]
+;W[ho]
+;B[nm]
+;W[gp]
+;B[hq]
+;W[fo]
+;B[kl]
+;W[ji]
+;B[mp]
+;W[mq]
+;B[mo]
+;W[ro]
+;B[io]
+;W[jo]
+;B[in]
+;W[jn]
+;B[im]
+;W[jm]
+;B[il]
+;W[jl]
+;B[jk]
+;W[ik]
+;B[lr]
+;W[jj]
+;B[kk]
+;W[hl]
+;B[rn]
+;W[qp]
+;B[fn]
+;W[gn]
+;B[eo]
+;W[rg]
+;B[rh]
+;W[nf]
+;B[mf]
+;W[fg]
+;B[sg]
+;W[se]
+;B[os]
+;W[or]
+;B[ns]
+;W[ms]
+;B[mr]
+;W[nr]
+;B[ps]
+;W[pr]
+;B[qs]
+;W[lm]
+;B[ml]
+;W[kb]
+;B[jb]
+;W[kd]
+;B[jc]
+;W[lb]
+;B[ob]
+;W[pb]
+;B[nb]
+;W[bi]
+;B[ll]
+;W[ee]
+;B[fe]
+;W[ef]
+;B[ed]
+;W[dm]
+;B[bh]
+;W[rs]
+;B[ls]
+;W[qr]
+;B[ms]
+;W[rf]
+;B[gf]
+;W[gg]
+;B[pa]
+;W[qa]
+;B[oa]
+;W[qb]
+;B[ci]
+;W[bj]
+;B[eh]
+;W[fi]
+;B[ap]
+;W[ao]
+;B[aq]
+;W[sn]
+;B[sm]
+;W[so]
+;B[rm]
+;W[ng]
+;B[nh]
+;W[lh]
+;B[mh]
+;W[ne]
+;B[md]
+;W[ki]
+;B[kj]
+;W[gq]
+;B[gr]
+;W[mn]
+;B[nn]
+;W[lo]
+;B[op]
+;W[ah]
+;B[ag]
+;W[ai]
+;B[cj]
+;W[bk]
+;B[fa]
+;W[da]
+;B[eg]
+;W[ff]
+;B[hf]
+;W[hg]
+;B[ie]
+;W[je]
+;B[hd]
+;W[ja]
+;B[ia]
+;W[ka]
+;B[fh]
+;W[gi]
+;B[km]
+;W[hm]
+;B[dj]
+;W[dk]
+;B[ln]
+;W[kn]
+;B[mm]
+;W[hn]
+;B[ln]
+;W[de]
+;B[ce]
+;W[af]
+;B[bg]
+;W[ae]
+;B[gh]
+;W[hh]
+;B[ei]
+;W[hi]
+;B[fp]
+;W[go]
+;B[qo]
+;W[sp]
+;B[po]
+;W[oh]
+;B[og]
+;W[qh]
+;B[ph]
+;W[qi]
+;B[ri]
+;W[pi]
+;B[oi]
+;W[of]
+;B[oh]
+;W[sf]
+;B[lg]
+;W[kh]
+;B[np]
+;W[sh]
+;B[rj]
+;W[do]
+;B[dn]
+;W[co]
+;B[si]
+;W[oq]
+;B[kf]
+;W[jf]
+;B[lf]
+;W[ma]
+;B[df]
+;W[mb]
+;B[fm]
+;W[fl]
+;B[sg]
+;W[ep]
+;B[eq]
+;W[sh]
+;B[cm]
+;W[bm]
+;B[sg]
+;W[ib]
+;B[ha]
+;W[sh]
+;B[sq]
+;W[sr]
+;B[sg]
+;W[hb]
+;B[ga]
+;W[sh]
+;B[ad]
+;W[ac]
+;B[sg]
+;W[ic]
+;B[id]
+;W[sh]
+;B[db]
+;W[cb]
+;B[sg]
+;W[ea]
+;B[hc]
+;W[sh]
+;B[ba]
+;W[ca]
+;B[sg]
+;W[he]
+;B[ge]
+;W[sh]
+;B[bf]
+;W[ad]
+;B[ab]
+;W[sg]
+;B[ep]
+;W[em]
+;B[cp]
+;W[mc]
+;B[le]
+;W[na]
+;B[mj]
+;W[]
+;B[]TW[la][ra][sa][rb][sb][qc][rc][sc][pd][rd][sd][qe][ig][jg][ih][jh][ii][aj][fj][gj][hj][ij][ak][ek][fk][gk][hk][al][bl][cl][dl][gl][il][am][cm][im][an][bn][in][io][ko][rp][pq][sq][rr][ss]TB[hb][ib][gc][ic][fd][he][cg][dg][dh][qh][di][mi][ni][pi][qi][lj][nj][oj][pj][qj][sj][lk][mk][nk][pk][rk][sk][nl][ol][pl][ql][rl][sl][lm][om][pm][qm][mn][pn][no][oo][dq][ar][br][cr][dr][er][fr][hr][kr][as][bs][cs][ds][es][fs][gs][hs][is][js][ks]KGSDE[qc][rd][qh][pi][qi][cm][om]KGSSW[67.50]KGSSB[81.00])
diff --git a/regression/games/kgs/20050408-wrf6041-GNU.sgf b/regression/games/kgs/20050408-wrf6041-GNU.sgf
new file mode 100644 (file)
index 0000000..8eea61c
--- /dev/null
@@ -0,0 +1,281 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[Japanese]SZ[19]KM[0.50]TM[600]OT[25/600 Canadian]
+PW[wrf6041]PB[GNU]WR[12k]BR[13k]DT[2005-04-08]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]RE[B+Resign]
+;B[pd]
+;W[pp]
+;B[cd]
+;W[dp]
+;B[ic]
+;W[jp]
+;B[cn]
+;W[cl]
+;B[en]
+;W[fp]
+;B[gn]
+;W[ci]
+;B[ec]
+;W[qf]
+;B[pn]
+;W[ql]
+;B[om]
+;W[nc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[qc]
+;B[oc]
+;W[qd]
+;B[mc]
+;W[gc]
+;B[me]
+;W[ge]
+;B[nq]
+;W[oq]
+;B[np]
+;W[qp]
+;B[ld]
+;W[qn]
+;B[bp]
+;W[cq]
+;B[bq]
+;W[br]
+;B[cg]
+;W[eb]
+;B[fb]
+;W[dc]
+;B[dd]
+;W[fc]
+;B[ed]
+;W[db]
+;B[ff]
+;W[gf]
+;B[ho]
+;W[hq]
+;B[pl]
+;W[qk]
+;B[lp]
+;W[kq]
+;B[jo]
+;W[cc]
+;B[op]
+;W[pq]
+;B[oj]
+;W[pi]
+;B[fg]
+;W[gg]
+;B[fh]
+;W[ej]
+;B[gh]
+;W[gj]
+;B[hl]
+;W[ij]
+;B[jl]
+;W[fl]
+;B[pb]
+;W[qb]
+;B[kj]
+;W[hh]
+;B[bc]
+;W[bb]
+;B[bd]
+;W[mj]
+;B[oi]
+;W[mh]
+;B[kp]
+;W[lq]
+;B[nr]
+;W[or]
+;B[jq]
+;W[jr]
+;B[ip]
+;W[iq]
+;B[ll]
+;W[nk]
+;B[ok]
+;W[nm]
+;B[nn]
+;W[mm]
+;B[id]
+;W[kg]
+;B[ji]
+;W[jh]
+;B[og]
+;W[ii]
+;B[ph]
+;W[qh]
+;B[qg]
+;W[rg]
+;B[qi]
+;W[pg]
+;B[pj]
+;W[ri]
+;B[po]
+;W[qo]
+;B[bm]
+;W[bl]
+;B[hb]
+;W[gb]
+;B[ar]
+;W[cr]
+;B[qj]
+;W[rj]
+;B[bh]
+;W[bi]
+;B[ki]
+;W[lg]
+;B[qa]
+;W[ra]
+;B[pa]
+;W[sb]
+;B[pf]
+;W[qg]
+;B[pe]
+;W[ch]
+;B[bg]
+;W[dg]
+;B[df]
+;W[eg]
+;B[ef]
+;W[dh]
+;B[ab]
+;W[ba]
+;B[gi]
+;W[hi]
+;B[ei]
+;W[fj]
+;B[ai]
+;W[bj]
+;B[ha]
+;W[fa]
+;B[am]
+;W[al]
+;B[jp]
+;W[lr]
+;B[qe]
+;W[re]
+;B[pc]
+;W[cm]
+;B[bn]
+;W[je]
+;B[jd]
+;W[ie]
+;B[ke]
+;W[kf]
+;B[el]
+;W[ek]
+;B[dl]
+;W[dk]
+;B[dm]
+;W[fm]
+;B[eo]
+;W[em]
+;B[dn]
+;W[ep]
+;B[gk]
+;W[fk]
+;B[gp]
+;W[gq]
+;B[aj]
+;W[ak]
+;B[ah]
+;W[ln]
+;B[kn]
+;W[gm]
+;B[lm]
+;W[mn]
+;B[ml]
+;W[nl]
+;B[hm]
+;W[jk]
+;B[kk]
+;W[il]
+;B[im]
+;W[ik]
+;B[mo]
+;W[lo]
+;B[hk]
+;W[hj]
+;B[di]
+;W[cj]
+;B[hd]
+;W[gd]
+;B[he]
+;W[hf]
+;B[fe]
+;W[hc]
+;B[os]
+;W[ps]
+;B[ns]
+;W[hp]
+;B[go]
+;W[nf]
+;B[ng]
+;W[mf]
+;B[ni]
+;W[mi]
+;B[le]
+;W[of]
+;B[mg]
+;W[lh]
+;B[lf]
+;W[nh]
+;B[oh]
+;W[ga]
+;B[ib]
+;W[aa]
+;B[mk]
+;W[nj]
+;B[ac]
+;W[bs]
+;B[cp]
+;W[do]
+;B[co]
+;W[dq]
+;B[qm]
+;W[rm]
+;B[pm]
+;W[as]
+;B[aq]
+;W[fo]
+;B[fn]
+;W[lj]
+;B[kh]
+;W[jg]
+;B[ls]
+;W[ks]
+;B[ms]
+;W[ir]
+;B[lk]
+;W[mq]
+;B[mp]
+;W[kr]
+;B[km]
+;W[ko]
+;B[pk]
+;W[fd]
+;B[eh]
+;W[]
+;B[dj]
+;W[]
+;B[ck]
+;W[bk]
+;B[ck]
+;W[]
+;B[mr]
+;W[]
+;B[li]
+;W[]
+;B[gl]
+;W[]
+;B[jj]
+;W[]
+;B[ol]
+;W[]
+;B[fi]
+;W[]
+;B[if]
+;W[jf]
+;B[ig]
+;W[ih]
+;B[hg])
diff --git a/regression/games/kgs/Erro-TheGNUGo.sgf b/regression/games/kgs/Erro-TheGNUGo.sgf
new file mode 100644 (file)
index 0000000..0acf600
--- /dev/null
@@ -0,0 +1,195 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[Erro]PB[TheGNUGo]WR[10k]BR[12k]DT[2005-09-03]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (black): GNU Go version 3.7.4
+]RE[W+Resign]
+;W[pp]
+;B[dd]
+;W[cn]
+;B[fp]
+;W[fc]
+;B[nq]
+;W[oq]
+;B[np]
+;W[lq]
+;B[df]
+;W[ck]
+;B[fe]
+;W[ic]
+;B[ci]
+;W[bp]
+;B[cq]
+;W[bq]
+;B[ec]
+;W[fb]
+;B[qn]
+;W[qo]
+;B[pn]
+;W[ro]
+;B[rn]
+;W[oo]
+;B[nm]
+;W[on]
+;B[om]
+;W[no]
+;B[mp]
+;W[iq]
+;B[lo]
+;W[mn]
+;B[kn]
+;W[ln]
+;B[kp]
+;W[kq]
+;B[op]
+;W[po]
+;B[pq]
+;W[or]
+;B[pr]
+;W[jp]
+;B[io]
+;W[jo]
+;B[ko]
+;W[in]
+;B[en]
+;W[ek]
+;B[pj]
+;W[km]
+;B[nr]
+;W[rq]
+;B[mc]
+;W[kc]
+;B[pg]
+;W[ll]
+;B[jm]
+;W[jn]
+;B[qd]
+;W[jf]
+;B[ho]
+;W[jl]
+;B[br]
+;W[ar]
+;B[im]
+;W[hn]
+;B[il]
+;W[jk]
+;B[ik]
+;W[gm]
+;B[cr]
+;W[fr]
+;B[er]
+;W[fq]
+;B[co]
+;W[bo]
+;B[fo]
+;W[eq]
+;B[dr]
+;W[es]
+;B[ij]
+;W[kj]
+;B[eb]
+;W[gd]
+;B[gk]
+;W[fl]
+;B[ih]
+;W[hf]
+;B[rr]
+;W[sr]
+;B[rs]
+;W[mo]
+;B[lp]
+;W[qq]
+;B[qr]
+;W[fg]
+;B[gi]
+;W[ei]
+;B[kh]
+;W[ji]
+;B[jh]
+;W[lj]
+;B[mh]
+;W[ii]
+;B[hh]
+;W[hi]
+;B[ks]
+;W[jr]
+;B[lf]
+;W[gh]
+;B[fj]
+;W[fi]
+;B[fa]
+;W[ga]
+;B[ea]
+;W[hb]
+;B[bj]
+;W[bk]
+;B[dh]
+;W[cj]
+;B[bi]
+;W[ej]
+;B[nj]
+;W[mk]
+;B[lb]
+;W[kb]
+;B[so]
+;W[sp]
+;B[sn]
+;W[mi]
+;B[ni]
+;W[lh]
+;B[lg]
+;W[li]
+;B[kf]
+;W[ke]
+;B[le]
+;W[jd]
+;B[mm]
+;W[lm]
+;B[fd]
+;W[ge]
+;B[ld]
+;W[lc]
+;B[mb]
+;W[jg]
+;B[gg]
+;W[fh]
+;B[kg]
+;W[hg]
+;B[kd]
+;W[je]
+;B[ka]
+;W[jb]
+;B[js]
+;W[is]
+;B[ls]
+;W[rj]
+;B[ja]
+;W[ia]
+;B[la]
+;W[rg]
+;B[ff]
+;W[gf]
+;B[eg]
+;W[rl]
+;B[pl]
+;W[ql]
+;B[rf]
+;W[qg]
+;B[qk]
+;W[rk]
+;B[qf]
+;W[qh]
+;B[sg]
+;W[sh]
+;B[si]
+;W[sf]
+;B[ri]
+;W[qj]
+;B[oh]
+;W[pk]
+;B[ok]
+;W[pi]
+;B[oj]
+;W[re]
+;B[sl]
+;W[rm]
+;B[sm]
+;W[sc])
diff --git a/regression/games/kgs/GNU-HISOKA10.sgf b/regression/games/kgs/GNU-HISOKA10.sgf
new file mode 100644 (file)
index 0000000..6bdd0e8
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[GNU]WR[13k]
+PB[HISOKA10]BR[14k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-26]RE[W+7.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]
+CA[UTF-8]
+;B[pd];W[dd];B[qp];W[dp];B[oq];W[qj];B[ql];W[qf];B[qh];W[nc];B[nd]
+;W[md];B[ne];W[oc];B[pe];W[qb];B[oh];W[rd];B[pf];W[oj];B[ol];W[mj]
+;B[qe];W[hq];B[cj];W[kq];B[cn];W[co];B[dn];W[fp];B[fc];W[fd];B[gd]
+;W[fe];B[ec];W[dc];B[jc];W[df];B[bg];W[be];B[lb];W[qg];B[pg];W[rh]
+;B[qi];W[re];B[ri];W[rg];B[ml];W[pk];B[pl];W[rj];B[sh];W[lc];B[mb]
+;W[lf];B[sg];W[rf];B[pi];W[sj];B[si];W[sl];B[rm];W[sm];B[ro];W[qk]
+;B[lh];W[li];B[lg];W[rl];B[qn];W[mh];B[ni];W[nj];B[ok];W[mg];B[pj]
+;W[kg];B[kh];W[jh];B[ki];W[kj];B[ji];W[ii];B[jj];W[jk];B[ij];W[hj]
+;B[ik];W[il];B[hk];W[gk];B[fn];W[hl];B[bn];W[bo];B[ao];W[ap];B[an]
+;W[bq];B[eb];W[db];B[da];W[ca];B[ea];W[bb];B[hd];W[mq];B[mp];W[nr]
+;B[nq];W[mr];B[lp];W[qs];B[lq];W[pr];B[or];W[lr];B[ns];W[ll];B[lm]
+;W[ek];B[dk];W[dh];B[ch];W[if];B[hf];W[hg];B[gf];W[mc];B[gg];W[nb]
+;B[kc];W[el];B[dl];W[ma];B[kb];W[kl];B[kp];W[jq];B[jp];W[mk];B[iq]
+;W[ir];B[kr];W[jr];B[ip];W[ks];B[pc];W[pb];B[di];W[nl];B[nm];W[mm]
+;B[mn];W[ml];B[on];W[km];B[ln];W[oi];B[ph];W[nh];B[dg];W[eh];B[eg]
+;W[gh];B[hh];W[ig];B[fh];W[gi];B[cf];W[ei];B[ej];W[fi];B[ce];W[de]
+;B[bd];W[bc];B[ad];W[cd];B[bf];W[fj];B[hp];W[gp];B[do];W[eo];B[ie]
+;W[en];B[em];W[fm];B[dm];W[gm];B[hn];W[in];B[io];W[jn];B[jo];W[go]
+;B[kn];W[ho];B[ko];W[nf];B[of];W[od];B[oe];W[qc];B[sn];W[ke];B[je]
+;W[me];B[la];W[kd];B[jd];W[jf];B[na];W[oa];B[fg];W[ac];B[ae];W[ef]
+;B[ge];W[ed];B[ms];W[os];B[ps];W[qr];B[os];W[ls];B[js];W[is];B[dj]
+;W[ma];B[hr];W[gq];B[na];W[qd];B[rk];W[sf];B[sk];W[ng];B[ma];W[ff]
+;B[og];W[nk];B[];W[]TB[fa][ga][ha][ia][ja][ka][fb][gb][hb][ib][jb]
+[gc][hc][ic][id][be][he][af][ag][cg][ah][bh][ai][bi][ci][aj][bj][qj]
+[rj][sj][ak][bk][ck][pk][qk][al][bl][cl][rl][sl][am][bm][cm][om][pm]
+[qm][sm][nn][pn][rn][lo][mo][no][oo][po][qo][so][np][op][pp][rp][sp]
+[pq][qq][rq][sq][pr][qr][rr][sr][qs][rs][ss]TW[aa][ba][pa][qa][ra]
+[sa][ab][cb][ob][rb][sb][cc][rc][sc][ld][sd][ee][le][se][kf][mf][jg]
+[lg][hh][ih][kh][lh][hi][ji][ki][mi][ni][gj][ij][jj][lj][fk][hk][ik]
+[kk][lk][fl][gl][jl][hm][im][jm][fn][gn][hn][fo][bp][cp][ep][aq][cq]
+[dq][eq][fq][ar][br][cr][dr][er][fr][gr][hr][kr][as][bs][cs][ds][es]
+[fs][gs][hs][js]KGSSW[95.50]KGSDE[qs]KGSSB[88.00])
diff --git a/regression/games/kgs/GNU-bassanio.sgf b/regression/games/kgs/GNU-bassanio.sgf
new file mode 100644 (file)
index 0000000..cd2b392
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[GNU]WR[13k]
+PB[bassanio]BR[14k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-07]AP[CGoban:2]
+RE[W+10.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;B[dp];W[pc];B[pp];W[cd];B[qe];W[od];B[qi];W[pf];B[qf];W[pg];B[qg]
+;W[dh];B[ec];W[ic];B[cc];W[bc];B[dd];W[ce];B[cb];W[qn];B[nq];W[rp]
+;B[qq];W[qk];B[on];W[dn];B[hq];W[co];B[cp];W[fn];B[fp];W[hn];B[oi]
+;W[jn];B[jp];W[bb];B[de];W[cf];B[ge];W[ie];B[rl];W[ql];B[rk];W[rm]
+;B[rj];W[rq];B[rr];W[om];B[nm];W[df];B[ef];W[mg];B[bn];W[bo];B[bp]
+;W[ao];B[ap];W[gg];B[hf];W[ih];B[jg];W[if];B[hg];W[hh];B[ig];W[kf]
+;B[gh];W[fh];B[gi];W[eg];B[ji];W[hi];B[gj];W[jh];B[kh];W[hj];B[hk]
+;W[ek];B[ik];W[rd];B[re];W[km];B[kk];W[ol];B[qd];W[rc];B[qc];W[qb]
+;B[rb];W[sb];B[jf];W[je];B[nl];W[ok];B[nk];W[ko];B[kp];W[gc];B[gd]
+;W[qp];B[pq];W[sr];B[rs];W[po];B[oo];W[pn];B[gf];W[lo];B[lp];W[eo]
+;B[do];W[cn];B[ep];W[pb];B[mi];W[fb];B[fc];W[gb];B[hd];W[hc];B[id]
+;W[jd];B[fl];W[fo];B[el];W[dl];B[fk];W[dk];B[fg];W[gp];B[gq];W[hp]
+;B[ip];W[io];B[mo];W[eb];B[fi];W[eh];B[ei];W[di];B[sd];W[ra];B[oj]
+;W[db];B[dc];W[ca];B[fe];W[ln];B[mn];W[ll];B[lk];W[ph];B[pi];W[ej]
+;B[lh];W[nh];B[ni];W[jl];B[jk];W[em];B[oh]C[ochaen [13k\]: G7
+];W[lg]
+;B[kg];W[ng];B[og];W[of];B[mh];W[le];B[qh];W[sl];B[sk];W[sm];B[qj]
+;W[ml];B[mk];W[pe];B[il];W[kl];B[im];W[hm];B[in];W[jo];B[pk];W[pl]
+;B[hl];W[gm];B[gl];W[mm];B[se];W[sc];B[pd];W[pj];B[nf];W[oe];B[pk]
+;W[qr];B[ps];W[pj];B[lf];W[mf];B[pk];W[or];B[pr];W[pj];B[nr];W[pk]
+;B[jm];W[fm];B[fj];W[he];B[qs];W[sq];B[ss];W[];B[ro];W[so];B[qm]
+;W[pm];B[ne];W[nd];B[];W[]TB[ed][fd][ee][ff][rf][sf][gg][rg][sg][hh]
+[ih][jh][rh][sh][hi][ii][ki][li][ri][si][hj][ij][jj][kj][lj][mj][nj]
+[sj][gk][nn][no][mp][np][op][aq][bq][cq][dq][eq][fq][iq][jq][kq][lq]
+[mq][oq][ar][br][cr][dr][er][fr][gr][hr][ir][jr][kr][lr][mr][or][qr]
+[as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls][ms][ns][os]TW[aa]
+[ba][da][ea][fa][ga][ha][ia][ja][ka][la][ma][na][oa][pa][qa][sa][ab]
+[hb][ib][jb][kb][lb][mb][nb][ob][rb][ac][jc][kc][lc][mc][nc][oc][ad]
+[bd][kd][ld][md][ae][be][ke][me][ne][af][bf][lf][nf][ag][bg][cg][dg]
+[ah][bh][ch][ai][bi][ci][aj][bj][cj][dj][ak][bk][ck][al][bl][cl][am]
+[bm][cm][dm][lm][qm][an][bn][en][gn][kn][rn][sn][go][ho][qo][ro][sp])
diff --git a/regression/games/kgs/GNU-goodluck.sgf b/regression/games/kgs/GNU-goodluck.sgf
new file mode 100644 (file)
index 0000000..4aee4c7
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.50]
+PW[GNU]WR[13k]
+PB[goodluck]BR[22k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-19]AP[CGoban:2]
+RE[W+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][dj][pj][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.8
+]ST[2]
+CA[UTF-8]
+;W[cn];B[co];W[dn];B[jj];W[ep];B[dq];W[nq];B[oq];W[np];B[eo];W[nn]
+;B[fp];W[fm];B[en];W[em];B[dl];W[nc];B[oc];W[nd];B[oe];W[mf];B[ne]
+;W[me];B[cg];W[qf];B[qe];W[jq];B[hq];W[dm];B[cl];W[fc];B[ec];W[fd]
+;B[ee];W[jc];B[fe];W[pf];B[of];W[pe];B[rd];W[od];B[og];W[pc];B[qc]
+;W[qd];B[qb];W[re];B[pb];W[rc];B[pd];W[sd];B[nb];W[mb];B[ma];W[lb]
+;B[rb];W[pc];B[ob];W[sb];B[pd];W[he];B[mg];W[bn];B[bo];W[pn];B[fb]
+;W[qq];B[lf];W[le];B[kf];W[gb];B[ea];W[ql];B[ke];W[hc];B[kd];W[mc]
+;B[kc];W[kb];B[jg];W[ok];B[oj];W[nk];B[nj];W[mk];B[mj];W[ak];B[bj]
+;W[aj];B[bk];W[al];B[bm];W[am];B[el];W[hm];B[pg];W[gj];B[gl];W[gm]
+;B[fl];W[gh];B[fh];W[fi];B[ei];W[ej];B[dh];W[hg];B[gf];W[hf];B[gg]
+;W[jl];B[hh];W[ip];B[hp];W[gi];B[hi];W[hk];B[ik];W[hl];B[il];W[im]
+;B[hj];W[gk];B[jk];W[kl];B[kk];W[ao];B[ap];W[an];B[bq];W[ir];B[hr]
+;W[lk];B[lj];W[ri];B[qi];W[qh];B[qg];W[rj];B[rh];W[rg];B[ph];W[sh]
+;B[qh];W[bi];B[bh];W[ci];B[di];W[hs];B[gs];W[is];B[fr];W[ho];B[go]
+;W[iq];B[hn];W[io];B[gn];W[ek];B[dk];W[ge];B[fg];W[pk];B[qp];W[rq]
+;B[rp];W[or];B[pr];W[pq];B[qr];W[op];B[sq];W[rr];B[rs];W[sr];B[sp]
+;W[po];B[qo];W[ed];B[rn];W[dc];B[cc];W[eb];B[db];W[ec];B[fa];W[cd]
+;B[de];W[bc];B[cb];W[bd];B[bb];W[ab];B[be];W[ba];B[ad];W[ac];B[gd]
+;W[gc];B[ig];W[fk];B[ce];W[ae];B[af];W[ca];B[ad];W[da];B[ae];W[in]
+;B[fn];W[qj];B[ra];W[na];B[oa];W[pc];B[sa];W[pd];B[sc];W[rd];B[sf]
+;W[sg];B[rm];W[rl];B[sm];W[so];B[qm];W[pm];B[sn];W[nf];B[ng];W[cj]
+;B[ld];W[bl];B[md];W[ck];B[ch];W[cm];B[ah];W[jd];B[je];W[ie];B[if]
+;W[do];B[eq];W[ai];B[os];W[ns];B[ms];W[nr];B[qs];W[ps];B[me];W[lc]
+;B[jb];W[ic];B[ib];W[hb];B[ka];W[la];B[cb];W[bb];B[mo];W[ko];B[lo]
+;W[lp];B[kn];W[ln];B[lm];W[mm];B[mn];W[jn];B[nm];W[ml];B[no];W[km]
+;B[on];W[oo];B[mp];W[kp];B[mq];W[mr];B[lr];W[ls];B[ks];W[ln];B[ms]
+;W[kr];B[os];W[bp];B[cp];W[];B[kn];W[js];B[lq];W[ls];B[ol];W[om]
+;B[nn];W[ln];B[];W[]TB[le][bf][cf][df][ef][ff][jf][mf][nf][ag][bg]
+[dg][eg][kg][lg][eh][ih][jh][kh][lh][mh][nh][oh][ii][ji][ki][li][mi]
+[ni][oi][pi][ij][kj][fo][bp][ep][gp][aq][cq][fq][gq][ar][br][cr][dr]
+[er][gr][as][bs][cs][ds][es][fs]TW[aa][ea][fa][ga][ha][ia][ja][ka]
+[ma][na][oa][pa][qa][ra][sa][cb][db][fb][ib][jb][nb][ob][pb][qb][rb]
+[sb][cc][oc][qc][sc][gd][hd][id][qe][se][rf][sf][si][bj][fj][sj][bk]
+[qk][rk][sk][ll][nl][ol][pl][sl][bm][jm][lm][nm][qm][rm][sm][kn][mn]
+[nn][on][qn][rn][sn][jo][lo][mo][no][qo][ro][jp][mp][pp][qp][rp][sp]
+[kq][lq][mq][oq][sq][jr][lr][pr][qr][ks][ms][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/GNU-higher.sgf b/regression/games/kgs/GNU-higher.sgf
new file mode 100644 (file)
index 0000000..6bdd5f8
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.50]
+PW[GNU]WR[13k]
+PB[higher]BR[16k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-29]AP[CGoban:2]
+RE[B+6.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[pd][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;W[dd];B[qn];W[qf];B[pi];W[of];B[nd];W[rd];B[qc];W[ri];B[qk];W[dn]
+;B[fo];W[mp];B[kp];W[mn];B[kn];W[lc];B[mc];W[ld];B[rc];W[hd];B[jd]
+;W[jc];B[ic];W[id];B[kc];W[jb];B[kb];W[kd];B[ib];W[ja];B[je];W[lb]
+;B[gb];W[if];B[ie];W[ha];B[ia];W[ka];B[ga];W[fc];B[gd];W[gc];B[hb]
+;W[fb];B[he];W[hc];B[ge];W[nq];B[pq];W[ml];B[kl];W[pm];B[qm];W[lr]
+;B[jr];W[ck];B[mj];W[df];B[gg];W[ei];B[gi];W[jf];B[dj];W[ej];B[dk]
+;W[ek];B[dl];W[gk];B[ih];W[kf];B[ke];W[cq];B[dq];W[cp];B[cl];W[do]
+;B[eo];W[cj];B[di];W[bl];B[ci];W[cm];B[el];W[kh];B[fl];W[ji];B[hj]
+;W[lf];B[le];W[mf];B[me];W[ne];B[oe];W[pe];B[nf];W[ng];B[ne];W[qd]
+;B[pc];W[jk];B[jl];W[ik];B[il];W[hk];B[gl];W[gj];B[hi];W[cr];B[dr]
+;W[oa];B[na];W[nb];B[ob];W[pa];B[mb];W[ma];B[nc];W[na];B[cc];W[bd]
+;B[cd];W[ce];B[bc];W[be];B[dc];W[ec];B[og];W[ed];B[pf];W[qg];B[qe]
+;W[re];B[lk];W[eh];B[nm];W[mm];B[ol];W[ds];B[er];W[es];B[fs];W[cs]
+;B[fr];W[bj];B[bi];W[ni];B[nh];W[rk];B[rl];W[qj];B[pk];W[pj];B[oj]
+;W[oi];B[qi];W[rj];B[ph];W[oh];B[pg];W[pe];B[mg];W[nj];B[ok];W[nk]
+;B[nn];W[no];B[oo];W[op];B[pn];W[or];B[oq];W[np];B[pr];W[mr];B[os]
+;W[ns];B[nr];W[mh];B[ng];W[mi];B[jj];W[kj];B[ij];W[kk];B[ll];W[aj]
+;B[lj];W[kr];B[kq];W[js];B[ir];W[ra];B[li];W[ki];B[lh];W[or];B[ps]
+;W[lq];B[nr];W[hh];B[gh];W[or];B[nl];W[nr];B[lo];W[mo];B[mk];W[hg]
+;B[hf];W[ig];B[ii];W[bg];B[is];W[en];B[fn];W[hl];B[hm];W[pb];B[oc]
+;W[ks];B[em];W[dm];B[qe];W[rf];B[sd];W[qh];B[se];W[sf];B[sc];W[pe]
+;B[eg];W[dh];B[dg];W[cg];B[ef];W[ch];B[ee];W[de];B[fd];W[sk];B[sl]
+;W[fh];B[fg];W[lm];B[km];W[qb];B[ah];W[rb];B[ag];W[af];B[fj];W[fk]
+;B[fi];W[sb];B[ai];W[bm];B[qe];W[lg];B[jg];W[kg];B[jh];W[pe];B[ba]
+;W[ab];B[ac];W[qe];B[da];W[db];B[cb];W[eb];B[sh];W[rh];B[si];W[sg]
+;B[lp];W[ln];B[];W[md];B[];W[bh];B[];W[cf];B[];W[fa];B[];W[]TB[od]
+[fe][ff][gf][of][mh][oh][mi][ni][oi][nj][nk][pl][ql][fm][gm][im][jm]
+[om][pm][rm][sm][gn][hn][in][jn][on][rn][sn][go][ho][io][jo][ko][po]
+[qo][ro][so][ep][fp][gp][hp][ip][jp][qp][rp][sp][eq][fq][gq][hq][iq]
+[jq][qq][rq][sq][gr][hr][qr][rr][sr][gs][hs][qs][rs][ss]TW[aa][ba]
+[ca][da][ea][ga][ha][ia][la][qa][sa][bb][cb][gb][hb][ib][kb][ac][bc]
+[cc][dc][ic][kc][ad][cd][ae][bf][rg][sh][si][sj][ak][bk][al][am][an]
+[bn][cn][ao][bo][co][ap][bp][aq][bq][mq][ar][br][as][bs][ls][ms])
diff --git a/regression/games/kgs/GNU-ituyosi.sgf b/regression/games/kgs/GNU-ituyosi.sgf
new file mode 100644 (file)
index 0000000..76981d6
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.50]
+PW[GNU]WR[13k]
+PB[ituyosi]BR[16k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-30]AP[CGoban:2]
+RE[B+22.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[pd][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+]
+CA[UTF-8]ST[2]
+;W[cd];B[jd];W[pf];B[ec];W[de];B[cc];W[bc];B[dc];W[dn];B[ee];W[df]
+;B[dh];W[qn];B[bb];W[md];B[nc];W[fp];B[bd];W[qk];B[be];W[eg];B[cg]
+;W[qe];B[qd];W[nq];B[ck];W[qq];B[pq];W[oo];B[qp];W[rq];B[or];W[rp]
+;B[nr];W[mq];B[mr];W[lr];B[po];W[on];B[pn];W[pm];B[qm];W[rm];B[rn]
+;W[sn];B[qo];W[ro];B[qn];W[ql];B[op];W[np];B[lq];W[kq];B[lp];W[kr]
+;B[om];W[pl];B[nn];W[no];B[nm];W[mo];B[ln];W[lo];B[kp];W[ko];B[jp]
+;W[jq];B[io];W[kn];B[iq];W[ir];B[hq];W[hr];B[gq];W[pr];B[fq];W[gg]
+;B[he];W[kc];B[mc];W[jc];B[kd];W[lb];B[lc];W[jb];B[hc];W[mb];B[nb]
+;W[hb];B[gb];W[ic];B[hd];W[ia];B[ga];W[ka];B[ld];W[es];B[er];W[fs]
+;B[dr];W[ds];B[br];W[cs];B[bs];W[gr];B[fr];W[cr];B[cq];W[nk];B[gs]
+;W[oq];B[oh];W[ng];B[ni];W[qh];B[mk];W[fj];B[lm];W[lg];B[mj];W[ig]
+;B[ok];W[hj];B[il];W[gl];B[em];W[eo];B[fn];W[re];B[rd];W[sd];B[sc]
+;W[se];B[rc];W[hm];B[im];W[km];B[ll];W[kl];B[kk];W[ki];B[jk];W[gn]
+;B[go];W[fm];B[en];W[el];B[dm];W[dj];B[cj];W[dl];B[cl];W[na];B[oa]
+;W[ma];B[ob];W[ho];B[gp];W[in];B[jn];W[hn];B[ip];W[mn];B[mm];W[nl]
+;B[ol];W[ne];B[ji];W[jh];B[ii];W[me];B[hh];W[hg];B[gi];W[fi];B[qi]
+;W[pi];B[ph];W[ri];B[qg];W[rh];B[pg];W[og];B[rg];W[hi];B[ih];W[kh]
+;B[gh];W[fh];B[gj];W[ij];B[hk];W[jj];B[gk];W[fk];B[kj];W[sg];B[pe]
+;W[qf];B[rf];W[sf];B[of];W[sh];B[oe];W[hl];B[ik];W[oi];B[nh];W[qj]
+;B[nf];W[mf];B[mg];W[mh];B[ng];W[kf];B[jf];W[jg];B[if];W[jo];B[jm]
+;W[oj];B[nj];W[dd];B[ed];W[li];B[mi];W[hs];B[fs];W[os];B[dk];W[di]
+;B[ek];W[lh];B[fl];W[el];B[eh];W[ci];B[cf];W[bi];B[bj];W[ha];B[fc]
+;W[id];B[ie];W[nd];B[od];W[aj];B[ak];W[ai];B[ac];W[lj];B[lk];W[ke]
+;B[le];W[lf];B[dg];W[ef];B[fo];W[fe];B[gf];W[ge];B[hf];W[ff];B[gd]
+;W[fd];B[je];W[pk];B[bg];W[ag];B[af];W[ah];B[ce];W[fg];B[ep];W[fl]
+;B[dl];W[ei];B[];W[hp];B[];W[jl];B[];W[mp];B[];W[ej];B[];W[ch];B[]
+;W[bh];B[];W[]TB[aa][ba][ca][da][ea][fa][pa][qa][ra][sa][ab][cb][db]
+[eb][fb][pb][qb][rb][sb][bc][gc][oc][pc][qc][ad][ae][bf][og][hi][hj]
+[ij][jj][bk][nk][al][bl][ml][nl][am][bm][cm][an][bn][cn][dn][ao][bo]
+[co][do][eo][ap][bp][cp][fp][aq][bq][dq][eq][ar][cr][as][cs][ds][es]
+TW[ja][la][ib][kb][kg][qi][si][pj][rj][sj][rk][sk][rl][sl][gm][qm]
+[sm][pn][qn][rn][po][qo][so][op][pp][qp][sp][pq][sq][jr][mr][nr][or]
+[qr][rr][sr][is][js][ks][ls][ms][ns][ps][qs][rs][ss])
diff --git a/regression/games/kgs/GNU-ituyosi2.sgf b/regression/games/kgs/GNU-ituyosi2.sgf
new file mode 100644 (file)
index 0000000..19a61b1
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.50]
+PW[GNU]WR[13k]
+PB[ituyosi]BR[17k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-03-14]AP[CGoban:2]
+RE[W+33.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.9
+]
+CA[UTF-8]ST[2]
+;W[cn];B[jj];W[fq];B[co];W[dn];B[do];W[en];B[eo];W[fn];B[fo];W[gn]
+;B[gp];W[gq];B[hp];W[hq];B[ip];W[iq];B[kp];W[jq];B[kq];W[dr];B[cq]
+;W[mq];B[kr];W[jr];B[jp];W[mo];B[oq];W[fc];B[in];W[ic];B[dj];W[qf]
+;B[pj];W[nn];B[mc];W[of];B[kc];W[rd];B[qc];W[rc];B[mr];W[cf];B[ef]
+;W[ek];B[ch];W[bd];B[cc];W[dg];B[ej];W[bc];B[cb];W[ee];B[ed];W[fe]
+;B[fd];W[gd];B[ec];W[gb];B[fb];W[gc];B[eb];W[bb];B[db];W[fa];B[ge]
+;W[de];B[he];W[fk];B[ib];W[jb];B[hb];W[ia];B[ha];W[hc];B[ja];W[ga]
+;B[jc];W[kb];B[lb];W[ia];B[id];W[fj];B[eh];W[fi];B[eg];W[cl];B[dk]
+;W[dl];B[dh];W[ff];B[fh];W[gi];B[gh];W[qb];B[pb];W[hi];B[gf];W[hh]
+;B[hg];W[jh];B[je];W[bj];B[bh];W[ba];B[ce];W[cd];B[be];W[bf];B[df]
+;W[ae];B[cg];W[cr];B[bq];W[qn];B[qp];W[pm];B[ph];W[rh];B[rb];W[sb]
+;B[qa];W[qk];B[qj];W[rj];B[pk];W[rk];B[qh];W[rf];B[pf];W[pe];B[pg]
+;W[oe];B[od];W[nr];B[nq];W[lr];B[mp];W[ks];B[lq];W[ro];B[ls];W[rq]
+;B[rp];W[sp];B[qo];W[lh];B[pl];W[ql];B[om];W[on];B[ol];W[ig];B[if]
+;W[nh];B[ni];W[mi];B[nj];W[ml];B[mj];W[lj];B[jg];W[mk];B[ih];W[ki]
+;B[ji];W[mf];B[lk];W[bo];B[gl];W[hm];B[kh];W[qq];B[ng];W[mg];B[og]
+;W[oh];B[rg];W[qg];B[ri];W[sg];B[si];W[me];B[oi];W[qi];B[mh];W[nh]
+;B[lg];W[li];B[kj];W[mh];B[kk];W[pr];B[or];W[nd];B[nc];W[lf];B[kg]
+;W[ei];B[di];W[br];B[hk];W[im];B[hj];W[ar];B[aq];W[jm];B[ln];W[mm]
+;B[km];W[no];B[pq];W[qs];B[jn];W[lo];B[ko];W[bp];B[fl];W[el];B[bk]
+;W[ck];B[cj];W[bi];B[ah];W[bl];B[hn];W[hl];B[gk];W[gm];B[jl];W[ak]
+;B[ap];W[il];B[ik];W[qd];B[ob];W[md];B[ld];W[go];B[fp];W[eq];B[ao]
+;W[fm];B[bn];W[bm];B[an];W[js];B[ns];W[qr];B[la];W[ka];B[hd];W[fg]
+;B[ce];W[be];B[gg];W[ce];B[hb];W[ho];B[io];W[kf];B[ke];W[jf];B[ra]
+;W[ii];B[ij];W[ll];B[kl];W[po];B[np];W[oo];B[lm];W[am];B[cp];W[ai]
+;B[nk];W[sh];B[pi];W[sj];B[qi];W[nf];B[ea];W[ca];B[ha];W[ib];B[le]
+;W[sc];B[sa];W[mn];B[lp];W[dq];B[os];W[sr];B[ag];W[ep];B[af];W[bg]
+;B[ac];W[ab];B[op];W[ci];B[ps];W[gj];B[rn];W[rm];B[so];W[rs];B[sq]
+;W[qm];B[ro];W[sm];B[sl];W[pn];B[nl];W[oh];B[sn];W[sp];B[rl];W[sk]
+;B[rl];W[oj];B[se];W[sq];B[sf];W[rg];B[re];W[qe];B[];W[sl];B[ok];W[]
+;B[]TB[ma][na][oa][pa][mb][nb][qb][lc][oc][pc][jd][kd][ie][hf][dg]
+[ig][jh][jk][kn][bo][jo][bp][mq][lr][nr][ms]TW[aa][da][ea][ha][ja]
+[cb][db][eb][fb][hb][ac][cc][dc][ec][ad][dd][ed][fd][sd][ne][re][se]
+[sf][aj][bk][al][cm][dm][em][er][fr][gr][hr][ir][rr][as][bs][cs][ds]
+[es][fs][gs][hs][is][ss])
diff --git a/regression/games/kgs/GNU-ivanho.sgf b/regression/games/kgs/GNU-ivanho.sgf
new file mode 100644 (file)
index 0000000..96a9283
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]KM[6.50]
+PW[GNU]WR[13k]
+PB[ivanho]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-29]AP[CGoban:2]
+RE[W+17.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;B[pd];W[dd];B[pp];W[dp];B[pj];W[nq];B[kp];W[no];B[pn];W[pr];B[fq]
+;W[kr];B[cn];W[eo];B[hp];W[nc];B[qf];W[pb];B[mc];W[md];B[lc];W[qq]
+;B[qp];W[qc];B[qd];W[eq];B[fr];W[dj];B[fc];W[hc];B[cc];W[cd];B[dc]
+;W[ed];B[gc];W[ec];B[eb];W[hd];B[bc];W[ld];B[nb];W[ob];B[kd];W[jc]
+;B[kc];W[ke];B[nd];W[bd];B[fj];W[oc];B[le];W[me];B[je];W[lf];B[jd]
+;W[jb];B[kf];W[kg];B[jf];W[fp];B[gp];W[go];B[ho];W[gn];B[lg];W[mg]
+;B[lh];W[cl];B[cq];W[hn];B[cp];W[er];B[in];W[nm];B[ol];W[hk];B[hj]
+;W[od];B[ne];W[of];B[le];W[mf];B[fe];W[jg];B[ig];W[gb];B[fb];W[dg]
+;B[gg];W[ph];B[qh];W[qi];B[pg];W[qj];B[oh];W[pi];B[pk];W[rl];B[ql]
+;W[oi];B[ng];W[og];B[mh];W[nf];B[nh];W[rm];B[rn];W[dn];B[bm];W[rh]
+;B[rg];W[qg];B[pf];W[oe];B[qh];W[sh];B[rk];W[qk];B[qm];W[rj];B[rc]
+;W[re];B[qb];W[pc];B[rb];W[rd];B[qe];W[rf];B[bk];W[fk];B[gk];W[gl]
+;B[gj];W[ik];B[jj];W[ch];B[bi];W[bh];B[on];W[nn];B[kn];W[mb];B[lb]
+;W[na];B[mp];W[np];B[lr];W[lq];B[kq];W[mr];B[jr];W[ls];B[ek];W[kl]
+;B[ck];W[lj];B[ki];W[lm];B[ln];W[cm];B[bn];W[js];B[ir];W[dk];B[el]
+;W[dl];B[em];W[bs];B[cr];W[cs];B[br];W[es];B[co];W[bl];B[al];W[la]
+;B[ka];W[kb];B[ma];W[ia];B[hb];W[lp];B[lo];W[ai];B[aj];W[ah];B[am]
+;W[is];B[hs];W[ks];B[hr];W[ac];B[ab];W[ad];B[bb];W[rp];B[ro];W[rq]
+;B[sm];W[sk];B[om];W[nb];B[la];W[mo];B[km];W[dm];B[eg];W[ll];B[df]
+;W[bf];B[cf];W[eh];B[fg];W[cg];B[ge];W[fl];B[ej];W[im];B[jm];W[jl]
+;B[jo];W[ij];B[ii];W[ce];B[ee];W[fh];B[gh];W[ei];B[fm];W[gm];B[fn]
+;W[fo];B[nk];W[ci];B[bj];W[de];B[ef];W[ni];B[mj];W[mi];B[li];W[mk]
+;B[nj];W[nl];B[oj];W[kj];B[kk];W[lk];B[ji];W[jk];B[oq];W[or];B[sp]
+;W[sq];B[so];W[op];B[po];W[pq];B[fs];W[fd];B[gd];W[mn];B[sn];W[sl]
+;B[dr];W[ds];B[ar];W[fi];B[gi];W[dq];B[ao];W[do];B[ke];W[cj];B[ak]
+;W[oo];B[];W[as];B[];W[en];B[];W[]TB[aa][ba][ca][da][ea][fa][ga][ha]
+[ia][ja][cb][db][gb][ib][jb][kb][hc][ic][jc][hd][id][he][ie][ff][gf]
+[hf][if][hg][jg][kg][hh][ih][jh][kh][hi][ok][pl][pm][an][jn][qn][bo]
+[io][ko][qo][ap][bp][ip][jp][aq][bq][gq][hq][iq][jq][gr][gs]TW[oa]
+[pa][qa][ra][sa][qb][rb][sb][rc][sc][nd][pd][qd][sd][ae][be][ne][pe]
+[qe][se][af][pf][qf][sf][ag][bg][pg][qg][rg][sg][dh][qh][di][ri][si]
+[sj][kk][rk][hl][il][ml][hm][mm][ep][mp][mq][oq][lr][nr][qr][rr][sr]
+[ms][ns][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/GNU-marfan.sgf b/regression/games/kgs/GNU-marfan.sgf
new file mode 100644 (file)
index 0000000..c8555f4
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.50]
+PW[GNU]WR[13k]
+PB[marfan]BR[20k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-05]AP[CGoban:2]
+RE[B+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][dj][pj][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;W[fq];B[dn];W[nq];B[jd];W[jp];B[on];W[nc];B[of];W[gd];B[me];W[ld]
+;B[jf];W[df];B[be];W[mn];B[ol];W[pb];B[rc];W[ml];B[go];W[hp];B[fm]
+;W[pq];B[qq];W[mj];B[ni];W[dr];B[cq];W[cr];B[ec];W[gf];B[ch];W[bf]
+;B[ce];W[cf];B[cc];W[pr];B[qr];W[hm];B[fk];W[kc];B[lg];W[ee];B[eh]
+;W[jk];B[hk];W[br];B[bq];W[aq];B[ap];W[ar];B[bo];W[rb];B[qc];W[qb]
+;B[il];W[sc];B[sd];W[sb];B[re];W[op];B[po];W[ho];B[gn];W[im];B[gi]
+;W[jl];B[hc];W[ib];B[gc];W[ji];B[kg];W[qs];B[rs];W[ps];B[sr];W[hb]
+;B[gb];W[hg];B[fd];W[ih];B[ge];W[ai];B[ak];W[aj];B[bk];W[ga];B[hd]
+;W[eg];B[bh];W[ea];B[ca];W[af];B[ae];W[md];B[ah];W[fh];B[fi];W[dh]
+;B[di];W[ei];B[ej];W[ke];B[je];W[ne];B[nf];W[oe];B[pe];W[mf];B[mg]
+;W[nj];B[mi];W[li];B[lf];W[no];B[od];W[nd];B[oc];W[ob];B[jc];W[kb]
+;B[jb];W[ja];B[if];W[gp];B[fo];W[ep];B[eo];W[dq];B[fp];W[cp];B[eq]
+;W[er];B[gq];W[ep];B[do];W[bp];B[eq];W[fr];B[ao];W[co];B[cn];W[bn]
+;B[bm];W[an];B[cl];W[nk];B[oj];W[nm];B[om];W[le];B[lh];W[kh];B[lj]
+;W[ki];B[ok];W[nl];B[hf];W[eh];B[gh];W[gg];B[hh];W[ig];B[ik];W[ij]
+;B[hj];W[ii];B[fb];W[fa];B[da];W[ha];B[eb];W[ka];B[ic];W[ia];B[fe]
+;W[hn];B[ff];W[fg];B[ef];W[de];B[ed];W[mf];B[gm];W[hl];B[gl];W[hi]
+;B[gj];W[am];B[al];W[jg];B[kf];W[me];B[kd];W[mb];B[nh];W[ep];B[cg]
+;W[dg];B[eq];W[cd];B[bd];W[ep];B[oo];W[eq];B[nn];W[pc];B[qd];W[ag]
+;B[bi];W[bg];B[bj];W[];B[mo];W[np];B[ln];W[mm];B[mp];W[qp];B[qo]
+;W[lo];B[mq];W[nr];B[mr];W[or];B[ns];W[lp];B[ms])
diff --git a/regression/games/kgs/GNU-merlenoir.sgf b/regression/games/kgs/GNU-merlenoir.sgf
new file mode 100644 (file)
index 0000000..0fb3367
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.50]
+PW[GNU]WR[13k]
+PB[merlenoir]BR[16k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-30]AP[CGoban:2]
+RE[B+2.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[pd][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;W[jj];B[dd];W[nq];B[pn];W[cf];B[fd];W[qf];B[nd];W[fq];B[dn];W[jp]
+;B[ch];W[hc];B[gc];W[hd];B[ff];W[bd];B[cc];W[dg];B[dh];W[bc];B[jd]
+;W[jb];B[kc];W[rd];B[qc];W[qi];B[qk];W[rc];B[rb];W[pr];B[qq];W[dr]
+;B[cq];W[qr];B[rr];W[fo];B[kb];W[fm];B[if];W[fk];B[dk];W[nn];B[mi]
+;W[ha];B[gb];W[cb];B[db];W[bb];B[he];W[cr];B[br];W[ml];B[kk];W[km]
+;B[jl];W[ik];B[im];W[lj];B[lk];W[kj];B[mk];W[jg];B[kf];W[hn];B[in]
+;W[hm];B[ip];W[jq];B[hp];W[io];B[jo];W[ho];B[kn];W[ln];B[lo];W[mo]
+;B[np];W[mp];B[no];W[lp];B[ko];W[jm];B[lm];W[mm];B[ll];W[il];B[mn]
+;W[jn];B[nm];W[ln];B[qg];W[rg];B[mn];W[pg];B[on];W[bg];B[bh];W[ag]
+;B[hi];W[gh];B[jh];W[kh];B[ih];W[kg];B[lf];W[ig];B[hh];W[hg];B[gi]
+;W[fi];B[fh];W[gg];B[fj];W[ej];B[ei];W[ek];B[dj];W[ah];B[ai];W[bi]
+;B[bk];W[aj];B[ak];W[mj];B[nk];W[mg];B[ni];W[nj];B[lg];W[lh];B[mh]
+;W[ng];B[oi];W[oj];B[pi];W[pj];B[qj];W[ri];B[rj];W[ol];B[nl];W[pl]
+;B[ql];W[dm];B[cm];W[en];B[do];W[dl];B[cl];W[da];B[eb];W[bs];B[ar]
+;W[sb];B[qb];W[rs];B[sr];W[pq];B[rp];W[kp];B[ln];W[dq];B[bp];W[oe]
+;B[od];W[pe];B[ne];W[bj];B[cj];W[eg];B[fg];W[ef];B[ee];W[gk];B[cg]
+;W[bf];B[ce];W[cd];B[dc];W[be];B[de];W[df];B[eh];W[ci];B[di];W[ai]
+;B[hj];W[jf];B[je];W[nf];B[mf];W[ji];B[hk];W[qs];B[ep];W[fp];B[eq]
+;W[er];B[oq];W[or];B[nr];W[op];B[oo];W[oq];B[mr];W[mq];B[hr];W[cs]
+;B[jr];W[iq];B[gr];W[fr];B[ir];W[ea];B[fa];W[ca];B[hq];W[lr];B[kr]
+;W[ms];B[ks];W[gs];B[ls];W[ns];B[of];W[pf];B[qd];W[qe];B[jk];W[si]
+;B[sj];W[hl];B[ij];W[pm];B[qm];W[gf];B[ge];W[li];B[hf];W[nh];B[fe]
+;W[pk];B[ok];W[oh];B[ra];W[sc];B[sa];W[re];B[fi];W[ph];B[om];W[eo]
+;B[cn];W[kl];B[gj];W[ii];B[];W[as];B[];W[ss];B[];W[]TB[ga][ha][ia]
+[ja][ka][la][ma][na][oa][pa][qa][fb][hb][ib][jb][lb][mb][nb][ob][pb]
+[ec][fc][hc][ic][jc][lc][mc][nc][oc][pc][ed][gd][hd][id][kd][ld][md]
+[ie][ke][le][me][ck][rk][sk][al][bl][ml][rl][sl][am][bm][mm][rm][sm]
+[an][bn][nn][qn][rn][sn][ao][bo][co][po][qo][ro][so][ap][cp][qp][sp]
+[aq][bq][rq][sq]TW[aa][ba][ab][ac][ad][sd][ae][se][af][of][rf][sf]
+[og][qg][sg][mh][qh][rh][sh][ki][mi][ni][oi][pi][el][fl][gl][em][gm]
+[im][fn][gn][in][go][gp][hp][ip][gq][hq][kq][lq][gr][hr][ir][jr][kr]
+[mr][nr][ds][es][fs][hs][is][js][ks][ls][os][ps])
diff --git a/regression/games/kgs/GNU-minautore.sgf b/regression/games/kgs/GNU-minautore.sgf
new file mode 100644 (file)
index 0000000..91c54fd
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[GNU]WR[13k]
+PB[minautore]BR[14k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-28]AP[CGoban:2]
+RE[B+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;B[dp];W[dd];B[pp];W[pd];B[nc];W[jd];B[pc];W[qc];B[od];W[pe];B[qb]
+;W[cn];B[qd];W[rc];B[rd];W[rb];B[pb];W[qe];B[re];W[rf];B[qf];W[pf]
+;B[qg];W[rg];B[pg];W[ne];B[rh];W[se];B[pj];W[ck];B[gp];W[iq];B[lq]
+;W[pn];B[qn];W[qm];B[qo];W[io];B[pm];W[pl];B[om];W[ql];B[ok];W[gn]
+;B[en];W[ch];B[el];W[gr];B[hp];W[ip];B[ho];W[hn];B[in];W[lo];B[nq]
+;W[im];B[jn];W[jm];B[kn];W[ko];B[ln];W[ll];B[mn];W[ol];B[nm];W[rj]
+;B[nl];W[ri];B[sg];W[sd];B[qi];W[rn];B[ro];W[rm];B[sk];W[qj];B[pi]
+;W[rk];B[pk];W[gk];B[sl];W[ej];B[cl];W[bl];B[bk];W[dl];B[cm];W[bm]
+;B[dm];W[bj];B[dk];W[cj];B[bp];W[dj];B[fr];W[fc];B[kc];W[jc];B[kd]
+;W[ce];B[ke];W[ig];B[je];W[ie];B[if];W[he];B[hf];W[hg];B[jg];W[gf]
+;B[jf];W[gq];B[fp];W[fq];B[eq];W[kp];B[jr];W[mf];B[er];W[ki];B[jq]
+;W[kb];B[lb];W[jb];B[ge];W[la];B[mb];W[gd];B[fe];W[gg];B[hd];W[id]
+;B[hc];W[gc];B[hb];W[gb];B[ja];W[ka];B[ga];W[fa];B[ia];W[ee];B[ma]
+;W[ff];B[jh];W[ij];B[ih];W[bo];B[co];W[ap];B[aq];W[ao];B[cq];W[hh]
+;B[fk];W[fj];B[gl];W[hl];B[km];W[kl];B[jj];W[ji];B[ii];W[jk];B[hj]
+;W[kj];B[ik];W[jj];B[hk];W[hi];B[gj];W[ni];B[mj];W[gi];B[mi];W[lk]
+;B[il];W[hm];B[gk];W[lg];B[kh];W[lh];B[li];W[nj];B[mk];W[mh];B[nk]
+;W[og];B[oh];W[nh];B[of];W[oe];B[ng])
diff --git a/regression/games/kgs/GNU-namascae.sgf b/regression/games/kgs/GNU-namascae.sgf
new file mode 100644 (file)
index 0000000..9d0bfdb
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[GNU]WR[13k]
+PB[namascae]BR[14k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-10]AP[CGoban:2]
+RE[W+11.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+]
+CA[UTF-8]ST[2]
+;B[dp];W[pd];B[qp];W[de];B[kp];W[cn];B[pi];W[ck];B[fp];W[dc];B[nc]
+;W[jc];B[qf];W[pf];B[qc];W[qe];B[qg];W[pc];B[pb];W[ob];B[rb];W[op]
+;B[pn];W[qq];B[pp];W[pq];B[oo];W[mq];B[np];W[oq];B[nq];W[nr];B[mp]
+;W[lq];B[jq];W[nb];B[rd];W[mc];B[jj];W[lp];B[lo];W[re];B[sc];W[sh]
+;B[ri];W[si];B[rj];W[sj];B[rl];W[fn];B[hp];W[ig];B[gj];W[ei];B[gh]
+;W[gg];B[fh];W[dg];B[jh];W[lf];B[jg];W[jf];B[hn];W[mh];B[mj];W[bp]
+;B[cq];W[no];B[mo];W[bq];B[dn];W[dm];B[en];W[fm];B[em];W[el];B[fl]
+;W[dl];B[fk];W[cr];B[dr];W[rp];B[qo];W[rk];B[qk];W[pg];B[rg];W[br]
+;B[gf];W[fg];B[eh];W[hh];B[eg];W[ff];B[ef];W[ee];B[df];W[dh];B[cf]
+;W[bh];B[bc];W[gc];B[cb];W[be];B[ce];W[bd];B[bg];W[cd];B[ch];W[di]
+;B[ci];W[cj];B[bi];W[bj];B[ah];W[ds];B[er];W[kr];B[jr];W[pa];B[db]
+;W[eb];B[fb];W[ea];B[fc];W[ec];B[fe];W[hg];B[ed];W[dd];B[fd];W[gb]
+;B[bf];W[qb];B[qd];W[se];B[ab];W[ba];B[da];W[ad];B[hi];W[rh];B[qh]
+;W[sg];B[sk];W[sf];B[kf];W[je];B[ke];W[kg];B[kh];W[lg];B[le];W[me]
+;B[he];W[fa];B[if];W[id];B[hd];W[ie];B[hf];W[hc];B[ih];W[ph];B[oi]
+;W[li];B[lj];W[ro];B[rn];W[cp];B[dq];W[ki];B[lh];W[mi];B[ni];W[kj]
+;B[kk];W[ng];B[so];W[rq];B[ek];W[ej];B[dk];W[dj];B[cm];W[cl];B[co]
+;W[bn];B[bo];W[ao];B[do];W[js];B[is];W[ks];B[ir];W[es];B[kq];W[lr]
+;B[fs];W[cs];B[fr];W[ji];B[ij];W[sp];B[aj];W[ak];B[fj];W[ai];B[ms]
+;W[ns];B[aj];W[bm];B[lc];W[ld];B[kd];W[md];B[kc];W[sn];B[sm];W[oh]
+;B[fi];W[nh];B[gd];W[af];B[cg];W[so];B[qa];W[ra];B[sa];W[sd];B[ag]
+;W[ae];B[jd];W[ic];B[jb];W[ga];B[ib];W[bb];B[lb];W[ka];B[oe];W[pe]
+;B[mf];W[mg];B[qi];W[ai];B[ap];W[an];B[aj];W[lk];B[mk];W[ai];B[cc]
+;W[ac];B[aj];W[kl];B[ll];W[ai];B[hb];W[ca];B[aj];W[jk];B[lk];W[ai]
+;B[qa];W[rc];B[aj];W[ii];B[ai];W[rf];B[];W[]TB[ge][ff][fg][gg][hg]
+[ig][bh][hh][gi][hj][nj][oj][pj][qj][gk][hk][ik][jk][nk][ok][pk][rk]
+[gl][hl][il][jl][kl][ml][nl][ol][pl][ql][sl][fm][gm][hm][im][jm][km]
+[lm][mm][nm][om][pm][qm][rm][fn][gn][in][jn][kn][ln][mn][nn][on][qn]
+[eo][fo][go][ho][io][jo][ko][no][po][ep][gp][ip][jp][eq][fq][gq][hq]
+[iq][gr][hr][gs][hs]TW[aa][da][ha][ia][ja][la][ma][na][oa][qa][ra]
+[sa][ab][cb][db][hb][ib][jb][kb][lb][mb][pb][rb][sb][bc][cc][kc][lc]
+[nc][oc][qc][sc][jd][kd][nd][od][qd][rd][ke][le][ne][oe][kf][mf][nf]
+[of][og][bk][al][bl][am][cm][ap][aq][sq][ar][mr][or][pr][qr][rr][sr]
+[as][bs][ls][ms][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/GNU-roidesnems.sgf b/regression/games/kgs/GNU-roidesnems.sgf
new file mode 100644 (file)
index 0000000..e2accf5
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.50]
+PW[GNU]WR[13k]
+PB[roidesnems]BR[18k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-12-20]AP[CGoban:2]
+RE[B+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+]
+CA[UTF-8]ST[2]
+;W[cn];B[fq];W[dj];B[cg];W[nc];B[qf];W[bp];B[cq];W[pb];B[qc];W[kc]
+;B[hc];W[pn];B[nq];W[qp];B[qq];W[qo];B[qk];W[nn];B[kp];W[en];B[oh]
+;W[rq];B[pq];W[ok];B[pj];W[cc];B[dc];W[cd];B[ce];W[be];B[bf];W[de]
+;B[cf];W[db];B[ee];W[hq];B[hp];W[iq];B[ip];W[gq];B[gp];W[fr];B[eq]
+;W[kr];B[lr];W[jq];B[kq];W[jr];B[hs];W[gs];B[hr];W[is];B[ks];W[er]
+;B[dr];W[es];B[bb];W[ec];B[ed];W[cb];B[eb];W[bc];B[fc];W[ad];B[ba]
+;W[jp];B[jo];W[mm];B[qm];W[qb];B[ke];W[ci];B[el];W[dl];B[fm];W[fj]
+;B[fh];W[eh];B[eg];W[fi];B[dh];W[hi];B[md];W[mc];B[ld];W[gh];B[gg]
+;W[hg];B[gf];W[jb];B[lc];W[lb];B[li];W[fg];B[ff];W[qr];B[pr];W[rr]
+;B[jg];W[jh];B[kh];W[ig];B[jf];W[ji];B[il];W[rc];B[rd];W[bq];B[br]
+;W[kl];B[fn];W[rn];B[lo];W[sk];B[ri];W[nd];B[ne];W[rb];B[rm];W[sm]
+;B[qn];W[po];B[ro];W[sn];B[so];W[sl];B[nl];W[ml];B[nk];W[pc];B[om]
+;W[qd];B[qe];W[qc];B[od];W[re];B[rf];W[sd];B[rk];W[sj];B[si];W[on]
+;B[rj];W[mo];B[ln];W[jm];B[jk];W[lm];B[lk];W[op];B[np];W[ek];B[gl]
+;W[em];B[sp];W[jd];B[ie];W[kj];B[kk];W[ga];B[mk];W[fl];B[gk];W[eo]
+;B[fo];W[bh];B[qs];W[fh];B[di])
diff --git a/regression/games/kgs/GNU-tadf.sgf b/regression/games/kgs/GNU-tadf.sgf
new file mode 100644 (file)
index 0000000..9887979
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[13]KM[6.50]
+PW[GNU]WR[13k]
+PB[tadf]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-17]AP[CGoban:2]
+RE[B+72.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.3
+]
+CA[UTF-8]ST[2]
+;B[kc];W[dj];B[jk];W[dk];B[cd];W[ki];B[gk];W[ec];B[cg];W[hc];B[kf]
+;W[lk];B[ji];W[cb];B[kh];W[kj];B[jj];W[lh];B[lg];W[mi];B[kk];W[lj]
+;B[bi];W[bk];B[eg];W[he];B[fe];W[kl];B[fc];W[fb];B[ed];W[dc];B[gd]
+;W[hd];B[gb];W[eb];B[gc];W[fj];B[gj];W[je];B[ke];W[ih];B[jf];W[if]
+;B[jd];W[fi];B[gi];W[hb];B[fa];W[jb];B[kb];W[jc];B[ie];W[da];B[bc]
+;W[ea];B[ga];W[gh];B[ig];W[hf];B[hg];W[bb];B[gg];W[fh];B[jl];W[jh]
+;B[hh];W[kg];B[jg];W[kh];B[el];W[dl];B[ek];W[ci];B[bj];W[cj];B[ch]
+;W[lf];B[le];W[mg];B[ej];W[ei];B[cl];W[bl];B[dm];W[fk];B[fl];W[bm]
+;B[cm];W[em];B[fm];W[ck];B[gl];W[em];B[dm];W[cm];B[ak];W[ll];B[al]
+;W[am];B[ai];W[ab];B[ac];W[me];B[ld];W[ii];B[hi];W[ij];B[ik];W[jm]
+;B[im];W[km];B[hk];W[dd];B[de];W[cc];B[be];W[md];B[mc];W[mf];B[lb]
+;W[hj];B[];W[]TB[ha][ia][ja][ka][la][ma][hb][ib][jb][mb][hc][ic][jc]
+[lc][ad][bd][fd][hd][id][kd][ae][ce][ee][ge][he][je][af][bf][cf][df]
+[ef][ff][gf][hf][if][ag][bg][dg][fg][ah][bh][dh][eh][fh][gh][ci][di]
+[ei][fi][aj][cj][dj][fj][bk][ck][dk][fk][bl][cl][dl][hl][il][am][bm]
+[cm][em][gm][hm]TW[aa][ba][ca][db][lg][mh][li][mj][mk][ml][lm][mm])
diff --git a/regression/games/kgs/GnuGoCVS-john.sgf b/regression/games/kgs/GnuGoCVS-john.sgf
new file mode 100644 (file)
index 0000000..fa749f2
--- /dev/null
@@ -0,0 +1,256 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[7.50]TM[600]OT[25/480 Canadian]
+PW[GnuGoCVS]PB[john]WR[11k]BR[11k]DT[2005-01-15]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[GnuGoCVS [11k\]: GTP Engine for GnuGoCVS (white): GNU Go version 3.7.1 (compiled from CVS sources 2005-01-15 03:00 - please see my user info for details)
+]RE[B+23.50]
+;B[pp]
+;W[dd]
+;B[pc]
+;W[dp]
+;B[qi]
+;W[jd]
+;B[fq]
+;W[np]
+;B[lq]
+;W[mo]
+;B[ip]
+;W[pe]
+;B[qe]
+;W[pd]
+;B[qd]
+;W[oc]
+;B[pm]
+;W[qc]
+;B[pb]
+;W[qb]
+;B[pf]
+;W[ob]
+;B[lm]
+;W[mm]
+;B[mn]
+;W[nn]
+;B[ln]
+;W[ml]
+;B[oo]
+;W[lo]
+;B[no]
+;W[mq]
+;B[ko]
+;W[lr]
+;B[lp]
+;W[nr]
+;B[mp]
+;W[oq]
+;B[pq]
+;W[cn]
+;B[fc]
+;W[ec]
+;B[fd]
+;W[df]
+;B[ib]
+;W[ck]
+;B[ce]
+;W[de]
+;B[cc]
+;W[cd]
+;B[bc]
+;W[bd]
+;B[eb]
+;W[eq]
+;B[kr]
+;W[pr]
+;B[qr]
+;W[fp]
+;B[gq]
+;W[ll]
+;B[kl]
+;W[op]
+;B[ls]
+;W[qs]
+;B[rr]
+;W[mr]
+;B[nf]
+;W[mi]
+;B[ki]
+;W[li]
+;B[lc]
+;W[om]
+;B[ol]
+;W[jb]
+;B[ic]
+;W[jc]
+;B[oe]
+;W[od]
+;B[le]
+;W[id]
+;B[fg]
+;W[dh]
+;B[kh]
+;W[ig]
+;B[ih]
+;W[jg]
+;B[jh]
+;W[la]
+;B[ma]
+;W[mb]
+;B[lb]
+;W[ka]
+;B[mc]
+;W[nb]
+;B[nl]
+;W[lh]
+;B[kg]
+;W[rc]
+;B[rd]
+;W[qf]
+;B[rf]
+;W[qg]
+;B[rg]
+;W[pg]
+;B[of]
+;W[qh]
+;B[rh]
+;W[oh]
+;B[pi]
+;W[og]
+;B[oi]
+;W[nd]
+;B[me]
+;W[fi]
+;B[kk]
+;W[gm]
+;B[cq]
+;W[cp]
+;B[bp]
+;W[bo]
+;B[bq]
+;W[dr]
+;B[cr]
+;W[hk]
+;B[bs]
+;W[ar]
+;B[eo]
+;W[ep]
+;B[gj]
+;W[gi]
+;B[hj]
+;W[ia]
+;B[gb]
+;W[hf]
+;B[gk]
+;W[fr]
+;B[gr]
+;W[gs]
+;B[hs]
+;W[fs]
+;B[em]
+;W[fl]
+;B[ek]
+;W[fk]
+;B[fj]
+;W[el]
+;B[ei]
+;W[fh]
+;B[eh]
+;W[hh]
+;B[hi]
+;W[gh]
+;B[gg]
+;W[hg]
+;B[dk]
+;W[cj]
+;B[dl]
+;W[fn]
+;B[cm]
+;W[gl]
+;B[hl]
+;W[bm]
+;B[en]
+;W[gp]
+;B[hm]
+;W[hq]
+;B[gn]
+;W[go]
+;B[fm]
+;W[eg]
+;B[ef]
+;W[dg]
+;B[fe]
+;W[is]
+;B[jr]
+;W[ac]
+;B[bb]
+;W[sd]
+;B[re]
+;W[di]
+;B[ej]
+;W[hd]
+;B[gc]
+;W[cl]
+;B[ho]
+;W[ha]
+;B[ga]
+;W[ab]
+;B[dc]
+;W[ed]
+;B[rs]
+;W[ca]
+;B[ps]
+;W[db]
+;B[ba]
+;W[ad]
+;B[ge]
+;W[os]
+;B[or]
+;W[md]
+;B[ld]
+;W[pr]
+;B[kb]
+;W[gf]
+;B[ja]
+;W[ka]
+;B[or]
+;W[se]
+;B[nq]
+;W[jf]
+;B[ke]
+;W[na]
+;B[la]
+;W[ja]
+;B[ff]
+;W[ea]
+;B[ie]
+;W[he]
+;B[je]
+;W[fb]
+;B[kf]
+;W[iq]
+;B[jq]
+;W[hp]
+;B[io]
+;W[ir]
+;B[kd]
+;W[fa]
+;B[kc]
+;W[ee]
+;B[if]
+;W[hc]
+;B[sf]
+;W[sc]
+;B[ne]
+;W[fo]
+;B[do]
+;W[dm]
+;B[co]
+;W[dn]
+;B[js]
+;W[pa]
+;B[ds]
+;W[er]
+;B[ao]
+;W[bn]
+;B[]
+;W[dj]
+;B[]
+;W[nc]
+;B[]
+;W[]TW[aa][ba][da][ga][oa][qa][ra][sa][bb][cb][eb][gb][hb][ib][pb][rb][sb][bc][cc][dc][fc][gc][ic][pc][fd][gd][ae][be][ce][fe][ge][af][bf][cf][ef][ff][ag][bg][cg][fg][gg][ah][bh][ch][ai][bi][ci][aj][bj][ak][bk][al][bl][am][cm][an][ao][ap][bp][aq][bq][cq][dq][fq][gq][br][cr][gr][hr][as][bs][cs][ds][es][hs]TB[lf][mf][qf][lg][mg][ng][og][pg][qg][sg][lh][mh][nh][oh][ph][qh][sh][ii][ji][li][mi][ni][ri][si][ij][jj][kj][lj][mj][nj][oj][pj][qj][rj][sj][fk][hk][ik][jk][lk][mk][nk][ok][pk][qk][rk][sk][el][fl][gl][il][jl][ll][ml][pl][ql][rl][sl][gm][im][jm][km][mm][nm][om][qm][rm][sm][hn][in][jn][kn][nn][on][pn][qn][rn][sn][jo][lo][mo][po][qo][ro][so][jp][kp][np][op][qp][rp][sp][kq][mq][oq][qq][rq][sq][lr][mr][nr][pr][sr][ks][ms][ns][os][qs][ss])
diff --git a/regression/games/kgs/Hosbodar-GNU.sgf b/regression/games/kgs/Hosbodar-GNU.sgf
new file mode 100644 (file)
index 0000000..d9685a5
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[19]KM[6.50]
+PW[Hosbodar]WR[6k]
+PB[GNU]BR[6k]
+PC[The KGS Go Server at http://www.gokgs.com/]DT[2007-01-13]
+AP[CGoban:3]
+RE[W+Resign]
+TM[300]OT[25/300 Canadian]
+RU[Japanese]
+C[GNU [6k\]: GTP Engine for GNU (black): GNU Go version 3.7.10
+]
+CA[UTF-8]ST[2]
+;B[pd];W[pp];B[dd];W[dp];B[jd];W[jp];B[pj];W[dj];B[qn];W[jj];B[nq]
+;W[oq];B[or];W[pr];B[op];W[pq];B[oo];W[po];B[nr];W[pn];B[qm];W[pm]
+;B[ql];W[mo];B[nn];W[np];B[lp];W[mp];B[lq];W[mq];B[mr];W[lo];B[jr]
+;W[ml];B[hq];W[fq];B[ho];W[fn];B[ko];W[ln];B[jo];W[cm];B[ch];W[cf]
+;B[df];W[ce];B[de];W[cd];B[dc];W[cc];B[pg];W[nc];B[lc];W[pb];B[qc]
+;W[qb];B[eh];W[gf];B[hg];W[hf];B[ig];W[if];B[dh];W[jf];B[jg];W[kf]
+;B[le];W[lg];B[gc];W[lh];B[gg];W[ff];B[rb];W[pc];B[rc];W[od];B[pe]
+;W[oe];B[mf];W[of];B[ng];W[og];B[oh];W[pf];B[qf];W[qg];B[ph];W[qe]
+;B[rf];W[qd];B[sf];W[rg];B[qh];W[re];B[sg];W[se];B[rh];W[gk];B[mi]
+;W[ki];B[rp];W[rq];B[qp];W[qq];B[bj];W[ck];B[cq];W[cp];B[bk];W[bl]
+;B[gr];W[fr];B[cb];W[bb];B[db];W[ba];B[nl];W[on];B[mm];W[lm];B[no]
+;W[pl];B[ll];W[kl];B[mk];W[jm];B[sr];W[pk];B[sq];W[qk];B[rk];W[rj]
+;B[rl];W[qj];B[rr];W[qr];B[oj];W[rs];B[sp];W[sn];B[qo];W[sm];B[kk]
+;W[jk];B[bg];W[bf];B[fs];W[es];B[gs];W[dr];B[ej];W[ek];B[fj];W[fk]
+;B[hm];W[il];B[ii];W[rn];B[gq];W[gp];B[io];W[go];B[ag];W[af];B[mb]
+;W[nb];B[kn];W[km];B[di];W[cj];B[bi];W[fd];B[gd];W[ge];B[hd];W[mc]
+;B[lb];W[kj];B[lk];W[gj];B[gi];W[ij];B[hi];W[gm];B[im];W[hl];B[fc]
+;W[fg];B[fh];W[eg];B[ed];W[fe];B[mn];W[sk];B[sl];W[sj])
diff --git a/regression/games/kgs/JMBE-GNU.sgf b/regression/games/kgs/JMBE-GNU.sgf
new file mode 100644 (file)
index 0000000..0a4a412
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.50]
+PW[JMBE]WR[11k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-06]AP[CGoban:2]
+RE[W+40.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][jj][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;W[jp];B[lq];W[fq];B[cn];W[cf];B[ch];W[ef];B[fd];W[bd];B[cc];W[ck]
+;B[bc];W[be];B[np];W[jd];B[lc];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc]
+;W[nb];B[ph];W[mb];B[mc];W[rd];B[re];W[rc];B[qf];W[qn];B[eq];W[fr]
+;B[er];W[fk];B[on];W[qk];B[qo];W[rn];B[ro];W[ok];B[hc];W[hf];B[jq]
+;W[iq];B[jr];W[ir];B[ip];W[hp];B[io];W[ho];B[jo];W[kp];B[ko];W[lp]
+;B[lr];W[sp];B[so];W[sn];B[in];W[hn];B[im];W[mo];B[mm];W[pn];B[hm]
+;W[po];B[qq];W[rq];B[qp];W[oo];B[no];W[nn];B[om];W[op];B[nq];W[oq]
+;B[qr];W[nr];B[mq];W[pr];B[qs];W[rr];B[sr];W[nm];B[nl];W[mn];B[ol]
+;W[lm];B[ml];W[ln];B[kq];W[ll];B[mk];W[lk];B[lj];W[jk];B[ik];W[kj]
+;B[mi];W[ki];B[jl];W[kk];B[lf];W[ij];B[fm];W[gm];B[gl];W[gn];B[fp]
+;W[fl];B[hk];W[gk];B[jb];W[hj];B[fs];W[gr];B[eh];W[fg];B[di];W[dk]
+;B[bl];W[bk];B[ak];W[cl];B[bj];W[bm];B[bn];W[al];B[ri];W[rj];B[qi]
+;W[oi];B[oh];W[ni];B[nh];W[pk];B[an];W[li];B[mj];W[mh];B[lh];W[mg]
+;B[lg];W[mf];B[me];W[nf];B[ne];W[of];B[oe];W[pi];B[jg];W[pm];B[pf]
+;W[ji];B[ih];W[pl];B[og];W[nj];B[ng];W[gh];B[ie];W[if];B[je];W[he]
+;B[qj];W[pj];B[rk];W[rl];B[sj];W[hd];B[id];W[ac];B[ab];W[ad];B[lb]
+;W[jf];B[gd];W[en];B[kf];W[eo];B[gs];W[hs];B[ep];W[es];B[ds];W[cr]
+;B[br];W[bq];B[cq];W[ar];B[bs];W[fs];B[dm];W[em];B[bb];W[do];B[cp]
+;W[co];B[bo];W[gp];B[fo];W[fn];B[de];W[df];B[am];W[aj];B[cm];W[dl]
+;B[dr];W[bl];B[ma];W[pa];B[na];W[oa];B[la];W[qb];B[sd];W[sc];B[se]
+;W[sl];B[sk];W[hh];B[ii];W[ig];B[jh];W[kh];B[kg];W[hi];B[ge];W[gf]
+;B[ee];W[ce];B[ps];W[os];B[rp];W[pq];B[sq];W[cd];B[bp];W[ff];B[mh]
+;W[dc];B[ec];W[db];B[eb];W[fe];B[ed];W[gc];B[ic];W[da];B[ea];W[dn]
+;B[ca];W[nk];B[go];W[];B[]TB[aa][ba][da][fa][ga][ha][ia][ja][ka][cb]
+[db][fb][gb][hb][ib][kb][dc][fc][gc][jc][kc][jd][kd][ld][md][nd][od]
+[ke][le][pe][qe][mf][nf][of][rf][sf][mg][pg][qg][rg][sg][qh][rh][sh]
+[si][rj][ao][ap][sp][aq][bq][dq][rq][ar][cr][rr][as][cs][rs][ss]
+TW[qa][ra][sa][pb][rb][sb][ae][af][bf][ag][bg][cg][dg][eg][gg][hg]
+[ah][bh][ch][dh][eh][fh][ai][bi][ci][di][ei][fi][gi][bj][cj][dj][ej]
+[fj][gj][jj][oj][ak][ek][hk][ik][el][gl][hl][il][jl][kl][ql][fm][hm]
+[im][jm][km][qm][rm][sm][in][jn][kn][io][jo][ko][lo][no][ip][mp][np]
+[gq][hq][jq][kq][lq][mq][nq][hr][jr][kr][lr][mr][or][gs][is][js][ks]
+[ls][ms][ns])
diff --git a/regression/games/kgs/Kuksa-GNU.sgf b/regression/games/kgs/Kuksa-GNU.sgf
new file mode 100644 (file)
index 0000000..7d67837
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.50]
+PW[Kuksa]WR[8k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-18]AP[CGoban:2]
+RE[W+1.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][jj][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]
+CA[UTF-8]ST[2]
+;W[nq];B[qn];W[fq];B[no];W[jp];B[cn];W[dr];B[cq];W[pr];B[cr];W[qq]
+;B[qk];W[nc];B[lc];W[qc];B[pc];W[pb];B[ob];W[qb];B[mb];W[qd];B[le]
+;W[pe];B[ck];W[qi];B[ch];W[fc];B[fe];W[dc];B[cc];W[cd];B[de];W[bc]
+;B[cb];W[ce];B[bb];W[df];B[cf];W[cg];B[bf];W[bg];B[dg];W[ef];B[be]
+;W[ee];B[ed];W[fd];B[bd];W[dh];B[eg];W[ff];B[ge];W[gf];B[gd];W[hf]
+;B[ci];W[eh];B[fg];W[gc];B[hd];W[kd];B[hc];W[ld];B[nb];W[hi];B[fh]
+;W[fi];B[ei];W[gh];B[di];W[oj];B[nd];W[om];B[ok];W[nk];B[rp];W[rq]
+;B[on];W[pm];B[qm];W[rl];B[rk];W[pk];B[pj];W[ol];B[ql];W[pn];B[pi]
+;W[qp];B[qh];W[oi];B[jh];W[jf];B[ke];W[je];B[jd];W[id];B[jc];W[ic]
+;B[ib];W[ie];B[hb];W[lg];B[ig];W[gk];B[li];W[mh];B[kl];W[lk];B[il]
+;W[ik];B[lm];W[jk];B[kk];W[lj];B[kj];W[hl];B[jl];W[hn];B[jn];W[lo]
+;B[kn];W[ln];B[oe];W[ph];B[qj];W[qg];B[ri];W[pf];B[rg];W[rf];B[sf]
+;W[re];B[fp];W[gp];B[gq];W[fo];B[ep];W[hq];B[gr];W[hr];B[go];W[hp]
+;B[fr];W[fn];B[fj];W[gi];B[ro];W[qo];B[nf];W[og];B[em];W[fk];B[ek]
+;W[gj];B[ej];W[lf];B[me];W[se];B[sg];W[sp];B[sn];W[gs];B[er];W[fm]
+;B[ng];W[nh];B[pl];W[ok];B[fs];W[hs];B[gg];W[hg];B[kf];W[kg];B[he]
+;W[jg];B[pa];W[qa];B[oa];W[el];B[dl];W[en];B[fl];W[dm];B[el];W[dn]
+;B[cm];W[gl];B[do];W[sq];B[so];W[of];B[mf];W[mg];B[kc];W[];B[eo];W[]
+;B[]TB[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ka][la][ma][na][ab]
+[db][eb][fb][gb][jb][kb][lb][ac][bc][dc][ec][fc][gc][mc][nc][oc][ad]
+[cd][fd][kd][ld][md][od][ae][ce][ne][af][ag][bg][cg][ah][bh][dh][eh]
+[rh][sh][ai][bi][qi][si][aj][bj][cj][dj][rj][sj][ak][bk][dk][sk][al]
+[bl][cl][rl][sl][am][bm][rm][sm][an][bn][rn][ao][bo][co][ap][bp][cp]
+[aq][bq][dq][eq][fq][ar][br][dr][as][bs][cs][ds][es]TW[ra][sa][rb]
+[sb][rc][sc][rd][sd][qe][if][qf][ig][pg][hh][ih][jh][kh][lh][oh][ii]
+[ji][ki][li][mi][ni][hj][ij][jj][kj][mj][nj][hk][kk][mk][il][jl][kl]
+[ll][ml][nl][gm][hm][im][jm][km][lm][mm][nm][gn][in][jn][kn][mn][nn]
+[on][go][ho][io][jo][ko][mo][no][oo][po][ip][kp][lp][mp][np][op][pp]
+[iq][jq][kq][lq][mq][oq][pq][ir][jr][kr][lr][mr][nr][or][qr][rr][sr]
+[is][js][ks][ls][ms][ns][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/PsyDuck-GNU.sgf b/regression/games/kgs/PsyDuck-GNU.sgf
new file mode 100644 (file)
index 0000000..d88fb63
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[13]HA[4]KM[6.50]
+PW[PsyDuck]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-26]RE[W+42.50]
+TM[1200]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][jd][dj][jj]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]
+CA[UTF-8]
+;W[cg];B[eg];W[eh];B[dg];W[dh];B[ch];W[fg];B[cf];W[bg];B[ci];W[cd]
+;B[cc];W[de];B[bf];W[ed];B[dc];W[df];B[gj];W[ec];B[bd];W[kd];B[kc]
+;W[lc];B[jc];W[ke];B[gc];W[kk];B[kj];W[jk];B[ik];W[il];B[hk];W[hl]
+;B[lb];W[kg];B[gl];W[fk];B[fj];W[gk];B[fl];W[ek];B[el];W[dk];B[hm]
+;W[jm];B[ck];W[ij];B[hj];W[ii];B[ji];W[ih];B[ld];W[le];B[mc];W[gd]
+;B[jh];W[jg];B[hc];W[ce];B[be];W[db];B[cb];W[fb];B[ab];W[ha];B[da]
+;W[eb];B[bh];W[ag];B[ah];W[ef];B[dg];W[ib];B[hd];W[ka];B[af];W[la]
+;B[kb];W[ja];B[gh];W[hg];B[gm];W[dl];B[cl];W[em];B[ej];W[lj];B[gg]
+;W[gf];B[ea];W[fa];B[ca];W[hh];B[fh];W[if];B[hi];W[fi];B[gi];W[ei]
+;B[dm];W[eg];B[cg];W[jl];B[di];W[im];B[];W[]TB[aa][ba][bb][ac][bc]
+[ad][ae][ag][bg][ai][bi][aj][bj][cj][ak][bk][dk][ek][fk][gk][al][bl]
+[dl][am][bm][cm][em][fm]TW[ga][ia][ma][gb][hb][jb][kb][lb][mb][fc]
+[gc][hc][ic][jc][kc][lc][mc][fd][hd][id][jd][ld][md][ee][fe][ge][he]
+[ie][je][me][ff][hf][jf][kf][lf][mf][ig][lg][mg][jh][kh][lh][mh][ji]
+[ki][li][mi][jj][kj][mj][lk][mk][kl][ll][ml][km][lm][mm]KGSSB[38.00]
+KGSSW[80.50]KGSDE[em])
diff --git a/regression/games/kgs/SURARIN-yagr.sgf b/regression/games/kgs/SURARIN-yagr.sgf
new file mode 100644 (file)
index 0000000..cdd1ed9
--- /dev/null
@@ -0,0 +1,227 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[4]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[SURARIN]PB[yagr]WR[4k]BR[8k]DT[2004-08-24]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dp][pp]C[yagr [8k\]: GTP Engine for yagr (black): GNU Go version 3.5.10
+]RE[W+Resign]
+;W[fq]
+;B[cn]
+;W[cq]
+;B[dq]
+;W[dr]
+;B[er]
+;W[cr]
+;B[eq]
+;W[bo]
+;B[fp]
+;W[ck]
+;B[gq]
+;W[bn]
+;B[pj]
+;W[nq]
+;B[lq]
+;W[pn]
+;B[np]
+;W[qq]
+;B[oq]
+;W[qp]
+;B[jd]
+;W[jp]
+;B[jr]
+;W[kq]
+;B[lr]
+;W[mq]
+;B[mp]
+;W[or]
+;B[jn]
+;W[pq]
+;B[nm]
+;W[op]
+;B[cg]
+;W[ko]
+;B[kn]
+;W[io]
+;B[hm]
+;W[lp]
+;B[dc]
+;W[mo]
+;B[iq]
+;W[kr]
+;B[qf]
+;W[nc]
+;B[ne]
+;W[qc]
+;B[pc]
+;W[pb]
+;B[ob]
+;W[qb]
+;B[oc]
+;W[re]
+;B[nb]
+;W[rf]
+;B[di]
+;W[hd]
+;B[ic]
+;W[je]
+;B[ie]
+;W[id]
+;B[kc]
+;W[hc]
+;B[if]
+;W[ib]
+;B[ke]
+;W[jc]
+;B[jf]
+;W[kb]
+;B[ek]
+;W[lc]
+;B[fe]
+;W[kd]
+;B[mm]
+;W[le]
+;B[lf]
+;W[je]
+;B[me]
+;W[kf]
+;B[kg]
+;W[lg]
+;B[ke]
+;W[eb]
+;B[ld]
+;W[md]
+;B[db]
+;W[le]
+;B[kf]
+;W[oh]
+;B[qh]
+;W[qg]
+;B[pg]
+;W[rg]
+;B[ph]
+;W[oj]
+;B[fb]
+;W[pk]
+;B[rh]
+;W[qj]
+;B[oi]
+;W[pi]
+;B[ni]
+;W[nj]
+;B[lh]
+;W[mi]
+;B[lk]
+;W[li]
+;B[ki]
+;W[kj]
+;B[lj]
+;W[mh]
+;B[mg]
+;W[ji]
+;B[kh]
+;W[og]
+;B[pf]
+;W[el]
+;B[dl]
+;W[dk]
+;B[fl]
+;W[ej]
+;B[em]
+;W[fk]
+;B[el]
+;W[dj]
+;B[fj]
+;W[fi]
+;B[gj]
+;W[ei]
+;B[ih]
+;W[gi]
+;B[ci]
+;W[hj]
+;B[gk]
+;W[gf]
+;B[ii]
+;W[hi]
+;B[sk]
+;W[rl]
+;B[ij]
+;W[hk]
+;B[ks]
+;W[mr]
+;B[ls]
+;W[ms]
+;B[js]
+;W[jq]
+;B[hr]
+;W[gl]
+;B[fk]
+;W[hl]
+;B[gm]
+;W[cl]
+;B[sl]
+;W[sj]
+;B[rj]
+;W[sm]
+;B[rk]
+;W[qk]
+;B[ri]
+;W[qm]
+;B[mj]
+;W[nh]
+;B[bj]
+;W[cm]
+;B[nd]
+;W[mc]
+;B[jo]
+;W[ip]
+;B[eg]
+;W[dn]
+;B[co]
+;W[cp]
+;B[do]
+;W[en]
+;B[fn]
+;W[dm]
+;B[fm]
+;W[go]
+;B[im]
+;W[fo]
+;B[eo]
+;W[gp]
+;B[fr]
+;W[fc]
+;B[gb]
+;W[ec]
+;B[gc]
+;W[gd]
+;B[fd]
+;W[hb]
+;B[ed]
+;W[of]
+;B[oe]
+;W[qe]
+;B[qd]
+;W[pe]
+;B[rd]
+;W[qi]
+;B[si]
+;W[sf]
+;B[se]
+;W[sd]
+;B[rc]
+;W[sh]
+;B[sg]
+;W[jk]
+;B[kk]
+;W[sh]
+;B[ga]
+;W[sj]
+;B[sc]
+;W[ik]
+;B[jj]
+;W[ln]
+;B[lm]
+;W[jl]
+;B[kl]
+;W[jm]
+;B[km]
+;W[in]
+;B[ge]
+;W[mb])
diff --git a/regression/games/kgs/TheGNUGo-Botkiller3.sgf b/regression/games/kgs/TheGNUGo-Botkiller3.sgf
new file mode 100644 (file)
index 0000000..47c8de5
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[3]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[TheGNUGo]PB[Botkiller3]WR[13k]BR[16k]DT[2005-10-07]PC[The Kiseido
+Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp][pp]C[TheGNUGo
+[13k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.7.6
+]RE[B+0.50] ;W[ec] ;B[cd] ;W[df] ;B[cf] ;W[cg] ;B[de] ;W[ef] ;B[ee]
+;W[qf] ;B[qe] ;W[pf] ;B[md] ;W[fp] ;B[fq] ;W[gq] ;B[eq] ;W[gp] ;B[dm]
+;W[kq] ;B[mq] ;W[qj] ;B[qm] ;W[hc] ;B[jd] ;W[jb] ;B[kc] ;W[ff] ;B[fe]
+;W[gf] ;B[ge] ;W[hf] ;B[he] ;W[cb] ;B[dj] ;W[if] ;B[ie] ;W[jf] ;B[cc]
+;W[eb] ;B[bf] ;W[eh] ;B[ci] ;W[bg] ;B[gj] ;W[qq] ;B[rr] ;W[qp] ;B[qr]
+;W[rq] ;B[pq] ;W[hi] ;B[qo] ;W[aj] ;B[bk] ;W[kb] ;B[ak] ;W[lb] ;B[ld]
+;W[nc] ;B[nd] ;W[ke] ;B[kd] ;W[gm] ;B[oc] ;W[fl] ;B[ek] ;W[lo] ;B[nn]
+;W[nb] ;B[ob] ;W[gr] ;B[fr] ;W[rf] ;B[re] ;W[rl] ;B[rm] ;W[bb] ;B[bc]
+;W[se] ;B[sd] ;W[sf] ;B[rc] ;W[no] ;B[oo] ;W[mn] ;B[nm] ;W[jl] ;B[mf]
+;W[lg] ;B[mg] ;W[qk] ;B[fj] ;W[np] ;B[nq] ;W[oi] ;B[nk] ;W[lh] ;B[mh]
+;W[lk] ;B[ij] ;W[hj] ;B[hk] ;W[gk] ;B[fk] ;W[gl] ;B[el] ;W[oa] ;B[pa]
+;W[na] ;B[pb] ;W[lr] ;B[mr] ;W[mi] ;B[ni] ;W[nj] ;B[nh] ;W[oj] ;B[mj]
+;W[mk] ;B[li] ;W[ii] ;B[jj] ;W[ki] ;B[ml] ;W[ll] ;B[mm] ;W[lm] ;B[ok]
+;W[pk] ;B[ol] ;W[lj] ;B[mi] ;W[fs] ;B[es] ;W[gs] ;B[ji] ;W[jh] ;B[lf]
+;W[kf] ;B[kg] ;W[kh] ;B[gi] ;W[hh] ;B[gh] ;W[sm] ;B[sn] ;W[sl] ;B[rn]
+;W[op] ;B[po] ;W[gg] ;B[oq] ;W[ql] ;B[pm] ;W[af] ;B[ae] ;W[ag] ;B[be]
+;W[ac] ;B[ad] ;W[ab] ;B[le] ;W[ai] ;B[bj] ;W[ah] ;B[bi] ;W[en] ;B[dn]
+;W[eo] ;B[do] ;W[ls] ;B[ms] ;W[ep] ;B[dq] ;W[dc] ;B[lp] ;W[kp] ;B[mo]
+;W[ln] ;B[lq] ;W[kr] ;B[em] ;W[fh] ;B[oh] ;W[ph] ;B[pg] ;W[qh] ;B[og]
+;W[oe] ;B[od] ;W[ne] ;B[qg] ;W[rg] ;B[rh] ;W[qi] ;B[of] ;W[pe] ;B[nf]
+;W[qd] ;B[rd] ;W[ri] ;B[ic] ;W[hb] ;B[ib] ;W[ia] ;B[fc] ;W[fb] ;B[gc]
+;W[hd] ;B[gb] ;W[ga] ;B[id] ;W[gd] ;B[fd] ;W[ha] ;B[mb] ;W[mc] ;B[lc]
+;W[ma] ;B[dh] ;W[dg] ;B[ei] ;W[ch] ;B[di] ;W[fm] ;B[dd] ;W[sh] ;B[pl]
+;W[fi] ;B[] ;W[me] ;B[] ;W[jc] ;B[] ;W[ed] ;B[] ;W[je] ;B[] ;W[bh] ;B[]
+;W[]TW[aa][ba][ca][da][ea][fa][ja][ka][la][db][mb][eg][fg][hg][ig][jg][kg][sg][ih][rh][ji][pi][si][ij][jj][kj][pj][rj][sj][hk][ik][jk][kk][rk][sk][hl][il][kl][hm][im][jm][km][fn][gn][hn][in][jn][kn][fo][go][ho][io][jo][ko][hp][ip][jp][hq][iq][jq][hr][ir][jr][hs][is][js][ks]TB[qa][ra][sa][qb][rb][sb][pc][qc][sc][bd][qd][ce][ng][cj][ej][ck][dk][al][bl][cl][dl][nl][am][bm][cm][om][an][bn][cn][on][pn][qn][ao][bo][co][no][ro][so][ap][bp][cp][mp][np][op][qp][rp][sp][aq][bq][cq][qq][rq][sq][ar][br][cr][dr][er][nr][or][pr][sr][as][bs][cs][ds][ns][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/TheGNUGo-JVD.sgf b/regression/games/kgs/TheGNUGo-JVD.sgf
new file mode 100644 (file)
index 0000000..8e12159
--- /dev/null
@@ -0,0 +1,236 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[AGA]SZ[19]KM[5.50]TM[60]OT[25/300 Canadian]
+PW[TheGNUGo]PB[JVD]WR[9k]BR[9k]DT[2004-09-02]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[TheGNUGo [9k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.5.10
+]RE[B+5.50]
+;B[pp]
+;W[dp]
+;B[pd]
+;W[dd]
+;B[fc]
+;W[hc]
+;B[cc]
+;W[dc]
+;B[cd]
+;W[de]
+;B[db]
+;W[eb]
+;B[cb]
+;W[ec]
+;B[cf]
+;W[fd]
+;B[pj]
+;W[nd]
+;B[nc]
+;W[mc]
+;B[nb]
+;W[nq]
+;B[mb]
+;W[qf]
+;B[qe]
+;W[pm]
+;B[oq]
+;W[np]
+;B[nr]
+;W[mr]
+;B[or]
+;W[lq]
+;B[qn]
+;W[ce]
+;B[be]
+;W[pf]
+;B[md]
+;W[cl]
+;B[ne]
+;W[fq]
+;B[pn]
+;W[om]
+;B[on]
+;W[nn]
+;B[no]
+;W[mo]
+;B[nm]
+;W[mn]
+;B[nl]
+;W[pk]
+;B[ok]
+;W[ph]
+;B[qj]
+;W[co]
+;B[iq]
+;W[nh]
+;B[kc]
+;W[oo]
+;B[po]
+;W[io]
+;B[hp]
+;W[jp]
+;B[go]
+;W[jq]
+;B[gm]
+;W[pe]
+;B[qd]
+;W[ci]
+;B[en]
+;W[ri]
+;B[rj]
+;W[qi]
+;B[oi]
+;W[oh]
+;B[mj]
+;W[rf]
+;B[re]
+;W[cg]
+;B[bg]
+;W[df]
+;B[bf]
+;W[bh]
+;B[dg]
+;W[ch]
+;B[eg]
+;W[gg]
+;B[ei]
+;W[ff]
+;B[ek]
+;W[ie]
+;B[ck]
+;W[bk]
+;B[cj]
+;W[bj]
+;B[dl]
+;W[cm]
+;B[di]
+;W[jb]
+;B[kb]
+;W[jc]
+;B[kd]
+;W[im]
+;B[ll]
+;W[km]
+;B[hk]
+;W[sj]
+;B[sk]
+;W[si]
+;B[rk]
+;W[jh]
+;B[lh]
+;W[ir]
+;B[hr]
+;W[jr]
+;B[gr]
+;W[fr]
+;B[fp]
+;W[gq]
+;B[hq]
+;W[ep]
+;B[gp]
+;W[fs]
+;B[eo]
+;W[dh]
+;B[eh]
+;W[ah]
+;B[ea]
+;W[fa]
+;B[da]
+;W[ka]
+;B[la]
+;W[ja]
+;B[jd]
+;W[id]
+;B[kf]
+;W[fb]
+;B[hi]
+;W[hh]
+;B[ii]
+;W[gi]
+;B[gj]
+;W[ih]
+;B[fi]
+;W[ji]
+;B[gh]
+;W[mf]
+;B[nf]
+;W[mg]
+;B[lg]
+;W[me]
+;B[od]
+;W[ag]
+;B[ad]
+;W[hl]
+;B[gl]
+;W[ik]
+;B[ij]
+;W[jk]
+;B[hm]
+;W[hn]
+;B[jj]
+;W[kj]
+;B[kk]
+;W[kl]
+;B[lk]
+;W[il]
+;B[ki]
+;W[kh]
+;B[lj]
+;W[op]
+;B[ms]
+;W[ls]
+;B[ns]
+;W[dm]
+;B[em]
+;W[gn]
+;B[ng]
+;W[qg]
+;B[fn]
+;W[mh]
+;B[mi]
+;W[ho]
+;B[is]
+;W[js]
+;B[hs]
+;W[ef]
+;B[fg]
+;W[hg]
+;B[af]
+;W[lm]
+;B[mm]
+;W[jf]
+;B[kg]
+;W[jg]
+;B[le]
+;W[se]
+;B[sd]
+;W[sf]
+;B[rd]
+;W[ni]
+;B[nj]
+;W[pi]
+;B[oj]
+;W[og]
+;B[oe]
+;W[dn]
+;B[je]
+;W[pq]
+;B[pr]
+;W[do]
+;B[lf]
+;W[ip]
+;B[cq]
+;W[gs]
+;B[fo]
+;W[dr]
+;B[cr]
+;W[of]
+;B[bp]
+;W[bo]
+;B[dq]
+;W[eq]
+;B[ds]
+;W[er]
+;B[br]
+;W[aq]
+;B[ap]
+;W[ar]
+;B[as]
+;W[cs]
+;B[]
+;W[]TW[ga][ha][ia][gb][hb][ib][fc][gc][ic][ed][gd][hd][ee][fe][ge][he][gf][hf][if][ig][pg][rg][sg][qh][rh][sh][ai][bi][aj][ak][al][bl][jl][am][bm][jm][an][bn][cn][in][jn][kn][ln][ao][jo][ko][lo][no][ap][bp][cp][kp][lp][mp][bq][cq][dq][kq][mq][br][cr][kr][lr][as][bs][ds][es][ks]TB[aa][ba][ca][ma][na][oa][pa][qa][ra][sa][ab][bb][lb][ob][pb][qb][rb][sb][ac][bc][lc][mc][oc][pc][qc][rc][sc][bd][ld][nd][ae][ke][fh][gi][li][dj][ej][fj][hj][kj][dk][fk][gk][mk][nk][pk][qk][el][fl][ml][ol][pl][ql][rl][sl][fm][om][pm][qm][rm][sm][rn][sn][qo][ro][so][qp][rp][sp][pq][qq][rq][sq][qr][rr][sr][os][ps][qs][rs][ss]KGSDE[fc][mc][pk][om][pm][ap][bp][cq][dq][pq][br][cr][as][ds]KGSSW[180.50]KGSSB[186.00])
diff --git a/regression/games/kgs/TheGNUGo-grasshoper.sgf b/regression/games/kgs/TheGNUGo-grasshoper.sgf
new file mode 100644 (file)
index 0000000..bf6706c
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[7.50]TM[60]OT[25/300 Canadian]
+PW[TheGNUGo]PB[grasshoper]WR[13k]BR[13k]DT[2005-10-11]PC[The Kiseido Go
+Server (KGS) at http://kgs.kiseido.com/]C[TheGNUGo [13k\]: GTP Engine
+for TheGNUGo (white): GNU Go version 3.7.7 ] ;B[pd] ;W[dd] ;B[pq] ;W[eq]
+;B[qo] ;W[cp] ;B[pj] ;W[nd] ;B[lc] ;W[me] ;B[nc] ;W[oc] ;B[od] ;W[mc]
+;B[nb] ;W[mb] ;B[ob] ;W[jc] ;B[fc] ;W[ld] ;B[cf] ;W[df] ;B[cc] ;W[oe]
+;B[pe] ;W[jp] ;B[cd] ;W[cj] ;B[dc] ;W[lp] ;B[gp] ;W[of] ;B[pf] ;W[nq]
+;B[og] ;W[cg] ;B[de] ;W[bf] ;B[ce] ;W[ef] ;B[ee] ;W[qm] ;B[pm] ;W[ql]
+;B[qn] ;W[pl] ;B[om] ;W[rj] ;B[rk] ;W[qj] ;B[qi] ;W[ri] ;B[qh] ;W[eo]
+;B[rh] ;W[rl] ;B[sk] ;W[qk] ;B[ok] ;W[rn] ;B[ro] ;W[sm] ;B[so] ;W[sn]
+;B[pk] ;W[gn] ;B[ol] ;W[ff] ;B[iq] ;W[jq] ;B[hn] ;W[ho] ;B[go] ;W[hm]
+;B[in] ;W[io] ;B[fn] ;W[gm] ;B[fo] ;W[im] ;B[dp] ;W[ep] ;B[do] ;W[dn]
+;B[co] ;W[bp] ;B[dq] ;W[en] ;B[bo] ;W[fm] ;B[er] ;W[fr] ;B[cr] ;W[bm]
+;B[cn] ;W[cm] ;B[ap] ;W[es] ;B[dr] ;W[ie] ;B[kk] ;W[ji] ;B[ik] ;W[hj]
+;B[hk] ;W[gj] ;B[jn] ;W[ln] ;B[jo] ;W[jm] ;B[ip] ;W[ko] ;B[hp] ;W[gq]
+;B[kq] ;W[kp] ;B[jr] ;W[kr] ;B[ir] ;W[km] ;B[gr] ;W[hr] ;B[ds] ;W[lh]
+;B[fs] ;W[gs] ;B[gk] ;W[mk] ;B[ml] ;W[ll] ;B[lk] ;W[mj] ;B[nf] ;W[ne]
+;B[mf] ;W[lf] ;B[ng] ;W[mh] ;B[ke] ;W[kf] ;B[le] ;W[md] ;B[kd] ;W[lb]
+;B[kc] ;W[kb] ;B[ic] ;W[id] ;B[hc] ;W[ib] ;B[hb] ;W[ha] ;B[ga] ;W[ia]
+;B[gc] ;W[or] ;B[fj] ;W[gi] ;B[fi] ;W[qr] ;B[gh] ;W[ij] ;B[gf] ;W[ge]
+;B[fe] ;W[gg] ;B[hf] ;W[gd] ;B[fg] ;W[dh] ;B[hh] ;W[fk] ;B[jf] ;W[je]
+;B[kg] ;W[lg] ;B[jj] ;W[kj] ;B[jk] ;W[ii] ;B[ki] ;W[kh] ;B[jh] ;W[lj]
+;B[ih] ;W[li] ;B[eg] ;W[dg] ;B[ek] ;W[dl] ;B[fl] ;W[jg] ;B[eh] ;W[ei]
+;B[hg] ;W[di] ;B[el] ;W[em] ;B[dk] ;W[ck] ;B[ej] ;W[gl] ;B[be] ;W[bg]
+;B[mp] ;W[mq] ;B[pr] ;W[ps] ;B[oq] ;W[no] ;B[nr] ;W[os] ;B[qq] ;W[rr]
+;B[rq] ;W[qs] ;B[sr] ;W[mr] ;B[op] ;W[sh] ;B[sg] ;W[si] ;B[rg] ;W[mm]
+;B[nl] ;W[np] ;B[nh] ;W[ni] ;B[nj] ;W[oi] ;B[pi] ;W[oh] ;B[ph] ;W[oo]
+;B[oj] ;W[pn] ;B[po] ;W[on] ;B[qp] ;W[mi] ;B[nk] ;W[fd] ;B[if] ;W[ed]
+;B[hi] ;W[ki] ;B[ig] ;W[ec] ;B[hd] ;W[he] ;B[kg] ;W[jd] ;B[eb] ;W[fb]
+;B[db] ;W[fa] ;B[ea] ;W[gb] ;B[bl] ;W[af] ;B[am] ;W[an] ;B[al] ;W[bn]
+;B[cl] ;W[dm] ;B[ci] ;W[ao] ;B[dj] ;W[bi] ;B[bj] ;W[ch] ;B[bq] ;W[aq]
+;B[ar] ;W[bs] ;B[ap] ;W[ae] ;B[cq] ;W[ac] ;B[ad] ;W[bd] ;B[bc] ;W[ad]
+;B[ab] ;W[ba] ;B[bk] ;W[bb] ;B[ci] ;W[cj] ;B[aj] ;W[nm])
diff --git a/regression/games/kgs/TheGNUGo-qsdf.sgf b/regression/games/kgs/TheGNUGo-qsdf.sgf
new file mode 100644 (file)
index 0000000..44a4adf
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[TheGNUGo]PB[qsdf]WR[13k]BR[15k]DT[2005-10-07]PC[The Kiseido Go
+Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[TheGNUGo [13k\]:
+GTP Engine for TheGNUGo (white): GNU Go version 3.7.6 ] ;W[ed] ;B[qq]
+;W[qf] ;B[qh] ;W[nc] ;B[pf] ;W[qc] ;B[pc] ;W[qd] ;B[qe] ;W[re] ;B[pe]
+;W[kc] ;B[rf] ;W[cd] ;B[cj] ;W[fp] ;B[fq] ;W[gq] ;B[eq] ;W[gp] ;B[dn]
+;W[kq] ;B[nq] ;W[se] ;B[qb] ;W[rc] ;B[rb] ;W[lo] ;B[cg] ;W[no] ;B[qn]
+;W[gm] ;B[gc] ;W[fb] ;B[gb] ;W[fc] ;B[gd] ;W[nl] ;B[fd] ;W[dc] ;B[ke]
+;W[dl] ;B[el] ;W[nj] ;B[jk] ;W[gk] ;B[dk] ;W[kj] ;B[ij] ;W[gi] ;B[ih]
+;W[gr] ;B[fr] ;W[qk] ;B[op] ;W[hh] ;B[hi] ;W[hg] ;B[gj] ;W[fi] ;B[fj]
+;W[ei] ;B[dh] ;W[jm] ;B[jc] ;W[jb] ;B[ic] ;W[bf] ;B[lc] ;W[lb] ;B[kd]
+;W[kb] ;B[mc] ;W[nh] ;B[ef] ;W[bg] ;B[ig] ;W[aj] ;B[bk] ;W[ak] ;B[al]
+;W[bl] ;B[ai] ;W[mr])
diff --git a/regression/games/kgs/TheGNUGo-rcsteppat.sgf b/regression/games/kgs/TheGNUGo-rcsteppat.sgf
new file mode 100644 (file)
index 0000000..3e41902
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[3]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[TheGNUGo]PB[rcsteppat]WR[13k]BR[16k]DT[2005-10-31]PC[The Kiseido Go
+Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp][pp]C[TheGNUGo [13k\]:
+GTP Engine for TheGNUGo (white): GNU Go version 3.7.7 ] ;W[dd] ;B[jq]
+;W[pf] ;B[nd] ;W[qd] ;B[qc] ;W[qe] ;B[rc] ;W[qj] ;B[ql] ;W[cn] ;B[co]
+;W[dn] ;B[bn] ;W[bm] ;B[bo] ;W[cl] ;B[fp] ;W[nq] ;B[oq] ;W[np] ;B[nr]
+;W[mr] ;B[or] ;W[lc] ;B[hd] ;W[nb] ;B[pb] ;W[ef] ;B[jc] ;W[le] ;B[fc]
+;W[ec] ;B[fd] ;W[de] ;B[ff] ;W[fg] ;B[gf] ;W[lq] ;B[pn] ;W[lo] ;B[jo]
+;W[lm] ;B[jm] ;W[fj] ;B[fm] ;W[rd] ;B[nf] ;W[lg] ;B[nh] ;W[ph] ;B[nj]
+;W[if] ;B[hg] ;W[lk] ;B[ek] ;W[cj] ;B[ej] ;W[fi] ;B[ei] ;W[dh] ;B[eh]
+;W[fh] ;B[eg] ;W[dg] ;B[eo] ;W[li] ;B[jj] ;W[mj] ;B[nk] ;W[mm] ;B[oi]
+;W[hh] ;B[ig] ;W[kh] ;B[jh] ;W[jg] ;B[ih] ;W[hj] ;B[ij] ;W[fl] ;B[fk]
+;W[el] ;B[gk] ;W[gl] ;B[hk] ;W[gm] ;B[fn] ;W[oe] ;B[ne] ;W[pk] ;B[od]
+;W[pl] ;B[qm] ;W[og] ;B[ng] ;W[ob] ;B[oc] ;W[nl] ;B[nn] ;W[ol] ;B[gn]
+;W[rk] ;B[rl] ;W[kb] ;B[jb] ;W[eb] ;B[fb] ;W[kr] ;B[jr] ;W[no] ;B[oo]
+;W[fa] ;B[ga] ;W[ea] ;B[gb] ;W[je] ;B[jd] ;W[hm] ;B[hn] ;W[fe] ;B[ge]
+;W[ee] ;B[il] ;W[pe] ;B[ra] ;W[sb] ;B[sc] ;W[pa] ;B[rb] ;W[qa] ;B[mb]
+;W[mc] ;B[nc] ;W[lb] ;B[qb] ;W[mk] ;B[oa] ;W[ma] ;B[pa] ;W[kp] ;B[jp]
+;W[js] ;B[is] ;W[ks] ;B[ir] ;W[id] ;B[ic] ;W[ie] ;B[he] ;W[om] ;B[on]
+;W[kn] ;B[mn] ;W[sk] ;B[sl] ;W[qk])
diff --git a/regression/games/kgs/TheGNUGo-up.sgf b/regression/games/kgs/TheGNUGo-up.sgf
new file mode 100644 (file)
index 0000000..e4ec3d8
--- /dev/null
@@ -0,0 +1,141 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[TheGNUGo]PB[up]WR[9k]BR[11k]DT[2004-08-05]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[TheGNUGo [9k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.5.9
+]RE[B+Time]
+;B[pd]
+;W[dd]
+;B[pq]
+;W[dp]
+;B[qk]
+;W[nc]
+;B[pf]
+;W[pb]
+;B[qc]
+;W[kc]
+;B[jp]
+;W[qo]
+;B[po]
+;W[pn]
+;B[oo]
+;W[qp]
+;B[qq]
+;W[hq]
+;B[jq]
+;W[gn]
+;B[in]
+;W[hl]
+;B[df]
+;W[fd]
+;B[cd]
+;W[cc]
+;B[ce]
+;W[bc]
+;B[cj]
+;W[cm]
+;B[dl]
+;W[dq]
+;B[rm]
+;W[qm]
+;B[ql]
+;W[pl]
+;B[pk]
+;W[ol]
+;B[on]
+;W[ml]
+;B[om]
+;W[pm]
+;B[jl]
+;W[nm]
+;B[me]
+;W[mo]
+;B[np]
+;W[ok]
+;B[oj]
+;W[rn]
+;B[rl]
+;W[nj]
+;B[oi]
+;W[af]
+;B[ae]
+;W[be]
+;B[bf]
+;W[ad]
+;B[ag]
+;W[bg]
+;B[ae]
+;W[cg]
+;B[bd]
+;W[bh]
+;B[bj]
+;W[dg]
+;B[eg]
+;W[eh]
+;B[ff]
+;W[ah]
+;B[fh]
+;W[hc]
+;B[ei]
+;W[qb]
+;B[rc]
+;W[ac]
+;B[mk]
+;W[mj]
+;B[lk]
+;W[nk]
+;B[ke]
+;W[mh]
+;B[ng]
+;W[kh]
+;B[ik]
+;W[fl]
+;B[lj]
+;W[nh]
+;B[oh]
+;W[li]
+;B[ni]
+;W[mi]
+;B[jd]
+;W[kj]
+;B[kk]
+;W[jc]
+;B[he]
+;W[rq]
+;B[rr]
+;W[sp]
+;B[mp]
+;W[ln]
+;B[nn]
+;W[mn]
+;B[jn]
+;W[ir]
+;B[jr]
+;W[dm]
+;B[el]
+;W[em]
+;B[fk]
+;W[gk]
+;B[hj]
+;W[fj]
+;B[gi]
+;W[ek]
+;B[dh]
+;W[sr]
+;B[qr]
+;W[lg]
+;B[jj]
+;W[mg]
+;B[ki]
+;W[nf]
+;B[kg]
+;W[og]
+;B[mf]
+;W[pg]
+;B[ne]
+;W[qi]
+;B[pj]
+;W[qg]
+;B[rj]
+;W[sk]
+;B[ri]
+;W[rh]
+;B[of])
diff --git a/regression/games/kgs/ben9992000-GNU.sgf b/regression/games/kgs/ben9992000-GNU.sgf
new file mode 100644 (file)
index 0000000..421af10
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[ben9992000]WR[12k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-09]AP[CGoban:2]
+RE[W+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]
+CA[UTF-8]ST[2]
+;B[pd];W[dp];B[pp];W[dd];B[fc];W[df];B[id];W[nq];B[dn];W[fp];B[cp]
+;W[cq];B[co];W[bq];B[cj];W[qn];B[oo];W[qq];B[qp];W[pq];B[mo];W[lp]
+;B[lc];W[ch];B[pj];W[pl];B[qk];W[nl];B[pg];W[nn];B[mp];W[mq];B[lo]
+;W[op];B[np];W[oq];B[jo];W[no];B[kp];W[lq];B[jr];W[hq];B[oe];W[qc]
+;B[pb];W[pc];B[oc];W[qb];B[ob];W[re];B[rf];W[qd];B[qa];W[ra];B[qe]
+;W[rd];B[sf];W[se];B[db];W[cc];B[dl];W[qf];B[cb];W[bb];B[qg];W[pe]
+;B[pf];W[od];B[nd];W[pd];B[nf];W[rg];B[qe];W[pa];B[qf];W[oa];B[nb]
+;W[na];B[ma];W[qa];B[mc];W[kn];B[ln];W[lm];B[jn];W[km];B[ko];W[mm]
+;B[go];W[fo];B[il];W[ho];B[gn];W[ip];B[jq];W[hn];B[jm];W[em];B[en]
+;W[fn];B[gs];W[gm];B[kl];W[jk];B[jl];W[dm];B[cm];W[gk];B[ik];W[ge]
+;B[jj];W[gc];B[dc];W[cd];B[ba];W[ab];B[gb];W[hc];B[hb];W[ic];B[ib]
+;W[jd];B[ej];W[fd];B[gj];W[jb];B[ec];W[ia];B[ca];W[ea];B[fa];W[el]
+;B[dk];W[bi];B[fk];W[fl];B[rm];W[rn];B[qm];W[pm];B[sn];W[so];B[mk]
+;W[sm];B[rl];W[nk];B[ie];W[je];B[if];W[jf];B[ig];W[bk];B[jg];W[bm]
+;B[bl];W[al];B[cl];W[bn];B[cn];W[oj];B[gg];W[fg];B[bo];W[ak];B[fh]
+;W[eg];B[ms];W[ns];B[mi];W[pi];B[qi];W[pk];B[qj];W[ql];B[sk];W[ni]
+;B[es];W[dr];B[hk];W[gl];B[ll];W[eh];B[fi];W[ek];B[bj];W[aj];B[ph]
+;W[fj];B[gf];W[ei];B[fk];W[ha];B[fj];W[eb];B[ls];W[mr];B[ks];W[fr]
+;B[fs];W[mh];B[li];W[nh])
diff --git a/regression/games/kgs/dogo-TheGNUGo.sgf b/regression/games/kgs/dogo-TheGNUGo.sgf
new file mode 100644 (file)
index 0000000..041f852
--- /dev/null
@@ -0,0 +1,268 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[dogo]PB[TheGNUGo]WR[9k]BR[11k]DT[2005-01-16]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[TheGNUGo [11k\]: GTP Engine for TheGNUGo (black): GNU Go version 3.7.1
+]RE[W+16.50]
+;W[dd]
+;B[pp]
+;W[nc]
+;B[qf]
+;W[pb]
+;B[qc]
+;W[kc]
+;B[cf]
+;W[ch]
+;B[ef]
+;W[fd]
+;B[gf]
+;W[hd]
+;B[cj]
+;W[eh]
+;B[cm]
+;W[gh]
+;B[bd]
+;W[cc]
+;B[bc]
+;W[bb]
+;B[qi]
+;W[bg]
+;B[jp]
+;W[qn]
+;B[ql]
+;W[nq]
+;B[np]
+;W[op]
+;B[oo]
+;W[oq]
+;B[ro]
+;W[po]
+;B[pq]
+;W[on]
+;B[no]
+;W[mq]
+;B[nn]
+;W[om]
+;B[or]
+;W[ns]
+;B[os]
+;W[nr]
+;B[ls]
+;W[pr]
+;B[qr]
+;W[ps]
+;B[ks]
+;W[jr]
+;B[lq]
+;W[lp]
+;B[rn]
+;W[qp]
+;B[qq]
+;W[qo]
+;B[rp]
+;W[qm]
+;B[kq]
+;W[rm]
+;B[mp]
+;W[rr]
+;B[rq]
+;W[qs]
+;B[lo]
+;W[sn]
+;B[dq]
+;W[ig]
+;B[gl]
+;W[gq]
+;B[qb]
+;W[pc]
+;B[ne]
+;W[md]
+;B[lf]
+;W[jf]
+;B[il]
+;W[fr]
+;B[hr]
+;W[hq]
+;B[ir]
+;W[iq]
+;B[jq]
+;W[hm]
+;B[ho]
+;W[go]
+;B[hn]
+;W[hl]
+;B[fp]
+;W[gn]
+;B[gm]
+;W[gk]
+;B[fk]
+;W[fj]
+;B[hk]
+;W[gj]
+;B[ek]
+;W[ko]
+;B[kn]
+;W[ln]
+;B[lm]
+;W[mo]
+;B[mn]
+;W[jn]
+;B[lo]
+;W[km]
+;B[kl]
+;W[ln]
+;B[kp]
+;W[im]
+;B[ik]
+;W[io]
+;B[hp]
+;W[gp]
+;B[ip]
+;W[jl]
+;B[jk]
+;W[kk]
+;B[ll]
+;W[jj]
+;B[kj]
+;W[lk]
+;B[ij]
+;W[ji]
+;B[in]
+;W[ii]
+;B[jm]
+;W[mk]
+;B[lj]
+;W[mj]
+;B[li]
+;W[mi]
+;B[lh]
+;W[mh]
+;B[mg]
+;W[od]
+;B[pe]
+;W[oe]
+;B[of]
+;W[pj]
+;B[qj]
+;W[pi]
+;B[pl]
+;W[ol]
+;B[pa]
+;W[ob]
+;B[oa]
+;W[na]
+;B[ph]
+;W[oh]
+;B[og]
+;W[nh]
+;B[pm]
+;W[pn]
+;B[pk]
+;W[ok]
+;B[rl]
+;W[sl]
+;B[rk]
+;W[ng]
+;B[nf]
+;W[aj]
+;B[bk]
+;W[dj]
+;B[nd]
+;W[me]
+;B[mf]
+;W[kd]
+;B[qa]
+;W[dk]
+;B[fn]
+;W[dl]
+;B[mb]
+;W[mc]
+;B[nb]
+;W[oc]
+;B[lb]
+;W[kb]
+;B[ak]
+;W[dm]
+;B[cn]
+;W[bj]
+;B[bi]
+;W[ck]
+;B[ai]
+;W[ci]
+;B[cd]
+;W[dc]
+;B[bf]
+;W[de]
+;B[df]
+;W[ag]
+;B[bj]
+;W[ej]
+;B[em]
+;W[dn]
+;B[sk]
+;W[sm]
+;B[cl]
+;W[do]
+;B[fo]
+;W[co]
+;B[bo]
+;W[cp]
+;B[bp]
+;W[cq]
+;B[cr]
+;W[bq]
+;B[ap]
+;W[aq]
+;B[bn]
+;W[ep]
+;B[eq]
+;W[eo]
+;B[br]
+;W[fq]
+;B[ds]
+;W[es]
+;B[dr]
+;W[ar]
+;B[er]
+;W[bs]
+;B[fs]
+;W[kg]
+;B[lg]
+;W[la]
+;B[ma]
+;W[ka]
+;B[el]
+;W[nm]
+;B[lc]
+;W[ld]
+;B[na]
+;W[kf]
+;B[en]
+;W[ml]
+;B[mm]
+;W[so]
+;B[bh]
+;W[cg]
+;B[lr]
+;W[hj]
+;B[kh]
+;W[jh]
+;B[le]
+;W[ke]
+;B[ah]
+;W[qh]
+;B[pg]
+;W[rh]
+;B[oj]
+;W[oi]
+;B[ri]
+;W[as]
+;B[gr]
+;W[ki]
+;B[qg]
+;W[]
+;B[ms]
+;W[]
+;B[cs]
+;W[]
+;B[mr]
+;W[]
+;B[]TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ab][cb][db][eb][fb][gb][hb][ib][jb][ac][bc][ec][fc][gc][hc][ic][jc][ad][bd][cd][ed][gd][id][jd][ae][be][ce][ee][fe][ge][he][ie][je][af][bf][cf][df][ef][ff][gf][hf][if][dg][eg][fg][gg][hg][jg][dh][fh][hh][ih][di][ei][fi][gi][hi][ni][nj][oj][nk][nl][rn][ro][pp][rp][sp][pq][qq][rq][sq][or][qr][sr][os][rs][ss]TB[ra][sa][rb][sb][rc][sc][qd][rd][sd][qe][re][se][pf][rf][sf][rg][sg][qh][rh][sh][si][aj][rj][sj][qk][al][bl][fl][hl][jl][am][bm][fm][hm][im][km][an][gn][jn][kn][ln][ao][go][io][jo][ko][mo][gp][lp][fq][gq][hq][iq][fr][jr][kr][es][gs][hs][is][js])
diff --git a/regression/games/kgs/evand-TheGNUGo.sgf b/regression/games/kgs/evand-TheGNUGo.sgf
new file mode 100644 (file)
index 0000000..697c09d
--- /dev/null
@@ -0,0 +1,306 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[AGA]SZ[19]HA[9]KM[0.50]TM[60]OT[25/480 Canadian]
+PW[evand]PB[TheGNUGo]WR[1d]BR[9k]DT[2004-09-07]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]C[TheGNUGo [9k\]: GTP Engine for TheGNUGo (black): GNU Go version 3.5.10
+]RE[W+Resign]
+;W[qf]
+;B[nc]
+;W[qn]
+;B[qo]
+;W[pn]
+;B[np]
+;W[nj]
+;B[ok]
+;W[nk]
+;B[of]
+;W[oh]
+;B[mh]
+;W[pg]
+;B[ol]
+;W[nm]
+;B[om]
+;W[on]
+;B[qh]
+;W[qg]
+;B[kn]
+;W[nl]
+;B[rg]
+;W[rf]
+;B[rh]
+;W[rk]
+;B[ni]
+;W[oi]
+;B[oj]
+;W[mo]
+;B[qj]
+;W[ql]
+;B[rj]
+;W[rm]
+;B[pi]
+;W[qc]
+;B[qd]
+;W[rd]
+;B[gp]
+;W[cf]
+;B[df]
+;W[dg]
+;B[ef]
+;W[cd]
+;B[cc]
+;W[ce]
+;B[dc]
+;W[cn]
+;B[cl]
+;W[cq]
+;B[dq]
+;W[cp]
+;B[do]
+;W[bn]
+;B[em]
+;W[mp]
+;B[eg]
+;W[dh]
+;B[bd]
+;W[be]
+;B[bc]
+;W[lq]
+;B[eh]
+;W[ci]
+;B[qr]
+;W[hd]
+;B[ic]
+;W[hc]
+;B[hf]
+;W[ib]
+;B[lk]
+;W[no]
+;B[jb]
+;W[id]
+;B[jc]
+;W[ie]
+;B[pc]
+;W[rb]
+;B[nq]
+;W[hb]
+;B[kf]
+;W[pb]
+;B[if]
+;W[je]
+;B[kg]
+;W[ke]
+;B[ld]
+;W[le]
+;B[ng]
+;W[md]
+;B[lc]
+;W[mc]
+;B[mb]
+;W[nb]
+;B[nd]
+;W[me]
+;B[kb]
+;W[ma]
+;B[jr]
+;W[kr]
+;B[kq]
+;W[kp]
+;B[jq]
+;W[mr]
+;B[cr]
+;W[br]
+;B[dr]
+;W[or]
+;B[oq]
+;W[ro]
+;B[pr]
+;W[nr]
+;B[rp]
+;W[po]
+;B[qp]
+;W[js]
+;B[is]
+;W[ks]
+;B[hr]
+;W[di]
+;B[ei]
+;W[cj]
+;B[ck]
+;W[eb]
+;B[bs]
+;W[ar]
+;B[co]
+;W[bo]
+;B[bl]
+;W[bm]
+;B[ae]
+;W[bg]
+;B[am]
+;W[an]
+;B[ap]
+;W[bp]
+;B[aq]
+;W[al]
+;B[ak]
+;W[bj]
+;B[ek]
+;W[bk]
+;B[am]
+;W[de]
+;B[al]
+;W[ee]
+;B[db]
+;W[ad]
+;B[ba]
+;W[ab]
+;B[bb]
+;W[af]
+;B[ac]
+;W[sp]
+;B[sq]
+;W[so]C[karasu [2k?\]: black doing well
+]
+;B[rr]
+;W[mi]C[fosil [-\]: :)
+]
+;B[li]
+;W[nh]C[karasu [2k?\]: are the programmers watching?
+]
+;B[mg]
+;W[ll]
+;B[kl]C[fosil [-\]: hard to give a computer handi i guess
+]
+;W[kk]
+;B[jk]
+;W[km]
+;B[jm]
+;W[jl]
+;B[il]
+;W[kl]
+;B[ko]
+;W[kj]
+;B[ki]
+;W[lp]
+;B[fe]
+;W[ge]
+;B[fd]
+;W[gf]
+;B[fb]
+;W[gg]C[karasu [2k?\]: w will win unless makes big error
+]
+;B[hh]
+;W[gh]
+;B[gi]
+;W[fi]C[fosil [-\]: w?
+]
+;B[hj]
+;W[gj]
+;B[hi]
+;W[fj]
+;B[ej]
+;W[fh]
+;B[lj]
+;W[gl]
+;B[gm]C[fosil [-\]: well, allowed w to ruin moyo
+fosil [-\]: kinda stupidly
+]
+;W[im]
+;B[jn]
+;W[hl]C[karasu [2k?\]: kill LL corner is however very impressive
+]
+;B[ik]
+;W[hm]
+;B[ob]
+;W[lb]
+;B[ln]
+;W[ml]
+;B[pa]
+;W[qb]
+;B[oa]
+;W[ho]
+;B[fn]
+;W[io]
+;B[in]
+;W[hn]
+;B[jo]
+;W[fl]
+;B[gb]
+;W[el]
+;B[dm]
+;W[dl]
+;B[cm]
+;W[hp]
+;B[dk]
+;W[gn]
+;B[fm]
+;W[gq]
+;B[gr]
+;W[fq]
+;B[fp]
+;W[hq]
+;B[fr]
+;W[fo]
+;B[eo]
+;W[go]
+;B[ep]
+;W[eq]
+;B[na]
+;W[mb]
+;B[qa]
+;W[oc]
+;B[od]
+;W[ra]
+;B[oc]
+;W[jf]
+;B[jg]
+;W[hk]
+;B[fk]
+;W[ji]
+;B[ij]
+;W[hg]
+;B[ih]
+;W[ig]
+;B[jh]
+;W[gk]
+;B[ed]
+;W[gc]
+;B[er]
+;W[fc]
+;B[ec]
+;W[iq]
+;B[ir]
+;W[lf]
+;B[aj]
+;W[ai]
+;B[ga]
+;W[ha]
+;B[ea]
+;W[lg]
+;B[lh]
+;W[qe]
+;B[os]
+;W[ns]
+;B[ps]
+;W[nf]
+;B[mf]
+;W[ne]
+;B[og]
+;W[oe]C[karasu [2k?\]: well done
+evand [1d\]: one of the programmers was playing, karasu :)
+evand [1d\]: thanks
+karasu [2k?\]: ah then you cheated  :-)
+evand [1d\]: hardly :)
+evand [1d\]: I haven't played it in months
+evand [1d\]: besides, it was an unrated game
+karasu [2k?\]: it did quite well 
+evand [1d\]: a few stupid mistakes
+evand [1d\]: and lettting me in the center was bad
+evand [1d\]: but in general, it played ok
+karasu [2k?\]: losing right side group was sad
+evand [1d\]: and the UR was really bad
+evand [1d\]: yeah
+evand [1d\]: I might make some testcases from the game
+evand [1d\]: depends how energetic I'm feeling
+karasu [2k?\]: make it tougher?
+evand [1d\]: or at least document the weaknesses :)
+karasu [2k?\]: well good luck.
+karasu [2k?\]: c u
+])
diff --git a/regression/games/kgs/geluba-yagr.sgf b/regression/games/kgs/geluba-yagr.sgf
new file mode 100644 (file)
index 0000000..9cb851a
--- /dev/null
@@ -0,0 +1,188 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[0]OT[20/300 Canadian]
+PW[geluba]PB[yagr]WR[5k]BR[8k]DT[2004-04-21]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[yagr [8k\]: GTP Engine for yagr (black): GNU Go version 3.5.4
+]
+;W[pp]
+;B[dd]
+;W[fq]
+;B[cn]
+;W[jp]
+;B[qn]
+;W[np]
+;B[qk]
+;W[qo]
+;B[pn]
+;W[nc]
+;B[pf]
+;W[pb]
+;B[lc]
+;W[qc]
+;B[oc]
+;W[ob]
+;B[nd]
+;W[nb]
+;B[md]
+;W[fc]
+;B[hc]
+;W[cc]
+;B[cd]
+;W[dc]
+;B[ed]
+;W[fb]
+;B[ge]
+;W[ck]
+;B[dh]
+;W[ek]
+;B[eq]
+;W[fo]
+;B[mm]
+;W[dn]
+;B[cm]
+;W[dm]
+;B[lp]
+;W[lq]
+;B[qd]
+;W[rc]
+;B[rd]
+;W[sd]
+;B[se]
+;W[sc]
+;B[rf]
+;W[mi]
+;B[oi]
+;W[ml]
+;B[ln]
+;W[oj]
+;B[nj]
+;W[ni]
+;B[pj]
+;W[ok]
+;B[nk]
+;W[ol]
+;B[nl]
+;W[om]
+;B[lk]
+;W[on]
+;B[oh]
+;W[ki]
+;B[kq]
+;W[mq]
+;B[kp]
+;W[jm]
+;B[jq]
+;W[nm]
+;B[ll]
+;W[mn]
+;B[mo]
+;W[lm]
+;B[lj]
+;W[li]
+;B[km]
+;W[mm]
+;B[kn]
+;W[kl]
+;B[jl]
+;W[kk]
+;B[im]
+;W[jk]
+;B[jn]
+;W[rn]
+;B[ik]
+;W[ji]
+;B[rm]
+;W[ro]
+;B[sm]
+;W[je]
+;B[ip]
+;W[jc]
+;B[jb]
+;W[kb]
+;B[kc]
+;W[ib]
+;B[jd]
+;W[ic]
+;B[id]
+;W[hb]
+;B[lb]
+;W[hd]
+;B[he]
+;W[gd]
+;B[ke]
+;W[ie]
+;B[kd]
+;W[jg]
+;B[gh]
+;W[bc]
+;B[fr]
+;W[bh]
+;B[hq]
+;W[hl]
+;B[ih]
+;W[jh]
+;B[il]
+;W[hi]
+;B[hh]
+;W[hj]
+;B[bd]
+;W[ad]
+;B[dg]
+;W[bf]
+;B[ig]
+;W[jf]
+;B[ce]
+;W[cf]
+;B[df]
+;W[ff]
+;B[ae]
+;W[ac]
+;B[be]
+;W[fe]
+;B[fd]
+;W[gc]
+;B[hf]
+;W[fh]
+;B[fg]
+;W[eg]
+;B[gg]
+;W[eh]
+;B[ef]
+;W[gq]
+;B[gi]
+;W[fj]
+;B[gj]
+;W[gk]
+;B[hk]
+;W[ii]
+;B[fl]
+;W[el]
+;B[fk]
+;W[fm]
+;B[gl]
+;W[gm]
+;B[hm]
+;W[gr]
+;B[er]
+;W[do]
+;B[co]
+;W[ep]
+;B[bg]
+;W[dq]
+;B[dr]
+;W[cp]
+;B[bi]
+;W[cr]
+;B[bk]
+;W[bl]
+;B[bj]
+;W[cl]
+;B[ej]
+;W[dj]
+;B[ei]
+;W[di]
+;B[fi]
+;W[ch]
+;B[ci]
+;W[ql]
+;B[rl]
+;W[qm]
+;B[ka])
diff --git a/regression/games/kgs/haiku-GNU.sgf b/regression/games/kgs/haiku-GNU.sgf
new file mode 100644 (file)
index 0000000..b054775
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[haiku]WR[12k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-19]AP[CGoban:2]
+RE[B+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]
+CA[UTF-8]ST[2]
+;B[pd];W[dp];B[pp];W[dc];B[pj];W[nc];B[nd];W[md];B[ne];W[oc];B[pc]
+;W[lc];B[pf];W[np];B[pn];W[kq];B[ce];W[dg];B[ee];W[fd];B[fg];W[dj]
+;B[fq];W[dn];B[dr];W[cq];B[iq];W[pq];B[qq];W[oq];B[qr];W[op];B[oo]
+;W[pr];B[bg];W[qj];B[qi];W[pi];B[qh];W[oi];B[qk];W[rj];B[pk];W[rl]
+;B[qo];W[pl];B[rk];W[ql];B[ol];W[om];B[ok];W[pm];B[nm];W[on];B[nn]
+;W[no];B[po];W[nl];B[lm];W[nk];B[ri];W[ln];B[ml];W[oj];B[sj];W[mk]
+;B[lk];W[mi];B[fe];W[gd];B[if];W[me];B[cr];W[qs];B[id];W[rp];B[ro]
+;W[rr];B[bi];W[rq];B[so];W[rn];B[sn];W[sm];B[qn];W[rm];B[qm];W[qp]
+;B[sl];W[lj];B[ck];W[dk];B[bn];W[cl];B[bl];W[bk];B[bm];W[cj];B[bc]
+;W[bq];B[ge];W[cf];B[be];W[bf];B[af];W[de];B[dd];W[df];B[ed];W[ib]
+;B[ec];W[gb];B[ob];W[nb];B[pb];W[jc];B[kk];W[nf];B[kn];W[lo];B[jr]
+;W[kr];B[of];W[ng];B[fo];W[ko];B[jn];W[jo];B[io];W[jq];B[ir];W[fn]
+;B[gn];W[in];B[hn];W[im];B[jl];W[ip];B[ho];W[hp];B[hl];W[fm];B[il]
+;W[eo];B[br];W[gm];B[hm];W[fp];B[gq];W[gp];B[ii];W[kh];B[eh];W[dh]
+;B[ar];W[aq];B[fk];W[fj];B[gj];W[fi];B[ei];W[gi];B[di];W[hj];B[ej]
+;W[gk];B[gl];W[ij];B[jj];W[ih];B[hh];W[ek];B[fl];W[hi];B[ji];W[gh]
+;B[jh];W[hg];B[jg];W[gg];B[ci];W[hf];B[ig];W[he];B[hd];W[ie];B[je]
+;W[hc];B[jd];W[ff];B[gf];W[bh];B[al];W[cg];B[ak];W[ag];B[ae];W[ai]
+;B[bj];W[ef];B[eg])
diff --git a/regression/games/kgs/koketto-GNU.sgf b/regression/games/kgs/koketto-GNU.sgf
new file mode 100644 (file)
index 0000000..f46cf2d
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[koketto]WR[13k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-09]AP[CGoban:2]
+RE[W+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.8
+]
+CA[UTF-8]ST[2]
+;B[pd];W[pp];B[dd];W[dq];B[cn];W[gp];B[iq];W[cf];B[bq];W[fc];B[fd]
+;W[gc];B[lq];W[cc];B[qn];W[oo];B[qk];W[qo];B[rn];W[ro];B[ck];W[nq]
+;B[ec];W[cd];B[qh];W[nc];B[ne];W[ld];B[ob];W[qc];B[qd];W[oc];B[pc]
+;W[pb];B[qb];W[nb];B[eb];W[oa];B[ch];W[ef];B[gd];W[hc];B[gf];W[dh]
+;B[di];W[eh];B[gr];W[do];B[cp];W[co];B[bo];W[dp];B[je];W[jd];B[ie]
+;W[ke];B[ih];W[mr];B[kr];W[og];B[nh];W[nf];B[me];W[oe];B[od];W[mf]
+;B[nd];W[oh];B[qf];W[oj];B[lh];W[pn];B[ha];W[ib];B[qa];W[md];B[le]
+;W[kf];B[pf];W[ni];B[mi];W[mj];B[lj];W[qm];B[pl];W[rl];B[pi];W[oi]
+;B[nl];W[si];B[lf];W[mk];B[mg];W[ll];B[of];W[ng];B[mh];W[ok];B[ol]
+;W[nk];B[qj];W[ln];B[io];W[gn];B[jg];W[cq];B[bp];W[id];B[kg];W[kd]
+;B[ba];W[bb];B[ca];W[cg];B[bh];W[bg];B[cr];W[dr];B[br];W[sg];B[re]
+;W[ci];B[bi];W[ei];B[dj];W[dn];B[cm];W[dm];B[ri];W[sj];B[rk];W[sk]
+;B[rh];W[sh];B[cb];W[ac];B[gh];W[dl];B[ej];W[cl];B[bl];W[gl];B[hk]
+;W[kk];B[mp];W[kj];B[ko];W[ij];B[mn];W[kn];B[im];W[jm];B[jn];W[jl]
+;B[lo];W[fq];B[hj];W[ki];B[fr];W[li];B[gq];W[fp];B[hp];W[fk];B[lr]
+;W[ii];B[hl];W[hi];B[gj];W[hh];B[hg];W[fj];B[gi];W[fi];B[kh];W[hn]
+;B[mq];W[nr];B[in];W[dk];B[bk];W[ek];B[cj];W[jf];B[if];W[ia];B[ga]
+;W[fb];B[fa];W[hd];B[de];W[ce];B[ql];W[rm];B[df];W[dg];B[mm];W[lm]
+;B[np];W[op];B[ms];W[ns];B[ls];W[pr];B[ag];W[af];B[ah];W[dc];B[db]
+;W[fe];B[ge];W[ed])
diff --git a/regression/games/kgs/llk-GNU.sgf b/regression/games/kgs/llk-GNU.sgf
new file mode 100644 (file)
index 0000000..581294b
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[6.50]
+PW[llk]WR[13k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-26]RE[B+36.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[pd][dp]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]
+CA[UTF-8]
+;W[dd];B[pp];W[cn];B[fp];W[bp];B[cl];W[cq];B[co];W[bo];B[dn];W[bm]
+;B[fc];W[cg];B[ic];W[nq];B[pn];W[kq];B[qk];W[qf];B[nc];W[qi];B[qe]
+;W[pf];B[oq];W[ec];B[fd];W[np];B[ci];W[gq];B[ho];W[er];B[ei];W[ip]
+;B[oe];W[of];B[ne];W[pk];B[pl];W[ok];B[mg];W[qj];B[rk];W[ol];B[qm]
+;W[rj];B[im];W[dm];B[cm];W[bn];B[em];W[fo];B[gp];W[en];B[dl];W[fm]
+;B[eo];W[fn];B[fl];W[eq];B[mi];W[ep];B[do];W[hn];B[in];W[hp];B[gn]
+;W[gm];B[go];W[gl];B[gk];W[hl];B[jk];W[hk];B[gj];W[hj];B[ij];W[gi]
+;B[hi];W[fj];B[fk];W[ek];B[el];W[fi];B[eh];W[gg];B[hh];W[fg];B[eg]
+;W[hg];B[ih];W[ig];B[ef];W[jh];B[jg];W[kh];B[cc];W[cd];B[bh];W[jj]
+;B[hm];W[lg];B[jf];W[ki];B[ii];W[mf];B[db];W[eb];B[bb];W[bd];B[ca]
+;W[bc];B[dc];W[ea];B[mh];W[nf];B[mk];W[le];B[da];W[ab];B[ed];W[ba]
+;B[aa];W[jl];B[ik];W[il];B[kl];W[jm];B[kn];W[ba];B[kk];W[io];B[km]
+;W[cb];B[ge];W[lc];B[or];W[nr];B[je];W[aj];B[oh];W[ph];B[bf];W[cf]
+;B[nm];W[om];B[on];W[ml];B[nl];W[nk];B[mn];W[mj];B[lk];W[lj];B[kj]
+;W[kg];B[re];W[rf];B[bg];W[be];B[bk];W[ak];B[ns];W[ms];B[os];W[mr]
+;B[bl];W[al];B[sf];W[sg];B[se];W[sk];B[sl];W[sj];B[ql];W[no];B[jo]
+;W[nn];B[jp];W[jq];B[hq];W[iq];B[mm];W[fq];B[jn];W[lo];B[mo];W[mp]
+;B[ln];W[lp];B[gb];W[jb];B[mb];W[ha];B[kb];W[kc];B[lb];W[jc];B[hb]
+;W[ga];B[jd];W[fa];B[kf];W[lf];B[ji];W[dh];B[de];W[df];B[ch];W[dg]
+;B[di];W[ce];B[dq];W[dr];B[ee];W[oo];B[po];W[mc];B[md];W[ld];B[me]
+;W[ka];B[bj];W[ai];B[ae];W[af];B[ag];W[ad];B[oi];W[oj];B[ib];W[ia]
+;B[nb];W[la];B[ma];W[ja];B[af];W[am];B[li];W[nj];B[pe];W[cp];B[fb]
+;W[kp];B[pm];W[ko];B[op];W[bi];B[ah];W[ke];B[kd];W[];B[]TB[na][oa]
+[pa][qa][ra][sa][ob][pb][qb][rb][sb][gc][hc][oc][pc][qc][rc][sc][gd]
+[hd][id][nd][od][qd][rd][sd][fe][he][ie][ff][gf][hf][if][fg][gg][hg]
+[ig][fh][gh][fi][gi][cj][dj][ej][fj][hj][jj][ck][dk][ek][hk][gl][hl]
+[il][jl][ll][ml][rl][dm][fm][gm][jm][lm][rm][sm][en][fn][hn][qn][rn]
+[sn][fo][qo][ro][so][qp][rp][sp][pq][qq][rq][sq][pr][qr][rr][sr][ps]
+[qs][rs][ss]TW[aa][ca][da][bb][db][ac][cc][dc][mg][ng][og][pg][qg]
+[rg][lh][mh][nh][oh][qh][rh][sh][li][mi][ni][oi][pi][ri][si][pj][an]
+[ao][ap][aq][bq][hq][lq][mq][ar][br][cr][fr][gr][hr][ir][jr][kr][lr]
+[as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls]KGSSB[116.00]
+KGSSW[79.50]KGSDE[hq])
diff --git a/regression/games/kgs/malitourne-yagr.sgf b/regression/games/kgs/malitourne-yagr.sgf
new file mode 100644 (file)
index 0000000..9f01fb4
--- /dev/null
@@ -0,0 +1,314 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[malitourne]PB[yagr]WR[6k]BR[8k]DT[2004-06-21]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[yagr [8k\]: GTP Engine for yagr (black): GNU Go version 3.5.4
+]RE[W+Resign]
+;W[dd]
+;B[pp]
+;W[nc]
+;B[cf]
+;W[ce]
+;B[df]
+;W[fd]
+;B[dj]
+;W[dn]
+;B[fp]
+;W[hq]
+;B[nd]
+;W[md]
+;B[ne]
+;W[jc]
+;B[oc]
+;W[mc]
+;B[jq]
+;W[ho]
+;B[mq]
+;W[qn]
+;B[fq]
+;W[lq]
+;B[lr]
+;W[nq]
+;B[mp]
+;W[np]
+;B[mo]
+;W[no]
+;B[mn]
+;W[qq]
+;B[pn]
+;W[qp]
+;B[pq]
+;W[po]
+;B[oo]
+;W[qo]
+;B[nn]
+;W[op]
+;B[nr]
+;W[on]
+;B[pm]
+;W[pr]
+;B[om]
+;W[oo]
+;B[qk]
+;W[qf]
+;B[me]
+;W[qc]
+;B[qd]
+;W[ob]
+;B[rc]
+;W[pc]
+;B[qh]
+;W[og]
+;B[pg]
+;W[od]
+;B[nh]
+;W[pe]
+;B[oe]
+;W[oc]
+;B[rd]
+;W[rb]
+;B[sb]
+;W[sc]
+;B[rf]
+;W[re]
+;B[sd]
+;W[rg]
+;B[qb]
+;W[rh]
+;B[oh]
+;W[qi]
+;B[sf]
+;W[sg]
+;B[se]
+;W[qe]
+;B[ra]
+;W[qg]
+;B[ph]
+;W[pj]
+;B[rj]
+;W[ri]
+;B[qm]
+;W[rn]
+;B[cc]
+;W[dc]
+;B[be]
+;W[bd]
+;B[cd]
+;W[bc]
+;B[de]
+;W[cb]
+;B[ff]
+;W[mk]
+;B[ok]
+;W[qj]
+;B[kk]
+;W[pk]
+;B[rl]
+;W[oj]
+;B[nj]
+;W[nk]
+;B[nm]
+;W[ol]
+;B[mi]
+;W[lj]
+;B[kj]
+;W[li]
+;B[si]
+;W[lg]
+;B[mf]
+;W[kf]
+;B[co]
+;W[cn]
+;B[cl]
+;W[bm]
+;B[em]
+;W[en]
+;B[fm]
+;W[fo]
+;B[gp]
+;W[hp]
+;B[go]
+;W[bo]
+;B[bp]
+;W[do]
+;B[cp]
+;W[ap]
+;B[mg]
+;W[lh]
+;B[hn]
+;W[lm]
+;B[cm]
+;W[bl]
+;B[bk]
+;W[bq]
+;B[cr]
+;W[cq]
+;B[dq]
+;W[br]
+;B[dr]
+;W[bs]
+;B[in]
+;W[kl]
+;B[ml]
+;W[ll]
+;B[lk]
+;W[jl]
+;B[ij]
+;W[hk]
+;B[mj]
+;W[nl]
+;B[mm]
+;W[pl]
+;B[ql]
+;W[gj]
+;B[pf]
+;W[le]
+;B[mh]
+;W[oi]
+;B[hi]
+(;W[dm]
+;B[dl]
+;W[el]
+;B[fk]
+;W[fn]
+;B[gn]
+;W[gm]
+;B[fl]
+;W[hl]
+;B[ck]
+;W[ko]
+;B[kp]
+;W[jo]
+;B[io]
+;W[jp]
+;B[ip]
+;W[kq]
+;B[kr]
+;W[iq]
+;B[lp]
+;W[jr]
+;B[kq]
+;W[hr]
+;B[gr]
+;W[fi]
+;B[jn]
+;W[ln]
+;B[im]
+;W[il]
+;B[gg]
+;W[ej]
+;B[ek]
+;W[di]
+;B[ig]
+;W[lf]
+;B[hd]
+;W[hc]
+;B[id]
+;W[ic]
+;B[gd]
+;W[gc]
+;B[fe]
+;W[cj]
+;B[ci]
+;W[bj]
+;B[bi]
+;W[dk]
+;B[aj]
+;W[dj]
+;B[eh]
+;W[dh]
+;B[ch]
+;W[al]
+;B[ak]
+;W[ao]
+;B[ce]
+;W[or]
+;B[bb]
+;W[ab]
+;B[db]
+;W[ba]
+;B[ec]
+;W[eb]
+;B[ed]
+;W[da]
+;B[fb]
+;W[dc]
+;B[fc]
+;W[gb]
+;B[os]
+;W[gh]
+;B[fj]
+;W[gi]
+;B[ei]
+;W[ji]
+;B[jj]
+;W[hh]
+;B[fh]
+;W[ih]
+;B[jg]
+;W[jh]
+;B[je]
+;W[kd]
+;B[pb]
+;W[pa]
+;B[kn]
+;W[lo]
+;B[rm]
+;W[sn]
+;B[ps]
+;W[qs]
+;B[ns]
+;W[fa]
+;B[jf]
+;W[of]
+(;B[ni]
+;W[nf]
+;B[ng]
+;W[of]
+;B[hg]
+;W[cs]
+;B[ad]
+;W[ac]
+;B[ae]
+;W[ds]
+;B[es]
+;W[fs]
+;B[er]
+;W[gs]
+;B[kg]
+;W[kh]
+;B[ep]
+;W[hm]
+;B[eo]
+;W[bn]
+;B[sm]
+;W[km]
+;B[js]
+;W[is]
+;B[fr]
+;W[ks]
+;B[ls]
+;W[jm]
+;B[js]
+;W[sj]
+;B[sk]
+;W[ks]
+;B[aq]
+;W[ar]
+;B[hs]
+;W[gs]
+;B[js]
+;W[ai]
+;B[dg]
+;W[ks])
+(;B[sj]
+;W[nf]
+;B[sh]
+;W[ni]
+;B[ng]
+;W[of]
+;B[pi])
+(;B[qa]
+;W[nf]
+;B[sj]
+;W[pi]
+;B[sh]))
+(;W[lf]))
diff --git a/regression/games/kgs/maproom-gnugo3pt6.sgf b/regression/games/kgs/maproom-gnugo3pt6.sgf
new file mode 100644 (file)
index 0000000..f76444c
--- /dev/null
@@ -0,0 +1,65 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Chinese]SZ[9]KM[0.50]TM[600]
+PW[maproom]PB[gnugo3pt6]WR[7k]DT[2005-03-06]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[gnugo3pt6 [?\]: GTP Engine for gnugo3pt6 (black): GNU Go version 3.6
+]RE[W+5.50]
+;B[gc]
+;W[gg]
+;B[cg]
+;W[dd]
+;B[db]
+;W[cb]
+;B[cc]
+;W[dc]
+;B[bb]
+;W[cd]
+;B[bc]
+;W[eb]
+;B[ca]
+;W[bd]
+;B[ec]
+;W[fc]
+;B[ed]
+;W[ee]
+;B[fd]
+;W[fe]
+;B[gd]
+;W[dh]
+;B[ad]
+;W[ae]
+;B[de]
+;W[bf]
+;B[cf]
+;W[bg]
+;B[ch]
+;W[bh]
+;B[bi]
+;W[ah]
+;B[ef]
+;W[ff]
+;B[eh]
+;W[eg]
+;B[dg]
+;W[df]
+;B[ce]
+;W[be]
+;B[di]
+;W[fh]
+;B[fi]
+;W[gi]
+;B[ac]
+;W[ef]
+;B[ci]
+;W[ei]
+;B[hf]
+;W[fi]C[gunnar [?\]: Interesting game.
+]
+;B[hg]
+;W[hh]
+;B[ge]
+;W[gf]
+;B[he]
+;W[ig]
+;B[if]
+;W[ih]
+;B[]
+;W[]TW[ce][de][af][cf][ag][cg][dg][fg][ch][dh][eh][gh][ai][bi][ci][di][hi][ii]TB[aa][ba][da][ea][fa][ga][ha][ia][ab][cb][eb][fb][gb][hb][ib][fc][hc][ic][hd][id][ie])
diff --git a/regression/games/kgs/melonhead1-GNU.sgf b/regression/games/kgs/melonhead1-GNU.sgf
new file mode 100644 (file)
index 0000000..74bc7ff
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[melonhead1]WR[12k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-16]AP[CGoban:2]
+RE[W+3.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]
+CA[UTF-8]ST[2]
+;B[pd];W[pp];B[cd];W[dp];B[cn];W[dn];B[dm];W[co];B[en];W[do]
+;B[cm];W[em];B[el];W[fm];B[fo];W[gp];B[go];W[ho];B[fp];W[fn]
+;B[gn];W[eo];B[hp];W[gq];B[io];W[oe];B[hn];W[ed];B[fq];W[df]
+;B[ec];W[dd];B[dc];W[ce];B[nq];W[pq];B[qf];W[qj];B[kq];W[fl]
+;B[ek];W[dk];B[dj];W[ck];B[cj];W[bl];B[fk];W[bm];B[bn];W[bj]
+;B[bo];W[bp];B[dl];W[ej];B[ei];W[ci];B[fj];W[di];B[bd];W[gk]
+;B[nc];W[gj];B[eg];W[fh];B[ff];W[eh];B[dg];W[cg];B[fd];W[ef]
+;B[gf];W[gg];B[kc];W[hf];B[he];W[fg];B[nn];W[pn];B[il];W[km]
+;B[kk];W[jk];B[jl];W[ik];B[rh];W[rj];B[ol];W[pl];B[og];W[kl]
+;B[lk];W[im];B[hl];W[hm];B[jm];W[gl];B[jn];W[kj];B[kn];W[lj]
+;B[mk];W[if];B[ie];W[kf];B[je];W[jf];B[or];W[pr];B[ps];W[qs]
+;B[os];W[rr];B[dr];W[cq];B[cr];W[br];B[mg];W[lh];B[ag];W[bf]
+;B[pe];W[af];B[gm];W[np];B[mp];W[mo];B[lp];W[oq];B[no];W[nr]
+;B[ee];W[de];B[be];W[fe];B[ge];W[cf];B[ke];W[mq];B[om];W[pm]
+;B[pk];W[qk];B[pj];W[mf];B[ne];W[lg];B[mh];W[mi];B[ni];W[mj]
+;B[nj];W[ng];B[me];W[nh];B[lr];W[oh];B[of];W[pi];B[bs];W[ar]
+;B[oo];W[po];B[eq];W[nk];B[ok];W[oj];B[nl];W[oi];B[nk];W[qh]
+;B[qg];W[ri];B[sg];W[si];B[hk];W[hj];B[sh];W[le];B[ld];W[lf]
+;B[mr];W[ad];B[ae];W[cc];B[bc];W[cb];B[bb];W[fc];B[fb];W[gc]
+;B[db];W[gd];B[gb];W[ic];B[hb];W[hc];B[ib];W[jd];B[jc];W[id]
+;B[kd];W[as];B[cs];W[dq];B[es];W[ms];B[ls];W[ns];B[pg];W[ph]
+;B[lq];W[nq];B[nf];W[];B[on];W[op];B[hd];W[fd];B[ep];W[];B[]
+TB[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ka]
+[la][ma][na][oa][pa][qa][ra][sa][ab][cb][eb][jb][kb][lb][mb][nb][ob]
+[pb][qb][rb][sb][ac][cc][lc][mc][oc][pc][qc][rc][sc][ad][md][nd][od]
+[qd][rd][sd][oe][qe][re][se][pf][rf][sf][rg][kl][ll][ml][hm][im][km]
+[lm][mm][nm][in][ln][mn][ho][jo][ko][lo][mo][gp][ip][jp][kp][gq][hq]
+[iq][jq][er][fr][gr][hr][ir][jr][kr][ds][fs][gs][hs][is][js][ks]
+TW[ee][ag][bg][dg][eg][hg][ig][jg][kg][mg][ah][bh][ch][dh][gh][hh]
+[ih][jh][kh][mh][ai][bi][ei][fi][gi][hi][ii][ji][ki][li][qi][aj][cj]
+[dj][ej][fj][ij][jj][sj][ak][bk][ek][fk][rk][sk][al][cl][dl][el][ql]
+[rl][sl][am][cm][dm][qm][rm][sm][an][bn][cn][en][qn][rn][sn][ao][bo]
+[qo][ro][so][ap][cp][qp][rp][sp][aq][bq][qq][rq][sq][or][qr][sr][os]
+[ps][rs][ss])
diff --git a/regression/games/kgs/munchie-GNU.sgf b/regression/games/kgs/munchie-GNU.sgf
new file mode 100644 (file)
index 0000000..942ab12
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.50]
+PW[munchie]WR[11k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-03-28]AP[CGoban:2]
+RE[W+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[pd][dp]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;W[cd];B[ed];W[gd];B[pq];W[po];B[qo];W[qn];B[qp];W[pn];B[nq];W[qj]
+;B[ic];W[hc];B[id];W[df];B[fe];W[he];B[fg];W[dh];B[jf];W[hg];B[md]
+;W[qf];B[cj];W[fi];B[cm];W[iq];B[qe];W[pf];B[oe];W[fq];B[eq];W[fp]
+;B[do];W[lq];B[no];W[nm];B[ng];W[oh];B[mi];W[lo];B[mk];W[kl];B[fn]
+;W[gn];B[mm];W[nl];B[kn];W[ln];B[jm];W[ml];B[mn];W[lm];B[pp];W[jh]
+;B[bh];W[bf];B[ro];W[rn];B[re];W[rf];B[nj];W[oj];B[og];W[pg];B[lg]
+;W[kg];B[kf];W[lh];B[mh];W[fm];B[jj];W[kj];B[ki];W[ji];B[kk];W[lj]
+;B[li];W[lk];B[ij];W[dl];B[cl];W[dk];B[jl];W[jg];B[ck];W[ci];B[bi]
+;W[dj];B[fo];W[go];B[im];W[hl];B[gh];W[gi];B[cc];W[bc];B[dc];W[fb]
+;B[bb];W[bd];B[hd];W[ge];B[gc];W[fc];B[hb];W[fd];B[ef];W[hh];B[ab]
+;W[da];B[de];W[dg];B[hi];W[hj];B[er];W[ii];B[hs];W[hr];B[sf];W[sg]
+;B[se];W[rh];B[gs];W[is];B[sn];W[sm];B[so];W[rm];B[oi];W[pi];B[mr]
+;W[lr];B[gr];W[gq];B[fr];W[of];B[nf];W[pe];B[qc];W[if];B[nk];W[ok]
+;B[ni];W[je];B[ie];W[lf];B[ke];W[le];B[jd];W[mg];B[ld];W[ne];B[me]
+;W[od];B[oc];W[lg];B[mf];W[ph];B[nh];W[oo];B[mp];W[op];B[mq];W[mo]
+;B[gb];W[oq];B[or];W[lp];B[fa];W[ea];B[ga];W[eb];B[np];W[nn];B[ms]
+;W[ls];B[pr];W[en];B[eo];W[dn];B[cn];W[dm])
diff --git a/regression/games/kgs/perler-GNU.sgf b/regression/games/kgs/perler-GNU.sgf
new file mode 100644 (file)
index 0000000..e4908c6
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.50]
+PW[perler]WR[7k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-06]AP[CGoban:2]
+RE[W+Resign]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+AB[dd][pd][dj][pj][dp][pp]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;W[nc];B[pf];W[fc];B[id];W[fe];B[df];W[ch];B[dm];W[qh];B[qf];W[nq]
+;B[lq];W[lp];B[ph];W[qn];B[oo];W[ql];B[rj];W[om];B[nn];W[qq];B[qp]
+;W[pq];B[ec];W[fb];B[eh];W[bj];B[kq];W[mp];B[kp];W[ln];B[mm];W[ko]
+;B[ro];W[nl];B[ll];W[mk];B[lj];W[lk];B[kk];W[kl];B[rn];W[rm];B[nj]
+;W[rk];B[mj];W[on];B[no];W[sl];B[rq];W[rr];B[sr];W[qr];B[po];W[qj]
+;B[jk];W[km];B[ff];W[ge];B[hp];W[bf];B[co];W[fq];B[fo];W[dr];B[gr]
+;W[cq];B[if];W[gf];B[ne];W[pb];B[lc];W[qc];B[qi];W[qk];B[ri];W[pk]
+;B[fr];W[bp];B[gh];W[hg];B[ii];W[ib];B[hc];W[hb];B[nk];W[ml];B[im]
+;W[md];B[jg];W[ld];B[kc];W[eb];B[kd];W[gc];B[db];W[ga];B[dq];W[br]
+;B[qd];W[lf];B[pc];W[qb];B[mg];W[cc];B[dc];W[cd];B[ce];W[be];B[cb]
+;W[er];B[eq];W[bo];B[bb];W[bd];B[rc];W[rb];B[rd];W[oc];B[mb];W[sb]
+;B[nb];W[ra];B[pa];W[ob];B[oa];W[ke];B[ig];W[mf];B[ic];W[kg];B[me]
+;W[nf];B[of];W[le];B[ng];W[oe];B[od];W[nd];B[ne];W[oj];B[pi];W[ok]
+;B[jb];W[oi];B[mr];W[oh];B[lm];W[nr];B[oq];W[or];B[ps];W[op];B[np]
+;W[mq];B[lr];W[jo];B[jn];W[kn];B[mo];W[lo];B[sp];W[sn];B[nm];W[ol]
+;B[rp];W[io];B[rs];W[oq];B[hn];W[qs];B[og];W[hh];B[hi];W[cn];B[cl]
+;W[dn];B[gg];W[en];B[gn];W[fm];B[ee];W[hf];B[he];W[bm];B[bl];W[di]
+;B[gj];W[cj];B[ej];W[iq];B[ip];W[jp];B[jq];W[ir];B[jr];W[ih];B[ji]
+;W[jh];B[kh];W[lg];B[jf];W[je];B[jd];W[ie];B[lh];W[gl];B[dh];W[cf]
+;B[dk];W[sc];B[ei];W[ci];B[do];W[eo];B[fp];W[ep];B[gq];W[ns];B[pe]
+;W[sd];B[se];W[hd];B[hl];W[gk];B[hk];W[ms];B[js];W[is];B[hs];W[ls]
+;B[hr];W[ac];B[fk];W[fl];B[fn];W[em];B[cg];W[bg];B[el];W[dg];B[eg]
+;W[de];B[ef];W[fd];B[da];W[ed];B[ce];W[ks];B[de];W[kr])
diff --git a/regression/games/kgs/sade-GNU.sgf b/regression/games/kgs/sade-GNU.sgf
new file mode 100644 (file)
index 0000000..3d20b00
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]KM[0.50]
+PW[sade]WR[12k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-04-07]AP[CGoban:2]
+RE[B+5.50]
+TM[600]OT[25/600 Canadian]
+RU[Japanese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.3
+]ST[2]
+CA[UTF-8]
+;B[pd];W[ee];B[pq];W[ep];B[qo];W[pj];B[cp];W[co];B[bo];W[do];B[cn]
+;W[dn];B[cm];W[ce];B[cc];W[cj];B[dm];W[ej];B[jq];W[hq];B[ql];W[lq]
+;B[qh];W[nc];B[fc];W[qj];B[lc];W[ne];B[pf];W[qc];B[pc];W[pb];B[ob]
+;W[qb];B[oc];W[re];B[jo];W[lo];B[ic];W[nb];B[ng];W[of];B[ok];W[oj]
+;B[qe];W[rf];B[pg];W[rh];B[og];W[kd];B[ri];W[rj];B[rg];W[nk];B[nj]
+;W[pk];B[ol];W[pl];B[pm];W[qm];B[rl];W[om];B[pn];W[nm];B[mk];W[nl]
+;B[ni];W[kc];B[na];W[ma];B[oa];W[mb];B[kl];W[jn];B[io];W[kn];B[hr]
+;W[gr];B[ir];W[gq];B[kr];W[lr];B[js];W[cq];B[bq];W[cr];B[in];W[jl]
+;B[im];W[jm];B[hk];W[il];B[hl];W[hm];B[kk];W[hs];B[gm];W[hn];B[go]
+;W[ho];B[hp];W[ip];B[gp];W[jp];B[gn];W[fp];B[kp];W[iq];B[ko];W[kq]
+;B[ln];W[lm];B[mn];W[mo];B[nn];W[on];B[no];W[oo];B[np];W[po];B[qn]
+;W[mm];B[km];W[pp];B[op];W[qq];B[qp];W[oq];B[nq];W[or];B[nr];W[pr]
+;B[lp];W[ls];B[br];W[dp];B[rq];W[rr];B[bp];W[qd];B[bk];W[bj];B[gh]
+;W[eh];B[cl];W[qf];B[pe];W[pa];B[kf];W[ge];B[ld];W[le];B[md];W[nd]
+;B[lb];W[kb];B[me];W[la];B[ke];W[id];B[fb];W[hc];B[ib];W[hb];B[lf]
+;W[if];B[ih];W[jg];B[bd];W[be];B[cs];W[er];B[sp];W[sr];B[ds];W[es]
+;B[ki];W[kh];B[lh];W[jh];B[ji];W[dc];B[db];W[ec];B[eb];W[cd];B[bc]
+;W[ck];B[bl];W[bs];B[as];W[ph];B[qg];W[qi];B[sh];W[oh];B[sf];W[rd]
+;B[fd];W[fe];B[dk];W[ek];B[el];W[gj];B[oi];W[pi];B[mq];W[ks];B[nf]
+;W[oe];B[dj];W[di];B[aj];W[ai];B[ak];W[bi];B[dl];W[fl];B[fm];W[hi]
+;B[ii];W[hh];B[ig];W[jf];B[hg];W[gg];B[fk];W[fj];B[hj];W[gi];B[gk]
+;W[hf];B[je];W[jd];B[dr];W[dq];B[bs];W[en];B[ed];W[dd];B[gb];W[ha]
+;B[sq];W[so];B[rp];W[sm];B[rm];W[sl];B[sk];W[rn];B[sj];W[rk];B[si]
+;W[qk];B[sn];W[sm];B[se];W[rb];B[sd];W[sc];B[sg];W[nh];B[mh];W[lk]
+;B[mj];W[kg];B[ll];W[lg];B[ae];W[af];B[ad];W[bf];B[ie];W[he];B[ga]
+;W[mg];B[mf];W[ml];B[lj];W[fo];B[gd];W[hd];B[os];W[ps];B[ns];W[ka]
+;B[em];W[];B[ms];W[jr];B[mp];W[];B[od];W[];B[fn];W[mc];B[mr];W[gc]
+;B[];W[]TB[aa][ba][ca][da][ea][fa][ab][bb][cb][ac][le][rh][li][mi]
+[ij][jj][kj][ik][jk][lk][al][fl][gl][il][jl][sl][am][bm][hm][jm][qm]
+[sm][an][bn][hn][jn][kn][rn][sn][ao][ho][lo][mo][ro][so][ap][aq][ar]
+TW[ia][ja][qa][ra][sa][ib][jb][sb][ic][jc][rc][de][cf][df][ef][ff]
+[gf][ag][bg][cg][dg][eg][fg][ah][bh][ch][dh][fh][gh][ci][ei][fi][ok]
+[ol][eo][eq][fq][jq][pq][fr][hr][ir][kr][qr][fs][gs][is][js][qs][rs]
+[ss])
diff --git a/regression/games/kgs/simat-TheGNUGo.sgf b/regression/games/kgs/simat-TheGNUGo.sgf
new file mode 100644 (file)
index 0000000..c540575
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[0.50]TM[60]OT[25/300 Canadian]
+PW[simat]PB[TheGNUGo]WR[12k]BR[13k]DT[2005-10-07]PC[The Kiseido Go
+Server (KGS) at http://kgs.kiseido.com/]C[TheGNUGo [13k\]: GTP Engine
+for TheGNUGo (black): GNU Go version 3.7.6 ] ;B[qd] ;W[od] ;B[oc] ;W[nc]
+;B[pc] ;W[nd] ;B[qf] ;W[jd] ;B[dc] ;W[fc] ;B[de] ;W[cg] ;B[dq] ;W[do]
+;B[fq] ;W[fo] ;B[eg] ;W[df] ;B[ce] ;W[ef] ;B[fg] ;W[ff] ;B[pq] ;W[og]
+;B[qo] ;W[kq] ;B[cm] ;W[cn] ;B[dm] ;W[cj] ;B[ph] ;W[pg] ;B[qg] ;W[oh]
+;B[pi] ;W[oi] ;B[gg])
diff --git a/regression/games/kgs/tournament10/ExBot-GNU.sgf b/regression/games/kgs/tournament10/ExBot-GNU.sgf
new file mode 100644 (file)
index 0000000..5804b68
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[ExBot]WR[17k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]EV[Tenth KGS Computer Go Tournament - Formal division]
+RE[B+9.50]
+TM[480]RU[Chinese]
+C[ExBot [17k?\]: GTP Engine for ExBot (white): Explorer version 6.6.x Jan 6 2006
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+CA[UTF-8]RO[6]
+;B[gc];W[dg];B[ce];W[cc];B[ee];W[gg];B[ec];W[db];B[bd];W[bf];B[bc]
+;W[ae];B[he];W[bb];B[cd];W[ca];B[dc];W[ff];B[ef];W[eg];B[cf];W[cg]
+;B[be];W[bh];B[gf];W[hg];B[fe];W[fg];B[hf];W[df];B[ig];W[ih];B[if]
+;W[hi];B[de];W[ad];B[ac];W[af];B[eb];W[];B[ab];W[];B[ba];W[aa];B[cb]
+;W[];B[ba];W[];B[da];W[];B[ge];W[];B[fc];W[];B[]TB[aa][ca][ea][fa]
+[ga][ha][ia][bb][db][fb][gb][hb][ib][cc][hc][ic][dd][ed][fd][gd][hd]
+[id][ie]TW[ag][bg][ah][ch][dh][eh][fh][gh][hh][ai][bi][ci][di][ei]
+[fi][gi][ii])
diff --git a/regression/games/kgs/tournament10/GNU-AyaBot.sgf b/regression/games/kgs/tournament10/GNU-AyaBot.sgf
new file mode 100644 (file)
index 0000000..7cd1367
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[GNU]WR[13k]
+PB[AyaBot]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]AP[CGoban:2]
+EV[Tenth KGS Computer Go Tournament - Formal division]RE[B+7.50]
+TM[480]RU[Chinese]
+C[AyaBot [?\]: GTP Engine for AyaBot (black): Aya version 5.61
+GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+]
+CA[UTF-8]RO[2]ST[2]
+;B[dc];W[cf];B[fc];W[bc];B[cd];W[bd]C[gunnar [?\]: B7 was really bad.
+]
+;B[ce];W[df]C[burtabel [3d\]: was that from the fuseki library?
+]
+;B[fg];W[be];B[ee];W[eh]C[gunnar [?\]: No, it was valued 26.48.
+]
+;B[eg];W[dh]C[gunnar [?\]: E4 second with 21.42.
+];B[dg];W[cg];B[fh]
+;W[cb];B[db];W[da];B[ea];W[ca];B[ei];W[eb];B[fb];W[fa];B[ga];W[gb]
+;B[ea];W[ha];B[fa]C[gunnar [?\]: Can that work?
+];W[ch]
+C[burtabel [3d\]: no
+];B[cc];W[bb];B[ef];W[di];B[de];W[fi];B[gh]
+;W[gi];B[hh];W[hi];B[ih];W[ei];B[ii];W[bg];B[gc];W[af];B[hb];W[ae]
+;B[ia];W[ag];B[];W[bi];B[];W[bh];B[];W[]TB[ha][eb][gb][ib][ec][hc]
+[ic][dd][ed][fd][gd][hd][id][fe][ge][he][ie][ff][gf][hf][if][gg][hg]
+[ig]TW[aa][ba][ab][ac][ad][bf][ah][ai][ci]
+C[gunnar [?\]: What a depressing game.
+])
diff --git a/regression/games/kgs/tournament10/GNU-NeuroGo.sgf b/regression/games/kgs/tournament10/GNU-NeuroGo.sgf
new file mode 100644 (file)
index 0000000..25891b4
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[GNU]WR[13k]
+PB[NeuroGo]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]EV[Tenth KGS Computer Go Tournament - Formal division]
+RE[W+Resign]
+TM[480]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+NeuroGo [?\]: GTP Engine for NeuroGo (black): NeuroGo version Dec 22 2005
+]
+CA[UTF-8]RO[3]
+;B[df];W[gc];B[dc];W[cg];B[gf];W[eb];B[cf];W[dg];B[eg];W[eh];B[fg]
+;W[fh];B[gh];W[bf];B[bg];W[bh];B[ch];W[dh];B[be];W[db];B[cc];W[ag]
+;B[hd];W[hc];B[gd];W[cb];B[bb];W[ec];B[dd];W[fd];B[fe];W[id];B[ed]
+;W[ie];B[fc];W[fb];B[ca];W[ae];B[ad];W[bd];B[af];W[bg]
+C[gunnar [?\]: B6 overplay.
+];B[ae];W[gi];B[hi];W[fi];B[hg];W[fd]
+;B[ha];W[he];B[ge];W[ig];B[hb];W[ih];B[hh];W[fc];B[ii];W[hf];B[if]
+;W[ig];B[ib];W[ic];B[ba];W[ga];B[gg];W[da];B[ih];W[ac];B[ce];W[bc]
+;B[fa];W[ab];B[gb];W[aa];B[cd];W[ba];B[if];W[ee]
+C[tromp [-\]: wa7 is cool
+tromp [-\]: hi, gunnar:)
+gunnar [?\]: I never quite understood what was going on there.
+gunnar [?\]: Hi.
+tromp [-\]: gnugo saw under the stones
+tromp [-\]: i mean wb7
+gunnar [?\]: Ah, that cool. :-)
+tromp [-\]: it captures b8
+gunnar [?\]: Not every day you see that in a game.
+tromp [-\]: certainly not
+tromp [-\]: you can be proud of your baby:)
+]
+)
diff --git a/regression/games/kgs/tournament10/GNU-viking5.sgf b/regression/games/kgs/tournament10/GNU-viking5.sgf
new file mode 100644 (file)
index 0000000..0986f12
--- /dev/null
@@ -0,0 +1,47 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[GNU]WR[13k]
+PB[viking5]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]AP[CGoban:2]
+EV[Tenth KGS Computer Go Tournament - Formal division]RE[W+Resign]
+TM[480]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+viking5 [?\]: GTP Engine for viking5 (black): Viking version 5.3.1
+]
+CA[UTF-8]RO[4]ST[2]
+;B[ef];W[dc];B[ed];W[ec];B[fc];W[fb];B[gc];W[gg];B[fh];W[gb]
+C[gunnar [?\]: GNU thinks the lower right was killed by F2.
+];B[ge]
+;W[ce]C[burtabel [3d\]: thats not too unreasonable
+];B[cg];W[hb]
+C[gunnar [?\]: But too pessimistic if it wants to win the game.
+]
+;B[bf];W[be];B[he]
+C[zapp [?\]: Viking is still worried about the lower left
+];W[cf]
+C[gunnar [?\]: I'm starting to think that GNU's biggest problem in 9x9 games is that it's foo fond of early second line moves.
+]
+;B[bg];W[dd];B[hc]
+C[burtabel [3d\]: well, only h8 was questionable here
+];W[ee]
+C[burtabel [3d\]: g8 was pretty big I think
+];B[fe];W[af]
+C[zapp [?\]: Actually I had a version of viking that played a lot on the 2nd line and won surprisingly often
+]
+;B[de]C[zapp [?\]: 2nd line on 9x9 is not as bas one might think
+]
+;W[ag];B[bh];W[df];B[ah]C[burtabel [3d\]: both missed danger of d3
+]
+;W[dg]C[burtabel [3d\]: (instead of d4)
+];B[dh];W[eg];B[fg];W[ee]
+;B[ae];W[ff];B[gf];W[ad]
+C[zapp [?\]: Black plays unreasonable because it thouht white was ahead
+]
+;B[af];W[bc];B[ib];W[eh];B[ei];W[ef];B[fd];W[ha];B[ci];W[ia]
+C[gunnar [?\]: W+0.5 according to GNU.
+zapp [?\]: No bugs this time
+zapp [?\]: viking also evaluated it to .5 loss
+burtabel [3d\]: hmm
+burtabel [3d\]: seems it trusts its counting a lot
+]
+)
diff --git a/regression/games/kgs/tournament10/IdiotBot-TheGNUGo.sgf b/regression/games/kgs/tournament10/IdiotBot-TheGNUGo.sgf
new file mode 100644 (file)
index 0000000..c30d110
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[IdiotBot]WR[30k]
+PB[TheGNUGo]BR[12k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]EV[Tenth KGS Computer Go Tournament - Open division]
+RE[B+161.50]
+TM[780]RU[Chinese]
+C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (black): GNU Go version 3.7.7
+IdiotBot [30k?\]: GTP Engine for IdiotBot (white): IdiotBot: I play mostly randomly: if I'm too easy, try WeakBot50k. Its maybe 60 stones stronger. 30k humans are often 80 stones stronger. My info contains links to my source code: version 0.0.2
+]
+CA[UTF-8]RO[3]
+;B[jd];W[mj];B[hc];W[bk];B[ec];W[hf];B[de];W[ih];B[hk];W[ci];B[kk]
+;W[mh];B[ek];W[hm];B[gl];W[mi];B[cg];W[ig];B[cl];W[gf];B[bl];W[hb]
+;B[gc];W[lg];B[ib];W[fk];B[fj];W[jl];B[kl];W[cb];B[ed];W[kh];B[dh]
+;W[fm];B[hl];W[fd];B[le];W[lm];B[kj];W[dl];B[dk];W[dj];B[fe];W[he]
+;B[ej];W[hd];B[gd];W[fc];B[km];W[fb];B[eb];W[me]
+C[burtabel [3d\]: seems not to lose by time is only challenge here...
+]
+;B[li];W[ml];B[md];W[mf];B[ld];W[ia];B[ic];W[lf];B[cd];W[bi];B[cj]
+;W[di];B[bj];W[bd];B[bc];W[al];B[ei];W[db];B[bb];W[ff];B[ef];W[ab]
+;B[ac];W[aa];B[fh];W[ba];B[ke];W[ca];B[ll];W[mm];B[mk];W[hj];B[lh]
+;W[lk];B[ij];W[lj];B[mg];W[mh];B[hi];W[gj];B[hh];W[ak];B[ck];W[eg]
+;B[fg];W[jh];B[mi];W[mg];B[kg];W[kf];B[jf];W[am];B[bh];W[gg];B[gh]
+;W[ki];B[if];W[kb];B[ja];W[ha];B[gb];W[ga];B[fl];W[gk];B[gi];W[fa]
+;B[ad];W[ea];B[cc];W[be];B[ce];W[da];B[dc];W[ia];B[ha];W[ea];B[fa]
+;W[da];B[db];W[ca];B[ba];W[bg];B[ae];W[bf];B[cf];W[lj];B[mj];W[lb]
+;B[kc];W[af];B[ag];W[df];B[hg];W[ee];B[dg];W[ef];B[ge];W[mh];B[mg]
+;W[aj];B[bm];W[ai];B[ah];W[jc];B[lc];W[jb];B[la];W[gj];B[hj];W[gk]
+;B[cb];W[bf];B[be];W[kf];B[lf];W[jj];B[im];W[gm];B[em];W[da];B[ea]
+;W[jg];B[ii];W[ji];B[jk];W[dm];B[el];W[gm];B[hm];W[kh];B[ki];W[jh]
+;B[jg];W[];B[]TB[aa][ca][da][ga][ia][ka][ma][ab][fb][hb][jb][kb][lb]
+[mb][fc][jc][mc][bd][dd][fd][hd][id][kd][ee][he][ie][je][me][af][bf]
+[df][ef][ff][gf][hf][kf][mf][bg][eg][gg][ig][lg][ch][eh][ih][jh][kh]
+[mh][ai][bi][ci][di][fi][ji][aj][dj][gj][jj][lj][ak][bk][fk][gk][ik]
+[lk][al][dl][il][jl][ml][am][cm][dm][fm][gm][jm][lm][mm])
diff --git a/regression/games/kgs/tournament10/TheGNUGo-Dariush.sgf b/regression/games/kgs/tournament10/TheGNUGo-Dariush.sgf
new file mode 100644 (file)
index 0000000..0322aa1
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[TheGNUGo]WR[12k]
+PB[Dariush]BR[14k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]AP[CGoban:2]
+EV[Tenth KGS Computer Go Tournament - Open division]RE[W+28.50]
+TM[780]RU[Chinese]
+C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.7.7
+Dariush [14k\]: GTP Engine for Dariush (black): Dariush version 3.1.5.7, level 7
+]
+CA[UTF-8]RO[2]ST[2]
+;B[kd];W[ic];B[jk];W[je];B[cj];W[ek];B[dc];W[di];B[ci];W[dh];B[ch]
+;W[dg];B[cg];W[hk];B[ki];W[fc];B[dl];W[kb];B[le];W[de];B[ed];W[el]
+;B[dk];W[cf];B[im];W[ih];B[ij];W[hj];B[kg];W[jg];B[bf];W[be];B[bg]
+;W[ae];B[cc];W[bb];B[gl];W[dj];B[gi];W[hl];B[hm];W[hi];B[fl];W[ik]
+;B[em];W[fj];B[jf];W[kf];B[if];W[kh];B[ke];W[lg];B[id];W[jl];B[ji]
+;W[kk];B[fe];W[hc];B[fh];W[fk];B[ef];W[df];B[eg];W[hg]
+C[burtabel [3d\]: W+23 says gnugo
+];B[ge];W[jc];B[jd];W[lf];B[gg]
+;W[lc];B[hf];W[hh];B[ea];W[fb];B[jm];W[jj];B[ll];W[lk];B[gk];W[gj]
+;B[kl];W[fa]C[gunnar [?\]: N2 fairly big.
+];B[lj];W[ml];B[bc]
+C[burtabel [3d\]: well k4 was a little overcautious
+];W[eb];B[ab]
+;W[km];B[bk];W[lm];B[fm];W[il];B[db];W[da];B[ca];W[af];B[me];W[ag]
+;B[ah];W[hd];B[cd];W[ce];B[fi];W[he];B[ie];W[gd];B[ea];W[kc];B[da]
+;W[ld];B[ac];W[md];B[ei];W[ej];B[lh];W[kg];B[ig];W[jh];B[mf];W[mg]
+;B[dm];W[gm];B[hm];W[im];B[gm];W[ee];B[fd];W[gh];B[ec];W[eh];B[fg]
+;W[dd];B[ad];W[bd];B[];W[kj];B[];W[ll];B[];W[gb];B[];W[hb];B[];W[ia]
+;B[];W[ib];B[];W[]TB[aa][ba][bb][cb][je][ff][gf][bh][ai][bi][aj][bj]
+[ak][ck][al][bl][cl][am][bm][cm]TW[ga][ha][ja][ka][la][ma][jb][lb]
+[mb][gc][mc][lh][mh][ii][ji][ki][li][mi][ij][lj][mj][jk][mk][kl][jm]
+[mm])
diff --git a/regression/games/kgs/tournament10/TheGNUGo-HouseBot.sgf b/regression/games/kgs/tournament10/TheGNUGo-HouseBot.sgf
new file mode 100644 (file)
index 0000000..74a90bf
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[TheGNUGo]WR[12k]
+PB[HouseBot]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]AP[CGoban:2]
+EV[Tenth KGS Computer Go Tournament - Open division]TM[780]
+RU[Chinese]
+C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.7.7
+HouseBot [?\]: GTP Engine for HouseBot (black): HouseBot version 0.3.2 (Alpha)
+]
+CA[UTF-8]RO[1]ST[2]
+;B[kj];W[dk];B[jc];W[dc];B[gf];W[ke];B[kd];W[je];B[ld];W[ik];B[le]
+;W[ji];B[ki];W[ef];B[jj];W[ij];B[jk];W[hi];B[eh];W[fe];B[ci];W[jh]
+;B[kh];W[gc];B[dj];W[fg];B[cj];W[cg];B[ch];W[bg];B[bh];W[ck];B[id]
+;W[ej];B[ek];W[ei];B[dl];W[cl];B[el];W[bj];B[bi];W[bk];B[dh];W[cm]
+;B[dm];W[fk];B[fj];W[fi];B[gj];W[gl];B[gk];W[fl];B[hk];W[if];B[hl]
+;W[il];B[jl];W[im];B[hm];W[ge];B[lf];W[jm];B[km];W[kl];B[kk];W[ll]
+;B[lk];W[kg];B[lg];W[ib];B[jb];W[hb];B[gi];W[fh];B[lm];W[mm];B[jd]
+;W[kf];B[di];W[km];B[hj];W[ja];B[ka];W[ia];B[kb];W[mk];B[mj];W[ml]
+;B[lh];W[hd];B[gm];W[em];B[bc];W[cb];B[bb];W[be];B[ca];W[cc];B[da]
+;W[eb];B[ba];W[bd];B[ad];W[ae];B[ac];W[ie];B[aj];W[dg];B[ah];W[eg]
+;B[ag];W[af];B[ak];W[al];B[ii];W[ih];B[];W[ic];B[];W[hh];B[];W[db]
+;B[];W[ea];B[];W[ai];B[];W[gh];B[jg];W[ig];B[];W[fm];B[];W[ek];B[]
+;W[he];B[];W[hc];B[];W[bi];B[];W[ag];B[];W[cd];B[];W[]TB[la][ma][lb]
+[mb][kc][lc][mc][md][me][mf][mg][mh][li][mi][lj]TW[aa][ba][ca][da]
+[fa][ga][ha][ab][bb][fb][gb][ac][bc][ec][fc][ad][dd][ed][fd][gd][ce]
+[de][ee][bf][cf][df][ff][gf][hf][jf][gg][hg][jg][ah][bh][ch][dh][eh]
+[ci][di][gi][ii][aj][cj][dj][fj][gj][hj][ak][gk][hk][bl][dl][el][hl]
+[am][bm][dm][gm][hm][lm]C[gunnar [?\]: Quick game.
+HouseBot [?\]: You and the engine seem to disagree about which stones are dead. Sorry, this cannot be solved. You must either accept the engine's choices or adjourn the game. If you think the engine is incorrect, then please contact its author.
+jhouse [11k\]: yeah, housebot is dumb
+TheGNUGo [12k\]: You and the engine seem to disagree about which stones are dead. To solve this problem, you can press "undo", play until all dead stones are removed from the board, then score again.
+jhouse [11k\]: it doesn't vote on dead stones
+]
+)
diff --git a/regression/games/kgs/tournament10/TheGNUGo-SimpleBot.sgf b/regression/games/kgs/tournament10/TheGNUGo-SimpleBot.sgf
new file mode 100644 (file)
index 0000000..137a5d5
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[TheGNUGo]WR[12k]
+PB[SimpleBot]BR[26k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]EV[Tenth KGS Computer Go Tournament - Open division]
+RE[W+58.50]
+TM[780]RU[Chinese]
+C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.7.7
+SimpleBot [26k\]: GTP Engine for SimpleBot (black): SimpleBot: If I'm too hard, try WeakBot50k or maybe DrunkenGnu. If I'm too easy, try humans or LibertyBot. See my info: version 0.2.8
+]
+CA[UTF-8]RO[4]
+;B[dg];W[ik];B[hk];W[hj];B[ij];W[jk];B[hi];W[gj];B[gk];W[fj];B[fi]
+;W[fk];B[fl];W[el];B[ek];W[ej];B[dk];W[dl];B[dj];W[ii];B[jj];W[ei]
+;B[gl];W[cl];B[fh];W[di];B[cj];W[ci];B[bj];W[cg];B[ch];W[bh];B[dh]
+;W[bi];B[bg];W[cf];B[bk];W[df];B[ih];W[ji];B[kj];W[ki];B[kk];W[bl]
+;B[il];W[hh];B[hg];W[gi];B[eh];W[ig];B[gh];W[jh];B[fg];W[gf];B[ff]
+;W[fe];B[hf];W[he];B[if];W[je];B[jg];W[ie];B[kg];W[jf];B[gg];W[gd]
+;B[ih];W[lh];B[hi];W[bf];B[li];W[ef];B[kh];W[le];B[lg];W[lf];B[ke]
+;W[kd];B[kf];W[em];B[ge];W[hc];B[fd];W[ee];B[gc];W[hd];B[ed];W[fc]
+;B[gb];W[ec];B[dd];W[eb];B[gf];W[hb];B[hh];W[fm];B[ai];W[ag];B[kc]
+;W[ld];B[lc];W[ka];B[md];W[jc];B[mf];W[gm];B[hl];W[kb];B[lb];W[la]
+;B[mc];W[mg];B[mh];W[mb];B[ma];W[jb];B[me];W[jd];B[be];W[cd];B[dc]
+;W[db];B[cc];W[bc];B[cb];W[bb];B[ca];W[bd];B[ba];W[hm];B[kl];W[im]
+;B[jl];W[jm];B[al];W[ah];B[ea];W[ga];B[da];W[fb];B[ji];W[km];B[mg]
+;W[ll];B[mb];W[lk];B[lj];W[mk];B[mj];W[eg];B[lm];W[mm];B[ab];W[de]
+;B[ad];W[ce];B[af];W[ae];B[am];W[ck];B[];W[ac];B[];W[aj];B[];W[ak]
+;B[];W[cj];B[];W[gb];B[];W[ia];B[];W[]TB[ig][jh][lh][ii][ki][mi][ik]
+[jk]TW[aa][ba][ca][da][ea][fa][ha][ja][ab][cb][ib][cc][dc][gc][ic]
+[ad][dd][ed][fd][id][be][af][bg][ai][bj][dj][bk][dk][ek][al][ml][am]
+[bm][cm][dm][lm])
diff --git a/regression/games/kgs/tournament10/TheGNUGo-StoneCrazy.sgf b/regression/games/kgs/tournament10/TheGNUGo-StoneCrazy.sgf
new file mode 100644 (file)
index 0000000..71b8fd3
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[TheGNUGo]WR[12k]
+PB[StoneCrazy]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]EV[Tenth KGS Computer Go Tournament - Open division]
+RE[W+42.50]
+TM[780]RU[Chinese]
+C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (white): GNU Go version 3.7.7
+StoneCrazy [?\]: GTP Engine for StoneCrazy (black): Crazy Stone version 0003-10
+]
+CA[UTF-8]RO[5]
+;B[ii];W[jj];B[jd];W[kh];B[cg];W[hc];B[gg];W[hk];B[il];W[ik];B[hd]
+;W[gd];B[ec];W[cc];B[gc];W[ic];B[fd];W[eb];B[dk];W[kb];B[id];W[gb]
+;B[ge];W[dc];B[ji];W[kj];B[hl];W[gl];B[ki];W[jl];B[fb];W[ld];B[db]
+;W[cb];B[ea];W[bc];B[li];W[kf];B[le];W[ke];B[kd];W[lc]
+C[burtabel [3d\]: m9 good start there..
+];B[lg];W[lf];B[dd];W[be]
+;B[mf];W[lh];B[el];W[de];B[gh];W[dg];B[gk];W[dh];B[fl];W[gj];B[gm]
+;W[cj];B[cf];W[df];B[dj];W[ci];B[mh]
+C[burtabel [3d\]: CrazyStone is only half a year old?
+];W[kg]
+C[RemiCoulom [12k\]: yes
+];B[cd]C[burtabel [3d\]: impressive work!
+RemiCoulom [12k\]: thanks
+]
+;W[ce]C[RemiCoulom [12k\]: It has a very speculative style.
+];B[bd]
+C[RemiCoulom [12k\]: This is sometimes spectacular
+];W[ad]
+C[RemiCoulom [12k\]: but often very inaccurate.
+];B[ed];W[cl];B[fj]
+;W[ll]
+C[burtabel [3d\]: you don't let it play ranked games here usually?
+]
+;B[hj];W[lj];B[ck];W[bk];B[ac];W[ab]
+C[RemiCoulom [12k\]: It has played a few. The larger the board, the weaker it plays.
+]
+;B[bl]C[RemiCoulom [12k\]: It may be about 25k on 19x19.
+];W[bm]
+;B[aj];W[cm];B[ae];W[ac];B[ba];W[ij];B[gi];W[me];B[al];W[bj];B[ai]
+;W[ga];B[af];W[ag];B[bg];W[bf];B[lk];W[mj];B[ak];W[ah];B[bh];W[af]
+;B[mi];W[mg];B[kk];W[kl];B[jk];W[mk];B[ja];W[jc];B[hb];W[ha];B[fa]
+;W[ib];B[ia];W[hb];B[kc];W[jb];B[lb];W[ka];B[la];W[mb];B[ja];W[ma]
+;B[im];W[ca];B[jm];W[da];B[dl];W[bi];B[dm];W[am];B[eh];W[ff];B[gf]
+;W[di];B[al];W[bl];B[if];W[ei];B[km];W[fh];B[lm];W[kk];B[eb];W[fg]
+;B[jg];W[jh];B[ih];W[jf];B[ig];W[ee];B[je];W[ej];B[ek];W[fe];B[fi]
+;W[ml];B[mm];W[lb];B[hf];W[];B[hh];W[];B[]TB[fc][gd][he][ie][hg][hi]
+[gj][fk][gl][em][fm][hm]TW[aa][ba][ia][ja][la][bb][mc][md][ae][le]
+[cf][ef][mf][bg][cg][eg][lg][bh][ch][eh][ai][aj][ak][jk][lk][al])
diff --git a/regression/games/kgs/tournament10/WeakBot50k-TheGNUGo.sgf b/regression/games/kgs/tournament10/WeakBot50k-TheGNUGo.sgf
new file mode 100644 (file)
index 0000000..a393d82
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[WeakBot50k]WR[29k]
+PB[TheGNUGo]BR[12k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]EV[Tenth KGS Computer Go Tournament - Open division]
+RE[B+161.50]
+TM[780]RU[Chinese]
+C[TheGNUGo [12k\]: GTP Engine for TheGNUGo (black): GNU Go version 3.7.7
+WeakBot50k [29k?\]: GTP Engine for WeakBot50k (white): WeakBot50k: At end of game I will pass once your stones are so safe that you can pass FOREVER. If I'm too hard, try IdiotBot. If I'm too easy, try humans or SimpleBot. 30k humans and SimpleBot 30k are about 10-20 stones stronger. My info contains links to my source code: version 0.1.7.goal_test
+]
+CA[UTF-8]RO[6]
+;B[jd];W[lj];B[hc];W[id];B[ic];W[jc];B[kd];W[je];B[ie];W[ld];B[hd]
+;W[ke];B[kc];W[kb];B[lc];W[lb];B[le];W[jb];B[kf];W[jf];B[jg];W[jh]
+;B[if];W[kg];B[ih];W[lf];B[kh];W[je];B[ji];W[mc];B[md];W[gc];B[dc]
+;W[hb];B[ib];W[he];B[ef];W[gd];B[gb];W[ha];B[ia];W[lh];B[jk];W[hf]
+;B[hg];W[gg];B[fg];W[hh];B[gh];W[ig];B[hi];W[hj];B[gj];W[gk];B[fk]
+;W[fj];B[gi];W[fl];B[ek];W[dk];B[el];W[dl];B[ej];W[ei];B[dj];W[cj]
+;B[li];W[fi];B[di];W[dh];B[ci];W[bi];B[ck];W[bj];B[cl];W[dm];B[ch]
+;W[cg];B[bh];W[bg];B[ah];W[ag];B[eh];W[mi];B[ki];W[kj];B[lg];W[jj]
+;B[hk];W[jl];B[kk];W[kl];B[lk];W[ll];B[ij];W[mj];B[ml];W[bl];B[em]
+;W[gl];B[il];W[dg];B[fb];W[eb];B[ec];W[fa];B[df];W[ff];B[fe];W[ee]
+;B[eg];W[de];B[cf];W[ce];B[bf];W[be];B[fd];W[cc];B[db];W[cb];B[ae]
+;W[da];B[ad];W[ed];B[cd];W[bd];B[bc];W[ak];B[ai];W[ab];B[ga];W[hm]
+;B[im];W[jm];B[bb];W[hl];B[ik];W[ca];B[ea];W[mf];B[mg];W[bm];B[cm]
+;W[dl];B[dm];W[aj];B[bk];W[hb];B[ha];W[ja];B[mb];W[aa];B[ba];W[cb]
+;B[ca];W[lm];B[mk];W[la];B[mc];W[gf];B[hg];W[fc];B[ge];W[gf];B[ff]
+;W[gc];B[fc];W[fm];B[al];W[bj];B[aj];W[];B[]TB[aa][da][fa][ja][ka]
+[la][ma][ab][cb][eb][hb][jb][kb][lb][ac][cc][gc][jc][bd][dd][ed][gd]
+[id][ld][be][ce][de][ee][he][je][ke][me][af][gf][hf][jf][lf][mf][ag]
+[bg][cg][dg][gg][ig][kg][dh][fh][hh][jh][lh][mh][bi][ei][fi][ii][mi]
+[bj][cj][fj][hj][jj][kj][lj][mj][ak][dk][gk][bl][dl][fl][gl][hl][jl]
+[kl][ll][am][bm][fm][gm][hm][jm][km][lm][mm])
diff --git a/regression/games/kgs/tournament10/tlsBot-GNU.sgf b/regression/games/kgs/tournament10/tlsBot-GNU.sgf
new file mode 100644 (file)
index 0000000..0ca18ab
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[tlsBot]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-01-08]AP[CGoban:2]
+EV[Tenth KGS Computer Go Tournament - Formal division]RE[B+23.50]
+TM[480]RU[Chinese]
+C[tlsBot [?\]: GTP Engine for tlsBot (white): tlsBot version Bookish2CSM-21324778 ; ........... I sometimes have some problems knowing when to pass. If you feel I should pass, and I keep on playing, check to see if you have any groups that have 2 liberties. Defending them should help.
+burtabel [3d\]: this is weird GNU is playing another game
+Broege [-\]: yes, and non-tournament one
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+CA[UTF-8]RO[5]ST[2]
+;B[fe];W[de];B[ed];W[dd];B[ec];W[dc];B[eg];W[eb];B[fb];W[db];B[cg]
+;W[ff];B[ef];W[ee];B[ge];W[bf];B[gc];W[cf];B[bg];W[dg];B[df];W[dh]
+;B[eh];W[fa];B[af];W[be];B[ga];W[ea];B[ae];W[ad];B[ag];W[bd];B[ch]
+;W[hc];B[hb];W[he];B[hd];W[gf];B[gg];W[fd];B[gd];W[hf];B[fg];W[gh]
+;B[hg];W[di];B[fc];W[ci];B[bi];W[ah];B[ei];W[ih];B[ig];W[];B[id];W[]
+;B[hh];W[ca];B[ha];W[cb];B[hi];W[ce];B[dh];W[bb];B[if];W[ac];B[ic]
+;W[];B[]TB[ia][gb][ib][hc][fd][he][ie][ff][gf][hf][dg][ah][bh][fh]
+[gh][ih][ai][ci][di][fi][gi][ii]TW[aa][ba][da][ab][bc][cc][cd])
diff --git a/regression/games/kgs/tournament11/CrazyStone-GNU.sgf b/regression/games/kgs/tournament11/CrazyStone-GNU.sgf
new file mode 100644 (file)
index 0000000..78ea144
--- /dev/null
@@ -0,0 +1,54 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[CrazyStone]WR[30k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-05]
+EV[Eleventh KGS Computer Go Tournament - Formal division]RE[B+33.50]
+TM[1080]RU[Chinese]
+C[CrazyStone [30k\]: GTP Engine for CrazyStone (white): Crazy Stone version 0003-12
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.8
+]
+CA[UTF-8]RO[5]
+;B[kd];W[eh];B[jh];W[ch];B[kk];W[ed];B[cc];W[kg];B[kh];W[fk];B[cf]
+;W[db];B[dc];W[ec];B[hc];W[fb];B[gb];W[gc];B[hb];W[hd]
+C[gunnar [?\]: Is the upper left quite safe?
+];B[id];W[ic];B[jc]
+;W[bf];B[gd];W[he];B[ge];W[gf];B[hf];W[ie];B[ff];W[ig];B[if];W[je]
+C[burtabel [3d\]: what default level is GNU using now?
+];B[jg];W[gg]
+C[gunnar [?\]: I don't understand a thing of this fight.
+];B[jf]
+;W[fe];B[fc];W[fd];B[gc]C[gunnar [?\]: 15
+];W[ef];B[hk];W[ke];B[ib]
+;W[fg];B[gl];W[ld];B[lc];W[lb];B[el];W[mc];B[kc];W[lh];B[le];W[lf]
+;B[li];W[me];B[kf];W[lg];B[kb];W[ki];B[ji];W[kj];B[lj];W[jj];B[hi]
+;W[hj];B[gj];W[ij];B[ik];W[mb];B[la];W[ka];B[dk];W[ja];B[fj];W[be]
+;B[cj];W[dj];B[di];W[bj];B[bk];W[fa]
+C[gunnar [?\]: I'm not sure GNU understands the semeai in the upper right. G13 is a good move.
+]
+;B[jd];W[le];B[bi]
+C[burtabel [3d\]: i am sure GNU does not understand it...
+];W[ga]
+;B[cg];W[ci]C[gunnar [?\]: Me too. :-(
+];B[ej];W[ma];B[ce];W[ck]
+;B[dh];W[cl];B[bh];W[jb];B[cb];W[cd];B[dd]
+C[RemiCoulom [12k\]: Crazy Stone plays stupid moves because it believes GNU has to reply in K3 to kill K4.
+]
+;W[bl];B[aj];W[ak];B[bj];W[ca];B[ba];W[de];B[da];W[eb];B[bd];W[jl]
+;B[jk];W[ea];B[hg];W[kl]
+C[gunnar [?\]: Strange game, even with computer go standards.
+];B[ll]
+;W[gh];B[hh];W[mh];B[df];W[ee];B[ei];W[eg];B[mi];W[ml];B[mk];W[ic]
+;B[ca];W[lm];B[lk];W[gi];B[fi];W[ih];B[ii];W[em];B[fm];W[al];B[dm]
+;W[fh];B[dg];W[ab];B[bb];W[ad];B[bg];W[ac];B[af];W[ae];B[bc];W[ha]
+;B[dl];W[ag];B[ah];W[aa];B[af];W[kj];B[be];W[hl];B[mm];W[la];B[km]
+;W[fl];B[gk];W[il];B[jm];W[ij];B[ek];W[mg];B[];W[ih];B[];W[jj];B[]
+;W[ki];B[];W[jd];B[];W[kd];B[];W[md];B[];W[id];B[];W[ia];B[];W[]
+TB[aa][ab][ac][ad][cd][ae][bf][ag][ig][ch][ih][ai][ci][ki][dj][hj]
+[ij][jj][kj][mj][ak][ck][fk][al][bl][cl][fl][hl][il][jl][kl][ml][am]
+[bm][cm][em][gm][hm][im][lm]TW[gb][hb][ib][kb][fc][gc][hc][jc][kc]
+[lc][gd][ge][ff][mf]
+C[burtabel [3d\]: think all GNU - games in this tourney were exciting, more because of the fighting than because of the quality of moves...
+]
+)
diff --git a/regression/games/kgs/tournament11/GNU-CrazyStone.sgf b/regression/games/kgs/tournament11/GNU-CrazyStone.sgf
new file mode 100644 (file)
index 0000000..88d9b97
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[GNU]WR[13k]
+PB[CrazyStone]BR[30k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-05]
+EV[Eleventh KGS Computer Go Tournament - Formal division]RE[W+0.50]
+TM[1080]RU[Chinese]
+C[CrazyStone [30k\]: GTP Engine for CrazyStone (black): Crazy Stone version 0003-12
+GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.8
+]
+CA[UTF-8]RO[3]
+;B[gh];W[dj];B[if];W[dh];B[fc];W[ce];B[hh];W[ek];B[di];W[ei];B[hj]
+;W[hl];B[cf];W[df];B[ik]
+C[burtabel [3d\]: just this week I wanted to write some code go generate invasions like L11 here...
+]
+;W[kk];B[ki];W[kg];B[il];W[kd];B[ke];W[le];B[jc];W[lj];B[kl];W[li]
+;B[jd];W[kc];B[kb];W[lb];B[ld];W[lc];B[lf];W[md];B[be];W[kf];B[de]
+;W[cg];B[cd];W[ef];B[je];W[gk];B[ee];W[ll];B[lh];W[kh];B[jh];W[jb]
+;B[ib];W[ka];B[jj];W[lg];B[jg];W[ia];B[jf];W[mf];B[ci];W[bi];B[mg]
+;W[lf];B[cj];W[ck];B[bj];W[bh];B[fj];W[ej];B[bg];W[ch];B[fk];W[fl]
+;B[eh];W[ga];B[ff];W[hb];B[ic];W[db];B[hm];W[gm];B[im];W[eg];B[fh]
+;W[km];B[ah];W[ai];B[bk];W[cl];B[el];W[dl];B[ag];W[bl];B[fi];W[em]
+;B[fg];W[aj];B[dg];W[ak];B[fb];W[fa];B[hc];W[bc];B[ea];W[eb];B[gb]
+;W[da];B[ha];W[cc];B[ea];W[fa];B[ba];W[bb];B[ca];W[aa];B[ac];W[jl]
+;B[bd];W[ja];B[la];W[ma];B[gj];W[kj];B[mb];W[ji];B[la];W[kb];B[ii]
+;W[jk];B[hk];W[gl];B[mc];W[ma];B[jm];W[ij];B[bf];W[jj];B[lm];W[mm]
+;B[ml];W[al];B[ec];W[mh];B[lm];W[kl];B[ig];W[ld];B[ga];W[];B[ef];W[]
+;B[ea];W[];B[gi];W[];B[ad];W[];B[fa];W[];B[hb];W[];B[ab];W[];B[ih]
+;W[];B[hf];W[];B[cb];W[];B[dc];W[];B[]TB[aa][da][bb][db][eb][bc][cc]
+[gc][dd][ed][fd][gd][hd][id][ae][ce][fe][ge][he][ie][af][df][gf][eg]
+[gg][hg][hi]TW[la][mb][mc][me][mg][lh][ci][di][ki][mi][bj][cj][mj]
+[bk][dk][lk][mk][el][ml][am][bm][cm][dm][fm][lm][mm]
+C[burtabel [3d\]: oops
+RemiCoulom [12k\]: !
+Franco [10k\]: lol
+wb [7k\]: :) 
+maproom [8k?\]: please leave your bots running after this  -  there MAY be three more rounds
+burtabel [3d\]: typical monkey jump disaster by GNU Go...
+]
+)
diff --git a/regression/games/kgs/tournament11/GNU-firstgo.sgf b/regression/games/kgs/tournament11/GNU-firstgo.sgf
new file mode 100644 (file)
index 0000000..9ed4b5e
--- /dev/null
@@ -0,0 +1,82 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[GNU]WR[13k]
+PB[firstgo]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-05]
+EV[Eleventh KGS Computer Go Tournament - Formal division]RE[W+148.50]
+TM[1080]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.8
+firstgo [?\]: GTP Engine for firstgo (black): FirstGo version 1.112
+]
+CA[UTF-8]RO[1]
+;B[gg];W[ci];B[hh];W[de];B[ff];W[dg];B[je];W[ec];B[id];W[ek];B[di]
+;W[eh];B[ej];W[fj];B[ei];W[fi];B[dk];W[el];B[cl];W[cj];B[dj];W[bl]
+;B[fh];W[hj];B[bk];W[ck];B[dh];W[eg];B[dl];W[bj];B[bm];W[ak];B[ch]
+;W[bh];B[cg];W[cf];B[ef];W[df];B[gj]
+C[gunnar [?\]: I'm not entirely impressed by GNU's play.
+];W[bg]
+;B[fk];W[gi];B[hi];W[gk];B[fl];W[gl];B[em]
+C[greymatter [24k?\]: Gnu should have no problem to win with a large amount
+]
+;W[cm]C[greymatter [24k?\]: Hi gunnar
+];B[dd];W[ed];B[dc];W[cd];B[cc]
+;W[bc];B[cb]C[burtabel [3d\]: not a big tournament...
+gunnar [?\]: No, 9x9 seems more popular.
+]
+;W[bb];B[da];W[am];B[ij]C[burtabel [3d\]: huh?
+burtabel [3d\]: a1?
+gunnar [?\]: No idea.
+trogdor [-\]: :)
+]
+;W[ik];B[jj];W[gj];B[gm]C[gunnar [?\]: G4 wasn't stellar either.
+]
+;W[jk];B[hl];W[hk];B[jl]
+C[gunnar [?\]: On the other, neither was K2. :-)
+];W[kj];B[il]
+C[burtabel [3d\]: or G1 or L4...
+];W[kl];B[lk];W[kk];B[bf]
+C[gunnar [?\]: Pretty bad fight in other words.
+];W[eb];B[ee]
+C[burtabel [3d\]: e12 is the best move i have seen so far :)
+];W[be]
+;B[lj]C[gunnar [?\]: It was the second choice when A1 was played.
+]
+;W[ki];B[ii];W[kg];B[ll];W[km];B[mj];W[le];B[lh];W[kh];B[lm];W[li]
+;B[ml]C[gunnar [?\]: Shouldn't have been necessary to let black live.
+burtabel [3d\]: yes but m9 was big too
+gunnar [?\]: GNU is down to level 12 now but playing quite slowly.
+]
+;W[hc];B[mi];W[ic];B[jc];W[jb];B[kb];W[kc];B[jd];W[lb];B[kd];W[lc]
+C[gunnar [?\]: Now level 8 and the speed is up.
+];B[ib];W[ka];B[ja]
+C[gunnar [?\]: Hm, back to 12. Time might become a problem.
+burtabel [3d\]: ko always dangerous for time
+]
+;W[kb]C[al2 [7k\]: there is no ko here
+];B[ld];W[lg];B[mh];W[md]
+C[burtabel [3d\]: L12 will turn up as ko in many reading sequences
+]
+;B[hd];W[gc];B[fd];W[ig]C[al2 [7k\]: ok :)
+];B[ge];W[hf];B[mb];W[af]
+;B[mc];W[ma]
+C[burtabel [3d\]: I think we need alpha-beta cut in all our reading so we dont get killed by kos at higher levels
+]
+;B[mb];W[fg];B[gf];W[gh];B[hg];W[if];B[la];W[ia];B[fc];W[db]
+C[al2 [7k\]: do this reading at high level is in cache ?
+gunnar [?\]: Only one dragon now. That's good for speed.
+]
+;B[fb];W[ca];B[gb];W[hb];B[ha];W[ga];B[fa];W[ea];B[gd];W[jf];B[ha]
+;W[ib];B[lf];W[ga];B[mg];W[ke];B[ha];W[me];B[mf];W[kf];B[ji];W[jh]
+C[al2 [7k\]: whao 
+];B[ie];W[mc];B[];W[fh];B[];W[bf];B[];W[dd];B[]
+;W[cb];B[];W[bi];B[];W[bk];B[];W[bm];B[];W[dm];B[];W[jm];B[];W[]
+TB[mk][mm]TW[aa][ba][da][fa][ga][ha][ja][la][ma][ab][fb][gb][mb][ac]
+[cc][dc][fc][jc][ad][bd][fd][gd][hd][id][jd][kd][ld][ae][ce][ee][fe]
+[ge][he][ie][je][ef][ff][gf][ag][cg][gg][hg][jg][ah][ch][dh][hh][ih]
+[ai][di][ei][hi][ii][ji][aj][dj][ej][ij][jj][dk][ek][fk][al][cl][dl]
+[el][fl][hl][il][jl][em][fm][gm][hm][im]
+C[greymatter [24k?\]: well, congratulations
+burtabel [3d\]: thanks
+greymatter [24k?\]: till next time...
+]
+)
diff --git a/regression/games/kgs/tournament11/GNU-viking5-1.sgf b/regression/games/kgs/tournament11/GNU-viking5-1.sgf
new file mode 100644 (file)
index 0000000..0652f41
--- /dev/null
@@ -0,0 +1,75 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[GNU]WR[13k]
+PB[viking5]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-05]
+EV[Eleventh KGS Computer Go Tournament - Formal division]RE[W+Resign]
+TM[1080]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.8
+viking5 [?\]: GTP Engine for viking5 (black): Viking version 5.3.1
+]
+CA[UTF-8]RO[2]
+;B[kc];W[dj];B[ec];W[jf];B[ij]
+C[zapp [?\]: burtabel, viking does not use bensons it plays random games to the end
+]
+;W[kj];B[ck];W[ii]
+C[zapp [?\]: And if all random games wins it simply plays any move
+]
+;B[hf]C[burtabel [3d\]: ok i see
+];W[hj];B[dk]
+C[zapp [?\]: But in a close game losing those stones would be a disaster
+]
+;W[ej]C[zapp [?\]: And in 99% of the case it will play correctly
+]
+;B[ek];W[ik]
+C[zapp [?\]: I have actually never tested viking against gnugo on 13x13
+]
+;B[gg];W[eg];B[fk];W[bi];B[bj];W[ee];B[id];W[cj];B[bk];W[ch]
+C[zapp [?\]: Viking thinks it is slightly behind
+];B[je];W[kf];B[cd]
+;W[cf];B[le]C[gunnar [?\]: GNU thinks B+3.
+];W[lf]
+C[burtabel [3d\]: yes after W C8 Black should be leading
+];B[fd]
+;W[be];B[bc];W[gl];B[ig];W[jh]
+C[zapp [?\]: Viking has problems with monkey jumps
+burtabel [3d\]: gnugo too
+]
+;B[ff];W[ke];B[aj];W[ld];B[ef];W[lc]
+C[gunnar [?\]: GNU thinks it's ahead by five points now.
+];B[bg]
+C[zapp [?\]: Viking is also more pessimistic
+];W[ai];B[fj];W[jc]
+;B[eh]C[gunnar [?\]: GNU doesn't seem worried about the left side.
+zapp [?\]: Viking clearly wants to kill this large group
+]
+;W[ic];B[dg]C[burtabel [3d\]: well its dead now
+];W[gb]
+C[zapp [?\]: Not in computer go...
+];B[cg]
+C[gunnar [?\]: Somehow the owl reading found out correctly but didn't play to defend it anyway.
+burtabel [3d\]: maybe semeai overruled it?
+zapp [?\]: This is often what happens when viking beats gnu
+]
+;W[ie];B[fb]
+C[zapp [?\]: It desperately tries something and gnu stumbles on a bug 
+]
+;W[hd];B[gc]C[Gresil [16k\]: viking5 has superior luck code, eh
+]
+;W[hb]
+C[zapp [?\]: Good comment. Since it is based on playing random games to the end it actually measures luck all the time
+]
+;B[fl];W[fm]
+C[zapp [?\]: It plays the move that seems to possibly be the most lucky one
+]
+;B[gi];W[dm];B[gk];W[hl];B[hk];W[il];B[he];W[if];B[el];W[em];B[ga]
+;W[gd]
+C[zapp [?\]: A move ordering problem makes it not see the points in the lower left
+]
+;B[ha];W[ia];B[fa];W[bm];B[cl];W[cm];B[jg];W[kg];B[ih];W[hi];B[hh]
+;W[ji];B[bl];W[ge];B[fe];W[al];B[fh];W[jd];B[kl];W[gf];B[lk];W[hg]
+C[zapp [?\]: It now thinks it is losing
+];B[lj];W[li];B[ml];W[lm]
+;B[mj];W[km];B[gj];W[gh];B[hh];W[ih];B[fg];W[gh];B[jl];W[jm]
+C[burtabel [3d\]: hmm
+])
diff --git a/regression/games/kgs/tournament11/GNU-viking5-2.sgf b/regression/games/kgs/tournament11/GNU-viking5-2.sgf
new file mode 100644 (file)
index 0000000..9dfdeb7
--- /dev/null
@@ -0,0 +1,78 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[GNU]WR[13k]
+PB[viking5]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-05]
+EV[Eleventh KGS Computer Go Tournament - Formal division]RE[W+Resign]
+TM[1080]RU[Chinese]
+C[viking5 [?\]: GTP Engine for viking5 (black): Viking version 5.3.1
+GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.8
+]
+CA[UTF-8]RO[4]
+;B[ik];W[kj];B[id];W[ek];B[ed];W[ji];B[gk];W[ei];B[jg];W[hi];B[kl]
+;W[kd];B[je];W[ke];B[ef];W[dh];B[kf];W[lf];B[lg];W[le];B[hj];W[hh]
+C[zapp [?\]: Since Viking only searches 1 ply on 13x13 it appears to vervalue sente moves
+]
+;B[gg];W[cf];B[jc]
+C[burtabel [3d\]: well GNU Go only "searches" 1 ply too
+];W[kc]
+C[burtabel [3d\]: but has a lot of special code to guess the value of (reverse) sente moves
+zapp [?\]: On 9x9 however viking searches 2-4 ply depending on position and stage of the game
+]
+;B[kb];W[lb];B[jb];W[la];B[de];W[ij];B[gi];W[gh];B[fh];W[fi];B[ce]
+;W[bf];B[eg];W[gj];B[hk]C[zapp [?\]: Another bad sente move
+];W[ac]
+C[gunnar [?\]: GNU says B+6.
+];B[cc];W[hg]
+C[burtabel [3d\]: I think W is leading
+gunnar [?\]: Now B+0.10.
+]
+;B[fl];W[el]C[zapp [?\]: Viking thinks white is ahead
+];B[li];W[lj]
+;B[hf]C[gunnar [?\]: GNU agrees now. W+3.
+];W[fk];B[gm];W[jk]
+C[burtabel [3d\]: well of course W should have gotten F2
+];B[jl]
+;W[eh];B[lk];W[kk];B[mk];W[em];B[fg];W[mj];B[lm];W[kh];B[ih];W[kg]
+;B[jf];W[jh];B[ig];W[ii];B[dg];W[cg]
+C[zapp [?\]: Now viking is starting to get desperate
+gunnar [?\]: Viking blundered away some points and now the C7 cut aji is gone.
+]
+;B[bh];W[ch]C[zapp [?\]: Yes, it is to weak tactically in the endgame
+zapp [?\]: I need to use time more efficient
+burtabel [3d\]: before that GNU Go played some negative moves.. (K3, E6)
+]
+;B[be];W[ae];B[ck];W[bi];B[bj];W[ah];B[bl];W[ak]
+C[trogdor [-\]: zapp: tried splitting vikings simulations to several computers?
+]
+;B[aj];W[cl];B[bm];W[al];B[dl];W[dk]
+C[zapp [?\]: This is a thought that is in my mind
+];B[cm]
+C[zapp [?\]: But right now I only have my laptop
+];W[dm]
+C[burtabel [3d\]: easier thought than done..
+];B[jd]
+C[trogdor [-\]: well, for montecarlo it should be easy.
+];W[bb]
+C[zapp [?\]: But a multicore stationary PC is on the wishlist
+];B[cb]
+;W[ba];B[bd]
+C[zapp [?\]: Actually viking code might be unusually easy to parallelize
+]
+;W[ad];B[ml];W[ca];B[db];W[da]
+C[zapp [?\]: Ok, gnu is still the king :-)
+burtabel [3d\]: well Black had a chance in lower left
+burtabel [3d\]: d2 instead of b1 lives?
+gunnar [?\]: No.
+zapp [?\]: If C5 is sent?
+gunnar [?\]: It's not.
+burtabel [3d\]: how can White kill?
+burtabel [3d\]: after D2?
+gunnar [?\]: Down to C1.
+burtabel [3d\]: then Black B1 and A2
+zapp [?\]: I need to enter my bathtub quickly
+zapp [?\]: see you
+gunnar [?\]: Uh, yeah, I was thinking false eye when it wasn't.
+gunnar [?\]: So C2 should have been C1?
+]
+)
diff --git a/regression/games/kgs/tournament11/firstgo-GNU.sgf b/regression/games/kgs/tournament11/firstgo-GNU.sgf
new file mode 100644 (file)
index 0000000..24f15a2
--- /dev/null
@@ -0,0 +1,77 @@
+(;GM[1]FF[4]
+SZ[13]KM[7.50]
+PW[firstgo]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2006-02-05]
+EV[Eleventh KGS Computer Go Tournament - Formal division]RE[B+161.50]
+TM[1080]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.8
+firstgo [?\]: GTP Engine for firstgo (white): FirstGo version 1.112
+]
+CA[UTF-8]RO[6]
+;B[jd];W[ie];B[kf];W[ke];B[je];W[kd];B[jg];W[kc];B[if];W[he];B[gg]
+;W[gd]C[gunnar [?\]: Corners are out of vogue!
+];B[eg];W[ei];B[dj]
+;W[fj];B[hj];W[ji];B[dh];W[kj];B[gk];W[gj]
+C[gunnar [?\]: White has managed to split itself into four groups.
+]
+;B[ij];W[di];B[ci];W[dk];B[ck];W[bj];B[cj];W[bk]
+C[gunnar [?\]: So why don't start a fifth?
+];B[bi];W[cl];B[dl];W[ek]
+C[greymatter [24k?\]: Does gnu try to keep fewer groups?
+];B[bl]
+;W[gl];B[ik];W[ii]
+C[gunnar [?\]: Not really, although it has some bonuses to keep connected.
+gunnar [?\]: And some penalties for starting invasions.
+]
+;B[fk];W[el]
+C[greymatter [24k?\]: Ok, firstgo has a bad evaluation. Must get major changes
+]
+;B[ej];W[fh];B[kl];W[dm]
+C[greymatter [24k?\]: gnu is much stronger at this moment.
+];B[bm]
+;W[fl];B[hk]C[gunnar [?\]: Not playing great here though.
+];W[bh]
+C[greymatter [24k?\]: Does gnu use global lookahead?
+gunnar [?\]: No.
+greymatter [24k?\]: One of my problems is to combine the results of different searches. 
+]
+;B[ch];W[bg];B[cc]
+C[greymatter [24k?\]: With a global lookahead, this could be less of a problem?
+]
+;W[cf];B[jc];W[kb]C[gunnar [?\]: Maybe, but I'm doubtful.
+];B[cm]
+;W[al]C[gunnar [?\]: C1 dangerous.
+];B[dl]
+C[greymatter [24k?\]: Because of the increased search depth?
+];W[em]
+;B[cl];W[dc]
+C[elife [5d?\]: why L12 not at K12? I have observed many these kind of moves in gnugo's game
+]
+;B[db];W[ec];B[eb];W[fc]C[gunnar [?\]: Well L12 was firstgo's move.
+greymatter [24k?\]: Thats a move of firstgo...
+]
+;B[fb];W[kk]C[elife [5d?\]: oh :-)
+];B[ll];W[bc];B[cd]
+C[greymatter [24k?\]: K12 is better, firstgo is new program, should be better in the future :^)
+]
+;W[bd];B[id];W[bb];B[cb];W[ic];B[ib];W[hc];B[gb];W[jb];B[hb];W[ca]
+;B[df];W[hi];B[fg];W[gi];B[ce];W[ac];B[be];W[il];B[jl];W[jk];B[hl]
+;W[gf];B[fe];W[hd];B[jf];W[hf];B[hg];W[ih];B[fd];W[lk];B[lf];W[ml]
+;B[mc];W[le];B[me];W[mg];B[mf];W[ld];B[md];W[ig];B[kh];W[ki];B[lh]
+;W[jh];B[li];W[hm];B[im];W[lj];B[lm];W[mi];B[mh];W[bf];B[ff];W[gh]
+;B[mj];W[mk];B[eh];W[mi];B[mm];W[];B[ae];W[jj];B[gm];W[];B[ai];W[]
+;B[lb];W[];B[ka];W[];B[la];W[];B[kg];W[mj];B[hh];W[];B[da];W[];B[ba]
+;W[];B[dg];W[];B[lc];W[];B[ja];W[le];B[ld];W[];B[ke];W[];B[fi]
+C[greymatter [24k?\]: Why is gnu continuing, firstgo sees all of his stones dead
+]
+;W[ii];B[ih];W[lj];B[kj];W[];B[ia];W[];B[de];W[];B[]TB[aa][ca][ea]
+[fa][ga][ha][ma][ab][bb][jb][kb][mb][ac][bc][dc][ec][fc][gc][hc][ic]
+[kc][ad][bd][dd][ed][gd][hd][kd][ee][ge][he][ie][le][af][bf][cf][ef]
+[gf][hf][ag][bg][cg][ig][lg][mg][ah][bh][fh][gh][jh][di][ei][gi][hi]
+[ii][ji][ki][mi][aj][bj][fj][gj][jj][lj][mj][ak][bk][dk][ek][jk][kk]
+[lk][mk][al][el][fl][gl][il][ml][am][dm][em][fm][hm][jm][km]
+C[greymatter [24k?\]: congratulations
+greymatter [24k?\]: I have much to do, but I already knew that :-)
+]
+)
diff --git a/regression/games/kgs/tournament8/CrazyStone-GNU.sgf b/regression/games/kgs/tournament8/CrazyStone-GNU.sgf
new file mode 100644 (file)
index 0000000..f1eceae
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[CrazyStone]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[W+34.50]
+TM[780]RU[Chinese]
+C[CrazyStone [?\]: GTP Engine for CrazyStone (white): Crazy Stone - CMCSearchPlayer version 0002-14
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+RO[6]CA[UTF-8]ST[2]
+;B[ee];W[gc];B[cg];W[fb];B[db];W[gg];B[eg]
+C[gunnar [?\]: D8 not very good. Probably a capping pattern. :-/
+]
+;W[ec];B[bb]C[gunnar [?\]: Ouch.
+RemiCoulom [14k\]: B8 !
+gunnar [?\]: C6 was second choice.
+]
+;W[dd];B[bd];W[hd];B[fh]C[RemiCoulom [14k\]: ugly moves everywhere.
+]
+;W[cc];B[hh]C[gunnar [?\]: Indeed.
+];W[cb];B[ca];W[bc];B[ac];W[gh]
+;B[gi];W[ab];B[aa];W[bh];B[cd];W[dc];B[gf];W[hg]
+C[gunnar [?\]: What's wrong with black D5 now?
+];B[hf];W[ih];B[hi]
+;W[cf];B[ce];W[bf];B[de];W[fi];B[ei];W[ae];B[ad];W[ch];B[dh];W[bg]
+;B[be];W[df];B[dg];W[ef];B[fe]C[ExBoss: dangerous for B
+];W[ff];B[fg]
+;W[ge];B[fd]C[ExBoss: ko
+];W[ed];B[he];W[gd];B[ig]C[ExBoss: blunder
+]
+;W[fc];B[ci]C[gunnar [?\]: Gah.
+];W[af];B[bi];W[id];B[ah];W[ab];B[ai]
+;W[ie];B[if];W[ag];B[di];W[ga];B[gg];W[fe];B[];W[ha];B[]
+C[maproom [7k?\]: remarkable
+];W[fa];B[];W[]TB[hg][eh][gh][ih][fi]
+[ii]TW[aa][ba][ca][da][ea][ia][bb][db][eb][gb][hb][ib][ac][hc][ic]
+[ad][bd][cd][fd][be][ce][de][ee]C[fboissac [11k\]: Bravo remi
+RemiCoulom [14k\]: merci
+RemiCoulom [14k\]: what was black's blunder ?
+fboissac [11k\]: crazy a un bon module de vie et mort
+RemiCoulom [14k\]: F6 ?
+ExBoss: H5 was gote
+RemiCoulom [14k\]: what else could black play ?
+RemiCoulom [14k\]: A4 ?
+ExBoss: A4 right away
+RemiCoulom [14k\]: OK, thanks
+]
+)
diff --git a/regression/games/kgs/tournament8/GNU-AyaBot.sgf b/regression/games/kgs/tournament8/GNU-AyaBot.sgf
new file mode 100644 (file)
index 0000000..c12a196
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[GNU]WR[13k]
+PB[AyaBot]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[W+0.50]
+TM[780]RU[Chinese]
+C[AyaBot [?\]: GTP Engine for AyaBot (black): Aya version 5.61
+GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+]
+RO[1]CA[UTF-8]ST[2]
+;B[fd];W[cg];B[gf];W[cd];B[df];W[dg];B[cf];W[ef];B[bg];W[ec];B[eg]
+;W[eh];B[fg];W[bh];B[ed];W[dd];B[be];W[fc];B[gc];W[gb];B[ah];W[gd]
+;B[fe];W[hc];B[fh];W[bd];B[he];W[ae];B[bf];W[hd]
+C[impulse [7k\]: was f2 necessary?
+];B[de];W[ge];B[ie]
+C[gunnar [?\]: No.
+];W[id];B[hf];W[af];B[ag];W[ad];B[ce];W[fb];B[dh]
+;W[dc];B[ch];W[hb];B[ci];W[cb];B[ei];W[db]C[gunnar [?\]: Very close.
+]
+;B[bi];W[bc];B[];W[]TB[ee][ef][ff][if][cg][dg][gg][hg][ig][bh][eh]
+[gh][hh][ih][ai][di][fi][gi][hi][ii]TW[aa][ba][ca][da][ea][fa][ga]
+[ha][ia][ab][bb][eb][ib][ac][cc][gc][ic]C[maproom [7k?\]: good game
+]
+)
diff --git a/regression/games/kgs/tournament8/GNU-Dar51.sgf b/regression/games/kgs/tournament8/GNU-Dar51.sgf
new file mode 100644 (file)
index 0000000..7443abd
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[GNU]WR[13k]
+PB[Dar51]BR[17k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[B+13.50]
+TM[780]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+Dar51 [17k\]: GTP Engine for Dar51 (black): Dariush version 3.1.5.6.5, level 7
+]
+RO[4]CA[UTF-8]ST[2]
+;B[ee];W[cg];B[cf];W[dg];B[fg];W[bf];B[fd];W[dc];B[cd];W[cc];B[bc]
+;W[bb];B[be];W[ac];B[bd];W[fb];B[eh];W[gc];B[gd];W[hc]
+C[gunnar [?\]: GNU playing very badly this game.
+];B[hd];W[id];B[ie]
+;W[ic];B[he];W[ab];B[df];W[ec];B[ef];W[ad];B[bg];W[ae];B[af];W[dd]
+;B[fc];W[de];B[ce];W[ca];B[ed];W[eb];B[];W[gb];B[];W[cb];B[];W[ha]
+;B[];W[hb];B[];W[]TB[fe][ge][bf][ff][gf][hf][if][ag][cg][dg][eg][gg]
+[hg][ig][ah][bh][ch][dh][fh][gh][hh][ih][ai][bi][ci][di][ei][fi][gi]
+[hi][ii]TW[aa][ba][da][ea][fa][ga][ia][db][ib])
diff --git a/regression/games/kgs/tournament8/GNU-ExBot.sgf b/regression/games/kgs/tournament8/GNU-ExBot.sgf
new file mode 100644 (file)
index 0000000..78f472e
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[GNU]WR[13k]
+PB[ExBot]BR[17k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[W+30.50]
+TM[780]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+ExBot [17k\]: GTP Engine for ExBot (black): Explorer version 6.6.x Nov 4 2005 13:33:59
+]
+RO[3]CA[UTF-8]ST[2]
+;B[eg];W[ee];B[gf];W[ge];B[hf];W[dd];B[cf];W[he];B[bd];W[ff];B[fg]
+;W[cc];B[ie];W[id];B[if];W[hc];B[gh];W[bc];B[cd];W[ad];B[ef];W[ae]
+;B[bf];W[af];B[fe]C[gunnar [?\]: Blitz tournament? :-)
+];W[fd];B[ff]
+;W[bg];B[ch];W[ce];B[be];W[cg]C[ExBoss: yeah
+];B[dh];W[df]
+C[ExBoss: oucch
+];B[bh];W[ah];B[bi];W[ag];B[dg];W[ai];B[];W[ed];B[]
+;W[hd];B[];W[cf]C[ExBoss: g6 works
+];B[];W[gb];B[];W[hb];B[];W[cd]
+;B[];W[gd];B[];W[]TB[gg][hg][ig][eh][fh][hh][ih][ci][di][ei][fi][gi]
+[hi][ii]TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ab][bb][cb][db][eb]
+[fb][ib][ac][dc][ec][fc][gc][ic][bd][be][de][bf]
+C[gunnar [?\]: This was really fast.
+ExBoss: too fast :(
+gunnar [?\]: I don't see how G6 would work.
+]
+)
diff --git a/regression/games/kgs/tournament8/firstgo-GNU.sgf b/regression/games/kgs/tournament8/firstgo-GNU.sgf
new file mode 100644 (file)
index 0000000..1d54a3c
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[firstgo]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[B+73.50]
+TM[780]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+firstgo [?\]: GTP Engine for firstgo (white): FirstGo version 1.052
+]
+RO[8]CA[UTF-8]ST[2]
+;B[fd];W[gg];B[eg];W[ff];B[de];W[fe];B[eh];W[fc];B[ed];W[dd];B[ge]
+;W[gc];B[gd];W[dc];B[ec];W[df];B[cf];W[ce];B[eb];W[ee];B[hc];W[hb]
+;B[he];W[ic];B[hd];W[id];B[ch];W[dg];B[cg];W[hh];B[ba];W[bg];B[bf]
+;W[cb];B[ca];W[ga];B[ie];W[dh];B[di];W[be];B[bh];W[af];B[ag];W[ea]
+;B[db];W[cd];B[fb];W[fa];B[bb];W[cc];B[fh];W[da];B[gb];W[ae];B[gh]
+;W[hf];B[gf];W[fg];B[ig];W[hg];B[if];W[gi];B[bc];W[ef];B[ei];W[]
+;B[ad];W[ci];B[bi];W[hi];B[bd];W[ab];B[de];W[af];B[ae];W[dc];B[dd]
+;W[ih];B[ci];W[];B[ha];W[ea];B[fa];W[];B[]TB[aa][da][ea][ga][ia][ab]
+[cb][hb][ib][ac][cc][dc][fc][gc][ic][cd][id][be][ce][ee][fe][af][df]
+[ef][ff][hf][bg][dg][fg][gg][hg][ah][dh][hh][ih][ai][fi][gi][hi][ii])
diff --git a/regression/games/kgs/tournament8/indigoBot-GNU.sgf b/regression/games/kgs/tournament8/indigoBot-GNU.sgf
new file mode 100644 (file)
index 0000000..58e8485
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[indigoBot]WR[18k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[B+7.50]
+TM[780]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+indigoBot [18k\]: GTP Engine for indigoBot (white): Indigo2005.9x9 version 3/11/2005
+]
+RO[5]CA[UTF-8]ST[2]
+;B[fe];W[de];B[ed];W[dc];B[dd];W[cd];B[ec];W[ef];B[gg];W[hh];B[hg]
+C[gunnar [?\]: H2 surprise move.
+papateux [7k?\]: yes
+];W[gh];B[fh]
+;W[fg]C[gunnar [?\]: Black F3 better than F2.
+];B[eh];W[gf];B[hf]
+;W[ge];B[he];W[gd];B[ff]C[gunnar [?\]: This is getting wild.
+];W[eg]
+C[MatroidX [9k?\]: yes, but kind of fun :)
+];B[dg];W[ee];B[ce];W[fd]
+;B[cc]C[gunnar [?\]: What a weird game.
+];W[cf];B[bd];W[cg];B[ih]
+;W[fc];B[ch];W[eb];B[db];W[be];B[cd];W[bh];B[ib];W[fb];B[bf];W[bg]
+;B[ae];W[hd];B[id];W[hc];B[ic];W[hb];B[ie];W[bi];B[ea];W[bb];B[cb]
+;W[fa];B[da];W[ba];B[bc];W[ha];B[gi];W[ci];B[dh];W[df];B[ag];W[di]
+;B[ah];W[ei];B[hi];W[ia];B[fi];W[ai];B[af];W[];B[ab];W[];B[ac];W[]
+;B[gh];W[];B[]TB[aa][ba][ca][bb][dc][ad][be][if][ig][hh][ii]TW[ga]
+[gb][gc][fe][ff])
diff --git a/regression/games/kgs/tournament8/tlsBot-GNU.sgf b/regression/games/kgs/tournament8/tlsBot-GNU.sgf
new file mode 100644 (file)
index 0000000..55dbd5d
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[tlsBot]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[B+19.50]
+TM[780]RU[Chinese]
+C[tlsBot [?\]: GTP Engine for tlsBot (white): tlsBot version Bookish2CSM-13064473 ; ........... I sometimes have some problems knowing when to pass. If you feel I should pass, and I keep on playing, check to see if you have any groups that have 2 liberties. Defending them should help.
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+RO[7]CA[UTF-8]ST[2]
+;B[fe];W[de];B[dd];W[ed];B[ee];W[fd];B[dc];W[cd];B[gd];W[ge];B[fc]
+;W[ff];B[ec];W[ef];B[ce];W[df];B[be];W[hf];B[cg];W[dg];B[ch];W[dh]
+;B[di];W[ei];B[ci];W[eh];B[hd];W[cf];B[bf];W[bd];B[cc];W[bg];B[bh]
+;W[ag];B[ah];W[he];B[ie];W[if];B[id];W[bc];B[bb];W[ae];B[af];W[fb]
+;B[gb];W[fg];B[eb];W[ih];B[ad];W[ib];B[hb];W[ig];B[fd];W[];B[cb];W[]
+;B[hc];W[hh];B[fa];W[hg];B[ac];W[gg];B[ea];W[];B[ab];W[];B[]TB[aa]
+[ba][ca][da][ga][ha][ia][db][fb][ib][bc][gc][ic][bd][cd][ed][ae][ag]
+[bg][ai][bi]TW[gf][eg][fh][gh][fi][gi][hi][ii])
diff --git a/regression/games/kgs/tournament8/viking5-GNU.sgf b/regression/games/kgs/tournament8/viking5-GNU.sgf
new file mode 100644 (file)
index 0000000..56d8058
--- /dev/null
@@ -0,0 +1,78 @@
+(;GM[1]FF[4]
+SZ[9]KM[7.50]
+PW[viking5]PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-11-06]AP[CGoban:2]
+EV[Eighth KGS Computer Go Tournament - Formal division]RE[B+Resign]
+TM[780]RU[Chinese]
+C[zapp [?\]: This will be interesting
+viking5 [?\]: GTP Engine for viking5 (white): Viking version 5.2.2
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+RO[2]CA[UTF-8]ST[2]
+;B[ee];W[ce];B[cd];W[gc];B[de]
+C[gunnar [?\]: Did Viking play second move from opening book?
+];W[eg]
+;B[cf];W[gh]C[zapp [?\]: I did not see it play it
+];B[ec]
+C[gunnar [?\]: (It was very fast.)
+gunnar [?\]: G2 looks a bit low.
+zapp [?\]: Then it was
+]
+;W[fb];B[eb]C[gunnar [?\]: GNU thinks W+6.
+gunnar [?\]: G5 was third move.
+]
+;W[gf];B[dg]C[zapp [?\]: Viking thinks it is 50+50
+gunnar [?\]: W+10 now.
+gunnar [?\]: GNU very pessimistic.
+]
+;W[dh];B[ch]C[zapp [?\]: Should be with big komi
+zapp [?\]: Viking tends to always beat gnu in a game like this
+gunnar [?\]: W+12. It gets worse with every move.
+]
+;W[cg];B[bg]C[gunnar [?\]: C3?
+zapp [?\]: Can be a symptom that Viking is behind
+Dssq [9k?\]: C3 = 9P move
+]
+;W[ei];B[ge]C[gunnar [?\]: Finally G5.
+gunnar [?\]: W+4 now.
+];W[fe]
+;B[fd]C[zapp [?\]: Viking was thinking of H5
+zapp [?\]: but ran out of time
+gunnar [?\]: Ah, F5 didn't look very good.
+]
+;W[ff];B[gd]C[zapp [?\]: I am playing on my laptop today
+zapp [?\]: Last time I had my father 3Ghz machine
+gunnar [?\]: What speed?
+zapp [?\]: 1.7
+]
+;W[hd];B[hb]
+C[zapp [?\]: And that tournament I think the time per game was longer
+]
+;W[hc];B[he]
+C[gunnar [?\]: GNU is playing on a 1.6 GHz Athlon (marketing name XP1900+)
+]
+;W[ea];B[fc]
+C[zapp [?\]: Does it play much stronger using more time on 9x9
+]
+;W[gb]C[gunnar [?\]: Doubtful.
+];B[id]
+C[gunnar [?\]: GNU thinks the corner will die.
+zapp [?\]: For Viking every second makes a difference
+]
+;W[ic];B[ha]C[zapp [?\]: Viking agrees with that
+];W[cb];B[da];W[fa]
+C[zapp [?\]: At 3 minutes per move Viking is pretty good
+];B[db]
+;W[ie];B[hf];W[if];B[hg];W[ig];B[hh]C[zapp [?\]: Good game for gnu
+gunnar [?\]: Looks like white collapsed.
+gunnar [?\]: G2 was a gift.
+zapp [?\]: As a said: at C3 viking probably felt it was behind
+gunnar [?\]: Interesting that they both thought so. :-)
+zapp [?\]: I should have implemented an idea to spend twice the time on first move out of book
+zapp [?\]: I am rerunning Viking for position it played G2
+gunnar [?\]: What is the right move?
+zapp [?\]: 1ply G3 2ply G3 3ply G4
+zapp [?\]: Which means it played G2 because of the random nature of monte carlo eval
+]
+)
diff --git a/regression/games/kgs/tournament9/Dar51-GNU.sgf b/regression/games/kgs/tournament9/Dar51-GNU.sgf
new file mode 100644 (file)
index 0000000..53a3885
--- /dev/null
@@ -0,0 +1,56 @@
+(;GM[1]FF[4]
+SZ[19]KM[7.50]
+PW[Dar51]WR[16k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-12-04]AP[CGoban:2]
+EV[Ninth KGS Computer Go Tournament - Formal division]RE[B+77.50]
+TM[3480]RU[Chinese]
+C[Dar51 [16k\]: GTP Engine for Dar51 (white): Dariush version 3.1.5.8, level 7
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+CA[UTF-8]RO[4]ST[2]
+;B[pd];W[dd];B[pp];W[dp];B[fc];W[fe];B[hd];W[dj];B[fp];W[kp];B[cn]
+;W[jf];B[dg];W[dl];B[en];W[eq];B[fq];W[eo];B[fo];W[dn];B[ep];W[do]
+;B[dq];W[cq];B[er];W[cr];B[mq];W[kn];B[em];W[dm];B[kc];W[pg];B[nd]
+;W[ng];B[qi];W[pm];B[iq];W[qq];B[qp];W[pq];B[oq];W[or]
+C[gunnar [?\]: GNU thinks it's close, B+0.38.
+];B[nr];W[op];B[nq]
+;W[no]
+C[gunnar [?\]: I though white was also playing out of joseki library, maybe not...
+]
+;B[rq];W[oo];B[qe];W[pn];B[qg];W[gf];B[ci];W[cj];B[di];W[fh];B[bj]
+;W[bk];B[ei];W[bi];B[bh];W[aj];B[fk];W[qk];B[oi];W[ej];B[fj];W[fi]
+;B[ce];W[bg];B[ah];W[rr];B[rp];W[lp];B[cd];W[qr];B[sr];W[rj];B[dc]
+;W[ed];B[ij];W[ie]
+C[gunnar [?\]: GNU may well misread the semeai in the lower right.
+]
+;B[ec];W[he];B[rn];W[ok];B[mi];W[lg];B[ph];W[sg];B[gm];W[rd];B[re]
+;W[se];B[qc];W[rc];B[qb];W[rb];B[ra];W[gd];B[gc];W[ic];B[id];W[jd]
+;B[hc];W[jc];B[ld];W[kb];B[lb];W[ja];B[ke];W[kd];B[lc];W[ha];B[mf]
+;W[je];B[mg];W[mh];B[lh];W[kg];B[nh];W[fa];B[eb];W[bc];B[bb];W[fd]
+;B[kr];W[le];B[me];W[lf];B[lk];W[rl];B[hi];W[ip];B[jq];W[jl];B[il]
+;W[jo];B[nk];W[nl];B[ml];W[nj];B[mk];W[oj];B[jk];W[mm];B[lm];W[mn]
+;B[dr];W[jm];B[sf];W[rf];B[rg];W[rh];B[qf];W[sf];B[cs];W[cb];B[cc]
+;W[ab];B[ba];W[ca];B[bd];W[aa];B[da];W[bs];B[ds];W[ar];B[ri];W[si]
+;B[hb];W[ib];B[jh];W[gp];B[hq];W[hn];B[gn];W[eh];B[cg];W[hp];B[ea]
+;W[kl];B[ll];W[ih];B[hh];W[kh];B[ig];W[ji];B[ii];W[ki];B[li];W[kk]
+;B[hm];W[in];B[eg];W[gg];B[pj];W[kj];B[pk];W[pl];B[rm];W[gi];B[gj]
+;W[el];B[fl];W[qo];B[ro];W[ga];B[qj];W[lj];B[mj];W[gq];B[gr];W[ef]
+;B[sl];W[sk];B[sm];W[qm];B[sd];W[sh];B[qd];W[sc];B[sb];W[sa];B[qa]
+;W[dh];B[ch];W[fg];B[sb];W[qh];B[pi];W[sa];B[ai];W[df];B[cf];W[bj]
+;B[jg];W[lq];B[lr];W[la];B[ma];W[ka];B[jj];W[mb];B[na];W[nb];B[oa]
+;W[ln];B[sb];W[sj];B[sd];W[go];B[ek];W[dk];B[mp];W[mo];B[hg];W[ob]
+;B[pa];W[de];B[ni];W[ol];B[po];W[qn];B[im];W[hf];B[jp];W[km];B[kq]
+;W[nc];B[md];W[np];B[rk];W[ql];B[if];W[ns];B[mr];W[ap];B[gh];W[fb]
+;B[ad];W[bm];B[gb];W[ia];B[rs];W[];B[sq];W[];B[og];W[];B[qs];W[]
+;B[pr];W[];B[os];W[];B[od];W[];B[of];W[];B[nf];W[];B[se];W[];B[rj]
+;W[];B[sk];W[];B[pq];W[];B[ms];W[];B[hr];W[];B[fr];W[];B[fn];W[]
+;B[gl];W[];B[hj];W[];B[db];W[];B[ac];W[];B[bb];W[];B[ba];W[];B[]
+TB[aa][ca][sa][ab][cb][mb][nb][ob][pb][rb][bc][mc][nc][oc][pc][rc]
+[sc][rd][ae][be][ne][oe][pe][af][bf][pf][rf][sf][ag][bg][ng][pg][sg]
+[ih][mh][oh][qh][rh][sh][si][sj][gk][hk][ik][hl][fm][sn][so][sp][eq]
+[qq][ir][jr][or][qr][rr][es][fs][gs][hs][is][js][ks][ls][ns][ps][ss]
+TW[jb][ee][ge][ke][ff][kf][ak][ck][al][bl][cl][am][cm][nm][om][an]
+[bn][cn][jn][nn][on][ao][bo][co][ho][io][ko][lo][bp][cp][aq][bq][br]
+[as])
diff --git a/regression/games/kgs/tournament9/GNU-AyaBot.sgf b/regression/games/kgs/tournament9/GNU-AyaBot.sgf
new file mode 100644 (file)
index 0000000..abfd054
--- /dev/null
@@ -0,0 +1,56 @@
+(;GM[1]FF[4]
+SZ[19]KM[7.50]
+PW[GNU]WR[13k]
+PB[AyaBot]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-12-04]AP[CGoban:2]
+EV[Ninth KGS Computer Go Tournament - Formal division]RE[W+212.50]
+TM[3480]RU[Chinese]
+C[GNU [13k\]: GTP Engine for GNU (white): GNU Go version 3.7.7
+AyaBot [?\]: GTP Engine for AyaBot (black): Aya version 5.61
+]
+CA[UTF-8]RO[2]ST[2]
+;B[pd];W[dp];B[dc];W[de];B[qq];W[cc];B[fp];W[db];B[ec];W[dn];B[cd]
+;W[bc];B[bd];W[dd];B[ad];W[ce];B[bb];W[cb];B[bf];W[cg]
+C[gunnar [?\]: Interesting nonjoseki.
+];B[ac];W[eb];B[bh];W[fc];B[hd]
+;W[eq];B[fq];W[hq];B[qn];W[go];B[jp];W[fo];B[hp];W[gp];B[no];W[nc]
+;B[pb];W[qf];B[pi];W[of];B[nb];W[ri];B[pk];W[mb];B[oc];W[na];B[pg]
+;W[pf];B[re];W[rf];B[ld];W[ob];B[gc];W[nd];B[md];W[rc];B[rd];W[qc]
+;B[qd];W[pc];B[ne];W[oe];B[lf];W[dh];B[ci];W[bg];B[be];W[af];B[fd]
+;W[ed];B[ir];W[dl];B[ck];W[iq];B[jq];W[hr];B[kr];W[cl];B[dj];W[in]
+;B[kn];W[jl];B[ll];W[kj];B[fb];W[kc];B[jd];W[kh];B[ng];W[og];B[oh]
+;W[nh];B[qh];W[rh];B[lc];W[kb];B[kd];W[mh];B[lg];W[nk];B[mj];W[lh]
+;B[jg];W[mk];B[lk];W[lj]
+C[maproom [7k\]: I have seen Aya play better than this
+];B[kk];W[jk]
+;B[ni];W[oj];B[pj];W[oi];B[ok];W[ph];B[lb];W[la];B[ib];W[oh];B[gk]
+;W[nl];B[ff];W[qk];B[pl];W[lm];B[km];W[kl];B[ln];W[mm];B[hs];W[gs]
+;B[is];W[ql];B[pm];W[fe];B[fh];W[gd];B[gr];W[he];B[hf];W[ie];B[id]
+;W[gq]C[Ambivlnce [14k\]: I think this is a surrogate Aya.
+];B[fs]
+;W[fj];B[gf];W[bj];B[ej];W[fi];B[ei];W[eh];B[eg];W[gh];B[hi];W[bk]
+;B[fg];W[hh];B[ih];W[gi];B[fk];W[hj];B[dg];W[ch];B[cf];W[bi];B[di]
+;W[ag];B[df];W[ge];B[ii];W[dk];B[ga];W[dr];B[je];W[if];B[ig];W[ea]
+;B[qj];W[ek];B[gg];W[rj];B[ij];W[hk];B[ik];W[hl];B[qi];W[nf];B[hb]
+;W[on];B[om];W[nn];B[pp];W[mo];B[mn];W[nm];B[oo];W[pn];B[qm];W[rl]
+;B[rm];W[sl];B[sn];W[er];B[fr];W[ip];B[hg];W[cj];B[me];W[jo];B[ko]
+;W[qg];B[mg];W[qo];B[ro];W[po];B[qp];W[fa];B[ja];W[gb];B[hc];W[ka]
+;B[fb];W[ia];B[sc];W[jb];B[mq];W[ba];B[jc];W[kf];B[kg];W[jf];B[rb]
+;W[od];B[mf];W[ke];B[sm];W[ep];B[jm];W[il];B[jn];W[io];B[op];W[im]
+;B[kp];W[es];B[gs];W[ol];B[qb];W[oc];B[ab];W[ma];B[ha];W[ji];B[aa]
+;W[ca];B[gb];W[ja];B[qe];W[pa];B[sb];W[qa];B[mc];W[jj];B[gm];W[fm]
+;B[];W[ec];B[];W[ee];B[];W[le];B[];W[ef];B[];W[ra];B[];W[gl];B[]
+;W[do];B[];W[fl];B[];W[li];B[];W[gj];B[];W[ml];B[];W[ho]
+C[Hu [11k\]: Music
+];B[];W[oa];B[];W[nj];B[];W[ei];B[];W[ah];B[]
+;W[ai];B[];W[dj];B[];W[dm];B[];W[rg];B[];W[rk];B[];W[]TB[rn][lo][mo]
+[so][lp][mp][np][rp][sp][kq][lq][nq][oq][pq][rq][sq][jr][lr][mr][nr]
+[or][pr][qr][rr][sr][js][ks][ls][ms][ns][os][ps][qs][rs][ss]TW[aa]
+[da][ga][ha][sa][ab][bb][fb][gb][hb][ib][lb][nb][pb][qb][rb][sb][ac]
+[dc][gc][hc][ic][jc][lc][mc][sc][ad][bd][cd][fd][hd][id][jd][kd][ld]
+[md][pd][qd][rd][sd][ae][be][je][me][ne][pe][qe][re][se][bf][cf][df]
+[ff][gf][hf][lf][mf][sf][dg][eg][fg][gg][hg][ig][jg][kg][lg][mg][ng]
+[pg][sg][bh][fh][ih][jh][sh][ci][di][hi][ii][ki][mi][ni][si][aj][ej]
+[ij][mj][sj][ak][ck][fk][gk][ik][kk][lk][sk][al][bl][el][ll][am][bm]
+[cm][em][gm][hm][an][bn][cn][en][fn][gn][hn][ao][bo][co][eo][ap][bp]
+[cp][hp][aq][bq][cq][dq][ar][br][cr][as][bs][cs][ds])
diff --git a/regression/games/kgs/tournament9/gopp-GNU.sgf b/regression/games/kgs/tournament9/gopp-GNU.sgf
new file mode 100644 (file)
index 0000000..57b0f19
--- /dev/null
@@ -0,0 +1,79 @@
+(;GM[1]FF[4]
+SZ[19]KM[7.50]
+PW[gopp]WR[12k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-12-04]AP[CGoban:2]
+EV[Ninth KGS Computer Go Tournament - Formal division]RE[W+4.50]
+TM[3480]RU[Chinese]
+C[gopp [12k\]: GTP Engine for gopp (white): Go++ version 5 (experimental version)
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+CA[UTF-8]RO[3]ST[2]
+;B[pd];W[dq];B[pp];W[dd];B[co];W[dl];B[eo];W[fp];B[fo];W[gp];B[dj]
+;W[cg];B[fc];W[nq];B[pn];W[pr];B[lq];W[qq];B[oq];W[or];B[np];W[ro]
+;B[nr];W[nc];B[iq];W[cp];B[lc];W[qc];B[pc];W[qd];B[pe];W[pb];B[ob]
+;W[qb];B[oc];W[qf];B[nd];W[qm];B[ic];W[eb];B[ek];W[bo];B[oh];W[cn]
+;B[qh];W[qj];B[qe];W[re];B[fb];W[ec];B[nk];W[ho];B[gr];W[fr];B[gf]
+;W[kj];B[kh];W[el];B[fm];W[hj];B[fl];W[cj];B[ci];W[jo];B[mq];W[jl]
+;B[do];W[gk];B[ck];W[cl];B[bj];W[fk]C[tesuji [-\]: ?
+tesuji [-\]: =(
+]
+;B[bl];W[hr]C[medical [9k?\]: hee =) gnu messed up
+tesuji [-\]: both did now
+]
+;B[cm]C[tesuji [-\]: b7
+tesuji [-\]: or that
+];W[bn]
+C[medical [9k?\]: hoh, yead
+medical [9k?\]: d
+medical [9k?\]: damn. h =)
+]
+;B[dm]C[tesuji [-\]: oh well, mistakes cancel ;)
+];W[pg];B[ph];W[og]
+;B[ir];W[lo];B[hq];W[ng];B[mi];W[mf];B[lk];W[fa];B[ga];W[ea];B[mn]
+;W[fd];B[gc];W[le];B[bh];W[bg];B[eg];W[gd];B[hc];W[pm];B[df];W[cd]
+;B[ei];W[qn];B[ag];W[be];B[fs];W[er];B[ri];W[rj];B[hm];W[km];B[af]
+;W[oj];B[nh];W[on];B[ml];W[ji];B[po];W[nm];B[mm];W[jh];B[mg];W[ne]
+;B[md];W[mo];B[lg];W[ke];B[no];W[nn];B[rg];W[rf];B[lj];W[dn];B[em]
+;W[kc];B[kb];W[jc];B[jb];W[dh];B[fi];W[si];B[sh];W[sj];B[nj];W[oi]
+;B[lh];W[ki];B[jg];W[ig];B[jf];W[kf];B[kg]
+C[Zark [5k\]: m12 was odd :)
+];W[je];B[if];W[eh];B[ie];W[hg];B[fh]
+;W[dg];B[ee];W[fe];B[ff];W[ed];B[ol];W[om];B[pl];W[gi];B[qi];W[ok]
+;B[nl];W[es];B[pj];W[ql];B[pk];W[qk];B[gs];W[am]
+C[troll [2k\]: 9p sente =)
+];B[gq];W[al];B[ak];W[bm];B[bk];W[gh]
+;B[kp];W[ko];B[jp];W[im];B[hl];W[il];B[hk];W[ik];B[fj];W[gj];B[hn]
+;W[en];B[go];W[fn];B[hp];W[io];B[gn];W[gl];B[gm]C[wwwzza [1d\]: uuh
+]
+;W[in];B[fq];W[ep];B[dk];W[bq];B[eq];W[dr];B[dp];W[ns];B[ms]
+C[troll [2k\]: now close
+];W[os];B[pq];W[qr];B[bf]
+C[wwwzza [1d\]: seems b is gaining in endgame :)
+];W[cf];B[me]
+C[Uriel [-\]: d2 oh man :)
+];W[lf];B[ld];W[nf];B[ae];W[ad];B[ah]
+;W[bc];B[pa];W[qa];B[oa];W[rd];B[qp]
+C[troll [2k\]: gnu endgame is strong
+];W[rp];B[oo];W[qg];B[kk];W[jk]
+;B[ln]C[wwwzza [1d\]: id rather say w is playing to submissive now :)
+]
+;W[kn];B[di];W[de];B[ef];W[oe];B[od];W[pf];B[sf];W[se];B[hf];W[lr]
+;B[mr];W[sg];B[rh];W[sf];B[gg];W[qo];B[kd];W[jd];B[li];W[ha];B[gb]
+;W[hd];B[id];W[ge];B[ch];W[ce];B[lp];W[kl];B[mp];W[ll];B[lm];W[ip]
+;B[hh];W[ih];B[he];W[];B[dl];W[];B[fp]C[wwwzza [1d\]: oh
+];W[];B[ib]
+C[wwwzza [1d\]: chinese rules
+];W[];B[lb]
+C[troll [2k\]: J10 first maybe
+];W[];B[]TB[ha][ia][ja][ka][la][ma]
+[na][hb][mb][nb][mc][nc][fg][mh][ai][bi][ni][oi][pi][aj][cj][ej][mj]
+[oj][mk][ok][cl][el][ep][gp][op][jq][kq][nq][hr][jr][kr][lr][hs][is]
+[js][ks][ls]TW[aa][ba][ca][da][ra][sa][ab][bb][cb][db][rb][sb][ac]
+[cc][dc][rc][sc][bd][sd][of][hh][hi][ii][ij][jj][rk][sk][rl][sl][jm]
+[rm][sm][an][jn][rn][sn][ao][so][ap][bp][sp][aq][cq][rq][sq][ar][br]
+[cr][rr][sr][as][bs][cs][ds][ps][qs][rs][ss]C[Uriel [-\]: ugh.
+troll [2k\]: w 4 corners
+]
+)
diff --git a/regression/games/kgs/tournament9/indigoBot-GNU.sgf b/regression/games/kgs/tournament9/indigoBot-GNU.sgf
new file mode 100644 (file)
index 0000000..0418fce
--- /dev/null
@@ -0,0 +1,238 @@
+(;GM[1]FF[4]
+SZ[19]KM[7.50]
+PW[indigoBot]WR[17k]
+PB[GNU]BR[13k]
+PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]
+DT[2005-12-04]AP[CGoban:2]
+EV[Ninth KGS Computer Go Tournament - Formal division]RE[B+209.50]
+TM[3480]RU[Chinese]
+C[indigoBot [17k\]: GTP Engine for indigoBot (white): Indigo2005 version 2/12/2005
+GNU [13k\]: GTP Engine for GNU (black): GNU Go version 3.7.7
+]
+CA[UTF-8]RO[1]ST[2]
+;B[qc];W[dd];B[qp];W[dq];B[oq];W[qj];B[do];W[co];B[dp];W[dn];B[cp]
+;W[eq];B[cn];W[bo];B[cm];W[en];B[cq];W[bn];B[ck];W[qg];B[fc];W[eo]
+;B[bm];W[kc];B[ep];W[fp];B[dr];W[jq]C[jasonlai [5k\]: lol
+];B[ic]
+;W[db];B[mc];W[fq];B[ld];W[kd];B[ie];W[ke];B[cf]
+C[jasonlai [5k\]: hows the compter think
+jasonlai [5k\]: ?.?
+];W[mf]
+;B[ee];W[bp];B[cr];W[bq];B[br];W[be];B[ql]
+C[kalim [12k\]: wow, this is like watching 20k's play
+];W[mq];B[fl]
+C[jasonlai [5k\]: 20 k ?.?
+];W[jf];B[oc];W[de];B[ff]
+C[jasonlai [5k\]: @@
+];W[df];B[gs]C[jasonlai [5k\]: lol
+jasonlai [5k\]: yose time lol
+]
+;W[dg];B[ol];W[er]
+C[olczyk [15k\]: I don't know it takes Whites eye shape.
+];B[ar]
+;W[el];B[fk];W[ek];B[fm];W[ej];B[gi];W[if];B[he]
+C[kalim [12k\]: i guess white bots thinks left side is his
+];W[ci]
+;B[mo]C[jasonlai [5k\]: his?
+kalim [12k\]: is its
+];W[bj]
+C[jasonlai [5k\]: @.@"
+];B[im];W[gg];B[em];W[dm];B[fo]
+C[jasonlai [5k\]: GNU wins lots of game :O
+];W[go];B[fn];W[dl];B[bk]
+;W[io]C[kalim [12k\]: I wonder if it counts the value of its move
+]
+;B[eb]C[gunnar [?\]: GNU thinks it's ahead by 12.
+];W[fh];B[ji]
+C[olczyk [15k\]: I thinbkm probably more.
+];W[of]
+C[kalim [12k\]: i thought these bots play blitz well, why is it that they have a hour each?
+]
+;B[kn]C[Zark [5k\]: that means GNU wont play e1?
+gunnar [?\]: E1 is not on the top ten list.
+]
+;W[hq]
+C[maproom [7k\]: these events have a variety of time limits, to suit all preferences
+]
+;B[li]C[olczyk [15k\]: N11 seems a bit conservative.
+];W[oj]
+C[kalim [12k\]: h3 is baffling
+];B[es]
+C[gunnar [?\]: M11, N10 and N11 were all very close.
+gunnar [?\]: O9 second choice after E1.
+]
+;W[qe]C[jasonlai [5k\]: *.*
+];B[nk];W[kp]
+C[gunnar [?\]: GNU now thinks it's ahead by 36.
+];B[rd];W[np]
+C[jasonlai [5k\]: are you GNU ?
+jasonlai [5k\]: @.@
+kalim [12k\]: probably the creator
+]
+;B[on];W[re]
+C[gunnar [?\]: GNU is running on my computer and I have its trace output on screen.
+]
+;B[rk]C[olczyk [15k\]: You must have a faster computer then the bot.
+]
+;W[mh]C[jasonlai [5k\]: how to set a bot?
+];B[ri];W[no]
+C[Zark [5k\]: what level is Gnu set on? (if it is not secret)
+gunnar [?\]: Level 14, --large-scale option.
+]
+;B[nn]C[jasonlai [5k\]: which programme do you set the bot?
+];W[pp]
+C[micro [16k\]: GNU is so strong that i can't win@@
+jasonlai [5k\]: @@"
+gunnar [?\]: Set? The program connecting it here is called kgsGtp.
+jasonlai [5k\]: how can download it?
+]
+;B[op]C[jasonlai [5k\]: i want to make a bot :o
+olczyk [15k\]: surf kgs site.
+]
+;W[oo]C[kalim [12k\]: maybe the links in the chat channel will help
+]
+;B[po]C[olczyk [15k\]: P4 interesting move.
+jasonlai [5k\]: i want to make a killer bot xd
+gunnar [?\]: http://www.weddslist.com/kgs/how/outline.html
+]
+;W[qq]C[jasonlai [5k\]: thank you :D
+];B[pq];W[rj];B[sj];W[pr];B[or]
+;W[hb];B[ib];W[hc];B[hd];W[ea];B[fb]
+C[LemonEyes [16k\]: oh, okay, found it
+];W[gr];B[qi]
+C[kalim [12k\]: hmm, ko or no ko for bot
+];W[pi]
+C[gunnar [?\]: White should worry about M3, but GNU doesn't know about it either.
+jasonlai [5k\]: how to get a  Go-playing program -_-"
+gunnar [?\]: Um, never mind, M3 doesn't work.
+]
+;B[mp]C[gunnar [?\]: But N4 does. :-)
+];W[gf];B[fs]
+C[LemonEyes [16k\]: I wonder the rank of the programmers
+jasonlai [5k\]: ?.?
+]
+;W[lq]
+C[LemonEyes [16k\]: It'd be fun to have your own program outsmart you "'at a'boy, I'm so proud"
+Zark [5k\]: what does Gnu say about top groub?
+]
+;B[dc];W[cc]C[jasonlai [5k\]: seki
+jasonlai [5k\]: lol
+gunnar [?\]: The most active GNU Go programmers range from 4 dan to a couple of kyu.
+]
+;B[ec]C[LemonEyes [16k\]: okay, so that doesn't generally happen
+]
+;W[ge];B[cb];W[gd];B[gc]C[gunnar [?\]: No worries on the top now.
+olczyk [15k\]: indigobot dcoers not count liberties well.
+]
+;W[bb]C[LemonEyes [16k\]: what's the best bot on KGS?
+];B[da]
+C[LemonEyes [16k\]: what rank i mean
+kalim [12k\]: the bot that is playing black I think
+PaperTiger [12k\]: 12k
+]
+;W[rp]C[LemonEyes [16k\]: really, is that all?
+PaperTiger [12k\]: Pretty strong for a bot :)
+olczyk [15k\]: What about gopp?
+Tobamf [6k?\]: comp go is more fun than pro Go
+PaperTiger [12k\]: It's 12k too.
+]
+;B[rq];W[qr]
+C[LemonEyes [16k\]: how about in the whole wide world of computer go? how good's the best program?
+PaperTiger [12k\]: Same thing.
+]
+;B[ro]C[LemonEyes [16k\]: that's great! I have a new goal!
+PaperTiger [12k\]: The top bots are all at the same level.
+]
+;W[nq]C[PaperTiger [12k\]: To beat the bot or program the best bot?
+]
+;B[bc];W[cd]
+C[LemonEyes [16k\]: to beat the best. I don't program, although that would be an exhilarating challenge as well
+]
+;B[ba]
+C[Tobamf [6k?\]: it might just turn into a frustrating challenge
+]
+;W[nr]C[LemonEyes [16k\]: yeah, i could see that happening too
+]
+;B[ns]C[PaperTiger [12k\]: Gonna be a slow and painful endgame.
+LemonEyes [16k\]: 6 pts isn't too shabby at this point is it?
+olczyk [15k\]: What would be cool is to have a bot which connects too your brain. So you can  ask it questions and play based on the answers.
+]
+;W[ih]
+C[PaperTiger [12k\]: <-- Doesn't want robots connected to his brain.
+LemonEyes [16k\]: o3 might have been played, certainly by a human i'd think
+olczyk [15k\]: I do. As long as they are not made by Microsoft.
+]
+;B[ls]
+C[LemonEyes [16k\]: what would be cool is if a google search were just a thought away, think of the pop-up ads
+]
+;W[ii]C[LemonEyes [16k\]: you'd black out and buy a pepsi
+];B[fe]
+C[jasonlai [5k\]: gunnar
+jasonlai [5k\]: which programm do you run up th bot?
+]
+;W[ij]
+C[Tobamf [6k?\]: somehow that doesnt sound so thrilling LemonEyes
+Ambivlnce [14k\]: I thought the idea of a direct jack to the brain was cool ... right up till the pop up ads.
+LemonEyes [16k\]: maybe I'm just a romantic ;)
+]
+;B[jj];W[jk];B[ik];W[kk];B[kl]
+C[kalim [12k\]: indigo just insists on donating stones
+];W[jl];B[jm]
+;W[lk]C[gunnar [?\]: No, GNU is getting itself into trouble.
+];B[mj]
+;W[il];B[gn];W[hk];B[hn];W[ho];B[kr];W[jr];B[gj];W[lm];B[ln];W[mm]
+;B[mn];W[mk];B[nj];W[km];B[jo];W[jp]C[gunnar [?\]: K5 blunder.
+kalim [12k\]: ^^
+]
+;B[kh];W[pk]C[kalim [12k\]: and indigo didnt catch it
+gunnar [?\]: There's lots of time to catch on to it.
+Zark [5k\]: question is who will first
+]
+;B[rg]C[gunnar [?\]: GNU has H8 as nineth move for 1.31 points.
+]
+;W[pl];B[cj];W[pn]C[gunnar [?\]: ???
+Zark [5k\]: good move!
+];B[pm]
+;W[qn]C[Zark [5k\]: or maybe not
+];B[qm];W[rn];B[sp]
+C[kalim [12k\]: whats it doing for the minute or so between moves?
+]
+;W[bi];B[ni];W[qh];B[rh];W[rr];B[sr]
+C[Tobamf [6k?\]: it must be doing minuteia
+];W[rm]
+C[Ambivlnce [14k\]: It's composing poetry.
+];B[ph]
+C[kalim [12k\]: loves letters to idiotbot
+];W[oi];B[oh];W[nh];B[ok]
+;W[og];B[pj];W[ps];B[os];W[nd];B[lb];W[nc];B[nb];W[kb];B[od]
+C[kalim [12k\]: sneaky bot
+];W[oe];B[ne];W[pd];B[pc];W[me];B[md]
+;W[le];B[pg];W[hs];B[ds];W[bs];B[nf];W[ng];B[nd];W[cl];B[bl];W[jd]
+;B[qf];W[id];B[ha]C[kalim [12k\]: hey, theres some L and D there
+]
+;W[an];B[ac];W[am];B[ei];W[ak];B[di];W[fi];B[fj];W[al];B[lg];W[mg]
+;B[fg];W[gh];B[eh];W[dh];B[eg];W[rb];B[sd];W[qd];B[rc];W[bd];B[jg]
+;W[hf];B[gb];W[qb];B[ig];W[hh];B[se];W[pf];B[rf];W[hj];B[hl];W[gl]
+;B[hm];W[kj];B[jh]
+C[gunnar [?\]: White is a bit short in the eye department.
+];W[ko]
+;B[jn];W[hi];B[pe];W[nl];B[gk];W[nm];B[ll];W[ed];B[fd];W[je];B[hc]
+;W[pb];B[ob];W[mr];B[ms];W[lr];B[ad];W[qo];B[pp];W[ks];B[js]
+C[PaperTiger [12k\]: If white was a Unix kernel you'd see a bunch of PANIC in the logs.
+]
+;W[is];B[ks];W[kq];B[rp];W[so];B[sn];W[sm];B[ir];W[hr];B[rs];W[bf]
+;B[ae];W[so];B[qs];W[bg];B[af];W[ag];B[ab];W[lo];B[aq];W[ap];B[dj]
+;W[lh];B[ki];W[lf];B[kg];W[lp];B[fr];W[ef];B[in];W[lj];B[mi];W[gp]
+;B[qk];W[iq];B[pa];W[jb];B[la];W[cg];B[oa];W[ce];B[qe];W[];B[rj]
+;W[as];B[cs];W[jc];B[om];W[ml];B[ia];W[];B[dk];W[];B[pi];W[];B[dn]
+;W[];B[mb];W[];B[rl];W[];B[sl];W[];B[sn];W[];B[sm];W[];B[rn];W[];B[]
+TB[aa][ca][ea][fa][ga][ja][ka][ma][na][qa][ra][sa][bb][db][hb][jb]
+[kb][pb][qb][rb][sb][jc][kc][lc][nc][sc][gd][id][jd][kd][pd][qd][ge]
+[je][ke][le][me][oe][re][gf][hf][if][jf][kf][lf][mf][of][pf][sf][gg]
+[hg][mg][ng][og][qg][sg][fh][gh][hh][ih][lh][mh][nh][qh][sh][fi][hi]
+[ii][oi][si][ej][hj][ij][kj][lj][oj][qj][ek][hk][ik][jk][kk][lk][mk]
+[pk][sk][cl][dl][el][gl][il][jl][kl][ll][ml][nl][pl][dm][gm][km][lm]
+[mm][nm][rm][en][pn][qn][eo][qo][so][qq][sq][pr][qr][rr][as][bs][ps]
+[ss]TW[cf][ah][bh][ch][ai][aj][ao][hp][ip][gq][ir]
+C[jasonlai [5k\]: @@"
+])
diff --git a/regression/games/kgs/yagr-FKleolio.sgf b/regression/games/kgs/yagr-FKleolio.sgf
new file mode 100644 (file)
index 0000000..66efd8b
--- /dev/null
@@ -0,0 +1,268 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[FKleolio]WR[8k]BR[10k]DT[2004-08-21]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.10
+]RE[B+15.50]
+;W[dc]
+;B[pq]
+;W[po]
+;B[qo]
+;W[pp]
+;B[qp]
+;W[oq]
+;B[qr]
+;W[cn]
+;B[pn]
+;W[hd]
+;B[ce]
+;W[cg]
+;B[ck]
+;W[de]
+;B[en]
+;W[bp]
+;B[bm]
+;W[cd]
+;B[bg]
+;W[bh]
+;B[ch]
+;W[dh]
+;B[ci]
+;W[bf]
+;B[mp]
+;W[no]
+;B[mo]
+;W[on]
+;B[dg]
+;W[cf]
+;B[eh]
+;W[fq]
+;B[dq]
+;W[cr]
+;B[dr]
+;W[br]
+;B[bo]
+;W[nc]
+;B[oc]
+;W[nd]
+;B[jc]
+;W[pe]
+;B[nb]
+;W[mb]
+;B[ob]
+;W[lc]
+;B[je]
+;W[mn]
+;B[or]
+;W[iq]
+;B[kq]
+;W[qe]
+;B[qd]
+;W[qi]
+;B[pm]
+;W[io]
+;B[hn]
+;W[bi]
+;B[di]
+;W[fo]
+;B[ap]
+;W[pk]
+;B[hb]
+;W[np]
+;B[nq]
+;W[jm]
+;B[in]
+;W[jn]
+;B[jo]
+;W[gm]
+;B[gn]
+;W[mq]
+;B[op]
+;W[lq]
+;B[oo]
+;W[lp]
+;B[nn]
+;W[jp]
+;B[fn]
+;W[aq]
+;B[cp]
+;W[ao]
+;B[bn]
+;W[cq]
+;B[hp]
+;W[hq]
+;B[hl]
+;W[ko]
+;B[fc]
+;W[mm]
+;B[nk]
+;W[gp]
+;B[eo]
+;W[fe]
+;B[gd]
+;W[ge]
+;B[he]
+;W[ie]
+;B[hf]
+;W[if]
+;B[id]
+;W[hg]
+;B[gf]
+;W[jf]
+;B[ke]
+;W[hi]
+;B[gj]
+;W[mr]
+;B[fs]
+;W[re]
+;B[rd]
+;W[ji]
+;B[jk]
+;W[lg]
+;B[bj]
+;W[le]
+;B[kf]
+;W[kg]
+;B[gg]
+;W[kd]
+;B[jd]
+;W[lf]
+;B[ig]
+;W[jg]
+;B[hh]
+;W[ih]
+;B[oj]
+;W[ql]
+;B[pl]
+;W[og]
+;B[pj]
+;W[qj]
+;B[od]
+;W[sd]
+;B[sc]
+;W[se]
+;B[rb]
+;W[ho]
+;B[oe]
+;W[of]
+;B[ne]
+;W[li]
+;B[md]
+;W[mc]
+;B[me]
+;W[ld]
+;B[oh]
+;W[kk]
+;B[rm]
+;W[rl]
+;B[ok]
+;W[ph]
+;B[fd]
+;W[ik]
+;B[il]
+;W[jl]
+;B[hk]
+;W[ij]
+;B[gi]
+;W[ff]
+;B[db]
+;W[eb]
+;B[fb]
+;W[cb]
+;B[ec]
+;W[da]
+;B[fg]
+;W[ed]
+;B[ef]
+;W[ee]
+;B[qk]
+;W[rk]
+;B[lk]
+;W[ll]
+;B[kj]
+;W[jj]
+;B[lj]
+;W[rn]
+;B[ro]
+;W[qm]
+;B[qn]
+;W[sm]
+;B[mi]
+;W[mh]
+;B[nh]
+;W[ni]
+;B[mj]
+;W[oi]
+;B[ng]
+;W[nf]
+;B[ki]
+;W[df]
+;B[lh]
+;W[mg]
+;B[kh]
+;W[ds]
+;B[er]
+;W[gr]
+;B[go]
+;W[fp]
+;B[nr]
+;W[nm]
+;B[om]
+;W[kb]
+;B[jb]
+;W[lo]
+;B[an]
+;W[ap]
+;B[gs]
+;W[kr]
+;B[hs]
+;W[im]
+;B[hm]
+;W[ai]
+;B[aj]
+;W[ag]
+;B[hj]
+;W[ii]
+;B[hg]
+;W[ns]
+;B[jh]
+;W[jk]
+;B[os]
+;W[ms]
+;B[so]
+;W[sn]
+;B[fa]
+;W[ea]
+;B[ir]
+;W[hr]
+;B[jr]
+;W[jq]
+;B[ks]
+;W[ls]
+;B[lr]
+;W[kp]
+;B[is]
+;W[kr]
+;B[nl]
+;W[ml]
+;B[eg]
+;W[fr]
+;B[es]
+;W[cs]
+;B[js]
+;W[ja]
+;B[ia]
+;W[ka]
+;B[ma]
+;W[la]
+;B[na]
+;W[kc]
+;B[hc]
+;W[pk]
+;B[ep]
+;W[qk]
+;B[nj]
+;W[pi]
+;B[eq]
+;W[mf]
+;B[mk]
+;W[]
+;B[]TW[aa][ba][ca][ab][bb][db][lb][ac][bc][cc][ad][bd][dd][ae][be][ce][af][pf][qf][rf][sf][bg][ng][pg][qg][rg][sg][ah][nh][oh][qh][rh][sh][ri][si][rj][sj][sk][kl][sl][km][lm][rm][kn][ln][jo][hp][ip][bq][gq][kq][ar][lr][as][bs]TB[ga][ha][oa][pa][qa][ra][sa][gb][ib][pb][qb][sb][gc][ic][pc][qc][rc][hd][dh][fh][gh][ei][fi][li][cj][dj][ej][fj][ak][bk][dk][ek][fk][gk][al][bl][cl][dl][el][fl][gl][ol][am][cm][dm][em][fm][gm][cn][dn][on][co][do][no][po][np][pp][rp][sp][oq][qq][rq][sq][pr][rr][sr][ps][qs][rs][ss])
diff --git a/regression/games/kgs/yagr-Kazik.sgf b/regression/games/kgs/yagr-Kazik.sgf
new file mode 100644 (file)
index 0000000..c7af415
--- /dev/null
@@ -0,0 +1,156 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[3]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[Kazik]WR[8k]BR[11k]DT[2004-06-01]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]RE[B+Resign]
+;W[dc]
+;B[jp]
+;W[hd]
+;B[pj]
+;W[ce]
+;B[pf]
+;W[cn]
+;B[fp]
+;W[ck]
+;B[bo]
+;W[lc]
+;B[nc]
+;W[pn]
+;B[np]
+;W[qp]
+;B[qq]
+;W[qo]
+;B[ql]
+;W[rq]
+;B[qr]
+;W[le]
+;B[nm]
+;W[ki]
+;B[rn]
+;W[ro]
+;B[rr]
+;W[kk]
+;B[qm]
+;W[fn]
+;B[hp]
+;W[im]
+;B[kn]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[rc]
+;W[rb]
+;B[rd]
+;W[ch]
+;B[mb]
+;W[kb]
+;B[sb]
+;W[mg]
+;B[oh]
+;W[hj]
+;B[nj]
+;W[bn]
+;B[co]
+;W[ao]
+;B[ap]
+;W[an]
+;B[bp]
+;W[lm]
+;B[ln]
+;W[dn]
+;B[nf]
+;W[eo]
+;B[ep]
+;W[mf]
+;B[lh]
+;W[mh]
+;B[li]
+;W[mi]
+;B[lj]
+;W[mj]
+;B[lk]
+;W[mk]
+;B[ll]
+;W[jg]
+;B[nk]
+;W[ml]
+;B[kl]
+;W[kj]
+;B[kg]
+;W[nl]
+;B[ol]
+;W[mm]
+;B[nn]
+;W[km]
+;B[jm]
+;W[jn]
+;B[jl]
+;W[io]
+;B[jo]
+;W[in]
+;B[hl]
+;W[il]
+;B[ik]
+;W[hk]
+;B[jk]
+;W[kh]
+;B[hm]
+;W[go]
+;B[ho]
+;W[hn]
+;B[ip]
+;W[gn]
+;B[jh]
+;W[hg]
+;B[ji]
+;W[ij]
+;B[jj]
+;W[lg]
+;B[kf]
+;W[ig]
+;B[kd]
+;W[ld]
+;B[jc]
+;W[ke]
+;B[je]
+;W[jb]
+;B[ic]
+;W[jf]
+;B[ib]
+;W[gi]
+;B[gc]
+;W[id]
+;B[jd]
+;W[hb]
+;B[hc]
+;W[gd]
+;B[fc]
+;W[ia]
+;B[ja]
+;W[eb]
+;B[ha]
+;W[ka]
+;B[lb]
+;W[kc]
+;B[la]
+;W[ne]
+;B[nd]
+;W[oe]
+;B[of]
+;W[mc]
+;B[nb]
+;W[od]
+;B[oc]
+;W[mn]
+;B[mo]
+;W[kh]
+;B[ki]
+;W[lf]
+;B[kh]
+;W[lo]
+;B[ko]
+;W[me]
+;B[pe]
+;W[ni]
+;B[oi]
+;W[fd]
+;B[nh])
diff --git a/regression/games/kgs/yagr-Mythenmetz.2.sgf b/regression/games/kgs/yagr-Mythenmetz.2.sgf
new file mode 100644 (file)
index 0000000..56e6e07
--- /dev/null
@@ -0,0 +1,117 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[6]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[Mythenmetz]WR[8k]BR[17k]DT[2004-08-25]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dj][pj][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.10
+]
+;W[fq]
+;B[hq]
+;W[fo]
+;B[fp]
+;W[gq]
+;B[gp]
+;W[hr]
+;B[iq]
+;W[ir]
+;B[eo]
+;W[fn]
+;B[en]
+;W[fm]
+;B[ho]
+;W[em]
+;B[mq]
+;W[hm]
+;B[dm]
+;W[fc]
+;B[ec]
+;W[fd]
+;B[mc]
+;W[de]
+;B[ce]
+;W[jd]
+;B[df]
+;W[pg]
+;B[qm]
+;W[dr]
+;B[cq]
+;W[ee]
+;B[ef]
+;W[fj]
+;B[eh]
+;W[hj]
+;B[qf]
+;W[jm]
+;B[mm]
+;W[gg]
+;B[qg]
+;W[cr]
+;B[bq]
+;W[qc]
+;B[pc]
+;W[pb]
+;B[ob]
+;W[rb]
+;B[qd]
+;W[rd]
+;B[re]
+;W[qa]
+;B[me]
+;W[kg]
+;B[kc]
+;W[jc]
+;B[jb]
+;W[ib]
+;B[kb]
+;W[dl]
+;B[cl]
+;W[ck]
+;B[dk]
+;W[cj]
+;B[bl]
+;W[lj]
+;B[ci]
+;W[dc]
+;B[ed]
+;W[eb]
+;B[cc]
+;W[cd]
+;B[bd]
+;W[cb]
+;B[dd]
+;W[nj]
+;B[bb]
+;W[ph]
+;B[qh]
+;W[kd]
+;B[ld]
+;W[ed]
+;B[cd]
+;W[jr]
+;B[jq]
+;W[ms]
+;B[nr]
+;W[ns]
+;B[or]
+;W[os]
+;B[qr]
+;W[ok]
+;B[pk]
+;W[ol]
+;B[on]
+;W[oa]
+;B[nb]
+;W[ml]
+;B[lm]
+;W[ll]
+;B[oi]
+;W[ng]
+;B[ni]
+;W[ja]
+;B[ka]
+;W[ia]
+;B[lf]
+;W[lg]
+;B[mh]
+;W[qs]
+;B[rr]
+;W[ba]
+;B[mg]
+;W[kf])
diff --git a/regression/games/kgs/yagr-Mythenmetz.sgf b/regression/games/kgs/yagr-Mythenmetz.sgf
new file mode 100644 (file)
index 0000000..1501de6
--- /dev/null
@@ -0,0 +1,163 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[Mythenmetz]WR[8k]BR[17k]DT[2004-07-29]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.9
+]
+;B[pp]
+;W[dq]
+;B[dc]
+;W[de]
+;B[ce]
+;W[dd]
+;B[cd]
+;W[ec]
+;B[db]
+;W[df]
+;B[cf]
+;W[qc]
+;B[pd]
+;W[pc]
+;B[qd]
+;W[od]
+;B[pg]
+;W[qi]
+;B[ql]
+;W[co]
+;B[gq]
+;W[oi]
+;B[mq]
+;W[ng]
+;B[of]
+;W[dg]
+;B[cg]
+;W[eb]
+;B[nf]
+;W[md]
+;B[mf]
+;W[ke]
+;B[hd]
+;W[dh]
+;B[ci]
+;W[ej]
+;B[di]
+;W[ei]
+;B[hf]
+;W[kg]
+;B[hh]
+;W[qq]
+;B[qp]
+;W[pq]
+;B[oq]
+;W[or]
+;B[nr]
+;W[op]
+;B[nq]
+;W[rp]
+;B[oo]
+;W[ps]
+;B[np]
+;W[ch]
+;B[bh]
+;W[hj]
+;B[ji]
+;W[jk]
+;B[jc]
+;W[ih]
+;B[ig]
+;W[ii]
+;B[jf]
+;W[rd]
+;B[re]
+;W[rc]
+;B[qe]
+;W[kf]
+;B[je]
+;W[jg]
+;B[li]
+;W[mj]
+;B[mg]
+;W[nh]
+;B[mh]
+;W[kh]
+;B[ki]
+;W[kd]
+;B[jd]
+;W[se]
+;B[sf]
+;W[ok]
+;B[rg]
+;W[rh]
+;B[jp]
+;W[qf]
+;B[qg]
+;W[oe]
+;B[pf]
+;W[kk]
+;B[ni]
+;W[nj]
+;B[mi]
+;W[oh]
+;B[rj]
+;W[ri]
+;B[qj]
+;W[pj]
+;B[si]
+;W[sh]
+;B[sj]
+;W[cl]
+;B[ph]
+;W[pi]
+;B[ol]
+;W[ro]
+;B[rn]
+;W[qo]
+;B[po]
+;W[qn]
+;B[rm]
+;W[fr]
+;B[gr]
+;W[gn]
+;B[go]
+;W[eq]
+;B[hn]
+;W[fn]
+;B[im]
+;W[bj]
+;B[bi]
+;W[kc]
+;B[kb]
+;W[lb]
+;B[jb]
+;W[km]
+;B[kn]
+;W[da]
+;B[cb]
+;W[nl]
+;B[om]
+;W[ca]
+;B[ba]
+;W[ea]
+;B[bc]
+;W[hb]
+;B[hc]
+;W[gb]
+;B[pk]
+;W[gg]
+;B[hg]
+;W[ie]
+;B[gf]
+;W[il]
+;B[hl]
+;W[fd]
+;B[fg]
+;W[gh]
+;B[gi]
+;W[fh]
+;B[fi]
+;W[eh]
+;B[hi]
+;W[gj]
+;B[ij]
+;W[ik]
+;B[jh]
+;W[lm]
+;B[ln])
diff --git a/regression/games/kgs/yagr-Rayden.sgf b/regression/games/kgs/yagr-Rayden.sgf
new file mode 100644 (file)
index 0000000..e79d90e
--- /dev/null
@@ -0,0 +1,98 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[5.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[Rayden]WR[8k]BR[8k]DT[2004-06-29]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.8
+]
+;B[pd]
+;W[dp]
+;B[pq]
+;W[dd]
+;B[qk]
+;W[dj]
+;B[fc]
+;W[hc]
+;B[fe]
+;W[df]
+;B[db]
+;W[cc]
+;B[jc]
+;W[qf]
+;B[pf]
+;W[pg]
+;B[of]
+;W[qe]
+;B[qd]
+;W[qo]
+;B[oo]
+;W[fg]
+;B[ie]
+;W[pn]
+;B[on]
+;W[ig]
+;B[og]
+;W[ph]
+;B[oh]
+;W[kf]
+;B[pi]
+;W[jd]
+;B[id]
+;W[ri]
+;B[qi]
+;W[ic]
+;B[kc]
+;W[jg]
+;B[ke]
+;W[cb]
+;B[ec]
+;W[je]
+;B[kd]
+;W[ed]
+;B[fd]
+;W[jf]
+;B[ge]
+;W[hd]
+;B[he]
+;W[fb]
+;B[gb]
+;W[ib]
+;B[jb]
+;W[hq]
+;B[pm]
+;W[qm]
+;B[ql]
+;W[rq]
+;B[po]
+;W[nq]
+;B[qn]
+;W[kq]
+;B[lf]
+;W[qr]
+;B[pr]
+;W[ro]
+;B[qq]
+;W[rr]
+;B[rn]
+;W[qp]
+;B[so]
+;W[sp]
+;B[sn]
+;W[qs]
+;B[sr]
+;W[ps]
+;B[or]
+;W[os]
+;B[nr]
+;W[ns]
+;B[mr]
+;W[ms]
+;B[lr]
+;W[ls]
+;B[kr]
+;W[ks]
+;B[jr]
+;W[js]
+;B[ir]
+;W[is]
+;B[hs]
+;W[hr]
+;B[jp]
+;W[hn])
diff --git a/regression/games/kgs/yagr-Sapojnik.sgf b/regression/games/kgs/yagr-Sapojnik.sgf
new file mode 100644 (file)
index 0000000..f434446
--- /dev/null
@@ -0,0 +1,90 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[5.50]TM[1500]OT[20/120 Canadian]
+PW[yagr]PB[Sapojnik]WR[8k]DT[2004-05-06]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;B[pp]
+;W[dd]
+;B[pd]
+;W[dq]
+;B[pj]
+;W[nq]
+;B[oq]
+;W[np]
+;B[nr]
+;W[mr]
+;B[or]
+;W[lq]
+;B[jd]
+;W[co]
+;B[gc]
+;W[ec]
+;B[jj]
+;W[qf]
+;B[qe]
+;W[nc]
+;B[oc]
+;W[ob]
+;B[pb]
+;W[od]
+;B[pc]
+;W[oe]
+;B[nb]
+;W[mb]
+;B[oa]
+;W[pf]
+;B[mc]
+;W[lc]
+;B[nd]
+;W[mf]
+;B[lb]
+;W[ph]
+;B[kc]
+;W[ch]
+;B[ld]
+;W[nh]
+;B[nj]
+;W[nn]
+;B[pn]
+;W[iq]
+;B[jg]
+;W[re]
+;B[rd]
+;W[ei]
+;B[gg]
+;W[fk]
+;B[gj]
+;W[hm]
+;B[il]
+;W[df]
+;B[fe]
+;W[kn]
+;B[kl]
+;W[lh]
+;B[lf]
+;W[mj]
+;B[mk]
+;W[rf]
+;B[mi]
+;W[lj]
+;B[li]
+;W[lk]
+;B[ll]
+;W[nk]
+;B[ml]
+;W[ni]
+;B[oj]
+;W[ki]
+;B[nl]
+;W[rh]
+;B[qi]
+;W[qg]
+;B[kj]
+;W[sk]
+;B[rj]
+;W[sl]
+;B[rn]
+;W[ql]
+;B[pl]
+;W[mh]
+;B[qk]
+;W[sj])
diff --git a/regression/games/kgs/yagr-awf.sgf b/regression/games/kgs/yagr-awf.sgf
new file mode 100644 (file)
index 0000000..5836fbe
--- /dev/null
@@ -0,0 +1,293 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[6]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[awf]WR[8k]BR[14k]DT[2004-07-22]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dj][pj][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.9
+]RE[W+4.50]
+;W[fq]
+;B[eq]
+;W[fp]
+;B[hp]
+;W[fn]
+;B[go]
+;W[fo]
+;B[hq]
+;W[hm]
+;B[dn]
+;W[jq]
+;B[fr]
+;W[gr]
+;B[er]
+;W[hr]
+;B[io]
+;W[jn]
+;B[jo]
+;W[ko]
+;B[gq]
+;W[jr]
+;B[iq]
+;W[ir]
+;B[jp]
+;W[kp]
+;B[in]
+;W[im]
+;B[gn]
+;W[gm]
+;B[hn]
+;W[fc]
+;B[ec]
+;W[fd]
+;B[ff]
+;W[cf]
+;B[ce]
+;W[be]
+;B[bd]
+;W[de]
+;B[cd]
+;W[nd]
+;B[oc]
+;W[jd]
+;B[he]
+;W[qn]
+;B[qo]
+;W[pn]
+;B[no]
+;W[po]
+;B[qp]
+;W[hc]
+;B[hd]
+;W[nc]
+;B[ma]
+;W[nb]
+;B[lb]
+;W[el]
+;B[dl]
+;W[qf]
+;B[oe]
+;W[mf]
+;B[of]
+;W[rd]
+;B[qc]
+;W[rc]
+;B[rb]
+;W[ee]
+;B[ed]
+;W[nq]
+;B[oq]
+;W[np]
+;B[op]
+;W[oo]
+;B[nr]
+;W[mr]
+;B[mq]
+;W[mp]
+;B[lq]
+;W[lp]
+;B[lr]
+;W[lm]
+;B[qg]
+;W[kq]
+;B[or]
+;W[rg]
+;B[qh]
+;W[qd]
+;B[pb]
+;W[na]
+;B[ld]
+;W[ke]
+;B[jc]
+;W[ic]
+;B[ib]
+;W[hb]
+;B[jb]
+;W[ne]
+;B[kd]
+;W[rh]
+;B[ri]
+;W[gf]
+;B[fe]
+;W[eb]
+;B[df]
+;W[ge]
+;B[hf]
+;W[gg]
+;B[hg]
+;W[gd]
+;B[gi]
+;W[mc]
+;B[le]
+;W[kf]
+;B[lf]
+;W[lg]
+;B[mg]
+;W[kg]
+;B[lc]
+;W[hh]
+;B[gh]
+;W[fg]
+;B[ef]
+;W[ei]
+;B[fh]
+;W[eg]
+;B[eh]
+;W[dh]
+;B[dg]
+;W[di]
+;B[ih]
+;W[ia]
+;B[ja]
+;W[ej]
+;B[hi]
+;W[cg]
+;B[id]
+;W[gb]
+;B[ha]
+;W[je]
+;B[bf]
+;W[dk]
+;B[ck]
+;W[cj]
+;B[bk]
+;W[cl]
+;B[dm]
+;W[bl]
+;B[bj]
+;W[bi]
+;B[bh]
+;W[bg]
+;B[ae]
+;W[ah]
+;B[em]
+;W[fm]
+;B[fl]
+;W[lj]
+;B[ek]
+;W[gk]
+;B[dj]
+;W[ch]
+;B[ci]
+;W[fj]
+;B[fk]
+;W[gj]
+;B[gl]
+;W[ik]
+;B[hl]
+;W[hk]
+;B[il]
+;W[jl]
+;B[jk]
+;W[jj]
+;B[kk]
+;W[mk]
+;B[kj]
+;W[ki]
+;B[ji]
+;W[ij]
+;B[ii]
+;W[ng]
+;B[mh]
+;W[ig]
+;B[lh]
+;W[kh]
+;B[li]
+;W[nh]
+;B[nf]
+;W[if]
+;B[ga]
+;W[me]
+;B[fa]
+;W[qe]
+;B[fb]
+;W[pl]
+;B[gc]
+;W[qi]
+;B[qj]
+;W[pi]
+;B[km]
+;W[jm]
+;B[kl]
+;W[rn]
+;B[ro]
+;W[kr]
+;B[ms]
+;W[so]
+;B[sp]
+;W[sn]
+;B[rq]
+;W[mb]
+;B[aj]
+;W[pa]
+;B[qa]
+;W[oa]
+;B[ob]
+;W[sb]
+;B[ai]
+;W[pg]
+;B[bh]
+;W[lk]
+;B[ag]
+;W[kn]
+;B[hj]
+;W[ll]
+;B[cn]
+;W[la]
+;B[ka]
+;W[fs]
+;B[es]
+;W[gs]
+;B[ks]
+;W[js]
+;B[ls]
+;W[jh]
+;B[ie]
+;W[eo]
+;B[ql]
+;W[do]
+;B[co]
+;W[ep]
+;B[cq]
+;W[ma]
+;B[pk]
+;W[ol]
+;B[ok]
+;W[rk]
+;B[rl]
+;W[rj]
+;B[oi]
+;W[ph]
+;B[oh]
+;W[og]
+;B[ni]
+;W[ra]
+;B[mi]
+;W[qb]
+;B[md]
+;W[gp]
+;B[od]
+;W[qa]
+;B[nk]
+;W[sl]
+;B[nl]
+;W[qk]
+;B[mj]
+;W[nj]
+;B[oj]
+;W[nm]
+;B[mm]
+;W[om]
+;B[mn]
+;W[fi]
+;B[kk]
+;W[kj]
+;B[ml]
+;W[en]
+;B[sj]
+;W[si]
+;B[nn]
+;W[ln]
+;B[on]
+;W[pm]
+;B[qm]
+;W[rm]
+;B[jf]
+;W[jg]
+;B[]
+;W[]TW[sa][ob][pb][rb][oc][pc][qc][sc][od][pd][sd][oe][pe][re][se][jf][nf][of][pf][rf][sf][mg][qg][sg][lh][mh][oh][qh][sh][li][mi][ni][oi][ri][mj][nj][oj][pj][qj][sj][jk][kk][nk][ok][pk][sk][kl][ml][nl][ql][rl][km][mm][qm][sm][mn][nn][on][lo][mo][no][hs][is]TB[aa][ba][ca][da][ea][ia][ab][bb][cb][db][eb][gb][hb][kb][ac][bc][cc][dc][fc][hc][ic][kc][ad][fd][gd][be][de][ee][ge][af][gf][eg][fg][gg][ah][hh][bi][cj][ak][dk][al][bl][cl][el][am][bm][cm][an][bn][ao][bo][ho][ap][bp][cp][ip][rp][aq][bq][dq][pq][qq][sq][ar][br][cr][dr][mr][pr][qr][rr][sr][as][bs][cs][ds][ns][os][ps][qs][rs][ss])
diff --git a/regression/games/kgs/yagr-czarny.sgf b/regression/games/kgs/yagr-czarny.sgf
new file mode 100644 (file)
index 0000000..801edfb
--- /dev/null
@@ -0,0 +1,189 @@
+(;GM[1]FF[4]CA[UTF-8]
+RU[AGA]SZ[19]KM[5.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[czarny]WR[8k]BR[8k]DT[2004-07-17]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.8
+]RE[B+Resign]
+;B[pe]
+;W[dd]
+;B[pp]
+;W[cp]
+;B[ep]
+;W[eq]
+;B[co]
+;W[fq]
+;B[cq]
+;W[bp]
+;B[dp]
+;W[dq]
+;B[bo]
+;W[bq]
+;B[cr]
+;W[do]
+;B[br]
+;W[eo]
+;B[fp]
+;W[gp]
+;B[fo]
+;W[fn]
+;B[go]
+;W[ho]
+;B[gn]
+;W[gm]
+;B[hn]
+;W[in]
+;B[hm]
+;W[hl]
+;B[im]
+;W[jm]
+;B[il]
+;W[ik]
+;B[jl]
+;W[kl]
+;B[jk]C[czarny [8k\]: co za lol z bota
+]
+;W[jj]
+;B[kk]
+;W[lk]C[BananaBoy [11k\]: i to na dodatek 8k...
+BananaBoy [11k\]: :)
+]
+;B[kj]
+;W[ki]
+;B[lj]
+;W[li]
+;B[mj]
+;W[hk]
+;B[fm]
+;W[lm]
+;B[jn]
+;W[hq]
+;B[io]
+;W[fk]
+;B[km]
+;W[pc]
+;B[ll]
+;W[mm]
+;B[hp]
+;W[gq]
+;B[iq]
+;W[ir]
+;B[jq]
+;W[jr]
+;B[kr]
+;W[dr]
+;B[js]
+;W[hs]
+;B[es]
+;W[ds]C[Scatee [9k\]: hrhrhrhr
+]
+;B[ks]
+;W[oe]
+;B[is]
+;W[mp]
+;B[pm]
+;W[kp]
+;B[hr]
+;W[on]
+;B[pn]
+;W[nh]
+;B[qc]
+;W[qb]
+;B[pb]
+;W[ob]
+;B[pd]
+;W[pa]
+;B[rc]
+;W[od]
+;B[nc]
+;W[dk]
+;B[oc]
+;W[nb]
+;B[mc]
+;W[mb]
+;B[of]
+;W[md]
+;B[me]
+;W[lc]
+;B[pb]
+;W[le]
+;B[pc]
+;W[nd]
+;B[kd]
+;W[ld]
+;B[kb]
+;W[kc]
+;B[fc]
+;W[jd]
+;B[df]
+;W[ee]
+;B[cc]
+;W[dc]
+;B[db]
+;W[cd]
+;B[eb]
+;W[dh]
+;B[bc]
+;W[nf]
+;B[og]
+;W[ng]
+;B[gl]
+;W[oh]
+;B[fe]
+;W[ef]
+;B[lb]
+;W[jb]
+;B[oa]
+;W[na]
+;B[rb]
+;W[qi]
+;B[qa]
+;W[ka]
+;B[qk]
+;W[ph]
+;B[gk]
+;W[gj]
+;B[ij]
+;W[ch]
+;B[hj]
+;W[gi]
+;B[ji]
+;W[bd]
+;B[ad]
+;W[ae]
+;B[ac]
+;W[bf]
+;B[dm]
+;W[qq]
+;B[pq]
+;W[qp]
+;B[qo]
+;W[ro]
+;B[rn]
+;W[pr]
+;B[or]
+;W[sp]
+;B[qr]
+;W[rr]
+;B[ps]
+;W[nm]
+;B[ok]
+;W[rs]
+;B[rj]
+;W[cl]
+;B[cm]
+;W[mk]
+;B[nk]
+;W[bm]
+;B[bn]
+;W[bl]
+;B[ff]
+;W[qf]
+;B[qe]
+;W[pf]
+;B[rf]
+;W[rg]
+;B[qg]
+;W[pg]
+;B[sg]
+;W[rh]
+;B[sf]
+;W[ig]
+;B[hg])
diff --git a/regression/games/kgs/yagr-digibier.sgf b/regression/games/kgs/yagr-digibier.sgf
new file mode 100644 (file)
index 0000000..1cee222
--- /dev/null
@@ -0,0 +1,236 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[5.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[digibier]WR[8k]BR[8k]DT[2004-08-24]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.10
+]RE[B+Resign]
+;B[dp]
+;W[dd]
+;B[pd]
+;W[pp]
+;B[fc]
+;W[cf]
+;B[id]
+;W[qf]
+;B[ph]
+;W[of]
+;B[nd]
+;W[fq]
+;B[cm]
+;W[iq]
+;B[nq]
+;W[lq]
+;B[no]
+;W[pn]
+;B[ql]
+;W[qn]
+;B[ol]
+;W[nh]
+;B[oj]
+;W[mf]
+;B[le]
+;W[rd]
+;B[qc]
+;W[rc]
+;B[rb]
+;W[rh]
+;B[qi]
+;W[nn]
+;B[mo]
+;W[eb]
+;B[ec]
+;W[dc]
+;B[fb]
+;W[oo]
+;B[oq]
+;W[ci]
+;B[ck]
+;W[db]
+;B[cq]
+;W[pq]
+;B[ko]
+;W[kg]
+;B[ff]
+;W[mj]
+;B[mk]
+;W[lj]
+;B[if]
+;W[kp]
+;B[lo]
+;W[ri]
+;B[rj]
+;W[bj]
+;B[bk]
+;W[ih]
+;B[qd]
+;W[je]
+;B[jf]
+;W[qe]
+;B[cg]
+;W[dg]
+;B[bg]
+;W[dh]
+;B[bf]
+;W[ce]
+;B[bh]
+;W[aj]
+;B[ak]
+;W[me]
+;B[md]
+;W[lk]
+;B[ml]
+;W[mn]
+;B[jo]
+;W[ho]
+;B[jl]
+;W[ll]
+;B[mm]
+;W[ln]
+;B[lm]
+;W[kn]
+;B[jn]
+;W[km]
+;B[jm]
+;W[eo]
+;B[do]
+;W[or]
+;B[nr]
+;W[pr]
+;B[gm]
+;W[fa]
+;B[gb]
+;W[ga]
+;B[ha]
+;W[ea]
+;B[hb]
+;W[en]
+;B[cj]
+;W[bi]
+;B[fj]
+;W[el]
+;B[gk]
+;W[fh]
+;B[go]
+;W[fo]
+;B[gp]
+;W[hn]
+;B[gn]
+;W[ip]
+;B[fp]
+;W[gq]
+;B[ep]
+;W[dn]
+;B[cn]
+;W[dm]
+;B[ek]
+;W[sb]
+;B[qb]
+;W[hp]
+;B[hm]
+;W[dr]
+;B[cr]
+;W[er]
+;B[qh]
+;W[rg]
+;B[jj]
+;W[sj]
+;B[rk]
+;W[cs]
+;B[gh]
+;W[br]
+;B[bq]
+;W[hh]
+;B[gg]
+;W[hj]
+;B[hk]
+;W[lf]
+;B[ke]
+;W[dj]
+;B[dk]
+;W[ns]
+;B[ms]
+;W[lr]
+;B[os]
+;W[ps]
+;B[ns]
+;W[ls]
+;B[rm]
+;W[rn]
+;B[sn]
+;W[so]
+;B[sm]
+;W[rp]
+;B[kl]
+;W[op]
+;B[mq]
+;W[gi]
+;B[ei]
+;W[fg]
+;B[gf]
+;W[di]
+;B[ef]
+;W[fi]
+;B[ej]
+;W[nm]
+;B[nl]
+;W[ki]
+;B[sk]
+;W[ed]
+;B[fd]
+;W[ji]
+;B[ij]
+;W[ni]
+;B[oi]
+;W[si]
+;B[pm]
+;W[on]
+;B[gj]
+;W[hi]
+;B[oe]
+;W[og]
+;B[jg]
+;W[jp]
+;B[bs]
+;W[as]
+;B[aq]
+;W[bs]
+;B[jh]
+;W[df]
+;B[ee]
+;W[kh]
+;B[ne]
+;W[nf]
+;B[ii]
+;W[nj]
+;B[nk]
+;W[pg]
+;B[pe]
+;W[hg]
+;B[hf]
+;W[in]
+;B[im]
+;W[kk]
+;B[jk]
+;W[ra]
+;B[qa]
+;W[sc]
+;B[bd]
+;W[be]
+;B[ae]
+;W[bc]
+;B[ac]
+;W[ah]
+;B[af]
+;W[qm]
+;B[bb]
+;W[cd]
+;B[cc]
+;W[cb]
+;B[ca]
+;W[bc]
+;B[re]
+;W[rf]
+;B[cc]
+;W[ch]
+;B[bc]
+;W[eg]
+;B[de]C[Albatur [16k\]: bravo
+])
diff --git a/regression/games/kgs/yagr-eddyy.sgf b/regression/games/kgs/yagr-eddyy.sgf
new file mode 100644 (file)
index 0000000..dd0a640
--- /dev/null
@@ -0,0 +1,296 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[eddyy]WR[9k]BR[12k]DT[2004-04-06]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [9k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]RE[W+67.50]
+;B[dp]
+;W[dd]
+;B[pp]
+;W[pd]
+;B[qf]
+;W[nd]
+;B[rd]
+;W[qn]
+;B[ql]
+;W[nq]
+;B[pn]
+;W[qh]
+;B[qc]
+;W[qe]
+;B[re]
+;W[pf]
+;B[qd]
+;W[qq]
+;B[qp]
+;W[pq]
+;B[rq]
+;W[fq]
+;B[hq]
+;W[cn]
+;B[fp]
+;W[cq]
+;B[dq]
+;W[cp]
+;B[dn]
+;W[gp]
+;B[gq]
+;W[rr]
+;B[rp]
+;W[dm]
+;B[co]
+;W[bo]
+;B[do]
+;W[cm]
+;B[cr]
+;W[fo]
+;B[ep]
+;W[go]
+;B[kq]
+;W[di]
+;B[fc]
+;W[fe]
+;B[id]
+;W[kc]
+;B[db]
+;W[cc]
+;B[ib]
+;W[br]
+;B[dr]
+;W[cb]
+;B[df]
+;W[eg]
+;B[ce]
+;W[cg]
+;B[pc]
+;W[pe]
+;B[nb]
+;W[if]
+;B[ke]
+;W[rf]
+;B[rg]
+;W[qg]
+;B[sf]
+;W[eb]
+;B[ec]
+;W[dc]
+;B[ee]
+;W[ed]
+;B[fd]
+;W[fb]
+;B[gb]
+;W[ge]
+;B[gc]
+;W[oc]
+;B[ob]
+;W[in]
+;B[lo]
+;W[no]
+;B[nn]
+;W[op]
+;B[oo]
+;W[lr]
+;B[kr]
+;W[jl]
+;B[ld]
+;W[mc]
+;B[lc]
+;W[mb]
+;B[nc]
+;W[rh]
+;B[rj]
+;W[sg]
+;B[od]
+;W[md]
+;B[oe]
+;W[mf]
+;B[lb]
+;W[kg]
+;B[lf]
+;W[nf]
+;B[of]
+;W[og]
+;B[lg]
+;W[nh]
+;B[li]
+;W[ji]
+;B[dk]
+;W[ck]
+;B[cj]
+;W[dj]
+;B[cl]
+;W[bk]
+;B[dl]
+;W[bl]
+;B[el]
+;W[kn]
+;B[em]
+;W[en]
+;B[ho]
+;W[hp]
+;B[ip]
+;W[fm]
+;B[fl]
+;W[fn]
+;B[hl]
+;W[io]
+;B[bp]
+;W[hj]
+;B[ik]
+;W[gl]
+;B[gk]
+;W[gm]
+;B[fk]
+;W[hk]
+;B[hm]
+;W[iq]
+;B[jp]
+;W[hr]
+;B[ir]
+;W[gr]
+;B[mo]
+;W[bq]
+;B[bn]
+;W[bm]
+;B[ao]
+;W[jr]
+;B[bj]
+;W[ci]
+;B[bi]
+;W[bh]
+;B[jq]
+;W[is]
+;B[np]
+;W[lq]
+;B[lp]
+;W[oq]
+;B[nj]
+;W[kj]
+;B[lj]
+;W[lk]
+;B[mk]
+;W[ll]
+;B[ml]
+;W[ks]
+;B[kh]
+;W[qj]
+;B[qk]
+;W[jf]
+;B[jg]
+;W[ig]
+;B[jh]
+;W[pk]
+;B[ih]
+;W[hh]
+;B[ii]
+;W[hi]
+;B[ij]
+;W[pi]
+;B[oj]
+;W[pj]
+;B[pl]
+;W[il]
+;B[jj]
+;W[ma]
+;B[la]
+;W[jo]
+;B[kp]
+;W[ri]
+;B[rk]
+;W[kk]
+;B[lm]
+;W[km]
+;B[ln]
+;W[kf]
+;B[ki]
+;W[sr]C[Dieser Zug kommt viel zu spät, bspw. ist 198 genau 2 Punkte in Nachhand, und damit deutlich kleiner.
+
+Das gleiche gibts auch mit einem weißen Stein auf r2. Hilft das, wenn ich sowas noch raussuche?]
+;B[sq]
+;W[ok]
+;B[nk]
+;W[ol]
+;B[om]
+;W[er]
+;B[es]
+;W[fs]
+;B[ds]
+;W[he]
+;B[ie]
+;W[je]
+;B[kd]
+;W[jd]
+;B[jc]
+;W[hd]
+;B[ic]
+;W[mh]
+;B[lh]
+;W[se]
+;B[sd]
+;W[eq]
+;B[bs]
+;W[jk]
+;B[mq]
+;W[mr]
+;B[fa]
+;W[da]
+;B[oi]
+;W[hc]
+;B[hb]
+;W[sj]
+;B[sk]
+;W[si]
+;B[am]
+;W[ai]
+;B[ak]
+;W[aj]
+;B[an]
+;W[al]
+;B[mi]
+;W[ar]
+;B[bo]
+;W[ap]
+;B[aq]
+;W[qm]
+;B[pm]
+;W[ap]
+;B[hf]
+;W[eo]
+;B[aq]
+;W[hg]
+;B[as]
+;W[oh]
+;B[mg]
+;W[ng]
+;B[me]
+;W[ne]
+;B[le]
+;W[oc]
+;B[od]
+;W[oe]
+;B[oc]
+;W[nl]
+;B[nm]
+;W[na]
+;B[oa]
+;W[mp]
+;B[no]
+;W[mq]
+;B[ga]
+;W[ea]
+;B[gf]
+;W[de]
+;B[ef]
+;W[ff]
+;B[cf]
+;W[bd]
+;B[dg]
+;W[fg]
+;B[]
+;W[sf]
+;B[]
+;W[ko]
+;B[]
+;W[ni]
+;B[]
+;W[gd]
+;B[]
+;W[]TW[aa][ba][ca][ab][bb][db][ac][bc][ad][cd][ae][be][ce][ee][af][bf][cf][df][ef][gf][hf][of][qf][ag][bg][dg][gg][pg][rg][ah][ch][dh][eh][fh][gh][ph][sh][bi][ei][fi][gi][qi][bj][cj][ej][fj][gj][ak][dk][ek][fk][gk][cl][dl][el][fl][hl][kl][em][hm][im][jm][gn][hn][jn][ho][gq][hq][fr][ir][nr][or][pr][qr][gs][hs][js][ls][ms][ns][os][ps][qs][rs][ss]TB[ha][ia][ja][ka][pa][qa][ra][sa][jb][kb][pb][qb][rb][sb][kc][rc][sc][ji][mj][rl][sl][mm][qm][rm][sm][mn][on][qn][rn][sn][po][qo][ro][so][ap][cp][sp][bq][cq][ar][br][cs])
diff --git a/regression/games/kgs/yagr-gab9.2.sgf b/regression/games/kgs/yagr-gab9.2.sgf
new file mode 100644 (file)
index 0000000..42ac27a
--- /dev/null
@@ -0,0 +1,165 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[gab9]WR[8k]BR[10k]DT[2004-05-06]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]RE[B+Resign]
+;B[pp]
+;W[dd]
+;B[pd]
+;W[eq]
+;B[cf]
+;W[cp]
+;B[cm]
+;W[nq]
+;B[qm]
+;W[qf]
+;B[mc]
+;W[fc]
+;B[qh]
+;W[ef]
+;B[di]
+;W[of]
+;B[ic]
+;W[kq]
+;B[hq]
+;W[rd]
+;B[qc]
+;W[rc]
+;B[pq]
+;W[be]
+;B[bf]
+;W[cd]
+;B[bo]
+;W[qb]
+;B[pb]
+;W[bp]
+;B[co]
+;W[oh]
+;B[pj]
+;W[ho]
+;B[ip]
+;W[ko]
+;B[jo]
+;W[kn]
+;B[jn]
+;W[km]
+;B[jm]
+;W[kl]
+;B[nn]
+;W[jl]
+;B[hm]
+;W[fo]
+;B[fm]
+;W[do]
+;B[dn]
+;W[en]
+;B[em]
+;W[rb]
+;B[ap]
+;W[dq]
+;B[le]
+;W[il]
+;B[im]
+;W[gk]
+;B[fj]
+;W[hb]
+;B[ib]
+;W[aq]
+;B[ao]
+;W[br]
+;B[fr]
+;W[er]
+;B[fq]
+;W[or]
+;B[pr]
+;W[gc]
+;B[he]
+;W[rg]
+;B[rh]
+;W[fk]
+;B[ek]
+;W[dg]
+;B[ch]
+;W[lg]
+;B[kf]
+;W[nl]
+;B[nj]
+;W[ii]
+;B[kg]
+;W[ki]
+;B[pl]
+;W[fh]
+;B[gj]
+;W[gn]
+;B[gm]
+;W[hj]
+;B[gi]
+;W[pa]
+;B[oa]
+;W[qa]
+;B[ob]
+;W[ps]
+;B[qs]
+;W[os]
+;B[qr]
+;W[af]
+;B[ag]
+;W[ae]
+;B[cg]
+;W[sh]
+;B[si]
+;W[sg]
+;B[qi]
+;W[qg]
+;B[oq]
+;W[mr]
+;B[np]
+;W[mp]
+;B[mo]
+;W[om]
+;B[on]
+;W[ge]
+;B[hg]
+;W[gf]
+;B[hf]
+;W[ir]
+;B[hr]
+;W[is]
+;B[hs]
+;W[iq]
+;B[hp]
+;W[jp]
+;B[io]
+;W[lo]
+;B[nm]
+;W[ol]
+;B[nk]
+;W[ml]
+;B[mf]
+;W[ne]
+;B[nd]
+;W[hd]
+;B[id]
+;W[hc]
+;B[mg]
+;W[lh]
+;B[qe]
+;W[pe]
+;B[qd]
+;W[gp]
+;B[od]
+;W[oe]
+;B[re]
+;W[se]
+;B[mh]
+;W[fp]
+;B[hn]
+;W[go]
+;B[fn]
+;W[eo]
+;B[ng]
+;W[og]
+;B[ph]
+;W[rf]
+;B[pg]
+;W[sa]
+;B[pf])
diff --git a/regression/games/kgs/yagr-gab9.sgf b/regression/games/kgs/yagr-gab9.sgf
new file mode 100644 (file)
index 0000000..a113ad0
--- /dev/null
@@ -0,0 +1,225 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[3]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[gab9]WR[8k]BR[11k]DT[2004-04-20]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;W[jj]
+;B[jp]
+;W[dd]
+;B[jc]
+;W[cn]
+;B[gq]
+;W[qf]
+;B[mc]
+;W[qn]
+;B[mq]
+;W[ck]
+;B[cf]
+;W[df]
+;B[ch]
+;W[ce]
+;B[bf]
+;W[qi]
+;B[pl]
+;W[be]
+;B[dh]
+;W[rp]
+;B[qq]
+;W[bp]
+;B[cr]
+;W[rd]
+;B[qc]
+;W[rq]
+;B[gc]
+;W[on]
+;B[nl]
+;W[rl]
+;B[qk]
+;W[rc]
+;B[rk]
+;W[qr]
+;B[pr]
+;W[sk]
+;B[sj]
+;W[sl]
+;B[ri]
+;W[of]
+;B[ql]
+;W[qb]
+;B[pb]
+;W[oi]
+;B[rm]
+;W[qh]
+;B[rh]
+;W[rg]
+;B[qj]
+;W[rn]
+;B[sm]
+;W[ec]
+;B[fb]
+;W[eb]
+;B[ea]
+;W[da]
+;B[fa]
+;W[cb]
+;B[mn]
+;W[no]
+;B[np]
+;W[rr]
+;B[sn]
+;W[so]
+;B[mo]
+;W[jl]
+;B[jn]
+;W[br]
+;B[cq]
+;W[bq]
+;B[fn]
+;W[mk]
+;B[bj]
+;W[lf]
+;B[jg]
+;W[kh]
+;B[ke]
+;W[bk]
+;B[ge]
+;W[rb]
+;B[cj]
+;W[dk]
+;B[dm]
+;W[dj]
+;B[fh]
+;W[cm]
+;B[hm]
+;W[gj]
+;B[hh]
+;W[gl]
+;B[gm]
+;W[cs]
+;B[ds]
+;W[bs]
+;B[dr]
+;W[af]
+;B[oo]
+;W[ag]
+;B[bg]
+;W[bh]
+;B[cg]
+;W[po]
+;B[nn]
+;W[qp]
+;B[pq]
+;W[ps]
+;B[os]
+;W[qs]
+;B[oq]
+;W[pa]
+;B[oa]
+;W[qa]
+;B[oc]
+;W[dn]
+;B[em]
+;W[bi]
+;B[ci]
+;W[eo]
+;B[fp]
+;W[om]
+;B[ol]
+;W[aj]
+;B[ep]
+;W[kg]
+;B[kf]
+;W[eg]
+;B[eh]
+;W[ff]
+;B[gf]
+;W[fd]
+;B[gd]
+;W[nd]
+;B[nc]
+;W[md]
+;B[ld]
+;W[le]
+;B[hk]
+;W[gk]
+;B[hj]
+;W[pj]
+;B[jh]
+;W[ji]
+;B[ll]
+;W[nk]
+;B[kk]
+;W[jk]
+;B[me]
+;W[kd]
+;B[lc]
+;W[ne]
+;B[lg]
+;W[mf]
+;B[ki]
+;W[hl]
+;B[hi]
+;W[lh]
+;B[kj]
+;W[im]
+;B[in]
+;W[li]
+;B[lk]
+;W[km]
+;B[lm]
+;W[jm]
+;B[kn]
+;W[fc]
+;B[hb]
+;W[fe]
+;B[ml]
+;W[lj]
+;B[ek]
+;W[ej]
+;B[fk]
+;W[fj]
+;B[fg]
+;W[el]
+;B[dl]
+;W[fl]
+;B[cl]
+;W[bl]
+;B[fo]
+;W[en]
+;B[fm]
+;W[dg]
+;B[gi]
+;W[qe]
+;B[pe]
+;W[pf]
+;B[qd]
+;W[sh]
+;B[si]
+;W[sg]
+;B[ok]
+;W[oj]
+;B[od]
+;W[ii]
+;B[ih]
+;W[nm]
+;B[ik]
+;W[il]
+;B[pm]
+;W[pn]
+;B[mm]
+;W[qm]
+;B[pk]
+;W[cp]
+;B[do]
+;W[co]
+;B[fi]
+;W[oe]
+;B[]
+;W[kl]
+;B[]
+;W[ij]
+;B[]
+;W[di]
+;B[]
+;W[ei]
+;B[]
+;W[]TW[aa][ba][ca][ra][sa][ab][bb][db][sb][ac][bc][cc][dc][sc][ad][bd][cd][ed][sd][ae][de][ee][me][re][se][ef][rf][sf][ah][ai][ak][ek][fk][al][am][bm][an][bn][ao][bo][qo][ro][ap][sp][aq][sq][ar][sr][as][rs][ss]TB[pc][rj][sk][rl][sl][gn][hn][ln][go][ho][io][jo][ko][lo][no][gp][hp][ip][kp][lp][mp][op][dq][eq][fq][hq][iq][jq][kq][lq][nq][er][fr][gr][hr][ir][jr][kr][lr][mr][nr][or][es][fs][gs][hs][is][js][ks][ls][ms][ns])
diff --git a/regression/games/kgs/yagr-hasenhirn.sgf b/regression/games/kgs/yagr-hasenhirn.sgf
new file mode 100644 (file)
index 0000000..0bf9dc9
--- /dev/null
@@ -0,0 +1,140 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[4]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[hasenhirn]WR[8k]BR[12k]DT[2004-07-04]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.8
+]RE[B+Resign]
+;W[cn]
+;B[en]
+;W[dl]
+;B[kp]
+;W[fd]
+;B[ef]
+;W[pn]
+;B[rp]
+;W[nc]
+;B[ne]
+;W[ld]
+;B[pj]
+;W[pg]
+;B[qm]
+;W[gp]
+;B[fq]
+;W[gq]
+;B[iq]
+;W[gn]
+;B[bp]
+;W[ec]
+;B[dc]
+;W[fp]
+;B[eq]
+;W[id]
+;B[di]
+;W[nn]
+;B[np]
+;W[cj]
+;B[ci]
+;W[bj]
+;B[bi]
+;W[pm]
+;B[pl]
+;W[gr]
+;B[fr]
+;W[js]
+;B[jr]
+;W[is]
+;B[hr]
+;W[hs]
+;B[lr]
+;W[pc]
+;B[qc]
+;W[pb]
+;B[qb]
+;W[jo]
+;B[ko]
+;W[qi]
+;B[qj]
+;W[rg]
+;B[re]
+;W[pi]
+;B[oi]
+;W[oh]
+;B[ni]
+;W[rj]
+;B[rk]
+;W[ri]
+;B[go]
+;W[ho]
+;B[fo]
+;W[do]
+;B[eo]
+;W[ep]
+;B[hp]
+;W[dq]
+;B[cp]
+;W[cq]
+;B[hq]
+;W[in]
+;B[gs]
+;W[eb]
+;B[db]
+;W[da]
+;B[ca]
+;W[ea]
+;B[bb]
+;W[ai]
+;B[ah]
+;W[aj]
+;B[bg]
+;W[sk]
+;B[rl]
+;W[qh]
+;B[og]
+;W[nh]
+;B[mh]
+;W[qf]
+;B[ng]
+;W[sh]
+;B[sj]
+;W[ph]
+;B[rf]
+;W[si]
+;B[pf]
+;W[kn]
+;B[ln]
+;W[km]
+;B[lm]
+;W[kl]
+;B[ll]
+;W[ic]
+;B[kk]
+;W[jk]
+;B[kj]
+;W[ip]
+;B[jp]
+;W[io]
+;B[jj]
+;W[ik]
+;B[ij]
+;W[hk]
+;B[ek]
+;W[hj]
+;B[hi]
+;W[if]
+;B[hm]
+;W[gm]
+;B[gj]
+;W[gi]
+;B[gh]
+;W[el]
+;B[fk]
+;W[fl]
+;B[gl]
+;W[gk]
+;B[fi]
+;W[im]
+;B[dk]
+;W[cl]
+;B[ck]
+;W[bk]
+;B[dj]
+;W[bm]
+;B[fm])
diff --git a/regression/games/kgs/yagr-ituyosi.sgf b/regression/games/kgs/yagr-ituyosi.sgf
new file mode 100644 (file)
index 0000000..168f141
--- /dev/null
@@ -0,0 +1,205 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[4]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[ituyosi]WR[8k]BR[12k]DT[2004-05-04]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;W[cn]
+;B[pj]
+;W[nq]
+;B[qn]
+;W[pr]
+;B[qq]
+;W[kq]
+;B[gq]
+;W[fc]
+;B[iq]
+;W[nc]
+;B[pg]
+;W[jd]
+;B[pc]
+;W[ck]
+;B[ch]
+;W[bp]
+;B[cf]
+;W[db]
+;B[cq]
+;W[cc]
+;B[cd]
+;W[ld]
+;B[hd]
+;W[hc]
+;B[fd]
+;W[gd]
+;B[he]
+;W[ge]
+;B[je]
+;W[ke]
+;B[jf]
+;W[gf]
+;B[hf]
+;W[no]
+;B[kf]
+;W[lf]
+;B[kh]
+;W[id]
+;B[ie]
+;W[bq]
+;B[gg]
+;W[ql]
+;B[pl]
+;W[qm]
+;B[pm]
+;W[rn]
+;B[pn]
+;W[rj]
+;B[qk]
+;W[rh]
+;B[rk]
+;W[qf]
+;B[pf]
+;W[rd]
+;B[qe]
+;W[re]
+;B[qd]
+;W[rc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[qr]
+;B[ro]
+;W[mm]
+;B[bc]
+;W[bb]
+;B[dc]
+;W[cb]
+;B[ec]
+;W[eb]
+;B[ef]
+;W[jo]
+;B[bd]
+;W[kj]
+;B[hh]
+;W[cr]
+;B[dr]
+;W[br]
+;B[cp]
+;W[bi]
+;B[dn]
+;W[dm]
+;B[cm]
+;W[cl]
+;B[co]
+;W[bn]
+;B[bo]
+;W[ao]
+;B[en]
+;W[em]
+;B[fn]
+;W[rq]
+;B[rp]
+;W[bh]
+;B[bg]
+;W[jr]
+;B[ir]
+;W[il]
+;B[rr]
+;W[mj]
+;B[mk]
+;W[nk]
+;B[nj]
+;W[ok]
+;B[oj]
+;W[lk]
+;B[mi]
+;W[lj]
+;B[pk]
+;W[rs]
+;B[sq]
+;W[qg]
+;B[mf]
+;W[lg]
+;B[mg]
+;W[ph]
+;B[lh]
+;W[ds]
+;B[er]
+;W[oh]
+;B[ni]
+;W[fe]
+;B[ed]
+;W[fj]
+;B[gl]
+;W[ci]
+;B[dh]
+;W[qb]
+;B[ej]
+;W[fk]
+;B[dj]
+;W[di]
+;B[ei]
+;W[pb]
+;B[oc]
+;W[ob]
+;B[mc]
+;W[nb]
+;B[im]
+;W[jm]
+;B[jl]
+;W[jk]
+;B[jn]
+;W[kl]
+;B[km]
+;W[in]
+;B[jl]
+;W[kn]
+;B[jq]
+;W[kr]
+;B[nn]
+;W[hm]
+;B[mn]
+;W[ln]
+;B[mo]
+;W[oo]
+;B[nm]
+;W[ml]
+;B[kp]
+;W[jp]
+;B[lp]
+;W[mp]
+;B[mq]
+;W[np]
+;B[lq]
+;W[hl]
+;B[gk]
+;W[go]
+;B[fo]
+;W[ff]
+;B[ee]
+;W[fg]
+;B[eh]
+;W[fh]
+;B[ek]
+;W[fl]
+;B[gm]
+;W[gp]
+;B[fi]
+;W[gj]
+;B[gi]
+;W[gh]
+;B[hi]
+;W[es]
+;B[fr]
+;W[fp]
+;B[ep]
+;W[ac]
+;B[ad]
+;W[ab]
+;B[lo]
+;W[ip]
+;B[hq]
+;W[gn]
+;B[fm]
+;W[bm]
+;B[el]
+;W[hj]
+;B[hk]
+;W[ij])
diff --git a/regression/games/kgs/yagr-justre1.sgf b/regression/games/kgs/yagr-justre1.sgf
new file mode 100644 (file)
index 0000000..eaa2c49
--- /dev/null
@@ -0,0 +1,150 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[4]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[justre1]WR[8k]BR[16k]DT[2004-08-24]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.10
+]
+;W[cn]
+;B[fp]
+;W[ci]
+;B[fd]
+;W[hc]
+;B[nd]
+;W[qn]
+;B[pn]
+;W[pm]
+;B[qo]
+;W[on]
+;B[po]
+;W[om]
+;B[qm]
+;W[ql]
+;B[rn]
+;W[rm]
+;B[rl]
+;W[qn]
+;B[ro]
+;W[bp]
+;B[qm]
+;W[cq]
+;B[dq]
+;W[cf]
+;B[cd]
+;W[kc]
+;B[sm]
+;W[qk]
+;B[mc]
+;W[hq]
+;B[hp]
+;W[ip]
+;B[gq]
+;W[ho]
+;B[go]
+;W[qf]
+;B[qd]
+;W[fb]
+;B[gc]
+;W[gb]
+;B[hd]
+;W[ic]
+;B[id]
+;W[gp]
+;B[gn]
+;W[mq]
+;B[hp]
+;W[hr]
+;B[gr]
+;W[pr]
+;B[qq]
+;W[ke]
+;B[mf]
+;W[hn]
+;B[hm]
+;W[jo]
+;B[fl]
+;W[dl]
+;B[em]
+;W[qr]
+;B[rr]
+;W[im]
+;B[hl]
+;W[il]
+;B[no]
+;W[oo]
+;B[op]
+;W[np]
+;B[nq]
+;W[mp]
+;B[mo]
+;W[lo]
+;B[mm]
+;W[nr]
+;B[oq]
+;W[or]
+;B[nm]
+;W[ok]
+;B[nk]
+;W[nj]
+;B[mk]
+;W[mj]
+;B[kj]
+;W[lk]
+;B[ll]
+;W[kk]
+;B[kl]
+;W[jk]
+;B[ik]
+;W[jd]
+;B[kn]
+;W[ln]
+;B[ol]
+;W[pl]
+;B[nl]
+;W[jm]
+;B[rk]
+;W[mn]
+;B[gj]
+;W[ge]
+;B[gd]
+;W[og]
+;B[of]
+;W[lb]
+;B[mb]
+;W[ij]
+;B[hk]
+;W[ki]
+;B[jj]
+;W[lj]
+;B[jl]
+;W[io]
+;B[ji]
+;W[ii]
+;B[jh]
+;W[kh]
+;B[jg]
+;W[ih]
+;B[hg]
+;W[ig]
+;B[if]
+;W[jf]
+;B[kg]
+;W[lg]
+;B[ie]
+;W[gf]
+;B[hf]
+;W[ee]
+;B[ed]
+;W[gi]
+;B[hj]
+;W[hi]
+;B[fi]
+;W[gh]
+;B[fh]
+;W[gg]
+;B[fg]
+;W[be]
+;B[bd]
+;W[fe]
+;B[df]
+;W[de]
+;B[ce]
+;W[bf]
+;B[dg])
diff --git a/regression/games/kgs/yagr-nigiri.sgf b/regression/games/kgs/yagr-nigiri.sgf
new file mode 100644 (file)
index 0000000..14620e3
--- /dev/null
@@ -0,0 +1,269 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[6]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[nigiri]WR[8k]BR[14k]DT[2004-08-23]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dj][pj][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.10
+]RE[W+6.50]
+;W[fq]
+;B[dm]
+;W[iq]
+;B[lq]
+;W[fd]
+;B[df]
+;W[dc]
+;B[cc]
+;W[ec]
+;B[hd]
+;W[cb]
+;B[bc]
+;W[nc]
+;B[lc]
+;W[ne]
+;B[pf]
+;W[ng]
+;B[pn]
+;W[oh]
+;B[ph]
+;W[dr]
+;B[cq]
+;W[qq]
+;B[pq]
+;W[qp]
+;B[qo]
+;W[pr]
+;B[or]
+;W[ro]
+;B[rn]
+;W[sp]
+;B[qr]
+;W[rr]
+;B[ps]
+;W[rs]
+;B[cr]
+;W[bb]
+;B[ce]
+;W[pb]
+;B[qc]
+;W[qb]
+;B[rb]
+;W[nj]
+;B[gf]
+;W[ol]
+;B[ql]
+;W[jh]
+;B[jj]
+;W[hh]
+;B[gb]
+;W[fh]
+;B[dh]
+;W[he]
+;B[ie]
+;W[ge]
+;B[hf]
+;W[ff]
+;B[gd]
+;W[fe]
+;B[ig]
+;W[gg]
+;B[ih]
+;W[fj]
+;B[fl]
+;W[fb]
+;B[fo]
+;W[ml]
+;B[kl]
+;W[mn]
+;B[kn]
+;W[kf]
+;B[li]
+;W[jc]
+;B[jd]
+;W[kc]
+;B[kd]
+;W[lb]
+;B[mc]
+;W[ii]
+;B[hi]
+;W[ji]
+;B[hg]
+;W[gh]
+;B[hj]
+;W[mb]
+;B[le]
+;W[jf]
+;B[if]
+;W[ab]
+;B[lf]
+;W[ki]
+;B[kj]
+;W[md]
+;B[ld]
+;W[lh]
+;B[mi]
+;W[mh]
+;B[ni]
+;W[oi]
+;B[mj]
+;W[pi]
+;B[qh]
+;W[kq]
+;B[oj]
+;W[nh]
+;B[kg]
+;W[lg]
+;B[jg]
+;W[kh]
+;B[nk]
+;W[lp]
+;B[mq]
+;W[jo]
+;B[ko]
+;W[qi]
+;B[qj]
+;W[rh]
+;B[rg]
+;W[ri]
+;B[rj]
+;W[kr]
+;B[kp]
+;W[jp]
+;B[in]
+;W[sg]
+;B[rf]
+;W[gk]
+;B[hk]
+;W[gl]
+;B[fk]
+;W[ej]
+;B[gj]
+;W[dk]
+;B[cj]
+;W[dl]
+;B[em]
+;W[el]
+;B[gm]
+;W[bl]
+;B[hl]
+;W[ek]
+;B[ei]
+;W[fi]
+;B[eg]
+;W[fg]
+;B[cl]
+;W[ck]
+;B[cm]
+;W[bj]
+;B[bi]
+;W[ai]
+;B[bh]
+;W[ao]
+;B[bm]
+;W[am]
+;B[bp]
+;W[ah]
+;B[ag]
+;W[aj]
+;B[bg]
+;W[sf]
+;B[se]
+;W[sh]
+;B[re]
+;W[eq]
+;B[ic]
+;W[jb]
+;B[ib]
+;W[gc]
+;B[hc]
+;W[ha]
+;B[ja]
+;W[kb]
+;B[ga]
+;W[ia]
+;B[hb]
+;W[ia]
+;B[fa]
+;W[ea]
+;B[fc]
+;W[eb]
+;B[me]
+;W[nd]
+;B[nf]
+;W[of]
+;B[oe]
+;W[mf]
+;B[hp]
+;W[hq]
+;B[dq]
+;W[gp]
+;B[ho]
+;W[jn]
+;B[jm]
+;W[er]
+;B[fp]
+;W[ra]
+;B[rc]
+;W[ac]
+;B[bd]
+;W[cs]
+;B[ad]
+;W[br]
+;B[bq]
+;W[od]
+;B[pe]
+;W[go]
+;B[gn]
+;W[gq]
+;B[pg]
+;W[lr]
+;B[mr]
+;W[bn]
+;B[cn]
+;W[eh]
+;B[di]
+;W[ef]
+;B[dg]
+;W[bk]
+;B[ap]
+;W[ed]
+;B[bo]
+;W[bs]
+;B[an]
+;W[qs]
+;B[pr]
+;W[al]
+;B[og]
+;W[nf]
+;B[de]
+;W[ij]
+;B[ik]
+;W[ep]
+;B[eo]
+;W[pc]
+;B[ls]
+;W[ks]
+;B[ms]
+;W[io]
+;B[hn]
+;W[ip]
+;B[sn]
+;W[rp]
+;B[ar]
+;W[sj]
+;B[sk]
+;W[si]
+;B[rk]
+;W[sb]
+;B[sc]
+;W[qa]
+;B[sa]
+;W[qn]
+;B[qm]
+;W[sb]
+;B[aq]
+;W[sa]
+;B[as]
+;W[ds]
+;B[ee]
+;W[sr]
+;B[so]
+;W[gi]
+;B[]
+;W[]TW[aa][ba][ca][da][fa][ga][ha][ja][ka][la][ma][na][oa][pa][db][gb][hb][ib][nb][ob][fc][gc][hc][ic][lc][mc][oc][gd][hd][id][jd][kd][ld][ie][je][ke][le][me][gf][hf][if][lf][hg][ig][jg][kg][mg][ih][ak][jq][rq][sq][fr][gr][hr][ir][jr][es][fs][gs][hs][is][js][ss]TB[cd][qd][rd][sd][ae][be][qe][af][bf][cf][qf][cg][qg][ch][ci][lj][nj][gk][jk][kk][lk][mk][ok][pk][qk][gl][il][jl][ll][ml][nl][ol][pl][rl][sl][fm][hm][im][km][lm][mm][nm][om][pm][rm][sm][bn][dn][en][fn][ln][mn][nn][on][qn][ao][co][do][lo][mo][no][oo][po][cp][lp][mp][np][op][nq][oq][nr][ns][os])
diff --git a/regression/games/kgs/yagr-r08ert.sgf b/regression/games/kgs/yagr-r08ert.sgf
new file mode 100644 (file)
index 0000000..4ad8495
--- /dev/null
@@ -0,0 +1,251 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[5.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[r08ert]WR[8k]BR[8k]DT[2004-07-01]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.8
+]RE[B+7.50]
+;B[pq]
+;W[dd]
+;B[dq]
+;W[co]
+;B[pd]
+;W[ep]
+;B[fc]
+;W[eq]
+;B[jd]
+;W[dr]
+;B[pj]
+;W[po]
+;B[mp]
+;W[qq]
+;B[pp]
+;W[nc]
+;B[nd]
+;W[md]
+;B[ne]
+;W[oc]
+;B[pc]
+;W[lc]
+;B[kb]
+;W[pb]
+;B[qb]
+;W[lb]
+;B[od]
+;W[lf]
+;B[cf]
+;W[ee]
+;B[dj]
+;W[cl]
+;B[ck]
+;W[qp]
+;B[qm]
+;W[pr]
+;B[or]
+;W[oo]
+;B[oq]
+;W[kq]
+;B[lq]
+;W[kp]
+;B[qn]
+;W[qr]
+;B[qo]
+;W[ro]
+;B[rq]
+;W[rp]
+;B[rr]
+;W[dl]
+;B[kc]
+;W[df]
+;B[ce]
+;W[dg]
+;B[cg]
+;W[ec]
+;B[fd]
+;W[om]
+;B[kr]
+;W[jr]
+;B[lr]
+;W[iq]
+;B[mn]
+;W[sl]
+;B[rl]
+;W[mm]
+;B[nn]
+;W[pm]
+;B[pl]
+;W[lm]
+;B[nm]
+;W[sm]
+;B[ol]
+;W[gf]
+;B[he]
+;W[gh]
+;B[fj]
+;W[kd]
+;B[ic]
+;W[gl]
+;B[jl]
+;W[kk]
+;B[kl]
+;W[hj]
+;B[ll]
+;W[ml]
+;B[jk]
+;W[lk]
+;B[ji]
+;W[nk]
+;B[jg]
+;W[il]
+;B[jn]
+;W[li]
+;B[pg]
+;W[io]
+;B[ke]
+;W[ob]
+;B[le]
+;W[mg]
+;B[kj]
+;W[lj]
+;B[ni]
+;W[me]
+;B[nf]
+;W[ln]
+;B[im]
+;W[hm]
+;B[lo]
+;W[mf]
+;B[sn]
+;W[ld]
+;B[kf]
+;W[kg]
+;B[jf]
+;W[rn]
+;B[rm]
+;W[sk]
+;B[rj]
+;W[ih]
+;B[jh]
+;W[qa]
+;B[rb]
+;W[cd]
+;B[fb]
+;W[eb]
+;B[bk]
+;W[dh]
+;B[ch]
+;W[sj]
+;B[si]
+;W[so]
+;B[rk]
+;W[ng]
+;B[og]
+;W[ko]
+;B[ps]
+;W[rs]
+;B[sr]
+;W[km]
+;B[jm]
+;W[be]
+;B[bf]
+;W[bd]
+;B[ea]
+;W[da]
+;B[fa]
+;W[cb]
+;B[kn]
+;W[bl]
+;B[nl]
+;W[mk]
+;B[kh]
+;W[mi]
+;B[mb]
+;W[oi]
+;B[oj]
+;W[nj]
+;B[oh]
+;W[ka]
+;B[ja]
+;W[la]
+;B[jb]
+;W[ak]
+;B[aj]
+;W[al]
+;B[bi]
+;W[ah]
+;B[ai]
+;W[nh]
+;B[pi]
+;W[ra]
+;B[pa]
+;W[oa]
+;B[sb]
+;W[af]
+;B[ag]
+;W[bg]
+;B[bh]
+;W[lp]
+;B[mo]
+;W[ge]
+;B[gd]
+;W[hf]
+;B[if]
+;W[ik]
+;B[jo]
+;W[jp]
+;B[ii]
+;W[hh]
+;B[fe]
+;W[in]
+;B[jj]
+;W[ff]
+;B[fk]
+;W[fl]
+;B[ek]
+;W[ei]
+;B[el]
+;W[em]
+;B[fi]
+;W[fh]
+;B[di]
+;W[lg]
+;B[ig]
+;W[gk]
+;B[hg]
+;W[ks]
+;B[ls]
+;W[js]
+;B[gg]
+;W[gj]
+;B[fg]
+;W[ef]
+;B[gi]
+;W[hi]
+;B[eg]
+;W[dk]
+;B[ej]
+;W[cj]
+;B[ci]
+;W[bj]
+;B[ag]
+;W[eh]
+;B[ae]
+;W[ad]
+;B[ed]
+;W[af]
+;B[dc]
+;W[db]
+;B[ae]
+;W[de]
+;B[af]
+;W[lh]
+;B[ni]
+;W[ok]
+;B[pk]
+;W[oi]
+;B[sa]
+;W[pa]
+;B[qc]
+;W[ni]
+;B[ij]
+;W[ki]
+;B[hd]
+;W[]
+;B[]TW[aa][ba][ca][ma][na][ab][bb][mb][nb][ac][bc][cc][dc][mc][mh][mj][bk][ck][hk][hl][am][bm][cm][dm][fm][gm][an][bn][cn][dn][en][fn][gn][hn][ao][bo][do][eo][fo][go][ho][ap][bp][cp][dp][fp][gp][hp][ip][aq][bq][cq][dq][fq][gq][hq][jq][ar][br][cr][er][fr][gr][hr][ir][as][bs][cs][ds][es][fs][gs][hs][is]TB[ga][ha][ia][gb][hb][ib][gc][hc][jc][rc][sc][id][qd][rd][sd][ie][je][oe][pe][qe][re][se][of][pf][qf][rf][sf][bg][qg][rg][sg][ah][ph][qh][rh][sh][qi][ri][qj][sj][qk][sk][ql][sl][om][pm][sm][on][pn][rn][sn][no][oo][po][ro][so][np][op][qp][rp][sp][mq][nq][qq][sq][mr][nr][pr][qr][ms][ns][os][qs][rs][ss])
diff --git a/regression/games/kgs/yagr-yudeta.sgf b/regression/games/kgs/yagr-yudeta.sgf
new file mode 100644 (file)
index 0000000..5782f52
--- /dev/null
@@ -0,0 +1,312 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[6]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[yudeta]WR[8k]BR[19k]DT[2004-06-11]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][dj][pj][dp][pp]C[yagr [8k\]: GTP Engine for yagr (white): GNU Go version 3.5.8
+]RE[W+72.50]
+;W[cn]
+;B[co]
+;W[dn]
+;B[hq]
+;W[ep]
+;B[dq]
+;W[np]
+;B[oq]
+;W[qn]
+;B[po]
+;W[rp]
+;B[pn]
+;W[rr]
+;B[qq]
+;W[nd]
+;B[rq]
+;W[ro]
+;B[sq]
+;W[fd]
+;B[pg]
+;W[df]
+;B[ee]
+;W[cc]
+;B[ff]
+;W[nq]
+;B[oc]
+;W[nc]
+;B[ob]
+;W[nb]
+;B[jd]
+;W[eg]
+;B[ce]
+;W[fh]
+;B[fj]
+;W[dc]
+;B[ed]
+;W[ge]
+;B[fe]
+;W[cf]
+;B[hh]
+;W[gd]
+;B[ch]
+;W[be]
+;B[bg]
+;W[gg]
+;B[bf]
+;W[bd]
+;B[fg]
+;W[ec]
+;B[eh]
+;W[gf]
+;B[gh]
+;W[dl]
+;B[fi]
+;W[kc]
+;B[dg]
+;W[ke]
+;B[kd]
+;W[mc]
+;B[ld]
+;W[lc]
+;B[le]
+;W[jc]
+;B[if]
+;W[ic]
+;B[id]
+;W[kq]
+;B[jj]
+;W[nn]
+;B[pl]
+;W[rm]
+;B[rk]
+;W[ho]
+;B[jp]
+;W[gm]
+;B[im]
+;W[fp]
+;B[eq]
+;W[fq]
+;B[fr]
+;W[gr]
+;B[gq]
+;W[er]
+;B[dr]
+;W[fs]
+;B[eo]
+;W[bo]
+;B[do]
+;W[bp]
+;B[fn]
+;W[gp]
+;B[fm]
+;W[fl]
+;B[go]
+;W[io]
+;B[hp]
+;W[hr]
+;B[fo]
+;W[fr]
+;B[ir]
+;W[jq]
+;B[iq]
+;W[ip]
+;B[jr]
+;W[kr]
+;B[ds]
+;W[em]
+;B[jo]
+;W[hn]
+;B[gl]
+;W[hm]
+;B[hl]
+;W[js]
+;B[ek]
+;W[el]
+;B[dk]
+;W[ck]
+;B[cj]
+;W[bk]
+;B[bj]
+;W[oe]
+;B[nf]
+;W[pe]
+;B[qd]
+;W[qe]
+;B[rd]
+;W[qg]
+;B[qf]
+;W[rf]
+;B[pf]
+;W[re]
+;B[qh]
+;W[rg]
+;B[od]
+;W[ne]
+;B[na]
+;W[ma]
+;B[oa]
+;W[ln]
+;B[jn]
+;W[mk]
+;B[mm]
+;W[mf]
+;B[lf]
+;W[ng]
+;B[oh]
+;W[of]
+;B[mg]
+;W[mh]
+;B[lg]
+;W[nh]
+;B[ni]
+;W[lm]
+;B[ml]
+;W[ll]
+;B[lk]
+;W[lj]
+;B[kk]
+;W[mj]
+;B[mi]
+;W[nl]
+;B[nk]
+;W[nm]
+;B[ol]
+;W[li]
+;B[lh]
+;W[nj]
+;B[oi]
+;W[og]
+;B[ph]
+;W[or]
+;B[qr]
+;W[sd]
+;B[sc]
+;W[se]
+;B[rc]
+;W[ok]
+;B[pk]
+;W[kj]
+;B[rh]
+;W[aj]
+;B[ai]
+;W[ak]
+;B[bi]
+;W[ji]
+;B[ij]
+;W[kl]C[mgoetze [2k?\]: N17?!?
+]
+;B[jk]
+;W[hd]
+;B[he]
+;W[ii]
+;B[hi]
+;W[jl]
+;B[kh]
+;W[il]
+;B[ki]
+;W[hj]
+;B[hg]
+;W[gj]
+;B[hf]
+;W[ih]
+;B[jg]
+;W[pr]
+;B[jh]
+;W[ik]
+;B[ig]
+;W[pq]C[sita [3d\]: well, it's bad, but not that bad, right?
+]
+;B[qp]
+;W[qs]C[sita [3d\]: at least it makes o19 gote.
+]
+;B[sr]
+;W[rs]
+;B[ss]
+;W[ps]
+;B[op]
+;W[nr]
+;B[no]
+;W[mo]
+;B[oo]
+;W[cd]
+;B[de]
+;W[oj]
+;B[pi]C[sita [3d\]: I think, that is what gnugo evaluated.
+]
+;W[sh]
+;B[si]C[mgoetze [2k?\]: hm well i thought it's pretty bad....
+]
+;W[sj]
+;B[ri]
+;W[sg]
+;B[sk]
+;W[af]
+;B[ag]
+;W[ae]
+;B[ef]
+;W[me]
+;B[fk]
+;W[gk]
+;B[ij]
+;W[jj]
+;B[in]
+;W[is]C[sita [3d\]: arguing with human standards, maybe
+]
+;B[mp]
+;W[om]
+;B[pm]
+;W[gi]
+;B[fh]
+;W[on]
+;B[lp]
+;W[kp]
+;B[lo]
+;W[mn]
+;B[ko]
+;W[mq]
+;B[lq]
+;W[lr]
+;B[cl]
+;W[bl]
+;B[cm]
+;W[bq]
+;B[bm]
+;W[bn]
+;B[al]
+;W[an]
+;B[am]
+;W[dm]
+;B[br]
+;W[ar]
+;B[cr]
+;W[bs]
+;B[ap]
+;W[aq]
+;B[cs]
+;W[as]
+;B[cq]
+;W[cp]C[sita [3d\]: b3 was a big blunder...
+mgoetze [2k?\]: yah
+sita [3d\]: maybe that's something for the regression tests...
+]
+;B[lb]
+;W[la]
+;B[mb]
+;W[ka]
+;B[kb]
+;W[ja]
+;B[jb]
+;W[ia]
+;B[ib]
+;W[hb]C[sita [3d\]: I think I'll send it in.
+]
+;B[]
+;W[md]
+;B[gc]
+;W[hc]
+;B[gb]
+;W[fb]
+;B[ga]
+;W[fa]
+;B[fc]
+;W[ha]
+;B[gc]
+;W[gb]
+;B[]
+;W[]TW[aa][ba][ca][da][ea][ga][ab][bb][cb][db][eb][ib][jb][kb][lb][mb][ac][bc][fc][gc][ad][nf][sf][ij][hk][jk][kk][lk][nk][gl][hl][ml][fm][im][jm][km][mm][en][fn][gn][in][jn][kn][ao][co][do][eo][fo][go][jo][ko][lo][ap][dp][hp][jp][lp][mp][cq][dq][eq][gq][hq][iq][lq][br][cr][dr][ir][jr][mr][cs][ds][es][gs][hs][ks][ls][ms][ns][os]TB[pa][qa][ra][sa][pb][qb][rb][sb][pc][qc][ie][je][ke][cf][df][jf][kf][cg][eg][kg][ah][bh][dh][ci][di][ei][qi][aj][ej][qj][rj][sj][ak][bk][ck][qk][bl][ql][rl][sl][qm][rm][sm][qn][rn][sn][qo][ro][so][rp][sp]C[mgoetze [2k?\]: :)
+])
diff --git a/regression/games/kgs/yagr.sgf b/regression/games/kgs/yagr.sgf
new file mode 100644 (file)
index 0000000..0dccd61
--- /dev/null
@@ -0,0 +1,287 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Japanese]SZ[19]HA[5]KM[0.50]
+PW[sita]PB[sita]WR[2d]BR[2d]DT[2004-04-08]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][jj][dp][pp]
+;W[mq]
+;B[oq]
+;W[fq]
+;B[kq]
+;W[mo]
+;B[dn]
+;W[dr]
+;B[hq]
+;W[cq]
+;B[eq]
+;W[er]
+;B[fp]
+;W[gq]
+;B[gp]
+;W[hr]
+;B[ck]
+;W[iq]
+;B[ko]
+;W[hp]
+;B[ch]
+;W[mm]
+;B[jd]
+;W[jl]
+;B[hk]
+;W[hn]
+;B[pj]
+;W[gd]
+;B[df]
+;W[co]
+;B[pm]
+;W[eo]
+;B[do]
+;W[cn]
+;B[mj]
+;W[cl]
+;B[cp]
+;W[bp]
+;B[ep]
+;W[dm]
+;B[dk]
+;W[em]
+;B[nc]
+;W[pg]
+;B[qh]
+;W[qg]
+;B[qe]
+;W[jc]
+;B[ic]
+;W[id]
+;B[hc]
+;W[hd]
+;B[je]
+;W[gc]
+;B[rh]
+;W[rg]
+;B[gb]
+;W[fb]
+;B[jb]
+;W[kc]
+;B[lb]
+;W[kb]
+;B[le]
+;W[ph]
+;B[of]
+;W[qi]
+;B[ri]
+;W[qj]
+;B[rj]
+;W[qk]
+;B[rk]
+;W[ql]
+;B[rl]
+;W[qm]
+;B[rm]
+;W[qn]
+;B[rn]
+;W[qo]
+;B[oi]
+;W[pi]
+;B[oj]
+;W[ro]
+;B[sn]
+;W[pn]
+;B[qq]
+;W[ib]
+;B[jn]
+;W[im]
+;B[db]
+;W[hb]
+;B[gg]
+;W[ce]
+;B[de]
+;W[cc]
+;B[dc]
+;W[ie]
+;B[jf]
+;W[fg]
+;B[ff]
+;W[hg]
+;B[hf]
+;W[gh]
+;B[gf]
+;W[ik]
+;B[hh]
+;W[hi]
+;B[ih]
+;W[gj]
+;B[fh]
+;W[fi]
+;B[eh]
+;W[ei]
+;B[rf]
+;W[dh]
+;B[ci]
+;W[eg]
+;B[if]
+;W[ii]
+;B[ji]
+;W[ld]
+;B[nr]
+;W[mr]
+;B[on]
+;W[oo]
+;B[om]
+;W[po]
+;B[nn]
+;W[no]
+;B[mn]
+;W[ln]
+;B[lo]
+;W[lm]
+;B[nl]
+;W[km]
+;B[lr]
+;W[ms]
+;B[jr]
+;W[ks]
+;B[rq]
+;W[ls]
+;B[js]
+;W[nq]
+;B[pr]
+;W[ns]
+;B[or]
+;W[so]
+;B[bl]
+;W[bm]
+;B[dg]
+;W[bk]
+;B[bj]
+;W[al]
+;B[la]
+;W[ka]
+;B[sg]
+;W[me]
+;B[md]
+;W[mc]
+;B[nd]
+;W[mb]
+;B[nb]
+;W[lc]
+;B[kd]
+;W[jp]
+;B[ng]
+;W[lj]
+;B[li]
+;W[kj]
+;B[ki]
+;W[mk]
+;B[nk]
+;W[op]
+;B[lk]
+;W[kk]
+;B[ij]
+;W[hj]
+;B[jk]
+;W[il]
+;B[kl]
+;W[qp]
+;B[os]
+;W[jm]
+;B[fk]
+;W[gk]
+;B[fl]
+;W[fm]
+;B[gl]
+;W[hl]
+;B[gm]
+;W[gn]
+;B[na]
+;W[ma]
+;B[eb]
+;W[pq]
+;B[qs]
+;W[cd]
+;B[cb]
+;W[bg]
+;B[cf]
+;W[bf]
+;B[bc]
+;W[bh]
+;B[cg]
+;W[aj]C[burtabel [5d\]: wer ist gnugo?
+sita [2d\]: schwarz
+sita [2d\]: nächster zug sollte wohl a11 sein
+sita [2d\]: ist doch auch alles nicht schwierig zu lesen, denke ich.
+burtabel [5d\]: und Partiezug?
+sita [2d\]: (falls ich nix übersehe ;-)
+]
+;B[be]C[sita [2d\]: und dann wurd's noch besser
+]
+;W[bi]
+;B[af]C[burtabel [5d\]: ui
+sita [2d\]: a14 ist ja gänzlich daneben
+burtabel [5d\]: ja, so was nehme ich gerne ...
+sita [2d\]: gut, wenn ich ganz absurd sage, dann meine ich das auch. ;)
+sita [2d\]: kannst du's direkt speichern?
+]
+;W[cj]
+;B[dj]
+;W[ll]
+;B[bj]
+;W[kk]
+;B[ag]
+;W[ai]
+;B[ml]
+;W[rr]
+;B[qr]
+;W[sq]
+;B[sr]
+;W[ss]
+;B[rs]
+;W[sp]
+;B[sr]
+;W[cj]
+;B[ek]
+;W[kj]
+;B[fc]
+;W[ga]
+;B[fd]
+;W[ge]
+;B[di]
+;W[bj]
+;B[eh]
+;W[fh]
+;B[ef]
+;W[fj]
+;B[fe]
+;W[pf]
+;B[pe]
+;W[og]
+;B[nf]
+;W[oh]
+;B[nh]
+;W[pl]
+;B[ea]
+;W[fa]
+;B[dh]
+;W[pp]
+;B[lj]
+;W[kl]
+;B[hm]
+;W[in]
+;B[ae]
+;W[dl]
+;B[ol]
+;W[pk]
+;B[ok]
+;W[kp]
+;B[qf]
+;W[lp]
+;B[ej]
+;W[]
+;B[rp]
+;W[]
+;B[el]
+;W[]
+;B[he]
+;W[]
+;B[ah]
+;W[]
+;B[nm]
+;W[]
+;B[]TW[la][gb][lb][hc][ic][gi][ak][hk][bl][cm][mp][np][hq]TB[ec][ed][ee][sh][si][sj][mk][sk][sl][sm][rr][ps][ss])
diff --git a/regression/games/kgs/yagr2.sgf b/regression/games/kgs/yagr2.sgf
new file mode 100644 (file)
index 0000000..86fc687
--- /dev/null
@@ -0,0 +1,73 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Japanese]SZ[19]HA[5]KM[0.50]TM[900]OT[5x30 byo-yomi]
+PW[yagr]PB[mikolajek]WR[9k]BR[15k]DT[2004-04-08]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[dd][pd][jj][dp][pp]C[yagr [9k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;W[cn]
+;B[fq]
+;W[ci]
+;B[cg]
+;W[bp]
+;B[cq]
+;W[dl]
+;B[jp]
+;W[qf]
+;B[pf]
+;W[pg]
+;B[of]
+;W[qe]
+;B[qd]
+;W[qj]
+;B[ql]
+;W[pj]
+;B[oh]
+;W[og]
+;B[ng]
+;W[ph]
+;B[mf]
+;W[gd]
+;B[fc]
+;W[gc]
+;B[jd]
+;W[nq]
+;B[np]
+;W[mp]
+;B[no]
+;W[oq]
+;B[pq]
+;W[lq]
+;B[lo]
+;W[jr]
+;B[lp]
+;W[oi]
+;B[nh]
+;W[mj]
+;B[ni]
+;W[nj]
+;B[li]
+;W[fb]
+;B[ec]
+;W[ib]
+;B[jc]
+;W[jb]
+;B[kb]
+;W[ka]
+;B[la]
+;W[lb]
+;B[ja]
+;W[kc]
+;B[mb]
+;W[lc]
+;B[mc]
+;W[ia]
+;B[ld]
+;W[ka]
+;B[kd]
+;W[ma]
+;B[na]
+;W[nb]
+;B[la]
+;W[ob]
+;B[kb]
+;W[bq]
+;B[ol]
+;W[ml])
diff --git a/regression/games/kgs/yagr3.sgf b/regression/games/kgs/yagr3.sgf
new file mode 100644 (file)
index 0000000..402b7f3
--- /dev/null
@@ -0,0 +1,89 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[Bubuu]WR[9k]BR[13k]DT[2004-04-09]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]C[yagr [9k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;B[pd]
+;W[dp]
+;B[pq]
+;W[dd]
+;B[qo]
+;W[kq]
+;B[cj]
+;W[qf]
+;B[nd]
+;W[rd]
+;B[qc]
+;W[qi]
+;B[ql]
+;W[lc]
+;B[ic]
+;W[le]
+;B[of]
+;W[rc]
+;B[rb]
+;W[hq]
+;B[ph]
+;W[qh]
+;B[pg]
+;W[pi]
+;B[kd]
+;W[ld]
+;B[fc]
+;W[cf]
+;B[cn]
+;W[co]
+;B[bn]
+;W[fe]
+;B[jj]
+;W[bo]
+;B[ln]
+;W[ec]
+;B[fb]
+;W[eb]
+;B[if]
+;W[nb]
+;B[mg]
+;W[lg]
+;B[mh]
+;W[mf]
+;B[kf]
+;W[lf]
+;B[ke]
+;W[kg]
+;B[ih]
+;W[kc]
+;B[jc]
+;W[dn]
+;B[dm]
+;W[nq]
+;B[ok]
+;W[oi]
+;B[mi]
+;W[jb]
+;B[ib]
+;W[ka]
+;B[ob]
+;W[lb]
+;B[nc]
+;W[na]
+;B[oa]
+;W[ma]
+;B[mc]
+;W[mb]
+;B[ha]
+;W[ja]
+;B[nf]
+;W[en]
+;B[fk]
+;W[cm]
+;B[cl]
+;W[bm]
+;B[bl]
+;W[am]
+;B[em]
+;W[ho]
+;B[rj]
+;W[rf]
+;B[sh]
+;W[qd]
+;B[pc])
diff --git a/regression/games/kgs/yagr4.sgf b/regression/games/kgs/yagr4.sgf
new file mode 100644 (file)
index 0000000..f2b166e
--- /dev/null
@@ -0,0 +1,197 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[haraldt]PB[yagr]WR[7k]BR[9k]DT[2004-04-12]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[yagr [9k\]: GTP Engine for yagr (black): GNU Go version 3.5.4
+]
+;W[pq]
+;B[dd]
+;W[cf]
+;B[qo]
+;W[mp]
+;B[ql]
+;W[qf]
+;B[qh]
+;W[qc]
+;B[qd]
+;W[pc]
+;B[od]
+;W[rd]
+;B[re]
+;W[rc]
+;B[qe]
+;W[nc]
+;B[pf]
+;W[qj]
+;B[df]
+;W[dg]
+;B[ef]
+;W[ce]
+;B[cd]
+;W[ci]
+;B[kq]
+;W[fd]
+;B[hq]
+;W[cn]
+;B[cl]
+;W[cq]
+;B[dq]
+;W[cp]
+;B[do]
+;W[dr]
+;B[em]
+;W[ed]
+;B[dc]
+;W[de]
+;B[er]
+;W[cr]
+;B[rj]
+;W[rk]
+;B[qk]
+;W[ri]
+;B[pj]
+;W[qi]
+;B[rl]
+;W[pi]
+;B[oi]
+;W[ph]
+;B[oh]
+;W[sj]
+;B[rg]
+;W[rh]
+;B[me]
+;W[fb]
+;B[be]
+;W[bf]
+;B[bd]
+;W[ld]
+;B[gf]
+;W[id]
+;B[rq]
+;W[qp]
+;B[rp]
+;W[po]
+;B[fi]
+;W[eg]
+;B[fg]
+;W[ee]
+;B[oc]
+;W[ob]
+;B[qg]
+;W[sh]
+;B[fl]
+;W[jp]
+;B[kp]
+;W[jo]
+;B[ko]
+;W[jm]
+;B[jq]
+;W[kn]
+;B[co]
+;W[bo]
+;B[lo]
+;W[mo]
+;B[fq]
+;W[mm]
+;B[eb]
+;W[ec]
+;B[db]
+;W[le]
+;B[qn]
+;W[oj]
+;B[pg]
+;W[pk]
+;B[lh]
+;W[mf]
+;B[lj]
+;W[ne]
+;B[mr]
+;W[ln]
+;B[in]
+;W[jn]
+;B[op]
+;W[pp]
+;B[oo]
+;W[pn]
+;B[oq]
+;W[on]
+;B[im]
+;W[hp]
+;B[gp]
+;W[ho]
+;B[ik]
+;W[if]
+;B[pm]
+;W[om]
+;B[fa]
+;W[gb]
+;B[ga]
+;W[ha]
+;B[ea]
+;W[hb]
+;B[ff]
+;W[ih]
+;B[kk]
+;W[pl]
+;B[qm]
+;W[or]
+;B[nr]
+;W[qr]
+;B[os]
+;W[pr]
+;B[mq]
+;W[no]
+;B[nq]
+;W[bk]
+;B[bl]
+;W[ck]
+;B[ng]
+;W[gh]
+;B[fh]
+;W[hj]
+;B[nd]
+;W[mc]
+;B[md]
+;W[nf]
+;B[mg]
+;W[lg]
+;B[kg]
+;W[lf]
+;B[kf]
+;W[je]
+;B[ji]
+;W[jh]
+;B[kh]
+;W[nj]
+;B[ij]
+;W[hi]
+;B[hg]
+;W[ig]
+;B[hh]
+;W[ii]
+;B[rr]
+;W[ek]
+;B[fk]
+;W[dl]
+;B[cm]
+;W[dn]
+;B[bn]
+;W[ap]
+;B[dm]
+;W[go]
+;B[fo]
+;W[fn]
+;B[gn]
+;W[hn]
+;B[gm]
+;W[hm]
+;B[hl]
+;W[jl]
+;B[io]
+;W[ip]
+;B[iq]
+;W[il]
+;B[hk]
+;W[es]
+;B[fs]
+;W[ds]
+;B[jk]
+;W[mk])
diff --git a/regression/games/kgs/yagr5.sgf b/regression/games/kgs/yagr5.sgf
new file mode 100644 (file)
index 0000000..bfec717
--- /dev/null
@@ -0,0 +1,164 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[AGA]SZ[19]HA[2]KM[0.50]TM[600]OT[20/120 Canadian]
+PW[yagr]PB[Nova]WR[9k]BR[12k]DT[2004-04-12]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[pd][dp]C[yagr [9k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;W[dd]
+;B[qp]
+;W[cn]
+;B[oq]
+;W[ck]
+;B[fp]
+;W[nd]
+;B[pf]
+;W[pc]
+;B[qc]
+;W[oc]
+;B[jc]
+;W[qh]
+;B[qg]
+;W[ph]
+;B[qk]
+;W[qb]
+;B[rc]
+;W[hq]
+;B[gq]
+;W[hp]
+;B[jq]
+;W[oo]
+;B[mp]
+;W[rb]
+;B[qd]
+;W[bp]
+;B[cq]
+;W[gc]
+;B[mn]
+;W[om]
+;B[ok]
+;W[pp]
+;B[pq]
+;W[qm]
+;B[po]
+;W[op]
+;B[pn]
+;W[nl]
+;B[mk]
+;W[pm]
+;B[on]
+;W[hn]
+;B[nh]
+;W[cd]
+;B[fn]
+;W[ch]
+;B[gl]
+;W[gp]
+;B[fq]
+;W[jn]
+;B[lm]
+;W[rk]
+;B[rj]
+;W[rh]
+;B[rg]
+;W[og]
+;B[nf]
+;W[ng]
+;B[oh]
+;W[rl]
+;B[rn]
+;W[qj]
+;B[pj]
+;W[qi]
+;B[mc]
+;W[sb]
+;B[jl]
+;W[ir]
+;B[jr]
+;W[mg]
+;B[mh]
+;W[md]
+;B[ld]
+;W[of]
+;B[pg]
+;W[sj]
+;B[kh]
+;W[sc]
+;B[sd]
+;W[re]
+;B[lg]
+;W[mf]
+;B[lf]
+;W[gf]
+;B[if]
+;W[gj]
+;B[nk]
+;W[bq]
+;B[cr]
+;W[gh]
+;B[ql]
+;W[qn]
+;B[qo]
+;W[rm]
+;B[ro]
+;W[ek]
+;B[nm]
+;W[ib]
+;B[jb]
+;W[ih]
+;B[jh]
+;W[hc]
+;B[id]
+;W[ol]
+;B[nb]
+;W[pk]
+;B[oj]
+;W[le]
+;B[ke]
+;W[oe]
+;B[nc]
+;W[od]
+;B[ii]
+;W[lc]
+;B[kd]
+;W[lb]
+;B[kc]
+;W[na]
+;B[ic]
+;W[hi]
+;B[ij]C[yagr [9k\]: GTP Engine for yagr (white): GNU Go version 3.5.4
+]
+;W[hk]
+;B[hl]
+;W[ig]
+;B[jg]
+;W[hf]
+;B[dn]
+;W[dm]
+;B[em]
+;W[cm]
+;B[co]
+;W[bo]
+;B[gk]
+;W[hj]
+;B[fk]
+;W[fj]
+;B[el]
+;W[dl]
+;B[ik]
+;W[ha]
+;B[he]
+;W[ge]
+;B[je]
+;W[ml]
+;B[ll]
+;W[hd]
+;B[ie]
+;W[cp]
+;B[do]
+;W[mm]
+;B[nn]
+;W[me]
+;B[br]
+;W[ar]
+;B[pi]
+;W[sn]
+;B[so]
+;W[sm])
diff --git a/regression/games/kisei28_g7.sgf b/regression/games/kisei28_g7.sgf
new file mode 100644 (file)
index 0000000..be5de90
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2] RU[Japanese]SZ[19]KM[6.50]\r
+GN[28th Kisei Title Matches 7th game, Yamashita Keigo Kisei(W) vs Hane\r
+Naoki Tengen(B)]PW[yomi]PB[yomi]WR[9p]BR[9p]DT[2004-03-18]PC[IGS-PandaNet]\r
+;B[qd] ;W[cp] ;B[pp] ;W[dc] ;B[ep] ;W[od] ;B[cq] ;W[de] ;B[oc] ;W[nc]\r
+;B[pc] ;W[nd] ;B[qf] ;W[bq] ;B[dq] ;W[bo] ;B[iq] ;W[jd] ;B[dm] ;W[cn]\r
+;B[dn] ;W[nq] ;B[np] ;W[op] ;B[oo] ;W[oq] ;B[pq] ;W[po] ;B[qo] ;W[pn]\r
+;B[mp] ;W[qn] ;B[mq] ;W[ro] ;B[rq] ;W[qh] ;B[nn] ;W[nl] ;B[lb] ;W[mb]\r
+;B[lc] ;W[ic] ;B[le] ;W[pe] ;B[qe] ;W[og] ;B[kf] ;W[if] ;B[kh] ;W[lg]\r
+;B[jf] ;W[ig] ;B[jh] ;W[hi] ;B[mi] ;W[oi] ;B[mk] ;W[nj] ;B[mj] ;W[ch]\r
+;B[ei] ;W[hk] ;B[eg] ;W[fh] ;B[eh] ;W[cf] ;B[ci] ;W[cj] ;B[bi] ;W[dj]\r
+;B[ej] ;W[di] ;B[cg] ;W[bg] ;B[bh] ;W[dg] ;B[dh] ;W[cg] ;B[bk] ;W[bj]\r
+;B[dk] ;W[ah] ;B[nk] ;W[ok] ;B[ol] ;W[pl] ;B[hm] ;W[il] ;B[im] ;W[kl]\r
+;B[ml] ;W[fk] ;B[gj] ;W[fj] ;B[fi] ;W[gi] ;B[fl] ;W[jm] ;B[jk] ;W[jl]\r
+;B[ek] ;W[gk] ;B[br] ;W[ar] ;B[bs] ;W[do] ;B[bm] ;W[eo] ;B[bn] ;W[fo]\r
+;B[gp] ;W[hp] ;B[gq] ;W[go] ;B[fm] ;W[io] ;B[jn] ;W[hq] ;B[gr] ;W[hr]\r
+;B[jq] ;W[kq] ;B[kr] ;W[kp] ;B[jr] ;W[lr] ;B[lq] ;W[mr] ;B[kn] ;W[jp]\r
+;B[ls] ;W[nr] ;B[ns] ;W[os] ;B[ks] ;W[fp] ;B[fq] ;W[er] ;B[eq] ;W[dr]\r
+;B[cr] ;W[ds] ;B[fs] ;W[hs] ;B[gs] ;W[ho] ;B[es] ;W[in] ;B[ck] ;W[lm]\r
+;B[ln] ;W[mm] ;B[nm] ;W[mn] ;B[lo]C[W resigns. GnuGo 3.5.3 continues\r
+with default settings.]  ;W[ms] ;B[pr] ;W[ai] ;B[fg] ;W[gh] ;B[fe]\r
+;W[gg] ;B[gf] ;W[pk] ;B[rg] ;W[rh] ;B[mf] ;W[fc] ;B[ia] ;W[ob] ;B[pb]\r
+;W[he] ;B[mg] ;W[pa] ;B[qa] ;W[oa] ;B[rb] ;W[qg] ;B[rf] ;W[sg] ;B[ga]\r
+;W[fb] ;B[fa] ;W[eb] ;B[sf] ;W[sh] ;B[pm]C[Mistake -- fills blacks own\r
+liberties.]  ;W[qm] ;B[om] ;W[mo]C[Now Black can't connect at M4.]\r
+;B[no] ;W[lp] ;B[cm] ;W[kk] ;B[co] ;W[dp] ;B[qp] ;W[jb] ;B[ja] ;W[jj]\r
+;B[rp] ;W[sn] ;B[ao] ;W[bp] ;B[gd] ;W[hb] ;B[ha] ;W[ih] ;B[nh] ;W[pf]\r
+;B[ni] ;W[oh] ;B[oj] ;W[pj] ;B[ma] ;W[nb] ;B[ea] ;W[da] ;B[hd] ;W[id]\r
+;B[ll] ;W[km] ;B[ji] ;W[kj] ;B[ii] ;W[ij] ;B[jg] ;W[hf] ;B[ge] ;W[je]\r
+;B[gl] ;W[gn] ;B[md] ;W[ne] ;B[kd] ;W[nf] ;B[en] ;W[me] ;B[ee] ;W[ed]\r
+;B[ke] ;W[ef] ;B[mc] ;W[kc] ;B[kb] ;W[jc] ;B[gb] ;W[hc] ;B[gc] ;W[sp]\r
+;B[sq] ;W[so] ;B[ak] ;W[nj] ;B[cn] ;W[oj] ;B[ap] ;W[aq] ;B[an] ;W[as]\r
+;B[hl] ;W[df] ;B[ff] ;W[pd] ;B[la] ;W[ie] ;B[ng] ;W[fd] ;B[nl] ;W[aj]\r
+;B[fn] ;W[ir] ;B[or] ;W[ip] ;B[ns] ;W[gm] ;B[js] ;W[ki] ;B[li]\r
+;W[hn]C[Mistake. Turns alive group into seki.]  ;B[is] ;W[lj] ;B[ib]\r
+;W[lk] ;B[na] ;W[rm] ;B[on] ;W[]\r
+;B[]TW[aa][ba][ca][ab][bb][cb][db][ac][bc][cc][ec][ad][bd][cd][dd][ae][be][ce][oe][af][bf][of][ag][hg][pg][bh][hh][ph][bi][ci][pi][qi][ri][si][gj][hj][qj][rj][sj][ik][jk][qk][rk][sk][ql][rl][sl][sm][rn]TB[ka][ra][sa][qb][sb][qc][rc][sc][ld][rd][sd][re][se][lf][kg][lg][lh][mh][al][bl][cl][dl][el][am][em][op][nq][oq][qq][lr][mr][nr][qr][rr][sr][ms][os][ps][qs][rs][ss]C[W\r
+wins by 10.5 points (including komi).])\r
diff --git a/regression/games/ko1.sgf b/regression/games/ko1.sgf
new file mode 100644 (file)
index 0000000..ea02d03
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.161 load and print]HA[5]KM[-2.5]GN[GNU Go 2.7.161 load and print Random Seed 968083307] 
+AW[db][fb][hb][cc][dc][fc][gc][hc][ic][cd][gd][hd][rd][qf][pg][rg][qh][oj][ll][ml][ql][rl][om][pm][jn][kn][on][ho][jo][lo][mo][no][fp][ip][fq][iq][nq][oq][hr][lr][mr][nr][ms]
+AB[ha][ja][gb][ib][jc][mc][bd][dd][fd][id][jd][pd][ce][fe][pf][dg][dj][jj][mj][kl][jm][km][lm][qm][rm][dn][ln][pn][ko][qo][dp][jp][kp][lp][pp][eq][jq][lq][pq][qq][ir][kr][or][qr][js][ls][ns][ps]
+PL[B]
+IL[qg]
+)
diff --git a/regression/games/ko2.sgf b/regression/games/ko2.sgf
new file mode 100644 (file)
index 0000000..071c660
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.221 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.221 load and print Random Seed 985969754] 
+AW[ba][da][ha][bb][cb][gb][hb][cc][gc][ic][lc][dd][ed][fd][ce][ef][ff][ei][no][oo][po][qo][ro][so][mp][np][jq][kq][lq][mq][pq][qq][rq][sq][jr][or][qr][sr][js][ps][qs][rs][ss]
+AB[ea][ga][ab][db][fb][bc][dc][ec][fc][hc][bd][cd][gd][be][ge][ie][cf][hg][op][pp][qp][rp][sp][nq][oq][kr][lr][mr][nr][ks][ms][os]
+PL[B]
+IL[rr]
+)
diff --git a/regression/games/ko3.sgf b/regression/games/ko3.sgf
new file mode 100644 (file)
index 0000000..a6982a5
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.221 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.221 load and print Random Seed 985969814] 
+AW[ae][be][ce][de][ee][fe][af][ef][ff][gf][ag][eg][gg][ah][bh][fh][gh][ai][ci][gi]
+AB[ad][bd][cd][dd][ed][fd][gd][ge][he][bf][cf][df][hf][bg][dg][hg][ch][dh][eh][hh][di][fi][hi]
+PL[W]
+IL[cg]
+)
diff --git a/regression/games/ko4.sgf b/regression/games/ko4.sgf
new file mode 100644 (file)
index 0000000..76f6969
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.221 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.221 load and print Random Seed 985969881] 
+AW[be][ce][de][ee][fe][af][bf][ff][gf][ag][eg][gg][ah][bh][fh][gh][ai][ci][gi]
+AB[ad][bd][cd][dd][ed][fd][gd][ae][ge][he][cf][df][ef][hf][bg][dg][hg][ch][dh][eh][hh][di][fi][hi]
+PL[W]
+
+)
diff --git a/regression/games/ko5.sgf b/regression/games/ko5.sgf
new file mode 100644 (file)
index 0000000..7bcae7c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-05-05]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ha][gb][ib][gc][hc][ic][jc][kc][lc][ld][md][le][lf][mf][lg][lh][li][mi][lj][gk][ik][jk][kk][cl][dl][el][fl][gl][il][kl][cm][em][gm][jm]
+AB[da][fa][ga][ia][ja][la][ma][cb][eb][fb][jb][kb][lb][cc][dc][ec][mc][fg][gg][hg][eh][fh][hh][ih][ei][gi][ii][ji][ki][fj][gj][ij][kj][mj][hk][lk][hl][ll][ml][im][km][lm]
+)
diff --git a/regression/games/ko6.sgf b/regression/games/ko6.sgf
new file mode 100644 (file)
index 0000000..4d3bd18
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[9]
+AP[Jago:Version 4.18]
+AB[cf][df][de][dd][cd][dc][ed][fd][fc][fe][ff][gf][gd][ef][dg][fg][ee][he][be]
+AW[dh][di][ei][fi][fh][gh][gg][hg][hf][ie][if][id][hd][hc][gc][gb][fb][fa][ea][da][db][cb][cc][bc][bd][ad][ae][af][bf][bg][cg][ch][eg][ec]
+)
diff --git a/regression/games/ladder1.sgf b/regression/games/ladder1.sgf
new file mode 100644 (file)
index 0000000..05957a6
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+SZ[19]
+SO[]
+EV[]
+PC[]
+DT[]
+TM[]KM[0]BR[]WR[]
+PB[Cho Sonjin]
+PW[O Meien]
+;B[qd];W[dp];B[pq];W[nd];B[oc];W[ce];B[po];W[od];B[pd];W[nc];B[ob];
+W[og];B[nb];W[lc];B[ec];W[gd];B[cc];W[ee];B[ck];W[cm];B[di];W[fi];
+B[el];W[fp];B[df];W[de];B[gb];W[gl];B[cn];W[dm];B[fh];W[eh];B[ei];
+W[gh];B[fg];W[eg];B[gg];W[ef];B[fj];W[gi];B[gj];W[ii];B[ij];W[jj];
+B[hj];W[ih];B[jk];W[kk];B[kj];W[ji];B[jl];W[kl];B[ki];W[km];B[hh];
+W[hi];B[ig];W[jh];B[jg]
+)
diff --git a/regression/games/life1.sgf b/regression/games/life1.sgf
new file mode 100644 (file)
index 0000000..5f70091
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-10-09]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[eb][fb][fc][fd][id][fe][ge][he][ie]AB[ga][gb][gc][ic][gd][hd]
+)
diff --git a/regression/games/life_and_death/comb1.sgf b/regression/games/life_and_death/comb1.sgf
new file mode 100644 (file)
index 0000000..251b9c6
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go 2.7.239 (level 10) load and print]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 2.7.239 load and print Random Seed 992362061] 
+AW[dd][gd][ae][ce][de][fe][ge][af][bf][cf][df][ef][ff][gf][hf][if][bg][gg][ig][ah][bh][hh][ai]
+AB[dc][ec][gc][hc][ad][bd][cd][ed][fd][hd][be][ee][he][ie][cg][dg][eg][fg][ch][gh][bi][ci][gi]
+PL[W]
+
+)
diff --git a/regression/games/life_and_death/eye1.sgf b/regression/games/life_and_death/eye1.sgf
new file mode 100644 (file)
index 0000000..d1d5422
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[4]SZ[9]
+AB[fb][gb][bc][cc][dc][ec][be][he][ie][ef][ff][gf][hf][dg][eg][hg][dh][di][ii]
+AW[ba][fa][ab][bb][cb][db][if][fh][gh][hh][fi][hi]
+)
diff --git a/regression/games/life_and_death/invasion1.sgf b/regression/games/life_and_death/invasion1.sgf
new file mode 100644 (file)
index 0000000..d6fd018
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[invasion1]
+DT[2004-01-27]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[cc][fc][nc][qc][fd][jd][nd][qe][bn][bo][co][qo][cp][fp][jp][np][qp][cq][fq][nq][qq]
+AB[eb][ob][ec][oc][dd][pd][pe][df][pf][cj][qj][bm][cn][dn][pn][qn][do][po][dp][pp][eq][oq][er][or]
+)
diff --git a/regression/games/life_and_death/invasion2.sgf b/regression/games/life_and_death/invasion2.sgf
new file mode 100644 (file)
index 0000000..9195d88
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[invasion2]
+DT[2004-01-27]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[cc][fc][nc][qc][ad][cd][fd][jd][nd][be][qe][qf][cn][qn][co][qo][bp][fp][jp][np][rp][cq][fq][nq][qq][br]
+AB[eb][ob][ec][oc][dd][pd][qd][ce][pe][bf][df][pf][cj][qj][bm][cm][qm][dn][pn][do][po][cp][dp][pp][qp][eq][oq][er][or]
+)
diff --git a/regression/games/life_and_death/invasion3.sgf b/regression/games/life_and_death/invasion3.sgf
new file mode 100644 (file)
index 0000000..133fb46
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[invasion3]
+DT[2004-01-27]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[cc][fc][nc][qc][bd][fd][jd][nd][rd][ce][qe][re][cf][qf][bg][rg][bn][rn][bo][co][qo][fp][jp][np][cq][fq][nq][qq]
+AB[eb][ob][qb][bc][ec][oc][rc][cd][dd][pd][qd][de][pe][df][pf][cg][qg][cj][qj][bm][cn][dn][pn][qn][do][po][dp][pp][eq][oq][er][or]
+)
diff --git a/regression/games/life_and_death/invasion4.sgf b/regression/games/life_and_death/invasion4.sgf
new file mode 100644 (file)
index 0000000..4a24172
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[invasion4]
+DT[2004-01-27]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[cc][fc][nc][qc][fd][jd][nd][rd][ce][qe][bf][rf][bn][rn][bo][co][qo][ro][bp][fp][jp][np][rp][bq][cq][fq][nq][qq][br]
+AB[eb][ob][ec][oc][cd][dd][pd][qd][de][pe][df][pf][qf][cj][qj][cn][dn][pn][qn][do][po][cp][dp][pp][qp][dq][eq][oq][cr][er][or][qr][bs]
+)
diff --git a/regression/games/life_and_death/ld1.sgf b/regression/games/life_and_death/ld1.sgf
new file mode 100644 (file)
index 0000000..6e098bb
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[cb][db][jb][cc][jc][kc][lc][mc][nc][oc][pc][qc][rc][cd][rd][ce][bf][cf][bg][qj][rj][qk][ql][qm][qn][bo][qo][bp][qp][bq][cq][dq][eq][fq][gq][hq][iq][jq][qq][jr][pr][qr]
+AB[ba][bb][ob][pb][qb][rb][bc][bd][be][rn][ro][rp][aq][rq][br][cr][dr][er][rr]
+)
diff --git a/regression/games/life_and_death/ld10.sgf b/regression/games/life_and_death/ld10.sgf
new file mode 100644 (file)
index 0000000..a4bd959
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld10]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[pa][db][eb][nb][ob][dc][oc][pc][dd][pd][be][ce][de][pe][qe][re][bf][rf][bm][rm][bn][cn][qn][rn][co][do][po][qo][so][dp][pp][dq][eq][pq][er][fr][or][pr][ds]
+AB[bb][cb][pb][qb][cc][qc][bd][cd][qd][rd][bo][ro][bp][cp][qp][rp][cq][qq][cr][dr][qr]
+)
diff --git a/regression/games/life_and_death/ld11.sgf b/regression/games/life_and_death/ld11.sgf
new file mode 100644 (file)
index 0000000..2d6b31c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld11]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[db][eb][nb][ob][rb][dc][oc][pc][dd][be][ce][de][oe][pe][qe][re][bf][rf][rl][bm][rm][bn][cn][qn][rn][ao][co][do][po][qo][so][dp][pp][dq][eq][pq][er][fr][or][pr]
+AB[ab][cb][pb][qb][cc][qc][bd][cd][qd][rd][sn][bo][ro][bp][cp][qp][rp][cq][qq][cr][dr][qr]
+)
diff --git a/regression/games/life_and_death/ld12.sgf b/regression/games/life_and_death/ld12.sgf
new file mode 100644 (file)
index 0000000..5c6046e
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld12]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[oa][db][eb][ob][dc][oc][pc][dd][pd][be][ce][de][pe][qe][re][se][bf][bm][rm][bn][cn][qn][rn][co][do][po][qo][dp][pp][dq][eq][pq][er][fr][or][pr][rr][ds]
+AB[ca][cb][pb][qb][sb][cc][qc][ad][bd][cd][qd][rd][bo][ro][bp][cp][qp][rp][cq][qq][ar][cr][dr][qr]
+)
diff --git a/regression/games/life_and_death/ld13.sgf b/regression/games/life_and_death/ld13.sgf
new file mode 100644 (file)
index 0000000..40188ef
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld13]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[da][db][mb][nb][ob][dc][oc][pc][dd][pd][ae][be][ce][de][pe][qe][re][rf][bm][bn][cn][qn][rn][sn][co][do][po][qo][dp][pp][aq][dq][eq][pq][er][fr][pr][ps]
+AB[ca][oa][cb][pb][qb][cc][qc][ad][bd][cd][qd][rd][bo][ro][bp][cp][qp][rp][cq][qq][cr][dr][qr][sr]
+)
diff --git a/regression/games/life_and_death/ld14.sgf b/regression/games/life_and_death/ld14.sgf
new file mode 100644 (file)
index 0000000..260b367
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld14]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[pa][db][eb][mb][nb][ob][dc][oc][pc][dd][pd][ae][be][ce][de][pe][qe][re][rf][bm][rm][bn][cn][qn][rn][co][do][qo][dp][pp][qp][dq][eq][pq][br][er][fr][or][pr]
+AB[oa][cb][pb][qb][cc][qc][ad][bd][cd][qd][rd][bo][ro][bp][cp][rp][cq][qq][cr][dr][qr]
+)
diff --git a/regression/games/life_and_death/ld15.sgf b/regression/games/life_and_death/ld15.sgf
new file mode 100644 (file)
index 0000000..4a842e6
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld15]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[da][db][nb][ob][dc][oc][pc][dd][pd][be][ce][de][pe][qe][re][bf][rf][rg][bm][rm][bn][cn][qn][rn][co][do][qo][dp][pp][qp][dq][eq][pq][er][fr][or][pr]
+AB[ca][cb][pb][qb][cc][qc][bd][cd][qd][rd][se][bo][ro][ap][cp][rp][cq][qq][cr][dr][qr][rr]
+)
diff --git a/regression/games/life_and_death/ld16.sgf b/regression/games/life_and_death/ld16.sgf
new file mode 100644 (file)
index 0000000..fce583a
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld16]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[db][eb][mb][nb][ob][ec][oc][pc][ed][pd][ae][ce][de][ee][pe][qe][re][bf][ef][rf][bg][eg][rg][ch][dh][eh][am][bm][rm][bn][cn][on][pn][qn][rn][co][do][oo][qo][dp][op][qp][dq][eq][oq][er][fr][or][fs]
+AB[oa][cb][pb][qb][cc][qc][bd][cd][qd][rd][be][se][cf][cg][an][ao][bo][ro][bp][cp][rp][cq][pq][qq][cr][dr][ds][es]
+)
diff --git a/regression/games/life_and_death/ld17.sgf b/regression/games/life_and_death/ld17.sgf
new file mode 100644 (file)
index 0000000..2c1bbda
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-16]
+SY[Cgoban 1.9.9]TM[1:00:00+5:00/30];
+AW[bp][cp][dp][ep][bq][fq][gq][gr][ir]AB[cq][dq][br][er][fr]
+)
diff --git a/regression/games/life_and_death/ld18.sgf b/regression/games/life_and_death/ld18.sgf
new file mode 100644 (file)
index 0000000..6986297
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-26]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];AW[aa][ca][bb][cb][bc][ad][bd]
+AB[ab][db][eb][cc][dc][cd][be][ce][bf];B[ba]
+)
+
+
diff --git a/regression/games/life_and_death/ld19.sgf b/regression/games/life_and_death/ld19.sgf
new file mode 100644 (file)
index 0000000..e4c2586
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-10]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[bb][fb][gb][nb][ob][rb][sb][fc][oc][dd][ed][fd][od][pd][be][ce][de][pe][bf][pf][qf][rf][rg][bm][bn][cn][dn][rn][do][po][qo][ro][dp][ep][np][op][pp][aq][eq][nq][ar][br][er][fr][mr][nr][rr][rs]
+AB[cb][db][eb][pb][qb][bc][cc][qc][rc][bd][rd][re][se][ao][bo][bp][rp][sp][bq][cq][qq][rq][cr][dr][or][pr][qr][ds]
+)
diff --git a/regression/games/life_and_death/ld2.sgf b/regression/games/life_and_death/ld2.sgf
new file mode 100644 (file)
index 0000000..4b509c2
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ra][gb][hb][lb][mb][bc][cc][dc][ec][fc][gc][mc][nc][oc][pc][qc][rc][bd][rd][bk][bl][cl][rl][cm][qm][rm][cn][qn][co][qo][so][cp][qp][cq][qq][cr][dr][pr][qr]
+AB[ab][bb][cb][db][eb][ob][pb][qb][rb][sb][bo][ro][bp][rp][bq][rq][br][rr][bs][rs]
+)
diff --git a/regression/games/life_and_death/ld20.sgf b/regression/games/life_and_death/ld20.sgf
new file mode 100644 (file)
index 0000000..6604f8a
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+GM[1]FF[4]
+SZ[9]
+AP[Jago:Version 4.53]
+AB[ah][ag][af][be][ce][de][df][dg][eg][fg][fh]
+AW[bf][cf][cg][bh][dh][eh][ci][ei]
+GN[x]
+)
diff --git a/regression/games/life_and_death/ld3.sgf b/regression/games/life_and_death/ld3.sgf
new file mode 100644 (file)
index 0000000..4f8f9dc
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ab][cb][db][pb][qb][sb][cc][qc][cd][qd][ce][qe][cf][qf][cg][qg][bh][ch][qh][rh][bi][ri][rk][ql][rl][qm][qn][do][eo][fo][qo][so][ap][bp][cp][dp][fp][qp][dq][fq][gq][qq][gr][hr][pr][qr]
+AB[ba][ra][bb][rb][bc][rc][sc][bd][rd][be][re][bf][ro][rp][eq][rq][ar][br][cr][dr][fr][rr][rs]
+)
diff --git a/regression/games/life_and_death/ld4.sgf b/regression/games/life_and_death/ld4.sgf
new file mode 100644 (file)
index 0000000..ad61686
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[da][ra][ab][db][lb][mb][dc][mc][nc][pc][cd][dd][ed][nd][pd][qd][rd][sd][ee][ne][oe][pe][cf][df][ef][bg][cg][bh][bk][bl][rl][bm][cm][qm][rm][cn][dn][en][on][pn][qn][eo][oo][cp][dp][ep][op][pp][qp][dq][pq][dr][pr][sr][ds][ps]
+AB[ba][na][bb][nb][pb][qb][rb][sb][bc][oc][bd][ce][bf][am][bn][rn][co][qo][bp][rp][bq][rq][sq][br][rr][bs][rs]
+)
diff --git a/regression/games/life_and_death/ld5.sgf b/regression/games/life_and_death/ld5.sgf
new file mode 100644 (file)
index 0000000..99595c3
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[cb][db][eb][ob][pb][qb][ec][oc][cd][dd][ed][od][pd][qd][de][pe][df][pf][sf][bg][cg][dg][pg][qg][rg][bh][rh][bl][rl][bm][cm][dm][pm][qm][rm][dn][pn][sn][do][po][cp][dp][ep][op][pp][qp][aq][eq][oq][cr][dr][er][or][pr][qr]
+AB[ba][ra][bb][rb][cc][qc][bd][rd][be][re][se][bf][rf][bn][rn][bo][ro][bp][rp][cq][qq][br][rr][sr][bs][rs]
+)
diff --git a/regression/games/life_and_death/ld6.sgf b/regression/games/life_and_death/ld6.sgf
new file mode 100644 (file)
index 0000000..f3e687e
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[cb][db][eb][lb][mb][ec][mc][pc][rc][cd][dd][ed][md][nd][od][pd][rd][de][pe][qe][re][df][bg][cg][dg][bh][co][do][eo][po][qo][ro][bp][cp][ep][mp][np][op][pp][rp][cq][eq][fq][gq][mq][pq][rq][gr][hr][lr][mr][sr]
+AB[ca][na][bb][nb][ob][pb][rb][cc][qc][sc][bd][be][bf][dq][qq][sq][ar][br][cr][er][fr][nr][or][pr][rr][ns]
+)
diff --git a/regression/games/life_and_death/ld7.sgf b/regression/games/life_and_death/ld7.sgf
new file mode 100644 (file)
index 0000000..2335acd
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[fa][gb][hb][kb][lb][mb][cc][ec][fc][gc][mc][nc][oc][qc][bd][cd][ed][od][qd][rd][ce][de][ee][oe][pe][qe][co][do][eo][oo][po][qo][cp][ep][gp][mp][op][qp][bq][cq][eq][gq][hq][iq][jq][kq][lq][mq][oq][qq][rq][jr]
+AB[ma][ab][bb][cb][eb][fb][nb][ob][qb][rb][sb][dc][pc][dp][pp][dq][pq][br][cr][er][fr][nr][or][qr][rr][ds]
+)
diff --git a/regression/games/life_and_death/ld8.sgf b/regression/games/life_and_death/ld8.sgf
new file mode 100644 (file)
index 0000000..15592af
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[qb][ec][gc][mc][oc][cd][dd][pd][qd][cf][ef][of][qf][cg][qg][ci][qi][qk][bm][qm][bn][cn][on][qn][co][cp][pp][qp][cq][dq][mq][oq][dr][er][rr]
+AB[rb][cc][qc][bd][rd][be][re][bo][ro][bp][rp][bq][qq][br][cr][qr]
+)
diff --git a/regression/games/life_and_death/ld9.sgf b/regression/games/life_and_death/ld9.sgf
new file mode 100644 (file)
index 0000000..de97d6d
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld9]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[db][eb][nb][ob][dc][oc][pc][dd][pd][be][ce][de][pe][qe][re][bf][rf][bm][rm][bn][cn][qn][rn][co][do][po][qo][dp][pp][dq][eq][pq][er][fr][or][pr]
+AB[cb][pb][qb][cc][qc][bd][cd][qd][rd][bo][ro][bp][cp][qp][rp][cq][qq][cr][dr][qr]
+)
diff --git a/regression/games/life_and_death/ld9_variations.sgf b/regression/games/life_and_death/ld9_variations.sgf
new file mode 100644 (file)
index 0000000..cfd5a51
--- /dev/null
@@ -0,0 +1,100 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[ld9_variations]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];;
+AW[db][eb][nb][ob][dc][oc][pc][dd][pd][be][ce][de][pe][qe][re][bf][rf][bm][rm][bn][cn][qn][rn][co][do][po][qo][dp][pp][dq][eq][pq][er][fr][or][pr]
+AB[cb][pb][qb][cc][qc][bd][cd][qd][rd][bo][ro][bp][cp][qp][rp][cq][qq][cr][dr][qr]
+(;B[bb]C[Critical.
+attack: A17, C19
+defend: A17, C19, A16, A18
+]PL[1]
+(;B[ae];W[ca];B[ba];W[ac];B[ab];W[ad])
+
+(;B[da];W[ac];B[ad];W[ca];B[ab];W[ba])
+)
+
+(;B[ab]C[Critical.
+attack: B19
+defend: B19, A16, B18, C19
+]PL[1]
+(;W[ba];B[ca];W[ad];B[ac];W[bb])
+
+(;W[ad];B[ba];W[ac];B[bc])
+
+(;B[da];W[ba];B[bb];W[ca])
+
+(;B[ae];W[ba];B[ca];W[bb];B[bc];W[ad])
+)
+
+(;B[ad];W[ae]PL[1]
+C[Critical.
+attack: C19, B19, B18, A18
+defend: A18, B18
+]
+(;W[da]C[Ko.
+]
+(;B[bb]
+(;W[ba];B[ca];W[ab])
+
+(;W[ab];B[aa];W[ba];B[ca];W[ac];B[aa])
+)
+
+(;B[ab];W[ba];B[ca];W[bb])
+)
+
+(;B[da];W[bb];B[ab];W[ba];B[bc];W[ea])
+)
+
+(;B[ca];W[da]PL[1]C[Critical.
+attack: A16, A17, A18, B18
+defend: A18
+]
+(;W[ac]
+(;B[ad];W[bb]
+(;B[ba];W[ab])
+
+(;B[aa];W[ab])
+
+(;B[ab];W[aa];B[ba];W[ab])
+
+(;B[bc];W[ab])
+)
+
+(;B[ab];W[ad]
+(;B[bc];W[ba];B[ae];W[ad])
+
+(;B[ba];W[bc])
+)
+)
+
+(;W[ba]C[ko
+];B[bb];W[ac];B[ad];W[ab])
+
+(;W[aa];B[ab];W[ac];B[ba])
+
+(;W[ab];B[bb];W[ac];B[ad];W[aa])
+
+(;W[bb];B[ab];W[ba])
+
+(;B[bb]C[ko
+];W[ac];B[ad];W[ab];B[aa])
+
+(;B[ab];W[bb];B[ba];W[ac];B[bc])
+)
+
+(;B[ad];W[ae];B[ca];W[da]PL[1]
+C[Critical.
+attack: B18
+defend: A18, B18
+]
+(;W[ba]C[ko
+];B[bb];W[ab])
+
+(;W[ab]C[ko
+];B[bb];W[ac];B[aa])
+)
+
+)
diff --git a/regression/games/life_and_death/lunches.sgf b/regression/games/life_and_death/lunches.sgf
new file mode 100644 (file)
index 0000000..1674ed3
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-05-28]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[aa][ba][ea][fa][ia][bb][cb][fb][gb][kb][lb][fc][lc][fd][ld][ae][be][ce][de][ee][fe][ge][he][ie][le][if][jf][kf][lf][bg][cg][eg][ig][bh][ch][eh][fh][ih][fi][ii][ji][ki][li][mi][ni][oi][aj][bj][cj][ij][oj][rj][ck][dk][ek][fk][gk][hk][ik][ok][pk][qk][rk][bl][dl][fl][il][ml][pl][rl][am][cm][im][jm][km][om][sm][an][cn][en][hn][kn][on][rn][io][jo][ko][oo][so][ap][gp][hp][kp][op][pp][qp][rp][aq][cq][dq][iq][jq][kq][lq][mq][nq][oq][ar][cr][er][fr][gr][or][pr][bs][cs][ds][fs][hs][ks][ps]
+AB[db][hb][ib][jb][ac][bc][cc][dc][hc][jc][hd][id][jd][af][bf][df][ff][gf][ag][dg][gg][ah][dh][gh][ai][bi][ci][di][gi][dj][ej][fj][gj][kk][lk][mk][nk][el][bm][dm][fm][gm][hm][lm][mm][nm][qm][rm][bn][dn][fn][in][ln][nn][qn][ao][bo][co][do][eo][fo][go][ho][lo][no][qo][ro][bp][ep][ip][lp][mp][np][sp][bq][eq][fq][gq][hq][rq][sq][br][hr][ir][jr][kr][rr][is][rs]
+)
diff --git a/regression/games/life_and_death/mixed1.sgf b/regression/games/life_and_death/mixed1.sgf
new file mode 100644 (file)
index 0000000..07ede30
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-03-13]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ra][db][eb][ob][pb][ac][bc][cc][qc][rc][sc][bo][co][do][eo][fo][bp][fp][aq][bq][fq][gq][hq][qq][dr][er][hr][pr][rr][hs][qs]
+AB[fa][na][qa][fb][nb][dc][ec][fc][nc][oc][pc][ad][bd][cd][dd][pd][qd][rd][sd][om][pm][qm][rm][nn][mo][no][qp][rp][cq][dq][eq][mq][oq][br][cr][fr][gr][or][as][cs][ds][fs][gs][os]
+)
diff --git a/regression/games/life_and_death/mixed2.sgf b/regression/games/life_and_death/mixed2.sgf
new file mode 100644 (file)
index 0000000..aedcc61
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]
+SZ[13]HA[0]KM[5.5]
+DT[2004-10-19]
+AW[ca][cb][db][gb][kb][lb][mb][cc][fc][gc][jc][cd][dd][ed][fd][jd][ld][lg][lh][ki][kj][ck][dk][ek][fk][kk][lk][bl][fl][ll][fm][lm]
+AB[ba][ga][bb][hb][ib][jb][bc][dc][ec][hc][ic][kc][bd][hd][id][be][ge][he][ie][le][bf][cf][df][ef][ff][gf][if][jf][kf][lf][mf][kg][jh][kh][ji][bj][cj][dj][ej][fj][gj][jj][mj][bk][gk][jk][al][gl][jl][kl][gm][km]
+)
diff --git a/regression/games/life_and_death/mixed3.sgf b/regression/games/life_and_death/mixed3.sgf
new file mode 100644 (file)
index 0000000..6349803
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[3]
+SZ[13]HA[0]KM[5.5]
+DT[2004-10-19]
+AW[ca][ja][cb][jb][lb][dc][jc][kc][lc][ad][bd][cd][dd][ld][me][mf][li][kj][mj][bk][ck][dk][kk][al][bl][el][fl][kl][ll][bm][lm]
+AB[da][ia][ka][la][db][eb][ib][ec][ic][ed][id][jd][kd][md][ae][be][ce][de][ee][ke][le][kf][kg][lg][kh][lh][mh][ai][bi][ci][di][ei][ji][ki][aj][ej][jj][ek][fk][gk][jk][cl][dl][gl][jl][gm][km]
+;B[il]
+)
diff --git a/regression/games/life_and_death/mixed4.sgf b/regression/games/life_and_death/mixed4.sgf
new file mode 100644 (file)
index 0000000..4993a1c
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]
+SZ[13]HA[0]KM[5.5]
+DT[2005-07-05]
+AW[ca][ab][db][jb][mb][bc][cc][jc][kc][lc][mc][ji][ki][li][jj][lj][kk][lk][jl][ml][jm]
+AB[ia][eb][fb][ib][kb][lb][dc][ec][ic][bd][cd][dd][id][jd][kd][ld][md][be][ig][jg][kg][lg][hh][ih][lh][hi][hj][hk][ik][jk][hl][kl][ll][hm][im][lm]
+)
diff --git a/regression/games/life_and_death/tripod1.sgf b/regression/games/life_and_death/tripod1.sgf
new file mode 100644 (file)
index 0000000..b6d17e8
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]CP[]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod1]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[dc][ec][fc][gc][mc][nc][oc][pc][cd][dd][pd][qd][ce][qe][re][cf][qf][cg][qg][cm][qm][cn][qn][bo][co][qo][cp][dp][pp][qp][dq][eq][fq][gq][mq][nq][oq][pq][br][or]
+AB[db][qb][bc][cc][qc][rd][bp][aq][cq][qq][rq][cr][pr][qs]
+)
diff --git a/regression/games/life_and_death/tripod2.sgf b/regression/games/life_and_death/tripod2.sgf
new file mode 100644 (file)
index 0000000..d059dbc
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod2]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ra][ab][eb][dc][ec][fc][gc][mc][nc][oc][pc][cd][dd][pd][qd][ce][qe][re][cf][qf][cg][qg][cm][qm][cn][qn][ao][bo][co][qo][cp][dp][pp][qp][dq][eq][fq][gq][mq][nq][oq][pq][or][sr][os]
+AB[ca][db][qb][rb][bc][cc][qc][sc][rd][bp][aq][cq][qq][rq][cr][pr][rr][qs]
+)
diff --git a/regression/games/life_and_death/tripod3.sgf b/regression/games/life_and_death/tripod3.sgf
new file mode 100644 (file)
index 0000000..d5f1516
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod3]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[eb][sb][dc][ec][fc][gc][mc][nc][oc][pc][cd][dd][pd][qd][ce][qe][re][cf][qf][cg][qg][cm][qm][cn][qn][bo][co][qo][cp][dp][pp][qp][dq][eq][fq][gq][mq][nq][oq][pq][er][or][rs]
+AB[da][db][qb][bc][cc][qc][rd][sd][bp][aq][cq][qq][rq][cr][dr][pr][rr][ps]
+)
diff --git a/regression/games/life_and_death/tripod4.sgf b/regression/games/life_and_death/tripod4.sgf
new file mode 100644 (file)
index 0000000..69473e0
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod4]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ra][ab][eb][ob][dc][ec][fc][gc][mc][nc][oc][pc][cd][dd][pd][qd][be][ce][qe][re][cf][qf][cg][qg][cm][qm][cn][qn][ao][bo][co][qo][ro][cp][dp][pp][qp][dq][eq][fq][gq][mq][nq][oq][pq][er][or][sr][bs][os]
+AB[ca][db][pb][qb][rb][bc][cc][qc][sc][bd][rd][ap][bp][rp][aq][cq][qq][rq][br][cr][dr][pr][rr][qs]
+)
diff --git a/regression/games/life_and_death/tripod5.sgf b/regression/games/life_and_death/tripod5.sgf
new file mode 100644 (file)
index 0000000..0c46d44
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod5]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ea][fb][ob][dc][ec][fc][gc][mc][nc][oc][pc][cd][dd][pd][qd][be][ce][qe][se][cf][qf][rf][cg][qg][cm][qm][bn][cn][qn][ao][co][qo][ro][cp][dp][pp][qp][dq][eq][fq][gq][mq][nq][oq][pq][er][nr][sr][bs][os]
+AB[db][eb][pb][qb][bc][cc][qc][sc][bd][rd][re][bo][bp][rp][aq][cq][qq][rq][br][cr][dr][or][pr][qs]
+)
diff --git a/regression/games/life_and_death/tripod6.sgf b/regression/games/life_and_death/tripod6.sgf
new file mode 100644 (file)
index 0000000..a3cd322
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod6]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ea][fa][ab][fb][dc][ec][fc][gc][mc][nc][oc][pc][cd][dd][pd][qd][be][ce][qe][cf][qf][rf][cg][qg][cm][qm][bn][cn][qn][co][qo][cp][dp][pp][qp][aq][dq][eq][fq][gq][mq][nq][oq][pq][nr][qs]
+AB[ca][bb][db][eb][qb][bc][cc][qc][bd][rd][re][bo][bp][cq][qq][rq][ar][cr][or][pr]
+)
diff --git a/regression/games/life_and_death/tripod7.sgf b/regression/games/life_and_death/tripod7.sgf
new file mode 100644 (file)
index 0000000..106c018
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod7]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ca][sa][bb][fb][ob][rb][dc][ec][fc][gc][mc][nc][oc][pc][sc][cd][dd][pd][qd][ce][qe][cf][qf][rf][cg][qg][cm][qm][cn][qn][co][qo][cp][dp][pp][qp][aq][dq][eq][fq][gq][mq][nq][oq][pq][nr][qs]
+AB[ba][db][eb][pb][qb][bc][cc][qc][rc][rd][re][bp][cq][qq][rq][cr][or][pr][qr]
+)
diff --git a/regression/games/life_and_death/tripod8.sgf b/regression/games/life_and_death/tripod8.sgf
new file mode 100644 (file)
index 0000000..d4fb3ac
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod8]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ca][rb][dc][ec][fc][gc][mc][nc][oc][pc][sc][cd][dd][pd][qd][ce][qe][cf][qf][cg][qg][cm][qm][bn][cn][qn][co][qo][cp][dp][pp][qp][dq][eq][fq][gq][mq][nq][oq][pq][sq][dr][rr][ds][qs][ss]
+AB[ba][db][qb][sb][bc][cc][qc][rd][bo][bp][cq][qq][rq][br][cr][pr][qr]
+)
diff --git a/regression/games/life_and_death/tripod9.sgf b/regression/games/life_and_death/tripod9.sgf
new file mode 100644 (file)
index 0000000..7fe7970
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[tripod9]
+DT[2000-11-24]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[aa][ca][ea][ra][ab][bb][fb][ob][sb][dc][ec][fc][gc][mc][nc][oc][pc][sc][cd][dd][pd][qd][be][ce][qe][se][cf][qf][rf][cg][qg][rh][cm][qm][cn][qn][ao][bo][co][qo][ro][so][ap][cp][dp][pp][qp][bq][dq][eq][fq][gq][mq][nq][oq][pq][er][or][rr][bs][qs][ss]
+AB[da][pa][cb][db][eb][pb][qb][rb][bc][cc][qc][rc][ad][bd][rd][sd][re][rp][sp][aq][cq][qq][rq][br][cr][dr][pr][qr][sr][as][ps]
+)
diff --git a/regression/games/lordofpi.sgf b/regression/games/lordofpi.sgf
new file mode 100644 (file)
index 0000000..4bd952c
--- /dev/null
@@ -0,0 +1,28 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[LordOfPi-GnuGo(B) NNGS]
+EV[None]
+RE[W+18.5]
+PW[LordOfPi]WR[12k*]
+PB[GnuGo]BR[14k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2001-10-24]
+SZ[9]TM[600]KM[0.5]
+
+HA[2]AB[gc][cg]
+;W[ff]C[
+ kungfu started observation.
+]
+;B[cc]C[
+ bump started observation.
+]
+;W[eg];B[ec];W[ce];B[dh];W[eh];B[bf];W[bh];B[de];W[df];B[be];W[cf];B[ch]
+;W[bd];B[bg];W[cd];B[he];W[gf];B[hf];W[hg];B[ig];W[hh];B[ee];W[gd];B[hd]
+;W[fd];B[fc];W[dd];B[dc];W[ed];B[bc];W[ac];B[ab];W[ad];B[bb];W[ae];B[bi]
+;W[ah];B[di];W[ei];B[ih];W[if];B[ie];W[ge];B[af];W[dg];B[hi];W[gi];B[if]
+;W[ii];B[gg];W[hc];B[hi];W[gh];B[ic];W[hb];B[ib];W[ii];B[gb];W[id];B[ha]
+;W[ia];B[ib];W[ic];B[ga];W[ia];B[ih];W[ib];B[tt];W[tt]
+;)
diff --git a/regression/games/manner.sgf b/regression/games/manner.sgf
new file mode 100644 (file)
index 0000000..bf88f15
--- /dev/null
@@ -0,0 +1,17 @@
+(;FF[4]GM[1]
+SZ[19]
+GN[GNU Go 2.7.221 Random Seed 983022315]
+DT[2001-02-24]
+KM[5.5]AP[gnugo:2.7.221]RU[Japanese]
+ ;B[pd]
+ ;W[dp]
+ ;B[pp]
+ ;W[dd]
+ ;B[pj]
+ ;W[nc]
+ ;B[jp]
+ ;W[dj]
+ ;B[lc]
+ ;W[ne]
+ ;B[pf]
+ ;W[nd])
diff --git a/regression/games/marginal.sgf b/regression/games/marginal.sgf
new file mode 100644 (file)
index 0000000..435fbcc
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.5.55 ascii]
+HA[0]KM[0.5]
+GN[GNU Go 2.5.55 ascii Random Seed 947555410]
+;
+AW[ha][ja][hb][ib][jb][kb][lb][mb][qb][sb][fc][gc][qc][rc][sc][fd][hd][id][jd][ld][md][nd][ae][be][ee][ge][bf][df][ff][ag][bg][dg][fg][og][pg][rg][bh][dh][gh][hh][ih][jh][lh][qh][rh][bi][di][ii][li][oi][qi][bj][jj][kj][oj][qj][ck][dk][ek][fk][hk][lk][ok][qk][cl][el][hl][ll][nl][ol][pl][ql][sl][dm][em][fm][gm][hm][mm][qm][dn][gn][nn][on][qn][sn][do][ho][ro][so][dp][ep][fp][hp][rp][jq][kq][lq][mq][nq][oq][pq][qq][ar][br][cr][dr][er][fr][jr][qr][bs][ns][ps]
+AB[ka][ma][oa][qa][sa][eb][fb][gb][nb][pb][rb][ec][hc][ic][jc][kc][lc][mc][nc][oc][pc][bd][cd][dd][ed][od][pd][ce][he][ie][je][ke][le][me][ne][oe][pe][qe][re][se][cf][ef][cg][eg][jg][lg][mg][ng][ah][ch][eh][kh][oh][ci][ei][ji][ni][pi][ri][si][aj][cj][dj][ej][fj][hj][ij][pj][rj][ak][bk][gk][ik][pk][rk][sk][bl][fl][rl][cm][lm][nm][om][pm][rm][cn][en][fn][ln][pn][rn][bo][co][eo][fo][mo][no][oo][po][qo][ap][cp][gp][qp][bq][cq][dq][eq][fq][hq][gr][kr][lr][mr][nr][or][pr][ds][fs][ks][ms]
+)
diff --git a/regression/games/marginal_ko.sgf b/regression/games/marginal_ko.sgf
new file mode 100644 (file)
index 0000000..b50c9c7
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-27]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ga][la][ma][oa][bb][gb][kb][mb][nb][ob][ac][cc][fc][gc][lc][nc][ad][bd][cd][dd][ed][fd][ld][md][od][be][ie][je][me][ne][af][bf][hf][if][kf][nf][bg][cg][gg][ig][jg][kg][ng][ah][ch][hh][jh][bi][di][ei][hi][ii][dj][ej][gj][ij][jj][mj][oj][pj][ek][gk][mk][nk][ok][el][gl][ml][nl][dm][em][hm][im][mm][om][an][cn][en][fn][gn][in][nn][on][pn][ao][bo][co][mo][no][po][ap][bp][cp][dp][ep][fp][np][op][sp][aq][cq][fq][gq][jq][kq][qq][rq][gr][hr][ir][jr][lr][pr][rr][gs][ks][qs][ss]
+AB[ba][ca][ea][ia][ja][ka][qa][ab][cb][db][eb][hb][jb][qb][hc][ic][jc][kc][oc][pc][qc][gd][hd][kd][pd][de][ee][fe][ge][le][oe][pe][df][ff][gf][lf][pf][dg][fg][lg][mg][pg][dh][eh][fh][gh][kh][lh][nh][oh][ph][qh][ai][ci][gi][ji][li][mi][oi][qi][ri][aj][bj][cj][hj][kj][lj][nj][rj][bk][dk][hk][ik][kk][pk][qk][bl][cl][dl][il][jl][kl][ol][ql][am][cm][km][lm][pm][qm][bn][dn][hn][jn][kn][mn][qn][rn][sn][do][eo][fo][go][io][ko][lo][ro][gp][hp][ip][jp][kp][lp][pp][qp][rp][bq][lq][mq][oq][pq][ar][cr][dr][er][mr][nr][or][bs][cs][es][ls][ms][os][ps]
+)
diff --git a/regression/games/me.sgf b/regression/games/me.sgf
new file mode 100644 (file)
index 0000000..2f8a41a
--- /dev/null
@@ -0,0 +1,36 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[me-GnuGo(B) NNGS]
+EV[None]
+RE[B+Resign]
+PW[me]WR[UR ]
+PB[GnuGo]BR[16k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-11-28]
+SZ[19]TM[600]KM[5.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[nq];B[pn];W[no];B[cn];W[hq];B[eq];W[jn];B[fc];W[cc];B[cd];W[dc]
+;B[ec];W[eb];B[dg];W[fb];B[gc];W[gb];B[nc];W[hc];B[qe];W[he];B[io];W[ho]
+;B[cl];W[mj];B[hp];W[gp];B[ip];W[in];B[go];W[hn];B[gq];W[gr];B[fq];W[ir]
+;B[iq];W[jr];B[hr];W[kp];B[is];W[ih]C[
+ bump started observation.
+]
+;B[kr];W[kq];B[js];W[jq];B[lr];W[jo];B[hq];W[lo];B[lc];W[gn];B[fo];W[hj]
+;B[hi];W[ii];B[ij];W[gj];B[hh];W[fe];B[ee];W[fd];B[ed];W[hg];B[gh];W[eh]
+;B[ig];W[jg];B[if];W[kh];B[jl];W[hl];B[ll];W[kk];B[gd];W[ge];B[hd];W[ie]
+;B[jf];W[id];B[jh];W[ji];B[ki];W[jh];B[kj];W[lh];B[ic];W[jc];B[lk];W[kd]
+;B[hb];W[je];B[gg];W[bd];B[be];W[bb];B[hf];W[kf];B[eg];W[gf];B[hg];W[fh]
+;B[fg];W[dh];B[jb];W[ch];B[nl];W[kl];B[km];W[lj];B[fi];W[fj];B[ei];W[mm]
+;B[ml];W[om];B[cg];W[ok];B[bh];W[ol];B[on];W[nn];B[nm];W[lm];B[fn];W[fm]
+;B[pk];W[pm];B[ph];W[pq];B[qq];W[op];B[po];W[qr];B[pr];W[rr];B[oq];W[or]
+;B[pq];W[ps];B[rn];W[rm];B[qm];W[ql];B[rq];W[qn];B[qo];W[qm];B[nr];W[mr]
+;B[sn];W[ns];B[rp];W[lq];B[ks];W[qj];B[qi];W[rj];B[ri];W[oi];B[pi];W[of]
+;B[ni];W[nh];B[pf];W[oe];B[oj];W[nk];B[mi];W[li];B[mh];W[mg];B[nj];W[oh]
+;B[me];W[md];B[ld];W[nd];B[mc];W[le];B[od];W[ne];B[rk];W[qk];B[sj];W[rl]
+;B[sk];W[sl];B[si];W[sq];B[ad];W[sp];B[sr];W[ss];B[jk];W[bc];B[mk];W[kn]
+;B[lg];W[kg];B[ng];W[mf];B[og];W[jm];B[kl];W[il];B[pl];W[ik];B[sm]
+;)
diff --git a/regression/games/mertin13x13/DAGN1.sgf b/regression/games/mertin13x13/DAGN1.sgf
new file mode 100644 (file)
index 0000000..f30f6e0
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Dariush v2.6.8.2]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-07]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+40.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[cj];B[dc];W[kk];B[de];W[kf];B[hc];W[ld]\r
+;B[kc];W[jh];B[ej];W[ek];B[dk];W[dj];B[fk];W[el];B[dl];W[fl]\r
+;B[gk];W[ei];B[fj];W[gl];B[dh];W[ck];B[ci];W[di];B[ch];W[gg]\r
+;B[ih];W[gi];B[fg];W[ig];B[fi];W[fh];B[ff];W[bj];B[bi];W[lc]\r
+;B[lb];W[hf];B[eh];W[gh];B[hk];W[gd];B[gc];W[mb];B[ka];W[ge]\r
+;B[ke];W[le];B[aj];W[cl];B[fd];W[ak];B[ai];W[ik];B[al];W[bk]\r
+;B[cm];W[dm];B[jf];W[jg];B[li];W[lg];B[lk];W[ll];B[ie];W[kd]\r
+;B[ic];W[je];B[if];W[jb];B[kb];W[jc];B[ib];W[id];B[ja];W[jd]\r
+;B[kj];W[kl];B[ji];W[mk];B[ij];W[hh];B[jk];W[il];B[hl];W[jl]\r
+;B[hj];W[lj];B[hd];W[he];B[fe];W[ii];B[hi];W[hm];B[ih];W[gf]\r
+;B[jj];W[ii];B[mi];W[kh];B[ih];W[ki];B[la];W[mc];B[tt];W[ma]\r
+;B[ia];W[tt];B[tt]\r
+C[W+40.5]\r
+)\r
diff --git a/regression/games/mertin13x13/DAGN2.sgf b/regression/games/mertin13x13/DAGN2.sgf
new file mode 100644 (file)
index 0000000..cfd5a12
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Dariush v2.6.8.2]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-07]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+52.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1033955101 level 15];B[kd];W[ck];B[jk];W[dc];B[de];W[fd];B[ji];W[ic]\r
+;B[je];W[ff];B[gd];W[gc];B[cc];W[cb];B[cd];W[ch];B[ek];W[cf]\r
+;B[jb];W[he];B[eg];W[ef];B[dg];W[df];B[dl];W[fg];B[bb];W[db]\r
+;B[cj];W[bj];B[eh];W[gi];B[dj];W[bi];B[hj];W[cg];B[fi];W[jc]\r
+;B[kc];W[gh];B[ii];W[ig];B[jg];W[gj];B[fk];W[gk];B[hl];W[gl]\r
+;B[gm];W[fl];B[im];W[ib];B[ka];W[fm];B[cl];W[bk];B[hg];W[if]\r
+;B[hh];W[ia];B[id];W[ie];B[jd];W[hd];B[ih];W[jf];B[kf];W[ja]\r
+;B[kb];W[hk];B[ik];W[hi];B[hf];W[ge];B[ij];W[hm];B[il];W[gm]\r
+;B[bd];W[ba];B[bf];W[bg];B[af];W[ac];B[ad];W[ab];B[bc];W[ce]\r
+;B[be];W[dd];B[aa];W[ab];B[fh];W[fj];B[ej];W[di];B[ci];W[dh]\r
+;B[ei];W[gg];B[jh];W[gf];B[bl];W[al];B[tt];W[tt]\r
+C[W+52.5]\r
+)\r
diff --git a/regression/games/mertin13x13/DAGN3.sgf b/regression/games/mertin13x13/DAGN3.sgf
new file mode 100644 (file)
index 0000000..fa49cdf
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Dariush v2.6.8.2]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-07]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+2.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1033992448 level 15];B[kc];W[dc];B[cj];W[cf];B[jk];W[jf];B[ej];W[jh]\r
+;B[ki];W[kh];B[ji];W[ic];B[de];W[jb];B[fd];W[ee];B[lh];W[df]\r
+;B[lf];W[hh];B[gi];W[lb];B[dh];W[kd];B[jd];W[id];B[ld];W[ke]\r
+;B[bg];W[bf];B[kf];W[jc];B[le];W[je];B[lc];W[fg];B[fh];W[ii]\r
+;B[ij];W[eg];B[hi];W[ih];B[cg];W[ag];B[ah];W[af];B[bh];W[gh]\r
+;B[eh];W[kg];B[mb];W[lg];B[mi];W[la];B[mg];W[kb];B[mc];W[dg]\r
+;B[dd];W[ed];B[db];W[cc];B[cb];W[bb];B[eb];W[fc];B[ec];W[bc]\r
+;B[gc];W[ca];B[fb];W[hb];B[gb];W[ga];B[fa];W[ma];B[fe];W[ef]\r
+;B[hd];W[ge];B[he];W[gf];B[ha];W[gd];B[hc];W[ib];B[da];W[ie]\r
+;B[ba];W[hf];B[tt];W[tt]\r
+C[W+2.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GAGN1.sgf b/regression/games/mertin13x13/GAGN1.sgf
new file mode 100644 (file)
index 0000000..5cc8d68
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[0]\r
+PB[GoAhead v4.2]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-18]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+29.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[dj];B[cd];W[jj];B[kh];W[ec];B[gc];W[ee]\r
+;B[df];W[fc];B[ef];W[bb];B[cb];W[gb];B[hj];W[ii];B[kk];W[kj]\r
+;B[jk];W[lk];B[ij];W[jh];B[kg];W[kl];B[jl];W[ll];B[hi];W[mi]\r
+;B[gd];W[fk];B[hg];W[hh];B[gh];W[ig];B[hb];W[ih];B[cc];W[gi]\r
+;B[gj];W[fi];B[gg];W[jm];B[fj];W[ei];B[if];W[ik];B[gk];W[fl]\r
+;B[il];W[hl];B[hk];W[im];B[ch];W[bi];B[kd];W[bh];B[bg];W[ag]\r
+;B[bf];W[af];B[ae];W[mg];B[ki];W[ji];B[ah];W[ai];B[ci];W[bj]\r
+;B[cj];W[ck];B[bk];W[cl];B[aj];W[lf];B[le];W[kf];B[jf];W[li]\r
+;B[ke];W[bl];B[lg];W[mf];B[me];W[mh];B[al];W[fh];B[fg];W[eh]\r
+;B[di];W[ej];B[eg];W[dh];B[fb];W[dg];B[cg];W[bm];B[tt];W[lh]\r
+;B[jg];W[lj];B[tt];W[dl];B[tt];W[am];B[ak];W[tt];B[tt];\r
+C[B+29.5\r
+\r
+Zeitverbrauch Schwarz: 8:49]\r
+)\r
diff --git a/regression/games/mertin13x13/GAGN2.sgf b/regression/games/mertin13x13/GAGN2.sgf
new file mode 100644 (file)
index 0000000..ddba20f
--- /dev/null
@@ -0,0 +1,43 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GoAhead v4.2]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-18]\r
+PC[OS]\r
+KM[5.5]\r
+RE[W+0.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[ic];B[dc];W[je];B[ke];W[jf];B[kg];W[ck]\r
+;B[kj];W[ih];B[gc];W[ce];B[ge];W[ik];B[gg];W[eg];B[id];W[gh]\r
+;B[jd];W[fk];B[cd];W[de];B[ig];W[ch];B[jg];W[kl];B[hh];W[hi]\r
+;B[hg];W[fg];B[ii];W[gi];B[ll];W[lk];B[jl];W[lm];B[jk];W[ml]\r
+;B[ij];W[bd];B[gm];W[dd];B[cc];W[lj];B[hk];W[li];B[bc];W[be]\r
+;B[lh];W[ac];B[ki];W[bb];B[db];W[cb];B[ca];W[ec];B[eb];W[fc]\r
+;B[fb];W[fd];B[gd];W[fe];B[ba];W[ab];B[gj];W[fj];B[fl];W[el]\r
+;B[gl];W[em];B[ff];W[ef];B[gf];W[mh];B[mg];W[mi];B[gk];W[jm]\r
+C[ B+2.5]\r
+\r
+(;B[il]\r
+C[ ?? (GAw49?)]\r
+;W[im]\r
+C[ B+0.5]\r
+\r
+(;B[hj]\r
+C[ ???]\r
+;W[hm];B[fi];W[fh];B[fm];W[ek];B[hl];W[km];B[kk]\r
+;W[ad];B[da];W[aa];B[tt];W[tt];B[tt]\r
+C[W+0.5\r
+\r
+Zeitverbrauch Schwarz: 7:39]\r
+)\r
+(;B[hm]\r
+C[ ! !  (GAw49!)]\r
+;W[km];B[hj];W[kk];B[fm];W[dk];B[da];W[ad]))\r
+(;B[im]\r
+C[ !]\r
+;W[km];B[hj];W[kk];B[fm];W[dk];B[da];W[ad]\r
+C[ B+2.5]\r
+))\r
diff --git a/regression/games/mertin13x13/GAGN3.sgf b/regression/games/mertin13x13/GAGN3.sgf
new file mode 100644 (file)
index 0000000..c79b206
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[ ]\r
+PW[ ]\r
+DT[19.11.2002]\r
+KM[5.5];B[kc];W[di];B[jk];W[jf];B[dc];W[ki];B[gk];W[lk]\r
+;B[kl];W[ce];B[gc];W[dk];B[id];W[bc];B[cb];W[eg];B[lf];W[fl]\r
+;B[gl];W[fk];B[gj];W[bb];B[lh];W[ii];B[kh];W[jh];B[kj];W[li]\r
+;B[ll];W[kg];B[lg];W[kf]\r
+(;B[mh]\r
+C[ ??]\r
+;W[le];B[ke];W[ld];B[kd];W[mi];B[lc];W[mf];B[ee]\r
+;W[ef];B[fe];W[hf];B[je];W[if];B[fm];W[em];B[gm];W[dl];B[fg]\r
+;W[ff];B[gg];W[gf];B[hh];W[fh];B[gh];W[fi];B[ij];W[ca];B[da]\r
+;W[ba];B[bj];W[bh];B[cd];W[bd];B[de];W[cc];B[db];W[cf];B[hi]\r
+;W[dd];B[ed];W[lj];B[mk];W[md];B[mc];W[mg];B[fj];W[ej];B[df]\r
+;W[dg];B[ge];W[he];B[hd];W[gi];B[ih];W[ji];B[ig];W[cd];B[jj]\r
+;W[kk];B[ie];W[mj];B[ml];W[jg];B[tt];W[hg];B[hj];W[tt];B[tt]\r
+C[W+16.5\r
+\r
+Zeitverbrauch Schwarz  14:53]\r
+)\r
+(;B[ke]\r
+C[ !]\r
+;W[gh]))\r
diff --git a/regression/games/mertin13x13/GHGN1.sgf b/regression/games/mertin13x13/GHGN1.sgf
new file mode 100644 (file)
index 0000000..b46c9c5
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Goliath 3.5]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-05-14]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+33.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1826268409 level 15];B[jd]\r
+C[ (preset - vorgegeben)]\r
+;W[cj];B[dc];W[kk];B[ce];W[kf];B[ek];W[gk]\r
+;B[ei];W[dh];B[eh];W[hh];B[cl];W[dg];B[eg];W[bg];B[df];W[be]\r
+;B[ef];W[cf];B[gc];W[kc];B[kd];W[jc];B[id];W[ch];B[ib];W[ld]\r
+;B[ic];W[lc];B[bk];W[if];B[bd];W[cd];B[bc];W[de];B[gi];W[hi]\r
+;B[hj];W[hk];B[gj];W[ij];B[fk];W[ed];B[cc];W[ec];B[eb];W[fb]\r
+;B[db];W[fc];B[gd];W[dd];B[fe];W[gl];B[gb];W[fa];B[hf];W[ji]\r
+;B[gh];W[hg];B[gg];W[jb];B[fl];W[bj];B[ea];W[ad];B[ac];W[fm]\r
+;B[em];W[gm];B[ae];W[af];B[dj];W[ak];B[al];W[aj];B[ck];W[di]\r
+;B[ga];W[ie];B[he];W[je];B[ja];W[ka];B[ia];W[ke];B[tt];W[ad]\r
+;B[fd];W[ae];B[tt];W[ce];B[tt];W[ee];B[tt];W[tt]\r
+C[W+33.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GHGN2.sgf b/regression/games/mertin13x13/GHGN2.sgf
new file mode 100644 (file)
index 0000000..ce8290b
--- /dev/null
@@ -0,0 +1,48 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Goliath 3.5]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-05-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+6.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1021585910 level 15];B[kd]\r
+C[ (preset - vorgegeben)]\r
+;W[ck];B[dc];W[kk];B[ce];W[ic];B[ki];W[je]\r
+;B[ke];W[jf];B[gc];W[kf];B[kb];W[ii];B[jj];W[jk];B[ik];W[ij]\r
+;B[hk];W[ji];B[ib];W[fk];B[gj];W[ch];B[gf];W[bf];B[cf];W[bg]\r
+;B[fj];W[ej];B[fh];W[jc];B[kc];W[hb];B[hc];W[jb];B[he];W[id]\r
+;B[gb];W[le];B[ld];W[lf];B[kj];W[lk];B[li];W[ia];B[lg];W[lh]\r
+;B[kg];W[mi];B[mj]\r
+(;W[if]\r
+C[ ??]\r
+;B[jg]\r
+(;W[lj]\r
+C[ ?]\r
+;B[mh];W[il];B[hl];W[lm];B[ig];W[ka];B[la];W[mb]\r
+;B[lb];W[mc];B[md];W[ja];B[jd];W[ie];B[ml];W[jl];B[mk];W[ll]\r
+;B[hm];W[hi];B[hg];W[ma];B[ei];W[ek];B[di];W[eg];B[dh];W[ci]\r
+;B[dj];W[cj];B[dk];W[dl];B[ih];W[be];B[dg];W[bd];B[bb];W[bc]\r
+;B[cb];W[ab];B[fl];W[el];B[fm];W[ga];B[eb];W[fa];B[ea];W[gk]\r
+;B[em];W[cl];B[gl];W[im];B[hj]\r
+C[ !]\r
+;W[mm];B[mi];W[km];B[fb];W[ha]\r
+;B[hf];W[me];B[dm];W[cm];B[ba];W[cd];B[dd];W[hd];B[gd];W[lc]\r
+;B[aa];W[ac];B[mg];W[cg];B[tt];W[cc];B[tt];W[mf];B[tt];W[tt]\r
+C[W+6.5]\r
+)\r
+(;W[kh]\r
+C[ !]\r
+))\r
+(;W[kh]\r
+C[ !]\r
+\r
+(;B[mh];W[jh])\r
+(;B[jh];W[lj])))\r
diff --git a/regression/games/mertin13x13/GHGN3.sgf b/regression/games/mertin13x13/GHGN3.sgf
new file mode 100644 (file)
index 0000000..4c3ce1d
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Goliath 3.5]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-05-14]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+48.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1499364881 level 15];B[kc]\r
+C[ (preset - vorgegeben)]\r
+;W[ck];B[dc];W[kk];B[ce];W[ch];B[ki];W[ii]\r
+;B[jj];W[jk];B[ij];W[hi];B[ik];W[il];B[hl];W[jm];B[hk];W[lj]\r
+;B[li];W[ll];B[kf];W[hf];B[gd];W[hd];B[ge];W[he];B[gc];W[fk]\r
+;B[gj];W[ib];B[fg];W[jf];B[je];W[kb];B[jc];W[ie];B[ke];W[la]\r
+;B[lc];W[bf];B[cf];W[bg];B[be];W[ae];B[ad];W[af];B[bd];W[gl]\r
+;B[hm];W[fj];B[gi];W[eh];B[eg];W[dg];B[df];W[cg];B[mj];W[mk]\r
+;B[mi];W[kj];B[fh];W[ji];B[kg];W[fi];B[gh];W[gk];B[hj];W[im]\r
+;B[gm];W[fm];B[ei];W[di];B[dh];W[ej];B[eh];W[dj];B[jh];W[tt]\r
+;B[tt];W[tt]\r
+C[B+48.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GIGN1.sgf b/regression/games/mertin13x13/GIGN1.sgf
new file mode 100644 (file)
index 0000000..4dab428
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Intellect 10.0]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-05-11]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+12.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1021140863 level 15];B[jd];W[dj];B[dc];W[kj];B[ce];W[kf];B[kc];W[if]\r
+;B[dh];W[fj];B[ck];W[dk];B[cj];W[fh];B[gd];W[ik];B[dl];W[el]\r
+;B[cl];W[eg];B[di];W[ej];B[dg];W[ld];B[lc];W[ke];B[he];W[ef]\r
+;B[fe];W[hf];B[gf];W[gg];B[ee];W[mc];B[mb];W[md];B[lb];W[df]\r
+;B[cf];W[dm];B[cm];W[em];B[cd];W[ff];B[ge];W[ie];B[id];W[je]\r
+;B[jj];W[ei];B[ji];W[jk];B[kl];W[hi];B[kk];W[lj];B[lk];W[kh]\r
+;B[jl];W[il];B[lm];W[ml];B[mk];W[jm];B[ki];W[li];B[lh];W[lg]\r
+;B[km];W[de];B[im];W[dd];B[ij];W[hj];B[jh];W[jg];B[hk];W[hl]\r
+;B[hm];W[gk];B[mh];W[ih];B[kg];W[ii];B[gl];W[kh];B[fl];W[ed]\r
+;B[fm];W[ek];B[ec];W[fd];B[fc];W[eh];B[gc];W[kd];B[mj];W[mi]\r
+;B[jj];W[mg];B[tt];W[tt]\r
+C[W+12.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GIGN2.sgf b/regression/games/mertin13x13/GIGN2.sgf
new file mode 100644 (file)
index 0000000..de6e9f6
--- /dev/null
@@ -0,0 +1,37 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Intellect 10.0]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-05-12]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+0.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1021165832 level 15];B[kd];W[dk];B[cd];W[jj];B[ec];W[kg];B[jc];W[gh]\r
+;B[ch];W[jk];B[ck];W[cl];B[dj];W[ek];B[bk];W[bl];B[ej];W[gf]\r
+;B[fj];W[hl];B[fk];W[fl];B[ee];W[ak];B[cj];W[ai];B[eg];W[ie]\r
+;B[id];W[le];B[ke];W[kf];B[ld];W[lf];B[he];W[hf];B[bg];W[ge]\r
+;B[hd];W[je];B[gd];W[md];B[mc];W[me];B[lc];W[gk];B[gj];W[hj]\r
+;B[fh];W[fg];B[ff];W[gg];B[gi];W[hi];B[fe];W[ag];B[af];W[ah]\r
+;B[bf]\r
+(;W[jd]\r
+C[ ???]\r
+;B[if];W[jf];B[bh]\r
+(;W[aj]\r
+C[B+0.5]\r
+;B[hh];W[ig];B[bi];W[al];B[bj];W[tt];B[tt];W[tt]\r
+C[B+0.5]\r
+)\r
+(;W[bi]\r
+C[ ??]\r
+;B[aj]\r
+C[ !]\r
+;W[bj];B[ci]))\r
+(;W[bi]\r
+C[ W+0.5 !]\r
+))\r
diff --git a/regression/games/mertin13x13/GIGN3.sgf b/regression/games/mertin13x13/GIGN3.sgf
new file mode 100644 (file)
index 0000000..3c7f370
--- /dev/null
@@ -0,0 +1,42 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Intellect 10.0]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-05-13]\r
+PC[OS]\r
+KM[5.5]\r
+RE[W+21.5]\r
+US[Mertin]\r
+EV[CGoT]RL[1]HD[0];B[kc];W[cj];B[cd]EL[7]MD[0];W[hd];B[ec]EL[9]MD[1122];W[hf];B[ke]EL[7]MD[4122];W[ee]\r
+;B[kj]EL[6]MD[1124];W[hh];B[jg]EL[6]MD[6124];W[ik];B[jk]EL[12]MD[12122];W[ij];B[dk]EL[15]MD[12122];W[ck];B[fk]EL[12]MD[1122];W[dj]\r
+(;B[gj]EL[18]MD[12124];W[ej];B[hi]EL[33]MD[6122];W[ii];B[ih]EL[23]MD[1122];W[ek];B[gg]EL[41]MD[3124];W[jh];B[ig]EL[39]MD[2122]\r
+;W[gi];B[el]EL[34]MD[10124];W[hj];B[ji]EL[36]MD[4122];W[jj];B[kh]EL[31]MD[5122];W[kk];B[lk]EL[12]MD[6122];W[kl];B[ll]EL[5]MD[3122]\r
+;W[hg];B[gk]EL[16]MD[1122];W[jl];B[dl]EL[12]MD[3042];W[cl];B[hl]EL[10]MD[4042];W[dm];B[em]EL[6]MD[1042];W[cf];B[cm]EL[-7]MD[4042]\r
+;W[bl];B[il]EL[-13]MD[2042];W[gm];B[fg]EL[-11]MD[4042];W[fe];B[de]EL[-1]MD[3042];W[df];B[fi]EL[-36]MD[2024];W[fj];B[hk]EL[5]MD[600]\r
+;W[im];B[fm]EL[-23]MD[2042];W[hm];B[be]EL[-19]MD[2042];W[ce];B[dd]EL[-21]MD[1022];W[bf];B[bd]EL[-20]MD[1042];W[lm];B[km]EL[-20]MD[2033]\r
+;W[lj];B[ki]EL[-25]MD[1034];W[ml];B[mm]EL[-1]MD[600];W[ic];B[li]EL[-21]MD[2022];W[lm];B[mj]EL[-20]MD[600];W[jb];B[kb]EL[-24]MD[1042]\r
+;W[jm];B[gc]EL[-24]MD[2042];W[hb];B[gb]EL[-24]MD[1042];W[ka];B[la]EL[-24]MD[1032];W[ja];B[lb]EL[-29]MD[1032];W[ga];B[fa]EL[-26]MD[1022]\r
+;W[ha];B[fb]EL[-31]MD[1032];W[km];B[hc]EL[-18]MD[2042]\r
+(;W[jd]\r
+C[ ?]\r
+;B[ib]EL[-25]MD[1043]\r
+(;W[ia]\r
+C[ (?)]\r
+;B[jc]EL[-7]MD[600];W[gd];B[af]EL[-12]MD[2041];W[ag];B[ae]EL[-22]MD[600];W[ah];B[kd]EL[-17]MD[4041];W[je]\r
+;B[mk]EL[-17]MD[4041];W[jf];B[kf]EL[-18]MD[1041];W[if];B[fh]EL[-18]MD[2041];W[gh];B[eg]EL[-20]MD[2022];W[ei];B[dg]EL[-19]MD[1022];W[bg]\r
+;B[ib]EL[-17]MD[4041];W[id];B[mm]EL[-18]MD[2041];W[fd];B[ml]EL[-18]MD[1031];W[fc];B[ed]EL[-18]MD[600];\r
+C[W+21.5]\r
+)\r
+(;W[jc]\r
+C[ (!)]\r
+))\r
+(;W[id]\r
+C[ !  W+31.5]\r
+)\r
+(;W[jc]\r
+C[ ?]\r
+;B[id];W[jd];B[ie]))\r
+(;B[cf];W[dg];B[dl];W[cl];B[hl];W[il]))\r
diff --git a/regression/games/mertin13x13/GMGN1.sgf b/regression/games/mertin13x13/GMGN1.sgf
new file mode 100644 (file)
index 0000000..d7049a9
--- /dev/null
@@ -0,0 +1,30 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GoeMate2001 lev9]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+3.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[cj];B[cd];W[jj];B[ek];W[gk];B[ec];W[ej]\r
+;B[hc];W[dl];B[kh];W[el];B[ih];W[ki];B[lh];W[cf];B[gh];W[ef]\r
+;B[eh];W[dh];B[fe];W[li];B[mi];W[mj];B[mh];W[lk];B[di];W[ei]\r
+;B[dg];W[ch];B[cg];W[eg];B[bg];W[bf];B[df];W[de];B[bh];W[fh]\r
+;B[ce];W[bi];B[ee];W[kc];B[kd];W[ag]\r
+(;B[gg];W[dd];B[dc];W[ah];B[be];W[ae]\r
+(;B[bc]\r
+(;W[ad];B[ac];W[ii];B[gi];W[hi];B[hh];W[ed];B[fd];W[df]\r
+;B[ld];W[jh];B[jg];W[ff];B[gf];W[gj];B[fi];W[fg];B[fj];W[fk]\r
+;B[ji];W[ik];B[jh];W[af];B[bd];W[tt];B[tt]\r
+C[W+3.5]\r
+)\r
+(;W[ac];B[hj]))\r
+(;B[ad]\r
+C[ ?]\r
+;W[cc];B[af];W[bc]))\r
+(;B[dd];W[ah];B[be];W[de];B[gg];W[ii]))\r
diff --git a/regression/games/mertin13x13/GMGN2.sgf b/regression/games/mertin13x13/GMGN2.sgf
new file mode 100644 (file)
index 0000000..eb1c45b
--- /dev/null
@@ -0,0 +1,29 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GoeMate2001 lev9]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+10.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[ck];B[dd];W[kk];B[cf];W[fc];B[hc];W[fe]\r
+;B[ci];W[fk];B[ik];W[fb];B[ii];W[cc];B[kh];W[li];B[lh];W[jl]\r
+;B[cd];W[bc];B[eg];W[ia];B[ib];W[ha];B[gf];W[bd];B[kb];W[be]\r
+;B[dj];W[fi];B[il];W[ki];B[dk];W[dl];B[el];W[cl];B[ek];W[bj]\r
+;B[bi];W[dm];B[bf];W[al];B[ed];W[fd];B[ff];W[hd];B[em];W[if]\r
+;B[he];W[hg];B[kf];W[hi];B[gh];W[ih];B[ij];W[id];B[ie];W[ee]\r
+;B[df];W[jb];B[jc];W[je];B[ja];W[jf];B[ke];W[jd];B[gj];W[fj]\r
+;B[gi];W[hh];B[jg];W[jh];B[ji];W[ll];B[fh];W[mh];B[mg];W[mi]\r
+;B[kg];W[hf];B[ge];W[gd];B[db];W[dc];B[da];W[ga];B[ec];W[eb]\r
+;B[aj];W[ak];B[ai];W[bl];B[cj];W[bm];B[hj];W[jj];B[jk];W[jm]\r
+;B[im];W[kj];B[ae];W[ic];B[hb];W[ad];B[ac];W[af];B[ag];W[gb]\r
+;B[ce];W[gg];B[ae];W[cb];B[fg];W[af];B[ea];W[ae];B[bg];W[bk]\r
+;B[bb];W[ab];B[ig];W[ef];B[de];W[ca];B[tt];W[fa];B[tt];W[gc]\r
+;B[jb];W[tt];B[tt]\r
+C[B+10.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GMGN3.sgf b/regression/games/mertin13x13/GMGN3.sgf
new file mode 100644 (file)
index 0000000..ea560d2
--- /dev/null
@@ -0,0 +1,45 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GoeMate2001 lev9]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+6.5]\r
+AN[Mertin 8k]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[cj];B[ek];W[ik];B[dd];W[di];B[kj];W[fj]\r
+;B[fc];W[fk];B[jg];W[jd];B[kd];W[cf];B[je];W[bd];B[cc];W[hg]\r
+;B[ef];W[kl];B[fh];W[hi];B[ce];W[be];B[bc];W[eg];B[fg];W[df]\r
+;B[ff];W[he];B[hf];W[if];B[gf];W[lj];B[lk];W[kk];B[li];W[jj]\r
+;B[ki];W[ll];B[ig];W[mk];B[eh];W[mi];B[mh];W[mj];B[lg];W[ac]\r
+;B[ab];W[ad];B[ba];W[ih];B[ei];W[ej];B[dg];W[cg];B[dh];W[ch]\r
+;B[jh];W[ji];B[gi];W[kh];B[lh]\r
+(;W[ie]\r
+C[ ?!]\r
+;B[jf];W[hc];B[ib];W[gj];B[de];W[fi];B[gh];W[hh]\r
+;B[cd];W[bf];B[gg];W[tt];B[tt]\r
+C[B+6.5]\r
+)\r
+(;W[jf]\r
+C[ !?]\r
+;B[kg];W[ke];B[le];W[kf]\r
+(;B[id]\r
+C[ !]\r
+;W[ie]\r
+(;B[lf]\r
+C[ !]\r
+;W[de];B[ee];W[cd];B[ed];W[gj];B[gh];W[hh]\r
+C[ B+1.5]\r
+)\r
+(;B[jc]\r
+C[ ?]\r
+;W[lf]))\r
+(;B[jc]\r
+C[ ?]\r
+;W[lf];B[mf];W[ie];B[ld];W[ic];B[ib];W[hc];B[hb]\r
+;W[gc];B[gb];W[fd];B[de];W[ec];B[ee];W[fb];B[gj])))\r
diff --git a/regression/games/mertin13x13/GNDA1.sgf b/regression/games/mertin13x13/GNDA1.sgf
new file mode 100644 (file)
index 0000000..77402d4
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Dariush v2.6.8.2]\r
+DT[2002-10-07]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+39.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 658974123 level 15];B[jd];W[dk];B[cd];W[kj];B[gk];W[di];B[hc];W[ik]\r
+;B[gi];W[ed];B[de];W[kf];B[le];W[gl];B[fk];W[fl];B[gg];W[cg]\r
+;B[if];W[be];B[bd];W[cf];B[kh];W[li];B[lh];W[mh];B[mg];W[db]\r
+;B[ef];W[ji];B[fc];W[bb];B[ec];W[ad];B[ac];W[ba];B[eb];W[da]\r
+;B[ab];W[mi];B[lf];W[ih];B[jg];W[eh];B[ae];W[af];B[ce];W[bf]\r
+;B[ki];W[lj];B[ek];W[el];B[ej];W[ad];B[bc];W[hg];B[hf];W[gh]\r
+;B[fh];W[hh];B[fg];W[jb];B[lb];W[hi];B[gj];W[hj];B[dj];W[cj]\r
+;B[ck];W[bj];B[dl];W[bh];B[em];W[hl];B[bk];W[fm];B[ei];W[dh]\r
+;B[aj];W[ai];B[ak];W[dm];B[cm];W[em];B[eg];W[ae];B[jh];W[dg]\r
+;B[hk];W[jj];B[ig];W[df];B[tt];W[dc];B[fd];W[fa];B[dd];W[ea]\r
+;B[cc];W[gb];B[hb];W[kb];B[ha];W[lc];B[ja];W[la];B[mb];W[jc]\r
+;B[kd];W[tt];B[tt]\r
+C[B+39.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNDA2.sgf b/regression/games/mertin13x13/GNDA2.sgf
new file mode 100644 (file)
index 0000000..886a96f
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Dariush v2.6.8.2]\r
+DT[2002-10-08]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+34.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1147272731 level 15];B[kd];W[jk];B[dc];W[cj];B[ek];W[dh];B[ki];W[gk]\r
+;B[ck];W[bk];B[dj];W[ci];B[de];W[kj];B[ji];W[ij];B[hh];W[cl]\r
+;B[fg];W[el];B[fl];W[dk];B[ic];W[fk];B[ie];W[cg];B[bf];W[eh]\r
+;B[li];W[lj];B[bg];W[ah];B[mj];W[mk];B[mi];W[lk];B[bh];W[bi]\r
+;B[ii];W[gi];B[gh];W[hj];B[cf];W[eg];B[ef];W[db];B[cb];W[ld]\r
+;B[lc];W[hc];B[hb];W[gb];B[ib];W[eb];B[gc];W[fc];B[hd];W[fa]\r
+;B[gd];W[bb];B[cc];W[bc];B[ca];W[fd];B[da];W[cd];B[ec];W[dd]\r
+;B[ed];W[bd];B[ag];W[ai];B[fh];W[fi];B[ch];W[dg];B[df];W[ab]\r
+;B[ba];W[lb];B[kc];W[le];B[md];W[me];B[mc];W[jf];B[je];W[kf]\r
+;B[ke];W[lg];B[mg];W[lf];B[jj];W[hi];B[jg];W[if];B[hf];W[tt]\r
+;B[tt]\r
+C[B+34.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNDA3.sgf b/regression/games/mertin13x13/GNDA3.sgf
new file mode 100644 (file)
index 0000000..8532931
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Dariush v2.6.8.2]\r
+DT[2002-10-08]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+32.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1101742441 level 15];B[kc];W[cd];B[jj];W[dk];B[ec];W[df];B[gk];W[gj]\r
+;B[hj];W[fk];B[gi];W[gl];B[fj];W[ek];B[gf];W[db];B[hl];W[gm]\r
+;B[eb];W[dc];B[hm];W[fl];B[di];W[cl];B[ed];W[ch];B[ci];W[bj]\r
+;B[bi];W[ai];B[bh];W[ea];B[fa];W[cg];B[kf];W[bg];B[ah];W[aj]\r
+;B[if];W[ag];B[da];W[ca];B[ea];W[bb];B[cj];W[bk];B[de];W[ce]\r
+;B[ef];W[eg];B[fg];W[eh];B[ei];W[fh];B[gh];W[kk];B[kj];W[jk]\r
+;B[lk];W[ll];B[ik];W[lj];B[jl];W[kl];B[li];W[mj];B[jm];W[mk]\r
+;B[mi];W[dd];B[ee];W[jc];B[jd];W[kb];B[jb];W[lc];B[ic];W[lb]\r
+;B[ld];W[dh];B[ck];W[bl];B[km];W[lm];B[fi];W[ej];B[dj];W[tt]\r
+;B[tt]\r
+C[B+32.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGA1.sgf b/regression/games/mertin13x13/GNGA1.sgf
new file mode 100644 (file)
index 0000000..ca917d4
--- /dev/null
@@ -0,0 +1,24 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[GoAhead v4.2]\r
+DT[2002-11-19]\r
+PC[OS]\r
+KM[5.5]\r
+RE[B+2.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[cc];B[jk];W[dk];B[kj];W[gc];B[ic];W[di]\r
+;B[ge];W[ed];B[gg];W[hk];B[dg];W[eg];B[df];W[ef];B[bg];W[bi]\r
+;B[be];W[bd];B[ii];W[de];B[fi];W[ce];B[fk];W[eh];B[el];W[hd]\r
+;B[he];W[id];B[ie];W[jc];B[kd];W[ib];B[kc];W[jb];B[cl];W[dl]\r
+;B[dm];W[bl];B[gl];W[ck];B[kb];W[cm];B[ja];W[ia];B[ka];W[gd]\r
+;B[fe];W[em];B[fm];W[dm];B[ej];W[ff];B[ek];W[gf];B[hf];W[fh]\r
+;B[gh];W[dj];B[fd];W[fc];B[ei];W[dh];B[ee];W[ec];B[fg];W[tt]\r
+;B[tt];W[tt];\r
+C[B+2.5\r
+\r
+Zeitverbrauch Weiss  : 7:38]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGA2.sgf b/regression/games/mertin13x13/GNGA2.sgf
new file mode 100644 (file)
index 0000000..49571cc
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[GoAhead v4.2]\r
+DT[2002-11-19]\r
+PC[OS]\r
+KM[5.5]\r
+RE[B+67.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[cd];B[cj];W[jk];B[ki];W[ek];B[ij];W[ik]\r
+;B[hj];W[gk];B[ec];W[cg];B[gf];W[ed];B[fd];W[dc];B[eb];W[db]\r
+;B[gc];W[ei];B[dl];W[el];B[dk];W[kj];B[ji];W[li];B[lh];W[lj]\r
+;B[kg];W[dm];B[bl];W[eg];B[cm];W[em];B[ef];W[df];B[ee];W[gh]\r
+;B[hh];W[gi];B[da];W[ca];B[ea];W[cb];B[bh];W[hg];B[gg];W[hi]\r
+;B[ih];W[ii];B[bg];W[bf];B[jj];W[jh];B[ig];W[ic];B[id];W[jc]\r
+;B[kc];W[jd];B[je];W[hd];B[ie];W[hc];B[jb];W[af];B[de];W[ff]\r
+;B[fg];W[ch];B[bi];W[fh];B[dd];W[ce];B[di];W[dh];B[hk];W[hl]\r
+;B[gj];W[fj];B[kh];W[gl];B[mi];W[mj];B[kk];W[lk];B[kl];W[mh]\r
+;B[il];W[mg];B[hm];W[ll];B[lm];W[gm];B[im];W[mf];B[ag];W[me]\r
+;B[ml];W[ci];B[dj];W[ej];B[tt];W[tt]\r
+C[B+67.5\r
+\r
+Zeitverbrauch Weiss  : 9:50]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGA3.sgf b/regression/games/mertin13x13/GNGA3.sgf
new file mode 100644 (file)
index 0000000..613f2c3
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[GoAhead v4.2]\r
+DT[2002-11-19]\r
+PC[OS]\r
+KM[5.5]\r
+RE[W+5.5]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[cc];B[ck];W[kk];B[jh];W[hk];B[gc];W[dh]\r
+;B[ge];W[ek];B[el];W[fl];B[dl];W[hh];B[bl];W[jg];B[dd];W[cd]\r
+;B[bh];W[cf];B[je];W[ig];B[dc];W[de];B[cb];W[bb];B[db];W[bg]\r
+;B[ch];W[dj];B[cg];W[bf];B[dg];W[cj];B[fh];W[fi];B[bj];W[fg]\r
+;B[eh];W[di];B[gh];W[gi];B[gg];W[ie];B[id];W[if];B[fm];W[fk]\r
+;B[hm];W[il];B[kf];W[kg];B[lf];W[lg];B[mg];W[mh];B[mf];W[li]\r
+;B[im];W[ef];B[df];W[ee];B[eg];W[ba];B[ff];W[hd];B[hc];W[jd]\r
+;B[kd];W[ic];B[ib];W[jb];B[jc];W[id];B[ha];W[jl];B[ed];W[jf]\r
+;B[ke];W[gd];B[fc];W[fd];B[fe];W[ce];B[jm];W[km];B[ag];W[af]\r
+;B[ah];W[ca];B[da];W[gl];B[gm];W[hf];B[ei];W[ej];B[gf];W[ci]\r
+;B[bi];W[hl];B[em];W[he];B[hg];W[ih];B[dk];W[tt];B[tt];W[tt]\r
+;\r
+C[W+5.5\r
+\r
+Zeitverbrauch Weiss  : 9:56]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGH1.sgf b/regression/games/mertin13x13/GNGH1.sgf
new file mode 100644 (file)
index 0000000..810eb51
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo 3.2 lev15]\r
+PW[Goliath 3.5]\r
+DT[2002-05-10]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+5.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1021031461 level 15];B[jd];W[dc];B[jj];W[ce];B[hk];W[kf];B[gc];W[cj]\r
+;B[le];W[lf];B[ke];W[if];B[ek];W[di];B[jf];W[jg];B[je];W[ig]\r
+;B[ki];W[lh];B[li];W[gf];B[cl];W[ic];B[hd];W[kb];B[ge];W[ff]\r
+;B[eb];W[db];B[fc];W[ed];B[hb];W[ib];B[lc];W[bk];B[da];W[ca]\r
+;B[ea];W[bb];B[mh];W[bl];B[mf];W[kh];B[dk];W[fj];B[fk];W[gj]\r
+;B[bm];W[hj];B[ik];W[gk];B[gl];W[he];B[ie];W[hf];B[ii];W[fe]\r
+;B[hc];W[id];B[jb];W[jc];B[kc];W[ja];B[lb];W[gd];B[la];W[ec]\r
+;B[ga];W[fd];B[fb];W[al];B[hh];W[gh];B[ej];W[ei];B[hi];W[hg]\r
+;B[gi];W[fi];B[jh];W[ih];B[ji];W[lg];B[ck];W[ij];B[mg];W[kg]\r
+;B[dj];W[bj];B[cm];W[tt];B[am];W[tt];B[tt]\r
+C[B+5.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGH2.sgf b/regression/games/mertin13x13/GNGH2.sgf
new file mode 100644 (file)
index 0000000..aa6b5fc
--- /dev/null
@@ -0,0 +1,29 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Goliath 3.5]\r
+DT[2002-05-15]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+13.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 2017224973 level 15];B[kd];W[dc];B[cj];W[ce];B[jh];W[jk];B[hc];W[gk]\r
+;B[kj];W[jj];B[kk];W[ji];B[ki];W[ih];B[ig];W[hg];B[if];W[hh]\r
+;B[ek];W[fc];B[cg];W[hf];B[jl];W[il];B[kl];W[ie];B[je];W[jg]\r
+;B[jf];W[kh];B[he];W[id];B[hd];W[kf];B[gb];W[eh];B[da];W[cb]\r
+;B[dh];W[eg];B[df];W[fb];B[fa];W[le];B[ke];W[ld];B[kc];W[lc]\r
+;B[lb];W[fl];B[el];W[gi];B[bf];W[be];B[li];W[af];B[lg];W[kg]\r
+;B[lf];W[dg];B[di];W[cf];B[fe];W[de];B[bg];W[ag];B[bh];W[ah]\r
+;B[ai];W[ae];B[mc];W[bi];B[bj];W[aj];B[bk];W[em];B[dm];W[fm]\r
+;B[cl];W[ch];B[im];W[hm];B[ak];W[ff];B[lh];W[jh];B[jm];W[hl]\r
+;B[ca];W[fj];B[bb];W[bc];B[ee];W[ed];B[db];W[cc];B[ej];W[eb]\r
+;B[ea];W[ei];B[ci];W[ab];B[ba];W[ge];B[gd];W[gf];B[fd];W[ef]\r
+;B[ai];W[bh];B[aj];W[ac];B[fk];W[aa];B[ga];W[ec];B[hb];W[tt]\r
+;B[gc];W[tt];B[tt]\r
+C[B+13.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGH3.sgf b/regression/games/mertin13x13/GNGH3.sgf
new file mode 100644 (file)
index 0000000..2aedaeb
--- /dev/null
@@ -0,0 +1,49 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Goliath 3.5]\r
+DT[2002-05-15]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+59.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 842122553 level 15];B[kc];W[dc];B[kj];W[ce];B[gi];W[cj];B[fk];W[dk]\r
+;B[gg];W[kh];B[kf];W[gc];B[ei];W[ic];B[ie];W[jd];B[kd];W[je]\r
+;B[jf];W[dh];B[hf];W[jb];B[el];W[eh];B[cl];W[fh];B[gh];W[fi]\r
+;B[bk];W[bj];B[kb];W[ff];B[jc];W[id];B[hd];W[gd];B[ib];W[hc]\r
+;B[hb];W[he];B[gb];W[fb];B[aj];W[ai];B[ak];W[bi];B[ke];W[if]\r
+;B[ig];W[ik];B[jl];W[dl];B[dm];W[al];B[ck];W[fj];B[hl];W[gj]\r
+;B[hj];W[gk];B[ej];W[dj];B[gl];W[hk];B[ii];W[ji];B[jj];W[ij]\r
+;B[jh];W[jk];B[kk];W[ek];B[fl];W[il];B[im];W[kl];B[km];W[ll]\r
+;B[hm];W[jm];B[lj];W[lm];B[gf];W[hi];B[ih];W[ki];B[li];W[lh]\r
+;B[kg];W[mk];B[lg];W[mi];B[mh];W[ge];B[hh];W[ga];B[mj];W[fg]\r
+;B[lk];W[ml];B[ie];W[tt];B[if];W[ha];B[ja];W[fa];B[ia]\r
+(;W[tt]\r
+C[ W pass ?]\r
+\r
+(;B[hj]\r
+C[ ?]\r
+;W[em]\r
+(;B[hi]\r
+C[ ?????]\r
+;W[bl];B[tt];W[cm];B[tt];W[tt];B[tt]\r
+C[W+59.5]\r
+)\r
+(;B[fm]\r
+C[ !]\r
+;W[bm];B[cm]\r
+C[ seki (W+28.5)]\r
+))\r
+(;B[em]\r
+C[ !]\r
+;W[hj]\r
+C[ W+22.5]\r
+))\r
+(;W[em]\r
+C[ !]\r
+))\r
diff --git a/regression/games/mertin13x13/GNGI1.sgf b/regression/games/mertin13x13/GNGI1.sgf
new file mode 100644 (file)
index 0000000..4cf2c65
--- /dev/null
@@ -0,0 +1,62 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go Intellect 10.0]\r
+DT[2002-05-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+31.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1021295564 level 15];B[jd]\r
+(;W[dc];B[jj];W[dk];B[de];W[cd];B[kh];W[dh];B[fe];W[ce]\r
+;B[ik];W[gj];B[fc];W[kc];B[jc];W[jb];B[kd];W[lc];B[ib];W[ka]\r
+;B[ld]\r
+(;W[mb]\r
+C[ ?]\r
+;B[la];W[lb];B[ia];W[kk];B[kj];W[lk];B[jl];W[ll]\r
+;B[fl];W[fk];B[gl];W[lj];B[li];W[kl];B[jk];W[mj];B[km];W[lm]\r
+;B[ml];W[lh];B[lg];W[el];B[gg];W[mi];B[mh];W[df];B[eb];W[db]\r
+;B[da];W[ca];B[ea];W[cb];B[ef];W[ed];B[dg];W[cf];B[ch]\r
+(;W[di]\r
+C[ ?]\r
+;B[cg];W[ee];B[eg]\r
+(;W[bg]\r
+C[ ?]\r
+;B[bh];W[bf];B[bj]\r
+(;W[hi]\r
+C[ ?]\r
+;B[cl];W[ck];B[bk];W[dl];B[bl]\r
+(;W[ih]\r
+C[ ?]\r
+;B[fi];W[fh];B[gh];W[ma];B[ja];W[eh];B[gi];W[hk]\r
+;B[ej];W[hl];B[ij];W[hj];B[dm];W[fm];B[dj];W[cj];B[ci];W[ek]\r
+;B[fd];W[il];B[im];W[jm];B[ig];W[ji];B[jh];W[ii];B[ki];W[hm]\r
+;B[ec];W[dd]\r
+(;B[ag];W[jg];B[jf];W[fj];B[ei];W[hg];B[if];W[hh];B[hf]\r
+;W[gf];B[fg];W[af];B[ah];W[kf];B[kg];W[em];B[cm];W[km];B[tt]\r
+;W[tt];B[tt]\r
+C[B+31.5]\r
+)\r
+(;B[cm];W[ah];B[em];W[gm];B[fj];W[gk];B[ai];W[hh];B[hg]\r
+;W[ag]))\r
+(;W[fh]\r
+C[ !]\r
+))\r
+(;W[bk]\r
+C[ !]\r
+))\r
+(;W[ci]\r
+C[ !]\r
+))\r
+(;W[cg]\r
+C[ !]\r
+))\r
+(;W[lb]\r
+C[ !]\r
+))\r
+(;W[dj]))\r
diff --git a/regression/games/mertin13x13/GNGI2.sgf b/regression/games/mertin13x13/GNGI2.sgf
new file mode 100644 (file)
index 0000000..030cb8d
--- /dev/null
@@ -0,0 +1,43 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go Intellect 10.0]\r
+DT[2002-05-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+18.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1099981911 level 15]\r
+(;B[kd]\r
+(;W[cd];B[ed];W[bc];B[jh];W[ck];B[kk];W[ec];B[fc];W[fj]\r
+;B[dc];W[jj];B[jk];W[cg];B[ij];W[fg];B[hf];W[jc];B[kc];W[jd]\r
+;B[je];W[kb];B[lb];W[ib];B[ka];W[dd];B[eb];W[ee];B[jb];W[id]\r
+;B[hd];W[hk];B[fe];W[ie];B[il];W[ji];B[ii];W[hl];B[ff];W[ef]\r
+;B[gg];W[fh];B[hm];W[gm];B[im];W[gl];B[cb];W[li];B[ki];W[kh]\r
+;B[kj];W[lg];B[lj];W[jf];B[ke];W[if];B[hc];W[ic];B[kf]\r
+(;W[bb];B[kg];W[ca];B[da];W[ba];B[cc];W[hj];B[hi];W[gi]\r
+;B[gh];W[ik];B[jl];W[hb];B[he];W[gb];B[fb];W[tt];B[tt]\r
+C[B+18.5]\r
+)\r
+(;W[ab];B[kg]))\r
+(;W[ic]))\r
+(;\r
+(;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;;;;;;\r
+;;;;;)\r
+(;)))\r
diff --git a/regression/games/mertin13x13/GNGI3.sgf b/regression/games/mertin13x13/GNGI3.sgf
new file mode 100644 (file)
index 0000000..da6044b
--- /dev/null
@@ -0,0 +1,30 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go Intellect 10.0]\r
+DT[2002-05-14]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+2.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1021362563 level 15];B[kc];W[dk];B[dc];W[jk];B[ki];W[lj];B[cg];W[cj]\r
+;B[eg];W[li];B[kf];W[kh];B[ig];W[jd];B[jc];W[jf];B[id];W[ke]\r
+;B[le];W[jg];B[fi];W[gk];B[de];W[lf];B[bi];W[ld];B[lc];W[bj]\r
+;B[kd];W[me];B[aj];W[je];B[ak];W[gd];B[gg];W[hc];B[ic];W[ib]\r
+;B[he];W[ge];B[fc];W[hf];B[if];W[hg];B[hh];W[gf];B[ih];W[ie]\r
+;B[hd];W[gc];B[gh];W[fb];B[jb];W[hb];B[eb];W[mc];B[fa];W[gb]\r
+;B[mb];W[lb];B[md];W[fd];B[mc];W[kb];B[ja];W[la];B[le];W[mf]\r
+;B[jh];W[ld];B[kj];W[le];B[kk];W[ik];B[lh];W[kg];B[mh];W[lk]\r
+;B[ll];W[kl];B[jl];W[km];B[lm];W[il];B[jm];W[ia];B[cl];W[dl]\r
+;B[bk];W[ka];B[ec];W[ma];B[mi];W[ci];B[bh];W[im];B[ck];W[ej]\r
+;B[ei];W[lg];B[mj];W[cm];B[bm];W[dm];B[hj];W[fl];B[hk];W[hl]\r
+;B[gj];W[fj];B[di];W[dj];B[ga];W[mg];B[mk];W[ee];B[ff];W[ch]\r
+;B[dh];W[ed];B[dd];W[ha];B[ea];W[ij];B[ii];W[ef];B[df];W[fe]\r
+;B[fg];W[jj];B[ji];W[tt];B[tt]\r
+C[B+2.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGM1.sgf b/regression/games/mertin13x13/GNGM1.sgf
new file mode 100644 (file)
index 0000000..3eb5ae7
--- /dev/null
@@ -0,0 +1,54 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[GoeMate2001 lev9]\r
+DT[2002-10-12]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+9.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[dj];B[jj];W[dc];B[fc];W[kf];B[jf];W[jg]\r
+;B[if];W[ke];B[kd];W[hk];B[hd];W[ii];B[kh];W[kg];B[kk];W[lh]\r
+;B[ch];W[jh];B[il];W[cf];B[ck];W[cj];B[dk];W[hl];B[jk];W[ki]\r
+;B[lj];W[fl];B[bj];W[ej];B[bh];W[cm];B[bl];W[bm];B[eh];W[ef]\r
+;B[ae];W[be];B[af];W[bc];B[le];W[gf];B[hg];W[fh];B[fi];W[ei]\r
+;B[fg];W[gh];B[eg];W[gg];B[eb];W[bf];B[ad];W[ed];B[ci];W[ai]\r
+;B[ff];W[fe];B[aj];W[ek]\r
+(;B[bg]\r
+C[ ?]\r
+\r
+(;W[df]\r
+C[ ?]\r
+;B[al]\r
+C[ !]\r
+\r
+(;W[db];B[dg];W[ec];B[fb];W[ac];B[dl];W[dm];B[da];W[bd]\r
+;B[ag];W[ca];B[ea];W[cb];B[ig];W[bk];B[cl];W[em];B[lf];W[gd]\r
+;B[gc];W[je];B[ie];W[ik];B[jm];W[hm];B[fd];W[im];B[jl];W[ge]\r
+;B[ji];W[ih];B[hh];W[hi];B[li];W[hc];B[hb];W[mi];B[ll];W[hf]\r
+;B[mj];W[he];B[id];W[mh];B[cg];W[el];B[ij];W[hj];B[mf];W[di]\r
+;B[kj];W[kh];B[mg];W[am];B[ak];W[lg];B[ld];W[dh];B[tt];W[tt]\r
+C[B+9.5]\r
+)\r
+(;W[dh]))\r
+(;W[al]\r
+C[ !]\r
+\r
+(;B[cb]\r
+C[gnugo32-15]\r
+)\r
+(;B[df]\r
+C[goemate01-9]\r
+;W[dg])\r
+(;B[ak]\r
+C[mfg11-10]\r
+;W[cl];B[bd];W[cd];B[cg];W[df];B[cb];W[bb];B[dl]\r
+;W[bk];B[bi];W[dm];B[di];W[dg];B[bl];W[el];B[im])))\r
+(;B[al]\r
+C[ !]\r
+))\r
diff --git a/regression/games/mertin13x13/GNGM2.sgf b/regression/games/mertin13x13/GNGM2.sgf
new file mode 100644 (file)
index 0000000..3d2b5dd
--- /dev/null
@@ -0,0 +1,24 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[GoeMate2001 lev9]\r
+DT[2002-11-15]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+12.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[jj];B[dc];W[dk];B[ci];W[ce];B[ed];W[df]\r
+;B[ei];W[ff];B[gd];W[gk];B[fj];W[fk];B[bk];W[hf];B[ie];W[hi]\r
+;B[kh];W[cl];B[bh];W[bl];B[cj];W[bf];B[lj];W[kk];B[bd];W[bg]\r
+;B[lk];W[if];B[jf];W[he];B[hd];W[je];B[ke];W[id];B[ic];W[eg]\r
+;B[ll];W[kl];B[km];W[jm];B[lm];W[il];B[jg];W[ig];B[ih];W[hh]\r
+;B[ii];W[ij];B[be];W[ki];B[li];W[jh];B[kg];W[cd];B[cc];W[ae]\r
+;B[bc];W[ad];B[ac];W[af];B[jd];W[ie];B[kj];W[ji];B[de];W[ge]\r
+;B[ee];W[fe];B[fd];W[tt];B[ef];W[dg];B[dd];W[eh];B[cf];W[cg]\r
+;B[ce];W[tt];B[tt];W[tt]\r
+C[W+12.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGM3.sgf b/regression/games/mertin13x13/GNGM3.sgf
new file mode 100644 (file)
index 0000000..9fc986f
--- /dev/null
@@ -0,0 +1,25 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[GoeMate2001 lev9]\r
+DT[2002-11-15]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+6.5]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[jj];B[cc];W[ck];B[hk];W[ic];B[gc];W[ie]\r
+;B[ek];W[fj];B[kf];W[fk];B[hi];W[ih];B[hl];W[el];B[kk];W[kj]\r
+;B[cf];W[ej];B[lk];W[jg];B[ci];W[lh];B[lj];W[le];B[kg];W[kh]\r
+;B[ff];W[ke];B[hb];W[ib];B[bj];W[bk];B[ia];W[ja];B[ha];W[kb]\r
+;B[ak];W[al];B[aj];W[cj];B[bh];W[bm];B[jk];W[ge];B[fe];W[eg]\r
+;B[fg];W[eh];B[gh];W[gd];B[fd];W[hc];B[gb];W[hg];B[ki];W[ji]\r
+;B[li];W[df];B[de];W[cg];B[bg];W[mh];B[ch];W[dg];B[di];W[fh]\r
+;B[gg];W[gl];B[gm];W[fm];B[hm];W[mi];B[ei];W[fi];B[gk];W[fl]\r
+;B[dj];W[dk];B[gf];W[hf];B[gj];W[ij];B[hh];W[mj];B[mk];W[ik]\r
+;B[il];W[ii];B[ef];W[gi];B[bf];W[hj];B[jm];W[dh];B[tt];W[tt]\r
+C[W+6.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGP1.sgf b/regression/games/mertin13x13/GNGP1.sgf
new file mode 100644 (file)
index 0000000..ed73adc
--- /dev/null
@@ -0,0 +1,29 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go Professional III]\r
+DT[2002-11-16]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+27.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1037447918 level 15];B[jd];W[dd];B[jj];W[hk];B[hj];W[hc];B[ik];W[dj]\r
+;B[gk];W[kc];B[kd];W[jc];B[hf];W[id];B[ld];W[fc];B[cf];W[cd]\r
+;B[dl];W[fe];B[fg];W[be];B[ef];W[bg];B[ck];W[dh];B[dg];W[cj]\r
+;B[bk];W[bj];B[ie];W[eh];B[hd];W[lc];B[bf];W[af];B[ic];W[ib]\r
+;B[hb];W[cg];B[gc];W[fb];B[mc];W[fh];B[hg];W[ff];B[gh];W[eg]\r
+;B[gb];W[ek];B[el];W[fk];B[fl];W[gi];B[hi];W[gj];B[hl];W[ak]\r
+;B[fa];W[ea];B[ga];W[eb];B[al];W[aj];B[bl];W[mb];B[jb]\r
+(;W[gg]\r
+C[ !]\r
+;B[md];W[hh];B[ih];W[ge];B[gd];W[fd];B[gh];W[gf]\r
+;B[dk];W[hh];B[ej];W[fj];B[gh];W[ei];B[hh];W[he];B[tt];W[tt]\r
+;B[tt]\r
+C[B+27.5]\r
+)\r
+(;W[kb];B[ka];W[ja];B[la];W[lb];B[ha];W[gd];B[hc]))\r
diff --git a/regression/games/mertin13x13/GNGP3.sgf b/regression/games/mertin13x13/GNGP3.sgf
new file mode 100644 (file)
index 0000000..de63cc7
--- /dev/null
@@ -0,0 +1,23 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go Professional III]\r
+DT[2002-11-16]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+0.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1098613584 level 15];B[kc];W[ce];B[ed];W[jj];B[kh];W[hk];B[lj];W[kk]\r
+;B[jf];W[dj];B[ef];W[dc];B[ec];W[db];B[eb];W[dg];B[gh];W[fi]\r
+;B[ck];W[bl];B[bk];W[cl];B[dl];W[dk];B[hc];W[bj];B[lk];W[ll]\r
+;B[da];W[ca];B[ea];W[cb];B[ii];W[eg];B[df];W[cf];B[dd];W[cd]\r
+;B[ml];W[kl];B[fg];W[ij];B[fh];W[ei];B[hi];W[gj];B[ji];W[el]\r
+;B[eh];W[dh];B[kj];W[de];B[ee];W[lm];B[gi];W[hj];B[mk];W[tt]\r
+;B[mm];W[tt];B[tt]\r
+C[W+0.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGP5.sgf b/regression/games/mertin13x13/GNGP5.sgf
new file mode 100644 (file)
index 0000000..dc5d1f1
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go Professional III]\r
+DT[2002-11-16]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+1.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 891323131 level 15];B[ke];W[ed];B[id];W[kk];B[ki];W[ik];B[dk];W[cd]\r
+;B[gc];W[di];B[ci];W[ch];B[cj];W[fk];B[dh];W[cg];B[ei];W[fb]\r
+;B[gb];W[fc];B[dg];W[df];B[ef];W[cf];B[fg];W[lj];B[fe];W[lh]\r
+;B[ii];W[jg];B[ig];W[el];B[dl];W[jf];B[bi];W[bh];B[fa];W[ea]\r
+;B[ga];W[eb];B[em];W[if];B[hg];W[li];B[fm];W[gj];B[gl];W[hj]\r
+;B[hf];W[mf];B[ld];W[md];B[me];W[hl];B[lf];W[lg];B[le];W[fi]\r
+;B[jh];W[kg];B[ej];W[fj];B[jj];W[mg];B[jk];W[jl];B[hi];W[fd]\r
+;B[gd];W[ai];B[aj];W[ah];B[eh];W[gh];B[fh];W[gi];B[ee];W[de]\r
+;B[hh];W[hm];B[gg];W[je];B[jd];W[ie];B[he];W[fl];B[gm];W[gk]\r
+;B[dm];W[ij];B[kj];W[kl];B[kh];W[bk];B[bj];W[ek];B[kf];W[tt]\r
+;B[tt]\r
+C[W+1.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGX1.sgf b/regression/games/mertin13x13/GNGX1.sgf
new file mode 100644 (file)
index 0000000..c4ef3db
--- /dev/null
@@ -0,0 +1,38 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go4++ beta72]\r
+DT[2002-10-12]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+10.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 122472136 level 15];B[jd];W[dd];B[jj];W[dj];B[fc];W[df];B[db];W[cc]\r
+;B[jg];W[fk];B[ck];W[cj];B[dk];W[ek];B[bj];W[bi];B[el];W[kk]\r
+;B[kj];W[jk];B[ik];W[il];B[hk];W[hl];B[fl];W[lj];B[bk];W[kc]\r
+;B[li];W[lk];B[jc];W[kd];B[ke];W[le];B[kf];W[lf];B[ai];W[bh]\r
+;B[ej];W[ei];B[fj];W[kb];B[gk];W[fi];B[cb];W[bb];B[jb];W[gf]\r
+;B[ah];W[ag];B[hd];W[aj];B[ka];W[la];B[ja];W[lc];B[ak];W[hh]\r
+;B[ba];W[bc];B[lg];W[fe];B[mf];W[me];B[gi];W[gh];B[hi];W[ec]\r
+;B[eb];W[fd];B[gc];W[ih];B[jh];W[ai];B[ii];W[ch];B[gl];W[mj]\r
+;B[hm]\r
+(;W[jm]\r
+C[ (!)]\r
+;B[dc];W[ed];B[mg];W[he];B[ie];W[if];B[gd];W[jf]\r
+;B[je];W[ig];B[ge];W[hf];B[mi];W[ab];B[ca];W[aa];B[gm];W[ll]\r
+;B[im];W[jl];B[tt];W[tt];B[tt]\r
+C[W+10.5]\r
+)\r
+(;W[im]\r
+C[ (?)]\r
+;B[jl];W[kl];B[jm];W[mi];B[mh];W[mg];B[lh];W[ml]\r
+;B[km];W[lm];B[hf]\r
+C[ B+1.5]\r
+;W[ig];B[if];W[gg];B[ge];W[gd];B[he]\r
+(;W[dc];B[mf];W[ab];B[mg];W[aa];B[ca])\r
+(;W[mf];B[dc];W[ed])))\r
diff --git a/regression/games/mertin13x13/GNGX2.sgf b/regression/games/mertin13x13/GNGX2.sgf
new file mode 100644 (file)
index 0000000..596cef6
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go4++ beta72]\r
+DT[2002-10-12]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+11.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 77704969 level 15];B[kd];W[jj];B[dd];W[dj];B[jg];W[hk];B[ch];W[ki]\r
+;B[ff];W[cc];B[dc];W[cd];B[cb];W[bb];B[ck];W[dk];B[cj];W[di]\r
+;B[cg];W[ci];B[bi];W[bh];B[bj];W[db];B[eb];W[ca];B[fc];W[lg]\r
+;B[ic];W[gh];B[cl];W[dl];B[ii];W[hi];B[ig];W[ij];B[fh];W[fi]\r
+;B[eh];W[bf];B[bg];W[cf];B[af];W[ae];B[ag];W[ce];B[dm];W[em]\r
+;B[cm];W[el];B[kg];W[lf];B[le];W[gg];B[gf];W[kf];B[jf];W[ke]\r
+;B[ld];W[je];B[ie];W[jd];B[jc];W[id];B[hd];W[he];B[lh];W[mh]\r
+;B[mi];W[hc];B[gd];W[li];B[mg];W[lj];B[mj];W[mk];B[mh];W[kh]\r
+;B[mf];W[lk];B[hh];W[hg];B[ih];W[hf];B[ea];W[da];B[ei];W[ej]\r
+;B[fg];W[de];B[ee];W[ef];B[ed];W[ge];B[fe];W[eg];B[dh];W[df]\r
+;B[if];W[gi];B[ji];W[jh];B[dg];W[ac];B[tt];W[tt];B[tt]\r
+C[B+11.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNGX3.sgf b/regression/games/mertin13x13/GNGX3.sgf
new file mode 100644 (file)
index 0000000..acd32a8
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Go4++ beta72]\r
+DT[2002-10-12]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+4.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1034437867 level 15];B[kc];W[dd];B[ck];W[jj];B[kh];W[hk];B[lj];W[kk]\r
+;B[jf];W[ek];B[fc];W[cf];B[db];W[bj];B[gf];W[cc];B[gh];W[cb]\r
+;B[ec];W[lk];B[ki];W[fi];B[dg];W[cg];B[bk];W[ak];B[al];W[aj]\r
+;B[cl];W[dm];B[bm];W[cj];B[dh];W[ih];B[dj];W[di];B[ci];W[bi]\r
+;B[ch];W[bh];B[ej];W[fj];B[dk];W[el];B[ig];W[ei];B[bg];W[bf]\r
+;B[ah];W[ag];B[cm];W[ef];B[ii];W[kj];B[fe];W[mj];B[ca];W[ba]\r
+;B[da];W[mh];B[li];W[mi];B[le];W[bb];B[lg];W[ji];B[jh];W[hi]\r
+;B[hh];W[ij];B[gi];W[gj];B[ih];W[dc];B[eb];W[fg];B[dl];W[em]\r
+;B[fh];W[eh];B[gg];W[ee];B[ff];W[eg];B[mg];W[ed];B[fd];W[hj]\r
+;B[lh];W[mk];B[tt];W[tt];B[tt]\r
+C[W+4.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNHT1.sgf b/regression/games/mertin13x13/GNHT1.sgf
new file mode 100644 (file)
index 0000000..dc06d2a
--- /dev/null
@@ -0,0 +1,136 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[HandTalk 99.04 (98.10E)]\r
+DT[2002-11-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+5.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 756805997 level 15];B[jd];W[kc];B[kd];W[jc];B[ic];W[ib];B[hc];W[hb]\r
+;B[gc];W[ec];B[gb];W[df];B[kh];W[ld];B[le];W[kj];B[lc];W[hj]\r
+;B[md];W[dj];B[ck];W[cj];B[dk];W[ek];B[el];W[bk];B[fk];W[ej]\r
+;B[bl];W[cl];B[dl];W[cd];B[hl];W[fj];B[bj];W[bi];B[ak];W[lb]\r
+;B[ha];W[mb];B[jb];W[gk];B[fl];W[gl];B[jl];W[gm];B[jj];W[hf]\r
+;B[kk];W[fb];B[gg];W[hg];B[ai];W[gh];B[ag];W[bh];B[ah];W[ik]\r
+;B[fg];W[lj];B[jk];W[il];B[dg];W[lk];B[ji];W[bg];B[bf];W[km]\r
+;B[jm];W[ll];B[kl];W[lm];B[ci];W[ch];B[lh];W[di];B[ef];W[cf]\r
+;B[cg];W[be];B[fe];W[fc];B[af];W[gd];B[gf];W[fd]\r
+(;B[hd]\r
+C[ ?]\r
+;W[he];B[ge];W[de];B[ie];W[hh];B[im];W[dh];B[hm]\r
+;W[ml];B[mj];W[mi];B[li];W[jg];B[kg];W[jf];B[hk];W[ij];B[fm]\r
+;W[gj];B[ii];W[eg];B[if];W[jh];B[ih];W[ig];B[ki];W[ae];B[aj]\r
+;W[fa];B[je];W[kf];B[lf];W[hi];B[ga];W[ke];B[tt];W[tt];B[tt]\r
+C[B+5.5]\r
+)\r
+(;B[de]\r
+C[ !]\r
+;W[ce];B[dh];W[ci];B[fh]\r
+(;W[eh]\r
+C[ B+25.5]\r
+\r
+(;B[gi]\r
+(;W[hh]\r
+C[ B+25.5]\r
+;B[hi]\r
+(;W[eg]\r
+C[ B+25.5]\r
+;B[gj]\r
+(;W[fi]\r
+C[ !]\r
+;B[ii];W[jf]\r
+C[ B+25.5]\r
+;B[kf];W[ae];B[aj];W[jg];B[ie];W[kg]\r
+;B[lg];W[fa];B[he];W[ge];B[if];W[ig];B[je]\r
+C[ B+25.5]\r
+)\r
+(;W[ii]\r
+C[ ?]\r
+;B[fi]\r
+(;W[ge]\r
+C[ B+49.5]\r
+;B[ij];W[ih];B[hk]\r
+C[ B+49.5]\r
+)\r
+(;W[ij]\r
+C[ B+51.5]\r
+;B[ih];W[he]\r
+C[ B+51.5]\r
+)))\r
+(;W[ii]\r
+C[ ?]\r
+;B[fi];W[eg];B[gj]\r
+(;W[ij];B[ih];W[he])\r
+(;W[ih];B[ij])))\r
+(;W[eg]\r
+C[ B+32.5]\r
+;B[hh]\r
+(;W[ih]\r
+C[ B+32.5]\r
+;B[ii]\r
+(;W[gj]\r
+C[ B+32.5]\r
+;B[hi];W[he];B[ig];W[je];B[if];W[ie];B[kf]\r
+C[ B+32.5]\r
+)\r
+(;W[hi]\r
+C[ B+49.5]\r
+;B[ge];W[he];B[gh];W[ig];B[gj]\r
+(;W[fi];B[hk];W[hm];B[hk]\r
+(;W[ij];B[im];W[hl];B[fm]\r
+C[ B+49.5]\r
+)\r
+(;W[hl];B[ij]))\r
+(;W[hk];B[im];W[fi];B[hm];W[dd];B[fm])))\r
+(;W[gj]\r
+C[ B+34.5]\r
+;B[he];W[ge];B[ih];W[ae];B[aj];W[hd];B[ie];W[id]\r
+;B[kb];W[ee];B[ed];W[fi];B[im];W[hm];B[ij];W[hk];B[hi];W[fm]\r
+;B[em]\r
+C[ B+34.5]\r
+)))\r
+(;B[hh]\r
+C[ ?!]\r
+;W[gi];B[he];W[ge]\r
+(;B[ih];W[if];B[jf];W[ie];B[hd];W[eg];B[ig];W[fi];B[je]\r
+;W[ff];B[im];W[hm];B[ij];W[hk];B[hi];W[ae];B[aj];W[id];B[kb]\r
+;W[fa];B[ga];W[fm];B[em]\r
+C[ B+10.5]\r
+)\r
+(;B[if];W[ig];B[ih];W[jg];B[jf];W[ie];B[hd];W[kf];B[je]\r
+;W[kg]\r
+(;B[lg];W[eg])\r
+(;B[eg];W[dd]))\r
+(;B[ig];W[if];B[ie];W[jf]))\r
+(;B[eg]\r
+C[ ?]\r
+\r
+(;W[fi]\r
+C[ !]\r
+;B[hh];W[ih];B[gi];W[gj];B[ii];W[hi];B[gh];W[ig]\r
+;B[he];W[ie]\r
+(;B[ge];W[hd])\r
+(;B[hd];W[ge]))\r
+(;W[gi]\r
+C[ ?]\r
+;B[fi];W[he];B[ei];W[gj])))\r
+(;W[hh]\r
+C[ B+34.5]\r
+;B[eh];W[he];B[jf];W[jg];B[kg];W[jh];B[ki];W[ae]\r
+;B[aj];W[ed];B[fi]\r
+(;W[gi];B[ee];W[if];B[ie];W[dd];B[hd];W[ge];B[ih];W[ig]\r
+;B[ii];W[fa];B[im];W[ga];B[ia];W[hm];B[ij];W[hk];B[fm]\r
+C[ B+34.5]\r
+)\r
+(;W[ee]\r
+C[ ?]\r
+;B[gi]\r
+(;W[hi];B[gj])\r
+(;W[gj];B[hi])))))\r
diff --git a/regression/games/mertin13x13/GNHT2.sgf b/regression/games/mertin13x13/GNHT2.sgf
new file mode 100644 (file)
index 0000000..df2d5e8
--- /dev/null
@@ -0,0 +1,75 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[HandTalk 99.04 (98.10E)]\r
+DT[2002-11-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+13.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[WULUEvent No. 1]\r
+GC[GnuGo v3.2 on level15 thinks endless on move 47 ... Bug?!];B[kd];W[ki];B[de];W[id];B[jf];W[fd];B[dc];W[hj]\r
+;B[cj];W[ek];B[kk];W[hl];B[di];W[ec];B[fj];W[db];B[dl];W[el]\r
+;B[cd];W[jj];B[cb];W[kc];B[lc];W[jc];B[kb];W[jb];B[dk];W[lb]\r
+;B[ld];W[lf];B[mb];W[ka];B[ff];W[je];B[gi];W[if];B[eb];W[fb]\r
+;B[da];W[lj];B[fa];W[gb];B[fk];W[fl];B[he];W[gk]\r
+(;B[ig]\r
+C[level 15\r
+\r
+"Gnu Go is thinking..." \r
+very much too long for this move! \r
+(280 minutes on level 15!!)\r
+=Bug in v.3.2?]\r
+;W[ie];B[kg];W[lg];B[ke];W[hf];B[hg];W[kf];B[jg]\r
+;W[ge];B[em];W[gg];B[gf];W[fg];B[ef];W[eg];B[dg];W[eh];B[ei]\r
+;W[ga];B[ed];W[fc];B[fe];W[gd];B[ii];W[ij];B[ea];W[hi];B[hh]\r
+;W[fm];B[dm];W[kh];B[ih];W[ej];B[dj];W[gj];B[fi];W[jh];B[dh]\r
+;W[ji];B[gh];W[tt];B[tt]\r
+C[W+13.5]\r
+)\r
+(;B[hf]\r
+C[level 10-14\r
+\r
+"Gnu Go is thinking..." \r
+very much too long for this move! \r
+(8 minutes on level 13,\r
+100 minutes on level 14!)\r
+=Bug in v.3.2?]\r
+;W[jg];B[ie];W[kf];B[hg];W[hd];B[em];W[ga];B[ge]\r
+;W[ih];B[ej];W[fm];B[dm];W[ea];B[db];W[hh];B[gh];W[ed];B[gd]\r
+;W[gc];B[ig];W[ee];B[ef];W[hi];B[jf];W[jd];B[fa];W[if];B[gl]\r
+;W[gm];B[jf];W[dd]\r
+(;B[if]\r
+C[ ?]\r
+;W[ce];B[df];W[bd];B[cc];W[be];B[bc];W[ba]\r
+(;B[ad]\r
+C[ ?]\r
+;W[bg];B[ae];W[cg];B[af];W[ag]\r
+(;B[cf]\r
+C[ ?]\r
+;W[bf];B[dg];W[ac];B[ab];W[ad];B[ch];W[bb];B[bi]\r
+;W[ai];B[fe];W[fc];B[hc];W[hb];B[aj];W[ah];B[gj];W[le];B[bh]\r
+;W[tt];B[tt];W[tt];B[tt]\r
+C[W+69.5]\r
+)\r
+(;B[ch]\r
+C[ !]\r
+;W[dg];B[eg]\r
+(;W[ac];B[ab];W[bf];B[ac])\r
+(;W[ab];B[ac])\r
+(;W[bf];B[ac];W[ab];B[bh];W[bb];B[dh];W[ea];B[hm];W[ca]\r
+;B[gl];W[im];B[gm];W[il];B[ah])))\r
+(;B[cf]\r
+C[ !]\r
+))\r
+(;B[ce]\r
+C[ !]\r
+;W[if];B[fe];W[fc];B[jf]))\r
+(;B[ih]\r
+C[GnuGo v3.0.0 lev 10 - 15]\r
+))\r
diff --git a/regression/games/mertin13x13/GNHT3.sgf b/regression/games/mertin13x13/GNHT3.sgf
new file mode 100644 (file)
index 0000000..b10935b
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[HandTalk 99.04 (98.10E)]\r
+DT[2002-11-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+16.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 696752862 level 15];B[kc];W[dc];B[ij];W[dk];B[kj];W[ce];B[hf];W[ke]\r
+;B[jd];W[ld];B[di];W[gk];B[ck];W[cl];B[cj];W[bl];B[fi];W[hc]\r
+;B[kg];W[lc];B[lf];W[kb];B[jb];W[lb];B[hk];W[gj];B[gi];W[je]\r
+;B[id];W[ie];B[el];W[he];B[cg];W[dl];B[ek];W[ej];B[fj];W[hi]\r
+;B[dj];W[gf];B[ge];W[hd];B[ff];W[gg];B[fd];W[ig];B[fg];W[hg]\r
+;B[hj];W[ec];B[bf];W[be];B[ae];W[ad];B[af];W[bd];B[gd];W[bk]\r
+;B[bj];W[ak];B[dm];W[cm];B[am];W[ii];B[gc];W[hb];B[gb];W[ib]\r
+;B[ji];W[jg];B[kh];W[df];B[hh];W[ih];B[gh];W[fb];B[ga];W[fa]\r
+;B[ed];W[dg];B[ch];W[eh];B[eg];W[dh];B[fh];W[ei];B[em];W[gl]\r
+;B[fk];W[aj];B[bi];W[dd];B[ee];W[me];B[cf];W[de];B[fc];W[eb]\r
+;B[ef];W[mf];B[mg];W[ha];B[hl];W[kf];B[jh];W[le];B[lg];W[tt]\r
+;B[tt]\r
+C[B+16.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNMF1.sgf b/regression/games/mertin13x13/GNMF1.sgf
new file mode 100644 (file)
index 0000000..61f47c1
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[The Many Faces of Go v10.2 lev10]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+17.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[cj];B[kj];W[cc];B[fk];W[dl];B[gg];W[fi]\r
+;B[dd];W[gd];B[cd];W[cg];B[eb];W[ik];B[bc];W[kg];B[gj];W[he]\r
+;B[gi];W[ii];B[fh];W[jl];B[hc];W[lk];B[if];W[ee];B[df];W[li]\r
+;B[ei];W[ie];B[je];W[jf];B[jg];W[kf];B[ig];W[id];B[le];W[ic]\r
+;B[jc];W[ib];B[lc];W[hg];B[hf];W[kb];B[lb];W[hb];B[jb];W[hh]\r
+;B[gf];W[lf];B[jh];W[md];B[me];W[ji];B[dg];W[ja];B[la];W[bh]\r
+;B[gc];W[mf];B[ke];W[dh];B[cf];W[bf];B[be];W[eh];B[ff];W[fe]\r
+;B[gb];W[kh];B[eg];W[gl];B[fl];W[hl];B[di];W[ch];B[ge];W[ci]\r
+;B[hd];W[ae];B[ad];W[af];B[gh];W[hj];B[ih];W[hi];B[gm];W[hm]\r
+;B[fm];W[el];B[dj];W[ck];B[ek];W[gk];B[dk];W[cl];B[em];W[dm]\r
+;B[tt];W[tt]\r
+C[B+17.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNMF2.sgf b/regression/games/mertin13x13/GNMF2.sgf
new file mode 100644 (file)
index 0000000..46f7b42
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[The Many Faces of Go v10.2 lev10]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+44.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[cc];B[jk];W[ck];B[ic];W[ji];B[ki];W[jj]\r
+;B[kj];W[kh];B[jh];W[kk];B[lk];W[kl];B[ik];W[ii];B[kg];W[lh]\r
+;B[li];W[mi];B[lj];W[jg];B[lg];W[ih];B[mj];W[ll];B[mh];W[jl]\r
+;B[il];W[hj];B[fk];W[dh];B[jm];W[fc];B[gd];W[fi];B[gf];W[hk]\r
+;B[hl];W[el];B[gl];W[jh];B[km];W[kf];B[lf];W[ke];B[le];W[ie]\r
+;B[ef];W[jd];B[jc];W[fd];B[cf];W[bg];B[cg];W[bj];B[bh];W[gh]\r
+;B[ek];W[ci];B[dl];W[kc];B[ld];W[dk];B[dm];W[cl];B[em];W[de]\r
+;B[eg];W[ch];B[bf];W[bd];B[gc];W[fb];B[gb];W[fe];B[ge];W[ff]\r
+;B[fg];W[gg];B[fa];W[ea];B[ga];W[db];B[cm];W[bm];B[fl];W[bl]\r
+;B[ej];W[hf];B[ei];W[eh];B[fh];W[df];B[gi];W[dg];B[fj];W[ee]\r
+;B[fi];W[hh];B[ig];W[if];B[je];W[bi];B[jf];W[ah];B[ml];W[hg]\r
+;B[id];W[dj];B[di];W[tt];B[tt]\r
+C[B+44.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNMF3.sgf b/regression/games/mertin13x13/GNMF3.sgf
new file mode 100644 (file)
index 0000000..6ad6225
--- /dev/null
@@ -0,0 +1,24 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[The Many Faces of Go v10.2 lev10]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+18.5]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[cj];B[kk];W[cc];B[ek];W[hj];B[ei];W[cg]\r
+;B[ii];W[ke];B[kg];W[ic];B[jd];W[fd];B[je];W[dk];B[el];W[gh]\r
+;B[fg];W[hg];B[gf];W[dl];B[hi];W[gi];B[hf];W[ef];B[jb];W[ig]\r
+;B[gj];W[fj];B[gk];W[ej];B[fk];W[fh];B[hc];W[jh];B[kf];W[gc]\r
+;B[hb];W[gb];B[ha];W[hd];B[ge];W[ib];B[ia];W[ga];B[ja];W[ik]\r
+;B[ij];W[il];B[hk];W[kj];B[jj];W[ki];B[jl];W[gd];B[if];W[eg]\r
+;B[id];W[lk];B[ll];W[lj];B[dm];W[cm];B[em];W[cl];B[mk];W[lh]\r
+;B[lg];W[mj];B[ml];W[fe];B[mh];W[li];B[gg];W[hh];B[jg];W[ih]\r
+;B[he];W[ji];B[jk];W[ff];B[kh];W[fi];B[mg];W[mi];B[tt];W[tt]\r
+C[W+18.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNWL1.sgf b/regression/games/mertin13x13/GNWL1.sgf
new file mode 100644 (file)
index 0000000..27ddde2
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Wulu v2.38]\r
+DT[2002-11-20]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+52.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[dc];B[jj];W[dj];B[fc];W[hk];B[dg];W[de]\r
+;B[jg];W[ff];B[ef];W[eh];B[ee];W[gd];B[gc];W[fg];B[il];W[hd]\r
+;B[ib];W[fd];B[ed];W[dd];B[ec];W[db];B[hl];W[gl];B[gk];W[fl]\r
+;B[gj];W[bk];B[kg];W[kc];B[kd];W[if];B[ci];W[fe];B[cf];W[bh]\r
+;B[ch];W[bi];B[bg];W[be];B[eb];W[da];B[cj];W[ck];B[bj];W[ek]\r
+;B[ak];W[jc];B[ic];W[al];B[aj];W[ce];B[bl];W[hh];B[hi];W[gh]\r
+;B[cl];W[dk];B[jf];W[ei];B[ie];W[hf];B[bf];W[fi];B[ae];W[ad]\r
+;B[af];W[bd];B[ih];W[kk];B[kj];W[jk];B[ik];W[lk];B[km];W[lc]\r
+;B[id];W[jb];B[ld];W[lb];B[ka];W[ja];B[la];W[mc];B[ma];W[kl]\r
+;B[lj];W[jl];B[mk];W[dl];B[cm];W[dm];B[am];W[cb];B[ll];W[hm]\r
+;B[im];W[gm];B[hc];W[ea];B[fa];W[bb];B[ig];W[fj];B[hg];W[ij]\r
+;B[hj];W[gg];B[he];W[gf];B[eg];W[gi];B[fk];W[di];B[dh];W[df]\r
+;B[ge]\r
+C[B+52.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNWL2.sgf b/regression/games/mertin13x13/GNWL2.sgf
new file mode 100644 (file)
index 0000000..87168a5
--- /dev/null
@@ -0,0 +1,30 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Wulu v2.38]\r
+DT[2002-11-20]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+20.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[ck];B[kj];W[dc];B[ik];W[ej];B[gd];W[ce]\r
+;B[gh];W[ic];B[id];W[hc];B[jb];W[hd];B[he];W[gc];B[ie];W[fd]\r
+;B[ge];W[jc];B[kc];W[gj];B[eh];W[hl];B[hk];W[gl];B[gk];W[fk]\r
+;B[il];W[ib];B[hj];W[kb];B[lb];W[ch];B[kg];W[ja];B[di];W[ci]\r
+;B[fe];W[la];B[df];W[cf];B[ed];W[jd];B[je];W[lc];B[ld];W[mb]\r
+;B[ec];W[db];B[eb];W[le];B[ke];W[lf];B[md];W[hg];B[da];W[cb]\r
+;B[gi];W[fj];B[dj];W[dk];B[ca];W[jh];B[bb];W[lh];B[dd];W[kh]\r
+;B[lg];W[kf];B[jg];W[jf];B[ig];W[jj];B[jk];W[if];B[mf];W[ih]\r
+;B[mg];W[hf];B[me];W[kl];B[lk];W[hh];B[hi];W[cj];B[dh];W[kk]\r
+;B[ll];W[lj];B[km];W[ki];B[im];W[ii];B[mi];W[mh];B[mj];W[cg]\r
+;B[fc];W[de];B[gb];W[ef];B[gg];W[fg];B[gf];W[fh];B[fi];W[ei]\r
+;B[fl];W[ek];B[fm];W[dm];B[mk];W[bd];B[cc];W[el];B[gm];W[em]\r
+;B[hm];W[ac];B[mc];W[lb];B[ff];W[eg];B[ee];W[dg];B[hb];W[ab]\r
+;B[bc];W[lm];B[mm];W[ha];B[ga];W[ia];B[cd];W[be];B[ba];W[ad]\r
+;B[aa];W[tt];B[tt]\r
+C[B+20.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GNWL3.sgf b/regression/games/mertin13x13/GNWL3.sgf
new file mode 100644 (file)
index 0000000..9aedfb1
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[2]\r
+PB[GnuGo v3.2 lev15]\r
+PW[Wulu v2.38]\r
+DT[2002-11-20]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+13.5]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[ec];B[cj];W[kk];B[gk];W[cd];B[cg];W[ek]\r
+;B[ej];W[ke];B[jj];W[li];B[jk];W[jc];B[jd];W[ic];B[kl];W[jh]\r
+;B[kd];W[le];B[jb];W[ib];B[je];W[jf];B[lb];W[ja];B[kb];W[cl]\r
+;B[he];W[if];B[hd];W[gc];B[fe];W[hh];B[gg];W[df];B[eg];W[bk]\r
+;B[dg];W[fl];B[fk];W[el];B[gl];W[dk];B[bj];W[bf];B[bg];W[ck]\r
+;B[ll];W[lk];B[cf];W[be];B[de];W[gm];B[hm];W[dc];B[mk];W[mj]\r
+;B[ml];W[aj];B[ai];W[fm];B[hl];W[ak];B[dj];W[kg];B[hc];W[hb]\r
+;B[gd];W[gb];B[gh];W[hi];B[ld];W[me];B[ii];W[hj];B[ih];W[hg]\r
+;B[lj];W[mi];B[ki];W[lh];B[kh];W[lg];B[ji];W[jg];B[ka];W[ia]\r
+;B[hf];W[ig];B[af];W[ci];B[ce];W[bd];B[ae];W[ad];B[ag];W[fj]\r
+;B[bi];W[fi];B[ei];W[fh];B[gj];W[gi];B[jl];W[fg];B[gf];W[hk]\r
+;B[im];W[fc];B[eh];W[ik];B[il];W[ff];B[ef];W[ed];B[ee];W[md]\r
+;B[mc];W[fd];B[kj];W[dd];B[ie];W[id];B[ij];W[tt];B[tt]\r
+C[W+13.5]\r
+)\r
diff --git a/regression/games/mertin13x13/GPGN1.sgf b/regression/games/mertin13x13/GPGN1.sgf
new file mode 100644 (file)
index 0000000..bd9e90a
--- /dev/null
@@ -0,0 +1,58 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Professional III]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-16]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+6.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 477648600 level 15];B[dj];W[ch];B[fk];W[bj];B[ck];W[ce];B[id];W[ed]\r
+;B[jj];W[kh];B[kd];W[lj];B[kk];W[lk];B[gc];W[fc];B[gb];W[fb]\r
+;B[df];W[cf];B[dh];W[ih];B[hi];W[ll];B[kl];W[lf];B[bk];W[ci]\r
+;B[di];W[km];B[jm];W[lm];B[jl];W[ga];B[ib];W[ha];B[le];W[ia]\r
+;B[jb];W[kf];B[de];W[dd];B[gh];W[ja];B[kb];W[hg];B[ka];W[ak]\r
+;B[al];W[aj];B[bl];W[dg];B[eg];W[cg];B[ff];W[fe];B[ef];W[gd]\r
+;B[hb];W[fa];B[me]\r
+(;W[he]\r
+C[ ?!]\r
+;B[mf]\r
+(;W[mg]\r
+C[ ?]\r
+;B[lg]\r
+(;W[mh]\r
+C[ ?]\r
+;B[lh];W[mi];B[li];W[mj];B[ki];W[ji];B[kj];W[ml]\r
+;B[kg];W[jf];B[jg];W[ig];B[ie];W[if];B[jh];W[ii];B[ij];W[gf]\r
+;B[gg];W[ke];B[ld];W[hd]\r
+(;B[ic]\r
+C[ !]\r
+;W[je];B[jd];W[ee];B[cj];W[bi];B[hh];W[hf];B[hc]\r
+;W[tt];B[tt];W[tt]\r
+C[B+6.5]\r
+)\r
+(;B[hc]\r
+C[ ?]\r
+;W[jd];B[jc];W[je];B[lb];W[ic];B[cj];W[bh];B[id]\r
+;W[hh];B[gj]\r
+C[ B+1.5]\r
+))\r
+(;W[lh]\r
+C[ !]\r
+;B[mh]))\r
+(;W[lg]\r
+C[ !]\r
+))\r
+(;W[mf]\r
+C[ !]\r
+;B[cj];W[bi];B[gf];W[ke];B[ld];W[ie];B[hd];W[ii]\r
+;B[ij];W[gg];B[fg];W[hh];B[gi];W[hf];B[ge];W[fd];B[je];W[jf]\r
+;B[jd];W[he];B[ji];W[jh];B[ki];W[li]\r
+C[ W+4.5]\r
+))\r
diff --git a/regression/games/mertin13x13/GPGN3.sgf b/regression/games/mertin13x13/GPGN3.sgf
new file mode 100644 (file)
index 0000000..11c7ded
--- /dev/null
@@ -0,0 +1,31 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Professional III]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-16]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+15.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1760900921 level 15];B[ck];W[cc]\r
+(;B[ic];W[dh];B[ji];W[kk];B[fk];W[gc];B[ik];W[li];B[kd]\r
+;W[fh];B[bh];W[bf];B[hb];W[he];B[fb];W[cg];B[ed];W[fe];B[gb]\r
+;W[ee];B[dd];W[ej];B[ek];W[hh];B[cd];W[bd];B[jk];W[kl];B[jl]\r
+;W[fc];B[ec];W[bg];B[dj];W[bi];B[bj];W[ai];B[cb];W[bc];B[bb]\r
+;W[ab];B[ba];W[db];B[dc];W[fj];B[hj];W[gj];B[gk];W[jm];B[im]\r
+;W[km];B[lg];W[jg];B[lh];W[kj];B[ki];W[mj];B[lk];W[ll];B[hi]\r
+;W[kh];B[kf];W[jh];B[ih];W[ig];B[ii];W[gi];B[ie];W[hf];B[hd]\r
+;W[ci];B[cj];W[ce];B[di];W[de];B[eb];W[ei];B[aj];W[if];B[jf]\r
+;W[jj];B[hk];W[gd];B[fd];W[mh];B[mk];W[mi];B[mg];W[lj];B[hc]\r
+;W[ge];B[kg];W[ij];B[jc];W[ac];B[da];W[aa];B[ae];W[be];B[tt]\r
+;W[tt]\r
+C[B+15.5]\r
+)\r
+(;B[ic];W[dh];B[ji];W[kk];B[fk];W[gc];B[ik];W[li];B[kd]\r
+;W[fh];B[bh];W[bf];B[hb];W[he];B[fb];W[cg];B[ed];W[fe];B[gb]\r
+;W[ee];B[dd];W[ej]))\r
diff --git a/regression/games/mertin13x13/GPGN5.sgf b/regression/games/mertin13x13/GPGN5.sgf
new file mode 100644 (file)
index 0000000..20bae0e
--- /dev/null
@@ -0,0 +1,41 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Professional III]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-16]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+16.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1037412900 level 15];B[ci];W[ej];B[ic];W[ck];B[kk];W[dh];B[cc];W[ch]\r
+;B[kd];W[hg];B[kh];W[hi];B[hk];W[dd];B[dc];W[ed];B[be];W[kf]\r
+;B[fc];W[if];B[fl];W[hj];B[ik];W[hd];B[hc];W[gd];B[df];W[fd]\r
+;B[gc];W[ef];B[dg];W[eg];B[bg];W[bh];B[le];W[lf];B[me];W[ag]\r
+;B[bf];W[gk];B[gl];W[fk];B[el];W[dl];B[ji];W[mf];B[lg];W[ec]\r
+;B[eb];W[kg];B[lh];W[jg];B[je];W[ke];B[ld];W[ie];B[jd];W[cg]\r
+;B[de];W[cd];B[bd];W[cf];B[ce];W[af];B[dm];W[cm];B[em];W[ek]\r
+;B[ih];W[jh];B[ii];W[ee];B[hh];W[gh];B[jf];W[ig];B[ij];W[ae]\r
+;B[bc];W[ad];B[ac];W[ah];B[mg];W[id];B[dk];W[cl];B[gi];W[gj]\r
+;B[di];W[tt]\r
+(;B[tt]\r
+C[ B pass]\r
+;W[tt]\r
+C[B+16.5]\r
+)\r
+(;B[eh];W[ei];B[fh];W[fi])\r
+(;B[ei]\r
+C[ !?]\r
+\r
+(;W[eh]\r
+(;B[fi];W[dj];B[fh];W[gg];B[tt])\r
+(;B[dj];W[fi]))\r
+(;W[bj]\r
+C[ ?]\r
+;B[eh];W[bi];B[gg]\r
+(;W[fi];B[fh])\r
+(;W[fh];B[fi];W[fg];B[dj]))))\r
diff --git a/regression/games/mertin13x13/GXGN1.sgf b/regression/games/mertin13x13/GXGN1.sgf
new file mode 100644 (file)
index 0000000..542d491
--- /dev/null
@@ -0,0 +1,35 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go4++ beta72]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+25.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1034460153 level 15];B[jd];W[ck];B[dd];W[kk];B[ch];W[fc];B[hc];W[kf]\r
+;B[ld];W[db];B[cc];W[fe];B[fh];W[fk];B[he];W[gf];B[ig];W[jh]\r
+;B[hh];W[de];B[ce];W[ed]\r
+(;B[dc];W[cb];B[bb];W[ec];B[df];W[bc]\r
+(;B[bd]\r
+C[ ?]\r
+;W[cd];B[be];W[ii];B[ac];W[le];B[kc];W[bi];B[bh]\r
+;W[cc];B[bj];W[ci];B[ai];W[ef];B[dg];W[di];B[bl];W[bk];B[ak]\r
+;W[cl];B[gb];W[bm];B[al];W[ba];B[ab];W[fi];B[gi];W[gj];B[hi]\r
+;W[hj];B[ei];W[dh];B[bg];W[eh];B[fj];W[eg];B[ad];W[ej];B[jg]\r
+;W[kg];B[fi];W[ek];B[ke];W[ih];B[hf];W[mf];B[jf];W[cj];B[aj]\r
+;W[gd];B[hd];W[gg];B[hg];W[fb];B[ga];W[fg];B[kh];W[ki];B[lh]\r
+;W[lg];B[ij];W[ji];B[gk];W[hk];B[fa];W[ea];B[gc];W[li];B[md]\r
+;W[ik];B[me];W[mh];B[ge];W[lf];B[fd];W[bf];B[af];W[gd];B[aa]\r
+;W[ca];B[fd];W[cf];B[cg];W[gd];B[ah];W[fd];B[gh];W[cm];B[am]\r
+;W[tt];B[tt];W[tt]\r
+C[W+25.5]\r
+)\r
+(;B[ee];W[ba])\r
+(;B[cd];W[ab]))\r
+(;B[cb];W[dc];B[cd];W[df]))\r
diff --git a/regression/games/mertin13x13/GXGN2.sgf b/regression/games/mertin13x13/GXGN2.sgf
new file mode 100644 (file)
index 0000000..4217dac
--- /dev/null
@@ -0,0 +1,64 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go4++ beta 72]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-15]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+20.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 531940521 level 15]\r
+(;B[kd];W[cc];B[dj];W[kk];B[ic];W[ch];B[fk];W[bj];B[ck]\r
+;W[df];B[ik];W[gc];B[ji];W[li];B[kh];W[gf];B[lh];W[il];B[jl]\r
+;W[jk];B[hl];W[ij];B[im];W[bk];B[hh];W[hb];B[ib];W[cl];B[dl]\r
+;W[if];B[cd];W[bd];B[bc];W[bb];B[fh];W[ia];B[ja];W[ha];B[jb]\r
+;W[bl];B[kl];W[dm];B[el];W[kf];B[eg];W[ke];B[ld];W[ei];B[di]\r
+;W[jj];B[ki];W[dd];B[ef];W[ee];B[hc]\r
+(;W[hd]\r
+C[ ?!]\r
+;B[gb];W[gd];B[fb];W[fi];B[gi];W[jd];B[dg];W[cg]\r
+;B[id];W[je];B[lf];W[le];B[kc];W[lg];B[mg];W[mf];B[mh];W[cj]\r
+;B[hg];W[ie];B[ec];W[db];B[kg];W[ff];B[dh];W[lf];B[ci];W[bi]\r
+;B[dc];W[ce];B[eb];W[jg];B[ig];W[jh];B[ii];W[ea];B[hf];W[he]\r
+;B[dk];W[jc];B[lb];W[em];B[fm];W[cm];B[fd];W[ed];B[fc];W[fe]\r
+;B[md];W[fa];B[ga];W[da];B[gg];W[fg];B[eh];W[jf];B[ca];W[cb]\r
+;B[ih];W[ge];B[me];W[tt];B[tt];W[tt]\r
+C[B+20.5]\r
+)\r
+(;W[gb]\r
+C[ ?]\r
+;B[fe]\r
+(;W[ff];B[gd];W[fd];B[ge];W[fc];B[dg];W[cg];B[dh];W[em]\r
+;B[fm];W[ih];B[ii];W[ll];B[lj];W[cm];B[ci];W[bi];B[cj]\r
+C[ B+44.5]\r
+)\r
+(;W[fd];B[ge];W[hd];B[gd];W[fc];B[dg];W[jg];B[hg];W[ff]\r
+;B[he];W[cg];B[ci];W[bi];B[dh]\r
+C[ B+44.5]\r
+))\r
+(;W[gd]\r
+C[ !?]\r
+;B[gb]\r
+(;W[fb];B[fa];W[ea];B[ga])\r
+(;W[lg];B[lj];W[ih];B[ii];W[hg];B[lk];W[gh];B[fi];W[hi]\r
+;B[hj];W[dh];B[fb];W[eh];B[fg];W[gj];B[kj];W[fj];B[gi];W[ej]\r
+;B[hh];W[gk];B[gl];W[hi];B[em];W[hh];B[cm];W[eb]\r
+C[ W+12.5]\r
+)))\r
+(;B[kd]\r
+(;W[jj];B[dc];W[dk];B[ci];W[ce];B[ed];W[df];B[ei];W[ff]\r
+;B[gd];W[gk];B[fj];W[fk];B[bk];W[hf];B[ie];W[hi];B[kh];W[cl]\r
+;B[bh];W[bl];B[cj];W[bf];B[lj];W[kk];B[bd];W[bg];B[lk];W[if]\r
+;B[jf];W[he];B[hd];W[je];B[ke];W[id];B[ic];W[eg];B[ll];W[kl]\r
+;B[km];W[jm];B[lm];W[il];B[jg];W[ig];B[ih];W[hh];B[ii];W[ij]\r
+;B[be];W[ki];B[li];W[jh];B[kg];W[cd];B[cc];W[ae];B[bc];W[ad]\r
+;B[ac];W[af];B[jd];W[ie];B[kj];W[ji];B[de];W[ge];B[ee];W[fe]\r
+;B[fd];W[tt];B[ef];W[dg];B[dd];W[eh];B[cf];W[cg];B[ce];W[tt]\r
+;B[tt])\r
+(;W[dj])))\r
diff --git a/regression/games/mertin13x13/GXGN3.sgf b/regression/games/mertin13x13/GXGN3.sgf
new file mode 100644 (file)
index 0000000..af27bb3
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go4++ beta 72]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-15]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+14.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1037386179 level 15];B[kc];W[dd];B[dj];W[kj];B[fc];W[ch];B[fk];W[bj]\r
+;B[ck];W[ec];B[fd];W[ij];B[kf];W[eb];B[fb];W[ef];B[bk];W[gf]\r
+;B[he];W[lh];B[il];W[ci];B[lg];W[kl];B[kh];W[fi];B[li];W[lj]\r
+;B[ih];W[ak];B[al];W[aj];B[bl];W[fa];B[ga];W[ea];B[gb];W[mi]\r
+;B[mh];W[mj];B[ei];W[eh];B[di];W[fh];B[hk];W[hi];B[hf];W[hg]\r
+;B[ig];W[hh];B[cc];W[cd];B[fj];W[gj];B[gk];W[hj];B[jm];W[km]\r
+;B[jl];W[ji];B[jk];W[ki];B[lh];W[kk];B[ed];W[bc];B[ge];W[fe]\r
+;B[ee];W[de];B[ff];W[fg];B[gg];W[gh];B[dh];W[dg];B[gf];W[jh]\r
+;B[jg];W[cj];B[dk];W[ik];B[cb];W[dc];B[ii];W[jj];B[hl];W[tt]\r
+;B[tt];W[tt]\r
+C[B+14.5]\r
+)\r
diff --git a/regression/games/mertin13x13/HTGN1.sgf b/regression/games/mertin13x13/HTGN1.sgf
new file mode 100644 (file)
index 0000000..4b26ebb
--- /dev/null
@@ -0,0 +1,29 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[HandTalk 99.04 (98.10E)]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+10.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1676454954 level 15];B[jd];W[dd];B[kj];W[cj];B[cf];W[hc];B[bd];W[jg]\r
+;B[ij];W[gk];B[ic];W[hd];B[kf];W[ef];B[ch];W[il];B[kl];W[hg]\r
+;B[kg];W[id];B[ib];W[hb];B[ek];W[ej];B[cc];W[dk];B[dc];W[jc]\r
+;B[kd];W[jb];B[jh];W[ec];B[ig];W[eb];B[el];W[fk];B[hh];W[gg]\r
+;B[db];W[lc];B[ld];W[kc];B[bi];W[bj];B[eh];W[if];B[jf];W[md]\r
+;B[me];W[mc];B[le];W[je];B[dg];W[jl];B[dl];W[cl];B[aj];W[ak]\r
+;B[ai];W[bk];B[gh];W[hf];B[jm];W[im];B[km];W[di];B[fl];W[gl]\r
+;B[ea];W[fa];B[da];W[fb];B[de];W[ee];B[hk];W[df];B[ce];W[kk]\r
+;B[lk];W[jk];B[ll];W[hl];B[jj];W[gj];B[fg];W[ff];B[fi];W[eg]\r
+;B[dh];W[ci];B[bh];W[fh];B[gi];W[hj];B[ik];W[hi];B[ii];W[ei]\r
+;B[fg];W[dm];B[fh];W[fj];B[cd]\r
+C[ (B resign)]\r
+;W[ed];B[ke];W[ie];B[tt];W[tt]\r
+C[W+10.5]\r
+)\r
diff --git a/regression/games/mertin13x13/HTGN2.sgf b/regression/games/mertin13x13/HTGN2.sgf
new file mode 100644 (file)
index 0000000..f378730
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[HandTalk 99.04 (98.10E)]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+23.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1037526623 level 15];B[kd];W[cc];B[jj];W[ck];B[id];W[hk];B[ik];W[hj]\r
+;B[ci];W[ji];B[ki];W[ij];B[jh];W[jk];B[kj];W[cg];B[ei];W[fh]\r
+;B[fk];W[ej];B[fi];W[fj];B[ii];W[gi];B[el];W[dj];B[ce];W[di]\r
+;B[ee];W[fc];B[ge];W[ib];B[kk];W[jl];B[kl];W[il];B[kb];W[be]\r
+;B[bd];W[cd];B[bf];W[de];B[ed];W[cf];B[ec];W[db];B[eb];W[ea]\r
+;B[fb];W[km];B[lm];W[jm];B[ll];W[hh];B[ef];W[ig];B[jg];W[if]\r
+;B[jf];W[eg];B[gg];W[fa];B[ga];W[da];B[gc];W[ie];B[hd];W[je]\r
+;B[ke];W[jd];B[jc];W[fg];B[ff];W[ih];B[df];W[dg];B[dd]\r
+C[ (B resign)]\r
+;W[ce]\r
+;B[hf];W[he];B[ic];W[dc];B[hg];W[gh];B[gf];W[hi];B[ji];W[tt]\r
+;B[tt];W[tt]\r
+C[W+23.5]\r
+)\r
diff --git a/regression/games/mertin13x13/HTGN3.sgf b/regression/games/mertin13x13/HTGN3.sgf
new file mode 100644 (file)
index 0000000..bca94b3
--- /dev/null
@@ -0,0 +1,29 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[HandTalk 99.04 (98.10E)]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-17]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+6.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.2 Random Seed 1941399038 level 15];B[kc];W[cc];B[jj];W[dk];B[di];W[ci];B[ch];W[cj]\r
+;B[dg];W[fk];B[ce];W[jh];B[fc];W[eb];B[bd];W[bc];B[fb];W[cb]\r
+;B[id];W[dc];B[il];W[hh];B[hj];W[kh];B[lj];W[kf];B[if];W[fh]\r
+;B[gk];W[eh];B[dh];W[fj];B[gi];W[gh];B[ec];W[ea];B[ff];W[gl]\r
+;B[gj];W[fa];B[ld];W[bi];B[bh];W[gb];B[ib];W[dd];B[ee];W[gf]\r
+;B[ge];W[ah];B[gg];W[ag];B[ej];W[fi];B[ek];W[el];B[gc];W[hb]\r
+;B[hc];W[hl];B[ik];W[im];B[jm];W[hm];B[kl];W[hg];B[de];W[hf]\r
+;B[he];W[fg];B[li];W[dj];B[ei];W[ii];B[lf];W[lg];B[ke];W[jf]\r
+;B[bf];W[je];B[ie];W[mf];B[jd];W[le];B[ig];W[kd];B[ac];W[ab]\r
+;B[md];W[ad];B[ae];W[ih];B[ed];W[lh];B[mi];W[cd];B[ac];W[jg]\r
+;B[bg];W[ad];B[be];W[eg];B[ef];W[ki];B[kj];W[mh];B[ac];W[ke]\r
+;B[ad];W[ha];B[ia];W[ga];B[ba];W[ca];B[lc];W[ij];B[hk];W[me]\r
+;B[hi];W[ji];B[af];W[ai];B[tt];W[tt]\r
+C[W+6.5]\r
+)\r
diff --git a/regression/games/mertin13x13/MFGN1.sgf b/regression/games/mertin13x13/MFGN1.sgf
new file mode 100644 (file)
index 0000000..239b690
--- /dev/null
@@ -0,0 +1,45 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[The Many Faces of Go v10.2 lev10]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-09]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+43.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd]\r
+C[(preset - vorgegeben)]\r
+;W[dd];B[jk];W[dj];B[ki];W[kc];B[kd];W[jc]\r
+(;B[ic];W[id]\r
+(;B[jf];W[hc];B[fk];W[dg];B[gc];W[ib]\r
+(;B[fi];W[ek]\r
+(;B[gk];W[gf]\r
+(;B[lc];W[lb];B[ld];W[el]\r
+(;B[mb];W[hm]\r
+(;B[gd];W[he]\r
+(;B[ch];W[cg];B[il];W[ei];B[hd];W[ie];B[fl];W[bd];B[hb]\r
+;W[ic];B[kb];W[gg];B[ih];W[fm];B[im];W[fh];B[bh];W[gi];B[fj]\r
+;W[ej];B[ck];W[cj];B[bj];W[bl];B[bk];W[cl];B[hi];W[gb];B[bg]\r
+;W[bf];B[gm];W[gl];B[hl];W[gj];B[gm];W[hj];B[ij];W[hk];B[em]\r
+;W[dm];B[fm];W[hh];B[ii];W[ig];B[jg];W[jb];B[la];W[if];B[ja]\r
+;W[ia];B[ka];W[je];B[ke];W[gh];B[ik];W[tt];B[ec];W[dc];B[cf]\r
+;W[ce];B[fb];W[ha];B[dh];W[eh];B[eg];W[df];B[db];W[cb];B[ai]\r
+;W[ak];B[cc];W[cd];B[ea];W[ca];B[fa];W[da];B[bb];W[bc];B[ga]\r
+;W[ed];B[bm];W[cm];B[dk];W[dl];B[fd];W[eb];B[al];W[db];B[tt]\r
+;W[tt]\r
+C[W+43.5]\r
+)\r
+(;B[il]))\r
+(;B[gb]))\r
+(;B[ie]))\r
+(;B[ie]))\r
+(;B[hj]))\r
+(;B[db]))\r
+(;B[hc]))\r
+(;B[fk]\r
+C[ (MFGo v11.0)]\r
+))\r
diff --git a/regression/games/mertin13x13/MFGN2.sgf b/regression/games/mertin13x13/MFGN2.sgf
new file mode 100644 (file)
index 0000000..21b2c38
--- /dev/null
@@ -0,0 +1,36 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[The Many Faces of Go v10.2 lev10]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-19]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+35.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[dj];B[dc];W[kj];B[ce];W[kf];B[hd];W[fi]\r
+;B[ik];W[jl];B[hj];W[hh];B[fk];W[el];B[il];W[dh];B[jk];W[kl]\r
+;B[ke];W[fg];B[jj];W[ki];B[gl];W[ii];B[bh];W[lf];B[ck];W[dk]\r
+;B[cl];W[fc];B[fd];W[gc];B[hc];W[ec];B[gd];W[hb];B[ib];W[db]\r
+;B[cc];W[ha]\r
+(;B[ed]\r
+C[ ?]\r
+;W[cb];B[le];W[ih];B[ia];W[fa];B[hk];W[gj];B[jf]\r
+;W[jg];B[fm];W[em];B[ek];W[dl];B[ej];W[ei];B[ci];W[di];B[mf]\r
+;W[lg];B[cg];W[bc];B[bd];W[if];B[je];W[mg];B[me];W[bb];B[cj]\r
+;W[cm];B[bl];W[bm];B[hf];W[ie];B[id];W[he];B[ge];W[ig];B[gg]\r
+;W[gh];B[ff];W[eg];B[ef];W[dg];B[df];W[ad];B[ae];W[ac];B[al]\r
+;W[ch];B[bf];W[hg];B[gf];W[dm];B[gb];W[ga];B[ji];W[kk];B[gk]\r
+;W[hm];B[jh];W[im];B[am];W[tt];B[fj];W[gi];B[ea];W[fb];B[tt]\r
+;W[tt]\r
+C[W+35.5]\r
+)\r
+(;B[cb]\r
+C[ !]\r
+;W[kk];B[fj];W[mc];B[lc];W[md];B[lb];W[ed];B[ee]\r
+;W[ea];B[fb];W[cg];B[bg];W[cf];B[bf];W[gb];B[fa];W[de];B[dd]\r
+;W[df];B[ff];W[gg];B[cj];W[gj];B[gi];W[fl];B[ei];W[di];B[fh]\r
+;W[if]))\r
diff --git a/regression/games/mertin13x13/MFGN3.sgf b/regression/games/mertin13x13/MFGN3.sgf
new file mode 100644 (file)
index 0000000..ab221d2
--- /dev/null
@@ -0,0 +1,27 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[The Many Faces of Go v10.2 lev10]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-10-13]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+42.5]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[ck];B[cc];W[kj];B[cg];W[hd];B[ij];W[fj]\r
+;B[ci];W[ik];B[ej];W[ek];B[jf];W[jk];B[ic];W[hc];B[de];W[fc]\r
+;B[ge];W[ib];B[id];W[db];B[jb];W[hb];B[he];W[hj];B[ec];W[eb]\r
+;B[dj];W[dk];B[ii];W[hi];B[fi];W[ih];B[cb];W[dc];B[ed];W[gd]\r
+;B[gb];W[da];B[bj];W[kg];B[kf];W[lf];B[le];W[lg];B[fk];W[gj]\r
+;B[fa];W[fb];B[ga];W[ia];B[fe];W[ca];B[cd];W[bb];B[bc];W[me]\r
+;B[ld];W[bk];B[ak];W[al];B[aj];W[gh];B[bl];W[cl];B[am];W[fh]\r
+;B[eh];W[fg];B[fl];W[cm];B[el];W[cj];B[bi];W[jg];B[ba];W[aa]\r
+;B[ja];W[if];B[fd];W[ie];B[gc];W[ke];B[em];W[jd];B[jc];W[md]\r
+;B[mc];W[mf];B[eg];W[ff];B[hl];W[il];B[kd];W[je];B[ef];W[hm]\r
+;B[gm];W[im];B[hf];W[hk];B[gl];W[hg];B[gf];W[gi];B[ei];W[gg]\r
+;B[gk];W[tt];B[tt]\r
+C[B+42.5]\r
+)\r
diff --git a/regression/games/mertin13x13/WLGN1.sgf b/regression/games/mertin13x13/WLGN1.sgf
new file mode 100644 (file)
index 0000000..9224889
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Wulu v2.38]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-21]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+1.5]\r
+US[Mertin]\r
+EV[CGoT];B[jd];W[dj];B[kj];W[ec];B[cc];W[de];B[be];W[hc]\r
+;B[ik];W[jf];B[ie];W[kc];B[kd];W[jc];B[ch];W[ig];B[lf];W[fk]\r
+;B[bj];W[ck];B[ld];W[bk];B[bi];W[hl];B[bf];W[il];B[kh];W[db]\r
+;B[kl];W[lc];B[hf];W[hh];B[gj];W[dc];B[fi];W[fh];B[ei];W[ff]\r
+;B[gg];W[gh];B[fg];W[cd];B[eh];W[bd];B[ef];W[fe];B[dl];W[cl]\r
+;B[jk];W[ee];B[dg];W[md];B[el];W[ej];B[gl];W[fl];B[gk];W[gm]\r
+;B[hm];W[fm];B[gd];W[gc];B[me];W[mc];B[ak];W[al];B[aj];W[hd]\r
+;B[ge];W[he];B[gf];W[ae];B[af];W[ad];B[fd];W[df];B[eg];W[hk]\r
+;B[hj];W[id];B[if];W[ed];B[ib];W[hb];B[fc];W[fb];B[fj];W[im]\r
+;B[cf];W[hm];B[jm];W[em];B[jl];W[dm];B[jb];W[kb];B[di];W[cj]\r
+;B[ci];W[ce];B[mg];W[tt];B[li];W[tt];B[tt]\r
+C[B+1.5]\r
+)\r
diff --git a/regression/games/mertin13x13/WLGN2.sgf b/regression/games/mertin13x13/WLGN2.sgf
new file mode 100644 (file)
index 0000000..ce00e13
--- /dev/null
@@ -0,0 +1,26 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Wulu v2.38]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-20]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+41.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd];W[ck];B[dd];W[ki];B[kk];W[ij];B[ci];W[jl]\r
+;B[id];W[ei];B[cf];W[fg];B[kl];W[gd];B[ih];W[jg];B[gi];W[ig]\r
+;B[hh];W[hg];B[jj];W[ji];B[lj];W[gk];B[li];W[jk];B[kj];W[ii]\r
+;B[gh];W[dg];B[dj];W[cg];B[fj];W[ej];B[fk];W[dk];B[ek];W[gl]\r
+;B[bf];W[bg];B[di];W[fi];B[gj];W[cc];B[dc];W[kf];B[bj];W[cd]\r
+;B[bk];W[df];B[gg];W[gf];B[be];W[ce];B[de];W[cb];B[lh];W[el]\r
+;B[bd];W[bl];B[bc];W[bb];B[db];W[ab];B[fl];W[dm];B[gm];W[cl]\r
+;B[hk];W[ik];B[hl];W[em];B[fe];W[ic];B[ff];W[eh];B[jc];W[ai]\r
+;B[im];W[he];B[hc];W[ef];B[fb];W[ee];B[fd];W[ed];B[fc];W[hd]\r
+;B[gc];W[ie];B[jd];W[ec];B[eb];W[bi];B[cj];W[ca];B[jm];W[da]\r
+;B[af];W[ag];B[bm];W[ak];B[fh];W[eg];B[ea];W[fm];B[tt];W[tt]\r
+C[B+41.5]\r
+)\r
diff --git a/regression/games/mertin13x13/WLGN3.sgf b/regression/games/mertin13x13/WLGN3.sgf
new file mode 100644 (file)
index 0000000..9f5e3ec
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Wulu v2.38]\r
+PW[GnuGo v3.2 lev15]\r
+DT[2002-11-21]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+5.5]\r
+US[Mertin]\r
+EV[CGoT];B[kc];W[dc];B[ij];W[eg];B[cj];W[gg];B[je];W[cg]\r
+;B[ce];W[bd];B[ej];W[kk];B[jl];W[ji];B[ll];W[gc];B[gj];W[kl]\r
+;B[km];W[jj];B[ik];W[kg];B[hh];W[le];B[ld];W[kf];B[lj];W[lk]\r
+;B[li];W[mk];B[ge];W[lm];B[ee];W[bh];B[hg];W[ci];B[bj];W[be]\r
+;B[ke];W[lg];B[jb];W[jm];B[hb];W[hm];B[fb];W[fc];B[eb];W[ec]\r
+;B[db];W[hc];B[cc];W[cd];B[cb];W[de];B[gb];W[ef];B[gl];W[gm]\r
+;B[el];W[fe];B[ic];W[gf];B[di];W[he];B[if];W[md];B[mc];W[me]\r
+;B[jh];W[kh];B[ki];W[ii];B[jg];W[hi];B[gi];W[kj];B[bc];W[gh]\r
+;B[dl];W[bi];B[aj];W[id];B[jd];W[ie];B[jf];W[mi];B[dh];W[fm]\r
+;B[fi];W[fl];B[fk];W[hl];B[gk];W[dg];B[il];W[im];B[ad];W[ae]\r
+;B[ac];W[em];B[dm];W[hk];B[hj];W[km];B[hf];W[gd];B[ai];W[eh]\r
+;B[ah];W[ag];B[ih];W[ch];B[cl];W[ei];B[dj];W[fh];B[jk];W[tt]\r
+;B[tt]\r
+C[W+5.5]\r
+)\r
diff --git a/regression/games/mertin13x13/gnugo-gointellect1.W+28.sgf b/regression/games/mertin13x13/gnugo-gointellect1.W+28.sgf
new file mode 100644 (file)
index 0000000..39d2574
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo 3.0.0]\r
+PW[Go Intellect 10.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+28.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 999818995 level 10];B[jd];W[dc];B[kj];W[dk];B[hk];W[cf];B[di];W[cj]\r
+;B[gc];W[ci];B[kg];W[kc];B[kd];W[ld];B[le];W[lc];B[jb];W[jc]\r
+;B[kb];W[lb];B[ib];W[fk];B[la];W[ke];B[lf];W[ic];B[hc];W[je]\r
+;B[ge];W[id];B[if];W[hd]\r
+(;B[mb];W[gd];B[fd];W[fc];B[fb];W[ec];B[fe];W[eb];B[fi]\r
+;W[dh];B[ih];W[md];B[eh];W[ej];B[gl];W[fl];B[ef];W[gb];B[df]\r
+;W[ei];B[fh];W[ce];B[fm];W[em];B[gm];W[el];B[gk];W[hb];B[dg]\r
+;W[ch];B[cg];W[bg];B[jf];W[he];B[hf];W[me];B[fj];W[kf];B[lg]\r
+;W[cc];B[de];W[dd];B[ed];W[mf];B[mg];W[ie];;;\r
+C[W+28.5]\r
+)\r
+(;B[gd]\r
+C[ !?]\r
+))\r
diff --git a/regression/games/mertin13x13/gnugo-gointellect2.W+2.sgf b/regression/games/mertin13x13/gnugo-gointellect2.W+2.sgf
new file mode 100644 (file)
index 0000000..7eaf74c
--- /dev/null
@@ -0,0 +1,28 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo 3.0.0]\r
+PW[Go Intellect 10.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+2.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 999818995 level 10];B[kd];W[cd];B[jj];W[cj];B[ec];W[ek];B[de];W[ce]\r
+;B[df];W[cg];B[ic];W[db];B[dc];W[cc];B[eb];W[hk];B[cb];W[ii]\r
+;B[kh];W[ji];B[kj];W[ki];B[kl];W[li];B[lj];W[bb];B[da];W[dg]\r
+;B[gf];W[gh];B[eg];W[eh];B[fg];W[fh];B[jf];W[lg];B[ig];W[mj]\r
+;B[mk];W[mi];B[ll];W[il];B[le];W[jl];B[ba];W[bc];B[cf];W[bf]\r
+;B[kg];W[km];B[lm];W[jk];B[kk];W[ij];B[jm];W[dd];B[ed];W[ee]\r
+;B[ef];W[gg];B[fe];W[im];B[lf];W[lh];B[hg];W[mf];B[jh];W[me]\r
+;B[md];W[mg];B[ab];W[ac];B[hh];W[hi];B[km];W[lc];B[ld];W[kc]\r
+;B[jb];W[kb];B[ka];W[jc];B[ib];W[jd];B[ih];W[ie];B[ca];W[hf]\r
+;B[he];W[je];B[if];W[mc];B[kf];W[la];B[mb];W[ja];B[aa];W[hd]\r
+;B[id];W[gc];B[hc];W[gd];B[gb];W[ha];B[hb];W[be];;W[fb]\r
+;B[fa];;\r
+C[W+2.5]\r
+)\r
diff --git a/regression/games/mertin13x13/gnugo-gointellect3.W+37.sgf b/regression/games/mertin13x13/gnugo-gointellect3.W+37.sgf
new file mode 100644 (file)
index 0000000..66a075a
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[3]
+VW[]AP[Many Faces of Go:11.0]SZ[13]HA[0]ST[1]
+PB[GnuGo 3.0.0]
+PW[Go Intellect 10.0]
+DT[2001-09-23]
+PC[OS]KM[5.5]RU[Japanese]
+RE[W+37.5]
+US[Mertin]
+EV[CGoT]
+GN[GNU Go 3.0.0 Random Seed 999777922 level 10]
+;B[kc];W[jk];B[dk];W[dc];B[di];W[ce];B[ji];W[gk];B[kk];W[kj];B[jj];
+W[kl];B[lk];W[jl];B[ki];W[ll];B[lj];W[hc];B[cg];W[kd];B[ld];W[jc];
+B[kb];W[je];B[bf];W[le];B[mc];W[el];B[ek];W[fl];B[dl];W[be];B[eg];
+W[jg];B[gi];W[lh];B[gj];W[jb];B[lb];W[hf];B[fk];W[gl];B[fe];W[hh];
+B[hi];W[fc];B[me];W[gh];B[gg];W[hg];B[lf];W[fg];B[kh];W[kg];B[lg];
+W[ke];B[ff];W[gf];B[de];W[cf];B[bg];W[df];B[ef];W[dg]
+(;B[ge];W[dd];B[ee];W[eh]
+(;B[ml];W[mf];B[md];W[kf];B[mg];W[ch];B[bh];W[dh];B[ci];W[ka];B[em];
+W[fm];B[dm];W[la]
+(;B[mb];W[mh];B[mf];W[hk];B[ij];W[af];B[ik];W[il];B[lm];W[km];B[ih];
+W[ag];B[bi];W[fi];B[fj];W[ah];B[ei];W[ai];B[aj];W[ae];B[bj];W[he];
+B[ig];W[if];B[fh];W[gg];B[fi];W[ja];B[li];W[ma];B[mi];W[bc];B[hm];
+W[im];B[jh];W[mm];B[mk];W[lm];B[hj];;C[W+37.5])
+
+(;B[lm];W[hm])
+
+(;B[hm];W[hl];B[im];W[lm];B[jm];W[il]C[seki
+])
+
+(;B[im];W[hm]
+(;B[hl];W[hk];B[gm];W[il])
+
+(;B[il];W[ik];B[hl];W[hk];B[gm];W[jm])
+)
+
+(;B[ik];W[il];B[hm];W[lm])
+)
+
+(;B[ml];W[ch];B[bh];W[ci];B[bi];W[cj];B[dh];W[dj];B[ei];W[fh];B[ae];
+W[ck];B[cl])
+)
+
+(;B[dh];W[eh];B[cd];W[dd])
+
+)
diff --git a/regression/games/mertin13x13/gnugo-goliath1.W+11.sgf b/regression/games/mertin13x13/gnugo-goliath1.W+11.sgf
new file mode 100644 (file)
index 0000000..cf02bbe
--- /dev/null
@@ -0,0 +1,25 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo 3.0.0]\r
+PW[Goliath 3.5]\r
+DT[2001-09-26]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 1001470423 level 10];B[jd];W[dc];B[dk];W[ce];B[jk];W[hc];B[ch];W[kf]\r
+;B[ie];W[ki];B[ij];W[lk];B[ig];W[ld];B[jh];W[kh];B[fg];W[jb]\r
+;B[fe];W[fc];B[df];W[cf];B[kc];W[cg];B[dg];W[kb];B[lc];W[bh]\r
+;B[ci];W[bi];B[le];W[ke];B[kd];W[lf];B[md];W[dh];B[di];W[bk]\r
+;B[kl];W[jg];B[ll];W[kj];B[ji];W[cl];B[mf];W[mg];B[mk];W[mj]\r
+;B[mi];W[ml];B[lg];W[me];B[dl];W[ld];B[lb];W[mc];B[jc];W[ib]\r
+;B[hd];W[lh];B[cj];W[bj];B[gd];W[gc];B[cm];W[bm];B[dm];W[de]\r
+;B[ee];W[ed];B[ck];W[bl];B[ka];W[if];B[hf];W[jf];B[hg];W[ja]\r
+;B[la];W[mm];B[ic];W[hb];B[lm];W[mk];B[je];W[kk];B[jl];W[tt]\r
+;B[mb];W[md];B[jj];W[tt];B[fd];W[tt];B[tt]\r
+C[W+11.5]\r
+)\r
diff --git a/regression/games/mertin13x13/gnugo-goliath2.W+38.sgf b/regression/games/mertin13x13/gnugo-goliath2.W+38.sgf
new file mode 100644 (file)
index 0000000..762ec75
--- /dev/null
@@ -0,0 +1,66 @@
+(;GM[1]FF[3]
+VW[]AP[Many Faces of Go:10.0]SZ[13]HA[0]ST[1]
+PB[GnuGo 3.0.0]
+PW[Goliath 3.5]
+DT[2001-09-27]
+PC[OS]KM[5.5]RU[Japanese]
+RE[W+38.5]
+AN[Mertin]US[Mertin]
+EV[CGoT]
+GN[GNU Go 3.0.0 Random Seed 1001542052 level 10]
+;B[kd];W[dc];B[cj];W[ce];B[jk];W[ic];B[gc];W[ie];B[jf];W[if];B[jh];
+W[ig];B[ej];W[ge];B[ib];W[jb];B[hi];W[jg];B[lb];W[je];B[cg];W[kh];
+B[gk];W[lc];B[ld];W[kc];B[lf];W[ih];B[jd];W[jc];B[lh];W[md];B[id];
+W[li];B[hd];W[fd];B[fc];W[ed];B[hb];W[mb];B[la];W[ja];B[bf];W[be];
+B[eb];W[db];B[gg];W[lg];B[me];W[kf];B[he];W[hf];B[gf];W[dg];B[df];
+W[cf];B[ef];W[bg];B[mc];W[lk];B[bh];W[ch];B[bi];W[md];B[eh]
+C[ I think B leads by ca. 30 points...];W[mc]C[ ... but ...]
+(;B[ia]C[ ??];W[hc]C[ !];B[gd]C[... and now ...];W[gb]
+C[ W leads by ca. 10 points!];B[fe];W[eg];B[kl];W[fb];B[ec];W[ea];
+B[dd];W[cd];B[ee];W[fg];B[ji];W[fh]
+(;B[gh]C[ ?];W[fi];B[ei];W[ll];B[lm];W[kj];B[gi];W[fj];B[fk];W[ii];
+B[jj];W[ij];B[ag];W[af];B[ah];W[gj]
+(;B[hj]C[ ?];W[ik];B[hk];W[il];B[hl];W[hm];B[gm];W[im];B[de];W[ke];
+B[le]
+(;W[dh];B[di];W[mg];B[ff];W[cg];B[ci];;B[hg];;B[mf];;B[hh];;C[W+38.5])
+
+(;W[ci];B[bj])
+)
+
+(;B[hk];W[ik];B[il];W[hj];B[ff])
+)
+
+(;B[fi]C[ !];W[gh];B[ff];W[gi];B[gj];W[ii];B[ij])
+)
+
+(;B[ga]C[ ?];W[fb];B[ia];W[ea]
+(;B[hc];W[ec];B[ka];W[ke];B[kb];W[ma];B[le];W[mg];B[la];W[mf];B[ka];
+W[gb];B[lb];W[kb];B[la];W[gd])
+
+(;B[ec];W[fa];B[ke];W[mg];B[ka];W[mf];B[kb];W[ma];B[la];W[gd];B[hc];
+W[da];B[ka];W[gb];B[lb];W[kb];B[la];W[le])
+)
+
+(;B[gd]C[ !];W[fe];B[ia]
+(;W[ga];B[fa]
+(;W[gb];B[hc];W[ec];B[ka];W[ke];B[kb];W[ma];B[le];W[mg];B[la];W[mf];
+B[lb];W[da];B[kb];W[ka];B[lb];W[ea];B[kb];W[fb];B[la]C[ ca. B+12])
+
+(;W[ec];B[hc];W[da];B[ka];W[ea];B[kb];W[ma];B[la];W[fb];B[lb];W[ke];
+B[le];W[mg];B[ka];W[kb];B[la];W[ha];B[ka])
+)
+
+(;W[fb];B[fa])
+
+(;W[fa];B[ga]
+(;W[ea];B[fb];W[da];B[hc])
+
+(;W[ec];B[fb])
+)
+
+(;W[hc];B[ga])
+)
+
+(;B[hc];W[ke];B[le];W[ia];B[ha];W[ec])
+
+)
diff --git a/regression/games/mertin13x13/gnugo-goliath3.B+16.sgf b/regression/games/mertin13x13/gnugo-goliath3.B+16.sgf
new file mode 100644 (file)
index 0000000..7ef1bf8
--- /dev/null
@@ -0,0 +1,57 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo 3.0.0]\r
+PW[Goliath 3.5]\r
+DT[2001-09-25]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+16.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 1001420729 level 10];B[kc];W[dc];B[ki];W[ce];B[ck];W[kk];B[ch];W[ek]\r
+;B[ij];W[il];B[kf];W[gc];B[dl];W[el];B[lj];W[lk];B[gi];W[ic]\r
+;B[jb];W[if];B[ga];W[fb];B[ih];W[hb];B[bf];W[cf];B[be];W[cg]\r
+;B[bg];W[dh];B[ci];W[bd];B[ad];W[bc];B[ac];W[ab];B[gk];W[ei]\r
+;B[hl];W[ik];B[gg];W[mk];B[ge];W[ie];B[ef];W[eg];B[kd];W[ff]\r
+;B[ha];W[fa];B[ib];W[hg];B[gf];W[fe];B[im];W[jm];B[hm];W[jl]\r
+;B[hk];W[hh];B[gh];W[hi];B[hj];W[ii];B[ej];W[fj];B[dj]\r
+(;W[gj]\r
+C[ ?]\r
+;B[fi];W[jj];B[fk];W[li];B[lh];W[ji];B[mi];W[jg]\r
+;B[ae];W[bb];B[jh];W[kg];B[lg];W[kh];B[gd];W[fd];B[fh];W[fg]\r
+;B[eh];W[kj];B[li];W[jd];B[je];W[jf];B[ke]\r
+(;W[hd];B[jc];W[gb];B[ia];W[dg];B[di];\r
+C[W pass (?)]\r
+;B[id];W[hc]\r
+;B[he];W[jd];B[mj];;B[id];W[hf];B[jd];;\r
+C[B+16.5]\r
+)\r
+(;W[jc];B[kb];W[hd]\r
+C[B+12.5]\r
+))\r
+(;W[fi];B[gj]\r
+(;W[fk];B[jj]\r
+(;W[gd]\r
+C[ !]\r
+;B[jh];W[ji];B[kj];W[jg];B[kg];W[jc];B[kb];W[lh]\r
+;B[kh];W[mj];B[ig];W[hf];B[lg];W[mi];B[jf];W[je];B[ke]\r
+C[W+1.5]\r
+)\r
+(;W[jh]\r
+C[ ?!]\r
+;B[hd]\r
+C[ !]\r
+;W[kh];B[lh]\r
+(;W[id];B[hc];W[gb];B[jg];W[kg];B[lg];W[ig];B[jf];W[ji]\r
+;B[kj])\r
+(;W[jc];B[id];W[je];B[jd];W[ke];B[le];W[lf];B[lg];W[kg]\r
+;B[mf];W[jf];B[ig])))\r
+(;W[jj]\r
+C[ ?]\r
+;B[fk];W[gd];B[jh]\r
+C[(B+8.5)]\r
+)))\r
diff --git a/regression/games/mertin13x13/gnugo-katsunari1.B+21.sgf b/regression/games/mertin13x13/gnugo-katsunari1.B+21.sgf
new file mode 100644 (file)
index 0000000..df9a720
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+VW[]AP[Many Faces of Go:10.0]SZ[13]HA[0]ST[1]
+PB[GnuGo 3.0.0]
+PW[Katsunari 8.0]
+DT[2001-09-29]
+PC[OS]KM[5.5]RU[Japanese]
+RE[B+21.5]
+US[Mertin]
+EV[CGoT]
+GN[GNU Go 3.0.0 Random Seed 1001725062 level 10]
+;B[jd];W[ck];B[dc];W[kk];B[de];W[hc];B[kg];W[jb];B[kc];W[ch];B[kb];
+W[he];B[jj];W[kj];B[ib];W[be];B[ee];W[jk];B[hg];W[ic];B[eg];W[ja];
+B[gb];W[hb];B[jc];W[gc];B[fb];W[fc];B[eb];W[bc];B[cb];W[ji];B[fh];
+W[fk];B[jh];W[ij];B[gj];W[gk];B[hi];W[ih];B[ig];W[kh];B[jg];W[hj];
+B[lh];W[hh];B[gh];W[ii];B[ej];W[ek];B[fj];W[dj];B[ki];W[ke];B[le];
+W[cd];B[dd];W[ld];B[lf];W[je];B[id];W[kd];B[ie];W[cf];B[lj];W[lk];
+B[mk];W[ml];B[mj];W[df];B[ef];W[hf];B[ll];W[if];B[lb]
+(;W[me];B[jf];W[kl];B[mm];W[bb];B[ba];W[ei];B[fi];W[dh];B[ab];W[ge];
+B[gf];W[ff];B[fe];W[gg];B[fg];W[ia];B[aa];W[gf];B[dg];W[cg];B[ac];
+W[ad];B[ca];W[ga];B[gi];W[da];B[eh];W[di];B[cc];W[bd];B[fa];W[hd];
+B[ha];W[ka];B[la];W[ga];B[lc];W[ib];B[fd];W[mc];B[kf];W[ce];B[md];
+W[km];;W[lm];B[ml];;C[B+21.5])
+
+(;W[jf];B[hd];W[gd];B[ge];W[gf];B[fe];W[lc])
+
+)
diff --git a/regression/games/mertin13x13/gnugo-katsunari2.B+66.sgf b/regression/games/mertin13x13/gnugo-katsunari2.B+66.sgf
new file mode 100644 (file)
index 0000000..2aa0cd2
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+VW[]AP[Many Faces of Go:10.0]SZ[13]HA[0]ST[1]
+PB[GnuGo 3.0.0]
+PW[Katsunari 8.0]
+DT[2001-10-01]
+PC[OS]KM[5.5]RU[Japanese]
+RE[B+66.5]
+US[Mertin]
+EV[CGoT]
+GN[GNU Go 3.0.0 Random Seed 1001753890 level 10]
+;B[kd];W[cd];B[jk];W[cj];B[ec];W[dg];B[hd];W[ki];B[gk];W[kf];B[lj];
+W[ek];B[jh];W[kh];B[if];W[ji];B[ii];W[ih];B[jg];W[ij];B[hi];W[ee];
+B[fd];W[ik];B[jj];W[im];B[kg];W[lg];B[il];W[jl];B[hl];W[gj];B[fj];
+W[gi];B[hj];W[hh];B[hk];W[fk];B[cb];W[kl];B[bc];W[bd]
+(;B[ic];W[jf];B[ig];W[gh];B[lc];W[gf];B[ie];W[cc];B[bb];W[dc];B[db];
+W[kk];B[kj];W[lh];B[jm];W[ll];B[ml];W[gm];B[fl];W[el];B[fm];W[em];
+B[gl];W[gd];B[fe];W[ff];B[ge];W[ed];B[fc];W[ac];B[ab];W[hf]C[?];B[ad];
+W[ae];B[be];W[bf];B[ce];W[ac];B[ej]C[ !];W[de]C[ ??];B[dk];W[ck];B[dm]
+;W[cl];B[dl];W[cm];B[dj];W[ad];B[eh];W[ei];B[di];W[ci];B[fi];W[cf];
+B[eg];W[ef];B[dh];W[ch];B[hg];W[fh];B[gg];W[fg];B[he];W[kb];;W[jd];
+B[le];W[je];B[lf];W[jc];;W[mk];B[lk];W[mm];;W[mj];;W[mi];B[mf];;
+C[ B+66.5])
+
+(;B[fi]C[ !?];W[gh];B[fh];W[hf];B[gf];W[hg];B[ie];W[fg])
+
+)
diff --git a/regression/games/mertin13x13/gnugo-katsunari3.B+13.sgf b/regression/games/mertin13x13/gnugo-katsunari3.B+13.sgf
new file mode 100644 (file)
index 0000000..d95c236
--- /dev/null
@@ -0,0 +1,66 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[GnuGo 3.0.0]\r
+PW[Katsunari 8.0]\r
+DT[2001-10-04]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+13.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 1001893616 level 10];B[kc];W[cd];B[dj];W[jk];B[ji];W[jg];B[ec];W[ke]\r
+;B[de];W[jd];B[ce];W[gk];B[jc];W[dl];B[fe];W[fi];B[dh];W[ei]\r
+;B[di];W[eh];B[kh];W[dg];B[cg];W[cf];B[df];W[eg];B[kj];W[kk]\r
+;B[lf];W[le];B[ck];W[bf];B[be];W[bg];B[ch];W[hh];B[cl];W[id]\r
+;B[ic];W[hd];B[el];W[mb];B[hc];W[gc];B[gb];W[fd];B[ed];W[fb]\r
+;B[fc];W[gd];B[hb];W[bd];B[ad];W[fl];B[em];W[ek];B[dk];W[ef]\r
+;B[ee];W[ac];B[ae];W[bb];B[cc];W[cb];B[db];W[ij];B[kg];W[lj]\r
+;B[li];W[jj];B[lk];W[mj];B[mi];W[ki]\r
+(;B[lb]\r
+C[ ?]\r
+;W[kj];B[mc]\r
+(;W[aa]\r
+C[ (?)]\r
+\r
+(;B[ca]\r
+C[ (?)]\r
+;W[gf]\r
+C[ ?]\r
+;B[lh];W[mg]\r
+(;B[mf];W[me];B[ge];W[he];B[ej];W[fm];B[fk]\r
+(;W[gl]\r
+C[ ?]\r
+;B[fj];W[ff]\r
+C[ (?)]\r
+;B[gj];W[hj];B[gi];W[ld]\r
+C[ ??]\r
+;B[gh];W[kf]\r
+C[ ?????]\r
+\r
+;B[gg];W[hg];B[hi];W[ii];B[lc];W[kd];B[md];;B[fg];\r
+;B[fh];W[hf];;;\r
+C[ B+13.5]\r
+)\r
+(;W[fj]\r
+C[ -> B+1.5]\r
+\r
+(;B[ek];W[gl];B[ff];W[fg]\r
+C[ B+1.5]\r
+)\r
+(;B[gl];W[ek];B[ff];W[dm];B[gg];W[hf];B[fg];W[hg];B[gh]\r
+;W[gi];B[cm])))\r
+(;B[me]\r
+C[ (?)]\r
+;W[mf];B[md];W[kf]\r
+(;B[lg];W[jh];B[mh];W[mf])\r
+(;B[mh];W[jh])\r
+(;B[jh];W[lg];B[ig];W[ge])))\r
+(;B[me]))\r
+(;W[ld]))\r
+(;B[ld]\r
+C[ !]\r
+;W[kj];B[me];W[lh]))\r
diff --git a/regression/games/mertin13x13/gointellect-gnugo1.B+14.sgf b/regression/games/mertin13x13/gointellect-gnugo1.B+14.sgf
new file mode 100644 (file)
index 0000000..5ed7001
--- /dev/null
@@ -0,0 +1,30 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Intellect 10.0]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RE[B+14.5]\r
+US[Mertin]\r
+EV[CGoT]RL[1]HD[0];B[jd]\r
+C[(preset - vorgegeben)]\r
+;W[ck];B[cd]EL[-5]MD[0];W[kk];B[ec]EL[-4]MD[2122];W[kf];B[ci]EL[-5]MD[9122];W[ej]\r
+;B[dk]EL[-2]MD[6062];W[dj];B[cj]EL[-7]MD[5052];W[ek];B[bk]EL[-9]MD[1062];W[cl];B[bl]EL[-14]MD[1052];W[dl];B[if]EL[5]MD[9122];W[jh]\r
+;B[dh]EL[-1]MD[6102];W[gi];B[jg]EL[13]MD[10123];W[kg];B[kc]EL[12]MD[6122];W[hk];B[gg]EL[22]MD[1072];W[eh];B[jj]EL[30]MD[3052];W[ef]\r
+;B[dg]EL[24]MD[5082];W[hh];B[kh]EL[22]MD[2052];W[ji];B[ki]EL[22]MD[2052];W[kj];B[eg]EL[22]MD[2042];W[ld];B[fh]EL[25]MD[3032];W[lc]\r
+;B[lb]EL[18]MD[3042];W[mb];B[kb]EL[26]MD[1042];W[bm];B[lg]EL[29]MD[2022];W[lf];B[lj]EL[43]MD[1032];W[lh];B[li]EL[31]MD[1032];W[lk]\r
+;B[ij]EL[32]MD[1032];W[ii];B[mh]EL[28]MD[2042];W[mj];B[le]EL[21]MD[2042];W[ke];B[ig]EL[17]MD[3042];W[hj];B[mk]EL[6]MD[1022];W[ml]\r
+;B[ei]EL[7]MD[600];W[al];B[bj]EL[-6]MD[1022];W[am];B[ih]EL[6]MD[2082];W[hi];B[hg]EL[4]MD[1041];W[la];B[ka]EL[7]MD[5061]\r
+(;W[mk]\r
+C[ ?]\r
+;B[ak]EL[13]MD[1041];W[cm];B[fi]EL[13]MD[1031];W[fj];B[je]EL[13]MD[1031];W[mf];B[kd]EL[15]MD[2061];W[mc]\r
+;B[ma]EL[14]MD[600];W[me];B[la]EL[12]MD[2061];W[gh];B[di]EL[13]MD[2041];W[jf];B[ce]EL[12]MD[1021];\r
+C[B+14.5]\r
+)\r
+(;W[je];B[ie];W[fi]\r
+C[B+10.5]\r
+))\r
diff --git a/regression/games/mertin13x13/gointellect-gnugo2.W+8.sgf b/regression/games/mertin13x13/gointellect-gnugo2.W+8.sgf
new file mode 100644 (file)
index 0000000..d3ef5f5
--- /dev/null
@@ -0,0 +1,39 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Intellect 10.0]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+8.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 999741439 level 10]RL[1]HD[0];B[kd]EL[0]MD[0];W[cj];B[cd]EL[1]MD[0];W[kk];B[ic]EL[-1]MD[2122];W[ej];B[dc]EL[5]MD[8122];W[cf]\r
+;B[kh]EL[3]MD[4072];W[hj];B[jj]EL[2]MD[1042];W[jk];B[ij]EL[5]MD[2042];W[ik];B[kj]EL[0]MD[1032];W[be];B[hi]EL[3]MD[2042];W[gj]\r
+;B[de]EL[6]MD[1042];W[eg];B[ff]EL[7]MD[1042];W[gg];B[fg]EL[15]MD[1042];W[fh];B[gh]EL[11]MD[1042];W[bc];B[bd]EL[13]MD[2042];W[ad]\r
+;B[eh]EL[10]MD[4042];W[fi];B[dg]EL[20]MD[1042];W[cg];B[hg]EL[13]MD[1032];W[cb];B[db]EL[12]MD[2032];W[ci];B[df]EL[10]MD[1022];W[lj]\r
+;B[li]EL[4]MD[600];W[lk];B[dh]EL[10]MD[1042];W[da];B[ea]EL[12]MD[1032];W[ca];B[eb]EL[11]MD[1032];W[mi];B[mh]EL[14]MD[1022];W[mj]\r
+;B[ch]EL[14]MD[600];W[bh];B[dl]EL[9]MD[4042];W[fl];B[ck]EL[15]MD[1042];W[bk];B[bl]EL[16]MD[1042];W[bj];B[al]EL[20]MD[2042];W[cm]\r
+;B[cl]EL[14]MD[600];W[dm];B[em]EL[27]MD[600];W[el];B[bm]EL[27]MD[600];W[dm];B[cm]EL[20]MD[600];W[di];B[cc]EL[12]MD[4041];W[bb]\r
+;B[ac]EL[12]MD[600];W[ab];B[ce]EL[16]MD[4041];W[ae];B[gi]EL[7]MD[1032];W[mg];B[lh]EL[6]MD[600];W[ii];B[hh]EL[-1]MD[1022];W[jh]\r
+(;B[kg]EL[-3]MD[2042];W[jg];B[kf]EL[-6]MD[2042];W[ki];B[af]EL[-5]MD[4042];W[bg];B[jf]EL[-10]MD[1032];W[ei];B[ih]EL[-4]MD[1021]\r
+;W[ji];B[ig];W[tt];B[ie];W[tt];B[tt]\r
+C[W+8.5]\r
+)\r
+(;B[ih]\r
+C[ ?]\r
+;W[ji];B[ki];W[jg];B[lg];W[lf];B[mf];W[kg])\r
+(;B[ki]\r
+C[ ?]\r
+;W[kg]\r
+(;B[jg])\r
+(;B[lg];W[lf];B[mf];W[ji]))\r
+(;B[jg]\r
+C[ !]\r
+;W[ig];B[if];W[hf];B[gf];W[ki];B[ih];W[ji];B[kg]\r
+C[W+4.5]\r
+))\r
diff --git a/regression/games/mertin13x13/gointellect-gnugo3.B+1.sgf b/regression/games/mertin13x13/gointellect-gnugo3.B+1.sgf
new file mode 100644 (file)
index 0000000..e39a533
--- /dev/null
@@ -0,0 +1,56 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:11.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Go Intellect 10.0]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+1.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT]RL[1]HD[0];B[kc]\r
+C[(preset - vorgegeben)]\r
+;W[cc];B[kj]EL[1]MD[0];W[dj];B[fk]EL[3]MD[1102];W[hd];B[ck]EL[7]MD[1082];W[cj]\r
+;B[dk]EL[0]MD[1072];W[df];B[jf]EL[0]MD[9092];W[ik];B[jk]EL[10]MD[7112];W[gl];B[bj]EL[15]MD[7113];W[hj];B[hf]EL[36]MD[9122];W[jj]\r
+;B[jl]EL[30]MD[1122];W[gi];B[ji]EL[31]MD[2123];W[bi];B[bk]EL[23]MD[2123];W[fd];B[dh]EL[30]MD[9092];W[fg];B[ci]EL[23]MD[1082];W[ei]\r
+;B[bh]EL[28]MD[1042];W[ij];B[eh]EL[25]MD[8102];W[ki];B[ih]EL[24]MD[3122];W[kk];B[ll]EL[14]MD[12122];W[lj];B[kl]EL[-3]MD[1102];W[fh]\r
+;B[lk]EL[15]MD[1072];W[il];B[ej]EL[3]MD[6072];W[kj];B[jm]EL[-16]MD[2042];W[lm];B[dd]EL[-14]MD[2022];W[dc];B[fl]EL[-13]MD[6122];W[mk]\r
+;B[ic]EL[-6]MD[8102];W[cd];B[id]EL[1]MD[2082];W[hc];B[hb]EL[-1]MD[2052];W[gb];B[ib]EL[-5]MD[1032];W[bf];B[ga]EL[-1]MD[4042];W[fb]\r
+;B[fj]EL[-1]MD[4052];W[lg];B[lf]EL[-3]MD[4052];W[fi];B[di]EL[-6]MD[1042];W[kg];B[kf]EL[-10]MD[2054];W[ml]\r
+C[ (?)]\r
+;B[fa]EL[-11]MD[1062];W[ea]\r
+;B[ha]EL[-11]MD[600];W[eb];B[mg]EL[-9]MD[1111];W[mh];B[mf]EL[-9]MD[600];W[lh]\r
+C[ (?)]\r
+;B[gk]EL[-8]MD[1121];W[jh];B[jg]EL[-9]MD[9092]\r
+(;W[kh]\r
+C[ ?]\r
+;B[hl]EL[-2]MD[1072];W[im];B[hm]EL[-2]MD[1121];W[hh];B[hg]EL[-6]MD[1022];W[ii];B[ig]EL[-4]MD[600];W[he]\r
+;B[ie]EL[-7]MD[1031];W[gf];B[ag]EL[-7]MD[3081];W[af];B[cg]\r
+C[ W+6.5]\r
+EL[-6]MD[3031]\r
+(;W[gg];B[cf]EL[-2]MD[1061]\r
+(;W[be]\r
+C[ ???]\r
+;B[de]\r
+C[ B+1.5]\r
+EL[-1]MD[1041];W[ef];B[ce]EL[-1]MD[600]\r
+(;W[bg];B[ah]EL[-1]MD[600];W[bd];B[ee]EL[0]MD[1061];W[fe];B[ed]EL[1]MD[2071];W[ec];B[dg]EL[0]MD[600];W[eg]\r
+;B[hk]EL[1]MD[1031];W[gj];\r
+C[B+1.5]\r
+)\r
+(;W[ed]\r
+C[ ( -> B+1.5)]\r
+;B[bg];W[bd];B[ee];W[fe];B[eg];W[hk];B[gm]\r
+C[B+1.5]\r
+))\r
+(;W[ce]\r
+C[ !  (W+6.5)]\r
+))\r
+(;W[cf]))\r
+(;W[ii]\r
+C[ !]\r
+))\r
diff --git a/regression/games/mertin13x13/goliath-gnugo1.B+11.sgf b/regression/games/mertin13x13/goliath-gnugo1.B+11.sgf
new file mode 100644 (file)
index 0000000..bd6b123
--- /dev/null
@@ -0,0 +1,25 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[1]\r
+ST[1]\r
+PB[Goliath 3.5]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-20]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[B+11.5]\r
+US[Mertin]\r
+EV[CGoT];B[jj];W[dd];B[dk];W[jc];B[ci];W[kh];B[cf];W[je]\r
+;B[ef];W[fd];B[bd];W[cc];B[bc];W[he];B[hg];W[hk];B[ii];W[jl]\r
+;B[kl];W[kk];B[jk];W[kj];B[il];W[ff];B[fg];W[ll];B[jm];W[bb]\r
+;B[gf];W[jg];B[ab];W[ba];B[cd];W[cb];B[de];W[ji];B[ed];W[ij]\r
+;B[hl];W[ih];B[hi];W[hh];B[hj];W[gi];B[gj];W[gh];B[fe];W[dc]\r
+;B[ec];W[eb];B[fc];W[fb];B[gd];W[fj];B[gk];W[fk];B[gl];W[el]\r
+;B[dl];W[hd];B[gb];W[da];B[fi];W[fh];B[ei];W[hc];B[gc];W[hb]\r
+;B[ga];W[ha];B[eh];W[lm];B[hf];W[ig];B[if];W[km];B[jl];W[jf]\r
+;B[ie];W[id];B[fa];W[ea];B[ac];W[ge];B[gg];W[aa];B[tt];W[tt]\r
+;B[tt]\r
+C[B+11.5]\r
+)\r
diff --git a/regression/games/mertin13x13/goliath-gnugo2.W+9.sgf b/regression/games/mertin13x13/goliath-gnugo2.W+9.sgf
new file mode 100644 (file)
index 0000000..ce39dc6
--- /dev/null
@@ -0,0 +1,45 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Goliath 3.5]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 1001251230 level 10];B[kd];W[dd];B[fd];W[ck];B[jk];W[df];B[dc];W[cc]\r
+;B[ec];W[cb];B[ek];W[di];B[gj];W[ji];B[kg];W[ih];B[gh];W[hg]\r
+;B[gg];W[if];B[ge];W[kj];B[kk];W[kf];B[lf];W[jg];B[kh];W[id]\r
+;B[jc];W[ic];B[ke];W[lj]\r
+(;B[hk]\r
+C[?]\r
+;W[jf];B[ib];W[lh];B[lg];W[lk]\r
+(;B[hc]\r
+C[ ?]\r
+;W[kl];B[mh];W[dl];B[el];W[fa];B[gb];W[il];B[jl]\r
+;W[ik];B[ll];W[ml]\r
+(;B[ij];W[lm];B[hl];W[jm];B[im];W[eh];B[eb];W[ea];B[ki]\r
+;W[jj];B[km];W[ll];B[jh];W[ii]\r
+(;B[li];W[mj];B[fb];W[db];B[hi];W[em];B[fm];W[dm]\r
+(;B[fl]\r
+C[?]\r
+;W[dj];B[ej];W[hd];B[gd];W[ga];B[ha];W[da];B[ee]\r
+;W[de];B[ef];W[eg];B[fg];W[je];B[hf];W[he];B[gf];W[jd];B[hh]\r
+;W[ig];B[fh];W[ei];B[fi];W[jm];B[dk];W[cl];;W[km];\r
+;W[kc];B[jb];W[ed];;W[mi];;\r
+C[ W+9.5]\r
+)\r
+(;B[dk];W[bl];B[dj];W[cj];B[ei]))\r
+(;B[mj]\r
+C[ (?!)]\r
+;W[li];B[mi];W[hf];B[hh];W[mk];B[le];W[mg];B[mh]\r
+;W[mi]))\r
+(;B[km]\r
+C[ ?]\r
+;W[ij]))\r
+(;B[ll];W[hb];B[jb];W[fa];B[gb];W[ga];B[hc]))\r
+(;B[lk]))\r
diff --git a/regression/games/mertin13x13/goliath-gnugo3.W+0.sgf b/regression/games/mertin13x13/goliath-gnugo3.W+0.sgf
new file mode 100644 (file)
index 0000000..d9cbfad
--- /dev/null
@@ -0,0 +1,86 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Goliath 3.5]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-23]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+0.5]\r
+AN[Mertin]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 1001274836 level 10];B[kc]\r
+C[ (preset - vorgegeben)]\r
+;W[cd];B[ec];W[kk];B[cc];W[ck];B[dd];W[ce]\r
+;B[bc];W[jd];B[jc];W[id];B[hb];W[cg];B[ef];W[le];B[hk];W[ci]\r
+;B[eh];W[fk];B[gh];W[ig];B[ii];W[kh];B[ej];W[fl];B[hl];W[ge]\r
+;B[jl];W[kj];B[kl];W[ll];B[fj];W[bd];B[ad];W[ae];B[ac];W[af]\r
+C[ (?)]\r
+\r
+;B[ld];W[kd];B[lc];W[jk];B[me];W[lf];B[mf];W[mg];B[md];W[ij]\r
+C[(?)]\r
+\r
+;B[hj]\r
+C[(?)]\r
+;W[ji]\r
+C[ ?]\r
+\r
+(;B[ih]\r
+C[ ?]\r
+;W[lg];B[hg];W[if];B[lm];W[ml];B[df]\r
+(;W[ik]\r
+C[ ?]\r
+;B[il];W[ic];B[ib];W[gl]\r
+C[ ?]\r
+;B[cf]\r
+(;W[bg]\r
+C[ !]\r
+;B[hf]\r
+C[ (?)]\r
+;W[he];B[dg];W[bf];B[dh];W[jh];B[di]\r
+(;W[be]\r
+C[ ???]\r
+;B[ch]\r
+(;W[bi]\r
+(;B[fg]\r
+C[ ???]\r
+;W[bh]\r
+(;B[gk];W[dk];B[ek];W[el];B[dj];W[gf];B[hc];W[gg];B[hh]\r
+;W[gm]\r
+(;B[hm];W[cj];B[gd];W[de];B[ee];W[fe];B[fd];W[hd];B[km]\r
+;W[ff];;W[lk];;W[mm];;\r
+C[ W+0.5]\r
+)\r
+(;B[cj];W[bj];B[gd];W[fd];B[fc];W[hd];B[gc];W[hm];B[im]\r
+;W[ee];B[de];W[fe];B[ed];W[ff];B[km];W[lk]\r
+C[W+3.5]\r
+))\r
+(;B[dk];W[dl];B[gd];W[gc];B[hc];W[fd];B[hd];W[fe];B[fc]\r
+;W[ek];B[dj];W[cj];B[gk];W[gf];B[gg];W[hi];B[hh];W[km];B[jm]\r
+;W[hm];B[de]\r
+C[W+2.5]\r
+))\r
+(;B[bh]\r
+C[ !]\r
+;W[ah];B[de]))\r
+(;W[bh]\r
+(;B[cj]\r
+C[ !]\r
+\r
+(;W[bi];B[bj])\r
+(;W[bj];B[bi];W[ai];B[ci];W[bk];B[ah]))\r
+(;B[bi]\r
+C[ ?]\r
+;W[cj])))\r
+(;W[ch]))\r
+(;W[bf]\r
+C[ ?]\r
+;B[de];W[bg];B[be]))\r
+(;W[cf]))\r
+(;B[lg]\r
+C[ !]\r
+;W[kg];B[mh];W[li];B[mi];W[mj];B[ih]))\r
diff --git a/regression/games/mertin13x13/katsunari-gnugo1.W+45.sgf b/regression/games/mertin13x13/katsunari-gnugo1.W+45.sgf
new file mode 100644 (file)
index 0000000..31ac689
--- /dev/null
@@ -0,0 +1,57 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Katsunari 8.0]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-28]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+45.5]\r
+US[Mertin]\r
+EV[CGoT]\r
+GN[GNU Go 3.0.0 Random Seed 1001668970 level 10];B[jd];W[dd];B[cj];W[jk];B[gc];W[cg];B[db];W[kh]\r
+;B[kf];W[kc];B[jc];W[jb];B[kd];W[lb];B[ib];W[ld];B[ej];W[gk]\r
+;B[df];W[ce];B[cf];W[bf];B[dg];W[bh];B[bi];W[cb];B[eb];W[bd]\r
+;B[ch];W[ee];B[fd];W[cc];B[bg];W[ag];B[le];W[ka];B[ji];W[ki]\r
+;B[jj]\r
+(;W[kj];B[gi];W[ah];B[ik];W[il];B[kk];W[jl];B[kl];W[ll]\r
+;B[lk];W[km];B[hl];W[hk];B[jm];W[im];B[ij];W[gl];B[ml];W[lm]\r
+;B[md];W[lc];B[jh];W[ff];B[kg];W[mh];B[lh];W[lj];B[li];W[mk]\r
+;B[mi];W[hf];B[de];W[ed];B[fe];W[eg];B[eh];W[ef];B[gf];W[gg]\r
+;B[ge];W[ig];B[ia];W[ja];B[mc];W[mb];B[el];W[jg];B[hj];W[me]\r
+;B[mf];W[gj];B[hi];W[gh];B[fh];W[fg];B[cg];W[fj];B[fi];W[ek]\r
+;B[dk];W[fl];B[ca];W[dl];B[em];W[cl];B[fk];W[bk];B[ek];W[di]\r
+(;B[bm]\r
+C[ ?]\r
+\r
+(;W[ba]\r
+C[ ?]\r
+;B[ec];W[da];B[ea];W[he];B[hd];W[md];B[lg];W[am]\r
+;B[al];W[ci]\r
+C[ (!)]\r
+;B[bj];W[dh];B[ak];W[ei];B[fm];W[hm];B[gm];W[hl]\r
+;B[mj];W[lk];B[if];W[ie];B[jf];W[ai];B[aj];W[id];B[ic];W[je]\r
+;B[ke];W[hg];B[dj];W[ca];B[dc];;;\r
+C[ W+45.5]\r
+)\r
+(;W[ci]\r
+C[ !]\r
+\r
+(;B[dh];W[bj])\r
+(;B[ai];W[dh])))\r
+(;B[ai];W[bm];B[al]\r
+(;W[dm];B[ak];W[af];B[ci];W[bj];B[ck];W[bl];B[aj]\r
+C[B+5.5]\r
+)\r
+(;W[bj];B[dm];W[af];B[ci];W[aj];B[ih])))\r
+(;W[kj];B[gh];W[ah];B[ik];W[il];B[kk];W[jl];B[kl];W[ll]\r
+;B[lk];W[km];B[hl]\r
+(;W[lj])\r
+(;W[hk];B[jm];W[im]\r
+(;B[hm];W[ij])\r
+(;B[ij]\r
+(;B[hm])\r
+(;W[gl])))))\r
diff --git a/regression/games/mertin13x13/katsunari-gnugo2.W+4.sgf b/regression/games/mertin13x13/katsunari-gnugo2.W+4.sgf
new file mode 100644 (file)
index 0000000..d58fd75
--- /dev/null
@@ -0,0 +1,393 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[13]\r
+HA[0]\r
+ST[1]\r
+PB[Katsunari 8.0]\r
+PW[GnuGo 3.0.0]\r
+DT[2001-09-27]\r
+PC[OS]\r
+KM[5.5]\r
+RU[Japanese]\r
+RE[W+4.5]\r
+US[Mertin]\r
+EV[CGoT];B[kd]\r
+C[   1 b 11  4]\r
+;W[jj]\r
+C[   2 w 10 10]\r
+;B[cj]\r
+C[   3 b  3 10]\r
+;W[ec]\r
+C[   4 w  5  3]\r
+;B[cc]\r
+C[   5 b  3  3]\r
+;W[hc]\r
+C[   6 w  8  3]\r
+;B[kg]\r
+C[   7 b 11  7]\r
+;W[ki]\r
+C[   8 w 11  9]\r
+\r
+;B[hk]\r
+C[   9 b  8 11]\r
+;W[de]\r
+C[  10 w  4  5]\r
+;B[dd]\r
+C[  11 b  4  4]\r
+;W[il]\r
+C[  12 w  9 12]\r
+;B[ed]\r
+C[  13 b  5  4]\r
+;W[fd]\r
+C[  14 w  6  4]\r
+;B[ik]\r
+C[  15 b  9 11]\r
+;W[jk]\r
+C[  16 w 10 11]\r
+;B[eb]\r
+C[  17 b  5  2]\r
+;W[ee]\r
+C[  18 w  5  5]\r
+\r
+;B[fc]\r
+C[  19 b  6  3]\r
+;W[ej]\r
+C[  20 w  5 10]\r
+;B[dh]\r
+C[  21 b  4  8]\r
+;W[hi]\r
+C[  22 w  8  9]\r
+;B[jc]\r
+C[  23 b 10  3]\r
+;W[dk]\r
+C[  24 w  4 11]\r
+;B[bk]\r
+C[  25 b  2 11]\r
+;W[ge]\r
+C[  26 w  7  5]\r
+;B[fh]\r
+C[  27 b  6  8]\r
+;W[gi]\r
+C[  28 w  7  9]\r
+\r
+;B[fi]\r
+C[  29 b  6  9]\r
+;W[fj]\r
+C[  30 w  6 10]\r
+;B[lh]\r
+C[  31 b 12  8]\r
+;W[gc]\r
+C[  32 w  7  3]\r
+;B[dc]\r
+C[  33 b  4  3]\r
+;W[li]\r
+C[  34 w 12  9]\r
+;B[mi]\r
+C[  35 b 13  9]\r
+;W[mj]\r
+C[  36 w 13 10]\r
+;B[hl]\r
+C[  37 b  8 12]\r
+;W[jl]\r
+C[  38 w 10 12]\r
+\r
+;B[gh]\r
+C[  39 b  7  8]\r
+;W[cl]\r
+C[  40 w  3 12]\r
+;B[hh]\r
+C[  41 b  8  8]\r
+;W[ib]\r
+C[  42 w  9  2]\r
+;B[gj]\r
+C[  43 b  7 10]\r
+\r
+(;W[el]\r
+C[  44 w  5 12\r
+ ??]\r
+;B[ii]\r
+C[  45 b  9  9\r
+ !]\r
+;W[dm]\r
+C[  46 w  4 13\r
+ (?)]\r
+;B[jh]\r
+C[  47 b 10  8]\r
+;W[kb]\r
+C[  48 w 11  2]\r
+;B[jb]\r
+C[  49 b 10  2]\r
+;W[ja]\r
+C[  50 w 10  1]\r
+;B[ce]\r
+C[  51 b  3  5]\r
+;W[lc]\r
+C[  52 w 12  3]\r
+\r
+;B[ld]\r
+C[  53 b 12  4]\r
+;W[mh]\r
+C[  54 w 13  8]\r
+;B[kc]\r
+C[  55 b 11  3]\r
+;W[lb]\r
+C[  56 w 12  2]\r
+;B[kh]\r
+C[  57 b 11  8]\r
+;W[ie]\r
+C[  58 w  9  5]\r
+;B[id]\r
+C[  59 b  9  4]\r
+;W[cf]\r
+C[  60 w  3  6]\r
+;B[ig]\r
+C[  61 b  9  7]\r
+;W[eg]\r
+C[  62 w  5  7]\r
+\r
+;B[hd]\r
+C[  63 b  8  4]\r
+;W[gd]\r
+C[  64 w  7  4]\r
+;B[cg]\r
+C[  65 b  3  7]\r
+;W[bf]\r
+C[  66 w  2  6]\r
+;B[he]\r
+C[  67 b  8  5]\r
+\r
+(;W[mg]\r
+C[  68 w 13  7]\r
+;B[je]\r
+C[  69 b 10  5]\r
+;W[be]\r
+C[  70 w  2  5]\r
+;B[gb]\r
+C[  71 b  7  2]\r
+;W[cd]\r
+C[  72 w  3  4]\r
+;B[hf]\r
+C[  73 b  8  6]\r
+;W[bc]\r
+C[  74 w  2  3]\r
+;B[lk]\r
+C[  75 b 12 11]\r
+;W[ll]\r
+C[  76 w 12 12]\r
+\r
+;B[ff]\r
+C[  77 b  6  6]\r
+;W[gf]\r
+C[  78 w  7  6]\r
+;B[fg]\r
+C[  79 b  6  7]\r
+;W[fe]\r
+C[  80 w  6  5]\r
+;B[bb]\r
+C[  81 b  2  2]\r
+;W[dg]\r
+C[  82 w  4  7]\r
+\r
+(;B[ef]\r
+C[  83 b  5  6\r
+ ?]\r
+;W[ch]\r
+C[  84 w  3  8]\r
+;B[di]\r
+C[  85 b  4  9]\r
+;W[bi]\r
+C[  86 w  2  9]\r
+;B[df]\r
+C[  87 b  4  6]\r
+;W[bg]\r
+C[  88 w  2  7]\r
+;B[hb]\r
+C[  89 b  8  2]\r
+;W[ic]\r
+C[  90 w  9  3]\r
+\r
+(;B[ij]\r
+C[  91 b  9 10\r
+ ?]\r
+;W[ab]\r
+C[  92 w  1  2]\r
+;B[cb]\r
+C[  93 b  3  2]\r
+;W[bj]\r
+C[  94 w  2 10]\r
+;B[ck]\r
+C[  95 b  3 11]\r
+;W[md]\r
+C[  96 w 13  4]\r
+;B[me]\r
+C[  97 b 13  5]\r
+;W[mc]\r
+C[  98 w 13  3]\r
+;B[lf]\r
+C[  99 b 12  6]\r
+\r
+;W[ak]\r
+C[ 100 w  1 11]\r
+;B[bl]\r
+C[ 101 b  2 12]\r
+;W[fk]\r
+C[ 102 w  6 11]\r
+;B[dj]\r
+C[ 103 b  4 10]\r
+;W[gg]\r
+C[ 104 w  7  7]\r
+;B[mf]\r
+C[ 105 b 13  6]\r
+;W[al]\r
+C[ 106 w  1 12]\r
+;B[ka]\r
+C[ 107 b 11  1\r
+ (?)]\r
+;W[la]\r
+C[ 108 w 12  1]\r
+\r
+(;B[ia]\r
+C[ 109 b  9  1\r
+ ?]\r
+;W[ha]\r
+C[ 110 w  8  1]\r
+;B[ga]\r
+C[ 111 b  7  1]\r
+;W[ia]\r
+C[ 112 w  9  1]\r
+;B[bm]\r
+C[ 113 b  2 13]\r
+;W[cm]\r
+C[ 114 w  3 13]\r
+\r
+(;B[im]\r
+C[ 115 b  9 13]\r
+;W[ba]\r
+C[ 116 w  2  1]\r
+;B[ca]\r
+C[ 117 b  3  1]\r
+;W[jm]\r
+C[ 118 w 10 13]\r
+;B[hm]\r
+C[ 119 b  8 13]\r
+;W[ei]\r
+C[ 120 w  5  9]\r
+;B[eh]\r
+C[ 121 b  5  8]\r
+;W[em]\r
+C[ 122 w  5 13]\r
+;B[lg]\r
+C[ 123 b 12  7]\r
+\r
+;W[mi]\r
+C[ 124 w 13  9]\r
+;B[ji]\r
+C[ 125 b 10  9]\r
+;W[cg]\r
+C[ 126 w  3  7]\r
+;B[mk]\r
+C[ 127 b 13 11]\r
+;W[kj]\r
+C[ 128 w 11 10]\r
+;B[lm]\r
+C[ 129 b 12 13]\r
+;W[km]\r
+C[ 130 w 11 13]\r
+;B[ml]\r
+C[ 131 b 13 12]\r
+;W[mm]\r
+C[ 132 w 13 13]\r
+;B[hg]\r
+C[ 133 b  8  7]\r
+\r
+(;W[lm]\r
+C[ 134 w 12 13]\r
+;B[kk]\r
+C[ 135 b 11 11\r
+ seki]\r
+;W[ci]\r
+C[ 136 w  3  9]\r
+\r
+(;B[tt]\r
+C[ 137 b  0  0\r
+ pass (?)]\r
+;W[gk]\r
+C[ 138 w  7 11]\r
+;B[tt]\r
+C[ 139 b  0  0]\r
+;W[gl]\r
+C[ 140 w  7 12]\r
+;B[gm]\r
+C[ 141 b  7 13]\r
+;W[fm]\r
+C[ 142 w  6 13]\r
+;B[tt]\r
+C[ 143 b  0  0]\r
+;W[ac]\r
+C[ 144 w  1  3]\r
+;B[aa]\r
+C[ 145 b  1  1]\r
+\r
+;W[ea]\r
+C[ 146 w  5  1]\r
+;B[fb]\r
+C[ 147 b  6  2]\r
+;W[ba]\r
+C[ 148 w  2  1]\r
+;B[tt]\r
+C[ 149 b  0  0]\r
+;W[aa]\r
+C[ 150 w  1  1]\r
+;B[tt]\r
+C[ 151 b  0  0]\r
+;W[aj]\r
+C[ 152 w  1 10]\r
+;B[tt]\r
+C[ 153 b  0  0]\r
+;W[am]\r
+C[ 154 w  1 13]\r
+;B[tt]\r
+C[ 155 b  0  0]\r
+\r
+;W[tt]\r
+C[ 156 w  0  0\r
+ W+4.5]\r
+)\r
+(;B[gl]\r
+C[ !]\r
+;W[fl]\r
+C[ W+2.5]\r
+))\r
+(;W[kk]\r
+C[ ?]\r
+;B[lm];W[ea]\r
+(;B[kl]\r
+C[ ?]\r
+;W[fb];B[lj];W[fa]\r
+C[W+6.5]\r
+)\r
+(;B[fb]\r
+C[ !]\r
+;W[mm];B[fl]\r
+(;W[lj];B[gk]\r
+C[B+15.5]\r
+)\r
+(;W[gl];B[lm]\r
+(;W[ke];B[kl];W[le];B[lj];W[jd];B[jf]\r
+C[B+12.5]\r
+)\r
+(;W[db];B[kl];W[da];B[fa];W[ll];B[gk];W[fm];B[kl])))))\r
+(;B[gl]))\r
+(;B[ha]\r
+C[ !]\r
+;W[ia]))\r
+(;B[ac])\r
+(;B[bl]))\r
+(;B[ch]))\r
+(;W[mf]\r
+C[ !?]\r
+))\r
+(;W[hj];B[gk];W[ih];B[el];W[dl];B[fl];W[gm]\r
+(;B[bl];W[hm];B[dj];W[ek];B[cm];W[dm];B[bm];W[gl];B[ck]\r
+;W[fk];B[ei];W[ij])\r
+(;B[dj];W[ek])))\r
diff --git a/regression/games/mertin13x13/katsunari-gnugo3.B+14.sgf b/regression/games/mertin13x13/katsunari-gnugo3.B+14.sgf
new file mode 100644 (file)
index 0000000..45cc043
--- /dev/null
@@ -0,0 +1,56 @@
+(;GM[1]FF[3]
+VW[]AP[Many Faces of Go:10.0]SZ[13]HA[0]ST[1]
+PB[Katsunari 8.0]
+PW[GnuGo 3.0.0]
+DT[2001-09-26]
+PC[OS]KM[5.5]RU[Japanese]
+RE[B+14.5]
+US[Mertin]
+EV[CGoT]
+;B[kc]C[   1 b 11  3];W[jj]C[   2 w 10 10];B[dk]C[   3 b  4 11];W[dd]
+C[   4 w  4  4];B[gk]C[   5 b  7 11];W[kg]C[   6 w 11  7];B[fc]
+C[   7 b  6  3];W[cg]C[   8 w  3  7];B[db]C[   9 b  4  2];W[ik]
+C[  10 w  9 11];B[ci]C[  11 b  3  9];W[cc]C[  12 w  3  3];B[bh]
+C[  13 b  2  8];W[cb]C[  14 w  3  2];B[hd]C[  15 b  8  4];W[eb]
+C[  16 w  5  2];B[fb]C[  17 b  6  2];W[da]C[  18 w  4  1];B[ig]
+C[  19 b  9  7];W[jh]C[  20 w 10  8];B[bf]C[  21 b  2  6];W[cf]
+C[  22 w  3  6];B[ce]C[  23 b  3  5];W[de]C[  24 w  4  5];B[bd]
+C[  25 b  2  4];W[jf]C[  26 w 10  6];B[ec]C[  27 b  5  3];W[dc]
+C[  28 w  4  3];B[df]C[  29 b  4  6];W[dh]C[  30 w  4  8];B[ef]
+C[  31 b  5  6];W[fh]C[  32 w  6  8];B[hf]C[  33 b  8  6];W[fd]
+C[  34 w  6  4];B[gd]C[  35 b  7  4];W[hl]C[  36 w  8 12];B[gl]
+C[  37 b  7 12];W[le]C[  38 w 12  5];B[hk]C[  39 b  8 11];W[il]
+C[  40 w  9 12];B[hi]C[  41 b  8  9];W[fe]C[  42 w  6  5];B[ff]
+C[  43 b  6  6];W[cd]C[  44 w  3  4];B[be]C[  45 b  2  5];W[lc]
+C[  46 w 12  3];B[lb]C[  47 b 12  2];W[kd]C[  48 w 11  4];B[jc]
+C[  49 b 10  3];W[mb]C[  50 w 13  2];B[ge]C[  51 b  7  5];W[kb]
+C[  52 w 11  2];B[jb]C[  53 b 10  2];W[la]C[  54 w 12  1];B[ac]
+C[  55 b  1  3];W[bb]C[  56 w  2  2];B[ab]C[  57 b  1  2];W[ba]
+C[  58 w  2  1];B[fa]C[  59 b  6  1];W[ea]C[  60 w  5  1];B[ki]
+C[  61 b 11  9];W[bg]C[  62 w  2  7];B[ji]C[  63 b 10  9]
+(;W[kl]C[  64 w 11 12];B[ag]C[  65 b  1  7];W[kj]C[  66 w 11 10];B[lj]
+C[  67 b 12 10];W[lh]C[  68 w 12  8];B[ij]C[  69 b  9 10];W[li]
+C[  70 w 12  9];B[ih]C[  71 b  9  8];W[bc]C[  72 w  2  3];B[dg]
+C[  73 b  4  7];W[ad]C[  74 w  1  4];B[jg]C[  75 b 10  7];W[aa]
+C[  76 w  1  1];B[kh]C[  77 b 11  8];W[lg]C[  78 w 12  7];B[ed]
+C[  79 b  5  4];W[ee]C[  80 w  5  5];B[hm]C[  81 b  8 13];W[ja]
+C[  82 w 10  1];B[im]C[  83 b  9 13];W[jk]C[  84 w 10 11];B[ia]
+C[  85 b  9  1];W[ka]C[  86 w 11  1];B[hb]C[  87 b  8  2];W[ae]
+C[  88 w  1  5];B[ch]C[  89 b  3  8];W[jm]C[  90 w 10 13];B[jd]
+C[  91 b 10  4];W[gm]C[  92 w  7 13];B[fm]C[  93 b  6 13];W[hm]
+C[  94 w  8 13];B[el]C[  95 b  5 12];W[je]C[  96 w 10  5];B[fi]
+C[  97 b  6  9];W[ie]C[  98 w  9  5];B[gh]C[  99 b  7  8];W[id]
+C[ 100 w  9  4];B[ic]C[ 101 b  9  3];W[he]C[ 102 w  8  5];B[af]
+C[ 103 b  1  6];W[ac]C[ 104 w  1  3];B[if]C[ 105 b  9  6];W[tt]
+C[ 106 w  0  0];B[tt]C[B+14.5])
+
+(;W[ii];B[ih];W[ij];B[kh];W[jg]
+(;B[kj];W[kk];B[lk];W[kl];B[ll];W[lh];B[li];W[mi];B[lj];W[lg]
+C[W wins
+])
+
+(;B[kk];W[kj];B[lj];W[ll];B[lk];W[kl]C[W wins
+])
+)
+
+)
diff --git a/regression/games/mf1.sgf b/regression/games/mf1.sgf
new file mode 100644 (file)
index 0000000..cdbb389
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[3]
+RU[Japanese]BR[]WR[]CP[]SZ[19]HA[0]KM[5.5]
+PW[ ]
+PB[ ]
+GN[Many Faces of Go 9.0 (W) vs. GNU Go 2.7.220 (B)]
+DT[2001-02-18]
+SY[Cgoban 1.9.10];B[pp];W[dq];B[pd];W[dc];B[pj];W[nc];B[nd]
+;W[md];B[ne];W[ob];B[do];W[dl];B[cq];W[cr];B[cp];W[er]
+;B[de];W[ee];B[jp];W[fl];B[cf];W[ed];B[ic];W[kc];B[ci]
+;W[ck];B[qn];W[br];B[oq];W[fo];B[ef];W[bj];B[ei];W[cn]
+;B[cd];W[cc];B[ie];W[gc];B[kd];W[mb];B[jb];W[qb];B[qg]
+;W[kb];B[hb];W[gb];B[rd];W[lq];B[lo];W[mr];B[jn];W[mp]
+;B[om];W[nq];B[os];W[jr];B[ge];W[jd];B[ke];W[jc];B[hc]
+;W[je];B[fe];W[hq];B[gj];W[jf];B[me];W[id];B[hd];W[gg]
+;B[fg];W[ig];B[ek];W[no];B[hm];W[hl];B[jl];W[ik];B[mm]
+;W[im];B[hn];W[gm];B[il];W[hj];B[bc];W[bb];B[bd];W[gk]
+;B[ab];W[db];B[gi];W[ca];B[ga];W[fa];B[ha];W[ea];B[ld]
+;W[rc];B[mc];W[hi];B[qc];W[rb];B[gh];W[sd];B[re];W[hh]
+;B[bi];W[qi];B[qj];W[rj];B[rk];W[pi];B[ri];W[ni];B[rh]
+;W[mh];B[cj];W[ki];B[bk];W[bl];B[aj];W[oj];B[og];W[nk]
+;B[kk];W[ns];B[or];W[pc];B[pk];W[gn];B[ho];W[lg];B[qd]
+;W[gp];B[mj];W[lk];B[lj];W[mk];B[kj];W[ji];B[ll];W[gf]
+;B[ff];W[al];B[lc];W[el];B[nr];W[dk];B[dj];W[ms];B[fk]
+;W[ja];B[ib];W[lf];B[lb];W[la];B[ak];W[kf];B[hf];W[hg]
+;B[se];W[if];B[he];W[sc];B[iq];W[ir];B[jq];W[kq];B[le]
+;W[hp];B[ip];W[nm];B[nn];W[nl];B[on];W[mo];B[mn];W[ng]
+;B[oh];W[oi];B[nf];W[ph];B[pg];W[oo];B[nh];W[mi];B[mg]
+;W[po];B[qo];W[pl];B[ol];W[ok];B[sj];W[kp];B[op];W[ko]
+;B[kn];W[jo];B[io];W[fd];B[mf];W[od];B[oe];W[nb];B[np]
+;W[mq];B[li];W[lh];B[jj];W[ij];B[pn];W[oc];B[jk];W[ba]
+;B[nj];W[aa];B[ac];W[lp];B[ln];W[go];B[in];W[dd];B[ml]
+;W[gd];B[qh];W[ka];B[ia];W[tt];B[tt]
+TW[da][ma][na][oa][pa][qa][ra][sa][cb][eb][fb][pb][sb][ec][fc][jg][kg][ih][jh][kh][ii][hk][cl][gl][am][bm][cm][dm][em][fm][an][bn][dn][en][fn][ao][bo][co][do][eo][ap][bp][cp][dp][ep][fp][aq][bq][cq][eq][fq][gq][ar][dr][fr][gr][hr][kr][lr][as][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls]
+TB[ad][md][ae][be][ce][pe][qe][af][bf][df][of][pf][qf][rf][sf][ag][bg][cg][dg][eg][ng][rg][sg][ah][bh][ch][dh][eh][fh][sh][ai][di][fi][si][bj][ej][fj][rj][qk][sk][kl][pl][ql][rl][sl][im][jm][km][lm][pm][qm][rm][sm][rn][sn][ro][so][qp][rp][sp][pq][qq][rq][sq][pr][qr][rr][sr][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 71 territory + 3 captures + 5.5 komi = 79.5
+   Black = 72 territory + 6 captures = 78
+White wins by 1.5.
+]
+)
diff --git a/regression/games/mfgg1.sgf b/regression/games/mfgg1.sgf
new file mode 100644 (file)
index 0000000..5bc1b77
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[3]
+US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[ManyFaces3-FSF(B) NNGS]
+EV[None]
+RE[W+Resign]
+PW[ManyFaces3]
+WR[9k ]
+PB[FSF]
+BR[17k ]PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2001-04-22]
+SZ[19]TM[900]KM[0.5];B[pp];W[dd];B[pc];W[dp];B[qi];W[nq];B[np];W[mp];
+B[no];W[qn];B[oq];W[jq];B[mq];W[mc];B[cf];W[df];B[dg];W[ef];B[ce];
+W[di];B[bc];W[gd];B[cn];W[gp];B[pe];W[cl];B[en];W[jd];B[bp];W[qk];
+B[dl];W[ck];B[cq];W[eg];B[ro];W[dm];B[dn];W[qg];B[rf];W[og];B[em]C[
+];
+W[pj];B[lq]C[S13 clearly better
+];W[rg];B[lo]C[R14 would be better
+];
+W[re];B[qe];W[jo];B[sf]C[This leaves bad aji at S16. Better S16.
+];
+W[dq];B[ch];W[dh];B[hm];W[cb];B[cc];W[dc];B[bb];W[db];B[sg];W[ne];
+B[kr];W[jr];B[gm]C[too slow.
+];W[nh];B[ri]
+C[Does not connect. The right local move is S12.
+];W[cg];B[ba];W[bm];
+B[bg];W[co];B[bn];W[pi];B[cm]C[Not urgent.
+];W[ci];B[bl]
+C[Not urgent.
+];W[qc];B[qb];W[bo];B[ao];W[bk];B[am];W[nb];B[bh];W[rn];
+B[jm];W[gk];B[kn]
+C[Better start reducing the center (though it is too late already)
+];
+W[ik];B[mm];W[kk];B[io];W[ip];B[js];W[is];B[ks];W[hr];B[sn]
+C[Bad. Must R5 or R4 before considering this.
+];W[sm];B[so];W[rk];
+B[dr];W[er];B[cr];W[qo];B[rp];W[qp];B[rq];W[qq];B[qr];W[pr];B[rr];
+W[pq];B[nr];W[ek];B[po];W[om];B[bi];W[nl];B[ml];W[mk];B[es];W[fr];
+B[kp];W[jp];B[ho];W[ll];B[qh];W[pg];B[jn];
+)
diff --git a/regression/games/mfgg2.sgf b/regression/games/mfgg2.sgf
new file mode 100644 (file)
index 0000000..7bd8018
--- /dev/null
@@ -0,0 +1,37 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[ManyFaces3-FSF(B) NNGS]
+EV[None]
+RE[W+40.5]
+PW[ManyFaces3]WR[9k ]
+PB[FSF]BR[17k ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2001-04-22]
+SZ[19]TM[720]KM[0.5]
+
+;B[dp];W[pq]
+;B[dc];W[pc];B[ci]
+;W[fq];B[cn];W[ip];B[po];W[pl];B[no];W[mq];B[pe];W[ph];B[ne];W[mc];B[de]
+;W[pj];B[ei];W[lo];B[og];W[hc];B[en];W[fc];B[fl];W[oh];B[le];W[mm]
+;B[je];W[kc];B[he];W[fe];B[qm];W[ql];B[er];W[qf];B[fp];W[qe];B[gq];W[hn]
+;B[qp];W[gp];B[qq];W[pr];B[ef]
+;W[qn];B[ro];W[rm]
+;B[qr];W[np];B[eb];W[fb];B[gr];W[fo];B[ep];W[ir];B[go];W[rn];B[gn];W[pf]
+;B[nh];W[oo];B[hf];W[ff];B[fg];W[gg];B[gf];W[fh];B[eg];W[hl];B[gh];W[hj]
+;B[hg];W[jj];B[lh];W[ni];B[mi];W[ng];B[mg]
+;W[mh];B[of];W[li];B[ki];W[mj];B[lg];W[kj];B[ji];W[ii];B[ih];W[nn];B[fj]
+;W[hp];B[ps];W[or];B[fa];W[ga];B[ea];W[hb];B[jc];W[jb];B[ic];W[ib];B[pd]
+;W[od];B[oe];W[qd];B[oc];W[nd];B[qc];W[pb];B[qb];W[ob];B[pp];W[so];B[sp]
+;W[sn];B[qo];W[ec];B[cb];W[sq];B[ed];W[fd];B[hd];W[rp];B[kd];W[nb];B[lc]
+;W[lb];B[kb];W[rc];B[ja];W[ia];B[ka];W[la];B[kc];W[jh];B[jg];W[kh];B[nf]
+;W[gm];B[fm];W[kg];B[kf];W[gk];B[md];W[nc];B[gl];W[hm];B[gd];W[gc];B[ee]
+;W[ho];B[fn];W[hi];B[hh];W[fk];B[ek];W[cd];B[ce];W[nh];B[gj];W[hk];B[pg]
+;W[qg];B[mf];W[hq];B[hr];W[hs];B[fr];W[gs];B[gi];W[fs];B[es];W[is];B[op]
+;W[nr];B[on];W[om];B[na];W[oa];B[ki];W[ji];B[rb];W[rd];B[ma];W[mb];B[jq]
+;W[iq];B[mn];W[nm];B[nq];W[mp];B[rq];W[sp];B[sr];W[rs];B[qs];W[oq];B[lk]
+;W[pn];B[ge];W[mo];B[tt];W[rr];B[ss];W[rr];B[rs];W[os];B[tt];W[ll];B[tt]
+;W[da];B[db];W[bc];B[be];W[tt];B[bb];W[tt];B[tt]
+;)
diff --git a/regression/games/mfgg3.sgf b/regression/games/mfgg3.sgf
new file mode 100644 (file)
index 0000000..735bdcd
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.231 (level 10) ascii]HA[2]KM[0.5]GN[GNU Go 2.7.231 ascii
+ Random Seed 988054008] 
+AB[pd]AB[dp]
+;W[qp];B[cd];W[ec];B[ic];W[df];B[op];W[lp];B[on];W[qn];B[ol]
+;W[ee];B[bf];W[qf];B[qh];W[nc];B[nd];W[ql];B[oc];W[of];B[ip]
+;W[ln];B[re];W[mf];B[mc];W[ll];B[dj];W[gc];B[fq];W[oj];B[co]
+;W[cb];B[pq];W[pk];B[qq];W[rq];B[rr];W[po];B[cg];W[rp];B[oo]
+;W[rf];B[oh];W[nh];B[cm];W[oe];B[kq];W[lq];B[nl];W[sr];B[mk]
+;W[kj];B[qs];W[eh];B[nj];W[mh];B[di];W[jl];B[hb];W[kr];B[kc]
+;W[od];B[ob];W[or];B[pr];W[nr];B[ok];W[oi];B[hl];W[nm];B[fj]
+;W[om];B[im];W[qd];B[rd];W[qc];B[pc];W[qb];B[fh];W[qj];B[ij]
+;W[md];B[ne];W[me];B[nb];W[gb];B[jn];W[ml];B[eg];W[ir];B[hp]
+;W[fs];B[gr];W[he];B[ji];W[jg];B[hr];W[je];B[jq];W[jr];B[bc]
+;W[ki];B[bb];W[db];B[hg];W[jh];B[ih];W[ha];B[ia];W[ga];B[hc]
+;W[ld];B[lb];W[pm];B[jj];W[kk];B[nf];W[hd];B[og];W[qe];B[ng]
+;W[rh];B[ri];W[pg];B[ph];W[sh];B[si];W[qg];B[qi];W[jb];B[jc]
+;W[pp];B[ja];W[rk];B[mg];W[lg];B[ni];W[pl];B[lh];W[ss];B[nk]
+;W[pj];B[kh];W[kg];B[mi];W[oq];B[pe];W[pf];B[ef];W[de];B[fe]
+;W[fd];B[ge];W[gd];B[hf];W[dg];B[ch];W[fg];B[gg];W[ff];B[ei]
+;W[ce];B[be];W[iq];B[ko];W[lo];B[gf];W[ba];B[dh];W[eg];B[dd]
+;W[ed];B[li];W[pb];B[lj];W[oa];B[na];W[pa];B[is];W[if];B[gh]
+;W[ra];B[kp];W[hq];B[gq];W[rj];B[js];W[lr];B[kd];W[ke];B[id]
+;W[jm];B[ie];W[lf];B[ig];W[jf];B[kn];W[km];B[ik];W[sj];B[ks]
+;W[ls];B[hs];W[cc];B[ab];W[lc];B[sf];W[rg];B[sq];W[sp];B[rs]
+;W[sq];B[aa];W[ca];B[il];W[jd];B[ib];W[rc];B[lk];W[jk];B[lm]
+;W[mm];B[cf];W[pi];B[bd];W[dc];B[tt];W[tt];B[tt]
+)
+
diff --git a/regression/games/nando/auto001.sgf b/regression/games/nando/auto001.sgf
new file mode 100644 (file)
index 0000000..fd4cb52
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-18]\r
+KM[4.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[qa][ra][gb][ib][ob][pb][rb][bc][cc][fc][rc][dd][fd][rd][he]\r
+[qe][ff][qf][rg][fh][sh][ai][ei][pi][qi][ri][aj][bj][cj][mj][ck]\r
+[ek][kk][mk][dl][ql][dm][lm][om][sm][dn][en][fn][kn][mn][sn][mo]\r
+[oo][qo][ro][cp][dp][ep][dq][dr][cs]\r
+AB[pa][hb][jb][mb][qb][hc][ic][kc][qc][cd][nd][pd][ce][df][if]\r
+[kf][pf][cg][og][qg][qh][rh][bi][ci][gi][ii][ki][ni][nj][ak][bk]\r
+[nk][cl][bm][cm][cn][hn][co][do][eo][fo][lo][so][bp][kp][mp][op]\r
+[qp][rp][sp][bq][eq][gq][jq][lq][pq][er][ds]\r
+PL[W]IL[lp])\r
diff --git a/regression/games/nando/auto002.sgf b/regression/games/nando/auto002.sgf
new file mode 100644 (file)
index 0000000..c5d4885
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-22]\r
+KM[4.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ha][eb][pb][qb][rb][dc][lc][nc][rc][sc][dd][id][jd][kd][sd]\r
+[ne][se][bf][cf][df][ff][hf][dg][ig][dh][kh][ci][mi][ni][cj][cm]\r
+[hm][km][dn][jn][ln][ko][dp][jp][kp][lp][dq][kq][kr]\r
+AB[lb][mb][ec][hc][ic][jc][qc][gd][pd][rd][re][pf][qf][sf][bg]\r
+[cg][ng][ah][ch][eh][gh][mh][bi][ii][ki][lj][fk][ik][ok][qk][fl]\r
+[ll][nm][en][gn][io][lo][mo][qo][gp][mp][lq][nq][pq][lr]\r
+PL[B]IL[kn])\r
diff --git a/regression/games/nando/auto003.sgf b/regression/games/nando/auto003.sgf
new file mode 100644 (file)
index 0000000..fe43555
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-22]\r
+KM[6.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ea][fa][cb][eb][cc][dc][ec][rc][sc][dd][ed][qd][rd][fe][ke]\r
+[le][pe][bf][cf][df][ff][gf][kf][mf][of][pf][qf][rf][gg][hg][ig]\r
+[og][rg][sg][eh][gh][ih][jh][mh][gi][ji][ki][li][mi][ni][ri][cj]\r
+[dj][fj][kj][pj][qj][rj][dk][fk][gk][hk][lk][mk][nk][ok][qk][rk]\r
+[sk][fl][hl][il][ml][pl][ql][bm][fm][im][km][lm][mm][nm][om][cn]\r
+[dn][hn][in][mn][nn][fo][go][io][ko][no][dp][ep][fp][kp][lp][mp]\r
+[np][dq][jq][kq][nq][br][dr][jr][lr][nr][pr][cs][ks][ms]\r
+AB[ga][db][fb][hb][qb][rb][sb][fc][qc][fd][hd][jd][kd][ld][nd]\r
+[od][pd][ge][oe][hf][if][jf][nf][bg][cg][jg][kg][lg][mg][ng][pg]\r
+[qg][hh][kh][lh][nh][oh][qh][rh][sh][bi][ci][hi][ii][oi][pi][qi]\r
+[si][bj][gj][hj][ij][jj][lj][mj][nj][oj][sj][bk][ik][jk][kk][cl]\r
+[el][jl][kl][ll][rl][sl][hm][jm][pm][qm][rm][jn][kn][ln][on][qn]\r
+[ho][jo][lo][mo][oo][gp][hp][ip][jp][op][pp][eq][fq][iq][oq][pq]\r
+[qq][er][gr][ir][or][qr][ds][es][hs][is][js][ns][os]\r
+PL[B]IL[pk][kr][ls])\r
diff --git a/regression/games/nando/auto004.sgf b/regression/games/nando/auto004.sgf
new file mode 100644 (file)
index 0000000..5435156
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-23]\r
+KM[6.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[bb][fb][ob][bc][dc][fc][oc][cd][ed][jd][ld][md][od][de][ke]\r
+[df][kf][bg][kg][ng][hh][ih][rh][ii][ki][ri][bj][cj][sj][dk][hk]\r
+[dl][fl][jl][bm][hm][om][rm][dn][jn][pn][qn][co][ko][cp][lp][pp]\r
+[lq][oq][qq][mr][nr][pr]\r
+AB[gb][mb][pb][ac][hc][jc][kc][pc][bd][kd][qd][ce][he][je][le]\r
+[pe][bf][cf][jf][dg][pg][rg][bh][ch][eh][oh][qh][ci][hi][qi][dj]\r
+[ej][oj][qj][mk][ll][ql][an][fn][ln][nn][dp][fp][hp][jp][np][bq]\r
+[cq][kq][mq][nq][kr][lr]\r
+PL[W])\r
diff --git a/regression/games/nando/auto005.sgf b/regression/games/nando/auto005.sgf
new file mode 100644 (file)
index 0000000..753c67c
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-23]\r
+KM[4.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[fa][ga][fb][dc][dd][ed][rd][ae][be][ce][ee][oe][af][nf][qf]\r
+[rf][mg][og][sg][jh][qh][rh][fi][hi][ii][ji][ki][li][oi][pi][fj]\r
+[nj][qj][rj][ek][mk][nk][el][kl][ll][cm][em][gm][jm][fn][ln][bo]\r
+[go][ho][io][qo][bp][ep][jp][op][pp][bq][eq][hq][mq][oq][ar][fr]\r
+[lr][mr][pr][ns][ps][qs]\r
+AB[ha][gb][ib][gc][nc][qc][rc][jd][ld][pd][qd][de][re][se][bf]\r
+[cf][ef][of][sf][ag][dg][bh][ih][kh][di][oj][pj][ck][hk][jk][kk]\r
+[lk][qk][rk][gl][ml][pl][hm][km][lm][nm][qm][kn][mn][co][do][eo]\r
+[fo][ko][ro][gp][hp][lp][mp][rp][cq][dq][fq][iq][kq][lq][pq][qq]\r
+[br][dr][er][gr][kr][qr][cs][rs]\r
+PL[W]IL[mm][cr])\r
diff --git a/regression/games/nando/auto006.sgf b/regression/games/nando/auto006.sgf
new file mode 100644 (file)
index 0000000..0a66e86
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-23]\r
+KM[2.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ca][ha][ma][bb][cb][fb][gb][lb][nb][pb][cc][dc][fc][hc][ic]\r
+[kc][nc][cd][gd][hd][jd][nd][ce][ke][me][cf][lf][mf][cg][dg][mg]\r
+[ng][ch][gh][hh][nh][di][ei][fi][hi][ii][ki][li][mi][ni][oi][gj]\r
+[ij][kj][mj][nj][oj][ck][dk][ek][fk][gk][ik][nk][bl][el][il][jl]\r
+[kl][ll][ml][cm][km][nm][cn][dn][jn][kn][mn][nn][qn][co][jo][no]\r
+[dp][kp][lp][mp][op][qp][cq][dq][eq][nq][oq][qq][rq][cr][er][or]\r
+[pr][rr][sr][es][fs][ps]\r
+AB[da][ea][fa][ga][na][oa][db][eb][ob][qb][ec][oc][pc][qc][dd]\r
+[ed][fd][id][od][pd][de][ge][he][ie][je][ne][df][ff][kf][nf][qf]\r
+[eg][gg][hg][jg][lg][og][dh][eh][fh][ih][jh][kh][lh][mh][oh][ji]\r
+[pi][hj][jj][lj][pj][hk][jk][kk][lk][mk][ok][cl][dl][fl][gl][hl]\r
+[nl][ol][dm][em][fm][im][jm][om][en][in][on][pn][rn][do][eo][fo]\r
+[io][ko][lo][oo][po][qo][ep][jp][pp][rp][sp][fq][kq][lq][mq][pq]\r
+[sq][dr][fr][hr][lr][nr][gs][ms][ns][os]\r
+PL[W]IL[fg][kg][mr])\r
diff --git a/regression/games/nando/auto007.sgf b/regression/games/nando/auto007.sgf
new file mode 100644 (file)
index 0000000..faccc36
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-23]\r
+KM[4.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[fa][ja][ka][la][ma][eb][fb][jb][lb][dc][ec][hc][jc][lc][mc]\r
+[dd][id][jd][rd][ce][de][ge][he][je][ke][le][me][ne][ef][gf][if]\r
+[nf][pf][qf][rf][dg][eg][hg][lg][mg][ng][og][pg][qg][eh][gh][hh]\r
+[ih][kh][mh][ph][ei][fi][ki][mi][oi][qi][fj][mj][nj][pj][qj][sj]\r
+[nk][pk][rk][hl][pl][ql][em][hm][im][qm][en][fn][hn][in][jn][kn]\r
+[qn][rn][do][eo][go][ho][io][po][qo][cp][dp][fp][gp][ip][jp][rp]\r
+[eq][gq][nq][pq][qq][br][dr][fr][hr][lr][mr][nr][or][pr][bs][cs]\r
+[ds][hs][is][ps]\r
+AB[da][ea][na][cb][db][kb][mb][nb][cc][fc][kc][nc][qc][rc][cd]\r
+[gd][hd][kd][ld][md][nd][pd][qd][be][oe][pe][qe][re][se][cf][df]\r
+[jf][kf][lf][mf][of][sf][cg][ig][jg][kg][rg][dh][jh][lh][qh][rh]\r
+[sh][di][gi][hi][ii][ji][li][ri][ej][gj][lj][oj][rj][ck][ek][fk]\r
+[hk][mk][ok][el][gl][il][ll][nl][ol][dm][fm][gm][jm][km][pm][cn]\r
+[dn][gn][ln][pn][co][jo][ko][lo][mo][oo][bp][hp][kp][np][op][pp]\r
+[qp][aq][bq][cq][dq][hq][iq][jq][kq][lq][mq][oq][ar][cr][ir][kr]\r
+[js][ks][ls][ms][ns][os]\r
+PL[W]IL[sg][gk][fl][jr])\r
diff --git a/regression/games/nando/auto008.sgf b/regression/games/nando/auto008.sgf
new file mode 100644 (file)
index 0000000..9945c77
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-24]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[fa][ga][qa][ra][cb][fb][rb][dc][rc][cd][ed][rd][be][ee][ge]\r
+[bf][qf][rf][pg][dh][eh][fh][lh][mi][oi][qi][ek][lk][lm][rm][en]\r
+[nn][pn][qo][dp][fp][qp][cq][hq][dr][ir]\r
+AB[ha][pa][gb][ob][qb][cc][gc][hc][jc][qc][nd][pd][de][je][qe]\r
+[cf][ef][ff][hf][of][pf][jg][mg][bh][di][ei][ki][ck][cn][sn][jo]\r
+[lo][bp][np][pp][bq][jq][qq][rq][br][cr][jr]\r
+PL[W])\r
diff --git a/regression/games/nando/auto009.sgf b/regression/games/nando/auto009.sgf
new file mode 100644 (file)
index 0000000..d7cdfa1
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-24]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[hb][lb][cc][ic][lc][rd][de][ie][le][cf][ef][qf][rf][jg][qg]\r
+[sg][ni][qi][mj][gk][rk][al][fl][gl][ll][pl][ql][sl][am][bm][gm]\r
+[cn][dn][en][on][bo][fo][no][po][cp][fp][np][op][pp][fq][gq][oq]\r
+[rq][er][nr][pr][qr][ks]\r
+AB[cb][gb][mb][dc][gc][nc][qc][rc][cd][pd][qd][ge][re][se][of]\r
+[sf][bg][cg][fg][hg][ii][li][cj][gj][ak][ek][fk][hk][jk][bl][cl]\r
+[rl][im][qm][rm][bn][in][pn][qn][sn][eo][ko][qo][ro][gp][hp][qp]\r
+[eq][hq][kq][pq][qq][gr][or]\r
+PL[W]IL[rn])\r
diff --git a/regression/games/nando/auto010.sgf b/regression/games/nando/auto010.sgf
new file mode 100644 (file)
index 0000000..55396e3
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-25]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[la][ab][bb][db][hb][ib][mb][bc][cc][ic][kc][lc][dd][fd][jd]\r
+[kd][sd][ie][qe][re][se][ef][ff][if][jf][kf][qf][eg][jg][pg][eh]\r
+[fh][ph][ei][ki][fj][lj][pj][qj][rj][sj][ik][jk][kk][mk][sk][hl]\r
+[il][am][hm][jm][an][jn][on][pn][eo][io][ko][mo][oo][dp][fp][gp]\r
+[hp][np][pp][aq][bq][cq][jq][mq][nq][oq][or][ns]\r
+AB[ka][gb][nb][rb][ac][gc][hc][mc][nc][sc][ad][bd][hd][id][ld]\r
+[nd][pd][qd][rd][be][he][ke][cf][gf][lf][of][pf][fg][gg][kg][og]\r
+[dh][gh][kh][di][gi][li][mi][ni][dj][ij][bk][gk][hk][ok][rk][al]\r
+[gl][ql][sl][bm][gm][im][nm][om][pm][dn][fn][hn][in][nn][qn][ao]\r
+[co][fo][go][ho][no][qo][bp][cp][qp][pq][pr][os][ps]\r
+PL[W]IL[gn])\r
diff --git a/regression/games/nando/auto011.sgf b/regression/games/nando/auto011.sgf
new file mode 100644 (file)
index 0000000..a995ad1
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-25]\r
+KM[7.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[da][ea][fa][ha][ia][ra][cb][gb][jb][kb][mb][pb][qb][cc][gc]\r
+[lc][nc][oc][qc][rc][dd][gd][md][de][df][ef][ff][jf][kf][qf][gg]\r
+[hg][jg][lg][mg][ng][gh][jh][mh][gi][ii][li][mi][cj][ej][gj][hj]\r
+[ij][jj][kj][mj][nj][bk][ek][hk][kk][cl][dl][fl][gl][am][bm][fm]\r
+[ho][jo][ko][ap][dp][hp][ip][lp][mp][np][op][pp][aq][bq][cq][dq]\r
+[hq][jq][kq][nq][pq][qq][er][fr][ir][jr][mr][qr][ds][hs][js][rs]\r
+AB[eb][fb][ib][rb][sb][dc][ec][ic][jc][pc][sc][fd][hd][kd][ld]\r
+[nd][od][pd][qd][rd][ee][fe][ge][he][je][le][me][ne][hf][if][nf]\r
+[ig][og][pg][hh][ih][nh][hi][ni][lj][oj][qj][ik][jk][lk][mk][nk]\r
+[bl][el][hl][jl][kl][ll][nl][cm][dm][em][gm][bn][cn][fn][gn][hn]\r
+[in][jn][kn][pn][ao][do][eo][go][io][lo][mo][no][oo][qo][bp][cp]\r
+[ep][gp][qp][eq][fq][gq][oq][rq][gr][hr][or][rr][fs][gs][os]\r
+PL[W])\r
diff --git a/regression/games/nando/auto012.sgf b/regression/games/nando/auto012.sgf
new file mode 100644 (file)
index 0000000..004c1d1
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+PB[GNU Go 3.3.15 (random seed 1633135221)]\r
+PW[GNU Go 3.3.15 (random seed 1633135221)]\r
+RU[Japanese]HA[0]KM[5.5]RE[B+R]\r
+;B[qd];W[dd];B[pq];W[dp];B[oc];W[qn];B[fc];W[qk];B[mq];W[hc];B[fe]\r
+;W[df];B[fg];W[kc];B[dh];W[ec];B[fb];W[cj];B[fq];W[ch];B[dm];W[cg]\r
+;B[eo];W[cq];B[iq];W[qh];B[ed];W[dc];B[hd];W[id];B[he];W[di];B[jf]\r
+;W[ke];B[ca];W[fj];B[fm];W[nn];B[ln];W[hj];B[il];W[cb];B[qp];W[hl]\r
+;B[hm];W[gl];B[gm];W[ll];B[pf];W[km];B[in];W[kn];B[lo];W[ko];B[kp]\r
+;W[rf];B[re];W[da];B[ph];W[pi];B[rg];W[rh];B[qg];W[oh];B[sh];W[pg]\r
+;B[og];W[ph];B[qf];W[si];B[sg];W[ri];B[dr];W[cr];B[er];W[bn];B[mm]\r
+;W[oo];B[ml];W[lk];B[ng];W[jo];B[bm];W[cn];B[cm];W[mk];B[ol];W[nk]\r
+;B[pm];W[pn];B[qm];W[rm];B[rl];W[rn];B[ql];W[rp];B[rq];W[om];B[nm]\r
+;W[rk];B[sl];W[nl];B[on];W[pk];B[om];W[lh];B[mb];W[jh];B[ik];W[kf]\r
+;B[ig];W[ds];B[es];W[cs];B[md];W[jg];B[ie];W[jd];B[bk];W[ib];B[bj]\r
+;W[bi];B[an];W[do];B[ap];W[lb];B[lc];W[ld];B[mc];W[me];B[kb];W[ne]\r
+;B[oe];W[jb];B[la];W[eg];B[ef]\r
+)\r
diff --git a/regression/games/nando/auto013.sgf b/regression/games/nando/auto013.sgf
new file mode 100644 (file)
index 0000000..5839901
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-27]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ca][la][ma][na][oa][cb][db][eb][pb][qb][dc][mc][nc][qc][dd]\r
+[fd][qd][fe][ge][re][cf][df][if][kf][qf][dg][gg][kg][lg][qg][dh]\r
+[gh][ih][jh][oh][ph][ei][hi][ni][ri][bj][cj][ej][fj][oj][dk][fk]\r
+[mk][nl][pm][dn][fn][hn][jn][nn][on][qn][bo][ko][po][cp][bq][br]\r
+AB[da][ea][fa][fb][kb][lb][ob][ec][fc][jc][lc][oc][pc][gd][hd]\r
+[md][nd][pd][pe][qe][mf][pf][fg][mg][og][ch][eh][fh][kh][lh][nh]\r
+[ci][di][fi][gi][ii][ji][dj][gj][ij][lj][hk][lk][pk][rk][jl][sl]\r
+[km][mm][eo][mo][oo][qo][ro][ep][gp][op][cq][dq][iq][lq][pq][cr]\r
+[bs]\r
+PL[W])\r
diff --git a/regression/games/nando/auto014.sgf b/regression/games/nando/auto014.sgf
new file mode 100644 (file)
index 0000000..002cf5f
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-27]\r
+KM[3.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ja][na][oa][ab][bb][cb][ib][kb][nb][dc][hc][ic][kc][mc][nc]\r
+[bd][dd][ed][fd][id][jd][md][ae][fe][ie][le][qe][re][se][bf][cf]\r
+[df][ef][ff][jf][kf][lf][mf][nf][sf][eg][lg][pg][sg][ih][lh][oh]\r
+[ph][qh][rh][gi][hi][ii][ni][ej][hj][ij][jj][kj][lj][mj][nj][pj]\r
+[dk][ek][fk][gk][jk][lk][mk][cl][dl][fl][jl][ll][nl][sl][cm][em]\r
+[gm][nm][pm][qm][rm][dn][gn][hn][in][nn][pn][ao][do][fo][oo][po]\r
+[ap][bp][cp][dp][ep][fp][mp][dq][br][dr][cs]\r
+AB[ba][ca][ha][ia][pa][db][eb][fb][hb][ob][qb][ec][gc][oc][rc]\r
+[gd][nd][pd][qd][ge][he][je][me][ne][pe][af][gf][if][of][pf][qf]\r
+[rf][ag][bg][cg][dg][fg][hg][ig][jg][mg][ng][og][qg][rg][ch][eh]\r
+[gh][hh][jh][mh][nh][ei][fi][ji][ki][li][mi][cj][dj][fj][gj][ck]\r
+[hk][kk][bl][gl][hl][il][kl][ml][bm][im][jm][km][lm][mm][sm][an]\r
+[bn][cn][jn][mn][qn][rn][sn][bo][co][io][ko][no][qo][gp][hp][np]\r
+[op][pp][qp][rp][eq][fq][kq][mq][sq][er][rr][ds][es]\r
+PL[B]IL[el][dm])\r
diff --git a/regression/games/nando/auto015.sgf b/regression/games/nando/auto015.sgf
new file mode 100644 (file)
index 0000000..9b4d1f1
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-28]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[lb][mb][nb][ec][hc][kc][nc][cd][cg][ng][pg][rg][pi][qi][cj]\r
+[nj][oj][fk][bm][cm][em][lm][bn][dn][in][eo][lo][dp][ep][ip][jp]\r
+[mp][dq][eq][kq][er][mr]\r
+AB[ma][na][ob][oc][qc][nd][pd][ee][hf][eg][jg][fi][hi][kj][pj]\r
+[qj][hk][nk][ok][cn][pn][bo][co][do][ho][no][cp][pp][cq][fq][iq]\r
+[jq][oq][cr][dr][gr][kr][nr]\r
+PL[W])\r
diff --git a/regression/games/nando/auto016.sgf b/regression/games/nando/auto016.sgf
new file mode 100644 (file)
index 0000000..27e6b6e
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-28]\r
+KM[1.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ea][fa][cb][eb][cc][dc][gc][mc][oc][dd][gd][md][od][fe][ge]\r
+[oe][cf][ff][mf][of][rf][sf][fg][hg][ng][rg][sg][ch][dh][gh][ih]\r
+[kh][sh][bi][ci][ji][ki][li][ri][si][aj][cj][hj][kj][qj][bk][lk]\r
+[ok][pk][jl][ll][ql][em][fm][qm][bn][cn][dn][kn][mn][nn][on][ao]\r
+[fo][mo][po][qo][ro][bp][cp][dp][fp][mp][pp][dq]\r
+AB[ga][ja][na][db][fb][gb][hb][jb][kb][mb][ob][pb][fc][ic][lc]\r
+[nc][pc][fd][kd][qd][he][pe][re][se][if][kf][pf][qf][eg][ig][og]\r
+[qg][eh][fh][jh][mh][oh][qh][rh][ei][gi][ni][dj][gj][lj][nj][ck]\r
+[gk][nk][al][bl][cl][dl][el][ml][ol][pl][in][no][oo][ap][gp][jp]\r
+[qp][rp][aq][bq][cq][eq][fq][jq][nq][oq][pq][sq][dr][er][lr][qr]\r
+[rr]\r
+PL[W]IL[nb][qe])\r
diff --git a/regression/games/nando/auto017.sgf b/regression/games/nando/auto017.sgf
new file mode 100644 (file)
index 0000000..011caa0
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-28]\r
+KM[3.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ma][lb][mb][nb][dc][lc][nc][oc][dd][ed][fd][gd][jd][kd][nd]\r
+[be][ce][ee][ge][ie][ke][ne][bf][hf][if][ag][fg][gg][hg][ah][bh]\r
+[ch][fh][hh][ih][bi][di][gi][hi][hj][ij][jj][kj][jk][lk][nk][bl]\r
+[kl][ll][nl][ol][pl][am][bm][dm][em][fm][jm][lm][mm][nm][pm][an]\r
+[fn][gn][in][on][ao][fo][ho][io][lo][oo][bp][dp][ep][fp][jp][np]\r
+[bq][cq][nq][nr][ns][os]\r
+AB[na][oa][pa][ob][qb][mc][pc][qc][ld][md][pd][de][fe][je][le]\r
+[me][oe][cf][df][ef][ff][gf][jf][kf][nf][pf][bg][cg][dg][ig][jg]\r
+[dh][eh][jh][kh][nh][ci][ei][fi][ji][ki][bj][cj][gj][lj][mj][nj]\r
+[pj][bk][fk][hk][ik][mk][ok][pk][qk][cl][dl][el][fl][hl][il][jl]\r
+[ml][ql][cm][gm][hm][im][qm][bn][dn][hn][mn][nn][pn][bo][co][do]\r
+[eo][po][cp][op][pp][oq][or][qr][ps]\r
+PL[W]IL[pb][cn])\r
diff --git a/regression/games/nando/auto018.sgf b/regression/games/nando/auto018.sgf
new file mode 100644 (file)
index 0000000..3013aa0
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-28]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[fa][ma][ib][lb][nb][jc][nc][rc][hd][md][rd][sd][fe][je][ne]\r
+[re][ff][hf][nf][of][pf][sf][cg][jg][lg][qg][rg][ph][qh][qi][kj]\r
+[qj][ak][jk][mk][nk][ok][al][dl][jl][kl][pl][am][bm][cm][em][lm]\r
+[mm][pm][dn][hn][mn][pn][bo][fo][ap][cp][dp][pp][bq][dq][qq][br]\r
+[cr][qr][ns]\r
+AB[ea][ga][na][oa][eb][ob][qb][dc][gc][hc][oc][qc][nd][pd][qd]\r
+[ce][oe][pe][qe][df][ef][qf][rf][ng][pg][fh][mh][oh][ci][hi][ji]\r
+[ki][ni][pi][aj][cj][lj][mj][bk][dk][ek][gk][kk][lk][bl][cl][ol]\r
+[im][om][bn][jn][nn][lo][mo][hp][jp][np][eq][fq][oq][pq][dr][mr]\r
+[nr][es][os]\r
+PL[B]IL[se][dm][bp][cq])\r
diff --git a/regression/games/nando/auto019.sgf b/regression/games/nando/auto019.sgf
new file mode 100644 (file)
index 0000000..0ca4978
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-29]\r
+KM[7.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ea][oa][db][gb][ib][nb][pb][cc][dc][ec][gc][jc][lc][nc][qc]\r
+[rc][fd][gd][md][qd][le][qe][gf][jf][kf][qf][eg][fg][gg][pg][dh]\r
+[qh][rh][gi][oi][qi][si][nj][pj][rj][dk][gk][kk][lk][mk][pk][rk]\r
+[dl][hl][ll][nl][pl][dm][fm][im][nm][bn][cn][en][hn][nn][ao][bo]\r
+[co][do][no][oo][ap][cp][fp][hp][lp][mp][op][aq][dq][eq][gq][mq]\r
+[nq][er][fr][lr][mr][nr]\r
+AB[ca][da][ga][ha][bb][cb][eb][fb][ob][bc][oc][pc][nd][pd][ce]\r
+[fe][ge][he][me][pe][df][ff][mf][of][pf][cg][kg][ng][ch][mh][oh]\r
+[di][ei][ii][ki][ni][cj][lj][mj][qj][ck][ik][qk][sk][cl][il][jl]\r
+[kl][ql][rl][am][bm][cm][lm][qm][an][jn][on][pn][eo][fo][lo][bp]\r
+[dp][ep][kp][pp][bq][cq][iq][kq][lq][oq][pq][ar][cr][gr][hr][kr]\r
+[or][ds][es][fs][ls]\r
+PL[W]IL[fa][nh])\r
diff --git a/regression/games/nando/auto020.sgf b/regression/games/nando/auto020.sgf
new file mode 100644 (file)
index 0000000..0df6f6e
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-30]\r
+KM[5.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ob][pb][nc][oc][bd][cd][id][od][ce][me][df][of][lg][oh][ri]\r
+[cj][rj][qk][ql][rm][dn][en][do][ro][dp][pp][kq][nq][qq][rq][dr]\r
+AB[na][jb][lb][nb][qb][bc][cc][hc][pc][dd][fd][ld][qd][ff][qf]\r
+[qh][rh][qi][pj][pk][pl][dm][pm][cn][qn][co][fo][io][rp][bq][fq]\r
+[iq]\r
+PL[W])\r
diff --git a/regression/games/nando/auto021.sgf b/regression/games/nando/auto021.sgf
new file mode 100644 (file)
index 0000000..23a6f2d
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+GN[GNU Go 3.3.15 load and print]\r
+DT[2003-01-30]\r
+KM[4.5]AP[GNU Go:3.3.15]RU[Japanese]\r
+;AW[ha][cb][eb][hb][nb][ob][pb][bc][cc][dc][hc][jc][lc][mc][dd]\r
+[id][jd][rd][le][me][cf][if][nf][of][pf][qf][rf][lg][mg][og][rh]\r
+[di][ri][cj][kj][qj][ak][bk][fk][ik][kk][nk][dl][jl][ol][ql][km]\r
+[nm][om][pm][dn][in][nn][qn][fo][go][qo][ro][so][dp][fp][sp][dq]\r
+[lq][dr][er][ds]\r
+AB[db][fb][ib][qb][fc][gc][ic][nc][oc][qc][rc][bd][ed][hd][pd]\r
+[qd][ce][de][ge][ie][je][ne][re][ef][hf][mf][jg][ng][pg][ch][dh]\r
+[eh][hh][nh][oh][qh][bi][ei][ni][pi][qi][bj][dj][ej][mj][oj][mk]\r
+[ok][kl][ml][nl][on][pn][gp][hp][lp][np][pp][qp][rp][eq][fq][jq]\r
+[mq][sq][fr][rr][es][fs]\r
+PL[W]IL[he][ph][oi][nj])\r
diff --git a/regression/games/nando/auto022.sgf b/regression/games/nando/auto022.sgf
new file mode 100644 (file)
index 0000000..2ddc027
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+SZ[19]
+DT[2004-04-20]
+PB[Black]
+PW[White]
+CA[UTF-8]AP[CGoban:2]ST[2]RU[Japanese]KM[6.50]HA[0]
+;B[qd];W[dd];B[pp];W[od];B[dp];W[pf];B[oc];W[nc];B[pc];W[nd];B[rf]
+;W[jd];B[df];W[fd];B[cd];W[cc];B[ce];W[bc];B[cj];W[pn];B[np];W[qp]
+;B[qq];W[qo];B[rq];W[qj];B[jq];W[dn];B[fp];W[cp];B[cq];W[co];B[bq]
+;W[ff];B[nn];W[pl];B[nl];W[mi];B[dh];W[ih];B[kk];W[ij];B[il];W[kj]
+;B[fn];W[em];B[ek];W[jk];B[ll];W[jl];B[hk];W[jm];B[kn];W[jn];B[io]
+;W[ko];B[lp];W[fi];B[sn];W[af];B[gj];W[rn];B[gi];W[fh];B[so];W[nb]
+;B[ob];W[ph];B[qg];W[pg];B[bf];W[ae];B[ri];W[qi];B[rh];W[bg];B[na]
+;W[ma];B[oa];W[lb];B[lj];W[li];B[cg];W[bh];B[bi];W[in];B[ee];W[gd]
+;B[ch];W[ho];B[ip];W[hm];B[fm];W[cm];B[bn];W[bo];B[bm];W[gl];B[gk]
+;W[fl];B[el];W[ag];B[be];W[ad];B[ed];W[ec];B[rm];W[gh];B[qm];W[pm]
+;B[qn];W[po];B[op];W[eg];B[cl];W[mk];B[nk];W[lk];B[nj];W[lm];B[ml]
+;W[kl];B[ln];W[lo];B[mo];W[jo];B[mj];W[ro];B[sp];W[jp];B[hq];W[hp]
+;B[iq];W[kk];B[ni];W[nh];B[hi];W[hh];B[qe];W[rj];B[fe];W[ge];B[gp]
+;W[go];B[fo];W[hl];B[ik];W[ii];B[gn];W[hn];B[kp];W[mm];B[nm];W[ef]
+;B[de];W[dc];B[pe];W[oe];B[oo];W[fk];B[fj];W[ei];B[ej];W[di];B[ci]
+;W[oi];B[dj];W[si];B[sh];W[sj];B[qf];W[dg];B[oj];W[pk];B[qh];W[ql]
+;B[rl];W[rp];B[pj];W[pi];B[ai];W[km];B[mn];W[bd];B[cf];W[pd];B[sm]
+;W[eh];B[rk];W[qk];B[sk];W[on];B[im];W[hj];B[ah];W[gm];B[ki];W[jj]
+;B[mh];W[lh];B[om];W[lg];B[ol];W[ok];B[of];W[nf];B[og]
+)
diff --git a/regression/games/nando/auto023.sgf b/regression/games/nando/auto023.sgf
new file mode 100644 (file)
index 0000000..35372a8
--- /dev/null
@@ -0,0 +1,42 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.7.4 (random seed 358544207)]
+PB[GNU Go 3.7.4 (random seed 358544207)]
+RU[Japanese]
+RE[B+22.5]
+;B[pd];W[dp];B[pq];W[dd];B[pk];W[jp];B[pn];W[qf];B[cn];W[cl];B[en];W[fp]
+;B[gn];W[hp];B[df];W[fd];B[cd];W[cc];B[ce];W[bc];B[nd];W[jc];B[cj];W[qi]
+;B[bk];W[rk];B[lq];W[jq];B[bp];W[cq];B[re];W[rf];B[qe];W[ff];B[bq];W[ld]
+;B[fh];W[hh];B[mc];W[af];B[rm];W[eg];B[gg];W[lp];B[mq];W[ie];B[hm];W[hj]
+;B[fj];W[lb];B[mb];W[gk];B[cr];W[dr];B[ek];W[fl];B[el];W[ch];B[dh];W[dg]
+;B[mp];W[lo];B[nk];W[se];B[sd];W[sf];B[rc];W[br];B[pf];W[qg];B[eh];W[kr]
+;B[cg];W[bh];B[lc];W[ns];B[kb];W[jb];B[or];W[kc];B[la];W[ki];B[ar];W[cs]
+;B[mf];W[il];B[nn];W[fg];B[hg];W[ih];B[gf];W[ge];B[ig];W[gh];B[ci];W[hl]
+;B[ag];W[bf];B[nr];W[gm];B[fm];W[gl];B[hn];W[lf];B[ms];W[lg];B[lk];W[ja]
+;B[rl];W[nh];B[rj];W[ri];B[qk];W[pg];B[of];W[kk];B[kl];W[jl];B[kj];W[jk]
+;B[lj];W[lm];B[bi];W[bg];B[jj];W[ng];B[md];W[le];B[mm];W[ll];B[ml];W[nf]
+;B[ln];W[km];B[kn];W[me];B[mo];W[jo];B[si];W[sh];B[sj];W[co];B[bo];W[do]
+;B[oi];W[qh];B[lr];W[ks];B[jm];W[kl];B[jn];W[dn];B[cm];W[qj];B[sk];W[ka]
+;B[mi];W[ji];B[ij];W[ls];B[os];W[gi];B[gj];W[fi];B[ei];W[fk];B[ej];W[hk]
+;B[ii];W[kh];B[hi];W[jh];B[io];W[dm];B[dl];W[em];B[fn];W[ni];B[nj];W[bs]
+;B[ip];W[iq];B[ho];W[gp];B[kq];W[jr];B[mh];W[mg];B[pj];W[ah];B[ne];W[eo]
+;B[lb];W[pi];B[oh];W[og];B[ai];W[li];B[ko];W[kp];B[ik];W[lh];B[mj];W[cp]
+;B[aq];W[fo];B[oj];W[as];B[ph];W[go];B[];W[]
+;TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ab][bb][cb]
+[db][eb][fb][gb][hb][ib][ac][dc][ec][fc][gc][hc]
+[ic][ad][bd][ed][gd][hd][id][jd][kd][ae][be][de]
+[ee][fe][he][je][ke][cf][ef][hf][if][jf][kf][mf]
+[ag][jg][kg][rg][sg][rh][ep][dq][eq][fq][gq][hq]
+[cr][er][fr][gr][hr][ir][ds][es][fs][gs][hs][is]
+[js][cd][ce][df][gf][gg][hg][ig][cg]
+TB[ma][na][oa][pa][qa][ra][sa][nb][ob][pb][qb][rb]
+[sb][nc][oc][pc][qc][sc][od][qd][rd][oe][pe][di]
+[aj][bj][dj][ak][ck][dk][mk][ok][rk][al][bl][nl]
+[ol][pl][ql][sl][am][bm][im][nm][om][pm][qm][sm]
+[an][bn][in][mn][on][qn][rn][sn][ao][no][oo][po]
+[qo][ro][so][ap][np][op][pp][qp][rp][sp][nq][oq]
+[qq][rq][sq][mr][pr][qr][rr][sr][ns][ps][qs][rs]
+[ss][hj][fk][gk][hk][jk][kk][fl][gl][hl][il][jl]
+[kl][ll][gm][km][lm][cl]
+)
diff --git a/regression/games/nando/auto024.sgf b/regression/games/nando/auto024.sgf
new file mode 100644 (file)
index 0000000..f676b96
--- /dev/null
@@ -0,0 +1,19 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.7.4 (random seed 1127234333)]
+PB[GNU Go 3.7.4 (random seed 1127234333)]
+RU[Japanese]
+RE[W+Resign]
+;B[qd];W[cp];B[pq];W[dc];B[oc];W[po];B[pk];W[qq];B[qr];W[qp];B[or];W[hd]
+;B[np];W[dl];B[cj];W[qm];B[cg];W[eq];B[jc];W[oe];B[bl];W[ce];B[on];W[ip]
+;B[hb];W[lq];B[lo];W[rr];B[kp];W[kq];B[pf];W[me];B[ql];W[pm];B[mc];W[nh]
+;B[rs];W[om];B[pi];W[oo];B[nn];W[dn];B[no];W[in];B[nm];W[ol];B[mk];W[rq]
+;B[rl];W[rm];B[bn];W[bo];B[ej];W[ek];B[ls];W[mr];B[ms];W[ok];B[gj];W[nj]
+;B[fk];W[lm];B[ml];W[ir];B[fl];W[ck];B[bk];W[cn];B[fn];W[kn];B[bf];W[be]
+;B[fb];W[eb];B[fc];W[jk];B[ji];W[kj];B[fe];W[lf];B[ie];W[df];B[dg];W[ef]
+;B[fh];W[go];B[lh];W[of];B[pg];W[dj];B[di];W[dk];B[eh];W[bm];B[cm];W[cl]
+;B[am];W[dm];B[bm];W[kg];B[ki];W[lj];B[ke];W[mj];B[ae];W[bc];B[ad];W[cb]
+;B[sm];W[sn];B[sl];W[ld];B[lc];W[fo];B[kd];W[en];B[gm];W[ij];B[jg];W[hi]
+;B[kf];W[lg]
+)
diff --git a/regression/games/nando/auto025.sgf b/regression/games/nando/auto025.sgf
new file mode 100644 (file)
index 0000000..817d124
--- /dev/null
@@ -0,0 +1,40 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.7.4 (random seed 1128280739)]
+PB[GNU Go 3.7.4 (random seed 1128280739)]
+RU[Japanese]
+RE[B+4.5]
+;B[pd];W[dp];B[pq];W[po];B[cd];W[qf];B[nq];W[qq];B[qr];W[qp];B[rr];W[qk]
+;B[ed];W[dj];B[fq];W[hq];B[fo];W[dn];B[fm];W[dl];B[nc];W[rd];B[qc];W[ph]
+;B[jq];W[lc];B[rc];W[ic];B[ir];W[eq];B[ch];W[cj];B[fr];W[no];B[lo];W[lm]
+;B[so];W[gc];B[ec];W[er];B[hr];W[jm];B[ne];W[hp];B[io];W[mp];B[ng];W[lp]
+;B[ni];W[kp];B[oj];W[qj];B[re];W[ko];B[jp];W[rf];B[qd];W[fb];B[eb];W[dh]
+;B[cg];W[ol];B[hm];W[bi];B[le];W[af];B[be];W[ro];B[sp];W[mr];B[nr];W[mb]
+;B[sf];W[sg];B[se];W[ob];B[rg];W[of];B[nf];W[lr];B[nb];W[na];B[kh];W[hf]
+;B[es];W[ds];B[bf];W[kd];B[fs];W[cr];B[qg];W[pg];B[rn];W[rl];B[sh];W[qh]
+;B[qm];W[ql];B[pm];W[ok];B[nk];W[qn];B[rm];W[kj];B[ih];W[ea];B[da];W[fa]
+;B[cb];W[mj];B[nj];W[jf];B[pe];W[pf];B[ke];W[je];B[ag];W[lg];B[kg];W[lh]
+;B[lf];W[ki];B[ji];W[gh];B[ik];W[rh];B[hj];W[si];B[sg];W[mi];B[mk];W[jk]
+;B[lk];W[kk];B[mm];W[om];B[ln];W[kn];B[ll];W[km];B[mn];W[pp];B[op];W[oo]
+;B[mh];W[il];B[hl];W[pn];B[mg];W[li];B[jj];W[rp];B[sq];W[eg];B[eo];W[do]
+;B[pb];W[oc];B[od];W[md];B[nd];W[mc];B[fj];W[nl];B[ml];W[kf];B[dg];W[eh]
+;B[bh];W[ig];B[jh];W[ai];B[gd];W[hd];B[ge];W[fc];B[gf];W[ef];B[ee];W[df]
+;B[ek];W[oh];B[nh];W[gi];B[el];W[en];B[fi];W[gj];B[fh];W[hg];B[gk];W[in]
+;B[hn];W[im];B[kr];W[np];B[oq];W[qe];B[sd];W[ah];B[ci];W[ej];B[bj];W[bk]
+;B[aj];W[ak];B[dk];W[ck];B[dm];W[cl];B[em];W[cm];B[hh];W[gg];B[he];W[ie]
+;B[hi];W[fn];B[go];W[gn];B[kl];W[jl];B[ld];W[kc];B[me];W[pa];B[qa];W[oa]
+;B[gm];W[pl];B[ep];W[sl];B[sn];W[nn];B[pj];W[de];B[dd];W[pi];B[jo];W[jg]
+;B[rq];W[ks];B[js];W[ls];B[kq];W[ns];B[os];W[ms];B[fg];W[mq];B[pr];W[ff]
+;B[fk];W[fd];B[fe];W[ma];B[pc];W[di];B[cf];W[nm];B[ce];W[sm];B[mo];W[oe]
+;B[og];W[ei];B[oi];W[ri];B[jn];W[pk];B[lq];W[lj];B[];W[]
+;TW[ga][ha][ia][ja][ka][la][gb][hb][ib][jb][kb][lb]
+[hc][jc][id][jd][if][qi][rj][sj][rk][sk][al][bl]
+[am][bm][an][bn][cn][on][ao][bo][co][qo][ap][bp]
+[cp][aq][bq][cq][dq][ar][br][dr][as][bs][cs]
+TB[aa][ba][ca][ra][sa][ab][bb][db][qb][rb][sb][ac]
+[bc][cc][dc][sc][ad][bd][rd][ae][mf][bg][ah][ai]
+[bi][ii][ij][hk][fl][gl][ho][fp][gp][ip][gq][iq]
+[gr][jr][or][sr][gs][hs][is][ps][qs][rs][ss][af]
+[hp][hq]
+)
diff --git a/regression/games/nando/auto026.sgf b/regression/games/nando/auto026.sgf
new file mode 100644 (file)
index 0000000..ff74a6a
--- /dev/null
@@ -0,0 +1,19 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.7.5 (random seed 1396252100)]
+PB[GNU Go 3.7.4 (random seed 1396252100)]
+RU[Japanese]
+RE[B+Resign]
+;B[pd];W[co];B[oq];W[dd];B[cf];W[qf];B[qp];W[dq];B[jq];W[qj];B[nd];W[df]
+;B[dg];W[ef];B[ce];W[cd];B[cj];W[fd];B[hc];W[fc];B[kc];W[qm];B[re];W[ph]
+;B[cm];W[gq];B[nn];W[eg];B[dh];W[rf];B[qe];W[ir];B[jr];W[fi];B[nl];W[if]
+;B[io];W[jj];B[hr];W[gr];B[kl];W[il];B[iq];W[jm];B[ko];W[ro];B[rp];W[qn]
+;B[qo];W[se];B[sd];W[sf];B[rc];W[fl];B[gs];W[fs];B[hs];W[er];B[gb];W[fb]
+;B[be];W[bd];B[bn];W[bo];B[he];W[hf];B[rn];W[rm];B[so];W[ke];B[kj];W[ki]
+;B[jk];W[ik];B[lj];W[jh];B[ge];W[ld];B[lc];W[an];B[am];W[ao];B[gf];W[gg]
+;B[go];W[ae];B[af];W[ad];B[md];W[bg];B[cg];W[bf];B[bh];W[ag];B[ni];W[ah]
+;B[dn];W[bi];B[ci];W[bl];B[cl];W[bm];B[bk];W[cn];B[em];W[dk];B[ck];W[el]
+;B[fo];W[ga];B[ha];W[fa];B[pf];W[pg];B[of];W[lf];B[sm];W[rh];B[sl];W[pl]
+;B[rk];W[oj];B[rj];W[nh];B[oi];W[mh];B[pi];W[qk];B[qi]
+)
diff --git a/regression/games/nando/auto027.sgf b/regression/games/nando/auto027.sgf
new file mode 100644 (file)
index 0000000..1aa9824
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]
+DT[2005-11-08]
+PB[GNU Go 3.7.7 (random seed 1088416040)]
+PW[GNU Go 3.7.7 (random seed 1088416040)]
+HA[0]KM[6.5]RU[Japanese]RE[B+5.5]AP[GNU Go:3.7.7]
+;B[qd];W[pp];B[dc];W[dp];B[cf];W[jc];B[nc];W[gc];B[pn];W[np];B[qp]
+;W[qq];B[qo];W[rq];B[qj];W[jq];B[dn];W[fp];B[cp];W[cq];B[co];W[bq]
+;B[cj];W[nn];B[pl];W[fn];B[dl];W[nl];B[fl];W[hl];B[nj];W[lj];B[mk]
+;W[kl];B[mh];W[lc];B[le];W[md];B[nf];W[an];B[gm];W[ho];B[gj];W[ec]
+;B[db];W[ff];B[ga];W[eb];B[ea];W[ie];B[dd];W[sn];B[eg];W[mb];B[nb]
+;W[ld];B[ed];W[fd];B[gh];W[ee];B[bn];W[hg];B[ao];W[kh];B[ml];W[mm]
+;B[rn];W[so];B[nk];W[rm];B[qm];W[rl];B[rk];W[hk];B[ji];W[jh];B[ii]
+;W[mf];B[lg];W[ne];B[of];W[od];B[pc];W[pe];B[qg];W[qe];B[ke];W[pd]
+;B[qc];W[me];B[kg];W[re];B[rd];W[lh];B[mg];W[mi];B[ni];W[jg];B[ro]
+;W[sp];B[ol];W[nm];B[hm];W[kk];B[in];W[kn];B[jo];W[ko];B[ip];W[hr]
+;B[de];W[sh];B[rg];W[sg];B[ef];W[na];B[rb];W[oa];B[pb];W[hb];B[fe]
+;W[ge];B[gf];W[jp];B[io];W[lf];B[kf];W[hf];B[hp];W[gq];B[fg];W[go]
+;B[bp];W[aq];B[il];W[ik];B[jm];W[em];B[el];W[ha];B[po];W[op];B[en]
+;W[gb];B[fa];W[fb];B[da];W[fm];B[gl];W[dm];B[cm];W[gg];B[jk];W[jj]
+;B[jl];W[ij];B[ki];W[kj];B[li];W[mj];B[ih];W[hh];B[hi];W[ig];B[hj]
+;W[gk];B[fi];W[fj];B[gi];W[ei];B[fh];W[km];B[fk];W[ap];B[am];W[ql]
+;B[eo];W[fo];B[ep];W[eq];B[ri];W[qk];B[pk];W[ob];B[oc];W[pa];B[qa]
+;W[ma];B[sk];W[sm];B[rh];W[sf];B[ff];W[si];B[mc];W[kb];B[pf];W[sd]
+;B[sc];W[iq];B[om];W[kd];B[je];W[jd];B[ll];W[lm];B[oo];W[no];B[gp]
+;W[rp];B[hq];W[gr];B[jf];W[he];B[se];W[rf];B[sd];W[dq];B[do];W[jn]
+;B[im];W[fq];B[rj];W[on];B[nd];W[oe];B[qf];W[sj];B[if];W[hn];B[gn]
+;W[sl];B[lk];W[];B[])
diff --git a/regression/games/nando/kisei27_g1.sgf b/regression/games/nando/kisei27_g1.sgf
new file mode 100644 (file)
index 0000000..8e28e24
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+DT[2003-01-16]\r
+PB[O Rissei]BR[9p]\r
+PW[Yamashita Keigo]WR[7p]\r
+EV[Kisei,27,Japan,]RO[1, final]KM[5.5]PC[Japan]RE[W+6.5]AP[sgf2misc:3.1.0]\r
+;B[pd]\r
+;W[dp];B[pq];W[dd];B[fq];W[po];B[oo];W[on];B[op];W[pn];B[qp];W[mn]\r
+;B[cq];W[dq];B[cp];W[do];B[dr];W[er];B[cr];W[eq];B[cn];W[mp];B[fo]\r
+;W[dn];B[cm];W[dm];B[fr];W[fm];B[cl];W[hn];B[es];W[qf];B[nc];W[pp]\r
+;B[oq];W[rp];B[rq];W[qo];B[qq];W[of];B[qe];W[rf];B[kd];W[lf];B[ni]\r
+;W[pi];B[nk];W[pk];B[kk];W[ik];B[kh];W[jf];B[hc];W[mh];B[mi];W[lh]\r
+;B[jj];W[ij];B[lm];W[mc];B[md];W[oc];B[nd];W[lc];B[nb];W[ld];B[re]\r
+;W[fc];B[he];W[ke];B[ig];W[ii];B[gg];W[ki];B[dg];W[di];B[cd];W[df]\r
+;B[dc];W[ed];B[dh];W[ce];B[bc];W[ci];B[bg];W[be];B[ec];W[gd];B[fb]\r
+;W[hd];B[ei];W[dk];B[gc];W[fd];B[id];W[ie];B[if];W[je];B[ek];W[dl]\r
+;B[ji];W[jh];B[ff];W[ge];B[hf];W[ic];B[ib];W[jc];B[ih];W[kg];B[gi]\r
+;W[jm];B[mm];W[ln];B[nm];W[nn];B[km];W[jn];B[jl];W[il];B[lj];W[oj]\r
+;B[nj];W[jk];B[ol];W[kl];B[ll];W[kj];B[lk];W[nr];B[ro];W[rn];B[sp]\r
+;W[hq];B[sf];W[ck];B[ef];W[or];B[mo];W[mq];B[hp];W[hr];B[ko];W[kn]\r
+;B[ip];W[jq];B[iq];W[ir];B[go];W[rs];B[rr];W[qs];B[pr];W[ps];B[sr]\r
+;W[co];B[bo];W[bl];B[jp];W[kq];B[am];W[ac];B[bb];W[sg];B[se];W[qg]\r
+;B[qm];W[rm];B[pl];W[ql];B[jb];W[kb];B[oh];W[bd];B[cc];W[ab];B[eb]\r
+;W[al];B[bn];W[ph];B[mb];W[bh];B[bm];W[bj];B[ch];W[bf];B[ah];W[ai]\r
+;B[bi];W[bp];B[bk];W[ak];B[aj];W[mk];B[ml];W[ai];B[bq];W[bh];B[rh]\r
+;W[ej];B[bi];W[fi];B[eh];W[fj];B[fh];W[hi];B[aj];W[gq];B[fp];W[ai]\r
+;B[hh];W[rg];B[aj];W[bk];B[gj];W[gk];B[dj];W[cj];B[ok];W[rk];B[fk]\r
+;W[dj];B[oi];W[pj];B[hk];W[gl];B[hj];W[pe];B[od];W[ai];B[bh];W[me]\r
+;B[lb];W[la];B[ng];W[og];B[nh];W[pm];B[ma];W[ka];B[lo];W[gs];B[gr]\r
+;W[hs];B[fs];W[sn];B[so];W[ja];B[hb];W[oe];B[nf];W[qd];B[rd];W[qc]\r
+;B[rc];W[qb];B[rb];W[ne];B[ob];W[ia];B[ha];W[kc];B[en];W[hl];B[gh]\r
+;W[em];B[lp];W[lq];B[gn];W[gm];B[ho];W[in];B[nq];W[no];B[mg];W[af]\r
+;B[ad];W[ae];B[ba];W[jl];B[aj];W[de];B[ai];W[];B[]TW[kd][le][kf]\r
+[pf][pg][kh][qh][rh][sh][ji][qi][ri][si][jj][qj][rj][sj][ek][fk]\r
+[qk][sk][el][fl][rl][sl][hm][im][qm][sm][qn][kr][lr][is][js][ks]\r
+[ls][ms][ns]TB[ca][da][ea][fa][ga][na][oa][pa][qa][ra][sa][cb]\r
+[db][gb][pb][qb][sb][oc][pc][qc][sc][qd][sd][eg][fg][hg][mj][mk]\r
+[nl][an][ao][ap][bp][rp][aq][sq][ar][br][as][bs][cs]\r
+)\r
diff --git a/regression/games/nando/meijin27_g1.sgf b/regression/games/nando/meijin27_g1.sgf
new file mode 100644 (file)
index 0000000..f98c65a
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+DT[2002-09-12]\r
+PB[Cho Chikun]BR[9p]\r
+PW[Yoda Norimoto]WR[9p]\r
+EV[Meijin,27,Japan,]RO[1]KM[5.5]PC[China]RE[W+R]AP[sgf2misc:3.1.0]\r
+;B[pd]\r
+;W[dd];B[pp];W[dq];B[do];W[co];B[dn];W[cp];B[cf];W[fc];B[bd];W[ch]\r
+;B[dh];W[di];B[dg];W[cj];B[eq];W[er];B[fq];W[dp];B[fo];W[ep];B[hc]\r
+;W[be];B[cd];W[ce];B[de];W[bf];B[bg];W[cg];B[df];W[bh];B[ed];W[dc]\r
+;B[ec];W[eb];B[db];W[cc];B[fb];W[ee];B[ea];W[fd];B[eb];W[cb];B[fe]\r
+;W[fp];B[fi];W[nc];B[lc];W[qc];B[pc];W[qd];B[pe];W[pb];B[ob];W[qb]\r
+;B[oc];W[qf];B[go];W[hq];B[kj];W[hi];B[fk];W[hk];B[ij];W[hj];B[im]\r
+;W[ii];B[ip];W[iq];B[jh];W[ji];B[ki];W[jl];B[jm];W[kl];B[il];W[jk]\r
+;B[ln];W[ml];B[ol];W[hg];B[gp];W[gq];B[nj];W[fg];B[eh];W[ge];B[ef]\r
+;W[ff];B[if];W[ee];B[ei];W[ig];B[jg];W[hd];B[ic];W[gl];B[dk];W[fm]\r
+;B[en];W[gc];B[gb];W[fe];B[jp];W[ie];B[qh];W[pf];B[of];W[ph];B[pg]\r
+;W[qg];B[og];W[rh];B[qi];W[ri];B[qj];W[jf];B[kf];W[je];B[ke];W[qq]\r
+;B[pq];W[qp];B[qo];W[ro];B[rn];W[pr];B[or];W[rr];B[po];W[os];B[ns]\r
+;W[ps];B[nr];W[rp];B[jq];W[jd];B[kc];W[oa];B[pa];W[qa];B[qe];W[re]\r
+;B[nb];W[rj];B[bm];W[qk];B[pj];W[qm];B[qn];W[jc];B[jb];W[nm];B[mn]\r
+;W[km];B[kn];W[kd];B[ld];W[ir];B[jr];W[cn];B[cm];W[ck];B[dj];W[ci]\r
+;B[cl];W[em];B[dm];W[el];B[dl];W[bn];B[ae];W[ag];B[bb];W[bc];B[ca]\r
+;W[ad];B[is];W[hs];B[js];W[rm];B[lk];W[pm];B[gs];W[gr];B[hr];W[fn]\r
+;B[eo];W[hs];B[bk];W[bj];B[pk];W[on];B[oo];W[nn];B[no];W[mk];B[mj]\r
+;W[sn];B[ql];W[rk];B[pl];W[rl];B[hr];W[ek];B[ej];W[hs];B[rf];W[rg]\r
+;B[hr];W[ib];B[hb];W[hs];B[rd];W[sf];B[hr];W[kb];B[ia];W[hs];B[rc]\r
+;W[rb];B[hr];W[kg];B[kh];W[hs];B[sb];W[sd];B[hr];W[le];B[lf];W[hs]\r
+;B[so];W[sp];B[hr];W[mf];B[lg];W[hs];B[qr];W[qs];B[hr];W[gn];B[hn]\r
+;W[hs];B[rs];W[ss];B[hr];W[ja];B[ka];W[hs];B[id];W[hf];B[hr];W[ab]\r
+;B[ba];W[hs];B[an];W[ao];B[hr];W[am];B[hs];W[ak];B[bl];W[al];B[fs]\r
+;W[fr];B[es];W[ds];B[gh];W[nk];B[ok];W[gk];B[kk];W[hm];B[hl];W[fl]\r
+C[Threatening A and B or C, white is about 3.5 points ahead.]\r
+LB[fj:A][ho:B][in:C]\r
+)\r
diff --git a/regression/games/nando/meijin27_g4.sgf b/regression/games/nando/meijin27_g4.sgf
new file mode 100644 (file)
index 0000000..78fb919
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+DT[2002-10-16,17]\r
+PB[Yoda Norimoto]BR[9p]\r
+PW[Cho Chikun]WR[9p]\r
+EV[Meijin,27,Japan,]RO[4]KM[5.5]PC[Japan]RE[B+0.5]AP[sgf2misc:3.1.0]\r
+;B[qd]\r
+;W[dd];B[pp];W[dp];B[oc];W[qj];B[cn];W[fq];B[cf];W[fc];B[dj];W[qm]\r
+;B[mq];W[qq];B[qp];W[pq];B[op];W[nr];B[nq];W[mr];B[rq];W[rr];B[or]\r
+;W[rp];B[lr];W[ch];B[dh];W[cl];B[cg];W[dn];B[co];W[do];B[cp];W[cq]\r
+;B[bq];W[cm];B[cr];W[dq];B[ao]C[First day adjournment];W[bd];B[qh]\r
+;W[iq];B[ro];W[sq];B[qn];W[pm];B[pr];W[qr];B[so];W[sp];B[jd];W[pd]\r
+;B[pc];W[qe];B[rd];W[ph];B[pg];W[oh];B[qi];W[pj];B[qf];W[mm];B[ng]\r
+;W[ci];B[eg];W[mi];B[gc];W[fd];B[fb];W[eb];B[lh];W[kf];B[li];W[le]\r
+;B[mj];W[lc];B[nk];W[ol];B[kc];W[mb];B[he];W[ne];B[md];W[ld];B[me]\r
+;W[mf];B[nd];W[jg];B[hg];W[ji];B[ih];W[jh];B[lg];W[lf];B[nf];W[cj]\r
+;B[hj];W[jk];B[gb];W[ic];B[jb];W[fh];B[ec];W[ed];B[cc];W[cb];B[cd]\r
+;W[bc];B[ij];W[gf];B[hf];W[jj];B[fg];W[di];B[gh];W[eh];B[dg];W[hl]\r
+;B[jr];W[gi];B[gk];W[oj];B[nh];W[fj];B[fk];W[ek];B[gg];W[oq];B[no]\r
+;W[ps];B[ms];W[os];B[kp];W[lk];B[lb];W[la];B[kb];W[mc];B[ir];W[hq]\r
+;B[fm];W[pa];B[ob];W[oa];B[qa];W[ma];B[qb];W[rj];B[ce];W[dc];B[bb]\r
+;W[ab];B[ln];W[mn];B[mo];W[lm];B[kn];W[sh];B[rg];W[rm];B[hr];W[gr]\r
+;B[gp];W[go];B[sr];W[ss];B[fp];W[fo];B[hp];W[gq];B[ho];W[hn];B[in]\r
+;W[ep];B[jo];W[bn];B[bo];W[dr];B[br];W[ip];B[io];W[gd];B[hd];W[og]\r
+;B[of];W[el];B[bh];W[bi];B[bg];W[be];B[ib];W[hm];B[gm];W[nc];B[od]\r
+;W[hi];B[ii];W[bm];B[em];W[dm];B[nl];W[nm];B[on];W[lj];B[ni];W[nj]\r
+;B[mk];W[ok];B[mh];W[ml];B[mi];W[om];B[kl];W[pn];B[jl];W[ik];B[qo]\r
+;W[ri];B[rh];W[si];B[fs];W[sg];B[sf];W[gs];B[ds];W[hc];B[hb];W[jq]\r
+;B[kq];W[ff];B[ea];W[da];B[fa];W[ba];B[jf];W[kg];B[ll];W[gn];B[je]\r
+;W[ig];B[hh];W[ai];B[an];W[am];B[hs];W[if];B[ie];W[ka];B[ja];W[er]\r
+;B[es];W[fr];B[cs];W[ns];B[ls];W[rn];B[sn];W[sm];B[en];W[eo];B[km]\r
+;W[im];B[jm];W[];B[]TW[aa][ca][bb][db][ac][ec][ad][ei][aj][bj]\r
+[dj][ej][sj][ak][bk][ck][dk][pk][qk][rk][sk][al][bl][dl][pl][ql]\r
+[rl][sl][eq][rq][or][pr][sr][qs][rs]TB[ga][ha][ia][ra][sa][rb]\r
+[sb][hc][ic][jc][qc][rc][sc][id][pd][sd][ne][oe][pe][qe][re][se]\r
+[pf][rf][qg][jn][ko][lo][ap][bp][lp][mp][np][aq][lq][ar][kr][as]\r
+[bs][is][js][ks]\r
+)\r
diff --git a/regression/games/nando/meijin27_g5.sgf b/regression/games/nando/meijin27_g5.sgf
new file mode 100644 (file)
index 0000000..31f3d2b
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]\r
+SZ[19]\r
+DT[2002-10-23,24]\r
+PB[Cho Chikun]BR[9p]\r
+PW[Yoda Norimoto]WR[9p]\r
+EV[Meijin,27,Japan,]RO[5]KM[5.5]PC[Yokohama, Japan]RE[W+R]AP[sgf2misc:3.1.0]\r
+;B[qd]\r
+;W[dd];B[pq];W[oc];B[dp];W[po];B[qo];W[qn];B[qp];W[pn];B[md];W[oe]\r
+;B[pf];W[oq];B[or];W[pp];B[qr];W[nq];B[nr];W[lq];B[pc];W[pi];B[of]\r
+;W[pb];B[pk]C[First day adjournment.];W[ok];B[qb];W[mc];B[lc]\r
+;W[ld];B[me];W[kc];B[lb];W[kb];B[mb];W[ke];B[jd];W[kd];B[nc];W[fc]\r
+;B[ol];W[oj];B[ql];W[nl];B[om];W[nm];B[on];W[no];B[qi];W[qh];B[qj]\r
+;W[ph];B[nn];W[mn];B[mm];W[oo];B[ri];W[qf];B[rk];W[pe];B[mo];W[ln]\r
+;B[lo];W[nf];B[ob];W[jp];B[jo];W[ip];B[km];W[fq];B[er];W[fr];B[eq]\r
+;W[fp];B[ml];W[cn];B[bo];W[ci];B[if];W[ce];B[bn];W[hd];B[ck];W[ei]\r
+;B[ng];W[og];B[mf];W[pg];B[id];W[hc];B[kf];W[es];B[nh];W[rg];B[ds]\r
+;W[fs];B[dr];W[mr];B[je];W[gf];B[bi];W[bj];B[cj];W[ch];B[bh];W[bg]\r
+;B[bk];W[hh];B[jb];W[jc];B[ic];W[ib];B[hb];W[ja];B[gb];W[jg];B[jf]\r
+;W[fb];B[la];W[ka];B[ia];W[ha];B[ga];W[fa];B[ia];W[kp];B[jb];W[kn]\r
+;B[nk];W[jn];B[le];W[do];B[co];W[ep];B[dn];W[eo];B[cp];W[em];B[cm]\r
+;W[il];B[gk];W[fl];B[fi];W[fh];B[eh];W[di];B[gh];W[fg];B[gi];W[hg]\r
+;B[dg];W[ek];B[ik];W[jk];B[ij];W[gg];B[cg];W[bf];B[jj];W[rn];B[im]\r
+;W[rq];B[qq];W[rp]\r
+)\r
diff --git a/regression/games/net3.sgf b/regression/games/net3.sgf
new file mode 100644 (file)
index 0000000..fc9ec33
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Chinese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ha][ia][ja][ka][la][jb][jc][jd][ah][sh][ai][si][aj][bj][cj][dj][pj][qj][rj][sj][ak][sk][al][sl][jp][jq][jr][hs][is][js][ks][ls]
+AB[ib][kb][ic][kc][bi][ci][qi][ri][bk][ck][qk][rk][iq][kq][ir][kr]
+)
diff --git a/regression/games/nicklas/nicklas1.sgf b/regression/games/nicklas/nicklas1.sgf
new file mode 100644 (file)
index 0000000..ea29781
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+34.5]
+;B[ee];W[eg];B[ce];W[gf];B[fd];W[cc];B[bd];W[bc];B[da];W[eb];B[bg];
+W[gb];B[dh];W[eh];B[dg];W[he];B[hd];W[hc];B[ge];W[id];B[gd];W[hg];
+B[ff];W[fg];B[ei];W[fi];B[di];W[ef];B[fe];W[df];B[cd];W[cf];B[bf];
+W[cg];B[bh];W[ch];B[bi];W[ci];B[ac];W[ab];B[ad];W[cb];B[dc];W[db];
+B[ec];W[de];B[dd];W[fc];B[ed];W[gc];B[tt];W[af];B[ag];W[ae];B[be];
+W[tt];B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][bb][fb][hb][ib][ic][ie][hf][if][dg][gg][ig][dh][fh][gh][hh][ih][di][ei][gi][hi][ii]
+TB[ae][af][ah][ai]
+C[The game is over.  Final score:
+   White = 30 territory + 5 captures + 5.5 komi = 40.5
+   Black = 4 territory + 2 captures = 6
+White wins by 34.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas10.sgf b/regression/games/nicklas/nicklas10.sgf
new file mode 100644 (file)
index 0000000..63fcc88
--- /dev/null
@@ -0,0 +1,30 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[NicklasE-GnuGo(B) NNGS]
+EV[None]
+RE[W+54.5]
+PW[NicklasE]WR[4k ]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-08-03]
+SZ[9]TM[1500]KM[0.5]
+
+HA[2]AB[gc][cg]
+;W[ee];B[cd];W[ec];B[fg];W[ge];B[db];W[eb];B[fb];W[ea];B[hd];W[he]
+;B[df];W[de];B[ce];W[dc];B[cb];W[cc]C[
+ gunnar started observation.
+]
+;B[bb];W[bc];B[bd];W[ac];B[ie];W[gg];B[fh];W[gh];B[hf];W[gf];B[hg];W[hh]
+;B[if];W[hb];B[gb];W[ib];B[gi];W[fi];B[ei];W[ef];B[hi];W[ih];B[ha];W[fa]
+;B[ga];W[dg]C[
+ ingwa started observation.
+]
+;B[dh];W[cf];B[ch];W[bf];B[eg]C[
+ soleil started observation.
+]
+;W[bg];B[bh];W[df];B[gd];W[ah];B[ff];W[fe];B[id];W[bi];B[ci];W[ag];B[ai]
+;W[ii];B[fi];W[bi];B[ia];W[ai];B[hc];W[tt];B[ic];W[tt];B[tt]
+;)
diff --git a/regression/games/nicklas/nicklas11.sgf b/regression/games/nicklas/nicklas11.sgf
new file mode 100644 (file)
index 0000000..4c21cde
--- /dev/null
@@ -0,0 +1,58 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[Storer-GnuGo(B) NNGS]
+EV[None]
+RE[B+11.5]
+PW[Storer]WR[15k*]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-08-04]
+SZ[19]TM[900]KM[0.5]
+
+HA[3]AB[pd][dp][dd]
+;W[qp];B[op];W[pq];B[on];W[qn];B[nq]C[
+ ingwa started observation.
+]
+;W[cf];B[ch];W[ef];B[fd];W[cj];B[gf];W[fg];B[hd];W[ei];B[di];W[dj];B[eh]
+;W[fh];B[cl];W[fj];B[bi];W[bj];B[pk];W[dn];B[cn];W[dm];B[co];W[cm];B[fp]
+;W[bm];B[kc];W[rl];B[ce];W[df];B[iq];W[qi];B[qg];W[oi];B[mi];W[nj];B[rk]
+;W[rj];B[ql];W[rm];B[sk];W[nl];B[bf];W[bg];B[be];W[bh];B[ol];W[pm];B[om]
+;W[pl];B[pj];W[pi];B[nh];W[ok];B[mk];W[nk];B[nc];W[ml];B[qe];W[mj];B[lk]
+;W[lj];B[ll];W[mn];B[lm];W[mm];B[hj];W[jj];B[hh];W[il];B[jn];W[ln];B[jl]
+;W[ik];B[lp];W[kn];B[km];W[im];B[jm];W[jp];B[gp];W[ip];B[hp];W[io];B[jq]C[
+ Micke started observation.
+]
+;W[ko];B[kp];W[in];B[fm];W[el];B[gn];W[gl];B[eo];W[kh];B[gi];W[fi];B[or]
+;W[pr];B[rh];W[ri];B[kf];W[lg];B[jg];W[nf];B[mf];W[mg];B[ng];W[lf];B[me]
+;W[of];B[og];W[le];B[md];W[ke];B[je];W[ld];B[lc];W[mh]C[
+ rightwhale started observation.
+]
+;B[ni];W[pg];B[pf];W[ph];B[oe];W[li];B[ne];W[gg];B[hg];W[hf];B[if];W[ge]
+;B[he];W[fe];B[ee];W[gd];B[gc];W[ff];B[kg];W[fc];B[ed];W[hc];B[gb];W[fb]
+;B[hb];W[ic];B[ib];W[jd];B[kd];W[db];B[cc];W[cb];B[bb];W[hf];B[lh];W[jh]
+;B[gf];W[af];B[ba];W[no];B[oo];W[np];B[oq];W[mp];B[mq]C[
+ NicklasE started observation.
+]
+;W[ao];B[eb];W[bq];B[ec];W[dr];B[ae];W[ag];B[cg];W[ci];B[ah];W[dh];B[hf]
+;W[fr];B[gr];W[fq];B[gq];W[eq];B[cp];W[bp];B[gk];W[fl];B[ih];W[gj];B[hk]
+;W[hl];B[fs];W[es]C[
+ kjell started observation.
+]
+;B[gs];W[dq];B[fk];W[ek];B[ps];W[qs];B[os];W[rr];B[ho];W[hn];B[gm];W[en]
+;B[fn];W[ep];B[do];W[fo];B[lo];W[jo];B[cq];W[cr];B[bn];W[an];B[go];W[bo]
+;B[fo];W[dg];B[ii];W[ij];B[hi];W[ji];B[sh];W[oj];B[si];W[sj];B[pn];W[qm]
+;B[pp];W[qo];B[mo];W[nn];B[hm];W[lq];B[kq];W[lr];B[qh];W[po];B[kr];W[mr]
+;B[ms];W[nm];B[ls];W[qc];B[rd];W[rc];B[pc];W[rf];B[qf];W[re];B[qd];W[sd]
+;B[se];W[sf];B[sb];W[rb];B[sg];W[pb];B[qa]C[
+ NicklasE 4k : klant-gnugo (263)
+]
+;W[ra];B[sc];W[sa];B[sc]C[
+ viking started observation.
+]
+;W[ob];B[se];W[nb];B[sd];W[mb];B[lb];W[la];B[em];W[dl];B[de];W[pa];B[oc]
+;W[ma];B[ka];W[aj];B[sb];W[qb];B[mc];W[ai];B[bh];W[tt];B[oh];W[tt];B[gh]
+;W[tt];B[tt]
+;)
diff --git a/regression/games/nicklas/nicklas12.sgf b/regression/games/nicklas/nicklas12.sgf
new file mode 100644 (file)
index 0000000..2b7f547
--- /dev/null
@@ -0,0 +1,48 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[kossa-GnuGo(B) NNGS]
+EV[None]
+RE[W+243.5]
+PW[kossa]WR[6k*]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-08-01]
+SZ[19]TM[1500]KM[0.5]
+
+;B[dd];W[pp];B[dq];W[oc];B[nq];W[pn];B[pr];W[qq];B[kq];W[do];B[fp];W[cq]
+;B[cr];W[cp];B[dm];W[en];B[pl];W[pj];B[mc];W[pe];B[jc];W[ql];B[gn];W[fm]
+;B[qm];W[pm];B[qk];W[rl];B[rm];W[pk];B[ol];W[rk];B[ph];W[qi];B[od];W[pd]
+;B[nh];W[nf];B[of];W[oe];B[nd];W[ne];B[pc];W[qc];B[pb];W[qb];B[ob];W[md]
+;B[nc];W[nj];B[lh];W[ld];B[ke];W[me];B[lb];W[kd];B[jd];W[je];B[kf];W[ie]
+;B[ki];W[hc];B[cg];W[fc];B[br];W[dj];B[fe];W[kb];B[kc];W[lc];B[jb];W[mb]
+;B[la];W[nb];B[el];W[fl];B[bj];W[ck];B[cj];W[dk];B[id];W[hd];B[bk];W[cm]
+;B[bl];W[cl];B[ek];W[fj];B[ec];W[ge];B[gf]C[
+ kossa 6k*: hörru gnugo...du borde spelat h15!   :-) (91)
+]
+;W[hf];B[fg];W[fd];B[hp];W[ee];B[ff];W[eb];B[db];W[ed];B[dc];W[de];B[fb]
+;W[ce];B[dh];W[di];B[gb];W[hb];B[bd];W[be];B[ad];W[cd];B[hg];W[cc];B[cb]
+;W[bb];B[ae];W[ea];B[fa];W[ib];B[ka];W[bf];B[ba];W[bc];B[bg];W[ci];B[bi]
+;W[ch];B[mk];W[ig];B[ih];W[hh];B[gg];W[hi];B[eh];W[bh];B[gi];W[hj];B[gj]
+;W[gk];B[fi];W[ej];B[hk];W[ik];B[jh];W[he];B[jf];W[if];B[hl];W[il]C[
+ DINO started observation.
+]
+;B[hm];W[ij];B[mj];W[nk];B[nl];W[ml];B[qf];W[pf];B[nm];W[no];B[mg];W[ag]
+;B[mm];W[ll];B[qg];W[qh]C[
+ clange started observation.
+]
+;B[rd];W[qd];B[pg];W[re];B[im];W[kl];B[mo];W[jm];B[og];W[mi];B[rh];W[ri]
+;B[sg];W[rf];B[lj];W[ni];B[ao];W[bm];B[am];W[ap];B[bp];W[bq];B[aq];W[bo]
+;B[ap];W[al];B[ak];W[ai];B[oi];W[mh];B[ng];W[pi];B[rg];W[kn];B[nn];W[np]
+;B[mq];W[mp];B[lp];W[lo];B[mn];W[kp];B[lq];W[jp];B[iq];W[jq];B[jr];W[ar]
+;B[io];W[an];B[jo];W[ko];B[qr];W[rr];B[dg];W[gh];B[fh];W[lm];B[rs];W[rq]
+;B[ep];W[pq];B[or];W[oq];B[jn];W[ln];B[fn];W[em];B[eo];W[dn];B[bs]C[
+ mikke started observation.
+]
+;W[qs];B[ps];W[kk];B[sr];W[sq];B[qs];W[ir];B[hr];W[kr];B[js];W[ip];B[is]
+;W[ss];B[nr];W[gl];B[sr];W[gm];B[ho];W[dp];B[ss];W[gq];B[er];W[hq];B[gr]
+;W[ir];B[lr];W[fq];B[eq];W[iq];B[gp];W[fr];B[fs];W[aq];B[as];W[tt];B[da]
+;W[tt];B[ma];W[oc];B[na];W[oa];B[pa];W[qa];B[tt];W[tt]
+;)
diff --git a/regression/games/nicklas/nicklas13.sgf b/regression/games/nicklas/nicklas13.sgf
new file mode 100644 (file)
index 0000000..e5cc18b
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-08-08]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+20.5]
+;B[cg];W[ee];B[gc];W[fd];B[fg];W[ff];B[fh];W[gf];B[cd];W[cc];B[bc];
+W[dc];B[dd];W[ec];B[fb];W[eb];B[gd];W[ge];B[cb];W[ce];B[de];W[df];
+B[be];W[cf];B[bf];W[dg];B[gg];W[hg];B[hh];W[hf];B[ih];W[gi];B[ch];
+W[dh];B[fi];W[ci];B[hi];W[bh];B[bg];W[hd];B[hc];W[ie];B[ah];W[bi];
+B[eg];W[ef];B[db];W[da];B[ab];W[ca];B[ba];W[bb];B[cb];W[ed];B[bd];
+W[ha];B[gb];W[db];B[bb];W[di];B[ig];W[if];B[ei];W[eh];B[gh];W[ai];
+B[ag];W[tt];B[hb];W[ia];B[ga];W[id];B[ib];W[tt];B[tt];
+TW[ea][fa][ga][ha][ia][fb][gb][hb][ib][fc][gc][hc][ic][gd][fe][he]
+TB[aa][ac][ad][ae][af][gi][ii]
+C[The game is over.  Final score:
+   White = 16 territory + 10 captures + 5.5 komi = 31.5
+   Black = 7 territory + 4 captures = 11
+White wins by 20.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas14.sgf b/regression/games/nicklas/nicklas14.sgf
new file mode 100644 (file)
index 0000000..62287ed
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-08-09]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+85.5]
+;B[dc];W[ef];B[cf];W[fd];B[de];W[dg];B[cg];W[dh];B[gc];W[fc];B[gd];
+W[ge];B[he];W[gf];B[hf];W[hg];B[fb];W[eb];B[gb];W[ec];B[db];W[ea];
+B[da];W[ee];B[ch];W[ci];B[bi];W[di];B[dd];W[bh];B[ah];W[bg];B[bf];
+W[ai];B[if];W[ag];B[af];W[fa];B[ig];W[hh];B[ih];W[ga];B[df];W[fg];
+B[ed];W[fe];B[hb];W[ha];B[id];W[ib];B[hi];W[ic];B[tt];W[bb];B[cb];
+W[bc];B[cc];W[bd];B[ba];W[ab];B[ca];W[ad];B[tt];W[tt];
+TW[aa][ba][ca][da][ia][cb][db][fb][gb][hb][ac][cc][dc][gc][hc][cd][dd][ed][gd][hd][id][ae][be][ce][de][he][ie][af][bf][cf][df][ff][hf][if][cg][eg][gg][ig][ah][ch][eh][fh][gh][ih][bi][ei][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 50 territory + 30 captures + 5.5 komi = 85.5
+   Black = 0 territory + 0 captures = 0
+White wins by 85.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas15.sgf b/regression/games/nicklas/nicklas15.sgf
new file mode 100644 (file)
index 0000000..f7241c0
--- /dev/null
@@ -0,0 +1,49 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[Storer-GnuGo(B) NNGS]
+EV[None]
+RE[W+51.5]
+PW[Storer]WR[15k*]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-08-10]
+SZ[19]TM[900]KM[4.5]
+
+HA[3]AB[pd][dp][dd]
+;W[qp];B[op];W[qm];B[qq];W[rq];B[lq];W[jq];B[gq];W[jo];B[pq]C[
+ ingwa started observation.
+]
+;W[qr];B[lo];W[jm];B[lm];W[kk];B[on];W[pk]C[
+ NicklasE started observation.
+]
+;B[mk];W[ll];B[ml];W[lk];B[dm];W[ci];B[fn];W[cl];B[cg];W[dl];B[co];W[cm]
+;B[dn];W[fl];B[hn];W[hl];B[eg];W[ei];B[gg];W[jc];B[lc];W[gc];B[hh];W[gi]
+;B[ge];W[gd];B[kb];W[jb];B[oj];W[pj];B[mi];W[li];B[jf];W[kc];B[lb];W[ke]
+;B[ld];W[kd];B[pr];W[rr];B[jr];W[kr];B[ir];W[kq];B[qf];W[qh];B[oc];W[le]
+;B[iq];W[lr];B[ip];W[ko];B[rh];W[ri];B[bi];W[bj];B[ji];W[ki];B[pi];W[qi]
+;B[oh];W[ph];B[qn];W[rn];B[pm];W[qo];B[pn];W[ql];B[hj];W[hi];B[ik];W[ii]
+;B[il];W[im];B[ij];W[jh];B[hm];W[gl];B[jj];W[km];B[ih];W[kh];B[lg];W[kf]
+;B[og];W[ne];B[ln];W[lp];B[mq];W[mp];B[mr];W[no];B[pp];W[nn];B[nm];W[ok]
+;B[oi];W[mn];B[mm];W[ol];B[om];W[mj];B[nj];W[lj];B[nk];W[mh];B[kg];W[jg]
+;B[mg];W[if];B[he];W[ie];B[nh];W[lh];B[fd];W[pf];B[pg];W[of];B[qg];W[rg]
+;B[rf];W[sh];B[ce];W[fc];B[ec];W[eb];B[db];W[fb];B[bn];W[bm];B[nf];W[mf]
+;B[ng];W[od];B[qs];W[oe];B[am];W[pc];B[qd];W[nc];B[qc];W[pb];B[qb];W[ob]
+;B[al];W[bk];B[rs];W[sp];B[bh];W[io];B[ho];W[gh];B[hg];W[ig];B[pa];W[oa]
+;B[qa];W[fg];B[ff];W[fh];B[ea];W[fa];B[da];W[hf];B[gf];W[hd];B[ee];W[cc]
+;B[cb];W[dc];B[bc];W[ed];B[bb];W[fe];B[ef];W[cd];B[bd];W[de];B[fd];W[cf]C[
+ NE started observation.
+]
+;B[be];W[df];B[bf];W[dg];B[dh];W[fe];B[dd];W[ec];B[di];W[dj];B[fd];W[ms]
+;B[nq];W[ns];B[ni];W[os];B[ps];W[oo];B[po];W[np];B[de];W[eh];B[sr];W[sq]
+;B[ro];W[so];B[sm];W[rm];B[rp];W[sn];B[ss];W[rk];B[em];W[el];B[fe];W[ai]
+;B[pe];W[ah];B[ag];W[aj];B[gm];W[fm];B[or];W[dr];B[cq];W[cr];B[br];W[bq]
+;B[ar];W[bp];B[bo];W[fr];B[eq];W[dq];B[cp];W[er];B[fq];W[gr];B[js];W[hr]
+;B[ks];W[ls];B[jp];W[kp];B[sf];W[sg];B[kn];W[bs];B[nr];W[hs];B[cs];W[ds]
+;B[fs];W[cs];B[aq];W[hq];B[hp];W[cn];B[jn];W[in];B[bl];W[ak];B[an];W[eo]
+;B[fo];W[cj];B[pl];W[ch];B[dg];W[bg];B[bh];W[bi];B[bg];W[fj];B[lf];W[me]
+;B[mo];W[nl];B[is];W[tt];B[as];W[ap];B[fp];W[ar];B[en];W[jl];B[ao];W[tt]
+;B[tt]
+;)
diff --git a/regression/games/nicklas/nicklas16.sgf b/regression/games/nicklas/nicklas16.sgf
new file mode 100644 (file)
index 0000000..a7a015b
--- /dev/null
@@ -0,0 +1,30 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[NicklasE-GnuGo(B) NNGS]
+EV[None]
+RE[W+40.5]
+PW[NicklasE]WR[30k ]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-10-19]
+SZ[9]TM[1500]KM[0.5]
+
+HA[2]AB[gc][cg]
+;W[ee];B[cd];W[ge];B[ed];W[fd]C[
+ chilli started observation.
+]
+;B[fg];W[eg];B[eh]C[
+ leif started observation.
+]
+;W[ef];B[fh];W[fc];B[hd];W[he];B[fb];W[eb];B[ec];W[gb];B[db];W[fa];B[hh]
+;W[cb];B[da];W[dc];B[dd];W[cc];B[bc];W[ea];B[hb];W[gd];B[bb];W[ca];B[ba]
+;W[dg];B[ch];W[dh];B[di];W[cf];B[be];W[bf];B[ab];W[bh];B[hf];W[if];B[ig]
+;W[ie];B[bg];W[ag];B[ci];W[ei];B[fi];W[ah];B[gf];W[bi];B[ei];W[ff];B[ae]
+;W[af];B[de];W[df];B[ce];W[hi];B[gg];W[ih];B[hg];W[gi];B[ii];W[ad];B[gh]
+;W[bd];B[tt];W[tt]C[
+ gunnar started observation.
+]
+;)
diff --git a/regression/games/nicklas/nicklas17.sgf b/regression/games/nicklas/nicklas17.sgf
new file mode 100644 (file)
index 0000000..232fdca
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-10-19]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+21.5]
+;B[ee];W[gg];B[dg];W[ge];B[dd];W[fc];B[ec];W[eb];B[db];W[fb];B[fh];
+W[gh];B[fg];W[ff];B[fd];W[gd];B[gi];W[ef];B[hh];W[hg];B[df];W[eg];
+B[eh];W[fi];B[ei];W[hi];B[ea];W[fa];B[da];W[fi];B[dh];W[gi];B[fe];
+W[gf];B[tt];W[ce];B[de];W[cc];B[dc];W[cd];B[bf];W[cf];B[cg];W[be];
+B[bg];W[cb];B[ae];W[ad];B[af];W[bc];B[ca];W[ba];B[tt];W[tt];
+TW[aa][ga][ha][ia][ab][bb][gb][hb][ib][ac][gc][hc][ic][bd][hd][id][he][ie][hf][if][ig][hh][ih][ii]
+TB[ed][ag][ah][bh][ch][ai][bi][ci][di]
+C[The game is over.  Final score:
+   White = 24 territory + 2 captures + 5.5 komi = 31.5
+   Black = 9 territory + 1 captures = 10
+White wins by 21.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas18.sgf b/regression/games/nicklas/nicklas18.sgf
new file mode 100644 (file)
index 0000000..3c092aa
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-10-19]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+31.5]
+;B[dc];W[ef];B[gc];W[gf];B[cf];W[cg];B[bg];W[df];B[bh];W[ce];B[bf];
+W[be];B[dg];W[eg];B[ch];W[dh];B[cg];W[eh];B[de];W[dd];B[cc];W[ed];
+B[ec];W[fd];B[he];W[hf];B[ge];W[fc];B[fb];W[gd];B[hc];W[hd];B[id];
+W[fe];B[ie];W[ic];B[ib];W[if];B[ic];W[bd];B[bc];W[ac];B[af];W[ci];
+B[ad];W[ae];B[cd];W[ee];B[ea];W[bb];B[cb];W[ab];B[ba];W[de];B[ca];
+W[ad];B[aa];W[tt];B[tt];
+TW[af][bf][cf][ff][ag][bg][cg][dg][fg][gg][hg][ig][ah][bh][ch][fh][gh][hh][ih][ai][bi][di][ei][fi][gi][hi][ii]
+TB[da][fa][ga][ha][ia][db][eb][gb][hb]
+C[The game is over.  Final score:
+   White = 27 territory + 10 captures + 5.5 komi = 42.5
+   Black = 9 territory + 2 captures = 11
+White wins by 31.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas19.sgf b/regression/games/nicklas/nicklas19.sgf
new file mode 100644 (file)
index 0000000..5aede89
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[2]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-10-19]
+SY[Cgoban 1.9.10]TM[-]AB[gc][cg]
+RE[W+32.5]
+;W[ee];B[cd];W[ge];B[ed];W[fd];B[fg];W[ec];B[fb];W[dd];B[hd];W[he];
+B[cc];W[eb];B[hb];W[df];B[ce];W[cf];B[dg];W[bf];B[db];W[ea];B[bb];
+W[da];B[ca];W[dc];B[bd];W[ac];B[cb];W[ab];B[aa];W[be];B[ad];W[ba];
+B[bg];W[aa];B[ff];W[fe];B[ie];W[if];B[id];W[hg];B[gh];W[hh];B[hi];
+W[ih];B[hf];W[gf];B[ef];W[de];B[bc];W[ab];B[ag];W[aa];B[af];W[ae];
+B[fa];W[fc];B[gg];W[gd];B[ga];W[ib];B[hc];W[ha];B[ia];W[eh];B[dh];
+W[ha];B[ei];W[gb];B[gi];W[ii];B[tt];W[tt];
+TW[ba][ca][fa][ga][ia][bb][cb][db][fb][hb][ac][bc][cc][gc][hc][ic][ad][bd][cd][ed][hd][id][ce][ie][hf][ig]
+TB[eg][ah][bh][ch][eh][fh][ai][bi][ci][di][fi]
+C[The game is over.  Final score:
+   White = 26 territory + 23 captures + 0.5 komi = 49.5
+   Black = 11 territory + 6 captures = 17
+White wins by 32.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas2.sgf b/regression/games/nicklas/nicklas2.sgf
new file mode 100644 (file)
index 0000000..e58b40e
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-25]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+87.5]
+;B[gc];W[ee];B[dc];W[eg];B[gb];W[ce];B[gg];W[ge];B[hb];W[hd];B[hf];
+W[fh];B[he];W[gd];B[gh];W[hh];B[gi];W[ih];B[fi];W[eh];B[ei];W[ch];
+B[di];W[cg];B[ci];W[bh];B[bi];W[bc];B[cb];W[bb];B[eb];W[cc];B[da];
+W[dd];B[ba];W[ec];B[db];W[fc];B[ca];W[fb];B[ah];W[ag];B[ai];W[hc];
+B[id];W[ic];B[ie];W[gf];B[hg];W[ig];B[fg];W[ef];B[ff];W[fe];B[hi];
+W[tt];B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ab][cb][db][eb][gb][hb][ib][ac][dc][gc][ad][bd][cd][ed][fd][id][ae][be][de][he][ie][af][bf][cf][df][ff][hf][if][bg][dg][fg][gg][hg][ah][dh][gh][ai][bi][ci][di][ei][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 54 territory + 28 captures + 5.5 komi = 87.5
+   Black = 0 territory + 0 captures = 0
+White wins by 87.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas20.sgf b/regression/games/nicklas/nicklas20.sgf
new file mode 100644 (file)
index 0000000..c591e79
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-11-04]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+24.5]
+;B[gd];W[ef];B[gg];W[ed];B[cc];W[cd];B[bd];W[ce];B[be];W[dc];B[cb];
+W[bf];B[fc];W[db];B[ac];W[bb];B[ba];W[ab];B[ae];W[da];B[ca];W[fg];
+B[gh];W[fh];B[af];W[bg];B[ag];W[bh];B[fi];W[ei];B[gi];W[eg];B[ah];
+W[gf];B[hf];W[hg];B[hh];W[he];B[ig];W[ge];B[ha];W[ie];B[if];W[hc];
+B[bi];W[ch];B[ci];W[dh];B[ai];W[di];B[tt];W[tt];
+TW[ea][fa][ga][ha][ia][eb][fb][gb][hb][ib][ec][fc][gc][ic][dd][fd][gd][hd][id][de][ee][fe][cf][df][ff][cg][dg][eh]
+TB[aa][ab][bb][bc][ad][hg][ih][hi][ii]
+C[The game is over.  Final score:
+   White = 28 territory + 3 captures + 5.5 komi = 36.5
+   Black = 9 territory + 3 captures = 12
+White wins by 24.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas21.sgf b/regression/games/nicklas/nicklas21.sgf
new file mode 100644 (file)
index 0000000..9271203
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[4]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-11-04]
+SY[Cgoban 1.9.10]TM[-]AB[cc][gc][cg][gg]
+RE[B+54.5]
+;W[ee];B[ce];W[ge];B[he];W[hf];B[gf];W[hd];B[fe];W[gd];B[fd];W[hg];
+B[hc];W[ie];B[hh];W[ig];B[ff];W[fc];B[ec];W[fb];B[gb];W[eb];B[db];
+W[ed];B[dc];W[ef];B[fh];W[eg];B[ih];W[fg];B[gh];W[eh];B[dh];W[fi];
+B[ic];W[id];B[tt];W[cf];B[bf];W[de];B[df];W[dg];B[ch];W[cf];B[ag];
+W[cd];B[df];W[be];B[cf];W[bc];B[bb];W[dd];B[ei];W[di];B[ae];W[ad];
+B[bd];W[ga];B[ha];W[be];B[af];W[da];B[cb];W[ab];B[bd];W[ib];B[fa];
+W[be];B[aa];W[ba];B[ea];W[tt];B[bd];W[tt];B[ei];W[tt];B[eh];W[tt];
+B[tt];TW[he][if]
+TB[aa][ba][ca][da][ga][ia][ab][eb][fb][hb][ib][ac][bc][fc][ad][cd][dd][ed][be][de][ee][ef][bg][dg][eg][fg][ah][bh][ai][bi][ci][di][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 2 territory + 6 captures + 0.5 komi = 8.5
+   Black = 36 territory + 27 captures = 63
+Black wins by 54.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas22.sgf b/regression/games/nicklas/nicklas22.sgf
new file mode 100644 (file)
index 0000000..47c9a67
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[4]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-11-05]
+SY[Cgoban 1.9.10]TM[-]AB[cc][gc][cg][gg]
+RE[W+12.5]
+;W[ee];B[ce];W[ge];B[he];W[eg];B[dh];W[eh];B[fh];W[fg];B[gh];W[hf];
+B[ei];W[gf];B[hd];W[ec];B[fb];W[eb];B[db];W[ea];B[df];W[hb];B[gb];
+W[ha];B[ib];W[ie];B[fa];W[id];B[dd];W[ed];B[ef];W[ff];B[hg];W[ig];
+B[ih];W[if];B[da];W[dc];B[cb];W[de];B[cd];W[dg];B[di];W[cf];B[ch];
+W[bf];B[be];W[bg];B[bh];W[ah];B[hi];W[bi];B[ae];W[df];B[af];W[ag];
+B[fi];W[ai];B[ci];W[gd];B[tt];W[bb];B[bc];W[ac];B[ad];W[tt];B[tt];
+TW[fa][ga][ia][fb][gb][ib][fc][gc][hc][ic][fd][hd][fe][he][ef]
+TB[aa][ba][ca][ab][bb][ac][bd][hh][gi][ii]
+C[The game is over.  Final score:
+   White = 15 territory + 9 captures + 0.5 komi = 24.5
+   Black = 10 territory + 2 captures = 12
+White wins by 12.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas23.sgf b/regression/games/nicklas/nicklas23.sgf
new file mode 100644 (file)
index 0000000..ac4b15a
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[4]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-11-05]
+SY[Cgoban 1.9.10]TM[-]AB[cc][gc][cg][gg]
+RE[W+5.5]
+;W[ee];B[ec];W[eg];B[eh];W[ce];B[bd];W[be];B[bf];W[ae];B[ge];W[cd];
+B[bc];W[fh];B[dh];W[fg];B[gh];W[fi];B[bh];W[af];B[ag];W[cf];B[bg];
+W[dg];B[ci];W[fd];B[gi];W[gd];B[fc];W[hd];B[he];W[hc];B[hb];W[ib];
+B[gb];W[hf];B[if];W[ig];B[ie];W[gf];B[hg];W[ff];B[ih];W[hi];B[ed];
+W[fe];B[dd];W[de];B[ei];W[id];B[ad];W[ha];B[hh];W[ig];B[ga];W[ic];
+B[ia];W[db];B[cb];W[ha];B[if];W[ia];B[ii];W[tt];B[tt];
+TW[ge][he][ie][df][ef][if][gg][hg][ig][gh][hh][ih][gi][hi][ii]
+TB[aa][ba][ca][da][ea][fa][ab][bb][db][eb][fb][ac][dc][ah][ch][ai][bi][di]
+C[The game is over.  Final score:
+   White = 15 territory + 13 captures + 0.5 komi = 28.5
+   Black = 18 territory + 5 captures = 23
+White wins by 5.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas24.sgf b/regression/games/nicklas/nicklas24.sgf
new file mode 100644 (file)
index 0000000..95a1c5a
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-02-28]
+SY[Cgoban 1.9.11]TM[-]
+RE[W+26.5]
+;B[cd];W[fe];B[fg];W[de];B[ce];W[df];B[bg];W[dd];B[dh];W[cg];B[dc];
+W[ec];B[db];W[eb];B[ch];W[bf];B[cf];W[dg];B[bh];W[cc];B[cb];W[bc];
+B[be];W[bb];B[gf];W[ge];B[he];W[hd];B[hf];W[id];B[eg];W[bd];B[ae];
+W[ad];B[af];W[ie];B[if];W[ff];B[ef];W[ee];B[tt];W[gg];B[gh];W[hg];
+B[hh];W[ig];B[ih];W[tt];B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ab][cb][db][fb][gb][hb][ib][ac][dc][fc][gc][hc][ic][ed][fd][gd][he][gf][hf][if]
+TB[bf][ag][ah][eh][fh][ai][bi][ci][di][ei][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 29 territory + 7 captures + 5.5 komi = 41.5
+   Black = 14 territory + 1 captures = 15
+White wins by 26.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas3.sgf b/regression/games/nicklas/nicklas3.sgf
new file mode 100644 (file)
index 0000000..608c6dd
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+86.5]
+;B[ee];W[eg];B[gf];W[cf];B[gc];W[dc];B[ce];W[bf];B[cd];W[cc];B[be];
+W[bc];B[fg];W[eh];B[fh];W[df];B[ed];W[fb];B[gb];W[fc];B[fa];W[db];
+B[ei];W[di];B[fi];W[ch];B[fd];W[ec];B[ea];W[ba];B[af];W[ag];B[ae];
+W[bh];B[ef];W[da];B[bd];W[eb];B[ga];W[ac];B[ad];W[gd];B[hc];W[de];
+B[dd];W[ge];B[ff];W[hf];B[he];W[hd];B[id];W[ie];B[ic];W[hg];B[tt];
+W[tt];
+TW[aa][ca][ea][fa][ga][ha][ia][ab][bb][cb][gb][hb][ib][gc][hc][ic][ad][bd][cd][dd][ed][fd][id][ae][be][ce][ee][fe][he][af][ef][ff][gf][if][bg][cg][dg][fg][gg][ig][ah][dh][fh][gh][hh][ih][ai][bi][ci][ei][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 54 territory + 27 captures + 5.5 komi = 86.5
+   Black = 0 territory + 0 captures = 0
+White wins by 86.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas4.sgf b/regression/games/nicklas/nicklas4.sgf
new file mode 100644 (file)
index 0000000..c090139
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+53.5]
+;B[cc];W[ef];B[cf];W[ed];B[gg];W[gf];B[hf];W[ge];B[de];W[fg];B[gh];
+W[fh];B[he];W[hd];B[eb];W[fc];B[hh];W[ig];B[ih];W[cg];B[fb];W[gb];
+B[bg];W[ch];B[bh];W[ec];B[db];W[df];B[dd];W[bf];B[ce];W[bi];B[be];
+W[ah];B[af];W[dc];B[ag];W[fa];B[fi];W[gi];B[hi];W[ei];B[gi];W[ie];
+B[hg];W[id];B[if];W[ea];B[ca];W[ee];B[ai];W[ci];B[ah];W[bb];B[cb];
+W[bc];B[ac];W[ad];B[bd];W[ab];B[eh];W[eg];B[di];W[dg];B[da];W[ba];
+B[ga];W[fa];B[ha];W[hb];B[ea];W[ib];B[fa];W[ia];B[ei];W[cd];B[cc];
+W[cb];B[dh];W[tt];B[tt];
+TW[aa][ca][da][ea][fa][ga][ha][db][eb][fb][ac][cc][gc][hc][ic][bd][cd][dd][fd][gd][ae][be][ce][de][fe][af][bf][cf][ff][ag][bg][ah][bh][ai]
+TB[ig][ii]
+C[The game is over.  Final score:
+   White = 34 territory + 25 captures + 5.5 komi = 64.5
+   Black = 2 territory + 9 captures = 11
+White wins by 53.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas5.sgf b/regression/games/nicklas/nicklas5.sgf
new file mode 100644 (file)
index 0000000..2eed973
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+21.5]
+;B[gd];W[ee];B[fg];W[ce];B[ff];W[dg];B[ec];W[dc];B[db];W[cc];B[cb];
+W[bb];B[ba];W[ab];B[eh];W[dh];B[ca];W[eb];B[fb];W[fc];B[ea];W[ed];
+B[eb];W[gc];B[gb];W[fd];B[hc];W[hd];B[hb];W[ge];B[gh];W[hg];B[hh];
+W[ih];B[hf];W[if];B[gg];W[he];B[fi];W[gf];B[hi];W[di];B[id];W[eg];
+B[ei];W[ef];B[fe];W[ie];B[ic];W[bc];B[aa];W[ig];B[ii];W[tt];B[tt];
+TW[ac][ad][bd][cd][dd][gd][ae][be][de][af][bf][cf][df][hf][ag][bg][cg][ah][bh][ch][ai][bi][ci]
+TB[da][fa][ga][ha][ia][ib][fh][gi]
+C[The game is over.  Final score:
+   White = 23 territory + 2 captures + 5.5 komi = 30.5
+   Black = 8 territory + 1 captures = 9
+White wins by 21.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas6.sgf b/regression/games/nicklas/nicklas6.sgf
new file mode 100644 (file)
index 0000000..ac6bf30
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+47.5]
+;B[dc];W[ef];B[cf];W[fd];B[fb];W[gc];B[de];W[dg];B[cg];W[ch];B[bh];
+W[dh];B[gb];W[hb];B[ha];W[ib];B[ee];W[fe];B[bi];W[fc];B[eb];W[ec];
+B[ga];W[dd];B[db];W[cd];B[cc];W[bd];B[ed];W[df];B[bc];W[ce];B[bf];
+W[ag];B[ah];W[af];B[ae];W[be];B[bg];W[af];B[ag];W[ad];B[ac];W[hc];
+B[ia];W[tt];B[tt];
+TW[ic][ed][gd][hd][id][ae][de][ee][ge][he][ie][af][bf][cf][ff][gf][hf][if][ag][bg][cg][eg][fg][gg][hg][ig][ah][bh][eh][fh][gh][hh][ih][ai][bi][ci][di][ei][fi][gi][hi][ii]
+TB[aa][ba][ca][da][ea][fa][ab][bb][cb]
+C[The game is over.  Final score:
+   White = 42 territory + 12 captures + 5.5 komi = 59.5
+   Black = 9 territory + 3 captures = 12
+White wins by 47.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas7.sgf b/regression/games/nicklas/nicklas7.sgf
new file mode 100644 (file)
index 0000000..fa7a76b
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-26]
+SY[Cgoban 1.9.10]TM[-]
+RE[W+14.5]
+;B[dc];W[ee];B[fd];W[fe];B[ce];W[cf];B[df];W[de];B[dg];W[bf];B[cd];
+W[ch];B[gd];W[ge];B[fg];W[gg];B[gh];W[hg];B[ff];W[gf];B[hh];W[ih];
+B[eh];W[ef];B[cg];W[bg];B[eg];W[dh];B[he];W[ei];B[hf];W[fh];B[ed];
+W[if];B[hd];W[ac];B[bb];W[bc];B[cb];W[be];B[bd];W[ad];B[ab];W[dd];
+B[cc];W[ae];B[ie];W[ig];B[tt];W[tt];
+TW[af][df][ff][ag][cg][dg][eg][fg][ah][bh][eh][gh][hh][ai][bi][ci][di][fi][gi][hi][ii]
+TB[aa][ba][ca][da][ea][fa][ga][ha][ia][db][eb][fb][gb][hb][ib][ec][fc][gc][hc][ic][id]
+C[The game is over.  Final score:
+   White = 21 territory + 9 captures + 5.5 komi = 35.5
+   Black = 21 territory + 0 captures = 21
+White wins by 14.5.
+]
+)
diff --git a/regression/games/nicklas/nicklas8.sgf b/regression/games/nicklas/nicklas8.sgf
new file mode 100644 (file)
index 0000000..f66b5de
--- /dev/null
@@ -0,0 +1,47 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[kossa-GnuGo(B) NNGS]
+EV[None]
+RE[W+132.5]
+PW[kossa]WR[6k*]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-08-03]
+SZ[19]TM[1500]KM[0.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[fq];B[cn];W[dr];B[cq];W[hp];B[mp];W[qf];B[nc];W[rd];B[qc];W[ph]
+;B[fp];W[gp];B[cr];W[ep];B[fo];W[eq];B[pf];W[qh];B[rc];W[ql];B[rj];W[qq]
+;B[ol];W[qp];B[re];W[qe];B[qd];W[rf];B[sd];W[pe];B[of];W[oe];B[ne];W[nf]
+;B[oi];W[ng];B[fc];W[cd];B[cc];W[ce];B[dc];W[de];B[cg];W[dg];B[dh];W[ch]
+;B[ci];W[bh];B[bg];W[eh];B[di];W[bf];B[eg];W[df];B[ag];W[af];B[ah];W[fh]
+;B[ef];W[ee];B[gg];W[gf];B[fe]C[
+ strandhag started observation.
+]
+;W[fd];B[rg];W[fg];B[gd];W[ed];B[ge];W[ff];B[me];W[ec];B[eb];W[fb];B[da]
+;W[gc];B[id];W[bb];B[bc];W[cb];B[db];W[bd];B[ac];W[lg];B[ba];W[ab];B[hc]
+;W[hb];B[ib];W[gb];B[sf];W[rh];B[qg];W[pg];B[sg];W[og];B[gj]C[
+ gunnar started observation.
+]
+;W[he];B[jg];W[hd];B[ic];W[od];B[oc];W[nd];B[le];W[md];B[kf];W[mc];B[li]
+;W[mi];B[mj];W[ni];B[nj];W[lh];B[rl];W[qn];B[qk];W[ki];B[so];W[ro];B[sn]
+;W[sp];B[hg];W[lj];B[ji];W[pq];B[sm];W[op];B[qm];W[eo];B[go];W[ho];B[em]
+;W[en];B[fm];W[fn];B[gn];W[dm];B[hn];W[dn];B[in];W[cm];B[bn];W[bm];B[jm]
+;W[co];B[bo];W[bp];B[cp];W[ao];B[do];W[an];B[co];W[ap];B[bk];W[mq];B[lq]
+;W[nq];B[iq];W[hq];B[gr];W[hr];B[hs];W[ir];B[mr];W[nr];B[lr];W[jr];B[dl]
+;W[kp];B[lp]C[
+ MacNala started observation.
+]
+;W[kq];B[ip];W[ko];B[mb];W[lb];B[na];W[kc];B[kr];W[jq];B[jn];W[mn];B[ln]
+;W[lo];B[mo];W[nn];B[lk];W[kn];B[lm];W[km];B[rn];W[pm];B[pl];W[pn];B[kl]
+;W[gi];B[hi];W[fj];B[fk];W[gk];B[hj];W[ek];B[el];W[fl];B[cl];W[gm];B[mm]
+;W[bl];B[bi];W[ak];B[aj];W[ck];B[al];W[dk];B[hl];W[cj];B[bj];W[la];B[oh]
+;W[nh];B[ha];W[ga];B[ca];W[pi];B[oj];W[lf];B[ia];W[mf];B[ld];W[kd];B[ke]
+;W[lc];B[gh];W[fi];B[kj];W[li];B[ma];W[if];B[ie];W[ig];B[kg];W[jh];B[hk]
+;W[gl];B[hm];W[nm];B[nl];W[sh];B[se];W[ob];B[nb];W[pb];B[pc];W[qb];B[rb]
+;W[sj];B[sk];W[si];B[ih];W[kh];B[ri];W[om];B[qi];W[am];B[ak];W[hf];B[hh]
+;W[io];B[jo];W[gq];B[ej];W[cf];B[ei];W[tt];B[tt]
+;)
diff --git a/regression/games/nicklas/nicklas9.sgf b/regression/games/nicklas/nicklas9.sgf
new file mode 100644 (file)
index 0000000..9391c52
--- /dev/null
@@ -0,0 +1,37 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[NicklasE-GnuGo(B) NNGS]
+EV[None]
+RE[W+29.5]
+PW[NicklasE]WR[4k ]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-08-03]
+SZ[9]TM[1500]KM[0.5]
+
+HA[2]AB[gc][cg]
+;W[ee];B[fg]C[
+ magob started observation.
+]
+;W[ge]C[
+ ingwa started observation.
+]
+;B[cd];W[ec];B[db];W[eb];B[fb];W[dc];B[cb];W[cc];B[bc];W[ea]C[
+ WS4 started observation.
+]
+;B[bb];W[gg];B[hd];W[he]C[
+ WS4 started observation.
+]
+;B[gh];W[hg];B[hh]C[
+ Micke started observation.
+]
+;W[df];B[dd];W[ed];B[ff];W[fe];B[gf];W[hf];B[tt];W[hb];B[cf];W[dg];B[eh]
+;W[dh];B[ih];W[bh];B[ch];W[ci];B[bg];W[ei];B[fi];W[eg];B[di]C[
+ magob started observation.
+]
+;W[ce];B[be];W[ei];B[fh];W[hi];B[di];W[de];B[bd];W[ei];B[ah];W[di];B[bi]
+;W[da];B[ca];W[gb];B[tt];W[tt]
+;)
diff --git a/regression/games/niki.sgf b/regression/games/niki.sgf
new file mode 100644 (file)
index 0000000..117f759
--- /dev/null
@@ -0,0 +1,42 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[GnuGo-niki(B) NNGS]
+EV[None]
+RE[B+101.5]
+PW[GnuGo]WR[15k*]
+PB[niki]BR[NR ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2001-06-29]
+SZ[19]TM[600]KM[0.5]
+
+;B[pd];W[dp];B[pq];W[dd];B[qf];W[po];B[qo];W[qn];B[qp];W[pn];B[op];W[qj]
+;B[cf];W[dj];B[fc];W[ee];B[cc];W[dc];B[cd];W[eg];B[db];W[eb];B[cb];W[kc]
+;B[ec];W[jp];B[cq];W[dq];B[cp];W[co];B[bo];W[cn];B[bn];W[cm];B[ck];W[cj]
+;B[dk];W[ek];B[dl];W[nc];B[oc];W[nd];B[ic];W[el];B[dm];W[em];B[bl];W[gp]
+;B[ej];W[dn];B[bj];W[lp];B[dr];W[er];B[cr];W[dh];B[fj];W[ei];B[ci];W[di]
+;B[ch];W[gh];B[hj];W[gf];B[fi];W[fh];B[dg];W[df];B[eh];W[od];B[pc];W[og]
+;B[ph];W[jb];B[ib];W[nq];B[oq];W[rh];B[qi];W[ri];B[pj];W[qk];B[pk];W[rn]
+;B[lb];W[nb];B[lc];W[mg];B[kd];W[pg];B[ql];W[qg];B[rl];W[rf];B[rj];W[nn]
+;B[qb];W[sq];B[rq];W[qe];B[qd];W[pe];B[hh];W[rc];B[rd];W[rb];B[ob];W[hg]
+;B[gi];W[ig];B[ih];W[fg];B[jg];W[jf];B[kf];W[ie];B[je];W[if];B[id];W[kg]
+;B[jh];W[lf];B[ke];W[hl];B[jl];W[sp];B[sr];W[rr];B[so];W[qr];B[qq];W[nr]
+;B[pr];W[np];B[rp];W[ik];B[jk];W[ij];B[ii];W[jj];B[kh];W[hm];B[in];W[kk]
+;B[kj];W[kl];B[jm];W[ol];B[ml];W[lm];B[mn];W[mm];B[nm];W[nl];B[no];W[sj]
+;B[rk];W[oi];B[on];W[oo];B[ln];W[pm];B[km];W[lk];B[lj];W[oj];B[mk];W[ni]
+;B[sn];W[hp];B[fp];W[hn];B[eq];W[fr];B[en];W[fq];B[ep];W[do];B[fn];W[fm]
+;B[gm];W[gl];B[gn];W[ce];B[be];W[lg];B[nh];W[de];B[oh];W[bf];B[cg];W[bd]
+;B[ae];W[ad];B[bc];W[af];B[ng];W[mh];B[mi];W[nf];B[le];W[pi];B[ok];W[qh]
+;B[nk];W[qj];B[ko];W[kp];B[io];W[ip];B[fe];W[be];B[ff];W[ge];B[fd];W[ef]
+;B[he];W[li];B[mj];W[ji];B[lh];W[ki];B[hi];W[hk];B[gk];W[ho];B[fl];W[eo]
+;B[fk];W[fo];B[gd];W[me];B[ld];W[or];B[qs];W[bm];B[am];W[mo];B[nn];W[lo]
+;B[kn];W[ds];B[cs];W[es];B[ra];W[sd];B[se];W[sf];B[re];W[oa];B[pa];W[na]
+;B[sc];W[jo];B[jn];W[os];B[ps];W[sk];B[sl];W[si];B[ma];W[mb];B[la];W[cl]
+;B[bk];W[md];B[nj];W[go];B[qk];W[qi];B[mc];W[im];B[ll];W[il];B[hd];W[tt]
+;B[hf];W[tt];B[gg];W[tt];B[bg];W[tt];B[ag];W[tt];B[ac];W[tt];B[ed];W[tt]
+;B[ae];W[tt];B[sb];W[tt];B[qc];W[tt];B[kb];W[tt];B[ja];W[tt];B[jc];W[tt]
+;B[rm];W[tt];B[pl];W[tt];B[om];W[tt];B[ro];W[tt];B[qm];W[tt];B[pp];W[tt]
+;B[fb];W[tt];B[ea];W[tt];B[tt]
+;)
diff --git a/regression/games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf b/regression/games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf
new file mode 100644 (file)
index 0000000..f175fce
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[bobo]WR[1k]
+PB[GnuGo (GNU Go 3.3.9)]BR[11k*]
+PC[NNGS]DT[2002-10-10]AP[gnugoclient:2.0]
+RE[B+Resign]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nq];B[pn];W[fp];B[dn];W[qf];B[pf];W[pg];B[of];W[qe];B[qd];W[fc]
+;B[nd];W[df];B[ee];W[cc];B[dc];W[db];B[eb];W[cb];B[fb];W[cd];B[or]
+;W[ef];B[fe];W[dl];B[mr];W[fm];B[el];W[dm];B[gc];W[en];B[ff];W[eh]
+;B[jc];W[rd];B[rc];W[qh];B[ri];W[cq];B[rg];W[rh];B[nh];W[qi];B[jm]
+;W[pm];B[rj];W[qj];B[qk];W[rk];B[rl];W[pk];B[ql];W[pl];B[oj];W[sk]
+;B[qm];W[si];B[ch];W[on];B[qn];W[dh];B[nl];W[kp];B[no];W[jo];B[hq]
+;W[ip];B[jq];W[iq];B[ir];W[io];B[kq];W[gr];B[hr];W[fg];B[hg];W[ji]
+;B[ii];W[ih];B[hh];W[ij];B[hi];W[ni];B[kj];W[mh];B[oh];W[md];B[kh]
+;W[nc];B[oc];W[ne];B[od]C[L:9];W[og];B[mi];W[ng];B[lh]C[L:10];W[mg]
+;B[me];W[le];B[nj];W[mb];B[bf];W[cg];B[ko];W[kn];B[lo];W[jn];B[co]
+;W[bm];B[bh];W[ci];B[bj];W[bi];B[cj];W[bg];B[ek];W[em];B[mf];W[ob]
+;B[nf];W[lc];B[re];W[rf];B[sd];W[kb];B[jb];W[fj];B[hk];W[gk];B[ik]
+;W[lm];B[nn];W[ml];B[mm];W[mn];B[nm];W[ln];B[ll];W[mo];B[lp];W[kl]
+;B[lk];W[mp];B[km];W[lq];B[lr];W[jl];B[mq];W[np];B[hm];W[im];B[gl]
+;W[fl];B[fk];W[gj];B[ej];W[fi];B[gn];W[go];B[kf];W[pb];B[gm];W[fn]
+;B[gq];W[fq];B[fr];W[er];B[gs];W[dq];B[sl];W[sj];B[ka];W[la];B[ja]
+;W[rb];B[lg];W[qg];B[qb];W[qa];B[qc];W[op];B[ke];W[oo];B[om];W[pq]
+;B[qp];W[pr];B[rr];W[nr];B[kc];W[lb];B[ld];W[po];B[mc];W[qo];B[ro]
+;W[md];B[na];W[rp];B[rn];W[qq];B[nb];W[hj];B[jk];W[hn];B[hl];W[gg]
+;B[gf];W[ms];B[ls];W[ph];B[oi];W[pe];B[ns];W[oe];B[mc];W[ps];B[os]
+;W[es];B[de];W[ce];B[fs];W[ea];B[fa];W[da];B[sf];W[sg];B[se];W[hp]
+;B[so];W[sm];B[sp];W[rq];B[sq];W[gh];B[qr];W[rs];B[sr];W[qs];B[mk]
+;W[ss];B[ok];W[gp];B[gi];W[il];B[kk];W[oq];B[ms];W[pi];B[]
+C[F17 removed
+J12 removed
+K11 removed
+final_score: B+2.5
+M19 removed
+R19 removed
+P18 removed
+S18 removed
+M15 removed
+B14 removed
+B12 removed
+B10 removed
+Q9 removed
+T7 removed
+D6 removed
+C5 removed
+D4 removed]
+)
diff --git a/regression/games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf b/regression/games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf
new file mode 100644 (file)
index 0000000..419ad5c
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[bobo]WR[1k]
+PB[GnuGo (GNU Go 3.3.9)]BR[11k*]
+PC[NNGS]DT[2002-10-11]AP[gnugoclient:2.0]
+RE[W+61.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nq];B[oq];W[np];B[pn];W[qf];B[pf];W[pg];B[of];W[qe];B[qd];W[qh]
+;B[nd];W[fp];B[dn];W[nm];B[pl];W[rj];B[jc];W[cf];B[df];W[dg];B[ef]
+;W[cc];B[dc];W[cd];B[fq];W[gq];B[eq];W[gp];B[jn];W[qq];B[qp];W[or]
+;B[rq];W[jr];B[pr];W[qm];B[pm];W[qk];B[ql];W[rl];B[eg];W[cg];B[pk]
+;W[eb];B[db];W[ge];B[hf];W[ie];B[mn];W[he];B[kf];W[gg];B[eh];W[hc]
+;B[nn];W[mr];B[ch];W[bh];B[ml];W[dm];B[em];W[dl];B[dk];W[cn];B[el]
+;W[do];B[en];W[co];B[bq];W[cp];B[cq];W[eo];B[gr];W[hr];B[fs];W[gf]
+;B[hq];W[iq];B[hp];W[gn];B[ip];W[kq];B[if];W[je];B[ke];W[jf];B[hh]
+;W[gh];B[jg];W[jh];B[kg];W[ig];B[hg];W[hi];B[ih];W[ii];B[ig];W[dh]
+;B[gi];W[fi];B[gj];W[ei];B[cl];W[cm];B[bj];W[bl];B[an];W[fk];B[gk]
+;W[fl];B[ek];W[gl];B[hk];W[ib];B[jb];W[fc];B[fj];W[ej];B[hl];W[gm]
+;B[ck];W[nh];B[di];W[fh];B[bm];W[bn];B[ao];W[am];B[bp];W[ep];B[bk]
+;W[dq];B[dr];W[cr];B[dp];W[ps];B[dq];W[rd];B[ak];W[go];B[rc];W[in]
+;B[qr];W[jm];B[ko];W[kn];B[jo];W[hm];B[ln];W[il];B[ij];W[km];B[ho]
+;W[lo];B[lp];W[mo];B[kp];W[lq];B[mg];W[se];B[rm];W[sc];B[rb];W[sm]
+;B[rn];W[sn];B[so];W[qj];B[sl];W[mh];B[rk];W[sj];B[ia];W[ha];B[ja]
+;W[ng];B[nf];W[lg];B[kh];W[mf];B[pi];W[ph];B[qs];W[os];B[me];W[sb]
+;B[ra];W[qi];B[hs];W[ir];B[lj];W[nj];B[kl];W[jl];B[kk];W[lm];B[nl]
+;W[mm];B[no];W[mp];B[op];W[om];B[oi];W[mj];B[ll];W[fn];B[ni];W[mi]
+;B[lf];W[li];B[ol];W[ki];B[ji];W[ik];B[hj];W[jq];B[on];W[kj];B[lk]
+;W[is];B[gs];W[es];B[fr];W[bo];B[ap];W[sk];B[pe];W[rl];B[sm];W[mg]
+;B[ic];W[hb];B[gb];W[id];B[rk];W[rf];B[rl];W[og];B[jk];W[im];B[sa]
+;W[sd];B[lh];W[oj];B[oh];W[mk];B[nk];W[ok];B[]
+C[final_score: W+61.5
+D18 removed
+G18 removed
+D14 removed
+C12 removed
+D11 removed
+R7 removed
+K6 removed
+R3 removed
+C2 removed
+E1 removed]
+)
diff --git a/regression/games/ninestones/emanuel-1.sgf b/regression/games/ninestones/emanuel-1.sgf
new file mode 100644 (file)
index 0000000..d145049
--- /dev/null
@@ -0,0 +1,62 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[19]HA[9]KM[5.5]PW[Humain]PB[Ordinateur]
+AB[dd][dj][dp][jd][jj][jp][pd][pj][pp]CA[UTF-8]
+;W[nq];B[lq];W[no];B[pn];W[fq];B[eq];W[fp];B[dn];W[gm];B[nm]
+;W[mn];B[fk];W[jm];B[lj];W[qf];B[pf];W[pg];B[of];W[nd];B[fc]
+;W[qe];B[me];W[pe];B[qd];W[rd];B[oe];W[od];B[rc];W[se];B[qg]
+;W[rg];B[qh];W[ne];B[rf];W[re];B[pb];W[rb];B[qb];W[qc];B[pc]
+;W[rh];B[nf];W[nb];B[lb];W[lc];B[mc];W[md];B[le];W[ld];B[mb]
+;W[qi];B[ph];W[nc];B[kb];W[sc];B[ob];W[na];B[oa];W[mf];B[pi]
+;W[mg];B[ng];W[ke];B[lf];W[jf];B[lg];W[kd];B[jc];W[mk];B[mm]
+;W[ln];B[lm];W[kn];B[qj];W[ri];B[hq];W[jr];B[gp];W[fo];B[mp]
+;W[np];B[ce];W[lk];B[kl];W[kk];B[in];W[im];B[jn];W[km];B[jl]
+;W[kj];B[mh];W[ji];B[ii];W[jk];B[ij];W[ik];B[ll];W[hl];B[hn]
+;W[gn];B[ko];W[iq];B[hr];W[fr];B[ir];W[kq];B[lr];W[kp];B[lp]
+;W[ip];B[or];W[nr];B[kr];W[ho];B[jq];W[go];B[rj];W[he];B[if]
+;W[ie];B[je];W[kf];B[hj];W[hc];B[ib];W[hb];B[fb];W[ja];B[ha]
+;W[ga];B[ia];W[gb];B[fa];W[ic];B[oq];W[jb];B[fg];W[co];B[do]
+;W[cp];B[cn];W[cq];B[er];W[bn];B[bm];W[ao];B[sb];W[sa];B[qa]
+;W[sf];B[ra];W[qc];B[jh];W[rc];B[hf];W[el];B[ki];W[ek];B[dl]
+;W[dk];B[ck];W[cl];B[dm];W[bl];B[cj];W[cm];B[ej];W[fl];B[em]
+;W[fe];B[gk];W[ok];B[pm];W[mj];B[nl];W[oj];B[nk];W[nj];B[li]
+;W[qo]
+;B[mi]C[?]
+;W[po];B[rm];W[rq];B[qr];W[pl];B[ro];W[qp];B[rr];W[qq];B[on]
+;W[oo];B[qn];W[rl];B[ql];W[rk];B[pq]
+(
+;W[ps]C[Q1 is not good, but GnuGo fails to find the rescue.
+
+P1 takes the 4 stones (see var)]
+(
+;B[pr]C[Q2 is a surprising error.
+
+P1 then T2 would either connect or make the 2 eyes ...]
+;W[os];B[sr];W[sq];B[ee];W[qk];B[sl];W[sk];B[pk];W[qm];B[sj]
+;W[sm];B[ql];W[fd];B[ol];W[ec];B[db];W[dc];B[cc];W[ed];B[ff]
+;W[eb];B[cb];W[ea];B[bk];W[am];B[hp];W[io];B[jo];W[hm];B[hk]
+;W[il];B[ak];W[al];B[gl];W[fm];B[ge];W[gd];B[gf];W[so];B[rn]
+;W[sn];B[sl];W[sp];B[jg];W[kc];B[kg];W[gr];B[mr];W[ms];B[ls]
+;W[ns];B[hs];W[gs];B[si];W[sh];B[da];W[oi];B[oh];W[ni];B[js]
+;W[nn];B[nh];W[mo];B[rp];W[lo];B[gq];W[tt];B[mq];W[tt];B[ml]
+;W[tt];B[tt]
+)
+(
+;B[os]
+(
+;W[ns];B[sr];W[sq];B[qs]
+)
+(
+;W[sr];B[ns];W[mr];B[ms];W[rs];B[pr]
+)
+)
+)
+(
+;W[os];B[ps];W[ns];B[sr]
+(
+;W[sq]
+)
+(
+;W[op];B[sq]
+)
+)
+)
\ No newline at end of file
diff --git a/regression/games/ninestones/emanuel-2.sgf b/regression/games/ninestones/emanuel-2.sgf
new file mode 100644 (file)
index 0000000..28c335b
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[19]HA[9]KM[5.5]PW[Humain]PB[Ordinateur]
+AB[dd][dj][dp][jd][jj][jp][pd][pj][pp]CA[UTF-8]
+;W[mp];B[pn];W[nj];B[pl];W[fq];B[fp];W[gp];B[fo];W[eq];B[dq]
+;W[mn];B[nh];W[dn];B[do];W[cn];B[em];W[go];B[fl];W[bp];B[lh]
+;W[jn];B[hq];W[gq];B[jr];W[kq];B[kr];W[lq];B[me];W[df];B[fd]
+;W[jf];B[hd];W[ff];B[ig];W[if];B[ce];W[ei];B[gi];W[hf];B[eg]
+;W[fg];B[dg];W[ef];B[fh];W[ec];B[ed];W[gc];B[fc];W[gd];B[ge]
+;W[he];B[fe];W[hg];B[od];W[mc];B[oq];W[rp];B[rn];W[qq];B[pr]
+;W[pq];B[rr];W[qr];B[or];W[op];B[oo];W[rs];B[gr];W[fr];B[np]
+;W[sr];B[lr];W[mr];B[hr];W[jq];B[iq];W[is];B[io];W[in];B[ms]
+;W[ns];B[gn];W[ho];B[hn];W[jo];B[ip];W[dr];B[cr];W[es];B[bq]
+;W[gs];B[kp];W[lo];B[nr];W[ls];B[mq];W[nq];B[hs];W[mq];B[ir]
+;W[ko];B[fs];W[cp];B[cq];W[lp];B[ep];W[ks];B[js];W[ms];B[gs]
+;W[il];B[ap];W[fn];B[fm];W[en];B[cl];W[gm];B[co]C[?]
+;W[hm];B[oi];W[qg];B[mk];W[qi];B[qj];W[qe];B[rc];W[rd];B[qd]
+;W[rf];B[ri];W[rh];B[rj];W[sg];B[bn];W[bm];B[cm];W[bo];B[ao]
+;W[pb];B[qb];W[pc];B[qc];W[nb];B[oa];W[hc];B[id];W[jb];B[ke]
+;W[hi];B[hj];W[jh];B[cf];W[ii];B[ij];W[gh];B[gf];W[fi];B[gj]
+;W[eh];B[kk];W[ch];B[cg];W[ci];B[cj];W[bj];B[bl];W[bh];B[ai]
+;W[aj];B[eb];W[ld];B[bg];W[ah];B[le];W[nd];B[pa];W[ob];B[ne]
+;W[na];B[md];W[lb];B[gb];W[se];B[ic];W[ib];B[hb];W[qa];B[kh]
+;W[jg];B[ra];W[nc];B[kc];W[kb];B[di];W[dh];B[cs];W[og];B[pf]
+;W[of];B[pe];W[pg];B[pa];W[oe];B[sb];W[pi];B[nn];W[ll];B[ml]
+;W[mm];B[kl];W[nm];B[no];W[ol];B[mj];W[ok];B[om];W[nl];B[lm]
+;W[ln];B[km];W[qm];B[pm];W[qn];B[qo];W[ro];B[rm];W[ni];B[oj]
+;W[nk];B[mi];W[mg];B[ng];W[nf];B[mf];W[oh];B[mh];W[kf];B[lg]
+;W[lc];B[qf];W[re];B[qp];W[pk];B[qk];W[ps];B[dm];W[ej];B[ek]
+;W[dk];B[ck];W[fk];B[dl];W[fj];B[ji];W[gl];B[so];W[sp];B[sn]
+;W[kd];B[jc];W[je];B[lf];W[gg];B[ia];W[ja];B[ha];W[cc];B[bd]
+;W[bc];B[cd];W[db];B[dc];W[ca];B[ba];W[ag];B[af];W[ae];B[bf]
+;W[bb];B[si];W[aa];B[ad];W[ab];B[ea];W[da];B[gk];W[jm];B[op]
+;W[os];B[qa];W[al];B[ak];W[bk];B[am];W[bi];B[ak];W[hk];B[ik]
+;W[al];B[jl];W[hl];B[ak];W[rl];B[ql];W[al];B[ph];W[qh];B[ak]
+;W[ee];B[al];W[de];B[ds];W[er];B[eo];W[gn];B[kn];W[ac];B[ie]
+;W[sd];B[sc];W[tt];B[oc];W[tt];B[oa];W[tt];B[sh];W[tt];B[mo]
+;W[tt];B[kg];W[tt];B[tt]
+TB[ae][an][aq][ar][as][be][bm][bo][bp][br][bs][cp][dk][ec][el]
+  [fa][fb][ga][gc][gd][hc][jk][ki][kj][li][lj][lk][ll][mg][on]
+  [po][qm][qn][rb][rk][rl][sa][sj][sk][sl][sm]
+TW[ai][ba][cb][fh][fs][gr][gs][hh][hn][hp][hq][hr][hs][ig][ih]
+  [im][io][ip][iq][ir][is][jp][jr][js][ka][kp][kr][la][lr][ma]
+  [mb][ph][qs][rg][rq][rr][sf][sq][ss]
+)
\ No newline at end of file
diff --git a/regression/games/ninestones/halti-gnugo-3.3.9-200210111409.sgf b/regression/games/ninestones/halti-gnugo-3.3.9-200210111409.sgf
new file mode 100644 (file)
index 0000000..4f97ecb
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[halti]WR[5k*]
+PB[GnuGo (GNU Go 3.3.9)]BR[11k*]
+PC[NNGS]DT[2002-10-11]AP[gnugoclient:2.0]
+RE[B+8.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nc];B[oc];W[nd];B[pf];W[fd];B[df];W[jf];B[fc];W[gc];B[ec];W[he]
+;B[ke];W[lg];B[gb];W[ic];B[ph];W[nf];B[pm];W[cn];B[dn];W[dm];B[en]
+;W[cq];B[dq];W[cp];B[nq];W[hp];B[io];W[gn];B[ho];W[go];B[gp];W[fp]
+;B[gq];W[fq];B[fr];W[gr];B[er];W[hq];B[em];W[dl];B[ir];W[do];B[eo]
+;W[co];B[fl];W[ep];B[dr];W[cr];B[qo];W[el];B[ob];W[nb];B[gm];W[fm]
+;B[hm];W[fn];B[fk];W[qe];B[pe];W[qf];B[rg];W[qg];B[qh];W[rf];B[rh]
+;W[rb];B[pg];W[rd];B[mj];W[ej];B[gd];W[hc];B[ge];W[gf];B[fe];W[ie]
+;B[ck];W[fj];B[dh];W[hk];B[il];W[hn];B[ik];W[in];B[jn];W[im];B[jm]
+;W[hl];B[hb];W[ib];B[hj];W[gj];B[bm];W[bn];B[am];W[jq];B[lq];W[kq]
+;B[kp];W[iq];B[lr];W[hi];B[jr];W[ci];B[di];W[bk];B[cl];W[ch];B[bg]
+;W[qq];B[pq];W[pr];B[or];W[rr];B[ps];W[qs];B[os];W[rp];B[qr];W[cj]
+;B[cg];W[pr];B[ek];W[cm];B[ij];W[dk];B[ro];W[sq];B[qr];W[lj];B[so]
+;W[lk];B[li];W[ki];B[lh];W[kh];B[kj];W[mg];B[ni];W[pr];B[qp];W[sp]
+;B[sr];W[ss];B[qr];W[kl];B[jl];W[pr];B[gi];W[qr];B[fi];W[gl];B[hh]
+;W[kf];B[ii];W[ha];B[fa];W[nh];B[mi];W[ip];B[jo];W[bh];B[ah];W[ai]
+;B[ag];W[bl];B[ff];W[gg];B[ei];W[gk];B[qc];W[rc];B[fg];W[oa];B[pa]
+;W[na];B[qb];W[ra];B[ig];W[if];B[jg];W[kg];B[kr];W[oh];B[oi];W[sg]
+;B[sh];W[sf];B[gh];W[hf];B[qa];W[hr];B[hd];W[id];B[hs];W[gs];B[is]
+;W[oe];B[jh];W[og];B[ga];W[ia];B[od];W[of];B[qd];W[ji];B[hg];W[mh]
+;B[]
+C[final_score: B+8.5
+F16 removed
+K16 removed
+L15 removed
+M10 removed
+L8 removed
+A7 removed
+E7 removed
+D4 removed]
+)
diff --git a/regression/games/ninestones/ninestones1.sgf b/regression/games/ninestones/ninestones1.sgf
new file mode 100644 (file)
index 0000000..5f955a3
--- /dev/null
@@ -0,0 +1,107 @@
+(;GM[1]FF[4]CA[UTF-8]AP[gGo:0.2]ST[1]GN[example]
+SZ[19]KM[0.0]
+PW[White]PB[Black]
+
+;AB[dd][dj][dp][jd][jj][jp][pd][pj][pp]
+;W[fc]
+;B[cf]
+;W[nc]
+;B[oc]
+;W[nd]
+;B[pf]
+;W[qh]
+;B[qf]
+;W[oh]
+;B[pm]
+;W[nq]
+;B[fq]
+;W[cn]
+;B[lq]
+;W[qq]
+;B[qp]
+;W[pq]
+;B[en]C[This kenuki of black makes white so happy.]
+;W[op]
+;B[bo]C[This move is just like the previous one]
+;W[qm]C[Now on the right side there are 7 white stones against 4 black 
+stones.]
+;B[pn]
+;W[ql]
+;B[rk]
+;W[pl]
+;B[ol]
+;W[qn]
+;B[oo]
+;W[ok]
+;B[pk]
+;W[nl]
+;B[om]
+;W[rp]
+;B[bm]C[Black makes yet another extra move on the lower left corner. As we 
+can see later, there is still some chance for white to move around.]
+;W[qo]
+;B[nk]
+;W[oj]
+;B[ml]
+;W[pi]
+;B[fe]
+;W[hd]
+;B[he]
+;W[ie]
+;B[eb]
+;W[id]
+;B[lc]
+;W[le]
+;B[me]
+;W[ld]
+;B[jc]
+;W[hb]
+;B[md]
+;W[mc]
+;B[kb]
+;W[od]
+;B[ob]
+;W[nb]
+;B[qc]
+;W[mf]
+;B[mb]
+;W[ma]
+;B[la]
+;W[lb]
+;B[hg]
+;W[kc]
+;B[lo]
+;W[em]C[Now let's see what happens here.]
+;B[dm]
+;W[fn]
+;B[fm]
+;W[el]
+;B[dn]
+;W[dl]
+;B[nj]
+;W[oi]
+;B[mh]C[Again black makes a 'pass' for the lower left corner.]
+;W[cj]
+;B[ci]
+;W[ck]
+;B[di]
+;W[cm]
+;B[co]
+;W[bl]
+;B[bn]
+;W[fk]
+;B[gn]
+;W[hk]
+;B[il]
+;W[gm]
+;B[ge]C[This kenuki really gives white a big chance.]
+;W[fo]
+;B[hn]
+;W[hl]
+;B[bi]
+;W[ik]
+;B[bj]
+;W[im]
+;B[jl]C[Now in normal cases, white will live without problem.]
+)
+
diff --git a/regression/games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf b/regression/games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf
new file mode 100644 (file)
index 0000000..0cfe02f
--- /dev/null
@@ -0,0 +1,27 @@
+(;FF[4]GM[1]SZ[19]HA[2]KM[0.5]PW[AdaGeek]WR[14k*]PB[GnuGo (GNU Go 3.1.18)]BR[14k*]PC[NNGS]DT[2002-01-07]RE[W+19.5]AB[pd][dp];W[oq];B[dd];W[fq];B[qq];W[po]\r
+;B[ro];W[qp];B[hq];W[rp];B[fp];W[gq];B[gp];W[eq];B[dq];W[ep];B[eo];W[hr];B[iq]\r
+;W[ir]C[K3];B[jr];W[jq]C[!L3];B[kq];W[jp];B[io];W[kr];B[rq];W[sq];B[sr];W[sp]C[!R5];B[qo]\r
+;W[pq];B[jd];W[cj];B[cn];W[cf];B[fd];W[bd];B[cc];W[qj];B[qg];W[qm];B[nc];W[fh]\r
+;B[hd];W[dh];B[qe];W[rh];B[rg];W[bc];B[er];W[fr];B[fs];W[gr];B[dr];W[jo]C[J6];B[ip]\r
+;W[in];B[fn];W[ho];B[hp];W[gn];B[fo];W[jm];B[pi];W[pj];B[ri];W[rj];B[qi];W[si]\r
+;B[lr];W[js]C[!M3];B[lq];W[sh];B[sg];W[qh];B[ph];W[sj];B[gg];W[gm]C[!J13];B[ig];W[fm]\r
+;B[hj];W[oj]C[!P14];B[of];W[dm]C[!N13];B[mg];W[dn];B[do];W[cm];B[bn];W[mj];B[kh];W[fj]\r
+;B[eg];W[fg];B[bb];W[ab];B[cb];W[cd];B[bm];W[bl];B[lo];W[de];B[nr];W[qr];B[nq]\r
+;W[np];B[ee];W[dc];B[ec];W[db];B[da];W[ed];B[eb];W[dd];B[fc];W[ba];B[mp];W[mr]\r
+;B[ls];W[no];B[kp];W[ko];B[mo];W[or];B[ff];W[eh];B[al];W[bk];B[ml];W[jj];B[mm]\r
+;W[hh];B[gh];W[gi];B[hi];W[hg];B[ii];W[gf];B[ie];W[ih];B[if];W[ge];B[ji];W[fe]\r
+;B[ns];W[gd];B[gc];W[jh];B[kj];W[li]C[L11];B[jg];W[ki];B[kl];W[kk];B[lh];W[mh];B[nh]\r
+;W[mi]C[O11|P12];B[lg];W[ng]C[P12|O11];B[nf];W[jl];B[lk];W[lj];B[km];W[kn];B[ln];W[ol];B[ni]\r
+;W[nj]C[P11];B[og];W[ca];B[ea];W[he];B[ic];W[am];B[an];W[es];B[ds];W[gs];B[om];W[nm]\r
+;B[nn];W[nl];B[pn];W[pm];B[oo];W[on];B[pp];W[op];B[so];W[po]C[L1|E7|G13|K9];B[mk];W[qp];B[oi]\r
+;W[qn];B[go];W[en];B[hn];W[hm];B[nk];W[ok];B[mn];W[rr];B[ak];W[aj];B[am];W[ks]\r
+;B[bp];W[os];B[ho];W[bq];B[br];W[hf];B[es];W[];B[]C[final_score: W+19.5\r
+E15 removed\r
+F14 removed\r
+E13 removed\r
+H11 removed\r
+R5 removed\r
+B3 removed\r
+R3 removed\r
+N2 removed\r
+T2 removed])\r
diff --git a/regression/games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf b/regression/games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf
new file mode 100644 (file)
index 0000000..640d76b
--- /dev/null
@@ -0,0 +1,41 @@
+(;FF[4]GM[1]SZ[19]HA[2]KM[0.5]PW[AdaGeek]WR[14k*]PB[GnuGo (GNU Go 3.1.18)]BR[14k*]PC[NNGS]DT[2002-01-07]RE[W+13.5]AB[pd][dp];W[oq];B[dd];W[fq];B[qq];W[po]\r
+;B[ro];W[cn];B[eo];W[cq];B[dq];W[cp];B[em];W[do];B[ep];W[hp];B[mq];W[or];B[jq]\r
+;W[iq];B[jp];W[jr];B[kr];W[is]C[!F7];B[fm];W[qn];B[rr];W[no];B[lo];W[rn]C[!T6];B[sn]\r
+;W[sm];B[qp];W[qo];B[sp];W[rl];B[jd];W[qf];B[qh];W[nc];B[pf];W[qe];B[qd];W[qg]\r
+;B[pg];W[rd];B[rc];W[se];B[rh];W[pe];B[oe];W[od];B[pb];W[ph];B[ne];W[rg]C[!S15];B[re]\r
+;W[rf];B[sg];W[oh]C[O13|P14];B[mb];W[of];B[mc];W[nf];B[me];W[mf];B[dj];W[le];B[md];W[ck]\r
+;B[cj];W[bk];B[fc];W[hn];B[if];W[kg];B[dk];W[dm];B[ce];W[mj];B[er];W[fr];B[bj]\r
+;W[dl];B[ih];W[el];B[cr];W[br];B[bs];W[aq];B[hm];W[im]C[!J6];B[in];W[gm];B[fl];W[hl]\r
+;B[fk];W[ek]C[E10];B[fj]C[L:8];W[ej];B[ei]C[L:7];W[fi];B[gi];W[fh]C[D12|D11|E12];B[hk]C[L:5];W[gh];B[hi]C[L:4]\r
+;W[eh];B[di]C[L:5];W[dh];B[bh]C[L:6];W[bg]C[!B11];B[bi];W[cg];B[fe]C[L:7];W[df];B[bf]C[L:8];W[de]\r
+;B[ag]C[L:7];W[cd];B[bd]C[L:6];W[cc];B[bc];W[cf];B[be]C[L:4];W[ed];B[dc];W[cb];B[bb]C[L:5]\r
+;W[ec];B[db]C[L:6];W[ca];B[eb]C[L:7];W[fd];B[ee];W[gd];B[ge]C[L:8];W[hd];B[he]C[L:7];W[fb]\r
+;B[ba];W[ic];B[fa];W[gb];B[id]C[L:8];W[jc];B[kd]C[L:9];W[kc];B[ld]C[L:7];W[hh];B[ak]C[L:8]\r
+;W[bm];B[jj]C[L:7];W[hg];B[ig];W[gf];B[lm]C[L:8];W[hf];B[ef]C[L:6];W[ah];B[af]C[L:7];W[ji]\r
+;B[ii];W[ik];B[io];W[ho];B[nm];W[hj];B[gk];W[ij];B[gj]C[L:8];W[lr];B[ks]C[L:5];W[mr]\r
+;B[jm];W[jl];B[lq]C[L:6];W[ko];B[kp]C[L:7];W[km];B[kn]C[L:6];W[jn];B[jo];W[jm];B[mn]C[L:7]\r
+;W[mo];B[mp]C[L:8];W[nq];B[kj];W[ll];B[ki]C[L:9];W[jh];B[kh];W[jg];B[lg]C[L:10];W[fn];B[en]C[L:5]\r
+;W[fo];B[dn]C[L:6];W[cm];B[co]C[L:7];W[bo];B[lf]C[L:8];W[mh];B[ch]C[L:9];W[al];B[oj];W[lh]\r
+;B[rj]C[L:7];W[pj];B[nk];W[ml];B[nl]C[L:8];W[mm];B[ln]C[L:6];W[nn];B[sc]C[L:7];W[sd];B[sh]C[L:8]\r
+;W[og];B[so];W[sq];B[rp]C[L:9];W[qs];B[jk]C[L:5];W[il];B[ea]C[L:6];W[ga];B[dg]C[L:7];W[lb]\r
+;B[js]C[L:8];W[ir];B[np];W[op];B[aj];W[li];B[kk]C[L:9];W[lj];B[kf]C[L:8];W[ls];B[kq]C[L:9]\r
+;W[fp];B[pm];W[pn];B[qk]C[L:7];W[pk];B[mg]C[L:8];W[ng];B[la]C[L:9];W[kb];B[fs]C[L:10];W[gs]\r
+;B[es];W[eq];B[cs];W[dr];B[ds];W[bp];B[ka];W[ja];B[ma];W[rs];B[ia];W[ib];B[lk]\r
+;W[mk];B[jf]C[L:9];W[ha];B[qm];W[rm];B[kl]C[L:10];W[gl];B[ql];W[qi];B[ni];W[nh];B[do]\r
+;W[ri];B[lc];W[ar];B[ip];W[as];B[dr];W[];B[gr];W[gq];B[hs];W[hq];B[gs];W[hr];B[]C[final_score: W+12.5\r
+C19 removed\r
+F17 removed\r
+O17 removed\r
+P16 removed\r
+M15 removed\r
+G14 removed\r
+T13 removed\r
+A12 removed\r
+O11 removed\r
+P10 removed\r
+S10 removed\r
+O9 removed\r
+R9 removed\r
+T6 removed\r
+S2 removed]\r
+)\r
diff --git a/regression/games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf b/regression/games/nngs/GoFuN-gnugo-3.3.21-200306202102.sgf
new file mode 100644 (file)
index 0000000..c44356f
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[GoFuN]WR[NR]
+PB[GnuGo (GNU Go 3.3.21)]BR[10k*]
+PC[NNGS]DT[2003-06-20]AP[gnugoclient:2.0]
+RE[W+2.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qd];W[of];B[qn];W[nc];B[fc];W[pb];B[nd];W[md];B[ne];W[me]
+;B[rb];W[qb];B[jf];W[nf];B[oc];W[nb];B[rc];W[re];B[ob];W[oa];B[mc]
+;W[mb];B[lc];W[lb];B[kb];W[kc];B[nj];W[ld];B[qh];W[nq];B[fq];W[qq]
+;B[pq];W[pr];B[or];W[qr];B[oq];W[nr];B[np];W[os];B[ce];W[qp];B[lp]
+;W[po];B[nn];W[op];B[mo];W[hq];B[hp];W[iq];B[ip];W[kr];B[co];W[cm]
+;B[em];W[dl];B[el];W[dk];B[ek];W[cj];B[di];W[ci];B[dg];W[ch];B[dh]
+;W[pn];B[qm];W[pm];B[pl];W[ol];B[pk];W[nm];B[ic];W[lm];B[jm];W[mk]
+;B[kh];W[jl];B[kl];W[km];B[kk];W[jn];B[im];W[ko];B[kp];W[in];B[hm]
+;W[hn];B[gp];W[gn];B[gm];W[gr];B[fr];W[fs];B[es];W[gs];B[dr];W[jb]
+;B[ib];W[ia];B[ha];W[ja];B[lr];W[ls];B[mq];W[ms];B[hb];W[rg];B[rh]
+;W[ro];B[mf];W[mg];B[rn];W[lf];B[bn];W[bm];B[cg];W[bg];B[bf];W[ah]
+;B[sg];W[sf];B[sh];W[cn];B[bo];W[en];B[pg];W[pf];B[fn];W[fo];B[fm]
+;W[eo];B[go];W[do];B[ep];W[jg];B[kg];W[kf];B[ke];W[if];B[je];W[ii]
+;B[af];W[fj];B[fi];W[gi];B[ik];W[fh];B[ei];W[jh];B[gh];W[hh];B[gg]
+;W[hg];B[gj];W[hi];B[hf];W[gf];B[fg];W[he];B[li];W[fd];B[ed];W[gd]
+;B[ff];W[ie];B[hj];W[gc];B[gb];W[fe];B[ee];W[kq];B[so];W[sp];B[sn]
+;W[nh];B[lq];W[jq];B[ln];W[kn];B[jc];W[ka];B[mj];W[oi];B[nk];W[ml]
+;B[qo];W[rp];B[gq];W[hr];B[ag];W[bh];B[am];W[bl];B[al];W[ak];B[an]
+;W[bk];B[lo];W[pi];B[qi];W[qg];B[ph];W[og];B[ji];W[lh];B[hd];W[lk]
+;B[hc];W[ge];B[oo];W[on];B[no];W[lj];B[mi];W[kj];B[ki];W[ll];B[jk]
+;W[lg];B[fb];W[nl];B[oh];W[ni];B[mh];W[le];B[oj];W[ng];B[fp];W[dn]
+;B[mr];W[mm];B[ij];W[om];B[dm];W[kd];B[jo];W[pp];B[ok];W[mn];B[ho]
+;W[io];B[id];W[];B[]C[final_score: W+2.5
+P18 removed
+S18 removed
+O16 removed
+Q16 removed
+F12 removed
+F10 removed
+K8 removed]
+)
diff --git a/regression/games/nngs/GoFuN-gnugo-3.4-200308030626.sgf b/regression/games/nngs/GoFuN-gnugo-3.4-200308030626.sgf
new file mode 100644 (file)
index 0000000..cc3264e
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[GoFuN]WR[NR]
+PB[GnuGo (GNU Go 3.4)]BR[8k*]
+PC[NNGS]DT[2003-08-03]AP[gnugoclient:2.0]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qd];W[of];B[qn];W[nc];B[fc];W[pb];B[nd];W[md];B[ne];W[me]
+;B[rb];W[nf];B[oc];W[nb];B[re];W[qb];B[ra];W[rc];B[qc];W[sb];B[rd]
+;W[sc];B[sd];W[rf];B[sa];W[sc];B[ob];W[oa];B[mc];W[mb];B[lc];W[lb]
+;B[kb];W[kc];B[pc];W[na];B[pa];W[ld];B[nj];W[nq];B[fq];W[nn];B[hd]
+;W[ql];B[pl];W[pm];B[qm];W[pk];B[ol];W[qj];B[on];W[ok];B[nm];W[nk]
+;B[jg];W[oj];B[pi];W[oi];B[jn];W[oo];B[no];W[mo];B[pq];W[np];B[po]
+;W[mm];B[jl];W[nl];B[ce];W[om];B[gk];W[im];B[kq];W[jm];B[km];W[kl]
+;B[kk];W[kn];B[ll];W[jo];B[in];W[io];B[hn];W[ho];B[ko];W[ln];B[co]
+;W[gn];B[hm];W[gm];B[il];W[hq];B[ir];W[hr];B[go];W[gp];B[fo];W[fp]
+;B[iq];W[eo];B[fn];W[en];B[fm];W[em];B[gl];W[ep];B[eq];W[hp];B[el]
+;W[cn];B[bn];W[cm];B[ck];W[bm];B[bo];W[lr];B[gr];W[hs];B[am];W[al]
+;B[an];W[bk];B[bj];W[do];B[cq];W[dl];B[ek];W[lp];B[jb];W[kp];B[rm]
+;W[ig];B[kf];W[jh];B[kh];W[jf];B[kg];W[je];B[ke];W[jc];B[ic];W[kd]
+;B[id];W[he];B[if];W[hf];B[ie];W[hh];B[ge];W[gf];B[ji];W[fe];B[gd]
+;W[eh];B[ch];W[df];B[cf];W[ih];B[fg];W[fh];B[ff];W[ee];B[gg];W[hg]
+;B[mf];W[la];B[sj];W[fj];B[gj];W[gi];B[dg];W[eg];B[de];W[ef];B[ei]
+;W[ec];B[ed];W[dh];B[fd];W[cg];B[ci];W[bg];B[fi];W[hj];B[ii];W[ae]
+;B[bf];W[af];B[hi];W[gh];B[fg];W[bd];B[dc];W[bb];B[mg];W[nh];B[mj]
+;W[db];B[eb];W[cb];B[qi];W[rh];B[rj];W[qk];B[ri];W[rl];B[sl];W[rp]
+;B[or];W[qr];B[qq];W[rq];B[pr];W[sr];B[qs];W[rs];B[rr];W[dq];B[ss]
+;W[cp];B[dr];W[bp];B[dp];W[rs];B[nr];W[qr];B[mr];W[lq];B[rr];W[bq]
+;B[ss];W[cr];B[cl];W[rs];B[ro];W[qr];B[ps];W[sp];B[rr];W[ib];B[qr]
+;W[hb];B[bl];W[gb];B[ak];W[mh];B[qg];W[rg];B[pg];W[pf];B[lh];W[ng]
+;B[le];W[pe];B[od];W[pn];B[ls];W[ks];B[ms];W[kr];B[fb];W[ap];B[di]
+;W[ah];B[mk];W[mi];B[li];W[ga];B[cc];W[bc];B[mq];W[mp];B[og];W[oh]
+;B[sf];W[sg];B[qh];W[rk];B[sk];W[ea];B[fa];W[da];B[se];W[ai];B[qa]
+;W[bh];B[lm];W[ml];B[al];W[bi];B[dk]C[game adjourned])
diff --git a/regression/games/nngs/GoFuN-gnugo-3.5.2gf1-200312230328.sgf b/regression/games/nngs/GoFuN-gnugo-3.5.2gf1-200312230328.sgf
new file mode 100644 (file)
index 0000000..bb5b9d2
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[13]HA[4]KM[0.5]
+PW[GoFuN]WR[NR]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-23]AP[gnugoclient:2.0]
+RE[W+9.5]
+AB[dd][jd][dj][jj]
+;W[kc];B[kd];W[jc];B[ic];W[ib];B[hc];W[hb];B[gc];W[ie];B[gb];W[lc]
+;B[ch];W[ig];B[kg];W[ji];B[kj];W[ki];B[ii];W[jh];B[hh];W[id];B[je]
+;W[jf];B[ek];W[fe];B[kf];W[ld];B[ke];W[ih];B[ed];W[eg];B[df];W[ei]
+;B[hj];W[gi];B[hi];W[fk];B[fl];W[gk];B[li];W[lh];B[lj];W[kh];B[hk]
+;W[gl];B[el];W[il];B[hl];W[hm];B[kl];W[ik];B[ij];W[ef];B[gh];W[fi]
+;B[mh];W[mg];B[mi];W[lg];B[ha];W[jb];B[fm];W[gm];B[fd];W[dg];B[cg]
+;W[de];B[cf];W[ee];B[ce];W[di];B[ci];W[ej];B[ge];W[dk];B[dl];W[cj]
+;B[bi];W[bj];B[cl];W[bl];B[gf];W[ia];B[ga];W[hg];B[gj];W[fj];B[gg]
+;W[le];B[aj];W[ak];B[ai];W[jl];B[bm];W[ck];B[dm];W[dj];B[am];W[bk]
+;B[jk];W[im];B[hd];W[al];B[he];W[if];B[dh];W[eh];B[fg];W[cm];B[bm]
+;W[am];B[fh];W[cm];B[hf];W[em];B[ff];W[km];B[ll];W[lm];B[ml];W[jm]
+;B[mm];W[];B[]C[final_score: W+9.5
+K10 removed])
diff --git a/regression/games/nngs/Jion-gnugo-3.3.2-200205241928.sgf b/regression/games/nngs/Jion-gnugo-3.3.2-200205241928.sgf
new file mode 100644 (file)
index 0000000..6c7b78c
--- /dev/null
@@ -0,0 +1,56 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Jion]WR[8k*]
+PB[GnuGo (GNU Go 3.3.2)]BR[13k*]
+PC[NNGS]DT[2002-05-24]AP[gnugoclient:2.0]
+RE[W+51.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[eq];B[dq];W[qo];B[ep];W[oc];B[pc];W[ce];B[od];W[qp];B[cd];W[fq]
+;B[de];W[cf];B[bd];W[pq];B[dr];W[hq];B[nc];W[qf];B[go];W[ho];B[hm]
+;W[cn];B[bo];W[ck];B[cj];W[eg];B[bk];W[dl];B[fj];W[fc];B[ff];W[ic]
+;B[jc];W[db];B[af];W[qb];B[ib];W[hc];B[ge];W[he];B[hf];W[ie];B[kf]
+C[L:5];W[ef];B[df]C[L:6];W[ee];B[ed]C[L:5];W[fe];B[fd]C[L:6];W[gd]
+;B[gf]C[L:5];W[gh];B[if];W[je];B[ke];W[jf];B[ih];W[ig];B[hg]C[L:6]
+;W[jg];B[hh];W[gj];B[rc];W[ob];B[dg]C[L:5];W[fh];B[gk]C[L:6];W[hj]
+;B[gp];W[gq];B[ir];W[hp];B[op];W[kg];B[oq]C[L:7];W[pr];B[or]C[L:8]
+;W[ji];B[gi];W[dh];B[ii]C[L:5];W[ij];B[jk]C[L:3];W[hk];B[gl]C[L:4]
+;W[il];B[im]C[L:3];W[jl];B[kl]C[L:4];W[jm];B[fi]C[L:2];W[lo];B[km]
+;W[jn];B[cl]C[L:1];W[hi];B[jh]C[L:2];W[ki];B[kh];W[li];B[lh]C[L:3]
+;W[mi];B[lg]C[L:2];W[lf];B[kk];W[mf];B[id]C[L:1];W[hd];B[hb]C[L:0]
+;W[gc];B[ik];W[hl];B[nh]C[L:1];W[mh];B[mg]C[L:0];W[kd];B[le];W[me]
+;B[ng];W[ld];B[kn];W[gm];B[in];W[jo];B[io];W[ko];B[ip];W[gn];B[kr]
+;W[mr];B[hn]C[L:1];W[fp];B[fo]C[L:2];W[eo];B[fn]C[L:3];W[fm];B[en]
+C[L:1];W[do];B[em]C[L:2];W[fl];B[el]C[L:3];W[fk];B[ek]C[L:4];W[cm]
+;B[dk]C[L:5];W[iq];B[jq];W[hr];B[lq]C[L:6];W[mq];B[mp];W[lp];B[lr]
+C[L:5];W[mo];B[np]C[L:6];W[ml];B[jb]C[L:7];W[lb];B[ch]C[L:8];W[is]
+;B[ms]C[L:9];W[jr];B[on];W[kq];B[os];W[ks];B[ol]C[L:10];W[mk];B[mc]
+;W[lc];B[ma]C[L:9];W[rb];B[la]C[L:7];W[ka];B[kb];W[mb];B[rd];W[pb]
+;B[ql];W[ni];B[cb]C[L:8];W[qi];B[eb]C[L:7];W[qj];B[fb]C[L:2];W[pm]
+;B[rn];W[qn];B[rl]C[L:3];W[pl];B[qm]C[L:4];W[qk];B[ro]C[L:5];W[rp]
+;B[pk]C[L:6];W[pn];B[sm];W[nf];B[pf]C[L:7];W[og];B[oh]C[L:5];W[pg]
+;B[oi]C[L:4];W[pi];B[oj]C[L:5];W[om];B[nm]C[L:6];W[nl];B[si]C[L:7]
+;W[ok];B[nj]C[L:8];W[mj];B[di]C[L:9];W[rk];B[so]C[L:10];W[sk];B[sl]
+;W[rf];B[sp];W[rq];B[ja];W[nb];B[gb];W[mm];B[of];W[qe];B[qg];W[ph]
+;B[eh];W[rg];B[sq];W[rr];B[er];W[fr];B[sr];W[rs];B[nk];W[ol];B[dm]
+;W[ec];B[dc];W[na];B[ka];W[es];B[ds];W[fs];B[ss];W[];B[kc];W[];B[]
+C[C6 removed
+D5 removed
+C14 removed
+D18 removed
+T11 removed
+R13 removed
+Q14 removed
+Q16 removed
+S16 removed
+N17 removed
+L8 removed
+J6 removed
+M2 removed
+N1 removed
+P4 removed
+P6 removed
+O7 removed
+F12 removed
+E13 removed
+final_score: W+51.5]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf
new file mode 100644 (file)
index 0000000..d093075
--- /dev/null
@@ -0,0 +1,37 @@
+(;FF[4]GM[1]SZ[19]HA[9]KM[0.5]PW[Lazarus]WR[7k*]PB[GnuGo (GNU Go 3.1.17)]BR[14k*]PC[NNGS]DT[2001-12-30]RE[W+89.5]AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]\r
+;W[cf];B[ce];W[df];B[fd];W[ci];B[cj];W[bj]C[B9];B[bf];W[bg];B[bk];W[cc]C[B15|B16];B[dc]\r
+;W[cd]C[B15|B16];B[de];W[db];B[ae];W[fc];B[eh];W[dh];B[ef];W[bh];B[dg];W[cg];B[eb];W[cb]\r
+;B[aj];W[eg];B[bd];W[ec];B[fb];W[gc];B[gb];W[gd];B[bb];W[ee];B[ed];W[fe];B[be]\r
+;W[ff];B[fq];W[hb];B[bc];W[md];B[pf];W[jf];B[qn];W[nq];B[or];W[qq];B[pq];W[ro]\r
+;B[rn];W[qo];B[po];W[qr];B[rp];W[qp];B[so];W[rq];B[sp];W[sq];B[sn];W[pn]C[#Other moves possible.\r
+R8];B[co]\r
+;W[qm];B[pm];W[on];B[rm];W[ql];B[rl];W[qk];B[rk];W[qj];B[rj];W[ri]C[!Q8];B[pl];W[qi]C[!P5]\r
+;B[oo];W[nn];B[mr];W[pr]C[!Q1];B[ps];W[oq];B[nr];W[kq];B[jq];W[kp];B[kr];W[mq];B[pk]\r
+;W[pi];B[oi];W[oj];B[nk];W[nj];B[mj];W[ni];B[ml];W[oh];B[qs];W[no];B[oc];W[lm]\r
+;B[rr];W[op];B[in];W[ok];B[ol];W[om];B[nl];W[kl];B[fh];W[lj];B[ki];W[li];B[hl]\r
+;W[im];B[hm];W[io];B[jo];W[jn];B[hn];W[hp];B[hh];W[ko]C[!H2];B[hr];W[fp];B[eq];W[jr]\r
+;B[ir];W[lr];B[js];W[ls];B[mb];W[qe];B[le];W[me];B[hc];W[ib];B[kb];W[jc];B[id]\r
+;W[he];B[qd];W[rd];B[qf];W[rf];B[ld];W[kc];B[ke];W[lc]C[N17];B[lb];W[mc];B[hd];W[ge]C[!J15]\r
+;B[ie];W[if];B[mf];W[kh];B[lf];W[nf];B[rc];W[oe];B[pe];W[re];B[jh];W[kg];B[rg]\r
+;W[qg];B[jm];W[qb];B[rb];W[ob];B[pb];W[nb];B[nc];W[kn];B[pg];W[qh];B[bi];W[jk]\r
+;B[ik];W[ij];B[lk];W[ii];B[hi];W[hk];B[gk];W[il];B[ih];W[ji];B[jb];W[ic];B[sd]\r
+;W[sg];B[di];W[gl];B[gp];W[gn];B[gm];W[fl];B[hj];W[fm]C[J9];B[go];W[ho];B[ik]C[L:9]\r
+;W[ij];B[dm]C[L:10];W[gq];B[gr];W[fo];B[fk];W[dl];B[el];W[em];B[ek];W[dn];B[cm];W[cn]\r
+;B[bn];W[bm];B[bo];W[cl];B[ii];W[ik];B[hq];W[do];B[ch];W[dg];B[gp];W[an];B[ao]\r
+;W[am]C[#E4 better than C4, if must defend.\r
+!C4];B[cp];W[kj];B[ji];W[gg];B[se];W[rh];B[ks];W[gh];B[gi];W[ga];B[da];W[og]\r
+;B[fg];W[hg];B[nd];W[ne];B[ep];W[od];B[pc];W[fa];B[ca];W[ja];B[eo];W[ka];B[na]\r
+;W[en];B[bl];W[ia];B[al];W[ma];B[oa];W[nb];B[ob];W[la];B[nb];W[cm];B[ip];W[sc]\r
+;B[ra];W[sf];B[sb];W[sd];B[ci];W[ah];B[ea];W[ha];B[ai];W[jg];B[dk];W[ig];B[fj]\r
+;W[go];B[gq];W[ef];B[ck];W[af];B[ag];W[of];B[af];W[ph];B[]C[S8 removed\r
+R1 removed\r
+S2 removed\r
+P2 removed\r
+O8 removed\r
+N10 removed\r
+M9 removed\r
+K7 removed\r
+M15 removed\r
+J16 removed\r
+R18 removed\r
+final_score: W+89.5])\r
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf
new file mode 100644 (file)
index 0000000..0d1077a
--- /dev/null
@@ -0,0 +1,39 @@
+(;FF[4]GM[1]SZ[19]HA[9]KM[0.5]PW[Lazarus]WR[7k*]PB[GnuGo (GNU Go 3.1.18)]BR[14k*]PC[NNGS]DT[2002-01-07]RE[W+23.5]AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]\r
+;W[qn];B[nq];W[pg];B[nd];W[fc];B[ec];W[fd];B[df];W[cc]C[E18|D17];B[cd];W[eb];B[db];W[dc]\r
+;B[cb];W[ed];B[bc];W[cg];B[ro];W[oq];B[op];W[qp];B[qo];W[pq]C[#other moves possible.\r
+O2];B[qq];W[qr];B[nr]\r
+;W[rq];B[or];W[sr];B[rs];W[rp];B[pr];W[so];B[rn];W[rm];B[qm];W[sn];B[pn];W[rl]\r
+;B[rj];W[pl];B[ql];W[qk]C[!Q9|S9];B[pk];W[qj];B[rk];W[qi];B[sl];W[ol];B[dg];W[sp]C[T7]\r
+;B[qs];W[sm];B[ri];W[qq];B[rr];W[sk];B[qh];W[pi];B[ph];W[oi];B[mp];W[no];B[np]\r
+;W[oh];B[qg];W[rh];B[rg];W[qe];B[qd]C[L:7];W[pf];B[re]C[L:8];W[rf];B[sf]C[L:7];W[sh];B[sg]C[L:8]\r
+;W[qf];B[si];W[rd]C[T15];B[hc];W[se];B[ge]C[L:9];W[fe]C[G14];B[ff]C[L:7];W[hb]C[J18];B[gb]C[L:6]\r
+;W[gc];B[ib]C[L:5];W[hd]C[J17];B[ha]C[L:4];W[he]C[G14];B[if]C[L:5];W[ic]C[H18];B[jc]C[L:4];W[hb];B[cm]C[L:5]\r
+;W[jb];B[ia];W[kb];B[lb];W[kc];B[kd]C[L:4];W[lc];B[ld];W[mc];B[gf]C[L:5];W[hf];B[fq]C[L:6]\r
+;W[cp];B[co]C[L:7];W[cq];B[md]C[L:5];W[ig];B[jf];W[jg];B[lf]C[L:6];W[gg];B[nf]C[L:7];W[oe]\r
+;B[od]C[L:5];W[ne];B[me]C[L:6];W[ng];B[hh]C[L:7];W[hg];B[eh]C[L:8];W[rh];B[jm]C[L:6];W[sh];B[ko]C[L:5]\r
+;W[gq];B[nb]C[L:6];W[hc];B[mb]C[L:7];W[ja];B[rc]C[L:8];W[nc];B[oc]C[L:9];W[ga];B[bo]C[L:10];W[dq]\r
+;B[gp]C[L:8];W[ep];B[er]C[L:7];W[hq];B[fp]C[L:6];W[do];B[hp]C[L:7];W[cj];B[ck]C[L:6];W[dk];B[ej]\r
+;W[bk];B[cl];W[ci];B[bl]C[L:7];W[bi];B[sc]C[L:8];W[el];B[ak];W[aj];B[ii]C[L:6];W[al];B[bg]C[L:7]\r
+;W[bh];B[gh]C[L:8];W[fg];B[di]C[L:9];W[en];B[am]C[L:6];W[an];B[ak]C[L:5];W[oo];B[ch]C[L:3];W[al]\r
+;B[bn]C[L:4];W[bm];B[aq];W[am];B[po]C[L:5];W[dh];B[ee]C[L:6];W[bf];B[nm]C[L:7];W[nl];B[ml]\r
+;W[om];B[on];W[mm];B[nn];W[lm];B[jk];W[lk];B[gl];W[fh];B[fi];W[eg];B[ef];W[gm]\r
+;B[hm];W[ei];B[gj];W[ek];B[fj];W[hl];B[gn]C[L:5];W[fm];B[il]C[L:6];W[hk];B[in]C[L:7];W[gk]\r
+;B[pm]C[L:8];W[mk];B[ec]C[L:9];W[lg];B[dr]C[L:10];W[cr];B[cs];W[bs];B[ds];W[eq];B[gr]C[L:9]\r
+;W[br];B[dc]C[L:10];W[lo]C[N5];B[lp];W[mo];B[kg];W[lh];B[kh];W[ki];B[jh];W[ih]C[H10];B[ji]\r
+;W[kj];B[hj];W[ad];B[fk];W[fl];B[ac];W[be]C[!N6];B[mn];W[ln];B[ea];W[fb];B[fo];W[eo]\r
+;B[kl];W[ll];B[mg];W[mh];B[mf];W[of];B[ik];W[gl];B[bd];W[ce];B[de];W[ae];B[sd]\r
+;W[ie];B[je];W[la];B[kn];W[ma];B[ob];W[na];B[oa];W[ka];B[eh];W[ch]C[S15];B[ei];W[cf]\r
+;B[re];W[fs]C[F2];B[gs];W[rd];B[km];W[kk];B[re];W[fr];B[es];W[rd];B[fn];W[re];B[gd]\r
+;W[jq];B[id];W[hr];B[pe];W[lr];B[kq];W[hs];B[fr];W[ip];B[da];W[fa];B[ps];W[kr]\r
+;B[ir];W[jr];B[iq];W[is];B[iq];W[io];B[ho];W[ir];B[ss];W[lq];B[ls];W[kp];B[jo]\r
+;W[ms];B[kq];W[ns];B[kp];W[sj];B[sq];W[qc];B[rb];W[qb];B[qa];W[sr]C[!N2];B[mr];W[sq]\r
+;B[]C[K2 removed\r
+J4 removed\r
+O1 removed\r
+A3 removed\r
+B5 removed\r
+C8 removed\r
+B13 removed\r
+R17 removed\r
+Q10 removed\r
+final_score: W+22.5])\r
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf
new file mode 100644 (file)
index 0000000..42a89b7
--- /dev/null
@@ -0,0 +1,54 @@
+(;GM[1]FF[3]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]
+WR[7k*]
+PB[GnuGo (GNU Go 3.1.19)]
+BR[14k*]PC[NNGS]
+DT[2002-01-09]
+AP[gnugoclient:2.0]
+RE[W+120.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp];W[qn];B[qo];W[pn];B[np];W[qq];
+B[pq];W[ro];B[rp];W[qp];B[rq];W[po];B[qr];W[qo];B[qf];W[rr];B[sr];
+W[rs];B[qs];W[pr];B[ss];W[oq];B[op];W[nq];B[mq]C[L:8];W[mr];B[lq]
+C[L:7];W[lr];B[or];W[nr];B[ps]C[L:8];W[kq];B[kp]C[L:9];W[jq];B[ql];
+W[db];B[om]C[L:8];W[mp];B[on];W[oo];B[no];W[nn];B[lp]C[L:7];W[mo];
+B[pr]C[L:8];W[mn];B[sp];W[pm];B[nm]C[L:7];W[pl];B[rm];W[qk];B[rk];
+W[qj];B[pk]C[L:5];W[ol];B[mm]C[L:6];W[ln];B[km]C[L:7];W[lm];B[nk];
+W[ok];B[mk]C[L:5];W[oj];B[pi];W[qi];B[nh];W[ni];B[ph]C[L:6];W[qh];
+B[oc]C[L:7];W[pg];B[oh]C[L:6];W[mi];B[cn]C[L:7];W[lk];B[ll]C[L:6];
+W[ml];B[nl]C[L:5];W[kl];B[lj];W[kn];B[kk]C[L:4];W[jm];B[ip];W[qg];
+B[nf]C[L:5];W[ob];B[rf];W[qc];B[pb];W[nb];B[pc]C[L:6];W[qb];B[ir];
+W[iq];B[in];W[hp];B[pa];W[of];B[ne];W[qd];B[qa]C[L:7];W[ng];B[mg]
+C[L:5];W[og];B[mh]C[L:6];W[qe];B[rg];W[pe];B[oe];W[pf];B[mb]C[L:7];
+W[li];B[eq]C[L:8];W[er];B[hr]C[L:5];W[hq];B[gq];W[cq];B[gn]C[L:3];
+W[go];B[dr];W[dq];B[cr]C[L:2];W[ep];B[fq]C[L:0];W[do];B[fo]C[L:1];
+W[hn];B[im];W[il];B[cp]C[L:0];W[co];B[bp]C[L:1];W[fn];B[hm];W[gm];
+B[hl]C[L:2];W[ik];B[hk];W[ij];B[en]C[L:1];W[eo];B[ii];W[hj];B[fk];
+W[kh];B[ki];W[lh];B[fp];W[bo];B[kf]C[L:2];W[jg];B[ra];W[bq];B[dn]
+C[L:0];W[em];B[bn]C[L:1];W[ap];B[hi]C[L:2];W[gj];B[fl];W[fm];B[bb]
+C[L:3];W[cl];B[ck]C[L:4];W[bl];B[an];W[bk];B[bd]C[L:2];W[fi];B[jf];
+W[hg];B[fg];W[jh];B[ji]C[L:3];W[eh];B[gh];W[if];B[df];W[ch];B[eg]
+C[L:4];W[gc];B[mc];W[id];B[ic];W[hd];B[hb]C[L:3];W[jc];B[jb]C[L:2];
+W[je];B[kc]C[L:1];W[ke];B[lf];W[cc];B[fb];W[gb];B[bc];W[cd];B[ga];
+W[fc];B[ih]C[L:2];W[ig];B[ec]C[L:0];W[eb];B[ed]C[L:1];W[cf];B[fa]
+C[L:2];W[gf];B[dm];W[dl];B[cb];W[dc];B[ce]C[L:3];W[ee];B[fd]C[L:4];
+W[de];B[fe]C[L:5];W[be];B[ff];W[so];B[da]C[L:6];W[ce];B[ea]C[L:7];
+W[rj];B[rl]C[L:8];W[ld];B[cg];W[bg];B[dg]C[L:9];W[dh];B[kd]C[L:8];
+W[le];B[jr]C[L:9];W[kr];B[rb];W[el];B[rc]C[L:8];W[sk];B[sm]C[L:9];
+W[qm];B[sd];W[mj];B[nj]C[L:10];W[oi];B[jk];W[jl];B[rh];W[rn];B[he];
+W[ie];B[ge];W[br];B[fr];W[es];B[fs];W[nd];B[mf];W[md];B[od];W[nc];
+B[lc];W[re];B[se];W[sf];B[rd];W[sj];B[sl];W[sb];B[ae];W[oa];B[bh];
+W[bi];B[af];W[bf];B[bs];W[ar];B[hc];W[sh];B[sg];W[sn];B[si];W[ri];
+B[rl];W[sh];B[sf];W[sc];B[gd];W[lg];B[cs];W[ql];B[ks];W[ls];B[js];
+W[me];B[fj];W[gi];B[ns];W[si];B[ma];W[kg];B[gg];W[hf];B[hh];W[fh];
+B[ef]C[L:8];W[ah];B[na]C[L:9];W[sa];B[gp]C[L:10];W[ag];B[ad];W[as];
+B[ds];W[tt];B[ho];W[io];B[os];W[ho];B[ms];W[jo];B[tt]
+C[final_score: W+120.5
+D10 removed
+F10 removed
+C9 removed
+H9 removed
+S8 removed
+D7 removed
+J4 removed]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf
new file mode 100644 (file)
index 0000000..203ffd4
--- /dev/null
@@ -0,0 +1,53 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]WR[7k*]
+PB[GnuGo (GNU Go 3.1.31)]BR[13k*]
+PC[NNGS]DT[2002-04-12]AP[gnugoclient:2.0]
+RE[W+30.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nd];W[pm];B[np];W[nj];B[gc];W[fq];B[eq];W[fp];B[dn];W[fn]
+;B[hq];W[of];B[gm]C[L:8];W[fm];B[dl]C[L:9];W[mq];B[nq];W[mp];B[mo]
+C[L:10];W[kp];B[kq]C[L:8];W[lo];B[ln]C[L:6];W[mn];B[no]C[L:7];W[kn]
+;B[mr]C[L:8];W[lm];B[re]C[L:9];W[cl];B[go]C[L:6];W[fo];B[gn]C[L:7]
+;W[fl];B[cm];W[ck];B[er]C[L:5];W[dk];B[ek]C[L:6];W[el];B[dm]C[L:5]
+;W[cj];B[mf];W[oc];B[od];W[nc];B[pc];W[kc];B[jc];W[kd];B[md];W[mc]
+;B[ob]C[L:6];W[kf];B[je];W[ke];B[ig];W[qb];B[pb];W[qe];B[lg];W[kg]
+;B[rd]C[L:4];W[qd];B[rf]C[L:5];W[qg];B[qc]C[L:6];W[lh];B[ng]C[L:5]
+;W[og];B[oh]C[L:6];W[ph];B[fr]C[L:7];W[qq];B[ej]C[L:6];W[hl];B[qp]
+;W[rp];B[ro]C[L:7];W[rr];B[sp];W[jq];B[rq]C[L:5];W[ip];B[hj];W[gl]
+;B[ch]C[L:6];W[ci];B[dh]C[L:7];W[bh];B[bg];W[di];B[bi]C[L:5];W[ei]
+;B[fj]C[L:6];W[eg];B[kh];W[jh];B[ki];W[if];B[jf]C[L:5];W[jg];B[hg]
+;W[hf];B[gf];W[hh];B[eh];W[fi];B[gj]C[L:4];W[ih];B[gg]C[L:2];W[mi]
+;B[bm]C[L:3];W[gh];B[jo]C[L:4];W[iq];B[gq]C[L:5];W[io];B[rj]C[L:6]
+;W[oj];B[nh]C[L:7];W[pi];B[pk]C[L:6];W[ri];B[ol]C[L:7];W[nl];B[oi]
+C[L:8];W[om];B[rl]C[L:7];W[rm];B[qj];W[qi];B[rh];W[si];B[sm]C[L:8]
+;W[rn];B[sn]C[L:9];W[ql];B[rg]C[L:8];W[rk];B[sj]C[L:9];W[sl];B[pg]
+;W[qh];B[pf]C[L:10];W[pe];B[oe];W[ok];B[pg]C[L:9];W[pl];B[sh]C[L:8]
+;W[fh];B[qr];W[gp];B[fg]C[L:9];W[cg];B[ah];W[dg];B[bh]C[L:6];W[bf]
+;B[cf]C[L:5];W[df];B[ce]C[L:6];W[ge];B[ee]C[L:7];W[ff];B[lr]C[L:8]
+;W[cc];B[bd];W[dc];B[bb]C[L:9];W[ec];B[de]C[L:6];W[fc];B[fb]C[L:7]
+;W[gd];B[hc]C[L:5];W[eb];B[nb]C[L:6];W[lb];B[jr]C[L:7];W[ir];B[js]
+C[L:8];W[bc];B[ac]C[L:9];W[cb];B[fe]C[L:7];W[fd];B[mh]C[L:8];W[li]
+;B[mb]C[L:9];W[lc];B[so]C[L:8];W[ak];B[ab]C[L:9];W[am];B[ba]C[L:8]
+;W[bn];B[cq]C[L:9];W[co];B[do];W[bp];B[bq]C[L:8];W[aq];B[ar]C[L:9]
+;W[ap];B[br];W[hp];B[is]C[L:7];W[gr];B[gs]C[L:8];W[hr];B[hs]C[L:9]
+;W[lp];B[bl]C[L:10];W[al];B[bk]C[L:8];W[bj];B[be]C[L:9];W[aj];B[lf]
+;W[lq];B[kr];W[le];B[cp];W[an];B[ef];W[fg];B[me]C[L:10];W[nn];B[qn]
+;W[oo];B[pn];W[on];B[qm];W[op];B[oq];W[ma];B[na];W[la];B[po];W[cn]
+;B[rl];W[rm];B[ca];W[da];B[rn];W[rl];B[ep];W[ni];B[ld];W[af];B[ae]
+;W[ai];B[ag];W[kj];B[ed];W[gb];B[cd];W[];B[en];W[];B[em];W[];B[eo]
+;W[];B[pf];W[];B[qk];W[];B[sk];W[];B[]
+C[final_score: W+30.5
+F18 removed
+R18 removed
+G17 removed
+K17 removed
+P14 removed
+L12 removed
+D10 removed
+K10 removed
+G7 removed
+K5 removed
+R3 removed
+S2 removed]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf
new file mode 100644 (file)
index 0000000..b38f1c6
--- /dev/null
@@ -0,0 +1,63 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]WR[7k*]
+PB[GnuGo (GNU Go 3.1.31)]BR[13k*]
+PC[NNGS]DT[2002-04-14]AP[gnugoclient:2.0]
+RE[W+9.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nq];B[oq];W[np];B[pn];W[gp];B[dn];W[jn];B[qg];W[cf];B[df];W[dg]
+;B[ef];W[ce];B[cd];W[eg];B[fd];W[dl];B[fn];W[eo];B[mc];W[do];B[co]
+;W[cn];B[cm];W[bn];B[ko]C[L:5];W[nn];B[bo]C[L:6];W[dm];B[en]C[L:5]
+;W[bm];B[fj]C[L:6];W[cp];B[pl]C[L:4];W[kn];B[dq]C[L:5];W[cq];B[or]
+C[L:6];W[qj];B[qk];W[qi];B[nr];W[lq];B[jc]C[L:7];W[pi];B[cr]C[L:6]
+;W[bp];B[er];W[br];B[fg];W[fh];B[gg];W[ei];B[ch];W[cg];B[bi]C[L:4]
+;W[ck];B[ej];W[gh];B[hh]C[L:5];W[gi];B[hj]C[L:6];W[gj];B[gk]C[L:4]
+;W[fk];B[bk]C[L:2];W[cj];B[gl]C[L:3];W[fl];B[fm]C[L:4];W[el];B[gr]
+;W[fp];B[ir]C[L:5];W[hk];B[gn]C[L:4];W[ho];B[hl]C[L:5];W[ik];B[ij]
+C[L:6];W[jk];B[ng]C[L:7];W[oj];B[lj]C[L:8];W[kk];B[pk];W[kj];B[oi]
+C[L:6];W[oh];B[rk]C[L:5];W[hg];B[ih];W[hf];B[ge]C[L:6];W[kg];B[ig]
+C[L:5];W[ni];B[mh]C[L:6];W[og];B[nk]C[L:7];W[nf];B[mf]C[L:6];W[nh]
+;B[nl];W[mg];B[lh];W[kh];B[pe];W[hq];B[ki]C[L:4];W[ji];B[li]C[L:5]
+;W[jh];B[lg]C[L:6];W[lf];B[me]C[L:3];W[ii];B[si]C[L:4];W[mj];B[kf]
+C[L:5];W[lk];B[le]C[L:6];W[mk];B[hi]C[L:7];W[hr];B[ds]C[L:4];W[fs]
+;B[iq]C[L:2];W[lo];B[hs]C[L:1];W[gs];B[kr];W[lr];B[eq]C[L:2];W[is]
+;B[js]C[L:0];W[hs];B[bd]C[L:1];W[di];B[rh]C[L:2];W[be];B[mm]C[L:3]
+;W[lm];B[mn]C[L:4];W[ln];B[mo]C[L:5];W[mp];B[no]C[L:6];W[ad];B[ac]
+C[L:7];W[ae];B[bb]C[L:8];W[qc];B[rd];W[nb];B[pc]C[L:9];W[pb];B[rc]
+C[L:10];W[rb];B[sb]C[L:8];W[nc];B[mb]C[L:9];W[pf];B[ra]C[L:8];W[qa]
+;B[oa]C[L:7];W[na];B[qf]C[L:8];W[de];B[ee]C[L:9];W[oe];B[nd]C[L:10]
+;W[ne];B[od]C[L:8];W[ml];B[ah]C[L:9];W[oo];B[bj]C[L:8];W[nm];B[dh]
+C[L:9];W[ci];B[po]C[L:10];W[om];B[pm];W[mr];B[pg];W[ns];B[os];W[ms]
+;B[rj];W[op];B[of];W[ff];B[gf];W[pf];B[ng];W[of];B[nj];W[mi];B[ok]
+;W[mg];B[lf];W[oi];B[ri];W[qq];B[pq];W[rp];B[qr];W[rr];B[rs];W[ng]
+;B[qh];W[on];B[ph];W[ol];B[]
+C[final_score: W+9.5
+O19 removed
+R19 removed
+Q18 removed
+S18 removed
+R17 removed
+F14 removed
+H14 removed
+L13 removed
+A12 removed
+C12 removed
+B11 removed
+D10 removed
+G9 removed
+C7 removed
+F7 removed
+B5 removed
+L5 removed
+D4 removed
+K4 removed
+S4 removed
+J3 removed
+R3 removed
+C2 removed
+G2 removed
+L2 removed
+S2 removed
+D1 removed
+K1 removed]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf
new file mode 100644 (file)
index 0000000..40752b0
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]WR[7k*]
+PB[GnuGo (GNU Go 3.1.32)]BR[13k*]
+PC[NNGS]DT[2002-04-15]AP[gnugoclient:2.0]
+RE[W+30.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qe];W[pf];B[nd];W[pm];B[np];W[nj];B[cn];W[fc];B[fd];W[gd]
+;B[fe];W[cf];B[ec];W[bd];B[gc];W[hc];B[fb];W[oc];B[od];W[nc];B[hd]
+;W[pc];B[ic];W[md];B[me];W[ld];B[qc];W[qb];B[rc];W[le];B[eq];W[ne]
+;B[rf];W[rg];B[sd];W[re];B[sf];W[pe];B[qd];W[rb];B[oi];W[ni];B[qo]
+;W[qh];B[ch];W[dg];B[kn];W[cl];B[dl];W[dm];B[ck];W[el];B[dk];W[cm]
+;B[dn];W[en];B[eo];W[fn];B[ho];W[fj];B[ph];W[mf];B[ql];W[qm];B[qi]
+;W[ok];B[rm];W[rn];B[rl];W[qn];B[rh];W[sg];B[qg];W[se];B[ro];W[so]
+;B[sp];W[sn];B[rq];W[bi];B[bh];W[bk];B[bm];W[bl];B[bn];W[mp];B[ci]
+C[L:5];W[bj];B[ei]C[L:3];W[fh];B[fk];W[ek];B[mo]C[L:2];W[jq];B[kq]
+;W[iq];B[kr]C[L:3];W[fq];B[ol]C[L:2];W[nl];B[gk]C[L:3];W[fi];B[pl]
+;W[om];B[nm]C[L:4];W[nn];B[mm];W[mn];B[fr]C[L:5];W[gq];B[hr]C[L:4]
+;W[lm];B[ml]C[L:5];W[nk];B[ll]C[L:6];W[km];B[hq]C[L:4];W[kl];B[lk]
+C[L:5];W[kk];B[jh]C[L:6];W[ln];B[lp]C[L:4];W[hm];B[lo]C[L:5];W[ig]
+;B[ji]C[L:4];W[hh];B[lj];W[nh];B[ik]C[L:5];W[kj];B[im]C[L:6];W[in]
+;B[ej]C[L:4];W[il];B[fp]C[L:5];W[ko];B[po]C[L:6];W[on];B[bb]C[L:7]
+;W[kb];B[jb]C[L:8];W[kc];B[ka]C[L:9];W[la];B[ja]C[L:10];W[lb];B[cd]
+;W[be];B[pg];W[og];B[io];W[go];B[jn]C[L:9];W[hn];B[jm];W[jl];B[jo]
+C[L:7];W[hl];B[gp]C[L:8];W[bc];B[cc]C[L:9];W[ab];B[ba]C[L:10];W[je]
+;B[he]C[L:8];W[ff];B[gf]C[L:9];W[gg];B[hf]C[L:10];W[if];B[ee];W[ef]
+;B[fo];W[gn];B[jc];W[sh];B[si];W[pk];B[qk];W[sm];B[ie];W[ke];B[sk]
+;W[am];B[an];W[oo];B[al];W[op];B[oq];W[nq];B[no];W[pq];B[or];W[pr]
+;B[nr];W[rr];B[qq];W[qr];B[sr];W[rp];B[sq];W[pn];B[qp];W[ak];B[mq]
+;W[am];B[de];W[df];B[al];W[rj];B[ri];W[am];B[em];W[fl];B[gl];W[fm]
+;B[al];W[oh];B[am];W[oj];B[pi];W[ac];B[sl];W[aa];B[db];W[ce];B[hg]
+;W[ih];B[kd];W[];B[]
+C[final_score: W+30.5
+H17 removed
+R17 removed
+G16 removed
+T16 removed
+B12 removed
+K12 removed
+E11 removed
+M10 removed
+S10 removed
+F9 removed
+J9 removed
+L5 removed
+F3 removed
+J3 removed
+Q3 removed]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf
new file mode 100644 (file)
index 0000000..cf1f92f
--- /dev/null
@@ -0,0 +1,53 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]WR[7k*]
+PB[GnuGo (GNU Go 3.1.34)]BR[13k*]
+PC[NNGS]DT[2002-04-27]AP[gnugoclient:2.0]
+RE[W+11.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fc];B[df];W[nd];B[pf];W[jf];B[cm];W[ch];B[cf];W[eh];B[qm]C[L:8]
+;W[db];B[mq]C[L:9];W[ff];B[gl]C[L:10];W[le];B[jb];W[ic];B[gq]C[L:8]
+;W[pc];B[qc]C[L:9];W[oc];B[qb]C[L:7];W[ph];B[qp]C[L:6];W[dq];B[eq]
+C[L:7];W[cq];B[jc]C[L:5];W[ie];B[id];W[hc];B[lc]C[L:4];W[mb];B[lj]
+C[L:5];W[cp];B[do]C[L:6];W[oq];B[no];W[qj];B[qk]C[L:5];W[qi];B[pr]
+;W[pk];B[oj]C[L:6];W[ql];B[rk];W[rl];B[pl];W[ok];B[sk]C[L:5];W[nj]
+;B[nk];W[ol];B[pm];W[nl];B[ni]C[L:6];W[mk];B[mj]C[L:4];W[oi];B[nk]
+C[L:2];W[rj];B[nj]C[L:3];W[sj];B[ml]C[L:4];W[mm];B[ll]C[L:5];W[nn]
+;B[mo]C[L:6];W[rm];B[lm];W[qe];B[pe]C[L:4];W[qf];B[rd]C[L:3];W[pg]
+;B[re]C[L:4];W[rf];B[bo]C[L:5];W[qd];B[er];W[co];B[bn];W[se];B[sc]
+C[L:4];W[rb];B[ra]C[L:5];W[qa];B[pa]C[L:6];W[pb];B[sb];W[oa];B[gj]
+C[L:7];W[ej];B[dk]C[L:6];W[dn];B[ek]C[L:5];W[en];B[ep]C[L:4];W[cn]
+;B[lg];W[lf];B[mg];W[of];B[bj]C[L:5];W[bp];B[cs];W[ds];B[dr]C[L:6]
+;W[bs];B[cr]C[L:7];W[br];B[aq]C[L:8];W[ao];B[bm]C[L:9];W[hp];B[fg]
+C[L:6];W[eg];B[ef]C[L:4];W[gp];B[gn]C[L:2];W[fo];B[lb]C[L:3];W[hq]
+;B[gr];W[kd];B[hd]C[L:4];W[gc];B[ap]C[L:5];W[ar];B[bh]C[L:6];W[hr]
+;B[gs]C[L:7];W[kq];B[hs];W[jq];B[lr]C[L:8];W[ip];B[ir]C[L:9];W[jo]
+;B[kp]C[L:8];W[hn];B[in]C[L:7];W[hm];B[gm]C[L:6];W[ln];B[mn]C[L:5]
+;W[jn];B[lp]C[L:6];W[im];B[ci]C[L:7];W[fh];B[gg];W[gh];B[iq]C[L:5]
+;W[hh];B[nm]C[L:6];W[sl];B[om]C[L:7];W[cg];B[bg]C[L:8];W[bc];B[hi]
+C[L:9];W[fe];B[qk]C[L:10];W[be];B[ce];W[bf];B[bd];W[ad];B[cc]C[L:8]
+;W[cb];B[af]C[L:9];W[cd];B[dg]C[L:10];W[dh];B[bd];W[qa];B[ae];W[rc]
+;B[bb];W[dc];B[cd];W[ro];B[rp];W[sp];B[sq];W[so];B[rr];W[km];B[an]
+;W[fj];B[ba];W[kg];B[ih];W[ig];B[ii];W[fk];B[gk];W[fl];B[qo];W[qn]
+;B[pn];W[rn];B[ed];W[fd];B[ec];W[eb];B[jh];W[kh];B[ca];W[mf];B[ng]
+;W[nf];B[ki];W[lh];B[lo];W[nh];B[mh];W[oh];B[rk];W[jl];B[ik];W[dl]
+;B[cl];W[kk];B[el];W[dm];B[em];W[go];B[fn];W[eo];B[lk];W[il];B[da]
+;W[fa];B[ea];W[fb];B[ee];W[gf];B[di];W[li];B[mi];W[kj];B[fm];W[ji]
+;B[ei];W[fi];B[jk];W[hk];B[ij];W[hl];B[kl];W[ki];B[kn];W[jm];B[jg]
+;W[kf];B[ko];W[fp];B[fq];W[bq];B[ao];W[sk];B[pk];W[pi];B[hj];W[hg]
+;B[og];W[];B[gi];W[];B[]
+C[final_score: W+11.5
+S19 removed
+K18 removed
+M18 removed
+T18 removed
+B17 removed
+A16 removed
+Q16 removed
+S16 removed
+J6 removed
+O6 removed
+K3 removed
+P3 removed
+D1 removed]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf b/regression/games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf
new file mode 100644 (file)
index 0000000..14fb2cb
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]WR[7k*]
+PB[GnuGo (GNU Go 3.1.34)]BR[14k*]
+PC[NNGS]DT[2002-04-28]AP[gnugoclient:2.0]
+RE[W+17.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[cn];B[fp];W[dg];B[fd];W[fj];B[mc];W[en];B[qm];W[jq];B[kq];W[iq]
+;B[kp];W[ho];B[qg];W[cq];B[dq]C[L:7];W[cp];B[qd]C[L:8];W[pq];B[qq]
+C[L:9];W[oq];B[qp];W[op];B[mq]C[L:10];W[on];B[ce]C[L:9];W[ip];B[eh]
+C[L:8];W[eg];B[fg]C[L:9];W[di];B[cj];W[ei];B[gh]C[L:10];W[bg];B[ek]
+C[L:9];W[fk];B[bf]C[L:10];W[mn];B[jm]C[L:9];W[qk];B[qj]C[L:7];W[jn]
+;B[rk]C[L:6];W[kn];B[ml];W[nl];B[nm]C[L:5];W[mm];B[nr];W[lr];B[or]
+C[L:6];W[kr];B[ol]C[L:7];W[nk];B[mh];W[pr];B[nn]C[L:8];W[no];B[om]
+C[L:9];W[lo];B[ll]C[L:10];W[pn];B[qn];W[nh];B[dh];W[ch];B[fn];W[eo]
+;B[fh]C[L:8];W[ci];B[fo]C[L:9];W[gm];B[fm]C[L:7];W[em];B[gl]C[L:6]
+;W[fl];B[el]C[L:5];W[hj];B[gn];W[hm];B[cr]C[L:6];W[br];B[hl]C[L:4]
+;W[im];B[fr]C[L:2];W[dr];B[er]C[L:3];W[cs];B[il]C[L:4];W[jl];B[do]
+C[L:3];W[dn];B[ij]C[L:4];W[ik];B[jk]C[L:5];W[kl];B[kk]C[L:6];W[km]
+;B[hk]C[L:7];W[gk];B[ik];W[hi];B[jh];W[ih];B[nj];W[lk];B[mk];W[jg]
+;B[kh]C[L:6];W[ig];B[ge]C[L:4];W[kd];B[kg]C[L:5];W[id];B[jc]C[L:6]
+;W[je];B[hc]C[L:7];W[ic];B[ib]C[L:8];W[ie];B[kf]C[L:9];W[ke];B[kc]
+C[L:8];W[md];B[nd]C[L:9];W[ne];B[ld]C[L:6];W[le];B[me]C[L:5];W[mf]
+;B[md]C[L:6];W[lf];B[nf];W[ng];B[of]C[L:7];W[mg];B[ef]C[L:8];W[cf]
+;B[be]C[L:9];W[df];B[qr];W[qs];B[de]C[L:10];W[cg];B[rs];W[ps];B[rr]
+;W[ff];B[ee]C[L:9];W[pg];B[ni]C[L:8];W[pf];B[oe]C[L:9];W[qh];B[rh]
+;W[rg];B[ri]C[L:8];W[qf];B[po]C[L:9];W[re];B[oo]C[L:10];W[np];B[rd]
+;W[sd];B[sc];W[se];B[rb];W[ji];B[lj]C[L:8];W[ii];B[lg]C[L:9];W[oi]
+;B[og]C[L:10];W[oh];B[ki];W[oj];B[ok];W[gc];B[hb];W[hd];B[gd];W[sh]
+;B[si];W[sg];B[fi];W[ej];B[ag]C[L:9];W[ah];B[af];W[qi];B[jf];W[pi]
+;B[if]C[L:10];W[rj];B[sj];W[pk];B[sl];W[rl];B[ql];W[rj];B[qj];W[dk]
+;B[pl];W[pj];B[sk];W[rj];B[rm];W[hf];B[he];W[gf];B[hg];W[gj];B[lm]
+C[L:9];W[ln];B[qj]C[L:10];W[gi];B[fe]C[L:9];W[rj];B[mo]C[L:10];W[mp]
+;B[qj];W[mi];B[lh];W[rj];B[ck];W[dl];B[qj];W[qc];B[rc];W[rj];B[bh]
+;W[bi];B[qj];W[hh];B[gg];W[rj];B[cm];W[co];B[qj];W[mj];B[nk];W[rj]
+;B[ai];W[aj];B[qj];W[qe];B[rj];W[];B[pe];W[];B[]
+C[final_score: W+17.5
+G17 removed
+R17 removed
+N11 removed
+C10 removed
+C7 removed
+F7 removed
+P6 removed
+D5 removed
+K4 removed
+N3 removed
+E2 removed
+O2 removed]
+)
diff --git a/regression/games/nngs/Lazarus-gnugo-3.2-200205011927.sgf b/regression/games/nngs/Lazarus-gnugo-3.2-200205011927.sgf
new file mode 100644 (file)
index 0000000..789ec8d
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[Lazarus]WR[7k*]
+PB[GnuGo (GNU Go 3.2)]BR[14k*]
+PC[NNGS]DT[2002-05-01]AP[gnugoclient:2.0]
+RE[W+32.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fc];B[df];W[hd];B[eb];W[cd];B[ce];W[cc];B[dc];W[cb];B[bd];W[bc]
+;B[be];W[db];B[fb];W[gc];B[gb];W[ic];B[jc];W[ec];B[hb];W[ib];B[da]
+;W[ea];B[fa];W[ba];B[ab];W[ed];B[de];W[ac];B[ad];W[hc];B[fq];W[dh]
+;B[bb];W[aa];B[ha];W[ia];B[ff];W[hf];B[ei];W[eg];B[fg];W[ef];B[ee]
+;W[eh];B[fh];W[cj];B[ck];W[di];B[ej];W[bi];B[ge];W[bk];B[cl]C[L:8]
+;W[bl];B[he]C[L:9];W[kb];B[if]C[L:10];W[lc];B[mf];W[cm];B[el];W[ne]
+;B[pf]C[L:8];W[lf];B[kf]C[L:9];W[lg];B[le]C[L:10];W[me];B[dm];W[cn]
+;B[ni];W[ke];B[je];W[kd];B[oc];W[dn];B[en]C[L:9];W[eo];B[fo];W[fn]
+;B[em]C[L:8];W[fp];B[go];W[ep];B[io]C[L:9];W[eq];B[cq]C[L:8];W[gp]
+;B[bo]C[L:9];W[ho];B[gn]C[L:7];W[hn];B[gm]C[L:8];W[ip];B[fr];W[er]
+;B[es];W[ds];B[bn];W[cr];B[jo];W[hm];B[qn]C[L:9];W[gl];B[fm]C[L:8]
+;W[nq];B[hl]C[L:7];W[il];B[hk];W[jm];B[or];W[kq];B[jq]C[L:8];W[lp]
+;B[do]C[L:9];W[bm];B[kg]C[L:7];W[ln];B[mg]C[L:5];W[lh];B[lj]C[L:6]
+;W[kh];B[jh]C[L:3];W[ji];B[ki]C[L:4];W[jg];B[jf]C[L:5];W[ih];B[ml]
+;W[ik];B[ij];W[hj];B[gk]C[L:4];W[gj];B[hg];W[fk];B[gi];W[fj];B[fi]
+C[L:5];W[ek];B[dk];W[hi];B[nn]C[L:6];W[hh];B[mh]C[L:7];W[li];B[kj]
+;W[qe];B[pe];W[rc];B[qf];W[pb];B[qd]C[L:8];W[ob];B[rd]C[L:9];W[qc]
+;B[nr]C[L:10];W[mq];B[sc];W[sb];B[sd];W[rb];B[nc];W[nb];B[mr];W[lr]
+;B[bg];W[bh];B[cg];W[ch];B[jb];W[ja];B[ig];W[jh];B[mc];W[mb];B[oq]
+;W[mi];B[nf];W[nj];B[mj];W[nh];B[oi];W[of];B[og];W[ng];B[oh];W[no]
+;B[oo];W[nm];B[mm]C[L:9];W[mn];B[on]C[L:7];W[np];B[kc]C[L:8];W[ld]
+;B[oe]C[L:9];W[nf];B[ah]C[L:10];W[ai];B[ag];W[lm];B[ll];W[kl];B[kk]
+;W[jk];B[ms];W[ii];B[nk];W[ls];B[pc];W[iq];B[id];W[fs];B[gh];W[ka]
+;B[md];W[br];B[nd];W[lb];B[op];W[ca];B[bb];W[ea];B[bj];W[aj];B[da]
+;W[mk];B[oj];W[ea];B[gr];W[ga];B[dg];W[fd];B[fe];W[];B[fl];W[];B[gd]
+;W[];B[]
+C[final_score: W+32.5
+B18 removed
+R15 removed
+H14 removed
+N9 removed
+O7 removed
+B6 removed
+D5 removed
+J5 removed
+C3 removed
+F3 removed]
+)
diff --git a/regression/games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf b/regression/games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf
new file mode 100644 (file)
index 0000000..144d577
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[LordOfPi]WR[10k*]
+PB[GnuGo (GNU Go 3.1.20)]BR[14k*]
+PC[NNGS]DT[2002-01-20]AP[gnugoclient:2.0]
+RE[W+11.5]
+AB[gc][cg]
+;W[cc];B[ec];W[gg];B[ff];W[ce];B[fg];W[gf];B[ge];W[he];B[hd];W[fh]
+;B[eh];W[gh];B[hf];W[fe];B[gd];W[eg];B[ef]C[L:5];W[dg];B[dh]C[L:6]
+;W[df];B[bf]C[L:7];W[ei];B[ch]C[L:8];W[ee];B[db]C[L:9];W[cb];B[hg]
+C[L:10];W[be];B[di];W[bi];B[bh];W[af];B[ag];W[ae];B[ca];W[dc];B[da]
+;W[ba];B[eb];W[cf];B[bb];W[bc];B[aa];W[ai];B[hh];W[hi];B[ed];W[dd]
+;B[fd];W[ab];B[ba];W[ac];B[ih];W[gi];B[ii];W[];B[]
+C[final_score: W+11.5
+H5 removed
+B4 removed
+A3 removed
+C3 removed])
diff --git a/regression/games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf b/regression/games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf
new file mode 100644 (file)
index 0000000..55caf0b
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ManyFaces3]WR[12k]
+PB[GnuGo (GNU Go 3.3.11)]BR[11k*]
+PC[NNGS]DT[2002-11-07]AP[gnugoclient:2.0]
+RE[W+33.5]
+;B[pd];W[dc];B[pp];W[dq];B[de];W[dh];B[fe];W[gc];B[co];W[cl];B[ep]
+;W[he];B[eq];W[jq];B[dr];W[gg];B[mc];W[gq];B[jc];W[ef];B[cg];W[cj]
+;B[bi];W[df];B[bj];W[cf];B[bf];W[be];B[pj];W[bk];B[mq];W[gn];B[nm]
+;W[ql];B[rk];W[qp];B[qo];W[qd];B[qc];W[qe];B[np];W[fr];B[rc];W[qh]
+;B[oh];W[pe];B[ri];W[od];B[pc];W[oi];B[pi];W[po];B[ro];W[oc];B[ob]
+;W[nb];B[pb];W[nc];B[ni];W[ne];B[mn];W[le];B[jj];W[ng];B[og];W[of]
+;B[pg];W[qg];B[bh];W[af];B[hj];W[jo];B[je];W[kf];B[hb];W[ig];B[md]
+;W[ee];B[cq];W[gp];B[gb];W[li];B[fb];W[kk];B[hl];W[km];B[ek];W[fm]
+;B[fj];W[dm];B[hn];W[jl];B[in];W[jn];B[fc];W[hc];B[gd];W[eh];B[aj]
+;W[hd];B[bg];W[fl];B[fk];W[ik];B[hk];W[ij];B[ed];W[dd];B[di];W[ii]
+;B[ci];W[dj];B[ei];W[gl];B[kr];W[ic];B[ib];W[lc];B[ld];W[kc];B[kd]
+;W[mb];B[kb];W[lb];B[db];W[cb];B[da];W[rl];B[ca];W[gi];B[cc];W[jr]
+;B[bc];W[pn];B[pq];W[rd];B[ra];W[ol];B[nl];W[nk];B[ok];W[pk];B[oj]
+;W[mj];B[nj];W[mk];B[bm];W[ak];B[ag];W[ae];B[kq];W[rh];B[qk];W[pl]
+;B[qi];W[kp];B[mh];W[ph];B[nh];W[lp];B[mf];W[me];B[lh];W[kh];B[cd]
+;W[ce];B[ec];W[oo];B[mp];W[op];B[oq];W[nf];B[ge];W[ie];B[jd];W[ac]
+;B[ab];W[ad];B[lg];W[kg];B[la];W[ks];B[lr];W[am];B[cm];W[dl];B[an]
+;W[dn];B[al];W[lo];B[ls];W[js];B[bl];W[ck];B[qf];W[rf];B[sh];W[pf]
+;B[sg];W[mo];B[om];W[qn];B[rn];W[no];B[qm];W[pm];B[do];W[hm];B[en]
+;W[dg];B[jf];W[gj];B[er];W[rm];B[qq];W[sn];B[rp];W[de];B[hf];W[if]
+;B[gf];W[hg];B[rg];W[qf];B[so];W[el];B[sf];W[se];B[si];W[gk];B[mi]
+;W[lj];B[cn];W[ff];B[fd];W[lq];B[nr];W[bd];B[bb];W[ms];B[mr];W[fi]
+;B[fs];W[gs];B[es];W[fo];B[eo];W[ma];B[ka];W[ja];B[jb];W[sm];B[fq]
+;W[gr];B[jg];W[jh];B[nd];W[lf];B[mg];W[sk];B[sj];W[sl];B[sc];W[sd]
+;B[oa];W[ej];B[fn];W[fp];B[na];W[oe];B[id];W[ch];B[em];W[ke];B[]
+C[K19 removed
+B14 removed
+F10 removed
+H10 removed
+K10 removed
+final_score: W+33.5
+O8 removed
+H6 removed
+N6 removed
+D3 removed
+N1 removed]
+)
diff --git a/regression/games/nngs/ManyFaces4-gnugo-3.1.27-200203182101.sgf b/regression/games/nngs/ManyFaces4-gnugo-3.1.27-200203182101.sgf
new file mode 100644 (file)
index 0000000..1ad3512
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ManyFaces4]WR[12k*]
+PB[GnuGo (GNU Go 3.1.27)]BR[14k*]
+PC[NNGS]DT[2002-03-18]AP[gnugoclient:2.0]
+RE[W+38.5]
+;B[qd];W[dc];B[pq];W[dq];B[ce];W[ch];B[ed];W[kd];B[ec];W[hc];B[db]
+;W[pk];B[ef];W[dl];B[oc];W[po];B[np];W[lq];B[qp];W[qo];B[do];W[qh]
+;B[fo];W[fr];B[ho];W[mc];B[lo];W[iq];B[nn];W[pm];B[pf];W[nb];B[ob]
+;W[rf];B[re];W[eh];B[rg];W[nl];B[gf];W[cn];B[cp];W[nr];B[dn];W[qg]
+;B[cm];W[cl];B[bm];W[rh];B[or];W[ns];B[nq];W[mq];B[bl];W[bk];B[cq]
+;W[fl];B[if];W[gh];B[dr];W[fb];B[ih];W[bf];B[be];W[ij];B[hi];W[kj]
+;B[bg];W[lm];B[lg];W[mj];B[nf];W[gj];B[nh];W[hj];B[ro];W[rn];B[rp]
+;W[bh];B[sn];W[rm];B[cf];W[oa];B[pa];W[na];B[qb];W[gp];B[hn];W[il]
+;B[ah];W[eq];B[ak];W[bj];B[pi];W[qj];B[qf];W[oi];B[sf];W[og];B[oh]
+;W[pg];B[ng];W[of];B[aj];W[le];B[ph];W[jf];B[jg];W[kh];B[kg];W[hh]
+;B[eb];W[oe];B[gb];W[hg];B[hb];W[je];B[ic];W[ig];B[hf];W[oj];B[nd]
+;W[ne];B[md];W[me];B[ld];W[jc];B[lc];W[id];B[ib];W[he];B[jb];W[jn]
+;B[kp];W[kq];B[ip];W[hq];B[kn];W[km];B[kc];W[jd];B[jo];W[in];B[gc]
+;W[hm];B[ln];W[gm];B[fn];W[sm];B[mm];W[ml];B[nm];W[sh];B[em];W[el]
+;B[dg];W[dh];B[fg];W[so];B[sp];W[os];B[ps];W[lr];B[hd];W[ie];B[ge]
+;W[qr];B[pr];W[mp];B[fh];W[gi];B[fi];W[ej];B[sg];W[pp];B[qs];W[mo]
+;B[no];W[op];B[oq];W[mn];B[lp];W[dm];B[fm];W[bn];B[al];W[ag];B[af]
+;W[rr];B[rs];W[sr];B[jq];W[jr];B[jp];W[qq];B[sn];W[om];B[ei];W[ai]
+;B[bi];W[ci];B[ai];W[on];B[di];W[dj];B[er];W[es];B[cr];W[fj];B[fp]
+;W[fq];B[ds];W[fs];B[pe];W[od];B[ep];W[pd];B[pc];W[gg];B[eg];W[rc]
+;B[rb];W[dp];B[hp];W[gn];B[go];W[gq];B[cg];W[cj];B[io];W[];B[]
+C[final_score: W+38.5
+O19 removed
+F18 removed
+D17 removed
+N17 removed
+S17 removed
+O14 removed
+K13 removed
+J12 removed
+H11 removed
+N7 removed
+B6 removed
+T6 removed
+S5 removed]
+)
diff --git a/regression/games/nngs/ManyFaces4-gnugo-3.1.27-200203191159.sgf b/regression/games/nngs/ManyFaces4-gnugo-3.1.27-200203191159.sgf
new file mode 100644 (file)
index 0000000..61a30e0
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[ManyFaces4]WR[12k*]
+PB[GnuGo (GNU Go 3.1.27)]BR[14k*]
+PC[NNGS]DT[2002-03-19]AP[gnugoclient:2.0]
+AB[pd][dp]
+;W[dc];B[de];W[pp];B[cc];W[dh];B[db];W[qf];B[qq];W[pq];B[qp];W[qo]
+;B[ro];W[qn];B[rn];W[qm];B[pr];W[or];B[qr];W[nq];B[re];W[nc];B[qh]
+;W[kc];B[pg];W[qj];B[pf];W[cf];B[ng];W[ec];B[oi];W[cd];B[eb];W[ce]
+;B[fe];W[gc];B[ed];W[fb];B[fg];W[pb];B[bc];W[id];B[ba];W[bd];B[ab]
+;W[iq];B[cj];W[ei];B[dd];W[ci];B[fc];W[dj];B[ck];W[fq];B[cn];W[dr]
+;B[cq];W[gb];B[fo];W[rm];B[cr];W[el];B[mk];W[er];B[mm];W[kp];B[ne]
+;W[gi];B[gl];W[bi];B[nj];W[ri];B[rh];W[on];B[kf];W[sn];B[sp];W[li]
+;B[ji];W[al];B[bl];W[ak];B[jl];W[hk];B[ik];W[hl];B[fm];W[gk];B[pk]
+;W[in];B[kn];W[kj];B[ij];W[qc];B[ld];W[lc];B[mo];W[mp];B[no];W[rd]
+;B[qe];W[sh];B[sg];W[si];B[qi];W[rk];B[pj];W[jo];B[md];W[mc];B[bk]
+;W[bj];B[am];W[aj];B[bm];W[cs];B[bs];W[ds];B[br];W[em];B[en];W[qk]
+;B[fl];W[fk];B[dm];W[pl];B[ek];W[lo];B[hm];W[ln];B[lm];W[mn];B[nm]
+;W[nn];B[im];W[dk];B[dl];W[ol];B[ej];W[hh];B[jn];W[io];B[hp];W[hq]
+;B[di];W[ig];B[dj];W[fh];B[jh];W[eg];B[gg];W[jg];B[kg];W[gp];B[gd]
+;W[go];B[ef];W[rq];B[rp];W[rr];B[rs];W[je];B[hf];W[jf];B[od];W[fj]
+;B[gn];W[hn];B[ep];W[ke];B[le];W[df];B[qd];W[rc];B[he];W[se];B[sf]
+;W[sd];B[hd];W[hc];B[oc];W[ob];B[os];W[ns];B[ps];W[ea];B[da];W[fa]
+;B[kd];W[jd];B[om];W[nl];B[ml];W[pm];B[ok];W[ii];B[hj];W[ad];B[ih]
+;W[hi];B[hg];W[gh];B[kh];W[nk];B[gj];W[fi];B[ch];W[bh];B[il];W[nd]
+;B[ac];W[ko];B[fp];W[dq];B[eq];W[fr];B[so];W[sm];B[sq];W[pc];B[if]
+;W[dg];B[eh];W[];B[ie];W[ic];B[]
+C[R14 removed
+C12 removed
+M11 removed
+L10 removed
+N5 removed
+H4 removed
+S3 removed
+final_score: B+30.5]
+)
diff --git a/regression/games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf b/regression/games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf
new file mode 100644 (file)
index 0000000..2bdb3fc
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ManyFaces4]WR[12k*]
+PB[GnuGo (GNU Go 3.1.28)]BR[13k*]
+PC[NNGS]DT[2002-03-26]AP[gnugoclient:2.0]
+RE[W+10.5]
+;B[qd];W[dc];B[pq];W[dq];B[de];W[dh];B[fe];W[gc];B[do];W[co];B[cn]
+;W[cp];B[dn];W[ck];B[qo];W[oc];B[pe];W[kc];B[nd];W[nc];B[md];W[mc]
+;B[jq];W[qj];B[ql];W[qg];B[he];W[re];B[gq];W[ld];B[nf];W[lf];B[pb]
+;W[rd];B[nh];W[eg];B[nj];W[hg];B[gd];W[cd];B[mq];W[cf];B[lh];W[ob]
+;B[rb];W[rk];B[jh];W[ff];B[ol];W[pr];B[or];W[oq];B[op];W[qq];B[pp]
+;W[hc];B[ij];W[gj];B[gl];W[hk];B[im];W[ik];B[jk];W[sm];B[il];W[jg]
+;B[er];W[dr];B[eq];W[ds];B[rn];W[ek];B[es];W[hi];B[bn];W[bo];B[bl]
+;W[bk];B[kg];W[jf];B[pj];W[ri];B[rl];W[sl];B[ak];W[aj];B[al];W[bi]
+;B[kf];W[ke];B[ih];W[ce];B[el];W[pi];B[fk];W[ej];B[oi];W[dl];B[dm]
+;W[ph];B[qk];W[fj];B[gk];W[ii];B[jj];W[hj];B[cl];W[hl];B[hm];W[gm]
+;B[fl];W[mg];B[ng];W[hf];B[dp];W[bq];B[lg];W[ie];B[mf];W[ln];B[le]
+;W[ji];B[ki];W[hh];B[rc];W[od];B[oe];W[dk];B[fn];W[rm];B[rq];W[qm]
+;B[pm];W[pk];B[pl];W[oj];B[ok];W[pj];B[sd];W[rf];B[pc];W[qn];B[ro]
+;W[pn];B[ml];W[on];B[mo];W[mn];B[nn];W[nm];B[no];W[nl];B[mm];W[nk]
+;B[mk];W[om];B[oh];W[ig];B[kh];W[pf];B[se];W[sf];B[sc];W[iq];B[ip]
+;W[hq];B[oa];W[na];B[pa];W[lp];B[lq];W[lo];B[ao];W[br];B[ap];W[aq]
+;B[pd];W[kb];B[og];W[ms];B[jp];W[qe];B[of];W[pg];B[sn];W[bp];B[an]
+;W[oo];B[jl];W[po];B[qp];W[mp];B[np];W[];B[]
+C[G16 removed
+D15 removed
+F15 removed
+H15 removed
+N13 removed
+G7 removed
+M6 removed
+H3 removed
+P3 removed
+R3 removed
+Q2 removed
+N1 removed
+final_score: W+10.5]
+)
diff --git a/regression/games/nngs/Minori-gnugo-3.5.2gf1-200312161433.sgf b/regression/games/nngs/Minori-gnugo-3.5.2gf1-200312161433.sgf
new file mode 100644 (file)
index 0000000..af426d5
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[Minori]WR[6k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-16]AP[gnugoclient:2.0]
+RE[W+32.5]
+AB[dd][pd][dp]
+;W[pp];B[qn];W[pk];B[on];W[np];B[rp];W[qq];B[rk];W[qi];B[lq];W[mq]
+;B[lp];W[nn];B[hp];W[rq];B[dj];W[fc];B[hc];W[cc];B[cd];W[dc];B[ed]
+;W[fb];B[ge];W[fi];B[dh];W[nc];B[nd];W[md];B[ne];W[oc];B[pc];W[kc]
+;B[qe];W[me];B[fk];W[fp];B[fr];W[do];B[fh];W[cp];B[ie];W[hq];B[iq]
+;W[gq];B[ip];W[eq];B[dq];W[cq];B[cm];W[cn];B[dm];W[jn];B[hn];W[fn]
+;B[hl];W[gh];B[km];W[fg];B[eh];W[gf];B[ee];W[eg];B[dg];W[he];B[hd]
+;W[fe];B[hf];W[fd];B[gi];W[hh];B[hr];W[gr];B[hi];W[gk];B[ig];W[gj]
+;B[ih];W[ii];B[hj];W[hk];B[ij];W[ik];B[ji];W[jj];B[ii];W[jl];B[jm]
+;W[gl];B[kn];W[fj];B[lf];W[mf];B[ek];W[im];B[hm];W[il];B[in];W[kj]
+;B[lg];W[rl];B[ql];W[qk];B[rm];W[pl];B[qm];W[rj];B[sl];W[ro];B[mj]
+;W[fl];B[om];W[nm];B[ol];W[pf];B[nl];W[od];B[ml];W[mo];B[mh];W[qf]
+;B[kl];W[re];B[rc];W[pe];B[pb];W[rd];B[qd];W[ob];B[pa];W[rb];B[sc]
+;W[qb];B[qa];W[sb];B[bc];W[bb];B[bd];W[ab];B[bn];W[bo];B[bm];W[ir]
+;B[jr];W[hs];B[lr];W[mr];B[ef];W[ff];B[ng];W[nf];B[oo];W[no];B[ms]
+;W[or];B[ns];W[qo];B[os];W[pr];B[kd];W[jc];B[ib];W[jd];B[la];W[lb]
+;B[ka];W[ja];B[jb];W[ma];B[kb];W[mc];B[ld];W[le];B[ke];W[je];B[kf]
+;W[lc];B[ra];W[sd];B[jf];W[og];B[oh];W[ph];B[oi];W[el];B[dl];W[li]
+;B[ki];W[lj];B[gb];W[ga];B[ha];W[fa];B[ec];W[eb];B[go];W[fo];B[gg]
+;W[ca];B[gc];W[ej];B[dk];W[sj];B[gd];W[db];B[ok];W[mi];B[nj];W[mg]
+;B[nh];W[lh];B[kh];W[pj];B[kk];W[jk];B[rn];W[so];B[dn];W[co];B[lo]
+;W[lk];B[mm];W[gn];B[nr];W[nq];B[op];W[oq];B[gp];W[fq];B[sk];W[sn]
+;B[pi];W[oj];B[ni];W[mk];B[nk];W[qh];B[gm];W[fm];B[sm];W[ac];B[ad]
+;W[ps];B[ls];W[an];B[am];W[ao];B[mn];W[ll];B[lm];W[en];B[ei];W[po]
+;B[hg];W[qj];B[pn];W[em];B[id];W[js];B[kq];W[ks];B[kr];W[is];B[ic]
+;W[mp];B[pm];W[];B[]C[final_score: W+32.5
+K19 removed
+Q19 removed
+S17 removed
+O16 removed
+K6 removed
+D4 removed
+S4 removed
+F2 removed]
+)
diff --git a/regression/games/nngs/NE-gnugo-3.1.18-200201030545.sgf b/regression/games/nngs/NE-gnugo-3.1.18-200201030545.sgf
new file mode 100644 (file)
index 0000000..3efccb2
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[9]HA[2]KM[5.5]PW[NE]WR[NR]PB[GnuGo (GNU Go 3.1.18)]BR[14k*]PC[NNGS]DT[2002-01-03]RE[W+53.5]AB[gc][cg];W[ee];B[cc];W[ec];B[ge];W[ce]\r
+;B[bd];W[be];B[db];W[eb];B[fg];W[bb];B[bf];W[ae];B[fb];W[ea];B[fd];W[ed];B[fc]\r
+;W[ff]C[G3];B[gf];W[eg];B[eh]C[L:7];W[fh];B[dh]C[L:8];W[gg];B[bh]C[L:9];W[hf];B[he]C[L:8];W[hg]\r
+;B[if]C[L:9];W[ig];B[ie];W[fa];B[ga]C[L:10];W[hb];B[gb];W[hc];B[ha];W[fe]C[H6];B[id];W[ic]C[J8]\r
+;B[bc];W[da];B[dc];W[ca];B[ei];W[hd];B[fi];W[gi];B[af];W[cf];B[dg];W[df];B[];W[ah]\r
+;B[bg];W[];B[]C[final_score: W+53.5\r
+G9 removed\r
+D8 removed\r
+J6 removed\r
+A2 removed])\r
diff --git a/regression/games/nngs/ShaiHulud-gnugo-3.5.3-200401231947.sgf b/regression/games/nngs/ShaiHulud-gnugo-3.5.3-200401231947.sgf
new file mode 100644 (file)
index 0000000..bbf694b
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[ShaiHulud]WR[1k]
+PB[GnuGo (GNU Go 3.5.3)]BR[8k*]
+PC[NNGS]DT[2004-01-23]AP[gnugoclient:2.0]
+RE[W+Time]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nc];W[pm];B[np];W[lp];B[nn];W[nl];B[gp];W[of];B[mf];W[cn]
+;B[cl];W[cf];B[dn];W[dm];B[ce];W[do];B[df];W[en];B[cp];W[hc];B[he]
+;W[db];B[fc];W[cg];B[dg];W[ec];B[ib];W[ic];B[fb];W[ed];B[bb];W[gd]
+;B[ee];W[fd];B[ch];W[jc];B[kq];W[qp];B[qq];W[qo];B[pq];W[bh];B[ci]
+;W[gq];B[hq];W[fp];B[lq];W[go];B[hp];W[fq];B[dr];W[md];B[mc];W[ld]
+;B[kb];W[qd];B[qc];W[od];B[oc];W[pe];B[pc];W[jb];B[kc];W[kd];B[ol]
+;W[om];B[nm];W[qk];B[qj];W[ok];B[rk];W[ql];B[ni];W[rd];B[ml];W[nk]
+;B[rm];W[rl];B[rj];W[mk];B[sl];W[po];B[rq];W[rp];B[ll];W[lk];B[kl]
+;W[kk];B[jk];W[lh];B[li];W[ki];B[kj]C[L:8];W[mi];B[lj]C[L:9];W[mj]
+;B[rh]C[L:8];W[qh];B[rg];W[qi];B[kf]C[L:9];W[mg];B[nd];W[ne];B[me]
+C[L:10];W[nf];B[ke];W[je];B[id];W[bd];B[be]C[L:9];W[cc];B[ad]C[L:10]
+;W[ac];B[bc];W[ae];B[cd]C[L:9];W[bf];B[ab]C[L:8];W[bj];B[bi];W[ck]
+;B[bl]C[L:9];W[dk];B[aj]C[L:10];W[eg];B[if];W[dh];B[ja];W[ak];B[hb]
+C[L:9];W[ai];B[eh]C[L:10];W[ef];B[di];W[fe];B[de];W[fg];B[ek];W[dl]
+;B[hm];W[hg];B[gf];W[ff];B[gg];W[fh];B[fi];W[gh];B[hh];W[ig];B[jf]
+;W[gi];B[hi];W[jg];B[kg];W[fj];B[ej];W[ei];B[dh];W[ii];B[hj]C[L:9]
+;W[kh];B[jh]C[L:10];W[hd];B[ie];W[lf];B[le];W[fk];B[fl];W[hk];B[ik]
+;W[hl];B[gk]C[L:8];W[gl];B[gj]C[L:9];W[il];B[fi]C[L:10];W[jl];B[ji]
+;W[ln];B[gm];W[in];B[im];W[jm];B[jn];W[km];B[kn]C[L:9];W[lm];B[mm]
+C[L:10];W[mo];B[no];W[io];B[ho]C[L:9];W[jo];B[fn]C[L:10];W[ko];B[mp]
+;W[ip];B[iq];W[kp];B[mn];W[hn];B[fo];W[fm];B[em];W[gn];B[fm];W[fk]
+;B[hf];W[jq];B[jr];W[kr];B[jp]C[L:5])
diff --git a/regression/games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf b/regression/games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf
new file mode 100644 (file)
index 0000000..a4c4800
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[Temnik]WR[6k]
+PB[GnuGo (GNU Go 3.3.15)]BR[10k*]
+PC[NNGS]DT[2003-01-16]AP[gnugoclient:2.0]
+RE[W+29.5]
+AB[dd][pd][dp][pp]
+;W[fq];B[hq];W[fo];B[dn];W[dr];B[cq];W[cr];B[kq];W[cf];B[fd];W[ci]
+;B[ck];W[nc];B[nd];W[md];B[ne];W[oc];B[pc];W[kc];B[pf];W[hc];B[fc]
+;W[qk];B[ko];W[qn];B[nq];W[qh];B[qf];W[qq];B[ce];W[df];B[br];W[pq]
+;B[op];W[or];B[fm];W[gr];B[on];W[hr];B[qp];W[rp];B[be];W[iq];B[bf]
+;W[bg];B[ro];W[rq];B[rn];W[qm];B[qo];W[hp];B[mr];W[ej];B[ff];W[dq]
+;B[bq];W[ep];B[do];W[el];B[dl];W[em];B[sk];W[rm];B[ag];W[bh];B[hf]
+;W[dm];B[cm];W[dk];B[cl];W[gl];B[gm];W[in];B[en];W[fn];B[dj];W[ek]
+;B[ei];W[di];B[hm];W[cj];B[fi];W[il];B[hl];W[ik];B[gk];W[gj];B[fj]
+;W[hk];B[fk];W[eh];B[bj];W[bi];B[ak];W[fh];B[gi];W[gh];B[hi];W[hh]
+;B[ih];W[ii];B[hg];W[hj];B[fl];W[dj];B[jh];W[im];B[ob];W[nb];B[pb]
+;W[jf];B[mg];W[ig];B[ie];W[ji];B[kh];W[ee];B[je];W[kf];B[ke];W[lf]
+;B[me];W[le];B[ld];W[mc];B[kd];W[lh];B[lg];W[fe];B[jc];W[jb];B[lb]
+;W[lc];B[kb];W[ic];B[jd];W[ib];B[od];W[ge];B[gd];W[he];B[if];W[hd]
+;B[li];W[mh];B[ni];W[ki];B[nh];W[gf];B[mi];W[gg];B[jg];W[ed];B[ec]
+;W[dc];B[cc];W[db];B[cb];W[de];B[cd];W[fb];B[eb];W[gc];B[ea];W[fa]
+;B[da];W[ha];B[rg];W[rh];B[sm];W[rl];B[pl];W[sl];B[pi];W[sn];B[so]
+;W[qi];B[sh];W[si];B[rj];W[pj];B[sg];W[oi];B[ri];W[ph];B[sm];W[nj]
+;B[nl];W[mk];B[lm];W[kk];B[jr];W[rk];B[sj];W[qj];B[si];W[qg];B[rf]
+;W[ml];B[mm];W[km];B[kn];W[og];B[ll];W[nf];B[lk];W[mf];B[ok];W[lj]
+;B[mj];W[kj];B[kl];W[oj];B[nk];W[kg];B[mb];W[na];B[oa];W[om];B[ka]
+;W[nn];B[cs];W[oo];B[pn];W[pm];B[po];W[nm];B[ol];W[no];B[sn];W[mp]
+;B[ds];W[lq];B[lr];W[kp];B[jp];W[lp];B[er];W[eq];B[io];W[jq];B[ho]
+;W[hn];B[ip];W[kr];B[gp];W[jm];B[go];W[gn];B[lo];W[fr];B[es];W[bs]
+;B[as];W[fs];B[bs];W[ir];B[of];W[ng];B[oh];W[pg];B[gq];W[lh];B[mh]
+;W[mk];B[ml];W[mn];B[ln];W[bl];B[aj];W[eo];B[mo];W[np];B[jl];W[jk]
+;B[ja];W[bo];B[bn];W[co];B[bm];W[ap];B[aq];W[al];B[an];W[ai];B[cn]
+;W[bk];B[ao];W[ah];B[af];W[ia];B[ql];W[oq];B[fp];W[jn];B[jo];W[id]
+;B[ma];W[];B[pk];W[sp];B[bp];W[];B[am];W[];B[]
+C[final_score: W+29.5
+F14 removed
+E11 removed
+B5 removed
+O3 removed
+K2 removed
+M2 removed]
+)
diff --git a/regression/games/nngs/abcd-gnugo-3.3.8-200209202043.sgf b/regression/games/nngs/abcd-gnugo-3.3.8-200209202043.sgf
new file mode 100644 (file)
index 0000000..e4d2b80
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[abcd]WR[9k]
+PB[GnuGo (GNU Go 3.3.8)]BR[12k*]
+PC[NNGS]DT[2002-09-20]AP[gnugoclient:2.0]
+RE[B+88.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nq];B[pn];W[lp];B[or];W[oq];B[pq];W[nr];B[pr];W[fp];B[dn];W[fn]
+;B[dl];W[jl];B[hq];W[gq];B[gp];W[go];B[hp];W[fq];B[gr];W[fr];B[dg]
+;W[ko];B[ir];W[gs];B[hs];W[hr];B[is];W[iq];B[nc];W[pf];B[fc];W[gc]
+;B[gd];W[fd];B[ed];W[hd];B[fe];W[ge];B[hc];W[fd];B[hf];W[ec];B[fb]
+;W[eb];B[gb];W[cc];B[be];W[bd];B[ea];W[da];B[gf];W[ac];B[gr];W[fs]
+;B[qe];W[qf];B[qh];W[ng];B[og];W[of];B[nf];W[oh];B[pg];W[ph];B[qg]
+;W[mf];B[ne];W[mg];B[qi];W[ki];B[ld];W[kj];B[ce];W[bb];B[fa];W[db]
+;B[nm];W[hb];B[gd];W[ic];B[gc];W[ql];B[rk];W[ok];B[id];W[mk];B[pk]
+;W[pl];B[ol];W[nl];B[om];W[qo];B[po];W[mm];B[qn];W[ei];B[di];W[ej]
+;B[rl];W[hh];B[ek];W[fk];B[fl];W[gk];B[gm];W[hn];B[mn];W[lm];B[oj]
+;W[nk];B[ni];W[mi];B[nh];W[mh];B[ns];W[ms];B[os];W[mr];B[eh];W[co]
+;B[do];W[cq];B[cp];W[dq];B[bq];W[br];B[bp];W[qc];B[pc];W[rd];B[re]
+;W[pb];B[rb];W[em];B[el];W[dm];B[cm];W[ig];B[fj];W[gj];B[ar];W[cr]
+;B[ae];W[ad];B[fi];W[ke];B[kd];W[je];B[qb];W[nn];B[no];W[mo];B[ln]
+;W[kn];B[on];W[lo];B[hm];W[im];B[gh];W[hi];B[hl];W[ik];B[nj];W[lj]
+;B[nn];W[np];B[mj];W[lk];B[en];W[fm];B[gl];W[hk];B[gn];W[fo];B[ho]
+;W[in];B[if];W[jf];B[ie];W[jq];B[me];W[le];B[ep];W[eq];B[hg];W[ih]
+;B[op];W[gi];B[cd];W[dc];B[il];W[jk];B[eo];W[bs];B[aq];W[as];B[]
+C[final_score: B+88.5
+H18 removed
+Q18 removed
+J17 removed
+R17 removed
+H16 removed
+S16 removed
+G15 removed
+P14 removed
+P12 removed
+K10 removed
+Q8 removed
+C5 removed
+H5 removed
+R5 removed
+K4 removed
+G2 removed
+J2 removed]
+)
diff --git a/regression/games/nngs/aburry-gnugo-3.3.12-200212162212.sgf b/regression/games/nngs/aburry-gnugo-3.3.12-200212162212.sgf
new file mode 100644 (file)
index 0000000..33220c2
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[aburry]WR[13k*]
+PB[GnuGo (GNU Go 3.3.12)]BR[10k*]
+PC[NNGS]DT[2002-12-16]AP[gnugoclient:2.0]
+RE[W+20.5]
+AB[gc][cg]
+;W[ee];B[gg];W[ge];B[ff];W[fe];B[dd];W[ef];B[eg];W[cf];B[bf];W[ce]
+;B[cd];W[be];B[bg];W[fc];B[fb];W[ec];B[eb];W[db];B[dc];W[cb];B[bd]
+;W[ad];B[bb];W[bc];B[cc];W[ac];B[ab];W[ae];B[ca];W[gf];B[hg];W[fg]
+;B[eh];W[fh];B[hh];W[hf];B[hi];W[ei];B[dh];W[af];B[bi];W[ah];B[ag]
+;W[bh];B[ch];W[di];B[hd];W[ed];B[da];W[gd];B[hc];W[if];B[de];W[df]
+;B[he];W[dg];B[ie];W[ci];B[]
+C[final_score: W+20.5
+G3 removed
+B1 removed])
diff --git a/regression/games/nngs/bconwil-gnugo-3.3.11-200211182313.sgf b/regression/games/nngs/bconwil-gnugo-3.3.11-200211182313.sgf
new file mode 100644 (file)
index 0000000..621a10f
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[bconwil]WR[12k*]
+PB[GnuGo (GNU Go 3.3.11)]BR[10k*]
+PC[NNGS]DT[2002-11-18]AP[gnugoclient:2.0]
+RE[W+74.5]
+AB[pd][dp]
+;W[pp];B[dd];W[fq];B[qn];W[np];B[rp];W[qq];B[qk];W[dn];B[eo];W[cq]
+;B[dq];W[dr];B[er];W[cr];B[fr];W[co];B[lq];W[jq];B[lo];W[gq];B[gr]
+;W[hq];B[cp];W[bp];B[fn];W[eq];B[rq];W[rr];B[nr];W[oq];B[fl];W[dl]
+;B[cj];W[or];B[cg];W[jc];B[mc];W[fc];B[eb];W[fb];B[ec];W[ej];B[qh]
+;W[in];B[oh];W[gj];B[qd];W[od];B[me];W[ke];B[fd];W[gd];B[fa];W[fe]
+;B[ed];W[hb];B[ge];W[he];B[gf];W[hc];B[mq];W[nn];B[lm];W[il];B[lk]
+;W[ef];B[df];W[eg];B[mm];W[nm];B[kg];W[lf];B[oe];W[mf];B[bl];W[cm]
+;B[gl];W[hk];B[nl];W[ol];B[om];W[pm];B[qm];W[nk];B[li];W[nh];B[jj]
+;W[ig];B[ni];W[ng];B[mh];W[oi];B[oj];W[pi];B[nj];W[ph];B[qi];W[pj]
+;B[pk];W[pg];B[oc];W[ok];B[qg];W[ml];B[ll];W[mj];B[mk];W[mi];B[lj]
+;W[nq];B[nl];W[mr];B[lr];W[ns];B[gh];W[ii];B[bm];W[bn];B[on];W[pn]
+;B[oo];W[po];B[no];W[ml];B[mn];W[nl];B[mp];W[kn];B[jp];W[ip];B[jo]
+;W[jn];B[ir];W[jr];B[io];W[iq];B[ho];W[ep];B[hn];W[hm];B[gm];W[do]
+;B[eh];W[kp];B[ko];W[kq];B[fg];W[if];B[qj];W[lb];B[lc];W[kc];B[mb]
+;W[kb];B[ga];W[ha];B[sr];W[rs];B[la];W[ka];B[ma];W[pf];B[qf];W[pe]
+;B[qe];W[ne];B[nd];W[of];B[nf];W[cl];B[ck];W[fo];B[ne];W[di];B[mg]
+;W[lg];B[lh];W[jh];B[ci];W[dh];B[kh];W[kf];B[dg];W[ch];B[bh];W[ei]
+;B[fh];W[gi];B[go];W[en];B[ld];W[kd];B[hh];W[ih];B[pl];W[nj];B[gb]
+;W[gc];B[ea];W[hi];B[qp];W[pr];B[fi];W[fj];B[qo];W[op];B[dk];W[el]
+;B[ek];W[fk];B[hg];W[hf];B[bk];W[ss];B[sq];W[am];B[al];W[an];B[le]
+;W[dj];B[];W[de];B[bg];W[];B[]
+C[final_score: W+74.5
+D15 removed
+F15 removed
+E14 removed
+L13 removed
+P12 removed
+K10 removed
+F8 removed
+P7 removed
+F6 removed
+H6 removed
+N4 removed
+E2 removed
+J2 removed]
+)
diff --git a/regression/games/nngs/beedee-gnugo-3.5.3-200401140035.sgf b/regression/games/nngs/beedee-gnugo-3.5.3-200401140035.sgf
new file mode 100644 (file)
index 0000000..6ba66a1
--- /dev/null
@@ -0,0 +1,53 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[beedee]WR[2d*]
+PB[GnuGo (GNU Go 3.5.3)]BR[8k*]
+PC[NNGS]DT[2004-01-14]AP[gnugoclient:2.0]
+RE[W+13.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[cf];B[fd];W[cn];B[co];W[dn];B[fp];W[fj];B[ek];W[gl];B[il];W[fn]
+;B[hp];W[ei];B[ef];W[dg];B[mp];W[qf];B[pf];W[qe];B[pe];W[qd];B[qh]
+;W[pc];B[oc];W[qc];B[ob];W[qn];B[hh];W[bd];B[cc];W[qq];B[pq];W[qp]
+;B[bo];W[po];B[bn];W[bm];B[cm];W[bl];B[ck];W[bj];B[dm];W[em];B[bk]
+;W[ak];B[bi];W[ci];B[cj];W[ai];B[bh];W[ch];B[nm];W[bg];B[aj];W[cl]
+;B[dl];W[bj];B[am];W[ah];B[ql];W[nq];B[mq];W[np];B[nr];W[or];B[mr]
+;W[oq];B[bc];W[hc];B[he];W[pg];B[qg];W[eq];B[ep];W[og];B[ib];W[ic]
+;B[jc];W[hb];B[jb];W[ec];B[fq];W[ed];B[be];W[de];B[fc];W[fb];B[ee]
+;W[db];B[ga];W[ha];B[cb];W[fe];B[ff];W[ie];B[ge];W[id];B[ce];W[df]
+;B[eo];W[ii];B[kf];W[if];B[gc];W[gb];B[hf];W[ig];B[ih];W[hg];B[ji]
+;W[gg];B[en];W[ke];B[je];W[lf];B[lg];W[jf];B[kg];W[me];B[nd];W[md]
+;B[mb];W[mg];B[lh];W[kd];B[nf];W[mf];B[ng];W[mh];B[om];W[nh];B[of]
+;W[lb];B[lc];W[mc];B[la];W[kb];B[kc];W[nb];B[ka];W[nc];B[od];W[oh]
+;B[na];W[li];B[jg];W[ki];B[jh];W[mk];B[pm];W[lm];B[ml];W[kk];B[in]
+;W[hk];B[ik];W[jm];B[im];W[ko];B[mo];W[kp];B[kq];W[pr];B[lp];W[jo]
+;B[io];W[ll];B[rk];W[rm];B[nk];W[mm];B[mj];W[nl];B[lj];W[kj];B[ok]
+;W[mi];B[ni];W[mn];B[nn];W[jn];B[ld];W[lo];B[jl];W[kl];B[kn];W[no]
+;B[jq];W[ri];B[qi];W[rj];B[qj];W[rl];B[sj];W[oi];B[nj];W[si];B[sk]
+;W[qk];B[pk];W[ol];B[le];W[sl];B[qk];W[rg];B[rh];W[rf];B[ra];W[rb]
+;B[dc];W[eb];B[sh];W[ri];B[qm];W[rn];B[qa];W[pn];B[lk];W[ml];B[ne]
+;W[sg];B[fm];W[gm];B[fl];W[fk];B[el];W[go];B[hj];W[gh];B[gi];W[fi]
+;B[gj];W[cq];B[dq];W[dr];B[br];W[cr];B[bq];W[fr];B[gk];W[hr];B[er]
+;W[gq];B[fs];W[gs];B[es];W[jr];B[gp];W[hq];B[ir];W[iq];B[is];W[js]
+;B[kr];W[hs];B[ip];W[di];B[al];W[on];B[qb];W[pb];B[pa];W[sb];B[bf]
+;W[aj];B[da];W[ea];B[ca];W[af];B[ae];W[ns];B[ms];W[os];B[ag];W[pl]
+;B[ia];W[ej];B[af];W[ph];B[oa];W[oj];B[sa];W[rc];B[jk];W[pi];B[kh]
+;W[rj];B[];W[si];B[];W[hd];B[];W[fh];B[];W[gd];B[]
+C[final_score: W+13.5
+G19 removed
+F17 removed
+B16 removed
+E15 removed
+G15 removed
+J11 removed
+H9 removed
+G8 removed
+C6 removed
+F6 removed
+L6 removed
+G5 removed
+Q4 removed
+C3 removed
+G3 removed
+F2 removed
+K2 removed]
+)
diff --git a/regression/games/nngs/camel-gnugo-3.1.26-200202280809.sgf b/regression/games/nngs/camel-gnugo-3.1.26-200202280809.sgf
new file mode 100644 (file)
index 0000000..6a1beab
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[camel]WR[13k]
+PB[GnuGo (GNU Go 3.1.26)]BR[14k*]
+PC[NNGS]DT[2002-02-28]AP[gnugoclient:2.0]
+AB[pd][dp]
+;W[dd];B[fc];W[ic];B[fe];W[df];B[op];W[nd];B[pf];W[ie];B[qp];W[cn]
+;B[ch];W[eg];B[gb];W[db];B[oc];W[nc];B[qj];W[fp];B[eo];W[em];B[ck]
+;W[ip];B[dn];W[dm];B[co];W[bn];B[cr];W[cl];B[er];W[fr];B[dk];W[fk]
+;B[nf];W[cg];B[bl];W[bm];B[kd];W[kc];B[lc];W[kb];B[ib];W[jb];B[mb]
+;W[nb];B[ob];W[mc];B[le];W[lb];B[kq];W[eq];B[dq];W[es];B[ds];W[dr]
+;B[bs];W[bq];B[er];W[bo];B[fs];W[gs];B[es];W[cq];B[bj];W[gq];B[lf]
+;W[bh];B[al];W[bi];B[ci];W[aj];B[ak];W[ag];B[ei];W[gg];B[hc];W[ia]
+;B[ln];W[hb];B[ar];W[br];B[bp];W[aq];B[ap]C[L:6];W[as];B[cp]C[L:5]
+;W[cs];B[dr];W[en]C[game adjourned])
diff --git a/regression/games/nngs/camel-gnugo-3.1.26-200203022335.sgf b/regression/games/nngs/camel-gnugo-3.1.26-200203022335.sgf
new file mode 100644 (file)
index 0000000..d75d71a
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[camel]WR[13k]
+PB[GnuGo (GNU Go 3.1.26)]BR[13k*]
+PC[NNGS]DT[2002-03-02]AP[gnugoclient:2.0]
+RE[W+45.5]
+AB[dd][pd][dp]
+;W[pp];B[nq];W[kq];B[no];W[pn];B[ql];W[ol];B[pj];W[fq];B[cn];W[dr]
+;B[cq];W[ko];B[fo];W[hp];B[jd];W[cg];B[ce];W[gd];B[ci];W[eg];B[mc]
+;W[qc];B[qd];W[pc];B[rc];W[rb];B[rd];W[oc];B[pr];W[qq];B[qr];W[mr]
+;B[rq]C[L:9];W[rp];B[rr]C[L:7];W[op];B[nr]C[L:8];W[np];B[mq]C[L:9]
+;W[lr];B[ei]C[L:10];W[od];B[hn]C[L:9];W[pf];B[sb]C[L:8];W[qa];B[rf]
+;W[qh];B[rh]C[L:9];W[ri];B[qg]C[L:8];W[pi];B[sg];W[pg];B[qf]C[L:6]
+;W[jf];B[qj]C[L:4];W[qi];B[oj]C[L:5];W[lk];B[hl]C[L:6];W[ni];B[cr]
+C[L:7];W[er];B[hi]C[L:8];W[dc];B[cc];W[ec];B[hc]C[L:9];W[cb];B[bb]
+C[L:7];W[bc];B[cd]C[L:5];W[ab];B[ff]C[L:6];W[fg];B[gg]C[L:4];W[ef]
+;B[bd]C[L:5];W[ac];B[ee];W[fe];B[fd]C[L:4];W[gf];B[ed]C[L:5];W[fc]
+;B[bg]C[L:6];W[ch];B[bh]C[L:7];W[cf];B[bf]C[L:8];W[md];B[ld]C[L:7]
+;W[me];B[gc]C[L:8];W[hd];B[ic];W[eb];B[ie]C[L:9];W[if];B[si]C[L:10]
+;W[sj];B[rj];W[sh];B[rg]C[L:7];W[si];B[se]C[L:8];W[pe];B[qe]C[L:9]
+;W[mb];B[lb]C[L:4];W[nc];B[lc]C[L:5];W[nb];B[ji]C[L:6];W[lh];B[he]
+C[L:7];W[ge];B[hf]C[L:8];W[gh];B[hg]C[L:9];W[fi];B[ig]C[L:7];W[fj]
+;B[kf];W[hk];B[gl];W[gk];B[ik]C[L:8];W[fl];B[ek]C[L:6];W[ej];B[di]
+C[L:5];W[dj];B[fk]C[L:4];W[ij];B[hj]C[L:3];W[gj];B[eh]C[L:4];W[fh]
+;B[hh]C[L:5];W[cj];B[bi]C[L:6];W[el];B[jk]C[L:7];W[bj];B[aj]C[L:8]
+;W[ak];B[bk]C[L:9];W[ai];B[ae];W[ba];B[ad];W[bl];B[fm]C[L:10];W[em]
+;B[en];W[dm];B[kl];W[ll];B[qo];W[ro];B[qn];W[qp];B[bm];W[cm];B[bn]
+;W[ck];B[km];W[lm];B[nm]C[L:9];W[om];B[nn]C[L:7];W[mp];B[kn]C[L:8]
+;W[ln];B[jo]C[L:9];W[jp];B[lo];W[mo];B[kp]C[L:10];W[lp];B[ko];W[ip]
+;B[lq];W[jr];B[gb];W[kj];B[jj];W[kh];B[jh];W[kg];B[lf];W[jg];B[mf]
+;W[nf];B[ds];W[es];B[cs];W[mg];B[fb];W[fa];B[ga];W[ea];B[go];W[gp]
+;B[ep];W[ke];B[le];W[je];B[ah];W[la];B[ka]C[L:9];W[ma];B[kd];W[am]
+;B[an]C[L:8];W[io];B[in]C[L:9];W[dn];B[do]C[L:10];W[oq];B[or];W[sq]
+;B[sr];W[rn];B[sp];W[so];B[ki];W[li];B[kk];W[lj];B[df];W[dg];B[ms]
+;W[ls];B[ns];W[lg];B[fp];W[eq];B[sq];W[aj];B[de];W[ff];B[al];W[id]
+;B[jb];W[am];B[dl];W[dk];B[al];W[ra];B[am];W[sa];B[sc];W[gq];B[dq]
+;W[gi];B[ho];W[dh];B[pq];W[qm];B[]
+C[final_score: W+45.5
+J10 removed
+P10 removed
+D8 removed
+R8 removed
+O7 removed
+R6 removed]
+)
diff --git a/regression/games/nngs/ccwills-gnugo-3.3.21-200306131816.sgf b/regression/games/nngs/ccwills-gnugo-3.3.21-200306131816.sgf
new file mode 100644 (file)
index 0000000..0c6be9a
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ccwills]WR[11k*]
+PB[GnuGo (GNU Go 3.3.21)]BR[10k*]
+PC[NNGS]DT[2003-06-13]AP[gnugoclient:2.0]
+RE[B+2.5]
+;B[pd];W[dp];B[pp];W[dd];B[fc];W[df];B[jd];W[nq];B[cn];W[cl];B[cq]
+;W[cp];B[dq];W[ep];B[en];W[jp];B[bp];W[bo];B[bq];W[co];B[fr];W[gn]
+;B[el];W[dj];B[qn];W[pr];B[qq];W[hr];B[db];W[cc];B[no];W[gl];B[ff]
+;W[eg];B[qr];W[or];B[qk];W[qf];B[qh];W[of];B[nd];W[rd];B[qc];W[oh]
+;B[rc];W[ld];B[kc];W[mc];B[nc];W[mf];B[mb];W[ok];B[lo];W[lq];B[hf]
+;W[fg];B[cb];W[bb];B[fp];W[fo];B[eq];W[eo];B[hq];W[ir];B[gp];W[iq]
+;B[hh];W[fi];B[re];W[jf];B[lm];W[lk];B[jn];W[ho];B[ke];W[le];B[kf]
+;W[lh];B[kg];W[kh];B[jh];W[rf];B[qd];W[rh];B[ri];W[qi];B[qj];W[pi]
+;B[rg];W[pm];B[ol];W[pl];B[pk];W[nl];B[om];W[nm];B[on];W[mn];B[jl]
+;W[jj];B[kk];W[ll];B[oj];W[nk];B[pj];W[nj];B[mo];W[ln];B[km];W[kn]
+;B[ik];W[ij];B[qg];W[pg];B[ba];W[bc];B[ps];W[os];B[qs];W[ko];B[hj]
+;W[hk];B[ii];W[kj];B[gk];W[hl];B[gi];W[fk];B[gj];W[fj];B[ao];W[bn]
+;B[hp];W[io];B[lc];W[gh];B[hi];W[hg];B[ig];W[gg];B[gf];W[ji];B[ih]
+;W[lg];B[ee];W[de];B[sf];W[ph];B[sg];W[oi];B[sj];W[md];B[qe];W[pf]
+;B[an];W[am];B[ap];W[bm];B[ed];W[dc];B[ec];W[kd];B[gr];W[gs];B[fs]
+;W[hs];B[ne];W[nf];B[op];W[oq];B[lp];W[kq];B[mq];W[mr];B[mp];W[lf]
+;B[je];W[nn];B[oe];W[pe];B[pq];W[ms];B[np];W[go];B[ab];W[ac];B[ca]
+;W[eb];B[fb];W[aa];B[ea];W[ab];B[ip];W[kp];B[ef];W[me];B[]
+C[final_score: B+2.5
+S16 removed
+K14 removed
+S12 removed
+J9 removed
+L9 removed
+E8 removed
+K8 removed
+Q8 removed
+L7 removed
+C6 removed
+E6 removed
+K6 removed]
+)
diff --git a/regression/games/nngs/ccwills-gnugo-3.4-200308231739.sgf b/regression/games/nngs/ccwills-gnugo-3.4-200308231739.sgf
new file mode 100644 (file)
index 0000000..2a16fd2
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ccwills]WR[9k*]
+PB[GnuGo (GNU Go 3.4)]BR[8k*]
+PC[NNGS]DT[2003-08-23]AP[gnugoclient:2.0]
+RE[B+5.5]
+;B[pd];W[dp];B[qp];W[dd];B[kq];W[op];B[pn];W[qq];B[rq];W[pq];B[ro]
+;W[mq];B[cf];W[fc];B[bd];W[cc];B[ci];W[jd];B[cn];W[gq];B[lc];W[en]
+;B[dl];W[nn];B[cp];W[cq];B[jb];W[co];B[dn];W[bn];B[bm];W[bo];B[ko]
+;W[nl];B[qf];W[nj];B[hp];W[hq];B[pj];W[iq];B[pl];W[fl];B[oc];W[fj]
+;B[jn];W[hn];B[jl];W[hl];B[jj];W[hj];B[bc];W[ln];B[oh];W[mh];B[in]
+;W[ho];B[ip];W[jq];B[lq];W[jp];B[lo];W[mp];B[mo];W[no];B[ki];W[lj]
+;B[io];W[km];B[il];W[ik];B[jk];W[jm];B[im];W[hm];B[lk];W[ll];B[mk]
+;W[nk];B[kj];W[mj];B[gp];W[fq];B[rr];W[qr];B[cb];W[db];B[am];W[an]
+;B[bb];W[ic];B[ib];W[eg];B[ef];W[gf];B[do];W[eo];B[bp];W[dq];B[bq]
+;W[br];B[em];W[fm];B[fe];W[kf];B[jg];W[kg];B[ih];W[gh];B[jr];W[ir]
+;B[kh];W[lh];B[ge];W[hf];B[fa];W[he];B[ks];W[lr];B[mr];W[nr];B[hc]
+;W[jf];B[of];W[ms];B[ar];W[bs];B[dg];W[eh];B[hd];W[id];B[om];W[nm]
+;B[le];W[mf];B[me];W[nf];B[ne];W[qc];B[qd];W[rd];B[re];W[sc];B[pb]
+;W[qb];B[sb];W[rb];B[se];W[sa];B[sd];W[qa];B[rc];W[ap];B[ao];W[rd]
+;B[mm];W[mn];B[rc];W[pc];B[ob];W[rd];B[cr];W[dr];B[qs];W[ps];B[rs]
+;W[rc];B[dh];W[ei];B[dj];W[el];B[dm];W[ej];B[ng];W[mg];B[oi];W[ff]
+;B[de];W[kd];B[pp];W[oq];B[ld];W[nh];B[og];W[po];B[qo];W[oo];B[ek]
+;W[fk];B[dk];W[ed];B[ee];W[gb];B[cd];W[hb];B[gd];W[ea];B[eb];W[da]
+;B[dc];W[fb];B[ca];W[kc];B[kb];W[lf];B[ke];W[je];B[ni];W[mi];B[ok]
+;W[oj];B[ol];W[on];B[pa];W[ml];B[di];W[cs];B[aq];W[as];B[jc];W[];B[]
+C[final_score: B+5.5
+F18 removed
+D16 removed
+K13 removed
+J12 removed
+L12 removed
+M9 removed
+N7 removed
+L5 removed
+L3 removed
+K2 removed
+L1 removed]
+)
diff --git a/regression/games/nngs/ccwills-gnugo-3.5.2-200312112026.sgf b/regression/games/nngs/ccwills-gnugo-3.5.2-200312112026.sgf
new file mode 100644 (file)
index 0000000..875a3aa
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ccwills]WR[9k*]
+PB[GnuGo (GNU Go 3.5.2)]BR[8k*]
+PC[NNGS]DT[2003-12-11]AP[gnugoclient:2.0]
+RE[W+5.5]
+;B[pd];W[dp];B[pq];W[dd];B[fq];W[qo];B[op];W[on];B[fc];W[df];B[ic]
+;W[jq];B[cn];W[eo];B[cq];W[dq];B[cp];W[em];B[do];W[fp];B[dr];W[eq]
+;B[mp];W[lq];B[mq];W[lp];B[nn];W[om];B[qp];W[po];B[qh];W[pj];B[fr]
+;W[er];B[dl];W[cr];B[gq];W[hr];B[br];W[ds];B[rj];W[qk];B[oh];W[nc]
+;B[lc];W[pb];B[qc];W[qb];B[ch];W[eh];B[dj];W[el];B[ln];W[jn];B[rb]
+;W[mb];B[bf];W[pc];B[rc];W[lb];B[rk];W[rl];B[fj];W[eb];B[md];W[bd]
+;B[fb];W[nd];B[pf];W[nf];B[dk];W[gl];B[jd];W[mr];B[nr];W[lr];B[ec]
+;W[db];B[dc];W[cc];B[kb];W[mc];B[ld];W[me];B[ce];W[cd];B[kg];W[gg]
+;B[od];W[oc];B[la];W[ma];B[qa];W[ob];B[jf];W[pa];B[na];W[oe];B[pe]
+;W[nh];B[ni];W[mh];B[ge];W[mi];B[ll];W[le];B[nj];W[ke];B[mj];W[de]
+;B[li];W[lh];B[lg];W[mg];B[og];W[of];B[ki];W[kh];B[jh];W[kc];B[kd]
+;W[ka];B[jb];W[je];B[jj];W[ie];B[hf];W[if];B[ig];W[hg];B[jm];W[hd]
+;B[gd];W[hc];B[hb];W[gc];B[gf];W[gb];B[ia];W[fa];B[id];W[he];B[ha]
+;W[ga];B[im];W[in];B[kn];W[ko];B[hn];W[ih];B[hp];W[ip];B[jg];W[hm]
+;B[hh];W[fg];B[rp];W[ro];B[pl];W[qm];B[ql];W[rm];B[pk];W[ok];B[qj]
+;W[pm];B[sl];W[sm];B[so];W[sn];B[qn];W[sp];B[sk];W[rq];B[rr];W[qq]
+;B[pp];W[qr];B[ol];W[rs];B[nm];W[oo];B[hk];W[hl];B[ra];W[la];B[ja]
+;W[ii];B[gi];W[ei];B[il];W[gk];B[gj];W[dm];B[cm];W[dn];B[co];W[pr]
+;B[no];W[or];B[nq];W[ns];B[lo];W[jp];B[cf];W[dg];B[cg];W[ej];B[bs]
+;W[cs];B[gh];W[ik];B[hj];W[km];B[jl];W[jk];B[kl];W[kk];B[ng];W[mf]
+;B[be];W[lf];B[ji];W[ek];B[oq];W[ae];B[af];W[ad];B[di];W[dh];B[ij]
+;W[fk];B[fh];W[fi];B[kf];W[ca];B[]C[final_score: W+5.5
+O19 removed
+F18 removed
+L17 removed
+G16 removed
+J12 removed
+Q10 removed
+J9 removed
+P9 removed
+L7 removed
+H6 removed
+R6 removed
+H4 removed
+F3 removed
+S2 removed]
+)
diff --git a/regression/games/nngs/ccwills-gnugo-3.5.3-200401100810.sgf b/regression/games/nngs/ccwills-gnugo-3.5.3-200401100810.sgf
new file mode 100644 (file)
index 0000000..29392ee
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[ccwills]WR[9k*]
+PB[GnuGo (GNU Go 3.5.3)]BR[8k*]
+PC[NNGS]DT[2004-01-10]AP[gnugoclient:2.0]
+RE[W+3.5]
+;B[pd];W[dp];B[pp];W[dd];B[fc];W[hc];B[fe];W[df];B[id];W[ic];B[fg]
+;W[gd];B[fd];W[he];B[dh];W[cg];B[ch];W[db];B[fq];W[cn];B[dr];W[cq]
+;B[iq];W[nc];B[pf];W[pb];B[qc];W[ld];B[cl];W[hg];B[cr];W[fo];B[qi]
+;W[qn];B[pn];W[nq];B[qo];W[qq];B[qm];W[pq];B[lq];W[mp];B[qb];W[ob]
+;B[mg];W[rn];B[ro];W[rl];B[rm];W[ql];B[pm];W[pj];B[ok];W[oj];B[bh]
+;W[bg];B[pl];W[qj];B[rj];W[rk];B[ri];W[oh];B[og];W[nh];B[mh];W[nk]
+;B[mj];W[nj];B[ml];W[ol];B[nm];W[pk];B[nn];W[mk];B[lk];W[mi];B[lj]
+;W[li];B[ng];W[ki];B[lo];W[ll];B[lp];W[kk];B[lm];W[kl];B[fi];W[el]
+;B[hh];W[jg];B[ih];W[ig];B[ik];W[nl];B[gk];W[dj];B[ek];W[dl];B[dk]
+;W[cm];B[bl];W[bm];B[bq];W[bp];B[br];W[ho];B[ap];W[ao];B[dq];W[cp]
+;B[sr];W[rp];B[mr];W[so];B[nr];W[sn];B[sm];W[sp];B[or];W[oq];B[op]
+;W[no];B[np];W[qp];B[mq];W[pr];B[rr];W[mm];B[po];W[ln];B[pa];W[oa]
+;B[qa];W[mn];B[mo];W[ph];B[qg];W[pg];B[ag];W[be];B[af];W[qf];B[qe]
+;W[of];B[rf];W[oe];B[ae];W[bc];B[od];W[ne];B[am];W[an];B[al];W[aq]
+;B[ac];W[ab];B[ad];W[bb];B[kn];W[km];B[gb];W[hb];B[jj];W[kj];B[ep]
+;W[eo];B[cj];W[jh];B[ji];W[eb];B[ga];W[eg];B[ef];W[dg];B[de];W[ce]
+;B[ee];W[eh];B[ei];W[fh];B[gh];W[gg];B[jo];W[jn];B[in];W[ko];B[io]
+;W[ff];B[kp];W[hp];B[hq];W[fp];B[eq];W[fl];B[hn];W[gn];B[nd];W[md]
+;B[pe];W[me];B[oc];W[mb];B[bd];W[cd];B[ar];W[ap];B[bf];W[cf];B[ah]
+;W[jk];B[il];W[im];B[hm];W[kn];B[gm];W[fm];B[ip];W[gq];B[gr];W[gp]
+;B[om];W[qh];B[rh];W[pi];B[fk];W[gl];B[ps];W[qs];B[qr];W[os];B[hl]
+;W[jm];B[sl];W[sk];B[sj];W[qk];B[pc];W[ij];B[ii];W[hj];B[gi];W[]
+;B[jl];W[];B[]C[final_score: W+3.5
+G19 removed
+F17 removed
+J16 removed
+N13 removed
+D10 removed
+H10 removed
+R6 removed
+O5 removed
+P1 removed
+R1 removed]
+)
diff --git a/regression/games/nngs/chuck-gnugo-3.5.2gf1-200312261847.sgf b/regression/games/nngs/chuck-gnugo-3.5.2gf1-200312261847.sgf
new file mode 100644 (file)
index 0000000..68f0208
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[chuck]WR[1d*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-26]AP[gnugoclient:2.0]
+RE[B+12.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nd];W[pm];B[np];W[qp];B[qq];W[po];B[op];W[ro];B[rq];W[cn]
+;B[dn];W[dm];B[en];W[bo];B[bp];W[cl];B[co];W[cf];B[ce];W[ef];B[fd]
+;W[bn];B[gf];W[hq];B[of];W[qc];B[qd];W[rd];B[pc];W[rb];B[df];W[dg]
+;B[de];W[eg];B[fj];W[kq];B[ch];W[cg];B[be];W[cj];B[di];W[bh];B[jq]
+;W[jr];B[ir];W[kr];B[iq];W[lo];B[hr];W[fq];B[hp];W[cq];B[dq];W[cp]
+;B[nn];W[do];B[ol];W[qk];B[qj];W[rj];B[lm];W[nr];B[pr];W[km];B[kn]
+;W[ko];B[jn];W[ln];B[kl];W[mm];B[ll];W[mn];B[jo];W[nk];B[rs];W[nm]
+;B[eo];W[ep];B[eq];W[fl];B[fr];W[cr];B[ri];W[rk];B[qb];W[rc];B[pb]
+;W[ok];B[ra];W[rh];B[qi];W[si];B[mj];W[mk];B[gh];W[ci];B[gq];W[fp]
+;B[ds];W[cs];B[dr];W[lj];B[mi];W[li];B[lk];W[mh];B[ni];W[nh];B[pg]
+;W[oi];B[qh];W[rg];B[lf];W[lg];B[gm];W[gl];B[jh];W[jc];B[ic];W[ib]
+;B[kc];W[jb];B[hc];W[hb];B[gb];W[gc];B[gd];W[kd];B[ke];W[id];B[fc]
+;W[je];B[ld];W[jd];B[jf];W[lc];B[mb];W[lb];B[mc];W[kb];B[mq];W[lq]
+;B[mr];W[no];B[hk];W[hm];B[gn];W[hl];B[rp];W[qo];B[dk];W[em];B[ck]
+;W[bk];B[fo];W[dh];B[if];W[kg];B[kf];W[ik];B[ij];W[gk];B[jm];W[hj]
+;B[fh];W[hi];B[oo];W[on];B[bf];W[bg];B[ng];W[hh];B[hg];W[jk];B[jg]
+;W[kj];B[ih];W[kk];B[hn];W[mp];B[ms];W[ls];B[nq];W[kp];B[lr];W[hd]
+;B[gc];W[ha];B[ml];W[nl];B[jl];W[gj];B[mg];W[kh];B[oh];W[nj];B[ks]
+;W[js];B[pk];W[pl];B[so];W[sn];B[sp];W[rm];B[qe];W[re];B[eh];W[qg]
+;B[ag];W[ah];B[af];W[ga];B[fa];W[pf];B[ph];W[pe];B[oe];W[ee];B[ed]
+;W[ma];B[na];W[la];B[ek];W[fm];B[gi];W[fn];B[gp];W[is];B[fg];W[he]
+;B[im];W[ge];B[hf];W[fe];B[oj];W[ni];B[fk];W[sb];B[hs];W[co];B[dl]
+;W[bl];B[ls];W[sa];B[qa];W[ki];B[ii];W[pi];B[og];W[il];B[ff];W[ie]
+;B[el];W[];B[ji];W[];B[]C[B4 removed
+final_score: B+12.5
+P8 removed
+O2 removed]
+)
diff --git a/regression/games/nngs/evand-gnugo-3.3.11-200211151742.sgf b/regression/games/nngs/evand-gnugo-3.3.11-200211151742.sgf
new file mode 100644 (file)
index 0000000..6625587
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[5.5]
+PW[evand]WR[11k*]
+PB[GnuGo (GNU Go 3.3.11)]BR[11k*]
+PC[NNGS]DT[2002-11-15]AP[gnugoclient:2.0]
+RE[W+3.5]
+AB[dd][pd][jj][dp][pp]
+;W[fp];B[dn];W[cf];B[fc];W[bd];B[cc];W[ci];B[hq];W[fn];B[fq];W[bc]
+;B[eq];W[hc];B[jc];W[gd];B[mc];W[hg];B[pj];W[pn];B[np];W[nn];B[bb]
+;W[db];B[cb];W[fb];B[df];W[dg];B[lp];W[ln];B[ec];W[eb];B[de];W[pg]
+;B[ab];W[ce];B[gc];W[gb];B[eg];W[dh];B[qd];W[eh];B[fe];W[fd];B[ed]
+;W[hd];B[ff];W[fg];B[ef];W[gf];B[ck];W[dj];B[qo];W[qn];B[rn];W[rm]
+;B[ro];W[ql];B[jo];W[jm];B[hj];W[dk];B[dl];W[el];B[dm];W[fl];B[fj]
+;W[ng];B[lj];W[lg];B[pl];W[qh];B[rj];W[qk];B[qj];W[pk];B[oj];W[ok]
+;B[nj];W[jg];B[ml];W[nk];B[mk];W[mi];B[mj];W[kk];B[jk];W[kl];B[ki]
+;W[kj];B[bj];W[bi];B[ek];W[fk];B[ej];W[hl];B[lm];W[km];B[sl];W[sm]
+;B[nl];W[ol];B[rk];W[pm];B[gk];W[gl];B[kn];W[mm];B[ll];W[jn];B[ko]
+;W[io];B[ii];W[hk];B[li];W[mh];B[gi];W[fi];B[hh];W[gj];B[mf];W[mg]
+;B[ip];W[ho];B[gk];W[jh];B[ji];W[gj];B[nm];W[rl];B[gk];W[on];B[gj]
+;W[mn];B[sk];W[ik];B[gh];W[fh];B[si];W[ri];B[gg];W[hf];B[qf];W[sh]
+;B[ai];W[ah];B[aj];W[bg];B[nf];W[of];B[oe];W[lf];B[me];W[le];B[ld]
+;W[kd];B[kc];W[jd];B[rg];W[rh];B[cj];W[di];B[gp];W[go];B[pf];W[og]
+;B[ib];W[hb];B[ic];W[id];B[hp];W[eo];B[do];W[oo];B[op];W[mo];B[mp]
+;W[sg];B[sf];W[qg];B[rf];W[cd];B[dc];W[sn];B[so];W[po];B[ha];W[ga]
+;B[ia];W[ca];B[ba];W[da];B[qp];W[ac];B[ge];W[he];B[em];W[fm];B[ep]
+;W[fo];B[lo];W[no];B[en];W[];B[]
+C[final_score: W+3.5
+G13 removed
+J11 removed
+T11 removed])
diff --git a/regression/games/nngs/evand-gnugo-3.3.17-200303201727.sgf b/regression/games/nngs/evand-gnugo-3.3.17-200303201727.sgf
new file mode 100644 (file)
index 0000000..463f971
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[evand]WR[6k*]
+PB[GnuGo (GNU Go 3.3.17)]BR[10k*]
+PC[NNGS]DT[2003-03-20]AP[gnugoclient:2.0]
+RE[W+99.5]
+AB[dd][pd][dp][pp]
+;W[qf];B[pj];W[nc];B[oe];W[qc];B[pc];W[qd];B[og];W[fc];B[hc];W[cc]
+;B[cd];W[dc];B[ed];W[fb];B[ge];W[cj];B[jp];W[qn];B[pn];W[pm];B[on]
+;W[qo];B[qp];W[ql];B[np];W[ph];B[jq];W[kc];B[cm];W[cg];B[dq];W[oh]
+;B[nj];W[mh];B[me];W[ke];B[mk];W[nd];B[lf];W[kf];B[qb];W[rb];B[ng]
+C[L:9];W[nh];B[ob];W[nb];B[qe]C[L:10];W[re];B[pe];W[rf];B[fm];W[gj]
+;B[ik];W[ii];B[ie];W[gd];B[hd];W[gl];B[eg];W[df];B[im];W[gm];B[go]
+;W[hn];B[gg];W[ef];B[bf];W[bg];B[bd];W[bc];B[fd];W[gc];B[ff];W[hf]
+;B[if];W[hg];B[he];W[ho];B[cf];W[dg];B[eh];W[gh];B[hp];W[jo];B[ko]
+;W[jn];B[jg];W[kg];B[jh];W[ji];B[kj];W[ki];B[kl];W[kn];B[kh];W[lh]
+;B[li];W[lg];B[lo];W[lm];B[ej];W[ek];B[fk]C[L:7];W[fj];B[rk];W[qk]
+;B[el]C[L:8];W[ei];B[di]C[L:9];W[dj];B[qj]C[L:10];W[rl];B[mm];W[fl]
+;B[fn];W[rj];B[ri];W[sk];B[ll];W[qi];B[ro];W[rn];B[rp];W[dl];B[em]
+;W[dm];B[dn];W[cl];B[bm];W[bl];B[cn];W[gn];B[fo];W[om];B[hj];W[hi]
+;B[mi];W[nm];B[mn];W[nn];B[no];W[hk];B[jb];W[jc];B[ib];W[kb];B[gb]
+;W[ic];B[dh];W[ci];B[de];W[ja];B[eb];W[ec];B[fa];W[db];B[ea];W[da]
+;B[al];W[ak];B[am];W[bk];B[in];W[io];B[ip];W[po];B[oo];W[ij];B[il]
+;W[jj];B[jk];W[jm];B[pi];W[qh];B[kk];W[ok];B[ni];W[nl];B[ml];W[pk]
+;B[sn];W[sm];B[so];W[hl];B[oi];W[nk];B[ln];W[km];B[hm];W[jl];B[oj]
+;W[];B[]C[final_score: W+99.5
+E19 removed
+G18 removed
+J18 removed
+P18 removed
+R18 removed
+H17 removed
+Q17 removed
+B16 removed
+N15 removed
+B14 removed
+F14 removed
+M14 removed
+E13 removed
+G13 removed
+K13 removed
+O13 removed
+S11 removed
+F9 removed]
+)
diff --git a/regression/games/nngs/evand-gnugo-3.3.21-200306130638.sgf b/regression/games/nngs/evand-gnugo-3.3.21-200306130638.sgf
new file mode 100644 (file)
index 0000000..dd6c33c
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.5]
+PW[evand]WR[5k*]
+PB[GnuGo (GNU Go 3.3.21)]BR[10k*]
+PC[NNGS]DT[2003-06-13]AP[gnugoclient:2.0]
+RE[B+9.5]
+AB[dd][pd][jj][dp][pp]
+;W[qf];B[nd];W[rd];B[qc];W[qi];B[jc];W[cf];B[df];W[dg];B[ef];W[cd]
+;B[ce];W[be];B[de];W[bg];B[cc];W[bd];B[eg];W[dh];B[bc];W[nq];B[np]
+;W[mp];B[no];W[oq];B[pq];W[lq];B[pn];W[ql];B[qn];W[fq];B[dn];W[cq]
+;B[dq];W[dr];B[er];W[cr];B[fr];W[bo];B[gq];W[je];B[jq];W[mo];B[rc]
+;W[ic];B[id];W[jd];B[hc];W[ib];B[jb];W[hd];B[ie];W[hb];B[gc];W[gd]
+;B[fc];W[if];B[he];W[hf];B[ge];W[gf];B[fe];W[kc];B[kb];W[lc];B[lb]
+;W[mc];B[re];W[qe];B[qd];W[rf];B[sd];W[mb];B[gb];W[lf];B[ob];W[cm]
+;B[el];W[dk];B[jn];W[nn];B[gj];W[fk];B[ek];W[fj];B[hl];W[ej];B[lj]
+;W[fl];B[dl];W[cl];B[fm];W[gm];B[fn];W[gl];B[km];W[gn];B[kg];W[kf]
+;B[jp];W[fo];B[en];W[gp];B[eq];W[hq];B[gr];W[hp];B[hr];W[on];B[oo]
+;W[rm];B[rn];W[ol];B[mn];W[mm];B[ln];W[mr];B[nm];W[om];B[nl];W[nk]
+;B[ml];W[mk];B[ll];W[ni];B[or];W[nr];B[pr];W[kr];B[ls];W[jr];B[lp]
+;W[lo];B[kp];W[ir];B[fp];W[iq];B[ko];W[mq];B[gk];W[eo];B[do];W[dm]
+;B[ep];W[go];B[hs];W[sn];B[so];W[sm];B[rp];W[gi];B[hi];W[gh];B[bp]
+;W[cp];B[og];W[ph];B[pf];W[pg];B[of];W[oh];B[sf];W[rg];B[em];W[co]
+;B[ad];W[ae];B[ac];W[im];B[il];W[jm];B[in];W[hm];B[jl];W[lk];B[kk]
+;W[ng];B[mj];W[nj];B[cn];W[bn];B[qm];W[rk];B[pl];W[pk];B[pm];W[ok]
+;B[jh];W[eh];B[fg];W[hh];B[hj];W[ih];B[jg];W[jf];B[ii];W[li];B[ki]
+;W[mi];B[kj];W[la];B[ia];W[ka];B[ha];W[nc];B[oc];W[nf];B[lh];W[oe]
+;B[pe];W[ne];B[sg];W[sh];B[od];W[md];B[se];W[rh];B[op];W[na];B[oa]
+;W[os];B[ps];W[ns];B[kq];W[lr];B[ds];W[cs];B[es];W[is];B[mh];W[nh]
+;B[io];W[fh];B[mg];W[mf];B[lg];W[gg];B[ig];W[ff];B[ck];W[dj];B[nb]
+;W[ma];B[ja];W[ip];B[hg];W[ho];B[hn];W[];B[]C[final_score: B+9.5
+G16 removed
+C9 removed
+N7 removed
+B4 removed
+M1 removed]
+)
diff --git a/regression/games/nngs/evand-gnugo-3.5.2-200312060932.sgf b/regression/games/nngs/evand-gnugo-3.5.2-200312060932.sgf
new file mode 100644 (file)
index 0000000..a198f79
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[evand]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2)]BR[8k*]
+PC[NNGS]DT[2003-12-06]AP[gnugoclient:2.0]
+RE[W+18.5]
+AB[gc][cg]
+;W[fg];B[gf];W[gg];B[ef];W[ff];B[fe];W[ee];B[de];W[ed];B[cf];W[eg]
+;B[df];W[fd];B[ge];W[gd];B[hd];W[hc];B[hb];W[he];B[ic];W[hf];B[db]
+;W[cc];B[dc];W[dd];B[cd];W[bd];B[ce];W[cb];B[ec];W[fc];B[be];W[eb]
+;B[fb];W[da];B[bc];W[bb];B[ad];W[dh];B[ch];W[ci];B[bi];W[di];B[fa]
+;W[bh];B[ah];W[ai];B[ag];W[bi];B[bg];W[ab];B[ac];W[ie];B[id];W[ea]
+;B[gb];W[dg];B[]C[final_score: W+18.5])
diff --git a/regression/games/nngs/evand-gnugo-3.5.2gf1-200312130817.sgf b/regression/games/nngs/evand-gnugo-3.5.2gf1-200312130817.sgf
new file mode 100644 (file)
index 0000000..1c3386b
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[evand]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-13]AP[gnugoclient:2.0]
+RE[W+1.5]
+AB[gc][cg]
+;W[gg];B[cc];W[ee];B[ec];W[ce];B[be];W[bf];B[cf];W[bd];B[de];W[ae]
+;B[cd];W[be];B[ef];W[dd];B[df];W[ed];B[bc];W[dc];B[db];W[eb];B[fe]
+;W[fc];B[fd];W[ec];B[cb];W[gb];B[hc];W[hb];B[ib];W[gd];B[hd];W[ge]
+;B[ff];W[he];B[fh];W[gh];B[gi];W[hi];B[fi];W[fg];B[eh];W[eg];B[dh]
+;W[dg];B[hf];W[gf];B[ch];W[ac];B[ea];W[fb];B[fa];W[id];B[ha];W[ic]
+;B[ab];W[ba];B[bb];W[da];B[ca];W[ga];B[bg];W[da];B[ea];W[fa];B[ag]
+;W[da];B[ad];W[hh];B[ea];W[ac];B[aa];W[da];B[ad];W[ea];B[af];W[];B[]
+C[final_score: W+1.5
+H9 removed
+J8 removed
+H4 removed])
diff --git a/regression/games/nngs/evand-gnugo-3.5.2gf1-200312150903.sgf b/regression/games/nngs/evand-gnugo-3.5.2gf1-200312150903.sgf
new file mode 100644 (file)
index 0000000..16b42b0
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[evand]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-15]AP[gnugoclient:2.0]
+RE[W+18.5]
+AB[gc][cg]
+;W[fg];B[ge];W[gf];B[de];W[fe];B[dc];W[fc];B[gd];W[fd];B[fb];W[eb]
+;B[gb];W[ec];B[db];W[ea];B[da];W[hf];B[he];W[ha];B[eh];W[if];B[gh]
+;W[fh];B[fi];W[hh];B[hi];W[gg];B[gi];W[eg];B[dh];W[dg];B[id];W[cf]
+;B[bg];W[df];B[ed];W[ee];B[dd];W[hb];B[hc];W[ib];B[ic];W[bf];B[bi]
+;W[bc];B[af];W[ae];B[ag];W[be];B[ih];W[hg];B[ei];W[ig];B[ci];W[ii]
+;B[];W[ih];B[]C[final_score: W+15.5
+D9 removed
+H9 removed])
diff --git a/regression/games/nngs/evand-gnugo-3.5.2gf1-200312161910.sgf b/regression/games/nngs/evand-gnugo-3.5.2gf1-200312161910.sgf
new file mode 100644 (file)
index 0000000..49dcb9c
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[evand]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-16]AP[gnugoclient:2.0]
+RE[W+37.5]
+AB[gc][cg]
+;W[gg];B[ge];W[cd];B[ed];W[dc];B[ec];W[eg];B[be];W[bd];B[ce];W[db]
+;B[eb];W[bb];B[dh];W[eh];B[hf];W[hg];B[ad];W[ac];B[ae];W[de];B[df]
+;W[ee];B[ef];W[ff];B[dg];W[fe];B[dd];W[fd];B[ei];W[fi];B[di];W[fh]
+;B[ig];W[fc];B[fb];W[he];B[hd];W[gd];B[hc];W[ie];B[id];W[gf];B[ea]
+;W[da];B[ga];W[bh];B[bg];W[ag];B[af];W[ai];B[];W[cf];B[bf];W[ci]
+;B[ah];W[hb];B[cc];W[bc];B[ag];W[gb];B[]C[final_score: W+37.5
+E9 removed
+G9 removed
+C7 removed
+G7 removed
+H4 removed
+J3 removed
+B2 removed
+A1 removed
+C1 removed]
+)
diff --git a/regression/games/nngs/evand-gnugo-3.5.2gf1-200401072036.sgf b/regression/games/nngs/evand-gnugo-3.5.2gf1-200401072036.sgf
new file mode 100644 (file)
index 0000000..9eed562
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[13]HA[4]KM[0.5]
+PW[evand]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2004-01-07]AP[gnugoclient:2.0]
+RE[W+14.5]
+AB[dd][jd][dj][jj]
+;W[gk];B[gi];W[ch];B[eh];W[ck];B[cj];W[dk];B[ej];W[ek];B[hc];W[kg]
+;B[ig];W[ld];B[lf];W[kf];B[lg];W[kh];B[lh];W[ki];B[kc];W[ke];B[bk]
+;W[bl];B[bj];W[lc];B[ij];W[cc];B[lj];W[kj];B[cd];W[dc];B[ec];W[eb]
+;B[fc];W[bd];B[be];W[bc];B[kk];W[li];B[cf];W[fb];B[gb];W[il];B[jl]
+;W[ik];B[lk];W[jk];B[mi];W[mh];B[mg];W[kl];B[ll];W[jm];B[lm];W[le]
+;B[lb];W[mb];B[kb];W[hj];B[ii];W[hi];B[ih];W[hh];B[gf];W[hg];B[je]
+;W[if];B[jf];W[hf];B[jg];W[mj];B[mk];W[me];B[al];W[bm];B[fa];W[db]
+;B[fg];W[ge];B[ff];W[hd];B[fj];W[fk];B[ea];W[da];B[ga];W[ba];B[gh]
+;W[id];B[ic];W[fe];B[ee];W[gd];B[gc];W[ie];B[ad];W[ac];B[ae];W[mf]
+;B[kd];W[la];B[ka];W[fd];B[ed];W[mc];B[ma];W[cl];B[la];W[am];B[ak]
+;W[gj];B[gg];W[mh];B[jh];W[ji];B[]C[final_score: W+14.5
+C6 removed
+N5 removed
+M4 removed]
+)
diff --git a/regression/games/nngs/gerula-gnugo-3.2-200205041756.sgf b/regression/games/nngs/gerula-gnugo-3.2-200205041756.sgf
new file mode 100644 (file)
index 0000000..68417a9
--- /dev/null
@@ -0,0 +1,53 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[gerula]WR[8k*]
+PB[GnuGo (GNU Go 3.2)]BR[13k*]
+PC[NNGS]DT[2002-05-04]AP[gnugoclient:2.0]
+RE[W+38.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[pf];B[nd];W[qn];B[pn];W[qp];B[qo];W[ro];B[po]C[L:5];W[rq];B[pr]
+;W[qm];B[qf]C[L:6];W[qc];B[pc]C[L:5];W[qd];B[re];W[qe];B[qg]C[L:4]
+;W[pe];B[pg];W[pb];B[ob]C[L:5];W[qb];B[ol]C[L:6];W[rd];B[cf]C[L:7]
+;W[oq];B[lp]C[L:6];W[pq];B[gq];W[pm];B[om]C[L:5];W[jm];B[il]C[L:3]
+;W[mp];B[im]C[L:0];W[lo];B[kq];W[lq];B[kp];W[on];B[lm];W[kn];B[ec]
+;W[cn];B[bo];W[bn];B[bp];W[bj];B[nf];W[cc];B[lr];W[mq];B[od];W[dh]
+;B[ef];W[df];B[fh]C[L:1];W[de];B[ee]C[L:0];W[ce];B[cd];W[dg];B[cb]
+C[L:1];W[fi];B[ei]C[L:2];W[fg];B[jl]C[L:0];W[in];B[fj];W[eg];B[hg]
+;W[hf];B[gf]C[L:1];W[ff];B[if]C[L:2];W[fe];B[he];W[ed];B[bc];W[ok]
+;B[pk]C[L:0];W[nk];B[gd];W[lk];B[mm];W[km];B[ni];W[pl];B[mo];W[nn]
+;B[mn];W[kl];B[ho];W[hn];B[ci];W[cj];B[rk];W[gi];B[gh];W[di];B[be]
+;W[bf];B[dk]C[L:1];W[cl];B[jo]C[L:2];W[jn];B[li]C[L:3];W[jr];B[kr]
+C[L:2];W[eq];B[ep]C[L:0];W[fq];B[fp];W[gr];B[dq];W[dr];B[cr];W[er]
+;B[ds]C[L:1];W[fs];B[ir]C[L:2];W[hr];B[is]C[L:3];W[hs];B[iq]C[L:4]
+;W[go];B[gp]C[L:2];W[hp];B[hq]C[L:3];W[ij];B[ii]C[L:2];W[gj];B[gk]
+C[L:3];W[fk];B[ej]C[L:2];W[jk];B[ik];W[kj];B[ji]C[L:1];W[ki];B[kh]
+C[L:2];W[lh];B[mh];W[hk];B[io];W[gn];B[gl]C[L:3];W[hl];B[hj]C[L:4]
+;W[hm];B[kk];W[lj];B[lg]C[L:5];W[fl];B[hi]C[L:6];W[gm];B[gj]C[L:7]
+;W[dl];B[nm]C[L:8];W[ll];B[mr]C[L:9];W[nr];B[sf]C[L:6];W[rb];B[af]
+C[L:7];W[bg];B[fd];W[rl];B[qk]C[L:8];W[sd];B[ag]C[L:9];W[ah];B[ae]
+C[L:7];W[bh];B[sl]C[L:8];W[sm];B[pa]C[L:9];W[qa];B[oa]C[L:10];W[nb]
+;B[mj]C[L:8];W[mk];B[jk]C[L:9];W[sk];B[sj]C[L:10];W[rj];B[si]C[L:9]
+;W[ri];B[sh];W[rg];B[rf];W[oj];B[oi];W[nc];B[oc]C[L:10];W[jb];B[mc]
+C[L:7];W[mb];B[lc]C[L:6];W[lb];B[na];W[kc];B[ee]C[L:7];W[hb];B[fb]
+C[L:6];W[ma];B[kd]C[L:7];W[jc];B[ka]C[L:8];W[ja];B[ic]C[L:9];W[ib]
+;B[ha]C[L:10];W[id];B[nj]C[L:8];W[hd];B[ie]C[L:9];W[hc];B[ge]C[L:10]
+;W[of];B[ga];W[ng];B[md];W[ne];B[mf];W[og];B[sl];W[le];B[ke]C[L:8]
+;W[sk];B[oe]C[L:9];W[ph];B[qh]C[L:7];W[rh];B[sl]C[L:8];W[me];B[ld]
+;W[sk];B[sg];W[qi];B[sl]C[L:9];W[kf];B[lf]C[L:8];W[sk];B[pi]C[L:9]
+;W[se];B[ck];W[bk];B[el]C[L:10];W[em];B[ek];W[fm];B[an];W[am];B[ao]
+;W[dn];B[co];W[gb];B[ms];W[ns];B[fo]C[L:8];W[ia];B[fa]C[L:9];W[es]
+;B[cs]C[L:10];W[ef];B[en];W[do];B[gc];W[oo];B[ko];W[ln];B[mg];W[nh]
+;B[ed];W[qj];B[fn];W[ql];B[gg];W[oh];B[mi];W[];B[eh];W[];B[eo];W[]
+;B[]
+C[final_score: W+38.5
+L19 removed
+C17 removed
+C14 removed
+L14 removed
+C11 removed
+P8 removed
+Q6 removed
+H4 removed
+K2 removed
+Q2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.15-goku-200112081829.sgf b/regression/games/nngs/gnugo-3.1.15-goku-200112081829.sgf
new file mode 100644 (file)
index 0000000..815d5ce
--- /dev/null
@@ -0,0 +1,21 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.15)]WR[14k*]PB[goku]BR[18k*]PC[NNGS]DT[2001-12-08]RE[B+11.5];B[qd];W[dp];B[pq];W[dd];B[pn];W[oc]\r
+;B[pc]C[P16];W[lc];B[fc];W[od];B[pf];W[df];B[db];W[hc];B[cc];W[ec];B[eb];W[fd];B[cd]\r
+;W[qh];B[qj];W[oh]C[L:8];B[pi];W[nf]C[L:9];B[ph];W[jp]C[L:7];B[lp];W[gq]C[L:8];B[cn];W[bo]C[L:9]\r
+;B[bn];W[co];B[cj];W[kq]C[L:10];B[lq];W[mi];B[ig]C[!J16];W[id]C[L:8];B[ii]C[!M11];W[li];B[nl]\r
+;W[oi]C[L:7];B[oj];W[jf];B[jg];W[lg];B[kg];W[kf]C[L:8];B[ce];W[cf]C[L:9];B[de];W[dh];B[hf]\r
+;W[gg];B[hh];W[fb]C[L:10];B[fa];W[gb];B[di];W[bh];B[bi]C[!E6];W[en];B[dm];W[in];B[gn]\r
+;W[hm];B[gm];W[km];B[lm];W[pb]C[L:9];B[qb];W[ob]C[L:10];B[em];W[fo];B[fn];W[lr];B[mr]\r
+;W[kr]C[L:9];B[lo];W[ms];B[nr];W[ee];B[gh];W[ik]C[L:10];B[ho];W[hp];B[hn];W[ln];B[mn]\r
+;W[hl]C[L:9];B[gl];W[kn]C[L:10];B[ll];W[gk];B[hj];W[hk];B[fk];W[dn];B[gj];W[gf];B[io]\r
+;W[jo];B[ip];W[iq]C[L:9];B[ao];W[ap]C[L:10];B[an];W[bp];B[eh];W[ch];B[ci];W[qa];B[ra]\r
+;W[ga];B[gp]C[H3];W[fp]C[L:9];B[hq];W[hr]C[L:8];B[hp];W[ir]C[L:9];B[ns];W[be]C[L:6];B[bd];W[bf]C[L:7]\r
+;B[fg];W[ff]C[L:8];B[eg];W[ef]C[L:9];B[kl];W[bb]C[L:7];B[cb];W[ea]C[L:8];B[da];W[ad]C[L:9];B[ba]\r
+;W[ab]C[L:10];B[dc];W[ed];B[he]C[!J7];W[im];B[ie];W[je];B[hd];W[pa];B[rc]C[!H13];W[hg];B[if]\r
+;W[jl];B[og];W[ng];B[lh]C[N13];W[jd];B[mg];W[lf];B[mh];W[ki];B[kh];W[nh];B[pe];W[kk]\r
+;B[lk];W[lj];B[jj];W[ji];B[ij];W[kj];B[go];W[fq]C[L:8];B[nj];W[ni]C[L:9];B[mj];W[jh]C[L:7]\r
+;B[ih];W[of]C[L:8];B[pg];W[pd]C[L:9];B[qc];W[dg]C[L:10];B[ei];W[oe];B[ls];W[ks];B[mf];W[me]\r
+;B[gd];W[gc];B[ah];W[ag];B[ai];W[ge];B[ms];W[ko];B[mo];W[kp];B[];W[jk];B[];W[]C[D18 removed\r
+B19 removed\r
+R12 removed\r
+final_score: B+11.5]\r
+)\r
diff --git a/regression/games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf b/regression/games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf
new file mode 100644 (file)
index 0000000..97ef8b8
--- /dev/null
@@ -0,0 +1,39 @@
+(;FF[4]GM[1]SZ[19]HA[2]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[AdaGeek]BR[14k*]PC[NNGS]DT[2002-01-06]RE[W+0.5]AB[pd][dp];W[qp];B[ec];W[cn];B[gq];W[ck]\r
+;B[di];W[oq];B[cd];W[nc];B[pj];W[kc];B[mp];W[ql];B[pl];W[pm];B[ol];W[qk];B[qj]\r
+;W[bp];B[cq];W[hc];B[nd];W[oc];B[od];W[kq];B[mq];W[cf];B[ci];W[ef];B[op];W[ej]\r
+;B[eh];W[pp];B[oo];W[om];B[ko];W[qb];B[pc];W[pb];B[mc];W[mb];B[lb];W[lc];B[md]\r
+;W[nb];B[kb]C[K17];W[jb];B[jc];W[jd];B[ic];W[ib];B[gf];W[id];B[fg];W[fe];B[ge]C[!B12]\r
+;W[bh];B[bi]C[F16];W[bf];B[fd];W[bd];B[bc]C[!E15];W[ee];B[be];W[rd];B[bq];W[fb];B[eb]\r
+;W[em];B[nm];W[rm];B[qn];W[rn];B[pn]C[!M2];W[lr];B[mr];W[jp];B[jo];W[nr];B[ns];W[os]\r
+;B[ms];W[or];B[qr];W[rr];B[rq];W[qq];B[sr];W[rs];B[qs];W[rp];B[rc];W[qc];B[re]\r
+;W[qd];B[qe];W[se];B[rg]C[!A4];W[ap];B[dn];W[dm];B[co];W[bo];B[aq];W[bn];B[sf];W[sd]\r
+;B[al]C[!F19];W[fa];B[bl];W[gm];B[im]C[!K2];W[jr];B[ip];W[iq];B[hp];W[hr];B[gr];W[is]\r
+;B[gj];W[fo];B[en];W[fn];B[fl];W[el];B[fk];W[dj];B[ek];W[dk];B[fm];W[cl];B[an]\r
+;W[bm];B[aj];W[am];B[qm];W[cp];B[ep];W[do];B[eo];W[ea];B[cb];W[kh];B[kf];W[mh]\r
+;B[if];W[ih];B[of];W[fi];B[gh];W[gi];B[hi];W[fp];B[er];W[hh]C[L:9];B[hj];W[jf]C[L:7]\r
+;B[ei];W[fj]C[L:4];B[jg];W[gk]C[L:5];B[fh];W[je]C[L:6];B[jh];W[kg]C[L:7];B[ii];W[lf]C[L:8];B[ki]\r
+;W[li]C[L:9];B[kj];W[mk]C[L:10];B[lj];W[mj];B[ni];W[mi];B[kl];W[mm];B[mn];W[nn];B[on]\r
+;W[nl];B[no];W[nh];B[nk];W[ml];B[nj];W[ph];B[qh];W[hk];B[ik];W[rj];B[ri];W[sk]\r
+;B[rl];W[hl];B[hm];W[eq];B[dq];W[fq];B[fr];W[nf];B[pg];W[og];B[pf]C[#B10 better than B9\r
+B10];W[bk];B[ak]\r
+;W[oi];B[pi];W[oj];B[ok];W[oh];B[le];W[ke];B[mf];W[mg];B[me];W[da];B[ca]C[!G8];W[gl]\r
+;B[kp];W[jq];B[lq];W[ls];B[ks];W[kr];B[gs];W[ho];B[io];W[hn];B[lm];W[rk];B[pk]C[!N19]\r
+;W[ma];B[fc];W[gc];B[db];W[ha];B[nq];W[he];B[hf]C[!H1];W[hs];B[gp];W[go];B[si];W[in]\r
+;B[jn];W[il];B[jm];W[jk];B[jj];W[ij];B[fm];W[ji];B[gn];W[gd]C[L:9];B[dg]C[#J11 is terrible.\r
+J13|L9];W[ii]\r
+;B[df];W[kk]C[L:10];B[ll];W[lk];B[ig];W[fl];B[fn];W[hg];B[jl];W[bj];B[ai];W[ie];B[cg]\r
+;W[gg];B[ff];W[ne];B[ld];W[kd];B[oe];W[ng];B[qo];W[ro];B[co];W[ad];B[ac];W[do]\r
+;B[sj];W[sl];B[co];W[ae];B[af];W[do];B[sm];W[sn];B[co]C[!A15];W[ae];B[ad];W[do];B[ia]\r
+;W[gb];B[co]C[!A13];W[ag];B[do];W[hq];B[po];W[cj];B[];W[]C[final_score: W+0.5\r
+J19 removed\r
+L18 removed\r
+S17 removed\r
+E15 removed\r
+B14 removed\r
+A13 removed\r
+B12 removed\r
+A6 removed\r
+S3 removed\r
+R2 removed\r
+T2 removed\r
+L1 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf b/regression/games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf
new file mode 100644 (file)
index 0000000..f39e5ab
--- /dev/null
@@ -0,0 +1,26 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[Mikael]BR[14k]PC[NNGS]DT[2002-01-06]RE[B+46.5];B[dp];W[pc];B[dd];W[qp];B[dj];W[fq]\r
+;B[hq];W[cq];B[cp];W[dq];B[ep];W[bq];B[fp];W[fr];B[bp];W[pe];B[jc];W[oq];B[qj]\r
+;W[qh];B[qm];W[fc];B[fd];W[gd];B[ge];W[hd];B[ed];W[lq];B[mc];W[gp];B[go];W[hp]\r
+;B[ho];W[ip];B[ie];W[ec];B[dc];W[rj];B[rk];W[ri];B[oj]C[!Q9];W[qk];B[pk];W[ql];B[pl]\r
+;W[rl]C[L:7];B[id];W[db]C[L:4];B[cb];W[ib]C[L:3];B[hc];W[hb]C[L:4];B[gc];W[gb]C[L:5];B[he];W[eb]C[L:6]\r
+;B[jb];W[fa]C[L:7];B[jj];W[pm]C[L:8];B[om];W[pn]C[L:9];B[on];W[po];B[kn];W[iq];B[mf];W[ca]C[L:10]\r
+;B[bb];W[oh];B[nh];W[io];B[in]C[O13];W[of];B[mo];W[kp];B[oi];W[ng];B[mg];W[ni];B[mh]\r
+;W[ja];B[ka];W[ia];B[kb];W[ap];B[ao];W[aq];B[bo];W[pi];B[pj];W[nb];B[nc];W[oc]\r
+;B[mb];W[oa];B[nf];W[og];B[mp];W[mq];B[eq];W[er];B[op];W[pp];B[nq];W[nr];B[np]\r
+;W[or];B[ko];W[ne];B[nd];W[me];B[od];W[oe];B[le];W[jo];B[jn];W[qi];B[pd];W[qd]\r
+;B[qc];W[qb];B[rc];W[rb];B[na];W[ma];B[la];W[qe];B[na];W[ob];B[lp];W[hn];B[gm]\r
+;W[gn];B[fo];W[ba];B[aa]C[A18];W[da];B[ab];W[cc];B[bc];W[oo];B[no];W[nn]C[L:8];B[nm]\r
+;W[md]C[L:9];B[ld];W[ma]C[L:10];B[hm];W[na];B[];W[bd];B[cd];W[nj]C[L:9];B[nk];W[mk]C[L:8];B[mj]\r
+;W[lj]C[L:9];B[li];W[ol]C[L:7];B[mi];W[ic]C[L:8];B[];W[mm]C[L:9];B[mn];W[bf]C[L:7];B[be];W[]C[final_score: B+46.5\r
+R17 removed\r
+B16 removed\r
+B14 removed\r
+M10 removed\r
+N9 removed\r
+S9 removed\r
+P8 removed\r
+N7 removed\r
+R7 removed\r
+G6 removed\r
+H3 removed]\r
+)\r
diff --git a/regression/games/nngs/gnugo-3.1.18-Rufus-200201051408.sgf b/regression/games/nngs/gnugo-3.1.18-Rufus-200201051408.sgf
new file mode 100644 (file)
index 0000000..1a3e698
--- /dev/null
@@ -0,0 +1,12 @@
+(;FF[4]GM[1]GM[1]FF[4]
+SZ[9]HA[4]KM[0.5]
+PW[GnuGo (GNU Go 3.1.18)]WR[14k*]
+PB[Rufus]BR[30k]
+PC[NNGS]DT[2002-01-05]AP[gnugoclient:2.0]
+RE[B+76.5]
+AB[cc][gc][cg][gg]
+;W[cf];B[bf];W[dg];B[df];W[]
+C[final_score: B+74.5
+C4 removed
+D3 removed])
+
diff --git a/regression/games/nngs/gnugo-3.1.18-Rufus-200201051411.sgf b/regression/games/nngs/gnugo-3.1.18-Rufus-200201051411.sgf
new file mode 100644 (file)
index 0000000..6ad54bd
--- /dev/null
@@ -0,0 +1,3 @@
+(;FF[4]GM[1]SZ[9]HA[3]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[Rufus]BR[30k]PC[NNGS]DT[2002-01-05]RE[B+26.5]AB[cc][gc][cg];W[gg];B[ee];W[fd];B[fc]\r
+;W[gd];B[hc];W[eh];B[dh];W[dg];B[df];W[eg];B[ch]C[E6];W[hd];B[id];W[ie];B[ic];W[ge]\r
+;B[ed]C[!J4];W[if];B[ei];W[fi];B[di];W[fh];B[ce];W[fe];B[ef];W[ff];B[];W[]C[final_score: B+26.5])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-Rufus-200201051823.sgf b/regression/games/nngs/gnugo-3.1.18-Rufus-200201051823.sgf
new file mode 100644 (file)
index 0000000..4435522
--- /dev/null
@@ -0,0 +1,15 @@
+(;FF[4]GM[1]SZ[19]HA[9]KM[5.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[Rufus]BR[30k]PC[NNGS]DT[2002-01-05]RE[B+26.5]AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]\r
+;W[fq];B[fd];W[fo];B[nd];W[dn];B[pf];W[cq];B[ph];W[qc];B[pc];W[qd];B[qe];W[pb]\r
+;B[ob];W[re];B[pa];W[qb];B[qa];W[qf];B[qg]C[Q15];W[rf];B[pe];W[ra];B[oa];W[rb];B[sg]\r
+;W[cl];B[rg];W[cc];B[qq];W[cd];B[eb];W[bj];B[ir];W[fm];B[nq];W[in];B[kn];W[dq]\r
+;B[se];W[rd];B[sf]C[T16];W[sc];B[qn];W[bf];B[rk];W[hl];B[jl];W[ek];B[lc];W[dh];B[ib]\r
+;W[fg];B[he];W[gi];B[dc];W[hp];B[iq];W[ih];B[kh];W[jg];B[kf];W[kg];B[lg];W[gr]\r
+;B[lh];W[hj];B[jf];W[if];B[ie];W[de];B[ee];W[ef];B[ff];W[df];B[hg];W[gf];B[fe]\r
+;W[ig];B[hf];W[ji];B[ge];W[ki];B[li];W[kj];B[lk];W[lj];B[mj];W[kk];B[ll];W[kl]\r
+;B[km];W[jm];B[jn];W[im];B[jh];W[hi];B[hh];W[ii];B[gh];W[fh];B[gg];W[cb];B[db]\r
+;W[da];B[ea];W[ca];B[ed];W[io];B[jo];W[hr];B[ip];W[is];B[js];W[hs];B[jr];W[hq]\r
+;B[lm];W[sd];B[nl];W[]C[D10 removed\r
+D4 removed\r
+final_score: B+26.5\r
+K10 removed\r
+K8 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-Rufus-200201052349.sgf b/regression/games/nngs/gnugo-3.1.18-Rufus-200201052349.sgf
new file mode 100644 (file)
index 0000000..2cdce6b
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+SZ[19]HA[7]KM[-3.5]
+PW[GnuGo (GNU Go 3.1.18)]WR[14k*]
+PB[Rufus]BR[21k]
+PC[NNGS]DT[2002-01-05]AP[gnugoclient:2.0]
+RE[W+46.5]
+AB[dd][pd][dj][jj][pj][dp][pp]
+;W[nc];B[gq];W[nq];B[er];W[fd];B[fc];W[gc];B[fb];W[kc];B[ec];W[kq]
+;B[cn];W[pr];B[cr];W[qq];B[ef];W[ie];B[be];W[qf];B[rc];W[of];B[pb]
+;W[ge];B[ee];W[qp];B[fe];W[ph];B[re];W[qi];B[qe];W[oe];B[od];W[nd]
+;B[oc];W[rk];B[nb];W[pl];B[ma];W[ko];B[mc];W[oj];B[me];W[md];B[ld]
+;W[ne];B[lc];W[le];B[ed];W[lf];B[gd];W[mi];B[kb];W[jh];B[kd];W[hp]
+;B[he];W[ll];B[gb];W[hj];B[hc];W[gm];B[fo];W[go];B[gp];W[gn];B[fn]
+;W[rf];B[sf];W[sg];B[se];W[fk];B[el];W[ir];B[hr];W[gh];B[fh];W[gg]
+;B[gf];W[fg];B[eg];W[eh];B[fi];W[ei];B[gi];W[hi];B[dh];W[ej];B[di]
+;W[hq];B[ek];W[fj];B[ck];W[gr];B[fr];W[hs];B[fs];W[if];B[gs];W[hr]
+;B[fp];W[ke];B[jc];W[id];B[hd];W[ic];B[ib];W[fl];B[fm];W[hf];B[ff]
+;W[pe];B[je];W[jd];B[jf];W[hg];B[kf];W[];B[mf];W[lg];B[];W[]
+C[K10 removed
+Q10 removed
+Q4 removed
+N14 removed
+L14 removed
+G11 removed
+final_score: W+42.5]
+)
diff --git a/regression/games/nngs/gnugo-3.1.18-bnh-200201061916.sgf b/regression/games/nngs/gnugo-3.1.18-bnh-200201061916.sgf
new file mode 100644 (file)
index 0000000..b1e7d72
--- /dev/null
@@ -0,0 +1,34 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[bnh]BR[NR]PC[NNGS]DT[2002-01-06]RE[B+59.5];B[pd];W[dp];B[pq];W[dd];B[fq];W[cn]\r
+;B[jp];W[qn];B[po];W[qf];B[fc];W[cf];B[jd];W[qi];B[qe];W[pf];B[nd];W[dj];B[pk]\r
+;W[dr];B[cc];W[dc];B[db];W[eb];B[cb];W[ec];B[fb];W[ea];B[be]C[B14|C15];W[lq]C[L:9];B[kq]\r
+;W[rk]C[L:6];B[qk]C[S8];W[qc];B[re]C[!S18];W[rb];B[pb];W[pc]C[L:7];B[oc];W[rl]C[L:8];B[rj];W[qj]C[L:7]\r
+;B[qh];W[ph];B[rh];W[rf];B[ri];W[pi]C[L:6];B[rm];W[qm]C[L:4];B[rn];W[ro];B[pg];W[og]\r
+;B[qg];W[nf];B[oh];W[oi];B[nh];W[ni];B[mh];W[lf];B[mi];W[nk];B[nj];W[oj];B[ok]\r
+;W[mj]C[L:2];B[pj];W[nj]C[L:3];B[nl];W[lj];B[kh];W[ol];B[pl];W[om];B[ng];W[of];B[nm]\r
+;W[on]C[L:4];B[mf];W[nq]C[L:2];B[np];W[qb]C[L:0];B[ob];W[rd]C[L:1];B[sf];W[me]C[L:2];B[sg];W[sc]C[L:3]\r
+;B[kg];W[mg]C[L:4];B[lg];W[se];B[sd];W[qd];B[pe];W[se];B[mf];W[sd];B[ne];W[mg];B[ce]\r
+;W[mf]C[L:5];B[de];W[nn]C[L:6];B[km];W[mp];B[oq];W[mn]C[L:3];B[no];W[ln];B[rp];W[qo]C[L:4]\r
+;B[qp];W[dh]C[L:5];B[oe];W[em]C[L:6];B[md];W[ld];B[lc];W[kf]C[L:7];B[jf];W[jg]C[L:6];B[ke]\r
+;W[ki]C[L:5];B[le];W[jh]C[L:6];B[rg];W[bf];B[ij];W[gi]C[L:7];B[gk];W[hl]C[L:8];B[gl];W[gm]C[L:6]\r
+;B[hm];W[il]C[L:5];B[gn];W[fm];B[im];W[jl]C[L:6];B[kl];W[hn];B[jm];W[jk];B[jj];W[kk]\r
+;B[hi];W[ho]C[L:5];B[hq];W[hg];B[gh];W[gg];B[fi];W[in]C[L:6];B[jn];W[fo];B[hp];W[gp]C[L:4]\r
+;B[io];W[gd]C[L:5];B[fd];W[go]C[L:6];B[fg];W[ff]C[L:3];B[eg];W[hd];B[fe];W[ge]C[L:1];B[ji]\r
+;W[jc]C[L:2];B[kc];W[ef]C[L:3];B[df];W[dg]C[L:2];B[ee];W[gf]C[L:3];B[ig];W[ek]C[L:4];B[hh];W[nr]C[L:5]\r
+;B[lr];W[qr]C[L:6];B[lp];W[rq]C[L:5];B[mo];W[pr]C[L:6];B[sp];W[or]C[L:7];B[sq];W[sr]C[L:8];B[qq]\r
+;W[mq]C[L:7];B[lo];W[rr]C[L:8];B[mr];W[fr];B[gr];W[eq];B[fs];W[es]C[L:9];B[er];W[ds]C[L:8]\r
+;B[af];W[bh];B[ah];W[fr];B[bi];W[gs]C[L:7];B[ci];W[gq]C[L:5];B[hr];W[bg]C[L:6];B[ag];W[eh]C[L:7]\r
+;B[fh];W[ch]C[L:8];B[fj];W[ej]C[L:7];B[bk];W[bm]C[L:8];B[bl];W[cl]C[L:9];B[ck];W[dk];B[dl]\r
+;W[cm]C[L:8];B[fl];W[el]C[L:9];B[hs];W[ml]C[L:7];B[fs];W[er]C[L:8];B[ll];W[kj]C[L:9];B[so];W[pn]C[L:8]\r
+;B[oo];W[ms]C[L:9];B[ks];W[lk];B[kn];W[cj]C[L:10];B[bj];W[pa];B[oa];W[qa]C[L:8];B[al];W[hk]\r
+;B[hj];W[fk]C[L:9];B[gj];W[li]C[L:10];B[lm];W[mm];B[sk];W[sl];B[am];W[an];B[sn];W[sj]\r
+;B[si];W[sk];B[gs];W[hc];B[ic];W[if]C[L:9];B[ih];W[di];B[sm];W[ql]C[L:10];B[ls];W[ns]\r
+;B[ik];W[lh];B[ei];W[]C[H17 removed\r
+E17 removed\r
+K17 removed\r
+J14 removed\r
+M16 removed\r
+final_score: B+59.5\r
+Q10 removed\r
+D8 removed\r
+G6 removed\r
+F3 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-dermicha-200201041355.sgf b/regression/games/nngs/gnugo-3.1.18-dermicha-200201041355.sgf
new file mode 100644 (file)
index 0000000..3d7c52b
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[dermicha]BR[NR]PC[NNGS]DT[2002-01-04]RE[B+11.5];B[gc];W[fd];B[gd];W[fe];B[gf];W[eg]\r
+;B[cg];W[ce];B[cc];W[bf];B[bg];W[bd];B[bc];W[fc];B[fb];W[eb];B[gb];W[gh];B[ec]\r
+;W[dc];B[ed];W[dd];B[ge];W[ee];B[fg];W[eh];B[fh]C[F1];W[gg];B[ff];W[fi];B[ef];W[df]C[L:8]\r
+;B[dg];W[ei]C[L:9];B[dh];W[cb]C[L:10];B[hi];W[ag];B[ah];W[af];B[bh];W[cf];B[di];W[fa]\r
+;B[ga];W[ea];B[gi];W[]C[final_score: B+11.5\r
+B7 removed\r
+G3 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-goku-200201042031.sgf b/regression/games/nngs/gnugo-3.1.18-goku-200201042031.sgf
new file mode 100644 (file)
index 0000000..77f9954
--- /dev/null
@@ -0,0 +1,28 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[goku]BR[16k*]PC[NNGS]DT[2002-01-04]RE[B+12.5];B[pc];W[qp];B[cd];W[cq];B[fd];W[qe]\r
+;B[pe];W[pf];B[oe]C[R16|R17|S16];W[oq];B[of];W[pg];B[je];W[kc];B[jc];W[kp];B[kd];W[pl];B[nn]\r
+;W[mp];B[dh];W[cj];B[gq];W[cm];B[jq];W[pn];B[lm];W[oi];B[gg];W[li];B[nl];W[ok]\r
+;B[nk];W[jm];B[lk];W[kj];B[kl]C[J9];W[do];B[lg];W[kh];B[jg];W[og];B[ng];W[go];B[hp]\r
+;W[ml];B[mm];W[jk];B[oj];W[nj];B[mk];W[nh];B[mh];W[hi];B[ol];W[pj];B[om];W[pm]\r
+;B[fi];W[ep];B[er];W[dr];B[eq];W[jl];B[fk];W[fj];B[gj];W[ej];B[gi];W[gk];B[hk]\r
+;W[gl];B[hj];W[hl];B[ii];W[nf];B[mg];W[bh];B[di]C[D10];W[rc];B[qd];W[rd];B[dj];W[qb]\r
+;B[pb]C[C9];W[ek];B[ci];W[ck];B[bi];W[mi];B[kg];W[es];B[fr];W[pa];B[oa];W[qa];B[oc]\r
+;W[qc];B[al];W[kq];B[dq];W[cr];B[dp];W[cp];B[co];W[fp];B[jr];W[ip];B[iq];W[bo]\r
+;B[gp];W[eo];B[hr];W[kr];B[ho];W[gn];B[bj];W[jp];B[bl];W[dk];B[cl];W[dl];B[bm]\r
+;W[bn];B[jh];W[bk];B[ak];W[pd];B[od];W[js];B[is];W[ks];B[ei];W[dm];B[np];W[nq]\r
+;B[mo];W[lo];B[oo];W[po];B[op];W[pp];B[ln];W[kn];B[in];W[hn];B[io];W[im];B[jo]\r
+;W[on];B[no];W[ji];B[lh];W[ij];B[hh];W[ik];B[ki];W[jj];B[ls];W[ko];B[km]C[K6];W[lr]\r
+;B[fs];W[ds];B[jn];W[ms];B[ns];W[os];B[pq];W[an];B[pr];W[mq];B[kh];W[lj];B[qd]\r
+;W[nc];B[ne];W[me];B[mf]C[Q16];W[mj];B[pd];W[am];B[aj];W[fq];B[gs];W[kk];B[ph];W[rf]\r
+;B[oh];W[ni];B[qh];W[];B[rg];W[qf];B[sf];W[ri];B[qg];W[re];B[qi];W[qj];B[se];W[]\r
+;B[sb];W[sg];B[sh];W[si];B[sd];W[sc];B[sg];W[pi];B[];W[]C[final_score: B+12.5\r
+T18 removed\r
+L17 removed\r
+O17 removed\r
+T16 removed\r
+N15 removed\r
+B12 removed\r
+F9 removed\r
+N8 removed\r
+C5 removed\r
+Q3 removed\r
+O1 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-goku-200201042350.sgf b/regression/games/nngs/gnugo-3.1.18-goku-200201042350.sgf
new file mode 100644 (file)
index 0000000..f5ff945
--- /dev/null
@@ -0,0 +1,20 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[goku]BR[16k*]PC[NNGS]DT[2002-01-04]RE[B+63.5];B[pc];W[dd];B[qp];W[dq];B[pf];W[oq]\r
+;B[pn];W[lq];B[pj];W[co];B[kd];W[ic];B[iq];W[io];B[jp];W[dk];B[no];W[qr];B[pq]C[Q2]\r
+;W[or];B[ni];W[gq];B[jo];W[ie];B[kf]C[!F17];W[fc];B[in]C[!O17];W[nc];B[lc];W[ig];B[kh]\r
+;W[ce];B[jk];W[kb];B[lb]C[J10|H10|G10|F10];W[dm];B[hk];W[ei];B[ii];W[gh];B[ho];W[gl]C[L:9];B[fo]\r
+;W[rq]C[L:10];B[rp];W[jr];B[mp];W[lp];B[lo];W[ir];B[gp]C[H3|F3];W[la];B[ma];W[ka];B[mb]C[K17]\r
+;W[ib];B[kc]C[K17];W[ja];B[fq];W[fm];B[gr];W[sp];B[so];W[sq];B[rn];W[qq];B[op];W[pr]\r
+;B[er];W[dr];B[ci];W[bj];B[dj];W[ej];B[bi];W[pp];B[po];W[es];B[di];W[bk]C[L:8];B[bf]\r
+;W[dh]C[L:9];B[ch];W[be]C[L:8];B[dg];W[eh]C[L:9];B[cf];W[bg]C[L:10];B[af];W[fs];B[ae]C[B17|B16];W[gs]\r
+;B[de];W[ee];B[bd];W[cd];B[bc]C[#Yikes!\r
+!B19];W[ba]C[L:8];B[cb];W[df]C[L:9];B[cg];W[eg]C[L:10];B[ca]\r
+;W[fr];B[hq];W[hr];B[gq];W[eb];B[cc];W[eq];B[hl];W[hm];B[im];W[gn];B[go];W[kp]\r
+;B[ko];W[jh];B[jg];W[jf];B[kg];W[ke];B[le];W[ih];B[ji];W[je];B[hi];W[hh];B[nq]\r
+;W[nr];B[hn];W[mq];B[np];W[fn];B[eo];W[en];B[gj];W[fj];B[gk];W[fk];B[gm];W[fl]\r
+;B[dc];W[ec];B[jd]C[J16];W[ep];B[id];W[hd];B[jc];W[gc];B[jb];W[ia];B[do]C[D4|D6];W[jq]\r
+;B[dn];W[cn];B[cm]C[B7|C8];W[dp];B[ck];W[cl];B[cj];W[gi];B[bl];W[bm];B[ea];W[fa];B[da]\r
+;W[aj];B[ai];W[al];B[ab];W[pq];B[hm];W[db];B[];W[fp];B[];W[]C[final_score: B+63.5\r
+B19 removed\r
+O17 removed\r
+B13 removed\r
+J5 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf b/regression/games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf
new file mode 100644 (file)
index 0000000..ca14fe8
--- /dev/null
@@ -0,0 +1,16 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[gopriest]BR[NR]PC[NNGS]DT[2002-01-07]RE[B+6.5];B[dj];W[jk];B[dd];W[kd];B[fk];W[hc]\r
+;B[dg];W[ck];B[cj];W[dk];B[ek];W[bj];B[bi];W[el];B[fl];W[dm];B[bk];W[bl];B[aj]\r
+;W[al];B[cm];W[cl];B[fm];W[bm];B[em];W[dl];B[fi];W[ji];B[fc];W[cc];B[db];W[cd]\r
+;B[ce];W[be];B[cb];W[de];B[cf];W[bb];B[dc];W[ba];B[ad]C[owl_defend B13\r
+1 (A11|B11)];W[ae];B[ab];W[bc];B[ac]\r
+;W[bg];B[cg];W[bf];B[ag];W[ah];B[bh];W[if];B[ge]C[!L7];W[kg];B[gg];W[gj];B[fj];W[gk]\r
+;B[hh];W[gb];B[fb]C[!A8];W[af];B[hd];W[id];B[gc];W[hb];B[ih];W[he];B[gd];W[gf];B[ff]\r
+;W[hf];B[gi];W[hl];B[hj];W[gl];B[ij];W[jj];B[jg]C[K6|K8];W[kh];B[jf]C[L9];W[kf];B[je]\r
+;W[jd];B[ke];W[le];B[jh];W[ie];B[ik];W[il];B[ii];W[ak];B[bj];W[fa];B[ea];W[ga]\r
+;B[hg]C[owl_defend B13\r
+0];W[ca];B[gm];W[hm];B[hk];W[jl];B[ig]C[PASS];W[ic];B[];W[da];B[eb];W[]C[final_score: B+5.5\r
+B13 removed\r
+A9 removed\r
+D9 removed\r
+A6 removed]\r
+)\r
diff --git a/regression/games/nngs/gnugo-3.1.18-guestx-200201071151.sgf b/regression/games/nngs/gnugo-3.1.18-guestx-200201071151.sgf
new file mode 100644 (file)
index 0000000..4bf9b08
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[guestx]BR[NR]PC[NNGS]DT[2002-01-07]RE[B+27.5];B[jd];W[dj];B[jk];W[dd];B[kh];W[hc]\r
+;B[fc];W[fd];B[ec];W[ed];B[cb]C[C11|B11];W[jb]C[L:7];B[bd];W[kc]C[L:8];B[kd];W[gk]C[L:9];B[cf]\r
+;W[gd]C[L:10];B[ck];W[cj]C[L:8];B[dk];W[ek]C[L:9];B[bj];W[bi]C[L:7];B[bk];W[ch]C[L:6];B[el];W[fl]C[L:7]\r
+;B[dm];W[gb]C[L:8];B[ef];W[eh]C[L:9];B[gi];W[fi]C[L:6];B[gj];W[fj];B[hk];W[hl]C[L:7];B[il]\r
+;W[ld]C[L:8];B[le];W[lc];B[gh];W[me];B[lf];W[gf]C[L:9];B[hg];W[bg]C[L:8];B[bf];W[dg];B[df]\r
+;W[fg];B[cc];W[dc]C[L:9];B[db];W[fb];B[eb];W[mf]C[L:10];B[mg];W[md];B[lg];W[fm];B[bm]\r
+;W[im];B[jm];W[hm];B[hf];W[he];B[ie];W[em];B[dl];W[ic];B[fa];W[ga];B[ea];W[gc]\r
+;B[cg];W[eg];B[ag];W[bh];B[gg];W[ff];B[jc];W[id];B[je];W[aj];B[ak];W[ai];B[cd]\r
+;W[de];B[ce];W[ee];B[af];W[fh];B[];W[ah];B[];W[]C[final_score: B+27.5])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-jimm-200201050556.sgf b/regression/games/nngs/gnugo-3.1.18-jimm-200201050556.sgf
new file mode 100644 (file)
index 0000000..a36e71f
--- /dev/null
@@ -0,0 +1,38 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[jimm]BR[6k*]PC[NNGS]DT[2002-01-05]RE[B+58.5];B[pd];W[dp];B[pp];W[dd];B[pj];W[nq]\r
+;B[qn];W[pr];B[qq];W[kq];B[jc];W[dj];B[cn];W[co];B[dn];W[fp];B[fn];W[cl];B[bn]\r
+;W[ho];B[cg];W[eg];B[bd]C[C17];W[dh];B[bh];W[gc];B[mc]C[!H3];W[hq];B[gm];W[ee];B[qg]\r
+;W[gk];B[im];W[cc];B[bc];W[bb];B[bj];W[jn];B[qr];W[bo];B[al]C[#Locally, there are better moves than H14\r
+!H14];W[hf];B[qc]C[!J11]\r
+;W[ii];B[je];W[el];B[eo];W[ep];B[ng];W[ik];B[no];W[mp];B[kh];W[jf];B[kf];W[lj]\r
+;B[nj];W[ib];B[jb];W[ig];B[ie];W[ja];B[ka];W[ia];B[ic];W[hb];B[hc]C[G18|F18];W[kb];B[gb]\r
+;W[la];B[fc];W[gd];B[eb];W[fa];B[ga];W[ke];B[kd];W[kg];B[lf];W[lg];B[le];W[mi]\r
+;B[ni];W[oq];B[fd];W[ge];B[db];W[cb];B[dc]C[C16|B15];W[ce];B[ed];W[be];B[jm];W[km];B[bl]\r
+;W[em];B[en];W[jl];B[hn];W[hl];B[bf];W[ml];B[ae];W[cd];B[ad];W[om];B[pl];W[mo]\r
+;B[nn];W[ol];B[mn];W[ln];B[ci];W[on];B[oo];W[qs];B[rs];W[ps];B[rq];W[an];B[am]\r
+;W[ch];B[cf];W[ao];B[fe];W[df];B[ff];W[fg];B[gf];W[he];B[gg];W[gh];B[hg];W[if]\r
+;B[hh];W[hi];B[ef]C[D13];W[mh];B[mg];W[ih];B[dg];W[eh];B[mk];W[lk];B[ok];W[mm];B[go]\r
+;W[hp];B[gp];W[gq];B[in];W[io];B[ck];W[dk];B[di];W[ei];B[gi];W[cj];B[bi];W[nh]\r
+;B[oh];W[fi];B[fh];W[af];B[ag]C[G12|G10];W[gl];B[bk];W[gh];B[mj];W[lh];B[fh];W[fo];B[gh]\r
+;W[gj];B[pm];W[gn];B[go];W[pq];B[op];W[pn];B[po];W[hd];B[id];W[dm];B[cm];W[dl]\r
+;B[fm];W[fl];B[do];W[cp];B[ll];W[lm];B[np];W[nm];B[nl];W[nk];B[mq];W[qp];B[qo]\r
+;W[lq];B[mr];W[nr];B[nl];W[fb];B[ea];W[nk];B[jo];W[kn];B[nl];W[fb];B[fa];W[nk]\r
+;B[fj];W[ej];B[nl];W[ac];B[ab];W[nk];B[lo];W[lp];B[nl];W[rp];B[ro];W[nk];B[il]\r
+;W[nl];B[hm];W[oi];B[oj];W[og];B[ph];W[gp];B[bm];W[gn];B[jk];W[kl];B[go];W[nf]\r
+;B[mf];W[gn];B[ij];W[hk];B[go];W[ld];B[md];W[gn];B[ms]C[M2];W[sp];B[so];W[sq];B[sr]\r
+;W[lr];B[go];W[me];B[ne];W[gn];B[ko];W[go];B[kk];W[ll];B[kj];W[li];B[ki];W[jg]\r
+;B[fk];W[];B[ji];W[]C[final_score: B+58.5\r
+J19 removed\r
+M19 removed\r
+B18 removed\r
+L18 removed\r
+M16 removed\r
+E15 removed\r
+D14 removed\r
+O14 removed\r
+P13 removed\r
+L12 removed\r
+P11 removed\r
+F10 removed\r
+J10 removed\r
+K5 removed\r
+N3 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-patch-200201081044.sgf b/regression/games/nngs/gnugo-3.1.18-patch-200201081044.sgf
new file mode 100644 (file)
index 0000000..ddfaccf
--- /dev/null
@@ -0,0 +1,26 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[2.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[patch]BR[14k*]PC[NNGS]DT[2002-01-08]RE[B+18.5];B[pd];W[dp];B[pp];W[dc];B[ce];W[ci]\r
+;B[ef];W[gc];B[cc];W[cb];B[bc];W[nc];B[oc];W[nd];B[nq]C[Q15|Q14];W[jc];B[mc];W[md];B[lc]C[O18]\r
+;W[qn];B[qo];W[pn];B[fq];W[pj];B[ph];W[cn];B[nb];W[er];B[fr];W[eq];B[jp]C[#other moves possible; !E6\r
+F4];W[en]\r
+;B[ec];W[eb];B[fc];W[fb];B[dd];W[db];B[lh];W[ei];B[ld]C[!N14];W[mf];B[lf]C[!P14];W[of]\r
+;B[pf];W[nh];B[ni];W[fl];B[gd];W[hc]C[L:8];B[hd];W[qi]C[L:9];B[qh];W[ok];B[oi];W[cg]\r
+;B[jd];W[id];B[ie];W[ic]C[L:7];B[ge];W[nn]C[L:8];B[ln];W[mk]C[L:9];B[lk];W[rh]C[L:10];B[rg]\r
+;W[ri];B[rn];W[rm]C[L:6];B[so];W[sg]C[L:7];B[sf]C[S14];W[je]C[L:8];B[kd];W[if];B[he]C[!K13];W[jg]C[L:7]\r
+;B[sh];W[gg]C[L:8];B[bf];W[bg]C[L:9];B[cf];W[ji]C[L:7];B[hh];W[hj];B[hf];W[hg];B[fe];W[kb]C[L:8]\r
+;B[kf];W[si]C[L:9];B[mj];W[jf];B[kh];W[ml]C[L:7];B[ll];W[jh]C[L:8];B[ij]C[J11];W[gi]C[L:9];B[ii]\r
+;W[fg]C[L:7];B[hk];W[gk]C[L:8];B[hl]C[!H11];W[hi]C[L:9];B[ih];W[ig]C[L:8];B[jj];W[af]C[L:9];B[ae]\r
+;W[ag]C[L:10];B[ki]C[!O10];W[nj];B[oj];W[sm]C[L:8];B[mm];W[nm]C[L:7];B[mo];W[nk]C[L:8];B[oo];W[mn]C[L:7]\r
+;B[lm];W[gn]C[L:8];B[hp];W[in]C[L:7];B[jn];W[fs]C[L:8];B[gs];W[es]C[L:9];B[hr];W[bb];B[ab]\r
+;W[lb]C[L:10];B[mb];W[sg];B[rf];W[sn]C[L:9];B[ro];W[on]C[L:8];B[no];W[fp];B[gp]C[!Locally G5 better than F5\r
+G5];W[fo]\r
+;B[go];W[io]C[L:9];B[hn];W[hm]C[L:10];B[ho];W[il]C[L:9];B[ik];W[gm];B[jm];W[im]C[L:10];B[ip]\r
+;W[jl];B[dg];W[jo];B[ko]C[D12];W[km];B[kn]C[D12];W[gh];B[kl];W[dh];B[eg];W[jk];B[kk]\r
+;W[pi];B[oh];W[ma]C[L:9];B[na];W[la]C[L:10];B[eh];W[kc];B[ke];W[ba];B[fh];W[fi];B[sh]\r
+;W[kg]C[L:9];B[lg];W[sg]C[L:10];B[qm];W[rl];B[po];W[sh];B[ff];W[mi];B[lj];W[gl];B[kj]\r
+;W[aa];B[ac];W[gf];B[];W[]C[final_score: B+18.5\r
+O17 removed\r
+N14 removed\r
+P14 removed\r
+O12 removed\r
+N11 removed\r
+R7 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf b/regression/games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf
new file mode 100644 (file)
index 0000000..c8ef2ea
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[2]KM[0.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[rpwiegand]BR[23k]PC[NNGS]DT[2002-01-07]RE[B+21.5]AB[jd][dj];W[dc];B[jj];W[ch];B[fj];W[bj]\r
+;B[ck];W[df];B[fc];W[kf];B[ke];W[jf]C[H10];B[lh]C[J10];W[kk];B[jk];W[jl];B[il];W[kj]\r
+;B[ki];W[lf];B[le];W[hf];B[hd];W[ii];B[ji];W[ih];B[ij];W[gi];B[gj];W[eb];B[fb]\r
+;W[bk];B[bl];W[fa];B[ga];W[ea];B[hb];W[me];B[md];W[mf];B[lc];W[al]C[!D2];B[dl];W[ff]\r
+;B[lj];W[ei];B[ej];W[di];B[fi];W[fh];B[hi];W[gh];B[ed];W[hh];B[hj];W[dd];B[ee]\r
+;W[de];B[ef];W[eg];B[cj];W[ci];B[ge];W[ie];B[id];W[gf];B[fe];W[ec]C[B1];B[lg];W[mg]\r
+;B[mh]C[B1];W[je]C[B1];B[he];W[kg];B[kh];W[jh];B[bm];W[ak];B[am];W[bi];B[];W[]C[final_score: B+21.5\r
+L4 removed\r
+K2 removed]\r
+)\r
diff --git a/regression/games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf b/regression/games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf
new file mode 100644 (file)
index 0000000..8691372
--- /dev/null
@@ -0,0 +1,34 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5]PW[GnuGo (GNU Go 3.1.18)]WR[14k*]PB[wingjk]BR[14k*]PC[NNGS]DT[2002-01-08]RE[B+32.5];B[pp];W[pd];B[cp];W[dd];B[ep];W[gq]\r
+;B[fq];W[gp];B[jq];W[qn];B[mp];W[dj];B[dl];W[qk];B[qf];W[qh];B[qc]C[#Can't block this way, unless have a stone around K16\r
+R16];W[pc];B[qd]\r
+;W[pe];B[pf];W[qe];B[re]C[S16];W[ld];B[hc];W[cg];B[ec];W[dc];B[cb];W[db];B[bd];W[bf]\r
+;B[ce];W[de];B[eb];W[da];B[cf];W[df];B[dg];W[ch];B[bg];W[bh];B[eg]C[# Other moves possible, !G6\r
+F15];W[gn];B[en]\r
+;W[ag];B[ed];W[bb];B[bc];W[ff];B[ef]C[!C9];W[ck];B[ba];W[be];B[cd];W[ab];B[ac];W[ca]\r
+;B[aa];W[bb];B[ee];W[cc];B[ea];W[ab];B[kc];W[lc];B[hf];W[rp]C[L:5];B[qq];W[kd];B[jd]\r
+;W[jc]C[L:6];B[ic];W[jb]C[L:7];B[ib];W[je];B[id];W[lb];B[ke];W[kf];B[jf];W[le];B[ie]\r
+;W[of]C[L:8];B[pb];W[ob]C[L:7];B[qb];W[bm];B[ph];W[pg]C[L:6];B[qg];W[og]C[L:7];B[rh];W[gm]C[L:8]\r
+;B[qi];W[ni];B[nb];W[oa];B[pa];W[nc]C[L:9];B[jg];W[jo]C[L:10];B[ho];W[jm]C[L:5];B[go];W[ip]C[L:4]\r
+;B[hp];W[iq];B[hq];W[jr]C[L:5];B[kq];W[kr]C[L:6];B[lr];W[lq]C[L:7];B[lp];W[in]C[L:5];B[mq]\r
+;W[hr]C[L:6];B[gr];W[rq]C[L:7];B[rr];W[dm]C[L:8];B[dn];W[em];B[fn];W[el]C[L:9];B[fm];W[mn]C[L:10]\r
+;B[fl];W[cm]C[L:9];B[gl];W[ap]C[L:10];B[bq];W[lh];B[ok];W[qp]C[L:9];B[pq];W[po];B[rl];W[ql]C[L:4]\r
+;B[rk];W[rm]C[L:5];B[qj];W[no]C[L:6];B[pk];W[op]C[L:7];B[oq];W[gs]C[L:8];B[fr];W[sr]C[L:9];B[qs]\r
+;W[gi]C[L:5];B[on];W[oo]C[L:6];B[pm];W[gg]C[L:7];B[gf];W[fg]C[L:8];B[fe];W[gj]C[L:9];B[jj];W[fk]C[L:8]\r
+;B[qm];W[hl];B[ei];W[rn]C[L:9];B[gk];W[ej]C[L:5];B[hk];W[il]C[L:6];B[ik];W[fh]C[L:7];B[di]\r
+;W[sl]C[L:8];B[sk];W[ls];B[ms];W[ia];B[ha];W[ja]C[L:9];B[ks];W[aq]C[L:8];B[br];W[ci]C[L:9]\r
+;B[jl];W[hm]C[L:8];B[bo];W[ao];B[bn];W[an]C[L:9];B[fs];W[kl]C[L:7];B[hs];W[ir]C[L:8];B[io]\r
+;W[kp]C[L:9];B[lq];W[jp]C[L:7];B[jk];W[lo]C[L:8];B[mo];W[nm];B[ln];W[ko];B[mm];W[lm];B[nn]\r
+;W[sm]C[L:9];B[kn];W[so]C[L:8];B[jn];W[km]C[L:9];B[mn];W[ml]C[L:10];B[nl];W[mk]C[L:9];B[kg];W[lg]C[L:10]\r
+;B[ke];W[lf]C[L:8];B[mi];W[li];B[mj];W[nj]C[L:9];B[lj];W[nk]C[L:10];B[mh];W[oi]C[L:9];B[oh]\r
+;W[nh]C[L:10];B[lk]C[M8];W[kk]C[L:9];B[kj]C[M8];W[fo]C[L:10];B[fp]C[M8];W[ol];B[hn];W[ll];B[im]\r
+;W[pl];B[rj];W[pj];B[pi]C[N13];W[ng];B[om];W[nl];B[mg];W[mf];B[fi];W[fj];B[hg];W[pn]\r
+;B[eh];W[gh];B[hh];W[ar];B[bp];W[cn];B[co];W[np];B[nq];W[hj];B[ii];W[kh];B[jh]\r
+;W[ki];B[bs];W[je];B[as];W[am];B[ke];W[ij];B[je];W[dh];B[ji];W[hi];B[rs];W[sq]\r
+;B[ss];W[]C[final_score: B+32.5\r
+O18 removed\r
+A17 removed\r
+L17 removed\r
+P9 removed\r
+D8 removed\r
+F5 removed\r
+K5 removed])\r
diff --git a/regression/games/nngs/gnugo-3.1.20-setenza-200201162038.sgf b/regression/games/nngs/gnugo-3.1.20-setenza-200201162038.sgf
new file mode 100644 (file)
index 0000000..6b2ca03
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.1.20)]WR[14k*]
+PB[setenza]BR[18k]
+PC[NNGS]DT[2002-01-16]AP[gnugoclient:2.0]
+RE[B+39.5]
+AB[dd][pd][dp]
+;W[po];B[jc];W[cn];B[bp];W[pq];B[hq];W[df];B[bd];W[qf];B[rd];W[ck]
+;B[qh];W[qj];B[og];W[ek];B[bf];W[kq];B[ge];W[ko];B[nl];W[pl];B[oj]
+;W[mo];B[ri];W[nc];B[me];W[ld];B[jf];W[pi];B[ph];W[lc];B[ob];W[kb]
+C[L:8];B[jb];W[oi];B[md];W[rj]C[L:6];B[nb];W[rg];B[qi];W[ni];B[lh]
+;W[nj];B[im];W[gk]C[L:7];B[jj];W[io]C[L:8];B[go];W[fn]C[L:9];B[gn]
+;W[fo]C[L:10];B[fp];W[ng];B[nf];W[dh];B[hh];W[ee];B[ed];W[bh];B[mg]
+;W[gg];B[hg];W[ll];B[mk];W[km];B[lk];W[nk];B[ml];W[nn];B[kl];W[lm]
+;B[jl];W[bo];B[ao];W[an];B[ap];W[cp];B[cq];W[co];B[br];W[ir];B[hr]
+;W[hs];B[gs];W[is];B[fr];W[gh];B[fm];W[em];B[eo];W[en];B[gm];W[hj]
+;B[ii];W[do];B[ep];W[gf];B[hf];W[iq];B[in];W[hp];B[gp];W[ho];B[hn]
+;W[jn];B[nh];W[nm];B[ol];W[om];B[ok];W[pj];B[pk];W[qk];B[mj];W[mi]
+;B[li];W[fl];B[gl];W[hl];B[ik];W[hk];B[fe];W[ff];B[ce];W[de];B[bg]
+;W[cg];B[ah];W[ai];B[ag];W[bi];B[hi];W[gi];B[sj];W[sk];B[si];W[pm]
+;B[mm];W[mn];B[mh];W[rl];B[jm];W[cf];B[oh];W[il];B[hm];W[ij];B[jk]
+;W[]
+C[S13 removed
+R14 removed
+M16 removed
+L18 removed
+O17 removed
+final_score: B+39.5]
+)
diff --git a/regression/games/nngs/gnugo-3.1.20-setenza-200201172131.sgf b/regression/games/nngs/gnugo-3.1.20-setenza-200201172131.sgf
new file mode 100644 (file)
index 0000000..b63e23a
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.1.20)]WR[14k*]
+PB[setenza]BR[17k*]
+PC[NNGS]DT[2002-01-17]AP[gnugoclient:2.0]
+RE[B+66.5]
+AB[dd][pd][dp]
+;W[op];B[cj];W[fc];B[cf];W[db];B[cc];W[ic];B[qg];W[fq];B[cn];W[dr]
+;B[cr];W[cq];B[br];W[bq];B[dq];W[qp];B[er];W[nc];B[pb];W[iq];B[ld]
+;W[me];B[kb];W[oe];B[pe];W[qk];B[pm];W[ol];B[mo];W[mq];B[ko];W[oj]
+;B[jf];W[gc];B[ll];W[le]C[L:5];B[ke];W[hp]C[L:1];B[rn];W[ro]C[L:0]
+;B[pn];W[sn];B[rm];W[rl];B[ri];W[sm];B[nn];W[ng];B[kq];W[lp];B[kp]
+;W[fr];B[hn];W[fo];B[fm];W[jr];B[ge];W[cb];B[lh];W[ni];B[li];W[fe]
+C[L:1];B[ff];W[bc];B[bd];W[kr]C[L:2];B[ee];W[bb];B[he];W[kd];B[kc]
+;W[jd];B[nb];W[lc];B[lb];W[md];B[mb];W[ad]C[L:3];B[be];W[ho]C[L:4]
+;B[hm];W[in]C[L:5];B[jm];W[mc]C[L:6];B[oc];W[fn]C[L:7];B[em];W[pf]
+C[L:8];B[qf];W[nf]C[L:9];B[lf];W[lq]C[L:10];B[lo];W[pg];B[ph];W[oh]
+;B[pi];W[gm];B[gl];W[gn];B[im];W[jn];B[kn];W[jp];B[mk];W[es];B[ds]
+;W[jo];B[do];W[fd];B[en];W[je];B[kf];W[dc];B[cd];W[np];B[oo];W[po]
+;B[qn];W[qo];B[pl];W[pk];B[ql];W[rk];B[nk];W[ok];B[om];W[nl];B[mm]
+;W[no];B[on];W[fs];B[ie];W[eq];B[dr];W[ae];B[af];W[ac];B[ed];W[ec]
+;B[ib];W[hb];B[jb];W[od];B[qj];W[rj];B[si];W[ia];B[ja];W[ha];B[qh]
+;W[ep];B[eo];W[pj];B[qi];W[mh];B[lg];W[oi];B[qe];W[nm];B[ml];W[sj]
+;B[mj];W[jq];B[mi];W[mg];B[mf];W[jc];B[id];W[mp];B[hd];W[hc];B[gf]
+;W[nj];B[hl];W[gd];B[];W[]C[final_score: B+66.5
+C3 removed])
diff --git a/regression/games/nngs/gnugo-3.1.22-heeroy-200201252006.sgf b/regression/games/nngs/gnugo-3.1.22-heeroy-200201252006.sgf
new file mode 100644 (file)
index 0000000..e8672f1
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.22)]WR[14k*]
+PB[heeroy]BR[25k]
+PC[NNGS]DT[2002-01-25]AP[gnugoclient:2.0]
+RE[B+Resign]
+;B[dd];W[cp];B[pd];W[pp];B[oj];W[nc];B[nd];W[md];B[me];W[ld];B[le]
+;W[cf];B[df];W[dg];B[eg];W[dh];B[eh];W[ep];B[dj];W[cl];B[jd];W[cj]
+;B[di];W[ci];B[dl];W[dm];B[ck];W[bk];B[dk];W[bl];B[ei];W[jp];B[fl]
+;W[nq];B[ee];W[qo];B[oe];W[oc];B[od];W[qb];B[em];W[rd];B[qd];W[dn]
+;B[eo];W[hp];B[en];W[re];B[qe];W[pm];B[rf];W[qf];B[pf];W[qg];B[rg]
+;W[rh];B[qh];W[sg]C[L:9];B[pg];W[sf]C[L:10];B[rc];W[kb];B[sd];W[ib]
+;B[gd];W[cc];B[fd];W[ce];B[de];W[cb];B[kd];W[gb];B[id];W[gp];B[fo]
+;W[ln];B[ri];W[nm];B[pl];W[ql];B[pk];W[rk];B[rj];W[mj];B[pi];W[mk]
+;B[mi];W[im];B[hm];W[jj];B[nj];W[hj];B[hi];W[jh];B[ii];W[kh];B[ki]
+;W[ji];B[ih];W[kf];B[li];W[if];B[ig];W[ke]C[L:8];B[ne];W[hf]C[L:9]
+;B[hg];W[ng]C[L:7];B[nh];W[mg]C[L:8];B[kg];W[jg]C[L:9];B[lg];W[lh]
+C[L:7];B[lf];W[mh]C[L:8];B[ni];W[rb]C[L:9];B[se];W[sb]C[L:8];B[ij]
+;W[ik]C[L:9];B[gi];W[hl];B[gm];W[kc]C[L:10];B[jk];W[jl];B[kk];W[kj]
+;B[lk];W[lj];B[ll];W[qk];B[ml];W[nl];B[nk];W[sj];B[sh];W[ol];B[og]
+;W[do];B[el];W[gf];B[nf];W[eb];B[mf];W[jf];B[gg];W[gj];B[fi];W[ff]
+;B[ef];W[ec];B[hd];W[fp];B[fe];W[qj];B[qi];W[fj];B[ge];W[ok];B[pj]
+;W[cd];B[je];W[mm];B[km];W[lm];B[kl];W[jm];B[kn];W[ko];B[jn];W[in]
+;B[ie];W[fg];B[he];W[jo];B[fh];W[pc];B[jk];W[dc];B[kk];W[jc];B[lk]
+;W[ml];B[fk];W[ej];B[gk];W[hk];B[gl];W[fc];B[ek];W[il];B[hn];W[go]
+;B[ho];W[gn];B[io];W[fn];B[jn];W[qc];B[rd];W[sc];B[sf];W[sk];B[ip]
+;W[si];B[iq];W[hr];B[ir];W[is];B[js];W[jr];B[hs];W[gr];B[ks];W[jq]
+;B[kr];W[];B[kq];W[];B[kp];W[lo];B[lp];W[];B[mp];W[mq];B[np];W[oq]
+;B[op];W[];B[mo];W[];B[mn];W[];B[nn];W[oo];B[on];W[om];B[pn];W[po]
+;B[qn];W[qm];B[rn];W[];B[sn];W[];B[rm];W[];B[rl];W[sl];B[sm];W[oh]
+;B[ph];W[];B[ro];W[rr];B[rp];W[qq]C[L:8];B[kl];W[km]C[L:9];B[rq]
+;W[sr]C[L:10];B[qp];W[pr];B[no];W[pq];B[sq];W[gs];B[lr];W[is];B[mr]
+;W[hs];B[ms];W[nr];B[sp];W[ns];B[lq];W[];B[os];W[];B[ps];W[qs];B[hq]
+;W[];B[gq];W[fr];B[fq];W[er];B[eq];W[dq];B[dr];W[cr];B[ds];W[cs]
+;B[fm];W[dp];B[ch];W[cg];B[bh];W[aj];B[bi];W[bj];B[ai];W[];B[bg];W[]
+;B[bf];W[];B[be];W[ag];B[af];W[ad];B[bd];W[ac];B[bc];W[ab];B[bb]
+;W[ba];B[hc];W[];B[hb];W[ha];B[fa];W[gc];B[ea];W[];B[da];W[ca];B[ga]
+;W[];B[ia];W[aa];B[ha];W[ic];B[ja];W[mb];B[ka];W[];B[la];W[lc];B[ma]
+;W[];B[na];W[ra];B[oa];W[pa];B[db];W[ae];B[ah];W[];B[fb];W[ag];B[ob]
+;W[pb];B[nb];W[];B[es];W[fs];B[ds];W[];B[dr];W[es];B[dr];W[ds];B[bd]
+;W[];B[be];W[];B[bf];W[];B[bg];W[];B[bh];W[];B[ch];W[af];B[bc];W[ah]
+;B[ai];W[];B[ed];W[bi];B[cm];W[];B[bm];W[];B[am];W[];B[cn];W[];B[co]
+;W[];B[bo];W[];B[ao];W[cq];B[bp];W[br];B[bq];W[aq];B[an];W[];B[al]
+;W[];B[ak];W[bb];B[bd];W[];B[be];W[];B[bf];W[];B[bg];W[];B[bh];W[]
+;B[ch];W[bc];B[be];W[];B[bf];W[];B[bg];W[];B[bh];W[];B[bd];W[];B[as]
+;W[];B[ar];W[];B[ap];W[];B[bs];W[aq];B[ar];W[bs];B[as];W[aq];B[ar]
+;W[lb];B[as];W[aq];B[ar];W[gh];B[as];W[aq];B[ar];W[];B[oi];W[];B[as]
+;W[aq];B[hh];W[];B[ar];W[];B[as];W[aq]C[Oops, that move was illegal.]
+)
diff --git a/regression/games/nngs/gnugo-3.1.26-farrell-200203051803.sgf b/regression/games/nngs/gnugo-3.1.26-farrell-200203051803.sgf
new file mode 100644 (file)
index 0000000..c153bcf
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.26)]WR[13k*]
+PB[farrell]BR[NR]
+PC[NNGS]DT[2002-03-05]AP[gnugoclient:2.0]
+;B[pd];W[dp];B[pp];W[dc];B[ee];W[gc];B[hd];W[qc];B[pc];W[qd];B[qe]
+;W[re];B[pf];W[hc];B[ic];W[ib];B[jd];W[rg];B[rf];W[sf];B[qf];W[kb]
+;B[lc];W[qn];B[pn];W[pm];B[qo];W[on];B[po];W[qm];B[qg];W[rh];B[rd]
+;W[pi];B[se];W[ni];B[mi];W[nh];B[lg];W[mk];B[mj];W[nj];B[mm];W[ho]
+;B[mo];W[jp];B[oo];W[mq];B[om];W[ol];B[nn];W[el];B[dj];W[de];B[df]
+;W[ce];B[cf];W[cl];B[qb];W[fj];B[dh];W[pr];B[lq];W[lp];B[lr];W[kq]
+;B[mp];W[nq];B[oq];W[or];B[lo];W[kp];B[sg];W[hj];B[lb];W[ef];B[ff]
+;W[eg];B[dg];W[ci];B[eh];W[fg];B[ge];W[di];B[ei];W[cj];B[gg];W[fh]
+;B[fi];W[km];B[gh];W[ll];B[qr];W[pq];B[op];W[qq];B[rp];W[lh];B[mh]
+C[game adjourned])
diff --git a/regression/games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf b/regression/games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf
new file mode 100644 (file)
index 0000000..b724ded
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.26)]WR[14k*]
+PB[journeyman]BR[13k]
+PC[NNGS]DT[2002-03-02]AP[gnugoclient:2.0]
+RE[W+6.5]
+;B[pd];W[cp];B[pq];W[dd];B[pk];W[pg];B[qf];W[qg];B[mc];W[ep];B[po]
+;W[jq];B[lq];W[cj];B[jp];W[ip];B[kp];W[kr];B[lr];W[hn];B[io];W[hq]
+;B[ho];W[jm];B[in];W[hm];B[im];W[lm];B[jl];W[kl];B[jk];W[qc];B[pc]
+;W[qd];B[qe];W[re];B[rf];W[ng];B[oe];W[pb];B[ob];W[sd];B[qb];W[rb]
+;B[pa];W[ra];B[ic];W[qi];B[qk];W[oj];B[ok];W[cg];B[kk];W[nm];B[nk]
+;W[lg];B[ll];W[jg];B[hg];W[cm];B[hl];W[km];B[ml];W[fd];B[he];W[ce]
+;B[gc];W[ih];B[hh];W[fc];B[ii];W[kd];B[kb];W[fm];B[hj];W[go];B[fk]
+;W[gb];B[hb];W[fb];B[gd];W[gl];B[gk];W[fl];B[ki];W[mi];B[jh];W[me]
+;B[nd];W[ls];B[ms];W[ks];B[nr];W[hp];B[kq];W[ir];B[kg];W[kf];B[kh]
+;W[if];B[ig];W[jf];B[hf];W[jo];B[jn];W[pm];B[om];W[fe];B[fh];W[rj]
+;B[rk];W[sk];B[sl];W[sj];B[rm];W[nj];B[mj];W[rg];B[sf];W[rd];B[lj]
+;W[ld];B[lc];W[ek];B[ej];W[dj];B[ei];W[jc];B[jb];W[id];B[hd];W[ie]
+;B[fg];W[ef];B[ff];W[ha];B[ia];W[rh];B[ge];W[le];B[of];W[pf];B[pe]
+;W[ga];B[og];W[oh];B[dh];W[ch];B[dg];W[df];B[eg];W[qa];B[pb];W[kc]
+;B[nf];W[mh];B[mf];W[mg];B[lf];W[je];B[pj];W[pi];B[di];W[ci];B[ne]
+;W[sg];B[li];W[qj];B[lh];W[ni];B[];W[md];B[];W[sc];B[];W[se];B[];W[]
+C[final_score: W+6.5
+L8 removed
+O7 removed
+Q7 removed
+K5 removed])
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203061917.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203061917.sgf
new file mode 100644 (file)
index 0000000..73e5c4c
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-06]AP[gnugoclient:2.0]
+RE[B+45.5]
+;B[pd];W[dd];B[pp];W[dq];B[do];W[co];B[eq];W[er];B[dp];W[fr];B[cq]
+;W[dr];B[cn];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc];W[nb];B[mc];W[rd]
+;B[re];W[rc];B[qf];W[qq];B[qp];W[pq];B[oq];W[or];B[nq];W[nr];B[rp]
+;W[mq];B[no];W[gp];B[qk];W[hc];B[cf];W[ch];B[ck];W[df];B[cc];W[dc]
+;B[cd];W[kp];B[nk];W[jd];B[oh];W[kf];B[mf];W[kh];B[de];W[dg];B[ee]
+;W[if]C[L:8];B[fc];W[fg]C[L:9];B[ge];W[gf]C[L:10];B[he];W[kj];B[ek]
+;W[hf];B[mp];W[lq];B[ln];W[mg];B[nf];W[kl];B[lk];W[kk];B[ll];W[km]
+;B[gk];W[jn];B[fn];W[gn];B[fo];W[gm];B[fm];W[rq];B[sq];W[cr];B[bq]
+;W[bj];B[bk];W[bh];B[gb];W[ae];B[be];W[af];B[ad];W[ak];B[al];W[aj]
+;B[bm];W[sr];B[sp];W[ij];B[gi];W[lm];B[mm];W[rr];B[mn];W[ni];B[oi]
+;W[ag];B[hl];W[ep]C[L:8];B[eo];W[fp]C[L:9];B[hh];W[nh]C[L:10];B[jb]
+;W[jc]C[L:8];B[kb];W[hb]C[L:6];B[mb];W[gc]C[L:7];B[fb];W[ha]C[L:8]
+;B[hm];W[hn]C[L:9];B[ik];W[hj]C[L:10];B[gj];W[hk];B[gl];W[ng];B[og]
+;W[br];B[cp];W[gd];B[fd];W[ld];B[md];W[le];B[nj];W[mi];B[lj];W[li]
+;B[go];W[ho];B[im];W[jk];B[in];W[io];B[ih];W[ei];B[ej];W[dj];B[cj]
+;W[ci];B[dk];W[di];B[ie];W[je];B[na];W[pa]C[L:9];B[kc];W[aq]C[L:10]
+;B[ap];W[ar];B[ib];W[ko];B[lf];W[lg];B[ji];W[jh];B[ii];W[me];B[ne]
+;W[fh];B[ef];W[ff];B[fe];W[hd];B[eg];W[cg];B[kd];W[ke];B[ig];W[bf]
+;B[ce];W[il];B[jg];W[ki];B[jf];W[kg];B[jm];W[kn];B[jl];W[gh];B[hi]
+;W[se];B[sf];W[sd];B[ga];W[lc];B[lb];W[fi];B[fj];W[ia];B[ja];W[mj]
+;B[mk];W[ik];B[ma];W[qb];B[oa];W[pb];B[ra];W[sb];B[rb];W[hg];B[lp]
+;W[lo];B[mo];W[eh];B[jj];W[ic];B[id];W[]
+C[final_score: B+45.5
+D17 removed
+C5 removed
+E3 removed])
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203062215.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203062215.sgf
new file mode 100644 (file)
index 0000000..8645713
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-06]AP[gnugoclient:2.0]
+RE[B+45.5]
+;B[pd];W[dc];B[pp];W[cp];B[pj];W[eq];B[dj];W[qf];B[qe];W[rg];B[pf]
+;W[qn];B[qg];W[on];B[np];W[rp];B[qq];W[ce];B[jd];W[nc];B[md];W[pb]
+;B[qc];W[lq];B[mc];W[rq];B[lp];W[kp];B[lo];W[mq];B[no];W[qr];B[pr]
+;W[qb];B[rb];W[nb];B[mb];W[ch];B[mm];W[io];B[fd];W[cl]C[L:8];B[eh]
+;W[el]C[L:9];B[gk];W[ff]C[L:10];B[df];W[bj]C[L:8];B[de];W[hf];B[hd]
+;W[ig]C[L:3];B[gg];W[ii]C[L:4];B[jh];W[cf]C[L:3];B[dg];W[cd]C[L:4]
+;B[ik];W[ri]C[L:5];B[rf];W[rk]C[L:6];B[gn];W[qh];B[ph];W[hq]C[L:7]
+;B[gp];W[gq]C[L:8];B[fp];W[fb];B[gc];W[ol]C[L:9];B[nk];W[en]C[L:10]
+;B[fm];W[gb];B[hb];W[ej];B[fj];W[fg]C[L:9];B[gh];W[lh]C[L:8];B[ih]
+;W[dk]C[L:7];B[ei];W[ek];B[di];W[pi];B[oi];W[qi]C[L:6];B[oj];W[rr]
+C[L:7];B[ep];W[dq]C[L:8];B[fq];W[fr]C[L:9];B[dp];W[co]C[L:10];B[cg]
+;W[bg];B[bi];W[ci]C[L:8];B[cj];W[bh]C[L:9];B[bk];W[ai]C[L:8];B[ck]
+;W[bl]C[L:9];B[ak];W[al]C[L:10];B[jm];W[im];B[il];W[jn];B[km];W[oh]
+;B[pg];W[hm];B[gm];W[og];B[mg];W[ha]C[L:9];B[ia];W[sf]C[L:10];B[se]
+;W[sg];B[ga];W[ec];B[ed];W[fa];B[em];W[dm];B[ko];W[jo];B[nl];W[qj]
+;B[pl];W[pm];B[ok];W[ql];B[om];W[nn];B[mn];W[hp];B[po];W[pn];B[qo]
+;W[ro];B[nq];W[kq];B[mr];W[lr];B[nr];W[ps];B[os];W[do];B[qs];W[hl]
+;B[gl];W[hk];B[hj];W[ij]C[L:8];B[hh];W[hn]C[L:9];B[fn];W[fo];B[go]
+;W[eo]C[L:10];B[ho];W[in];B[kn];W[rs];B[ps];W[nm];B[ol];W[qp];B[pq]
+;W[aj];B[ls];W[ks];B[ms];W[kr];B[mp];W[fc];B[ha];W[oo];B[op];W[fk]
+;B[dd];W[jk]C[L:8];B[jl];W[fi]C[L:9];B[gj];W[dh]C[L:7];B[fh];W[qk]
+C[L:8];B[pk];W[dl]C[L:9];B[fl];W[]
+C[L:10
+final_score: B+45.5
+O18 removed
+Q18 removed
+F14 removed
+H14 removed
+J13 removed
+P13 removed
+M12 removed
+F11 removed
+J11 removed
+K9 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203070156.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203070156.sgf
new file mode 100644 (file)
index 0000000..bfde9e3
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-07]AP[gnugoclient:2.0]
+RE[B+19.5]
+;B[pd];W[dc];B[pp];W[co];B[dq];W[ep];B[eq];W[fp];B[fq];W[gp];B[gq]
+;W[qq];B[qp];W[pq];B[oq];W[or];B[nq];W[nr];B[mq];W[rp];B[ro];W[rq]
+;B[qn];W[hn];B[dj];W[qc];B[qd];W[pc];B[od];W[mb];B[ph];W[ce];B[dg]
+;W[cl];B[jc];W[ip];B[ok];W[gc];B[lc];W[id];B[mc];W[nc];B[nd];W[oc]
+;B[lf];W[ef];B[eg];W[lb];B[dl];W[ko];B[mn];W[dm];B[el];W[bg];B[ck]
+;W[bl];B[em];W[cm]C[L:8];B[km];W[hl]C[L:7];B[kj];W[bq]C[L:8];B[ir]
+;W[hj]C[L:9];B[gk];W[rc]C[L:7];B[rd];W[hk]C[L:8];B[gj];W[ji]C[L:6]
+;B[ki];W[hh]C[L:4];B[ch];W[kh]C[L:5];B[lh];W[kg]C[L:6];B[lg];W[ff]
+C[L:7];B[fg];W[kb]C[L:8];B[kc];W[cr]C[L:9];B[mr];W[fs]C[L:10];B[jq]
+;W[bh];B[ci];W[sd];B[se];W[sc];B[rf];W[gg];B[fi];W[gh];B[fh];W[jp]
+;B[ic];W[je];B[hc];W[hd];B[gb];W[fc];B[fb];W[eb];B[df];W[de];B[cf]
+;W[bf];B[lp];W[fa];B[hb];W[kf];B[le];W[jb];B[fr];W[es];B[gs];W[ds]
+;B[hq];W[gl];B[en];W[do];B[kp];W[jn];B[lo];W[kn];B[ln];W[jm];B[kl]
+;W[bk];B[bj];W[hp];B[iq];W[fl];B[fk];W[dn];B[dp];W[eo];B[cp];W[bp]
+;B[fn];W[ns];B[ms];W[ps];B[bi];W[so];B[sn];W[sp];B[rm];W[ib];B[gi]
+;W[hi];B[jj];W[ij];B[ke];W[jh];B[jd];W[jl];B[jk];W[ik];B[dr];W[cq]
+;B[go];W[gn];B[fo];W[ho];B[ah];W[ag];B[ai];W[ia];B[ha];W[ak];B[fm]
+;W[gm];B[er];W[cs];B[aj];W[ea];B[ga];W[];B[cg];W[be];B[];W[]
+C[final_score: B+19.5])
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203080451.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203080451.sgf
new file mode 100644 (file)
index 0000000..41e1ed8
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-08]AP[gnugoclient:2.0]
+RE[B+68.5]
+;B[pd];W[dc];B[pp];W[cp];B[ep];W[eq];B[fq];W[dq];B[fp];W[cn];B[jp]
+;W[nq];B[np];W[mp];B[no];W[oq];B[pq];W[lq];B[pm];W[qk];B[ln];W[jr]
+;B[qi];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc];W[nb];B[mc];W[rd];B[re]
+;W[rc];B[qf];W[ok];B[oi];W[nl];B[rm];W[ll];B[li];W[de];B[fc];W[hc]
+;B[fe];W[he];B[fg];W[kc];B[df];W[mb];B[lc];W[ke];B[cf];W[ce]C[L:5]
+;B[be];W[bd]C[L:6];B[bf];W[ck]C[L:7];B[bc];W[cc]C[L:5];B[ad];W[bb]
+C[L:6];B[cd];W[ee]C[L:4];B[ef];W[fb]C[L:5];B[gb];W[gc];B[ec];W[eb]
+C[L:6];B[dd];W[ch]C[L:7];B[il];W[kg]C[L:8];B[jj];W[in]C[L:9];B[jm]
+;W[gn]C[L:8];B[ho];W[gl];B[hn];W[nf];B[oe];W[or]C[L:9];B[pr];W[lb]
+C[L:6];B[fm];W[gm];B[en];W[gj];B[ek];W[hi];B[cj];W[bj];B[dk];W[ji]
+;B[kj];W[cl]C[L:7];B[ci];W[dj];B[bi];W[di]C[L:5];B[bh];W[ej];B[fk]
+;W[aj];B[gk];W[dh]C[L:6];B[bg];W[fj]C[L:7];B[hk];W[gh]C[L:8];B[ab]
+;W[fd]C[L:9];B[ed];W[cb]C[L:10];B[ng];W[og];B[mf];W[nh]C[L:5];B[mg]
+;W[ps];B[qs];W[os]C[L:6];B[rr];W[hr]C[L:7];B[fr];W[er]C[L:8];B[dp]
+;W[gd]C[L:9];B[es];W[dr]C[L:8];B[ds];W[cr]C[L:9];B[cs];W[bs];B[fs]
+;W[bq];B[gg];W[hg];B[kp];W[ij];B[ik];W[dl]C[L:8];B[el];W[dm];B[le]
+;W[ld]C[L:9];B[md];W[kh]C[L:10];B[lh];W[oh];B[ph];W[do];B[eo];W[gf]
+;B[mo];W[lp];B[kq];W[kr];B[lo];W[mr];B[hq];W[iq];B[ip];W[gq];B[hp]
+;W[gr];B[gp];W[ff];B[eh];W[dn];B[kd];W[ni];B[mk];W[oj]C[L:6];B[pi]
+;W[jd];B[kf];W[om]C[L:5];B[pn];W[pl]C[L:4];B[pj];W[rl];B[rn];W[rj]
+C[L:3];B[ri];W[ml]C[L:4];B[mj];W[ld]C[L:5];B[jf];W[kd]C[L:6];B[if]
+;W[hf]C[L:7];B[ie];W[id];B[jg];W[hj]C[L:8];B[jh];W[ki]C[L:9];B[ih]
+;W[hh]C[L:10];B[ii];W[fh];B[eg];W[jq];B[ai];W[bk];B[ei];W[ba];B[fi]
+;W[op];B[oo];W[se];B[sf];W[sd];B[em];W[gs];B[cg];W[ge];B[ee];W[aa]
+;B[ac];W[ig];B[gi];W[je];B[lg];W[dg];B[];W[]
+C[final_score: B+68.5
+G18 removed
+O14 removed
+P13 removed
+P10 removed
+S10 removed
+R9 removed
+G8 removed
+M8 removed
+Q8 removed
+S8 removed
+P7 removed
+J6 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203090430.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203090430.sgf
new file mode 100644 (file)
index 0000000..88fcf67
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-09]AP[gnugoclient:2.0]
+RE[B+16.5]
+;B[pd];W[cp];B[pp];W[dc];B[pj];W[nc];B[nd];W[md];B[ne];W[oc];B[pc]
+;W[jc];B[me];W[qn];B[ld];W[on];B[np];W[mc];B[lc];W[lb];B[kb];W[eq]
+;B[dj];W[ce];B[hc];W[lq];B[jq];W[lo];B[gq];W[ch];B[cm];W[no];B[mp]
+;W[lp];B[rp];W[ln];B[go];W[je]C[L:9];B[he];W[kc]C[L:4];B[mb];W[jg]
+C[L:3];B[ed];W[ec];B[jb];W[kd]C[L:4];B[le];W[kh];B[mj];W[jo]C[L:5]
+;B[kj];W[ll]C[L:3];B[hg];W[jm]C[L:2];B[ep];W[fq]C[L:1];B[fp];W[dq]
+C[L:2];B[mh];W[ii];B[ik];W[gr];B[hq];W[hr]C[L:3];B[ir];W[nr]C[L:4]
+;B[pr];W[hm]C[L:5];B[fm];W[gl];B[gk];W[fl]C[L:4];B[em];W[ei];B[hi]
+;W[fh]C[L:3];B[hh];W[ip];B[iq];W[cj]C[L:4];B[dk];W[fk];B[ck];W[bj]
+;B[bk];W[ql]C[L:5];B[qg];W[rj]C[L:6];B[qi];W[ri]C[L:7];B[rh];W[ak]
+;B[al];W[aj]C[L:6];B[bm];W[ro]C[L:7];B[qo];W[po]C[L:6];B[qp];W[rn]
+C[L:7];B[rr];W[op]C[L:8];B[oq];W[nq]C[L:9];B[oo];W[fd]C[L:4];B[pn]
+;W[om]C[L:5];B[pm];W[mo]C[L:6];B[pl];W[qk];B[qm];W[rm]C[L:7];B[pk]
+;W[so]C[L:8];B[ff];W[ee]C[L:9];B[ef];W[df]C[L:10];B[eg];W[di]C[L:7]
+;B[bo];W[bp]C[L:8];B[ap];W[aq]C[L:9];B[ao];W[br];B[nl];W[co]C[L:10]
+;B[cn];W[do];B[en];W[gb];B[hb];W[gc];B[fe];W[dd]C[L:7];B[gd];W[mq]
+C[L:8];B[op];W[il]C[L:9];B[hk];W[jk]C[L:10];B[jj];W[kk];B[nm];W[nn]
+;B[mm];W[mk];B[nk];W[ih];B[ji];W[ij];B[hj];W[lj];B[li];W[ki];B[lk]
+;W[id];B[ml];W[hd]C[L:8];B[ge];W[ib]C[L:9];B[ig];W[jh]C[L:10];B[fj]
+;W[ej];B[fi];W[lm];B[eh];W[ja];B[la];W[lj];B[kj];W[lg];B[mg];W[jj]
+;B[kf];W[jf];B[lj];W[kr];B[hn];W[in];B[gm];W[hl];B[kq];W[ho];B[gn]
+;W[or];B[qj];W[ps];B[qs];W[fr];B[dg];W[cg];B[si];W[sk];B[sh];W[rk]
+;B[hp];W[lf];B[ke];W[mf];B[nf];W[sp];B[sq];W[os];B[kp];W[ko];B[io]
+;W[jp];B[jr];W[ls];B[eo];W[el];B[dl];W[ol];B[ok];W[if];B[hf];W[dh]
+;B[dn];W[ie];B[lh];W[kg];B[hs];W[gs];B[is];W[ks];B[ek];W[ho];B[bq]
+;W[cq];B[io];W[oa];B[ho];W[js];B[mn];W[dp];B[ka];W[ia];B[sj];W[sl]
+;B[];W[]
+C[final_score: B+16.5
+P19 removed
+H18 removed
+N17 removed
+F12 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203090538.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203090538.sgf
new file mode 100644 (file)
index 0000000..7d80813
--- /dev/null
@@ -0,0 +1,54 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-09]AP[gnugoclient:2.0]
+RE[B+114.5]
+;B[pd];W[dc];B[pp];W[cp];B[pj];W[jd];B[jp];W[pn];B[no];W[qf];B[qe]
+;W[pf];B[nd];W[hq];B[ph];W[rh];B[ri];W[sf];B[re];W[si];B[rj];W[nf]
+;B[nh];W[nn];B[mf];W[ce];B[mo];W[ep];B[cj];W[gc];B[cm];W[qq];B[qp]
+;W[pq];B[oq];W[oo];B[op];W[or];B[nr];W[rp];B[ro];W[mn];B[rq];W[rr]
+;B[sp];W[nl];B[cg];W[rm];B[lo];W[mg];B[ng];W[km];B[me];W[og];B[oh]
+;W[lg];B[jf];W[mi]C[L:8];B[pl];W[jr]C[L:5];B[qm];W[qn]C[L:4];B[rn]
+;W[ii]C[L:5];B[kc];W[jc]C[L:6];B[kb];W[kd];B[ld];W[eg]C[L:7];B[ke]
+;W[jb]C[L:6];B[hf];W[ka]C[L:7];B[lb];W[la];B[ma];W[bn];B[ja];W[ia]
+C[L:6];B[bm];W[am];B[al];W[an];B[bk];W[hk]C[L:7];B[df];W[bf]C[L:6]
+;B[jh];W[li]C[L:5];B[ji];W[bh];B[ch];W[gi]C[L:4];B[jj];W[bi]C[L:5]
+;B[ci];W[ml];B[jl];W[fh]C[L:4];B[jm];W[kn];B[jn];W[lr]C[L:3];B[ko]
+;W[fk];B[cn];W[gm]C[L:4];B[bo];W[bp]C[L:5];B[ln];W[kl]C[L:3];B[kk]
+;W[en];B[ib];W[ka]C[L:4];B[iq];W[ir]C[L:5];B[hp];W[gq]C[L:6];B[gp]
+;W[fq]C[L:7];B[de];W[cd]C[L:8];B[fc];W[fb]C[L:7];B[ec];W[eb]C[L:8]
+;B[ha];W[ed];B[fd];W[ee]C[L:7];B[fe];W[ef]C[L:6];B[hc];W[gb];B[hb]
+;W[hd]C[L:7];B[ja];W[ic]C[L:8];B[je];W[ia]C[L:7];B[bg];W[ag]C[L:8]
+;B[ja];W[id]C[L:9];B[ge];W[cf]C[L:6];B[dg];W[dl]C[L:7];B[cl];W[ia]
+;B[bj];W[ah]C[L:8];B[ja];W[mq]C[L:9];B[nq];W[ia]C[L:8];B[dd];W[ja]
+C[L:9];B[cc];W[db]C[L:10];B[bc];W[bd];B[ad];W[ae];B[ac];W[aj];B[ak]
+;W[dk];B[ai];W[cb];B[af];W[ag];B[ah];W[bb];B[ao];W[ap];B[do];W[eo]
+;B[dp];W[dq];B[ei];W[co];B[dn];W[ij];B[gn];W[fn];B[hm];W[hl];B[hn]
+;W[il];B[im];W[jq];B[ip];W[mr];B[ms];W[ls];B[ns];W[fj];B[ej];W[ek]
+;B[dm];W[em];B[eh];W[gg];B[hg];W[hh]C[L:5];B[ih];W[ff]C[L:3];B[gf]
+;W[fg]C[L:4];B[fi];W[gh]C[L:2];B[jk];W[lm];B[lk];W[ik];B[pm];W[kq]
+C[L:3];B[gj];W[hi]C[L:4];B[gl];W[fl]C[L:5];B[fm];W[gk]C[L:6];B[gm]
+;W[dj]C[L:7];B[di];W[fo]C[L:8];B[go];W[ie]C[L:9];B[if];W[lp]C[L:10]
+;B[mp];W[kp];B[la];W[fp];B[he];W[gd];B[af];W[ab];B[ag];W[ck];B[];W[]
+C[final_score: B+114.5
+H19 removed
+O14 removed
+Q14 removed
+T14 removed
+M13 removed
+P13 removed
+S12 removed
+M11 removed
+T11 removed
+G10 removed
+L8 removed
+N8 removed
+S7 removed
+N6 removed
+Q6 removed
+P5 removed
+Q3 removed
+P2 removed
+S2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203100627.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203100627.sgf
new file mode 100644 (file)
index 0000000..5a16a1f
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-10]AP[gnugoclient:2.0]
+RE[B+46.5]
+;B[pd];W[dp];B[qp];W[dc];B[oq];W[qj];B[qh];W[qf];B[oh];W[qm];B[nd]
+;W[lc];B[qk];W[pk];B[rj];W[rk];B[qi];W[of];B[pj];W[rf];B[rd];W[ce]
+;B[nf];W[ic];B[jp];W[ql];B[qj];W[ok];B[mk];W[om]C[L:5];B[mn];W[hq]
+C[L:4];B[rn];W[gn]C[L:5];B[cj];W[jr]C[L:6];B[kq];W[ch]C[L:7];B[cm]
+;W[ie]C[L:8];B[dg];W[eh]C[L:7];B[dh];W[cg]C[L:5];B[di];W[eg]C[L:6]
+;B[df];W[em];B[dn];W[en]C[L:4];B[do];W[cp];B[eo];W[fq]C[L:3];B[ep]
+;W[eq]C[L:2];B[go];W[ho]C[L:3];B[gp];W[hp]C[L:4];B[gq];W[gr]C[L:3]
+;B[hn];W[gm];B[in];W[ge]C[L:2];B[ee];W[kr];B[lq];W[nb];B[pb];W[fc]
+C[L:3];B[fj];W[hj]C[L:4];B[gh];W[gk];B[ih];W[jj]C[L:5];B[kh];W[ei]
+;B[ej];W[jl];B[il];W[kk]C[L:3];B[ml];W[gg]C[L:4];B[gi];W[lr]C[L:5]
+;B[mq];W[kf]C[L:6];B[kg];W[lf]C[L:7];B[mf];W[lg];B[lh];W[mg]C[L:8]
+;B[nh];W[mh]C[L:9];B[mi];W[li]C[L:5];B[mj];W[ik]C[L:3];B[hl];W[ii]
+C[L:2];B[hi];W[fk];B[ji];W[ek];B[dk];W[gl];B[hk];W[gj]C[L:1];B[fi]
+;W[fo];B[fp];W[fn];B[kj];W[dl]C[L:2];B[cl];W[ij];B[dm];W[fg]C[L:3]
+;B[ob];W[nc]C[L:4];B[md];W[jg]C[L:5];B[jh];W[ig]C[L:6];B[hg];W[hf]
+C[L:7];B[hh];W[bi]C[L:8];B[bj];W[bn]C[L:9];B[bm];W[co];B[ld];W[kd]
+;B[mc];W[lb]C[L:10];B[oc];W[mb];B[mr];W[ms];B[ns];W[ls];B[nr];W[ng]
+;B[og];W[io];B[jn];W[jo]C[L:9];B[ko];W[hm]C[L:10];B[kn];W[im]C[L:9]
+;B[lj];W[le]C[L:10];B[me];W[je];B[cn];W[ir];B[bo];W[cr];B[cf];W[bf]
+;B[ci];W[bh];B[fd];W[gd];B[ec];W[eb];B[ed];W[fb];B[de];W[cd];B[ff]
+;W[fe];B[ef];W[gf];B[bp];W[bq];B[an];W[el];B[na];W[ma];B[oa];W[ap]
+;B[jq];W[ai];B[aj];W[iq];B[km];W[kl];B[ll];W[dd];B[ip];W[jm];B[lk]
+;W[fh];B[ao];W[aq];B[];W[]
+C[final_score: B+45.5
+P14 removed
+R14 removed
+M11 removed
+P9 removed
+S9 removed
+R8 removed
+P7 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203100711.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203100711.sgf
new file mode 100644 (file)
index 0000000..e4f3f33
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-10]AP[gnugoclient:2.0]
+RE[B+95.5]
+;B[pd];W[dd];B[qp];W[dq];B[oq];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc]
+;W[nb];B[mc];W[rd];B[re];W[rc];B[qf];W[do];B[jp];W[hq];B[pk];W[oo]
+;B[mn];W[qo];B[pp];W[po];B[qm];W[hc];B[cj];W[np];B[nq];W[om];B[nl]
+;W[df];B[cm];W[co];B[jr];W[jd];B[lf];W[ih];B[lh];W[ec];B[jf];W[ki]
+;B[li];W[ir];B[iq];W[ip];B[jq];W[io];B[jo];W[hr];B[hf];W[em];B[dh]
+;W[ij];B[in];W[il];B[hn];W[go];B[gl];W[lk];B[lj];W[mk];B[nk];W[mj]
+;B[kj];W[kl];B[jm];W[jl];B[gj];W[jg];B[kg];W[ig];B[if];W[gh];B[fg]
+;W[cg];B[fh];W[bi];B[ci];W[bj]C[L:8];B[ck];W[mb];B[bk];W[ch]C[L:9]
+;B[gn];W[kc]C[L:10];B[fe];W[js];B[ks];W[is];B[lr];W[ld];B[md];W[ho]
+;B[fn];W[dm];B[fo];W[fq];B[fp];W[gp];B[ep];W[eq];B[dp];W[cp];B[cn]
+;W[dn];B[ek];W[bn];B[bm];W[ao];B[fl];W[me];B[le];W[lc];B[od];W[dl]
+;B[dk];W[ke];B[kf];W[je];B[fc];W[fb];B[gc];W[gb];B[hd];W[ic];B[ef]
+;W[ee];B[dg];W[cf];B[fd];W[ed];B[aj];W[ah];B[am];W[an];B[cl];W[sd]
+;B[se];W[fm];B[gm];W[ie];B[he];W[ai];B[ak];W[id];B[el];W[eo];B[en]
+;W[ap];B[hi];W[]
+C[final_score: B+94.5
+N15 removed
+J13 removed
+G12 removed
+L11 removed
+J10 removed
+N10 removed
+J8 removed
+P7 removed
+P5 removed
+O4 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203131958.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203131958.sgf
new file mode 100644 (file)
index 0000000..3c73e30
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+187.5]
+;B[pd];W[dc];B[pp];W[dq];B[co];W[dl];B[eo];W[fp];B[fo];W[gp];B[cq]
+;W[cr];B[bq];W[qc];B[qd];W[pc];B[od];W[mb];B[pi];W[pm];B[ql];W[nm]
+;B[qm];W[de];B[dj];W[fl];B[dg];W[nq];B[lq];W[oj];B[pj];W[ic];B[gd]
+;W[pr];B[qq];W[he];B[ge];W[gf];B[ff];W[gg];B[ee];W[cf];B[df];W[dd]
+;B[cg];W[bf];B[hq];W[bg];B[mp];W[mr];B[lr];W[pn];B[np];W[qn];B[ok]
+;W[rp];B[rq];W[lm];B[io];W[rn];B[fr];W[nk];B[ol];W[ni];B[oi];W[nn]
+;B[nl];W[sk];B[rk];W[sl];B[ml];W[ln];B[im];W[nj];B[ll];W[je];B[lh]
+;W[lk];B[kk];W[le];B[mf];W[rc];B[rd];W[dk];B[fj];W[bk];B[bj];W[cj]
+;B[ci];W[ck];B[di];W[bi];B[bh];W[aj];B[ah];W[gk];B[gj];W[hk];B[hj]
+;W[gh];B[ij];W[oc];B[bm];W[sd];B[se];W[sc];B[rf];W[li];B[kh];W[gb]
+;B[hd];W[id];B[hf];W[ie];B[ig];W[fc];B[nd];W[me];B[nf];W[fd];B[fe]
+;W[ed];B[mc];W[lb];B[lc];W[kc];B[lf];W[nc];B[md];W[kf];B[kg];W[jg]
+;B[ih];W[jh];B[ji];W[jf];B[ki];W[ne];B[oe];W[ld];B[hc];W[hb];B[ag]
+;W[af];B[gm];W[if];B[hg];W[gc];B[ch];W[];B[rl];W[];B[qp];W[]
+C[L:9
+final_score: B+184.5
+G14 removed
+B11 removed
+M11 removed
+O11 removed
+A10 removed
+C10 removed
+G9 removed
+M9 removed
+T9 removed
+F8 removed
+M7 removed
+O7 removed
+Q7 removed
+F4 removed
+S4 removed
+D3 removed
+O3 removed
+C2 removed
+N2 removed
+Q2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-GoFuN-200203230525.sgf b/regression/games/nngs/gnugo-3.1.27-GoFuN-200203230525.sgf
new file mode 100644 (file)
index 0000000..6863948
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-23]AP[gnugoclient:2.0]
+RE[B+68.5]
+;B[pd];W[dp];B[qp];W[dd];B[oq];W[qj];B[ql];W[qf];B[qh];W[nc];B[oe]
+;W[qc];B[qd];W[pc];B[oh];W[oj];B[nl];W[rh];B[ri];W[qi];B[ph];W[rg]
+;B[rj];W[rk];B[qk];W[si];B[pj];W[sj];B[pi];W[mj];B[jp];W[hq];B[ir]
+;W[kc];B[cf];W[fd];B[bd];W[ch];B[cc];W[ce]C[L:9];B[be];W[df]C[L:7]
+;B[cg];W[ke]C[L:8];B[dg];W[ml];B[nk];W[mm]C[L:7];B[mo];W[fq];B[cn]
+;W[bo]C[L:6];B[ck];W[bj]C[L:4];B[bk];W[dc]C[L:2];B[dh];W[ef]C[L:3]
+;B[lk];W[mk]C[L:4];B[ki];W[nm]C[L:5];B[kl];W[en]C[L:6];B[jn];W[ig]
+C[L:7];B[lg];W[hn]C[L:8];B[ho];W[go]C[L:9];B[hp];W[gp];B[iq];W[rl]
+C[L:10];B[qm];W[cd];B[cb];W[db];B[da];W[ea]C[L:8];B[ca];W[fb]C[L:9]
+;B[fh];W[gg];B[kf];W[od]C[L:7];B[pf];W[rd]C[L:8];B[jf];W[he]C[L:9]
+;B[je];W[jd]C[L:10];B[le];W[kd];B[ld];W[lc];B[nd];W[oc];B[md];W[rm]
+;B[rn];W[ek];B[el];W[fk]C[L:6];B[fl];W[gk]C[L:4];B[gl];W[hl]C[L:3]
+;B[hk];W[hm];B[hj];W[dl]C[L:4];B[dm];W[dk];B[em];W[cl]C[L:3];B[cj]
+;W[bm]C[L:4];B[fn];W[gm]C[L:5];B[eo];W[gn]C[L:6];B[ep];W[hr]C[L:7]
+;B[cp];W[dq]C[L:6];B[co];W[cq];B[bn];W[an]C[L:5];B[bp];W[ao]C[L:6]
+;B[ap];W[am]C[L:5];B[cm];W[bl]C[L:6];B[dn];W[bq]C[L:7];B[gj];W[dj]
+C[L:8];B[ci];W[sn]C[L:9];B[ro];W[is]C[L:10];B[js];W[hs];B[jr];W[aq]
+;B[di];W[il];B[fj];W[jk];B[kk];W[fg];B[gh];W[jj];B[li];W[ii];B[hh]
+;W[ih];B[ie];W[id];B[hg];W[if];B[hf];W[gf];B[jl];W[ik];B[in];W[qe]
+;B[pe];W[eq];B[ej];W[so];B[sp];W[sm];B[qg];W[kj];B[lj];W[mc];B[ji]
+;W[ij];B[eg];W[fe];B[hi];W[jh];B[kg];W[kh];B[lh];W[im];B[jm];W[do]
+;B[al];W[fm];B[en];W[fp];B[jg];W[fo];B[];W[]
+C[final_score: B+68.5
+C12 removed
+B10 removed
+N10 removed
+P10 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-Yuuki-200203131056.sgf b/regression/games/nngs/gnugo-3.1.27-Yuuki-200203131056.sgf
new file mode 100644 (file)
index 0000000..53c8328
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[Yuuki]BR[30k]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+35.5]
+;B[pc];W[pp];B[cp];W[dc];B[pf];W[qh];B[pj];W[eq];B[cm];W[hq];B[kq]
+;W[ce];B[ch];W[jc];B[lb];W[ql];B[ol];W[rj];B[rf];W[pn];B[nq];W[oh]
+;B[no];W[or];B[nr];W[os];B[ns];W[gc];B[ld];W[ho];B[jo];W[hm];B[jm]
+;W[mh];B[nf];W[li];B[hk];W[cr];B[bq];W[en];B[el];W[oq];B[mp];W[fg]
+;B[ir];W[kb];B[hr];W[fi];B[fk];W[bg];B[bh];W[cg];B[hi];W[il];B[jl]
+;W[rg];B[dq];W[dr];B[gp];W[gq];B[fr];W[fp];B[fq];W[ep];B[gr];W[go]
+;B[er];W[ej];B[cj];W[dh];B[dk];W[ik];B[he];W[if];B[hf];W[hg];B[ie]
+;W[je];B[jd];W[ke];B[kd];W[id];B[jf];W[ig];B[hd];W[ic];B[kf];W[ok]
+;B[pl];W[qm];B[pk];W[nk];B[nl];W[ah];B[pi];W[ph];B[ni];W[nh];B[rk]
+;W[oi];B[mk];W[qk];B[ri];W[oj];B[bi];W[qj];B[qi];W[si];B[sh];W[rl]
+;B[sg];W[jk];B[ka];W[mj];B[lk];W[kj];B[kc];W[jb];B[fd];W[gd];B[ge]
+;W[fc];B[hc];W[hb];B[ja];W[fe];B[ib];W[gf];B[gj];W[qf];B[qe];W[rh]
+;B[sj];W[sk];B[si];W[gb];B[iq];W[hp];B[dn];W[do];B[co];W[dp];B[cq]
+;W[oo];B[nn];W[di];B[em];W[fn];B[ai];W[ag];B[jh];W[in];B[jn];W[kk]
+;B[kl];W[qg];B[re];W[ci];B[bk];W[fm];B[gh];W[gg];B[mf];W[gi];B[hh]
+;W[gl];B[lg];W[fh];B[on];W[op];B[pm];W[ip];B[jp];W[kh];B[ji];W[lh]
+;B[og];W[ha];B[jg];W[ih];B[ii];W[hl];B[gk];W[lj];B[dj];W[fj];B[ia]
+;W[io];B[ng];W[fl];B[ek];W[im];B[pg];W[np];B[mo];W[mg];B[kg];W[ki]
+;B[hj];W[ij];B[jj];W[]
+C[final_score: B+35.5
+F16 removed
+K15 removed
+O11 removed
+C2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-Yuuki-200203132324.sgf b/regression/games/nngs/gnugo-3.1.27-Yuuki-200203132324.sgf
new file mode 100644 (file)
index 0000000..5726e65
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[Yuuki]BR[20k]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+94.5]
+;B[pc];W[pp];B[cd];W[dp];B[fd];W[hc];B[gc];W[hd];B[kc];W[qe];B[oe]
+;W[pg];B[je];W[qj];B[gf];W[dl];B[dj];W[fk];B[gq];W[eq];B[mq];W[oq]
+;B[jp];W[ck];B[cj];W[dg];B[fh];W[ng];B[qn];W[on];B[rp];W[ne];B[nf]
+;W[of];B[nd];W[mf];B[md];W[gd];B[fc];W[bk];B[bj];W[go];B[ak];W[al]
+;B[aj];W[bm];B[dk];W[jg];B[hf];W[gp];B[hq];W[rc];B[bo];W[bq];B[cl]
+;W[bl];B[cm];W[cn];B[dm];W[bn];B[dn];W[co];B[el];W[hk];B[lk];W[eo]
+;B[mn];W[od];B[oc];W[pd];B[qq];W[ql];B[pm];W[mr];B[lr];W[or];B[no]
+;W[po];B[om];W[nj];B[nl];W[fr];B[gr];W[im];B[pk];W[gm];B[pj];W[pi]
+;B[qk];W[rk];B[rj];W[qi];B[rl];W[ri];B[ei];W[sk];B[sl];W[sj];B[qm]
+;W[nq];B[mp];W[qb];B[pb];W[qc];B[fq];W[pa];B[na];W[nc];B[mc];W[nb]
+;B[mb];W[ob];B[km];W[er];B[ih];W[jn];B[kn];W[jo];B[ko];W[jk];B[io]
+;W[in];B[ho];W[hp];B[ip];W[kg];B[li];W[ke];B[kd];W[jd];B[ie];W[lf]
+;B[me];W[mi];B[lh];W[ji];B[mj];W[jh];B[ni];W[ig];B[hh];W[oi]C[L:6]
+;B[nh];W[oh]C[L:1];B[mh];W[oj]C[L:2];B[ok];W[nf]C[L:3];B[le];W[kf]
+C[L:4];B[hn];W[fm]C[L:5];B[ij];W[ik]C[L:6];B[jm];W[jl]C[L:7];B[hm]
+;W[hj]C[L:8];B[il];W[ii]C[L:9];B[gn];W[fn]C[L:10];B[fp];W[fo];B[do]
+;W[ep];B[bp];W[cp];B[kj];W[gs];B[ir];W[hs];B[is];W[hl];B[im];W[jj]
+;B[nk];W[fl];B[gi];W[fj];B[gj];W[gg];B[hg];W[jc];B[jb];W[gk];B[hr]
+;W[fs];B[ek];W[kl];B[ll];W[em];B[fg];W[oa];B[ma];W[en];B[dl];W[fi]
+;B[hi];W[eh];B[dh];W[ej];B[di];W[kk];B[ki];W[kh];B[if];W[jf];B[]
+;W[mg];B[];W[lg];B[];W[]
+C[final_score: B+93.5
+H17 removed
+K17 removed
+P15 removed
+D13 removed
+G13 removed
+E12 removed
+R8 removed
+P6 removed
+B5 removed
+Q5 removed
+O3 removed
+N2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-guestn-200203061902.sgf b/regression/games/nngs/gnugo-3.1.27-guestn-200203061902.sgf
new file mode 100644 (file)
index 0000000..63b8f85
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[guestn]BR[NR]
+PC[NNGS]DT[2002-03-06]AP[gnugoclient:2.0]
+;B[pd];W[dd];B[pp];W[dq];B[pj];W[nq];B[np];W[mp];B[no];W[oq];B[pq]
+;W[jq];B[mo];W[qf];B[nc];W[rd];B[qc];W[ph];B[mj];W[lp];B[rc];W[of]
+;B[ri];W[co];B[me];W[kn];B[gp];W[fo];B[jp];W[ip];B[jo];W[io];B[jn]
+;W[ml];B[kq];W[go];B[kp];W[kr];B[jr];W[pr];B[qr];W[nr];B[ps];W[or]
+;B[lq];W[lr];B[iq];W[mq];B[ms];W[lo];B[kl];W[hc];B[ci];W[kc];B[ng]
+;W[rh];B[og];W[qe];B[qi];W[qh];B[pg];W[lk];B[lm];W[mn];B[nn];W[he]
+;B[mm];W[kj];B[lh];W[nl];B[pl];W[cl];B[cf];W[be];B[ei];W[gr];B[ih]
+;W[ij];B[hl];W[hi];B[hh];W[il];B[im];W[hk];B[gl];W[hm];B[fk];W[ej]
+;B[fj];W[di];B[dj];W[jm];B[in];W[dh];B[ek];W[ch];B[ck];W[gi];B[gh]
+;W[kh];B[ji];W[jj];B[ki];W[jl];B[km];W[eh];B[fi];W[fh];B[jk];W[hq]
+;B[ik];W[bk];B[dl];W[cm];B[bj];W[ef];B[bh];W[bg];B[jd];W[jc];B[id]
+;W[hd];B[kd];W[al];B[hr];W[gq];B[gs];W[fs];B[hs];W[fr];B[lc];W[hn]
+;B[en];W[kb];B[ic];W[ib];B[lb];W[jg];B[if];W[ka];B[la];W[ja];B[gf]
+;W[ge];B[hf];W[ah];B[eo];W[bi];B[ep];W[hp];B[eq];W[er];B[dp];W[dr]
+;B[cp];W[cj];B[br];W[fp];B[cr];W[dk];B[el];W[bp];B[cq];W[ck];B[gn]
+;W[fn];B[gm];W[ds];B[ho];W[fg];B[ff];W[fe];B[hn];W[fq];B[bq];W[bo]
+;B[cs];W[fm];B[dn];W[ie];B[je];W[cn];B[ap];W[ao];B[aq];W[gg];B[hg]
+;W[ej];B[fl];W[dj];B[dm];W[em];B[do];W[]
+C[game adjourned
+final_score: B+130.5])
diff --git a/regression/games/nngs/gnugo-3.1.27-guestn-200203111825.sgf b/regression/games/nngs/gnugo-3.1.27-guestn-200203111825.sgf
new file mode 100644 (file)
index 0000000..6483dbb
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[guestn]BR[NR]
+PC[NNGS]DT[2002-03-11]AP[gnugoclient:2.0]
+RE[B+109.5]
+;B[pd];W[dd];B[pp];W[dq];B[pj];W[nq];B[np];W[mp];B[no];W[oq];B[pq]
+;W[jq];B[mj];W[qf];B[qe];W[co];B[pf];W[qg];B[qi];W[re];B[rd];W[hd]
+;B[ci];W[jd];B[cl];W[mc];B[cc];W[dc];B[cd];W[ce];B[be];W[cf];B[db]
+;W[eb];B[cb];W[ed];B[bf];W[ef];B[me];W[ln];B[gp];W[fo];B[ip];W[ml]
+;B[ol];W[nk];B[nj];W[gr];B[hr];W[hq];B[gq];W[ir];B[hp];W[hs];B[hm]
+;W[nn];B[pn];W[pb];B[lc];W[ld];B[md];W[kc];B[nc];W[mb];B[nb];W[lb]
+;B[jp];W[kg];B[kq];W[mo];B[lp];W[lr];B[kr];W[nr];B[lq];W[pr];B[qr]
+;W[mq];B[os];W[ps];B[qs];W[or];B[ls];W[ms];B[ks];W[mr];B[po];W[op]
+;B[oo];W[kl];B[fp];W[en];B[fr];W[er];B[fs];W[fh];B[kj];W[jk];B[jj]
+;W[hi];B[jh];W[ko];B[kp];W[hg];B[jg];W[kf];B[ik];W[bm];B[nm];W[mm]
+;B[lo];W[bl];B[ck];W[mg];B[pg];W[bk];B[bj];W[cm];B[cg];W[dg];B[ch]
+;W[eq];B[fq];W[kn];B[jl];W[kk];B[lk];W[jm];B[il];W[ij];B[ii];W[hj]
+;B[ll];W[ep];B[gn];W[jf];B[ea];W[fa];B[da];W[fb];B[nh];W[nf];B[oe]
+;W[ne];B[nd];W[dj];B[cj];W[ih];B[ji];W[ig];B[el];W[fm];B[ei];W[fl]
+C[L:8];B[ek];W[dm]C[L:9];B[eh];W[le]C[L:10];B[mf];W[kh]C[L:9];B[ng]
+;W[mh]C[L:7];B[mi];W[gk];B[fi];W[eg]C[L:8];B[gh];W[fg]C[L:9];B[gi]
+;W[li]C[L:10];B[lj];W[go];B[ho];W[in];B[km];W[hn];B[im];W[gm];B[jn]
+;W[fn];B[jo];W[ki];B[lg];W[lh];B[gg];W[gf];B[es];W[ds];B[ma];W[la]
+;B[na];W[lf];B[ak];W[al];B[aj];W[dh];B[di];W[dl];B[dk];W[gj];B[fj]
+;W[hh];B[hl];W[fk];B[gl];W[em];B[hk];W[gn];B[io];W[]
+C[final_score: B+108.5
+Q18 removed
+O15 removed
+S15 removed
+R14 removed
+D10 removed
+O9 removed
+N8 removed
+L6 removed
+O6 removed
+N5 removed
+H3 removed
+K3 removed
+G2 removed
+J2 removed
+H1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-guestn-200203121818.sgf b/regression/games/nngs/gnugo-3.1.27-guestn-200203121818.sgf
new file mode 100644 (file)
index 0000000..42808b1
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[guestn]BR[NR]
+PC[NNGS]DT[2002-03-12]AP[gnugoclient:2.0]
+RE[B+74.5]
+;B[pd];W[dp];B[pp];W[ec];B[cd];W[nc];B[df];W[hc];B[qf];W[pb];B[qc]
+;W[kc];B[pi];W[pm];B[mq];W[ch];B[ck];W[eh];B[dc];W[ed];B[cn];W[ff]
+;B[qn];W[qm];B[rn];W[fq];B[jp];W[nm];B[no];W[qq];B[pq];W[lm];B[ne]
+;W[bo];B[mi];W[dd];B[cc];W[pn];B[qp];W[jm];B[bg];W[le];B[eo];W[qk]
+;B[rj];W[kh]C[L:7];B[kj];W[ii]C[L:6];B[ik];W[hq]C[L:5];B[ho];W[kn]
+C[L:4];B[ok];W[mk]C[L:3];B[nl];W[ml];B[nn];W[li]C[L:2];B[lj];W[gj]
+C[L:3];B[mj];W[ol]C[L:1];B[nk];W[pk]C[L:2];B[on];W[om]C[L:3];B[kl]
+;W[rm];B[mn];W[mm];B[rk];W[oj]C[L:4];B[nj];W[in]C[L:3];B[gn];W[hm]
+;B[gk];W[kp];B[jq];W[jo]C[L:2];B[kq];W[fk]C[L:3];B[gl];W[gm];B[fl]
+;W[ek];B[fm];W[hp]C[L:4];B[io];W[il];B[km];W[hk]C[L:5];B[hl];W[hj]
+C[L:3];B[jk];W[ip]C[L:4];B[hn];W[eb]C[L:5];B[db];W[bn]C[L:6];B[im]
+;W[qb]C[L:7];B[rb];W[cg]C[L:8];B[cf];W[ir]C[L:9];B[jl];W[ls]C[L:8]
+;B[lr];W[ks]C[L:9];B[ms];W[js]C[L:7];B[lg];W[kg]C[L:8];B[lf];W[kf]
+C[L:9];B[md];W[mc]C[L:10];B[ld];W[ra];B[sb];W[ln];B[lp];W[cm]C[L:9]
+;B[dl];W[dn]C[L:10];B[dm];W[en];B[fo];W[bl];B[lc];W[lb];B[kd];W[jc]
+;B[jd];W[id];B[je];W[ig];B[ie];W[he];B[if];W[hf];B[ke];W[lh];B[mh]
+;W[cj];B[bk];W[dk];B[cl];W[bm];B[bj];W[bh];B[bf];W[bi];B[ep];W[eq]
+;B[do];W[co]C[L:8];B[nd];W[oc]C[L:9];B[pc];W[da]C[L:10];B[ca];W[ea]
+;B[od];W[gp];B[de];W[ji];B[dg];W[qa];B[dh];W[di];B[eg];W[fg];B[ee]
+;W[fe];B[ah];W[ai];B[ag];W[ei];B[jf];W[jg];B[al];W[am];B[ak];W[jr]
+;B[iq];W[kr];B[lq];W[gr];B[fn];W[cn];B[go];W[fp]C[L:8];B[jj];W[cq]
+C[L:9];B[ij];W[ki]C[L:10];B[em];W[ef];B[el];W[nb];B[rc];W[sa];B[aj]
+;W[ci];B[];W[]
+C[final_score: B+73.5
+M15 removed
+P10 removed
+N9 removed
+Q9 removed
+K7 removed
+J6 removed
+K5 removed
+L4 removed
+R3 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-guestn-200203131735.sgf b/regression/games/nngs/gnugo-3.1.27-guestn-200203131735.sgf
new file mode 100644 (file)
index 0000000..2759de6
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[guestn]BR[NR]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+48.5]
+;B[pd];W[dc];B[qp];W[eq];B[oq];W[qc];B[qd];W[pc];B[od];W[mb];B[pi]
+;W[cp];B[dm];W[de];B[di];W[md];B[lc];W[mf];B[nc];W[nb];B[mc];W[jq]
+;B[lp];W[ic];B[id];W[ng];B[pg];W[ni];B[ok];W[jo];B[mk];W[ln];B[nn]
+;W[eo];B[hc];W[gn];B[li];W[cl];B[dl];W[cm];B[ck];W[bk];B[cj];W[bj]
+;B[bi];W[lq];B[mp];W[fd];B[hd];W[ff];B[kp];W[jp];B[kn];W[fi];B[fk]
+;W[hk];B[fm];W[km];B[jn];W[lj];B[mj];W[in];B[ko];W[kk];B[mi];W[kf]
+;B[if];W[mh];B[lh];W[ib];B[jg];W[lg];B[le];W[kh];B[kg];W[kb];B[lb]
+;W[hb];B[lf];W[kq];B[ob];W[pb];B[na];W[rb];B[rd];W[qa];B[rc];W[sc]
+;B[sd];W[oc];B[ma];W[sb];B[ii];W[pa];B[jk];W[jl];B[ik];W[jj];B[ij]
+;W[il]C[L:5];B[fn];W[fo];B[cn];W[bn]C[L:6];B[dn];W[bm]C[L:7];B[cf]
+;W[ce]C[L:8];B[bf];W[be]C[L:9];B[ae];W[ad]C[L:7];B[af];W[bc]C[L:8]
+;B[gc];W[mm]C[L:9];B[nm];W[ki]C[L:10];B[gm];W[hm]C[L:6];B[ji];W[nr]
+;B[or];W[os]C[L:7];B[ps];W[ns]C[L:8];B[qr];W[kj]C[L:9];B[nq];W[ld]
+C[L:6];B[ke];W[nd];B[kd];W[mr]C[L:7];B[mq];W[ls]C[L:8];B[kc];W[gb]
+C[L:9];B[fc];W[fb]C[L:6];B[ec];W[eb]C[L:7];B[ed];W[ee]C[L:8];B[dd]
+;W[cd]C[L:9];B[fh];W[gh]C[L:8];B[eh];W[gj]C[L:9];B[ll];W[kl];B[lm]
+;W[ml]C[L:6];B[lk];W[nk];B[mg];W[nj]C[L:4];B[lg];W[ka]C[L:5];B[ej]
+;W[ai]C[L:6];B[ah];W[aj]C[L:7];B[ch];W[al]C[L:8];B[co];W[bo]C[L:9]
+;B[gk];W[hj]C[L:10];B[gl];W[hl];B[eg];W[jc];B[jd];W[oa];B[gf];W[ge]
+;B[gg];W[hh];B[he];W[hi];B[jh];W[fg];B[ef];W[fe];B[df];W[hg];B[hf]
+;W[nb];B[do];W[dp];B[jm];W[en];B[em];W[fj];B[ei];W[im];B[ig];W[la]
+;B[mb];W[ob];B[ih];W[gd];B[];W[]
+C[final_score: B+47.5
+M16 removed
+L14 removed
+N14 removed
+O13 removed
+N12 removed
+O11 removed
+N8 removed
+M6 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.27-wingjk-200203101039.sgf b/regression/games/nngs/gnugo-3.1.27-wingjk-200203101039.sgf
new file mode 100644 (file)
index 0000000..d0bfd44
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[wingjk]BR[13k*]
+PC[NNGS]DT[2002-03-10]AP[gnugoclient:2.0]
+RE[B+2.5]
+;B[pp];W[dd];B[pd];W[dq];B[do];W[dl];B[cp];W[cq];B[cm];W[cl];B[dm]
+;W[qq];B[pq];W[qp]C[L:9];B[qo];W[ro]C[L:7];B[qn];W[rn];B[rm];W[pr]
+;B[or];W[qr]C[L:5];B[nq];W[qc]C[L:6];B[qd];W[pc]C[L:7];B[oc];W[ob]
+C[L:8];B[nc];W[nb];B[mc];W[rd]C[L:9];B[re];W[rc]C[L:10];B[qf];W[ch]
+;B[fc];W[eb];B[cc];W[dc]C[L:7];B[cd];W[fd]C[L:5];B[cf];W[gc];B[de]
+;W[fq];B[jq];W[hl];B[el];W[kl]C[L:4];B[oj];W[ml]C[L:5];B[ol];W[mj]
+;B[nn];W[mh];B[jj];W[ii]C[L:4];B[jl];W[jm];B[ji];W[jh];B[ih];W[ng]
+C[L:3];B[ph];W[jk]C[L:4];B[kh];W[jg]C[L:5];B[hh];W[hj]C[L:3];B[hi]
+;W[ij]C[L:4];B[ek];W[kg]C[L:2];B[fi];W[dj];B[dk];W[bj]C[L:1];B[ck]
+;W[bl];B[bk];W[cj]C[L:0];B[bm];W[bg]C[L:1];B[bf];W[bi]C[L:2];B[ag]
+;W[ah]C[L:3];B[af];W[aj]C[L:4];B[cg];W[di]C[L:5];B[dh];W[bh];B[eh]
+;W[dp]C[L:6];B[co];W[bp]C[L:7];B[bo];W[bq]C[L:8];B[lm];W[kn]C[L:9]
+;B[km];W[ln];B[mm];W[kp];B[kq];W[ll]C[L:8];B[mn];W[in]C[L:7];B[hq]
+;W[lp]C[L:8];B[lq];W[cb]C[L:9];B[bb];W[kc]C[L:7];B[he];W[ic];B[mb]
+;W[gr]C[L:8];B[hr];W[ff]C[L:9];B[ee];W[hf]C[L:7];B[fe];W[gd]C[L:4]
+;B[ge];W[gf]C[L:5];B[ed];W[fb]C[L:6];B[ec];W[db]C[L:7];B[ie];W[ig]
+C[L:8];B[id];W[ke]C[L:9];B[jc];W[hb]C[L:4];B[ib];W[hc]C[L:5];B[kb]
+;W[ba]C[L:6];B[ab];W[ga]C[L:7];B[kd];W[le]C[L:8];B[ld];W[ia]C[L:9]
+;B[jb];W[mp]C[L:10];B[np];W[me];B[ne];W[of];B[oe];W[fm];B[gq];W[fr]
+;B[nf];W[oh];B[pg];W[og];B[mf];W[fo];B[go];W[gn];B[ho];W[mo];B[jo]
+;W[jn];B[hn];W[hm]C[L:7];B[oi];W[io]C[L:8];B[jp];W[ip]C[L:9];B[iq]
+;W[no]C[L:10];B[oo];W[nk];B[ok];W[ef];B[dg];W[gj];B[fh];W[nl];B[lf]
+;W[nm];B[on];W[kf];B[lg];W[lh];B[nj];W[ni];B[md];W[ko];B[pf];W[mg]
+;B[fk];W[fj];B[gk];W[ej];B[ap];W[aq];B[ao];W[ja];B[ka];W[ha];B[if]
+;W[hg];B[je];W[gi];B[gh];W[ak];B[al];W[sn];B[sm];W[sp];B[qm];W[hk]
+;B[gl];W[gm];B[em];W[na];B[ma];W[pa];B[se];W[os];B[ns];W[ps];B[mr]
+;W[hs];B[is];W[gs];B[eo];W[ep];B[mq];W[om];B[pm];W[en];B[dn];W[fn]
+;B[df];W[sd];B[bc];W[hp];B[gp];W[fp];B[aa];W[ca];B[hd];W[fl];B[ei]
+;W[jf];B[gg];W[ki];B[fg];W[kj];B[eg];W[]
+C[final_score: B+2.5
+L17 removed
+K8 removed])
diff --git a/regression/games/nngs/gnugo-3.1.29-coco-200203281540.sgf b/regression/games/nngs/gnugo-3.1.29-coco-200203281540.sgf
new file mode 100644 (file)
index 0000000..cb4947c
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[-2.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[coco]BR[14k]
+PC[NNGS]DT[2002-03-28]AP[gnugoclient:2.0]
+RE[B+127.5]
+;B[pd];W[dc];B[cp];W[pq];B[eq];W[po];B[de];W[fd];B[cc];W[cd];B[dd]
+;W[bd]C[L:8];B[bc];W[cb]C[L:6];B[bb];W[ac]C[L:5];B[db];W[cf]C[L:6]
+;B[ec];W[nc]C[L:7];B[lc];W[qc]C[L:8];B[pc];W[qd]C[L:9];B[pe];W[pb]
+;B[ob];W[qb]C[L:7];B[oc];W[nd];B[qe];W[re];B[rf];W[rd]C[L:6];B[qg]
+;W[cj]C[L:7];B[cl];W[jq];B[ch];W[dg]C[L:5];B[dh];W[eg]C[L:4];B[eh]
+;W[fg]C[L:3];B[dk];W[bj];B[dj];W[nb];B[oa];W[qk]C[L:4];B[hq];W[mq]
+C[L:5];B[gi];W[io]C[L:6];B[hg];W[im]C[L:4];B[cg];W[gf]C[L:1];B[df]
+;W[hd];B[ie];W[nf]C[L:2];B[id];W[hc]C[L:1];B[ic];W[fb];B[fc];W[hb]
+;B[he];W[gc]C[L:2];B[ge];W[le]C[L:3];B[pj];W[qj]C[L:4];B[pi];W[pk]
+C[L:5];B[nj];W[lb];B[kb];W[la]C[L:3];B[ka];W[ok];B[mh];W[jf]C[L:2]
+;B[ig];W[ml]C[L:3];B[mb];W[nh]C[L:4];B[ni];W[na];B[ma];W[mg];B[lh]
+;W[fn];B[dn];W[kk]C[L:5];B[kg];W[mc];B[ld];W[rh]C[L:6];B[oh];W[ng]
+;B[qh];W[qi]C[L:7];B[ir];W[jr]C[L:8];B[js];W[ks]C[L:9];B[is];W[kr]
+C[L:10];B[gp];W[ik];B[gn];W[gm];B[hn];W[fl];B[in];W[jn];B[jo];W[ho]
+;B[go];W[ko];B[jm];W[hl];B[kn];W[jl];B[mn];W[jp];B[jn];W[lo];B[ln]
+;W[nm];B[nn];W[on];B[np];W[nq];B[op];W[qq];B[oq];W[or];B[mp];W[lp]
+;B[rg];W[si];B[jj];W[eo];B[dp];W[ip];B[em];W[fm];B[kj];W[nk];B[lk]
+;W[ll]C[L:9];B[mk];W[hm]C[L:10];B[jk];W[kl];B[ij];W[hj];B[hi];W[gj]
+;B[fj];W[fk];B[ek];W[do];B[co];W[mo];B[no];W[pp];B[ep];W[en];B[el]
+;W[iq];B[hr];W[fo];B[fp];W[se];B[pa];W[sb];B[qa];W[ra];B[oj];W[mm]
+;B[sg];W[sh];B[hp];W[lq];B[oo];W[fi];B[ej];W[fh];B[fe];W[sf];B[lm]
+;W[km];B[];W[]
+C[G14 removed
+F13 removed
+C14 removed
+C16 removed
+A17 removed
+C18 removed
+C10 removed
+F16 removed
+F18 removed
+G17 removed
+K14 removed
+M15 removed
+N13 removed
+N17 removed
+final_score: B+127.5]
+)
diff --git a/regression/games/nngs/gnugo-3.1.29-coco-200203281929.sgf b/regression/games/nngs/gnugo-3.1.29-coco-200203281929.sgf
new file mode 100644 (file)
index 0000000..01ce10b
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[coco]BR[14k]
+PC[NNGS]DT[2002-03-28]AP[gnugoclient:2.0]
+RE[B+145.5]
+;B[pd];W[dp];B[qp];W[dd];B[fc];W[oq];B[pn];W[lq];B[df];W[ee];B[ef]
+;W[nc];B[lc];W[qc];B[pc];W[ne];B[pf];W[qd];B[qe];W[ng];B[nb];W[pb]
+;B[ob];W[re];B[rf];W[sd];B[qb];W[rb];B[pa];W[ra];B[fe];W[ql];B[pl]
+;W[nn];B[qm];W[ec];B[fd];W[qk];B[pk];W[qj];B[oi];W[ph];B[oh];W[mf]
+C[L:5];B[pi];W[kf]C[L:6];B[cd];W[cc];B[ce];W[fb]C[L:7];B[gb];W[eb]
+;B[hc];W[rg]C[L:8];B[sf];W[qg];B[qf];W[rh];B[sb];W[rm]C[L:9];B[rn]
+;W[sl]C[L:8];B[nk];W[ld]C[L:9];B[kc];W[cl]C[L:10];B[bc];W[bb];B[cb]
+;W[ci];B[dc];W[hp];B[cq];W[dq];B[cp];W[co];B[bo];W[cn];B[bn];W[fi]
+;B[dr];W[er];B[cr];W[fq];B[kl];W[bm];B[dm];W[cm];B[kn];W[el];B[kp]
+;W[kq];B[jp];W[jq];B[ip];W[iq];B[ho];W[of];B[pg];W[qh];B[gp];W[qi]
+;B[hq];W[rk];B[pr];W[hr];B[or];W[gq];B[fn];W[en];B[eo];W[fm];B[do]
+;W[fo];B[fp];W[dn];B[go];W[oo];B[nq];W[og];B[mp];W[eq];B[gm];W[gl]
+;B[hl];W[gk];B[hk];W[li];B[hi];W[lp];B[lo];W[mo];B[mn];W[cg];B[bf]
+;W[bg];B[ag];W[ah];B[af];W[ji];B[mr];W[lr];B[bh];W[ch];B[ai];W[sn]
+;B[ro];W[ig];B[ak];W[am];B[eh];W[fh];B[ei];W[bj];B[aj];W[hh];B[gj]
+;W[fj];B[dj];W[bi];B[ah];W[bk];B[dk];W[oe];B[pe];W[ij]C[L:9];B[hj]
+;W[mc]C[L:8];B[mb];W[ie]C[L:9];B[fk];W[ek]C[L:8];B[fl];W[ej]C[L:9]
+;B[di];W[em];B[so];W[al]C[L:8];B[sj];W[sm]C[L:9];B[sk];W[mq]C[L:10]
+;B[no];W[cf];B[be];W[kd];B[jd];W[id];B[ic];W[je];B[jc];W[dl];B[ls]
+;W[ks];B[ms];W[jr];B[kj];W[fg];B[eg];W[gf];B[od];W[jj];B[nd];W[md]
+;B[ki];W[kh];B[lj];W[mj];B[mi];W[mk];B[lh];W[lg];B[jh];W[kg];B[ii]
+;W[ih];B[jk];W[jg];B[ik];W[jh];B[nh];W[ep];B[fo];W[ds];B[ar];W[cs]
+;B[bs];W[es];B[bp];W[ge];B[gd];W[an];B[ao];W[gi];B[hd];W[he];B[mh]
+;W[mg];B[ff];W[oc];B[sg];W[ck];B[hp];W[cj];B[dg];W[dh];B[];W[]
+C[N9 removed
+R9 removed
+O6 removed
+P5 removed
+P3 removed
+T7 removed
+R16 removed
+S18 removed
+S15 removed
+T16 removed
+F18 removed
+D16 removed
+E15 removed
+B18 removed
+final_score: B+144.5]
+)
diff --git a/regression/games/nngs/gnugo-3.1.29-merlin-200203281708.sgf b/regression/games/nngs/gnugo-3.1.29-merlin-200203281708.sgf
new file mode 100644 (file)
index 0000000..87bddeb
--- /dev/null
@@ -0,0 +1,56 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[merlin]BR[18k]
+PC[NNGS]DT[2002-03-28]AP[gnugoclient:2.0]
+RE[B+26.5]
+AB[dd][pd][dp]
+;W[qp];B[qf];W[op];B[jc];W[md];B[nc];W[cf];B[fc];W[bd];B[cc];W[ci]
+;B[cl];W[qj];B[fq];W[kq];B[qm];W[hq];B[nm];W[ko];B[mp];W[mq];B[nq]
+;W[np]C[L:7];B[le];W[mo]C[L:6];B[ln];W[ef]C[L:7];B[he];W[oj]C[L:8]
+;B[oh];W[mj];B[nk];W[cq]C[L:7];B[cp];W[dq]C[L:5];B[eq];W[bp]C[L:6]
+;B[bo];W[er]C[L:5];B[fr];W[ds]C[L:4];B[bq];W[br]C[L:5];B[ap];W[ar]
+C[L:6];B[fs];W[dr]C[L:7];B[nj];W[ni]C[L:6];B[oi];W[mh]C[L:5];B[mf]
+;W[kh]C[L:6];B[nh];W[mi]C[L:5];B[ho];W[ll]C[L:4];B[km];W[ok];B[ol]
+;W[rl];B[qk];W[pi];B[ph];W[rj]C[L:2];B[pk];W[rh];B[rg];W[rm]C[L:3]
+;B[rk];W[qn];B[pm];W[sk]C[L:4];B[pj];W[gp]C[L:5];B[hp];W[qc]C[L:6]
+;B[pc];W[ei]C[L:5];B[hh];W[kj]C[L:6];B[jp];W[jq]C[L:4];B[lp];W[mr]
+C[L:2];B[kp];W[ii]C[L:3];B[gi];W[ek]C[L:4];B[fl];W[gq]C[L:5];B[iq]
+;W[ir]C[L:6];B[ip];W[fp]C[L:5];B[ep];W[fn]C[L:6];B[lq];W[lr]C[L:5]
+;B[no];W[bc]C[L:4];B[gn];W[eo]C[L:5];B[en];W[em]C[L:6];B[dn];W[fm]
+C[L:7];B[gm];W[jr]C[L:6];B[go];W[fo]C[L:7];B[el];W[cb];B[db];W[dm]
+C[L:8];B[cm];W[dl]C[L:9];B[dk];W[dj]C[L:6];B[ck];W[gl]C[L:7];B[fk]
+;W[fj]C[L:8];B[gk];W[gj]C[L:7];B[hk];W[hs]C[L:5];B[jk];W[hj]C[L:6]
+;B[ij];W[hi]C[L:7];B[gg];W[nn]C[L:8];B[oo];W[po]C[L:9];B[on];W[bj]
+;B[bk];W[je]C[L:10];B[jf];W[bb];B[kl];W[da];B[ea];W[if];B[jg];W[ie]
+C[L:9];B[kd];W[id];B[hc];W[ig]C[L:10];B[ih];W[jh]C[L:9];B[kf];W[gf]
+C[L:8];B[hf];W[hg]C[L:9];B[gh];W[fg]C[L:8];B[ge];W[ff]C[L:9];B[lk]
+;W[qi];B[qh];W[pb]C[L:7];B[ob];W[ej];B[sh];W[sj]C[L:8];B[ri];W[jj]
+C[L:9];B[ik];W[do]C[L:10];B[cn];W[ca];B[ql];W[sl];B[pn];W[ro]C[L:9]
+;B[ee];W[eb]C[L:10];B[fb];W[ec];B[dc];W[fa];B[ed];W[ga];B[ib];W[ea]
+;B[ha];W[fd];B[fe];W[gc];B[gd];W[gb];B[hd];W[lg];B[df];W[dg];B[de]
+;W[lf];B[ke];W[fh];B[ic];W[fi];B[ce];W[be];B[cj];W[me];B[nf];W[bi]
+;B[aj];W[ai];B[ak];W[mk];B[ml];W[lj];B[kk];W[aq];B[bp];W[si];B[cg]
+;W[bf];B[dh];W[eg];B[di];W[ch];B[mg];W[hb];B[ia];W[kg];B[fd];W[gr]
+;B[gs];W[rh];B[co];W[hr]C[L:9];B[ri];W[jd]C[L:10];B[kc];W[rh];B[oq]
+;W[pp]C[L:8];B[ri];W[jn]C[L:9];B[rh];W[cd]C[L:10];B[qq];W[rq];B[rr]
+;W[sr];B[qr];W[rs];B[qs];W[ps];B[pr];W[pq];B[os];W[ns];B[ss];W[sq]
+;B[ah];W[bg];B[sp];W[rs];B[sn];W[rn];B[so];W[rp];B[es];W[cs];B[ks]
+;W[ss];B[kr];W[ls];B[is];W[js];B[];W[]
+C[final_score: B+26.5
+Q18 removed
+R17 removed
+N16 removed
+A12 removed
+D12 removed
+G8 removed
+M8 removed
+K6 removed
+O6 removed
+T6 removed
+L5 removed
+N5 removed
+O3 removed
+R3 removed
+P1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.30-Poctim-200204040503.sgf b/regression/games/nngs/gnugo-3.1.30-Poctim-200204040503.sgf
new file mode 100644 (file)
index 0000000..73de6eb
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.30)]WR[13k*]
+PB[Poctim]BR[17k*]
+PC[NNGS]DT[2002-04-04]AP[gnugoclient:2.0]
+RE[B+13.5]
+;B[pp];W[dd];B[cp];W[pd];B[eq];W[cj];B[qf];W[nq];B[pj];W[kq];B[iq]
+;W[pf];B[pg];W[of];B[jd];W[qe];B[qg];W[lc];B[dl];W[cg];B[pm];W[hc]
+;B[oq];W[np];B[nn];W[jb];B[mg];W[jo];B[jp];W[io];B[kp];W[lp];B[ko]
+;W[or];B[pr];W[jr];B[ir];W[im];B[jj];W[nr];B[lq];W[lr];B[jq];W[kr]
+;B[lo];W[js];B[mp];W[mq];B[hk];W[go];B[gr];W[km];B[lk];W[gm];B[fk]
+;W[hl];B[hj];W[hn];B[kn];W[ke];B[jn];W[dn];B[em];W[en];B[cm];W[je]
+;B[jg];W[re];B[hf];W[sh];B[rj];W[fe];B[me];W[nd];B[md];W[mc];B[cn]
+;W[fg];B[hd];W[id];B[ie];W[gd];B[he];W[ic];B[ei];W[bl];B[ck];W[bk]
+;B[bm];W[ps];B[qr];W[gh];B[hh];W[oo];B[po];W[on];B[om];W[og];B[oh]
+;W[eh];B[di];W[dj];B[ej];W[gi];B[hi];W[qs];B[rs];W[os];B[sr];W[lp]
+;B[ci];W[bi];B[jl];W[gl];B[jm];W[fn];B[fm];W[hp];B[il];W[in];B[op]
+;W[no];B[cc];W[cd];B[dc];W[bc];B[bb];W[bd];B[ab];W[mn];B[nm];W[mo]
+;B[mm];W[fb];B[eb];W[fc];B[ec];W[dk];B[cl];W[ek];B[el];W[bj];B[fj]
+;W[ed];B[ca];W[ea];B[da];W[hg];B[ig];W[gg];B[ac];W[ad];B[cb];W[ln]
+;B[lm];W[jf];B[if];W[le];B[mf];W[ld];B[kg];W[do];B[co];W[al];B[gq]
+;W[rf];B[rg];W[sg];B[rh];W[ri];B[qi];W[si];B[sj];W[sf];B[fp];W[fo]
+;B[dp];W[pn];B[qn];W[fa];B[ne];W[oe];B[gp];W[am];B[an];W[dh];B[ip]
+;W[hq];B[hr];W[ho];B[ch];W[bh];B[lf];W[gf];B[ng];W[is];B[hs];W[ge]
+;B[gk];W[fi];B[];W[gj];B[fl];W[dm];B[ep];W[nf];B[kf];W[eo];B[];W[]
+C[L7 removed
+K16 removed
+final_score: B+13.5])
diff --git a/regression/games/nngs/gnugo-3.1.30-merlin-200204041428.sgf b/regression/games/nngs/gnugo-3.1.30-merlin-200204041428.sgf
new file mode 100644 (file)
index 0000000..d9c8ab3
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[GnuGo (GNU Go 3.1.30)]WR[13k*]
+PB[merlin]BR[15k*]
+PC[NNGS]DT[2002-04-04]AP[gnugoclient:2.0]
+RE[W+31.5]
+AB[pd][dp]
+;W[dd];B[qp];W[nc];B[qf];W[pb];B[qc];W[kc];B[pj];W[op];B[pn];W[qq]
+;B[pq];W[pp];B[rp];W[oq]C[L:8];B[fc];W[cn]C[L:9];B[fq];W[bp]C[L:10]
+;B[db];W[kp]C[L:9];B[jq];W[kq]C[L:10];B[cf];W[df];B[de];W[ee]C[L:8]
+;B[ce];W[ck]C[L:7];B[ef];W[dg]C[L:5];B[ed];W[cg]C[L:6];B[fe];W[cq]
+C[L:7];B[dq];W[jr]C[L:8];B[iq];W[hc]C[L:9];B[ol];W[ne]C[L:10];B[oh]
+;W[bg];B[bf];W[rq];B[ir];W[sp];B[ro];W[so];B[sn];W[kr];B[sq];W[sr]
+;B[sp];W[rs];B[mp];W[kn];B[mn];W[kl];B[en];W[ho];B[hg];W[lk];B[lg]
+;W[qb];B[di];W[bi];B[id];W[ic];B[kd];W[rc];B[rd];W[ld];B[le];W[jd]
+;B[ke];W[je];B[md];W[lc]C[L:8];B[nd];W[mc]C[L:9];B[mi];W[od]C[L:10]
+;B[me];W[oe]C[L:7];B[ie];W[rb]C[L:8];B[of];W[jf]C[L:9];B[jg];W[cr]
+C[L:10];B[nf];W[pe];B[qe];W[pc];B[qd];W[dr];B[er];W[hl];B[fm];W[hi]
+;B[fj];W[gj];B[fh];W[ji];B[kj];W[jj];B[kk];W[jk];B[li];W[mm];B[ml]
+;W[no];B[nn];W[mo];B[nm];W[ll];B[lm];W[is];B[hs];W[js]C[L:9];B[hq]
+;W[if];B[he];W[ig]C[L:10];B[ih];W[jh];B[hf];W[dm];B[fl];W[gb];B[fb]
+;W[kf];B[kg];W[hh];B[gh];W[po];B[hm];W[im];B[mk];W[gm];B[gn];W[hn]
+;B[go];W[gl];B[io];W[hp];B[jo];W[jp];B[ip];W[ko];B[gp];W[ln];B[km]
+;W[jm];B[mm];W[lj];B[ki];W[gi];B[fi];W[co];B[do];W[mj];B[nj];W[jl]
+;B[in];W[hm];B[gr];W[pf];B[pg];W[oc];B[lf];W[jc];B[cj];W[bj];B[dk]
+;W[cl];B[dl];W[fk];B[ek];W[gk];B[dn];W[em];B[el];W[cm];B[ci];W[sc]
+;B[sd];W[jn];B[qo];W[eg];B[fg];W[af];B[ae];W[ag];B[eh];W[es];B[fs]
+;W[ds];B[ch];W[bh];B[gc];W[ha];B[hd];W[kh];B[lh];W[fa];B[ea];W[ga]
+;B[ia];W[hb];B[pr];W[or];B[ps];W[on];B[om];W[qn];B[qm];W[pm];B[rn]
+;W[ql];B[pl];W[rm];B[qk];W[rk];B[rj];W[sj];B[si];W[sk];B[ri];W[cp]
+;B[];W[dh];B[];W[]
+C[R5 removed
+Q2 removed
+N4 removed
+J19 removed
+D16 removed
+J12 removed
+final_score: W+31.5]
+)
diff --git a/regression/games/nngs/gnugo-3.1.30-morlvera-200204041921.sgf b/regression/games/nngs/gnugo-3.1.30-morlvera-200204041921.sgf
new file mode 100644 (file)
index 0000000..212ae33
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.30)]WR[13k*]
+PB[morlvera]BR[NR]
+PC[NNGS]DT[2002-04-04]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pp];W[dq];B[do];W[qd];B[dd];W[co];B[fp];W[cp];B[eq];W[dn];B[dm]
+;W[qn];B[np];W[rp];B[oc];W[ld];B[qc];W[rc];B[pd];W[re];B[qe];W[rd]
+;B[cn];W[en];B[cj];W[cm];B[cl];W[dg];B[bm];W[qq];B[qp];W[lq];B[jq]
+;W[fc];B[cg];W[ch];B[cf];W[bg];B[dp];W[cq];B[em];W[er]C[L:8];B[fr]
+;W[lo]C[L:6];B[nn];W[lm]C[L:4];B[nl];W[ic]C[L:5];B[kp];W[qk];B[lp]
+;W[in];B[jn];W[kl]C[L:3];B[jl];W[jm]C[L:4];B[im];W[bf]C[L:2];B[ce]
+;W[qh];B[km];W[db];B[cb];W[cc]C[L:1];B[dc];W[bb];B[bc];W[ca];B[cd]
+;W[dh];B[cb];W[eb]C[L:2];B[fe];W[df]C[L:3];B[bi];W[bh];B[fg];W[ed]
+C[L:4];B[ec];W[be]C[L:3];B[fd];W[ee];B[fb];W[gc];B[da];W[cc];B[ef]
+;W[de]C[L:4];B[cb];W[ea]C[L:3];B[fa];W[cc]C[L:4];B[bd];W[cb];B[ei]
+;W[lk]C[L:5];B[kk];W[ll]C[L:3];B[kj];W[mj]C[L:4];B[nj];W[mi]C[L:5]
+;B[ni];W[mh];B[og];W[pb]C[L:4];B[pc];W[ob];B[qb];W[nc]C[L:5];B[nd]
+;W[nb];B[rf];W[qf]C[L:4];B[pe];W[rg];B[pf];W[qg]C[L:5];B[ie];W[kh]
+C[L:6];B[jh];W[mo]C[L:5];B[mp];W[kn];B[mn];W[jm]C[L:4];B[jo];W[hm]
+C[L:2];B[il];W[fn]C[L:1];B[hn];W[lf]C[L:0];B[le];W[me];B[ke];W[jg]
+;B[md];W[kf];B[je];W[nf];B[ig];W[lc];B[mc];W[ji];B[ih];W[ki];B[lj]
+;W[mb];B[ne];W[mf];B[mk];W[nh];B[oh];W[li];B[jj];W[lg];B[jf];W[ng]
+;B[pi];W[ii]C[L:1];B[hi];W[ij]C[L:2];B[jk];W[hl]C[L:3];B[km];W[ik]
+C[L:4];B[io];W[gk]C[L:5];B[fm];W[qo]C[L:6];B[gm];W[pq]C[L:7];B[oq]
+;W[pr]C[L:8];B[or];W[os]C[L:9];B[ns];W[ps]C[L:10];B[mr];W[dr];B[bn]
+;W[bo];B[hj];W[hk];B[fk];W[fs];B[gr];W[po];B[op];W[gj];B[gi];W[fj]
+;B[ej];W[fi];B[fh];W[fl]C[L:9];B[ek];W[eh];B[gl];W[gf]C[L:7];B[ff]
+;W[hf]C[L:8];B[gg];W[gd]C[L:9];B[he];W[ge]C[L:10];B[if];W[hh];B[hg]
+;W[gh];B[kc];W[kb];B[kd];W[lb];B[hc];W[hb];B[hd];W[gb];B[ib];W[jc]
+;B[ha];W[ga];B[jb];W[ja])
diff --git a/regression/games/nngs/gnugo-3.1.31-niki-200204131518.sgf b/regression/games/nngs/gnugo-3.1.31-niki-200204131518.sgf
new file mode 100644 (file)
index 0000000..52bede6
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.31)]WR[13k*]
+PB[niki]BR[NR]
+PC[NNGS]DT[2002-04-13]AP[gnugoclient:2.0]
+RE[B+43.5]
+;B[pd];W[dp];B[pq];W[dd];B[fq];W[dn];B[dr];W[cq];B[jp];W[cj];B[pj]
+;W[qf];B[qe];W[rg];B[pf];W[po];B[qo];W[qn];B[qp];W[pn];B[qg];W[no]
+;B[nq];W[lo];B[lq];W[pl];B[rf];W[hc];B[jc];W[ie];B[ld];W[cg];B[fd]
+;W[if];B[dc];W[cc];B[db];W[ec];B[ed];W[fc];B[cd];W[de];B[fb];W[gd]
+;B[eb];W[gc];B[ce];W[df];B[bc];W[ej];B[dl];W[em];B[ek];W[fk];B[dj]
+;W[di];B[ck];W[bj];B[fj];W[ei];B[fl];W[gk];B[el];W[gm];B[gl];W[gj]
+;B[hm];W[cr];B[dq];W[go];B[fm];W[gn];B[fn];W[fo];B[eo];W[ep];B[en]
+;W[gq];B[do];W[fp];B[gr];W[fr];B[hq];W[eq]C[L:6];B[hr];W[lf]C[L:7]
+;B[mn];W[ln]C[L:8];B[mo];W[mp];B[np];W[nn]C[L:6];B[mm];W[op]C[L:7]
+;B[lp];W[oq];B[nr];W[or]C[L:8];B[pr];W[ns]C[L:9];B[ps];W[os]C[L:7]
+;B[rl];W[rn];B[ro];W[rj];B[qk];W[om]C[L:6];B[nl];W[ok];B[oj];W[nk]
+;B[mk];W[nj];B[pk];W[nm]C[L:5];B[ml];W[ol]C[L:6];B[hk];W[fi];B[hj]
+;W[hi]C[L:7];B[mh];W[mj];B[mf];W[jn]C[L:6];B[io];W[jl];B[kk];W[hn]
+C[L:7];B[in];W[im]C[L:8];B[hl];W[le]C[L:9];B[me];W[co]C[L:10];B[cn]
+;W[bn]C[L:9];B[cm];W[bo];B[ji];W[ql]C[L:8];B[rk];W[lj]C[L:9];B[kj]
+;W[jb]C[L:8];B[kb];W[ib]C[L:9];B[kc];W[mr]C[L:10];B[mq];W[lr];B[kr]
+;W[ni];B[nh];W[oi];B[ph];W[pi];B[qi];W[ii];B[li];W[jh];B[ij];W[bf]
+;B[be];W[hp];B[ip];W[ka];B[la];W[ja];B[lb];W[lg];B[lh];W[bk];B[bl]
+;W[gb];B[kh];W[kg];B[mg];W[ig];B[ms];W[ls];B[ks];W[ms];B[pp];W[oo]
+;B[sn];W[sm];B[so];W[rm];B[ri];W[oh];B[og];W[ke];B[fs];W[es];B[gs]
+;W[lk];B[ll];W[ho];B[bm];W[kl];B[ko];W[fa];B[cb];W[ea];B[da];W[ga]
+;B[ic];W[ae];B[ad];W[af];B[cf];W[bh];B[dk];W[sl];B[sk];W[an];B[am]
+;W[ak];B[kd];W[id];B[mi];W[jd];B[al];W[]
+C[final_score: B+43.5
+E16 removed
+S13 removed
+S10 removed
+K8 removed
+E7 removed
+J7 removed
+D6 removed
+K6 removed
+M6 removed
+D3 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.1.34-guest1-200204242025.sgf b/regression/games/nngs/gnugo-3.1.34-guest1-200204242025.sgf
new file mode 100644 (file)
index 0000000..7d05f62
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[13]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.34)]WR[13k*]
+PB[guest1]BR[NR]
+PC[NNGS]DT[2002-04-24]AP[gnugoclient:2.0]
+RE[W+21.5]
+;B[gg];W[ck];B[dj];W[cj];B[di];W[ch];B[jj];W[cg];B[jd];W[kh];B[jg]
+;W[lj];B[kk];W[cd];B[ee];W[ed];B[fe];W[gc];B[hc];W[kg];B[jf];W[hb]
+;B[ib];W[ic];B[hd];W[jb];B[jc];W[ia];B[kc];W[ld];B[kf];W[lf];B[dk]
+;W[cl];B[dl];W[lk];B[kl];W[eg];B[dg];W[dh];B[df];W[cf];B[eh];W[de]
+;B[ef];W[id];B[ie];W[jh];B[ih];W[dm];B[em];W[cm];B[el];W[gd];B[he]
+;W[ll];B[ge];W[km];B[jm];W[lm];B[jl];W[ke];B[je];W[ib];B[kb];W[lc]
+;B[lb];W[fd];B[ji];W[mb];B[ki];W[li];B[lg];W[lh];B[kd];W[le];B[la]
+;W[ci];B[ma];W[mc];B[ka];W[ei];B[fg];W[kj];B[fi];W[]
+C[E5 removed
+M7 removed
+final_score: W+20.5])
diff --git a/regression/games/nngs/gnugo-3.1.34-viking4-200204240801.sgf b/regression/games/nngs/gnugo-3.1.34-viking4-200204240801.sgf
new file mode 100644 (file)
index 0000000..8b279f3
--- /dev/null
@@ -0,0 +1,52 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.34)]WR[13k*]
+PB[viking4]BR[18k*]
+PC[NNGS]DT[2002-04-24]AP[gnugoclient:2.0]
+RE[W+125.5]
+;B[qq];W[qd];B[cq];W[de];B[hc];W[oc];B[po];W[dc];B[dn];W[qj];B[cg]
+;W[bf];B[ck];W[qm];B[lc];W[dg];B[om];W[ch];B[lp];W[jq];B[gq];W[jo]
+;B[dh];W[eg];B[qg];W[lr];B[og];W[jm];B[nk];W[hn];B[oj];W[jk];B[ro]
+;W[di];B[he];W[eh];B[nd];W[ji];B[mb];W[jg];B[re];W[qb];B[ri];W[rj]
+;B[np];W[nr];B[rh];W[je];B[jc];W[ig];B[ek];W[hr];B[gr];W[hq];B[lm]
+;W[gp];B[fp];W[gs];B[fs];W[fq];B[hs];W[eq];B[fo];W[fr];B[gs];W[dq]
+;B[cp];W[es];B[gm];W[qe];B[rf];W[rd];B[rc];W[sd];B[mh];W[fb];B[eo]
+;W[bj];B[bk];W[ak];B[al];W[aj];B[bl];W[cr];B[bg];W[br];B[bq];W[pr]
+;B[ml];W[qr];B[pq];W[rq];B[oq];W[hk];B[or];W[os];B[hm];W[gf];B[md]
+;W[fj];B[fk];W[gd];B[id];W[nb];B[le];W[go];B[gj];W[gk];B[ej];W[fi]
+;B[ge];W[fe];B[gi];W[gh];B[hd];W[gc];B[hb];W[gn];B[lk];W[fm];B[fn]
+;W[fl];B[el];W[em];B[rb];W[qc];B[dm];W[im];B[qa];W[pa];B[oe];W[rp]
+;B[pp];W[qo];B[qn];W[rn];B[qp];W[rr];B[rm];W[so];B[sn];W[gb];B[ei]
+;W[fh];B[sp];W[cj];B[kn];W[dk];B[dl];W[dj];B[ds];W[aq];B[ap];W[ar]
+;B[er];W[dr];B[ko];W[dp];B[do];W[co];B[jp];W[bn];B[io];W[ip];B[mr]
+;W[mq];B[jn];W[kq];B[bs];W[mp];B[is];W[kp];B[mo];W[kl];B[in];W[hp]
+;B[an];W[cn];B[jo];W[sq];B[kh];W[ki];B[kg];W[li];B[mi];W[kf];B[lf]
+;W[lh];B[lg];W[hf];B[ke];W[jf];B[cm];W[bm];B[ga];W[fa];B[ha];W[nc]
+;B[jh];W[ih];B[so];W[mc];B[jd];W[lb];B[kb];W[ma];B[ho];W[lj];B[ir]
+;W[iq];B[ra];W[mj];B[rs];W[nj];B[mk];W[ni];B[oi];W[nh];B[mg];W[oh]
+;B[ph];W[pi];B[qi];W[ok];B[pj];W[ng];B[pk];W[nf];B[of];W[se];B[kk]
+;W[km];B[ss];W[ll];B[il];W[jl];B[ik];W[jj];B[hl];W[gl];B[mn];W[qf]
+;B[sf];W[me];B[ie];W[ka];B[ja];W[la];B[if];W[nq];B[af];W[be];B[pf]
+;W[ne];B[od];W[pd];B[pm];W[lq];B[lo];W[mf];B[ps];W[qs];B[];W[pe]
+;B[ib];W[kj];B[kd];W[]
+C[final_score: W+125.5
+R19 removed
+A14 removed
+B13 removed
+E11 removed
+G11 removed
+R10 removed
+B9 removed
+J9 removed
+P9 removed
+R7 removed
+A6 removed
+A4 removed
+C4 removed
+G3 removed
+E2 removed
+N2 removed
+B1 removed
+D1 removed
+S1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.2-merlin-200205071828.sgf b/regression/games/nngs/gnugo-3.2-merlin-200205071828.sgf
new file mode 100644 (file)
index 0000000..55c8fbe
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.2)]WR[13k*]
+PB[merlin]BR[15k*]
+PC[NNGS]DT[2002-05-07]AP[gnugoclient:2.0]
+RE[B+20.5]
+;B[pp];W[dd];B[pd];W[dq];B[do];W[dl];B[fc];W[co];B[fp];W[cp];B[fq]
+;W[qn];B[np];W[rp];B[qq];W[qk];B[jp];W[qf];B[nd];W[rd];B[qc];W[ph]
+;B[db];W[lc];B[nc];W[ic]C[L:9];B[df];W[ee];B[fe];W[ef]C[L:8];B[cd]
+;W[cc]C[L:9];B[ce];W[dc]C[L:6];B[ec];W[cb];B[ff];W[ci];B[eh];W[nn]
+;B[lo];W[lm]C[L:7];B[jd];W[jc];B[hb];W[ie];B[id];W[hd]C[L:6];B[je]
+;W[kd]C[L:5];B[ke];W[le]C[L:4];B[if];W[hc];B[he];W[gb];B[fb];W[bd]
+C[L:5];B[be];W[ab]C[L:3];B[ed];W[de]C[L:4];B[gc];W[cf]C[L:5];B[dg]
+;W[cg]C[L:6];B[ch];W[eg];B[dh];W[bg];B[bh];W[ae]C[L:7];B[ag];W[bf]
+;B[hh];W[mg]C[L:8];B[lb];W[mb]C[L:9];B[kb];W[kc]C[L:4];B[mc];W[dn]
+C[L:5];B[ak];W[ki]C[L:6];B[lk];W[kl];B[lh];W[mj]C[L:4];B[kk];W[jk]
+;B[lf];W[me]C[L:3];B[mf];W[fg];B[gg];W[fh];B[fi];W[ei];B[di];W[ej]
+;B[dj];W[ek]C[L:4];B[ne];W[gi];B[ck];W[hn];B[bl];W[rq]C[L:2];B[ao]
+;W[rr]C[L:3];B[qr];W[km]C[L:4];B[ng];W[mh]C[L:5];B[nh];W[ni]C[L:4]
+;B[li];W[lj]C[L:5];B[mi];W[oi];B[ji];W[kj]C[L:6];B[kh];W[rc]C[L:7]
+;B[bn];W[qb]C[L:8];B[pb];W[rb]C[L:9];B[nb];W[qs]C[L:10];B[pr];W[ps]
+;B[os];W[rs];B[or];W[er];B[fr];W[ij];B[ii];W[da];B[ho];W[gn];B[en]
+;W[em];B[cn];W[bq];B[dm];W[cr];B[fm];W[el];B[fn];W[go];B[hp];W[eb]
+;B[fa];W[fs];B[gr];W[gs];B[hs];W[es];B[ir];W[im];B[gl];W[io];B[ip]
+;W[jo];B[ko];W[kn];B[gk];W[gj];B[on];W[om];B[pn];W[pm];B[qo];W[ro]
+;B[mn];W[nm];B[mm];W[no];B[mo];W[oo];B[po];W[ml];B[ik];W[jj];B[il]
+;W[hl];B[hk];W[gm];B[fl];W[hj];B[jl];W[hm];B[jn];W[jm];B[in];W[qd]
+;B[pc];W[pe];B[oe];W[of];B[nf];W[og];B[ea];W[op];B[nq];W[qp];B[pq]
+;W[oq];B[nr];W[pa];B[oa];W[qa];B[aq];W[ar];B[ap];W[cl];B[cm];W[gp]
+;B[gq];W[fo];B[eo];W[rn];B[db];W[ca];B[dk];W[gd];B[fd];W[bo];B[eq]
+;W[eb];B[gh];W[db];B[dp];W[bp];B[an];W[oh];B[hi];W[af];B[ah];W[fj]
+;B[fk];W[mk];B[ln];W[ll];B[];W[]
+C[G18 removed
+J17 removed
+N18 removed
+M15 removed
+C11 removed
+N13 removed
+final_score: B+20.5]
+)
diff --git a/regression/games/nngs/gnugo-3.3.10-deye-200210211347.sgf b/regression/games/nngs/gnugo-3.3.10-deye-200210211347.sgf
new file mode 100644 (file)
index 0000000..96105df
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[deye]BR[15k]
+PC[NNGS]DT[2002-10-21]AP[gnugoclient:2.0]
+RE[W+16.5]
+AB[pd][dp]
+;W[dd];B[pp];W[qf];B[md];W[fp];B[dm];W[pn];B[mp];W[qi];B[ip];W[ck]
+;B[bm];W[ch];B[gm];W[kc];B[lb];W[qo];B[qp];W[qd];B[qc];W[eh];B[qe]
+;W[pf];B[re];W[oi];B[mm];W[fc];B[jl];W[fe];B[gi];W[gg];B[jh];W[nk]
+;B[mh];W[hq];B[iq];W[fr];B[dr];W[hp];B[ho];W[ir];B[jr];W[go];B[gn]
+;W[hr];B[fo];W[io];B[hn];W[jq];B[jp];W[kq];B[kr];W[kp];B[jo];W[lr]
+;B[lq];W[lp];B[mq];W[ks];B[lo];W[js];B[ko];W[mi];B[li];W[lh];B[lg]
+;W[kb];B[ni];W[mj];B[lj];W[nh];B[mg];W[jf];B[kf];W[je];B[ke];W[bl]
+;B[cl];W[dl];B[cm];W[ek];B[bk];W[bj];B[ak];W[aj];B[al];W[cj];B[el]
+;W[eo];B[do];W[fn];B[fm];W[lk];B[kk];W[mr];B[nr];W[ns];B[or];W[rf]
+;B[se];W[ro];B[rp];W[os];B[ps];W[ms];B[qr];W[sp];B[sq];W[so];B[rq]
+;W[sf];B[pe];W[lc];B[mc];W[mb];B[nb];W[la];B[na];W[fk];B[gk];W[hh]
+;B[hi];W[nm];B[nn];W[om];B[on];W[kd];B[po];W[qn];B[nl];W[ol];B[ml]
+;W[mk];B[ll];W[ng];B[ok];W[nj];B[oj];W[ni];B[pm];W[pl];B[qm];W[ql]
+;B[rm];W[rl];B[rn];W[oe];B[od];W[ne];B[me];W[ih];B[ii];W[dk];B[jg]
+;W[ig];B[gh];W[if];B[fh];W[fg];B[ei];W[di];B[eg];W[dh];B[fj];W[er]
+;B[eq];W[ds];B[cr];W[sm];B[sn];W[sl];B[cs];W[ej];B[fi];W[en];B[em]
+;W[mf];B[lf];W[nf];B[ld];W[dn];B[cn];W[ep];B[fq];W[gq];B[dq];W[es]
+;B[ma];W[nd];B[nc];W[fl];B[gl];W[lb];B[jd];W[id];B[jc];W[jb];B[ic]
+;W[hc];B[];W[]
+C[final_score: W+16.5
+J17 removed
+R16 removed
+E13 removed
+M12 removed
+P10 removed
+J5 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.10-jimm-200210222018.sgf b/regression/games/nngs/gnugo-3.3.10-jimm-200210222018.sgf
new file mode 100644 (file)
index 0000000..16ca1f7
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[jimm]BR[7k*]
+PC[NNGS]DT[2002-10-22]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pd];W[dp];B[pp];W[dc];B[pj];W[nc];B[pf];W[jd];B[oc];W[nd];B[jq]
+;W[ce];B[fq];W[mp];B[nq];W[pm];B[ql];W[qm];B[np];W[dn];B[ro];W[nm]
+;B[mo];W[lp];B[lo];W[kp];B[on];W[ol];B[rl];W[jo];B[lm];W[ml];B[dr]
+;W[cq];B[hp];W[jm];B[kl];W[mj];B[fn];W[mh];B[el];W[cr];B[jl];W[ho]
+;B[in];W[io];B[im];W[gf];B[gp];W[di];B[cl];W[cn];B[bi];W[gc];B[bg]
+;W[fi];B[nb];W[mb];B[ob];W[lc];B[hi];W[rm];B[ok];W[nk];B[nj];W[qi]
+;B[qj];W[qo];B[rp];W[rj];B[pi];W[qh];B[ph];W[qg];B[qf];W[rk];B[sl]
+;W[qk];B[pl];W[pk];B[oj];W[pg];B[om];W[nl];B[nh];W[po];B[oo];W[er]
+;B[fr];W[jh];B[og];W[of];B[nf];W[oe];B[rg];W[rh];B[sh];W[ri];B[re]
+;W[lj];B[mg];W[lh];B[lg];W[id];B[ne];W[od];B[le];W[fc];B[hg];W[jf]
+;B[ij];W[kg];B[md];W[mc];B[lf];W[ni];B[kd];W[kc];B[gg];W[fg];B[ki]
+;W[ji];B[kj];W[dq];B[kh];W[lk];B[oh];W[ll];B[kk];W[fs];B[hf];W[ge]
+;B[he];W[hs];B[kr];W[fh];B[hd];W[hc];B[je];W[ld];B[ke];W[me];B[ie]
+;W[gj];B[gd];W[fd];B[cj];W[bm];B[bl];W[ch];B[bh];W[hk];B[ik];W[hl]
+;B[hn];W[go];B[fo];W[gn];B[gm];W[hm];B[jn];W[fm];B[il];W[em];B[fl]
+;W[gl];B[cd];W[be];B[bc];W[al];B[ak];W[aj];B[am];W[lr];B[hr];W[ep]
+;B[fp];W[kq];B[is];W[gs];B[ks];W[ir];B[iq];W[js];B[jr];W[is];B[gr]
+;W[es];B[cm];W[bn];B[dm];W[en];B[dk];W[an];B[mr];W[ls];B[lq];W[mq]
+;B[ms];W[lq];B[nr];W[ko];B[kn];W[fk];B[dd];W[de];B[db];W[ec];B[cb]
+;W[ba];B[eb];W[fb];B[bb];W[ea];B[da];W[bd];B[aa];W[ac];B[cc];W[ab]
+;B[fa];W[aa];B[ff];W[fe];B[cg];W[dg];B[ef];W[qp];B[df];W[cf];B[eg]
+;W[dh];B[eh];W[qq];B[ej];W[ei];B[fj];W[gi];B[gh];W[pr];B[hj];W[pq])
diff --git a/regression/games/nngs/gnugo-3.3.10-niki-200210281349.sgf b/regression/games/nngs/gnugo-3.3.10-niki-200210281349.sgf
new file mode 100644 (file)
index 0000000..624ae39
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[niki]BR[NR]
+PC[NNGS]DT[2002-10-28]AP[gnugoclient:2.0]
+RE[B+35.5]
+;B[pd];W[dc];B[pq];W[dp];B[de];W[dh];B[cc];W[cb];B[cd];W[qo];B[pm]
+;W[oo];B[nq];W[nm];B[pj];W[nc];B[qf];W[pb];B[qc];W[kc];B[ec];W[eb]
+;B[fc];W[rm];B[po];W[ck];B[cq];W[cp];B[dq];W[eq];B[bp];W[bo];B[bq]
+;W[er];B[ep];W[cs];B[co];W[do];B[cn];W[bn];B[bm];W[cm];B[dn];W[dm]
+;B[eo];W[gr];B[hq];W[hr];B[iq];W[ir];B[jq];W[jr];B[kq];W[bl];B[qp]
+;W[qn];B[pn];W[rp];B[rq];W[rk];B[ql];W[qi];B[rl];W[sl];B[rj];W[qk]
+;B[qj];W[pk];B[ol];W[ok];B[nl];W[ri];B[sj];W[pl];B[qm];W[om];B[nk]
+;W[oj];B[pi];W[sk];B[rn];W[nj];B[mk];W[mo];B[op];W[ph];B[oi];W[qg]
+;B[nh];W[mj];B[lk];W[mh];B[ng];W[lm];B[mg];W[lj];B[kl];W[jn];B[im]
+;W[rh];B[rf];W[hc];B[bb];W[fb];B[di];W[ci];B[eh];W[ei];B[fi];W[dj]
+;B[fh];W[fj];B[gj];W[np];B[on];W[ni];B[oh];W[nn];B[no];W[lg];B[lh]
+;W[oo];B[ro];W[kk];B[ll];W[jl];B[jk];W[kj];B[jm];W[km];B[il];W[kh]
+;B[mi];W[lf];B[lo];W[ko];B[lp];W[fm];B[ln];W[qb];B[rb];W[cf];B[df]
+;W[cg];B[fk];W[ej];B[gl];W[eg];B[dg];W[fg];B[hh];W[gg];B[hg];W[ge]
+;B[gc];W[gb];B[fe];W[hf];B[hd];W[gd];B[he];W[if];B[ic];W[hb];B[jd]
+;W[ib];B[kd];W[ld];B[jf];W[jg];B[gf];W[ff];B[fd];W[gf];B[dd];W[db]
+;B[kf];W[ke];B[je];W[le];B[kg];W[jh];B[ef];W[gh];B[gi];W[hi];B[hj]
+;W[ii];B[jj];W[li];B[mh];W[ie];B[oc];W[ob];B[nd];W[mc];B[rc];W[sm]
+;B[ji];W[ki];B[md];W[gn];B[in];W[ba];B[ac];W[ad];B[bd];W[ab];B[aa]
+;W[ca];B[ae];W[ab];B[ij];W[aa];B[id];W[ig];B[ih];W[jc];B[bf];W[kr]
+;B[bg];W[bh];B[ce];W[lr];B[mq];W[mr];B[nr];W[ns];B[os];W[ms];B[or]
+;W[mf];B[nf];W[ne];B[oe];W[me];B[od];W[ch];B[pg];W[gq];B[go];W[fn]
+;B[fo];W[fp];B[gp];W[hn];B[ho];W[ra];B[em];W[el];B[ek];W[en];B[dk]
+;W[fq];B[bj];W[cj];B[dl];W[fl];B[ah];W[ai];B[ag];W[aj];B[ao];W[am]
+;B[gk];W[dr];B[cr];W[bs];B[br];W[sn];B[so];W[hm];B[hl];W[bc];B[cl]
+;W[bm];B[ap];W[ad];B[bk];W[ak];B[gm];W[em];B[an];W[bi];B[ar];W[ac]
+;B[as];W[ds];B[sb];W[lq];B[sa];W[qa];B[mp];W[pc];B[qd];W[]
+C[final_score: B+35.5
+R13 removed
+Q12 removed
+S12 removed
+L7 removed
+O7 removed
+K6 removed
+L5 removed
+N5 removed
+P5 removed
+O4 removed
+S4 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf b/regression/games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf
new file mode 100644 (file)
index 0000000..a2ca3e2
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[rcde05]BR[17k]
+PC[NNGS]DT[2002-10-28]AP[gnugoclient:2.0]
+AB[dd][pd][dj][pj][dp][pp]
+;W[cn];B[fp];W[fc];B[df];W[db];B[cc];W[ic];B[pg];W[np];B[nq];W[mq]
+;B[oq];W[nn];B[jq];W[bp];B[cq];W[cl];B[cb];W[nc];B[bq];W[bj];B[ci]
+;W[mp];B[bi];W[pb];B[qc];W[fm];B[gn];W[pn];B[hl];W[ln];B[qb];W[jn]
+;B[gm];W[ek];B[fi];W[ne];B[of];W[ie];B[mg];W[lf];B[kh];W[ql];B[fl]
+;W[rj];B[qi];W[ri];B[fk];W[qh];B[qg];W[ph];B[jl];W[oi];B[nk];W[rg]
+;B[rf];W[sf];B[oe];W[ih];B[qe];W[jf];B[pk];W[qo];B[qp];W[ho];B[hq]
+;W[sd];B[go];W[oc];B[qr];W[ff];B[ro];W[rn];B[rp];W[ck];B[og];W[ap]
+;B[dk];W[eh];B[dl];W[dm];B[el];W[da];B[ei];W[ml];B[mi];W[kl];B[mk]
+;W[rd];B[kk];W[jk];B[dh];W[il];B[em];W[jj];B[kj];W[ik];B[nf];W[me]
+;B[nh];W[en];B[im];W[hn];B[hm];W[jm];B[in];W[eg];B[ji];W[ii];B[lr]
+;W[mr];B[dg];W[kr];B[jr];W[ls];B[io];W[js];B[is];W[ks];B[hr];W[ai]
+;B[ah];W[aj];B[bg];W[so];B[sp];W[sn];B[nr];W[kq];B[gc];W[gd];B[fb]
+;W[ec];B[hc];W[ib];B[hd];W[ge];B[he];W[hf];B[id];W[jd];B[gb];W[po]
+;B[eb];W[dc];B[ce];W[ca];B[mc];W[bb];B[bc];W[jp];B[jo];W[ip];B[mb]
+;W[od];B[kc];W[jb];B[jc];W[hb];B[kd];W[je];B[ke];W[kf];B[kb];W[ka]
+;B[la];W[ha];B[ja];W[ga];B[ld];W[nb];B[ko];W[kp];B[kn];W[hp];B[km]
+;W[lm];B[lo];W[gp];B[gq];W[jl];B[eq];W[rc];B[mo];W[gj];B[mn];W[op]
+;B[mm];W[ll];B[bd];W[ns];B[pq];W[os];B[ps];W[fj];B[ej];W[rb];B[qa]
+;W[pc];B[qd];W[re];B[qf];W[jh];B[ki];W[iq];B[ir];W[fn];B[fo];W[or]
+;B[do];W[dn];B[aq];W[co];B[lb];W[ee];B[nl];W[pl];B[nm];W[no];B[ol]
+;W[om];B[hj];W[gi];B[fh];W[hk];B[oj];W[gh];B[fg];W[ef];B[gg];W[hg]
+;B[ac];W[ed];B[qk];W[rk];B[qj];W[de];B[cd];W[ra];B[ab];W[ba];B[gf]
+;W[lk];B[lj];W[gk];B[gl];W[lg];B[lh];W[lp];B[ni];W[oh];B[pa];W[kg]
+;B[na];W[cj];B[md];W[nd];B[eo];W[cp];B[mf];W[le];B[pr];W[ms];B[aa]
+;W[ea];B[pi];W[oa];B[rh];W[sh];B[sg];W[sb];B[ob];W[be];B[bf];W[oa]
+;B[si];W[ob];B[ma];W[rl];B[se];W[sj];B[sf];W[sh];B[ae];W[si];B[];W[]
+C[final_score: W+26.5
+K19 removed
+M19 removed
+E18 removed
+H10 removed
+M2 removed
+game adjourned]
+)
diff --git a/regression/games/nngs/gnugo-3.3.10-rcde05-200210300235.sgf b/regression/games/nngs/gnugo-3.3.10-rcde05-200210300235.sgf
new file mode 100644 (file)
index 0000000..a2a867a
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[rcde05]BR[17k]
+PC[NNGS]DT[2002-10-30]AP[gnugoclient:2.0]
+RE[B+35.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[cn];B[fp];W[fc];B[df];W[db];B[cc];W[ic];B[pg];W[nq];B[pn];W[pr]
+;B[qq];W[kq];B[ip];W[bp];B[cq];W[cl];B[bk];W[bq];B[qr];W[nc];B[ob]
+;W[ir];B[hq];W[ie];B[cb];W[kc];B[hr];W[fm];B[fe];W[cr];B[hf];W[hs]
+;B[jg];W[gk];B[if];W[gi];B[dr];W[gr];B[br];W[dh];B[ck];W[ci];B[dl]
+;W[ar];B[cs];W[dm];B[ek];W[hm];B[gq];W[gs];B[ei];W[cf];B[em];W[en]
+;B[el];W[cg];B[fn];W[bl];B[eh];W[eo];B[eg];W[fo];B[go];W[ce];B[gn]
+;W[bh];B[je];W[gm];B[fd];W[ec];B[ed];W[nb];B[qb];W[ne];B[of];W[gd]
+;B[mg];W[jm];B[oe];W[jj];B[nd];W[md];B[od];W[lj];B[me];W[le];B[nf]
+;W[mc];B[nj];W[ll];B[nl];W[he];B[mn];W[kf];B[jf];W[fj];B[fr];W[kg]
+;B[fs];W[ps];B[is];W[jr];B[qs];W[kh];B[or];W[nr];B[os];W[jp];B[oq]
+;W[ns];B[lp];W[np];B[lq];W[lo];B[mo];W[lr];B[mp];W[ko];B[de];W[ca]
+;B[ba];W[da];B[bb];W[io];B[ln];W[mh];B[nh];W[mi];B[kn];W[jn];B[ni]
+;W[bd];B[hh];W[ge];B[gh];W[iq];B[gf];W[hp];B[gp];W[aq];B[fi];W[hi]
+;B[ej];W[ih];B[jh];W[ji];B[ig];W[ii];B[bj];W[dg];B[mk];W[ak];B[lk]
+;W[kk];B[km];W[kl];B[aj];W[al];B[ae];W[ad];B[ag];W[ah];B[jd];W[jc]
+;B[id];W[hd];B[hc];W[gc];B[kd];W[ld];B[hb];W[gb];B[co];W[bo];B[eq]
+;W[op];B[pq];W[on];B[om];W[oo];B[nn];W[po];B[qo];W[qn];B[pm];W[kp]
+;B[ro];W[dc];B[cd];W[js];B[qm];W[fk];B[rn];W[ho];B[oa];W[hs];B[ab]
+;W[oc];B[pc];W[gs];B[cp];W[dn];B[lg];W[lh];B[na];W[ma];B[lf];W[ke]
+;B[ml];W[hn];B[bs];W[fl];B[mq];W[mr];B[lm];W[cj];B[bi];W[di];B[ep]
+;W[mj];B[no];W[ai];B[dk];W[bg];B[as];W[be];B[bc];W[ac];B[gr];W[is]
+;B[do];W[bn];B[];W[]
+C[final_score: B+35.5
+H18 removed
+A15 removed
+A13 removed])
diff --git a/regression/games/nngs/gnugo-3.3.10-tsuku-200210241808.sgf b/regression/games/nngs/gnugo-3.3.10-tsuku-200210241808.sgf
new file mode 100644 (file)
index 0000000..ed826f5
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[tsuku]BR[11k*]
+PC[NNGS]DT[2002-10-24]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[dp];W[pd];B[pp];W[cd];B[qf];W[nd];B[rd];W[qh];B[pj];W[qc];B[rc]
+;W[oh];B[of];W[nj];B[pl];W[fq];B[fp];W[gp];B[fo];W[eq];B[dq];W[jq]
+;B[dm];W[ec];B[lp];W[ck];B[di];W[ek];B[fi];W[bm];B[de];W[lr];B[mq]
+;W[bi];B[ce];W[hc];B[jd];W[mr];B[oq];W[bd];B[be];W[nl];B[nr];W[rj]
+;B[qk];W[nf];B[og];W[nh];B[ng];W[mf];B[mg];W[lc];B[lf];W[jb];B[on]
+;W[rb];B[rk];W[jp];B[le];W[oe];B[md];W[mc];B[pe];W[ne];B[oc];W[qd]
+;B[qe];W[ob];B[pb];W[qb];B[nb];W[nc];B[oa];W[fe];B[mb];W[pc];B[kc]
+;W[lb];B[kb];W[ka];B[ld];W[lg];B[ib];W[ic];B[jc];W[rg];B[qg];W[rh]
+;B[hb];W[ja];B[gc];W[hd];B[pg];W[rf];B[re];W[qi];B[mh];W[kg];B[ie]
+;W[li];B[mi];W[he];B[if];W[si];B[mj];W[mk];B[lj];W[ji];B[ih];W[ki]
+;B[kk];W[ni];B[hi];W[ij];B[km];W[il];B[in];W[gl];B[fl];W[fk];B[gk]
+;W[gm];B[fm];W[gj];B[hk];W[gn];B[ik];W[jk];B[jl];W[hj];B[jj];W[ii]
+;B[gi];W[fj];B[dd];W[cc];B[dc];W[db];B[eb];W[fb];B[ed];W[ea];B[fc]
+;W[gb];B[eb];W[da];B[ef];W[hl];B[jk];W[bg];B[ad];W[bb];B[cj];W[bj]
+;B[dk];W[dl];B[ej];W[dj]C[L:8];B[ph];W[pi]C[L:9];B[dk];W[el]C[L:8]
+;B[cl];W[dj]C[L:9];B[oj];W[oi]C[L:10];B[dk];W[bk];B[cm];W[dj];B[fn]
+;W[ci];B[go];W[hh]C[L:9];B[hg];W[gh]C[L:10];B[fh];W[hp];B[kf];W[bn]
+;B[bp];W[gg];B[gf];W[fg];B[eg];W[ff];B[ge];W[hf];B[gd];W[ig];B[jf]
+;W[ke];B[ee];W[eh];B[jg];W[jh];B[id];W[hg];B[ei];W[dh])
diff --git a/regression/games/nngs/gnugo-3.3.10-viking4-200210261703.sgf b/regression/games/nngs/gnugo-3.3.10-viking4-200210261703.sgf
new file mode 100644 (file)
index 0000000..01c1686
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.3.10)]WR[11k*]
+PB[viking4]BR[16k*]
+PC[NNGS]DT[2002-10-26]AP[gnugoclient:2.0]
+RE[B+5.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[fq];B[ip];W[fo];B[dn];W[fm];B[dl];W[fc];B[ee];W[cf];B[gd];W[gc]
+;B[be];W[fk];B[hd];W[hc];B[qf];W[fi];B[fj];W[gj];B[in];W[ej];B[qn]
+;W[mp];B[oq];W[nc];B[ch];W[pb];B[qc];W[kc];B[ic];W[ib];B[ne];W[dr]
+;B[cq];W[cr];B[ke];W[il];B[jm];W[lm];B[fg];W[ir];B[jl];W[bq];B[oo]
+;W[bp];B[bn];W[lk];B[jq];W[kr];B[jj];W[li];B[ik];W[ii];B[hl];W[kk]
+;B[ig];W[ji];B[gn];W[fn];B[gm];W[mh];B[qb];W[kj];B[jk];W[db];B[ob]
+;W[cc];B[id];W[jc];B[cd];W[nb];B[oc];W[pl];B[ql];W[oh];B[qh];W[nr]
+;B[kp];W[or];B[pr];W[oa];B[os];W[mq];B[ol];W[qa];B[jr];W[hr];B[lo]
+;W[js];B[kn];W[rb];B[om];W[ns];B[lr];W[lq];B[kq];W[ks];B[ls];W[is]
+;B[ps];W[bc];B[rc];W[go];B[jb];W[ha];B[hh];W[hi];B[ho];W[gh];B[gg]
+;W[ek];B[dk];W[di];B[ci];W[dh];B[pc];W[pa];B[kg];W[cp];B[bf];W[dg]
+;B[co];W[bo];B[bm];W[nj];B[mn];W[oi];B[dq];W[ao];B[fh];W[cg];B[bg]
+;W[bd];B[fd];W[ce];B[gi];W[lg];B[kh];W[gh];B[ki];W[le];B[gk];W[em]
+;B[gi];W[nf];B[gh];W[hj];B[je];W[me];B[fp];W[ep];B[gp];W[eo];B[do]
+;W[eq];B[ef];W[oe];B[kd];W[ld];B[gr];W[gq];B[hp];W[dm];B[cm];W[pg]
+;B[qg];W[ec];B[iq];W[hq];B[ad];W[ac];B[if];W[ae];B[ja];W[lh];B[lb]
+;W[kb];B[sb];W[ra];B[ka];W[la];B[ma];W[lc];B[na];W[mb];B[sa];W[la]
+;B[oa];W[ia];B[pe];W[nd];B[pf];W[kf];B[jh];W[jf];B[jd];W[af];B[bh]
+;W[ag];B[bk];W[ah];B[ai];W[ad];B[fl];W[cj];B[el];W[bj];B[of];W[aj]
+;B[og];W[ng];B[od];W[ph];B[ck];W[ak];B[al];W[bi];B[eg];W[pi];B[qi]
+;W[no];B[jg];W[lf];B[pk];W[nn];B[nm];W[on];B[an];W[pn];B[po];W[pm]
+;B[qm];W[mm];B[ok];W[mo];B[ln];W[kl];B[ih];W[nk];B[nq];W[nl];B[np]
+;W[mr];B[ij];W[fj];B[hf];W[ne];B[hk];W[ei];B[dc];W[ed];B[de];W[km]
+;B[lp];W[ms];B[cn];W[oj];B[qj];W[eh];B[en];W[df];B[];W[]
+C[final_score: B+5.5
+J8 removed
+G2 removed])
diff --git a/regression/games/nngs/gnugo-3.3.11-bconwil-200211202359.sgf b/regression/games/nngs/gnugo-3.3.11-bconwil-200211202359.sgf
new file mode 100644 (file)
index 0000000..9f4dbea
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.11)]WR[10k*]
+PB[bconwil]BR[11k*]
+PC[NNGS]DT[2002-11-20]AP[gnugoclient:2.0]
+RE[B+13.5]
+;B[op];W[dd];B[pd];W[dp];B[qp];W[qf];B[pi];W[of];B[nd];W[mq];B[kq]
+;W[mo];B[ko];W[on];B[qm];W[iq];B[fq];W[cn];B[io];W[lc];B[mf];W[ic]
+;B[ci];W[or];B[pr];W[eq];B[gp];W[rd];B[qc];W[rc];B[rb];W[mm];B[nr]
+;W[mr];B[nq];W[np];B[os];W[kn];B[jn];W[km];B[cf];W[fc];B[bd];W[cc]
+;B[cl];W[gr];B[fr];W[en];B[er];W[dr];B[ep];W[dq];B[eo];W[do];B[fn]
+;W[kk];B[dm];W[fm];B[em];W[fl];B[gm];W[fj];B[jl];W[dk];B[kl];W[ck]
+;B[bk];W[bj];B[bl];W[bi];B[bh];W[ch];B[dh];W[cg];B[bg];W[dg];B[eg]
+;W[df];B[di];W[eh];B[ei];W[bf];B[af];W[ce];B[be];W[cf];B[ag];W[cj]
+;B[ek];W[fh];B[ej];W[fk];B[fi];W[cd];B[gi];W[bc];B[hk];W[fg];B[hg]
+;W[ll];B[ol];W[nk];B[ok];W[ri];B[rj];W[qi];B[qj];W[oo];B[pp];W[nb]
+;B[ob];W[oc];B[pc];W[nc];B[od];W[sb];B[ne];W[kf];B[rh];W[qh];B[kd]
+;W[sj];B[sk];W[si];B[rl];W[kc];B[ld];W[kh];B[mh];W[li];B[dn];W[kr]
+;B[jr];W[jq];B[lr];W[kp];B[lq];W[lp];B[ks];W[ms];B[ir];W[ls];B[hr]
+;W[ji];B[kr];W[jp];B[jo];W[bm];B[dl];W[ai];B[am];W[bn];B[aj];W[ak]
+;B[an];W[ao];B[al];W[ah];B[bo];W[bq];B[co];W[qb];B[pb];W[ra];B[nj]
+;W[jm];B[im];W[lo];B[jk];W[kj];B[ds];W[cs];B[cr];W[es];B[bs];W[ds]
+;B[br];W[gf];B[hf];W[qn];B[rn];W[qo];B[ro];W[pm];B[pl];W[mj];B[ni]
+;W[he];B[nl];W[if];B[ig];W[jf];B[gg];W[ff];B[hi];W[md];B[me];W[mc]
+;B[lf];W[mk];B[om];W[pn];B[nn];W[nm];B[hq];W[jd];B[ph];W[pg];B[ng]
+;W[gh];B[hh];W[jj];B[ij];W[ke];B[le];W[og];B[oh];W[ip];B[hp];W[lm]
+;B[ns];W[mp];B[qe];W[re];B[rg];W[qg];B[lh];W[mi];B[kg];W[jg];B[lg]
+;W[na];B[pa];W[qa];B[aq];W[qd];B[pe];W[ml];B[ih];W[jh];B[ik];W[nf]
+;B[pf];W[rf];B[aj];W[ae];B[dj];W[ak];B[po];W[no];B[aj];W[bp];B[ap]
+;W[ak];B[ar];W[aj];B[ii];W[oe];B[];W[oa];B[];W[]
+C[final_score: B+13.5
+B16 removed
+E13 removed
+S13 removed
+F10 removed
+B7 removed
+O6 removed
+D5 removed
+B4 removed
+G2 removed
+P2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.11-ccwills-200211031528.sgf b/regression/games/nngs/gnugo-3.3.11-ccwills-200211031528.sgf
new file mode 100644 (file)
index 0000000..c1e1a00
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[GnuGo (GNU Go 3.3.11)]WR[11k*]
+PB[ccwills]BR[16k*]
+PC[NNGS]DT[2002-11-03]AP[gnugoclient:2.0]
+RE[W+4.5]
+AB[dd][pd][dp][pp]
+;W[cn];B[fp];W[bp];B[cq];W[ck];B[iq];W[mp];B[nq];W[mq];B[np];W[fd]
+;B[ec];W[fc];B[df];W[jd];B[ci];W[nc];B[oc];W[nd];B[pf];W[qh];B[ob]
+;W[qk];B[qm];W[rf];B[rd];W[nb];B[nf];W[cc];B[cd];W[eb];B[db];W[dc]
+;B[cb];W[bc];B[ed];W[ea];B[bb];W[kp];B[kq];W[lq];B[mo];W[jq];B[jr]
+;W[kr];B[jp];W[lo];B[kq];W[jo];B[ip];W[jq];B[ej];W[bq];B[br];W[qq]
+;B[pq];W[qp];B[qo];W[ro];B[rp];W[rq];B[rn];W[sp];B[pn];W[fe];B[fg]
+;W[he];B[hg];W[jm];B[jf];W[gn];B[jk];W[hm];B[hk];W[le];B[lg];W[fl]
+;B[gj];W[io];B[hp];W[ek];B[ll];W[ok];B[mj];W[oa];B[pa];W[na];B[qb]
+;W[pr];B[or];W[qs];B[ls];W[mr];B[ms];W[bj];B[bi];W[ks];B[ir];W[ni]
+;B[mi];W[nr];B[ns];W[nh];B[os];W[oe];B[pe];W[of];B[ng];W[mh];B[lh]
+;W[og];B[mg];W[ai];B[ah];W[aj];B[bg];W[ar];B[cr];W[dj];B[di];W[cj]
+;B[nm];W[fj];B[ei];W[fi];B[fh];W[gi];B[hi];W[gh];B[hh];W[gk];B[hj]
+;W[gg];B[gf];W[fk];B[hf];W[ie];B[if];W[re];B[qe];W[sd];B[rc];W[rl]
+;B[ql];W[nj];B[ps];W[qr];B[js];W[lr];B[oq];W[ff];B[ef];W[mk];B[lk]
+;W[pl];B[pm];W[om];B[on];W[ol];B[ml];W[ln];B[mn];W[da];B[bd];W[pg]
+;B[nk];W[ho];B[en];W[dn];B[do];W[fo];B[eo];W[em];B[fn];W[go];B[gp]
+;W[ke];B[kf];W[km];B[kl];W[nl];B[mk];W[pj];B[lm];W[il];B[ik];W[se]
+;B[sl];W[sk];B[sm];W[so];B[rm];W[rk];B[co];W[bo];B[cp];W[qf];B[od]
+;W[sc];B[sb];W[ge];B[me];W[md];B[ne];W[ee];B[de];W[kq];B[ca];W[fb]
+;B[ac];W[fm];B[bs];W[aq];B[as];W[lf];B[je];W[hl];B[jl];W[sn];B[mf]
+;W[kd];B[];W[]C[final_score: W+4.5])
diff --git a/regression/games/nngs/gnugo-3.3.11-rcde05-200211090008.sgf b/regression/games/nngs/gnugo-3.3.11-rcde05-200211090008.sgf
new file mode 100644 (file)
index 0000000..99ea0e5
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.3.11)]WR[11k*]
+PB[rcde05]BR[17k]
+PC[NNGS]DT[2002-11-09]AP[gnugoclient:2.0]
+RE[W+79.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[fq];B[dn];W[nq];B[pn];W[pr];B[qq];W[kq];B[ic];W[dr];B[cq];W[hp]
+;B[pg];W[md];B[fc];W[dg];B[ef];W[ce];B[cd];W[df];B[ee];W[eg];B[cr]
+;W[nn];B[ol];W[ml];B[qr];W[oc];B[pc];W[ci];B[cj];W[bi];B[bj];W[hn]
+;B[be];W[bf];B[bd];W[oo];B[ob];W[nc];B[kc];W[hl];B[fn];W[nl];B[fl]
+;W[oq];B[gj];W[po];B[qo];W[ij];B[hh];W[fg];B[ql];W[kj];B[hj];W[nj]
+;B[ii];W[ik];B[hf];W[ei];B[fj];W[di];B[op];W[np];B[ej];W[ds];B[cs]
+;W[nb];B[pb];W[mf];B[er];W[fr];B[es];W[je];B[eq];W[fs];B[ie];W[qs]
+;B[rs];W[ps];B[rr];W[kd];B[jf];W[lc];B[lb];W[kb];B[fp];W[gp];B[go]
+;W[ho];B[nh];W[jc];B[ib];W[oi];B[ng];W[pi];B[rj];W[qh];B[qg];W[rh]
+;B[rg];W[on];B[pm];W[ae];B[lh];W[ad];B[ki];W[bc];B[lj];W[kk];B[lk]
+;W[ll];B[jq];W[ir];B[kr];W[cc];B[jr];W[kp];B[iq];W[hr];B[jp];W[dc]
+;B[jo];W[ed];B[de];W[fd];B[cf];W[ge];B[cg];W[bg];B[ln];W[gc];B[ko]
+;W[lp];B[jm];W[km];B[kn];W[id];B[gb];W[hd];B[hc];W[gd];B[eb];W[ec]
+;B[fb];W[ha];B[in];W[gn];B[fo];W[kf];B[kg];W[aj];B[il];W[hk];B[hm]
+;W[gm];B[im];W[gl];B[ak];W[ai];B[io];W[bk];B[jh];W[bl];B[gf];W[ff]
+;B[jb];W[ka];B[lm];W[kl];B[fm];W[bn];B[db];W[ja];B[hb];W[ia];B[cb]
+;W[bb];B[mi];W[bp];B[cm];W[lf];B[mr];W[nr];B[lq];W[mq];B[lr];W[js]
+;B[bq];W[ok];B[qj];W[no];B[lo];W[mp];B[mk];W[nk];B[pf];W[sg];B[sf]
+;W[sh];B[re];W[om];B[pl];W[ck];B[mm];W[nm];B[ga];W[ca];B[ea];W[dk]
+;B[la];W[kc];B[na];W[mb];B[ks];W[ms];B[is];W[hq];B[gs];W[hs];B[gg]
+;W[fh];B[ek];W[dl];B[sj];W[co];B[aq];W[do];B[eo];W[bm];B[od];W[pq]
+;B[qp];W[cn];B[dm];W[mj];B[li];W[he];B[if];W[nf];B[js];W[ne];B[ap]
+;W[ao];B[oe];W[cp];B[mg];W[el];B[em];W[pk];B[qk];W[jj];B[oh];W[of]
+;B[gh];W[fi];B[gk];W[gi];B[hi];W[ph];B[og];W[nd];B[lg];W[ji];B[ri]
+;W[ni];B[qi];W[si];B[oj];W[cl];B[];W[]
+C[final_score: W+82.5
+E19 removed
+M19 removed
+B16 removed
+C14 removed
+A9 removed
+J8 removed
+D2 removed
+G1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf b/regression/games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf
new file mode 100644 (file)
index 0000000..26c1560
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.12)]WR[10k*]
+PB[RikiTiki]BR[13k*]
+PC[NNGS]DT[2002-12-04]AP[gnugoclient:2.0]
+RE[B+58.5]
+;B[pd];W[dp];B[dd];W[pp];B[jd];W[cf];B[fc];W[bd];B[cc];W[ci];B[cn]
+;W[pf];B[nd];W[pj];B[bp];W[qd];B[pc];W[qc];B[qb];W[qe];B[fq];W[dn]
+;B[dq];W[nf];B[le];W[lg];B[nq];W[lq];B[no];W[pn];B[pr];W[qq];B[qr]
+;W[iq];B[jp];W[nm];B[kq];W[kr];B[jr];W[jq];B[kp];W[lr];B[lp];W[ir]
+;B[ip];W[ll];B[qh];W[rg];B[rh];W[sh];B[qg];W[sg];B[qj];W[rf];B[qm]
+;W[qn];B[rm];W[qk];B[rj];W[rk];B[si];W[pi];B[og];W[of];B[oh];W[lf]
+;B[pk];W[pl];B[ok];W[qi];B[ri];W[ql];B[pm];W[ol];B[nj];W[lj];B[om]
+;W[nl];B[on];W[rp];B[rr];W[rb];B[pb];W[bc];B[bb];W[ef];B[ge];W[co]
+;B[cp];W[bo];B[ep];W[cm];B[fn];W[do];B[dk];W[bk];B[el];W[ap];B[bq]
+;W[il];B[mh];W[lh];B[mi];W[ng];B[nh];W[pg];B[ph];W[oi];B[mk];W[qf]
+;B[ml];W[me];B[md];W[if];B[ie];W[ke];B[kd];W[gr];B[fr];W[fs];B[es]
+;W[gs];B[gq];W[hq];B[hp];W[er];B[dr];W[ds];B[cs];W[es];B[cr];W[aq]
+;B[hs];W[is];B[ar];W[ab];B[ba];W[lk];B[mm];W[hj];B[fj];W[kn];B[ln]
+;W[lm];B[lo];W[gh];B[hf];W[ig];B[hg];W[hh];B[ld];W[je];B[jn];W[jm]
+;B[hn];W[jo];B[in];W[ko];B[io];W[km];B[gl];W[ao];B[ei];W[eh];B[di]
+;W[dh];B[cj];W[bj];B[ee];W[nr];B[oq];W[ra];B[mq];W[mr];B[or];W[ne]
+;B[ce];W[be];B[df];W[cg];B[ff];W[cd];B[dc];W[eg];B[de];W[li];B[fg]
+;W[hk];B[gk];W[ck];B[dj];W[dl];B[em];W[mj];B[nk];W[dm];B[en];W[ac]
+;B[fh];W[gi];B[dg];W[ch];B[gj];W[eo];B[fo];W[aa];B[cb];W[os];B[ps]
+;W[ns];B[gg];W[qa];B[pa];W[mg];B[nn];W[oe];B[od];W[im];B[hl];W[hm]
+;B[gm];W[id];B[he];W[pe];B[fi];W[ii];B[eq];W[hr];B[];W[]
+C[final_score: B+58.5
+J16 removed
+P11 removed
+R9 removed
+C6 removed
+Q6 removed
+Q4 removed
+S4 removed
+R3 removed
+K2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.12-guest-200212171626.sgf b/regression/games/nngs/gnugo-3.3.12-guest-200212171626.sgf
new file mode 100644 (file)
index 0000000..7e2e75d
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.12)]WR[10k*]
+PB[guest]BR[NR]
+PC[NNGS]DT[2002-12-17]AP[gnugoclient:2.0]
+RE[B+18.5]
+;B[dp];W[pd];B[pq];W[cd];B[qo];W[jq];B[ed];W[ee];B[fe];W[de];B[gd]
+;W[fq];B[dn];W[ec];B[fc];W[eb];B[fb];W[cj];B[nc];W[lc];B[ne];W[pf]
+;B[ke];W[ic];B[fg];W[ph];B[ch];W[dd];B[fd];W[dr];B[cq];W[cr];B[qj]
+;W[qh];B[oj];W[mq];B[no];W[ej];B[gi];W[dl];B[cm];W[gk];B[fm];W[ik]
+;B[ii];W[kk];B[ki];W[oc];B[nb];W[ie];B[jd];W[jc];B[id];W[le];B[ld]
+;W[md];B[kd];W[nd];B[kc];W[kb];B[lb];W[mf];B[mc];W[hc];B[jb];W[me]
+;B[mk];W[fa];B[ga];W[ob];B[kg];W[ea];B[gb];W[bq];B[bp];W[lm];B[mm]
+;W[hm];B[bk];W[bj];B[cl];W[eh];B[eg];W[dg];B[dh];W[di];B[df];W[gn]
+;B[lp];W[mp];B[mo];W[lo];B[ln];W[ko];B[kn];W[jo];B[jl];W[kl];B[jk]
+;W[jm];B[jj];W[km];B[hl];W[cg];B[cf];W[bg];B[bf];W[cb];B[bh];W[ck]
+C[L:9];B[bl];W[gl]C[L:10];B[il];W[gm];B[eq];W[dq];B[cp];W[ep];B[eo]
+;W[fp];B[fo];W[go];B[ng];W[nh];B[mg];W[or];B[oq];W[nr];B[pr];W[ri]
+;B[rj];W[br];B[oa];W[pa];B[na];W[qb];B[og];W[nf];B[pg];W[qg];B[of]
+;W[oe];B[oh];W[sj];B[sk];W[si];B[rk];W[ps];B[qs];W[os];B[qr];W[fh]
+;B[gh];W[jn];B[mn];W[fn];B[em];W[en];B[do];W[dm];B[bn];W[be];B[nq]
+;W[mr];B[lj];W[af];B[ag];W[ae];B[qi];W[qf];B[rh];W[rg];B[sh];W[pi]
+;B[pj];W[lf];B[lg];W[hk];B[im];W[in];B[ci];W[dj];B[sg];W[sf];B[oi]
+;W[fi];B[fj];W[ei];B[gj];W[aj];B[ak];W[fk];B[hj];W[np];B[op];W[ml]
+;B[nl];W[ll];B[lk];W[ap];B[ao];W[aq];B[kf];W[ef];B[ff];W[ce];B[kj]
+;W[ij];B[ai];W[ek];B[bi];W[]
+C[final_score: B+18.5
+L18 removed
+H17 removed
+J15 removed
+O12 removed
+E7 removed
+M4 removed
+E3 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.12-jimm-200211261724.sgf b/regression/games/nngs/gnugo-3.3.12-jimm-200211261724.sgf
new file mode 100644 (file)
index 0000000..c5ddbed
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.12)]WR[11k*]
+PB[jimm]BR[7k*]
+PC[NNGS]DT[2002-11-26]AP[gnugoclient:2.0]
+RE[B+22.5]
+;B[pd];W[dp];B[qp];W[dc];B[nq];W[nd];B[pg];W[qi];B[qk];W[ce];B[qg]
+;W[jc];B[pi];W[hq];B[jq];W[io];B[jo];W[jn];B[ko];W[lm];B[in];W[ho]
+;B[im];W[jm];B[il];W[nm];B[pm];W[no];B[op];W[di];B[kl];W[mn];B[km]
+;W[kn];B[jl];W[ln];B[lp];W[ml];B[gm];W[mj];B[on];W[em];B[jj];W[mh]
+;B[lk];W[mk];B[lj];W[dk];B[cq];W[cp];B[dq];W[eq];B[er];W[fq];B[fr]
+;W[je];B[li];W[mi];B[oc];W[nc];B[ob];W[gc];B[gk];W[gh];B[hi];W[jh]
+;B[ji];W[nb];B[ih];W[hf];B[jg];W[oa];B[mf];W[kh];B[lh];W[qa];B[mg]
+;W[oj];B[oi];W[ok];B[ol];W[nl];B[nn];W[om];B[pl];W[ll];B[qb];W[rb]
+;B[qc];W[kg];B[kf];W[jf];B[ig];W[lf];B[ke];W[le];B[me];W[kd];B[md]
+;W[lc];B[mc];W[mb];B[rc];W[pn];B[oo];W[mp];B[mq];W[nh];B[lg];W[ri]
+;B[oe];W[rk];B[rl];W[bq];B[br];W[bp];B[gr];W[hr];B[gq];W[fo];B[gp]
+;W[go];B[hp];W[ip];B[iq];W[lo];B[kq];W[ar];B[cr];W[ni];B[pj];W[fj]
+;B[fk];W[gj];B[hj];W[ng];B[of];W[pk];B[qj];W[jp];B[kp];W[fp];B[if]
+;W[ie];B[gi];W[fi];B[el];W[dl];B[fh];W[fg];B[eh];W[hh];B[gg];W[hg]
+;B[gf];W[ii];B[ij];W[ek];B[df];W[cf];B[ff];W[ei];B[eg];W[ee];B[de]
+;W[dd];B[cg];W[bg];B[ch];W[ld];B[bh];W[af];B[ef];W[bj];B[dh];W[fl]
+;B[gl];W[fe];B[ge];W[gd];B[ra];W[sa];B[oh];W[ih];B[db];W[cb];B[eb]
+;W[fc];B[ed];W[fd];B[ec];W[fb];B[ah];W[bf];B[aj];W[cd];B[bk];W[bm]
+;B[cj];W[ci];B[bi];W[fm];B[gn];W[dj];B[bl];W[am];B[al];W[cl];B[ck]
+;W[fn];B[bs];W[hn];B[hm];W[ki];B[kj];W[he];B[sc];W[pa];B[pb];W[ra]
+;B[as];W[aq];B[og];W[od];B[ne];W[na];B[np];W[mo];B[ag];W[nf];B[sb]
+;W[kb];B[];W[]
+C[final_score: B+22.5
+D18 removed
+R11 removed
+S9 removed
+Q6 removed
+H3 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.16-ccwills-200302151826.sgf b/regression/games/nngs/gnugo-3.3.16-ccwills-200302151826.sgf
new file mode 100644 (file)
index 0000000..4e21051
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.16)]WR[10k*]
+PB[ccwills]BR[13k*]
+PC[NNGS]DT[2003-02-15]AP[gnugoclient:2.0]
+RE[W+46.5]
+;B[qd];W[pp];B[dd];W[cp];B[oc];W[cf];B[pj];W[ci];B[fd];W[eq];B[jc]
+;W[oe];B[qn];W[np];B[pg];W[qe];B[md];W[pd];B[qc];W[rg];B[qh];W[kq]
+;B[qp];W[qq];B[qo];W[pc];B[pb];W[rq];B[od];W[of];B[pe];W[pf];B[og]
+;W[mf];B[bd];W[re];B[cm];W[om];B[ql];W[fn];B[bj];W[ll];B[cj];W[di]
+;B[dj];W[ef];B[gf];W[ei];B[kf];W[ej];B[em];W[hm];B[fl];W[bi];B[do]
+;W[hq];B[fp];W[eo];B[jm];W[hk];B[ho];W[ep];B[ko];W[kn];B[jn];W[jk]
+;B[jq];W[jo];B[io];W[jp];B[kp];W[ip];B[lq];W[mr];B[kr];W[hp];B[kl]
+;W[km];B[ln];W[lm];B[mn];W[oo];B[mp];W[ek];B[dk];W[bn];B[bm];W[el]
+;B[dm];W[co];B[fm];W[hi];B[en];W[fo];B[hl];W[il];B[gm];W[gl];B[gn]
+;W[fk];B[in];W[kk];B[jl];W[lj];B[cl];W[bk];B[ak];W[cn];B[ai];W[dn]
+;B[ag];W[if];B[bf];W[ig];B[aj];W[mh];B[kh];W[nj];B[oi];W[le];B[ld]
+;W[ke];B[cg];W[he];B[hd];W[ge];B[gd];W[ce];B[be];W[sn];B[rn];W[so]
+;B[sm];W[rm];B[ro];W[sl];B[sp];W[sm];B[rp];W[qm];B[pm];W[pn];B[pl]
+;W[sk];B[rj];W[sj];B[ri];W[bh];B[ah];W[bg];B[af];W[sb];B[rb];W[ng]
+;B[ol];W[nm];B[nn];W[oh];B[ph];W[mm];B[no];W[nq];B[lr];W[nh];B[oj]
+;W[sc];B[rc];W[rd];B[ir];W[hr];B[is];W[hs];B[ms];W[ns];B[ls];W[go]
+;B[hn];W[id];B[ic];W[jd];B[kd];W[ne];B[nd];W[nk];B[fe];W[ff];B[de]
+;W[df];B[nl];W[cd];B[cc];W[on];B[mq];W[nr];B[iq];W[pd];B[pc];W[ee]
+;B[ed];W[im];B[an];W[ao];B[am];W[qg];B[rh];W[ni];B[ok];W[ml];B[rl]
+;W[sq];B[rk];W[po];B[sg];W[sf];B[sh];W[pe];B[me];W[ie];B[dl];W[ra]
+;B[qa];W[si];B[sa];W[sd];B[ra];W[]C[final_score: W+46.5
+G14 removed
+L14 removed
+C13 removed
+L12 removed
+B9 removed
+D5 removed
+F4 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.16-ccwills-200303030550.sgf b/regression/games/nngs/gnugo-3.3.16-ccwills-200303030550.sgf
new file mode 100644 (file)
index 0000000..635e9f8
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.16)]WR[10k*]
+PB[ccwills]BR[12k*]
+PC[NNGS]DT[2003-03-03]AP[gnugoclient:2.0]
+RE[B+49.5]
+;B[pd];W[dc];B[pq];W[co];B[de];W[fd];B[cc];W[cb];B[cd];W[bb];B[ci]
+;W[jc];B[ep];W[dq];B[eq];W[gq];B[jq];W[po];B[oo];W[on];B[no];W[pm]
+;B[pp];W[qo];B[qi];W[nd];B[pf];W[pc];B[qc];W[oc];B[qb];W[dr];B[er]
+;W[mm];B[jo];W[je];B[cl];W[en];B[fo];W[go];B[fn];W[fg];B[fm];W[pb]
+;B[pk];W[fi];B[dg];W[ae];B[be];W[fp];B[eo];W[fr];B[es];W[hp];B[fq]
+;W[ln];B[jm];W[lp];B[mq];W[ir];B[jr];W[hj];B[jk];W[jj];B[nk];W[lk]
+;B[mi];W[mg];B[hl];W[li];B[mj];W[ds];B[gr];W[ad];B[af];W[bf];B[bc]
+;W[ac];B[bg];W[cf];B[ag];W[ce];B[dd];W[ec];B[df];W[rq];B[cg];W[ql]
+;B[qk];W[rl];B[rk];W[bm];B[bl];W[cm];B[dn];W[sk];B[sj];W[sl];B[ri]
+;W[qa];B[ra];W[pa];B[sb];W[lq];B[lr];W[qr];B[pr];W[ps];B[os];W[qs]
+;B[nr];W[fk];B[dp];W[cp];B[cn];W[bn];B[cq];W[cr];B[bq];W[br];B[do]
+;W[ao];B[ap];W[bo];B[am];W[ik];B[il];W[kk];B[jl];W[dj];B[dm];W[ar]
+;B[cj];W[el];B[em];W[dk];B[ck];W[nh];B[ph];W[hk];B[mh];W[lh];B[lo]
+;W[nf];B[kn];W[mo];B[ko];W[mp];B[np];W[nn];B[lm];W[mn];B[ml];W[gl]
+;B[gm];W[ni];B[nj];W[oi];B[pi];W[oj];B[ok];W[di];B[dh];W[oe];B[pe]
+;W[ll];B[km];W[fl];B[nm];W[om];B[nl];W[eh];B[ed];W[gd];B[ff];W[gf]
+;B[fe];W[ge];B[eg];W[lj];B[of];W[od];B[oh];W[pj];B[qj];W[ng];B[og]
+;W[qp];B[qq];W[rr];B[pl];W[kp];B[jp];W[kq];B[kr];W[dl];B[al];W[aq]
+;B[an];W[bp];B[bd];W[ab];B[fb];W[gb];B[fc];W[da];B[gc];W[hc];B[hb]
+;W[ib];B[ga];W[ea];B[hd];W[ic];B[gg];W[hg];B[fh];W[gh];B[ei];W[fg]
+;B[db];W[eb];B[gg];W[fa];B[fg];W[he];B[gi];W[hh];B[fj];W[hi];B[gj]
+;W[ej];B[fi];W[gk];B[ol];W[qn];B[kl];W[mk];B[ji];W[jg];B[lg];W[le]
+;B[];W[]C[final_score: B+8.5
+G19 removed
+F18 removed
+H18 removed
+H16 removed
+M13 removed
+K10 removed
+G5 removed
+F4 removed
+H4 removed
+G3 removed
+F2 removed
+J2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.16-rcde05-200302140458.sgf b/regression/games/nngs/gnugo-3.3.16-rcde05-200302140458.sgf
new file mode 100644 (file)
index 0000000..b2b9a3f
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.3.16)]WR[10k*]
+PB[rcde05]BR[17k*]
+PC[NNGS]DT[2003-02-14]AP[gnugoclient:2.0]
+RE[B+29.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[fq];B[dn];W[mp];B[no];W[dr];B[cq];W[iq];B[ic];W[md];B[ne];W[qn]
+;B[lf];W[qc];B[pc];W[qd];B[qb];W[qe];B[qg];W[rb];B[pb];W[rg];B[pe]
+;W[qh];B[pg];W[dg];B[eh];W[ce];B[cd];W[de];B[cr];W[gf];B[ph];W[rh]
+;B[me];W[ed];B[ec];W[qk];B[ee];W[fd];B[bf];W[be];B[bd];W[ae];B[fc]
+;W[gd];B[gc];W[je];B[mc];W[bg];B[bi];W[id];B[hc];W[ld];B[hd];W[he]
+;B[kc];W[kd];B[lc];W[kf];B[qj];W[pl];B[nk];W[nm];B[ll];W[rj];B[po]
+;W[kh];B[nc];W[oq];B[pq];W[pr];B[qr];W[or];B[kq];W[kp];B[lq];W[jp]
+;B[lp];W[lo];B[mo];W[mq];B[nr];W[mr];B[ko];W[ln];B[kn];W[km];B[jk]
+;W[jn];B[jr];W[qp];B[qo];W[ro];B[qq];W[rp];B[lr];W[nq];B[ch];W[ir]
+;B[cg];W[ef];B[ag];W[lg];B[mg];W[mh];B[ng];W[ad];B[gh];W[bc];B[cc]
+;W[bb];B[cb];W[gn];B[fm];W[hl];B[ig];W[fl];B[gm];W[em];B[gl];W[el]
+;B[gk];W[en];B[hk];W[eo];B[do];W[cl];B[fn];W[er];B[fo];W[ep];B[hm]
+;W[le];B[ho];W[bn];B[nl];W[lm];B[kl];W[jm];B[io];W[ih];B[hg];W[ej]
+;B[jo];W[ol];B[il];W[qi];B[pi];W[jg];B[if];W[ie];B[dh];W[ba];B[fg]
+;W[fe];B[ca];W[gg];B[hh];W[ii];B[dm];W[dl];B[fk];W[ek];B[ok];W[qf]
+;B[rq];W[op];B[oo];W[sq];B[sr];W[rs];B[on];W[om];B[qs];W[ra];B[qa]
+;W[gp];B[lj];W[go];B[hn];W[cf];B[bh];W[bk];B[ij];W[cj];B[di];W[hi]
+;B[gi];W[nh];B[pf];W[bj];B[ji];W[jh];B[jf];W[ki];B[ff];W[eg];B[fh]
+;W[mf];B[kj];W[nf];B[og];W[nd];B[oe];W[af];B[li];W[lh];B[fj];W[ip]
+;B[hp];W[ls];B[ks];W[ms];B[hq];W[hr];B[jq];W[gq];B[bm];W[cm];B[cn]
+;W[bo];B[cs];W[ar];B[bp];W[ap];B[co];W[aq];B[bq];W[dq];B[br];W[cp]
+;B[co];W[cn];B[dp];W[ml];B[mk];W[mm];B[jj];W[ai];B[bg];W[od];B[oc]
+;W[mi];B[nj];W[jc];B[jb];W[jd];B[ni];W[oh];B[oi];W[hj];B[in];W[ei]
+;B[dk];W[hf];B[ci];W[jl];B[im];W[mj];B[pk];W[ql];B[gj];W[ck];B[fp]
+;W[fi];B[ah];W[aj];B[of];W[lf];B[];W[]C[final_score: W+18.5
+B7 removed
+C5 removed
+B4 removed
+D4 removed
+N4 removed
+T3 removed
+S1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.16-rubus-200302281805.sgf b/regression/games/nngs/gnugo-3.3.16-rubus-200302281805.sgf
new file mode 100644 (file)
index 0000000..30dbcae
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[GnuGo (GNU Go 3.3.16)]WR[10k*]
+PB[rubus]BR[15k*]
+PC[NNGS]DT[2003-02-28]AP[gnugoclient:2.0]
+RE[W+9.5]
+AB[dd][pd][dp][pp]
+;W[cn];B[bp];W[nd];B[pg];W[qi];B[qg];W[fd];B[dg];W[nq];B[pr];W[ql]
+;B[qn];W[ck];B[ci];W[kq];B[gq];W[oc];B[pc];W[ec];B[dc];W[bi];B[bh]
+;W[bj];B[ei];W[ah];B[bg];W[he];B[en];W[ie];B[le];W[mf];B[lf];W[lc]
+;B[mg];W[lg];B[kg];W[lh];B[kh];W[kf];B[me];W[ke];B[nf];W[ki];B[mh]
+;W[li];B[ji];W[jh];B[ih];W[jg];B[ig];W[ir];B[gr];W[rn];B[ro];W[rm]
+;B[so];W[bo];B[co];W[bn];B[dn];W[or];B[oq];W[op];B[pq];W[oo];B[po]
+;W[nr];B[on];W[no];B[nn];W[eb];B[db];W[ob];B[pb];W[rh];B[rg];W[mo]
+;B[ag];W[ip];B[gn];W[pa];B[qa];W[oa];B[qb];W[da];B[ca];W[ea];B[cb]
+;W[im];B[gl];W[mn];B[mm];W[jj];B[ii];W[lm];B[ml];W[rj];B[ij];W[jk]
+;B[ik];W[ap];B[aq];W[ao];B[bq];W[ai];B[cj];W[bk];B[gf];W[dk];B[ek]
+;W[ps];B[qr];W[sg];B[sf];W[sh];B[rf];W[dj];B[di];W[ej];B[fj];W[el]
+;B[fk];W[dm];B[em];W[cm];B[fl];W[qs];B[rs];W[os];B[rq];W[nm];B[mi]
+;W[ol];B[qh];W[oi];B[oh];W[om];B[pn];W[mj];B[nj];W[ni];B[pi];W[pj]
+;B[ph];W[nk];B[jl];W[il];B[ll];W[kk];B[km];W[ln];B[in];W[jn];B[io]
+;W[jo];B[hp];W[hq];B[ho];W[hr];B[ge];W[gd];B[fe];W[gs];B[fs];W[hs]
+;B[fr];W[oe];B[of];W[ne];B[pe];W[ld];B[md];W[mc];B[od];W[mf];B[qm]
+;W[hm];B[gm];W[nh];B[ng];W[oj];B[hl];W[jm];B[if];W[hf];B[hg];W[dl]
+;B[ed];W[fc];B[jf];W[je];B[sn];W[rl];B[sm];W[pm];B[sl];W[sk];B[hn]
+;W[]C[final_score: W+9.5
+K8 removed
+M8 removed
+L7 removed])
diff --git a/regression/games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf b/regression/games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf
new file mode 100644 (file)
index 0000000..1c6957f
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.17)]WR[11k*]
+PB[Shindou]BR[15k*]
+PC[NNGS]DT[2003-04-16]AP[gnugoclient:2.0]
+RE[W+24.5]
+;B[dd];W[pp];B[dp];W[pd];B[hc];W[fq];B[eo];W[iq];B[ci];W[cc];B[dc]
+;W[cd];B[ce];W[be];B[cf];W[bf];B[bg];W[db];B[eb];W[cb];B[af];W[ad]
+;B[nd];W[pf];B[qk];W[oc];B[nc];W[kd];B[kc];W[jc];B[jb];W[kb];B[ib]
+;W[lc];B[ei];W[me];B[he];W[dr];B[cq];W[lq];B[go];W[lo];B[on];W[qo]
+;B[qm];W[no];B[gl];W[qi];B[oj];W[cr];B[dq];W[bq];B[bp];W[jh];B[hh]
+;W[oh];B[jj];W[ea];B[fb];W[fp];B[fo];W[lm];B[ml];W[ii];B[hj];W[mh]
+;B[hi];W[br];B[rj];W[ri];B[si];W[sh];B[sj];W[rh];B[rn];W[ro];B[so]
+;W[sp];B[sn];W[rq];B[jo];W[jm];B[im];W[ij];B[ik];W[jk];B[jl];W[kk]
+;B[jn];W[km];B[il];W[mk];B[nk];W[lk];B[nn];W[id];B[hd];W[ap];B[ao]
+;W[aq];B[bn];W[ih];B[ig];W[jg];B[if];W[jf];B[ie];W[ic];B[je];W[ja]
+;B[ha];W[ke];B[jd];W[kc];B[ia];W[ka];B[da];W[ca];B[fa];W[mm];B[nm]
+;W[mj];B[ae];W[ag];B[af];W[ah];B[bh];W[ai];B[bi];W[aj];B[bj];W[ak]
+;B[bk];W[al];B[bl];W[am];B[bm];W[ae];B[an];W[oo];B[bc];W[pn];B[pm]
+;W[qn];B[rl];W[pi];B[bb];W[ba];B[ab];W[hp];B[ho];W[jp];B[io];W[ko]
+;B[kn];W[gp];B[ln];W[pj];B[pk];W[eq];B[nj];W[ni];B[ll];W[kl];B[nl]
+;W[ac];B[af];W[mn];B[bd];W[oi];B[ep];W[ip];B[];W[qj];B[ki];W[sl]
+;B[rk];W[rm];B[sm];W[rm];B[sk];W[sm];B[li];W[kh];B[lh];W[lg];B[mi]
+;W[ng];B[mp];W[nq];B[mo];W[ji];B[];W[]C[final_score: W+24.5
+B19 removed
+E19 removed
+O17 removed
+M12 removed
+K10 removed
+N5 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.17-Wiedemann-200303251932.sgf b/regression/games/nngs/gnugo-3.3.17-Wiedemann-200303251932.sgf
new file mode 100644 (file)
index 0000000..9cfc2ed
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.3.17)]WR[11k*]
+PB[Wiedemann]BR[14k]
+PC[NNGS]DT[2003-03-25]AP[gnugoclient:2.0]
+RE[B+10.5]
+AB[dd][pd][dp]
+;W[pq];B[pp];W[fq];B[dn];W[dr];B[cq];W[iq];B[qq];W[qp];B[qr];W[po]
+;B[op];W[pf];B[qo];W[qn];B[rp];W[pn];B[rn];W[qk];B[lq];W[fc];B[df]
+;W[db];B[cc];W[ic];B[nc];W[cl];B[cm];W[dl];B[bm];W[qe];B[qd];W[cb]
+;B[kc];W[ok];B[oh];W[ng];B[qg];W[pg];B[re];W[og];B[qh];W[cr];B[br]
+;W[bl];B[ci];W[fl];B[ph];W[rm];B[rj];W[fn];B[eo];W[nh];B[ni];W[rk]
+;B[qj];W[pj];B[oj];W[kg];B[jr];W[ir];B[jq];W[bb];B[bc];W[ki];B[mj]
+;W[ai];B[bh];W[js];B[ks];W[is];B[lr];W[ac];B[ad];W[ab];B[bd];W[jo]
+;B[ah];W[jl];B[ak];W[ei];B[dh];W[ff];B[je];W[ie];B[jf];W[hg];B[jg]
+;W[jh];B[jb];W[ib];B[ko];W[al];B[am];W[aj];B[bj];W[sj];B[si];W[sk]
+;B[ri];W[bs];B[ar];W[sn];B[nk];W[ro];B[qp];W[ol];B[nn];W[kn];B[lo]
+;W[ip];B[eh];W[fh];B[ej];W[fi];B[dj];W[bk];B[fj];W[gj];B[ec];W[eb]
+;B[fd];W[gc];B[gd];W[qf];B[rf];W[ne];B[lh];W[li];B[lg];W[lf];B[mf]
+;W[kh];B[le];W[kf];B[me];W[mg];B[nd];W[ke];B[kd];W[jd];B[ln];W[km]
+;B[ll];W[jc];B[kb];W[oe];B[mi];W[mh];B[od];W[kk];B[fo];W[gn];B[gp]
+;W[go];B[fp];W[dq];B[gq];W[gr];B[fr];W[eq];B[hr];W[gs];B[bp];W[pi]
+;B[oi];W[hq];B[fk];W[gk];B[ef];W[ek];B[di];W[jp];B[kp];W[lm];B[mm]
+;W[lk];B[ml];W[hd];B[ge];W[cs];B[em];W[el];B[gf];W[gg];B[hf];W[if]
+;B[qi];W[pk];B[sp];W[dm];B[cn];W[en];B[oo];W[fe];B[ee];W[fg];B[eg]
+;W[so];B[om];W[pm];B[nl];W[on];B[nm];W[hp];B[ia];W[ha];B[ja];W[ep]
+;B[do];W[nf];B[lj];W[kj];B[dc];W[kl];B[as];W[fs];B[bi];W[ak];B[ck]
+;W[dk];B[cj];W[he];B[pe];W[ed];B[fd];W[gd];B[ed];W[mk];B[];W[]
+C[K14 removed
+final_score: B+10.5
+E7 removed
+Q3 removed
+F2 removed
+H2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.17-joshj-200304172202.sgf b/regression/games/nngs/gnugo-3.3.17-joshj-200304172202.sgf
new file mode 100644 (file)
index 0000000..7407d42
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.17)]WR[11k*]
+PB[joshj]BR[11k*]
+PC[NNGS]DT[2003-04-17]AP[gnugoclient:2.0]
+RE[B+26.5]
+;B[pq];W[dd];B[pd];W[dp];B[dj];W[qo];B[np];W[qf];B[qe];W[pf];B[re]
+;W[ql];B[rg];W[lq];B[mq];W[lp];B[nn];W[hq];B[cq];W[dq];B[cp];W[co]
+;B[bo];W[cn];B[bn];W[cm];B[bm];W[ch];B[cl];W[en];B[dl];W[ri];B[qh]
+;W[jd];B[cc];W[cd];B[dc];W[ec];B[eb];W[fc];B[fb];W[gc];B[gb];W[mc]
+;B[hc];W[hd];B[ic];W[id];B[jc];W[pb];B[qc];W[qb];B[rb];W[fh];B[bd]
+;W[be];B[bc];W[rq];B[qr];W[cf];B[kd];W[oc];B[od];W[me];B[nd];W[md]
+;B[of];W[ke];B[lc];W[pg];B[og];W[ph];B[qi];W[oh];B[mg];W[qj];B[pi]
+;W[kg];B[ni];W[nh];B[mh];W[oi];B[oj];W[pj];B[rf];W[nj];B[mi];W[ok]
+;B[go];W[fp];B[gp];W[hn];B[gq];W[hr];B[gn];W[gm];B[ho];W[lb];B[kb]
+;W[bj];B[bk];W[cj];B[ck];W[mr];B[nr];W[lr];B[gr];W[in];B[io];W[jo]
+;B[jn];W[fn];B[jp];W[ko];B[jr];W[jm];B[hm];W[kn];B[fm];W[gl];B[em]
+;W[cr];B[br];W[dm];B[el];W[eq];B[dr];W[eo];B[er];W[hl];B[fq];W[fo]
+;B[ng];W[hi];B[ji];W[ih];B[jh];W[li];B[lj];W[kj];B[lh];W[jg];B[ki]
+;W[ns];B[or];W[rr];B[os];W[kk];B[lk];W[ra];B[sb];W[ak];B[al];W[aj]
+;B[dh];W[di];B[ei];W[ci];B[fj];W[eh];B[fi];W[pc];B[rc];W[mb];B[lf]
+;W[ld];B[kf];W[kc];B[jf];W[hg];B[hf];W[if];B[ie];W[ig];B[je];W[he]
+;B[kl];W[ij];B[jj];W[jb];B[ib];W[ka];B[jk];W[ia];B[hb];W[rh];B[qg]
+;W[kr];B[jq];W[qs];B[ps];W[rs];B[qq];W[qp];B[pp];W[mo];B[no];W[mp]
+;B[mn];W[lm];B[nl];W[nq];B[op];W[ml];B[nk];W[mk];B[mj];W[oj];B[mm]
+;W[ll];B[km];W[ln];B[ol];W[om];B[pm];W[po];B[on];W[pl];B[nm];W[pn]
+;B[qm];W[rl];B[rm];W[ro];B[sl];W[ms];B[sj];W[rk];B[sk];W[jl];B[kk]
+;W[ik];B[gi];W[gh];B[fk];W[ha];B[ga];W[ja];B[ae];W[af];B[ad];W[nc]
+;B[ne];W[mf];B[lg];W[gk];B[gj];W[ks];B[js];W[hj];B[pe];W[fl];B[ek]
+;W[rn];B[sm];W[sn];B[rj];W[le];B[sh];W[ii];B[kp];W[nf];B[kh];W[oo]
+;B[si];W[qn];B[oq];W[mq];B[db];W[kq];B[ip];W[qa];B[sa];W[]
+C[final_score: B+26.5
+H14 removed
+Q14 removed
+D12 removed
+S9 removed
+H7 removed
+H3 removed
+C2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.17-ylamaki-200303262305.sgf b/regression/games/nngs/gnugo-3.3.17-ylamaki-200303262305.sgf
new file mode 100644 (file)
index 0000000..3bfc5d5
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.3.17)]WR[11k*]
+PB[ylamaki]BR[14k*]
+PC[NNGS]DT[2003-03-26]AP[gnugoclient:2.0]
+RE[W+20.5]
+AB[dd][pd][dp]
+;W[pp];B[nq];W[kp];B[pq];W[qq];B[op];W[po];B[oo];W[df];B[pn];W[rp]
+;B[qo];W[qp];B[qn];W[pr];B[oq];W[ql];B[ro];W[or];B[nr];W[rr];B[pl]
+;W[pk];B[ol];W[fq];B[ok];W[pj];B[oj];W[nc];B[pi];W[rk];B[pg];W[qi]
+;B[qh];W[kc];B[ri];W[cn];B[fc];W[cq];B[de];W[eo];B[cf];W[pb];B[qc]
+;W[dg];B[cg];W[hq];B[lp];W[kq];B[lq];W[jn];B[ko];W[jo];B[kn];W[dh]
+;B[ch];W[hc];B[nd];W[md];B[ne];W[ck];B[cj];W[bj];B[dj];W[ag];B[bi]
+;W[bk];B[ai];W[jl];B[kl];W[kk];B[lk];W[kj];B[lj];W[fk];B[fj];W[cc]
+;B[cd];W[dc];B[ec];W[eb];B[fb];W[bd];B[db];W[cb];B[ea];W[ab];B[be]
+;W[ba];B[ad];W[bc];B[fd];W[qb];B[oc];W[nb];B[ob];W[oa];B[me];W[pc]
+;B[od];W[rc];B[rd];W[sd];B[re];W[ld];B[le];W[ki];B[li];W[gj];B[fi]
+;W[fh];B[gi];W[hj];B[gh];W[kh];B[gf];W[lr];B[mr];W[km];B[ln];W[ll]
+;B[ml];W[kr];B[lm];W[lh];B[mh];W[mg];B[nh];W[kl];B[ng];W[gb];B[lg]
+;W[qd];B[qe];W[qc];B[se];W[sc];B[kg];W[dk];B[ke];W[jd];B[kd];W[je]
+;B[lc];W[mc];B[lb];W[jb];B[kb];W[jc];B[ma];W[na];B[gc];W[hb];B[hd]
+;W[id];B[he];W[jg];B[ig];W[if];B[ih];W[kf];B[lf];W[jf];B[ij];W[gl]
+;B[hk];W[ik];B[hi];W[gk];B[hl];W[jj];B[ii];W[ek];B[il];W[jk];B[jh]
+;W[ej];B[im];W[jm];B[ei];W[hf];B[hg];W[sp];B[so];W[aj];B[ip];W[jp]
+;B[hp];W[iq];B[fp];W[ep];B[dq];W[cp];B[eq];W[do];B[fo];W[fr];B[en]
+;W[os];B[ns];W[ga];B[qs];W[qr];B[ra];W[ka];B[ae];W[pa];B[ac];W[ca]
+;B[da];W[fa];B[eb];W[ls];B[in];W[io];B[ho];W[hn];B[qj];W[ms];B[ji]
+;W[ie];B[ge];W[]C[final_score: W+20.5
+N19 removed
+S19 removed
+L18 removed
+D14 removed
+A13 removed
+N13 removed
+F12 removed
+Q10 removed
+H9 removed
+S9 removed
+R8 removed
+E6 removed
+F5 removed
+H5 removed
+D4 removed
+R1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.18-agh-200304291749.sgf b/regression/games/nngs/gnugo-3.3.18-agh-200304291749.sgf
new file mode 100644 (file)
index 0000000..b78f327
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.18)]WR[11k*]
+PB[agh]BR[20k]
+PC[NNGS]DT[2003-04-29]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pp];W[dd];B[dp];W[qd];B[qq];W[cn];B[gq];W[ck];B[bp];W[oc];B[gc]
+;W[ec];B[jc];W[qj];B[mc];W[ch];B[lq];W[me];B[ke];W[pl];B[qm];W[nm]
+;B[nn];W[lg];B[hf];W[lm];B[hk];W[mn];B[no];W[eh];B[gn];W[jn];B[io]
+;W[kk];B[ji];W[li];B[ee];W[de];B[ef];W[df];B[fh];W[bo];B[co];W[do]
+;B[cp];W[bn];B[eo];W[jo];B[jp];W[fk];B[fj];W[ej];B[ei];W[gj];B[fi]
+;W[gk];B[gl];W[hj];B[ik];W[di];B[eg];W[rl];B[rm];W[sm];B[sn];W[sl]
+;B[rn];W[fb];B[gb];W[ld];B[lc];W[nd];B[kd];W[nb];B[mb];W[ap];B[aq]
+;W[ao];B[bq];W[ql];B[ek];W[fl];B[dj];W[cj];B[gm];W[el];B[dn];W[dh]
+;B[hh];W[fd];B[ge];W[fa];B[ga];W[gd];B[hd];W[fc];B[fe];W[om];B[on]
+;W[jg];B[jf];W[ig];B[if];W[lh];B[ij];W[md];B[kg];W[kh];B[kf];W[jh]
+;B[ih];W[dm];B[em];W[dl];B[fm];W[jl];B[il];W[in];B[ho];W[mo];B[mp]
+;W[kp];B[jq];W[lp];B[mq];W[kq];B[kr];W[na];B[ma];W[pm];B[pn];W[dg]
+;B[kj];W[lj];B[jk];W[kl];B[ki];W[lf];B[nc];W[ob];B[im];W[jm];B[hn]
+;W[gi];B[gh];W[hg];B[gg];W[hi];B[ii];W[dk];B[ej];W[ed];B[le];W[]
+;B[qf];W[re];B[qh];W[ri];B[rh];W[pi];B[qi];W[rj];B[ph];W[oi];B[rf]
+;W[oh];B[og];W[ng];B[of];W[sg];B[sf];W[sh];B[rg];W[pe];B[qe];W[rd]
+;B[nf];W[mf];B[oe];W[pd];B[od];W[pf];B[pg];W[se];B[nh];W[ni];B[si]
+;W[sh];B[sg];W[sj];B[mg];W[sh];B[mh];W[si];B[mi];W[mj];B[];W[]
+C[final_score: W+22.5
+P16 removed
+N13 removed])
diff --git a/regression/games/nngs/gnugo-3.3.18-joshj-200304242104.sgf b/regression/games/nngs/gnugo-3.3.18-joshj-200304242104.sgf
new file mode 100644 (file)
index 0000000..40bab63
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.18)]WR[10k*]
+PB[joshj]BR[11k*]
+PC[NNGS]DT[2003-04-24]AP[gnugoclient:2.0]
+RE[B+26.5]
+;B[qd];W[dp];B[dd];W[pp];B[nq];W[qn];B[kq];W[od];B[qg];W[qc];B[rc]
+;W[pc];B[rb];W[df];B[cf];W[cg];B[ce];W[dg];B[cl];W[jc];B[gc];W[qk]
+;B[rj];W[oq];B[nr];W[or];B[fq];W[fp];B[eq];W[ep];B[co];W[dq];B[gq]
+;W[je];B[bq];W[cj];B[el];W[qb];B[pd];W[nd];B[og];W[dr];B[cr];W[gp]
+;B[hq];W[io];B[ip];W[fm];B[ho];W[dm];B[cm];W[jo];B[hp];W[hb];B[gb]
+;W[bg];B[bf];W[ga];B[fa];W[ha];B[fb];W[rk];B[qj];W[sj];B[si];W[sk]
+;B[rh];W[ns];B[ms];W[os];B[mr];W[ej];B[dl];W[lf];B[hc];W[gf];B[ib]
+;W[jb];B[ic];W[lh];B[fk];W[dn];B[cn];W[hm];B[gn];W[gm];B[fn];W[hj]
+;B[en];W[ln];B[pk];W[pl];B[ok];W[mk];B[ol];W[bk];B[ql];W[rl];B[pm]
+;W[rm];B[qm];W[em];B[do];W[an];B[bo];W[ra];B[gj];W[gh];B[hk];W[ij]
+;B[ik];W[jl];B[jk];W[lp];B[lq];W[np];B[kp];W[mp];B[ko];W[kl];B[jj]
+;W[gi];B[ii];W[hi];B[jh];W[fj];B[gk];W[ja];B[ia];W[ee];B[ed];W[nn]
+;B[kn];W[jn];B[km];W[jm];B[lm];W[ll];B[mm];W[mj];B[pn];W[rn];B[oo]
+;W[po];B[on];W[op];B[me];W[nf];B[mh];W[li];B[mg];W[lg];B[mf];W[lc]
+;B[le];W[ke];B[ld];W[mc];B[kd];W[ni];B[oh];W[nm];B[ml];W[nl];B[nk]
+;W[jd];B[kc];W[kb];B[if];W[jg];B[ig];W[pe];B[qe];W[mn];B[fe];W[ff]
+;B[ge];W[of];B[pf];W[oe];B[hf];W[oi];B[pi];W[bl];B[ao];W[de];B[cd]
+;W[jf];B[ie];W[id];B[hd];W[hg];B[ck];W[af];B[ae];W[ag];B[dj];W[di]
+;B[dk];W[ci];B[bm];W[ih];B[he];W[ji];B[ki];W[kh];B[kj];W[lj];B[kk]
+;W[lk];B[oj];W[mq];B[lr];W[jp];B[jq];W[hn];B[go];W[ek];B[fl];W[il]
+;B[am];W[sb];B[rd];W[qa];B[sc];W[om];B[pj];W[bj];B[al];W[ak];B[no]
+;W[mo];B[pl];W[sa];B[mi];W[nj];B[ng];W[md];B[ph];W[hl];B[gl];W[nh]
+;B[ne];W[lo];B[];W[]C[final_score: B+26.5
+A6 removed
+D4 removed])
diff --git a/regression/games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf b/regression/games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf
new file mode 100644 (file)
index 0000000..7205860
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.18)]WR[11k*]
+PB[overziel7]BR[NR]
+PC[NNGS]DT[2003-04-28]AP[gnugoclient:2.0]
+;B[pd];W[dp];B[pq];W[dc];B[de];W[cg];B[ef];W[gc];B[dh];W[po];B[pl]
+;W[mp];B[oo];W[on];B[no];W[pp];B[nq];W[nn];B[ch];W[mo];B[qq];W[np]
+;B[ph];W[nc];B[qj];W[kc];B[oc];W[nd];B[iq];W[cd];B[df];W[fq];B[be]
+;W[co];B[io];W[nl];B[ko];W[qm];B[ic];W[rk];B[hd];W[ke];B[rj];W[bd]
+;B[ro];W[mq];B[oq];W[op];B[qn];W[kq];B[pm];W[dm];B[km];W[cj];B[ll]
+;W[oe];B[lj];W[pe];B[qe];W[qf];B[re];W[pg];B[hn];W[ob];B[pb];W[qh]
+;B[bf];W[pi];B[nb];W[mb];B[oa];W[oh];B[ge];W[lg];B[rl];W[jg];B[hg]
+;W[ji];B[jr];W[nr];B[or];W[mr];B[cl];W[dl];B[ck];W[dj];B[bj];W[bi]
+;B[ak];W[ci];B[dk];W[ek];B[ej];W[ei];B[fj];W[cm];B[fk];W[el];B[bl]
+;W[ai];B[di];W[aj];B[fh];W[bm];B[bh];W[bk];B[hb];W[al];B[fc];W[bb]
+;B[ok];W[kr];B[nk];W[jk];B[rg];W[jh];B[rh];W[rf];B[sf];W[ec];B[fb]
+;W[hr];B[da];W[ca];B[ab];W[ac];B[cb];W[ea];B[ba];W[aa];B[eb];W[ca]
+;B[db];W[cc];B[ba];W[ir];B[ca];W[jq];B[gp];W[hq];B[ip];W[hp];B[go]
+;W[ln];B[kn];W[hh];B[hj];W[gg];B[hf];W[gh];B[il];W[gi];B[fi];W[fl]
+;B[gl];W[fn];B[kb];W[jb];B[jc];W[lb];B[kd];W[lc];B[je];W[ld];B[ed]
+;W[jd];B[ie];W[ib];B[gb];W[gm];B[hm];W[gn];B[ho];W[mi];B[mm];W[ol]
+;B[ml];W[jf];B[gj];W[ik];B[ij];W[kk];B[mj];W[oj];B[jj];W[kj];B[li]
+;W[ki];B[ih];W[ii];B[mh];W[ni];B[lh];W[mg];B[hk];W[ig];B[pj];W[qg]
+;B[ab];W[od];B[qc];W[nh];B[aa];W[nj];B[fg];W[lk];B[mk];W[ah];B[ag]
+;W[gq];B[gf];W[ia];B[hi];W[ih];B[qp];W[qo];B[rn];W[ha];B[jl];W[ga]
+;B[ma];W[la];B[na];W[os];B[ps];W[ns];B[fp];W[ep];B[fo];W[eo];B[qi]
+;W[kh];B[jp];W[om];B[lp];W[lo];B[kp];W[lq];B[id];W[kd];B[kl];W[pn]
+;B[rm];W[if];B[ce];W[lm];B[nm];W[mn];B[fa];W[ka]C[game adjourned])
diff --git a/regression/games/nngs/gnugo-3.3.18-spewnboy-200304291635.sgf b/regression/games/nngs/gnugo-3.3.18-spewnboy-200304291635.sgf
new file mode 100644 (file)
index 0000000..fee1edd
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.3.18)]WR[11k*]
+PB[spewnboy]BR[13k*]
+PC[NNGS]DT[2003-04-29]AP[gnugoclient:2.0]
+RE[B+87.5]
+AB[dd][pd][dp]
+;W[pp];B[qn];W[pj];B[qk];W[qj];B[pk];W[ok];B[ol];W[df];B[ce];W[cn]
+;B[co];W[dn];B[gq];W[cf];B[gc];W[pf];B[qe];W[cj];B[qf];W[pg];B[mc]
+;W[nk];B[nl];W[mf];B[nq];W[np];B[pq];W[oq];B[or];W[op];B[pr];W[qp]
+;B[qq];W[on];B[pm];W[kf];B[jd];W[lp];B[lq];W[mq];B[mr];W[nr];B[ns]
+;W[lr];B[nq];W[kq];B[jr];W[mm];B[ml];W[kd];B[kc];W[mk];B[ll];W[kj]
+;B[mn];W[lm];B[ln];W[km];B[nm];W[kn];B[nn];W[hf];B[gn];W[nr];B[ms]
+;W[gk];B[ko];W[fe];B[fd];W[jl];B[jp];W[jq];B[iq];W[mo];B[lo];W[ro]
+;B[rn];W[rq];B[rr];W[sr];B[qs];W[no];B[qo];W[rs];B[ss];W[do];B[sq]
+;W[nq];B[os];W[cp];B[cq];W[rp];B[ep];W[bp];B[kr];W[bq];B[cr];W[je]
+;B[id];W[ld];B[lc];W[bf];B[be];W[ae];B[ad];W[af];B[bc];W[fm];B[fn]
+;W[br];B[ge];W[gf];B[ef];W[ee];B[de];W[ed];B[ff];W[ec];B[fc];W[eb]
+;B[eh];W[fg];B[eg];W[cb];B[ch];W[ah];B[bi];W[ai];B[bj];W[aj];B[bk]
+;W[ak];B[bm];W[al];B[am];W[dc];B[cc];W[bd];B[cd];W[bb];B[ab];W[fb]
+;B[gb];W[da];B[fa];W[ba];B[bg];W[ag];B[bl];W[aa];B[dg];W[ac];B[bo]
+;W[bd];B[bn];W[fh];B[ei];W[dl];B[dj];W[fk]C[L:8];B[dk];W[rj]C[L:9]
+;B[rk];W[rh]C[L:10];B[el];W[em];B[ek];W[gm];B[hn];W[fi];B[jn];W[jm]
+;B[hm];W[hl];B[he];W[in];B[io];W[im];B[jo];W[cl];B[ck];W[ne];B[nd]
+;W[oe];B[od];W[lk];B[dm];W[cm];B[en];W[qg];B[fj];W[gj];B[eo];W[dm]
+;B[gl];W[fl];B[kl];W[kk];B[jk];W[il];B[hk];W[ik];B[if];W[hh];B[jf]
+;W[rf];B[re];W[se];B[sd];W[sf];B[rc];W[jh];B[hg];W[gg];B[ig];W[hj]
+;B[ih];W[ii];B[ie];W[ej];B[ke];W[le];B[kg];W[lf];B[kh];W[ji];B[jg]
+;W[li];B[lh];W[mh];B[ki];W[fj];B[mi];W[lj];B[mg];W[nh];B[lg];W[ng]
+;B[sj];W[si];B[sk];W[md];B[pe];W[je];B[bh];W[ke];B[cg];W[ea];B[ga]
+;W[]C[final_score: B+87.5
+N11 removed
+C10 removed
+K9 removed
+P6 removed
+N5 removed
+B4 removed
+M4 removed
+K3 removed
+M2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.2-Programmer-200206021522.sgf b/regression/games/nngs/gnugo-3.3.2-Programmer-200206021522.sgf
new file mode 100644 (file)
index 0000000..347b793
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.2)]WR[13k*]
+PB[Programmer]BR[NR]
+PC[NNGS]DT[2002-06-02]AP[gnugoclient:2.0]
+;B[cp];W[pq];B[eq];W[qe];B[cj];W[ce];B[df];W[cf];B[cg];W[dg];B[dh]
+;W[eg];B[fg];W[ef];B[ee];W[de];B[eh];W[ff];B[gf];W[fe];B[gd];W[ed]
+;B[fd];W[ge];B[he];W[gg];B[dd];W[ec];B[hf];W[fh];B[fi];W[po];B[gh]
+;W[hg];B[fg];W[hd];B[hc];W[id];B[jd];W[ic];B[ib];W[jc];B[kc];W[jb]
+;B[ja];W[kb];B[lb];W[lc]C[L:5];B[kd];W[je]C[L:3];B[ie];W[pc]C[L:4]
+;B[ld];W[if]C[L:5];B[ka];W[mc]C[L:3
+game adjourned])
diff --git a/regression/games/nngs/gnugo-3.3.2-Zahlman-200205221717.sgf b/regression/games/nngs/gnugo-3.3.2-Zahlman-200205221717.sgf
new file mode 100644 (file)
index 0000000..d0b2464
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.3.2)]WR[13k*]
+PB[Zahlman]BR[17k*]
+PC[NNGS]DT[2002-05-22]AP[gnugoclient:2.0]
+RE[W+21.5]
+AB[dd][pd][dp]
+;W[qo];B[jd];W[gd];B[fc];W[fq];B[er];W[pq];B[dj];W[dg];B[cf];W[fg]
+;B[ch];W[gf];B[hh];W[fi];B[if];W[fk];B[el];W[nd];B[oc];W[nf];B[nh]
+;W[jq]C[L:9];B[hq];W[fo];B[en];W[mq];B[qm];W[qk];B[ol];W[qh]C[L:7]
+;B[qf];W[nc]C[L:4];B[gm];W[pl]C[L:5];B[pm];W[ek]C[L:4];B[dk];W[ij]
+C[L:5];B[hj];W[hk];B[gj];W[fr]C[L:4];B[eq];W[ho]C[L:5];B[gk];W[dh]
+C[L:3];B[cg];W[dl];B[em];W[ef];B[ei];W[lc]C[L:4];B[hc];W[eh];B[ci]
+;W[jb]C[L:5];B[di];W[cc];B[dc];W[cd];B[be];W[bd];B[cb];W[bb];B[db]
+;W[ce];B[de];W[fe];B[bf];W[ok]C[L:6];B[nm];W[fj]C[L:4];B[gh];W[gl]
+C[L:5];B[fl];W[hl]C[L:6];B[fh];W[df]C[L:7];B[he];W[ee]C[L:8];B[ge]
+;W[gg];B[hg];W[jk];B[jh];W[nb]C[L:9];B[ob];W[rg]C[L:7];B[rf];W[on]
+;B[om];W[ln]C[L:5];B[hm];W[ml];B[il];W[nn]C[L:4];B[lf];W[nl]C[L:3]
+;B[ql];W[rk]C[L:2];B[pk];W[ik];B[pj];W[oj];B[oi];W[pi]C[L:1];B[qg]
+;W[qj];B[rh];W[mj];B[nj];W[nk];B[ni];W[pl]C[L:0];B[ri];W[sm]C[L:1]
+;B[qi];W[im]C[L:2];B[ph];W[in]C[L:3];B[fn];W[es]C[L:4];B[ds];W[fs]
+C[L:5];B[cr];W[oa]C[L:6];B[pa];W[na]C[L:4];B[qb];W[fd];B[pj];W[pk]
+;B[gc];W[hd];B[id];W[le];B[ke];W[ld];B[ib];W[ja];B[ia];W[jc];B[ic]
+;W[ii];B[ih];W[mf]C[L:5];B[lg];W[gn]C[L:6];B[eo];W[fp]C[L:7];B[gp]
+;W[go]C[L:8];B[kj];W[kk]C[L:9];B[lj];W[mi]C[L:10];B[lk];W[li];B[ki]
+;W[mk];B[mg];W[ll];B[jl];W[hf];B[ie];W[hi];B[gi];W[rj];B[si];W[kd]
+;B[jj];W[kl];B[oe];W[kh];B[ji];W[lh];B[kg];W[ne];B[og];W[of];B[pf]
+;W[od];B[pe];W[ed];B[ec];W[sj];B[pi];W[ep];B[mh];W[hn];B[fm];W[do]
+;B[dq];W[dn]C[L:9];B[ej];W[bo]C[L:8];B[bm];W[bq]C[L:9];B[br];W[cq]
+C[L:10];B[dm];W[cn];B[bn];W[cp];B[dr];W[ap];B[cm];W[co];B[an];W[ar]
+;B[bs];W[ng];B[ao];W[]
+C[final_score: W+20.5
+B18 removed
+C17 removed
+S13 removed
+D8 removed
+J8 removed
+P8 removed
+G4 removed
+H3 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.2-mr23-200205120953.sgf b/regression/games/nngs/gnugo-3.3.2-mr23-200205120953.sgf
new file mode 100644 (file)
index 0000000..82c4223
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.2)]WR[13k*]
+PB[mr23]BR[14k*]
+PC[NNGS]DT[2002-05-12]AP[gnugoclient:2.0]
+RE[B+0.5]
+;B[pd];W[dp];B[pp];W[dd];B[fq];W[hq];B[cq];W[dq];B[cp];W[do];B[dr]
+;W[er];B[cr];W[eq];B[cn];W[fp];B[cf];W[qf];B[pf];W[pg];B[of];W[qe]
+;B[qd];W[qj];B[jd];W[np];B[pn];W[pq];B[qq];W[oq];B[kp];W[qr];B[rq]
+;W[fd];B[bd];W[cc];B[ci];W[rr];B[qo];W[eg];B[dg];W[em];B[dl];W[hc]
+;B[md];W[jb];B[ql];W[kr];B[og];W[ph];B[ei];W[lo];B[jo];W[bc];B[be]
+;W[lp];B[jm];W[oj];B[oh];W[lb];B[mb];W[mj];B[lh];W[li];B[mh];W[re]
+;B[rd];W[sq];B[rp];W[pl];B[qm];W[hf];B[jf];W[ef];B[fk];W[sd];B[sc]
+;W[se];B[rc];W[rg];B[rk];W[rj];B[gm];W[gh];B[fh];W[gi];B[eh];W[jk]
+;B[il];W[kk];B[ol];W[om];B[on];W[nm];B[nn];W[qk];B[rl];W[ma];B[nb]
+;W[na];B[oa];W[la];B[oc];W[kq];B[mm];W[nl];B[lm];W[ji];B[jh];W[kh]
+;B[kg];W[ih];B[ki];W[kj];B[kh];W[ij];B[hk];W[lc];B[ld];W[dn];B[cm]
+;W[ad];B[ae];W[ac];B[go];W[kc];B[kd];W[fg];B[ic];W[ib];B[hd];W[gc]
+;B[ig];W[hg];B[he];W[if];B[jg];W[ie];B[id];W[hj];B[gj];W[ko];B[jp]
+;W[ho];B[hn];W[gp];B[io];W[fo];B[gn];W[hp];B[iq];W[ir];B[el];W[co]
+;B[bo];W[kn];B[jn];W[km];B[mn];W[ll];B[ml];W[mk];B[pm];W[ok];B[mi]
+;W[lj];B[oi];W[pi];B[sp];W[sr];B[fm];W[dm];B[es];W[fr];B[ge];W[fs]
+;B[ds];W[jq];B[ip];W[de];B[df];W[fe];B[gf];W[pe];B[oe];W[je];B[ke]
+;W[gg];B[sj];W[si];B[sk];W[ni];B[nh];W[nj];B[jl];W[kl];B[fi];W[mo]
+;B[no];W[op];B[oo];W[fn];B[mc];W[ik];B[hl];W[ff];B[ce];W[cd];B[jc]
+;W[gd];B[];W[ln];B[];W[]C[final_score: B+0.5
+F3 removed])
diff --git a/regression/games/nngs/gnugo-3.3.20-GoFuN-200306071813.sgf b/regression/games/nngs/gnugo-3.3.20-GoFuN-200306071813.sgf
new file mode 100644 (file)
index 0000000..0c498b8
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.20)]WR[10k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2003-06-07]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pd];W[dp];B[pp];W[dd];B[fc];W[hc];B[cc];W[dc];B[db];W[eb];B[cb]
+;W[fb];B[be];W[fd];B[gd];W[qn];B[gc];W[gb];B[ec];W[de];B[hd];W[ic]
+;B[id];W[qf];B[cg];W[fe];B[hg];W[fg];B[dj];W[fi];B[eh];W[fh];B[ij]
+;W[fk];B[em];W[qi];B[hl];W[el];B[dm];W[nq];B[lq];W[qq];B[pq];W[oo]
+;B[qp];W[qr];B[or];W[nr];B[op];W[np];B[no];W[rq];B[po];W[on];B[pn]
+;W[pm];B[om];W[nn];B[qm];W[mo];B[pl];W[pr];B[iq];W[dk];B[cj];W[jc]
+;B[ej];W[fj];B[jd];W[hi];B[ii];W[nc];B[oe];W[qc];B[qd];W[nf];B[ne]
+;W[pc];B[of];W[mf];B[me];W[lc];B[rg];W[qg];B[rf];W[rh];B[rd];W[lf]
+;B[le];W[fp];B[ph];W[li];B[ll];W[ni];B[pi];W[co];B[bm];W[ek]C[L:8]
+;B[gn];W[bn]C[L:9];B[cn];W[bo];B[fr];W[bq]C[L:10];B[eq];W[ko];B[io]
+;W[fo];B[fn];W[ks];B[kr];W[ls];B[ms];W[oq];B[lr];W[dn];B[cm];W[eg]
+;B[dh];W[rc];B[sc];W[sb];B[sd];W[am];B[al];W[gf];B[hf];W[an];B[ed]
+;W[hj];B[ee];W[bl];B[cl];W[ak];B[bk];W[al];B[aj];W[gk];B[hk];W[gl]
+;B[fm];W[df];B[ck];W[mm];B[ml];W[jn];B[jm];W[gq];B[gr];W[in];B[ho]
+;W[km];B[jl];W[kl];B[kk];W[dr];B[hq];W[rp];B[rn];W[lm];B[im];W[er]
+;B[fq];W[gp];B[dq];W[cq];B[rb];W[ro];B[qo];W[lk];B[nl];W[jk];B[kj]
+;W[hm];B[gm];W[mk];B[lj];W[hn];B[go];W[ik];B[oc];W[mj];B[jj];W[ih]
+;B[il];W[jh];B[ki];W[kg];B[lh];W[mi];B[kh];W[jg];B[ng];W[mh];B[mg]
+;W[lg];B[ob];W[ke];B[kd];W[ld];B[je];W[kf];B[nh];W[kc];B[oi];W[ji]
+;B[nk];W[ik];B[nj];W[hh];B[jk];W[nb];B[ef];W[dg];B[ff];W[gg];B[ge]
+;W[if];B[gi];W[oa];B[pb];W[mr];B[js];W[ea];B[cf];W[jo];B[cd];W[jp]
+;B[ce];W[ns];B[ei];W[ig];B[he];W[ls];B[fl];W[pa];B[dl];W[qa];B[jf]
+;W[qb];B[gj];W[gh];B[gi];W[fe];B[od];W[ra])
diff --git a/regression/games/nngs/gnugo-3.3.21-joshj-200306270402.sgf b/regression/games/nngs/gnugo-3.3.21-joshj-200306270402.sgf
new file mode 100644 (file)
index 0000000..7a4d209
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.21)]WR[10k*]
+PB[joshj]BR[10k*]
+PC[NNGS]DT[2003-06-27]AP[gnugoclient:2.0]
+RE[B+23.5]
+;B[dp];W[pd];B[cd];W[ed];B[qp];W[cc];B[bc];W[dc];B[ce];W[ic];B[qf]
+;W[oq];B[pq];W[op];B[qn];W[fq];B[eq];W[fp];B[er];W[fr];B[dn];W[kp]
+;B[ld];W[qh];B[pg];W[cl];B[cm];W[dl];B[bm];W[bb];B[be];W[ac];B[bd]
+;W[fn];B[em];W[fk];B[fm];W[bl];B[gn];W[ip];B[go];W[hk];B[dj];W[bj]
+;B[ci];W[gh];B[ek];W[bi];B[bh];W[lb];B[qc];W[pc];B[qd];W[pe];B[qe]
+;W[lf];B[if];W[ke];B[ih];W[gd];B[jl];W[of];B[gf];W[fj];B[el];W[eh]
+;B[ef];W[jk];B[kk];W[il];B[jj];W[ik];B[jm];W[qj];B[og];W[ni];B[nh]
+;W[nf];B[oi];W[oj];B[nj];W[pi];B[mi];W[ok];B[nk];W[ol];B[on];W[nl]
+;B[ml];W[nm];B[hi];W[po];B[qo];W[no];B[pn];W[pp];B[pr];W[or];B[nn]
+;W[mn];B[mm];W[ps];B[qr];W[ln];B[hp];W[hq];B[io];W[jp];B[rk];W[ri]
+;B[rg];W[rj];B[ql];W[sj];B[sk];W[qk];B[rm];W[es];B[ds];W[fs];B[cr]
+;W[qb];B[rb];W[pb];B[jd];W[je];B[hd];W[he];B[ge];W[fe];B[ie];W[hc]
+;B[id];W[kd];B[jc];W[fc];B[kb];W[lc];B[kc];W[ff];B[dg];W[ib];B[ka]
+;W[mc];B[la];W[ma];B[fg];W[gg];B[hf];W[eg];B[df];W[ra];B[rc];W[qs]
+;B[rs];W[os];B[rr];W[gp];B[ho];W[ee];B[dh];W[ei];B[di];W[fo];B[gl]
+;W[gk];B[gi];W[ab];B[ad];W[lm];B[ll];W[rh];B[fi];W[fh];B[ej];W[qg]
+;B[pf];W[rf];B[re];W[sg];B[se];W[km];B[kl];W[kg];B[kh];W[lh];B[li]
+;W[jg];B[ig];W[jh];B[ji];W[ki];B[kj];W[sf];B[mh];W[mg];B[jf];W[kf]
+;B[pl];W[kh];B[pk];W[pj];B[ph];W[jo];B[jn];W[kn];B[ep];W[om];B[pm]
+;W[eo];B[do];W[sb];B[sc];W[qa];B[ng];W[sa];B[hh];W[oo];B[hg];W[fg]
+;B[de];W[dd];B[ia];W[ha];B[ja];W[gc];B[en];W[jb];B[];W[]
+C[final_score: B+23.5
+M16 removed
+B11 removed
+F10 removed
+B8 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.23-viking4-200307312134.sgf b/regression/games/nngs/gnugo-3.3.23-viking4-200307312134.sgf
new file mode 100644 (file)
index 0000000..8416e13
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[7]KM[0.5]
+PW[GnuGo (GNU Go 3.3.23)]WR[8k*]
+PB[viking4]BR[15k*]
+PC[NNGS]DT[2003-07-31]AP[gnugoclient:2.0]
+RE[W+13.5]
+AB[dd][pd][dj][jj][pj][dp][pp]
+;W[fq];B[dn];W[iq];B[jd];W[lq];B[nq];W[qn];B[ro];W[pg];B[nd];W[qd]
+;B[qe];W[qc];B[pe];W[pc];B[ql];W[df];B[pm];W[fc];B[fd];W[gd];B[mp]
+;W[ec];B[fe];W[cb];B[lp];W[ed];B[ee];W[de];B[bd];W[gf];B[gc];W[ge]
+;B[dh];W[bf];B[ef];W[dr];B[ce];W[cf];B[eg];W[cc];B[cd];W[dc];B[bh]
+;W[hc];B[qg];W[cq];B[og];W[kp];B[ko];W[jp];B[gh];W[in];B[ph];W[jl]
+;B[kk];W[jf];B[cp];W[kn];B[mr];W[ln];B[ke];W[ig];B[nb];W[re];B[jb]
+;W[rf];B[rg];W[lg];B[kr];W[ob];B[oa];W[pa];B[na];W[nc];B[mc];W[oc]
+;B[mb];W[bq];B[bp];W[fn];B[kl];W[el];B[cl];W[nm];B[lo];W[nn];B[hk]
+;W[gl];B[mj];W[pn];B[ol];W[mo];B[sf];W[np];B[se];W[sd];B[jo];W[io]
+;B[op];W[no];B[mq];W[jn];B[sg];W[rn];B[qf];W[rd];B[hd];W[sk];B[ic]
+;W[gb];B[jh];W[jg];B[hb];W[gc];B[qo];W[jr];B[ha];W[kq];B[kh];W[mf]
+;B[nh];W[lr];B[gk];W[ms];B[oq];W[os];B[or];W[ns];B[sn];W[sm];B[so]
+;W[ej];B[pr];W[dk];B[cj];W[ps];B[ck];W[rl];B[qr];W[ap];B[qs];W[an]
+;B[ab];W[qk];B[lh];W[pk];B[ok];W[al];B[dl];W[ek];B[ih];W[pl];B[qj]
+;W[qm];B[om];W[od];B[ne];W[bg];B[kg];W[kf];B[hl];W[ch];B[ci];W[cg]
+;B[dg];W[bi];B[ai];W[ah];B[em];W[fm];B[hg];W[hf];B[gg];W[mh];B[md]
+;W[mi];B[ei];W[hm];B[af];W[be];B[bc];W[ni];B[ae];W[aj];B[ad];W[ag]
+;B[qb];W[rb];B[nf];W[li];B[fl];W[fk];B[mg];W[lf];B[ng];W[fi];B[rj]
+;W[rk];B[il];W[gj];B[hj];W[gi];B[hi];W[fh];B[fg];W[fl];B[jm];W[mk]
+;B[ml];W[nl];B[nk];W[mm];B[ll];W[sj];B[qa];W[ra];B[bj];W[ri];B[ie]
+;W[if];B[he];W[on];B[bb];W[ba];B[je];W[oj];B[lk];W[pi];B[qh];W[qi]
+;B[nj];W[lj];B[ak];W[mk];B[ai];W[ga];B[bh];W[ca];B[le];W[bl];B[bk]
+;W[bm];B[bn];W[bo];B[cn];W[ao];B[co];W[aq];B[eo];W[eq];B[fo];W[go]
+;B[oh];W[en];B[dm];W[fp];B[ep];W[oe];B[me];W[of];B[pf];W[ki];B[lm]
+;W[ji];B[im];W[fj];B[eh];W[gn];B[ii];W[oi];B[km];W[ls];B[dq];W[am]
+;B[po];W[kj];B[aa];W[rh];B[sh];W[cm];B[ff];W[si];B[oo];W[nr];B[];W[]
+C[final_score: W+13.5
+R19 removed
+K8 removed
+L2 removed])
diff --git a/regression/games/nngs/gnugo-3.3.6-evand-200208290255.sgf b/regression/games/nngs/gnugo-3.3.6-evand-200208290255.sgf
new file mode 100644 (file)
index 0000000..a6fc789
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.3.6)]WR[13k*]
+PB[evand]BR[18k*]
+PC[NNGS]DT[2002-08-29]AP[gnugoclient:2.0]
+RE[B+22.5]
+AB[dd][pd][dp]
+;W[pp];B[gq];W[fc];B[df];W[db];B[cc];W[ic];B[ci];W[dm];B[cl];W[qf]
+;B[nd];W[rd];B[qc];W[qi];B[kc];W[cq];B[cp];W[dq];B[eq];W[er];B[fr]
+;W[ep];B[fq];W[do];B[co];W[bp];B[eo];W[ds];B[bo];W[dn];B[go];W[fm]
+;B[bq];W[br];B[ap];W[ar];B[cr];W[dr];B[jq];W[mq];B[jn];W[ql];B[hm]
+;W[en];B[fo];W[el];B[gl];W[ej];B[dk];W[gj];B[fg];W[ek];B[fi];W[fj]
+;B[hi];W[hk];B[ik];W[il];B[hl];W[ij];B[jk];W[gk];B[hj];W[dl];B[dj]
+;W[ol];B[fl];W[gi];B[gh];W[ii];B[hh];W[qp];B[jh];W[ln];B[km];W[cb]
+;B[bb];W[ml];B[ll];W[mk];B[lk];W[ni];B[li];W[rc];B[rb];W[kb];B[lb]
+;W[jb];B[jc];W[nf];B[mf];W[mg];B[lg];W[me];B[lf];W[lc];B[mc];W[ld]
+;B[mb];W[jd];B[ke];W[mh];B[kd];W[ne];B[le];W[md];B[od];W[ie];B[if]
+;W[kr];B[jr];W[kq];B[kp];W[lp];B[ko];W[lo];B[lm];W[mm];B[mj];W[nj]
+;B[lh];W[sb];B[ra];W[ba];B[ab];W[je];B[jf];W[he];B[hf];W[js];B[is]
+;W[ks];B[hr];W[ge];B[fe];W[gf];B[gg];W[ff];B[ef];W[ee];B[ed];W[fd]
+;B[de];W[mi];B[lj];W[aq];B[bp];W[qe];B[pe];W[ec];B[dc];W[ca];B[bd]
+;W[ka];B[aa];W[ea];B[la];W[ib];B[pf];W[pg];B[og];W[ng];B[ph];W[qg]
+;B[pb];W[of];B[qd];W[sc];B[sa];W[re];B[fs];W[fe];B[kn];W[oe];B[es]
+;W[cs];B[];W[]
+C[final_score: B+22.5
+P13 removed
+Q12 removed
+G11 removed
+J11 removed
+J8 removed
+F7 removed
+E4 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.6-xtc-200208301619.sgf b/regression/games/nngs/gnugo-3.3.6-xtc-200208301619.sgf
new file mode 100644 (file)
index 0000000..f762bf2
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.6)]WR[13k*]
+PB[xtc]BR[NR]
+PC[NNGS]DT[2002-08-30]AP[gnugoclient:2.0]
+RE[W+26.5]
+;B[pd];W[dp];B[pq];W[dd];B[qk];W[nc];B[pf];W[jd];B[jo];W[po];B[np]
+;W[qq];B[qr];W[qp];B[oq];W[nf];B[rn];W[rr];B[pr];W[nh];B[ph];W[qn]
+;B[ro];W[dj];B[nj];W[nn];B[mo];W[pm];B[rm];W[pk];B[rp];W[rq];B[qo]
+;W[lj];B[pp];W[pb];B[qb];W[qc];B[pc];W[rb];B[ob];W[qa];B[oc];W[ld]
+;B[nd];W[cf];B[mc];W[ec];B[cq];W[dq];B[cp];W[co];B[bo];W[cn];B[bn]
+;W[cm];B[dr];W[er];B[cr];W[fq];B[hq];W[bm];B[ar];W[jk];B[ml];W[oi]
+;B[oj];W[pj];B[pi];W[nl];B[ol];W[mm];B[pl];W[om];B[nk];W[ql];B[nm]
+;W[lm];B[qm];W[nl];B[rl];W[lc];B[mb];W[lb];B[mi];W[ji];B[mg];W[jg]
+;B[mf];W[hm];B[jm];W[re];B[kl];W[oo];B[ll];W[il];B[rf];W[qe];B[qf]
+;W[gp];B[ho];W[go];B[hn];W[gn];B[gr];W[md];B[ne];W[gh];B[jf];W[kf]
+;B[kg];W[kh];B[lg];W[if];B[je];W[ke];B[ie];W[he];B[id];W[ic];B[cc]
+;W[cd];B[bd];W[be];B[bb];W[ad];B[eb];W[db];B[fb];W[bc];B[hd];W[hc]
+;B[gd];W[gc];B[jc];W[kd];B[ig];W[jh];B[hf];W[fd];B[ge];W[hg];B[ih]
+;W[ii];B[hh];W[gg];B[fc];W[gb];B[fe];W[ed];B[hi];W[gi];B[hj];W[hl]
+;B[eg];W[dh];B[eh];W[ei];B[gk];W[sf];B[sg];W[se];B[rh];W[ma];B[nb]
+;W[an];B[ap];W[hp];B[ip];W[gq];B[ir];W[fr];B[hr];W[qd];B[pe];W[li]
+;B[mh];W[kk];B[jb];W[ib];B[ka];W[la];B[fm];W[fl];B[gl];W[gm];B[el]
+;W[dl];B[fk];W[ek];B[fj];W[ef];B[fi];W[ff];B[dg];W[ee];B[ch];W[di]
+;B[en];W[cg];B[bh];W[fh];B[do];W[ij];B[hk];W[dm];B[jl];W[ik];B[ep]
+;W[eq];B[kj];W[eo];B[fo];W[fn];B[em];W[ej];B[fl];W[gj];B[eo];W[dn]
+;B[lk];W[im];B[in];W[mj];B[lh];W[gs];B[hs];W[fs];B[mk];W[ki];B[ds]
+;W[fp];B[ck];W[cj];B[bj];W[bl];B[bk];W[dk];B[ci];W[ai];B[ag];W[bg]
+;B[ah];W[af];B[bi];W[nm];B[rs];W[pn];B[kn];W[pa];B[oa];W[me];B[ng]
+;W[lf];B[of];W[na];B[ao];W[am];B[bq];W[if];B[ig];W[ih];B[ha];W[ia]
+;B[ga];W[ea];B[];W[es];B[];W[]
+C[final_score: W+26.5
+G19 removed
+L19 removed
+B18 removed
+E18 removed
+K18 removed
+C17 removed
+G16 removed
+H14 removed
+A13 removed
+D13 removed
+J13 removed
+O12 removed
+P11 removed
+L10 removed
+Q10 removed
+O8 removed
+R4 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.8-Joorin-200209251541.sgf b/regression/games/nngs/gnugo-3.3.8-Joorin-200209251541.sgf
new file mode 100644 (file)
index 0000000..24d3c5c
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[11k*]
+PB[Joorin]BR[22k]
+PC[NNGS]DT[2002-09-25]AP[gnugoclient:2.0]
+RE[B+69.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[cn];B[co];W[bo];B[bp];W[do];B[cp];W[eo];B[fq];W[pg];B[mc];W[gd]
+;B[cg];W[mp];B[mm];W[kq];B[jq];W[ln];B[lm];W[mr];B[gm];W[em];B[el]
+;W[gf];B[gh];W[ic];B[jc];W[gn];B[jn];W[gp];B[gq];W[if];B[lf];W[ef]
+;B[cf];W[id];B[fm];W[hh];B[eh];W[hp];B[hq];W[hn];B[hm];W[ep];B[eq]
+;W[dn];B[dm];W[bn];B[cm];W[bm];B[bl];W[cl];B[en];W[bk];B[ck];W[al]
+;B[bj];W[fn];B[em];W[oq];B[pq];W[je];B[kd];W[hi];B[gi];W[hj];B[gj]
+;W[qi];B[qj];W[jh];B[mh];W[qe];B[qd];W[pi];B[oi];W[oh];B[nh];W[op]
+;B[po];W[nn];B[om];W[ng];B[ne];W[nm];B[nl];W[re];B[rd];W[ec];B[dc]
+;W[eb];B[db];W[ri];B[rj];W[hk];B[gk];W[jk];B[kj];W[aj];B[ai];W[jr]
+;B[ir];W[pr];B[qr];W[da];B[ca];W[ea];B[bb];W[sd];B[sc];W[se];B[rb]
+;W[jb];B[kb];W[ib];B[ja];W[bi];B[ak];W[bl];B[bh];W[kr];B[ed];W[fd]
+;B[ee];W[fe];B[df];W[or];B[eg];W[qs];B[rr];W[ap];B[aq];W[ao];B[br]
+;W[sj];B[sk];W[si];B[rl];W[aj];B[ci];W[ia];B[ka];W[rs];B[sr];W[ff]
+;B[gg];W[hg];B[fg];W[kf];B[ke];W[kg];B[lh];W[km];B[kl];W[jl];B[jm]
+;W[kk];B[kn];W[lo];B[lk];W[lg];B[mf];W[mg];B[ik];W[il];B[hl];W[ij]
+;B[im];W[ik];B[kp];W[lp];B[ip];W[fp];B[oo];W[io];B[jo];W[no];B[on]
+;W[kh];B[li];W[pe];B[oe];W[of];B[in];W[ho];B[ji];W[mn];B[ii];W[ih]
+;B[ak];W[ki];B[lj];W[is];B[hs];W[js];B[hr];W[dl];B[dk];W[nf];B[]
+;W[aj];B[ko];W[ak];B[];W[ps];B[];W[ss];B[];W[]C[final_score: B+69.5])
diff --git a/regression/games/nngs/gnugo-3.3.8-evand-200209090532.sgf b/regression/games/nngs/gnugo-3.3.8-evand-200209090532.sgf
new file mode 100644 (file)
index 0000000..7e20c27
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[12k*]
+PB[evand]BR[16k*]
+PC[NNGS]DT[2002-09-09]AP[gnugoclient:2.0]
+RE[B+96.5]
+AB[dd][pd][dp]
+;W[pp];B[jd];W[qf];B[dj];W[dg];B[cf];W[fp];B[dn];W[jp];B[fq];W[gq]
+;B[eq];W[gp];B[fd];W[qi];B[mp];W[pn];B[mn];W[md];B[oe];W[oi];B[ml]
+;W[nf];B[nd];W[le];B[jf];W[ne];B[of];W[oq];B[mq];W[ol];B[mj];W[kc]
+;B[jc];W[kb];B[jb];W[fg];B[fi];W[dh];B[di];W[gh];B[gi];W[bh];B[bg]
+;W[cc];B[dc];W[cb];B[db];W[fm];B[el];W[hm];B[jj];W[gr];B[fr];W[ng]
+;B[og];W[nh];B[lh];W[oc];B[pc];W[hf];B[ie];W[he];B[hd];W[ch];B[df]
+;W[bj];B[ci];W[bi];B[bk];W[ef];B[ee];W[cd];B[ce];W[be];B[bf];W[ad]
+;B[ca];W[ba];B[da];W[ab];B[af];W[ck];B[bl];W[cj];B[dk];W[cl];B[cm]
+;W[fe];B[ge];W[nc];B[eh];W[rd];B[rc];W[qd];B[ae];W[bd];B[hk];W[jm]
+;B[lf];W[kq];B[ko];W[fs];B[es];W[gs];B[ep];W[ja];B[ia];W[ka];B[hb]
+;W[ke];B[kf];W[em];B[dl];W[dm];B[cn];W[jo];B[kn];W[lr];B[mr];W[nr]
+;B[lq];W[ms];B[kp];W[kr];B[nq];W[or];B[op];W[oo];B[no];W[on];B[nn]
+;W[nm];B[nl];W[nj];B[nk];W[ok];B[mi];W[ni];B[jl];W[il];B[ik];W[kl]
+;B[jk];W[km];B[lm];W[hl];B[gl];W[fl];B[fk];W[gm];B[gk];W[kk];B[kj]
+;W[lk];B[mk];W[en];B[eo];W[fo];B[lj];W[jn];B[mm];W[om];B[mg];W[kd]
+;B[je];W[mf];B[mh];W[np];B[ll];W[op];B[];W[]
+C[final_score: W+9.5
+Q17 removed
+S17 removed
+O16 removed
+F15 removed
+H15 removed
+P15 removed
+E14 removed
+D13 removed
+F13 removed
+G12 removed
+N1 removed
+final_score: W+9.5
+Q17 removed
+S17 removed
+O16 removed
+F15 removed
+H15 removed
+P15 removed
+E14 removed
+D13 removed
+F13 removed
+G12 removed
+N1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.8-evand-200209122040.sgf b/regression/games/nngs/gnugo-3.3.8-evand-200209122040.sgf
new file mode 100644 (file)
index 0000000..2f51aa3
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[12k*]
+PB[evand]BR[15k*]
+PC[NNGS]DT[2002-09-12]AP[gnugoclient:2.0]
+RE[B+8.5]
+;B[qd];W[dp];B[pp];W[dc];B[oc];W[nq];B[pn];W[pr];B[qq];W[kq];B[qk]
+;W[de];B[dj];W[jc];B[gd];W[mc];B[nd];W[ch];B[cj];W[md];B[me];W[hq]
+;B[cn];W[dn];B[dm];W[en];B[em];W[co];B[bn];W[nn];B[nk];W[bo];B[gf]
+;W[le];B[mf];W[an];B[am];W[ao];B[bl];W[kd];B[fn];W[kg];B[lh];W[fo]
+;B[gn];W[in];B[im];W[ji];B[gh];W[li];B[mi];W[kh];B[lf];W[kf];B[ij]
+;W[qr];B[rr];W[lj];B[mj];W[io];B[jn];W[nb];B[ob];W[eh];B[ei];W[gb]
+;B[fc];W[fb];B[ih];W[jm];B[il];W[km];B[ll];W[lm];B[mm];W[mn];B[nm]
+;W[hc];B[hd];W[oa];B[pa];W[na];B[qb];W[mh];B[lg];W[ne];B[nh];W[rs]
+;B[rq];W[go];B[hn];W[bi];B[bj];W[ho];B[kl];W[nc];B[od];W[ci];B[fh]
+;W[eg];B[ff];W[ef];B[ed];W[dd];B[id];W[ec];B[ee];W[if];B[je];W[ke]
+;B[jf];W[jg];B[ig];W[ii];B[hi];W[jd];B[ie];W[gc];B[fd];W[jj];B[jk]
+;W[lk];B[mk];W[on];B[om];W[op];B[po];W[kk];B[jl];W[lo];B[oo];W[np]
+;B[no];W[mo];B[di];W[pq];B[dh];W[dg];B[ai];W[bh];B[ah];W[bg];B[ag]
+;W[af];B[aj];W[bf];B[ic];W[ib];B[jh];W[nf];B[mg];W[ng];B[mh];W[ki]
+;B[fg];W[hj];B[ik];W[sr];B[sq];W[qs];B[qp];W[ss];B[];W[]
+C[final_score: B+8.5
+O15 removed
+J14 removed
+H10 removed
+K6 removed])
diff --git a/regression/games/nngs/gnugo-3.3.8-evand-200209130704.sgf b/regression/games/nngs/gnugo-3.3.8-evand-200209130704.sgf
new file mode 100644 (file)
index 0000000..902c816
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[12k*]
+PB[evand]BR[15k*]
+PC[NNGS]DT[2002-09-13]AP[gnugoclient:2.0]
+RE[W+39.5]
+;B[pd];W[dp];B[qp];W[dd];B[oq];W[qj];B[qf];W[nc];B[dj];W[pb];B[qc]
+;W[kc];B[gc];W[ec];B[ic];W[ch];B[ci];W[dh];B[cn];W[fp];B[bp];W[cq]
+;B[em];W[qm];B[jp];W[bq];B[co];W[mq];B[hq];W[mo];B[kn];W[fq];B[gr]
+;W[eo];B[fi];W[qb];B[rb];W[gn];B[gm];W[hm];B[gl];W[bh];B[bi];W[nq]
+;B[or];W[ro];B[rp];W[sp];B[sq];W[so];B[rr];W[fr];B[gs];W[ai];B[aj]
+;W[ah];B[bk];W[ho];B[kk];W[fg];B[hg];W[gh];B[hh];W[ik];B[ij];W[ke]
+;B[kg];W[qh];B[oh];W[oj];B[ni];W[pg];B[of];W[og];B[ng];W[fs];B[hp]
+;W[mm];B[mk];W[jo];B[ko];W[kp];B[kq];W[lp];B[io];W[jq];B[ip];W[jn]
+;B[km];W[in];B[kr];W[hk];B[hj];W[rg];B[rf];W[gp];B[gk];W[ne];B[mf]
+;W[sf];B[se];W[sg];B[pf];W[qg];B[nl];W[re];B[sd];W[rd];B[sc];W[rc]
+;B[qd];W[sb];B[nf];W[pn];B[nm];W[nn];B[pl];W[ql];B[pk];W[oi];B[pj]
+;W[ph];B[nh];W[qk];B[pi];W[ap];B[ao];W[aq];B[fn];W[fe];B[ge];W[fd]
+;B[gd];W[fb];B[gb];W[ga];B[ha];W[fa];B[jb];W[kb];B[ka];W[la];B[ja]
+;W[lb];B[je];W[jd];B[id];W[jf];B[ie];W[kf];B[jg];W[jc];B[ib];W[op]
+;B[pp];W[po];B[qo];W[om];B[ol];W[sm];B[rn];W[sn];B[rm];W[sl];B[rl]
+;W[sk];B[rk];W[sj];B[rj];W[si];B[ri];W[sh];B[qi];W[pm];B[rh];W[se]
+;B[qn];W[no];B[nr];W[mr];B[ms];W[ls];B[ns];W[jr];B[js];W[is];B[ir]
+;W[ks];B[iq];W[js];B[hs];W[lr];B[jm];W[im];B[fo];W[go];B[me];W[jl]
+;B[kl];W[md];B[le];W[gi];B[gj];W[ei];B[ej];W[fh];B[fj];W[jk];B[jj]
+;W[hl];B[di];W[ld];B[if];W[gf];B[hf];W[cp];B[bo];W[en];B[fm];W[qe]
+;B[pe];W[eh];B[gg];W[ff];B[fc];W[eb];B[od];W[nd];B[oc];W[ob];B[lf]
+;W[kd];B[dn];W[do];B[ml];W[lm];B[ll];W[ln];B[lo];W[mn];B[oe];W[hi]
+;B[ii];W[pc];B[];W[]
+C[final_score: W+39.5
+S18 removed
+P11 removed
+J5 removed
+L3 removed
+G2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.8-evand-200209170730.sgf b/regression/games/nngs/gnugo-3.3.8-evand-200209170730.sgf
new file mode 100644 (file)
index 0000000..0187acd
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[12k*]
+PB[evand]BR[14k*]
+PC[NNGS]DT[2002-09-17]AP[gnugoclient:2.0]
+RE[B+29.5]
+;B[qd];W[dd];B[pp];W[dp];B[jc];W[od];B[pc];W[md];B[je];W[nq];B[qj]
+;W[kq];B[oj];W[of];B[qf];W[nn];B[pn];W[dj];B[dg];W[fd];B[fg];W[hq]
+;B[em];W[fl];B[fm];W[ho];B[gm];W[oh];B[mj];W[ce];B[cg];W[pr];B[qq]
+;W[im];B[hl];W[cm];B[dl];W[ek];B[ck];W[gj];B[ij];W[do];B[cj];W[mh]
+;B[lf];W[kh];B[ih];W[ke];B[kf];W[qh];B[ri];W[oc];B[ob];W[nb];B[pb]
+;W[mf];B[me];W[le];B[ne];W[oe];B[kd];W[ld];B[lc];W[rh];B[fo];W[fp]
+;B[bl];W[bm];B[go];W[mc];B[lb];W[lg];B[kg];W[hc];B[ic];W[qr];B[rr]
+;W[ll];B[np];W[mp];B[no];W[mm];B[jl];W[mo];B[jm];W[cl];B[al];W[am]
+;B[bk];W[dk];B[dm];W[dn];B[ge];W[hb];B[ib];W[oo];B[op];W[on];B[pm]
+;W[hn];B[jn];W[il];B[ik];W[hk];B[gk];W[bf];B[bg];W[jg];B[jf];W[jh]
+;B[ig];W[jk];B[kk];W[jj];B[kj];W[hj];B[ji];W[di];B[ci];W[gh];B[gg]
+;W[gl];B[in];W[hm];B[jp];W[jq];B[ip];W[hp];B[iq];W[ir];B[kp];W[lq]
+;B[lp];W[rs];B[sr];W[ia];B[ja];W[ha];B[hd];W[gd];B[fe];W[fb];B[ed]
+;W[ec];B[ee];W[rf];B[re];W[qg];B[sf];W[rg];B[pf];W[pe];B[qe];W[pg]
+;B[pi];W[eh];B[fh];W[fi];B[eg];W[dh];B[ch];W[hh];B[hg];W[po];B[qo]
+;W[nk];B[nj];W[qi];B[rj];W[pq];B[rp];W[oq];B[qp];W[cf];B[de];W[bd]
+;B[dc];W[cd];B[eb];W[fc];B[cb];W[bb];B[fa];W[ea];B[da];W[id];B[he]
+;W[cc];B[db];W[gb];B[mb];W[nd];B[ki];W[ba];B[hi];W[na];B[ma];W[lh]
+;B[gi];W[fj];B[li];W[io];B[jo];W[oa];B[pa];W[nc];B[ln];W[lo];B[ko]
+;W[mn];B[lm];W[km];B[kn];W[kl];B[jk];W[mk];B[lk];W[ml];B[ol];W[ok]
+;B[pk];W[ag];B[ah];W[af];B[ni];W[nf];B[nh];W[df];B[ng];W[og];B[rc]
+;W[ef];B[ff];W[om];B[pl];W[nl];B[ss];W[qs];B[so];W[]
+C[final_score: B+29.5
+D19 removed
+F19 removed
+O19 removed
+J16 removed
+K13 removed
+G9 removed
+D8 removed
+F5 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.8-nailer-200209190045.sgf b/regression/games/nngs/gnugo-3.3.8-nailer-200209190045.sgf
new file mode 100644 (file)
index 0000000..14e6d6c
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[12k*]
+PB[nailer]BR[12k*]
+PC[NNGS]DT[2002-09-19]AP[gnugoclient:2.0]
+RE[B+95.5]
+;B[pd];W[dp];B[pq];W[dd];B[pn];W[nc];B[pg];W[kc];B[nd];W[md];B[ne]
+;W[lf];B[oc];W[nb];B[fq];W[fp];B[eq];W[ep];B[cr];W[gp];B[dq];W[gq]
+;B[cp];W[kp];B[co];W[mp];B[dl];W[cj];B[ch];W[ej];B[ce];W[cd];B[di]
+;W[be];B[dj];W[ck];B[cf];W[dk];B[ek];W[el];B[fk];W[fe];B[cl];W[hc]
+;B[fi];W[mj];B[pj];W[fl];B[gk];W[hm];B[gl];W[dm];B[cm];W[ok];B[pk]
+;W[ml];B[mn];W[hg];B[mq];W[lq];B[nq];W[gm];B[em];W[ln];B[mo];W[lo]
+;B[np];W[jj];B[lm];W[mm];B[km];W[lp];B[il];W[jn];B[jm];W[fm];B[hl]
+;W[dn];B[cn];W[ob];B[pb];W[mr];B[nr];W[lr];B[lh];W[ki];B[kh];W[jh]
+;B[kg];W[mg];B[mh];W[nh];B[ni];W[mi];B[ng];W[oh];B[oi];W[ph];B[og]
+;W[qh];B[qg];W[rh];B[rg];W[ri];B[rj];W[jg];B[kf];W[om];B[pm];W[nn]
+;B[no];W[jf];B[mf];W[ke];B[je];W[le];B[lg];W[bf];B[bg];W[fr];B[er]
+;W[gr];B[ie];W[on];B[oo];W[pl];B[ql];W[ol];B[qk];W[pa];B[qa];W[oa]
+;B[qc];W[ns];B[os];W[ms];B[pr];W[do];B[bc];W[bd];B[db];W[fb];B[ec]
+;W[ba];B[bb];W[ee];B[fc];W[hb];B[gd];W[he];B[hd];W[ge];B[eb];W[id]
+;B[gb];W[ic];B[ca];W[gc];B[fa];W[dg];B[cg];W[eh];B[ei];W[ha];B[ga]
+;W[gh];B[fh];W[df];B[eg];W[dh];B[de];W[ed];B[ef];W[fd];B[cc];W[oj]
+;B[pi];W[li];B[mg];W[nj];B[lk];W[kk];B[kl];W[ll];B[jk];W[kj];B[ij]
+;W[ii];B[in];W[im];B[io];W[kn];B[jl];W[hj];B[iq];W[gj];B[fj];W[gi]
+;B[jr];W[jo];B[jp];W[hp];B[ip];W[es];B[ds];W[ac];B[ab];W[hr];B[kr]
+;W[ir];B[jq];W[fs];B[ks];W[ff];B[fg];W[ik];B[hk];W[ad];B[dc];W[af]
+;B[ag];W[hn];B[ls];W[ho];B[kq];W[hq];B[ko];W[gg];B[mc];W[mb];B[ld]
+;W[lc];B[me];W[kd];B[is];W[hs];B[js];W[ij];B[];W[]
+C[final_score: B+95.5
+B19 removed
+J15 removed
+O12 removed
+C10 removed
+M9 removed
+E7 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.8-viking4-200209250907.sgf b/regression/games/nngs/gnugo-3.3.8-viking4-200209250907.sgf
new file mode 100644 (file)
index 0000000..c13c785
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.5]
+PW[GnuGo (GNU Go 3.3.8)]WR[11k*]
+PB[viking4]BR[17k*]
+PC[NNGS]DT[2002-09-25]AP[gnugoclient:2.0]
+RE[B+49.5]
+AB[dd][pd][jj][dp][pp]
+;W[cn];B[fp];W[ci];B[pj];W[bp];B[jd];W[pg];B[nc];W[pm];B[cq];W[dl]
+;B[mq];W[cf];B[fd];W[ng];B[nj];W[lg];B[cd];W[md];B[eg];W[jg];B[fn]
+;W[ik];B[iq];W[kk];B[kj];W[hg];B[lk];W[jk];B[qn];W[km];B[qi];W[ko]
+;B[hi];W[ie];B[nn];W[ic];B[mc];W[id];B[qc];W[kc];B[kq];W[ll];B[mk]
+;W[fb];B[gk];W[io];B[fj];W[qq];B[pq];W[rr];B[rg];W[qp];B[qo];W[pr]
+;B[qm];W[gh];B[or];W[qs];B[be];W[eh];B[bq];W[fg];B[ef];W[ej];B[hn]
+;W[bf];B[hl];W[il];B[fl];W[ho];B[go];W[hp];B[hq];W[rp];B[db];W[oe]
+;B[in];W[ld];B[oq];W[lb];B[pl];W[co];B[ck];W[ek];B[fk];W[qf];B[gi]
+;W[rf];B[od];W[rh];B[mb];W[ri];B[ne];W[nd];B[rj];W[dg];B[qh];W[qg]
+;B[ro];W[ee];B[ff];W[fe];B[df];W[de];B[ge];W[gd];B[pe];W[of];B[cl]
+;W[dm];B[af];W[ed];B[gf];W[ce];B[bd];W[ag];B[ae];W[bg];B[bj];W[lc]
+;B[bm];W[bi];B[li];W[aq];B[ar];W[ap];B[br];W[ma];B[ob];W[na];B[nb]
+;W[oa];B[pa];W[la];B[pb];W[rd];B[rc];W[sc];B[bn];W[bo];B[sb];W[sd]
+;B[rb];W[eb];B[ea];W[fa];B[da];W[dc];B[cc];W[ec];B[cb];W[kp];B[oh]
+;W[os];B[ph];W[ms];B[po];W[ks];B[ii];W[is];B[gr];W[fi];B[ke];W[og]
+;B[ir];W[hs];B[gs];W[nh];B[ni];W[mh];B[al];W[an];B[aj];W[bk];B[me]
+;W[le];B[mf];W[en];B[em];W[eo];B[ig];W[ih];B[hb];W[hh];B[hd];W[ep]
+;B[eq];W[jh];B[hc];W[ib];B[el];W[si];B[dk];W[do];B[ia];W[dj];B[cj]
+;W[cm];B[di];W[ei];B[fo];W[bl];B[ak];W[sj];B[gc];W[rk];B[am];W[ai]
+;B[ao];W[ch];B[cp];W[an];B[qj];W[bl];B[ao];W[qk];B[dn];W[pk];B[ok]
+;W[ol];B[ql];W[rl];B[if];W[rm];B[hr];W[js];B[qe];W[re];B[lr];W[jn]
+;B[gp];W[ln];B[ml];W[ls];B[mm];W[jp];B[mo];W[im];B[ip];W[jo];B[lm]
+;W[hm];B[gn];W[kh];B[kl];W[jr];B[jq];W[mi];B[kr];W[mj];B[mr];W[ns]
+;B[nr];W[ps];B[lh];W[ki];B[lj];W[sp];B[so];W[rn];B[sn];W[sk];B[sm]
+;W[qd];B[he];W[ji];B[je];W[jc];B[pf];W[sg];B[sl];W[]
+C[final_score: B+49.5
+J19 removed
+H18 removed
+F16 removed
+K16 removed
+N15 removed
+J14 removed
+D11 removed
+J9 removed
+B8 removed
+P8 removed
+L7 removed
+Q7 removed
+K6 removed
+M6 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.9-Ayoye-200209301535.sgf b/regression/games/nngs/gnugo-3.3.9-Ayoye-200209301535.sgf
new file mode 100644 (file)
index 0000000..223d7e5
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[13]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.9)]WR[11k*]
+PB[Ayoye]BR[11k]
+PC[NNGS]DT[2002-09-30]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[cd];W[jj];B[jd];W[cj];B[ej];W[ek];B[dj];W[dk];B[ci];W[ck];B[fj]
+;W[gk];B[bi];W[hc];B[fc];W[he];B[jf];W[hg];B[ic];W[hb];B[ib];W[ge]
+;B[gj];W[fk];B[ii];W[ee];B[dd];W[fh];B[gh];W[hk];B[hj];W[ik];B[kk]
+;W[kj];B[lk];W[lj];B[jk];W[jl];B[kl];W[im];B[lm];W[ml];B[ij];W[kg]
+;B[kh];W[jh];B[ih];W[ji];B[lh];W[lg];B[mi];W[jg];B[ig];W[if];B[kf]
+;W[lf];B[le];W[mk];B[ie];W[hf];B[dg];W[gd];B[gc];W[gb];B[fb];W[me]
+;B[mj];W[ld];B[ke];W[kd];B[je];W[jc];B[id];W[kb];B[ha];W[ia];B[ja]
+;W[ga];B[hd];W[ia];B[jm];W[jb];B[il];W[li];B[hm];W[fa];B[db];W[bj]
+;B[aj];W[ak];B[fm];W[ai];B[bh];W[bl];B[dm];W[cm];B[dl];W[ah];B[ag]
+;W[aj];B[cl];W[bm];B[em];W[eh];B[dh];W[bg];B[cg];W[bf])
diff --git a/regression/games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf b/regression/games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf
new file mode 100644 (file)
index 0000000..cd29b9a
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.3.9)]WR[11k*]
+PB[RikiTiki]BR[15k*]
+PC[NNGS]DT[2002-10-17]AP[gnugoclient:2.0]
+RE[W+15.5]
+;B[po];W[dd];B[cp];W[ep];B[dn];W[cq];B[di];W[bp];B[bo];W[co];B[do]
+;W[dp];B[cn];W[pd];B[qf];W[pq];B[qp];W[nd];B[id];W[of];B[ph];W[qq]
+;B[pl];W[cg];B[ch];W[dg];B[fc];W[kc];B[dc];W[cc];B[db];W[re];B[rf]
+;W[qe];B[jc];W[kd];B[if];W[ed];B[fd];W[nq];B[np];W[jp];B[gn];W[lp]
+;B[nn];W[mq];B[gp];W[cl];B[bn];W[bk];B[bh];W[bi];B[cj];W[fg];B[fi]
+;W[cb];B[eb];W[km];B[ml];W[oh];B[oj];W[rq];B[rp];W[gl];B[el];W[bg]
+;B[ah];W[ag];B[il];W[hm];B[io];W[im];B[ko];W[jl];B[ik];W[jo];B[lo]
+;W[iq];B[gr];W[sf];B[sg];W[se];B[rg];W[fm];B[em];W[fn];B[fo];W[ho]
+;B[eo];W[kb];B[jb];W[sp];B[so];W[sq];B[ro];W[ja];B[ia];W[ka];B[ib]
+;W[hr];B[gm];W[go];B[hp];W[hn];B[fp];W[kf];B[kh];W[jg];B[ih];W[ig]
+;B[hg];W[gh];B[gg];W[gi];B[fh];W[eh];B[ei];W[fj];B[ej];W[gj];B[kk]
+;W[ff];B[ni];W[hf];B[he];W[gf];B[hh];W[ij];B[kg];W[jf];B[jh];W[ie]
+;B[ge];W[jk];B[jj];W[kj];B[ji];W[lk];B[lj];W[pi];B[pg];W[ii];B[hj]
+;W[hi];B[ki];W[kl];B[mk];W[jd];B[hc];W[lg];B[lh];W[mg];B[og];W[nh]
+;B[mh];W[ng];B[oi];W[kj];B[mi];W[fk];B[ek];W[gq];B[fq];W[br];B[aq]
+;W[ap];B[dr];W[cr];B[ar];W[er];B[eq];W[dq];B[es];W[ds];B[fs];W[da]
+;B[ea];W[ca];B[cs];W[dr];B[pf];W[nf];B[pe];W[qc];B[oe];W[fr];B[hq]
+;W[od];B[ne];W[me];B[ir];W[gs];B[hs];W[ip];B[kr];W[dh];B[ci];W[lr]
+;B[kp];W[kn];B[ln];W[op];B[oo];W[mp];B[mo];W[jr];B[js];W[jq];B[ll]
+;W[kq];B[fs];W[kk];B[pp];W[ks];B[is];W[no];B[lf];W[mf];B[np];W[oq]
+;B[gs];W[ec];B[fe];W[fb];B[gb];W[fa];B[ga];W[ee];B[ao];W[cp];B[bs]
+;W[as];B[bs];W[cs];B[es];W[as];B[le];W[bq];B[md];W[mc];B[ke];W[ld]
+;B[je];W[if];B[nc];W[me];B[mf];W[lm];B[mm];W[no];B[mn];W[md];B[fl]
+;W[hk];B[en];W[np];B[];W[]
+C[final_score: W+15.5
+O17 removed
+B11 removed
+Q11 removed
+B9 removed
+J9 removed
+C8 removed
+J5 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.9-joshj-200210181607.sgf b/regression/games/nngs/gnugo-3.3.9-joshj-200210181607.sgf
new file mode 100644 (file)
index 0000000..2b4b643
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.9)]WR[11k*]
+PB[joshj]BR[11k*]
+PC[NNGS]DT[2002-10-18]AP[gnugoclient:2.0]
+RE[B+39.5]
+;B[cp];W[dd];B[pd];W[pp];B[qq];W[qp];B[pq];W[oq];B[or];W[nq];B[nr]
+;W[mq];B[mr];W[eq];B[gq];W[eo];B[cn];W[em];B[dl];W[nd];B[qf];W[pl]
+;B[lq];W[lp];B[kq];W[kc];B[fd];W[df];B[ch];W[hc];B[gc];W[hd];B[ff]
+;W[cf];B[eh];W[ec];B[gb];W[hf];B[qi];W[oc];B[pc];W[oo];B[kp];W[lo]
+;B[ko];W[el];B[dk];W[er];B[cr];W[hn];B[ln];W[fj];B[fi];W[mn];B[jn]
+;W[fb];B[gj];W[ho];B[hp];W[gl];B[gk];W[fk];B[fp];W[ep];B[fo];W[dm]
+;B[cm];W[fn];B[dn];W[en];B[ek];W[ej];B[dj];W[io];B[jp];W[hb];B[fa]
+;W[ea];B[ga];W[fe];B[ee];W[ge];B[ed];W[ef];B[dc];W[db];B[cc];W[cb]
+;B[bc];W[bb];B[de];W[cd];B[ce];W[bf];B[bd];W[fg];B[gh];W[ab];B[da]
+;W[eb];B[ca];W[ob];B[ba];W[aa];B[ca];W[pb];B[qc];W[gd];B[fc];W[nf]
+;B[ni];W[qk];B[rj];W[rk];B[ei];W[fl];B[rp];W[ro];B[rq];W[ha];B[nl]
+;W[lm];B[kn];W[ml];B[ol];W[ok];B[nk];W[lh];B[oj];W[nm];B[om];W[qn]
+;B[pm];W[jh];B[hl];W[im];B[hm];W[gm];B[il];W[hk];B[jm];W[qm];B[pk]
+;W[ik];B[in];W[go];B[ip];W[gr];B[hr];W[fq];B[gp];W[gs];B[hs];W[jj]
+;B[nn];W[kl];B[mo];W[mm];B[mp];W[ql];B[ig];W[hh];B[gg];W[hg];B[gf]
+;W[qb];B[rc];W[jl];B[im];W[pg];B[qg];W[qj];B[ri];W[pj];B[pi];W[pn]
+;B[on];W[no];B[np];W[op];B[oe];W[ne];B[og];W[rb];B[of];W[be];B[ac]
+;W[bh];B[bi];W[ae];B[da];W[cg];B[ah];W[ag];B[bg];W[cd];B[ba];W[bh]
+;B[ai];W[eg];B[dh];W[dr];B[cq];W[cs];B[bs];W[ds];B[ar];W[sc];B[sd]
+;W[sb];B[re];W[hj];B[gi];W[ng];B[lk];W[mk];B[mj];W[lj];B[li];W[kj]
+;B[ki];W[kh];B[ji];W[ii];B[mi];W[nh];B[oh];W[mh];B[km];W[ll];B[hi]
+;W[ih];B[so];W[sn];B[sp];W[ok];B[sm];W[nj];B[oi];W[rn];B[sk];W[nk]
+;B[sl];W[do];B[co];W[od];B[pe];W[rm];B[sj];W[dq];B[dp];W[rl];B[jo]
+;W[gn];B[];W[]
+C[final_score: B+39.5
+C16 removed
+A15 removed
+A13 removed
+J13 removed
+Q13 removed
+B12 removed
+M9 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.9-nailer-200210192227.sgf b/regression/games/nngs/gnugo-3.3.9-nailer-200210192227.sgf
new file mode 100644 (file)
index 0000000..6e61768
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.9)]WR[11k*]
+PB[nailer]BR[11k*]
+PC[NNGS]DT[2002-10-19]AP[gnugoclient:2.0]
+RE[B+48.5]
+;B[pd];W[dp];B[pq];W[dc];B[qn];W[ce];B[fq];W[nd];B[pg];W[jc];B[lc]
+;W[ld];B[kd];W[dn];B[ip];W[ck];B[mp];W[mc];B[kc];W[id];B[le];W[if]
+;B[md];W[nb];B[oc];W[me];B[nc];W[mb];B[ld];W[nf];B[mf];W[mg];B[ne]
+;W[mi];B[lg];W[nk];B[ng];W[oi];B[pi];W[er];B[cq];W[dq];B[cp];W[bo]
+;B[co];W[cn];B[do];W[eo];B[ep];W[cr];B[eq];W[dr];B[fr];W[fo];B[ch]
+;W[hg];B[bj];W[pj];B[qi];W[fh];B[bk];W[eg];B[bf];W[be];B[cf];W[kh]
+;B[lh];W[li];B[ki];W[kj];B[ji];W[jg];B[jj];W[kk];B[jk];W[kl];B[jl]
+;W[nm];B[km];W[jm];B[kn];W[pl];B[im];W[jb];B[kb];W[gp];B[gq];W[hq]
+;B[hr];W[ir];B[iq];W[df];B[dg];W[af];B[bg];W[ek];B[eh];W[ef];B[gk]
+;W[ag];B[ah];W[rm];B[ql];W[qm];B[qk];W[qj];B[rj];W[rn];B[qo];W[ro]
+;B[qp];W[pk];B[rk];W[rp];B[rq];W[sq];B[rr];W[ae];B[fi];W[gh];B[gi]
+;W[ei];B[dh];W[fj];B[di];W[ej];B[gj];W[hi];B[hj];W[fl];B[fk];W[el]
+;B[gl];W[bl];B[cj];W[cl];B[al];W[am];B[ak];W[nh];B[mh];W[oh];B[og]
+;W[ii];B[jh];W[kg];B[ih];W[hh];B[ig];W[kf];B[je];W[lf];B[mg];W[jf]
+;B[ie];W[he];B[hd];W[hc];B[gd];W[gc];B[fd];W[fc];B[ed];W[db];B[de]
+;W[dd];B[ee];W[gf];B[ge];W[hf];B[ff];W[fg];B[ke];W[ec];B[hp];W[go]
+;B[ho];W[gn];B[hn];W[sr];B[ss];W[sp];B[rs];W[gm];B[hm];W[ij];B[ik]
+;W[fe];B[il];W[on];B[oo];W[no];B[np];W[po];B[op];W[mo];B[lo];W[pn]
+;B[mn];W[nn];B[ll];W[lk];B[mk];W[lj];B[mj];W[ni];B[mm];W[nj];B[nl]
+;W[ml];B[mk];W[ol];B[ml];W[pp];B[qq];W[rl];B[ri];W[ph];B[qh];W[sk]
+;B[sj];W[sl];B[qf];W[ja];B[ka];W[es];B[fs];W[dj];B[bh];W[jd];B[od]
+;W[mj];B[jr];W[fp];B[bq];W[br];B[aq];W[];B[ar];W[bp];B[bn];W[bm]
+;B[bs];W[ao];B[cs];W[an];B[ds];W[ap];B[];W[]
+C[final_score: B+48.5
+N18 removed
+O14 removed
+K7 removed
+J2 removed])
diff --git a/regression/games/nngs/gnugo-3.3.9-nailer-200210192319.sgf b/regression/games/nngs/gnugo-3.3.9-nailer-200210192319.sgf
new file mode 100644 (file)
index 0000000..2503291
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.9)]WR[11k*]
+PB[nailer]BR[11k*]
+PC[NNGS]DT[2002-10-19]AP[gnugoclient:2.0]
+RE[B+34.5]
+;B[pd];W[cp];B[pq];W[dc];B[qn];W[ep];B[ce];W[ed];B[ef];W[nd];B[dj]
+;W[gd];B[pg];W[cl];B[dl];W[dm];B[ck];W[el];B[dk];W[bl];B[bk];W[ak]
+;B[aj];W[hq];B[kq];W[al];B[bi];W[em];B[jd];W[ko];B[mp];W[cd];B[bd]
+;W[bc];B[be];W[lm];B[de];W[nm];B[pl];W[nj];B[hl];W[pj];B[ek];W[kl]
+;B[hc];W[ol];B[pk];W[pi];B[om];W[ok];B[on];W[oc];B[pc];W[jr];B[ob]
+;W[nb];B[od];W[nc];B[pb];W[kc];B[fc];W[fd];B[gc];W[gf];B[fl];W[gh]
+;B[ho];W[kr];B[lr];W[ls];B[mr];W[ib];B[ic];W[jb];B[ec];W[eb];B[dd]
+;W[cc];B[fb];W[da];B[ac];W[ab];B[bb];W[ad];B[cb];W[ca];B[ae];W[ba]
+;B[ac];W[db];B[bb];W[cb];B[hd];W[fi];B[ge];W[fe];B[he];W[ff];B[hf]
+;W[ih];B[gg];W[fg];B[hg];W[fk];B[fj];W[eh];B[cg];W[ii];B[hi];W[hh]
+;B[hj];W[ng];B[kg];W[jf];B[je];W[kf];B[ig];W[jg];B[hb];W[ga];B[ke]
+;W[ha];B[lf];W[lg];B[mg];W[le];B[lh];W[kh];B[ld];W[me];B[md];W[ne]
+;B[gb];W[fa];B[jc];W[li];B[ia];W[kb];B[ea];W[og];B[lb];W[lc];B[mb]
+;W[mc];B[na];W[kd];B[mf];W[fa];B[nh];W[lg];B[ka];W[gk];B[ja];W[gn]
+;B[gl];W[gj];B[ij];W[oh];B[ji];W[gi];B[hn];W[hp];B[jo];W[jp];B[kn]
+;W[ln];B[kp];W[lo];B[go];W[hk];B[fn];W[jn];B[eo];W[cm];B[fp];W[eq]
+;B[in];W[io];B[jm];W[fq];B[jl];W[gm];B[fm];W[ik];B[jk];W[km];B[jj]
+;W[jh];B[il];W[hm];B[kg];W[ph];B[of];W[nf];B[pf];W[qg];B[qf];W[rg]
+;B[rf];W[ms];B[ns];W[ks];B[nr];W[lp];B[lq];W[sf];B[se];W[sg];B[re]
+;W[rj];B[rl];W[jq];B[do];W[co];B[dp];W[dq];B[cq];W[bq];B[cr];W[dr]
+;B[cn];W[bn];B[bp];W[dn];B[bo];W[ao];B[cn];W[cs];B[br];W[rk];B[qk]
+;W[sl];B[rm];W[bs];B[aq];W[gp];B[fo];W[ma];B[la];W[ej];B[di];W[ei]
+;B[dh];W[eg];B[dg];W[ee];B[df];W[sm];B[sn];W[sk];B[qj];W[ri];B[qi]
+;W[qh];B[nn];W[mn];B[mo];W[ga];B[ha];W[ea];B[oa];W[kk];B[kj];W[lj]
+;B[ap];W[if];B[ie];W[oe];B[pe];W[ad];B[ar];W[ac];B[as];W[ds];B[co]
+;W[ki];B[no];W[]
+C[final_score: B+34.5
+M14 removed
+L13 removed
+M12 removed
+O12 removed
+A9 removed
+G7 removed
+B6 removed
+A5 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.3.9-pogonyshev-200210142137.sgf b/regression/games/nngs/gnugo-3.3.9-pogonyshev-200210142137.sgf
new file mode 100644 (file)
index 0000000..4706fa7
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.3.9)]WR[11k*]
+PB[pogonyshev]BR[11k*]
+PC[NNGS]DT[2002-10-14]AP[gnugoclient:2.0]
+RE[B+40.5]
+;B[cf];W[gd];B[dc];W[fg];B[fc];W[gc];B[eg];W[eh];B[dg];W[fd];B[ed]
+;W[fb];B[eb];W[ec];B[ff];W[fh];B[ee];W[gf];B[dh];W[db];B[ea];W[cc]
+;B[fc];W[dd];B[ec];W[bd];B[cb];W[bb];B[da];W[bf];B[ce];W[be];B[cd]
+;W[bc];B[bg];W[ba];B[gb];W[hb];B[fa];W[ag];B[ah];W[af];B[bh];W[fe]
+;B[ha];W[ib];B[ef];W[ca];B[ei];W[gg];B[fi];W[gi];B[di];W[db];B[hh]
+;W[hg];B[gh];W[ih];B[hi];W[cb];B[he];W[ge];B[hd];W[hc];B[id];W[]
+C[final_score: B+40.5
+H8 removed
+D6 removed
+J2 removed])
diff --git a/regression/games/nngs/gnugo-3.4-nailer-200308230714.sgf b/regression/games/nngs/gnugo-3.4-nailer-200308230714.sgf
new file mode 100644 (file)
index 0000000..1e61e33
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.4)]WR[8k*]
+PB[nailer]BR[9k*]
+PC[NNGS]DT[2003-08-23]AP[gnugoclient:2.0]
+RE[B+35.5]
+;B[pd];W[dc];B[pq];W[dq];B[co];W[fp];B[dj];W[qo];B[po];W[pn];B[qp]
+;W[oo];B[pp];W[qn];B[on];W[om];B[nn];W[nc];B[oc];W[nd];B[qf];W[ce]
+;B[cg];W[jc];B[hq];W[no];B[mn];W[mo];B[ln];W[cp];B[mq];W[do];B[cn]
+;W[ho];B[jp];W[gc];B[qk];W[ql];B[rl];W[rm];B[rk];W[pl];B[ed];W[pk]
+;B[pj];W[fe];B[fr];W[em];B[dl];W[er];B[fq];W[oj];B[pi];W[nb];B[ob]
+;W[mg];B[jj];W[jg];B[je];W[nf];B[ge];W[df];B[dg];W[gf];B[hf];W[hg]
+;B[ff];W[if];B[gg];W[ie];B[ee];W[ep];B[ec];W[db];B[eb];W[gm];B[im]
+;W[oa];B[pa];W[na];B[qb];W[bp];B[bo];W[ro];B[rp];W[hh];B[bf];W[bc]
+;B[be];W[cd];B[io];W[eg];B[ef];W[fh];B[gb];W[hb];B[fg];W[eh];B[gh]
+;W[ej];B[gi];W[el];B[dk];W[ek];B[di];W[fj];B[hi];W[pg];B[qg];W[ph]
+;B[qh];W[oi];B[ih];W[fb];B[fc];W[ga];B[ig];W[jf];B[jh];W[hn];B[in]
+;W[lj];B[mk];W[lk];B[ml];W[ao];B[an];W[ap];B[bm];W[fs];B[gs];W[es]
+;B[hr];W[ea];B[id];W[hd];B[gd];W[dn];B[dm];W[sp];B[sq];W[so];B[rr]
+;W[sl];B[sk];W[qi];B[ri];W[qj];B[rj];W[ll];B[lm];W[nm];B[mm];W[kl]
+;B[jl];W[gp];B[hp];W[gq];B[gr];W[km];B[kn];W[hk];B[ik];W[hl];B[hj]
+;W[sm];B[he];W[hc];B[kg];W[kf];B[lf];W[ke];B[le];W[kd];B[lg];W[lh]
+;B[kh];W[ki];B[ji];W[bd];B[cf];W[ld];B[me];W[mj];B[ne];W[mh];B[md]
+;W[mc];B[of];W[og];B[pf];W[nk];B[jm];W[dh];B[ch];W[nl];B[kj];W[li]
+;B[od];W[de];B[ei];W[fi];B[il];W[mf];B[hm];W[gl];B[gj];W[ae];B[af]
+;W[ad];B[eq];W[dr];B[kk];W[gk];B[dd];W[]C[final_score: B+35.5
+J16 removed
+F15 removed
+K15 removed
+N5 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.4-viking4-200308191053.sgf b/regression/games/nngs/gnugo-3.4-viking4-200308191053.sgf
new file mode 100644 (file)
index 0000000..1bd2b00
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[GnuGo (GNU Go 3.4)]WR[8k*]
+PB[viking4]BR[15k*]
+PC[NNGS]DT[2003-08-19]AP[gnugoclient:2.0]
+RE[W+32.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[fq];B[ip];W[fo];B[dn];W[dr];B[cq];W[ir];B[jd];W[np];B[jq];W[pg]
+;B[nd];W[qd];B[qe];W[qc];B[pe];W[pc];B[oc];W[ob];B[nj];W[pn];B[nb]
+;W[pa];B[mg];W[dg];B[fd];W[cd];B[cc];W[bc];B[fg];W[ce];B[qb];W[rb]
+;B[eh];W[dc];B[dh];W[in];B[oo];W[qq];B[pq];W[qp];B[qo];W[ro];B[cr]
+;W[qn];B[ed];W[cb];B[jr];W[mo];B[ho];W[hq];B[gp];W[er];B[hn];W[fm]
+;B[dl];W[eo];B[gr];W[gq];B[im];W[nm];B[hm];W[or];B[ql];W[is];B[po]
+;W[lm];B[lj];W[gb];B[jn];W[fc];B[pr];W[pl];B[ep];W[qk];B[rc];W[rd]
+;B[fp];W[fr];B[gs];W[ds];B[mq];W[nq];B[fs];W[hs];B[pk];W[rl];B[rr]
+;W[en];B[qm];W[pm];B[qr];W[rq];B[rp];W[sp];B[sr];W[rn];B[do];W[fk]
+;B[gl];W[rg];B[qj];W[re];B[gd];W[ch];B[ci];W[bh];B[bi];W[mr];B[lp]
+;W[lq];B[mp];W[kp];B[sq];W[rp];B[rk];W[ai];B[kl];W[ak];B[gk];W[ib]
+;B[sl];W[kc];B[kd];W[rm];B[sm];W[bl];B[qk];W[bn];B[fj];W[jc];B[lo]
+;W[ko];B[ln];W[kn];B[mn];W[no];B[os];W[on];B[kq];W[lr];B[ol];W[id]
+;B[ie];W[hd];B[jf];W[he];B[ld];W[hg];B[ih];W[hh];B[mm];W[ml];B[mk]
+;W[if];B[ns];W[nr];B[js];W[iq];B[jp];W[hi];B[je];W[ii];B[ig];W[hf]
+;B[jh];W[nl];B[ok];W[jo];B[io];W[nn];B[of];W[bp];B[og];W[ph];B[oh]
+;W[ji];B[kh];W[bq];B[sd];W[se];B[gj];W[qf];B[fl];W[lb];B[ri];W[rh]
+;B[eg];W[df];B[ee];W[pi];B[ec];W[eb];B[gc];W[fb];B[hc];W[ic];B[oi]
+;W[ef];B[ff];W[ge];B[fe];W[br];B[cs];W[cp];B[dq];W[jk];B[qi];W[jl]
+;B[jm];W[kk];B[qh];W[qg];B[dm];W[km];B[bs];W[sn];B[de];W[sk];B[cg]
+;W[cf];B[bg];W[ah];B[ag];W[aj];B[co];W[bo];B[ar];W[sj];B[si];W[aq]
+;B[mc];W[ki];B[li];W[hb];B[mb];W[ck];B[ps];W[rs];B[nk];W[cj];B[pf]
+;W[bj];B[di];W[dk];B[ek];W[la];B[as];W[gi];B[lk];W[fi];B[ll];W[kj]
+;B[il];W[hj];B[ks];W[ik];B[ls];W[ms];B[hk];W[sh];B[rj];W[sl];B[ei]
+;W[cm];B[cl];W[cn];B[lc];W[ma];B[na];W[ja];B[oa];W[pb];B[fh];W[kr]
+;B[om];W[gg];B[];W[gh];B[ej];W[gf];B[];W[hr];B[];W[]
+C[final_score: W+32.5
+R18 removed
+S17 removed
+T16 removed
+A13 removed
+F7 removed
+E6 removed
+P5 removed
+F3 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.1-viking4-200309231039.sgf b/regression/games/nngs/gnugo-3.5.1-viking4-200309231039.sgf
new file mode 100644 (file)
index 0000000..4a81b3a
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[GnuGo (GNU Go 3.5.1)]WR[8k*]
+PB[viking4]BR[15k*]
+PC[NNGS]DT[2003-09-23]AP[gnugoclient:2.0]
+RE[B+10.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[cn];B[co];W[dn];B[fp];W[nq];B[pn];W[nc];B[pf];W[cf];B[ce];W[fc]
+;B[df];W[cg];B[dg];W[lp];B[hc];W[fe];B[eb];W[fg];B[oc];W[nd];B[lc]
+;W[nf];B[og];W[mg];B[or];W[bj];B[ko];W[mn];B[ck];W[ch];B[bn];W[bm]
+;B[bo];W[ec];B[bf];W[bk];B[gi];W[cl];B[dc];W[ml];B[fb];W[pl];B[ql]
+;W[jm];B[ol];W[nb];B[mb];W[qa];B[he];W[rd];B[fk];W[rf];B[hg];W[gf]
+;B[hk];W[hf];B[qk];W[fi];B[kq];W[eg];B[if];W[dh];B[mi];W[lq];B[lr]
+;W[mr];B[kn];W[kl];B[ig];W[kr];B[jr];W[ls];B[no];W[mo];B[gh];W[ef]
+;B[de];W[ej];B[ek];W[js];B[ir];W[km];B[fh];W[eh];B[in];W[rh];B[nr]
+;W[bg];B[pe];W[be];B[bd];W[af];B[np];W[kj];B[nh];W[oq];B[pq];W[ad]
+;B[ki];W[bc];B[is];W[nn];B[jk];W[lj];B[ks];W[fn];B[li];W[rj];B[rk]
+;W[qc];B[im];W[js];B[pm];W[go];B[gp];W[ns];B[ks];W[pr];B[qr];W[os]
+;B[lr];W[qs];B[mp];W[qq];B[kr];W[qp];B[kp];W[oo];B[po];W[op];B[qo]
+;W[sp];B[rr];W[rq];B[gm];W[ho];B[ob];W[ke];B[na];W[rm];B[rs];W[ro]
+;B[dl];W[fm];B[dm];W[cm];B[en];W[eo];B[em];W[do];B[fo];W[ep];B[eq]
+;W[dq];B[bq];W[cr];B[cp];W[br];B[ar];W[fq];B[er];W[gq];B[fr];W[hp]
+;B[cd];W[cb];B[db];W[gr];B[gs];W[gl];B[ap];W[hm];B[fj];W[ei];B[gk]
+;W[fl];B[ds];W[qn];B[ms];W[ca];B[ls];W[gd];B[hd];W[an];B[ps];W[or]
+;B[dr];W[hl];B[cq];W[qm];B[nk];W[om];B[pk];W[nl];B[pl];W[mk];B[nj]
+;W[on];B[il];W[gc];B[gb];W[cc];B[lf];W[lo];B[ph];W[qi];B[pi];W[qg]
+;B[qh];W[kk];B[da];W[ln];B[hn];W[gn];B[ge];W[ee];B[ed];W[fd];B[gg]
+;W[ff];B[iq];W[pb];B[hr];W[qf];B[pg];W[qe];B[ac];W[ab];B[rl];W[sm]
+;B[jl];W[sj];B[sk];W[qj];B[qd];W[pc];B[od];W[jn];B[io];W[cj];B[dk]
+;W[di];B[ip];W[am];B[oa];W[pa];B[hq];W[mj];B[lg];W[ao];B[kd];W[jo]
+;B[el];W[sl];B[];W[]C[final_score: B+10.5
+O18 removed
+L15 removed
+O14 removed
+N13 removed
+O5 removed
+B2 removed
+R2 removed
+Q1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-G28-200312282240.sgf b/regression/games/nngs/gnugo-3.5.2gf1-G28-200312282240.sgf
new file mode 100644 (file)
index 0000000..6172c5a
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[7]KM[0.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[G28]BR[NR]
+PC[NNGS]DT[2003-12-28]AP[gnugoclient:2.0]
+RE[W+43.5]
+AB[dd][pd][dj][jj][pj][dp][pp]
+;W[cn];B[fp];W[nd];B[nc];W[mc];B[oc];W[md];B[dl];W[hq];B[gr];W[ic]
+;B[bl];W[bp];B[cq];W[en];B[fl];W[gn];B[hl];W[fc];B[df];W[nq];B[pn]
+;W[qf];B[pf];W[pg];B[of];W[qe];B[od];W[rc];B[qd];W[pr];B[qq];W[kq]
+;B[qg];W[qh];B[rg];W[rh];B[mf];W[qk];B[qm];W[bq];B[kf];W[rd];B[kd]
+;W[kb];B[db];W[ie];B[pk];W[ig];B[jh];W[cr];B[dr];W[oh];B[mh];W[ff]
+;B[eh];W[qr];B[gh];W[kn];B[nj];W[rk];B[jl];W[nn];B[ll];W[eb];B[nl]
+;W[sn];B[ih];W[br];B[qc];W[dc];B[cc];W[ec];B[cb];W[qb];B[rq];W[bm]
+;B[hf];W[gf];B[if];W[cl];B[ck];W[cm];B[bk];W[nb];B[hg];W[hr];B[gq]
+;W[ds];B[er];W[gs];B[fs];W[hs];B[qj];W[rj];B[he];W[je];B[ke];W[gm]
+;B[gl];W[in];B[jf];W[id];B[ho];W[eo];B[gp];W[jm];B[ee];W[gd];B[pb]
+;W[rb];B[fg];W[om];B[pl];W[ni];B[mi];W[oi];B[rn];W[sm];B[ro];W[lm]
+;B[so];W[mm];B[ml];W[sl];B[pi];W[ph];B[rr];W[ng];B[nf];W[rs];B[kp]
+;W[ip];B[io];W[jo];B[lq];W[jp];B[lp];W[oo];B[op];W[np];B[jq];W[kr]
+;B[jr];W[js];B[lr];W[ks];B[ls];W[dm];B[is];W[ir];B[hm];W[hn];B[fm]
+;W[fn];B[em];W[hd];B[fe];W[ge];B[oj];W[oq];B[po];W[on];B[mo];W[no]
+;B[mg];W[al];B[ak];W[am];B[do];W[dn];B[nh];W[da];B[ca];W[ea];B[og]
+;W[qi];B[sh];W[ri];B[sg];W[ef];B[se];W[re];B[eg];W[pe];B[oe];W[ed]
+;B[cd];W[rl];B[si];W[im];B[sj];W[rf];B[ik];W[ol];B[ok];W[kc];B[lo]
+;W[iq];B[js];W[kr];B[nr];W[or];B[mq];W[ns];B[mr];W[ld];B[kl];W[jd]
+;B[cp];W[ep];B[fq];W[hp];B[eq];W[go];B[bo];W[co];B[sr];W[le];B[ss]
+;W[qs];B[pa];W[lf];B[lg];W[ob];B[oa];W[mb];B[na];W[ma];B[me];W[qa]
+;B[pc];W[sk];B[pq];W[sf];B[il];W[gg];B[pm];W[km];B[rm];W[fd];B[de]
+;W[nm];B[ne];W[ql];B[];W[]C[final_score: W+43.5
+T15 removed
+J13 removed
+B5 removed
+D5 removed
+M5 removed
+F4 removed
+K3 removed
+F1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-Kiskol-200401021557.sgf b/regression/games/nngs/gnugo-3.5.2gf1-Kiskol-200401021557.sgf
new file mode 100644 (file)
index 0000000..06f3beb
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[Kiskol]BR[NR]
+PC[NNGS]DT[2004-01-02]AP[gnugoclient:2.0]
+RE[B+9.5]
+;B[fd];W[dc];B[fg];W[cf];B[de];W[ce];B[dd];W[cd];B[dh];W[ec];B[fc]
+;W[eb];B[fb];W[bh];B[ea];W[da];B[fa];W[cb];B[dg];W[ch];B[ci];W[df]
+;B[ef];W[ed];B[ee];W[bi];B[di];W[cg];B[];W[]C[final_score: B+9.5])
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-guest-200312260740.sgf b/regression/games/nngs/gnugo-3.5.2gf1-guest-200312260740.sgf
new file mode 100644 (file)
index 0000000..9015625
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[guest]BR[NR]
+PC[NNGS]DT[2003-12-26]AP[gnugoclient:2.0]
+RE[W+5.5]
+;B[pd];W[dp];B[pq];W[dd];B[qk];W[dj];B[dg];W[fd];B[cn];W[co];B[dn]
+;W[fp];B[fn];W[pf];B[nd];W[qd];B[qc];W[qe];B[rc];W[po];B[qm];W[lc]
+;B[oc];W[ic];B[cd];W[ce];B[de];W[cc];B[bd];W[ee];B[df];W[be];B[bc]
+;W[bb];B[cb];W[dc];B[ab];W[ba];B[ca];W[ad];B[aa];W[ae];B[bf];W[bb]
+;B[bh];W[iq];B[cq];W[dq];B[bo];W[bp];B[cp];W[bq];B[do];W[cr];B[fj]
+;W[fg];B[eh];W[nq];B[qo];W[no];B[pp];W[hn];B[kp];W[kn];B[ln];W[lo]
+;B[ko];W[mo];B[jn];W[km];B[in];W[mm];B[il];W[gm];B[el];W[ho];B[ip]
+;W[hp];B[jl];W[pn];B[qn];W[op];B[qg];W[nf];B[me];W[oi];B[qi];W[kr]
+;B[kq];W[lr];B[jq];W[jr];B[io];W[or];B[pr];W[ig];B[ke];W[gk];B[fl]
+;W[gl];B[jj];W[if];B[kl];W[ll];B[lj];W[ok];B[pm];W[om];B[lk];W[ps]
+;B[qs];W[os];B[rr];W[oe];B[mc];W[lb];B[ld];W[lh];B[kc];W[kb];B[jc]
+;W[jb];B[id];W[hc];B[hd];W[jd];B[je];W[kd];B[ie];W[mi];B[hf];W[hg]
+;B[gf];W[gg];B[gd];W[gc];B[fh];W[oa];B[nb];W[na];B[pa];W[ma];B[pb]
+;W[ff];B[ge];W[eo];B[en];W[pj];B[qj];W[cf];B[cg];W[ac];B[fo];W[ep]
+;B[oq];W[nr];B[ml];W[lm];B[nk];W[ol];B[nj];W[ni];B[pg];W[nl];B[og]
+;W[of];B[rf];W[ng];B[pi];W[oj];B[re];W[af];B[bg];W[rd];B[sd];W[oh]
+;B[go];W[fk];B[ek];W[gp];B[gj];W[hk];B[ij];W[hj];B[kh];W[ii];B[ji]
+;W[ej];B[gh];W[cl];B[bm];W[bj];B[bl];W[cj];B[ih];W[an];B[bn];W[fm]
+;B[em];W[bk];B[ak];W[ao];B[aj];W[hi];B[hh];W[ai];B[al];W[gi];B[fi]
+;W[jm];B[im];W[ag];B[ah];W[kg];B[jg];W[jf];B[jh];W[lf];B[le];W[kf]
+;B[mf];W[mg];B[od];W[ik];B[jk];W[ph];B[qh];W[li];B[ki];W[pl];B[ql]
+;W[mk];B[mj];W[mb];B[ob];W[lp];B[lq];W[mq];B[bi];W[ml];B[qf];W[pe]
+;B[co];W[ap];B[fe];W[ef];B[eg];W[br];B[hm];W[gn];B[ne];W[am];B[pk]
+;W[hl];B[];W[]C[final_score: W+5.5
+A19 removed
+C19 removed
+B10 removed
+C8 removed
+M6 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-kisome-200312131322.sgf b/regression/games/nngs/gnugo-3.5.2gf1-kisome-200312131322.sgf
new file mode 100644 (file)
index 0000000..2e4d6c3
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[kisome]BR[NR]
+PC[NNGS]DT[2003-12-13]AP[gnugoclient:2.0]
+RE[B+15.5]
+;B[fd];W[cg];B[fg];W[gd];B[be];W[ce];B[cc];W[gc];B[dd];W[bf];B[bd]
+;W[hg];B[fc];W[fb];B[eb];W[gb];B[gf];W[hf];B[ge];W[he];B[df];W[bh]
+;B[dh];W[ea];B[da];W[fa];B[db];W[gh];B[fh];W[gi];B[fi];W[gg];B[ff]
+;W[];B[cf];W[];B[de];W[];B[cd];W[]C[final_score: B+15.5
+B4 removed
+C3 removed
+B2 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf b/regression/games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf
new file mode 100644 (file)
index 0000000..168381f
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[thi]BR[NR]
+PC[NNGS]DT[2003-12-21]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pd];W[dp];B[pp];W[dd];B[pj];W[nq];B[jd];W[no];B[pn];W[mn];B[jp]
+;W[om];B[pm];W[pr];B[fq];W[qf];B[qe];W[pf];B[mc];W[dn];B[qh];W[qq]
+;B[qp];W[hc];B[cj];W[er];B[he];W[fd];B[cf];W[ce];B[ef];W[nf];B[ni]
+;W[pe];B[qd];W[rg];B[rh];W[lf];B[qg];W[rf];B[og];W[me];B[of];W[oe]
+;B[nd];W[ne];B[mh];W[lh];B[li];W[mg];B[ng];W[kh];B[ki];W[jh];B[ji]
+;W[ml];B[lq];W[fr];B[gq];W[fo];B[jn];W[ff];B[ge];W[fe];B[hg];W[ih]
+;B[hh];W[df];B[cg];W[eg];B[dg];W[is];B[gr];W[hp];B[ir];W[hn];B[lm]
+;W[ol];B[pl];W[gs];B[js];W[hs];B[hr];W[fs];B[kr];W[jb];B[kc];W[eq]
+;B[bo];W[bm];B[cq];W[cr];B[br];W[dq];B[cn];W[cm];B[cp];W[bs];B[dm]
+;W[bn];B[co];W[en];B[hj];W[jf];B[le];W[re];B[rd];W[ig];B[kg];W[rp]
+;B[ro];W[ok];B[pk];W[rq];B[cl];W[dl];B[em];W[ck];B[dk];W[bl];B[el]
+;W[bq];B[bk];W[cl];B[bj];W[ek];B[dj];W[fl];B[ej];W[fm];B[be];W[bd]
+;B[bf];W[de];B[cc];W[bc];B[kb];W[so];B[rn];W[im];B[jm];W[od];B[oc]
+;W[sn];B[sm];W[sp];B[ib];W[hb];B[gd];W[gc];B[mr];W[rm];B[sl];W[rl]
+;B[sk];W[rj];B[on];W[mm];B[ll];W[ic];B[jc];W[ii];B[ij];W[hi];B[fh]
+;W[gh];B[gg];W[gi];B[fj];W[fg];B[ie];W[hf];B[gf];W[sg];B[se];W[sh]
+;B[oq];W[or];B[nr];W[op];B[pq];W[po];B[ri];W[si])
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf b/regression/games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf
new file mode 100644 (file)
index 0000000..6269fa9
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[vincentkuo]BR[NR]
+PC[NNGS]DT[2003-12-16]AP[gnugoclient:2.0]
+RE[B+41.5]
+;B[pp];W[dq];B[pd];W[dd];B[do];W[co];B[cn];W[cp];B[dm];W[fq];B[ci]
+;W[nq];B[pn];W[qf];B[qh];W[qc];B[qd];W[pc];B[od];W[rd];B[re];W[rc]
+;B[qe];W[nc];B[oc];W[ob];B[nd];W[mc];B[qk];W[pf];B[og];W[kq];B[pr]
+;W[of];B[nf];W[kd];B[ng];W[rf];B[se];W[fe];B[cf];W[ce];B[df];W[ge]
+;B[cc];W[dc];B[be];W[bd];B[cd];W[bc];B[de];W[cb];B[ce];W[nn];B[bb]
+;W[ab];B[db];W[ba];B[ed];W[ec];B[fc];W[eb];B[fb];W[da];B[fd];W[gn]
+;B[ee];W[ml];B[jq];W[jp];B[iq];W[kp];B[ip];W[kr];B[in];W[fh];B[jo]
+;W[ln];B[jl];W[ic];B[ol];W[mj];B[gl];W[fo];B[gm];W[hh];B[kf];W[bo]
+;B[bn];W[fj];B[dj];W[nj];B[oi];W[hk];B[hl];W[or];B[oq];W[op];B[pq]
+;W[nr];B[oo];W[an];B[am];W[ao];B[bm];W[ps];B[qs];W[os];B[qr];W[hr]
+;B[ir];W[je];B[ek];W[fm];B[fl];W[np];B[ko];W[lo];B[no];W[mo];B[md]
+;W[ld];B[le];W[jf];B[kh];W[jg];B[kg];W[mh];B[ni];W[mi];B[hd];W[hb]
+;B[he];W[jh];B[ki];W[hf];B[gd];W[ff];B[ik];W[hj];B[lk];W[nl];B[ok]
+;W[om];B[pm];W[on];B[po];W[lj];B[kj];W[em];B[en];W[fn];B[dp];W[eq]
+;B[gr];W[hq];B[hs];W[fr];B[gq];W[hp];B[gp];W[ho];B[io];W[hn];B[hm]
+;W[mg];B[mf];W[el];B[dl];W[nh];B[oh];W[fs];B[gs];W[id];B[eg];W[eh]
+;B[dh];W[ei];B[fg];W[gg];B[ef];W[gf];B[ji];W[ii];B[ij];W[mk];B[ll]
+;W[lm];B[km];W[ae];B[af];W[ad];B[fp];W[cq];B[ep];W[jr];B[js];W[ks]
+;B[is];W[kn];B[jn];W[gk];B[fk];W[ie];B[ej];W[oj];B[pj];W[sd];B[di]
+;W[gi];B[fa];W[ea];B[hc];W[gb];B[ga];W[ha];B[lf];W[mm];B[gc];W[ib]
+;B[];W[ke];B[];W[nk];B[];W[li];B[];W[lg];B[];W[lh];B[];W[]
+C[final_score: B+41.5
+P14 removed
+E8 removed])
diff --git a/regression/games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf b/regression/games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf
new file mode 100644 (file)
index 0000000..981ac2c
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.2gf1)]WR[8k*]
+PB[wingjk]BR[9k*]
+PC[NNGS]DT[2003-12-30]AP[gnugoclient:2.0]
+RE[B+0.5]
+;B[qd];W[dd];B[pp];W[dp];B[kq];W[od];B[pc];W[qn];B[qg];W[qk];B[oc]
+;W[rp];B[qq];W[hc];B[dj];W[ch];B[cn];W[fq];B[bp];W[cq];B[lc];W[bq]
+;B[bo];W[rq];B[rr];W[on];B[po];W[pn];B[np];W[iq];B[ko];W[cf];B[jc]
+;W[ec];B[nf];W[ie];B[je];W[cj];B[ck];W[bj];B[bk];W[di];B[ej];W[jf]
+;B[ke];W[gh];B[ei];W[eh];B[id];W[hd];B[if];W[he];B[ig];W[jg];B[ih]
+;W[jh];B[ii];W[mh];B[ji];W[ki];B[kj];W[pi];B[kh];W[en];B[dm];W[li]
+;B[kf];W[mk];B[mn];W[hn];B[nm];W[ib];B[jb];W[rh];B[rg];W[sg];B[sf]
+;W[sh];B[rf];W[nc];B[nb];W[ne];B[mf];W[mb];B[mc];W[nd];B[ob];W[of]
+;B[og];W[pe];B[pf];W[ol];B[qh];W[jr];B[kr];W[ri];B[qi];W[rj];B[jq]
+;W[ir];B[gg];W[fg];B[gf];W[hl];B[ik];W[ks];B[ls];W[js];B[lr];W[sr]
+;B[qr];W[ak];B[bl];W[ap];B[ao];W[aq];B[fe];W[ff];B[ge];W[lg];B[kg]
+;W[lh];B[lj];W[mj];B[oi];W[pj];B[ni];W[nh];B[oh];W[mi];B[nk];W[nl]
+;B[ok];W[ll];B[mm];W[ml];B[pk];W[qj];B[pl];W[om];B[ql];W[rl];B[jm]
+;W[kk];B[jk];W[ic];B[jd];W[ja];B[ka];W[ia];B[lb];W[km];B[kn];W[em]
+;B[el];W[fl];B[fk];W[gk];B[gj];W[hk];B[hj];W[al];B[am];W[lm];B[ln]
+;W[ee];B[fc];W[fb];B[gc];W[gb];B[aj];W[ai];B[ak];W[ci];B[ip];W[hp]
+;B[io];W[ho];B[in];W[hf];B[hg];W[lf];B[le];W[nj];B[oj];W[qm];B[ng]
+;W[do];B[dn];W[qo];B[qp];W[oo];B[op];W[no];B[mo];W[fi];B[fj];W[gi]
+;B[hi];W[ph];B[pg];W[im];B[il];W[hm];B[jl];W[rs];B[qs];W[sq];B[ss]
+;W[so];B[kl];W[lk];B[jj];W[rs];B[cp];W[ss];B[co];W[fm];B[hh];W[fh]
+;B[gd];W[ed];B[mg];W[fd];B[pm];W[nn];B[];W[]C[final_score: B+0.5
+N18 removed
+O17 removed
+Q15 removed
+P14 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf b/regression/games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf
new file mode 100644 (file)
index 0000000..594f946
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.3)]WR[8k*]
+PB[JanErik]BR[10k]
+PC[NNGS]DT[2004-01-08]AP[gnugoclient:2.0]
+RE[B+3.5]
+;B[dd];W[pp];B[dp];W[pc];B[qj];W[fd];B[hc];W[ge];B[oe];W[fp];B[oc]
+;W[dn];B[eo];W[cq];B[dq];W[cp];B[pd];W[cf];B[ch];W[ef];B[ee];W[cj]
+;B[eh];W[ie];B[jd];W[kf];B[je];W[mf];B[jf];W[fe];B[df];W[eg];B[dg]
+;W[cg];B[gg];W[bh];B[ci];W[bi];B[ff];W[ng];B[pg];W[bd];B[ce];W[be]
+;B[fb];W[jp];B[qn];W[np];B[on];W[qo];B[rn];W[ro];B[mn];W[lp];B[mo]
+;W[mp];B[jn];W[hp];B[fn];W[li];B[kg];W[lg];B[kh];W[ni];B[mh];W[lh]
+;B[le];W[ph];B[og];W[ki];B[ji];W[ll];B[nk];W[qi];B[oh];W[oi];B[nh]
+;W[qg];B[pj];W[pi];B[mi];W[kl];B[ko];W[mj];B[nj];W[kp];B[qf];W[rf]
+;B[rg];W[sg];B[rh];W[il];B[hn];W[qe];B[pf];W[pb];B[re];W[qd];B[rd]
+;W[rc];B[rb];W[se];B[sf];W[ob];B[sd];W[nc];B[nd];W[mc];B[kb];W[me]
+;B[md];W[sc];B[qb];W[qc];B[ma];W[dl];B[gl];W[jj];B[ii];W[fr];B[mk]
+;W[dr];B[lj];W[kj];B[dj];W[od];B[pe];W[dk];B[ej];W[ld];B[ne];W[ke]
+;B[kd];W[lc];B[lf];W[cc];B[dc];W[sn];B[sm];W[so];B[rm];W[db];B[eb]
+;W[cb];B[do];W[co];B[go];W[lb];B[la];W[io];B[in];W[eq];B[gp];W[gq]
+;B[em];W[dm];B[ek];W[oo];B[no];W[qa];B[ra];W[kc];B[jb];W[jc];B[ic]
+;W[na];B[mb];W[nb];B[ib];W[ka];B[ja];W[fo];B[en];W[ho];B[gn];W[lo]
+;B[ln];W[la];B[ep];W[fq];B[cd];W[ea];B[fa];W[ed];B[da];W[ec];B[fg]
+;W[de];B[he];W[hd];B[hf];W[id];B[gc];W[gd];B[ha];W[ca];B[ea];W[if]
+;B[ig];W[gf];B[hg];W[ef];B[eg];W[pn];B[pm];W[po];B[el];W[ee];B[fc]
+;W[oc];B[jo];W[om];B[nn];W[]C[final_score: B+3.5
+S19 removed
+N15 removed
+M13 removed
+O13 removed
+R13 removed
+T13 removed
+Q12 removed
+J8 removed
+L8 removed
+P7 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf b/regression/games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf
new file mode 100644 (file)
index 0000000..1aaab67
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.3)]WR[8k*]
+PB[Scorpion]BR[12k]
+PC[NNGS]DT[2004-01-08]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pd];W[cp];B[qq];W[cc];B[fd];W[cf];B[ic];W[dl];B[jq];W[eq];B[pj]
+;W[nd];B[qf];W[pc];B[qc];W[oc];B[qb];W[pp];B[lc];W[qp];B[pq];W[oq]
+;B[or];W[nq];B[nr];W[mq];B[rp];W[ro];B[rq];W[qn];B[gq];W[mr];B[pr]
+;W[eg];B[od];W[mc];B[ld];W[gg];B[fl];W[mn];B[ne];W[ek];B[md];W[rk]
+;B[rj];W[qk];B[qj];W[ig];B[el];W[dn];B[dk];W[ci];B[dm];W[cl];B[cm]
+;W[bl];B[fk];W[em];B[ej];W[kg];B[bm];W[cj];B[cq];W[bq];B[en];W[dq]
+;B[fm];W[fb];B[ec];W[eb];B[dc];W[cb];B[gc];W[ia];B[jb];W[hj];B[pk]
+;W[do];B[go];W[mg];B[gb];W[og];B[pg];W[nj];B[nk];W[mj];B[db];W[da]
+;B[ga];W[sj];B[si];W[sk];B[rh];W[pl];B[ol];W[pm];B[cd];W[bd];B[ce]
+;W[be];B[ea];W[km];B[il];W[jk];B[ik];W[ij];B[jl];W[kl];B[jm];W[jn]
+;B[in];W[jo];B[ca];W[io];B[ho];W[de];B[oh];W[fr];B[gr];W[of];B[nf]
+;W[ng];B[mk];W[nh];B[oi];W[jp];B[hq];W[kq];B[fq];W[es];B[dd];W[ee]
+;B[lk];W[iq];B[ir];W[jr];B[gj];W[hk];B[hl];W[is];B[gk];W[hr];B[bb]
+;W[bc];B[kj];W[jj];B[pe];W[ki];B[gi];W[ab];B[ba];W[ie];B[id];W[lj]
+;B[kk];W[eo];B[fo];W[je];B[ni];W[ii];B[nm];W[nn];B[om];W[on];B[mi]
+;W[li];B[he];W[gs];B[eh];W[dh];B[fh];W[hf];B[di];W[dj];B[ei];W[ck]
+;B[jd];W[ge];B[hd];W[ke];B[kd];W[bo];B[al];W[ak];B[am];W[ch];B[le]
+;W[fe];B[lf];W[lg];B[hh];W[ih];B[fg];W[ff];B[kf];W[jf];B[so];W[sn]
+;B[sp];W[rn];B[ms];W[ls];B[ns];W[cn];B[mm];W[lm];B[oj];W[ep];B[fp]
+;W[ll];B[ml];W[mh];B[mf];W[hp];B[hg];W[ek];B[gd];W[dk];B[ed];W[gf]
+;B[gh];W[ip];B[gp];W[pf];B[oe];W[bn];B[an];W[ao];B[em];W[hi];B[da]
+;W[hn];B[im];W[gm];B[gl];W[fn];B[gn];W[fn];B[aj];W[bk];B[dg];W[df])
diff --git a/regression/games/nngs/gnugo-3.5.3-dbr-200401121534.sgf b/regression/games/nngs/gnugo-3.5.3-dbr-200401121534.sgf
new file mode 100644 (file)
index 0000000..6eaee79
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.3)]WR[8k*]
+PB[dbr]BR[10k]
+PC[NNGS]DT[2004-01-12]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[pp];W[dd];B[qd];W[dp];B[nc];W[pn];B[pj];W[np];B[oo];W[qq];B[qp]
+;W[pq];B[op];W[oq];B[no];W[mp];B[nm];W[hc];B[dj];W[ch];B[cn];W[fq]
+;B[bp];W[cq];B[jd];W[bq];B[do];W[fd];B[dh];W[dg];B[eh];W[ci];B[cj]
+;W[fo];B[eo];W[fn];B[ep];W[fr];B[fp];W[gp];B[hp];W[iq];B[go];W[gq]
+;B[ho];W[fl];B[fj];W[in];B[gm];W[gn];B[hn];W[fm];B[im];W[jn];B[jm]
+;W[hf];B[cc];W[dc];B[cd];W[jf];B[bf];W[cf];B[bg];W[lf];B[og];W[kc]
+;B[kd];W[ld];B[lc];W[lb];B[mc];W[jb];B[le];W[cg];B[ce];W[de];B[ff]
+;W[cl];B[dl];W[dm];B[cm];W[em];B[bl];W[oa];B[na];W[ob];B[nb];W[pb]
+;B[pc];W[ii];B[gl];W[gf];B[fg];W[kn];B[km];W[li];B[hq];W[hr];B[ip]
+;W[jq];B[jp];W[kp];B[kq];W[lo];B[lq];W[mr];B[ko];W[lp];B[ln];W[qm]
+;B[qk];W[mn];B[lm];W[rq];B[rp];W[jo];B[mo];W[ni];B[oi];W[cb];B[bb]
+;W[db];B[ac];W[sp];B[so];W[sq];B[rn];W[nk];B[jc];W[kb];B[dq];W[cp]
+;B[bo];W[eq];B[dr];W[ke];B[md];W[mf];B[ne];W[nh];B[ng];W[oh];B[ph]
+;W[bh];B[ie];W[ba];B[ab];W[ag];B[be];W[af];B[ae];W[bd];B[ah];W[ag]
+;B[ai];W[bj];B[aj];W[ak];B[af];W[bk];B[ck];W[mg])
diff --git a/regression/games/nngs/gnugo-3.5.4-chpr-200403201748.sgf b/regression/games/nngs/gnugo-3.5.4-chpr-200403201748.sgf
new file mode 100644 (file)
index 0000000..da3cb53
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.5.4)]WR[8k*]
+PB[chpr]BR[8k*]
+PC[NNGS]DT[2004-03-20]AP[gnugoclient:2.0]
+RE[W+Resign]
+;B[do];W[pp];B[de];W[qd];B[li];W[cg];B[ce];W[oc];B[gc];W[cc];B[dc]
+;W[db];B[ec];W[bd];B[be];W[bb];B[ci];W[eg];B[cd];W[dq];B[ad];W[bc]
+;B[eb];W[dl];B[da];W[co];B[cp];W[dp];B[cn];W[bo];B[dn];W[bn];B[cl]
+;W[ck];B[bm];W[bp];B[dk];W[dj];B[ek];W[cj];B[ej];W[ch];B[di];W[bi]
+;B[ei];W[gp];B[dg];W[dh];B[df];W[eh];B[fp];W[fo];B[fq];W[gq];B[ep]
+;W[eo];B[fr];W[em];B[dm];W[el];B[bk];W[bj];B[go];W[gr];B[fn];W[en]
+;B[cm];W[ho];B[gn];W[fl];B[hn];W[qj];B[aj];W[bh];B[dr];W[cr];B[er]
+;W[io];B[in];W[fi];B[fk];W[gk];B[jo];W[jp];B[ip];W[iq];B[hp];W[jq]
+;B[br];W[mo];B[bq];W[cq];B[cs];W[am];B[bl];W[oj];B[eq];W[cp];B[an]
+;W[ao];B[aq];W[al];B[gs];W[hq];B[fs];W[ds];B[es];W[nh];B[qq];W[pq]
+;B[lp];W[qp];B[mp];W[lo];B[no];W[kp];B[ko];W[nn];B[op];W[oo];B[np]
+;W[mm];B[oq];W[hs];B[lm];W[lq];B[ml];W[pn];B[om];W[on];B[pm];W[qg]
+;B[qn];W[or];B[nr];W[qr];B[os];W[pr];B[qo];W[nm];B[nl];W[po];B[rq]
+;W[rp];B[rr];W[ol];B[pl];W[ok];B[ln];W[mn];B[ro];W[qm];B[ql];W[sp]
+;B[rm];W[lc];B[mr];W[mq];B[nq];W[ic];B[lr];W[rs];B[ps];W[kq];B[kr]
+;W[lh];B[ns];W[qs];B[so];W[jr];B[is];W[ds];B[sr];W[he];B[sq];W[ss]
+;B[rq];W[ji];B[sr];W[ll];B[lk];W[kl];B[kn];W[jm];B[mk];W[kk];B[mi]
+;W[mh];B[sq];W[fe];B[rr];W[qq];B[rq];W[rk];B[rr];W[ks];B[sq];W[sr]
+;B[rq];W[ls];B[ki];W[rl];B[kj];W[hb];B[kh];W[jj];B[jh];W[kg];B[ni]
+;W[gj];B[oh];W[og];B[pg];W[ph];B[oi];W[ii];B[ng];W[lf];B[of];W[pi]
+;B[mf];W[lg];B[qf];W[le];B[qh];W[rg];B[rh];W[rf];B[nj];W[qe];B[pf]
+;W[pk];B[qi];W[pj];B[rj];W[sh];B[ri];W[gb];B[ih];W[ne];B[hi];W[ij]
+;B[hj];W[hk];B[ik];W[jk];B[gh];W[ef];B[il];W[im];B[km];W[jl];B[ie]
+;W[if];B[hf];W[hg];B[jf];W[gf];B[ig];W[hf];B[jg];W[hh];B[jc];W[jb]
+;B[kc];W[jd];B[kd];W[je];B[ke];W[id];B[kf];W[me];B[ld];W[kb];B[mc]
+;W[lb];B[md];W[mb];B[nd];W[oe];B[od];W[pe];B[pc];W[rb];B[ob];W[nb]
+;B[nc];W[pd];B[qc];W[qb];B[rc];W[sc];B[rd];W[re];B[sd];W[fd];B[fc]
+;W[nf];B[og];W[oa];B[pa];W[na];B[pb];W[mg];B[sl];W[si];B[nk];W[sj]
+;B[gd];W[bf];B[af];W[ag];B[ae];W[ed];B[dd];W[cf];B[cb];W[fb];B[ge]
+;W[ee];B[hd];W[fa];B[ea];W[se];B[jn];W[gi];B[hm];W[hl];B[es];W[hc])
diff --git a/regression/games/nngs/gnugo-3.5.5-liza-200404251738.sgf b/regression/games/nngs/gnugo-3.5.5-liza-200404251738.sgf
new file mode 100644 (file)
index 0000000..0157359
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[3]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.5)]
+WR[8k*]
+PB[liza]
+BR[9k*]PC[NNGS]
+DT[2004-04-25]
+AP[gnugoclient:2.0]
+RE[W+3.5]
+;B[qd];W[dd];B[pp];W[dq];B[qj];W[hp];B[oc];W[co];B[jq];W[jo];B[lp];
+W[ln];B[oj];W[nn];B[nq];W[dk];B[pm];W[ch];B[jd];W[hc];B[jc];W[hf];
+B[cc];W[dc];B[cd];W[ce];B[be];W[cf];B[db];W[eb];B[cb];W[jf];B[md];
+W[mj];B[jj];W[kk];B[hj];W[qq];B[qp];W[pq];B[oq];W[rp];B[ro];W[bf];
+B[ad];W[nh];B[rq];W[ir];B[iq];W[hq];B[jr];W[hr];B[fj];W[ei];B[gl];
+W[gn];B[el];W[dl];B[em];W[eo];B[il];W[fc];B[gh];W[fg];B[qg];W[jm];
+B[ih];W[ib];B[jb];W[mg];B[ph];W[nk];B[ok];W[ja];B[ka];W[ia];B[lb];
+W[js];B[kr];W[ks];B[ls];W[is];B[lr];W[ol];B[pl];W[om];B[pn];W[ne];
+B[nd];W[of];B[pe];W[af];B[ac];W[fh];B[gg];W[gf];B[fi];W[dm];B[en];
+W[dn];B[ej];W[dj];B[fn];W[fo];B[gm];W[hn];B[on];W[no];B[mp];W[jl];
+B[jk];W[oe];B[od];W[im];B[hm];W[da];B[bb];W[ca];B[ba];W[ea];B[pf];
+W[og];B[oi];W[ko];B[lf];W[ke];B[kd];W[kg];B[le];W[kf];B[ic];W[hb];
+B[ie];W[hg];B[hh];W[kj];B[ji];W[ki];B[op];W[ae];B[bd];W[hd];B[id];
+W[ek];B[fk];W[lg];B[me];W[jh];B[hk];W[he];B[ig];W[jg];B[if];W[ni];
+B[nj];W[nl];B[oh];W[mf];B[kp];W[ip];B[mo];W[mn];B[oo];W[pg];B[bq];
+W[jp];B[cr];W[dr];B[bp];W[ar];B[bo];W[bn];B[cq];W[lo];B[ao];W[aq];
+B[as];W[np];B[cs];W[br];B[an];W[je];B[bm];W[cn];B[bl];W[ds];B[bk];
+W[bj];B[am];W[ak];B[cj];W[aj];B[di];W[eh];B[bi];W[ci];B[ck];W[bh];
+B[dp];W[eq];B[ep];W[fq];B[fp];W[do];B[gp];W[cp];B[go];W[dh];B[gq];
+W[ho];B[gr];W[fr];B[tt];W[tt]
+C[final_score: W+4.5
+B11 removed
+C10 removed
+G5 removed
+S4 removed
+Q3 removed
+A1 removed]
+)
diff --git a/regression/games/nngs/gnugo-3.5.5-liza-200404251750.sgf b/regression/games/nngs/gnugo-3.5.5-liza-200404251750.sgf
new file mode 100644 (file)
index 0000000..d2de993
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[3]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.5.5)]
+WR[8k*]
+PB[liza]
+BR[9k*]PC[NNGS]
+DT[2004-04-25]
+AP[gnugoclient:2.0]
+RE[B+2.5]
+;B[qd];W[dd];B[pp];W[dp];B[oc];W[qj];B[qm];W[qg];B[pq];W[hq];B[lq];
+W[dj];B[jd];W[hc];B[jc];W[gf];B[md];W[cn];B[cq];W[dq];B[cp];W[co];
+B[dr];W[er];B[br];W[ds];B[bp];W[bs];B[bo];W[bn];B[cr];W[cs];B[fr];
+W[fq];B[ar];W[cf];B[ao];W[aq];B[an];W[bm];B[am];W[ec];B[do];W[en];
+B[eo];W[fo];B[bl];W[cl];B[bk];W[bi];B[bj];W[ci];B[ck];W[cm];B[dk];
+W[ej];B[ek];W[fk];B[el];W[fm];B[fl];W[gl];B[gk];W[hl];B[fj];W[ij];
+B[fi];W[jl];B[hi];W[rl];B[rm];W[lo];B[jq];W[qk];B[gr];W[hr];B[gq];
+W[gp];B[ep];W[eq];B[hp];W[ip];B[ho];W[io];B[hn];W[jm];B[as];W[es];
+B[em];W[dn];B[hj];W[np];B[nr];W[ng];B[ii];W[jj];B[nq];W[ji];B[ig];
+W[jh];B[hg];W[kf];B[hk];W[gn];B[ik];W[jk];B[il];W[om];B[hm];W[re];
+B[gm];W[rd];B[go];W[fp];B[fn];W[qc];B[pc];W[qb];B[pd];W[na];B[ib];
+W[ie];B[hb];W[gc];B[eg];W[gb];B[dg];W[cg];B[ee];W[pn];B[qn];W[op];
+B[po];W[ha];B[ja];W[kb];B[kc];W[mb];B[lc];W[jf];B[lb];W[he];B[pb];
+W[pa];B[la];W[ob];B[nc];W[nb];B[ma];W[qa];B[mc];W[oa];B[ne];W[oe];
+B[mf];W[le];B[od];W[me];B[nf];W[of];B[mg];W[og];B[mh];W[pf];B[mj];
+W[li];B[nh];W[oh];B[nj];W[oi];B[sj];W[sl];B[ml];W[on];B[ql];W[sk];
+B[sm];W[rk];B[nl];W[lp];B[kp];W[mn];B[ol];W[aj];B[ak];W[ai];B[de];
+W[ce];B[ko];W[in];B[kn];W[lm];B[km];W[ll];B[ln];W[pl];B[mm];W[nn];
+B[pm];W[pk];B[mp];W[lk];B[oj];W[pj];B[lh];W[kh];B[lj];W[jr];B[kr];
+W[iq];B[js];W[ir];B[mk];W[fe];B[gg];W[dh];B[eh];W[ed];B[cj];W[di];
+B[ff];W[df];B[ef];W[is];B[ks];W[jp];B[kq];W[hf];B[ok];W[qe];B[lf];
+W[ke];B[ia];W[ga];B[ic];W[ih];B[hh];W[id];B[cc];W[cd];B[db];W[bc];
+B[bb];W[ad];B[ab];W[dc];B[cb];W[eb];B[da];W[ba];B[ei];W[mi];B[ni];
+W[ki];B[im];W[jn];B[kk];W[kl];B[kj];W[je];B[ld];W[jg];B[lg];W[pe];
+B[kg];W[kd];B[if];W[jo];B[dm];W[dl];B[tt];W[tt]
+C[final_score: B+2.5
+D19 removed
+L18 removed
+T10 removed
+P7 removed
+M5 removed
+O4 removed
+A3 removed
+G3 removed]
+)
diff --git a/regression/games/nngs/guestn-gnugo-3.3.17-200304200323.sgf b/regression/games/nngs/guestn-gnugo-3.3.17-200304200323.sgf
new file mode 100644 (file)
index 0000000..beeca57
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[guestn]WR[NR]
+PB[GnuGo (GNU Go 3.3.17)]BR[11k*]
+PC[NNGS]DT[2003-04-20]AP[gnugoclient:2.0]
+RE[W+2.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qe];W[of];B[nd];W[ph];B[mf];W[qn];B[qo];W[on];B[np];W[nl]
+;B[rf];W[qg];B[rn];W[qm];B[nj];W[lj];B[cn];W[mh];B[kh];W[lh];B[kl]
+;W[ll];B[km];W[kk];B[jk];W[lp];B[gq];W[mo];B[kq];W[lq];B[eq];W[oq]
+;B[op];W[nr];B[rm];W[ql];B[rl];W[rp];B[ro];W[qq];B[rj];W[qk];B[rh]
+;W[rg];B[rk];W[re];B[rd];W[sf];B[ng];W[qi];B[qj];W[ri];B[cf];W[nh]
+;B[kg];W[fc];B[fe];W[hd];B[ic];W[hf];B[hh];W[gg];B[nf];W[og];B[db]
+;W[eb];B[dc];W[fd];B[ge];W[he];B[eh];W[hc];B[jo];W[eg];B[ff];W[fg]
+;B[gb];W[df];B[ee];W[de];B[ef];W[cg];B[ce];W[dg];B[ed];W[ci];B[cj]
+;W[di];B[ei];W[ej];B[dh];W[ch];B[gh];W[fi];B[fh];W[fk];B[hb];W[cl]
+;B[bj];W[dl];B[bg];W[bh];B[bl];W[bm];B[hg];W[gf];B[bf];W[bk];B[bn]
+;W[al];B[fm];W[em];B[gl];W[fl];B[fn];W[je];B[ke];W[jf];B[lr];W[mr]
+;B[kr];W[an];B[bo];W[ao];B[ap];W[am];B[bp];W[gk];B[hl];W[en];B[hk]
+;W[eo];B[fo];W[kf];B[lf];W[kd];B[le];W[jc];B[jb];W[id];B[ib];W[kb]
+;B[fb];W[ec];B[ea];W[nb];B[oe];W[pb];B[qb];W[qc];B[rb];W[qd];B[pc]
+;W[pe];B[ob];W[rc];B[lc];W[kc];B[lb];W[ld];B[md];W[ki];B[ji];W[jh]
+;B[kj];W[li];B[jg];W[lg];B[ig];W[la];B[ma];W[ka];B[mb];W[dk];B[gi]
+;W[fj];B[ln];W[mn];B[lm];W[mm];B[lk];W[mk];B[kk];W[ml];B[sc];W[sd]
+;B[sb];W[gm];B[ep];W[kp];B[ah];W[ai];B[ag];W[aj];B[ja];W[jd];B[gj]
+;W[bi];B[ko];W[ck];B[do];W[if];B[ms];W[ns];B[ls];W[dn];B[lo];W[mp]
+;B[cm];W[dm];B[gd];W[gc];B[mg];W[];B[]C[final_score: W+2.5
+O18 removed
+Q18 removed
+K12 removed
+S12 removed
+O10 removed
+Q10 removed
+G7 removed
+O4 removed]
+)
diff --git a/regression/games/nngs/guestu-gnugo-3.3.19-200305131943.sgf b/regression/games/nngs/guestu-gnugo-3.3.19-200305131943.sgf
new file mode 100644 (file)
index 0000000..5749029
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[guestu]WR[NR]
+PB[GnuGo (GNU Go 3.3.19)]BR[10k*]
+PC[NNGS]DT[2003-05-13]AP[gnugoclient:2.0]
+RE[B+0.5]
+;B[pd];W[dp];B[pp];W[dd];B[fc];W[hc];B[cc];W[dc];B[cd];W[ce];B[cb]
+;W[de];B[fe];W[db];B[be];W[bf];B[ad];W[ef];B[bc];W[he];B[gf];W[if]
+;B[gh];W[ih];B[fq];W[hq];B[cq];W[cp];B[dq];W[ep];B[fr];W[go];B[fi]
+;W[fg];B[gd];W[hd];B[gg];W[dh];B[cj];W[dj];B[dk];W[ej];B[ci];W[eh]
+;B[pj];W[nd];B[pf];W[mp];B[pn];W[nq];B[oc];W[nc];B[kd];W[le];B[or]
+;W[hj];B[nm];W[ng];B[ph];W[nr];B[lm];W[cl];B[ch];W[cg];B[ck];W[bl]
+;B[kp];W[kr];B[kn];W[kq];B[oq];W[ni];B[ob];W[nb];B[mj];W[mi];B[im]
+;W[gl];B[jj];W[kh];B[bq];W[bp];B[na];W[ma];B[oa];W[lc];B[mb];W[lb]
+;B[la];W[kb];B[ka];W[ja];B[ma];W[jb];B[da];W[ea];B[ca];W[fb];B[is]
+;W[ir];B[ns];W[ms];B[os];W[hs];B[jp];W[ip];B[lj];W[oj];B[ok];W[pi]
+;B[qi];W[oi];B[pk];W[oe];B[pe];W[ik];B[ij];W[hi];B[jk];W[il];B[jl]
+;W[hm];B[in];W[hn];B[io];W[ho];B[ap];W[ao];B[aq];W[eq];B[er];W[mn]
+;B[no];W[mo];B[np];W[mq];B[fp];W[fo];B[mc];W[md];B[jq];W[iq];B[jr]
+;W[js];B[of];W[nf];B[od];W[ne];B[mm];W[nn];B[on];W[lp];B[lo];W[ln]
+;B[ko];W[ki];B[li];W[lh];B[nj];W[kj];B[kk];W[og];B[pg];W[gr];B[ls]
+;W[lr];B[mr];W[ks];B[lq];W[is];B[ms];W[fs];B[es];W[gs];B[gp];W[hp]
+;B[oh];W[nh];B[ji];W[jh];B[bo];W[an];B[eo];W[do];B[en];W[bn];B[bh]
+;W[af];B[bk];W[dn];B[ae];W[em];B[cr];W[gq];B[ii];W[fn];B[hk];W[hl]
+;B[hh];W[gk];B[]C[final_score: B+0.5
+F17 removed
+G16 removed
+L16 removed
+F15 removed
+G14 removed
+B12 removed
+F11 removed
+B5 removed]
+)
diff --git a/regression/games/nngs/halti-gnugo-3.3.17-200303162357.sgf b/regression/games/nngs/halti-gnugo-3.3.17-200303162357.sgf
new file mode 100644 (file)
index 0000000..2507eba
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[halti]WR[4k*]
+PB[GnuGo (GNU Go 3.3.17)]BR[10k*]
+PC[NNGS]DT[2003-03-16]AP[gnugoclient:2.0]
+RE[W+12.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nc];B[pf];W[fd];B[df];W[jf];B[ec];W[fc];B[ie];W[gg];B[fi];W[if]
+;B[hj];W[mf];B[ph];W[nq];B[oq];W[np];B[pn];W[mm];B[lq];W[pl];B[km]
+;W[om];B[gq];W[cp];B[co];W[bo];B[cq];W[bp];B[cn];W[dq];B[dr];W[eq]
+;B[bq];W[ep];B[er];W[do];B[bn];W[gp];B[em];W[hq];B[ir];W[gr];B[hp]
+;W[fr];B[ap];W[ao];B[hr];W[iq];B[ip];W[fq];B[br];W[fo];B[en];W[ho]
+;B[cs];W[jq];B[jr];W[kq];B[kr];W[kp];B[mr];W[nr];B[or];W[jo];B[ns]
+;W[eg];B[dg];W[eh];B[hc];W[lc];B[ge];W[fe];B[ld];W[md];B[kc];W[le]
+;B[kd];W[lb];B[gb];W[fb];B[ib];W[cc];B[eb];W[be];B[cd];W[bd];B[dh]
+;W[bg];B[hh];W[gf];B[mo];W[lp];B[mp];W[mq];B[lr];W[no];B[lo];W[on]
+;B[qk];W[kn];B[pb];W[ei];B[ej];W[di];B[ci];W[ch];B[bi];W[fa];B[ql]
+;W[he];B[ha];W[id];B[ic];W[je];B[kb];W[kl];B[jm];W[lm];B[hm];W[qm]
+;B[pm];W[po];B[qn];W[qo];B[rm];W[rn];B[qr];W[qm];B[an];W[aq];B[ar]
+;W[ja];B[ka];W[gm];B[gn];W[fn];B[fm];W[gl];B[hn];W[dn];B[dm];W[cm]
+;B[ap];W[dp];B[bm];W[cl];B[bl];W[dl];B[el];W[ek];B[ck];W[hl];B[il]
+;W[qc];B[pc];W[qe];B[pe];W[rf];B[qd];W[qi];B[pi];W[rd];B[rh];W[rg]
+;B[ri];W[rb];B[qb];W[rc];B[sg];W[ra];B[mi];W[kj];B[ki];W[ji];B[lj]
+;W[kk];B[jk];W[kh];B[li];W[jh];B[in];W[io];B[sl];W[qg];B[pg];W[qh]
+;B[rj];W[qj];B[pk];W[sn];B[ll];W[rq];B[mk];W[rr];B[qq];W[ps];B[qs]
+;W[qp];B[bh];W[cg];B[nl];W[os];B[pr];W[os];B[ms];W[op];B[hs];W[rs]
+;B[ol];W[pm];B[ag];W[af];B[nb];W[mc];B[ah];W[bb];B[gd];W[gc];B[hd]
+;W[jb];B[ie];W[hf];B[ga];W[fj];B[fh];W[ef];B[mg];W[lg];B[ng];W[hi]
+;B[ii];W[gi];B[gh];W[gj];B[ih];W[pq];B[lh];W[kg];B[ps];W[os];B[sh]
+;W[sf];B[nm];W[nn];B[ml];W[jn];B[jl];W[de];B[qf];W[re];B[sm];W[go]
+;B[im];W[eo];B[dk];W[nf];B[of];W[ig];B[ke];W[kf];B[oc];W[la];B[id]
+;W[qa];B[oe];W[ne];B[fg];W[ff];B[ij];W[es];B[pa];W[na];B[oa];W[ma]
+;B[aq];W[fs];B[ds];W[nd];B[gs];W[mb];B[ob];W[hg];B[od];W[];B[]
+C[final_score: W+12.5
+K19 removed
+E18 removed
+C16 removed
+D14 removed
+G11 removed
+L10 removed
+E9 removed
+G8 removed
+M5 removed]
+)
diff --git a/regression/games/nngs/huck-gnugo-3.3.6-200209060837.sgf b/regression/games/nngs/huck-gnugo-3.3.6-200209060837.sgf
new file mode 100644 (file)
index 0000000..83bd11f
--- /dev/null
@@ -0,0 +1,52 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[huck]WR[3k]
+PB[GnuGo (GNU Go 3.3.6)]BR[12k*]
+PC[NNGS]DT[2002-09-06]AP[gnugoclient:2.0]
+RE[W+102.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nd];W[nq];B[np];W[mp];B[no];W[oq];B[pq];W[lq];B[pn];W[nj]
+;B[pl];W[ld];B[gp];W[dm];B[cl];W[cf];B[ce];W[df];B[fd];W[dh];B[be]
+;W[cp];B[cq];W[dq];B[co];W[bp];B[bq]C[L:8];W[bo];B[eo]C[L:9];W[cm]
+;B[cn];W[bn];B[eq];W[dr];B[er]C[L:10];W[en];B[kr];W[do];B[ep];W[ln]
+;B[mm];W[qj];B[qi];W[pi];B[qk];W[rj];B[oi];W[ph];B[ri];W[oj];B[pk]
+;W[rh];B[si];W[qh];B[sj];W[nh];B[me];W[lc];B[pf];W[qe];B[kb];W[lb]
+;B[ke];W[jc];B[jb];W[ic];B[kc];W[kd];B[ib];W[id];B[je];W[le];B[qd]
+;W[oc];B[ie]C[L:9];W[mf];B[nf]C[L:7];W[mg];B[pb]C[L:8];W[pc];B[ob]
+C[L:7];W[nc];B[qc];W[od];B[oe]C[L:8];W[md];B[pe]C[L:9];W[he];B[hd]
+C[L:10];W[hc];B[gd];W[fj];B[ek];W[gl];B[bl]C[L:9];W[bi];B[re]C[L:10]
+;W[rf];B[ne];W[kf];B[jg];W[jf];B[if];W[ig];B[hf];W[hg];B[gf];W[lk]
+;B[jl];W[jn];B[lj]C[L:9];W[mk];B[jh]C[L:8];W[gg];B[kk]C[L:9];W[lm]
+;B[im]C[L:10];W[ho];B[sd];W[nb];B[hp];W[io];B[gm];W[fl];B[mr]C[L:9]
+;W[lr];B[ls]C[L:10];W[mq];B[ll];W[ml];B[kl]C[L:8];W[mn];B[nm]C[L:9]
+;W[nn];B[nl];W[jq];B[kq]C[L:7];W[ni];B[ip]C[L:8];W[kp];B[ko];W[lp]
+;B[jr]C[L:9];W[jo];B[pr]C[L:10];W[gn];B[hl];W[ik];B[kg]C[L:8];W[lf]
+;B[ki]C[L:9];W[ff];B[fm]C[L:8];W[fn];B[ii]C[L:9];W[ge];B[hb]C[L:10]
+;W[gc];B[gb];W[fc];B[ec];W[fb];B[eb];W[fa];B[ea];W[fe];B[el];W[em]
+;B[hm];W[gj];B[ed];W[hk];B[lh];W[jk];B[nr];W[or];B[os];W[ms];B[ns]
+;W[oa];B[qb];W[og];B[bf];W[bg];B[aq];W[ap];B[ds];W[on];B[nk];W[mj]
+;B[pa];W[sf];B[na];W[ma];B[mo];W[lo];B[oo];W[se];B[rd];W[sb];B[km]
+;W[kn];B[sh];W[rb];B[sg];W[rg];B[sk];W[ra];B[op];W[om];B[pm];W[fo]
+;B[fp];W[de];B[ag];W[ah];B[af];W[cd];B[cb];W[cc];B[bb];W[db];B[bd]
+;W[ee];B[bc];W[hi];B[ih];W[ij];B[hh];W[gh];B[pg];W[ng];B[ok];W[cr]
+;B[br];W[mi];B[go];W[hn];B[ol];W[li];B[lg];W[kj];B[];W[lj];B[]
+C[L11 removed
+K12 removed
+K10 removed
+L8 removed
+E9 removed
+D10 removed
+C8 removed
+final_score: W+102.5
+O19 removed
+Q19 removed
+D18 removed
+G18 removed
+C17 removed
+P11 removed
+R10 removed
+H8 removed
+C6 removed
+D3 removed
+K3 removed]
+)
diff --git a/regression/games/nngs/joshj-gnugo-3.3.16-200302232226.sgf b/regression/games/nngs/joshj-gnugo-3.3.16-200302232226.sgf
new file mode 100644 (file)
index 0000000..e4764dc
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[joshj]WR[10k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-23]AP[gnugoclient:2.0]
+RE[B+Resign]
+;B[qd];W[pp];B[dd];W[do];B[qn];W[nq];B[rp];W[cq];B[oc];W[jc];B[qj]
+;W[pg];B[qq];W[pq];B[cm];W[cf];B[fd];W[gc];B[fc];W[gb];B[cj];W[di]
+;B[gd];W[hd];B[ef];W[bd];B[em];W[gp];B[ci];W[dg];B[ch];W[dh];B[dj]
+;W[cc];B[dc];W[eb];B[db];W[cb];B[lc];W[hg];B[on];W[qi];B[ri];W[qh]
+;B[kn];W[kp];B[io];W[jo];B[ip];W[jn];B[hn];W[fm];B[fn];W[en];B[gm]
+;W[fl];B[fo];W[ep];B[hk];W[im];B[fj];W[gl];B[hl];W[hm];B[fp];W[gn]
+;B[fq];W[go];B[hr];W[gq];B[gr];W[eq];B[jr];W[kr];B[hi];W[pj];B[qk]
+;W[rh];B[sj];W[pk];B[pl];W[jj];B[bo];W[dm];B[le];W[cn];B[bm];W[ne]
+;B[ca];W[ba];B[da];W[ce];B[fb];W[fa];B[ea];W[ga];B[bb];W[bc];B[aa]
+;W[ac];B[lg];W[nc];B[nb];W[od];B[pc];W[mc];B[lb];W[mb];B[mh];W[ni]
+;B[kf];W[ih];B[ma];W[ee];B[de];W[fe];B[df];W[cg];B[ge];W[ff];B[he]
+;W[id];B[ib];W[ic];B[if];W[je];B[kd];W[jf];B[jg];W[ig];B[eg];W[fg]
+;B[ii];W[jh];B[eh];W[ei];B[kg];W[fh];B[ie];W[jd];B[hb];W[hc];B[jb]
+;W[ed];B[ec];W[hf];B[ej];W[gf];B[fi];W[cd];B[kc];W[ab];B[ke];W[ba]
+;B[ha];W[ji];B[jk];W[kk];B[jl];W[kl];B[kj];W[ki];B[lj];W[li];B[mi]
+;W[mj];B[lk];W[ll];B[mk];W[nj];B[ml];W[lm];B[nh];W[nl];B[mm];W[nm]
+;B[mn];W[nn];B[oh];W[mo];B[lo];W[ik];B[il];W[ij];B[gh];W[hj];B[gk]
+;W[gj];B[km];W[gi];B[er];W[eo];B[fr];W[hh];B[kq];W[lq];B[jq];W[lp]
+;B[el];W[fk];B[jm];W[in];B[dr];W[dl];B[ek];W[gm];B[bn];W[bk];B[ck]
+;W[cl];B[bl];W[bp];B[cr];W[br];B[bs];W[ko];B[ln];W[ll];B[pi];W[ph]
+;B[no];W[mp];B[oi];W[kl];B[nk];W[ol];B[ok];W[pm];B[om])
diff --git a/regression/games/nngs/joshj-gnugo-3.3.2-200205310709.sgf b/regression/games/nngs/joshj-gnugo-3.3.2-200205310709.sgf
new file mode 100644 (file)
index 0000000..c615252
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[joshj]WR[12k*]
+PB[GnuGo (GNU Go 3.3.2)]BR[14k*]
+PC[NNGS]DT[2002-05-31]AP[gnugoclient:2.0]
+RE[B+Resign]
+AB[pd][dp]
+;W[pq];B[qo];W[mq];B[cc];W[ec];B[ql];W[de];B[be];W[cf];B[gc];W[fd]
+;B[he];W[bf];B[eb];W[db];B[qi];W[cn];B[fq];W[dj];B[bo];W[nc];B[ne]
+;W[kc];B[fb];W[qc];B[dc];W[dd];B[qd];W[pc];B[iq];W[bd];B[bc];W[ae]
+;B[en];W[bn];B[co];W[pg];B[oh];W[ph];B[pi];W[od];B[oe];W[og];B[pf]
+;W[rg];B[ng]C[L:8];W[nh];B[oi];W[rd];B[of]C[L:9];W[qg];B[mh];W[mg]
+;B[ni];W[je];B[ic]C[L:8];W[jd];B[rq]C[L:9];W[qr];B[dl]C[L:7];W[cl]
+;B[fl];W[go];B[io];W[mn];B[re]C[L:6];W[qe];B[pe]C[L:7];W[qf];B[rc]
+C[L:6];W[qn];B[pn]C[L:4];W[rn];B[qm];W[po];B[qp];W[pp];B[on]C[L:5]
+;W[sk];B[ro];W[sn];B[so];W[sl];B[rm];W[sm];B[rl]C[L:4];W[rk];B[qk]
+C[L:3];W[si];B[rj];W[il];B[rb]C[L:4];W[qb];B[hg]C[L:5];W[hn];B[ef]
+C[L:4];W[df];B[fg];W[hp];B[jr];W[ip];B[hq];W[eo];B[dk]C[L:2];W[ck]
+;B[jp];W[jo];B[do];W[fp];B[eq];W[dn];B[fn];W[kp];B[kq]C[L:1];W[jq]
+;B[dg]C[L:2];W[cg];B[dh]C[L:3];W[ch];B[ej]C[L:4];W[cj];B[fj]C[L:5]
+;W[gq];B[fo];W[gr];B[fr];W[fs];B[es];W[gs];B[mf];W[lg];B[lf]C[L:6]
+;W[kf];B[kg];W[jg];B[kh]C[L:7];W[jh];B[jb]C[L:6];W[kb];B[ki];W[hd]
+;B[id]C[L:5];W[ie];B[gd];W[ge];B[hf]C[L:6];W[fc];B[gb]C[L:5];W[ff]
+;B[kl]C[L:6];W[km];B[lm]C[L:4];W[ln];B[mm]C[L:3];W[nn];B[nm]C[L:4]
+;W[jc];B[ib]C[L:5];W[gp];B[oo]C[L:4];W[ep];B[dr];W[ao];B[ap]C[L:5]
+;W[cq];B[dq];W[bq];B[cr]C[L:6];W[bp];B[an]C[L:4];W[am];B[ao]C[L:5]
+;W[bm];B[jm]C[L:6];W[kn];B[jl]C[L:4];W[im];B[ka]C[L:5];W[la];B[ja]
+;W[lb];B[cd]C[L:6];W[ce];B[ee];W[fe];B[ac];W[ed];B[eg];W[gi];B[ji]
+;W[gg];B[gf]C[L:7];W[gh];B[fh]C[L:5];W[ei];B[fi]C[L:6];W[di];B[hh]
+C[L:7];W[hj];B[gj]C[L:6];W[hi];B[hk]C[L:7];W[ij];B[ik]C[L:6];W[em]
+;B[fm];W[dm];B[ra];W[gl];B[gk];W[gm];B[rr];W[ek];B[el]C[L:4];W[gn]
+;B[fk]C[L:5];W[if];B[ih]C[L:6];W[ig];B[ii]C[L:7])
diff --git a/regression/games/nngs/joshj-gnugo-3.5.2-200312100558.sgf b/regression/games/nngs/joshj-gnugo-3.5.2-200312100558.sgf
new file mode 100644 (file)
index 0000000..3500ddd
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[joshj]WR[8k*]
+PB[GnuGo (GNU Go 3.5.2)]BR[8k*]
+PC[NNGS]DT[2003-12-10]AP[gnugoclient:2.0]
+RE[B+20.5]
+AB[dd][pd][dp]
+;W[pq];B[qo];W[mp];B[ql];W[qf];B[nd];W[rd];B[qh];W[qc];B[qe];W[re]
+;B[pf];W[qd];B[kq];W[pe];B[hq];W[eq];B[dq];W[ep];B[eo];W[gp];B[ko]
+;W[fo];B[en];W[od];B[gm];W[hn];B[lc];W[pg];B[hd];W[dj];B[ch];W[ci]
+;B[dh];W[cm];B[co];W[fn];B[fm];W[em];B[fj];W[dn];B[do];W[ej];B[fi]
+;W[jd];B[jc];W[fc];B[fd];W[ic];B[id];W[hc];B[kd];W[dc];B[ec];W[eb]
+;B[gc];W[ed];B[ee];W[gb];B[je];W[gd];B[ec];W[cc];B[ge];W[be];B[mr]
+;W[nq];B[ed];W[fg];B[hg];W[bi];B[il];W[jn];B[rq];W[qr];B[of];W[pc]
+;B[oi];W[og];B[nf];W[qg];B[rg];W[rf];B[rh];W[nh];B[el];W[dm];B[jb]
+;W[bq];B[er];W[gq];B[gr];W[fr];B[dr];W[hr];B[br];W[iq];B[mo];W[no]
+;B[ir];W[gs];B[jq];W[ip];B[lh];W[nc];B[md];W[ji];B[lj];W[gh];B[eh]
+;W[hi];B[dl];W[cl];B[fl];W[jk];B[jl];W[kk];B[ik];W[ij];B[kl];W[lk]
+;B[eg];W[ff];B[gc];W[fb];B[ih];W[mj];B[li];W[ml];B[lp];W[mn];B[lo]
+;W[jr];B[kr];W[js];B[mq];W[np];B[nr];W[or];B[jp];W[jo];B[rr];W[on]
+;B[nk];W[mk];B[nm];W[nn];B[nl];W[mm];B[bn];W[bm];B[mb];W[mg];B[ob]
+;W[oc];B[jh];W[lf];B[ks];W[is];B[an];W[pj];B[oj];W[pl];B[pk];W[qk]
+;B[ok];W[qm];B[qj];W[rl];B[rj];W[so];B[qi];W[rp];B[am];W[al];B[bk]
+;W[ck];B[bl];W[bj];B[ak];W[aj];B[al];W[cn];B[bp];W[bh];B[rk];W[ql]
+;B[bg];W[ag];B[bf];W[af];B[ce];W[bd];B[ib];W[hb];B[gg];W[fh];B[ei]
+;W[di];B[dk];W[cj];B[ah];W[ae];B[ek];W[hm];B[cd];W[bc];B[hh];W[gi]
+;B[nb];W[hk];B[hl];W[gk];B[gl];W[fk];B[ra];W[rb];B[qa];W[mi];B[gj]
+;W[hj];B[gn];W[go];B[ef];W[gf];B[hf];W[jf];B[kf];W[kg];B[ke];W[lg]
+;B[kh];W[jg];B[os];W[ps];B[ns];W[le];B[ai];W[ld];B[mc];W[pb];B[pa]
+;W[ne];B[me];W[oe];B[mf];W[ng];B[sf];W[se];B[sg];W[if];B[sl];W[sm]
+;B[sk];W[ph];B[pi];W[ie];B[he];W[fe];B[gd];W[km];B[ha];W[ga];B[ia]
+;W[ki];B[ii];W[jj];B[om];W[pn];B[pm];W[qn];B[im];W[in];B[sb];W[sc]
+;B[qb];W[rc];B[ll];W[lm];B[es];W[fs];B[jm];W[kn];B[mh];W[ni];B[oh]
+;W[sa];B[oa];W[ln];B[sb];W[kj];B[sa];W[nj];B[ig];W[ol];B[]
+C[final_score: B+20.5
+R5 removed
+B3 removed
+H3 removed
+S3 removed])
diff --git a/regression/games/nngs/joshj-gnugo-3.5.2gf1-200312171536.sgf b/regression/games/nngs/joshj-gnugo-3.5.2gf1-200312171536.sgf
new file mode 100644 (file)
index 0000000..70872d2
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[joshj]WR[8k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-17]AP[gnugoclient:2.0]
+AB[dd][pd][dp]
+;W[qp];B[op];W[oo];B[no];W[po];B[mp];W[pj];B[qh];W[nc];B[lc];W[md]
+;B[mm];W[qe];B[qd];W[pe];B[od];W[of];B[rj];W[ql];B[ke];W[ld];B[kd]
+;W[pb];B[rb];W[rd];B[mf];W[ne];B[jc];W[cf];B[ef];W[ge];B[fd];W[hd]
+;B[hc];W[ic];B[ib];W[gc];B[id];W[gd];B[gg];W[hf];B[hg];W[hb];B[gb]
+;W[ic];B[ga];W[hc];B[jb];W[fe];B[jp];W[gq];B[go];W[dr];B[fr];W[eq]
+;B[gr];W[fq];B[iq];W[hp];B[ha];W[ed];B[ec];W[fc];B[ee];W[if];B[kg]
+;W[jg];B[eh];W[kh];B[jh];W[kf];B[lg];W[ih];B[ji];W[ig];B[lf];W[ii]
+;B[ki];W[fd];B[fb];W[de];B[cc];W[cd];B[dc];W[ch];B[ej];W[ik];B[be]
+;W[ce];B[bd];W[ck];B[el];W[dm];B[gi];W[ho];B[pq];W[qq];B[pr];W[gn]
+;B[qr];W[om];B[cj];W[bj];B[dk];W[cl];B[fk];W[ci];B[dj];W[bq];B[ij]
+;W[hj];B[jj];W[hi];B[hk];W[gk];B[fo];W[hl];B[do];W[en];B[fn];W[gm]
+;B[em];W[dn];B[fm];W[eo];B[rr];W[rq];B[oh];W[lh];B[mh];W[li];B[lj]
+;W[mi];B[nj];W[nh];B[ng];W[jk];B[kj];W[mg];B[nk];W[og];B[nf];W[ph]
+;B[oe];W[oi];B[rc];W[re];B[qc];W[qb];B[nd];W[mc];B[lb];W[mb];B[me]
+;W[ob];B[na];W[la];B[qk];W[pk];B[rl];W[qj];B[rh];W[rk];B[mj];W[ni]
+;B[bf];W[bg];B[gj];W[gl];B[jn];W[km];B[er];W[dq];B[kn];W[lm];B[nm]
+;W[ln];B[lo];W[mn];B[pp];W[nn];B[sq];W[ro];B[sp];W[so];B[mo];W[jm]
+;B[in];W[hn];B[im];W[il];B[ie];W[he];B[jf];W[dl];B[ff];W[fl];B[hq]
+;W[gp];B[es];W[ds];B[dg];W[di];B[cg];W[ei];B[fi];W[dh];B[bh];W[bi]
+;B[hh];W[ah];B[ek];W[rp];B[eg];W[sr];B[gf];W[io];B[hk];W[hj];B[ol]
+;W[pl];B[hi];W[ok];B[nl];W[jo];B[ko];W[lq];B[kr];W[lr];B[nr];W[kq]
+;B[kp];W[jq];B[ip];W[jr];B[ir];W[mh];B[sd];W[se];B[sc])
diff --git a/regression/games/nngs/juka-gnugo-3.1.16-200112142153.sgf b/regression/games/nngs/juka-gnugo-3.1.16-200112142153.sgf
new file mode 100644 (file)
index 0000000..957ea65
--- /dev/null
@@ -0,0 +1,40 @@
+(;FF[4]GM[1]SZ[19]HA[9]KM[0.5]PW[juka]WR[1d*]PB[GnuGo (GNU Go 3.1.16)]BR[14k*]PC[NNGS]DT[2001-12-14]RE[W+99.5]AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]\r
+;W[gp];B[dn];W[pn];B[np];W[lp]C[K6|O6];B[ho];W[go]C[#M3 is antisuji!\r
+!M3];B[lq];W[kq];B[kp];W[mq];B[lo]C[L:7]\r
+;W[mp]C[#Egads, don't tenuki here!\r
+N5];B[qf]C[L:6];W[dl]C[!C8];B[cl]C[L:7];W[cm];B[dm];W[ck];B[el]C[L:6];W[dk];B[bl];W[bk]\r
+;B[bm]C[L:7];W[ek];B[eq];W[hn];B[gn]C[L:6];W[in];B[jn]C[L:4];W[eo];B[do]C[L:3];W[io];B[hp]\r
+;W[ip];B[hq];W[iq];B[hr];W[ir];B[gq]C[L:4];W[fn];B[gm]C[L:5];W[fm];B[fl]C[L:4];W[gl];B[hm]\r
+;W[il];B[hl];W[gk];B[hk];W[em];B[oc];W[im];B[cf]C[L:5];W[hc];B[ec];W[ld];B[ie]C[L:6]\r
+;W[he];B[qo]C[L:5];W[qn];B[ql]C[L:3];W[hf];B[ik]C[L:4];W[kl];B[og];W[pi];B[dh];W[pg];B[kc]C[L:3]\r
+;W[lc];B[bi]C[L:4];W[gj];B[kb];W[lb];B[la]C[L:5];W[nb];B[nc];W[ma];B[ke]C[L:4];W[le];B[lf]\r
+;W[mf];B[me]C[L:2];W[ka];B[ph];W[qh];B[oh]C[L:1];W[qg];B[gh];W[hh];B[hi];W[gi];B[jb]\r
+;W[mc];B[ob];W[lg];B[lj];W[pf];B[nf];W[kf];B[qe];W[oi];B[qi];W[qj];B[om];W[ro]\r
+;B[rp]C[L:0];W[po];B[qp];W[no];B[nq];W[mo];B[nm];W[rn];B[ri];W[rj];B[jq];W[qc];B[ko]\r
+;W[jk];B[lr];W[mr];B[kk];W[jl];B[ii];W[ml];B[ll];W[lm];B[lk];W[ln];B[mm];W[mn]\r
+;B[rd];W[rc];B[ra];W[ni];B[pk];W[fh];B[pe];W[qa];B[nl];W[nk];B[of];W[rh];B[nd]\r
+;W[rf];B[qb];W[re];B[nr]C[L:1];W[rb];B[pa];W[pc];B[sb];W[qd];B[jr];W[ms];B[is]C[L:2]\r
+;W[km];B[rm];W[mk];B[nj]C[L:3];W[pr];B[mg]C[L:2];W[lf];B[mi]C[L:3];W[ns];B[nh]C[L:4];W[si]\r
+;B[gb]C[L:5];W[hb];B[ic]C[L:6];W[gc];B[fb]C[L:7];W[ki];B[ji]C[L:5];W[hj];B[ij]C[L:6];W[kh];B[ih]C[L:5]\r
+;W[kj];B[hg]C[L:6];W[ig];B[fg]C[L:7];W[jh];B[fe]C[L:8];W[hh];B[gg]C[L:9];W[eg];B[ef]C[L:10];W[eh]\r
+;B[if];W[ge];B[jg];W[ih];B[ff];W[ib];B[ei];W[fi];B[qi];W[ri];B[oj];W[qi];B[pb]\r
+;W[sd];B[ha];W[ja];B[dg];W[mh];B[lh];W[li];B[mh]C[L:9];W[mj];B[ej]C[L:10];W[cq];B[bp]C[L:7]\r
+;W[fr];B[fq]C[L:8];W[cp]C[B5];B[dr]C[L:9];W[bo];B[dq]C[L:8];W[bq];B[bn]C[L:9];W[bs];B[co]C[L:10]\r
+;W[ap]C[!A2];B[ar];W[ao];B[cr];W[br];B[fd];W[ls];B[kr];W[ks];B[js];W[cs]C[!E2];B[er]\r
+;W[ds];B[es];W[ia];B[md];W[fc];B[cj];W[aj];B[ai];W[fp];B[gd];W[hd];B[fj];W[fk]\r
+;B[eb];W[ga];B[fa];W[sc];B[ha];W[sa];B[qa];W[na];B[ga];W[sb];B[bj];W[ak];B[kn]\r
+;W[an];B[jm];W[am];B[en];W[al];B[cn];W[ep];B[gf];W[oa];B[oe];W[jo];B[]C[final_score: W+99.5\r
+K18 removed\r
+J17 removed\r
+K16 removed\r
+J15 removed\r
+L15 removed\r
+K13 removed\r
+O10 removed\r
+O8 removed\r
+R8 removed\r
+S7 removed\r
+R5 removed\r
+O4 removed\r
+A2 removed\r
+F2 removed])\r
diff --git a/regression/games/nngs/juka-gnugo-3.3.16-200302072106.sgf b/regression/games/nngs/juka-gnugo-3.3.16-200302072106.sgf
new file mode 100644 (file)
index 0000000..bbb9ff7
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[juka]WR[1k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-07]AP[gnugoclient:2.0]
+RE[W+84.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fq];B[dn];W[dl];B[nq];W[gn];B[dg];W[cq];B[cp];W[dq];B[ep];W[fp]
+;B[eq];W[er];B[jn];W[fl];B[ck];W[cl];B[bo];W[bq];B[hk];W[fj];B[hi]
+;W[fh];B[gg];W[jm];B[im];W[in];B[kn];W[il];B[ll];W[kk];B[li];W[lk]
+;B[nl];W[mk];B[jk];W[kl];B[hm];W[ml];B[qf];W[hn];B[jl];W[km];B[gm]
+;W[fm];B[gk];W[ej];B[fc];W[dh];B[ch];W[eg];B[df];W[di];B[ci];W[pl]
+;B[nh];W[lg];B[mh];W[jh];B[kg];W[kh];B[mm];W[nm];B[om];W[nn];B[mn]
+;W[mo];B[ln];W[nk];B[ol];W[ok];B[pk];W[ql];B[on];W[no];B[lp];W[oo]
+;B[pn];W[po];B[qn];W[qo];B[rn];W[ro];B[rm];W[rl];B[lh];W[ig];B[kf]
+;W[hh];B[gh];W[gi];B[ii];W[gf];B[oc];W[hf];B[pr];W[qc];B[qd];W[qh]
+;B[rc];W[oi];B[pg];W[pi];B[hd];W[mc];B[jg];W[ih];B[kj];W[ob];B[nb]
+;W[nc];B[pb];W[mb];B[oa];W[ic];B[id];W[jc];B[hc];W[ib];B[hb];W[kb]
+;B[ja];W[ia];B[lc];W[ld];B[kd];W[kc];B[lf];W[cc];B[cd];W[bd];B[be]
+;W[bb];B[ad];W[ac];B[db];W[cb];B[ae];W[dc];B[eb];W[qq];B[bk];W[bl]
+;B[pq];W[qr];B[io];W[jr];B[lr];W[iq];B[rg];W[kq];B[ri];W[rh];B[sh]
+;W[qj];B[lq];W[ip];B[ho];W[go];B[qs];W[kp];B[lo];W[ks];B[rr];W[rq]
+;B[al];W[am];B[ak];W[bm];B[ko];W[ns];B[ls];W[nr];B[kr];W[jq];B[js]
+;W[hr];B[jo];W[le];B[me];W[md];B[hp];W[gr];B[ne];W[ed];B[ec];W[ef]
+;B[ee];W[fe];B[fd];W[dk];B[cj];W[ma];B[is];W[np];B[oq];W[mp];B[qp]
+;W[rp];B[mq];W[sq];B[rs];W[sr];B[so];W[sm];B[sn];W[sl];B[ge];W[ff]
+;B[gj];W[fi];B[rj];W[qi];B[gl];W[si];B[sg];W[qk];B[he];W[jf];B[ke]
+;W[na];B[ob];W[qg];B[re];W[oh];B[og];W[ha];B[ga];W[fk];B[nd];W[ni]
+;B[lj];W[mj];B[je];W[if];B[mi];W[rk];B[sj];W[sk];B[si];W[];B[ji]
+;W[ki];B[ph];W[ie];B[]C[final_score: W+84.5
+K19 removed
+B18 removed
+A17 removed
+M17 removed
+R17 removed
+B16 removed
+G13 removed
+M13 removed
+Q10 removed
+J8 removed
+M8 removed
+O8 removed
+N7 removed
+D6 removed
+B5 removed
+C4 removed
+S2 removed
+J1 removed]
+)
diff --git a/regression/games/nngs/juka-gnugo-3.3.16-200303031959.sgf b/regression/games/nngs/juka-gnugo-3.3.16-200303031959.sgf
new file mode 100644 (file)
index 0000000..1324ffc
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[juka]WR[1k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-03-03]AP[gnugoclient:2.0]
+RE[W+15.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fq];B[eq];W[eo];B[fr];W[gq];B[fp];W[ep];B[gr];W[dq];B[er];W[cq]
+;B[iq];W[gp];B[fo];W[go];B[fn];W[gn];B[cp];W[bp];B[bo];W[co];B[mp]
+;W[nc];B[oc];W[oe];B[nb];W[mc];B[nd];W[od];B[mb];W[lc];B[ne];W[pe]
+;B[gd];W[qd];B[pc]C[L:9];W[qc];B[lb]C[L:10];W[kc];B[jc];W[qb];B[oa]
+;W[pb];B[kb];W[ob];B[qg];W[cf];B[ch];W[qn];B[df];W[cd];B[ce];W[be]
+;B[de];W[cc];B[ql];W[cg];B[pn];W[dg];B[ro];W[fg];B[eb];W[lp];B[lo]
+;W[mo];B[ko];W[oo];B[mq];W[qo];B[po];W[qp];B[qq];W[qm];B[rp];W[pm]
+;B[mn];W[qk];B[pl];W[om];B[rl];W[pq];B[op];W[rq];B[qr];W[rr];B[pr]
+;W[rn];B[rs];W[sp];B[sr];W[so];B[ss];W[mm];B[ap];W[do];B[en];W[gl]
+;B[fl];W[fk];B[gm];W[hm];B[fm];W[im];B[cl];W[ek];B[gk];W[hl];B[cn]
+;W[dn];B[dm];W[dl];B[em];W[bn];B[cm];W[ei];B[gj];W[fi];B[bg];W[bf]
+;B[bh];W[lm];B[hh];W[ok];B[pk];W[fe];B[ol];W[nn];B[no];W[fd];B[dc]
+;W[fc];B[cb];W[bb];B[gc];W[fb];B[nl];W[nm];B[hf];W[di];B[cj];W[qi]
+;B[qj];W[pi];B[oj];W[ri];B[oi];W[pg];B[nf];W[oh];B[nh];W[ng];B[mg]
+;W[og];B[le];W[mh];B[ni];W[lg];B[mf];W[li];B[lj];W[ii];B[ij];W[hi]
+;B[fj];W[ej];B[gi];W[gh];B[gg];W[hj];B[fh];W[eg];B[hk];W[ik];B[gh]
+;W[ji];B[kj];W[ke];B[kd];W[ge];B[he];W[io];B[jl];W[jm];B[gb];W[ga]
+;B[ha];W[fa];B[hb];W[bm];B[bl];W[ao];B[ci];W[al];B[ak];W[am];B[bj]
+;W[dr];B[rj];W[si];B[hq];W[kl];B[jk];W[mk];B[nk];W[mj];B[ki];W[mi]
+;B[kf];W[kh];B[jh];W[jg];B[ig];W[jf];B[je];W[kg];B[ml];W[lk];B[kn]
+;W[km];B[il];W[es];B[dk];W[if];B[ie];W[ln];B[mo];W[fs];B[gs];W[ds]
+;B[hr];W[ip];B[on];W[jo];B[jq];W[el];B[of];W[pf];B[pa];W[qa];B[na]
+;W[sj];B[sk];W[sm];B[sl];W[gf];B[rm];W[jn];B[af];W[ae];B[ag];W[md]
+;B[hp];W[ho];B[ld];W[sn];B[lf];W[lh];B[eh];W[dh];B[ll];W[kk];B[ih]
+;W[sq];B[qs];W[oc];B[nj];W[me];B[]C[final_score: W+15.5
+C18 removed
+E18 removed
+D17 removed
+R13 removed
+R9 removed
+A4 removed
+M4 removed
+Q3 removed]
+)
diff --git a/regression/games/nngs/juka-gnugo-3.5.1-200309161948.sgf b/regression/games/nngs/juka-gnugo-3.5.1-200309161948.sgf
new file mode 100644 (file)
index 0000000..81b189a
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[juka]WR[3d*]
+PB[GnuGo (GNU Go 3.5.1)]BR[8k*]
+PC[NNGS]DT[2003-09-16]AP[gnugoclient:2.0]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fq];B[dq];W[nq];B[fp];W[gp];B[gn];W[fo];B[dn];W[ep];B[hq];W[em]
+;B[en];W[fn];B[fk];W[dm];B[fm];W[cn];B[do];W[co];B[fl];W[cl];B[gr]
+;W[fr];B[io];W[bq];B[eq];W[cr];B[np];W[mp];B[no];W[oq];B[pq];W[kq]
+;B[nc];W[qf];B[mo];W[lp];B[pf];W[pg];B[qe];W[of];B[pe];W[qh];B[mf]
+;W[nh];B[lh];W[rf];B[bj];W[lo];B[rj];W[ne];B[me];W[nd];B[md];W[og]
+;B[oc];W[pn];B[fc];W[nj];B[re];W[op];B[nm];W[po];B[or];W[nr];B[pr]
+;W[ro];B[rp];W[qp];B[rq];W[rs];B[rr];W[qs];B[oo];W[ol];B[jq];W[lm]
+;B[rh];W[se];B[sg];W[sf];B[qi];W[qk];B[qq];W[lk];B[si];W[rk];B[rg]
+;W[qg];B[qj];W[ci];B[dg];W[cj];B[bi];W[ch];B[ck];W[dk];B[bk];W[bh]
+;B[bl];W[cm];B[bf];W[eh];B[ej];W[ei];B[fi];W[fh];B[bm];W[bn];B[ai]
+;W[ah];B[hg];W[hh];B[gh];W[gi];B[gg];W[fj];B[hi];W[ih];B[gj];W[fi]
+;B[hk];W[ek];B[rc];W[ef];B[eg];W[fg];B[ff];W[gf];B[fe];W[if];B[hf]
+;W[he];B[ge];W[ig];B[hd];W[gf];B[pk];W[pl];B[so];W[rn];B[im];W[jn]
+;B[in];W[cf];B[ce];W[df];B[kr];W[lr];B[kn];W[km];B[jm];W[ln];B[ko]
+;W[id];B[ic];W[ie];B[hc];W[bd];B[be];W[cc];B[dc];W[db];B[bb];W[cb]
+;B[bc];W[cd];B[ad];W[sc];B[jr];W[rb];B[qo];W[pb];B[ob];W[kd];B[je]
+;W[lc];B[mb];W[ke];B[kf];W[lf];B[kg];W[jc];B[jf];W[lg];B[mg];W[le]
+;B[kh];W[mh];B[jb];W[kc];B[qn];W[qm];B[qp];W[rm];B[kp];W[ki];B[li]
+;W[lj];B[ji];W[kj];B[jh];W[jk];B[ii];W[mi];B[fs];W[es];B[gs];W[er]
+;B[pa];W[qa];B[oi];W[sk];B[sj];W[oa];B[na];W[rd];B[qc];W[pc];B[od]
+;W[qb];B[qd];W[mc];B[lb];W[oe];B[sd];W[ac];B[ab];W[rd];B[nb];W[sd]
+;B[bg];W[cg];B[hp];W[ae];B[eb];W[ac];B[da];W[ba];B[ad];W[ib];B[kb]
+;W[ac];B[de];W[lq];B[ls];W[ms];B[ks];W[gq];B[hr];W[go];B[ho];W[ik]
+;B[el];W[di];B[ee];W[hl];B[hm];W[il];B[jl];W[gl];B[gm];W[gk];B[hj]
+;W[kl];B[ok];W[nk];B[ng];W[ag];B[oh];W[af];B[ad];W[nf];B[ld];W[ac]
+;B[on];W[pm];B[ad];W[oj];B[ca];W[ni];B[sb];W[sa];B[pi];W[];B[dl];W[]
+;B[ij];W[kk];B[jg];W[];B[]C[final_score: B+28.5
+B19 removed
+P19 removed
+R19 removed
+T19 removed
+J18 removed
+T17 removed
+D13 removed
+A11 removed
+O7 removed
+D6 removed
+K6 removed
+P6 removed
+R1 removed
+game adjourned]
+)
diff --git a/regression/games/nngs/jypower-gnugo-3.3.17-200304150031.sgf b/regression/games/nngs/jypower-gnugo-3.3.17-200304150031.sgf
new file mode 100644 (file)
index 0000000..dc2e45c
--- /dev/null
@@ -0,0 +1,51 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[jypower]WR[NR]
+PB[GnuGo (GNU Go 3.3.17)]BR[11k*]
+PC[NNGS]DT[2003-04-15]AP[gnugoclient:2.0]
+RE[B+50.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[fc];B[ec];W[fe];B[df];W[dh];B[nc];W[fp];B[dn];W[fj];B[fb];W[np]
+;B[pn];W[nj];B[pl];W[pg];B[dl];W[fl];B[oq];W[lq];B[eq];W[hq];B[jr]
+;W[fn];B[gc];W[he];B[qe];W[ld];B[lc];W[lf];B[kc];W[nn];B[ho];W[gp]
+;B[jn];W[jl];B[km];W[kl];B[lo];W[kq];B[mm];W[nm];B[jq];W[mp];B[nl]
+;W[ml];B[om];W[mn];B[lm];W[ll];B[jh];W[jf];B[ig];W[hi];B[ik];W[il]
+;B[hk];W[hl];B[nq];W[kr];B[mr];W[ko];B[ln];W[kp];B[jo];W[ir];B[mo]
+;W[no];B[lp];W[mq];B[js];W[ks];B[kn];W[iq];B[hh];W[gk];B[gi];W[fi]
+;B[gj];W[gh];B[hj];W[ii];B[ji];W[li];B[gg];W[fh];B[fg];W[eg];B[hf]
+;W[if];B[ge];W[gd];B[fd];W[gf];B[qg];W[ff];B[ph];W[ci];B[cg];W[ck]
+;B[hc];W[id];B[ic];W[kf];B[og];W[cm];B[cn];W[dm];B[hd];W[ie];B[bm]
+;W[cl];B[md];W[bh];B[bg];W[nf];B[nk];W[mk];B[oj];W[ni];B[ah];W[ai]
+;B[ag];W[bl];B[bn];W[of];B[gr];W[is];B[hn];W[gm];B[gq];W[hp];B[le]
+;W[me];B[pf];W[od];B[oc];W[ke];B[oe];W[ne];B[nd];W[ng];B[nh];W[mh]
+;B[oh];W[oi];B[kd];W[pi];B[qi];W[rh];B[qh];W[rj];B[ri];W[qo];B[po]
+;W[qj];B[pk];W[qq];B[qp];W[rp];B[ro];W[rr];B[pr];W[sq];B[qr];W[im]
+;B[ch];W[bi];B[ee];W[hg];B[fq];W[en];B[eo];W[in];B[io];W[gn];B[fo]
+;W[go];B[ep];W[jm];B[al];W[ip];B[ak];W[bj];B[bk];W[di];B[le];W[mg]
+;B[ld];W[aj];B[am];W[dg];B[ce];W[gs];B[fs];W[hs];B[ge];W[qc];B[pb]
+;W[rd];B[qb];W[rb];B[ra];W[rf];B[re];W[si];B[rg];W[qm];B[qn];W[ef]
+;B[gd];W[je];B[op];W[ms];B[ns];W[ls];B[on];W[hm];B[hr];W[lr];B[nr]
+;W[er];B[es];W[co];B[cp];W[cr];B[dr];W[bo];B[bp];W[];B[oo];W[];B[]
+C[J9 removed
+K10 removed
+J13 removed
+H12 removed
+D10 removed
+D8 removed
+C5 removed
+C2 removed
+E2 removed
+R3 removed
+S4 removed
+T3 removed
+S2 removed
+R7 removed
+R10 removed
+T11 removed
+S12 removed
+S14 removed
+S16 removed
+R17 removed
+S18 removed
+final_score: B+50.5]
+)
diff --git a/regression/games/nngs/jypower-gnugo-3.3.22-200307050519.sgf b/regression/games/nngs/jypower-gnugo-3.3.22-200307050519.sgf
new file mode 100644 (file)
index 0000000..ccab830
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[jypower]WR[NR]
+PB[GnuGo (GNU Go 3.3.22)]BR[10k*]
+PC[NNGS]DT[2003-07-05]AP[gnugoclient:2.0]
+RE[W+71.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[cf];B[ce];W[ef];B[fd];W[hd];B[cn];W[dl];B[cl];W[cm];B[dm];W[ck]
+;B[bm];W[dk];B[md];W[kd];B[bk];W[cj];B[fl];W[fk];B[hl];W[el];B[gm]
+;W[fm];B[fn];W[em];B[en];W[gl];B[lf];W[ke];B[nf];W[hm];B[gn];W[im]
+;B[mo];W[ik];B[lm];W[pn];B[qo];W[pl];B[qk];W[no];B[on];W[om];B[nn]
+;W[po];B[oo];W[qp];B[qq];W[rp];B[ro];W[pq];B[op];W[rq];B[rm];W[qm]
+;B[rl];W[oq];B[jh];W[kf];B[gk];W[hk];B[gj];W[qn];B[rn];W[il];B[gh]
+;W[gf];B[cb];W[kh];B[ki];W[lh];B[kg];W[lg];B[jg];W[je];B[id];W[ie]
+;B[hc];W[gd];B[gc];W[hf];B[df];W[dg];B[de];W[eg];B[ci];W[di];B[ej]
+;W[bi];B[ch];W[dh];B[fj];W[kk];B[li];W[nh];B[bh];W[bj];B[bf];W[mi]
+;B[lj];W[mj];B[lk];W[mk];B[ml];W[ok];B[pg];W[ii];B[ql];W[ij];B[ji]
+;W[ih];B[nl];W[nk];B[le];W[kc];B[jb];W[kb];B[ja];W[ka];B[jc];W[mq]
+;B[kq];W[lp];B[ig];W[hg];B[hh];W[ko];B[ei];W[jn];B[cg];W[pm];B[ge]
+;W[he];B[fe];W[ff];B[io];W[mb];B[ob];W[nc];B[qg];W[np];B[oj];W[kl]
+;B[ll];W[nm];B[mn];W[og];B[mg];W[mh];B[of];W[ph];B[oi];W[oh];B[ng]
+;W[qh];B[ri];W[qi];B[rh];W[qj];B[pk];W[ol];B[ni];W[rj];B[pi];W[oc]
+;B[pb];W[pc];B[qc];W[qd];B[qb];W[pe];B[mm];W[pf];B[rg];W[ld];B[me]
+;W[ne];B[rd];W[oe];B[lr];W[mr];B[qe];W[sj];B[ms];W[ns];B[ls];W[nr]
+;B[od];W[nd];B[qd];W[iq];B[jr];W[ip];B[jo];W[kn];B[hp];W[mp];B[ak]
+;W[hl];B[nb];W[mc];B[qf];W[hq];B[hn];W[gp];B[ho];W[eq];B[dq];W[dr]
+;B[cr];W[fr];B[ds];W[es];B[er];W[jq];B[kp];W[dr];B[cs];W[er];B[ir]
+;W[hr];B[gs];W[hs];B[fp];W[ep];B[eo];W[fq];B[is];W[fo];B[gr];W[gq]
+;B[go];W[cq];B[fp];W[fs];B[gs];W[fo];B[br];W[cp];B[do];W[bq];B[fp]
+;W[ib];B[ic];W[fo];B[aq];W[ap];B[fp];W[fc];B[gr];W[fb];B[ec];W[gb]
+;B[eb];W[hb];B[ee];W[ea];B[da];W[fa];B[ma];W[la];B[na];W[si];B[sh]
+;W[ah];B[ag];W[ai];B[lq];W[lo];B[in];W[km];B[aj];W[ia];B[]
+C[final_score: W+71.5
+N16 removed
+O14 removed
+J13 removed
+G12 removed
+E11 removed
+O11 removed
+A4 removed
+C4 removed
+R3 removed]
+)
diff --git a/regression/games/nngs/kit-gnugo-3.3.21-200306181940.sgf b/regression/games/nngs/kit-gnugo-3.3.21-200306181940.sgf
new file mode 100644 (file)
index 0000000..658924c
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[kit]WR[NR]
+PB[GnuGo (GNU Go 3.3.21)]BR[10k*]
+PC[NNGS]DT[2003-06-18]AP[gnugoclient:2.0]
+RE[W+45.5]
+AB[dd][pd][dp][pp]
+;W[qn];B[pj];W[fq];B[qo];W[cn];B[pn];W[eo];B[cq];W[dr];B[cr];W[dq]
+;B[co];W[bo];B[bp];W[do];B[qm];W[cp];B[lq];W[cf];B[df];W[dg];B[ef]
+;W[ce];B[cd];W[eg];B[fd];W[ci];B[fg];W[fh];B[iq];W[gg];B[ff];W[nq]
+;B[or];W[no];B[mn];W[qq];B[rp];W[oq];B[pq];W[nr];B[gh];W[fi];B[hg]
+;W[pr];B[hi];W[gi];B[gf];W[mo];B[hj]C[L:8];W[ln];B[mm]C[L:9];W[kp]
+;B[kq]C[L:7];W[jp];B[kl]C[L:8];W[nc];B[lc]C[L:9];W[ne];B[pf];W[kd]
+;B[kc]C[L:10];W[jd];B[me];W[ld];B[md];W[mc];B[mb];W[nb];B[kb];W[nd]
+;B[mf];W[ib];B[nf];W[qc];B[qd];W[pc];B[hl];W[kg];B[ek];W[fk];B[qr]
+;W[os];B[qs];W[ip];B[mh];W[qh];B[ri];W[ih];B[jh];W[hh];B[gg];W[ig]
+;B[jg];W[if];B[jf]C[L:8];W[je];B[ii]C[L:9];W[he];B[kf]C[L:7];W[ik]
+;B[hk]C[L:8];W[lm];B[ll]C[L:9];W[on];B[pm]C[L:7];W[ml];B[nl]C[L:8]
+;W[mk];B[nm]C[L:9];W[il];B[jj]C[L:10];W[jk];B[kk];W[im];B[hm];W[kj]
+;B[lj];W[ki];B[nk];W[mj];B[km];W[kn];B[li];W[jm];B[kh];W[fm];B[ck]
+;W[fl];B[cj];W[di];B[bm];W[bn];B[hn];W[hp];B[bd];W[de];B[ee];W[ec]
+;B[fc];W[fa];B[hc];W[ic];B[eb];W[ea];B[db];W[da];B[be];W[bf];B[af]
+;W[bg];B[ag];W[ah];B[ae]C[L:8];W[bh];B[rc]C[L:9];W[rb];B[rd]C[L:7]
+;W[sb];B[in]C[L:8];W[jn];B[hb];W[ha];B[go]C[L:9];W[cb];B[dc]C[L:7]
+;W[bb];B[ge]C[L:8];W[hd];B[bc]C[L:9];W[ab];B[hf]C[L:10];W[ie];B[oo]
+;W[op];B[po];W[gb];B[gc];W[oe];B[of];W[pe];B[qe];W[qf];B[qg];W[rf]
+;B[rg];W[sd];B[sf];W[sc];B[se];W[rq];B[rr];W[ps];B[sq];W[nn];B[fb]
+;W[ga];B[od];W[oc];B[re];W[om];B[ol];W[gp];B[ij];W[fo];B[fn];W[en]
+;B[gn];W[ep];B[le];W[gj];B[io];W[jo];B[ac];W[jc];B[ji];W[gk];B[ke]
+;W[ho];B[jl];W[gm];B[gd];W[gl];B[cc];W[];B[]C[final_score: W+45.5
+L18 removed
+N18 removed
+E17 removed
+L13 removed
+R12 removed
+C10 removed
+N10 removed
+E9 removed
+B7 removed
+R6 removed
+B4 removed
+C3 removed
+J3 removed
+L3 removed
+R3 removed]
+)
diff --git a/regression/games/nngs/kumu-gnugo-3.2-200205070903.sgf b/regression/games/nngs/kumu-gnugo-3.2-200205070903.sgf
new file mode 100644 (file)
index 0000000..0639ec9
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[kumu]WR[8k*]
+PB[GnuGo (GNU Go 3.2)]BR[14k*]
+PC[NNGS]DT[2002-05-07]AP[gnugoclient:2.0]
+RE[B+Resign]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nc];W[rd];B[qc];W[qh];B[gq];W[fc];B[ec];W[fd];B[df];W[ie]
+;B[cm];W[pm];B[np];W[oq];B[op];W[qq];B[pq];W[qp];B[or];W[po];B[nj]
+;W[rc];B[dq];W[jq];B[kq];W[kr];B[iq];W[lq];B[jr];W[kp];B[jn];W[mp]
+;B[nq];W[jq];B[ir];W[mr];B[mo];W[lo];B[jo];W[no];B[mn];W[oo];B[ls]
+;W[qr];B[gg];W[nr];B[ig];W[id];B[jc];W[ic];B[fb];W[gb];B[eb];W[jb]
+;B[kb];W[ib];B[lc];W[jf];B[rb];W[pb];B[qb];W[ce];B[cd];W[cf];B[ch]
+;W[de];B[ee];W[ef];B[dg];W[ed];B[fe];W[ge];B[ff];W[bd];B[bc];W[be]
+;B[ol];W[bb];B[cc];W[cb];B[ad];W[ae];B[bg];W[ac];B[ri];W[ng];B[ql]
+;W[mb];B[kd];W[nb];B[mc];W[oc];B[lb];W[od];B[me];W[ne];B[kh];W[mf]
+;B[kf];W[jg];B[jh];W[kg];B[le];W[lf];B[lh];W[ke];B[md];W[pe];B[je]
+;W[if];B[hf];W[he];B[gf];W[pl];B[qk];W[qm];B[rl];W[rm];B[nn];W[nm]
+;B[om];W[ok];B[nl];W[pk];B[ph];W[nk];B[mk];W[oj];B[qi];W[mj];B[ml]
+;W[ni];B[qg];W[pg];B[rg];W[rf];B[sm];W[sn];B[sl];W[rn];B[ih];W[oh]
+;B[pi];W[ln];B[lm];W[km];B[kk];W[kl];B[ll];W[on];B[kn];W[mm];B[lk]
+;W[bm];B[bl];W[bn];B[bp];W[cn];B[cl];W[do];B[eo];W[en];B[sf];W[se]
+;B[sg];W[fn];B[dm];W[dn];B[ks];W[ho];B[gn];W[go];B[fo];W[im];B[hn]
+;W[in];B[gm];W[io];B[ms];W[ns];B[kq];W[lr];B[js];W[il];B[gk];W[jk]
+;B[li];W[ij];B[lj];W[jm];B[hk];W[ik];B[ko];W[jq];B[ip];W[gl];B[fl]
+;W[el];B[hl];W[fk];B[em];W[fm];B[gl]C[L:9];W[ej];B[gi];W[fh];B[fi]
+C[L:7];W[hi];B[ei];W[gj];B[fj];W[eh];B[mi]C[L:6];W[gh];B[hj]C[L:5]
+;W[hh];B[ii]C[L:6];W[di];B[ek];W[eg];B[dh]C[L:7];W[gp];B[fq]C[L:8]
+;W[hq];B[kq]C[L:9];W[ci];B[cj]C[L:7];W[jq];B[hr]C[L:8];W[gr];B[mg]
+C[L:9];W[fr];B[hp]C[L:7];W[er];B[fp]C[L:5];W[dr];B[cr]C[L:6];W[cs]
+;B[kq]C[L:7];W[cq];B[br];W[eq];B[cp]C[L:6];W[ep];B[hq]C[L:7];W[hs]
+;B[hm]C[L:2])
diff --git a/regression/games/nngs/leftd-gnugo-3.3.12-200211292017.sgf b/regression/games/nngs/leftd-gnugo-3.3.12-200211292017.sgf
new file mode 100644 (file)
index 0000000..e8fc62c
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[leftd]WR[1d]
+PB[GnuGo (GNU Go 3.3.12)]BR[11k*]
+PC[NNGS]DT[2002-11-29]AP[gnugoclient:2.0]
+RE[W+17.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nc];W[pm];B[np];W[nj];B[re];W[rf];B[qe];W[of];B[cf];W[cn]
+;B[dn];W[dm];B[en];W[cp];B[co];W[bo];B[cm];W[do];B[eo];W[co];B[dl]
+;W[bm];B[em];W[ep];B[fp];W[eq];B[fq];W[dq];B[ec];W[ck];B[dk];W[jm]
+;B[cj];W[bk];B[qo];W[qn];B[le];W[md];B[me];W[nd];B[oc];W[ne];B[lb]
+;W[ld];B[lg];W[ke];B[kd];W[lf];B[mf];W[kf];B[ng];W[nf];B[mg];W[kg]
+;B[kh];W[ig];B[jh];W[ie];B[hc];W[id];B[ic];W[li];B[ge];W[gf];B[hf]
+;W[hg];B[gg];W[gh];B[ff];W[ii];B[ih];W[hh];B[hi];W[lh];B[mi];W[mh]
+;B[nh];W[ni];B[oh];W[oi];B[ph];W[pi];B[qh];W[qi];B[rh];W[ri];B[jg]
+;W[if];B[fh];W[gi];B[hj];W[gj];B[hk];W[pg];B[kl];W[kj];B[ki];W[lj]
+;B[sh];W[sg];B[je];W[jf];B[si];W[rj];B[km];W[gk];B[hm];W[jk];B[jl]
+;W[lq];B[nq];W[jq];B[iq];W[ir];B[jr];W[kq];B[hr];W[ip];B[hq];W[kr]
+;B[is];W[lo];B[kn];W[mn];B[io];W[jo];B[hp];W[ko];B[bj];W[fi];B[eh]
+;W[ei];B[di];W[cc];B[cd];W[bd];B[be];W[bb];B[ad];W[ac];B[ae];W[db]
+;B[bc];W[pe];B[rd];W[bd];B[eb];W[bc];B[ro];W[rn];B[ij];W[hl];B[gl]
+;W[ji];B[il];W[fl];B[fm];W[ca];B[fr];W[er];B[lc];W[od];B[qc];W[mr]
+;B[nr];W[so];B[sp];W[sn];B[rq];W[ns];B[os];W[ms];B[or];W[ea];B[fa]
+;W[da];B[bl];W[al];B[cl];W[ak];B[aj];W[am];B[fk];W[jn];B[mm];W[nm]
+;B[ml];W[nn];B[nl];W[ol];B[kk];W[mc];B[mb];W[fb];B[ga];W[gb];B[ha]
+;W[hb];B[ia];W[ib];B[ja];W[jb];B[jc];W[kb];B[gc];W[fc];B[fd];W[dc]
+;B[ed];W[ks];B[pn];W[on];B[po];W[qm];B[kp];W[lp];B[ip];W[in];B[hn]
+;W[oo];B[he];W[hd];B[kc];W[ka];B[js];W[op];B[oq];W[nk];B[mk];W[mj]
+;B[es];W[ds];B[fs];W[ek];B[el];W[ej];B[lk];W[ln];B[lm];W[mp];B[no]
+;W[gd];B[nb];W[la];B[se];W[rg];B[ma];W[pb];B[pc];W[mq];B[im];W[mo]
+;B[sf];W[qg];B[fl];W[fj];B[]
+C[final_score: W+17.5
+Q18 removed
+M15 removed
+Q10 removed
+K9 removed]
+)
diff --git a/regression/games/nngs/leftd-gnugo-3.3.16-200302072009.sgf b/regression/games/nngs/leftd-gnugo-3.3.16-200302072009.sgf
new file mode 100644 (file)
index 0000000..caecab7
--- /dev/null
@@ -0,0 +1,47 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[leftd]WR[2k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-07]AP[gnugoclient:2.0]
+RE[B+24.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qe];W[oe];B[pf];W[pe];B[re];W[rf];B[md];W[qd];B[of];W[nf]
+;B[od];W[ne];B[rd];W[qc];B[ph];W[rc];B[pm];W[fq];B[fp];W[ep];B[eo]
+;W[eq];B[gp];W[dq];B[cp];W[cq];B[oc];W[nd];B[nc];W[oh];B[ng];W[og]
+;B[pg];W[le];B[mg];W[lf];B[oi];W[mc];B[lc];W[mb];B[gd];W[en];B[dn]
+;W[fo];B[do];W[go];B[ho];W[hp];B[fn];W[gn];B[fm];W[gm];B[nb];W[ld]
+;B[ma];W[lb];B[em];W[ch];B[jm];W[or];B[qr];W[lq];B[lo];W[mo];B[mn]
+;W[no];B[nn];W[po];B[oo];W[op];B[on];W[pq];B[qp];W[qq];B[rq];W[rp]
+;B[np];W[qo];B[eh];W[be];B[jg];W[lg];B[gl];W[gq];B[lh];W[hl];B[gk]
+;W[cc];B[dc];W[cb];B[bi];W[ci];B[cj];W[bh];B[bj];W[mp];B[df];W[cf]
+;B[hk];W[il];B[db];W[dg];B[eg];W[de];B[ef];W[ee];B[cd];W[bd];B[ce]
+;W[fe];B[ec];W[ge];B[hd];W[jf];B[he];W[hf];B[if];W[ig];B[gf];W[ie]
+;B[gg];W[ic];B[id];W[rm];B[kc];W[kb];B[jc];W[jb];B[jh];W[lm];B[jl]
+;W[ln];B[lp];W[mq];B[kq];W[jn];B[kf];W[ke];B[je];W[kg];B[im];W[in]
+;B[kh];W[pl];B[ol];W[ok];B[pk];W[ql];B[nk];W[hm];B[if];W[nl];B[om]
+;W[ie];B[ih];W[bq];B[bp];W[ik];B[jk];W[ij];B[ml];W[ll];B[ca];W[bb]
+;B[lk];W[mm];B[nm];W[ba];B[lr];W[mr];B[aq];W[ar];B[ap];W[br];B[hg]
+;W[da];B[ea];W[fb];B[eb];W[hc];B[fd];W[di];B[ei];W[rj];B[gb];W[hb]
+;B[gc];W[ga];B[ah];W[ag];B[ai];W[qh];B[bg];W[af];B[dh];W[bf];B[cg]
+;W[qg];B[pi];W[hj];B[fa];W[ha];B[kn];W[ko];B[km];W[kp];B[ii];W[gj]
+;B[fj];W[mf];B[gi];W[hi];B[hh];W[qm];B[kl];W[lo];B[pn];W[qn];B[nl]
+;W[qi];B[qk];W[rk];B[if];W[kf];B[kd];W[sd];B[me];W[se];B[la];W[pb]
+;B[ka];W[pe];B[oe];W[qe];B[ob];W[oa];B[pc];W[qb];B[ca];W[nj];B[oj]
+;W[da];B[na];W[pa];B[ca];W[mk];B[mj];W[da];B[pp];W[oq];B[ca];W[fl]
+;B[fk];W[da];B[qj];W[ca];B[]C[final_score: B+24.5
+G19 removed
+F18 removed
+K18 removed
+D15 removed
+P13 removed
+O10 removed
+F8 removed
+H5 removed
+K4 removed
+O4 removed
+Q4 removed
+L3 removed
+S3 removed
+M2 removed
+R2 removed]
+)
diff --git a/regression/games/nngs/leftd-gnugo-3.3.16-200302252226.sgf b/regression/games/nngs/leftd-gnugo-3.3.16-200302252226.sgf
new file mode 100644 (file)
index 0000000..24a95da
--- /dev/null
@@ -0,0 +1,47 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[leftd]WR[2k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-25]AP[gnugoclient:2.0]
+RE[W+21.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qe];W[oe];B[pf];W[pe];B[re];W[rf];B[md];W[qd];B[of];W[rd]
+;B[pc];W[nf];B[ne];W[od];B[oc];W[se];B[ng];W[mf];B[mg];W[lf];B[kg]
+;W[lg];B[lh];W[og];B[pg];W[oh];B[nd];W[qe];B[ph];W[oi];B[kf];W[mh]
+;B[pm];W[pi];B[qj];W[cn];B[co];W[dn];B[fp];W[cj];B[ck];W[dk];B[di]
+;W[ci];B[ek];W[dl];B[bk];W[ch];B[mi];W[nh];B[mj];W[oj];B[nl];W[ol]
+;B[om];W[nk];B[mk];W[pl];B[ql];W[nm];B[ml];W[qm];B[qn];W[rm];B[ln]
+;W[pn];B[on];W[po];B[oo];W[qo];B[qp];W[ro];B[rp];W[op];B[np];W[oq]
+;B[mo];W[sp];B[pq];W[pr];B[or];W[rq];B[nq];W[kh];B[li];W[ld];B[le]
+;W[ke];B[jg];W[me];B[rb];W[mc];B[nc];W[lb];B[nb];W[qc];B[qb];W[pa]
+;B[fn];W[fm];B[gm];W[gn];B[em];W[fo];B[en];W[eo];B[fl];W[do];B[bo]
+;W[ep];B[go];W[gp];B[dq];W[ho];B[fq];W[eq];B[er];W[fr];B[gq];W[dr]
+;B[cr];W[es];B[hq];W[br];B[bq];W[cs];B[in];W[cq];B[bm];W[cl];B[fc]
+;W[dh];B[cf];W[eh];B[fi];W[bl];B[qr];W[rl];B[ff];W[fh];B[gi];W[io]
+;B[jo];W[hn];B[hm];W[jn];B[im];W[ir];B[hr];W[ip];B[iq];W[jq];B[kq]
+;W[jr];B[kr];W[je];B[id];W[ig];B[jh];W[cc];B[dc];W[db];B[eb];W[bd]
+;B[be];W[bb];B[da];W[ca];B[cb];W[hs];B[gs]C[L:8];W[db];B[cd]C[L:9]
+;W[ea];B[fa]C[L:10];W[da];B[jb];W[gb];B[fb];W[hd];B[if]C[L:9];W[he]
+;B[ie]C[L:10];W[hf];B[gc];W[gg];B[hc];W[ei];B[ej];W[rr];B[ad];W[bc]
+;B[bg];W[bh];B[mb];W[lc];B[rs];W[pb];B[qa];W[sb];B[sc];W[rc];B[sa]
+;W[sd];B[ma];W[sb];B[ob];W[ra];B[la];W[kb];B[ka];W[hh];B[hi];W[ih]
+;B[ii];W[jf];B[ki];W[ee];B[fe];W[ef];B[ed];W[gd];B[gh];W[fg];B[hg]
+;W[fd];B[qq];W[so];B[kd];W[le];B[dm];W[cm];B[el];W[ac];B[ah];W[ai]
+;B[kc];W[af];B[ag];W[ae];B[cg];W[dg];B[de];W[df];B[oa];W[nj];B[gr]
+;W[fs];B[is];W[sr];B[ni];W[];B[ok];W[qk];B[ec];W[pk];B[ce];W[];B[bf]
+;W[ad];B[js];W[];B[hp];W[go];B[qs];W[];B[ss];W[sq];B[]
+C[final_score: W+21.5
+G18 removed
+F15 removed
+P14 removed
+Q10 removed
+B9 removed
+B7 removed
+O7 removed
+K6 removed
+R6 removed
+B5 removed
+D4 removed
+B3 removed
+Q2 removed]
+)
diff --git a/regression/games/nngs/lindq-gnugo-3.3.4-200207051636.sgf b/regression/games/nngs/lindq-gnugo-3.3.4-200207051636.sgf
new file mode 100644 (file)
index 0000000..f63d3e2
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[lindq]WR[14k]
+PB[GnuGo (GNU Go 3.3.4)]BR[15k*]
+PC[NNGS]DT[2002-07-05]AP[gnugoclient:2.0]
+RE[W+76.5]
+AB[pd][dp]
+;W[pp];B[nq];W[qn];B[pr];W[qq];B[kq];W[dd];B[cf];W[ef];B[dh];W[nc]
+;B[nd];W[lc];B[oc];W[qi];B[fc];W[ic];B[db];W[cc];B[ck]C[L:8];W[qf]
+;B[mc]C[L:9];W[md];B[nb]C[L:7];W[le];B[og]C[L:8];W[fq];B[fp]C[L:9]
+;W[cq];B[cp]C[L:7];W[dq];B[lb]C[L:8];W[kc];B[gq]C[L:9];W[eq];B[ep]
+C[L:8];W[gr];B[hq]C[L:9];W[ho];B[in]C[L:10];W[ge];B[hb];W[ib];B[cb]
+C[L:8];W[bb];B[dc]C[L:6];W[bd];B[hc]C[L:5];W[hd];B[fb]C[L:6];W[ha]
+;B[fh]C[L:7];W[gg];B[hi]C[L:8];W[mg];B[ji]C[L:9];W[li];B[kk];W[gm]
+;B[hn]C[L:8];W[gn];B[go];W[mk];B[kl];W[rd];B[gh]C[L:9];W[qc];B[mn]
+;W[nm];B[hr]C[L:10];W[fr];B[qr];W[of];B[rq];W[rp];B[bq];W[br];B[bp]
+;W[oe];B[ig];W[jf];B[rr];W[pb];B[ma];W[ob];B[sp];W[ro];B[ar];W[cr]
+;B[gs];W[ds];B[bs];W[fs];B[er];W[hs];B[be];W[ce];B[bf];W[df];B[dg]
+;W[ga];B[nn];W[om];B[kh];W[np];B[mp];W[no];B[oo];W[op];B[mo];W[on]
+;B[jg];W[kf];B[if];W[ie];B[hf];W[he];B[gf];W[ff];B[fg];W[eg];B[eh]
+;W[lm];B[mm];W[ml];B[ll]C[L:9];W[ln];B[hp]C[L:10];W[mq];B[mr]C[L:7]
+;W[oq];B[lq]C[L:8];W[or];B[ps]C[L:9];W[sq];B[os]C[L:10];W[nr];B[ns]
+;W[so];B[pq];W[qp];B[sr];W[rs];B[lh];W[mh];B[ad];W[ac];B[ae];W[ca]
+;B[lg];W[lf];B[mq];W[kj];B[jj];W[lk];B[ik];W[ki];B[mi];W[lj];B[kg]
+;W[fo];B[gp];W[en];B[fm]C[L:9];W[em];B[fl];W[fn];B[el]C[L:10];W[cn]
+;B[do];W[dn];B[bm];W[dl];B[sp];W[dk];B[fk];W[cj];B[bn]C[L:5];W[cl]
+;B[bk]C[L:6];W[bl];B[bj]C[L:7];W[cm];B[ci]C[L:8];W[dj];B[sq]C[L:9]
+;W[di];B[bi]C[L:10];W[fj];B[gj];W[fi];B[am];W[al];B[bo];W[gi];B[hk]
+;W[gl];B[gk];W[im];B[hm];W[hl];B[ak];W[il];B[km];W[kn];B[io];W[jm]
+;B[jk];W[jn];B[ek];W[jo];B[ei];W[ip];B[ir];W[ho];B[ej];W[jq];B[jr]
+;W[kp];B[iq];W[jp];B[lo];W[is];B[ko];W[js];B[ks];W[gs];B[as];W[aq]
+;B[ap];W[cs];B[aq];W[fd];B[eo];W[jl];B[lp];W[co];B[]
+C[D17 removed
+F17 removed
+H17 removed
+M18 removed
+N19 removed
+N17 removed
+O18 removed
+O16 removed
+P17 removed
+Q16 removed
+P13 removed
+N11 removed
+P5 removed
+S1 removed
+G13 removed
+F2 removed
+final_score: W+76.5]
+)
diff --git a/regression/games/nngs/looknglass-ggl-200302271041.sgf b/regression/games/nngs/looknglass-ggl-200302271041.sgf
new file mode 100644 (file)
index 0000000..02957f8
--- /dev/null
@@ -0,0 +1,27 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[looknglass-ggL(B) NNGS]
+EV[None]
+RE[B+Resign]
+PW[looknglass]WR[13k ]
+PB[ggL]BR[10k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2003-02-27]
+SZ[19]TM[600]KM[0.5]
+
+;B[pd];W[dp];B[qp];W[dd];B[oq];W[nc];B[fc];W[hc]
+;B[fe];W[df];B[fg];W[kd];B[fq];W[fp];B[gp];W[fo];B[eq];W[dq];B[jq];W[dl]
+;B[qj];W[pf];B[oe];W[of];B[ne];W[pe];B[oc];W[md];B[nf];W[oi];B[fi];W[di]
+;B[ok];W[if];B[db];W[cc];B[cb];W[bb];B[jo];W[nm];B[ml];W[nl];B[nk];W[mm]
+;B[lm];W[ll];B[mk];W[ln];B[km];W[kn];B[mn];W[jm];B[kl];W[lk];B[jn];W[jl]
+;B[kk];W[lj];B[jk];W[pl];B[pk];W[mo];B[nn];W[on];B[no];W[oo];B[np];W[qn]
+;B[ql];W[pm];B[ol];W[om];B[go];W[rp];B[rq];W[qq]
+;B[qr];W[qo];B[pq];W[so];B[po];W[op];B[pp];W[nq];B[mp];W[mq];B[lp];W[lq]
+;B[lo];W[rl];B[rm];W[qm];B[rk];W[qk];B[rn];W[sm];B[rj];W[pj];B[oj];W[pi]
+;B[ni];W[nj];B[mj];W[mi];B[ql];W[kp];B[sl];W[ko];B[nh];W[sn];B[pg];W[qd]
+;B[qc];W[rd];B[og];W[qg];B[rc];W[rf];B[qe]
+;W[qf];B[sd];W[rh];B[re]
+;)
diff --git a/regression/games/nngs/looknglass-gnugo-3.1.26-200203042158.sgf b/regression/games/nngs/looknglass-gnugo-3.1.26-200203042158.sgf
new file mode 100644 (file)
index 0000000..8db5cf1
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[looknglass]WR[13k]
+PB[GnuGo (GNU Go 3.1.26)]BR[13k*]
+PC[NNGS]DT[2002-03-04]AP[gnugoclient:2.0]
+RE[W+8.5]
+AB[dd][pd][dp]
+;W[pp];B[qn];W[mq];B[qk];W[cn];B[cl];W[gq];B[dn];W[cq];B[dm];W[dq]
+;B[co];W[ep];B[gn];W[go];B[im];W[cf];B[fd];W[ci];B[ic]C[L:9];W[mc]
+;B[oc]C[L:8];W[me];B[pf]C[L:9];W[qh];B[qf]C[L:7];W[pj];B[be]C[L:8]
+;W[bf];B[ad]C[L:7];W[bn];B[bo]C[L:6];W[bk];B[qp];W[qq];B[bl]C[L:5]
+;W[ec];B[ed];W[dc];B[cc];W[cb];B[bc];W[gb];B[rp];W[hd];B[pq];W[oq]
+;B[pr];W[op];B[qr];W[pk];B[kc]C[L:6];W[gc];B[mb];W[lb];B[lc];W[nb]
+;B[md]C[L:5];W[nc];B[nd]C[L:4];W[ob];B[pb]C[L:3];W[ld];B[kb]C[L:4]
+;W[ma];B[oa]C[L:5];W[ka];B[pa];W[na];B[kq];W[jb];B[jd]C[L:3];W[kd]
+;B[je]C[L:4];W[jc];B[jg]C[L:5];W[ff];B[hf]C[L:4];W[ge];B[bb]C[L:5]
+;W[db];B[bj]C[L:6];W[bi];B[ck]C[L:5];W[cj];B[ak]C[L:6];W[jp];B[jq]
+C[L:5];W[iq];B[ir];W[hr];B[kp]C[L:4];W[jo];B[mr]C[L:3];W[lr];B[ko]
+C[L:4];W[in];B[nr];W[or];B[lq];W[jr];B[nq];W[np];B[mp];W[kr];B[gl]
+;W[on];B[os]C[L:5];W[qm];B[rm]C[L:3];W[ql];B[po]C[L:4];W[nn];B[jn]
+C[L:5];W[io];B[km]C[L:6];W[pn];B[rn];W[ln];B[rk]C[L:7];W[kn];B[jm]
+C[L:6];W[jj];B[lf];W[ne];B[hh]C[L:7];W[gj];B[od]C[L:8];W[le];B[ph]
+C[L:9];W[qi];B[fh]C[L:8];W[eh];B[ej]C[L:7];W[ei];B[fi]C[L:6];W[fj]
+;B[dj]C[L:5];W[hi];B[lj]C[L:4];W[gh];B[gg]C[L:3];W[fg];B[lh]C[L:4]
+;W[ml];B[oh]C[L:5];W[qc];B[pc];W[re];B[rf];W[rg];B[rc];W[sf];B[qd]
+;W[ng];B[nh];W[ih];B[hg];W[ig];B[if]C[L:6];W[jh];B[mg];W[mf];B[kf]
+;W[kg];B[nk];W[jf];B[nl]C[L:4];W[ol];B[jg]C[L:3];W[kh];B[lg];W[jf]
+;B[id];W[ke];B[jg];W[qe];B[jf];W[pe];B[oe]C[L:4];W[of];B[og];W[nf]
+;B[pg]C[L:5];W[qg];B[ri]C[L:3];W[rj];B[qj]C[L:4];W[pi];B[rl];W[nj]
+;B[mm]C[L:3];W[nm];B[mk];W[ll];B[kk];W[lm];B[mi];W[lk];B[ki];W[kj]
+;B[ni];W[ok];B[he]C[L:4];W[mj];B[li];W[ji];B[di]C[L:5];W[dh];B[fk]
+C[L:6];W[ek];B[dk]C[L:7];W[hm];B[hl]C[L:8];W[hn];B[il]C[L:9];W[gm]
+;B[fn]C[L:10];W[fm];B[em];W[fl];B[eo];W[fo];B[ai];W[bh];B[gd];W[ib]
+;B[hc];W[ah];B[el];W[gk];B[cp];W[en];B[bq];W[br];B[eq]C[L:9];W[er]
+;B[fp]C[L:10];W[fq];B[ep];W[gp];B[ar];W[cr];B[mo];W[mn];B[hb];W[ha]
+;B[fc];W[fb];B[ce];W[df];B[ca];W[ea];B[aj];W[se];B[lo];W[sc];B[rd]
+;W[sd];B[sb];W[sg];B[rb];W[da];B[ba];W[oo];B[qo];W[rh];B[sj];W[ap]
+;B[ao];W[as];B[bs];W[cs];B[aq];W[as];B[bp];W[ee];B[si];W[oi];B[fn]
+;W[gn];B[bs];W[ek];B[de];W[fe];B[af];W[ag];B[ls];W[is];B[ks];W[js]
+;B[ms];W[fk];B[ae];W[en];B[as];W[fn];B[ds];W[fr];B[dr];W[es];B[sh]
+;W[];B[no];W[gf];B[]
+C[final_score: W+8.5
+R17 removed
+F12 removed
+L9 removed
+G8 removed
+B6 removed
+R3 removed]
+)
diff --git a/regression/games/nngs/makoops-gnugo-3.1.18-200201081434.sgf b/regression/games/nngs/makoops-gnugo-3.1.18-200201081434.sgf
new file mode 100644 (file)
index 0000000..6881629
--- /dev/null
@@ -0,0 +1,24 @@
+(;FF[4]GM[1]SZ[19]HA[5]KM[0.5]PW[makoops]WR[7k]PB[GnuGo (GNU Go 3.1.18)]BR[14k*]PC[NNGS]DT[2002-01-08]RE[W+23.5]AB[dd][pd][jj][dp][pp];W[qf];B[nc];W[qn]\r
+;B[re];W[np];B[oo];W[qq];B[qp];W[pq];B[rq];W[rr]C[S4];B[pn]C[L:8];W[rp];B[ro]C[L:9];W[sq]\r
+;B[mn]C[L:10];W[rn];B[lp];W[op];B[dj];W[no];B[nn];W[pm];B[jd];W[fc];B[ec];W[fd];B[df]\r
+;W[hc]C[!F18];B[fb];W[ce];B[cf]C[L:8];W[bf];B[cd]C[L:7];W[be];B[gb]C[L:8];W[de];B[ee]C[L:9];W[ed]\r
+;B[bd]C[L:5];W[cg];B[dg];W[fe];B[ef]C[L:6];W[ch];B[dh];W[dc];B[eb];W[db]C[#B18 possibly?  !A15\r
+C18];B[ae]C[L:7]\r
+;W[bg];B[bb];W[bj];B[ff]C[L:8];W[id]C[K17];B[cn]C[L:6];W[cl];B[eq]C[L:7];W[je]C[K17|L16];B[mq]C[L:8]\r
+;W[om];B[ie]C[L:7];W[he];B[if]C[L:8];W[hf];B[ig]C[L:6];W[hg]C[!J18];B[ib]C[L:5];W[hb];B[ha];W[ic]C[!G12]\r
+;B[gh];W[ih];B[ke]C[L:6];W[hh]C[!K18];B[jb];W[jc];B[jf];W[ia]C[!P6];B[on]C[L:7];W[ga];B[da]\r
+;W[ea];B[cb]C[L:8];W[ca];B[cc];W[fa];B[da];W[db];B[gc]C[L:9];W[gd];B[ba]C[L:8];W[dc];B[ac]\r
+;W[el];B[gi]C[L:9];W[ij];B[gk];W[ji];B[kb]C[L:8];W[ld];B[kc];W[kd];B[lc];W[md];B[je]C[L:6]\r
+;W[lf];B[kj]C[L:7];W[lh];B[fm]C[L:8];W[fl];B[gl]C[L:9];W[gm];B[hm]C[L:7];W[gn];B[en]C[L:8];W[bm]\r
+;B[kn]C[L:9];W[lm];B[ml]C[L:6];W[nk];B[bn];W[qe];B[qd]C[L:7];W[rf];B[rd]C[L:8];W[hj];B[jl]C[L:6]\r
+;W[gj];B[fk]C[L:7];W[fj];B[ek]C[L:8];W[dm];B[ik];W[dn];B[eo];W[co];B[cp];W[ci];B[di]C[L:9]\r
+;W[mc];B[mb]C[L:8];W[nd];B[oc]C[L:9];W[oe];B[do]C[L:10];W[an];B[ao];W[em];B[fn]C[L:9];W[am]\r
+;B[hn];W[hk];B[qo]C[L:10];W[so];B[po]C[L:7];W[mk];B[mj]C[L:8];W[mi];B[ll]C[L:9];W[lj];B[nq]C[L:10]\r
+;W[oq]C[!H3];B[hq];W[hl];B[sf];W[sg];B[se];W[rg];B[lk];W[li];B[nr];W[il];B[im];W[jk]\r
+;B[kk];W[jm]C[L8];B[jn];W[kl];B[km];W[jl];B[ck];W[bk];B[dk];W[cm];B[bo];W[go];B[ho]\r
+;W[gg];B[fg];W[nl]C[N7];B[ln];W[or];B[ja];W[mp]C[M2|M3|M5|O1];B[ki];W[kh];B[mm];W[ns];B[lr]\r
+;W[ls]C[L1];B[ms];W[mr];B[lq];W[ms];B[ks];W[os];B[kr];W[fi];B[fh];W[ei];B[hi];W[ii]\r
+;B[gf];W[gp];B[gq];W[pe];B[eh];W[af];B[mo];W[ha];B[ad];W[da];B[od];W[le];B[ge]\r
+;W[cj];B[fp];W[nm];B[hp];W[ej];B[fo];W[dl];B[]C[final_score: W+23.5\r
+K16 removed\r
+N10 removed])\r
diff --git a/regression/games/nngs/niko-gnugo-3.3.11-200211201651.sgf b/regression/games/nngs/niko-gnugo-3.3.11-200211201651.sgf
new file mode 100644 (file)
index 0000000..7a8409f
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.5]
+PW[niko]WR[8k*]
+PB[GnuGo (GNU Go 3.3.11)]BR[10k*]
+PC[NNGS]DT[2002-11-20]AP[gnugoclient:2.0]
+RE[B+73.5]
+AB[dd][pd][jj][dp][pp]
+;W[nq];B[pn];W[fq];B[no];W[pr];B[qq];W[cn];B[dn];W[dm];B[en];W[cq]
+;B[co];W[cm];B[em];W[dk];B[ci];W[cf];B[ei];W[ef];B[fd];W[hd];B[el]
+;W[dj];B[jc];W[ec];B[ed];W[fc];B[dc];W[gc];B[ge];W[bd];B[mc];W[di]
+;B[bo];W[dq];B[dh];W[ch];B[qr];W[kq];B[gn];W[qi];B[qd];W[oc];B[ne]
+;W[od];B[oe];W[qb];B[nb];W[ob];B[rc];W[rb];B[mf];W[qc];B[rd];W[sb]
+;B[pc];W[pb];B[oa];W[nc];B[mb];W[md];B[al];W[am];B[bm];W[bn];B[an]
+;W[bl];B[cg];W[bk];B[bh];W[eh];B[fi];W[dg];B[am];W[ao];B[ap];W[ak]
+;B[ek];W[ao];B[in];W[ld];B[je];W[kc];B[kb];W[nd];B[kd];W[lc];B[lb]
+;W[qf];B[eb];W[he];B[pf];W[qe];B[pe];W[ke];B[jd];W[lf];B[lg];W[jf]
+;B[hb];W[gb];B[hf];W[ib];B[ic];W[hc];B[jb];W[ha];B[qg];W[fb];B[rh]
+;W[cb];B[rj];W[hg];B[if];W[jg];B[ig];W[gg];B[db];W[cc];B[fa];W[ie]
+;B[ih];W[ja];B[gh];W[gf];B[hh];W[fe];B[gd];W[na];B[jh];W[le];B[ea]
+;W[ka];B[ga];W[pa];B[kg];W[kf];B[id];W[ma];B[hb];W[ra];B[ko];W[ql]
+;B[ol];W[pk];B[rm];W[rl];B[mp];W[mq];B[ki];W[oi];B[ip];W[hq];B[iq]
+;W[oq];B[jr];W[kr];B[ks];W[ls];B[ps];W[os];B[nr];W[mr];B[ns];W[ms]
+;B[lq];W[lp];B[kp];W[lo];B[oo];W[ln];B[mm];W[lm];B[rf];W[qm];B[rn]
+;W[qn];B[js];W[qo];B[ll];W[jm];B[kl];W[jn];B[jo];W[jl];B[po];W[jk]
+;B[ro];W[qp];B[rp];W[pq];B[qs];W[om];B[pm];W[hm];B[hn];W[ij];B[kj]
+;W[hj];B[fj];W[nk];B[nl];W[mk];B[ml];W[mi];B[lj];W[gl];B[mg];W[qh]
+;B[ri];W[pg];B[re];W[og];B[nh];W[oh];B[nf];W[ni];B[mj];W[ok];B[nj]
+;W[qj];B[ng];W[pl];B[rk];W[sm];B[oj];W[sq];B[rq];W[sn];B[sr];W[ep]
+;B[hr];W[gr];B[gp];W[gq];B[la];W[fo];B[gm];W[im];B[jq];W[lr];B[fh]
+;W[eg];B[gs];W[fs];B[hs];W[bp];B[an];W[am];B[ao];W[aq];B[ce];W[bf]
+;B[be];W[ae];B[cd];W[bc];B[ee];W[ch];B[eo];W[fp];B[ff];W[bg];B[fg]
+;W[ho];B[go];W[hp];B[io];W[fn];B[gk];W[hl];B[hk];W[ik];B[mo];W[fm]
+;B[fl];W[gj];B[er];W[eq];B[fr];W[dr];B[es];W[ds];B[fs];W[br];B[fk]
+;W[mn];B[nm];W[nn];B[on];W[km];B[dl];W[cl];B[oa];W[na];B[ca];W[ba]
+;B[sc];W[];B[kk];W[da];B[ii];W[ca];B[ma];W[oa];B[kn];W[np];B[me]
+;W[op];B[om];W[cp];B[do];W[];B[ej];W[];B[hi];W[];B[gi];W[];B[de]
+;W[df];B[]
+C[final_score: B+73.5
+H19 removed
+K19 removed
+J18 removed
+P13 removed
+B12 removed
+R12 removed
+C11 removed
+N9 removed
+T7 removed
+T3 removed
+O2 removed]
+)
diff --git a/regression/games/nngs/norate-ggl-200212301513.sgf b/regression/games/nngs/norate-ggl-200212301513.sgf
new file mode 100644 (file)
index 0000000..3dd4d03
--- /dev/null
@@ -0,0 +1,45 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[norate-ggL(B) NNGS]
+EV[None]
+RE[W+25.5]
+PW[norate]WR[NR ]
+PB[ggL]BR[10k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2002-12-30]
+SZ[19]TM[600]KM[5.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[qf];B[qh];W[nc];B[nd];W[md];B[pf];W[od];B[ne];W[pc];B[re]
+;W[qd];B[qe];W[pe];B[rf];W[of];B[pm];W[fc];B[fd];W[ed];B[ee];W[ec];B[dc]
+;W[de];B[ef];W[ce];B[eb];W[fb];B[bc];W[db];B[cb];W[ea];B[cg];W[bd];B[gd]
+;W[cc];B[cn];W[fq];B[fo];W[nq];B[lq];W[no];B[nm];W[hp];B[er];W[hn];B[op]
+;W[np];B[or];W[nr];B[mn];W[oq];B[pr];W[pq];B[qq];W[qp];B[rq];W[po];B[qo]
+;W[oo];B[qn];W[rp];B[sp];W[so];B[qs];W[sq];B[sr];W[rr];B[sp];W[lo];B[sq]
+;W[kn];B[mo];W[mp];B[lp];W[mm];B[lm];W[lr];B[kr];W[ms];B[jn];W[jo];B[ml]
+;W[io];B[mq];W[mr];B[iq];W[hq];B[hr];W[jr];B[kq];W[gr];B[ir];W[ks];B[jq]
+;W[hs];B[ko];W[kp];B[gs];W[fs];B[ko];W[ss];B[qr];W[kp];B[jm];W[ko];B[hm]
+;W[gm];B[gn];W[km];B[hl];W[kl];B[ro];W[pg];B[jg];W[eo];B[fn];W[ep];B[dq]
+;W[en];B[em];W[dm];B[el];W[dn];B[co];W[dl];B[sb];W[ek];B[dk];W[fk];B[fm]
+;W[di];B[ci];W[ei];B[eh];W[dh];B[ch]
+;W[fh];B[eg];W[gl];B[gk];W[cj];B[ck];W[bj];B[fi];W[gi];B[cl];W[fj]
+;B[fl];W[dg];B[df];W[cf];B[bi];W[fe];B[ff];W[gf];B[ge];W[fg];B[fe];W[hf]
+;B[hc];W[jf];B[kf];W[je];B[ke];W[ig];B[lc];W[he];B[id];W[jh];B[kg];W[ie]
+;B[hd];W[ik];B[mc];W[nf];B[nb];W[ob];B[oc];W[qg];B[rg];W[nc];B[me];W[ph]
+;B[qi];W[mh];B[jk];W[jl];B[ih];W[hh];B[ii];W[hj];B[kh];W[mj];B[lk];W[oj]
+;B[oc];W[rd];B[sd];W[nc];B[ma];W[pi];B[pk];W[qb];B[bg];W[ok];B[pp];W[ol]
+;B[bf];W[om];B[be];W[cd];B[ad];W[pn];B[pl];W[bb];B[ac];W[ae];B[af];W[ab]
+;B[ae];W[cr];B[es];W[dr];B[eq];W[fp];B[cm];W[bp];B[bo];W[cp];B[do];W[cq]
+;B[ds];W[ar];B[ap];W[bs];B[aq];W[bq];B[ao];W[cs];B[rb];W[rc];B[sc];W[ra]
+;B[gb];W[se];B[sf];W[qa];B[se];W[ki];B[lj];W[li];B[ji]
+;W[ga];B[ha];W[fa];B[fr];W[gs];B[ej];W[fi];B[lh];W[mg];B[gc];W[os];B[oe]
+;W[le];B[oc];W[pd];B[lf];W[nc];B[mf];W[oc];B[nn];W[on];B[ll];W[mk];B[nl]C[
+ pogonyshev 8k*: at move 234, B1 could kill, right ? (277)
+]
+;W[nk];B[oa];W[pa];B[na];W[mi];B[il];W[hi];B[ij];W[hk];B[kj];W[op];B[qp]
+;W[ns];B[ln];W[im];B[lg];W[tt];B[ps];W[tt];B[kk];W[tt];B[rh];W[tt];B[sa]
+;W[tt];B[tt]
+;)
diff --git a/regression/games/nngs/qly-gnugo-3.3.18-200305022134.sgf b/regression/games/nngs/qly-gnugo-3.3.18-200305022134.sgf
new file mode 100644 (file)
index 0000000..1afafbf
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[qly]WR[NR]
+PB[GnuGo (GNU Go 3.3.18)]BR[10k*]
+PC[NNGS]DT[2003-05-02]AP[gnugoclient:2.0]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nd];W[of];B[mf];W[ph];B[pm];W[ql];B[qm];W[qj];B[re];W[pk]
+;B[nl];W[nk];B[ll];W[lk];B[kl];W[ol];B[mm];W[nm];B[nn];W[ml];B[fc]
+;W[mn];B[lm];W[on];B[no];W[om];B[po];W[kp];B[kq];W[jo];B[ip];W[oo]
+;B[op];W[np];B[il];W[mo];B[hn];W[cf];B[cn];W[fp];B[ef];W[ch];B[eq]
+;W[fn];B[fo];W[go];B[eo];W[hp];B[gn];W[ho];B[ko];W[io];B[lp];W[im]
+;B[hq];W[gq];B[in];W[jn];B[jm]C[L:8];W[kn];B[ln]C[L:9];W[lo];B[kp]
+C[L:10];W[hr];B[iq];W[ir];B[jr];W[fr];B[hm];W[dr];B[nq];W[cq];B[li]
+;W[bd];B[eh];W[dl];B[ck];W[cl];B[fm];W[dn];B[do];W[cm];B[co];W[en]
+;B[bm];W[bl];B[bn];W[bj];B[ek];W[hc];B[ib];W[he];B[gf];W[je];B[id]
+;W[ie];B[hd];W[ge];B[mj];W[mk];B[qi];W[pi];B[rj];W[qk];B[rf];W[ee]
+;B[fe];W[fd];B[ff];W[gd];B[ec];W[ed];B[gc];W[de];B[qh];W[nj];B[jh]
+;W[le];B[kd];W[ke];B[dc];W[ld];B[lc];W[mc];B[lb];W[md];B[nc];W[mb]
+;B[nb];W[kc];B[kb];W[na];B[oa];W[ma];B[pb];W[ei];B[bk];W[ak];B[dm]
+;W[em];B[el];W[dm];B[dk];W[al];B[bi];W[aj];B[bh];W[ci];B[cj];W[di]
+;B[bg];W[fl];B[fk];W[gm];B[cg];W[hl];B[im];W[gi];B[hk];W[gk];B[gj]
+;W[fj];B[gl]C[game adjourned])
diff --git a/regression/games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf b/regression/games/nngs/ruud2d-gnugo-3.5.2gf1-200312241905.sgf
new file mode 100644 (file)
index 0000000..1a06336
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[ruud2d]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-24]AP[gnugoclient:2.0]
+RE[W+4.5]
+AB[gc][cg]
+;W[gf];B[cc];W[ec];B[fd];W[ed];B[fe];W[eg];B[de];W[cb];B[bb];W[cd]
+;B[dd];W[ee];B[ef];W[dc];B[bc];W[df];B[ff];W[ce];B[gg];W[fg];B[gh]
+;W[dg];B[db];W[eb];B[ca];W[gb];B[hf];W[hc];B[bf];W[be];B[bh];W[dh]
+;B[hd];W[ea];B[da];W[fc];B[gd];W[af];B[hb];W[ha];B[ic];W[fh];B[fi]
+;W[ei];B[gi];W[ad];B[ib];W[ac];B[ab];W[bd];B[ia];W[ga];B[]
+C[final_score: W+4.5
+B4 removed
+G4 removed
+C3 removed
+B2 removed])
diff --git a/regression/games/nngs/ruud2d-gnugo-3.5.2gf1-200312292348.sgf b/regression/games/nngs/ruud2d-gnugo-3.5.2gf1-200312292348.sgf
new file mode 100644 (file)
index 0000000..fccd0bb
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[ruud2d]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-29]AP[gnugoclient:2.0]
+RE[W+11.5]
+AB[gc][cg]
+;W[cd];B[gg];W[ge];B[fd];W[fe];B[ee];W[ef];B[eh];W[fg];B[de];W[fh]
+;B[gh];W[fi];B[gf];W[ff];B[he];W[hd];B[if];W[gd];B[hc];W[id];B[ce]
+;W[fc];B[bd];W[ed];B[dd];W[dc];B[cc];W[gi];B[db];W[fb];B[dh];W[df]
+;B[ec];W[fd];B[eb];W[cf];B[bf];W[ei];B[fa];W[ga];B[ea];W[gb];B[dg]
+;W[di];B[bh];W[bi];B[ci];W[ch];B[ah];W[ci];B[bg];W[];B[ai];W[];B[eg]
+;W[];B[]C[final_score: W+11.5
+G7 removed
+H5 removed
+G4 removed
+J4 removed]
+)
diff --git a/regression/games/nngs/saphir-gnugo-3.3.12-200212031818.sgf b/regression/games/nngs/saphir-gnugo-3.3.12-200212031818.sgf
new file mode 100644 (file)
index 0000000..2589db8
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[saphir]WR[3k]
+PB[GnuGo (GNU Go 3.3.12)]BR[10k*]
+PC[NNGS]DT[2002-12-03]AP[gnugoclient:2.0]
+RE[W+128.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[qe];W[pf];B[nd];W[pm];B[np];W[gd];B[df];W[lp];B[nn];W[fq]
+;B[eq];W[cn];B[fp];W[ld];B[ol];W[dh];B[ff];W[lf];B[qh];W[ie];B[og]
+;W[cc];B[cd];W[dc];B[ec];W[ed];B[eb];W[bd];B[fd];W[ee];B[fe];W[cf]
+;B[be];W[ce];B[de];W[bc];B[bo];W[dg];B[cl];W[ef];B[gb];W[gc];B[hb]
+;W[ic];B[fc];W[jc];B[dm];W[fg];B[lh];W[oe];B[od];W[of];B[mf];W[me]
+;B[ne];W[oh];B[ng];W[ln];B[mc];W[lc];B[hf];W[jg];B[hh];W[qp];B[qq]
+;W[jn];B[qo];W[hq];B[io];W[im];B[ir];W[go];B[hn];W[gp];B[ko];W[lo]
+;B[fi];W[iq];B[jq];W[hr];B[jr];W[eo];B[ep]C[L:8];W[fo];B[fr]C[L:7]
+;W[em];B[dn]C[L:8];W[gm];B[hm]C[L:9];W[hl];B[kn]C[L:10];W[km];B[lr]
+;W[nq];B[lm]C[L:8];W[mq];B[il]C[L:9];W[hk];B[jo];W[kl];B[ik]C[L:8]
+;W[gj];B[el]C[L:9];W[lj];B[is];W[gr];B[fl]C[L:10];W[gl];B[mr];W[nr]
+;B[ml];W[nm];B[mm];W[lk];B[oi];W[kh];B[ks];W[kq];B[kr];W[ms];B[lq]
+;W[mp];B[kp];W[no];B[ii];W[gi];B[gh];W[fh];B[gg];W[ge];B[gf];W[fk]
+;B[ei];W[op];B[on];W[om];B[pn];W[pq];B[rp];W[pr];B[ki];W[li];B[lg]
+;W[nl];B[nk]C[L:8];W[ok];B[mk]C[L:9];W[pl];B[oj]C[L:10];W[rm];B[pk]
+;W[ph];B[nf];W[rj];B[ri]C[L:9];W[nh];B[pg];W[mh];B[kf]C[L:10];W[le]
+;B[kg]C[L:9];W[jh];B[mg]C[L:7];W[mn];B[nj];W[qn];B[kd]C[L:8];W[ke]
+;B[jf]C[L:9];W[mi];B[rn]C[L:10];W[qm];B[rk];W[qg];B[rg];W[qi];B[rh]
+;W[qj];B[qk];W[pi];B[po];W[sk];B[so];W[sm];B[er];W[rr];B[qr];W[qs]
+;B[rq];W[sq];B[sp];W[sn];B[ps];W[os];B[rs];W[ss];B[sr];W[di];B[ek]
+;W[sq];B[ro];W[ps];B[sr];W[rs];B[ba];W[cj];B[ck];W[bj];B[bk];W[ak]
+;B[al];W[aj];B[db];W[mb];B[je];W[nc];B[md];W[ob];B[kc];W[lb];B[kb]
+;W[qc];B[rd];W[rc];B[sc];W[sb];B[sd];W[qd];B[re];W[qb];B[si];W[sj]
+;B[bb];W[co];B[bm];W[ej];B[fj];W[eh];B[ej];W[do];B[cp];W[bn];B[bp]
+;W[an];B[en];W[fm];B[ig];W[ab];B[gq];W[hp];B[rf];W[ka];B[jb];W[cb]
+;B[ca];W[ao];B[ib];W[ap];B[ji];W[br];B[hc];W[cr];B[id];W[kk];B[he]
+;W[da];B[ea];W[oc];B[ih];W[hj];B[pe];W[jm];B[hd];W[ja];B[if];W[pc]
+;B[ia];W[la];B[gn];W[fn];B[hs];W[gs];B[in];W[ac];B[ol];W[aa];B[da]
+;W[ok];B[ij];W[ol];B[oo];W[rl];B[ls];W[ns];B[hi];W[aq];B[ip];W[]
+;B[ho];W[];B[kj];W[];B[jk]C[L:8];W[sq];B[jl]C[L:9];W[qp];B[]
+C[L:10
+final_score: W+127.5
+B15 removed
+E11 removed
+P11 removed
+B9 removed
+A8 removed
+B7 removed
+D7 removed
+B5 removed
+G3 removed]
+)
diff --git a/regression/games/nngs/scf-gnugo-3.1.18-200201060027.sgf b/regression/games/nngs/scf-gnugo-3.1.18-200201060027.sgf
new file mode 100644 (file)
index 0000000..cee7bfe
--- /dev/null
@@ -0,0 +1,34 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[0.5]PW[scf]WR[12k]PB[GnuGo (GNU Go 3.1.18)]BR[14k*]PC[NNGS]DT[2002-01-06]RE[W+114.5];B[dp];W[pd];B[pp];W[dd];B[qf];W[qh]\r
+;B[qc];W[qd];B[pc];W[od];B[rd];W[re];B[rc];W[qe];B[nc];W[qn];B[fc];W[cf];B[db]\r
+;W[cc];B[ic];W[fq];B[nq];W[rp];B[qq];W[on];B[fp];W[ep];B[eq];W[eo];B[gq];W[dq]\r
+;B[fr];W[er];B[dr];W[fq];B[cq];W[eq];B[cr];W[bo];B[ch];W[cb];B[bp];W[co];B[es]\r
+;W[gr];B[fo];W[hq];B[fs];W[ds];B[ar];W[gs];B[ck];W[bs];B[cp];W[do]C[!B2];B[br];W[cs]C[!H5]\r
+;B[ho];W[gp];B[ie];W[lc];B[md];W[ld];B[le];W[ke]C[!L16];B[kd];W[oc];B[ob];W[nb];B[mb]\r
+;W[mc];B[na];W[me];B[nd];W[ne];B[nb];W[lf];B[kq];W[rq]C[!G5];B[go];W[mo]C[#Something around L6 looks right.\r
+L6];B[bg]\r
+;W[mq];B[mr];W[nr];B[mp];W[oq];B[np];W[op];B[or];W[pr];B[ns];W[pq];B[fe];W[bf]C[#locally K12 is better than J13\r
+K12]\r
+;B[ig];W[kh];B[no];W[nn]C[#Other moves possible: !N6, though.\r
+M7|M8];B[mn];W[mm];B[ln];W[lm];B[ii];W[jj];B[hk];W[ef]C[!H12]\r
+;B[hh];W[dh];B[bm];W[di];B[ci];W[kn];B[lo];W[il]C[!L7];B[km];W[jn];B[ir];W[cg];B[fi]\r
+;W[dj];B[bh];W[jp]C[!D19];B[da];W[ca];B[dc];W[ed];B[ec];W[fm];B[dm];W[cj];B[bj];W[dk]C[!F6]\r
+;B[fn]C[L:9];W[em];B[cl];W[kp];B[fk];W[jq];B[kr]C[L:10];W[jr];B[gm];W[gl];B[en];W[hm]\r
+;B[gn];W[ks];B[oo]C[L:9];W[po];B[lq]C[L:8];W[ps];B[fl]C[L:9];W[hl];B[dl]C[L:10];W[gk];B[gj]\r
+;W[fd];B[gd];W[ge]C[H16];B[ff];W[gc];B[gb];W[hd];B[hc]C[L:8];W[gd];B[jd]C[L:9];W[id];B[je]C[L:10]\r
+;W[jc];B[kc];W[hb]C[J18];B[jb];W[ib];B[fa];W[jc]C[E18];B[cd];W[bd];B[eb]C[L:8];W[ha];B[ga]C[L:9]\r
+;W[lb];B[ja]C[L:7];W[kb];B[ic]C[L:8];W[hf];B[jh]C[L:9];W[kg];B[jf]C[L:8];W[fg];B[ls]C[L:9];W[js]\r
+;B[se]C[L:10];W[sf];B[sd];W[rf];B[la];W[ag];B[ik];W[jk];B[hp];W[gq];B[in];W[im]C[!L11]\r
+;B[ki];W[ji];B[nm];W[kl];B[ij]C[L:8];W[ah];B[bi]C[L:9];W[ai];B[aj]C[L:10];W[af];B[al];W[io]\r
+;B[os];W[qp];B[hn];W[ip];B[dn];W[ek];B[el];W[an];B[cn];W[am];B[bk];W[jg];B[he]\r
+;W[gg];B[hg];W[gh];B[gi];W[gf];B[if];W[ei];B[bn];W[ao];B[fh];W[eh];B[ko];W[lp]\r
+;B[ih];W[le];B[ka];W[jo];B[mo];W[hc];B[jc];W[kf];B[kj];W[kk];B[nl];W[mk];B[om]\r
+;W[pn];B[ia];W[ej];B[fj];W[];B[]C[J2 removed\r
+C3 removed\r
+C16 removed\r
+R3 removed\r
+P7 removed\r
+L10 removed\r
+L7 removed\r
+R14 removed\r
+F14 removed\r
+final_score: W+113.5])\r
diff --git a/regression/games/nngs/silverado-gnugo-3.3.5-200208061810.sgf b/regression/games/nngs/silverado-gnugo-3.3.5-200208061810.sgf
new file mode 100644 (file)
index 0000000..43a23b0
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[3]
+SZ[19]HA[9]KM[0.5]
+PW[silverado]
+WR[12k]
+PB[GnuGo (GNU Go 3.3.5)]
+BR[14k*]PC[NNGS]
+DT[2002-08-06]
+AP[gnugoclient:2.0]
+RE[B+Resign]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp];W[nc];B[pf];W[fc];B[fd];W[dc];
+B[ec];W[eb];B[ed];W[cc];B[be];W[gd];B[ge];W[hd];B[fb];W[cd];B[ce];
+W[bd];B[db];W[cb];B[ea];W[ab];B[he];W[id];B[ie];W[jc];B[kc];W[jb];
+B[ba];W[ca];B[ad];W[ac];B[bb];W[ae];B[ke];W[bf];B[cf];W[bg];B[bi];
+W[cg];B[df];W[kb];B[ob];W[ne];B[ng];W[lf];B[lh];W[lc];B[kd];W[ff];
+B[hb];W[ic];B[dm];W[dg];B[eh];W[ci];B[cj];W[di];B[gh];W[ei];B[eg];
+W[ef];B[de];W[gg];B[fi];W[ej];B[fl];W[hg];B[bh];W[gc];B[gf];W[fg];
+B[fh];W[jg];B[kf];W[jf];B[kg];W[je];B[jh];W[ig];B[nq];W[fe];B[gb];
+W[da];B[eb];W[qc];B[pc];W[qd];B[re];W[qe];B[qf];W[rd];B[qb];W[pe];
+B[oe];W[od];B[of]C[L:9];W[rb];B[sd];W[rc];B[pb]C[L:10];W[rf];B[rg];
+W[se];B[ra];W[qn];B[sg];W[sc];B[sf];W[nb];B[qa];W[oa];B[re];W[gj];
+B[fj];W[rf];B[on];W[oc];B[ro];W[na];B[fq];W[qp];B[qo];W[qq];B[sq];
+W[or];B[nr];W[oq];B[np];W[op];B[pn]C[L:9];W[oo];B[po]C[L:10];W[no];
+B[rr];W[qr];B[mm];W[lp];B[lr];W[kq];B[kr];W[jq];B[mo];W[mn];B[ln]
+C[L:9];W[nn];B[lo];W[nm];B[lm]C[L:10];W[nk];B[nl];W[om];B[ol];W[pm];
+B[qm];W[pl];B[pk];W[ql];B[rm];W[rl];B[mk];W[rp];B[sp];W[rj];B[rs];
+W[pq];B[jk];W[mp];B[kp];W[lq];B[iq]C[L:9];W[jr];B[ir]C[L:10];W[os];
+B[sl];W[sk];B[sm];W[rn];B[sn];W[rh];B[re];W[pa];B[js];W[cq];B[qk];
+W[rk];B[si];W[qi];B[ri];W[qh];B[sh];W[qj];B[nj];W[oi];B[cp];W[mh];
+B[mg];W[oj];B[ok];W[nh];B[bq];W[lg];B[me];W[li];B[kh];W[mj];B[ni];
+W[ph];B[og];W[oh];B[hh];W[if];B[ih];W[lk];B[gk];W[kl];B[im];W[jm];
+B[jn];W[kn];B[km];W[ml];B[ll];W[mi];B[kk];W[nk];B[nj];W[rf];B[qg];
+W[ld];B[le];W[rq];B[sr];W[ni];B[nk];W[pi];B[lj];W[ki];B[md];W[mc];
+B[nd];W[ji];B[ii];W[ek];B[ch];W[dh];B[dk];W[el];B[dl];W[em];B[fm];
+W[en];B[fn];W[bk];B[bj];W[bm];B[dn];W[bo];B[al];W[bp];B[dq];W[ak];
+B[cn];W[bn];B[cl];W[bl];B[am];W[cr];B[br];W[dr];B[er];W[ep];B[eo];
+W[fo];B[do];W[fp];B[gp];W[go];B[ho];W[gn];B[fk];W[af];B[ah];W[hf];
+B[ib];W[ia];B[re];W[ha];B[rf];W[hn];B[hp]C[L:8];W[eq];B[gr]C[L:9];
+W[es];B[fr]C[L:10];W[bs];B[cs];W[ds];B[fs];W[aq];B[cs];W[ap];B[an];
+W[cr];B[ar];W[ds];B[dr];W[aj];B[sd];W[sa];B[se];W[ga];B[ag];W[ad];
+B[aa];W[bc];B[ba];W[ee];B[aa];W[fa];B[ja]
+)
diff --git a/regression/games/nngs/silverado-gnugo-3.3.8-200209120723.sgf b/regression/games/nngs/silverado-gnugo-3.3.8-200209120723.sgf
new file mode 100644 (file)
index 0000000..2705468
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[silverado]WR[9k]
+PB[GnuGo (GNU Go 3.3.8)]BR[12k*]
+PC[NNGS]DT[2002-09-12]AP[gnugoclient:2.0]
+AB[dd][pd][dp][pp]
+;W[nc];B[jd];W[ne];B[pf];W[pb];B[qc];W[qj];B[qb];W[kc];B[jc];W[fc]
+;B[cf];W[db];B[cc];W[fe];B[cb];W[fg];B[kb];W[lc];B[jf];W[ng];B[jp]
+;W[nq];B[oq];W[np];B[pn];W[rg];B[ph];W[qh];B[fq];W[dn];B[cl];W[co]
+;B[ci];W[cq];B[ob];W[nb];B[pc];W[nn];B[lq];W[hp];B[fo];W[hn];B[hq]
+;W[gq];B[iq];W[gp];B[gr];W[fr];B[er];W[fp];B[eq];W[ep];B[eo];W[dq]
+;B[do];W[cp];B[em];W[en];B[fn];W[fm];B[dm];W[cn];B[gm];W[fl];B[gn]
+;W[im];B[gl];W[fk];B[ho];W[io];B[ip];W[qo];B[po];W[rq];B[om];W[oj]
+;B[nr];W[mr];B[or];W[mq];B[rm];W[qn];B[qm];W[qr];B[rn];W[ro];B[qp]
+;W[rp];B[sr];W[so];B[rf];W[hj];B[qg];W[rh];B[hc];W[he];B[il];W[jj]
+;B[jl];W[lp];B[kn];W[ml];B[dr];W[cr];B[eb];W[fb];B[hf];W[ie];B[if]
+;W[je];B[ke];W[kf];B[kd];W[kk];B[hh];W[fi];B[gf];W[ge];B[lf];W[kg]
+;B[lg];W[kh];B[nh];W[mh];B[lh];W[mg];B[ff];W[ef];B[eg];W[eh];B[dg]
+;W[ed];B[dc];W[mi];B[ki];W[ji];B[jh];W[ia];B[lb];W[mb];B[ld];W[md]
+;B[gg];W[ih];B[jg];W[gh];B[ej];W[fh];B[hi];W[gj];B[ii];W[ij];B[kr]
+;W[hb];B[ga];W[fa];B[gc];W[ec];B[gb];W[ea];B[de];W[jb];B[ee];W[ic]
+;B[id];W[hd];B[ib];W[gi];B[nm];W[mm];B[rk];W[pl];B[hg];W[ic];B[fd]
+;W[cm];B[mc];W[ds];B[dk];W[es];B[go];W[hr];B[hk];W[ir];B[qq];W[pr]
+;B[rr];W[rs];B[sq];W[jn];B[kp];W[lo];B[km];W[jr];B[lr];W[ns];B[ls]
+;W[ms];B[ko];W[gk];B[eq];W[gs];B[hl];W[kl];B[jq];W[pm];B[os];W[on]
+;B[op];W[no];B[rj];W[oh];B[pi];W[qi];B[bl];W[bm];B[pj];W[qk];B[pk]
+;W[ql];B[rl];W[ok];B[am];W[an];B[al];W[kj];B[oi];W[og];B[pg];W[ni]
+;B[li];W[lj];B[sg];W[ek];B[dl];W[di];B[dj];W[dh];B[ch];W[oe];B[oa]
+;W[lc];B[sh];W[si];B[sf];W[ri];B[sj];W[ol];B[pe];W[la];B[ka];W[ma]
+;B[mf];W[me];B[od];W[le];B[kc];W[mc];B[nf];W[of];B[oc];W[oo];B[sn]
+;W[na];B[ei];W[nd];B[fj];W[el];B[];W[jk];B[jm];W[ln];B[];W[js];B[]
+;W[ks];B[];W[kq];B[]C[game adjourned])
diff --git a/regression/games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf b/regression/games/nngs/sjfried-gnugo-3.5.2gf1-200312130838.sgf
new file mode 100644 (file)
index 0000000..9d8c4f2
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[sjfried]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-13]AP[gnugoclient:2.0]
+RE[W+15.5]
+AB[gc][cg]
+;W[fg];B[cc];W[ce];B[df];W[de];B[ef];W[ff];B[ed];W[ee];B[eh];W[fd]
+;B[gd];W[ec];B[hf];W[ge];B[db];W[he];B[dd];W[fc];B[fb];W[eb];B[ea]
+;W[gb];B[fa];W[ga];B[da];W[hc];B[bd];W[be];B[bb];W[cd];B[dc];W[hd]
+;B[ae];W[af];B[bh];W[ad];B[bc];W[fh];B[dh];W[bg];B[ah];W[eg];B[ei]
+;W[fi];B[ac];W[ae];B[cf];W[fe];B[dg];W[bf];B[ag];W[ci];B[bi];W[];B[]
+C[final_score: W+15.5
+H4 removed
+C1 removed])
diff --git a/regression/games/nngs/sjfried-gnugo-3.5.2gf1-200312210441.sgf b/regression/games/nngs/sjfried-gnugo-3.5.2gf1-200312210441.sgf
new file mode 100644 (file)
index 0000000..33dbf46
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[sjfried]WR[1k*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-21]AP[gnugoclient:2.0]
+RE[W+37.5]
+AB[gc][cg]
+;W[gf];B[ef];W[fg];B[dc];W[ce];B[ed];W[bc];B[bf];W[cb];B[be];W[db]
+;B[eb];W[cc];B[ba];W[dd];B[ec];W[df];B[eg];W[dg];B[eh];W[ee];B[ff]
+;W[fe];B[gg];W[dh];B[fh];W[bh];B[ge];W[gd];B[hd];W[he];B[hh];W[hc]
+;B[hf];W[id];B[if];W[gb];B[di];W[ci];B[ei];W[ch];B[ge];W[fd];B[ie]
+;W[gf];B[ic];W[ib];B[ge];W[hd];B[gf];W[];B[]C[final_score: W+37.5
+B9 removed
+E8 removed
+G7 removed
+B5 removed
+C3 removed]
+)
diff --git a/regression/games/nngs/speciman-gnugo-3.1.32-200204211014.sgf b/regression/games/nngs/speciman-gnugo-3.1.32-200204211014.sgf
new file mode 100644 (file)
index 0000000..0f73cba
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[0.5]
+PW[speciman]WR[12k*]
+PB[GnuGo (GNU Go 3.1.32)]BR[13k*]
+PC[NNGS]DT[2002-04-21]AP[gnugoclient:2.0]
+RE[W+5.5]
+;B[ee];W[fg];B[gf];W[ef];B[gg];W[de];B[ed];W[dd];B[cc];W[dc];B[cd]
+C[L:7];W[ce];B[ff]C[L:8];W[eg];B[db]C[L:9];W[eb];B[be]C[L:8];W[bf]
+;B[ad]C[L:9];W[gc];B[gh]C[L:7];W[fh];B[cb]C[L:8];W[fe];B[af]C[L:9]
+;W[bg];B[fd]C[L:10];W[ge];B[gd];W[he];B[hd];W[hc];B[id];W[hf];B[hg]
+;W[gi];B[hi];W[fi];B[ih];W[ec];B[ag];W[ah];B[ea];W[fa];B[da];W[fc]
+;B[ie];W[ic];B[if];W[ae];B[af];W[ag];B[];W[ae];B[bd];W[af];B[bb];W[]
+;B[]C[final_score: W+5.5])
diff --git a/regression/games/nngs/speciman-gnugo-3.5.2-200312091734.sgf b/regression/games/nngs/speciman-gnugo-3.5.2-200312091734.sgf
new file mode 100644 (file)
index 0000000..fc4f53a
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[0.5]
+PW[speciman]WR[7k*]
+PB[GnuGo (GNU Go 3.5.2)]BR[8k*]
+PC[NNGS]DT[2003-12-09]AP[gnugoclient:2.0]
+RE[W+2.5]
+;B[ee];W[de];B[dd];W[df];B[fd];W[cd];B[fg];W[dc];B[eb];W[ed];B[ef]
+;W[fc];B[gd];W[ec];B[cg];W[dg];B[dh];W[eh];B[ch];W[eg];B[be];W[bd]
+;B[bf];W[gf];B[gg];W[gc];B[hf];W[hd];B[ge];W[he];B[ff];W[fh];B[ad]
+;W[ae];B[ac];W[bc];B[ab];W[bb];B[af];W[bh];B[bi];W[ah];B[di];W[ai]
+;B[gh];W[ei];B[gi];W[ce];B[bg];W[ci];B[ag];W[cf];B[bi];W[ba];B[ie]
+;W[ic];B[if];W[id];B[ae];W[aa];B[fi];W[];B[]C[final_score: W+2.5
+E8 removed]
+)
diff --git a/regression/games/nngs/takeda-gnugo-3.3.23-200307302010.sgf b/regression/games/nngs/takeda-gnugo-3.3.23-200307302010.sgf
new file mode 100644 (file)
index 0000000..487c4d3
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[3]KM[0.5]
+PW[takeda]WR[NR]
+PB[GnuGo (GNU Go 3.3.23)]BR[8k*]
+PC[NNGS]DT[2003-07-30]AP[gnugoclient:2.0]
+RE[W+12.5]
+AB[dd][pd][dp]
+;W[pp];B[nq];W[qn];B[pr];W[mq];B[mp];W[lq];B[qq];W[nr];B[dj];W[oq]
+;B[np];W[qf];B[pf];W[pg];B[of];W[qd];B[qe];W[re];B[qg];W[pe];B[ph]
+;W[rg];B[oe];W[qh];B[og];W[pc];B[pi];W[qi];B[pj];W[od];B[le];W[jj]
+;B[cn];W[df];B[fd];W[cd];B[cc];W[ce];B[bc];W[ff];B[hq];W[fq];B[fp]
+;W[eq];B[gp];W[dq];B[ep];W[cp];B[co];W[bp];B[lc];W[md];B[ld];W[gd]
+;B[gc];W[hd];B[mc];W[hc];B[gb];W[fe];B[ed];W[nd];B[hb];W[jc];B[ib]
+;W[jd];B[lg];W[kf];B[lf];W[kg];B[qj];W[rj];B[rk];W[ri];B[jb];W[am]
+;B[hj];W[cl];B[dl];W[ck];B[dh];W[dk];B[el];W[ek];B[fh];W[gk];B[fl]
+;W[fk];B[hh];W[hk];B[ei];W[gi];B[gj];W[ci];B[af];W[bf];B[hi];W[eg]
+;B[ae];W[ag];B[bg];W[ad];B[ah];W[cg];B[ch];W[bd];B[jh];W[kh];B[bi]
+;W[cj];B[bj];W[bk];B[aj];W[hn];B[io];W[ho];B[hp];W[jp];B[ip];W[jo]
+;B[mi];W[mk];B[lj];W[lk];B[fn];W[rp];B[or];W[mr];B[rq];W[qp];B[rs]
+;W[os];B[sr];W[in];B[ki];W[ji];B[ig];W[if];B[hf];W[kj];B[li];W[he]
+;B[gf];W[jg];B[ih];W[ge];B[di];W[be];B[ag];W[fg];B[gg];W[ee];B[mm]
+;W[ol];B[om];W[pm];B[ql];W[pl];B[ac];W[de];B[gr];W[fr];B[pq];W[op]
+;B[ke];W[je];B[jq];W[kq];B[jr];W[gm];B[bm];W[an];B[ob];W[pb];B[nb]
+;W[fm];B[em];W[cm];B[bn];W[ao];B[pa];W[qa];B[oa];W[rb];B[lh];W[jf]
+;B[kr];W[rm];B[ps];W[ns];B[kp];W[lp];B[ko];W[lo];B[jn];W[ln];B[bl]
+;W[al];B[ak];W[jm];B[kn];W[gl];B[dm];W[km];B[nj];W[nk];B[gs];W[fs]
+;B[bo];W[ap];B[cq];W[bq];B[en];W[cr];B[dg];W[cf];B[ic];W[id];B[lr]
+;W[fj];B[fi];W[pk];B[qk];W[oj];B[oi];W[mj];B[ni];W[kc];B[kb];W[nc]
+;B[ij];W[ik];B[go];W[ne];B[nf];W[me];B[mf];W[oc];B[ma];W[sp];B[sj]
+;W[si];B[sk];W[sm];B[qm];W[rn];B[gq];W[qg];B[ls];W[eh];B[ok];W[jp]
+;B[jo];W[oj];B[lm];W[no];B[ok];W[mb];B[lb];W[oj];B[mn];W[mo];B[ok]
+;W[do];B[dn];W[oj];B[jk];W[jl];B[ok];W[dc];B[db];W[oj];B[ii];W[kk]
+;B[ok];W[fc];B[ec];W[oj];B[qb];W[qc];B[ok];W[eb];B[fb];W[oj];B[ra]
+;W[sa];B[ok];W[gn];B[oj];W[ej];B[sq];W[rl];B[sl];W[kd];B[ms];W[];B[]
+C[final_score: W+12.5
+E18 removed
+G11 removed
+M7 removed
+P7 removed
+D5 removed]
+)
diff --git a/regression/games/nngs/takeda-gnugo-3.4-200308142205.sgf b/regression/games/nngs/takeda-gnugo-3.4-200308142205.sgf
new file mode 100644 (file)
index 0000000..5b1fbb2
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[takeda]WR[NR]
+PB[GnuGo (GNU Go 3.4)]BR[8k*]
+PC[NNGS]DT[2003-08-14]AP[gnugoclient:2.0]
+RE[W+0.5]
+AB[pd][dp]
+;W[pp];B[dd];W[qf];B[nd];W[pj];B[nq];W[lq];B[no];W[pn];B[nm];W[ol]
+;B[jq];W[lo];B[gq];W[lm];B[pr];W[oq];B[op];W[oo];B[np];W[pq];B[ml]
+;W[nn];B[or];W[mr];B[qq];W[nr];B[qp];W[po];B[mj];W[cf];B[df];W[dg]
+;B[ef];W[cd];B[cc];W[ce];B[dc];W[cj];B[hd];W[lc];B[me];W[oc];B[od]
+;W[nc];B[mn];W[mo];B[on];W[om];B[nn];W[qo];B[pc];W[ro];B[rr];W[sq]
+;B[sr];W[sp];B[os];W[ln];B[qs];W[rd];B[cm];W[cq];B[cp];W[dq];B[eq]
+;W[er];B[fr];W[ep];B[fq];W[bp];B[bo];W[co];B[do];W[bq];B[dr];W[cr]
+;B[es];W[cn];B[bn];W[dn];B[eo];W[en];B[fo];W[fn];B[bk];W[bj];B[ck]
+;W[dk];B[ar];W[cl];B[bl];W[dl];B[jk];W[dm];B[qh];W[bm];B[oh];W[ao]
+;B[rg];W[qb];B[pb];W[qc];B[mc];W[rf];B[gh];W[hc];B[ic];W[ib];B[mb]
+;W[jc];B[id];W[gb];B[rj];W[rl];B[ld];W[kb];B[gk];W[rk];B[bd];W[ni]
+;B[mg];W[mi];B[kh];W[go];B[fp];W[eg];B[ll];W[li];B[ff];W[il];B[ik]
+;W[jp];B[ip];W[io];B[hp];W[ho];B[kp];W[lp];B[jo];W[jn];B[hl];W[kl]
+;B[kk];W[jl];B[sj];W[qj];B[ri];W[pi];B[ph];W[ki];B[ii];W[jh];B[ji]
+;W[lh];B[kg];W[lg];B[kf];W[lf];B[jd];W[kd];B[ke];W[kc];B[gc];W[hb]
+;B[ja];W[le];B[md];W[fc];B[ka];W[gd];B[eb];W[jb];B[hf];W[la];B[lb]
+;W[ia];B[ka];W[fb];B[fd];W[ed];B[fe];W[ec];B[da];W[ge];B[he];W[de]
+;B[ee];W[bb];B[bc];W[gf];B[fg];W[cb];B[db];W[be];B[ab];W[gg];B[ih]
+;W[fh];B[gi];W[hg];B[if];W[ig];B[jg];W[nk];B[lj];W[hm];B[gm];W[gn]
+;B[qa];W[ra];B[pa];W[sb];B[kj];W[ko];B[nj];W[oi];B[nl];W[kr];B[jr]
+;W[js];B[is];W[ks];B[jp];W[ir];B[hs];W[hr];B[gs];W[cs];B[ok];W[pk]
+;B[oj];W[of];B[mf];W[nh];B[sh];W[sf];B[sg];W[fj];B[ma];W[gj];B[ng]
+;W[hj];B[hk];W[fm];B[pg];W[pf];B[og];W[qd];B[fi];W[ei];B[ds];W[gl]
+;B[fk];W[ek];B[fl];W[el];B[ae];W[af];B[ad];W[kq];B[gp];W[ns];B[rp]
+;W[so];B[rq];W[sk];B[ij];W[pe];B[hi];W[fa];B[ej];W[dj];B[fj];W[mq]
+;B[gm];W[aa];B[ba];W[gl];B[pl];W[pm];B[gm];W[gr];B[fs];W[gl];B[bf]
+;W[bg];B[gm];W[ja];B[gl];W[la];B[ag];W[ah];B[ka];W[mm];B[la];W[qi]
+;B[mh];W[qg];B[qk];W[ql];B[pk];W[];B[mp];W[];B[oe];W[];B[nf];W[]
+;B[ea];W[];B[hh];W[];B[]C[final_score: W+0.5
+B18 removed
+O17 removed
+B9 removed
+O9 removed
+B6 removed
+A2 removed
+G2 removed]
+)
diff --git a/regression/games/nngs/theDoor-gnugo-3.3.11-200211130142.sgf b/regression/games/nngs/theDoor-gnugo-3.3.11-200211130142.sgf
new file mode 100644 (file)
index 0000000..f7df24b
--- /dev/null
@@ -0,0 +1,42 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[theDoor]WR[6k*]
+PB[GnuGo (GNU Go 3.3.11)]BR[11k*]
+PC[NNGS]DT[2002-11-13]AP[gnugoclient:2.0]
+RE[B+26.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[gp];B[dn];W[pf];B[nd];W[qc];B[pc];W[qd];B[qn];W[np];B[of];W[og]
+;B[nf];W[pe];B[fc];W[oe];B[ne];W[od];B[mh];W[nj];B[ce];W[cl];B[cn]
+;W[el];B[fn];W[dq];B[cp];W[ep];B[hn];W[eo];B[cq];W[en];B[dm];W[dl]
+;B[fj];W[gl];B[il];W[jn];B[fm];W[em];B[fl];W[bj];B[ii];W[dh];B[ci]
+;W[cf];B[df];W[bh];B[ch];W[ej];B[ek];W[ei];B[dk];W[ck];B[bg];W[cj]
+;B[di];W[cg];B[dg];W[bf];B[bi];W[ag];B[ai];W[be];B[bd];W[gk];B[io]
+;W[eh];B[fk];W[gh];B[hi];W[ee];B[ff];W[de];B[ef];W[cd];B[cc];W[bc]
+;B[ce];W[fe];B[cd];W[gf];B[hq];W[gq];B[pl];W[dr];B[cr];W[hr];B[oq]
+;W[lp];B[ds];W[er];B[bb];W[gd];B[ig];W[ie];B[je];W[if];B[jf];W[jg]
+;B[jh];W[kg];B[kh];W[li];B[lh];W[kl];B[iq];W[ir];B[jr];W[kq];B[kr]
+;W[lr];B[kp];W[lq];B[jq];W[im];B[hm];W[ik];B[jk];W[jl];B[hl];W[qq]
+;B[qo];W[rp];B[pr];W[rr];B[lo];W[mo];B[ln];W[mn];B[mm];W[lm];B[ll]
+;W[km];B[ko];W[ml];B[nm];W[lk];B[ro];W[sq];B[rs];W[pq];B[op];W[qs]
+;B[nc];W[oc];B[hb];W[ec];B[ed];W[fd];B[fb];W[id];B[ic];W[hc];B[ib]
+;W[hg];B[ih];W[ss];B[nq];W[om];B[nn];W[nl];B[on];W[ol];B[qi];W[pm]
+;B[pg];W[pn];B[qm];W[ql];B[pk];W[po];B[oo];W[qp];B[so];W[rl];B[rm]
+;W[rj];B[rk];W[qk];B[qj];W[sk];B[qg];W[ri];B[ob];W[pb];B[nb];W[rf]
+;B[rg];W[nr];B[or];W[mr];B[mp];W[mq];B[no];W[mp];B[ls];W[ks];B[js]
+;W[ps];B[ns];W[es];B[cs];W[fq];B[ni];W[oi];B[oj];W[mi];B[oh];W[nh]
+;B[ng];W[ni];B[re];W[qf];B[sf];W[ph];B[og];W[qh];B[rd];W[rc];B[gc]
+;W[hd];B[bm];W[bl];B[gi];W[fg];B[am];W[fi];B[ah];W[in];B[go];W[hp]
+;B[ho];W[fo];B[ae];W[eg];B[is];W[gr];B[pa];W[qa];B[oa];W[qe];B[sg]
+;W[rh];B[ki];W[kj];B[kk];W[lj];B[kn];W[jm];B[do];W[qr];B[ms];W[af]
+;B[ad];W[hs];B[sh];W[si];B[aj];W[ak];B[al];W[bg];B[bk];W[ij];B[ji]
+;W[ak];B[cm];W[bk];B[sd];W[sc];B[se];W[];B[hh];W[ip];B[jo];W[ll]
+;B[os];W[];B[]
+C[S5 removed
+final_score: B+26.5
+B17 removed
+E17 removed
+K13 removed
+R11 removed
+J10 removed
+G9 removed]
+)
diff --git a/regression/games/nngs/thor-gnugo-3.3.12-200212170003.sgf b/regression/games/nngs/thor-gnugo-3.3.12-200212170003.sgf
new file mode 100644 (file)
index 0000000..973a8aa
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[thor]WR[NR]
+PB[GnuGo (GNU Go 3.3.12)]BR[10k*]
+PC[NNGS]DT[2002-12-17]AP[gnugoclient:2.0]
+RE[W+85.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nf];B[nd];W[qf];B[qn];W[md];B[me];W[ne];B[ld];W[mc];B[le];W[nc]
+;B[od];W[pb];B[pf];W[pg];B[gd];W[fp];B[dn];W[jq];B[kq];W[kp];B[lq]
+;W[jo];B[ip];W[iq];B[ko];W[lp];B[mp];W[lo];B[kn];W[ln];B[hp];W[hq]
+;B[lm];W[no];B[mo]C[L:9];W[mn];B[nn];W[mm];B[np];W[km];B[jn]C[L:10]
+;W[in];B[jm];W[ll];B[nm];W[nl];B[oo];W[gp];B[io];W[ho];B[jo];W[jl]
+;B[im];W[hn];B[il];W[jk];B[ik];W[ij];B[hj];W[ii];B[kj];W[hk];B[dl]
+;W[hl];B[eq];W[ql];B[hi];W[ih];B[ff];W[be];B[bc];W[bj];B[bh];W[ch]
+;B[bg];W[de];B[ci];W[ed];B[ee];W[ec];B[cd];W[ce];B[bd];W[dg];B[db]
+;W[eb];B[dc];W[hc];B[ae];W[hd];B[df];W[fe];B[ef];W[ge];B[lg];W[mh]
+;B[qe];W[rf];B[jf];W[kb];B[mj];W[li];B[lj];W[ki];B[pl];W[pk];B[qk]
+;W[ok];B[rl];W[qj];B[rk];W[rj];B[oj];W[rh];B[ol];W[nk];B[oi];W[sk]
+;B[mi];W[mg];B[og];W[of];B[ph];W[pe];B[sl];W[cq];B[cp];W[er];B[bq]
+;W[dr];B[br];W[gh];B[fi];W[fh];B[ea];W[fa];B[da];W[fb];B[jb];W[kc]
+;B[jc];W[gf];B[kd];W[fj];B[dh];W[eh];B[cg];W[ei];B[kr];W[jr];B[ka]
+;W[ma];B[la];W[lb];B[jh];W[ji];B[dq];W[fr];B[sj];W[ks];B[ri];W[qi]
+;B[qh];W[si];B[pi];W[sk];B[mb];W[ja];B[mr];W[sj];B[ls];W[js];B[fn]
+;W[cr];B[fl];W[eg];B[gm];W[hm];B[cs];W[fg];B[cf];W[ds];B[bs];W[eo]
+;B[fo];W[ep];B[fq];W[gq];B[di];W[do];B[co];W[en];B[em];W[fk];B[cn]
+;W[ek];B[gl];W[dk];B[ck];W[el];B[dm];W[gk];B[gn];W[go];B[fm];W[]
+;B[ej];W[];B[]
+C[final_score: W+85.5
+K18 removed
+N18 removed
+G16 removed
+O16 removed
+B15 removed
+R15 removed
+K14 removed
+M13 removed
+P13 removed
+K12 removed
+Q12 removed
+F11 removed
+H11 removed
+N11 removed
+B10 removed
+R8 removed]
+)
diff --git a/regression/games/nngs/tobyiii-gnugo-3.3.2-200206041432.sgf b/regression/games/nngs/tobyiii-gnugo-3.3.2-200206041432.sgf
new file mode 100644 (file)
index 0000000..de2dcf6
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[tobyiii]WR[7k*]
+PB[GnuGo (GNU Go 3.3.2)]BR[14k*]
+PC[NNGS]DT[2002-06-04]AP[gnugoclient:2.0]
+RE[W+5.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[mq];B[mo];W[gq];B[go];W[cm];B[oo];W[cg];B[eg];W[mc];B[oc];W[eo]
+;B[ee];W[cq];B[eq];W[cp];B[gr];W[fr];B[fq];W[hr];B[gp];W[gs];B[do]
+;W[er];B[qf];W[cc];B[ce];W[bd];B[bf];W[ec];B[dn];W[cn];B[me];W[ic]
+;B[co];W[bo];B[nl];W[kc];B[jc];W[jb];B[gf];W[id];B[je];W[gd];B[dc]
+;W[db];B[fm];W[nd];B[ne];W[be];B[cf];W[dm];B[jr];W[en];B[ep];W[em]
+;B[ek];W[fl];B[gm];W[el];B[hk];W[gl];B[hl];W[hm];B[hn];W[im];B[hp]
+;W[iq];B[kp];W[hf];B[he];W[ie];B[if];W[jf];B[gj];W[ig];B[lg];W[gn]
+;B[fn];W[fo];B[gn];W[fp];B[ck];W[ip];B[io];W[in];B[jo];W[ed];B[cd]
+;W[bc];B[ld];W[gg];B[ge];W[fj];B[fk];W[gk];B[gi];W[fi];B[fg];W[gh]
+;B[hh];W[fh];B[eh];W[hi];B[hj];W[ii];B[ij];W[hg];B[ji];W[kf];B[kd]
+;W[lc];B[nb];W[pr];B[qq];W[qr];B[rr];W[lp];B[lr];W[lo];B[oq];W[or]
+;B[mn];W[kn];B[jn];W[jm];B[km];W[kl];B[lm];W[jl];B[mr];W[nq];B[nr]
+;W[pq];B[rq];W[op];B[ln];W[ko];B[lq];W[mp];B[no];W[jq];B[kq];W[kh]
+;B[lj];W[lh];B[mh];W[mi];B[nh];W[li];B[ih];W[mj];B[lk];W[mk];B[ml]
+;W[lf];B[oi];W[rs];B[qp];W[ks];B[bl];W[js];B[ch];W[hq];B[ho];W[ns]
+;B[os];W[ps];B[np];W[oq];B[ss];W[sr];B[mg];W[kg];B[fd];W[fc];B[fe]
+;W[kr];B[kk];W[af];B[is];W[ir];B[ag];W[ae];B[bg];W[bm];B[hd];W[fb]
+;B[gc];W[gb];B[od];W[mb];B[hc];W[hb];B[nc];W[md];B[le];W[mf];B[nf]
+;W[nk];B[ok];W[ej];B[dk];W[ls];B[ll];W[ei];B[ma];W[kb];B[la];W[ka]
+;B[di];W[al];B[ak];W[am];B[jk];W[ms];B[cl];W[jh];B[sq];W[ni];B[oh]
+;W[ki];B[ss];W[qs];B[il];W[sr];B[bb];W[cb];B[ss];W[aj];B[bk];W[sr]
+;B[ib];W[ia];B[ss];W[lb];B[na];W[sr];B[dl];W[ss];B[ke];W[nj];B[oj]
+;W[kj];B[]
+C[D5 removed
+J1 removed
+B18 removed
+A10 removed
+C13 removed
+final_score: W+5.5]
+)
diff --git a/regression/games/nngs/tommmal-gnugo-3.4-200308200805.sgf b/regression/games/nngs/tommmal-gnugo-3.4-200308200805.sgf
new file mode 100644 (file)
index 0000000..3e6a039
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[tommmal]WR[5k*]
+PB[GnuGo (GNU Go 3.4)]BR[8k*]
+PC[NNGS]DT[2003-08-20]AP[gnugoclient:2.0]
+RE[W+60.5]
+AB[dd][pd][dp][pp]
+;W[qf];B[nc];W[qn];B[nq];W[on];B[of];W[og];B[kq];W[nf];B[pg];W[pf]
+;B[oh];W[oe];B[qd];W[nh];B[qh];W[oi];B[ph];W[re];B[qj];W[rk];B[rj]
+;W[rm];B[pi];W[oj];B[kc];W[cn];B[fp];W[cf];B[fd];W[ef];B[en];W[em]
+;B[fm];W[el];B[ce];W[bf];B[bo];W[co];B[cp];W[bn];B[gf];W[gg];B[gk]
+;W[fl];B[gm];W[gl];B[hl];W[hm];B[il];W[hn];B[go];W[jn];B[gj];W[ij]
+;B[kl];W[ln];B[kk];W[ji];B[ik];W[hj];B[hk];W[kj];B[je];W[if];B[be]
+;W[ie];B[ro];W[ip];B[hq];W[iq];B[bp];W[hr];B[kf];W[kg];B[hc];W[ic]
+;B[id];W[hd];B[jd];W[gc];B[hb];W[gd];B[gb];W[fc];B[ec];W[fb];B[ib]
+;W[fe];B[eb];W[ea];B[da];W[fa];B[cb];W[ed];B[fg];W[de];B[ej];W[gh]
+;B[ml];W[cj];B[fh];W[gi];B[fi];W[ek];B[ch];W[di];B[dh];W[dj];B[ei]
+;W[eg];B[eh];W[cd];B[bd];W[dc];B[db];W[ba];B[cc];W[dd];B[bb];W[ab]
+;B[bc];W[ae];B[hg];W[ih];B[ff];W[jf];B[rd];W[se];B[rg];W[rf];B[pk]
+;W[ok];B[hh];W[hi];B[hf];W[ad];B[bi];W[bj];B[ri];W[sh];B[sg];W[qk]
+;B[sd];W[pj];B[an];W[am];B[ao];W[bl];B[lf];W[lg];B[jr];W[gq];B[fq]
+;W[fr];B[er];W[hp];B[fs];W[gr];B[rn];W[qm];B[qo];W[mp];B[mq];W[np]
+;B[oq];W[op];B[po];W[pn];B[lp];W[oo];B[ko];W[kn];B[mf];W[mg];B[me]
+;W[od];B[oc];W[sj];B[si];W[sk];B[gn];W[dn];B[eo];W[ho];B[lo];W[mo]
+;B[ir];W[is];B[js];W[gp];B[nd];W[ne];B[sm];W[sl];B[sn];W[pe];B[jo]
+;W[in];B[jp];W[ga];B[ha];W[gs];B[es];W[hs];B[jq];W[do];B[qg];W[qe]
+;B[sf];W[io];B[]C[final_score: W+60.5
+D19 removed
+J17 removed
+F14 removed
+T12 removed
+B11 removed
+G10 removed
+L9 removed
+Q9 removed
+N8 removed]
+)
diff --git a/regression/games/nngs/tommmal-gnugo-3.4-200309021655.sgf b/regression/games/nngs/tommmal-gnugo-3.4-200309021655.sgf
new file mode 100644 (file)
index 0000000..1d9cea8
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[tommmal]WR[5k*]
+PB[GnuGo (GNU Go 3.4)]BR[8k*]
+PC[NNGS]DT[2003-09-02]AP[gnugoclient:2.0]
+AB[dd][pd][dp][pp]
+;W[qf];B[nc];W[qn];B[nq];W[on];B[of];W[ph];B[nh];W[fq];B[dj];W[dn]
+;B[fc];W[cl];B[nj];W[pk];B[fk];W[jd];B[ro];W[rn];B[qo];W[dg];B[eo]
+;W[fm];B[re];W[rf];B[qe];W[pf];B[go];W[iq];B[kq];W[jo];B[ce];W[hm]
+;B[ef];W[ci];B[co];W[dr];B[cp];W[br];B[cn];W[dm];B[bm];W[cj];B[gq]
+;W[gr];B[fp];W[eq];B[ld];W[fh];B[ck];W[bk];B[bg];W[dk];B[ej];W[hj]
+;B[kj];W[gf];B[kg];W[jf];B[sn];W[sm];B[so];W[rm];B[hc];W[hd];B[ii]
+;W[hi];B[eh];W[eg];B[kl];W[jr];B[kr];W[hq];B[ih];W[ff];B[sf];W[sg]
+;B[se];W[rg];B[ri];W[oi];B[og];W[ni];B[jb];W[cf];B[bf];W[ee];B[gd]
+;W[he];B[jc];W[mh];B[mg];W[lh];B[mi];W[li];B[mj];W[lj];B[lk];W[oh]
+;B[ng];W[mk];B[nk];W[ml];B[nl];W[mm];B[rl];W[ql];B[js];W[is];B[ks]
+;W[lf];B[lg];W[le]C[game adjourned])
diff --git a/regression/games/nngs/tommmal-gnugo-3.5.1-200309081210.sgf b/regression/games/nngs/tommmal-gnugo-3.5.1-200309081210.sgf
new file mode 100644 (file)
index 0000000..62bcd5f
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[tommmal]WR[5k*]
+PB[GnuGo (GNU Go 3.5.1)]BR[8k*]
+PC[NNGS]DT[2003-09-08]AP[gnugoclient:2.0]
+RE[W+22.5]
+AB[dd][pd][dp][pp]
+;W[qf];B[nd];W[of];B[nf];W[og];B[mh];W[qn];B[dj];W[on];B[ll];W[nq]
+;B[fc];W[fq];B[fp];W[eq];B[ep];W[dq];B[ho];W[bp];B[bn];W[hq];B[jd]
+;W[lc];B[jo];W[jq];B[nj];W[pj];B[ce];W[oc];B[ld];W[od];B[nc];W[nb]
+;B[mb];W[ob];B[lb];W[ne];B[me];W[oe];B[lo];W[kc];B[mc];W[no];B[rp]
+;W[qq];B[rq];W[qp];B[qr];W[qo];B[pq];W[or];B[ro];W[pr];B[rn];W[rr]
+;B[qm];W[qs];B[rj];W[rl];B[ql];W[rk];B[qk];W[qj];B[ri];W[rh];B[qh]
+;W[rg];B[qi];W[pm];B[ok];W[pk];B[pl];W[oi];B[om];W[pn];B[co];W[cp]
+;B[nm];W[hc];B[hd];W[jc];B[kd];W[id];B[ie];W[ic];B[gd];W[fb];B[eb]
+;W[gb];B[ia];W[mf];B[ng];W[lf];B[pi];W[oh];B[mi];W[oj];B[mg];W[kg]
+;B[jh];W[jg];B[ji];W[je];B[ha];W[kb];B[ka];W[ke];B[hg];W[le];B[gc]
+;W[hb];B[ea];W[fa];B[if];W[ig];B[ih];W[hh];B[gf];W[gh];B[mn];W[lp]
+;B[kp];W[kq];B[bo];W[mo];B[ol];W[gp];B[go];W[hj];B[ii];W[dh];B[hi]
+;W[fj];B[gi];W[fh];B[fi];W[ei];B[ej];W[fk];B[bh];W[ci];B[bi];W[cj]
+;B[ck];W[dk];B[ek];W[dl];B[el];W[bj];B[fl];W[bl];B[eg];W[dn];B[cl]
+;W[dm];B[cm];W[do];B[bk];W[fo];B[di];W[ch];B[al];W[bg];B[dg];W[be]
+;B[bd];W[bf];B[ae];W[ah];B[af];W[eh];B[ao];W[gl];B[fm];W[gm];B[fn]
+;W[eo];B[ap];W[gn];B[gk];W[gj];B[hk];W[ij];B[ik];W[kn];B[ko];W[im]
+;B[hm];W[jj];B[kj];W[in];B[io];W[hn];B[jn];W[km];B[jk];W[jm];B[mp]
+;W[ln];B[lq];W[lr];B[lp];W[hl];B[mr];W[kr];B[mq];W[np];B[bq];W[cq]
+;B[br];W[ms];B[es];W[er];B[ds];W[fs];B[cs];W[nr];B[sr];W[mm];B[ml]
+;W[nn];B[sq];W[qg];B[rm];W[jf];B[kh];W[ff];B[fg];W[gg];B[hf];W[ec]
+;B[fe];W[ed];B[db];W[dc];B[cb];W[cc];B[bc];W[ef];B[cg];W[ai];B[ee]
+;W[bb];B[cd];W[ca];B[fd];W[cr];B[bs];W[rs];B[lg];W[md];B[lm];W[mn]
+;B[kl];W[ph];B[sk];W[si];B[sl];W[ni];B[sj];W[sh];B[cn];W[jl];B[il]
+;W[ss];B[dr];W[];B[nh];W[];B[en];W[em];B[]C[final_score: W+22.5
+C19 removed
+H19 removed
+L19 removed
+B18 removed
+M18 removed
+Q16 removed
+B15 removed
+E14 removed
+G13 removed
+A12 removed
+B8 removed
+K6 removed
+Q4 removed]
+)
diff --git a/regression/games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf b/regression/games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf
new file mode 100644 (file)
index 0000000..58ec74d
--- /dev/null
@@ -0,0 +1,52 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[tommmal]WR[4k*]
+PB[GnuGo (GNU Go 3.5.1)]BR[9k*]
+PC[NNGS]DT[2003-10-07]AP[gnugoclient:2.0]
+RE[W+7.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[pf];W[pg];B[of];W[qe];B[qd];W[og];B[mg];W[qn];B[qh];W[qg]
+;B[rg];W[on];B[mn];W[nj];B[cf];W[oq];B[cn];W[rk];B[rj];W[qk];B[qj]
+;W[rf];B[ri];W[sg];B[sh];W[rh];B[ok];W[si];B[ol];W[nm];B[ml];W[mm]
+;B[mi];W[oi];B[lm];W[nl];B[ll];W[nk];B[pq];W[op];B[mq];W[rp];B[or]
+;W[nr];B[pr];W[nq];B[ec];W[mp];B[lq];W[lp];B[kp];W[ln];B[lo];W[kn]
+;B[hl];W[ko];B[jo];W[jn];B[hn];W[jl];B[mr];W[ms];B[ls];W[ns];B[kr]
+;W[kk];B[os];W[oo];B[rq];W[qp];B[sq];W[qr];B[qq];W[rr];B[po];W[qo]
+;B[mj];W[mk];B[lk];W[kj];B[ji];W[lj];B[eq];W[nc];B[ob];W[kc];B[jc]
+;W[oc];B[pc];W[nb];B[pb];W[nf];B[mf];W[ne];B[kd];W[kb];B[jb];W[rd]
+;B[rc];W[sc];B[sb];W[sd];B[rb];W[pe];B[ld];W[lc];B[ka];W[md];B[la]
+;W[lh];B[lg];W[kh];B[jf];W[jh];B[hh];W[ig];B[gf];W[if];B[ie];W[ii]
+;B[hi];W[ij];B[na];W[mh];B[ih];W[jg];B[ik];W[le];B[kf];W[in];B[io]
+;W[dl];B[em];W[bi];B[bg];W[bm];B[ck];W[bk];B[cl];W[bl];B[cm];W[cj]
+;B[bn];W[di];B[ch];W[ci];B[aj];W[bh];B[ej];W[ei];B[fh];W[am];B[ak]
+;W[dg];B[cg];W[eg];B[hm];W[ee];B[ff];W[de];B[cd];W[gd];B[an];W[bj]
+;B[fi];W[ed];B[he];W[fc];B[eb];W[fb];B[fe];W[fd];B[ah];W[ai];B[fa]
+;W[ga];B[ea];W[gb];B[hc];W[bc];B[cb];W[be];B[ce];W[bd];B[cc];W[bb]
+;B[ca];W[db];B[ag];W[ba];B[ab];W[bf];B[me];W[ng];B[od];W[nd];B[oe]
+;W[af];B[ki];W[li];B[hj];W[im];B[hb];W[ha];B[ia];W[dh];B[ef];W[df]
+;B[lb];W[mc];B[kg];W[hd];B[sp];W[pn];B[so];W[sn];B[rn];W[rm];B[sm]
+;W[sl];B[qm];W[sn];B[sr];W[rs];B[qs];W[ps];B[sm];W[rl];B[ss];W[sn]
+;B[qs];W[ro];B[fg];W[jk];B[hg];W[il];B[id];W[hf];B[mb];W[dc];B[ge]
+;W[da];B[eh];W[hp];B[ho];W[iq];B[gc];W[jq];B[kq];W[fq];B[fr];W[fp]
+;B[is];W[gr];B[er];W[ir];B[js];W[hs];B[hq];W[go];B[fo];W[gn];B[ep]
+;W[fn];B[eo];W[gk];B[gl];W[fl];B[fk];W[fm];B[en];W[el];B[dk];W[gj]
+;B[]C[final_score: W+7.5
+A18 removed
+M15 removed
+R12 removed
+N11 removed
+S11 removed
+A10 removed
+G10 removed
+M9 removed
+P9 removed
+D8 removed
+R7 removed
+N6 removed
+M5 removed
+F4 removed
+H4 removed
+J3 removed
+G2 removed
+H1 removed]
+)
diff --git a/regression/games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf b/regression/games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf
new file mode 100644 (file)
index 0000000..a960fb0
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[tommmal]WR[4k*]
+PB[GnuGo (GNU Go 3.5.1)]BR[9k*]
+PC[NNGS]DT[2003-10-14]AP[gnugoclient:2.0]
+RE[B+Resign]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[nd];W[of];B[mh];W[qn];B[pn];W[om];B[cf];W[pm];B[mm];W[qq]
+;B[cn];W[qo];B[mf];W[ni];B[lp];W[nk];B[np];W[oq];B[mk];W[nl];B[ml]
+;W[mq];B[pq];W[nq];B[qp];W[qr];B[ro];W[op];B[pr];W[rq];B[rp];W[po]
+;B[ql];W[rn];B[or];W[nr];B[rj];W[rh];B[rd];W[re];B[qe];W[rf];B[ec]
+;W[kq];B[jq];W[kp];B[ko];W[lq];B[no];W[oo];B[nn];W[on];B[nh];W[oi]
+;B[eq];W[hd];B[oh];W[ph];B[pi];W[pg];B[ic];W[hc];B[pe];W[ri];B[hf]
+;W[ge];B[gf];W[ee];B[ff];W[fe];B[ef];W[de];B[ce];W[id];B[ib];W[ie]
+;B[cg];W[je];B[kd];W[ke];B[hb];W[ld];B[le];W[lc];B[kb];W[jg];B[mi]
+;W[nj];B[nm];W[pl];B[sp];W[sq];B[ps];W[qs];B[sr];W[sn];B[rr];W[fc]
+;B[gb];W[fb];B[mj];W[cc];B[eb];W[fa];B[cd];W[lb];B[kc];W[me];B[lf]
+;W[md];B[ne];W[nc];B[if];W[kg];B[gc];W[gd];B[ja];W[oc];B[og];W[pf]
+;B[nf];W[qc];B[pc];W[pb];B[cb];W[rc];B[qd];W[sd];B[kr];W[lr];B[jr]
+;W[ii];B[jh];W[ih];B[ji];W[ig];B[ij];W[gi];B[mp];W[df];B[ed];W[dg]
+;B[fd];W[ei];B[gk];W[di];B[ci];W[fk];B[fj];W[ej];B[ek];W[fl];B[gj]
+;W[fi];B[dk];W[gl];B[gn];W[hl];B[hi];W[hh];B[hj];W[ch];B[bh];W[dh]
+;B[gg];W[fg];B[bi];W[eg];B[la];W[ma];B[mb];W[ka];B[na])
diff --git a/regression/games/nngs/tommmal-gnugo-3.5.3-200401140719.sgf b/regression/games/nngs/tommmal-gnugo-3.5.3-200401140719.sgf
new file mode 100644 (file)
index 0000000..6356ca2
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[tommmal]WR[1d*]
+PB[GnuGo (GNU Go 3.5.3)]BR[8k*]
+PC[NNGS]DT[2004-01-14]AP[gnugoclient:2.0]
+RE[W+20.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qf];B[pf];W[pg];B[of];W[qc];B[qe];W[qg];B[og];W[re];B[pc];W[qd]
+;B[fq];W[pe];B[oe];W[qn];B[pn];W[pm];B[on];W[qq];B[pq];W[qp];B[qo]
+;W[ro];B[po];W[qm];B[om];W[ol];B[pb];W[qb];B[nl];W[ok];B[ni];W[oj]
+;B[fc];W[mq];B[mn];W[jr];B[co];W[pr];B[ce];W[or];B[hp];W[lc];B[le]
+;W[jb];B[hd];W[hb];B[fb];W[nc];B[mb];W[nb];B[mc];W[md];B[qa];W[oa]
+;B[qe];W[pa];B[pi];W[oi];B[lg];W[mk];B[nk];W[nj];B[mj];W[mi];B[lj]
+;W[nh];B[me];W[od];B[pe];W[li];B[ki];W[lo];B[ml];W[kn];B[lk];W[in]
+;B[gl];W[dl];B[hn];W[hm];B[im];W[jm];B[il];W[ho];B[gn];W[io];B[ip]
+;W[go];B[fn];W[fo];B[ld];W[nd];B[kc];W[lb];B[kb];W[ma];B[ka];W[en]
+;B[eo];W[em];B[fl];W[ep];B[eq];W[do];B[cp];W[ek];B[fi];W[ej];B[ei]
+;W[di];B[cj];W[dh];B[bh];W[bg];B[cg]C[L:9];W[dg];B[bj]C[L:10];W[ch]
+;B[bf];W[cf];B[af];W[ag];B[ah];W[cg];B[aj];W[bl];B[be];W[fg];B[ef]
+;W[fh];B[gi];W[hg];B[ih];W[hh];B[hi];W[ge];B[ci];W[gd];B[gc];W[he]
+;B[gh];W[ee];B[ff];W[gg];B[ie];W[ed];B[ec];W[ig];B[jh];W[if];B[el]
+;W[dk];B[de];W[df];B[hr];W[cn];B[kq];W[kr];B[bn];W[bm];B[ao];W[lq]
+;B[jf];W[gf];B[jg];W[oh];B[kl];W[mg];B[mf];W[jl];B[jk];W[kp];B[jo]
+;W[jn];B[ir];W[jq];B[lh];W[mh];B[fm];W[fp];B[fd];W[fe];B[eh];W[eg]
+;B[gp];W[bq];B[br];W[bp];B[bo];W[cr];B[aq];W[bs];B[ar];W[cq];B[ap]
+;W[er];B[dr];W[iq];B[hq];W[no];B[mo];W[np];B[ob];W[ra];B[nn];W[mp]
+;B[js];W[ks];B[is];W[lm];B[ln];W[ko];B[km];W[gk];B[hk];W[gj];B[hj]
+;W[am];B[oq];W[nq];B[fk];W[fj];B[la];W[ne];B[nf];W[cm];B[ng];W[an]
+;B[oc];W[];B[op];W[oo];B[]C[final_score: W+20.5
+H18 removed
+K18 removed
+A12 removed
+C11 removed
+Q11 removed
+H7 removed
+M7 removed
+B4 removed
+E2 removed
+B1 removed]
+)
diff --git a/regression/games/nngs/uhu-gnugo-3.3.16-200302112129.sgf b/regression/games/nngs/uhu-gnugo-3.3.16-200302112129.sgf
new file mode 100644 (file)
index 0000000..b37d0e5
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[uhu]WR[NR]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-11]AP[gnugoclient:2.0]
+RE[W+54.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[pm];B[np];W[qh];B[oh];W[fc];B[ec];W[pf];B[fb];W[hc];B[nd];W[bd]
+;B[qe];W[mp];B[mo];W[fq];B[eq];W[eo];B[lp];W[mq];B[fp];W[ep];B[er]
+;W[fr];B[nf];W[dq];B[dr];W[cq];B[fd];W[gc];B[gp];W[cr];B[ok];W[nm]
+;B[qo];W[rn];B[ql];W[qm];B[ri];W[qq];B[nn];W[nq];B[ro];W[op];B[mm]
+;W[oo];B[cm];W[pq];B[fm];W[ch];B[eh];W[lo];B[ln];W[ko];B[kp];W[no]
+;B[mn];W[jn];B[hm];W[jl];B[ic];W[nl];B[hd];W[ml];B[ik];W[lj];B[kh]
+;W[rl];B[co];W[em];B[en];W[dn];B[fn];W[do];B[dm];W[el];B[cf];W[fj]
+;B[cp];W[es];B[bi];W[ck];B[dk]C[L:9];W[cj];B[ci]C[L:10];W[di];B[bh]
+C[L:8];W[dl];B[ei]C[L:9];W[cl];B[cn]C[L:10];W[ds];B[bl];W[bk];B[bm]
+;W[gi];B[fk];W[fl];B[bq];W[br];B[bb];W[db];B[eb];W[cc];B[bc];W[cd]
+;B[cb];W[ej];B[gk];W[ek];B[dh];W[ho];B[hp];W[hl];B[il];W[gl];B[im]
+;W[jm];B[io];W[hk];B[dj];W[ld];B[mh];W[ki];B[ji];W[jh];B[kg];W[ih]
+;B[hh];W[jg];B[gh];W[ii];B[hr];W[ij];B[li];W[kj];B[jk];W[kl];B[jf]
+;W[kf];B[ke];W[lf];B[lh];W[iq];B[ir];W[kr];B[bp];W[ao];B[jq];W[gm]
+;B[gn];W[ng];B[le];W[mf];B[me];W[mg];B[og];W[qc];B[pc];W[oi];B[pi]
+;W[of];B[ne];W[qi];B[rj];W[qj];B[qk];W[ph];B[ni];W[rk];B[rh];W[rg]
+;B[qg];W[pg];B[oj];W[qf];B[qb];W[re];B[rc];W[rd];B[qd];W[if];B[je]
+;W[hg];B[hi];W[hj];B[gg];W[gf];B[ff];W[gd];B[ge]C[L:9];W[he];B[fe]
+C[L:10];W[id];B[jc];W[hf];B[hb];W[gb];B[ga];W[hd];B[jr];W[ib];B[ha]
+;W[fg];B[fh];W[dc];B[da];W[fa];B[an];W[ia];B[ga];W[de];B[ed];W[ef]
+;B[lr];W[ca];B[ea];W[eg];B[ha];W[ce];B[df];W[bf];B[dg];W[ee];B[ba]
+;W[bg];B[ad];W[ae];B[ka];W[ac];B[ab];W[hb];B[ad];W[fa];B[ga];W[ac]
+;B[ag];W[kb];B[kc];W[be];B[cg];W[ha];B[ad];W[lb];B[jb];W[ac];B[ca]
+;W[fa];B[ad];W[in];B[hn];W[ac];B[ga];W[jo];B[ja];W[ip];B[fo];W[eq]
+;B[hq];W[ks];B[mr];W[nr];B[lq];W[hs];B[gs];W[gr];B[is];W[ms];B[ls]
+;W[io];B[ns];W[or];B[kk];W[lk];B[ms];W[os];B[ar];W[bs];B[mj];W[pl]
+;B[pk];W[fs];B[mk];W[ll];B[sd];W[se];B[sc];W[al];B[fi];W[gj];B[bo]
+;W[ak];B[nk];W[gq];B[oe];W[pe];B[ol];W[om];B[am];W[go];B[kq];W[hs]
+;B[ie];W[fa];B[ad];W[gs];B[ga];W[ig];B[bj];W[aj];B[ai];W[js];B[af]
+;W[sh];B[fa];W[dk];B[di];W[as];B[aq];W[];B[]C[final_score: W+54.5
+L18 removed
+M16 removed
+L14 removed
+S12 removed
+N7 removed
+A5 removed
+R5 removed
+Q4 removed]
+)
diff --git a/regression/games/nngs/uno-gnugo-3.3.16-200302050206.sgf b/regression/games/nngs/uno-gnugo-3.3.16-200302050206.sgf
new file mode 100644 (file)
index 0000000..4f1b135
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.5]
+PW[uno]WR[8k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-05]AP[gnugoclient:2.0]
+RE[B+32.5]
+AB[dd][pd][jj][dp][pp]
+;W[nq];B[pn];W[fq];B[no];W[qq];B[qp];W[pq];B[hq];W[fo];B[dn];W[jp]
+;B[ck];W[dr];B[cq];W[nc];B[qf];W[pb];B[qc];W[jd];B[hc];W[fc];B[fd]
+;W[ed];B[ee];W[ec];B[dc];W[gd];B[fe];W[de];B[gc];W[gb];B[hb];W[db]
+;B[cd];W[cb];B[bc];W[bb];B[ab];W[fb];B[ea];W[df];B[bf];W[ge];B[eg]
+;W[dg];B[ga];W[fg];B[eb];W[eh];B[kc];W[jc];B[qb];W[ql];B[ol];W[pj]
+;B[cr];W[nj];B[mk];W[mj];B[ch];W[kj];B[lk];W[jk];B[ij];W[lj];B[mm]
+;W[mo];B[jr];W[mp];B[ho];W[fm];B[hm];W[ik];B[jg];W[hj];B[hi];W[gi]
+;B[ih];W[gh];B[hd];W[he];B[ie];W[ff];B[fa];W[id];B[ef];W[je];B[if]
+;W[hg];B[lg];W[ne];B[ki];W[hh];B[ii];W[kf];B[jf];W[lf];B[kg];W[oh]
+;B[jb];W[kb];B[lb];W[ib];B[ka];W[mf];B[km];W[jn];B[jm];W[in];B[kn]
+;W[ip];B[ko];W[kp];B[dh];W[rn];B[rp];W[rq];B[ic];W[ke];B[im];W[gk]
+;B[ob];W[rh];B[er];W[fr];B[eq];W[fp];B[ei];W[fh];B[lr];W[mr];B[hp]
+;W[fn];B[hn];W[fs];B[rg];W[qh];B[sh];W[si];B[sg];W[qg];B[rf];W[rj]
+;B[op];W[ir];B[iq];W[hr];B[jq];W[kk];B[lq];W[lp];B[or];W[oq];B[nr]
+;W[mq];B[ms];W[ns];B[os];W[pr];B[ls];W[kq];B[kr];W[js];B[of];W[ng]
+;B[ek];W[fk];B[fj];W[gj];B[el];W[fl];B[es];W[mn];B[nn];W[nk];B[nl]
+;W[ll];B[ml];W[lm];B[kl];W[ln];B[sq];W[ps];B[rr];W[ns];B[or];W[rs]
+;B[sr];W[qr];B[md];W[nd];B[nf];W[mg];B[me];W[qn];B[om];W[po];B[oo]
+;W[qo];B[pm];W[jl];B[io];W[jo];B[pg];W[ph];B[og];W[nh];B[qm];W[rm]
+;B[fi];W[gq];B[em];W[gp];B[ok];W[oj];B[pk];W[qk];B[hl];W[hk];B[eo]
+;W[gl];B[ep];W[gm];B[ro];W[gn];B[sn];W[rl];B[sm];W[sl];B[so];W[go]
+;B[en];W[il];B[kd];W[is];B[le];W[oe];B[pf];W[mc];B[ld];W[lc];B[kb]
+;W[mb];B[pe];W[ma];B[oc];W[ia];B[ha];W[la];B[ja];W[ks];B[sp];W[lo]
+;B[ss];W[qs];B[np];W[];B[pl];W[];B[]C[final_score: B+32.5
+M19 removed
+B18 removed
+Q18 removed
+D15 removed
+J15 removed
+J12 removed
+L11 removed
+D2 removed
+P2 removed]
+)
diff --git a/regression/games/nngs/uno-gnugo-3.3.16-200302230528.sgf b/regression/games/nngs/uno-gnugo-3.3.16-200302230528.sgf
new file mode 100644 (file)
index 0000000..9b7e070
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[6]KM[0.5]
+PW[uno]WR[7k*]
+PB[GnuGo (GNU Go 3.3.16)]BR[10k*]
+PC[NNGS]DT[2003-02-23]AP[gnugoclient:2.0]
+RE[W+71.5]
+AB[dd][pd][dj][pj][dp][pp]
+;W[nq];B[pn];W[pr];B[lq];W[no];B[qq];W[jp];B[hq];W[jq];B[lo];W[nm]
+;B[pl];W[fq];B[fp];W[ep];B[eo];W[eq];B[dq];W[gp];B[fo];W[gq];B[hr]
+;W[do];B[co];W[dn];B[io];W[go];B[jo];W[gn];B[cf];W[nc];B[lc];W[ne]
+;B[pf];W[jd];B[hc];W[pb];B[qc];W[jc];B[qr];W[fc];B[fd];W[ed];B[ec]
+;W[ee];B[fb];W[de];B[le];W[ng];B[md];W[nd];B[lg];W[ph];B[oh];W[og]
+;B[qb];W[ob];B[dh];W[cn];B[dc];W[fe];B[ce];W[gd];B[pg];W[nh];B[oi]
+;W[ni];B[cp];W[oj];B[pi];W[ok];B[pk];W[kr];B[ip];W[lr];B[bs];W[fi]
+;B[hd];W[he];B[ie];W[je];B[if];W[jf];B[jg];W[kf];B[lf];W[kg];B[lh]
+;W[kh];B[li];W[jh];B[ig];W[id];B[gf];W[ge];B[gc];W[eg];B[gh];W[fg]
+;B[hh];W[ei];B[ff];W[ef];B[hf];W[di];B[hj];W[jj];B[lk];W[kj];B[ci]
+;W[ch];B[dg];W[cj];B[ik];W[lj];B[kb];W[jb];B[mb];W[mj];B[la];W[nb]
+;B[bi];W[bj];B[bh];W[ek];B[aj];W[bk];B[or];W[nr];B[pq];W[oq];B[ps]
+;W[im];B[kp];W[km];B[ak];W[al];B[bl];W[ai];B[dr];W[er];B[mp];W[np]
+;B[gr];W[kq];B[ah];W[dk];B[pa];W[bn];B[bo];W[ao];B[ap];W[an];B[ib]
+;W[ja];B[eh];W[fh];B[aj];W[om];B[pm];W[ol];B[df];W[fd];B[ia];W[ic]
+;B[hb];W[oa];B[qa];W[pc];B[of];W[nf];B[on];W[nn];B[fr];W[es];B[ar]
+;W[ds];B[cs];W[ak];B[oe];W[od];B[qd];W[ai];B[oo];W[ns];B[os];W[aj]
+;B[op];W[];B[]C[final_score: W+71.5
+M19 removed
+L18 removed
+N18 removed
+M17 removed
+N16 removed
+J15 removed
+M15 removed
+C12 removed
+G12 removed
+Q12 removed
+D10 removed
+H10 removed
+J9 removed
+M9 removed
+B8 removed
+E5 removed
+J5 removed
+M5 removed
+L4 removed
+N4 removed
+H3 removed
+M3 removed]
+)
diff --git a/regression/games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf b/regression/games/nngs/whitemouse-gnugo-3.5.2-200312041808.sgf
new file mode 100644 (file)
index 0000000..1b43b50
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[9]HA[4]KM[0.5]
+PW[whitemouse]WR[2d*]
+PB[GnuGo (GNU Go 3.5.2)]BR[8k*]
+PC[NNGS]DT[2003-12-04]AP[gnugoclient:2.0]
+RE[W+31.5]
+AB[cc][gc][cg][gg]
+;W[fg];B[ff];W[gf];B[hg];W[ge];B[hd];W[fc];B[fd];W[gd];B[he];W[fe]
+;B[ed];W[hc];B[gb];W[hf];B[ef];W[ie];B[hb];W[id];B[fh];W[ee];B[dd]
+;W[df];B[eg];W[de];B[ce];W[cf];B[dg];W[be];B[cd];W[bg];B[bh];W[ah]
+;B[ci];W[ig];B[bd];W[hh];B[ae];W[bf];B[ih];W[gh];B[if];W[fb];B[eb]
+;W[ig];B[fg];W[ii];B[gi];W[dh];B[ch];W[af];B[ai];W[ad];B[ag];W[fa]
+;B[ea];W[ah];B[bi];W[bb];B[bc];W[ac];B[cb];W[ab];B[ib];W[ba];B[ic]
+;W[hd];B[ca];W[];B[]C[final_score: W+31.5
+F9 removed
+E4 removed
+G1 removed]
+)
diff --git a/regression/games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf b/regression/games/nngs/whitemouse-gnugo-3.5.2-200312052122.sgf
new file mode 100644 (file)
index 0000000..e6d4676
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]HA[4]KM[0.5]
+PW[whitemouse]WR[2d*]
+PB[GnuGo (GNU Go 3.5.2)]BR[8k*]
+PC[NNGS]DT[2003-12-05]AP[gnugoclient:2.0]
+RE[W+2.5]
+AB[cc][gc][cg][gg]
+;W[ge];B[fd];W[fe];B[ef];W[ee];B[de];W[ed];B[ec];W[dd];B[cd];W[dc]
+;B[db];W[eb];B[fb];W[fc];B[gd];W[cb];B[ec];W[da];B[he];W[hf];B[hd]
+;W[gf];B[hb];W[ce];B[be];W[df];B[eg];W[dg];B[dh];W[bd];B[cf];W[de]
+;B[fh];W[bf];B[bg];W[ae];B[ag];W[hh];B[hg];W[ig];B[gh];W[ff];B[hi]
+;W[ih];B[af];W[be];B[fg];W[ie];B[id];W[if];B[gi];W[fa];B[ga];W[fc]
+;B[gb];W[ea];B[ec];W[ch];B[bh];W[fc];B[ii];W[ec];B[]
+C[final_score: W+2.5
+C7 removed
+C2 removed])
diff --git a/regression/games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf b/regression/games/nngs/whitemouse-gnugo-3.5.2gf1-200312161704.sgf
new file mode 100644 (file)
index 0000000..d8f7439
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[4]
+SZ[9]HA[2]KM[0.5]
+PW[whitemouse]WR[2d*]
+PB[GnuGo (GNU Go 3.5.2gf1)]BR[8k*]
+PC[NNGS]DT[2003-12-16]AP[gnugoclient:2.0]
+RE[W+20.5]
+AB[gc][cg]
+;W[gg];B[dc];W[ce];B[de];W[df];B[cf];W[dd];B[ee];W[cc];B[eg];W[ed]
+;B[fe];W[fd];B[ge];W[gd];B[hd];W[he];B[hc];W[hf];B[db];W[cb];B[fh]
+;W[gh];B[ie];W[fg];B[be];W[cd];B[ef];W[fb];B[eh];W[if];B[gi];W[hi]
+;B[ih];W[fi];B[hg];W[gf];B[ff];W[id];B[hb];W[gb];B[ha];W[ic];B[ei]
+;W[gi];B[bd];W[bc];B[bf];W[fc];B[ac];W[ab];B[ad];W[ga];B[]
+C[final_score: W+20.5
+H9 removed
+D8 removed
+D4 removed
+H3 removed
+J2 removed]
+)
diff --git a/regression/games/nngs/wingjk-gnugo-3.3.17-200304070910.sgf b/regression/games/nngs/wingjk-gnugo-3.3.17-200304070910.sgf
new file mode 100644 (file)
index 0000000..6e61f94
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[wingjk]WR[11k*]
+PB[GnuGo (GNU Go 3.3.17)]BR[10k*]
+PC[NNGS]DT[2003-04-07]AP[gnugoclient:2.0]
+RE[W+49.5]
+;B[qd];W[dp];B[pp];W[dd];B[oc];W[qj];B[qh];W[qm];B[qo];W[nq];B[no]
+;W[pr];B[fq];W[kq];B[df];W[fc];B[iq];W[dq];B[ci];W[cl];B[kd];W[ic]
+;B[ce];W[cd];B[jb];W[jc];B[kc];W[ib];B[kb];W[qf];B[pg];W[rh];B[ri]
+;W[qi];B[rg];W[rj];B[sh];W[oe];B[pe];W[pf];B[of];W[og];B[nf];W[ph]
+;B[qg];W[oi];B[sj];W[sk];B[si];W[rl];B[kr];W[lr];B[jr];W[ko];B[bk]
+;W[bl];B[ck];W[dl];B[be];W[bd];B[nm];W[ng];B[mg];W[mf];B[ne];W[mh]
+;B[lg];W[rf];B[qe];W[re];B[rd];W[lh];B[kg];W[kh];B[fo];W[ep];B[fp]
+;W[dn];B[nk];W[on];B[oo];W[nn];B[qr];W[rq];B[om];W[pn];B[qq];W[so]
+;B[mn];W[mo];B[ln];W[kn];B[lo];W[mp];B[ml];W[lm];B[rp];W[sp];B[sn]
+;W[rn];B[or];W[oq];B[pq];W[nr];B[km];W[ll];B[mm];W[lk];B[jn];W[lp]
+;B[jo];W[kp];B[jl];W[os];B[ad];W[ac];B[ae];W[bb];B[er];W[dr];B[gl]
+;W[jg];B[me];W[kf];B[lf];W[le];B[mf];W[ke];B[ld];W[je];B[ff];W[eh]
+;B[fi];W[fh];B[gh];W[gg];B[fg];W[ei];B[gi];W[ek];B[fj];W[ej];B[al]
+;W[am];B[ak];W[bm];B[gf];W[hg];B[ds];W[cs];B[es];W[cr];B[ia];W[ha]
+;B[ja];W[hb];B[dg];W[jd];B[jj];W[kk];B[kj];W[lj];B[jk];W[ii];B[ij]
+;W[hi];B[hj];W[fk];B[gk];W[hh];B[gj];W[fm];B[gm];W[fn];B[gn];W[eo]
+;B[hf];W[if];B[he];W[dj];B[kl];W[cj];B[dh];W[bj];B[bg];W[ah];B[bh]
+;W[ai];B[fl];W[el];B[jp];W[ks];B[js];W[ls];B[jq];W[ki];B[ji];W[ig]
+;B[gd];W[gc];B[ie];W[fd];B[fe];W[hd];B[ee];W[ed];B[eg];W[ag];B[af]
+;W[bi];B[di];W[de];B[ge];W[id];B[jh];W[jf];B[eq];W[ol];B[ih];W[nh]
+;B[]C[final_score: W+49.5
+P15 removed
+S15 removed
+A9 removed
+O9 removed
+N8 removed
+T6 removed
+O5 removed
+R5 removed
+Q4 removed
+S4 removed]
+)
diff --git a/regression/games/nodan-guno.sgf b/regression/games/nodan-guno.sgf
new file mode 100644 (file)
index 0000000..55aee4f
--- /dev/null
@@ -0,0 +1,79 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]ST[2]
+RU[Japanese]SZ[9]HA[6]KM[6.50]TM[0]OT[10x60 byo-yomi]
+PW[nodan]PB[guno]WR[1d]DT[2005-05-05]PC[The Kiseido Go Server (KGS) at http://kgs.kiseido.com/]AB[cc][gc][ce][ge][cg][gg]C[guno [-\]: GTP Engine for guno (black): GNU Go version 3.7.1
+]RE[W+24.50]
+;W[ed]CR[ed]WL[600]
+;B[ee]CR[ee]BL[600]
+;W[ch]CR[ch]WL[600]
+;B[dh]CR[dh]BL[600]
+;W[gh]CR[gh]WL[600]
+;B[hh]CR[hh]BL[600]
+;W[fg]CR[fg]WL[600]
+;B[eb]CR[eb]BL[600]
+;W[gf]CR[gf]WL[600]
+;B[hg]CR[hg]BL[600]
+;W[ef]CR[ef]WL[600]
+;B[hf]CR[hf]BL[600]
+;W[de]CR[de]WL[600]
+;B[fe]CR[fe]BL[600]
+;W[dg]CR[dg]WL[600]
+;B[bh]CR[bh]BL[600]
+;W[cf]CR[cf]WL[600]
+;B[bg]CR[bg]BL[600]
+;W[cd]CR[cd]WL[600]
+;B[be]CR[be]BL[600]
+;W[bd]CR[bd]WL[600]
+;B[bf]CR[bf]BL[600]
+;W[df]CR[df]WL[600]
+;B[fh]CR[fh]BL[600]
+;W[eh]CR[eh]WL[600]
+;B[ci]CR[ci]BL[600]
+;W[fi]CR[fi]WL[600]
+;B[ff]CR[ff]BL[600]
+;W[dc]CR[dc]WL[600]
+;B[cb]CR[cb]BL[600]
+;W[db]CR[db]WL[600]
+;B[da]CR[da]BL[600]
+;W[bb]CR[bb]WL[600]
+;B[ba]CR[ba]BL[600]
+;W[bc]CR[bc]WL[600]
+;B[ca]CR[ca]BL[600]
+;W[ab]CR[ab]WL[600]
+;B[ei]CR[ei]BL[600]
+;W[di]CR[di]WL[600]
+;B[ch]CR[ch]BL[600]
+;W[ae]CR[ae]WL[600]
+;B[ai]CR[ai]BL[600]
+;W[fc]CR[fc]WL[600]
+;B[fb]CR[fb]BL[600]
+;W[gb]CR[gb]WL[600]
+;B[hb]CR[hb]BL[600]
+;W[ga]CR[ga]WL[600]
+;B[ha]CR[ha]BL[600]
+;W[aa]CR[aa]WL[600]
+;B[ea]CR[ea]BL[600]
+;W[gd]CR[gd]WL[600]
+;B[hc]CR[hc]BL[600]
+;W[he]CR[he]WL[600]
+;B[ei]CR[ei]BL[600]
+;W[fd]CR[fd]WL[600]
+;B[gf]CR[gf]BL[600]
+;W[hd]CR[hd]WL[600]
+;B[hi]CR[hi]BL[600]
+;W[ic]CR[ic]WL[600]
+;B[if]CR[if]BL[600]
+;W[ib]CR[ib]WL[600]
+;B[di]CR[di]BL[600]
+;W[ia]CR[ia]WL[600]
+;B[ih]CR[ih]BL[600]
+;W[dd]CR[dd]WL[600]
+;B[gi]CR[gi]BL[600]
+;W[eg]CR[eg]WL[600]
+;B[fh]CR[fh]BL[600]
+;W[af]CR[af]WL[600]
+;B[ag]CR[ag]BL[600]
+;W[ad]CR[ad]WL[600]
+;B[ie]CR[ie]BL[600]
+;W[id]CR[id]WL[600]
+;B[]BL[600]
+;W[]WL[600]TW[ba][ca][da][ea][fa][ha][cb][eb][fb][hb][ac][cc][ec][gc][hc]TB[ig][ah][gh][bi][fi][ii])
diff --git a/regression/games/olympiad2002/game1-19-ether-gnugo-0-1.sgf b/regression/games/olympiad2002/game1-19-ether-gnugo-0-1.sgf
new file mode 100644 (file)
index 0000000..b710b23
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[Ether]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026059311] 
+;B[pd];W[pp];B[dp];W[dd];B[qn];W[pi];B[fc];W[kd];B[on];W[ip]
+;B[np];W[rj];B[ic];W[pf];B[nd];W[re];B[gq];W[le];B[cf];W[md]
+;B[cc];W[dk];B[ef];W[qd];B[pc];W[jc];B[of];W[lk];B[pe];W[lb]
+;B[qf];W[gn];B[pg];W[ol];B[qc];W[pm];B[qq];W[kp];B[oo];W[mf]
+;B[id];W[fi];B[ci];W[dn];B[ir];W[do];B[cp];W[gp];B[fp];W[hq]
+;B[hr];W[lq];B[ln];W[kn];B[km];W[kl];B[fd];W[qm];B[ro];W[fh]
+;B[pq];W[gg];B[mm];W[jr];B[jm];W[ie];B[gl];W[im];B[jl];W[di]
+;B[cd];W[jk];B[il];W[ik];B[hm];W[fo];B[fq];W[lo];B[dh];W[co]
+;B[ho];W[jn];B[hn];W[mn];B[lm];W[hl];B[hp];W[go];B[jq];W[io]
+;B[in];W[mp];B[hk];W[qh];B[dj];W[fl];B[rf];W[bp];B[bq];W[ll]
+;B[kr];W[kq];B[iq];W[nn];B[nm];W[nq];B[jo];W[no];B[mo];W[mn]
+;B[no];W[cj];B[ko];W[pn];B[op];W[lr];B[js];W[ng];B[or];W[bi]
+;B[ch];W[nr];B[bj];W[ne];B[ck];W[bk];B[cl];W[gm];B[nc];W[ap]
+;B[dl];W[cq];B[dq];W[ej];B[cj];W[bl];B[cm];W[dm];B[fk];W[gj]
+;B[fm];W[fn];B[el];W[ek];B[bm];W[jp];B[ms];W[bn];B[oh];W[eh]
+;B[hj]
+)
diff --git a/regression/games/olympiad2002/game1-19-gnugo-starofdonghwa-1-0.sgf b/regression/games/olympiad2002/game1-19-gnugo-starofdonghwa-1-0.sgf
new file mode 100644 (file)
index 0000000..51de64a
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Star of DongHwa]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026166900] 
+;B[dd];W[pp];B[dp];W[oc];B[cj];W[dm];B[qj];W[qd];B[jq];W[fc]
+;B[df];W[db];B[cc];W[ic];B[jd];W[lc];B[jc];W[fp];B[hq];W[qm]
+;B[qg];W[mq];B[qq];W[pq];B[qp];W[qo];B[ro];W[rn];B[po];W[qn]
+;B[oo];W[qr];B[rr];W[pr];B[he];W[fn];B[ib];W[fe];B[hc];W[fg]
+;B[cb];W[ee];B[ej];W[do];B[co];W[cp];B[cn];W[cq];B[dn];W[eo]
+;B[dq];W[fr];B[cr];W[cm];B[hg];W[br];B[dr];W[bp];B[bs];W[bn]
+;B[gr];W[er];B[eh];W[ef];B[dg];W[gf];B[hf];W[gb];B[fh];W[ed]
+;B[om];W[dc];B[eb];W[da];B[in];W[cd];B[de];W[aq];B[bd];W[le]
+;B[gg];W[gd];B[kf];W[mg];B[lh];W[ni];B[ki];W[nf];B[il];W[lj]
+;B[kj];W[nk];B[ok];W[bk];B[bj];W[ak];B[nl];W[aj];B[bh];W[fl]
+;B[gk];W[kr];B[kq];W[lr];B[lk];W[mk];B[ll];W[ml];B[mm];W[lm]
+;B[oj];W[mn];B[nm];W[mi];B[jr];W[lo];B[re];W[rd];B[qe];W[km]
+;B[pe];W[kk];B[pd];W[pc];B[ne];W[se];B[md];W[ld];B[mc];W[pl]
+;B[ol];W[rk];B[nb];W[rb];B[lb];W[me];B[rj];W[od];B[oe];W[nd]
+;B[rf];W[jk];B[nj];W[mj];B[rh];W[qk];B[sd];W[sc];B[pk];W[jo]
+;B[io];W[jj];B[hk];W[ji];B[jh];W[ob];B[jn];W[kb];B[kc];W[hi]
+;B[fk];W[pi];B[oi];W[na];B[sg];W[ka];B[ko];W[gh];B[el];W[em]
+;B[gl];W[gi];B[gm];W[dl];B[fm];W[ih];B[jg];W[ca];B[bb];W[sj]
+;B[dk];W[si];B[ph];W[ba];B[ck];W[ai];B[bl];W[cl];B[bm];W[en]
+;B[ce];W[pm];B[lp];W[mp];B[lf];W[mf];B[no];W[mo];B[gc];W[ge]
+;B[fb];W[ga];B[hb];W[fa];B[kn];W[ln];B[ah];W[al];B[bi];W[am]
+;B[gq];W[nn];B[on];W[lq];B[kp];W[ri];B[qi];W[eg];B[fi];W[ig]
+;B[id];W[if];B[ij];W[jf];B[ke];W[kg];B[ii];W[hh];B[gn];W[lg]
+;B[go];W[ha];B[hj];W[og];B[oh];W[nh];B[pg];W[of];B[jm];W[gp]
+;B[hp];W[ep];B[fq];W[eq];B[np];W[gs];B[nq];W[nr];B[oq];W[rp]
+;B[or];W[rq];B[ns];W[hs];B[ms];W[mr];B[ir];W[ps];B[os];W[jl]
+;B[ik];W[kh];B[gj];W[pf];B[sk];W[sl];B[sf];W[ab];B[ac];W[sd]
+;B[sh];W[sk];B[fo];W[qf];B[aa];W[ec];B[ab];W[hr];B[is];W[fs]
+;B[pn];W[ks];B[ls];W[op];B[js];W[kl];B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2002/game1-19-go4-gnugo-1-0.sgf b/regression/games/olympiad2002/game1-19-go4-gnugo-1-0.sgf
new file mode 100644 (file)
index 0000000..e181f61
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[Go4++]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026161072] 
+;B[pd];W[pq];B[po];W[qo];B[qn];W[qp];B[pn];W[nq];B[qj];W[cd]
+;B[ep];W[cq];B[ed];W[ec];B[fc];W[dc];B[fd];W[cf];B[jc];W[qc]
+;B[qd];W[pc];B[oc];W[ob];B[nc];W[nb];B[mc];W[rd];B[re];W[rc]
+;B[qf];W[co];B[hq];W[nj];B[mk];W[kq];B[ck];W[ci];B[dn];W[cn]
+;B[ff];W[ig];B[jh];W[ei];B[ek];W[er];B[bk];W[gj];B[mo];W[gm]
+;B[gk];W[im];B[fb];W[hk];B[kj];W[hi];B[ih];W[lp];B[kl];W[go]
+;B[lh];W[bm];B[ho];W[hn];B[gp];W[fo];B[eq];W[fr];B[io];W[kn]
+;B[jm];W[jn];B[in];W[jl];B[km];W[jp];B[il];W[hm];B[jk];W[ik]
+;B[gr];W[fq];B[fp];W[do];B[eo];W[fn];B[ca];W[cb];B[rn];W[mb]
+;B[sq];W[rq];B[fk];W[hl];B[jr];W[kr];B[gs];W[lc];B[ld];W[kc]
+;B[kd];W[kb];B[dr];W[jb];B[dq];W[cr];B[ic];W[ir];B[ib];W[ln]
+;B[mn];W[iq];B[en];W[em];B[dm];W[el];B[dl];W[bi];B[lm];W[sp]
+;B[cs];W[br];B[is];W[gg];B[jg];W[eg];B[if];W[da];B[hh];W[gh]
+;B[ij];W[ii];B[ji];W[ip];B[op];W[gf];B[ge];W[sn];B[rl];W[de]
+;B[sm];W[oq];B[so];W[np];B[rp];W[rr];B[sr];W[rs];B[no];W[od]
+;B[me];W[ne];B[oe];W[pp];B[ro];W[oo];B[on];W[nd];B[md];W[nf]
+;B[pe];W[eb];B[lo];W[ko];B[fg];W[fh];B[ef];W[dg];B[mp];W[mq]
+;B[ee];W[ia];B[ha];W[ba];B[sd];W[sc];B[se];W[ga];B[hb];W[hf]
+;B[he];W[gb];B[fa];W[mm];B[nn];W[jf];B[hg];W[ie];B[ig];W[kf]
+;B[je];W[ke];B[id];W[of];B[pf];W[rf];B[rg];W[ja];B[jl];W[mf]
+;B[nh];W[le];B[jd];W[kg];B[og];W[ng];B[mg];W[lg];B[mh];W[pg]
+;B[qg];W[kh];B[oh];W[ph];B[df];W[pi];B[dd];W[ce];B[ea];W[pj]
+;B[qk];W[qh];B[op];W[rh];B[oo];W[sg];B[sf];W[sh];B[jj];W[hj]
+;B[sp];W[pl];B[ss];W[qm];B[nl];W[nm];B[ql];W[ml];B[nk];W[pm]
+;B[pk];W[om];B[rm];W[ok];B[ol];W[lk];B[mj];W[mi];B[lj];W[ki]
+;B[tt];W[li];B[tt];W[ni];B[lf];W[mf];B[tt];W[nf];B[of];W[ne]
+;B[tt];W[oj];B[tt];W[lf];B[tt];W[nd];B[od];W[oi];B[tt];W[qb]
+;B[tt];W[hr];B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2002/game1-19-goint-gnugo-1-0.sgf b/regression/games/olympiad2002/game1-19-goint-gnugo-1-0.sgf
new file mode 100644 (file)
index 0000000..c677a6e
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[Go Intellect]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026071301] 
+;B[pd];W[dc];B[pp];W[dq];B[ce];W[co];B[ed];W[ec];B[fd];W[gc]
+;B[cj];W[nc];B[he];W[kc];B[jq];W[ch];B[bi];W[id];B[bg];W[cg]
+;B[di];W[bh];B[qf];W[df];B[bf];W[ff];B[gg];W[gf];B[qi];W[gp]
+;B[mq];W[ai];B[bc];W[de];B[dd];W[dk];B[aj];W[ah];B[ck];W[dm]
+;B[hf];W[cl];B[dj];W[eh];B[fj];W[hg];B[hh];W[ig];B[fg];W[eg]
+;B[gi];W[fi];B[gh];W[ek];B[ej];W[ge];B[jf];W[gd];B[fk];W[jg]
+;B[ke];W[kg];B[ik];W[bk];B[bj];W[ji];B[gl];W[qc];B[bl];W[pc]
+;B[me];W[od];B[mg];W[lf];B[le];W[mf];B[ne];W[nf];B[oe];W[bm]
+;B[ak];W[qm];B[re];W[og];B[qp];W[pe];B[pf];W[if];B[pl];W[ph]
+;B[ie];W[qh];B[ql];W[qd];B[rm];W[ri];B[mi];W[oj];B[nj];W[oi]
+;B[kj];W[of];B[hn];W[jj];B[jk];W[nh];B[ok];W[mh];B[hp];W[hq]
+;B[gq];W[iq];B[ip];W[gr];B[jr];W[fq];B[ki];W[kh];B[nk];W[qj]
+;B[am];W[cc];B[bb];W[cd];B[bd];W[cb];B[ba];W[bn];B[ih];W[jh]
+;B[el];W[dl];B[em];W[go];B[ca];W[fc];B[da];W[ho];B[io];W[ir]
+;B[fa];W[hb];B[is];W[hs];B[js];W[lb];B[rk];W[fn];B[dn];W[cm]
+;B[en];W[in];B[gm];W[gn];B[hm];W[jn];B[kp];W[li];B[lj];W[fm]
+;B[cn];W[bo];B[fl];W[gb];B[kl];W[hj];B[gj];W[ij];B[rj];W[hk]
+;B[hl];W[eo];B[lh];W[si];B[lg];W[kf];B[cf];W[do];B[dh];W[dg]
+;B[an];W[ao];B[al];W[rd];B[qk];W[pj];B[ga];W[ha];B[sj];W[je]
+;B[ag];W[qg];B[fb];W[eb];B[ea];W[sh];B[ni];W[jd];B[ei];W[fh]
+;B[pk];W[mm];B[kn];W[jo];B[jp];W[ng];B[li];W[pn];B[db];W[no]
+;B[ko];W[nr];B[nq];W[oq];B[op];W[pr];B[qr];W[mr];B[lq];W[qq]
+;B[pq];W[qs];B[rq];W[or];B[mo];W[np];B[rn];W[rr];B[lr];W[sr]
+;B[qq];W[rs];B[ms];W[nn];B[ns];W[rg];B[gk];W[rf];B[ci];W[hi]
+;B[ii];W[il];B[jm];W[mp];B[mn];W[nm];B[tt];W[ln];B[lo];W[lm]
+;B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2002/game1-9-gnugo-magog-1-0.sgf b/regression/games/olympiad2002/game1-9-gnugo-magog-1-0.sgf
new file mode 100644 (file)
index 0000000..c855514
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Magog]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026081030] 
+;B[gg];W[cg];B[cc];W[gc];B[ge];W[ec];B[ee];W[dd];B[cd];W[be]
+;B[ce];W[bf];B[bd];W[de];B[df];W[ef];B[eg];W[ff];B[fe];W[dg]
+;B[cf];W[fg];B[eh];W[fh];B[dc];W[ed];B[eb];W[fb];B[db];W[gf]
+;B[hf];W[gh];B[hg];W[hb];B[hd];W[ga];B[hh];W[dh];B[bg];W[bh]
+;B[ae];W[hi];B[af];W[ah];B[ag];W[ea];B[da];W[gd];B[fd];W[fc]
+;B[he];W[fa];B[hc];W[ib];B[ic];W[ie];B[id];W[ih];B[if];W[ii]
+;B[ei];W[di];B[bb];W[tt];B[gi];W[fi];B[ba];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2002/game1-9-go4-gnugo-0-1.sgf b/regression/games/olympiad2002/game1-9-go4-gnugo-0-1.sgf
new file mode 100644 (file)
index 0000000..f919198
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[Go4++]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026164384] 
+;B[gd];W[cf];B[dd];W[fg];B[df];W[dg];B[ce];W[bf];B[be];W[ef]
+;B[hg];W[ae];B[ad];W[af];B[bc];W[gf];B[hf];W[ge];B[he];W[fd]
+;B[fc];W[gc];B[hd];W[ed];B[ec];W[de];B[cd];W[gh];B[hh];W[hi]
+;B[fe];W[ee];B[gg];W[fh];B[ff];W[eb];B[fb];W[gb];B[fa];W[db]
+;B[dc];W[gi];B[ih];W[tt];B[ii];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2002/game1-9-goint-gnugo-0-1.sgf b/regression/games/olympiad2002/game1-9-goint-gnugo-0-1.sgf
new file mode 100644 (file)
index 0000000..c56d5cc
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[Go Intellect]
+PB[GNU Go 3.3.4]
+GN[Go Intellect (W) vs. GNU Go (B)]
+DT[2002-07-08]
+SY[Cgoban 1.9.10]TM[30:00(5x1:00)];B[fe]BL[1800];W[cd]WL[1799];B[cf]
+BL[1797];W[gg]WL[1738];B[gc]BL[1791];W[eg]WL[1624];B[dh]BL[1788];W[dg]
+WL[1507];B[cg]BL[1781];W[eh]WL[1478];B[ch]BL[1775];W[de]WL[1433];B[be]
+BL[1772];W[ed]WL[1382];B[eb]BL[1769];W[bd]WL[1356];B[df]BL[1766];W[ef]
+WL[1317];B[ee]BL[1755];W[dc]WL[1296];B[gf]BL[1748];W[fd]WL[1239];B[gd]
+BL[1739];W[he]WL[1144];B[ge]BL[1733];W[hc]WL[1064];B[hf]BL[1726];W[gb]
+WL[964];B[fb]BL[1716];W[hb]WL[824];B[hd]BL[1709];W[fc]WL[781];B[db]
+BL[1701];W[hg]WL[756];B[ec]BL[1691];W[cb]WL[750];B[dd]BL[1685];W[bc]
+WL[746];B[ce]BL[1682];W[ba]WL[742];B[ei]BL[1682];W[fi]WL[738];B[fg]
+BL[1680];W[fh]WL[732];B[ff]BL[1679];W[gh]WL[725];B[hi]BL[1679];W[ab]
+WL[721];B[ad]BL[1678];W[ih]WL[720];B[da]BL[1677];W[if]WL[714];B[ie]
+BL[1676]
+)
diff --git a/regression/games/olympiad2002/game2-19-gnugo-go4-0-1.sgf b/regression/games/olympiad2002/game2-19-gnugo-go4-0-1.sgf
new file mode 100644 (file)
index 0000000..0a53a4e
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Go4++]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026163207] 
+;B[dp];W[pd];B[dd];W[pp];B[cj];W[dg];B[fc];W[fp];B[dn];W[jp]
+;B[qn];W[ql];B[qq];W[pq];B[qp];W[po];B[rn];W[om];B[kc];W[dq]
+;B[cq];W[eq];B[cr];W[ph];B[nc];W[oc];B[nd];W[pf];B[kk];W[ob]
+;B[id];W[fg];B[hg];W[fi];B[mg];W[fk];B[dl];W[fn];B[ce];W[dr]
+;B[bg];W[kn];B[hi];W[nl];B[pr];W[or];B[qr];W[hk];B[mj];W[jj]
+;B[ki];W[os];B[nb];W[pj];B[cs];W[ll];B[ji];W[ij];B[rl];W[rk]
+;B[ff];W[rm];B[sn];W[na];B[ma];W[oa];B[lb];W[kj];B[ef];W[lk]
+;B[ej];W[gg];B[gf];W[gi];B[li];W[eg];B[fm];W[gm];B[em];W[ii]
+;B[ih];W[sm];B[gn];W[go];B[gl];W[hj];B[hm];W[in];B[hn];W[ho]
+;B[im];W[ek];B[dk];W[jm];B[og];W[pg];B[hh];W[fj];B[oe];W[pe]
+;B[eo];W[ei];B[ds];W[es];B[fo];W[fr];B[of];W[il];B[ni];W[ch]
+;B[bh];W[pn];B[qm];W[sl];B[df];W[pm];B[qo];W[hl];B[en];W[ci]
+;B[bi];W[dj];B[gh];W[fh];B[mk];W[ml];B[oi];W[pi];B[ok];W[nk]
+;B[oj];W[pk];B[cg];W[gk];B[fl];W[oh];B[nh];W[ps];B[qs];W[ep]
+;B[cp];W[od];B[io];W[ip];B[jn];W[jo];B[in];W[lj];B[km];W[jl]
+;B[nj];W[ol];B[ln];W[ko];B[gp];W[hp];B[gq];W[gr];B[ir];W[kl]
+;B[oq];W[nr];B[np];W[nq];B[hq];W[hr];B[iq];W[jq];B[jr];W[kr]
+;B[kq];W[lr];B[lo];W[lm];B[kp];W[km];B[fq];W[er];B[gs];W[hs]
+;B[dh];W[di];B[el];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2002/game2-19-gnugo-goint-1-0.sgf b/regression/games/olympiad2002/game2-19-gnugo-goint-1-0.sgf
new file mode 100644 (file)
index 0000000..f1a7338
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Go Intellect]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026144402] 
+;B[dc];W[pd];B[cp];W[pp];B[nq];W[ep];B[eq];W[fq];B[dq];W[gp]
+;B[cm];W[de];B[ce];W[cf];B[cd];W[df];B[fc];W[cj];B[qn];W[oo]
+;B[kq];W[jd];B[qk];W[md];B[pr];W[qr];B[qp];W[qq];B[rp];W[or]
+;B[nr];W[pq];B[mp];W[qg];B[qc];W[qd];B[oq];W[rc];B[ip];W[en]
+;B[dk];W[ps];B[qi];W[gn];B[nn];W[in];B[on];W[oh];B[dj];W[il]
+;B[ho];W[hn];B[go];W[lm];B[ch];W[ci];B[fo];W[dh];B[di];W[cg]
+;B[eh];W[bh];B[fn];W[fm];B[ml];W[fs];B[em];W[fp];B[ph];W[el]
+;B[dm];W[eo];B[pg];W[er];B[fl];W[dr];B[eg];W[gm];B[ek];W[bl]
+;B[bo];W[hc];B[pf];W[ne];B[nf];W[qf];B[ir];W[bq];B[cl];W[mh]
+;B[mf];W[oi];B[bk];W[bf];B[ef];W[ac];B[mj];W[ij];B[gb];W[kh]
+;B[li];W[lh];B[le];W[ji];B[ld];W[ok];B[mm];W[kk];B[mc];W[pc]
+;B[ge];W[he];B[gd];W[gk];B[hd];W[gi];B[ie];W[je];B[be];W[ag]
+;B[if];W[kf];B[nd];W[ae];B[bj];W[ee];B[ko];W[ln];B[no];W[hb]
+;B[cq];W[cr];B[bp];W[jc];B[kn];W[km];B[hp];W[rh];B[bs];W[br]
+;B[bi];W[cb];B[gr];W[gs];B[hs];W[fr];B[db];W[bc];B[ol];W[sk]
+;B[oe];W[pn];B[pk];W[pm];B[op];W[po];B[rm];W[ff];B[gh];W[fe]
+;B[gf];W[nk];B[qm];W[mk];B[ri];W[lb];B[mb];W[si];B[pl];W[ma]
+;B[rl];W[ll];B[om];W[rq];B[fi];W[lj];B[ob];W[pb];B[fk];W[oa]
+;B[nb];W[na];B[gj];W[sp];B[gl];W[so];B[hl];W[qo];B[im];W[jm]
+;B[io];W[hm];B[jn];W[im];B[ha];W[ia];B[ga];W[ib];B[cc];W[ba]
+;B[hi];W[hk];B[fg];W[gq];B[hq];W[hr];B[is];W[ih];B[kc];W[kb]
+;B[rj];W[sj];B[bd];W[ad];B[ns];W[da];B[ea];W[ca];B[hh];W[gc]
+;B[fb];W[fd];B[ec];W[ig];B[jf];W[hg];B[gg];W[hf];B[id];W[ke]
+;B[jg];W[kg];B[jh];W[ii];B[pe];W[od];B[me];W[hj];B[qe];W[re]
+;B[aq];W[ar];B[dg];W[ch];B[lo];W[ap];B[ao];W[pj];B[ai];W[os]
+;B[do];W[dp];B[dn];W[rn];B[rf];W[sh];B[mn];W[pi];B[qh];W[rg]
+;B[ng];W[nh];B[lc];W[rk];B[sl];W[sf];B[og];W[sn];B[ql];W[nl]
+;B[oc];W[ic];B[qj];W[aq];B[lf];W[gr];B[ck];W[ah];B[dd];W[nm]
+;B[ed];W[sm];B[lg];W[mg];B[kd];W[tt];B[bm];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2002/game2-19-starofdonghwa-gnugo-0-1.sgf b/regression/games/olympiad2002/game2-19-starofdonghwa-gnugo-0-1.sgf
new file mode 100644 (file)
index 0000000..7bcb08e
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[Star of DongHwa]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026169553] 
+;B[qd];W[dp];B[pq];W[cd];B[ed];W[ec];B[fc];W[dc];B[fd];W[cf]
+;B[jc];W[qj];B[cn];W[gq];B[oc];W[cj];B[qo];W[cl];B[en];W[kp]
+;B[bp];W[nq];B[gn];W[ip];B[cq];W[dq];B[ql];W[qg];B[oe];W[dr]
+;B[je];W[og];B[mg];W[re];B[rd];W[oi];B[ef];W[li];B[dh];W[ch]
+;B[gl];W[di];B[dg];W[fi];B[cg];W[bg];B[rf];W[bi];B[in];W[nh]
+;B[cr];W[rg];B[qe];W[kg];B[lg];W[kh];B[sg];W[sh];B[sf];W[hi]
+;B[nf];W[if];B[hd];W[gf];B[fb];W[or];B[ol];W[pr];B[qr];W[rh]
+;B[oo];W[rk];B[rl];W[eh];B[bm];W[bl];B[eb];W[db];B[da];W[ca]
+;B[ea];W[bb];B[ds];W[es];B[cs];W[er];B[df];W[ce];B[il];W[jn]
+;B[mo];W[lq];B[qs];W[jm];B[ml];W[kk];B[kf];W[jf];B[fg];W[ie]
+;B[ke];W[id];B[ic];W[jd];B[kd];W[el];B[ij];W[dn];B[do];W[dm]
+;B[eo];W[fk];B[ar];W[gg];B[bs];W[fh];B[sk];W[ii];B[qk];W[jj]
+;B[rj];W[qi];B[hk];W[im];B[io];W[hp];B[jo];W[hm];B[fl];W[ko]
+;B[go];W[ge];B[pf];W[gj];B[pg];W[ph];B[lm];W[jl];B[ik];W[cm]
+;B[bn];W[pk];B[jk];W[pl];B[pm];W[mk];B[kj];W[ji];B[lk];W[mj]
+;B[kl];W[ho];B[hn];W[kn];B[nk];W[ok];B[nj];W[mh];B[lj];W[mi]
+;B[oj];W[pj];B[oq];W[np];B[no];W[nr];B[gd];W[qf];B[se];W[of]
+;B[pe];W[fp];B[ng];W[fo];B[fm];W[jp];B[em];W[ln];B[al];W[mn]
+;B[ak];W[nm];B[nl];W[op];B[pp];W[pn];B[om];W[bk];B[aj];W[ai]
+;B[nn];W[mm];B[ff];W[bj];B[am];W[fe];B[dd];W[he];B[mp];W[mq]
+;B[ps];W[km];B[ll];W[cp];B[co];W[ep];B[os];W[ns];B[ri];W[oh]
+;B[si];W[qh];B[gk];W[ek];B[ki];W[lh];B[gp];W[fn];B[gm];W[fq]
+;B[hj];W[eg];B[ee];W[de];B[lp];W[hl];B[ni];W[lo];B[po];W[tt]
+;B[tt]
+)
diff --git a/regression/games/olympiad2002/game2-9-gnugo-go4-0-1.sgf b/regression/games/olympiad2002/game2-9-gnugo-go4-0-1.sgf
new file mode 100644 (file)
index 0000000..bdf9f2e
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Go4++]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026164498] 
+;B[cf];W[fc];B[gf];W[eg];B[ef];W[cc];B[fg];W[gd];B[he];W[hd]
+;B[bd];W[bc];B[cd];W[ad];B[ae];W[ac];B[be];W[dd];B[ed];W[ec]
+;B[de];W[dc];B[ge];W[fd];B[id];W[ic];B[ie];W[hb];B[ee];W[fe]
+;B[ff];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2002/game2-9-gnugo-goint-0-1.sgf b/regression/games/olympiad2002/game2-9-gnugo-goint-0-1.sgf
new file mode 100644 (file)
index 0000000..7b9a8c4
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Go Intellect]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026086209] 
+;B[gd];W[ee];B[gg];W[eg];B[cg];W[fd];B[cd];W[ge];B[gc];W[hf]
+;B[ec];W[hd];B[hc];W[ic];B[ib];W[id];B[ff];W[fe];B[fh];W[dg]
+;B[gb];W[ch];B[bf];W[bg];B[cf];W[bh];B[eh];W[dh];B[ef];W[df]
+;B[hg];W[ei];B[de];W[fg];B[gi];W[gf];B[ih];W[af];B[hi];W[ad]
+;B[if];W[dd];B[dc];W[ce];B[cc];W[he];B[be];W[bd];B[de];W[ed]
+;B[ce];W[ae];B[bc];W[ac];B[ab];W[ag];B[bb];W[fc];B[fb];W[ie]
+;B[fi];W[ig];B[di];W[ci];B[if];W[ha];B[hb];W[ig];B[ei];W[if]
+;B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2002/game2-9-magog-gnugo-0-1.sgf b/regression/games/olympiad2002/game2-9-magog-gnugo-0-1.sgf
new file mode 100644 (file)
index 0000000..4ab9aaf
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[Magog]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026254944] 
+;B[fd];W[gf];B[ge];W[he];B[hd];W[hf];B[ff];W[fg];B[ef];W[eg]
+;B[cg];W[gc];B[fc];W[gd];B[gb];W[fe];B[ee];W[ge];B[hc];W[fb]
+;B[eb];W[hb];B[ga];W[ic];B[cd];W[id];B[dh];W[dg];B[eh];W[fh]
+;B[ha];W[df];B[cf];W[ei];B[de];W[ch];B[bh];W[di];B[bi];W[ec]
+;B[fa];W[dc];B[db];W[cc];B[bc];W[bb];B[cb];W[bd];B[be];W[ac]
+;B[dd];W[ib];B[ci];W[dh];B[ia];W[hh];B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2002/game3-9-go4-gnugo-1-0.sgf b/regression/games/olympiad2002/game3-9-go4-gnugo-1-0.sgf
new file mode 100644 (file)
index 0000000..ab4e577
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[Go4++]PB[GNU Go 3.3.4 (level 10) gmp]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026164605] 
+;B[ee];W[gg];B[cc];W[dg];B[eg];W[eh];B[gd];W[ce];B[df];W[cg]
+;B[cf];W[bf];B[hf];W[dd];B[dc];W[ed];B[ec];W[fe];B[hg];W[hh]
+;B[ih];W[gh];B[fd];W[de];B[ge];W[ef];B[bd];W[gf];B[be];W[ig]
+;B[if];W[ie];B[he];W[ae];B[ad];W[af];B[cd];W[hi];B[ig];W[ii]
+;B[tt];W[fc];B[gc];W[gb];B[hb];W[hc];B[fb];W[hd];B[ga];W[tt]
+;B[tt]
+)
diff --git a/regression/games/olympiad2002/game3-9-goint-gnugo-1-0.sgf b/regression/games/olympiad2002/game3-9-goint-gnugo-1-0.sgf
new file mode 100644 (file)
index 0000000..af0ac4b
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[Go Intellect]
+PB[GNU Go 3.3.4]
+GN[Go Intellect (W) vs. GNU Go (B)]
+DT[2002-07-08]
+SY[Cgoban 1.9.10]TM[30:00(5x1:00)];B[gd]BL[1800];W[dg]WL[1799];B[ce]
+BL[1799];W[cc]WL[1732];B[fg]BL[1793];W[ef]WL[1579];B[bg]BL[1789];W[ff]
+WL[1430];B[gf]BL[1782];W[cf]WL[1378];B[de]BL[1770];W[gg]WL[1112];B[hg]
+BL[1749];W[gh]WL[1010];B[be]BL[1731];W[hh]WL[925];B[ec]BL[1722];W[bf]
+WL[796];B[db]BL[1717];W[ge]WL[713];B[he]BL[1713];W[hf]WL[635];B[cg]
+BL[1710];W[df]WL[606];B[af]BL[1707];W[hd]WL[496];B[hc]BL[1705];W[ie]
+WL[460];B[fd]BL[1704];W[ee]WL[458];B[ch]BL[1702];W[ed]WL[456];B[bi]
+BL[1700];W[dc]WL[454];B[cb]BL[1693];W[dd]WL[452];B[fb]BL[1691];W[dh]
+WL[449];B[bc]BL[1690];W[ic]WL[446];B[hb]BL[1689];W[ib]WL[445];B[cd]
+BL[1689];W[di]WL[444];B[ha]BL[1688];W[bb]WL[442];B[ad]BL[1687];W[fh]
+WL[438];B[ci]BL[1687];W[id]WL[435];B[fe]BL[1687];W[gc]WL[433];B[fc]
+BL[1687];W[ia]WL[432];B[tt]BL[1687];W[tt]WL[432]
+)
diff --git a/regression/games/olympiad2002/game4-9-gnugo-go4-0-1.sgf b/regression/games/olympiad2002/game4-9-gnugo-go4-0-1.sgf
new file mode 100644 (file)
index 0000000..ed967c2
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go 3.3.4 (level 10) gmp]PB[Go4++]HA[0]KM[5.5]GN[GNU Go 3.3.4 gmp Random Seed 1026164724] 
+;B[df];W[ed];B[gf];W[gg];B[fg];W[hf];B[ge];W[gh];B[cd];W[cc]
+;B[bc];W[fc];B[fh];W[ih];B[hc];W[dc];B[gb];W[bb];B[bd];W[eb]
+;B[he];W[hi];B[if];W[hg];B[ab];W[ba];B[fb];W[fi];B[eh];W[ei]
+;B[di];W[gi];B[dh];W[ig];B[dd];W[ie];B[id];W[if];B[ca];W[tt]
+;B[ea];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2002/game4-9-gnugo-goint-1-0.sgf b/regression/games/olympiad2002/game4-9-gnugo-goint-1-0.sgf
new file mode 100644 (file)
index 0000000..f3296e0
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[GNU Go 3.3.4]
+PB[Go Intellect]
+GN[GNU Go (W) vs. Go Intellect (B)]
+DT[2002-07-08]
+SY[Cgoban 1.9.10]TM[30:00(5x1:00)];B[fc]BL[1799];W[fe]WL[1800];B[cd]
+BL[1791];W[gc]WL[1799];B[dg]BL[1776];W[fd]WL[1794];B[ec]BL[1770];W[fg]
+WL[1792];B[eh]BL[1762];W[gb]WL[1790];B[fb]BL[1761];W[fh]WL[1790];B[fi]
+BL[1759];W[gi]WL[1789];B[ei]BL[1758];W[hh]WL[1789];B[ga]BL[1757];W[df]
+WL[1788];B[de]BL[1737];W[cf]WL[1783];B[ch]BL[1730];W[bg]WL[1774];B[hb]
+BL[1724];W[hc]WL[1763];B[bh]BL[1720];W[ah]WL[1757];B[di]BL[1713];W[bi]
+WL[1752];B[be]BL[1705];W[ef]WL[1748];B[ib]BL[1703];W[ha]WL[1747];B[ia]
+BL[1701];W[ic]WL[1747];B[bf]BL[1698];W[cg]WL[1747];B[cc]BL[1695];W[ce]
+WL[1747];B[ed]BL[1694];W[af]WL[1746];B[bd]BL[1693];W[ee]WL[1745];B[dd]
+BL[1692];W[ae]WL[1745];B[ad]BL[1690];W[ag]WL[1745];B[fa]BL[1689];W[ha]
+WL[1745];B[bb]BL[1688];W[tt]WL[1744];B[tt]BL[1688]
+)
diff --git a/regression/games/olympiad2003/aya_vs_gnugo.sgf b/regression/games/olympiad2003/aya_vs_gnugo.sgf
new file mode 100644 (file)
index 0000000..f641fea
--- /dev/null
@@ -0,0 +1,81 @@
+(;GM[1]FF[3]
+RU[New Zealand]BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[GnuGo]
+PB[Aya]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00]
+RE[W+239.5]
+;B[qc]BL[2969];W[dc]WL[3000];B[qf]BL[2962];W[hd]WL[3000];B[qq]BL[2957]
+;W[dp]WL[2999];B[mc]BL[2953];W[de]WL[2999];B[ic]BL[2948];W[hc]WL[2999]
+;B[hb]BL[2943];W[gb]WL[2999];B[qj]BL[2935];W[je]WL[2997];B[kd]BL[2926]
+;W[lf]WL[2996];B[qm]BL[2919];W[pp]WL[2994];B[po]BL[2913];W[qp]WL[2992]
+;B[op]BL[2903];W[pq]WL[2988];B[cq]BL[2889];W[cp]WL[2984];B[pr]BL[2873]
+;W[er]WL[2974];B[dq]BL[2863];W[eq]WL[2969];B[or]BL[2850];W[rq]WL[2962]
+;B[qr]BL[2844];W[rr]WL[2957];B[oq]BL[2831];W[qo]WL[2951];B[rn]BL[2825]
+;W[pn]WL[2948];B[oo]BL[2819];W[qn]WL[2946];B[ro]BL[2803];W[om]WL[2944]
+;B[pm]BL[2791];W[dl]WL[2942];B[iq]BL[2762];W[on]WL[2940];B[mn]BL[2750]
+;W[nf]WL[2937];B[nl]BL[2730];W[ci]WL[2934];B[gp]BL[2719];W[gn]WL[2931]
+;B[fo]BL[2708];W[in]WL[2928];B[bq]BL[2702];W[bp]WL[2917];B[dn]BL[2668]
+;W[en]WL[2911];B[dr]BL[2640];W[eo]WL[2895];B[me]BL[2601];W[mf]WL[2890]
+;B[og]BL[2571];W[mi]WL[2885];B[fn]BL[2528];W[fm]WL[2880];B[jo]BL[2480]
+;W[hl]WL[2875];B[em]BL[2455];W[fl]WL[2869];B[nh]BL[2398];W[kk]WL[2864]
+;B[do]BL[2374];W[ep]WL[2847];B[mj]BL[2354];W[lj]WL[2842];B[dm]BL[2334]
+;W[cm]WL[2822];B[ke]BL[2323];W[kf]WL[2816];B[el]BL[2308];W[dk]WL[2807]
+;B[cn]BL[2291];W[bm]WL[2799];B[es]BL[2254];W[fr]WL[2794];B[bn]BL[2240]
+;W[ek]WL[2781];B[an]BL[2226];W[nj]WL[2777];B[ap]BL[2199];W[am]WL[2767]
+;B[ao]BL[2190];W[ne]WL[2762];B[id]BL[2165];W[ie]WL[2754];B[ho]BL[2141]
+;W[nd]WL[2744];B[hn]BL[2127];W[nc]WL[2732];B[nb]BL[2117];W[ob]WL[2716]
+;B[mb]BL[2107];W[ib]WL[2704];B[jb]BL[2098];W[ha]WL[2695];B[im]BL[2084]
+;W[pc]WL[2686];B[pd]BL[2062];W[qb]WL[2680];B[mh]BL[2041];W[mk]WL[2676]
+;B[kh]BL[2019];W[lh]WL[2673];B[lg]BL[2000];W[li]WL[2671];B[jj]BL[1978]
+;W[kg]WL[2666];B[hk]BL[1951];W[gk]WL[2661];B[hj]BL[1926];W[il]WL[2655]
+;B[od]BL[1905];W[qd]WL[2644];B[oc]BL[1881];W[rc]WL[2630];B[oa]BL[1868]
+;W[pb]WL[2625];B[qe]BL[1853];W[jd]WL[2620];B[jc]BL[1844];W[ji]WL[2613]
+;B[ll]BL[1791];W[oi]WL[2609];B[jh]BL[1758];W[ph]WL[2600];B[rd]BL[1721]
+;W[rh]WL[2572];B[pi]BL[1674];W[qc]WL[2546];B[pf]BL[1643];W[oe]WL[2528]
+;B[pe]BL[1610];W[rf]WL[2510];B[re]BL[1581];W[rb]WL[2497];B[jk]BL[1509]
+;W[ki]WL[2482];B[pa]BL[1489];W[jl]WL[2476];B[md]BL[1431];W[qg]WL[2471]
+;B[rg]BL[1383];W[sg]WL[2465];B[qa]BL[1328];W[pg]WL[2460];B[of]BL[1314]
+;W[se]WL[2455];B[sd]BL[1300];W[oh]WL[2446];B[ra]BL[1284];W[ng]WL[2442]
+;B[le]BL[1274];W[sc]WL[2438];B[ok]BL[1253];W[ja]WL[2433];B[kb]BL[1237]
+;W[lc]WL[2432];B[lb]BL[1224];W[ka]WL[2431];B[la]BL[1204];W[na]WL[2430]
+;B[ia]BL[1188];W[ja]WL[2428];B[ri]BL[1173];W[jm]WL[2425];B[hm]BL[1147]
+;W[jn]WL[2423];B[gm]BL[1130];W[lm]WL[2420];B[ln]BL[1107];W[ml]WL[2412]
+;B[mm]BL[1088];W[ko]WL[2407];B[kq]BL[1061];W[qi]WL[2403];B[qh]BL[1043]
+;W[nm]WL[2399];B[oj]BL[1029];W[lo]WL[2394];B[km]BL[1016];W[ol]WL[2386]
+;B[nk]BL[1000];W[pl]WL[2374];B[ql]BL[985];W[qk]WL[2367];B[rk]BL[965];
+W[kn]WL[2360];B[lk]BL[952];W[ii]WL[2348];B[gl]BL[903];W[fk]WL[2338];
+B[qi]BL[873];W[mj]WL[2333];B[mo]BL[860];W[pk]WL[2329];B[fi]BL[846];
+W[rp]WL[2322];B[pj]BL[828];W[si]WL[2316];B[dj]BL[812];W[gj]WL[2303];
+B[cj]BL[801];W[bk]WL[2293];B[hi]BL[786];W[hh]WL[2276];B[gi]BL[774];
+W[ej]WL[2261];B[di]BL[760];W[ei]WL[2225];B[eh]BL[740];W[fh]WL[2195];
+B[bj]BL[718];W[cl]WL[2156];B[aj]BL[676];W[fp]WL[2133];B[go]BL[662];
+W[gh]WL[2122];B[cg]BL[635];W[gq]WL[2115];B[ck]BL[616];W[ip]WL[2109];
+B[bl]BL[593];W[eg]WL[2100];B[dh]BL[584];W[ij]WL[2094];B[jp]BL[573];
+W[io]WL[2088];B[hq]BL[566];W[hp]WL[2078];B[gr]BL[560];W[fq]WL[2066];
+B[ce]BL[553];W[cd]WL[2056];B[bd]BL[547];W[be]WL[2051];B[cc]BL[537];
+W[cf]WL[2029];B[bb]BL[523];W[ad]WL[2012];B[db]BL[509];W[bc]WL[1985];
+B[fb]BL[498];W[bg]WL[1968];B[ah]BL[486];W[lp]WL[1953];B[fd]BL[476];
+W[mr]WL[1936];B[lq]BL[472];W[mq]WL[1920];B[mp]BL[468];W[gc]WL[1910];
+B[he]BL[464];W[ge]WL[1890];B[fe]BL[456];W[fc]WL[1879];B[if]BL[449];
+W[hf]WL[1868];B[ec]BL[444];W[cb]WL[1856];B[ca]BL[439];W[ed]WL[1841];
+B[cc]BL[433];W[eb]WL[1800];B[ea]BL[427];W[fa]WL[1786];B[bh]BL[421];
+W[hr]WL[1783];B[ir]BL[416];W[gs]WL[1779];B[al]BL[410];W[gn]WL[1761];
+B[nq]BL[406];W[ak]WL[1759];B[ef]BL[401];W[dg]WL[1757];B[ag]BL[398];
+W[ch]WL[1755];B[rs]BL[395];W[is]WL[1752];B[sm]BL[389];W[rl]WL[1745];
+B[lr]BL[385];W[js]WL[1743];B[ls]BL[383];W[kl]WL[1742];B[sr]BL[382];
+W[sq]WL[1741];B[nn]BL[380];W[rm]WL[1740];B[lm]BL[379];W[kp]WL[1740];
+B[jq]BL[378];W[ss]WL[1740];B[jf]BL[377];W[he]WL[1739];B[qs]BL[376];
+W[sr]WL[1738];B[tt]BL[375];W[hs]WL[1738];B[ds]BL[371];W[fs]WL[1738];
+B[br]BL[370];W[ks]WL[1737];B[co]BL[369];W[bo]WL[1737];B[aq]BL[368];
+W[kr]WL[1737];B[nr]BL[368];W[jr]WL[1736];B[ms]BL[368];W[tt]WL[1735];
+B[tt]BL[368];
+TW[aa][ba][ca][da][ea][ga][ia][ka][la][ma][oa][pa][qa][ra][sa][ab][bb][cb][db][fb][hb][jb][kb][lb][mb][nb][sb][ac][cc][ec][ic][jc][kc][mc][oc][bd][dd][fd][gd][id][kd][ld][md][od][pd][rd][sd][ae][ce][ee][fe][ke][le][me][pe][qe][re][af][bf][df][ef][ff][gf][if][jf][of][pf][qf][sf][ag][cg][fg][gg][hg][ig][jg][lg][mg][og][rg][ah][bh][dh][eh][ih][jh][kh][mh][nh][qh][sh][ai][bi][di][fi][gi][hi][ni][pi][qi][ri][aj][bj][cj][dj][fj][hj][jj][kj][oj][pj][qj][rj][sj][ck][hk][ik][jk][nk][ok][rk][sk][al][bl][gl][nl][ql][sl][gm][hm][im][pm][qm][sm][fn][hn][rn][sn][fo][go][ho][ro][so][gp][sp][gr]
+TB[no][np][mq][ar][cr][mr][as][bs][cs][ns][os][ps]
+C[The game is over.  Final score:
+   White = 146 territory + 151 living stones + 0 dame + 6.5 komi = 303.5
+   Black = 12 territory + 52 living stones + 0 dame = 64
+White wins by 239.5.
+]
+)
diff --git a/regression/games/olympiad2003/explorer_vs_gnugo.sgf b/regression/games/olympiad2003/explorer_vs_gnugo.sgf
new file mode 100644 (file)
index 0000000..44df5d9
--- /dev/null
@@ -0,0 +1,66 @@
+(;GM[1]FF[3]
+RU[New Zealand]BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[GnuGo]
+PB[Explorer]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00]
+RE[W+75.5]
+;B[qc]BL[2993];W[dp]WL[3000];B[qq]BL[2992];W[dd]WL[3000];B[kq]BL[2991]
+;W[pp]WL[3000];B[pq]BL[2991];W[op]WL[2999];B[ro]BL[2990];W[pm]WL[2999]
+;B[nr]BL[2989];W[nd]WL[2998];B[pe]BL[2989];W[qg]WL[2998];B[qf]BL[2988]
+;W[pg]WL[2997];B[lc]BL[2988];W[nf]WL[2996];B[ck]BL[2988];W[cg]WL[2994]
+;B[cn]BL[2988];W[fp]WL[2992];B[cq]BL[2987];W[cp]WL[2990];B[bp]BL[2986]
+;W[bo]WL[2986];B[bh]BL[2972];W[bq]WL[2982];B[br]BL[2969];W[ap]WL[2977]
+;B[cr]BL[2948];W[er]WL[2973];B[ch]BL[2948];W[dc]WL[2970];B[dg]BL[2947]
+;W[cf]WL[2968];B[eh]BL[2947];W[hd]WL[2966];B[ke]BL[2946];W[kg]WL[2964]
+;B[jf]BL[2945];W[hf]WL[2962];B[ig]BL[2944];W[bg]WL[2960];B[bs]BL[2943]
+;W[rm]WL[2957];B[ds]BL[2928];W[ji]WL[2953];B[ic]BL[2918];W[hc]WL[2949]
+;B[ib]BL[2917];W[nm]WL[2945];B[es]BL[2917];W[fr]WL[2938];B[dq]BL[2908]
+;W[eq]WL[2933];B[dr]BL[2895];W[ar]WL[2929];B[id]BL[2889];W[hb]WL[2925]
+;B[gl]BL[2889];W[al]WL[2921];B[bm]BL[2887];W[am]WL[2918];B[hg]BL[2883]
+;W[jk]WL[2914];B[gf]BL[2883];W[ge]WL[2910];B[ff]BL[2882];W[lg]WL[2905]
+;B[fe]BL[2881];W[fd]WL[2891];B[ie]BL[2880];W[mc]WL[2884];B[lb]BL[2878]
+;W[gj]WL[2882];B[ek]BL[2877];W[hk]WL[2874];B[he]BL[2877];W[rf]WL[2864]
+;B[re]BL[2875];W[rg]WL[2857];B[hq]BL[2875];W[lm]WL[2850];B[ho]BL[2870]
+;W[se]WL[2846];B[rd]BL[2855];W[gd]WL[2843];B[mp]BL[2854];W[in]WL[2838]
+;B[io]BL[2852];W[ia]WL[2828];B[ja]BL[2852];W[ha]WL[2818];B[nb]BL[2851]
+;W[mb]WL[2805];B[jh]BL[2849];W[kh]WL[2796];B[of]BL[2848];W[og]WL[2779]
+;B[oe]BL[2846];W[ne]WL[2772];B[oc]BL[2844];W[la]WL[2766];B[jc]BL[2842]
+;W[ka]WL[2757];B[jb]BL[2840];W[en]WL[2746];B[em]BL[2834];W[dn]WL[2738]
+;B[dm]BL[2825];W[hr]WL[2732];B[ir]BL[2817];W[gq]WL[2726];B[hp]BL[2809]
+;W[is]WL[2721];B[jr]BL[2804];W[jg]WL[2715];B[fn]BL[2801];W[fo]WL[2705]
+;B[gn]BL[2793];W[co]WL[2696];B[bj]BL[2787];W[bn]WL[2682];B[cm]BL[2781]
+;W[rn]WL[2672];B[js]BL[2774];W[rp]WL[2666];B[sd]BL[2773];W[qp]WL[2660]
+;B[rr]BL[2772];W[hs]WL[2655];B[sf]BL[2766];W[sg]WL[2650];B[fi]BL[2764]
+;W[jn]WL[2626];B[no]BL[2762];W[ah]WL[2618];B[on]BL[2760];W[om]WL[2616]
+;B[nc]BL[2757];W[ld]WL[2611];B[le]BL[2754];W[ai]WL[2605];B[kd]BL[2751]
+;W[md]WL[2602];B[lo]BL[2750];W[ih]WL[2595];B[jo]BL[2749];W[kn]WL[2582]
+;B[gh]BL[2748];W[hh]WL[2579];B[hm]BL[2747];W[rq]WL[2578];B[il]BL[2742]
+;W[sr]WL[2575];B[jl]BL[2735];W[qr]WL[2574];B[ik]BL[2731];W[kk]WL[2573]
+;B[ij]BL[2730];W[pr]WL[2567];B[oq]BL[2726];W[hi]WL[2562];B[se]BL[2723]
+;W[or]WL[2553];B[nq]BL[2722];W[gi]WL[2545];B[kl]BL[2721];W[ll]WL[2544]
+;B[lk]BL[2720];W[mk]WL[2542];B[jj]BL[2717];W[kj]WL[2542];B[pf]BL[2710]
+;W[ee]WL[2541];B[mn]BL[2706];W[df]WL[2540];B[ef]BL[2700];W[kb]WL[2540]
+;B[mm]BL[2695];W[lj]WL[2538];B[kc]BL[2693];W[ma]WL[2538];B[ml]BL[2689]
+;W[nl]WL[2536];B[nk]BL[2684];W[ok]WL[2534];B[nn]BL[2677];W[na]WL[2533]
+;B[od]BL[2669];W[oa]WL[2532];B[sb]BL[2658];W[qa]WL[2531];B[pb]BL[2655]
+;W[pa]WL[2531];B[pn]BL[2651];W[qo]WL[2530];B[qn]BL[2645];W[qm]WL[2528]
+;B[rb]BL[2639];W[bi]WL[2527];B[ci]BL[2635];W[fj]WL[2527];B[ej]BL[2629]
+;W[fk]WL[2527];B[fl]BL[2625];W[bl]WL[2526];B[os]BL[2618];W[rs]WL[2526]
+;B[ko]BL[2614];W[aj]WL[2526];B[bk]BL[2611];W[ps]WL[2525];B[ns]BL[2608]
+;W[cl]WL[2524];B[dl]BL[2604];W[ak]WL[2524];B[mf]BL[2600];W[mg]WL[2522]
+;B[hl]BL[2596];W[ii]WL[2521];B[qb]BL[2593];W[ra]WL[2521];B[np]BL[2591]
+;W[hj]WL[2521];B[gp]BL[2588];W[lk]WL[2521];B[kf]BL[2585];W[lf]WL[2521]
+;B[me]BL[2582];W[ln]WL[2520];B[hn]BL[2578];W[ng]WL[2520];B[po]BL[2574]
+;W[ob]WL[2520];B[oo]BL[2571];W[sa]WL[2520];B[go]BL[2569];W[jm]WL[2520]
+;B[km]BL[2565];W[im]WL[2520];B[gk]BL[2560];W[tt]WL[2520];B[tt]BL[2554]
+;
+TW[aa][ba][ca][da][ea][fa][ga][ab][bb][cb][db][eb][fb][gb][ac][bc][cc][ec][fc][gc][ad][bd][cd][ed][ae][be][ce][de][af][bf][ag][jh][lh][mh][nh][oh][ph][qh][rh][sh][ki][li][mi][ni][oi][pi][qi][ri][si][mj][nj][oj][pj][qj][rj][sj][nk][pk][qk][rk][sk][ol][pl][ql][rl][sl][sm][an][sn][ao][do][eo][ro][so][bp][ep][sp][aq][cq][dq][fq][sq][br][cr][dr][gr][rr][as][bs][cs][ds][es][fs][gs][qs][ss]
+TB[pc][rc][sc][jd][pd][qd][je][qe][hf][if][eg][fg][gg][dh][fh][di][ei][cj][dj][dk][el][fm][gm][mo][ip][jp][kp][lp][iq][jq][lq][mq][kr][lr][mr][ks][ls][ms]
+C[The game is over.  Final score:
+   White = 96 territory + 119 living stones + 0 dame + 6.5 komi = 221.5
+   Black = 38 territory + 108 living stones + 0 dame = 146
+White wins by 75.5.
+]
+)
diff --git a/regression/games/olympiad2003/gnugo_vs_dariush.sgf b/regression/games/olympiad2003/gnugo_vs_dariush.sgf
new file mode 100644 (file)
index 0000000..f2139c4
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[3]
+SZ[19]TM[]BR[]WR[]
+PB[GnuGo]
+PW[Dariush]
+GN[GNU Go 3.5.2olympiad Random Seed 1069690561 level 12]
+DT[2003-11-24]
+KM[6.5]AP[GNU Go:3.5.2olympiad]RU[Chinese]HA[0]
+RE[B+12.5]
+;B[pd];W[cp];B[qp];W[dc];B[pl];W[qf];B[eq];W[nc];B[nd];W[md];B[ne];
+W[ip];B[oc];W[dq];B[mc];W[of];B[dr];W[ce];B[lc];W[op];B[oq];W[nq];
+B[pq];W[hd];B[np];W[mp];B[no];W[cr];B[dp];W[cq];B[do];W[go];B[er];
+W[dj];B[co];W[bn];B[bo];W[ao];B[bp];W[oo];B[mo];W[lp];B[on];W[hr];
+B[dm];W[bl];B[mq];W[lq];B[le];W[mr];B[pj];W[os];B[if];W[ge];B[hh];
+W[qe];B[fh];W[qd];B[cg];W[bi];B[km];W[ph];B[qi];W[rh];B[nh];W[ng];
+B[ri];W[qg];B[lh];W[si];B[sj];W[qc];B[jb];W[ib];B[ic];W[oi];B[hb];
+W[gb];B[mj];W[eh];B[hj];W[lo];B[mn];W[hc];B[ia];W[nj];B[qh];W[rg];
+B[ga];W[fb];B[pb];W[nl];B[rb];W[rc];B[qr];W[mk];B[lj];W[om];B[pm];
+W[pn];B[nn];W[mg];B[fa];W[ea];B[ha];W[eb];B[ni];W[oh];B[oj];W[ln];
+B[qn];W[mm];B[po];W[nm];B[pn];W[lm];B[kl];W[fg];B[gg];W[ff];B[fi];
+W[or];B[hm];W[in];B[ap];W[lg];B[kg];W[nk];B[im];W[lk];B[kk];W[mh]
+(;B[li];W[mi];B[an];W[di];B[bm];W[cl];B[jn];W[jo];B[hn];W[fk];B[ho];
+W[hp];B[gj];W[qs];B[rs];W[ps];B[gp];W[gq];B[fp];W[rr];B[rq];W[ss];
+B[el];W[ek];B[al];W[ak];B[am];W[bk];B[gl];W[je];B[ie];W[fl];B[fm];
+W[qb];B[qa];W[sb];B[ra];W[fr];B[dl];W[dk];B[io];W[ko];B[lf];W[hf];
+B[id];W[hg];B[ig];W[gk];B[hk];W[cm];B[cn];W[sh];B[rk];W[kh];B[jj];
+W[ki];B[kj];W[pc];B[nb];W[es];B[ds];W[fs];B[pe];W[gf];B[gh];W[oe];
+B[od];W[jg];B[kf];W[pr];B[qq];W[pf];B[mf];W[ll];B[ok];W[fj];B[ei];
+W[dh];B[sq];W[fq];B[nf];W[fo];B[ep];W[he];B[sr];W[rs];B[pi];W[kn];
+B[ol];W[ej];B[pa];W[tt];B[sa];W[sc];B[tt];W[tt];B[tt]
+TW[aa][ba][ca][da][ab][bb][cb][db][ac][bc][cc][ec][fc][gc][ad][bd][cd][dd][ed][fd][gd][rd][sd][ae][be][de][ee][fe][re][se][af][bf][cf][df][ef][rf][sf][ag][bg][cg][dg][eg][og][pg][sg][ah][bh][ch][nh][ai][ci][ni][aj][bj][cj][ck][ml][jp][kp][hq][iq][jq][kq][mq][gr][ir][jr][kr][lr][nr][gs][hs][is][js][ks][ls][ms][ns]
+TB[ja][ka][la][ma][na][oa][ib][kb][lb][mb][ob][jc][kc][nc][jd][kd][ld][md][je][ke][me][jf][jg][ih][jh][kh][gi][hi][ii][ji][ki][ij][qj][rj][ik][jk][pk][qk][sk][hl][il][jl][ql][rl][sl][em][gm][jm][qm][rm][sm][bn][dn][en][fn][gn][in][rn][sn][ao][eo][fo][go][oo][qo][ro][so][cp][op][pp][rp][sp][aq][bq][cq][dq][ar][br][cr][as][bs][cs]
+C[The game is over.  Final score:
+   White = 78 territory + 93 living stones + 0 dame + 6.5 komi = 177.5
+   Black = 82 territory + 108 living stones + 0 dame = 190
+Black wins by 12.5.
+])
+
+(;B[li])
+
+)
diff --git a/regression/games/olympiad2003/gnugo_vs_goahead.sgf b/regression/games/olympiad2003/gnugo_vs_goahead.sgf
new file mode 100644 (file)
index 0000000..ec98ce0
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[3]
+RU[New Zealand]BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[GoAhead]
+PB[GnuGo]
+GN[White (W) vs. Black (B)]
+DT[2003-11-24]
+SY[Cgoban 1.9.14]TM[-]
+RE[B+56.5]
+;B[pd];W[qp];B[dd];W[cp];B[jd];W[oq];B[ep];W[eq];B[dp];W[dq];B[co];
+W[cq];B[fp];W[gq];B[ho];W[dj];B[qj];W[cm];B[ch];W[qf];B[bo];W[qc];
+B[pc];W[qd];B[pe];W[pf];B[qm];W[cf];B[df];W[dg];B[ce];W[ef];B[de];
+W[eg];B[cg];W[lc];B[gc];W[nc];B[qh];W[me];B[dh];W[em];B[eh];W[gg];
+B[kb];W[of];B[fq];W[fr];B[fh];W[fg];B[ig];W[gh];B[iq];W[gp];B[dn];
+W[go];B[lq];W[bp];B[dm];W[dl];B[fo];W[gn];B[in];W[hr];B[cl];W[en];
+B[dk];W[el];B[bm];W[ck];B[bl];W[bk];B[ao];W[ks];B[il];W[lb];B[ro];
+W[rp];B[on];W[qo];B[ni];W[rn];B[kc];W[bi];B[ii];W[gi];B[ej];W[ek];
+B[fj];W[gj];B[fk];W[hl];B[hk];W[gk];B[gl];W[fl];B[hm];W[bf];B[bg];
+W[be];B[bd];W[fd];B[jf];W[fc];B[eb];W[fb];B[gb];W[dc];B[ec];W[ed];
+B[fa];W[cc];B[af];W[bc];B[ae];W[hf];B[fi];W[hd];B[gd];W[ge];B[ib];
+W[ie];B[kf];W[fe];B[db];W[id];B[if];W[mp];B[ln];W[lp];B[kp];W[sk];
+B[kr];W[js];B[ls];W[qk];B[ol];W[rm];B[nh];W[jr];B[jq];W[ir];B[ql];
+W[pk];B[rk];W[rl];B[rj];W[gm];B[hl];W[qb];B[nr];W[or];B[os];W[ps];
+B[ns];W[pr];B[rg];W[rf];B[sj];W[mr];B[lr];W[nq];B[ms];W[mg];B[lh];
+W[mh];B[mi];W[qg];B[rh];W[lg];B[kg];W[ld];B[sf];W[se];B[sg];W[re];
+B[mq];W[je];B[ke];W[kd];B[jc];W[ka];B[ic];W[hp];B[ja];W[la];B[no];
+W[np];B[eo];W[ko];B[ip];W[lo];B[mo];W[kn];B[lm];W[jo];B[io];W[km];
+B[kl];W[jm];B[jl];W[ph];B[pi];W[sl];B[oh];W[pn];B[oo];W[pm];B[pl];
+W[om];B[nm];W[nl];B[ml];W[ah];B[fn];W[op];B[po];W[qn];B[nk];W[ng];
+B[ap];W[al];B[am];W[ak];B[aq];W[br];B[ar];W[bs];B[bh];W[lf];B[di];
+W[ci];B[pp];W[jp];B[kq];W[fm];B[do];W[pg];B[pq];W[qr];B[qq];W[rq];
+B[bq];W[og];B[as];W[cr];B[ag];W[ai];B[hq];W[im];B[hn];W[le];B[jn];
+W[rr];B[tt];W[tt];
+TW[ma][na][oa][pa][qa][ra][sa][mb][nb][ob][pb][rb][sb][mc][oc][pc][rc][sc][md][nd][od][pd][rd][sd][ne][oe][pe][qe][mf][nf][aj][bj][cj][dk][sm][sn][ro][so][sp][sq][dr][er][gr][sr][cs][ds][es][fs][gs][hs][is][qs][rs][ss]
+TB[aa][ba][ca][da][ea][ga][ha][ia][ab][bb][cb][fb][hb][jb][ac][bc][cc][dc][fc][hc][ad][cd][ed][fd][hd][id][be][ee][fe][ge][he][ie][je][bf][cf][ef][ff][gf][hf][dg][eg][fg][gg][hg][jg][gh][hh][ih][jh][kh][sh][ei][gi][hi][ji][ki][li][oi][qi][ri][si][gj][hj][ij][jj][kj][lj][mj][nj][oj][pj][gk][ik][jk][kk][lk][mk][ok][pk][qk][ll][nl][cm][mm][an][bn][cn][mn][nn][mr]
+C[The game is over.  Final score:
+   White = 54 territory + 95 living stones + 0 dame + 6.5 komi = 155.5
+   Black = 90 territory + 122 living stones + 0 dame = 212
+Black wins by 56.5.
+]
+)
diff --git a/regression/games/olympiad2003/gnugo_vs_indigo.sgf b/regression/games/olympiad2003/gnugo_vs_indigo.sgf
new file mode 100644 (file)
index 0000000..43c53e4
--- /dev/null
@@ -0,0 +1,49 @@
+(;GM[1]FF[3]
+RU[New Zealand]BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[Indigo]
+PB[GnuGo]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00]
+RE[B+T]
+;B[pd]BL[3000];W[cq]WL[2962];B[dp]BL[3000];W[cp]WL[2918];B[do]BL[3000]
+;W[qj]WL[2882];B[er]BL[2998];W[cc]WL[2837];B[qq]BL[2997];W[qf]WL[2800]
+;B[dd]BL[2997];W[cd]WL[2764];B[de]BL[2996];W[nd]WL[2724];B[oe]BL[2994]
+;W[lp]WL[2680];B[eb]BL[2993];W[qc]WL[2634];B[bf]BL[2991];W[pc]WL[2599]
+;B[co]BL[2989];W[dj]WL[2554];B[bp]BL[2987];W[qo]WL[2515];B[nq]BL[2985]
+;W[jc]WL[2488];B[pf]BL[2983];W[lr]WL[2452];B[qe]BL[2980];W[re]WL[2421]
+;B[rf]BL[2978];W[qg]WL[2405];B[rd]BL[2973];W[rg]WL[2359];B[oh]BL[2967]
+;W[or]WL[2322];B[se]BL[2962];W[rc]WL[2284];B[oq]BL[2959];W[nf]WL[2246]
+;B[ne]BL[2954];W[qh]WL[2208];B[nr]BL[2951];W[me]WL[2194];B[of]BL[2946]
+;W[fc]WL[2157];B[ec]BL[2941];W[pr]WL[2122];B[pq]BL[2937];W[no]WL[2086]
+;B[ng]BL[2935];W[mf]WL[2060];B[lh]BL[2933];W[mi]WL[2019];B[mh]BL[2930]
+;W[oj]WL[2006];B[ni]BL[2928];W[mj]WL[1982];B[hc]BL[2926];W[hd]WL[1947]
+;B[gd]BL[2922];W[nj]WL[1913];B[id]BL[2917];W[po]WL[1858];B[ke]BL[2914]
+;W[ic]WL[1813];B[ld]BL[2908];W[he]WL[1794];B[md]BL[2899];W[kf]WL[1760]
+;B[hb]BL[2891];W[je]WL[1724];B[jd]BL[2887];W[nc]WL[1691];B[kc]BL[2879]
+;W[ie]WL[1679];B[kd]BL[2873];W[fd]WL[1647];B[ge]BL[2868];W[kb]WL[1615]
+;B[lf]BL[2862];W[mc]WL[1579];B[kg]BL[2857];W[jf]WL[1547];B[jb]BL[2854]
+;W[fe]WL[1507];B[gf]BL[2852];W[gc]WL[1497];B[ff]BL[2850];W[gb]WL[1464]
+;B[kj]BL[2848];W[ef]WL[1432];B[eg]BL[2844];W[df]WL[1411];B[ee]BL[2836]
+;W[ce]WL[1379];B[cf]BL[2832];W[rp]WL[1347];B[rq]BL[2827];W[hg]WL[1314]
+;B[gh]BL[2824];W[hh]WL[1300];B[hi]BL[2820];W[gg]WL[1283];B[fh]BL[2808]
+;W[fg]WL[1274];B[dg]BL[2792];W[ii]WL[1239];B[ih]BL[2780];W[ij]WL[1207]
+;B[ad]BL[2776];W[gk]WL[1175];B[lk]BL[2771];W[gi]WL[1162];B[hf]BL[2767]
+;W[hj]WL[1144];B[ig]BL[2763];W[hi]WL[1133];B[ei]BL[2761];W[li]WL[1104]
+;B[ki]BL[2758];W[mm]WL[1088];B[lb]BL[2756];W[lc]WL[1075];B[ka]BL[2754]
+;W[qr]WL[1045];B[ob]BL[2750];W[rr]WL[1027];B[sr]BL[2747];W[sq]WL[992];
+B[sp]BL[2744];W[oc]WL[959];B[mb]BL[2741];W[so]WL[938];B[sq]BL[2738];
+W[iq]WL[906];B[cl]BL[2738];W[el]WL[894];B[km]BL[2736];W[im]WL[856];
+B[go]BL[2734];W[nb]WL[824];B[sc]BL[2731];W[io]WL[787];B[gr]BL[2727];
+W[bk]WL[754];B[bi]BL[2724];W[bq]WL[721];B[bo]BL[2715];W[gq]WL[645];
+B[hr]BL[2711];W[dq]WL[612];B[eq]BL[2707];W[fq]WL[558];B[hq]BL[2703];
+W[hp]WL[524];B[gp]BL[2700];W[ck]WL[494];B[os]BL[2696];W[di]WL[460];
+B[ir]BL[2693];W[dr]WL[427];B[ar]BL[2687];W[aq]WL[396];B[ds]BL[2684];
+W[rb]WL[359];B[pb]BL[2682];W[fp]WL[326];B[fn]BL[2677];W[ep]WL[307];
+B[fr]BL[2670];W[br]WL[276];B[cs]BL[2668];W[ej]WL[244];B[jq]BL[2667];
+W[ch]WL[210];B[bh]BL[2664];W[bl]WL[176];B[dl]BL[2662];W[jp]WL[145];
+B[bm]BL[2660];W[gm]WL[112];B[hn]BL[2658];W[eh]WL[78];B[dh]BL[2656];
+W[in]WL[46];B[ci]BL[2653];WL[-1]
+C[White has run out of time.  Black wins.
+]
+)
diff --git a/regression/games/olympiad2003/gnugo_vs_jimmy.sgf b/regression/games/olympiad2003/gnugo_vs_jimmy.sgf
new file mode 100644 (file)
index 0000000..d8dd2f3
--- /dev/null
@@ -0,0 +1,67 @@
+(;GM[1]FF[3]
+RU[New Zealand]
+RE[B+150.5]
+BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[Jimmy]
+PB[GnuGo]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00];B[pd]BL[3000];W[pp]WL[2998];B[cd]BL[3000];
+W[cp]WL[2997];B[ec]BL[3000];W[jc]WL[2997];B[eq]BL[3000];W[cj]WL[2996];
+B[do]BL[3000];W[co]WL[2996];B[dn]BL[2998];W[cm]WL[2996];B[jq]BL[2997];
+W[qj]WL[2996];B[np]BL[2997];W[pn]WL[2995];B[pq]BL[2997];W[qq]WL[2995];
+B[oq]BL[2995];W[nc]WL[2994];B[qf]BL[2993];W[qr]WL[2994];B[el]BL[2992];
+W[pb]WL[2994];B[qc]BL[2991];W[ld]WL[2993];B[qb]BL[2991];W[gc]WL[2992];
+B[cr]BL[2990];W[rg]WL[2991];B[cn]BL[2987];W[bn]WL[2990];B[nn]BL[2985];
+W[pl]WL[2989];B[nl]BL[2983];W[cg]WL[2988];B[gk]BL[2981];W[ns]WL[2987];
+B[kj]BL[2977];W[pc]WL[2987];B[lr]BL[2969];W[re]WL[2986];B[qe]BL[2950];
+W[sc]WL[2985];B[rd]BL[2942];W[ls]WL[2984];B[rf]BL[2925];W[od]WL[2983];
+B[ks]BL[2916];W[ms]WL[2982];B[mr]BL[2910];W[kr]WL[2981];B[kq]BL[2900];
+W[js]WL[2980];B[ir]BL[2894];W[oe]WL[2979];B[kh]BL[2889];W[hg]WL[2978];
+B[ij]BL[2884];W[ge]WL[2977];B[qg]BL[2879];W[jg]WL[2976];B[rh]BL[2874];
+W[is]WL[2975];B[sk]BL[2868];W[rk]WL[2974];B[sj]BL[2863];W[gr]WL[2973];
+B[gq]BL[2857];W[hq]WL[2972];B[hr]BL[2847];W[fr]WL[2970];B[fq]BL[2838];
+W[hs]WL[2969];B[er]BL[2832];W[hp]WL[2968];B[dk]BL[2826];W[ck]WL[2967];
+B[bf]BL[2819];W[hn]WL[2965];B[gi]BL[2809];W[bg]WL[2964];B[lf]BL[2800];
+W[ke]WL[2963];B[rl]BL[2795];W[fh]WL[2962];B[pk]BL[2781];W[om]WL[2960];
+B[nm]BL[2773];W[dj]WL[2958];B[dp]BL[2764];W[ej]WL[2956];B[bm]BL[2757];
+W[bl]WL[2954];B[bo]BL[2753];W[bp]WL[2954];B[an]BL[2748];W[kn]WL[2953];
+B[gs]BL[2743];W[fs]WL[2952];B[rn]BL[2737];W[rp]WL[2951];B[qo]BL[2731];
+W[gs]WL[2949];B[os]BL[2725];W[nr]WL[2947];B[pr]BL[2719];W[lq]WL[2945];
+B[mq]BL[2700];W[lp]WL[2943];B[jp]BL[2683];W[jr]WL[2941];B[iq]BL[2678];
+W[jo]WL[2939];B[es]BL[2673];W[po]WL[2938];B[ro]BL[2666];W[qp]WL[2937];
+B[ok]BL[2663];W[og]WL[2936];B[mh]BL[2660];W[fo]WL[2935];B[gm]BL[2656];
+W[be]WL[2934];B[bd]BL[2650];W[ce]WL[2933];B[ph]BL[2647];W[cf]WL[2932];
+B[ee]BL[2642];W[oh]WL[2931];B[oi]BL[2639];W[ni]WL[2931];B[nh]BL[2637];
+W[ad]WL[2930];B[bb]BL[2630];W[ff]WL[2929];B[ac]BL[2626];W[dm]WL[2928];
+B[em]BL[2623];W[qk]WL[2927];B[ql]BL[2619];W[fb]WL[2926];B[eb]BL[2617];
+W[ea]WL[2925];B[da]BL[2614];W[fa]WL[2923];B[pa]BL[2613];W[ob]WL[2922];
+B[cl]BL[2611];W[dl]WL[2921];B[cl]BL[2609];W[bk]WL[2919];B[fc]BL[2606];
+W[hb]WL[2918];B[ae]BL[2604];W[br]WL[2917];B[cq]BL[2600];W[fd]WL[2916];
+B[ed]BL[2598];W[af]WL[2915];B[pe]BL[2596];W[pf]WL[2914];B[ef]BL[2594];
+W[eg]WL[2913];B[gh]BL[2592];W[gg]WL[2912];B[pg]BL[2588];W[nf]WL[2911];
+B[me]BL[2583];W[df]WL[2909];B[kf]BL[2578];W[jf]WL[2907];B[fe]BL[2573];
+W[gd]WL[2905];B[md]BL[2568];W[mc]WL[2904];B[le]BL[2566];W[kd]WL[2903];
+B[fi]BL[2564];W[ei]WL[2902];B[ek]BL[2557];W[fj]WL[2901];B[gj]BL[2547];
+W[oa]WL[2900];B[qa]BL[2541];W[hh]WL[2898];B[hi]BL[2537];W[qm]WL[2897];
+B[rm]BL[2530];W[fk]WL[2896];B[fl]BL[2519];W[jh]WL[2894];B[ji]BL[2516];
+W[kg]WL[2892];B[lg]BL[2515];W[li]WL[2891];B[mi]BL[2513];W[nj]WL[2890];
+B[mj]BL[2511];W[qi]WL[2888];B[ri]BL[2509];W[pi]WL[2887];B[oj]BL[2508];
+W[qs]WL[2886];B[sp]BL[2505];W[sq]WL[2885];B[rr]BL[2502];W[rs]WL[2884];
+B[sr]BL[2499];W[so]WL[2883];B[sn]BL[2496];W[db]WL[2881];B[ca]BL[2492];
+W[de]WL[2880];B[cb]BL[2488];W[dd]WL[2880];B[dc]BL[2484];W[al]WL[2879];
+B[ne]BL[2481];W[of]WL[2878];B[ih]BL[2478];W[ig]WL[2877];B[ii]BL[2475];
+W[oo]WL[2876];B[mp]BL[2473];W[kl]WL[2875];B[lo]BL[2469];W[no]WL[2874];
+B[or]BL[2465];W[mo]WL[2874];B[ln]BL[2463];W[op]WL[2873];B[kp]BL[2461];
+W[mn]WL[2872];B[lm]BL[2455];W[km]WL[2871];B[im]BL[2454];W[mm]WL[2870];
+B[ml]BL[2453];W[qn]WL[2869];B[ol]BL[2452];W[on]WL[2868];B[ng]BL[2448];
+W[mf]WL[2868];B[mg]BL[2446];W[ad]WL[2867];B[nd]BL[2445];W[oc]WL[2866];
+B[ae]BL[2442];W[am]WL[2866];B[ad]BL[2440]
+TW[ga][ha][ia][ja][ka][la][ma][na][gb][ib][jb][kb][lb][mb][nb][hc][ic][kc][lc][hd][id][jd][he][ie][je][bf][gf][hf][if][ag][dg][fg][ah][bh][ch][dh][eh][ai][bi][ci][di][aj][bj][ak]
+TB[aa][ba][ra][sa][ab][db][rb][sb][bc][cc][rc][sc][qd][sd][re][se][sf][rg][sg][lh][qh][sh][ki][li][ni][pi][qi][si][hj][jj][lj][nj][pj][qj][rj][hk][ik][jk][kk][lk][mk][nk][qk][rk][dl][gl][hl][il][jl][kl][ll][pl][sl][cm][dm][fm][hm][jm][km][mm][om][pm][qm][sm][bn][en][fn][gn][hn][in][jn][kn][mn][on][pn][qn][ao][co][eo][fo][go][ho][io][jo][ko][mo][no][oo][po][so][ap][bp][cp][ep][fp][gp][hp][ip][lp][op][pp][qp][rp][sp][aq][bq][dq][hq][lq][nq][qq][rq][sq][ar][br][dr][fr][gr][jr][kr][nr][qr][as][bs][cs][ds][fs][gs][hs][is][js][ks][ls][ms][ns][ps][qs][rs][ss]
+C[The game is over.  Final score:
+   White = 44 territory + 58 living stones + 0 dame + 6.5 komi = 108.5
+   Black = 139 territory + 120 living stones + 0 dame = 259
+Black wins by 150.5.
+]
+)
diff --git a/regression/games/olympiad2003/gnugo_vs_neurogo.sgf b/regression/games/olympiad2003/gnugo_vs_neurogo.sgf
new file mode 100644 (file)
index 0000000..09fe919
--- /dev/null
@@ -0,0 +1,84 @@
+(;GM[1]FF[3]
+RU[New Zealand]BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[NeuroGo]
+PB[GnuGo]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00]
+RE[B+248.5]
+;B[qd]BL[3000];W[cc]WL[2988];B[ph]BL[3000];W[pc]WL[2972];B[qc]BL[3000]
+;W[qh]WL[2942];B[qg]BL[2998];W[pi]WL[2931];B[nc]BL[2995];W[mc]WL[2919]
+;B[md]BL[2991];W[nd]WL[2904];B[oc]BL[2980];W[od]WL[2892];B[pd]BL[2970]
+;W[nb]WL[2878];B[pb]BL[2967];W[ob]WL[2865];B[pc]BL[2963];W[ld]WL[2853]
+;B[me]BL[2961];W[qf]WL[2833];B[rg]BL[2955];W[ne]WL[2812];B[le]BL[2950]
+;W[ke]WL[2794];B[lc]BL[2942];W[qp]WL[2768];B[op]BL[2935];W[np]WL[2744]
+;B[oq]BL[2930];W[or]WL[2718];B[nq]BL[2924];W[mq]WL[2691];B[mp]BL[2918]
+;W[lp]WL[2667];B[no]BL[2912];W[nn]WL[2639];B[lo]BL[2903];W[dp]WL[2612]
+;B[lq]BL[2888];W[mr]WL[2586];B[pr]BL[2875];W[pg]WL[2560];B[oh]BL[2860]
+;W[rf]WL[2533];B[rh]BL[2848];W[ng]WL[2507];B[og]BL[2832];W[pf]WL[2480]
+;B[qi]BL[2821];W[kp]WL[2450];B[kq]BL[2814];W[jq]WL[2428];B[jp]BL[2809]
+;W[ko]WL[2407];B[jr]BL[2803];W[iq]WL[2381];B[jo]BL[2797];W[kn]WL[2360]
+;B[lr]BL[2791];W[ls]WL[2335];B[kr]BL[2787];W[qr]WL[2311];B[nf]BL[2777]
+;W[nr]WL[2290];B[pq]BL[2764];W[mf]WL[2262];B[oe]BL[2754];W[mo]WL[2238]
+;B[ir]BL[2742];W[kc]WL[2215];B[mn]BL[2731];W[hq]WL[2192];B[qq]BL[2725]
+;W[on]WL[2170];B[lb]BL[2720];W[kd]WL[2147];B[la]BL[2717];W[mb]WL[2125]
+;B[jb]BL[2715];W[kb]WL[2102];B[ho]BL[2713];W[rr]WL[2080];B[rq]BL[2709]
+;W[qj]WL[2058];B[ka]BL[2700];W[ib]WL[2037];B[jc]BL[2697];W[ri]WL[2015]
+;B[qh]BL[2682];W[ic]WL[1994];B[jd]BL[2675];W[je]WL[1974];B[id]BL[2671]
+;W[ia]WL[1953];B[ja]BL[2668];W[hd]WL[1947];B[ie]BL[2665];W[if]WL[1926]
+;B[he]BL[2662];W[ge]WL[1919];B[hf]BL[2657];W[ps]WL[1898];B[gd]BL[2646]
+;W[hr]WL[1867];B[ks]BL[2638];W[is]WL[1848];B[ms]BL[2631];W[fd]WL[1829]
+;B[gc]BL[2621];W[hc]WL[1810];B[fe]BL[2615];W[gf]WL[1791];B[ig]BL[2608]
+;W[gb]WL[1782];B[fc]BL[2600];W[fb]WL[1773];B[ed]BL[2594];W[os]WL[1764]
+;B[eb]BL[2583];W[hs]WL[1754];B[qo]BL[2578];W[ec]WL[1745];B[dc]BL[2569]
+;W[cd]WL[1736];B[pj]BL[2564];W[mm]WL[1727];B[lm]BL[2553];W[ll]WL[1719]
+;B[km]BL[2539];W[jn]WL[1710];B[ml]BL[2527];W[pl]WL[1700];B[gg]BL[2504]
+;W[lk]WL[1691];B[cn]BL[2494];W[nm]WL[1684];B[in]BL[2486];W[jm]WL[1678]
+;B[ck]BL[2478];W[rj]WL[1670];B[kl]BL[2469];W[ln]WL[1663];B[rp]BL[2456]
+;W[mo]WL[1654];B[mk]BL[2448];W[mj]WL[1646];B[lj]BL[2439];W[kk]WL[1639]
+;B[nj]BL[2423];W[mi]WL[1632];B[rl]BL[2406];W[ni]WL[1626];B[qk]BL[2394]
+;W[oi]WL[1616];B[of]BL[2385];W[pk]WL[1608];B[nh]BL[2378];W[cp]WL[1591]
+;B[fo]BL[2375];W[bg]WL[1575];B[li]BL[2371];W[lh]WL[1569];B[mh]BL[2366]
+;W[oj]WL[1564];B[jj]BL[2359];W[ki]WL[1547];B[kj]BL[2356];W[ma]WL[1530]
+;B[ff]BL[2351];W[jk]WL[1507];B[ij]BL[2347];W[rn]WL[1491];B[ro]BL[2343]
+;W[qn]WL[1475];B[sq]BL[2341];W[di]WL[1460];B[np]BL[2338];W[po]WL[1444]
+;B[pp]BL[2336];W[so]WL[1428];B[qs]BL[2335];W[rs]WL[1413];B[sr]BL[2333]
+;W[jf]WL[1398];B[fq]BL[2331];W[eq]WL[1383];B[fr]BL[2330];W[gp]WL[1368]
+;B[fp]BL[2328];W[ip]WL[1354];B[go]BL[2325];W[gl]WL[1339];B[hk]BL[2324]
+;W[io]WL[1325];B[do]BL[2322];W[lg]WL[1311];B[bi]BL[2317];W[hn]WL[1297]
+;B[cs]BL[2314];W[jg]WL[1283];B[er]BL[2308];W[hg]WL[1269];B[hh]BL[2303]
+;W[ih]WL[1256];B[jh]BL[2296];W[ii]WL[1242];B[hi]BL[2285];W[kg]WL[1229]
+;B[ji]BL[2283];W[dr]WL[1216];B[bo]BL[2278];W[bp]WL[1203];B[ds]BL[2276]
+;W[ek]WL[1190];B[im]BL[2272];W[gn]WL[1177];B[il]BL[2270];W[jl]WL[1165]
+;B[fn]BL[2266];W[gm]WL[1153];B[el]BL[2262];W[gk]WL[1141];B[ch]BL[2260]
+;W[cr]WL[1129];B[bs]BL[2256];W[ik]WL[1117];B[hl]BL[2255];W[gj]WL[1105]
+;B[hj]BL[2252];W[df]WL[1094];B[dh]BL[2249];W[eh]WL[1082];B[eg]BL[2245]
+;W[fh]WL[1071];B[dg]BL[2242];W[cb]WL[1059];B[cf]BL[2241];W[bf]WL[1047]
+;B[de]BL[2240];W[ce]WL[1036];B[cg]BL[2239];W[dd]WL[1025];B[ea]BL[2238]
+;W[sn]WL[1014];B[ef]BL[2237];W[ha]WL[1002];B[fa]BL[2237];W[db]WL[991];
+B[ec]BL[2236];W[dl]WL[980];B[em]BL[2232];W[ep]WL[970];B[cl]BL[2231];
+W[dm]WL[959];B[dk]BL[2228];W[dn]WL[949];B[ej]BL[2217];W[co]WL[939];
+B[bn]BL[2210];W[cm]WL[928];B[bm]BL[2204];W[eo]WL[917];B[br]BL[2203];
+W[fk]WL[907];B[en]BL[2201];W[ap]WL[896];B[cq]BL[2201];W[ei]WL[886];
+B[dj]BL[2201];W[gi]WL[876];B[ci]BL[2201];W[lf]WL[866];B[kh]BL[2201];
+W[rd]WL[856];B[re]BL[2200];W[rc]WL[846];B[rb]BL[2200];W[sc]WL[836];
+B[bh]BL[2200];W[ag]WL[827];B[ah]BL[2199];W[qs]WL[818];B[ss]BL[2199];
+W[sf]WL[809];B[be]BL[2199];W[js]WL[799];B[ns]BL[2198];W[bd]WL[790];
+B[af]BL[2198];W[ae]WL[780];B[ad]BL[2198];W[ac]WL[771];B[bb]BL[2198];
+W[ae]WL[762];B[bf]BL[2197];W[ab]WL[753];B[ba]BL[2196];W[sg]WL[745];
+B[sh]BL[2196];W[se]WL[738];B[qe]BL[2195];W[pm]WL[732];B[oo]BL[2195];
+W[pn]WL[726];B[si]BL[2195];W[sk]WL[720];B[sj]BL[2195];W[hp]WL[714];
+B[rk]BL[2195];W[sl]WL[708];B[pj]BL[2194];W[fs]WL[701];B[ok]BL[2193];
+W[gs]WL[695];B[sm]BL[2192];W[dq]WL[690];B[es]BL[2192];W[bq]WL[685];
+B[ao]BL[2192];W[rm]WL[678];B[sl]BL[2192];W[ql]WL[672];B[nl]BL[2192];
+W[fg]WL[667];B[gh]BL[2192];W[ar]WL[664];B[do]BL[2191];W[dm]WL[662];
+B[dn]BL[2190];W[ol]WL[657];B[gq]BL[2190];W[sp]WL[653];B[gr]BL[2190];
+W[fi]WL[650];B[fj]BL[2190];W[aq]WL[648];B[as]BL[2190];W[tt]WL[648];
+B[tt]BL[2190];TW[kl][km][lm][om][qm][mn][jo][lo][jp]
+TB[aa][ca][da][ga][ha][ia][ma][na][oa][pa][qa][ra][sa][ab][cb][db][fb][gb][hb][ib][kb][mb][nb][ob][qb][sb][ac][bc][cc][hc][ic][kc][mc][rc][sc][ad][bd][cd][dd][fd][hd][kd][ld][nd][od][rd][sd][ae][ce][ee][ge][je][ke][ne][pe][se][df][gf][if][jf][kf][lf][mf][pf][qf][rf][sf][ag][bg][fg][hg][jg][kg][lg][mg][ng][pg][sg][eh][fh][ih][lh][ai][di][ei][fi][gi][ii][ki][mi][ni][oi][pi][ri][aj][bj][cj][gj][mj][oj][qj][rj][ak][bk][ek][fk][gk][nk][sk][al][bl][dl][fl][gl][am][cm][dm][fm][gm][hm][an][gn][hn][co][eo][ap][bp][cp][dp][ep][qp][aq][bq][cq][dq][eq][mq][ar][cr][dr][mr][nr][or][qr][rr][ls][os][ps][qs][rs]
+C[The game is over.  Final score:
+   White = 9 territory + 44 living stones + 0 dame + 6.5 komi = 59.5
+   Black = 150 territory + 158 living stones + 0 dame = 308
+Black wins by 248.5.
+]
+)
diff --git a/regression/games/olympiad2003/go_intellect_vs_gnugo.sgf b/regression/games/olympiad2003/go_intellect_vs_gnugo.sgf
new file mode 100644 (file)
index 0000000..f698bba
--- /dev/null
@@ -0,0 +1,67 @@
+(;GM[1]FF[3]
+RU[New Zealand]
+RE[W+R]
+BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[GnuGo]
+PB[Go Inellect]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00];B[pc]BL[2990];W[qp]WL[3000];B[dq]BL[2989];
+W[pl]WL[3000];B[dc]BL[2988];W[do]WL[3000];B[co]BL[2987];W[dp]WL[2999];
+B[cp]BL[2985];W[eq]WL[2998];B[dr]BL[2976];W[dn]WL[2997];B[jc]BL[2974];
+W[er]WL[2997];B[oq]BL[2971];W[mq]WL[2994];B[qq]BL[2967];W[rq]WL[2991];
+B[pp]BL[2956];W[qo]WL[2986];B[on]BL[2952];W[pe]WL[2982];B[qn]BL[2948];
+W[qc]WL[2975];B[pd]BL[2938];W[qd]WL[2970];B[po]BL[2934];W[qr]WL[2964];
+B[pq]BL[2923];W[ce]WL[2957];B[rp]BL[2900];W[ed]WL[2953];B[dd]BL[2894];
+W[de]WL[2950];B[lp]BL[2890];W[ro]WL[2947];B[rr]BL[2874];W[cn]WL[2944];
+B[sq]BL[2864];W[cq]WL[2934];B[bq]BL[2854];W[ci]WL[2932];B[ds]BL[2846];
+W[ec]WL[2930];B[eb]BL[2838];W[fb]WL[2926];B[cb]BL[2831];W[cd]WL[2919];
+B[fc]BL[2819];W[gb]WL[2913];B[fd]BL[2809];W[ee]WL[2906];B[hd]BL[2802];
+W[cc]WL[2899];B[db]BL[2794];W[gc]WL[2893];B[gd]BL[2784];W[ib]WL[2885];
+B[jb]BL[2777];W[bb]WL[2878];B[ip]BL[2773];W[lq]WL[2873];B[kp]BL[2770];
+W[jr]WL[2870];B[pj]BL[2766];W[nl]WL[2867];B[gp]BL[2762];W[ne]WL[2863];
+B[mc]BL[2756];W[od]WL[2858];B[pb]BL[2751];W[qb]WL[2854];B[oc]BL[2747];
+W[mp]WL[2850];B[hr]BL[2739];W[mo]WL[2847];B[mn]BL[2735];W[fo]WL[2843];
+B[nr]BL[2731];W[lo]WL[2840];B[kq]BL[2726];W[kr]WL[2835];B[jn]BL[2720];
+W[bo]WL[2833];B[bp]BL[2706];W[ao]WL[2831];B[es]BL[2701];W[md]WL[2829];
+B[pg]BL[2693];W[lc]WL[2816];B[nc]BL[2678];W[lb]WL[2807];B[kd]BL[2669];
+W[qm]WL[2801];B[ld]BL[2660];W[oa]WL[2790];B[nd]BL[2648];W[me]WL[2783];
+B[pa]BL[2638];W[oe]WL[2775];B[qa]BL[2622];W[mb]WL[2769];B[rb]BL[2608];
+W[nb]WL[2761];B[rc]BL[2597];W[rd]WL[2757];B[nj]BL[2591];W[ll]WL[2752];
+B[mm]BL[2585];W[ml]WL[2747];B[qk]BL[2582];W[rn]WL[2741];B[qf]BL[2576];
+W[lj]WL[2737];B[qe]BL[2571];W[ra]WL[2733];B[kg]BL[2566];W[re]WL[2730];
+B[pn]BL[2563];W[rl]WL[2727];B[ol]BL[2558];W[ok]WL[2723];B[om]BL[2554];
+W[pk]WL[2718];B[oj]BL[2550];W[qj]WL[2715];B[qh]BL[2544];W[rj]WL[2710];
+B[nk]BL[2539];W[ik]WL[2708];B[ng]BL[2530];W[hn]WL[2702];B[fq]BL[2526];
+W[gh]WL[2696];B[jj]BL[2523];W[jk]WL[2690];B[gj]BL[2518];W[hi]WL[2685];
+B[hj]BL[2515];W[ij]WL[2682];B[ii]BL[2510];W[gl]WL[2677];B[ji]BL[2501];
+W[rg]WL[2673];B[gi]BL[2492];W[hh]WL[2668];B[hk]BL[2487];W[fi]WL[2658];
+B[fj]BL[2475];W[hl]WL[2632];B[il]BL[2466];W[kh]WL[2603];B[li]BL[2457];
+W[ki]WL[2589];B[kk]BL[2443];W[jl]WL[2572];B[im]BL[2428];W[kl]WL[2558];
+B[kj]BL[2417];W[lh]WL[2545];B[ln]BL[2405];W[mi]WL[2516];B[jh]BL[2399];
+W[lg]WL[2499];B[lk]BL[2386];W[mk]WL[2482];B[jf]BL[2368];W[ei]WL[2454];
+B[rh]BL[2349];W[ko]WL[2435];B[mj]BL[2337];W[ih]WL[2388];B[jg]BL[2325];
+W[ej]WL[2366];B[rf]BL[2318];W[lf]WL[2344];B[jo]BL[2313];W[pi]WL[2334];
+B[oi]BL[2274];W[oh]WL[2323];B[hm]BL[2268];W[gf]WL[2307];B[gm]BL[2261];
+W[fl]WL[2301];B[kf]BL[2256];W[li]WL[2297];B[ap]BL[2251];W[bn]WL[2295];
+B[og]BL[2246];W[sg]WL[2294];B[qg]BL[2243];W[sf]WL[2293];B[hc]BL[2238];
+W[hb]WL[2291];B[ep]BL[2235];W[id]WL[2287];B[ic]BL[2231];W[fa]WL[2285];
+B[ie]BL[2226];W[le]WL[2282];B[hf]BL[2222];W[ig]WL[2280];B[ff]BL[2214];
+W[ge]WL[2273];B[eo]BL[2209];W[fp]WL[2265];B[en]BL[2199];W[em]WL[2261];
+B[fe]BL[2191];W[fg]WL[2259];B[fn]BL[2188];W[fm]WL[2258];B[go]BL[2182];
+W[pm]WL[2258];B[ef]BL[2178];W[se]WL[2257];B[dg]BL[2173];W[bg]WL[2256];
+B[cf]BL[2165];W[cl]WL[2256];B[cg]BL[2155];W[be]WL[2256];B[bf]BL[2152];
+W[bh]WL[2254];B[eh]BL[2147];W[eg]WL[2253];B[hg]BL[2137];W[gg]WL[2251];
+B[df]BL[2126];W[af]WL[2250];B[bc]BL[2117];W[ca]WL[2246];B[ke]BL[2110];
+W[jd]WL[2245];B[sa]BL[2102];W[ob]WL[2244];B[kb]BL[2086];W[dh]WL[2243];
+B[so]BL[2080];W[sn]WL[2242];B[sp]BL[2077];W[nm]WL[2241];B[nn]BL[2075];
+W[km]WL[2240];B[kn]BL[2072];W[ni]WL[2240];B[sh]BL[2068];W[ra]WL[2239];
+B[ch]BL[2063];W[fh]WL[2238];B[bi]BL[2058];W[bj]WL[2236];B[cj]BL[2054];
+W[di]WL[2233];B[bk]BL[2051];W[ai]WL[2228];B[ad]BL[2042];W[ea]WL[2227];
+B[ae]BL[2039];W[da]WL[2227];B[ag]BL[2034];W[ab]WL[2227];B[af]BL[2030];
+W[if]WL[2226];B[he]BL[2026];W[ah]WL[2226];B[bl]BL[2019];W[ck]WL[2225];
+B[sl]BL[2015];W[sk]WL[2225];B[br]BL[2012];W[jm]WL[2225];B[lm]BL[2007];
+W[tt]WL[2225];B[je]BL[2004];W[la]WL[2225];B[nh]BL[2002];W[ph]WL[2225];
+B[jq]BL[2000];W[tt]WL[2225];B[qa]BL[1999];W[pa]WL[2224];B[mf]BL[1998];
+W[nf]WL[2224];B[mg]BL[1997];W[qi]WL[2223];B[nq]BL[1996];W[tt]WL[2223]
+)
diff --git a/regression/games/olympiad2003/golois_vs_gnugo.sgf b/regression/games/olympiad2003/golois_vs_gnugo.sgf
new file mode 100644 (file)
index 0000000..de8ceae
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[3]
+RU[New Zealand]BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[GnuGo]
+PB[GoLois]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00]
+RE[W+187.5]
+;B[cc]BL[2998];W[pp]WL[3000];B[qn]BL[2997];W[qc]WL[3000];B[cp]BL[2997]
+;W[eq]WL[3000];B[pd]BL[2996];W[do]WL[2999];B[jc]BL[2995];W[co]WL[2997]
+;B[cj]BL[2994];W[pc]WL[2995];B[qi]BL[2993];W[od]WL[2994];B[qk]BL[2992]
+;W[dd]WL[2994];B[qf]BL[2990];W[cd]WL[2991];B[jq]BL[2988];W[eb]WL[2989]
+;B[mc]BL[2984];W[pe]WL[2986];B[cm]BL[2981];W[np]WL[2984];B[gq]BL[2977]
+;W[fo]WL[2983];B[qg]BL[2974];W[bp]WL[2980];B[nd]BL[2971];W[om]WL[2977]
+;B[gc]BL[2968];W[ro]WL[2974];B[ob]BL[2965];W[ne]WL[2968];B[cq]BL[2961]
+;W[qd]WL[2962];B[fr]BL[2959];W[dr]WL[2957];B[fb]BL[2956];W[fc]WL[2951]
+;B[ic]BL[2951];W[fd]WL[2947];B[kc]BL[2948];W[ch]WL[2943];B[bi]BL[2946]
+;W[pb]WL[2940];B[cl]BL[2943];W[nb]WL[2936];B[gb]BL[2941];W[cb]WL[2933]
+;B[bc]BL[2938];W[bf]WL[2930];B[me]BL[2936];W[rn]WL[2925];B[nf]BL[2935]
+;W[qm]WL[2921];B[oe]BL[2933];W[nc]WL[2917];B[iq]BL[2932];W[ok]WL[2912]
+;B[pk]BL[2931];W[oj]WL[2909];B[pj]BL[2930];W[mi]WL[2905];B[fp]BL[2929]
+;W[bq]WL[2900];B[go]BL[2927];W[fn]WL[2897];B[em]BL[2925];W[kn]WL[2895]
+;B[jo]BL[2923];W[lq]WL[2893];B[fm]BL[2921];W[gn]WL[2887];B[gm]BL[2919]
+;W[hn]WL[2881];B[jn]BL[2917];W[hm]WL[2876];B[hl]BL[2915];W[eh]WL[2871]
+;B[di]BL[2912];W[dh]WL[2865];B[ei]BL[2910];W[il]WL[2858];B[hk]BL[2906]
+;W[km]WL[2852];B[ik]BL[2903];W[gh]WL[2846];B[hi]BL[2901];W[pf]WL[2841]
+;B[hh]BL[2898];W[kk]WL[2836];B[jm]BL[2894];W[jl]WL[2828];B[im]BL[2891]
+;W[ge]WL[2822];B[gg]BL[2888];W[fg]WL[2816];B[hg]BL[2885];W[ka]WL[2813]
+;B[kr]BL[2881];W[pg]WL[2807];B[lr]BL[2876];W[ph]WL[2801];B[mq]BL[2870]
+;W[qh]WL[2797];B[rh]BL[2864];W[nq]WL[2792];B[mr]BL[2855];W[nr]WL[2787]
+;B[ms]BL[2847];W[ns]WL[2783];B[re]BL[2843];W[ld]WL[2779];B[oi]BL[2835]
+;W[pi]WL[2773];B[ni]BL[2827];W[nh]WL[2765];B[nj]BL[2820];W[mh]WL[2759]
+;B[nk]BL[2813];W[ol]WL[2754];B[lg]BL[2806];W[md]WL[2749];B[ag]BL[2798]
+;W[le]WL[2743];B[dc]BL[2786];W[db]WL[2731];B[lf]BL[2777];W[lc]WL[2726]
+;B[lb]BL[2769];W[kb]WL[2723];B[ke]BL[2761];W[mb]WL[2720];B[gf]BL[2755]
+;W[rj]WL[2716];B[he]BL[2748];W[ri]WL[2709];B[bb]BL[2743];W[ec]WL[2698]
+;B[bd]BL[2736];W[af]WL[2689];B[ff]BL[2727];W[be]WL[2670];B[rd]BL[2720]
+;W[rc]WL[2667];B[sc]BL[2713];W[ef]WL[2663];B[ah]BL[2704];W[ki]WL[2660]
+;B[ne]BL[2697];W[ho]WL[2658];B[oh]BL[2689];W[og]WL[2654];B[nl]BL[2681]
+;W[qj]WL[2650];B[ng]BL[2674];W[nm]WL[2647];B[ml]BL[2667];W[mj]WL[2644]
+;B[ll]BL[2659];W[kl]WL[2642];B[mm]BL[2652];W[mn]WL[2640];B[kh]BL[2646]
+;W[fi]WL[2638];B[fj]BL[2640];W[ji]WL[2637];B[bn]BL[2633];W[ep]WL[2635]
+;B[cr]BL[2627];W[br]WL[2626];B[jb]BL[2620];W[fe]WL[2624];B[cs]BL[2616]
+;W[er]WL[2622];B[ea]BL[2611];W[fq]WL[2621];B[gp]BL[2607];W[gr]WL[2619]
+;B[bs]BL[2603];W[bo]WL[2617];B[hq]BL[2597];W[hr]WL[2615];B[rb]BL[2591]
+;W[lp]WL[2612];B[rg]BL[2587];W[sf]WL[2610];B[jh]BL[2585];W[jj]WL[2608]
+;B[ir]BL[2582];W[js]WL[2607];B[qa]BL[2579];W[qb]WL[2606];B[ra]BL[2576]
+;W[sh]WL[2604];B[sg]BL[2572];W[sb]WL[2603];B[pa]BL[2569];W[gi]WL[2600]
+;B[gj]BL[2565];W[fh]WL[2599];B[ko]BL[2561];W[mp]WL[2598];B[lo]BL[2557]
+;W[kp]WL[2597];B[ja]BL[2554];W[la]WL[2594];B[gd]BL[2551];W[kd]WL[2592]
+;B[jd]BL[2547];W[mg]WL[2590];B[mf]BL[2542];W[lh]WL[2588];B[kf]BL[2537]
+;W[bg]WL[2587];B[ii]BL[2533];W[bh]WL[2586];B[ai]BL[2528];W[ci]WL[2585]
+;B[bj]BL[2521];W[da]WL[2584];B[fa]BL[2514];W[an]WL[2583];B[am]BL[2508]
+;W[ao]WL[2583];B[ar]BL[2503];W[cn]WL[2582];B[en]BL[2497];W[eo]WL[2581]
+;B[bm]BL[2491];W[dn]WL[2580];B[dm]BL[2486];W[ij]WL[2580];B[dj]BL[2480]
+;W[hj]WL[2579];B[mo]BL[2477];W[ln]WL[2576];B[no]BL[2475];W[jp]WL[2574]
+;B[ip]BL[2473];W[io]WL[2573];B[oo]BL[2470];W[is]WL[2572];B[jr]BL[2467]
+;W[hs]WL[2571];B[pn]BL[2466];W[pm]WL[2569];B[op]BL[2464];W[oq]WL[2566]
+;B[on]BL[2461];W[fs]WL[2565];B[pq]BL[2459];W[pr]WL[2563];B[qq]BL[2457]
+;W[qr]WL[2556];B[rq]BL[2455];W[rr]WL[2553];B[sq]BL[2452];W[qo]WL[2552]
+;B[sd]BL[2451];W[oa]WL[2550];B[si]BL[2450];W[sa]WL[2537];B[of]BL[2449]
+;W[jk]WL[2528];B[tt]BL[2449];W[tt]WL[2522];
+TW[aa][ba][ca][ma][na][pa][qa][ra][ab][bb][lb][ob][rb][ac][bc][cc][dc][mc][oc][sc][ad][bd][ed][pd][rd][sd][ae][ce][de][ee][qe][re][se][cf][df][qf][rf][cg][dg][eg][qg][rg][sg][oh][rh][sh][li][ni][oi][qi][si][kj][lj][nj][pj][sj][lk][mk][nk][pk][qk][rk][sk][ll][ml][nl][pl][ql][rl][sl][im][jm][lm][mm][rm][sm][in][jn][nn][on][pn][qn][sn][go][jo][ko][lo][mo][no][oo][po][so][ap][cp][dp][fp][gp][hp][ip][op][qp][rp][sp][aq][cq][dq][gq][hq][iq][jq][kq][mq][pq][qq][rq][sq][ar][cr][fr][ir][jr][kr][lr][mr][or][sr][as][bs][cs][ds][es][gs][ks][ls][ms][os][ps][qs][rs][ss]
+TB[ga][ha][ia][hb][ib][hc][hd][id][ie][je][hf][if][jf][ig][jg][kg][ih][aj][ej][ak][bk][ck][dk][ek][fk][gk][al][bl][dl][el][fl][gl]
+C[The game is over.  Final score:
+   White = 140 territory + 131 living stones + 0 dame + 6.5 komi = 277.5
+   Black = 32 territory + 58 living stones + 0 dame = 90
+White wins by 187.5.
+]
+)
diff --git a/regression/games/olympiad2003/smartgo_vs_gnugo.sgf b/regression/games/olympiad2003/smartgo_vs_gnugo.sgf
new file mode 100644 (file)
index 0000000..c511d54
--- /dev/null
@@ -0,0 +1,68 @@
+(;GM[1]FF[3]
+RU[New Zealand]
+RE[W+51.5]
+BR[]WR[]SZ[19]HA[0]KM[6.5]
+PW[GnuGo]
+PB[Smart go]
+GN[White (W) vs. Black (B)]
+DT[2003-11-23]
+SY[Cgoban 1.9.14]TM[50:00];B[pd]BL[2973];W[dp]WL[3000];B[dd]BL[2968];
+W[qp]WL[3000];B[cn]BL[2957];W[fq]WL[2999];B[ck]BL[2942];W[pl]WL[2999];
+B[ed]BL[2921];W[jp]WL[2999];B[id]BL[2910];W[cc]WL[2999];B[db]BL[2879];
+W[cd]WL[2996];B[ch]BL[2848];W[nc]WL[2993];B[pb]BL[2825];W[op]WL[2993];
+B[ii]BL[2804];W[ne]WL[2992];B[pf]BL[2781];W[kd]WL[2991];B[kc]BL[2750];
+W[lc]WL[2988];B[jc]BL[2719];W[qh]WL[2987];B[hp]BL[2687];W[hq]WL[2985];
+B[ph]BL[2663];W[pi]WL[2983];B[ng]BL[2631];W[cf]WL[2976];B[qi]BL[2602];
+W[qj]WL[2968];B[ri]BL[2571];W[qg]WL[2962];B[dg]BL[2561];W[oi]WL[2952];
+B[lg]BL[2529];W[je]WL[2924];B[rj]BL[2497];W[qk]WL[2910];B[ni]BL[2465];
+W[cb]WL[2906];B[if]BL[2433];W[le]WL[2900];B[qf]BL[2401];W[kb]WL[2892];
+B[oj]BL[2369];W[oh]WL[2881];B[mp]BL[2336];W[pg]WL[2868];B[jb]BL[2305];
+W[lb]WL[2854];B[iq]BL[2273];W[ip]WL[2846];B[jn]BL[2262];W[ho]WL[2840];
+B[gp]BL[2239];W[hr]WL[2832];B[fp]BL[2229];W[hm]WL[2826];B[nk]BL[2200];
+W[eo]WL[2821];B[nm]BL[2180];W[co]WL[2810];B[fr]BL[2148];W[eq]WL[2796];
+B[bo]BL[2115];W[bp]WL[2792];B[sf]BL[2084];W[rh]WL[2786];B[em]BL[2066];
+W[rg]WL[2776];B[bn]BL[2057];W[hk]WL[2773];B[gi]BL[2034];W[kg]WL[2769];
+B[kf]BL[2003];W[jf]WL[2761];B[ap]BL[1988];W[aq]WL[2751];B[ao]BL[1956];
+W[kh]WL[2747];B[li]BL[1925];W[on]WL[2741];B[cq]BL[1912];W[er]WL[2736];
+B[lo]BL[1902];W[nq]WL[2733];B[cp]BL[1870];W[of]WL[2730];B[do]BL[1850];
+W[ep]WL[2720];B[jl]BL[1819];W[ij]WL[2715];B[ig]BL[1787];W[jj]WL[2706];
+B[kk]BL[1755];W[df]WL[2704];B[ef]BL[1723];W[de]WL[2699];B[ee]BL[1692];
+W[ji]WL[2695];B[dr]BL[1682];W[lq]WL[2691];B[lp]BL[1671];W[mq]WL[2687];
+B[rf]BL[1640];W[fk]WL[2683];B[ej]BL[1631];W[bg]WL[2678];B[nh]BL[1598];
+W[rk]WL[2672];B[bh]BL[1566];W[hi]WL[2667];B[es]BL[1536];W[gh]WL[2659];
+B[gg]BL[1525];W[gj]WL[2647];B[og]BL[1495];W[si]WL[2637];B[om]BL[1464];
+W[pm]WL[2632];B[lf]BL[1438];W[jg]WL[2623];B[jd]BL[1407];W[ke]WL[2618];
+B[pj]BL[1377];W[sj]WL[2608];B[ca]BL[1348];W[ob]WL[2602];B[oc]BL[1320];
+W[od]WL[2595];B[nf]BL[1292];W[pa]WL[2586];B[pc]BL[1263];W[qb]WL[2580];
+B[rb]BL[1254];W[qc]WL[2567];B[oe]BL[1244];W[nd]WL[2559];B[qd]BL[1216];
+W[rc]WL[2549];B[rd]BL[1189];W[sc]WL[2542];B[sd]BL[1161];W[qa]WL[2538];
+B[ra]BL[1134];W[nb]WL[2534];B[bb]BL[1108];W[be]WL[2525];B[ih]BL[1082];
+W[ie]WL[2513];B[he]BL[1056];W[dc]WL[2506];B[eb]BL[1030];W[ec]WL[2502];
+B[fc]BL[1020];W[fi]WL[2495];B[im]BL[1008];W[ja]WL[2491];B[ib]BL[983];
+W[ia]WL[2488];B[hb]BL[966];W[nn]WL[2484];B[mn]BL[950];W[en]WL[2481];
+B[dn]BL[926];W[bc]WL[2476];B[ba]BL[904];W[fg]WL[2473];B[gf]BL[892];
+W[ei]WL[2469];B[di]BL[874];W[ek]WL[2465];B[dk]BL[861];W[fm]WL[2463];
+B[dl]BL[849];W[dq]WL[2462];B[cr]BL[825];W[el]WL[2460];B[dm]BL[812];
+W[kp]WL[2458];B[gq]BL[795];W[gr]WL[2456];B[hn]BL[777];W[gn]WL[2455];
+B[fs]BL[754];W[in]WL[2453];B[ir]BL[737];W[fo]WL[2450];B[gs]BL[721];
+W[go]WL[2447];B[hs]BL[704];W[il]WL[2444];B[kr]BL[685];W[lr]WL[2441];
+B[jm]BL[664];W[ks]WL[2439];B[ha]BL[643];W[ka]WL[2437];B[eh]BL[623];
+W[eg]WL[2435];B[js]BL[602];W[fb]WL[2434];B[gb]BL[588];W[fd]WL[2433];
+B[fa]BL[573];W[ff]WL[2432];B[gd]BL[553];W[fe]WL[2432];B[ol]BL[544];
+W[ls]WL[2431];B[kj]BL[533];W[jq]WL[2431];B[no]BL[523];W[oo]WL[2430];
+B[sg]BL[516];W[jr]WL[2430];B[lh]BL[506];W[is]WL[2430];B[ds]BL[500];
+W[np]WL[2429];B[cg]BL[485];W[ah]WL[2428];B[ai]BL[479];W[ag]WL[2428];
+B[me]BL[460];W[md]WL[2427];B[mf]BL[443];W[fj]WL[2427];B[dj]BL[432];
+W[jo]WL[2427];B[ko]BL[417];W[ge]WL[2427];B[mo]BL[405];W[jk]WL[2427];
+B[ac]BL[392];W[kn]WL[2427];B[lm]BL[384];W[ad]WL[2427];B[bj]BL[374];
+W[hh]WL[2427];B[hf]BL[367];W[ab]WL[2427];B[pk]BL[360];W[ki]WL[2427];
+B[da]BL[341];W[ac]WL[2427];B[aa]BL[328];W[fh]WL[2427];B[dh]BL[321];
+W[sh]WL[2427];B[hg]BL[316];W[jh]WL[2427];B[hd]BL[312];W[tt]WL[2427]
+TW[la][ma][na][oa][ra][sa][mb][rb][sb][mc][bd][dd][ed][ld][ae][ce][ee][af][bf][ef][ph][gi][qi][ri][hj][rj][gk][ik][sk][fl][gl][hl][ql][rl][sl][gm][qm][rm][sm][fn][hn][pn][qn][rn][sn][io][po][qo][ro][so][fp][gp][hp][pp][rp][sp][gq][iq][kq][oq][pq][qq][rq][sq][ir][kr][mr][nr][or][pr][qr][rr][sr][js][ms][ns][os][ps][qs][rs][ss]
+TB[ea][ga][fb][gc][hc][ic][pe][qe][re][se][of][mg][mh][bi][ci][mi][aj][cj][lj][mj][nj][ak][bk][lk][mk][ok][al][bl][cl][kl][ll][ml][nl][am][bm][cm][km][mm][an][kn][ln][co][bp][aq][bq][ar][br][as][bs][cs]
+C[The game is over.  Final score:
+   White = 81 territory + 122 living stones + 0 dame + 6.5 komi = 209.5
+   Black = 50 territory + 108 living stones + 0 dame = 158
+White wins by 51.5.
+]
+)
diff --git a/regression/games/olympiad2004/19x19/gnu-ind.sgf b/regression/games/olympiad2004/19x19/gnu-ind.sgf
new file mode 100644 (file)
index 0000000..562428b
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[Indigo]PB[GNU Go]DT[2004-07-06]GN[Indigo (W) vs. GNU Go (B)]
+RE[W+Resign]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089145585 level 12
+Indigo used 47:29 minutes
+GNU Go used 12:23 minutes]
+;B[qd];W[cp];B[pp];W[dc];B[ph];W[oc];B[ld];W[jp];B[de];W[fd];B[cc]
+;W[cb];B[cd];W[qn];B[bb];W[eq];B[cj];W[qb];B[ql];W[lb];B[pn];W[oe]
+;B[qo];W[nq];B[pf];W[pr];B[cm];W[jd];B[ff];W[pm];B[qm];W[rn];B[om]
+;W[on];B[pl];W[lf];B[gq];W[db];B[go];W[kc];B[he];W[ro];B[rp];W[hd]
+;B[jr];W[lp];B[jn];W[hp];B[gp];W[lr];B[iq];W[hq];B[ip];W[io];B[ho]
+;W[rr];B[jo];W[hr];B[gr];W[jq];B[ir];W[cr];B[em];W[ge];B[gh];W[gf]
+;B[gg];W[rm];B[jg];W[rl];B[rk];W[lh];B[ji];W[og];B[pg];W[lj];B[jk]
+;W[of];B[pj];W[jf];B[oo];W[nn];B[no];W[hf];B[bo];W[bp];B[mn];W[nm]
+;B[mp];W[mq];B[cn];W[lo];B[nl];W[mm];B[ln];W[ll];B[lm];W[ml];B[nk]
+;W[mo];B[kl];W[lk];B[ko];W[np];B[nh];W[oh];B[oi];W[ig];B[kg];W[ih]
+;B[lg];W[jh];B[kh];W[ki];B[mh];W[li];B[mf];W[jj];B[ii];W[ij];B[hi]
+;W[kf];B[mg];W[il];B[jl];W[ik];B[md];W[me];B[ne];W[im];B[in];W[jm]
+;B[km];W[gk];B[le];W[ek];B[hj];W[eh];B[eg];W[ch];B[mb];W[dg];B[ob]
+;W[gl];B[df];W[fi];B[di];W[dh];B[bg];W[ck];B[bk];W[nc];B[dk];W[mc]
+;B[rc];W[eo];B[pb];W[lc];B[od];W[dl];B[dj];W[el];B[dm];W[nd];B[pd]
+;W[cl];B[bl];W[bh];B[fn];W[bf];B[bi];W[ah];B[fh];W[ei];B[ba];W[ej]
+;B[gj];W[qq];B[ee];W[fe];B[hk];W[gm];B[cf];W[be];B[cg];W[qp];B[po]
+;W[bd];B[nb];W[bc];B[ap];W[pc];B[qc];W[rb];B[ar];W[ag];B[er];W[pe]
+;B[sb];W[re];B[qe];W[qf];B[sc];W[qg];B[qh];W[bq];B[aq];W[rh];B[sk]
+;W[qi];B[pi];W[dq];B[do];W[ie];B[ri];W[kp];B[hm];W[hl];B[kr];W[hn]
+;B[io];W[gn];B[kk];W[fo];B[fm];W[ai];B[aj];W[bs];B[fl];W[fk];B[ls]
+;W[br];B[ds];W[al];B[bj];W[co];B[bm];W[kj];B[kn];W[ms];B[ks];W[ke]
+;B[sl];W[sh];B[si];W[pq];B[sm];W[rg];B[sp];W[op];B[pm];W[mi];B[se]
+;W[sf];B[sd];W[ni];B[ma];W[rq];B[so];W[nj];B[oj];W[mk];B[la];W[kb]
+;B[ka];W[jb];B[ja];W[fb];B[ib];W[kq];B[ic];W[kd];B[nf];W[me];B[ng]
+;W[sq];B[sn];W[ha];B[hb];W[ga];B[ia];W[gb];B[hc];W[gc];B[id];W[jc]
+;B[ci];W[];B[]C[The lower left corner is unsettled. The jury decided
+that white won the game.])
diff --git a/regression/games/olympiad2004/19x19/gnu-int.sgf b/regression/games/olympiad2004/19x19/gnu-int.sgf
new file mode 100644 (file)
index 0000000..ab8a267
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[Go Intellect]PB[GNU Go]DT[2004-07-04]
+GN[Go Intellect (W) vs. GNU Go (B)]
+RE[W+23.5]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088951122 level 12
+Go Intellect used 55:08 minutes
+GNU Go used 12:51 minutes]
+;B[pd];W[cd];B[pp];W[dq];B[pj];W[ec];B[co];W[do];B[dn];W[dp];B[dm]
+;W[jq];B[gn];W[nq];B[dj];W[kc];B[pn];W[nc];B[qf];W[cg];B[oc];W[md]
+;B[or];W[mp];B[eg];W[qq];B[oq];W[qo];B[po];W[qp];B[qn];W[rn];B[rm]
+;W[pr];B[gf];W[gp];B[ls];W[nr];B[ns];W[pg];B[qg];W[ob];B[pb];W[od]
+;B[pc];W[nb];B[if];W[ro];B[ql];W[dh];B[ph];W[pf];B[oe];W[nd];B[og]
+;W[hd];B[gd];W[he];B[gc];W[ge];B[fd];W[hf];B[hc];W[fe];B[gg];W[ef]
+;B[ci];W[ei];B[bq];W[jd];B[mg];W[hg];B[mm];W[ed];B[lq];W[kr];B[lp]
+;W[lo];B[ko];W[mn];B[lr];W[lm];B[no];W[jm];B[mo];W[ln];B[ml];W[jo]
+;B[kq];W[jp];B[kp];W[nn];B[on];W[go];B[kh];W[nm];B[ll];W[nl];B[kl]
+;W[kn];B[ik];W[fn];B[hn];W[il];B[mk];W[jk];B[hl];W[jl];B[ij];W[ih]
+;B[nk];W[fm];B[gm];W[fl];B[gl];W[jj];B[ej];W[fj];B[jr];W[ir];B[cr]
+;W[cp];B[bo];W[js];B[er];W[np];B[oo];W[ps];B[os];W[ic];B[bh];W[bg]
+;B[ag];W[dr];B[ae];W[bd];B[fi];W[ek];B[gj];W[fk];B[gi];W[eh];B[ds]
+;W[ck];B[dk];W[dl];B[cl];W[bl];B[el];W[cm];B[dl];W[fr];B[eq];W[ep]
+;B[fq];W[bn];B[cn];W[gq];B[ad];W[bp];B[ap];W[cs];B[bs];W[fp];B[es]
+;W[bf];B[af];W[bj];B[gr];W[hr];B[fs];W[bi];B[ch];W[ji];B[hh];W[fh]
+;B[am];W[cj];B[di];W[pa];B[qa];W[oa];B[qb];W[pl];B[hi];W[ok];B[oj]
+;W[ai];B[ak];W[be];B[ah];W[lj];B[bc];W[pk];B[qk];W[sm];B[sl];W[sn]
+;B[db];W[eb];B[cb];W[lf];B[jg];W[mj];B[lg];W[nj];B[kf];W[mf];B[ea]
+;W[fa];B[da];W[fb];B[nf];W[ke];B[pm];W[ol];B[je];W[le];B[ie];W[nh]
+;B[mh];W[oi];B[pi];W[ng];B[li];W[ig];B[ni];W[id];B[mi];W[kj];B[jf]
+;W[hs];B[gs];W[ne];B[of];W[pq];B[op];W[dc];B[ks];W[jr];B[jh];W[ii]
+;B[cc];W[gk];B[en];W[hk];B[eo];W[fo];B[cq];W[ki];B[om];W[em];B[]
+;W[rr];B[];W[in];B[];W[rj];B[];W[qj];B[rk];W[qh];B[];W[rh];B[rg]
+;W[qi];B[oh];W[si];B[sk];W[sg];B[];W[qe];B[pe];W[];B[])
diff --git a/regression/games/olympiad2004/19x19/gnu-jim.sgf b/regression/games/olympiad2004/19x19/gnu-jim.sgf
new file mode 100644 (file)
index 0000000..7f19972
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[Jimmy]PB[GNU Go]DT[2004-07-06]GN[Jimmy (W) vs. GNU Go (B)]
+RE[B+94.5]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089138688 level 12]
+;B[pd];W[pp];B[dd];W[cp];B[qn];W[ql];B[nq];W[jc];B[qq];W[qp];B[oo]
+;W[pq];B[ep];W[dm];B[cq];W[bq];B[dq];W[jq];B[br];W[gq];B[qj];W[qf]
+;B[nc];W[qh];B[ck];W[rd];B[qc];W[fc];B[cf];W[lc];B[rc];W[bp];B[qr]
+;W[or];B[rq];W[rp];B[nr];W[rn];B[pr];W[oq];B[os];W[pn];B[ec];W[fd]
+;B[oj];W[mn];B[ee];W[np];B[mp];W[po];B[lq];W[oh];B[mj];W[no];B[gf]
+;W[mh];B[ek];W[fm];B[re];W[rf];B[qd];W[le];B[gk];W[jo];B[gp];W[ln]
+;B[fq];W[hm];B[ni];W[nh];B[kj];W[fr];B[gr];W[hq];B[hr];W[he];B[ir]
+;W[jr];B[kr];W[ks];B[ls];W[rj];B[iq];W[hp];B[ip];W[ho];B[jp];W[qm]
+;B[rk];W[qk];B[ri];W[rl];B[sj];W[pj];B[pi];W[qi];B[pk];W[nl];B[ji]
+;W[hf];B[ol];W[io];B[nk];W[gg];B[ml];W[nm];B[fh];W[do];B[km];W[kn]
+;B[bm];W[il];B[eb];W[ij];B[ha];W[fg];B[ff];W[ig];B[kg];W[mf];B[jf]
+;W[ii];B[eg];W[id];B[hh];W[jm];B[ih];W[hg];B[gh];W[nd];B[nb];W[rh]
+;B[fb];W[oe];B[gc];W[gd];B[hk];W[mb];B[mc];W[la];B[ik];W[oc];B[ob]
+;W[od];B[kl];W[pb];B[pc];W[qb];B[md];W[ld];B[rb];W[cn];B[ch];W[ar]
+;B[bs];W[go];B[bn];W[bo];B[fp];W[cm];B[cl];W[om];B[pe];W[pf];B[me]
+;W[lg];B[kh];W[nf];B[lo];W[gb];B[hc];W[li];B[ib];W[jb];B[pl];W[lj]
+;B[lk];W[ra];B[sf];W[pm];B[sh];W[mr];B[eo];W[em];B[jl];W[lr];B[js]
+;W[cb];B[jg];W[ph];B[hd];W[je];B[ge];W[bc];B[be];W[ie];B[ic];W[ga]
+;B[ki];W[kf];B[mi];W[lh];B[hl];W[hb];B[fa];W[gl];B[im];W[in];B[fl]
+;W[gm];B[el];W[il];B[ko];W[ns];B[ms];W[mo];B[qe];W[sq];B[sr];W[sp]
+;B[en];W[rs];B[rr];W[dl];B[dk];W[na];B[pa];W[ne];B[qa];W[oi];B[pj]
+;W[ps];B[ns];W[fn];B[lm];W[sb];B[sd];W[sl];B[dp];W[sk];B[rj];W[an]
+;B[al];W[bg];B[cg];W[ja];B[ia];W[rg];B[sg];W[fo];B[im];W[jn];B[il]
+;W[mm];B[am];W[ao];B[oa];W[aq];B[ma];W[lb];B[na];W[sa];B[sc];W[as]
+;B[cr];W[dn];B[if];W[er];B[ds];W[eq];B[es];W[fs];B[gs];W[];B[])
diff --git a/regression/games/olympiad2004/19x19/gnu-mfg.sgf b/regression/games/olympiad2004/19x19/gnu-mfg.sgf
new file mode 100644 (file)
index 0000000..7bfa33d
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[The Many Faces of Go]PB[GNU Go]DT[2004-07-05]
+GN[The Many Faces of Go (W) vs. GNU Go (B)]
+RE[W+3.5]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089064755 level 12
+The Many Faces of Go used 5:14 minutes
+GNU Go used 5:20 minutes]
+;B[qd];W[dc];B[pq];W[dq];B[ph];W[oc];B[kc];W[mc];B[co];W[cm];B[eo]
+;W[fp];B[dm];W[dl];B[em];W[cn];B[do];W[cj];B[ce];W[gc];B[qo];W[me]
+;B[jq];W[hq];B[mq];W[ch];B[ee];W[cd];B[pf];W[ic];B[ff];W[qb];B[dd]
+;W[ec];B[ke];W[ie];B[hn];W[bd];B[ql];W[lf];B[mi];W[fh];B[jf];W[jh]
+;B[bg];W[if];B[jj];W[el];B[jo];W[df];B[hk];W[fm];B[fn];W[dn];B[en]
+;W[ij];B[ik];W[rc];B[bn];W[bm];B[hj];W[sf];B[rf];W[fl];B[se];W[cf]
+;B[bo];W[cq];B[jd];W[gn];B[go];W[gm];B[fo];W[ir];B[id];W[hd];B[am]
+;W[hh];B[al];W[bk];B[lj];W[kr];B[ar];W[gp];B[ho];W[ns];B[or];W[ip]
+;B[kq];W[jr];B[nr];W[kk];B[ji];W[kh];B[hm];W[io];B[jn];W[ak];B[fj]
+;W[br];B[ii];W[aq];B[ih];W[ig];B[jg];W[kg];B[ms];W[in];B[im];W[jp]
+;B[kp];W[ko];B[lr];W[kj];B[ki];W[kl];B[jm];W[lm];B[rd];W[lo];B[lk]
+;W[on];B[mh];W[no];B[ol];W[nf];B[kn];W[ln];B[nl];W[mp];B[mn];W[mm]
+;B[nm];W[nn];B[od];W[lc];B[nd];W[nc];B[pc];W[pb];B[qc];W[ra];B[sc]
+;W[kb];B[rb];W[il];B[gi];W[gf];B[gh];W[hl];B[jl];W[gg];B[gl];W[ej]
+;B[fk];W[ei];B[ek];W[dk];B[bp];W[bq];B[ng];W[of];B[og];W[bl];B[lg]
+;W[kf];B[an];W[oe];B[pe];W[lh];B[mg];W[md];B[hp];W[iq];B[lq];W[ks]
+;B[mf];W[ne];B[pd];W[ep];B[le];W[je];B[ls];W[fi];B[sb];W[qa];B[sa]
+;W[oa];B[ap];W[hg];B[hi];W[li];B[dp];W[jc];B[cp];W[];B[])
diff --git a/regression/games/olympiad2004/19x19/ind-gnu.sgf b/regression/games/olympiad2004/19x19/ind-gnu.sgf
new file mode 100644 (file)
index 0000000..653936b
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go]PB[Indigo]DT[2004-07-07]GN[GNU Go (W) vs. Indigo (B)]
+RE[W+39.5]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089224859 level 12
+GNU Go used 11:57 minutes
+Indigo used 36:37 minutes]
+;B[cd];W[pp];B[qd];W[cp];B[oc];W[dl];B[jp];W[ec];B[hd];W[de];B[qj]
+;W[ce];B[cb];W[db];B[qn];W[eq];B[gc];W[ci];B[np];W[oo];B[om];W[hq]
+;B[jr];W[hf];B[nn];W[oq];B[rp];W[op];B[no];W[nq];B[qq];W[jf];B[mq]
+;W[lf];B[mr];W[nf];B[be];W[bf];B[fb];W[dc];B[cc];W[bd];B[dd];W[ed]
+;B[fe];W[hn];B[ee];W[bc];B[hp];W[gp];B[bb];W[ab];B[fg];W[fi];B[ad]
+;W[ae];B[jd];W[mc];B[kc];W[nh];B[md];W[mb];B[ld];W[nj];B[ip];W[jm]
+;B[go];W[ho];B[nd];W[ml];B[qh];W[gg];B[fn];W[hr];B[cn];W[fh];B[bl]
+;W[gm];B[do];W[fo];B[bo];W[bp];B[ck];W[dk];B[fm];W[gl];B[gn];W[fp]
+;B[fl];W[en];B[dm];W[em];B[eo];W[fk];B[ln];W[bj];B[ll];W[kk];B[mk]
+;W[lk];B[mj];W[mi];B[kl];W[jl];B[nk];W[lj];B[oj];W[nl];B[ok];W[lm]
+;B[cl];W[bm];B[pg];W[ni];B[ol];W[eg];B[cj];W[bn];B[dj];W[cm];B[dn]
+;W[co];B[el];W[ek];B[kn];W[km];B[ie];W[if];B[di];W[bi];B[dg];W[df]
+;B[cg];W[bg];B[ef];W[ff];B[ch];W[ao];B[bh];W[ah];B[oe];W[ge];B[fd]
+;W[ir];B[fc];W[da];B[ke];W[kf];B[qb];W[js];B[kr];W[mn];B[dr];W[mo]
+;B[dq];W[er];B[dp];W[gk];B[cq];W[br];B[bq];W[aq];B[mp];W[lo];B[jn]
+;W[in];B[ko];W[lp];B[kp];W[lq];B[lr];W[kq];B[jq];W[mm];B[mg];W[ng]
+;B[mf];W[me];B[le];W[ne];B[of];W[as];B[li];W[oi];B[lh];W[ki];B[kh]
+;W[jh];B[ea];W[ca];B[eb];W[ba];B[pr];W[pi];B[qi];W[ks];B[he];W[ls]
+;B[ms];W[is];B[oh];W[pj];B[pk];W[io];B[nm];W[mh];B[ph];W[lg];B[je]
+;W[gf];B[gd];W[og];B[iq];W[jo];B[];W[])
diff --git a/regression/games/olympiad2004/19x19/int-gnu.sgf b/regression/games/olympiad2004/19x19/int-gnu.sgf
new file mode 100644 (file)
index 0000000..a230229
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go]PB[Go Intellect]DT[2004-07-04]
+GN[GNU Go (W) vs. Go Intellect (B)]
+RE[B+34.5]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088946928 level 12
+GNU Go used 8:22 minutes
+Go Intellect used 49:22 minutes]
+;B[cd];W[pp];B[cp];W[ep];B[eq];W[fq];B[dp];W[eo];B[qd];W[gp];B[er]
+;W[ed];B[jc];W[cc];B[dc];W[dd];B[db];W[ce];B[bd];W[od];B[bc];W[qc]
+;B[pd];W[pc];B[rc];W[rb];B[re];W[fr];B[oc];W[ob];B[nc];W[nb];B[mc]
+;W[sc];B[rd];W[oe];B[sb];W[sa];B[pb];W[qb];B[qk];W[jp];B[gd];W[me]
+;B[ld];W[pn];B[ec];W[ok];B[ph];W[oq];B[ff];W[cg];B[df];W[nh];B[eh]
+;W[ci];B[oh];W[cl];B[dj];W[ng];B[cj];W[bj];B[bk];W[bi];B[ck];W[kf]
+;B[dl];W[ni];B[qq];W[qp];B[pr];W[or];B[pl];W[ol];B[pm];W[om];B[hi]
+;W[il];B[ki];W[lj];B[kg];W[je];B[lg];W[fl];B[mf];W[nf];B[le];W[rn]
+;B[cf];W[es];B[dr];W[qf];B[rg];W[rf];B[qg];W[sg];B[pf];W[ds];B[qe]
+;W[cr];B[bq];W[dq];B[bn];W[pj];B[qj];W[rl];B[rk];W[mb];B[dn];W[ja]
+;B[lb];W[la];B[pa];W[sb];B[ma];W[qa];B[lf];W[ka];B[id];W[ib];B[bg]
+;W[hc];B[hd];W[fb];B[os];W[ns];B[ps];W[rq];B[nr];W[qr];B[hk];W[lq]
+;B[hl];W[fm];B[hm];W[im];B[gn];W[en];B[ho];W[in];B[gm];W[ik];B[ij]
+;W[kj];B[io];W[jo];B[ic];W[gc];B[kb];W[jb];B[hb];W[na];B[fc];W[gb]
+;B[qm];W[jj];B[ji];W[fj];B[rm];W[fh];B[di];W[gk];B[qn];W[qo];B[gh]
+;W[gi];B[gg];W[hj];B[gj];W[fi];B[hj];W[so];B[br];W[sm];B[ek];W[fk]
+;B[nd];W[hp];B[ip];W[iq];B[ne];W[of];B[pi];W[pk];B[ql];W[sl];B[sk]
+;W[sn];B[mh];W[mi];B[bs];W[pe];B[sf];W[mg];B[lh];W[hn];B[go];W[do]
+;B[co];W[dm];B[cm];W[em];B[cn];W[el];B[bl];W[fg];B[eg];W[sd];B[ms]
+;W[oo];B[ea];W[ha];B[cq];W[cs];B[fa];W[ej];B[dk];W[oi];B[pq];W[nq]
+;B[rr];W[sr];B[rs];W[eb];B[da];W[ga];B[rp];W[sq];B[ch];W[og];B[pg]
+;W[fo];B[li];W[oa];B[se];W[ei];B[mr];W[mq];B[lr];W[kr];B[jr];W[gl]
+;B[kq];W[kp];B[jq];W[ir];B[ks];W[is];B[fe];W[js];B[kr];W[fn];B[qs]
+;W[sp];B[ss];W[ro];B[bb];W[];B[ke];W[];B[])
diff --git a/regression/games/olympiad2004/19x19/jim-gnu.sgf b/regression/games/olympiad2004/19x19/jim-gnu.sgf
new file mode 100644 (file)
index 0000000..9168b9f
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go]PB[Jimmy]DT[2004-07-06]GN[GNU Go (W) vs. Jimmy (B)]
+RE[W+Resign]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089137272 level 12]
+;B[pd];W[dc];B[pp];W[co];B[ci];W[nq];B[lq];W[qn];B[de];W[ee];B[oo]
+;W[qq];B[qp];W[pq];B[df];W[pf];B[nd];W[qd];B[qj];W[qc];B[qe];W[pe]
+;B[re];W[rg];B[ed];W[ec];B[fd];W[fc];B[ql];W[pm];B[gc];W[gb];B[hc]
+;W[ff];B[rq];W[hb];B[ic];W[rr];B[rp];W[dq];B[rn];W[jq];B[rm];W[gq]
+;B[lo];W[no];B[ok];W[op];B[on];W[od];B[nn];W[nc];B[mo];W[dd];B[ge]
+;W[gg];B[cl];W[cd];B[kc];W[nf];B[md];W[jo];B[mc];W[nb];B[oi];W[mb]
+;B[np];W[nr];B[oe];W[mg];B[nl];W[cm];B[bm];W[bn];B[dm];W[cn];B[dl]
+;W[bf];B[oq];W[or];B[cg];W[bg];B[eo];W[bh];B[ch];W[gi];B[oc];W[qf]
+;B[ob];W[jh];B[qb];W[rb];B[pc];W[qa];B[pb];W[sc];B[al];W[oa];B[na]
+;W[ma];B[lb];W[pa];B[od];W[bk];B[bl];W[bi];B[ck];W[bj];B[lr];W[sr]
+;B[jr];W[ra];B[iq];W[le];B[jp];W[io];B[hp];W[il];B[kl];W[jl];B[kk]
+;W[gn];B[fl];W[gp];B[hk];W[ho];B[eq];W[er];B[ep];W[fr];B[dp];W[cq]
+;B[cp];W[bp];B[ij];W[ii];B[je];W[ri];B[hf];W[km];B[of];W[og];B[ib]
+;W[mi];B[lm];W[jj];B[jk];W[ik];B[hl];W[hj];B[eh];W[im];B[ej];W[gk]
+;B[gl];W[kn];B[ln];W[fe];B[gd];W[ip];B[ld];W[kp];B[kj];W[lp];B[ir]
+;W[ki];B[rj];W[kq];B[mq];W[mp];B[kr];W[lj];B[ll];W[hq];B[op];W[nj]
+;B[mr];W[oj];B[fo];W[qi];B[hr];W[ms];B[pj];W[pi];B[nh];W[ng];B[hg]
+;W[kf];B[hh];W[fh];B[ls];W[ke];B[kd];W[fk];B[jf];W[ek];B[eg];W[gh]
+;B[fi];W[fn];B[dn];W[dk];B[el];W[dj];B[di];W[cj];B[ao];W[an];B[ko]
+;W[jp];B[ns];W[ps];B[qr];W[pr];B[rs];W[qs];B[os];W[ss];B[gr];W[gs]
+;B[hs];W[js];B[fs];W[fq];B[ms];W[is];B[jg];W[kg];B[si];W[sh];B[sj]
+;W[mk])
diff --git a/regression/games/olympiad2004/19x19/mfg-gnu.sgf b/regression/games/olympiad2004/19x19/mfg-gnu.sgf
new file mode 100644 (file)
index 0000000..9d34949
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go]PB[The Many Faces of Go]DT[2004-07-05]
+GN[GNU Go (W) vs. The Many Faces of Go (B)]
+RE[B+50.5]
+TM[60:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089065608 level 12
+GNU Go used 7:46 minutes
+The Many Faces of Go used 7:19 minutes]
+;B[qd];W[dd];B[pq];W[dp];B[oc];W[po];B[pl];W[no];B[mq];W[lo];B[qh]
+;W[kq];B[qo];W[qn];B[qp];W[hq];B[fq];W[fp];B[dn];W[eq];B[cl];W[pm]
+;B[ql];W[rn];B[ro];W[hc];B[ci];W[kc];B[fc];W[fd];B[gc];W[ec];B[cf]
+;W[gd];B[on];W[om];B[nk];W[sk];B[ml];W[nn];B[mc];W[le];B[je];W[lg]
+;B[bd];W[if];B[cc];W[of];B[eb];W[hb];B[rm];W[sm];B[rk];W[sl];B[fa]
+;W[co];B[cn];W[fn];B[kd];W[ld];B[jc];W[jb];B[kb];W[ic];B[lc];W[ef]
+;B[jf];W[jg];B[ig];W[kf];B[fh];W[jh];B[gf];W[dg];B[ie];W[ia];B[ga]
+;W[he];B[hf];W[ha];B[gb];W[id];B[dh];W[oh];B[mi];W[kl];B[qf];W[gl]
+;B[mg];W[nh];B[mh];W[hi];B[jj];W[mf];B[ik];W[ng];B[pg];W[ii];B[hk]
+;W[kj];B[kn];W[ji];B[im];W[gj];B[gk];W[fk];B[lm];W[km];B[ln];W[kk]
+;B[jn];W[fi];B[eh];W[gh];B[hm];W[bo];B[hl];W[al];B[cg];W[ff];B[ip]
+;W[jd];B[iq];W[fr];B[kc];W[ke];B[bm];W[ir];B[jr];W[hr];B[kr];W[mp]
+;B[mr];W[gm];B[rj];W[dc];B[db];W[ni];B[mj];W[nd];B[kp];W[md];B[nc]
+;W[pe];B[qe];W[el];B[ao];W[am];B[bk];W[dj];B[bn];W[an];B[ak];W[ap]
+;B[ol];W[em];B[lj];W[lh];B[li];W[ki];B[de];W[ee];B[cd];W[ed];B[dk]
+;W[cj];B[bj];W[ek];B[ei];W[ck];B[dl];W[ej];B[pp];W[df];B[pj];W[ho]
+;B[hp];W[gp];B[ko];W[ce];B[be];W[pd];B[pc];W[pi];B[mn];W[qi];B[ri]
+;W[oj];B[np];W[qj];B[oo];W[pk];B[od];W[oe];B[hn];W[io];B[eo];W[en]
+;B[go];W[gn];B[do];W[fo];B[cp];W[cq];B[ep];W[dq];B[fg];W[gg];B[jo]
+;W[jk];B[ij];W[js];B[in];W[ks];B[lr];W[go];B[ka];W[ja];B[de];W[ls]
+;B[ms];W[is];B[ce];W[di];B[bl];W[ao];B[ok];W[dm];B[bh];W[qk];B[rl]
+;W[hj];B[lk];W[ph];B[jl];W[jm];B[il];W[pf];B[ll];W[og];B[qg];W[nj]
+;B[cm];W[eg];B[ch];W[];B[])
diff --git a/regression/games/olympiad2004/9x9/ata-gnu.sgf b/regression/games/olympiad2004/9x9/ata-gnu.sgf
new file mode 100644 (file)
index 0000000..7a6ca06
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[Atarist]DT[2004-07-04]GN[GNU Go (W) vs. Atarist (B)]
+RE[W+13.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088960621 level 12]
+;B[de];W[ef];B[fe];W[cc];B[cd];W[bd];B[ff];W[eg];B[be];W[bg];B[bc]
+;W[gc];B[ee];W[bb];B[ad];W[he];B[fg];W[fh];B[db];W[gh];B[dg];W[dh]
+;B[df];W[eh];B[ge];W[hf];B[cg];W[ch];B[gd];W[hc];B[hd];W[id];B[gg]
+;W[hg];B[fb];W[gb];B[cb];W[fc];B[eb];W[ec];B[dc];W[bf];B[ga];W[ha]
+;B[fa];W[cf];B[af];W[ag];B[bh];W[ae];B[ba];W[ed];B[bi];W[ah];B[ce]
+;W[ci];B[af];W[ai];B[bh];W[ae];B[ib];W[ic];B[af];W[bi];B[ae];W[dd]
+;B[fd];W[gf];B[hb];W[ia];B[hb];W[ib];B[ie];W[if];B[aa];W[];B[])
diff --git a/regression/games/olympiad2004/9x9/dbg-gnu.sgf b/regression/games/olympiad2004/9x9/dbg-gnu.sgf
new file mode 100644 (file)
index 0000000..b6aead9
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[DumbGo]DT[2004-07-07]GN[GNU Go (W) vs. DumbGo (B)]
+RE[W+35.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089236098 level 15]
+;B[ee];W[cg];B[eg];W[ec];B[fd];W[cd];B[fc];W[gg];B[fb];W[eh];B[dh]
+;W[hg];B[fh];W[he];B[ef];W[gh];B[fi];W[eb];B[ed];W[dc];B[bc];W[bd]
+;B[ch];W[bb];B[cb];W[cc];B[ac];W[bh];B[ba];W[da];B[ab];W[ca];B[ad]
+;W[be];B[bf];W[cf];B[ae];W[ah];B[af];W[bg];B[dd];W[db];B[ce];W[de]
+;B[ea];W[fa];B[ga];W[hc];B[bb];W[ag];B[ea];W[ce];B[ci];W[ei];B[hb]
+;W[ib];B[ge];W[gc];B[gf];W[fg];B[di];W[hf];B[ff];W[gb];B[eh];W[fa]
+;B[hd];W[id];B[gd];W[ic];B[ie];W[ha];B[bi];W[aa];B[gi];W[hi];B[hh]
+;W[ih];B[ai];W[df];B[dg];W[];B[ad];W[ac];B[bc];W[bb];B[ae];W[];B[af]
+;W[];B[if];W[];B[])
diff --git a/regression/games/olympiad2004/9x9/gnu-ata.sgf b/regression/games/olympiad2004/9x9/gnu-ata.sgf
new file mode 100644 (file)
index 0000000..ffc341c
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[Atarist]PB[GNU Go]DT[2004-07-04]GN[Atarist (W) vs. GNU Go (B)]
+RE[B+14.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088957863 level 12]
+;B[gc];W[fd];B[cg];W[ee];B[fc];W[df];B[dg];W[gd];B[ec];W[dd];B[cb]
+;W[eg];B[eh];W[cf];B[fg];W[ef];B[bd];W[fh];B[gh];W[dc];B[db];W[be]
+;B[cd];W[dh];B[fi];W[ch];B[hf];W[ed];B[hd];W[cc];B[bc];W[ge];B[he]
+;W[gf];B[ce];W[bg];B[ae];W[gg];B[hg];W[af];B[bf];W[ff];B[fh];W[be]
+;B[ad];W[bb];B[bf];W[ag];B[ab];W[hh];B[ih];W[hi];B[ig];W[di];B[ii]
+;W[hb];B[gi];W[gb];B[hc];W[fb];B[eb];W[ib];B[fa];W[ea];B[be];W[ba]
+;B[ca];W[de];B[aa];W[ga];B[ei];W[hh];B[hi];W[bb];B[ba];W[ic];B[]
+;W[ha];B[];W[da];B[];W[bi];B[];W[ah];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-dbg.sgf b/regression/games/olympiad2004/9x9/gnu-dbg.sgf
new file mode 100644 (file)
index 0000000..913a8a0
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[DumbGo]PB[GNU Go]DT[2004-07-04]GN[DumbGo (W) vs. GNU Go (B)]
+RE[W+37.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088963146 level 13]
+;B[fe];W[cg];B[eg];W[ff];B[ef];W[ee];B[ge];W[de];B[fg];W[gf];B[fd]
+;W[gg];B[gh];W[hh];B[fh];W[he];B[hi];W[hg];B[hd];W[if];B[ih];W[fc]
+;B[gd];W[ed];B[hc];W[hb];B[gb];W[gc];B[ib];W[ha];B[fb];W[ec];B[ga]
+;W[id];B[dh];W[ic];B[ei];W[ch];B[gi];W[cf];B[ci];W[bh];B[bi];W[ce]
+;B[ah];W[bc];B[ag];W[bd];B[bf];W[be];B[bg];W[dg];B[ii];W[bb];B[ig]
+;W[fe];B[df];W[gd];B[di];W[hc];B[ae];W[cb];B[af];W[ac];B[ai];W[ad]
+;B[];W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-ind.sgf b/regression/games/olympiad2004/9x9/gnu-ind.sgf
new file mode 100644 (file)
index 0000000..9635bc8
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[Indigo]PB[GNU Go]DT[2004-07-05]GN[Indigo (W) vs. GNU Go (B)]
+RE[B+6.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089060732 level 13
+Indigo used 20:23 minutes
+GNU Go used 1:56 minutes]
+;B[gc];W[cf];B[ee];W[fg];B[eg];W[cc];B[eh];W[ge];B[ff];W[gf];B[gg]
+;W[fd];B[fc];W[ed];B[db];W[hg];B[gh];W[hh];B[bg];W[de];B[cb];W[ch]
+;B[cg];W[bf];B[bh];W[fe];B[ef];W[bb];B[hi];W[eb];B[ec];W[dc];B[fb]
+;W[hd];B[hc];W[bd];B[id];W[ie];B[ic];W[df];B[ba];W[da];B[ea];W[dg]
+;B[dh];W[ag];B[ah];W[ab];B[af];W[ae];B[gd];W[he];B[ag];W[ci];B[di]
+;W[aa];B[ca];W[ih];B[gi];W[ai];B[bi];W[ii];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-int-playoff.sgf b/regression/games/olympiad2004/9x9/gnu-int-playoff.sgf
new file mode 100644 (file)
index 0000000..609c731
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[Go Intellect]PB[GNU Go]DT[2004-07-07]
+GN[Go Intellect (W) vs. GNU Go (B)]
+RE[W+3.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089240264 level 15]
+;B[ee];W[fg];B[eg];W[dc];B[ff];W[gc];B[gg];W[cd];B[cf];W[be];B[bf]
+;W[fd];B[ge];W[hd];B[he];W[ie];B[if];W[id];B[gf];W[af];B[ag];W[ae]
+;B[bg];W[ed];B[ce];W[bd];B[gd];W[hc];B[de];W[dd];B[fe];W[hh];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-int.sgf b/regression/games/olympiad2004/9x9/gnu-int.sgf
new file mode 100644 (file)
index 0000000..7f7cc59
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[Go Intellect]PB[GNU Go]DT[2004-07-05]
+GN[Go Intellect (W) vs. GNU Go (B)]
+RE[W+3.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089058989 level 12
+Go Intellect used 20:32 minutes
+GNU Go used 1:20 minutes]
+;B[fd];W[dg];B[de];W[gg];B[ge];W[cc];B[ec];W[ce];B[db];W[dd];B[bb]
+;W[gc];B[bc];W[bd];B[df];W[cf];B[ff];W[fg];B[eg];W[eh];B[ef];W[ed]
+;B[fc];W[dh];B[hf];W[hc];B[gb];W[hb];B[fa];W[cb];B[hd];W[eb];B[ca]
+;W[hg];B[dc];W[cd];B[ig];W[ih];B[if];W[hh];B[ac];W[gf];B[fe];W[id]
+;B[he];W[ad];B[ee];W[ic];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-kin.sgf b/regression/games/olympiad2004/9x9/gnu-kin.sgf
new file mode 100644 (file)
index 0000000..c1c0c91
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GoKing]PB[GNU Go]DT[2004-07-04]GN[GoKing (W) vs. GNU Go (B)]
+RE[B+10.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088955562 level 12]
+;B[gd];W[ed];B[gg];W[ff];B[fg];W[gf];B[ef];W[hf];B[fe];W[hh];B[hg]
+;W[hd];B[hc];W[ce];B[cg];W[fc];B[bf];W[be];B[ae];W[ad];B[af];W[gc]
+;B[he];W[ee];B[ge];W[hb];B[id];W[cc];B[bd];W[bc];B[ac];W[cd];B[ad]
+;W[df];B[eg];W[dg];B[dh];W[cf];B[bg];W[ib];B[bb];W[cb];B[ic];W[ba]
+;B[ab];W[fd];B[aa];W[ca];B[];W[ha];B[];W[gb];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-mag.sgf b/regression/games/olympiad2004/9x9/gnu-mag.sgf
new file mode 100644 (file)
index 0000000..4002699
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[Magog]PB[GNU Go]DT[2004-07-04]GN[Magog (W) vs. GNU Go (B)]
+RE[W+19.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088974951 level 12
+Magog used 13:18 minutes
+GNU Go used 0:43 minutes]
+;B[gc];W[dc];B[gf];W[cf];B[eg];W[gg];B[hg];W[ff];B[ge];W[fg];B[gh]
+;W[fh];B[eb];W[hh];B[db];W[cc];B[ih];W[gi];B[cb];W[hf];B[bc];W[bd]
+;B[bb];W[ig];B[ad];W[be];B[he];W[ed];B[ie];W[ae];B[ac];W[fc];B[fb]
+;W[ef];B[ec];W[fd];B[gd];W[dd];B[fe];W[ee];B[if];W[hg];B[];W[dg];B[]
+;W[])
diff --git a/regression/games/olympiad2004/9x9/gnu-mfg.sgf b/regression/games/olympiad2004/9x9/gnu-mfg.sgf
new file mode 100644 (file)
index 0000000..f1f25f4
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[The Many Faces of Go]PB[GNU Go]DT[2004-07-05]
+GN[The Many Faces of Go (W) vs. GNU Go (B)]
+RE[B+28.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089055838 level 12
+The Many Faces of Go used 0:53 minutes
+GNU Go used 0:39 minutes]
+;B[gd];W[ed];B[dd];W[de];B[gg];W[eg];B[cd];W[cf];B[db];W[ec];B[fh]
+;W[be];B[bc];W[ca];B[dh];W[da];B[eb];W[bg];B[fb];W[ch];B[fe];W[ee]
+;B[dg];W[ff];B[gf];W[eh];B[ei];W[fc];B[gc];W[he];B[df];W[ce];B[ef]
+;W[dc];B[cb];W[ad];B[bd];W[fd];B[ge];W[ci];B[ac];W[di];B[fg];W[ae]
+;B[cg];W[ah];B[cc];W[];B[])
diff --git a/regression/games/olympiad2004/9x9/gnu-neu.sgf b/regression/games/olympiad2004/9x9/gnu-neu.sgf
new file mode 100644 (file)
index 0000000..8625652
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[NeuroGo]PB[GNU Go]DT[2004-07-04]GN[NeuroGo (W) vs. GNU Go (B)]
+RE[B+38.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088983006 level 12
+NeuroGo used 29:38 minutes
+GNU Go used 2:08 minutes]
+;B[fe];W[dc];B[de];W[fc];B[gf];W[cf];B[df];W[cg];B[ce];W[gd];B[dg]
+;W[bd];B[be];W[dh];B[ag];W[fh];B[hh];W[cd];B[he];W[gh];B[gg];W[hi]
+;B[ig];W[bh];B[ah];W[ih];B[ii];W[bf];B[af];W[ad];B[ae];W[ih];B[hg]
+;W[eg];B[ef];W[hd];B[ed];W[fg];B[ff];W[bi];B[ec];W[eb];B[db];W[cb]
+;B[fb];W[ea];B[gc];W[fd];B[gb];W[dd];B[ee];W[gi];B[bg];W[ch];B[fa]
+;W[da];B[hc];W[id];B[ie];W[ai];B[ii];W[ic];B[ib];W[ih];B[di];W[]
+;B[ei];W[ci];B[eh];W[];B[])
diff --git a/regression/games/olympiad2004/9x9/ind-gnu.sgf b/regression/games/olympiad2004/9x9/ind-gnu.sgf
new file mode 100644 (file)
index 0000000..72925a2
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[Indigo]DT[2004-07-05]GN[GNU Go (W) vs. Indigo (B)]
+RE[W+3.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089062161 level 13
+GNU Go used 4:07 minutes
+Indigo used 17:05 minutes]
+;B[cc];W[ee];B[gf];W[gd];B[df];W[ec];B[ef];W[cd];B[bd];W[ce];B[cf]
+;W[be];B[fe];W[bc];B[bb];W[ad];B[fd];W[fc];B[ed];W[ge];B[he];W[hd]
+;B[de];W[bf];B[hb];W[gb];B[hg];W[cg];B[dg];W[ch];B[dc];W[dd];B[eb]
+;W[db];B[cb];W[ie];B[fb];W[hf];B[gc];W[gg];B[gh];W[ff];B[fg];W[gf]
+;B[dh];W[hh];B[fh];W[di];B[ei];W[ci];B[hc];W[hi];B[ab];W[gi];B[eh]
+;W[ac];B[ic];W[id];B[fi];W[ig];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/int-gnu-playoff.sgf b/regression/games/olympiad2004/9x9/int-gnu-playoff.sgf
new file mode 100644 (file)
index 0000000..366d9ec
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[Go Intellect]DT[2004-07-07]
+GN[GNU Go (W) vs. Go Intellect (B)]
+RE[B+14.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089238929 level 15]
+;B[gd];W[dg];B[dc];W[gf];B[fg];W[gg];B[cf];W[ef];B[gh];W[ge];B[ed]
+;W[hh];B[cg];W[hd];B[dh];W[gb];B[gc];W[eh];B[eg];W[fh];B[hc];W[df]
+;B[bh];W[de];B[cd];W[he];B[ei];W[gi];B[fe];W[ff];B[ce];W[ic];B[ib]
+;W[id];B[hb];W[ee];B[fd];W[fi];B[di];W[dd];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/int-gnu.sgf b/regression/games/olympiad2004/9x9/int-gnu.sgf
new file mode 100644 (file)
index 0000000..004779f
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[Go Intellect]DT[2004-07-05]
+GN[GNU Go (W) vs. Go Intellect (B)]
+RE[B+2.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089057512 level 12
+GNU Go used 0:43 minutes
+Go Intellect used 22:32 minutes]
+;B[gd];W[dc];B[cf];W[gg];B[cd];W[cc];B[bc];W[bb];B[fg];W[fh];B[ff]
+;W[gb];B[eh];W[hh];B[he];W[gi];B[bd];W[ei];B[gf];W[hf];B[dh];W[di]
+;B[fc];W[fb];B[if];W[hg];B[ci];W[fi];B[ab];W[dd];B[ec];W[eb];B[cb]
+;W[db];B[ba];W[hc];B[ib];W[hb];B[bh];W[ig];B[ie];W[ic];B[de];W[ed]
+;B[gc];W[ee];B[ef];W[da];B[hd];W[ca];B[bb];W[fe];B[ge];W[id];B[fd]
+;W[];B[])
diff --git a/regression/games/olympiad2004/9x9/kin-gnu.sgf b/regression/games/olympiad2004/9x9/kin-gnu.sgf
new file mode 100644 (file)
index 0000000..974ddd2
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[GoKing]DT[2004-07-04]GN[GNU Go (W) vs. GoKing (B)]
+RE[W+55.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088980772 level 12
+GNU Go used 1:21 minutes
+GoKing used 4:51 minutes]
+;B[ec];W[ee];B[cd];W[ce];B[gd];W[dd];B[dc];W[cc];B[be];W[bd];B[bf]
+;W[bh];B[cf];W[df];B[cg];W[ch];B[dg];W[eg];B[dh];W[eh];B[ci];W[ae]
+;B[bi];W[ag];B[af];W[ad];B[di];W[ai];B[gf];W[ei];B[ah];W[cb];B[bg]
+;W[fa];B[db];W[da];B[fc];W[hg];B[gg];W[gh];B[hf];W[hh];B[hc];W[gb]
+;B[ic];W[fe];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/mag-gnu.sgf b/regression/games/olympiad2004/9x9/mag-gnu.sgf
new file mode 100644 (file)
index 0000000..d82e304
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[Magog]DT[2004-07-04]GN[GNU Go (W) vs. Magog (B)]
+RE[W+87.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088975994 level 12
+GNU Go used 2:05 minutes
+Magog used 23:39 minutes]
+;B[gd];W[ec];B[ee];W[eg];B[dc];W[db];B[dd];W[cb];B[cf];W[hg];B[bc]
+;W[gb];B[fc];W[fb];B[ed];W[ch];B[eb];W[ea];B[ec];W[hc];B[hd];W[ha]
+;B[fg];W[ff];B[gg];W[gf];B[hh];W[hf];B[eh];W[dh];B[ef];W[dg];B[fh]
+;W[ih];B[hi];W[bg];B[bf];W[bb];B[cc];W[ab];B[gc];W[ic];B[id];W[ag]
+;B[cg];W[ei];B[fi];W[di];B[df];W[bh];B[ib];W[hb];B[ig];W[if];B[fa]
+;W[da];B[ae];W[ac];B[ad];W[fe];B[de];W[gh];B[gi];W[ig];B[ie];W[af]
+;B[bi];W[ii];B[ge];W[be];B[cd];W[bd];B[ci];W[ai];B[ad];W[ae];B[ce]
+;W[gh];B[fg];W[fh];B[ba];W[];B[])
diff --git a/regression/games/olympiad2004/9x9/mfg-gnu.sgf b/regression/games/olympiad2004/9x9/mfg-gnu.sgf
new file mode 100644 (file)
index 0000000..6ddd0b7
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[The Many Faces of Go]DT[2004-07-05]
+GN[GNU Go (W) vs. The Many Faces of Go (B)]
+RE[B+2.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1089055543 level 12
+GNU Go used 0:50 minutes
+The Many Faces of Go used 1:13 minutes]
+;B[ee];W[df];B[eh];W[ef];B[cg];W[ff];B[cd];W[gd];B[gg];W[fc];B[ec]
+;W[gf];B[hg];W[cf];B[eb];W[bg];B[ch];W[be];B[bd];W[fb];B[id];W[ea]
+;B[da];W[fa];B[bb];W[ed];B[cb];W[dd];B[ib];W[bh];B[dc];W[de];B[bi]
+;W[hf];B[if];W[hc];B[ic];W[hb];B[ae];W[ah];B[dg];W[af];B[ad];W[fh]
+;B[fg];W[eg];B[gh];W[di];B[dh];W[ai];B[ei];W[hd];B[ce];W[bf];B[ci]
+;W[he];B[ie];W[ha];B[ig];W[ia];B[];W[])
diff --git a/regression/games/olympiad2004/9x9/neu-gnu.sgf b/regression/games/olympiad2004/9x9/neu-gnu.sgf
new file mode 100644 (file)
index 0000000..695f4b3
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[6.5]
+PW[GNU Go]PB[NeuroGo]DT[2004-07-04]GN[GNU Go (W) vs. NeuroGo (B)]
+RE[W+23.5]
+TM[30:00]RU[Chinese]
+C[GNU Go 3.5.8 Random Seed 1088981373 level 12
+GNU Go used 0:16 minutes
+NeuroGo used 23:54 minutes]
+;B[fg];W[gd];B[ed];W[fc];B[cg];W[ec];B[cd];W[hg];B[db];W[eb];B[gg]
+;W[hf];B[fd];W[dc];B[cc];W[dd];B[de];W[ge];B[ef];W[cb];B[bb];W[da]
+;B[hh];W[ih];B[hi];W[ba];B[ab];W[ff];B[gf];W[fe];B[ee];W[ig];B[]
+;W[ca];B[];W[aa];B[bd];W[ce];B[be];W[eg];B[eh];W[df];B[dg];W[cf]
+;B[bf];W[ef];B[];W[fh];B[gh];W[ac];B[fi];W[bc];B[ad];W[he];B[ii];W[]
+;B[])
diff --git a/regression/games/olympiad2006/19x19/aya-gnu.sgf b/regression/games/olympiad2006/19x19/aya-gnu.sgf
new file mode 100644 (file)
index 0000000..94788b2
--- /dev/null
@@ -0,0 +1,43 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-29]
+RO[3]
+PB[Aya]
+PW[GNU Go]
+RE[W+]
+;B[cp];W[dd];B[pp];W[qd];B[fd];W[df];B[oc];W[pf];B[qc];W[rc]
+;B[pd];W[qb];B[ld];W[pc];B[nd];W[ec];B[fc];W[ep];B[jc];W[cq]
+;B[gq];W[bp];B[co];W[nq];B[pr];W[kq];B[bo];W[bq];B[ci];W[cl]
+;B[dm];W[qn];B[er];W[dq];B[eq];W[cm];B[dl];W[do];B[dn];W[cn]
+;B[bn];W[ck];B[bm];W[eo];B[dk];W[cj];B[dj];W[bi];B[bh];W[ch]
+;B[di];W[aj];B[ah];W[bg];B[cg];W[ag];B[dh];W[bl];B[ak];W[am]
+;B[mp];W[qk];B[jp];W[mq];B[np];W[jq];B[ip];W[hr];B[hq];W[kp]
+;B[ms];W[iq];B[fp];W[gr];B[ko];W[ng];B[lr];W[lq];B[pn];W[pm]
+;B[on];W[nl];B[km];W[kk];B[lp];W[kg];B[lf];W[ij];B[qo];W[rn]
+;B[ro];W[bf];B[eg];W[be];B[ed];W[eb];B[dc];W[db];B[cd];W[de]
+;B[cb];W[cc];B[bc];W[dc];B[hh];W[il];B[im];W[ha];B[mg];W[nh]
+;B[gb];W[kl];B[hm];W[ga];B[li];W[lg];B[mk];W[mf];B[jh];W[ml]
+;B[oj];W[ki];B[pe];W[qe];B[oh];W[nj];B[qm];W[ok];B[mh];W[mi]
+;B[rl];W[ph];B[pb];W[ql];B[rm];W[rk];B[me];W[nf];B[kf];W[jg]
+;B[ig];W[jf];B[je];W[if];B[hf];W[ie];B[cf];W[bd];B[ce];W[dg]
+;B[ch];W[bb];B[bj];W[ao];B[ai];W[an];B[ke];W[ls];B[ks];W[fr]
+;B[fq];W[is];B[fs];W[ns];B[nr];W[js];B[os];W[kr];B[gs];W[mr]
+;B[ir];W[jr];B[jl];W[hk];B[jk];W[jj];B[ll];W[lk];B[fb];W[hb]
+;B[hc];W[ib];B[fa];W[ic];B[id];W[hd];B[jd];W[he];B[gc];W[qc]
+;B[ob];W[gf];B[gg];W[hg];B[ab];W[ac];B[ff];W[ih];B[hi];W[gh]
+;B[gi];W[fg];B[fh];W[gg];B[fj];W[fe];B[al];W[dp];B[dr];W[ii]
+;B[oq];W[ef];B[eh];W[fn];B[fo];W[en];B[om];W[gn];B[hn];W[lm]
+;B[ln];W[mn];B[mo];W[oe];B[od];W[sl];B[pl];W[ea];B[jb];W[pk]
+;B[go];W[cr];B[cs];W[bs];B[ds];W[gl];B[qa];W[hl];B[fk];W[ra]
+;B[pa];W[nn];B[sm];W[sk];B[no];W[ol];B[pm];W[ne];B[gd];W[nm]
+;B[fl];W[ls];B[ns];W[bk];B[aj];W[gj];B[em];W[hj];B[fi];W[gm]
+;B[fm];W[hs];B[es];W[ge];B[ia];W[ee];B[jm];W[ik];B[lo];W[gk]
+;B[co];W[bo];B[sn];W[ca];B[];W[lh];B[];W[lj];B[];W[cp]
+;B[];W[bc];B[];W[mh];B[];W[br];B[];W[of];B[];W[qf]
+;B[];W[pg];B[];W[rb];B[];W[ni];B[];W[oi];B[];W[pj]
+;B[];W[])
diff --git a/regression/games/olympiad2006/19x19/crazystone-gnu.sgf b/regression/games/olympiad2006/19x19/crazystone-gnu.sgf
new file mode 100644 (file)
index 0000000..f23a08d
--- /dev/null
@@ -0,0 +1,52 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-30]
+RO[7]
+PB[Crazy Stone]
+PW[GNU Go]
+RE[W+]
+;B[nk];W[pp];B[qm];W[pe];B[hf];W[do];B[fl];W[dq];B[qh];W[pc]
+;B[og];W[mc];B[cm];W[jq];B[ce];W[cc];B[gh];W[ed];B[hl];W[cg]
+;B[ld];W[df];B[me];W[qo];B[ib];W[ck];B[mm];W[dm];B[pg];W[cn]
+;B[qq];W[pq];B[dh];W[qr];B[pr];W[or];B[rr];W[ps];B[lc];W[mb]
+;B[ge];W[ch];B[qs];W[rs];B[dl];W[cl];B[em];W[go];B[ee];W[de]
+;B[bm];W[dn];B[nd];W[jn];B[dd];W[ec];B[dc];W[cd];B[db];W[cb]
+;B[ci];W[jl];B[fb];W[eb];B[dk];W[cj];B[bi];W[bl];B[dj];W[jj]
+;B[bn];W[bo];B[fa];W[ki];B[da];W[ea];B[ba];W[fd];B[ca];W[fe]
+;B[bb];W[be];B[bd];W[cf];B[gd];W[ef];B[bc];W[ce];B[ff];W[mo]
+;B[fc];W[ee];B[bj];W[am];B[ae];W[af];B[bk];W[ad];B[al];W[mi]
+;B[li];W[lj];B[hc];W[lh];B[dp];W[cq];B[nf];W[nl];B[pm];W[qk]
+;B[nj];W[ni];B[oi];W[nm];B[rn];W[ok];B[oj];W[ml];B[ol];W[pk]
+;B[nn];W[om];B[rl];W[pl];B[on];W[mn];B[mk];W[rk];B[lk];W[qf]
+;B[lm];W[ll];B[kl];W[ol];B[km];W[kk];B[sk];W[ri];B[rj];W[qi]
+;B[rh];W[sh];B[sg];W[si];B[qj];W[pj];B[pi];W[sj];B[qj];W[sl]
+;B[rf];W[sm];B[sn];W[pn];B[np];W[re];B[jk];W[ik];B[ro];W[rp]
+;B[rm];W[qn];B[qp];W[rq];B[qe];W[qd];B[qp];W[qq];B[po];W[oo]
+;B[no];W[mp];B[op];W[po];B[im];W[jm];B[sk];W[rj];B[mq];W[lq]
+;B[lp];W[kq];B[lo];W[kn];B[ln];W[sl];B[sm];W[sk];B[cp];W[bp]
+;B[nc];W[nb];B[ob];W[oc];B[pb];W[qb];B[pd];W[in];B[od];W[qc]
+;B[eo];W[fp];B[fn];W[ep];B[lb];W[fg];B[ma];W[na];B[ij];W[il]
+;B[en];W[co];B[la];W[oa];B[pa];W[qa];B[kg];W[hk];B[ho];W[hn]
+;B[ip];W[iq];B[gp];W[gq];B[hp];W[hi];B[gn];W[fo];B[hq];W[gr]
+;B[sd];W[gl];B[gk];W[gj];B[ko];W[mr];B[se];W[fk];B[sb];W[pb]
+;B[jo];W[hr];B[ir];W[fh];B[fq];W[ig];B[eq];W[dp];B[fr];W[jr]
+;B[dr];W[is];B[br];W[cr];B[cs];W[bq];B[aq];W[fs];B[gf];W[er]
+;B[gm];W[jf];B[hm];W[kf];B[ji];W[lg];B[eg];W[gg];B[ek];W[jd]
+;B[hg];W[hh];B[fi];W[gi];B[eh];W[gh];B[jh];W[ei];B[lf];W[nh]
+;B[ih];W[mg];B[jg];W[if];B[bg];W[bh];B[je];W[ke];B[ah];W[ag]
+;B[le];W[ie];B[ac];W[ae];B[io];W[nq];B[ii];W[gk];B[di];W[fj]
+;B[id];W[jc];B[dg];W[ai];B[aj];W[ab];B[ah];W[aa];B[nr];W[mp]
+;B[oq];W[mq];B[os];W[jb];B[kd];W[ic];B[he];W[hd];B[ej];W[id]
+;B[gc];W[hb];B[hj];W[ao];B[fi];W[kh];B[ia];W[ja];B[rc];W[rd]
+;B[sr];W[an];B[gb];W[ha];B[pr];W[mo];B[qs];W[mn];B[kg];W[ei]
+;B[ss];W[sq];B[];W[fi];B[];W[ai];B[];W[ah];B[];W[qe]
+;B[];W[rb];B[];W[qg];B[];W[rg];B[];W[sf];B[];W[ph]
+;B[];W[or];B[];W[nn];B[];W[ns];B[];W[ps];B[];W[ir]
+;B[];W[fr];B[];W[qh];B[];W[oh];B[];W[mj];B[];W[jg]
+;B[];W[ga];B[];W[gd];B[];W[ih];B[];W[fa];B[];W[mf]
+;B[];W[md];B[];W[])
diff --git a/regression/games/olympiad2006/19x19/gnu-aya.sgf b/regression/games/olympiad2006/19x19/gnu-aya.sgf
new file mode 100644 (file)
index 0000000..3a8c612
--- /dev/null
@@ -0,0 +1,37 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-29]
+RO[4]
+PB[GNU Go]
+PW[Aya]
+RE[W+]
+;B[pd];W[dq];B[pp];W[dd];B[pj];W[nd];B[pf];W[np];B[pn];W[nn]
+;B[oq];W[ph];B[do];W[bq];B[cf];W[bd];B[pl];W[dg];B[fc];W[ef]
+;B[ic];W[fd];B[lc];W[oc];B[pc];W[pb];B[qb];W[nb];B[ec];W[gc]
+;B[gb];W[hc];B[ib];W[hb];B[ha];W[ld];B[id];W[gd];B[kc];W[fb]
+;B[dc];W[eb];B[ga];W[fa];B[db];W[ia];B[if];W[ke];B[bb];W[cc]
+;B[pa];W[he];B[ie];W[dp];B[eo];W[cm];B[cg];W[di];B[co];W[jb]
+;B[em];W[dl];B[kd];W[me];B[mc];W[jc];B[nc];W[mb];B[lb];W[hq]
+;B[jd];W[ko];B[hn];W[gp];B[od];W[lg];B[mr];W[fn];B[dm];W[fk]
+;B[fm];W[ij];B[im];W[hl];B[gm];W[gn];B[km];W[hm];B[ho];W[go]
+;B[jo];W[ml];B[jp];W[kp];B[jq];W[kq];B[kk];W[jl];B[kr];W[ir]
+;B[jr];W[kl];B[lm];W[ep];B[mm];W[ol];B[lq];W[ln];B[nm];W[om]
+;B[pm];W[ki];B[on];W[mj];B[nl];W[bl];B[ll];W[ok];B[pk];W[oi]
+;B[mk];W[oj];B[qg];W[qh];B[ih];W[hi];B[jj];W[nf];B[il];W[hk]
+;B[fg];W[ed];B[md];W[le];B[hh];W[fh];B[rj];W[hf];B[hg];W[kh]
+;B[gg];W[gi];B[og];W[mh];B[rh];W[pg];B[qf];W[of];B[lj];W[bh]
+;B[nj];W[mi];B[qi];W[ni];B[pi];W[oh];B[nk];W[js];B[ks];W[in]
+;B[kn];W[ik];B[jm];W[jk];B[ji];W[kj];B[lk];W[io];B[is];W[hs]
+;B[ip];W[hp];B[eg];W[eh];B[df];W[dh];B[ff];W[ee];B[iq];W[js]
+;B[oe];W[ne];B[is];W[hr];B[li];W[mn];B[lp];W[ng];B[js];W[jg]
+;B[ig];W[da];B[jh];W[jf];B[lh];W[kg];B[jn];W[je];B[kb];W[ja]
+;B[ka];W[ha];B[ob];W[fe];B[hd];W[ge];B[ii];W[gh];B[gf];W[en]
+;B[lo];W[cb];B[no];W[de];B[mo];W[nn];B[op];W[ba];B[ri];W[ab]
+;B[mn];W[bc];B[oo];W[ch];B[rg];W[el];B[mq];W[dn];B[pe];W[bo]
+;B[pb];W[bp];B[oc];W[bf];B[nq];W[be];B[];W[gl];B[];W[fl]
+;B[];W[])
diff --git a/regression/games/olympiad2006/19x19/gnu-crazystone.sgf b/regression/games/olympiad2006/19x19/gnu-crazystone.sgf
new file mode 100644 (file)
index 0000000..38045e9
--- /dev/null
@@ -0,0 +1,34 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-30]
+RO[8]
+PB[GNU Go]
+PW[Crazy Stone]
+RE[B+]
+;B[pd];W[df];B[pp];W[cp];B[ch];W[in];B[dl];W[cf];B[eq];W[lp]
+;B[do];W[cj];B[di];W[dj];B[ei];W[bh];B[hq];W[ej];B[bi];W[fj]
+;B[bg];W[fi];B[co];W[ee];B[cr];W[hc];B[cc];W[bf];B[ec];W[bj]
+;B[eg];W[ci];B[gg];W[fb];B[eh];W[gk];B[fd];W[fe];B[gd];W[ge]
+;B[he];W[hf];B[gf];W[hd];B[ie];W[jd];B[eb];W[je];B[if];W[ai]
+;B[jf];W[kf];B[ii];W[kg];B[hg];W[cg];B[pf];W[id];B[qi];W[ig]
+;B[jg];W[ih];B[jh];W[hh];B[kh];W[lh];B[gi];W[gh];B[fh];W[gj]
+;B[hi];W[oo];B[qn];W[ko];B[nd];W[pq];B[oq];W[qp];B[qq];W[rq]
+;B[pr];W[po];B[qo];W[rp];B[rr];W[op];B[pq];W[md];B[mc];W[sr]
+;B[gb];W[rs];B[qr];W[nq];B[ro];W[or];B[nr];W[mr];B[os];W[nc]
+;B[oc];W[ne];B[nb];W[ns];B[ms];W[ls];B[mq];W[np];B[me];W[lr]
+;B[ke];W[le];B[kd];W[ld];B[kc];W[lc];B[lb];W[ep];B[dp];W[pj]
+;B[mf];W[od];B[nc];W[kb];B[lf];W[dr];B[er];W[dq];B[cq];W[rh]
+;B[qh];W[dc];B[dd];W[ea];B[ri];W[ed];B[db];W[fc];B[gc];W[fa]
+;B[da];W[ga];B[hb];W[ha];B[ia];W[ds];B[qk];W[bp];B[bo];W[bs]
+;B[es];W[cs];B[bq];W[br];B[ap];W[fq];B[fp];W[eo];B[fr];W[gr]
+;B[gq];W[fs];B[gs];W[hs];B[li];W[hr];B[en];W[fo];B[go];W[fn]
+;B[gm];W[fs];B[fq];W[em];B[gn];W[fm];B[ir];W[qj];B[ok];W[qg]
+;B[pg];W[ph];B[rj];W[rk];B[pk];W[si];B[rl];W[pi];B[sk];W[js]
+;B[jr];W[sj];B[rk];W[is];B[fl];W[ks];B[ns];W[ps];B[qs];W[gp]
+;B[ip];W[hp];B[ho];W[om];B[ml];W[nl];B[nk];W[pe];B[qe];W[qd]
+;B[oe];W[jk];B[mm])
diff --git a/regression/games/olympiad2006/19x19/gnu-gointellect-playoff.sgf b/regression/games/olympiad2006/19x19/gnu-gointellect-playoff.sgf
new file mode 100644 (file)
index 0000000..214ed50
--- /dev/null
@@ -0,0 +1,34 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-06-01]
+RO[11 (playoff)]
+PB[GNU Go]
+PW[Go Intellect]
+RE[B+]
+;B[pd];W[pq];B[cd];W[dq];B[dh];W[co];B[qo];W[ec];B[op];W[kc]
+;B[oq];W[nc];B[pr];W[cc];B[bc];W[dd];B[ce];W[jq];B[qf];W[qc]
+;B[pc];W[pb];B[ob];W[rb];B[pa];W[qb];B[oc];W[re];B[nd];W[mc]
+;B[dk];W[nb];B[cm];W[dn];B[qj];W[rg];B[cb];W[dc];B[fl];W[qh]
+;B[oj];W[pg];B[pe];W[le];B[oe];W[ng];B[hg];W[db];B[fn];W[bb]
+;B[he];W[bd];B[be];W[ac];B[fe];W[hc];B[hn];W[gq];B[lq];W[pn]
+;B[nn];W[de];B[cf];W[bn];B[bm];W[ef];B[li];W[fg];B[kp];W[gh]
+;B[kf];W[lf];B[ii];W[om];B[gi];W[rm];B[rk];W[nm];B[mj];W[pk]
+;B[pj];W[qq];B[qp];W[pp];B[po];W[hh];B[hi];W[ih];B[id];W[kg]
+;B[kr];W[qr];B[or];W[oo];B[so];W[on];B[rr];W[no];B[mn];W[mp]
+;B[pl];W[qn];B[rq];W[mq];B[jr];W[ip];B[jn];W[lp];B[kq];W[ko]
+;B[jo];W[kn];B[km];W[lm];B[kl];W[ln];B[ml];W[jp];B[mm];W[ol]
+;B[ok];W[ql];B[mr];W[ll];B[qk];W[lk];B[mk];W[lj];B[nh];W[ki]
+;B[lh];W[jj];B[kh];W[ji];B[jh];W[ik];B[im];W[ic];B[jg];W[lg]
+;B[ir];W[hq];B[fi];W[oh];B[fs];W[mh];B[mo];W[np];B[mi];W[ig]
+;B[rj];W[er];B[if];W[ke];B[jf];W[ni];B[gg];W[fh];B[ri];W[je]
+;B[ff];W[dg];B[lo];W[hk];B[cg];W[ei];B[eh];W[eg];B[di];W[ej]
+;B[ee];W[df];B[dj];W[gk];B[jk];W[ij];B[fj];W[jl];B[kk];W[si]
+;B[an];W[fk];B[ek];W[ao];B[am];W[hr];B[hs];W[jd];B[sh];W[sk]
+;B[rn];W[sm];B[qm];W[sn];B[ro];W[pm];B[rl];W[gd];B[ge];W[hf]
+;B[gf];W[sp];B[rp];W[em];B[kj];W[gl];B[fm];W[qd];B[rh];W[qg]
+;B[eo];W[fp];B[cn];W[do];B[bo])
diff --git a/regression/games/olympiad2006/19x19/gnu-gointellect.sgf b/regression/games/olympiad2006/19x19/gnu-gointellect.sgf
new file mode 100644 (file)
index 0000000..1878783
--- /dev/null
@@ -0,0 +1,28 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-06-01]
+RO[9]
+PB[GNU Go]
+PW[Go Intellect]
+RE[B+]
+;B[pd];W[pq];B[cd];W[cp];B[po];W[qo];B[qn];W[ro];B[rn];W[cj]
+;B[qp];W[mq];B[ep];W[rp];B[qq];W[op];B[cq];W[dp];B[dq];W[ec]
+;B[de];W[cg];B[dc];W[ed];B[gc];W[ee];B[jc];W[cf];B[df];W[bq]
+;B[ef];W[rq];B[fe];W[pp];B[on];W[iq];B[br];W[eq];B[fp];W[cr]
+;B[dr];W[er];B[cs];W[gr];B[em];W[bo];B[aq];W[bp];B[bm];W[dn]
+;B[dm];W[eo];B[fo];W[cn];B[cm];W[fd];B[gd];W[db];B[cb];W[qr]
+;B[mc];W[qi];B[qk];W[qf];B[qe];W[rf];B[re];W[pj];B[fg];W[ge]
+;B[he];W[pk];B[pl];W[ff];B[gg];W[dd];B[cc];W[fb];B[gf];W[ho]
+;B[of];W[ce];B[be];W[bf];B[ad];W[dg];B[eg];W[ca];B[ba];W[ab]
+;B[da];W[rj];B[rk];W[ej];B[nh];W[hm];B[qj];W[ri];B[pi];W[oi]
+;B[ph];W[oh];B[oj];W[pg];B[ok];W[ni];B[og];W[qh];B[rg];W[mh]
+;B[pj];W[ng];B[mo];W[pf];B[pe];W[qg];B[sf];W[fn];B[en];W[do]
+;B[gn];W[fm];B[fq];W[fr];B[gm];W[fl];B[go];W[hl];B[gl];W[fk]
+;B[ap];W[ds];B[es];W[ao];B[ar];W[qc];B[ob];W[fs];B[ds];W[gq]
+;B[gk];W[hk];B[gj];W[hj];B[kp];W[gi];B[fj];W[fi];B[ek];W[gp]
+;B[el];W[oe];B[nf];W[ne];B[mf];W[me];B[lf])
diff --git a/regression/games/olympiad2006/19x19/gnu-indigo.sgf b/regression/games/olympiad2006/19x19/gnu-indigo.sgf
new file mode 100644 (file)
index 0000000..7123f8f
--- /dev/null
@@ -0,0 +1,44 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-30]
+RO[6]
+PB[GNU Go]
+PW[Indigo]
+RE[W+]
+;B[pd];W[cq];B[pp];W[cd];B[ed];W[dj];B[cc];W[jp];B[dd];W[jd]
+;B[ce];W[pk];B[dp];W[cp];B[do];W[qf];B[er];W[nd];B[oe];W[co]
+;B[pf];W[pg];B[qe];W[mf];B[qg];W[nq];B[dn];W[cl];B[cn];W[bn]
+;B[bm];W[cm];B[bo];W[pr];B[bp];W[qo];B[qh];W[on];B[oh];W[bq]
+;B[oc];W[fp];B[nk];W[fn];B[gq];W[gp];B[ll];W[hq];B[rk];W[pm]
+;B[jl];W[og];B[gr];W[ph];B[js];W[hr];B[hs];W[pi];B[qi];W[rf]
+;B[mb];W[dm];B[ni];W[ng];B[ko];W[kp];B[cr];W[dq];B[eq];W[br]
+;B[dr];W[bl];B[an];W[ep];B[lo];W[qj];B[rj];W[rg];B[rh];W[re]
+;B[rd];W[no];B[in];W[li];B[lp];W[lq];B[lj];W[ik];B[kj];W[jh]
+;B[ij];W[jk];B[jj];W[gk];B[hj];W[hm];B[hh];W[hk];B[ei];W[kk]
+;B[ch];W[lk];B[ml];W[mj];B[mi];W[mk];B[nl];W[lh];B[nj];W[mn]
+;B[kl];W[gj];B[hc];W[gi];B[ih];W[gh];B[hf];W[hd];B[gg];W[jf]
+;B[gd];W[bi];B[ci];W[he];B[bj];W[ge];B[fe];W[fg];B[ie];W[id]
+;B[gf];W[ff];B[di];W[fh];B[ic];W[kb];B[fc];W[cj];B[bk];W[al]
+;B[bh];W[lc];B[rm];W[ej];B[ls];W[kr];B[ks];W[mq];B[ef];W[jr]
+;B[jb];W[if];B[ro];W[qq];B[qp];W[qn];B[rq];W[rn];B[pq];W[or]
+;B[sn];W[qr];B[ql];W[pl];B[jc];W[rr];B[kd];W[hg];B[kc];W[lb]
+;B[mc];W[ld];B[ke];W[md];B[sr];W[nc];B[nb];W[eg];B[dg];W[fq]
+;B[fr];W[ln];B[kf];W[pb];B[ob];W[qc];B[qd];W[rc];B[se];W[kg]
+;B[je];W[ir];B[is];W[of];B[pe];W[ne];B[ns];W[bc];B[bb];W[qk]
+;B[qm];W[am];B[bn];W[sb];B[ra];W[mr];B[ar];W[aq];B[ap];W[od]
+;B[pc];W[qb];B[sd];W[po];B[ms];W[ak];B[aj];W[ck];B[ai];W[op]
+;B[rp];W[oq];B[sq];W[eo];B[bs];W[en];B[os];W[nr];B[fi];W[lf]
+;B[fj];W[fk];B[le];W[me];B[ja];W[eh];B[ps];W[bd];B[cb];W[kn]
+;B[dh];W[be];B[cf];W[qs];B[so];W[lr];B[gs];W[bf];B[ka];W[la]
+;B[ma];W[im];B[ss];W[rs];B[ac];W[jm];B[gc];W[jo];B[ab];W[mo]
+;B[pa];W[hn];B[qa];W[io];B[ri];W[mp];B[ee];W[ji];B[bg];W[jn]
+;B[br];W[eb];B[bq];W[fb];B[da];W[gb];B[db];W[hb];B[df];W[el]
+;B[ec];W[ig];B[ah];W[hi];B[ea];W[lm];B[rl];W[mh];B[sa];W[nh]
+;B[oa];W[oi];B[sf];W[ii];B[sg];W[ok];B[sh];W[ki];B[sm];W[nm]
+;B[];W[ol];B[];W[oj];B[];W[km];B[];W[mm];B[];W[il]
+;B[];W[])
diff --git a/regression/games/olympiad2006/19x19/gnu-jimmy.sgf b/regression/games/olympiad2006/19x19/gnu-jimmy.sgf
new file mode 100644 (file)
index 0000000..74ac1b8
--- /dev/null
@@ -0,0 +1,39 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-29]
+RO[1]
+PB[GNU Go]
+PW[Jimmy]
+RE[B+]
+;B[pd];W[cd];B[pp];W[cp];B[ed];W[ep];B[df];W[bf];B[dc];W[cc]
+;B[gq];W[nc];B[jq];W[qf];B[pf];W[qe];B[pe];W[hc];B[qd];W[fq]
+;B[qg];W[qn];B[gp];W[qk];B[re];W[kd];B[np];W[rp];B[qq];W[pb]
+;B[rq];W[qp];B[ff];W[dl];B[ei];W[cb];B[nn];W[po];B[op];W[cn]
+;B[gn];W[cg];B[dg];W[ch];B[cj];W[gr];B[hr];W[fr];B[ek];W[hs]
+;B[ir];W[eb];B[if];W[qi];B[nl];W[oi];B[mi];W[bl];B[ne];W[md]
+;B[kg];W[lf];B[rh];W[lg];B[ki];W[lh];B[lk];W[kh];B[ji];W[jh]
+;B[ih];W[jg];B[sk];W[rj];B[sj];W[ng];B[qb];W[pc];B[qc];W[ri]
+;B[si];W[ig];B[oh];W[nh];B[hg];W[hh];B[ii];W[gg];B[hf];W[ph]
+;B[id];W[lq];B[lp];W[mq];B[mp];W[eh];B[dh];W[gf];B[ge];W[fc]
+;B[jc];W[ci];B[bj];W[dj];B[dk];W[ck];B[di];W[qa];B[el];W[ra]
+;B[rb];W[rm];B[dm];W[cl];B[dn];W[sq];B[nr];W[kq];B[kp];W[kr]
+;B[nj];W[sr];B[lb];W[mb];B[lc];W[kf];B[mc];W[na];B[nd];W[pg]
+;B[ld];W[qh];B[rf];W[is];B[js];W[mr];B[jr];W[gs];B[ib];W[ke]
+;B[gb];W[gc];B[eo];W[me];B[co];W[bo];B[do];W[cm];B[dp];W[dq]
+;B[bp];W[cq];B[bn];W[bq];B[ao];W[rr];B[qr];W[nf];B[fp];W[eq]
+;B[of];W[hb];B[ic];W[og];B[ha];W[fb];B[ga];W[fa];B[ia];W[om]
+;B[nm];W[db];B[rs];W[ok];B[dd];W[ol];B[ce];W[be];B[aq];W[ar]
+;B[ap];W[br];B[bi];W[li];B[lj];W[nk];B[cf];W[bg];B[mk];W[bh]
+;B[rl];W[ai];B[aj];W[ah];B[ql];W[hd];B[od];W[af];B[he];W[pl]
+;B[qm];W[rn];B[on];W[ln];B[km];W[kc];B[kb];W[la];B[pa];W[oa]
+;B[oc];W[fd];B[oj];W[pj];B[fe];W[pm];B[pn];W[pk];B[le];W[mf]
+;B[rk];W[qo];B[oo];W[je];B[ob];W[mg];B[ie];W[ec];B[ni];W[gd]
+;B[mj];W[jd];B[jf];W[mh];B[nq];W[sh];B[sg];W[sm];B[so];W[bd]
+;B[gh];W[ro];B[sh];W[sp];B[sl];W[sn];B[qs];W[sf];B[rg];W[jb]
+;B[nb];W[ka];B[ja];W[ak];B[ej];W[an];B[bo];W[bk];B[dj];W[de]
+;B[ee])
diff --git a/regression/games/olympiad2006/19x19/gointellect-gnu.sgf b/regression/games/olympiad2006/19x19/gointellect-gnu.sgf
new file mode 100644 (file)
index 0000000..ce16c49
--- /dev/null
@@ -0,0 +1,40 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-06-01]
+RO[10]
+PB[Go Intellect]
+PW[GNU Go]
+RE[W+]
+;B[qd];W[dd];B[pq];W[dq];B[oc];W[qo];B[co];W[ep];B[jq];W[op]
+;B[ci];W[oq];B[gq];W[cp];B[do];W[cm];B[fq];W[en];B[eo];W[fo]
+;B[cf];W[qj];B[dp];W[bp];B[eq];W[dr];B[fn];W[gn];B[fm];W[bo]
+;B[go];W[ho];B[fp];W[hm];B[hp];W[fd];B[cc];W[cd];B[dc];W[ec]
+;B[db];W[bd];B[dg];W[jc];B[or];W[nr];B[qr];W[mp];B[qp];W[po]
+;B[io];W[mc];B[eb];W[fb];B[hn];W[qg];B[bb];W[ca];B[ab];W[ea]
+;B[da];W[ba];B[er];W[lm];B[im];W[gg];B[kd];W[me];B[nd];W[md]
+;B[kc];W[je];B[jd];W[ie];B[ke];W[kf];B[ro];W[jb];B[id];W[kb]
+;B[qm];W[rn];B[so];W[qn];B[pl];W[rm];B[nm];W[rl];B[pj];W[qi]
+;B[qk];W[rk];B[ql];W[re];B[nb];W[lk];B[nj];W[mb];B[qe];W[rf]
+;B[lj];W[kk];B[lh];W[mk];B[mj];W[kj];B[hc];W[he];B[lf];W[le]
+;B[kg];W[jf];B[mn];W[ki];B[jg];W[ih];B[mf];W[ne];B[nf];W[ig]
+;B[rd];W[hi];B[oe];W[hd];B[ga];W[gc];B[ic];W[ib];B[hb];W[fa]
+;B[lc];W[gb];B[be];W[ae];B[lb];W[la];B[af];W[ad];B[bl];W[bm]
+;B[nc];W[cl];B[bk];W[ck];B[ka];W[ja];B[ha];W[bj];B[bi];W[aj]
+;B[ai];W[cj];B[na];W[di];B[ma];W[hl];B[bg];W[ch];B[bh];W[dh]
+;B[fk];W[es];B[fs];W[ds];B[ee];W[de];B[os];W[sd];B[ce];W[cg]
+;B[ed];W[df];B[sc];W[se];B[rb];W[oh];B[ns];W[mr];B[fc];W[gd]
+;B[jl];W[il];B[jm];W[kr];B[jr];W[sn];B[rp];W[pi];B[nk];W[oj]
+;B[li];W[pk];B[ok];W[pj];B[pm];W[ej];B[jk];W[gj];B[ij];W[kh]
+;B[jh];W[ji];B[lg];W[ik];B[jj];W[ii];B[gk];W[on];B[fj];W[fi]
+;B[kq];W[hj];B[hk];W[om];B[ol];W[lr];B[ln];W[ni];B[dm];W[cn]
+;B[dn];W[pf];B[lp];W[km];B[kn];W[ek];B[el];W[qf];B[js];W[pe]
+;B[pd];W[of];B[ld];W[ng];B[mo];W[no];B[lq];W[mq];B[ks];W[ml]
+;B[dl];W[kl];B[nn];W[pn];B[dk];W[dj];B[pp];W[mh];B[mg];W[mi]
+;B[ec];W[bc];B[ef];W[bf];B[eg];W[eh];B[fg];W[fh];B[gf];W[fe]
+;B[ff];W[hf];B[gh];W[hh];B[hg];W[ag];B[aa];W[gg];B[cb];W[hg]
+;B[ms];W[ls];B[mm];W[nl];B[];W[ah])
diff --git a/regression/games/olympiad2006/19x19/indigo-gnu.sgf b/regression/games/olympiad2006/19x19/indigo-gnu.sgf
new file mode 100644 (file)
index 0000000..9e52e9a
--- /dev/null
@@ -0,0 +1,44 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-30]
+RO[5]
+PB[Indigo]
+PW[GNU Go]
+RE[W+]
+;B[di];W[qd];B[cd];W[ed];B[cp];W[cc];B[qp];W[dd];B[qj];W[ce]
+;B[oq];W[eq];B[jp];W[eo];B[od];W[oe];B[kc];W[cn];B[dr];W[ck]
+;B[ne];W[pe];B[gq];W[oo];B[bj];W[er];B[pn];W[dq];B[cq];W[oh]
+;B[bo];W[qh];B[ek];W[cr];B[bn];W[gp];B[cm];W[hq];B[nm];W[bk]
+;B[dl];W[jr];B[hp];W[iq];B[cg];W[ip];B[io];W[jo];B[ho];W[ko]
+;B[br];W[hc];B[gr];W[go];B[hn];W[hl];B[gn];W[fn];B[gm];W[fm]
+;B[gl];W[ds];B[hr];W[kq];B[bd];W[be];B[im];W[hk];B[gj];W[pc]
+;B[mq];W[nd];B[gk];W[jk];B[nc];W[md];B[mc];W[oc];B[lf];W[ih]
+;B[ld];W[me];B[km];W[nf];B[lh];W[pj];B[pk];W[oj];B[lk];W[qk]
+;B[rk];W[ql];B[rl];W[rj];B[qm];W[pl];B[ok];W[hj];B[if];W[gh]
+;B[fg];W[ki];B[mj];W[hf];B[hg];W[hh];B[gg];W[kh];B[he];W[kg]
+;B[kf];W[ol];B[nk];W[mp];B[lp];W[lq];B[lo];W[mo];B[ln];W[nq]
+;B[mr];W[nr];B[lr];W[kr];B[or];W[ns];B[lg];W[il];B[kp];W[ir]
+;B[jg];W[jh];B[on];W[os];B[pr];W[sj];B[no];W[np];B[op];W[jb]
+;B[nn];W[fh];B[eg];W[ps];B[qr];W[ob];B[kb];W[ic];B[de];W[bg]
+;B[bh];W[af];B[ee];W[fd];B[li];W[bs];B[bq];W[qs];B[rr];W[kl]
+;B[ll];W[cf];B[ch];W[fe];B[df];W[gf];B[ig];W[ie];B[bc];W[bb]
+;B[fp];W[fo];B[ep];W[dp];B[fq];W[je];B[do];W[dn];B[co];W[fl]
+;B[fk];W[fr];B[kd];W[ff];B[kj];W[jj];B[jf];W[en];B[nb];W[rs]
+;B[ni];W[kk];B[pi];W[oi];B[jm];W[lj];B[nl];W[sr];B[sq];W[ja]
+;B[ah];W[ac];B[ag];W[ad];B[pm];W[qi];B[jd];W[id];B[kj];W[mn]
+;B[mm];W[ms];B[om];W[qj];B[fi];W[lj];B[eh];W[ef];B[dg];W[ka]
+;B[nj];W[lb];B[lc];W[sk];B[rm];W[gi];B[ss];W[ls];B[qb];W[rb]
+;B[jq];W[oa];B[mb];W[la];B[rc];W[qc];B[sb];W[ra];B[rd];W[qa]
+;B[re];W[rg];B[em];W[gs];B[dm];W[hs];B[le];W[mf];B[mg];W[ng]
+;B[bf];W[ae];B[kj];W[nh];B[ij];W[ii];B[jc];W[sl];B[el];W[sm]
+;B[sn];W[sr];B[gb];W[fb];B[gc];W[fc];B[hb];W[ib];B[gd];W[ss]
+;B[ma];W[ga];B[ha];W[fa];B[rq];W[mh];B[bg];W[ar];B[ke];W[ge]
+;B[aq];W[lj];B[as];W[cs];B[kj];W[kn];B[jn];W[lj];B[ar];W[kj]
+;B[jl];W[mi];B[hm];W[na];B[qf];W[pf];B[qg];W[rf];B[qe];W[pg]
+;B[po];W[pd];B[rn];W[pb];B[db];W[cb];B[cl];W[rh];B[bl];W[hd]
+;B[ak];W[cd];B[lm];W[gq])
diff --git a/regression/games/olympiad2006/19x19/jimmy-gnu.sgf b/regression/games/olympiad2006/19x19/jimmy-gnu.sgf
new file mode 100644 (file)
index 0000000..e9be019
--- /dev/null
@@ -0,0 +1,39 @@
+(;
+FF[4]
+EV[11th Computer Olympiad]
+PC[Turin, Italy]
+RU[Chinese]
+KM[6.5]
+TM[3600]
+DT[2006-05-29]
+RO[2]
+PB[Jimmy]
+PW[GNU Go]
+RE[W+]
+;B[dd];W[pp];B[cp];W[pd];B[ep];W[cj];B[fd];W[hc];B[nc];W[fb]
+;B[kc];W[qf];B[nq];W[gq];B[qn];W[pn];B[pm];W[qo];B[on];W[po]
+;B[qi];W[qm];B[ql];W[rn];B[rm];W[np];B[mp];W[oq];B[iq];W[go]
+;B[no];W[op];B[pb];W[qc];B[cg];W[om];B[nm];W[pl];B[cc];W[cm]
+;B[ol];W[qk];B[pm];W[pk];B[qn];W[mq];B[qm];W[pi];B[ro];W[rp]
+;B[ph];W[er];B[rk];W[oi];B[cr];W[qb];B[sn];W[he];B[lq];W[nr]
+;B[mr];W[nq];B[qg];W[lp];B[mo];W[kq];B[lr];W[jp];B[lo];W[kp]
+;B[pf];W[ob];B[qe];W[bh];B[bg];W[bo];B[dn];W[bp];B[dm];W[cl]
+;B[ek];W[bq];B[cq];W[ci];B[ng];W[mi];B[mk];W[oe];B[ji];W[mg]
+;B[mf];W[nh];B[lg];W[im];B[mh];W[me];B[le];W[jn];B[gf];W[md]
+;B[mc];W[lj];B[kl];W[jb];B[db];W[ld];B[kd];W[kb];B[jk];W[lc]
+;B[ke];W[ei];B[gj];W[gi];B[oc];W[pc];B[nb];W[pa];B[hi];W[gh]
+;B[eg];W[ag];B[af];W[ah];B[bf];W[gm];B[fk];W[rd];B[hg];W[rf]
+;B[re];W[se];B[pe];W[nf];B[of];W[ne];B[oh];W[rg];B[ni];W[rh]
+;B[hh];W[qh];B[qj];W[dh];B[pg];W[ri];B[pj];W[rj];B[ok];W[if]
+;B[kj];W[ln];B[li];W[ig];B[sp];W[rq];B[sq];W[sr];B[rr];W[so]
+;B[sp];W[eb];B[br];W[dr];B[bn];W[cn];B[ec];W[dl];B[fm];W[el]
+;B[fl];W[fn];B[em];W[ar];B[hl];W[ko];B[ch];W[bi];B[fc];W[gc]
+;B[gb];W[hb];B[qd];W[hm];B[fq];W[gr];B[fr];W[fs];B[jr];W[kr]
+;B[dg];W[eh];B[fg];W[fp];B[eq];W[eo];B[do];W[dk];B[dq];W[gs]
+;B[ds];W[es];B[cs];W[aq];B[ip];W[io];B[hp];W[gp];B[ej];W[mn]
+;B[nn];W[ge];B[fe];W[en];B[ea];W[ga];B[dj];W[di];B[km];W[kn]
+;B[fh];W[fi];B[ih];W[jg];B[kh];W[kf];B[lf];W[lm];B[ll];W[gl]
+;B[gk];W[il];B[ik];W[hk];B[hj];W[je];B[hl];W[kg];B[hk];W[gd]
+;B[jd];W[id];B[jc];W[ic];B[mm];W[co];B[bs];W[sj];B[sk];W[sc]
+;B[fj];W[sq];B[so];W[fa];B[da];W[jh];B[gg];W[as];B[dp];W[jm]
+;B[hf];W[jl];B[oo];W[ha])
diff --git a/regression/games/olympiad2006/9x9/ajago-gnu.sgf b/regression/games/olympiad2006/9x9/ajago-gnu.sgf
new file mode 100644 (file)
index 0000000..4552bfb
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+CA[ASCII]
+GC[Ajago is symmetrical player, and passes when it cannot play symmetry.
+]
+BR[]WR[]
+PB[AjaGo]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+RE[W+5.5]
+;B[ee];W[cf];B[gd];W[eg];B[ec];W[gf];B[cd];W[be];B[he];W[bc];B[hg];
+W[gg];B[cc];W[hh];B[bb];W[hf];B[bd];W[df];B[fd];W[ae];B[ie];W[ad];
+B[if];W[ig];B[ac];W[ge];B[ce];W[bf];B[hd];W[de];B[fe];W[dd];B[ff];
+W[dc];B[fg];W[fh];B[db];W[ed];B[ef];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/akebono-gnu.sgf b/regression/games/olympiad2006/9x9/akebono-gnu.sgf
new file mode 100644 (file)
index 0000000..bcdc76c
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[W+23.5]
+BR[]WR[]
+PB[Akebono]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-28]
+;B[ee];W[cg];B[eg];W[gd];B[ec];W[cd];B[cc];W[bc];B[gg];W[fb];B[cb];
+W[hf];B[bb];W[bd];B[hg];W[gf];B[fc];W[gc];B[eb];W[gb];B[ic];W[ig];
+B[ff];W[hh];B[ge];W[he];B[gh];W[df];B[fe];W[ih];B[bf];W[bg];B[de];
+W[ce];B[hi];W[if];B[dh];W[ch];B[di];W[ab];B[ci];W[bi];B[gi];W[dg];
+B[ei];W[ea];B[da];W[fa];B[fd];W[id];B[ba];W[dd];B[aa];W[dc];B[db];
+W[ac];B[ii];W[ef];B[fi];W[ed];B[fg];W[tt];B[fh];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/atarist-gnu.sgf b/regression/games/olympiad2006/9x9/atarist-gnu.sgf
new file mode 100644 (file)
index 0000000..cc52daf
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[W+1.5]
+SO[]
+EV[Olympiad 2006]
+BR[]WR[]
+PB[Atarist]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+;B[ee];W[ce];B[dd];W[cd];B[de];W[cf];B[cc];W[bc];B[dc];W[gc];B[gd];
+W[gg];B[hc];W[df];B[gb];W[cb];B[fg];W[fh];B[eg];W[eh];B[dg];W[bh];
+B[cg];W[bg];B[ef];W[db];B[gf];W[hg];B[hf];W[dh];B[eb];W[af];B[ch];
+W[ci];B[hh];W[gh];B[ig];W[hi];B[ih];W[bb]
+(;B[da];W[ca];B[ea];W[gi];B[fc];W[ii];B[if];W[tt];B[ei];W[di];B[ia];
+W[tt])
+
+(;B[di]
+C[This is a try to check if atarist could win... and it could.
+];W[ei]
+;B[gi];W[fi];B[if];W[ea];B[ii];W[bi];B[gi];W[di];B[fa];W[da];B[hi];
+W[tt])
+
+)
diff --git a/regression/games/olympiad2006/9x9/aya-gnu.sgf b/regression/games/olympiad2006/9x9/aya-gnu.sgf
new file mode 100644 (file)
index 0000000..2a6f171
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[B+16.5]
+BR[]WR[]
+PB[Aya]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-26]
+;B[df];W[ed];B[dd];W[ec];B[fg];W[dc];B[ge];W[de];B[bf];W[cd];B[gc];
+W[be];B[ae];W[cf];B[cg];W[ce]
+C[bbbbbbbbbbaaaaaaaa
+
+GNU Go never play this kind of ko :(];B[bh];
+W[ad];B[fb];W[eb];B[ef];W[af];B[bg];W[fe];B[ff];W[fc];B[gb];W[gd];
+B[hd];W[fd]C[Baaaaaahhhhhhhhhh again |];B[gf];W[ag];B[ea];W[da];B[fa];
+W[ah];B[ee];W[bi];B[ch];W[ai];B[cb];W[db];B[ci];W[cc]C[ouch];B[ae];
+W[af];B[ag];W[ae];B[ha];W[tt];B[ib];W[tt];B[hc];W[tt];B[id];W[tt];
+B[ai];W[tt];B[if];W[tt];B[hg];W[tt];B[gh];W[tt];B[ih];W[tt];B[hi];
+W[tt];B[fi];W[tt];B[eh];W[tt];B[dh];W[tt];B[he];W[tt];B[eg];W[tt];
+B[ia];W[tt];B[ig];W[tt];B[ei];W[tt];B[hh];W[tt];B[ii];W[tt];B[gi];
+W[tt];B[ga];W[tt];B[hb];W[tt];B[ic];W[tt];B[ie];W[tt];B[hf];W[tt];
+B[dg];W[tt];B[di];W[tt];B[gg];W[tt];B[fh];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/crazy-gnu.sgf b/regression/games/olympiad2006/9x9/crazy-gnu.sgf
new file mode 100644 (file)
index 0000000..4b3ad7e
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+PW[GNU Go 3.7.10]
+PB[CrazyStone]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+RE[B+6.5]
+;B[ee];W[cf];B[df];W[dg];B[ce];W[bf];B[eg];W[gc];B[dh];W[be];B[cd];
+W[cg];B[eh];W[bd];B[cc];W[bc];B[cb];W[ch];B[hd];W[bb];B[gd];W[ca];
+B[da];W[ba];B[db];W[di];B[gg];W[ei];B[hg];W[fh];B[fg];W[gh];B[hc];
+W[hh];B[ig];W[ih];B[fd];W[tt];B[ff];W[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-ajago.sgf b/regression/games/olympiad2006/9x9/gnu-ajago.sgf
new file mode 100644 (file)
index 0000000..55e0d00
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+CA[ASCII]
+GC[AjaGo is symmetrical player and passes when he cannot play symmetry.
+]
+RE[B+74.5]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[AjaGo]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+;B[fd];W[df];B[fg];W[dc];B[cg];W[gc];B[fc];W[dg];B[gb];W[ch];B[dd];
+W[ff];B[gf];W[cd];B[ee];W[tt];B[cc];W[gg];B[hg];W[bc];B[cb];W[gh];
+B[fh];W[db];B[bd];W[hf];B[ge];W[ce];B[bb];W[hh];B[ef];W[ed];B[de];
+W[tt];B[cf];W[gd];B[bh];W[hb];B[he];W[be];B[bf];W[hd];B[if];W[ad];
+B[af];W[id];B[ha];W[bi];B[dh];W[fb];B[eb];W[eh];B[ga];W[ci];B[eg];
+W[ec];B[fa];W[di];B[ei];W[ea];B[da];W[fi];B[eh]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-akebono.sgf b/regression/games/olympiad2006/9x9/gnu-akebono.sgf
new file mode 100644 (file)
index 0000000..9592a3e
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+RE[B+74.5]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[Akebono]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-28]
+;B[gc];W[cg];B[ee];W[gg];B[cd];W[ge];B[cf];W[dc];B[cc];W[cb];B[eb];
+W[bg];B[bf];W[bc];B[db];W[fd];B[dg];W[ca];B[dh];W[bd];B[ab];W[dd];
+B[ce];W[fc];B[fb];W[de];B[df];W[fe];B[hd];W[ef];B[hf];W[gf];B[he];
+W[fh];B[hg];W[hh];B[eg];W[ed];B[fg];W[gh];B[bb];W[ei];B[ff];W[ih];
+B[eh];W[hi];B[fi];W[gi];B[ee];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-atarist.sgf b/regression/games/olympiad2006/9x9/gnu-atarist.sgf
new file mode 100644 (file)
index 0000000..98b7a1b
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+RE[B+32.5]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[Atarist]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+;B[ee];W[df];B[ef];W[dg];B[cd];W[de];B[dd];W[ed];B[fd];W[ec];B[fc];
+W[eb];B[fb];W[cb];B[db];W[dc];B[cc];W[da];B[bb];W[fe];B[ff];W[bd];
+B[bc];W[fa];B[gb];W[eg];B[ba];W[ge];B[gf];W[hf];B[gg];W[gh];B[hg];
+W[fg];B[hh];W[hd];B[ca];W[hb];B[db]
+(;W[be]C[Correct branch.
+];B[if];W[he];B[hc];W[ic];B[gc];W[cb];B[ha];
+W[ib];B[db];W[hi];B[ea];W[bg];B[fh];W[gi];B[fi];W[bh];B[ce];W[ei];
+B[ii];W[cf];B[eh];W[dh];B[di];W[ci];B[ad];W[ae];B[ac];W[ig];B[ei];
+W[ec];B[eb];W[gi];B[gh];W[ab];B[ga];W[ia];B[gd];W[ai];B[tt];W[ah];
+B[tt];W[ie];B[ih];W[id];B[if];W[tt];B[tt])
+
+(;W[ce]
+C[This was a mistake from the operator who played a wrong move. So after concertation with the opponent and the referee, this branch was undone and the correct game finished, with 5 more minutes for the opponent (10 min for GNU 15 for Atarist)
+]
+;B[if];W[he];B[hc];W[ic];B[gc];W[cb];B[ha];W[ib];B[db];W[hi];B[ea];
+W[bg];B[fh];W[ig];B[fi];W[ih];B[ed];W[ie];B[be])
+
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-aya.sgf b/regression/games/olympiad2006/9x9/gnu-aya.sgf
new file mode 100644 (file)
index 0000000..a2b7274
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[W+3.5]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[Aya]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-26]
+;B[fd];W[de];B[ef];W[ec];B[cg];W[cc];B[gf];W[df];B[dg];W[gc];B[be];
+W[gd];B[ee];W[he];B[fc];W[fb];B[hf];W[ed];B[ge];W[fe];B[ff];W[bd];
+B[ce];W[ae];B[af];W[cd];B[hd];W[hc];B[ie];W[bf];B[cf];W[ag];B[dd];
+W[bh];B[ch];W[bg];B[bi];W[dc];B[ah];W[ai];B[ci];W[ad];B[ic];W[ib];
+B[id];W[ha];B[fd];W[de];B[ah];W[if];B[ig];W[af];B[ai];W[ea];B[fe];
+W[fc];B[df];W[dd];B[tt];W[ga];B[tt];W[db];B[tt];W[ca];B[tt];W[bb];
+B[tt];W[aa];B[tt];W[ac];B[tt];W[fh];B[tt];W[hh];B[ih];W[eh];B[hi];
+W[gi];B[hg];W[gh];B[tt];W[dh];B[tt];W[ii];B[tt];W[hi];B[tt];W[da];
+B[tt];W[gb];B[tt];W[ia];B[tt];W[hb];B[tt];W[ba];B[tt];W[ab];B[tt];
+W[fa];B[tt];W[eb];B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-crazy.sgf b/regression/games/olympiad2006/9x9/gnu-crazy.sgf
new file mode 100644 (file)
index 0000000..eb1ace8
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[CrazyStone]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-28]
+RE[W+1.5]
+;B[ee];W[ff];B[gg];W[ge];B[fg];W[ef];B[eg];W[df];B[ch];W[ce];B[cc];
+W[dc];B[cb];W[cd];B[ed];W[eb];B[hf];W[fc];B[hd];W[bd];B[gb];W[he];
+B[ie];W[gd];B[hc];W[gc];B[bf];W[cg];B[bg];W[hb];B[ib];W[gf];B[ha];
+W[hg];B[if];W[ae];B[fb];W[dg];B[ec];W[id];B[ic];W[gh];B[hh];W[eh];
+B[ig];W[fh];B[hg];W[bh];B[dd];W[dh];B[gi];W[fi];B[hi];W[bc];B[bb];
+W[ac];B[ab];W[de];B[ea];W[ci];B[db];W[bi];B[fd];W[tt];B[fe];W[tt];
+B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-int.sgf b/regression/games/olympiad2006/9x9/gnu-int.sgf
new file mode 100644 (file)
index 0000000..f3852c6
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[3]
+SZ[9]BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[Go Intellect]
+GN[GNU Go 3.7.10 Random Seed 1148589363 level 15]
+DT[2006-05-25]
+KM[6.5]HA[0]RU[Japanese]AP[GNU Go:3.7.10]
+RE[B+2.5]
+;B[fe];W[dc];B[de];W[gc];B[gf];W[fg];B[dg];W[ef];B[ee];W[df];B[cf];
+W[eh];B[gh];W[cg];B[ch];W[bg];B[bh];W[ag];B[dh];W[ce];B[cd];W[bf];
+B[eg];W[ff];B[fh];W[bd];B[gd];W[dd];B[fc];W[gg];B[hg];W[cf];B[he];
+W[eb];B[fb];W[fa];B[ga];W[ea];B[gb];W[ah];B[ec];W[db];B[bi];W[ed];
+B[fd];W[ai];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-jimmy.sgf b/regression/games/olympiad2006/9x9/gnu-jimmy.sgf
new file mode 100644 (file)
index 0000000..dabeb1e
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]CA[ASCII]AP[GoGui:0.9]SZ[9]KM[6.5]PB[GNU Go 3.7.10 lev 16]PW[Jimmy]
+DT[2006-05-28]RE[B+14.5]
+;B[ee];W[gd];B[ec];W[cf];B[gf];W[fc];B[df];W[ed];B[dd];W[fd]
+;B[cg];W[ce];B[de];W[eb];B[bc];W[dc];B[cc];W[cb];B[bg];W[bb]
+;B[he];W[ac];B[be];W[hd];B[ad];W[ab];B[id];W[ic];B[ie];W[hc]
+;B[ge];W[fe];B[ff];W[bd];B[cd];W[ae];B[af];W[];B[])
diff --git a/regression/games/olympiad2006/9x9/gnu-king.sgf b/regression/games/olympiad2006/9x9/gnu-king.sgf
new file mode 100644 (file)
index 0000000..82e329b
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[GoKing]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+RE[W+1.5]
+;B[ee];W[dg];B[cf];W[gg];B[eg];W[df];B[ef];W[ge];B[de];W[fc];B[dh];
+W[dc];B[bd];W[bb];B[fh];W[gh];B[gi];W[hi];B[fi];W[ih];B[bc];W[cg];
+B[cb];W[db];B[ba];W[bf];B[ce];W[cc];B[ca];W[ab];B[ac];W[ch];B[be];
+W[ag];B[ci];W[bi];B[ah];W[bh];B[ae];W[da];B[aa];W[di];B[eh];W[af];
+B[bg];W[fd];B[ed];W[ec];B[ff];W[gf];B[fe];W[cd];B[dd];W[ci];B[fg];
+W[hd];B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-mango.sgf b/regression/games/olympiad2006/9x9/gnu-mango.sgf
new file mode 100644 (file)
index 0000000..d92344c
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[B+time]
+BR[]WR[]
+PB[GNU Go 3.7.10]
+PW[Mango]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+;B[ee];W[gg];B[eg];W[gd];B[fc];W[ef];B[df];W[ff];B[de];W[dg];B[cg];
+W[dh];B[eh];W[cc];B[gc];W[ci];B[ch];W[hc];B[hb];W[he];B[bd];W[ed];
+B[fd];W[fe];B[ic];W[id];B[hd];W[ge];B[bc];W[hc];B[cb];W[ib];B[ha];
+W[ec];B[fb];W[eb];B[ea];W[da];B[fa];W[gb];B[ga];W[bb];B[db];W[dc];
+B[ca];W[be];B[ae];W[cd];B[bf];W[ac];B[ce];W[fh];B[fi];W[gi];B[ei];
+W[di];B[bi]
+)
diff --git a/regression/games/olympiad2006/9x9/gnu-neurogo.sgf b/regression/games/olympiad2006/9x9/gnu-neurogo.sgf
new file mode 100644 (file)
index 0000000..a00d98d
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]CA[ASCII]AP[GoGui:0.9]SZ[9]KM[6.5]PB[GNU Go 3.7.10 level 16]PW[Neurogo]
+DT[2006-05-28]RE[B+6.5]
+;B[ee];W[dg];B[gg];W[ec];B[ce];W[gd];B[bg];W[cc];B[ff];W[hf]
+;B[hg];W[cg];B[be];W[bh];B[af];W[fh];B[ah];W[bi];B[gh];W[cd]
+;B[he];W[ge];B[gf];W[hd];B[if];W[eg];B[fi];W[ef];B[fe];W[de]
+;B[dd];W[df];B[ed];W[fc];B[bd];W[bc];B[dc];W[db];B[di];W[cf]
+;B[bf];W[gi];B[ch];W[dh];B[ei];W[hi];B[hh];W[ci];B[ii];W[gi]
+;B[hi];W[ad];B[fg];W[ac];B[eh];W[ae];B[ch];W[id];B[ie];W[fd]
+;B[])
diff --git a/regression/games/olympiad2006/9x9/int-gnu.sgf b/regression/games/olympiad2006/9x9/int-gnu.sgf
new file mode 100644 (file)
index 0000000..2c1a684
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[B+48.5]
+SO[]
+EV[Olympiad 2006]
+BR[]WR[]
+PB[Go Intellect]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-25]
+;B[gd];W[cg];B[fg];W[dc];B[cf];W[cd];B[dg];W[bg];B[bf];W[af];B[ae];
+W[dh];B[eg];W[cb];B[fb];W[bc];B[de];W[bi];B[ah];W[ag];B[bd];W[ba];
+B[ab];W[ac];B[da];W[di];B[eh];W[ei];B[fi];W[bh];B[db];W[tt];B[ec];
+W[tt];B[be];W[tt];B[dd];W[tt];B[bb];W[tt];B[cc];W[tt];B[ca];W[tt];
+B[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/jimmy-gnu.sgf b/regression/games/olympiad2006/9x9/jimmy-gnu.sgf
new file mode 100644 (file)
index 0000000..6499c41
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]CA[ASCII]AP[GoGui:0.9]SZ[9]KM[6.5]PB[Jimmy]PW[GNU Go 3.7.10 lev 16]
+DT[2006-05-28]RE[W+19.5]
+;B[ee];W[df];B[ec];W[fg];B[ge];W[cc];B[de];W[ce];B[gg];W[ef]
+;B[gf];W[db];B[gc];W[ga];B[fb];W[fa];B[eb];W[ea];B[dc];W[cb]
+;B[cd];W[bd];B[dd];W[be];B[fh];W[eh];B[gh];W[ei];B[bg];W[hb]
+;B[ch];W[cf];B[hc];W[ib];B[ic];W[ff];B[fi];W[gb];B[fd];W[fe]
+;B[da];W[ca];B[];W[])
diff --git a/regression/games/olympiad2006/9x9/king-gnu.sgf b/regression/games/olympiad2006/9x9/king-gnu.sgf
new file mode 100644 (file)
index 0000000..a220eef
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+BR[]WR[]
+PB[GoKing]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+RE[B+8.5]
+;B[fe];W[de];B[dd];W[ee];B[ff];W[ed];B[bd];W[fd];B[dc];W[ce];B[eg];
+W[be];B[cg];W[cd];B[gd];W[ec];B[gc];W[fb];B[ae];W[af];B[bf];W[ag];
+B[ah];W[ad];B[bg];W[hb];B[gb];W[ga];B[hc];W[ae];B[bi];W[df];B[dg];
+W[fc];B[ha];W[ia];B[db];W[ic];B[he];W[ef];B[bc];W[bb];B[id];W[ha];
+B[cc];W[ab];B[ib];W[ca];B[fa];W[ea];B[ga];W[da];B[fg];W[cf];B[eb];
+W[ac];B[tt];W[tt]
+)
diff --git a/regression/games/olympiad2006/9x9/mango-gnu.sgf b/regression/games/olympiad2006/9x9/mango-gnu.sgf
new file mode 100644 (file)
index 0000000..e1a85ee
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+CA[ASCII]
+RE[W+time]
+BR[]WR[]
+PB[Mango]
+PW[GNU Go 3.7.10]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+DT[2006-05-27]
+;B[ee];W[cg];B[gc];W[cd];B[gg];W[ec];B[eg];W[fd];B[ff];W[gd];B[dc];
+W[dd];B[ed];W[fc];B[hd];W[hc];B[gb];W[he];B[cf];W[bf];B[be];W[ce]
+)
diff --git a/regression/games/olympiad2006/9x9/neurogo-gnu.sgf b/regression/games/olympiad2006/9x9/neurogo-gnu.sgf
new file mode 100644 (file)
index 0000000..5b0ac3e
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[3]
+CA[ASCII]
+SO[]
+EV[Olympiad 2006]
+AP[GoGui:0.9]SZ[9]KM[6.5]
+PB[neurogo]
+PW[GNU Go 3.7.10 lev 16]
+DT[2006-05-28]
+RE[W+11.5]
+;B[df];W[ed];B[gg];W[cd];B[cf];W[ge];B[gf];W[he];B[dc];W[dd];B[cc];
+W[ec];B[bd];W[db];B[bc];W[ff];B[fg];W[ef];B[eg];W[ih];B[fb];W[eb];
+B[gb];W[hf];B[hc];W[hg];B[gh];W[fc];B[hd];W[gd];B[fa];W[hh];B[ce];
+W[ha];B[id];W[hb];B[gc];W[ib];B[fe];W[ee];B[cb];W[hi];B[da];W[ea];
+B[ca];W[gi];B[fi];W[ei];B[eh];W[di];B[de];W[fd];B[dh];W[fh];B[ci];
+W[fi];B[bh];W[tt]
+)
diff --git a/regression/games/owl01.sgf b/regression/games/owl01.sgf
new file mode 100644 (file)
index 0000000..ac59bdb
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]
+SZ[19];
+AW[fa][ka][la][sa][fb][gb][jb][kb][lb][sb][cc][dc][fc][hc][jc][mc][oc][qc][sc][ad][bd][cd][ed][fd][kd][md][od][qd][sd][ae][ce][ee][je][ke][le][me][ne][oe][pe][qe][re][se][ef][ff][jf][ag][bg][dg][eg][hg][jg][pg][ah][bh][ch][eh][ih][jh][ph][qh][bi][ei][fi][gi][ji][ki][pi][gj][kj][oj][rj][kk][lk][pk][qk][rk][sk][ml][nl][ol][pl][rl][hm][nm][rm][gn][hn][in][qn][rn][ho][jo][oo][po][qo][so][gp][hp][ip][kp][lp][qp][rp][cq][hq][jq][lq][mq][cr][ir][nr][bs][is][ms][ns][os]
+AB[ga][ha][ia][ja][ma][na][pa][ra][hb][ib][mb][nb][ob][pb][qb][rb][gc][ic][nc][pc][rc][gd][id][jd][nd][pd][rd][fe][ge][ie][gf][if][qf][fg][gg][ig][qg][rg][dh][fh][gh][hh][rh][ai][ci][di][hi][ii][qi][ri][si][aj][bj][dj][ej][fj][hj][jj][pj][qj][sj][ck][fk][gk][ik][jk][bl][el][hl][kl][ll][ql][dm][fm][gm][im][jm][mm][om][pm][qm][cn][en][fn][jn][nn][on][pn][do][fo][go][ko][lo][mo][no][dp][ep][fp][mp][op][pp][sp][eq][gq][nq][oq][qq][rq][sq][dr][fr][hr][or][pr][cs][ds][hs][ps]
+PL[W];W[bo]
+)
diff --git a/regression/games/owl02.sgf b/regression/games/owl02.sgf
new file mode 100644 (file)
index 0000000..7fb6f6d
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.105 load and print]
+HA[5]AB[pd][dp][dd][pp][jj]
+KM[0.5]
+GN[GNU Go 2.7.105 load and print Random Seed 959711175]
+PL[B]
+AW[ab][eb][pb][bc][fc][jc][oc][pc][bd][cd][gd][hd][ld][nd][de][he][bf][cf][ef][ff][hf][fg][ig][qg][dh][fh][gh][mh][oh][qh][di][gi][ii][ej][bl][bm][fm][hm][jm][cn][en][bo][ho][ro][bp][hq][pq][qq][rq][er][gr][or][pr][rr]
+AB[bb][db][qb][cc][dc][qc][ed][fd][fe][ge][gf][lf][nf][pf][qf][bg][cg][dg][eg][gg][hg][ch][eh][lh][bi][fi][li][aj][cj][fj][mj][oj][qj][bk][ck][ek][gk][hk][ik][al][qm][rn][no][qo][np][rp][bq][cq][fq][jq][lq][mq][oq][fr][nr]
+)
diff --git a/regression/games/owl03.sgf b/regression/games/owl03.sgf
new file mode 100644 (file)
index 0000000..904c11a
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.108 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.108 load and print Random Seed 959917915] 
+AW[da][ab][bb][cb][eb][dc][ec][kd][ge][he][ie][je][ke][le][gf][mf][nf][of][dg][eg][fg][gg][pg][eh][ih][oh][ci][di][gi][ii][li][ni][pi][dj][gj][jj][kj][nj][pj][ck][gk][jk][mk][ok][cl][el][gl][nl][cm][fm][im][mm][om][dn][in][kn][ln][nn][sn][eo][fo][io][mo][ro][so][ep][np][qp][sp][eq][fq][iq][lq][mq][oq][qq][rq][dr][ir][nr][or][rr][cs][ds][fs][rs]
+AB[fa][fb][gb][bc][cc][fc][hc][jc][kc][lc][ad][dd][ed][gd][hd][id][jd][nd][pd][be][ce][de][fe][oe][qe][df][ef][ff][kf][pf][rf][cg][jg][lg][qg][ch][dh][fh][gh][hh][jh][kh][qh][bi][ei][fi][hi][qi][bj][fj][hj][qj][bk][ik][kk][pk][qk][bl][kl][bm][jm][km][pm][rm][sm][cn][jn][on][rn][co][jo][ko][no][oo][po][qo][dp][kp][pp][cq][dq][kq][pq][ar][cr][jr][lr][pr][qr][bs][ks]
+PL[W]
+IL[gc][fd][ee][pe][qf][kg][kr][as]
+)
diff --git a/regression/games/owl04.sgf b/regression/games/owl04.sgf
new file mode 100644 (file)
index 0000000..935fcb1
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.110 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.110 load and print Random Seed 960079332] 
+AW[da][fa][ab][cb][db][eb][fb][hb][mb][bc][dc][gc][hc][mc][ad][bd][jd][md][be][ce][ge][he][je][ne][cf][df][hf][lf][mf][of][sf][dg][gg][hg][ig][mg][ng][og][pg][sg][gh][ph][qh][rh][sh][ci][ei][fi][hi][ii][cj][ej][hj][nj][oj][sj][ck][fk][hk][kk][lk][mk][pk][qk][rk][el][gl][jl][kl][nl][ql][sl][dm][em][fm][gm][im][nm][qm][gn][in][mn][on][rn][sn][fo][io][jo][mo][no][oo][so][cp][dp][fp][gp][hp][lp][dq][eq][jq][lq][mq][qq][sq][dr][lr][nr][qr][cs][ds][ms][os][ps]
+AB[ga][ha][ia][ma][gb][ib][lb][nb][cc][ec][fc][ic][kc][nc][pc][cd][dd][fd][id][kd][nd][ae][de][fe][ie][ke][oe][pe][qe][re][se][af][bf][ef][gf][jf][kf][pf][rf][bg][cg][eg][fg][jg][lg][qg][rg][ch][dh][eh][hh][ih][jh][mh][oh][bi][ki][li][ni][oi][pi][bj][jj][mj][pj][qj][rj][bk][dk][ik][jk][cl][dl][hl][il][ll][cm][hm][jm][km][mm][pm][bn][dn][en][fn][hn][kn][ln][pn][qn][co][eo][ho][ko][lo][qo][ro][bp][ep][kp][mp][np][pp][qp][rp][sp][bq][cq][nq][oq][rq][cr][or][pr][rr][bs]
+PL[B]
+IL[ea][ac][nf][sk][fl][nn][mr][ns]
+)
diff --git a/regression/games/owl05.sgf b/regression/games/owl05.sgf
new file mode 100644 (file)
index 0000000..0d01715
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.149 ascii]HA[0]KM[5.5]GN[GNU Go 2.7.149 ascii Random Seed 965394894] 
+;B[dp];W[pd];B[dd];W[op];B[dj];W[ic];B[jp];W[fc];B[pj];W[cf]
+;B[ce];W[lq];B[kq];W[qo];B[ql];W[qf];B[qg];W[pg];B[qh];W[on]
+;B[qn];W[ol];B[jj];W[nk];B[rf];W[pe];B[re];W[hp];B[hq];W[dn]
+;B[cn];W[cm];B[co];W[dh];B[dl];W[gq];B[dm];W[bm];B[bn];W[bk]
+;B[bj];W[en];B[cj];W[dr];B[fq];W[cq];B[gr];W[iq];B[fp];W[hr]
+;B[fr];W[go];B[gp];W[bp];B[br];W[hn];B[fn];W[fo];B[fm];W[ep]
+;B[eq];W[eo];B[hq];W[an];B[dq];W[cr];B[bq];W[ap];B[cp];W[bs]
+;B[gq];W[er];B[ir];W[jr];B[hs];W[ip];B[jq];W[kr];B[io];W[ho]
+;B[jn];W[fs];B[im];W[lo];B[hm];W[jo];B[ko];W[lm];B[in];W[ee]
+;B[dc];W[ef];B[em];W[rc];B[gn];W[ck];B[dk];W[ar];B[do];W[lj]
+;B[bf];W[hj];B[ih];W[if];B[gh];W[ii];B[ji];W[hh];B[hg];W[hi]
+;B[ig];W[hf];B[fh];W[jh];B[gg];W[kh];B[jg];W[rn];B[qp];W[pq]
+;B[ro];W[po];B[rm];W[rp];B[sn];W[rq];B[cg];W[dg];B[df];W[eg]
+;B[ei];W[jl];B[ik];W[ch];B[bh];W[eb];B[db];W[es];B[ld];W[pk]
+;B[qk];W[da];B[ca];W[ea];B[cb];W[lb];B[nd];W[nb];B[jf];W[nc]
+;B[jd];W[mf];B[lf];W[mc];B[md];W[me];B[mg];W[mh];B[nf];W[hk]
+;B[il];W[fk];B[ci];W[ng];B[lg];W[ne];B[nh];W[of];B[lh];W[mi]
+;B[ki];W[oh];B[kk];W[jm];B[lk];W[pi];B[qi];W[od];B[le];W[kl]
+;B[ll];W[ml];B[ln];W[km];B[lp];W[mq];B[mo];W[mm];B[li];W[mj]
+;B[np];W[nq];B[ie];W[ge];B[he];W[jk];B[kj];W[gf];B[hd];W[ib]
+;B[gc];W[gb];B[hc];W[gd];B[ak];W[cl];B[kc];W[rd];B[qe];W[ph]
+;B[pf];W[oj];B[qj];W[qf];B[qd];W[qc];B[pf];W[pl];B[qf];W[pm]
+;B[ed];W[fd];B[kb];W[se];B[sf];W[sd];B[ff];W[fg];B[ja];W[hb]
+;B[ec];W[al];B[aj];W[sp];B[so];W[js];B[ia];W[nn];B[ha];W[no]
+;B[ga];W[fb];B[fa];W[mp];B[eh];W[bo];B[de];W[fe];B[di];W[qm]
+;B[rl];W[la];B[jb];W[gs];B[jc];W[kn];B[lo];W[lc];B[id];W[mn]
+;B[ff];W[mk];B[kg];W[ka];B[is];W[ls];B[tt];W[pn];B[rn];W[tt]
+;B[tt];W[tt]
+)
diff --git a/regression/games/owl06.sgf b/regression/games/owl06.sgf
new file mode 100644 (file)
index 0000000..ac897d0
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[9]
+PB[ingwa]
+PW[ingwa]
+KM[5.5]US[bump@localhost.localdomain]PC[NNGS]
+DT[2000-08-06]
+BR[6k]WR[6k];AW[eb][cc][dc][ad][bd]AB[cb][ac][bc]
+)
diff --git a/regression/games/owl07.sgf b/regression/games/owl07.sgf
new file mode 100644 (file)
index 0000000..4e84c18
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.156 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.156 load and print Random Seed 967103642] 
+AW[qa][ra][bb][db][eb][fb][nb][ob][pb][qb][cc][dc][gc][hc][mc][nc][fd][gd][hd][nd][ce][oe][jf][of][pf][qf][dg][eg][gg][ig][kg][lg][pg][rg][bh][ch][eh][fh][jh][kh][mh][nh][qh][ai][bi][di][ii][li][ni][qi][ri][aj][ej][fj][hj][ij][lj][oj][pj][gk][ik][mk][el][gl][nl][pl][ql][em][hm][om][dn][en][gn][in][mn][nn][on][eo][ho][io][mo][po][qo][dp][ep][fp][hp][ip][kp][pp][rp][gq][hq][jq][kq][mq][ir][lr][mr][nr][or][is][ps]
+AB[ca][oa][gb][hb][lb][rb][bc][ec][fc][ic][lc][qc][sc][ad][cd][dd][ed][jd][kd][md][od][pd][rd][fe][ge][he][ie][je][le][me][ne][pe][qe][cf][ef][ff][kf][rf][sf][fg][mg][ng][og][oh][ph][sh][ci][mi][pi][bj][cj][dj][qj][rj][ak][ck][ek][hk][jk][qk][dl][hl][il][jl][rl][cm][dm][im][km][mm][qm][rm][cn][jn][kn][ln][qn][co][do][lo][no][ro][cp][lp][mp][np][qp][dq][eq][fq][lq][oq][pq][qq][fr][gr][hr][jr][kr][qr][hs][qs]
+PL[W]
+IL[rc][id][ld][qd][ke][dk][jm]
+)
diff --git a/regression/games/owl08.sgf b/regression/games/owl08.sgf
new file mode 100644 (file)
index 0000000..7f5a7dc
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.157 load and print]HA[9]KM[0.5]GN[GNU Go 2.7.157 load and print Random Seed 967304427] 
+AW[cc][dc][nc][oc][pc][cd][qd][pe][qe][bo][po][cp][np][qp][cq][pq][qq][br][cr][dr]
+AB[nb][pb][qb][mc][dd][ed][jd][pd][ce][dg][pg][rg][dj][jj][pj][cm][qm][bn][co][qo][dp][jp][lp][pp][rp][dq][er][ds]
+PL[B]
+
+)
diff --git a/regression/games/owl09.sgf b/regression/games/owl09.sgf
new file mode 100644 (file)
index 0000000..ae804af
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.157 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.157 load and print Random Seed 967351042] 
+AW[ma][qa][ra][bb][lb][mb][pb][qb][bc][gc][kc][lc][nc][oc][bd][cd][gd][hd][id][md][od][de][ee][ge][he][me][ne][oe][re][ef][ff][hf][lf][mf][of][sf][eg][hg][ig][lg][ng][rg][ch][dh][ih][lh][nh][qh][ei][hi][ji][ki][mi][pi][dj][ij][jj][lj][mj][ak][dk][jk][lk][nk][al][bl][el][il][ml][rl][bm][cm][dm][fm][jm][om][dn][en][gn][hn][jn][nn][on][pn][co][ho][jo][ko][lo][mo][no][po][cp][gp][hp][ip][np][rp][dq][fq][gq][iq][jq][kq][mq][nq][qq][cr][dr][jr][mr][qr][ms][ns][os]
+AB[ba][ka][la][cb][gb][hb][jb][kb][rb][sb][cc][dc][fc][hc][ic][jc][pc][qc][rc][dd][ed][fd][jd][kd][ld][pd][be][ce][fe][ie][ke][pe][df][if][kf][pf][qf][rf][cg][jg][kg][og][bh][jh][kh][oh][sh][ci][oi][qi][ri][aj][bj][cj][kj][oj][pj][sj][bk][ck][kk][ok][qk][rk][sk][cl][dl][gl][kl][ll][nl][ol][pl][ql][gm][km][mm][nm][pm][fn][kn][ln][mn][qn][eo][fo][go][oo][qo][ro][dp][ep][fp][jp][kp][lp][op][pp][qp][eq][hq][lq][pq][er][fr][gr][hr][ir][kr][lr][nr][or][pr][rr][cs][ds][js][ks][qs]
+PL[W]
+IL[si][pk][lm]
+)
diff --git a/regression/games/owl10.sgf b/regression/games/owl10.sgf
new file mode 100644 (file)
index 0000000..901ce90
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.164 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.164 load and print Random Seed 968546496] 
+AW[da][la][eb][lb][mb][dc][ec][hc][kc][mc][nc][dd][fd][id][jd][de][he][ef][ff][gf][if][jf][lf][mf][dg][ig][kg][ng][pg][bh][ch][eh][hh][kh][lh][nh][oh][ci][di][hi][ii][ji][mi][oi][pi][qi][fj][gj][jj][mj][oj][pj][dk][ek][gk][ok][cl][fl][hl][am][bm][hm][sm][gn][jn][rn][sn][go][io][jo][oo][qo][ro][gp][ip][pp][qp][bq][fq][hq][iq][lq][mq][oq][br][cr][dr][hr][lr][nr][or]
+AB[ma][na][cb][db][nb][ob][cc][fc][oc][cd][nd][od][qd][ce][ie][je][ke][le][me][cf][df][hf][nf][of][pf][qf][bg][cg][eg][fg][gg][hg][og][fh][jh][ph][qh][rh][bi][ei][fi][gi][ki][ni][ri][cj][dj][ej][hj][ij][kj][nj][qj][bk][hk][ik][jk][mk][nk][pk][qk][il][kl][ol][rl][sl][im][jm][lm][rm][bn][cn][en][hn][in][kn][nn][pn][qn][ho][ko][no][po][bp][dp][hp][jp][lp][mp][np][op][cq][kq][nq][kr]
+PL[W]
+IL[jl][km][kp]
+)
diff --git a/regression/games/owl11.sgf b/regression/games/owl11.sgf
new file mode 100644 (file)
index 0000000..465980e
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+SZ[19]KM[5.5]
+PW[GnuGo]
+WR[17k*]
+PB[kinchan]
+BR[17k*]
+DT[2000-09-09]
+SY[Cgoban 1.9.2];B[pd];W[dp];B[qp];W[dd];B[oq];W[qj];B[qg];W[qm];B[jq]
+;W[dj];B[fq];W[cn];B[fc];W[df];B[db];W[hc];B[cc];W[ec];B[eb];W[fd];
+B[dc];W[nc];B[kc];W[ke];B[ld];W[pb];B[qc];W[lb];B[nd];W[er];B[oc];
+W[qb];B[rc];W[kb];B[ob];W[jo];B[lp];W[ln];B[cd];W[og];B[pf];W[ed];
+B[mg];W[kg];B[pi];W[fb];B[lf];W[nh];B[kf];W[jc];B[kd];W[nb];B[oa];
+W[qh];B[pg];W[ph];B[je];W[qi];B[jg];W[kh];B[jh];W[of];B[oe];W[hg];
+B[ki];W[oi];B[fr];W[eq];B[hp];W[io];B[ml];W[kl];B[pj];W[pk];B[oj];
+W[nk];B[nj];W[mj];B[ni];W[mh];B[ok];W[ol];B[nl];W[mi];B[lh];W[nn];
+B[lk];W[ro];B[rp];W[jj];B[kj];W[rg];B[rf];W[fp];B[cf];W[cg];B[qo];
+W[eg];B[ce];W[rn];B[ho];W[fs];B[gr];W[oo];B[pn];W[np];B[nq];W[kp];
+B[om];W[lq];B[mq];W[kk];B[lj];W[lr];B[mp];W[kq];B[jr];W[os];B[mo];
+W[mn];B[kn];W[jm];B[jn];W[in];B[km];W[kr];B[lm];W[il];B[hl];W[ll];
+B[mm];W[nm];B[mk];W[he];B[hi]
+)
+
diff --git a/regression/games/owl12.sgf b/regression/games/owl12.sgf
new file mode 100644 (file)
index 0000000..ec5efe6
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.169 load and print]
+HA[0]KM[5.5]
+GN[GNU Go 2.7.169 load and print Random Seed 969759558]
+PL[W];
+AW[ig][jg][kg][hh][lh][hi][li][hj][ij][lj][hk][lk][hl][ll][hm][lm][hn][in][jn][kn]
+AB[ih][jh][kh][ii][ki][jj][kj][ik][kk][il][im]
+)
diff --git a/regression/games/owl13.sgf b/regression/games/owl13.sgf
new file mode 100644 (file)
index 0000000..9a72f19
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[0.5]
+DT[2000-09-27]
+SY[Cgoban 1.9.10]TM[-];B[pd];W[dd];B[po];W[dp];B[pq];W[qf];B[qh];W[nd]
+;B[oe];W[qc];B[qd];W[pc];B[pg];W[dj];B[of];W[cg];B[fq];W[fp];B[gp];
+W[fo];B[eq];W[dq];B[jq];W[dn];B[fc];W[ec];B[fd];W[id];B[kd];W[ge];
+B[ee];W[pm];B[eg];W[qj];B[fm];W[dl];B[mp];W[go];B[hp];W[fk];B[rd];
+W[gl];B[mc];W[rc];B[nc];W[ob];B[od];W[if];B[md];W[mn];B[ml];W[mj];
+B[mh];W[ri];B[rh];W[nm];B[nk];W[qm];B[oi];W[nj];B[oj];W[gg];B[ok];
+W[dh];B[fh];W[gh];B[ne];W[kj];B[hb];W[ef];B[ff];W[df];B[fe];W[fg];
+B[kl];W[jc];B[kc];W[jb];B[jk];W[ji];B[em];W[kb];B[eb];W[db];B[fb];
+W[gf];B[jn];W[lb];B[da];W[cb];B[lo];W[gm];B[no];W[il];B[ik];W[hj];
+B[ho];W[ro];B[rq];W[er];B[hn];W[gn];B[fr];W[dr];B[lg];W[kh];B[nb];
+W[qp];B[qo];W[rp];B[qq];W[pp];B[op];W[rn];B[qk];W[rl];B[sm];W[rk];
+B[pk];W[kg];B[om];W[on];B[ol];W[oo];B[nn];W[pn];B[sc];W[oa];B[na];
+W[jm];B[km];W[in];B[jo];W[hm];B[hk];W[gk];B[oq];W[lf];B[mf];W[le];
+B[rf];W[ib];B[hc];W[sh];B[sg];W[si];B[ke];W[kf];B[hd];W[pi];B[ph];
+W[qi];B[he];W[ie];B[dm];W[io];B[cm];W[ip];B[jp];W[iq];B[gq];W[jr];
+B[gr];W[kq];B[cn];W[mr];B[ck];W[cj];B[dk];W[bo];B[el];W[en];B[bn];
+W[co];B[bj];W[bi];B[bk];W[an];B[am];W[ao];B[ai];W[ah];B[aj];W[bh];
+B[nr];W[mq];B[nq];W[ns];B[os];W[ms];B[de];W[lk];B[be];W[cd];B[ce];
+W[bc];B[ni];W[ek];B[ll];W[ij];B[je];W[sq];B[sr];W[sp];B[rs];W[jf];
+B[hf];W[lh];B[mg];W[mi];B[hg];W[lp];B[mo];W[kp];B[ig];W[ko];B[kn];
+W[kr];B[gd];W[mb];B[gi];W[hh];B[fi];W[eh];B[ei];W[ma];B[ih];W[hi];
+B[ia];W[ld];B[lc];W[me];B[ja];W[mk];B[ka];W[jl];B[kk];W[pl];B[hl];
+W[im];B[ca];W[bd];B[bb];W[cf];B[bf];W[bg];B[dc];W[jh];B[cc];W[af];
+B[ae];W[ag];B[jj];W[li];B[ql];W[jd];B[oc];W[fn];B[pa];W[pb];B[rb];
+W[fl];B[qb];W[pj];B[ii];W[gj];B[jg];W[ic];B[ha];W[la];B[tt];W[tt]
+)
diff --git a/regression/games/owl14.sgf b/regression/games/owl14.sgf
new file mode 100644 (file)
index 0000000..26a8b73
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[0.5]
+DT[2000-09-27]
+SY[Cgoban 1.9.10]TM[-];B[qc];W[dp];B[dd];W[qq];B[cn];W[cl];B[cq];W[cp]
+;B[dq];W[ep];B[bp];W[bo];B[fq];W[eq];B[er];W[bq];B[bm];W[bl];B[en];
+W[dr];B[cr];W[fr];B[br];W[gq];B[aq];W[fc];B[ds];W[cf];B[ee];W[cc];
+B[cd];W[dc];B[bd];W[ge];B[co];W[ci];B[eg];W[nq];B[fs];W[gr];B[no];
+W[pm];B[mq];W[mr];B[ko];W[qh];B[qk];W[qe];B[ok];W[ic];B[od];W[mc];
+B[of];W[pg];B[ri];W[ei];B[rm];W[el];B[nm];W[pd];B[pc];W[km];B[kk];
+W[jq];B[mp];W[lq];B[gg];W[po];B[op];W[bc];B[oq];W[or];B[io];W[fp];
+B[hn];W[rd];B[rc];W[ol];B[nl];W[oh];B[mf];W[nk];B[pl];W[om];B[il];
+W[jl];B[jk];W[im];B[hl];W[oc];B[hm];W[kf];B[le];W[kl];B[kc];W[ld];
+B[kd];W[nc];B[ke];W[pb];B[qb];W[ob];B[mh];W[oe];B[ni];W[oj];B[pa];
+W[pk];B[ql];W[qj];B[rj];W[mj];B[ne];W[nd];B[kh];W[jf];B[ih];W[hh];
+B[hg];W[lk];B[gi];W[ml];B[on];W[ra];B[rb];W[sc];B[hi];W[if];B[pn];
+W[qm];B[qn];W[ok];B[fj];W[qo];B[ro];W[rp];B[mm];W[so];B[sk];W[rn];
+B[rl];W[jb];B[kb];W[kj];B[hb];W[hc];B[ib];W[jc];B[ja];W[gb];B[ia];
+W[rh];B[jj];W[si];B[sm];W[cm];B[bn];W[pf];B[ki];W[lj];B[al];W[bk];
+B[iq];W[ir];B[hq];W[hr];B[bf];W[df];B[ef];W[bg];B[be];W[ng];B[mg];
+W[nf];B[me];W[qi];B[fm];W[hp];B[ip];W[ad];B[dg];W[cg];B[ag];W[ah];
+B[af];W[dm];B[dk];W[bi];B[dn];W[ek];B[dj];W[dh];B[ej];W[cj];B[fk];
+W[pp];B[ln];W[lp];B[lo];W[hf];B[kp];W[kq];B[go];W[gp];B[fl];W[pq];
+B[np];W[nr];B[fo];W[oi];B[ff];W[fi];B[fd];W[jp];B[jo];W[lm];B[gd];
+W[gc];B[hd];W[id];B[gs];W[je];B[he];W[gf];B[hs];W[kg];B[lg];W[fh];
+B[gh];W[ec];B[li];W[ak];B[am];W[ga];B[is];W[js];B[es];W[lc];B[lb];
+W[mb];B[nj];W[ma];B[mi];W[jm];B[la];W[ig];B[di];W[eh];B[ch];W[bh];
+B[aj];W[dl];B[jh];W[ed];B[de];W[fe];B[fg];W[ck];B[sn];W[ro];B[nh];
+W[og];B[jd];W[lf];B[do];W[eo];B[md];W[oo];B[nn];W[ha];B[ka];W[ho];
+B[in];W[ac];B[sj];W[sh];B[kn];W[ll];B[jn];W[mk];B[ae];W[ie];B[jg];
+W[tt];B[em];W[tt];B[tt]
+)
diff --git a/regression/games/owl15.sgf b/regression/games/owl15.sgf
new file mode 100644 (file)
index 0000000..5611ba7
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]
+US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[rosebud-GnuGo(B) NNGS]
+EV[None]
+RE[W+21.5]
+PW[rosebud]
+WR[15k ]
+PB[GnuGo]
+BR[17k*]PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-10-03]
+SZ[19]TM[600]KM[0.5]HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+C[
+ Tscherkan started observation.
+];W[fc];B[fd];W[gd];B[fe];W[ec];
+B[dc];W[ic];B[df];W[nq];B[np];W[qq];B[mq];W[pq]
+C[
+ bump started observation.
+];B[oq];W[nr];B[or];W[mr]
+)
diff --git a/regression/games/owl16.sgf b/regression/games/owl16.sgf
new file mode 100644 (file)
index 0000000..6babd6b
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.179 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.179 load and print Random Seed 971285664] 
+AW[ic][oc][id][nd][pd][ee][cg][cj][cn][ip][mp][np][pp][jq][lq][oq][qq][rq][ir][lr][mr]
+AB[nb][ec][hc][nc][cd][dd][gd][ld][qk][pn][co][jo][qo][dp][kp][lp][qp][gq][kq][mq][nq][kr]
+PL[W]
+
+)
diff --git a/regression/games/owl17.sgf b/regression/games/owl17.sgf
new file mode 100644 (file)
index 0000000..1c364a0
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.179 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.179 load and print Random Seed 971285907] 
+AW[la][na][bb][db][gb][hb][kb][mb][ob][sb][dc][rc][qd][rd][sd][de][ee][fe][ie][me][re][af][df][if][jf][kf][mf][of][pf][qf][bg][cg][eg][ig][lg][ng][qg][dh][lh][mh][rh][ai][bi][ci][ii][qi][ri][aj][pj][rj][gk][ik][jl][am][cm][dm][gm][lm][nm][om][qm][bn][cn][hn][in][jn][mn][qn][bo][fo][go][oo][po][qo][cp][gp][np][qp][cq][fq][hq][iq][kq][nq][oq][qq][ar][cr][gr][mr][nr][bs][fs]
+AB[ca][ga][cb][fb][ib][lb][nb][qb][rb][ec][gc][hc][jc][lc][nc][pc][qc][bd][dd][fd][id][kd][md][pd][be][ce][ge][he][je][le][ne][pe][qe][bf][cf][gf][gg][ah][fh][kh][oh][ph][qh][ei][ki][li][ni][pi][bj][cj][dj][qj][ak][kk][nk][qk][rk][bl][cl][dl][fl][ml][ol][ql][bm][em][km][mm][pm][rm][fn][ln][rn][co][do][eo][io][ko][mo][no][ro][dp][hp][ip][kp][op][pp][rp][dq][pq][rq][dr][er][fr][or][pr][qr][cs][ds]
+PL[B]
+IL[ma][sc][dg][mg][gq][as]
+)
diff --git a/regression/games/owl18.sgf b/regression/games/owl18.sgf
new file mode 100644 (file)
index 0000000..850b583
--- /dev/null
@@ -0,0 +1,44 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[gnugo 94]
+PB[xgo]
+GN[gnugo 94 (W) vs. xgo (B)]
+DT[2000-11-02]
+SY[Cgoban 1.9.2]TM[10:00:00+1:00/5]
+RE[B+137.5]
+;B[tt]BL[35999];W[ck]WL[36000];B[tt]BL[35998];W[ek]WL[36000];B[tt]
+BL[35997];W[kj]WL[36000];B[dd]BL[35994];W[jc]WL[36000];B[je]BL[35992];
+W[hd]WL[36000];B[kc]BL[35988];W[kb]WL[35996];B[kd]BL[35988];W[ib]
+WL[35994];B[kh]BL[35987];W[cf]WL[35992];B[fc]BL[35985];W[bd]WL[35988];
+B[cc]BL[35984];W[ci]WL[35984];B[ik]BL[35981];W[gk]WL[35976];B[ii]
+BL[35979];W[kl]WL[35971];B[bc]BL[35977];W[ce]WL[35964];B[ff]BL[35968];
+W[fh]WL[35954];B[li]BL[35900];W[gg]WL[35944];B[gf]BL[35897];W[il]
+WL[35936];B[hl]BL[35895];W[jk]WL[35924];B[hk]BL[35884];W[jm]WL[35913];
+B[lk]BL[35785];W[ll]WL[35905];B[lj]BL[35780];W[kk]WL[35896];B[ml]
+BL[35778];W[lm]WL[35886];B[lb]BL[35769];W[fa]WL[35877];B[eb]BL[35760];
+W[hf]WL[35868];B[ka]BL[35747];W[jb]WL[35858];B[em]BL[35745];W[jh]
+WL[35849];B[ji]BL[35738];W[ig]WL[35838];B[ki]BL[35732];W[kg]WL[35790];
+B[lg]BL[31390];W[kf]WL[35744];B[lf]BL[31278];W[ea]WL[35735]
+(;B[ga]BL[31267];W[gb]WL[35719];B[da]BL[31265];W[ha]WL[35714];B[fb]
+BL[31260];W[ga]WL[35711];B[cb]BL[31254];W[la]WL[35703];B[ma]BL[31252];
+W[ja]WL[35695];B[lc]BL[31249];W[la]WL[35688];B[ke]BL[31245];W[ka]
+WL[35678];B[cm]BL[31243];W[mb]WL[35675];B[bl]BL[31237];W[bk]WL[35673];
+B[gj]BL[31231];W[fk]WL[35669];B[fj]BL[31229];W[ej]WL[35665];B[if]
+BL[31218];W[ie]WL[35658];B[jf]BL[31214];W[jg]WL[35652];B[ih]BL[31213];
+W[hg]WL[35645];B[id]BL[31211];W[he]WL[35628];B[fi]BL[31173];W[eh]
+WL[35623];B[de]BL[31168];W[jd]WL[35617];B[gc]BL[31166];W[gi]WL[35604];
+B[hi]BL[31159];W[gh]WL[35601];B[hc]BL[31152];W[ic]WL[35597];B[hb]
+BL[31150];W[ia]WL[35595];B[dg]BL[31141];W[bh]WL[35572];B[cg]BL[31138];
+W[bg]WL[35555];B[cd]BL[31134];W[be]WL[35517];B[ei]BL[29867];W[df]
+WL[35506];B[ef]BL[29859];W[dh]WL[35502];B[eg]BL[29857];W[ma]WL[35470];
+B[mc]BL[29851];W[id]WL[35468];B[di]BL[29847];W[ch]WL[35465];B[dj]
+BL[29846];W[dk]WL[35449];B[hm]BL[29845];W[im]WL[35444];B[cj]BL[29843];
+W[bj]WL[35438];B[hj]BL[29842];W[jj]WL[35434];B[gl]BL[29836];W[fl]
+WL[35432];B[fm]BL[29835];W[al]WL[35431];B[cl]BL[29826];W[mm]WL[35430];
+B[mk]BL[29823];W[bm]WL[35429];B[am]BL[29815];W[ak]WL[35428];B[dm]
+BL[29804];W[bm]WL[35428];B[ad]BL[29801];W[am];B[ae])
+
+(;B[da]BL[31271];W[db]WL[35724])
+
+)
+
diff --git a/regression/games/owl19.sgf b/regression/games/owl19.sgf
new file mode 100644 (file)
index 0000000..4b86d22
--- /dev/null
@@ -0,0 +1,2 @@
+(;GM[1]FF[4]CA[UTF-8]
+SZ[19]RU[Japanese]KM[0]TM[1800,0,30,5]PW[]PB[]AB[na][nb][nc][sc][rd][qd][pd][od][oe][of][ne][mc][md]AW[oa][ob][pc][qc][rc]AB[af][bf][cf][cg][dg][ca][db][dc][dd][de][ee][ef][fe]AW[ae][be][cd][cc][cb])
diff --git a/regression/games/owl20.sgf b/regression/games/owl20.sgf
new file mode 100644 (file)
index 0000000..997a026
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.194 load and print]HA[9]KM[0.5]GN[GNU Go 2.7.194 load and print Random Seed 974408631] 
+AW[ec][fc][mc][gd][md][ge][jf][mg][ri][ql][qn][rn][qo][qp][rp][lq][nq][oq][pq][jr][nr]
+AB[dc][oc][dd][fd][jd][pd][fe][df][pf][rg][cj][dj][jj][mj][pj][co][lo][ro][so][dp][jp][np][pp][sp][fq][qq][rq][or][pr]
+PL[B]
+
+)
diff --git a/regression/games/owl21.sgf b/regression/games/owl21.sgf
new file mode 100644 (file)
index 0000000..3585fdb
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.202 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.202 load and print Random Seed 977075986] 
+AW[pc][qc][qf][dg][dp][jp][np][pp]
+AB[oc][cd][id][pd][qd][ee][qh][ci][qn]
+PL[W]
+
+)
diff --git a/regression/games/owl22.sgf b/regression/games/owl22.sgf
new file mode 100644 (file)
index 0000000..6dc2acb
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.203 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.203 ascii Random Seed 977306572] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[qn];B[pn];W[ql];B[fq];W[dg];B[fd];W[mc];B[me];W[mq];B[mo]
+;W[cm];B[em];W[qq];B[pq];W[qp];B[ce];W[bg];B[co];W[hd];B[hc]
+;W[qi];B[bf];W[ci];B[kd];W[jr];B[od];W[hq];B[dk];W[bk];B[kc]
+;W[qc];B[hf];W[ob];B[or];W[re];B[kp];W[ho];B[qr];W[rr];B[np]
+;W[qj];B[jn];W[ol];B[en];W[pf];B[of];W[og];B[pg];W[qg];B[ph]
+;W[pe];B[oe];W[nh];B[mi];W[mh];B[lh];W[ni];B[mj];W[nj];B[eh]
+;W[eg];B[nm];W[fh];B[pk];W[pm];B[on];W[nl];B[ml];W[ff];B[mr]
+;W[lr];B[ms];W[kq];B[gn];W[ge];B[gr];W[hr];B[lp];W[lq];B[iq]
+;W[ls];B[is];W[ir];B[ic];W[hs];B[gd];W[he];B[gj];W[ei];B[nq]
+;W[if];B[hg];W[je];B[hp];W[le];B[mf];W[lf];B[gi];W[lg];B[mg]
+;W[gp];B[ip];W[gq];B[fr];W[go];B[ld];W[md];B[kh];W[hn];B[gm]
+;W[hm];B[jl];W[hh];B[ig];W[gh];B[hl];W[mk];B[ll];W[lk];B[kj]
+;W[kk];B[rs];W[ik];B[jk];W[sq];B[ih];W[hi];B[il];W[hj];B[cl]
+;W[bl];B[qo];W[ro];B[po];W[lb];B[rn];W[rp];B[pi];W[qm];B[dm]
+;W[bn];B[bo];W[an];B[ao];W[ia];B[gb];W[kb];B[jb];W[ja];B[cn]
+;W[bm];B[ib];W[lc];B[ha];W[ka];B[hk];W[ij];B[fo];W[kl];B[lm]
+;W[km];B[jm];W[ln];B[mm];W[kn];B[sr];W[sn];B[rq];W[rm];B[sp]
+;W[fk];B[fj];W[ej];B[gk];W[ek];B[qk];W[rk];B[ag];W[ah];B[af]
+;W[cg];B[bh];W[ai];B[bi];W[ck];B[dl];W[cj];B[aj];W[di];B[lj]
+;W[ee];B[ed];W[de];B[cf];W[fp];B[ep];W[mn];B[nn];W[jo];B[io]
+;W[ko];B[lo];W[nk];B[in];W[jg];B[jh];W[id];B[kg];W[ke];B[jc]
+;W[jf];B[kf];W[ie];B[gf];W[fe];B[gg];W[df];B[ii];W[so];B[fg]
+;W[fi];B[sq];W[fl];B[fm];W[gs];B[fs];W[ak];B[ch];W[dh];B[ai]
+;W[bj];B[ah];W[cd];B[bd];W[cc];B[bc];W[ad];B[cb];W[om];B[mp]
+;W[jq];B[gl];W[im];B[el];W[tt];B[tt]
+)
diff --git a/regression/games/owl23.sgf b/regression/games/owl23.sgf
new file mode 100644 (file)
index 0000000..05c2bde
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.209 load and print]HA[0]KM[0.0]GN[GNU Go 2.7.209 load and print Random Seed 979097304] 
+AW[ga][fb][gb][kb][lb][ob][rb][fc][lc][nc][pc][qc][hd][id][ld][od][fe][je][ke][le][bf][bg][fg][ch][bi][ci][bj][rj][bk][qk][rk][pl][km][pm][qm][kn][rn][ko][no][kp][op][kq][nq][pq][kr][or][pr][os]
+AB[ea][fa][eb][jb][ec][ic][kc][rc][dd][jd][pd][qd][sd][ie][ne][oe][re][cf][if][jf][kf][lf][mf][of][qf][ng][og][qg][ah][dh][ph][di][ri][cj][dj][jj][pj][qj][ck][bl][ol][cm][om][jn][ln][nn][pn][jo][po][dp][gp][jp][pp][rp][jq][qq][jr][qr][ps][qs]
+PL[B]
+IL[oc][oq]
+)
diff --git a/regression/games/owl24.sgf b/regression/games/owl24.sgf
new file mode 100644 (file)
index 0000000..979c508
--- /dev/null
@@ -0,0 +1,31 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 980071456]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[dp];W[cc];B[qo];W[pd];B[pq];W[cn];B[fp];W[bp];B[cq];W[ck]
+;B[em];W[de];B[qf];W[nd];B[qd];W[qc];B[rc];W[rb];B[qb];W[pc]
+;B[jq];W[rd];B[of];W[qe];B[ic];W[rf];B[ie];W[oo];B[lc];W[nq]
+;B[cg];W[om];B[fc];W[jo];B[hq];W[qh];B[ng];W[lg];B[ql];W[pk]
+;B[bq];W[cp];B[be];W[eb];B[eg];W[fe];B[pf];W[qk];B[io];W[rl]
+;B[nb];W[pb];B[fb];W[ec];B[di];W[ek];B[or];W[qm];B[ab];W[bi]
+;B[gg];W[le];B[cb];W[bg];B[bf];W[ch];B[df];W[in];B[fl];W[ho]
+;B[ip];W[hn];B[fi];W[hi];B[hf];W[jn];B[ag];W[bh];B[ap];W[bo]
+;B[lr];W[do];B[eo];W[bl];B[fk];W[nr];B[hj];W[qr];B[pr];W[rp]
+;B[ro];W[ij];B[rq];W[hk];B[gj];W[mi];B[ao];W[an];B[dq];W[aq]
+;B[dh];W[ef];B[ej];W[gd];B[dk];W[dl];B[dj];W[el];B[gn];W[hh]
+;B[kd];W[fd];B[db];W[gb];B[ea];W[gc];B[dc];W[fa];B[ce];W[hb]
+;B[ib];W[da];B[ha];W[ik];B[bc];W[ji];B[rn];W[lo];B[oh];W[mk]
+;B[cj];W[bj];B[ar];W[ap];B[br];W[oi];B[dm];W[cl];B[hm];W[dd]
+;B[ff];W[ee];B[cd];W[lq];B[mr];W[jf];B[ns];W[mq];B[kq];W[kp]
+;B[ge];W[ig];B[hd];W[je];B[jd];W[go];B[gm];W[fo];B[fn];W[ke]
+;B[ob];W[cm];B[op];W[np];B[po];W[pn];B[rm];W[gh];B[rk];W[sl]
+;B[sk];W[pl];B[fh];W[mc];B[mb];W[ld];B[nc];W[md];B[sm];W[ql]
+;B[gp];W[oa];B[oc];W[od];B[lb];W[if];B[oq];W[na];B[ma];W[pa]
+;B[im];W[jm];B[dn];W[co];B[il];W[jl];B[ca];W[hg];B[ah];W[hc]
+;B[ai];W[aj];B[af];W[ea];B[hp];W[qn];B[jp];W[hl];B[gl];W[ci]
+;B[gk];W[gi];B[ia];W[ga];B[tt];W[tt])
diff --git a/regression/games/owl25.sgf b/regression/games/owl25.sgf
new file mode 100644 (file)
index 0000000..633744a
--- /dev/null
@@ -0,0 +1,13 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.226gf gmp]HA[0]KM[5.5]GN[GNU Go 2.7.226gf gmp Random Seed 0] 
+;B[df];W[ff];B[fd];W[cd];B[dc];W[cc];B[dd];W[bf];B[cf];W[gd]
+;B[ge];W[gf];B[he];W[gc];B[fe];W[eh];B[eg];W[bg];B[fh];W[fc]
+;B[db];W[hd];B[gg];W[eb];B[cg];W[ch];B[cb];W[bb];B[ec];W[fa]
+;B[gb];W[fb];B[ce];W[bd];B[be];W[ae];B[dh];W[bh];B[ad];W[ac]
+;B[hg];W[di];B[hb];W[ei];B[hc];W[id];B[ie];W[da];B[ca];W[fi]
+;B[gi];W[dg];B[ga];W[ib];B[ea];W[fg];B[dh];W[gh];B[hf];W[da]
+;B[hh];W[hi];B[ea];W[ef];B[ee];W[da];B[fh];W[fg];B[ea];W[ff]
+;B[ba];W[da];B[ia];W[ha];B[tt];W[ic];B[ef];W[ab];B[gf];W[fh]
+;B[ci];W[bi];B[dg];W[ih];B[af];W[ag];B[tt];W[gi];B[tt];W[ii]
+;B[ig];W[ci];B[tt];W[ea];B[aa];W[tt];B[tt]
+)
diff --git a/regression/games/owl26.sgf b/regression/games/owl26.sgf
new file mode 100644 (file)
index 0000000..62b92c8
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.227gf3 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.227gf3 ascii Random Seed 986299719] 
+;B[pp];W[dd];B[pd];W[dp];B[cf];W[fd];B[bd];W[ch];B[ef];W[eh]
+;B[gf];W[cc];B[bc];W[ic];B[hd];W[hc];B[gd];W[gc];B[fe];W[qf]
+;B[nc];W[qd];B[qc];W[rc];B[qb];W[re];B[kc];W[qn];B[nq];W[qp]
+;B[qq];W[rq];B[qr];W[ro];B[kq];W[ck];B[fq];W[fp];B[gp];W[fo]
+;B[eq];W[dq];B[qj];W[dn];B[rg];W[po];B[op];W[ee];B[de];W[ed]
+;B[cd];W[cb];B[rm];W[gq];B[hq];W[er];B[fr];W[qg];B[qh];W[ng]
+;B[pe];W[dr];B[gr];W[og];B[qe];W[sf];B[rh];W[nj];B[rf];W[qm]
+;B[ql];W[jb];B[pg];W[nm];B[jc];W[ni];B[dl];W[cl];B[dm];W[cm]
+;B[en];W[em];B[fn];W[fm];B[gn];W[dk];B[do];W[cn];B[ep];W[co]
+;B[eo];W[nn];B[gm];W[ne];B[le];W[lf];B[kf];W[pl];B[qk];W[id]
+;B[he];W[fl];B[lg];W[mf];B[mh];W[oi];B[kh];W[kn];B[pj];W[nk]
+;B[ok];W[kl];B[lk];W[lj];B[kk];W[kj];B[jk];W[jj];B[ik];W[kb]
+;B[lc];W[ph];B[pf];W[im];B[hl];W[bg];B[bf];W[ol];B[pi];W[bb]
+;B[ab];W[rn];B[ml];W[mk];B[ll];W[nl];B[lm];W[jo];B[ln];W[mo]
+;B[lo];W[rl];B[rk];W[sm];B[mi];W[mj];B[hh];W[ie]
+)
diff --git a/regression/games/owl27.sgf b/regression/games/owl27.sgf
new file mode 100644 (file)
index 0000000..0ad802d
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.231 (level 10) load and print]HA[2]KM[0.5]GN[GNU Go 2.7.231 load and print Random Seed 987866787] 
+AW[ia][ka][ma][cb][db][eb][nb][ob][pb][bc][cc][fc][nc][pc][qc][dd][ed][fd][rd][ce][re][cf][ff][qf][rf][sf][dg][gg][ig][kg][lg][mg][og][pg][qg][dh][gh][jh][oh][qh][ei][ki][li][oi][pi][ri][cj][ej][hj][jj][rj][ek][fk][hk][kk][lk][dl][gl][cm][gm][jm][mm][om][pm][an][cn][jn][mn][nn][on][co][do][ko][lo][oo][ap][bp][np][pp][bq][kq][mq][oq][mr][ms][ns][os]
+AB[ea][fb][gb][mb][gc][lc][mc][oc][hd][ld][nd][od][pd][qd][de][he][je][me][df][ef][of][pf][eg][ng][rg][eh][fh][lh][mh][nh][rh][sh][fi][mi][ni][qi][si][fj][gj][lj][mj][oj][pj][qj][gk][mk][rk][jl][ll][ml][nl][ol][pl][dm][em][fm][hm][im][km][nm][qm][gn][kn][qn][eo][ho][io][jo][po][qo][cp][dp][fp][hp][jp][rp][aq][cq][gq][iq][pq][qq][br][dr][hr][jr][kr][nr][or][qr][as][cs][ps]
+PL[W]
+IL[md][ip][hq][cr][pr][bs]
+)
diff --git a/regression/games/owl28.sgf b/regression/games/owl28.sgf
new file mode 100644 (file)
index 0000000..b4934ad
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[5]KM[0.5]
+PW[GnuGo (GNU Go 2.7.248)]WR[15k*]
+PB[viking4]BR[21k*]
+PC[NNGS]DT[2001-08-10]AP[gnugoclient:2.0]
+RE[W+57.5]
+AB[dd][pd][jj][dp][pp]
+;W[cf];B[fd];W[dj];B[qj];W[cn];B[jq];W[nd];B[ci];W[bd];B[fp];W[bp]
+;B[cj];W[cq];B[cc];W[hc];B[ck];W[kc];B[gc];W[hd];B[gf];W[bh];B[bc]
+;W[dg];B[di];W[qn];B[np];W[rp];B[qq];W[pl];B[rl];W[ql];B[ok];W[rm]
+;B[rk];W[rq];B[ie];W[nf];B[oc];W[nc];B[ob];W[le];B[ei];W[ce];B[pf]
+;W[de];B[fg];W[er];B[hb];W[ib];B[gb];W[ek];B[el];W[fk];B[gq];W[gj]
+;B[fh];W[hk]C[L:7];B[il];W[hi]C[L:8];B[hf];W[gm]C[L:7];B[hn];W[nb]
+C[L:8];B[bm];W[bn]C[L:9];B[bl];W[ih]C[L:8];B[jk];W[nm]C[L:9];B[bi]
+;W[ch]C[L:8];B[dl];W[oo]C[L:9];B[po];W[kg]C[L:7];B[no];W[ki]C[L:8]
+;B[op];W[mn]C[L:9];B[lo];W[qp]C[L:10];B[qr];W[ll];B[pn];W[nh];B[ol]
+;W[pm];B[om];W[rr];B[rs];W[sr];B[ee];W[ef];B[bg];W[ah];B[dq];W[dr]
+;B[ff];W[pg];B[qg];W[jm];B[og];W[hm];B[im];W[jo];B[kp];W[in];B[io]
+;W[jn];B[ho];W[lj];B[ln];W[lm];B[hl];W[gl];B[oh];W[oa];B[ni];W[pa]
+;B[jp];W[qc];B[qd];W[rc];B[rd];W[sd];B[re];W[ac];B[fr];W[ab];B[br]
+;W[cr]C[L:9];B[cs];W[mh]C[L:10];B[bb];W[en];B[jh];W[jg];B[ji];W[if]
+;B[he];W[gn];B[je];W[kd];B[eg];W[bf];B[se];W[eq];B[kh];W[ep];B[mi]
+;W[li];B[eo];W[lh];B[do];W[dn];B[hg];W[fo];B[gp];W[ig];B[gh];W[fq]
+;B[gr];W[sc];B[ic];W[id];B[sm];W[sn];B[so];W[ro];B[kl];W[km];B[rn]
+;W[sp];B[qm];W[jc];B[mo];W[rm];B[fl];W[sn];B[go];W[fn];B[es];W[ds]
+;B[ik];W[sl];B[hj];W[gk];B[fs];W[qk];B[bs];W[rj];B[gi];W[sk];B[bq]
+;W[cp];B[pj];W[kk];B[ae];W[df];B[ii];W[hh];B[nn];W[ad];B[pb];W[qb]
+;B[qs];W[mm];B[qh];W[ri];B[nj];W[oe];B[rh];W[dh];B[kf];W[lf];B[gd]
+;W[pe];B[pc];W[qf];B[ph];W[rf];B[sf];W[qe];B[sg];W[of];B[cd];W[jd]
+;B[jf];W[ij];B[ng];W[kj];B[hj];W[lg];B[rg];W[nl];B[pg];W[ai];B[si]
+;W[bj];B[qi];W[am];B[al];W[an];B[dk];W[ej];B[qo];W[ba];B[af];W[ca]
+;B[cb];W[db];B[cm];W[dc];B[ed];W[ha];B[ga];W[ia];B[fi];W[mg];B[fj]
+;W[ec];B[ke];W[nk];B[as];W[mj];B[ko];W[pk];B[dm];W[fc];B[sh];W[fb]
+;B[fa];W[ea];B[sj];W[rk];B[bk];W[aj];B[od];W[ss];B[kn];W[ak];B[fm]
+;W[em];B[oj];W[eh];B[];W[]
+C[final_score: W+57.5
+A15 removed
+B13 removed
+K12 removed
+H10 removed
+L8 removed
+D5 removed
+P5 removed
+B3 removed]
+)
diff --git a/regression/games/owl29.sgf b/regression/games/owl29.sgf
new file mode 100644 (file)
index 0000000..ff7dbf3
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.8)]WR[14k*]
+PB[lauri]BR[20k]
+PC[NNGS]DT[2001-10-08]AP[gnugoclient:2.0]
+RE[B+15.5]
+;B[pp];W[qd];B[cp];W[ep];B[dn];W[cq];B[dd];W[bp];B[co];W[dq];B[bo]
+;W[cf];B[dj];W[qn];B[np];W[od];B[md];W[iq];B[pl];W[lq];B[mr];W[fc]
+;B[cc];W[ic];B[kc];W[qj];B[on];W[qg];B[ef];W[bd];B[ce];W[be];B[cg]
+;W[bg];B[df];W[go];B[fm];W[io];B[ie];W[jd];B[ke];W[kd];B[ld];W[rl]
+;B[ro];W[qo];B[qp];W[mq];B[nq];W[lr];B[ns];W[nc];B[bf];W[lb];B[gd]
+;W[gc];B[ik];W[hl];B[gk];W[lc];B[lf];W[bq];B[hn];W[rn];B[sp];W[gn]
+;B[gm];W[hm];B[in];W[jn];B[im];W[il];B[jm];W[jl];B[kn];W[kk];B[ji]
+;W[hk];B[hj];W[gj];B[fj];W[ij];B[gi];W[lm];B[ln];W[mk];B[ii];W[jj]
+;B[kj];W[jk];B[mi];W[je];B[jf];W[jo];B[km];W[lj];B[li];W[ki];B[kh]
+;W[ll];B[lp];W[nm];B[om];W[mn];B[mo];W[db];B[cb];W[ec];B[kq];W[kr]
+;B[jp];W[ho];B[of];W[og];B[ng];W[pf];B[oh];W[qi];B[id];W[jc];B[oe]
+;W[ko];B[lo];W[kp];B[nn];W[mm];B[mj];W[ca];B[ba];W[da];B[bc];W[oj]
+;B[nk];W[nj];B[nl];W[ph];B[ml];W[nh];B[pg];W[ao];B[an];W[ap];B[bm]
+;W[og];B[eb];W[dc];B[cd];W[mg];B[lg];W[ne];B[pg];W[nf];B[mh];W[og]
+;B[hc];W[hb];B[ib];W[hd];B[he];W[fd];B[fe];W[ge];B[gf];W[me];B[le]
+;W[ee];B[gd];W[ni];B[lh];W[ge];B[ff];W[ed];B[gd];W[ok];B[ol];W[hc]
+;B[fo];W[fp];B[fn];W[mc];B[mf];W[po];B[oo];W[eo];B[ng];W[pe];B[qk]
+;W[rk];B[sn];W[pk];B[rm];W[qm];B[ql];W[sm];B[qc];W[pb];B[qb];W[rc]
+;B[sc];W[rd];B[rb];W[sb];B[sa];W[qa];B[ob];W[pc];B[en];W[ls];B[ms]
+;W[so];B[rp];W[sn];B[mp];W[mg];B[ge];W[ng];B[dp];W[nd];B[do];W[de]
+;B[cf];W[pm];B[pn];W[]
+C[final_score: B+15.5
+T19 removed
+E18 removed
+J18 removed
+P18 removed
+R18 removed
+L17 removed
+T17 removed
+B16 removed
+B13 removed
+P12 removed
+L11 removed
+J10 removed
+M10 removed
+N9 removed
+M8 removed
+K4 removed
+L3 removed]
+)
diff --git a/regression/games/owl30.sgf b/regression/games/owl30.sgf
new file mode 100644 (file)
index 0000000..53fbe37
--- /dev/null
@@ -0,0 +1,36 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[chourave]WR[12k]
+PB[GnuGo (GNU Go 3.1.7)]BR[14k*]
+PC[NNGS]DT[2001-09-26]AP[gnugoclient:2.0]
+RE[B+1.5]
+AB[pd][dp]
+;W[dd];B[pp];W[nc];B[pf];W[jd];B[fd];W[df];B[dc];W[cc];B[ec];W[cb]
+;B[hc];W[pb];B[qc];W[ib];B[he];W[jf];B[qj];W[cn];B[fp];W[bp];B[cl]
+;W[cq];B[co];W[bo];B[dn];W[dm];B[dq];W[ci];B[cm]C[L:8];W[bn];B[em]
+C[L:9];W[dl];B[al]C[L:10];W[dk];B[ng];W[hg];B[db]C[L:8];W[fa];B[hb]
+C[L:6];W[da];B[id];W[jc];B[jp];W[pk];B[oi]C[L:7];W[qn];B[nq]C[L:8]
+;W[oo];B[ro]C[L:9];W[qo];B[qp]C[L:7];W[op];B[oq];W[rn];B[ff];W[fh]
+;B[ee];W[de];B[ed]C[L:8];W[eg];B[en]C[L:9];W[jn];B[hp];W[kp];B[kq]
+;W[jq];B[qb]C[L:8];W[ob];B[iq]C[L:9];W[jr];B[lq];W[jo];B[ip];W[lo]
+;B[rp]C[L:8];W[pj];B[qi]C[L:9];W[gk];B[rl]C[L:10];W[ql];B[rm];W[qm]
+;B[sn];W[rk];B[rj];W[sl];B[me];W[ld];B[gm];W[mj];B[hl];W[pi];B[ph]
+;W[qh];B[rh];W[oh];B[qg];W[nh];B[mh];W[ni];B[og];W[mg];B[mi];W[nj]
+;B[lg];W[li];B[lh];W[hk];B[jl];W[ik];B[jm];W[hn];B[im];W[ll];B[lj]
+;W[ki];B[lk];W[mk];B[kj];W[jj];B[kk];W[kl];B[jk];W[ii];B[in];W[io]
+;B[ho]C[L:8];W[ln];B[cp]C[L:9];W[cr];B[dr]C[L:10];W[ar];B[kn];W[ko]
+;B[kh];W[ji];B[gb];W[fb];B[fc];W[gf];B[ea];W[ge];B[gd];W[ic];B[ca]
+;W[ba];B[da];W[ab];B[km];W[lm];B[md];W[fe];B[mc];W[mb];B[lc];W[lb]
+;B[kd];W[kc];B[ke];W[kf];B[je];W[lf];B[mf];W[le];B[ie];W[if];B[ja]
+;W[ka];B[ia];W[kb];B[na];W[ma];B[pa];W[oa];B[qa];W[oc];B[ef];W[fg]
+;B[cs];W[bs];B[ds];W[fl];B[el];W[ek];B[jh];W[ih];B[jg];W[fm];B[fn]
+;W[mp];B[po];W[pn];B[np];W[no];B[mq];W[od];B[oe];W[gl];B[gn];W[il]
+;B[hm];W[hf];B[hd];W[pc];B[qd];W[nb];B[lp];W[mo];B[nd];W[jb];B[ha]
+;W[sk];B[sj];W[qk];B[ig];W[gh];B[mg];W[sm];B[so];W[];B[kg];W[];B[]
+C[final_score: B+1.5
+F19 removed
+P11 removed
+A8 removed
+C8 removed
+K3 removed]
+)
diff --git a/regression/games/owl31.sgf b/regression/games/owl31.sgf
new file mode 100644 (file)
index 0000000..d101e1f
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]
+SZ[9]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.11)]WR[14k*]
+PB[rubus]BR[30k]
+PC[NNGS]DT[2001-11-07]AP[gnugoclient:2.0]
+RE[W+0.5]
+;B[cc];W[ee];B[gc];W[ec];B[cg];W[ce];B[be];W[eg]C[L:8];B[eb];W[fb]
+C[L:6];B[db];W[fc]C[L:7];B[cf];W[ge];B[cd];W[dh]C[L:8];B[ch];W[de]
+C[L:9];B[dg];W[gb]C[L:10];B[eh];W[fh];B[di];W[fg];B[ef];W[df];B[fi]
+;W[hg];B[gh];W[hh];B[gg];W[ff];B[dd];W[hi];B[gi];W[gf];B[ei];W[ea]
+;B[da];W[fa];B[ed];W[fd];B[dc];W[]C[G7 removed
+final_score: W+0.5])
diff --git a/regression/games/owl32.sgf b/regression/games/owl32.sgf
new file mode 100644 (file)
index 0000000..9facae3
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-11-16]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][bb][gb][hb][bc][gc][bd][fd][id][ae][ce][fe][ge][he][ie][bf][hf][ag][hg][ig]
+AB[ba][ca][fa][ga][ha][ia][cb][fb][ib][cc][dc][ec][fc][ad][ed][ee][cf][df][ef][bg][cg][fg][ah][bh][fh][gh][hh]
+)
diff --git a/regression/games/owl33.sgf b/regression/games/owl33.sgf
new file mode 100644 (file)
index 0000000..3adce45
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[3]
+RU[Japanese]BR[]WR[]SZ[19]HA[9]KM[0.5]
+PW[gunnar]
+PB[GNU Go 3.1.14]
+GN[White (W) vs. Black (B)]
+DT[2001-11-20]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[nq];B[qn];W[fp];B[dn];W[jn];B[or];W[no]
+;B[eq];W[fq];B[fr];W[gr];B[er];W[hq];B[cf];W[qf];B[qe]
+;W[pf];B[nd];W[ph];B[re];W[mg];B[kg];W[ql];B[pl];W[pk]
+;B[rf];W[qk];B[ec];W[dl];B[cl];W[ck];B[dk];W[cm];B[el]
+;W[bl];B[cj];W[bj];B[eo];W[bh];B[cn];W[bn];B[bo];W[ao]
+;B[ap];W[an];B[bp];W[ld];B[lc];W[kc];B[kd];W[mc];B[le]
+;W[md];B[jc];W[lb];B[me];W[jb];B[of];W[og];B[ib];W[ia]
+;B[nc];W[nb];B[pe];W[hb];B[ob];W[oa];B[pb];W[ic];B[qi]
+;W[qh];B[rh];W[ri];B[rj];W[rg];B[si];W[sg];B[oj];W[mj]
+;B[he];W[dh];B[hp];W[fo];B[iq];W[ir];B[hn];W[io];B[jr]
+;W[ip];B[lr];W[nr];B[oq];W[jq];B[pm];W[ok];B[eg];W[eh]
+;B[dm];W[cl];B[fj];W[fh];B[ki];W[nj];B[fn];W[ae];B[hh]
+;W[cc];B[db];W[gd];B[kl];W[lm];B[np];W[mp];B[op];W[mq]
+;B[fe];W[os];B[ps];W[ns];B[pr];W[rm];B[nm];W[ro];B[rp]
+;W[rn];B[mn];W[mo];B[ln];W[ko];B[ho];W[qo];B[km];W[on]
+;B[nl];W[rq];B[qq];W[rr];B[po];W[pn];B[qp];W[sp];B[cb]
+;W[bc];B[fg];W[gi];B[pa];W[na];B[bb];W[hj];B[cd];W[bd]
+;B[be];W[af];B[bf];W[bg];B[hd];W[gc];B[fb];W[im];B[nf]
+;W[ng];B[gl];W[lh];B[gb];W[hc];B[ab];W[ad];B[lk];W[ge]
+;B[gf];W[dg];B[df];W[kh];B[jh];W[id];B[ie];W[hm];B[gm]
+;W[jg];B[ig];W[kf];B[jf];W[ke];B[je];W[lf];B[mf];W[lg]
+;B[gh];W[fi];B[hl];W[il];B[ij];W[hi];B[ii];W[qm];B[lo]
+;W[lp];B[li];W[kn];B[em];W[ol];B[mi];W[ni];B[mh];W[nn]
+;B[mm];W[nk];B[nh];W[oh];B[qg];W[pg];B[oi];W[qj];B[mk]
+;W[fk];B[ei];W[gk];B[ek];W[fl];B[hk];W[ik];B[in];W[jm]
+;B[sf];W[pi];B[gs];W[hs];B[fs];W[lj];B[kj];W[fd];B[ed]
+;W[ci];B[jk];W[kq];B[cg];W[ch];B[jg];W[ga];B[fa];W[ha]
+;B[jl];W[gj];B[ej];W[fm];B[gn];W[om];B[ll];W[ep];B[fc]
+;W[gq];B[dc];W[ag];B[ac];W[go];B[dr];W[di];B[en];W[gp]
+;B[tt];W[tt]
+)
diff --git a/regression/games/owl34.sgf b/regression/games/owl34.sgf
new file mode 100644 (file)
index 0000000..58ed44b
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[darKstar]WR[15k]
+PB[GnuGo (GNU Go 3.1.15)]BR[14k*]
+PC[NNGS]DT[2001-12-07]AP[gnugoclient:2.0]
+RE[W+41.5]
+;B[dp];W[qp];B[dd];W[pc];B[op];W[pn];B[qq];W[rq];B[pq];W[ro];B[kq]
+;W[qk];B[qe];W[pe];B[pf];W[qd];B[oe];W[od];B[pd];W[nd];B[mf];W[qh]
+;B[mo];W[fq];B[hq];W[dq];B[cq];W[ep];B[do];W[dr];B[jd];W[qc];B[dj]
+;W[cc];B[dc];W[cd];B[ce];W[be];B[cf];W[bf];B[cg];W[db];B[eb];W[cb]
+;B[fc];W[lc];B[cr];W[gr];B[bg];W[hg];B[em];W[jg];B[hr];W[er];B[fp]
+;W[gp];B[fo];W[gq];B[ho];W[hp];B[go];W[ip];B[ir];W[jo];B[oh];W[ok]
+;B[eh];W[mh];B[pe];W[ke];B[ne];W[ng];B[og];W[qg];B[ko];W[jn];B[ll]
+;W[lm];B[mm];W[km];B[kl];W[jl];B[jk];W[kk];B[il];W[jm];B[hk];W[jj]
+;B[ik];W[ml];B[lk];W[kj];B[mk];W[nl];B[gi];W[je];B[hb];W[ge];B[ic]
+;W[rr];B[qr];W[cl];B[bk]C[L:7];W[ck];B[kb]C[L:8];W[lb];B[fg]C[L:9]
+;W[bl];B[bj]C[L:8];W[bo];B[bp];W[co];B[cp];W[dn];B[cj]C[L:6];W[bn]
+;B[el]C[L:7];W[dm];B[ao]C[L:8];W[gm];B[en];W[im];B[kc];W[mi];B[ld]
+C[L:9];W[md];B[la]C[L:8];W[nb];B[mc]C[L:9];W[mb];B[kd];W[le];B[me]
+C[L:10];W[lp];B[kp]C[L:5];W[np];B[lq]C[L:3];W[oo];B[no];W[pp];B[oq]
+;W[mn];B[nn]C[L:4];W[nm];B[lo]C[L:5];W[hi];B[rs];W[hj];B[gj]C[L:6]
+;W[gk];B[gl]C[L:7];W[fk];B[fl]C[L:8];W[gh];B[fi]C[L:9];W[ij];B[hl]
+C[L:10];W[gf];B[hm];W[ee];B[de];W[ef];B[fh];W[dg];B[on];W[om];B[dh]
+;W[ie];B[af];W[bd];B[da];W[ca];B[ds];W[es];B[cs];W[ea];B[fa];W[ac]
+;B[gg];W[hh];B[po];W[qo];B[ln];W[gc];B[gb];W[fd];B[ff];W[ae];B[fe]
+;W[ed];B[ec];W[ag];B[ah];W[hn];B[gn];W[hs];B[jr];W[oo];B[io];W[jp]
+;B[mm];W[nj];B[po];W[bh];B[ai];W[oo];B[in];W[po];B[is];W[gs];B[ma]
+;W[na];B[ka];W[hd];B[sr];W[sq];B[mn];W[ss];B[qs];W[an];B[al];W[am]
+;B[cm];W[sr];B[af];W[id];B[ag];W[hc];B[ja];W[ib];B[nc];W[oc];B[ia]
+;W[jc];B[da];W[gd];B[ea];W[ic];B[eo];W[eq];B[jq];W[nk];B[eg];W[df]
+;B[kn];W[jb];B[ha];W[lj];B[iq];W[mj];B[]
+C[final_score: W+41.5
+Q16 removed
+P13 removed
+B12 removed
+C9 removed
+F9 removed
+A7 removed
+D7 removed
+G7 removed
+M4 removed
+O4 removed]
+)
diff --git a/regression/games/owl35.sgf b/regression/games/owl35.sgf
new file mode 100644 (file)
index 0000000..f704202
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.27 (level 10) load and print]PB[Unknown]HA[0]KM[0.5]GN[GNU Go 3.1.27 load and print Random Seed 1016409988] 
+AW[dd][pg][qg][cj][io][cp][ep][ip][jq]
+AB[mc][pd][qf][pk][po][jp][kp][iq][lq][pq]
+PL[W]
+
+)
diff --git a/regression/games/owl36.sgf b/regression/games/owl36.sgf
new file mode 100644 (file)
index 0000000..cf3690c
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-06-17]
+SY[Cgoban 1.9.10]TM[-];AW[aq][bq][cq][br][dr][cs]
+AB[ap][bp][cp][dp][dq][er][ds][es]
+)
diff --git a/regression/games/owl37.sgf b/regression/games/owl37.sgf
new file mode 100644 (file)
index 0000000..d2d0021
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]
+SZ[9]
+GN[1]
+AW[ab][bb][cc][bd][cd][ce][af][bf][bg][cg][dg][eg]
+AB[ba][ca][da][db][fb][ac][dc][gc][ad][dd][de][ee][fe][cf][df][gf][ag][ah][bh][ch][dh][eh][fh]
+)
diff --git a/regression/games/owl38.sgf b/regression/games/owl38.sgf
new file mode 100644 (file)
index 0000000..ea1da0f
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[13]
+AB[ak][bk][cb][cc][cf][ch][ck][dd][dk][ea][ed][ek][fc][fd][fi][fk][ga][gd][gk][hd][hg][hk][ic][id][ik][ja][jd][jk][kb][kc][kd][kf][kh][kk][lk][mk]
+AW[al][bl][cl][da][db][dl][ec][el][fb][fl][gc][gl][hb][hc][hl][ib][jb][jc]
+)
diff --git a/regression/games/owl39.sgf b/regression/games/owl39.sgf
new file mode 100644 (file)
index 0000000..ff9a767
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[4]
+GM[1]
+SZ[9]
+AB[de][ee][fe][ag][bg][cg][dg][eg][gg][gh][hg][hc][af][ac][bc][cc][dc][db][eb][fb][hf][hb][id]
+AW[ge][gd][fc][ec][ed][dd][cd][be][bf][cf][df][ef][ff]
+;
+B[gc]
+)
diff --git a/regression/games/owl39a.sgf b/regression/games/owl39a.sgf
new file mode 100644 (file)
index 0000000..3356164
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[4]
+GM[1]
+SZ[9]
+AB[ac][af][ag][bc][bg][cc][cg][db][dc][de][dg][eb][ee][eg][fb][fe][gg][gh][hb][hc][hf][hg][id]
+AW[be][bf][cd][cf][dd][df][ed][ef][fc][ff][gd][ge]
+;
+B[bd]
+)
diff --git a/regression/games/owl40.sgf b/regression/games/owl40.sgf
new file mode 100644 (file)
index 0000000..9b2a007
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-09-19]
+SY[Cgoban 1.9.12]TM[30:00(5x1:00)];
+AW[bd][bf][cf][df][ef][ff][fg][fh][bi][ci][di][fi]
+AB[ag][bg][cg][dg][eg][ah][ch][eh][ai][ei]
+)
diff --git a/regression/games/owl41.sgf b/regression/games/owl41.sgf
new file mode 100644 (file)
index 0000000..c7b3154
--- /dev/null
@@ -0,0 +1,8 @@
+(;
+FF[4]
+GM[1]
+SZ[9]
+AB[ad][bd][bf][ce][cg][df][dg][dh]
+AW[ae][af][bc][bh][cb][cd][ch][dd][di][ef][eg][eh][ff]
+;B[be]
+)
diff --git a/regression/games/owl42.sgf b/regression/games/owl42.sgf
new file mode 100644 (file)
index 0000000..c49ef76
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.14 load and print]
+DT[2003-01-04]
+KM[4.5]AP[GNU Go:3.3.14]RU[Japanese]
+;AW[ka][ab][cb][jb][kb][lb][mb][bc][dc][hc][ic][lc][mc][nc][qc]
+[cd][fd][gd][kd][ld][md][de][ee][ge][me][ne][ef][gf][kf][lf][mf]
+[gg][hg][ig][kg][mg][pg][qg][dh][kh][lh][mh][qh][rh][ci][di][ei]
+[ii][ji][li][pi][qi][si][bj][dj][ej][fj][jj][lj][mj][nj][qj][rj]
+[ak][bk][dk][fk][gk][ik][jk][nk][qk][sk][cl][gl][hl][il][ll][ql]
+[rl][am][bm][cm][em][fm][gm][im][jm][lm][sm][bn][gn][hn][kn][ln]
+[nn][on][pn][io][jo][ko][mo][no][po][cp][dp][kp][op][qp][rp][cq]
+[eq][pq][rq][br][dr][er][or][pr][qr][sr][bs][es][fs][ps]
+AB[la][ma][na][oa][nb][ac][jc][kc][oc][ad][bd][id][jd][nd][od]
+[pd][qd][rd][sd][ce][fe][he][je][ke][le][pe][re][bf][df][ff][hf]
+[if][jf][nf][pf][qf][dg][eg][fg][jg][ng][og][rg][sg][bh][ch][eh]
+[fh][gh][hh][ih][jh][nh][ph][sh][ai][bi][fi][hi][ki][mi][ni][oi]
+[aj][gj][hj][ij][kj][oj][pj][ek][hk][kk][mk][dl][el][fl][jl][kl]
+[ml][nl][pl][dm][km][mm][om][pm][qm][rm][an][cn][dn][en][fn][mn]
+[rn][ao][bo][co][do][eo][fo][go][ho][ro][so][bp][ep][gp][ip][jp]
+[lp][mp][np][sp][bq][fq][kq][mq][nq][oq][sq][ar][fr][gr][lr][nr]
+[gs][ms][ns][os]
+PL[B]
diff --git a/regression/games/owl43.sgf b/regression/games/owl43.sgf
new file mode 100644 (file)
index 0000000..f18a349
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.14 load and print]
+DT[2003-01-05]
+KM[5.5]AP[GNU Go:3.3.14]RU[Japanese]
+;AW[cp][dp][bq][eq][br][dr][cs]
+AB[bn][co][do][ap][bp][ep][fp][fq][fr][bs][es]
+PL[B])
diff --git a/regression/games/owl44.sgf b/regression/games/owl44.sgf
new file mode 100644 (file)
index 0000000..c8bb240
--- /dev/null
@@ -0,0 +1,17 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.14 load and print]
+DT[2003-01-12]
+KM[6.5]AP[GNU Go:3.3.14]RU[Japanese]
+;AW[ha][ia][ma][na][gb][hb][jb][kb][mb][dc][fc][hc][gd][rd][ce]
+[he][ie][af][bf][hf][of][qf][rf][gg][ig][sg][ah][ch][gh][nh][rh]
+[di][ei][fi][dj][mj][qj][ek][fk][ik][cl][el][gl][cm][fm][hm][im]
+[km][mm][om][pm][qm][rm][dn][gn][do][go][ro][so][dp][sp][dq][dr]
+[er][es][fs]
+AB[ja][oa][ib][nb][pb][ic][nc][qc][rc][hd][id][jd][ld][pd][qd]
+[ge][je][re][se][sf][ag][lg][fh][hh][gi][ii][bj][cj][ej][fj][gj]
+[hj][ak][ck][dk][hk][jk][bl][hl][il][jm][bn][cn][hn][in][jn][pn]
+[rn][fo][mo][qo][cp][qp][rp][cq][eq][fq][gq][hq][kq][oq][sq][cr]
+[fr][rr][gs]
+PL[W]IL[hi][bk])
+
diff --git a/regression/games/owl45.sgf b/regression/games/owl45.sgf
new file mode 100644 (file)
index 0000000..273e2f8
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.19 load and print]
+DT[2003-05-19]
+KM[-4.0]AP[GNU Go:3.3.19]RU[Japanese]
+;AW[ja][ka][la][ma][bb][cb][eb][hb][ib][lb][bc][dc][ic][kc][mc]
+[ad][bd][dd][hd][jd][ld][md][nd][od][sd][fe][ge][he][je][ke][le]
+[me][pe][re][se][gf][kf][of][pf][qf][sf][dg][gg][hg][ig][kg][qg]
+[rg][dh][hh][jh][oh][rh][di][ei][hi][ji][oi][pi][qi][cj][dj][ej]
+[gj][hj][ij][lj][mj][oj][qj][ak][bk][ck][gk][hk][lk][mk][nk][ok]
+[qk][cl][hl][il][ml][nl][ql][rl][dm][em][im][lm][mm][rm][sm][cn]
+[en][fn][jn][kn][ln][mn][nn][sn][co][eo][go][jo][ko][mo][cp][ep]
+[fp][gp][ip][mp][np][op][dq][gq][hq][iq][lq][nq][dr][er][gr][nr]
+[or][pr][es][ps][qs]
+AB[ba][ea][ga][ha][ia][na][fb][gb][mb][nb][cc][ec][fc][gc][hc]
+[nc][oc][pc][qc][rc][sc][cd][fd][id][pd][qd][rd][be][ce][de][ee]
+[ie][ne][oe][qe][df][ff][hf][if][lf][mf][nf][cg][fg][lg][ng][og]
+[pg][bh][ch][fh][gh][kh][mh][ph][qh][ai][ci][fi][gi][ki][li][mi]
+[ni][aj][bj][fj][jj][kj][nj][pj][fk][ik][jk][kk][pk][dl][el][fl]
+[jl][kl][ll][ol][pl][fm][gm][hm][jm][nm][om][pm][gn][hn][in][on]
+[pn][qn][rn][do][ho][io][lo][oo][so][dp][hp][jp][kp][lp][pp][qp]
+[sp][eq][fq][jq][mq][oq][pq][qq][rq][fr][hr][ir][kr][lr][mr][qr]
+[sr][fs][gs][hs][is][ks][ms][ns][rs]
+PL[B])
diff --git a/regression/games/owl46.sgf b/regression/games/owl46.sgf
new file mode 100644 (file)
index 0000000..27ed818
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-02]
+SY[Cgoban 1.9.12]TM[5:00:00(5x1:00)];
+AW[ga][fb][gb][cc][fc][hc][fd][ce][fe][ge][gf][if][cg][eg][gg][gh][gi][hi]
+AB[ha][hb][gc][gd][hd][he][hf][hg][hh][ih][ii]
+)
diff --git a/regression/games/owl47.sgf b/regression/games/owl47.sgf
new file mode 100644 (file)
index 0000000..30b5ffc
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-04-10]
+SY[Cgoban 1.9.12]TM[-]PL[B];AW[pp][sp][pq][sq][pr][sr][ps]
+AB[on][pn][qn][rn][oo][ro][so][np][nq][nr][ss];B[rr];W[rq];B[rs];W[qp]
+;B[rp];W[qr];B[qq];W[rq];B[sq];W[qs];B[sr];W[sp];B[sr];W[sq];B[rr]
+)
diff --git a/regression/games/owl48.sgf b/regression/games/owl48.sgf
new file mode 100644 (file)
index 0000000..ac433fc
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.22 load and print]
+DT[2003-07-06]
+KM[7.5]AP[GNU Go:3.3.22]RU[Japanese]
+;AW[ia][hb][jb][nb][ob][pb][ac][bc][cc][dc][jc][mc][nc][oc][pc]
+[dd][fd][jd][ld][md][nd][qd][ee][je][ke][ne][af][ef][nf][of][eg]
+[fg][gg][hg][jg][kg][ng][hh][ih][kh][lh][mh][ei][li][si][ej][fj]
+[jj][rj][dk][gk][hk][jk][kk][qk][rk][dl][fl][gl][hl][il][jl][kl]
+[ml][pl][dm][fm][hm][lm][mm][nm][pm][rm][dn][fn][nn][qn][eo][fo]
+[no][ap][cp][dp][fp][gp][jp][aq][bq][cq][fq][hq][iq][jq][nq][pq]
+[qq][rq][ir][kr][nr][or][pr][rr][sr][js][ks][ls][ns][rs]
+AB[ja][ka][ma][na][oa][pa][kb][lb][mb][qb][kc][lc][qc][ad][bd]
+[cd][kd][od][pd][rd][ae][ce][de][le][oe][pe][bf][df][if][pf][bg]
+[dg][ig][og][dh][eh][fh][gh][jh][nh][ph][rh][di][fi][hi][ii][ji]
+[ki][mi][ri][cj][dj][gj][hj][ij][kj][lj][nj][pj][qj][ck][ik][lk]
+[mk][pk][cl][ll][cm][gm][im][jm][km][cn][gn][hn][ln][mn][on][ao]
+[bo][co][do][go][io][jo][ko][mo][oo][ro][bp][hp][ip][kp][lp][np]
+[op][pp][qp][rp][sp][kq][lq][mq][oq][sq][lr][mr][ms]
+PL[B])
diff --git a/regression/games/owl49.sgf b/regression/games/owl49.sgf
new file mode 100644 (file)
index 0000000..701a4b9
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-06-18]
+SY[Cgoban 1.9.12]TM[-];AW[nc][qd][rd][oe][qf]AB[qc][rc][pd];B[ob];
+W[oc];B[pc];W[nb];B[pe];W[pf];B[sd];W[rg];B[pa]
+)
diff --git a/regression/games/owl50.sgf b/regression/games/owl50.sgf
new file mode 100644 (file)
index 0000000..1e363cb
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[1]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.53]
+AB[ga][fb][fc][gc][hc][ic][kc][kd][lb][mb][me][nd][oe][ng][og][pg][pf][pd][qd][qc][rc][ks][kr][kq][kp][ko][kn][km][kl][kk][kj][ki][kh][kg][ec][dc][dd][cd][bd][cq][eq][ep][eo][en][em][el][ek][ej][ei][eh][ad][ae][af][ag][ah][ai][aj][ak][al][am][aq][ap][ao][an][bq][cp][co][cn][cm][ck][ci][ch][dh][cl][cj][fq][gq][gp][go][gn][gm][gl][gk][gj][gi][gh][hh][ih][ii][ij][ik][il][im][in][io][ip][iq][pq][pk][ab][id][po][pp][pr][ps][pn][pm][qm][rm][sm]
+AW[fa][ea][eb][cc][cb][gd][hd][ge][fe][hf][if][je][ke][gb][hb][ib][jb][kb][lc][jg][jh][ji][jj][jk][jl][jm][jn][jo][jp][jq][jr][js][bc][ac][br][cr][dr][er][fr][hr][db][hg][gg][fg][eg][ce][de][ed][be][bf][bg][bh][bi][bj][bk][bp][bo][bn][bm][bl][dq][dp][do][dn][dm][dl][dk][dj][di][ar][cg][dg][gr][ir][hq][hp][ho][hn][hm][hl][hk][hj][hi][fh][fi][fj][fk][fm][fl][fn][fo][fp][fd][ie][sp][qs][qr][qq][qp][sq][sr][ss][rs][so][qo][qn][rn][sn][rr]
+GN[connection5]
+)
diff --git a/regression/games/owl51.sgf b/regression/games/owl51.sgf
new file mode 100644 (file)
index 0000000..a158066
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.5.8 load and print]
+DT[2004-08-04]
+KM[4.5]RU[Japanese]AP[GNU Go:3.5.8]AW[aa][ba][da][ea][fa][ia]
+[ka][la][ma][na][cb][db][fb][gb][jb][lb][mb][ac][bc][lc][mc][nc]
+[gd][hd][id][jd][ld][md][fe][ge][ke][le][se][af][df][ef][hf][jf]
+[kf][sf][bg][dg][eg][fg][gg][hg][kg][og][pg][qg][rg][sg][ah][ch]
+[eh][kh][nh][ph][sh][bi][ci][fi][ki][ni][pi][qi][si][aj][bj][ej]
+[fj][hj][jj][lj][nj][oj][pj][bk][dk][hk][ik][lk][nk][pk][bl][dl]
+[el][il][jl][ml][nl][pl][cm][dm][im][km][lm][mm][fn][gn][hn][in]
+[nn][on][sn][co][do][fo][ho][lo][mo][oo][po][qo][ro][so][dp][ep]
+[fp][hp][ip][lp][pp][rp][sp][cq][gq][hq][iq][jq][mq][sq][cr][er]
+[fr][hr][ir][mr][sr][ds][is][js]
+AB[ha][oa][eb][hb][kb][nb][ob][dc][ec][fc][gc][hc][ic][jc][kc]
+[oc][ad][bd][cd][ed][fd][kd][nd][pd][qd][sd][be][de][ee][he][ie]
+[je][me][ne][oe][re][bf][cf][if][lf][mf][of][pf][qf][cg][ig][lg]
+[ng][dh][fh][gh][hh][lh][mh][qh][rh][di][ei][gi][ii][ji][li][mi]
+[ri][cj][gj][ij][mj][qj][rj][sj][ak][fk][gk][mk][ok][qk][al][cl]
+[fl][hl][ol][ql][sl][am][bm][em][fm][gm][hm][jm][nm][om][pm][qm]
+[sm][an][bn][cn][dn][en][jn][kn][qn][rn][bo][eo][io][jo][ko][no]
+[bp][cp][jp][kp][mp][np][op][qp][bq][eq][fq][kq][lq][oq][pq][qq]
+[rq][br][gr][jr][kr][pr][rr][bs][cs][ks][ls][ms][os][qs][rs][ss]
+PL[W]
+)
diff --git a/regression/games/owl52.sgf b/regression/games/owl52.sgf
new file mode 100644 (file)
index 0000000..d54eea0
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.5.8 load and print]
+DT[2004-08-04]
+KM[6.5]RU[Japanese]AP[GNU Go:3.5.8]AW[pa][qa][hb][pb][rb][cc]
+[dc][ic][qc][rc][bd][cd][dd][ed][hd][id][jd][kd][md][nd][rd][ae]
+[be][ce][ge][le][ne][oe][re][bf][df][ef][ff][of][qf][cg][pg][ch]
+[dh][oh][ci][ei][gi][ii][ni][oi][bj][ej][gj][hj][ij][mj][oj][pj]
+[qj][rj][sj][ak][ck][fk][gk][jk][mk][pk][qk][cl][dl][hl][jl][kl]
+[ll][ml][ol][pl][cm][gm][hm][im][om][sm][cn][gn][in][ln][pn][qn]
+[bo][co][do][go][io][oo][ap][cp][dp][gp][cq]
+AB[oa][bb][cb][db][ib][jb][ob][ac][bc][ec][gc][hc][jc][kc][lc]
+[mc][nc][oc][pc][ad][fd][gd][ld][pd][qd][de][ee][fe][he][pe][qe]
+[pf][dg][eg][eh][nh][qh][bi][di][li][mi][pi][cj][dj][lj][dk][ek]
+[lk][nk][ok][rk][sk][el][fl][gl][nl][ql][rl][dm][em][fm][jm][km]
+[lm][mm][nm][pm][qm][dn][fn][hn][jn][mn][nn][on][rn][eo][fo][ho]
+[jo][no][qo][bp][ep][hp][ip][pp][bq][dq][fq][gq][qq][ar][cr][dr]
+[as][cs]
+PL[W]
+)
diff --git a/regression/games/owl53.sgf b/regression/games/owl53.sgf
new file mode 100644 (file)
index 0000000..cbe35e0
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[9]
+AW[ca][ea][fa][cb][db][fb][cc][ec][fc][cd][dd][hd][id][de][he][hf][ag][bg][dg][gg][hg][ah][ch][dh][gh][bi][ci][ei][fi][gi]
+AB[ba][ga][ia][bb][gb][hb][bc][hc][ic][ad][bd][gd][be][ee][fe][ge][af][bf][df][cg][eg][eh]
+)
diff --git a/regression/games/owl54.sgf b/regression/games/owl54.sgf
new file mode 100644 (file)
index 0000000..5705b02
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[9]
+AW[ea][ab][bb][cb][eb][ib][dc][ec][hc][ic][id][he][af][bf][cf][df][ef][ff][gf][hf][bg][cg][ah][bh][dh][gh][hh][bi][ci][hi]
+AB[ba][ca][da][ha][gb][hb][bc][cc][fc][gc][ad][cd][ed][gd][hd][ae][be][ce][de][ee][fe][ge][if][dg][eg][fg][gg][hg][eh][ih][di][ei]
+)
diff --git a/regression/games/owl55.sgf b/regression/games/owl55.sgf
new file mode 100644 (file)
index 0000000..ceb7f55
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]
+SZ[9]
+GN[GNU Go 3.7.7 Random Seed 1138635371 level 10]
+DT[2006-01-31]
+KM[0.0]RU[Japanese]AP[GNU Go:3.7.7]HA[0]RE[W+24.0]
+;B[fd];W[ee];B[fe];W[ed];B[ef];W[ff];B[gf];W[fg];B[df];W[ec];B[gg]
+;W[fh];B[gh];W[dh];B[eh];W[eg];B[dg];W[ei];B[ch];W[cg];B[cf];W[bg]
+;B[bh];W[bf];B[ce];W[be];B[gb];W[fb];B[fc];W[eb];B[ga];W[gi];B[fa]
+;W[ea];B[ih];W[ge];B[gd];W[hi];B[hh];W[fi];B[di];W[ci];B[he];W[ah]
+;B[ii];W[];B[])
diff --git a/regression/games/paul.sgf b/regression/games/paul.sgf
new file mode 100644 (file)
index 0000000..2c33397
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[2]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-03-31]
+SY[Cgoban 1.9.14]TM[-]AB[pd][dp]
+RE[W+67.5]
+;W[dc];B[pp];W[nc];B[de];W[ee];B[ef];W[ed];B[dg];W[nq];B[lq];W[no];
+B[pn];W[nm];B[iq];W[pl];B[lc];W[qc];B[qd];W[pc];B[od];W[nb];B[me];
+W[cn];B[ph];W[ic];B[cl];W[cq];B[dq];W[cp];B[do];W[cr];B[dn];W[bn];
+B[el];W[ce];B[cf];W[be];B[ke];W[nk];B[dr];W[kn];B[io];W[pr];B[qp];
+W[rq];B[ql];W[qk];B[qm];W[rk];B[rp];W[im];B[rl];W[qq];B[pk];W[pj];
+B[rn];W[ah];B[ni];W[li];B[mj];W[hn];B[lj];W[ki];B[fo];W[kl];B[mh];
+W[gd];B[gl];W[kj];B[lh];W[ds];B[es];W[cs];B[fr];W[ri];B[rg];W[hk];
+B[rc];W[rb];B[jg];W[rd];B[re];W[sc];B[sq];W[sr];B[sp];W[mr];B[lr];
+W[ok];B[ei];W[ne];B[nd];W[kb];B[lb];W[ka];B[kc];W[jc];B[jd];W[gi];
+B[fi];W[bi];B[lk];W[ii];B[rr];W[rh];B[qr];W[pq];B[ss];W[qg];B[rf];
+W[pg];B[og];W[qh];B[gh];W[gj];B[ih];W[ll];B[oc];W[ob];B[oh];W[qf];
+B[qe];W[mi];B[nj];W[bk];B[bl];W[qs];B[pf];W[he];B[fj];W[kh];B[kg];
+W[hl];B[ff];W[gm];B[gk];W[go];B[fm];W[gp];B[hp];W[hi];B[hh];W[gq];
+B[gr];W[ck];B[dk];W[op];B[co];W[bo];B[oo];W[on];B[ak];W[aj];B[al];
+W[po];B[qo];W[cj];B[pm];W[om];B[dj];W[ci];B[bf];W[af];B[dd];W[cd];
+B[df];W[ms];B[kk];W[jk];B[ji];W[jj];B[jh];W[hq];B[kp];W[hr];B[hs];
+W[ir];B[jr];W[is];B[hf];W[ie];B[if];W[fe];B[id];W[hd];B[je];W[fq];
+B[mb];W[fn];B[en];W[gn];B[gs];W[fp];B[sh];W[si];B[sk];W[sj];B[sl];
+W[sg];B[dh];W[mk];B[eo];W[pi];B[gf];W[la];B[mc];W[eq];B[er];W[oo];
+B[ma];W[jb];B[na];W[pb];B[oa];W[cm];B[pa];W[qa];B[dm];W[bg];B[oi];
+W[ch];B[an];W[am];B[bm];W[ap];B[am];W[oj];B[of];W[sf];B[se];W[sh];
+B[sd];W[rc];B[di];W[ao];B[dl];W[ar];B[ge];W[fc];B[cg];W[ep];B[sr];
+W[ps];B[rs];W[tt];B[tt];
+TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ra][sa][ab][bb][cb][db][eb][fb][gb][hb][ib][qb][sb][ac][bc][cc][ec][gc][hc][ad][bd][fd][ae][ag][bh][ai][qi][bj][hj][ij][qj][rj][ik][pk][il][jl][ml][nl][ol][hm][jm][km][lm][mm][in][jn][ln][mn][nn][ho][io][jo][ko][lo][mo][bp][hp][ip][jp][kp][lp][mp][np][aq][bq][iq][jq][kq][lq][mq][oq][br][jr][kr][lr][nr][or][as][bs][js][ks][ls][ns][os]
+TB[kd][ld][md][le][ne][oe][pe][jf][kf][lf][mf][nf][eg][fg][gg][hg][ig][lg][mg][ng][eh][fh][nh][ej][ek][fk][fl][em][rm][sm][qn][sn][ro][so][fs]
+C[The game is over.  Final score:
+   White = 94 territory + 11 captures + 0.5 komi = 105.5
+   Black = 35 territory + 3 captures = 38
+White wins by 67.5.
+]
+)
diff --git a/regression/games/pending/README b/regression/games/pending/README
new file mode 100644 (file)
index 0000000..1c3a180
--- /dev/null
@@ -0,0 +1,2 @@
+nightmare.sgf   --- The tactical reading code produces an inordinate
+                    number of variations in this position.
diff --git a/regression/games/pending/bubble.sgf b/regression/games/pending/bubble.sgf
new file mode 100644 (file)
index 0000000..0bf1c36
--- /dev/null
@@ -0,0 +1,23 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[Rook]
+PB[Mike]
+GN[Rook (W) vs. Mike (B)]
+DT[2000-11-15]
+SY[Cgoban 1.9.7]TM[30:00(5x1:00)]
+RE[B+11.5]
+;B[fd]BL[1790];W[dd]WL[1800];B[ef]BL[1781];W[fc]WL[1800];B[gc]BL[1770]
+;W[ec]WL[1799];B[gd]BL[1766];W[cc]WL[1799];B[de]BL[1760];W[ce]WL[1797]
+;B[cf]BL[1756];W[be]WL[1796];B[fb]BL[1746];W[bf]WL[1795];B[cg]BL[1736]
+;W[ee]WL[1794];B[fe]BL[1727];W[df]WL[1793];B[dg]BL[1708];W[eb]WL[1792]
+;B[ga]BL[1687];W[bg]WL[1791];B[bh]BL[1685];W[de]WL[1789];B[eg]BL[1676]
+;W[ag]WL[1789];B[ah]BL[1666];W[ea]WL[1788];B[ff]BL[1630];W[fa]WL[1788]
+;B[gb]BL[1615];W[ed]WL[1788];B[tt]BL[1603];W[tt]WL[1787];
+TW[aa][ba][ca][da][ab][bb][cb][db][ac][bc][dc][ad][bd][cd][ae][af]
+TB[ha][ia][hb][ib][hc][ic][hd][id][ge][he][ie][gf][hf][if][fg][gg][hg][ig][ch][dh][eh][fh][gh][hh][ih][ai][bi][ci][di][ei][fi][gi][hi][ii]
+C[The game is over.  Final score:
+   White = 16 territory + 1 captures + 5.5 komi = 22.5
+   Black = 34 territory + 0 captures = 34
+Black wins by 11.5.
+]
+)
diff --git a/regression/games/pending/guestxx.sgf b/regression/games/pending/guestxx.sgf
new file mode 100644 (file)
index 0000000..e0445a0
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 2.7.242)]WR[15k*]
+PB[guestxx]BR[NR]
+PC[NNGS]DT[2001-06-21]AP[gnugoclient:1.9]
+RE[B+139.5]
+;B[pd];W[dp];B[pp];W[dc];B[pj];W[nc];B[pf];W[pn];B[np];W[qp];B[qo]
+;W[po];B[qn];W[qm];B[pm];W[rn]C[L:7];B[qq];W[rp]C[L:8];B[ql];W[pc]
+C[L:6];B[rm];W[pq]C[L:3];B[op];W[pr]C[L:4];B[qr];W[rr]C[L:5];B[or]
+;W[ps]C[L:6];B[qc];W[qb]C[L:7];B[ro];W[rb];B[rq];W[de]C[L:8];B[oc]
+;W[pb];B[od];W[ob];B[ld];W[jp]C[L:9];B[gp];W[dn]C[L:7];B[gm];W[ic]
+C[L:8];B[cg];W[ie]C[L:9];B[bd];W[gc];B[cc];W[db]C[L:10];B[cl];W[fo]
+;B[go];W[bm]C[L:9];B[dq];W[cq]C[L:8];B[cm];W[cn];B[eq];W[qd]C[L:9]
+;B[cr];W[bq]C[L:6];B[bl];W[eg]C[L:7];B[df];W[ef]C[L:8];B[ce];W[lc]
+C[L:7];B[dd];W[md]C[L:8];B[ee];W[le]C[L:7];B[ge];W[gg]C[L:8];B[hf]
+;W[ei];B[br];W[ch]C[L:6];B[dh];W[eh]C[L:5];B[di];W[ci]C[L:6];B[dj]
+;W[fk]C[L:7];B[em];W[an];B[bo];W[cj];B[dk];W[hq]C[L:6];B[bn];W[lp]
+;B[mr];W[kr]C[L:7];B[ko];W[fr]C[L:6];B[jq];W[kq]C[L:4];B[gq];W[gr]
+;B[iq];W[ip];B[hr];W[hp]C[L:5];B[ir];W[mo];B[er];W[gs];B[fq];W[is]
+C[L:6];B[jr];W[no]C[L:7];B[kp];W[in]C[L:5];B[io];W[js]C[L:4];B[lq]
+;W[jo]C[L:5];B[kn];W[oo];B[ho];W[jn]C[L:6];B[mp];W[lo];B[km];W[il]
+C[L:4];B[hk];W[jk]C[L:5];B[kk];W[hl]C[L:6];B[gl];W[gk]C[L:7];B[hj]
+;W[ii];B[hi];W[hg]C[L:6];B[jj];W[ij];B[ik];W[jl];B[ih];W[kl]C[L:7]
+;B[ji];W[mm]C[L:6];B[if];W[lg]C[L:7];B[qe];W[rd]C[L:8];B[kd];W[kc]
+;B[ke];W[kf]C[L:9];B[hd];W[mk]C[L:10];B[hc];W[ig]C[L:9];B[jg];W[kj]
+;B[jf];W[hb]C[L:8];B[id];W[jc];B[me];W[mh]C[L:9];B[ki];W[lj]C[L:10]
+;B[nl];W[lf];B[nd];W[oh];B[mc];W[qh];B[ph];W[pi];B[pg];W[qi]C[L:8]
+;B[nj];W[oj]C[L:9];B[nk];W[rk]C[L:7];B[qk];W[qj]C[L:8];B[ni];W[rf]
+C[L:4];B[li];W[pk]C[L:5];B[oi];W[lr]C[L:6];B[mq];W[om]C[L:7];B[ol]
+;W[nm]C[L:8];B[ml];W[pl]C[L:9];B[ll];W[lm]C[L:8];B[qm];W[lk]C[L:9]
+;B[re];W[rg]C[L:4];B[sd];W[mi]C[L:5];B[mj];W[kk];B[nh];W[rc]C[L:6]
+;B[nb];W[cb];B[bb];W[ba]C[L:7];B[ec];W[fb]C[L:8];B[eb];W[fa]C[L:9]
+;B[ea];W[sf]C[L:10];B[se];W[lb];B[fc];W[gb];B[gd];W[mb];B[na];W[rl]
+;B[sm];W[hm];B[sj];W[rj];B[sh];W[sl];B[qg];W[rh]C[L:9];B[hn];W[hs]
+;B[ma];W[ia];B[ls];W[oa]C[L:10];B[es];W[la];B[nc];W[qf];B[jd];W[bg]
+;B[bf];W[bi]C[L:9];B[bk];W[ks]C[L:10];B[ms];W[qs];B[sp];W[sc];B[pe]
+;W[fs];B[ng];W[pj];B[si];W[ok];B[ri];W[])
+
diff --git a/regression/games/pending/ko6.sgf b/regression/games/pending/ko6.sgf
new file mode 100644 (file)
index 0000000..2b10d94
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[Clinton]
+PB[Starr]
+GN[Clinton (W) vs. Starr (B)]
+DT[2001-04-12]
+SY[Cgoban 1.9.10]TM[-];B[pc];W[pe];B[dp];W[cd];B[qq];W[qc];B[qb];W[qd]
+;B[ob];W[qi];B[nd];W[ed];B[qn];W[cj];B[cl];W[gp];B[dn];W[jc];B[gc];
+W[fb];B[gb];W[hd];B[hf];W[cg];B[kq];W[gd];B[fc];W[eb];B[ec];W[db];
+B[fd];W[fe];B[dc];W[cc];B[dd];W[ql];B[ee];W[ef];B[df];W[ce];B[de];
+W[ff];B[np];W[og];B[lc];W[bl];B[bk];W[ck];B[bm];W[je];B[le];W[jg];
+B[hh];W[dg];B[ib];W[jb];B[gi];W[lf];B[kf];W[ke];B[jf];W[if];B[kg];
+W[ig];B[hg];W[kh];B[lg];W[mf];B[lh];W[li];B[ki];W[jh];B[mh];W[mi];
+B[nf];W[ng];B[me];W[mg];B[gn];W[ho];B[fq];W[ip];B[ir];W[jo];B[gq];
+W[jm];B[rl];W[rm];B[qm];W[rk];B[pl];W[cq];B[qk];W[kp];B[dq];W[cp];
+B[co];W[dr];B[er];W[jq];B[jr];W[hq];B[hr];W[br];B[lq];W[ln];B[rj];
+W[ri];B[rb];W[fh];B[ds];W[bo];B[cr];W[bs];B[ji];W[he];B[oj];W[rc];
+B[ml];W[dl];B[cm];W[bj];B[al];W[iq];B[nn];W[ma];B[pa];W[ej];B[fp];
+W[gk];B[jk];W[sb];B[ra];W[go];B[il];W[fm];B[fo];W[fn];B[gm];W[en];
+B[eo];W[fl];B[hm];W[hj];B[ii];W[sj];B[qj];W[sl];B[sk];W[si];B[rk];
+W[of];B[ne];W[kd];B[ic];W[ld];B[md];W[kc];B[lb];W[mb];B[mc];W[la];
+B[kb];W[ka];B[lp];W[ga];B[ha];W[hc];B[hb];W[ja];B[fa];W[lo];B[bn];
+W[bp];B[id];W[ie];B[ih];W[od];B[oc];W[nb];B[nc];W[oa];B[na];W[hl];
+B[im];W[oa];B[pd];W[oe];B[na];W[jl];B[qe];W[oa];B[pb];W[re];B[ik];
+W[kl];B[hk];W[gj];B[gl];W[lk];B[qf];W[rf];B[na];W[pi];B[aj];W[bi];
+B[mo];W[mk];B[nk];W[mm];B[nl];W[ai];B[ll];W[kk];B[nm];W[lm];B[cf];
+W[bf];B[ga];W[cs];B[oi];W[nh];B[ea];W[cb];B[oh];W[ph];B[pj];W[dm];
+B[ao];W[aq];B[ak];W[am];B[bl];W[dr];B[es];W[nj];B[ni];W[mj];B[cr];
+W[ap];B[dr];W[an];B[ao];W[an];B[mn];W[am];B[ao];W[an];B[do];W[am];
+B[ao];W[an];B[cn];W[oo];B[op];W[ao];B[on];W[am];B[tt];W[tt]
+)
diff --git a/regression/games/pending/nightmare.sgf b/regression/games/pending/nightmare.sgf
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/regression/games/pending/owl28.sgf b/regression/games/pending/owl28.sgf
new file mode 100644 (file)
index 0000000..4696193
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 2.7.246 (level 8) load and print]PB[Unknown]HA[3]KM[0.5]GN[GNU Go 2.7.246 load and print Random Seed 996604775] 
+AW[da][ea][pa][ra][cb][db][fb][gb][hb][ib][nb][pb][cc][fc][gc][mc][nc][pc][qc][rc][cd][hd][sd][ce][ee][ge][he][ne][qe][re][se][cf][df][ff][gf][mf][nf][of][qf][eg][hg][pg][fh][jh][ci][fi][ki][li][bj][cj][ej][hj][ij][jj][lj][qj][ak][ck][gk][ik][jk][kk][cl][fl][gl][gm][pm][gn][kn][pn][qn][rn][eo][fo][ko][lo][mo][qo][gp][eq][fq][rq][cr][dr][fr][gr][or][pr][qr][bs][os]
+AB[fa][ga][ha][ia][ja][la][na][oa][jb][kb][mb][sb][hc][ic][jc][lc][id][kd][ld][md][nd][od][pd][qd][rd][je][ke][me][jf][lf][rf][kg][mg][ng][qg][sg][oh][ph][qh][rh][ei][mj][nj][pj][rj][bk][dk][hk][lk][qk][rk][bl][dl][hl][il][jl][kl][pl][am][cm][em][fm][lm][nm][om][qm][rm][bn][cn][en][in][mn][on][do][jo][no][po][dp][hp][ip][kp][mp][pp][bq][cq][dq][gq][hq][jq][mq][oq][pq][br][hr][jr][lr][nr][is][ms]
+PL[W]
+IL[ka][ma][lb][kc][jd][le][kf][rg][bm][nn][jp][mr]
+)
diff --git a/regression/games/poka.sgf b/regression/games/poka.sgf
new file mode 100644 (file)
index 0000000..bfb4ba6
--- /dev/null
@@ -0,0 +1,33 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[ingwa-Poka88(B) NNGS]
+EV[None]
+RE[W+Resign]
+PW[ingwa]WR[6k*]
+PB[Poka88]BR[NR ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-12-30]
+SZ[9]TM[1800]KM[0.5]
+
+;B[df];W[ed];B[he]C[
+ kossa started observation.
+]
+;W[cd];B[gc];W[bf]C[
+ jpyllman started observation.
+]
+;B[bb];W[cg];B[eh];W[cb];B[gg];W[dh];B[ei];W[fc];B[gb];W[fb];B[di];W[gd]
+;B[ga];W[hd];B[hc];W[id];B[ic];W[ci];B[dg];W[ch];B[bh];W[ie];B[ig];W[hf]
+;B[hg];W[ge];B[ef];W[ff];B[fg];W[gf];B[fd];W[ee];B[de];W[ce];B[dd];W[bc]
+;B[fa]C[
+ schorsch started observation.
+]
+;W[ec];B[ah];W[dc];B[eg];W[cf];B[bi];W[if];B[ea];W[tt];B[eb];W[tt];B[ab]
+;W[tt];B[ca];W[ba];B[da];W[ac];B[ag];W[tt];B[af];W[tt];B[ae];W[tt];B[be]
+;W[tt];B[gi];W[tt]C[
+ Poka88 NR : Poka plays Chinese rules.  It doesn't think filling in costs anything. (70)
+]
+;B[hh];W[tt];B[ia];W[hb];B[db];W[cc]
+;)
diff --git a/regression/games/pooo.sgf b/regression/games/pooo.sgf
new file mode 100644 (file)
index 0000000..7ddb579
--- /dev/null
@@ -0,0 +1,70 @@
+(;GM[1]FF[3]
+SZ[19]HA[9]KM[0.5]
+PW[pooo]
+WR[11k*]
+PB[GnuGo (GNU Go 3.1.8)]
+BR[14k*]PC[NNGS]
+DT[2001-10-07]
+AP[gnugoclient:2.0]
+RE[W+33.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp];W[fp];B[dn];W[iq];B[eq];W[eo];
+B[do];W[fq];B[fm];W[nq];B[or]C[!P2
+];W[dq];B[er];W[cq];B[dr];W[cr];
+B[cs]C[!C1
+];W[bs];B[ds];W[bq];B[ep];W[fn];B[ar];W[bo];B[qn]C[C4|C6
+];
+W[op];B[nc];W[qf];B[re];W[qc];B[fc];W[cl];B[cg];W[cc];B[dc]C[C16
+];
+W[cd];B[cb];W[bb];B[db];W[bd];B[bf];W[ba];B[ac];W[ab];B[ad];W[ae];
+B[be];W[bc];B[ad];W[ce];B[af]C[E14
+];W[cf];B[df]C[D13
+];W[bg];B[bh];
+W[dg];B[ag];W[ch];B[de];W[bg];B[bi];W[ah];B[cg]C[L:5];W[ci];
+B[ca]C[L:3];W[cj];B[ai]C[L:4];W[bg];B[em]C[L:5];W[pc];B[cg]C[L:3];
+W[po];B[bg]C[L:4];W[di];B[qp]C[A15
+];W[qo];B[ob]C[L:5];W[qd];B[qh]
+C[L:6];W[od];B[qe];W[pe];B[rf]C[L:7];W[lc];B[ld]C[L:6];W[kc];B[om];
+W[rp];B[qq]C[!R3
+];W[rq];B[oq];W[nr];B[oo];W[np];B[ro];W[pn];B[pm];
+W[qr];B[on]C[L:5];W[pr];B[ej]C[L:6];W[ic];B[gj]C[L:5];W[eg];B[pf];
+W[of];B[kd]C[L:6];W[mc];B[pg]C[L:4];W[nd];B[hb]C[L:5];W[id];B[jc]
+C[L:6];W[ib];B[jb]C[L:5];W[ha];B[mb]C[L:6];W[fa];B[ie]C[L:4];W[he];
+B[hd];W[if];B[md]C[L:3];W[je];B[gb]C[L:4];W[ga];B[hh]C[L:5];W[gd];
+B[jg]C[L:6];W[ko];B[hc]C[L:7];W[fd];B[ec]C[L:8];W[ff];B[io]C[L:9];
+W[hn];B[ln];W[kp];B[fr]C[L:10];W[gq];B[bn]C[L:7];W[ao];B[cp]C[L:5];
+W[bp];B[eh]C[L:4];W[fh];B[ei];W[dh];B[ee]C[L:5];W[jn];B[aq];W[bm];
+B[cn];W[an];B[lm];W[gm];B[il];W[hj];B[gg]C[L:3];W[hg];B[gl]C[L:1];
+W[fj];B[jm]C[L:2];W[im];B[fk]C[L:3];W[fi];B[gi]C[L:1];W[fg];B[jl]
+C[L:2];W[hk];B[hl];W[gk];B[ig]C[L:1];W[gf];B[gh]C[L:2];W[ih];B[hf]
+C[L:3];W[ek];B[fl]C[L:4];W[hg];B[mg]C[L:5];W[hi];B[ne]C[L:6];W[nf];
+B[dk]C[L:5];W[me];B[ck]C[L:6];W[bk];B[dl]C[L:7];W[bj];B[in]C[L:8];
+W[hm];B[pb];W[qb];B[pq]C[L:9];W[os];B[rr]C[L:10];W[rs];B[sr];W[nh];
+B[ng]C[L:7];W[li];B[og];W[lg];B[lf];W[kg];B[mf]C[L:5];W[nk];B[mh]
+C[L:6];W[kj];B[mi]C[L:7];W[mj];B[ni]C[L:8];W[pk];B[qk]C[L:9];W[oj];
+B[oi]C[L:10];W[qj];B[rk];W[pi];B[rj];W[nm];B[nn];W[ol];B[sc];W[oc];
+B[nb]C[L:8];W[mo];B[mm]C[L:9];W[sb];B[oe];W[sd];B[ra]C[L:10];W[qa];
+B[rd];W[kk];B[ij]C[L:9];W[ji];B[nl]C[L:10];W[ml];B[gr];W[hr];B[go]
+C[L:8];W[gn];B[fo]C[L:7];W[ho];B[en]C[L:8];W[hp];B[br]C[L:9];W[jq];
+B[as]C[L:10];W[nm];B[qi];W[pj];B[lh];W[kh];B[cm];W[bl];B[kn];W[jo];
+B[ll];W[lk];B[lo];W[lp];B[rc];W[ph];B[rb];W[oh];B[hs];W[is];B[gs];
+W[pl];B[ql];W[ke];B[le];W[kf];B[ja];W[ia];B[kl];W[no];B[nl];W[po];
+B[nj];W[qo];B[ok];W[rn];B[mk];W[rm];B[rl];W[ki];B[sm];W[so];B[lj];
+W[qm];B[pn];W[sn];B[sl];W[gp];B[eo];W[tt];B[mj];W[tt];B[mn];W[tt];
+B[jk];W[ii];B[ik];W[tt];B[co];W[tt];B[bs];W[am];B[ap];W[tt];B[tt]
+C[T2 removed
+B13 removed
+D16 removed
+A16 removed
+final_score: W+29.5
+H18 removed
+R19 removed
+T18 removed
+L17 removed
+T16 removed
+Q15 removed
+R14 removed
+J13 removed
+E9 removed
+J6 removed
+K4 removed]
+)
diff --git a/regression/games/reading01.sgf b/regression/games/reading01.sgf
new file mode 100644 (file)
index 0000000..97db12d
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-04]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[gc][hc][dd][ed][hd][de][he][df][ff][gf][hf][eg][gg][dh][gh][di][ei][fi][gi]
+AB[cc][dc][ec][bd][cd][fd][gd][be][ee][bf][ef][bg][cg][dg][fg][fh]
+)
diff --git a/regression/games/reading02.sgf b/regression/games/reading02.sgf
new file mode 100644 (file)
index 0000000..2be2baf
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-04]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[hc][ic][hd][he][ie][hf][cg][dg][eg][hg][ig][ch][fh][gh][di]
+AB[ad][bd][be][af][bf][cf][df][ef][ff][bg][fg][gg][ah][bh][eh][ei]
+)
diff --git a/regression/games/reading03.sgf b/regression/games/reading03.sgf
new file mode 100644 (file)
index 0000000..2803a29
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-11]
+SY[Cgoban 1.9.10]TM[30:00(5x1:00)];
+AW[ea][ha][cb][db][eb][cc][dc][ec][fc][cd][ed][gd][de][fe][he][cf][df][ff][hf][dg][gg][ig][ch][dh][bi][ci]
+AB[aa][ba][ca][da][fa][ab][bb][fb][gb][hb][bc][gc][ic][bd][hd][id][be][ce][ie][bf][if][ag][bg][cg][bh][ai]
+)
diff --git a/regression/games/reading04.sgf b/regression/games/reading04.sgf
new file mode 100644 (file)
index 0000000..88d96f4
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.149 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.149 ascii Random Seed 965684625] 
+LB[dd:75]
+C[Value of move: 75]
+;B[dd];W[pp];B[pd];W[dp];B[qn];W[jp];B[np];W[pn];B[pm];W[on]
+;B[qo];W[op];B[ck];W[qf];B[qh];W[qc];B[cn];W[qd];B[fp];W[dn]
+;B[dm];W[en];B[co];W[ep];B[lp];W[jq];B[mm];W[om];B[pl];W[ol]
+;B[pk];W[qp];B[ok];W[nk];B[lk];W[nj];B[pi];W[km];B[mo];W[cf]
+;B[ch];W[cc];B[nq];W[or];B[ko];W[jo];B[cd];W[dc];B[ed];W[bd]
+;B[be];W[bc];B[ce];W[fc];B[df];W[ll];B[kc];W[pe];B[hc];W[gc]
+;B[nh];W[hd];B[hb];W[mc];B[hf];W[id];B[ke];W[me];B[cq];W[cp]
+;B[bp];W[cm];B[dl];W[bo];B[bn];W[bq];B[ao];W[cr];B[ml];W[mk]
+;B[jn];W[kn];B[kl];W[jm];B[lm];W[nl];B[in];W[im];B[io];W[hp]
+;B[go];W[gm];B[fn];W[fm];B[gd];W[fd];B[ge];W[fe];B[em];W[je]
+;B[kb];W[kf];B[gb];W[fb];B[ic];W[kd];B[ia];W[jb];B[ln];W[hm]
+;B[jc];W[mb];B[ga];W[gf];B[jg];W[he];B[le];W[lf];B[ld];W[lc]
+;B[jd];W[md];B[hg];W[cj];B[kd];W[dj];B[ij];W[bj];B[fj];W[bk]
+;B[bm];W[ek];B[bl];W[fk];B[gi];W[fh];B[bi];W[bg];B[kj];W[ro]
+;B[ei];W[dh];B[cg];W[bf];B[di];W[eh];B[bh];W[dk];B[cl];W[ag]
+;B[ci];W[gk];B[rn];W[rp];B[aq];W[dq];B[gp];W[ho];B[br];W[fi]
+;B[gj];W[ej];B[ae];W[af];B[fa];W[eb];B[lr];W[nr];B[is];W[kr]
+;B[eo];W[do];B[gn];W[hq];B[cq];W[er];B[ks];W[kp];B[mi];W[lq]
+;B[mg];W[mq];B[jf];W[mf];B[ie];W[rg];B[nf];W[ri];B[ne];W[oh]
+;B[oi];W[og];B[ni];W[ng];B[pg];W[of];B[rk];W[qj];B[lo];W[li]
+;B[lh];W[ki];B[mj];W[ji];B[ik];W[lj];B[rj];W[qi];B[ph];W[ii]
+;B[kg];W[jj];B[hi];W[kk];B[jl];W[ll];B[nn];W[jk];B[lk];W[il]
+;B[ll];W[hj];B[oo];W[po];B[hk];W[hl];B[cs];W[bq];B[ih];W[hj]
+;B[cq];W[lg];B[dr];W[eq];B[ql];W[rm];B[es];W[fr];B[sn];W[sj]
+;B[gr];W[gq];B[fq];W[fo];B[gs];W[hn];B[fs];W[kh];B[mh];W[ir]
+;B[js];W[mr];B[ls];W[jr];B[hs];W[gg];B[hh];W[la];B[sh];W[rh]
+;B[el];W[ea];B[ee];W[ef];B[dg];W[eg];B[fl];W[ai];B[ah];W[ad]
+;B[aj];W[ak];B[ai];W[gl];B[al];W[ms];B[ka];W[lb];B[ec];W[hr]
+;B[ds];W[jh];B[gh];W[tt];B[rl];W[sm];B[sl];W[tt];B[tt]
+)
diff --git a/regression/games/reading05.sgf b/regression/games/reading05.sgf
new file mode 100644 (file)
index 0000000..cfc6eac
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.151 load and print]HA[9]KM[0.5]GN[GNU Go 2.7.151 load and print Random Seed 965924192] 
+AW[cb][db][kb][nb][dc][ic][jc][lc][cd][id][ld][rd][ce][de][ie][ke][me][jf][mf][qf][cg][dg][lg][eh][ph][qh][rh][bi][ci][di][ei][ni][pi][si][bj][ej][qj][ek][pk][qk][bl][cl][nl][ol][qm][rm][gn][fq][hq][dr][fr][jr]
+AB[bb][eb][bc][cc][ec][qc][rc][dd][ed][fd][nd][pd][ge][le][kf][lf][of][rf][eg][fg][hg][jg][kg][pg][qg][rg][bh][ch][dh][gi][qi][ri][cj][dj][jj][oj][pj][ak][bk][ck][ok][pl][pm][cn][rn][lo][qo][dp][jp][mp][pp][cq][cr][er][lr][ds]
+PL[B]
+
+)
diff --git a/regression/games/reading06.sgf b/regression/games/reading06.sgf
new file mode 100644 (file)
index 0000000..fe3b0d3
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.156 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.156 load and print Random Seed 967164009] 
+AW[dm][qm][rm][rn][qo][qp][hq][kq]
+AB[dd][pd][pn][qn][po][ro][dp][fp][oq][gr]
+PL[B]
+
+)
diff --git a/regression/games/reading07.sgf b/regression/games/reading07.sgf
new file mode 100644 (file)
index 0000000..d0d20d8
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-08-30]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];PL[W]
+AW[ea][cb][db][fb][gb][hb][cc][gc][cd][gd][ce][de][fe][cf][ff][gf][hf][if][ag][bg][cg][hg][ah][ch][hh][ih][bi][hi]
+AB[ba][ca][da][ga][ha][ia][bb][eb][ib][bc][dc][fc][hc][ic][bd][dd][ed][fd][hd][ae][be][ee][ge][he][ie][ef][eg][eh][ei]
+;W[ec]
+)
diff --git a/regression/games/reading08.sgf b/regression/games/reading08.sgf
new file mode 100644 (file)
index 0000000..b31de54
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-08-31]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ca][ga][cb][fb][gb][cc][dc][fc][cd][fd][de][ee][fe]
+AB[ba][ha][bb][eb][hb][bc][ec][gc][hc][bd][dd][gd][be][ce][ge][cf][df][ef][ff][gf]
+)
diff --git a/regression/games/reading09.sgf b/regression/games/reading09.sgf
new file mode 100644 (file)
index 0000000..64bf6ce
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-08-31]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];;
+AW[ea][eb][ec][ed][fd][ce][de][fe][ge][he][bf][df][hf][bg][cg][dg][hg][dh][gh][hh][di][hi]
+AB[ba][bb][bc][bd][cd][dd][ae][be][ee][af][ef][ff][gf][ag][eg][gg][ah][bh][eh][fh][bi][ei][gi]
+;B[ch];W[fi]
+)
diff --git a/regression/games/reading10.sgf b/regression/games/reading10.sgf
new file mode 100644 (file)
index 0000000..6b4440e
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-19]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ae][be][ee][bf][ef][bg][ah][bh][ch][dh][eh][bi][ei]
+AB[bb][cb][db][bc][dc][ec][fc][ad][bd][dd][fd][gd][ce][ge][df][gf][eg][fg][gg][fh][fi]
+)
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-19]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ae][be][ee][bf][ef][bg][ah][bh][ch][dh][eh][bi][ei]
+AB[bb][cb][db][bc][dc][ec][fc][ad][bd][dd][fd][gd][ce][ge][df][gf][eg][fg][gg][fh][fi]
+)
diff --git a/regression/games/reading11.sgf b/regression/games/reading11.sgf
new file mode 100644 (file)
index 0000000..6ae9a8c
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-26]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ba][ab][bb][ac][fc][ad][bd][ed][gd][be][fe][ge][bf][cf][gf][cg][dg][eg][gg][dh][di]
+AB[da][ea][fa][fb][gb][gc][hc][dd][hd][id][ee][ie][ff][if][fg][hg][ig][eh][gh][hh][ei][fi][gi]
+)
+
diff --git a/regression/games/reading12.sgf b/regression/games/reading12.sgf
new file mode 100644 (file)
index 0000000..49bfaa4
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-27]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ga][ab][gb][hb][bc][hc][ic][ad][cd][dd][de][ee][fe][he][ie][df][ff][gf][hf][cg][dg][hg][ig][ch][ih][ci][ii]
+AB[ba][ea][bb][cb][db][eb][fb][ec][gc][ed][fd][gd][hd][id][be][af][bf][bg][eg][fg][gg][ah][bh][dh][fh][hh][bi][di][hi]
+)
diff --git a/regression/games/reading13.sgf b/regression/games/reading13.sgf
new file mode 100644 (file)
index 0000000..040fd3d
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-27]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[be][ce][de][ee][bf][ff][gf][hf][bg][fg][hg][ig][ah][bh][eh][fh][gh][ih][bi][gi][hi]
+AB[dc][ec][fc][ad][bd][cd][dd][fd][ae][fe][af][cf][df][ef][cg][eg][ch][dh][ci][ei][fi]
+PL[W];W[di];B[ei];W[fi]
+)
diff --git a/regression/games/reading14.sgf b/regression/games/reading14.sgf
new file mode 100644 (file)
index 0000000..bf584ad
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-27]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ba][da][ab][bb][cb][db][ac][ad][ed][ae][be][df][ef]
+AB[fc][gc][gd][fe][ge][cf][ff][cg][dg][eg][fg]
+)
diff --git a/regression/games/reading15.sgf b/regression/games/reading15.sgf
new file mode 100644 (file)
index 0000000..99dd65f
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-27]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ba][ca][ga][ha][bb][db][fb][hb][cc][dc][fc][gc][dd][fd][ae][be][he][ie][af][cf][gf][if][bg][cg][gg][hg][bi][hi][ii]
+AB[aa][ea][ab][ib][ac][bc][ec][hc][ic][ad][bd][cd][ed][gd][hd][id][ce][de][ee][fe][ge][df][ff][dg][fg][ah][dh][fh][ih][ci][di][fi][gi]
+)
diff --git a/regression/games/reading16.sgf b/regression/games/reading16.sgf
new file mode 100644 (file)
index 0000000..49b49d2
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.170 load and print]
+HA[0]KM[5.5]
+GN[GNU Go 2.7.170 load and print Random Seed 969905749]
+AW[cb][ob][cc][kc][mc][nc][bd][jd][ie][bf][cf][df][mg][eh][dj][fl][cm][gm][im][bn][nn][co][lo][oo][dp][fq][iq][kq][kr]
+AB[db][nb][dc][fc][ic][cd][ed][od][qd][de][me][ch][aj][qj][bk][ck][dk][ek][al][cl][dl][bm][em][pn][io][jp][kp][qp][jq][lq][oq]
+PL[B]IL[dd][ak][bl]
+)
+
diff --git a/regression/games/reading17.sgf b/regression/games/reading17.sgf
new file mode 100644 (file)
index 0000000..33c963c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-28]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[aa][ca][da][fa][ga][bb][cb][gb][hb][ib][ac][bc][fc][gc][ic][dd][ed][hd][id][ee][eg][fg][eh]
+AB[eb][dc][ec][cd][fd][gd][ae][be][ce][ge][he][bf][hf][if][bg][cg][gg][hg][ch][fh][gh][ci][di][ei][fi]
+)
diff --git a/regression/games/reading18.sgf b/regression/games/reading18.sgf
new file mode 100644 (file)
index 0000000..2668d83
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-28]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ga][gb][gc][dd][hd][ce][ee][he][ie][bf][df][hf][bg][hg][ig][ah][bh][ch][dh][hh][bi][di][hi]
+AB[ea][ia][eb][fb][ib][cc][dc][ec][hc][ic][ed][fd][gd][fe][ef][ff][cg][dg][eg]
+)
diff --git a/regression/games/reading19.sgf b/regression/games/reading19.sgf
new file mode 100644 (file)
index 0000000..92148fb
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.173 load and print]HA[0]KM[0.0]GN[GNU Go 2.7.173 load and print Random Seed 970266530] 
+AW[ca][ia][oa][bb][db][eb][hb][jb][nb][ob][pb][bc][cc][ec][fc][ic][jc][mc][nc][fd][kd][ld][ce][de][ee][fe][me][pe][cf][lf][pf][cg][lg][rg][bh][ch][eh][lh][oh][rh][ai][bi][ci][mi][ni][oi][pi][qi][ri][bj][mj][pj][ck][ek][ik][kk][mk][pk][qk][rk][gl][jl][pl][jm][jo][mo][ro][cp][ep][qp][sp][jq][kq][lq][oq][qq][rq][hr][jr][or][pr][qr][is]
+AB[ja][ka][ma][na][ab][fb][gb][lb][mb][qb][ac][dc][gc][hc][kc][lc][pc][ad][bd][cd][dd][ed][id][jd][od][pd][be][he][ke][qe][af][bf][df][jf][nf][rf][ag][bg][dg][kg][ng][og][pg][qg][ah][hh][kh][mh][nh][ph][fi][ji][li][gj][lj][qj][rj][sj][lk][nk][sk][kl][ml][ol][ql][rl][lm][nm][pm][pn][qn][rn][oo][qo][np][pp][mq][pq][sq][kr][lr][mr][js][ks]
+PL[B]
+IL[cb][ib][rp]
+)
diff --git a/regression/games/reading20.sgf b/regression/games/reading20.sgf
new file mode 100644 (file)
index 0000000..175293f
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.179 load and print]
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]KM[0.5]
+GN[GNU Go 2.7.179 load and print Random Seed 971294461]
+AW[cb][db][eb][dc][cd][hd][ld][md][rd][be][ce][de][ee][ge][ie][ff][gf][hf][jf][kf][lf][mf][qf][rf][cg][dg][gg][kg][ng][fh][gh][hh][ih][kh][lh][nh][ph][ri][mj][nj][sj][ik][lk][qk][rk][il][ll][im][mm][in][kn][ln][nn][on][qn][fo][go][ho][io][po][gp][hp][ip][qp][fq][hq][nq][oq][qq][fr][hr]
+AB[ea][fb][ec][fc][gc][ic][kc][lc][mc][qc][rc][ed][gd][nd][qd][fe][je][le][me][oe][re][bf][if][nf][bg][eg][fg][hg][ig][jg][lg][mg][ch][dh][eh][jh][fi][ji][li][kj][lj][qj][rj][mk][nk][pk][jl][kl][dm][jm][km][fn][jn][co][eo][jo][ko][oo][ep][fp][lp][np][op][gq][iq][pq][gr][ir][pr][gs][hs]
+PL[B]IL[he]
+)
diff --git a/regression/games/reading21.sgf b/regression/games/reading21.sgf
new file mode 100644 (file)
index 0000000..fae7873
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-10-11]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];;
+AW[da][fa][eb][fb][gb][ac][bc][bd][fd][gd][ae][be][ce][de][ee][fe][bf][ff][gf][ag][bg][eh][fh][gh][di][fi]
+AB[ca][ha][ab][bb][cb][db][hb][ib][cc][ec][gc][hc][cd][dd][ed][hd][he][cf][df][ef][hf][cg][eg][hg][ah][bh][ch][dh][hh][ih][ci][hi]
+)
diff --git a/regression/games/reading22.sgf b/regression/games/reading22.sgf
new file mode 100644 (file)
index 0000000..effee1b
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-10-12]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[gb][hb][ec][fc][gc][hc][ic][hd][id][ge][ie][gf][eg][fg][ah][bh][ch][dh][eh][hh][ci][ei]
+AB[ba][da][ga][ha][ab][bb][cb][db][eb][fb][ib][gd][he][ff][hf][if][gg][ig][fh][ih][fi][gi][hi][ii]
+)
diff --git a/regression/games/reading23.sgf b/regression/games/reading23.sgf
new file mode 100644 (file)
index 0000000..edc9ddf
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-01-02]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[bb][cb][eb][gb][hb][dc][ec][hc][ic][hd][ae][be][ce][he][ie][bf][df][hf][ag][bg][cg][dg][gg][hg][ig][eh][fh]
+AB[da][ab][fb][ac][bc][fc][gc][bd][cd][dd][ed][gd][ee][fe][ge][ef][gf][eg][fg][ch][dh][gh]
+)
diff --git a/regression/games/reading24.sgf b/regression/games/reading24.sgf
new file mode 100644 (file)
index 0000000..1fd4b1a
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.217 ascii]HA[0]KM[5.5]GN[GNU Go 2.7.217 ascii Random Seed 981986781] 
+;B[cg];W[dc];B[ee];W[fd];B[fe];W[gg];B[gf];W[fg];B[eg];W[eh]
+;B[dh];W[fi];B[ed];W[gd];B[ec];W[hf];B[ge];W[he];B[di];W[cd]
+;B[dd];W[db];B[eb];W[ce];B[da];W[bb];B[ca];W[bf];B[cb];W[cc]
+;B[ba];W[ac];B[cf];W[bg];B[gc];W[hc];B[fc];W[hd];B[hb];W[ib]
+;B[ia];W[ic];B[ga];W[ef];B[df];W[ff];B[de];W[fh];B[bh];W[bd]
+;B[ag];W[ae];B[af];W[ah];B[bi];W[ha];B[gb];W[ab];B[ia];W[aa]
+;B[ea];W[ei];B[ha];W[dg];B[hg];W[hh];B[ig];W[ch];B[eg];W[ih]
+;B[ci];W[dg];B[ai];W[ch]
+)
diff --git a/regression/games/reading25.sgf b/regression/games/reading25.sgf
new file mode 100644 (file)
index 0000000..a578bca
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-02-16]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[aa][ha][bb][db][fb][gb][ib][ac][cc][dc][hc][ic][bd][cd][fd][gd][hd][ae][ce][he][bf][ef][ff][hf][bg][dg][fg][gg][ah][eh][fh][ei][fi]
+AB[ba][ca][da][ea][fa][ga][cb][eb][ec][fc][gc][dd][ed][de][ee][fe][ge][cf][df][gf][cg][bh][ch][dh][ai][ci][di]
+;
+)
diff --git a/regression/games/reading26.sgf b/regression/games/reading26.sgf
new file mode 100644 (file)
index 0000000..c675e59
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-02-16]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ba][ha][ab][bb][hb][bc][hc][bd][hd][ae][be][he][af][hf][ag][gg][hg][ch][dh][eh][gh][ih][bi][di]
+AB[ca][fa][cb][fb][cc][fc][cd][fd][ce][de][ee][fe][bf][cf][ff][bg][fg][bh][fh][hh][ai][ei][gi][hi]
+)
diff --git a/regression/games/reading27.sgf b/regression/games/reading27.sgf
new file mode 100644 (file)
index 0000000..d2fb99b
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.226 ascii]HA[4]KM[0.5]GN[GNU Go 2.7.226 ascii Random Seed 985184862] 
+AB[dd]AB[pd]AB[dp]AB[pp]
+;W[pj];B[dj];W[qf];B[pf];W[pg];B[of];W[pe];B[oe];W[qe];B[jp]
+;W[qm];B[qo];W[pn];B[jd];W[jj];B[fq];W[gd];B[df];W[md];B[co]
+;W[mp];B[ec];W[gc];B[nq];W[mq];B[mf];W[ke];B[ic];W[ie];B[hb]
+;W[gb];B[lc];W[oc];B[nb];W[od];B[mh];W[mj];B[ob];W[pb];B[pa]
+;W[qb];B[fb];W[kc];B[kd];W[mc];B[lb];W[mb];B[ma];W[qa];B[jg]
+;W[ld];B[kb];W[id];B[lf];W[je];B[jc];W[hg];B[ih];W[hi];B[le]
+;W[ig];B[kh];W[dh];B[ch];W[cg];B[kj];W[kk];B[dg];W[ci];B[bh]
+;W[di];B[bi];W[cj];B[qg];W[rg];B[ej];W[bj];B[bg];W[cf];B[ce]
+;W[eg];B[nd];W[nc];B[pc];W[ne];B[me];W[og];B[nd];W[qc];B[qd]
+;W[rd];B[rc];W[rb];B[re];W[rf];B[sd];W[qh];B[rn];W[rm];B[hk]
+;W[ng];B[fj];W[nf];B[od];W[ki];B[kq];W[fh];B[in];W[cl];B[dm]
+;W[dl];B[fl];W[ed];B[ef];W[ff];B[sm];W[sl];B[sn];W[rk];B[ee]
+;W[fe];B[bf];W[fc];B[eb];W[cc];B[aj];W[ak];B[ai];W[bk];B[jl]
+;W[kl];B[km];W[lm];B[kn];W[ln];B[bd];W[qn];B[ro];W[cn];B[cm]
+;W[bm];B[dn];W[bn];B[bo];W[cq];B[dq];W[dr];B[er];W[br];B[ds]
+;W[cs];B[cr];W[bs];B[li];W[lj];B[np];W[no];B[bq];W[dr];B[cp]
+;W[ao];B[ap];W[an];B[oo];W[on];B[lq];W[po];B[mr];W[op];B[oq]
+;W[qp];B[rp];W[pq];B[qq];W[pp];B[qr];W[lr];B[mo];W[mn];B[pr]
+;W[lo];B[nr];W[ko];B[jo];W[jm];B[jn];W[im];B[il];W[hm];B[hn]
+;W[gm];B[gn];W[fm];B[el];W[gk];B[gl];W[hl];B[ik];W[gj];B[dk]
+;W[en];B[eo];W[ij];B[em];W[ei];B[lp];W[mo];B[ck];W[bl];B[fi]
+;W[gi];B[fk];W[mi];B[lh];W[nh];B[jf];W[hc];B[ga];W[ib];B[ha]
+;W[ia];B[fa];W[dc];B[db];W[cb];B[fd];W[rq];B[sq];W[ed];B[jb]
+;W[fd];B[cd];W[bc];B[ji];W[ab];B[ba];W[ii];B[jh];W[mg];B[lg]
+;W[kf];B[ad];W[if];B[hh];W[gh];B[sf];W[sg];B[se];W[kp];B[kj]
+;W[jq];B[kr];W[jr];B[ks];W[js];B[ls];W[fr];B[ar];W[es];B[iq]
+;W[eq];B[cr];W[gq];B[hr];W[fp];B[gr];W[ep];B[gp];W[go];B[hp]
+;W[fo];B[fn];W[as];B[ds];W[sp];B[rr];W[da];B[ja];W[tt];B[ki]
+;W[jk];B[hj];W[kg];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/reading28.sgf b/regression/games/reading28.sgf
new file mode 100644 (file)
index 0000000..64a83fa
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-04-25]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25]
+;AW[db][dc][ec][fc][gc][dd][gd][hd][de][he][ie][df][dg][dh][di]
+AB[fa][ga][ha][eb][fb][hb][ib][hc]
+)
diff --git a/regression/games/reading29.sgf b/regression/games/reading29.sgf
new file mode 100644 (file)
index 0000000..3109d85
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.229 gmp]
+HA[0]KM[5.5]
+GN[GNU Go 2.7.229 gmp Random Seed 0]
+;B[pd];W[dp];B[cc];W[pp];B[cn];W[fp];B[bp];W[cl];B[cq];W[co];B[bo];
+W[dn];B[dm];W[cm];B[bn];W[em];B[qn];W[pn];B[pm];W[on];B[qo];W[qp];
+B[qj];W[np];B[cf];W[dl];B[lp];W[mn];B[jc];W[jq];B[jp];W[ip];B[jo];
+W[dq];B[gd];W[kq];B[lo];W[jm];B[mq];W[nq];B[in];W[mr];B[jk];W[hm];
+B[ho];W[ln];B[jn];W[qf];B[km];W[kn];B[nd];W[im];B[gn];W[rd];B[io];
+W[qc];B[kl];W[gm];B[of];W[pg];B[pc];W[cp];B[am];W[bq];B[aq];W[cr];
+B[ap];W[ci];B[ei];W[dh];B[bj];W[cj];B[pb];W[bg];B[nh];W[df];B[ce];
+W[ad];B[bk];W[qb];B[ed];W[pa];B[oa];W[qa];B[nb];W[ro];B[qm];W[gj];
+B[ek];W[cg];B[bf];W[bd];B[af];W[fj];B[ag];W[ar];B[bm];W[fh];B[cd];
+W[gf];B[ej];W[gg];B[lf];W[hk];B[qh];W[rg];B[ph];W[sj];B[og];W[bl];
+B[al];W[bi];B[ai];W[jf];B[rh];W[sh];B[kh];W[jh];B[ji];W[ke];B[lh];
+W[ih];B[nl];W[id];B[ic];W[hd];B[hc];W[ml];B[mk];W[ll];B[lk];W[nm];
+B[ol];W[lc];B[lb];W[le];B[mb];W[rn];B[rm];W[lm];B[hp];W[jl];B[kk];
+W[bh];B[ah];W[sl];B[iq];W[hr];B[gq];W[ir];B[gr];W[sm];B[er];W[qk];
+B[pk];W[ql];B[rk];W[rl];B[om];W[rj];B[pj];W[fq];B[fr];W[ri];B[me];
+W[kg];B[eg];W[eh];B[ef];W[lg];B[dg];W[mg];B[mf];W[mh];B[mi];W[ii];
+B[ng];W[ki];B[li];W[jj];B[sn];W[rp];B[jd];W[kf];B[he];W[ie];B[ge];
+W[kj];B[hf];W[kd];B[hg];W[hh];B[ff];W[mc];B[nc];W[kc];B[kb];W[md];
+B[ik];W[ij];B[il];W[qe];B[pe];W[ig];B[lj];W[if];B[qi];W[qg];B[po];
+W[oo];B[qd];W[ck];B[je];W[hl];B[fg];W[gh];B[pf];W[sk];B[pl];W[bb];
+B[lr]
+)
diff --git a/regression/games/reading30.sgf b/regression/games/reading30.sgf
new file mode 100644 (file)
index 0000000..16b7cbb
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.229 gmp]
+HA[0]KM[5.5]
+GN[GNU Go 2.7.229 gmp Random Seed 0]
+;B[qc];W[dp];B[de];W[qq];B[dc];W[jc];B[cn];W[fq];B[bp];W[cq];B[ck];
+W[pd];B[hq];W[qd];B[bq];W[rc];B[en];W[pc];B[pp];W[qp];B[po];W[or];
+B[mp];W[kq];B[kp];W[cg];B[bf];W[mc];B[jq];W[br];B[kr];W[gc];B[me];
+W[rn];B[qi];W[cf];B[ce];W[ci];B[qf];W[eg];B[ql];W[pf];B[qe];W[re];
+B[qg];W[mg];B[ke];W[gp];B[ie];W[ei];B[jh];W[dk];B[cj];W[dj];B[bi];
+W[bh];B[nh];W[cl];B[bl];W[bj];B[bk];W[ai];B[dl];W[el];B[dm];W[sh];
+B[pe];W[lh];B[ng];W[gr];B[of];W[kg];B[kj];W[lj];B[lk];W[mj];B[gn];
+W[mi];B[hf];W[ki];B[ji];W[pn];B[on];W[pm];B[kk];W[hc];B[pg];W[lc];
+B[hr];W[pl];B[qm];W[nk];B[qn];W[qo];B[pk];W[rm];B[ol];W[rl];B[qk];
+W[eb];B[er];W[fr];B[hp];W[ar];B[nl];W[es];B[co];W[db];B[cb];W[ca];
+B[ba];W[cc];B[bc];W[bb];B[cd];W[cb];B[bd];W[ed];B[ae];W[ac];B[dd];
+W[ho];B[go];W[in];B[gl];W[mr];B[mq];W[ee];B[ln];W[ge];B[rk];W[sk];
+B[sj];W[sl];B[ri];W[gj];B[il];W[hi];B[io];W[hg];B[ig];W[gg];B[fk];
+W[ek];B[oj];W[gk];B[fl];W[lf];B[le];W[fo];B[em];W[fj];B[hn];W[nq];
+B[lr];W[ms];B[np];W[oq];B[nd];W[nc];B[rf];W[sf];B[ij];W[od];B[oe];
+W[si];B[rj];W[sg];B[hk];W[fn];B[fm];W[pq];B[eo];W[fp];B[op];W[do];
+B[gs];W[ak];B[al];W[aj];B[ep];W[eq];B[rh];W[gf];B[aq];W[cp];B[bo];
+W[id];B[jd];W[he];B[if];W[kd];B[je];W[ld];B[ls];W[cr];B[ii];W[hh];
+B[hj];W[ro];B[rg];W[se];B[md];W[dn];B[ih];W[fs];B[hs];W[gq];B[kb]
+)
diff --git a/regression/games/reading31.sgf b/regression/games/reading31.sgf
new file mode 100644 (file)
index 0000000..7d3d041
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[qe];W[dd];B[qq];W[dp];B[pc];W[dj];B[fq];W[dn];B[dr];W[cq]
+;B[iq];W[jd];B[fc];W[ec];B[fd];W[df];B[op];W[fe];B[ed];W[dc]
+;B[fg];W[gd];B[qj];W[ld];B[dg];W[cg];B[dh];W[go];B[ci];W[mq]
+;B[gm];W[dl];B[fo];W[cj];B[hb];W[jb];B[ee];W[ef];B[pm];W[bi]
+;B[bh];W[ch];B[di];W[bg];B[gb];W[cr];B[dq];W[or];B[fh];W[id]
+;B[ff];W[ge];B[oj];W[pf];B[mo];W[lp];B[kq];W[hn];B[jn];W[lr]
+;B[jp];W[im];B[kr];W[ik];B[hg];W[gl];B[hm];W[fn];B[hj];W[jg]
+;B[hl];W[hk];B[il];W[ii];B[gn];W[fm];B[jl];W[fp];B[eq];W[ki]
+;B[eo];W[gj];B[ep];W[do];B[ij];W[jk];B[if];W[kl];B[jm];W[nc]
+;B[hi];W[eb];B[lq];W[qr];B[rq];W[nq];B[mp];W[ls];B[lg];W[rr]
+;B[oo];W[ob];B[pb];W[jf];B[mb];W[mc];B[ih];W[lb];B[ji];W[gf]
+;B[qf];W[kh];B[pg];W[lj];B[of];W[bj];B[pe];W[pa];B[qa];W[oa]
+;B[rb];W[lf];B[mf];W[mg];B[mh];W[ng];B[nf];W[nh];B[le];W[kf]
+;B[me];W[ph];B[qh];W[sq];B[sp];W[pq];B[sr];W[pp];B[oh];W[ni]
+;B[hq];W[ro];B[rs];W[ql];B[so];W[qm];B[ol];W[rk];B[sn];W[qn]
+;B[rj];W[oi];B[pi];W[ml];B[sq];W[qs];B[nm];W[og];B[mi];W[nj]
+;B[ln];W[ok];B[pj];W[nk];B[pk];W[pl];B[cs];W[bs];B[ds];W[br]
+;B[ke];W[je];B[ej];W[gh];B[gg];W[gi];B[hh];W[fi];B[ei];W[eg]
+;B[po];W[qo];B[om];W[mm];B[mn];W[kd];B[lm];W[ll];B[de];W[cf]
+;B[ce];W[bc];B[be];W[fl];B[np];W[en];B[pn];W[qp];B[sm];W[sk]
+;B[km];W[sj];B[ri];W[si];B[sh];W[oq];B[ks];W[mr];B[ph];W[md]
+;B[nd];W[od];B[ne];W[oe];B[pf];W[oc];B[pd];W[nl];B[qk];W[rl]
+;B[tt];W[tt]
+)
diff --git a/regression/games/reading32.sgf b/regression/games/reading32.sgf
new file mode 100644 (file)
index 0000000..8450e1c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[fa][fb][gb][gc][hc][ic][fd][ge][ef][ff][gf][eg][gg][hg][eh][fh][hh][ih][ei]
+AB[ca][ea][ga][ha][ia][cb][eb][cc][dc][ec][fc][dd][gd][hd][id][de][ee][fe][he][df][hf][if][dg][dh][di]
+)
diff --git a/regression/games/reading33.sgf b/regression/games/reading33.sgf
new file mode 100644 (file)
index 0000000..9172a49
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-16]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ec][qd][cm][qm][cn][qn][co][qo][cp][qp][dq][eq][oq][pq][cr][qr]
+AB[oc][cd][dp][pp][bq][cq][qq][rq][dr][er][fr][nr][or][pr]
+)
diff --git a/regression/games/reading34.sgf b/regression/games/reading34.sgf
new file mode 100644 (file)
index 0000000..e514787
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-01-07]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];;
+AW[ca][da][cb][eb][dc][ec][hc][fd][gd][hd][ge][gf][gg][gh][gi]
+AB[ba][bb][bc][cc][fc][cd][dd][ed][ee][fe][ff][fg][fh][fi]
+)
diff --git a/regression/games/reading35.sgf b/regression/games/reading35.sgf
new file mode 100644 (file)
index 0000000..41aac08
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]
+SZ[9]KM[0];
+C[Move order for attack3: B6 (23) A5 (7) A4 (7) 
+attack3 B5: 0]
+AW[ec][bd][ed][be][bf][cf]AB[bc][cd][ce][df][bg][cg][dg]
+)
diff --git a/regression/games/reading36.sgf b/regression/games/reading36.sgf
new file mode 100644 (file)
index 0000000..7661e7d
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[3]
+VW[]AP[Many Faces of Go:11.0]SZ[13]HA[0]ST[1]
+PB[GnuGo 3.0.0]
+PW[Go Intellect 10.0]
+DT[2001-09-23]
+PC[OS]KM[5.5]RU[Japanese]
+RE[W+2.5]
+US[Mertin]
+EV[CGoT]
+GN[GNU Go 3.0.0 Random Seed 999818995 level 10]
+;B[kd];W[cd];B[jj];W[cj];B[ec];W[ek];B[de];W[ce];B[df];W[cg];B[ic];
+W[db];B[dc];W[cc];B[eb];W[hk];B[cb];W[ii];B[kh];W[ji];B[ki];W[kj];
+B[kk];W[lj]
+)
diff --git a/regression/games/reading37.sgf b/regression/games/reading37.sgf
new file mode 100644 (file)
index 0000000..424517b
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-01-20]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ba][ab][bb][bc][fc][gc][cd][dd][ed][gd][hd][id][be][ee][fe][ge][af][bf][cf][gf][hf][if][ag][cg][dg][eg][eh][fh][ei]
+AB[ca][ha][cb][eb][fb][gb][hb][cc][dc][ec][hc][ic][ad][bd][ce][de][df][ef][ff][bg][fg][gg][hg][ig][ah][ch][dh][gh][ih][bi][di][fi][hi]
+)
diff --git a/regression/games/reading38.sgf b/regression/games/reading38.sgf
new file mode 100644 (file)
index 0000000..98b88a9
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[ba][ja][ka][cb][kb][lb][mb][nb][rb][bc][cc][fc][ic][lc][oc][pc][qc][dd][ed][nd][rd][sd][de][ee][fe][je][le][me][ne][oe][qe][re][se][df][ef][if][jf][kf][lf][of][pf][dg][gg][hg][kg][eh][hh][ih][mh][nh][oh][qh][rh][fi][gi][hi][li][mi][pi][qi][ri][dj][gj][kj][mj][oj][qj][fk][hk][jk][kk][mk][ok][sk][hl][jl][ml][ol][pl][sl][im][jm][km][qm][gn][jn][qn][do][eo][fo][go][ho][jo][lo][qo][ro][dp][gp][ip][jp][kp][lp][mp][qp][rp][sp][aq][bq][cq][dq][eq][kq][lq][br][kr][mr][fs][js][ks][ls][ms][ns]AB[ca][da][ia][db][fb][ib][jb][dc][ec][kc][mc][nc][rc][fd][gd][hd][id][jd][kd][ld][md][ge][he][ie][ke][ff][gf][hf][mf][nf][qf][rf][sf][eg][fg][ig][jg][lg][mg][ng][og][pg][qg][sg][fh][gh][jh][kh][lh][ph][sh][ii][ji][ki][ni][si][hj][ij][jj][lj][rj][sj][ik][lk][pk][qk][il][kl][ll][nl][ql][rl][lm][mm][om][pm][rm][kn][ln][mn][nn][rn][sn][ko][mo][no][po][so][ep][fp][hp][np][op][fq][gq][hq][iq][jq][mq][nq][pq][qq][rq][ar][cr][dr][er][fr][gr][ir][jr][nr][or][as][bs][cs][ds][is][os]PL[B])
diff --git a/regression/games/reading39.sgf b/regression/games/reading39.sgf
new file mode 100644 (file)
index 0000000..53e26ec
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.9 load and print]
+DT[2002-10-17]
+KM[5.5]AP[GNU Go:3.3.9]RU[Japanese]
+;AW[fa][na][pa][ra][eb][fb][gb][ob][qb][dc][ec][gc][ic][jc][lc]
+[mc][nc][qc][rc][sc][dd][ed][fd][hd][id][jd][kd][sd][ee][je][me]
+[ne][af][if][jf][mf][qf][ag][bg][cg][dg][jg][lg][mg][ng][eh][fh]
+[kh][nh][oh][ph][qh][bi][fi][gi][ji][ki][oi][bj][fj][kj][oj][pj]
+[ak][bk][dk][fk][kk][nk][al][cl][dl][fl][gl][hl][ml][nl][ol][pl]
+[cm][dm][em][gm][hm][km][lm][qm][rm][sm][dn][gn][kn][qn][sn][co]
+[do][io][ko][lo][mo][no][oo][po][bp][dp][ip][jp][kp][op][dq][eq]
+[fq][iq][kq][nq][er][gr][hr][ir][jr][fs][js][ks]
+AB[ca][ea][cb][db][kb][pb][cc][hc][kc][oc][pc][cd][gd][ld][md]
+[nd][pd][qd][rd][ae][be][de][fe][ge][he][ie][ke][le][oe][se][bf]
+[cf][df][ef][hf][lf][nf][of][eg][fg][gg][ig][og][pg][qg][rg][gh]
+[ih][jh][rh][hi][ii][mi][pi][qi][cj][gj][jj][nj][qj][ck][gk][hk]
+[jk][lk][mk][ok][pk][qk][rk][sk][bl][el][il][jl][kl][ll][am][bm]
+[fm][jm][bn][cn][en][fn][hn][in][jn][ln][rn][bo][eo][go][ho][jo]
+[qo][ro][so][cp][ep][fp][gp][lp][mp][np][pp][rp][bq][cq][gq][hq]
+[lq][oq][pq][cr][dr][kr][lr][or][ds][es][ls]
+PL[B])
diff --git a/regression/games/reading40.sgf b/regression/games/reading40.sgf
new file mode 100644 (file)
index 0000000..9a21fee
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-01-20]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];;
+AW[ba][da][ea][fa][bb][eb][fb][ib][ac][bc][cc][hc][ic][bd][dd][hd][be][ce][ee][fe][ge][he][ie][df][ef][eg][bh][ch][dh]
+AB[ca][ha][ia][cb][db][gb][hb][dc][ec][gc][ed][fd][gd][bf][bg][cg][dg][fg][gg][hg][ig][eh][fh][hh][di][gi][hi]
+)
diff --git a/regression/games/reading41.sgf b/regression/games/reading41.sgf
new file mode 100644 (file)
index 0000000..d31809b
--- /dev/null
@@ -0,0 +1,59 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[qwert]WR[NR]
+PB[ppmm (GNU Go 3.3.19)]BR[9k*]
+PC[THQY]DT[2003-06-08]AP[gnugoclient:2.0]
+RE[W+170.5]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[];B[gj];W[];B[om];W[];B[go];W[];B[jg];W[];B[jm];W[];B[mj];W[]
+;B[jq];W[];B[dc];W[];B[cg];W[];B[pq];W[];B[cj];W[];B[qj];W[];B[cp]
+;W[];B[pc];W[];B[dg];W[];B[gg];W[];B[jc];W[fe];B[gd];W[ln];B[kn]
+;W[bl];B[bn];W[db];B[eb];W[cb];B[ge];W[ce];B[bd];W[ec];B[fb];W[bc]
+;B[be];W[cd];B[de];W[cc];B[cf];W[ef];B[ed];W[fh];B[ei];W[eh];B[dh]
+;W[hi];B[ih];W[hh];B[hg];W[fi];B[hj];W[ej];B[ii];W[di];B[ci];W[ek]
+;B[eg];W[fg];B[fo];W[dm];B[el];W[dl];B[mk];W[bh];B[bi];W[df];B[dk]
+;W[gk];B[fl];W[fk];B[ol];W[gm];B[ik];W[en];B[bm];W[cl];B[hn];W[ad]
+;B[af];W[bg];B[bf];W[aj];B[gf];W[ff];B[fd];W[ai];B[ei];W[fj];B[da]
+;W[ca];B[ea];W[di];B[ah];W[al];B[ch];W[bj];B[ba];W[bb];B[ae];W[ck]
+;B[ag];W[qn];B[ab];W[aa];B[ac];W[ad];B[ac];W[on];B[ro];W[rn];B[nn]
+;W[oo];B[no];W[op];B[ab];W[ad];B[ac];W[nr];B[ab];W[ad];B[ac];W[np]
+;B[mo];W[rq];B[ab];W[ad];B[ac];W[dr];B[cr];W[fr];B[mp];W[br];B[cs]
+;W[ir];B[jr];W[hq];B[es];W[er];B[ds];W[ep];B[eo];W[do];B[eq];W[cq]
+;B[bq];W[dq];B[fq];W[bp];B[gr];W[co];B[ab];W[ad];B[ac];W[qf];B[of]
+;W[qh];B[re];W[og];B[ri];W[nf];B[ng];W[oe];B[gq];W[nh];B[mg];W[pf]
+;B[rg];W[nc];B[ab];W[ad];B[ac];W[rc];B[qe];W[lc];B[bs];W[aq];B[fs]
+;W[mq];B[ab];W[ad];B[ac];W[ll];B[rl];W[km];B[ab];W[ad];B[ac];W[jl]
+;B[il];W[hm];B[ab];W[ad];B[ac];W[kp];B[lo];W[jn];B[im];W[ko];B[lq]
+;W[kq];B[mr];W[nq];B[lp];W[kr];B[lr];W[ks];B[hp];W[ms];B[rp];W[qr]
+;B[pr];W[rs];B[mm];W[ls];B[kk];W[qo];B[ab];W[ad];B[ac];W[mh];B[ab]
+;W[ad];B[ac];W[lg];B[js];W[io];B[ab];W[ad];B[ac];W[in];B[qp];W[sr]
+;B[fp];W[ql];B[mn];W[ml];B[kl];W[rk];B[ab];W[ad];B[ac];W[rf];B[nl]
+;W[lm];B[nm];W[rh];B[ab];W[ad];B[ac];W[rj];B[gn];W[fm];B[ab];W[ad]
+;B[ac];W[nj];B[oj];W[pb];B[ab];W[ad];B[ac];W[ob];B[ab];W[ad];B[ac]
+;W[ni];B[nk];W[ke];B[ab];W[ad];B[ac];W[je];B[qi];W[si];B[ab];W[ad]
+;B[ac];W[if];B[ab];W[ad];B[ac];W[id];B[ab];W[ad];B[ac];W[ig];B[ab]
+;W[ad];B[ac];W[hc];B[hb];W[gc];B[gb];W[fc];B[kb];W[hd];B[ei];W[bh]
+;B[ab];W[ad];B[ac];W[di];B[ie];W[he];B[ei];W[gh];B[mb];W[lb];B[la]
+;W[mc];B[ph];W[pg];B[ki];W[qk];B[lk];W[kn];B[pm];W[pk];B[ok];W[kh]
+;B[jh];W[li];B[qm];W[rm];B[dp];W[nb];B[ma];W[kd];B[ic];W[lj];B[kj]
+;W[oh];B[mi];W[lh];B[pn];W[po];B[na];W[ga];B[ha];W[kc];B[jb];W[ip]
+;B[iq];W[ho];B[hr];W[gs];B[hs];W[oa];B[ka];W[hk];B[hl];W[gl];B[pi]
+;W[jf];B[kg];W[kf];B[fn];W[gi];B[ij];W[ns];B[jo];W[ar];B[oi];W[cp]
+;B[ep];W[as];B[gs];W[];B[pl];W[];B[]
+C[R4 removed
+K8 removed
+J2 removed
+B6 removed
+E8 removed
+C11 removed
+E11 removed
+A17 removed
+D16 removed
+final_score: W+170.5
+G19 removed
+Q17 removed
+R15 removed
+N13 removed
+S13 removed
+S8 removed]
+)
diff --git a/regression/games/reading42.sgf b/regression/games/reading42.sgf
new file mode 100644 (file)
index 0000000..a03002f
--- /dev/null
@@ -0,0 +1,123 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[thor-ALife(B) NNGS]
+EV[None]
+RE[W+Resign]
+PW[thor]WR[2d*]
+PB[ALife]BR[1d*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2003-10-07]
+SZ[19]TM[600]KM[0.5]
+
+;B[dp];W[cd]C[
+ ALife 1d*: enjoy
+]
+;B[pp];W[pc]C[
+ thor 2d*: And you :) (4)
+]
+;B[pe];W[ph]C[
+ guestxyz started observation.
+]
+;B[md]C[
+ pajarito started observation.
+]
+;W[ne]C[
+ pajarito started observation.
+]
+;B[od];W[nd];B[oc];W[nc];B[nb];W[mc]C[
+ pogonyshev started observation.
+]
+;B[pb];W[pf];B[qf];W[oe];B[pd];W[qg];B[of];W[pg];B[ed];W[rd];B[re];W[rf]
+;B[qe];W[se];B[rg];W[sf];B[sg];W[sd];B[rc];W[rh];B[qd];W[sh];B[lb];W[mb]
+;B[ma];W[lc];B[kb];W[kc];B[jc];W[ec];B[jd];W[fc];B[fd];W[ib];B[jb];W[gd]
+;B[ge];W[he];B[gc];W[hd];B[gb];W[dd];B[gf];W[hf];B[gg];W[hg];B[dc];W[fe]
+;B[ee];W[ef];B[de];W[df];B[qm];W[ic]C[
+ pogonyshev 2k*: that's a long ladder :o (68)
+]
+;B[cj];W[gh];B[jp];W[cn];B[dn];W[dm];B[en];W[co];B[cp];W[cl];B[fq];W[ej]
+;B[ei];W[fi]C[
+ pem started observation.
+ gunnar started observation.
+]
+;B[bm];W[bl];B[bk];W[dk];B[dj];W[fj];B[bg];W[bf];B[cg];W[cf];B[bi];W[pq]
+;B[eh];W[oq];B[qq];W[qr];B[qp];W[lq];B[rr];W[jr];B[ir];W[iq];B[jq];W[hr]
+;B[kr];W[is];B[kq];W[lr];B[ks];W[ho];B[lp];W[mp];B[mo];W[np]C[
+ ccwills started observation.
+]
+;B[nr];W[lo];B[kp];W[ln];B[no]C[
+ pajarito started observation.
+]
+;W[jo]C[
+ kg started observation.
+ rice started observation.
+]
+;B[op];W[nq]C[
+ pajarito started observation.
+]
+;B[or];W[pr];B[mr];W[rs];B[mq];W[rq];B[sr];W[sq];B[ps];W[ss];B[os];W[oo]
+;B[on];W[nn];B[po];W[mn];B[oo];W[fr];B[er];W[es];B[dr];W[ep];B[fp];W[eo]
+;B[do];W[fo];B[go];W[fn];B[em];W[ck];B[aj];W[bn];B[gn];W[fm];B[gm];W[fl]
+;B[gr];W[gs];B[gq]C[
+ norate started observation.
+]
+;W[hp];B[ds];W[gp];B[io];W[eq];B[fs];W[hq];B[hs];W[qb];B[qc];W[gs];B[ff]C[
+ apjr started observation.
+]
+;W[fr];B[eb];W[fg];B[fb];W[fe];B[br]C[
+ extr started observation.
+]
+;W[ko];B[in];W[ip];B[nl];W[mk];B[ml];W[ll];B[lm];W[km];B[nk];W[mm];B[mj]
+;W[lk];B[ni];W[oj];B[nj];W[om];B[nm];W[pl];B[pk];W[ql];B[qk];W[rl];B[rk]
+;W[qn];B[rn]C[
+ ccwills started observation.
+ pogonyshev 2k*: maybe S5 ? (207)
+]
+;W[ro]C[
+ ccwills 9k*: there you go mind reader :) (208)
+ pogonyshev 2k*: :) (208)
+ ccwills 9k*: but what of the followup.. (208)
+ guestxyz NR : b s7 , everything is fine (208)
+ apjr 1d*: yes (208)
+ ALife 1d*: thx
+]
+;B[pm]C[
+ thor 2d*: do mine first then (209)
+]
+;W[ol]C[
+ ALife 1d*: oh, sorry
+ ALife 1d*: wrong click
+ apjr 1d*: . game over (210)
+ ALife 1d*: undo
+]
+;B[rm];W[ok]C[
+ ALife 1d*: add time please
+ ALife 1d*: I will resign later
+ ALife 1d*: thanks
+ thor 2d*: need to go soon... (212)
+]
+;B[pi];W[sm];B[rr];W[sn];B[pn];W[oi];B[nf];W[mf];B[ng];W[nh];B[mg];W[lf]
+;B[jf];W[kg];B[jg];W[kh];B[jh];W[ki]C[
+ Zahlman started observation.
+]
+;B[ji];W[jj];B[ij];W[jk];B[hi];W[hk];B[ik];W[il];B[jl]C[
+ jamees started observation.
+]
+;W[hj];B[mh];W[oh];B[kj];W[kk];B[ii];W[ke];B[je];W[kf];B[hl]C[
+ indra started observation.
+]
+;W[bb];B[cb];W[bc];B[ce];W[be];B[rp];W[sp];B[qs];W[al]C[
+ jamees started observation.
+]
+;B[sr];W[so];B[cc];W[bd];B[kd];W[ld];B[sc];W[hn];B[im];W[gl];B[hm];W[el]
+;B[ba];W[ar]C[
+ ascii started observation.
+]
+;B[aq];W[bq];B[as]C[
+ pogonyshev 2k*: two undos in one game?  hmm (275)
+ thor 2d*: I need to go pls resign (275)
+ ALife 1d*: ok, thanks
+]
+;)
diff --git a/regression/games/reading43.sgf b/regression/games/reading43.sgf
new file mode 100644 (file)
index 0000000..ac9bb4c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2002-01-20]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ad][bd][cd][dd][be][ge][he][ie][bf][gf][bg][cg][gg][ch][dh][eh][fh][gh]
+AB[db][eb][fb][ac][bc][cc][dc][fc][ed][fd][gd][hd][id][df][ff][dg][fg]
+)
diff --git a/regression/games/reading44.sgf b/regression/games/reading44.sgf
new file mode 100644 (file)
index 0000000..99dd197
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-12-27]
+SY[Cgoban 1.9.14]TM[-];AW[he][ie][hf][dg][hg][dh][fh][hh][hi]
+AB[cf][df][ef][ff][gf][cg][ch][ci][di][ei][fi][gi]
+)
diff --git a/regression/games/reading45.sgf b/regression/games/reading45.sgf
new file mode 100644 (file)
index 0000000..edcb957
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2004-06-16]
+SY[Cgoban 1.9.14]TM[5:00:00(5x1:00)];
+AW[cg][dg][eg][ch][fh][gh][ci][ei][fi]
+AB[fg][gg][hg][dh][eh][hh][gi][hi]
+)
diff --git a/regression/games/reading46.sgf b/regression/games/reading46.sgf
new file mode 100644 (file)
index 0000000..28359ce
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2004-06-16]
+SY[Cgoban 1.9.14]TM[5:00:00(5x1:00)]
+AW[aa][ca][bb][cb][fb][ac][bc][ec][fc][gc][ic][ed][gd][hd][id][de][ee][df][cg][dg][ah][bh][ch]
+AB[fa][ha][ia][db][eb][gb][hb][cc][dc][ad][bd][dd][ae][ce][bf][cf][ag][bg]
+)
diff --git a/regression/games/reading47.sgf b/regression/games/reading47.sgf
new file mode 100644 (file)
index 0000000..d7804e1
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2004-06-16]
+SY[Cgoban 1.9.14]TM[5:00:00(5x1:00)]
+AW[ca][ea][ga][cb][db][eb][fb][gb][dc][hc][dd][hd][be][ce][he][ie][af][cf][if][bg][ig][gh][hh][gi]
+AB[hb][ec][fc][gc][ic][cd][ed][gd][de][fe][ge][df][ff][hf][cg][dg][eg][fg][gg][hg][bh][ch][fh][bi][fi]
+)
diff --git a/regression/games/reading48.sgf b/regression/games/reading48.sgf
new file mode 100644 (file)
index 0000000..35d33de
--- /dev/null
@@ -0,0 +1,3 @@
+(;GM[1]FF[4]SZ[9]
+AW[ag][bg][cg][eh][bi][ei][ch][dh]
+AB[af][bf][cf][df][eg][fg][ah][fh][ci][fi][dg][bh])
diff --git a/regression/games/rosebud.sgf b/regression/games/rosebud.sgf
new file mode 100644 (file)
index 0000000..37cad9d
--- /dev/null
@@ -0,0 +1,53 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[rosebud-GnuGo(B) NNGS]
+EV[None]
+RE[W+64.5]
+PW[rosebud]WR[15k ]
+PB[GnuGo]BR[18k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-09-29]
+SZ[19]TM[600]KM[0.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[fc];B[ec];W[fd];B[df];W[hd];B[mj];W[cc];B[db];W[dc];B[gp];W[ed]
+;B[dm];W[nq];B[oq];W[np];B[pn];W[lp];B[pg];W[qq];B[qp];W[or];B[pr];W[pq]
+;B[qr];W[op];B[rq];W[oq];B[md];W[cq];B[cp];W[dq];B[eq];W[er];B[fq];W[fr]
+;B[ig];W[bp];B[bo];W[bq];B[nm];W[rp];B[sq];W[ro]C[
+ gunnar started observation.
+]
+;B[rs];W[ps];B[qo];W[qn];B[sr];W[po];B[cb];W[eb];B[bc];W[cd];B[bd];W[da]
+;B[ce];W[de];B[dg];W[bb];B[ab];W[ca];B[bf];W[bn];B[co];W[ao];B[bl];W[cn]
+;B[dn];W[gq];B[eo];W[hp];B[go];W[hq];B[pm];W[ho];B[jn];W[gn];B[fn];W[fp]
+;B[ep];W[fo];B[lm];W[fm];B[en];W[hm];B[im];W[os];B[qs];W[qc];B[pc];W[qd]
+;B[qe];W[re];B[qf];W[rf];B[ic];W[pb];B[ob];W[qb];B[hc];W[aa];B[ac];W[cm]
+;B[cl];W[dl];B[el];W[dk];B[ck];W[ek];B[fk];W[ej];B[ei];W[gg];B[ii];W[hi]
+;B[fj];W[nb];B[oc];W[oa];B[lb];W[qg];B[rg];W[qh];B[ph];W[rh];B[ie];W[nc]
+;B[oe];W[nd];B[ne];W[pi];B[oi];W[qi];B[hj];W[me];B[gh];W[pf];B[of];W[pe]
+;B[le];W[od]C[
+ ingwa started observation.
+]
+;B[og];W[fg];B[kq];W[qj];B[pk];W[mc];B[mf];W[lc];B[kb];W[gc];B[ir];W[fh]
+;B[gb];W[hh];B[mr];W[hl];B[mo];W[lq];B[lr];W[il];B[gi];W[hg];B[he];W[ih]
+;B[jh];W[if];B[jg];W[hf];B[ba];W[fi]C[
+ glop started observation.
+]
+;B[cb];W[gj];B[gk];W[jf];B[kf];W[je];B[gi];W[ge];B[id];W[kd];B[hr];W[gr]
+;B[ld];W[kc];B[jc];W[ib];B[hb];W[jb];B[jl];W[mb];B[ka];W[fb];B[gd];W[ga]
+;B[rl];W[ha];B[so];W[sn];B[qp];W[rm];B[ql];W[qm];B[sp];W[sl];B[sk];W[sm]
+;B[rj];W[on];B[ri];W[om]C[
+ bump started observation.
+]
+;B[pl];W[ol];B[ik];W[ok];B[oj];W[in];B[nk];W[jm];B[km];W[jo];B[kn];W[ko]
+;B[im];W[nl];B[nn];W[ml];B[mk];W[ll];B[jm];W[kk];B[jk];W[jr];B[iq];W[ip]
+;B[jq];W[kr];B[lo];W[kp];B[mm];W[hs];B[eh];W[ef];B[kj]C[
+ jahy started observation.
+]
+;W[lk];B[lj];W[db];B[bb];W[gh];B[ej];W[gj];B[bm];W[an];B[gi];W[qk];B[rk]
+;W[gj];B[sh];W[sg];B[si];W[hk];B[gi];W[cg];B[ch];W[gj];B[ij];W[gi];B[no]
+;W[oo];B[am];W[ap];B[gl];W[gm];B[mp];W[mq];B[ke];W[eg];B[kl];W[em];B[fl]
+;W[tt];B[tt]
+;)
diff --git a/regression/games/rosebud4.sgf b/regression/games/rosebud4.sgf
new file mode 100644 (file)
index 0000000..cd61dc5
--- /dev/null
@@ -0,0 +1,47 @@
+(;GM[1]FF[3]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.1.16)]
+WR[15k*]
+PB[rosebud]
+BR[15k]PC[NNGS]
+DT[2001-12-13]
+AP[gnugoclient:2.0]
+RE[B+31.5]
+;B[qd];W[dp];B[dc];W[pp];B[ce];W[od];B[oc];W[nc];B[pc];W[nd];B[qf];
+W[jc];B[fq];W[hq];B[cq];W[cp];B[dq];W[ep];B[fr];W[go];B[gp];W[hp];
+B[fo];W[fp];B[gq];W[fn];B[hr];W[cl];B[ir];W[ho];B[kq];W[gc];B[ch];
+W[pj];B[nq];W[qn];B[bq];W[or];B[nr];W[oq];B[bo];W[qh];B[cm];W[bm];
+B[cn];W[bk];B[eo];W[en];B[do];W[co];B[dn];W[bn];B[dm];W[dl];B[bp];
+W[em];B[ko];W[nm];B[qq];W[qp];B[pr];W[os];B[pq];W[np];B[rp];W[ro];
+B[rq];W[ps];B[qs];W[rr];B[sr];W[rs];B[qr];W[sp];B[ns];W[sq];B[mp];
+W[rg];B[no];W[sd];B[rc];W[nn];B[fd];W[km];B[gf];W[kf];B[hi];W[lm];
+B[jn];W[gl];B[ej];W[ie];B[jm];W[eb];B[ec];W[jh];B[of];W[nf];B[og];
+W[db];B[cb];W[hh];B[gh];W[fc];B[gd];W[gi];B[hc];W[hb];B[fi];W[gg];
+B[fh];W[ii];B[gj];W[fg];B[hg];W[hf];B[ih];W[ge];B[ff];W[fe];B[ef];
+W[ee];B[ed];W[jj];B[de];W[il];B[he];W[lh];B[id];W[ic];B[if];W[je];
+B[hd];W[oi];B[jd];W[kd];B[kc];W[ah];B[bh];W[ag];B[kb];W[lc];B[ib];
+W[mc];B[pe];W[cj];B[ng];W[mi];B[jf];W[jl];B[ke];W[lb];B[mf];W[lf];
+B[le];W[ae];B[be];W[bd];B[cd];W[bc];B[cc];W[jg];B[oo];W[pm];B[sc];
+W[mg];B[me];W[op];B[mo];W[ij];B[bb];W[af];B[bi];W[ai];B[bj];W[aj];
+B[nh];W[re];B[ni];W[nj];B[mj];W[mh];B[bg];W[ne];B[ob];W[pg];B[bf];
+W[pf];B[oe];W[qe];B[pd];W[qg];B[ac];W[di];B[ad];W[ak];B[rd];W[se];
+B[dh];W[ig];B[hh];W[oh];B[dj];W[ci];B[ei];W[ck];B[hk];W[gk];B[hj];
+W[ik];B[hl];W[hm];B[fk];W[fl];B[im];W[ek];B[hn];W[gm];B[iq];W[ip];
+B[jp];W[io];B[in];W[eq];B[er];W[ao];B[ap];W[an];B[gn];W[kn];B[jo];
+W[fo];B[mn];W[mm];B[ki];W[kh];B[dk];W[el];B[ln];W[po];B[on];W[om];
+B[pn];W[fj];B[kg];W[lg];B[fk];W[qb];B[qc];W[fj];B[ji];W[mk];B[fk];
+W[rb];B[nb];W[fj];B[lj];W[kj];B[fk];W[oj];B[fj];W[fb];B[ha];W[ga];
+B[gb];W[tt];B[hb];W[tt]
+C[G13 removed
+F17 removed
+G19 removed
+K17 removed
+L16 removed
+M17 removed
+R18 removed
+M10 removed
+L11 removed
+T2 removed
+R14 removed
+final_score: B+30.5]
+)
diff --git a/regression/games/scoring/score1.sgf b/regression/games/scoring/score1.sgf
new file mode 100644 (file)
index 0000000..91a2ff9
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[dc];B[dp];W[pq];B[qo];W[pl];B[oo];W[np];B[ce];W[no]
+;B[ic];W[cg];B[ee];W[fd];B[bc];W[rp];B[cb];W[cn];B[fq];W[bp]
+;B[cq];W[ck];B[qh];W[hq];B[ld];W[gc];B[eb];W[kq];B[ko];W[lp]
+;B[kk];W[bq];B[fo];W[qc];B[pc];W[qd];B[pe];W[rf];B[gf];W[hb]
+;B[ec];W[fb];B[ek];W[ib];B[ga];W[di];B[jc];W[gr];B[fa];W[qj]
+;B[gb];W[rh];B[hc];W[qg];B[pb];W[nl];B[ph];W[pg];B[oh];W[mn]
+;B[fr];W[kn];B[jn];W[jo];B[ln];W[km];B[lo];W[io];B[lm];W[jl]
+;B[in];W[ll];B[jp];W[ho];B[kp];W[jq];B[lq];W[mp];B[ir];W[iq]
+;B[kl];W[jm];B[im];W[lk];B[og];W[jk];B[gm];W[kj];B[kh];W[nj]
+;B[gn];W[qb];B[hj];W[fs];B[es];W[gs];B[dr];W[bf];B[be];W[pa]
+;B[oa];W[qa];B[nb];W[hn];B[hm];W[of];B[pf];W[br];B[nf];W[ii]
+;B[bh];W[bg];B[bi];W[eg];B[cj];W[dj];B[en];W[dl];B[bk];W[dk]
+;B[fh];W[el];B[gg];W[fk];B[hk];W[hi];B[gi];W[jh];B[gj];W[fj]
+;B[ro];W[fe];B[ff];W[hh];B[ed];W[gh];B[qm];W[fi];B[fg];W[so]
+;B[sn];W[on];B[sp];W[qp];B[rk];W[pn];B[po];W[rj];B[qn];W[rl]
+;B[qk];W[sk];B[ql];W[sl];B[oj];W[ok];B[jf];W[pk];B[pj];W[kg]
+;B[lh];W[lg];B[mh];W[jg];B[if];W[il];B[gk];W[eh];B[bl];W[aj]
+;B[bn];W[cm];B[ao];W[co];B[bm];W[ah];B[ai];W[hl];B[gl];W[eq]
+;B[er];W[fm];B[ag];W[af];B[ni];W[pi];B[oi];W[mj];B[qi];W[ri]
+;B[sq];W[rq];B[rr];W[qr];B[pp];W[qq];B[do];W[ep];B[kf];W[oq]
+;B[lf];W[ci];B[ak];W[bj];B[cj];W[bj];B[mg];W[ae];B[ig];W[ih]
+;B[ad];W[df];B[de];W[qf];B[ki];W[ji];B[hg];W[qe];B[mi];W[ef]
+;B[li];W[lj];B[cf];W[tt];B[eo];W[tt];B[fp];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score10.sgf b/regression/games/scoring/score10.sgf
new file mode 100644 (file)
index 0000000..d4df440
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[qc];W[pp];B[dq];W[ce];B[do];W[dc];B[qn];W[nq];B[rp];W[qq]
+;B[qk];W[jc];B[lq];W[rq];B[pe];W[iq];B[lo];W[fq];B[qp];W[cj]
+;B[ee];W[cm];B[bn];W[ej];B[fc];W[mc];B[he];W[qg];B[cf];W[dg]
+;B[cd];W[cc];B[be];W[eb];B[de];W[cn];B[co];W[bm];B[bo];W[re]
+;B[rd];W[rg];B[po];W[qi];B[pq];W[pr];B[op];W[oq];B[ob];W[rj]
+;B[ii];W[er];B[rk];W[cr];B[dr];W[ds];B[cq];W[lr];B[br];W[kq]
+;B[cs];W[em];B[es];W[fs];B[mq];W[mr];B[np];W[cg];B[fb];W[bc]
+;B[gm];W[fg];B[fn];W[oi];B[eo];W[og];B[ne];W[ok];B[pj];W[oj]
+;B[mm];W[le];B[mf];W[nb];B[jm];W[oc];B[pb];W[sk];B[sl];W[gj]
+;B[sj];W[si];B[hk];W[hb];B[kk];W[lj];B[lh];W[mj];B[kj];W[jo]
+;B[am];W[al];B[an];W[bk];B[gk];W[go];B[fk];W[fj];B[ig];W[lp]
+;B[mp];W[kp];B[gh];W[gg];B[hj];W[hh];B[gi];W[fe];B[ed];W[gd]
+;B[hg];W[hd];B[je];W[ke];B[kf];W[qe];B[qd];W[pf];B[lf];W[pd]
+;B[oe];W[od];B[se];W[rb];B[qb];W[sf];B[sd];W[me];B[nf];W[mh]
+;B[bg];W[bh];B[bd];W[ag];B[af];W[bf];B[ae];W[qj];B[pk];W[nd]
+;B[om];W[oa];B[lk];W[pa];B[ra];W[sb];B[in];W[li];B[ki];W[lg]
+;B[kh];W[mg];B[sq];W[sr];B[sp];W[rr];B[mk];W[gf];B[ek];W[dk]
+;B[kn];W[id];B[ie];W[el];B[kg];W[dn];B[io];W[ip];B[jd];W[kd]
+;B[ho];W[hp];B[gn];W[fp];B[fl];W[ol];B[pl];W[nk];B[hf];W[nm]
+;B[on];W[nn];B[mn];W[no];B[pp];W[mo];B[ng];W[nh];B[ep];W[ko]
+;B[ln];W[ml];B[ll];W[nl];B[pi];W[ph];B[ge];W[fd];B[ec];W[ea]
+;B[gb];W[cb];B[fo];W[gp];B[sk];W[eq];B[ds];W[en];B[of];W[fh]
+;B[fi];W[ei];B[hi];W[tt];B[jn];W[tt];B[fm];W[tt];B[oo];W[tt]
+;B[rc];W[tt];B[qa];W[tt];B[na];W[oa];B[ma];W[tt];B[lb];W[mb]
+;B[la];W[kc];B[lc];W[tt];B[ld];W[md];B[kb];W[jb];B[pa];W[tt]
+;B[bg];W[ah];B[bf];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score11.sgf b/regression/games/scoring/score11.sgf
new file mode 100644 (file)
index 0000000..c6ddabf
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[dp];B[pp];W[dd];B[fc];W[cf];B[db];W[cc];B[ic];W[nc]
+;B[ch];W[cb];B[pf];W[pb];B[cn];W[fp];B[qc];W[kc];B[cp];W[cq]
+;B[bq];W[co];B[bp];W[do];B[bo];W[cr];B[dn];W[qn];B[pn];W[pm]
+;B[qo];W[on];B[po];W[qm];B[qj];W[om];B[dc];W[ck];B[bj];W[nq]
+;B[eh];W[kq];B[pr];W[ek];B[br];W[ej];B[hq];W[gr];B[ho];W[ib]
+;B[jb];W[jc];B[hb];W[id];B[hc];W[kb];B[ia];W[qb];B[jd];W[ie]
+;B[je];W[if];B[le];W[jf];B[kf];W[kg];B[bf];W[bg];B[cg];W[be]
+;B[df];W[af];B[ed];W[oj];B[ke];W[lg];B[ne];W[hm];B[rc];W[bk]
+;B[jo];W[bi];B[lo];W[ir];B[kl];W[ok];B[bh];W[ci];B[ah];W[ai]
+;B[hr];W[nr];B[hs];W[iq];B[gn];W[gq];B[hp];W[fn];B[gm];W[bm]
+;B[bn];W[fm];B[an];W[bs];B[gl];W[il];B[gj];W[fi];B[rb];W[mb]
+;B[pc];W[ob];B[de];W[cd];B[jm];W[ij];B[hi];W[ih];B[ii];W[fh]
+;B[ji];W[gs];B[kj];W[mq];B[ph];W[da];B[eb];W[np];B[ni];W[fe]
+;B[ee];W[ff];B[eo];W[dq];B[en];W[fo];B[hh];W[eg];B[dg];W[fl]
+;B[gk];W[rk];B[rj];W[sj];B[si];W[sk];B[rh];W[lf];B[mf];W[mg]
+;B[mj];W[ro];B[oh];W[rp];B[ng];W[pq];B[qq];W[hg];B[oq];W[rq]
+;B[qk];W[rl];B[ql];W[rm];B[rr];W[or];B[qs];W[sr];B[hd];W[di]
+;B[dh];W[li];B[lj];W[jh];B[ml];W[mn];B[pq];W[ln];B[kn];W[ra]
+;B[mo];W[no];B[lm];W[mh];B[is];W[js];B[jr];W[jq];B[ks];W[kr]
+;B[js];W[ls];B[ik];W[od];B[oe];W[pi];B[qi];W[he];B[gh];W[gg]
+;B[ki];W[ar];B[aq];W[cs];B[kh];W[gd];B[gc];W[fd];B[ea];W[ca]
+;B[sb];W[ka];B[ip];W[ga];B[ja];W[ha];B[ib];W[pl];B[mm];W[nn]
+;B[gi];W[nd];B[md];W[lc];B[oi];W[pj];B[nh];W[mi];B[jg];W[ig]
+;B[ld];W[nj];B[jp];W[lr];B[kp];W[nl];B[mk];W[nk];B[lp];W[mc]
+;B[go];W[gp];B[sa];W[qa];B[oc];W[lq];B[me];W[nm];B[kd];W[fj]
+;B[lh];W[jg];B[fk];W[pk];B[mp];W[tt];B[as];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score12.sgf b/regression/games/scoring/score12.sgf
new file mode 100644 (file)
index 0000000..ffe8204
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[od];W[dd];B[oq];W[co];B[qd];W[dq];B[qp];W[jq];B[fc];W[hc]
+;B[cc];W[dc];B[cd];W[de];B[db];W[eb];B[cb];W[ec];B[cf];W[fd]
+;B[jo];W[pj];B[iq];W[cj];B[jp];W[eo];B[dk];W[mc];B[ck];W[he]
+;B[bj];W[jc];B[nb];W[gq];B[pl];W[qg];B[hg];W[nc];B[oc];W[mb]
+;B[ob];W[qk];B[nk];W[di];B[ql];W[bi];B[bk];W[gn];B[gl];W[hm]
+;B[ik];W[re];B[kq];W[rd];B[jr];W[qc];B[pd];W[ne];B[pf];W[pb]
+;B[oi];W[pi];B[rb];W[qb];B[ce];W[og];B[jf];W[eh];B[gi];W[df]
+;B[cg];W[nh];B[oh];W[pg];B[ni];W[mf];B[mh];W[ng];B[ai];W[mi]
+;B[bh];W[lh];B[mj];W[li];B[ci];W[ho];B[dj];W[jn];B[ok];W[kn]
+;B[ji];W[bm];B[on];W[rl];B[rm];W[rk];B[kk];W[sm];B[rn];W[lp]
+;B[mq];W[mn];B[dm];W[oj];B[nj];W[gf];B[hr];W[gr];B[nm];W[lq]
+;B[lr];W[dh];B[ll];W[jl];B[jk];W[sn];B[so];W[sl];B[ro];W[bl]
+;B[no];W[mp];B[np];W[fm];B[fj];W[lj];B[lk];W[io];B[fh];W[fg]
+;B[gs];W[fs];B[hs];W[er];B[hl];W[gh];B[fi];W[hh];B[ih];W[gg]
+;B[ig];W[je];B[ke];W[kd];B[le];W[if];B[kf];W[me];B[hi];W[ld]
+;B[mm];W[mo];B[fl];W[lg];B[em];W[lf];B[jg];W[gm];B[en];W[hf]
+;B[ph];W[qh];B[ei];W[ko];B[cn];W[bn];B[kj];W[cm];B[dn];W[do]
+;B[fn];W[fo];B[ea];W[fb];B[dg];W[dl];B[el];W[eg];B[cl];W[fa]
+;B[da];W[al];B[hp];W[hq];B[ip];W[gp];B[il];W[im];B[ak];W[km]
+;B[lm];W[kl];B[ln];W[kg];B[ki];W[kh];B[jh];W[pk];B[kp];W[lo]
+;B[nn];W[ch];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score13.sgf b/regression/games/scoring/score13.sgf
new file mode 100644 (file)
index 0000000..b784ec4
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[qe];W[dp];B[ec];W[oq];B[cd];W[qp];B[pc];W[qj];B[cn];W[cl]
+;B[cq];W[cp];B[dq];W[ep];B[fq];W[dm];B[mq];W[jd];B[hc];W[jq]
+;B[kr];W[mc];B[eq];W[qg];B[mo];W[qm];B[cj];W[cg];B[bh];W[fm]
+;B[ej];W[eg];B[oj];W[ch];B[bg];W[gj];B[ij];W[re];B[ne];W[qd]
+;B[pd];W[qc];B[pe];W[qf];B[jb];W[fp];B[gp];W[go];B[hp];W[de]
+;B[ho];W[bf];B[ci];W[bk];B[fi];W[gh];B[bj];W[dd];B[dc];W[gf]
+;B[pb];W[jo];B[he];W[kq];B[jr];W[iq];B[gi];W[hi];B[hj];W[gk]
+;B[hh];W[ii];B[jj];W[ih];B[hg];W[gn];B[gg];W[fh];B[fg];W[eh]
+;B[hf];W[kh];B[le];W[ir];B[lq];W[hn];B[kc];W[lj];B[li];W[gq]
+;B[ki];W[ig];B[hq];W[gr];B[mj];W[lg];B[lk];W[ac];B[kf];W[ng]
+;B[je];W[og];B[ff];W[cc];B[bc];W[cb];B[bb];W[bd];B[ca];W[db]
+;B[da];W[eb];B[fc];W[ba];B[aa];W[ea];B[ge];W[qb];B[bn];W[bo]
+;B[qa];W[es];B[fs];W[fr];B[ds];W[er];B[dr];W[hr];B[bq];W[bm]
+;B[an];W[bp];B[aq];W[bs];B[br];W[cs];B[cr];W[as];B[gb];W[oo]
+;B[nr];W[or];B[lb];W[om];B[oa];W[mn];B[il];W[js];B[ln];W[lr]
+;B[mr];W[ks];B[mm];W[lp];B[mp];W[nn];B[lo];W[kp];B[nb];W[pj]
+;B[ar];W[bs];B[as];W[ok];B[oi];W[qh];B[jn];W[mf];B[me];W[nk]
+;B[os];W[ps];B[ns];W[qr];B[id];W[ml];B[lm];W[nm];B[lc];W[ll]
+;B[kl];W[mk];B[kk];W[nj];B[kj];W[ni];B[mi];W[ko];B[jm];W[ai]
+;B[aj];W[ef];B[rb];W[rd];B[ee];W[ed];B[fe];W[rc];B[pf];W[sb]
+;B[ra];W[ls];B[fd];W[kn];B[km];W[if];B[ce];W[df];B[fb];W[ba]
+;B[ca];W[be];B[ad];W[pg];B[ab];W[hk];B[hl];W[ik];B[fa];W[cf]
+;B[da];W[cd];B[of];W[lf];B[ag];W[gl];B[af];W[jg];B[ae];W[jf]
+;B[ak];W[ie];B[ke];W[kg];B[dn];W[nf];B[en];W[bl];B[em];W[el]
+;B[ei];W[dh];B[pa];W[sc];B[sa];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score14.sgf b/regression/games/scoring/score14.sgf
new file mode 100644 (file)
index 0000000..c79b4c2
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[pp];B[dc];W[do];B[de];W[qf];B[qh];W[qc];B[qd];W[pc]
+;B[od];W[rd];B[re];W[rc];B[qe];W[nc];B[qn];W[pn];B[pm];W[on]
+;B[qp];W[qo];B[ro];W[po];B[rm];W[qq];B[rp];W[om];B[pl];W[dq]
+;B[pf];W[jq];B[pq];W[oq];B[rr];W[jd];B[pr];W[cj];B[cm];W[cg]
+;B[em];W[gq];B[bf];W[cf];B[ce];W[bg];B[be];W[gc];B[jo];W[ld]
+;B[lo];W[mm];B[or];W[bn];B[op];W[nk];B[nq];W[eg];B[kl];W[kj]
+;B[ej];W[lk];B[kh];W[km];B[jm];W[ll];B[jl];W[pj];B[qj];W[ni]
+;B[kn];W[ij];B[lm];W[jg];B[hk];W[hj];B[bm];W[ig];B[fe];W[id]
+;B[gf];W[fh];B[mf];W[lq];B[di];W[ci];B[mr];W[kg];B[kr];W[ir]
+;B[kq];W[lh];B[gn];W[hg];B[bk];W[eb];B[db];W[ec];B[ck];W[da]
+;B[dj];W[cb];B[cc];W[bb];B[bc];W[bj];B[ab];W[ba];B[ed];W[ef]
+;B[eo];W[af];B[dn];W[co];B[ep];W[eq];B[bp];W[bo];B[dp];W[cp]
+;B[bq];W[br];B[cr];W[cq];B[ar];W[bs];B[cs];W[ap];B[as];W[ff]
+;B[ge];W[ho];B[an];W[jp];B[ac];W[ea];B[aa];W[ca];B[fc];W[fb]
+;B[fd];W[gb];B[br];W[dr];B[kp];W[gk];B[hm];W[hl];B[ik];W[il]
+;B[jk];W[fl];B[im];W[gl];B[ie];W[le];B[hd];W[me];B[lf];W[kf]
+;B[nf];W[mn];B[oh];W[ln];B[pi];W[pk];B[qk];W[ol];B[oj];W[ok]
+;B[oi];W[jr];B[nj];W[nh];B[ng];W[mh];B[mj];W[mo];B[mp];W[no]
+;B[el];W[np];B[lp];W[mk];B[fm];W[fk];B[fj];W[gj];B[go];W[io]
+;B[in];W[gp];B[nd];W[mc];B[ek];W[fp];B[fo];W[fi];B[ne];W[jj]
+;B[aj];W[ch];B[bi];W[bh];B[ai];W[oc];B[dh];W[li];B[sd];W[sc]
+;B[se];W[km];B[js];W[is];B[ks];W[lm];B[eh];W[dg];B[ah];W[ag]
+;B[ak];W[ao];B[am];W[md];B[hn];W[lj];B[mg];W[lg];B[mi];W[ei]
+;B[cn];W[gm];B[kk];W[oo];B[oq];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score15.sgf b/regression/games/scoring/score15.sgf
new file mode 100644 (file)
index 0000000..3ce121f
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[qd];W[ec];B[pq];W[eq];B[po];W[od];B[pf];W[qc];B[cp];W[rd]
+;B[cd];W[do];B[co];W[de];B[ce];W[df];B[cg];W[jc];B[mc];W[dn]
+;B[bm];W[jq];B[je];W[hc];B[ob];W[jo];B[fp];W[fq];B[gp];W[hr]
+;B[dl];W[mq];B[me];W[qm];B[rn];W[qh];B[qg];W[ph];B[pk];W[qe]
+;B[rk];W[oc];B[pb];W[of];B[pd];W[pe];B[pc];W[rg];B[rc];W[om]
+;B[re];W[qf];B[jm];W[in];B[dq];W[dp];B[cq];W[nk];B[ep];W[fn]
+;B[rm];W[gm];B[dc];W[eb];B[cf];W[dd];B[cc];W[ie];B[id];W[he]
+;B[hd];W[jd];B[gd];W[ic];B[ge];W[fe];B[gf];W[if];B[jf];W[ig]
+;B[oj];W[fg];B[ng];W[jg];B[pg];W[og];B[ni];W[kf];B[ff];W[el]
+;B[mf];W[kl];B[kn];W[nn];B[lm];W[np];B[ln];W[lk];B[fi];W[gk]
+;B[ql];W[ba];B[pm];W[gh];B[db];W[da];B[kb];W[ke];B[bj];W[jb]
+;B[kc];W[gi];B[li];W[ei];B[ji];W[il];B[jl];W[dk];B[jk];W[lp]
+;B[cl];W[ka];B[la];W[or];B[ja];W[pr];B[im];W[qq];B[oq];W[hm]
+;B[qp];W[rq];B[rp];W[ia];B[sq];W[dr];B[cr];W[ds];B[qr];W[rr]
+;B[rs];W[qs];B[sr];W[ss];B[sp];W[rs];B[cs];W[er];B[gc];W[dg]
+;B[hb];W[fb];B[ch];W[gb];B[ha];W[ga];B[ik];W[rf];B[sd];W[ii]
+;B[hl];W[op];B[pp];W[mj];B[mi];W[ml];B[qb];W[ol];B[bb];W[ca]
+;B[ri];W[sf];B[pg];W[oi];B[nj];W[pj];B[ok];W[cb];B[bc];W[ck]
+;B[bk];W[mm];B[qj];W[pl];B[qn];W[lg];B[pi];W[kh];B[oh];W[ki]
+;B[kj];W[lj];B[cj];W[dj];B[nq];W[nr];B[on];W[oo];B[ne];W[dm]
+;B[oe];W[cm];B[bl];W[dh];B[cn];W[lh];B[mh];W[ab];B[rh];W[aa]
+;B[kd];W[le];B[ld];W[ci];B[bi];W[ac];B[ad];W[ea];B[pn];W[di]
+;B[ka];W[lf];B[mg];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score16.sgf b/regression/games/scoring/score16.sgf
new file mode 100644 (file)
index 0000000..4364183
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[cc];B[qp];W[cp];B[op];W[nc];B[qf];W[pb];B[eq];W[gq]
+;B[eo];W[dn];B[qc];W[en];B[dd];W[dc];B[ed];W[kc];B[ec];W[qh]
+;B[cd];W[jq];B[qj];W[mq];B[nr];W[qm];B[oj];W[om];B[ci];W[dr]
+;B[cl];W[bd];B[be];W[hc];B[bc];W[bb];B[ad];W[nq];B[oq];W[mr]
+;B[or];W[fb];B[eb];W[qb];B[he];W[nk];B[jo];W[lj];B[bn];W[ll]
+;B[do];W[er];B[co];W[mm];B[bp];W[oh];B[ni];W[nh];B[of];W[el]
+;B[ph];W[pg];B[pi];W[qg];B[og];W[mh];B[rb];W[pk];B[pf];W[pj]
+;B[qi];W[oi];B[pc];W[qk];B[rg];W[rj];B[rh];W[oc];B[cq];W[ne]
+;B[kh];W[mg];B[cr];W[fc];B[ho];W[gm];B[go];W[iq];B[gk];W[hl]
+;B[jj];W[kf];B[hj];W[jg];B[ek];W[im];B[hg];W[ge];B[gd];W[fd]
+;B[hd];W[fe];B[jh];W[jl];B[fa];W[ga];B[ea];W[jb];B[nf];W[mf]
+;B[fg];W[ef];B[gf];W[gb];B[df];W[eg];B[cg];W[eh];B[rn];W[qn]
+;B[rm];W[rl];B[qo];W[je];B[fl];W[fm];B[dl];W[ra];B[em];W[rc]
+;B[fn];W[sm];B[ro];W[if];B[hf];W[mo];B[rd];W[sb];B[fi];W[sd]
+;B[id];W[re];B[qd];W[qe];B[od];W[qg];B[si];W[dq];B[ri];W[sg]
+;B[dp];W[fq];B[ep];W[kp];B[sf];W[rf];B[sh];W[se];B[ms];W[ls]
+;B[ns];W[kr];B[pn];W[pm];B[po];W[kn];B[ko];W[lo];B[io];W[ik]
+;B[ds];W[fr];B[nn];W[on];B[no];W[np];B[oo];W[ig];B[ih];W[ei]
+;B[fj];W[dj];B[cj];W[dk];B[ck];W[ic];B[jd];W[kd];B[ij];W[ee]
+;B[fh];W[jn];B[de];W[mn];B[li];W[mi];B[kj];W[lh];B[ki];W[lk]
+;B[kg];W[kk];B[ie];W[jf];B[fp];W[lg];B[nm];W[nl];B[es];W[fs]
+;B[cs];W[di];B[gl];W[ch];B[bh];W[dg];B[sn];W[sl];B[dh];W[hp]
+;B[ch];W[jk];B[gc];W[jc];B[hk];W[gn];B[fo];W[hn];B[in];W[hm]
+;B[ej];W[gp];B[ip];W[jp];B[ff];W[ia];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score17.sgf b/regression/games/scoring/score17.sgf
new file mode 100644 (file)
index 0000000..03300b8
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[pp];B[dp];W[dd];B[fd];W[df];B[dc];W[cc];B[nq];W[np]
+;B[mp];W[no];B[oq];W[pq];B[jq];W[pn];B[ec];W[cb];B[jc];W[cj]
+;B[qi];W[qk];B[cl];W[qf];B[rg];W[fq];B[fp];W[gp];B[fo];W[eq]
+;B[dq];W[hq];B[oi];W[hn];B[qe];W[nm];B[rf];W[nc];B[oc];W[eh]
+;B[gh];W[nd];B[hl];W[ld];B[lb];W[mg];B[je];W[jr];B[lr];W[kr]
+;B[kq];W[iq];B[oe];W[bk];B[mc];W[mi];B[nb];W[lf];B[md];W[nj]
+;B[ne];W[fj];B[do];W[bm];B[dm];W[fa];B[fl];W[rj];B[pf];W[jp]
+;B[lq];W[kp];B[lo];W[pr];B[or];W[kn];B[ri];W[kk];B[rl];W[rn]
+;B[rk];W[ql];B[qj];W[jl];B[hj];W[jj];B[qg];W[ii];B[gi];W[jg]
+;B[qm];W[pm];B[rm];W[qn];B[hf];W[sm];B[im];W[sl];B[sj];W[jo]
+;B[er];W[fr];B[dr];W[ff];B[ee];W[de];B[fe];W[bo];B[bl];W[al]
+;B[bp];W[ap];B[aq];W[bq];B[cp];W[ar];B[dk];W[dj];B[ef];W[fg]
+;B[hg];W[oh];B[nh];W[ni];B[ph];W[og];B[ps];W[pj];B[pi];W[pk]
+;B[db];W[da];B[gc];W[kc];B[kb];W[jd];B[ic];W[id];B[if];W[ha]
+;B[hd];W[ke];B[ie];W[kd];B[fs];W[gs];B[es];W[ik];B[hk];W[ek]
+;B[el];W[cn];B[eg];W[dg];B[fh];W[fi];B[qs];W[rr];B[jm];W[km]
+;B[ks];W[ir];B[dn];W[jn];B[go];W[ho];B[ln];W[lp];B[mo];W[hm]
+;B[il];W[fk];B[nn];W[gl];B[gk];W[gm];B[mm];W[hi];B[gj];W[ei]
+;B[nl];W[ml];B[om];W[lm];B[oo];W[op];B[on];W[ol];B[mk];W[ll]
+;B[nk];W[oj];B[lj];W[ja];B[ki];W[jb];B[ib];W[ia];B[jf];W[ij]
+;B[kf];W[kg];B[cr];W[ig];B[rs];W[hb];B[hc];W[fb];B[ka];W[gb]
+;B[mn];W[fm];B[qr];W[rq];B[qq];W[rp];B[qp];W[po];B[qo];W[ro]
+;B[me];W[le];B[js];W[hh];B[in];W[io];B[gg];W[mf];B[nf];W[ng]
+;B[eb];W[ea];B[lk];W[fc];B[is];W[gr];B[hs];W[gf];B[he];W[ed]
+;B[kj];W[pg];B[ji];W[of];B[ss];W[lc];B[jh];W[gd];B[ge];W[ih]
+;B[sr];W[mq];B[mr];W[ns];B[ms];W[os];B[nr];W[os];B[ns];W[sn]
+;B[sk];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score18.sgf b/regression/games/scoring/score18.sgf
new file mode 100644 (file)
index 0000000..dee6cf6
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pc];W[dp];B[po];W[cd];B[pe];W[ec];B[pq];W[cj];B[fq];W[dn]
+;B[dr];W[hq];B[cq];W[eq];B[er];W[fp];B[gp];W[gq];B[fr];W[go]
+;B[hp];W[iq];B[ho];W[gn];B[qj];W[hn];B[jp];W[jc];B[jq];W[je]
+;B[fd];W[cg];B[fc];W[mc];B[eb];W[qg];B[rf];W[qm];B[rn];W[qf]
+;B[rl];W[re];B[rc];W[og];B[nb];W[nc];B[mb];W[lb];B[oc];W[pi]
+;B[gr];W[hd];B[ni];W[gb];B[fb];W[pl];B[dc];W[nl];B[ed];W[pj]
+;B[cc];W[de];B[ej];W[fi];B[di];W[fk];B[ci];W[bh];B[dk];W[bi]
+;B[eh];W[fg];B[dj];W[cp];B[ck];W[cm];B[el];W[mh];B[fj];W[bj]
+;B[bk];W[fh];B[gj];W[gl];B[mq];W[eg];B[qi];W[rg];B[ik];W[mj]
+;B[ih];W[qk];B[rk];W[ql];B[mi];W[lh];B[li];W[dq];B[bq];W[lj]
+;B[ki];W[kk];B[ge];W[bc];B[bb];W[ac];B[jo];W[ab];B[cb];W[rm]
+;B[sm];W[qn];B[sl];W[ro];B[rh];W[sj];B[rj];W[qh];B[sn];W[rq]
+;B[qo];W[rp];B[sr];W[sh];B[rr];W[qr];B[qq];W[so];B[qp];W[ri]
+;B[bm];W[bn];B[bl];W[ma];B[ob];W[dl];B[ek];W[em];B[jl];W[mo]
+;B[op];W[mm];B[in];W[fl];B[lo];W[dh];B[ei];W[ne];B[bp];W[jg]
+;B[ig];W[he];B[nj];W[od];B[mk];W[kl];B[nk];W[pd];B[lm];W[qd]
+;B[km];W[qc];B[qb];W[rd];B[rb];W[sc];B[gf];W[pa];B[oa];W[sb]
+;B[la];W[jh];B[ji];W[im];B[jm];W[hl];B[jf];W[kf];B[if];W[cl]
+;B[gg];W[gc];B[gi];W[mp];B[lq];W[lp];B[np];W[ln];B[ko];W[kn]
+;B[kp];W[bo];B[pn];W[il];B[ga];W[ha];B[fa];W[ka];B[pb];W[hb]
+;B[ra];W[no];B[kj];W[ie];B[nh];W[kh];B[ng];W[mg];B[gh];W[oh]
+;B[hk];W[nf];B[aj];W[bf];B[ba];W[pm];B[on];W[ee];B[om];W[ol]
+;B[ml];W[nm];B[mn];W[nn];B[ap];W[ok];B[hf];W[ch];B[ai];W[ah]
+;B[ak];W[ff];B[am];W[oj];B[sq];W[sk];B[dd];W[bd];B[oo];W[fe]
+;B[gk];W[gd];B[jn];W[mn];B[an];W[oi];B[ao];W[aa];B[pr];W[sp]
+;B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score19.sgf b/regression/games/scoring/score19.sgf
new file mode 100644 (file)
index 0000000..cbe05f2
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 986943023] 
+;B[dp];W[cc];B[qe];W[qq];B[pc];W[cn];B[cl];W[cq];B[cp];W[dq]
+;B[ep];W[fq];B[dm];W[cf];B[eq];W[er];B[dr];W[cr];B[fr];W[ds]
+;B[gq];W[fs];B[jc];W[gr];B[fp];W[lq];B[pp];W[qp];B[po];W[or]
+;B[qo];W[iq];B[qk];W[hc];B[ec];W[fb];B[mc];W[eb];B[ci];W[ei]
+;B[qh];W[me];B[fm];W[hm];B[ek];W[ok];B[go];W[ql];B[rl];W[fr]
+;B[pl];W[gj];B[dh];W[oh];B[bq];W[dj];B[bj];W[hq];B[io];W[gp]
+;B[im];W[il];B[hl];W[gl];B[jl];W[ik];B[jm];W[kj];B[ee];W[jj]
+;B[df];W[cg];B[eh];W[he];B[fi];W[ej];B[fj];W[bn];B[bh];W[bl]
+;B[ce];W[be];B[bg];W[bf];B[rp];W[rq];B[ro];W[cd];B[pq];W[pr]
+;B[sq];W[de];B[ef];W[jb];B[kc];W[kb];B[lb];W[ic];B[rr];W[qr]
+;B[ka];W[ib];B[ke];W[rs];B[lf];W[sr];B[mf];W[sp];B[of];W[br]
+;B[bo];W[aq];B[nh];W[bp];B[mk];W[nl];B[mi];W[co];B[ii];W[kl]
+;B[jk];W[kh];B[hk];W[ij];B[kk];W[gk];B[mm];W[hn];B[mp];W[ho]
+;B[fo];W[ml];B[gi];W[om];B[mq];W[nn];B[lr];W[lk];B[kq];W[lj]
+;B[lm];W[mj];B[lp];W[ll];B[oi];W[ol];B[qm];W[km];B[jn];W[jp]
+;B[kn];W[jr];B[np];W[ip];B[hh];W[jo];B[bk];W[bm];B[dd];W[pj]
+;B[oj];W[qj];B[pk];W[rj];B[mn];W[in];B[kr];W[rh];B[rg];W[ri]
+;B[jq];W[ir];B[gd];W[ph];B[hd];W[id];B[ie];W[qg];B[pg];W[qi]
+;B[rf];W[if];B[je];W[hf];B[jf];W[gf];B[fd];W[ne];B[jg];W[nj]
+;B[ni];W[ng];B[lh];W[nf];B[og];W[qf];B[pf];W[qh];B[pd];W[ld]
+;B[lc];W[oq];B[no];W[gc];B[jh];W[ki];B[dc];W[db];B[kg];W[ko]
+;B[ln];W[nr];B[mr];W[fl];B[el];W[ms];B[so];W[ak];B[aj];W[al]
+;B[op];W[af];B[gn];W[ce];B[fc];W[js];B[lo];W[dg];B[eg];W[ag]
+;B[li];W[on];B[pn];W[gm];B[ja];W[dn];B[en];W[do];B[eo];W[ia]
+;B[la];W[ah];B[ch];W[ai];B[jd];W[sq];B[ks];W[cm];B[pm];W[kp]
+;B[fk];W[hj];B[hi];W[nq];B[bi];W[ji];B[nm];W[oo];B[ls];W[ns]
+;B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score2.sgf b/regression/games/scoring/score2.sgf
new file mode 100644 (file)
index 0000000..9672300
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pe];W[dc];B[pp];W[dq];B[pc];W[qn];B[ql];W[on];B[np];W[co]
+;B[ce];W[dh];B[ee];W[fd];B[bc];W[fe];B[db];W[jq];B[eb];W[qi]
+;B[ol];W[oi];B[cm];W[pg];B[cj];W[gq];B[kc];W[qf];B[hc];W[he]
+;B[go];W[rp];B[qq];W[rq];B[nn];W[rd];B[jo];W[dn];B[rb];W[bn]
+;B[bh];W[dm];B[cl];W[ak];B[ke];W[fb];B[mi];W[ec];B[cc];W[hb]
+;B[ib];W[gc];B[ic];W[rl];B[rk];W[rm];B[qk];W[ia];B[nm];W[gl]
+;B[ja];W[il];B[ha];W[ek];B[gb];W[ei];B[oo];W[bf];B[cg];W[cf]
+;B[pn];W[qr];B[pr];W[rr];B[kl];W[df];B[dg];W[de];B[ef];W[eg]
+;B[ff];W[cd];B[bg];W[hd];B[be];W[ag];B[ae];W[af];B[bi];W[dk]
+;B[ck];W[bd];B[ad];W[ac];B[fa];W[gg];B[lq];W[hh];B[fg];W[bb]
+;B[cb];W[kr];B[eh];W[di];B[ba];W[fi];B[ab];W[mr];B[ad];W[mq]
+;B[mp];W[lp];B[kp];W[qp];B[lo];W[pq];B[oq];W[or];B[ps];W[nr]
+;B[qq];W[pm];B[om];W[pq];B[qm];W[rn];B[qq];W[jj];B[lr];W[pq]
+;B[ls];W[qq];B[ok];W[ip];B[io];W[jh];B[nf];W[je];B[jf];W[if]
+;B[kf];W[qc];B[qb];W[pd];B[oc];W[od];B[of];W[hp];B[nc];W[ho]
+;B[jd];W[qe];B[ie];W[jg];B[mg];W[rj];B[rh];W[sk];B[hf];W[gf]
+;B[ig];W[lj];B[hn];W[gn];B[in];W[ll];B[lm];W[kk];B[km];W[ml]
+;B[nj];W[rc];B[nd];W[sb];B[oe];W[ra];B[pb];W[qd];B[qa];W[ae]
+;B[kg];W[kh];B[fo];W[aj];B[ks];W[js];B[lh];W[fc];B[oh];W[qj]
+;B[ph];W[qh];B[pi];W[pk];B[pl];W[pj];B[oj];W[og];B[nh];W[kq]
+;B[rg];W[qg];B[rf];W[ms];B[lp];W[sl];B[mm];W[hg];B[if];W[jl]
+;B[jm];W[mk];B[li];W[ki];B[mj];W[ih];B[nq];W[qs];B[qo];W[ro]
+;B[ac];W[im];B[hm];W[gm];B[eo];W[hl];B[fq];W[fr];B[eq];W[er]
+;B[dp];W[dr];B[cp];W[po];B[bq];W[cn];B[qo];W[gp];B[cr];W[fp]
+;B[bp];W[ep];B[do];W[bo];B[sa];W[sc];B[po];W[ra];B[nl];W[sa]
+;B[pf];W[ng];B[jp];W[ir];B[nk];W[lk];B[id];W[ap];B[ai];W[tt]
+;B[bj];W[tt];B[al];W[bm];B[bk];W[tt];B[bl];W[tt];B[dl];W[tt]
+;B[ao];W[em];B[aq];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score20.sgf b/regression/games/scoring/score20.sgf
new file mode 100644 (file)
index 0000000..51acdc0
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 986992005] 
+;B[dd];W[pd];B[cp];W[qp];B[op];W[pn];B[qq];W[rq];B[pq];W[ro]
+;B[lq];W[eq];B[gq];W[eo];B[dn];W[fc];B[en];W[cf];B[df];W[dg]
+;B[ef];W[cc];B[ce];W[be];B[cg];W[dc];B[bf];W[dh];B[qf];W[ed]
+;B[kc];W[nc];B[qd];W[qc];B[rc];W[rb];B[re];W[sc];B[pe];W[rd]
+;B[od];W[pc];B[lo];W[oe];B[nd];W[og];B[go];W[oc];B[jq];W[fh]
+;B[bd];W[ff];B[dr];W[fr];B[hc];W[pf];B[rg];W[qe];B[md];W[fn]
+;B[mc];W[fo];B[gr];W[lf];B[bi];W[hm];B[pg];W[gm];B[ph];W[pk]
+;B[dk];W[lm];B[gb];W[eg];B[qj];W[qk];B[da];W[rj];B[rr];W[qh]
+;B[qi];W[ri];B[oi];W[rh];B[mi];W[qg];B[oh];W[ki];B[nk];W[oj]
+;B[nj];W[pi];B[nm];W[fb];B[fa];W[ng];B[ll];W[mn];B[nn];W[mo]
+;B[km];W[kl];B[np];W[kn];B[no];W[jm];B[pm];W[qm];B[er];W[fq]
+;B[pl];W[dq];B[cq];W[lk];B[fs];W[ml];B[ok];W[pj];B[ei];W[bc]
+;B[cd];W[lh];B[sq];W[rp];B[fp];W[do];B[co];W[sr];B[ss];W[qs]
+;B[ac];W[ab];B[gn];W[fm];B[em];W[ad];B[ae];W[qr];B[pr];W[io]
+;B[hq];W[gj];B[mm];W[ln];B[mp];W[ig];B[nb];W[ko];B[ql];W[rl]
+;B[qn];W[qo];B[rm];W[lp];B[sl];W[po];B[rk];W[gd];B[ee];W[fe]
+;B[ob];W[je];B[ic];W[pb];B[ie];W[hf];B[jd];W[if];B[ke];W[jf]
+;B[he];W[ge];B[le];W[el];B[dl];W[fl];B[mf];W[mg];B[kf];W[lg]
+;B[nf];W[kg];B[of];W[pe];B[lj];W[kj];B[kp];W[jp];B[lo];W[di]
+;B[ej];W[cj];B[bl];W[bj];B[ci];W[dj];B[ek];W[ai];B[ah];W[aj]
+;B[bh];W[sf];B[ba];W[oa];B[mb];W[hn];B[ip];W[jo];B[ho];W[gp]
+;B[hp];W[fk];B[sj];W[fi];B[mk];W[eb];B[ea];W[nl];B[om];W[na]
+;B[ma];W[pa];B[li];W[si];B[sk];W[bb];B[lp];W[db];B[ca];W[hd]
+;B[id];W[mh];B[ni];W[gc];B[ne];W[ck];B[cl];W[eh];B[bk];W[ak]
+;B[al];W[ac];B[ep];W[dp];B[gp];W[cb];B[ga];W[fj];B[cn];W[nh]
+;B[ch];W[aa];B[ia];W[ll];B[ol];W[sp];B[ps];W[sr];B[rs];W[tt]
+;B[tt]
+)
diff --git a/regression/games/scoring/score21.sgf b/regression/games/scoring/score21.sgf
new file mode 100644 (file)
index 0000000..8fdfb96
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 986996887] 
+;B[dp];W[dd];B[pq];W[pd];B[qo];W[cn];B[fp];W[bp];B[cl];W[cq]
+;B[co];W[bo];B[dn];W[dm];B[cm];W[bn];B[em];W[qm];B[dl];W[qj]
+;B[cf];W[fd];B[bd];W[ch];B[cc];W[ce];B[be];W[df];B[dg];W[cg]
+;B[bf];W[eg];B[jq];W[dh];B[nc];W[nd];B[md];W[ne];B[oc];W[pc]
+;B[jc];W[pf];B[mq];W[gm];B[pb];W[qb];B[hp];W[ob];B[nb];W[pa]
+;B[eb];W[mo];B[gc];W[je];B[pn];W[me];B[mc];W[dq];B[pm];W[qn]
+;B[rn];W[ql];B[mm];W[ko];B[ol];W[mk];B[oj];W[ph];B[mj];W[lj]
+;B[er];W[nj];B[mi];W[nk];B[lh];W[ok];B[lk];W[kj];B[kg];W[oi]
+;B[ll];W[ig];B[jl];W[ji];B[ke];W[kd];B[kc];W[le];B[ln];W[kf]
+;B[jn];W[ge];B[lo];W[gi];B[bs];W[dr];B[ds];W[nh];B[bm];W[bj]
+;B[cj];W[bk];B[ck];W[ej];B[bi];W[ci];B[bh];W[bg];B[ag];W[ai]
+;B[cd];W[de];B[rm];W[rl];B[ij];W[ii];B[hl];W[fl];B[gl];W[fm]
+;B[fk];W[dc];B[db];W[fo];B[ek];W[en];B[fj];W[fi];B[dj];W[ei]
+;B[jj];W[ki];B[br];W[hj];B[eo];W[go];B[kk];W[gp];B[es];W[gq]
+;B[eq];W[fn];B[bq];W[gr];B[hk];W[ir];B[hn];W[ho];B[iq];W[kp]
+;B[kq];W[lp];B[jr];W[mp];B[gj];W[lq];B[lr];W[hi];B[hd];W[hr]
+;B[id];W[nq];B[nr];W[mr];B[ms];W[ip];B[or];W[hq];B[is];W[jp]
+;B[mq];W[np];B[ro];W[lg];B[sl];W[sk];B[sm];W[rj];B[io];W[mg]
+;B[kr];W[js];B[mr];W[hs];B[bl];W[nn];B[nl];W[hm];B[ak];W[ah]
+;B[af];W[ie];B[od];W[oe];B[pl];W[pk];B[fc];W[he];B[ec];W[ed]
+;B[ld];W[kn];B[oo];W[im];B[jm];W[in];B[jo];W[jd];B[ik];W[na]
+;B[di];W[mb];B[lc];W[lb];B[kb];W[ma];B[ka];W[ml];B[nm];W[aj]
+;B[al];W[gd];B[la];W[oa];B[ic];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score22.sgf b/regression/games/scoring/score22.sgf
new file mode 100644 (file)
index 0000000..cf71d17
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 987005464] 
+;B[pd];W[cp];B[dd];W[pq];B[po];W[np];B[qq];W[qr];B[qp];W[or]
+;B[ql];W[ep];B[jd];W[cf];B[fd];W[bd];B[cc];W[dh];B[gq];W[fr]
+;B[cj];W[nc];B[qf];W[pb];B[qc];W[ld];B[cm];W[qh];B[qb];W[pc]
+;B[fq];W[eq];B[go];W[kq];B[bc];W[cd];B[jp];W[jn];B[bh];W[ff]
+;B[hd];W[de];B[dc];W[ol];B[kc];W[oj];B[ko];W[kf];B[jq];W[ej]
+;B[kr];W[lc];B[gr];W[er];B[pm];W[lq];B[rr];W[od];B[pe];W[lr]
+;B[jr];W[bg];B[ch];W[cg];B[rh];W[ri];B[rg];W[ph];B[qs];W[pr]
+;B[nn];W[mm];B[mo];W[km];B[mp];W[mq];B[op];W[oq];B[rk];W[rs]
+;B[no];W[ps];B[rq];W[nq];B[ls];W[ms];B[ns];W[ks];B[nr];W[ah]
+;B[si];W[qi];B[sj];W[mh];B[bi];W[gh];B[pa];W[ob];B[ad];W[be]
+;B[dk];W[fl];B[bo];W[hj];B[bp];W[bq];B[aq];W[br];B[lb];W[co]
+;B[cn];W[mb];B[kb];W[ap];B[ao];W[ar];B[em];W[jh];B[fn];W[nf]
+;B[io];W[nl];B[do];W[cq];B[ee];W[ef];B[di];W[eh];B[ei];W[eo]
+;B[dn];W[fk];B[gi];W[hi];B[fj];W[ek];B[ln];W[lm];B[ai];W[ag]
+;B[fe];W[hf];B[jf];W[gm];B[hm];W[hl];B[im];W[gn];B[fo];W[il]
+;B[ke];W[le];B[kg];W[lf];B[jg];W[jm];B[kh];W[in];B[ji];W[ih]
+;B[li];W[lk];B[ge];W[mj];B[gf];W[gg];B[he];W[hg];B[fh];W[fg]
+;B[fi];W[gs];B[hs];W[fs];B[oe];W[ne];B[el];W[of];B[pg];W[og]
+;B[om];W[gj];B[dj];W[lg];B[fp];W[mi];B[if];W[sh];B[qg];W[pk]
+;B[rj];W[qj];B[kd];W[oa];B[qa];W[dp];B[ma];W[na];B[la];W[ae]
+;B[ac];W[ho];B[hp];W[jo];B[hn];W[ho];B[hn];W[hm];B[ho];W[kn]
+;B[kp];W[mn];B[lo];W[ap];B[am];W[aq];B[lj];W[kj];B[jj];W[kk]
+;B[ki];W[jk];B[ij];W[ik];B[qk];W[ii];B[ig];W[fm];B[en];W[pf]
+;B[pl];W[lh];B[nm];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score23.sgf b/regression/games/scoring/score23.sgf
new file mode 100644 (file)
index 0000000..e08240b
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 987015465] 
+;B[dd];W[cq];B[qd];W[qp];B[oq];W[oc];B[mc];W[po];B[od];W[pd]
+;B[pc];W[pe];B[pb];W[nd];B[lq];W[cf];B[ch];W[cc];B[cd];W[dc]
+;B[ed];W[bd];B[be];W[bc];B[ce];W[fc];B[ge];W[hd];B[dp];W[oe]
+;B[dq];W[bg];B[cp];W[ef];B[fg];W[qj];B[cl];W[fi];B[dj];W[eh]
+;B[hp];W[eg];B[ob];W[fk];B[hg];W[lo];B[gi];W[kq];B[kr];W[jg]
+;B[fm];W[kc];B[iq];W[hl];B[hm];W[im];B[ld];W[gm];B[hn];W[gl]
+;B[gn];W[qe];B[il];W[el];B[em];W[qc];B[kd];W[jm];B[ik];W[ek]
+;B[jc];W[fd];B[qb];W[rd];B[fe];W[ee];B[ii];W[ae];B[kh];W[rb]
+;B[jh];W[mh];B[if];W[ic];B[kg];W[jd];B[je];W[id];B[lc];W[kb]
+;B[qr];W[kp];B[jq];W[bq];B[bp];W[dr];B[er];W[cr];B[rq];W[bi]
+;B[lb];W[jb];B[ci];W[bh];B[jl];W[km];B[ro];W[gj];B[fh];W[ei]
+;B[rm];W[rp];B[qo];W[sp];B[pp];W[qq];B[rr];W[hi];B[oo];W[gh]
+;B[pn];W[gg];B[gf];W[ff];B[kj];W[nm];B[lp];W[ko];B[nc];W[bj]
+;B[bk];W[dk];B[mi];W[cg];B[ni];W[es];B[ng];W[fr];B[eq];W[hr]
+;B[gq];W[gr];B[me];W[is];B[ir];W[kl];B[rk];W[rj];B[sj];W[si]
+;B[sk];W[rh];B[mo];W[oh];B[jo];W[nh];B[ol];W[mn];B[jn];W[no]
+;B[oj];W[mp];B[ml];W[lm];B[og];W[lh];B[mg];W[li];B[lj];W[lg]
+;B[lf];W[ph];B[lr];W[qk];B[ql];W[pg];B[kn];W[ra];B[pk];W[ap]
+;B[aq];W[ar];B[bs];W[on];B[hk];W[ao];B[dl];W[bo];B[gk];W[fl]
+;B[cn];W[gd];B[pi];W[qi];B[of];W[pf];B[ne];W[od];B[hh];W[fq]
+;B[fp];W[hs];B[fs];W[ds];B[hj];W[jk];B[gi];W[fj];B[he];W[kk]
+;B[ki];W[ie];B[hf];W[la];B[ma];W[ka];B[hi];W[aj];B[ck];W[cj]
+;B[qa];W[co];B[do];W[hq];B[gp];W[gs];B[ak];W[bn];B[bm];W[pj]
+;B[oi];W[md];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score24.sgf b/regression/games/scoring/score24.sgf
new file mode 100644 (file)
index 0000000..4c90e5a
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 987043616] 
+;B[qp];W[cd];B[dp];W[qd];B[kp];W[ed];B[oc];W[cn];B[fp];W[bp]
+;B[cl];W[cq];B[co];W[bo];B[pe];W[qe];B[pf];W[qg];B[jc];W[oq]
+;B[mq];W[oo];B[pn];W[je];B[on];W[kc];B[oh];W[pi];B[dn];W[jd]
+;B[pr];W[dm];B[cm];W[bn];B[em];W[dl];B[ck];W[qh];B[ci];W[el]
+;B[fm];W[hm];B[cf];W[mh];B[fl];W[ek];B[hp];W[hk];B[ic];W[pc]
+;B[gc];W[fb];B[fc];W[ec];B[kb];W[lc];B[lb];W[mc];B[od];W[mb]
+;B[ni];W[or];B[ej];W[fk];B[gb];W[en];B[eo];W[fn];B[gn];W[do]
+;B[dq];W[cp];B[eb];W[gm];B[be];W[cb];B[bc];W[dj];B[cc];W[ei]
+;B[dc];W[dd];B[fe];W[df];B[fd];W[bd];B[db];W[ad];B[ee];W[de]
+;B[dg];W[eg];B[ef];W[cg];B[dh];W[bf];B[bg];W[ce];B[bh];W[eh]
+;B[ql];W[fo];B[go];W[ep];B[eq];W[cf];B[ch];W[kl];B[mn];W[ob]
+;B[pk];W[qj];B[nk];W[oj];B[nj];W[ok];B[ol];W[rk];B[rl];W[mr]
+;B[lr];W[nr];B[lq];W[he];B[ln];W[ih];B[qk];W[rj];B[cr];W[br]
+;B[cs];W[me];B[es];W[hn];B[ho];W[jn];B[ip];W[bm];B[eo];W[dn]
+;B[qf];W[rf];B[bl];W[gf];B[nf];W[mf];B[oi];W[pj];B[qr];W[sl]
+;B[sm];W[sk];B[rn];W[ki];B[ng];W[mg];B[ff];W[fg];B[ll];W[nc]
+;B[km];W[jm];B[kk];W[jl];B[ij];W[ik];B[jj];W[hj];B[lj];W[mi]
+;B[gp];W[la];B[jb];W[ji];B[kn];W[ii];B[kj];W[li];B[cj];W[ne]
+;B[pg];W[oe];B[pd];W[qc];B[of];W[nd];B[bs];W[al];B[ak];W[am]
+;B[ar];W[bq];B[mj];W[id];B[jo];W[ka];B[ja];W[ma];B[in];W[im]
+;B[ko];W[aq];B[hd];W[ge];B[gd];W[io];B[di];W[fj];B[dk];W[as]
+;B[ep];W[ej];B[ar];W[in];B[as];W[jk];B[ph];W[nh];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score25.sgf b/regression/games/scoring/score25.sgf
new file mode 100644 (file)
index 0000000..e354091
--- /dev/null
@@ -0,0 +1,25 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 987056017] 
+;B[dp];W[pp];B[dd];W[qc];B[nq];W[lq];B[qq];W[pq];B[qp];W[po]
+;B[pr];W[or];B[qr];W[oq];B[qn];W[fq];B[cn];W[dr];B[cq];W[np]
+;B[pd];W[iq];B[qd];W[cl];B[pc];W[cr];B[qh];W[cf];B[fc];W[bd]
+;B[cc];W[ci];B[lc];W[hc];B[bc];W[fo];B[qk];W[he];B[be];W[oh]
+;B[dm];W[of];B[nc];W[lg];B[bm];W[ok];B[dl];W[ck];B[aj];W[fj]
+;B[qf];W[fm];B[br];W[qb];B[rd];W[rc];B[hb];W[ib];B[gb];W[ic]
+;B[kb];W[bf];B[ad];W[ke];B[af];W[bg];B[pl];W[ne];B[dq];W[eq]
+;B[os];W[ns];B[ps];W[mr];B[ef];W[ln];B[hg];W[hi];B[ih];W[jj]
+;B[gf];W[nm];B[kh];W[li];B[lh];W[mh];B[mi];W[kj];B[me];W[nh]
+;B[gd];W[mf];B[le];W[lf];B[kf];W[kg];B[jf];W[id];B[jg];W[jd]
+;B[nd];W[lk];B[kc];W[dj];B[fh];W[pb];B[ob];W[bl];B[al];W[pi]
+;B[qi];W[dg];B[fl];W[gl];B[ek];W[ej];B[fk];W[gk];B[gm];W[gn]
+;B[em];W[fn];B[pj];W[hm];B[oj];W[ni];B[nj];W[mj];B[nk];W[dk]
+;B[el];W[ol];B[nl];W[om];B[pa];W[sc];B[pg];W[sd];B[eg];W[re]
+;B[ah];W[ml];B[ag];W[eh];B[ei];W[dh];B[fi];W[pm];B[qm];W[pk]
+;B[ql];W[rf];B[pf];W[rg];B[rh];W[ce];B[ae];W[cd];B[oe];W[nf]
+;B[sg];W[bh];B[ep];W[ii];B[fp];W[gp];B[qo];W[pn];B[de];W[og]
+;B[gi];W[gj];B[hh];W[ji];B[jh];W[bs];B[ar];W[cs];B[di];W[bi]
+;B[ai];W[bj];B[ak];W[bk];B[en];W[eo];B[cm];W[do];B[bp];W[co]
+;B[ao];W[bo];B[an];W[cp];B[bq];W[ap];B[aq];W[oi];B[df];W[ki]
+;B[bn];W[as];B[ph];W[dn];B[am];W[mk];B[qj];W[ap];B[ac];W[tt]
+;B[tt]
+)
diff --git a/regression/games/scoring/score26.sgf b/regression/games/scoring/score26.sgf
new file mode 100644 (file)
index 0000000..68b135e
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.6 gmp]HA[0]KM[5.5]GN[GNU Go 2.6 gmp Random Seed 987069868] 
+;B[pq];W[dd];B[dp];W[oc];B[cf];W[qd];B[qo];W[fc];B[bd];W[cc]
+;B[ci];W[fq];B[fp];W[gp];B[fo];W[eq];B[dq];W[jq];B[dn];W[cl]
+;B[hc];W[el];B[qj];W[kc];B[oo];W[pk];B[qk];W[pl];B[mq];W[ql]
+;B[pj];W[ib];B[qg];W[hb];B[bm];W[bl];B[bc];W[hn];B[kp];W[ho]
+;B[jp];W[kq];B[lq];W[ip];B[kr];W[iq];B[jd];W[jr];B[he];W[lr]
+;B[le];W[ml];B[fe];W[lg];B[jf];W[jh];B[ee];W[gd];B[cb];W[hd]
+;B[mr];W[ks];B[re];W[jc];B[ge];W[db];B[rd];W[bb];B[qc];W[ie]
+;B[id];W[if];B[ig];W[ic];B[je];W[cd];B[ab];W[ca];B[ce];W[pd]
+;B[pb];W[ob];B[bj];W[rb];B[qb];W[ac];B[rc];W[aa];B[km];W[be]
+;B[bf];W[ad];B[im];W[hi];B[gh];W[ii];B[ej];W[nf];B[fk];W[lj]
+;B[fm];W[ni];B[gi];W[mn];B[hm];W[md];B[cn];W[me];B[oj];W[kl]
+;B[jl];W[kk];B[oa];W[na];B[pa];W[mb];B[er];W[fr];B[dr];W[jk]
+;B[ik];W[ij];B[hk];W[lm];B[kn];W[on];B[dl];W[no];B[lo];W[qn]
+;B[np];W[ro];B[rq];W[po];B[fs];W[op];B[gr];W[is];B[oq];W[gq]
+;B[hr];W[qp];B[em];W[dk];B[dm];W[mp];B[nq];W[mo];B[lp];W[rk]
+;B[rj];W[rl];B[og];W[sj];B[si];W[sk];B[kg];W[kh];B[lf];W[mg]
+;B[ms];W[ir];B[gs];W[af];B[ls];W[hq];B[kr];W[ah];B[js];W[ch]
+;B[dh];W[cg];B[dg];W[bg];B[ck];W[of];B[bk];W[pf];B[oi];W[nk]
+;B[nh];W[mh];B[jg];W[nj];B[pp];W[ok];B[rp];W[ed];B[qq];W[qf]
+;B[rh];W[rf];B[qi];W[ld];B[hj];W[kd];B[ke];W[de];B[df];W[qe]
+;B[pg];W[hh];B[hg];W[sp];B[sq];W[so];B[ng];W[rg];B[bi];W[se]
+;B[ai];W[ag];B[qo];W[rn];B[oo];W[pn];B[op];W[sd];B[ra];W[sg]
+;B[ph];W[sc];B[sb];W[sf];B[sh];W[qp];B[bh];W[ae];B[qo];W[mf]
+;B[qp];W[pc];B[ln];W[fd];B[ih];W[ks];B[lr];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score27.sgf b/regression/games/scoring/score27.sgf
new file mode 100644 (file)
index 0000000..a6918f4
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[dp];B[pp];W[dc];B[ce];W[ed];B[ch];W[df];B[cf];W[nq]
+;B[pn];W[pr];B[qq];W[kq];B[cn];W[fp];B[qj];W[nd];B[bp];W[cq]
+;B[ck];W[kc];B[pf];W[pc];B[qc];W[oc];B[qb];W[hq];B[dg];W[hc]
+;B[he];W[em];B[ho];W[bq];B[cp];W[gd];B[gm];W[bd];B[en];W[fl]
+;B[fn];W[fj];B[mo];W[hk];B[jk];W[il];B[dm];W[ag];B[ke];W[mc]
+;B[qr];W[dl];B[cl];W[hi];B[or];W[jj];B[ij];W[ii];B[ik];W[kj]
+;B[hj];W[hl];B[mj];W[kl];B[kg];W[nr];B[oq];W[ap];B[bo];W[ef]
+;B[ps];W[mk];B[pl];W[le];B[lf];W[mm];B[lk];W[ll];B[lj];W[kk]
+;B[nk];W[ml];B[oo];W[nj];B[ni];W[li];B[mi];W[mg];B[lh];W[nf]
+;B[ki];W[og];B[oj];W[do];B[dn];W[co];B[bn];W[kn];B[pg];W[lp]
+;B[me];W[ne];B[ld];W[oh];B[fh];W[ph];B[rh];W[lc];B[dk];W[el]
+;B[ei];W[np];B[no];W[pb];B[hg];W[qa];B[ra];W[pa];B[sb];W[ip]
+;B[be];W[ae];B[cd];W[bc];B[id];W[ic];B[ns];W[go];B[hn];W[gn]
+;B[hm];W[fm];B[mr];W[lr];B[mq];W[mp];B[jr];W[jd];B[je];W[hd]
+;B[ie];W[qi];B[ri];W[qh];B[kr];W[ls];B[ms];W[qg];B[rc];W[re]
+;B[qd];W[qf];B[pe];W[ai];B[hr];W[gr];B[ir];W[ak];B[lo];W[ko]
+;B[ge];W[hs];B[rg];W[am];B[ek];W[fk];B[ej];W[om];B[nl];W[nm]
+;B[eg];W[pm];B[qm];W[gh];B[gg];W[hh];B[ff];W[fe];B[pk];W[ig]
+;B[if];W[jg];B[jf];W[jh];B[pi];W[oi];B[fi];W[gi];B[ln];W[kd]
+;B[lm];W[ci];B[di];W[bi];B[bh];W[ah];B[ol];W[cj];B[bk];W[rf]
+;B[rd];W[bm];B[sg];W[hp];B[sd];W[cc];B[mf];W[bg];B[cg];W[md]
+;B[le];W[km];B[de];W[ee];B[bj];W[aj];B[bl];W[al];B[cm];W[eo]
+;B[bf];W[af];B[ad];W[fo];B[nh];W[ng];B[lg];W[ji];B[pj];W[lq]
+;B[os];W[dd];B[an];W[ac];B[mh];W[kh];B[li];W[od];B[dj];W[ad]
+;B[sf];W[op];B[on];W[se];B[qe];W[mn];B[of];W[oe];B[nn];W[qn]
+;B[po];W[aq];B[qo];W[ao];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score28.sgf b/regression/games/scoring/score28.sgf
new file mode 100644 (file)
index 0000000..052fd2a
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[qc];W[dd];B[cq];W[qq];B[fc];W[hc];B[cc];W[dc];B[cd];W[de]
+;B[cf];W[gd];B[nc];W[ce];B[be];W[bd];B[bc];W[bf];B[ad];W[cg]
+;B[af];W[dp];B[bg];W[cp];B[dq];W[eq];B[bp];W[bo];B[bq];W[cn]
+;B[er];W[fq];B[fr];W[gq];B[df];W[fd];B[pp];W[pq];B[op];W[ro]
+;B[pm];W[qh];B[kc];W[qk];B[ql];W[pk];B[iq];W[lq];B[oq];W[ff]
+;B[lo];W[qe];B[kr];W[dh];B[cl];W[gr];B[eg];W[en];B[el];W[ei]
+;B[fg];W[ec];B[kq];W[bh];B[gf];W[dk];B[dl];W[ck];B[fe];W[nk]
+;B[gi];W[rd];B[ek];W[ci];B[dg];W[ch];B[bl];W[bj];B[lk];W[fj]
+;B[oh];W[mj];B[mh];W[li];B[rc];W[kj];B[lj];W[ej];B[mi];W[gl]
+;B[kk];W[ji];B[rf];W[qf];B[re];W[rg];B[qd];W[og];B[pg];W[ph]
+;B[of];W[om];B[ng];W[jk];B[qg];W[pn];B[qn];W[oo];B[qo];W[rn]
+;B[rh];W[ri];B[sg];W[rl];B[mp];W[hk];B[io];W[jl];B[ni];W[ll]
+;B[mk];W[nj];B[lh];W[ki];B[jg];W[cb];B[bb];W[db];B[fm];W[gn]
+;B[fn];W[gj];B[go];W[eo];B[fo];W[dm];B[do];W[jd];B[jc];W[ie]
+;B[hg];W[hn];B[ho];W[pi];B[ib];W[hi];B[hb];W[fb];B[gh];W[qp]
+;B[po];W[on];B[in];W[or];B[nr];W[os];B[kd];W[ke];B[le];W[ic]
+;B[kf];W[je];B[hr];W[hm];B[im];W[pl];B[gs];W[qm];B[lr];W[ee]
+;B[ef];W[ns];B[nq];W[ge];B[kn];W[ml];B[no];W[mn];B[il];W[ih]
+;B[ig];W[ba];B[ms];W[qs];B[kh];W[ab];B[ac];W[bk];B[oi];W[al]
+;B[am];W[ak];B[bn];W[oj];B[nn];W[nm];B[gb];W[mo];B[gc];W[ea]
+;B[np];W[fk];B[ga];W[ff];B[si];W[hf];B[fe];W[sj];B[fa];W[id]
+;B[ah];W[eb];B[ca];W[ff];B[aa];W[gg];B[eh];W[rj];B[hh];W[ai]
+;B[fi];W[gf];B[jh];W[ii];B[ln];W[mm];B[jm];W[ik];B[km];W[kl]
+;B[ag];W[sh];B[rg];W[qi];B[si];W[hl];B[sh];W[if];B[lm];W[da]
+;B[ba];W[fl];B[ao];W[em];B[bm];W[cm];B[co];W[jf];B[ep];W[gm]
+;B[fp];W[tt];B[lf];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score29.sgf b/regression/games/scoring/score29.sgf
new file mode 100644 (file)
index 0000000..c015dff
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[oc];W[dp];B[pp];W[cd];B[qd];W[ec];B[fq];W[dn];B[dr];W[hq]
+;B[cq];W[eq];B[er];W[fp];B[gp];W[gq];B[fr];W[go];B[qj];W[hp]
+;B[ci];W[np];B[pn];W[pq];B[qq];W[oq];B[qr];W[jc];B[cl];W[je]
+;B[fd];W[mc];B[fc];W[cg];B[eb];W[kp];B[kn];W[bi];B[bh];W[ch]
+;B[bj];W[hd];B[bn];W[gb];B[fb];W[di];B[cj];W[bg];B[ai];W[dj]
+;B[el];W[nb];B[dc];W[cc];B[ed];W[pb];B[jg];W[rc];B[ob];W[pc]
+;B[oa];W[pd];B[nd];W[qe];B[qg];W[kf];B[mf];W[jo];B[cp];W[lg]
+;B[ki];W[rf];B[ef];W[md];B[od];W[oe];B[ne];W[pg];B[qh];W[ng]
+;B[of];W[pf];B[og];W[oh];B[nf];W[mg];B[ph];W[pa];B[oi];W[nh]
+;B[pe];W[qf];B[ol];W[si];B[sj];W[ri];B[rj];W[rg];B[rh];W[eg]
+;B[sh];W[df];B[ff];W[gc];B[ge];W[pr];B[fg];W[gr];B[eh];W[dh]
+;B[mn];W[lp];B[hi];W[qs];B[rs];W[ps];B[sr];W[de];B[lk];W[fj]
+;B[ee];W[fh];B[ei];W[gh];B[dg];W[dk];B[dl];W[eg];B[ik];W[dg]
+;B[gk];W[gm];B[fl];W[im];B[jl];W[cb];B[en];W[eo];B[fn];W[fm]
+;B[em];W[co];B[bo];W[hl];B[hk];W[fo];B[hf];W[gg];B[ag];W[bf]
+;B[ga];W[ha];B[fa];W[ib];B[ni];W[li];B[mj];W[kh];B[lj];W[ji]
+;B[kj];W[jh];B[ig];W[af];B[hh];W[hg];B[ih];W[if];B[gi];W[fi]
+;B[ck];W[gj];B[ii];W[hj];B[ij];W[he];B[gf];W[mi];B[kg];W[lf]
+;B[lh];W[mh];B[jn];W[in];B[jj];W[lh];B[jm];W[dq];B[db];W[fs]
+;B[ca];W[ba];B[da];W[bb];B[cm];W[es];B[cr];W[jf];B[gn];W[ek]
+;B[hn];W[il];B[ho];W[io];B[ds];W[gs];B[sg];W[rd];B[na];W[ma]
+;B[mb];W[lb];B[sf];W[oe];B[se];W[nn];B[mm];W[nm];B[nl];W[oo]
+;B[po];W[om];B[pm];W[mo];B[sd];W[ah];B[bi];W[sc];B[ag];W[rq]
+;B[rr];W[ko];B[ro];W[ln];B[lm];W[no];B[lo];W[sq];B[qp];W[ln]
+;B[ah];W[lo];B[cn];W[do];B[op];W[dm];B[nq];W[nr];B[mq];W[mr]
+;B[fk];W[ej];B[gl];W[hm];B[re];W[qc];B[dd];W[pe];B[gd];W[on]
+;B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score3.sgf b/regression/games/scoring/score3.sgf
new file mode 100644 (file)
index 0000000..cbfcd31
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pe];W[pd];B[cp];W[qq];B[dd];W[od];B[ep];W[fc];B[hc];W[fe]
+;B[df];W[ck];B[kc];W[ek];B[pp];W[qp];B[po];W[or];B[mp];W[iq]
+;B[nf];W[ch];B[bg];W[fg];B[qj];W[cn];B[gk];W[gq];B[fr];W[fq]
+;B[eq];W[md];B[mb];W[nb];B[qo];W[go];B[fl];W[qm];B[rl];W[db]
+;B[rm];W[cc];B[cd];W[pl];B[bc];W[bb];B[oj];W[ee];B[dh];W[nl]
+;B[bd];W[on];B[cg];W[gr];B[er];W[lq];B[fi];W[mq];B[ll];W[qd]
+;B[mk];W[rf];B[of];W[hb];B[gb];W[hd];B[gc];W[hf];B[ca];W[cb]
+;B[ke];W[en];B[fn];W[bo];B[fo];W[bq];B[ib];W[ci];B[lb];W[ro]
+;B[rn];W[cr];B[rp];W[rq];B[so];W[np];B[bp];W[ap];B[mo];W[oo]
+;B[hh];W[gd];B[jg];W[jn];B[ko];W[hn];B[ln];W[fk];B[gl];W[gj]
+;B[gh];W[el];B[fj];W[jq];B[hj];W[mf];B[mg];W[lf];B[lg];W[kf]
+;B[jf];W[rh];B[qn];W[do];B[cq];W[br];B[pm];W[om];B[ql];W[ik]
+;B[pk];W[ol];B[kg];W[jl];B[me];W[ne];B[le];W[bh];B[ei];W[rj]
+;B[dj];W[di];B[bf];W[eh];B[ej];W[dg];B[id];W[ec];B[qe];W[ac]
+;B[re];W[qi];B[nc];W[nd];B[mc];W[pb];B[ld];W[sf];B[ob];W[oa]
+;B[oc];W[rd];B[se];W[rb];B[na];W[pa];B[rk];W[pc];B[sj];W[dp]
+;B[dq];W[jo];B[ri];W[kp];B[qh];W[km];B[lm];W[kk];B[qg];W[ji]
+;B[jh];W[lj];B[nj];W[mi];B[ki];W[ii];B[hg];W[kj];B[rg];W[ie]
+;B[jd];W[pn];B[pq];W[pr];B[fb];W[li];B[kh];W[if];B[sq];W[dr]
+;B[nh];W[fp];B[eo];W[gn];B[em];W[dm];B[dn];W[cm];B[co];W[dk]
+;B[gs];W[hs];B[fs];W[eb];B[rr];W[qr];B[gm];W[rs];B[sr];W[gg]
+;B[ni];W[cj];B[lp];W[fh];B[gi];W[ij];B[fa];W[oq];B[ea];W[da]
+;B[op];W[no];B[nn];W[kn];B[nm];W[lo];B[mn];W[ml];B[lk];W[kq]
+;B[ds];W[hm];B[hl];W[il];B[sd];W[sc];B[cs];W[ao];B[aq];W[am]
+;B[bs];W[ar];B[ko];W[mj];B[nk];W[lo];B[qm];W[ko];B[mm];W[kl]
+;B[mh];W[je];B[oe];W[ig];B[ih];W[lh];B[hi];W[hk];B[ok];W[nq]
+;B[es];W[aq];B[as];W[qs];B[sp];W[ss];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score30.sgf b/regression/games/scoring/score30.sgf
new file mode 100644 (file)
index 0000000..56fcdc7
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pc];W[dp];B[pp];W[pe];B[cd];W[qc];B[qb];W[qd];B[ed];W[nq]
+;B[pn];W[pr];B[lq];W[qq];B[fq];W[hq];B[cq];W[dq];B[cp];W[do]
+;B[dr];W[er];B[cr];W[eq];B[cn];W[fp];B[ob];W[qi];B[nd];W[ci]
+;B[oq];W[or];B[np];W[mp];B[mq];W[nr];B[mo];W[ql];B[lp];W[gc]
+;B[fb];W[cf];B[ic];W[lc];B[rc];W[le];B[nf];W[lg];B[gb];W[cl]
+;B[co];W[ge];B[og];W[qg];B[gg];W[rn];B[dn];W[ig];B[hf];W[bm]
+;B[ie];W[kf];B[bf];W[be];B[ce];W[bg];B[df];W[cg];B[bd];W[af]
+;B[hi];W[ad];B[bc];W[rd];B[rb];W[jq];B[jo];W[ji];B[ei];W[io]
+;B[in];W[ap];B[ho];W[ip];B[fn];W[jn];B[im];W[ko];B[mr];W[eh]
+;B[jm];W[kn];B[mm];W[hd];B[id];W[ff];B[km];W[ef];B[dg];W[eg]
+;B[de];W[dh];B[ln];W[fi];B[ej];W[fj];B[ek];W[fk];B[ck];W[el]
+;B[bk];W[dl];B[dk];W[fm];B[fh];W[en];B[ah];W[ds];B[gn];W[eo]
+;B[hk];W[oh];B[nh];W[jk];B[oi];W[hj];B[ph];W[hh];B[gi];W[gj]
+;B[gh];W[hg];B[gf];W[he];B[fe];W[ii];B[if];W[jf];B[li];W[lj]
+;B[hl];W[mi];B[kr];W[jr];B[pl];W[pk];B[ol];W[jb];B[ok];W[pj]
+;B[oj];W[mb];B[la];W[nb];B[ib];W[ja];B[qm];W[rm];B[mk];W[od]
+;B[nc];W[oc];B[oe];W[pd];B[pb];W[oa];B[js];W[is];B[ks];W[pq]
+;B[op];W[qp];B[pf];W[qf];B[qo];W[ro];B[qn];W[ia];B[lk];W[mj]
+;B[nj];W[bn];B[kj];W[ki];B[kk];W[jj];B[jl];W[pg];B[ha];W[bh]
+;B[ai];W[ae];B[mh];W[lh];B[gm];W[ac];B[bb];W[ik];B[ns];W[kp]
+;B[os];W[ps];B[ms];W[gp];B[pi];W[qh];B[qk];W[qj];B[rl];W[rj]
+;B[sm];W[jc];B[sn];W[sp];B[go];W[ab];B[mg];W[ba];B[cb];W[ca]
+;B[da];W[dj];B[bi];W[bj];B[ak];W[cj];B[aa];W[ba];B[lo];W[of]
+;B[ne];W[md];B[gl];W[me];B[mf];W[pf];B[rk];W[sj];B[sl];W[so]
+;B[rq];W[rr];B[ee];W[aj];B[fo];W[fl];B[lf];W[hp];B[fg];W[mc]
+;B[kq];W[jp];B[il];W[aa];B[gk];W[ca];B[ni];W[li];B[jd];W[kd]
+;B[je];W[db];B[ea];W[ke];B[hb];W[sk];B[ql];W[tt];B[gd];W[tt]
+;B[hc];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score31.sgf b/regression/games/scoring/score31.sgf
new file mode 100644 (file)
index 0000000..78cbbb1
--- /dev/null
@@ -0,0 +1,39 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-22]AP[gnugoclient:2.0]
+RE[B+90.5]
+;B[pd];W[dc];B[qp];W[dq];B[oq];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc]
+;W[nb];B[mc];W[rd];B[re];W[rc];B[qf];W[co];B[qk];W[ce];B[jp];W[oo]
+;B[mp];W[om];B[ok];W[hq];B[ir];W[mm];B[mk];W[hc];B[kl];W[jd];B[cj]
+;W[kf];B[mf];W[lh];B[nh];W[ch];B[cm];W[ei];B[hi];W[if];B[gg];W[hh]
+;B[gh];W[qm];B[rl];W[km];B[jm];W[gj];B[gi];W[hj];B[ii];W[jh];B[ij]
+;W[ll];B[kk];W[kn];B[jn];W[lk];B[lj];W[ko];B[jo];W[ro];B[rp];W[mo]
+;B[np];W[fj];B[no];W[mn];B[nn];W[nm];B[qo];W[kp];B[jq];W[pm];B[ki]
+;W[rm];B[em];W[qn];B[sn];W[lp];B[ml];W[lr];B[kq];W[eg]C[L:5];B[ge]
+;W[fd]C[L:6];B[ef];W[fq]C[L:7];B[dg];W[gm]C[L:5];B[dh];W[cg]C[L:4]
+;B[di];W[fn];B[do];W[dn];B[cn];W[en]C[L:5];B[bo];W[cp]C[L:6];B[de]
+;W[cd]C[L:7];B[kb];W[ig]C[L:3];B[ib];W[he]C[L:4];B[gd];W[kh]C[L:3]
+;B[gc];W[ic]C[L:4];B[hd];W[je]C[L:2];B[lg];W[id]C[L:3];B[hf];W[hb]
+C[L:4];B[jb];W[gb]C[L:5];B[fc];W[fb]C[L:6];B[ec];W[eb]C[L:7];B[cf]
+;W[bf]C[L:8];B[df];W[bp]C[L:9];B[bn];W[dm]C[L:10];B[dd];W[cc]C[L:7]
+;B[dl];W[bi]C[L:8];B[bj];W[lq]C[L:9];B[nr];W[hr];B[hs];W[gs];B[is]
+;W[gr];B[el];W[hg];B[gf];W[mi]C[L:10];B[ni];W[mb];B[lc];W[le];B[me]
+;W[eh];B[mj];W[aj];B[ak];W[ai];B[bl];W[ao];B[ho];W[li];B[gl];W[hl]
+;B[hm];W[fl];B[fm];W[gn];B[fk];W[hn];B[im];W[go];B[hp];W[gp];B[iq]
+;W[ji];B[jj];W[kg];B[lf];W[ld];B[md];W[kc];B[lb];W[ma];B[ia];W[ci]
+;B[an];W[ap];B[ha];W[dj];B[dk];W[ej];B[kj];W[jc];B[mh];W[io];B[ip]
+;W[in];B[ga];W[se];B[oj];W[sg];B[rh];W[sh];B[ri];W[rg];B[qg];W[si]
+;B[sj];W[sf];B[rf];W[sd];B[rj];W[la];B[ka];W[fa];B[ih];W[ie];B[];W[]
+C[final_score: B+88.5
+F16 removed
+E13 removed
+M9 removed
+H8 removed
+L7 removed
+N7 removed
+D5 removed
+P5 removed
+S5 removed]
+)
diff --git a/regression/games/scoring/score32.sgf b/regression/games/scoring/score32.sgf
new file mode 100644 (file)
index 0000000..cd3fee2
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-22]AP[gnugoclient:2.0]
+RE[B+75.5]
+;B[pd];W[dp];B[qp];W[dc];B[oq];W[qk];B[qi];W[qc];B[qd];W[pc];B[oc]
+;W[ob];B[nc];W[nb];B[mc];W[rd];B[re];W[rc];B[pl];W[ce];B[hc];W[pj]
+;B[pi];W[oj];B[oi];W[mj];B[nl];W[ni];B[jp];W[ql];B[nk];W[mh];B[nj]
+;W[kh];B[qm];W[rj];B[rm];W[hq];B[ir];W[dj];B[cn];W[co];B[dn];W[fp]
+;B[ck];W[cj];B[fn];W[bk];B[cl];W[ho];B[bl];W[bj];B[ec];W[eb];B[fc]
+;W[bn];B[bm];W[bo];B[dd];W[cc];B[cd];W[le];B[bc];W[bb];B[be];W[fb]
+;B[gb];W[ac];B[bd];W[cb];B[dg];W[fj];B[ek];W[gm];B[ej];W[ei];B[fi]
+;W[fh];B[gi];W[gk]C[L:5];B[eh];W[rh]C[L:1];B[qg];W[rg]C[L:0];B[rf]
+;W[gg];B[di];W[jn];B[ko];W[lm];B[mn];W[hr];B[is];W[ii];B[hs];W[fr]
+;B[gj];W[fk];B[hk];W[hj]C[L:1];B[hi];W[ig]C[L:2];B[ij];W[kc]C[L:3]
+;B[nh];W[mi]C[L:4];B[ng];W[mb]C[L:3];B[lc];W[kd]C[L:4];B[lb];W[mk]
+C[L:3];B[gn];W[im]C[L:4];B[hn];W[io]C[L:3];B[jo];W[in]C[L:4];B[hm]
+;W[ji]C[L:5];B[jj];W[kj]C[L:6];B[jl];W[id]C[L:7];B[km];W[mm]C[L:8]
+;B[nm];W[gd]C[L:9];B[hd];W[he]C[L:6];B[gc];W[fe]C[L:7];B[ee];W[ln]
+C[L:8];B[lo];W[gs]C[L:9];B[iq];W[mo]C[L:10];B[nn];W[kn];B[mp];W[il]
+;B[hl];W[jk]C[L:9];B[mg];W[ik];B[hj];W[fg]C[L:7];B[ef];W[lg]C[L:8]
+;B[jb];W[kb]C[L:9];B[ka];W[ma]C[L:10];B[me];W[la];B[ja];W[ib];B[ic]
+;W[jc]C[L:9];B[ld];W[ke]C[L:10];B[fa];W[ea];B[ga];W[ab];B[sd];W[sc]
+;B[se];W[fd];B[ed];W[ff];B[eg];W[mf];B[nf];W[lf];B[ne];W[eo];B[en]
+;W[hh];B[ip];W[hp];B[go];W[gp];B[ml];W[ll];B[do];W[fo];B[an];W[cq]
+;B[ao];W[ap];B[am];W[bp];B[ad];W[hb];B[ha];W[ia];B[gh];W[ie];B[ri]
+;W[]
+C[final_score: B+74.5
+C15 removed
+S13 removed
+B10 removed
+F10 removed
+P10 removed
+S10 removed
+R9 removed
+K8 removed
+G7 removed
+L7 removed
+N5 removed]
+)
diff --git a/regression/games/scoring/score33.sgf b/regression/games/scoring/score33.sgf
new file mode 100644 (file)
index 0000000..82387ff
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-23]AP[gnugoclient:2.0]
+RE[B+33.5]
+;B[pd];W[dp];B[pp];W[dc];B[pj];W[nc];B[nd];W[md];B[ne];W[oc];B[pc]
+;W[jc];B[jp];W[pn];B[oo];W[nq];B[mp];W[pr];B[qq];W[ce];B[ic];W[ib]
+;B[jd];W[kc];B[kd];W[id];B[hc];W[ie];B[hb];W[le];B[jb];W[kb];B[ia]
+;W[lf];B[ec];W[eb]C[L:9];B[fc];W[mq]C[L:7];B[lq];W[ql]C[L:6];B[rk]
+;W[lr]C[L:5];B[kq];W[kr]C[L:6];B[jr];W[qr];B[ol];W[lh];B[pf];W[di]
+C[L:7];B[dg];W[cg];B[dd];W[cc];B[cd];W[ch]C[L:5];B[bc];W[bb];B[be]
+;W[ac];B[bd];W[fb]C[L:6];B[gb];W[ab];B[fa];W[da]C[L:7];B[aa];W[cm]
+C[L:8
+L:9];B[eq];W[dq]C[L:8];B[ep];W[bf]C[L:9];B[de];W[eo];B[fo]
+;W[lj];B[en];W[do];B[dn];W[cn]C[L:8];B[fn];W[ll]C[L:9];B[er];W[cf]
+C[L:10];B[gf];W[dr];B[ds];W[cs];B[es];W[oi];B[pi];W[rl]C[L:7];B[ro]
+;W[br]C[L:5];B[if];W[jf]C[L:6];B[ig];W[ln]C[L:7];B[on];W[im]C[L:6]
+;B[hn];W[np]C[L:7];B[oh];W[mo];B[jg];W[he];B[ge];W[je];B[ki];W[rq]
+;B[rp];W[rr];B[li];W[ik]C[L:5];B[mj];W[mk]C[L:6];B[kj];W[lk]C[L:7]
+;B[nj];W[fl]C[L:8];B[el];W[dk]C[L:9];B[dl];W[cl]C[L:10];B[ek];W[ej]
+;B[fi];W[fj];B[gi];W[gj];B[mh];W[ob]C[L:8];B[pb];W[mg]C[L:9];B[ng]
+;W[eh]C[L:8];B[fg];W[eg]C[L:9];B[ef];W[pa]C[L:7];B[qa];W[oa]C[L:8]
+;B[qb];W[ka]C[L:9];B[kh];W[lg]C[L:10];B[ij];W[df];B[jk];W[hl];B[hk]
+;W[il]C[L:9];B[hj];W[gk];B[in];W[jm]C[L:10];B[lp];W[no];B[op];W[hd]
+;B[gd];W[nm];B[om];W[fh];B[gh];W[hf];B[hg];W[kg];B[nl];W[mm];B[jn]
+;W[me];B[ks];W[ms];B[od];W[ei];B[kn];W[km];B[lo];W[ja];B[ib];W[pq]
+;B[qp];W[nn];B[oq];W[or];B[ga];W[db];B[nk];W[dm];B[em];W[sp];B[so]
+;W[sq];B[gm];W[gl];B[nf];W[ml];B[kk];W[af];B[ee];W[kl];B[ae];W[ls]
+;B[js];W[fm];B[hm];W[ad];B[ba];W[ca];B[mf];W[ke];B[ea];W[jl];B[fk]
+;W[]
+C[final_score: B+32.5
+K16 removed
+D13 removed
+P11 removed
+R8 removed
+Q6 removed]
+)
diff --git a/regression/games/scoring/score34.sgf b/regression/games/scoring/score34.sgf
new file mode 100644 (file)
index 0000000..d011766
--- /dev/null
@@ -0,0 +1,48 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[TanGo7183]BR[NR]
+PC[NNGS]DT[2002-03-11]AP[gnugoclient:2.0]
+RE[B+122.5]
+;B[pd];W[dp];B[dd];W[pp];B[jd];W[jp];B[cn];W[fc];B[df];W[nc];B[pf]
+;W[cl];B[en];W[fp];B[ci];W[gn];B[el];W[dk];B[ek];W[bj];B[dj];W[am]
+;B[bm];W[bi];B[ch];W[pb]C[L:7];B[qc];W[qh]C[L:8];B[lc];W[qb]C[L:7]
+;B[qg];W[ph]C[L:5];B[rb];W[ne]C[L:6];B[nf];W[pc]C[L:4];B[qd];W[pl]
+C[L:5];B[nq];W[oq];B[np];W[pn]C[L:6];B[kq];W[jq]C[L:5];B[kp];W[db]
+C[L:4];B[cc];W[hc];B[ib];W[bo]C[L:3];B[bl];W[ko];B[lo];W[nr]C[L:4]
+;B[mr];W[or];B[cb];W[gf]C[L:2];B[if];W[gh]C[L:1];B[od];W[gj];B[gl]
+;W[bn];B[cm];W[da];B[gd];W[hb];B[ec];W[eb];B[gc];W[fb]C[L:0];B[fd]
+;W[hd]C[L:1];B[he];W[jc]C[L:2];B[ic];W[nd]C[L:0];B[le];W[ji]C[L:1]
+;B[il];W[li]C[L:2];B[ni];W[kg]C[L:3];B[jf];W[ei]C[L:4];B[eq];W[hg]
+C[L:5];B[ep];W[bq]C[L:3];B[cr];W[oj]C[L:4];B[nj];W[fq]C[L:5];B[fr]
+;W[gr];B[er];W[br]C[L:4];B[bs];W[cq];B[dq];W[hq]C[L:3];B[do];W[ok]
+C[L:4];B[qo];W[qp]C[L:3];B[rg];W[mb]C[L:2];B[lb];W[on]C[L:3];B[kn]
+;W[rh]C[L:4];B[sh];W[si]C[L:5];B[sg];W[jo]C[L:6];B[ln];W[rj]C[L:7]
+;B[mf];W[kr];B[lr];W[jr];B[kl];W[jn]C[L:8];B[jm];W[id]C[L:9];B[jb]
+;W[eg]C[L:7];B[dg];W[fo];B[eo];W[in];B[ef];W[eh]C[L:5];B[ij];W[nh]
+C[L:6];B[mh];W[oi]C[L:7];B[hi];W[mi]C[L:4];B[ng];W[gi]C[L:5];B[mk]
+;W[hh]C[L:6];B[ii];W[fg];B[ih];W[lh]C[L:7];B[oh];W[mm]C[L:8];B[pg]
+;W[nk]C[L:9];B[mj];W[fj]C[L:10];B[ff];W[hf];B[ge];W[hm];B[hl];W[ig]
+;B[jg];W[fs];B[es];W[gs];B[ml];W[nl];B[lm];W[mn];B[mo];W[fk];B[fl]
+;W[gm];B[oo];W[po];B[fm];W[nn];B[ns];W[os];B[ms];W[ks];B[op];W[fn]
+;B[hj];W[gk];B[hk];W[ej];B[di];W[im]C[L:9];B[no];W[ls]C[L:10];B[lq]
+;W[dh];B[];W[]
+C[final_score: B+120.5
+D19 removed
+H18 removed
+N18 removed
+Q18 removed
+K17 removed
+O17 removed
+L13 removed
+M12 removed
+B11 removed
+K11 removed
+D9 removed
+C8 removed
+A7 removed
+B6 removed
+R5 removed
+D4 removed
+B3 removed]
+)
diff --git a/regression/games/scoring/score35.sgf b/regression/games/scoring/score35.sgf
new file mode 100644 (file)
index 0000000..5726e65
--- /dev/null
@@ -0,0 +1,41 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[Yuuki]BR[20k]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+94.5]
+;B[pc];W[pp];B[cd];W[dp];B[fd];W[hc];B[gc];W[hd];B[kc];W[qe];B[oe]
+;W[pg];B[je];W[qj];B[gf];W[dl];B[dj];W[fk];B[gq];W[eq];B[mq];W[oq]
+;B[jp];W[ck];B[cj];W[dg];B[fh];W[ng];B[qn];W[on];B[rp];W[ne];B[nf]
+;W[of];B[nd];W[mf];B[md];W[gd];B[fc];W[bk];B[bj];W[go];B[ak];W[al]
+;B[aj];W[bm];B[dk];W[jg];B[hf];W[gp];B[hq];W[rc];B[bo];W[bq];B[cl]
+;W[bl];B[cm];W[cn];B[dm];W[bn];B[dn];W[co];B[el];W[hk];B[lk];W[eo]
+;B[mn];W[od];B[oc];W[pd];B[qq];W[ql];B[pm];W[mr];B[lr];W[or];B[no]
+;W[po];B[om];W[nj];B[nl];W[fr];B[gr];W[im];B[pk];W[gm];B[pj];W[pi]
+;B[qk];W[rk];B[rj];W[qi];B[rl];W[ri];B[ei];W[sk];B[sl];W[sj];B[qm]
+;W[nq];B[mp];W[qb];B[pb];W[qc];B[fq];W[pa];B[na];W[nc];B[mc];W[nb]
+;B[mb];W[ob];B[km];W[er];B[ih];W[jn];B[kn];W[jo];B[ko];W[jk];B[io]
+;W[in];B[ho];W[hp];B[ip];W[kg];B[li];W[ke];B[kd];W[jd];B[ie];W[lf]
+;B[me];W[mi];B[lh];W[ji];B[mj];W[jh];B[ni];W[ig];B[hh];W[oi]C[L:6]
+;B[nh];W[oh]C[L:1];B[mh];W[oj]C[L:2];B[ok];W[nf]C[L:3];B[le];W[kf]
+C[L:4];B[hn];W[fm]C[L:5];B[ij];W[ik]C[L:6];B[jm];W[jl]C[L:7];B[hm]
+;W[hj]C[L:8];B[il];W[ii]C[L:9];B[gn];W[fn]C[L:10];B[fp];W[fo];B[do]
+;W[ep];B[bp];W[cp];B[kj];W[gs];B[ir];W[hs];B[is];W[hl];B[im];W[jj]
+;B[nk];W[fl];B[gi];W[fj];B[gj];W[gg];B[hg];W[jc];B[jb];W[gk];B[hr]
+;W[fs];B[ek];W[kl];B[ll];W[em];B[fg];W[oa];B[ma];W[en];B[dl];W[fi]
+;B[hi];W[eh];B[dh];W[ej];B[di];W[kk];B[ki];W[kh];B[if];W[jf];B[]
+;W[mg];B[];W[lg];B[];W[]
+C[final_score: B+93.5
+H17 removed
+K17 removed
+P15 removed
+D13 removed
+G13 removed
+E12 removed
+R8 removed
+P6 removed
+B5 removed
+Q5 removed
+O3 removed
+N2 removed]
+)
diff --git a/regression/games/scoring/score36.sgf b/regression/games/scoring/score36.sgf
new file mode 100644 (file)
index 0000000..2759de6
--- /dev/null
@@ -0,0 +1,38 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[guestn]BR[NR]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+48.5]
+;B[pd];W[dc];B[qp];W[eq];B[oq];W[qc];B[qd];W[pc];B[od];W[mb];B[pi]
+;W[cp];B[dm];W[de];B[di];W[md];B[lc];W[mf];B[nc];W[nb];B[mc];W[jq]
+;B[lp];W[ic];B[id];W[ng];B[pg];W[ni];B[ok];W[jo];B[mk];W[ln];B[nn]
+;W[eo];B[hc];W[gn];B[li];W[cl];B[dl];W[cm];B[ck];W[bk];B[cj];W[bj]
+;B[bi];W[lq];B[mp];W[fd];B[hd];W[ff];B[kp];W[jp];B[kn];W[fi];B[fk]
+;W[hk];B[fm];W[km];B[jn];W[lj];B[mj];W[in];B[ko];W[kk];B[mi];W[kf]
+;B[if];W[mh];B[lh];W[ib];B[jg];W[lg];B[le];W[kh];B[kg];W[kb];B[lb]
+;W[hb];B[lf];W[kq];B[ob];W[pb];B[na];W[rb];B[rd];W[qa];B[rc];W[sc]
+;B[sd];W[oc];B[ma];W[sb];B[ii];W[pa];B[jk];W[jl];B[ik];W[jj];B[ij]
+;W[il]C[L:5];B[fn];W[fo];B[cn];W[bn]C[L:6];B[dn];W[bm]C[L:7];B[cf]
+;W[ce]C[L:8];B[bf];W[be]C[L:9];B[ae];W[ad]C[L:7];B[af];W[bc]C[L:8]
+;B[gc];W[mm]C[L:9];B[nm];W[ki]C[L:10];B[gm];W[hm]C[L:6];B[ji];W[nr]
+;B[or];W[os]C[L:7];B[ps];W[ns]C[L:8];B[qr];W[kj]C[L:9];B[nq];W[ld]
+C[L:6];B[ke];W[nd];B[kd];W[mr]C[L:7];B[mq];W[ls]C[L:8];B[kc];W[gb]
+C[L:9];B[fc];W[fb]C[L:6];B[ec];W[eb]C[L:7];B[ed];W[ee]C[L:8];B[dd]
+;W[cd]C[L:9];B[fh];W[gh]C[L:8];B[eh];W[gj]C[L:9];B[ll];W[kl];B[lm]
+;W[ml]C[L:6];B[lk];W[nk];B[mg];W[nj]C[L:4];B[lg];W[ka]C[L:5];B[ej]
+;W[ai]C[L:6];B[ah];W[aj]C[L:7];B[ch];W[al]C[L:8];B[co];W[bo]C[L:9]
+;B[gk];W[hj]C[L:10];B[gl];W[hl];B[eg];W[jc];B[jd];W[oa];B[gf];W[ge]
+;B[gg];W[hh];B[he];W[hi];B[jh];W[fg];B[ef];W[fe];B[df];W[hg];B[hf]
+;W[nb];B[do];W[dp];B[jm];W[en];B[em];W[fj];B[ei];W[im];B[ig];W[la]
+;B[mb];W[ob];B[ih];W[gd];B[];W[]
+C[final_score: B+47.5
+M16 removed
+L14 removed
+N14 removed
+O13 removed
+N12 removed
+O11 removed
+N8 removed
+M6 removed]
+)
diff --git a/regression/games/scoring/score37.sgf b/regression/games/scoring/score37.sgf
new file mode 100644 (file)
index 0000000..2eebf61
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[wingjk]BR[13k*]
+PC[NNGS]DT[2002-03-07]AP[gnugoclient:2.0]
+RE[B+3.5]
+;B[pp];W[cd];B[pc];W[dq];B[pe];W[qg];B[qf];W[pg];B[qj];W[pn];B[qm]
+;W[do];B[np];W[nn];B[ed];W[ec];B[fc];W[dc];B[fd];W[cf];B[jd];W[ng]
+;B[ne];W[lq];B[mq];W[lp];B[ck];W[hp];B[cn];W[co];B[ch];W[qq];B[qp]
+;W[pq];B[oq];W[rp];B[ro];W[or];B[nr];W[ps];B[rq];W[rr];B[sp];W[sr]
+;B[qs];W[qr];B[os];W[ns];B[ms];W[rs];B[os];W[pr];B[lr];W[dn];B[dm]
+;W[em];B[dl];W[fk];B[bn];W[jq];B[om];W[lf];B[mf];W[lg]C[L:7];B[mg]
+;W[ld]C[L:5];B[le];W[ke];B[me];W[kd]C[L:3];B[kf];W[oh];B[mh];W[kg]
+C[L:4];B[jf];W[je]C[L:5];B[jg];W[id];B[jh];W[jc]C[L:6];B[ff];W[bo]
+C[L:7];B[el];W[hk]C[L:8];B[fm];W[en]C[L:9];B[fl];W[gj];B[go];W[jk]
+C[L:10];B[mj];W[oj]C[L:9];B[nk];W[ri]C[L:8];B[rg];W[jm]C[L:6];B[hm]
+;W[rj]C[L:7];B[qh];W[rh]C[L:4];B[rf];W[qk];B[pk];W[pj]C[L:3];B[rk]
+;W[gp]C[L:4];B[ql];W[qi];B[qk];W[ph]C[L:5];B[oi];W[ni];B[nj];W[sh]
+C[L:6];B[sj];W[nh]C[L:7];B[mo];W[an]C[L:8];B[bm];W[mm]C[L:9];B[on]
+;W[lm]C[L:8];B[lo];W[am]C[L:9];B[bl];W[nc]C[L:10];B[md];W[mc];B[od]
+;W[ob];B[pb];W[bg];B[bh];W[pa];B[qa];W[oa];B[qb];W[hb];B[hf];W[fb]
+;B[cg];W[bf];B[al];W[fh];B[gl];W[hi];B[il];W[ij]C[L:9];B[ir];W[jr]
+C[L:8];B[iq];W[ip]C[L:7];B[kr];W[js];B[jp];W[jo];B[kp];W[kq]C[L:8]
+;B[ko];W[is];B[hr];W[gr];B[jl];W[ik];B[kl];W[io]C[L:9];B[km];W[gn]
+C[L:10];B[fn];W[fo];B[gk];W[ii]C[L:5];B[gh];W[fj];B[gi];W[gg]C[L:6]
+;B[hh];W[hg]C[L:5];B[ih];W[fg]C[L:6];B[fi];W[gf]C[L:7];B[ef];W[dg]
+C[L:8];B[if];W[ge]C[L:9];B[ei];W[he]C[L:10];B[jn];W[dh];B[di];W[ah]
+;B[bi];W[ao];B[ai];W[of];B[oe];W[in];B[im];W[hn];B[oc];W[nb];B[ks]
+;W[hs];B[mp];W[gs];B[ag];W[af];B[ie];W[sq];B[rp];W[ok];B[ol];W[pi]
+;B[df];W[eg];B[ce];W[be];B[bd];W[de];B[pf];W[dd];B[nf];W[mi];B[li]
+;W[sg];B[lj];W[sf];B[se];W[re];B[rd];W[sd];B[sc];W[rc];B[se];W[sb]
+;B[qe];W[og];B[hd];W[ah];B[ic];W[ib];B[jd];W[gd];B[kc];W[lc];B[jb]
+;W[kb];B[jc];W[ja];B[lb];W[ka];B[mb];W[la];B[hc];W[gc];B[id];W[ag]
+;B[nd];W[ma];B[kh];W[ns];B[mr];W[os];B[ig];W[si];B[sk];W[gm];B[hl]
+;W[eh];B[];W[]
+C[final_score: B+2.5
+T18 removed
+F17 removed
+S17 removed
+B16 removed
+D14 removed
+M14 removed
+H11 removed
+F10 removed
+M7 removed
+O6 removed
+Q6 removed
+G5 removed
+J3 removed]
+)
diff --git a/regression/games/scoring/score38.sgf b/regression/games/scoring/score38.sgf
new file mode 100644 (file)
index 0000000..568e05b
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[wingjk]BR[13k*]
+PC[NNGS]DT[2002-03-12]AP[gnugoclient:2.0]
+RE[B+8.5]
+;B[pp];W[dd];B[pd];W[dp];B[cj];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc]
+;W[nb];B[mc];W[rd];B[re];W[rc];B[qf];W[qq];B[qp];W[pq];B[oq];W[or]
+;B[nq];W[nr]C[L:8];B[mq];W[rp]C[L:9];B[ro];W[rq]C[L:10];B[qn];W[hc]
+;B[cf];W[df];B[dg];W[ef];B[ce];W[cd];B[cq];W[fd];B[dq];W[dn];B[cp]
+;W[ep];B[fq];W[go];B[pj];W[io];B[lo];W[kc];B[le];W[kn];B[fo];W[fp]
+C[L:9];B[fn];W[eq];B[er];W[hq];B[gq];W[gp];B[gr];W[mm]C[L:10];B[ln]
+;W[mk];B[lm];W[nj]C[L:7];B[ll];W[nh]C[L:5];B[nl];W[kq];B[lq];W[em]
+C[L:6];B[gm];W[fl]C[L:7];B[hl];W[co]C[L:6];B[bo];W[bn];B[bp];W[fj]
+;B[dl];W[bl];B[bk];W[ml];B[nk];W[nm]C[L:4];B[oj];W[cg]C[L:3];B[bg]
+;W[ch]C[L:1];B[bh];W[mi]C[L:2];B[oi];W[lk]C[L:3];B[kk];W[gi];B[jl]
+;W[dh]C[L:4];B[ki];W[no]C[L:3];B[oo];W[on];B[pn];W[ol];B[ok];W[pl]
+;B[pm];W[om]C[L:4];B[ql];W[mb];B[lc];W[be]C[L:5];B[bf];W[bd]C[L:6]
+;B[ci];W[cl]C[L:4];B[ck];W[af]C[L:5];B[ek];W[dm]C[L:4];B[fk];W[ig]
+C[L:5];B[kg];W[lb]C[L:6];B[gk];W[ni]C[L:4];B[gl];W[je]C[L:5];B[kd]
+;W[jd]C[L:6];B[ke];W[kp]C[L:7];B[ko];W[hr]C[L:6];B[lp];W[lr]C[L:7]
+;B[mr];W[kr]C[L:8];B[jo];W[in]C[L:9];B[jn];W[gs]C[L:10];B[fr];W[fs]
+;B[ds];W[el];B[dk];W[ms];B[im];W[ii];B[jj];W[gn];B[fm];W[jp];B[di]
+;W[eh];B[ei];W[fi];B[ij];W[jf];B[kf];W[hj];B[hk];W[jh];B[kh];W[ag]
+;B[ah];W[ae];B[de];W[ee];B[bi];W[gj];B[ji];W[jg];B[al];W[am];B[ak]
+;W[eo];B[hn];W[ho];B[hm];W[so];B[rn];W[sn];B[sm];W[sp];B[rl];W[sd]
+;B[se];W[ej];B[es];W[hs];B[ao];W[en];B[an];W[bm];B[];W[eg]C[L:9]
+;B[od];W[dj]C[L:10];B[];W[]
+C[final_score: B+7.5
+O12 removed
+M9 removed
+L6 removed
+O5 removed])
diff --git a/regression/games/scoring/score39.sgf b/regression/games/scoring/score39.sgf
new file mode 100644 (file)
index 0000000..e70e78a
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.28)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-26]AP[gnugoclient:2.0]
+RE[B+45.5]
+;B[pd];W[dp];B[qp];W[dd];B[oq];W[qj];B[ql];W[qf];B[qh];W[nc];B[oe]
+;W[qc];B[pc];W[kc];B[qd];W[pg];B[pi];W[pk];B[ni];W[ng];B[nl];W[me]
+;B[nf];W[mg];B[mf];W[lf];B[le];W[ke];B[lg];W[kf];B[lh];W[hp];B[cj]
+;W[jp];B[kq];W[jq];B[lp];W[dn];B[cf];W[fd];B[bd];W[cc];B[ef];W[gf]
+;B[bm];W[bo];B[dl];W[fm];B[kn];W[hm];B[kr];W[jr];B[js];W[is];B[ks]
+;W[hr];B[ne];W[md];B[ob];W[kl];B[lm];W[bc];B[lk];W[be];B[bf];W[nb]
+;B[ce];W[fh];B[dh];W[ih];B[jl];W[jk]C[L:8];B[kk];W[jj];B[jm];W[ej]
+;B[dj];W[ek]C[L:9];B[el];W[fl]C[L:10];B[fe];W[ge];B[ed];W[ec];B[ee]
+;W[fc];B[jh];W[jg];B[ji];W[ii];B[kj];W[il]C[L:9];B[in];W[ad]C[L:10]
+;B[ae];W[ac];B[hn];W[gn];B[ho];W[go];B[im];W[hk];B[bn];W[ao];B[em]
+;W[en];B[ei];W[fi];B[dk];W[fg];B[cn];W[co];B[na];W[ma]C[L:9];B[oa]
+;W[lb]C[L:10];B[oc];W[dm];B[nd];W[lc];B[cm];W[cd];B[be];W[ko];B[lo]
+;W[jo];B[eh];W[eg];B[dg];W[de];B[df];W[kh];B[ki];W[kg]C[L:8];B[mh]
+;W[an]C[L:9];B[am];W[io]C[L:10];B[jn];W[ff];B[kp];W[]
+C[final_score: B+43.5
+R17 removed
+M15 removed
+R14 removed
+N13 removed
+Q13 removed
+R10 removed
+Q9 removed
+L8 removed]
+)
diff --git a/regression/games/scoring/score4.sgf b/regression/games/scoring/score4.sgf
new file mode 100644 (file)
index 0000000..83e1fdd
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pc];W[dp];B[pp];W[dd];B[pe];W[nq];B[pn];W[pr];B[lq];W[qq]
+;B[fq];W[fp];B[gp];W[fo];B[dq];W[eq];B[er];W[ep];B[gr];W[cq]
+;B[dr];W[go];B[hp];W[jd];B[cf];W[df];B[dg];W[ef];B[ce];W[cd]
+;B[cj];W[fd];B[oq];W[co];B[nr];W[qp];B[np];W[ql];B[cm];W[qi]
+;B[rn];W[jc];B[gf];W[hd];B[cr];W[in];B[il];W[bq];B[md];W[br]
+;B[qo];W[rr];B[oi];W[qg];B[rf];W[qf];B[qe];W[rg];B[re];W[bn]
+;B[og];W[hf];B[hg];W[ge];B[gg];W[if];B[kf];W[kn];B[jp];W[km]
+;B[bm];W[kk];B[em];W[gm];B[gl];W[ki];B[jg];W[nj];B[ig];W[ol]
+;B[oj];W[ok];B[ni];W[mj];B[lg];W[fh];B[dh];W[rm];B[ej];W[pj]
+;B[hm];W[hn];B[fm];W[gn];B[ii];W[lo];B[gi];W[nn];B[fg];W[am]
+;B[al];W[an];B[bk];W[mb];B[cn];W[pa];B[bo];W[qb];B[fi];W[mc]
+;B[do];W[cp];B[dn];W[nd];B[of];W[me];B[ob];W[pb];B[oc];W[rc]
+;B[nb];W[be];B[bf];W[bd];B[mf];W[af];B[le];W[ld];B[ag];W[bp]
+;B[ao];W[ke];B[ae];W[ne];B[je];W[lf];B[mg];W[jf];B[kg];W[ad]
+;B[ma];W[la];B[na];W[kb];B[sg];W[sh];B[sf];W[od];B[qc];W[sd]
+;B[rh];W[qh];B[si];W[ri];B[sh];W[rp];B[mi];W[rd];B[lj];W[li]
+;B[lk];W[ml];B[kj];W[jk];B[ji];W[mk];B[jj];W[ll];B[ik];W[im]
+;B[hl];W[jl];B[rj];W[qk];B[rk];W[sm];B[ro];W[qm];B[pm];W[kp]
+;B[kq];W[jo];B[ip];W[or];B[mp];W[ns];B[mr];W[lp];B[ff];W[fe]
+;B[eg];W[mo];B[nf];W[om];B[cs];W[de];B[ms];W[os];B[bs];W[pl]
+;B[sp];W[sq];B[so];W[pq];B[mq];W[oo];B[po];W[op];B[sr];W[qj]
+;B[on];W[no];B[ap];W[le];B[rl];W[sl];B[sj];W[ar];B[nq];W[pg]
+;B[rq];W[qs];B[rs];W[ss];B[af];W[eo];B[rs];W[sq];B[as];W[pi]
+;B[rq];W[ss];B[oh];W[qd];B[pd];W[rb];B[rs];W[sq];B[aq];W[nc]
+;B[rq];W[ss];B[se];W[io];B[rs];W[sq];B[pf];W[oa];B[rq];W[ss]
+;B[oe];W[sk];B[rs];W[sq];B[ho];W[en];B[rq];W[ss];B[fn];W[ph]
+;B[rs];W[sq];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score40.sgf b/regression/games/scoring/score40.sgf
new file mode 100644 (file)
index 0000000..08fd1c4
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.28)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-27]AP[gnugoclient:2.0]
+RE[B+83.5]
+;B[pd];W[dp];B[pp];W[dd];B[pj];W[nq];B[np];W[mp];B[no];W[oq];B[pq]
+;W[jq];B[jd];W[pg];B[qe];W[ng];B[ni];W[lg];B[mf];W[nf];B[me];W[rg]
+;B[ri];W[mg];B[cf];W[li];B[fc];W[df];B[dg];W[ef];B[ce];W[lk];B[de]
+;W[cd];B[bd];W[ed];B[ee];W[fd];B[gc];W[bc];B[be];W[cb];B[cj];W[oj]
+;B[pk];W[oi];B[cn];W[fq];B[en];W[co];B[hp];W[hr];B[fp];W[eq];B[gq]
+;W[eg];B[dh];W[ne];B[nc];W[md];B[lc];W[bn];B[cm];W[le];B[fi];W[ge]
+;B[gf];W[nl];B[om];W[gr];B[jj];W[jl];B[hl];W[ji];B[ij];W[or];B[pr]
+;W[bm];B[bl];W[fa];B[fb];W[ea];B[ga];W[ig];B[hf];W[ko];B[hh];W[hn]
+;B[im];W[eo];B[fo];W[fn];B[em];W[in]C[L:8];B[gn];W[hm]C[L:9];B[gm]
+;W[il];B[hk];W[ps]C[L:10];B[qs];W[os];B[rr];W[mc];B[mb];W[he];B[nb]
+;W[hc];B[hb];W[ic]C[L:8];B[gd];W[ib]C[L:6];B[fe];W[hd];B[ie];W[if]
+C[L:7];B[jc];W[ia]C[L:8];B[da];W[eb]C[L:9];B[bp];W[bo]C[L:10];B[cq]
+;W[db];B[dr];W[br];B[bq];W[ap];B[ar];W[bs];B[er];W[fr];B[es];W[cr]
+;B[cs];W[ds];B[dq];W[cp];B[cs];W[ol];B[pl];W[ds];B[ep];W[fs]C[L:5]
+;B[cs];W[hq]C[L:6];B[as];W[gp]C[L:7];B[go];W[ip]C[L:8];B[ho];W[rh]
+C[L:9];B[qi];W[sd]C[L:10];B[rd];W[se];B[sc];W[rc];B[sf];W[si]C[L:8]
+;B[sj];W[sh]C[L:7];B[rj];W[ih]C[L:6];B[hi];W[mn];B[rf];W[nm]C[L:7]
+;B[on];W[id]C[L:8];B[ld];W[lf]C[L:9];B[je];W[jf]C[L:8];B[jb];W[ec]
+C[L:9];B[nd];W[me]C[L:10];B[oe];W[ke];B[io];W[jn];B[mo];W[mq];B[lo]
+;W[ln];B[lp];W[lq];B[kp];W[jp];B[kq];W[kr];B[jo];W[lr];B[kn];W[jm]
+;B[km];W[kl];B[lm];W[kj];B[ok];W[nj];B[ph];W[qg];B[oh];W[pf];B[nh]
+;W[nn];B[op];W[nk];B[mi];W[mj];B[ml];W[ll];B[mm];W[ja];B[kb];W[ka]
+;B[la];W[gb];B[hg];W[pi];B[qh];W[ad];B[ae];W[ac];B[mh];W[lh];B[qf]
+;W[kd];B[pe];W[kc];B[lb];W[jk];B[ik];W[gq];B[ii];W[mk];B[ko];W[of]
+;B[sg];W[og];B[pm];W[]
+C[final_score: B+82.5
+D19 removed
+G19 removed
+H18 removed
+S17 removed
+T16 removed
+D14 removed
+B7 removed
+F6 removed
+E5 removed
+A4 removed]
+)
diff --git a/regression/games/scoring/score41.sgf b/regression/games/scoring/score41.sgf
new file mode 100644 (file)
index 0000000..8bc9143
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-29]AP[gnugoclient:2.0]
+RE[B+37.5]
+;B[pd];W[dp];B[pp];W[dd];B[pj];W[dj];B[jd];W[jp];B[jj];W[pg];B[qe]
+;W[ng];B[lp];W[lg];B[md];W[gp];B[ln];W[qn];B[qo];W[pn];B[pl];W[ro]
+;B[rp];W[mj];B[kl];W[hc];B[cn];W[cl];B[en];W[he];B[cf];W[ce];B[ci]
+;W[df];B[cg];W[kq];B[lq];W[jb];B[lb];W[jg];B[cq];W[dq];B[cp];W[oi]
+;B[nk];W[kr];B[lr];W[el];B[oj];W[eh]C[L:7];B[dg];W[eg]C[L:6];B[bk]
+;W[bl];B[bj];W[rg];B[qh];W[qg];B[rh];W[cr]C[L:7];B[br];W[dr]C[L:6]
+;B[do];W[ii]C[L:7];B[ep];W[fq]C[L:6];B[be];W[bd]C[L:7];B[bf];W[hk]
+;B[il];W[kc]C[L:6];B[lc];W[kd]C[L:5];B[ad];W[ac];B[ae];W[bc]C[L:6]
+;B[kb];W[jc];B[ja];W[ia]C[L:7];B[ka];W[ls];B[ms];W[ks]C[L:8];B[mr]
+;W[ib]C[L:9];B[rf];W[sh];B[si];W[sg]C[L:10];B[qi];W[bs];B[ar];W[bn]
+C[L:8];B[bo];W[an]C[L:9];B[ao];W[al];B[ak];W[ij];B[jk];W[jn]C[L:10]
+;B[jm];W[ef];B[kn];W[in]C[L:9];B[fp];W[dm]C[L:10];B[go];W[eq]C[L:8]
+;B[gn];W[hp]C[L:9];B[dn];W[hm]C[L:10];B[gm];W[gl];B[fn];W[ko];B[lo]
+;W[hl];B[ni];W[oh];B[nj];W[li];B[mh];W[nf];B[lh];W[ki];B[ji];W[kh]
+;B[jh];W[ih];B[mg];W[nd];B[nc];W[me];B[od];W[ne];B[lf];W[ld];B[kg]
+;W[jf];B[mc];W[le];B[sf];W[cm];B[di];W[ei];B[qf];W[kf];B[lg];W[kp]
+;B[nh];W[ho];B[fl];W[fk];B[fm];W[ck];B[cj];W[dh];B[ch];W[pf];B[pe]
+;W[oe];B[ph];W[hn];B[ik];W[em];B[im];W[mf];B[bq];W[og];B[pi];W[cs]
+;B[as];W[]
+C[final_score: B+36.5
+K16 removed
+L12 removed
+N10 removed
+Q6 removed
+S5 removed]
+)
diff --git a/regression/games/scoring/score42.sgf b/regression/games/scoring/score42.sgf
new file mode 100644 (file)
index 0000000..01ce10b
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[5.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[coco]BR[14k]
+PC[NNGS]DT[2002-03-28]AP[gnugoclient:2.0]
+RE[B+145.5]
+;B[pd];W[dp];B[qp];W[dd];B[fc];W[oq];B[pn];W[lq];B[df];W[ee];B[ef]
+;W[nc];B[lc];W[qc];B[pc];W[ne];B[pf];W[qd];B[qe];W[ng];B[nb];W[pb]
+;B[ob];W[re];B[rf];W[sd];B[qb];W[rb];B[pa];W[ra];B[fe];W[ql];B[pl]
+;W[nn];B[qm];W[ec];B[fd];W[qk];B[pk];W[qj];B[oi];W[ph];B[oh];W[mf]
+C[L:5];B[pi];W[kf]C[L:6];B[cd];W[cc];B[ce];W[fb]C[L:7];B[gb];W[eb]
+;B[hc];W[rg]C[L:8];B[sf];W[qg];B[qf];W[rh];B[sb];W[rm]C[L:9];B[rn]
+;W[sl]C[L:8];B[nk];W[ld]C[L:9];B[kc];W[cl]C[L:10];B[bc];W[bb];B[cb]
+;W[ci];B[dc];W[hp];B[cq];W[dq];B[cp];W[co];B[bo];W[cn];B[bn];W[fi]
+;B[dr];W[er];B[cr];W[fq];B[kl];W[bm];B[dm];W[cm];B[kn];W[el];B[kp]
+;W[kq];B[jp];W[jq];B[ip];W[iq];B[ho];W[of];B[pg];W[qh];B[gp];W[qi]
+;B[hq];W[rk];B[pr];W[hr];B[or];W[gq];B[fn];W[en];B[eo];W[fm];B[do]
+;W[fo];B[fp];W[dn];B[go];W[oo];B[nq];W[og];B[mp];W[eq];B[gm];W[gl]
+;B[hl];W[gk];B[hk];W[li];B[hi];W[lp];B[lo];W[mo];B[mn];W[cg];B[bf]
+;W[bg];B[ag];W[ah];B[af];W[ji];B[mr];W[lr];B[bh];W[ch];B[ai];W[sn]
+;B[ro];W[ig];B[ak];W[am];B[eh];W[fh];B[ei];W[bj];B[aj];W[hh];B[gj]
+;W[fj];B[dj];W[bi];B[ah];W[bk];B[dk];W[oe];B[pe];W[ij]C[L:9];B[hj]
+;W[mc]C[L:8];B[mb];W[ie]C[L:9];B[fk];W[ek]C[L:8];B[fl];W[ej]C[L:9]
+;B[di];W[em];B[so];W[al]C[L:8];B[sj];W[sm]C[L:9];B[sk];W[mq]C[L:10]
+;B[no];W[cf];B[be];W[kd];B[jd];W[id];B[ic];W[je];B[jc];W[dl];B[ls]
+;W[ks];B[ms];W[jr];B[kj];W[fg];B[eg];W[gf];B[od];W[jj];B[nd];W[md]
+;B[ki];W[kh];B[lj];W[mj];B[mi];W[mk];B[lh];W[lg];B[jh];W[kg];B[ii]
+;W[ih];B[jk];W[jg];B[ik];W[jh];B[nh];W[ep];B[fo];W[ds];B[ar];W[cs]
+;B[bs];W[es];B[bp];W[ge];B[gd];W[an];B[ao];W[gi];B[hd];W[he];B[mh]
+;W[mg];B[ff];W[oc];B[sg];W[ck];B[hp];W[cj];B[dg];W[dh];B[];W[]
+C[N9 removed
+R9 removed
+O6 removed
+P5 removed
+P3 removed
+T7 removed
+R16 removed
+S18 removed
+S15 removed
+T16 removed
+F18 removed
+D16 removed
+E15 removed
+B18 removed
+final_score: B+144.5]
+)
diff --git a/regression/games/scoring/score43.sgf b/regression/games/scoring/score43.sgf
new file mode 100644 (file)
index 0000000..fdbc7a0
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[kittycat]BR[NR]
+PC[NNGS]DT[2002-03-30]AP[gnugoclient:2.0]
+RE[B+29.5]
+AB[pd][dp]
+;W[de];B[qp];W[op];B[pn];W[qq];B[rq];W[pq];B[po];W[qf];B[nc];W[rd]
+;B[qc];W[qi];B[cc];W[cn];B[fq];W[bp];B[cq];W[ck];B[ed];W[kq];B[iq]
+;W[lc];B[lb];W[kb];B[mb];W[ql];B[jb];W[jc];B[ka];W[rr];B[sr];W[kc]
+;B[ib];W[hd];B[gc];W[ch];B[qr];W[cd];B[dd];W[bd];B[bc];W[cf];B[nn]
+;W[rp];B[rs];W[qo]C[L:8];B[pp];W[qn]C[L:6];B[oq];W[nq]C[L:5];B[pr]
+;W[mp]C[L:4];B[no];W[ff]C[L:5];B[nr];W[ko]C[L:6];B[lm];W[ip]C[L:7]
+;B[hp];W[io]C[L:5];B[jq];W[im]C[L:6];B[lq];W[lr];B[kr];W[mr]C[L:7]
+;B[kp];W[fn]C[L:8];B[kk];W[ij]C[L:9];B[ji];W[ii];B[jh];W[ro];B[ih]
+;W[gh];B[ie];W[ic]C[L:7];B[ge];W[he];B[gd];W[le];B[lg];W[if]C[L:8]
+;B[hf];W[jf];B[hc];W[id]C[L:9];B[hg];W[bq];B[br];W[mo]C[L:10];B[mq]
+;W[np];B[ms];W[rc];B[rb];W[oj];B[nf];W[ac];B[ab];W[ad];B[bb];W[ar]
+;B[bs];W[sb];B[ra];W[og];B[of];W[mh];B[mg];W[nh];B[je];W[md];B[kd]
+;W[lp];B[ls];W[ho];B[gp];W[mj];B[ln];W[mn];B[mm];W[lo];B[ke];W[ol]
+;B[om];W[pm];B[dn];W[dm];B[en];W[em];B[ee];W[ef];B[gg];W[fg];B[hh]
+;W[hi];B[jl];W[fo];B[ep];W[gi];B[il];W[fl];B[jn];W[jo];B[in];W[hn]
+;B[hm];W[gm];B[hl];W[gk];B[go];W[gn];B[gl];W[co];B[cp];W[aq];B[hk]
+;W[hj];B[nl];W[nk];B[mk];W[lh];B[kh];W[li];B[lj];W[jj];B[kj];W[pf]
+;B[pe];W[qe];B[qd];W[sc];B[kn];W[do];B[eo];W[jp];B[kq];W[fe];B[fd]
+;W[sp];B[oo];W[ki];B[jk];W[ng];B[mf];W[sq];B[fk];W[gj];B[el];W[fm]
+;B[cm];W[bm]C[L:8];B[cl];W[dl]C[L:9];B[fp];W[bl]C[L:10];B[gf];W[ik]
+;B[];W[rf];B[];W[sa];B[qb];W[bn];B[];W[as];B[cr];W[]
+C[E8 removed
+F9 removed
+K14 removed
+H16 removed
+N16 removed
+M15 removed
+J7 removed
+final_score: B+28.5]
+)
diff --git a/regression/games/scoring/score44.sgf b/regression/games/scoring/score44.sgf
new file mode 100644 (file)
index 0000000..88a52ef
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]
+SZ[9]HA[4]KM[0.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[merlin]BR[21k]
+PC[NNGS]DT[2002-03-27]AP[gnugoclient:2.0]
+RE[B+76.5]
+AB[cc][gc][cg][gg]
+;W[ce];B[de];W[df];B[cf];W[]
+C[C5 removed
+D4 removed
+final_score: B+73.5])
diff --git a/regression/games/scoring/score45.sgf b/regression/games/scoring/score45.sgf
new file mode 100644 (file)
index 0000000..d7bd875
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.29)]WR[13k*]
+PB[pjd]BR[NR]
+PC[NNGS]DT[2002-03-30]AP[gnugoclient:2.0]
+RE[W+34.5]
+;B[oe];W[cc];B[eo];W[pq];B[jd];W[qo];B[jp];W[hc];B[ld];W[lq];B[jr]
+;W[pk];B[ph];W[qi];B[qh];W[ri];B[rh];W[he];B[jf];W[jb];B[kb];W[gg]
+;B[ih];W[fi];B[hj];W[dj];B[el];W[cl];B[cm];W[bm];B[bn];W[cn];B[dm]
+;W[bo];B[co];W[an];B[dn];W[ll];B[bn];W[bp];B[cq];W[bl];B[fj];W[jl]
+;B[il];W[jm];B[in];W[cf];B[jk];W[kr];B[lk];W[mk];B[lj];W[ln];B[ni]
+;W[jc];B[kc];W[im];B[hm];W[hl];B[ik];W[hn];B[gm];W[ho];B[io];W[cp]
+;B[dp];W[nl];B[hp];W[bq];B[cr];W[ka];B[la];W[ja];B[lb];W[id];B[je]
+;W[sh];B[sg];W[si];B[rg];W[js];B[is];W[ks];B[iq];W[br];B[bs];W[gi]
+;B[gj];W[cn];B[do];W[dk];B[ek];W[kq];B[jq];W[mj];B[mi];W[hi];B[ii]
+;W[ar];B[oj];W[dq];B[dr];W[pj];B[pi];W[rk];B[eq];W[ok];B[hf];W[gf]
+;B[hg];W[nj];B[oi];W[kk];B[kj];W[kl];B[jj];W[ie];B[if];W[hh];B[ko]
+;W[kn];B[lo];W[mo];B[jn];W[kp];B[lp];W[mp];B[jo];W[ej];B[dl];W[bn]
+;B[go];W[as];B[cs];W[]C[final_score: W+35.5
+H8 removed
+H6 removed])
diff --git a/regression/games/scoring/score46.sgf b/regression/games/scoring/score46.sgf
new file mode 100644 (file)
index 0000000..61372ab
--- /dev/null
@@ -0,0 +1,19 @@
+(;GM[1]FF[4]
+SZ[9]HA[3]KM[0.5]
+PW[leif]WR[4k*]
+PB[GnuGo (GNU Go 3.1.26)]BR[14k*]
+PC[NNGS]DT[2002-02-28]AP[gnugoclient:2.0]
+RE[W+40.5]
+AB[cc][gc][cg]
+;W[fg];B[dh];W[ce];B[ee];W[df];B[eg]C[L:5];W[ef];B[fe]C[L:2];W[ff]
+;B[gf]C[L:3];W[gg];B[hf];W[dc];B[dd]C[L:1];W[cd];B[bc]C[L:2];W[ge]
+;B[ec];W[he];B[hd]C[L:3];W[hg];B[fh]C[L:4];W[db];B[cb]C[L:5];W[if]
+;B[de]C[L:6];W[cf];B[bf];W[fd];B[eb];W[ed];B[dg]C[L:7];W[be];B[da]
+C[L:8];W[fc];B[dd]C[L:9];W[fb];B[fa];W[gb];B[bg]C[L:10];W[dc];B[db]
+;W[ba];B[ea];W[ad];B[gh];W[hh];B[hi];W[af];B[ag];W[ae];B[ih];W[ig]
+;B[gi]C[L:9];W[ii];B[]C[L:10];W[ih];B[]
+C[H6 removed
+G7 removed
+E8 removed
+D6 removed
+final_score: W+39.5])
diff --git a/regression/games/scoring/score47.sgf b/regression/games/scoring/score47.sgf
new file mode 100644 (file)
index 0000000..98241f5
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.25)]WR[14k*]
+PB[guestx]BR[NR]
+PC[NNGS]DT[2002-02-24]AP[gnugoclient:2.0]
+RE[B+63.5]
+;B[pd];W[dp];B[qp];W[dc];B[ce];W[ed];B[dg];W[cd];B[dj];W[oq];B[op]
+;W[np];B[oo];W[pq];B[qq];W[qf];B[qh];W[qc];B[qd];W[pc];B[oc];W[ob]
+;B[nc];W[qj];B[oh];W[qm]C[L:5];B[nb];W[rd]C[L:3];B[re];W[rc];B[qe]
+;W[pa]C[L:4];B[pk];W[kq]C[L:3];B[qk];W[cl];B[no];W[mp]C[L:4];B[fq]
+;W[om]C[L:3];B[nk];W[rn]C[L:1];B[ro];W[mm];B[mn];W[pl];B[lm];W[fp]
+;B[gq];W[fg]C[L:2];B[ic];W[er]C[L:3];B[gp];W[dn]C[L:4];B[fo];W[ep]
+C[L:5];B[ll];W[iq]C[L:3];B[io];W[rl]C[L:4];B[rk];W[be];B[cf];W[gc]
+C[L:5];B[ie];W[hb]C[L:6];B[ib];W[ko]C[L:7];B[jm];W[fi];B[hg];W[ch]
+C[L:8];B[dh];W[ci]C[L:7];B[di];W[cj]C[L:8];B[fk];W[ej];B[dk];W[ek]
+;B[dl];W[em]C[L:7];B[ck];W[bl]C[L:4];B[bk];W[bh]C[L:5];B[bf];W[bd]
+C[L:6];B[fe];W[el]C[L:5];B[cm];W[bm]C[L:6];B[dm];W[cn]C[L:7];B[ff]
+;W[gj]C[L:8];B[ii];W[gk]C[L:9];B[ik];W[qr]C[L:10];B[rr];W[ps]C[L:8]
+;B[jp];W[hr]C[L:7];B[eq];W[dq]C[L:8];B[fd];W[fc]C[L:9];B[hc];W[jo]
+;B[ip];W[in]C[L:7];B[hn];W[ga]C[L:6];B[hm];W[se]C[L:7];B[rf];W[fr]
+C[L:8];B[en];W[fn];B[gn];W[eo]C[L:9];B[fm];W[go]C[L:10];B[ho];W[fl]
+C[L:9];B[kp];W[lq];B[rj];W[lo]C[L:7];B[lp];W[mo]C[L:8];B[nn];W[gr]
+;B[gh];W[de]C[L:9];B[fh];W[gd]C[L:10];B[he];W[rs];B[sr];W[gm]C[L:8]
+;B[al];W[bn]C[L:9];B[hp];W[hl];B[il];W[jn]C[L:10];B[im];W[hi];B[hh]
+;W[ij];B[jj];W[hj];B[jk];W[ji];B[ih];W[am];B[ak];W[df];B[cg];W[jq]
+;B[sf];W[sd];B[pp];W[qs];B[ia];W[ha];B[ge];W[ei];B[eh];W[hk];B[ef]
+;W[ee];B[na];W[qb];B[oa];W[pb];B[sb];W[ra];B[rb];W[km];B[ln];W[kn]
+;B[kl];W[hd];B[id];W[ae];B[af];W[fo];B[gi];W[hq];B[rq];W[];B[ss]
+;W[or];B[];W[]
+C[final_score: B+64.5
+R14 removed
+F13 removed
+B12 removed
+K11 removed
+R10 removed
+F9 removed
+Q8 removed
+S8 removed
+N7 removed
+P7 removed
+R7 removed
+S6 removed]
+)
diff --git a/regression/games/scoring/score48.sgf b/regression/games/scoring/score48.sgf
new file mode 100644 (file)
index 0000000..835a101
--- /dev/null
@@ -0,0 +1,35 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.25)]WR[13k*]
+PB[help]BR[NR]
+PC[NNGS]DT[2002-02-19]AP[gnugoclient:2.0]
+RE[B+66.5]
+;B[pd];W[dp];B[op];W[dd];B[oj];W[nc];B[kc];W[ne];B[pf];W[qp];B[qo]
+;W[ro];B[qn];W[mq];B[pp];W[qq];B[rn];W[jq];B[cn];W[fq];B[cf];W[fc]
+;B[hb];W[sp];B[bp];W[cq];B[bd];W[cc];B[cj];W[ld];B[hd];W[pb];B[qc]
+;W[go];B[bc];W[ef]C[L:8];B[dh];W[or]C[L:9];B[em];W[in]C[L:6];B[mb]
+;W[qb];B[rb];W[nb];B[lb];W[ge]C[L:5];B[fb];W[fh]C[L:6];B[mn];W[if]
+C[L:7];B[lj];W[bq]C[L:6];B[lq];W[lp]C[L:5];B[kq];W[kp]C[L:3];B[jr]
+;W[iq];B[mr];W[nr]C[L:4];B[lr];W[ir];B[jp];W[lo];B[ln];W[mp];B[jo]
+;W[jn];B[qi];W[bo]C[L:5];B[bn];W[eb]C[L:6];B[gc];W[ec]C[L:7];B[fj]
+;W[cp]C[L:8];B[ng];W[hh];B[kh];W[an];B[am];W[ao]C[L:9];B[bm];W[lf]
+C[L:10];B[lg];W[kf]C[L:7];B[nq];W[np]C[L:8];B[oq];W[oo]C[L:9];B[po]
+;W[no]C[L:7];B[on];W[kn]C[L:8];B[nn];W[io]C[L:9];B[pr];W[qr]C[L:7]
+;B[os];W[rq]C[L:8];B[he];W[bb]C[L:9];B[ab];W[ba]C[L:7];B[gd];W[hf]
+C[L:8];B[fe];W[gf];B[fd];W[df];B[ce];W[de]C[L:9];B[ff];W[eg]C[L:7]
+;B[gn];W[fn]C[L:8];B[fm];W[hn]C[L:9];B[en];W[js]C[L:7];B[fo];W[kr]
+;B[gp];W[fa];B[ga];W[ea];B[kd];W[ra]C[L:8];B[rc];W[gb];B[ha];W[gj]
+C[L:9];B[gk];W[hj]C[L:10];B[ei];W[jj];B[gq];W[gr];B[hr];W[hq];B[fr]
+;W[hs]C[L:8];B[eq];W[hp]C[L:9];B[ho];W[dr]C[L:10];B[er];W[kl];B[ll]
+;W[sn];B[rm];W[sm];B[sl];W[so];B[rl];W[mf];B[dq];W[cs];B[fg];W[eh]
+;B[gg];W[fi];B[ej];W[hm];B[hk];W[ih];B[je];W[kg];B[mg];W[ik];B[od]
+;W[nd];B[jf];W[jg];B[hg];W[ig];B[gh];W[gi];B[kk];W[jl];B[do];W[ep]
+;B[fp];W[ki];B[li];W[jh];B[lh];W[kj];B[es];W[lm];B[mm];W[gs];B[ds]
+;W[cr];B[dg];W[ls];B[ns];W[qs];B[ms];W[ks];B[km];W[jm];B[hl];W[ma]
+;B[la];W[na];B[ie];W[oc];B[pc];W[gm];B[gl];W[mc];B[lc];W[ke];B[ic]
+;W[oe];B[pe];W[of];B[og];W[il];B[fq];W[go];B[qa];W[pa];B[ho];W[eo]
+;B[co];W[ap];B[fn];W[fb];B[cd];W[db];B[ac];W[ed];B[aa];W[go];B[mo]
+;W[ko];B[ho];W[lm];B[lk];W[jk];B[ps];W[km];B[pq];W[go];B[sr];W[ss]
+;B[ho];W[sb];B[sc];W[go];B[sa];W[ho];B[qa];W[nf];B[ra];W[fs];B[ee]
+;W[]C[final_score: B+67.5
+K5 removed])
diff --git a/regression/games/scoring/score49.sgf b/regression/games/scoring/score49.sgf
new file mode 100644 (file)
index 0000000..c9647e2
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.25)]WR[13k*]
+PB[jogabe]BR[14k]
+PC[NNGS]DT[2002-02-18]AP[gnugoclient:2.0]
+RE[B+26.5]
+;B[pd];W[cp];B[pp];W[dc];B[eq];W[do];B[cq];W[qn];B[qo];W[pn];B[np]
+;W[lq];B[mq];W[lp];B[hq];W[qj]C[L:8];B[qg];W[ce]C[L:9];B[cj];W[bq]
+C[L:10];B[dq];W[jc];B[mc];W[qc];B[qd];W[pc]C[L:9];B[oc];W[ob]C[L:7]
+;B[nc];W[rd]C[L:8];B[re];W[rc]C[L:9];B[of];W[gc]C[L:10];B[nb];W[pa]
+;B[na];W[jp];B[rb];W[qb]C[L:8];B[sb];W[oa]C[L:9];B[sd];W[sc]C[L:10]
+;B[se];W[ra];B[jq];W[jn]C[L:8];B[ip];W[ch]C[L:9];B[cm];W[cr];B[dr]
+;W[br]C[L:8];B[bo];W[dm];B[bp];W[cn];B[bn];W[dl];B[cl];W[co]C[L:9]
+;B[dk];W[fm]C[L:10];B[ek];W[ln]C[L:8];B[fl];W[gm]C[L:9];B[en];W[em]
+;B[cg];W[im]C[L:5];B[fo];W[bg]C[L:6];B[dg];W[bi]C[L:7];B[cd];W[dd]
+C[L:5];B[cc];W[be]C[L:4];B[ic];W[id];B[ib];W[jb];B[gb];W[fb]C[L:3]
+;B[hc];W[gd]C[L:2];B[kb];W[ia]C[L:3];B[qi];W[dh]C[L:4];B[eh];W[eg]
+C[L:5];B[di];W[dn];B[jo];W[ri];B[kp];W[mp];B[mr];W[lr];B[rh];W[ms]
+C[L:4];B[nr];W[pi];B[qh];W[pk];B[rj];W[rk];B[sj];W[hj]C[L:5];B[ns]
+;W[ro]C[L:6];B[rp];W[rn]C[L:4];B[ol];W[nk]C[L:5];B[nn];W[ei];B[fh]
+;W[ef];B[on];W[fj];B[gj];W[fi];B[fk];W[gh]C[L:6];B[hk];W[ij];B[ha]
+;W[ja];B[jg];W[gi]C[L:7];B[jd];W[je]C[L:6];B[hd];W[kd]C[L:5];B[ie]
+;W[kf]C[L:3];B[jd];W[kc]C[L:1];B[id];W[if]C[L:2];B[jf];W[ke]C[L:1]
+;B[hf];W[kg]C[L:2];B[ig];W[ik]C[L:3];B[ge];W[gg];B[ji];W[mf];B[gf]
+;W[hg]C[L:4];B[kh];W[lh];B[li];W[mh];B[oj];W[pj]C[L:3];B[jj];W[oh]
+C[L:4];B[fe];W[ec]C[L:5];B[ii];W[kj];B[jk];W[ki];B[jh];W[hl];B[jl]
+;W[km];B[kl];W[lj]C[L:6];B[il];W[gk]C[L:5];B[ll];W[mm]C[L:6];B[ml]
+;W[nl]C[L:7];B[nm];W[ok]C[L:8];B[lm];W[mn];B[jm];W[ci]C[L:7];B[kn]
+;W[in];B[bj];W[sp];B[rq];W[sq]C[L:8];B[sr];W[so]C[L:9];B[qr];W[sk]
+C[L:7];B[si];W[go]C[L:8];B[gp];W[ho]C[L:9];B[ql];W[pm]C[L:8];B[qk]
+;W[sm];B[rm];W[sl];B[po];W[om];B[pl];W[lb]C[L:9];B[ng];W[eo]C[L:10]
+;B[fp];W[og]C[L:8];B[nf];W[dj]C[L:9];B[ck];W[fn]C[L:10];B[db];W[eb]
+;B[da];W[cb];B[bb];W[bc];B[ca];W[bd];B[cb];W[ne];B[oe];W[me];B[ph]
+;W[ee];B[nh];W[ni];B[mj];W[mk];B[mg];W[lg];B[lc];W[fd];B[ai];W[ah]
+;B[aj];W[pg];B[pf];W[oi];B[nd];W[ej];B[io];W[ld];B[hp];W[hn];B[fa]
+;W[ea];B[hb];W[mb];B[la];W[ka];B[ma];W[kb];B[qe];W[ff];B[];W[gl];B[]
+;W[hi];B[];W[ga];B[lk];W[mi];B[fa];W[md];B[od];W[ga];B[ag];W[bh]
+;B[fa];W[el];B[ga];W[ep];B[];W[dp];B[];W[hh];B[kk];W[nj];B[];W[ih]
+;B[];W[]
+C[S18 removed
+C17 removed
+E12 removed
+D13 removed
+N4 removed
+N1 removed
+B2 removed
+N6 removed
+A13 removed
+final_score: B+19.5]
+)
diff --git a/regression/games/scoring/score5.sgf b/regression/games/scoring/score5.sgf
new file mode 100644 (file)
index 0000000..83ac80e
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pe];W[dd];B[dq];W[qp];B[do];W[oq];B[pc];W[qj];B[fc];W[cf]
+;B[db];W[cc];B[ic];W[jp];B[ch];W[cb];B[lq];W[gq];B[lo];W[qg]
+;B[rf];W[ck];B[eh];W[cm];B[bn];W[qm];B[dc];W[cn];B[co];W[qf]
+;B[qe];W[rg];B[re];W[em];B[ld];W[bm];B[bo];W[kr];B[ed];W[de]
+;B[lh];W[bh];B[bi];W[bg];B[jn];W[ci];B[di];W[cj];B[gm];W[fl]
+;B[ek];W[nh];B[oj];W[mi];B[pi];W[nk];B[pg];W[pf];B[pk];W[lk]
+;B[qk];W[qi];B[ol];W[mm];B[on];W[no];B[oi];W[ok];B[pj];W[pl]
+;B[of];W[ph];B[pm];W[ql];B[rk];W[qn];B[og];W[oh];B[jk];W[oe]
+;B[nf];W[nd];B[nb];W[mg];B[ne];W[me];B[mf];W[lf];B[od];W[lg]
+;B[le];W[kh];B[ih];W[if];B[jg];W[gf];B[lr];W[ks];B[fr];W[iq]
+;B[ls];W[ho];B[kq];W[hm];B[gl];W[jr];B[fk];W[fq];B[gr];W[hr]
+;B[eq];W[ig];B[gk];W[jh];B[fn];W[ff];B[eo];W[el];B[ee];W[dg]
+;B[dh];W[gh];B[hh];W[gi];B[hj];W[nr];B[ef];W[eg];B[ei];W[da]
+;B[eb];W[ko];B[ln];W[kn];B[km];W[lm];B[kl];W[gn];B[fm];W[fo]
+;B[en];W[gs];B[er];W[dj];B[fi];W[ej];B[fj];W[ji];B[ij];W[ep]
+;B[kj];W[lj];B[rl];W[hi];B[ii];W[jd];B[jc];W[ke];B[id];W[kd]
+;B[kc];W[ie];B[rj];W[rm];B[am];W[al];B[an];W[ri];B[bl];W[cl]
+;B[ak];W[ai];B[om];W[dn];B[dl];W[gd];B[gc];W[hd];B[hc];W[bk]
+;B[dm];W[al];B[dp];W[fp];B[bl];W[ng];B[md];W[al];B[fh];W[fg]
+;B[bl];W[jo];B[jm];W[al];B[ea];W[aj];B[ca];W[hl];B[bb];W[bc]
+;B[sg];W[sh];B[sf];W[ab];B[ba];W[sl];B[sj];W[rh];B[fs];W[hs]
+;B[ll];W[ml];B[fe];W[kk];B[jj];W[ki];B[ge];W[he];B[in];W[hn]
+;B[io];W[ip];B[fd];W[hg];B[dk];W[hk];B[cg];W[im];B[jl];W[df]
+;B[gj];W[gg];B[il];W[ik];B[da];W[ac];B[aa];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score50.sgf b/regression/games/scoring/score50.sgf
new file mode 100644 (file)
index 0000000..50d2561
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.25)]WR[13k*]
+PB[martV]BR[30k]
+PC[NNGS]DT[2002-02-21]AP[gnugoclient:2.0]
+RE[B+14.5]
+;B[pe];W[dp];B[pp];W[cd];B[qj];W[nq];B[pc];W[ed];B[jc];W[cj];B[oj]
+;W[kq];B[je];W[fg];B[ig];W[hh];B[ih];W[pn];B[on];W[hq];B[pm];W[ho]
+C[L:7];B[qn];W[cm]C[L:8];B[ij];W[fi]C[L:9];B[oq];W[np]C[L:10];B[mn]
+;W[cg];B[ge];W[gc];B[hc];W[hb];B[ib];W[gb];B[gd];W[or];B[pr];W[nr]
+;B[op];W[ko];B[km];W[fl];B[il];W[in];B[jn];W[jo];B[im];W[hm];B[kn]
+;W[gj];B[no];W[ps];B[qs];W[lo];B[ln];W[hi];B[ii];W[os];B[rr];W[fd]
+;B[fe];W[ee];B[hg];W[ia];B[ja];W[ha];B[gg];W[ff];B[gf];W[gh];B[hl]
+;W[gl];B[hj];W[hk];B[ik];W[gk];B[mo];W[mp];B[];W[]
+C[Q6 removed
+final_score: B+43.5])
diff --git a/regression/games/scoring/score51.sgf b/regression/games/scoring/score51.sgf
new file mode 100644 (file)
index 0000000..d24419e
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.25)]WR[13k*]
+PB[pentacles]BR[30k]
+PC[NNGS]DT[2002-02-18]AP[gnugoclient:2.0]
+RE[B+75.5]
+;B[pc];W[dp];B[pp];W[dd];B[qi];W[md];B[pe];W[jd];B[df];W[fd];B[dn]
+;W[fp];B[ej];W[qn];B[np];W[rp];B[qq];W[qk];B[jq];W[hp];B[jo];W[hq]
+;B[cp];W[cq];B[co];W[bq];B[cl];W[ce];B[cf];W[bf];B[bg];W[be];B[ch]
+;W[rj];B[ri];W[ir];B[jr];W[rq];B[rr];W[an];B[bn];W[ff];B[nc];W[fh]
+;B[lb];W[ao];B[ap];W[bp];B[am];W[bo];B[bm];W[gi];B[nf];W[lh];B[lf]
+;W[nh];B[pg];W[kh];B[ke];W[kd];B[if];W[hd];B[qj];W[rk];B[ih];W[gm]
+;B[on];W[im]C[L:8];B[jj];W[si]C[L:9];B[sh];W[ji]C[L:5];B[ii];W[sj]
+C[L:6];B[rg];W[mk]C[L:7];B[km];W[kj]C[L:8];B[ij];W[mm]C[L:9];B[kk]
+;W[lk]C[L:6];B[jh];W[om]C[L:7];B[pm];W[ol]C[L:5];B[qm];W[rm]C[L:4]
+;B[rn];W[ro];B[rl];W[sn]C[L:2];B[pk];W[ql]C[L:3];B[pl];W[sl];B[nj]
+;W[kl]C[L:2];B[jk];W[nn]C[L:1];B[oo];W[mj]C[L:0];B[nk];W[nl];B[jl]
+;W[ll]C[L:1];B[lm];W[ln]C[L:2];B[mo];W[mg];B[mf];W[mn]C[L:3];B[ki]
+;W[li];B[ni];W[jm]C[L:4];B[kn];W[ld]C[L:5];B[lo];W[js]C[L:6];B[ks]
+;W[is]C[L:7];B[lr];W[jb]C[L:8];B[mi];W[sr]C[L:9];B[rs];W[pn]C[L:8]
+;B[ok];W[kb];B[mb];W[jn]C[L:9];B[ko];W[io]C[L:8];B[do];W[eo];B[en]
+;W[fn]C[L:9];B[fl];W[hg]C[L:8];B[jf];W[fm]C[L:9];B[el];W[qp];B[pq]
+;W[hh]C[L:10];B[eg];W[fg]C[L:9];B[nd];W[ag]C[L:10];B[ah];W[af];B[eh]
+;W[ei];B[di];W[fi];B[iq];W[hr];B[hl];W[il];B[hm];W[ik];B[hk];W[in]
+;B[go];W[hn]C[L:5];B[fo];W[ep]C[L:6];B[ip];W[hj]C[L:7];B[gl];W[gn]
+C[L:8];B[em];W[ho]C[L:9];B[fj];W[gj]C[L:8];B[hf];W[ig];B[jg];W[la]
+C[L:9];B[ma];W[ka]C[L:10];B[ge];W[fe];B[gd];W[hc]C[L:8];B[gc];W[fc]
+C[L:9];B[gb];W[hb]C[L:10];B[da];W[cb];B[ca];W[db];B[ea];W[eb];B[ba]
+;W[bb];B[fb];W[gf];B[he];W[ie];B[ic];W[ib];B[de];W[je];B[bc];W[ab]
+;B[bd];W[cd];B[ee];W[ed];B[cc];W[gk];B[po];W[qo]C[L:9];B[fk];W[le]
+C[L:10];B[kf];W[me];B[ne];W[ha];B[lc];W[kc];B[mc];W[hi];B[ef];W[aa]
+;B[fa];W[ga];B[qr];W[sq];B[ss];W[]
+C[J17 removed
+B17 removed
+G5 removed
+A4 removed
+O12 removed
+N13 removed
+M12 removed
+L10 removed
+N9 removed
+P8 removed
+N6 removed
+final_score: B+75.5]
+)
diff --git a/regression/games/scoring/score52.sgf b/regression/games/scoring/score52.sgf
new file mode 100644 (file)
index 0000000..73e5c4c
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-06]AP[gnugoclient:2.0]
+RE[B+45.5]
+;B[pd];W[dd];B[pp];W[dq];B[do];W[co];B[eq];W[er];B[dp];W[fr];B[cq]
+;W[dr];B[cn];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc];W[nb];B[mc];W[rd]
+;B[re];W[rc];B[qf];W[qq];B[qp];W[pq];B[oq];W[or];B[nq];W[nr];B[rp]
+;W[mq];B[no];W[gp];B[qk];W[hc];B[cf];W[ch];B[ck];W[df];B[cc];W[dc]
+;B[cd];W[kp];B[nk];W[jd];B[oh];W[kf];B[mf];W[kh];B[de];W[dg];B[ee]
+;W[if]C[L:8];B[fc];W[fg]C[L:9];B[ge];W[gf]C[L:10];B[he];W[kj];B[ek]
+;W[hf];B[mp];W[lq];B[ln];W[mg];B[nf];W[kl];B[lk];W[kk];B[ll];W[km]
+;B[gk];W[jn];B[fn];W[gn];B[fo];W[gm];B[fm];W[rq];B[sq];W[cr];B[bq]
+;W[bj];B[bk];W[bh];B[gb];W[ae];B[be];W[af];B[ad];W[ak];B[al];W[aj]
+;B[bm];W[sr];B[sp];W[ij];B[gi];W[lm];B[mm];W[rr];B[mn];W[ni];B[oi]
+;W[ag];B[hl];W[ep]C[L:8];B[eo];W[fp]C[L:9];B[hh];W[nh]C[L:10];B[jb]
+;W[jc]C[L:8];B[kb];W[hb]C[L:6];B[mb];W[gc]C[L:7];B[fb];W[ha]C[L:8]
+;B[hm];W[hn]C[L:9];B[ik];W[hj]C[L:10];B[gj];W[hk];B[gl];W[ng];B[og]
+;W[br];B[cp];W[gd];B[fd];W[ld];B[md];W[le];B[nj];W[mi];B[lj];W[li]
+;B[go];W[ho];B[im];W[jk];B[in];W[io];B[ih];W[ei];B[ej];W[dj];B[cj]
+;W[ci];B[dk];W[di];B[ie];W[je];B[na];W[pa]C[L:9];B[kc];W[aq]C[L:10]
+;B[ap];W[ar];B[ib];W[ko];B[lf];W[lg];B[ji];W[jh];B[ii];W[me];B[ne]
+;W[fh];B[ef];W[ff];B[fe];W[hd];B[eg];W[cg];B[kd];W[ke];B[ig];W[bf]
+;B[ce];W[il];B[jg];W[ki];B[jf];W[kg];B[jm];W[kn];B[jl];W[gh];B[hi]
+;W[se];B[sf];W[sd];B[ga];W[lc];B[lb];W[fi];B[fj];W[ia];B[ja];W[mj]
+;B[mk];W[ik];B[ma];W[qb];B[oa];W[pb];B[ra];W[sb];B[rb];W[hg];B[lp]
+;W[lo];B[mo];W[eh];B[jj];W[ic];B[id];W[]
+C[final_score: B+45.5
+D17 removed
+C5 removed
+E3 removed])
diff --git a/regression/games/scoring/score53.sgf b/regression/games/scoring/score53.sgf
new file mode 100644 (file)
index 0000000..e4f3f33
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-10]AP[gnugoclient:2.0]
+RE[B+95.5]
+;B[pd];W[dd];B[qp];W[dq];B[oq];W[qc];B[qd];W[pc];B[oc];W[ob];B[nc]
+;W[nb];B[mc];W[rd];B[re];W[rc];B[qf];W[do];B[jp];W[hq];B[pk];W[oo]
+;B[mn];W[qo];B[pp];W[po];B[qm];W[hc];B[cj];W[np];B[nq];W[om];B[nl]
+;W[df];B[cm];W[co];B[jr];W[jd];B[lf];W[ih];B[lh];W[ec];B[jf];W[ki]
+;B[li];W[ir];B[iq];W[ip];B[jq];W[io];B[jo];W[hr];B[hf];W[em];B[dh]
+;W[ij];B[in];W[il];B[hn];W[go];B[gl];W[lk];B[lj];W[mk];B[nk];W[mj]
+;B[kj];W[kl];B[jm];W[jl];B[gj];W[jg];B[kg];W[ig];B[if];W[gh];B[fg]
+;W[cg];B[fh];W[bi];B[ci];W[bj]C[L:8];B[ck];W[mb];B[bk];W[ch]C[L:9]
+;B[gn];W[kc]C[L:10];B[fe];W[js];B[ks];W[is];B[lr];W[ld];B[md];W[ho]
+;B[fn];W[dm];B[fo];W[fq];B[fp];W[gp];B[ep];W[eq];B[dp];W[cp];B[cn]
+;W[dn];B[ek];W[bn];B[bm];W[ao];B[fl];W[me];B[le];W[lc];B[od];W[dl]
+;B[dk];W[ke];B[kf];W[je];B[fc];W[fb];B[gc];W[gb];B[hd];W[ic];B[ef]
+;W[ee];B[dg];W[cf];B[fd];W[ed];B[aj];W[ah];B[am];W[an];B[cl];W[sd]
+;B[se];W[fm];B[gm];W[ie];B[he];W[ai];B[ak];W[id];B[el];W[eo];B[en]
+;W[ap];B[hi];W[]
+C[final_score: B+94.5
+N15 removed
+J13 removed
+G12 removed
+L11 removed
+J10 removed
+N10 removed
+J8 removed
+P7 removed
+P5 removed
+O4 removed]
+)
diff --git a/regression/games/scoring/score54.sgf b/regression/games/scoring/score54.sgf
new file mode 100644 (file)
index 0000000..3c73e30
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[13k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-13]AP[gnugoclient:2.0]
+RE[B+187.5]
+;B[pd];W[dc];B[pp];W[dq];B[co];W[dl];B[eo];W[fp];B[fo];W[gp];B[cq]
+;W[cr];B[bq];W[qc];B[qd];W[pc];B[od];W[mb];B[pi];W[pm];B[ql];W[nm]
+;B[qm];W[de];B[dj];W[fl];B[dg];W[nq];B[lq];W[oj];B[pj];W[ic];B[gd]
+;W[pr];B[qq];W[he];B[ge];W[gf];B[ff];W[gg];B[ee];W[cf];B[df];W[dd]
+;B[cg];W[bf];B[hq];W[bg];B[mp];W[mr];B[lr];W[pn];B[np];W[qn];B[ok]
+;W[rp];B[rq];W[lm];B[io];W[rn];B[fr];W[nk];B[ol];W[ni];B[oi];W[nn]
+;B[nl];W[sk];B[rk];W[sl];B[ml];W[ln];B[im];W[nj];B[ll];W[je];B[lh]
+;W[lk];B[kk];W[le];B[mf];W[rc];B[rd];W[dk];B[fj];W[bk];B[bj];W[cj]
+;B[ci];W[ck];B[di];W[bi];B[bh];W[aj];B[ah];W[gk];B[gj];W[hk];B[hj]
+;W[gh];B[ij];W[oc];B[bm];W[sd];B[se];W[sc];B[rf];W[li];B[kh];W[gb]
+;B[hd];W[id];B[hf];W[ie];B[ig];W[fc];B[nd];W[me];B[nf];W[fd];B[fe]
+;W[ed];B[mc];W[lb];B[lc];W[kc];B[lf];W[nc];B[md];W[kf];B[kg];W[jg]
+;B[ih];W[jh];B[ji];W[jf];B[ki];W[ne];B[oe];W[ld];B[hc];W[hb];B[ag]
+;W[af];B[gm];W[if];B[hg];W[gc];B[ch];W[];B[rl];W[];B[qp];W[]
+C[L:9
+final_score: B+184.5
+G14 removed
+B11 removed
+M11 removed
+O11 removed
+A10 removed
+C10 removed
+G9 removed
+M9 removed
+T9 removed
+F8 removed
+M7 removed
+O7 removed
+Q7 removed
+F4 removed
+S4 removed
+D3 removed
+O3 removed
+C2 removed
+N2 removed
+Q2 removed]
+)
diff --git a/regression/games/scoring/score55.sgf b/regression/games/scoring/score55.sgf
new file mode 100644 (file)
index 0000000..d497ae1
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-18]AP[gnugoclient:2.0]
+RE[B+145.5]
+;B[pd];W[dp];B[qp];W[op];B[oq];W[nq];B[pq];W[np];B[kp];W[dd];B[hp]
+;W[nc];B[qf];W[pb];B[qc];W[kc];B[pn];W[ql];B[qj];W[dj];B[oj];W[dm]
+;B[cq];W[dq];B[cp];W[co];B[bo];W[cn];B[dr];W[er];B[cr];W[hc];B[eq]
+;W[fq];B[ep];W[fp];B[do];W[fo];B[cf];W[df];B[dg];W[ef];B[ce];W[cd]
+;B[ci];W[fd];B[cj];W[nn];B[om];W[or];B[pr];W[rn];B[ro];W[qn];B[qo]
+;W[mr];B[kn];W[kr];B[gr];W[ol];B[nl];W[pm];B[on];W[rk];B[rj];W[rm]
+;B[oo];W[dk];B[jr];W[ns];B[lq];W[no];B[nm];W[mm];B[ml];W[mo];B[lm]
+;W[mq];B[lr];W[lp];B[lo];W[kq];B[mp];W[sj];B[lp];W[sh];B[rg];W[kg]
+;B[ne];W[fr];B[jj];W[lj];B[fn];W[gk];B[gn];W[gi];B[ih];W[ii];B[ji]
+;W[jh];B[hi];W[ki];B[ij];W[ig];B[hg];W[bn];B[bp];W[ck];B[eg];W[if]
+;B[ei];W[qb];B[rb];W[bd];B[be];W[ej];B[fi];W[fj];B[gh];W[dl];B[bk]
+;W[bl];B[bj];W[fl];B[le];W[nh];B[mh];W[ni];B[mi];W[mj];B[mg];W[ok]
+;B[pk];W[nk];B[pl];W[nj];B[ph];W[ng];B[mf];W[hm];B[hn];W[il];B[kj]
+;W[li];B[ad];W[ac];B[ae];W[bb];B[kd];W[lc];B[jd];W[jc];B[id];W[he]
+;B[ic];W[ib];B[hd];W[gd];B[hb];W[gc];B[jb];W[of];B[oe];W[gb];B[ia]
+;W[ff];B[la];W[gj];B[kl];W[in];B[io];W[oi];B[rh];W[pj];B[qk];W[pi]
+;B[qi];W[jn];B[jo];W[jm];B[km];W[jl];B[lk];W[gm];B[en];W[gf];B[jf]
+;W[kf];B[je];W[jg];B[fg];W[di];B[dh];W[de]C[L:9];B[pf];W[og]C[L:10]
+;B[pg];W[em];B[mb];W[ao]C[L:8];B[ap];W[ak]C[L:9];B[an];W[aj]C[L:10]
+;B[ai];W[al];B[bh];W[am];B[ao];W[dn];B[hk];W[hj];B[ik];W[lh];B[ke]
+;W[fm]C[L:9];B[eo];W[hf]C[L:10];B[mk];W[gg]C[L:8];B[hh];W[hl]C[L:9]
+;B[jk];W[ga]C[L:10];B[ha];W[nf];B[lf];W[lg]C[L:9];B[oh];W[ie];B[qm]
+;W[]
+C[final_score: B+144.5
+Q18 removed
+K17 removed
+O17 removed
+T12 removed
+T10 removed
+S9 removed
+R8 removed
+N7 removed
+S7 removed
+O6 removed
+F5 removed
+L3 removed
+P2 removed
+O1 removed]
+)
diff --git a/regression/games/scoring/score56.sgf b/regression/games/scoring/score56.sgf
new file mode 100644 (file)
index 0000000..fd65a49
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-19]AP[gnugoclient:2.0]
+RE[B+16.5]
+;B[pd];W[dp];B[qp];W[dc];B[oq];W[qj];B[ql];W[qg];B[qe];W[de];B[jp]
+;W[oj];B[ol];W[mj];B[fq];W[hq];B[fo];W[dn];B[ho];W[jr];B[kq];W[jc]
+;B[cj];W[ml];B[nn];W[nc];B[dr];W[cq];B[cm];W[cn];B[ob];W[bm];B[cg]
+;W[eg];B[be];W[gc];B[ne];W[cl];B[lc];W[cr];B[le];W[kr];B[lr];W[gr]
+;B[fr];W[je];B[bc];W[kl];B[ln];W[rf];B[re];W[il];B[ej];W[fi];B[fj]
+;W[hi];B[og];W[kg];B[kb];W[jb];B[rk];W[pg]C[L:8];B[oh];W[dl];B[pi]
+;W[qi];B[pj];W[mh];B[ok];W[bk]C[L:7];B[bj];W[ds]C[L:6];B[es];W[cs]
+C[L:7];B[ei];W[fh];B[kf];W[jf]C[L:8];B[lg];W[lh]C[L:9];B[cb];W[db]
+C[L:4];B[jn];W[mg]C[L:2];B[lf];W[mb]C[L:1];B[ka];W[kh];B[em];W[gk]
+C[L:2];B[gj];W[hj]C[L:3];B[gi];W[gh]C[L:4];B[gl];W[fk]C[L:5];B[hl]
+;W[el]C[L:6];B[hk];W[ik]C[L:7];B[im];W[dm]C[L:8];B[fl];W[ek]C[L:9]
+;B[en];W[dh];B[ch];W[di]C[L:10];B[dj];W[aj];B[bi];W[kd]C[L:8];B[ld]
+;W[nj]C[L:9];B[mm];W[ca]C[L:10];B[ba];W[da]C[L:9];B[nl];W[ll]C[L:10]
+;B[ja];W[ia];B[cc];W[dq];B[er];W[cd];B[bd];W[df];B[ce];W[dd];B[nf]
+;W[ai];B[ah];W[ak];B[ci];W[cf];B[bf];W[jm];B[km];W[hm];B[hn];W[in]
+;B[gm];W[jo];B[im];W[kn];B[lm];W[ip]C[L:9];B[io];W[kp]C[L:7];B[jn]
+;W[jq]C[L:6];B[ko];W[lq];B[mr];W[np];B[op];W[mq]C[L:4];B[nq];W[no]
+C[L:5];B[oo];W[mo]C[L:6];B[lo];W[lp];B[jp];W[hp]C[L:4];B[jo];W[ir]
+C[L:5];B[mn];W[gp]C[L:6];B[fp];W[ls]C[L:7];B[ns];W[jl]C[L:8];B[ni]
+;W[oi]C[L:9];B[nh];W[ph]C[L:10];B[pk];W[rh];B[si];W[ri];B[sj];W[sg]
+;B[se];W[sf];B[qf];W[sh];B[mi];W[pf];B[pe];W[li];B[kc];W[ib];B[ke]
+;W[jd];B[of];W[rj];B[sk];W[qk];B[rl];W[nk];B[go];W[eo];B[ep];W[do]
+;B[gs];W[hs];B[ms];W[ks];B[mp];W[kq];B[gq];W[hr];B[dg];W[eh];B[bg]
+;W[mf];B[me];W[fs];B[lj];W[mk];B[gs];W[qb];B[pb];W[fs];B[ck];W[gs]
+;B[dk];W[ng];B[eq];W[hh];B[];W[]
+C[final_score: B+15.5
+N18 removed
+R18 removed
+O17 removed
+M10 removed]
+)
diff --git a/regression/games/scoring/score57.sgf b/regression/games/scoring/score57.sgf
new file mode 100644 (file)
index 0000000..c31edc2
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.27)]WR[14k*]
+PB[GoFuN]BR[NR]
+PC[NNGS]DT[2002-03-19]AP[gnugoclient:2.0]
+RE[B+119.5]
+;B[pd];W[dp];B[qp];W[oq];B[pq];W[op];B[pn];W[ql];B[qj];W[pf];B[mp]
+;W[dd];B[pk];W[rn];B[ro];W[pl];B[ol];W[mr];B[kq];W[rk];B[rj];W[nf]
+;B[nc];W[pm];B[om];W[pr];B[qn];W[oi]C[L:8];B[oj];W[lf]C[L:9];B[qr]
+;W[ns]C[L:6];B[or];W[ps]C[L:4];B[qs];W[nr]C[L:5];B[lr];W[dj]C[L:6]
+;B[no];W[cg]C[L:7];B[fc];W[eb];B[ic];W[mi]C[L:8];B[cn];W[dn]C[L:7]
+;B[co];W[do]C[L:6];B[cp];W[fq]C[L:5];B[dm];W[em]C[L:4];B[dl];W[iq]
+C[L:5];B[jo];W[qc]C[L:6];B[qd];W[pc]C[L:5];B[oc];W[rd];B[re];W[rc]
+C[L:4];B[qf];W[ob];B[nb];W[pa];B[pg];W[jf];B[fe];W[od];B[lc];W[ck]
+;B[el];W[og]C[L:5];B[ph];W[oe]C[L:6];B[qe];W[fm]C[L:5];B[ho];W[lk]
+C[L:3];B[fl];W[ml]C[L:4];B[gm];W[jk]C[L:2];B[fn];W[en]C[L:3];B[fo]
+;W[dr]C[L:4];B[cr];W[dq];B[cq];W[fr]C[L:5];B[hr];W[kn]C[L:3];B[ko]
+;W[fb]C[L:4];B[gc];W[hi]C[L:5];B[de];W[cb]C[L:3];B[ce];W[hf]C[L:4]
+;B[eg];W[dh]C[L:5];B[fh];W[gb];B[hb];W[bm]C[L:6];B[bn];W[cl]C[L:5]
+;B[cm];W[al];B[bc];W[cc]C[L:6];B[bd];W[bb]C[L:7];B[ab];W[ln]C[L:6]
+;B[lo];W[pi]C[L:5];B[qi];W[hd];B[hc];W[mn]C[L:6];B[ec];W[bf]C[L:4]
+;B[ge];W[ga]C[L:5];B[dc];W[id]C[L:6];B[jc];W[hk]C[L:7];B[hl];W[be]
+C[L:5];B[cd];W[na]C[L:6];B[mb];W[jn]C[L:7];B[in];W[il];B[im];W[jm]
+C[L:8];B[gk];W[gj]C[L:9];B[fj];W[gi];B[nj];W[fi]C[L:8];B[mj];W[lj]
+C[L:9];B[ni];W[mh]C[L:10];B[oh];W[nh];B[me];W[eh]C[L:8];B[gg];W[le]
+C[L:9];B[md];W[ej]C[L:10];B[fk];W[gf];B[ff];W[se];B[sf];W[pe];B[qg]
+;W[he];B[kd];W[sd];B[ke];W[mf];B[ne];W[kf];B[hg];W[ig];B[hh];W[ih]
+;B[ma];W[ad];B[nn];W[oa];B[nm];W[mm];B[ac];W[ae];B[cf];W[bg];B[dg]
+;W[je];B[jd];W[gd];B[fd];W[an];B[ao];W[am];B[nl];W[mk];B[nk];W[gh]
+;B[fg];W[dk];B[ld];W[mo];B[np];W[ek];B[nd];W[of];B[hq];W[]
+C[final_score: B+118.5
+G19 removed
+B18 removed
+D16 removed
+P11 removed
+S9 removed
+Q8 removed
+E7 removed
+S6 removed
+P4 removed
+F3 removed
+J3 removed
+N2 removed
+Q2 removed]
+)
diff --git a/regression/games/scoring/score58.sgf b/regression/games/scoring/score58.sgf
new file mode 100644 (file)
index 0000000..33eb340
--- /dev/null
@@ -0,0 +1,50 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[0.5]
+PW[GnuGo (GNU Go 3.1.31)]WR[13k*]
+PB[coco]BR[12k]
+PC[NNGS]DT[2002-04-05]AP[gnugoclient:2.0]
+AB[pd][dp]
+;W[dd];B[qp];W[op];B[pn];W[qq];B[rq];W[pq];B[ro];W[kq];B[iq];W[nc]
+;B[pf];W[pb];B[qc];W[kc];B[cf];W[cn];B[cl];W[cq];B[cp];W[en];B[fp]
+;W[el];B[dj];W[dq];B[eq];W[er];B[fr];W[bp];B[bo];W[bq];B[co];W[ds]
+;B[fc];W[df];B[dg];W[ef];B[eg];W[ce];B[cg];W[qh];B[qj];W[oh];B[nf]
+;W[mh]C[L:8];B[lf];W[hc]C[L:9];B[ff];W[gm]C[L:8];B[ed];W[cb]C[L:7]
+;B[de];W[fj]C[L:8];B[gh];W[ee]C[L:9];B[fe];W[rf]C[L:8];B[qe];W[qb]
+C[L:9];B[rb];W[oj]C[L:8];B[pl];W[nl];B[nm];W[om]C[L:9];B[ol];W[nn]
+C[L:8];B[mm];W[on];B[pm];W[nk]C[L:3];B[kn];W[go]C[L:4];B[gp];W[ei]
+;B[di];W[in];B[jo];W[rr];B[sr];W[rs];B[kl];W[il]C[L:3];B[kh];W[li]
+;B[ki];W[be]C[L:4];B[de];W[dc]C[L:0];B[bf];W[gi];B[hh];W[fs]C[L:1]
+;B[gr];W[ri]C[L:2];B[pi];W[ph]C[L:0];B[rj];W[sj];B[sk];W[si];B[rl]
+;W[mp];B[re];W[rg];B[gb];W[hb];B[jr];W[eb]C[L:1];B[ms];W[fb]C[L:0]
+;B[gc];W[jf];B[ld];W[je];B[lc];W[mb];B[lb];W[ga];B[ma];W[kb];B[kd]
+;W[id];B[jd];W[jg];B[jh];W[he];B[jb];W[jc];B[ka];W[ic];B[ia];W[ha]
+;B[ja];W[gd];B[ge];W[af]C[L:1];B[ag];W[ae]C[L:2];B[hf];W[bm]C[L:3]
+;B[bl];W[dn]C[L:4];B[ij];W[jk]C[L:5];B[kk];W[mn]C[L:6];B[lm];W[oi]
+C[L:7];B[lo];W[ni]C[L:8];B[mj];W[ng]C[L:6];B[pj];W[jj]C[L:4];B[ii]
+;W[kj];B[lj];W[sf]C[L:5];B[if];W[ie]C[L:6];B[ho];W[kp];B[ko];W[mo]
+C[L:5];B[io];W[hn]C[L:3];B[lh];W[am]C[L:0];B[al];W[ao];B[bn];W[an]
+C[L:1];B[cm];W[fo];B[dm];W[fm]C[L:2];B[mg];W[mi]C[L:3];B[og];W[sh]
+C[L:4];B[jm];W[fh]C[L:5];B[eh];W[ap];B[fg];W[hk]C[L:6];B[fi];W[hi]
+C[L:7];B[ej];W[ek]C[L:8];B[gj];W[hj]C[L:7];B[fk];W[im];B[jl];W[ik]
+C[L:2];B[os];W[pr]C[L:0];B[po];W[nr];B[ns];W[ml];B[lk];W[gk];B[fj]
+;W[fl];B[ps];W[mr];B[lr];W[nq];B[oo];W[kr];B[ks];W[ji];B[ih];W[pg]
+C[L:1];B[of];W[gs]C[L:2];B[hr];W[hs]C[L:3];B[is];W[es]C[L:4];B[ok]
+;W[nj]C[L:5];B[se];W[dk]C[L:6];B[ck];W[ig]C[L:7];B[hg];W[ke]C[L:8]
+;B[le];W[jn]C[L:9];B[ll];W[qf];B[fd];W[kg]C[L:10];B[lg];W[hd];B[nh]
+;W[lq];B[ls];W[ng];B[eo];W[em];B[nh];W[ra];B[sb];W[ng];B[gn];W[fn]
+;B[nh];W[na];B[la];W[ng];B[];W[nh];B[];W[qi];B[];W[ec];B[];W[do]
+;B[ep];W[mk];B[];W[ib];B[];W[dl];B[];W[fa];B[];W[kf];B[];W[]
+C[O17 removed
+Q18 removed
+O19 removed
+N18 removed
+S19 removed
+N5 removed
+L3 removed
+O3 removed
+P4 removed
+Q2 removed
+S1 removed
+final_score: B+53.5
+game adjourned]
+)
diff --git a/regression/games/scoring/score6.sgf b/regression/games/scoring/score6.sgf
new file mode 100644 (file)
index 0000000..9975001
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[qd];W[dp];B[cc];W[pq];B[od];W[qo];B[cn];W[fq];B[bp];W[cq]
+;B[ck];W[jq];B[de];W[qj];B[oo];W[oj];B[nq];W[mc];B[nb];W[cg]
+;B[lo];W[nc];B[oc];W[me];B[qn];W[qg];B[qp];W[qq];B[ro];W[or]
+;B[mj];W[mb];B[ob];W[be];B[fo];W[eg];B[gq];W[bq];B[eq];W[fr]
+;B[ep];W[bo];B[er];W[gr];B[fp];W[hq];B[gp];W[dj];B[fj];W[cj]
+;B[do];W[ap];B[hc];W[jc];B[ec];W[nk];B[po];W[bk];B[gg];W[ff]
+;B[he];W[ib];B[hb];W[ab];B[kb];W[kd];B[jb];W[ee];B[ic];W[je]
+;B[hf];W[pl];B[jg];W[mg];B[rl];W[rk];B[dd];W[rm];B[ll];W[of]
+;B[om];W[dk];B[cl];W[dl];B[bl];W[ak];B[nr];W[dm];B[bn];W[rq]
+;B[jj];W[en];B[eo];W[io];B[gn];W[qe];B[ni];W[rd];B[qc];W[rc]
+;B[rb];W[sb];B[qb];W[na];B[lh];W[fl];B[gl];W[gk];B[fk];W[fh]
+;B[gi];W[fm];B[gm];W[gh];B[hk];W[cm];B[bm];W[co];B[dn];W[df]
+;B[hh];W[ol];B[jm];W[lr];B[ei];W[ch];B[lg];W[mh];B[lf];W[mf]
+;B[le];W[ld];B[bb];W[ac];B[lq];W[im];B[il];W[ir];B[in];W[mr]
+;B[jo];W[ns];B[ip];W[mq];B[mp];W[np];B[no];W[oq];B[pe];W[qf]
+;B[fd];W[ra];B[bs];W[nm];B[pm];W[qm];B[nn];W[mm];B[ml];W[nl]
+;B[lm];W[bc];B[cb];W[es];B[dr];W[kq];B[lp];W[ds];B[cr];W[hp]
+;B[ho];W[fn];B[mn];W[mi];B[li];W[nj];B[lj];W[rn];B[di];W[fi]
+;B[ej];W[hi];B[gj];W[ek];B[ii];W[if];B[ig];W[ie];B[ce];W[cf]
+;B[ge];W[id];B[hd];W[iq];B[jp];W[dh];B[kf];W[ci];B[kp];W[op]
+;B[ba];W[bd];B[mk];W[sn];B[rp];W[pp];B[al];W[ai];B[sp];W[sq]
+;B[fg];W[eh];B[ed];W[lb];B[kc];W[jd];B[ka];W[fe];B[la];W[ma]
+;B[cs];W[fs];B[ar];W[lc];B[ia];W[so];B[qo];W[sl];B[aq];W[cd]
+;B[ao];W[aa];B[jf];W[ke];B[gf];W[ef];B[qa];W[sc];B[sa];W[re]
+;B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score7.sgf b/regression/games/scoring/score7.sgf
new file mode 100644 (file)
index 0000000..7bade12
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pc];W[pp];B[ce];W[cq];B[pe];W[jd];B[dc];W[pj];B[nq];W[np]
+;B[mp];W[no];B[oq];W[pq];B[jq];W[pn];B[dp];W[dq];B[ep];W[bo]
+;B[dm];W[ck];B[cl];W[qg];B[rf];W[dk];B[dh];W[qf];B[qe];W[rg]
+;B[re];W[mm];B[ld];W[mq];B[lr];W[mr];B[lq];W[gc];B[lp];W[qj]
+;B[km];W[lk];B[eq];W[jf];B[li];W[mj];B[kk];W[jh];B[ge];W[kc]
+;B[lc];W[hd];B[fl];W[pr];B[ms];W[gq];B[hr];W[ik];B[gr];W[ji]
+;B[kj];W[og];B[gp];W[er];B[fr];W[mg];B[dr];W[cr];B[es];W[lf]
+;B[ke];W[je];B[kf];W[kg];B[hq];W[op];B[nr];W[eb];B[db];W[ec]
+;B[jn];W[fe];B[ff];W[dd];B[cd];W[ee];B[gf];W[da];B[ci];W[cb]
+;B[cc];W[ej];B[bb];W[bj];B[ca];W[bl];B[ea];W[bh];B[bm];W[am]
+;B[an];W[bq];B[cp];W[bs];B[ar];W[gj];B[al];W[bk];B[bi];W[ai]
+;B[bp];W[fb];B[aq];W[eh];B[cs];W[dg];B[gh];W[bf];B[sg];W[sh]
+;B[sf];W[ri];B[ll];W[ml];B[ln];W[lj];B[ki];W[lb];B[mb];W[kb]
+;B[be];W[ma];B[nb];W[nd];B[mc];W[od];B[me];W[le];B[kd];W[md]
+;B[ob];W[pd];B[qc];W[qd];B[rd];W[dl];B[cm];W[gl];B[gm];W[fk]
+;B[fm];W[hl];B[mi];W[hm];B[nj];W[mk];B[hn];W[ni];B[nh];W[oi]
+;B[mh];W[mf];B[ol];W[nf];B[ql];W[nn];B[ok];W[el];B[rn];W[rk]
+;B[rl];W[qm];B[rp];W[rm];B[sm];W[em];B[en];W[in];B[gn];W[im]
+;B[io];W[qo];B[pm];W[qn];B[ro];W[pk];B[pl];W[sk];B[sl];W[om]
+;B[oo];W[nl];B[rr];W[qq];B[rq];W[mn];B[cf];W[rs];B[df];W[qr]
+;B[ef];W[cg];B[af];W[bg];B[hi];W[jj];B[gd];W[hg];B[fh];W[di]
+;B[eg];W[ei];B[hf];W[hh];B[gi];W[gg];B[fg];W[fd];B[oe];W[ne]
+;B[hj];W[de];B[hk];W[fa];B[fi];W[gk];B[lh];W[or];B[mo];W[pf]
+;B[ag];W[ii];B[ig];W[ih];B[if];W[jg];B[ak];W[ie];B[os];W[oh]
+;B[fj];W[na];B[ps];W[oa];B[pa];W[la];B[oc];W[rb];B[qb];W[rc]
+;B[ra];W[sb];B[sd];W[da];B[ij];W[jk];B[jl];W[jm];B[lm];W[ea]
+;B[ng];W[of];B[he];W[hc];B[lg];W[aj];B[am];W[ah];B[ae];W[qs]
+;B[ns];W[kh];B[kl];W[il];B[nc];W[tt];B[tt]
+)
diff --git a/regression/games/scoring/score8.sgf b/regression/games/scoring/score8.sgf
new file mode 100644 (file)
index 0000000..0ef985b
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[dp];B[qo];W[ec];B[pq];W[cd];B[fq];W[hq];B[fo];W[dn]
+;B[fm];W[qf];B[pf];W[pg];B[of];W[qe];B[qd];W[qj];B[nd];W[cj]
+;B[kq];W[jc];B[ir];W[ee];B[id];W[ic];B[hr];W[hd];B[eg];W[lc]
+;B[og];W[ph];B[ql];W[cg];B[cl];W[bm];B[bl];W[er];B[in];W[ie]
+;B[ni];W[pk];B[ko];W[op];B[ig];W[no];B[mc];W[mn];B[ld];W[pl]
+;B[jd];W[rl];B[he];W[gd];B[hf];W[kd];B[je];W[ke];B[jf];W[pp]
+;B[qp];W[oq];B[pr];W[mq];B[qm];W[rm];B[ml];W[lm];B[lb];W[kb]
+;B[kc];W[sp];B[jb];W[lc];B[mb];W[ka];B[el];W[rn];B[qn];W[rq]
+;B[qq];W[rr];B[kf];W[ll];B[kc];W[mk];B[le];W[ib];B[nk];W[nl]
+;B[mj];W[lk];B[ol];W[or];B[nm];W[pm];B[on];W[ki];B[oo];W[jk]
+;B[mh];W[bk];B[bi];W[ci];B[bj];W[al];B[ck];W[ak];B[bh];W[ch]
+;B[cm];W[bn];B[cn];W[bo];B[co];W[cp];B[am];W[an];B[aj];W[eh]
+;B[do];W[fg];B[fr];W[es];B[eq];W[dr];B[dq];W[cq];B[ep];W[lr]
+;B[kr];W[rd];B[rc];W[sd];B[hk];W[sc];B[qc];W[rb];B[qb];W[ej]
+;B[il];W[bg];B[ij];W[ah];B[am];W[bp];B[al];W[lo];B[lj];W[kj]
+;B[hh];W[kn];B[jo];W[oh];B[nh];W[mm];B[oi];W[gi];B[pi];W[qi]
+;B[gh];W[gg];B[fh];W[fi];B[fk];W[lp];B[qk];W[rk];B[pj];W[dk]
+;B[dl];W[ek];B[os];W[ns];B[ps];W[li];B[hp];W[mi];B[nj];W[pe]
+;B[oe];W[qg];B[iq];W[kp];B[jp];W[ro];B[rp];W[po];B[pn];W[jl]
+;B[jm];W[km];B[hi];W[jn];B[im];W[gj];B[gk];W[jj];B[ji];W[jh]
+;B[ii];W[kg];B[lg];W[la];B[ls];W[ms];B[ks];W[lq];B[ra];W[sb]
+;B[fs];W[cr];B[fj];W[ma];B[na];W[ja];B[lh];W[kh];B[nl];W[qr]
+;B[qs];W[rs];B[nn];W[np];B[ik];W[ih];B[hg];W[gf];B[ge];W[ff]
+;B[fd];W[fe];B[ha];W[fc];B[ia];W[hc];B[jb];W[hb];B[gb];W[ed]
+;B[da];W[gc];B[cb];W[eb];B[ea];W[fa];B[bc];W[bd];B[ga];W[fb]
+;B[ja];W[jg];B[db];W[ac];B[ab];W[ba];B[ad];W[re];B[af];W[ag]
+;B[be];W[ai];B[ce];W[dd];B[df];W[dg];B[cf];W[ef];B[hj];W[ei]
+;B[qa];W[sa];B[tt];W[tt]
+)
diff --git a/regression/games/scoring/score9.sgf b/regression/games/scoring/score9.sgf
new file mode 100644 (file)
index 0000000..6b7fa81
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.229 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.229 gmp Random Seed 0] 
+;B[pd];W[pp];B[cq];W[dd];B[qn];W[ql];B[qq];W[qp];B[pq];W[op]
+;B[nq];W[pm];B[fc];W[hc];B[cc];W[dc];B[cd];W[de];B[db];W[eb]
+;B[cb];W[fb];B[ec];W[gc];B[nc];W[oq];B[or];W[pr];B[qr];W[nr]
+;B[ps];W[mq];B[ns];W[dn];B[mr];W[ce];B[fq];W[di];B[np];W[pn]
+;B[qj];W[qg];B[rh];W[nn];B[oj];W[ln];B[og];W[jn];B[fn];W[dl]
+;B[kc];W[qc];B[qd];W[be];B[rc];W[hn];B[iq];W[gm];B[fi];W[eg]
+;B[lp];W[kn];B[fd];W[fo];B[gn];W[go];B[ge];W[jb];B[qh];W[rq]
+;B[pg];W[kp];B[mp];W[kb];B[kr];W[na];B[qb];W[lc];B[kd];W[gg]
+;B[hi];W[ig];B[ie];W[ji];B[io];W[co];B[in];W[im];B[rn];W[kg]
+;B[rl];W[rk];B[rm];W[mk];B[qk];W[mi];B[eq];W[bp];B[bq];W[aq]
+;B[ar];W[ap];B[bs];W[le];B[ld];W[md];B[mc];W[lb];B[me];W[he]
+;B[hf];W[hd];B[hg];W[if];B[gf];W[ke];B[gh];W[gj];B[hj];W[mf]
+;B[nd];W[ep];B[dp];W[do];B[fg];W[id];B[ee];W[ef];B[nf];W[mg]
+;B[fj];W[gk];B[eh];W[ho];B[dh];W[ch];B[hp];W[ci];B[ff];W[df]
+;B[ih];W[rr];B[jj];W[pk];B[cp];W[bo];B[pc];W[oi];B[pj];W[ok]
+;B[nh];W[jo];B[ip];W[ni];B[jh];W[ki];B[kh];W[oh];B[ng];W[pa]
+;B[qf];W[ii];B[ij];W[qo];B[rg];W[ac];B[ro];W[rp];B[kj];W[li]
+;B[kl];W[il];B[jm];W[jl];B[ml];W[ll];B[lk];W[lm];B[nk];W[mj]
+;B[nj];W[nl];B[ol];W[mm];B[pl];W[om];B[qm];W[rs];B[lh];W[mh]
+;B[fk];W[fm];B[dk];W[ck];B[el];W[qs];B[pr];W[jq];B[jr];W[kq]
+;B[lq];W[fp];B[gq];W[mo];B[dm];W[cl];B[em];W[cm];B[en];W[jc]
+;B[eo];W[jd];B[md];W[mb];B[dj];W[fl];B[ek];W[ei];B[no];W[qa]
+;B[ra];W[ob];B[lo];W[oo];B[jk];W[on];B[cj];W[bj];B[sp];W[oc]
+;B[od];W[pi];B[qi];W[nb];B[sq];W[pb];B[sr];W[mn];B[ph];W[ko]
+;B[gp];W[hm];B[jp];W[ss];B[so];W[tt];B[tt]
+)
diff --git a/regression/games/seki01.sgf b/regression/games/seki01.sgf
new file mode 100644 (file)
index 0000000..e9250fe
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-10]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ia][la][na][ib][lb][nb][qb][rb][sb][ic][lc][nc][id][nd][ie][ne][oe][pe][qe][re][se][ef][ff][gf][hf][if][jf][kf][lf][mf][nf][of][eg][hg][ng][qg][rg][bh][eh][ih][jh][nh][rh][ei][ii][ni][oi][pi][ej][jj][nj][pj][qj][rj][sj][fk][gk][hk][ik][jk][kk][lk][mk][nk][el][fl][jl][ol][em][km][lm][om][en][fn][kn][on][fo][go][ho][io][oo][ip][mp][np][op][iq][jq][kq][lq][mq]
+AB[ja][ma][pa][ra][jb][kb][mb][pb][kc][mc][pc][qc][rc][sc][kd][md][ke][le][me][pf][qf][rf][sf][ig][jg][kg][lg][og][sg][gh][hh][lh][oh][ph][qh][gi][ji][ki][li][qi][ri][si][gj][hj][ij][kl][ll][ml][nl][gm][hm][im][jm][nm][in][ln][mn][nn][jo][ko][lo]
+)
diff --git a/regression/games/seki02.sgf b/regression/games/seki02.sgf
new file mode 100644 (file)
index 0000000..972e12f
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[da][fa][ha][ia][db][eb][fb][ib][fc][ic][ed][gd][id][de][ee][fe][ge][ef][gf][eg][gg][hg][ig][dh][eh][di]
+AB[ba][ga][bb][gb][bc][cc][dc][gc][hc][ad][bd][dd][hd][ae][he][af][bf][df][hf][if][bg][cg][dg][fg][bh][fh][gh][hh][ih][bi][fi][hi]
+)
diff --git a/regression/games/seki03.sgf b/regression/games/seki03.sgf
new file mode 100644 (file)
index 0000000..fad00ed
--- /dev/null
@@ -0,0 +1,22 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.42]
+GN[seki03]
+PB[GNU Go 3.3.11 (random seed 539646653)]
+PW[GNU Go 3.3.11 (random seed 539646653)]
+AB[ad][al][an][ao][bc][be][bf][bl][bm][bn][cc][cg][ch][ck][cn][dd][dh]
+[di][dm][ed][ei][ek][el][em][en][eo][fd][fh][fi][fk][fm][fo][fp][fr][gd]
+[gi][gj][gk][gr][gs][hd][he][hk][hl][hm][hq][hs][ie][ij][ik][im][io][ip]
+[iq][jc][je][ji][jk][jl][jq][kc][kd][ke][kf][kh][ki][kk][kr][la][lb][lc]
+[li][lj][lp][lq][lr][mb][mh][mk][mp][mr][ms][nh][ni][ns][of][og][oh][pb]
+[pc][pe][pi][pm][po][qa][qb][qd][qf][qh][qj][qk][ql][qm][qn][qo][rn][sm]
+AW[ap][bd][bo][bq][cd][ce][cf][co][cq][de][df][dg][dn][do][dp][ee][eg]
+[eh][ep][er][es][fe][ff][fg][fl][fn][fq][fs][ge][gh][gl][gm][gn][go][gp]
+[gq][hf][hi][hj][hn][if][ih][ii][in][jf][jh][jm][jo][jp][kg][kl][kn][kp]
+[kq][ld][le][lf][lg][lh][lk][ll][lo][ma][mc][md][mg][mi][mj][mm][mo][mq]
+[na][nb][nf][ng][nj][nk][np][nq][nr][oa][ob][oc][od][oe][oi][oj][om][on]
+[oo][or][os][pa][pd][pj][pk][pl][pn][pp][qp][qq][ro][rq][sn][so][sp]
+)
diff --git a/regression/games/seki04.sgf b/regression/games/seki04.sgf
new file mode 100644 (file)
index 0000000..ea355d3
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][bb][cb][ac][ad][cd][ed][ae][be][ce][ee][fe][cf][df][ef][ff][gf][hf][if][dg][gg][eh][fh][gh][hh][ih][ei][gi]
+AB[aa][ba][da][db][fb][gb][hb][ib][bc][cc][dc][ec][fc][bd][dd][fd][de][ge][he][ie][af][bf][bg][cg][ch][dh][di]
+)
diff --git a/regression/games/seki05.sgf b/regression/games/seki05.sgf
new file mode 100644 (file)
index 0000000..9275bb8
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][cb][ac][bc][cc][ad][cd][ed][ae][ce][ee][fe][af][bf][cf][df][ef][ff][gf][hf][if][fg][fh][gh][hh][ih][fi][hi]
+AB[aa][ba][da][bb][db][fb][gb][hb][ib][dc][ec][fc][dd][fd][de][ge][he][ie][ag][bg][cg][dg][eg][eh][ei]
+)
diff --git a/regression/games/seki06.sgf b/regression/games/seki06.sgf
new file mode 100644 (file)
index 0000000..839431d
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[bb][cb][ac][cc][ad][cd][ed][ae][be][ce][ee][fe][cf][df][ef][ff][gf][hf][eg][hg][eh][fh][gh][hh][ih][ei][gi]
+AB[aa][ba][da][db][fb][gb][hb][ib][dc][ec][fc][dd][fd][de][ge][he][ie][af][bf][if][bg][cg][dg][ig][dh][di]
+)
diff --git a/regression/games/seki07.sgf b/regression/games/seki07.sgf
new file mode 100644 (file)
index 0000000..cfca716
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][cb][ac][bc][cc][ad][cd][ed][ae][be][ce][ee][fe][cf][df][ef][ff][gf][hf][if][eg][gg][fh][gh][hh][ih][fi]
+AB[aa][ba][da][bb][db][fb][gb][hb][ib][dc][ec][fc][dd][fd][de][ge][he][ie][af][bf][bg][cg][dg][dh][eh][ei]
+)
diff --git a/regression/games/seki08.sgf b/regression/games/seki08.sgf
new file mode 100644 (file)
index 0000000..58cdb8e
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[bb][cb][ac][bc][ad][cd][ed][ae][ce][de][ee][fe][af][bf][cf][ef][gf][hf][dg][eg][fg][gg][ig][gh][hh][ih][gi]
+AB[aa][ba][da][ab][db][fb][gb][hb][ib][cc][dc][ec][fc][dd][fd][ge][he][ie][if][ag][bg][cg][dh][eh][fh][fi]
+)
diff --git a/regression/games/seki09.sgf b/regression/games/seki09.sgf
new file mode 100644 (file)
index 0000000..50b8323
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][bb][cb][ac][ad][cd][ed][ae][be][ce][de][ee][af][ef][ff][gf][hf][if][eg][eh][fh][gh][hh][ih][di][ei][gi]
+AB[ba][da][db][fb][gb][hb][ib][bc][cc][dc][ec][fc][bd][dd][fd][fe][ge][he][ie][bf][cf][df][ag][bg][dg][ch][dh]
+)
diff --git a/regression/games/seki10.sgf b/regression/games/seki10.sgf
new file mode 100644 (file)
index 0000000..6bbacfc
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][bb][cb][ac][ad][cd][ed][ae][ce][ee][fe][af][bf][cf][df][ff][gf][hf][if][dg][eg][gg][fh][gh][hh][ih][fi][gi]
+AB[aa][ba][da][db][fb][gb][hb][ib][bc][cc][dc][ec][fc][bd][dd][fd][gd][be][de][ge][he][ie][ag][bg][cg][ch][dh][eh][ei]
+)
diff --git a/regression/games/seki11.sgf b/regression/games/seki11.sgf
new file mode 100644 (file)
index 0000000..4b55bc6
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][cb][ac][bc][cc][ad][cd][ed][ae][ce][ee][fe][af][bf][cf][df][ef][gf][hf][eg][fg][gg][ig][fh][hh][ih][fi][gi]
+AB[ba][da][bb][db][fb][gb][hb][ib][dc][ec][fc][dd][fd][de][ge][he][ie][if][ag][bg][cg][dg][dh][eh][ei]
+)
diff --git a/regression/games/seki12.sgf b/regression/games/seki12.sgf
new file mode 100644 (file)
index 0000000..e23b4ab
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[cb][ac][bc][cc][ad][cd][dd][ed][ae][be][ce][ee][fe][df][ef][gf][hf][eg][fg][gg][ig][fh][hh][ih][fi][gi]
+AB[aa][ba][da][bb][db][fb][gb][hb][ib][dc][ec][fc][fd][ge][he][ie][af][bf][cf][if][cg][dg][dh][eh][ei]
+)
diff --git a/regression/games/seki13.sgf b/regression/games/seki13.sgf
new file mode 100644 (file)
index 0000000..dca0e98
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[cb][ac][bc][cc][ec][ad][cd][ed][ae][be][ce][de][ee][fe][ef][gf][hf][eg][fg][gg][ig][fh][hh][ih][fi][gi]
+AB[aa][ba][da][ab][bb][db][eb][fb][gb][hb][ib][dc][fc][dd][fd][ge][he][ie][af][bf][cf][df][if][dg][dh][eh][ei]
+)
diff --git a/regression/games/seki14.sgf b/regression/games/seki14.sgf
new file mode 100644 (file)
index 0000000..7ae0f07
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[bb][cb][ac][cc][ad][bd][cd][ed][ce][de][ee][cf][ef][ff][gf][hf][if][cg][dg][eg][gg][fh][gh][hh][ih][ai][fi]
+AB[aa][ba][da][db][fb][gb][hb][ib][dc][ec][fc][dd][fd][ae][be][fe][ge][he][ie][bf][ag][bg][ch][dh][eh][ci][ei]
+)
diff --git a/regression/games/seki15.sgf b/regression/games/seki15.sgf
new file mode 100644 (file)
index 0000000..fb7d6bc
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-10-05]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[bb][cb][ac][cc][ad][cd][ed][ae][be][ce][de][ee][bf][ef][ff][gf][hf][if][ag][bg][fg][hg][gh][hh][ih][gi]
+AB[aa][ba][da][db][fb][gb][hb][ib][dc][ec][fc][dd][fd][fe][ge][he][ie][cg][dg][eg][ah][bh][fh][ei][fi]
+)
diff --git a/regression/games/seki16.sgf b/regression/games/seki16.sgf
new file mode 100644 (file)
index 0000000..0bebe1f
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]KM[5.5];
+AW[cb][ac][bc][cc][ec][ad][bd][cd][dd][ed][ce][de][ee][fe][df][ef][gf][hf][eg][fg][ig][fh][gh][hh][ih][fi]
+AB[aa][ba][da][ab][bb][db][eb][fb][gb][hb][ib][dc][fc][fd][ae][be][ge][he][ie][bf][cf][if][cg][dg][dh][eh][ei]
+)
diff --git a/regression/games/seki_exotics/README b/regression/games/seki_exotics/README
new file mode 100644 (file)
index 0000000..5844390
--- /dev/null
@@ -0,0 +1,4 @@
+Files in this directory have not yet been used in tests.
+
+
+
diff --git a/regression/games/seki_exotics/README-MANNER b/regression/games/seki_exotics/README-MANNER
new file mode 100644 (file)
index 0000000..885cb2c
--- /dev/null
@@ -0,0 +1,189 @@
+
+Some remarks concerning the files collected:
+
+seki1.sgf
+
+The "classical" seki. gnugo plays correctly, but the score is wrong.
+
+seki2.sgf
+
+Each side has an eye
+
+seki3.sgf
+
+Another one.
+
+seki_stupid.sgf
+
+Here i wanted to see, if gnugo plays the stupid move C 1. Well it doesnt.
+But maybe it is good to keep the file, just to make sure that future
+"improvements" dont spoil it.
+
+sekichallenge.sgf
+
+Thats what it is. gnugo makes mistakes and loses everything. But i get
+the impression that the reading depth is just a little bit too short.
+
+seki_score.sgf
+
+a seki. unless i counted it wrongly, assuming an equal number of
+prisoners
+the japanese rules give:
+
+territory b 96  w 97
+prisoners b  0  w  0
+seki      b  0  w  0
+
+the chinese rules give:
+
+territory b 96  w 97
+stones    b 79  w 79
+seki      b 8.5 w 1.5
+
+so there is a difference of 7 points, depending on which rules you take.
+
+twoko_seki1.sgf
+
+A double ko seki. with the present program and playing japanese rules
+the eternal loop can only be avoided, if both players have enough
+intelligence to see that it is impossible to win. i said already
+before that i think that the program is wrong. that is after two
+passes, i thought the game is finished, but do_pass allows gnugo
+to play another move, so the loop continues. if we change do_pass,
+it would be good enough to have one intelligent player to avoid
+the loop. Since we know nothing about the intelligence of our
+opponent, the intelligent player would have to be gnugo.
+So if we stick to japanese rules, this needs a detailed analysis
+of the situation.
+In principle the japanese rules define in their precedents
+that this position is seki, should gnugo know the precedents ?
+chinese rules avoid the loop and give the interesting result, that
+whoever insists on playing, loses everything. maybe not everybody
+knows that already by heart, so it goes like this:
+
+w takes ko 1
+b takes ko 2
+w tenuki
+b takes ko 1
+w takes ko 2
+b tenuki
+
+finally there will be no playable point left on the board.
+lets assume that b has played the last possible move.
+then if w insists:
+
+w takes ko 1
+b takes ko 2
+w passes
+b takes ko 1
+
+now w would like to take ko 2, but that is forbidden, because it
+reproduces a position, which has already existed before.
+so
+
+w passes
+b takes all.
+
+If there is another ko somewhere else on the board, then this
+double ko would be an example of what Ing calls a disturbing ko.
+
+
+twoko_seki2.sgf
+
+Another double ko seki. twoko_seki1 has two groups with an eye each,
+this one has one liberty common to both groups.
+
+twoko_live.sgf
+
+B is alive.
+
+
+twoko_dead.sgf
+
+W is dead.
+
+
+fourko.sgf
+
+A quadruple ko. I have never heard about that, but i guess the
+japanese will have to cancel the game. with chinese rules one
+can play it of course, but it is rather tricky.
+
+onadare_ko.sgf
+
+The double ko variation of the onadare joseki.
+
+onadare_ko2.sgf
+
+Here i have added a ko in the lower right corner. This is completely
+different from twoko_seki1.sgf plus another ko. here the black group
+in the double ko is alive. however white has an unlimited supply
+of ko threats, so it will win any other ko. If i understand this
+correctly, the japanese do not consider this to be a triple ko
+I thought that Ing should call the double ko a "fighting ko",
+but apparently he doesnt. So the Ing rules would have to treat
+the two cases twoko_seki1.sgf plus another ko and the present one
+the same way.
+gnugo does not know how to handle this.
+
+bent4.sgf
+
+gnugo handles this correctly. when i said maybe for the wrong reasons
+Gunnar said, what do i mean. well first one should look, if it does
+all possible variations correctly. But what i really was afraid of, was
+maybe it treats it the same way it handles seki. only for seki it is
+wrong and here it is right. anyway, whenever the seki has been fixed, 
+one should look, if this is still ok.
+
+bent4_2.sgf
+
+Another one. This one is also handled correctly.
+
+
+seki_bent4.sgf
+
+The combination of a bent4 with a seki, which gives an unremovable
+ko threat. The japanese rules kill the bent4 anyway. gnugo has
+various difficulties.
+
+
+doublebent4.sgf
+
+I guess the japanese rules say that both groups are dead ???
+Apart from that gnugo handles it correctly.
+
+threeko1.sgf
+
+The "classical" triple ko. i guess, if we play japanese rules,
+gnugo should realise that the game should be cancelled.
+Playing chinese rules one can usually neutralise two ko's
+and then play the one which is remaining as before.
+
+threeko2.sgf
+
+This is a fake. white can never win this.
+
+threeko3.sgf
+
+Similar to threeko2.sgf, with a slight difference. If it is
+white's turn it can play B 5 and then it becomes a double ko
+which black cannot win.
+If it is black's turn, the japanese will cancel the game and
+for the chinese white can never win.
+
+chosei.sgf
+
+A chosei( long life / eternal life ).
+Apart from the fact that the game should be cancelled,
+gnugo makes a lot of mistakes and loses everything.
+It seems everybody who writes about that, shows the same diagram.
+Maybe this is the only one ?
+If people think that this is interesting, I would have to do
+some work.
+
+junkan-ko.sgf
+
+A junkan-ko (round robin ko). Everything I wrote about chosei
+is valid here as well. i thought a little about these positions,
+but i dont want to bore everybody, unless somebody really wants
+to hear about it.
diff --git a/regression/games/seki_exotics/bent4.sgf b/regression/games/seki_exotics/bent4.sgf
new file mode 100644 (file)
index 0000000..017547d
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[ea][eb][ec][ed][ee][af][bf][ef][ff][bg][fg][bh][ch][dh][fh][di][fi]
+AB[da][db][dc][dd][ae][be][ce][de][cf][cg][dg][eg][ah][eh][bi][ei]
+)
diff --git a/regression/games/seki_exotics/bent4_2.sgf b/regression/games/seki_exotics/bent4_2.sgf
new file mode 100644 (file)
index 0000000..9683ec3
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[fa][fb][fc][fd][fe][af][bf][cf][ff][cg][dg][eg][fg][fh][ai][bi][ci][fi]
+AB[ga][gb][gc][gd][ge][he][gf][ag][bg][gg][bh][ch][dh][eh][gh][ei][gi]
+)
diff --git a/regression/games/seki_exotics/chosei.sgf b/regression/games/seki_exotics/chosei.sgf
new file mode 100644 (file)
index 0000000..7ed6e4f
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[bf][cf][df][ef][ff][hf][fg][bh][ch][dh][gh][hh][bi][fi]
+AB[bg][cg][dg][eg][ah][eh][fh][di][gi]
+PL[B]
+)
diff --git a/regression/games/seki_exotics/doublebent4.sgf b/regression/games/seki_exotics/doublebent4.sgf
new file mode 100644 (file)
index 0000000..bec832f
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[aa][ba][fa][ga][ab][fb][gb][hb][dc][ec]
+[fc][gc][dd][ed][fd][gd][hd][id][ae][be][ce][de]
+AB[da][ea][ia][bb][cb][db][eb][ib][bc][cc]
+[ic][ad][bd][cd][ee][fe][ge][he][ie][af][bf][cf][df][ef]
+)
diff --git a/regression/games/seki_exotics/fourko.sgf b/regression/games/seki_exotics/fourko.sgf
new file mode 100644 (file)
index 0000000..50d61c7
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]HA[0]
+;AW[be][ce][de][ee][fe][af][bf][ff][gf][ag]
+[eg][gg][ah][bh][fh][gh][ai][ci][gi]
+AB[ad][bd][cd][dd][ed][fd][gd][ae][ge][he]
+[cf][df][ef][hf][bg][dg][hg][ch][dh][eh][hh][di][fi][hi]
+)
diff --git a/regression/games/seki_exotics/junkan-ko.sgf b/regression/games/seki_exotics/junkan-ko.sgf
new file mode 100644 (file)
index 0000000..6590854
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+;AW[da][ga][ha][db][eb][hb][dc][fc][hc][dd]
+[fd][hd][de][ee][he][df][hf][dg][hg][dh][eh][hh][fi][gi][hi]
+AB[ca][fa][cb][fb][gb][cc][gc][cd][gd][ce]
+[fe][ge][cf][ef][gf][cg][eg][gg][ch][fh][gh][ci][di][ei]
+)
diff --git a/regression/games/seki_exotics/onadare_ko.sgf b/regression/games/seki_exotics/onadare_ko.sgf
new file mode 100644 (file)
index 0000000..4c572d6
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]HA[0]
+;B[cd];W[ed];B[ec];W[dd];B[dc];W[ce];B[fc];W[fd];B[gd];W[cc];B[bd];
+W[cb];B[bc];W[gc];B[hc];W[bb];B[be];W[gb];B[fb];W[hb];B[db];W[ic];
+B[ge];W[ef];B[cf];W[ff];B[ie];W[lc];B[hg];W[ei];B[tt];W[da];B[ea];
+W[ba];B[ga];W[ha];B[ab]
+)
diff --git a/regression/games/seki_exotics/onadare_ko2.sgf b/regression/games/seki_exotics/onadare_ko2.sgf
new file mode 100644 (file)
index 0000000..221c0d2
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]HA[0]
+;AW[ba][da][ha][bb][cb][gb][hb][cc][gc][ic]
+[lc][dd][ed][fd][ce][ef][ff][ei][no][oo]
+[po][qo][ro][so][mp][np][jq][kq][lq][mq]
+[pq][qq][rq][sq][jr][or][qr][sr][js][ps][qs][rs][ss]
+;AB[ea][ga][ab][db][fb][bc][dc][ec][fc][hc]
+[bd][cd][gd][be][ge][ie][cf][hg][op][pp]
+[qp][rp][sp][nq][oq][kr][lr][mr][nr][ks][ms][os]
+PL[W]
+)
diff --git a/regression/games/seki_exotics/seki1.sgf b/regression/games/seki_exotics/seki1.sgf
new file mode 100644 (file)
index 0000000..43dac90
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[fa][fb][fc][fd][gd][ge][gf][ag][bg][cg]
+[dg][eg][fg][gg][gh][bi][ci][di][gi]
+AB[ga][gb][hb][ib][gc][hc][hd][he][hf][hg]
+[ah][bh][ch][dh][eh][fh][hh][fi][hi]
+)
diff --git a/regression/games/seki_exotics/seki2.sgf b/regression/games/seki_exotics/seki2.sgf
new file mode 100644 (file)
index 0000000..1505c4b
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+(
+;AW[fa][fb][fc][fd][fe][df][ef][ff][gf][ag]
+[bg][cg][gg][ah][ch][gh][ai][bi][ci][gi]
+AB[ea][cb][eb][cc][ec][cd][ed][ce][de][ee]
+[af][bf][cf][dg][eg][fg][dh][fh][ei][fi]
+)
+)
diff --git a/regression/games/seki_exotics/seki3.sgf b/regression/games/seki_exotics/seki3.sgf
new file mode 100644 (file)
index 0000000..fc9926b
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[ca][ea][cb][db][eb][ac][bc][cc][fc][gc]
+[cd][dd][gd][ce][fe][ge][ef][gf][hf][bg][eg]
+[fg][ig][ah][bh][fh][hh][ei][fi][gi][hi]
+AB[ba][fa][ab][fb][gb][hb][dc][ec][hc][ad]
+[bd][ed][fd][hd][be][de][ee][he][ie][af][bf]
+[cf][df][if][dg][ch][dh][eh][gh][bi][di]
+)
diff --git a/regression/games/seki_exotics/seki_bent4.sgf b/regression/games/seki_exotics/seki_bent4.sgf
new file mode 100644 (file)
index 0000000..42d6b5f
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+;AW[da][ha][ab][cb][db][hb][bc][cc][hc][ad]
+[bd][gd][be][ce][ge][he][ie][gf][eg][fg][gg][eh][ih][ei][hi]
+AB[ba][ea][ga][bb][eb][gb][dc][ec][gc][cd]
+[dd][fd][ae][de][fe][af][bf][cf][ef][ff]
+[hf][if][dg][hg][dh][fh][gh][hh][di][fi]
+PL[W]
+)
diff --git a/regression/games/seki_exotics/seki_challenge.sgf b/regression/games/seki_exotics/seki_challenge.sgf
new file mode 100644 (file)
index 0000000..0a834d4
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[ac][bc][cc][dc][ec][ed][ae][be][ee][fe]
+[bf][ff][bg][dg][fg][gg][hg][bh][dh][fh][hh][bi][di][hi]
+AB[ad][bd][cd][dd][de][cf][df][ef][ag][cg]
+[eg][ah][ch][eh][gh][ai][ci][fi][gi]
+)
diff --git a/regression/games/seki_exotics/seki_exotics.tgz b/regression/games/seki_exotics/seki_exotics.tgz
new file mode 100644 (file)
index 0000000..df33b94
Binary files /dev/null and b/regression/games/seki_exotics/seki_exotics.tgz differ
diff --git a/regression/games/seki_exotics/seki_score.sgf b/regression/games/seki_exotics/seki_score.sgf
new file mode 100644 (file)
index 0000000..206ae99
--- /dev/null
@@ -0,0 +1,22 @@
+(;GM[1]FF[3]RU[Japanese]SZ[19]HA[0]
+(
+;AW
+[la][pa][lb][pb][lc][pc][sc][ld][md][nd]
+[od][pd][qd][rd][sd][aj][bj][cj][dj][ej]
+[fj][gj][hj][ij][jj][kj][lj][mj][nj][oj]
+[pj][qj][rj][sj][cm][km][lm][an][bn][hn]
+[in][jn][mn][nn][on][qn][co][do][eo][fo]
+[go][po][dp][jp][mp][qp][rp][sp][iq][jq]
+[kq][lq][mq][nq][ar][br][fr][gr][hr][nr]
+[or][rr][sr][bs][cs][ds][es][os][rs]
+AB
+[ka][kb][kc][kd][ae][be][ce][de][ee][fe]
+[ge][he][ie][je][ke][le][me][ne][oe][pe]
+[qe][re][se][sf][ai][bi][ci][di][ei][fi]
+[gi][hi][ii][ji][ki][li][mi][ni][oi][pi]
+[qi][ri][si][kn][ln][ao][bo][ho][io][jo]
+[mo][no][oo][ap][cp][ep][fp][gp][ip][kp]
+[lp][np][pp][aq][bq][dq][fq][gq][hq][oq]
+[qq][rq][sq][cr][dr][er][pr][qr][ps]
+)
+)
diff --git a/regression/games/seki_exotics/seki_stupid.sgf b/regression/games/seki_exotics/seki_stupid.sgf
new file mode 100644 (file)
index 0000000..f01dc59
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+;AW[ad][bd][cd][ce][de][ee][fe][ge][gf][cg][dg][eg][gg][bh][ch][eh][gh][di][ei][gi]
+AB[ae][be][bf][cf][df][ef][ff][ag][bg][fg][ah][fh][bi][fi]
+PL[B]
+)
diff --git a/regression/games/seki_exotics/threeko1.sgf b/regression/games/seki_exotics/threeko1.sgf
new file mode 100644 (file)
index 0000000..a94b8fc
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[ce][de][ee][af][bf][cf][ef][ff][bg][dg]
+[fg][ah][fh][gh][gi]
+AB[bd][cd][dd][ed][fd][ae][be][fe][ge][gf]
+[cg][eg][gg][hg][bh][ch][dh][eh][hh][ai][bi][di][fi][hi]
+PL[B]
+)
diff --git a/regression/games/seki_exotics/threeko2.sgf b/regression/games/seki_exotics/threeko2.sgf
new file mode 100644 (file)
index 0000000..671b832
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[ae][ce][de][ee][bf][cf][ef][ff][ag][bg]
+[dg][fg][ah][fh][gh][gi]
+AB[ad][bd][cd][dd][ed][fd][be][fe][ge][gf]
+[cg][eg][gg][hg][bh][ch][dh][eh][hh][ai][bi][di][fi][hi]
+)
diff --git a/regression/games/seki_exotics/threeko3.sgf b/regression/games/seki_exotics/threeko3.sgf
new file mode 100644 (file)
index 0000000..723f2cb
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+;AW[ba][ea][fa][ha][bb][fb][gb][bc][ec][fc]
+[bd][dd][fd][ae][ee][fe][bf][cf][df][dg][dh][di]
+AB[ca][da][ia][cb][eb][hb][ib][cc][dc][gc]
+[hc][cd][gd][ce][de][ge][ef][ff][gf][eg][eh][ei]
+)
diff --git a/regression/games/seki_exotics/twoko_dead.sgf b/regression/games/seki_exotics/twoko_dead.sgf
new file mode 100644 (file)
index 0000000..a0e09b7
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+(
+;AW[ba][ab][cb][bc][ad]
+AB[ca][ea][db][cc][ec][bd][cd][ae][bf]
+)
+)
diff --git a/regression/games/seki_exotics/twoko_live.sgf b/regression/games/seki_exotics/twoko_live.sgf
new file mode 100644 (file)
index 0000000..20e949b
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+;AW[aa][ca][ea][bb][eb][ec][ed][ae][be][ce][de][ee]
+AB[da][ab][cb][db][bc][dc][ad][bd][cd][dd]
+PL[W]
+)
diff --git a/regression/games/seki_exotics/twoko_seki1.sgf b/regression/games/seki_exotics/twoko_seki1.sgf
new file mode 100644 (file)
index 0000000..dd268f8
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]RU[Japanese]SZ[9]HA[0]
+;AW[ae][be][ce][de][ee][fe][af][ef][ff][gf]
+[ag][eg][gg][ah][bh][fh][gh][ai][ci][gi]
+AB[ad][bd][cd][dd][ed][fd][gd][ge][he][bf]
+[cf][df][hf][bg][dg][hg][ch][dh][eh][hh][di][fi][hi]
+)
diff --git a/regression/games/seki_exotics/twoko_seki2.sgf b/regression/games/seki_exotics/twoko_seki2.sgf
new file mode 100644 (file)
index 0000000..d4e845b
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[3]SZ[9]RU[Japanese]HA[0]
+;AW[ha][hb][hc][hd][he][af][bf][df][ef][ff]
+[hf][bg][cg][dg][fg][hg][ah][gh][hh][gi]
+AB[ga][gb][gc][gd][ae][be][ce][de][ee][fe]
+[ge][cf][gf][eg][gg][bh][dh][fh][ai][bi][ci][di][ei][fi]
+)
diff --git a/regression/games/seki_nakade1.sgf b/regression/games/seki_nakade1.sgf
new file mode 100644 (file)
index 0000000..cd7efb6
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[1]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.53]\r
+AB[da][ea][fa][ab][ac][cd][ed][fd][gd][dd][ic][ib][hc][bc]\r
+AW[ba][bb][cb][db][eb][fb][gb][hb][ha]\r
+GN[seki3]\r
+)\r
diff --git a/regression/games/seki_nakade2.sgf b/regression/games/seki_nakade2.sgf
new file mode 100644 (file)
index 0000000..76a73c0
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[1]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.53]\r
+AB[gb][hb][ib][ea][eb][ec][ff][he][hf][de][dd][cc][ef]\r
+AW[fa][fb][fc][gd][hd][id][fd]\r
+GN[seki1]\r
+)\r
diff --git a/regression/games/self_play/354-34-1.sgf b/regression/games/self_play/354-34-1.sgf
new file mode 100644 (file)
index 0000000..5ad0c41
--- /dev/null
@@ -0,0 +1,41 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.5.4 (random seed 20459129)]
+PB[GNU Go 3.4 (random seed 152016575)]
+RU[Japanese]
+RE[B+14.5]
+;B[pd];W[dp];B[pq];W[ec];B[pk];W[id];B[po];W[nd];B[pf];W[pc];B[qc];W[oc]
+;B[qb];W[cd];B[fq];W[cj];B[iq];W[cn];B[dr];W[cq];B[nf];W[fo];B[lf];W[io]
+;B[ko];W[jm];B[ee];W[lm];B[mn];W[df];B[ff];W[nk];B[pm];W[oi];B[nj];W[kd]
+;B[fh];W[gd];B[ei];W[ek];B[pi];W[dh];B[mk];W[oj];B[pj];W[ok];B[na];W[cr]
+;B[ig];W[jp];B[mq];W[jq];B[ir];W[er];B[kr];W[hk];B[fr];W[nm];B[mi];W[ml]
+;B[eq];W[me];B[ge];W[mb];B[fd];W[fc];B[ma];W[he];B[gc];W[hd];B[mf];W[hf]
+;B[lb];W[jb];B[lk];W[jk];B[ki];W[ni];B[mj];W[nn];B[no];W[nb];B[cs];W[oa]
+;B[br];W[jr];B[js];W[lp];B[lo];W[lq];B[mp];W[lr];B[mr];W[on];B[pn];W[oo]
+;B[op];W[ls];B[ms];W[ks];B[bq];W[bp];B[aq];W[ap];B[eg];W[dg];B[hh];W[is]
+;B[gf];W[hp];B[hq];W[dq];B[ds];W[jf];B[eo];W[ep];B[hs];W[jg];B[hg];W[jh]
+;B[ji];W[ii];B[ij];W[hj];B[hi];W[ih];B[fp];W[co];B[fn];W[go];B[em];W[jj]
+;B[gi];W[dn];B[fj];W[pb];B[en];W[fk];B[dl];W[bl];B[qa];W[di];B[ed];W[dd]
+;B[gm];W[jl];B[ol];W[om];B[mm];W[ll];B[nl];W[oe];B[pe];W[de];B[ef];W[kh]
+;B[lh];W[kj];B[li];W[le];B[kf];W[ej];B[gj];W[gk];B[eh];W[if];B[pa];W[la]
+;B[ne];W[od];B[ke];W[je];B[kp];W[kq];B[of];W[gp];B[gq];W[kg];B[ip];W[hn]
+;B[jo];W[hm];B[jn];W[in];B[km];W[kl];B[kn];W[ln];B[mo];W[lg];B[mg];W[lj]
+;B[mh];W[kk];B[];W[]
+;TW[aa][ba][ca][da][ea][fa][ga][ha][ia][ja][ka][ma]
+[na][ab][bb][cb][db][eb][fb][gb][hb][ib][kb][ob]
+[ac][bc][cc][dc][hc][ic][jc][kc][lc][mc][nc][ad]
+[bd][jd][ld][md][ae][be][ce][ie][af][bf][cf][ag]
+[bg][cg][ah][bh][ch][ai][bi][ci][aj][bj][dj][ak]
+[bk][ck][dk][ik][al][cl][el][fl][gl][hl][il][am]
+[bm][cm][dm][fm][im][an][bn][gn][ao][bo][do][ho]
+[cp]
+TB[ra][sa][rb][sb][rc][sc][qd][rd][sd][fe][qe][re]
+[se][qf][rf][sf][fg][gg][ng][og][pg][qg][rg][sg]
+[gh][nh][oh][ph][qh][rh][sh][fi][qi][ri][si][qj]
+[rj][sj][qk][rk][sk][pl][ql][rl][sl][nm][om][qm]
+[rm][sm][nn][on][qn][rn][sn][oo][qo][ro][so][np]
+[pp][qp][rp][sp][nq][oq][qq][rq][sq][ar][gr][hr]
+[kr][nr][or][pr][qr][rr][sr][as][bs][es][fs][gs]
+[js][ns][os][ps][qs][rs][ss]
+)
diff --git a/regression/games/self_play/354-34-2.sgf b/regression/games/self_play/354-34-2.sgf
new file mode 100644 (file)
index 0000000..1c5d0db
--- /dev/null
@@ -0,0 +1,41 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.5.4 (random seed 535868965)]
+PB[GNU Go 3.4 (random seed 1604592939)]
+RU[Japanese]
+RE[B+12.5]
+;B[qd];W[dp];B[pq];W[dd];B[oc];W[qn];B[po];W[pn];B[qo];W[on];B[cn];W[pj]
+;B[fd];W[df];B[dc];W[cc];B[ec];W[cb];B[jc];W[cj];B[qh];W[fq];B[bp];W[cq]
+;B[cl];W[oh];B[mp];W[kq];B[rj];W[bq];B[fm];W[nf];B[lr];W[lf];B[hm];W[fa]
+;B[qf];W[bo];B[gj];W[dh];B[gp];W[ko];B[gq];W[lq];B[mq];W[gr];B[hr];W[fr]
+;B[km];W[oo];B[jk];W[mo];B[lp];W[lo];B[iq];W[kp];B[kr];W[op];B[pr];W[mm]
+;B[ld];W[mi];B[lk];W[mk];B[rl];W[rn];B[ro];W[ji];B[fb];W[ea];B[bj];W[bi]
+;B[bk];W[ai];B[bn];W[cp];B[je];W[jf];B[ke];W[gb];B[gc];W[hb];B[hd];W[ka]
+;B[kb];W[ja];B[kf];W[lj];B[lg];W[ll];B[kk];W[jg];B[mf];W[mg];B[me];W[ne]
+;B[nd];W[mh];B[oe];W[of];B[pf];W[pg];B[qg];W[lb];B[jb];W[ib];B[nb];W[oq]
+;B[or];W[nr];B[mr];W[pp];B[qp];W[nq];B[ns];W[pl];B[kg];W[ij];B[jn];W[hk]
+;B[fk];W[ip];B[go];W[ki];B[io];W[jq];B[jr];W[so];B[rq];W[sp];B[hp];W[ff]
+;B[ik];W[hj];B[hf];W[dk];B[sq];W[ck];B[eb];W[da];B[qk];W[pk];B[dl];W[an]
+;B[am];W[ao];B[ek];W[ej];B[fi];W[gh];B[ci];W[ch];B[dj];W[di];B[jh];W[ih]
+;B[kh];W[cj];B[ig];W[dk];B[gi];W[hg];B[if];W[gf];B[co];W[ap];B[ge];W[ck]
+;B[qi];W[hl];B[il];W[hs];B[is];W[jp];B[gs];W[fs];B[fh];W[hi];B[eo];W[gl]
+;B[ed];W[ee];B[bl];W[ep];B[kl];W[ph];B[lm];W[ml];B[pi];W[oi];B[gm];W[lc]
+;B[do];W[fl];B[el];W[kc];B[ic];W[kd];B[jd];W[fp];B[fo];W[aj];B[np];W[no]
+;B[mc];W[ln];B[ak];W[db];B[ei];W[lh];B[jj];W[hs];B[fg];W[eg];B[fe];W[gg]
+;B[ql];W[gs];B[qm];W[pm];B[mb];W[la];B[ma];W[ia];B[rp];W[sn];B[hc];W[ga]
+;B[qj];W[sl];B[sk];W[sm];B[fj];W[dj];B[jo];W[kj];B[kn];W[eh];B[gk];W[rm]
+;B[];W[]
+;TW[aa][ba][ca][ha][ab][bb][ac][bc][ad][bd][cd][ae]
+[be][ce][de][af][bf][cf][ef][ag][bg][cg][dg][ng]
+[og][ah][bh][hh][nh][ci][ii][li][ni][mj][nj][oj]
+[nk][ok][nl][ol][nm][om][mn][nn][bp][aq][dq][eq]
+[ar][br][cr][dr][er][as][bs][cs][ds][es]
+TB[na][oa][pa][qa][ra][sa][ob][pb][qb][rb][sb][fc]
+[nc][pc][qc][rc][sc][gd][id][md][od][pd][rd][sd]
+[he][ie][le][pe][qe][re][se][jf][rf][sf][jg][rg]
+[sg][rh][sh][ri][si][sj][rk][al][jl][bm][cm][dm]
+[em][im][jm][dn][en][fn][gn][hn][in][ho][hq][qq]
+[ir][qr][rr][sr][js][ks][ls][ms][os][ps][qs][rs]
+[ss]
+)
diff --git a/regression/games/self_play/354-34-3.sgf b/regression/games/self_play/354-34-3.sgf
new file mode 100644 (file)
index 0000000..6113c16
--- /dev/null
@@ -0,0 +1,40 @@
+(;
+GM[1]FF[4]
+SZ[19]HA[0]KM[6.5]
+PW[GNU Go 3.5.4 (random seed 1334728822)]
+PB[GNU Go 3.4 (random seed 927511316)]
+RU[Japanese]
+RE[B+35.5]
+;B[pd];W[dd];B[pp];W[dq];B[fc];W[cf];B[db];W[cc];B[ic];W[hp];B[do];W[eo]
+;B[en];W[ep];B[dm];W[np];B[pn];W[pq];B[qq];W[oq];B[qr];W[ql];B[ch];W[cb]
+;B[qj];W[ol];B[qg];W[md];B[qn];W[co];B[cn];W[bo];B[ns];W[oc];B[pc];W[al]
+;B[lr];W[lp];B[jq];W[jo];B[hr];W[od];B[fn];W[pe];B[rd];W[hn];B[fk];W[ng]
+;B[kd];W[dp];B[lc];W[fe];B[nn];W[ln];B[fr];W[eb];B[fb];W[dc];B[oj];W[rk]
+;B[pk];W[qe];B[nk];W[re];B[qd];W[sd];B[rf];W[sc];B[nb];W[ob];B[nc];W[ne]
+;B[mo];W[lq];B[mr];W[lo];B[oa];W[pa];B[na];W[pb];B[bj];W[er];B[bm];W[eg]
+;B[bn];W[fq];B[eh];W[gr];B[hq];W[fh];B[ei];W[hs];B[is];W[gs];B[gq];W[gp]
+;B[fs];W[fa];B[ga];W[ea];B[hb];W[dg];B[bg];W[an];B[am];W[ao];B[be];W[bf]
+;B[af];W[ce];B[bd];W[jl];B[hd];W[hf];B[fi];W[gh];B[lj];W[pr];B[bc];W[qs]
+;B[rs];W[ps];B[rq];W[ip];B[lh];W[nr];B[mq];W[mp];B[nq];W[op];B[oo];W[or]
+;B[kq];W[mm];B[nl];W[lf];B[mn];W[ge];B[bb];W[ml];B[ca];W[da];B[ba];W[hk]
+;B[hj];W[ii];B[ij];W[gl];B[ji];W[hi];B[ik];W[il];B[gk];W[hl];B[jh];W[fl]
+;B[el];W[pg];B[qh];W[qf];B[rg];W[ih];B[kf];W[le];B[ig];W[hg];B[if];W[mc]
+;B[mb];W[nd];B[lb];W[gi];B[kk];W[ke];B[kg];W[je];B[ll];W[lm];B[kl];W[km]
+;B[nh];W[oh];B[mg];W[ni];B[mh];W[oi];B[nj];W[mf];B[pi];W[mi];B[ec];W[db]
+;B[es];W[ds];B[cr];W[bq];B[dr];W[eq];B[br];W[cq];B[ar];W[li];B[ms];W[ki]
+;B[ie];W[gj];B[jk];W[fj];B[ek];W[jd];B[ej];W[jc];B[jb];W[kc];B[kb];W[ld]
+;B[fo];W[fp];B[iq];W[kh];B[lg];W[kj];B[jj];W[dh];B[mj];W[ci];B[bi];W[di]
+;B[ph];W[og];B[cg];W[dj];B[dk];W[ed];B[gd];W[cj];B[ck];W[os];B[ks];W[kp]
+;B[fm];W[gm];B[aq];W[ap];B[go];W[ho];B[nm];W[mk];B[sf];W[se];B[dn];W[lk]
+;B[jg];W[id];B[he];W[fd];B[jp];W[jf];B[gb];W[no];B[cd];W[fg];B[gn];W[]
+;B[]
+;TW[qa][ra][sa][qb][rb][sb][qc][rc][kd][de][ee][me]
+[oe][df][ef][ff][gf][nf][of][pf][gg][hh][hm][im]
+[jm][in][jn][kn][io][ko][bp][cp]
+TB[aa][ha][ia][ja][ka][la][ma][ab][ib][ac][gc][hc]
+[ad][ae][ag][sg][ah][bh][rh][sh][ai][qi][ri][si]
+[aj][pj][rj][sj][ak][bk][ok][qk][sk][bl][cl][dl]
+[pl][rl][sl][cm][em][om][pm][qm][rm][sm][on][rn]
+[sn][po][qo][ro][so][qp][rp][sp][sq][gr][ir][jr]
+[kr][rr][sr][as][bs][cs][gs][hs][js][ls][ss]
+)
diff --git a/regression/games/self_play/selfplay1.sgf b/regression/games/self_play/selfplay1.sgf
new file mode 100644 (file)
index 0000000..0e5f51f
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[2]KM[0.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-05-25]
+SY[Cgoban 1.9.14]TM[-]AB[pd][dp];W[cd];B[pq];W[po];B[qo];W[qn];B[qp];
+W[pn];B[nq];W[qj];B[ed];W[ee];B[fe];W[de];B[gd];W[cn];B[cl];W[cq];
+B[dq];W[cp];B[do];W[bn];B[em];W[qf];B[hp];W[mo];B[lp];W[ci];B[nd];
+W[ec];B[fc];W[eb];B[ek];W[ha];B[kn];W[rd];B[qc];W[rc];B[ll];W[id];
+B[kc];W[mm];B[nk];W[ol];B[fi];W[if];B[ff];W[hg];B[gh];W[ii];B[hj];
+W[ke];B[kk];W[dg];B[ki];W[ib];B[md];W[qb];B[pb];W[qh];B[ij];W[cr];
+B[dr];W[rb];B[ro];W[rn];B[ih];W[kb];B[lb];W[jc];B[ka];W[jb];B[cs];
+W[lc];B[mf];W[mc];B[mh];W[bs];B[ds];W[so];B[sp];W[sn];B[ma];W[pa];
+B[pg];W[nb];B[ph];W[qg];B[oa];W[qa];B[ob];W[bk];B[bl];W[ar];B[bj];
+W[bi];B[ak];W[ok];B[ai];W[nj];B[ag];W[be];B[cj];W[di];B[mk];W[mb];
+B[na];W[pf];B[la];W[og];B[pi];W[oh];B[ld];W[qk];B[kd];W[op];B[jd];
+W[je];B[mp];W[oq];B[or];W[rq];B[qr];W[rp];B[pp];W[np];B[lo];W[mn];
+B[qd];W[rr];B[he];W[qs];B[pr];W[ps];B[os];W[rs];B[mr];W[gb];B[ie];
+W[nf];B[fb];W[fa];B[jf];W[dd];B[dj];W[oe];B[hd];W[od];B[nc];W[gc];
+B[fd];W[ic];B[dn];W[oc];B[pc];W[ng];B[co];W[bo];B[mg];W[nl];B[mj];
+W[ni];B[hc];W[hb];B[mi];W[lm];B[km];W[ef];B[fg];W[eh];B[ei];W[qe];
+B[bm];W[am];B[ja];W[ea];B[cf];W[cm];B[eg];W[df];B[cg];W[bh];B[ah];
+W[dm];B[dl];W[an];B[al];W[ap];B[ne];W[pe];B[nh];W[oi];B[ae];W[ad];
+B[af];W[bd];B[fh];W[dh];B[ml];W[ga];B[bf];W[ln];B[ia];W[bg];B[ch];
+W[qq];B[cb];W[tt];B[dc];W[tt];B[tt]
+)
diff --git a/regression/games/semeai/infinity.sgf b/regression/games/semeai/infinity.sgf
new file mode 100644 (file)
index 0000000..b4375f7
--- /dev/null
@@ -0,0 +1,21 @@
+(
+;US[z]
+  GM[1]
+  DT[2002-02-01]
+  RU[Japanese]
+  HA[0]
+  KM[5.5]
+  SZ[9]
+  FF[4]
+  PB[z]
+  PW[GNU Go]
+  AP[Goban:v21]
+;B[gc];W[cg];B[fe];W[cd];B[cc];W[bc];B[ad];W[dc];B[cb];W[ec];B[eb]
+;W[bb];B[ab];W[fb];B[ba];W[bd];B[ac];W[fg];B[be];W[ce];B[dd];W[df]
+;B[cf];W[bf];B[af];W[gf];B[de];W[ae];B[bg];W[gb];B[be];W[cf];B[ae]
+;W[db];B[da];W[hb];B[ga];W[];B[ib];W[ge];B[he];W[hd];B[ch];W[dh]
+;B[ef];W[dg];B[eg];W[fd];B[eh];W[di];B[ci];W[fh];B[ei];W[fi];B[cf]
+;W[ea];B[dg];W[ed];B[fc];W[ca];B[gd];W[ff];B[gg];W[gh];B[hh];W[ee]
+;B[hf];W[da];B[fa];W[];B[ha];W[];B[hc];W[ic];B[hc];W[];B[id];W[hg]
+;B[gd];W[if];B[fc];W[gc];B[ig];W[];B[gg];W[hd];B[gi];W[hi];B[gd]
+;W[];B[ih];W[hg];B[ie];W[];B[gg];W[];B[ii];W[];B[gi])
diff --git a/regression/games/semeai/match078.sgf b/regression/games/semeai/match078.sgf
new file mode 100644 (file)
index 0000000..5a52091
--- /dev/null
@@ -0,0 +1,212 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5]RE[W+7.5]
+;B[pd]
+;W[dp]
+;B[dd]
+;W[qp]
+;B[jd]
+;W[qf]
+;B[qh]
+;W[ph]
+;B[op]
+;W[fc]
+;B[qq]
+;W[rq]
+;B[ec]
+;W[pq]
+;B[gd]
+;W[qi]
+;B[fd]
+;W[md]
+;B[oc]
+;W[mf]
+;B[cn]
+;W[rh]
+;B[ck]
+;W[fq]
+;B[bp]
+;W[cq]
+;B[hq]
+;W[bq]
+;B[kq]
+;W[on]
+;B[lc]
+;W[mc]
+;B[mp]
+;W[ld]
+;B[kc]
+;W[jf]
+;B[re]
+;W[hg]
+;B[ch]
+;W[mn]
+;B[fg]
+;W[gi]
+;B[ke]
+;W[mb]
+;B[rc]
+;W[km]
+;B[ic]
+;W[gk]
+;B[po]
+;W[qm]
+;B[fr]
+;W[er]
+;B[co]
+;W[gr]
+;B[hr]
+;W[hs]
+;B[ho]
+;W[hm]
+;B[ko]
+;W[ja]
+;B[kf]
+;W[kg]
+;B[lg]
+;W[kh]
+;B[mh]
+;W[mj]
+;B[oi]
+;W[ni]
+;B[is]
+;W[gs]
+;B[of]
+;W[nh]
+;B[mg]
+;W[ng]
+;B[lf]
+;W[hb]
+;B[li]
+;W[jl]
+;B[nf]
+;W[fb]
+;B[gc]
+;W[jj]
+;B[gb]
+;W[ir]
+;B[me]
+;W[dj]
+;B[cj]
+;W[iq]
+;B[ip]
+;W[gq]
+;B[fo]
+;W[en]
+;B[lj]
+;W[eo]
+;B[lk]
+;W[mm]
+;B[mk]
+;W[oj]
+;B[nk]
+;W[gn]
+;B[el]
+;W[hp]
+;B[io]
+;W[go]
+;B[jn]
+;W[dm]
+;B[bl]
+;W[dl]
+;B[lp]
+;W[dk]
+;B[eh]
+;W[oq]
+;B[nq]
+;W[or]
+;B[jp]
+;W[nr]
+;B[mr]
+;W[ap]
+;B[ao]
+;W[aq]
+;B[jr]
+;W[ms]
+;B[ls]
+;W[ns]
+;B[lr]
+;W[ok]
+;B[fi]
+;W[gh]
+;B[js]
+;W[rf]
+;B[im]
+;W[il]
+;B[pn]
+;W[qn]
+;B[qo]
+;W[ro]
+;B[nj]
+;W[pm]
+;B[pp]
+;W[qr]
+;B[no]
+;W[di]
+;B[cg]
+;W[fj]
+;B[ei]
+;W[ie]
+;B[gf]
+;W[hf]
+;B[og]
+;W[oh]
+;B[mi]
+;W[ci]
+;B[bi]
+;W[cp]
+;B[bo]
+;W[jm]
+;B[pg]
+;W[qg]
+;B[hn]
+;W[ln]
+;B[nn]
+;W[nm]
+;B[nl]
+;W[ol]
+;B[ki]
+;W[ji]
+;B[cm]
+;W[qe]
+;B[qd]
+;W[se]
+;B[sd]
+;W[sf]
+;B[pe]
+;W[dh]
+;B[dg]
+;W[ge]
+;B[fe]
+;W[he]
+;B[gg]
+;W[hd]
+;B[hc]
+;W[rd]
+;B[sc]
+;W[ll]
+;B[kk]
+;W[jk]
+;B[kn]
+;W[fh]
+;B[mo]
+;W[ej]
+;B[eg]
+;W[id]
+;B[in]
+;W[je]
+;B[kd]
+;W[re]
+;B[jq]
+;W[ml]
+;B[kl]
+;W[do]
+;B[cl]
+;W[dn]
+;B[pf]
+;W[kj]
+;B[lo]
+;W[lh]
+;B[oo]
+;W[om]
+;B[]
+;W[]
+)
diff --git a/regression/games/semeai/semeai10.sgf b/regression/games/semeai/semeai10.sgf
new file mode 100644 (file)
index 0000000..5417be6
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.26 (level 10) load and print]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.1.26 load and print Random Seed 1014914251] 
+AW[db][bc][cc][ec][fc][cd][ed][gd][hd][de][ee][ie][me][qe][bf][cf][ef][ff][jf][kf][lf][nf][qf][cg][mg][og][pg][qg][ih][lh][nh][rh][bi][fi][hi][li][qi][bj][fj][gj][kj][qj][gk][kk][pk][hl][il][kl][ll][pl][bm][cm][jm][lm][nm][om][qm][dn][en][fn][ln][mn][on][qn][do][oo][qo][ap][bp][cp][dp][ep][fp][gp][hp][ip][kp][np][op][qp][eq][hq][lq][nq][ar][br][cr][fr][gr][ir][lr][or][qr][hs]
+AB[bb][fb][hb][ac][gc][jc][ad][fd][jd][md][nd][pd][qd][be][fe][ge][ke][le][ne][pe][re][af][gf][hf][of][pf][rf][bg][dg][fg][rg][ch][eh][gh][oh][di][gi][mi][ni][oi][lj][nj][pj][bk][ck][dk][lk][ok][bl][el][fl][ml][nl][gm][km][mm][cn][hn][in][kn][nn][pn][bo][eo][fo][go][ho][jo][ko][lo][mo][no][po][jp][aq][bq][cq][dq][iq][jq][oq][dr][er][jr][kr][bs][cs][es]
+PL[B]
+IL[ng][hr]
+)
diff --git a/regression/games/semeai/semeai11.sgf b/regression/games/semeai/semeai11.sgf
new file mode 100644 (file)
index 0000000..751cda0
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+SZ[19]
+GN[GNU Go 3.3.16 load and print]
+DT[2003-02-13]
+KM[0]AP[GNU Go:3.3.16]RU[Japanese];
+AW[fa][ha][ja][gb][ib][jb][fc][gc][hc][gd][hd][id][ld][rd][he][re][gf][hf][if][kf][lf][mf][nf][of][pf][qf][hg][jg][mg][ng][pg][rg][ch][ph][qh][qi][cj][ej][fj][gj][hj][ij][jj][kj][lj][mj][qj][bk][ck][ek][hk][rk][al][cl][dl][el][fl][gl][hl][jl][kl][ll][ml][nl][rl][em][gm][jm][nm][pm][qm][dn][jn][rn][ao][bo][do][eo][ho][ko][lo][no][oo][ep][mp][op][cq][dq][eq][fq][iq][mq][nq][pq][qq][br][cr][fr][gr][kr][ds][es]
+AB[eb][fb][kb][qb][ec][ic][jc][pc][rc][dd][fd][jd][nd][pd][qd][fe][ge][je][ke][le][me][ne][qe][cf][ff][jf][gg][kg][og][bh][dh][eh][gh][hh][ih][jh][kh][lh][mh][oh][rh][bi][ci][ei][ni][pi][ri][dj][oj][pj][rj][ik][jk][kk][lk][mk][nk][ok][qk][bl][il][ql][bm][cm][dm][fm][hm][im][mm][an][cn][en][fn][gn][in][ln][mn][nn][co][fo][io][mo][qo][ro][bp][cp][dp][fp][gp][hp][jp][kp][lp][pp][aq][bq][gq][jq][ar][hr][ir][jr]
+PL[W]IL[qc][di][oi]
+)
diff --git a/regression/games/semeai/semeai12.sgf b/regression/games/semeai/semeai12.sgf
new file mode 100644 (file)
index 0000000..946fe09
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[19]
+GN[GNU Go 3.3.18 load and print]
+DT[2003-04-28]
+KM[-3]AP[GNU Go:3.3.18]RU[Japanese];PL[B]
+AW[aa][ba][ca][pa][ra][bb][cb][ob][pb][sb][cc][ec][pc][qc][rc][sc][ad][dd][ed][fd][gd][hd][id][od][be][ce][fe][he][je][ne][re][se][af][bf][df][ef][hf][if][jf][kf][lf][qf][rf][bg][dg][ig][jg][pg][qg][sg][ch][dh][eh][gh][hh][kh][lh][nh][oh][ph][qh][ci][di][hi][ji][ki][li][mi][ni][qi][si][dj][gj][ij][mj][pj][qj][rj][ak][bk][gk][ik][kk][qk][al][fl][il][jl][kl][ml][nl][ol][am][cm][dm][em][fm][jm][lm][mm][an][bn][cn][fn][gn][hn][jn][mn][on][co][eo][ho][jo][mo][no][oo][dp][ep][fp][jp][lp][mp][dq][eq][gq][jq][kq][br][er][jr][as][cs][es][is][js][ks][ls]
+AB[da][fa][na][oa][db][eb][gb][nb][rb][dc][fc][gc][hc][ic][nc][oc][jd][nd][pd][qd][rd][sd][ge][ke][le][me][pe][qe][ff][gf][mf][nf][pf][ag][eg][fg][gg][hg][kg][lg][mg][ng][og][rg][ah][bh][fh][mh][rh][bi][ei][fi][gi][oi][pi][ri][aj][bj][cj][ej][hj][jj][kj][lj][nj][oj][sj][ck][dk][ek][fk][hk][jk][lk][mk][nk][ok][pk][rk][sk][bl][cl][dl][gl][hl][ll][pl][ql][rl][bm][gm][hm][im][nm][om][pm][dn][in][nn][pn][do][fo][go][io][po][bp][gp][hp][ip][np][op][cq][fq][iq][lq][mq][oq][pq][cr][fr][gr][ir][kr][lr][mr][or][fs][hs][ms][ns]
+)
diff --git a/regression/games/semeai/semeai13.sgf b/regression/games/semeai/semeai13.sgf
new file mode 100644 (file)
index 0000000..8e39d2b
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-08-20]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ba][fa][ia][la][ab][fb][ib][mb][dc][ec][fc][ic][jc][kc][dd][kd][ce][de][ke][le][me][af][bf][cf][ah][bh][ch][ci][ki][li][mi][cj][dj][ej][jj][kj][ek][ik][jk][mk][al][el][il][ml][am][bm][em][im][lm]
+AB[da][ja][bb][cb][db][jb][kb][lb][bc][lc][ad][bd][ld][md][aj][bj][lj][mj][bk][lk][bl][cl][dl][jl][kl][ll][dm][jm]
+)
diff --git a/regression/games/semeai/semeai14.sgf b/regression/games/semeai/semeai14.sgf
new file mode 100644 (file)
index 0000000..56eaea4
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-08-21]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ba][ca][fa][ja][cb][fb][jb][mb][ac][fc][jc][lc][mc][ad][bd][cd][dd][ed][fd][gd][hd][id][jd][de][je][df][if][jf][kf][lf][mf][ag][bg][cg][dg][fg][gg][ig][bh][dh][fh][ih][di][ii][dj][hj][ij][jj][kj][lj][mj][ak][bk][dk][ek][fk][gk][hk][al][dl][gl][kl][dm][gm][hm][km][lm]
+AB[da][ea][la][ab][bb][eb][kb][lb][bc][cc][dc][ec][kc][kd][md][fe][ge][he][ke][le][me][ff][hf][eg][hg][eh][gh][hh][ai][bi][ci][ei][gi][aj][cj][ej][fj][gj][ck][ik][jk][kk][lk][bl][cl][il][ll][ml][bm][im][jm]
+)
diff --git a/regression/games/semeai/semeai15.sgf b/regression/games/semeai/semeai15.sgf
new file mode 100644 (file)
index 0000000..f47b95a
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[13]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2003-08-21]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ea][ga][ha][ia][eb][fb][gb][cc][dc][cd][dd][ce][ee][ie][je][ke][le][cf][df][ef][if][lf][dg][hg][lg][dh][hh][kh][lh][di][hi][ki][aj][bj][cj][dj][hj][kj][bk][hk][kk][bl][hl][kl][hm][km]
+AB[aa][ba][ca][da][ka][ab][cb][db][jb][kb][lb][mb][ac][bc][ec][hc][ic][jc][kc][mc][ad][ed][fd][gd][hd][md][ae][ge][me][af][gf][hf][mf][ag][cg][fg][gg][ig][jg][kg][mg][ah][bh][ch][fh][ih][mh][fi][ii][mi][fj][ij][mj][dk][ek][fk][ik][mk][dl][fl][il][ml][am][bm][cm][dm][em][fm][im][mm]
+)
diff --git a/regression/games/semeai/semeai16.sgf b/regression/games/semeai/semeai16.sgf
new file mode 100644 (file)
index 0000000..06c129d
--- /dev/null
@@ -0,0 +1,29 @@
+(;FF[1]GM[1]
+SZ[19]AP[Jago:Version 4.53]
+GN[0101]
+;AB[dj][pj][jd][jp][jj][pp][dd][dp][pd]
+;W[md];B[fq];W[cf];B[qn];W[qf];B[df];W[dg];B[ef];W[ce];B[cd]
+;W[ch];B[fh];W[fd];B[bi];W[de];B[oq];W[cn];B[dn];W[dm];B[co]
+;W[en];B[do];W[em];B[ho];W[cj];B[ci];W[ck];B[ei];W[bm];B[gl]
+;W[eg];B[ee];W[ed];B[be];W[bf];B[bd];W[ff];B[db];W[gj];B[qh]
+;W[of];B[nc];W[mc];B[nh];W[mg];B[kh];W[mh];B[nj];W[lj];B[li]
+;W[mi];B[mj];W[lk];B[hi];W[gi];B[fk];W[hk];B[jl];W[hl];B[gh]
+;W[hh];B[gg];W[ii];B[kj];W[gm];B[pb];W[nb];B[ob];W[nd];B[oc]
+;W[lb];B[qc];W[ig];B[im];W[hm];B[gf];W[ge];B[hf];W[eb];B[ie]
+;W[kg];B[le];W[ng];B[ni];W[lp];B[ll];W[jq];B[iq];W[kq];B[mq]
+;W[ir];B[hq];W[hr];B[gr];W[lr];B[mr];W[ks];B[hs];W[jr];B[is]
+;W[jo];B[ip];W[mp];B[no];W[lm];B[kp];W[lq];B[ml];W[mn];B[hn]
+;W[nn];B[np];W[om];B[ko];W[qm];B[pn];W[ok];B[pm];W[pl];B[nl]
+;W[ol];B[ql];W[qk];B[rm];W[rl];B[qm];W[oj];B[pk];W[pi];B[qj]
+;W[qi];B[rj];W[oi];B[oh];W[ri];B[sj];W[ph];B[re];W[rf];B[dc]
+;W[gc];B[bj];W[bk];B[bo];W[ae];B[fb];W[ec];B[ea];W[gb];B[sf]
+;W[qe];B[rd];W[bb];B[bc];W[cb];B[ab];W[ca];B[ms];W[da];B[sg]
+;W[rh];B[bn];W[cm];B[jh];W[jg];B[na];W[mb];B[lh];W[lg];B[og]
+;W[oe];B[qg];W[rg];B[pg];W[km];B[jn];W[kl];B[kk];W[jm];B[il]
+;W[ik];B[jk];W[ji];B[ij];W[hj];B[am];W[al];B[an];W[on];B[oo]
+;W[fo];B[ki];W[ih];B[mk];W[gp];B[fp];W[go];B[gq];W[eo];B[ma]
+;W[la];B[oa];W[qd];B[se];W[od];B[ep];W[kn];B[in];W[lo];B[gn]
+;W[fn];B[rk];W[rb];B[rc];W[qa];B[qb];W[sc];B[sa];W[pe];B[mm]
+;W[ln];B[gs];W[sh];B[ra];W[sb];B[js];W[ls];B[hp];W[pc];B[mo]
+;W[ra];B[pf];W[pa];B[si]
+)
diff --git a/regression/games/semeai/semeai17.sgf b/regression/games/semeai/semeai17.sgf
new file mode 100644 (file)
index 0000000..9f88afa
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[3]
+SZ[9]HA[2]KM[5.5]
+PW[Human]
+PB[Computer]
+DT[2003-08-12]
+AB[cg][gc];W[ee];B[ff];W[hh];B[ce];W[ef];B[eg];W[fg];B[dc];W[dg];B[gg]
+;W[eh];B[hf];W[ge];B[gf];W[gd];B[gh];W[gi];B[fe];W[fd];B[fc];W[ec];
+B[hd];W[ed];B[db];W[he];B[hi];W[ii];B[id];W[eb];B[fa];W[fb];B[gb];
+W[ea];B[ie];W[hb];B[hc];W[ib];B[fi];W[hi];B[fh];W[ga];B[if];W[ha];
+B[ch];W[dh];B[eg];W[df];B[cf];W[ic];B[da];W[cd];B[cb];W[dd];B[bb];
+W[bc];B[ab];W[be];B[bf];W[ba];B[tt];W[ih];B[fg];W[ei]
+)
diff --git a/regression/games/semeai/semeai18.sgf b/regression/games/semeai/semeai18.sgf
new file mode 100644 (file)
index 0000000..131582d
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[4]SZ[9]
+AW[gd][hd][id][fe][ge][ff][dg][eg][fg][hg][dh][di]
+AB[he][ie][gf][hf][gg][eh][fh][gh][ei]
+)
diff --git a/regression/games/semeai/semeai19.sgf b/regression/games/semeai/semeai19.sgf
new file mode 100644 (file)
index 0000000..c8367c2
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[4]DT[2004-11-20]RU[Japanese]SZ[19]
+KM[0.0]
+PW[Daniel Bump]
+PB[GNU Go 3.7.1 prerelease]
+HA[9]AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp];
+W[qf];B[nd];W[ld];B[gd];W[oc];B[od];W[pc];B[qd];W[mb];B[qc];
+W[qb];B[rb];W[pb];B[cg];W[ph];B[pm];W[mg];B[mq];W[qq];B[qp];
+W[pr];B[rq];W[rr];B[jh];W[cc];B[dc];W[cd];B[cb];W[bb];B[db];
+W[ce];B[ba];W[ab];B[bf];W[be];B[ef];W[cf];B[bg];W[ee];B[ff];
+W[de];B[rp];W[fc];B[fb];W[gc];B[gb];W[hc];B[hb];W[ec];B[eb];
+W[ic];B[ed];W[fd];B[fe];W[ib];B[bc];W[ad];B[kb];W[ha];B[kd];
+W[lc];B[jb];W[he];B[le];W[me];B[md];W[ke];B[lf];W[kf];B[lg];
+W[ie];B[nc];W[nb];B[ge];W[je];B[pq];W[ca];B[df];W[ga];B[mh]
+)
diff --git a/regression/games/semeai/semeai20.sgf b/regression/games/semeai/semeai20.sgf
new file mode 100644 (file)
index 0000000..da32d19
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+SZ[19]
+GN[GNU Go 3.5.10 load and print]
+DT[2004-11-20]
+KM[0]RU[Japanese]AP[GNU Go:3.5.10]PL[B]
+AW[ha][ab][bb][ib][mb][pb][qb][cc][ec][fc][gc][hc][ic][oc][pc][ad][cd][fd][jd][ld][be][ce][de][ee][cf][qf][mg][ph][qq][pr][rr]
+AB[ba][cb][db][eb][fb][gb][hb][kb][rb][bc][dc][qc][dd][ed][gd][nd][od][pd][qd][fe][bf][ef][ff][bg][cg][jh][dj][jj][pj][pm][dp][jp][pp][qp][rp][mq][rq]
+)
diff --git a/regression/games/semeai/semeai21.sgf b/regression/games/semeai/semeai21.sgf
new file mode 100644 (file)
index 0000000..9aa117f
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[4]SZ[9]KM[6.5]
+AB[fa][fb][gb][hb][ac][bc][cc][dc][ed][hc][hd][id][cd][ce][fe][de][df][ef][ff][gf][hf][hg][ig][ah][bh][ch][dh][eh][ih][bi]
+AW[ba][da][ha][ab][bb][cb][db][eb][ec][fc][ib][ic][fd][gd][ae][be][ge][he][ie][bf][if][ag][bg][cg][dg][eg][fg][fh][gh][hh][ci][ei]
+)
diff --git a/regression/games/semeai/semeai22.sgf b/regression/games/semeai/semeai22.sgf
new file mode 100644 (file)
index 0000000..6fca80a
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[4]SZ[9]
+AB[af][bf][bg][bh][bi][ch][df][dg][di][ef][ff][gf][gg][gh][gi][hf][if]
+AW[ae][ah][be][ca][cb][cc][cd][ce][cf][cg][dh][eg][eh][ei]
+;W[ai];B[fh];W[ci];B[ag];W[ai];B[di];W[];B[fg];W[ci]
+)
diff --git a/regression/games/semeai/semeai4.sgf b/regression/games/semeai/semeai4.sgf
new file mode 100644 (file)
index 0000000..8180e6f
--- /dev/null
@@ -0,0 +1,58 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[Lazarus-GnuGo(B) NNGS]
+EV[None]
+RE[B+Resign]
+PW[Lazarus]WR[7k*]
+PB[GnuGo]BR[14k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2001-11-14]
+SZ[19]TM[600]KM[0.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[fc];B[fd];W[cd]C[
+ crazymonk started observation.
+]
+;B[cc];W[ce];B[ec];W[bc];B[qn];W[gc]C[
+ gerula started observation.
+]
+;B[eb];W[gd];B[cb];W[ch];B[ge];W[fe];B[ed];W[ic];B[jc];W[he];B[cm];W[gf]
+;B[bb];W[bd];B[md];W[ab];B[fb];W[gb];B[fa];W[nc];B[ob];W[nd];B[mc];W[ne]
+;B[nb];W[qf];B[re];W[oc];B[pc];W[qe];B[qd];W[rf];B[rd];W[qk];B[qj];W[pl]
+;B[pe];W[pf];B[of];W[og]C[
+ jirong started observation.
+]
+;B[ng];W[nf];B[oe];W[oh];B[ok];W[mg];B[nh];W[ni];B[mh];W[oj];B[pk];W[qm]
+;B[ol];W[om];B[ml];W[mi];B[lh];W[lg];B[mf];W[li];B[kh];W[me];B[jg];W[jf]
+;B[if];W[kf];B[ie];W[ig];B[le];W[jh];B[hg];W[kg];B[od];W[ki];B[nf];W[ji]
+;B[qh];W[ph];B[pi];W[oi];B[rk];W[ql];B[fq];W[ri];B[qg];W[qi];B[rh];W[pg]
+;B[si];W[rl];B[oq];W[sk];B[rj];W[mn];B[kl];W[jn];B[jm];W[lm];B[ll];W[km]
+;B[jl];W[in];B[ij];W[gj];B[gl];W[hl];B[hk];W[gk];B[ko];W[gm];B[fl];W[im]
+;B[kn];W[nn];B[hi];W[hh];B[gh];W[ih];B[gi];W[gg];B[hf];W[hj];B[rn];W[ik]C[
+ bump started observation.
+]
+;B[ei];W[ii];B[kj];W[jk];B[co];W[kk];B[bi];W[ci];B[cj];W[bh];B[id];W[df]
+;B[bj];W[cq];B[dq];W[fr];B[er];W[gr];B[gq];W[hq];B[pn];W[pm];B[lp];W[mp]
+;B[hp];W[iq];B[ip];W[lq];B[mq];W[nq];B[mr];W[lo];B[kp];W[np];B[nr];W[kr]
+;B[fo];W[go];B[kq];W[jr];B[ho];W[gn];B[lr];W[op];B[ks];W[jq];B[hr];W[hs]
+;B[js];W[ir];B[ls];W[pq];B[or];W[qp];B[po];W[qq];B[pr];W[qr];B[rr];W[rs]
+;B[sp];W[ro];B[oo];W[no];B[ln];W[mm];B[nl]C[
+ egen started observation.
+]
+;W[qo];B[so];W[sr];B[rq];W[fs];B[is];W[cr];B[bp];W[qs];B[ps];W[es];B[ib]
+;W[dr];B[eq];W[bq];B[hr];W[sm];B[sn];W[ap];B[bs];W[bo];B[cp];W[bn];B[bm]
+;W[cn];B[ga];W[rm];B[rp];W[dn];B[fj];W[fh];B[fi];W[eh];B[hd];W[dl];B[fk]
+;W[lj];B[dm];W[am];B[fn];W[fm];B[bl];W[cl];B[ge];W[em];B[ck];W[al];B[ak]
+;W[bk];B[he];W[ef];B[bl];W[sg];B[ee];W[ff];B[ke];W[se];B[sd];W[sf];B[gp]
+;W[nk];B[mk];W[nj];B[hn];W[hm];B[gs];W[ds];B[hs];W[il];B[ba];W[lk];B[lf]
+;W[mj];B[ri];W[sh];B[sj];W[rg];B[ss];W[nm];B[sl];W[eo];B[on];W[sk];B[bm]
+;W[qi];B[an]C[
+ liload started observation.
+]
+;W[ai];B[di];W[ek];B[am];W[ao];B[cm];W[ah];B[el];W[dm];B[dk]C[
+ Lazarus 7k*: duh...  (297)
+]
+;)
diff --git a/regression/games/semeai/semeai5.sgf b/regression/games/semeai/semeai5.sgf
new file mode 100644 (file)
index 0000000..a7763f2
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]
+SZ[19]HA[9]KM[0.5]
+PW[gerula]WR[11k*]
+PB[GnuGo (GNU Go 3.1.13)]BR[14k*]
+PC[NNGS]DT[2001-11-11]AP[gnugoclient:2.0]
+RE[B+Resign]
+AB[dd][jd][pd][dj][jj][pj][dp][jp][pp]
+;W[qn];B[qo];W[on];B[np];W[lq];B[lo];W[oq];B[pq]C[L:7];W[op];B[qf]
+;W[po];B[qp]C[L:4];W[pr];B[qr];W[or];B[cn]C[L:5];W[gp];B[oc]C[L:6]
+;W[jl];B[eq]C[L:7];W[mj];B[fc]C[L:8];W[dg];B[rn]C[L:9];W[qm];B[rm]
+C[L:8];W[jf];B[fg]C[L:7];W[eh];B[ce]C[L:8];W[fe];B[ef];W[fi];B[ge]
+;W[cf];B[jn]C[L:9];W[jm];B[no]C[L:7];W[nn];B[iq];W[hr];B[gn]C[L:6]
+;W[ho];B[hn]C[L:5];W[io];B[jo]C[L:4];W[in];B[im]C[L:3];W[il];B[hm]
+;W[hk];B[gh];W[gi];B[oo]C[L:4];W[pn];B[kr];W[lp];B[mn]C[L:2];W[mp]
+;B[mo]C[L:3];W[nq];B[ld]C[L:4];W[lr];B[lf]C[L:3];W[jh];B[jg]C[L:4]
+;W[kg];B[ig]C[L:5];W[lg];B[qk]C[L:6];W[nk];B[nl]C[L:2];W[nm];B[ml]
+C[L:3];W[mm];B[lm]C[L:1];W[ll];B[lk]C[L:0];W[kl];B[mk];W[ko];B[ol]
+;W[ni];B[if];W[kf];B[ph]C[L:1];W[lj];B[kk]C[L:2];W[kj];B[mf]C[L:3]
+;W[jk];B[ok]C[L:4];W[en];B[ij];W[hj];B[ch]C[L:5];W[cj];B[ck];W[dk]
+;B[bj]C[L:6];W[ej];B[di];W[cl];B[bk]C[L:4];W[dl];B[bl]C[L:5];W[ei]
+;B[bf]C[L:6];W[eo];B[ih]C[L:7];W[ji];B[ii]C[L:6];W[mg];B[nj]C[L:5]
+;W[ng];B[fr]C[L:6];W[gq];B[of];W[nf];B[oh]C[L:7];W[ne];B[md]C[L:8]
+;W[li];B[nh]C[L:9];W[mh];B[kh]C[L:10];W[ki];B[gr];W[hq];B[hs]C[L:8]
+;W[is];B[gs]C[L:7];W[ir];B[ps]C[L:8];W[he];B[ie]C[L:9];W[gd];B[gf]
+;W[ee];B[df];W[cg];B[bg];W[dh];B[ci];W[ik];B[fd];W[id];B[cm];W[cq]
+;B[cp]C[L:8];W[bq];B[er];W[dq];B[ep]C[L:9];W[bp];B[bo]C[L:7];W[do]
+;B[co]C[L:8];W[dr];B[ap]C[L:9];W[ar];B[bs]C[L:10];W[kd];B[ke]C[L:8]
+;W[fh];B[go];W[hp];B[fp]C[L:7];W[fo];B[jr]C[L:8];W[hl];B[gm];W[gl]
+;B[fm];W[em];B[kn];W[kp];B[ln];W[jq];B[kq];W[ip];B[jq]C[L:7];W[fl]
+;B[ls]C[L:8];W[km];B[mr])
+
diff --git a/regression/games/semeai/semeai6.sgf b/regression/games/semeai/semeai6.sgf
new file mode 100644 (file)
index 0000000..3d56abb
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.14 (level 10) load and print]PB[Unknown]HA[0]KM[5.5]GN[GNU Go 3.1.14 load and print Random Seed 1006483507] 
+AW[ba][fa][ab][bb][fb][bc][fc][ad][bd][cd][dd][ed][fd][gd][hd][id][jd][kd][ld][md][nd][od][pd][qd][rd][sd][fe][ff][eg][ah][bh][ch][dh][eh][bi][ei][aj][bj][cj][bk][el][fl][em][gm][en][fn][gn][hn][in][jn][kn][ln][co][do][go][io][mo][cp][gp][hp][ip][jp][mp][cq][gq][mq][cr][gr][mr][nr][or][cs][gs][ms][os]
+AB[pe][qe][re][se][af][bf][cf][df][ef][gf][hf][if][jf][kf][lf][mf][nf][of][pf][fg][gg][pg][fh][ph][ci][di][fi][pi][dj][ej][fj][pj][ak][ck][dk][fk][gk][pk][al][bl][cl][dl][gl][hl][pl][bm][dm][hm][im][jm][km][lm][mm][pm][an][bn][cn][dn][mn][nn][on][pn][ao][eo][jo][ko][lo][oo][qo][ap][ep][kp][op][pp][qp][aq][eq][kq][qq][ar][br][er][ir][jr][kr][qr][rr][sr][as][bs][es][hs][is][ks][qs]
+PL[W]
+IL[am][cm][po][js]
+)
diff --git a/regression/games/semeai/semeai7.sgf b/regression/games/semeai/semeai7.sgf
new file mode 100644 (file)
index 0000000..c43b00c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-10]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];PL[1]
+AW[ba][fa][ab][bb][fb][bc][fc][ad][bd][cd][dd][ed][fd][gd][hd][id][jd][kd][ld][md][nd][od][pd][qd][rd][sd][fe][ff][cg][eg][ah][bh][ch][dh][eh][bi][ei][aj][bj][cj][bk][el][fl][em][gm][en][fn][gn][hn][in][jn][kn][ln][co][do][go][io][jo][mo][cp][gp][hp][ip][jp][mp][cq][gq][iq][mq][cr][gr][mr][nr][or][cs][gs][hs][ms][os]
+AB[pe][qe][re][se][af][bf][cf][df][ef][gf][hf][if][jf][kf][lf][mf][nf][of][pf][fg][gg][pg][fh][ph][ci][di][fi][pi][dj][ej][fj][pj][ak][ck][dk][fk][gk][pk][al][bl][cl][dl][gl][hl][pl][bm][dm][hm][im][jm][km][lm][mm][pm][an][bn][cn][dn][mn][nn][on][pn][ao][bo][eo][ko][lo][oo][qo][ap][bp][ep][kp][op][pp][qp][aq][eq][kq][qq][ar][er][ir][jr][kr][qr][rr][sr][as][bs][es][is][ks][qs]
+)
diff --git a/regression/games/semeai/semeai8.sgf b/regression/games/semeai/semeai8.sgf
new file mode 100644 (file)
index 0000000..f5b7652
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-10]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];PL[2]
+AW[ba][fa][ab][bb][fb][bc][fc][ad][bd][cd][dd][ed][fd][gd][hd][id][jd][kd][ld][md][nd][od][pd][qd][rd][sd][ce][fe][ff][eg][ah][bh][ch][dh][eh][bi][ei][aj][bj][cj][bk][el][fl][em][gm][en][fn][gn][hn][in][jn][kn][ln][co][do][go][io][mo][cp][gp][jp][mp][cq][gq][iq][jq][mq][cr][gr][hr][mr][nr][or][cs][gs][hs][ms][os]
+AB[pe][qe][re][se][af][bf][cf][df][ef][gf][hf][if][jf][kf][lf][mf][nf][of][pf][fg][gg][pg][fh][ph][ci][di][fi][pi][dj][ej][fj][pj][ak][ck][dk][fk][gk][pk][al][bl][cl][dl][gl][hl][pl][bm][dm][hm][im][jm][km][lm][mm][pm][an][bn][cn][dn][mn][nn][on][pn][ao][eo][ko][lo][oo][qo][ap][bp][ep][kp][op][pp][qp][aq][bq][eq][kq][qq][ar][br][er][ir][jr][kr][qr][rr][sr][as][bs][es][is][ks][qs]
+)
diff --git a/regression/games/semeai/semeai9.sgf b/regression/games/semeai/semeai9.sgf
new file mode 100644 (file)
index 0000000..e828cfd
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-10]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ja][na][pa][ab][bb][cb][jb][nb][ob][pb][qb][rb][cc][dc][ec][jc][mc][ed][fd][jd][md][fe][je][ke][me][bf][ff][gf][lf][mf][nf][of][pf][qf][rf][sf][bg][gg][ah][bh][ch][gh][ph][qh][rh][sh][ci][gi][hi][pi][aj][bj][cj][gj][ij][pj][ck][gk][hk][ik][jk][pk][gl][jl][pl][rl][am][bm][cm][em][fm][gm][jm][qm][rm][cn][dn][gn][jn][rn][sn][do][eo][go][jo][ep][fp][gp][jp][aq][fq][gq][jq][ar][br][fr][gr][kr][lr][mr][nr][or][bs][fs][gs][ks][ms]
+AB[ma][ra][lb][mb][sb][lc][nc][oc][pc][qc][rc][ad][bd][ld][be][ce][de][le][af][df][kf][dg][eg][kg][lg][mg][ng][og][pg][qg][rg][sg][eh][oh][ei][oi][ri][ej][oj][rj][ek][ok][rk][al][bl][cl][dl][el][il][ol][sl][dm][im][om][pm][in][pn][qn][ao][bo][io][po][ro][so][bp][cp][ip][kp][lp][mp][np][op][pp][qp][cq][dq][iq][kq][pq][dr][ir][jr][pr][ds][is][os]
+)
diff --git a/regression/games/semeai/semeaiko1.sgf b/regression/games/semeai/semeaiko1.sgf
new file mode 100644 (file)
index 0000000..f906854
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.15 (level 10) load and print]PB[Unknown]HA[4]KM[0.5]GN[GNU Go 3.1.15 load and print Random Seed 1007594786] 
+AW[ba][ca][da][ga][ja][ma][na][bb][cb][jb][mb][ac][cc][dc][gc][ic][jc][kc][mc][oc][ad][bd][cd][ed][id][ld][nd][od][je][le][ne][se][kf][lf][nf][qf][rf][sf][cg][eg][ig][lg][mg][og][pg][qg][ah][bh][ch][dh][eh][fh][ih][nh][ph][ai][ci][di][ei][hi][ii][ji][ki][oi][dj][ej][hj][jj][nj][oj][pj][ak][dk][ek][ik][kk][pk][el][fl][gl][jl][ll][nl][ol][ql][am][cm][em][fm][jm][km][mm][nm][pm][bn][cn][dn][en][in][ln][mn][on][pn][qn][ao][co][eo][go][ho][io][lo][po][ro][ap][bp][cp][hp][jp][qp][cq][dq][gq][hq][jq][mq][qq][cr][hr][jr][qr][rr][fs][gs][is][rs]
+AB[ea][ha][ia][oa][ab][db][eb][gb][hb][ib][lb][nb][ob][pb][ec][hc][nc][pc][dd][gd][hd][kd][pd][rd][sd][ae][be][ce][de][ge][ie][oe][pe][qe][re][af][cf][df][ef][gf][if][jf][mf][of][pf][ag][bg][dg][fg][gg][hg][jg][kg][gh][hh][jh][kh][lh][mh][rh][bi][fi][gi][li][mi][ni][aj][bj][cj][gj][kj][lj][mj][ck][fk][gk][hk][lk][mk][nk][ok][al][bl][cl][dl][hl][il][ml][bm][gm][im][rm][fn][gn][hn][jn][kn][nn][do][fo][jo][ko][mo][no][oo][dp][ep][fp][gp][kp][lp][mp][np][pp][aq][bq][eq][iq][kq][lq][oq][pq][br][dr][er][fr][gr][kr][lr][pr][as][cs][ds][js][ks][ps][qs]
+PL[B]
+IL[aa][bc][ng][oh][ij][jk][kl][pl][lm][om][bo][qo][hs]
+)
diff --git a/regression/games/semeai1.sgf b/regression/games/semeai1.sgf
new file mode 100644 (file)
index 0000000..664cbd5
--- /dev/null
@@ -0,0 +1,14 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-06-10]
+SY[Cgoban 1.9.2]TM[30:00(5x1:00)];
+AW[ba][fa][ab][bb][fb][bc][fc][ad][bd][cd][dd][ed][fd][gd][hd][id][jd][kd][ld][md][nd][od][pd][qd][rd][sd][fe][ff][eg][ah][bh][ch][dh][eh][bi][aj][bj][el][fl][em][gm][en][fn][gn][hn][in][jn][kn][ln][co][do][go][io][mo][cp][gp][hp][ip][mp][cq][gq][mq][cr][gr][mr][nr][or][cs][gs][ms][os]
+AB[pe][qe][re][se][af][bf][cf][df][ef][gf][hf][if][jf][kf][lf][mf][nf][of][pf][fg][gg][pg][fh][ph][fi][pi][dj][ej][fj][pj][dk][fk][gk][pk][al][bl][cl][dl][gl][hl][pl][bm][dm][hm][im][jm][km][lm][mm][pm][an][bn][cn][dn][mn][nn][on][pn][ao][eo][ko][lo][oo][qo][ap][ep][kp][op][pp][qp][aq][eq][kq][qq][ar][er][ir][jr][kr][qr][rr][sr][as][es][is][ks][qs]
+;B[cj];W[iq];B[bk];W[hr];B[ak];W[lp];B[di];W[no];B[ci];W[jq];B[ei];
+W[jp];B[dg];W[de];B[oq];W[fo];B[pr];W[lq];B[dq];W[bo];B[dp];W[ls];
+B[dr];W[lr];B[bg];W[fp];B[bp];W[ds];B[ps];W[fq];B[nq];W[be];B[ag];
+W[ce];B[cg];W[ee];B[bq];W[fr];B[br];W[hs];B[np];W[jo]
+)
diff --git a/regression/games/semeai2.sgf b/regression/games/semeai2.sgf
new file mode 100644 (file)
index 0000000..de87962
--- /dev/null
@@ -0,0 +1,26 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[5.5]
+DT[2000-09-14]
+SY[Cgoban 1.9.10]TM[-];B[pd];W[dp];B[de];W[pp];B[dc];W[qf];B[nd];W[lc]
+;B[me];W[qi];B[nq];W[np];B[mp];W[no];B[oq];W[pq];B[jq];W[pn];B[fq];
+W[fp];B[gp];W[fo];B[eq];W[dq];B[ql];W[dn];B[ol];W[ck];B[ci];W[ic];
+B[ie];W[fc];B[ej];W[qm];B[pl];W[ml];B[nm];W[mj];B[mn];W[ni];B[mo];
+W[nb];B[qe];W[re];B[rd];W[rf];B[hn];W[bi];B[bj];W[cj];B[bh];W[ig];
+B[ke];W[di];B[ch];W[bk];B[ai];W[dh];B[dj];W[lh];B[ge];W[gj];B[fi];
+W[eg];B[bg];W[gd];B[gg];W[gh];B[fh];W[fg];B[gi];W[fe];B[hi];W[gf];
+B[hh];W[jh];B[he];W[hf];B[el];W[dl];B[dg];W[eh];B[hj];W[gk];B[og];
+W[hk];B[ho];W[ph];B[ik];W[ij];B[eb];W[jj];B[il];W[gm];B[gb];W[fb];
+B[ib];W[ea];B[da];W[fa];B[hd];W[hc];B[gc];W[fd];B[hb];W[jc];B[jb];
+W[kb];B[kl];W[pb];B[rb];W[or];B[nr];W[pr];B[gn];W[fk];B[ek];W[er];
+B[fr];W[dr];B[qj];W[pj];B[rj];W[gl];B[ri];W[rh];B[sh];W[rl];B[si];
+W[sg];B[rk];W[rm];B[ak];W[bl];B[pf];W[sk];B[ef];W[ff];B[pk];W[qc];
+B[qd];W[rc];B[sc];W[oj];B[lm];W[mc];B[oh];W[qb];B[oi];W[qg];B[se];
+W[oc];B[pi];W[ra];B[sb];W[ii];B[qh];W[hg];B[rg];W[em];B[sf];W[gh];
+B[fn];W[fm];B[en];W[gg];B[nk];W[nj];B[mk];W[lk];B[ll];W[on];B[od];
+W[ns];B[ms];W[os];B[lr];W[fs];B[gs];W[es];B[hr];W[op];B[hm];W[cf];
+B[df];W[kk];B[ec];W[jk];B[jl];W[al];B[eo];W[do];B[ep];W[aj];B[ed];
+W[bi];B[ah];W[bj];B[ee];W[nh];B[ng];W[mg];B[mf];W[lf];B[le];W[kf];
+B[jf];W[jg];B[om];W[ld];B[kd];W[kc];B[jd];W[pm];B[md];W[id];B[hl];
+W[nc];B[nn];W[ok];B[nl];W[if];B[je];W[pc];B[sd];W[qa];B[sa];W[ce];
+B[cg];W[cd];B[cc];W[bf];B[cb];W[sl];B[bd];W[sj];B[tt];W[tt]
+)
diff --git a/regression/games/semeai3.sgf b/regression/games/semeai3.sgf
new file mode 100644 (file)
index 0000000..eb0e7bf
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.192 ascii]HA[3]KM[0.5]GN[GNU Go 2.7.192 ascii Random Seed 974118161] 
+AB[dd]AB[pd]AB[dp]
+;W[pp];B[nq];W[oq];B[jd];W[fq];B[dn];W[pj];B[qh];W[cq];B[em]
+;W[dq];B[np];W[cf];B[df];W[cc];B[ce];W[cd];B[cg];W[dc];B[jp]
+;W[ed];B[bf];W[de];B[qf];W[ic];B[oc];W[jc];B[nj];W[pl];B[nm]
+;W[on];B[ac];W[bb];B[ff];W[ee];B[rj];W[rl];B[lc];W[kd];B[je]
+;W[kc];B[op];W[pq];B[om];W[pm];B[kb];W[jb];B[lb];W[iq];B[or]
+;W[pr];B[nr];W[kq];B[nn];W[oo];B[ks];W[ko];B[jo];W[fe];B[kp]
+;W[no];B[jq];W[jr];B[kr];W[ir];B[lq];W[mo];B[kn];W[ln];B[km]
+;W[lm];B[lo];W[mn];B[ol];W[ok];B[nk];W[ll];B[lj];W[kl];B[jl]
+;W[gf];B[fg];W[gg];B[jh];W[be];B[bd];W[ae];B[cf];W[bc];B[af]
+;W[kj];B[jk];W[ki];B[kk];W[lk];B[ii];W[li];B[mj];W[mh];B[oi]
+;W[pi];B[kh];W[oh];B[nh];W[ng];B[ni];W[mg];B[ph];W[og];B[me]
+;W[fh];B[gh];W[hh];B[gi];W[hi];B[eh];W[fi];B[gj];W[ei];B[eg]
+;W[fk];B[hj];W[ig];B[di];W[fj];B[pk];W[qk];B[gm];W[cp];B[ck]
+;W[do];B[dj];W[cn];B[cm];W[bn];B[ih];W[hg];B[ep];W[jg];B[he]
+;W[ke];B[gd];W[eo];B[kf];W[jf];B[ge];W[ie];B[kg];W[mi];B[fp]
+;W[fo];B[gp];W[go];B[hp];W[ip];B[ho];W[gq];B[hq];W[hr];B[eq]
+;W[er];B[io];W[fr];B[bm];W[am];B[al];W[an];B[rk];W[bl];B[ak]
+;W[gk];B[bk];W[ij];B[hk];W[ik];B[hl];W[jj];B[lf];W[il];B[jm]
+;W[hm];B[gl];W[gn];B[fm];W[md];B[ld];W[le];B[mf];W[nd];B[od]
+;W[pe];B[qe];W[ne];B[nf];W[of];B[oe];W[im];B[pf];W[oj];B[ab]
+;W[ba];B[pg];W[mk];B[en];W[hn];B[in];W[mp];B[lp];W[mq];B[mr]
+;W[ka];B[la];W[ja];B[qi];W[qj];B[ps];W[qs];B[os];W[qr];B[sk]
+;W[sl];B[ri];W[js];B[ef];W[aa];B[ad];W[dl];B[cl];W[ji];B[mc]
+;W[nl];B[fn];W[ek];B[dk];W[tt];B[eb];W[fc];B[ec];W[fd];B[hd]
+;W[id];B[gc];W[fb];B[nc];W[gb];B[lh];W[mm];B[lg];W[tt];B[tt]
+)
diff --git a/regression/games/splee.sgf b/regression/games/splee.sgf
new file mode 100644 (file)
index 0000000..4d43706
--- /dev/null
@@ -0,0 +1,300 @@
+(;GM[1]FF[4]CA[UTF-8]AP[gGo:0.2]ST[1]
+SZ[19]HA[9]KM[5.5]
+PW[Human]PB[Computer]RE[W+1.5]
+AB[dd][dj][dp][jd][jj][jp][pd][pj][pp]
+;W[fc]
+;B[hc]
+;W[cc]
+;B[cd]
+;W[dc]
+;B[ed]
+;W[fb]
+;B[ge]
+;W[cn]
+;B[dn]
+;W[fq]
+;B[co]
+;W[nq]
+;B[np]
+;W[mp]
+;B[no]
+;W[oq]
+;B[pq]
+;W[kq]
+;B[jq]
+;W[dr]
+;B[kr]
+;W[op]
+;B[oo]
+;W[po]
+;B[mq]
+;W[pr]
+;B[qo]
+;W[qq]
+;B[pn]
+;W[qp]
+;B[mr]
+;W[cq]
+;B[md]
+;W[cm]
+;B[cg]
+;W[qf]
+;B[qh]
+;W[of]
+;B[mf]
+;W[dm]
+;B[en]
+;W[em]
+;B[fn]
+;W[lo]
+;B[bo]
+;W[ho]
+;B[fm]
+;W[lq]
+;B[lr]
+;W[ko]
+;B[jo]
+;W[jn]
+;B[hq]
+;W[gq]
+;B[gr]
+;W[hp]
+;B[hl]
+;W[km]
+;B[in]
+;W[io]
+;B[qe]
+;W[ir]
+;B[rf]
+;W[od]
+;B[oc]
+;W[nc]
+;B[ob]
+;W[nd]
+;B[ml]
+;W[nb]
+;B[hr]
+;W[iq]
+;B[jr]
+;W[ip]
+;B[ln]
+;W[kn]
+;B[kp]
+;W[lp]
+;B[pc]
+;W[kc]
+;B[ng]
+;W[kd]
+;B[kf]
+;W[pe]
+;B[qg]
+;W[pf]
+;B[re]
+;W[ic]
+;B[id]
+;W[jb]
+;B[lm]
+;W[kk]
+;B[jl]
+;W[kl]
+;B[ne]
+;W[nf]
+;B[hb]
+;W[ke]
+;B[le]
+;W[jf]
+;B[je]
+;W[kg]
+;B[lf]
+;W[hd]
+;B[gd]
+;W[lb]
+;B[mc]
+;W[mb]
+;B[ka]
+;W[og]
+;B[mg]
+;W[if]
+;B[jg]
+;W[ig]
+;B[he]
+;W[oh]
+;B[ja]
+;W[jh]
+;B[na]
+;W[oj]
+;B[ok]
+;W[nj]
+;B[kj]
+;W[mk]
+;B[po]
+;W[or]
+;B[rp]
+;W[rq]
+;B[ro]
+;W[rr]
+;B[lj]
+;W[lk]
+;B[mi]
+;W[ij]
+;B[ik]
+;W[ii]
+;B[jk]
+;W[lh]
+;B[mh]
+;W[ej]
+;B[hj]
+;W[hi]
+;B[gj]
+;W[di]
+;B[gi]
+;W[gh]
+;B[fi]
+;W[fg]
+;B[ci]
+;W[cj]
+;B[dk]
+;W[ck]
+;B[ei]
+;W[dh]
+;B[ek]
+;W[ch]
+;B[bg]
+;W[bh]
+;B[nk]
+;W[mj]
+;B[ki]
+;W[kh]
+;B[li]
+;W[pi]
+;B[qj]
+;W[qi]
+;B[ri]
+;W[ib]
+;B[ef]
+;W[bc]
+;B[ia]
+;W[kb]
+;B[ph]
+;W[bf]
+;B[eh]
+;W[eg]
+;B[dg]
+;W[bi]
+;B[ff]
+;W[gf]
+;B[cf]
+;W[be]
+;B[ce]
+;W[fd]
+;B[fe]
+;W[bd]
+;B[hf]
+;W[hg]
+;B[al]
+;W[bl]
+;B[gg]
+;W[hh]
+;B[fh]
+;W[oi]
+;B[rj]
+;W[ma]
+;B[am]
+;W[oa]
+;B[is]
+;W[fr]
+;B[pa]
+;W[ak]
+;B[hn]
+;W[gs]
+;B[ar]
+;W[br]
+;B[aq]
+;W[el]
+;B[fl]
+;W[dl]
+;B[fk]
+;W[ga]
+;B[ha]
+;W[an]
+;B[ao]
+;W[mn]
+;B[mm]
+;W[mo]
+;B[bn]
+;W[nm]
+;B[nl]
+;W[nn]
+;B[bm]
+;W[cl]
+;B[ag]
+;W[ah]
+;B[om]
+;W[gb]
+;B[go]
+;W[hs]
+;B[fp]
+;W[dq]
+;B[ec]
+;W[eb]
+;B[eq]
+;W[er]
+;B[ep]
+;W[jm]
+;B[im]
+;W[bq]
+;B[sq]
+;W[sr]
+;B[sp]
+;W[af]
+;B[na]
+;W[oe]
+;B[me]
+;W[oa]
+;B[bk]
+;W[bj]
+;B[na]
+;W[rh]
+;B[rg]
+;W[oa]
+;B[aj]
+;W[ai]
+;B[na]
+;W[bs]
+;B[oa]
+;W[as]
+;B[ap]
+;W[gc]
+;B[on]
+;W[ie]
+;B[gp]
+;W[js]
+;B[ji]
+;W[nr]
+;B[cp]
+;W[ms]
+;B[lg]
+;W[ls]
+;B[ll]
+;W[ks]
+;B[pg]
+;W[tt]
+;B[ni]
+;W[tt]
+;B[nh]
+;W[tt]
+;B[lc]
+;W[tt]
+;B[ld]
+;W[tt]
+;B[bp]
+;W[tt]
+;B[hd]
+;W[tt]
+;B[jc]
+;W[tt]
+;B[la]
+;W[tt]
+;B[tt]TB[an][de][df][do][ee][eg][ej][eo][fg][fj][fo][gf][gk][gl][gm][gn][hk][hm][il][ol][pb][pk][pl][pm][qa][qb][qc][qd][qk][ql][qm][qn][ra][rb][rc][rd][rh][rk][rl][rm][rn][sa][sb][sc][sd][se][sf][sg][sh][si][sj][sk][sl][sm][sn][so]TW[aa][ab][ac][ad][ae][aj][ba][bb][bk][ca][cb][ci][cr][cs][da][db][ds][ea][es][fa][fs][gr][hq][hr][ih][is][jg][jo][jp][jq][jr][kp][kr][lr][mq][mr][ns][os][ps][qr][qs][rs][ss]
+)
+
diff --git a/regression/games/splee2.sgf b/regression/games/splee2.sgf
new file mode 100644 (file)
index 0000000..a714202
--- /dev/null
@@ -0,0 +1,170 @@
+(;GM[1]FF[4]CA[UTF-8]AP[gGo:0.3.8]ST[1]
+SZ[19]HA[9]KM[0.0]
+PW[Human]PB[Computer]RE[W+24]
+AB[dd][dj][dp][jd][jj][jp][pd][pj][pp]
+;W[fc]
+;B[dc]
+;W[hd]
+;B[md]
+;W[qn]
+;B[pn]
+;W[pm]
+;B[on]
+;W[qk]
+;B[qo]
+;W[qj]
+;B[ic]
+;W[qf]
+;B[dg]
+;W[pc]
+;B[oc]
+;W[qd]
+;B[mm]
+;W[rn]
+;B[ro]
+;W[om]
+;B[cn]
+;W[fq]
+;B[fo]
+;W[dr]
+;B[hq]
+;W[cq]
+;B[gg]
+;W[gp]
+;B[hn]
+;W[hp]
+;B[ip]
+;W[cj]
+;B[ci]
+;W[ck]
+;B[dk]
+;W[cm]
+;B[dm]
+;W[dl]
+;B[el]
+;W[cl]
+;B[bn]
+;W[bi]
+;B[ch]
+;W[bh]
+;B[bg]
+;W[dn]
+;B[em]
+;W[bm]
+;B[ah]
+;W[co]
+;B[bo]
+;W[bp]
+;B[cp]
+;W[an]
+;B[do]
+;W[ao]
+;B[en]
+;W[br]
+;B[nh]
+;W[cf]
+;B[be]
+;W[ee]
+;B[fd]
+;W[ed]
+;B[gc]
+;W[ce]
+;B[ec]
+;W[bj]
+;B[bf]
+;W[eg]
+;B[df]
+;W[de]
+;B[ef]
+;W[fe]
+;B[gd]
+;W[cg]
+;B[ff]
+;W[ge]
+;B[cd]
+;W[dh]
+;B[di]
+;W[hf]
+;B[hc]
+;W[hg]
+;B[ie]
+;W[eh]
+;B[gh]
+;W[fi]
+;B[fk]
+;W[hh]
+;B[gi]
+;W[hi]
+;B[gj]
+;W[kg]
+;B[hj]
+;W[ki]
+;B[qh]
+;W[lk]
+;B[kl]
+;W[nf]
+;B[he]
+;W[gf]
+;B[fg]
+;W[mq]
+;B[nm]
+;W[jr]
+;B[hr]
+;W[kq]
+;B[kj]
+;W[lj]
+;B[ob]
+;W[pe]
+;B[nj]
+;W[nk]
+;B[li]
+;W[mi]
+;B[lh]
+;W[mh]
+;B[kh]
+;W[lg]
+;B[ji]
+;W[jh]
+;B[ki]
+;W[mf]
+;B[mj]
+;W[mk]
+;B[pk]
+;W[pl]
+;B[oh]
+;W[ok]
+;B[rg]
+;W[pi]
+;B[ph]
+;W[ni]
+;B[sn]
+;W[rm]
+;B[pb]
+;W[qc]
+;B[jq]
+;W[oq]
+;B[mo]
+;W[kp]
+;B[ko]
+;W[qr]
+;B[sm]
+;W[sl]
+;B[so]
+;W[rl]
+;B[fr]
+;W[eq]
+;B[lp]
+;W[lq]
+;B[qb]
+;W[kn]
+;B[jo]
+;W[kk]
+;B[jk]
+;W[no]
+;B[oo]
+;W[mp]
+;B[rb]
+;W[lo]
+;B[mn]
+;W[np]
+)
diff --git a/regression/games/ssstator.sgf b/regression/games/ssstator.sgf
new file mode 100644 (file)
index 0000000..2d5b652
--- /dev/null
@@ -0,0 +1,54 @@
+(;
+GM[1]US[Brought to you by No Name Go Server]
+CoPyright[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[GnuGo-ssstator(B) NNGS]
+EV[None]
+RE[W+Resign]
+PW[GnuGo]WR[15k*]
+PB[ssstator]BR[NR ]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2001-06-10]
+SZ[19]TM[900]KM[0.5]
+
+;B[qd];W[pp];B[dq];W[cc];B[fd];W[cf];B[co];W[od];B[pd];W[jp];B[qn];W[np]
+;B[qj];W[hc];B[hd];W[id];B[he];W[cj];B[dd];W[cm]C[
+ gunnar started observation.
+]
+;B[di];W[ch];B[ci];W[dj];B[ei];W[cd];B[de];W[gq];B[ph];W[jc];B[md];W[jf]
+;B[ig];W[ro];B[rn];W[nf];B[oe];W[ne];B[nd]C[
+ ingwa started observation.
+]
+;W[bi];B[oc];W[lf];B[if];W[mn];B[iq];W[jq];B[hp];W[eb];B[fb];W[ke];B[gp]
+;W[ir];B[hr];W[hq];B[ip];W[gr];B[dc];W[of];B[pf];W[ec];B[fc];W[db];B[ce]
+;W[be];B[df];W[cg];B[dh];W[bn];B[bo];W[ds];B[cr];W[pg];B[qg];W[og]C[
+ plasma started observation.
+]
+;B[qh];W[mb];B[lc];W[lb];B[kc];W[kb];B[nb];W[fk];B[ia];W[hk]C[
+ gunnar started observation.
+]
+;B[fq]C[
+ plasma started observation.
+]
+;W[fp];B[fr];W[hs];B[fo];W[fs];B[ep];W[gn];B[gi];W[in];B[qo];W[rp];B[qp]
+;W[qq];B[pl];W[oj];B[pj];W[jg];B[ih];W[jh];B[nl];W[ml];B[nk];W[nm];B[om]
+;W[kk];B[ij];W[kj];B[nj];W[ik];B[gj];W[fn];B[oo];W[op];B[no];W[mo];B[nn]
+;W[dn];B[do];W[dg];B[eg];W[oi];B[oh];W[ni];B[nh];W[mi];B[mm];W[lm];B[ll]
+;W[kl];B[mk]C[
+ dennis started observation.
+]
+;W[cs];B[er];W[es];B[cn];W[bm];B[en];W[em];B[dm]C[
+ bump started observation.
+]
+;W[dl];B[fm];W[dn];B[eo];W[br]C[
+ lloigor started observation.
+]
+;B[bq];W[ed];B[ee];W[mc];B[ld];W[nc];B[ob];W[jb];B[dm];W[ck];B[el];W[ek]
+;B[fl];W[gk];B[gm];W[hm];B[go];W[hn];B[lj];W[li];B[mg];W[le];B[mf];W[me]
+;B[lg];W[ji];B[jj];W[lk];B[ml];W[hj];B[ii];W[dr];B[cq];W[bs];B[jk];W[jl]
+;B[ie];W[je];B[kd];W[gl];B[em];W[ib];B[ha];W[hb];B[gb];W[mj];B[ea];W[cb]
+;B[od];W[jd];B[kh];W[ki];B[ln];W[km];B[lo];W[mp];B[lp];W[lq];B[jo];W[io]
+;B[jn];W[da];B[fa];W[ja];B[ga];W[fe];B[ef];W[ff];B[gd];W[fg];B[eh];W[fi]
+;B[fh];W[gh];B[fj];W[ej];B[gg];W[hh];B[hi];W[fi]
+;)
diff --git a/regression/games/strategy1.sgf b/regression/games/strategy1.sgf
new file mode 100644 (file)
index 0000000..f976814
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.138 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.138 load and print Random Seed 964275209] 
+AW[nd][qf][qn][oo][qp]
+AB[dd][pd][pf][cj][dp][mp][oq]
+PL[W]
+
+)
diff --git a/regression/games/strategy10.sgf b/regression/games/strategy10.sgf
new file mode 100644 (file)
index 0000000..cb6c193
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.149 load and print]HA[4]KM[0.5]GN[GNU Go 2.7.149 load and print Random Seed 965620464] 
+AW[ia][ja][eb][gb][hb][kb][qb][cc][dc][fc][ic][kc][lc][nc][rc][bd][ed][hd][id][kd][md][nd][rd][ee][ie][je][oe][pe][qe][re][cf][df][ff][hf][if][kf][of][sf][ag][dg][eg][fg][kg][pg][bh][ch][eh][kh][ph][qh][rh][sh][bi][ci][ei][ki][li][cj][ej][lj][mj][lk][nk][pk][gl][nl][pl][sl][gm][hm][mm][nm][om][pm][rm][sm][gn][nn][pn][qn][fo][go][oo][po][ro][fp][qp][rp][gq][mq][pq][gr][lr][mr][or][pr][qr][os]
+AB[gc][hc][pc][dd][fd][gd][ld][od][pd][qd][de][fe][ge][he][ke][le][ne][gf][jf][mf][nf][pf][qf][rf][gg][hg][jg][lg][ng][og][ah][dh][fh][ih][jh][lh][nh][oh][ai][di][fi][hi][ii][mi][ni][pi][qi][ri][si][aj][bj][dj][fj][hj][jj][nj][oj][pj][sj][ak][ck][dk][ek][fk][gk][jk][kk][mk][ok][qk][sk][bl][hl][il][ll][ml][ol][ql][rl][fm][im][jm][km][lm][qm][fn][hn][in][ln][mn][eo][ho][jo][lo][no][dp][gp][hp][jp][kp][mp][op][pp][eq][fq][lq][nq][oq][kr][nr][ms]
+PL[W]
+IL[oi][bk][mo][lp][np]
+)
diff --git a/regression/games/strategy11.sgf b/regression/games/strategy11.sgf
new file mode 100644 (file)
index 0000000..f18ac76
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.151 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.151 ascii Random Seed 965890361] 
+;B[dp];W[oq];B[pd];W[ce];B[jq];W[qq];B[cj];W[qo];B[cg];W[cc]
+;B[mq];W[cq];B[dq];W[co];B[cm];W[bn];B[cp];W[dn];B[gp];W[el]
+;B[em];W[en];B[dm];W[fo];B[qj];W[fp];B[fq];W[eq];B[ep];W[fm]
+;B[fl];W[gl];B[fk];W[ho];B[gm];W[fn];B[hl];W[bq];B[bp];W[er]
+;B[gq];W[dr];B[mo];W[hn];B[qm];W[fr];B[hc];W[gk];B[gj];W[hk]
+;B[ik];W[hj];B[hi];W[ij];B[jj];W[ii];B[ih];W[ji];B[ki];W[ek]
+;B[jh];W[bm];B[bl];W[cl];B[dl];W[ej];B[di];W[ck];B[dk];W[ei]
+;B[bk];W[ec];B[eh];W[hr];B[hq];W[ko];B[ir];W[nr];B[an];W[mr]
+;B[am];W[cn];B[br];W[cr];B[aq];W[gr];B[kp];W[lq];B[lp];W[bo]
+;B[ao];W[lr];B[ee];W[ln];B[nc];W[jm];B[qe];W[on];B[om];W[im]
+;B[kc];W[nn];B[fb];W[mn];B[ca];W[bb];B[kl];W[km];B[bf];W[ad]
+;B[rn];W[be];B[ba];W[pn];B[sq];W[ed];B[gd];W[eb];B[ea];W[ab]
+;B[rr];W[qr];B[de];W[ro];B[dd];W[fc];B[ml];W[gb];B[so];W[dc]
+;B[hb];W[ga];B[ha];W[gc];B[jl];W[fe];B[fd];W[df];B[he];W[ff]
+;B[gg];W[fg];B[fh];W[pm];B[pl];W[ol];B[nm];W[ql];B[rl];W[ll]
+;B[pk];W[mk];B[nj];W[nk];B[rq];W[oj];B[mi];W[ok];B[oi];W[pi]
+;B[pj];W[qi];B[ph];W[ri];B[rj];W[rs];B[qh];W[rh];B[rg];W[oh]
+;B[ni];W[qg];B[pg];W[og];B[qf];W[ne];B[nf];W[me];B[rp];W[qp]
+;B[sr];W[lg];B[of];W[kg];B[lk];W[mm];B[lm];W[pf];B[pe];W[ll]
+;B[mj];W[nl];B[if];W[mg];B[ke];W[af];B[ag];W[dg];B[ae];W[ch]
+;B[bh];W[dh];B[af];W[ci];B[bi];W[dj];B[cf];W[fi];B[gh];W[gf]
+;B[bd];W[cd];B[ac];W[hf];B[hg];W[gn];B[hm];W[il];B[kk];W[ge]
+;B[hd];W[eg];B[fj];W[di];B[qn];W[qs];B[sp];W[ss];B[sn];W[lf]
+;B[eo];W[do];B[ap];W[kf];B[ad];W[bc];B[gi];W[ef];B[ar];W[mf]
+;B[bs];W[cs];B[hs];W[gs];B[is];W[es];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/strategy12.sgf b/regression/games/strategy12.sgf
new file mode 100644 (file)
index 0000000..ac4151d
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.153 ascii]HA[0]KM[5.5]GN[GNU Go 2.7.153 ascii Random Seed 966598928]
+
+;B[pd]
+;W[ep]
+;B[pp]
+;W[ed]
+;B[jc]
+;W[nc]
+;B[nd]
+;W[md]
+;B[mc]
+;W[nb]
+;B[gc]
+;W[od]
+;B[lc]
+;W[ne]
+;B[cd]
+;W[ce]
+;B[be]
+;W[de]
+;B[ec]
+;W[dc]
+;B[ad]
+;W[cc]
+;B[eb]
+;W[bc]
+;B[jq]
+;W[bf]
+;B[gq]
+;W[nq]
+)
diff --git a/regression/games/strategy13.sgf b/regression/games/strategy13.sgf
new file mode 100644 (file)
index 0000000..235f62c
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.155 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.155 load and print Random Seed 966899932] 
+AW[jc][nc][oc][dd][ed][ld][md][fe][he][dg][eg][ch][fh][ph][oi][qi][cj][nj][pj][rj][rk][bl][gl][jl][nl][pl][ql][im][pm][cn][io][mo][oo][po][bp][gp][jp][pp][qp][eq][fq][gq][kq][cr][dr]
+AB[cc][dc][fc][pc][cd][nd][pd][me][ne][pf][bg][cg][gg][qg][gh][qh][fi][ri][ej][gj][lj][qj][qk][cl][el][ll][rl][qm][sm][dn][mn][qn][rn][fo][go][lo][no][dp][fp][lp][op][rp][dq][lq][nq][pq][qq][rq]
+PL[W]
+IL[rm]
+)
diff --git a/regression/games/strategy14.sgf b/regression/games/strategy14.sgf
new file mode 100644 (file)
index 0000000..4d39258
--- /dev/null
@@ -0,0 +1,34 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.156 gmp]HA[0]KM[0.5]GN[GNU Go 2.7.156 gmp Random Seed -268442287] 
+AB[pd]AB[dp]
+LB[kc:25][nc:25][qc:13][md:19][nd:15][pf:15][qf:25][pg:19][qi:25][ck:25][dm:19][cn:25][dn:15][fp:15][gp:19][pp:75][cq:13][fq:25][iq:25]
+C[Value of move: 75]
+;W[pp];B[cc];W[hc];B[qn];W[ql];B[qq];W[qp];B[pq];W[op];B[nq]
+;W[pm];B[qf];W[cn];B[fp];W[bp];B[cl];W[nc];B[cq];W[dm];B[lc]
+;W[ec];B[le];W[bq];B[co];W[bo];B[cp];W[hq];B[eo];W[kq];B[hp]
+;W[ip];B[gq];W[cr];B[dr];W[br];B[oq];W[cj];B[de];W[cg];B[fe]
+;W[hr];B[dk];W[fm];B[ho];W[qi];B[io];W[qc];B[pc];W[pb];B[ob]
+;W[qb];B[oc];W[nb];B[oa];W[be];B[oi];W[he];B[rd];W[jd];B[jb]
+;W[hb];B[fg];W[dd];B[cd];W[ce];B[ed];W[dc];B[cb];W[fc];B[bd]
+;W[db];B[iq];W[ir];B[jp];W[fi];B[gr];W[ih];B[nd];W[jq];B[pn]
+;W[ig];B[fk];W[ef];B[eh];W[hm];B[jm];W[ik];B[rh];W[ro];B[rn]
+;W[rq];B[rr];W[ri];B[sq];W[lm];B[nn];W[mo];B[nl];W[lp];B[ll]
+;W[mr];B[qh];W[ok];B[no];W[np];B[nr];W[nk];B[rp];W[kl];B[qo]
+;W[ml];B[lk];W[nm];B[km];W[im];B[jk];W[ii];B[jl];W[mq];B[df]
+;W[ee];B[eg];W[fd];B[dg];W[bg];B[li];W[lg];B[kf];W[kg];B[ln]
+;W[mn];B[po];W[mm];B[kn];W[hj];B[ge];W[ng];B[gg];W[oh];B[pi]
+;W[ni];B[ph];W[mk];B[hf];W[if];B[hd];W[ie];B[gd];W[jc];B[kb]
+;W[ib];B[si];W[rj];B[og];W[nh];B[of];W[jj];B[bk];W[bj];B[dl]
+;W[lj];B[kk];W[kj];B[bm];W[bn];B[nf];W[ip];B[jo];W[iq];B[rl]
+;W[rk];B[rm];W[mf];B[md];W[ns];B[os];W[ms];B[me];W[in];B[aj]
+;W[dj];B[ej];W[ei];B[bi];W[ah];B[ai];W[el];B[di];W[ek];B[ci]
+;W[fj];B[bf];W[cf];B[bh];W[af];B[id];W[ch];B[ic];W[fb];B[je]
+;W[ea];B[pj];W[pk];B[dn];W[cm];B[al];W[dh];B[ak];W[an];B[fn]
+;W[ck];B[ej];W[dj];B[cj];W[em];B[gn];W[ej];B[jf];W[ca];B[bb]
+;W[ja];B[oj];W[jg];B[qj];W[qk];B[am];W[ds];B[er];W[nj];B[ka]
+;W[ia];B[ba];W[da];B[il];W[hl];B[gm];W[gl];B[en];W[sl];B[es]
+;W[cs];B[ff];W[ed];B[hs];W[gc];B[hg];W[fh];B[oo];W[mp];B[om]
+;W[ol];B[on];W[qm];B[lf];W[mg];B[is];W[js];B[gs];W[gh];B[kd]
+;W[hh];B[kc];W[sj];B[sh];W[sm];B[so];W[kp];B[jn];W[ko];B[hn]
+;W[lo];B[sn];W[sk];B[tt];W[tt]
+)
diff --git a/regression/games/strategy14a.sgf b/regression/games/strategy14a.sgf
new file mode 100644 (file)
index 0000000..32da5b2
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.167 load and print]
+HA[0]KM[0.5]
+GN[GNU Go 2.7.167 load and print Random Seed 969386153]
+PL[W]AW[cc][hc][ql][pm][cn][bp][op][pp][qp][cq]
+AB[pd][qf][cl][qn][dp][fp][dq][nq][pq][qq]
+)
diff --git a/regression/games/strategy15.sgf b/regression/games/strategy15.sgf
new file mode 100644 (file)
index 0000000..5c72877
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.156 ascii]HA[3]KM[5.5]GN[GNU Go 2.7.156 ascii Random Seed 967191357] 
+AB[cc]AB[gc]AB[cg]
+;W[ff];B[tt];W[ee];B[tt];W[ed];B[fh]
+)
diff --git a/regression/games/strategy16.sgf b/regression/games/strategy16.sgf
new file mode 100644 (file)
index 0000000..b1eda7f
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.156 ascii]HA[3]KM[5.5]GN[GNU Go 2.7.156 ascii Random Seed 967192307] 
+AB[cc]AB[gc]AB[cg]
+;W[gf];B[tt]
+)
diff --git a/regression/games/strategy17.sgf b/regression/games/strategy17.sgf
new file mode 100644 (file)
index 0000000..247403c
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]
+PW[GNU Go]
+PB[GNU Go 2.7.153 load and print]
+HA[0]KM[5.5]
+GN[GNU Go 2.7.153 load and print Random Seed 968109958]
+AW[pa][eb][lb][ob][qb][dc][hc][ic][lc][nc][pc][dd][gd][jd][kd][de][jg][ql][km][do][qo][dp][fp][dq][eq][hq][kq][er]
+AB[ja][na][hb][ib][kb][rb][cc][fc][jc][kc][qc][cd][ld][pd][qd][je][cf][kf][pf][qj][cn][io][ko][cp][cq][fq][nq][qq][cr][dr]
+PL[W]IL[jb]
+)
diff --git a/regression/games/strategy18.sgf b/regression/games/strategy18.sgf
new file mode 100644 (file)
index 0000000..12a66b3
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-09-12]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ea][eb][ac][bc][cc][dc][ec][fc][gc][hc][ic][id][ee][ef][ff][ag][bg][cg][gg][hg][ig][ah][ch][gh][ih][bi][ci][gi][hi]
+AB[ad][bd][cd][dd][gd][ce][ge][af][bf][cf][gf][hf][if][dg][eg][fg][dh][fh][di][ei]
+)
diff --git a/regression/games/strategy19.sgf b/regression/games/strategy19.sgf
new file mode 100644 (file)
index 0000000..ae40cc9
--- /dev/null
@@ -0,0 +1,16 @@
+(;GM[1]FF[4]RU[Japanese]SZ[13]
+PW[GNU Go]PB[GNU Go 2.7.164 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.164 ascii Random Seed 968847314] 
+;B[jd];W[cc];B[jk];W[cj];B[ek];W[di];B[ej];W[kf];B[hc];W[kd]
+;B[kc];W[lc];B[lb];W[le];B[jb];W[fc];B[kh];W[cf];B[if];W[ff]
+;B[gg];W[cl];B[jg];W[je];B[ie];W[lg];B[lh];W[md];B[jf];W[hk]
+;B[el];W[ke];B[eh];W[fh];B[ei];W[fg];B[ge];W[fe];B[gd];W[gf]
+;B[gh];W[fi];B[fj];W[gi];B[gj];W[hj];B[hi];W[hh];B[ii];W[gk]
+;B[fl];W[hg];B[ih];W[dh];B[eg];W[fd];B[ef];W[gb];B[hb];W[ha]
+;B[ia];W[ga];B[gc];W[fb];B[de];W[gl];B[ij];W[mb];B[dd];W[la]
+;B[kb];W[ma];B[ka];W[mc];B[dc];W[db];B[cd];W[be];B[bc];W[cb]
+;B[bd];W[bb];B[dg];W[cg];B[ab];W[hf];B[he];W[mh];B[mi];W[mg]
+;B[li];W[kg];B[ae];W[ig];B[bf];W[bg];B[ce];W[ac];B[ad];W[dl]
+;B[dm];W[dk];B[dj];W[bi];B[ch];W[ci];B[cm];W[bm];B[em];W[bl]
+;B[df];W[ec];B[ag];W[bh];B[ah];W[ba];B[ai];W[aj];B[af];W[aa]
+;B[ac];W[ee];B[ed];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/strategy2.sgf b/regression/games/strategy2.sgf
new file mode 100644 (file)
index 0000000..5240543
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.141 ascii]HA[0]KM[5.5]GN[GNU Go 2.7.141 ascii Random Seed 964562894] 
+LB[dg:50]
+C[Value of move: 50]
+;B[dg];W[ee];B[gg];W[ec];B[gh];W[ce];B[gc];W[ge];B[hi];W[he]
+;B[fi];W[bg];B[fb];W[eb];B[ch];W[bh];B[bi];W[cg];B[dh];W[df]
+;B[hd];W[hb];B[ha];W[hc];B[gb];W[gd];B[hf];W[eg];B[ie];W[id]
+;B[if];W[eh];B[ei];W[ii];B[gf];W[ih];B[fh];W[ff];B[ah];W[ag]
+;B[ci];W[ai];B[di];W[fg];B[ah];W[hh];B[gi];W[tt];B[ai];W[tt]
+;B[tt]
+)
diff --git a/regression/games/strategy20.sgf b/regression/games/strategy20.sgf
new file mode 100644 (file)
index 0000000..a032265
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[19]HA[0]KM[0.5]
+DT[2000-09-13]
+SY[Cgoban 1.9.10]TM[-];B[qc];W[dp];B[cc];W[qq];B[cn];W[cl];B[cq];W[cp]
+;B[dq];W[ep];B[bp];W[bo];B[fq];W[bq];B[bm];W[ci];B[en];W[nq];B[fp];
+W[eq];B[er];W[br];B[dr];W[bn];B[cm];W[qe];B[fo];W[qh];B[od];W[dd];
+B[dc];W[ed];B[fc];W[kq];B[ko];W[hq];B[cg];W[df];B[re];W[rd];B[qd];
+W[rf];B[pe];W[se];B[qf];W[pf];B[qg];W[pg];B[rg];W[rh];B[re];W[qn];
+B[sf];W[km];B[mo];W[qk];B[io];W[im];B[kd];W[ic];B[dg];W[ie];B[jc];
+W[dk];B[ib];W[oi];B[mi];W[hl];B[hc];W[ip];B[id];W[gr];B[fr];W[md];
+B[he];W[mf];B[nh];W[nf];B[lh];W[jh];B[kg];W[mg];B[je];W[mh];B[ni];
+W[li];B[hj];W[bl];B[am];W[ds];B[lc];W[cs];B[ho];W[fl];B[ir];W[hr];
+B[kr];W[dm];B[dn];W[al];B[jp];W[jq];B[iq];W[jr];B[hp];W[is];B[ip];
+W[lr];B[cf];W[hn];B[cd];W[ef];B[jj];W[oo];B[lj];W[ki];B[mk];W[hh];
+B[fj];W[gg];B[kj];W[eg];B[if];W[mc];B[mm];W[om];B[ec];W[ok];B[gn];
+W[jn];B[bh];W[ln];B[mn];W[lb];B[lo];W[ob];B[kb];W[mb];B[bj];W[ei];
+B[bi];W[ra];B[rc];W[ce];B[be];W[de];B[fd];W[fe];B[sh];W[ri];B[rb];
+W[qa];B[jl];W[kn];B[in];W[hm];B[jm];W[fm];B[kl];W[gq];B[ej];W[em];
+B[fh];W[fg];B[dj];W[fi];B[cj];W[di];B[gi];W[gh];B[ge];W[gf];B[oh];
+W[ph];B[oj];W[pi];B[pj];W[qj];B[nj];W[pb];B[dh];W[eh];B[aj];W[ii];
+B[ij];W[jg];B[jf];W[lg];B[kf];W[kh];B[ig];W[hi];B[gj];W[le];B[gp];
+W[hs];B[la];W[og];B[ld];W[nl];B[ml];W[pk];B[np];W[op];B[mq];W[mr];
+B[lq];W[sb];B[kp];W[ks];B[sc];W[sa];B[pc];W[nc];B[qb];W[pa];B[no];
+W[ma];B[ka];W[si];B[on];W[sg];B[nk];W[rf];B[sd];W[qe];B[sf];W[qf];
+B[se];W[nm];B[nn];W[pn];B[oe];W[oc];B[cr];W[es];B[fs];W[bs];B[lf];
+W[ne];B[an];W[ap];B[ar];W[nd];B[ke];W[me];B[ng];W[ch];B[ji];W[hf];
+B[hg];W[ih];B[gs];W[js];B[ao];W[tt];B[co];W[aq];B[tt];W[as];B[tt];
+W[tt]
+)
diff --git a/regression/games/strategy21.sgf b/regression/games/strategy21.sgf
new file mode 100644 (file)
index 0000000..7452c2a
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.164 ascii]HA[2]KM[0.5]GN[GNU Go 2.7.164 ascii Random Seed 968919780] 
+AB[pd]AB[dp]
+;W[pp];B[dd];W[qf];B[nd];W[pi];B[nq];W[pn];B[kq];W[cn];B[fp]
+;W[dj];B[pq];W[qq];B[qr];W[pr];B[oq];W[rr];B[qp];W[qs];B[cf]
+;W[po];B[kc];W[cp];B[cq];W[co];B[qe];W[cg];B[ec];W[hc];B[iq]
+;W[ok];B[rq];W[rp];B[pf];W[qo];B[qg];W[qh];B[ph];W[oh];B[pg]
+;W[rh];B[rg];W[bq];B[cr];W[do];B[qi];W[ri];B[oi];W[qj];B[nh]
+;W[dl];B[eo];W[br];B[dg];W[dq];B[dr];W[ep];B[fq];W[fo];B[en]
+;W[fn];B[ei];W[em];B[nn];W[om];B[mk];W[oj];B[og];W[ni];B[mi]
+;W[nj];B[mh];W[ch];B[lk];W[jj];B[jh];W[hh];B[jl];W[hj];B[in]
+;W[ho];B[io];W[hp];B[ji];W[ij];B[mp];W[hq];B[bs];W[ar];B[eq]
+;W[dp];B[ir];W[gr];B[fr];W[es];B[fs];W[gs];B[fg];W[he];B[je]
+;W[hg];B[ib];W[jg];B[kg];W[jf];B[kf];W[ie];B[gd];W[hd];B[fc]
+;W[jd];B[ke];W[kd];B[ld];W[jc];B[jb];W[ic];B[hb];W[ge];B[fe]
+;W[gc];B[gb];W[fd];B[bg];W[bh];B[bf];W[ee];B[ef];W[ff];B[hn]
+;W[gn];B[hl];W[gl];B[gk];W[hk];B[fk];W[ej];B[gi];W[hi];B[fl]
+;W[gm];B[oh];W[fj];B[gj];W[fi];B[gh];W[gg];B[fh];W[de];B[df]
+;W[ce];B[bc];W[be];B[or];W[di];B[dh];W[eh];B[sh];W[si];B[sg]
+;W[kl];B[kk];W[nl];B[km];W[mm];B[ll];W[ln];B[mj];W[kj];B[ih]
+;W[ig];B[cd];W[ad];B[ac];W[bd];B[kn];W[lo];B[ko];W[li];B[lh]
+;W[lp];B[lq];W[kp];B[hm];W[jp];B[ip];W[jq];B[jr];W[no];B[mo]
+;W[oo];B[mn];W[lm];B[jo];W[ki];B[kh];W[ed];B[cc];W[nm];B[jk]
+;W[ik];B[il];W[hr];B[is];W[go];B[os];W[ps];B[on];W[pm];B[nk]
+;W[np];B[mq];W[bp];B[op];W[as];B[ds];W[cs];B[er];W[dn];B[bs]
+;W[ci];B[hs];W[gq];B[ml];W[gp];B[lj];W[cs];B[ii];W[es];B[tt]
+;W[tt];B[tt]
+)
diff --git a/regression/games/strategy22.sgf b/regression/games/strategy22.sgf
new file mode 100644 (file)
index 0000000..9747a53
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.174 load and print]HA[0]KM[5.5]GN[GNU Go 2.7.174 load and print Random Seed 970577438] 
+AW[jb][hc][kc][jd][qd][lf][of][pf][ig][kg][mg][fh][jh][oi][pj][mk][qk][kl][bm][cm][em][im][km][nm][cn][in][jn][ln][on][pn][eo][io][po][fp][ip][qp][rp][gq][hq][jq][kq]
+AB[kb][lb][qb][lc][oc][cd][ed][ld][ke][oe][jf][jg][dh][ih][nj][ok][pl][jm][qm][bn][kn][bo][co][do][jo][ko][oo][qo][ro][jp][lp][dq][iq][lq][oq][fr][gr][hr][ir][jr][kr][qr]
+PL[W]
+IL[kp]
+)
diff --git a/regression/games/strategy23.sgf b/regression/games/strategy23.sgf
new file mode 100644 (file)
index 0000000..d6ba33c
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.170 load and print]HA[9]KM[0.5]GN[GNU Go 2.7.170 load and print Random Seed 969899780] 
+AW[pb][ec][hc][jc][nc][qc][fd][ld][de][he][je][ke][qe][cf][ff][pf][rg][dh][jh][lh][ph][ci][di][fi][ni][cj][fj][qj][dk][ek][dl][pl][hm][an][bn][cn][fn][gn][hn][in][co][do][eo][fo][ho][io][ro][bp][cp][fp][qp][aq][cq][br][bs]
+AB[dd][jd][pd][eh][bi][ei][pi][qi][ri][bj][dj][ej][hj][jj][pj][ck][ok][hl][ol][am][bm][cm][dm][fm][gm][im][pm][dn][en][jn][on][qn][rn][sn][go][jo][oo][po][qo][dp][ep][gp][hp][ip][jp][lp][np][pp][dq][fq][gq][iq][pq][qq][rq][sq][cr][dr][er][hr][nr][ds]
+PL[W]
+IL[pn][eq][hq]
+)
diff --git a/regression/games/strategy24.sgf b/regression/games/strategy24.sgf
new file mode 100644 (file)
index 0000000..e50db16
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.189 load and print]HA[0]KM[0.5]GN[GNU Go 2.7.189 load and print Random Seed 973525984] 
+AW[mp][nq][qq][or][pr]
+AB[dd][pd][pn][dp][np][pp][lq][mq][oq]
+PL[W]
+
+)
diff --git a/regression/games/strategy25.sgf b/regression/games/strategy25.sgf
new file mode 100644 (file)
index 0000000..e4b95a2
--- /dev/null
@@ -0,0 +1,36 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 979340505]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pp];W[dp];B[pd];W[cc];B[pj];W[nq];B[pn];W[pr];B[qq];W[kq]
+;B[mo];W[nc];B[pf];W[pb];B[lc];W[qc];B[oc];W[ob];B[nd];W[md]
+;B[mc];W[nb];B[me];W[fc];B[ld];W[mg];B[ck];W[cm];B[ch];W[mm]
+;B[fq];W[no];B[ce];W[hq];B[qr];W[pq];B[fe];W[hd];B[cq];W[dq]
+;B[cp];W[do];B[bn];W[fg];B[fi];W[ee];B[gf];W[fk];B[ed];W[ef]
+;B[fd];W[ec];B[dl];W[dm];B[df];W[de];B[dd];W[cf];B[cd];W[dg]
+;B[bc];W[gd];B[bg];W[bf];B[eh];W[dc];B[cb];W[bm];B[cn];W[dn]
+;B[nn];W[oo];B[mn];W[dh];B[hr];W[gh];B[iq];W[db];B[bb];W[gi]
+;B[hp];W[ik];B[if];W[jd];B[fj];W[gj];B[dj];W[ke];B[ci];W[be]
+;B[hf];W[bd];B[kf];W[lf];B[kg];W[le];B[jh];W[jb];B[on];W[mp]
+;B[ks];W[jr];B[js];W[cr];B[br];W[dr];B[bs];W[qd];B[qm];W[an]
+;B[di];W[oh];B[qh];W[mj];B[bp];W[aq];B[ao];W[am];B[bo];W[ar]
+;B[kk];W[kj];B[je];W[bq];B[kd];W[ie];B[jf];W[lh];B[or];W[oq]
+;B[ps];W[ij];B[ir];W[nr];B[os];W[ns];B[qs];W[lq];B[po];W[jm]
+;B[km];W[kn];B[fo];W[kl];B[lm];W[ll];B[ln];W[ko];B[ml];W[jn]
+;B[lk];W[jl];B[ki];W[lj];B[mk];W[jk];B[nk];W[mf];B[nf];W[fm]
+;B[nj];W[rf];B[qe];W[re];B[qf];W[rg];B[rh];W[qg];B[mb];W[pg]
+;B[pc];W[gn];B[of];W[oe];B[jc];W[id];B[kb];W[ic];B[kc];W[ib]
+;B[la];W[bk];B[ek];W[bj];B[el];W[fn];B[fl];W[gk];B[gl];W[hl]
+;B[gm];W[hm];B[ni];W[li];B[op];W[np];B[ms];W[sh];B[si];W[sg]
+;B[ri];W[fr];B[kr];W[jq];B[ep];W[ls];B[lr];W[mr];B[gp];W[eo]
+;B[cl];W[is];B[hs];W[jo];B[bl];W[al];B[af];W[nh];B[ae];W[ad]
+;B[ag];W[eg];B[fh];W[gg];B[na];W[mi];B[oa];W[qb];B[ja];W[cg]
+;B[bh];W[io];B[bi];W[lo];B[em];W[oi];B[pi];W[ia];B[oj];W[ai]
+;B[en];W[hn];B[pa];W[qa];B[ma];W[ka];B[ph];W[ja];B[og];W[ne]
+;B[md];W[ng];B[cj];W[ak];B[ah];W[aj];B[gq];W[ip];B[tt];W[eq]
+;B[tt];W[tt])
diff --git a/regression/games/strategy26.sgf b/regression/games/strategy26.sgf
new file mode 100644 (file)
index 0000000..d883559
--- /dev/null
@@ -0,0 +1,39 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 974073710]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pp];W[dp];B[dd];W[qc];B[iq];W[qn];B[pn];W[pm];B[on];W[qo]
+;B[qp];W[qj];B[np];W[fc];B[cf];W[db];B[cc];W[ic];B[cn];W[fq]
+;B[cp];W[cq];B[bq];W[br];B[cr];W[dq];B[bs];W[ar];B[aq];W[fn]
+;B[lq];W[ch];B[ck];W[eh];B[cb];W[dr];B[cs];W[bp];B[pd];W[ap]
+;B[pc];W[qd];B[qe];W[pb];B[pe];W[qg];B[ob];W[pa];B[rb];W[qb]
+;B[rd];W[oc];B[nb];W[rc];B[nc];W[ra];B[kc];W[re];B[rf];W[sd]
+;B[eb];W[qf];B[hn];W[bj];B[fk];W[mn];B[gh];W[fb];B[ea];W[ie]
+;B[gf];W[bf];B[be];W[fe];B[bg];W[bh];B[kn];W[cg];B[af];W[ef]
+;B[om];W[pl];B[ml];W[mj];B[ll];W[jl];B[im];W[bm];B[fa];W[co]
+;B[he];W[bn];B[fj];W[bk];B[dn];W[gm];B[gr];W[em];B[dl];W[dm]
+;B[cm];W[fr];B[gg];W[kk];B[mf];W[lj];B[pf];W[rg];B[ro];W[hd]
+;B[hj];W[hl];B[il];W[ik];B[hk];W[oh];B[eo];W[fo];B[rn];W[ep]
+;B[do];W[qm];B[rm];W[rl];B[jh];W[gq];B[jf];W[hr];B[jd];W[je]
+;B[ke];W[id];B[if];W[jm];B[jn];W[cj];B[dj];W[di];B[ir];W[ej]
+;B[dk];W[ol];B[hs];W[gs];B[is];W[nm];B[nl];W[nn];B[ge];W[gd]
+;B[hm];W[gl];B[mh];W[oj];B[nh];W[oo];B[po];W[op];B[ln];W[oq]
+;B[no];W[nq];B[mo];W[qr];B[rq];W[ni];B[mr];W[mq];B[rr];W[lp]
+;B[kq];W[nr];B[lr];W[qq];B[jp];W[og];B[bl];W[hp];B[al];W[jb]
+;B[kb];W[nk];B[go];W[gp];B[ho];W[ka];B[la];W[ja];B[jc];W[ib]
+;B[gb];W[ip];B[ek];W[ei];B[ns];W[os];B[ms];W[mp];B[lo];W[pq]
+;B[rp];W[kp];B[ij];W[jk];B[jo];W[qs];B[pr];W[df];B[or];W[pg]
+;B[de];W[of];B[od];W[ne];B[me];W[ji];B[ki];W[jj];B[ii];W[ec]
+;B[ga];W[dc];B[da];W[li];B[kh];W[fl];B[nd];W[hq];B[io];W[fi]
+;B[gk];W[gi];B[hi];W[ak];B[ng];W[sm];B[ps];W[os];B[pr];W[am]
+;B[cl];W[km];B[sn];W[sl];B[lm];W[ah];B[ag];W[oa];B[rs];W[lh]
+;B[ko];W[lg];B[kg];W[lf];B[kf];W[le];B[nf];W[oe];B[lb];W[ld]
+;B[md];W[lc];B[kd];W[mc];B[na];W[mb];B[ma];W[el];B[gc];W[fd]
+;B[hb];W[ia];B[kj];W[lk];B[fh];W[ha];B[ff];W[ee];B[eg];W[dg]
+;B[fg];W[mi];B[ed];W[ad];B[ce];W[gn];B[ae];W[kl];B[mk];W[gj]
+;B[en];W[mg];B[ca];W[hc];B[tt];W[tt])
diff --git a/regression/games/strategy27.sgf b/regression/games/strategy27.sgf
new file mode 100644 (file)
index 0000000..4406469
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.192 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.192 ascii Random Seed 974443642] 
+;B[qd];W[dd];B[qp];W[dp];B[jc];W[dj];B[qj];W[lq];B[jq];W[oq]
+;B[pq];W[gq];B[oc];W[oe];B[fd];W[df];B[dn];W[fc];B[pn];W[ec]
+;B[qf];W[co];B[cn];W[ep];B[jo];W[cl];B[lp];W[nq];B[hc];W[mp]
+;B[mo];W[kq];B[ln];W[nf];B[bm];W[lf];B[bk];W[gd];B[bl];W[jr]
+;B[ci];W[cg];B[bo];W[bp];B[gb];W[fb];B[ie];W[mi];B[ld];W[nd]
+;B[mc];W[el];B[nc];W[fn];B[bh];W[bg];B[hp];W[gl];B[hr];W[hq]
+;B[iq];W[gr];B[ir];W[di];B[dh];W[ch];B[bi];W[eh];B[jg];W[ke]
+;B[kh];W[kr];B[hh];W[fe];B[ph];W[mg];B[hj];W[ao];B[bn];W[cj]
+;B[bj];W[ah];B[ck];W[dk];B[nk];W[kp];B[lo];W[ip];B[jp];W[io]
+;B[in];W[ho];B[go];W[gp];B[hn];W[hp];B[gn];W[fo];B[il];W[me]
+;B[do];W[cp];B[en];W[no];B[fm];W[em];B[gm];W[gk];B[eo];W[fp]
+;B[nn];W[oo];B[on];W[pp];B[qr];W[pr];B[qq];W[or];B[fl];W[fk]
+;B[hl];W[gc];B[hb];W[hf];B[he];W[ge];B[if];W[hg];B[gg];W[gf]
+;B[fg];W[ig];B[jf];W[ih];B[fh];W[ji];B[dm];W[dl];B[ei];W[dg]
+;B[ej];W[ki];B[lh];W[fi];B[li];W[gi];B[mj];W[ni];B[hi];W[og]
+;B[gj];W[oj];B[fj];W[ek];B[lj];W[jk];B[hk];W[pk];B[rl];W[po]
+;B[qo];W[pg];B[nh];W[qg];B[oh];W[mh];B[pj];W[ok];B[le];W[kf]
+;B[pf];W[qh];B[pi];W[rf];B[re];W[rh];B[sf];W[rg];B[rj];W[ga]
+;B[ha];W[fa];B[an];W[ai];B[kk];W[jj];B[jl];W[ap];B[gs];W[fr]
+;B[fs];W[er];B[es];W[dr];B[ds];W[cs];B[hs];W[cr];B[eg];W[dh]
+;B[ef];W[ko];B[kn];W[qs];B[ee];W[ed];B[de];W[aj];B[ce];W[ag]
+;B[bc];W[cb];B[cc];W[rr];B[db];W[rq];B[bf];W[ak];B[af];W[qn]
+;B[al];W[rn];B[qm];W[rm];B[ql];W[js];B[sm];W[ro];B[sn];W[is]
+;B[jn];W[so];B[sl];W[tt];B[cf];W[tt];B[cm];W[tt];B[dc];W[tt]
+;B[ng];W[tt];B[pe];W[tt];B[of];W[tt];B[od];W[ne];B[md];W[tt]
+;B[tt];W[tt]
+)
diff --git a/regression/games/strategy28.sgf b/regression/games/strategy28.sgf
new file mode 100644 (file)
index 0000000..f94ac12
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-01-09]
+SY[Cgoban 1.9.2]TM[5:00:00(5x1:00)];
+AW[ab][db][ac][bc][cc][dc][ec][hc][ad][bd][dd][ed][fd][gd][hd][ce][cf][cg][dg][eg][fg][gg][hg][ig]
+AB[aa][ba][ca][da][fa][bb][cb][eb][fb][hb][ib][fc][gc][ic][id][ee][fe][ge][he][ie]
+)
diff --git a/regression/games/strategy29.sgf b/regression/games/strategy29.sgf
new file mode 100644 (file)
index 0000000..c1fbb81
--- /dev/null
@@ -0,0 +1,36 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.7.212 gmp Random Seed 0]
+PB[GNU Go 2.7.212 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pd];W[pp];B[cc];W[cp];B[eq];W[do];B[hq];W[fp];B[fq];W[qf]
+;B[pf];W[pg];B[of];W[qe];B[qd];W[qj];B[nq];W[qn];B[pr];W[qq]
+;B[kq];W[dd];B[nd];W[cd];B[dc];W[ec];B[eb];W[fc];B[fb];W[gc]
+;B[bd];W[be];B[bc];W[cf];B[gp];W[fo];B[ch];W[gb];B[ck];W[fm]
+;B[og];W[ph];B[oj];W[hn];B[no];W[qr];B[pq];W[pl];B[kd];W[jc]
+;B[hl];W[jn];B[kc];W[il];B[jb];W[jd];B[je];W[ib];B[kb];W[ef]
+;B[eh];W[fg];B[ik];W[ln];B[fk];W[bg];B[jl];W[kl];B[im];W[in]
+;B[kk];W[ip];B[iq];W[nm];B[km];W[kn];B[ll];W[nn];B[cr];W[mo]
+;B[oo];W[bq];B[mp];W[br];B[cq];W[cm];B[op];W[bl];B[qp];W[rp]
+;B[po];W[qo];B[ke];W[ps];B[os];W[qs];B[nr];W[fh];B[bh];W[ig]
+;B[bk];W[ie];B[bn];W[bm];B[jh];W[lp];B[jg];W[lq];B[lr];W[rd]
+;B[rc];W[re];B[if];W[sc];B[rb];W[he];B[hg];W[cs];B[dr];W[fa]
+;B[db];W[hf];B[jf];W[gg];B[ih];W[oh];B[nh];W[ad];B[ea];W[ga]
+;B[lj];W[bb];B[ab];W[ca];B[ia];W[ae];B[ac];W[aa];B[ba];W[ni]
+;B[cb];W[ic];B[oi];W[mh];B[nj];W[ng];B[lg];W[nf];B[lh];W[mq]
+;B[mr];W[ha];B[ja];W[oe];B[pe];W[ne];B[md];W[od];B[oc];W[kp]
+;B[go];W[an];B[fn];W[en];B[gn];W[jq];B[kr];W[jr];B[gm];W[fl]
+;B[gl];W[gs];B[hi];W[el];B[ek];W[ks];B[ei];W[ah];B[ai];W[ag]
+;B[dl];W[em];B[fi];W[ir];B[js];W[is];B[me];W[es];B[ds];W[bs]
+;B[ep];W[eo];B[hr];W[er];B[dq];W[hs];B[fr];W[fs];B[ml];W[sb]
+;B[qc];W[pk];B[nl];W[pi];B[om];W[mm];B[lm];W[ol];B[pm];W[qm]
+;B[np];W[ho];B[jo];W[jp];B[ko];W[ok];B[nk];W[mi];B[mj];W[li]
+;B[ki];W[pn];B[on];W[dm];B[mn];W[cl];B[lo];W[dk];B[hm];W[dj]
+;B[bj];W[ak];B[mg];W[nh];B[di];W[cj];B[ci];W[dg];B[mf];W[gh]
+;B[gi];W[hh];B[ej];W[dl];B[ra];W[cg];B[pp];W[pj];B[ig];W[eg]
+;B[dh];W[dp];B[hp];W[sd];B[sa];W[al];B[bi];W[aj];B[tt];W[tt]
+)
diff --git a/regression/games/strategy3.sgf b/regression/games/strategy3.sgf
new file mode 100644 (file)
index 0000000..324d658
--- /dev/null
@@ -0,0 +1,21 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.140 gmp]HA[0]KM[5.5]GN[GNU Go 2.7.140 gmp Random Seed 134834892] 
+;B[pd]
+;W[pp]
+;B[eq]
+;W[qf]
+;B[de]
+;W[nc]
+;B[nd]
+;W[md]
+;B[dc]
+;W[qi]
+;B[cp]
+;W[dg]
+;B[ne]
+;W[ld]
+;B[nq]
+;W[oc]
+;B[pe]
+;W[lq]
+)
diff --git a/regression/games/strategy30.sgf b/regression/games/strategy30.sgf
new file mode 100644 (file)
index 0000000..ee0e71c
--- /dev/null
@@ -0,0 +1,38 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 980125743]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pp];W[ed];B[do];W[qc];B[dq];W[cd];B[jq];W[qn];B[np];W[qp]
+;B[qq];W[rq];B[pq];W[ro];B[pd];W[pc];B[od];W[nc];B[me];W[ld]
+;B[cj];W[cm];B[cg];W[em];B[gq];W[jo];B[de];W[kq];B[kr];W[dd]
+;B[mq];W[pi];B[qk];W[ri];B[ok];W[rl];B[oj];W[id];B[kp];W[bo]
+;B[bp];W[qf];B[qd];W[ce];B[of];W[mg];B[re];W[rf];B[pm];W[og]
+;B[rc];W[mc];B[rk];W[ql];B[lf];W[rb];B[kf];W[sc];B[rd];W[sb]
+;B[pl];W[df];B[bf];W[ee];B[ac];W[nf];B[ne];W[pf];B[oe];W[km]
+;B[if];W[hm];B[jd];W[ic];B[jc];W[je];B[jf];W[ke];B[jb];W[ib]
+;B[rr];W[ja];B[sq];W[rp];B[nm];W[po];B[rm];W[qm];B[sl];W[sr]
+;B[sp];W[pn];B[qr];W[so];B[sm];W[li];B[ih];W[ij];B[gh];W[eo]
+;B[hj];W[dn];B[dp];W[hi];B[hh];W[gi];B[gf];W[hk];B[eg];W[dg]
+;B[kh];W[eh];B[jj];W[fg];B[ao];W[fi];B[bn];W[ch];B[bh];W[be]
+;B[ae];W[jk];B[kj];W[mh];B[dl];W[bm];B[ej];W[co];B[am];W[bl]
+;B[an];W[bj];B[ci];W[dh];B[bi];W[cn];B[bk];W[al];B[ak];W[ap]
+;B[bq];W[ck];B[aj];W[cl];B[dk];W[gd];B[ge];W[nn];B[mn];W[no]
+;B[mk];W[mm];B[kk];W[ln];B[mo];W[jl];B[ml];W[lm];B[ii];W[ik]
+;B[oc];W[ob];B[mf];W[mb];B[ng];W[nh];B[nf];W[oh];B[rj];W[om]
+;B[qj];W[nl];B[mj];W[qi];B[si];W[sh];B[sj];W[lo];B[sf];W[rg]
+;B[qh];W[mp];B[op];W[ho];B[bb];W[hq];B[hr];W[iq];B[jr];W[gp]
+;B[fq];W[ir];B[is];W[cb];B[ip];W[hp];B[jp];W[fl];B[ol];W[pj]
+;B[ki];W[pk];B[nk];W[cc];B[io];W[jn];B[in];W[im];B[hn];W[fo]
+;B[fp];W[go];B[fk];W[gj];B[gk];W[gn];B[gl];W[gm];B[el];W[fm]
+;B[cf];W[he];B[gg];W[oo];B[ni];W[ba];B[ab];W[ko];B[ff];W[ef]
+;B[fh];W[hl];B[fj];W[hf];B[hg];W[sd];B[se];W[ie];B[ei];W[hj]
+;B[fe];W[fd];B[di];W[lg];B[ep];W[kg];B[jg];W[lp];B[gr];W[lq]
+;B[mr];W[lr];B[ls];W[aq];B[ar];W[ao];B[br];W[lj];B[kl];W[dm]
+;B[cp];W[ss];B[rs];W[sq];B[or];W[bd];B[ad];W[eg];B[aa];W[ca]
+;B[sg];W[rh];B[mi];W[lh];B[ll];W[nm];B[oi];W[le];B[lk];W[bc]
+;B[af];W[nd];B[md];W[pe];B[qe];W[pg];B[tt];W[tt])
diff --git a/regression/games/strategy31.sgf b/regression/games/strategy31.sgf
new file mode 100644 (file)
index 0000000..8ed6563
--- /dev/null
@@ -0,0 +1,27 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.215 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.215 ascii Random Seed 980757590] 
+;B[pp];W[dd];B[pd];W[dq];B[cn];W[nq];B[cp];W[cq];B[bq];W[qf]
+;B[or];W[qi];B[qn];W[nc];B[gq];W[qc];B[ce];W[oe];B[ec];W[nf]
+;B[cc];W[ic];B[ee];W[kq];B[iq];W[ql];B[ck];W[br];B[ap];W[oq]
+;B[pq];W[nr];B[ps];W[dc];B[db];W[ed];B[fd];W[eb];B[fc];W[cb]
+;B[cd];W[lc];B[de];W[bb];B[bc];W[qe];B[er];W[fp];B[eq];W[eo]
+;B[dp];W[gc];B[fb];W[rm];B[rn];W[jr];B[ir];W[em];B[en];W[fn]
+;B[dn];W[fm];B[go];W[gp];B[hp];W[ek];B[dl];W[hm];B[hn];W[fo]
+;B[el];W[fl];B[fk];W[ej];B[gj];W[il];B[jn];W[jk];B[im];W[hk]
+;B[gm];W[hl];B[gl];W[gk];B[gn];W[fj];B[di];W[gi];B[hj];W[hi]
+;B[ij];W[gf];B[ji];W[fh];B[jl];W[ik];B[lk];W[kh];B[ki];W[kl]
+;B[jm];W[li];B[kj];W[ml];B[ll];W[km];B[lm];W[no];B[ln];W[kk]
+;B[lj];W[kn];B[ko];W[lo];B[jj];W[fk];B[io];W[mi];B[mo];W[lp]
+;B[nn];W[jh];B[oo];W[lr];B[np];W[gd];B[ge];W[he];B[ff];W[gg]
+;B[fe];W[eg];B[ei];W[fi];B[dg];W[sn];B[so];W[sm];B[rp];W[ol]
+;B[qm];W[rk];B[pl];W[pm];B[pk];W[ok];B[om];W[oj];B[qk];W[rl]
+;B[nl];W[nk];B[mj];W[mm];B[mn];W[nm];B[pn];W[rj];B[mk];W[nl]
+;B[oi];W[pj];B[nh];W[ni];B[ph];W[mh];B[nj];W[pi];B[pm];W[gb]
+;B[oh];W[ng];B[qh];W[rh];B[rg];W[qg];B[qj];W[ri];B[hf];W[ie]
+;B[hg];W[fg];B[ih];W[ii];B[jg];W[hh];B[ig];W[kg];B[mg];W[mf]
+;B[lg];W[lf];B[lh];W[kf];B[og];W[is];B[hs];W[js];B[gr];W[pc]
+;B[jq];W[kp];B[jo];W[dm];B[cm];W[mp];B[ms];W[ns];B[ls];W[mr]
+;B[jp];W[os];B[pr];W[fa];B[ea];W[ga];B[ef];W[eh];B[dh];W[dj]
+;B[cj];W[dk];B[cl];W[pf];B[do];W[op];B[no];W[fq];B[fr];W[if]
+;B[ep];W[jf];B[cr];W[of];B[mi];W[pg];B[tt];W[tt]
+)
diff --git a/regression/games/strategy32.sgf b/regression/games/strategy32.sgf
new file mode 100644 (file)
index 0000000..2b44b4e
--- /dev/null
@@ -0,0 +1,30 @@
+(;GM[1]FF[3]
+RU[Japanese]BR[]WR[]CP[]SZ[9]HA[0]KM[5.5]
+PW[]
+PB[]
+GN[Many Faces of Go 9.0  (W) GNU Go 2.7.221 (B)]
+DT[2001-02-20]
+SY[Cgoban 1.9.10]TM[15:00:00(5x1:00)];B[ee]BL[53999];W[gd]WL[53973];
+B[dc]BL[53996];W[gg]WL[53964];B[de]BL[53981];W[fc]WL[53955];B[eg]
+BL[53980];W[dg]WL[53944];B[dh]BL[53969];W[fh]WL[53935];B[eb]BL[53964];
+W[fb]WL[53917];B[fa]BL[53958];W[ga]WL[53906];B[ea]BL[53949];W[cg]
+WL[53898];B[ch]BL[53932];W[cf]WL[53867];B[bg]BL[53899];W[bf]WL[53851];
+B[bd]BL[53857];W[eh]WL[53832];B[bh]BL[53835];W[ef]WL[53817];B[ff]
+BL[53834];W[fg]WL[53793];B[ge]BL[53824];W[he]WL[53751];B[gb]BL[53823];
+W[be]WL[53720];B[hc]BL[53807];W[hd]WL[53644];B[ag]BL[53798];W[cd]
+WL[50873];B[ec]BL[53750];W[bc]WL[50853];B[cb]BL[53743];W[bb]WL[50823];
+B[di]BL[53738];W[bi]WL[50791];B[ai]BL[53732];W[ah]WL[50743];B[ci]
+BL[53726];W[gf]WL[50696];B[ha]BL[53706];W[ic]WL[50665];B[ib]BL[53701];
+W[id]WL[50630];B[fe]BL[53700];W[gc]WL[50597];B[hb]BL[53695];W[ei]
+WL[50568];B[ai]BL[53695];W[ba]WL[50540];B[ca]BL[53694];W[fd]WL[50524];
+B[af]BL[53694];W[ae]WL[50513];B[df]BL[53694];W[eg]WL[50501];B[cc]
+BL[53694];W[ce]WL[50488];B[dd]BL[53694];W[hf]WL[50474];B[ed]BL[53694];
+W[tt]WL[50466];B[tt]BL[53694]
+TW[aa][ab][ac][ad][bd][ie][if][hg][ig][gh][hh][ih][fi][gi][hi][ii]
+TB[da][ga][ia][db][ah][bi]
+C[The game is over.  Final score:
+   White = 16 territory + 3 captures + 5.5 komi = 24.5
+   Black = 6 territory + 3 captures = 9
+White wins by 15.5.
+]
+)
diff --git a/regression/games/strategy33.sgf b/regression/games/strategy33.sgf
new file mode 100644 (file)
index 0000000..8f02197
--- /dev/null
@@ -0,0 +1,34 @@
+(;FF[4]GM[1]SZ[19]AP[SGFC:1.13b]
+
+GN[GNU Go 2.6 gmp Random Seed 983816977]
+PB[GNU Go 2.6 gmp]
+HA[0]
+PW[GNU Go]
+KM[5.5]
+RU[Japanese]
+
+;B[pd];W[de];B[pp];W[dq];B[co];W[dc];B[ep];W[eq];B[fp];W[gq]
+;B[cj];W[nc];B[lc];W[qc];B[pf];W[pc];B[jp];W[fq];B[pj];W[ne]
+;B[ic];W[nq];B[np];W[mp];B[no];W[oq];B[pq];W[mo];B[pn];W[bq]
+;B[cg];W[bf];B[ej];W[dn];B[em];W[cn];B[cf];W[bo];B[be];W[od]
+;B[fc];W[bc];B[qj];W[gj];B[nm];W[kq];B[qd];W[rd];B[en];W[qf]
+;B[fk];W[pe];B[fi];W[hh];B[eb];W[nj];B[cb];W[bb];B[cc];W[do]
+;B[ok];W[hl];B[cd];W[dd];B[mb];W[db];B[pa];W[da];B[hf];W[pg]
+;B[bd];W[jq];B[gg];W[ip];B[ko];W[hi];B[of];W[ln];B[jn];W[nf]
+;B[og];W[ph];B[nh];W[oi];B[ng];W[ll];B[lg];W[fd];B[he];W[gc]
+;B[ca];W[gb];B[hn];W[nn];B[hm];W[nb];B[na];W[mm];B[on];W[nl]
+;B[hb];W[om];B[pm];W[jb];B[ib];W[kb];B[kd];W[kh];B[ee];W[ed]
+;B[kg];W[nk];B[le];W[cl];B[bk];W[bl];B[or];W[bi];B[op];W[bg]
+;B[bj];W[ce];B[ae];W[ba];B[bh];W[ch];B[ac];W[dg];B[eh];W[mq]
+;B[io];W[ff];B[fh];W[hp];B[rh];W[go];B[qg];W[eo];B[rf];W[qe]
+;B[mf];W[fo];B[md];W[jk];B[ci];W[ah];B[ab];W[li];B[il];W[ik]
+;B[jl];W[gl];B[fn];W[gn];B[gm];W[kl];B[km];W[ig];B[nr];W[jf]
+;B[mr];W[jg];B[id];W[lr];B[ob];W[oe];B[rb];W[qb];B[qa];W[fl]
+;B[el];W[fm];B[lo];W[kf];B[eg];W[fe];B[gk];W[hk];B[ef];W[df]
+;B[ol];W[dk];B[ek];W[di];B[dj];W[dh];B[kn];W[mc];B[im];W[lb]
+;B[gi];W[ra];B[re];W[sb];B[kp];W[dm];B[qh];W[pi];B[qi];W[me]
+;B[sd];W[mh];B[sa];W[lf];B[ra];W[ma];B[rc];W[qd];B[oa];W[ms]
+;B[ns];W[ls];B[pr];W[ja];B[lm];W[mb];B[af];W[bh];B[lp];W[lq]
+;B[oc];W[nd];B[ho];W[ke];B[oj];W[ni];B[sc];W[kc];B[pb];W[jd]
+;B[aa];W[ie];B[if];W[jc];B[ag];W[hd];B[nm];W[je];B[mn];W[ml]
+;B[tt];W[tt])
diff --git a/regression/games/strategy34.sgf b/regression/games/strategy34.sgf
new file mode 100644 (file)
index 0000000..2e40cf5
--- /dev/null
@@ -0,0 +1,15 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-04-06]
+SY[Cgoban 1.9.2];B[ee];W[gg];
+B[ge];W[eg];B[cg];W[he];B[hd];W[hf];B[cd];W[ch];B[dh];
+W[dg];B[bh];W[cf];B[bg];W[de];B[dd];W[be];B[bd];W[eh];
+B[ci];W[bf];B[ei];W[fh];B[ef];W[df];B[gd];W[id];B[ic];
+W[ie];B[hb];W[ad];B[hh];W[gh];B[ac];W[ae];B[bb];W[ff];
+B[fe];W[gf];B[hi];W[fi];B[di];W[ce];B[ag];W[af];B[hg];
+W[ab];B[aa];W[bc];B[ab];W[cc];B[cb];W[dc];B[db];W[ed];
+B[gc];W[eb];B[fd];W[fc];B[gb];W[fb];B[fa];W[ea];B[ga]
+)
diff --git a/regression/games/strategy35.sgf b/regression/games/strategy35.sgf
new file mode 100644 (file)
index 0000000..9cfa6ba
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.228gf2 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.228gf2 ascii Ran
+om Seed 986943687] 
+;B[pp];W[cd];B[pd];W[dq];B[ed];W[gc];B[fe];W[nc];B[nd];W[md]
+;B[ne];W[oc];B[pc];W[jc];B[qj];W[np];B[oq];W[co];B[kp];W[iq]
+;B[jq];W[cj];B[ce];W[dc];B[dd];W[ec];B[cc];W[ej];B[dh];W[eo]
+;B[qn];W[cm];B[ip];W[cb];B[bd];W[hq];B[hp];W[lq];B[mr];W[mq]
+;B[nq];W[mo];B[ln];W[jr];B[kq];W[kr];B[lr];W[nn];B[nl];W[gj]
+;B[hm];W[oo];B[om];W[mm];B[ll];W[ml];B[lm];W[mk];B[nm];W[mn]
+;B[lp];W[mi];B[mp];W[bc];B[cd];W[bb];B[fh];W[mh];B[on];W[ph]
+;B[pf];W[qg];B[oh];W[oi];B[og];W[ri];B[pi];W[re];B[qf];W[rg]
+;B[rf];W[sf];B[rd];W[pj];B[qi];W[oj];B[qh];W[sd];B[sc];W[qe]
+;B[se];W[rj];B[sg];W[qk];B[pg];W[rh];B[ph];W[gk];B[pk];W[pl]
+;B[ok];W[nk];B[ol];W[rl];B[rm];W[pn];B[po];W[pm];B[fm];W[qm]
+;B[ro];W[go];B[gp];W[gq];B[fp];W[fq];B[ep];W[fo];B[dp];W[cp]
+;B[eq];W[dr];B[er];W[bh];B[hs];W[sm];B[rn];W[pb];B[qd];W[qb]
+;B[rb];W[me];B[mg];W[lg];B[he];W[ic];B[hh];W[jf];B[ik];W[jd]
+;B[jh];W[lk];B[kk];W[ij];B[jj];W[ii];B[ih];W[ji];B[ki];W[hi]
+;B[gi];W[hj];B[fj];W[fk];B[fi];W[el];B[em];W[do];B[ei];W[kh]
+;B[kg];W[lh];B[jg];W[di];B[ci];W[dj];B[ch];W[bi];B[bg];W[kf]
+;B[fc];W[fb];B[fd];W[lj];B[kj];W[ng];B[nf];W[nh];B[mf];W[lf]
+;B[hn];W[od];B[oe];W[ra];B[gb];W[hb];B[eb];W[ga];B[db];W[hl]
+;B[il];W[op];B[qq];W[gh];B[gg];W[ho];B[io];W[qc];B[rc];W[qa]
+;B[dl];W[dm];B[gl];W[fl];B[hk];W[ek];B[cl];W[bl];B[bk];W[bj]
+;B[bm];W[al];B[ak];W[ck];B[am];W[bl];B[al];W[bn];B[ah];W[aj]
+;B[cq];W[cr];B[bq];W[br];B[fr];W[gn];B[gm];W[lo];B[ko];W[en]
+;B[je];W[ie];B[if];W[id];B[hf];W[ds];B[ar];W[ea];B[da];W[fa]
+;B[ao];W[an];B[bo];W[bl];B[bp];W[bs];B[es];W[aq];B[ap];W[kn]
+;B[kl];W[sa];B[sh];W[si];B[sf];W[hd];B[gd];W[sn];B[so];W[sl]
+;B[sb];W[ob];B[le];W[mc];B[cg];W[hr];B[gr];W[ai];B[ag];W[is]
+;B[ir];W[hr];B[hq];W[li];B[fn];W[im];B[in];W[km];B[jm];W[jk]
+;B[jn];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/strategy36.sgf b/regression/games/strategy36.sgf
new file mode 100644 (file)
index 0000000..5ec78e6
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.236 (level 8) load and print]HA[2]KM[0.5]GN[GNU Go 2.7.236 load and print Random Seed 990582331] 
+AW[ha][ka][la][na][fb][gb][lb][nb][ec][hc][kc][lc][mc][nc][oc][qc][ed][fd][hd][ld][qd][rd][ee][ie][le][me][pe][re][cf][df][if][nf][pf][rf][cg][eg][hg][ig][lg][mg][ng][pg][ch][jh][kh][nh][oh][ph][qh][rh][ai][bi][ci][ki][mi][oi][bj][fj][jj][kj][lj][oj][qj][bk][ck][jk][lk][qk][dl][el][fl][gl][hl][il][ll][ml][ol][pl][ql][rl][im][lm][pm][rm][mn][nn][pn][qn][jo][no][qo][kp][lp][mp][np][op][pp][iq][jq][mq][nq][pq][hr][ir][nr][pr][qr][hs][ms][os][ps]
+AB[ja][ma][db][eb][hb][ib][jb][kb][ob][pb][qb][rb][cc][ic][jc][pc][rc][dd][jd][kd][md][nd][od][pd][ce][de][ke][ne][oe][qe][bf][jf][kf][lf][mf][of][qf][bg][jg][kg][qg][rg][sg][ah][bh][dh][lh][mh][sh][gi][pi][qi][ri][cj][dj][nj][pj][rj][dk][ik][kk][mk][nk][ok][rk][bl][cl][jl][kl][nl][am][dm][em][jm][km][mm][nm][om][bn][cn][fn][hn][in][kn][ln][on][rn][io][lo][mo][oo][po][ro][dp][ip][jp][qp][sp][eq][gq][hq][kq][lq][qq][rq][jr][lr][mr][rr][is][js][ks][qs]
+PL[B]
+IL[mb][li][qm][ns]
+)
diff --git a/regression/games/strategy37.sgf b/regression/games/strategy37.sgf
new file mode 100644 (file)
index 0000000..11f269e
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-06-07]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ea][db][fb][cc][ec][cd][ed][de][ee][fe][ge][ef][gf][eg][fg]
+AB[ca][da][fa][ga][bb][cb][gb][hb][bc][fc][hc][bd][fd][gd][hd][be][ce][he][cf][df][hf][dg][gg][hg][dh][eh][fh][gh]
+PL[W]
+)
diff --git a/regression/games/strategy38.sgf b/regression/games/strategy38.sgf
new file mode 100644 (file)
index 0000000..26cec5e
--- /dev/null
@@ -0,0 +1,29 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[bommeltk]WR[14k*]
+PB[GnuGo (GNU Go 2.7.242)]BR[15k*]
+PC[NNGS]DT[2001-06-24]AP[gnugoclient:1.9]
+RE[B+5.5]
+;B[pd];W[dp];B[pq];W[dd];B[jq];W[nc];B[pf];W[jd];B[po];W[gq];B[dm]
+;W[go];B[df];W[fd];B[dj];W[pb];B[cd];W[cc];B[ce];W[bc];B[qc];W[pc]
+;B[mq];W[cn];B[qj];W[ne];B[cq];W[dq];B[cr];W[cp];B[bp];W[bo];B[aq]
+;W[dr];B[br]C[L:9];W[ao];B[ap]C[L:10];W[bl];B[qm];W[nh];B[ph];W[oj]
+;B[el];W[jj];B[ff];W[hf];B[ge];W[hd];B[gd];W[gc];B[ed];W[ec];B[ol]
+;W[mj];B[hr];W[gr];B[hq];W[hp];B[ml];W[kl];B[lk];W[kj];B[ln];W[jn]
+;B[qb];W[od];B[lj]C[L:7];W[li];B[oe]C[L:8];W[nf];B[pa]C[L:9];W[oa]
+;B[qd];W[of];B[qa]C[L:10];W[ob];B[fh];W[hh];B[bd];W[ee];B[bj];W[ef]
+;B[eg];W[fe];B[gf];W[gg];B[gh];W[hi];B[gl]C[L:7];W[hg];B[fg]C[L:8]
+;W[fj];B[cg]C[L:7];W[fi];B[ei]C[L:8];W[ek];B[dk]C[L:9];W[ej];B[il]
+C[L:10];W[jl];B[ac];W[ab];B[ad];W[bb];B[ko];W[jo];B[hn];W[jp];B[kp]
+;W[kn];B[lm];W[mk];B[ll];W[ok];B[pk];W[pj];B[qi];W[pl];B[pm];W[qk]
+;B[rk];W[nl];B[nm];W[om];B[on];W[ol];B[ql];W[pk];B[im];W[iq];B[ir]
+;W[ip];B[nn];W[jr];B[kq];W[is];B[kr];W[hs];B[fk];W[gk];B[fl];W[hk]
+;B[gi];W[gj];B[ik];W[ij];B[hl];W[hj];B[eo];W[ep];B[fn];W[fo];B[do]
+;W[co];B[pe];W[oh];B[bk];W[gn];B[ak]C[L:9];W[en];B[dn]C[L:10];W[fm]
+;B[bm];W[am];B[al];W[an];B[cm];W[pg];B[qg];W[og];B[pi];W[oi];B[em]
+;W[fn];B[gm];W[in];B[ho];W[io];B[hm];W[he];B[ds];W[es];B[cs];W[er]
+;B[ks];W[js];B[de];W[km];B[kk];W[jk];B[jm];W[bn];B[];W[cl];B[dl]
+;W[di];B[ci];W[eh];B[dg];W[dh];B[ch];W[ei];B[];W[rh];B[qh];W[rj]
+;B[ri];W[rl];B[sj];W[rg];B[rf];W[rm];B[rn];W[sn];B[qn];W[so];B[sl]
+C[L:8];W[rq];B[qr]C[L:9];W[rr];B[sm]C[L:10];W[ro];B[qp];W[qs];B[rs]
+;W[ss];B[pr];W[rp];B[sq];W[];B[]C[final_score: B+5.5])
diff --git a/regression/games/strategy39.sgf b/regression/games/strategy39.sgf
new file mode 100644 (file)
index 0000000..d3ac610
--- /dev/null
@@ -0,0 +1,28 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 2.7.243)]WR[15k*]
+PB[gerula]BR[16k*]
+PC[NNGS]DT[2001-06-26]AP[gnugoclient:1.9]
+RE[W+8.5]
+;B[qd];W[qp];B[dc];W[cq];B[eq];W[od];B[pe];W[ce];B[co];W[ed];B[ec]
+;W[fd];B[oc];W[fc];B[dd];W[de];B[fb];W[oq];B[nd];W[qj];B[qh];W[ci]
+;B[bq];W[hq];B[bc];W[kq];B[hr];W[qm];B[kc];W[iq];B[ir];W[gr];B[gq]
+;W[fr];B[er];W[fq];B[fp];W[gp];B[fo];W[cl];B[nf];W[id];B[ic];W[hc]
+;B[ib];W[gb];B[eb];W[hn];B[hb];W[ri];B[rh];W[if];B[jd];W[hd];B[jf]
+;W[jg];B[kf];W[ki];B[pj];W[pk];B[qi];W[fm];B[qk];W[ql];B[rj];W[ok]
+;B[mj];W[mk];B[be];W[bf];B[bd];W[lk];B[oj];W[ga];B[bm];W[cm];B[cn]
+;W[bl];B[dm];W[dl];B[em];W[el];B[fn];W[gm];B[hm];W[bn];B[bo];W[am]
+;B[gn];W[go];B[jq];W[es];B[ds];W[ep];B[dp];W[eo];B[do];W[jp]C[L:5]
+;B[dq];W[en]C[L:2];B[fs];W[gs]C[L:1];B[dn];W[rk]C[L:0];B[lh];W[nj]
+;B[ni];W[nk];B[lj];W[kj]C[L:1];B[jh];W[ih]C[L:2];B[kh];W[ij]C[L:3]
+;B[li];W[sj]C[L:4];B[si];W[rl]C[L:5];B[kk];W[jk]C[L:6];B[kl];W[ji]
+C[L:7];B[kg];W[ig]C[L:8];B[ln];W[nn]C[L:6];B[cf];W[cg]C[L:7];B[df]
+;W[ef]C[L:8];B[bg];W[dg]C[L:9];B[af];W[bh]C[L:10];B[ag];W[cf];B[cd]
+;W[ha];B[ia];W[sk];B[qj];W[ah];B[ae];W[je];B[ke];W[ie];B[fa];W[gc]
+;B[ao];W[an];B[om];W[es];B[cr];W[fs];B[pl];W[lm];B[ll];W[km];B[jl]
+;W[ml]C[L:8];B[mm];W[nm]C[L:6];B[mn];W[nl]C[L:7];B[jn];W[im]C[L:8]
+;B[jm];W[]C[L:9];B[kp];W[mo]C[L:7];B[lo];W[no]C[L:5];B[lq];W[jr]
+C[L:6];B[jo];W[il]C[L:4];B[kr];W[js]C[L:5];B[jq];W[hs]C[L:6];B[ks]
+;W[kq]C[L:7];B[qq];W[rq]C[L:5];B[jq];W[is]C[L:6];B[ip];W[mr]C[L:7]
+;B[lr];W[mp]C[L:8];B[lp];W[mq]C[L:9];B[io];W[ms]C[L:10];B[ho];W[in]
+;B[hp];W[ls];B[];W[]C[final_score: W+8.5])
diff --git a/regression/games/strategy4.sgf b/regression/games/strategy4.sgf
new file mode 100644 (file)
index 0000000..cc2d3c9
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2000-07-29]
+SY[Cgoban 1.9.10]TM[-];B[ee];W[gg];B[eg];W[ge];B[dd];W[fc];B[tt]
+)
diff --git a/regression/games/strategy40.sgf b/regression/games/strategy40.sgf
new file mode 100644 (file)
index 0000000..4e90bcf
--- /dev/null
@@ -0,0 +1,18 @@
+(;GM[1]FF[4]
+SZ[9]HA[3]KM[0.5]
+PW[ug]WR[3k*]
+PB[GnuGo (GNU Go 2.7.248)]BR[14k*]
+PC[NNGS]DT[2001-08-24]AP[gnugoclient:2.0]
+RE[W+27.5]
+AB[cc][gc][cg]
+;W[ce];B[gf];W[ef];B[eg];W[fg];B[ff];W[dg];B[eh]C[L:7];W[dh];B[bd]
+C[L:5];W[fh];B[cf]C[L:6];W[be];B[bf]C[L:7];W[ad];B[df]C[L:5];W[ee]
+;B[hh]C[L:6];W[de];B[ch]C[L:7];W[ei];B[bh]C[L:8];W[ec];B[db]C[L:9]
+;W[eb];B[ac]C[L:8];W[ae];B[fb]C[L:9];W[ea];B[cb]C[L:10];W[ag];B[gd]
+;W[cd];B[gh];W[fa];B[ga];W[fc];B[gb];W[fe];B[fd];W[ed];B[ge];W[gg]
+;B[hg];W[gi];B[hi];W[fi];B[ba];W[bc];B[ah];W[af];B[]
+C[final_score: W+27.5
+B9 removed
+C8 removed
+A7 removed
+B4 removed])
diff --git a/regression/games/strategy41.sgf b/regression/games/strategy41.sgf
new file mode 100644 (file)
index 0000000..c8465f2
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-09-02]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[fb][gb][hb][ec][gc][cd][fd][de][ee][bf][cf][ag][bg][bh]
+AB[ga][ha][ib][hc][gd][hd][fe][df][ef][ff][cg][gg][ah][ch][ai][bi][ci]
+)
diff --git a/regression/games/strategy42.sgf b/regression/games/strategy42.sgf
new file mode 100644 (file)
index 0000000..e19d1e3
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.0.0)]WR[14k*]
+PB[pooo]BR[16k]
+PC[NNGS]DT[2001-09-02]AP[gnugoclient:2.0]
+RE[B+1.5]
+;B[dp];W[pd];B[dc];W[pp];B[ci];W[ic];B[de];W[kd];B[pj];W[cn];B[cl]
+;W[cq];B[cp];W[dq];B[ep];W[bp];B[bo];W[bq];B[co];W[fq];B[go];W[qh]
+;B[qn];W[np];B[on];W[ro];B[lp];W[fc];B[qc];W[qd];B[pc];W[oc];B[ob]
+;W[nc];B[nb];W[mc];B[mb];W[mq];B[qi];W[ph];B[qo];W[qp];B[rn];W[dm]
+;B[fl];W[db];B[cb];W[gq];B[ip];W[mo];B[mn];W[kr];B[lo];W[rp];B[lq]
+;W[lr];B[eb];W[fb];B[lc];W[ld];B[jb];W[gd];B[oi];W[ng];B[ff];W[ig]
+;B[no];W[ii];B[ik];W[kc];B[kb];W[fh];B[fi];W[gg];B[eh];W[ib];B[fg]
+;W[lb];B[la];W[li];B[mj];W[jj];B[kk];W[jk];B[jl];W[kl];B[lk];W[il]
+;B[jm];W[hk];B[hl];W[im];B[in];W[hm];B[gl];W[pi];B[qj];W[ir];B[fo]
+;W[rc];B[rb];W[rd];B[qb];W[ri];B[rj];W[rh];B[gf];W[hf];B[gh];W[hn]
+;B[io];W[ho];B[mp];W[op];B[hg];W[he];B[hj];W[hp];B[iq];W[ij];B[gk]
+;W[hh];B[hi];W[ik];B[ih];W[jh];B[if];W[jg];B[nh];W[mh];B[mi];W[lh]
+;B[hr];W[jq];B[jp];W[hq];B[kq];W[jr];B[oh];W[og];B[ed];W[sb];B[lc]
+;W[fe];B[fd];W[ge];B[ec];W[ee];B[ef];W[sn];B[sm];W[so];B[lj];W[sj]
+;B[rk];W[rm];B[sl];W[rl];B[sk];W[oj];B[ni];W[pk];B[si];W[qk];B[ok]
+;W[sj];B[ol];W[qm];B[pm];W[pl];B[nj];W[pj];B[fa];W[ga];B[gb];W[gc]
+;B[ha];W[ia];B[ea];W[hb];B[ga];W[eq];B[gn];W[po];B[pn];W[ra];B[pa]
+;W[sa];B[jc];W[jd];B[ja];W[lb];B[mr];W[nq]C[L:9];B[lc];W[id]C[L:10]
+;B[lb];W[kj];B[ap];W[hh];B[gg];W[aq];B[qa];W[ao];B[an];W[bn];B[ap]
+;W[nk];B[nl];W[ao];B[am];W[bl];B[ap];W[mk]C[L:8];B[ml];W[ao]C[L:9]
+;B[al];W[bm]C[L:10];B[ap];W[oa];B[sc];W[ao];B[ak];W[bk];B[ap];W[km]
+;B[jn];W[ao];B[aj];W[bi];B[ap];W[bj];B[ao];W[sd];B[gm];W[sb];B[fp]
+;W[ih];B[na];W[dl];B[ck];W[cj];B[dk];W[oo];B[dj];W[gp];B[sa];W[sc]
+;B[ra];W[]
+C[C6 removed
+D7 removed
+T11 removed
+N2 removed
+H2 removed
+D18 removed
+J14 removed
+L7 removed
+final_score: B+1.5]
+)
diff --git a/regression/games/strategy43.sgf b/regression/games/strategy43.sgf
new file mode 100644 (file)
index 0000000..bb6662c
--- /dev/null
@@ -0,0 +1,40 @@
+(;GM[1]FF[4]
+SZ[19]HA[2]KM[5.5]
+PW[GnuGo (GNU Go 3.0.0)]WR[14k*]
+PB[deye]BR[15k*]
+PC[NNGS]DT[2001-09-02]AP[gnugoclient:2.0]
+RE[W+58.5]
+AB[pd][dp]
+;W[pp];B[dd];W[fc];B[mq];W[oq];B[qn];W[qf];B[qq];W[qp];B[rp];W[ro]
+;B[qo];W[rq];B[so];W[sp];B[rn];W[cn];B[rp];W[rr];B[sq];W[qr];B[no]
+;W[kq];B[mr];W[ic];B[or];W[pr];B[nq];W[sr];B[op];W[pq];B[po];W[hq]
+;B[fq];W[bp];B[cp];W[bq];B[cr];W[qi];B[oj];W[ck];B[en];W[cf];B[cd]
+;W[nc];B[eb];W[qc];B[of];W[pc];B[qk];W[qd];B[oe];W[ko];B[ln];W[jm]
+;B[kn];W[jn];B[jo];W[io];B[jp];W[kp];B[in];W[hn];B[im];W[jl];B[ip]
+;W[ho];B[hp];W[gp];B[gk];W[ec];B[dc];W[ek];B[lk];W[ie];B[jj];W[ef]
+;B[eh];W[ch];B[gg];W[fb];B[db];W[le];B[bb];W[gr];B[fr];W[rj];B[rk]
+;W[hl];B[gl];W[oh];B[mg];W[ng];B[mf];W[ge];B[mh];W[ni];B[nj];W[kg]
+;B[ki];W[jh];B[hi];W[lr];B[lq];W[kr];B[md];W[me];B[nf];W[nd];B[mi]
+;W[og];B[qj];W[ri];B[pi];W[ed];B[oi];W[ph];B[qh];W[rh];B[pg];W[qg]
+;B[pf];W[be];B[bd];W[eg];B[fg];W[fi];B[ei];W[fh];B[ej];W[fj];B[fk]
+;W[dj];B[el];W[dk];B[cm];W[bm];B[dm];W[bn];B[hk];W[hm];B[fn];W[gh]
+;B[hh];W[dh];B[fp];W[gq];B[ik];W[hg];B[ig];W[hf];B[kh];W[ih];B[lg]
+;W[jg];B[il];W[ll];B[kl];W[iq];B[km];W[jq];B[jk];W[jo];B[ml];W[os]
+;B[ns];W[nr];B[ms];W[br];B[cq];W[ii];B[ij];W[od];B[gi];W[di];B[gj]
+;W[pe];B[lo];W[ea];B[da];W[fa];B[ce];W[bf];B[df];W[dg];B[de];W[gm]
+;B[fm];W[do];B[eo];W[bs];B[cs];W[sk];B[sl];W[sj];B[rm];W[lp];B[mp]
+;W[ad];B[ac];W[ae];B[ee];W[lf];B[fe];W[ff];B[fd];W[gd];B[cl];W[bl]
+;B[co];W[dn];B[bo];W[ao];B[dl];W[go];B[gs];W[hs];B[fs];W[sp];B[ro]
+;W[or];B[ls];W[fo];B[ks];W[js];B[nh];W[qh];B[ne];W[sq];B[ld];W[gn]
+;B[ji];W[ke];B[kd];W[jd];B[kb];W[kc];B[lc];W[jc];B[lb];W[];B[ib]
+;W[jb];B[gc];W[gb];B[nb];W[];B[ob];W[mc];B[mb];W[pb];B[oc];W[pd]
+;B[ja];W[];B[hb];W[hc];B[pa];W[];B[qa];W[rb];B[ma];W[];B[oa];W[ka]
+;B[qb];W[];B[rc];W[rd];B[jf];W[je];B[kf];W[if];B[jh];W[]
+C[J18 removed
+K19 removed
+M18 removed
+S17 removed
+M8 removed
+final_score: W+58.5
+F13 removed]
+)
diff --git a/regression/games/strategy44.sgf b/regression/games/strategy44.sgf
new file mode 100644 (file)
index 0000000..5c07f7a
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[3]
+RU[Japanese]SZ[9]HA[0]KM[5.5]
+PW[White]
+PB[Black]
+GN[White (W) vs. Black (B)]
+DT[2001-09-04]
+SY[Cgoban 1.9.10]TM[30:00+30:00/25];
+AW[ea][fb][hb][dc][ec][gc][ed][hd][he][bf][cf][eg][ch][eh]
+AB[cb][eb][cc][fc][bd][dd][fd][de][ee][fe][gf][fg][hg][fh]
+)
diff --git a/regression/games/strategy45.sgf b/regression/games/strategy45.sgf
new file mode 100644 (file)
index 0000000..d8351d0
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.10 (level 10) load and print]PB[Unknown]HA[9]KM[0.5]GN[GNU Go 3.1.10 load and print Random Seed 1003681052] 
+AW[la][na][eb][ib][jb][mb][ob][pb][cc][ec][lc][mc][nc][bd][fd][ld][nd][od][qd][ge][he][ie][ke][le][pe][qe][re][cf][if][kf][dg][fg][hg][ig][jg][kg][lg][og][dh][fh][gh][ih][mh][nh][fi][ii][ki][ni][pi][qi][fj][oj][dk][ek][fk][gk][lk][mk][nk][bl][cl][el][il][jl][ol][bm][em][gm][hm][jm][nm][mn][nn][pn][bo][ko][lo][mo][oo][bp][cq][qq][rq][or][pr]
+AB[pa][fb][hb][kb][lb][qb][fc][gc][hc][ic][jc][kc][oc][pc][qc][rc][dd][ed][jd][md][pd][je][me][oe][ef][ff][gf][hf][jf][lf][mf][of][pf][qf][rf][bg][eg][gg][mg][pg][eh][hh][lh][ph][bi][ci][ei][gi][hi][ji][li][mi][dj][ej][gj][hj][ij][jj][kj][lj][mj][pj][bk][ck][hk][dl][fl][hl][pl][ql][cm][im][lm][mm][in][kn][ln][qn][ho][jo][no][cp][dp][gp][jp][mp][np][pp][qp][eq][jq][mq][pq]
+PL[B]
+IL[ma][nb]
+)
diff --git a/regression/games/strategy46.sgf b/regression/games/strategy46.sgf
new file mode 100644 (file)
index 0000000..4f0142f
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.13)]WR[14k*]
+PB[crazymonk]BR[18k]
+PC[NNGS]DT[2001-11-10]AP[gnugoclient:2.0]
+RE[B+21.5]
+;B[pd];W[dp];B[dd];W[qp];B[jd];W[qf];B[nd];W[pj];B[dj];W[op];B[cn]
+;W[fq];B[jq];W[rd];B[qc];W[ph];B[bp];W[cq];B[mp];W[qm];B[nq];W[oq]
+;B[hq];W[bq];B[en];W[gp];B[hp];W[bo];B[co];W[cp];B[bn];W[ap];B[eo]
+;W[cf];B[fd];W[bd];B[cc];W[dh];B[ci];W[ml];B[nn];W[ch];B[ef];W[gr]
+;B[go];W[js];B[jr];W[kr];B[is];W[ng];B[jj];W[mi];B[kl];W[lm];B[ln]
+;W[km];B[jm];W[kn];B[ko];W[nl];B[jn];W[rc];B[lf];W[on];B[om];W[nm]
+;B[oo];W[mn];B[pn];W[no];B[mo];W[on];B[po];W[nn];B[ol];W[kh];B[jg]
+;W[fh];B[gh];W[fg];B[gg];W[ff];B[gf];W[ee];B[de];W[df];B[fe];W[bc]
+;B[fi];W[eg];B[nk];W[ed];B[ec];W[cb];B[db];W[mk];B[bb];W[ab];B[ca]
+;W[qb];B[pb];W[lo];B[lp];W[nr];B[mr];W[or];B[np];W[kp]C[L:7];B[jo]
+;W[kq]C[L:6];B[lr];W[ks]C[L:7];B[ir];W[lq]C[L:8];B[ln];W[mq]C[L:5]
+;B[lo];W[ls]C[L:6];B[ll];W[pm]C[L:5];B[lk];W[nj]C[L:6];B[mm];W[ok]
+C[L:7];B[li];W[lh]C[L:8];B[mg];W[lg]C[L:9];B[nf];W[mh];B[jp];W[ms]
+;B[mf];W[jh];B[ih];W[lj];B[og];W[lm];B[nh];W[kj];B[jk];W[bi];B[bj]
+;W[ai]C[L:8];B[aj];W[bh];B[ef];W[ee]C[L:9];B[rb];W[sb]C[L:10];B[qa]
+;W[ei];B[fj];W[ej];B[ek];W[di];B[cj];W[an];B[am];W[ao];B[bm];W[ji]
+;B[ii];W[ep];B[gq];W[ac];B[fp];W[fr];B[gs];W[hr];B[hs];W[sc];B[fs]
+;W[qe];B[pf];W[pg];B[qd];W[pe];B[oe];W[km];B[jl];W[ce];B[cd];W[do]
+;B[dn];W[kg];B[jf];W[kf];B[ke];W[ni];B[oi];W[pi];B[oh];W[of];B[er]
+;W[dr];B[eq];W[ds];B[dq];W[pf];B[ng];W[oj];B[kn];W[mm];B[es];W[cr]
+;B[ar];W[aq];B[];W[kk];B[ed];W[ef];B[ba];W[bf];B[ra];W[aa];B[sa]
+;W[re];B[];W[]
+C[final_score: B+21.5
+M11 removed
+P8 removed
+Q6 removed
+A2 removed])
diff --git a/regression/games/strategy47.sgf b/regression/games/strategy47.sgf
new file mode 100644 (file)
index 0000000..fa05c8c
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[oa][nb][pb][cc][ec][fc][gc][hc][ic][kc][nc][oc][pc][dd][fd][jd][md][od][be][ce][he][ie][le][af][bf][if][mf][ag][eg][fg][gg][hg][jg][mg][ng][ah][bh][hh][ih][kh][mh][oh][fi][ii][ji][li][mi][ni][pi][cj][ej][fj][ij][jj][lj][nj][oj][pj][qj][sj][ck][dk][gk][hk][pk][qk][rk][sk][bl][dl][gl][jl][sl][bm][gm][hm][im][jm][km][lm][om][bn][cn][dn][gn][jn][ln][mn][nn][on][pn][ao][bo][co][eo][fo][lo][mo][oo][qo][bp][fp][lp][np][op][pp][qp][rp][sp][cq][fq][kq][rq][pr][qr][rr][ps]AB[pa][qa][qb][qc][ed][gd][hd][id][nd][pd][de][ee][fe][ge][me][ne][oe][pe][cf][df][ef][ff][gf][hf][nf][pf][bg][cg][dg][og][pg][ch][eh][fh][gh][ph][ai][bi][ci][di][ei][gi][hi][ki][qi][ri][si][bj][dj][gj][hj][kj][mj][rj][ak][bk][ik][jk][kk][lk][mk][nk][ok][al][cl][hl][il][kl][ll][nl][ol][pl][ql][rl][am][mm][nm][pm][sm][an][hn][in][qn][rn][do][go][jo][ko][ro][so][ap][cp][dp][ep][gp][ip][jp][kp][mp][aq][bq][eq][gq][hq][lq][mq][nq][oq][pq][qq][br][dr][fr][kr][lr][or][es][ms][ns][os]PL[W])
diff --git a/regression/games/strategy48.sgf b/regression/games/strategy48.sgf
new file mode 100644 (file)
index 0000000..375e811
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.0]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[da][ea][ka][oa][eb][fb][jb][kb][lb][nb][ob][pb][qb][dc][jc][qc][dd][ed][fd][gd][jd][ld][md][nd][rd][ce][de][fe][he][je][ke][le][me][ne][oe][qe][re][bf][cf][df][hf][kf][lf][nf][rf][ag][bg][dg][eg][hg][jg][rg][sg][bh][ch][eh][hh][jh][oh][sh][ci][hi][ii][ki][ij][kj][lj][mj][nj][oj][lk][hl][ll][ml][nl][gm][hm][jm][km][om][en][fn][gn][hn][in][mn][on][co][do][io][no][ap][dp][ep][jp][kp][lp][mp][op][pp][sp][aq][bq][cq][dq][jq][oq][qq][rq][sq][ar][br][dr][er][lr][mr][nr][pr][cs][ds][ls][os]AB[ca][la][ma][bb][cb][db][mb][cc][ec][fc][kc][lc][mc][nc][oc][pc][ad][bd][cd][kd][od][pd][qd][ae][be][ee][ge][pe][af][ef][ff][gf][mf][of][pf][qf][gg][kg][lg][mg][ng][qg][ah][dh][fh][gh][kh][nh][ph][rh][ai][bi][di][ei][gi][ji][li][mi][ni][oi][qi][si][bj][cj][dj][gj][hj][jj][pj][rj][hk][ik][jk][kk][mk][nk][ok][qk][gl][il][jl][kl][ol][pl][bm][em][fm][im][pm][an][bn][cn][dn][pn][qn][ao][bo][eo][fo][go][ho][oo][po][ro][so][bp][cp][fp][ip][np][qp][rp][eq][fq][hq][iq][kq][lq][mq][nq][fr][hr][jr][kr][es][fs][hs][js][ks]PL[W])
diff --git a/regression/games/strategy49.sgf b/regression/games/strategy49.sgf
new file mode 100644 (file)
index 0000000..9d45d52
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[fa][ka][bb][eb][fb][kb][lb][ac][ec][jc][mc][ad][dd][fd][jd][md][nd][od][de][fe][ke][me][qe][af][bf][cf][ef][gf][hf][if][jf][kf][lf][mf][of][pf][cg][dg][eg][gg][ig][mg][ng][og][pg][qg][dh][ih][oh][sh][di][gi][mi][pi][qi][ri][si][ej][fj][gj][hj][lj][mj][nj][oj][pj][sj][ek][kk][lk][qk][rk][al][bl][cl][dl][hl][jl][kl][ol][pl][ql][bm][hm][im][lm][mm][nm][pm][in][jn][kn][ln][mn][bo][co][io][lo][bp][cp][dp][gp][ip][jp][dq][eq][fq][gq][hq][iq][qq][er][ir][es][gs][is]AB[ba][da][ea][la][ma][cb][db][mb][nb][pb][bc][cc][dc][nc][oc][qc][cd][ed][id][pd][ae][be][ce][ie][je][le][ne][oe][pe][re][ff][nf][qf][rf][fg][hg][jg][kg][lg][rg][sg][eh][fh][gh][hh][jh][lh][mh][nh][ph][qh][rh][ei][fi][hi][ii][ki][li][ni][oi][ij][kj][fk][gk][hk][ik][jk][sk][el][gl][il][rl][sl][am][cm][dm][em][gm][jm][om][qm][rm][an][bn][cn][hn][nn][on][pn][qn][ao][do][fo][go][ho][jo][ko][mo][no][po][ap][ep][fp][hp][kp][lp][qp][bq][cq][jq][rq][br][dr][gr][jr][lr][cs][ds][js]PL[B])
diff --git a/regression/games/strategy5.sgf b/regression/games/strategy5.sgf
new file mode 100644 (file)
index 0000000..aae2bf8
--- /dev/null
@@ -0,0 +1,44 @@
+(;
+GM[1]FF[3]US[Brought to you by No Name Go Server]
+CP[
+  This game was played on the No Name Go Server
+  Permission to reproduce this game is given.]
+GN[rmb-GnuGo(B) NNGS]
+EV[None]
+RE[W+Time]
+PW[rmb]WR[8k*]
+PB[GnuGo]BR[17k*]
+PC[NNGS Worldwide: nngs.cosmic.org 9696]
+DT[2000-07-28]
+SZ[19]TM[600]KM[0.5]
+
+HA[9]AB[pd][dp][dd][pp][dj][pj][jp][jd][jj]
+;W[nc];B[qf];W[pb];B[qc];W[qb];B[gp];W[cn];B[fc];W[fq];B[er];W[eq]C[
+ bump started observation.
+]
+;B[dr];W[dq];B[bo];W[cp];B[cq];W[cr];B[co];W[bq];B[fr];W[gq];B[gr];W[hq]
+;B[do];W[hr];B[ce];W[cc];B[bd];W[eb];B[bb];W[fb];B[gd];W[ec];B[nq];W[qn]
+;B[ro];W[rn];B[so];W[qo];B[sn];W[qp];B[qq];W[rl];B[sm];W[rp];B[sl];W[rk]
+;B[sk];W[rj];B[sj];W[ri];B[si];W[rh];B[sp];W[rq];B[sh];W[rg];B[sg];W[rf]
+;B[sf];W[re];B[se]C[
+ ingwa started observation.
+]
+;W[rd];B[rc];W[sd];B[rb];W[lc];B[of];W[ed];B[qr];W[rr];B[oc];W[ob];B[nn]
+;W[pc];B[qd];W[od];B[mf];W[pe];B[qe]C[
+ abcd started observation.
+]
+;W[oe];B[pf];W[jc];B[gb];W[fd];B[gc];W[ff];B[ie];W[ge];B[he];W[de];B[cd]
+;W[df];B[cl];W[cf];B[bf];W[bg];B[cg];W[bh];B[dh];W[bj];B[ci];W[bi];B[bm]
+;W[af];B[be];W[bc];B[cb];W[dc];B[dm];W[hp];B[pm];W[pk];B[ja];W[kb];B[ic]
+;W[jb];B[ia];W[ib];B[ha];W[hc];B[hb];W[id];B[kd];W[ld];B[gh];W[je];B[ke]
+;W[jf];B[bp];W[cq];B[qj];W[gg];B[qk];W[ic];B[if];W[hd];B[jg];W[ka];B[ql]
+;W[rm];B[rs];W[le];B[kf];W[lf];B[ra];W[lg];B[mg];W[lh];B[ki];W[go];B[fn]
+;W[gn];B[gm];W[io];B[jm];W[fh];B[gi];W[fi];B[fj];W[hm];B[gl];W[jq];B[lr]
+;W[kp];B[jo];W[ip];B[kq];W[lp];B[jr];W[iq];B[mm];W[np];B[mj];W[oq];B[pq]
+;W[mq];B[nr];W[mr];B[kr];W[or];B[mo];W[mp];B[oo];W[lo];B[in];W[no];B[hn]
+;W[on];B[pn];W[po];B[op];W[mn];B[om];W[lm];B[ml];W[ll];B[qi];W[lj];B[li]
+;W[mk];B[ok];W[nk];B[mi];W[nj];B[oi];W[nh];B[qh];W[ni];B[mh];W[ol];B[pl]
+;W[nl];B[nm];W[qg];B[pg];W[oh];B[ph];W[oj];B[pk];W[ii];B[hg];W[jk];B[ij]
+;W[kj];B[kn];W[ln];B[ik];W[jl];B[km];W[kl];B[hl];W[ko];B[jn];W[il];B[im]
+;W[me];B[fp];W[ho];B[hm];W[fo];B[ep];W[gs];B[eo];W[ds];B[pi]
+;)
diff --git a/regression/games/strategy50.sgf b/regression/games/strategy50.sgf
new file mode 100644 (file)
index 0000000..1ff1343
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.8 load and print]
+DT[2002-09-18]
+KM[5.5]AP[GNU Go:3.3.8]RU[Japanese]
+ ;AW[ea][ia][ra][bb][db][eb][fb][hb][ib][ob][pb][rb][ac][bc][cc][dc][ic][nc][pc][qc][ad][cd][fd][jd][kd][ld][md][sd][he][me][ne][oe][se][ef][ff][gf][hf][jf][kf][mf][rf][sf][dg][eg][gg][hg][ig][kg][lg][mg][ng][pg][qg][rg][gh][jh][mh][qh][ai][ci][di][fi][gi][ji][ki][li][pi][qi][aj][bj][cj][ej][fj][qj][bk][ek][rk][cl][dl][el][fl][kl][ml][nl][pl][ql][rl][dm][jm][km][lm][mm][om][rm][sm][dn][gn][kn][nn][on][pn][sn][co][do][go][ho][jo][ko][mo][dp][hp][ip][jp][lp][mp][np][qp][dq][eq][hq][jq][lq][nq][er][ir][qr][ds][es][fs][is][js]AB[fa][ga][ha][sa][gb][qb][sb][ec][fc][gc][hc][oc][rc][sc][bd][dd][hd][id][nd][od][pd][qd][rd][ae][be][ce][de][ee][fe][ge][ie][je][ke][le][pe][re][df][if][lf][nf][of][pf][qf][cg][fg][og][ah][bh][ch][dh][eh][fh][hh][ih][nh][oh][ph][bi][ei][hi][ii][mi][oi][gj][ij][jj][kj][lj][pj][ak][fk][gk][hk][kk][lk][mk][nk][ok][pk][qk][al][bl][gl][il][jl][ll][ol][am][bm][cm][fm][gm][im][pm][qm][cn][fn][hn][in][jn][qn][rn][bo][fo][io][no][oo][po][qo][so][bp][cp][fp][gp][kp][pp][cq][fq][kq][mq][pq][cr][dr][fr][hr][jr][kr][lr][mr][nr][or][pr][cs][gs][ks]PL[W])
diff --git a/regression/games/strategy51.sgf b/regression/games/strategy51.sgf
new file mode 100755 (executable)
index 0000000..68b2532
--- /dev/null
@@ -0,0 +1,3 @@
+(;GM[1]FF[4]SZ[9]
+AB[bc][bd][be][bf][bg][bh][ch][ha][hb][hc][hd][he][hf][hg][hh][hi]
+AW[bb][cb][cc][cd][ce][cf][cg][ci][dg][dh][ga][gb][gc][gd][ge][gf][gg][gh][gi])
diff --git a/regression/games/strategy6.sgf b/regression/games/strategy6.sgf
new file mode 100644 (file)
index 0000000..521a5f8
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.147 ascii]HA[3]KM[5.5]GN[GNU Go 2.7.147 ascii Random Seed 965132269] 
+AB[dd]AB[pd]AB[dp]
+;W[qp];B[oq];W[pq];B[op];W[pm];B[kp];W[cj];B[cm];W[cf];B[df]
+;W[dg];B[ef];W[eg];B[gc];W[lc];B[jc];W[oc];B[lb];W[mb];B[kb]
+;W[ld];B[lf];W[ke];B[ie];W[me];B[pk];W[pi];B[pg];W[qk];B[ql]
+;W[qj];B[pl];W[nh];B[mk];W[lh];B[qf];W[qc];B[pc];W[pb];B[qh]
+;W[qi];B[ce];W[bf];B[qd];W[rc];B[rg];W[rd];B[ej];W[dk];B[mm]
+;W[qm];B[rl];W[rm];B[oi];W[oh];B[kg];W[jf];B[ph];W[oj];B[ni]
+;W[nj];B[mi];W[mj];B[li];W[lj];B[mh];W[mg];B[ki];W[kj];B[mf]
+;W[pj];B[rk];W[ri];B[be];W[nf];B[ne];W[oe];B[nd];W[od];B[of]
+;W[nc];B[ng];W[md];B[cg];W[ch];B[bg];W[bh];B[af];W[di];B[re]
+;W[pe];B[nk];W[nf];B[kh];W[qe];B[ne];W[ih];B[ji];W[jj];B[ii]
+;W[ij];B[ig];W[if];B[hh];W[hg];B[jh];W[jg];B[bk];W[bj];B[cl]
+;W[el];B[fk];W[gj];B[ei];W[gh];B[fg];W[fh];B[gf];W[gg];B[jm]
+;W[hl];B[cp];W[fp];B[hp];W[fn];B[hn];W[gm];B[eq];W[gq];B[kl]
+;W[lk];B[ml];W[ll];B[ff];W[hf];B[fl];W[em];B[eh];W[dh];B[ih]
+;W[lm];B[sd];W[sc];B[pr];W[qr];B[or];W[mn];B[hq];W[gr];B[sm]
+;W[sn];B[sl];W[ro];B[om];W[on];B[nn];W[no];B[nm];W[oo];B[mq]
+;W[lo];B[hr];W[ko];B[jo];W[im];B[jl];W[jn];B[in];W[kn];B[se]
+;W[hm];B[jp];W[lp];B[lq];W[mp];B[he];W[jd];B[id];W[je];B[rh]
+;W[sh];B[np];W[sf];B[rf];W[si];B[sg];W[kc];B[jb];W[er];B[dr]
+;W[fr];B[es];W[cr];B[cq];W[br];B[ar];W[dn];B[cn];W[do];B[bq]
+;W[co];B[bo];W[ak];B[al];W[aj];B[ep];W[eo];B[ma];W[na];B[la]
+;W[db];B[cc];W[cb];B[bb];W[ge];B[ic];W[fc];B[ck];W[gb];B[fa]
+;W[hc];B[gd];W[fd];B[fe];W[hb];B[dj];W[ek];B[fj];W[gk];B[ah]
+;W[ai];B[ag];W[fm];B[bi];W[hd];B[ge];W[fb];B[ec];W[fi];B[ci]
+;W[eb];B[ib];W[ia];B[fs];W[gs];B[ds];W[ba];B[bc];W[ea];B[ca]
+;W[gn];B[aa];W[hi];B[hs];W[ho];B[gp];W[go];B[io];W[fo];B[fq]
+;W[pp];B[qs];W[rs];B[ps];W[rr];B[le];W[pf];B[kf];W[nd];B[nf]
+;W[gl];B[dl];W[dm];B[ja];W[kr];B[jr];W[lr];B[mr];W[kq];B[ed]
+;W[jq];B[ip];W[ir];B[js];W[ms];B[ns];W[nr];B[nq];W[tt];B[tt]
+)
diff --git a/regression/games/strategy7.sgf b/regression/games/strategy7.sgf
new file mode 100644 (file)
index 0000000..1407201
--- /dev/null
@@ -0,0 +1,11 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]
+PW[GNU Go]PB[GNU Go 2.7.147 ascii]HA[0]KM[0.5]GN[GNU Go 2.7.147 ascii Random Seed 965139589] 
+LB[eg:75]
+C[Value of move: 75]
+;B[eg];W[ee];B[ec];W[ff];B[dd];W[de];B[ce];W[cf];B[ch];W[fg]
+;B[be];W[bf];B[bd];W[gc];B[ef];W[fe];B[df];W[bh];B[cg];W[eh]
+;B[bg];W[dg];B[ag];W[af];B[bi];W[ah];B[gb];W[hb];B[fb];W[fc]
+;B[ha];W[hc];B[ed];W[fd];B[ae];W[df];B[ib];W[ga];B[fa];W[db]
+;B[cc];W[eb];B[cb];W[ea];B[ca];W[ga];B[dc];W[fb];B[da];W[bb]
+;B[tt];W[bc];B[ba];W[ac];B[aa];W[tt];B[tt]
+)
diff --git a/regression/games/strategy8.sgf b/regression/games/strategy8.sgf
new file mode 100644 (file)
index 0000000..f07920e
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.147 ascii]HA[4]KM[0.5]GN[GNU Go 2.7.147 ascii Random Seed 965062427] 
+AB[dd]AB[pd]AB[dp]AB[pp]
+;W[qn];B[qo];W[nq];B[oq];W[cn];B[co];W[fq];B[eq];W[fc];B[ec]
+;W[cf];B[ce];W[qf];B[qe];W[nc];B[oc];W[fd];B[ed];W[nd];B[od]
+;W[jd];B[of];W[pn];B[pf];W[rf];B[ne];W[dn];B[do];W[qi];B[qg]
+;W[fp];B[ep];W[df];B[en];W[dj];B[np];W[jp];B[mq];W[rg];B[qh]
+;W[mn];B[fo];W[rh];B[pg];W[re];B[rd];W[hk];B[nn];W[oi];B[pi]
+;W[ng];B[pj];W[rj];B[qj];W[ql];B[ri];W[rk];B[ol];W[nj];B[si]
+;W[lp];B[lq];W[ob];B[pb];W[nb];B[oa];W[be];B[bd];W[bf];B[ae]
+;W[nm];B[mm];W[ml];B[lm];W[mo];B[nl];W[no];B[om];W[oo];B[mk]
+;W[ll];B[jj];W[kl];B[jl];W[kj];B[kk];W[km];B[jm];W[lj];B[mj]
+;W[pk];B[oj];W[ok];B[ni];W[nk];B[qk];W[pl];B[po];W[lk];B[mi]
+;W[lg];B[ln];W[kn];B[lo];W[ko];B[gp];W[gq];B[hq];W[hr];B[fr]
+;W[gr];B[ho];W[iq];B[ip];W[er];B[kq];W[oh];B[ph];W[mh];B[li]
+;W[ki];B[lh];W[cr];B[dr];W[fs];B[ds];W[jq];B[fe];W[cq];B[es]
+;W[dq];B[fr];W[gn];B[gs];W[em];B[ir];W[hp];B[io];W[go];B[gd]
+;W[hs];B[kh];W[gc];B[hd];W[fb];B[kg];W[lf];B[nh];W[eg];B[me]
+;W[ic];B[hc];W[ke];B[le];W[ld];B[md];W[lc];B[mc];W[hb];B[mb]
+;W[in];B[kf];W[hh];B[je];W[ie];B[kd];W[jb];B[kc];W[kb];B[lb]
+;W[id];B[ka];W[ee];B[ji];W[jk];B[jn];W[eb];B[db];W[ij];B[ik]
+;W[il];B[jh];W[jr];B[ih];W[ig];B[ge];W[de];B[cd];W[ef];B[gf]
+;W[ro];B[hg];W[hf];B[gg];W[rq];B[if];W[jf];B[hi];W[gh];B[gi]
+;W[fh];B[ke];W[ii];B[hj];W[ik];B[ja];W[he];B[ia];W[ib];B[ha]
+;W[pr];B[ga];W[fg];B[fa];W[nr];B[or];W[mp];B[op];W[os];B[mr]
+;W[ns];B[ms];W[ps];B[ea];W[gb];B[fi];W[ff];B[af];W[ag];B[ad]
+;W[bh];B[bn];W[bm];B[cm];W[dm];B[cl];W[bo];B[dl];W[ck];B[el]
+;W[fm];B[an];W[bp];B[am];W[fj];B[bl];W[jc];B[bk];W[bj];B[ak]
+;W[fl];B[ek];W[ej];B[aj];W[ai];B[ci];W[bi];B[cj];W[dk];B[fk]
+;W[gj];B[gk];W[ei];B[gl];W[hl];B[gm];W[fn];B[hm];W[im];B[hn]
+;W[eo];B[jo];W[jg];B[sj];W[rl];B[sk];W[ao];B[sl];W[sm];B[ch]
+;W[tt];B[kp];W[on];B[qq];W[nm];B[qr];W[rr];B[qs];W[kr];B[pq]
+;W[lr];B[rs];W[sq];B[ss];W[sp];B[ls];W[ks];B[cs];W[rp];B[bs]
+;W[fs];B[br];W[er];B[sr];W[cp];B[qp];W[rn];B[rm];W[sn];B[cg]
+;W[bg];B[pm];W[qm];B[js];W[is];B[hg];W[gg];B[eq];W[fr];B[tt]
+;W[tt]
+)
diff --git a/regression/games/strategy9.sgf b/regression/games/strategy9.sgf
new file mode 100644 (file)
index 0000000..68fff25
--- /dev/null
@@ -0,0 +1,33 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.149 ascii]HA[9]KM[0.5]GN[GNU Go 2.7.149 ascii Random Seed 965511319] 
+AB[dd]AB[jd]AB[pd]AB[dj]AB[jj]AB[pj]AB[dp]AB[jp]AB[pp]
+;W[qm];B[qo];W[rj];B[mp];W[qk];B[gq];W[qq];B[rp];W[pq];B[rr]
+;W[rq];B[sq];W[qp];B[rn];W[nq];B[op];W[mq];B[np];W[lq];B[oq]
+;W[lp];B[md];W[jr];B[nr];W[mr];B[or];W[kp];B[ko];W[lo];B[kn]
+;W[jq];B[cf];W[pk];B[ec];W[ch];B[dg];W[dh];B[eh];W[cg];B[bf]
+;W[bj];B[ah];W[bh];B[ai];W[cj];B[ip];W[aj];B[dk];W[bl];B[di]
+;W[ag];B[ck];W[bk];B[rl];W[rm];B[sm];W[ql];B[bn];W[qh];B[qf]
+;W[oh];B[al];W[cm];B[oc];W[em];B[bg];W[bi];B[am];W[ei];B[fi]
+;W[eg];B[df];W[fh];B[gc];W[ej];B[ek];W[fj];B[gi];W[fk];B[co]
+;W[eq];B[ep];W[fq];B[dq];W[fp];B[iq];W[ir];B[pi];W[ph];B[oi]
+;W[ni];B[nm];W[qi];B[mg];W[oj];B[er];W[fr];B[dr];W[gr];B[ff]
+;W[gh];B[gj];W[gk];B[gm];W[hk];B[hi];W[hh];B[ij];W[in];B[io]
+;W[jn];B[jo];W[hn];B[gn];W[ho];B[gp];W[go];B[fo];W[hf];B[hp]
+;W[il];B[hr];W[hs];B[fs];W[hq];B[fm];W[eo];B[fn];W[en];B[hr]
+;W[qc];B[gs];W[qd];B[is];W[kr];B[mk];W[pc];B[jl];W[hl];B[pb]
+;W[pe];B[qb];W[od];B[nd];W[ne];B[rc];W[rd];B[rb];W[me];B[jg]
+;W[ld];B[ob];W[lc];B[mb];W[ke];B[jc];W[hd];B[lb];W[hc];B[jb]
+;W[gd];B[gb];W[ef];B[mi];W[nh];B[ih];W[fe];B[pm];W[pn];B[om]
+;W[qn];B[lf];W[le];B[je];W[mh];B[pr];W[af];B[ae];W[ah];B[bd]
+;W[kf];B[jm];W[hm];B[kg];W[lh];B[lg];W[mj];B[li];W[lj];B[ki]
+;W[kk];B[jf];W[ng];B[lm];W[jk];B[hb];W[ll];B[ml];W[nk];B[lk]
+;W[kl];B[kj];W[ik];B[nj];W[ok];B[km];W[rk];B[sl];W[sn];B[so]
+;W[sk];B[sn];W[po];B[qr];W[cn];B[mj];W[bm];B[bo];W[an];B[ao]
+;W[fl];B[do];W[dn];B[mf];W[nf];B[mc];W[de];B[kh];W[ce];B[be]
+;W[cd];B[bc];W[cc];B[cb];W[bb];B[ab];W[db];B[ba];W[dc];B[ed]
+;W[ee];B[kc];W[eb];B[fc];W[if];B[ig];W[hg];B[fb];W[sd];B[ic]
+;W[js];B[hs];W[sc];B[ms];W[ls];B[ns];W[mn];B[nn];W[mm];B[mo]
+;W[ln];B[oo];W[da];B[ca];W[sb];B[fa];W[ie];B[ra];W[hj];B[ii]
+;W[gl];B[fp];W[el];B[on];W[id];B[im];W[fd];B[ea];W[ak];B[an]
+;W[pl];B[sa];W[ol];B[nl];W[kd];B[tt];W[tt];B[tt]
+)
diff --git a/regression/games/tactics01.sgf b/regression/games/tactics01.sgf
new file mode 100644 (file)
index 0000000..90e907c
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.7 (level 10) load and print]PB[Unknown]HA[2]KM[0.5]GN[GNU Go 3.1.7 load and print Random Seed 1001693761] 
+AW[ob][fc][jc][nc][qc][ed][fd][md][qd][me][qe][df][lf][of][pf][dg][ch][dh][di][dj][ck][dk][kk][dl][bm][cm][cn][dn][en][in][ln][co][eo][jo][ko][bp][cp][ep][fp][lp][mp][np][pp][bq][eq][nq][qq][rq][ar][nr][pr]
+AB[dc][ec][cd][nd][pd][ne][pe][cf][mf][qf][cg][ng][og][pg][bh][qh][ci][fi][cj][bk][fk][qk][bl][cl][il][dm][em][fm][fn][nn][qn][do][go][io][qo][dp][gp][jp][kp][rp][cq][dq][fq][iq][lq][mq][oq][pq][br][cr][er][or]
+PL[B]
+
+)
diff --git a/regression/games/tactics02.sgf b/regression/games/tactics02.sgf
new file mode 100644 (file)
index 0000000..0de9813
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.9 (level 10) load and print]PB[Unknown]HA[2]KM[0.0]GN[GNU Go 3.1.9 load and print Random Seed 1002729497] 
+AW[ga][fb][hb][pb][gc][hc][kc][nc][bd][ae][ce][bf][cf][oh][qh][ci][ei][pi][oj][qj][qk][ol][cn][co][fo][po][jp][qp][eq][fq][iq][kq][qq][dr][fr][jr][es]
+AB[eb][ob][qb][bc][fc][qc][cd][dd][fd][pd][pf][qf][pg][qg][ph][qi][rj][cm][dm][bn][bo][io][jo][ko][lo][cp][dp][np][dq][lq][pq][cr][or][qr]
+PL[B]
+IL[gb][be][jq][er]
+)
diff --git a/regression/games/tactics03.sgf b/regression/games/tactics03.sgf
new file mode 100644 (file)
index 0000000..d09e65e
--- /dev/null
@@ -0,0 +1,7 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go 3.1.10 (level 10) load and print]PB[Unknown]HA[9]KM[0.5]GN[GNU Go 3.1.10 load and print Random Seed 1003623050] 
+AW[ra][eb][pb][qb][cc][ec][fc][kc][qc][bd][cd][ld][od][qd][rd][de][he][je][ke][le][me][ne][oe][pe][re][cf][ef][gf][if][kf][of][sf][cg][jg][lg][ng][rg][dh][eh][jh][lh][mh][rh][di][fi][gi][ki][oi][pi][ej][hj][kj][oj][qj][bk][ek][mk][pk][bl][cl][el][kl][ml][nl][ol][dm][em][pm][cn][en][jn][pn][oo][lp][np][eq][gq][hq][iq][jq][nq][gr][ir][mr][or][is][ns]
+AB[pa][fb][gb][ob][rb][sb][gc][ic][lc][nc][oc][pc][rc][dd][gd][hd][jd][kd][pd][be][ce][ie][qe][bf][pf][qf][rf][bg][og][pg][qg][ah][ch][nh][ph][bi][ci][hi][ii][li][mi][ni][qi][ri][dj][fj][gj][jj][lj][nj][rj][ck][hk][kk][lk][nk][ok][jl][ll][pl][ql][bm][cm][fm][gm][nm][om][qm][bn][dn][in][kn][nn][qn][bo][do][ko][qo][dp][fp][jp][pp][dq][fq][oq][fr][hr][pr][fs][gs][hs]
+PL[B]
+IL[jf][ei][pj][nr]
+)
diff --git a/regression/games/tactics04.sgf b/regression/games/tactics04.sgf
new file mode 100644 (file)
index 0000000..d1375d3
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]SZ[19]KM[0.5]
+PW[GNU Go 3.1.32]
+PB[GNU Go 3.0.0]
+;B[pd];W[dp];B[pp];W[dd];B[pj];W[nq];B[lq];W[qq];B[qp];W[pq]
+;B[op];W[rq];B[np];W[nr];B[lo];W[rp];B[cf];W[qo];B[cn];W[nc]
+;B[lc];W[qc];B[qd];W[pc];B[od];W[rc];B[nd];W[nb];B[le];W[fd]
+;B[bd];W[cc];B[ci];W[cl];B[cq];W[dq];B[cp];W[do];B[cr];W[dn]
+;B[bn];W[el];B[hc];W[bc];B[gq];W[rd];B[go];W[gl];B[jn];W[il]
+;B[mr];W[fc];B[ce];W[kl];B[nn];W[lk];B[gb];W[li];B[lg];W[ni]
+;B[ph];W[qe];B[qm];W[rh];B[qn];W[po];B[of];W[jg];B[jd];W[kh]
+;B[nk];W[fi];B[rj];W[fb];B[qg];W[rg];B[if];W[ig];B[eh];W[ka]
+;B[bk];W[bl];B[ck];W[ak];B[aj];W[al];B[ej];W[fj];B[om];W[bj]
+;B[cj];W[ai];B[hn];W[gg];B[ef];W[ge];B[jf];W[rn];B[rm];W[fr]
+;B[bs];W[gr];B[iq];W[hr];B[ir];W[is];B[js];W[hs];B[sn];W[ro]
+;B[ng];W[jr];B[oq];W[or];B[jq];W[mq];B[kr];W[ms];B[fq];W[dr]
+;B[ls];W[ns];B[eq];W[ds];B[er];W[es];B[ac];W[ab];B[ad];W[bb]
+;B[bh];W[mp];B[mo];W[ri];B[lm];W[sj];B[sk];W[rk];B[si];W[qj]
+;B[qk];W[sj];B[hq];W[sl];B[fs];W[sm];B[rl];W[so];B[mk];W[pi]
+;B[oi];W[qi];B[pk];W[oh];B[oj];W[pg];B[nh];W[qh];B[mi];W[ll]
+;B[lj];W[kj];B[mj];W[lh];B[ml];W[dk];B[dj];W[co];B[bo];W[ek]
+;B[hf];W[gf];B[hg];W[hh];B[jc];W[fh];B[kb];W[la];B[ja];W[ma]
+;B[oc];W[ob];B[fm];W[gm];B[fn];W[he];B[en];W[dm];B[og];W[oo]
+;B[no];W[pf];B[fg];W[cd];B[ae];W[kg];B[dg];W[mg];B[lf];W[mh]
+;B[ff];W[oe];B[nf];W[ne];B[mf];W[me];B[md];W[pe];B[mc];W[kf]
+;B[ke];W[id];B[je];W[ga];B[ha];W[ic];B[fa];W[ib];B[jb];W[ia]
+;B[fl];W[fk];B[km];W[jm];B[im];W[jl];B[hm];W[ah];B[hl];W[hk]
+;B[pn];W[bg];B[af];W[ch];B[dh];W[bi];B[ei];W[cg];B[bf];W[ag]
+;B[mb];W[na];B[lp];W[lr];B[pa];W[pb];B[mr];W[ps];B[lr];W[de]
+;B[df];W[ep];B[ee];W[ed];B[ph];W[fp];B[gp];W[an];B[ao];W[am]
+;B[oh];W[ie];B[on];W[cs];B[br];W[lb];B[fo];W[cm];B[em];W[fe]
+;B[eo];W[bm];B[aq];W[gk];B[gn];W[tt];B[tt])
diff --git a/regression/games/tactics05.sgf b/regression/games/tactics05.sgf
new file mode 100644 (file)
index 0000000..2ed8fa1
--- /dev/null
@@ -0,0 +1,22 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.42]
+GN[blunder23]
+PB[GNU Go 3.3.11 (random seed 768389082)]
+PW[GNU Go 3.3.11 (random seed 768389082)]
+AB[ac][bf][bm][bn][cg][ci][cl][da][dc][dg][dh][dj][dl][dr][eb][ec][el]
+[em][eq][er][fb][fd][fj][ga][gd][ge][gk][gl][gm][gp][hb][ib][ie][if]
+[ij][il][jc][jd][ji][jj][jk][jl][kf][kg][ki][km][le][lg][li][lk][me]
+[mf][mg][mk][mm][mo][nd][nj][nk][ns][ob][oc][of][oj][ol][on][oq][or]
+[os][pa][pd][pe][pf][pj][pl][pm][pn][po][pp][pq][qb][qd][qj][qm][qn]
+[qq][qr][rc][re][rf][rn][rp][sd][sp]
+AW[ad][ba][bc][bo][bp][cb][cc][cd][cj][cr][db][dd][df][dm][dn][dp][dq]
+[ed][eg][en][fe][fh][fm][fn][gf][gg][gn][gr][hi][hj][hk][hl][hm][hn]
+[ih][ik][im][jb][je][jh][jn][ka][kc][kd][ke][kh][kj][ko][kq][lb][ld]
+[lh][lj][md][mh][mi][mj][mq][ms][na][nb][nc][nh][np][nq][nr][oa][oi]
+[ok][om][pg][pi][pk][pr][qe][qf][qg][qh][qk][ql][qo][rg][ri][rj][rm]
+[ro][sf][sn][so]
+)
diff --git a/regression/games/tactics06.sgf b/regression/games/tactics06.sgf
new file mode 100644 (file)
index 0000000..420bc28
--- /dev/null
@@ -0,0 +1,14 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.42]
+GN[tactics06]
+AB[af][ai][bb][bd][bj][ca][cb][cd][ci][cj][cn][co][da][de][dh][dl][dm]
+[ef][fh][fs][gr][gs][hq][jo][jq][kh][lp][mf][mh][mj][nd][np][og][pb][pc]
+[pd][pf][ph][pp][qe][qg][qh][qq][rh][ri][rq][sp][sq]
+AW[am][bc][be][bg][bi][bp][cc][cg][ch][cp][db][dc][dn][dp][dr][ea][ec]
+[em][en][es][fk][fp][fq][fr][gc][ge][if][lc][le][ln][nb][nn][pl][pn][qb]
+[qc][qf][qi][qj][qo][qp][rd][re][rf][rj][rp][so]
+)
diff --git a/regression/games/tactics07.sgf b/regression/games/tactics07.sgf
new file mode 100644 (file)
index 0000000..0738efe
--- /dev/null
@@ -0,0 +1,20 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.14 load and print]
+DT[2003-01-07]
+KM[4.5]AP[GNU Go:3.3.14]RU[Japanese]
+;AW[ma][na][hb][ib][nb][ob][pb][rb][bc][gc][hc][kc][lc][mc][pc]
+[qc][sc][bd][cd][dd][ed][gd][id][jd][od][pd][sd][be][ce][fe][ge]
+[ie][je][ke][se][bf][ef][hf][kf][lf][qf][rf][ag][cg][hg][kg][lg]
+[pg][rg][bh][dh][eh][fh][ih][kh][qh][rh][ii][qi][ij][jj][kj][nj]
+[oj][qj][bk][fk][hk][ik][ok][pk][qk][dl][fl][gl][hl][ml][nl][dm]
+[em][hm][im][nm][bn][cn][en][gn][mn][nn][ao][do][oo][po][bp][cp]
+[qp][qq][rr][qs][rs]
+AB[ha][ia][ja][ka][la][ab][bb][fb][gb][jb][lb][mb][cc][dc][ec]
+[fc][ic][jc][nc][oc][rc][fd][hd][nd][qd][rd][le][me][oe][pe][qe]
+[re][af][cf][jf][nf][pf][gg][ig][jg][mg][og][ch][gh][hh][jh][lh]
+[nh][ph][sh][bi][ci][di][ei][gi][ji][ki][mi][oi][pi][fj][gj][hj]
+[mj][pj][dk][ek][gk][kk][mk][nk][cl][el][il][jl][ll][km][mm][fn]
+[in][jn][ln][fo][go][ho][mo][no][ap][dp][ep][fp][np][op][aq][bq]
+[cq][iq][lq][pq][or][pr][qr]
+PL[W]IL[ne][of][ng][mh][oh][kl])
diff --git a/regression/games/tactics08.sgf b/regression/games/tactics08.sgf
new file mode 100644 (file)
index 0000000..6ba6793
--- /dev/null
@@ -0,0 +1,12 @@
+(;GM[1]FF[4]
+SZ[19]
+GN[GNU Go 3.3.14 load and print]
+DT[2003-01-07]
+KM[4.5]AP[GNU Go:3.3.14]RU[Japanese]
+;AW[oa][cb][pb][qb][cc][qc][dd][rd][fe][re][cf][qf][rf][bj][dj]
+[ck][qk][cl][dl][el][hl][qn][fo][jo][cp][dp][ep][hp][kp][rp][dq]
+[iq][ir]
+AB[db][nb][ob][fc][ic][pc][nd][pd][ie][qe][pf][og][qg][ch][eh]
+[ph][qh][bi][ci][cj][dk][ek][fk][bm][cn][en][eo][np][pp][cq][jq]
+[qq][rq][jr][lr]
+PL[W]IL[pg])
diff --git a/regression/games/test3lose.sgf b/regression/games/test3lose.sgf
new file mode 100644 (file)
index 0000000..6a80ef5
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[9]HA[0]KM[5.5]PW[White]PB[Black]
+
+;B[ic];W[ib];B[hc];W[hb];B[gc];W[gb];B[fc];W[fb];B[fd];W[eb]
+;B[fe];W[ec];B[ge];W[fg];B[he];W[gg];B[ie];W[hf];B[ef];W[ff]
+;B[df];W[ee];B[cf];W[de];B[ce];W[dc];B[eh];W[if];B[dh];W[hg]
+;B[fi];W[tt];B[gi];W[tt];B[hi];W[tt];B[ih];W[tt];B[hh]
+)
\ No newline at end of file
diff --git a/regression/games/test3win.sgf b/regression/games/test3win.sgf
new file mode 100644 (file)
index 0000000..f6610ff
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[9]HA[0]KM[5.5]PW[White]PB[Black]
+
+;B[ic];W[ib];B[hc];W[hb];B[gc];W[gb];B[fc];W[fb];B[fd];W[eb]
+;B[fe];W[ec];B[ge];W[fg];B[he];W[gg];B[ie];W[hf];B[ef];W[ff]
+;B[df];W[ee];B[cf];W[de];B[ce];W[dc];B[eh];W[if];B[dh];W[hg]
+;B[fi];W[tt];B[gi];W[tt];B[hi];W[tt];B[ih]
+)
\ No newline at end of file
diff --git a/regression/games/test4lose.sgf b/regression/games/test4lose.sgf
new file mode 100644 (file)
index 0000000..4a1288b
--- /dev/null
@@ -0,0 +1,8 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[9]HA[0]KM[5.5]PW[White]PB[Black]
+
+;B[hd];W[hc];B[id];W[ic];B[he];W[gc];B[gf];W[gd];B[hg];W[hi]
+;B[hh];W[gi];B[ih];W[fi];B[ge];W[fh];B[gg];W[fg];B[fd];W[fe]
+;B[ed];W[fc];B[dd];W[ff];B[de];W[ec];B[df];W[dc];B[dg];W[cc]
+;B[cd];W[gh];B[di]
+)
\ No newline at end of file
diff --git a/regression/games/test4win.sgf b/regression/games/test4win.sgf
new file mode 100644 (file)
index 0000000..dd4f687
--- /dev/null
@@ -0,0 +1,9 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[9]HA[0]KM[5.5]PW[White]PB[Black]
+
+;B[hd];W[hc];B[id];W[ic];B[he];W[gc];B[gf];W[gd];B[hg];W[hi]
+;B[hh];W[gi];B[ih];W[fi];B[ge];W[fh];B[gg];W[fg];B[fd];W[fe]
+;B[ed];W[ff];B[dd];W[fc];B[cd];W[ec];B[bd];W[ee];B[cg];W[de]
+;B[dg];W[ce];B[be];W[dc];B[eg];W[ei];B[bf];W[di];B[bh];W[gh]
+;B[bi]
+)
\ No newline at end of file
diff --git a/regression/games/test5lose.sgf b/regression/games/test5lose.sgf
new file mode 100644 (file)
index 0000000..ad74f1e
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[9]HA[0]KM[5.5]PW[White]PB[Black]
+
+;B[id];W[ic];B[hd];W[hc];B[gd];W[gc];B[fe];W[fc];B[gf];W[ec]
+;B[fd];W[dc];B[hg];W[cc];B[ig];W[bc];B[ff];W[ee];B[ed];W[dd]
+;B[de];W[ef];B[gg];W[eg];B[ce];W[fh];B[bd];W[gh];B[ac];W[hh]
+;B[ab];W[ih];B[ba];W[dh];B[cg];W[tt];B[ca];W[tt];B[da];W[tt]
+;B[ea];W[tt];B[fa];W[tt];B[ga];W[tt];B[ha];W[tt];B[ch];W[ei]
+;B[dg];W[cb];B[ia]
+)
\ No newline at end of file
diff --git a/regression/games/test5win.sgf b/regression/games/test5win.sgf
new file mode 100644 (file)
index 0000000..a5b0e46
--- /dev/null
@@ -0,0 +1,10 @@
+(;GM[1]FF[4]AP[qGo:0.1]ST[1]
+SZ[9]HA[0]KM[5.5]PW[White]PB[Black]
+
+;B[id];W[ic];B[hd];W[hc];B[gd];W[gc];B[fe];W[fc];B[gf];W[ec]
+;B[fd];W[dc];B[hg];W[cc];B[ig];W[bc];B[ff];W[ee];B[ed];W[dd]
+;B[de];W[ef];B[gg];W[eg];B[ce];W[fh];B[bd];W[gh];B[ac];W[hh]
+;B[ab];W[ih];B[ba];W[dh];B[cg];W[tt];B[ca];W[tt];B[da];W[tt]
+;B[ea];W[tt];B[fa];W[tt];B[ga];W[tt];B[ha];W[tt];B[ch];W[ei]
+;B[dg]
+)
\ No newline at end of file
diff --git a/regression/games/tg-gg.sgf b/regression/games/tg-gg.sgf
new file mode 100644 (file)
index 0000000..2473a50
--- /dev/null
@@ -0,0 +1,49 @@
+(;\r
+GM[1]FF[4]VW[]AP[Many Faces of Go:10.0]\r
+SZ[19]\r
+HA[0]\r
+ST[0]\r
+PB[Gnu Go]\r
+PW[TurboGo v5.01]\r
+DT[August 1, 2001]\r
+PC[Dublin]\r
+KM[6.5]\r
+TM[1 hour]\r
+RU[Chinese]\r
+RE[B+206.5]\r
+EV[European Computer Go Championships 2001]\r
+\r
+C[Fichier SGF créé par TurboGo pour Windows v5.0\r
+];B[dp];W[qc];B[pp];W[ec];B[cc];W[ce];B[pd];W[qd]\r
+;B[pe];W[ob];B[md];W[nd];B[qe];W[oc];B[ne];W[oe];B[nf];W[od]\r
+;B[qh];W[pm];B[of];W[jp];B[np];W[qp];B[qq];W[po];B[oq];W[qo]\r
+;B[cg];W[cn];B[cj];W[hq];B[dn];W[ic];B[co];W[eq];B[cm];W[qk]\r
+;B[be];W[lc];B[cf];W[mc];B[dq];W[db];B[er];W[cb];B[de];W[pc]\r
+;B[lq];W[re];B[rf];W[pf];B[qf];W[pg];B[oh];W[oj];B[ph];W[bb]\r
+;B[rd];W[rc];B[se];W[bc];B[cd];W[rq];B[rr];W[mi];B[rp];W[ro]\r
+;B[sq];W[gd];B[fo];W[ho];B[jr];W[kq];B[lg];W[kr];B[hr];W[gp]\r
+;B[mn];W[kn];B[lm];W[lo];B[fm];W[iq];B[gr];W[ir];B[lr];W[js]\r
+;B[mk];W[nj];B[ff];W[hf];B[rj];W[rk];B[jf];W[ih];B[jl];W[kj]\r
+;B[qj];W[pj];B[gh];W[hg];B[on];W[oo];B[sc];W[sb];B[le];W[kd]\r
+;B[sd];W[rb];B[gj];W[ij];B[fp];W[bn];B[fe];W[fd];B[no];W[pn]\r
+;B[hl];W[hk];B[ik];W[jk];B[gk];W[il];B[hm];W[in];B[im];W[ik]\r
+;B[km];W[jn];B[jm];W[lk];B[nk];W[om];B[nm];W[ok];B[mj];W[li]\r
+;B[ni];W[mh];B[sk];W[sl];B[sj];W[ie];B[ol];W[pl];B[rl];W[ql]\r
+;B[sm];W[nl];B[ml];W[rm];B[sl];W[kh];B[rn];W[so];B[qm];W[ol]\r
+;B[hi];W[nn];B[mm];W[on];B[mo];W[bm];B[cl];W[bl];B[ii];W[jh]\r
+;B[ji];W[bo];B[bp];W[ap];B[bk];W[al];B[bq];W[an];B[lj];W[ki]\r
+;B[lp];W[ge];B[ko];W[ln];B[kp];W[jo];B[bd];W[dd];B[je];W[jd]\r
+;B[mg];W[ke];B[kf];W[ee];B[ef];W[ed];B[ac];W[ab];B[ad];W[gn]\r
+;B[hn];W[kl];B[go];W[gg];B[fg];W[ld];B[me];W[sp];B[rq];W[qn]\r
+;B[gq];W[rm];B[sn];W[qm];B[hp];W[io];B[nh];W[ip];B[gp];W[jq]\r
+;B[kg];W[op];B[if];W[pq];B[pr];W[pp];B[gf];W[or];B[nq];W[nr]\r
+;B[qs];W[ao];B[hh];W[jj];B[ig];W[he];B[dc];W[kk];B[tt];W[pi]\r
+;B[qi];W[aq];B[br];W[ar];B[tt];W[mr];B[tt];W[ls];B[tt];W[mq]\r
+;B[mp];W[hs];B[tt];W[as];B[tt];W[gs];B[tt];W[fs];B[tt];W[fr]\r
+;B[dr];W[fq];B[tt];W[ep];B[os];W[eo];B[fn];W[ms];B[tt];W[en]\r
+;B[do];W[em];B[tt];W[ll];B[fl];W[dl];B[tt];W[dm];B[ck];W[ek]\r
+;B[tt];W[ei];B[fi];W[ej];B[tt];W[dh];B[bh];W[ci];B[bi];W[dg]\r
+;B[df];W[dj];B[tt];W[dk];B[tt];W[ak];B[bj];W[ch];B[eh];W[es]\r
+;B[bs];W[ds];B[tt];W[cs];B[tt];W[cr];B[aj];W[cq];B[am];W[cp]\r
+;B[tt];W[fk];B[tt];W[el];B[tt];W[fj];B[tt];W[di];B[tt];W[is]\r
+;B[tt];W[eg];B[fh];W[ks];B[tt];W[kb];B[tt];W[tt])\r
diff --git a/regression/games/tiny/2x2.sgf b/regression/games/tiny/2x2.sgf
new file mode 100644 (file)
index 0000000..3141ed2
--- /dev/null
@@ -0,0 +1,3 @@
+(;GM[1]FF[4]SZ[2]
+;B[ab];W[aa];B[ba]
+)
diff --git a/regression/games/tiny/3x3a.sgf b/regression/games/tiny/3x3a.sgf
new file mode 100644 (file)
index 0000000..5c59c04
--- /dev/null
@@ -0,0 +1,3 @@
+(;GM[1]FF[4]SZ[3]
+;B[bb];W[ab];B[ba];W[bc];B[cb]
+)
diff --git a/regression/games/tiny/3x3b.sgf b/regression/games/tiny/3x3b.sgf
new file mode 100644 (file)
index 0000000..3de9c9d
--- /dev/null
@@ -0,0 +1,3 @@
+(;GM[1]FF[4]SZ[3]
+;B[ab];W[bb];B[ba];W[bc];B[cb]
+)
diff --git a/regression/games/tiny/4x4a.sgf b/regression/games/tiny/4x4a.sgf
new file mode 100644 (file)
index 0000000..48f3134
--- /dev/null
@@ -0,0 +1,4 @@
+(;GM[1]FF[3]
+SZ[4];B[cb];W[bc];B[cc];W[bb];B[ba];W[cd];B[ab];W[bd];B[ac];W[dc];
+B[da]
+)
diff --git a/regression/games/trevor/auto/a001.sgf b/regression/games/trevor/auto/a001.sgf
new file mode 100644 (file)
index 0000000..c1fa02e
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ef];W[ed];B[fd];W[fe];B[ee];W[ge];B[ec]C[#must not give up ponuki, no matter what!
+D6];W[gg];B[dd];W[hc];B[eh]
+;W[fb];B[eb];W[gc];B[gh];W[hh];B[fg];W[hg];B[fc];W[gi];B[gb];W[fh];B[hb];W[ei]
+;B[dh];W[ib];B[di];W[ff];B[gd];W[hd];B[he];W[ie];B[gf];W[hf];B[ge];W[fi];B[ha]
+;W[ic];B[fa];W[id];B[ia];W[if];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a003.sgf b/regression/games/trevor/auto/a003.sgf
new file mode 100644 (file)
index 0000000..bc3a628
--- /dev/null
@@ -0,0 +1,4 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[ce];B[gg];W[gc];B[dg];W[dc];B[bf];W[be];B[cf];W[he];B[hf]
+;W[gf];B[ge];W[if];B[ff];W[hd];B[ig];W[fc];B[bd]C[!A6];W[ad];B[cd];W[de];B[dd];W[bc]
+;B[cc];W[cb];B[ed]C[E7|D8|E8];W[bb];B[ec];W[db];B[eb];W[hb];B[fb];W[ic];B[ie];W[gb];B[ga]
+;W[ha];B[fa];W[fd];B[fe];W[id];B[if];W[gd];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a004.sgf b/regression/games/trevor/auto/a004.sgf
new file mode 100644 (file)
index 0000000..61e68f8
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[ce];B[dc];W[ge];B[gc];W[gh];B[eg];W[ef];B[df]C[#Best not to give up this ponuki.
+F4];W[bc];B[ff]
+;W[gf];B[cf];W[cb];B[be];W[db];B[hd];W[eh];B[dh];W[fh];B[cc];W[eb];B[bd];W[bb]
+;B[ig];W[ec];B[hb];W[ac];B[fd];W[ed];B[ei];W[dd];B[fe];W[cd];B[he];W[fb];B[gb]
+;W[ad];B[bf];W[ae];B[af];W[ga];B[ha];W[fa];B[fc];W[de];B[tt];W[tt])
+
diff --git a/regression/games/trevor/auto/a005.sgf b/regression/games/trevor/auto/a005.sgf
new file mode 100644 (file)
index 0000000..320893a
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[dd];W[ee];B[fc];W[cf];B[fg];W[ge];B[fe];W[ff];B[fd];W[gg];B[ef]C[#Must connect.
+G4]
+;W[df];B[gf];W[hf];B[be];W[ff];B[eg];W[dh];B[hd];W[gf];B[gh];W[bf];B[cd];W[de]
+;B[hh];W[bh];B[if];W[eh];B[fh];W[ae];B[ad];W[af];B[dg];W[cg];B[ei];W[di];B[ce]
+;W[fi];B[ed];W[gi];B[hi];W[ei];B[gd];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a006.sgf b/regression/games/trevor/auto/a006.sgf
new file mode 100644 (file)
index 0000000..ea80c0d
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[dg];W[dd];B[gf];W[gd];B[ce];W[cd];B[he];W[hd];B[ee];W[be];B[fc]C[F6
+#Must stay connected.]
+;W[eb];B[ec];W[dc];B[fd];W[gc];B[fb];W[cf];B[db];W[cb];B[ea];W[bh];B[ch];W[cg]
+;B[dh];W[bi];B[gb];W[ci];B[ca];W[di];B[bb];W[cc];B[gh];W[eh];B[eg];W[fh];B[fg]
+;W[de];B[fi];W[ei];B[gi];W[df];B[hb];W[bc];B[ef];W[ab];B[ba];W[ed];B[da];W[ac]
+;B[aa];W[tt];B[tt])
+
diff --git a/regression/games/trevor/auto/a007.sgf b/regression/games/trevor/auto/a007.sgf
new file mode 100644 (file)
index 0000000..1d907f1
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[fg];W[fd];B[cg];W[cd];B[ge];W[gd];B[de];W[bf];B[bg]C[!H5
+#D6 connection is huge.];W[he];B[dd]
+;W[cc];B[dc];W[hf];B[be];W[bd];B[ce];W[db];B[eb];W[bb];B[fc];W[hb];B[da];W[ac]C[B9
+#B9 kills.]
+;B[cb];W[ba];B[ae];W[ad];B[gc];W[hc];B[gf];W[hh];B[gh];W[gb];B[hg];W[ig];B[hi]
+;W[ih];B[gg];W[fb];B[ec];W[ca];B[db];W[fe];B[ff];W[ee];B[ef];W[fa];B[ed];W[hd]
+;B[ea];W[if];B[gi];W[ii];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a008.sgf b/regression/games/trevor/auto/a008.sgf
new file mode 100644 (file)
index 0000000..204e72d
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[gg];B[gd];W[dg];B[cd];W[cf];B[be];W[bf];B[hf]C[!F3
+#Quite passive.];W[fg];B[hg]
+;W[hh];B[ih];W[hi];B[af];W[ag];B[ae];W[bg];B[de];W[ce];B[bd];W[gf];B[ge];W[ig]
+;B[if];W[ef];B[ig];W[fe];B[fd];W[ff];B[df];W[dd];B[ed];W[gh];B[he];W[ii];B[tt]
+;W[tt])
diff --git a/regression/games/trevor/auto/a009.sgf b/regression/games/trevor/auto/a009.sgf
new file mode 100644 (file)
index 0000000..d79d19f
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[fg];W[fe];B[df];W[de];B[ce]C[D6|E4|C4
+#Some defense of D5 is required.];W[gf];B[dd]C[E5
+#Can't give up ponuki.];W[fc];B[ee];W[hh]
+;B[gh];W[gg];B[eb];W[fh];B[eh];W[fb];B[fi];W[ec];B[db];W[dc];B[cc];W[ea];B[cb]
+;W[hi];B[ed];W[gi];B[fd];W[gd];B[gc];W[gb];B[ff];W[ge];B[fa];W[ga];B[da];W[fh]
+;B[fa];W[ei];B[hc];W[eg];B[dh];W[di];B[hb];W[ch];B[dg];W[bf];B[be];W[ef];B[bg]
+;W[bh];B[cg];W[ag];B[ae];W[hd];B[ah];W[ai];B[af];W[ci];B[ah];W[ic];B[bi];W[fi]
+;B[ha];W[ai];B[ag]C[J8
+#Full point before ko!];W[bi];B[ib];W[id];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a010.sgf b/regression/games/trevor/auto/a010.sgf
new file mode 100644 (file)
index 0000000..78d4ca1
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[fd];W[df];B[de];W[ee];B[gf];W[ce];B[dd];W[ed];B[cd]C[!B6
+#B6 is an overplay.  E7 may be best.];W[bd];B[cf]
+;W[be];B[ef];W[dg];B[ec];W[eg];B[fe];W[gh];B[bc];W[cc];B[bb];W[cg];B[hg];W[hh]
+;B[ad];W[bf];B[fg];W[fh];B[gg];W[ac];B[ab];W[ig];B[if];W[ih];B[dc];W[ae];B[ac]
+;W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a011.sgf b/regression/games/trevor/auto/a011.sgf
new file mode 100644 (file)
index 0000000..d1c8ef2
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[dd];W[fd];B[ef];W[ec];B[gf];W[he];B[ge];W[gd];B[cf];W[hf];B[dc]
+;W[gg];B[fg]C[G2
+#F2 is bad overplay.];W[fh];B[gh];W[hg];B[eh];W[db];B[cb];W[eb];B[hh];W[ca];B[bb];W[ih]
+;B[ba];W[fe];B[ff];W[da];B[ee];W[hi];B[fi];W[ig];B[gi];W[ii];B[ed];W[gb];B[tt]
+;W[tt])
diff --git a/regression/games/trevor/auto/a013.sgf b/regression/games/trevor/auto/a013.sgf
new file mode 100644 (file)
index 0000000..2378245
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[gc];W[dg];B[fe];W[ce];B[fg];W[eh];B[dc];W[gh];B[bd];W[hf];B[de]
+;W[be];B[he];W[gf];B[cd];W[ff];B[ae];W[bf];B[df]C[C3
+#Locally, C3 is much better than B3.];W[bg];B[if];W[ig];B[ie];W[ef]
+;B[hg];W[gg];B[hh];W[hi];B[ih];W[af];B[ad];W[cf];B[ee];W[ge];B[gd];W[gi];B[ig]
+;W[ii];B[hd];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a014.sgf b/regression/games/trevor/auto/a014.sgf
new file mode 100644 (file)
index 0000000..138d2b9
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ed];W[fe];B[gc];W[fg];B[cd];W[cf];B[be];W[hd];B[gd];W[ge];B[bg]
+;W[cg];B[hc];W[he];B[ch]C[B4
+#Punish black's overplay.];W[dh];B[bh];W[ic];B[di];W[eh];B[ib];W[bf];B[af];W[id]
+;B[hb];W[ei];B[ee];W[ef];B[ci];W[ce];B[ae];W[de];B[dd];W[fd];B[fc];W[tt];B[tt]
+)
diff --git a/regression/games/trevor/auto/a015.sgf b/regression/games/trevor/auto/a015.sgf
new file mode 100644 (file)
index 0000000..3cd7b18
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[cg];W[gc];B[fd];W[cc];B[fg];W[fc];B[gd];W[be];B[ec];W[eb];B[de]
+;W[ed];B[ee];W[dd];B[bf];W[ce];B[hc];W[hb];B[hd]C[C4
+#This double threat is probably bigger.
+#Also, don't hane if you don't plan to defend -there's some big problem here in the valuations.  The connection should be worth more than the original hane.];W[af];B[ag];W[ib];B[ae];W[bd]
+;B[cf];W[ad];B[ic];W[af];B[fb];W[gb];B[ae];W[tt];B[af];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a016.sgf b/regression/games/trevor/auto/a016.sgf
new file mode 100644 (file)
index 0000000..95e7e7d
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[dd];W[cf];B[gd];W[fg];B[be];W[bf];B[hf];W[ce];B[gh];W[fh];B[cd]
+;W[ae];B[bd];W[gg];B[hh];W[fe];B[fd]C[!E4
+#Locally, E5 better than E4.];W[ef];B[fi];W[ei];B[gi];W[eh];B[hg];W[ed]
+;B[ec];W[ee];B[de];W[ad];B[ac];W[af];B[df];W[dg];B[bc];W[ge];B[he];W[gf];B[tt]
+;W[tt])
diff --git a/regression/games/trevor/auto/a017.sgf b/regression/games/trevor/auto/a017.sgf
new file mode 100644 (file)
index 0000000..99ed526
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[ec];B[gd];W[cd];B[cf];W[gg];B[eg];W[he];B[ge];W[gf];B[hd]
+;W[fh];B[hf];W[hg];B[ie];W[gi];B[eh];W[hh];B[fb]C[!C8];W[cb];B[be];W[bd];B[eb];W[fc]
+;B[gc];W[db];B[ad];W[ac];B[ae]C[B8
+#B8 makes better eye space, at least one point better here, in reverse sente.];W[bc];B[dd];W[gb];B[hb]C[D7
+#E1 is not big enough sente.  D7 threatens whole white group.];W[ei];B[dc];W[ba]
+;B[dh];W[ea];B[ga];W[di];B[ci];W[fi];B[ch];W[ce];B[bf];W[de];B[df];W[ff];B[ef]
+;W[da];B[fe];W[ig];B[if];W[cc];B[ed]C[F9
+#Full point here!];W[fg];B[fa];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a018.sgf b/regression/games/trevor/auto/a018.sgf
new file mode 100644 (file)
index 0000000..187d163
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[cc];B[gg];W[gd];B[dg];W[fc];B[ce];W[bd];B[be];W[hf];B[gf]
+;W[hg];B[hh]C[G5|H5
+#Must defend H4 group.];W[dc];B[he];W[hd];B[ie]C[!J6
+#In this shape, G5 is best, not J6.];W[id];B[ge];W[ae];B[af];W[ad];B[bg]
+;W[ed];B[cd];W[bc];B[dd];W[fe];B[ff];W[fd];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a019.sgf b/regression/games/trevor/auto/a019.sgf
new file mode 100644 (file)
index 0000000..6c08dc1
--- /dev/null
@@ -0,0 +1,4 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[cc];W[gc];B[df];W[fg];B[eh]C[!H3
+#H3 is terrible.];W[hg];B[ed];W[fe];B[eb];W[fb];B[fc]
+;W[gb];B[fh];W[gh];B[fd];W[gd];B[fa];W[ga];B[ea];W[ee];B[de];W[eg];B[dg];W[fi]
+;B[dh];W[ef];B[ei];W[gi];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a021.sgf b/regression/games/trevor/auto/a021.sgf
new file mode 100644 (file)
index 0000000..069a4ce
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[cd];W[ee];B[ec];W[ce];B[cg];W[bf];B[fg];W[dd];B[fe];W[cc];B[db]
+;W[bh];B[ch];W[cb];B[bi]C[#Break through important
+F6];W[da];B[ea];W[bg];B[ca];W[bd];B[ef];W[df];B[dg];W[ed]
+;B[fd];W[cf];B[ba];W[bb];B[ah];W[ab];B[ai];W[ag];B[ci];W[dc];B[fc];W[aa];B[da]
+;W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a022.sgf b/regression/games/trevor/auto/a022.sgf
new file mode 100644 (file)
index 0000000..90eedba
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[gf];W[cc];B[cf];W[ef];B[eg];W[fc];B[fg];W[gd];B[df];W[he];B[hf]
+;W[be];B[bf];W[ee];B[cd];W[bc];B[bd];W[ad];B[dd];W[af];B[dc];W[db];B[eb];W[ca]
+;B[bg];W[ec];B[ge];W[hd];B[ed];W[if];B[ig];W[ie];B[hh];W[ag];B[ah];W[ae];B[bh]
+;W[ce];B[de];W[ac];B[fd]C[G8|G7];W[fb];B[gc];W[hc];B[gb];W[fa];B[hb];W[ga];B[ib];W[ha]
+;B[ic];W[ea];B[id];W[ia];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a023.sgf b/regression/games/trevor/auto/a023.sgf
new file mode 100644 (file)
index 0000000..9d8dbc3
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[df];W[gc];B[ff];W[dc];B[ce];W[hf];B[gg];W[bd];B[cd];W[be];B[cc]
+;W[cg];B[db];W[eh];B[bc];W[cf];B[hg];W[ge];B[fh];W[ig];B[dh];W[ch];B[di];W[ci]
+;B[eg];W[hh];B[ad];W[af];B[gh];W[dd];B[eb];W[fb];B[ec];W[fe];B[fc];W[gb];B[ee]
+;W[ih];B[fd];W[dg];B[ei];W[ea];B[gd];W[hd];B[hi];W[gf];B[da];W[fa];B[ac]C[A2
+#A3 just looses points.];W[ag]
+;B[ae];W[bh];B[bf];W[ai];B[be];W[bg];B[gi];W[ie];B[ii];W[if];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a024.sgf b/regression/games/trevor/auto/a024.sgf
new file mode 100644 (file)
index 0000000..55f1551
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[cc];W[cg];B[fc];W[fg];B[ge];W[hf];B[gf];W[he];B[gg];W[hg];B[gh]C[!E2
+#Must defend H5 worm.  G6 prob. best.]
+;W[eh];B[dd];W[be];B[ce];W[bd];B[bc];W[cd];B[cf];W[bf];B[ee];W[df];B[hd];W[de]
+;B[dc];W[ac];B[ab];W[ad];B[bb];W[ef];B[ff];W[fh];B[hh];W[gi];B[hi];W[fi];B[tt]
+;W[tt])
diff --git a/regression/games/trevor/auto/a025.sgf b/regression/games/trevor/auto/a025.sgf
new file mode 100644 (file)
index 0000000..074230f
--- /dev/null
@@ -0,0 +1,4 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[fg];B[dg];W[ge];B[gd];W[hd];B[gc];W[eh];B[hc];W[he];B[dh]C[#Last chance to invade.
+!(J7|D1)]
+;W[ic];B[eg];W[fh];B[ib];W[id];B[gb];W[di];B[ci];W[ei];B[bh];W[ff];B[ef];W[fe]
+;B[fd];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a026.sgf b/regression/games/trevor/auto/a026.sgf
new file mode 100644 (file)
index 0000000..b531cc0
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[ff];B[gc];W[dg];B[cc];W[ge];B[hd];W[he];B[be];W[fd];B[fc]
+;W[bg];B[ed];W[id];B[ic]C[J6
+#Once you've haned, you've gotta connect.  (Or you shouldn't have haned.];W[ef];B[ie];W[hf];B[bf];W[if];B[ag];W[bh];B[cf];W[ah]
+;B[cg];W[ch];B[af];W[df];B[de];W[id];B[gd];W[fe];B[ie];W[tt];B[id];W[tt];B[tt]
+)
diff --git a/regression/games/trevor/auto/a027.sgf b/regression/games/trevor/auto/a027.sgf
new file mode 100644 (file)
index 0000000..ce35487
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[cg];W[cd];B[fd];W[fg];B[dc];W[ge];B[cc];W[hc];B[bd];W[dh];B[ce]
+;W[fb];B[eb];W[ee];B[gb];W[ch];B[hb];W[bg];B[bf];W[ib];B[bh];W[bi];B[ag];W[dd]
+;B[dg];W[eg];B[gd];W[hd];B[ci];W[di];B[ai];W[ed];B[ec];W[gc];B[fc];W[df];B[ci]
+;W[eh];B[fe]C[G4];W[he];B[ff];W[ef];B[gf];W[hf];B[gg];W[gh];B[hg];W[hh];B[if];W[cf]
+;B[bg];W[ih];B[ig];W[bi];B[ah];W[ci];B[be];W[de];B[fi];W[fh];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/a029.sgf b/regression/games/trevor/auto/a029.sgf
new file mode 100644 (file)
index 0000000..6c566be
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ff];W[cc];B[dg];W[fc];B[ge];W[hd];B[gd];W[he];B[gc];W[gg];B[fb]
+;W[ec];B[fg]C[G2|G4
+#Must defend G3 group.];W[bd];B[hf];W[eb];B[gb];W[de];B[bf];W[cf];B[cg];W[be];B[bg];W[fa]
+;B[hg];W[ga];B[ha];W[ea];B[hb];W[af];B[df];W[ce];B[ee];W[ag];B[ah];W[ae];B[bh]
+;W[ed];B[fd];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a030.sgf b/regression/games/trevor/auto/a030.sgf
new file mode 100644 (file)
index 0000000..85f24da
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[cc];B[dd];W[cd];B[ce];W[be];B[eb];W[cf];B[gf];W[ch];B[eh]
+;W[db];B[dc];W[cb];B[gc];W[ea];B[de];W[fb];B[gb];W[ga];B[ec]C[H8
+#B4, B6 too passive. H8 prob. best.];W[bf];B[fc];W[fa]
+;B[ha];W[da];B[hb];W[dh];B[eg];W[ei];B[fi];W[di];B[gh];W[dg];B[df];W[tt];B[tt]
+)
diff --git a/regression/games/trevor/auto/a031.sgf b/regression/games/trevor/auto/a031.sgf
new file mode 100644 (file)
index 0000000..3ecef4c
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[df];W[fd];B[gc];W[fc];B[gd];W[cd];B[be];W[ge];B[he];W[gf];B[hf]
+;W[bd];B[bg];W[eg];B[dh];W[hg];B[id];W[gb];B[hb];W[hc];B[hd];W[ha];B[ic];W[fb]
+;B[if];W[ib];B[ia]C[!E2
+#For a ko threat, D3 is better.];W[eh];B[ga];W[ch];B[dg];W[di];B[ig];W[ce];B[gg];W[fg];B[gh]
+;W[af];B[ff]C[E4
+#Sacrificing these two for the rest seems best.];W[fe];B[ef];W[bf];B[bh];W[fa];B[cf];W[ha];B[ag];W[ae];B[ib];W[ga]
+;B[ee];W[ed];B[bi];W[de];B[cg];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a033.sgf b/regression/games/trevor/auto/a033.sgf
new file mode 100644 (file)
index 0000000..1aca90d
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[gc];W[dg];B[cc];W[gf];B[cg];W[cf];B[bg];W[eg];B[bf];W[hd];B[df]
+;W[fd];B[fc];W[hc];B[ef];W[ch];B[fg];W[fh];B[ff];W[gg];B[ed];W[gb];B[fb];W[hb]
+;B[bh]C[!G2
+#Locally, D2 is much better than G2.];W[gh];B[dh];W[eh];B[ci];W[fa];B[ea];W[ga];B[db];W[gd];B[fe];W[ge];B[ei]
+;W[fi];B[di];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a034.sgf b/regression/games/trevor/auto/a034.sgf
new file mode 100644 (file)
index 0000000..8d20e78
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[cd];W[fd];B[dg];W[fg];B[ec];W[fc];B[eh];W[fh];B[ee];W[eb];B[gf]C[F4
+#Must connect groups.]
+;W[he];B[ge];W[gd];B[ff];W[gg];B[hf];W[hd];B[cf];W[dc];B[hg];W[bb];B[bc];W[cc]
+;B[bd];W[ab];B[ed];W[ac];B[ad];W[dd];B[de];W[if];B[ig];W[ie];B[fe];W[db];B[tt]
+;W[tt])
diff --git a/regression/games/trevor/auto/a035.sgf b/regression/games/trevor/auto/a035.sgf
new file mode 100644 (file)
index 0000000..abd230f
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[fc];W[ff];B[ge];W[gf];B[cd];W[dg];B[bf];W[ed];B[ec];W[he];B[dd]
+;W[hd];B[ch];W[dh];B[gd];W[hb];B[hc];W[gb];B[gc];W[ic];B[fb];W[cg];B[bh];W[bg]
+;B[ag];W[ee];B[ga]C[#important tesuji
+B5];W[ci];B[cf];W[ib];B[df];W[ef];B[ha];W[bi];B[ah];W[de];B[ce]
+;W[fd];B[af];W[di];B[hg]C[#Have to try.
+H4];W[gg];B[hf];W[hh];B[if];W[ih];B[ie];W[ig];B[id]C[!A1]
+;W[ai]C[owl_attack D3
+1 F2
+];B[fh];W[gh];B[eg];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a036.sgf b/regression/games/trevor/auto/a036.sgf
new file mode 100644 (file)
index 0000000..1c27524
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[ec];B[gd];W[de];B[cg]C[!B4
+#D4 is huge.  Other moves possible.];W[bf];B[cf];W[ce];B[bg]C[!B5
+#Breaking into black's area is required.];W[be]
+;B[gg];W[df];B[dg];W[gc];B[hc];W[gb];B[ef];W[hb];B[hd];W[ag];B[ah];W[af];B[bh]
+;W[fd];B[fe]C[E6
+#E6 is bigger, and enough to win.];W[ic];B[ed];W[dd];B[fc];W[fb];B[dc];W[cc];B[eb];W[cb];B[ea];W[db]C[E7
+#Any other move E7 is terrible.]
+;B[fa];W[ec];B[id];W[dc];B[ib];W[ha];B[fd];W[da];B[ic];W[ga];B[ia];W[tt];B[tt]
+)
diff --git a/regression/games/trevor/auto/a037.sgf b/regression/games/trevor/auto/a037.sgf
new file mode 100644 (file)
index 0000000..a9a6de0
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[df];W[cd];B[gf];W[fc];B[be];W[bd];B[hd];W[ce];B[gb];W[fb];B[cf]C[!A5
+#B4 almost always better in this shape.]
+;W[ae];B[bf];W[gc];B[hb];W[fe];B[ff];W[ed];B[fa];W[ea];B[ga];W[eb];B[hc];W[ef]
+;B[eg];W[ee];B[de];W[af];B[ag];W[ad];B[dd];W[dc];B[bg];W[ge];B[he];W[gd];B[tt]
+;W[tt])
+
diff --git a/regression/games/trevor/auto/a038.sgf b/regression/games/trevor/auto/a038.sgf
new file mode 100644 (file)
index 0000000..4e07372
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[gg];W[cc];B[cg];W[gc];B[be];W[ed];B[he];W[ef];B[eh];W[hd];B[ge]
+;W[bd];B[de];W[ff];B[cd];W[bc];B[gd];W[fd];B[hc];W[hb];B[id];W[ib];B[ic];W[gb]
+;B[dd];W[dc];B[ad];W[ac];B[ae];W[df];B[cf];W[gf];B[hf]C[D2|F2
+#Enough to win.];W[dg];B[dh];W[fg];B[fh]
+;W[fe];B[eg];W[ee];B[ce];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/a039.sgf b/regression/games/trevor/auto/a039.sgf
new file mode 100644 (file)
index 0000000..cebf61c
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[gg];W[dd];B[fc];W[gd];B[gc];W[fd];B[dg];W[ec];B[eb];W[db];B[fb]C[H6
+#Kill black corner first.]
+;W[cf];B[cg];W[hf];B[df];W[bf];B[bg]C[H6
+#H7 is just terrible.];W[hc];B[hb];W[hd];B[ib];W[hg];B[af];W[gh]
+;B[ce];W[cd];B[be];W[bd];B[ad];W[fg];B[da];W[eh];B[cb];W[dc];B[bc];W[bi];B[bh]
+;W[ci];B[ee];W[ed];B[dh];W[di];B[fe];W[ge];B[ic];W[ah];B[id];W[ie];B[ff]C[G4
+#G4 is much bigger.];W[eg]
+;B[gf];W[ai];B[de];W[ag];B[cc];W[he];B[fi];W[ei];B[ef];W[hh];B[ch];W[fh];B[tt]
+;W[tt])
diff --git a/regression/games/trevor/auto/a041.sgf b/regression/games/trevor/auto/a041.sgf
new file mode 100644 (file)
index 0000000..92ad134
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[9]HA[0]KM[5.5];B[ee];W[de];B[ef];W[ed];B[cg];W[gg];B[dd];W[dc];B[cd];W[fd];B[cc]C[!C8
+#C8 is an overplay.]
+;W[cb];B[db];W[eh];B[ec];W[fc];B[fb];W[fe];B[eg];W[dh];B[ch];W[gb];B[ga];W[ha]
+;B[fa];W[hb];B[fh];W[fg];B[gh];W[hh];B[di];W[ei];B[ci];W[gi];B[dg];W[fi];B[ff]
+;W[gf];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b01.sgf b/regression/games/trevor/auto/b01.sgf
new file mode 100644 (file)
index 0000000..57af5f8
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kd];W[ic];B[jf];W[fc];B[kk];W[cc];B[dk];W[ci];B[cg];W[ei];B[fj]
+;W[bk];B[eg];W[jj];B[jk];W[fi];B[ij];W[kc];B[ji];W[ld];B[gh];W[cl];B[dl];W[bh]
+;B[fg];W[le];B[lg];W[be];B[gi];W[ge];B[dd];W[dc];B[hf];W[ed];B[bg];W[de];B[jd]
+;W[jc];B[ck];W[bl];B[di];W[dh];B[dj];W[ch];B[dg];W[eh];B[cm]C[B1];W[id];B[bm];W[je]
+;B[bj];W[kf];B[kg];W[if];B[ig]C[K7];W[ie];B[jg];W[gf];B[hg];W[lf];B[mf];W[he];B[df]
+;W[me];B[ee];W[cd];B[mg];W[fe];B[ff];W[cf];B[bf];W[ce];B[ae];W[ad];B[af];W[ef]
+;B[ac];W[bd];B[ee];W[gg];B[fh];W[ef];B[tt];W[ee];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b02.sgf b/regression/games/trevor/auto/b02.sgf
new file mode 100644 (file)
index 0000000..7872c3c
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[dj];B[dd];W[kd];B[id];W[ic];B[hc];W[jc];B[hd];W[kf];B[fj]
+;W[cf];B[be];W[dh];B[dk];W[ck];B[ek];W[cl];B[bf];W[ef];B[fd];W[bg];B[ag];W[bh]
+;B[hk];W[kk];B[kj];W[jk];B[ik];W[il];B[lk];W[ll];B[lj];W[hl];B[gl];W[gk];B[gj]
+;W[gm];B[fk];W[fl];B[em]C[N2];W[el];B[dl];W[gk];B[ml]C[!J4];W[ij];B[gl]C[!H4];W[hj];B[gk]
+;W[lh];B[hh];W[gi];B[hi];W[if];B[jl];W[ce];B[cd];W[af];B[ae];W[bd];B[bc];W[gf]
+;B[kh];W[ki];B[kg];W[lg];B[jg];W[fh];B[cm];W[jf];B[ig];W[hg];B[li];W[gh];B[ih]
+;W[ah];B[mh];W[mf];B[ib];W[jb];B[hb];W[ia];B[bm];W[bl];B[al];W[bk];B[am];W[ak]
+;B[dm];W[cj];B[je];W[jd];B[ie];W[ha];B[ga];W[ja];B[gb];W[ke];B[fi];W[ei];B[ge]
+;W[hf];B[de];W[ee];B[fe];W[ed];B[ec];W[df];B[db];W[ff];B[he];W[mg];B[mi];W[af]
+;B[ad];W[ag];B[fm];W[ej];B[tt];W[el];B[kl];W[tt];B[tt])
\ No newline at end of file
diff --git a/regression/games/trevor/auto/b08.sgf b/regression/games/trevor/auto/b08.sgf
new file mode 100644 (file)
index 0000000..1892aa9
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[dd];B[dk];W[jc];B[ke];W[kg];B[ie];W[hd];B[ig];W[ld];B[kd]
+;W[le];B[kc];W[lc];B[lb]C[!N12];W[mb];B[jb];W[la];B[kb];W[ci];B[ki];W[lh];B[li];W[kf]
+;B[cg];W[dh];B[bh];W[bi];B[df];W[bk];B[jh]C[owl_attack N9
+1 ..*];W[fd];B[mh];W[mg];B[mi];W[mf];B[ce]
+;W[cd];B[bd];W[bc];B[gk];W[dl];B[ek];W[be];B[cl];W[bf];B[hb];W[bg];B[ff];W[fb]
+;B[eg];W[cf];B[ei];W[eh];B[fh];W[dg];B[id];W[bl];B[dm];W[de];B[ef];W[he];B[gg]
+;W[hc];B[ic];W[gb];B[ha];W[ge];B[bm];W[ck];B[el];W[di];B[dj];W[cj];B[ka];W[kh]
+;B[ga];W[fa];B[al];W[ee];B[am];W[ak];B[cm];W[jf];B[if];W[gf];B[fi];W[hf];B[hg]
+;W[je];B[jd];W[fe];B[fg]C[N11];W[jg];B[ma];W[mc];B[la];W[ji];B[ih];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b09.sgf b/regression/games/trevor/auto/b09.sgf
new file mode 100644 (file)
index 0000000..e10bc10
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[jd];B[jj];W[dd];B[hd];W[jf];B[jc];W[kc];B[ic]C[L12];W[hk];B[kb]
+;W[kk];B[kd];W[ii];B[df];W[kj];B[ce];W[ke];B[lc];W[cd];B[le];W[lf];B[ei];W[fc]
+;B[mf];W[mg];B[fk];W[gl];B[fl];W[hb];B[fg];W[hg];B[ib];W[gi];B[gb];W[fb];B[ha]
+;W[fe];B[fa];W[eb];B[me];W[lg];B[gk];W[hl];B[bd];W[bc];B[be];W[fm];B[em];W[gm]
+;B[ac];W[bb];B[dl];W[ea];B[gf];W[ga];B[hc];W[ef];B[eg];W[de];B[cf];W[fh];B[fi]
+;W[gh];B[hf];W[eh];B[dh];W[gj];B[if];W[ig];B[ie];W[je];B[ab];W[ff];B[gg];W[fj]
+;B[ej];W[gc];B[hb];W[ge];B[ba]C[C13];W[gd];B[cb];W[cc];B[ca]C[D13];W[ed];B[db];W[dc]
+;B[aa];W[fa];B[id]C[#CATEGORY=ATARI_ATARI
+K7];W[da];B[ad];W[he];B[jg];W[kf];B[jh];W[lh];B[ih];W[ji];B[hh]
+;W[hi];B[kh];W[ki];B[kg];W[li];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b13.sgf b/regression/games/trevor/auto/b13.sgf
new file mode 100644 (file)
index 0000000..3238dab
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[kc];B[cc];W[kk];B[hd];W[kf];B[jj];W[kj];B[ji];W[lh];B[il]
+;W[dj];B[cj];W[di];B[el];W[gj];B[bh];W[dd];B[cd];W[de];B[eb];W[hb];B[hj];W[jg]
+;B[bf];W[dg];B[gi];W[fj];B[hh];W[gc];B[hf];W[ec];B[fb];W[fc];B[dc];W[ff];B[ie]
+;W[fh];B[gk];W[jl];B[jk];W[kl];B[fi];W[im];B[hm];W[hl];B[jm]C[#J3 locally better than G1
+J3];W[gm];B[gl];W[im]
+;B[ik];W[hm];B[ej];W[ic];B[ei];W[eh];B[dk];W[fm];B[ke];W[le];B[kd];W[ld];B[jd]
+;W[jc];B[kh]C[L5];W[lg];B[jf]C[!K6];W[jh];B[ki];W[li];B[kg];W[ci];B[bi];W[gg];B[lf]
+;W[mf];B[cg];W[dh];B[gb];W[hc];B[ce];W[hg];B[ig];W[fl];B[fk];W[ga];B[df];W[ef]
+;B[gd];W[fa];B[ea];W[ha];B[db];W[fd];B[ge];W[fe];B[em];W[km];B[kf];W[cf];B[ch]
+;W[df];B[id];W[gf];B[gh];W[jm];B[hk];W[tt];B[tt])
\ No newline at end of file
diff --git a/regression/games/trevor/auto/b16.sgf b/regression/games/trevor/auto/b16.sgf
new file mode 100644 (file)
index 0000000..ef7b9ed
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dd];W[dj];B[jd];W[jj];B[fj];W[dh];B[dk];W[ck];B[ek]C[C2];W[kf];B[cl]
+;W[gd];B[ie];W[cc];B[cd];W[dc];B[cj];W[ed];B[ee];W[de];B[ke];W[gf];B[lf];W[ci]
+;B[bk];W[df];B[bi];W[bh];B[hc];W[fc];B[hk];W[hi];B[ah];W[ag];B[kh];W[lg];B[kg]
+;W[gb];B[hb];W[fh];B[lj];W[kk];B[jl];W[lk];B[ki];W[kl];B[ik];W[ii];B[ai];W[bg]
+;B[ig];W[hg];B[kj];W[jk];B[im];W[ha];B[ia];W[ga];B[jb];W[gj];B[ei];W[di];B[gk]
+;W[fi];B[ej];W[km];B[ih];W[jm];B[il];W[hd];B[he];W[ge];B[ji]C[J4];W[ml];B[ij];W[lm]
+;B[hf];W[hh];B[hj];W[id];B[gi];W[gh];B[ic];W[eh];B[mj]C[G11];W[gj];B[gc];W[fb];B[gi]
+;W[kc];B[jc];W[gj];B[ec];W[fd];B[gi]C[#B4 is a better ko threat than A4
+!A4];W[aj];B[bj];W[gj];B[mk];W[gi];B[tt];W[tt]
+)
diff --git a/regression/games/trevor/auto/b17.sgf b/regression/games/trevor/auto/b17.sgf
new file mode 100644 (file)
index 0000000..6c3b195
--- /dev/null
@@ -0,0 +1,11 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dj];W[kc];B[dc];W[ik];B[kk];W[fk];B[ji];W[kf];B[de];W[lh];B[li]
+;W[hc];B[kh];W[jl];B[el];W[gl];B[eh];W[fb];B[hj];W[kl];B[ll];W[km];B[ek];W[ge]
+;B[fj];W[im];B[lg];W[lf];B[gg];W[ff];B[df];W[ie];B[eb];W[ig];B[fd];W[fc];B[gd]
+;W[hd];B[gc];W[gb];B[fe];W[ec];B[gf];W[dd];B[cd];W[db];B[cb];W[cc];B[bc];W[bd]
+;B[ce];W[bb];B[dc]C[#Must try to fight the ko.
+#for example, C3, E10, E9
+!E12];W[ea];B[ed];W[ac];B[cc];W[ca];B[he];W[ae];B[bf];W[mg];B[mh]
+;W[mf];B[if];W[jf];B[hf];W[kg];B[be];W[lm];B[lk];W[fl];B[hk];W[hl];B[jh];W[em]
+;B[dm];W[fm];B[cl];W[jg];B[ad];W[ba];B[ab];W[hh];B[ih];W[ij];B[hi];W[hg];B[gh]
+;W[je];B[ii];W[jj];B[kj];W[lh];B[mi];W[jk];B[gk];W[ml];B[mk];W[lg];B[mm];W[cm]
+;B[bm];W[ml];B[ac];W[mm];B[aa];W[da];B[tt];W[tt])
\ No newline at end of file
diff --git a/regression/games/trevor/auto/b20.sgf b/regression/games/trevor/auto/b20.sgf
new file mode 100644 (file)
index 0000000..f92d09c
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kd];W[dj];B[kk];W[dd];B[hc];W[jj];B[kj];W[ji];B[il];W[gj];B[lh]
+;W[jg];B[kf];W[ch];B[ck];W[dk];B[dl];W[el];B[bl];W[dm];B[cl];W[bj];B[fc];W[eb]
+;B[ec];W[dc];B[fb];W[db];B[gf];W[df];B[ie];W[fg];B[hh];W[gi];B[gl];W[fe];B[em]C[F2]
+;W[fa];B[ga];W[ea];B[ek];W[gb];B[hb];W[ha];B[ib];W[gc];B[gd];W[hj];B[ej];W[cj]
+;B[ga];W[gb];B[ff];W[ei];B[ee];W[de];B[ed];W[ih];B[gh];W[hg];B[gg];W[fh];B[hf]
+;W[ig];B[ef];W[eg];B[bk];W[ak];B[fl];W[ia];B[ja];W[ga];B[jb];W[al];B[hi];W[ii]
+;B[jf];W[jk];B[jl];W[ki];B[li];W[kg];B[lg];W[kh];B[ik];W[ij];B[hk];W[fk];B[fj]
+;W[gk];B[bm];W[fi];B[el];W[gc];B[if];W[aj];B[am];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b23.sgf b/regression/games/trevor/auto/b23.sgf
new file mode 100644 (file)
index 0000000..3d8b3ed
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[cc];B[kh];W[kc];B[dj];W[ch];B[dd];W[dc];B[ed];W[fb];B[dg]
+;W[bj];B[ck];W[bk];B[jd];W[jc];B[id];W[le];B[gd];W[cg];B[jf];W[dh];B[fi];W[eg]
+;B[ff];W[ce];B[gk];W[hb];B[bl];W[lg];B[lh];W[mh];B[mi];W[mg];B[lj];W[df];B[ke]
+;W[lf];B[cj];W[fg];B[gg];W[bi];B[cd];W[bd];B[kg];W[kf];B[kd];W[ld];B[al];W[ei]
+;B[ej];W[ec];B[fh];W[fe];B[ge];W[fd];B[ee];W[fc];B[ef]C[!D7];W[dg];B[ic];W[ib];B[ak]
+;W[gc];B[hc];W[aj];B[eh];W[di];B[ci];W[bh];B[gf];W[de];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b24.sgf b/regression/games/trevor/auto/b24.sgf
new file mode 100644 (file)
index 0000000..f148900
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[jc];B[cc];W[ik];B[kk];W[fk];B[ji];W[je];B[kg];W[lf];B[kf]
+;W[ke];B[lg];W[le];B[ej];W[dd];B[cd];W[de];B[bf];W[gc];B[fj];W[gj];B[eb];W[jl]
+;B[dg];W[fc];B[el];W[fb];B[fl];W[gl];B[dc];W[ig];B[kl];W[gi];B[ef];W[gf];B[eh]
+;W[ee];B[gm];W[hm];B[ff];W[km];B[fe];W[ec];B[lm];W[jm];B[ml];W[db];B[cb];W[ea]
+;B[ge];W[ca];B[gg];W[ii];B[hf];W[mg];B[mh];W[mf];B[jj];W[lh];B[kh];W[li];B[lj]
+;W[jh];B[ki];W[mi];B[hh];W[ih];B[hi];W[ij];B[if];W[bb];B[jf];W[ce];B[bd];W[be]
+;B[ae]C[!B7];W[bg];B[cf];W[hd];B[ie];W[id];B[mj];W[mh];B[fd];W[ed];B[df];W[hg];B[gh]
+;W[he]C[owl_defend J3
+0];B[gd];W[il];B[hk];W[hj];B[gk];W[hl];B[gk];W[bc];B[ad];W[ac];B[af];W[tt]
+;B[fi];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b25.sgf b/regression/games/trevor/auto/b25.sgf
new file mode 100644 (file)
index 0000000..23b5197
--- /dev/null
@@ -0,0 +1,11 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dj];W[jd];B[dd];W[jj];B[jf];W[hd];B[kd];W[kc];B[ke]C[M11];W[fk];B[lc]
+;W[dg];B[ci];W[cc];B[dc];W[cd];B[jc];W[ic];B[kb];W[hf];B[ce];W[be];B[cf];W[bf]
+;B[el];W[db];B[eb];W[cb];B[fc];W[gb];B[ib];W[hc];B[ig];W[cg];B[kh];W[gh];B[lj]
+;W[kk];B[lk];W[bh];B[bi];W[gg];B[kl];W[jl];B[ll];W[fi];B[fl];W[ai];B[aj];W[ah]
+;B[bk];W[hl];B[gk];W[gj];B[gl];W[hk];B[je];W[ek];B[dk];W[kj];B[id];W[ie];B[hb]
+;W[fb];B[gc];W[ea];B[ga];W[ec];B[ki]C[!D8];W[df];B[ji];W[ii];B[ij]C[K3];W[ik];B[jk]
+;W[hi];B[jm];W[il];B[hm];W[hj];B[im];W[jj];B[kj];W[ij];B[ih];W[if];B[ej];W[fj]
+;B[ei];W[eh];B[ch];W[dh];B[jd];W[fa];B[ha];W[kk];B[da];W[eb];B[jk];W[ja];B[jb]
+;W[kk];B[hg];W[ge];B[jk];W[gm];B[fm];W[kk];B[af];W[ae];B[jk];W[km];B[lm];W[kk]
+;B[ff];W[gf];B[jk];W[ak];B[al];W[kk];B[ag];W[bg];B[jk];W[bj];B[ak];W[di];B[cj]
+;W[kk];B[gd];W[fd];B[jk];W[hh];B[kk];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b27.sgf b/regression/games/trevor/auto/b27.sgf
new file mode 100644 (file)
index 0000000..9b0d9de
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kd];W[cc];B[cj];W[kk];B[ej];W[gk];B[id];W[gc];B[hb];W[ec];B[fl]
+;W[ik];B[ce];W[kh];B[jf];W[lf];B[le];W[df];B[cf];W[hh];B[lg];W[lh];B[mg]C[#L7 locally better than N6
+L7];W[mh]
+;B[kg];W[bd];B[jh];W[ji];B[ge];W[fh];B[de];W[dh];B[bh];W[cg];B[ed];W[bg];B[ef]
+;W[bi];B[bj];W[ah];B[gb];W[aj];B[fc];W[be];B[bk];W[fd];B[fb];W[db];B[dg];W[ih]
+;B[jg];W[gl];B[fk];W[fm];B[em];W[gm];B[dl];W[eg];B[gj];W[dd];B[ee];W[ff];B[fe]
+;W[gf];B[hf];W[hg];B[eb];W[cd];B[hj];W[hk];B[ii]C[K2];W[ij];B[ki];W[hi];B[kj];W[lj]
+;B[li];W[jj];B[mi];W[lk];B[ig];W[ak];B[al];W[ai];B[bl];W[bf];B[he];W[ea];B[gi]
+;W[fi];B[fj]C[G6];W[fg];B[mj];W[mk];B[ci];W[ch];B[gh];W[gg];B[di];W[ei];B[df];W[dc]
+;B[fa];W[da];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b28.sgf b/regression/games/trevor/auto/b28.sgf
new file mode 100644 (file)
index 0000000..e01c28e
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[jd];B[dj];W[cd];B[ed];W[kh];B[cc];W[dc];B[dd];W[cb];B[bc]
+;W[bb];B[df];W[ce];B[db];W[ec];B[fc];W[eb];B[jh];W[jg];B[ih];W[ki];B[kj];W[fd]
+;B[hj];W[ie];B[fb]C[D13];W[ea];B[kc];W[jc];B[kd];W[ke];B[le];W[gd];B[kg];W[kf];B[lg]
+;W[lf];B[ld];W[me];B[lb];W[lj];B[jb]C[!H12];W[hb];B[lk];W[bg];B[ef];W[dh];B[fg];W[ci]
+;B[fj];W[bk];B[li];W[dl];B[lh];W[hg];B[fl];W[ig];B[ib];W[hc];B[fh];W[cj];B[dk]C[!E3]
+;W[ek];B[el];W[cl];B[de];W[cf];B[gf];W[hh];B[hi];W[hf];B[dg];W[eh];B[fe];W[cg]
+;B[ge];W[he];B[ic]C[!F13];W[fa];B[id];W[hd];B[je];W[jf];B[jd];W[di];B[ei];W[ia];B[dm]
+;W[cm];B[em];W[gh];B[gi];W[ja];B[ka];W[ha];B[mg];W[mf];B[md];W[ck];B[ej];W[eg]
+;B[gg];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b29.sgf b/regression/games/trevor/auto/b29.sgf
new file mode 100644 (file)
index 0000000..1833903
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[dk];B[cc];W[kj];B[ij];W[jh];B[kk];W[jk];B[gj];W[di];B[ik]
+;W[jl];B[gh];W[gl];B[cg];W[il];B[gf];W[jd];B[jc];W[dd];B[cd];W[bh];B[de];W[kf]
+;B[id];W[ld];B[kd];W[lc];B[ch];W[ci];B[lb];W[ke];B[bg];W[bi];B[je];W[ag];B[af]
+;W[ah];B[ig];W[bf];B[eg];W[cf];B[df];W[fk];B[ce];W[be];B[bd];W[ae];B[hk];W[mb]
+;B[la]C[E6];W[dh];B[dg];W[hl];B[fj];W[ej];B[jg];W[kg];B[ji];W[ki];B[ih];W[kh];B[jj]
+;W[mc];B[eh];W[ei];B[fi];W[jf];B[if];W[ad];B[ac];W[af];B[gk];W[lf];B[jb];W[ma]
+;B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b30.sgf b/regression/games/trevor/auto/b30.sgf
new file mode 100644 (file)
index 0000000..c69283c
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dk];W[cc];B[jd];W[jj];B[di];W[kf];B[gc];W[cg];B[le];W[jh];B[bh]
+;W[ik];B[lf]C[!L6];W[kh];B[dd];W[cd];B[dc];W[fk];B[ce];W[be];B[el];W[de];B[ee];W[df]
+;B[lg];W[lh];B[ed];W[fl];B[if];W[fg];B[ge];W[db];B[eb];W[cb];B[hh];W[hj];B[kg]
+;W[ea];B[fa];W[da];B[fb];W[mg];B[fm];W[gm];B[em];W[gl];B[bg];W[jg];B[jf];W[fi]
+;B[bf];W[cf];B[ej];W[gh];B[ih];W[hg];B[ig];W[hf];B[gf];W[gg];B[he];W[ch];B[ci]
+;W[dh];B[ii]C[K5];W[ef];B[ji]C[L4|L5];W[lj];B[ki];W[li];B[kj];W[kk];B[ei];W[eh];B[ij]
+;W[jk];B[mh];W[mi];B[lk]C[M2];W[kl];B[hi];W[gj];B[ff];W[ek];B[dl];W[af];B[gi];W[fj]
+;B[bi];W[ag];B[ah];W[ae];B[mf];W[ll];B[mh];W[mk];B[mg];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b32.sgf b/regression/games/trevor/auto/b32.sgf
new file mode 100644 (file)
index 0000000..77f2754
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dc];W[kj];B[cj];W[jc];B[ik];W[ji];B[fk];W[jf];B[ce];W[hj];B[hk]
+;W[jl];B[jk];W[kk];B[il];W[gc];B[kl];W[ll];B[jm];W[eb];B[ec];W[db];B[cb];W[cc]
+;B[bb];W[fc];B[ee];W[di];B[dj];W[hg];B[dg];W[dh];B[eh];W[ei];B[fh];W[fi];B[bh]
+;W[gh];B[ge];W[kf];B[fg];W[ie];B[da]C[!D10];W[dd];B[ed];W[fa];B[lm];W[ml];B[hf];W[gf]
+;B[gg];W[gi];B[ff];W[if];B[cd];W[gk];B[gl];W[he];B[gj];W[ij];B[fj];W[ej];B[ek]
+;W[ci];B[bi];W[ig];B[gd];W[hd];B[fd];W[ch];B[cg];W[gf];B[hh];W[hi];B[hf];W[jj]
+;B[gf];W[lk];B[ca];W[fb];B[ea];W[mm];B[km];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b33.sgf b/regression/games/trevor/auto/b33.sgf
new file mode 100644 (file)
index 0000000..cdfb8b8
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[cd];B[je];W[fc];B[cj];W[ej];B[jc];W[ck];B[dk];W[dj];B[ek]
+;W[cl];B[fk];W[ci];B[ki];W[fj];B[dl];W[hb];B[cm];W[bm];B[dm];W[al];B[jg];W[hi]
+;B[hk];W[gf];B[gj];W[gi];B[gd];W[fd];B[ib]C[!J11];W[ic];B[hc];W[ia];B[id];W[gb];B[ja]
+;W[hg];B[ha];W[ga];B[hj];W[ig];B[ii];W[ih];B[jh];W[gc];B[ge];W[fe];B[he];W[hf]
+;B[if];W[ia];B[ff];W[gg];B[ha];W[ef];B[ia];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b37.sgf b/regression/games/trevor/auto/b37.sgf
new file mode 100644 (file)
index 0000000..8666a77
--- /dev/null
@@ -0,0 +1,5 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ec];W[kk];B[cd];W[ck];B[jc];W[di];B[kf];W[kh];B[cg];W[gj];B[ig]
+;W[ih];B[ff];W[lg];B[lf];W[fh];B[hg];W[bi];B[eg];W[mf];B[me];W[mg];B[ld];W[bg]
+;B[bf]C[C6|B6];W[jg];B[jf];W[jh];B[bh]C[!A6];W[ah];B[ag];W[ai];B[ci];W[cj];B[ch];W[bj]
+;B[hh]C[H5];W[ii];B[gi];W[fi];B[hi];W[hj];B[gg];W[dh];B[dg];W[eh];B[fg];W[kg];B[gh]
+;W[tt];B[fj];W[ej];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b39.sgf b/regression/games/trevor/auto/b39.sgf
new file mode 100644 (file)
index 0000000..819225f
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dd];W[kc];B[dk];W[ik];B[kk];W[fk];B[di];W[kl];B[jl];W[jk];B[ll]
+;W[kj];B[lk];W[fc];B[df];W[db];B[hc];W[cc];B[cd]C[!J11];W[ic];B[gd];W[hb];B[el];W[fd]
+;B[he];W[kf];B[hg];W[ih];B[lj];W[ki];B[fi];W[li];B[fe];W[il];B[km];W[je];B[gl]
+;W[im];B[jm];W[gk];B[fl];W[gc];B[hd];W[hi];B[dc];W[cb];B[gi];W[mj];B[bc];W[bb]
+;B[bd];W[mk];B[ml];W[mi];B[ab];W[ba];B[ec];W[eb];B[hl];W[hk];B[ig];W[jg];B[if]
+;W[hh];B[gh];W[ed];B[ee];W[id];B[gj];W[hj];B[hm];W[fj];B[ej];W[jf];B[ek];W[ie]
+;B[ac];W[aa];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b40.sgf b/regression/games/trevor/auto/b40.sgf
new file mode 100644 (file)
index 0000000..97bfcbd
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[ki];B[cc];W[ij];B[ik];W[hj];B[hk];W[gj];B[fl];W[kd];B[ed]
+;W[hc];B[lj];W[fb];B[ck];W[li];B[dg];W[kj];B[lk];W[kk];B[kl];W[ei];B[di];W[ge]
+;B[fg];W[gh];B[ej];W[ee];B[de]C[!D6];W[dh];B[eh];W[db];B[gg];W[hg];B[cb];W[df];B[ef]
+;W[ca];B[ba];W[da];B[bb];W[mj];B[fi];W[ll];B[dc];W[jl];B[eb];W[fd];B[cf];W[il]
+;B[fe];W[hl];B[fc];W[gd];B[gb];W[hb];B[gk];W[ga];B[fa];W[ha];B[gf];W[hf];B[gl]
+;W[gc];B[fb];W[gi];B[jj];W[ji];B[hm];W[fj];B[im];W[km];B[fk];W[fh];B[ei];W[jm]
+;B[gm];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b42.sgf b/regression/games/trevor/auto/b42.sgf
new file mode 100644 (file)
index 0000000..12d92a4
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ji];W[kk];B[id];W[hk];B[cc];W[ek];B[kd];W[cj];B[fc];W[ce];B[kf]
+;W[ee];B[lj];W[fh];B[fe];W[ef];B[ig];W[bd];B[hi];W[bb];B[jk];W[jl];B[fi];W[gi]
+;B[kj];W[dc];B[kl];W[km];B[lk];W[eb];B[il];W[gb];B[hl];W[fj];B[ib];W[ei];B[gc]
+;W[gf];B[ff];W[ge];B[fd]C[G7|F7];W[if];B[gg];W[hg];B[hh];W[gl];B[hb];W[hm];B[fb];W[fa]
+;B[ga];W[ea];B[ec];W[db];B[hj];W[ik];B[jm];W[ij];B[hf];W[gj];B[fg];W[eg];B[ed]
+;W[dd];B[ii];W[gh];B[jj];W[gk];B[jl];W[gm];B[im];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b47.sgf b/regression/games/trevor/auto/b47.sgf
new file mode 100644 (file)
index 0000000..890d8ba
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dj];W[jj];B[ce];W[kc];B[dc];W[fk];B[jd];W[kd];B[je];W[ib];B[gd]
+;W[hj];B[el];W[ki];B[fl];W[hd];B[if];W[gf];B[jg];W[hk];B[hg];W[gg];B[he];W[lg]
+;B[dg];W[gh];B[fb];W[gl];B[ke];W[le];B[eh];W[id];B[ge];W[jc];B[hc];W[hb];B[ff]
+;W[gc];B[fc];W[gb];B[hh];W[fi];B[kf];W[lh];B[lf];W[mf];B[ga];W[jh];B[kg];W[ih]
+;B[hi];W[hf];B[gi];W[fh];B[gj];W[fj];B[ig];W[gk];B[ii];W[kh];B[ij];W[ik];B[gm]
+;W[hm];B[fg];W[fm];B[ej];W[em];B[ek];W[dl];B[ck];W[cl];B[bl];W[bm];B[al];W[cm]
+;B[ei];W[ha];B[fa];W[ji];B[ie];W[ic];B[dk];W[dm];B[am];W[gm];B[bk];W[tt];B[jk]
+;W[fe];B[ld]C[N9];W[kk];B[md];W[lc];B[me];W[mg];B[jl];W[ef];B[eg];W[il];B[fd];W[mc]
+;B[le];W[tt];B[kl];W[ll];B[jm];W[lj];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b52.sgf b/regression/games/trevor/auto/b52.sgf
new file mode 100644 (file)
index 0000000..ab4d3d4
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jd];W[ck];B[jk];W[cc];B[ki];W[hc];B[fc];W[kc];B[jc];W[kd];B[je]
+;W[jb];B[ke]C[L12|J12];W[ec];B[ib];W[kb];B[fb]C[H12|M9];W[ic];B[hb];W[le];B[lf];W[md];B[hd]
+;W[di];B[ed];W[cf];B[gk];W[db];B[gf];W[eg];B[gh];W[mf];B[lg];W[el];B[fi];W[dd]
+;B[ee];W[gl];B[hl];W[ia];B[gb]C[F2|F3];W[eb];B[fl];W[fk];B[gm];W[fj];B[gj];W[ei];B[em]
+;W[dl];B[fh];W[dm];B[fm];W[de];B[eh];W[dh];B[ef];W[fg];B[df]C[D7];W[cg];B[dg];W[mg]
+;B[mh];W[fa];B[me];W[mf];B[ga];W[ea];B[mg];W[la];B[me];W[ld];B[mf];W[ja];B[id]
+;W[ha];B[fd];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b56.sgf b/regression/games/trevor/auto/b56.sgf
new file mode 100644 (file)
index 0000000..c3b544c
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dk];W[kd];B[cd];W[jk];B[ic];W[jf];B[fc];W[ji];B[di];W[jb];B[jc]
+;W[kc];B[ib];W[gk];B[kb];W[lb];B[ja];W[cf];B[ef];W[gi];B[eh];W[el];B[dl];W[hg]
+;B[fl];W[gl];B[ek];W[he];B[gm];W[hm];B[fm];W[la];B[hl];W[hk];B[im];W[kl];B[fe]
+;W[ka];B[ik];W[ij];B[il];W[ge];B[gf];W[gc];B[gb];W[fd];B[ec];W[ed];B[dc];W[de]
+;B[ch];W[bg];B[bh];W[be];B[bd];W[gg];B[hf];W[if];B[ff];W[ad];B[ac];W[ae];B[bc]
+;W[ah];B[ai];W[ag];B[bj];W[dg];B[fh];W[ce];B[hc];W[gd];B[gh];W[hh];B[fk];W[fj]
+;B[jd]C[!J10];W[id];B[je];W[ke];B[ie];W[fg];B[eg];W[ej];B[cg];W[jb];B[df];W[ia];B[hd]
+;W[ha];B[ga];W[jl];B[dj];W[jm];B[hm];W[fi];B[hb];W[ja];B[ei];W[hi];B[tt];W[tt]
+)
diff --git a/regression/games/trevor/auto/b58.sgf b/regression/games/trevor/auto/b58.sgf
new file mode 100644 (file)
index 0000000..f847cfd
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[dd];B[jd];W[ck];B[fc];W[hj];B[kh];W[df];B[dj];W[dk];B[ej]
+;W[cj];B[fi];W[dh];B[fg]C[!C5];W[ci];B[db];W[cc];B[hd];W[fk];B[ke];W[cb];B[ec];W[ge]
+;B[il];W[fj];B[jj];W[hh];B[hg];W[ei];B[gi];W[gh];B[ih];W[hi];B[gg];W[gl];B[fe]
+;W[fh];B[ca];W[ba];B[da];W[bb];B[hk];W[hl];B[ik];W[im];B[jm];W[hm];B[kl];W[eg]
+;B[gk];W[fl];B[gj];W[ff];B[gf];W[ig];B[hf];W[he];B[if];W[ie];B[jg];W[ee];B[fd]
+;W[dc];B[eb];W[ii];B[ji];W[ef];B[ij];W[eh];B[ed];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b60.sgf b/regression/games/trevor/auto/b60.sgf
new file mode 100644 (file)
index 0000000..c662994
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[de];W[kk];B[dc];W[jd];B[dj];W[fk];B[el];W[hk];B[eh];W[gc];B[kf]
+;W[le];B[ki];W[lj];B[kg];W[gh];B[if];W[he];B[fj];W[gj];B[fg];W[gg];B[fb];W[gb]
+;B[fd];W[gd];B[ga];W[ha];B[fa];W[hb];B[fl];W[gl];B[ek];W[fe];B[fc];W[fi];B[gk]
+;W[ec];B[ed];W[fk];B[je];W[kd];B[gk];W[lh];B[hl]C[!G5];W[gi];B[ik];W[kh];B[hj];W[ji]
+;B[jl];W[kl];B[ii];W[jj];B[ih];W[lg];B[km];W[lm];B[jm];W[ll];B[ff];W[gf];B[ei]
+;W[jh];B[ee]C[J7];W[jg];B[ig];W[jf];B[ie];W[ke];B[id];W[ic];B[hd];W[ge];B[ij];W[hc]
+;B[fh];W[jk];B[hh];W[hi];B[hf];W[hg];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b62.sgf b/regression/games/trevor/auto/b62.sgf
new file mode 100644 (file)
index 0000000..61f49bb
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[cc];B[dj];W[kc];B[hd];W[fc];B[ke];W[ld];B[jd];W[hb];B[cg]
+;W[fk];B[el];W[fi];B[fg];W[ek];B[fl]C[D3];W[gk];B[dk];W[kg];B[jc];W[jb];B[ih];W[le]
+;B[ki];W[jf];B[ge];W[hf];B[gf];W[hg];B[gh];W[hh];B[hi];W[kf];B[gi];W[lh];B[li]
+;W[de];B[eh];W[be];B[bf];W[mi];B[mj];W[mh];B[mk];W[jh];B[ii];W[ic];B[id];W[af]
+;B[ag];W[ae];B[ce];W[cd];B[cf];W[bd];B[kh];W[mf];B[ig];W[if];B[jg];W[fd];B[df]
+;W[ee];B[hc];W[ib];B[gc];W[gb];B[ef];W[fe];B[ff];W[kd];B[je];W[gg];B[he];W[gd]
+;B[ie];W[lf];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b64.sgf b/regression/games/trevor/auto/b64.sgf
new file mode 100644 (file)
index 0000000..06d0ede
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ic];W[je];B[dd];W[kc];B[fc];W[cf];B[kk];W[ci];B[be];W[kh];B[ck]
+;W[ej];B[el];W[eh];B[hk];W[ib];B[jb];W[jc];B[hb];W[id];B[hc];W[kb];B[ia];W[hi]
+;B[bj];W[fe];B[ge];W[gd];B[fd];W[he];B[gf];W[bi];B[ef];W[bf];B[ce];W[lj];B[kj]
+;W[lk];B[ll];W[ig];B[li];W[lh];B[mi]C[#L5 locally better than N6
+L5];W[mh];B[ki];W[ae];B[ad];W[af];B[bc];W[ka]
+;B[jh];W[jg];B[ii];W[ih];B[gk];W[ij];B[ji];W[hj];B[ik];W[df];B[ee];W[gg];B[hf]
+;W[if];B[fg];W[hg];B[ff];W[hd];B[fh];W[fi];B[gh];W[hh];B[fk];W[fj];B[ja];W[dk]
+;B[dl];W[cj];B[bk];W[jj];B[ek];W[jk];B[jl];W[gc];B[gb];W[dj];B[ai];W[ah];B[aj]
+;W[eg];B[de];W[bh];B[gi];W[gj];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b67.sgf b/regression/games/trevor/auto/b67.sgf
new file mode 100644 (file)
index 0000000..41919fb
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[kc];B[cd];W[kk];B[ed];W[gc];B[jh];W[kf];B[ik];W[jl];B[fb]
+;W[dj];B[cj];W[di];B[bh];W[fi];B[el];W[lh];B[ig];W[ef];B[fe];W[ie];B[ff];W[eg]
+;B[gj];W[fg];B[jj];W[cg];B[kj];W[lj];B[gd];W[fc];B[ec];W[hc];B[il];W[gb];B[eb]
+;W[ch];B[bg];W[fj];B[cf];W[hh];B[hg];W[ii];B[df];W[dg];B[ek];W[ej];B[gf];W[eh]
+;B[fk];W[ee];B[ki]C[M5];W[lg];B[jm];W[km];B[im]C[M5];W[kl];B[li];W[mj];B[mi];W[ml]
+;B[de];W[hj];B[hk];W[gi];B[gk];W[jf];B[hd];W[id];B[ga];W[ha];B[fa];W[ib];B[he]
+;W[if];B[gg]C[C5|D3];W[gh];B[dk];W[ci];B[bi];W[jg];B[fd];W[kh];B[ih];W[mh];B[ij];W[hi]
+;B[ji];W[hf];B[jk];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b69.sgf b/regression/games/trevor/auto/b69.sgf
new file mode 100644 (file)
index 0000000..a7d6c5f
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[kd];B[ck];W[hc];B[cd];W[ki];B[ed];W[ij];B[ik];W[fb];B[lj]
+;W[dj];B[cj];W[di];B[el];W[gj];B[cg];W[ci];B[db];W[fj];B[eg];W[bh];B[bg];W[bj]
+;B[cl];W[gl];B[li];W[ih];B[bk];W[dk];B[hl];W[dl];B[fl];W[em];B[gk];W[jj];B[kk]
+;W[hj];B[gf];W[ie];B[lg];W[hg];B[le];W[ld];B[jf];W[ag];B[af];W[ah];B[be];W[ak]
+;B[md];W[mc];B[me];W[lc];B[fm];W[dm];B[eb];W[fc];B[fa];W[ga];B[ea];W[je];B[gb]
+;W[hb];B[ha];W[ib];B[gc];W[gd];B[if];W[hf];B[kf];W[ia];B[ga];W[fd];B[ge];W[fe]
+;B[gg];W[gh];B[he];W[hd];B[fh];W[ff];B[fg];W[fi];B[ig];W[hh];B[kj];W[kh];B[lh]
+;W[ef];B[df];W[dh];B[dg];W[ek];B[fk];W[ec];B[dc];W[ee];B[de];W[dd];B[eh];W[ei]
+;B[ed];W[jg];B[kg];W[jh];B[dd];W[hk];B[gm]C[!A2];W[al];B[ke]C[!K10];W[jd];B[ch];W[tt]
+;B[tt])
diff --git a/regression/games/trevor/auto/b72.sgf b/regression/games/trevor/auto/b72.sgf
new file mode 100644 (file)
index 0000000..1fa9eb8
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dc];W[jj];B[cf];W[ke];B[dj];W[jc];B[hk];W[kh];B[jl];W[kk];B[kl]
+;W[gc];B[fj];W[ck];B[cj];W[dk];B[ek];W[bj];B[bi];W[el];B[fl];W[dm];B[fm];W[bk]
+;B[aj];W[bm];B[fd];W[ll];B[gd]C[!E12];W[eb];B[db]C[!H10];W[hd];B[fb];W[gb];B[hi];W[fc]
+;B[gf]C[!E10];W[ed];B[fe]C[E11];W[if];B[hg]C[E11];W[da];B[ec];W[fa];B[cb];W[ak];B[lm];W[ai]
+;B[bh];W[ml];B[he]C[J9];W[ea];B[id];W[hc];B[ig];W[ie];B[ca];W[jg];B[hf];W[ih];B[em]
+;W[dl];B[ii]C[K6|K5];W[hh];B[ji];W[ki];B[jh];W[je];B[jk]C[J4];W[kj];B[ij];W[ah];B[ag]
+;W[aj];B[bg];W[lk];B[km];W[mm];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b73.sgf b/regression/games/trevor/auto/b73.sgf
new file mode 100644 (file)
index 0000000..9935805
--- /dev/null
@@ -0,0 +1,11 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[kc];B[cc];W[kk];B[hj];W[kh];B[jd];W[kd];B[je];W[lf];B[ib]
+;W[dd];B[cd];W[de];B[eb];W[gd];B[bf];W[dj];B[cj];W[di];B[el];W[hh];B[gk];W[ii]
+;B[kb];W[jc];B[jb];W[lb];B[gb];W[ci];B[il];W[dg];B[fi];W[ic];B[fg];W[gf];B[la]
+;W[mb];B[kl];W[ll];B[jk];W[lj];B[kj];W[lk];B[lm];W[jj];B[ka];W[ik];B[jl];W[bj]
+;B[bk];W[ij];B[hk];W[bi];B[aj];W[ai];B[ak];W[bg];B[ce];W[cf];B[af];W[ff];B[eh]
+;W[hc];B[hb];W[dc];B[db];W[dk];B[dl];W[fj];B[gi];W[gh];B[eg];W[ei];B[ef];W[fh]
+;B[df];W[cg];B[ee];W[gj];B[hi];W[ih];B[ek];W[fe];B[ec];W[fd];B[ed];W[ml];B[ej]
+;W[gg];B[bh];W[km];B[jm];W[hl];B[gl];W[fc];B[hm];W[mm];B[fb];W[km];B[ma];W[md]
+;B[lm];W[al];B[cl];W[km];B[lc];W[mc];B[lm];W[ad];B[ah];W[km];B[ld];W[le];B[li]C[# At least W can win this ko fight!
+L5]
+;W[gc];B[lm];W[ki];B[km];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b75.sgf b/regression/games/trevor/auto/b75.sgf
new file mode 100644 (file)
index 0000000..2eb6b5d
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kj];W[jd];B[dd];W[dj];B[hk];W[fc];B[ch];W[dh];B[dg];W[eh];B[ci]
+;W[cj];B[eb]C[!F4];W[fj];B[kf];W[gl];B[gk];W[fk];B[hl];W[jf];B[jg];W[if];B[ke];W[kd]
+;B[fl];W[hd];B[fb];W[el];B[gm]C[!H11];W[hc];B[em];W[dl];B[fe];W[hi];B[ij];W[ig];B[jh]
+;W[gg];B[eg];W[gb];B[bj];W[bk];B[ai];W[le];B[lf];W[ld];B[ak];W[mf];B[mg];W[me]
+;B[lh];W[dm];B[bl];W[ck];B[gd];W[fd];B[he];W[ee];B[ff];W[ed];B[de]C[!D12];W[db];B[dc]
+;W[fg];B[ef];W[ii];B[ji];W[gf];B[ge];W[gc];B[fm];W[di];B[al];W[ih];B[gj];W[gi]
+;B[ie];W[je];B[id];W[ic];B[hf];W[hg];B[cg];W[ga];B[cl];W[ea];B[cb];W[da];B[ec]
+;W[fa];B[ca];W[cm];B[bm];W[hj];B[tt];W[ik];B[jj];W[tt];B[il];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b76.sgf b/regression/games/trevor/auto/b76.sgf
new file mode 100644 (file)
index 0000000..06e7ddf
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[cc];B[ck];W[ke];B[kc];W[kh];B[id];W[hk];B[ii];W[ek];B[li]
+;W[di];B[ik];W[bj];B[jf];W[ih];B[fc];W[lh];B[hj];W[if];B[gk];W[je];B[fl];W[dl]
+;B[ki];W[df];B[dc];W[cd];B[ld];W[le];B[ge];W[db];B[hg];W[ig];B[eb];W[fg];B[hh]
+;W[kf];B[cb];W[bb];B[da];W[fi];B[ee];W[mi];B[mj];W[mh];B[lk];W[ba];B[hf]C[!B3];W[bk]
+;B[fj];W[ej];B[gi];W[gh];B[fk];W[ef];B[el]C[!D3];W[dk];B[dm];W[cm];B[em];W[cl];B[de]
+;W[ce];B[ca];W[gg];B[jd];W[ie];B[he];W[fe];B[fd];W[ff];B[dd];W[md];B[mc];W[me]
+;B[kd]C[K6];W[gf];B[jh];W[jg];B[ji];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/b80.sgf b/regression/games/trevor/auto/b80.sgf
new file mode 100644 (file)
index 0000000..debb300
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[kc];B[kj];W[cc];B[df];W[fc];B[ik];W[hd];B[ke];W[dj];B[fk]
+;W[jd];B[cj];W[ld];B[ff];W[dk];B[di];W[cl];B[bl];W[el];B[cm];W[dm];B[dl];W[fl]
+;B[em];W[gl];B[ek];W[ig];B[kh];W[be];B[le];W[bg];B[gg];W[ii];B[hj];W[hi];B[gi]
+;W[dd];B[bi];W[me];B[mf];W[md];B[lg];W[jj];B[jk];W[ki];B[li];W[kk];B[lj];W[ji]
+;B[hg];W[if];B[hh];W[jg];B[hl];W[kf];B[lf];W[je];B[kg];W[bh];B[dg];W[ch];B[ce]
+;W[cd];B[de];W[dh];B[ci];W[ee];B[eh];W[cf];B[fe];W[ed];B[ah];W[ag];B[ai];W[ef]
+;B[eg];W[gd];B[bf]C[A8];W[ae];B[cg];W[ge];B[af];W[bd];B[hf];W[he];B[gf];W[jf];B[fd]
+;W[kd];B[ij];W[jh];B[lh];W[ih];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b83.sgf b/regression/games/trevor/auto/b83.sgf
new file mode 100644 (file)
index 0000000..5bed676
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cj];W[dd];B[je];W[kj];B[jc];W[gc];B[ek];W[hk];B[kh];W[cg];B[cc]
+;W[dc];B[cd];W[ce];B[be];W[bf];B[bd];W[db];B[lj]C[!C12];W[cb];B[lk];W[kk];B[gl];W[hi]
+;B[hb];W[fj];B[bh];W[ll];B[ki];W[hl];B[ig];W[fl];B[el];W[gk];B[ei];W[gb];B[hd]
+;W[ff];B[ml];W[em];B[dm];W[fm];B[cl];W[lm];B[gd];W[eg];B[ga];W[fa];B[ha]C[F11];W[fb]
+;B[mk];W[fd];B[gg];W[ch];B[ci];W[bg];B[ah];W[gf];B[fh];W[dh];B[ej];W[fk];B[hf]C[H11]
+;W[ge];B[gi];W[gj];B[ij];W[ii];B[jj];W[jk];B[ji];W[hj];B[ik];W[il];B[ih];W[hh]
+;B[hg];W[gh];B[fi];W[fg];B[he];W[ag];B[bi];W[di];B[dj];W[eh];B[hc];W[kl];B[bb]
+;W[ba];B[lh]C[!B11];W[bc];B[mm]C[!A12];W[ab];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b86.sgf b/regression/games/trevor/auto/b86.sgf
new file mode 100644 (file)
index 0000000..ada3f3e
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ec];W[dj];B[jc];W[jj];B[cd];W[ke];B[kg];W[jf];B[lf];W[jg];B[hk]
+;W[cg];B[hi];W[kk];B[ld];W[il];B[gh];W[gf];B[fg];W[fk];B[ef];W[he];B[gd];W[ji]
+;B[ck];W[cj];B[dk];W[ek];B[bj];W[bi];B[bl];W[aj];B[el];W[fl];B[dm];W[al];B[hd]
+;W[hl];B[li];W[lj];B[kh];W[jh];B[bf];W[eh];B[hg];W[id];B[ic];W[ie];B[ge];W[hf]
+;B[bg];W[cf];B[ce];W[df];B[de];W[ch];B[fi];W[mi];B[mh];W[mj];B[ki];W[gk];B[gj]
+;W[ik];B[kj];W[lk];B[ff];W[le];B[me]C[!M11];W[lc];B[kd];W[mg];B[lg]C[M6];W[kf];B[mf]
+;W[hj];B[ii];W[ei];B[fj];W[ig];B[gg];W[ij];B[jd];W[eg];B[je];W[if];B[ih];W[fh]
+;B[bh];W[ah];B[be];W[ag];B[ak];W[bk];B[af];W[ai];B[gi];W[ej];B[tt];W[tt])
diff --git a/regression/games/trevor/auto/b88.sgf b/regression/games/trevor/auto/b88.sgf
new file mode 100644 (file)
index 0000000..01b5a5e
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jd];W[dj];B[kj];W[dd];B[hk];W[hc];B[cf];W[ce];B[dg];W[fd];B[de]
+;W[be];B[ib];W[hb];B[ig];W[ch];B[bg];W[ic];B[dh];W[bh];B[ci];W[bi];B[cj];W[bj]
+;B[dk]C[!D5];W[di];B[ck];W[bf];B[ej];W[cg];B[ff];W[jb];B[kc];W[he];B[hf];W[je];B[ke]
+;W[bk];B[id];W[ie];B[hd];W[ge];B[kf];W[gf];B[gg];W[df];B[ef];W[cl];B[dl];W[kb]
+;B[bl];W[al];B[cm];W[lc];B[ld];W[lb];B[ee];W[ed];B[bm];W[gd];B[if];W[jc];B[kd]
+;W[jf];B[jg];W[md];B[me];W[mc];B[mf];W[cf];B[am];W[ak];B[ei];W[fe];B[tt];W[tt]
+)
diff --git a/regression/games/trevor/auto/b99.sgf b/regression/games/trevor/auto/b99.sgf
new file mode 100644 (file)
index 0000000..33e340c
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jd];W[jj];B[cc];W[ck];B[jh];W[hj];B[kj];W[kk];B[ki];W[lk];B[dj]
+;W[dk];B[ej];W[fl];B[bi];W[hc];B[fc];W[kc];B[jc];W[kd];B[ke];W[le];B[kf];W[lf]
+;B[hd];W[fi];B[dh];W[jb];B[ib];W[kb];B[fg];W[hh];B[hg];W[bj];B[hb];W[ai];B[cj]
+;W[bh];B[df];W[bf];B[gh];W[ci];B[gi];W[fj];B[eh];W[cf];B[bd];W[ce];B[de];W[ei]
+;B[di];W[ih];B[ig];W[ji];B[lh];W[ek];B[lg];W[lj];B[mf];W[md];B[li];W[hi];B[ch]
+;W[cg];B[cd];W[gj];B[be];W[fh];B[gg];W[dg];B[eg];W[bi];B[af]C[B7];W[ag];B[bg]
+;W[mi];B[ja];W[ka];B[ia];W[mh];B[ah];W[bk];B[ag];W[jg];B[kh];W[me];B[jf];W[mg]
+;B[kg];W[tt];B[tt])
diff --git a/regression/games/trevor/auto/c01.sgf b/regression/games/trevor/auto/c01.sgf
new file mode 100644 (file)
index 0000000..a16b086
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dd];W[jj];B[dk];W[jc];B[ke];W[kg];B[ie];W[hd];B[ld];W[lb];B[di]\r
+;W[he];B[hk];W[lf];B[gi];W[if];B[jl];W[kk];B[kl];W[ll];B[fc];W[cc];B[cd];W[dc]\r
+;B[ec];W[eb];B[bc];W[bb];B[fg];W[fb];B[fe];W[bd];B[be];W[ac];B[ih];W[ce];B[de]\r
+;W[ae];B[bf];W[jh];B[jf]C[K7];W[af];B[ag]C[!B7];W[bg];B[ad];W[ae];B[bh];W[jk];B[ik]\r
+;W[hg];B[ig];W[hf];B[jg];W[ii];B[hh];W[ki];B[gc];W[id];B[je];W[le];B[kc];W[kb]\r
+;B[lm];W[ml];B[md];W[jd];B[kd];W[gb];B[km];W[hc];B[kf];W[lg];B[gg];W[hi];B[gd]\r
+;W[gf];B[ff];W[me];B[ij];W[hj];B[gj];W[ji];B[lc];W[mb];B[af];W[ad];B[ge];W[mc]\r
+;B[gh];W[lk];B[il];W[mm];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c03.sgf b/regression/games/trevor/auto/c03.sgf
new file mode 100644 (file)
index 0000000..705c0ff
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dk];W[cd];B[jc];W[jj];B[ch];W[fc];B[kh];W[gk];B[je];W[li];B[ki]\r
+;W[kj];B[hd];W[hb];B[fe];W[ed];B[lh];W[lj];B[ib];W[dg];B[cg];W[dh];B[gb];W[fb]\r
+;B[di];W[ei];B[ej];W[gc];B[fl];W[gl];B[be];W[bd];B[ig];W[fg];B[gh];W[ee];B[hj]\r
+;W[hk];B[eh];W[ef];B[fi];W[bf];B[bg];W[eg];B[cf];W[fk];B[el];W[ge];B[ad];W[ac]\r
+;B[ae];W[bc];B[ji];W[mh];B[mg];W[mi];B[lf];W[gj];B[ij];W[ik];B[gi];W[hc];B[gd]\r
+;W[he];B[id];W[fd];B[gg];W[ha];B[gf];W[ff];B[gm];W[hm];B[fm];W[ek];B[dl];W[hf]\r
+;B[ce];W[fh];B[de];W[ei];B[dd];W[dc];B[if];W[hg];B[hi];W[hh];B[ih];W[fj];B[eh]C[!J1]\r
+;W[im];B[ei];W[ia];B[ja];W[ic];B[jb];W[df];B[ie];W[fe];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c08.sgf b/regression/games/trevor/auto/c08.sgf
new file mode 100644 (file)
index 0000000..cdeac75
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[kj];B[cd];W[cj];B[ik];W[gk];B[ii];W[jh];B[jl];W[ll];B[kf]\r
+;W[ih];B[ec];W[hl];B[cg];W[hi];B[hc];W[fi];B[ci];W[dj];B[ie];W[bi];B[bh];W[bj]\r
+;B[fg];W[gg];B[ff];W[gf];B[lh];W[kh];B[li];W[ki];B[lj];W[lk];B[kg];W[jk];B[ge]\r
+;W[hf];B[di];W[mj];B[ei];W[ej];B[fh];W[gh];B[if];W[mi];B[mh];W[mk];B[lg];W[ah]\r
+;B[ag];W[ai];B[ig];W[jg];B[hg];W[jf];B[je]C[H9];W[hh];B[he]C[PASS];W[jj];B[tt];W[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c09.sgf b/regression/games/trevor/auto/c09.sgf
new file mode 100644 (file)
index 0000000..ac33c54
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ik];W[kd];B[cc];W[ic];B[dk];W[ci];B[cg];W[ei];B[fj];W[bk];B[kj]\r
+;W[dd];B[cd];W[kg];B[de];W[cl];B[ed];W[dl];B[gc];W[bh];B[bg];W[hb];B[gb];W[fl]\r
+;B[eg];W[fi];B[gj];W[ej];B[gf];W[ig];B[hc];W[ib];B[lh];W[lg];B[ie];W[ii];B[kh]\r
+;W[gi];B[gl];W[mh];B[mi];W[mg];B[lj];W[ga];B[fa];W[ha];B[eb];W[ag];B[af];W[ah]\r
+;B[be];W[gm];B[gk];W[hm];B[jl];W[hl];B[hk]C[F3];W[ek];B[ke];W[je];B[jf];W[jd];B[le]C[K7]\r
+;W[if];B[jg];W[ld];B[mf];W[he];B[hi];W[hh];B[ij];W[md];B[dh];W[ge];B[ff];W[ji]\r
+;B[jh];W[hj];B[kf];W[fe];B[ih]C[H5];W[hg];B[hi];W[ch];B[hj];W[fg];B[fh];W[gg];B[ef]\r
+;W[eh];B[fd];W[di];B[dg];W[hf];B[hd];W[id];B[ee];W[fk];B[me]C[K1];W[il];B[jm];W[gd]\r
+;B[im];W[fm];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c11.sgf b/regression/games/trevor/auto/c11.sgf
new file mode 100644 (file)
index 0000000..e9d0341
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[de];W[kk];B[dc];W[jd];B[dk];W[di];B[fj];W[ck];B[cj];W[dj];B[cl]\r
+;W[bk];B[bj];W[dl];B[ek];W[bl];B[ch];W[cm];B[gc];W[ic];B[ge];W[hk];B[gg];W[kf]\r
+;B[gh];W[jh];B[hb];W[ib];B[ii];W[ji];B[if];W[ij];B[ih];W[aj];B[ci]C[#locally A6 is better than A5\r
+!A5];W[ai];B[ia]\r
+;W[ja];B[ha];W[jb];B[bg];W[fl];B[jg];W[kg];B[el];W[fk];B[dh];W[em];B[ej];W[jf]\r
+;B[ig];W[ie];B[gj];W[hd];B[gk];W[gl];B[hj];W[hl];B[gd];W[hc];B[gb];W[he];B[hf]\r
+;W[bi];B[jj];W[kj];B[ik];W[il];B[jk];W[jl];B[ij]C[A7];W[bh];B[ag];W[ak];B[ah];W[cg]\r
+;B[bf];W[dg];B[ei];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c12.sgf b/regression/games/trevor/auto/c12.sgf
new file mode 100644 (file)
index 0000000..88e494c
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cc];W[ck];B[kd];W[kj];B[ik];W[ji];B[fk];W[hj];B[fi];W[hk];B[dj]\r
+;W[il];B[cj];W[dk];B[ek];W[bj];B[bi];W[el];B[bk];W[bl];B[fl];W[ak];B[dl];W[cl]\r
+;B[id];W[gc];B[hb];W[dd];B[cd];W[kf];B[em];W[ci];B[di];W[ge];B[ch];W[hh];B[de]\r
+;W[fb];B[le];W[lf];B[eg];W[gg];B[if];W[ig];B[db];W[ed];B[mf];W[mg];B[me];W[lg]\r
+;B[hf];W[fg];B[ec];W[fc];B[eb];W[ke];B[lc];W[hc];B[ic];W[fh];B[gi];W[eh];B[ef]\r
+;W[dh];B[dg];W[gf];B[fe];W[fd];B[ee];W[hi];B[je];W[jf];B[gj];W[he];B[ie];W[hd]\r
+;B[gl];W[hl];B[hm];W[im];B[gm];W[ei];B[ej];W[cm];B[dm]C[!G3];W[gk];B[ai];W[aj];B[ea]\r
+;W[gb];B[ib];W[ha];B[fa];W[ga];B[ia];W[hg];B[dc];W[gh];B[fj];W[ff];B[tt];W[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c13.sgf b/regression/games/trevor/auto/c13.sgf
new file mode 100644 (file)
index 0000000..266e848
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[kd];B[ck];W[cd];B[ic];W[gc];B[ie];W[jf];B[jb];W[lb];B[ge]\r
+;W[ed];B[kc];W[jj];B[lc];W[jk];B[kj];W[ki];B[li];W[kh];B[lh];W[lg];B[mj];W[ih]\r
+;B[fk];W[cg];B[gb];W[hb];B[fb];W[hc];B[fc]C[F10];W[db];B[ff];W[fd];B[gd];W[ld];B[md]\r
+;W[ci];B[bj];W[kl];B[ll];W[lk];B[lj];W[lm];B[ml];W[jl];B[mh];W[bi];B[me];W[df]\r
+;B[gh];W[ei];B[kf];W[lf];B[ke];W[le];B[je];W[kg];B[gj];W[ig];B[hl];W[eb];B[hd]\r
+;W[ec];B[ha];W[fa];B[ib];W[aj];B[ak];W[ai];B[dk];W[eg];B[cj];W[dj];B[fi];W[fg]\r
+;B[gg];W[ej];B[fh];W[ek];B[el];W[eh];B[ee];W[de];B[fe];W[fj];B[fl];W[ef];B[ga]\r
+;W[ea];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c14.sgf b/regression/games/trevor/auto/c14.sgf
new file mode 100644 (file)
index 0000000..d1fe419
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jd];W[jj];B[dc];W[dj];B[cf];W[kf];B[jf];W[jg];B[if];W[ke];B[kd]\r
+;W[fk];B[hd];W[ci];B[ff];W[ii];B[kk]C[K3|K2|J2|L4|M4|M5];W[ki];B[lj]C[K2];W[jk];B[ll]C[K2];W[fi];B[jl]\r
+;W[il];B[im];W[hm];B[bh]C[K1];W[bi];B[eh];W[km];B[lm];W[li];B[hl]C[K1];W[ik];B[gm]\r
+;W[el];B[gk];W[gj];B[fl];W[ek];B[em];W[dl];B[hk];W[ld];B[lc];W[le];B[gh];W[hj]\r
+;B[ai];W[aj];B[ah];W[bj];B[ei];W[mc];B[lb];W[ch];B[bg];W[dm];B[fm];W[dg];B[fh]\r
+;W[df];B[de];W[mb];B[ef];W[la];B[jb];W[ka];B[kb]C[!N13];W[ma];B[cg];W[dh];B[je];W[ja]\r
+;B[ia];W[md];B[ib];W[mj];B[mk];W[mi];B[kj];W[ig];B[hg];W[hh];B[gi];W[fj];B[hi]\r
+;W[ih];B[eg];W[ce];B[be];W[di];B[ej];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c17.sgf b/regression/games/trevor/auto/c17.sgf
new file mode 100644 (file)
index 0000000..b475d24
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dk];W[dd];B[kc];W[jk];B[ch];W[gc];B[ji];W[ki];B[kh];W[kj];B[jh]\r
+;W[hk];B[cf];W[be];B[ce];W[cd];B[bf];W[bd];B[fk];W[jd];B[kd];W[jc];B[je];W[ie]\r
+;B[jf];W[he];B[gl];W[hl];B[jb];W[ib];B[kb];W[fe];B[li];W[lj];B[lh];W[gh];B[eh]\r
+;W[af];B[ag];W[ae];B[cg]C[!H5];W[hi];B[hg];W[gg];B[hf];W[eg];B[hm];W[im];B[gm]C[J2|J3|K2]\r
+;W[if];B[ig];W[fj];B[ia]C[H12];W[ha];B[ic];W[hb];B[id];W[gf];B[il];W[ik];B[jl];W[kl]\r
+;B[jm];W[ei];B[di];W[dj];B[cj];W[ej];B[km];W[ek];B[ll];W[kk];B[el];W[gk];B[dl]\r
+;W[fl];B[fm];W[fh];B[dh];W[hc];B[ja];W[hd];B[ij];W[ii];B[jj];W[hj];B[mi];W[lk]\r
+;B[fk];W[ml];B[lm];W[de];B[mj];W[mk];B[df];W[ef];B[ih];W[ah];B[bg];W[ck];B[cl]\r
+;W[bk];B[bj];W[fl];B[im];W[em];B[fk]C[B2];W[bh];B[bl];W[fl];B[dm];W[fk];B[hh];W[mm]\r
+;B[em];W[dg];B[ci];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c18.sgf b/regression/games/trevor/auto/c18.sgf
new file mode 100644 (file)
index 0000000..61f7d5d
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kd];W[dk];B[dd];W[kj];B[ci];W[cg];B[ce];W[di];B[ch];W[dh];B[bg]\r
+;W[id];B[fd];W[if];B[kf];W[ih];B[kh]C[!H10];W[hd];B[jc];W[gc];B[fc];W[bf];B[cf];W[bj]\r
+;B[ji];W[ik];B[jj];W[jk];B[kk]C[M3];W[gg];B[dg];W[eh];B[kl];W[jl];B[lj];W[km];B[hi]\r
+;W[gj];B[bi];W[ll];B[cj];W[bk];B[ck];W[cl];B[lk];W[ii];B[dj]C[E3];W[ej];B[dl];W[al]\r
+;B[ek];W[bm];B[ff];W[fk];B[fl];W[ij];B[ml];W[gl];B[lm];W[fm];B[jm];W[el];B[dk]\r
+;W[im];B[gb];W[hb];B[gd]C[H11];W[ga];B[fb];W[ia];B[hc];W[ic];B[kb]C[F13|D1];W[gf];B[dm]\r
+;W[aj];B[em];W[jg];B[je];W[kg];B[lg]C[F13];W[gc];B[ge];W[jb];B[fi];W[eg];B[ef];W[gh]\r
+;B[hc];W[fj];B[cm];W[bl];B[jd];W[ka];B[lb];W[fa];B[ea];W[ha];B[eb];W[he];B[la]C[F7|F2]\r
+;W[km];B[fg];W[fh];B[ja];W[ib];B[ie];W[hf];B[fl];W[gm];B[ai];W[ka];B[el];W[gc]\r
+;B[ja];W[jm];B[ka];W[hc];B[jf];W[jh];B[ki];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c20.sgf b/regression/games/trevor/auto/c20.sgf
new file mode 100644 (file)
index 0000000..db0c927
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[cc];B[jc];W[dk];B[di];W[df];B[fi];W[fk];B[hi];W[hk];B[je]\r
+;W[ch];B[cj];W[ck];B[dh];W[bj];B[cg];W[cf];B[bi];W[bg];B[bk];W[bl];B[il];W[fc]\r
+;B[gf];W[ak];B[gd];W[hb];B[ib]C[!J11];W[ic];B[hc];W[ia];B[jb];W[gc];B[id]C[!H13];W[ha]\r
+;B[ja];W[gb];B[ee];W[fg];B[gg];W[dg];B[bh];W[hl];B[ik];W[im];B[jm];W[hm];B[kl]\r
+;W[eh];B[ei];W[de];B[ef];W[ff];B[eg];W[fe];B[ed]C[F10];W[ec];B[fd];W[dd];B[gj];W[gk]\r
+;B[ag];W[af];B[ah]C[H4];W[aj];B[hj];W[ej];B[dj];W[fj];B[ci];W[cg];B[ai];W[tt];B[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c23.sgf b/regression/games/trevor/auto/c23.sgf
new file mode 100644 (file)
index 0000000..3792c38
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ej];W[kc];B[cj];W[dd];B[jj];W[kh];B[fc];W[cg];B[ic];W[eb];B[ec]\r
+;W[dc];B[je];W[le];B[fb];W[db];B[hk];W[lj];B[kk];W[lk];B[jb];W[kl];B[jl];W[bi]\r
+;B[bj];W[ci];B[ll];W[ml];B[km];W[fh];B[ge];W[fj];B[fk];W[ih];B[lb];W[ee];B[lc]\r
+;W[kd];B[if];W[gg];B[lg];W[kf];B[kg];W[jg];B[fi];W[aj];B[ak];W[ai];B[bl];W[gi]\r
+;B[gj];W[kb];B[ka];W[di];B[hi];W[hh];B[ki];W[lh];B[li]C[N5];W[mh];B[mi];W[dj];B[dk]\r
+;W[ii];B[ij];W[gh];B[ld];W[ke];B[ff];W[ef];B[ei]C[K5];W[eh];B[ji];W[jh];B[fg];W[fe]\r
+;B[gf];W[fa];B[ga];W[ea];B[gb];W[eg];B[me];W[mf];B[md];W[jd];B[id];W[jf];B[ie]\r
+;W[fd];B[gd]C[H8];W[hj];B[hg];W[ig];B[hf]C[K11];W[hi];B[jc];W[ed];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c24.sgf b/regression/games/trevor/auto/c24.sgf
new file mode 100644 (file)
index 0000000..f8e6ca7
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[dc];B[jc];W[cf];B[cj];W[hj];B[kh];W[ek];B[ke];W[di];B[ci]\r
+;W[cl];B[bk];W[gc];B[bl];W[ik];B[dl];W[fi];B[jl];W[ib];B[ic];W[jb];B[kb]C[!L11];W[kc]\r
+;B[lb];W[hc];B[ie];W[ff];B[hl];W[ge];B[bg];W[bf];B[cg]C[!J10];W[id];B[jd];W[hd];B[ig]\r
+;W[dg];B[ja];W[hb];B[hk];W[ag];B[ij];W[bh];B[ch];W[ii];B[jj];W[hi];B[bi];W[ah]\r
+;B[kd];W[gg];B[hf];W[el];B[ck];W[gk];B[em];W[fm];B[dm];W[gl];B[dh]C[E7];W[de];B[il]\r
+;W[eh];B[hh];W[ih];B[hg];W[dj];B[gh];W[fh];B[gf];W[gi];B[fg];W[eg];B[jh];W[ji]\r
+;B[ki];W[ia];B[ka];W[ai];B[aj];W[af];B[hm];W[gm];B[gg];W[dk];B[cm];W[he];B[tt]\r
+;W[tt])\r
diff --git a/regression/games/trevor/auto/c25.sgf b/regression/games/trevor/auto/c25.sgf
new file mode 100644 (file)
index 0000000..80e7753
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dd];W[jj];B[jc];W[dj];B[kf];W[cf];B[df];W[dg];B[ef];W[ce];B[cd]\r
+;W[hk];B[fd];W[ki];B[hf];W[ei];B[ck];W[cj];B[dk];W[ek];B[el];W[fk];B[fl];W[gl]\r
+;B[dm];W[bk];B[bl];W[cl];B[dl];W[al];B[cm];W[bj];B[fm];W[bm];B[am]C[!G1];W[gm];B[ak]\r
+;W[gh];B[ih];W[bd];B[bc];W[lg];B[lf];W[mf];B[me];W[mg];B[ld];W[be];B[kg];W[lh]\r
+;B[hi];W[ac];B[bb];W[aj];B[gi];W[gg];B[gf];W[eg];B[fg];W[fh];B[ff];W[ij];B[ab]\r
+;W[jh];B[ad];W[ae];B[jg];W[kh];B[ii];W[de];B[fj];W[ej];B[fi];W[ee];B[ed];W[fe]\r
+;B[ge];W[hg];B[ig];W[hj];B[al];W[ac];B[bg];W[cg];B[ad];W[cc];B[gj];W[gk];B[hh]\r
+;W[eh];B[ji];W[ac];B[cb];W[ad];B[kj];W[lj];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c28.sgf b/regression/games/trevor/auto/c28.sgf
new file mode 100644 (file)
index 0000000..846f100
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[ck];B[dc];W[kk];B[de];W[cg];B[bf];W[jf];B[hc]C[!C5];W[ci];B[ge]\r
+;W[kh];B[le];W[gj];B[hg];W[ih];B[eg];W[ei];B[gh];W[lg];B[hi]C[#Other move may be possible.\r
+J3];W[jj];B[hj];W[gk]\r
+;B[hk];W[hl];B[il];W[gl];B[jk];W[jl];B[ik];W[kl];B[jd];W[im];B[kf]C[!L9];W[ke];B[je]\r
+;W[kg];B[lf];W[if];B[bg];W[bh];B[ig];W[jg];B[ah];W[ai];B[fh];W[hf];B[gf];W[hh]\r
+;B[ii];W[gg];B[gi];W[ji];B[fg];W[cf];B[ce];W[hg];B[mg];W[mh];B[mf];W[fi];B[df]\r
+;W[ie];B[hd];W[id];B[ic];W[dg];B[dh];W[ch];B[eh];W[di];B[be];W[ag];B[he];W[af]\r
+;B[ae];W[ah];B[ij];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c30.sgf b/regression/games/trevor/auto/c30.sgf
new file mode 100644 (file)
index 0000000..9ccb4a8
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[ck];B[cd];W[jh];B[kc];W[ik];B[jl];W[il];B[kf];W[ec];B[cg]\r
+;W[hc];B[dj];W[cj];B[di];W[ji];B[li];W[if];B[db];W[lh];B[ki];W[lf];B[kh];W[kg]\r
+;B[jg];W[lg];B[jf];W[le];B[md];W[ig];B[ib];W[je];B[eg];W[ic];B[hb];W[gc];B[gb]\r
+;W[fb];B[jc];W[jk];B[km];W[ll];B[gf];W[kl];B[gh];W[bh];B[bg];W[dk];B[bi];W[bj]\r
+;B[fj];W[ie];B[ch];W[ee];B[el];W[bl];B[dl];W[ak];B[gl];W[ge];B[ai]C[C2];W[ff];B[bm]\r
+;W[cm];B[cl];W[am];B[aj];W[fg];B[ek];W[fh];B[gi];W[eh];B[df];W[gg];B[hl];W[hh]\r
+;B[im];W[jm];B[hm]C[K2|M1];W[ef];B[jl];W[lm];B[jm];W[lk];B[dh];W[dc];B[cc];W[eb];B[cb]\r
+;W[de];B[ce]C[!N9];W[me];B[ld];W[dd];B[hk];W[hj];B[hi]C[J5];W[jj];B[ii];W[ij];B[jd]\r
+;W[gj];B[fi];W[ih];B[ga];W[id];B[dg];W[gk];B[fk];W[ei];B[da];W[ej];B[fm];W[fa]\r
+;B[ea];W[ke];B[kd];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c35.sgf b/regression/games/trevor/auto/c35.sgf
new file mode 100644 (file)
index 0000000..0ed018a
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[kd];B[kj];W[hc];B[cc];W[ik];B[kg];W[fk];B[fc];W[kl];B[hb]\r
+;W[gb];B[ib];W[gc];B[kb];W[ic];B[lc];W[ld];B[jc];W[jd];B[ig];W[ha];B[ej];W[gf]\r
+;B[hh]C[!G9];W[ge];B[gg];W[df];B[ch];W[eb];B[bf]C[!E8];W[ef];B[ec];W[fb];B[db];W[lk]\r
+;B[lj];W[hj];B[el];W[lf];B[ji];W[lh];B[lg];W[li];B[hf];W[gi];B[fh];W[fl];B[ce]\r
+;W[mg];B[jk];W[jl];B[mi];W[ek];B[dl];W[kk];B[eg];W[jj];B[mj];W[mh];B[kh]C[!N3];W[mk]\r
+;B[ki];W[mf];B[kf];W[me];B[jb];W[la];B[mc];W[fd];B[ii];W[md];B[ke];W[ed];B[dc]\r
+;W[de];B[he];W[lb];B[le];W[kc];B[je];W[mb];B[dk];W[dg];B[dh];W[fi];B[ei]C[E1|F1];W[ij]\r
+;B[fj];W[gj];B[fm]C[G2|H2];W[gm];B[gl];W[gk];B[hm];W[hl];B[gm];W[im];B[em];W[dd];B[ea]\r
+;W[cd];B[bd];W[cf];B[be];W[fa];B[da];W[cg];B[bg];W[ff];B[hd];W[bc];B[bb]C[G10];W[fg]\r
+;B[gd];W[ca];B[ac];W[id];B[eh];W[ie];B[if];W[gh];B[hg];W[hi];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c36.sgf b/regression/games/trevor/auto/c36.sgf
new file mode 100644 (file)
index 0000000..85d8b73
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kd];W[dj];B[kk];W[dc];B[hc];W[de];B[fj];W[dh];B[dk];W[ck];B[ek]\r
+;W[cl];B[kg];W[jj];B[kj];W[gd];B[ii];W[jk];B[dl];W[gg];B[ji];W[gc];B[hk];W[hb]\r
+;B[ie];W[ic];B[jb];W[ig];B[cm];W[cj];B[bm];W[bl];B[ib];W[id];B[ha];W[je];B[ke]\r
+;W[jf];B[gb];W[fh];B[jl];W[fb];B[fa];W[eb];B[gi];W[ea];B[hh];W[hd];B[hb];W[kf]\r
+;B[lf];W[hg];B[al];W[ak];B[jc];W[am];B[dm];W[fi];B[ej];W[ei];B[jh]C[K7];W[al];B[ga]\r
+;W[jg];B[lg];W[gh];B[ih];W[jd];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c38.sgf b/regression/games/trevor/auto/c38.sgf
new file mode 100644 (file)
index 0000000..6b75094
--- /dev/null
@@ -0,0 +1,10 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[di];B[cc];W[dk];B[jj];W[kh];B[gk];W[ke];B[cg];W[id];B[ib]\r
+;W[dd];B[cd];W[bh];B[li];W[ld];B[lc];W[eg];B[ch];W[ci];B[bg];W[bi];B[eb];W[fi]\r
+;B[fd];W[ce];B[be];W[lh];B[ee];W[ki];B[kj]C[!N5];W[mi];B[lj];W[if];B[el];W[dl];B[ek]\r
+;W[em];B[fm];W[dm];B[hi];W[fl];B[fk]C[!G2];W[gl];B[hl];W[gm];B[hc];W[mc];B[gf];W[lb]\r
+;B[gh];W[kb];B[jc];W[jb];B[jd];W[je];B[hd];W[ej];B[ef];W[fg];B[gg];W[he];B[ge]\r
+;W[ih];B[hh];W[hf];B[fh];W[eh];B[hg];W[hm];B[im];W[fm];B[il];W[mj];B[mk];W[mh]\r
+;B[lk];W[ii];B[ij];W[ig];B[ff];W[ji];B[ah];W[ai];B[ag];W[ia];B[ha];W[ja];B[dg]\r
+;W[fj];B[dh];W[ei];B[gj];W[gi];B[ic];W[kd];B[ie];W[gc];B[gb];W[id];B[ck];W[hk]\r
+;B[hj];W[bk];B[ie];W[bd];B[bc];W[id];B[cj];W[bj];B[ie]C[!A10];W[ad];B[id];W[tt];B[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c39.sgf b/regression/games/trevor/auto/c39.sgf
new file mode 100644 (file)
index 0000000..f2d6e86
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[dj];B[jj];W[cc];B[ch];W[cf];B[ck];W[cj];B[dk];W[ej];B[fl]\r
+;W[dg];B[bj];W[bi];B[bk];W[bh];B[id];W[gc];B[kf];W[ge];B[jh];W[kk];B[jk];W[kj]\r
+;B[ki];W[li];B[lh];W[jl];B[il];W[mj];B[jm];W[kl];B[mh];W[ml];B[gi];W[fh];B[ib]\r
+;W[hb];B[hg];W[gg];B[hc];W[gb];B[gd];W[fd];B[hd];W[ec];B[fi];W[ia];B[ja];W[km]\r
+;B[ha];W[im];B[hl];W[ga];B[gk];W[ei];B[gh]C[G8];W[hf];B[fg];W[gf];B[eh];W[ig];B[dh]\r
+;W[ci];B[cg];W[bg];B[df];W[ef];B[eg];W[de];B[ce];W[bf];B[hh];W[ed];B[if]C[!E9];W[ee]\r
+;B[ff];W[fe];B[mi];W[lj];B[ek];W[ie];B[jf];W[jd];B[kd];W[je];B[ic];W[jc];B[jb]\r
+;W[he];B[fj];W[ke];B[le];W[aj];B[hm];W[ak];B[al];W[ai];B[bl];W[ia];B[kb];W[ha]\r
+;B[dg];W[jm];B[fh]C[D5];W[cd];B[di];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c41.sgf b/regression/games/trevor/auto/c41.sgf
new file mode 100644 (file)
index 0000000..7ce6cb2
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cd];W[jc];B[ck];W[je];B[kk];W[ec];B[df];W[jj];B[jk];W[ij];B[hl]\r
+;W[dj];B[cj];W[di];B[el];W[fi];B[bh];W[ge];B[db];W[eb];B[li];W[dc];B[cb];W[cc]\r
+;B[bc];W[bd];B[be];W[bb];B[lg];W[le];B[ad];W[ab];B[ih];W[hi];B[jh];W[gf];B[fk]\r
+;W[if];B[ac];W[ba];B[gj]C[G5];W[gh];B[gi];W[eg];B[hh];W[gg];B[ef];W[dd];B[de];W[ci]\r
+;B[bi];W[fe];B[lf];W[mf];B[dk];W[kf];B[ej];W[ei];B[fj];W[kg];B[kh];W[mg];B[lh]\r
+;W[hg];B[dg];W[jg];B[fg];W[eh];B[ff];W[fh];B[ch];W[ee];B[dh];W[mh];B[mi];W[me]\r
+;B[ig];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c42.sgf b/regression/games/trevor/auto/c42.sgf
new file mode 100644 (file)
index 0000000..7e06458
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[hk];B[fk];W[hi];B[jh];W[hg];B[cd];W[kf];B[ed];W[gc];B[lg]\r
+;W[jc];B[il];W[lf];B[fb];W[kg];B[lh];W[gf];B[ck];W[hl];B[ik];W[gb];B[hj];W[gj]\r
+;B[ij];W[fc];B[gk];W[eb];B[gi];W[gh];B[fe];W[cf];B[dg];W[fi];B[cg];W[cb];B[bf]\r
+;W[if];B[di];W[bc];B[fj];W[be];B[ce];W[af];B[bg];W[bd];B[mf];W[me];B[mg];W[le]\r
+;B[dc];W[kh];B[li];W[ki];B[kj];W[ji];B[ii];W[ih];B[ff];W[gi];B[fg];W[ge];B[fd]\r
+;W[db];B[gd];W[hd];B[gg];W[ag];B[ah];W[ae];B[bh]C[E5];W[fh];B[ei];W[eh];B[dh];W[eg]\r
+;B[ef];W[hh];B[ec];W[cc];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c43.sgf b/regression/games/trevor/auto/c43.sgf
new file mode 100644 (file)
index 0000000..91500f0
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[dc];B[jc];W[ck];B[ji];W[de];B[cg];W[bf];B[eg];W[fk];B[cf]\r
+;W[ce];B[ke];W[gc];B[bg];W[be];B[gj];W[hl];B[hf];W[ci];B[il];W[ik]C[!J3];B[hk];W[im]\r
+;B[jl];W[gk];B[ij];W[fi];B[gg]C[!H1];W[hm];B[jm];W[gl];B[fd];W[fc];B[ei];W[eh];B[fh]\r
+;W[ed];B[gi];W[ge];B[fj];W[he];B[ie];W[ib];B[ek];W[el];B[ic];W[jb];B[kb]C[!L11];W[kc]\r
+;B[lb];W[hc];B[dh];W[id];B[jd]C[!A7];W[ag];B[ah];W[af];B[bi];W[bj];B[ja];W[hb];B[hd]\r
+;W[fe];B[dk];W[dl];B[dj];W[di];B[kd];W[ia];B[ka];W[aj];B[ch];W[cj];B[ej];W[gd]\r
+;B[ff];W[df];B[ef];W[dg];B[bh];W[id];B[bl];W[cl];B[hd];W[ai];B[eh];W[id];B[fl]\r
+;W[fm];B[hd];W[lc];B[mb];W[id];B[gf];W[hd];B[ee];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c45.sgf b/regression/games/trevor/auto/c45.sgf
new file mode 100644 (file)
index 0000000..5f8d495
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[jd];B[jj];W[dd];B[fd];W[df];B[ch];W[kh];B[dc];W[cc];B[ec]\r
+;W[cb];B[hc]C[J12];W[cf];B[jb];W[kc];B[jh];W[jg];B[ih];W[ki];B[kj];W[ff];B[hj];W[kb]\r
+;B[fh];W[ek];B[bg];W[ib];B[hb];W[ja];B[gg];W[lg];B[eg];W[bf];B[ge];W[ha];B[if]\r
+;W[lj];B[lk];W[li];B[dl];W[mk];B[ll];W[ic];B[ef];W[hd];B[gb];W[ga];B[fb];W[ag]\r
+;B[ah];W[af];B[ee];W[db];B[eb];W[de];B[jf]C[L8];W[mh];B[kf];W[lf];B[kg];W[ke];B[ml]\r
+;W[ji];B[mj];W[ii];B[hi];W[ij];B[ik];W[hk];B[jk];W[gd];B[gk];W[ed];B[fa];W[fc]\r
+;B[gc]C[F9];W[ia];B[fe];W[he];B[ie];W[id];B[hf];W[cg];B[bh];W[dh];B[ci]C[!D3];W[dk]\r
+;B[di];W[dg];B[eh];W[da];B[je];W[mi];B[mk];W[ea];B[fc];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c47.sgf b/regression/games/trevor/auto/c47.sgf
new file mode 100644 (file)
index 0000000..6ce1eac
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cd];W[kc];B[kk];W[hj];B[dj];W[ec];B[kh];W[de];B[ce];W[df];B[cf]\r
+;W[dg];B[bh];W[kf];B[db];W[hc];B[ih];W[eb];B[gh];W[ck];B[dk];W[cj];B[gi];W[ci]\r
+;B[gf];W[di];B[jf];W[je];B[if];W[dc];B[cb];W[cc];B[bc];W[bi];B[fj];W[bg];B[bf]\r
+;W[ch];B[kg];W[lf];B[lg];W[gd];B[mf];W[le];B[cl];W[bl];B[dl];W[fe];B[bm];W[al]\r
+;B[ie];W[id];B[he];W[me];B[mg];W[da];B[ag]C[A6];W[cg];B[ba];W[ah];B[af];W[dd];B[ei]\r
+;W[eh];B[ff];W[fg];B[ef];W[fh];B[fi];W[ee];B[gg];W[eg];B[ca];W[ea];B[ge];W[hd]\r
+;B[cm];W[bj];B[am];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c51.sgf b/regression/games/trevor/auto/c51.sgf
new file mode 100644 (file)
index 0000000..6619bed
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[je];W[dj];B[jc];W[kg];B[kk];W[dd];B[lf];W[jj];B[kj];W[gc];B[cf]\r
+;W[be];B[dg];W[bg];B[fg];W[gj];B[ch];W[gh];B[kh];W[cg];B[jg];W[dh];B[ck];W[df]\r
+;B[cj];W[ci];B[bi];W[di];B[gf];W[el];B[il];W[ib];B[jb];W[ic];B[bh];W[cl];B[aj]\r
+;W[bk];B[fd];W[fc];B[hg];W[ec];B[gl];W[bj];B[eg];W[ce];B[ia];W[ha];B[ja]C[!L5];W[ki]\r
+;B[ji];W[ii];B[jh];W[ij];B[hb];W[hc];B[ga]C[E13|E12|F12];W[ef];B[ea];W[ff];B[gg]C[C12];W[ge]\r
+;B[fh];W[hh];B[fk];W[fj];B[he];W[gd];B[db];W[cc];B[cb];W[bb];B[ba]C[E3];W[ab];B[ek]C[E4|F5]\r
+;W[dk];B[ej];W[ei];B[fi];W[fl];B[gk]C[!J4];W[hj];B[hl]C[J10];W[gm];B[id];W[gb];B[fa]\r
+;W[ha];B[bc];W[bd];B[hb];W[jl];B[jk];W[ha];B[af];W[bf];B[hb];W[ca];B[da];W[ha]\r
+;B[hm];W[hb];B[fm];W[em];B[gm];W[hd];B[eh];W[tt];B[gi];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c54.sgf b/regression/games/trevor/auto/c54.sgf
new file mode 100644 (file)
index 0000000..4173ae2
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kj];W[dd];B[kd];W[cj];B[ek];W[di];B[gj];W[dk];B[ej];W[ic];B[je]\r
+;W[gd];B[ih];W[ie];B[cc];W[cd];B[dc];W[ec];B[eb];W[fc];B[fb];W[gb];B[da];W[eg]\r
+;B[if];W[bc];B[cb]C[B12];W[kb];B[bb];W[bd];B[fh];W[lc];B[ld];W[gf];B[dj];W[dl];B[el]\r
+;W[ci];B[dm];W[cl];B[he];W[id];B[kc];W[lb];B[hf];W[md];B[me];W[mc];B[le];W[cm]\r
+;B[ge];W[fe];B[gg];W[ff];B[ga]C[H13];W[jb];B[hb];W[gc];B[em];W[ab];B[eh];W[dh];B[ei]C[F13]\r
+;W[ba];B[fa];W[ac];B[ib];W[ja];B[jc];W[ia];B[hc];W[hd];B[ha];W[la];B[ca];W[fg]\r
+;B[hg]C[K10];W[aa];B[jd];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c55.sgf b/regression/games/trevor/auto/c55.sgf
new file mode 100644 (file)
index 0000000..634a71a
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jj];W[dd];B[jd];W[dk];B[ci];W[cg];B[ei];W[fj];B[dg];W[bj];B[cf]\r
+;W[bg];B[gh];W[df];B[de];W[ef];B[cd];W[ee];B[bf];W[ce];B[be];W[bd];B[cc];W[bc]\r
+;B[de];W[ae];B[ce];W[af];B[cb];W[bb];B[bh];W[ec];B[ch];W[he];B[jf];W[hc];B[ib]\r
+;W[hg];B[jh];W[gk];B[cj];W[ck];B[ik];W[hl];B[il];W[hb];B[gi];W[ic];B[hk];W[jb]\r
+;B[gl];W[fl];B[hm];W[kc];B[fm];W[em];B[el]C[G1];W[dl];B[dm];W[cm];B[bl];W[bk];B[fk]\r
+;W[al];B[bm];W[em];B[aj];W[kd];B[ke];W[eg];B[ag];W[gg];B[bi];W[dh];B[ba];W[ld]\r
+;B[le];W[me];B[mf];W[md];B[lg];W[hh];B[ej];W[hi];B[eb];W[fb];B[ea];W[dc];B[cg]\r
+;W[db];B[da]C[F13];W[fd];B[eh];W[fa];B[ca];W[jc];B[id];W[ie];B[je];W[hd];B[fg];W[ff]\r
+;B[fh];W[if];B[ii];W[hj];B[gj];W[ih];B[ij];W[jg];B[kg];W[ig];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c59.sgf b/regression/games/trevor/auto/c59.sgf
new file mode 100644 (file)
index 0000000..db91dd2
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ik];W[dd];B[kj];W[kc];B[ck];W[dj];B[dk];W[ej];B[bi];W[dg];B[fl]\r
+;W[je];B[kg];W[hc];B[hi];W[fg];B[le];W[ld];B[ig];W[lf];B[lg];W[mf];B[mg];W[kf]\r
+;B[he];W[hf];B[cc];W[dc];B[cd];W[ce];B[be];W[cf];B[bf];W[if];B[db];W[eb];B[cb]\r
+;W[jg];B[ec];W[ed];B[jh];W[fc];B[ki];W[jf];B[hg];W[gj];B[fh];W[eh];B[fk];W[gh]\r
+;B[fi]C[!H6];W[hh];B[gg];W[gi];B[ih];W[fj];B[ff];W[eg];B[gf];W[ge];B[fe];W[gd];B[ef]\r
+;W[df];B[cj];W[hj];B[ii];W[hk];B[hl];W[bg];B[di];W[ei];B[bh];W[af];B[ad];W[ch]\r
+;B[ci];W[ek];B[el];W[da];B[bc]C[J4];W[gk];B[gl];W[fd];B[ah];W[ag];B[ij];W[ca];B[ba]\r
+;W[ea];B[ee];W[de];B[ae];W[cg];B[dh];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c60.sgf b/regression/games/trevor/auto/c60.sgf
new file mode 100644 (file)
index 0000000..f997bec
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[ck];B[jk];W[dd];B[ji];W[kg];B[lh];W[jd];B[jc];W[ig];B[kd]\r
+;W[je];B[cf];W[ch];B[cc];W[cd];B[dc];W[ed];B[bd];W[be];B[bc];W[ce];B[fb];W[hk]\r
+;B[il];W[gd];B[hi];W[fg];B[hc];W[df];B[gl]C[!G7];W[gg];B[gk];W[ej];B[el];W[dl];B[hd]\r
+;W[fi];B[lg];W[ke];B[le];W[lf];B[mf];W[kf];B[ae]C[!B8];W[bf];B[ek];W[af];B[dk];W[dj]\r
+;B[cl];W[bl];B[dm];W[bm];B[cm];W[bk];B[ad];W[he];B[id];W[kh];B[ki];W[ld];B[md]C[E11|G1|E1|M5]\r
+;W[ie];B[lc];W[gc];B[gb];W[ec];B[eb];W[fc];B[gh];W[hh];B[gi];W[ii];B[ij];W[ih]\r
+;B[fh];W[eh];B[fj];W[ei];B[jh];W[jg];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c61.sgf b/regression/games/trevor/auto/c61.sgf
new file mode 100644 (file)
index 0000000..fd2a439
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jd];W[ck];B[ik];W[ec];B[cc];W[de];B[be];W[hc];B[kj];W[fk];B[jf]\r
+;W[jb];B[kc];W[db];B[cb];W[ch];B[kb];W[hl];B[hk];W[il];B[jl];W[jk];B[jj]C[G2|G3];W[jm]\r
+;B[kk]C[G2|G3];W[kl];B[gl]C[G3];W[jk];B[gk];W[fl];B[fm];W[em];B[ll];W[fe];B[gm];W[bf]\r
+;B[ae];W[cd];B[bd];W[dc];B[bb]C[!A8];W[af];B[fj];W[ek];B[ib];W[hb];B[hh];W[ic];B[cf]\r
+;W[bg];B[dg];W[ce];B[eh];W[ka];B[dl];W[cl];B[el];W[dk];B[dm];W[lb];B[lc];W[cm]\r
+;B[he];W[em];B[mb];W[la];B[fg];W[cg];B[df];W[ef];B[ge];W[gd];B[ff];W[ca];B[ba]\r
+;W[dh];B[eg];W[ee];B[di];W[ci];B[da];W[ea];B[dj];W[ab];B[ac];W[ej];B[ei]C[!C13];W[ca]\r
+;B[cj];W[bj];B[id]C[!D13];W[da];B[jc];W[ja];B[hd];W[gc];B[mc];W[ia];B[ma];W[tt];B[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c62.sgf b/regression/games/trevor/auto/c62.sgf
new file mode 100644 (file)
index 0000000..6b56f46
--- /dev/null
@@ -0,0 +1,11 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[cc];B[jj];W[kd];B[ic];W[gc];B[ie];W[jf];B[jb];W[lb];B[ge]\r
+;W[ec];B[kc]C[M11];W[hk];B[lc];W[ek];B[ch];W[cf];B[kg]C[!L8];W[kf];B[il];W[lg];B[le]\r
+;W[lf];B[kh];W[jd];B[lh];W[jc];B[kb];W[id];B[he];W[ib];B[hc];W[hd];B[hb];W[gd]\r
+;B[fj];W[fl];B[hi];W[bh];B[bg];W[cg];B[bi];W[dh];B[ci];W[bf];B[ah]C[!E1];W[em];B[ej]\r
+;W[dl];B[gm];W[ik];B[jk];W[hl];B[jl];W[hm];B[gb];W[fb];B[hg];W[fh];B[ef];W[eg]\r
+;B[ee];W[ff];B[fe];W[af];B[cl];W[gj];B[gi];W[fi];B[ei];W[cm];B[gk];W[fk];B[hj]\r
+;W[gl];B[gj];W[bl];B[ld];W[bk];B[dk];W[ag];B[di];W[bh];B[ai];W[ga];B[ia];W[mh]\r
+;B[mi];W[mg];B[lj];W[gf];B[df];W[dg];B[ed];W[dd];B[de];W[ce];B[je];W[ke];B[ig]\r
+;W[cj];B[dj];W[bj];B[fd]C[!J8|H8];W[if];B[hf];W[fc];B[jg]C[!G7];W[gg];B[gh];W[fg];B[ij]\r
+;W[im];B[jm];W[me];B[aj]C[A3];W[md];B[mc]C[A3];W[mf];B[ak];W[bm];B[al];W[bg];B[ha]\r
+;W[fa];B[am];W[dm];B[eh]C[!L13];W[ka];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c63.sgf b/regression/games/trevor/auto/c63.sgf
new file mode 100644 (file)
index 0000000..43b145f
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ck];W[jd];B[kk];W[dc];B[de];W[dh];B[fe];W[ee];B[gf];W[ed];B[fk]\r
+;W[jj];B[jk];W[ij];B[li];W[gc];B[hk];W[ik];B[il];W[jh];B[bh];W[cd];B[kc];W[kd]\r
+;B[jc];W[ic];B[ib];W[hb];B[jb];W[ld];B[gh];W[ef];B[fi]C[!C9];W[ce];B[ig]C[!H10];W[hd]\r
+;B[jg];W[lg];B[kh];W[bf];B[ci]C[!M11];W[lc];B[di];W[ch];B[kf];W[lf];B[ie];W[bg];B[bi]\r
+;W[ff];B[he];W[fd];B[ge];W[id];B[fg];W[eg];B[ke];W[le];B[lh];W[mh];B[ag];W[af]\r
+;B[ah];W[mi];B[mj];W[mg];B[lj];W[je];B[jf];W[eh];B[ei];W[fh];B[gg];W[gd];B[mb]\r
+;W[lb];B[kg];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c67.sgf b/regression/games/trevor/auto/c67.sgf
new file mode 100644 (file)
index 0000000..9cff51c
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cc];W[jj];B[kc];W[jd];B[ck]C[L10];W[jc];B[kd];W[ke];B[le];W[kf];B[lf]\r
+;W[kg];B[jb];W[ib];B[kb];W[hc];B[fc];W[dj];B[cj];W[di];B[el];W[gj];B[bh];W[dg]\r
+;B[cf];W[gb];B[kk];W[jk];B[kj];W[ki];B[li];W[lh];B[lj]C[K2];W[kl];B[ll];W[jl];B[lm]\r
+;W[ge];B[ji];W[kh];B[fb]C[!G6];W[gh];B[ee];W[gl];B[gd];W[hd];B[fg];W[fd];B[ed];W[fh]\r
+;B[fe];W[gf];B[ff];W[fa];B[ea];W[ga];B[gg];W[hg];B[db];W[df];B[de];W[gc];B[dk]\r
+;W[ej];B[fl];W[fm];B[fk];W[gk];B[ia];W[ha];B[ja];W[mi];B[mk];W[cg];B[bf];W[fj]\r
+;B[ch];W[dh];B[eg];W[eh];B[bg];W[ci];B[bi];W[em];B[dm];W[gm];B[ek];W[km];B[lg]\r
+;W[mg];B[ld];W[mf];B[fd];W[me];B[md];W[mh];B[mj];W[lb];B[la];W[mb];B[mc];W[ef]\r
+;B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c68.sgf b/regression/games/trevor/auto/c68.sgf
new file mode 100644 (file)
index 0000000..7c1d6ac
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cd];W[kk];B[kc];W[cj];B[jh];W[hk];B[ed];W[ej];B[kf];W[gc];B[fb]\r
+;W[cg];B[gd];W[hc];B[id];W[jb];B[hd];W[lh];B[lg];W[ki];B[fg];W[hi];B[df];W[hg]\r
+;B[dg];W[dh];B[bf];W[bg];B[kh];W[fi];B[li];W[lj];B[mh];W[cf];B[ji];W[be];B[bd]\r
+;W[ad];B[ac];W[ae];B[bb];W[kj];B[eh]C[E5];W[bh];B[di];W[dj];B[ch];W[ce];B[gf];W[ci]\r
+;B[kb];W[mj];B[gg];W[gh];B[de];W[jj];B[if];W[hf];B[mi];W[ig];B[ih];W[hh];B[jg]\r
+;W[ie];B[je];W[he];B[ii];W[ij];B[ge];W[dh];B[ei];W[fh];B[ch];W[fc];B[ib];W[dh]\r
+;B[eg];W[ch];B[jf];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c69.sgf b/regression/games/trevor/auto/c69.sgf
new file mode 100644 (file)
index 0000000..1004010
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[jk];W[kc];B[cc];W[df];B[ci];W[ck];B[ej];W[el];B[fc];W[hc];B[ji]\r
+;W[kg];B[lh]C[!M9];W[le];B[eh];W[ff];B[gk];W[hf];B[fl];W[bj];B[gb];W[dk];B[hi];W[hb]\r
+;B[be];W[ig];B[dd];W[fe];B[cg];W[ag];B[bg];W[gc];B[fb];W[bh];B[af];W[ah];B[bi]\r
+;W[ai];B[gg];W[ga];B[ee];W[ef];B[fd];W[de];B[lg];W[ek];B[lf];W[kf];B[me];W[ld]\r
+;B[ch];W[aj];B[em];W[dm];B[fm];W[md];B[mf];W[fk];B[gl];W[fj];B[gj];W[fi];B[ei]\r
+;W[fg];B[fh];W[gh];B[gi];W[hh];B[ih];W[hg];B[jh];W[gd];B[ed];W[ce];B[cj];W[bk]\r
+;B[cd];W[fa];B[ea];W[ha];B[eb];W[kh];B[ki];W[jg];B[dj];W[dg];B[cm];W[al];B[dl]\r
+;W[bm];B[cl];W[dh];B[cf];W[bl];B[dm];W[di];B[bf];W[eg];B[bd];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c70.sgf b/regression/games/trevor/auto/c70.sgf
new file mode 100644 (file)
index 0000000..a6dc9d2
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[ek]C[!D2];W[dl];B[dk]C[!E2];W[el];B[cc];W[jd];B[jj];W[kh];B[hc];W[jf]\r
+;B[jb];W[kc];B[fd];W[kb];B[fk]C[!C2];W[cl];B[fl];W[ck];B[dg];W[ib];B[hb];W[ja];B[li]\r
+;W[lh];B[hf];W[ki];B[kj];W[ci];B[bh];W[lj];B[lk];W[mi];B[ei];W[bi];B[hh];W[ch]\r
+;B[cg]C[!A6];W[ah];B[bg];W[mk];B[ll];W[ha];B[gb];W[fm];B[gm];W[em];B[hl]C[G13];W[dj]\r
+;B[ic];W[jc];B[if];W[ig];B[ih];W[jg];B[hg];W[ie];B[ml]C[G13];W[mj];B[ji];W[ga];B[fa]\r
+;W[ia];B[fb];W[ag];B[af];W[ai];B[bf];W[ej];B[fj];W[he];B[ge];W[di];B[eh];W[hd]\r
+;B[gd];W[id];B[dh];W[jh];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c72.sgf b/regression/games/trevor/auto/c72.sgf
new file mode 100644 (file)
index 0000000..0399f1f
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dj];W[jc];B[cd];W[kk];B[fc];W[je];B[kg];W[lf];B[kf];W[ke];B[ig]\r
+;W[fk];B[jj];W[jk];B[dh];W[ij];B[el]C[!H3];W[hk];B[lg];W[le];B[kj];W[lj];B[li]C[!L5]\r
+;W[ki];B[ji];W[mi];B[lh]C[!N4];W[mj];B[gi];W[gd];B[ii];W[fd];B[ed];W[gc];B[fb];W[gb]\r
+;B[ff];W[fa];B[eb];W[hf];B[gh];W[fl];B[ek];W[em];B[dm];W[fm];B[cl];W[fj];B[hj]\r
+;W[ik];B[gj];W[fi];B[fh];W[if];B[gk];W[gl];B[fe];W[hg];B[hh];W[jg];B[ih];W[jf]\r
+;B[ge]C[K6];W[mg];B[he];W[hd];B[ie];W[id];B[gg];W[jh];B[kh];W[ea];B[da];W[ga];B[db]\r
+;W[ei];B[di];W[eh];B[eg];W[gf];B[ej];W[hl];B[ki];W[mh];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c73.sgf b/regression/games/trevor/auto/c73.sgf
new file mode 100644 (file)
index 0000000..e1ed5f7
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dj];W[ch];B[cd];W[fk];B[kd];W[ck];B[kk];W[ei];B[hc];W[dk];B[ec]\r
+;W[jj];B[kj];W[ji];B[lh];W[il];B[jg];W[hh];B[hf];W[cf];B[be];W[bf];B[fe];W[fg]\r
+;B[jl];W[jk];B[kl];W[jm];B[af];W[ag];B[ae]C[C7];W[ig];B[if]C[C7];W[hg];B[bg];W[bh]\r
+;B[ah];W[bi];B[cg];W[dg];B[ce];W[ag];B[bg];W[de];B[gf];W[ai];B[ag];W[dd];B[dc]\r
+;W[ki];B[li];W[km];B[lm];W[im];B[ll];W[gg];B[jh];W[kh];B[kg];W[ih];B[ed];W[cg]\r
+;B[ee];W[df];B[ef];W[eg];B[ff];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c76.sgf b/regression/games/trevor/auto/c76.sgf
new file mode 100644 (file)
index 0000000..b4f5493
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[dc];B[kk];W[dk];B[di];W[ci];B[ch];W[cj];B[dh];W[fk];B[ce]\r
+;W[ed];B[bc];W[hc];B[hk];W[gl];B[id];W[hl];B[hd];W[gd];B[ib];W[hb];B[ge];W[fd]\r
+;B[cb];W[db];B[da];W[ea];B[gj];W[ef];B[fg];W[fj];B[fi];W[ca];B[jg];W[bb];B[cc]\r
+;W[jb];B[ic];W[ia];B[il];W[im];B[ab];W[ik];B[ij];W[jl];B[ba];W[kb];B[lb];W[kl]\r
+;B[ll];W[jk];B[kj];W[jj];B[ji];W[ii];B[hi];W[ki];B[li]C[K6];W[ih];B[jh];W[hj];B[la]\r
+;W[gk];B[ja];W[ig];B[ha]C[F12];W[gi];B[gb];W[gc];B[fb];W[gh];B[if];W[kh];B[kg];W[fh]\r
+;B[eg];W[bi];B[bh];W[lm];B[lk];W[eh];B[gg];W[hg];B[ei];W[hf];B[he];W[ej];B[gf]\r
+;W[ah];B[ag];W[ai];B[ml];W[jf];B[kf];W[ie];B[je];W[if];B[mm];W[km];B[dg];W[ke]\r
+;B[le];W[jd];B[lf];W[jc];B[kd];W[je];B[ka];W[bg];B[af];W[dj];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c77.sgf b/regression/games/trevor/auto/c77.sgf
new file mode 100644 (file)
index 0000000..666b2f5
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cj];W[kc];B[kk];W[cd];B[jf];W[hc];B[ek];W[ed];B[hk];W[cg];B[kh]\r
+;W[he];B[dh];W[jd];B[dg];W[ke];B[bh];W[df];B[bg];W[bf];B[lf];W[le];B[hg];W[kf]\r
+;B[fg];W[lg];B[lh];W[mh];B[mi];W[mg];B[lj];W[fe];B[af];W[ae];B[ag]C[B9];W[if];B[be]\r
+;W[bd];B[ad];W[ig];B[cf];W[bc];B[ih];W[ef];B[jg];W[je];B[kg];W[mf];B[ce];W[ac]\r
+;B[de];W[dd];B[ff];W[ee];B[gf];W[hf];B[eg];W[ge];B[ae];W[hh];B[gg];W[tt];B[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c78.sgf b/regression/games/trevor/auto/c78.sgf
new file mode 100644 (file)
index 0000000..b1c716d
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[dj];B[kd];W[cc];B[id];W[gc];B[dh];W[fj];B[cj];W[ck];B[ci]\r
+;W[bk];B[fh];W[ik];B[hb];W[ji];B[li];W[ec];B[ef];W[cf];B[kg];W[ge];B[jl];W[ai]\r
+;B[gg]C[!H3];W[hk];B[gm];W[ih];B[ig];W[ee];B[hh];W[ff];B[ii];W[jj];B[jh];W[fl];B[fm]\r
+;W[gl];B[hm];W[bh];B[df];W[de];B[gb];W[eg];B[eh];W[dg];B[fb];W[eb];B[fc];W[fd]\r
+;B[ea];W[da];B[fa];W[ch];B[ej];W[ei];B[ek];W[el];B[fi];W[fk];B[di];W[dk];B[db]\r
+;W[cb];B[ca];W[em];B[im];W[dc];B[da];W[hc];B[ic];W[hd];B[bb];W[bc];B[ei];W[ie]\r
+;B[kf];W[ab];B[hf];W[he];B[ba]C[K9];W[jf];B[gj];W[ke];B[le];W[je];B[hj];W[bj];B[ki]\r
+;W[kj];B[lj];W[jk];B[kl]C[K10];W[jg];B[jd];W[bi];B[il];W[fg];B[gf]C[J4];W[hl];B[if]C[J4]\r
+;W[gk];B[ij];W[gi];B[gh];W[dl];B[aa];W[ac];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c81.sgf b/regression/games/trevor/auto/c81.sgf
new file mode 100644 (file)
index 0000000..e517540
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cj];W[jk];B[kd];W[cd];B[fk];W[ec];B[hc];W[kh];B[cg];W[kf];B[le]\r
+;W[lf];B[be];W[hg];B[bd];W[bc];B[ac];W[bb];B[ie];W[ce];B[cf];W[hk];B[gl];W[hl]\r
+;B[eh];W[gj];B[ig];W[ih];B[fd];W[fj];B[ej]C[#Best to slide aroung G11 first.\r
+!G1];W[gm];B[fb]C[E12|F11];W[dc];B[de];W[eb]\r
+;B[ab];W[fc];B[gb];W[cb];B[da];W[ea];B[dd];W[ed];B[ee];W[fl];B[el];W[gk];B[hf]\r
+;W[em];B[hh];W[jg];B[gg];W[hi];B[cl];W[dl];B[ek];W[cm];B[dk];W[dm];B[bm];W[fm]\r
+;B[bl];W[me];B[md];W[mf];B[gh];W[ke];B[ld];W[fi];B[je];W[jf];B[if];W[fh];B[fg]\r
+;W[ei];B[di];W[gi];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c82.sgf b/regression/games/trevor/auto/c82.sgf
new file mode 100644 (file)
index 0000000..bafc202
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[kd];B[cd];W[ic];B[fc];W[ck];B[dj];W[dk];B[ej];W[bi];B[ek]\r
+;W[jj];B[jk];W[ij];B[hl];W[kg];B[cj];W[bj];B[dl];W[cl];B[el];W[li];B[bg];W[al]\r
+;B[gi];W[hh];B[hb];W[ib];B[ge];W[if];B[eg];W[gb];B[fb];W[hc];B[lj];W[fa];B[ea]\r
+;W[ga];B[db];W[kj];B[lk];W[hi];B[mi];W[lh];B[ci];W[mh];B[bh];W[bm];B[mj];W[gj]\r
+;B[gh];W[gf];B[ff];W[gg];B[fi];W[he];B[gd]C[!G3];W[gl];B[hk];W[hj];B[gk];W[fj];B[fg]\r
+;W[hd];B[ai];W[aj];B[ah];W[ik];B[il];W[fk];B[fl];W[dm];B[gc];W[ha];B[em];W[cm]\r
+;B[tt]C[PASS];W[bk];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c83.sgf b/regression/games/trevor/auto/c83.sgf
new file mode 100644 (file)
index 0000000..01964e5
--- /dev/null
@@ -0,0 +1,12 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kj];W[ik];B[jh];W[fk];B[ec];W[jd];B[cd];W[cj];B[hc];W[hh];B[jf]\r
+;W[ie];B[kc];W[jc];B[jl]C[L10];W[kb];B[kd];W[ke];B[lb];W[lc];B[ld];W[le];B[md];W[la]\r
+;B[mc];W[ib];B[je];W[kg];B[mb];W[hd];B[kh];W[lg];B[jg];W[lh];B[lf];W[kf];B[li]\r
+;W[mf];B[mh];W[ka];B[cg];W[il];B[hg];W[jk];B[gg];W[kk];B[lk];W[kl];B[gb];W[fi]\r
+;B[bi];W[bj];B[ci];W[ii];B[fe];W[ai];B[ah];W[aj];B[eg];W[bh];B[ch];W[bg];B[dj]\r
+;W[dk];B[bf];W[ag];B[ej];W[ek];B[fj];W[gj];B[ei];W[eh];B[di]C[A8];W[fh];B[ic]C[J10]\r
+;W[gc];B[hb];W[id];B[gd]C[N13];W[ih];B[he];W[if];B[ig];W[jb];B[hf];W[ia];B[gh];W[me]\r
+;B[mg];W[mi];B[ha];W[fb];B[fc];W[dg];B[mh];W[cf];B[ce];W[df];B[af];W[dh];B[be]\r
+;W[mj];B[ll];W[fg];B[gi];W[ff];B[hi];W[ji];B[jj];W[ij];B[lj]C[L5];W[lm];B[ki];W[de]\r
+;B[hj];W[hk];B[ee];W[dd];B[dc];W[ef];B[ed];W[gf];B[ge];W[ml];B[mk];W[km];B[mm]\r
+;W[ga];B[gc];W[ml];B[fj];W[gk];B[mm]C[C11];W[ad];B[cc];W[ml];B[tt];W[mm];B[tt];W[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/c84.sgf b/regression/games/trevor/auto/c84.sgf
new file mode 100644 (file)
index 0000000..6a4f35f
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dk];W[cd];B[jc];W[kk];B[ch];W[fc];B[je];W[kg];B[lf];W[ki];B[gk]\r
+;W[hj];B[il];W[hh];B[fh];W[hc];B[ib];W[hb];B[bf];W[be];B[df];W[gj];B[dd];W[dc]\r
+;B[ce];W[bd];B[ge];W[ed];B[de];W[jl];B[fj];W[ik];B[hd];W[hl];B[gl];W[gm];B[fm]\r
+;W[hm];B[hk];W[im];B[fl];W[af];B[ag];W[lg];B[gg];W[kf];B[le];W[gd];B[id]C[A9];W[fe]\r
+;B[gf];W[ae];B[bg];W[ia];B[ja];W[ha];B[mg];W[mh];B[mf];W[ke];B[lh]C[M10];W[kd];B[ld]\r
+;W[ic];B[jb]C[L11];W[jd];B[kc];W[he];B[kh];W[ie];B[jh];W[ig];B[li];W[lj];B[ji];W[kj]\r
+;B[gi];W[hi];B[gh];W[jg];B[jj];W[ij];B[mj];W[mk];B[mi];W[jk];B[hf];W[if];B[ff]\r
+;W[ee];B[ef];W[lc];B[lb]C[!M13];W[la];B[mc];W[hg];B[ii];W[ih];B[mh];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c86.sgf b/regression/games/trevor/auto/c86.sgf
new file mode 100644 (file)
index 0000000..30273eb
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[ck];B[kj];W[cc];B[ij];W[gk];B[df];W[fc];B[hc];W[ch];B[ff]\r
+;W[fi];B[hl];W[gl];B[kg];W[hk];B[il];W[gb];B[hb];W[cf];B[ce];W[de];B[ee];W[dd]\r
+;B[cg];W[bf];B[dh];W[eg];B[fg];W[eh];B[gc];W[ef];B[fb];W[eb];B[ga];W[ea];B[gh]\r
+;W[fe];B[ge];W[fd];B[gm];W[fm];B[hm]C[E2|F2|F3];W[em];B[fa];W[ik];B[jl];W[jk];B[kk];W[jj]\r
+;B[hj];W[ji];B[hf];W[ki];B[ii];W[lh];B[ll];W[lf];B[je];W[lj];B[lk];W[ih];B[hh]\r
+;W[ig];B[ld];W[kf];B[mj];W[li];B[gj];W[fj];B[if];W[jf];B[le];W[hg];B[gg];W[ke]\r
+;B[gi];W[jd];B[ie];W[kd];B[jc];W[me];B[lc];W[id];B[ic];W[hd];B[gd];W[mi];B[mk]\r
+;W[md];B[mc];W[mf];B[he];W[jg];B[fh];W[ci];B[ei];W[ed];B[dg];W[ee];B[tt];W[di]\r
+;B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c88.sgf b/regression/games/trevor/auto/c88.sgf
new file mode 100644 (file)
index 0000000..ccd4a72
--- /dev/null
@@ -0,0 +1,8 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kj];W[cc];B[dj];W[ke];B[kc];W[id];B[ib];W[kh];B[ij];W[if];B[dd]\r
+;W[dc];B[ed];W[be];B[dg];W[lj];B[li];W[ki];B[lk];W[jj];B[kk];W[fb];B[ji];W[ld]\r
+;B[jh];W[lc];B[gc];W[lh];B[mj];W[kb];B[jg];W[kf];B[fc];W[fe];B[eb];W[ic];B[jb]\r
+;W[jc];B[cd];W[bc];B[hc];W[db];B[ea];W[bg];B[ge];W[bi];B[hg];W[ck];B[dk];W[dl]\r
+;B[el];W[cl];B[dh];W[em];B[fl];W[ja];B[ia];W[ka];B[ga];W[cj];B[mh];W[di];B[ei]\r
+;W[lg];B[ci];W[mg];B[bh];W[ah];B[ch];W[bd];B[cg]C[C8];W[ai];B[hf];W[cf];B[df];W[ce]\r
+;B[jf];W[je];B[mi]C[F1];W[hd];B[gd];W[fm];B[gm];W[dm];B[gl];W[kg];B[he];W[ie];B[da]\r
+;W[ca];B[de];W[ec];B[fa];W[hb];B[gb];W[ha];B[ig];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c90.sgf b/regression/games/trevor/auto/c90.sgf
new file mode 100644 (file)
index 0000000..66ba2f2
--- /dev/null
@@ -0,0 +1,7 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[cj];W[jj];B[cd];W[kd];B[ic];W[gc];B[ie];W[jf];B[jb];W[ek];B[di]\r
+;W[gj];B[kk];W[jk];B[kj];W[ki];B[li];W[kh];B[lh];W[jg];B[ge];W[lg];B[mj];W[kl]\r
+;B[ll];W[lk];B[lj];W[lm];B[mk];W[il];B[mh];W[ml];B[mm]C[!N7];W[mg];B[km];W[lb];B[hb]\r
+;W[cl];B[fh];W[gh];B[gg];W[bk];B[bj];W[hg];B[gf];W[gi];B[ed];W[aj];B[ai];W[ak]\r
+;B[bi];W[jl];B[kb];W[kc];B[la];W[mb];B[ck];W[bl];B[ej];W[fk];B[dk];W[dl];B[je]\r
+;W[ke];B[fi];W[jm];B[jd];W[hf];B[he];W[if];B[lm];W[fj];B[jc];W[lc];B[ka];W[ma]\r
+;B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c91.sgf b/regression/games/trevor/auto/c91.sgf
new file mode 100644 (file)
index 0000000..a8ea27d
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kj];W[cd];B[dk];W[kc];B[ch];W[ij];B[ik];W[hk];B[jk];W[hj];B[kh]\r
+;W[kf];B[ec];W[gc];B[ee];W[db];B[dc];W[cc];B[eb];W[cf];B[cb];W[bb];B[da];W[dg]\r
+;B[lg];W[gb];B[ba];W[bc];B[ff];W[hf];B[eh];W[bg];B[bh];W[ef];B[be];W[de];B[fe]\r
+;W[fg];B[eg];W[dh];B[df];W[ci];B[ef];W[bi];B[he];W[fj];B[ic];W[id];B[ih];W[ei]\r
+;B[if];W[ib];B[fh];W[lf];B[hd];W[hc];B[hg];W[il];B[jl];W[hl];B[ab];W[dd];B[ed]\r
+;W[bf];B[aa];W[jm];B[km];W[im];B[kl];W[ac];B[ca];W[mg];B[mh];W[mf];B[ie];W[jd]\r
+;B[fb];W[kg];B[lh];W[gd];B[ga];W[ha];B[fa];W[je];B[ge];W[ii];B[ji];W[hi];B[gh]\r
+;W[gi];B[el]C[!D1];W[dm];B[jf];W[jg];B[jh];W[fi];B[jj];W[ig];B[hh];W[fd];B[fc];W[jc]\r
+;B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/c93.sgf b/regression/games/trevor/auto/c93.sgf
new file mode 100644 (file)
index 0000000..d331ffd
--- /dev/null
@@ -0,0 +1,6 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kk];W[cc];B[kc];W[ck];B[fj];W[ch];B[dd];W[cd];B[de];W[bf];B[eb]\r
+;W[jd];B[jc];W[id];B[le];W[jg];B[hb];W[jj];B[kj];W[ji];B[lh];W[fl];B[fd];W[kf]\r
+;B[il];W[lf];B[kd];W[db];B[ea];W[dj];B[hj];W[hg];B[fg]C[!E11];W[ec];B[dc];W[cb];B[ge]\r
+;W[ej];B[ih];W[dg];B[fk];W[el];B[fh];W[ce];B[je];W[ke];B[ig];W[da];B[fc];W[gl]\r
+;B[ie];W[ek];B[ik];W[hl];B[hi];W[im];B[jm];W[hm];B[kl];W[ei];B[df];W[fi];B[gi]\r
+;W[eg];B[jh];W[eh];B[ef];W[gk];B[gj];W[cf];B[hk];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/c94.sgf b/regression/games/trevor/auto/c94.sgf
new file mode 100644 (file)
index 0000000..fe8052d
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[kc];W[dj];B[ed];W[jj];B[cd];W[gc];B[fb];W[jd];B[jc];W[cg];B[fk]\r
+;W[el];B[gj]C[!G2];W[gl];B[gh];W[jg];B[hc];W[gf];B[gd];W[de];B[dd];W[ce];B[le]C[!K8]\r
+;W[jf];B[ff];W[gg];B[fi]C[F7];W[lg];B[fg];W[dh];B[kk];W[kj];B[jk];W[ik];B[il];W[hj]\r
+;B[hk];W[ij];B[hl];W[ih];B[ek];W[dk];B[fl];W[dl];B[em];W[bd];B[bc];W[be];B[ie]\r
+;W[if];B[je];W[ac];B[bb];W[lk];B[ll];W[kl];B[jl];W[ml];B[km];W[mk];B[hh];W[dm]\r
+;B[fm];W[he];B[id];W[hg];B[hi];W[kf];B[lf];W[mf];B[ke];W[me];B[md];W[mg];B[kd]\r
+;W[ii];B[ge];W[ee];B[fe];W[ab];B[ef];W[ba];B[ca];W[cb];B[aa];W[ad];B[ba];W[ei]\r
+;B[ej];W[eh];B[fh];W[df];B[eg];W[dg];B[lm];W[hf];B[li];W[lj];B[hd];W[mm];B[tt]\r
+;W[tt])\r
diff --git a/regression/games/trevor/auto/c96.sgf b/regression/games/trevor/auto/c96.sgf
new file mode 100644 (file)
index 0000000..3a66e3b
--- /dev/null
@@ -0,0 +1,9 @@
+(;FF[4]GM[1]SZ[13]HA[0]KM[5.5];B[dd];W[jd];B[kk];W[ck];B[dj];W[cj];B[dk];W[fc];B[ci];W[bi];B[ch]\r
+;W[bh];B[cg];W[dl];B[el];W[cl];B[fk];W[jj];B[jk];W[ij];B[li];W[jg];B[hk];W[hd]\r
+;B[kc]C[L10];W[db];B[kd];W[cc];B[cd];W[fe];B[ib];W[hg];B[gh];W[bd];B[be];W[bc];B[lf]\r
+;W[gb];B[je];W[ie];B[fg];W[ke];B[le];W[kf];B[ef];W[lg];B[ad];W[ac];B[ae];W[ik]\r
+;B[il];W[jc];B[jb];W[ic];B[hc];W[jf];B[hb];W[mf];B[md];W[bg];B[gc];W[fb];B[ec]\r
+;W[cf];B[ce];W[gd];B[bf];W[ee];B[hj];W[eb];B[ii];W[ji];B[ih];W[ki];B[lh];W[hh]\r
+;B[kh]C[K6];W[kg];B[jh];W[gg];B[gi];W[ff];B[df];W[ig];B[mh];W[mg];B[ld];W[ha];B[de]\r
+;W[ia];B[lb]C[K13];W[ka];B[la];W[ja];B[kb];W[ga];B[ag];W[em];B[fm];W[dm];B[ah];W[ai]\r
+;B[af];W[bj];B[ed];W[fd];B[hi];W[dc];B[eg];W[me];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/d01.sgf b/regression/games/trevor/auto/d01.sgf
new file mode 100644 (file)
index 0000000..9114de9
--- /dev/null
@@ -0,0 +1,19 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[ce];W[pp];B[eq];W[pc];B[qe];W[od];B[pg];W[qd];B[pe];W[cc];B[ed]\r
+;W[eb];B[cp];W[cj];B[nq];W[qn];B[pr];W[qq];B[kq];W[qi];B[ch]C[#Extend along side bigger.  Probably C7\r
+!E10];W[ej];B[cl];W[gj]\r
+;B[ef];W[oi];B[ng]C[#Other moves possible, !P6\r
+N16];W[on];B[lg];W[nl];B[hq];W[lc];B[bj];W[bi];B[ci]C[B9];W[ic]\r
+;B[dj];W[qr];B[ei];W[or];B[nr];W[fc];B[fm];W[bd];B[ni]C[!O9];W[nk];B[jg];W[rg];B[he]\r
+;W[ke];B[kj]C[# around L7|L8 looks right.\r
+!N15];W[me];B[hk]C[!F9];W[fk];B[jk];W[mo];B[gl];W[lm];B[em];W[jn];B[ho]\r
+;W[ps];B[be];W[re];B[jp];W[ns];B[nj];W[oj];B[lk];W[ae];B[af];W[ad];B[bg];W[ms]\r
+;B[mp];W[ks];B[ir];W[qf];B[pf];W[lp];B[lq];W[np];B[mq];W[oq];B[lo];W[mn];B[im]\r
+;W[ie];B[gf];W[ig];B[hg];W[if];B[hi];W[ih];B[hh];W[jh];B[jm];W[km];B[kh];W[jf]\r
+;B[ko];W[kn];B[kg];W[mk];B[dc];W[db];B[dd];W[in];B[hn];W[ji];B[qg];W[rf];B[hd]\r
+;W[ki];B[li];W[hc];B[ll];W[fd];B[fe];W[kl];B[gd];W[oe];B[gc];W[gb];B[qh];W[rh]\r
+;B[mj];W[oh];B[nf];W[nh];B[mh];W[mf];B[mg];W[cd];B[ne];W[nd];B[ph];W[ec];B[pi]\r
+;W[pj];B[ml];W[id];B[hf]C[N7];W[lf];B[mm];W[ln];B[nm]C[Q8];W[om];B[ok];W[ol];B[qj]\r
+;W[qk];B[ri]C[S9];W[nn];B[rk];W[ql];B[rl];W[rm];B[sm];W[sn];B[sl];W[kk];B[lj];W[si]\r
+;B[io];W[jl];B[il];W[is];B[hs];W[js];B[jr];W[ii];B[hj];W[jj];B[ik];W[kf];B[kr]\r
+;W[ls];B[jo];W[pd];B[og];W[pk];B[ij]C[T10];W[of];B[mr];W[os];B[lr];W[sj];B[rj];W[sh]\r
+;B[qi];W[sk];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/d02.sgf b/regression/games/trevor/auto/d02.sgf
new file mode 100644 (file)
index 0000000..91410f5
--- /dev/null
@@ -0,0 +1,25 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pd];W[pp];B[dd];W[dp];B[cn];W[fq];B[bp];W[cq];B[ck];W[qf];B[hq]\r
+;W[bq];B[qn];W[fc];B[df];W[db];B[hc];W[cc];B[ec];W[eb];B[fd];W[gd];B[gc];W[fb]\r
+;B[ge];W[np];B[hd];W[jq];B[ld];W[qi];B[rp];W[ql];B[qq];W[qo];B[ro];W[pn];B[pm]\r
+;W[qm];B[rn];W[om];B[ch];W[pl];B[or];W[bo];B[bn];W[cd];B[nd];W[rd];B[qc];W[ap]\r
+;B[og]C[# Other moves possible.  Time to reduce black, or play at the boundary, something like O11 or E6 are better than P10\r
+O11|E6];W[oj];B[rc];W[bf];B[cf];W[bg];B[bh]C[!C15];W[ce];B[ni];W[en];B[re];W[rf]\r
+;B[el]C[#Other moves possible.\r
+M10|L10|K10|K9|J10|J9];W[qe];B[gr];W[ir];B[ho]C[#Other moves possible.  !F2\r
+G6];W[fr];B[io];W[lp];B[il]C[#Must reduce the moyo.\r
+!T17];W[sc];B[mr];W[jo]\r
+;B[im];W[jn];B[kl]C[#Other moves also possible.\r
+#N10|M9 are good shape moves.\r
+N10|M9];W[lm];B[oe];W[mk];B[li];W[kk];B[jk];W[kj];B[jh];W[fm];B[hl]\r
+;W[fl];B[fk];W[hr];B[gb];W[gq];B[ip];W[an];B[am];W[ao];B[bm];W[rb];B[qb];W[rm]\r
+;B[em];W[gn];B[ra];W[sb];B[kr];W[jm];B[jl];W[de];B[ee];W[ki];B[kh];W[nj];B[lj]\r
+;W[lk];B[gp];W[mi];B[mh];W[mj];B[lh];W[nh];B[ng];W[oh];B[ph];W[oi];B[qg];W[rg]\r
+;B[qh];W[rh];B[co];W[cp];B[jr];W[kq];B[lq];W[mq];B[lr];W[nr];B[ns];W[nq];B[iq]\r
+;W[pi];B[pg]C[Q2];W[oq];B[pr];W[fp];B[is];W[gs];B[go];W[fo];B[js]C[#Set up big ko.\r
+G8];W[qp];B[do]\r
+;W[jp];B[hs];W[gr];B[gl];W[ll];B[eo];W[cg];B[dg];W[dh];B[ag]C[!E13];W[eg];B[ef];W[be]\r
+;B[eh];W[ep];B[dn];W[fn];B[km];W[kn];B[pf];W[sn];B[fa];W[so];B[rq];W[ea];B[ga]\r
+;W[af];B[ah];W[ji];B[fg];W[ii];B[hg];W[gi];B[fj];W[fi];B[ei];W[ih];B[ig];W[hh]\r
+;B[hj];W[gj];B[gk];W[ij];B[ik];W[gg];B[gf];W[gh];B[hn];W[gm];B[pe];W[sp];B[sq]\r
+;W[sm];B[pq];W[qd];B[fh];W[dc];B[ed];W[hi];B[hk];W[in];B[hm];W[sd];B[qa];W[sa]\r
+;B[jj];W[pc];B[pb];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d03.sgf b/regression/games/trevor/auto/d03.sgf
new file mode 100644 (file)
index 0000000..6eb9861
--- /dev/null
@@ -0,0 +1,21 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pp];W[qd];B[cp];W[ec];B[oc];W[pe];B[md];W[pc];B[od];W[ep];B[dn]\r
+;W[cq];B[bq];W[dq];B[bo];W[iq];B[cc];W[de];B[be];W[nq];B[lq];W[qq];B[pq];W[qp]\r
+;B[po];W[pr];B[or];W[qr];B[oq];W[qn];B[om];W[hc];B[jc];W[gp];B[np]C[!Q8];W[pl];B[ie]\r
+;W[ol];B[ge];W[fd];B[cg];W[br];B[cj];W[db];B[el];W[fm];B[ng];W[oi];B[lh];W[og]\r
+;B[oh];W[ph];B[nh];W[ib];B[jb];W[kr];B[kq];W[jq];B[lr];W[eg];B[jr];W[ir];B[ks]\r
+;W[mk];B[ei];W[kk];B[hh];W[ik];B[ji];W[ln];B[gk];W[aq];B[hl];W[bp];B[pd];W[pb]\r
+;B[qe];W[qf];B[re];W[rd];B[pf];W[rf];B[oe];W[se];B[ob]C[Q15];W[ao];B[qc]C[S17];W[qb]\r
+;B[rc];W[pe];B[rb];W[hn];B[pg];W[qg];B[qe]C[B6];W[co];B[bn];W[cn];B[cm];W[dp];B[bm]\r
+;W[bb];B[hi];W[bc];B[fn];W[ce];B[bd];W[cd];B[cf];W[em];B[en];W[gm];B[dm];W[hm]\r
+;B[il];W[jn];B[gg];W[hk];B[jl];W[jk];B[kl];W[gl];B[ll];W[lk];B[mm];W[gj];B[fk]\r
+;W[fj];B[eh];W[ek];B[mn];W[fh];B[fg];W[pi];B[ef];W[dl];B[lo];W[ko];B[qo];W[ro]\r
+;B[kp];W[jp];B[ic];W[hb];B[is];W[hr];B[nl];W[nk];B[ml];W[hs];B[fi];W[ad];B[af]\r
+;W[dj];B[ck];W[dk];B[di];W[fe];B[ee];W[ed];B[df]C[D16];W[ca];B[dd];W[ff];B[cl];W[ej]\r
+;B[js];W[gf];B[hf];W[gd];B[hd];W[pn];B[on];W[pm];B[gi]C[H10];W[fl];B[go];W[ho];B[fp]\r
+;W[fq];B[fo];W[sc];B[ra];W[os];B[nr];W[im];B[do];W[cp];B[he];W[ja];B[ka];W[ia]\r
+;B[ni];W[mi];B[li];W[lj];B[nj];W[mj];B[oj];W[pj];B[ok];W[pk];B[mh];W[ki];B[kh]\r
+;W[kj];B[ns];W[ps];B[dc]C[F18];W[gc];B[cb];W[fb];B[ac];W[ab];B[ae];W[ba];B[hj];W[ij]\r
+;B[ii];W[an];B[am];W[ap];B[sb];W[sd];B[ac];W[qa];B[pa];W[ad];B[jj];W[gk];B[ac]\r
+;W[cd];B[ce];W[ad];B[da];W[ea];B[ac];W[ls];B[ms];W[ad];B[sf];W[sg];B[ac];W[kb]\r
+;B[la];W[ad];B[kc];W[ac];B[jm];W[re];B[pe];W[eo];B[lm];W[kn];B[gn];W[km];B[mo]\r
+;W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d08.sgf b/regression/games/trevor/auto/d08.sgf
new file mode 100644 (file)
index 0000000..a305a61
--- /dev/null
@@ -0,0 +1,25 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dd];W[dp];B[pq];W[qd];B[oc];W[ld];B[nd];W[pf];B[qb];W[qj];B[cn]
+;W[qo];B[op];W[pm];B[ck];W[fc];B[cf];W[db];B[cc];W[ic];B[fq];W[fp];B[gp];W[fo]
+;B[cq];W[eq];B[cp];W[gq];B[ho];W[fr];B[hq];W[hr];B[ek];W[dg];B[cg];W[oj];B[dh]
+;W[mg];B[cb];W[iq];B[qp];W[po];B[hm];W[hk];B[mc];W[lc];B[ip]C[K3|K4];W[dr];B[rd];W[rc]
+;B[qc];W[re];B[pd];W[qe];B[eb];W[fb];B[jq];W[ir];B[kp];W[mn];B[mp];W[ec];B[jr]
+;W[ca];B[il]C[#K10 better than J9
+!J9];W[ik];B[kn]C[# L9 or close is better.
+!G15];W[ge];B[kl]C[# L10 or H12 required.
+!N9];W[mk];B[kj]C[H12|J12|J11|H11];W[mi];B[gj];W[jh]
+;B[gg];W[em];B[hf];W[je];B[cl];W[mb];B[nb];W[rb];B[lb];W[kb];B[ma];W[mm];B[hh]
+;W[lh];B[ba];W[da];B[ef];W[me];B[bb];W[jj];B[ro];W[rn];B[rp];W[jg];B[cr];W[js]
+;B[ks];W[is];B[lr];W[qa];B[pa];W[ra];B[pb];W[cs];B[bs];W[ds];B[br];W[lj];B[sn]C[S7]
+;W[sm];B[rm];W[qn];B[sl]C[S9];W[ka];B[sj];W[ri];B[oo];W[on];B[kk];W[ql];B[ki];W[ji]
+;B[ne];W[nf];B[ed];W[oe];B[he];W[hd];B[do];W[fm];B[gl];W[gk];B[fl];W[rk];B[sk]
+;W[no];B[hj];W[np];B[nq];W[gn];B[jk];W[ij];B[ie];W[hp];B[dc]C[E19];W[go];B[ea];W[io]
+;B[hn];W[jp];B[jf];W[kf];B[jd];W[ke];B[id];W[jc];B[gd];W[fd];B[hc];W[hb];B[fe]
+;W[gc];B[hd];W[gb];B[ig];W[ko];B[lo];W[kq];B[jo];W[kr];B[in];W[lq];B[mq];W[mr]
+;B[nr];W[ls];B[en];W[dm];B[eo];W[cm];B[bm];W[ns];B[or];W[ip];B[pp];W[qm];B[si]
+;W[rh];B[sh];W[sg];B[la];W[lp];B[mo];W[nn];B[ko];W[kh];B[dl];W[hi];B[gi];W[fk]
+;B[ii]C[F10];W[ih];B[el];W[fj];B[if];W[fi];B[dj];W[fh];B[hi]C[G12|F13];W[eg];B[fg];W[eh]
+;B[ei];W[df];B[gh];W[ej];B[di];W[de];B[ce];W[ee];B[ff];W[od];B[md];W[os];B[ps]
+;W[ms];B[lm]C[F19];W[lk];B[ll];W[ml];B[kd];W[kc];B[fa];W[dn];B[bn]C[J18];W[dq];B[ga]
+;W[ia];B[ha];W[ib];B[rg];W[sf];B[hl];W[gm];B[ln];W[pe];B[pc];W[rj];B[sm];W[li]
+;B[fn];W[ep];B[co];W[rl];B[so];W[tt];B[tt])
+
diff --git a/regression/games/trevor/auto/d12.sgf b/regression/games/trevor/auto/d12.sgf
new file mode 100644 (file)
index 0000000..bec0a4a
--- /dev/null
@@ -0,0 +1,15 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pd];W[dp];B[pp];W[ec];B[cj];W[qn];B[fq];W[cd];B[ql];W[qq];B[qp]\r
+;W[pq];B[op];W[rp];B[oq]C[S3|S5];W[qf];B[ro];W[rq];B[rn];W[or];B[nr];W[ps];B[qh];W[qc]\r
+;B[qd];W[pc];B[od];W[rd];B[re];W[rc];B[rf];W[nc];B[me];W[qo];B[qm];W[hq];B[cq]\r
+;W[dq];B[cp]C[D5];W[gp];B[do];W[dr];B[cr];W[eo];B[dn];W[gn];B[dl];W[id];B[cg];W[ld]\r
+;B[ep]C[E3];W[fe];B[fp];W[fo];B[fr];W[fl];B[lq];W[jo];B[lo];W[bf];B[cf];W[bg];B[ch]\r
+;W[bh];B[bi]C[!C15];W[ce];B[km];W[im];B[kk];W[jr];B[lh];W[le];B[mf];W[kg];B[fi];W[kh]\r
+;B[li];W[gg];B[eg];W[hi];B[ki];W[ji];B[ik];W[ns];B[oc];W[ob];B[hr];W[lr];B[mr]\r
+;W[kr];B[ms];W[gq];B[sp];W[rs];B[gr];W[hk];B[jj];W[ij];B[il];W[fj];B[ko];W[fh]\r
+;B[jp];W[iq];B[io];W[hl];B[jm];W[jl];B[jk];W[qe];B[qg];W[eh];B[hm];W[gm];B[hn]\r
+;W[ei];B[nd];W[mc];B[po];W[sq];B[ee];W[so];B[ff];W[ge];B[gf];W[hf];B[sn];W[se]\r
+;B[sg];W[de];B[ed];W[fd];B[df];W[ho];B[in];W[os];B[ip];W[fg];B[ef];W[lg];B[mg]\r
+;W[lf];B[ls];W[ir];B[dh];W[di];B[ci];W[hs];B[en];W[gs];B[es];W[el];B[ah];W[fn]\r
+;B[ag];W[ae];B[em];W[kq];B[lp];W[fm];B[dd];W[dc];B[ks];W[dj];B[dk];W[ek];B[js]\r
+;W[is];B[ds];W[sp];B[sf];W[sd];B[fs];W[hp];B[jq];W[af];B[ai];W[ad];B[md];W[go]\r
+;B[kp];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d24.sgf b/regression/games/trevor/auto/d24.sgf
new file mode 100644 (file)
index 0000000..f394543
--- /dev/null
@@ -0,0 +1,22 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pc];W[dd];B[pp];W[dq];B[qi];W[nq];B[do];W[dl];B[fo];W[fq];B[ho]\r
+;W[hq];B[di];W[qe];B[od];W[kq];B[pf];W[rc];B[fc];W[hc];B[cc];W[dc];B[cd]C[D15];W[gd]\r
+;B[kc];W[qn];B[oo];W[qq];B[om];W[qp];B[de];W[db];B[cb];W[ee];B[df];W[he];B[ck]\r
+;W[jd];B[le];W[qk];B[ed];W[ec];B[fd];W[fb];B[fe];W[gc];B[ef];W[qf];B[cp];W[fl]\r
+;B[cl]C[!F7];W[fm];B[fn];W[fj];B[dm];W[po];B[pn];W[qo];B[qm];W[rm];B[pk];W[br];B[bq]\r
+;W[cq];B[ql]C[S8];W[bp];B[rl];W[qb];B[bo];W[ob];B[rn];W[ro];B[ap];W[sn];B[ln];W[rh]\r
+;B[qh];W[rk];B[ri]C[T8];W[jo];B[sl];W[jb];B[rg];W[mb];B[kb];W[fh];B[kk];W[ii];B[lh]\r
+;W[ik];B[jg];W[hm];B[jm];W[lp];B[hg];W[ig];B[da]C[E18];W[ih];B[eb];W[kj];B[lj];W[jf]\r
+;B[gb];W[hb];B[fa];W[gf];B[ki];W[kg];B[mc];W[jj];B[oq];W[or];B[ar];W[bs];B[in]\r
+;W[nc];B[nd];W[lc];B[ld];W[md];B[me];W[kd];B[ko];W[lg];B[mg];W[kn];B[km];W[kp]\r
+;B[jn];W[pq];B[op];W[ip];B[lo];W[rf];B[sg];W[em];B[dk];W[dn];B[cm];W[en];B[el]\r
+;W[eo];B[fk];W[gk];B[ek];W[gn];B[go];W[dp];B[co];W[hn];B[io];W[mo];B[mn];W[no]\r
+;B[nn];W[np];B[on];W[oc];B[jp];W[jq];B[pe];W[qd];B[pd];W[jl];B[sm];W[kl];B[ll]\r
+;W[cn];B[bn];W[mc];B[gj];W[hj];B[il]C[K9];W[hl];B[jk];W[ej];B[ji]C[R13];W[ij];B[jh]C[!N14]\r
+;W[mf];B[lf];W[ke];B[fg];W[gg];B[eh];W[ei];B[dj];W[gi];B[pb];W[pa];B[fp];W[hp]\r
+;B[ep];W[eq];B[gp];W[gq];B[sf];W[se];B[qg];W[rd];B[im];W[rn];B[ha];W[ia];B[ga]\r
+;W[ff];B[eg];W[jo];B[gl];W[gm];B[jp]C[#L14 is ko threat for both.\r
+L14];W[mi];B[mh];W[jo];B[cr]C[D2];W[cs];B[jp]C[#M11 loses points.\r
+!M11]\r
+;W[li];B[kh];W[kf];B[nf];W[jo];B[dr]C[E2];W[ds];B[jp];W[ne];B[oe];W[jo];B[er];W[es]\r
+;B[jp];W[lk];B[mk];W[jo];B[fr];W[fs];B[jp];W[mj];B[lk];W[jo];B[gr]C[H2];W[gs];B[jp]\r
+;W[hr];B[jo];W[ge];B[qc];W[as];B[aq];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d25.sgf b/regression/games/trevor/auto/d25.sgf
new file mode 100644 (file)
index 0000000..9dc0124
--- /dev/null
@@ -0,0 +1,19 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dp];W[pd];B[qp];W[dd];B[nc];W[qf];B[pb];W[qc];B[kc];W[oq];B[lp]\r
+;W[po];B[qh];W[qb];B[qo];W[pn];B[qn];W[pm];B[rl];W[fq];B[fc];W[mo];B[cn];W[dr]\r
+;B[cq];W[iq];B[cf];W[fd];B[gd];W[fe];B[cc];W[ec];B[cd];W[gc];B[fg];W[fb];B[dj]\r
+;W[ob];B[nb];W[pa];B[ko];W[pk];B[qj];W[lr];B[km];W[rg];B[ll];W[db];B[cr];W[qr]\r
+;B[hn];W[rq];B[hd];W[ib];B[hf];W[na];B[er];W[fr];B[nm];W[ne];B[jc];W[eq];B[ke]\r
+;W[cs];B[no];W[pp];B[mp];W[qm];B[mr];W[rm];B[oh];W[rk];B[kr];W[jr];B[ks];W[fo]\r
+;B[dl];W[fm];B[fl];W[em];B[ef];W[nk];B[ng];W[kq];B[lq];W[bb];B[mj];W[mb];B[mc]\r
+;W[lb];B[jb];W[lc];B[md];W[ld];B[hh];W[me];B[hb];W[br];B[bq];W[hp];B[gm];W[lf]\r
+;B[kg];W[js];B[ls];W[kf];B[lg];W[mg];B[mh];W[mf];B[jf];W[el];B[fk]C[E9];W[nr];B[ar]\r
+;W[bs];B[ek];W[gb];B[ia];W[rj];B[ri];W[of];B[cb];W[ca];B[sj];W[qk];B[sk];W[pj]\r
+;B[qi];W[ql];B[sl];W[sm];B[si];W[pi];B[ph];W[hc];B[ic];W[bc];B[bd];W[ac];B[ad]\r
+;W[ge];B[nq];W[he];B[or];W[pr];B[ns];W[id];B[ie];W[jd];B[kd];W[dm];B[cm];W[mk]\r
+;B[lk];W[oi];B[dn];W[eo];B[jp];W[jq];B[ho];W[ip];B[io];W[gn];B[ep];W[cl];B[dk]\r
+;W[go];B[fp];W[gp];B[en];W[fn];B[nj];W[hm];B[gl]C[O11];W[oj];B[ol]C[O11];W[lj];B[ni]\r
+;W[ok];B[kb];W[do];B[co];W[dq];B[cp];W[kp];B[jo];W[op];B[om];W[gf];B[gg];W[ml]\r
+;B[mm];W[de];B[df];W[ce];B[be];W[ee];B[la];W[ma];B[ka];W[on];B[nn];W[ps];B[os]\r
+;W[ga];B[ha];W[pg];B[rh];W[sg];B[og];W[qg];B[je];W[hd];B[np];W[le];B[ff];W[dc]\r
+;B[bf];W[nf];B[li];W[sh];B[nh];W[ds];B[oo];W[as];B[aq];W[nl];B[pl];W[tt];B[tt]\r
+)\r
diff --git a/regression/games/trevor/auto/d29.sgf b/regression/games/trevor/auto/d29.sgf
new file mode 100644 (file)
index 0000000..16c695b
--- /dev/null
@@ -0,0 +1,15 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pc];W[dd];B[qp];W[dp];B[fq];W[cn];B[dr];W[cq];B[iq];W[pe];B[cl]\r
+;W[cr];B[nd];W[qc];B[qb];W[qd];B[ob];W[qi];B[oq];W[cj];B[fd];W[df];B[jd];W[pg]\r
+;B[dc];W[cc];B[ec];W[cb];B[qk];W[eh];B[ok];W[po];B[qo];W[er];B[pn];W[rj];B[lq]\r
+;W[rb];B[ff];W[ek];B[fr];W[dm];B[rk];W[ds];B[qj];W[ri];B[ho];W[mf];B[ld];W[fn]\r
+;B[kg];W[hm];B[jn];W[hk];B[if];W[fa];B[gb];W[kl];B[ml];W[gi];B[ni];W[jj];B[lj]\r
+;W[ih];B[ki];W[kn];B[ko];W[ln];B[mo];W[qa];B[pb];W[fs];B[eq];W[dq];B[nf];W[ng]\r
+;B[jm];W[hs];B[km];W[ne];B[gg];W[md];B[mc];W[od];B[me];W[oe];B[lf];W[mg];B[ga]\r
+;W[jl];B[ea];W[sk];B[sl];W[sj];B[rm];W[hg];B[hf];W[ig];B[lm];W[lk];B[ll];W[mk]\r
+;B[kj];W[mj];B[kk];W[mi];B[nh];W[li];B[mh];W[lh];B[kh];W[lg];B[pi];W[jk];B[ph]\r
+;W[qh];B[kf];W[oh];B[oi];W[og];B[ee];W[de];B[im];W[jr];B[kr];W[il];B[jq];W[ir]\r
+;B[hr];W[gr];B[hq];W[gq];B[gp];W[gs];B[is];W[js];B[ep];W[is];B[eo];W[fo];B[fp]\r
+;W[hn];B[do];W[co];B[go];W[nk];B[nl];W[oc];B[nc];W[eg];B[ra];W[sa];B[gh];W[ji]\r
+;B[hh];W[hi];B[gn];W[gm];B[en];W[fm];B[em];W[dl];B[el];W[fl];B[fh];W[fi];B[rc]\r
+;W[fg];B[gf];W[in];B[io];W[nj];B[oj];W[jg];B[jf];W[jh];B[ks];W[es];B[db];W[ca]\r
+;B[pd]C[S16];W[qe];B[ed];W[dn];B[da];W[ef]C[!PASS];B[tt]C[!PASS];W[tt])\r
diff --git a/regression/games/trevor/auto/d32.sgf b/regression/games/trevor/auto/d32.sgf
new file mode 100644 (file)
index 0000000..0ab953c
--- /dev/null
@@ -0,0 +1,21 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dp];W[pd];B[pp];W[cd];B[ed];W[hd];B[ef];W[cf];B[eh];W[ch];B[kd]\r
+;W[qn];B[qf];W[cn];B[rd];W[qk];B[np];W[ck];B[qi];W[lq];B[nn];W[iq];B[nl];W[fq]\r
+;B[eo];W[cq];B[go];W[rp];B[qq];W[dq];B[qc];W[dc];B[rq];W[ri];B[rj];W[qj];B[rh]\r
+;W[pi];B[qh];W[rk];B[si];W[qo];B[nc];W[oj];B[ic];W[hf];B[mr];W[ig];B[gb];W[je]\r
+;B[fg];W[lf];B[ec];W[nd];B[pc];W[ep];B[md];W[fo];B[io];W[fn];B[od];W[og];B[ne]\r
+;W[mf];B[dd];W[db];B[jn];W[kr];B[fj];W[hi];B[pm];W[el];B[kl];W[hm];B[mj];W[ji]\r
+;B[mh];W[nf];B[ge];W[lo];B[il];W[qm];B[lm];W[dj];B[kp];W[lp];B[jq];W[jr];B[kq]C[M2]\r
+;W[mq];B[nq];W[lr];B[nr];W[jp]C[!K4];B[ko];W[sq];B[sr];W[sp];B[rr];W[pl];B[ip];W[id]\r
+;B[jc];W[om];B[ln]C[H3];W[on];B[hq];W[ir];B[hr];W[gp];B[hp];W[eb];B[fr];W[er];B[fs]\r
+;W[es];B[gr];W[lh];B[nh];W[pf];B[pe];W[gn];B[di];W[ci];B[dg];W[ei];B[cg];W[bg]\r
+;B[ce]C[B15];W[bd];B[bf];W[fi];B[bh];W[bi];B[ag];W[be];B[df];W[ai];B[gj];W[hj];B[fk]\r
+;W[hk];B[hl];W[fl];B[gl];W[gk];B[ok];W[kj];B[kk];W[qg];B[qe];W[rg];B[ph];W[pg]\r
+;B[oh];W[gd];B[dh];W[gf];B[fe];W[gg];B[ho];W[li];B[nj];W[ke];B[oi]C[Q10];W[ld];B[lc]\r
+;W[pj];B[le];W[rf];B[re];W[im];B[gm];W[jm];B[jk]C[H6];W[jl];B[ik];W[hn];B[fb];W[fh]\r
+;B[gq];W[fp];B[me]C[A12];W[ff];B[ah];W[qp];B[he];W[lj];B[lk];W[fm];B[mg];W[lg];B[ie]\r
+;W[jd];B[if];W[jf];B[ea]C[B18];W[cb];B[mi];W[fd];B[ee];W[km];B[kn];W[nm];B[mo];W[mm]\r
+;B[mn];W[ml];B[mk];W[ij];B[ll];W[da];B[fa];W[hc];B[hb];W[oo];B[op];W[po];B[se]\r
+;W[sk];B[sj];W[ae];B[af];W[eg];B[ba];W[bb];B[fg];W[pq];B[rs];W[eg];B[bj];W[cj]\r
+;B[fg];W[pr];B[or];W[eg];B[ol];W[fg];B[ng]C[P14];W[sg];B[of];W[oe];B[ql]C[Q9];W[rl]\r
+;B[of];W[qr];B[ps];W[oe];B[sh];W[of];B[in];W[jj];B[fc];W[pk];B[nk];W[no];B[sf]\r
+;W[gc];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/d33.sgf b/regression/games/trevor/auto/d33.sgf
new file mode 100644 (file)
index 0000000..c662783
--- /dev/null
@@ -0,0 +1,20 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dp];W[qd];B[dc];W[pp];B[od];W[pf];B[qc];W[rc];B[pc];W[re];B[lc]\r
+;W[ce];B[dh];W[df];B[fd];W[bc];B[qn];W[fq];B[qk];W[nq];B[rp];W[qq];B[lq];W[rq]\r
+;B[iq];W[fo];B[dn];W[fm];B[qh];W[hc];B[he];W[fb];B[dl];W[ec];B[er]C[#Other moves possible, but must defend F3 group.\r
+F2|H3];W[ed];B[ng]\r
+;W[cg];B[rb]C[T18];W[ro];B[sc];W[rd];B[rg];W[nf];B[mf];W[ph];B[dj];W[fk];B[rn];W[sp]\r
+;B[sb];W[bi];B[oi];W[lr];B[mr];W[mq];B[kr];W[lp];B[kq];W[nr];B[ls]C[!G6];W[gn];B[gi]\r
+;W[mn];B[ff];W[on];B[nk];W[il];B[eg];W[ll];B[mi];W[kj];B[jn];W[km];B[jb];W[jh]\r
+;B[le];W[io];B[jo];W[bk];B[hg];W[bm];B[bo];W[jf];B[ol];W[jd];B[id];W[ie];B[ic]\r
+;W[sn];B[gc];W[sl];B[gb];W[hj];B[fc];W[db];B[ee];W[dd];B[gp];W[gq];B[fp];W[hp]\r
+;B[eq];W[hq];B[hr];W[gr];B[ir];W[ns];B[ms];W[fa];B[rk];W[pm];B[rm];W[sm];B[rl]\r
+;W[gj];B[ej];W[kc];B[kb];W[ld];B[mc];W[me];B[ne];W[md];B[of];W[ke];B[lf];W[hf]\r
+;B[hd];W[ig];B[gf];W[hh];B[gg];W[gh];B[nd];W[kd];B[fi];W[fh];B[po];W[oo];B[qo]\r
+;W[qp];B[jm];W[jl];B[kp];W[lo];B[in];W[go];B[ep];W[hn];B[ip];W[ho];B[bn];W[pl]\r
+;B[pk];W[lh];B[cm];W[bl];B[li];W[ch];B[ki];W[ji];B[kh];W[kg];B[lg];W[if];B[kf]\r
+;W[fj];B[ei];W[lj];B[mj];W[kn];B[ml];W[nm];B[mm];W[hi];B[om];W[pn];B[im];W[hm]\r
+;B[ko];W[an];B[lk];W[kk];B[em]C[A5];W[ek];B[dk];W[eo];B[en];W[do];B[el];W[ao];B[ap]\r
+;W[am];B[bp];W[fl];B[co];W[ci];B[dg];W[cj];B[sk];W[so];B[hs];W[ef];B[fg];W[fr]\r
+;B[lm];W[kl];B[ln]C[O6];W[mo];B[mk];W[es];B[ds];W[fs];B[cr];W[ga];B[hb];W[ha];B[ia]\r
+;W[jg];B[jc];W[je];B[cl];W[de];B[fe];W[ck];B[di];W[fn];B[gs];W[eh];B[qm];W[ql]\r
+;B[nl];W[nn];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/d39.sgf b/regression/games/trevor/auto/d39.sgf
new file mode 100644 (file)
index 0000000..55c6476
--- /dev/null
@@ -0,0 +1,20 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pc];W[pp];B[cd];W[dp];B[qe];W[ec];B[hd];W[de];B[ce];W[df];B[cf]\r
+;W[dg];B[bh];W[di];B[bj];W[jc];B[fq];W[hb];B[nq];W[lq];B[qq];W[pq];B[qp]C[Q5];W[qo]\r
+;B[ro]C[R6];W[mp];B[iq];W[qn];B[rn]C[R7];W[dn];B[dr];W[cq];B[pi];W[mc];B[db];W[go]\r
+;B[kr]C[#locally, E18 is better.\r
+!F18];W[fb];B[hf];W[lr];B[hh];W[cr];B[kq];W[np];B[pk]C[#R7 or R2 are much better.\r
+!O2];W[nr];B[ke];W[er]\r
+;B[fr];W[ds];B[nf];W[qm];B[rk];W[rm];B[dk];W[rq];B[fe];W[dd];B[cc];W[om];B[cm]\r
+;W[ll];B[lj];W[ko];B[bo];W[ob];B[oc];W[pb];B[qb];W[nb];B[fg];W[ej];B[fl];W[nk]\r
+;B[nj];W[jm];B[ij];W[je];B[jf];W[gj];B[io];W[fh];B[fo];W[eq];B[gn];W[qa];B[rb]\r
+;W[ks];B[js];W[ls];B[jk];W[jr];B[jq];W[fs];B[is];W[fp];B[gp];W[gr];B[ep]C[!B1];W[bs]\r
+;B[mk];W[nl];B[ml];W[mm];B[me];W[rp];B[cn];W[eo];B[en];W[fp];B[fn];W[gq];B[hp]\r
+;W[jd];B[dm];W[do];B[kl];W[lk];B[mj];W[km];B[md];W[bp];B[hl];W[ld];B[jl];W[le]\r
+;B[lf];W[kd];B[gi];W[kf];B[kg];W[lg];B[mg];W[jg];B[lh];W[fi];B[if];W[gh];B[hi]\r
+;W[gg];B[gf];W[fd];B[eg];W[ef];B[ff];W[gd];B[eh];W[dh];B[kk];W[lm];B[im];W[hk]\r
+;B[ei];W[dj];B[gk];W[fk];B[gl];W[hj];B[ek];W[fj];B[rl];W[sm];B[kp];W[jn];B[co]\r
+;W[id];B[he];W[cp];B[hc]C[G17];W[gb];B[gc];W[ic];B[eb];W[fc];B[ok];W[ee];B[dc];W[ol]\r
+;B[ra];W[jo];B[pa];W[nc];B[nd];W[sl];B[sk];W[ao];B[an];W[ap];B[lp];W[lo];B[fa]\r
+;W[jp];B[hg];W[hq];B[ip]C[!P19];W[oa];B[cj]C[!R19];W[qa];B[cg];W[ga];B[ea];W[pl];B[ci]C[R9]\r
+;W[ql];B[qk];W[hr];B[ir]C[J6];W[hs];B[in]C[J9];W[pa];B[ik];W[ke];B[lc];W[lb];B[ch]\r
+;W[ed];B[ie];W[jb];B[ge];W[kh];B[jh]C[M13];W[tt];B[ki];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d40.sgf b/regression/games/trevor/auto/d40.sgf
new file mode 100644 (file)
index 0000000..674995a
--- /dev/null
@@ -0,0 +1,17 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dd];W[pp];B[dq];W[pd];B[nq];W[do];B[dl];W[fo];B[fq];W[ho];B[hq]\r
+;W[di];B[ej];W[fd];B[df];W[jd];B[qf];W[qh];B[qc];W[pc];B[qd];W[pe];B[rf];W[og]\r
+;B[kq];W[dc];B[cc];W[ec];B[cb];W[qn];B[pr];W[qq];B[ql];W[qr];B[eh]C[!G6];W[gn];B[cn]C[C5]\r
+;W[md];B[co];W[or];B[dp];W[oi];B[ff];W[hd];B[fa];W[jn];B[ei];W[rj];B[ol];W[qb]\r
+;B[rb];W[pa];B[ra];W[gb];B[nk];W[no];B[pj];W[fl];B[lk];W[gj];B[mm];W[ik];B[el]\r
+;W[rl];B[rm];W[qm];B[rk];W[pl];B[qk];W[rn];B[nr];W[sm];B[mh];W[om];B[pk];W[pm]\r
+;B[mi];W[mf];B[oq];W[lo];B[nm];W[kl];B[lg];W[kj];B[sk];W[rh];B[jg];W[if];B[ke]\r
+;W[kd];B[ih];W[gh];B[qs];W[rs];B[ps];W[kf];B[rr];W[kg];B[oj];W[kh];B[rq];W[rp]\r
+;B[eo];W[en];B[dn];W[gf];B[jh];W[pq];B[ss];W[fb];B[ea];W[em];B[jp];W[lm];B[ch]\r
+;W[ci];B[ck];W[ga];B[da];W[fg];B[fe];W[lq];B[lr];W[mq];B[pi];W[ph];B[ni];W[mr]\r
+;B[ms];W[kr];B[ls];W[ns];B[os];W[kp];B[jq];W[oh];B[mp];W[lp];B[mo];W[mn];B[np]\r
+;W[nn];B[ll];W[ge];B[ko];W[ln];B[qi];W[ri];B[jo];W[de];B[ce];W[ee];B[ef];W[ed]\r
+;B[eg];W[cd];B[bd];W[bc];B[dd];W[pf];B[fk];W[gk];B[lf];W[le];B[gp]C[C16];W[mg];B[lh]C[L11]\r
+;W[jf];B[sl];W[lj];B[mj]C[C16];W[rm];B[dm];W[fm];B[qg];W[fj];B[ek];W[qa];B[nh];W[kk]\r
+;B[ml];W[kn];B[li];W[ki];B[rg];W[ng];B[sh];W[qe];B[re];W[op];B[fp];W[sq];B[ks]\r
+;W[go];B[io];W[in];B[hp];W[fi];B[cd];W[db];B[si];W[sj];B[sg];W[fh];B[pg];W[eb]\r
+;B[ca];W[qj];B[rs];W[sp];B[sr];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d45.sgf b/regression/games/trevor/auto/d45.sgf
new file mode 100644 (file)
index 0000000..b438ef1
--- /dev/null
@@ -0,0 +1,18 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dd];W[pp];B[dq];W[pd];B[nc];W[pf];B[co];W[cf];B[pn];W[np];B[pj]\r
+;W[jp];B[qp];W[qq];B[qo];W[rq];B[fc];W[bd];B[cc];W[ci];B[kc];W[cl];B[pb];W[qc]\r
+;B[hq];W[me];B[fe];W[jd];B[bc];W[kd];B[be];W[qb];B[jc];W[lc];B[lb];W[ob];B[qh]\r
+;W[qf];B[hd];W[nb];B[ic];W[mb];B[rg];W[kb];B[fo];W[bf];B[ho];W[ce];B[jr];W[lr]\r
+;B[kq];W[rf];B[lq];W[jn];B[mr];W[mo];B[gl];W[ac];B[jb];W[oh];B[ka];W[bn];B[cn]\r
+;W[bo];B[bp]C[!C4];W[cp];B[dp];W[ap];B[cq];W[cm];B[aq];W[or];B[em];W[nm];B[pl];W[sn]\r
+;B[mk];W[lm];B[nk];W[ej];B[kk];W[eg];B[lh];W[mg];B[gg];W[jf];B[rp];W[sp];B[ni]\r
+;W[gi];B[ji];W[jl];B[hj];W[hm];B[hl];W[qg];B[ig];W[rh];B[ri];W[sg];B[gj];W[qi]\r
+;B[qj];W[pi];B[rk];W[gh];B[ab];W[ad];B[bb];W[hh];B[jg];W[il];B[hg];W[fj];B[gm]\r
+;W[gn];B[hn];W[oi];B[im];W[nr];B[ls];W[mq];B[ms];W[lp];B[kf];W[ld];B[kp];W[ko]\r
+;B[je];W[ie];B[if];W[po];B[rn];W[so];B[he];W[rm];B[qm];W[rl];B[id];W[si];B[rj]\r
+;W[oj];B[ok];W[nj];B[mi];W[ql];B[de];W[jq];B[kr];W[on];B[qn];W[om];B[pm];W[mj]\r
+;B[dm];W[lj];B[lk];W[ij];B[kl];W[ii];B[jm];W[kh];B[li];W[hk];B[gk];W[ik];B[kj]\r
+;W[df];B[ao];W[am];B[ih];W[hi];B[km];W[nh];B[kn];W[ln];B[in];W[jo];B[ns];W[os]\r
+;B[fg];W[fh];B[iq];W[lf];B[ke];W[lg];B[kg];W[ff];B[gf];W[ef];B[ip];W[ee];B[ed]\r
+;W[dl];B[el];W[ma];B[la];W[ml];B[ek];W[dk];B[fk];W[jj];B[qk];W[sk];B[cd];W[ae]\r
+;B[ol];W[le];B[io];W[lo];B[sm];W[sl];B[jk];W[eh];B[ll];W[nl];B[ro];W[sj];B[pk]\r
+;W[an];B[ap];W[mh];B[ki];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d46.sgf b/regression/games/trevor/auto/d46.sgf
new file mode 100644 (file)
index 0000000..9301e80
--- /dev/null
@@ -0,0 +1,19 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[pq];W[dd];B[pc];W[dp];B[fq];W[pe];B[nd];W[qc];B[qb];W[qd];B[ob]\r
+;W[qi];B[po];W[dn];B[cf];W[fd];B[bd];W[ch];B[cc];W[ce];B[be];W[df];B[dg];W[cg]\r
+;B[bf];W[eg];B[dr];W[hq];B[cq];W[eq];B[er];W[dh];B[jq];W[qm];B[mq];W[og];B[hc]\r
+;W[dk];B[kc];W[ol];B[gq];W[hp];B[rn];W[rm];B[fb];W[qn];B[ro];W[ir];B[bo];W[jp]\r
+;B[kr];W[kp];B[no];W[he];B[mm];W[km];B[mk];W[nj];B[lj];W[im];B[jk];W[gh];B[je]\r
+;W[mh];B[le];W[ig];B[hk];W[fj];B[ii];W[fl];B[bm];W[bj];B[ep];W[hl];B[cp];W[eo]\r
+;B[dq];W[rb];B[fo];W[fn];B[do];W[en];B[ra];W[go];B[rc];W[rd];B[sb];W[lo];B[om]\r
+;W[dc];B[db];W[sd];B[sm];W[sl];B[sn];W[rl];B[gk];W[qo];B[rp];W[gr];B[gp];W[lq]\r
+;B[lr];W[mp];B[np];W[kq];B[jr];W[bg];B[hd];W[ie];B[id];W[mn];B[nn];W[mo];B[lm]\r
+;W[jf];B[kh];W[ke];B[jd];W[lf];B[kd];W[me];B[kf];W[md];B[lg];W[mf];B[mc];W[li]\r
+;B[ge];W[gf];B[mg]C[!M12];W[lh];B[ng];W[nh];B[nf];W[gd];B[ki];W[ec];B[qp];W[bk];B[pm]\r
+;W[pl];B[cn];W[dm];B[bl];W[od];B[ne];W[oc];B[cl];W[jg];B[kg];W[gj];B[fr];W[fs]\r
+;B[hh]C[!H5];W[ho];B[hg];W[hf];B[sc];W[hj];B[ij];W[ih];B[hi];W[gg];B[jh];W[if];B[nk]\r
+;W[ok];B[mj];W[oi];B[mi];W[ni];B[cd];W[eb];B[ea];W[gi];B[de];W[ee];B[nl];W[fc]\r
+;B[gb];W[gl];B[ln];W[kn];B[ag];W[ah];B[af];W[fk];B[ik];W[ck];B[iq];W[js];B[ip]\r
+;W[io];B[mr];W[es];B[ak];W[aj];B[al];W[is];B[of];W[pf];B[kl];W[il];B[jl];W[jm]\r
+;B[nc];W[pn];B[on];W[dl];B[ds];W[gs];B[fp];W[ks];B[cm];W[ls];B[ms];W[hr];B[gc]\r
+;W[ce];B[cb];W[de];B[oe];W[pd];B[pb];W[tt];B[pg]C[R13];W[oh];B[qg];W[rh];B[rg];W[sg]\r
+;B[sf];W[sh];B[re];W[qh];B[qf];W[ph];B[tt];W[tt])\r
diff --git a/regression/games/trevor/auto/d47.sgf b/regression/games/trevor/auto/d47.sgf
new file mode 100644 (file)
index 0000000..f6134cf
--- /dev/null
@@ -0,0 +1,15 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dp];W[dd];B[qp];W[pd];B[oq];W[qk];B[qf];W[cn];B[cf];W[fd];B[bd]\r
+;W[cc];B[dh];W[pf];B[pg];W[of];B[qe];W[qd];B[dn];W[dm];B[en]C[!O16];W[nd];B[co];W[kc]\r
+;B[em];W[jq];B[dl];W[mq];B[fp];W[hq];B[gr];W[qn];B[fi];W[ke];B[hc];W[he];B[oh]\r
+;W[bc];B[fc];W[eb];B[qi];W[gb];B[rk];W[rj];B[qj];W[rl];B[pk];W[ql];B[nr];W[ff]\r
+;B[ri];W[sk];B[ce];W[if];B[mi];W[ij];B[fk];W[mr];B[hl];W[ro];B[oo];W[rq];B[rp]\r
+;W[qq];B[nn];W[pp];B[hh];W[op];B[jh];W[lp];B[nl];W[in];B[li];W[np];B[jk];W[mf]\r
+;B[jm];W[ln];B[lm];W[gn];B[kn];W[ko];B[ho];W[hn];B[hp];W[jn];B[hr];W[ir];B[rd]\r
+;W[rc];B[se];W[gq];B[fq];W[sc];B[ac];W[ab];B[ad];W[bb];B[mn]C[L7];W[lo];B[km];W[hs]\r
+;B[fr];W[cd];B[be];W[kg];B[pm];W[jg];B[kh];W[go];B[gp];W[iq];B[lg];W[ih];B[ii]\r
+;W[hg];B[hj];W[gh];B[hi];W[lf];B[mg];W[ng];B[nh];W[sd];B[re];W[pn];B[gi];W[pl]\r
+;B[ol];W[on];B[gg];W[gf];B[fg];W[om];B[no];W[eg];B[fh];W[dg];B[cg];W[nm];B[mm]\r
+;W[ig];B[df];W[ef];B[mo];W[og];B[qg];W[pe];B[de];W[ee];B[fo];W[po];B[im];W[gc]\r
+;B[io];W[jo];B[ip];W[jp];B[hm];W[gm];B[fl];W[gl];B[gk];W[ch];B[bg];W[eh];B[di]\r
+;W[ei];B[dj];W[ej];B[ek];W[fj];B[si];W[sj];B[gj];W[gs];B[fs];W[is];B[fm];W[mp]\r
+;B[fn];W[tt];B[bh];W[tt];B[tt])\r
diff --git a/regression/games/trevor/auto/d48.sgf b/regression/games/trevor/auto/d48.sgf
new file mode 100644 (file)
index 0000000..63fc583
--- /dev/null
@@ -0,0 +1,21 @@
+(;FF[4]GM[1]SZ[19]HA[0]KM[5.5];B[dd];W[pp];B[dq];W[pd];B[dk];W[ip];B[nq];W[fc];B[qf];W[do];B[fp]\r
+;W[cq];B[cr];W[cp];B[er];W[pf];B[pg];W[of];B[qe];W[qd];B[qj];W[nd];B[cn];W[br]\r
+;B[en];W[cs];B[dr];W[bo];B[gn];W[np];B[mp];W[no];B[oq];W[pq];B[cf];W[pn];B[ql]\r
+;W[db];B[cc];W[ic];B[kq];W[in];B[ci];W[ln];B[ir];W[qn];B[cb];W[lc];B[eb];W[dn]\r
+;B[nk];W[cm];B[nh];W[fb];B[cl];W[bm];B[bl];W[rm];B[rl];W[ec];B[qm];W[rn];B[fe]\r
+;W[ca];B[lj];W[jl];B[mf];W[ij];B[fj];W[gk];B[ji];W[he];B[gg];W[ke];B[fl];W[jg]\r
+;B[ll];W[jm];B[nm]C[N5];W[mn];B[hq];W[nn];B[ba];W[da];B[bb];W[re];B[rf];W[rd];B[pr]\r
+;W[qr];B[os];W[om];B[qs];W[rr];B[pk];W[al];B[ak];W[am];B[bj];W[gj];B[gi];W[sl]\r
+;B[sk];W[sm];B[ii];W[rk];B[rj];W[sj];B[si];W[sf];B[sg];W[se];B[sk];W[rg];B[rh]\r
+;W[pe];B[qg];W[nl];B[sj];W[ml];B[kh];W[ok];B[ig];W[mk];B[oj];W[nj];B[ni];W[kg]\r
+;B[kl];W[if];B[ih];W[kk];B[lk];W[kj];B[ki];W[em];B[fm];W[eo];B[fn];W[el];B[fk]\r
+;W[ik];B[hj];W[hl];B[ne];W[mj];B[md];W[mc];B[od]C[O17];W[oc];B[nc];W[nb];B[mi];W[ob]\r
+;B[hm];W[nd];B[qq];W[rs];B[rq];W[ps];B[or];W[qp];B[nc];W[gl];B[dl];W[dm];B[bs]\r
+;W[as];B[gd];W[nd];B[dc];W[ea];B[nc];W[hn];B[gm];W[og];B[oh];W[nd];B[fa];W[ga]\r
+;B[nc];W[ge];B[fd];W[nd];B[il];W[im];B[nc];W[ld];B[nd];W[lg];B[nf];W[lh];B[ng]\r
+;W[li];B[hd];W[id];B[jj];W[jk];B[lf];W[hg];B[gf];W[hf];B[hh];W[kf];B[jq];W[bs]\r
+;B[ko];W[ek];B[ej];W[jp];B[kp];W[op];B[jo];W[hp];B[fo];W[gp];B[gq];W[io];B[go]\r
+;W[le];B[lo];W[kn];B[ep];W[ed];B[ee]C[#Mostly, !Q7\r
+Q8];W[pm];B[pl];W[ol];B[hc];W[hb];B[gc];W[gb]\r
+;B[qs];W[rp];B[ps];W[ds];B[es];W[bq];B[iq];W[hk];B[hi];W[dp];B[mo];W[jn];B[ho]\r
+;W[me];B[oe];W[jh];B[eg];W[mg];B[mh];W[tt];B[tt])\r
diff --git a/regression/games/trevor/owl111a.sgf b/regression/games/trevor/owl111a.sgf
new file mode 100644 (file)
index 0000000..5cd939c
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[11]\r
+AP[Jago:Version 4.18]\r
+AW[ab][ba][bb][bg][bh][cb][cd][ch][da][db][dd][dh][di][ed][eg][fd][fh][fi][fj][gb][gc][gd][gj][gk][hb][ie][ii][ij][ik][je][jh][ji][kc][kd][ke][kf][kg][kh]\r
+AB[ac][bc][be][bf][ce][cf][cg][de][df][dg][ea][eb][ee][ef][fa][fb][ff][ga][gf][gh][ha][hc][hd][he][hf][hh][hi][ia][ib][id][if][ja][jb][jf][jg][ka][kb]\r
+)\r
diff --git a/regression/games/trevor/trevor_01.sgf b/regression/games/trevor/trevor_01.sgf
new file mode 100644 (file)
index 0000000..d062047
--- /dev/null
@@ -0,0 +1,100 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[ee]\r
+;\r
+W[gc]\r
+;\r
+B[cg]\r
+;\r
+W[gf]\r
+;\r
+B[cd]\r
+;\r
+W[eg]\r
+;\r
+B[eh]\r
+;\r
+W[dh]\r
+;\r
+B[fh]\r
+;\r
+W[fg]\r
+;\r
+B[dg]\r
+;\r
+W[gh]\r
+;\r
+B[di]\r
+;\r
+W[eb]\r
+;\r
+B[cb]\r
+;\r
+W[gd]\r
+;\r
+B[ec]\r
+;\r
+W[db]\r
+;\r
+B[dc]\r
+;\r
+W[fc]\r
+;\r
+B[da]\r
+;\r
+W[fa]\r
+;\r
+B[ef]\r
+;\r
+W[fi]\r
+;\r
+B[ch]\r
+;\r
+W[ff]\r
+;\r
+B[fe]\r
+;\r
+W[fd]\r
+;\r
+B[ge]\r
+;\r
+W[hf]\r
+;\r
+B[he]\r
+;\r
+W[gb]\r
+;\r
+B[hg]\r
+;\r
+W[gg]\r
+;\r
+B[hh]\r
+;\r
+W[ie]\r
+;\r
+B[ig]\r
+;\r
+W[hd]\r
+;\r
+B[if]\r
+;\r
+W[id]\r
+;\r
+B[ed]\r
+;\r
+W[ea]\r
+;\r
+B[ca]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_02.sgf b/regression/games/trevor/trevor_02.sgf
new file mode 100644 (file)
index 0000000..e21c3a5
--- /dev/null
@@ -0,0 +1,6 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]HA[0]KM[5.5];B[fc]
+;W[gc]
+;B[gd]
+;W[tt]
+;B[tt]
+)
\ No newline at end of file
diff --git a/regression/games/trevor/trevor_03.sgf b/regression/games/trevor/trevor_03.sgf
new file mode 100644 (file)
index 0000000..bae52af
--- /dev/null
@@ -0,0 +1,102 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[ee]\r
+;\r
+W[dg]\r
+;\r
+B[cf]\r
+;\r
+W[ff]\r
+;\r
+B[dc]\r
+;\r
+W[gd]\r
+;\r
+B[gg]\r
+;\r
+W[fg]\r
+;\r
+B[cg]\r
+;\r
+W[gh]\r
+;\r
+B[dh]\r
+;\r
+W[eh]\r
+;\r
+B[ch]\r
+;\r
+W[fc]\r
+;\r
+B[eb]\r
+;\r
+W[fb]\r
+;\r
+B[fa]\r
+;\r
+W[ga]\r
+;\r
+B[ea]\r
+;\r
+W[hb]\r
+;\r
+B[df]\r
+;\r
+W[ef]\r
+;\r
+B[ei]\r
+;\r
+W[ed]\r
+;\r
+B[fe]\r
+;\r
+W[ge]\r
+;\r
+B[dd]\r
+;\r
+W[eg]\r
+;\r
+B[gf]\r
+;\r
+W[hf]\r
+;\r
+B[fh]\r
+;\r
+W[ec]\r
+;\r
+B[hg]\r
+;\r
+W[db]\r
+;\r
+B[cb]\r
+;\r
+W[ca]\r
+;\r
+B[bb]\r
+;\r
+W[ie]\r
+;\r
+B[ba]\r
+;\r
+W[da]\r
+;\r
+B[ig]\r
+;\r
+W[if]\r
+;\r
+B[fd]\r
+;\r
+W[id]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_04.sgf b/regression/games/trevor/trevor_04.sgf
new file mode 100644 (file)
index 0000000..8db9d35
--- /dev/null
@@ -0,0 +1,98 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[dc]\r
+;\r
+W[ee]\r
+;\r
+B[fc]\r
+;\r
+W[eg]\r
+;\r
+B[gg]\r
+;\r
+W[ef]\r
+;\r
+B[cg]\r
+;\r
+W[fh]\r
+;\r
+B[gd]\r
+;\r
+W[hh]\r
+;\r
+B[dh]\r
+;\r
+W[ce]\r
+;\r
+B[bd]\r
+;\r
+W[hg]\r
+;\r
+B[be]\r
+;\r
+W[gf]\r
+;\r
+B[he]\r
+;\r
+W[cf]\r
+;\r
+B[bf]\r
+;\r
+W[dg]\r
+;\r
+B[ch]\r
+;\r
+W[hf]\r
+;\r
+B[eh]\r
+;\r
+W[ge]\r
+;\r
+B[hd]\r
+;\r
+W[cd]\r
+;\r
+B[cc]\r
+;\r
+W[ie]\r
+;\r
+B[fi]\r
+;\r
+W[gh]\r
+;\r
+B[id]\r
+;\r
+W[if]\r
+;\r
+B[dd]\r
+;\r
+W[ed]\r
+;\r
+B[fd]\r
+;\r
+W[ec]\r
+;\r
+B[eb]\r
+;\r
+W[gi]\r
+;\r
+B[ei]\r
+;\r
+W[de]\r
+;\r
+B[fe]\r
+;\r
+W[ff]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_05.sgf b/regression/games/trevor/trevor_05.sgf
new file mode 100644 (file)
index 0000000..a373d4a
--- /dev/null
@@ -0,0 +1,84 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[dc]\r
+;\r
+W[ce]\r
+;\r
+B[de]\r
+;\r
+W[df]\r
+;\r
+B[cd]\r
+;\r
+W[fg]\r
+;\r
+B[cf]\r
+;\r
+W[cg]\r
+;\r
+B[be]\r
+;\r
+W[ef]\r
+;\r
+B[gd]\r
+;\r
+W[gf]\r
+;\r
+B[bg]\r
+;\r
+W[fd]\r
+;\r
+B[fc]\r
+;\r
+W[ge]\r
+;\r
+B[hd]\r
+;\r
+W[gc]\r
+;\r
+B[ed]\r
+;\r
+W[fe]\r
+;\r
+B[gb]\r
+;\r
+W[he]\r
+;\r
+B[hc]\r
+;\r
+W[ch]\r
+;\r
+B[bh]\r
+;\r
+W[bi]\r
+;\r
+B[ie]\r
+;\r
+W[if]\r
+;\r
+B[id]\r
+;\r
+W[ah]\r
+;\r
+B[ag]\r
+;\r
+W[ee]\r
+;\r
+B[ai]\r
+;\r
+W[ci]\r
+;\r
+B[ah]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_06.sgf b/regression/games/trevor/trevor_06.sgf
new file mode 100644 (file)
index 0000000..ff84942
--- /dev/null
@@ -0,0 +1,84 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[gg]\r
+;\r
+W[gd]\r
+;\r
+B[ef]\r
+;\r
+W[cc]\r
+;\r
+B[ce]\r
+;\r
+W[ed]\r
+;\r
+B[bd]\r
+;\r
+W[hf]\r
+;\r
+B[gf]\r
+;\r
+W[hg]\r
+;\r
+B[hh]\r
+;\r
+W[ge]\r
+;\r
+B[bb]\r
+;\r
+W[cb]\r
+;\r
+B[dd]\r
+;\r
+W[ec]\r
+;\r
+B[dc]\r
+;\r
+W[db]\r
+;\r
+B[ee]\r
+;\r
+W[ih]\r
+;\r
+B[hi]\r
+;\r
+W[ba]\r
+;\r
+B[bc]\r
+;\r
+W[ig]\r
+;\r
+B[fe]\r
+;\r
+W[cd]\r
+;\r
+B[de]\r
+;\r
+W[fd]\r
+;\r
+B[ab]\r
+;\r
+W[ca]\r
+;\r
+B[aa]\r
+;\r
+W[eb]\r
+;\r
+B[gh]\r
+;\r
+W[hd]\r
+;\r
+B[ii]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_07.sgf b/regression/games/trevor/trevor_07.sgf
new file mode 100644 (file)
index 0000000..b2c4749
--- /dev/null
@@ -0,0 +1,114 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[gd]\r
+;\r
+W[cf]\r
+;\r
+B[eg]\r
+;\r
+W[cc]\r
+;\r
+B[ec]\r
+;\r
+W[gg]\r
+;\r
+B[fh]\r
+;\r
+W[gh]\r
+;\r
+B[gi]\r
+;\r
+W[dh]\r
+;\r
+B[gf]\r
+;\r
+W[hi]\r
+;\r
+B[dg]\r
+;\r
+W[fi]\r
+;\r
+B[cg]\r
+;\r
+W[ch]\r
+;\r
+B[bh]\r
+;\r
+W[hf]\r
+;\r
+B[he]\r
+;\r
+W[ig]\r
+;\r
+B[bf]\r
+;\r
+W[db]\r
+;\r
+B[bb]\r
+;\r
+W[ff]\r
+;\r
+B[bd]\r
+;\r
+W[ge]\r
+;\r
+B[hc]\r
+;\r
+W[cd]\r
+;\r
+B[id]\r
+;\r
+W[bc]\r
+;\r
+B[ac]\r
+;\r
+W[ce]\r
+;\r
+B[be]\r
+;\r
+W[eh]\r
+;\r
+B[eb]\r
+;\r
+W[ef]\r
+;\r
+B[cb]\r
+;\r
+W[dc]\r
+;\r
+B[da]\r
+;\r
+W[fg]\r
+;\r
+B[df]\r
+;\r
+W[de]\r
+;\r
+B[bg]\r
+;\r
+W[ed]\r
+;\r
+B[fd]\r
+;\r
+W[fe]\r
+;\r
+B[bi]\r
+;\r
+W[ci]\r
+;\r
+B[ie]\r
+;\r
+W[if]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_08.sgf b/regression/games/trevor/trevor_08.sgf
new file mode 100644 (file)
index 0000000..32e118d
--- /dev/null
@@ -0,0 +1,96 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cg]\r
+;\r
+W[ed]\r
+;\r
+B[gg]\r
+;\r
+W[gd]\r
+;\r
+B[cc]\r
+;\r
+W[db]\r
+;\r
+B[cf]\r
+;\r
+W[hf]\r
+;\r
+B[dc]\r
+;\r
+W[ec]\r
+;\r
+B[cb]\r
+;\r
+W[eb]\r
+;\r
+B[gf]\r
+;\r
+W[hg]\r
+;\r
+B[hh]\r
+;\r
+W[gh]\r
+;\r
+B[fh]\r
+;\r
+W[ih]\r
+;\r
+B[gi]\r
+;\r
+W[he]\r
+;\r
+B[ef]\r
+;\r
+W[ca]\r
+;\r
+B[ce]\r
+;\r
+W[ba]\r
+;\r
+B[bb]\r
+;\r
+W[fe]\r
+;\r
+B[hi]\r
+;\r
+W[de]\r
+;\r
+B[dd]\r
+;\r
+W[ab]\r
+;\r
+B[ac]\r
+;\r
+W[ee]\r
+;\r
+B[ff]\r
+;\r
+W[df]\r
+;\r
+B[dg]\r
+;\r
+W[ge]\r
+;\r
+B[aa]\r
+;\r
+W[da]\r
+;\r
+B[ab]\r
+;\r
+W[ig]\r
+;\r
+B[ii]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_09.sgf b/regression/games/trevor/trevor_09.sgf
new file mode 100644 (file)
index 0000000..0207b66
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[ei][di][be][bc][bb][db][da][ef][eg][fg][fh][ci][bh][ah][ag][af][hg][gh]\r
+AW[eh][dh][dg][df][dd][fc][fb][ge][gf][cg][bg][gg]\r
+PL[W]\r
+)\r
diff --git a/regression/games/trevor/trevor_10.sgf b/regression/games/trevor/trevor_10.sgf
new file mode 100644 (file)
index 0000000..8a66882
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[ef][de][dd][fe][fd][fc][gd][cf][cg][dg][dh][di][bf][af][bh][ai][gh][gi][hh][hg][ig][ii]\r
+AB[ei][eh][eg][ff][gg][ge][he][ie][be][ce][ae][cd][cb][dc][ec][fb][eb][gc][hd][hc][fg]\r
+PL[W]\r
+)\r
diff --git a/regression/games/trevor/trevor_11.sgf b/regression/games/trevor/trevor_11.sgf
new file mode 100644 (file)
index 0000000..8baf6f7
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[gg][gf][fg][he][gd][fd][ed][ec][eb][ea][eh][dh][di][ci][bi][ai]\r
+AB[ah][ag][bg][bf][ch][dg][eg][ef][ff][fe][ge][ee][df][ce][cd][dd][dc][db][da]\r
+PL[W]\r
+)\r
diff --git a/regression/games/trevor/trevor_12.sgf b/regression/games/trevor/trevor_12.sgf
new file mode 100644 (file)
index 0000000..92ef3ce
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[gg][gf][fg][he][gd][fd][ed][ec][eb][ea][eh][dh][di][ci][bi][ai][bh][cg][hh][hf]\r
+AB[ah][ag][bg][bf][dg][eg][ef][ff][fe][ge][ee][df][ce][cd][dd][dc][db][da][fh][gh][hg]\r
+PL[B]\r
+)\r
diff --git a/regression/games/trevor/trevor_13.sgf b/regression/games/trevor/trevor_13.sgf
new file mode 100644 (file)
index 0000000..e52aef4
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[ag][ba][bb][bc][bf][bh][cb][ce][ee][eg][fe][ff]\r
+AB[bg][ca][cg][ch][da][db][dc][dg][fd][fg][gc][ge][gf]\r
+)\r
diff --git a/regression/games/trevor/trevor_14.sgf b/regression/games/trevor/trevor_14.sgf
new file mode 100644 (file)
index 0000000..8c4789e
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[ad][bc][be][cd][ce][cf][db][dd][df][dg][ec][ef][fd][ff][gd][hd][he][ie][if]\r
+AW[ae][af][bf][bg][cg][dc][de][dh][ed][ee][eg][fe][fg][ge][gf][hf][hg][ig]\r
+)\r
diff --git a/regression/games/trevor/trevor_15.sgf b/regression/games/trevor/trevor_15.sgf
new file mode 100644 (file)
index 0000000..0f39184
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[ac][ad][bc][cc][cf][dc][ed][fc][gd][ge][he][hf][if][ig]\r
+AB[ae][bd][bf][ce][cg][dd][dg][ee][fd][fe][gf][gg][hg][hh][ih]\r
+PL[W]\r
+)\r
diff --git a/regression/games/trevor/trevor_16.sgf b/regression/games/trevor/trevor_16.sgf
new file mode 100644 (file)
index 0000000..5976d6d
--- /dev/null
@@ -0,0 +1,156 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[df]\r
+;\r
+W[cg]\r
+;\r
+B[dc]\r
+;\r
+W[dg]\r
+;\r
+B[gf]\r
+;\r
+W[ef]\r
+;\r
+B[cf]\r
+;\r
+W[bf]\r
+;\r
+B[be]\r
+;\r
+W[ce]\r
+;\r
+B[de]\r
+;\r
+W[ee]\r
+;\r
+B[cd]\r
+;\r
+W[fg]\r
+;\r
+B[fd]\r
+;\r
+W[gc]\r
+;\r
+B[gg]\r
+;\r
+W[bg]\r
+;\r
+B[gd]\r
+;\r
+W[hd]\r
+;\r
+B[he]\r
+;\r
+W[hb]\r
+;\r
+B[id]\r
+;\r
+W[fb]\r
+;\r
+B[hc]\r
+;\r
+W[fc]\r
+;\r
+B[ec]\r
+;\r
+W[ib]\r
+;\r
+B[eb]\r
+;\r
+W[ga]\r
+;\r
+B[fh]\r
+;\r
+W[eh]\r
+;\r
+B[gh]\r
+;\r
+W[ed]\r
+;\r
+B[dd]\r
+;\r
+W[ic]\r
+;\r
+B[ei]\r
+;\r
+W[di]\r
+;\r
+B[fi]\r
+;\r
+W[ae]\r
+;\r
+B[ad]\r
+;\r
+W[af]\r
+;\r
+B[fe]\r
+;\r
+W[hd]\r
+;\r
+B[ie]\r
+;\r
+W[ea]\r
+;\r
+B[da]\r
+;\r
+W[hc]\r
+;\r
+B[fa]\r
+;\r
+W[bc]\r
+;\r
+B[bd]\r
+;\r
+W[ea]\r
+;\r
+B[ac]\r
+;\r
+W[fa]\r
+;\r
+B[ff]\r
+;\r
+W[eg]\r
+;\r
+B[ci]\r
+;\r
+W[ch]\r
+;\r
+B[bi]\r
+;\r
+W[ah]\r
+;\r
+B[dh]\r
+;\r
+W[ca]\r
+;\r
+B[di]\r
+;\r
+W[db]\r
+;\r
+B[bb]\r
+;\r
+W[cb]\r
+;\r
+B[cc]\r
+;\r
+W[ba]\r
+;\r
+B[ab]\r
+;\r
+W[da]\r
+;\r
+B[aa]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_17.sgf b/regression/games/trevor/trevor_17.sgf
new file mode 100644 (file)
index 0000000..47452f6
--- /dev/null
@@ -0,0 +1,100 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[ee]\r
+;\r
+W[ec]\r
+;\r
+B[eg]\r
+;\r
+W[cd]\r
+;\r
+B[ge]\r
+;\r
+W[cg]\r
+;\r
+B[gc]\r
+;\r
+W[fb]\r
+;\r
+B[dh]\r
+;\r
+W[cf]\r
+;\r
+B[bh]\r
+;\r
+W[hb]\r
+;\r
+B[hc]\r
+;\r
+W[ch]\r
+;\r
+B[ci]\r
+;\r
+W[gb]\r
+;\r
+B[ib]\r
+;\r
+W[bg]\r
+;\r
+B[dd]\r
+;\r
+W[dc]\r
+;\r
+B[ce]\r
+;\r
+W[bd]\r
+;\r
+B[be]\r
+;\r
+W[ed]\r
+;\r
+B[de]\r
+;\r
+W[fd]\r
+;\r
+B[bc]\r
+;\r
+W[cb]\r
+;\r
+B[cc]\r
+;\r
+W[bb]\r
+;\r
+B[ad]\r
+;\r
+W[gd]\r
+;\r
+B[hd]\r
+;\r
+W[ab]\r
+;\r
+B[ha]\r
+;\r
+W[ga]\r
+;\r
+B[fe]\r
+;\r
+W[ia]\r
+;\r
+B[ic]\r
+;\r
+W[ha]\r
+;\r
+B[ac]\r
+;\r
+W[fc]\r
+;\r
+B[he]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_18.sgf b/regression/games/trevor/trevor_18.sgf
new file mode 100644 (file)
index 0000000..2bea9bc
--- /dev/null
@@ -0,0 +1,88 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[gg]\r
+;\r
+W[ee]\r
+;\r
+B[ef]\r
+;\r
+W[ec]\r
+;\r
+B[cc]\r
+;\r
+W[de]\r
+;\r
+B[be]\r
+;\r
+W[gd]\r
+;\r
+B[df]\r
+;\r
+W[db]\r
+;\r
+B[he]\r
+;\r
+W[hd]\r
+;\r
+B[ge]\r
+;\r
+W[bb]\r
+;\r
+B[cb]\r
+;\r
+W[bc]\r
+;\r
+B[dc]\r
+;\r
+W[ca]\r
+;\r
+B[cd]\r
+;\r
+W[eb]\r
+;\r
+B[ce]\r
+;\r
+W[fe]\r
+;\r
+B[id]\r
+;\r
+W[ic]\r
+;\r
+B[ie]\r
+;\r
+W[hb]\r
+;\r
+B[ff]\r
+;\r
+W[bd]\r
+;\r
+B[ad]\r
+;\r
+W[dd]\r
+;\r
+B[ac]\r
+;\r
+W[ab]\r
+;\r
+B[ba]\r
+;\r
+W[aa]\r
+;\r
+B[ba]\r
+;\r
+W[da]\r
+;\r
+B[bb]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_19.sgf b/regression/games/trevor/trevor_19.sgf
new file mode 100644 (file)
index 0000000..e9903df
--- /dev/null
@@ -0,0 +1,92 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[ee]\r
+;\r
+W[cc]\r
+;\r
+B[dc]\r
+;\r
+W[fc]\r
+;\r
+B[cd]\r
+;\r
+W[cb]\r
+;\r
+B[db]\r
+;\r
+W[bd]\r
+;\r
+B[ce]\r
+;\r
+W[be]\r
+;\r
+B[bb]\r
+;\r
+W[eb]\r
+;\r
+B[bc]\r
+;\r
+W[gd]\r
+;\r
+B[gf]\r
+;\r
+W[hf]\r
+;\r
+B[hg]\r
+;\r
+W[he]\r
+;\r
+B[bf]\r
+;\r
+W[ig]\r
+;\r
+B[hh]\r
+;\r
+W[ed]\r
+;\r
+B[ec]\r
+;\r
+W[fb]\r
+;\r
+B[da]\r
+;\r
+W[fe]\r
+;\r
+B[ef]\r
+;\r
+W[ff]\r
+;\r
+B[fg]\r
+;\r
+W[dd]\r
+;\r
+B[de]\r
+;\r
+W[fd]\r
+;\r
+B[ih]\r
+;\r
+W[if]\r
+;\r
+B[ea]\r
+;\r
+W[fa]\r
+;\r
+B[ca]\r
+;\r
+W[ge]\r
+;\r
+B[gg]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_20.sgf b/regression/games/trevor/trevor_20.sgf
new file mode 100644 (file)
index 0000000..077cfae
--- /dev/null
@@ -0,0 +1,86 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cg]\r
+;\r
+W[fd]\r
+;\r
+B[gg]\r
+;\r
+W[cd]\r
+;\r
+B[eg]\r
+;\r
+W[ge]\r
+;\r
+B[hf]\r
+;\r
+W[he]\r
+;\r
+B[be]\r
+;\r
+W[bd]\r
+;\r
+B[de]\r
+;\r
+W[ce]\r
+;\r
+B[dd]\r
+;\r
+W[hc]\r
+;\r
+B[ec]\r
+;\r
+W[db]\r
+;\r
+B[eb]\r
+;\r
+W[bf]\r
+;\r
+B[cb]\r
+;\r
+W[bg]\r
+;\r
+B[bh]\r
+;\r
+W[ae]\r
+;\r
+B[bc]\r
+;\r
+W[ag]\r
+;\r
+B[cf]\r
+;\r
+W[cc]\r
+;\r
+B[dc]\r
+;\r
+W[bb]\r
+;\r
+B[da]\r
+;\r
+W[ah]\r
+;\r
+B[ch]\r
+;\r
+W[ba]\r
+;\r
+B[ca]\r
+;\r
+W[bi]\r
+;\r
+B[ci]\r
+;\r
+W[ai]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_21.sgf b/regression/games/trevor/trevor_21.sgf
new file mode 100644 (file)
index 0000000..e781393
--- /dev/null
@@ -0,0 +1,100 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[fg]\r
+;\r
+W[ge]\r
+;\r
+B[gc]\r
+;\r
+W[hg]\r
+;\r
+B[fe]\r
+;\r
+W[gh]\r
+;\r
+B[dg]\r
+;\r
+W[hd]\r
+;\r
+B[fh]\r
+;\r
+W[hb]\r
+;\r
+B[gb]\r
+;\r
+W[hc]\r
+;\r
+B[gg]\r
+;\r
+W[gf]\r
+;\r
+B[hh]\r
+;\r
+W[fd]\r
+;\r
+B[eb]\r
+;\r
+W[fc]\r
+;\r
+B[ee]\r
+;\r
+W[fb]\r
+;\r
+B[cb]\r
+;\r
+W[db]\r
+;\r
+B[dc]\r
+;\r
+W[ea]\r
+;\r
+B[da]\r
+;\r
+W[fa]\r
+;\r
+B[hf]\r
+;\r
+W[he]\r
+;\r
+B[ig]\r
+;\r
+W[ec]\r
+;\r
+B[ed]\r
+;\r
+W[ff]\r
+;\r
+B[ef]\r
+;\r
+W[ie]\r
+;\r
+B[if]\r
+;\r
+W[db]\r
+;\r
+B[cc]\r
+;\r
+W[ca]\r
+;\r
+B[bb]\r
+;\r
+W[ba]\r
+;\r
+B[ab]\r
+;\r
+W[da]\r
+;\r
+B[aa]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_22.sgf b/regression/games/trevor/trevor_22.sgf
new file mode 100644 (file)
index 0000000..5386d66
--- /dev/null
@@ -0,0 +1,134 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cc]\r
+;\r
+W[fg]\r
+;\r
+B[gc]\r
+;\r
+W[cf]\r
+;\r
+B[ge]\r
+;\r
+W[hf]\r
+;\r
+B[gf]\r
+;\r
+W[gg]\r
+;\r
+B[he]\r
+;\r
+W[hg]\r
+;\r
+B[de]\r
+;\r
+W[df]\r
+;\r
+B[be]\r
+;\r
+W[bf]\r
+;\r
+B[af]\r
+;\r
+W[ag]\r
+;\r
+B[ae]\r
+;\r
+W[ee]\r
+;\r
+B[bg]\r
+;\r
+W[ce]\r
+;\r
+B[cd]\r
+;\r
+W[dd]\r
+;\r
+B[ec]\r
+;\r
+W[dh]\r
+;\r
+B[cg]\r
+;\r
+W[dc]\r
+;\r
+B[bc]\r
+;\r
+W[eb]\r
+;\r
+B[fb]\r
+;\r
+W[cb]\r
+;\r
+B[ch]\r
+;\r
+W[bb]\r
+;\r
+B[ac]\r
+;\r
+W[ci]\r
+;\r
+B[bi]\r
+;\r
+W[ah]\r
+;\r
+B[ea]\r
+;\r
+W[db]\r
+;\r
+B[di]\r
+;\r
+W[bd]\r
+;\r
+B[if]\r
+;\r
+W[dg]\r
+;\r
+B[ig]\r
+;\r
+W[ih]\r
+;\r
+B[ie]\r
+;\r
+W[hh]\r
+;\r
+B[ff]\r
+;\r
+W[fd]\r
+;\r
+B[fc]\r
+;\r
+W[gd]\r
+;\r
+B[hd]\r
+;\r
+W[da]\r
+;\r
+B[hb]\r
+;\r
+W[fa]\r
+;\r
+B[ga]\r
+;\r
+W[ef]\r
+;\r
+B[ea]\r
+;\r
+W[ed]\r
+;\r
+B[fa]\r
+;\r
+W[fe]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_23.sgf b/regression/games/trevor/trevor_23.sgf
new file mode 100644 (file)
index 0000000..a7cc4e5
--- /dev/null
@@ -0,0 +1,110 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cc]\r
+;\r
+W[gc]\r
+;\r
+B[cg]\r
+;\r
+W[gg]\r
+;\r
+B[ee]\r
+;\r
+W[eg]\r
+;\r
+B[dh]\r
+;\r
+W[ge]\r
+;\r
+B[gi]\r
+;\r
+W[ed]\r
+;\r
+B[de]\r
+;\r
+W[db]\r
+;\r
+B[cb]\r
+;\r
+W[dc]\r
+;\r
+B[cd]\r
+;\r
+W[gh]\r
+;\r
+B[hi]\r
+;\r
+W[hh]\r
+;\r
+B[fi]\r
+;\r
+W[ca]\r
+;\r
+B[ba]\r
+;\r
+W[da]\r
+;\r
+B[bb]\r
+;\r
+W[eh]\r
+;\r
+B[ei]\r
+;\r
+W[dg]\r
+;\r
+B[fh]\r
+;\r
+W[ch]\r
+;\r
+B[bg]\r
+;\r
+W[di]\r
+;\r
+B[fe]\r
+;\r
+W[fd]\r
+;\r
+B[bh]\r
+;\r
+W[bi]\r
+;\r
+B[ff]\r
+;\r
+W[fg]\r
+;\r
+B[gf]\r
+;\r
+W[hf]\r
+;\r
+B[ah]\r
+;\r
+W[df]\r
+;\r
+B[ce]\r
+;\r
+W[cf]\r
+;\r
+B[bf]\r
+;\r
+W[ci]\r
+;\r
+B[ai]\r
+;\r
+W[ii]\r
+;\r
+B[ef]\r
+;\r
+W[dd]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_24.sgf b/regression/games/trevor/trevor_24.sgf
new file mode 100644 (file)
index 0000000..f7e1dfc
--- /dev/null
@@ -0,0 +1,122 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cf]\r
+;\r
+W[gg]\r
+;\r
+B[fc]\r
+;\r
+W[he]\r
+;\r
+B[eg]\r
+;\r
+W[fh]\r
+;\r
+B[ff]\r
+;\r
+W[dh]\r
+;\r
+B[cc]\r
+;\r
+W[bg]\r
+;\r
+B[cg]\r
+;\r
+W[ch]\r
+;\r
+B[bf]\r
+;\r
+W[gb]\r
+;\r
+B[bh]\r
+;\r
+W[bi]\r
+;\r
+B[ag]\r
+;\r
+W[gc]\r
+;\r
+B[fb]\r
+;\r
+W[fa]\r
+;\r
+B[ea]\r
+;\r
+W[fd]\r
+;\r
+B[ga]\r
+;\r
+W[ee]\r
+;\r
+B[dg]\r
+;\r
+W[eh]\r
+;\r
+B[hb]\r
+;\r
+W[gd]\r
+;\r
+B[hc]\r
+;\r
+W[hd]\r
+;\r
+B[ic]\r
+;\r
+W[ec]\r
+;\r
+B[ha]\r
+;\r
+W[db]\r
+;\r
+B[cb]\r
+;\r
+W[da]\r
+;\r
+B[ca]\r
+;\r
+W[dc]\r
+;\r
+B[dd]\r
+;\r
+W[cd]\r
+;\r
+B[bd]\r
+;\r
+W[de]\r
+;\r
+B[ce]\r
+;\r
+W[gf]\r
+;\r
+B[fe]\r
+;\r
+W[fg]\r
+;\r
+B[ef]\r
+;\r
+W[ge]\r
+;\r
+B[ah]\r
+;\r
+W[ci]\r
+;\r
+B[df]\r
+;\r
+W[ed]\r
+;\r
+B[cd]\r
+;\r
+W[ai]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_25.sgf b/regression/games/trevor/trevor_25.sgf
new file mode 100644 (file)
index 0000000..80a1aa9
--- /dev/null
@@ -0,0 +1,110 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cc]\r
+;\r
+W[cg]\r
+;\r
+B[gg]\r
+;\r
+W[gc]\r
+;\r
+B[fd]\r
+;\r
+W[gd]\r
+;\r
+B[eg]\r
+;\r
+W[dh]\r
+;\r
+B[eh]\r
+;\r
+W[ce]\r
+;\r
+B[fc]\r
+;\r
+W[fb]\r
+;\r
+B[eb]\r
+;\r
+W[gb]\r
+;\r
+B[fa]\r
+;\r
+W[bd]\r
+;\r
+B[bc]\r
+;\r
+W[hf]\r
+;\r
+B[hg]\r
+;\r
+W[he]\r
+;\r
+B[ee]\r
+;\r
+W[ei]\r
+;\r
+B[fi]\r
+;\r
+W[di]\r
+;\r
+B[cd]\r
+;\r
+W[fh]\r
+;\r
+B[be]\r
+;\r
+W[bf]\r
+;\r
+B[ad]\r
+;\r
+W[fg]\r
+;\r
+B[gh]\r
+;\r
+W[ff]\r
+;\r
+B[gi]\r
+;\r
+W[ef]\r
+;\r
+B[de]\r
+;\r
+W[cf]\r
+;\r
+B[ga]\r
+;\r
+W[ha]\r
+;\r
+B[ea]\r
+;\r
+W[hb]\r
+;\r
+B[fe]\r
+;\r
+W[gf]\r
+;\r
+B[df]\r
+;\r
+W[dg]\r
+;\r
+B[af]\r
+;\r
+W[ag]\r
+;\r
+B[ae]\r
+;\r
+W[ge]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_26.sgf b/regression/games/trevor/trevor_26.sgf
new file mode 100644 (file)
index 0000000..47d8243
--- /dev/null
@@ -0,0 +1,114 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[dg]\r
+;\r
+W[fd]\r
+;\r
+B[cd]\r
+;\r
+W[fg]\r
+;\r
+B[ec]\r
+;\r
+W[fc]\r
+;\r
+B[eh]\r
+;\r
+W[fh]\r
+;\r
+B[ee]\r
+;\r
+W[fe]\r
+;\r
+B[fb]\r
+;\r
+W[gb]\r
+;\r
+B[eb]\r
+;\r
+W[eg]\r
+;\r
+B[dh]\r
+;\r
+W[ed]\r
+;\r
+B[ga]\r
+;\r
+W[hb]\r
+;\r
+B[ef]\r
+;\r
+W[dd]\r
+;\r
+B[dc]\r
+;\r
+W[de]\r
+;\r
+B[ce]\r
+;\r
+W[df]\r
+;\r
+B[cf]\r
+;\r
+W[ei]\r
+;\r
+B[ha]\r
+;\r
+W[di]\r
+;\r
+B[ib]\r
+;\r
+W[hd]\r
+;\r
+B[ic]\r
+;\r
+W[hc]\r
+;\r
+B[ia]\r
+;\r
+W[ch]\r
+;\r
+B[cg]\r
+;\r
+W[bh]\r
+;\r
+B[bg]\r
+;\r
+W[id]\r
+;\r
+B[ah]\r
+;\r
+W[fa]\r
+;\r
+B[bi]\r
+;\r
+W[ea]\r
+;\r
+B[cc]\r
+;\r
+W[db]\r
+;\r
+B[cb]\r
+;\r
+W[da]\r
+;\r
+B[ca]\r
+;\r
+W[ga]\r
+;\r
+B[ci]\r
+;\r
+W[fi]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_27.sgf b/regression/games/trevor/trevor_27.sgf
new file mode 100644 (file)
index 0000000..3356f4a
--- /dev/null
@@ -0,0 +1,130 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[ee]\r
+;\r
+W[gd]\r
+;\r
+B[dc]\r
+;\r
+W[cf]\r
+;\r
+B[ce]\r
+;\r
+W[ff]\r
+;\r
+B[df]\r
+;\r
+W[fg]\r
+;\r
+B[eh]\r
+;\r
+W[fh]\r
+;\r
+B[fb]\r
+;\r
+W[hb]\r
+;\r
+B[gc]\r
+;\r
+W[hc]\r
+;\r
+B[fd]\r
+;\r
+W[ge]\r
+;\r
+B[gb]\r
+;\r
+W[dh]\r
+;\r
+B[eg]\r
+;\r
+W[cg]\r
+;\r
+B[di]\r
+;\r
+W[dg]\r
+;\r
+B[ef]\r
+;\r
+W[be]\r
+;\r
+B[fi]\r
+;\r
+W[cd]\r
+;\r
+B[cc]\r
+;\r
+W[de]\r
+;\r
+B[ci]\r
+;\r
+W[bh]\r
+;\r
+B[bc]\r
+;\r
+W[bi]\r
+;\r
+B[ha]\r
+;\r
+W[fe]\r
+;\r
+B[gh]\r
+;\r
+W[ed]\r
+;\r
+B[hh]\r
+;\r
+W[ec]\r
+;\r
+B[eb]\r
+;\r
+W[ei]\r
+;\r
+B[ib]\r
+;\r
+W[gi]\r
+;\r
+B[hd]\r
+;\r
+W[ih]\r
+;\r
+B[he]\r
+;\r
+W[hg]\r
+;\r
+B[hf]\r
+;\r
+W[hi]\r
+;\r
+B[fc]\r
+;\r
+W[bd]\r
+;\r
+B[ad]\r
+;\r
+W[dd]\r
+;\r
+B[gf]\r
+;\r
+W[gg]\r
+;\r
+B[if]\r
+;\r
+W[ae]\r
+;\r
+B[ac]\r
+;\r
+W[ig]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_28.sgf b/regression/games/trevor/trevor_28.sgf
new file mode 100644 (file)
index 0000000..69ed57e
--- /dev/null
@@ -0,0 +1,110 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[cg]\r
+;\r
+W[gc]\r
+;\r
+B[cc]\r
+;\r
+W[ec]\r
+;\r
+B[gg]\r
+;\r
+W[db]\r
+;\r
+B[dd]\r
+;\r
+W[ff]\r
+;\r
+B[fg]\r
+;\r
+W[gf]\r
+;\r
+B[ef]\r
+;\r
+W[cb]\r
+;\r
+B[hf]\r
+;\r
+W[he]\r
+;\r
+B[ge]\r
+;\r
+W[fe]\r
+;\r
+B[gd]\r
+;\r
+W[hg]\r
+;\r
+B[hh]\r
+;\r
+W[if]\r
+;\r
+B[bb]\r
+;\r
+W[ba]\r
+;\r
+B[ab]\r
+;\r
+W[ih]\r
+;\r
+B[hi]\r
+;\r
+W[ee]\r
+;\r
+B[de]\r
+;\r
+W[eg]\r
+;\r
+B[fh]\r
+;\r
+W[eh]\r
+;\r
+B[df]\r
+;\r
+W[fi]\r
+;\r
+B[dh]\r
+;\r
+W[gh]\r
+;\r
+B[ed]\r
+;\r
+W[hd]\r
+;\r
+B[fd]\r
+;\r
+W[dg]\r
+;\r
+B[ch]\r
+;\r
+W[dc]\r
+;\r
+B[bc]\r
+;\r
+W[ca]\r
+;\r
+B[fc]\r
+;\r
+W[fb]\r
+;\r
+B[di]\r
+;\r
+W[ei]\r
+;\r
+B[aa]\r
+;\r
+W[gb]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_29.sgf b/regression/games/trevor/trevor_29.sgf
new file mode 100644 (file)
index 0000000..b57cf9c
--- /dev/null
@@ -0,0 +1,134 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[gg]\r
+;\r
+W[gc]\r
+;\r
+B[cf]\r
+;\r
+W[eg]\r
+;\r
+B[ef]\r
+;\r
+W[dg]\r
+;\r
+B[cg]\r
+;\r
+W[df]\r
+;\r
+B[ff]\r
+;\r
+W[de]\r
+;\r
+B[bd]\r
+;\r
+W[dc]\r
+;\r
+B[cb]\r
+;\r
+W[eb]\r
+;\r
+B[he]\r
+;\r
+W[fh]\r
+;\r
+B[gh]\r
+;\r
+W[cc]\r
+;\r
+B[bc]\r
+;\r
+W[hd]\r
+;\r
+B[ge]\r
+;\r
+W[ie]\r
+;\r
+B[if]\r
+;\r
+W[id]\r
+;\r
+B[hf]\r
+;\r
+W[gi]\r
+;\r
+B[hi]\r
+;\r
+W[fi]\r
+;\r
+B[ih]\r
+;\r
+W[ch]\r
+;\r
+B[bh]\r
+;\r
+W[dh]\r
+;\r
+B[db]\r
+;\r
+W[bi]\r
+;\r
+B[ec]\r
+;\r
+W[fc]\r
+;\r
+B[ed]\r
+;\r
+W[fa]\r
+;\r
+B[bg]\r
+;\r
+W[da]\r
+;\r
+B[dd]\r
+;\r
+W[ce]\r
+;\r
+B[be]\r
+;\r
+W[ca]\r
+;\r
+B[cd]\r
+;\r
+W[bb]\r
+;\r
+B[gd]\r
+;\r
+W[hc]\r
+;\r
+B[fd]\r
+;\r
+W[ba]\r
+;\r
+B[ab]\r
+;\r
+W[ea]\r
+;\r
+B[ac]\r
+;\r
+W[aa]\r
+;\r
+B[ga]\r
+;\r
+W[ha]\r
+;\r
+B[fb]\r
+;\r
+W[ib]\r
+;\r
+B[gb]\r
+;\r
+W[hb]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_30.sgf b/regression/games/trevor/trevor_30.sgf
new file mode 100644 (file)
index 0000000..f863aa3
--- /dev/null
@@ -0,0 +1,58 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[dd]\r
+;\r
+W[cd]\r
+;\r
+B[dc]\r
+;\r
+W[cc]\r
+;\r
+B[dg]\r
+;\r
+W[db]\r
+;\r
+B[eb]\r
+;\r
+W[cb]\r
+;\r
+B[fc]\r
+;\r
+W[ba]\r
+;\r
+B[ce]\r
+;\r
+W[be]\r
+;\r
+B[cf]\r
+;\r
+W[bf]\r
+;\r
+B[bg]\r
+;\r
+W[ea]\r
+;\r
+B[fa]\r
+;\r
+W[da]\r
+;\r
+B[af]\r
+;\r
+W[ad]\r
+;\r
+B[ag]\r
+;\r
+W[ae]\r
+;\r
+B[tt]\r
+;\r
+W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_31.sgf b/regression/games/trevor/trevor_31.sgf
new file mode 100644 (file)
index 0000000..f79ef38
--- /dev/null
@@ -0,0 +1,13 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+GN[White (W) vs. Black (B)]\r
+DT[2000-10-19]\r
+PB[Black]\r
+PW[White][White]\r
+AW[ac][ah][bd][be][ce][ci][dd][df][dh][ed][ef][eg][eh][fc][fd][fe][gd][gf][hd][hf][if]\r
+AB[af][bc][bf][bg][bh][bi][cc][cf][cg][ch][dc][de][dg][ec][fb][gc][ge][hc][he][ib][ic][id][ie]\r
+)\r
diff --git a/regression/games/trevor/trevor_32.sgf b/regression/games/trevor/trevor_32.sgf
new file mode 100644 (file)
index 0000000..8cf5c44
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[4]
+GM[1]
+SZ[9]
+AP[Jago:Version 4.18]
+AW[ch][dh][eh][fd][ff][fg][fh][gd][hd][id][ie][ed][ee][be][de][cd][ae][dc][eb][ea][cg][cf][ci][ce][fc][fb]
+AB[ge][gf][gg][gh][he][if][ad][bd][cc][bb][db][da][bc][ba][ga][gb][gc][hc][ic][ib][ha][bi][bh][bg][bf][af][ah]
+GN[x]
+)
diff --git a/regression/games/trevor/trevor_33.sgf b/regression/games/trevor/trevor_33.sgf
new file mode 100644 (file)
index 0000000..4c1d29d
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[19]\r
+AP[Jago:Version 4.18]\r
+GN[x]\r
+AB[ba][bc][bf][bo][cb][cc][ce][cg][co][cp][dd][df][dj][dn][ef][fj][fm][gd][gi][gk][gm][hj][hn][id][ie][ii][im][in][jf][ji][jm][jp][kc][ke][kh][kl][km][kn][kq][ld][lf][li][ln][lo][lp][md][mi][mj][mo][mr][ng][nl][nn][np][nq][ns][oe][of][oh][oi][om][on][pl][pp][qp][ro][sp]\r
+AW[bd][be][bg][bp][bq][ca][cq][da][db][dq][ec][ep][fc][gc][gn][go][hk][hl][hm][ho][ic][ij][il][io][iq][jc][jd][je][jj][jk][jl][jn][jo][kd][ki][kj][kk][ko][kp][kr][lb][lc][lj][ll][lm][lq][lr][mk][mm][mn][mq][nc][nk][nm][od][og][pf][qd][qg][qi][qj][qn][qo][rl][rn]\r
+)\r
diff --git a/regression/games/trevor/trevor_34.sgf b/regression/games/trevor/trevor_34.sgf
new file mode 100644 (file)
index 0000000..4c1d29d
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[19]\r
+AP[Jago:Version 4.18]\r
+GN[x]\r
+AB[ba][bc][bf][bo][cb][cc][ce][cg][co][cp][dd][df][dj][dn][ef][fj][fm][gd][gi][gk][gm][hj][hn][id][ie][ii][im][in][jf][ji][jm][jp][kc][ke][kh][kl][km][kn][kq][ld][lf][li][ln][lo][lp][md][mi][mj][mo][mr][ng][nl][nn][np][nq][ns][oe][of][oh][oi][om][on][pl][pp][qp][ro][sp]\r
+AW[bd][be][bg][bp][bq][ca][cq][da][db][dq][ec][ep][fc][gc][gn][go][hk][hl][hm][ho][ic][ij][il][io][iq][jc][jd][je][jj][jk][jl][jn][jo][kd][ki][kj][kk][ko][kp][kr][lb][lc][lj][ll][lm][lq][lr][mk][mm][mn][mq][nc][nk][nm][od][og][pf][qd][qg][qi][qj][qn][qo][rl][rn]\r
+)\r
diff --git a/regression/games/trevor/trevor_35.sgf b/regression/games/trevor/trevor_35.sgf
new file mode 100644 (file)
index 0000000..0a5e82f
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[19]\r
+AP[Jago:Version 4.18]\r
+GN[x]\r
+AB[ba][bc][bf][bo][cb][cc][ce][cg][co][cp][dd][df][dj][dn][ef][fj][fm][gd][gi][gk][gm][hj][hn][id][ie][ii][im][in][jf][ji][jm][jp][kc][ke][kh][km][kn][kq][ld][lf][li][ln][lo][lp][md][mi][mj][mo][mr][ng][nl][nn][np][nq][ns][oe][of][oh][oi][oj][ok][om][on][pl][pp][qp][ro][sp]\r
+AW[bd][be][bg][bp][bq][ca][cq][da][db][dq][ec][ep][fc][gc][gn][go][hk][hl][hm][ho][ic][ij][il][io][iq][jc][jd][je][jj][jk][jl][jn][jo][kd][ki][kk][ko][kp][kr][lb][lc][lj][ll][lm][lq][lr][mk][mm][mn][mq][nc][ni][nj][nk][nm][od][og][pf][qd][qg][qi][qj][qn][qo][rl][rn]\r
+)\r
diff --git a/regression/games/trevor/trevor_36.sgf b/regression/games/trevor/trevor_36.sgf
new file mode 100644 (file)
index 0000000..52233c4
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[eb][ec][fa][fc][fe][gd][he][id][ie]\r
+AW[fb][ga][gb][gc][hb][hd][ic]\r
+GN[x]\r
+)\r
diff --git a/regression/games/trevor/trevor_37.sgf b/regression/games/trevor/trevor_37.sgf
new file mode 100644 (file)
index 0000000..6fc319a
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[cb][ca][da][ea][bb][ab][gb][gc][gd][hd][he][hg][ig][hf]\r
+AW[eb][db][cc][dd][fa][fc][ed][bc][ac]\r
+)\r
diff --git a/regression/games/trevor/trevor_38.sgf b/regression/games/trevor/trevor_38.sgf
new file mode 100644 (file)
index 0000000..b8f0a40
--- /dev/null
@@ -0,0 +1,45 @@
+(;GM[1]FF[4]RU[Japanese]SZ[9]HA[0]KM[5.5];B[fg]\r
+;W[ge]\r
+;B[cf]\r
+;W[hg]\r
+;B[gc]\r
+;W[hd]\r
+;B[fe]\r
+;W[gh]\r
+;B[fh]\r
+;W[hb]\r
+;B[gb]\r
+;W[hc]\r
+;B[gg]\r
+;W[gf]\r
+;B[hh]\r
+;W[fd]\r
+;B[fc]\r
+;W[ff]\r
+;B[hf]\r
+;W[ee]\r
+;B[dd]\r
+;W[ef]\r
+;B[ec]\r
+;W[dg]\r
+;B[cg]\r
+;W[ha]\r
+;B[dh]\r
+;W[he]\r
+;B[ig]\r
+;W[eg]\r
+;B[eh]\r
+;W[ga]\r
+;B[fa]\r
+;W[de]\r
+;B[ce]\r
+;W[ie]\r
+;B[if]\r
+;W[ed]\r
+;B[cd]\r
+;W[gd]\r
+;B[ea]\r
+;W[df]\r
+;B[tt]\r
+;W[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_39.sgf b/regression/games/trevor/trevor_39.sgf
new file mode 100644 (file)
index 0000000..8e7256f
--- /dev/null
@@ -0,0 +1,120 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[ff]\r
+;\r
+W[cg]\r
+;\r
+B[fc]\r
+;\r
+W[cd]\r
+;\r
+B[eg]\r
+;\r
+W[dh]\r
+;\r
+B[eh]\r
+;\r
+W[dc]\r
+;\r
+B[eb]\r
+;\r
+W[db]\r
+;\r
+B[dg]\r
+;\r
+W[ch]\r
+;\r
+B[da]\r
+;\r
+W[ca]\r
+;\r
+B[ea]\r
+;\r
+W[cb]\r
+;\r
+B[de]\r
+;\r
+W[ce]\r
+;\r
+B[cf]\r
+;\r
+W[bf]\r
+;\r
+B[df]\r
+;\r
+W[ec]\r
+;\r
+B[fb]\r
+;\r
+W[ei]\r
+;\r
+B[fi]\r
+;\r
+W[di]\r
+;\r
+B[gh]\r
+;\r
+W[ed]\r
+;\r
+B[fd]\r
+;\r
+W[ee]\r
+;\r
+B[dd]\r
+;\r
+W[fe]\r
+;\r
+B[ge]\r
+;\r
+W[gd]\r
+;\r
+B[he]\r
+;\r
+W[ef]\r
+;\r
+B[fg]\r
+;\r
+W[tt]\r
+;\r
+B[bg]\r
+;\r
+W[bh]\r
+;\r
+B[be]\r
+;\r
+W[ag]\r
+;\r
+B[bd]\r
+;\r
+W[ae]\r
+;\r
+B[cc]\r
+;\r
+W[ad]\r
+;\r
+B[bb]\r
+;\r
+W[ac]\r
+;\r
+B[ba]\r
+;\r
+W[ab]\r
+;\r
+B[bc]\r
+;\r
+W[af]\r
+;\r
+B[aa]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_40.sgf b/regression/games/trevor/trevor_40.sgf
new file mode 100644 (file)
index 0000000..527f602
--- /dev/null
@@ -0,0 +1,26 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[ac][bb][cb][db][dc][af][bf][cf][df][ef][eg][eh][ei][ch][bh][fd][gd]\r
+AB[fc][gc][ed][dd][cc][ae][be][ce][de][ee][ff][fh][fg][fi][gf][hf][if][hc][ic][id][ie][hh]\r
+GN[trevor_40]\r
+;\r
+B[eb]\r
+;\r
+W[ec]\r
+;\r
+B[fb]\r
+;\r
+W[aa]\r
+;\r
+B[bc]\r
+;\r
+W[bd]\r
+;\r
+B[cd]\r
+;\r
+W[fe]\r
+)\r
diff --git a/regression/games/trevor/trevor_40a.sgf b/regression/games/trevor/trevor_40a.sgf
new file mode 100644 (file)
index 0000000..8e03794
--- /dev/null
@@ -0,0 +1,18 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+AP[Jago:Version 4.18]\r
+SZ[9]\r
+GN[trevor_40]\r
+AW[ac][af][bb][bf][bh][cb][cf][ch][db][dc][df][ef][eg][eh][ei][fd][gd]\r
+AB[ae][be][cc][ce][dd][de][ed][ee][fc][ff][fg][fh][fi][gc][gf][hc][hf][hh][ic][id][ie][if]\r
+;\r
+B[ea]\r
+;\r
+W[fb]\r
+;\r
+B[eb]\r
+;\r
+W[ec]\r
+)\r
diff --git a/regression/games/trevor/trevor_41.sgf b/regression/games/trevor/trevor_41.sgf
new file mode 100644 (file)
index 0000000..2483cf6
--- /dev/null
@@ -0,0 +1,124 @@
+(\r
+;\r
+AP[Jago:Version 4.18]\r
+GM[1]\r
+FF[4]\r
+RU[Japanese]\r
+SZ[9]\r
+HA[0]\r
+KM[5.5]\r
+;\r
+B[df]\r
+;\r
+W[fg]\r
+;\r
+B[ff]\r
+;\r
+W[gf]\r
+;\r
+B[fe]\r
+;\r
+W[eg]\r
+;\r
+B[dg]\r
+;\r
+W[hd]\r
+;\r
+B[fc]\r
+;\r
+W[gb]\r
+;\r
+B[fb]\r
+;\r
+W[dh]\r
+;\r
+B[ch]\r
+;\r
+W[ei]\r
+;\r
+B[gc]\r
+;\r
+W[ci]\r
+;\r
+B[bh]\r
+;\r
+W[hb]\r
+;\r
+B[fa]\r
+;\r
+W[hc]\r
+;\r
+B[cc]\r
+;\r
+W[bi]\r
+;\r
+B[ge]\r
+;\r
+W[hf]\r
+;\r
+B[he]\r
+;\r
+W[ie]\r
+;\r
+B[ga]\r
+;\r
+W[ef]\r
+;\r
+B[bf]\r
+;\r
+W[de]\r
+;\r
+B[ce]\r
+;\r
+W[ee]\r
+;\r
+B[ha]\r
+;\r
+W[ah]\r
+;\r
+B[ag]\r
+;\r
+W[cg]\r
+;\r
+B[ai]\r
+;\r
+W[cf]\r
+;\r
+B[be]\r
+;\r
+W[di]\r
+;\r
+B[bg]\r
+;\r
+W[dc]\r
+;\r
+B[ah]\r
+;\r
+W[cb]\r
+;\r
+B[dd]\r
+;\r
+W[ed]\r
+;\r
+B[cd]\r
+;\r
+W[ec]\r
+;\r
+B[bb]\r
+;\r
+W[fd]\r
+;\r
+B[db]\r
+;\r
+W[eb]\r
+;\r
+B[ca]\r
+;\r
+W[ea]\r
+;\r
+B[da]\r
+;\r
+W[tt]\r
+;\r
+B[tt]\r
+)\r
diff --git a/regression/games/trevor/trevor_42.sgf b/regression/games/trevor/trevor_42.sgf
new file mode 100644 (file)
index 0000000..8fbeb23
--- /dev/null
@@ -0,0 +1,553 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+AP[Jago:Version 4.18]\r
+SZ[19]\r
+PB[GnuGo-3.0.0]\r
+PW[FunGo]\r
+KM[0.0]\r
+;\r
+B[dp]\r
+;\r
+B[pd]\r
+;\r
+B[dd]\r
+;\r
+W[pp]\r
+;\r
+B[pj]\r
+;\r
+W[nc]\r
+;\r
+B[lc]\r
+;\r
+W[qc]\r
+;\r
+B[qd]\r
+;\r
+W[pc]\r
+;\r
+B[od]\r
+;\r
+W[nb]\r
+;\r
+B[me]\r
+;\r
+W[qn]\r
+;\r
+B[nq]\r
+;\r
+W[pr]\r
+;\r
+B[kq]\r
+;\r
+W[dj]\r
+;\r
+B[ch]\r
+;\r
+W[cc]\r
+;\r
+B[cd]\r
+;\r
+W[dc]\r
+;\r
+B[ec]\r
+;\r
+W[eb]\r
+;\r
+B[fc]\r
+;\r
+W[fb]\r
+;\r
+B[gc]\r
+;\r
+W[bd]\r
+;\r
+B[be]\r
+;\r
+W[bc]\r
+;\r
+B[cf]\r
+;\r
+W[cm]\r
+;\r
+B[co]\r
+;\r
+W[qi]\r
+;\r
+B[hq]\r
+;\r
+W[ip]\r
+;\r
+B[iq]\r
+;\r
+W[qj]\r
+;\r
+B[go]\r
+;\r
+W[em]\r
+;\r
+B[in]\r
+;\r
+W[qf]\r
+;\r
+B[of]\r
+;\r
+W[pk]\r
+;\r
+B[oi]\r
+;\r
+W[ok]\r
+;\r
+B[nh]\r
+;\r
+W[hb]\r
+;\r
+B[id]\r
+;\r
+W[jc]\r
+;\r
+B[jd]\r
+;\r
+W[kc]\r
+;\r
+B[mc]\r
+;\r
+W[kd]\r
+;\r
+B[ke]\r
+;\r
+W[lb]\r
+;\r
+B[re]\r
+;\r
+W[jf]\r
+;\r
+B[je]\r
+;\r
+W[if]\r
+;\r
+B[kf]\r
+;\r
+W[ld]\r
+;\r
+B[bj]\r
+;\r
+W[gm]\r
+;\r
+B[fg]\r
+;\r
+W[im]\r
+;\r
+B[bm]\r
+;\r
+W[bn]\r
+;\r
+B[cn]\r
+;\r
+W[bl]\r
+;\r
+B[bo]\r
+;\r
+W[jp]\r
+;\r
+B[lq]\r
+;\r
+W[hn]\r
+;\r
+B[ck]\r
+;\r
+W[am]\r
+;\r
+B[mn]\r
+;\r
+W[jn]\r
+;\r
+B[rg]\r
+;\r
+W[fp]\r
+;\r
+B[fq]\r
+;\r
+W[eq]\r
+;\r
+B[ep]\r
+;\r
+W[gp]\r
+;\r
+B[gq]\r
+;\r
+W[fo]\r
+;\r
+B[li]\r
+;\r
+W[ii]\r
+;\r
+B[jh]\r
+;\r
+W[ji]\r
+;\r
+B[ih]\r
+;\r
+W[hh]\r
+;\r
+B[hg]\r
+;\r
+W[kh]\r
+;\r
+B[ig]\r
+;\r
+W[gh]\r
+;\r
+B[gg]\r
+;\r
+W[ki]\r
+;\r
+B[lh]\r
+;\r
+W[dk]\r
+;\r
+B[rc]\r
+;\r
+W[ms]\r
+;\r
+B[ln]\r
+;\r
+W[rh]\r
+;\r
+B[qg]\r
+;\r
+W[kg]\r
+;\r
+B[jg]\r
+;\r
+W[lg]\r
+;\r
+B[hi]\r
+;\r
+W[fi]\r
+;\r
+B[on]\r
+;\r
+W[hc]\r
+;\r
+B[hd]\r
+;\r
+W[ao]\r
+;\r
+B[bp]\r
+;\r
+W[hj]\r
+;\r
+B[nl]\r
+;\r
+W[nk]\r
+;\r
+B[qh]\r
+;\r
+W[pi]\r
+;\r
+B[ri]\r
+;\r
+W[ph]\r
+;\r
+B[rj]\r
+;\r
+W[oj]\r
+;\r
+B[rl]\r
+;\r
+W[ql]\r
+;\r
+B[mr]\r
+;\r
+W[rm]\r
+;\r
+B[ns]\r
+;\r
+W[lj]\r
+;\r
+B[oc]\r
+;\r
+W[ob]\r
+;\r
+B[qb]\r
+;\r
+W[pb]\r
+;\r
+B[rb]\r
+;\r
+W[ml]\r
+;\r
+B[rk]\r
+;\r
+W[km]\r
+;\r
+B[hp]\r
+;\r
+W[ho]\r
+;\r
+B[eo]\r
+;\r
+W[fn]\r
+;\r
+B[ol]\r
+;\r
+W[md]\r
+;\r
+B[nf]\r
+;\r
+W[mg]\r
+;\r
+B[oh]\r
+;\r
+W[pg]\r
+;\r
+B[pf]\r
+;\r
+W[cj]\r
+;\r
+B[mf]\r
+;\r
+W[bi]\r
+;\r
+B[bh]\r
+;\r
+W[aj]\r
+;\r
+B[eh]\r
+;\r
+W[ap]\r
+;\r
+B[aq]\r
+;\r
+W[an]\r
+;\r
+B[cq]\r
+;\r
+W[jq]\r
+;\r
+B[jr]\r
+;\r
+W[ir]\r
+;\r
+B[hr]\r
+;\r
+W[or]\r
+;\r
+B[dn]\r
+;\r
+W[nr]\r
+;\r
+B[ls]\r
+;\r
+W[kr]\r
+;\r
+B[is]\r
+;\r
+W[no]\r
+;\r
+B[oo]\r
+;\r
+W[oq]\r
+;\r
+B[op]\r
+;\r
+W[ko]\r
+;\r
+B[gb]\r
+;\r
+W[nm]\r
+;\r
+B[om]\r
+;\r
+W[mm]\r
+;\r
+B[nn]\r
+;\r
+W[mj]\r
+;\r
+B[ha]\r
+;\r
+W[ib]\r
+;\r
+B[ni]\r
+;\r
+W[ia]\r
+;\r
+B[ga]\r
+;\r
+W[ae]\r
+;\r
+B[af]\r
+;\r
+W[br]\r
+;\r
+B[bq]\r
+;\r
+W[ei]\r
+;\r
+B[cr]\r
+;\r
+W[fe]\r
+;\r
+B[ad]\r
+;\r
+W[cb]\r
+;\r
+B[ab]\r
+;\r
+W[ac]\r
+;\r
+B[da]\r
+;\r
+W[db]\r
+;\r
+B[ba]\r
+;\r
+W[bb]\r
+;\r
+B[fa]\r
+;\r
+W[aa]\r
+;\r
+B[al]\r
+;\r
+W[ak]\r
+;\r
+B[ab]\r
+;\r
+W[ae]\r
+;\r
+B[ca]\r
+;\r
+W[aa]\r
+;\r
+B[ea]\r
+;\r
+W[ed]\r
+;\r
+B[de]\r
+;\r
+W[gd]\r
+;\r
+B[ab]\r
+;\r
+W[rf]\r
+;\r
+B[ad]\r
+;\r
+W[sg]\r
+;\r
+B[po]\r
+;\r
+W[qo]\r
+;\r
+B[lm]\r
+;\r
+W[kl]\r
+;\r
+B[ll]\r
+;\r
+W[mk]\r
+;\r
+B[lk]\r
+;\r
+W[kk]\r
+;\r
+B[pa]\r
+;\r
+W[qp]\r
+;\r
+B[nd]\r
+;\r
+W[oa]\r
+;\r
+B[qa]\r
+;\r
+W[dh]\r
+;\r
+B[dg]\r
+;\r
+W[di]\r
+;\r
+B[qe]\r
+;\r
+W[fh]\r
+;\r
+B[eg]\r
+;\r
+W[mh]\r
+;\r
+B[mi]\r
+;\r
+W[og]\r
+;\r
+B[ng]\r
+;\r
+W[lp]\r
+;\r
+B[mp]\r
+;\r
+W[lo]\r
+;\r
+B[mo]\r
+;\r
+W[os]\r
+;\r
+B[se]\r
+;\r
+W[ic]\r
+;\r
+B[dm]\r
+;\r
+W[dl]\r
+;\r
+B[ms]\r
+;\r
+W[pm]\r
+;\r
+B[mb]\r
+;\r
+W[ma]\r
+;\r
+B[en]\r
+;\r
+W[ah]\r
+;\r
+B[ag]\r
+;\r
+W[ai]\r
+;\r
+B[le]\r
+;\r
+W[kp]\r
+;\r
+B[pl]\r
+;\r
+W[qk]\r
+;\r
+B[pn]\r
+;\r
+W[qm]\r
+;\r
+B[nj]\r
+;\r
+W[kn]\r
+;\r
+B[ci]\r
+;\r
+W[bg]\r
+;\r
+B[cg]\r
+;\r
+W[sf]\r
+;\r
+B[lf]\r
+;\r
+;\r
+C[ÅÌÃæ\r
+B: 91\r
+W: 95]\r
+)\r
diff --git a/regression/games/trevor/trevor_43.sgf b/regression/games/trevor/trevor_43.sgf
new file mode 100644 (file)
index 0000000..1ce5a9d
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[gh][gg][fi][ei][eh][eg][ef][ff][de][dd][ed][fd][gd]\r
+AW[ee][fe][dh][fh][gi][hi][hh][hg][ig][if][ie][id][ic][hc][gc][ec][cc][cd][ce][cf][df][ch][gb][eb][cb]\r
+)\r
diff --git a/regression/games/trevor/trevor_44.sgf b/regression/games/trevor/trevor_44.sgf
new file mode 100644 (file)
index 0000000..59d1fe8
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[eg][fg][gf][ge][df][de][ed][fd][ec][dc][cc][cd][ce]\r
+AW[dg][dh][eh][fh][gh][gg][hg][hf][hd][gd][he][fc][eb][db][cb][bb][bc][bd][be][bf][cf][fb]\r
+)\r
diff --git a/regression/games/trevor/trevor_45.sgf b/regression/games/trevor/trevor_45.sgf
new file mode 100644 (file)
index 0000000..b143680
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[eh][dg][dh][ef][fg][de][dd][ed][fe][gg][gf][ge][ff][bi][bh][bg][bf][be][bd][bc][bb][cb]\r
+AW[di][ci][cg][ch][cf][ce][cd][cc][ec][dc][fc][gc][hc][hd][he][hf][hg][hh][hi][gi][fi][ei]\r
+)\r
diff --git a/regression/games/trevor/trevor_46.sgf b/regression/games/trevor/trevor_46.sgf
new file mode 100644 (file)
index 0000000..071e051
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.18]
+GN[x]
+AW[ad][be][bf][bg][bi][bj][bk][ce][cg][ch][ci][df][fb][fc][fe][fg][ga][gb][gd][hc][hd][ib][id][ja][jc][je][kb][kd][ke][km][kn][ko][kp][kq][kr][lb][lc][ld][le][nc][no][nq][ob][od][op][or][os][pc][pl][pm][pq][pr][qc][qk][qm][rb][rj][rk][rn]
+AB[ah][ak][bc][bd][bl][cj][ck][cm][dd][de][dg][dh][di][dj][dp][ea][eb][ec][fa][gp][ie][if][jf][jj][jn][jo][jp][jq][jr][kf][lf][ln][mf][ne][ng][nn][oe][of][og][ol][om][pd][ph][pj][pn][po][pp][ps][qd][qf][qg][qj][qq][qr][qs][rc][re][ri][rp][sd]
+)
diff --git a/regression/games/trevor/trevor_47.sgf b/regression/games/trevor/trevor_47.sgf
new file mode 100644 (file)
index 0000000..dfe3204
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[ab][ah][bb][bh][bi][cb][cg][ci][db][dh][di][eb][ec][ed][ee][ef][eg][eh][fa][fb][fc][fd][fe][ge][he][hf][id][if]\r
+AW[ac][ad][ae][af][bc][bg][cc][ce][cf][dc][dd][de][df][dg][ga][gb][gc][hd][ib][ic]\r
+)\r
diff --git a/regression/games/trevor/trevor_48.sgf b/regression/games/trevor/trevor_48.sgf
new file mode 100644 (file)
index 0000000..8985bb1
--- /dev/null
@@ -0,0 +1,9 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AB[aa][ac][ag][ba][bc][bg][cb][cd][ce][cf][cg][ch][ci][db][eb][fb][fc][gb][gc]\r
+AW[cc][da][dc][dd][de][df][dg][dh][di][ea][ec][fa][fd][ga][gd][ha][hb][hc][hd]\r
+)\r
diff --git a/regression/games/trevor/trevor_59.sgf b/regression/games/trevor/trevor_59.sgf
new file mode 100644 (file)
index 0000000..af9b49d
--- /dev/null
@@ -0,0 +1,10 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[19]\r
+AP[Jago:Version 4.18]\r
+GN[x]\r
+AB[ab][ad][bd][bo][bp][cb][cc][cd][cp][cq][cr][dr][oa][pb][qb][qc][qd][qq][qr][rd][ro][rp]\r
+AW[ae][be][bm][bn][br][ce][cn][co][db][dc][dd][de][do][dp][dq][eb][eq][er][fr][mb][nb][ob][oc][or][pa][pc][pd][pe][pp][pq][pr][qe][qn][qo][qp][re][rf][rm][rn]\r
+)\r
diff --git a/regression/games/trevor/trevor_60.sgf b/regression/games/trevor/trevor_60.sgf
new file mode 100644 (file)
index 0000000..ef09ea1
--- /dev/null
@@ -0,0 +1,11 @@
+(\r
+;\r
+FF[4]\r
+GM[1]\r
+SZ[9]\r
+AP[Jago:Version 4.18]\r
+AW[ci][ch][dh][eg][ef][ff][gf][gg][gh][gi][fi]\r
+AB[ei][fh][dg][cg][bg][ag][ah][ai][df][de][ee][fe][ge][he][ie][if][ig][ih][ii]\r
+C[owl_attack E3\r
+1 E2]\r
+)\r
diff --git a/regression/games/trevor/trevor_63.sgf b/regression/games/trevor/trevor_63.sgf
new file mode 100644 (file)
index 0000000..9af3f8b
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.18]
+AB[dr][er][fr][fs][hr][ir][jr][js][hs][gh][gi][hi][ih][ig][gg][jg][kg][kh][ki][ji][fi][ei][fg][eg]
+AW[cr][cq][dq][eq][fq][gq][gr][hq][iq][jq][kq][kr][ii][gf][hf][if][jf][kf][ij][jj][kj][lj][mj][lf][mf][mg][mh][mi][hj][gj][fj][ej][dj][di][dh][ch][cg][cf][ce][de][ee][fe][ge]
+)
+
diff --git a/regression/games/trevor/trevor_64.sgf b/regression/games/trevor/trevor_64.sgf
new file mode 100644 (file)
index 0000000..a726dbd
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[11]
+AP[Jago:Version 4.18]
+AW[ja][jb][jc][jf][ie][he][ge][ig][hg][gg][fd][fc][fb][eb][db][gd]
+AB[ha][ga][gb][gc][hc][ib][hd][id][jd]
+)
diff --git a/regression/games/trevor/trevor_65.sgf b/regression/games/trevor/trevor_65.sgf
new file mode 100644 (file)
index 0000000..fdace2b
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AB[fl][ek][dk][ck][cj][ci][ch][fj][gj][hj][ij][ik][jk][kk][kl]
+AW[fk][gk][gl][hk][il][hm][jl]
+)
diff --git a/regression/games/trevor/trevor_66.sgf b/regression/games/trevor/trevor_66.sgf
new file mode 100644 (file)
index 0000000..11c7ed6
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AB[ch][ci][cj][ck][dk][ek][fj][fl][fm][gj][hj][ij][ik][jk][jm][kk][kl]
+AW[el][fk][gk][gl][gm][hk][hm][il][jl]
+)
diff --git a/regression/games/trevor/trevor_67.sgf b/regression/games/trevor/trevor_67.sgf
new file mode 100644 (file)
index 0000000..0ccf812
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[9]
+AP[Jago:Version 4.18]
+AB[dh][eh][gf][hf][if][ig][ih][ii][dg][fg][ff][fe][fd][fc][fb][fa]
+AW[fh][gi][hi][hh][hg][gg][eg][df][cf][ch][bh][bf][ef][bg][ah][be][bd][bc][bb][ba]
+)
diff --git a/regression/games/trevor/trevor_68.sgf b/regression/games/trevor/trevor_68.sgf
new file mode 100644 (file)
index 0000000..d6814db
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AB[ah][bh][bi][bj][bk][bl][cl][dl][eh][ei][ej][ek][el][fh][fm][gh][gl][hh][ih][ii][ij][jj][jk][jl][jm]
+AW[fi][fj][fk][fl][gi][gk][gm][hi][hk][ik][il][im]
+)
diff --git a/regression/games/trevor/trevor_69.sgf b/regression/games/trevor/trevor_69.sgf
new file mode 100644 (file)
index 0000000..ea37bee
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AB[bl][ch][ci][cj][cl][dg][dk][dl][eg][fg][fh][fl][gg][hh][hi][hj][ij][ik][il][jl][jm]
+AW[dm][ei][ej][ek][el][fm][gi][gj][gk][hl][hm][im]
+)
diff --git a/regression/games/trevor/trevor_70.sgf b/regression/games/trevor/trevor_70.sgf
new file mode 100644 (file)
index 0000000..1a3d98f
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AW[bd][cd][ad][dd][dc][db][da][ed][gd][fd][hd][id][jd][kd][md][jc][jb][ja][ld][fm][fl][hl][hm][fk][fj][hj][hk][hh][hf][hg]
+AB[em][el][ek][ej][ei][fi][eg][fg][ee][fe][ge][ie][ke][je][le][me][jf][jg][jh][ji][jj][jk][jl][jm][he]
+)
diff --git a/regression/games/trevor/trevor_71.sgf b/regression/games/trevor/trevor_71.sgf
new file mode 100644 (file)
index 0000000..6d7e133
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AW[ad][bd][cd][da][db][dc][dd][ed][fd][fj][fk][fl][fm][gd][gk][gl][hd][hf][hg][hh][hj][hk][hl][hm][id][ja][jb][jc][jd][kd][ld][md]
+AB[dh][ee][eg][ei][ej][ek][el][em][fe][fg][fh][ge][gg][ie][je][jf][jg][jh][ji][jj][jk][jl][jm][ke][le][me]
+)
diff --git a/regression/games/trevor/trevor_73.sgf b/regression/games/trevor/trevor_73.sgf
new file mode 100644 (file)
index 0000000..04c53e3
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[13]
+AP[Jago:Version 4.18]
+AB[dk][dl][dm][ek][fk][gj][gl][hk][ij][ik][jj][kj][lj][lk][ml]
+AW[fl][gm][hl][il][jk][jl][jm][kk][ll][lm]
+)
diff --git a/regression/games/trevor/trevor_74.sgf b/regression/games/trevor/trevor_74.sgf
new file mode 100644 (file)
index 0000000..3ce2694
--- /dev/null
@@ -0,0 +1,10 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.18]
+AB[ao][bm][bo][bs][cm][cn][cr][do][dp][dq][dr][er][fp][fq]
+AW[ap][aq][bn][bp][br][cp][cq][cs]
+)
+
diff --git a/regression/games/trevor/trevor_75.sgf b/regression/games/trevor/trevor_75.sgf
new file mode 100644 (file)
index 0000000..e8a0fca
--- /dev/null
@@ -0,0 +1,9 @@
+(
+;
+FF[4]
+GM[1]
+SZ[19]
+AP[Jago:Version 4.18]
+AW[mf][mg][mh][mi][mj][mk][nc][oh][pc][pe][pi][qc][qj][rb][re]
+AB[ng][nh][ni][nj][nk][nm][of][pg][qd][qf][qh][rc][ri][sc]
+)
diff --git a/regression/games/tso_igobot_2006-01-16.sgf b/regression/games/tso_igobot_2006-01-16.sgf
new file mode 100644 (file)
index 0000000..92e2597
--- /dev/null
@@ -0,0 +1 @@
+(;PB[tso]HA[0]KM[0.5]PW[igobot]SZ[19]AP[Go Suite:0.92]GM[1]CA[UTF-8]FF[4];B[pd];W[dc];B[pp];W[eq];B[dp];W[dq];B[cq];W[cr];B[bq];W[hd];B[dd];W[ec];B[cc];W[qn];B[qo];W[pn];B[qm];W[cd];B[ce];W[bd];B[bc];W[be];B[cf];W[bf];B[cg];W[cb];B[jd];W[qf];B[qe];W[pf];B[qg];W[nf];B[nd];W[oi];B[rf];W[br];B[rn];W[cp];B[bp];W[co];B[bo];W[cn];B[bn];W[cm];B[bm];W[bl];B[cl];W[bk];B[ck];W[cj];B[dj];W[dl];B[dk];W[bj];B[dm];W[do];B[ep];W[eo];B[fp];W[el];B[fq];W[er];B[fr];W[fs];B[ds];W[es];B[hr];W[gr];B[gq];W[aq];B[gs];W[dr];B[cs];W[ar];B[bs];W[ap];B[ao];W[as];B[cs];W[am];B[kp];W[nn];B[no];W[oo];B[op];W[fo];B[go];W[ic];B[jc];W[le];B[ld];W[de];B[ed];W[ee];B[fd];W[fe];B[ci];W[di];B[dh];W[ei];B[eh];W[fi];B[bi];W[gg];B[fg];W[df];B[dg];W[fh];B[ff];W[gd];B[ge];W[fc];B[gf];W[if];B[hg];W[gh];B[hf];W[gn];B[ho];W[pg];B[qh];W[qj];B[rj];W[rk];B[ri];W[pk];B[pl];W[ol];B[pm];W[om];B[po];W[on];B[rm];W[jh];B[jf];W[ig];B[jg];W[ef];B[eg];W[ie];B[hh];W[hi];B[ih];W[id];B[ji];W[kh];B[ii];W[ki];B[hj];W[gi];B[jk];W[lk];B[jm];W[je];B[ke];W[kf];B[kd];W[me];B[md];W[jb];B[kb];W[ib];B[ne];W[lf];B[hn];W[gm];B[hm];W[ln];B[lo];W[mo];B[np];W[mp];B[mq];W[lp];B[lq];W[ko];B[jp];W[ka];B[lb];W[la];B[ma];W[ja];B[mc];W[bg];B[bh];W[oe];B[od];W[kj];B[jj];W[pe];B[rd];W[ph];B[qi];W[pi];B[gl];W[fm];B[fk];W[ek];B[gj];W[km];B[kl];W[ll];B[jo];W[kk];B[jl];W[aj];B[ai];W[sj];B[si];W[sk];B[ql];W[qk];B[ro];W[jn];B[in];W[kn];B[ch];W[sm];B[sn];W[sl];B[ag];W[af];B[ah];W[ej];B[fj];W[fl];B[hl];W[rl];B[gr];W[he];B[rg])
\ No newline at end of file
diff --git a/regression/games/unconditional/benson_safe1.sgf b/regression/games/unconditional/benson_safe1.sgf
new file mode 100644 (file)
index 0000000..88b3076
--- /dev/null
@@ -0,0 +1 @@
+(;SZ[19]AW[ab][ac][bc][ba][ca][cb][qb][rb][rc][sc][sa][qa][sr][rq][rs][qs][qr][se][re][rf][rg][sg][rh][ri][si][sk][rk][ql][rm][pm][qn][sl][no][op][mp][mq][nq][mr][lr][ls][ns][or][os][sm][me][md][nd][od][oe][nf][og][ng][pf][pg][oa][ob][nb][mb][la][kb][jb][ib][hb][gb][ga][ma][ja][rp][sp][dm][cm][bn][bo][bp][cr][dr][er][fr][gq][gp][gi][fi][eh][dh][dg][df][de][ed][fd][gd][he][hf][ii][hd][ih][ei][nn][pp][om][pn][po][if][ig][hi][ge][jg][kf][je][kg][id][bq][cp][dq][cn][fq][ho][hn][hm][fl][gk][fk][hl][gm][ek][dk][dl][hp]AB[co][dn][en][fp][fo][ef][eg][fg][fh][gh][gf][fe][ee][hg][hh][eq][do][ep][dp][em][gn][fm][go])
diff --git a/regression/games/unconditional/benson_safe2.sgf b/regression/games/unconditional/benson_safe2.sgf
new file mode 100644 (file)
index 0000000..a0cc464
--- /dev/null
@@ -0,0 +1 @@
+(;SZ[19]AW[jg][jh][sr][ss][ag][bg][bf][dr][ds]AB[gb][ge][he][ie][re][se][gf][if][jf][kf][rf][hg][kg][rg][sg][hh][ih][kh][qh][sh][ji][ki][pi][ri][si][pj][qj][sj][rk][rl][sl][mn][jo][kp][lp][rq][qr][ko][ln][km][lm][qq][rp][sp][ro][sn][rn][no][jm][in][io][mq][mr][np][op][lr][kr][jq][oq][ns][or][os][jr][qs][nn][eb][gc][ib][ab][bb][cb][cc][dc][da][fc][fa][hb][ia][ka][kb][lb][lc][mc][ma][nb][ob][pb][nd][pd][od][rc][sc][pc][qc][cg][cf][be][ce][ae][ah][bh][di][ci][cj][dj][dh][bj][aj][cs][cr][cq][cp][co][cn][cm][cl][bl][al][ao][bo][dq][eq][fr][gr][gs][es])
\ No newline at end of file
diff --git a/regression/games/unconditional/benson_safe3.sgf b/regression/games/unconditional/benson_safe3.sgf
new file mode 100644 (file)
index 0000000..84db62e
--- /dev/null
@@ -0,0 +1 @@
+(;SZ[19]AW[ih][hj][hi][ij][kh][kj][lj][li][mj][nj][oj][oi][pi][ph][pg][pf][of][oe][ne][le][me][lf][kf][kg][ig][if][hf][he][fe][ge][ee][ef][dg][dh][di][ei][fj][ej][gj][mk][ml][mm][lm][ln][kn][jn][in][hn][hm][gm][gl][gk][df][ji]AB[hh][lh][jk][lg][mg][mi][ni][nh][oh][og][mf][nf][hg][gg][gf][ff][gi][fi][fh][eh][eg][ik][kk][jm][hk][hl][jl][lk][ll][km][im][jj][jh][jg][jf][ie][je][ke][id][hd][gd][fd][ed][dd][ce][de][cf][cg][ch][ci][dj][cj][ek][fk][fl][fm][fn][gn][ho][io][ko][lo][mn][nn][nm][nl][nk][ok][pk][pj][qj][qi][qh][qg][qf][qe][pe][od][nd][md][ld][kd][ip][iq][kp][kq][mo][go][ir][is][ks][kr][hs][ls][ms][ns][os][pd][gs][fs][es][ds][cs][bs][ar][aq][ap][ao][an][am][al][ak][aj][ai][ah][ag][af][ae][ad][ac][ab][ba][ca][da][ea][fa][ga][ha][ia][ja][ka][la][ma][na][oa][pa][qa][ra][sc][sb][sd][se][sf][sg][sh][si][sj][sk][sl][sm][sn][so][sp][sq][sr][rs][qs][ps][dk][aa][sa])
\ No newline at end of file
diff --git a/regression/games/unconditional/benson_unsafe.sgf b/regression/games/unconditional/benson_unsafe.sgf
new file mode 100644 (file)
index 0000000..bae70e1
--- /dev/null
@@ -0,0 +1 @@
+(;SZ[19]AW[sa][ac][bc][rc][sc][ae][be][ce][cf][cg][ah][bh][di][aj][bj][cj][dj][cq][dq][eq][cr][fr][gr][cs][es][gs][dh][ci][ss][cb][ba][ca][db][eb][ea][pb][pa][rb][qb][cn][cm][cl][dl][el][fl][fm][fn][eo][do][co][fo][em][ii][ij][jj][ki][kh][jh][jg][jf][hi][gh][gi][fh][fg][ff][ge][he][ie][je][fe]AB[hb][re][se][rf][qh][sh][rk][rl][sl][mn][jo][kp][lp][rq][dr][qr][ds][ko][ln][km][lm][qq][rp][sp][ro][sn][rn][no][jm][in][io][mq][mr][np][lr][kr][oq][ns][or][os][qs][aa][ja][jc][ib][kb][lb][mb][ma][ic][gb][ga][ri][rj][jq][qg][sg][dm][en][om][pm][pl][pk][pj][oj][nj][nl][ml][mk][lj][ni][mi][li][pc][pd][pe][of][og][ng][mf][ne][me][md][nc][oc][gf][gg][hh][ih][ig][if][hf][ir][js][is][ls][nn])
diff --git a/regression/games/unconditional/unconditional1.sgf b/regression/games/unconditional/unconditional1.sgf
new file mode 100644 (file)
index 0000000..c4845c5
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[ba][bb][bc][bd][ae][ch][dh][eh][bi][ci][ei][fi][bj][fj][kj][lj][mj][bk][ck][ek][fk][kk][mk][cl][dl][el][kl][ml][km][mm][kn][mn][ko][lo]
+AB[ca][ab][cb][db][gb][ib][jb][mb][qb][rb][ac][cc][ec][fc][gc][hc][ic][jc][mc][rc][ad][cd][ed][jd][kd][ld][md][nd][od][rd][be][ce][de][ee][ne][oe][re][bf][df][nf][rf][bg][cg][dg][eg][fg][gg][ng][qg][rg][ah][bh][gh][hh][nh][oh][ph][qh][ai][hi][ji][ki][li][mi][ni][qi][ri][aj][dj][hj][jj][nj][qj][ak][hk][jk][nk][ok][pk][qk][al][fl][gl][hl][il][jl][ll][nl][ql][rl][sl][am][bm][fm][jm][lm][nm][qm][bn][cn][en][fn][jn][nn][qn][co][eo][jo][mo][no][qo][ro][cp][ep][hp][ip][jp][kp][lp][mp][qp][bq][cq][dq][eq][hq][kq][pq][qq][rq][br][er][hr][kr][or][pr][rr]
+)
diff --git a/regression/games/unconditional/unconditional2.sgf b/regression/games/unconditional/unconditional2.sgf
new file mode 100644 (file)
index 0000000..2290d9d
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[ea][fa][ha][ia][ka][la][na][oa][qa][eb][ib][kb][nb][ob][qb][ec][fc][hc][ic][kc][oc][qc][rc][fd][hd][kd][ld][nd][od][rd][sd][fe][ge][he][le][me][ne][pf][qf][rf][sf][kg][lg][mg][pg][jh][kh][mh][nh][ph][ji][ni][pi][qi][si][jj][nj][qj][rj][sj][jk][kk][mk][nk][kl][ll][ml][pl][ql][rl][sl][pm][kn][ln][mn][pn][jo][ko][mo][po][so][jp][mp][np][pp][qp][rp][sp][jq][kq][nq][kr][mr][nr][ks][ls][ms]
+AB[da][ja][pa][sa][db][gb][jb][mb][pb][sb][dc][gc][jc][mc][pc][dd][ed][jd][pd][ee][ie][je][ke][oe][pe][qe][re][se][ef][ff][gf][hf][if][kf][lf][mf][nf][of][ig][jg][og][rg][ih][oh][rh][ii][li][oi][ij][lj][oj][ik][ok][pk][qk][rk][sk][il][jl][ol][hm][jm][km][lm][mm][nm][om][rm][hn][in][jn][on][rn][io][oo][ip][lp][op][iq][lq][oq][pq][qq][rq][sq][ir][or][is][os][rs]
+)
diff --git a/regression/games/unconditional/unconditional3.sgf b/regression/games/unconditional/unconditional3.sgf
new file mode 100644 (file)
index 0000000..b474a59
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[aa][ba][ea][fa][ha][ia][la][qa][ra][sa][ab][fb][hb][mb][pb][qb][sb][bc][ec][fc][ic][lc][mc][pc][cd][dd][ed][jd][kd][ld][pd][pe][qe][se][kf][lf][mf][qf][rf][sf][bg][cg][kg][mg][ah][ch][jh][nh][qh][rh][sh][di][ji][ni][qi][si][dj][kj][mj][pj][ak][ck][dk][kk][lk][mk][pk][al][bl][cl][pl][ql][sl][qm][rm][sm][an][bn][ao][co][do][dp][hp][ip][jp][kp][pp][qp][dq][hq][kq][lq][nq][oq][rq][sq][ar][cr][gr][lr][nr][sr][as][bs][cs][gs][hs][ks][ls][ns][os][rs][ss]
+AB[ga][ma][na][oa][pa][cb][db][gb][jb][kb][nb][ob][ac][gc][hc][nc][oc][rc][ad][bd][fd][gd][hd][id][md][nd][od][rd][ae][ce][de][ee][fe][ie][je][ke][le][me][oe][af][bf][cf][ef][jf][nf][of][pf][ag][dg][eg][ig][jg][ng][pg][qg][rg][sg][dh][eh][ih][lh][oh][ph][bi][ei][ii][li][oi][pi][bj][ej][ij][jj][nj][oj][rj][ek][jk][nk][ok][rk][dl][el][jl][kl][ll][ml][nl][ol][am][bm][cm][em][om][pm][cn][dn][en][on][qn][rn][sn][eo][fo][go][ho][io][jo][ko][lo][oo][po][qo][so][bp][ep][gp][lp][mp][np][op][rp][sp][bq][eq][fq][gq][mq][dr][fr][ir][jr][mr][pr][qr][ds][es][fs][ms]
+)
diff --git a/regression/games/unconditional/unconditional4.sgf b/regression/games/unconditional/unconditional4.sgf
new file mode 100644 (file)
index 0000000..3fadbe3
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[aa][ba][ea][ha][ia][la][ma][qa][ra][sa][ab][fb][hb][mb][qb][sb][ac][bc][cc][ec][fc][ic][jc][lc][pc][qc][cd][dd][ed][jd][kd][ld][pd][pe][qe][se][kf][lf][mf][qf][rf][sf][ag][bg][cg][kg][mg][ah][ch][dh][kh][nh][qh][rh][sh][di][ji][ni][qi][si][cj][dj][jj][kj][mj][qj][ak][ck][kk][lk][mk][pk][bl][cl][pl][ql][sl][qm][rm][sm][an][bn][ao][co][do][dp][hp][ip][jp][pp][qp][cq][dq][gq][hq][jq][kq][nq][oq][qq][rq][sq][ar][cr][gr][lr][nr][sr][as][bs][cs][gs][hs][ks][ls][ns][os][rs][ss]
+AB[fa][ga][na][oa][pa][cb][db][gb][jb][kb][nb][pb][gc][hc][mc][nc][oc][rc][ad][bd][fd][gd][hd][id][md][od][rd][ae][ce][de][ee][fe][ie][je][ke][le][me][oe][af][bf][cf][ef][jf][nf][of][pf][dg][eg][jg][ng][pg][qg][rg][sg][eh][ih][jh][lh][oh][ph][bi][ei][ii][li][oi][pi][bj][ej][ij][nj][oj][pj][rj][dk][ek][ik][jk][nk][ok][rk][al][dl][jl][kl][ll][ml][nl][ol][am][bm][cm][dm][om][pm][cn][dn][en][on][qn][rn][sn][eo][fo][go][ho][io][jo][ko][oo][po][qo][so][bp][ep][gp][kp][lp][mp][np][op][rp][sp][bq][eq][fq][lq][mq][dr][fr][ir][jr][mr][pr][qr][ds][es][fs][ms]
+)
diff --git a/regression/games/unconditional/unconditional5.sgf b/regression/games/unconditional/unconditional5.sgf
new file mode 100644 (file)
index 0000000..2ce63b9
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[aa][ba][da][ea][ia][ka][la][ma][qa][ra][sa][ab][fb][hb][mb][qb][sb][bc][cc][ec][fc][ic][jc][lc][mc][pc][qc][cd][dd][ed][jd][kd][ld][pd][sd][pe][qe][se][kf][lf][qf][rf][sf][ag][bg][kg][mg][ah][ch][jh][kh][nh][qh][rh][sh][ai][di][ji][mi][ni][qi][si][cj][dj][jj][kj][mj][qj][ak][ck][kk][lk][mk][pk][sk][al][bl][cl][pl][ql][sl][qm][rm][sm][an][bn][ao][co][do][ap][dp][ip][jp][op][pp][qp][cq][dq][gq][hq][jq][kq][lq][nq][oq][qq][rq][ar][cr][gr][lr][nr][sr][as][bs][cs][gs][hs][is][ks][ls][ns][os][ps][rs][ss]
+AB[fa][ga][ha][na][oa][pa][cb][db][gb][jb][kb][nb][pb][ac][gc][hc][nc][oc][rc][ad][bd][fd][gd][hd][id][md][nd][od][rd][ae][ce][de][ee][fe][je][ke][le][me][oe][af][bf][cf][jf][mf][nf][of][pf][cg][dg][ig][jg][ng][pg][qg][rg][sg][dh][eh][ih][lh][oh][ph][bi][ei][ii][li][oi][pi][bj][ej][ij][nj][oj][pj][rj][dk][ek][ik][jk][nk][ok][rk][dl][jl][kl][ll][ml][nl][ol][am][bm][cm][dm][om][pm][cn][dn][en][on][qn][rn][sn][eo][ho][io][jo][ko][no][oo][po][qo][so][bp][ep][fp][gp][hp][kp][lp][mp][np][rp][sp][bq][eq][fq][mq][sq][dr][fr][ir][jr][mr][pr][qr][ds][es][fs][ms]
+)
diff --git a/regression/games/unconditional/unconditional6.sgf b/regression/games/unconditional/unconditional6.sgf
new file mode 100644 (file)
index 0000000..2628f53
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[aa][ba][ea][ia][la][ra][sa][qb][sb][ec][lc][qe][se][ch][si][ak][ck][ql][sl][ao][hq][kq][ar][sr][as][bs][hs][ks][os][rs][ss]
+AB[ga][ma][na][oa][pa][cb][db][gb][jb][kb][nb][ob][ac][gc][hc][nc][oc][rc][ad][bd][fd][hd][id][md][nd][od][rd][ae][ce][de][ee][fe][ge][he][ie][je][ke][le][me][oe][af][bf][cf][ef][jf][nf][of][pf][ag][dg][eg][ig][jg][ng][pg][qg][rg][sg][dh][eh][ih][lh][oh][ph][bi][ei][ii][li][oi][pi][bj][ej][ij][jj][nj][oj][rj][ek][jk][nk][ok][rk][dl][el][jl][kl][ll][ml][nl][ol][am][bm][cm][em][om][pm][cn][dn][en][on][qn][rn][sn][eo][fo][go][ho][io][jo][ko][lo][oo][po][qo][so][bp][ep][gp][lp][mp][np][op][rp][sp][bq][eq][fq][gq][mq][dr][fr][ir][jr][mr][pr][qr][ds][es][fs][ms]
+)
diff --git a/regression/games/unconditional/unconditional7.sgf b/regression/games/unconditional/unconditional7.sgf
new file mode 100644 (file)
index 0000000..0302eaf
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[aa][ba][ea][ia][la][ra][sa][ab][sb][ec][qe][se][ah][ch][si][kj][ql][sl][ao][co][hq][ar][sr][as][bs][hs][ks][os][rs][ss]
+AB[fa][ga][na][oa][pa][cb][db][gb][jb][kb][nb][pb][gc][hc][mc][nc][oc][rc][ad][bd][fd][gd][hd][id][md][od][rd][ae][ce][de][ee][fe][ie][je][ke][le][me][oe][af][bf][cf][ef][jf][nf][of][pf][dg][eg][jg][ng][pg][qg][rg][sg][eh][ih][jh][lh][oh][ph][bi][ei][ii][li][oi][pi][bj][ej][ij][nj][oj][pj][rj][dk][ek][ik][jk][nk][ok][rk][al][dl][jl][kl][ll][ml][nl][ol][am][bm][cm][dm][om][pm][cn][dn][en][on][qn][rn][sn][eo][fo][go][ho][io][jo][ko][oo][po][qo][so][bp][ep][gp][kp][lp][mp][np][op][rp][sp][bq][eq][fq][lq][mq][dr][fr][ir][jr][mr][pr][qr][ds][es][fs][ms]
+)
diff --git a/regression/games/unconditional/unconditional8.sgf b/regression/games/unconditional/unconditional8.sgf
new file mode 100644 (file)
index 0000000..8133c1e
--- /dev/null
@@ -0,0 +1,5 @@
+(;GM[1]FF[3]
+SZ[19]
+AW[aa][ba][da][ka][la][ra][sa][sb][cc][ec][jc][lc][qc][sd][qe][se][ah][kh][ai][mi][si][cj][kj][qj][ak][sk][ql][sl][ao][ap][cq][hq][jq][kq][oq][qq][ar][as][bs][hs][is][ks][os][ps][rs][ss]
+AB[fa][ga][ha][na][oa][pa][cb][db][gb][jb][kb][nb][pb][ac][gc][hc][nc][oc][rc][ad][bd][fd][gd][hd][id][md][nd][od][rd][ae][ce][de][ee][fe][je][ke][le][me][oe][af][bf][cf][jf][mf][nf][of][pf][cg][dg][ig][jg][ng][pg][qg][rg][sg][dh][eh][ih][lh][oh][ph][bi][ei][ii][li][oi][pi][bj][ej][ij][nj][oj][pj][rj][dk][ek][ik][jk][nk][ok][rk][dl][jl][kl][ll][ml][nl][ol][am][bm][cm][dm][om][pm][cn][dn][en][on][qn][rn][sn][eo][ho][io][jo][ko][no][oo][po][qo][so][bp][ep][fp][gp][hp][kp][lp][mp][np][rp][sp][bq][eq][fq][mq][sq][dr][fr][ir][jr][mr][pr][qr][ds][es][fs][ms]
+)
diff --git a/regression/games/unfinished.sgf b/regression/games/unfinished.sgf
new file mode 100644 (file)
index 0000000..65c7e95
--- /dev/null
@@ -0,0 +1,24 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]HA[0]KM[5.5]RE[B+104.5]GN[black seed:540349248 white seed:540349248]
+;B[pd];W[cp];B[qp];W[de];B[eq];W[hp];B[eo];W[dn];B[en];W[dm]
+;B[oq];W[em];B[cg];W[dc];B[cj];W[ej];B[jc];W[qf];B[qj];W[ce]
+;B[eg];W[rd];B[gg];W[of];B[hd];W[mf];B[nd];W[qc];B[jq];W[hn]
+;B[dp];W[co];B[jo];W[oj];B[ol];W[np];B[cq];W[nq];B[ld];W[bq]
+;B[cr];W[br];B[qm];W[or];B[jm];W[nn];B[lq];W[mr];B[jk];W[pc]
+;B[oc];W[lg];B[qh];W[dj];B[ck];W[bl];B[ni];W[fj];B[bg];W[iq]
+;B[hl];W[fn];B[ad];W[eb];B[gb];W[gl];B[fp];W[hj];B[pq];W[pr]
+;B[oh];W[rr];B[rq];W[il];B[ir];W[hr];B[fo];W[jl];B[ip];W[hq]
+;B[kl];W[ik];B[lm];W[jr];B[kr];W[is];B[jj];W[nl];B[ob];W[om]
+;B[nk];W[ml];B[ok];W[pb];B[mk];W[rg];B[rh];W[cs];B[dr];W[ig]
+;B[hf];W[jf];B[bk];W[al];B[qr];W[ln];B[jp];W[qs];B[mm];W[qq]
+;B[po];W[nm];B[mn];W[hh];B[qr];W[sr];B[ds];W[qq];B[rp];W[oa]
+;B[na];W[pa];B[nb];W[sh];B[si];W[sg];B[ri];W[bs];B[gh];W[mo]
+;B[kn];W[lo];B[oo];W[no];B[li];W[go];B[cl];W[cm];B[ak];W[bn]
+;B[kh];W[fr];B[er];W[di];B[fq];W[fs];B[dl];W[pm];B[qn];W[pl]
+;B[ql];W[pk];B[pj];W[mh];B[ll];W[ne];B[qd];W[pe];B[od];W[qe]
+;B[in];W[ci];B[bi];W[le];B[dh];W[kd];B[kc];W[md];B[lc];W[mc]
+;B[mb];W[jd];B[im];W[hm];B[ij];W[hk];B[mi];W[gi];B[fh];W[kg]
+;B[jh];W[pg];B[ii];W[ie];B[he];W[op];B[qr];W[rs];B[qg];W[se]
+;B[ph];W[qq];B[pp];W[og];B[id];W[if];B[qk];W[nh];B[ks];W[js]
+;B[gq];W[gr];B[mq];W[el];B[qr];W[dk];B[aj];W[ch];B[bh];W[oe]
+;B[hi];W[fi];B[eh];W[ih];B[do];W[lh];B[gp];W[ho];B[jg];W[io]
+;B[hg];W[ke];B[nc];W[me];B[la];W[es];B[ei];W[];B[])
diff --git a/regression/games/vaughn.sgf b/regression/games/vaughn.sgf
new file mode 100644 (file)
index 0000000..2794a0d
--- /dev/null
@@ -0,0 +1,46 @@
+(;GM[1]FF[3]
+US[Mike 
+Vaughn]
+DT[2002-12-11]
+HA[6]KM[0.5]SZ[19]
+RE[W+3.5]
+BR[13k]
+PB[GNU Go]
+WR[5k]
+PW[Mike Vaughn]
+AB[pd][dp][pp][dd][dj][pj]BS[0]WS[0]KI[1];
+W[fq];B[dn];W[mp];B[pn];W[dl];B[fo];W[go];B[qg];W[jd];B[lc];W[fc];
+B[fd];W[gd];B[fe];W[ec];B[dc];W[df];B[de];W[cf];B[eg];W[ef];B[ff];
+W[ci];B[gc];W[hc];B[gb];W[pl];B[hd];W[ge]
+C[Now B 
+can just play J 16 and W is finished. Instead, the ladder
+is miscalculated -- B did not
+grasp the ladder breaker.]
+;B[he];W[gf];B[ke];W[hb];B[fb];W[eb];B[gg];W[hf];B[if];W[hg];B[hh];
+W[ig];B[jg];W[ih];B[ii];W[jh];B[kh];W[ji];B[jj];W[ki];B[li];W[kj];
+B[kk];W[lj];B[lh]
+C[After taking about 3 minutes per move 
+running up the ladder, B fianlly gets 
+it.]
+;W[gh];B[nn];W[mj];B[er];W[fr];B[eq];W[oq];B[pq];W[fg];B[bc];W[cb];
+B[nq];W[mq];B[nr];W[mr];B[cj];W[cm];B[fj];W[fl];B[dh];W[eh];B[dg];
+W[ch];B[di];W[be];B[hj];W[jk];B[gm];W[gl];B[cn];W[fn];B[bl];W[bm];
+B[bj];W[cg];B[ij];W[ik];B[gk];W[hk];B[gp];W[fp];B[hp];W[eo];B[hl];
+W[hm];B[hr];W[jq];B[ir];W[ln];B[jr];W[ho];B[gr];W[es];B[cl];W[dm];
+B[ck];W[fk];B[jl];W[il];B[db];W[da];B[op];W[jf];B[pc];W[np];B[or];
+W[mm];B[ok];W[nk];B[ol];W[nh];B[bn];W[am];B[ds];W[fs];B[cr];W[an];
+B[me];W[bp];B[bs];W[do];B[jb];W[fa];B[ms];W[ls];B[ns];W[kr];B[bq];
+W[cp];B[kg];W[nf];B[ne];W[ar];B[aq];W[dq];B[of];W[og];B[pg];W[ph];
+B[qh];W[lf];B[mi];W[ni];B[kf];W[je];B[pi];W[le];B[ld];W[mf];B[kd];
+W[jc];B[ib];W[ic];B[kc];W[ia];B[ka];W[nm];B[om];W[no];B[oh];W[ng];
+B[cq];W[ep];B[dr];W[oo];B[on];W[po];B[qo];W[oi];B[nl];W[ml];B[mn];
+W[lo];B[ap];W[ao];B[dp];W[kb];B[lb];W[cc];B[ph];W[ha];B[ja];W[mo];
+B[dq];W[gj];B[lg];W[nj];B[oj];W[mh];B[mg]
+TB[kb][la][ma][na][oa][pa][qa][ra][sa][mb][mc][md][nd][nc][oc][ob][nb][pb][qb][rb][sb][sc][sd][se][sf][sg][sh][si][sj][sk][sl][sm][sn][so][sp][sq][os][ps][qs][rs][ss][sr][oq][pr][qr][rr][rq][rp][ro][rn][rm][rl][rk][rj][ri][rh][rg][rf][re][rd][rc][od][oe][pe][pd][qd][qc][qe][qf][pf][qi][qj][qk][ql][qm][qn][qp][qq][pm][pl][pk][br][ar][cs][as]
+TC[-153]
+TW[ga][gb][fb][gc][hd][he][ie][id][if][kk][lk][mk][jl][kl][ll][im][jm][km][lm][lr][lq][lp][kp][jp][ip][hp][gp][gs][hs][is][js][ks][kq][jr][ir][hr][hq][gq][gr][iq][io][jo][ko][kn][jn][in][hn][gn][gm][fm][em][en][dn][cn][bn][bo][co][fo][el][hl][gk][jj][ij][hj][hi][hh][ii][gi][gf][fh][fi][fj][ej][dj][cj][bj][aj][ak][al][bl][cl][ck][bk][dk][ek][ei][di][dh][dg][eg][ff][fe][fd][ed][ee][de][dd][dc][db][ea][ca][ba][aa][ab][ac][ad][ae][af][ag][ah][ai][bi][bh][bg][bf][bb][bc][bd][cd][ce]
+C[In this position, GnuGo could not
+compute the score, counting
+odd bits of territory to give
+a result of W 10.5 to B 7.]
+)
diff --git a/regression/games/verybad.sgf b/regression/games/verybad.sgf
new file mode 100644 (file)
index 0000000..f4380da
--- /dev/null
@@ -0,0 +1,22 @@
+(;AB[dp][pd][dd][pp][jj][dj][pj][jp][jd]AP[MultiGo:3.9.4]SZ[19]DT[2004-10-27 16\:01\:54]
+PB[GNU Go 3.4]PW[zhuangzy]HA[9]US[MultiGo]
+;W[qh];B[oh];W[qj];B[qk];W[pk];B[ql];W[pi];B[oj];W[oi];B[ok];W[ni];B[lj];W[nk];B[ol]
+;W[nj];B[nl];W[pc];B[oc];W[od];B[nc];W[pe];B[qd];W[qc];B[oe];W[nd];B[of];W[rd];B[qe]
+;W[re];B[qf];W[md];B[rf];W[pg];B[pb];W[qb];B[rc];W[rb];B[pf];W[mf];B[mc];W[ng];B[ld]
+;W[me];B[gd];W[ic];B[jc];W[dg];B[nq];W[fc];B[gc];W[cc];B[dc];W[cd];B[fb];W[ce];B[fq]
+;W[mq];B[mp];W[lp];B[ch];W[nr];B[oq];W[mo];B[np];W[kq];B[lo];W[ko];B[ln];W[kp];B[hp]
+;W[lr];B[co];W[hr];B[in];W[kn];B[or];W[lm];B[mn];W[mm];B[nn];W[ie];B[ib];W[il];B[hj]
+;W[gl];B[hk];W[hl];B[el];W[hn];B[ho];W[kk];B[ob];W[fj];B[sc];W[sb];B[qa];W[sd];B[ra]
+;W[sf];B[rg];W[rh];B[sg];W[pa];B[ml];W[sa];B[qa];W[og];B[kj];W[jm];B[lk];W[ll];B[mk]
+;W[sh];B[se];W[qg];B[oa];W[nf];B[ne];W[os];B[ra];W[pa];B[qa];W[pr];B[ra];W[pa];B[qa]
+;W[qq];B[ra];W[pa];B[qa];W[ro];B[ra];W[pa];B[qa];W[qn];B[ra];W[pa];B[qa];W[pm];B[pl]
+;W[gn];B[ra];W[pa];B[qa];W[nm];B[oo];W[on];B[no];W[je];B[ra];W[pa];B[qa];W[bg];B[ra]
+;W[pa];B[qa];W[bh];B[ra];W[pa];B[qa];W[id];B[ra];W[pa];B[qa];W[hb];B[jb];W[hc];B[ra]
+;W[pa];B[qa];W[gf];B[cb];W[bb];B[db];W[fe];B[ra];W[pa];B[qa];W[fd];B[ra];W[pa];B[qa]
+;W[gb];B[ra];W[pa];B[qa];W[bj];B[ra];W[pa];B[qa];W[ck];B[ra];W[pa];B[qa];W[cm];B[ra]
+;W[pa];B[qa];W[en];B[ra];W[pa];B[qa];W[gi];B[ra];W[pa];B[qa];W[ih];B[ra];W[pa];B[qa]
+;W[fr];B[gq];W[gr];B[ra];W[pa];B[qa];W[cq];B[bn];W[dq];B[bp];W[ep];B[ra];W[pa];B[qa]
+;W[bq];B[ra];W[pa];B[qa];W[kh];B[ra];W[pa];B[qa];W[rj];B[ra];W[pa];B[qa];W[ii];B[ra]
+;W[pa];B[qa];W[ke];B[ra];W[pa];B[qa];W[kd];B[ra];W[pa];B[sc];W[rc];B[lc];W[kc];B[kb]
+;W[qa];B[om];W[pn];B[kl];W[km];B[pq];W[qr];B[ia];W[ha];B[le];W[lf];B[qp];W[rp];B[qo]
+;W[rn];B[po])
\ No newline at end of file
diff --git a/regression/games/viking1.sgf b/regression/games/viking1.sgf
new file mode 100644 (file)
index 0000000..99050fc
--- /dev/null
@@ -0,0 +1,31 @@
+(;GM[1]FF[4]RU[Japanese]SZ[19]
+PW[GNU Go]PB[GNU Go 2.7.207 ascii]HA[3]KM[0.5]GN[GNU Go 2.7.207 ascii Random Seed 978859946] 
+AB[dd]AB[pd]AB[dp]
+LB[cc:9][fc:22][nc:22][qc:9][fd:15][gd:18][md:18][nd:15][cf:22][df:15][pf:16][qf:22][dg:18][pg:19][dm:18][cn:22][dn:15][fp:16][gp:19][pp:75][cq:9][fq:22]
+C[Value of move: 75]
+;W[pp];B[kq];W[fq];B[qn];W[ql];B[dn];W[dq];B[pm];W[nc];B[pl]
+;W[pf];B[nd];W[md];B[oc];W[ci];B[nb];W[mc];B[cq];W[cr];B[eq]
+;W[dr];B[fp];W[fc];B[fd];W[gd];B[fe];W[ec];B[ge];W[cb];B[hd]
+;W[qk];B[pk];W[rm];B[er];W[bq];B[cp];W[ds];B[qj];W[bp];B[gc]
+;W[rn];B[qo];W[rj];B[qe];W[mb];B[ne];W[lf];B[bo];W[bs];B[qp]
+;W[cl];B[di];W[ng];B[dj];W[cj];B[dk];W[pj];B[ch];W[bh];B[cg]
+;W[bg];B[ck];W[bk];B[me];W[aj];B[le];W[ob];B[dl];W[pi];B[oj]
+;W[qf];B[pb];W[na];B[oi];W[jc];B[ib];W[lh];B[mk];W[gq];B[ph]
+;W[qi];B[iq];W[oh];B[jb];W[kc];B[qh];W[pe];B[qd];W[rh];B[mg]
+;W[mh];B[og];W[nh];B[of];W[nf];B[oe];W[pg];B[kb];W[je];B[ke]
+;W[kg];B[rf];W[qg];B[bd];W[ie];B[hf];W[ac];B[bl];W[ad];B[bi]
+;W[bj];B[bf];W[af];B[be];W[ae];B[dc];W[db];B[cc];W[al];B[cm]
+;W[fr];B[es];W[am];B[pq];W[sq];B[rp];W[qr];B[pr];W[sp];B[op]
+;W[rq];B[ao];W[ji];B[po];W[mf];B[hi];W[rg];B[re];W[gb];B[hb]
+;W[fb];B[ij];W[ps];B[os];W[qs];B[jj];W[or];B[nr];W[kj];B[kk]
+;W[ki];B[kf];W[jf];B[if];W[ns];B[ih];W[jg];B[gp];W[nq];B[bm]
+;W[mr];B[ea];W[js];B[np];W[pa];B[qb];W[ai];B[lj];W[hs];B[hq]
+;W[qa];B[rb];W[lb];B[mp];W[jh];B[ig];W[ka];B[ap];W[ar];B[ra]
+;W[oa];B[ic];W[id];B[qq];W[aq];B[so];W[rr];B[ag];W[ro];B[jr]
+;W[ks];B[lr];W[ls];B[hr];W[gs];B[gr];W[is];B[fs];W[kr];B[ir]
+;W[ms];B[oq];W[lq];B[lp];W[mq];B[bb];W[ah];B[bc];W[eb];B[ca]
+;W[fa];B[ba];W[kp];B[jq];W[ko];B[ln];W[io];B[kn];W[jn];B[jm]
+;W[jo];B[im];W[ld];B[kd];W[jd];B[od];W[sf];B[se];W[sg];B[ii]
+;W[ja];B[ia];W[la];B[da];W[ni];B[nj];W[mi];B[an];W[qm];B[mj]
+;W[li];B[he];W[tt];B[hn];W[tt];B[ho];W[tt];B[tt];W[tt]
+)
diff --git a/regression/games/viking2.sgf b/regression/games/viking2.sgf
new file mode 100644 (file)
index 0000000..eae57d2
--- /dev/null
@@ -0,0 +1,32 @@
+(;GM[1]FF[4]
+SZ[19]HA[0]KM[0.5]
+PW[GnuGo (GNU Go 3.1.14)]WR[14k*]
+PB[viking4]BR[17k*]
+PC[NNGS]DT[2001-11-21]AP[gnugoclient:2.0]
+RE[B+6.5]
+;B[qq];W[qd];B[cq];W[dd];B[po];W[nc];B[fc];W[dp];B[dq];W[cp];B[cf]
+;W[eq];B[kq];W[er];B[qj];W[df];B[hc];W[dl];B[dj];W[kc];B[ck];W[ce]
+;B[fk];W[cg];B[ds];W[es];B[bq];W[bp];B[fm];W[eb];B[hq];W[dn];B[je]
+;W[cl];B[qg];W[ql];B[ok];W[go];B[om];W[ge];B[ep];W[fp];B[le];W[dk]
+;B[ek];W[cj];B[ne];W[od];B[di];W[ci];B[hn];W[ib];B[ic];W[hb];B[of]
+;W[gc];B[gd];W[gb];B[fe];W[hd];B[he];W[fd];B[id];W[gf];B[gd];W[ed]
+;B[hd];W[gh];B[ih];W[ej];B[ho];W[fi];B[eh];W[rf];B[hj];W[hp];B[hi]
+;W[ip];B[jo];W[eg];B[rg];W[iq];B[dr];W[aq];B[ar];W[bs];B[jp];W[br]
+;B[sf];W[re];B[hf];W[jr];B[kr];W[mc];B[rk];W[gg];B[pe];W[pd];B[gn]
+;W[se];B[eo];W[en];B[fo];W[gp];B[fn];W[as];B[sg];W[ks];B[ls];W[js]
+;B[lr];W[io];B[in];W[qf];B[hr];W[gr];B[pf];W[hg];B[ig];W[do];B[fj]
+;W[ei];B[gi];W[dh];B[jq];W[ir];B[qe];W[rd];B[oe];W[jc];B[jd];W[em]
+;B[el];W[ld];B[kd];W[me];B[mf];W[md];B[nd];W[lf];B[ke];W[jn];B[jm]
+;W[pg];B[og];W[hh];B[mg];W[];B[ph];W[]
+C[final_score: B+5.5
+F17 removed
+F15 removed
+C14 removed
+M14 removed
+E12 removed
+C9 removed
+R8 removed
+K6 removed
+B3 removed
+H3 removed]
+)
diff --git a/regression/games/viking3.sgf b/regression/games/viking3.sgf
new file mode 100644 (file)
index 0000000..2f94c37
--- /dev/null
@@ -0,0 +1,43 @@
+(;GM[1]FF[4]
+SZ[19]HA[4]KM[0.5]
+PW[GnuGo (GNU Go 3.1.16)]WR[14k*]
+PB[viking4]BR[17k*]
+PC[NNGS]DT[2001-12-15]AP[gnugoclient:2.0]
+RE[W+8.5]
+AB[dd][pd][dp][pp]
+;W[qn];B[np];W[lq];B[mo];W[cf];B[fd];W[cn];B[hq];W[qf];B[cj];W[nc]
+;B[oe];W[qc];B[qj];W[qd];B[nm];W[bd];B[cc];W[dh];B[bj];W[hc];B[ge]
+;W[bc];B[ei];W[kc];B[en];W[bp];B[eh];W[cq];B[ko];W[rp];B[qq];W[jp]
+;B[in];W[jr];B[ql];W[rn];B[cb];W[bh];B[nr];W[rq];B[rr];W[rl];B[dq]
+;W[qp];B[qh];W[ho];B[hn];W[qr];B[po];W[hp];B[dl];W[gq];B[dm];W[oc]
+;B[gn];W[bl];B[rk];W[pg];B[nf];W[er];B[dr];W[eq];B[eo];W[cr];B[ds]
+;W[rg];B[ef];W[es];B[gp];W[gr];B[bb];W[ac];B[fp];W[fb];B[pq];W[qs]
+;B[qo];W[sm];B[ro];W[sr];B[cs];W[bs];B[br];W[ar];B[as];W[aq];B[so]
+;W[bs];B[ph];W[rs];B[og];W[as];B[bk];W[le];B[lg];W[kf];B[kg];W[jf]
+;B[bi];W[bf];B[ls];W[he];B[hf];W[ci];B[hd];W[bn];B[dg];W[cg];B[jg]
+;W[id];B[ie];W[je];B[ic];W[ib];B[jd];W[ga];B[hb];W[gc];B[jb];W[kb]
+;B[if];W[ia];B[ja];W[kd];B[ha];W[ka];B[mr];W[ri];B[rh];W[sh];B[di]
+;W[ch];B[ag];W[ah];B[qg];W[sg];B[pf];W[qm];B[qe];W[re];B[rf];W[se]
+C[L:9];B[gd];W[cl]C[L:10];B[dk];W[de];B[ee];W[df];B[eg];W[lf];B[mf]
+;W[jc];B[id];W[fq];B[ep];W[cm];B[od];W[pc];B[md];W[mc];B[qi];W[me]
+;B[nd];W[si];B[sf];W[qf];B[sk];W[rf];B[pe];W[ld];B[sp];W[sq];B[ai]
+;W[kp];B[jn];W[lo];B[lm];W[ln];B[kn];W[mn];B[pr];W[mm];B[ml];W[nn]
+;B[mq];W[pl]C[L:8];B[qk];W[ll]C[L:7];B[lk];W[km]C[L:5];B[jl];W[mk]
+C[L:6];B[nl];W[nk]C[L:7];B[kl];W[lm]C[L:5];B[om];W[on]C[L:6];B[ni]
+;W[lj]C[L:7];B[kk];W[mi]C[L:8];B[mh];W[ji]C[L:9];B[ol];W[pk]C[L:7]
+;B[oj];W[ok]C[L:8];B[sl];W[lp];B[hi];W[ik]C[L:9];B[jj];W[ki]C[L:10]
+;B[jm];W[ih];B[os];W[hh];B[gi];W[gg];B[ks];W[pj];B[oi];W[lh];B[fr]
+;W[iq];B[rm];W[sn];B[rl];W[pn];B[io];W[kr];B[ip];W[hr];B[go];W[hq]
+;B[ii];W[jh];B[ig];W[cd];B[ab];W[dc];B[db];W[ed];B[ec];W[dd];B[eb]
+;W[ak];B[fg];W[gf];B[kj];W[gh];B[pi];W[co];B[mj];W[nj];B[cp];W[bq]
+;B[ne];W[fh];B[ck];W[fi];B[fj];W[oo];B[mp];W[op];B[oq];W[lr];B[jo]
+;W[js];B[ms];W[ff];B[fe];W[li];B[kh];W[pm];B[hg];W[mj];B[aj];W[al]
+;B[dn];W[do];B[no];W[ps];B[rj];W[sj];B[];W[]
+C[final_score: W+8.5
+G19 removed
+F18 removed
+G17 removed
+A13 removed
+J9 removed
+F2 removed]
+)
diff --git a/regression/games/wing-yuhiko-gnugo.sgf b/regression/games/wing-yuhiko-gnugo.sgf
new file mode 100644 (file)
index 0000000..0720c67
--- /dev/null
@@ -0,0 +1,318 @@
+(;
+GM[1]US[Brought to you by WING]
+CoPyright[
+  This game was played on WING
+  Permission to reproduce this game is given.]
+GN[yuhiko(W) - robot1(B) on WING]
+RE[B+23.5]
+PW[yuhiko]WR[13k*]NW[1756 (-9)]
+PB[robot1]BR[14k*]NB[1600 (+14)]
+WT[yuhiko@nike.eonet.ne.jp]
+PC[WING: wing.gr.jp 1515]
+DT[2002-05-01]
+SZ[19]TM[300]OP[900]OM[25]KM[0.5]
+
+HA[2]AB[pd][dp]
+
+;W[pp]
+;B[dd]
+;W[dn]
+;B[fp]
+;W[dk]
+;B[qn]
+;W[ql]
+;B[qq]
+;W[qp]
+;B[pq]
+;W[pn]
+;B[ci]
+;W[df]
+;B[ei]
+;W[cd]
+;B[cc]
+;W[ce]
+;B[dc]
+;W[fe]
+;B[fk]
+;W[cp]
+;B[cq]
+;W[co]
+;B[bq]
+;W[bp]
+;B[jd]
+;W[hd]
+;B[qh]
+;W[pf]
+;B[nd]
+;W[qd]
+;B[qc]
+;W[qe]
+;B[rc]
+;W[rd]
+;B[og]
+;W[pg]
+;B[ph]
+;W[of]
+;B[nf]
+;W[ng]
+;B[oh]
+;W[ne]
+;B[mf]
+;W[pe]
+;B[qo]
+;W[rj]
+;B[mh]
+;W[pc]
+;B[od]
+;W[pb]
+;B[op]
+;W[po]
+;B[rp]
+;W[rq]
+;B[so]
+;W[rr]
+;B[pm]
+;W[qm]
+;B[on]
+;W[oe]
+;B[iq]
+;W[hq]
+;B[hp]
+;W[ip]
+;B[jq]
+;W[jp]
+;B[gq]
+;W[ho]
+;B[hr]
+;W[in]
+;B[me]
+;W[md]
+;B[mc]
+;W[ld]
+;B[nb]
+;W[rb]
+;B[lc]
+;W[kd]
+;B[kc]
+;W[ke]
+;B[je]
+;W[lg]
+;B[kf]
+;W[mg]
+;B[kp]
+;W[ko]
+;B[lp]
+;W[nh]
+;B[oj]
+;W[pl]
+;B[oo]
+;W[nl]
+;B[mk]
+;W[ml]
+;B[kg]
+;W[mi]
+;B[nk]
+;W[om]
+;B[lj]
+;W[li]
+;B[ki]
+;W[kh]
+;B[jh]
+;W[kj]
+;B[ji]
+;W[lk]
+;B[mj]
+;W[ok]
+;B[nj]
+;W[oi]
+;B[pj]
+;W[pi]
+;B[kk]
+;W[qi]
+;B[fh]
+;W[fc]
+;B[bd]
+;W[be]
+;B[bb]
+;W[fg]
+;B[ae]
+;W[af]
+;B[ad]
+;W[bg]
+;B[ck]
+;W[cl]
+;B[ni]
+;W[rh]
+;B[lh]
+;W[qg]
+;B[dj]
+;W[ek]
+;B[fl]
+;W[em]
+;B[il]
+;W[ll]
+;B[gh]
+;W[eb]
+;B[db]
+;W[ec]
+;B[jj]
+;W[aq]
+;B[dq]
+;W[br]
+;B[bk]
+;W[bl]
+;B[ic]
+;W[hc]
+;B[hb]
+;W[gb]
+;B[ib]
+;W[cr]
+;B[dr]
+;W[ar]
+;B[rn]
+;W[rm]
+;B[lo]
+;W[kn]
+;B[eg]
+;W[ef]
+;B[dg]
+;W[cg]
+;B[ch]
+;W[ai]
+;B[bj]
+;W[bi]
+;B[bh]
+;W[ah]
+;B[gf]
+;W[ff]
+;B[el]
+;W[dl]
+;B[ge]
+;W[gd]
+;B[gg]
+;W[he]
+;B[hf]
+;W[ie]
+;B[if]
+;W[hl]
+;B[hm]
+;W[im]
+;B[gm]
+;W[jl]
+;B[ik]
+;W[jk]
+;B[kl]
+;W[jm]
+;B[km]
+;W[lm]
+;B[kj]
+;W[ln]
+;B[nn]
+;W[mn]
+;B[mo]
+;W[fo]
+;B[pn]
+;W[nm]
+;B[eo]
+;W[en]
+;B[fn]
+;W[go]
+;B[fm]
+;W[gp]
+;B[ob]
+;W[hq]
+;B[fq]
+;W[ir]
+;B[gr]
+;W[ds]
+;B[es]
+;W[cs]
+;B[oc]
+;W[qb]
+;B[lf]
+;W[da]
+;B[ca]
+;W[ea]
+;B[ed]
+;W[fd]
+;B[do]
+;W[fs]
+;B[er]
+;W[ej]
+;B[cn]
+;W[bn]
+;B[dm]
+;W[cm]
+;B[dn]
+;W[dh]
+;B[eh]
+;W[ak]
+;B[cj]
+;W[aj]
+;B[di]
+;W[fj]
+;B[hj]
+;W[gi]
+;B[hi]
+;W[gj]
+;B[hk]
+;W[gk]
+;B[pa]
+;W[qa]
+;B[oa]
+;W[gl]
+;B[ga]
+;W[fa]
+;B[ha]
+;W[hn]
+;B[sm]
+;W[sl]
+;B[de]
+;W[ab]
+;B[aa]
+;W[ba]
+;B[bf]
+;W[cf]
+;B[aa]
+;W[kq]
+;B[ba]
+;W[jr]
+;B[lq]
+;W[lr]
+;B[mr]
+;W[ms]
+;B[ns]
+;W[ls]
+;B[nr]
+;W[hs]
+;B[gs]
+;W[is]
+;B[sn]
+;W[qk]
+;B[id]
+;W[pk]
+;B[ee]
+;W[qj]
+;B[gn]
+;W[fi]
+;B[tt]
+;W[tt]
+;B[tt]C[
+ robot1 dead @ A18
+ robot1 dead @ R17
+ robot1 dead @ L16
+ robot1 dead @ S3
+ robot1 dead @ F1
+]
+;
+
+TW[as][bs][js][ks][kr][iq][jq][ap][hp][ao][bo][io][jo][an][jn][am][bm][mm]
+[al][ol][rl][rk][sk][sj][ri][si][oh][ph][qh][sh][ag][og][rg][sg][bf][qf]
+[rf][sf][re][se][sd][gc][qc][rc][sc][fb][sb][ra][sa]
+
+TB[fs][os][ps][qs][rs][ss][fr][or][pr][qr][rr][sr][eq][mq][nq][oq][rq][sq]
+[ep][mp][np][pp][qp][sp][no][po][ro][en][em][ij][ii][li][mi][dh][hh][ih]
+[kh][hg][ig][jg][jf][ke][le][kd][ld][md][ac][bc][jc][nc][ab][cb][jb][kb]
+[lb][mb][ia][ja][ka][la][ma][na]
+
+)
diff --git a/regression/games/wormflaw.sgf b/regression/games/wormflaw.sgf
new file mode 100644 (file)
index 0000000..c023527
--- /dev/null
@@ -0,0 +1,3 @@
+(;GM[1]FF[4]CA[UTF-8]AP[CGoban:2]
+SZ[9]RU[Japanese]KM[0.00]TM[]
+AW[ba][ga][ia][cb][fd][bf][if][di][ii]AB[ca][bb][gb][hb][ib][ed][fe][he][ie][cf][hf][cg][hg][ch][hh][ci][hi])
diff --git a/regression/games/xxlin.sgf b/regression/games/xxlin.sgf
new file mode 100644 (file)
index 0000000..30a630e
--- /dev/null
@@ -0,0 +1,37 @@
+(;GM[1]FF[3]
+SZ[19]
+PB[GnuGo]
+PW[xxlin]
+KM[0.5]HA[9]US[bump@localhost.localdomain]PC[NNGS]
+DT[2001-09-28]
+BR[14k]WR[NR]
+RE[White resigns.]
+;AB[dp][dj][dd][jp][jj][jd][pp][pj][pd]C[..........       Handicap 9];
+W[fp];B[dn];W[cq];B[dq];W[cp];B[co];W[dr];B[nq]C[E2
+];W[rp];B[qo];
+W[ro];B[rn];W[qp];B[qn];W[pq];B[qr]C[P4
+];W[qq];B[rr]C[P4
+];W[op];
+B[no]C[P3
+];W[np];B[po];W[oq];B[mp];W[oo];B[mq];W[nn];B[mo];W[om];
+B[lm]C[Q8
+];W[ql];B[rk];W[rl];B[er];W[ds];B[br]C[F3
+];W[cr];B[gq]
+C[F3
+];W[eq];B[fr];W[gp];B[hp];W[gn];B[fm];W[gm];B[ho];W[fn];B[hl]
+C[E7
+];W[em];B[fl];W[gl];B[gk];W[el];B[fk];W[en];B[cl];W[ek];B[ej];
+W[hm];B[nl];W[ol];B[bo];W[bp];B[ap];W[aq];B[bs];W[il];B[nc]C[H9
+];
+W[rd];B[qc];W[rc];B[rb];W[qf];B[nk];W[ok];B[ri]C[P10
+];W[oj];B[qh];
+W[oh];B[fc];W[bd];B[cc];W[bc];B[bb];W[cf];B[dg];W[cg];B[ch];W[df];
+B[eg];W[ef];B[bh];W[gf];B[af];W[fg];B[gi];W[eh];B[dh];W[hk];B[if];
+W[fj];B[gj];W[fi];B[gh];W[fh];B[mf]C[H13
+];W[hg];B[hi];W[ig];B[jg];W[ii];B[ij];W[ji];B[hj];W[kj]
+;B[jk];W[kl];B[kk];W[li];B[jl];W[km];B[ih];W[jh];B[jm]
+;W[kn];B[hh];W[jn];B[lk];W[ln];B[mn];W[mm];B[nm];W[ll]
+;B[on];W[mk];B[mj];W[ml];B[lj];W[nj];B[ki];W[kh];B[kg]
+;W[lh];B[mh];W[nn];B[im];W[in];B[hn]
+;W[mi]C[----------       White resigns.]
+)
diff --git a/regression/gifu03.tst b/regression/gifu03.tst
new file mode 100644 (file)
index 0000000..bd5d9e5
--- /dev/null
@@ -0,0 +1,242 @@
+# Urgent to save group in upper right.
+loadsgf games/cgf2003/GnuGo-Aya.sgf 48
+1 reg_genmove white
+#? [O19|M17|K18|N19|P14|Q14|R13|N14]*
+
+# R1 makes seki.
+loadsgf games/cgf2003/GnuGo-Aya.sgf 212
+2 reg_genmove white
+#? [R1]
+
+# Urgent to block. It is okay to sacrifice P16 if black cuts.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 26
+101 reg_genmove white
+#? [O15]*
+
+# P16 can still live.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 38
+102 reg_genmove white
+#? [R11]*
+
+# F18 strange shape, leaves much aji.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 50
+103 restricted_genmove white F18 F17
+#? [F17]
+
+# P2 lives.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 90
+104 reg_genmove white
+#? [P2]*
+
+# G18 misses the point. More important to cover cut at L17.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 116
+105 restricted_genmove white G18 H17 H16 J16 K16 K17 L16 L17 F17 F16 H18
+#? [H17|H16|J16|K16|K17|L16|L17]*
+
+# H1 2 points sente.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 174
+106 reg_genmove white
+#? [H1]
+
+# F5 one point gote. N9, P9, and H19 are bigger.
+loadsgf games/cgf2003/GnuGo-GORO.sgf 194
+107 reg_genmove white
+#? [N9|P9]*
+
+# C15 good reduction. At least something like four points in sente.
+loadsgf games/cgf2003/GnuGo-Go4.sgf 105
+201 reg_genmove black
+#? [C15]*
+
+# B1 is not small but at most about 6 points gote. H7 is closer to 9
+# or 10.
+loadsgf games/cgf2003/GnuGo-Go4.sgf 115
+202 reg_genmove black
+#? [H7]*
+
+# O18 is an endgame tesuji.
+loadsgf games/cgf2003/GnuGo-Go4.sgf 129
+203 restricted_genmove black O18 R19
+#? [O18]*
+
+# G18 is not worth anything at all.
+loadsgf games/cgf2003/GnuGo-Go4.sgf 141
+204 restricted_genmove black G18 J19
+#? [J19]
+
+# P5 clearly better than N6.
+loadsgf games/cgf2003/GnuGo-Go4.sgf 155
+205 restricted_genmove black N6 P5
+#? [P5]
+
+# C13 only move. D13 unthinkable.
+loadsgf games/cgf2003/GnuGo-Go4.sgf 175
+206 reg_genmove black
+#? [C13]
+
+# E2 urgent for life in the corner.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 41
+301 reg_genmove black
+#? [E2]
+
+# C1 suffices to live, as does B6.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 59
+302 reg_genmove black
+#? [C1|B6]
+
+# P18 is clearly superior to Q18.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 69
+303 restricted_genmove black Q18 P18
+#? [P18]
+
+# Very uninteresting to save G6.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 119
+304 restricted_genmove black G7 J7
+#? [J7]*
+
+# E1 dies.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 139
+305 reg_genmove black
+#? [!E1]
+
+# B15 very ineffective.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 197
+306 restricted_genmove black B15 B14
+#? [B14]
+
+# H8 and M7 miai for saving the K7 stones
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 205
+307 restricted_genmove black P9 O8 N7 N9 H8 M7 N6
+#? [P9|O8|N9]*
+
+# No value playing N6.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 207
+308 restricted_genmove black N6 L3
+#? [L3]
+
+# J1 locally better than K1.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 217
+309 restricted_genmove black J1 K1
+#? [J1]
+
+# A3 wins the semeai.
+# Update for 3.5.2: The basic problem is that B6 is thought to be
+# tactically dead. See also reading:191.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 237
+310 reg_genmove black
+#? [A3]*
+
+# The game move K5 is too slow. The defense in upper right corner and
+# of H16 is really urgent.
+loadsgf games/cgf2003/GnuGo-GoeMate.sgf 27
+401 reg_genmove black
+#? [R15|O17|K16]
+
+# White is already building the upper side territory, suppressing it and
+# expanding own territory is urgent.
+loadsgf games/cgf2003/GnuGo-GoeMate.sgf 31
+402 reg_genmove black
+#? [O17]*
+
+# Capture solidly.
+loadsgf games/cgf2003/GnuGo-GoeMate.sgf 85
+403 reg_genmove black
+#? [R13]*
+
+# GNU Go 3.4 completely missed that it would be valuable to capture Q15.
+loadsgf games/cgf2003/GnuGo-GoeMate.sgf 129
+404 restricted_genmove black S12 S10
+#? [S12]
+
+# P14 is an atari which only helps black. Q14 is the only move.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 10
+501 reg_genmove white
+#? [Q14]
+
+# Tenuki unreasonable. One of the running groups must be strengthened.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 42
+502 reg_genmove white
+#? [R9|L10|K12]
+
+# R10 better eye shape and less cutting aji than R9.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 48
+503 restricted_genmove white R9 R10
+#? [R10]*
+
+# Too late to sacrifice the O18 group.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 54
+504 reg_genmove white
+#? [L11|L10]*
+
+# Cutting at E8 urgent.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 86
+505 reg_genmove white
+#? [E8]
+
+# Blocking at G2 very big. Black can jump all the way to J1.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 118
+506 restricted_genmove white F6 G2
+#? [G2]*
+
+# The push through at G13 is prepared.
+loadsgf games/cgf2003/GnuGo-Haruka.sgf 168
+507 reg_genmove white
+#? [G13]*
+
+## Q14 is not common in the Chinese fuseki. (But is it worth regressing over?)
+# dr deleted 2004-12-13 when reinserting pattern Fuseki488 / pre 0x220d654c
+# / post 0x235d1a72
+# loadsgf games/cgf2003/GnuGo-KCC.sgf 7
+# 601 restricted_genmove black R12 O16 Q14
+# #? [R12|O16|Q11|P14]
+
+# Making moyo here is much better than the game move F14. The
+# important thing is that O5 has some strategic effect on white while
+# F14 has none (too far from white).
+loadsgf games/cgf2003/GnuGo-KCC.sgf 27
+602 reg_genmove black
+#? [O5]*
+
+# The corner is worth 20 points.
+loadsgf games/cgf2003/GnuGo-KCC.sgf 29
+603 reg_genmove black
+#? [B16]
+
+# Not D2. Better to attack something.
+loadsgf games/cgf2003/GnuGo-KCC.sgf 41
+604 reg_genmove black
+#? [C8|F12|E12|G13|O7|P7|P6]
+
+loadsgf games/cgf2003/GnuGo-KCC.sgf 69
+605 reg_genmove black
+#? [O13|O14]*
+
+# O11 lives.
+loadsgf games/cgf2003/GnuGo-KCC.sgf 141
+606 reg_genmove black
+#? [O11]*
+
+# D7 very definite sente.
+loadsgf games/cgf2003/GnuGo-KCC.sgf 201
+607 restricted_genmove black T14 D7
+#? [D7]*
+
+# O19 is not the right move if we want to reduce the aji of O18.
+loadsgf games/cgf2003/GnuGo-Katsunari.sgf 71
+701 restricted_genmove black O19 M18 L18 L17
+#? [M18|L18|L17]
+
+# N6 locally better than M6.
+loadsgf games/cgf2003/GnuGo-Katsunari.sgf 107
+702 restricted_genmove black M6 N6
+#? [N6]*
+
+# C1 locally worse than the moves which save A2.
+loadsgf games/cgf2003/GnuGo-Katsunari.sgf 177
+703 reg_genmove black
+#? [B2|B1|C2]
+
+# Don't let H8 get away.
+loadsgf games/cgf2003/GnuGo-Katsunari.sgf 179
+704 reg_genmove black
+#? [D3|C2]
diff --git a/regression/gifu05.tst b/regression/gifu05.tst
new file mode 100644 (file)
index 0000000..2f05301
--- /dev/null
@@ -0,0 +1,83 @@
+# Q6 is too slow.
+loadsgf games/gifu2005/gnugo-katsu.sgf 24
+1010 reg_genmove white
+#? [C14|C10|C6|D6|F3|F17|R11]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 34
+1030 restricted_genmove white C10 C12
+#? [C10]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 36
+1040 reg_genmove white
+#? [E12|D11]*
+
+# Q12 is urgent. (Posed as restricted_genmove because a move around C12
+# is arguable more urgent.)
+loadsgf games/gifu2005/gnugo-katsu.sgf 42
+1050 restricted_genmove white Q12 E2
+#? [Q12]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 44
+1060 restricted_genmove white C6 E12 D14 D11
+#? [E12|D11|D14]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 60
+1070 reg_genmove white
+#? [G12]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 62
+1080 reg_genmove white
+#? [O5]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 108
+1090 reg_genmove white
+#? [M9]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 110
+1100 reg_genmove white
+#? [N9]*
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 132
+1110 reg_genmove white
+#? [L5]
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 150
+1120 reg_genmove white
+#? [O2]
+
+#Sente Seki.
+loadsgf games/gifu2005/gnugo-katsu.sgf 224
+1130 reg_genmove white
+#? [S18]*
+
+# Three points in sente.
+loadsgf games/gifu2005/gnugo-katsu.sgf 238
+1140 restricted_genmove white G8 G9 H12 E5
+#? [G8]
+
+loadsgf games/gifu2005/gnugo-katsu.sgf 254
+play black S19
+1150 reg_genmove white
+#? [T14|P12|Q12]*
+
+# Nothing bad can happen in the upper left corner. The B16 cut leads
+# nowhere.
+# See also reading:233.
+loadsgf games/gifu2005/mfg-gnugo.sgf 195
+1200 restricted_genmove black B19 B18 B16 C16
+#? [C16]*
+
+# Double threat to cut at E17. See also tactics1:108 regarding O6.
+loadsgf games/gifu2005/mfg-gnugo.sgf 204
+1210 reg_genmove white
+#? [E17]*
+
+# Double threat to cut at E17.
+loadsgf games/gifu2005/mfg-gnugo.sgf 205
+1220 reg_genmove black
+#? [E17]
+
+# M6 is worth two points gote.
+loadsgf games/gifu2005/mfg-gnugo.sgf 259
+1230 reg_genmove black
+#? [M6]*
diff --git a/regression/global.tst b/regression/global.tst
new file mode 100644 (file)
index 0000000..1a9bc95
--- /dev/null
@@ -0,0 +1,206 @@
+loadsgf golois/Aya991113-11.sgf
+1 reg_genmove black
+#? [B3]
+
+loadsgf golois/Aya991113-12.sgf
+2 reg_genmove black
+#? [T16]
+
+loadsgf golois/Aya991113-13.sgf
+3 reg_genmove black
+#? [H4]
+
+loadsgf golois/Aya991113-1.sgf
+4 reg_genmove black
+#? [Q6]*
+
+loadsgf golois/Aya991113-2.sgf
+5 reg_genmove black
+#? [O4]*
+
+loadsgf golois/Aya991113-3.sgf
+6 reg_genmove black
+#? [J6]*
+
+loadsgf golois/Aya991113-6.sgf
+7 reg_genmove black
+#? [A5]
+
+loadsgf golois/Aya991113-7.sgf
+8 reg_genmove black
+#? [H9]
+
+loadsgf golois/Aya991113-8.sgf
+9 reg_genmove black
+#? [F4]*
+
+loadsgf golois/Aya991113-9.sgf
+10 reg_genmove black
+#? [A5]
+
+# Changed D8 to E8 as correct answer. /gf
+loadsgf golois/bug96.sgf
+11 reg_genmove black
+#? [E8]
+
+loadsgf golois/Goemate990902-14.sgf
+12 reg_genmove black
+#? [F1]
+
+loadsgf golois/Goemate990902-15.sgf
+13 reg_genmove black
+#? [T7]
+
+# Semeai problem.
+loadsgf golois/Goemate990902-1.sgf
+14 reg_genmove black
+#? [S9]
+
+loadsgf golois/Goemate990903-10.sgf
+15 reg_genmove black
+#? [T18]
+
+loadsgf golois/Goemate990903-6.sgf
+16 reg_genmove black
+#? [O10]*
+
+#CATEGORY=CONNECTION
+#DESCRIPTION=
+#SEVERITY=
+loadsgf golois/Goemate990903-7.sgf
+17 reg_genmove black
+#? [P9]
+
+loadsgf golois/Goemate990903-9.sgf
+18 reg_genmove black
+#? [T15]
+
+loadsgf golois/Goemate990904-3.sgf
+19 reg_genmove black
+#? [F14]
+
+# This test should surely have white to move. Still R15 doesn't look
+# like the only move. /gf
+loadsgf golois/Goemate990907-2.sgf
+20 reg_genmove white
+#? [R15]*
+
+loadsgf golois/Goemate990911-1.sgf
+21 reg_genmove black
+#? [G11]*
+
+#CATEGORY=CONNECTION
+#DESCRIPTION=
+#SEVERITY=
+loadsgf golois/Goemate990911-2.sgf
+22 reg_genmove black
+#? [F2]
+
+loadsgf golois/Goemate991106-2.sgf
+23 reg_genmove black
+#? [G15]*
+
+loadsgf golois/Goemate991106-4.sgf
+24 reg_genmove black
+#? [M15]
+
+loadsgf golois/Goemate991113-1.sgf
+25 reg_genmove black
+#? [D12]*
+
+loadsgf golois/Goemate991113-4.sgf
+26 reg_genmove black
+#? [D12]*
+
+loadsgf golois/Goemate991113-5.sgf
+27 reg_genmove black
+#? [T18]
+
+loadsgf golois/GoMaster991113-1.sgf
+28 reg_genmove black
+#? [N11]
+
+loadsgf golois/GoMaster991113-4.sgf
+29 reg_genmove black
+#? [B2]
+
+loadsgf golois/GoMaster991113-5.sgf
+30 reg_genmove black
+#? [B11]
+
+loadsgf golois/GoStar991114-1.sgf
+31 reg_genmove black
+#? [M8]*
+
+loadsgf golois/Indigo-Golois-991105-1.sgf
+32 reg_genmove black
+#? [G8]
+
+loadsgf golois/Jimmy990906-1.sgf
+33 reg_genmove black
+#? [Q9]*
+
+loadsgf golois/Lanka991113-1.sgf
+34 reg_genmove black
+#? [N6]*
+
+loadsgf golois/MeilleurCoup0001.sgf
+35 reg_genmove black
+#? [M12]
+
+loadsgf golois/MeilleurCoup0002.sgf
+36 reg_genmove black
+#? [B6]
+
+loadsgf golois/MeilleurCoup0003.sgf
+37 reg_genmove black
+#? [B6]
+
+loadsgf golois/MeilleurCoup0004.sgf
+38 reg_genmove black
+#? [C6]
+
+loadsgf golois/MeilleurCoup0005.sgf
+39 reg_genmove black
+#? [E8]
+
+loadsgf golois/MeilleurCoup0006.sgf
+40 reg_genmove black
+#? [G4]*
+
+loadsgf golois/MeilleurCoup0007.sgf
+41 reg_genmove black
+#? [B4]
+
+loadsgf golois/MeilleurCoup0008.sgf
+42 reg_genmove black
+#? [M4]
+
+# tm - K5 seems OK, if a little touch & go.
+loadsgf golois/MeilleurCoup0009.sgf
+43 reg_genmove black
+#? [L8|K5]
+
+loadsgf golois/MeilleurCoup0010.sgf
+44 reg_genmove black
+#? [D5]*
+
+# gf This is a duplicate of 44, removed. (3.3.17)
+# loadsgf golois/MeilleurCoup990428-1.sgf
+# 45 reg_genmove black
+# #? [D5]
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=
+#SEVERITY=
+loadsgf golois/Neurogo97-1.sgf
+46 reg_genmove white
+#? [J2]
+
+loadsgf golois/test.sgf
+47 reg_genmove black
+#? [G6]
+
+loadsgf golois/test.sgf
+48 reg_genmove black
+#? [G6]
diff --git a/regression/golife.tst b/regression/golife.tst
new file mode 100644 (file)
index 0000000..0cc20ed
--- /dev/null
@@ -0,0 +1,67 @@
+# This regression file covers mistakes made in the 9x9 Computer Go
+# Ladder game between GNU Go 2.7.187 (white) and GoLife I (black) on
+# November 2, 2000.
+
+loadsgf games/golife.sgf 16
+1 reg_genmove white
+#? [C7]*
+
+loadsgf games/golife.sgf 26
+2 reg_genmove white
+#? [H5]
+
+# In this position the monkey jump can be cut with ko and is smaller
+# than a move at the bottom anyway.
+loadsgf games/golife.sgf 30
+3 reg_genmove white
+#? [E3|E2]*
+
+# # H5 is nice but not the only move. Securing the connection to A3 or
+# # expanding around E2 or E3 is also okay. Testcase removed.
+# loadsgf games/golife.sgf 32
+# 4 reg_genmove white
+# #? [H5]
+
+# GNU Go did play this connection. The test is to make sure it never forgets it.
+loadsgf games/golife.sgf 34
+5 reg_genmove white
+#? [H5]
+
+# G6 is out of the question here. It's harder to decide between B2 and F4.
+loadsgf games/golife.sgf 38
+6 reg_genmove white
+#? [B2|F4]*
+
+# See also test case owl:192
+# F3 does kill black.
+#
+#    A B C D E F G H J
+#  9 . . . . . . X O . 9          O=white
+#  8 X X . O . O X X O 8          X=black
+#  7 O X O . . O O O . 7
+#  6 O O O X X X O . O 6
+#  5 . . X . X O . O X 5
+#  4 . . X 3 4 X O O . 4
+#  3 O . X . 2 1 O . . 3
+#  2 . O . X X X X O . 2
+#  1 . . . 7 . 6 5 . . 1
+#    A B C D E F G H J
+#
+loadsgf games/golife.sgf 46
+7 reg_genmove white
+#? [F3]*
+
+# Connecting the one point ko at G5 is too small. Either C2 or G1 looks
+# largest.
+loadsgf games/golife.sgf 48
+8 reg_genmove white
+#? [C2|G1]
+
+loadsgf games/golife.sgf 56
+9 reg_genmove white
+#? [C1]
+
+loadsgf games/golife.sgf 60
+10 reg_genmove white
+#? [D7]
+
diff --git a/regression/golois/Aya991113-1.sgf b/regression/golois/Aya991113-1.sgf
new file mode 100644 (file)
index 0000000..e8b1370
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-1.gob]ID[Aya991113-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][gc][kc][cf][qh][ci][pi][rj][qk][pl][pm][cn][qn][qo][op][pp][cq][gq][iq][nq]
+AW[mc][pc][ed][qe][kg][rg][qi][ol][rl][om][qm][on][rn][no][po][ep][mp][rp][kq][mq][qq]
+;C[move(pn):connect(pm,pp) move(pn,black):best ])
diff --git a/regression/golois/Aya991113-11.sgf b/regression/golois/Aya991113-11.sgf
new file mode 100644 (file)
index 0000000..df6edf7
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-11.gob]ID[Aya991113-11.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][ec][gc][kc][qc][rc][fd][id][ld][qd][ee][ge][he][je][me][pe][qe][re][se][cf][ef][hf][qf][rf][dg][hg][sg][dh][eh][oh][qh][rh][ci][ei][fi][oi][pi][si][bj][cj][qj][rj][ek][fk][gk][qk][dl][pl][ql][dm][fm][gm][pm][bn][cn][pn][qn][co][oo][po][qo][bp][fp][ip][jp][op][pp][cq][eq][gq][iq][nq][er][fr][hr][nr][or][pr][rr]
+AW[lb][qb][mc][pc][ed][pd][ie][ne][oe][ff][if][jf][lf][mf][of][pf][eg][kg][pg][qg][rg][fh][gh][nh][ph][di][gi][ii][ni][dj][ej][fj][gj][oj][ck][dk][hk][cl][gl][ol][rl][bm][hm][om][qm][rm][an][gn][on][rn][ao][bo][go][io][jo][no][ro][cp][dp][ep][kp][mp][np][qp][rp][kq][mq][oq][pq][qq][sq][gr][ir][jr][qr]
+;C[move(bq,black):best ])
diff --git a/regression/golois/Aya991113-12.sgf b/regression/golois/Aya991113-12.sgf
new file mode 100644 (file)
index 0000000..6238992
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-12.gob]ID[Aya991113-12.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ia][ja][ka][ib][cc][ec][gc][ic][jc][kc][qc][rc][fd][id][kd][ld][md][qd][ee][ge][he][je][ke][me][pe][qe][re][se][cf][ef][hf][qf][rf][dg][hg][jg][sg][dh][eh][hh][ih][oh][qh][rh][ci][ei][fi][oi][pi][si][aj][bj][cj][qj][rj][ak][ek][fk][gk][qk][rk][sk][dl][pl][ql][sl][dm][fm][gm][pm][bn][cn][en][fn][pn][qn][co][do][fo][oo][po][qo][so][fp][hp][ip][jp][op][pp][cq][dq][eq][gq][iq][nq][er][fr][hr][lr][nr][or][pr][rr][ds][ps][qs][rs]
+AW[la][jb][kb][lb][qb][rb][lc][mc][pc][sc][ed][nd][pd][ie][le][ne][oe][ff][if][jf][kf][lf][mf][of][pf][eg][fg][kg][pg][qg][rg][fh][gh][nh][ph][di][gi][ii][ji][ni][qi][dj][ej][fj][gj][oj][pj][bk][ck][dk][hk][ok][al][cl][gl][ll][ol][rl][bm][hm][om][qm][rm][sm][an][gn][on][rn][ao][bo][eo][go][io][jo][no][ro][ap][bp][cp][dp][ep][kp][mp][np][qp][rp][bq][kq][mq][oq][pq][qq][rq][sq][cr][gr][ir][jr][mr][qr][sr][bs][ns]
+;C[move(sd,black):best move(sd):live(rf) ])
diff --git a/regression/golois/Aya991113-13.sgf b/regression/golois/Aya991113-13.sgf
new file mode 100644 (file)
index 0000000..b3e9e91
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-13.gob]ID[Aya991113-13.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ia][ja][ka][bb][eb][ib][cc][ec][gc][ic][jc][kc][qc][rc][dd][fd][id][kd][ld][md][qd][ee][ge][he][je][ke][me][pe][qe][re][se][bf][cf][ef][hf][qf][rf][dg][hg][ig][jg][mg][ng][og][sg][dh][eh][hh][ih][kh][lh][mh][oh][qh][rh][ci][ei][fi][ki][mi][oi][pi][ri][si][aj][bj][cj][hj][ij][jj][kj][qj][rj][ak][ek][fk][gk][mk][nk][qk][rk][sk][dl][el][il][jl][ml][pl][ql][sl][dm][fm][gm][im][lm][mm][pm][bn][cn][dn][en][fn][in][jn][kn][mn][pn][qn][co][do][fo][lo][oo][po][qo][so][fp][lp][op][pp][sp][cq][dq][eq][gq][lq][nq][er][fr][hr][kr][lr][nr][or][pr][rr][ds][es][gs][hs][is][ks][ps][qs][rs]
+AW[la][jb][kb][lb][qb][rb][lc][mc][pc][sc][nd][pd][sd][fe][ie][le][ne][oe][ff][gf][if][jf][kf][lf][mf][nf][of][pf][eg][fg][gg][kg][pg][qg][rg][fh][gh][jh][nh][ph][di][gi][hi][ii][ji][ni][dj][ej][fj][gj][lj][mj][nj][oj][pj][bk][ck][dk][hk][kk][lk][ok][al][cl][fl][gl][hl][kl][ll][ol][rl][bm][cm][hm][jm][km][om][qm][rm][sm][an][gn][hn][nn][on][rn][ao][bo][eo][go][io][jo][ko][no][ro][ap][bp][cp][dp][ep][gp][kp][mp][np][qp][rp][bq][hq][jq][kq][mq][oq][pq][qq][rq][sq][ar][cr][dr][ir][jr][mr][qr][sr][bs][cs][js][ls][ms][ns]
+;C[move(hp):kill(go) move(hp,black):best ])
diff --git a/regression/golois/Aya991113-2.sgf b/regression/golois/Aya991113-2.sgf
new file mode 100644 (file)
index 0000000..7e375ba
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-2.gob]ID[Aya991113-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][gc][kc][cf][qh][ci][pi][qj][rj][qk][pl][ql][pm][cn][pn][qn][oo][qo][op][pp][cq][gq][iq][nq][nr][pr]
+AW[mc][pc][ed][qe][kg][rg][qi][ri][ol][rl][om][qm][rm][on][rn][no][ro][ep][mp][qp][rp][kq][mq][oq][pq][qq]
+;C[move(np,black):best ])
diff --git a/regression/golois/Aya991113-3.sgf b/regression/golois/Aya991113-3.sgf
new file mode 100644 (file)
index 0000000..daba994
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-3.gob]ID[Aya991113-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][ec][gc][kc][qc][rc][ld][qd][me][pe][re][se][cf][qf][rf][sg][oh][qh][rh][ci][pi][qj][rj][qk][pl][ql][pm][cn][pn][qn][oo][po][qo][op][pp][cq][eq][gq][iq][nq][nr][or][pr][rr]
+AW[qb][mc][pc][ed][pd][ne][oe][lf][mf][of][pf][eg][kg][pg][qg][rg][nh][ni][qi][ri][oj][ol][rl][om][qm][rm][on][rn][no][ro][ep][mp][np][qp][rp][kq][mq][oq][pq][qq][sq][jr][qr]
+;C[move(in,black):best ])
diff --git a/regression/golois/Aya991113-6.sgf b/regression/golois/Aya991113-6.sgf
new file mode 100644 (file)
index 0000000..14c06e8
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-6.gob]ID[Aya991113-6.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][ec][gc][kc][qc][rc][fd][id][ld][qd][ee][ge][je][me][pe][re][se][cf][ef][hf][qf][rf][hg][sg][dh][eh][oh][qh][rh][ci][ei][fi][pi][bj][cj][qj][rj][ek][fk][qk][dl][pl][ql][dm][fm][pm][bn][cn][pn][qn][oo][po][qo][ip][jp][op][pp][cq][eq][gq][iq][nq][nr][or][pr][rr]
+AW[lb][qb][mc][pc][ed][pd][ie][ne][oe][ff][if][jf][lf][mf][of][pf][eg][kg][pg][qg][rg][fh][gh][nh][di][ii][ni][qi][ri][dj][ej][fj][gj][oj][ck][dk][cl][gl][ol][rl][bm][om][qm][rm][an][on][rn][io][jo][no][ro][ep][kp][mp][np][qp][rp][kq][mq][oq][pq][qq][sq][jr][qr]
+;C[move(ao,black):best ])
diff --git a/regression/golois/Aya991113-7.sgf b/regression/golois/Aya991113-7.sgf
new file mode 100644 (file)
index 0000000..abf348f
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-7.gob]ID[Aya991113-7.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][ec][gc][kc][qc][rc][fd][id][ld][qd][ee][ge][je][me][pe][re][se][cf][ef][hf][qf][rf][hg][sg][dh][eh][oh][qh][rh][ci][ei][fi][pi][bj][cj][qj][rj][ek][fk][gk][qk][dl][pl][ql][dm][fm][pm][bn][cn][pn][qn][oo][po][qo][ip][jp][op][pp][cq][eq][gq][iq][nq][nr][or][pr][rr]
+AW[lb][qb][mc][pc][ed][pd][ie][ne][oe][ff][if][jf][lf][mf][of][pf][eg][kg][pg][qg][rg][fh][gh][nh][di][ii][ni][qi][ri][dj][ej][fj][gj][oj][ck][dk][cl][gl][ol][rl][bm][hm][om][qm][rm][an][on][rn][io][jo][no][ro][ep][kp][mp][np][qp][rp][kq][mq][oq][pq][qq][sq][jr][qr]
+;C[move(hk,black):best ])
diff --git a/regression/golois/Aya991113-8.sgf b/regression/golois/Aya991113-8.sgf
new file mode 100644 (file)
index 0000000..260d3a4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-8.gob]ID[Aya991113-8.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][ec][gc][kc][qc][rc][fd][id][ld][qd][ee][ge][he][je][me][pe][re][se][cf][ef][hf][qf][rf][hg][sg][dh][eh][oh][qh][rh][ci][ei][fi][pi][bj][cj][qj][rj][ek][fk][gk][qk][dl][pl][ql][dm][fm][gm][pm][bn][cn][pn][qn][oo][po][qo][ip][jp][op][pp][cq][eq][gq][iq][nq][nr][or][pr][rr]
+AW[lb][qb][mc][pc][ed][pd][ie][ne][oe][ff][if][jf][lf][mf][of][pf][eg][kg][pg][qg][rg][fh][gh][nh][di][ii][ni][qi][ri][dj][ej][fj][gj][oj][ck][dk][cl][gl][ol][rl][bm][hm][om][qm][rm][an][on][rn][go][io][jo][no][ro][ep][kp][mp][np][qp][rp][fq][kq][mq][oq][pq][qq][sq][jr][qr]
+;C[move(fp,black):best ])
diff --git a/regression/golois/Aya991113-9.sgf b/regression/golois/Aya991113-9.sgf
new file mode 100644 (file)
index 0000000..fb87800
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Aya991113-9.gob]ID[Aya991113-9.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][cc][ec][gc][kc][qc][rc][fd][id][ld][qd][ee][ge][he][je][me][pe][re][se][cf][ef][hf][qf][rf][hg][sg][dh][eh][oh][qh][rh][ci][ei][fi][pi][bj][cj][qj][rj][ek][fk][gk][qk][dl][pl][ql][dm][fm][gm][pm][bn][cn][pn][qn][oo][po][qo][fp][ip][jp][op][pp][cq][eq][gq][iq][nq][er][fr][nr][or][pr][rr]
+AW[lb][qb][mc][pc][ed][pd][ie][ne][oe][ff][if][jf][lf][mf][of][pf][eg][kg][pg][qg][rg][fh][gh][nh][di][ii][ni][qi][ri][dj][ej][fj][gj][oj][ck][dk][hk][cl][gl][ol][rl][bm][hm][om][qm][rm][an][on][rn][go][io][jo][no][ro][ep][kp][mp][np][qp][rp][kq][mq][oq][pq][qq][sq][gr][ir][jr][qr]
+;C[move(ao,black):best ])
diff --git a/regression/golois/Basique990715-1.sgf b/regression/golois/Basique990715-1.sgf
new file mode 100644 (file)
index 0000000..4258e07
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Basique990715-1.gob]ID[Basique990715-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[gc][jc][pd][ci][co][po][dq][pq]
+AW[ec][lc][ee][le][eg][gg][ig][kg][mh][oh][qh][ei][bk][ck][ek][fl][om][qm][fn][fp][fr]
+;C[connected(jc,gc) connected(dq,co) connected(pq,po) ])
diff --git a/regression/golois/BiwakoFost97-1.sgf b/regression/golois/BiwakoFost97-1.sgf
new file mode 100644 (file)
index 0000000..08cfaed
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[BiwakoFost97-1.gob]ID[BiwakoFost97-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ab][db][pb][dc][ec][lc][dd][ld][md][nd][pd][fe][qe][re][bf][cf][hf][if][jf][nf][qf][kg][ch][dh][gh][jh][lh][ai][bi][di][ji][ki][mi][oi][qi][cj][ej][fj][gj][ij][ek][hk][ik][jl][kl][ll][bm][hm][jm][km][qm][rm][cn][dn][en][fn][hn][kn][nn][on][ho][io][jo][no][fp][hp][np][op][pp][fq][gq][hq][jq][nq][ir][jr][lr][nr][ns]
+AW[bb][gb][kb][lb][nb][cc][hc][jc][mc][bd][kd][ie][je][le][lf][rf][rg][bh][sh][hi][aj][jj][rj][bk][fk][jk][kk][lk][nk][qk][bl][cl][el][fl][gl][hl][il][pl][dm][gm][im][lm][mm][nm][pm][gn][in][jn][mn][pn][rn][do][eo][fo][go][ko][lo][oo][po][qo][bp][gp][ip][jp][kp][cq][dq][iq][mq][oq][qq][rq][er][fr][mr][pr][ms]
+;C[move(gr):kill(gq) move(gr):live(gq) ])
diff --git a/regression/golois/BiwakoFost97-2.sgf b/regression/golois/BiwakoFost97-2.sgf
new file mode 100644 (file)
index 0000000..8362151
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[BiwakoFost97-2.gob]ID[BiwakoFost97-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ab][db][pb][dc][ec][lc][dd][ld][md][nd][pd][fe][qe][re][bf][cf][hf][if][jf][nf][qf][kg][ch][dh][gh][jh][lh][ai][bi][di][ji][ki][mi][oi][qi][cj][ej][fj][gj][ij][ek][hk][ik][jl][kl][ll][bm][hm][jm][km][qm][rm][cn][dn][en][fn][hn][kn][nn][on][ho][io][jo][no][fp][hp][np][op][pp][fq][gq][hq][jq][nq][ir][jr][lr][nr][hs][js][ns]
+AW[bb][gb][kb][lb][nb][cc][hc][jc][mc][bd][kd][ie][je][le][lf][rf][rg][bh][sh][hi][aj][jj][rj][bk][fk][jk][kk][lk][nk][qk][bl][cl][el][fl][gl][hl][il][pl][dm][gm][im][lm][mm][nm][pm][gn][in][jn][mn][pn][rn][do][eo][fo][go][ko][lo][oo][po][qo][bp][gp][ip][jp][kp][cq][dq][iq][mq][oq][qq][rq][er][fr][mr][pr][ks][ms]
+;C[move(gr):kill(gq) move(gr):live(gq) ])
diff --git a/regression/golois/Connecter990424-1.sgf b/regression/golois/Connecter990424-1.sgf
new file mode 100644 (file)
index 0000000..dad1879
--- /dev/null
@@ -0,0 +1,3 @@
+(;N[Connecter990424-1.gob]ID[Connecter990424-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[cc][ec]
+;C[connected(ec,cc) ])
diff --git a/regression/golois/Connecter990424-2.sgf b/regression/golois/Connecter990424-2.sgf
new file mode 100644 (file)
index 0000000..68b79e8
--- /dev/null
@@ -0,0 +1,3 @@
+(;N[Connecter990424-2.gob]ID[Connecter990424-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[cc][be]
+;C[connected(cc,be) ])
diff --git a/regression/golois/Connecter990426-1.sgf b/regression/golois/Connecter990426-1.sgf
new file mode 100644 (file)
index 0000000..421a39f
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990426-1.gob]ID[Connecter990426-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[eb][ac][bc][cc][ec][fc][gc][cd][fd][ce][de][ee][ef][ff][cg][eg][gg][hg][bh][ch][eh][gh][bi][ei]
+AW[fb][gb][hc][bd][dd][ed][gd][be][fe][ge][he][bf][cf][df][bg][dg][ah][dh][fh][di]
+;C[connected(gd,gb) ])
diff --git a/regression/golois/Connecter990426-2.sgf b/regression/golois/Connecter990426-2.sgf
new file mode 100644 (file)
index 0000000..3795573
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990426-2.gob]ID[Connecter990426-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[fa][eb][ac][bc][cc][ec][fc][gc][cd][fd][ce][de][ee][ef][ff][cg][eg][gg][hg][bh][ch][eh][gh][bi][ei]
+AW[ha][fb][gb][hc][bd][dd][ed][gd][be][fe][ge][he][bf][cf][df][bg][dg][ah][dh][fh][di]
+;C[connected(gd,gb) ])
diff --git a/regression/golois/Connecter990427-1.sgf b/regression/golois/Connecter990427-1.sgf
new file mode 100644 (file)
index 0000000..a2aaae5
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990427-1.gob]ID[Connecter990427-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[cc][gc][gd][ee][cg][gg]
+AW[ec]
+;C[connected(gd,ee) ])
diff --git a/regression/golois/Connecter990428-1.sgf b/regression/golois/Connecter990428-1.sgf
new file mode 100644 (file)
index 0000000..3045f03
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990428-1.gob]ID[Connecter990428-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[ea][fa][ga][ha][fb][hb][cc][dc][ec][bd][ee][ge][he][cg][eg][gg]
+AW[bb][eb][gb][ib][fc][hc][dd][ed][fd][gd][be][ce]
+;C[move(ad):cut(be,bb) move(bc):connect(be,bb) ])
diff --git a/regression/golois/Connecter990430-1.sgf b/regression/golois/Connecter990430-1.sgf
new file mode 100644 (file)
index 0000000..955ef6a
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990430-1.gob]ID[Connecter990430-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[da][db][cc][gc][cd][gd][ce][ee][ge][cf][cg][gg][ch][dh][gh]
+AW[eb][gb][dc][fc][hc][dd][de][df][dg][fg][eh]
+;C[connected(hc,fc) ])
diff --git a/regression/golois/Connecter990430-2.sgf b/regression/golois/Connecter990430-2.sgf
new file mode 100644 (file)
index 0000000..2159dc2
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990430-2.gob]ID[Connecter990430-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[ba][da][fa][ga][ha][bb][db][eb][cc][dc][gc][ed][fd][gd][ee][ge][cf][df][ef][gf][if][bg][cg][gg][bh][ci][di][ei]
+AW[ab][fb][gb][hb][bc][ec][fc][hc][ad][cd][dd][hd][be][ce][af][bf][dg][fg][ch][dh][eh][gh][hh][fi]
+;C[move(bi):connect(ci,if) ])
diff --git a/regression/golois/Connecter990430-3.sgf b/regression/golois/Connecter990430-3.sgf
new file mode 100644 (file)
index 0000000..17c3ee3
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990430-3.gob]ID[Connecter990430-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[da][db][ib][cc][gc][ic][bd][gd][hd][ae][ee][ge][af][df][ff][gf][ag][cg][dg][gg][ah][dh][hh][fi]
+AW[eb][gb][hb][dc][fc][hc][dd][ed][be][ce][de][bf][ef][bg][eg][fg][bh][ch][fh][gh]
+;C[move(fe):connect(ee,ic) ])
diff --git a/regression/golois/Connecter990501-1.sgf b/regression/golois/Connecter990501-1.sgf
new file mode 100644 (file)
index 0000000..88b81c4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990501-1.gob]ID[Connecter990501-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[da][eb][cc][dc][gc][bd][ce][ee][ge][cg][gg]
+AW[fb][ec][fc][cd][dd][ed][be]
+;C[move(bc):connect(ce,cc) ])
diff --git a/regression/golois/Connecter990502-1.sgf b/regression/golois/Connecter990502-1.sgf
new file mode 100644 (file)
index 0000000..723c088
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990502-1.gob]ID[Connecter990502-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[bb][fb][bc][cc][gc][hc][cd][dd][fd][id][ee][ge][bf][ff][bg][cg][eg][gg][fh]
+AW[ba][cb][eb][gb][hb][dc][ec][fc][ed][cf][df][dg][ch][eh][di]
+;C[move(de):connect(gc,dd) ])
diff --git a/regression/golois/Connecter990621-1.sgf b/regression/golois/Connecter990621-1.sgf
new file mode 100644 (file)
index 0000000..4bccb9c
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990621-1.gob]ID[Connecter990621-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[la][ma][mb][nb][ob][oc][qc][od][ne][oe][qe][re][bf][df][ff][mf][nf][pf][sf][ag][bg][cg][dg][eg][og][pg][rg][ch][dh][fh][gh][jh][kh][lh][mh][oh][qh][ei][fi][ji][ki][li][ni][bj][cj][dj][gj][hj][kj][nj][oj][bk][gk][ik][mk][nk][pk][sk][bl][il][sl][fm][gm][hm][im][jm][mm][nm][qm][rm][sm][en][in][bo][oo][po][qo][dp][ep][jp][fq][gq][hq][qq][hr][jr][kr][lr][pr][is][ms][ns]
+AW[ka][jb][lb][cc][fc][hc][lc][mc][nc][ad][nd][ae][be][ce][de][ee][le][me][af][cf][ef][gf][lf][qf][rf][fg][gg][jg][kg][lg][mg][ng][hh][ih][rh][sh][hi][oi][pi][ri][ej][jj][lj][mj][qj][sj][ck][dk][ek][jk][kk][lk][rk][cl][fl][jl][ll][ol][pl][ql][rl][am][bm][cm][em][km][lm][om][dn][jn][ln][nn][on][co][ko][no][bp][cq][eq][kq][lq][nq][oq][pq][br][er][fr][gr][mr][gs][hs]
+;C[move(nh):connect(ni,oh) move(nh):connect(mh,oh) move(nh):connect(pk,oh) ])
diff --git a/regression/golois/Connecter990628-1.sgf b/regression/golois/Connecter990628-1.sgf
new file mode 100644 (file)
index 0000000..2138079
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990628-1.gob]ID[Connecter990628-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[hb][kb][mb][cc][dc][ec][fc][jc][nc][oc][pc][qc][cd][gd][qd][de][ee][qg][dh][di][qi][bj][cj][ej][bl][el][fl][km][gn][kn][mn][fo][jo][ko][dp][ep][jp][lp][pp][rp][qq][er][ir][jr][kr][or][pr]
+AW[ic][mc][dd][ed][fd][jd][kd][md][nd][od][pd][ef][pf][cg][ch][eh][ci][ei][dj][fj][dk][gk][cl][il][jl][ml][ql][hm][jm][cn][hn][jn][ln][on][bo][do][ho][io][lo][no][po][qo][cp][op][cq][hq][iq][nq][hr][nr]
+;C[move(lm):connect(kn,mn) ])
diff --git a/regression/golois/Connecter990628-2.sgf b/regression/golois/Connecter990628-2.sgf
new file mode 100644 (file)
index 0000000..ff1c378
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990628-2.gob]ID[Connecter990628-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[mb][cc][fc][ic][kc][bd][dd][ge][hf][if][kf][jg][eh][kh][bi][li][oi][dj][kj][nj][pj][rj][bk][ck][ek][nk][qk][al][cl][dl][ql][qm][kn][mn][qn][bo][co][jo][mo][qo][cp][dp][hp][jp][lp][qp][cq][gq][iq][kq][mq][pq][qq][ar][br][dr][er][hr][jr][nr][or][bs][ds][fs]
+AW[qc][od][be][ce][de][ie][je][ke][me][of][fg][hg][lg][ng][pg][bh][gh][ih][oh][ph][ci][hi][qi][bj][cj][qj][gk][mk][pk][el][fl][jl][ll][nl][pl][dm][pm][an][bn][cn][en][pn][ao][do][ho][ko][lo][po][ap][bp][ep][ip][mp][np][pp][aq][bq][eq][fq][nq][fr][gr]
+;C[connected(ge,fc) move(gs):connect(er,iq) ])
diff --git a/regression/golois/Connecter990630-1.sgf b/regression/golois/Connecter990630-1.sgf
new file mode 100644 (file)
index 0000000..438fa03
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Connecter990630-1.gob]ID[Connecter990630-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[nb][ob][pb][nc][qc][cd][dd][ed][fd][hd][jd][kd][ld][md][be][ge][ie][ke][pe][cf][gf][jf][rf][cg][ig][ng][pg][qg][dh][fh][jh][kh][lh][mh][nh][ph][di][fi][ji][mi][pi][si][bj][ej][kj][qj][rj][bk][dk][ek][qk][sk][cl][fl][gl][hl][il][kl][pl][rl][bm][cm][dm][fm][hm][jm][qm][cn][en][gn][in][kn][on][qn][rn][do][fo][ko][qo][dp][fp][kp][mp][eq][hq][iq][jq][lq][oq][er][gr][hr][kr][mr][or][hs][ns]
+AW[ja][ma][na][gb][jb][lb][cc][dc][ec][fc][gc][hc][ic][jc][lc][mc][pc][ad][bd][gd][nd][od][le][me][ne][af][bf][kf][mf][nf][of][jg][kg][lg][mg][rg][bh][qh][ai][ei][ki][ni][oi][qi][ri][cj][dj][mj][oj][pj][ck][mk][nk][pk][bl][dl][el][ol][nm][rm][sm][bn][hn][ln][nn][sn][bo][go][ho][jo][no][ro][bp][gp][hp][ip][op][pp][rp][aq][cq][fq][gq][pq][qq][br][dr][fr][lr][pr][es][gs][os][ps]
+;C[move(fs):connect(fr,dr) ])
diff --git a/regression/golois/DeuxYeuxIndigoIng98.sgf b/regression/golois/DeuxYeuxIndigoIng98.sgf
new file mode 100644 (file)
index 0000000..729d2dc
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[DeuxYeuxIndigoIng98.gob]ID[DeuxYeuxIndigoIng98.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[la][kb][mb][ob][ac][ic][kc][lc][nc][oc][pc][bd][id][kd][pd][ae][ce][ge][he][ie][je][oe][bf][df][ef][ff][gf][jf][kf][nf][of][cg][dg][kg][pg][qg][rg][ih][kh][ci][di][ei][gi][ii][ki][qi][cj][ej][gj][ij][kj][dk][ek][ik][kk][qk][dl][il][kl][ll][ml][dm][im][jm][bn][jn][co][jo][ko][oo][bp][dp][jp][lp][np][qp][bq][dq][iq][jq][lq][mq][cr][ir][mr]
+AW[ab][bb][ib][jb][nb][rb][cc][fc][hc][jc][mc][qc][dd][jd][md][nd][od][de][ee][ke][le][pe][qe][hf][if][lf][pf][rf][bg][fg][gg][hg][ig][jg][mg][og][bh][ch][dh][eh][hh][jh][bi][ji][li][ni][pi][bj][jj][bk][gk][jk][mk][nk][cl][fl][gl][jl][nl][cm][km][lm][mm][cn][dn][en][hn][kn][nn][ho][lo][mo][no][ip][kp][hq][kq][br][gr][jr][kr][lr][ks]
+;C[move(bc):kill(bd) ])
diff --git a/regression/golois/DeuxYeuxManyFacesIng98.sgf b/regression/golois/DeuxYeuxManyFacesIng98.sgf
new file mode 100644 (file)
index 0000000..9ef0476
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[DeuxYeuxManyFacesIng98.gob]ID[DeuxYeuxManyFacesIng98.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ka][ma][ib][mb][cc][fc][hc][mc][bd][dd][ld][ie][le][me][pe][qf][rf][dg][gg][jg][mg][ng][pg][ch][fh][ih][kh][lh][oh][pi][ri][bj][hj][pj][qj][lk][mk][nk][ok][cl][dl][fl][jl][kl][im][lm][oo][cq]
+AW[nb][kc][lc][nc][pc][kd][md][nd][fe][ke][qe][re][cf][df][ef][lf][mf][of][pf][lg][qg][rg][mh][qh][ki][li][ni][jj][oj][ik][hl][dm][gm][nm][cn][en][hn][in][kn][ln][do][no][qo][mp][op][fq][iq][pq][dr]
+;C[move(rk):live(qj) ])
diff --git a/regression/golois/GoAheadMarseille97.sgf b/regression/golois/GoAheadMarseille97.sgf
new file mode 100644 (file)
index 0000000..7bc7402
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoAheadMarseille97.gob]ID[GoAheadMarseille97.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ma][pa][ra][gb][ib][kb][lb][mb][ob][qb][bc][cc][dc][ec][fc][hc][ic][kc][mc][nc][oc][qc][ad][bd][fd][gd][id][od][pd][sd][je][me][ne][if][jf][mf][rf][gg][hg][ig][jg][qg][fh][gh][kh][mh][nh][ph][qh][di][ei][hi][ki][li][ni][oi][ej][hj][jj][qj][bk][gk][kk][el][gl][il][jl][nl][ol][ql][cm][dm][lm][cn][do][ho][cp][dp][ep][gp][hp][ip][bq][cq][hq][ar][cr][dr]
+AW[ja][ka][na][jb][nb][rb][sb][jc][lc][rc][cd][dd][ed][hd][jd][kd][ld][md][qd][ae][be][fe][ge][he][ie][ke][pe][qe][re][se][hf][lf][nf][eg][lg][mg][ng][og][pg][dh][eh][hh][ih][lh][oh][ci][fi][gi][ii][mi][bj][mj][nj][ck][lk][nk][cl][ll][ml][bm][km][nm][bn][dn][en][fn][hn][ln][qn][bo][co][eo][go][io][bp][fp][jp][pp][eq][fq][iq][jq][pq][br][er][hr][bs]
+;C[move(oe):live(nf) move(oe):kill(qe) ])
diff --git a/regression/golois/GoMaster991113-1.sgf b/regression/golois/GoMaster991113-1.sgf
new file mode 100644 (file)
index 0000000..706b358
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoMaster991113-1.gob]ID[GoMaster991113-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][dc][ec][hc][ic][jc][mc][nd][pd][rd][sd][ie][oe][qe][bf][cf][ef][if][of][cg][mg][qg][bh][ch][eh][lh][qi][bj][kk][bl][cl][ll][ql][fm][hm][rm][an][kn][nn][pn][qn][ao][co][fo][no][oo][ro][ap][cp][jp][kp][mp][cq][eq][lq][dr][fr][fs]
+AW[bc][oc][pc][qc][rc][cd][dd][ed][id][qd][be][fe][je][df][ff][hf][jf][bg][dg][ig][kg][dh][fh][kh][di][li][jj][ck][ek][gk][ik][dl][gl][dm][gm][jm][bn][cn][en][fn][jn][bo][do][io][po][qo][ep][ip][pp][rp][fq][gq][iq][nq][pq][qq][gr][kr][mr][gs]
+;C[move(mi,black):best ])
diff --git a/regression/golois/GoMaster991113-3.sgf b/regression/golois/GoMaster991113-3.sgf
new file mode 100644 (file)
index 0000000..0283ee1
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoMaster991113-3.gob]ID[GoMaster991113-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ca][na][oa][cb][nb][cc][dc][ec][hc][ic][jc][kc][mc][ad][fd][gd][jd][ld][nd][pd][rd][sd][ae][me][oe][qe][bf][cf][ef][of][rf][cg][lg][mg][qg][bh][ch][eh][lh][qi][si][bj][oj][qj][hk][jk][kk][ok][pk][rk][bl][cl][hl][il][jl][kl][ll][nl][pl][ql][fm][hm][lm][om][rm][an][kn][ln][nn][pn][qn][ao][co][fo][jo][no][oo][ro][so][ap][cp][jp][kp][mp][sp][cq][eq][lq][dr][fr][lr][fs]
+AW[ba][pa][bb][ob][qb][bc][oc][pc][qc][rc][sc][bd][cd][dd][ed][hd][id][kd][qd][be][fe][he][je][ke][df][ff][hf][jf][bg][dg][ig][kg][ng][dh][fh][kh][mh][ph][qh][rh][di][li][ni][oi][pi][hj][ij][jj][kj][nj][pj][ck][ek][gk][ik][lk][nk][dl][gl][ml][dm][gm][jm][km][bn][cn][en][fn][hn][in][jn][bo][do][io][ko][po][qo][ep][ip][pp][rp][fq][gq][iq][nq][pq][qq][sq][gr][kr][mr][gs][ls]
+;C[move(bp):cut(co,bl) ])
diff --git a/regression/golois/GoMaster991113-4.sgf b/regression/golois/GoMaster991113-4.sgf
new file mode 100644 (file)
index 0000000..469b692
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoMaster991113-4.gob]ID[GoMaster991113-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ca][na][oa][cb][nb][cc][dc][ec][hc][ic][jc][kc][mc][ad][fd][gd][jd][ld][nd][pd][rd][sd][ae][me][oe][qe][bf][cf][ef][of][rf][cg][lg][mg][qg][bh][ch][eh][lh][qi][si][bj][oj][qj][hk][jk][kk][ok][pk][rk][bl][cl][hl][il][jl][kl][ll][nl][pl][ql][am][fm][hm][lm][om][rm][an][kn][ln][nn][pn][qn][ao][co][fo][jo][no][oo][ro][so][ap][cp][jp][kp][mp][sp][cq][eq][lq][dr][fr][lr][fs]
+AW[ba][pa][bb][ob][qb][bc][oc][pc][qc][rc][sc][bd][cd][dd][ed][hd][id][kd][qd][be][fe][he][je][ke][df][ff][hf][jf][bg][dg][ig][kg][ng][dh][fh][kh][mh][ph][qh][rh][di][li][ni][oi][pi][hj][ij][jj][kj][nj][pj][ck][ek][gk][ik][lk][nk][dl][gl][ml][dm][gm][jm][km][bn][cn][en][fn][hn][in][jn][bo][do][io][ko][po][qo][bp][ep][ip][pp][rp][bq][fq][gq][iq][nq][pq][qq][sq][gr][kr][mr][gs][ls]
+;C[move(br,black):best move(br):live(cq) alive(bh) ])
diff --git a/regression/golois/GoMaster991113-5.sgf b/regression/golois/GoMaster991113-5.sgf
new file mode 100644 (file)
index 0000000..a1fbe08
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoMaster991113-5.gob]ID[GoMaster991113-5.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ca][na][oa][cb][nb][ac][cc][dc][ec][hc][ic][jc][kc][mc][ad][fd][gd][jd][ld][nd][pd][rd][sd][ae][le][me][oe][pe][qe][bf][cf][ef][lf][of][qf][rf][cg][lg][mg][qg][sg][bh][ch][eh][lh][sh][qi][si][bj][oj][qj][rj][bk][hk][jk][kk][ok][pk][rk][al][bl][cl][hl][il][jl][kl][ll][nl][pl][ql][am][fm][hm][lm][om][rm][an][kn][ln][nn][pn][qn][ao][co][fo][jo][no][oo][ro][so][ap][cp][dp][jp][kp][mp][sp][aq][cq][eq][lq][dr][fr][lr][fs]
+AW[ba][pa][bb][ob][qb][bc][oc][pc][qc][rc][sc][bd][cd][dd][ed][hd][id][kd][od][qd][be][fe][he][je][ke][df][ff][hf][jf][mf][nf][bg][dg][ig][kg][ng][pg][rg][dh][fh][kh][mh][ph][qh][rh][ci][di][li][ni][oi][pi][ri][cj][hj][ij][jj][kj][nj][pj][ck][ek][gk][ik][lk][nk][dl][gl][ml][bm][dm][gm][jm][km][bn][cn][en][fn][hn][in][jn][bo][do][io][ko][po][qo][bp][ep][ip][pp][rp][bq][fq][gq][iq][nq][pq][qq][sq][ar][cr][gr][kr][mr][gs][ls]
+;C[move(bi):live(bh) move(bi,black):best ])
diff --git a/regression/golois/GoStar991114-1.sgf b/regression/golois/GoStar991114-1.sgf
new file mode 100644 (file)
index 0000000..f07ed26
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoStar991114-1.gob]ID[GoStar991114-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][fc][cf][of][qf][ng][qh][bi][ci][pi][gj][bk][ck][fk][gk][jk][kl][cm][fm][jm][qm][bn][cn][hn][in][do][eo][go][qo][bp][hp][fq][hq][kq][mq][qq][gr][ir][kr][js]
+AW[jc][nd][pd][rd][pe][mf][pf][lg][pg][hh][oh][gi][oi][cj][ej][hj][nj][pj][qj][dk][hk][kk][dl][rl][dm][km][lm][dn][bo][co][io][jo][ko][cp][dp][bq][cq][iq][jq][er][jr]
+;C[move(ll,black):best ])
diff --git a/regression/golois/GoStar991114-2.sgf b/regression/golois/GoStar991114-2.sgf
new file mode 100644 (file)
index 0000000..5e6fac2
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[GoStar991114-2.gob]ID[GoStar991114-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[eb][cc][fc][fe][ie][cf][hf][of][qf][rf][ng][jh][qh][bi][ci][pi][qi][gj][kj][bk][ck][fk][gk][jk][lk][rk][kl][ml][nl][ol][pl][ql][cm][fm][jm][om][qm][bn][cn][hn][in][pn][ao][do][eo][go][oo][qo][ap][bp][hp][lp][op][fq][hq][kq][mq][pq][qq][gr][ir][kr][js]
+AW[gb][hc][jc][nd][pd][rd][pe][mf][pf][ig][jg][lg][pg][hh][kh][oh][fi][gi][ji][oi][cj][ej][hj][nj][pj][qj][dk][hk][mk][qk][dl][ll][rl][dm][km][lm][mm][nm][rm][dn][jn][ln][nn][on][rn][bo][co][io][jo][ko][mo][ro][cp][dp][rp][bq][cq][iq][jq][rq][er][jr][qr]
+;C[move(lo):kill(ln) ])
diff --git a/regression/golois/Goemate990902-1.sgf b/regression/golois/Goemate990902-1.sgf
new file mode 100644 (file)
index 0000000..a2f155e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-1.gob]ID[Goemate990902-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[eb][gb][lb][qb][cc][dc][hc][ic][kc][mc][qc][ad][dd][nd][od][pd][rd][be][de][ke][af][cf][ef][ff][gf][hf][mf][bg][cg][gg][mg][hh][ih][lh][nh][gi][hi][ji][ki][mi][qi][hj][ij][kj][mj][qj][bk][dk][ek][ik][jk][nk][qk][fl][gl][hl][nl][ql][cm][pm][kn][mn][nn][pn][sn][bo][jo][lo][po][dp][fp][jp][mp][pp][qp][rp][cq][eq][er][hr][ir][jr][gs]
+AW[mb][nb][rb][ec][oc][pc][rc][bd][cd][ed][gd][hd][id][jd][qd][ce][ee][pe][qe][re][df][if][jf][dg][hg][ig][lg][og][qg][bh][ch][dh][fh][gh][jh][oh][ei][ni][oi][ej][fj][nj][pj][gk][hk][kk][lk][mk][pk][il][jl][ll][pl][rl][hm][km][lm][qm][rm][dn][gn][in][qn][eo][fo][qo][ep][hp][lp][np][op][fq][gq][lq][mq][pq][qq][rq][fr][kr][fs][js]
+;C[move(rk,black):best ])
diff --git a/regression/golois/Goemate990902-11.sgf b/regression/golois/Goemate990902-11.sgf
new file mode 100644 (file)
index 0000000..721a37f
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-11.gob]ID[Goemate990902-11.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[db][cc][fc][rc][sc][dd][pd][qd][be][de][qe][af][ef][ff][qf][bg][cg][eh][ph][qh][ci][oj][pj][qj][rj][bk][dk][ok][qk][cl][rl][sl][am][an][jn][ln][nn][on][rn][sn][ao][bo][co][fo][jo][mo][qo][cp][dp][fp][ip][qp][aq][eq][iq][mq][qq][ar][dr][gr][ir][kr][nr][pr][as][cs][es][hs][is][js][ns]
+AW[fb][ob][rb][ec][hc][nc][pc][qc][ed][od][ee][je][oe][pe][bf][cf][df][gf][eg][fg][kg][og][dh][ei][oi][pi][nj][ak][hk][nk][pk][al][bl][fl][gl][il][ml][ol][pl][ql][bm][dm][em][gm][jm][km][rm][cn][fn][in][kn][pn][qn][do][eo][go][ho][io][lo][po][hp][jp][kp][mp][np][hq][jq][lq][oq][hr][jr][lr][mr]
+;C[connected(kg,je) ])
diff --git a/regression/golois/Goemate990902-14.sgf b/regression/golois/Goemate990902-14.sgf
new file mode 100644 (file)
index 0000000..3df1171
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-14.gob]ID[Goemate990902-14.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[da][ea][bb][db][cc][fc][bd][dd][gd][be][de][af][ef][ff][if][jf][bg][cg][ig][mg][ch][hh][lh][mh][ai][ci][gi][ki][mi][si][bj][dj][fj][ij][jj][oj][pj][qj][rj][sj][bk][dk][jk][ok][qk][cl][kl][rl][sl][am][an][jn][ln][nn][on][rn][sn][ao][bo][co][fo][jo][mo][oo][qo][cp][dp][ep][fp][ip][qp][sp][aq][eq][iq][mq][nq][qq][ar][dr][gr][ir][kr][nr][pr][as][cs][es][gs][hs][is][js][ns][os][ps]
+AW[fa][eb][fb][ob][rb][sb][ec][hc][nc][pc][qc][ed][kd][od][rd][sd][ce][ee][ie][je][le][ne][oe][pe][se][bf][cf][df][gf][kf][mf][dg][eg][fg][kg][lg][ng][og][pg][sg][dh][fh][jh][nh][sh][ei][ii][ni][oi][pi][qi][ri][aj][ej][hj][kj][nj][ak][ek][hk][kk][nk][pk][al][bl][fl][gl][il][ll][ml][ol][pl][ql][bm][cm][dm][em][gm][jm][km][rm][cn][fn][in][kn][pn][qn][do][eo][go][ho][io][lo][po][hp][jp][kp][mp][np][op][pp][fq][gq][hq][jq][lq][oq][fr][hr][jr][lr][mr][or][ks][ls][ms]
+;C[move(fs,black):best ])
diff --git a/regression/golois/Goemate990902-15.sgf b/regression/golois/Goemate990902-15.sgf
new file mode 100644 (file)
index 0000000..842674b
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-15.gob]ID[Goemate990902-15.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[da][ea][bb][db][cc][dc][fc][bd][dd][gd][be][de][af][ef][ff][if][jf][bg][cg][ig][mg][ch][hh][lh][mh][ai][ci][gi][ki][mi][si][bj][dj][fj][ij][jj][oj][pj][qj][rj][sj][bk][dk][jk][ok][qk][cl][dl][kl][rl][sl][am][an][jn][ln][nn][on][rn][sn][ao][bo][co][fo][jo][mo][oo][qo][cp][dp][ep][fp][qp][sp][aq][eq][mq][nq][qq][ar][dr][er][kr][nr][pr][qr][as][cs][es][ns][os][ps]
+AW[fa][eb][fb][ob][rb][sb][ec][hc][nc][pc][qc][cd][ed][kd][od][rd][sd][ce][ee][ie][je][le][ne][oe][pe][se][bf][cf][df][gf][kf][mf][dg][eg][fg][kg][lg][ng][og][pg][sg][dh][fh][jh][nh][sh][ei][ii][ni][oi][pi][qi][ri][aj][ej][hj][kj][nj][ak][ek][hk][kk][nk][pk][al][bl][fl][gl][il][ll][ml][ol][pl][ql][bm][cm][dm][em][gm][jm][km][qm][rm][cn][fn][in][kn][pn][qn][do][eo][go][ho][io][lo][po][hp][jp][kp][mp][np][op][pp][fq][gq][hq][jq][lq][oq][pq][fr][hr][jr][lr][mr][or][fs][ks][ls][ms]
+;C[move(sm,black):best move(sm):live(sl) move(sm):live(qp) move(sm):escape(rj) ])
diff --git a/regression/golois/Goemate990902-3.sgf b/regression/golois/Goemate990902-3.sgf
new file mode 100644 (file)
index 0000000..17ef846
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-3.gob]ID[Goemate990902-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ma][eb][gb][lb][qb][cc][dc][fc][hc][ic][kc][mc][qc][ad][dd][ld][nd][od][pd][rd][be][de][fe][he][ke][af][cf][ef][ff][gf][hf][mf][bg][cg][gg][jg][kg][mg][hh][ih][lh][nh][gi][hi][ji][ki][mi][pi][qi][ri][hj][ij][kj][mj][qj][bk][dk][ek][ik][jk][nk][qk][fl][gl][hl][nl][ol][ql][cm][nm][om][pm][hn][kn][mn][nn][pn][sn][bo][ho][io][jo][lo][mo][po][dp][fp][jp][mp][pp][qp][rp][cq][eq][jq][sq][er][hr][ir][jr][mr][rr][es][gs]
+AW[na][mb][nb][rb][ec][oc][pc][rc][bd][cd][ed][fd][gd][hd][id][jd][kd][qd][ce][ee][pe][qe][re][df][if][jf][dg][eg][fg][hg][ig][lg][og][qg][bh][ch][dh][fh][gh][jh][oh][rh][ei][ni][oi][si][ej][fj][nj][oj][pj][sj][gk][hk][kk][lk][mk][pk][il][jl][ll][pl][rl][sl][hm][km][lm][mm][qm][rm][dn][gn][in][jn][on][qn][eo][fo][go][oo][qo][ep][hp][lp][np][op][fq][gq][hq][kq][lq][mq][nq][pq][qq][rq][fr][kr][or][qr][fs][is][js]
+;C[move(im):kill(il) move(gm):kill(gn) move(im):cut(in,gn) ])
diff --git a/regression/golois/Goemate990902-5.sgf b/regression/golois/Goemate990902-5.sgf
new file mode 100644 (file)
index 0000000..e927c89
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-5.gob]ID[Goemate990902-5.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[db][cc][fc][oc][rc][sc][dd][pd][qd][qe][qf][qh][ci][bk][rl][sl][jn][nn][rn][sn][jo][mo][qo][ip][qp][iq][mq][qq][ir][kr][nr][pr][js][ns]
+AW[fb][rb][ec][hc][nc][pc][qc][ed][od][oe][pe][og][ml][ol][ql][km][rm][cn][pn][qn][ho][io][po][hp][jp][kp][mp][np][cq][hq][jq][lq][oq][jr][lr]
+;C[move(ls):escape(ir) ])
diff --git a/regression/golois/Goemate990902-7.sgf b/regression/golois/Goemate990902-7.sgf
new file mode 100644 (file)
index 0000000..6808b62
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990902-7.gob]ID[Goemate990902-7.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[db][cc][fc][rc][sc][dd][pd][qd][qe][qf][qh][ci][bk][rl][sl][jn][nn][on][rn][sn][jo][mo][qo][ip][qp][iq][mq][qq][gr][ir][kr][nr][pr][is][js][ns]
+AW[fb][ob][rb][ec][hc][nc][pc][qc][ed][od][oe][pe][og][pi][ml][ol][ql][km][rm][cn][pn][qn][ho][io][po][hp][jp][kp][mp][np][cq][hq][jq][lq][oq][jr][lr][mr]
+;C[connected(ol,pi) ])
diff --git a/regression/golois/Goemate990903-1.sgf b/regression/golois/Goemate990903-1.sgf
new file mode 100644 (file)
index 0000000..64124e3
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-1.gob]ID[Goemate990903-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[gb][kb][mb][nb][pb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][ef][ff][gf][bg][cg][ci][rj][nk][pk][nl][pl][rl][jm][km][mm][om][sm][ln][rn][sn][co][jo][lo][qo][jp][op][pp][iq][kq][qq][ir][lr][pr][rr][os][ps][qs]
+AW[qb][gc][kc][lc][nc][qc][dd][ed][hd][id][jd][ld][md][nd][pd][ce][ee][ke][pe][df][dg][eg][fg][dh][fh][hh][qh][ei][oi][ri][ik][ol][im][qm][rm][cn][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][ip][kp][lp][np][cq][hq][nq][oq][pq][hr][mr][or][ns]
+;C[connected(ik,hh) ])
diff --git a/regression/golois/Goemate990903-10.sgf b/regression/golois/Goemate990903-10.sgf
new file mode 100644 (file)
index 0000000..9a53700
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-10.gob]ID[Goemate990903-10.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ea][qa][eb][kb][pb][rb][cc][dc][ec][fc][ic][jc][oc][pc][rc][cd][fd][qd][rd][be][bf][ef][ff][gf][hf][if][jf][kf][lf][nf][qf][rf][bg][cg][gg][og][pg][ch][oh][ci][fi][gi][hi][ii][li][ni][pi][si][fj][hj][ij][qj][rj][sj][fk][gk][jk][kk][nk][pk][cl][fl][gl][hl][nl][pl][ql][rl][am][bm][cm][dm][em][gm][jm][km][mm][om][sm][ln][rn][sn][co][fo][go][jo][lo][qo][ep][fp][jp][op][pp][eq][gq][iq][jq][kq][qq][fr][ir][lr][pr][rr][fs][hs][is][os][ps][qs]
+AW[ga][ma][na][fb][hb][lb][ob][gc][hc][kc][lc][nc][sc][dd][ed][gd][hd][id][jd][ld][md][nd][od][pd][sd][ce][ee][fe][ke][pe][qe][re][cf][df][pf][dg][eg][fg][qg][sg][dh][fh][gh][hh][ih][jh][lh][nh][qh][sh][bi][ei][ji][oi][qi][ri][bj][cj][ej][jj][kj][lj][mj][nj][oj][pj][ak][dk][ek][hk][ik][ok][el][il][ol][hm][im][nm][pm][qm][rm][bn][cn][dn][en][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][gp][hp][ip][kp][lp][np][bq][cq][hq][lq][nq][oq][pq][dr][gr][hr][mr][or][gs][ns]
+;C[move(sb,black):best ])
diff --git a/regression/golois/Goemate990903-12.sgf b/regression/golois/Goemate990903-12.sgf
new file mode 100644 (file)
index 0000000..02ba74f
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-12.gob]ID[Goemate990903-12.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ea][qa][eb][kb][pb][rb][bc][cc][dc][ec][fc][ic][jc][oc][pc][rc][cd][fd][qd][rd][ae][be][bf][ef][ff][gf][hf][if][jf][kf][lf][nf][qf][rf][bg][cg][gg][og][pg][ch][oh][ph][ci][di][fi][gi][hi][ii][li][ni][pi][si][fj][hj][ij][qj][rj][sj][ck][fk][gk][jk][kk][nk][pk][cl][fl][gl][hl][jl][ll][nl][pl][ql][rl][am][bm][cm][dm][em][gm][jm][km][mm][om][sm][fn][ln][mn][rn][sn][co][fo][go][jo][lo][qo][ep][fp][jp][op][pp][qp][eq][fq][gq][iq][jq][kq][mq][qq][br][er][fr][ir][kr][lr][pr][rr][ds][es][fs][hs][is][os][ps][qs]
+AW[fa][ga][ma][na][oa][fb][hb][lb][ob][sb][gc][hc][kc][lc][nc][sc][dd][ed][gd][hd][id][jd][ld][md][nd][od][pd][sd][ce][ee][fe][ke][pe][qe][re][af][cf][df][pf][ag][dg][eg][fg][qg][rg][sg][ah][bh][dh][fh][gh][hh][ih][jh][lh][nh][qh][sh][bi][ei][ji][oi][qi][ri][bj][cj][dj][ej][jj][kj][lj][mj][nj][oj][pj][ak][dk][ek][hk][ik][lk][ok][al][el][il][ml][ol][hm][im][nm][pm][qm][rm][bn][cn][dn][en][hn][jn][kn][nn][pn][qn][bo][do][io][ko][mo][oo][po][gp][hp][ip][kp][lp][np][bq][cq][hq][lq][nq][oq][pq][ar][dr][gr][hr][mr][or][cs][gs][ls][ns]
+;C[alive(bc) ])
diff --git a/regression/golois/Goemate990903-3.sgf b/regression/golois/Goemate990903-3.sgf
new file mode 100644 (file)
index 0000000..a582012
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-3.gob]ID[Goemate990903-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qa][gb][kb][mb][nb][pb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][ef][ff][gf][bg][cg][ci][ii][hj][rj][nk][pk][nl][pl][rl][jm][km][mm][om][sm][ln][rn][sn][co][jo][lo][qo][jp][op][pp][iq][kq][qq][ir][lr][pr][rr][os][ps][qs]
+AW[qb][gc][kc][lc][nc][qc][dd][ed][hd][id][jd][ld][md][nd][pd][ce][ee][ke][pe][df][dg][eg][fg][dh][fh][hh][ih][qh][ei][ji][oi][ri][mj][ik][ol][im][qm][rm][cn][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][ip][kp][lp][np][cq][hq][nq][oq][pq][hr][mr][or][ns]
+;C[move(kj):connect(mj,ji) ])
diff --git a/regression/golois/Goemate990903-4.sgf b/regression/golois/Goemate990903-4.sgf
new file mode 100644 (file)
index 0000000..9fdf2c0
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-4.gob]ID[Goemate990903-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qa][gb][kb][mb][nb][pb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][ef][ff][gf][qf][bg][cg][ci][ii][li][hj][ij][rj][kk][nk][pk][nl][pl][rl][jm][km][mm][om][sm][ln][rn][sn][co][jo][lo][qo][jp][op][pp][iq][kq][qq][ir][lr][pr][rr][os][ps][qs]
+AW[qb][gc][kc][lc][nc][qc][dd][ed][hd][id][jd][ld][md][nd][pd][ce][ee][ke][pe][df][pf][dg][eg][fg][dh][fh][hh][ih][jh][qh][ei][ji][oi][ri][kj][lj][mj][ik][ol][im][qm][rm][cn][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][ip][kp][lp][np][cq][hq][nq][oq][pq][hr][mr][or][ns]
+;C[connected(qh,pf) ])
diff --git a/regression/golois/Goemate990903-5.sgf b/regression/golois/Goemate990903-5.sgf
new file mode 100644 (file)
index 0000000..82ea205
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-5.gob]ID[Goemate990903-5.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qa][gb][kb][mb][nb][pb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][ef][ff][gf][qf][bg][cg][og][pg][ci][gi][ii][li][fj][hj][ij][rj][gk][jk][kk][nk][pk][cl][fl][hl][nl][pl][rl][cm][em][jm][km][mm][om][sm][ln][rn][sn][co][fo][go][jo][lo][qo][ep][jp][op][pp][eq][iq][jq][kq][qq][fr][ir][lr][pr][rr][os][ps][qs]
+AW[hb][qb][gc][hc][kc][lc][nc][qc][dd][ed][hd][id][jd][ld][md][nd][pd][ce][ee][ke][pe][qe][df][pf][dg][eg][fg][qg][dh][fh][hh][ih][jh][qh][bi][ei][ji][oi][ri][bj][cj][ej][jj][kj][lj][mj][dk][hk][ik][il][ol][hm][im][qm][rm][bn][cn][dn][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][gp][ip][kp][lp][np][bq][cq][hq][nq][oq][pq][hr][mr][or][ns]
+;C[alive(lp) ])
diff --git a/regression/golois/Goemate990903-6.sgf b/regression/golois/Goemate990903-6.sgf
new file mode 100644 (file)
index 0000000..765f146
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-6.gob]ID[Goemate990903-6.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qa][gb][kb][mb][nb][pb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][ef][ff][gf][qf][bg][cg][og][pg][ci][gi][hi][ii][li][ni][fj][hj][ij][rj][gk][jk][kk][nk][pk][cl][fl][gl][hl][nl][pl][rl][cm][em][jm][km][mm][om][sm][ln][rn][sn][co][fo][go][jo][lo][qo][ep][fp][jp][op][pp][eq][iq][jq][kq][qq][fr][ir][lr][pr][rr][hs][is][os][ps][qs]
+AW[fb][hb][lb][qb][gc][hc][kc][lc][nc][qc][dd][ed][hd][id][jd][ld][md][nd][pd][ce][ee][ke][pe][qe][df][pf][dg][eg][fg][qg][dh][fh][hh][ih][jh][qh][bi][ei][ji][oi][ri][bj][cj][ej][jj][kj][lj][mj][dk][hk][ik][il][ol][hm][im][qm][rm][bn][cn][dn][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][gp][ip][kp][lp][np][bq][cq][hq][lq][nq][oq][pq][dr][gr][hr][mr][or][gs][ns]
+;C[move(nj,black):best ])
diff --git a/regression/golois/Goemate990903-7.sgf b/regression/golois/Goemate990903-7.sgf
new file mode 100644 (file)
index 0000000..d04fc4e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-7.gob]ID[Goemate990903-7.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qa][eb][gb][kb][mb][nb][pb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][ef][ff][gf][hf][qf][bg][cg][og][pg][oh][ci][fi][gi][hi][ii][li][ni][pi][fj][hj][ij][rj][gk][jk][kk][nk][pk][cl][fl][gl][hl][nl][pl][rl][cm][em][jm][km][mm][om][sm][ln][rn][sn][co][fo][go][jo][lo][qo][ep][fp][jp][op][pp][eq][iq][jq][kq][qq][fr][ir][lr][pr][rr][hs][is][os][ps][qs]
+AW[fb][hb][lb][qb][gc][hc][kc][lc][nc][qc][dd][ed][hd][id][jd][ld][md][nd][pd][ce][ee][ke][pe][qe][df][pf][dg][eg][fg][qg][dh][fh][hh][ih][jh][lh][nh][qh][bi][ei][ji][oi][ri][bj][cj][ej][jj][kj][lj][mj][nj][oj][dk][ek][hk][ik][il][ol][hm][im][qm][rm][bn][cn][dn][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][gp][ip][kp][lp][np][bq][cq][hq][lq][nq][oq][pq][dr][gr][hr][mr][or][gs][ns]
+;C[move(ok,black):best ])
diff --git a/regression/golois/Goemate990903-9.sgf b/regression/golois/Goemate990903-9.sgf
new file mode 100644 (file)
index 0000000..5cd85b2
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990903-9.gob]ID[Goemate990903-9.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ea][qa][eb][kb][mb][nb][pb][rb][cc][dc][ec][fc][ic][jc][mc][oc][pc][cd][fd][qd][rd][be][bf][ef][ff][gf][hf][if][jf][kf][lf][nf][qf][rf][bg][cg][gg][og][pg][ch][oh][ci][fi][gi][hi][ii][li][ni][pi][fj][hj][ij][rj][fk][gk][jk][kk][nk][pk][cl][fl][gl][hl][nl][pl][rl][cm][em][gm][jm][km][mm][om][sm][ln][rn][sn][co][fo][go][jo][lo][qo][ep][fp][jp][op][pp][eq][iq][jq][kq][qq][fr][ir][lr][pr][rr][hs][is][os][ps][qs]
+AW[ga][fb][hb][lb][qb][gc][hc][kc][lc][nc][qc][dd][ed][gd][hd][id][jd][ld][md][nd][od][pd][ce][ee][fe][ke][pe][qe][re][cf][df][pf][dg][eg][fg][qg][dh][fh][gh][hh][ih][jh][lh][nh][qh][bi][ei][ji][oi][ri][bj][cj][ej][jj][kj][lj][mj][nj][oj][pj][ak][dk][ek][hk][ik][ok][el][il][ol][hm][im][nm][qm][rm][bn][cn][dn][en][hn][jn][kn][nn][pn][qn][do][io][ko][mo][oo][gp][ip][kp][lp][np][bq][cq][hq][lq][nq][oq][pq][dr][gr][hr][mr][or][gs][ns]
+;C[move(se,black):best ])
diff --git a/regression/golois/Goemate990904-3.sgf b/regression/golois/Goemate990904-3.sgf
new file mode 100644 (file)
index 0000000..ee035d2
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990904-3.gob]ID[Goemate990904-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ha][ja][la][eb][gb][hb][ib][kb][lb][ob][pb][qb][cc][hc][jc][kc][mc][nc][pc][bd][cd][dd][fd][hd][kd][pd][be][de][fe][ge][he][ie][je][oe][pe][qe][af][cf][ef][hf][jf][lf][mf][nf][sf][ag][bg][cg][eg][fg][ig][mg][ng][og][pg][qg][sg][ah][eh][gh][ih][jh][mh][ph][sh][fi][gi][ii][ji][li][mi][ni][oi][pi][ri][dj][ej][gj][kj][mj][oj][qj][rj][pk][sk][ml][nl][pl][om][mn][nn][fo][go][no][ro][so][dp][ep][gp][hp][op][pp][qp][rp][dq][eq][gq][kq][oq][qq][sq][br][dr][fr][hr][jr][kr][nr][or][as][cs][ds][is][ns]
+AW[fa][ga][ma][na][oa][pa][qa][ra][bb][cb][db][fb][mb][rb][ac][bc][dc][ec][fc][gc][lc][qc][rc][ad][ed][gd][ld][nd][qd][sd][ae][ee][ke][le][me][ne][re][df][gf][kf][of][pf][qf][rf][dg][gg][hg][jg][kg][lg][rg][bh][ch][dh][hh][kh][qh][rh][ai][bi][hi][ki][qi][cj][fj][hj][jj][lj][nj][ck][dk][ek][fk][gk][ik][lk][mk][nk][ok][rk][ll][ol][rl][hm][lm][pm][qm][sm][cn][fn][gn][ln][pn][rn][bo][do][eo][ho][io][jo][mo][oo][po][qo][cp][fp][ip][kp][lp][np][bq][cq][iq][jq][mq][nq][cr][ir][mr][ms]
+;C[move(ff):cut(ii,ej) move(ff,black):best ])
diff --git a/regression/golois/Goemate990904-4.sgf b/regression/golois/Goemate990904-4.sgf
new file mode 100644 (file)
index 0000000..7df7760
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990904-4.gob]ID[Goemate990904-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ha][ja][la][eb][gb][hb][ib][kb][lb][ob][pb][qb][cc][hc][jc][kc][mc][nc][pc][bd][cd][dd][fd][hd][kd][pd][be][de][fe][ge][he][ie][je][oe][pe][qe][af][cf][ef][hf][jf][lf][mf][nf][sf][ag][bg][cg][eg][fg][ig][mg][ng][og][pg][qg][sg][ah][eh][gh][ih][jh][lh][mh][ph][sh][fi][gi][ii][ji][li][mi][ni][oi][pi][ri][dj][ej][gj][kj][mj][oj][qj][rj][pk][sk][ml][nl][pl][om][mn][nn][fo][go][no][ro][so][dp][ep][gp][hp][op][pp][qp][rp][dq][eq][gq][kq][oq][qq][sq][br][dr][fr][hr][jr][kr][nr][or][as][cs][ds][is][ns]
+AW[fa][ga][ma][na][oa][pa][qa][ra][bb][cb][db][fb][mb][rb][ac][bc][dc][ec][fc][gc][lc][qc][rc][ad][ed][gd][ld][nd][qd][sd][ae][ee][ke][le][me][ne][re][df][ff][gf][kf][of][pf][qf][rf][dg][gg][hg][jg][kg][lg][rg][bh][ch][dh][hh][kh][qh][rh][ai][bi][hi][ki][qi][cj][fj][hj][jj][lj][nj][ck][dk][ek][fk][gk][ik][lk][mk][nk][ok][rk][ll][ol][rl][hm][lm][pm][qm][sm][cn][fn][gn][ln][pn][rn][bo][do][eo][ho][io][jo][mo][oo][po][qo][cp][fp][ip][kp][lp][np][bq][cq][iq][jq][mq][nq][cr][ir][mr][ms]
+;C[captured(pe) move(se):threatenToLive(sf) move(se):threatenToConnect(qe,sf) ])
diff --git a/regression/golois/Goemate990906-1.sgf b/regression/golois/Goemate990906-1.sgf
new file mode 100644 (file)
index 0000000..df10f1d
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990906-1.gob]ID[Goemate990906-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[jb][lb][pb][rb][cc][hc][kc][nc][cd][od][rd][de][fe][je][me][ne][cf][lf][nf][pf][qf][fg][fh][qh][bi][rj][ck][nk][sk][cl][ml][rl][cm][em][lm][pm][rm][bn][ln][mn][nn][on][qn][co][do][jo][ko][oo][bp][dp][fp][ip][rp][cq][fq][hq][jr][ds]
+AW[mb][lc][qc][ld][pd][ie][le][oe][pe][df][jf][kf][mf][of][cg][dg][mg][ng][og][bh][dh][gh][ci][ei][fi][hi][oi][bj][dj][nj][ek][lk][ok][qk][rk][ql][dm][fm][cn][dn][en][in][jn][kn][eo][ho][lo][no][po][ro][ep][kp][mp][op][qp][eq][lq][nq][pq][qq][rq][fr][gs]
+;C[move(qm):connect(rm,pm) ])
diff --git a/regression/golois/Goemate990906-2.sgf b/regression/golois/Goemate990906-2.sgf
new file mode 100644 (file)
index 0000000..04881b3
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990906-2.gob]ID[Goemate990906-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[jb][lb][pb][rb][cc][hc][kc][nc][cd][od][rd][de][fe][je][me][ne][cf][nf][pf][qf][qh][bi][rj][ck][cl][rl][cm][em][pm][bn][ln][mn][nn][qn][co][do][jo][ko][oo][dp][fp][ip][rp][cq][fq][hq][jr][ds]
+AW[mb][lc][qc][ld][pd][le][oe][pe][df][mf][of][cg][dg][ng][og][bh][dh][gh][ci][ei][oi][dj][ek][lk][ok][qk][dm][fm][cn][dn][en][in][jn][kn][eo][ho][lo][no][po][ro][ep][kp][mp][op][qp][eq][lq][nq][pq][qq][rq][fr][gs]
+;C[move(jg,black):good connected(mf,le) ])
diff --git a/regression/golois/Goemate990907-2.sgf b/regression/golois/Goemate990907-2.sgf
new file mode 100644 (file)
index 0000000..79a97d6
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990907-2.gob]ID[Goemate990907-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ec][hc][qc][qj][qo][dp]
+AW[cc][dd][cf][qh][qq]
+;C[move(qe,black):best ])
diff --git a/regression/golois/Goemate990908-2.sgf b/regression/golois/Goemate990908-2.sgf
new file mode 100644 (file)
index 0000000..b2bc77c
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990908-2.gob]ID[Goemate990908-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ec][qc][fd][pe][dn][co][qo]
+AW[cc][jc][nc][cf][cq][fq]
+;C[move(qj,white):good connected(cf,cc) connected(fq,cq) ])
diff --git a/regression/golois/Goemate990910-1.sgf b/regression/golois/Goemate990910-1.sgf
new file mode 100644 (file)
index 0000000..f86900a
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990910-1.gob]ID[Goemate990910-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][ec][kc][mc][oc][ce][qh][qj][qn][ep][pp][dq][fq][qq]
+AW[hb][gc][ic][qc][fd][hd][qf][ci][cn][gn][cp][qp][cq][iq][lq][oq]
+;C[move(er):live(dq) ])
diff --git a/regression/golois/Goemate990911-1.sgf b/regression/golois/Goemate990911-1.sgf
new file mode 100644 (file)
index 0000000..4c2d30f
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990911-1.gob]ID[Goemate990911-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ob][cc][fc][jc][mc][oc][cd][dd][pd][bf][cf][if][pf][ig][pg][rg][gh][ih][kh][qh][bi][di][fi][ii][pi][cj][qj][rj][fk][gk][pk][cl][el][bm][dm][dn][hn][mn][on][bo][co][do][fo][oo][po][dp][qp][sp][eq][fq][gq][hq][oq][qq][lr][nr][ns]
+AW[oa][qa][pb][bc][qc][bd][be][ce][de][se][df][qf][rf][fg][gg][hg][sg][bh][ch][rh][ci][dj][ej][hj][ij][jj][oj][pj][bk][ck][dk][ok][qk][bl][gl][hl][ql][am][bn][cn][fn][gn][pn][qn][go][qo][ro][cp][fp][hp][ip][np][cq][iq][lq][nq][dr][er][kr][mr]
+;C[move(gi,black):best move(gi):connect(ii,fk) ])
diff --git a/regression/golois/Goemate990911-2.sgf b/regression/golois/Goemate990911-2.sgf
new file mode 100644 (file)
index 0000000..c99a1ec
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990911-2.gob]ID[Goemate990911-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ob][cc][fc][jc][mc][oc][cd][dd][pd][bf][cf][if][pf][ig][pg][rg][gh][ih][kh][qh][bi][di][fi][ii][pi][cj][qj][rj][fk][gk][hk][pk][cl][el][bm][cm][dm][dn][hn][mn][on][bo][co][do][oo][po][ap][dp][gp][qp][sp][aq][eq][fq][gq][hq][oq][qq][ar][lr][nr][ns]
+AW[ma][oa][qa][pb][bc][qc][bd][be][ce][de][se][df][qf][rf][fg][gg][hg][sg][bh][ch][rh][ci][dj][ej][hj][ij][jj][oj][pj][bk][ck][dk][ok][qk][bl][gl][hl][il][ql][am][an][bn][cn][fn][gn][pn][qn][eo][go][qo][ro][bp][cp][fp][hp][ip][np][cq][iq][lq][nq][br][dr][er][kr][mr]
+;C[move(fr,black):best move(fr):kill(er) ])
diff --git a/regression/golois/Goemate990911-3.sgf b/regression/golois/Goemate990911-3.sgf
new file mode 100644 (file)
index 0000000..025fd3e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate990911-3.gob]ID[Goemate990911-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[bb][lb][ob][cc][fc][jc][mc][oc][cd][dd][ed][pd][bf][cf][if][pf][ig][pg][rg][gh][ih][kh][qh][bi][di][fi][ii][ni][oi][pi][cj][qj][rj][fk][gk][hk][ik][nk][pk][cl][el][ml][bm][cm][dm][nm][rm][dn][hn][mn][on][bo][co][do][oo][po][ap][dp][gp][qp][sp][aq][eq][fq][gq][hq][oq][qq][ar][lr][nr][ns]
+AW[la][ma][oa][qa][ab][cb][db][pb][bc][qc][bd][be][ce][de][se][df][qf][rf][fg][gg][hg][sg][bh][ch][rh][ci][ei][dj][ej][hj][ij][jj][oj][pj][bk][ck][dk][jk][ok][qk][bl][gl][hl][il][ol][ql][am][jm][om][an][bn][cn][fn][gn][pn][qn][eo][go][qo][ro][so][bp][cp][fp][hp][ip][np][cq][iq][lq][nq][br][dr][er][kr][mr]
+;C[move(rl):kill(ql) ])
diff --git a/regression/golois/Goemate991106-2.sgf b/regression/golois/Goemate991106-2.sgf
new file mode 100644 (file)
index 0000000..64f45fd
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991106-2.gob]ID[Goemate991106-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ja][ma][na][oa][eb][ib][mb][pb][ac][cc][dc][gc][ic][jc][mc][nc][bd][dd][jd][od][pd][be][ee][fe][he][oe][gf][nf][cg][hg][ig][kg][lg][mg][og][bh][fh][hh][jh][oh][ph][ci][ei][fi][gi][ii][li][oi][qi][cj][jj][lj][fk][jk][kk][qk][fl][hl][jl][ll][ml][rl][em][im][dn][en][fn][gn][hn][in][jn][qn][sn][io][jo][oo][po][qo][ro][bp][ep][gp][jp][op][qp][cq][fq][iq][jq][lq][mq][oq][qq][hr][lr][nr][gs][ks][ls][ms][ns]
+AW[la][pa][jb][kb][nb][ob][ec][kc][lc][oc][pc][qc][ad][ed][gd][hd][id][md][nd][qd][ae][ie][je][ke][af][bf][cf][df][lf][qf][ag][eg][fg][gg][qg][dh][gh][kh][lh][mh][nh][rh][di][hi][ki][ni][ri][dj][fj][gj][hj][nj][pj][qj][rj][bk][ck][dk][ek][ik][ok][ol][sl][cm][dm][gm][hm][km][lm][mm][nm][pm][qm][rm][cn][on][pn][rn][co][eo][fo][go][ho][ko][no][dp][hp][ip][kp][mp][np][hq][kq][nq][br][cr][dr][er][fr][ir][jr][kr]
+;C[move(ge):connect(fe,hg) move(ge,black):best connected(gf,dd) move(ge):cut(he,fe) ])
diff --git a/regression/golois/Goemate991106-3.sgf b/regression/golois/Goemate991106-3.sgf
new file mode 100644 (file)
index 0000000..85dafbc
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991106-3.gob]ID[Goemate991106-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ja][ma][na][oa][eb][ib][mb][pb][ac][cc][dc][gc][ic][jc][mc][nc][bd][dd][fd][jd][od][pd][be][ee][fe][he][oe][gf][hf][nf][cg][hg][ig][kg][lg][mg][og][bh][fh][hh][jh][oh][ph][ci][ei][fi][gi][ii][ji][li][oi][qi][cj][jj][lj][fk][jk][kk][qk][fl][hl][jl][ll][ml][rl][em][im][dn][en][fn][gn][hn][in][jn][qn][sn][do][io][jo][oo][po][qo][ro][bp][ep][gp][jp][op][qp][cq][dq][fq][iq][jq][lq][mq][oq][qq][hr][lr][nr][gs][ks][ls][ms][ns]
+AW[la][pa][jb][kb][nb][ob][ec][kc][lc][oc][pc][qc][ad][ed][gd][hd][id][md][nd][qd][ae][ge][ie][je][ke][af][bf][cf][df][ff][lf][qf][ag][eg][fg][gg][qg][dh][gh][kh][lh][mh][nh][rh][di][hi][ki][ni][ri][dj][fj][gj][hj][nj][pj][qj][rj][bk][ck][dk][ek][ik][ok][ol][sl][cm][dm][gm][hm][km][lm][mm][nm][pm][qm][rm][cn][on][pn][rn][co][eo][fo][go][ho][ko][no][cp][dp][hp][ip][kp][mp][np][hq][kq][nq][br][cr][dr][er][fr][gr][ir][jr][kr]
+;C[move(hk):live(jl) ])
diff --git a/regression/golois/Goemate991106-4.sgf b/regression/golois/Goemate991106-4.sgf
new file mode 100644 (file)
index 0000000..213c0c8
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991106-4.gob]ID[Goemate991106-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ha][ja][sa][bb][eb][gb][ib][rb][ac][bc][cc][dc][gc][ic][jc][bd][dd][fd][jd][kd][ld][od][pd][be][ee][fe][he][oe][gf][hf][nf][cg][hg][ig][kg][lg][mg][og][bh][fh][hh][jh][oh][ph][ci][ei][fi][gi][ii][ji][li][oi][qi][cj][ij][jj][kj][lj][fk][jk][kk][qk][fl][gl][hl][jl][ll][ml][rl][em][im][dn][en][fn][gn][hn][in][jn][qn][sn][do][io][jo][oo][po][qo][ro][bp][ep][gp][jp][op][qp][sp][cq][dq][fq][iq][jq][lq][mq][oq][pq][qq][hr][lr][nr][rr][gs][ks][ls][ms][ns][os]
+AW[la][ra][hb][jb][kb][lb][nb][ob][qb][ec][hc][kc][lc][oc][pc][qc][ad][cd][ed][gd][hd][id][md][nd][qd][ae][ce][ge][ie][je][ke][ne][af][bf][cf][df][ff][lf][qf][ag][eg][fg][gg][qg][dh][gh][kh][lh][mh][nh][rh][di][hi][ki][ni][ri][dj][fj][gj][hj][nj][pj][qj][rj][bk][ck][dk][ek][hk][ik][mk][ok][il][ol][sl][cm][dm][gm][hm][jm][km][lm][mm][nm][pm][qm][rm][cn][on][pn][rn][co][eo][fo][go][ho][ko][no][cp][dp][hp][ip][kp][lp][mp][np][hq][kq][nq][sq][br][cr][dr][er][fr][gr][ir][jr][kr][pr][qr][js]
+;C[move(le):cut(md,ke) move(le,black):best move(le):live(kg) ])
diff --git a/regression/golois/Goemate991109-1.sgf b/regression/golois/Goemate991109-1.sgf
new file mode 100644 (file)
index 0000000..ad608fe
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991109-1.gob]ID[Goemate991109-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][hc][lc][ce][cf][cg][ch][qh][cj][qk][cm][gm][cn][dn][en][ao][bo][eo][fp][ip][dq][eq][fq][hq][qq][er][gr]
+AW[lb][mb][ec][kc][qc][ed][gd][he][df][dg][dh][co][do][fo][go][bp][cp][dp][ep][gp][jp][pp][qp][cq][gq][jq][pq][cr][dr]
+;C[move(ho):capture(go) ])
diff --git a/regression/golois/Goemate991109-3.sgf b/regression/golois/Goemate991109-3.sgf
new file mode 100644 (file)
index 0000000..0f48ce4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991109-3.gob]ID[Goemate991109-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][hc][lc][id][ce][cf][cg][ch][qh][cj][qk][cm][gm][hm][im][cn][dn][en][fn][kn][ao][bo][eo][ho][io][jo][fp][ip][dq][eq][fq][hq][iq][qq][er][fr][gr]
+AW[lb][mb][ec][kc][qc][ed][gd][he][df][qf][dg][dh][jm][gn][hn][in][jn][co][do][fo][go][ko][bp][cp][dp][ep][gp][jp][kp][pp][qp][cq][gq][jq][pq][cr][dr][ir][es]
+;C[move(hr):cut(ko,jn) ])
diff --git a/regression/golois/Goemate991113-1.sgf b/regression/golois/Goemate991113-1.sgf
new file mode 100644 (file)
index 0000000..b887a9b
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991113-1.gob]ID[Goemate991113-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[gb][cc][ic][lc][de][cf][qf][qh][cj][ep][cq][fq][jq][lq]
+AW[ec][nc][qc][ee][he][ef][qj][cl][cn][en][gn][qo][pp][nq]
+;C[move(dh,black):best ])
diff --git a/regression/golois/Goemate991113-4.sgf b/regression/golois/Goemate991113-4.sgf
new file mode 100644 (file)
index 0000000..0294b61
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991113-4.gob]ID[Goemate991113-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[gb][cc][ic][lc][rc][sc][qd][de][cf][qf][ag][cg][dg][qh][cj][ep][cq][fq][jq][lq]
+AW[rb][ec][nc][pc][qc][ee][he][ef][eg][ch][bi][di][qj][cl][cn][en][gn][qo][pp][nq]
+;C[move(dh,black):best move(db,black):bestThan(da) ])
diff --git a/regression/golois/Goemate991113-5.sgf b/regression/golois/Goemate991113-5.sgf
new file mode 100644 (file)
index 0000000..d6efa79
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991113-5.gob]ID[Goemate991113-5.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[da][gb][lb][cc][ic][lc][rc][sc][md][qd][de][cf][mf][qf][ag][cg][dg][dh][lh][qh][mi][ni][pi][cj][lj][lk][nk][em][om][dn][hn][jn][ln][bo][do][go][ho][jo][no][dp][ep][hp][np][op][cq][fq][jq][lq][pq][br][kr][pr][cs]
+AW[mb][rb][ec][nc][pc][qc][ee][he][je][oe][ef][eg][jg][ch][eh][bi][ci][di][ki][li][ri][kj][pj][qj][kk][cl][pl][dm][gm][hm][im][jm][km][pm][bn][cn][en][gn][in][co][fo][qo][bp][pp][bq][mq][nq][oq][qq][ar][lr][mr][qr]
+;C[move(sb,black):best move(sb,black):bestThan(ma) move(sb):kill(pc) ])
diff --git a/regression/golois/Goemate991218-1.sgf b/regression/golois/Goemate991218-1.sgf
new file mode 100644 (file)
index 0000000..1233da3
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Goemate991218-1.gob]ID[Goemate991218-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[eb][fb][cc][fc][hc][qc][ch][qh][qj][fq][hq]
+AW[pb][ec][ic][oc][fd][gd][hd][nd][ee][pp][cq]
+;C[move(hb):connect(hc,fc) move(gc):cut(hc,fc) ])
diff --git a/regression/golois/Handtalk980802.sgf b/regression/golois/Handtalk980802.sgf
new file mode 100644 (file)
index 0000000..23b40f2
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980802.gob]ID[Handtalk980802.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][ec][jc][lc][oc][pc][qc][qd][oe][cf][dk][qk][cl][qm][jp][kp]
+AW[nd][od][pd][ce][pe][bf][df][pg][ch][do][ip][lp][qp][cq][jq][kq][oq]
+;C[connected(ip,jq) ])
diff --git a/regression/golois/Handtalk980803-2.sgf b/regression/golois/Handtalk980803-2.sgf
new file mode 100644 (file)
index 0000000..ec0e7ad
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980803-2.gob]ID[Handtalk980803-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[nb][cc][ec][jc][lc][bd][fd][ee][cf][rf][bg][dg][eg][qg][bh][dh][qh][ai][ci][bj][cj][dj][qj][bk][qm][cp][op][pp][bq][cq][hq][jq][cr][dr][fr][gr]
+AW[pc][ce][fe][ge][qe][re][bf][df][ef][fg][hh][di][ei][ej][ck][dk][ek][bl][ql][rm][bo][co][do][qo][bp][dp][np][qp][dq][fq][mq][oq][pq][er][es]
+;C[connected(fg,hh) move(cg):cut(bf,df) ])
diff --git a/regression/golois/Handtalk980819-1.sgf b/regression/golois/Handtalk980819-1.sgf
new file mode 100644 (file)
index 0000000..5d243af
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980819-1.gob]ID[Handtalk980819-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][ec][jc][ee][bg][qi][cl][bn][io][qo][hp][np][op][gq][qq]
+AW[nd][pd][ce][qe][bf][df][cg][ch][dn][dp][ip][mp][iq][lq][nq][oq][mr]
+;C[move(ho):cut(io,hp) ])
diff --git a/regression/golois/Handtalk980820-1.sgf b/regression/golois/Handtalk980820-1.sgf
new file mode 100644 (file)
index 0000000..5b9b81e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980820-1.gob]ID[Handtalk980820-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][qc][pd][oe][re]
+AW[oc][od][pe][pf][cp][pp]
+;C[move(ne):cut(od,pe) ])
diff --git a/regression/golois/Handtalk980820-2.sgf b/regression/golois/Handtalk980820-2.sgf
new file mode 100644 (file)
index 0000000..bbda274
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980820-2.gob]ID[Handtalk980820-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[pb][cc][hc][qc][dd][pd][oe][re][cf][bg]
+AW[oc][od][ce][de][ne][pe][bf][pf][ch][cp][pp]
+;C[move(cg):cut(ch,bf) ])
diff --git a/regression/golois/Handtalk980820-4.sgf b/regression/golois/Handtalk980820-4.sgf
new file mode 100644 (file)
index 0000000..2f2ccb6
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980820-4.gob]ID[Handtalk980820-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[nb][pb][cc][fc][hc][jc][mc][qc][dd][kd][ld][md][pd][re][bg][qg][di][qi][ck][ok][qk][dl][bm][em][cn][dn][fn][pn][eo][mo][oo][qo][fp][np][eq][gq][iq][fr][gr][jr]
+AW[kc][oc][od][ce][de][ke][le][me][ne][pe][bf][df][of][pf][cg][eg][ch][dh][ei][dj][cm][dm][hm][nm][pm][qm][on][fo][go][io][po][cp][dp][ep][kp][pp][qp][dq][lq][nq][oq][er][es]
+;C[move(hr):live(gr) ])
diff --git a/regression/golois/Handtalk980820-5.sgf b/regression/golois/Handtalk980820-5.sgf
new file mode 100644 (file)
index 0000000..eef008e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980820-5.gob]ID[Handtalk980820-5.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[kb][nb][pb][cc][fc][hc][jc][mc][qc][dd][kd][ld][md][pd][re][bg][qg][di][qi][bj][ck][ok][qk][dl][bm][em][cn][dn][fn][pn][eo][mo][oo][qo][fp][np][eq][gq][iq][fr][gr][jr]
+AW[kc][oc][od][ce][de][ke][le][me][ne][pe][bf][df][of][pf][cg][eg][bh][ch][dh][ei][dj][cm][dm][hm][nm][pm][qm][on][fo][go][io][po][cp][dp][ep][hp][kp][pp][qp][dq][lq][nq][oq][er][es]
+;C[alive(mc) ])
diff --git a/regression/golois/Handtalk980820-6.sgf b/regression/golois/Handtalk980820-6.sgf
new file mode 100644 (file)
index 0000000..41b53a7
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980820-6.gob]ID[Handtalk980820-6.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ka][kb][nb][pb][cc][fc][hc][jc][mc][qc][dd][id][kd][ld][md][pd][fe][ie][je][re][bg][qg][oh][di][qi][bj][ck][mk][ok][qk][bl][dl][bm][em][cn][dn][fn][pn][eo][mo][oo][qo][fp][np][eq][gq][iq][fr][gr][jr]
+AW[kc][oc][od][ce][de][he][ke][le][me][ne][pe][bf][df][gf][if][jf][of][pf][cg][eg][hg][bh][ch][dh][lh][ei][dj][cm][dm][hm][nm][pm][qm][ln][on][fo][go][io][po][cp][dp][ep][hp][kp][pp][qp][dq][lq][nq][oq][er][es][fs]
+;C[connected(lh,le) ])
diff --git a/regression/golois/Handtalk980820-7.sgf b/regression/golois/Handtalk980820-7.sgf
new file mode 100644 (file)
index 0000000..e3b011c
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980820-7.gob]ID[Handtalk980820-7.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[aa][ba][da][fa][ga][ka][bb][cb][hb][kb][nb][ob][pb][bc][cc][ec][fc][gc][hc][jc][mc][qc][ad][bd][dd][ed][fd][hd][id][kd][ld][md][pd][qd][ae][ee][fe][ge][ie][je][re][ff][kf][lf][qf][gg][jg][kg][qg][gh][jh][mh][nh][oh][ph][ai][ii][ji][ki][ni][qi][bj][ij][lj][nj][ck][fk][ik][lk][mk][nk][ok][pk][qk][rk][sk][bl][cl][dl][ll][rl][am][bm][em][jm][km][an][cn][dn][en][fn][in][jn][pn][co][eo][jo][mo][no][oo][qo][ap][fp][jp][np][eq][fq][gq][hq][iq][fr][gr][ir][jr][gs][is]
+AW[ac][kc][oc][cd][nd][od][be][ce][de][he][ke][le][me][ne][pe][qe][af][bf][df][gf][hf][if][jf][mf][of][pf][ag][cg][eg][fg][hg][ig][lg][mg][ng][pg][bh][ch][dh][hh][kh][lh][bi][ci][ei][hi][li][mi][cj][dj][fj][hj][kj][mj][ek][hk][kk][el][fl][il][jl][kl][ml][nl][ol][ql][sl][fm][hm][lm][nm][pm][qm][rm][sm][bn][gn][hn][ln][nn][on][ao][bo][fo][go][io][po][bp][cp][dp][ep][hp][kp][pp][qp][dq][kq][lq][nq][oq][br][dr][er][kr][es][fs][js][ks]
+;C[alive(cc) ])
diff --git a/regression/golois/Handtalk980821-1.sgf b/regression/golois/Handtalk980821-1.sgf
new file mode 100644 (file)
index 0000000..7ee6393
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980821-1.gob]ID[Handtalk980821-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][hc][jc][dd][qp][qq]
+AW[ec][pc][pe][do][po][pp][dq]
+;C[connected(pc,pe) connected(dq,do) ])
diff --git a/regression/golois/Handtalk980821-2.sgf b/regression/golois/Handtalk980821-2.sgf
new file mode 100644 (file)
index 0000000..e13a3a6
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980821-2.gob]ID[Handtalk980821-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][hc][jc][dd][ee][qe][re][pf][qf][og][qh][qm][nn][co][jo][no][dp][ep][ip][np][qp][iq][lq][mq][oq][qq][jr][lr][pr][qr]
+AW[ec][oc][pc][nd][qd][rd][oe][pe][cf][of][ci][ok][qk][mm][nm][cn][on][do][po][qo][bp][cp][fp][hp][kp][pp][rp][dq][eq][kq][pq][nr][or]
+;C[move(rq):capture(qp) move(nq):capture(nr) move(rq):escape(qq) ])
diff --git a/regression/golois/Handtalk980822-3.sgf b/regression/golois/Handtalk980822-3.sgf
new file mode 100644 (file)
index 0000000..59e4faa
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980822-3.gob]ID[Handtalk980822-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[jb][cc][hc][be]
+AW[ec][pd][qp][dq][oq]
+;C[connected(oq,qp) ])
diff --git a/regression/golois/Handtalk980822-4.sgf b/regression/golois/Handtalk980822-4.sgf
new file mode 100644 (file)
index 0000000..b8e00e4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980822-4.gob]ID[Handtalk980822-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[jb][cc][hc][be][qm][rm][po][qo][op][pp][qq][qr][rr][rs]
+AW[ec][nd][pd][qe][co][ro][qp][rp][dq][jq][oq][pq][rq][pr][sr]
+;C[alive(oq) ])
diff --git a/regression/golois/Handtalk980824-1.sgf b/regression/golois/Handtalk980824-1.sgf
new file mode 100644 (file)
index 0000000..e091c2c
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980824-1.gob]ID[Handtalk980824-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ba][ca][da][ja][la][ma][pa][qa][bb][gb][hb][ib][jb][kb][lb][nb][pb][ac][cc][hc][kc][oc][qc][cd][dd][gd][hd][md][nd][od][pd][qd][rd][ce][ge][he][je][me][ne][pe][bf][cf][gf][hf][jf][lf][ag][cg][gg][jg][kg][lg][ng][og][pg][bh][ch][dh][eh][gh][jh][mh][nh][oh][ph][ci][di][ii][mi][ni][si][dj][hj][ij][lj][mj][oj][sj][ak][bk][mk][nk][pk][sk][bl][hl][ml][ol][pl][sl][bm][cm][dm][fm][im][km][om][pm][qm][rm][sm][an][bn][dn][en][fn][jn][ln][mn][nn][qn][rn][bo][ho][io][jo][ko][lo][mo][no][so][cp][fp][hp][jp][np][op][pp][rp][sp][fq][hq][iq][jq][nq][oq][sq][br][er][fr][hr][ir][sr][bs][cs][ds][es][fs][gs][hs][is][js][ks][ls][qs][rs]
+AW[ea][fa][ga][ha][ia][ra][cb][db][fb][mb][qb][rb][sb][dc][ec][fc][gc][ic][jc][lc][mc][nc][rc][sc][bd][ed][fd][id][jd][kd][ld][sd][be][de][ee][fe][ie][le][oe][qe][re][se][df][ff][if][mf][nf][of][pf][qf][rf][dg][eg][fg][hg][ig][mg][qg][ah][fh][hh][lh][qh][sh][ai][bi][ei][gi][hi][ki][li][oi][pi][qi][ri][bj][cj][ej][kj][pj][rj][ck][dk][fk][hk][ik][kk][lk][qk][rk][dl][el][fl][jl][kl][ll][nl][ql][rl][gm][jm][lm][mm][nm][cn][gn][hn][in][on][pn][ao][co][do][eo][fo][go][oo][po][qo][ro][ap][bp][ep][gp][kp][lp][mp][qp][aq][bq][cq][dq][eq][gq][kq][lq][mq][pq][qq][rq][ar][cr][dr][gr][jr][kr][lr][mr][nr][or][pr][rr][as][ms][os][ps]
+;C[captured(jo) ])
diff --git a/regression/golois/Handtalk980826-1.sgf b/regression/golois/Handtalk980826-1.sgf
new file mode 100644 (file)
index 0000000..96ff530
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980826-1.gob]ID[Handtalk980826-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[fa][ga][ha][ja][la][ma][pa][db][eb][ib][jb][nb][qb][rb][cc][dc][jc][kc][lc][mc][nc][cd][od][pd][qd][rd][be][de][fe][me][oe][pe][af][bf][cf][df][mf][nf][of][pf][rf][bg][eg][fg][gg][mg][ng][qg][rg][sg][eh][oh][ph][qh][sh][fi][gi][ii][oi][qi][ri][dj][ej][fj][gj][ij][jj][oj][rj][sj][ek][hk][ik][lk][nk][ok][al][dl][el][il][nl][am][bm][cm][em][im][jm][mm][nm][bn][cn][en][jn][ln][mn][nn][qn][ao][bo][eo][fo][go][mo][no][ap][fp][gp][hp][ip][lp][mp][np][aq][cq][dq][fq][mq][qq][rq][cr][dr][er][fr][ir][jr][kr][lr][mr][nr][or][pr][qr][rr][bs][fs][js][ns]
+AW[na][oa][ra][sa][fb][gb][hb][ob][sb][ec][hc][ic][oc][pc][qc][rc][sc][dd][ed][fd][jd][kd][ld][md][nd][sd][ee][he][le][ne][qe][re][se][ef][lf][qf][sf][ag][cg][dg][hg][lg][ah][bh][ch][dh][fh][gh][hh][mh][nh][bi][di][ei][hi][ji][ki][mi][ni][pi][aj][bj][cj][hj][kj][mj][nj][pj][qj][ak][bk][dk][gk][jk][kk][mk][pk][rk][sk][bl][cl][gl][jl][ll][ml][ol][ql][dm][gm][km][lm][om][qm][dn][fn][gn][hn][kn][on][pn][rn][do][io][jo][ko][lo][oo][bp][cp][dp][ep][kp][op][pp][qp][rp][sp][bq][eq][hq][iq][jq][kq][lq][nq][oq][pq][sq][ar][br][hr][sr][ds][hs][is][os][ps][qs][rs][ss]
+;C[alive(cr) captured(bp) ])
diff --git a/regression/golois/Handtalk980828-2.sgf b/regression/golois/Handtalk980828-2.sgf
new file mode 100644 (file)
index 0000000..94bf746
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980828-2.gob]ID[Handtalk980828-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[fb][cc][gc][hc][mc][oc][dd][ed][fd][od][de][oe][ef][if][of][fg][hg][mg][pg][qg][ch][hh][nh][ph][ei][ni][oi][ri][bj][eq][cr]
+AW[fc][qc][gd][ce][fe][he][ie][me][pe][re][cf][nf][pf][gg][lg][ng][og][gh][ih][mh][oh][hi][pi][pj][dk][rk][pl][dm][qn][cp][pp][oq]
+;C[move(do):cut(cp,dm) ])
diff --git a/regression/golois/Handtalk980828-3.sgf b/regression/golois/Handtalk980828-3.sgf
new file mode 100644 (file)
index 0000000..8a52a8d
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Handtalk980828-3.gob]ID[Handtalk980828-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[fb][cc][gc][hc][mc][oc][dd][ed][fd][od][de][oe][ef][if][of][fg][hg][mg][pg][qg][ch][hh][nh][ph][ei][ni][oi][ri][bj][cl][dl][bn][eq][cr]
+AW[fc][qc][gd][ce][fe][he][ie][me][pe][re][cf][nf][pf][gg][lg][ng][og][gh][ih][mh][oh][bi][hi][pi][cj][pj][dk][rk][pl][dm][qn][do][cp][pp][oq]
+;C[move(bh):cut(bi,cf) ])
diff --git a/regression/golois/Indigo-Golois-991105-1.sgf b/regression/golois/Indigo-Golois-991105-1.sgf
new file mode 100644 (file)
index 0000000..7dab060
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo-Golois-991105-1.gob]ID[Indigo-Golois-991105-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[da][ea][fa][db][nb][bc][cc][ec][fc][gc][jc][lc][cd][ed][gd][hd][be][de][ge][qe][cf][ef][gf][hf][if][kf][cg][dg][hg][kg][qg][gh][hh][ih][jh][bi][ci][gi][mi][si][bj][cj][dj][ej][gj][ij][jj][lj][mj][nj][oj][qj][sj][bk][ck][gk][hk][mk][ok][pk][qk][rk][sk][dl][hl][ml][nl][ql][cm][em][gm][jm][km][gn][ln][qn][do][go][ho][io][jo][ko][lo][no][po][qo][ro][kp][mp][np][rp][bq][cq][eq][fq][gq][hq][iq][lq][mq][qq][fr][kr][lr][qr][sr][gs][rs]
+AW[ga][eb][fb][gb][ib][jb][kb][lb][mb][ob][hc][ic][kc][nc][pc][rc][bd][dd][id][kd][md][qd][ae][ee][fe][he][ie][ke][pe][af][ff][lf][mf][qf][rf][bg][fg][gg][lg][pg][rg][bh][ch][dh][fh][kh][mh][sh][ai][di][ei][fi][hi][ii][ji][ki][oi][pi][qi][ri][fj][hj][kj][pj][rj][dk][ek][fk][ik][kk][el][fl][il][jl][kl][ll][ol][fm][hm][im][lm][mm][om][fn][mn][nn][fo][mo][oo][fp][gp][hp][ip][jp][op][pp][qp][jq][kq][nq][pq][gr][hr][ir][jr][mr][or][pr][ns][qs]
+;C[move(js):threatenToLive(jr) alive(ec) move(gl):connect(gk,gm) move(gl):connect(gk,jm) move(gl):connect(gk,lq) move(gl,black):best move(gl):connect(gm,de) ])
diff --git a/regression/golois/Indigo-Golois-991105-2.sgf b/regression/golois/Indigo-Golois-991105-2.sgf
new file mode 100644 (file)
index 0000000..0800c93
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo-Golois-991105-2.gob]ID[Indigo-Golois-991105-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ea][nb][cc][ec][fc][gc][jc][lc][hd][be][de][ge][qe][cf][ef][gf][hf][cg][hg][qg][gh][bi][ci][gi][bj][cj][dj][ej][gj][qj][bk][ck][hk][rk][dl][ql][cm][em][gm][gn][qn][do][go][ho][io][jo][ko][no][po][qo][ro][kp][np][rp][cq][eq][fq][gq][hq][iq][lq][mq][qq][fr][kr][qr][gs]
+AW[fb][gb][ib][jb][kb][lb][ob][ic][kc][nc][pc][rc][id][kd][qd][ee][fe][he][ie][pe][af][ff][qf][rf][bg][fg][gg][pg][rg][bh][ch][dh][fh][di][ei][fi][oi][qi][ri][fj][pj][dk][ek][fk][el][fl][fm][fn][fo][oo][fp][gp][hp][ip][jp][op][pp][qp][jq][nq][pq][gr][hr][ir][jr][mr][or][pr][ns]
+;C[move(js):cut(mr,jr) ])
diff --git a/regression/golois/Indigo-Golois-991106-1.sgf b/regression/golois/Indigo-Golois-991106-1.sgf
new file mode 100644 (file)
index 0000000..aeed5d5
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo-Golois-991106-1.gob]ID[Indigo-Golois-991106-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ea][bb][nb][cc][ec][fc][gc][jc][lc][gd][hd][be][de][qe][cf][ef][cg][eg][qg][kh][lh][nh][oh][bi][ci][hi][ji][ni][bj][dj][ej][gj][hj][ij][jj][oj][pj][qj][bk][ck][ek][fk][hk][rk][dl][ol][ql][cm][em][gm][im][km][lm][nm][gn][hn][jn][nn][on][qn][do][go][ho][io][jo][ko][no][po][qo][ro][kp][np][rp][bq][cq][eq][fq][gq][hq][iq][lq][mq][qq][fr][kr][qr][fs][gs][is][js][ks]
+AW[fb][gb][ib][jb][kb][lb][ob][ic][kc][nc][pc][rc][id][kd][qd][ee][fe][ge][he][je][pe][ff][if][kf][mf][of][qf][rf][bg][pg][rg][bh][ch][dh][fh][hh][ih][jh][mh][ph][di][ei][fi][ki][li][oi][pi][qi][si][fj][kj][mj][nj][gk][jk][mk][ok][pk][el][fl][gl][hl][il][jl][kl][ll][ml][fm][hm][jm][mm][fn][mn][fo][mo][oo][fp][gp][hp][ip][jp][mp][op][pp][qp][jq][nq][pq][gr][hr][ir][jr][mr][or][pr][hs][ns]
+;C[connected(mh,mf) ])
diff --git a/regression/golois/Indigo-Golois-991106-2.sgf b/regression/golois/Indigo-Golois-991106-2.sgf
new file mode 100644 (file)
index 0000000..2dbf9c8
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo-Golois-991106-2.gob]ID[Indigo-Golois-991106-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[nb][cc][ec][gc][jc][lc][be][de][qe][cf][ef][cg][qg][bi][ci][bj][dj][ej][bk][dl][ql][cm][em][gm][gn][qn][do][go][ho][io][jo][ko][no][po][qo][ro][kp][np][rp][cq][eq][fq][gq][hq][iq][lq][mq][qq][fr][kr][qr]
+AW[gb][ib][jb][kb][lb][ic][kc][nc][pc][rc][id][kd][qd][ee][fe][pe][ff][qf][rf][bg][pg][bh][ch][dh][fh][di][qi][cj][fj][el][fl][fm][fn][fo][oo][fp][gp][hp][ip][jp][op][pp][qp][jq][nq][pq][gr][hr][ir][jr][mr][or][pr][ns]
+;C[move(ei):connect(fl,fh) move(ei):connect(fl,di) ])
diff --git a/regression/golois/Indigo-Golois-991106-3.sgf b/regression/golois/Indigo-Golois-991106-3.sgf
new file mode 100644 (file)
index 0000000..d0f7fbf
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo-Golois-991106-3.gob]ID[Indigo-Golois-991106-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[cc][gc][jc][lc][be][qe][cg][qg][ci][ql][qn][po][rp][cq][eq][gq][iq][lq][oq][qq]
+AW[ib][jb][kb][ic][kc][pc][rc][id][kd][qd][pe][qf][rf][pg][di][qi][jp][pp][qp][jq][jr]
+;C[connected(oq,lq) move(op):connect(qq,oq) ])
diff --git a/regression/golois/Indigo20000718-2.sgf b/regression/golois/Indigo20000718-2.sgf
new file mode 100644 (file)
index 0000000..c85084e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo20000718-2.gob]ID[Indigo20000718-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ia][oa][qa][hb][jb][ob][cc][gc][ic][jc][mc][oc][rc][hd][jd][kd][ld][nd][od][ae][be][ee][fe][ge][ie][ke][le][me][oe][df][ff][lf][nf][qf][ag][cg][eg][hg][mg][bh][dh][rh][bi][ci][di][ei][gi][ni][cj][fj][gj][jj][nj][qj][rj][dk][kk][mk][ok][qk][bl][hl][ll][ml][cm][jm][sm][dn][nn][pn][rn][co][do][eo][po][ro][so][cp][rp][cq][eq][fq][gq][hq][iq][jq][pq][qq][rq][er][fr][gr][hr][jr][lr][nr][or][cs][hs][js]
+AW[pa][bb][db][eb][pb][qb][rb][bc][dc][fc][pc][sc][bd][cd][dd][ed][pd][rd][de][je][pe][hf][if][kf][pf][rf][gg][jg][kg][ng][pg][qg][rg][gh][hh][mh][nh][oh][qh][hi][ji][ki][mi][pi][qi][ri][ij][lj][mj][oj][sj][fk][hk][jk][nk][pk][rk][gl][il][jl][kl][nl][pl][ql][sl][em][gm][lm][mm][nm][pm][rm][bn][fn][in][jn][kn][mn][qn][bo][fo][ho][jo][lo][no][oo][qo][bp][dp][ep][fp][ip][kp][mp][op][pp][qp][bq][dq][kq][lq][nq][br][cr][dr][kr][mr][bs][es]
+;C[move(fs):live(fr) ])
diff --git a/regression/golois/Indigo20000718-3.sgf b/regression/golois/Indigo20000718-3.sgf
new file mode 100644 (file)
index 0000000..88b53e7
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo20000718-3.gob]ID[Indigo20000718-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][qa][hb][ob][cc][gc][ic][jc][mc][oc][rc][od][ae][be][ee][fe][oe][df][ff][qf][ag][cg][eg][mg][bh][dh][rh][bi][ci][ei][ni][cj][fj][nj][qj][rj][dk][kk][mk][ok][qk][hl][ll][ml][cm][jm][sm][nn][pn][rn][po][ro][so][cp][rp][eq][gq][iq][jq][pq][qq][rq][lr][nr][or][js]
+AW[pa][bb][db][eb][pb][qb][rb][bc][dc][fc][pc][sc][bd][cd][dd][ed][pd][rd][de][pe][pf][rf][ng][pg][qg][rg][oh][qh][pi][qi][ri][oj][sj][fk][hk][nk][pk][rk][gl][il][jl][kl][nl][pl][ql][sl][gm][lm][mm][nm][pm][rm][in][jn][kn][mn][qn][ho][jo][lo][no][oo][qo][ip][kp][mp][op][pp][qp][kq][lq][nq][kr][mr]
+;C[move(mj):connect(nj,mk) move(gd):connect(gc,fe) ])
diff --git a/regression/golois/Indigo991107-1.sgf b/regression/golois/Indigo991107-1.sgf
new file mode 100644 (file)
index 0000000..73dac68
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo991107-1.gob]ID[Indigo991107-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ib][jc][pc][id][kd][di][qi][cj][ol][on][jp][op][qp][jq][pq][jr][kr]
+AW[cc][fc][kc][be][cg][ci][qj][ql][qn][np][cq][fq][kq][mq][oq][lr]
+;C[move(oo):cut(op,ol) ])
diff --git a/regression/golois/Indigo991109-4.sgf b/regression/golois/Indigo991109-4.sgf
new file mode 100644 (file)
index 0000000..9836e18
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Indigo991109-4.gob]ID[Indigo991109-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[da][fa][ha][ia][ja][qa][eb][fb][hb][kb][mb][qb][rb][ac][bc][cc][fc][gc][kc][mc][nc][qc][cd][ed][fd][gd][jd][ld][nd][od][qd][rd][ae][ce][ee][ge][ie][je][ke][me][ne][pe][qe][af][cf][df][jf][pf][qf][cg][eg][mg][ng][og][ch][dh][eh][nh][ph][qh][ci][di][ei][ni][oi][bj][dj][oj][qj][rj][sj][dk][qk][bl][dl][ql][am][cm][hm][im][rm][an][bn][cn][gn][hn][in][jn][pn][rn][ao][co][do][fo][ho][mo][oo][so][dp][ep][fp][gp][rp][sp][eq][fq][gq][hq][kq][mq][nq][oq][pq][qq][dr][er][gr][mr][pr][rr][ds][fs][ms]
+AW[ra][sa][ib][sb][hc][jc][sc][ad][bd][hd][id][sd][be][de][fe][he][le][oe][re][bf][ef][ff][gf][hf][if][lf][mf][nf][of][rf][bg][fg][hg][jg][kg][lg][qg][sg][bh][fh][gh][ih][lh][mh][rh][bi][fi][ki][mi][pi][qi][ri][si][cj][ej][gj][lj][nj][pj][ak][bk][ck][ek][fk][mk][ok][pk][cl][el][hl][il][ll][pl][dm][em][fm][gm][jm][km][pm][qm][dn][en][fn][kn][nn][qn][bo][eo][jo][lo][no][qo][ro][ap][bp][cp][hp][ip][jp][lp][mp][np][op][pp][qp][cq][dq][iq][jq][lq][cr][hr][jr][kr][lr][cs][gs][hs][ls]
+;C[move(br):kill(cq) ])
diff --git a/regression/golois/Jimmy990621-1.sgf b/regression/golois/Jimmy990621-1.sgf
new file mode 100644 (file)
index 0000000..f6c17a7
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Jimmy990621-1.gob]ID[Jimmy990621-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[na][bb][db][eb][hb][kb][lb][mb][ob][qb][cc][gc][kc][nc][qc][bd][ed][fd][rd][sd][ge][se][bf][cf][qf][rg][sg][ah][ch][ph][qh][rh][qi][bj][qj][rk][cl][jl][kl][ml][ol][lm][om][pm][qm][bn][dn][hn][kn][ln][bo][fo][go][io][lo][mo][oo][bp][fp][kp][lp][np][op][pp][fq][gq][hq][iq][nq][jr][nr][js][ks][ls][ms]
+AW[fb][ib][jb][bc][fc][hc][jc][lc][mc][oc][pc][gd][hd][id][kd][md][nd][pd][be][ce][de][ee][fe][le][oe][qe][re][af][gf][pf][rf][sf][eg][oh][pi][ri][ij][kk][lk][ok][gl][ll][nl][pl][ql][rl][im][jm][km][mm][rm][nn][on][pn][eo][jo][ko][no][po][qo][cp][ep][gp][hp][ip][jp][mp][qp][bq][eq][jq][kq][lq][mq][pq][fr][gr][kr][mr]
+;C[move(si):live(rh) move(en,black):good move(pr):threatenToLive(nr) ])
diff --git a/regression/golois/Jimmy990711-2.sgf b/regression/golois/Jimmy990711-2.sgf
new file mode 100644 (file)
index 0000000..49ad517
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Jimmy990711-2.gob]ID[Jimmy990711-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ha][bb][gb][ib][jb][ob][cc][dc][ec][fc][hc][qc][ad][bd][id][kd][qd][ae][he][ie][qe][bf][ef][gf][rf][cg][eg][og][qg][rg][ch][eh][ph][mi][pi][bj][oj][pj][nl][om][qm][cn][pn][oo][po][kp][lp]
+AW[fb][bc][gc][lc][cd][dd][ed][fd][gd][hd][pd][be][ce][pe][cf][df][pf][qf][dg][ng][pg][oh][qh][qi][nj][qj][nk][ml][pl][cm][pm][bn][nn][on][qn][ko][qo][cp][jp][mp][op][pp][eq][kq][lq][pq]
+;C[move(ni):cut(qh,pg) move(ni):escape(oj) ])
diff --git a/regression/golois/Jimmy990711-4.sgf b/regression/golois/Jimmy990711-4.sgf
new file mode 100644 (file)
index 0000000..d3106ac
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Jimmy990711-4.gob]ID[Jimmy990711-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ha][bb][gb][ib][jb][ob][cc][dc][ec][fc][hc][mc][nc][qc][ad][bd][id][kd][qd][ae][he][ie][qe][bf][ef][gf][rf][cg][eg][og][qg][rg][ch][eh][mh][ph][mi][ni][oi][pi][bj][oj][pj][pk][nl][om][qm][cn][pn][oo][po][kp][lp]
+AW[fb][mb][bc][gc][lc][cd][dd][ed][fd][gd][hd][ld][pd][be][ce][le][pe][cf][df][pf][qf][dg][mg][ng][pg][nh][oh][qh][rh][qi][nj][qj][nk][ml][pl][cm][pm][bn][nn][on][qn][ko][qo][cp][jp][mp][op][pp][eq][kq][lq][pq]
+;C[connected(mg,le) ])
diff --git a/regression/golois/Jimmy990904-2.sgf b/regression/golois/Jimmy990904-2.sgf
new file mode 100644 (file)
index 0000000..4413953
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Jimmy990904-2.gob]ID[Jimmy990904-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[hc][lc][oc][qc][cg][qh][qq]
+AW[fc][dd][pd][dj][cp][eq][kq]
+;C[move(pc):cut(qc,oc) ])
diff --git a/regression/golois/Jimmy990904-3.sgf b/regression/golois/Jimmy990904-3.sgf
new file mode 100644 (file)
index 0000000..362348e
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Jimmy990904-3.gob]ID[Jimmy990904-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[pb][hc][lc][oc][qc][cg][qh][qq]
+AW[fc][pc][dd][pd][qd][dj][cp][eq][kq]
+;C[move(qb):connect(qc,oc) ])
diff --git a/regression/golois/Jimmy990906-1.sgf b/regression/golois/Jimmy990906-1.sgf
new file mode 100644 (file)
index 0000000..31301d6
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Jimmy990906-1.gob]ID[Jimmy990906-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[gb][nb][pb][hc][nc][qc][ed][gd][pd][he][pe][re][ef][gf][of][bg][fg][ng][ch][eh][gh][oh][oi][bj][pj][qk][cl][el][pl][rl][fm][qm][bn][pn][po][fp][lp][fq][hq][lq][nq][oq][qq][kr][lr][mr][ls]
+AW[hb][ib][lb][fc][gc][jc][oc][dd][fd][ld][nd][od][ee][cf][qf][dg][eg][mg][dh][fh][mh][ph][fi][pi][dj][fj][oj][qj][rj][rk][kn][qn][rn][eo][fo][go][lo][cp][kp][mp][np][eq][kq][mq][fr][gr]
+;C[move(pk,black):best ])
diff --git a/regression/golois/Lanka991113-1.sgf b/regression/golois/Lanka991113-1.sgf
new file mode 100644 (file)
index 0000000..71b5d7c
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Lanka991113-1.gob]ID[Lanka991113-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[gc][hc][jc][kc][qc][id][qe][cf][qg][qi][ij][kj][jk][pk][bl][il][ll][ql][im][jm][km][cn][ln][nn][on][pn][qn][eo][go][io][mo][oo][bp][fp][hp][jp][iq][lq][oq][pq][qq][rq][lr][mr][nr][qr]
+AW[fc][bd][dd][gd][hd][jd][df][eg][mg][ch][ih][ji][jj][lj][nj][pj][qj][ck][kk][mk][ok][kl][ml][nl][ol][mm][om][hn][in][jn][rn][ho][ko][no][qo][gp][lp][mp][np][op][pp][rp][dq][gq][mq][or][pr][rr]
+;C[move(mn,black):best ])
diff --git a/regression/golois/MeilleurCoup0001.sgf b/regression/golois/MeilleurCoup0001.sgf
new file mode 100644 (file)
index 0000000..24b0057
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0001.gob]ID[MeilleurCoup0001.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[ha][ia][ja][bb][gb][ib][cc][ec][fc][ic][cd][dd][ed][fd][jd][ge][je][cf][ff][gf][hf][jf][kf][lf][fg][hg][ig][lg][gh][hh][ih][lh][fi][ii][ki][mi][cj][ij][jj][lj][dk][ek][fk][hk][ik][cl][dl][hl][il][cm]
+AW[ka][ab][jb][bc][gc][hc][jc][kc][bd][gd][hd][id][kd][ae][ce][de][ee][fe][he][ie][ke][le][me][bf][ef][if][mf][cg][eg][jg][kg][mg][eh][fh][mh][bi][gi][hi][bj][dj][ej][fj][gj][hj][bk][ck][gk][bl][el][fl][gl][bm]
+;C[move(lb,black):best move(lb):kill(jb) ])
diff --git a/regression/golois/MeilleurCoup0002.sgf b/regression/golois/MeilleurCoup0002.sgf
new file mode 100644 (file)
index 0000000..d87204a
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0002.gob]ID[MeilleurCoup0002.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[ia][la][eb][hb][jb][kb][ec][gc][hc][jc][ed][gd][hd][id][ae][de][ee][ge][ie][je][af][bf][cf][ef][gf][hf][if][cg][eg][hg][mg][dh][gh][hh][lh][mh][bi][ei][gi][ki][cj][dj][ej][jj][kj][gk][kk][lk][al][hl][ml]
+AW[ea][ga][db][fb][lb][mb][bc][dc][fc][kc][lc][ad][dd][fd][jd][ld][be][ce][fe][ke][le][ff][jf][mf][fg][gg][ig][kg][lg][eh][fh][ih][ai][fi][hi][ii][ji][bj][fj][gj][ij][ak][ck][dk][ek][fk][hk][jk][bl][jl][kl][ll]
+;C[move(bh,black):best move(bh):live(dj) ])
diff --git a/regression/golois/MeilleurCoup0003.sgf b/regression/golois/MeilleurCoup0003.sgf
new file mode 100644 (file)
index 0000000..052f99a
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0003.gob]ID[MeilleurCoup0003.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[ia][la][eb][hb][jb][kb][ec][gc][hc][jc][ed][gd][hd][id][ae][de][ee][ge][ie][je][af][bf][cf][ef][gf][hf][if][cg][eg][hg][mg][ah][dh][gh][hh][lh][mh][bi][ei][gi][ki][cj][dj][ej][jj][kj][gk][kk][lk][al][hl][ml]
+AW[ea][ga][db][fb][lb][mb][bc][dc][fc][kc][lc][ad][dd][fd][jd][ld][be][ce][fe][ke][le][ff][jf][mf][fg][gg][ig][kg][lg][eh][fh][ih][ai][ci][fi][hi][ii][ji][bj][fj][gj][ij][ak][ck][dk][ek][fk][hk][jk][bl][jl][kl][ll]
+;C[move(bh,black):best move(bh):live(bf) ])
diff --git a/regression/golois/MeilleurCoup0004.sgf b/regression/golois/MeilleurCoup0004.sgf
new file mode 100644 (file)
index 0000000..c4cc467
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0004.gob]ID[MeilleurCoup0004.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[ia][ka][la][ma][eb][hb][jb][kb][ec][gc][hc][jc][ed][gd][hd][id][jd][kd][ld][ae][de][ee][ge][ie][je][af][bf][cf][ef][gf][hf][if][cg][eg][hg][mg][ah][bh][dh][gh][hh][lh][mh][bi][gi][ki][jj][kj][gk][kk][lk][al][hl][ml]
+AW[ea][ga][db][fb][lb][mb][bc][dc][fc][kc][lc][mc][ad][dd][fd][md][be][ce][fe][ke][le][ff][jf][lf][mf][fg][gg][ig][kg][lg][eh][fh][ih][ai][ci][di][fi][hi][ii][ji][bj][fj][gj][ij][ak][ck][dk][ek][fk][hk][jk][bl][jl][kl][ll]
+;C[move(ch,black):best move(ch):live(bh) ])
diff --git a/regression/golois/MeilleurCoup0005.sgf b/regression/golois/MeilleurCoup0005.sgf
new file mode 100644 (file)
index 0000000..8d9aa26
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0005.gob]ID[MeilleurCoup0005.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ba][ga][ha][pa][ra][bb][cb][db][gb][ib][jb][kb][pb][rb][bc][cc][gc][jc][oc][pc][rc][bd][ld][nd][rd][ae][le][ne][pe][qe][bf][cf][kf][of][bg][pg][qg][rg][bh][ch][lh][nh][oh][rh][fi][ki][li][ni][ri][cj][fj][nj][qj][ak][bk][dk][ek][fk][mk][nk][pk][cl][gl][kl][ll][ol][ql][am][cm][dm][em][fm][gm][hm][jm][nm][pm][dn][hn][kn][nn][on][co][do][fo][io][ko][mo][ap][fp][ip][jp][mp][pp][aq][bq][cq][fq][jq][lq][mq][nq][cr][ir][jr][bs][cs][ds][es][fs][gs][hs][js]
+AW[ca][da][ea][fa][na][eb][hb][mb][ob][sb][dc][ec][hc][ic][kc][lc][mc][nc][sc][cd][dd][hd][jd][kd][sd][be][ce][ge][ie][ke][re][se][df][lf][mf][rf][dg][jg][kg][lg][ng][og][sg][dh][fh][mh][sh][ai][bi][ci][ei][gi][ii][mi][si][dj][ej][gj][lj][mj][sj][gk][jk][kk][lk][qk][rk][il][jl][sl][bm][im][qm][rm][bn][cn][en][fn][gn][in][jn][pn][sn][ao][bo][eo][go][ho][jo][oo][po][ro][bp][cp][dp][ep][hp][kp][lp][qp][dq][gq][hq][iq][kq][pq][ar][dr][er][fr][gr][hr][kr][lr][nr][or][ls]
+;C[move(el,black):best move(el):live(dk) ])
diff --git a/regression/golois/MeilleurCoup0006.sgf b/regression/golois/MeilleurCoup0006.sgf
new file mode 100644 (file)
index 0000000..6e5d4d1
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0006.gob]ID[MeilleurCoup0006.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[ec][gc][jc][je][bf][cg][ki][cj][dj][ej][hj][lk][hl]
+AW[db][dc][be][ce][le][ig][kg][hi][ii][dk][ek][fk][jk][jl]
+;C[move(gj,black):best ])
diff --git a/regression/golois/MeilleurCoup0007.sgf b/regression/golois/MeilleurCoup0007.sgf
new file mode 100644 (file)
index 0000000..b0b835b
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0007.gob]ID[MeilleurCoup0007.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[fb][gb][hb][ib][cc][fc][jc][cd][ed][fd][hd][jd][de][je][bf][cf][df][ef][if][dg][gg][bh][ch][fh][kh][fi][gi][ii][cj][gj][jj][kj][jk][lk][il]
+AW[cb][db][dc][gc][hc][ic][bd][dd][gd][id][be][ce][ee][fe][ff][bg][cg][eg][fg][hg][eh][gh][hh][ei][fj][bk][ek][gk][hk][ik][kk][cl][jl][kl][ll]
+;C[move(bj,black):best move(bj):live(bh) ])
diff --git a/regression/golois/MeilleurCoup0008.sgf b/regression/golois/MeilleurCoup0008.sgf
new file mode 100644 (file)
index 0000000..ca442fc
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0008.gob]ID[MeilleurCoup0008.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[fb][gb][hb][ib][cc][fc][jc][cd][ed][fd][hd][jd][de][ge][he][je][bf][cf][df][ef][if][dg][gg][bh][ch][fh][jh][kh][di][fi][gi][ii][cj][gj][jj][kj][ck][jk][lk][il]
+AW[cb][db][dc][gc][hc][ic][bd][dd][gd][id][be][ce][ee][fe][ff][bg][cg][eg][fg][hg][eh][gh][hh][ih][ei][hi][bj][fj][ij][bk][ek][gk][hk][ik][kk][cl][dl][jl][kl][ll]
+;C[move(lj,black):best ])
diff --git a/regression/golois/MeilleurCoup0009.sgf b/regression/golois/MeilleurCoup0009.sgf
new file mode 100644 (file)
index 0000000..46d372a
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0009.gob]ID[MeilleurCoup0009.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[fb][gb][hb][ib][fc][jc][ed][fd][hd][jd][ae][de][ge][he][je][bf][cf][df][ef][gf][if][dg][gg][kg][bh][ch][fh][jh][kh][ai][di][fi][gi][ii][li][cj][gj][jj][kj][ck][jk][il][ml]
+AW[cb][db][bc][dc][gc][hc][ic][bd][dd][gd][id][be][ce][ee][fe][ff][bg][cg][eg][fg][hg][ig][jg][eh][gh][hh][ih][bi][ei][hi][bj][fj][ij][lj][bk][ek][gk][hk][ik][kk][mk][cl][dl][jl][kl][ll]
+;C[move(kf,black):best ])
diff --git a/regression/golois/MeilleurCoup0010.sgf b/regression/golois/MeilleurCoup0010.sgf
new file mode 100644 (file)
index 0000000..f71fabc
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup0010.gob]ID[MeilleurCoup0010.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[ea][fa][ga][ha][db][fb][hb][cc][dc][ec][bd][cd][ee][ge][he][bg][cg][eg][gg]
+AW[bb][cb][gb][ib][bc][fc][hc][ad][dd][ed][fd][gd][be][ce]
+;C[move(de,black):best ])
diff --git a/regression/golois/MeilleurCoup990428-1.sgf b/regression/golois/MeilleurCoup990428-1.sgf
new file mode 100644 (file)
index 0000000..8d386a9
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[MeilleurCoup990428-1.gob]ID[MeilleurCoup990428-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[ea][fa][ga][ha][db][fb][hb][cc][dc][ec][bd][cd][ee][ge][he][bg][cg][eg][gg]
+AW[bb][cb][gb][ib][bc][fc][hc][ad][dd][ed][fd][gd][be][ce]
+;C[move(de,black):best ])
diff --git a/regression/golois/Neurogo97-1.sgf b/regression/golois/Neurogo97-1.sgf
new file mode 100644 (file)
index 0000000..98b5263
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Neurogo97-1.gob]ID[Neurogo97-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[cc][ec][gc][bd][be][ge][bf][hf][dh][eh][fh][gh][hh]
+AW[ad][ae][af][ef][ff][bg][cg][dg][eg][gg][hg][ch]
+;C[move(ih):live(hh) move(ih):kill(hh) move(ig):connect(hh,hf) move(ih):cut(hh,hf) move(ih,white):best ])
diff --git a/regression/golois/Neurogo97-3.sgf b/regression/golois/Neurogo97-3.sgf
new file mode 100644 (file)
index 0000000..c8a619b
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Neurogo97-3.gob]ID[Neurogo97-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[eb][cc][gc][hc][bd][ed][be][ee][df][dg]
+AW[gd][hd][ce][ge][bf][cf][cg][eg][gg][dh]
+;C[connected(eg,cg) ])
diff --git a/regression/golois/Prendre990424-1.sgf b/regression/golois/Prendre990424-1.sgf
new file mode 100644 (file)
index 0000000..fe6e89b
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Prendre990424-1.gob]ID[Prendre990424-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[cc]
+AW[cb]
+;C[move(db):capture(cb) ])
diff --git a/regression/golois/Prendre990430-1.sgf b/regression/golois/Prendre990430-1.sgf
new file mode 100644 (file)
index 0000000..68a2e24
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Prendre990430-1.gob]ID[Prendre990430-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[da][ga][db][hb][ib][cc][gc][cd][gd][ce][ee][ge][he][cf][if][cg][gg][ig][ch][dh][gh][hh]
+AW[eb][fb][gb][dc][fc][hc][dd][hd][de][fe][df][ff][gf][hf][dg][fg][hg][eh]
+;C[captured(hc) ])
diff --git a/regression/golois/Prendre990502-1.sgf b/regression/golois/Prendre990502-1.sgf
new file mode 100644 (file)
index 0000000..a122742
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Prendre990502-1.gob]ID[Prendre990502-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[aa][ab][bb][bc][cc][gc][hc][cd][dd][fd][gd][hd][id][be][ce][de][ee][fe][ge][he][ie][bf][ef][ff][if][ag][bg][cg][eg][gg][ig][fh][gh][ei][fi]
+AW[ba][ca][fa][cb][eb][gb][hb][ib][ac][dc][ec][fc][ic][ad][bd][ed][ae][cf][df][gf][hf][dg][hg][ah][bh][ch][dh][eh][hh][ih][bi][di][hi]
+;C[captured(gf) ])
diff --git a/regression/golois/Prendre990630-1.sgf b/regression/golois/Prendre990630-1.sgf
new file mode 100644 (file)
index 0000000..b71cb63
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Prendre990630-1.gob]ID[Prendre990630-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][nb][ob][pb][nc][qc][cd][dd][ed][fd][hd][id][jd][kd][ld][md][qd][be][ge][ie][ke][pe][qe][cf][gf][jf][rf][bg][cg][ig][ng][pg][qg][dh][fh][jh][kh][lh][mh][nh][ph][di][fi][ji][mi][pi][si][bj][ej][kj][qj][rj][bk][dk][ek][qk][sk][al][cl][fl][gl][hl][il][kl][pl][rl][bm][cm][dm][fm][hm][jm][om][qm][cn][en][gn][in][kn][on][qn][rn][do][fo][ko][lo][qo][dp][fp][kp][mp][eq][hq][iq][jq][lq][nq][oq][er][gr][hr][kr][mr][or][bs][cs][ds][fs][hs][ns]
+AW[ja][ma][na][cb][gb][jb][lb][cc][dc][ec][fc][gc][hc][ic][jc][kc][lc][mc][pc][ad][bd][gd][nd][od][pd][le][me][ne][af][bf][kf][mf][nf][of][pf][ag][jg][kg][lg][mg][rg][bh][ch][qh][ai][ci][ei][ki][ni][oi][qi][ri][aj][cj][dj][mj][oj][pj][ck][mk][nk][pk][dl][el][ml][ol][lm][nm][rm][sm][bn][hn][ln][nn][sn][bo][go][ho][io][jo][no][ro][bp][gp][hp][ip][op][pp][rp][aq][cq][dq][fq][gq][pq][qq][br][cr][dr][fr][lr][pr][os][ps]
+;C[move(ah):escape(bh) ])
diff --git a/regression/golois/Vivre990630-2.sgf b/regression/golois/Vivre990630-2.sgf
new file mode 100644 (file)
index 0000000..6c25ffe
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990630-2.gob]ID[Vivre990630-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qc][cd][dd][ed][be][pe][cf][rf][cg][pg][qg][ph][di][pi][ej][qj][dk][qk][pl][rl][cm][qm][en][on][qn][rn][do][dp][fp][kp][mp][eq][lq][oq][mr][or]
+AW[lb][cc][dc][ec][jc][ad][bd][af][bf][rg][qh][oi][qi][ri][dj][oj][pj][ck][pk][ol][nm][rm][sm][nn][sn][eo][no][ro][ep][op][pp][pq][qq][lr][pr]
+;C[move(rj):kill(qk) ])
diff --git a/regression/golois/Vivre990630-3.sgf b/regression/golois/Vivre990630-3.sgf
new file mode 100644 (file)
index 0000000..c3c4502
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990630-3.gob]ID[Vivre990630-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[nb][pb][nc][qc][cd][dd][ed][fd][kd][ld][md][be][ie][ke][pe][cf][gf][jf][rf][cg][ig][ng][pg][qg][dh][fh][jh][kh][lh][mh][nh][ph][di][fi][ji][mi][pi][bj][ej][kj][qj][rj][bk][dk][ek][qk][sk][cl][fl][gl][hl][il][kl][pl][rl][bm][cm][dm][fm][hm][jm][qm][cn][en][in][kn][on][qn][rn][do][fo][qo][dp][fp][kp][mp][eq][hq][jq][lq][oq][er][hr][kr][mr][or][ns]
+AW[gb][lb][cc][dc][ec][fc][hc][jc][lc][mc][pc][ad][bd][gd][nd][od][le][me][ne][af][bf][kf][mf][nf][of][jg][kg][lg][mg][rg][bh][qh][ei][ki][ni][oi][qi][ri][cj][dj][mj][oj][pj][sj][ck][mk][nk][pk][bl][dl][el][ol][gm][nm][rm][sm][bn][hn][ln][nn][sn][bo][go][jo][no][ro][bp][gp][hp][ip][op][pp][rp][cq][gq][pq][qq][br][dr][fr][lr][pr][es][os][ps]
+;C[alive(cq) ])
diff --git a/regression/golois/Vivre990630-4.sgf b/regression/golois/Vivre990630-4.sgf
new file mode 100644 (file)
index 0000000..153eadd
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990630-4.gob]ID[Vivre990630-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ma][na][gb][jb][lb][cc][dc][ec][fc][gc][hc][jc][lc][mc][pc][ad][bd][gd][nd][od][le][me][ne][af][bf][kf][mf][nf][of][jg][kg][lg][mg][rg][bh][qh][ei][ki][ni][oi][qi][ri][cj][dj][mj][oj][pj][ck][mk][nk][pk][bl][dl][el][ol][nm][rm][sm][bn][hn][ln][nn][sn][bo][go][ho][jo][no][ro][bp][gp][hp][ip][op][pp][rp][aq][cq][gq][pq][qq][br][dr][fr][lr][pr][es][os][ps]
+AW[nb][ob][pb][nc][qc][cd][dd][ed][fd][hd][jd][kd][ld][md][be][ge][ie][ke][pe][cf][gf][jf][rf][cg][ig][ng][pg][qg][dh][fh][jh][kh][lh][mh][nh][ph][di][fi][ji][mi][pi][si][bj][ej][kj][qj][rj][bk][dk][ek][qk][sk][cl][fl][gl][hl][il][kl][pl][rl][bm][cm][dm][fm][hm][jm][qm][cn][en][gn][in][kn][on][qn][rn][do][fo][qo][dp][fp][kp][mp][eq][hq][jq][lq][oq][er][hr][kr][mr][or][ns]
+;C[alive(gb) ])
diff --git a/regression/golois/Vivre990706-1.sgf b/regression/golois/Vivre990706-1.sgf
new file mode 100644 (file)
index 0000000..5eceadd
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990706-1.gob]ID[Vivre990706-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][jb][pb][cc][hc][qc][be][pe][qe][re][cg][pg][qg][oh][ph][qi][qj][ol][nm][pm][sm][qn][no][qo][lp][op][pp][qp][rp][sp][fq][gq][iq][rq][cr][er][hr][jr][nr][sr][es][js][ks]
+AW[mb][ob][oc][oe][of][pf][qf][rf][rg][qh][rh][ci][pi][dj][pj][nk][ok][qk][nl][ql][qm][rm][rn][ro][cp][ep][ip][jp][mp][np][eq][jq][kq][lq][nq][oq][pq][qq][dr][kr][mr][rr][ls][rs]
+;C[alive(qc) move(on):threatenToLive(qn) ])
diff --git a/regression/golois/Vivre990706-2.sgf b/regression/golois/Vivre990706-2.sgf
new file mode 100644 (file)
index 0000000..b2a98cd
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990706-2.gob]ID[Vivre990706-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][pa][jb][lb][pb][qb][sb][cc][hc][qc][rc][qd][rd][be][pe][qe][re][se][cg][pg][qg][bh][oh][ph][qi][qj][lk][ll][ol][lm][nm][om][pm][sm][jn][mn][qn][ko][lo][mo][no][qo][lp][op][pp][qp][rp][sp][fq][gq][iq][rq][cr][er][hr][jr][nr][sr][ds][es][js][ks]
+AW[na][ra][mb][ob][rb][oc][pc][sc][pd][oe][of][pf][qf][rf][rg][qh][rh][bi][ci][pi][dj][pj][nk][ok][qk][jl][ml][nl][ql][km][mm][qm][rm][in][kn][ln][on][rn][jo][ro][cp][ep][ip][jp][mp][np][dq][eq][jq][kq][lq][nq][oq][pq][qq][br][dr][kr][mr][rr][ls][rs]
+;C[move(qa):live(rc) ])
diff --git a/regression/golois/Vivre990706-3.sgf b/regression/golois/Vivre990706-3.sgf
new file mode 100644 (file)
index 0000000..a3341d4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990706-3.gob]ID[Vivre990706-3.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][jb][pb][cc][hc][qc][be][pe][qe][re][cg][pg][qg][bh][oh][ph][qi][qj][lk][ll][ol][lm][nm][om][pm][sm][jn][mn][qn][ko][lo][mo][no][qo][lp][op][pp][qp][rp][sp][fq][gq][iq][rq][cr][er][hr][jr][nr][sr][ds][es][js][ks]
+AW[mb][ob][oc][oe][of][pf][qf][rf][rg][qh][rh][bi][ci][pi][dj][pj][nk][ok][qk][jl][ml][nl][ql][km][mm][qm][rm][in][kn][ln][on][rn][jo][ro][cp][ep][ip][jp][mp][np][dq][eq][jq][kq][lq][nq][oq][pq][qq][br][dr][kr][mr][rr][ls][rs]
+;C[alive(qc) ])
diff --git a/regression/golois/Vivre990706-4.sgf b/regression/golois/Vivre990706-4.sgf
new file mode 100644 (file)
index 0000000..9fba53f
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990706-4.gob]ID[Vivre990706-4.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][pa][ab][bb][hb][jb][pb][qb][sb][cc][hc][kc][qc][rc][cd][ed][fd][gd][id][qd][rd][sd][be][ee][pe][qe][re][se][ff][cg][dg][pg][qg][bh][dh][gh][hh][oh][ph][di][gi][hi][ii][qi][ej][fj][hj][qj][ek][gk][lk][fl][hl][il][ll][ol][im][lm][nm][om][pm][sm][cn][dn][fn][gn][mn][qn][fo][ho][ko][lo][mo][no][qo][lp][op][pp][qp][rp][sp][bq][fq][gq][iq][rq][cr][er][hr][jr][nr][sr][bs][ds][es][js][ks]
+AW[da][la][na][ra][cb][gb][kb][mb][ob][rb][dc][ec][fc][lc][oc][pc][dd][pd][de][oe][df][ef][if][of][pf][qf][rf][eg][fg][gg][hg][rg][eh][ih][jh][qh][rh][bi][ci][ei][ji][pi][dj][ij][pj][dk][ik][nk][ok][qk][dl][el][jl][ml][nl][ql][em][jm][km][mm][qm][rm][en][in][kn][ln][on][rn][eo][go][jo][ro][bp][cp][ep][fp][gp][hp][ip][jp][mp][np][dq][eq][jq][kq][lq][nq][oq][pq][qq][br][dr][kr][mr][rr][ls][rs]
+;C[move(gf):live(fd) ])
diff --git a/regression/golois/Vivre990706-5.sgf b/regression/golois/Vivre990706-5.sgf
new file mode 100644 (file)
index 0000000..e2235be
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990706-5.gob]ID[Vivre990706-5.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[oa][jb][pb][cc][hc][qc][be][pe][qe][re][cg][pg][qg][oh][ph][qi][qj][qn][qp][rp][sp][fq][gq][iq][rq][er][hr][jr][es][js]
+AW[mb][ob][oc][oe][of][pf][qf][rf][rg][qh][rh][ci][pi][dj][pj][qk][ql][rn][ro][cp][ep][ip][jp][eq][jq][pq][qq][dr][kr][rr]
+;C[alive(gq) alive(qc) ])
diff --git a/regression/golois/Vivre990710-1.sgf b/regression/golois/Vivre990710-1.sgf
new file mode 100644 (file)
index 0000000..db040a5
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[Vivre990710-1.gob]ID[Vivre990710-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ka][db][hb][jb][kb][lb][mb][cc][dc][ec][hc][mc][nc][oc][pc][qc][rc][cd][gd][hd][id][kd][ld][rd][sd][de][ee][he][ke][me][gf][hf][if][jf][kf][lf][of][jg][og][pg][qg][bh][ch][dh][hh][ih][kh][lh][qh][ci][ei][fi][gi][hi][ki][li][oi][pi][ri][si][bj][kj][pj][dk][ek][fk][jk][kk][lk][mk][ok][il][ll][ml][nl][ol][sl][fm][im][en][in][ln][mn][nn][on][pn][do][ho][ko][no][oo][qo][ro][gp][fq][gq][hq][cr][er][gr][ir][cs][ds][es][gs][is][js]
+AW[da][ga][ha][ia][ja][eb][gb][ib][fc][gc][ic][jc][kc][lc][bd][dd][ed][fd][md][nd][od][pd][qd][be][ce][fe][ne][re][se][df][ff][mf][nf][qf][eg][gg][hg][ig][kg][lg][mg][rg][eh][fh][jh][nh][rh][di][ii][ji][ni][qi][cj][dj][hj][ij][lj][mj][nj][oj][qj][bk][ck][gk][ik][pk][qk][cl][dl][hl][jl][kl][gm][km][lm][mm][nm][om][pm][qm][cn][hn][qn][co][fo][go][po][cp][ep][hp][ip][kp][mp][np][pp][qp][rp][cq][dq][eq][iq][jq][kq][pq][br][dr][jr][lr][bs][fs][ks]
+;C[alive(re) connected(rh,qi) ])
diff --git a/regression/golois/bug96.sgf b/regression/golois/bug96.sgf
new file mode 100644 (file)
index 0000000..abbd2b4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[bug96.gob]ID[bug96.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ba][ga][ha][pa][ra][bb][cb][db][gb][ib][jb][kb][pb][rb][bc][cc][gc][jc][oc][pc][rc][bd][ld][nd][rd][ae][le][ne][pe][qe][bf][cf][kf][of][bg][pg][qg][rg][bh][ch][lh][nh][oh][rh][fi][ki][li][ni][ri][cj][fj][nj][qj][ak][bk][dk][ek][fk][mk][nk][pk][cl][gl][kl][ll][ol][ql][am][cm][dm][em][fm][gm][hm][jm][nm][pm][dn][hn][kn][nn][on][co][do][fo][io][ko][mo][ap][fp][ip][jp][mp][pp][aq][bq][cq][fq][jq][lq][mq][nq][cr][ir][jr][bs][cs][ds][es][fs][gs][hs][js]
+AW[ca][da][ea][fa][na][eb][hb][mb][ob][sb][dc][ec][hc][ic][kc][lc][mc][nc][sc][cd][dd][hd][jd][kd][sd][be][ce][ge][ie][ke][re][se][df][lf][mf][rf][dg][jg][kg][lg][ng][og][sg][dh][fh][mh][sh][ai][bi][ci][ei][gi][ii][mi][si][dj][ej][gj][lj][mj][sj][gk][jk][kk][lk][qk][rk][il][jl][sl][bm][im][qm][rm][bn][cn][en][fn][gn][in][jn][pn][sn][ao][bo][eo][go][ho][jo][oo][po][ro][bp][cp][dp][ep][hp][kp][lp][qp][dq][gq][hq][iq][kq][pq][ar][dr][er][fr][gr][hr][kr][lr][nr][or][ls]
+;C[move(dl,black):best ])
diff --git a/regression/golois/connecter990614-1.sgf b/regression/golois/connecter990614-1.sgf
new file mode 100644 (file)
index 0000000..36dd3a3
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[connecter990614-1.gob]ID[connecter990614-1.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ia][qa][db][fb][ib][jb][pb][rb][bc][ec][hc][pc][qc][fd][rd][sd][be][ce][he][le][qe][re][af][cf][df][ff][gf][jf][lf][dg][fg][ng][eh][fh][kh][lh][oh][qh][ai][ii][ni][aj][fj][ij][nj][pj][sj][ak][bk][hk][jk][nk][ok][pk][qk][rk][sk][al][fl][hl][kl][nl][pl][sl][am][bm][cm][fm][nm][pm][an][cn][dn][kn][ln][mn][nn][on][bo][ko][oo][qo][bp][dp][ip][lp][mp][qp][aq][bq][cq][mq][nq][oq][pq][qq][pr]
+AW[ja][ka][oa][pa][kb][ob][kc][oc][dd][jd][md][de][ee][fe][me][pe][se][ef][mf][nf][pf][qf][rf][sf][bg][cg][eg][mg][sg][ah][dh][mh][ph][rh][bi][di][pi][qi][si][bj][dj][jj][kj][mj][qj][rj][ck][mk][bl][cl][dl][ml][rl][dm][em][gm][hm][im][mm][qm][rm][en][fn][pn][qn][co][do][eo][ho][jo][lo][mo][no][ro][ap][cp][hp][jp][kp][np][rp][dq][eq][iq][kq][lq][rq][ar][br][cr][mr][nr][or][qr][rr]
+;C[move(mi):cut(mj,mh) move(mi,white):bestThan(of) move(mi):cut(pf,mj) ])
diff --git a/regression/golois/connecter990614-2.sgf b/regression/golois/connecter990614-2.sgf
new file mode 100644 (file)
index 0000000..a914a77
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[connecter990614-2.gob]ID[connecter990614-2.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[ia][qa][db][fb][ib][jb][pb][rb][bc][ec][hc][pc][qc][fd][rd][sd][be][ce][he][le][qe][re][af][cf][df][ff][gf][jf][lf][of][dg][fg][ng][eh][fh][kh][lh][oh][qh][ai][ii][ni][aj][fj][ij][nj][pj][sj][ak][bk][hk][jk][nk][ok][pk][qk][rk][sk][al][fl][hl][kl][nl][pl][sl][am][bm][cm][fm][nm][pm][an][cn][dn][kn][ln][mn][nn][on][bo][ko][oo][qo][bp][dp][ip][lp][mp][qp][aq][bq][cq][mq][nq][oq][pq][qq][pr]
+AW[ja][ka][oa][pa][kb][ob][kc][oc][dd][jd][md][de][ee][fe][me][oe][pe][se][ef][mf][nf][pf][qf][rf][sf][bg][cg][eg][mg][sg][ah][dh][mh][ph][rh][bi][di][pi][qi][si][bj][dj][jj][kj][mj][qj][rj][ck][mk][bl][cl][dl][ml][rl][dm][em][gm][hm][im][mm][qm][rm][en][fn][pn][qn][co][do][eo][ho][jo][lo][mo][no][ro][ap][cp][hp][jp][kp][np][rp][dq][eq][iq][kq][lq][rq][ar][br][cr][mr][nr][or][qr][rr]
+;C[move(mi,black):bestThan(og) move(og):connect(ni,ng) ])
diff --git a/regression/golois/knippel.sgf b/regression/golois/knippel.sgf
new file mode 100644 (file)
index 0000000..80d3700
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[knippel.gob]ID[knippel.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[ca][ab][cb][db][eb][hb][ac][bc][cc][dc][hc][ed][ce][ee][he][bf][cf][gf][hf][ag][cg][dg][gg][ig][bh][dh][eh][hh][ei]
+AW[ba][ea][fa][bb][fb][ec][fc][ad][bd][cd][dd][gd][hd][id][ae][be][de][ge][ie][af][df][ef][ff][if][eg][fg][fh][gh][fi][hi]
+;C[captured(cb) move(fe):threatenToConnect(ed,dc) ])
diff --git a/regression/golois/ko990604.sgf b/regression/golois/ko990604.sgf
new file mode 100644 (file)
index 0000000..9ebb2dd
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[ko990604.gob]ID[ko990604.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[ae][de][ie][af][bf][cf][df][hf][if][ag][bg][cg][fg][gg][hg][ah][ch][dh][fh][hh][ih][ai][ci][hi]
+AW[eb][bc][cc][gc][ad][cd][dd][ed][gd][id][be][ce][ee][fe][he][ef][ff][gf][dg][eg][eh][gh][di][ei][fi][gi]
+;C[captured(bg) ])
diff --git a/regression/golois/test.sgf b/regression/golois/test.sgf
new file mode 100644 (file)
index 0000000..bc344e4
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[test.gob]ID[test.gob]BS[0]WS[0]GM[1]FF[3]SZ[13]
+AB[gb][ic][hd][fe][gf][fg][hg]
+AW[lb][lc][dd][jd][ld][le][hf][if][lf][gg][lg][eh][lh][dj][jj][lj][kk][ll]
+;C[move(gh):capture(gg) move(gh):connect(hg,gf) move(gh,black):best move(gh,black):bestThan(ff) move(gh,black):best move(gh,black):good move(gh,black):bestThan(ff) ])
diff --git a/regression/golois/test_prendre.sgf b/regression/golois/test_prendre.sgf
new file mode 100644 (file)
index 0000000..54ababd
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[test_prendre.gob]ID[test_prendre.gob]BS[0]WS[0]GM[1]FF[3]SZ[19]
+AB[qb][oc][pc][pd][rd][oe][pe][qe][re][of][pf][qf]
+AW[qa][nb][ob][pb][mc][nc][qc][rc][nd][od][qd][oi][qi]
+;C[move(rb):connect(pb,qc) ])
diff --git a/regression/golois/web000103.sgf b/regression/golois/web000103.sgf
new file mode 100644 (file)
index 0000000..842e25a
--- /dev/null
@@ -0,0 +1,4 @@
+(;N[web000103.gob]ID[web000103.gob]BS[0]WS[0]GM[1]FF[3]SZ[9]
+AB[fe][cf][ef][cg][eg][eh]
+AW[gc][de][ee][ge][df][ff][fg]
+;C[captured(ge) ])
diff --git a/regression/gunnar.tst b/regression/gunnar.tst
new file mode 100644 (file)
index 0000000..2c69114
--- /dev/null
@@ -0,0 +1,553 @@
+# M19 is a serious blunder.
+loadsgf games/nngs/gnugo-3.3.10-viking4-200210261703.sgf 181
+1 reg_genmove white
+#? [M17]
+
+# D19 is locally worse than both E17 and E18.
+loadsgf games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf 83
+2 restricted_genmove white D19 E18 E17
+#? [E17|E18]
+
+# Just connect at K17. Don't make it difficult.
+loadsgf games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf 157
+3 reg_genmove white
+#? [K17]*
+
+# L17 is horribly overconcentrated
+loadsgf games/nngs/gnugo-3.3.10-rcde05-200210300235.sgf 27
+4 restricted_genmove white L17 O18
+#? [O18]
+
+# G1 is the wrong way to defend G2. Both F2 and K2/K3 are locally better.
+# But what's really urgent is a move around F12.
+# An invasion around R8 would also be big but must wait until the left
+# edge has been settled.
+loadsgf games/nngs/gnugo-3.3.10-rcde05-200210300235.sgf 51
+5 reg_genmove white
+#? [F12]*
+
+# B17 is unreasonable. Locally E16 only move.
+loadsgf games/nngs/gnugo-3.3.11-ccwills-200211031528.sgf 35
+6 restricted_genmove white B17 E16
+#? [E16]
+
+# O14 adds nothing at all to the position.
+loadsgf games/nngs/niko-gnugo-3.3.11-200211201651.sgf 216
+7 restricted_genmove black O14 M19
+#? [M19]
+
+# O13 is completely wasted.
+loadsgf games/nngs/niko-gnugo-3.3.11-200211201651.sgf 222
+8 restricted_genmove black M19 O13
+#? [M19]
+
+# Critical to keep black split up.
+loadsgf games/gunnar/gunnar1.sgf 34
+9 reg_genmove white
+#? [F13]*
+
+# Q15 was supposed to attack either Q14 or Q16 but obviously doesn't work.
+# R12 is probably better than R14 but both get the point.
+loadsgf games/gunnar/gunnar1.sgf 96
+10 reg_genmove white
+#? [R12|R14]
+
+# L8 doesn't suffice for local life.
+loadsgf games/gunnar/gunnar1.sgf 126
+11 reg_genmove white
+#? [K9]
+
+# C13 is nonsense. Just connect with B13.
+loadsgf games/gunnar/gunnar2.sgf 72
+12 reg_genmove white
+#? [B13]
+
+# Q5 is 3 points reverse sente. Q12 is of similar size.
+# E4 is only one point reverse sente.
+loadsgf games/gunnar/gunnar2.sgf 164
+13 reg_genmove white
+#? [Q5|Q12]
+
+# Necessary to block at Q11. O13 is a rather bad idea.
+loadsgf games/gunnar/gunnar2.sgf 168
+14 reg_genmove white
+#? [Q11]*
+
+# O6 is clearly locally better than P6.
+loadsgf games/gunnar/gunnar3.sgf 140
+15 restricted_genmove white O6 P6
+#? [O6]
+
+# T5 is huge. See next test case.
+loadsgf games/gunnar/gunnar3.sgf 190
+16 reg_genmove white
+#? [T5]*
+
+# T6 allows a combination attack. Necessary to fall back.
+loadsgf games/gunnar/gunnar3.sgf 192
+17 reg_genmove white
+#? [S7]*
+
+# Q15 is just swallowed.
+loadsgf games/gunnar/gunnar4.sgf 180
+18 restricted_genmove white P15 Q15
+#? [P15]
+
+# No reason to play ko with L3.
+loadsgf games/gunnar/gunnar4.sgf 198
+19 reg_genmove white
+#? [L4]
+
+# H14 and J14 are blunders.
+loadsgf games/gunnar/gunnar5.sgf 198
+20 reg_genmove black
+#? [F16|K14]
+
+# P17 only helps black and leaves white with bad shape. Locally Q17 is
+# superior. A move around K16 may be even better to start with.
+loadsgf games/nngs/gnugo-3.3.16-rubus-200302281805.sgf 17
+21 restricted_genmove white P17 Q17 K16 K17
+#? [Q17|K16|K17]*
+
+# Same problem as 21 but with slightly different surroundings.
+loadsgf games/nngs/gnugo-3.3.16-rubus-200302281805.sgf 19
+22 restricted_genmove white E17 D17 K16 K17
+#? [D17|K16|K17]*
+
+# Must not play empty triangle at O5. N5 superior local shape.
+loadsgf games/nngs/gnugo-3.3.16-rubus-200302281805.sgf 69
+23 restricted_genmove white O4 O5 N4 N5
+#? [N5]
+
+# L17 and P9 are both -1 point gote. K3 is just a random dame point.
+# See also owl1:300
+loadsgf games/gunnar/gunnar7.sgf
+24 restricted_genmove black L17 K3
+#? [K3]
+25 restricted_genmove black P9 K3
+#? [K3]*
+
+# J2 is not a relevant cutstone and saving it should not be worth a bonus.
+loadsgf games/gunnar/gunnar8.sgf
+26 restricted_genmove black K1 H1 J3 J4 F9
+#? [F9]
+
+# White cannot make two proper eyes but can make life with
+# topologically false eyes. G18 and M19 both live but G18 is
+# slightly bigger. M12 is a well timed double sente move which of
+# course also makes life. F19, G19, K19, and N19 all die.
+# See also owl1:301
+loadsgf games/gunnar/rbm-bobk-200303111815.sgf 159
+27 reg_genmove white
+#? [G18|M12|M19]*
+
+# T9 is maybe okay but it seems to end in ko for the life of one of
+# the white dragons. Anything is better than the game move at N1, but
+# it looks like S9 is the correct move. For the time being we allow
+# also T9, though.
+loadsgf games/nngs/gnugo-3.3.17-joshj-200304172202.sgf 226
+28 reg_genmove white
+#? [S9|T9]
+
+# H5 is the only move. H11 can connect to either of two invincible
+# dragons and is therefore not weak at all.
+loadsgf games/gunnar/gunnar9.sgf 1
+29 reg_genmove white
+#? [H5]*
+
+# F18 should be a better and bigger way to live than B18.
+loadsgf games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf 110
+30 restricted_genmove white F18 B18
+#? [F18]
+
+# F18 is clearly bigger and better shape than E17.
+loadsgf games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf 120
+31 restricted_genmove white F18 E17
+#? [F18]*
+
+# C18 looks like the simplest way to live. There may be other effective
+# moves which should also be accepted.
+loadsgf games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf 124
+32 reg_genmove white
+#? [C18]*
+
+# Important to strengthen the wall at M11. P10 is not so large.
+loadsgf games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf 184
+33 restricted_genmove white M11 P10
+#? [M11]*
+
+# The game move at P7 is worthless. M4 or M5 take the last point.
+loadsgf games/nngs/gnugo-3.3.18-overziel7-200304281000.sgf 234
+34 reg_genmove white
+#? [M4|M5]
+
+# D5 is a ko threat which loses two points. Better let black connect
+# the ko.
+loadsgf games/gunnar/gunnar10.sgf
+35 reg_genmove white
+#? [C7|D7|E7]*
+
+# The break-in code of GNU Go 3.3.21 wants to play J12, H11, or K13.
+# Clearly filling ko at B18 is the only worthwhile move here.
+loadsgf games/gunnar/gunnar11.sgf
+36 reg_genmove white
+#? [B18]
+
+# The game move at S8 was found as a bogus endgame backfilling dame
+# move. 
+loadsgf games/nngs/tommmal-gnugo-3.4-200309021655.sgf 106
+37 restricted_genmove black S8 Q15
+#? [Q15]*
+
+# The semeai can still be won.
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200309081210.sgf 208
+38 reg_genmove black
+#? [M7|N1]*
+
+# Keep the connection to save everything without ko.
+loadsgf games/nngs/gnugo-3.5.1-viking4-200309231039.sgf 123
+39 reg_genmove white
+#? [N4]*
+
+# A14 is huge, determining the entire upper left part of the board.
+# The lower right corner is also critical but much smaller.
+# See also owl1:332.
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf 194
+40 reg_genmove black
+#? [A14]
+
+# 3.5.1 finds an owl attack on H17 at E16 but no defense. The semeai
+# code correctly understands the vitality of D13 for both players and
+# revises the status to critical. However, the attack point is not
+# revised.
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf 142
+41 reg_genmove black
+#? [D13]
+
+# Make seki with B18. The problem for 3.5.1 is that the semeai code is
+# not called since E19 is considered owl alive and B18 owl dead.
+loadsgf games/gunnar/gunnar12.sgf
+42 reg_genmove white
+#? [B19]
+
+# Q19 lets white make seki. T17 dies.
+loadsgf games/nngs/Minori-gnugo-3.5.2gf1-200312161433.sgf 130
+43 reg_genmove black
+#? [R18|S18]*
+
+# T18 still gives seki. T17 dies.
+loadsgf games/nngs/Minori-gnugo-3.5.2gf1-200312161433.sgf 132
+44 reg_genmove black
+#? [T18]*
+
+# The played move here was H13, caused by incorrect delta territory
+# but ultimately by a bug in break_through(). Naturally there is no
+# way for white to break through G13, H14, G15.
+#
+# Original problem solved, but there's a better move than just
+# filling dames at Q7|Q6|J16|J17|E7|N4 /nn
+loadsgf games/nngs/Minori-gnugo-3.5.2gf1-200312161433.sgf 254
+45 reg_genmove black
+#? [K1]
+
+# Don't leave aji around, capture the white stones solidly.
+loadsgf games/nngs/joshj-gnugo-3.5.2gf1-200312171536.sgf 140
+46 restricted_genmove black O11 O9 N10 N9 M9
+#? [O11]*
+
+# F15 is about 6 points plus some reverse followup. A4 is three points
+# reverse sente.
+loadsgf games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf 114
+47 restricted_genmove white F15 A4
+#? [F15]*
+
+# Saving M13 is small compared to stopping a black incursion.
+loadsgf games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf 122
+48 restricted_genmove white M12 P11
+#? [P11]*
+
+# In 3.5.2 the breakin code hallucinates that white A10 would suddenly
+# let black break into the territory around F6.
+loadsgf games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf 164
+49 reg_genmove white
+#? [A10]
+
+# R13 very inefficient.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 132
+50 restricted_genmove white R13 O8
+#? [O8]*
+
+# S7 kills all black stones in the corner. For GNU Go 3.5.4 this seems
+# to be a problem with valuation of the semeai.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 154
+51 reg_genmove white
+#? [S7]
+
+# Regardless whether the dragon is thrashing or critical, Q14 is the
+# most solid move.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 216
+52 reg_genmove white
+#? [Q14]*
+
+# R18 is clearly ineffective.
+# See also connection:111
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 290
+53 reg_genmove white
+#? [S17]
+
+# Playing J4 or F6 inside own territory clearly loses points. In 3.5.9
+# this is caused by some break-in confusion.
+loadsgf games/gunnar/gunnar13.sgf
+54 restricted_genmove white J4 F6 D9
+#? [D9]
+
+# White must find a ko threat. In the choice between C13 and D13, the
+# former has absolutely no followup potential and in this case also
+# happens to lose a point right out.
+#
+# Notice that C1 must be included among the considered moves to
+# provoke generation of ko threats in the first place.
+loadsgf games/gunnar/gunnar14.sgf
+play black B1
+55 restricted_genmove white C13 D13 C1
+#? [D13]
+
+# White must find a ko threat. A11 is neither a ko threat, nor worth a
+# point.
+loadsgf games/gunnar/gunnar15.sgf
+play black R1
+56 reg_genmove white
+#? [P18|E15|O12|N11|T12|T10|S7|T5]
+
+# No territory to contest around J12. Connect ko at Q19 instead.
+loadsgf games/gunnar/gunnar16.sgf
+57 restricted_genmove black J13 J12 H11 J11 K11 Q19
+#? [Q19]
+
+# No territory to contest around J15. Filling ko at Q19 bigger.
+loadsgf games/gunnar/gunnar17.sgf
+58 reg_genmove white
+#? [Q19]
+
+# Do not defend against combination attack inside potential territory
+# unless we have to.
+loadsgf games/gunnar/gunnar18.sgf
+59 reg_genmove black
+#? [P13]
+
+# R10 is clearly bigger than R11.
+loadsgf games/gunnar/gunnar19.sgf
+60 restricted_genmove white R10 R11
+#? [R10]*
+
+# Major endgame tesuji.
+loadsgf games/gunnar/gunnar20.sgf
+61 reg_genmove black
+#? [D8]*
+
+# O19 is both bigger and safer than the played move at G14.
+loadsgf games/kgs/GnuGoCVS-john.sgf 204
+62 reg_genmove white
+#? [O19]*
+
+# Q2 more solid than P1.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 42
+63 restricted_genmove black Q2 P1
+#? [Q2]*
+
+# The game move at M1 is just weird. R2 is locally better than Q2.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 44
+64 restricted_genmove black M1 Q2 R2 M5 R5
+#? [R2|M5|R5]*
+
+# P19 is one point reverse sente. There are many larger moves.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 146
+65 restricted_genmove black P19 Q12 B11 S8
+#? [Q12|B11|S8]*
+
+# A10 was an overplay. Black should capture it and not fall back.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 162
+66 restricted_genmove black B11 B10 B9 A9 A11
+#? [B11]
+
+# O16 severely overvalued and D9 undervalued
+loadsgf games/kgs/dogo-TheGNUGo.sgf 164
+67 restricted_genmove black D9 O16
+#? [D9]*
+
+# Capture on a large scale.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 170
+68 restricted_genmove black F6 D8
+#? [D8]
+
+# Stop the main incursion first.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 178
+69 restricted_genmove black A9 D7
+#? [D7]*
+
+# A13 and A18 live, the game move at D14 dies.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 190
+70 reg_genmove black
+#? [A18|A13]
+
+# D5 huge.
+loadsgf games/kgs/dogo-TheGNUGo.sgf 198
+71 reg_genmove black
+#? [D5]
+
+# P11 is sente but loses one point since white can then play Q7 in
+# sente.
+loadsgf games/kgs/llk-GNU.sgf 228
+72 restricted_genmove black P11 F18
+#? [F18]
+
+# The ko threat was answered. Now take the ko again instead of a small
+# move like M4.
+# See also owl1:376,377.
+loadsgf games/kgs/GNU-ivanho.sgf 182
+73 reg_genmove white
+#? [M19]
+
+# No need to fall down to B14. C14 is effective enough and saves more
+# of the territory.
+loadsgf games/kgs/GNU-ivanho.sgf 210
+74 restricted_genmove white B14 C14
+#? [C14]
+
+# See also connection:120,121.
+loadsgf games/kgs/GNU-higher.sgf 193
+75 reg_genmove white
+#? [M11]*
+
+# R2 can't live. Necessary to find a ko threat.
+loadsgf games/kgs/GNU-HISOKA10.sgf 226
+76 restricted_genmove white P1 R2 G17
+#? [G17]
+
+# G8 is biggest by far.
+loadsgf games/kgs/GNU-marfan.sgf 183
+77 reg_genmove white
+#? [G8]
+
+# N3 is a solid defense. The game move at M5 fails.
+loadsgf games/kgs/GNU-marfan.sgf 221
+78 reg_genmove white
+#? [N3]*
+
+# K12 is clearly more solid than K11.
+loadsgf games/kgs/perler-GNU.sgf 198
+79 restricted_genmove black K11 K12
+#? [K12]
+
+# K15 is clearly more solid than K14.
+loadsgf games/kgs/perler-GNU.sgf 202
+80 restricted_genmove black K14 K15
+#? [K15]*
+
+# C5 is both bigger and leaves less aji than C4.
+loadsgf games/kgs/JMBE-GNU.sgf 198
+81 restricted_genmove black C4 C5
+#? [C5]
+
+# One point bigger to capture at T6 than to connect at T11.
+loadsgf games/kgs/sade-GNU.sgf 253
+82 restricted_genmove black T11 T6
+#? [T6]*
+
+# M10 is clearly better than N10.
+loadsgf games/kgs/sade-GNU.sgf 265
+83 restricted_genmove black M10 N10
+#? [M10]
+
+# P13 is clearly better than O13.
+loadsgf games/kgs/GNU-bassanio.sgf 164
+84 restricted_genmove white P13 O13
+#? [P13]
+
+# T6 can't be defended. R8 is globally too small but locally
+# guaranteed to be better.
+loadsgf games/kgs/ben9992000-GNU.sgf 141
+85 restricted_genmove black T6 R8
+#? [R8]
+
+# B6 unreasonable.
+loadsgf games/kgs/haiku-GNU.sgf 93
+86 restricted_genmove black C8 B6
+#? [C8]
+
+# O5 solves the problem. P4 backfires.
+loadsgf games/kgs/melonhead1-GNU.sgf 127
+87 restricted_genmove black O5 P4 M4 P3 M3 N3 N2 M5 N6
+#? [O5]
+
+# A15 does not solve the atari-atari problem.
+loadsgf games/kgs/melonhead1-GNU.sgf 183
+88 reg_genmove black
+#? [B17]*
+
+# E6 three points reverse sente.
+loadsgf games/kgs/Kuksa-GNU.sgf 178
+89 reg_genmove black
+#? [E6]*
+
+# Black H3 captures the H2 stone with ko. Even if the ko should
+# eventually be lost there's no points to lose in trying.
+loadsgf games/gunnar/gunnar21.sgf
+90 reg_genmove black
+#? [H3]
+
+# Break-in weirdness. P6 does not save the T10 stones.
+loadsgf games/kgs/GNU-roidesnems.sgf 143
+91 restricted_genmove white P6 S4 T4 P5 O5 N5
+#? [S4|T4]*
+
+# B15 cuts off the black stone in the corner. G17 is pointlessly submissive.
+loadsgf games/kgs/GNU-namascae.sgf 102
+92 restricted_genmove white G17 B15
+#? [B15]
+
+# C11 blocks off better than D11.
+loadsgf games/kgs/GNU-namascae.sgf 110
+93 restricted_genmove white C11 D11
+#? [C11]*
+
+# Necessary to protect against J14 cut. L16 and N15 are ineffective.
+loadsgf games/kgs/GNU-namascae.sgf 154
+94 reg_genmove white
+#? [H15|K16]*
+
+# Of course O3 isn't an option.
+loadsgf games/gunnar/gunnar22.sgf
+95 reg_genmove white
+#? [P1|S1]
+
+# Connection intransitivity, connecting at D18 lets the top be cut
+# off. We accept all moves which solve the connection problem.
+loadsgf games/kgs/koketto-GNU.sgf 209
+96 reg_genmove black
+#? [E16|F15|F14|G15|H15]*
+
+# B8 is overvalued by 3.7.8.
+loadsgf games/kgs/GNU-goodluck.sgf 233
+97 restricted_genmove white N16 B8
+#? [N16]*
+
+# F7 is mostly pointless as strategic defense.
+loadsgf games/kgs/GNU-ituyosi2.sgf 243
+98 restricted_genmove white A6 B6 F7
+#? [A6]*
+
+# T2 is found by endgame move generator in 3.7.9 but has no effect.
+loadsgf games/kgs/GNU-ituyosi2.sgf 293
+99 restricted_genmove white T2 C11
+#? [C11]*
+
+# Letting black cut at S6 gives major trouble.
+loadsgf games/kgs/GNU-ituyosi2.sgf 301
+100 reg_genmove white
+#? [S6]*
+
+# T8 wins the semeai, T7 allows black to make seki.
+loadsgf games/kgs/GNU-ituyosi2.sgf 311
+101 reg_genmove white
+#? [T8]*
diff --git a/regression/handtalk.tst b/regression/handtalk.tst
new file mode 100644 (file)
index 0000000..0f3ba0d
--- /dev/null
@@ -0,0 +1,98 @@
+# Not the right moment to start cosmic go at G7 as in the game.
+loadsgf games/handtalk/handtalk12.sgf 17
+1 reg_genmove black
+#? [R12|R13|R14|R8|R7|R6]*
+
+# Correct owl defense at P5 gets in 3.1.31 due to negative shape value
+# -20 (!) by Pattern Shape13.
+loadsgf games/handtalk/handtalk12.sgf 37
+2 reg_genmove black
+#? [P5|Q2|R2]*
+
+# The sagari at F18 (very much liked by 3.1.26-32 influence code) is bad
+# endgame here (as well as in many other situations). Also, defending N7
+# seems more urgent.
+loadsgf games/handtalk/handtalk12.sgf 55
+3 reg_genmove black
+#? [!F18]
+
+# Have to try this ko!
+loadsgf games/handtalk/handtalk12.sgf 91
+4 reg_genmove black
+#? [Q2]*
+
+loadsgf games/handtalk/handtalk13.sgf 79
+5 reg_genmove black
+#? [!P15]
+
+loadsgf games/handtalk/handtalk13.sgf 161
+6 restricted_genmove black E16 G13
+#? [G13]
+
+loadsgf games/handtalk/handtalk21.sgf 14
+7 reg_genmove white
+#? [R4]
+
+loadsgf games/handtalk/handtalk21.sgf 24
+8 reg_genmove white
+#? [!G14]
+
+loadsgf games/handtalk/handtalk21.sgf 46
+9 reg_genmove white
+#? [J17]*
+
+# Other moves possible, but GNU Go should attack the D8 stone
+loadsgf games/handtalk/handtalk23.sgf 26
+10 reg_genmove white
+#? [E9|F8]
+
+# B9 is quite bad here.
+loadsgf games/handtalk/handtalk23.sgf 30
+11 reg_genmove white
+#? [C11|D10]
+
+# The balance of power between J11 and H8 is the issue at the moment.
+# Maybe other moves possible.
+loadsgf games/handtalk/handtalk23.sgf 38
+12 reg_genmove white
+#? [G9|K8|J9|K9]*
+
+loadsgf games/handtalk/handtalk23.sgf 48
+13 reg_genmove white
+#? [!P14]
+
+loadsgf games/handtalk/handtalk23.sgf 80
+14 reg_genmove white
+#? [K4]*
+
+loadsgf games/handtalk/handtalk23.sgf 82
+15 reg_genmove white
+#? [J3]
+
+#CATEGORY=CONNECTION
+loadsgf games/handtalk/handtalk23.sgf 96
+16 reg_genmove white
+#? [J18]*
+
+loadsgf games/handtalk/handtalk23.sgf 162
+17 reg_genmove white
+#? [B4|B6]*
+
+loadsgf games/handtalk/handtalk23.sgf 186
+18 reg_genmove white
+#? [S5]
+
+# GNU Go played J8. Make sure it never forgets to do so!
+loadsgf games/handtalk/handtalk1.sgf 69
+19 reg_genmove black 
+#? [J8]
+
+loadsgf games/handtalk/handtalk2.sgf 79
+20 reg_genmove black 
+#? [N18]
+
+#CATEGORY=BLUNDER
+# (Incorrectly rejected move)
+loadsgf games/handtalk/handtalk2.sgf 137
+21 reg_genmove black 
+#? [R6]
diff --git a/regression/heikki.tst b/regression/heikki.tst
new file mode 100644 (file)
index 0000000..dc95282
--- /dev/null
@@ -0,0 +1,10 @@
+# Gnugo concluded that a group could live in ko,
+# and did not bother defending, taking a large opening 
+# point instead. The group died later.
+
+loadsgf games/heikki/heikki01.sgf 33
+10 reg_genmove black
+#? [M18]
+# It looks to me like white J18 would kill the black stones without ko. /gf
+11 owl_attack L18
+#? [1 J18]
diff --git a/regression/joseki.tst b/regression/joseki.tst
new file mode 100644 (file)
index 0000000..0197bb0
--- /dev/null
@@ -0,0 +1,27 @@
+loadsgf games/joseki01.sgf 29
+10 reg_genmove white
+#? [E16]
+
+loadsgf games/nngs/ccwills-gnugo-3.3.21-200306131816.sgf 15
+20 reg_genmove black
+#? [B4]
+
+loadsgf games/nngs/kit-gnugo-3.3.21-200306181940.sgf 26
+30 reg_genmove black
+#? [F13]*
+
+loadsgf games/nngs/takeda-gnugo-3.3.23-200307302010.sgf 20
+40 reg_genmove black
+#? [Q15]*
+
+loadsgf games/nngs/ccwills-gnugo-3.5.3-200401100810.sgf 11
+50 reg_genmove black
+#? [K16]*
+
+loadsgf games/nngs/tommmal-gnugo-3.5.3-200401140719.sgf 8
+60 reg_genmove black
+#? [Q17]*
+
+loadsgf games/nngs/tommmal-gnugo-3.5.3-200401140719.sgf 20
+70 reg_genmove black
+#? [R5]*
diff --git a/regression/kgs.tst b/regression/kgs.tst
new file mode 100644 (file)
index 0000000..cdc39dd
--- /dev/null
@@ -0,0 +1,363 @@
+loadsgf games/kgs/yagr.sgf 204
+10 reg_genmove black
+#? [A11]*
+
+loadsgf games/kgs/yagr.sgf 206
+20 reg_genmove black
+#? [C10]*
+
+loadsgf games/kgs/yagr2.sgf 65
+30 restricted_genmove black N19 P19 L18 P18 P17 O17
+#? [L18]
+
+loadsgf games/kgs/yagr3.sgf 78
+40 restricted_genmove white A7 A6
+#? [A6]
+
+loadsgf games/kgs/yagr4.sgf 38
+50 reg_genmove black
+#? [D15]*
+
+loadsgf games/kgs/yagr4.sgf 184
+60 restricted_genmove black J4 J8
+#? [J8]
+
+# Given the stage of the game, B2 is huge.
+loadsgf games/kgs/yagr5.sgf 153
+70 reg_genmove white
+#? [B2]
+
+# Black could win the semeai, white must defend
+loadsgf games/kgs/20040507-GnuGoCVS-read.sgf 212
+80 reg_genmove white
+#? [L1|O2|Q1]*
+
+# T8 only move. T7 only gives ko, but the owl code is missing
+# it, because the tactical reading is proposing a bogus lunch
+# defense (the self atari at T12 also results in a ko for the
+# tactical reading routines, but fails in the owl context)
+loadsgf games/kgs/20040507-GnuGoCVS-read.sgf 268
+90 reg_genmove white
+#? [T8]
+
+# Semeai related problem. The status of D3 is revised to ALIVE
+# because black can't win the semeai C3 vs. D3 (both live after
+# B:C4 W:C1). The owl attack at C1 is then discarded, since the
+# dragon isn't critical.
+loadsgf games/kgs/20040516-GoBucks-GnuGoCVS.sgf 242
+100 reg_genmove black
+#? [C1]*
+
+loadsgf games/kgs/20040517-siRNA-GnuGoCVS.sgf 152
+110 reg_genmove black
+#? [G13]
+
+# P18 is in danger now.
+loadsgf games/kgs/20040517-siRNA-GnuGoCVS.sgf 192
+120 reg_genmove black
+#? [S18]*
+
+# White missed, P18 can still be saved.
+loadsgf games/kgs/20040517-siRNA-GnuGoCVS.sgf 198
+130 reg_genmove black
+#? [S18]
+
+# Awful tenuki.
+loadsgf games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf 56
+140 reg_genmove white
+#? [P14|N15|G12]*
+
+# Another tenuki from same fight - lots of cutting points are opportunities
+# for escape.
+loadsgf games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf 64
+150 reg_genmove white
+#? [M14|Q13]*
+
+# Later, ignores a fight and misreads a ladder - anything related to the
+# fight or the ladder is better than the move made in the game.
+loadsgf games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf 94
+160 reg_genmove white
+#? [G12|H8|J7|G7]
+
+# Again the move made in the game doesn't help the fight in the slightest
+# nor resolve the ladder.
+loadsgf games/kgs/2004-04-10-GnuGoCVS-inuyasha34.sgf 96
+170 reg_genmove white
+#? [G12|H8|G7]*
+
+loadsgf games/kgs/geluba-yagr.sgf 164
+180 reg_genmove black
+#? [C4|C3|D3]
+
+# Only way to control damage: sacrifice the three stones at E3
+loadsgf games/kgs/geluba-yagr.sgf 166
+190 reg_genmove black
+#? [C4]*
+
+# Don't kill your own group.
+loadsgf games/kgs/yagr-ituyosi.sgf 160
+200 restricted_genmove white K4 M4 L4
+#? [M4|L4]*
+
+# An "owl attack captures tail" problem
+loadsgf games/kgs/yagr-gab9.2.sgf 158
+210 reg_genmove white
+#? [Q13]*
+
+# Connect the monkey jump instead of running nowhere!
+loadsgf games/kgs/yagr-Sapojnik.sgf 80
+220 reg_genmove white
+#? [T10]*
+
+# Win the semeai!
+loadsgf games/kgs/yagr-Kazik.sgf 149
+230 reg_genmove white
+#? [J12|J11|L10|L9|J19]*
+
+loadsgf games/kgs/yagr-yudeta.sgf 257
+240 reg_genmove white
+#? [B7]
+
+# This should be a different game, but I don't know which one.
+## In the game, GNU Go ran on the first line until the very end :((
+#loadsgf games/kgs/yagr-yudeta.sgf 78
+#250 reg_genmove white
+##? [P1]*
+
+# Huge semeai.
+loadsgf games/kgs/malitourne-yagr.sgf 240
+260 reg_genmove black
+#? [T10|Q11|O11]*
+
+# Same problem as test 250.
+loadsgf games/kgs/yagr-Rayden.sgf 80
+270 restricted_genmove white O1 T1
+#? [T1]*
+
+loadsgf games/kgs/yagr-hasenhirn.sgf 71
+280 reg_genmove white
+#? [G1]*
+
+# A ladder desaster.
+loadsgf games/kgs/yagr-czarny.sgf 16
+290 reg_genmove white
+#? [B2]
+
+loadsgf games/kgs/yagr-czarny.sgf 24
+300 restricted_genmove white H4 H5
+#? [H4]*
+
+# N15 as played in the game is off-topic.
+loadsgf games/kgs/yagr-awf.sgf 191
+310 reg_genmove white
+#? [F11|H10|J15|K12|F19|D18]
+
+# Probably owl cut problem. At least have to try to win the semeai.
+loadsgf games/kgs/yagr-Mythenmetz.sgf 156
+320 reg_genmove white
+#? [K12]*
+
+loadsgf games/kgs/yagr-FKleolio.sgf 211
+330 reg_genmove white
+#? [H1]*
+
+loadsgf games/kgs/yagr-nigiri.sgf 121
+340 restricted_genmove white L2 L4
+#? [L4]
+
+# Not L8
+loadsgf games/kgs/SURARIN-yagr.sgf 218
+350 reg_genmove black
+#? [L7|K7]*
+
+loadsgf games/kgs/yagr-digibier.sgf 218
+360 reg_genmove white
+#? [B18]
+
+loadsgf games/kgs/yagr-justre1.sgf 133
+370 restricted_genmove white H11 G12
+#? [G12]*
+
+# I think P9 as played in the game is ok. /ab
+#loadsgf games/kgs/evand-TheGNUGo.sgf 8
+#380 reg_genmove black
+##? [P8|P12|Q12]
+
+loadsgf games/kgs/evand-TheGNUGo.sgf 10
+390 reg_genmove black
+#? [P8|P7]*
+
+#N12 is really bad
+loadsgf games/kgs/evand-TheGNUGo.sgf 12
+400 reg_genmove black
+#? [P8|P7|Q13]
+
+#cut and fight somewhere
+loadsgf games/kgs/evand-TheGNUGo.sgf 20
+410 reg_genmove black
+#? [O8|O11|P11]*
+
+loadsgf games/kgs/evand-TheGNUGo.sgf 36
+420 owl_attack R14
+#? [0]*
+
+#The M9-O5 exchange is bad
+loadsgf games/kgs/evand-TheGNUGo.sgf 70
+430 reg_genmove black
+#? [K18]
+
+#loadsgf games/kgs/evand-TheGNUGo.sgf 80
+#440 reg_genmove black
+##? [R18]
+
+loadsgf games/kgs/evand-TheGNUGo.sgf 84
+450 reg_genmove black
+#? [L15]
+
+#fight the ko
+loadsgf games/kgs/evand-TheGNUGo.sgf 98
+460 reg_genmove black
+#? [M19]*
+
+loadsgf games/kgs/evand-TheGNUGo.sgf 178
+470 reg_genmove black
+#? [G13]*
+
+#block somehow
+loadsgf games/kgs/evand-TheGNUGo.sgf 190
+480 reg_genmove black
+#? [H9|G9|G8]*
+
+loadsgf games/kgs/evand-TheGNUGo.sgf 242
+490 reg_genmove black
+#? [H13]
+
+loadsgf games/kgs/evand-TheGNUGo.sgf 270
+# Removed P13, too short on liberties to play that.  /pp
+500 reg_genmove black
+#? [O15]
+
+# P8 seems the most reasonable move here.
+loadsgf games/kgs/20040525-fanfan-GnuGoBot.sgf 16
+510 reg_genmove black
+#? [P8]*
+
+# R9 makes life.
+loadsgf games/kgs/20040525-fanfan-GnuGoBot.sgf 34
+520 reg_genmove black
+#? [R9]
+
+# Black has at least the Q6 threat and should fight the ko.
+loadsgf games/kgs/20040525-fanfan-GnuGoBot.sgf 52
+530 reg_genmove black
+#? [P14]
+
+# The game move A8 is funny. A stone at A5 or A11 would maybe
+# have a chance to influence something around.
+loadsgf games/kgs/20040525-fanfan-GnuGoBot.sgf 78
+540 reg_genmove black
+#? [A5|A11]*
+
+# I believe there are better chances to save something with a
+# move like Q2 which threatens to make an eye around Q3.
+loadsgf games/kgs/20040525-fanfan-GnuGoBot.sgf 96
+550 reg_genmove black
+#? [Q2]*
+
+# A classic, should be attempted.
+loadsgf games/kgs/20040525-fanfan-GnuGoBot.sgf 126
+560 reg_genmove black
+#? [B1]*
+
+#E6 is bad
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 21
+570 reg_genmove black
+#? [K17|N16|P9|R15|C4|C15|D16]*
+
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 27
+580 reg_genmove black
+#? [P16]*
+
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 37
+590 reg_genmove black
+#? [P16]*
+
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 51
+600 reg_genmove black
+#? [E15]*
+
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 71
+610 reg_genmove black
+#? [O15|N16]
+
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 73
+620 reg_genmove black
+#? [N16]*
+
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 133
+630 reg_genmove black
+#? [F10|G9]*
+
+#I think B2 is at best ko, and GNU Go fails to continue next move
+#GNU Go 3.7.3 doesn't seem to play this -- a result of Gunnar's
+#experimental code?
+loadsgf games/kgs/20050407-tfujii-GNU.sgf 153
+640 reg_genmove black
+#? [E2]
+
+#G6 is bad.  B4 or D9 is probably best, C3 is at least an improvement
+loadsgf games/kgs/20050408-wrf6041-GNU.sgf 11
+650 reg_genmove black
+#? [B4|D9|C3]*
+
+#something local; N15 is bad
+loadsgf games/kgs/20050408-wrf6041-GNU.sgf 27
+660 reg_genmove black
+#? [H16|J15|C13|E16]*
+
+#M16 is bad
+loadsgf games/kgs/20050408-wrf6041-GNU.sgf 33
+670 reg_genmove black
+#? [J15|C13|B4|C3|H4|S6|S5|G13]*
+
+# D13 clearly best but C12 acceptable. /ab
+loadsgf games/kgs/20050408-GNU-mamassang.sgf 30
+680 reg_genmove white
+#? [D13|C12]*
+
+loadsgf games/kgs/20050408-GNU-mamassang.sgf 34
+690 restricted_genmove white K9 R11
+#? [R11]*
+
+loadsgf games/kgs/20050408-GNU-mamassang.sgf 46
+700 reg_genmove white
+#? [C10|D10|M3|M4|K3|R3]*
+
+loadsgf games/kgs/20050408-GNU-mamassang.sgf 80
+710 reg_genmove white
+#? [B7]*
+
+loadsgf games/kgs/20050408-GNU-mamassang.sgf 160
+720 reg_genmove white
+#? [A15]
+
+# This requires knowledge that we have no ko threats. Tough to solve, but
+# important. /ab
+loadsgf games/kgs/20050408-janine-GNU.sgf 16
+730 reg_genmove black
+#? [R16]*
+
+loadsgf games/kgs/20050408-janine-GNU.sgf 28
+740 restricted_genmove black F3 F4
+#? [F4]*
+
+#H6 should at least get the J6-5 stones out
+loadsgf games/kgs/20050408-janine-GNU.sgf 90
+750 reg_genmove black
+#? [H6|K7]*
+
+#W S10 is big
+loadsgf games/kgs/20050408-janine-GNU.sgf 230
+760 reg_genmove black
+#? [S10|R10]*
+
diff --git a/regression/lazarus.tst b/regression/lazarus.tst
new file mode 100644 (file)
index 0000000..f35ad33
--- /dev/null
@@ -0,0 +1,74 @@
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 28
+1 reg_genmove black
+#? [L3]*
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 38
+2 reg_genmove black
+#? [M4]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 48
+3 reg_genmove black
+#? [Q8|P8]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 66
+4 reg_genmove black
+#? [R12|Q12|M8]
+
+# M8 is better than the game move but R13 seems best
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 70
+5 reg_genmove black
+#? [R13]*
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 96
+6 reg_genmove black
+#? [H3]*
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 114
+7 reg_genmove black
+#? [T5]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 164
+8 reg_genmove black
+#? [D8]*
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 216
+9 reg_genmove black
+#? [D15|F15]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 258
+10 reg_genmove black
+#? [N16|P16|O17]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 262
+11 reg_genmove black
+#? [S15]*
+
+# Semeai problem
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 268
+12 reg_genmove black
+#? [T18]*
+
+# gf Added L9 which looks no worse than M8. (3.3.17)
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 74
+13 reg_genmove black
+#? [R13|M8|L9]
+
+# Q15 is locally much more solid than R19, but at least T5 and H5 may
+# also be considered. 
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 102
+14 reg_genmove black
+#? [Q15|T5|H5]
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 108
+15 reg_genmove black
+#? [Q15|T5|H5|H3]
+
+# Locally, L16 is better than L17.
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 192
+16 restricted_genmove black L17 L16
+#? [L16]*
+
+# Killing the upper right is way bigger than saving the lower left.
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 254
+17 reg_genmove black
+#? [T8]
diff --git a/regression/ld_owl.tst b/regression/ld_owl.tst
new file mode 100644 (file)
index 0000000..9e043c2
--- /dev/null
@@ -0,0 +1,509 @@
+# Life and death test problems.
+loadsgf games/life_and_death/ld1.sgf
+1 dragon_status B18
+#? [critical (A15|A18) (A15|A18)]
+2 dragon_status S18
+#? [critical (T18|O18) T18]
+3 dragon_status S2
+#? [critical S1 (S1|S7)]
+4 dragon_status B2
+#? [critical (A2|F2) (A2|F2|C1)]
+
+loadsgf games/life_and_death/ld2.sgf
+5 dragon_status B18
+#? [critical (B19|E19) (B19|E19|F18|F19)]
+6 dragon_status S18
+#? [dead]
+7 dragon_status S2
+#? [dead]
+8 dragon_status B2
+#? [critical A2 (A2|A5|B6|A6)]
+
+loadsgf games/life_and_death/ld3.sgf
+9 dragon_status B18
+#? [critical A14 (A17|A14|B13|A13)]
+10 dragon_status S18
+#? [critical T15 (T15|S14|T14)]
+11 dragon_status S2
+#? [critical (S6|T6|T7|T2) S6]
+# Attacking on F1 only gives a ko, which is a failure.
+12 dragon_status B2
+#? [critical B1 (E1|E2|B1|F1)]
+
+loadsgf games/life_and_death/ld4.sgf
+13 dragon_status B18
+#? [dead]
+14 dragon_status S18
+#? [critical P18 (P18|R19)]
+15 dragon_status S2
+#? [critical T5 (S5|T6|T5)]
+16 dragon_status B2
+#? [critical A2 (B5|A6|A5|A2)]
+
+loadsgf games/life_and_death/ld5.sgf
+17 dragon_status B18
+#? [critical A14 (A14|B17|A17|A18)]
+18 dragon_status S18
+#? [critical T17 (S17|T17|T18)]
+19 dragon_status S2
+#? [critical (S3|T5) (S3|T5)]
+20 dragon_status B2
+#? [critical (B3|A2|A6) (A2|A4|B3)]
+
+loadsgf games/life_and_death/ld6.sgf
+21 dragon_status B18
+#? [critical (A14|A17|B19) A17]
+22 dragon_status S18
+#? [critical T18 (T18|R18|R19|Q19)]
+23 dragon_status S2
+#? [dead]
+24 dragon_status B2
+#? [critical F1 (F1|D2|D1|B1)]
+
+loadsgf games/life_and_death/ld7.sgf
+25 dragon_status B18
+#? [dead]
+26 dragon_status S18
+#? [alive]
+27 dragon_status S2
+#? [critical (Q2|T2|N2) Q1]
+28 dragon_status B2
+#? [alive]
+
+loadsgf games/life_and_death/ld8.sgf
+29 dragon_status B16
+#? [critical C18 (C18|B18|D18)]
+30 dragon_status S18
+#? [critical Q18 (Q18|S19|R19|S14)]
+31 dragon_status S4
+#? [alive]
+32 dragon_status B2
+#? [critical (C1|A5|A2) (A5|C1|A2)]
+
+loadsgf games/life_and_death/ld9.sgf
+33 dragon_status C16
+#? [dead]
+34 dragon_status R16
+#? [critical (Q19|S18|T18|T16) (T18|S18|Q19)]
+35 dragon_status R3
+#? [critical (T5|S2) (S2|T2|T3)]
+36 dragon_status C4
+#? [alive]
+
+loadsgf games/life_and_death/ld10.sgf
+37 dragon_status C16
+#? [critical (A17|C19) (A17|C19|A16|A18)]
+38 dragon_status R16
+#? [dead]
+39 dragon_status R3
+#? [dead]
+40 dragon_status C4
+#? [critical (A5|B2) (B2|A2)]
+
+loadsgf games/life_and_death/ld11.sgf
+41 dragon_status C16
+#? [critical B19 (B19|A16|B18|C19)]
+42 dragon_status R16
+#? [dead]
+43 dragon_status R3
+#? [critical (R1|S2|T7) S2]
+# B2 lives but allows the opponent to make seki (or ko).
+44 dragon_status C4
+#? [critical D1 (A2|D1|B2)]
+
+loadsgf games/life_and_death/ld12.sgf
+45 dragon_status C16
+#? [alive]
+46 dragon_status R16
+#? [alive]
+47 dragon_status R3
+#? [dead]
+48 dragon_status C4
+#? [alive]
+
+loadsgf games/life_and_death/ld13.sgf
+49 dragon_status C16
+#? [critical B18 (A18|B18)]
+50 dragon_status R16
+#? [critical (T18|T16) (T18|S18|Q19)]
+51 dragon_status R3
+#? [critical S1 (R1|S1|T5|T4|T3|S2|S3|T1)]
+# B1 is a better defense than D1 because the latter only lives by double ko.
+# FIXME: D1 and A5 only attack with ko since black can reply at A2.
+52 dragon_status C4
+#? [critical (D1|A5) (B1|D1|B2)]
+
+loadsgf games/life_and_death/ld14.sgf
+53 dragon_status C16
+#? [critical (C19|B19|B18|A18) (A18|B18)]
+54 dragon_status R16
+#? [critical (T16|O19|T17|T18|S18) T18]
+55 dragon_status R3
+#? [critical (S2|T5|S3|T3|T2|R1|S1) S2]
+56 dragon_status C4
+#? [critical (D1|A5|A2) B1]
+
+loadsgf games/life_and_death/ld15.sgf
+57 dragon_status C16
+#? [critical (A16|A17|A18|B18) A18]
+58 dragon_status R16
+#? [critical Q19 (T18|S18|Q19|S19)]
+59 dragon_status R3
+#? [alive]
+60 dragon_status C4
+#? [alive]
+
+loadsgf games/life_and_death/ld16.sgf
+61 dragon_status C16
+#? [critical (B12|D13|D14|A14|A12|B11|C19|B18|A18|B19) (A18|B18|A14|B12)]
+62 dragon_status R16
+#? [alive]
+63 dragon_status R3
+#? [critical (S2|Q2|R2|R1|S1|T5) S2]
+64 dragon_status C4
+#? [alive]
+
+loadsgf games/life_and_death/ld17.sgf
+65 dragon_status B2
+#? [critical A2 A2]
+
+loadsgf games/life_and_death/ld18.sgf 1
+66 dragon_status C9
+#? [alive]
+
+loadsgf games/life_and_death/ld18.sgf
+67 dragon_status C9
+#? [critical A9 A7]
+
+# No need to play ko with B2
+loadsgf games/life_and_death/ld13.sgf
+play white A5
+play black A4
+play white D1
+play black A2
+68 owl_attack C4
+#? [1 B1]
+
+# Clean capture, no ko.
+loadsgf games/life_and_death/ld13.sgf
+69 owl_attack R16
+#? [1 (T16|T18)]
+
+# Two-stage ko.
+loadsgf games/life_and_death/ld9.sgf
+play white E1
+70 owl_attack C4
+#? [2 B2]*
+
+loadsgf games/life_and_death/lunches.sgf
+101 dragon_status A17
+#? [dead]
+102 dragon_status A11
+#? [critical (C14|E14|F13|E11) E14]
+103 dragon_status A5
+#? [critical (A1|E7|M2|M1|N2|N1|O2|O1|P1) (A1|E7|M2|A8|C8|F4)]
+104 dragon_status S1
+#? [critical T6 (T6|T8)]
+105 dragon_status H18
+#? [dead]
+106 dragon_status M7
+#? [critical (O8|L8) O8]
+
+# Life and death problems derived from the tripod group.
+loadsgf games/life_and_death/tripod1.sgf
+151 dragon_status C17
+#? [alive]
+152 dragon_status R17
+#? [critical (S17|Q18|T16) T17]
+153 dragon_status R3
+#? [alive]
+154 dragon_status C3
+#? [critical (B3|D2|B1|A2) B1]
+
+loadsgf games/life_and_death/tripod2.sgf
+155 dragon_status C17
+#? [critical (B16|B18) B18]
+156 dragon_status R17
+#? [alive]
+157 owl_attack R3
+#? [1 Q1]
+158 owl_defend R3
+#? [1 T1]
+159 dragon_status C3
+#? [critical (D2|A4) B1]
+
+loadsgf games/life_and_death/tripod3.sgf
+160 dragon_status C17
+#? [critical B19 (B18|B19|C19)]
+161 dragon_status R17
+#? [dead]
+162 dragon_status R3
+#? [critical P1 R1]
+163 owl_attack C3
+#? [3 B1]
+164 owl_defend C3
+#? [1 (B2|B1|A2)]
+
+loadsgf games/life_and_death/tripod4.sgf
+165 owl_attack C17
+#? [1 (A16|B18)]
+166 owl_defend C17
+#? [2 B18]
+167 owl_attack R17
+#? [3 T15]
+168 owl_defend R17
+#? [1 (R19|T16|T18|T19)]
+169 owl_attack R3
+#? [1 Q1]
+170 owl_defend R3
+#? [2 Q1]
+171 owl_attack C3
+#? [3 A2]
+172 owl_defend C3
+#? [1 (C1|A2)]
+
+loadsgf games/life_and_death/tripod5.sgf
+173 dragon_status C17
+#? [critical (C18|D19|A16) C19]
+174 dragon_status R17
+#? [alive]
+175 dragon_status R3
+#? [critical (T4|S2) S2]
+176 dragon_status C3
+#? [alive]
+
+loadsgf games/life_and_death/tripod6.sgf
+# This is an extremely good ko for white. Black has to ignore 3 ko
+# threats to be able to live.
+177 owl_attack C17
+#? [2 D19]
+178 owl_defend C17
+#? [1 (A19|A17)]
+179 owl_attack R17
+#? [3 T17]
+180 owl_defend R17
+#? [1 (Q18|T17|S18|T18|S17|S19)]
+181 owl_attack R3
+#? [1 (R2|S4|P1)]
+182 owl_defend R3
+#? [2 S1]
+183 owl_attack C3
+#? [3 B2]
+184 owl_defend C3
+#? [1 (B1|B2|B3|A4|D2)]
+
+loadsgf games/life_and_death/tripod7.sgf
+185 owl_attack C17
+#? [1 (A19|A18)]
+186 owl_defend C17
+#? [2 (A18|C18)]
+187 owl_attack R17
+#? [1 (Q19|S19)]
+188 owl_defend R17
+#? [2 Q19]
+189 dragon_status R3
+#? [critical S1 (S4|S1|T2)]
+190 dragon_status C3
+#? [critical (B3|D2|B5|A5|A4) A2]
+
+loadsgf games/life_and_death/tripod8.sgf
+191 dragon_status C17
+#? [alive]
+192 dragon_status R17
+#? [critical (T19|S19) (S17|S19)]
+193 dragon_status R3
+#? [critical (S4|T4|T5) S4]
+194 owl_attack C3
+#? [3 B1]
+195 owl_defend C3
+#? [1 (C1|A5|A3|A2|B1)]
+
+loadsgf games/life_and_death/tripod9.sgf
+196 owl_attack C17
+#? [1 B19]
+197 owl_defend C17
+#? [2 B19]
+198 dragon_status R17
+#? [dead]
+199 dragon_status R3
+#? [alive]
+200 dragon_status C3
+#? [dead]
+
+# More life and death problems around tripod group.
+
+loadsgf games/life_and_death/tripod4.sgf
+# Black tries a bad defense. He must be punished.
+play black Q19
+201 owl_attack Q19
+#? [3 T15]
+
+# Mixed life and death problems.
+loadsgf games/life_and_death/mixed1.sgf
+300 owl_attack  C17
+#? [1 (E19|D19|C19|B18|B19|A18|A19)]
+301 owl_defend  C17
+#? [1 C19]*
+302 dragon_status R17
+#? [critical T19 (Q19|R18)]
+303 dragon_status R3
+#? [critical (S3|Q3|Q1|T2|T3) S3]
+304 dragon_status C3
+#? [critical (A2|E1) A2]
+
+loadsgf games/life_and_death/comb1.sgf
+305 dragon_status C3
+#? [critical E2 (E2|E1)]
+
+loadsgf games/life_and_death/ld19.sgf
+306 owl_attack C17
+#? [1 B19]
+307 owl_defend C17
+#? [1 (E19|C19|B19|A18|A16)]
+308 owl_attack R17
+#? [1 T17]
+309 owl_defend R17
+#? [1 (T17|S19|Q19)]
+310 owl_attack R3
+#? [1 T2]
+311 owl_defend R3
+#? [1 (T2|R1|P1)]
+312 owl_attack C3
+#? [1 B1]
+313 owl_defend C3
+#? [1 (B1|A4)]
+
+loadsgf games/owl49.sgf 1
+314 owl_defend R17
+#? [1 P18]*
+play black P17
+315 owl_attack P17
+#? [1 P18]
+
+loadsgf games/owl49.sgf 7
+316 owl_defend Q17
+#? [1 T16]
+
+loadsgf games/life_and_death/mixed2.sgf
+317 owl_attack C13
+#? [1 E13]*
+318 owl_attack L12
+#? [1 L10]
+319 owl_defend C3
+#? [3 D2]
+320 owl_attack L5
+#? [3 M5]
+
+loadsgf games/life_and_death/mixed3.sgf
+321 owl_attack D11
+#? [2 B12]
+322 owl_attack K13
+#? [1 (N11|N13|PASS)]*
+323 owl_defend K13
+#? [0]
+324 owl_attack L4
+#? [1 N2]
+325 owl_defend B3
+#? [1 E1]*
+
+loadsgf games/life_and_death/mixed4.sgf
+326 owl_attack B11
+#? [1 B13]
+327 owl_attack L12
+#? [1 M13]
+328 owl_attack K5
+#? [1 (N5|N3|J2)]*
+329 owl_defend K5
+#? [1 N3]*
+
+# tough under the stones problem from Sensei's Library
+loadsgf games/owl47.sgf 5
+404 owl_attack Q4
+#? [1 S4]
+loadsgf games/owl47.sgf 6
+405 owl_defend Q4
+#? [0]
+loadsgf games/owl47.sgf 7
+406 owl_attack Q4
+#? [1 R3]
+loadsgf games/owl47.sgf 8
+407 owl_defend Q4
+#? [0]
+loadsgf games/owl47.sgf 9
+408 owl_attack Q4
+#? [1 T3]
+loadsgf games/owl47.sgf 10
+409 owl_defend Q4
+#? [0]
+loadsgf games/owl47.sgf 11
+410 owl_attack Q4
+#? [1 (R3|T2)]
+loadsgf games/owl47.sgf 12
+411 owl_defend Q4
+#? [0]
+loadsgf games/owl47.sgf 13
+412 owl_attack Q4
+#? [1 T2]
+loadsgf games/owl47.sgf 14
+413 owl_defend Q4
+#? [0]
+loadsgf games/owl47.sgf 15
+414 owl_attack Q4
+#? [1 S2]
+
+# Problems arising from a 3-3 invasion.
+loadsgf games/life_and_death/invasion1.sgf
+501 owl_defend C17
+#? [1 C15]
+502 owl_defend R17
+#? [1 (R14|S14|R16)]
+503 owl_defend R3
+#? [1 S2]*
+504 owl_attack C3
+#? [1 B1]
+
+loadsgf games/life_and_death/invasion2.sgf
+505 owl_attack C17
+#? [1 (C19|B19)]
+506 owl_defend R17
+#? [1 S16]
+507 owl_defend R3
+#? [1 S2]*
+508 owl_defend R5
+#? [1 (S2|S7)]
+509 owl_defend C5
+#? [1 A5]*
+
+loadsgf games/life_and_death/invasion3.sgf
+510 owl_defend C15
+#? [1 B15]*
+511 owl_defend R15
+#? [1 (R12|R11)]*
+512 owl_defend R3
+#? [1 S5]
+513 owl_defend C3
+#? [1 C2]*
+
+loadsgf games/life_and_death/invasion4.sgf
+514 owl_defend C17
+#? [1 B16]
+515 owl_defend R15
+#? [1 S15]
+516 owl_defend R3
+#? [1 S2]
+517 owl_defend C3
+#? [1 C8]*
+
+loadsgf games/life_and_death/ld20.sgf
+520 owl_defend B4
+#? [2 B3]*
+
+loadsgf games/life_and_death/eye1.sgf
+530 owl_attack B9
+#? [1 D9]*
+531 owl_defend B9
+#? [1 (D9|E9|E8)]
+532 owl_attack F2
+#? [1 J2]*
+533 owl_defend F2
+#? [1 J2]*
diff --git a/regression/manyfaces.tst b/regression/manyfaces.tst
new file mode 100644 (file)
index 0000000..234a583
--- /dev/null
@@ -0,0 +1,56 @@
+loadsgf games/mfgg1.sgf 43
+1 reg_genmove black
+#? [S13]
+
+#See also owl1:265.
+loadsgf games/mfgg1.sgf 49
+2 reg_genmove black
+#? [S16]
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=No terribly serious consequences, S11 not optimal.
+#SEVERITY=3
+loadsgf games/mfgg1.sgf 65
+3 reg_genmove black
+#? [S12]*
+
+loadsgf games/mfgg1.sgf 97
+4 restricted_genmove black T6 R5
+#? [R5]
+
+#CATEGORY=FUSEKI_STRATEGY
+#DESCRIPTION=N6 is not terrible - right concept.
+#SEVERITY=2
+loadsgf games/mfgg2.sgf 19
+5 reg_genmove black
+#? [M5|M15|R3|R17]
+
+#CATEGORY=FUSEKI_STRATEGY
+#DESCRIPTION=E6 really misses the point.
+#SEVERITY=9
+loadsgf games/mfgg2.sgf 23
+6 reg_genmove black
+#? [R3]*
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=Q5 dragon is under severe pressure.
+#SEVERITY=8
+loadsgf games/mfgg2.sgf 45
+7 reg_genmove black
+#? [R2|S7]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=GNU Go doesn't understand this type of corner position!
+#SEVERITY=10
+#GG often messes up in this type of corner position.
+loadsgf games/mfgg2.sgf 117
+8 reg_genmove black
+#? [T2]
+
+loadsgf games/mfgg3.sgf 42
+9 reg_genmove black
+#? [!P12]
+
+loadsgf games/mfgg3.sgf 44
+10 reg_genmove black
+#? [N3]*
diff --git a/regression/manyfaces1.tst b/regression/manyfaces1.tst
new file mode 100644 (file)
index 0000000..0504ac9
--- /dev/null
@@ -0,0 +1,56 @@
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 9
+10 reg_genmove black
+#? [C17|H15|D9]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 15
+20 reg_genmove black
+#? [F12|G14|G13|C17|C12|E13]*
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 25
+30 reg_genmove black
+#? [C14]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 41
+33 reg_genmove black
+#? [S17|R3]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 47
+36 reg_genmove black
+#? [P16]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 59
+40 reg_genmove black
+#? [P15]*
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 65
+50 owl_attack K17
+#? [1 .*]*
+
+# W:P19 threatens the corner but still N18 is important
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 79
+60 reg_genmove black
+#? [N18|G18]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 83
+70 reg_genmove black
+#? [M10|L9|L8|K7]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 97
+80 reg_genmove black
+#? [J17|N18|D18]*
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 99
+90 reg_genmove black
+#? [!A10]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 101
+100 reg_genmove black
+#? [!B13|A13]
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 191
+150 reg_genmove black
+#? [N5|O6]*
+
+loadsgf games/nngs/ManyFaces3-gnugo-3.3.11-200211071935.sgf 201
+160 reg_genmove black
+#? [O5]
diff --git a/regression/nando.tst b/regression/nando.tst
new file mode 100644 (file)
index 0000000..ddafd24
--- /dev/null
@@ -0,0 +1,270 @@
+#--------------------------------------------------------------
+# Not sure it's the best move on the board, but it should be
+# considered. Unless I missed something, it looks like a good
+# reducing move.
+#CATEGORY=STRATEGY
+loadsgf games/nando/auto001.sgf
+1 reg_genmove white
+#? [M12|N11]*
+
+# Uh ?!
+#CATEGORY=OWL
+loadsgf games/nando/auto002.sgf
+2 owl_does_defend A14 B13
+#? [0]*
+
+#CATEGORY=OPTICS
+loadsgf games/nando/auto003.sgf
+3 owl_defend B11
+#? [1 A12]
+
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto004.sgf
+4 disconnect S7 S11
+#? [1 (S10|T9)]
+5 same_dragon S7 S11
+#? [0]*
+
+# Problem with multiple lunches
+#CATEGORY=OWL
+loadsgf games/nando/auto005.sgf
+6 owl_does_defend S2 Q2
+#? [0]
+
+#CATEGORY=ATARI_ATARI
+loadsgf games/nando/auto006.sgf
+7 reg_genmove black
+#? [N16]
+8 reg_genmove white
+#? [M16|N16]
+
+# Beware of the double snapback.
+#CATEGORY=ATARI_ATARI
+loadsgf games/nando/auto007.sgf
+white A1
+black B5
+9 reg_genmove white
+#? [E1|E2|F1|G1|G2]
+
+# GG (as of 3.3.15) doesn't even try a single move. On the other
+# side, GG doesn't have (yet) any mechanism for detecting a
+# "connect either" combination.
+#CATEGORY=OWL
+loadsgf games/nando/auto008.sgf
+10 owl_defend D12
+#? [1 (C11|F11|C12)]*
+
+#CATEGORY=OWL/OPTICS
+loadsgf games/nando/auto009.sgf
+11 owl_attack S8
+#? [1 (S2|T2|S1|T4|T3)]
+
+#CATEGORY=OWL/OPTICS
+# Note that K12 connects out (sacrificing L11 if necessary).
+loadsgf games/nando/auto010.sgf
+12 owl_attack L17
+#? [0]*
+
+#CATEGORY=OWL/OPTICS
+# (If white B2 in reply to B1, Black A1 kills cleanly. /ab)
+loadsgf games/nando/auto011.sgf
+13 owl_attack A4
+#? [1 B1]*
+
+# W should better counter-attack
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto012.sgf 90
+14 reg_genmove white
+#? [P7]*
+
+# Still the better choice, S7 only strengthens B.
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto012.sgf 92
+15 reg_genmove white
+#? [P7]*
+
+# D5 is just stupid
+# (but A5 doesn't work. /ab)
+#CATEGORY=OWL
+loadsgf games/nando/auto012.sgf 124
+17 reg_genmove white
+#? [B4|B5]*
+
+# Non-transitivity problem.
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto013.sgf
+18 disconnect D6 H6
+#? [1 E6]
+19 same_dragon D6 H6
+#? [0]*
+
+# S8, T12 and a lack of liberties are too many weaknesses.
+# W must defend.
+#CATEGORY=ATARI_ATARI
+loadsgf games/nando/auto014.sgf
+black S16
+20 reg_genmove white
+#? [S8|S9|T12]
+# With another move ordering
+loadsgf games/nando/auto014.sgf
+black S8
+white T9
+black S16
+21 reg_genmove white
+#? [S9|T12]
+
+# Another non-transitivity problem.
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto015.sgf
+22 disconnect L3 N2
+#? [1 M3]
+23 same_dragon L3 N2
+#? [0]
+
+#CATEGORY=OWL
+loadsgf games/nando/auto016.sgf
+24 owl_defend P17
+#? [1 M13]
+
+#CATEGORY=BLUNDER
+loadsgf games/nando/auto017.sgf
+white A8
+black A10
+25 reg_genmove white
+#? [!P16]
+
+# Another lunch "mirage" at N16/O15.
+#CATEGORY=OWL
+loadsgf games/nando/auto018.sgf
+26 owl_does_defend P16 R18
+#? [0]
+
+# Move valuation looks way off. No idea what is happening here.
+#CATEGORY=?
+loadsgf games/nando/auto019.sgf
+27 reg_genmove white
+#? [D6]*
+
+# Non-transitivity problem (or is it ok to amalgamate by ko ?)
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto020.sgf
+28 disconnect S3 S7
+#? [2 S6]
+29 same_dragon S3 S7
+#? [0]*
+
+# W still can either connect or make 2 eyes
+#CATEGORY=OWL
+loadsgf games/nando/auto020.sgf
+black S6
+30 owl_defend S11
+#? [1 T6]*
+
+#CATEGORY=CONNECTION
+loadsgf games/nando/auto021.sgf
+31 connect E18 H19
+#? [0]
+
+# O12 and Q14 are amalgamated per pattern CC502. The OWL engine
+# thinks that the dragon can simply escape by playing O13 in
+# response to black P13. And unfortunately, no other safeguards
+# prevent the blunder (as of 3.5.5)
+#CATEGORY=ATARI_ATARI (?)
+loadsgf games/nando/auto022.sgf 206
+32 reg_genmove white
+#? [N13|O13]
+
+# After W:H11 B:K13, White can save the day with K12, but GNU Go 3.7.5
+# thinks that the move is unsafe (see reading:220)
+loadsgf games/nando/auto023.sgf 170
+33 reg_genmove white
+#? [H11]
+
+loadsgf games/nando/auto026.sgf 118
+34 restricted_genmove white S12 S8
+#? [S8]*
+
+# Apparently, a ko depth issue (3.7.7)
+play white T8
+35 attack T8
+#? [3 S8]*
+
+loadsgf games/nando/auto027.sgf 165
+36 disconnect L8 N7
+#? [1 L7]*
+
+
+#--------------------------------------------------------------
+# Cascade of chain breakings
+#CATEGORY=TACTICAL_READING
+loadsgf games/nando/meijin27_g1.sgf 105
+110 owl_defend B16
+#? [0]
+111 attack C18
+#? [0]
+
+# Connection overvaluation. This dragon has miai options to
+# connect to strong dragons, so it isn't urgent to do it now.
+#CATEGORY=STRATEGY
+loadsgf games/nando/meijin27_g1.sgf 186
+112 reg_genmove white
+#? [!P7]
+
+#--------------------------------------------------------------
+# After B:P2 W:Q2, the connection code (as of 3.3.15) overvalues
+# B:P3 (-1.95) and consequently rejects the correct move B:Q1
+# at candidate selection stage
+#CATEGORY=CONNECTION
+loadsgf games/nando/meijin27_g4.sgf 23
+140 disconnect O2 Q3
+#? [1 P2]*
+
+# More an amalgamation problem. GG knows how to cut, but still
+# thinks it's the same dragon.
+# (Non-transitivity problem. /ab)
+#CATEGORY=CONNECTION
+loadsgf games/nando/meijin27_g4.sgf 128
+141 disconnect P2 P4
+#? [1 P3]
+142 same_dragon P2 P4
+#? [0]*
+
+#--------------------------------------------------------------
+# Not really a connection problem, rather a tactical reading one
+# see test 151
+#CATEGORY=CONNECTION
+loadsgf games/nando/meijin27_g5.sgf 48
+150 disconnect P3 Q4
+#? [1 P4]*
+
+#CATEGORY=TACTICAL_READING
+loadsgf games/nando/meijin27_g5.sgf 48
+black P4
+151 attack P4
+#? [0]*
+
+#--------------------------------------------------------------
+# C4 should be played only when W already has a stone around D10
+#CATEGORY=FUSEKI
+loadsgf games/nando/kisei27_g1.sgf 14
+210 reg_genmove white
+#? [D3]
+
+# D5 is exceedingly urgent. GG should _never_ tenuki !
+#CATEGORY=FUSEKI
+loadsgf games/nando/kisei27_g1.sgf 16
+211 reg_genmove white
+#? [D5]
+
+# Connection is mandatory.
+#CATEGORY=FUSEKI
+loadsgf games/nando/kisei27_g1.sgf 20
+212 reg_genmove white
+#? [E3]
+
+#CATEGORY=CONNECTION
+loadsgf games/nando/kisei27_g1.sgf 26
+213 disconnect C4 C6
+#? [0]*
+
+#---------------------- End of Tests --------------------------
diff --git a/regression/neurogo.tst b/regression/neurogo.tst
new file mode 100644 (file)
index 0000000..71fdbf3
--- /dev/null
@@ -0,0 +1,133 @@
+# This regression file covers mistakes made in the Computer Go Ladder
+# game between GNU Go 2.7.168 (white) and NeuroGo II (black) on
+# September 9, 2000.
+
+loadsgf games/FSF-neurogo.sgf 20
+1 reg_genmove white
+#? [Q3]
+
+loadsgf games/FSF-neurogo.sgf 22
+2 reg_genmove white
+#? [R3]
+
+loadsgf games/FSF-neurogo.sgf 34
+3 reg_genmove white
+#? [H3|K3|K4]*
+
+# Tenuki is acceptable. In the local area the game move is bad.
+loadsgf games/FSF-neurogo.sgf 40
+4 reg_genmove white
+#? [D6]*
+
+loadsgf games/FSF-neurogo.sgf 50
+5 restricted_genmove white F8 F9
+#? [F9]
+
+# Tenuki is perhaps acceptable.
+loadsgf games/FSF-neurogo.sgf 86
+6 reg_genmove white
+#? [C14]*
+
+loadsgf games/FSF-neurogo.sgf 90
+7 reg_genmove white
+#? [O2]*
+
+loadsgf games/FSF-neurogo.sgf 92
+8 reg_genmove white
+#? [O2]
+
+loadsgf games/FSF-neurogo.sgf 124
+9 reg_genmove white
+#? [A18]*
+
+loadsgf games/FSF-neurogo.sgf 136
+10 restricted_genmove white A3 B4
+#? [B4]
+
+# Semeai problem.
+loadsgf games/FSF-neurogo.sgf 148
+11 reg_genmove white
+#? [N5]*
+
+loadsgf games/FSF-neurogo.sgf 152
+12 reg_genmove white
+#? [B10]
+
+loadsgf games/FSF-neurogo.sgf 176
+# This may be hard to fix at this point but since we
+# can't win the ko we shouldn't start it.
+13 restricted_genmove white P7 M7 M8
+#? [M7|M8]*
+
+loadsgf games/FSF-neurogo.sgf 178
+14 reg_genmove white
+#? [Q4]*
+
+# White A16 is about three points reverse sente. G19 is two points
+# double sente, but black can get in A16 in sente before answering
+# G19. We accept both moves as being correct.
+loadsgf games/FSF-neurogo.sgf 230
+15 reg_genmove white
+#? [A16|G19]
+
+# It doesn't look like black can live, so this would only be a
+# reinforcing move. It may not be worth regressing over.
+loadsgf games/FSF-neurogo.sgf 276
+16 reg_genmove white
+#? [H17|K17|H15|L16]
+
+loadsgf games/FSF-neurogo.sgf 286
+# K19 makes ko. H18 kills right out.
+17 reg_genmove white
+#? [H18]
+
+loadsgf games/FSF-neurogo.sgf 288
+18 reg_genmove white
+#? [K19|H18|K16]
+
+# Move 12
+# M17 is an odd move. The local good shape and
+# connection is at O16, but in order to really kill the black corner,
+# a move at S16 is called for.
+loadsgf games/FSF-neurogo.sgf 12
+19 owl_attack Q17
+#? [1 S16]
+20 owl_defend Q17
+#? [1 S16]
+21 reg_genmove white
+#? [S16]
+
+# Move 18
+# H16 looks strange. Locally better to make a wider extension towards
+# the corner stone. Globally a move like R7 is more urgent,
+# strengthening the lone lower right corner stone and keeping the
+# black stones on the right side weak.
+# (no actual test case yet)
+
+# Move 34
+# J3 is considered owl-dead and is therefore abandoned. This seems too
+# pessismistic, however.
+loadsgf games/FSF-neurogo.sgf 34
+22 owl_attack J3
+#? [1 K3]
+23 owl_defend J3
+#? [1 (K3|H3)]
+
+# Move 88
+# The C15 stones can be saved by a move at F16.
+loadsgf games/FSF-neurogo.sgf 88
+24 owl_attack C15
+#? [1 (F16|E16|F14)]
+25 owl_defend C15
+#? [1 F16]
+
+# Move 96
+# The B16 stones can no longer be saved. Better to make connection at
+# O2.
+loadsgf games/FSF-neurogo.sgf 96
+26 owl_attack B16
+#? [1 (PASS|B17)]
+27 owl_defend B16
+#? [0]
+28 reg_genmove white
+#? [O2]*
diff --git a/regression/newscore.tst b/regression/newscore.tst
new file mode 100644 (file)
index 0000000..c26d63a
--- /dev/null
@@ -0,0 +1,119 @@
+loadsgf games/scoring/score1.sgf
+1 new_score
+#? [W\+141.5 .*]
+
+loadsgf games/scoring/score2.sgf
+2 new_score
+#? [W\+100.5 .*]
+
+loadsgf games/scoring/score3.sgf
+3 new_score
+#? [W\+32.5 .*]
+
+loadsgf games/scoring/score4.sgf
+4 new_score
+#? [W\+22.5 .*]
+
+loadsgf games/scoring/score5.sgf
+5 new_score
+#? [W\+59.5 .*]
+
+loadsgf games/scoring/score6.sgf
+6 new_score
+#? [W\+36.5 .*]
+
+loadsgf games/scoring/score7.sgf
+7 new_score
+#? [W\+16.5 .*]*
+
+loadsgf games/scoring/score8.sgf
+8 new_score
+#? [W\+4.5 .*]
+
+loadsgf games/scoring/score9.sgf
+9 new_score
+#? [W\+97.5 .*]
+
+loadsgf games/scoring/score10.sgf
+10 new_score
+#? [W\+104.5 .*]
+
+loadsgf games/scoring/score11.sgf
+11 new_score
+#? [W\+132.5 .*]
+
+loadsgf games/scoring/score12.sgf
+12 new_score
+#? [W\+40.5 .*]
+
+loadsgf games/scoring/score13.sgf
+13 new_score
+#? [W\+223.5 .*]
+
+loadsgf games/scoring/score14.sgf
+14 new_score
+#? [W\+73.5 .*]*
+
+loadsgf games/scoring/score15.sgf
+15 new_score
+#? [W\+45.5 .*]
+
+loadsgf games/scoring/score16.sgf
+16 new_score
+#? [W\+32.5 .*]
+
+loadsgf games/scoring/score17.sgf
+17 new_score
+#? [W\+165.5 .*]
+
+loadsgf games/scoring/score18.sgf
+18 new_score
+#? [W\+44.5 .*]
+
+loadsgf games/scoring/score19.sgf
+19 new_score
+#? [B\+53.5 .*]
+
+loadsgf games/scoring/score20.sgf
+20 new_score
+#? [B\+34.5 .*]
+
+loadsgf games/scoring/score21.sgf
+21 new_score
+#? [B\+66.5 .*]
+
+loadsgf games/scoring/score22.sgf
+22 new_score
+#? [B\+76.5 .*]
+
+loadsgf games/scoring/score23.sgf
+23 new_score
+#? [B\+83.5 .*]
+
+loadsgf games/scoring/score24.sgf
+24 new_score
+#? [B\+51.5 .*]
+
+loadsgf games/scoring/score25.sgf
+25 new_score
+#? [B\+16.5 .*]
+
+loadsgf games/scoring/score26.sgf
+26 new_score
+#? [B\+60.5 .*]
+
+loadsgf games/scoring/score27.sgf
+27 new_score
+#? [W\+58.5 .*]
+
+loadsgf games/scoring/score28.sgf
+28 new_score
+#? [B\+71.5 .*]
+
+loadsgf games/scoring/score29.sgf
+29 new_score
+#? [W\+36.5 .*]
+
+loadsgf games/scoring/score30.sgf
+30 new_score
+#? [W\+87.5 .*]
diff --git a/regression/nicklas1.tst b/regression/nicklas1.tst
new file mode 100644 (file)
index 0000000..5352612
--- /dev/null
@@ -0,0 +1,356 @@
+# =============================
+# Private test set nicklas1.tst
+# All of these tests passes with version 2.7.222.
+#
+# Note: This is one of the oldest test files in GNU Go. Some of the
+#       negative tests have been removed because a modern GNU Go
+#       would never consider those moves.
+# =============================
+
+# # D9 is too weird to be considered anymore. Removed.
+# loadsgf games/nicklas/nicklas1.sgf 9
+# 101 reg_genmove black
+# #? [!D9]
+
+# # No longer interesting.
+# loadsgf games/nicklas/nicklas2.sgf 5
+# 201 reg_genmove black
+# #? [!G8|D8|F8]
+
+# # H8 is too weird to be considered anymore. Removed.
+# loadsgf games/nicklas/nicklas2.sgf 9
+# 202 reg_genmove black
+# #? [!H8]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=Combination threat to live / connect.
+#SEVERITY=4
+loadsgf games/nicklas/nicklas2.sgf 23
+203 reg_genmove black
+#? [J5]
+
+##tm - if B J8, W J5 kills bigger B corner.  
+##So, there's no really effective move here.
+## GNU Go 3.1.16 gets J5, which is prob. best.
+#loadsgf games/nicklas/nicklas2.sgf 39
+#204 reg_genmove black
+##? [F8]*
+
+loadsgf games/nicklas/nicklas2.sgf 55
+205 dragon_status G1
+#? [dead]
+
+loadsgf games/nicklas/nicklas3.sgf 49
+301 reg_genmove black
+#? [H3|H6]
+
+loadsgf games/nicklas/nicklas5.sgf 23
+501 reg_genmove black
+#? [G7]
+
+loadsgf games/nicklas/nicklas5.sgf 27
+502 reg_genmove black
+#? [G5]
+
+loadsgf games/nicklas/nicklas6.sgf 31
+# semeai problem
+603 reg_genmove black
+#? [C5]
+
+loadsgf games/nicklas/nicklas6.sgf 41
+604 reg_genmove black
+#? [A7|J9]
+
+loadsgf games/nicklas/nicklas8.sgf 96
+801 reg_genmove black
+#? [P16]
+
+# G2 destroys eyeshape but the semeai can't be won.
+loadsgf games/nicklas/nicklas8.sgf 162
+806 restricted_genmove black G2 D8
+#? [D8]
+
+loadsgf games/nicklas/nicklas8.sgf 164
+807 restricted_genmove black H1 J2
+#? [J2]
+
+loadsgf games/nicklas/nicklas8.sgf 180
+808 restricted_genmove black L2 N6
+#? [N6]
+
+loadsgf games/nicklas/nicklas8.sgf 224
+810 restricted_genmove black O7 C19
+#? [O7]
+
+# Moved K15 to K14. /gf ; Added back K14 - both work.
+#SEVERITY=7
+#CATEGORY=CONNECTION
+#DESCRIPTION=Is GnuGo misreading the cut?
+loadsgf games/nicklas/nicklas8.sgf 240
+811 reg_genmove black
+#? [K14|K15]*
+
+loadsgf games/nicklas/nicklas9.sgf 28
+901 reg_genmove black
+#? [H8]
+
+loadsgf games/nicklas/nicklas10.sgf 30
+1002 reg_genmove black
+#? [H8]
+
+loadsgf games/nicklas/nicklas10.sgf 56
+1003 reg_genmove black
+#? [B1]
+
+# A ko threat would have been appropriate, but none exists.
+loadsgf games/nicklas/nicklas10.sgf 64
+1004 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas10.sgf 66
+1005 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas10.sgf 68
+1006 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas11.sgf 16
+1101 restricted_genmove black D11 C8
+#? [C8]
+
+loadsgf games/nicklas/nicklas11.sgf 174
+1104 restricted_genmove black A15 C1
+#? [C1]*
+
+loadsgf games/nicklas/nicklas11.sgf 180
+1105 restricted_genmove black F2 H14
+#? [F2]
+
+# Q6 seems largest but we may want to accept some more moves. The
+# original formulation !F6 isn't very good since a one point reverse
+# sente move isn't all that bad in the position.
+loadsgf games/nicklas/nicklas11.sgf 208
+1106 reg_genmove black
+#? [Q6]*
+
+#CATEGORY=WASTED_MOVE
+#DESCRIPTION=GnuGo 3.1.8 gets N2 on next move;  R3 benign ko threat loss.
+#SEVERITY=2
+loadsgf games/nicklas/nicklas11.sgf 242
+1107 reg_genmove black
+#? [N2]*
+
+# Thrashing dragon. Q18 is cleanest but R18 and pass are also acceptable.
+loadsgf games/nicklas/nicklas11.sgf 258
+1108 reg_genmove black
+#? [Q18|R18|PASS]
+
+loadsgf games/nicklas/nicklas11.sgf 260
+1109 reg_genmove black
+#? [Q18]
+
+# Thrashing dragon. O18 is the only interesting restraining move.
+loadsgf games/nicklas/nicklas11.sgf 268
+1110 reg_genmove black
+#? [O18|PASS]
+
+loadsgf games/nicklas/nicklas11.sgf 270
+1111 reg_genmove black
+#? [N18]
+
+# Q19 is not a fail, it does work as well. /pp
+loadsgf games/nicklas/nicklas11.sgf 274
+1112 reg_genmove black
+#? [N19|Q19]
+
+loadsgf games/nicklas/nicklas12.sgf 103
+1206 reg_genmove black
+#? [C15]
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Needless 2 point loss for B.
+#SEVERITY=7
+loadsgf games/nicklas/nicklas12.sgf 113
+1207 restricted_genmove black B18 C18 B17 C17
+#? [C17]
+
+loadsgf games/nicklas/nicklas12.sgf 117
+1208 reg_genmove black
+#? [E19]
+
+# L19 isn't even close to living.
+loadsgf games/nicklas/nicklas12.sgf 121
+1209 restricted_genmove black L19 B14
+#? [B14]
+
+loadsgf games/nicklas/nicklas12.sgf 123
+1210 dragon_status D18
+#? [dead]
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=
+#SEVERITY=
+loadsgf games/nicklas/nicklas12.sgf 203
+1213 reg_genmove black
+#? [N4]
+
+# Added A6 among the correct moves. /gf (2.7.203)
+loadsgf games/nicklas/nicklas12.sgf 215
+1214 reg_genmove black
+#? [A1|A6]
+
+# H3 doesn't seem critical. /gf
+loadsgf games/nicklas/nicklas12.sgf 259
+1216 reg_genmove black
+#? [H3]*
+
+loadsgf games/nicklas/nicklas13.sgf 57
+1302 reg_genmove black
+#? [J3]
+
+loadsgf games/nicklas/nicklas13.sgf 58
+1303 dragon_status G8
+#? [dead]
+
+loadsgf games/nicklas/nicklas13.sgf 73
+1304 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas14.sgf 51
+1404 reg_genmove black
+#? [J7]
+
+loadsgf games/nicklas/nicklas14.sgf 55
+1405 reg_genmove black
+#? [B7]
+
+# Semeai problem
+loadsgf games/nicklas/nicklas14.sgf 57
+1406 reg_genmove black
+#? [B6]
+
+loadsgf games/nicklas/nicklas14.sgf 61
+1408 dragon_status A8
+#? [alive]
+
+loadsgf games/nicklas/nicklas15.sgf 196
+1502 reg_genmove black
+#? [D14]
+
+loadsgf games/nicklas/nicklas15.sgf 208
+1504 restricted_genmove black F16 D15
+#? [D15]
+
+loadsgf games/nicklas/nicklas15.sgf 212
+1505 reg_genmove black
+#? [T14]
+
+loadsgf games/nicklas/nicklas15.sgf 224
+1506 reg_genmove black
+#? [S4]
+
+# # This is virtually identical with 1506, let's skip it.
+# loadsgf games/nicklas/nicklas15.sgf 228
+# 1507 reg_genmove black
+# #? [!T1]
+
+# # This one too.
+# loadsgf games/nicklas/nicklas15.sgf 232
+# 1508 reg_genmove black
+# #? [!F15]
+
+loadsgf games/nicklas/nicklas15.sgf 258
+1509 restricted_genmove black K4 L1 T14
+#? [T14]
+
+loadsgf games/nicklas/nicklas15.sgf 284
+1510 reg_genmove black
+#? [C12]
+
+loadsgf games/nicklas/nicklas15.sgf 296
+1511 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas15.sgf 298
+1512 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas16.sgf 22
+1601 restricted_genmove black D9 D7
+#? [D7]
+
+loadsgf games/nicklas/nicklas16.sgf 28
+1602 restricted_genmove black H8 B8
+#? [B8]
+
+# Missed connection. See also connection:26,27
+loadsgf games/nicklas/nicklas16.sgf 38
+1603 reg_genmove black
+#? [B4]
+
+loadsgf games/nicklas/nicklas16.sgf 62
+1604 reg_genmove black
+#? [J2]
+
+loadsgf games/nicklas/nicklas16.sgf 64
+1605 reg_genmove black
+#? [J1]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=No reason to give W a chance for ko here.
+#SEVERITY=6
+#The problem with D5 is the same as in nicklas2:1802
+loadsgf games/nicklas/nicklas18.sgf 15
+1801 reg_genmove black
+#? [D2]
+
+loadsgf games/nicklas/nicklas19.sgf 34
+1901 reg_genmove black
+#? [B7]
+
+loadsgf games/nicklas/nicklas19.sgf 46
+1902 reg_genmove black
+#? [B7]
+
+loadsgf games/nicklas/nicklas19.sgf 52
+1903 reg_genmove black
+#? [A9]
+
+loadsgf games/nicklas/nicklas19.sgf 60
+1904 reg_genmove black
+#? [H9|J8]
+
+loadsgf games/nicklas/nicklas20.sgf 37
+2001 reg_genmove black
+#? [G5]
+
+# Is there any way to live in the upper right? If so that's probably better.
+loadsgf games/nicklas/nicklas20.sgf 41
+2002 reg_genmove black
+#? [J5]
+
+# White is thrashing but E1 is not a very meaningful move.
+loadsgf games/nicklas/nicklas21.sgf 52
+2101 reg_genmove black
+#? [PASS|A7|A5|D1|A6|G1]
+
+loadsgf games/nicklas/nicklas23.sgf 26
+2301 reg_genmove black
+#? [G6|F7|H8]
+
+loadsgf games/nicklas/nicklas23.sgf 40
+2302 reg_genmove black
+#? [F4]
+
+loadsgf games/nicklas/nicklas23.sgf 52
+2303 reg_genmove black
+#? [G9]
+
+loadsgf games/nicklas/nicklas23.sgf 60
+2304 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas23.sgf 62
+2305 reg_genmove black
+#? [PASS]
diff --git a/regression/nicklas2.tst b/regression/nicklas2.tst
new file mode 100644 (file)
index 0000000..57815b2
--- /dev/null
@@ -0,0 +1,163 @@
+# =============================
+# Private test set nicklas2.tst
+# These tests are from 9x9 games.
+# None of these tests passes with version 2.7.222.
+# I think these problems are "simple".
+# =============================
+
+#CATEGORY=ATARI_ATARI
+#DESCRIPTION=GnuGo misses followup to D4 push-through.
+#SEVERITY=1
+#    This is not as clear cut as it may seem. 2.7.228 values the endgame 
+#    move at A7 to 6.66 points which seems about correct. The fact that 
+#    white D4 threatens both to cut off E5-F6 and to capture D3 through 
+#    a chain of threats (which is what happens in the game) is not that
+#    easy to understand.  A more general atari_atari module could 
+#    perhaps see it, but we are still far from that.  I think this test
+#    should be in nicklas3.tst (harder problems).
+loadsgf games/nicklas/nicklas1.sgf 29
+102 reg_genmove black
+#? [D4]
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=I think G9 is not too terrible here. Very difficult to see.-trevor
+#SEVERITY=1
+#    This test illustrates a general weakness of GNU Go: It's poor 
+#    ability to defend its borders.  White can enter blacks domains or
+#    capture the E8 group. In the latter case, whites first move is
+#    a sacrifice and the capture happens through a chain of threats.
+#Added E6, still not thinking G9 is so bad. -trevor
+loadsgf games/nicklas/nicklas6.sgf 23
+601 reg_genmove black
+#? [D8|C8|D6|D4|E6]
+
+#CATEGORY=SEMEAI_MODULE
+#DESCRIPTION=Very tough position.  Even if F1 for B, W E7 is tough.
+#SEVERITY=1
+#    This is a very good test case for a semeai module. Black F1 threatens
+#    to live and creates all the necessary liberties to win the semai.
+#I disagree; this it tough; a more clear-cut test case would be helpful
+#to better isolate the inherent problem. - trevor
+loadsgf games/nicklas/nicklas7.sgf 29
+701 reg_genmove black
+#? [F1]*
+
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=Tough for white to see attacking B, and linking w/ attack stone.
+#SEVERITY=3
+#    The only way to live is to attack a neighbour dragon, e.g. the one
+#    at F8. But does the owl code really do this by default?
+#
+#    No, this is up to the semeai module to resolve. /gf
+#
+loadsgf games/nicklas/nicklas9.sgf 28
+902 dragon_status E9
+#? [critical]*
+
+903 dragon_status G7
+#? [critical (H8|F9) H8]
+
+# E1 loses some endgame points since black must capture later anyhow, 
+# but it saves the group. It could be regarded as acceptable at this 
+# point.
+loadsgf games/nicklas/nicklas9.sgf 50
+904 reg_genmove black
+#? [B1|E1]
+
+loadsgf games/nicklas/nicklas10.sgf 18
+1001 reg_genmove black
+#? [H8]
+
+loadsgf games/nicklas/nicklas13.sgf 49
+1301 reg_genmove black
+#? [B8|B9]
+
+#CATEGORY=TACTICAL_READING
+#DESCRIPTION=Fighting Ko here is not unreasonable for B.
+#SEVERITY=0
+#I would delete this regression test. -trevor
+loadsgf games/nicklas/nicklas14.sgf 31
+1401 reg_genmove black
+#? [B3]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=Black must protect his group.  H9 is thinkable also.
+#SEVERITY=9
+loadsgf games/nicklas/nicklas14.sgf 43
+1402 reg_genmove black
+#? [J8|J6]
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=PASS here is unthinkable, though RESIGN might be appropriate!
+#SEVERITY=5
+# One eye wins against no eye
+#Note: Owl & Dragon status is both critical for the W group.  Why
+#  would B pass when there's a critical group on the board? Owl & 
+#  Dragon status for all of the B stones is Dead.  Can a Critical
+#  group kill another group???
+loadsgf games/nicklas/nicklas14.sgf 61
+1407 reg_genmove black
+#? [A6]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Protect those borders!
+#SEVERITY=8
+#Added A8, for the faint of heart.
+# It's black to move!. The business is to kill white, which is most
+# solidly done with C9, but I think A5 and maybe some other moves
+# work as well. /gf
+loadsgf games/nicklas/nicklas17.sgf 47
+1701 reg_genmove black
+#? [C9|A8]
+
+# Owl reading problem. See also owl:228.
+loadsgf games/nicklas/nicklas18.sgf 17
+1802 reg_genmove black
+#? [E2]
+
+
+#CATEGORY=WASTED_MOVE
+#DESCRIPTION=Um, you're still dead after B1, but sente!
+#SEVERITY=1
+#SEE_ALSO=trevor.tst?310
+loadsgf games/nicklas/nicklas18.sgf 45
+1803 reg_genmove black
+#? [A6|A8]
+
+
+#CATEGORY=ENDGAME_TUNING
+#DESCRIPTION=OWL & Dragon status for W is all dead.  Why does B play?
+#SEVERITY=5
+loadsgf games/nicklas/nicklas21.sgf 72
+2102 reg_genmove black
+#? [PASS]
+
+
+#CATEGORY=ENDGAME_TUNING
+#DESCRIPTION=OWL & Dragon status for W is all dead.  Why does B play?
+#SEVERITY=5
+#See also nicklas2.tst?2102
+loadsgf games/nicklas/nicklas21.sgf 74
+2103 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas21.sgf 76
+2104 reg_genmove black
+#? [PASS]
+
+loadsgf games/nicklas/nicklas22.sgf 42
+2201 reg_genmove black
+#? [C2]
+
+loadsgf games/nicklas/nicklas22.sgf 50
+2202 reg_genmove black
+#? [B1]
+
+#CATEGORY=ATARI_ATARI
+#DESCRIPTION=Black must defend here - yikes!
+#SEVERITY=10
+loadsgf games/nicklas/nicklas24.sgf 41
+2401 reg_genmove black
+#? [G3|G2]
diff --git a/regression/nicklas3.tst b/regression/nicklas3.tst
new file mode 100644 (file)
index 0000000..bd46d0a
--- /dev/null
@@ -0,0 +1,22 @@
+# =============================
+# Private test set nicklas3.tst
+# These tests are from 9x9 games.
+# None of these tests passes with version 2.7.222.
+# I think these problems are "non trivial".
+# =============================
+
+loadsgf games/nicklas/nicklas4.sgf 73
+401 reg_genmove black
+#? [A5]
+
+loadsgf games/nicklas/nicklas6.sgf 25
+602 reg_genmove black
+#? [C6]
+
+# J6 gives a gote seki.
+# However, playing sente moves against the group, starting with H9,
+# and then taking gote at H1 gives the same end result. Thus H9 is
+# also okay.
+loadsgf games/nicklas/nicklas14.sgf 48
+1403 reg_genmove white
+#? [J6|H9]*
diff --git a/regression/nicklas4.tst b/regression/nicklas4.tst
new file mode 100644 (file)
index 0000000..071ba01
--- /dev/null
@@ -0,0 +1,55 @@
+# =============================
+# Private test set nicklas4.tst
+# These tests are from 19x19 games.
+# None of these tests passes with version 2.7.222.
+# I think these problems are "simple".
+# =============================
+
+loadsgf games/nicklas/nicklas8.sgf 146
+805 reg_genmove black
+#? [C5|B4]
+
+loadsgf games/nicklas/nicklas8.sgf 212
+809 reg_genmove black
+#? [B10]
+
+# Changed correct answer from K12 to J12. /gf
+# K14 also secures a connection of all important stones but is one
+# point worse than J12. K12 loses the tail.
+loadsgf games/nicklas/nicklas8.sgf 242
+812 reg_genmove black
+#? [J12]
+
+# O9 does leave a ko but is not out of the question. /gf
+loadsgf games/nicklas/nicklas11.sgf 56
+1102 reg_genmove black
+#? [P9|O9]
+
+loadsgf games/nicklas/nicklas11.sgf 172
+1103 reg_genmove black
+#? [C2|C3]
+
+# It seems that GNU Go makes a logical mistake here: After seeing that
+# R9 can be defended with S7, and that Q8 can be defended with S7, I
+# doubt it checks whether both will be defended by S7. /ab
+loadsgf games/nicklas/nicklas12.sgf 29
+1201 reg_genmove black
+#? [Q9]
+
+# # I have some doubt about the correct move. I might be advisable for B
+# # to defend his center group, although W E16 hurts, of course. However,
+# # W's attack after W N11, B N12 and next W L9 or similar might be
+# # very useful as well.
+# # gf This testcase is too unclear, removed. (3.5.3)
+# loadsgf games/nicklas/nicklas12.sgf 95
+# 1205 reg_genmove black
+# #? [E16]*
+
+loadsgf games/nicklas/nicklas12.sgf 215
+1215 dragon_status A4
+#? [critical A6 (A1|A6)]
+
+# Changed move number from 185 to 186. /gf
+loadsgf games/nicklas/nicklas15.sgf 186
+1501 reg_genmove black
+#? [D17]
diff --git a/regression/nicklas5.tst b/regression/nicklas5.tst
new file mode 100644 (file)
index 0000000..bde0d03
--- /dev/null
@@ -0,0 +1,52 @@
+# =============================
+# Private test set nicklas5.tst
+# These tests are from 19x19 games.
+# None of these tests passes with version 2.7.222.
+# I think these problems are "non trivial".
+# =============================
+
+loadsgf games/nicklas/nicklas8.sgf 116
+802 reg_genmove black
+#? [O12]
+
+loadsgf games/nicklas/nicklas8.sgf 134
+803 reg_genmove black
+#? [F7|G7]*
+
+loadsgf games/nicklas/nicklas8.sgf 140
+804 reg_genmove black
+#? [D6]*
+
+# Locally K18 is superior to L17.
+loadsgf games/nicklas/nicklas12.sgf 69
+1202 restricted_genmove black K18 L17
+#? [K18]
+
+# I guess K18, giving up the O17 stones and attacking H17 in exchange,
+# is playable. /ab
+loadsgf games/nicklas/nicklas12.sgf 71
+1203 reg_genmove black
+#? [K18|N18|N19|M19]*
+
+
+# tm - Looks like a semeai problem.  E18 is good except for semeai.
+loadsgf games/nicklas/nicklas12.sgf 89
+1204 reg_genmove black
+#? [H15]*
+
+# This is presumably a semeai problem.
+# W L8 is alive in semeai. /ab
+loadsgf games/nicklas/nicklas12.sgf 182
+1211 dragon_status L8
+#? [alive]
+
+# This is presumably a semeai problem.
+# As W L8 is alive in semeai with sufficiently many liberties ahead of
+# B G13, I do not think the black P13 dragon can make eyes. /ab
+loadsgf games/nicklas/nicklas12.sgf 199
+1212 dragon_status P13
+#? [dead]
+
+loadsgf games/nicklas/nicklas12.sgf 263
+1217 reg_genmove black
+#? [F3]*
diff --git a/regression/niki.tst b/regression/niki.tst
new file mode 100644 (file)
index 0000000..051bac8
--- /dev/null
@@ -0,0 +1,90 @@
+loadsgf games/niki.sgf 24
+1 reg_genmove white
+#? [E17]
+
+#CATEGORY=MIDDLE_STRATEGY
+#DESCRIPTION=Tough middle-game position
+#SEVERITY=3
+loadsgf games/niki.sgf 40
+2 reg_genmove white
+#? [E7]*
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Must connect 5 important stones, cutting B group.
+#SEVERITY=10
+loadsgf games/niki.sgf 68
+3 reg_genmove white
+#? [E12]
+
+loadsgf games/niki.sgf 92
+4 reg_genmove white
+#? [Q8]
+
+#S10 seems OK, much better than game move of S14. Added it -trevor
+#S14 is thought to owl attack the corner. If this is correct the move
+#looks okay. Otherwise we need to fix the owl reading. /gf
+loadsgf games/niki.sgf 94
+5 reg_genmove white
+#? [S9|S10]
+
+loadsgf games/niki.sgf 106
+6 restricted_genmove white S18 P18
+#? [P18]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=T4 is terrible; other moves than J12 maybe OK.
+#SEVERITY=6
+loadsgf games/niki.sgf 110
+7 reg_genmove white
+#? [J12]*
+
+# H15 is less efficient but does secure life, which is most
+# important. Added H15, G15, and F15. /gf
+loadsgf games/niki.sgf 124
+8 reg_genmove white
+#? [G16|H15|G15|F15]
+
+#reg_genmove bug requires reloading game.
+loadsgf games/niki.sgf 124
+9 reg_genmove black
+#? [F15]
+
+loadsgf games/niki.sgf 128
+10 reg_genmove white
+#? [S5]*
+
+
+#CATEGORY=TACTICAL_READING
+#DESCRIPTION=Very tough position
+#SEVERITY=3
+#Note: G16 is still very very big.  See niki.tst#8 & nikit.tst#9
+#tm (3.1.16) added P6 - looks locally best, and GNU Go agrees.
+loadsgf games/niki.sgf 158
+11 reg_genmove white
+#? [P6|M6|P7]*
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=B15 does live.  Problem is w/ followup - see niki.tst#14
+#SEVERITY=0
+#
+# Originally H12 was listed as correct here, but that vertex is
+# occupied. F14 and G15 seem sufficient for life.
+#
+#Recommend adding B15 as acceptable to live.
+loadsgf games/niki.sgf 212
+12 reg_genmove white
+#? [F14|G15]*
+
+loadsgf games/niki.sgf 226
+13 reg_genmove white
+#? [F8]
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=F16 lives because of B short of liberties
+#SEVERITY=8
+loadsgf games/niki.sgf 214
+14 reg_genmove white
+#? [F16]*
diff --git a/regression/ninestones.tst b/regression/ninestones.tst
new file mode 100644 (file)
index 0000000..ab385e4
--- /dev/null
@@ -0,0 +1,306 @@
+loadsgf games/ninestones/halti-gnugo-3.3.9-200210111409.sgf 26
+10 reg_genmove black
+#? [C5]
+
+loadsgf games/ninestones/halti-gnugo-3.3.9-200210111409.sgf 36
+20 reg_genmove black
+#? [H2|H3]*
+
+loadsgf games/ninestones/halti-gnugo-3.3.9-200210111409.sgf 42
+30 reg_genmove black
+#? [E8]*
+
+loadsgf games/ninestones/halti-gnugo-3.3.9-200210111409.sgf 48
+40 reg_genmove black
+#? [!D2]
+
+loadsgf games/ninestones/halti-gnugo-3.3.9-200210111409.sgf 62
+50 reg_genmove black
+#? [R13]
+
+loadsgf games/ninestones/halti-gnugo-3.3.9-200210111409.sgf 98
+60 reg_genmove black
+#? [L3]*
+
+# locally P3 is orthodox
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf 22
+70 reg_genmove black
+#? [!P2]
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf 26
+80 reg_genmove black
+#? [!O2]
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf 30
+90 reg_genmove black
+#? [E7]*
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf 42
+100 reg_genmove black
+#? [R11]*
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210100706.sgf 64
+110 reg_genmove black
+#? [L3|K3|K5]*
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf 58
+120 reg_genmove black
+#? [G11]*
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf 60
+130 reg_genmove black
+#? [!N8]
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf 64
+140 reg_genmove black
+#? [E8]*
+
+loadsgf games/ninestones/bobo-gnugo-3.3.9-200210111309.sgf 66
+150 reg_genmove black
+#? [C5|D5]
+
+# Black is actually trapped.
+loadsgf games/nngs/thor-gnugo-3.3.12-200212170003.sgf 64
+190 owl_defend J9
+#? [0]*
+
+# See also 9x9:680 and tickets #77 and #161.
+loadsgf games/nngs/thor-gnugo-3.3.12-200212170003.sgf 108
+220 reg_genmove black
+#? [P9|P8]*
+
+loadsgf games/nngs/thor-gnugo-3.3.12-200212170003.sgf 118
+230 restricted_genmove black P11 K2 H13
+#? [!P11]
+
+loadsgf games/nngs/thor-gnugo-3.3.12-200212170003.sgf 154
+240 reg_genmove black
+#? [!M19]
+
+loadsgf games/nngs/thor-gnugo-3.3.12-200212170003.sgf 170
+250 reg_genmove black
+#? [T10]
+
+# a little difficult since B16 doesn't make life locally
+loadsgf games/nngs/norate-ggl-200212301513.sgf 32
+260 reg_genmove black
+#? [B16]*
+
+loadsgf games/nngs/norate-ggl-200212301513.sgf 52
+270 reg_genmove black
+#? [Q3]*
+
+loadsgf games/nngs/norate-ggl-200212301513.sgf 62
+280 reg_genmove black
+#? [R1|S1|S2]*
+
+loadsgf games/nngs/norate-ggl-200212301513.sgf 234
+290 reg_genmove black
+#? [B1]
+
+# game move is playable but invites trouble.
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 4
+300 reg_genmove black
+#? [P16]
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 8
+310 reg_genmove black
+#? [P16]*
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 24
+320 reg_genmove black
+#? [D5]
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 36
+330 reg_genmove black
+#? [M17|M16]*
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 48
+340 reg_genmove black
+#? [H4]*
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 56
+350 restricted_genmove black N19 L17
+#? [L17]*
+
+# S3 is the worst move, S5 is the best.
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 76
+360 restricted_genmove black S3 S4 S5
+#? [S5]*
+
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 78
+370 reg_genmove black
+#? [R5]*
+
+loadsgf games/nngs/juka-gnugo-3.3.16-200302072106.sgf 4
+380 reg_genmove black
+#? [D3|E3|E7|F6]*
+
+loadsgf games/nngs/juka-gnugo-3.3.16-200302072106.sgf 8
+390 reg_genmove black
+#? [D3]*
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 164
+490 restricted_genmove black S10 R10
+#? [R10]*
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 200
+500 reg_genmove black
+#? [A8|A6|A9]
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 208
+510 reg_genmove black
+#? [E19]
+
+# First solve optics:328.
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 210
+520 reg_genmove black
+#? [!G19]
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 214
+530 reg_genmove black
+#? [E13]*
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 228
+540 reg_genmove black
+#? [B15]
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 254
+550 reg_genmove black
+#? [G5|J4]
+
+# B can win the semeai, which is a close race. Tenuki is
+# possible but the policy should be to play it out.
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 272
+560 reg_genmove black
+#? [A9|B10|D11|F11|J15|A16]
+
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 274
+570 reg_genmove black
+#? [A9|B10|D11|F11|J15|A16]
+
+# L3 just loses a point, as do K1 and H1.
+loadsgf games/nngs/uhu-gnugo-3.3.16-200302112129.sgf 300
+580 restricted_genmove black L3 K1 H1 A10
+#? [A10]*
+
+# collection of bad tenukis
+loadsgf games/ninestones/ninestones1.sgf 18
+590 reg_genmove black
+#? [P4]
+
+loadsgf games/ninestones/ninestones1.sgf 20
+600 reg_genmove black
+#? [P5]*
+
+loadsgf games/ninestones/ninestones1.sgf 34
+610 reg_genmove black
+#? [P11|O9|O7|O4]*
+
+loadsgf games/ninestones/ninestones1.sgf 44
+615 reg_genmove black
+#? [J16]*
+
+loadsgf games/ninestones/ninestones1.sgf 76
+620 reg_genmove black
+#? [G7|C8|F8]*
+
+loadsgf games/ninestones/ninestones1.sgf 90
+630 reg_genmove black
+#? [F5|H7]
+
+# J2 is better than H2
+loadsgf games/splee.sgf 62
+640 reg_genmove black
+#? [J2|H2]
+
+loadsgf games/ninestones/emanuel-1.sgf 182
+650 reg_genmove black
+#? [Q5]*
+
+loadsgf games/ninestones/emanuel-1.sgf 200
+660 reg_genmove black
+#? [P1]
+
+#this is a persistent cache problem
+loadsgf games/ninestones/emanuel-2.sgf 112
+reg_genmove black
+play black A4
+play white F6
+reg_genmove black
+play black F7
+play white E6
+reg_genmove black
+play black C8
+play white G7
+670 reg_genmove black
+#? [H7]
+
+loadsgf games/9handicap.sgf 24
+680 reg_genmove black
+#? [A18|A14]*
+
+loadsgf games/9handicap.sgf 34
+690 restricted_genmove black G16 J16
+#? [J16]
+
+loadsgf games/9handicap.sgf 40
+700 restricted_genmove black M14 K15
+#? [K15]*
+
+loadsgf games/9handicap.sgf 56
+710 restricted_genmove black B10 C10
+#? [C10]
+
+loadsgf games/9handicap.sgf 82
+720 reg_genmove black
+#? [J3|K3|K2]*
+
+loadsgf games/9handicap.sgf 86
+730 reg_genmove black
+#? [K2]*
+
+loadsgf games/9handicap.sgf 136
+740 reg_genmove black
+#? [T16]*
+
+loadsgf games/9handicap.sgf 214
+750 restricted_genmove black K12 K13
+#? [K12]*
+
+loadsgf games/9handicap.sgf 274
+760 reg_genmove black
+#? [J10]
+
+loadsgf games/9handicap.sgf 278
+770 restricted_genmove black T9 Q19
+#? [Q19]*
+
+loadsgf games/9handicap.sgf 290
+780 reg_genmove black
+#? [B2]*
+
+# Not D7 as in the game!
+loadsgf games/9handicap.sgf 328
+790 reg_genmove black
+#? [B1]*
+
+# Connect safely
+loadsgf games/9handicap.sgf 334
+800 restricted_genmove black K1 K2
+#? [K1]*
+
+# This is very tricky. Both the dragons G16 and L14 are dead in semeai
+# by themselves, but taking the whole board, they have become critical.
+# I think F1 is the only move to capture both of them!
+# (And H18 played in the game is too ugly for words...)
+loadsgf games/9handicap.sgf 360
+810 reg_genmove black
+#? [F1]*
+
+# Black cannot capture both dragons anymore. At least pick one to capture!
+loadsgf games/9handicap.sgf 362
+820 reg_genmove black
+#? [F1|J11|N13]
+
+
diff --git a/regression/nngs.tst b/regression/nngs.tst
new file mode 100644 (file)
index 0000000..c18e513
--- /dev/null
@@ -0,0 +1,996 @@
+# games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf problems:
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 20
+100 reg_genmove black
+#? [K3]*
+
+
+#Trying to save L2 is an overplay.
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 22
+110 reg_genmove black
+#? [E2|H5|J5]*
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 22
+111 restricted_genmove black L2 L3
+#? [L2]
+
+#new failure (GNU Go 3.7.3 plays L2)
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 24
+112 reg_genmove black
+#? [H5|J5]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 30
+120 restricted_genmove black S1 Q4 R5
+#? [S1]*
+
+
+#new failure GNU Go 3.7.3
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 32
+122 restricted_genmove black K16 R8 K5
+#? [K16|K5]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 56
+130 reg_genmove black
+#? [J6]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 72
+140 restricted_genmove black M3 M4 O11
+#? [O11]
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 80
+150 restricted_genmove black J13 H12 H11
+#? [H12|H11]
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 84
+160 restricted_genmove black P14 P13 P12 O12
+#? [O12]
+
+
+# This test can safely be retired. /ab
+#loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 86
+#170 reg_genmove black
+##? [!N13|M5]
+
+
+#new failure GNU Go 3.7.3
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 122
+175 reg_genmove black
+#? [L4|P2]*
+
+
+#GNU Go 3.7.3 plays K9.  Is this acceptable? --evand Yes. /ab.
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 152
+180 reg_genmove black
+#? [L11|K9]
+
+#
+#loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 160
+#190 reg_genmove black
+##? [O11|P12]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 162
+200 reg_genmove black
+#? [P12|O11]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 172
+210 reg_genmove black
+#? [P11]
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201070826.sgf 194
+220 reg_genmove black
+#? [L1|E7|G13|K9]*
+
+
+
+
+# games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf problems:
+
+# Not clear what is best, but strengthening one of the weak groups
+# is urgent. /ab
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 24
+230 reg_genmove black
+#? [E9|G7|H2|K6|N5|D6]
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 30
+240 restricted_genmove black T6 T5 R4 S4 T4 S3 T3 Q2
+#? [R4|S4|Q2]
+
+# Desperate situation, no clear best move. /ab
+#loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 56
+#250 reg_genmove black
+##? [!S15]
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 60
+260 reg_genmove black
+#? [O13|P14]*
+
+
+#GNU Go 3.7.3 likes M7
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 92
+270 reg_genmove black
+#? [F8|H8|G6|H9]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 98
+280 reg_genmove black
+#? [E10]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 104
+290 reg_genmove black
+#? [D12|D11|E12]*
+
+
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 112
+300 restricted_genmove black B11 C12 C13 A13
+#? [C13]
+
+
+#New failure GNU Go 3.7.3
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 114
+302 restricted_genmove black C12 F15 M7 B14
+#? [F15|M7|B14]*
+
+
+#New failure GNU Go 3.7.3
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 116
+304 restricted_genmove black B14 E13 M7
+#? [B14|M7]
+
+
+#New failure GNU Go 3.7.3
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 158
+306 reg_genmove black
+#? [E14|E13|F13]*
+
+
+#New failure GNU Go 3.7.3
+loadsgf games/nngs/AdaGeek-gnugo-3.1.18-200201071333.sgf 240
+308 reg_genmove black
+#? [L3|M19]
+
+
+
+
+# games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 8
+310 reg_genmove black
+#? [B9]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 12
+320 reg_genmove black
+#? [B15|B16]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 14
+330 reg_genmove black
+#? [B15|B16]
+
+
+#New failure GNU Go 3.7.3
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 52
+335 restricted_genmove black S6 R5 R2
+#? [S6|R5]*
+
+
+#Other moves possible.
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 64
+340 reg_genmove black
+#? [R8]*
+
+
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 82
+370 reg_genmove black
+#? [!Q1]*
+
+# W misses break-chain (I think!?!) -tm 
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 82
+371 attack R5
+#? [0]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 126
+380 reg_genmove black
+#? [J2]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 152
+390 reg_genmove black
+#? [N17]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 156
+400 reg_genmove black
+#? [N14|L13|M13]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 204
+410 reg_genmove black
+#? [J9]
+
+
+#E4 better than C4, if must defend.
+# - We must defend. E4 only move. -ab
+loadsgf games/nngs/Lazarus-gnugo-3.1.17-200112301450.sgf 234
+420 reg_genmove black
+#? [E4]
+
+
+
+
+# games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 10
+430 reg_genmove black
+#? [E18|D17]*
+
+
+#other moves possible.
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 24
+440 reg_genmove black
+#? [O2]
+
+
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 84
+480 reg_genmove black
+#? [G14]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 86
+490 reg_genmove black
+#? [J18]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 90
+500 reg_genmove black
+#? [J17]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 92
+510 reg_genmove black
+#? [G14]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 226
+530 reg_genmove black
+#? [N5]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 234
+540 reg_genmove black
+#? [H10]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 242
+550 restricted_genmove black N6 L6
+#? [L6]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 272
+560 reg_genmove black
+#? [S15]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.18-200201072351.sgf 276
+570 reg_genmove black
+#? [F2]*
+
+
+
+
+# games/nngs/NE-gnugo-3.1.18-200201030545.sgf problems:
+
+loadsgf games/nngs/NE-gnugo-3.1.18-200201030545.sgf 20
+590 reg_genmove black
+#? [G3]*
+
+
+loadsgf games/nngs/NE-gnugo-3.1.18-200201030545.sgf 40
+600 reg_genmove black
+#? [H6]
+
+
+loadsgf games/nngs/NE-gnugo-3.1.18-200201030545.sgf 42
+610 reg_genmove black
+#? [J8]
+
+
+
+
+# games/nngs/gnugo-3.1.15-goku-200112081829.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.15-goku-200112081829.sgf 8
+620 reg_genmove white
+#? [P16]
+
+#
+#loadsgf games/nngs/gnugo-3.1.15-goku-200112081829.sgf 38
+#630 reg_genmove white
+##? [!J16]
+
+
+loadsgf games/nngs/gnugo-3.1.15-goku-200112081829.sgf 40
+640 restricted_genmove white M11 J9
+#? [J9]
+
+
+
+loadsgf games/nngs/gnugo-3.1.15-goku-200112081829.sgf 116
+660 reg_genmove white
+#? [H3]*
+
+
+
+
+loadsgf games/nngs/gnugo-3.1.15-goku-200112081829.sgf 146
+680 reg_genmove white
+#? [P13]
+
+
+loadsgf games/nngs/gnugo-3.1.15-goku-200112081829.sgf 152
+690 reg_genmove white
+#? [N13]
+
+
+
+
+# games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 47
+700 restricted_genmove white K17 K18 J18 J17 K16 J16
+#? [K17]
+
+
+loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 57
+710 reg_genmove white
+#? [F16]*
+
+# Redundant. /ab
+#loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 59
+#720 reg_genmove white
+##? [F16]*
+
+
+
+# This is an owl problem and should be made explicit as such. /ab
+#loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 113
+#770 reg_genmove white
+##? [!K2]
+
+
+
+# Retired. /ab
+#loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 233
+#800 reg_genmove white
+##? [!N19|M19|L19|S18|K1]
+
+
+loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 241
+810 reg_genmove white
+#? [J6|J8]*
+
+
+#J11 is terrible.
+loadsgf games/nngs/gnugo-3.1.18-AdaGeek-200201061015.sgf 257
+820 reg_genmove white
+#? [J13|L9]
+
+
+
+
+
+# games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf 42
+850 reg_genmove white
+#? [H15]
+
+
+loadsgf games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf 74
+860 reg_genmove white
+#? [O13]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-Mikael-200201062258.sgf 138
+870 reg_genmove white
+#? [A18]*
+
+
+# games/nngs/gnugo-3.1.18-Rufus-200201051408.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-Rufus-200201051408.sgf 5
+875 reg_genmove white
+#? [C5]*
+
+
+# games/nngs/gnugo-3.1.18-Rufus-200201051411.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-Rufus-200201051411.sgf 13
+880 reg_genmove white
+#? [E6]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-Rufus-200201051411.sgf 19
+890 restricted_genmove white G4 H4 J4
+#? [G4]*
+
+
+
+
+# games/nngs/gnugo-3.1.18-Rufus-200201051823.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-Rufus-200201051823.sgf 21
+900 reg_genmove white
+#? [Q15]
+
+
+loadsgf games/nngs/gnugo-3.1.18-Rufus-200201051823.sgf 43
+910 reg_genmove white
+#? [T16]*
+
+
+
+
+# games/nngs/gnugo-3.1.18-Rufus-200201052349.sgf problems:
+
+
+
+# games/nngs/gnugo-3.1.18-bnh-200201061916.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-bnh-200201061916.sgf 30
+920 reg_genmove white
+#? [B14|C15]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-bnh-200201061916.sgf 34
+930 reg_genmove white
+#? [S8]
+
+
+loadsgf games/nngs/gnugo-3.1.18-bnh-200201061916.sgf 36
+940 reg_genmove white
+#? [L2|M4|O3|S8|P17|B14]
+
+
+
+
+# games/nngs/gnugo-3.1.18-dermicha-200201041355.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-dermicha-200201041355.sgf 28
+950 reg_genmove white
+#? [F1]
+
+
+
+
+# games/nngs/gnugo-3.1.18-goku-200201042031.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042031.sgf 10
+960 reg_genmove white
+#? [R16|R17|S16]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042031.sgf 38
+970 reg_genmove white
+#? [J9]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042031.sgf 80
+980 reg_genmove white
+#? [D10]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042031.sgf 86
+990 reg_genmove white
+#? [C9]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042031.sgf 162
+1000 reg_genmove white
+#? [K6]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042031.sgf 180
+1010 reg_genmove white
+#? [Q16]
+
+
+
+
+# games/nngs/gnugo-3.1.18-goku-200201042350.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 20
+1020 reg_genmove white
+#? [Q2]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 26
+1030 reg_genmove white
+#? [L18|J13|J12|K13|R17|R16|C14]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 28
+1040 reg_genmove white
+#? [L18|J13|J12|K13|R17|R16|C14]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 36
+1050 reg_genmove white
+#? [J10|H10|G10|F10]*
+
+
+# See also atari_atari:28.
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 52
+1060 reg_genmove white
+#? [H3|F3]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 56
+1070 reg_genmove white
+#? [K17]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 58
+1080 reg_genmove white
+#? [K17]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 92
+1090 reg_genmove white
+#? [B17|B16]
+
+
+#Yikes! (B19 original move)
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 98
+1100 reg_genmove white
+#? [C18|D14]*
+
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 146
+1110 reg_genmove white
+#? [J16]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 154
+1120 reg_genmove white
+#? [D4|D6]
+
+
+loadsgf games/nngs/gnugo-3.1.18-goku-200201042350.sgf 158
+1130 reg_genmove white
+#? [B7|C8]
+
+
+
+
+# games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 42
+1140 owl_defend B13
+#? [1 (A11|B11|B10)]
+
+
+#loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 54
+#1150 reg_genmove white
+##? [!L7]
+
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 62
+1160 reg_genmove white
+#? [H10|H9|H8]
+
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 80
+1170 reg_genmove white
+#? [K6|K8]
+
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 82
+1180 reg_genmove white
+#? [L9]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 98
+1190 owl_defend B13
+#? [0]
+
+
+loadsgf games/nngs/gnugo-3.1.18-gopriest-200201072104.sgf 104
+1200 reg_genmove white
+#? [PASS]*
+
+
+
+
+# games/nngs/gnugo-3.1.18-guestx-200201071151.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-guestx-200201071151.sgf 12
+1210 reg_genmove white
+#? [C11|B11]*
+
+
+
+
+# games/nngs/gnugo-3.1.18-jimm-200201050556.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 24
+1220 reg_genmove white
+#? [C17]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 28
+1230 reg_genmove white
+#? [H7|B5|E7|R14]*
+
+
+#Locally, there are better moves than H14
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 42
+1240 restricted_genmove white J17 J16 K16 H15 J15 K15 H14 J14
+#? [J16|K16|K15]
+
+
+# Retired. /ab
+#loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 44
+#1250 reg_genmove white
+##? [!J11]
+
+
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 68
+1260 restricted_genmove white F18 G18 L18
+#? [G18|F18]
+
+
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 90
+1270 reg_genmove white
+#? [C16|B15]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 138
+1280 reg_genmove white
+#? [D13]
+
+
+
+loadsgf games/nngs/gnugo-3.1.18-jimm-200201050556.sgf 248
+1300 reg_genmove white
+#? [M2]
+
+
+
+
+# games/nngs/gnugo-3.1.18-patch-200201081044.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-patch-200201081044.sgf 16
+1310 reg_genmove white
+#? [Q15|Q14]
+
+
+loadsgf games/nngs/gnugo-3.1.18-patch-200201081044.sgf 20
+1320 reg_genmove white
+#? [O18]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-patch-200201081044.sgf 161
+1420 reg_genmove white
+#? [D12]
+
+
+loadsgf games/nngs/gnugo-3.1.18-patch-200201081044.sgf 163
+1430 reg_genmove white
+#? [D12]
+
+
+
+
+# games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf problems:
+
+loadsgf games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf 12
+1440 reg_genmove black
+#? [H10]
+
+
+loadsgf games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf 13
+1450 reg_genmove white
+#? [J10]*
+
+
+
+loadsgf games/nngs/gnugo-3.1.18-rpwiegand-200201072335.sgf 71
+1480 reg_genmove white
+#? [B1]
+
+
+
+# games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf problems:
+
+#Can't block this way, unless have a stone around K16
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 18
+1500 reg_genmove white
+#? [R16]
+
+
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 24
+1510 reg_genmove white
+#? [S16]*
+
+
+# Other moves possible, !G6
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 44
+1520 reg_genmove white
+#? [F15|F14]*
+
+
+
+
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 232
+1540 reg_genmove white
+#? [M8]*
+
+
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 234
+1550 reg_genmove white
+#? [M8]
+
+
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 236
+1560 reg_genmove white
+#? [M8]
+
+
+loadsgf games/nngs/gnugo-3.1.18-wingjk-200201080120.sgf 244
+1570 reg_genmove white
+#? [N13]*
+
+
+
+
+# games/nngs/juka-gnugo-3.1.16-200112142153.sgf problems:
+
+loadsgf games/nngs/juka-gnugo-3.1.16-200112142153.sgf 6
+1580 reg_genmove black
+#? [K6|O6]
+
+
+#M3 is antisuji!
+# L5 best attack here. /ab
+loadsgf games/nngs/juka-gnugo-3.1.16-200112142153.sgf 8
+1590 reg_genmove black
+#? [L5]*
+
+
+#Egads, don't tenuki here!
+loadsgf games/nngs/juka-gnugo-3.1.16-200112142153.sgf 14
+1600 reg_genmove black
+#? [N5]*
+
+
+
+loadsgf games/nngs/juka-gnugo-3.1.16-200112142153.sgf 220
+1620 reg_genmove black
+#? [B5]*
+
+
+loadsgf games/nngs/juka-gnugo-3.1.16-200112142153.sgf 228
+1630 restricted_genmove black A2 C2
+#? [C2]
+
+
+loadsgf games/nngs/juka-gnugo-3.1.16-200112142153.sgf 238
+1640 restricted_genmove black E2 F1
+#? [F1]
+
+
+
+
+# games/nngs/makoops-gnugo-3.1.18-200201081434.sgf problems:
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 12
+1650 reg_genmove black
+#? [S4]*
+
+
+# Retired. /ab
+#loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 30
+#1660 reg_genmove black
+##? [!F18]
+
+
+#B18 possibly?  !A15
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 50
+1670 reg_genmove black
+#? [C18]
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 56
+1680 reg_genmove black
+#? [K17]
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 60
+1690 reg_genmove black
+#? [K17|L16]*
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 68
+1700 reg_genmove black
+#? [D8|E9|C9]
+
+
+
+#loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 164
+#1740 reg_genmove black
+##? [!H3]
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 178
+1750 reg_genmove black
+#? [L8|J9]
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 192
+1760 reg_genmove black
+#? [N7]
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 196
+1770 reg_genmove black
+#? [M2|M3|M5|O1]
+
+
+loadsgf games/nngs/makoops-gnugo-3.1.18-200201081434.sgf 202
+1780 reg_genmove black
+#? [L1]*
+
+
+
+
+# games/nngs/scf-gnugo-3.1.18-200201060027.sgf problems:
+
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 57
+1790 restricted_genmove black O16 P14 S14
+#? [O16]*
+
+
+# Now redundant. /ab
+#loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 59
+#1800 reg_genmove black
+##? [!H5|G4|F6|F7]
+
+
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 67
+1810 reg_genmove black
+#? [N15]*
+
+
+
+#Something around L6 looks right.
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 83
+1830 reg_genmove black
+#? [L6]*
+
+
+#locally K12 is better than J13
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 97
+1840 reg_genmove black
+#? [K12]*
+
+
+
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 117
+1860 restricted_genmove black D19 E18
+#? [E18]
+
+
+# Redundant. /ab
+#loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 125
+#1870 reg_genmove black
+##? [!D19]
+
+
+# F6 connects out either way.
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 135
+1880 reg_genmove black
+#? [F6|G7]*
+
+
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 161
+1890 reg_genmove black
+#? [H16]
+
+
+#Hard to tell whether J18 or F19 are better.
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 173
+1900 reg_genmove black
+#? [J18|F19]
+
+
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 177
+1910 reg_genmove black
+#? [E18]
+
+
+loadsgf games/nngs/scf-gnugo-3.1.18-200201060027.sgf 205
+1920 restricted_genmove black K11 L11
+#? [K11]
+
+#CATEGORY=TERRITORIAL_VALUATION
+# Not E9 as played by GNU Go! -ab
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201162038.sgf 15
+1930 reg_genmove white
+#? [K15|L3|K3|F17|O17]*
+
+#Retired. /ab
+#loadsgf games/nngs/gnugo-3.1.20-setenza-200201162038.sgf 23
+#1940 reg_genmove white
+##? [!N5|O5]
+
+# Have to defend M16/O17.
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201162038.sgf 29
+1950 reg_genmove white
+#? [!Q11|S10|N17|M17|N16]
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 15
+1955 reg_genmove white
+#? [D3]
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 27
+1960 reg_genmove white
+#? [M15]*
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 33
+1970 reg_genmove white
+#? [P7|L3]*
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 35
+1980 restricted_genmove white G17 F15
+#? [F15]
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 39
+2000 reg_genmove white
+#? [P13|P7|L3|M10]*
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 43
+2010 reg_genmove white
+#? [P13|M10|O6]*
+
+loadsgf games/nngs/gnugo-3.1.20-setenza-200201172131.sgf 51
+2020 reg_genmove white
+#? [L2|H6|H7|J6|J7]*
+
+# This is tough. If Black plays J5, then he can win the semeai after
+# E3 - E4 - D3 - D2 - D4 - D5 - E5. /ab
+loadsgf games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf 16
+2030 reg_genmove black
+#? [J5]*
+
+# I think B can still get a seki (or life) at the bottom if he plays E5. /ab
+loadsgf games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf 22
+2040 reg_genmove black
+#? [E5]
+
+#CATEGORY=OWL_TUNING + KO
+loadsgf games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf 30
+2050 reg_genmove black
+#? [A2|B2]*
+
+#CATEGORY=OWL_TUNING
+loadsgf games/nngs/LordOfPi-gnugo-3.1.20-200201202014.sgf 36
+2060 reg_genmove black
+#? [C4|C1|F1]
diff --git a/regression/nngs1.tst b/regression/nngs1.tst
new file mode 100644 (file)
index 0000000..888dfdd
--- /dev/null
@@ -0,0 +1,239 @@
+# # Retired.
+# loadsgf games/nngs/looknglass-gnugo-3.1.26-200203042158.sgf 30
+# 1 reg_genmove black
+# #? [!A16]
+
+#CATEGORY=OWL_TUNING
+loadsgf games/nngs/looknglass-gnugo-3.1.26-200203042158.sgf 70
+2 reg_genmove black
+#? [K18|K19]
+
+loadsgf games/nngs/looknglass-gnugo-3.1.26-200203042158.sgf 74
+3 reg_genmove black
+#? [K17]
+
+loadsgf games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf 18
+4 reg_genmove white
+#? [H3|J5]
+
+loadsgf games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf 20
+5 reg_genmove white
+#? [H3|J5]
+
+loadsgf games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf 22
+6 reg_genmove white
+#? [H4]
+
+# Unsupported keimas like this lead to trouble quickly
+loadsgf games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf 24
+7 reg_genmove white
+#? [!K7]*
+
+loadsgf games/nngs/gnugo-3.1.26-journeyman-200203020154.sgf 32
+8 reg_genmove white
+#? [M10|L9]*
+
+loadsgf games/nngs/camel-gnugo-3.1.26-200203022335.sgf 44
+9 reg_genmove black
+#? [P15|Q14]*
+
+loadsgf games/nngs/camel-gnugo-3.1.26-200203022335.sgf 46
+10 reg_genmove black
+#? [R13]
+
+loadsgf games/nngs/camel-gnugo-3.1.26-200203022335.sgf 104
+11 reg_genmove black
+#? [T12]
+
+loadsgf games/nngs/camel-gnugo-3.1.26-200203022335.sgf 150
+12 reg_genmove black
+#? [A16]*
+
+loadsgf games/nngs/gnugo-3.1.26-farrell-200203051803.sgf 16
+13 reg_genmove white
+#? [S14]*
+
+loadsgf games/nngs/gnugo-3.1.26-farrell-200203051803.sgf 22
+14 reg_genmove white
+#? [S17]*
+
+loadsgf games/nngs/gnugo-3.1.26-farrell-200203051803.sgf 84
+15 reg_genmove white
+#? [F12|G14]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203061902.sgf 14
+16 reg_genmove white
+#? [M4]
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203061902.sgf 34
+17 reg_genmove white
+#? [L3|L4|J3]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203061902.sgf 38
+18 restricted_genmove white J2 K2 L2 H3 J3
+#? [J2]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203111825.sgf 16
+19 reg_genmove white
+#? [Q14]
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203111825.sgf 36
+20 reg_genmove white
+#? [F17]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203111825.sgf 40
+21 restricted_genmove white M6 N5
+#? [N5]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203111825.sgf 92
+22 reg_genmove white
+#? [E3]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203111825.sgf 130
+23 reg_genmove white
+#? [M8]*
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203121818.sgf 88
+24 reg_genmove white
+#? [L7|J5|M6]*
+
+loadsgf games/nngs/gnugo-3.1.27-wingjk-200203101039.sgf 78
+25 reg_genmove white
+#? [C9]
+
+loadsgf games/nngs/gnugo-3.1.27-Yuuki-200203131056.sgf 26
+26 reg_genmove white
+#? [P3]
+
+loadsgf games/nngs/gnugo-3.1.27-Yuuki-200203131056.sgf 46
+27 reg_genmove white
+#? [H2]
+
+loadsgf games/nngs/gnugo-3.1.27-Yuuki-200203131056.sgf 126
+28 reg_genmove white
+#? [J18]
+
+# # GNU Go 3.1.27 invades the 3-3 point too early
+# # Retired. With the position in the fuseki database the test is not
+# # very interesting anymore.
+# loadsgf games/nngs/gnugo-3.1.27-guestn-200203131735.sgf 6
+# 29 reg_genmove white
+# #? [!R17]
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203131735.sgf 10
+30 reg_genmove white
+#? [P17|O18]
+
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203131735.sgf 18
+31 reg_genmove white
+#? [N17]
+
+# better to avoid attack on one of the two top groups
+loadsgf games/nngs/gnugo-3.1.27-guestn-200203131735.sgf 34
+32 reg_genmove white
+#? [L12|K16|H16]*
+
+loadsgf games/nngs/gnugo-3.1.27-Yuuki-200203132324.sgf 90
+33 restricted_genmove white S9 S10
+#? [S10]
+
+loadsgf games/nngs/gnugo-3.1.27-GoFuN-200203230525.sgf 30
+34 reg_genmove white
+#? [!N10|N9|N11|O11|O10]
+
+loadsgf games/nngs/gnugo-3.1.27-GoFuN-200203230525.sgf 44
+35 reg_genmove white
+#? [D13]
+
+loadsgf games/nngs/gnugo-3.1.27-GoFuN-200203230525.sgf 64
+36 reg_genmove white
+#? [N11|L7]*
+
+loadsgf games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf 59
+37 reg_genmove black
+#? [H8|K14|L15|L14]
+
+loadsgf games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf 131
+39 reg_genmove black
+#? [R7]*
+
+loadsgf games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf 141
+40 reg_genmove black
+#? [R6]
+
+loadsgf games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf 145
+41 reg_genmove black
+#? [P6]
+
+loadsgf games/nngs/ManyFaces4-gnugo-3.1.28-200203262339.sgf 153
+42 reg_genmove black
+#? [O9]*
+
+loadsgf games/nngs/gnugo-3.1.29-coco-200203281540.sgf 10
+43 reg_genmove white
+#? [C18]
+
+loadsgf games/nngs/gnugo-3.1.29-coco-200203281540.sgf 36
+44 reg_genmove white
+#? [C11|D12]*
+
+loadsgf games/nngs/gnugo-3.1.29-coco-200203281540.sgf 46
+45 reg_genmove white
+#? [!B10]
+
+# # defense of the top right is urgent
+# # Is it really? The top right is worth about 30 points but black has
+# # to overcome a two-stage ko to get them. It's not clear there's no
+# # bigger move on the board.
+# # Test retired. See instead ld_owl:70.
+# loadsgf games/nngs/gnugo-3.1.29-coco-200203281540.sgf 54
+# 46 reg_genmove white
+# #? [!J5]
+
+loadsgf games/nngs/gnugo-3.1.29-coco-200203281929.sgf 12
+47 reg_genmove white
+#? [G15|F15|G16]
+
+loadsgf games/nngs/gnugo-3.1.29-coco-200203281929.sgf 16
+48 reg_genmove white
+#? [R16]*
+
+# W is trying to live with S14 but B:T14 threatens the corner.
+# Meanwhile B17 is urgent.
+loadsgf games/nngs/gnugo-3.1.29-coco-200203281929.sgf 54
+49 reg_genmove white
+#? [B17]*
+
+loadsgf games/nngs/gnugo-3.1.29-merlin-200203281708.sgf 33
+50 reg_genmove white
+#? [O10]
+
+loadsgf games/nngs/gnugo-3.1.30-Poctim-200204040503.sgf 26
+51 reg_genmove white
+#? [!K18]
+
+loadsgf games/nngs/gnugo-3.1.30-Poctim-200204040503.sgf 28
+52 reg_genmove white
+#? [L5]
+
+loadsgf games/nngs/gnugo-3.1.30-Poctim-200204040503.sgf 30
+53 reg_genmove white
+#? [L4]
+
+loadsgf games/nngs/gnugo-3.1.31-niki-200204131518.sgf 14
+54 reg_genmove white
+#? [Q14]
+
+loadsgf games/nngs/speciman-gnugo-3.1.32-200204211014.sgf 9
+55 reg_genmove black
+#? [!C7]
+
+# Capture properly.
+loadsgf games/nngs/speciman-gnugo-3.1.32-200204211014.sgf 33
+56 reg_genmove black
+#? [H4]*
+
+# J2 inefficient
+loadsgf games/nngs/speciman-gnugo-3.1.32-200204211014.sgf 39
+57 reg_genmove black
+#? [J4|J5]*
diff --git a/regression/nngs2.tst b/regression/nngs2.tst
new file mode 100644 (file)
index 0000000..9462a73
--- /dev/null
@@ -0,0 +1,251 @@
+# See also reading:173
+loadsgf games/nngs/gnugo-3.3.2-Zahlman-200205221717.sgf 207
+1 reg_genmove white
+#? [B1|A2]
+
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 22
+10 reg_genmove black
+#? [!H6]
+
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 96
+20 reg_genmove black
+#? [H11]*
+
+# K9 is harmful. After B:M16, W cannot kill J11 since E17 and N12 are miai
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 112
+30 reg_genmove black
+#? [L16|M16]*
+
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 158
+40 reg_genmove black
+#? [!K18]
+
+# semeai problem
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 162
+50 reg_genmove black
+#? [K2]
+
+# locally O1 is better
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 166
+60 reg_genmove black
+#? [!P1]
+
+loadsgf games/nngs/Jion-gnugo-3.3.2-200205241928.sgf 176
+70 reg_genmove black
+#? [!L18]
+
+# semeai problem
+loadsgf games/nngs/tobyiii-gnugo-3.3.2-200206041432.sgf 162
+80 reg_genmove black
+#? [O4|P1]*
+
+#CATEGORY=BLUNDER (incorrectly rejected move)
+loadsgf games/nngs/tobyiii-gnugo-3.3.2-200206041432.sgf 166
+90 reg_genmove black
+#? [N1]
+
+loadsgf games/nngs/lindq-gnugo-3.3.4-200207051636.sgf 214
+100 reg_genmove black
+#? [H5]
+
+loadsgf games/nngs/silverado-gnugo-3.3.5-200208061810.sgf 34
+110 reg_genmove black
+#? [B14|B13]
+
+loadsgf games/nngs/silverado-gnugo-3.3.5-200208061810.sgf 42
+120 reg_genmove black
+#? [E12|D13]
+
+# See also connection:93
+loadsgf games/nngs/silverado-gnugo-3.3.5-200208061810.sgf 100
+130 reg_genmove black
+#? [S13]*
+
+loadsgf games/nngs/silverado-gnugo-3.3.5-200208061810.sgf 130
+140 restricted_genmove black O5 P5 Q5 Q6
+#? [P5]*
+
+loadsgf games/nngs/silverado-gnugo-3.3.5-200208061810.sgf 138
+150 reg_genmove black
+#? [M3|L3]
+
+# same bug as century-2002:30
+loadsgf games/nngs/gnugo-3.3.2-Programmer-200206021522.sgf 52
+160 reg_genmove white
+#? [J14]
+
+# R9 is clearly worse than Q9.
+loadsgf games/nngs/kumu-gnugo-3.2-200205070903.sgf 116
+170 reg_genmove black
+#? [Q9]*
+
+# G17 is clearly worse than G16.
+loadsgf games/nngs/gnugo-3.3.2-mr23-200205120953.sgf 132
+180 reg_genmove white
+#? [G16]
+
+loadsgf games/nngs/joshj-gnugo-3.3.2-200205310709.sgf 86
+190 reg_genmove black
+#? [!S8]
+
+loadsgf games/nngs/joshj-gnugo-3.3.2-200205310709.sgf 124
+200 reg_genmove black
+#? [G2]
+
+loadsgf games/nngs/joshj-gnugo-3.3.2-200205310709.sgf 148
+210 reg_genmove black
+#? [F15]
+
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 54
+220 reg_genmove black
+#? [S9]*
+
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 158
+230 reg_genmove black
+#? [G17]*
+
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 160
+240 reg_genmove black
+#? [F17]*
+
+# # T18 is not very big, maybe a few points. There are clearly bigger
+# # points on the board. Removed.
+# loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 196
+# 250 reg_genmove black
+# #? [T18]*
+
+# White can't kill or make seki but black may be forced to play
+# several moves inside own territory to remove white's stones later.
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 204
+260 reg_genmove black
+#? [S18]*
+
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 206
+270 reg_genmove black
+#? [S19]
+
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 216
+280 reg_genmove black
+#? [!A13]*
+
+# B16 is maybe not playable.
+# C17 is in any case better than the game move C18.
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 220
+290 reg_genmove black
+#? [C17|B16]
+
+# Hey, Q19 is dead and Q13 doesn't threaten anything.
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 232
+300 reg_genmove black
+#? [!Q13]
+
+loadsgf games/nngs/huck-gnugo-3.3.6-200209060837.sgf 240
+310 reg_genmove black
+#? [M11]
+
+
+# problems from gnugo-3.3.8-nailer-200209190045
+
+# C10 is important enough to be saved, D10 only move.
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 34
+400 reg_genmove white
+#? [D10]
+
+# stones at C10 are critical, don't tenuki.
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 42
+410 reg_genmove white
+#? [D7]
+
+# don't get into the snap back!
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 115
+420 reg_genmove black
+#? [M15|M13]
+
+# missed vital snap back after black's mistake.
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 116
+430 reg_genmove white
+#? [M11]
+
+# all these moves should kill at least some of black stones
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 144
+440 reg_genmove white
+#? [B18|C18|E16|E18|F16|F17]*
+
+# prevent loss of four stones a couple of moves later. E16 doesn't
+# look very good, but it works.
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 170
+450 reg_genmove white
+#? [E14|D15|E16]*
+
+# black is getting to deep, time to defend.
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 196
+460 reg_genmove white
+#? [J4|K2|K3|K4|K5|L2]
+
+#CATEGORY=SEMEAI
+# K1 wins the semeai. Other moves let black get ko.
+loadsgf games/nngs/gnugo-3.3.8-nailer-200209190045.sgf 212
+470 reg_genmove white
+#? [K1]*
+
+# H4 only forces black to connect. H3 is locally more interesting, or
+# a move to secure life.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 73
+480 reg_genmove white
+#? [!H4]
+
+# R14 also helps black to connect. More interesting to play S14 or a
+# monkey jump.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 87
+490 reg_genmove white
+#? [!R14]
+
+# Bigger to kill upper right corner than C9.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 141
+500 reg_genmove white
+#? [S18]
+
+# Double sente at E8. Clearly biggest move at this time.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 189
+510 reg_genmove white
+#? [E8]*
+
+# Necessary to connect. See also connection:94
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 193
+520 reg_genmove white
+#? [D9]*
+
+# Semeai.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 205
+530 reg_genmove white
+#? [A11|B8]*
+
+# Semeai.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 211
+540 reg_genmove white
+#? [B8|B9]*
+
+# gnugo-3.3.9-nailer-200210192319 problems.
+
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192319.sgf 122
+550 reg_genmove white
+#? [!H19|F19]
+
+# The next two tests pass and perhaps don't need to be in the regressions.
+# loadsgf games/nngs/gnugo-3.3.9-nailer-200210192319.sgf 146
+# 560 reg_genmove white
+# #? [!L16]
+# 
+# loadsgf games/nngs/gnugo-3.3.9-nailer-200210192319.sgf 148
+# 570 reg_genmove white
+# #? [!F19]
+
+# See also owl1:373,374.
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192319.sgf 152
+580 reg_genmove white
+#? [N19]
+
+# We still can live.
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192319.sgf 224
+600 reg_genmove white
+#? [B5]*
diff --git a/regression/nngs3.tst b/regression/nngs3.tst
new file mode 100644 (file)
index 0000000..f405aa9
--- /dev/null
@@ -0,0 +1,572 @@
+# Lazarus-gnugo-3.1.31-200204122203.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 6
+100 reg_genmove black
+#? [Q13|P13|Q12|P12|P11|P8|P9]
+
+
+# # Retired.
+# loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 14
+# 110 reg_genmove black
+# #? [!G7]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 28
+120 reg_genmove black
+#? [M7]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 34
+130 reg_genmove black
+#? [C7|C9]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 38
+140 reg_genmove black
+#? [D9]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 44
+150 reg_genmove black
+#? [E10|D11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 52
+160 reg_genmove black
+#? [L15]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 54
+170 reg_genmove black
+#? [L15]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 62
+180 reg_genmove black
+#? [S16|R16]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 70
+190 reg_genmove black
+#? [N12]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 74
+200 reg_genmove black
+#? [P11|Q11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 76
+210 reg_genmove black
+#? [R4]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 94
+220 reg_genmove black
+#? [E11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 98
+230 reg_genmove black
+#? [!L12]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 108
+240 reg_genmove black
+#? [G13|G12]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 110
+250 reg_genmove black
+#? [G11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 114
+260 reg_genmove black
+#? [G11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 154
+270 reg_genmove black
+#? [!R2]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204122203.sgf 174
+280 reg_genmove black
+#? [!D15]
+
+
+
+
+# Lazarus-gnugo-3.1.31-200204140254.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 8
+290 reg_genmove black
+#? [H5|J5|L5|M5|N5]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 20
+300 reg_genmove black
+#? [E6|D5]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 26
+310 reg_genmove black
+#? [B5|B7|D7|C4]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 32
+320 reg_genmove black
+#? [F4]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 42
+330 reg_genmove black
+#? [P12|Q11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 46
+340 reg_genmove black
+#? [P10]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 52
+350 reg_genmove black
+#? [E12]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 56
+360 reg_genmove black
+#? [E10]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 76
+370 reg_genmove black
+#? [!G6]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 84
+380 reg_genmove black
+#? [Q9]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 90
+390 reg_genmove black
+#? [O11]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 104
+400 reg_genmove black
+#? [N13]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 134
+410 reg_genmove black
+#? [!E3]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 164
+420 reg_genmove black
+#? [R14|R15]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 176
+430 reg_genmove black
+#? [!A12]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 178
+440 reg_genmove black
+#? [!B10]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.31-200204140254.sgf 202
+450 reg_genmove black
+#? [K13]
+
+
+
+
+# Lazarus-gnugo-3.1.32-200204150316.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 22
+460 reg_genmove black
+#? [N17|M17|Q17|Q18]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 24
+470 reg_genmove black
+#? [!J17]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 32
+480 reg_genmove black
+#? [N14|O14]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 42
+490 reg_genmove black
+#? [P15]
+
+
+#This seems like a bogus problem.
+##loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 94
+##500 reg_genmove black
+###? [!N5]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 190
+510 reg_genmove black
+#? [P4]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.32-200204150316.sgf 208
+520 reg_genmove black
+#? [!N3]*
+
+
+
+
+# Lazarus-gnugo-3.1.34-200204271842.sgf problems:
+
+#####loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 24
+#####530 reg_genmove black
+######? [P13]*
+#####
+#####
+#####loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 34
+#####540 reg_genmove black
+######? [C4]*
+#####
+#####
+#####loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 42
+#####550 reg_genmove black
+######? [Q9|P13|S9|R13]*
+#####
+#####
+#####loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 62
+#####560 reg_genmove black
+######? [S7]*
+#####
+#####
+#####loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 78
+#####570 reg_genmove black
+######? [R16]*
+#####
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 122
+580 reg_genmove black
+#? [H3|J5|K3|J3]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 128
+590 reg_genmove black
+#? [!A4]
+
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204271842.sgf 182
+630 reg_genmove black
+#? [A17]
+
+
+
+
+# Lazarus-gnugo-3.1.34-200204280120.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 14
+640 reg_genmove black
+#? [F6|G5]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 16
+650 reg_genmove black
+#? [C4]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 26
+660 reg_genmove black
+#? [P8|F6|L7|M7|K7]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 32
+670 reg_genmove black
+#? [!C10]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 34
+680 reg_genmove black
+#? [!G12]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 44
+690 reg_genmove black
+#? [L6]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 54
+700 reg_genmove black
+#? [Q2]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 56
+710 reg_genmove black
+#? [Q2]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 66
+720 reg_genmove black
+#? [O11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 78
+730 reg_genmove black
+#? [!E8]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 86
+740 reg_genmove black
+#? [!F2]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 122
+750 reg_genmove black
+#? [L17|L18]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 152
+760 reg_genmove black
+#? [Q14]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 194
+770 reg_genmove black
+#? [Q9|S10]
+
+
+
+
+# Lazarus-gnugo-3.2-200205011927.sgf problems:
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 16
+780 reg_genmove black
+#? [E17]
+
+
+# FIXME: Test cases 790-860 all need revision to take the semeai in
+# the upper left corner into account. Restricted genmove would be
+# appropriate in most cases. (gf 3.3.18)
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 80
+790 reg_genmove black
+#? [D5]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 86
+800 restricted_genmove black J5 H5 G4 H4 J4 G6 G3 H3 J3 K3
+#? [G4]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 90
+810 reg_genmove black
+#? [H4]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 96
+820 reg_genmove black
+#? [!F2]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 120
+830 reg_genmove black
+#? [!N13]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 128
+840 reg_genmove black
+#? [J12|J11]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 136
+850 reg_genmove black
+#? [F9]*
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 180
+860 reg_genmove black
+#? [!O14]
+
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 232
+870 reg_genmove black
+#? [!G2]
+
+
+
+
+# gerula-gnugo-3.2-200205041756.sgf problems:
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 28
+880 reg_genmove black
+#? [Q3]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 48
+890 reg_genmove black
+#? [!B4]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 54
+900 reg_genmove black
+#? [!P16]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 56
+910 reg_genmove black
+#? [C11]*
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 58
+920 reg_genmove black
+#? [!F12]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 64
+930 reg_genmove black
+#? [!C18]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 68
+940 reg_genmove black
+#? [E13]*
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 76
+950 reg_genmove black
+#? [F15]*
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 88
+960 reg_genmove black
+#? [L8]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 146
+970 reg_genmove black
+#? [!J5]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 158
+980 reg_genmove black
+#? [!G10]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 160
+990 reg_genmove black
+#? [!O7]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 202
+1000 reg_genmove black
+#? [L17]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 216
+1010 reg_genmove black
+#? [H16|H17]
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 222
+1020 reg_genmove black
+#? [P13]*
+
+
+loadsgf games/nngs/gerula-gnugo-3.2-200205041756.sgf 232
+1030 reg_genmove black
+#? [P12|Q12]*
+
+# gnugo-3.2-merlin-200205071828.sgf problems:
+
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 40
+1040 reg_genmove white
+#? [E13|D13]*
+
+
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 64
+1050 reg_genmove white
+#? [!C14]
+
+
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 68
+1060 reg_genmove white
+#? [B12]
+
+
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 112
+1070 reg_genmove white
+#? [!L7]
+
+
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 194
+1080 reg_genmove white
+#? [!H7]
+
+
+# White must defend against a combination attack. M8 works but is only
+# a temporary measure until the M6 liberty is filled. Otherwise there
+# are a number of effective moves which only differ with respect to
+# the number and size of ko threats left behind.
+# R7 looks like the most solid alternative, with N9 as second choice.
+# We may want to add more moves as acceptable.
+loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 224
+1090 reg_genmove white
+#? [R7|N9|M8]
+
+
+# Moved to filllib:41.
+# loadsgf games/nngs/gnugo-3.2-merlin-200205071828.sgf 244
+# 1100 reg_genmove white
+# #? [!N9]*
+
+
+loadsgf games/nngs/gnugo-3.3.8-evand-200209122040.sgf 38
+1110 restricted_genmove white B7 A5
+#? [B7]
+
+loadsgf games/nngs/gnugo-3.3.8-evand-200209130704.sgf 160
+1120 reg_genmove white
+#? [!T7]
+
+loadsgf games/nngs/gnugo-3.3.8-evand-200209130704.sgf 162
+1130 reg_genmove white
+#? [S7]*
+
+# Owl mistake. Semeai module is not called.
+loadsgf games/nngs/gnugo-3.3.9-joshj-200210181607.sgf 102
+1140 reg_genmove white
+#? [B19]*
+
+# G13 is the only move. J13 pointlessly lets black have a ko.
+loadsgf games/nngs/gnugo-3.3.9-Ayoye-200209301535.sgf 76
+1150 reg_genmove white
+#? [G13]
+
+# B1 is the only move. After A4 or B4 black can play B6 and white can
+# no longer capture both A3 and B6
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192227.sgf 240
+1160 reg_genmove white
+#? [B1]*
+
+# B1 minimizes the losses.
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192227.sgf 242
+1170 reg_genmove white
+#? [B1]*
+
+# A5 is very odd.
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192227.sgf 244
+1180 reg_genmove white
+#? [A6]
+
+loadsgf games/nngs/gnugo-3.3.10-tsuku-200210241808.sgf 136
+1190 reg_genmove white
+#? [D17]
diff --git a/regression/nngs4.tst b/regression/nngs4.tst
new file mode 100644 (file)
index 0000000..fde3ffa
--- /dev/null
@@ -0,0 +1,491 @@
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 10
+10 reg_genmove white
+#? [E18]
+
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 26
+20 reg_genmove white
+#? [Q4|Q6]
+
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 36
+30 reg_genmove white
+#? [C5|C6]
+
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 46
+40 reg_genmove white
+#? [H3|F4]
+
+# upper left needs attention
+loadsgf games/nngs/evand-gnugo-3.3.11-200211151742.sgf 12
+50 reg_genmove black
+#? [J17|E14|F15|C18|B18]
+
+loadsgf games/nngs/evand-gnugo-3.3.11-200211151742.sgf 16
+60 reg_genmove black
+#? [E14|B18|C18|G18]*
+
+loadsgf games/nngs/evand-gnugo-3.3.11-200211151742.sgf 142
+70 owl_defend J11
+#? [1 (S12|S13)]
+
+loadsgf games/nngs/gnugo-3.3.12-jimm-200211261724.sgf 20
+80 restricted_genmove white M7 J6
+#? [J6]*
+
+loadsgf games/nngs/gnugo-3.3.12-jimm-200211261724.sgf 170
+90 reg_genmove white
+#? [D12|C11|E14|B12]
+
+loadsgf games/nngs/leftd-gnugo-3.3.12-200211292017.sgf 184
+100 reg_genmove black
+#? [F18|G18]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 24
+110 reg_genmove black
+#? [D17]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 38
+120 reg_genmove black
+#? [C13]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 40
+130 reg_genmove black
+#? [E14]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 60
+140 restricted_genmove black N17 R5 R4
+#? [R5|R4]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 94
+150 reg_genmove black
+#? [N3|M3]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 100
+160 reg_genmove black
+#? [K8|L8]
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 168
+170 reg_genmove black
+#? [S6]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 184
+190 reg_genmove black
+#? [T8]
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 192
+200 reg_genmove black
+#? [T6]
+
+# Make a ko threat. How about T8 or T10?
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 202
+210 reg_genmove black
+#? [!S5]
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 204
+220 reg_genmove black
+#? [!T2]
+
+# Kill the whole thing, not just a piece.
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 222
+230 reg_genmove black
+#? [Q18]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 242
+240 reg_genmove black
+#? [B4]*
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 246
+250 reg_genmove black
+#? [F7]
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 258
+260 reg_genmove black
+#? [A4]
+
+loadsgf games/nngs/saphir-gnugo-3.3.12-200212031818.sgf 292
+270 reg_genmove black
+#? [!P5]
+
+loadsgf games/nngs/aburry-gnugo-3.3.12-200212162212.sgf 32
+280 restricted_genmove black F3 H3
+#? [F3]*
+
+# See also connection:110
+loadsgf games/nngs/aburry-gnugo-3.3.12-200212162212.sgf 38
+290 restricted_genmove black H1 H6 F1
+#? [!H1]*
+
+loadsgf games/nngs/aburry-gnugo-3.3.12-200212162212.sgf 42
+300 owl_defend B4
+#? [A3|D1]*
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 22
+310 restricted_genmove black H2 D6 D7
+#? [D6|D7]*
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 40
+330 restricted_genmove black R2 M15 H15
+#? [M15|H15]*
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 76
+340 restricted_genmove black B1 D2
+#? [D2]
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 102
+350 reg_genmove black
+#? [H10]*
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 110
+360 reg_genmove black
+#? [M10]*
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 120
+370 owl_defend L18
+#? [0]
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 128
+380 reg_genmove black
+#? [J7|K8]*
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 138
+390 restricted_genmove black B8 A11
+#? [A11]
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 142
+400 owl_defend J5
+#? [0]
+
+loadsgf games/nngs/uno-gnugo-3.3.16-200302230528.sgf 174
+410 restricted_genmove black F2 E1
+#? [E1]
+
+loadsgf games/nngs/joshj-gnugo-3.3.16-200302232226.sgf 65
+420 reg_genmove black
+#? [G6]
+
+# G12 allows white to live.
+loadsgf games/nngs/joshj-gnugo-3.3.16-200302232226.sgf 185
+430 restricted_genmove black H10 G9 G10 G11 M6 L7 K7 G12 H12 F9 L12 M12
+#? [H10|G9|G10|G11|M6|L7|K7]*
+
+loadsgf games/nngs/juka-gnugo-3.3.16-200303031959.sgf 20
+440 restricted_genmove black E6 B5
+#? [E6]
+
+loadsgf games/nngs/juka-gnugo-3.3.16-200303031959.sgf 92
+450 reg_genmove black
+#? [O8]*
+
+loadsgf games/nngs/juka-gnugo-3.3.16-200303031959.sgf 204
+460 reg_genmove black
+#? [N10]*
+
+loadsgf games/nngs/looknglass-ggl-200302271041.sgf 99
+470 reg_genmove black
+#? [R8]*
+
+loadsgf games/nngs/evand-gnugo-3.3.17-200303201727.sgf 6
+480 gg_genmove black 2
+#? [R16]
+
+loadsgf games/nngs/evand-gnugo-3.3.17-200303201727.sgf 12
+485 gg_genmove black 3
+#? [D17]
+
+loadsgf games/nngs/evand-gnugo-3.3.17-200303201727.sgf 28
+487 reg_genmove black
+#? [P12]*
+
+loadsgf games/nngs/evand-gnugo-3.3.17-200303201727.sgf 38
+490 reg_genmove black
+#? [M14|N17|M16]*
+
+loadsgf games/nngs/evand-gnugo-3.3.17-200303201727.sgf 52
+510 owl_attack R8
+#? [0]
+
+#do something to help the C16 group
+loadsgf games/nngs/evand-gnugo-3.3.17-200303201727.sgf 54
+520 restricted_genmove black J8 J9 H14 F13 E13 B16 G13 J15 C14
+#? [!J8|J9]
+
+loadsgf games/nngs/gnugo-3.3.17-ylamaki-200303262305.sgf 9
+530 reg_genmove white
+#? [Q2]*
+
+loadsgf games/nngs/gnugo-3.3.17-ylamaki-200303262305.sgf 11
+540 reg_genmove white
+#? [Q2]*
+
+# New failure (3.3.18)
+loadsgf games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf 40
+550 restricted_genmove white O3 G5
+#? [O3]*
+
+# New failure (3.3.18)
+loadsgf games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf 66
+560 restricted_genmove white B13 F7
+#? [B13]*
+
+# New failure (3.3.18)
+loadsgf games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf 86
+570 reg_genmove white
+#? [F6]
+
+loadsgf games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf 88
+580 reg_genmove white
+#? [E5]
+
+loadsgf games/nngs/qly-gnugo-3.3.18-200305022134.sgf 70
+590 reg_genmove black
+#? [E2]*
+
+#New failure (3.3.20)
+#gnugo should do something about the O11 dragon
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 124
+600 reg_genmove white
+#? [L9|L12|L10]
+
+#New failure (3.3.20)
+#C13 looks correct here /evand
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 144
+610 reg_genmove white
+#? [C13|D13]
+
+#New failure (3.3.20)
+#pull out the stones /evand
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 152
+620 reg_genmove white
+#? [G13|G14]
+
+# See also connection:128
+loadsgf games/nngs/evand-gnugo-3.3.21-200306130638.sgf 156
+630 reg_genmove black
+#? [B6]
+
+#unneeded.  Take a big point somewhere.
+loadsgf games/nngs/kit-gnugo-3.3.21-200306181940.sgf 16
+640 reg_genmove black
+#? [!R7]*
+
+loadsgf games/nngs/kit-gnugo-3.3.21-200306181940.sgf 42
+650 reg_genmove black
+#? [Q2]
+
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 4
+660 reg_genmove black
+#? [O16]
+
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 12
+670 reg_genmove black
+#? [O14]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 52
+680 reg_genmove black
+#? [P9]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 64
+690 reg_genmove black
+#? [N6]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 74
+700 reg_genmove black
+#? [K7]*
+
+#don't tenuki
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 88
+710 reg_genmove black
+#? [J3|H7|G5|H3|G6]*
+
+#play something local and helpful; H11 is bad
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 190
+720 reg_genmove black
+#? [B15|B16|B17]*
+
+# See also owl1:379.
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 194
+730 reg_genmove black
+#? [C17]
+
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 220
+740 reg_genmove black
+#? [D2]
+
+#Gnugo 3.4 played at D5, then black happily answered at C6
+#C7 simply restricted the move of C5 and prevent black to
+#build territory on left side.
+
+loadsgf games/nngs/gnugo-3.4-nailer-200308230714.sgf 32
+750 reg_genmove white
+#? [C7]*
+
+loadsgf games/nngs/joshj-gnugo-3.5.2-200312100558.sgf 14
+760 reg_genmove black
+#? [Q15]
+
+#something better than Q14
+loadsgf games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf 30
+770 reg_genmove white
+#? [Q2|C13|L3|L4|K4|F16|F17]
+
+loadsgf games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf 40
+780 restricted_genmove white F15 F16 F17 C13
+#? [!F15]*
+
+loadsgf games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf 66
+790 reg_genmove white
+#? [E15]*
+
+#the cut is not yet dangerous
+loadsgf games/nngs/gnugo-3.5.2gf1-vincentkuo-200312162312.sgf 194
+800 reg_genmove white
+#? [E4]
+
+# dr test removed 2004-12-13 same time as pattern Fuseki1000 
+#         aka pre 0x0ed9073c / post 0x319ca3dd was reinserted
+# #O5 is bad
+# loadsgf games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf 8
+# 810 reg_genmove white
+# #? [D10|K4|K3|R6|Q6|Q2]
+
+#some kind of base for the invasion is urgent
+loadsgf games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf 20
+820 reg_genmove white
+#? [Q12]*
+
+#K14 fails
+loadsgf games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf 104
+830 owl_defend J12
+#? [1 L15]*
+
+#save the big dragon
+#owl sees it, but the move doesn't get valued (as of 3.5.2)
+loadsgf games/nngs/gnugo-3.5.2gf1-thi-200312210524.sgf 158
+840 reg_genmove white
+#? [T13]*
+
+#something vaguely related to the cut would be good
+loadsgf games/nngs/GoFuN-gnugo-3.5.2gf1-200312230328.sgf 12
+850 reg_genmove black
+#? [M10|J10|L7|K7|K8|G7|G8|H8]*
+
+#last chance to defend
+loadsgf games/nngs/GoFuN-gnugo-3.5.2gf1-200312230328.sgf 20
+860 reg_genmove black
+#? [J10]*
+
+loadsgf games/nngs/GoFuN-gnugo-3.5.2gf1-200312230328.sgf 74
+870 reg_genmove black
+#? [C3|C4|D3]
+
+#M17 is bad; deal with one of the important groups
+loadsgf games/nngs/gnugo-3.5.2gf1-guest-200312260740.sgf 22
+880 reg_genmove white
+#? [O4|O5|R3|P3|R12|R11|O14|P13]*
+
+loadsgf games/nngs/gnugo-3.5.2gf1-guest-200312260740.sgf 34
+890 reg_genmove white
+#? [!B18]
+
+loadsgf games/nngs/chuck-gnugo-3.5.2gf1-200312261847.sgf 88
+900 reg_genmove black
+#? [!Q18]*
+
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200401072036.sgf 48
+910 owl_attack M11
+#? [0]*
+
+#something other than D8
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 8
+920 reg_genmove white
+#? [E3|E4|F3|Q4|O4|R14|J3]*
+
+#high approach (O16) is bad here
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 12
+930 reg_genmove white
+#? [O17|R14|Q4]
+
+#defend the top group
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 18
+940 reg_genmove white
+#? [M17|L17]*
+
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 50
+950 reg_genmove white
+#? [D9|D7|D10|C9]*
+
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 52
+960 reg_genmove white
+#? [D7|E10|C8]
+
+#game move at L13 is awful
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 60
+970 reg_genmove white
+#? [E6|E5|C6]*
+
+loadsgf games/nngs/gnugo-3.5.3-Scorpion-200401080502.sgf 78
+980 reg_genmove white
+#? [!E5]
+
+loadsgf games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf 10
+990 reg_genmove white
+#? [R16|R15|Q15]
+
+loadsgf games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf 22
+1000 reg_genmove white
+#? [F14|F15|D15|D14]*
+
+loadsgf games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf 28
+1010 reg_genmove white
+#? [K13]*
+
+#something better than C13
+loadsgf games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf 34
+1020 reg_genmove white
+#? [G13]*
+
+loadsgf games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf 78
+1030 restricted_genmove white R13 N11
+#? [N11]*
+
+#S12 seems to live in ko
+loadsgf games/nngs/gnugo-3.5.3-JanErik-200401081615.sgf 90
+1040 restricted_genmove white T13 S12
+#? [S12]
+
+loadsgf games/nngs/ccwills-gnugo-3.5.3-200401100810.sgf 55
+1050 reg_genmove black
+#? [O9|O10]*
+
+#O6 is pointless
+loadsgf games/nngs/ccwills-gnugo-3.5.3-200401100810.sgf 73
+1060 reg_genmove black
+#? [N9]*
+
+loadsgf games/nngs/gnugo-3.5.3-dbr-200401121534.sgf 26
+1070 restricted_genmove white B3 C8 C10 B10 D6 D14 F16
+#? [C8]*
+
+#Q18 is very bad
+loadsgf games/nngs/gnugo-3.5.3-dbr-200401121534.sgf 83
+1080 reg_genmove white
+#? [!Q18]
+
+#not H4
+loadsgf games/nngs/gnugo-3.5.5-liza-200404251738.sgf 6
+1090 reg_genmove white
+#? [O3|D5|C5|C6|O16|O17|P16|P17|C9]*
+
+
+loadsgf games/nngs/gnugo-3.5.5-liza-200404251750.sgf 108
+1100 reg_genmove white
+#? [J7]*
+
+#I think the big dragon is critical. /ab
+loadsgf games/nngs/gnugo-3.5.5-liza-200404251750.sgf 176
+1110 reg_genmove white
+#? [S9|Q8|P8|P9]*
+
+
+loadsgf games/nngs/gnugo-3.5.5-liza-200404251750.sgf 196
+1120 reg_genmove white
+#? [N7]*
diff --git a/regression/olympiad2004.tst b/regression/olympiad2004.tst
new file mode 100644 (file)
index 0000000..8df2abb
--- /dev/null
@@ -0,0 +1,277 @@
+# Q12 might be playable after all but it's very unorthodox and it
+# would be preferrable if GNU Go played some more normal fuseki move.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 5
+1 restricted_genmove black Q12 E3 E4
+#? [E3|E4]
+
+# G14 looks more natural than the played move at G12.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 65
+2 restricted_genmove black G14 G12
+#? [G14]
+
+# Q10 looks too small and overly conservative. There are many
+# larger moves on the board.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 79
+3 reg_genmove black
+#? [!Q10]
+
+# N16 does connect but completely misses the point. GNU Go would win
+# big by just making sure that the thrashing white group in the center
+# doesn't spring to life.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 127
+4 reg_genmove black
+#? [G10|G9|G8|G7|J7|J6|K7|H7]*
+
+# M15 is again too small. Subduing the big thrashing white dragon must
+# have priority.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 135
+5 reg_genmove black
+#? [F11|F10|G10|E10|E9|E11|G7|F8]
+
+# The focus must still be on the left. N18 is big but not big enough.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 141
+6 reg_genmove black
+#? [D11|H9|F10]*
+
+# P18 looks at best like a questionable followup to N18. Playing on
+# the left is urgent.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 143
+7 reg_genmove black
+#? [D14|D11]*
+
+# Better capture than connect.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 161
+8 restricted_genmove black D10 C8
+#? [C8]
+
+# E15 only threatens to make an eye in gote. Locally F15 is a better
+# option but most natural is to block at B15 to secure two eyes and
+# limit white's thrashing potential.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 179
+9 reg_genmove black
+#? [B15]*
+
+# Regardless whether the semeai still can be won after C14, blocking
+# at B15 is the natural and much easier way to live locally and
+# definitely win the semeai.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 183
+10 reg_genmove black
+#? [B15]
+
+# T17 is totally meritless compared to any of the local alternatives.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 203
+11 restricted_genmove black T17 S19 R19 O14 O13 S14
+#? [S19|R19|O14|O13|S14]*
+
+# L9 is zero points gote.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 223
+12 restricted_genmove black L9 F7
+#? [F7]*
+
+# A7 solves the tactical problem as well as B10 but also splits the
+# eyespace into two parts.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 235
+13 reg_genmove black
+#? [A7]*
+
+# T14 is bigger than T4/T5.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 249
+14 reg_genmove black
+#? [T14]*
+
+# G18 is locally bigger than J19.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 281
+15 restricted_genmove black J19 G18
+#? [G18]*
+
+# Since white can get a ko after C11, it is necessary to first settle
+# the semeai.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 287
+16 reg_genmove black
+#? [A7|A6|E4|A5]
+
+# The semeai still needs settling. White can live or get a ko for the
+# life and death of both by the combination of A1 and A7, followed by
+# D4.
+loadsgf games/olympiad2004/19x19/gnu-ind.sgf 289
+17 reg_genmove black
+#? [A7|A6|E4|A5]
+
+# Force black into bad shape or allowing a ponnuki.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 8
+101 reg_genmove white
+#? [E2]*
+
+# Force black into bad shape or allowing a ponnuki.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 10
+102 reg_genmove white
+#? [E2]
+
+# C18 is mandatory after D18
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 18
+103 reg_genmove white
+#? [C18]
+
+# Must at least settle the shape (in sente) before tenuki.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 20
+104 reg_genmove white
+#? [D14]*
+
+# Can't tenuki before connecting. Forcing with T17 is also okay.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 28
+105 reg_genmove white
+#? [O17|N17|T17]
+
+# K4 is overconcentrated. Which moves more than D14 are good here?
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 42
+106 restricted_genmove white D14 K4
+#? [D14]*
+
+# With the black stone at R9, R6 is locally better than Q6.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 46
+107 restricted_genmove white Q6 R6
+#? [R6]*
+
+# P3 does not look urgent here.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 50
+108 reg_genmove white
+#? [!P3]
+
+# First live on the left edge.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 60
+109 reg_genmove white
+#? [C10]*
+
+# B10 not sufficient to live.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 62
+110 reg_genmove white
+#? [!B10]
+
+# B11 not sufficient to live.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 64
+111 reg_genmove white
+#? [!B11]
+
+# T13 is an overplay. T14 works better and also solves the problem
+# with bad aji in the upper right corner.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 96
+112 reg_genmove white
+#? [T14]*
+
+# Q10 does not make much good. More interesting to play some move in
+# the center.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 104
+113 reg_genmove white
+#? [!Q10]
+
+# K19 is an overplay. After black M18 white has to abandon K19 or risk
+# a ko in the corner.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 110
+114 restricted_genmove white K19 M18
+#? [M18]*
+
+# T18 dies right out if white finds the killing move at R19. P19 and
+# R19 both live, but K19 and M19 must be sacrificed. N19 lives with
+# everything except T17 and possibly T19, which are less important.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 114
+115 reg_genmove white
+#? [N19]*
+
+# M3 is not necessary. Blocking in the center is big.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 132
+116 reg_genmove white
+#? [H8]*
+
+# G10 is locally clearly better than G9 as it threatens to cut.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 162
+117 restricted_genmove white G9 G10
+#? [G10]*
+
+# Can't just give up the ko. T16 and L17 should be big enough ko
+# threats. G5 might be barely big enough as well.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 170
+118 reg_genmove white
+#? [T16|L17|M17|G5]*
+
+# O15 is bigger than H4.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 178
+119 restricted_genmove white H4 O15
+#? [O15]
+
+# N13 is worthless.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 194
+120 restricted_genmove white N13 M12
+#? [M12]*
+
+# H6 is completely worthless. The other atari is clearly better.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 196
+121 restricted_genmove white H6 G5
+#? [G5]
+
+# The ko can at least be captured once before connecting.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 202
+122 restricted_genmove white C6 E7
+#? [C6]*
+
+# We are ahead. Even if owl misreads, the thrashing dragon
+# suppression should generate a move at L3 or K3.
+# See also owl1:355,356.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 242
+123 reg_genmove white
+#? [K3|L3|L1]
+
+# More important to build towards center than closing off edge.
+loadsgf games/olympiad2004/19x19/gnu-int.sgf 67
+201 restricted_genmove black C11 E11 E12
+#? [E11]*
+
+# Really bad shape at G7.
+loadsgf games/olympiad2004/19x19/gnu-int.sgf 113
+202 restricted_genmove black G7 G8
+#? [G8]
+
+# O10 protects against both cuts!
+loadsgf games/olympiad2004/19x19/gnu-int.sgf 205
+203 restricted_genmove black M13 O10
+#? [O10]*
+
+# Black will break through somewhere after D4.
+loadsgf games/olympiad2004/9x9/gnu-int.sgf 9
+301 reg_genmove black
+#? [D4]*
+
+# H6 is bigger than J7.
+loadsgf games/olympiad2004/9x9/int-gnu.sgf 42
+401 reg_genmove white
+#? [H6]*
+
+# Better to allow G7 to get cut off than E3.
+loadsgf games/olympiad2004/9x9/gnu-mag.sgf 9
+501 reg_genmove black
+#? [F3]
+
+# Hane at A6 leads nowhere. The clamp at B5 has more potential.
+# The cut at C6 is captured right out in a ladder.
+loadsgf games/olympiad2004/9x9/gnu-mag.sgf 25
+502 restricted_genmove black A6 B5 C6
+#? [B5]*
+
+# Wrong atari. F6 is better than E7.
+loadsgf games/olympiad2004/9x9/gnu-mag.sgf 35
+503 restricted_genmove black E7 F6
+#? [F6]*
+
+# F6 really bad shape.
+loadsgf games/olympiad2004/9x9/gnu-dbg.sgf 11
+601 restricted_genmove black F7 F6 H4 G3
+#? [F7|H4|G3]
+
+# G6 about as bad shape as one can get. E6 has more promise.
+loadsgf games/olympiad2004/9x9/gnu-dbg.sgf 23
+602 reg_genmove black
+#? [E6]*
+
+# Always connect from the secure end. A1 goes before A4.
+loadsgf games/olympiad2004/9x9/gnu-dbg.sgf 63
+603 reg_genmove black
+#? [A1]*
diff --git a/regression/optics.tst b/regression/optics.tst
new file mode 100644 (file)
index 0000000..e2000c8
--- /dev/null
@@ -0,0 +1,217 @@
+# Eyes of size 1
+loadsgf games/eyes1.sgf
+101 eval_eye A1
+#? [1 1]
+102 eval_eye C1
+#? [1 1]
+103 eval_eye G1
+#? [0 1 F1 F1]
+104 eval_eye L1
+#? [0 1 K2 K2]
+105 eval_eye P1
+#? [0 0]
+106 eval_eye A4
+#? [0 0]
+107 eval_eye C6
+#? [0 0]
+108 eval_eye F7
+#? [0 0]
+109 eval_eye H9
+#? [1 1]
+110 eval_eye E9
+#? [0 1 D10 D10]
+111 eval_eye A10
+#? [1 1]
+
+# Eyes of size 2
+loadsgf games/eyes2.sgf
+201 eval_eye A1
+#? [1 1]
+202 eval_eye F1
+#? [1 1]
+203 eval_eye L1
+#? [1 1]
+204 eval_eye Q1
+#? [1 1]
+205 eval_eye T1
+#? [1 1]
+206 eval_eye A4
+#? [1 1]
+207 eval_eye F3
+#? [1 1]
+208 eval_eye L3
+#? [0 0]
+209 eval_eye O4
+#? [1 1]
+210 eval_eye G6
+#? [1 1]
+211 eval_eye C7
+#? [0 1 D7 D7]
+212 eval_eye A7
+#? [0 1 B9 B9]
+213 eval_eye A12
+#? [0 1 A13 A13]
+214 eval_eye O9
+#? [0 0]
+215 eval_eye O13
+#? [0 0]
+
+# Eyes of size 3
+loadsgf games/eyes3.sgf
+301 eval_eye A1
+#? [1 2 A1 A1]
+302 eval_eye F1
+#? [1 2 G1 G1]
+303 eval_eye M1
+#? [1 1]
+304 eval_eye S19
+#? [1 2 S18 S18]
+305 eval_eye T7
+#? [1 1]
+306 eval_eye A6
+#? [2 2]
+307 eval_eye A10
+#? [1 2 A9 A9]
+308 eval_eye T1
+#? [2 2]
+309 eval_eye R4
+#? [2 2]
+310 eval_eye N3
+#? [0 1 N5 N5]
+311 eval_eye J5
+#? [1 1]
+312 eval_eye G5
+#? [0 1 G6 G6]
+313 eval_eye C6
+#? [1 2 C6 C6]
+314 eval_eye C9
+#? [2 2]
+315 eval_eye A12
+#? [1 1]
+316 eval_eye A14
+#? [1 1]
+317 eval_eye B19
+#? [1 2 B18 B18]
+318 eval_eye D19
+#? [1 2 D18 D18]
+319 eval_eye C16
+#? [1 1]
+320 eval_eye E15
+#? [1 1]
+321 eval_eye F19
+#? [0 1 J18 J18]
+322 eval_eye F17
+#? [0 2 G17 G17]
+323 eval_eye O19
+#? [1 1]
+324 eval_eye K13
+#? [1 1]
+325 eval_eye L10
+#? [0 0]
+326 eval_eye P8
+#? [1 1]
+327 eval_eye T14
+#? [0 0]
+328 eval_eye O16
+#? [0 1 (N16|N13) N16]
+
+# False margins of various shapes and sizes
+loadsgf games/marginal.sgf
+1001 eval_eye L19
+#? [1 1]
+1002 eval_eye O1
+#? [1 1]
+1003 eval_eye T8
+#? [1 1]
+1004 eval_eye A12
+#? [1 1]
+1005 eval_eye F8
+#? [1 1]
+1006 eval_eye P6
+#? [1 1]
+1007 eval_eye Q9
+#? [1 1]
+1008 eval_eye D11
+#? [2 2]
+1009 eval_eye E6
+#? [1 1]
+1010 eval_eye K11
+#? [0 0]
+1011 eval_eye S19
+#? [1 1]*
+1012 eval_eye C1
+#? [1 1]*
+1013 eval_eye O16
+#? [1 2 G16 L16]*
+
+# incident 73
+# This is a problem with make_domains(). The position is a seki.
+# FIXME: Is "2 2" correct response for a seki?
+loadsgf games/incident73.sgf 210
+1101 eval_eye T10
+#? [2 2]*
+
+loadsgf games/incident73.sgf 212
+1201 eval_eye T10
+#? [1 2 T8 T8]*
+
+# incident 97
+loadsgf games/incident97.sgf 175
+1301 eval_eye S11
+#? [1 2 S11 (S11|S13)]
+
+# incident 198
+loadsgf games/incident198.sgf 54
+1401 eval_eye J4
+#? [0 1 H5 H5]
+
+# incident 212
+loadsgf games/incident211.sgf 26
+1501 eval_eye H8
+#? [1 2 H8 H8]*
+
+# incident 238
+loadsgf games/incident238.sgf 252
+1601 eval_eye E16
+#? [1 1]
+
+# Edge and corner eyes different from center eyes.
+loadsgf games/eyes_edge.sgf
+1701 eval_eye C1
+#? [1 1]
+1702 eval_eye J2
+#? [1 1]
+1703 eval_eye T3
+#? [1 1]
+1704 eval_eye Q19
+#? [1 1]
+1705 eval_eye A19
+#? [1 2 A18 A18]
+
+# Eye spaces with ko contingent margins.
+# Either min or max in these depends on ko.
+loadsgf games/marginal_ko.sgf
+1801 eval_eye A19
+#? [0 1 (A19|B17) B17]
+1802 eval_eye B17
+#? [0 1 (A19|B17) A19]
+1803 eval_eye N17
+#? [1 1]
+1804 eval_eye J12
+#? [1 1]
+1805 eval_eye A13
+#? [0 1 B12 B12]
+1806 eval_eye A8
+#? [1 1]
+1807 eval_eye F7
+#? [1 2 F11 (F11|H8|F8)]
+1808 eval_eye O7
+#? [0 1 (M6|Q8) (M6|Q8)]
+1809 eval_eye N12
+#? [0 1 (O11 O11)]
+1810 eval_eye A1
+#? [0 1 B2 B2]
+1811 eval_eye H1
+#? [1 2 (J1|L2) J1]
+1812 eval_eye S1
+#? [0 1 R2 R2]
diff --git a/regression/owl.tst b/regression/owl.tst
new file mode 100644 (file)
index 0000000..d7aaf9e
--- /dev/null
@@ -0,0 +1,953 @@
+# incident 66
+loadsgf games/incident66.sgf 52
+1 owl_attack D8
+#? [1 (F8|E8|E9)]
+2 owl_defend D8
+#? [1 E9]
+
+# incident 85
+loadsgf games/incident85.sgf 104
+3 owl_attack B11
+#? [1 (C12|B14)]
+4 owl_defend B11
+#? [1 C12]
+
+# incident 159
+# Recent analysis has shown that white actually cannot live.
+# After white B5, black can kill with
+# Black C4 - B4 - B2,
+# a) W A2 - B1 - C1 - B3 - A3 - A5
+# b) W B1 - B2 - B6 - A6
+# The attack test has been commented out. (3.5.1)
+loadsgf games/incident156.sgf 246
+# 5 owl_attack C3
+# #? [1 (B4|C4)]
+6 owl_defend C3
+#? [0]*
+
+# incident 160
+loadsgf games/incident156.sgf 250
+7 owl_attack C3
+#? [1 (B4|B5)]
+8 owl_defend C3
+#? [1 B5]
+
+loadsgf games/incident156.sgf 249
+9 owl_attack C3
+#? [1 (B4|B2)]
+10 owl_defend C3
+#? [1 A2]
+
+# incident 236 (slightly modified)
+loadsgf games/incident236.sgf 116
+11 owl_attack P5
+#? [0]
+12 owl_defend P5
+#? [1 (PASS|P6)]
+
+# incident 237
+loadsgf games/incident237.sgf 42
+13 owl_attack A4
+#? [0]
+
+# incident 235
+loadsgf games/incident235.sgf 110
+14 owl_attack Q4
+#? [1 (Q1|S2)]
+15 owl_defend Q4
+#? [1 S2]
+
+# incident 234
+loadsgf games/incident234.sgf 164
+16 owl_attack C18
+#? [1 A18]
+17 owl_defend C18
+#? [1 (A18|C19|E19)]
+
+# The attack at B2 only gives ko. A2 looks more effective.
+loadsgf games/owl01.sgf
+18 owl_attack C3
+#? [1 A2]
+19 owl_defend C3
+#? [1 A2]
+
+# incident 131
+loadsgf games/incident121.sgf 110
+20 owl_attack B3
+#? [1 E2]
+21 owl_defend B3
+#? [1 F2]
+
+# incident 133
+loadsgf games/incident121.sgf 122
+22 owl_attack P12
+#? [1 (PASS|S11|S14|N13|S13)]
+23 owl_defend P12
+#? [0]
+
+# incident 154
+loadsgf games/incident153.sgf 205
+24 owl_attack F3
+#? [1 (J3|F2|F1)]
+25 owl_defend F3
+#? [1 F1]
+
+# incident 161
+# tm added C9 option to kill.
+loadsgf games/incident161.sgf 38
+26 owl_attack B8
+#? [1 (B7|C7|C9|PASS)]
+27 owl_defend B8
+#? [0]
+
+# incident 162
+loadsgf games/incident161.sgf 42
+28 owl_attack B8
+#? [1 C7]
+29 owl_defend B8
+#? [1 C7]
+30 owl_attack D8
+#? [1 C7]
+31 owl_defend D8
+#? [1 C7]
+
+# incident 189
+loadsgf games/incident189.sgf 180
+32 owl_attack J19
+#? [0]
+
+# incident 198
+loadsgf games/incident198.sgf 54
+33 owl_attack G5
+#? [1 H5]
+34 owl_defend G5
+#? [1 H5]
+
+# incident 201
+loadsgf games/incident201.sgf 271
+35 owl_attack O18
+#? [1 P19]
+36 owl_defend O18
+#? [1 Q19]
+
+# incident 213
+loadsgf games/incident211.sgf 40
+37 owl_attack G7
+#? [1 (PASS|F7|F6)]
+38 owl_defend G7
+#? [0]
+
+loadsgf games/incident211.sgf 39
+39 owl_attack G7
+#? [1 G8]
+40 owl_defend G7
+#? [1 G8]
+
+# incident 218
+loadsgf games/incident218.sgf 136
+41 owl_attack E4
+#? [1 F1]
+42 owl_defend E4
+#? [1 (F1|D1|B1)]
+
+# incident 239
+# reading code finds B1 but owl code is not very ko-aware
+loadsgf games/incident239.sgf 58
+43 owl_attack A3
+#? [1 B1]
+44 owl_defend A3
+#? [1 A5]
+
+loadsgf games/owl02.sgf
+# note the dragons B3 and F2 are not amalgamated
+45  owl_attack B3
+#? [1 (E3|F1)]
+46 owl_defend B3
+#? [1 (F1|B1|D2|E3|E1)]
+47  owl_attack F2
+#? [1 (E3|F1)]
+48 owl_defend F2
+#? [1 (F1|B1|D2|E1)]
+
+# incident 240
+# a good lunch example
+loadsgf games/incident240.sgf 65
+49 owl_attack C6
+#? [0]
+
+loadsgf games/owl03.sgf
+# Gets it right if one more liberty (i.e. remove B17)
+50 owl_attack D19
+#? [1 E19]
+51 owl_defend D19
+#? [1 (E19|B19)]
+
+loadsgf games/owl04.sgf
+52 owl_attack Q7
+#? [1 S1]
+53 owl_defend Q7
+#? [1 S1]
+
+# incident 199
+loadsgf games/incident199.sgf 42
+54 owl_attack F4
+#? [1 (H2|J2)]
+55 owl_defend F4
+#? [1 (H2|G2)]
+
+# incident 202
+# This is possibly more of a semeai problem. Subtle!
+loadsgf games/incident201.sgf 297
+56 owl_attack M19
+#? [1 (Q19|T13)]
+57 owl_defend M19
+#? [1 (T13|N19)]*
+58 owl_attack T19
+#? [1 (T13|N19)]
+59 owl_defend T19
+#? [1 (Q19|T13)]
+
+# incident 91
+loadsgf games/incident91.sgf 68
+60 owl_attack S3
+#? [1 (S2|S1|T2)]
+61 owl_defend S3
+#? [1 S2]
+
+# incident 75
+loadsgf games/incident74.sgf 238
+62 owl_attack C4
+#? [1 (B4|B5)]
+
+# incident 253
+loadsgf games/incident253.sgf 77
+63 owl_defend R14
+#? [1 R9]
+
+# incident 254
+loadsgf games/incident254.sgf 147
+64 owl_defend D16
+#? [0]
+
+# incident 256
+# Dragon amalgamation is a problem here.
+loadsgf games/incident256.sgf 157
+65 owl_defend O9
+#? [1 M11]
+
+# incident 258
+# It's possible that this defense does in fact not work, but then
+# there's some mistake during the following moves.
+loadsgf games/incident258.sgf 147
+66 owl_defend C4
+#? [1 B5]
+
+# incident 260
+loadsgf games/incident258.sgf 283
+67 owl_attack B19
+#? [1 H19]
+68 owl_defend B19
+#? [1 D19]
+
+# incident 261
+loadsgf games/incident261.sgf 108
+69 owl_defend M12
+#? [1 N7]
+
+# incident 263
+loadsgf games/incident263.sgf 32
+70 owl_attack M4
+#? [1 (J2|K2|N2)]
+71 owl_defend M4
+#? [1 (J2|O2)]
+
+# incident 264
+loadsgf games/incident263.sgf 116
+72 owl_defend D13
+#? [1 C14]
+
+# incident 265
+# see also test 134
+# R18 is refuted by S17
+loadsgf games/incident263.sgf 302
+73 owl_defend S14
+#? [1 (R17|S18|T14)]
+
+# incident 266
+loadsgf games/incident263.sgf 304
+74 owl_defend S14
+#? [1 (R18|S18|T14|R17)]
+
+# incident 268
+loadsgf games/incident267.sgf 54
+75 owl_defend B6
+#? [0]
+
+# incident 289
+loadsgf games/incident287.sgf 251
+76 owl_attack P12
+#? [1 (O10|N13)]
+
+# incident 105
+loadsgf games/incident104.sgf 169
+77 owl_defend J19
+#? [1 J13]
+
+# More of a semeai problem.
+loadsgf games/incident114.sgf 82
+78 owl_attack D7
+#? [0]
+
+# incident 293
+# M5 is clearly inferior, as is L5. 
+loadsgf games/incident291.sgf 86
+79 owl_defend K4
+#? [1 (M6|L6|L7)]
+
+# incident 297
+loadsgf games/incident297.sgf 95
+80 owl_attack G5
+#? [1 J2]
+
+loadsgf games/strategy5.sgf 40
+81 owl_attack R6
+#? [0]
+
+loadsgf games/strategy5.sgf 40
+82 owl_defend R6
+#? [1 .+]
+
+loadsgf games/strategy7.sgf 23
+83 owl_defend B3
+#? [1 (A4|A2|B1)]
+
+loadsgf games/nicklas/nicklas8.sgf 78
+84 owl_attack C17
+#? [1 (B17|B18|C18)]
+85 owl_defend C17
+#? [1 (B17|B18|C18)]
+
+loadsgf games/nicklas/nicklas8.sgf 96
+86 owl_attack Q13
+#? [!1 T13]
+87 owl_attack P15
+#? [1 P16]
+
+loadsgf games/owl05.sgf 238
+88 owl_attack D19
+#? [1 (F18|H19)]
+89 owl_defend D19
+#? [1 (F18|H19)]
+
+loadsgf games/owl06.sgf
+90 owl_defend C8
+#? [0]
+
+loadsgf games/strategy5.sgf 40
+91 owl_attack Q18
+#? [0]
+
+loadsgf games/strategy11.sgf 93
+92 owl_attack B3
+#? [1 (A2|H1|C1)]
+93 owl_defend B3
+#? [1 (A2|C1)]
+
+loadsgf games/strategy11.sgf 245
+94 owl_attack B3
+#? [1 E1]
+95 owl_defend B3
+#? [1 (E1|J1)]
+
+loadsgf games/incident42.sgf 284
+96 owl_attack N18
+#? [1 Q11]
+97 owl_defend N18
+#? [1 Q11]
+
+loadsgf games/owl07.sgf
+98 owl_attack B18
+#? [1 (A18|F19|B19)]
+99 owl_defend B18
+#? [1 A18]
+
+loadsgf games/strategy14.sgf 53
+100 owl_attack Q18
+#? [1 S16]
+101 owl_defend Q18
+#? [1 S15]
+
+loadsgf games/strategy14.sgf 81
+102 owl_attack Q6
+#? [1 P6]
+103 owl_defend Q6
+#? [1 (P6|S5)]
+
+# The best attack seems to involve a ko. There's also a strange
+# variation starting with white A16 that leads to a genuine triple ko.
+# In fact this is more of a semeai problem but is included here to
+# make sure that the owl code doesn't try to attack with the
+# suicidal C9 move.
+loadsgf games/strategy14.sgf 211
+104 owl_attack B12
+#? [!1 C9]
+
+loadsgf games/owl08.sgf
+105 owl_attack C4
+#? [0]
+
+loadsgf games/owl09.sgf
+106 owl_attack F6
+#? [1 (B2|E1)]
+107 owl_defend F6
+#? [1 B2]
+
+loadsgf games/jahy.sgf 36
+# B4 is preferred since C4 may become ko
+108 owl_attack C3
+#? [1 (B4|C4)]
+109 owl_defend C3
+#? [1 (B5|C4)]*
+
+# incident 287
+loadsgf games/incident287.sgf 103
+110 owl_defend F3
+#? [1 (B2|D1|C3)]
+
+# incident 177 (from the disastrous Indigo game)
+loadsgf games/incident169.sgf 184
+111 owl_attack A17
+#? [1 F14]*
+112 owl_defend A17
+#? [1 (F14|M16)]
+
+# incident 178 (from the disastrous Indigo game)
+# Possibly more of a semeai problem.
+loadsgf games/incident169.sgf 210
+113 owl_attack L2
+#? [1 K2]
+114 owl_defend L2
+#? [1 K2]
+
+loadsgf games/ko1.sgf
+115 owl_attack L5
+#? [2 (L1|H1)]*
+116 owl_defend L5
+#? [1 L1]
+
+loadsgf games/owl10.sgf
+117 owl_attack N11
+#? [1 (G12|L14|N13)]
+
+loadsgf games/owl11.sgf 126
+118 owl_attack H5
+#? [0]*
+
+loadsgf games/strategy18.sgf
+119 owl_attack G6
+#? [1 (D4|E6|F6|F5|H6|J5|H5)]
+120 owl_defend G6
+#? [1 E6]
+
+loadsgf games/strategy17.sgf
+121 owl_attack K19
+#? [0]
+
+loadsgf games/strategy20.sgf 236
+122 owl_attack B6
+#? [1 (A6|A5|A4|A3|B1|C5)]
+# The defense at B1 doesn't work due to black A6.
+123 owl_defend B6
+#? [1 C5]*
+
+loadsgf games/strategy21.sgf 96
+124 owl_defend F4
+#? [1 H2]
+
+loadsgf games/incident108b.sgf 178
+125 owl_attack P16
+#? [1 P15]
+
+loadsgf games/owl12.sgf
+126 owl_attack J12
+#? [1 (K7|K8|L8|L7)]
+127 owl_defend J12
+#? [1 L8]
+
+loadsgf games/owl13.sgf 130
+128 owl_attack P19
+#? [1 (S18|T18|T19|P17)]
+129 owl_defend P19
+#? [1 T18]
+
+loadsgf games/owl14.sgf 250
+130 owl_attack B11
+#? [1 A10]
+131 owl_defend B11
+#? [1 A10]
+
+loadsgf games/owl15.sgf
+132 owl_attack Q3
+#? [(1|2) R4]*
+133 owl_defend O3
+#? [1 M3]
+
+# see also test 73
+loadsgf games/incident263.sgf 302
+134 owl_attack S14
+#? [1 (S17|S18)]
+
+loadsgf games/owl16.sgf
+# attack at N17 almost works
+135 owl_attack O18
+#? [0]
+
+# Actually, white is alive.  If black F14, white B12 lives.
+loadsgf games/owl17.sgf
+136 owl_attack D15
+#? [0]
+
+loadsgf games/incident96.sgf 71
+137 owl_attack B4
+#? [1 (E2|B1)]
+# J5 seems to work but is inferior to E2 since it loses a point and
+# some aji.
+138 owl_defend B4
+#? [1 E2]
+
+loadsgf games/nicklas/nicklas19.sgf 60
+139 owl_attack H8
+#? [1 (G9|H9|J8|J7)]
+140 owl_defend H8
+#? [1 (H9|J8|J9)]
+
+loadsgf games/nicklas/nicklas19.sgf 61
+141 owl_attack H8
+#? [3 J8]
+142 owl_defend H8
+#? [1 (H9|J8|J9|H7|J7)]
+
+loadsgf games/nicklas/nicklas19.sgf 62
+143 owl_attack H8
+#? [1 H7]
+144 owl_defend H8
+#? [2 H7]
+
+loadsgf games/nicklas/nicklas19.sgf 63
+145 owl_attack H8
+#? [3 H9]
+146 owl_defend H8
+#? [1 (H9|J7)]
+
+loadsgf games/owl18.sgf 140
+147 owl_attack E13
+#? [1 A5]
+148 owl_defend E13
+#? [1 A5]
+
+# J3 cannot be defended.
+loadsgf games/FSF-neurogo.sgf 40
+149 owl_defend J3
+#? [0]
+
+# There might be an attack at G13, but it looks like it fails.
+loadsgf games/strategy25.sgf 63
+150 owl_attack D15
+#? [0]*
+
+# Now G13 works.
+loadsgf games/strategy25.sgf 67
+151 owl_attack D15
+#? [1 G13]
+
+# More moves might work.
+loadsgf games/strategy25.sgf 197
+152 owl_attack J3
+#? [1 F2]
+153 owl_defend J3
+#? [1 (E2|G3)]
+
+loadsgf games/strategy25.sgf 250
+154 owl_attack M19
+#? [2 O15]
+155 owl_defend M19
+#? [1 (O15|P16|Q15|N16)]
+
+loadsgf games/strategy25.sgf 251
+156 owl_attack M19
+#? [1 O13]*
+157 owl_defend M19
+#? [3 (P16|Q15)]*
+
+# There might be some attack here, but at least both S16 and S15 fail.
+loadsgf games/strategy26.sgf 51
+158 owl_attack Q19
+#? [0]
+159 owl_defend Q19
+#? [1 (S15|S19|S17|PASS)]
+
+# A15 and C15 both fail badly. C16 allows white to make seki.
+loadsgf games/strategy26.sgf 285
+160 owl_defend D19
+#? [1 B16]
+
+loadsgf games/strategy27.sgf 190
+161 owl_attack F6
+#? [0]
+
+loadsgf games/strategy27.sgf 214
+162 owl_attack F19
+#? [1 D18]
+163 owl_defend F19
+#? [1 (B18|D18|D17|C19)]
+
+loadsgf games/owl20.sgf
+164 owl_attack R3
+#? [1 P1]
+165 owl_defend R3
+#? [1 (R1|S1|S2)]
+
+loadsgf games/owl21.sgf
+166 owl_attack Q17
+#? [2 P18]*
+
+loadsgf games/owl22.sgf 138
+167 owl_defend Q12
+#? [0]
+168 owl_defend Q9
+#? [0]
+
+loadsgf games/poka.sgf 42
+169 owl_defend B8
+#? [0]
+
+loadsgf games/owl23.sgf
+# This isolates the problem in test 4
+170 owl_attack B14
+#? [0]*
+
+# incident 284
+loadsgf games/incident278.sgf 318
+171 owl_attack A6
+#? [3 (B3|C1|A1)]*
+172 owl_defend A6
+#? [1 (B3|C1)]
+
+# incident 97
+loadsgf games/incident97.sgf 175
+173 owl_attack R14
+#? [1 S11]
+# S11 is superior to S13, but both work.
+174 owl_defend R14
+#? [1 (S11|S13)]
+
+# Black can do no better than seki with H17.
+loadsgf games/incident225.sgf 254
+175 owl_attack A19 
+#? [0]
+
+loadsgf games/incident240.sgf 103
+176 owl_defend C4
+#? [3 G1]
+
+# incident 105
+loadsgf games/incident104.sgf 169
+177 owl_attack J19
+#? [1 (G13|J13|G12|G14)]
+
+# see also strategy3:122
+loadsgf games/incident223.sgf 228
+178 owl_attack R13
+#? [1 (R19|T18)]*
+179 owl_defend R13
+#? [3 R19]*
+
+loadsgf games/incident269.sgf 200
+180 owl_attack R19
+#? [1 (T16|T17|T18|S18)]
+
+# tm (3.1.17)  T18 lives.  Note the W sente at R16.
+181 owl_defend R19
+#? [1 T18]
+
+# A17 is a better defense than B18 because B18 gives W two ko threats
+loadsgf games/incident144.sgf 242
+182 owl_attack C18
+#? [2 (A15|A17)]
+183 owl_defend C18
+#? [3 (A17|B18)]
+
+# incident 212
+# There may be a few more defenses.
+loadsgf games/incident211.sgf 26
+184 owl_attack F8
+#? [1 H8]
+185 owl_defend F8
+#? [1 H8]
+
+loadsgf games/explorer2.sgf 144
+186 owl_defend M3
+#? [0]
+
+loadsgf games/explorer2.sgf 145
+187 owl_attack M3
+#? [1 O3]
+
+loadsgf games/owl24.sgf 127
+188 owl_attack F15
+#? [1 (D16|C16|F14|E15)]
+189 owl_defend F15
+#? [1 D16]
+
+loadsgf games/reading25.sgf
+190 owl_defend C1
+#? [0]
+
+loadsgf games/nicklas/nicklas10.sgf 18
+191 owl_defend D8
+#? [1 B7]
+
+# See also test case golife:7
+loadsgf games/golife.sgf 46
+192 owl_attack E5
+#? [1 F3]*
+
+loadsgf games/strategy33.sgf 15
+193 owl_attack Q16
+#? [0]
+
+loadsgf games/strategy33.sgf 91
+194 owl_attack D15
+#? [1 G18]
+
+loadsgf games/strategy33.sgf 119
+195 owl_attack B11
+#? [1 (B10|A9|C9|A10|A8)]
+196 owl_defend B11
+#? [1 (B10|A9)]
+197 owl_attack D15
+#? [1 (F18|G19)]
+198 owl_defend D15
+#? [1 F18]
+
+loadsgf games/incident221.sgf 39
+199 owl_defend H3
+#? [0]
+
+loadsgf games/dniwog.sgf 62
+200 owl_defend B2
+#? [1 D7]
+
+loadsgf games/owl25.sgf 32
+201 owl_defend H6
+#? [1 H8]
+
+loadsgf games/owl25.sgf 54
+202 owl_defend H6
+#? [0]
+
+loadsgf games/owl25.sgf 60
+203 owl_defend H6
+#? [0]
+
+loadsgf games/owl25.sgf 62
+204 owl_attack H6
+#? [1 (H9|E9)]
+205 owl_defend H6
+#? [3 H9]
+
+loadsgf games/owl26.sgf 10
+206 owl_attack C12
+#? [0]
+
+loadsgf games/owl26.sgf 138
+207 owl_defend L6
+#? [0]*
+
+loadsgf games/incident248.sgf 228
+208 owl_attack J2
+#? [3 A2]
+209 owl_defend J2
+#? [1 (A2|F1|J1|A1|B1)]
+
+loadsgf games/incident161.sgf 56
+210 owl_attack C3
+#? [1 C2]
+211 owl_defend C3
+#? [1 C2]
+
+# Incident 190.
+loadsgf games/incident189.sgf 186
+212 owl_attack K13
+#? [3 E16]
+213 owl_defend K13
+#? [1 (D18|E16|M16|E18)]
+
+loadsgf games/owl27.sgf
+214 owl_defend N3
+#? [1 (L4|N5)]
+
+# K19 only gives ko.
+loadsgf games/FSF-neurogo.sgf 286
+215 owl_attack J15
+#? [1 H18]
+216 owl_defend J15
+#? [1 (H18|K19)]
+
+loadsgf games/owl28.sgf 199
+217 owl_attack C14
+#? [1 A16]
+218 owl_defend C14
+#? [1 A16]
+
+loadsgf games/filllib9.sgf 119
+219 owl_defend K19
+#? [0]
+
+loadsgf games/filllib9.sgf 121
+220 owl_defend K19
+#? [0]
+
+# Additionally D7, C8 and some other odd moves work. H9 does not.
+loadsgf games/trevor/trevor_24.sgf 33
+221 owl_defend H8
+#? [1 (D8|E8)]
+
+# E6 almost kills tactically.
+loadsgf games/trevor/trevor_27.sgf 36
+222 owl_attack E5
+#? [1 E6]
+
+loadsgf games/incident169.sgf 224
+223 owl_defend R17
+#? [3 S16]
+
+loadsgf games/ego.sgf 198
+224 owl_attack T17
+#? [2 T18]*
+
+loadsgf games/ego.sgf 198
+225 owl_defend T17
+#? [3 (Q19|S16)]*
+
+loadsgf games/owl29.sgf 132
+226 owl_attack J10
+#? [2 O8]*
+
+loadsgf games/owl30.sgf 172
+227 owl_attack L19
+#? [1 (Q19|P17)]
+
+# The cut at D5 fails.
+loadsgf games/nicklas/nicklas18.sgf 17
+228 owl_attack B5
+#? [0]
+
+loadsgf games/incident240.sgf 69
+229 owl_attack B12
+#? [1 D9]
+
+loadsgf games/owl31.sgf 20
+230 owl_defend G7
+#? [0]
+
+loadsgf games/owl32.sgf
+231 owl_attack A8
+#? [1 (C6|A4)]
+232 owl_defend A8
+#? [3 C6]
+233 owl_attack F6
+#? [1 H7]*
+234 owl_defend F6
+#? [1 (J7|H7|H6|G6)]
+
+# There are probably additional moves.
+loadsgf games/owl33.sgf 134
+235 owl_attack O4
+#? [1 (S3|T4)]
+236 owl_defend O4
+#? [1 (R4|S3|R3|S2|Q5|P5)]
+
+#SEE_ALSO=reading:170
+loadsgf games/owl33.sgf 212
+237 owl_defend S12
+#? [0]
+
+# See also optics:1801-1812
+loadsgf games/marginal_ko.sgf
+238 owl_attack B19
+#? [1 (B17|A19)]
+239 owl_defend B19
+#? [2 B17]
+240 owl_attack G19
+#? [0]
+241 owl_attack M19
+#? [0]
+242 owl_attack J15
+#? [0]
+243 owl_attack A11
+#? [0]
+244 owl_attack D11
+#? [(2|3) F11]
+245 owl_defend D11
+#? [1 (F11|H8|F8|H5)]
+246 owl_attack O9
+#? [3 (M6|Q8)]
+247 owl_defend O9
+#? [1 (M6|Q8)]
+248 owl_attack A6
+#? [1 (J1|L2)]
+249 owl_defend A6
+#? [2 (J1|B7|B2)]
+250 owl_attack R3
+#? [1 (T3|R2)]
+251 owl_defend R3
+#? [3 T3]
+252 owl_attack C2
+#? [2 B2]
+253 owl_defend C2
+#? [1 B2]
+
+# See also strategy2:100.
+loadsgf games/strategy26.sgf 257
+254 owl_defend O13
+#? [1 (M16|O14|N16|N17)]
+
+loadsgf games/owl34.sgf 211
+255 owl_defend D13
+#? [1 (D14|E13|G16)]
+
+#CATEGORY=CONNECTION_IN_OWL
+# Simple mistake. See also 13x13:60 or 13x13:23.
+loadsgf games/mertin13x13/gnugo-katsunari1.B+21.sgf 15
+256 owl_attack K12
+#? [1 J12]
+
+# H3 is the best W move on the board, but it does not capture J3.
+loadsgf games/owl35.sgf
+257 owl_attack J3
+#? [0]*
+
+# This is quite trivial, but at least GNU Go 3.1.31 fails it.
+loadsgf games/handtalk/handtalk11.sgf 157
+258 owl_defend O2
+#? [0]
+
+loadsgf games/handtalk/handtalk12.sgf 29
+259 owl_does_attack L2 M3
+#? [0]
+
+# Far too many escape ways for F10 as it could be killed.
+loadsgf games/handtalk/handtalk12.sgf 41
+260 owl_does_attack G9 F10
+#? [0]
+
+# A good example where connection handling is important in owl.
+loadsgf games/handtalk/handtalk23.sgf 186
+261 owl_attack E5
+#? [1 (O6|Q7|T4|T5|R4)]*
+
+# See also 13x13:15.
+loadsgf games/mertin13x13/gointellect-gnugo2.W+8.sgf 32
+262 owl_defend E7
+#? [0]*
diff --git a/regression/owl1.tst b/regression/owl1.tst
new file mode 100644 (file)
index 0000000..70e4a9d
--- /dev/null
@@ -0,0 +1,541 @@
+# Extremely bad misread. (Made GNU Go play at L9 with the last move before
+# that position.)
+loadsgf games/wing-yuhiko-gnugo.sgf 115
+263 owl_defend M13
+#? [1 R11]*
+
+# Need another vital attack pattern here?
+loadsgf games/wing-yuhiko-gnugo.sgf 220
+264 owl_attack D18
+#? [2 A18]*
+
+# 3.3.2 comes up with R14, which of course doesn't work. T15 might
+# work, but is so much worse than S16 that there's no reason to allow
+# it.
+# See also manyfaces:2.
+loadsgf games/mfgg1.sgf 49
+265 owl_attack S15
+#? [1 S16]
+
+loadsgf games/unfinished.sgf 214
+266 owl_defend C15
+#? [1 B17]
+
+loadsgf games/unfinished.sgf 214
+267 owl_defend Q2
+#? [2 R3]
+
+loadsgf games/owl36.sgf
+268 owl_defend A3
+#? [3 A1]
+
+loadsgf games/nngs/lindq-gnugo-3.3.4-200207051636.sgf 192
+269 owl_defend D11
+#? [1 E9]
+
+# tests 270 - 278 refer to badly connected dragon eyespaces
+loadsgf games/owl37.sgf
+270 owl_attack A4
+#? [1 A5]*
+
+271 owl_defend A4
+#? [1 A5]*
+
+loadsgf games/owl38.sgf
+272 owl_defend H12
+#? [1 F13]
+
+loadsgf games/owl39.sgf 1
+273 owl_attack E7
+#? [1 G4]*
+
+274 owl_defend E7
+#? [1 (G4|G7|B6)]
+
+loadsgf games/owl39.sgf
+275 owl_attack E7
+#? [1 G4]*
+
+276 owl_defend E7
+#? [1 G4]*
+
+loadsgf games/owl39a.sgf 1
+277 owl_defend F7
+#? [1 G4]*
+
+loadsgf games/owl39a.sgf
+278 owl_defend F7
+#? [1 G4]*
+
+# GNU Go tries to "eat lunch" at B1 instead of recognizing this as seki.
+loadsgf games/owl40.sgf
+279 owl_defend A3
+#? [1 PASS]*
+
+loadsgf games/nngs/gnugo-3.3.8-Joorin-200209251541.sgf 169
+280 owl_attack F6
+#? [1 F4]
+
+loadsgf games/nngs/gnugo-3.3.8-evand-200209170730.sgf 227
+281 owl_attack O19
+#? [1 O12]
+
+# Not sure whether there is a defense, but J9 certainly can be attacked.
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 77
+282 owl_attack J9
+#? [1 .*]
+
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 231
+283 owl_defend J9
+#? [0]
+
+loadsgf games/nngs/gnugo-3.3.8-viking4-200209250907.sgf 241
+284 owl_defend J9
+#? [1 (M7|H7|M5|L8)]
+
+# Looks like a tough problem for GNU Go.
+loadsgf games/owl41.sgf 1
+285 owl_defend A6
+#? [1 B3]
+
+# Getting into a ko with A3 is not good.
+loadsgf games/owl41.sgf
+286 owl_attack A6
+#? [1 B3]
+
+loadsgf games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf 230
+287 owl_attack D4
+#? [0]
+
+# Seki.
+loadsgf games/nngs/gnugo-3.3.9-RikiTiki-200210170706.sgf 234
+288 owl_attack D4
+#? [0]
+
+loadsgf games/nngs/gnugo-3.3.9-pogonyshev-200210142137.sgf 62
+289 owl_defend H8
+#? [1 H6]
+
+loadsgf games/nngs/gnugo-3.3.10-rcde05-200210280427.sgf 253
+290 owl_attack M19
+#? [1 O19]
+291 owl_defend M19
+#? [2 O19]*
+
+loadsgf games/gunnar/gunnar3.sgf 88
+292 owl_defend T2
+#? [1 T4]
+
+loadsgf games/nngs/gnugo-3.3.12-RikiTiki-200212042341.sgf 80
+293 owl_defend Q6
+#? [0]*
+
+loadsgf games/owl42.sgf
+294 owl_defend L11
+#? [1 M9]
+
+loadsgf games/owl43.sgf
+295 owl_attack C4
+#? [1 C3]
+
+loadsgf games/owl44.sgf
+296 owl_attack D6
+#? [1 (E5|D8)]
+
+loadsgf games/nngs/gnugo-3.3.16-ccwills-200302151826.sgf 110
+297 owl_defend C8
+#? [1 A13]*
+
+loadsgf games/nngs/halti-gnugo-3.3.17-200303162357.sgf 228
+298 owl_attack P3
+#? [2 Q3]
+299 owl_defend P3
+#? [1 Q1]
+
+loadsgf games/nngs/wingjk-gnugo-3.3.17-200304070910.sgf
+300 owl_defend Q4
+#? [1 (S5|S2)]*
+
+loadsgf games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf 126
+301 owl_does_defend A12 A13
+#? [0]*
+
+loadsgf games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf 148
+302 owl_defend C19
+#? [0]*
+
+loadsgf games/nngs/gnugo-3.3.17-Shindou-200304162217.sgf 166
+303 owl_does_defend A17 A16
+#? [0]*
+
+loadsgf games/gunnar/gunnar6.sgf 135
+304 owl_defend Q14
+#? [0]
+
+loadsgf games/gunnar/gunnar7.sgf
+305 owl_defend P8
+#? [0]*
+
+# Only topologically false eyes but it still lives!
+# See also gunnar:27.
+loadsgf games/gunnar/rbm-bobk-200303111815.sgf 159
+306 owl_attack M17
+#? [0]*
+
+loadsgf games/nngs/guestn-gnugo-3.3.17-200304200323.sgf 52
+307 owl_attack S10
+#? [1 S11]
+
+308 owl_defend S10
+#? [1 S11]*
+
+loadsgf games/nngs/gnugo-3.3.18-spewnboy-200304291635.sgf 91
+309 owl_attack N5
+#? [1 (L2|L4)]
+
+310 owl_defend N5
+#? [1 (L2|L4)]
+
+loadsgf games/nngs/qly-gnugo-3.3.18-200305022134.sgf 72
+311 owl_attack K6
+#? [1 E2]
+
+312 owl_defend K6
+#? [1 C3]*
+
+loadsgf games/owl45.sgf
+313 owl_attack B18
+#? [1 (A18|C19)]
+
+# See also ld_owl:12
+loadsgf games/life_and_death/ld3.sgf
+white E1
+black B1
+white D1
+314 owl_defend A2
+#? [1 F1]
+
+loadsgf games/splee2.sgf 128
+315 owl_does_attack Q9 M10
+#? [0]*
+
+loadsgf games/nngs/gnugo-3.3.10-niki-200210281349.sgf 136
+316 owl_defend L7
+#? [0]*
+
+# J5 and J3 fail spectacularly due to shortage of liberties.
+loadsgf games/owl46.sgf
+317 owl_attack J4
+#? [1 (J7|J6|J8)]*
+
+# See also lazarus:10
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 258
+318 owl_does_defend F10 D10
+#? [0]*
+
+# Problem with bogus escape potential in GNU Go 3.3.22.
+loadsgf games/owl48.sgf
+319 owl_attack S10
+#? [1 S6]*
+
+loadsgf games/nngs/takeda-gnugo-3.4-200308142205.sgf 60
+320 owl_attack R4
+#? [0]
+
+loadsgf games/nngs/gnugo-3.4-viking4-200308191053.sgf 79
+321 owl_defend F3
+#? [0]*
+
+loadsgf games/nngs/gnugo-3.4-viking4-200308191053.sgf 81
+322 owl_defend F3
+#? [0]
+
+loadsgf games/nngs/gnugo-3.4-viking4-200308191053.sgf 85
+323 owl_defend F3
+#? [0]
+
+loadsgf games/nngs/gnugo-3.4-viking4-200308191053.sgf 89
+324 owl_defend E5
+#? [0]
+
+loadsgf games/nngs/ccwills-gnugo-3.4-200308231739.sgf 145
+325 owl_attack R18
+#? [1 (S18|T15)]*
+
+loadsgf games/nngs/ccwills-gnugo-3.4-200308231739.sgf 146
+326 owl_defend R18
+#? [3 S18]
+
+loadsgf games/nngs/gnugo-3.5.1-viking4-200309231039.sgf 139
+327 owl_attack O18
+#? [1 (O19|P19|Q19|Q17|N19)]
+
+loadsgf games/nngs/juka-gnugo-3.5.1-200309161948.sgf
+328 owl_attack R6
+#? [1 (P1|T4)]
+329 owl_defend R6
+#? [1 T4]
+
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf 78
+330 owl_attack Q5
+#? [1 R1]
+331 owl_defend Q5
+#? [1 (R1|S1|T2)]
+
+# This is more of a semeai, but at least owl should not say that
+# B19 is unattackable.
+# See also reading:189.
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf 194
+332 owl_attack B19
+#? [1 A14]
+
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf 126
+333 owl_defend C17
+#? [0]
+
+loadsgf games/nngs/joshj-gnugo-3.5.2gf1-200312171536.sgf 119
+334 owl_attack F5
+#? [1 (E7|F6)]
+
+loadsgf games/nngs/joshj-gnugo-3.5.2gf1-200312171536.sgf 180
+335 owl_defend K12
+#? [1 O6]
+
+loadsgf games/nngs/gnugo-3.5.2gf1-G28-200312282240.sgf 203
+336 owl_attack M5
+#? [1 (N2|O1)]*
+
+# A problem with extremely enthusiastic guess_eye_space() estimation.
+# Must be solved with "bulky eye" heuristic in compute_eyes_pessimistic().
+loadsgf games/self_play/selfplay1.sgf 206
+337 owl_attack E19
+#? [1 C18]*
+
+loadsgf games/owl50.sgf
+338 owl_defend F18
+#? [1 M16]*
+
+loadsgf games/nngs/gnugo-3.5.2gf1-wingjk-200312301242.sgf 90
+339 owl_defend O17
+#? [0]
+
+# Both dragons could be saved.
+loadsgf games/kgs/20040507-GnuGoCVS-read.sgf 224
+340 owl_defend B10
+#? [1 A11]*
+341 owl_defend G13
+#? [1 K8]*
+
+loadsgf games/kgs/yagr-r08ert.sgf 139
+342 owl_attack S6
+#? [(2|3) T2]*
+
+loadsgf games/kgs/yagr-r08ert.sgf 140
+343 owl_defend S6
+#? [(2|3) T3]*
+
+loadsgf games/disaster.sgf 18
+344 owl_attack N3
+#? [0]
+
+loadsgf games/kgs/yagr-Mythenmetz.2.sgf 111
+345 owl_defend O13
+#? [1 N13]*
+346 owl_defend Q13
+#? [1 N13]*
+
+loadsgf games/owl51.sgf
+347 owl_defend G16
+#? [1 D10]*
+
+loadsgf games/owl52.sgf
+348 owl_defend M11
+#? [0]*
+
+# Eye space with a cutting point. 
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 115
+349 owl_attack T19
+#? [1 R19]
+
+loadsgf games/olympiad2004/19x19/gnu-int.sgf 175
+350 owl_defend F11
+#? [0]
+
+# The problem is that the G19 string is not considered as part of an
+# eyespace but as a string that can be tactically defended at F18.
+# Unfortunately white F18 gives black a seki.
+loadsgf games/scoring/score11.sgf
+play white C15
+play white A13
+play white E14
+351 owl_attack E16
+#? [1 (PASS|E11|F19|G18)]
+
+loadsgf games/scoring/score14.sgf
+352 owl_attack B19
+#? [0]*
+
+loadsgf games/owl53.sgf
+353 owl_attack G6
+#? [0]
+
+loadsgf games/scoring/score39.sgf
+354 owl_defend Q13
+#? [0]
+
+# See also olympiad2004:123.
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 242
+355 owl_attack Q3
+#? [1 (K3|L3|L1|J2)]
+356 owl_defend Q3
+#? [1 L3]*
+
+loadsgf games/owl54.sgf
+357 owl_defend D3
+#? [0]*
+
+loadsgf games/scoring/score55.sgf
+358 owl_defend Q18
+#? [0]*
+
+loadsgf games/scoring/score53.sgf
+359 owl_defend P5
+#? [0]*
+
+loadsgf games/scoring/score43.sgf
+play black O16
+play black N17
+360 owl_defend L18
+#? [0]*
+play white L14
+361 owl_attack L18
+#? [1 K16]*
+362 owl_defend L18
+#? [1 M16]
+
+loadsgf games/kgs/GnuGoCVS-john.sgf 166
+363 owl_defend F9
+#? [1 (F5|G5|G6|H6)]*
+
+loadsgf games/owl54.sgf
+364 owl_attack E9
+#? [1 (PASS|A7|D6|F8|F9)]*
+365 owl_defend E9
+#? [0]
+
+loadsgf games/kgs/munchie-GNU.sgf 164
+366 owl_attack N2
+#? [0]*
+367 owl_attack O5
+#? [1 O4]*
+368 owl_defend O5
+#? [1 (O4|N3)]*
+369 owl_attack N7
+#? [1 (O4|N5)]
+370 owl_defend N7
+#? [1 O4]*
+
+loadsgf games/kgs/PsyDuck-GNU.sgf 76
+371 owl_attack K11
+#? [1 M13]*
+
+loadsgf games/kgs/GNU-higher.sgf 267
+372 owl_defend A17
+#? [1 D18]
+
+# See also nngs2:580.
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192319.sgf 152
+373 owl_attack F18
+#? [1 (N19|P19|M19|K19|H19|J14|J15)]
+374 owl_defend F18
+#? [1 K19]*
+
+loadsgf games/kgs/Erro-TheGNUGo.sgf
+375 owl_attack R10
+#? [1 (S16|S17|S18)]*
+
+# See also gunnar:73.
+loadsgf games/kgs/GNU-ivanho.sgf 182
+376 owl_defend K18
+#? [2 M19]*
+377 owl_defend H17
+#? [3 M19]*
+
+loadsgf games/kgs/GNU-tadf.sgf 98
+378 owl_attack C5
+#? [1 A2]*
+
+# See also nngs4:730.
+loadsgf games/nngs/GoFuN-gnugo-3.4-200308030626.sgf 194
+379 owl_does_attack D18 E15
+#? [0]*
+
+loadsgf games/nando/auto024.sgf 77
+play black N3
+play white M2
+play black O2
+play white M4
+play white N10
+play white M10
+play white L5
+play white M6
+380 owl_defend O7
+#? [1 P4]*
+
+# Black has easy local life with L10.
+loadsgf games/kgs/GNU-ituyosi.sgf 167
+381 owl_attack P9
+#? [1 (L10|M11|M10)]*
+382 owl_defend P9
+#? [1 (L10|K7|K5|Q10)]*
+
+# Persistent cache problem. B5 is not included in the active area.
+loadsgf games/kgs/tournament8/GNU-AyaBot.sgf 16
+383 owl_attack C3
+#? [0]
+loadsgf games/kgs/tournament8/GNU-AyaBot.sgf 18
+384 owl_attack C3
+#? [1 (A2|F2)]*
+
+loadsgf games/kgs/TheGNUGo-grasshoper.sgf 288
+385 owl_defend G14
+#? [1 C11]*
+
+loadsgf games/kgs/TheGNUGo-rcsteppat.sgf 138 
+386 owl_defend O17
+#? [1 P19]*
+
+loadsgf games/owl55.sgf 20
+387 owl_defend F4
+#? [1 C3]*
+
+loadsgf games/9x9-2.sgf 28
+388 owl_attack C3
+#? [1 A2]*
+
+loadsgf games/9x9-3.sgf 37
+389 owl_attack E3
+#? [0]*
+
+# See also trevord:790.
+loadsgf games/trevor/auto/d32.sgf 240
+390 owl_attack Q14
+#? [3 P14]*
+391 owl_defend Q14
+#? [1 P14]
+392 owl_does_defend T13 Q14
+#? [2]*
+
+# See also semeai:139,140.
+loadsgf games/semeai/semeai21.sgf
+393 owl_attack F9
+#? [1 (E9|G7)]
+394 owl_defend F9
+#? [1 G9]*
+
+# See also 9x9:640.
+loadsgf games/cgos/25811.sgf 52
+395 owl_attack E9
+#? [3 (A7|B9)]*
+396 owl_defend E9
+#? [2 PASS]*
diff --git a/regression/reading.tst b/regression/reading.tst
new file mode 100644 (file)
index 0000000..28147d7
--- /dev/null
@@ -0,0 +1,1000 @@
+# incident 2
+loadsgf games/incident2.sgf 212
+1 attack E3
+#? [0]
+
+# These are all trivialities.
+2 attack F1
+#? [1 G1]
+3 defend F1
+#? [1 G1]
+4 attack E19
+#? [2 D19]
+5 defend E19
+#? [1 D19]
+6 attack S5
+#? [1 (S4|T5)]
+7 defend S5
+#? [0]
+8 attack O3
+#? [1 O4]
+9 defend O3
+#? [0]
+
+# incident 79
+loadsgf games/incident79.sgf 168
+10 attack L19
+#? [0]
+
+11 attack K18
+#? [1 J17]
+# FIXME: Not sure whether defense at J16 works without ko.
+12 defend K18
+#? [1 J16]
+
+# incident 67 (slightly modified)
+loadsgf games/incident67.sgf 21
+13 defend G3
+#? [1 H1]
+
+# incident 64
+loadsgf games/incident64.sgf 52
+14 attack F7
+#? [0]
+15 attack F9
+#? [1 G9]
+16 defend F9
+#? [0]
+
+# incident 55
+loadsgf games/incident55.sgf 98
+17 defend L5
+#? [0]
+
+# incident 80
+loadsgf games/incident80.sgf 141
+18 attack T10
+#? [0]
+
+# incident 82
+loadsgf games/incident82.sgf 184
+19 attack B16
+#? [1 A14]
+
+# incident 114
+loadsgf games/incident114.sgf 36
+20 attack S4
+#? [1 (R4|T4|T5)]
+
+# incident 231
+# Three space nakade in the corner.
+loadsgf games/incident231.sgf 206
+21 attack B4
+#? [1 A1]
+
+# incident 84 (slightly modified)
+loadsgf games/incident84.sgf 57
+22 defend A8
+#? [1 (B5|A7)]
+
+# incident 86
+loadsgf games/incident85.sgf 214
+23 attack H17
+#? [0]
+
+# incident 92
+# Double snapback. Also see tests 89, 90.
+loadsgf games/incident92.sgf 250
+24 attack O2
+#? [1 Q1]
+
+# incident 93
+# Defense available by backfilling. Also see test 91.
+loadsgf games/incident93.sgf 42
+25 attack E1
+#? [0]
+
+# incident 144
+loadsgf games/incident144.sgf 98
+increase_depths
+trymove W F17
+26 defend J19
+#? [1 G19]
+popgo
+decrease_depths
+
+# incident 42
+# Indirect defense causing shortage of liberties available. See also
+# test 92.
+loadsgf games/incident42.sgf 58
+increase_depths
+trymove B S15
+27 defend P16
+#? [1 T15|O13|P12]
+popgo
+decrease_depths
+
+# incident 43
+# Essentially identical to incident 42. See also test 92.
+loadsgf games/incident42.sgf 88
+increase_depths
+trymove B S15
+28 defend P16
+#? [1 T15]
+popgo
+decrease_depths
+
+# incident 118
+# This is a ko reading mistake. See also tests 93--96.
+loadsgf games/incident118.sgf 252
+29 attack J10
+#? [1 (F1|F2|N1)]
+30 defend J10
+#? [2 J1]
+
+# incident 119
+# This is a ko reading mistake. See also tests 97 and 98.
+loadsgf games/incident118.sgf 256
+# Technically N1 also works with ko, but it's inferior since we have
+# to win the ko twice.
+31 attack J10
+#? [3 (F1|F2)]
+# This test passes if ko depth is increased to 9.
+32 defend J10
+#? [2 J1]
+
+# incident 125
+loadsgf games/incident121.sgf 74
+33 attack O3
+#? [1 P3]
+34 defend O3
+#? [1 (P3|O2|P2)]
+
+# incident 239
+# Ko is involved here too, if trying to defend at B1.
+loadsgf games/incident239.sgf 58
+35 attack A3
+#? [1 B1]
+36 defend A3
+#? [1 A5]
+
+# incident 167b
+# Another ko reading mistake.
+loadsgf games/incident165.sgf 212
+37 attack J14
+#? [2 (L11|K9|L9|N4)]
+38 defend J14
+#? [1 (N4|O2|P2|N1)]*
+
+# This is a reading mistake from the first game of the Honinbo title
+# match 2000, between O Meien (white) and Cho Sonjin (black). White
+# resigned after move 59.
+loadsgf games/ladder1.sgf 59
+39 attack G12
+#? [1 K13]
+
+# The same position a few moves earlier.
+loadsgf games/ladder1.sgf 55
+40 attack G12
+#? [1 H12]
+
+# incident 185
+# This mistake can be solved by increasing the backfill depth to 11.
+loadsgf games/incident185.sgf 204
+41 defend O19
+#? [0]
+
+# incident 186
+loadsgf games/incident186.sgf
+42 attack E9
+#? [1 F9]
+
+# incident 194 (slightly modified)
+loadsgf games/incident189.sgf 222
+43 attack S12
+#? [0]
+
+# incident 195
+loadsgf games/incident189.sgf 252
+44 attack A9
+#? [0]
+
+# incident 225
+# Ko reading mistake.
+loadsgf games/incident225.sgf 252
+45 defend H18
+#? [2 H17]
+
+# incident 226
+# Ko reading mistake.
+loadsgf games/incident225.sgf 254
+46 defend H18
+#? [2 H17]
+
+# incident 246
+loadsgf games/incident246.sgf 74
+increase_depths
+trymove B L9
+47 defend M12
+#? [1 M11]
+48 defend M10
+#? [1 M11]
+49 attack N11
+#? [1 M11]
+popgo
+decrease_depths
+
+# incident 247
+loadsgf games/incident246.sgf 76
+50 attack M12
+#? [0]
+
+# This is a cleaned up version of incident 247
+loadsgf games/reading01.sgf
+51 attack D6
+#? [0]
+
+# This is a simplified version of the reading problem in incident 59.
+# Still it's a very tough problem for a computer.
+loadsgf games/reading02.sgf
+52 attack C3
+#? [1 H2]
+53 attack D1
+#? [1 H2]
+54 defend E2
+#? [1 H2]
+
+loadsgf games/owl03.sgf
+55 attack D19
+#? [1 E19]*
+
+loadsgf games/reading03.sgf
+# Should find ko attack. Also a life and death problem
+56 attack J7
+#? [3 J8]
+
+# incident 252
+loadsgf games/incident252.sgf 134
+57 attack H3
+#? [0]
+
+# incident 272
+# This mistake can be solved by increasing the fourlib depth to 11.
+loadsgf games/incident272.sgf 24
+58 defend M17
+#? [0]*
+
+# incident 276
+# This ko is quite messy with respect to internal ko threats. Awaiting
+# further analysis, we accept both return codes 2 and 3.
+loadsgf games/incident272.sgf 252
+59 defend N2
+#? [(2|3) P5]
+
+# incident 280
+loadsgf games/incident278.sgf 160
+60 defend F16
+#? [0]
+
+loadsgf games/strategy5.sgf 44
+61 defend S5
+#? [1 (S3|S4)]
+
+loadsgf games/reading04.sgf 237
+trymove B E1
+62 defend D6
+#? [2 (F2|G3)]
+popgo
+
+# Position from Tim's game
+loadsgf games/reading05.sgf
+63 defend A9
+#? [0]
+
+loadsgf games/nicklas/nicklas11.sgf 244
+64 defend P8
+#? [3 N1|R3|R2]
+
+loadsgf games/reading06.sgf
+65 defend S5
+#? [0]*
+
+# Ko tests.
+loadsgf games/reading07.sgf 1
+66 attack G9
+#? [2 E7]
+67 defend F8
+#? [2 E7]
+68 defend E9
+#? [2 E7]
+
+loadsgf games/reading07.sgf 2
+69 defend G9
+#? [3 E8]
+70 attack F8
+#? [3 E8]
+71 attack E9
+#? [3 E8]
+
+# A simplification of incident 225. Ko tests.
+loadsgf games/reading08.sgf
+72 attack G9
+#? [1 E6]
+73 defend G9
+#? [1 E6]
+74 attack E8
+#? [3 E9]
+75 defend E8
+#? [1 (E6|E9|D9|D8)]
+76 attack C9
+#? [1 E6]
+77 defend C9
+#? [1 E6]
+
+# A simplification of incident 119. Ko tests.
+loadsgf games/reading09.sgf 1
+78 attack C5
+#? [3 (C1|C2)]
+79 defend C5
+#? [2 F1]
+80 attack E5
+#? [2 F1]
+81 defend E5
+#? [3 (C1|C2)]
+
+# More ko tests.
+loadsgf games/reading09.sgf 3
+82 attack C5
+#? [3 G1]
+83 defend C5
+#? [1 F3]
+84 attack E5
+#? [1 F3]
+85 defend E5
+#? [3 G1]
+
+# Failure to consider double atari on surrounding chain.
+loadsgf games/reading10.sgf
+86 defend E5
+#? [0]
+
+# Crawling along the edge.
+loadsgf games/strategy5.sgf 45
+87 attack T7
+#? [1 S4]
+
+# Necessary to start by reinforcing surrounding chain.
+loadsgf games/reading11.sgf
+88 attack G6
+#? [1 (D5|E4)]
+
+# Simplification of test 24, double snapback.
+loadsgf games/reading12.sgf
+89 attack D2
+#? [1 F1]
+90 attack H2
+#? [1 F1]
+
+# Simplification of test 25, backfilling defense.
+loadsgf games/reading12.sgf
+91 attack A6
+#? [0]
+
+# Simplification of tests 27 and 28, indirect defense.
+loadsgf games/incident42.sgf 89
+92 defend P16
+#? [1 T15]
+
+# Simplification of tests 29 and 30, ko mistakes.
+loadsgf games/reading13.sgf 1
+93 attack B5
+#? [1 (A3|E6)]
+94 defend B5
+#? [2 D1]
+
+# Ko mistake
+loadsgf games/reading13.sgf 2
+95 attack B5
+#? [3 E1]
+
+# Ko mistake
+loadsgf games/reading13.sgf 3
+96 defend B5
+#? [2 F1]
+
+# Simplification of tests 31 and 32, ko mistakes.
+loadsgf games/reading13.sgf 4
+97 attack B5
+#? [3 (A3|E6)]
+98 defend B5
+#? [2 D1]
+
+# Well-known tesuji.
+loadsgf games/reading14.sgf
+99 attack D4
+#? [1 D6]
+
+# Tests for net3
+loadsgf games/net3.sgf
+100 attack J18
+#? [1 H16]
+101 attack L18
+#? [1 M16]
+102 attack B11
+#? [1 D12]
+103 attack B9
+#? [1 D8]
+104 attack R11
+#? [1 Q12]
+105 attack R9
+#? [1 Q8]
+106 attack J3
+#? [1 H4]
+107 attack L3
+#? [1 M4]
+
+loadsgf games/reading16.sgf
+# test for draw_back
+108 attack L3
+#? [1 K2]
+109 defend L3
+#? [1 (K2|M2|N3)]
+
+# Simplification of test 21.
+loadsgf games/reading12.sgf
+110 attack G9
+#? [1 J9]
+111 defend G9
+#? [1 J9]
+
+# Well-known tesuji.
+loadsgf games/reading15.sgf
+112 attack H5
+#? [1 H2]
+113 defend H5
+#? [1 H2]
+114 attack A5
+#? [1 (A3|B2)]
+115 defend A5
+#? [1 B2]
+116 attack B9
+#? [1 (D9|E8)]
+117 defend B9
+#? [1 E8]
+118 attack G9
+#? [1 (D9|E8)]
+119 defend G9
+#? [1 E8]
+
+# Small scale semeai.
+loadsgf games/reading17.sgf
+120 attack E8
+#? [1 C7]
+
+# Ko can be avoided.
+loadsgf games/reading18.sgf
+121 attack E5
+#? [1 C4]
+
+# Small scale semeai.
+loadsgf games/reading18.sgf
+122 defend J9
+#? [1 (F7|F9)]
+
+# based on test 12 (incident79.sgf)
+loadsgf games/reading19.sgf
+123 attack K18
+#? [1 G19]
+
+# based on strategy test 18
+loadsgf games/reading20.sgf
+124 attack G3
+#? [1 K3]
+
+# Ko can not be avoided.
+loadsgf games/reading21.sgf
+125 attack D1
+#? [2 E1]
+126 defend D1
+#? [1 E1]
+127 attack D9
+#? [1 F7]
+128 defend D9
+#? [3 F7]
+
+# Backfilling insufficient, need to back-capture.
+loadsgf games/reading22.sgf
+129 attack H2
+#? [1 (F5|F6)]
+
+loadsgf games/TSa.sgf 298
+130 attack E19
+#? [0]
+
+# Derived from strategy2 test 78. See also test case 138.
+loadsgf games/strategy21.sgf 96
+trymove black H2
+131 attack F4
+#? [0]
+popgo
+
+loadsgf games/reading22.sgf
+132 attack J8
+#? [2 J9]
+133 defend J8
+#? [3 F9]
+
+# See also test case 137.
+loadsgf games/strategy27.sgf 62
+134 attack H2
+#? [1 J2]*
+
+loadsgf games/nicklas/nicklas18.sgf 45
+135 attack A7
+#? [2 A6]
+
+loadsgf games/explorer.sgf 64
+136 attack S8
+#? [2 (T6|T12)]
+
+loadsgf games/reading23.sgf
+137 attack C2
+#? [1 (H2|G1)]
+138 defend E8
+#? [2 F9]*
+
+# incident 156
+loadsgf games/incident156.sgf 186
+139 attack B13
+#? [0]
+
+loadsgf games/reading24.sgf 48
+140 attack E2
+#? [0]
+
+# superstring problem with double ko
+loadsgf games/reading26.sgf
+141 attack D1
+#? [0]*
+
+loadsgf games/reading27.sgf 66
+142 attack N16
+#? [1 O16]
+
+loadsgf games/reading28.sgf
+143 attack F9
+#? [1 (D9|G8)]
+144 defend F9
+#? [0]
+
+loadsgf games/ko5.sgf
+145 attack J13
+#? [1 H12]
+146 defend J13
+#? [2 H12]
+147 attack M3
+#? [1 H1]*
+148 defend M3
+#? [2 K2]
+
+loadsgf games/gwe.sgf 225
+149 attack T1
+#? [0]
+
+loadsgf games/reading29.sgf
+150 attack B18
+#? [1 B17]*
+
+loadsgf games/reading29.sgf
+151 attack M2
+#? [1 M3]
+
+loadsgf games/reading30.sgf
+152 attack L18
+#? [1 (K18|L17|M18)]
+
+loadsgf games/reading31.sgf
+153 attack C3
+#? [0]
+
+# Ko depth needs to be increased to 11 before the ko is detected.
+loadsgf games/trevor/trevor_03.sgf 29
+154 attack E4
+#? [2 G4]*
+
+loadsgf games/reading32.sgf
+155 attack G9
+#? [0]
+
+loadsgf games/reading33.sgf
+156 attack B3
+#? [1 B2]*
+157 attack R3
+#? [0]
+
+loadsgf games/strategy11.sgf 77
+158 attack H2
+#? [1 G2]*
+
+loadsgf games/trevor/auto/d12.sgf 66
+159 attack B14
+#? [0]
+
+loadsgf games/ssstator.sgf 133
+trymove black C1
+160 attack D1
+#? [0]
+popgo
+
+loadsgf games/reading34.sgf
+161 attack C9
+#? [0]
+
+loadsgf games/reading34.sgf
+162 attack D7
+#? [0]
+
+# See also trevorb:840.
+loadsgf games/trevor/auto/b75.sgf 62
+163 attack E12
+#? [0]
+
+loadsgf games/reading35.sgf
+164 defend B6
+#? [1 C7]
+
+# See also 13x13:78
+loadsgf games/reading36.sgf 23
+165 attack L4
+#? [1 (K3|L3)]*
+
+# See also semeai:36
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 66
+166 attack R11
+#? [1 R12]*
+
+# Gets it right if F5 is filled, so the issue is finding the
+# backfilling move.
+loadsgf games/doubleko.sgf
+167 attack J1
+#? [1 F5]*
+
+# This position can reveal komaster scheme weaknesses.
+loadsgf games/reading37.sgf
+168 defend B5
+#? [2 B2]
+
+# See also trevorb:430
+# After B:F13, W:D13, B:H13, W:G13, B:G12, white G11 would be self-atari.
+loadsgf games/trevor/auto/b28.sgf 80
+169 defend F12
+#? [1 F13]
+
+# See also owl:237
+loadsgf games/owl33.sgf 212
+170 attack S13
+#? [0]
+
+# See also connect:4,54,55
+loadsgf golois/Basique990715-1.sgf
+trymove W Q4
+trymove B R4
+trymove W P4
+trymove B R5
+trymove W R3
+171 attack R3
+#? [1 R2]
+popgo
+popgo
+popgo
+popgo
+popgo
+
+loadsgf games/reading38.sgf
+172 defend N14
+#? [1 Q10]
+
+# See also nngs2:1.
+loadsgf games/nngs/gnugo-3.3.2-Zahlman-200205221717.sgf 207
+trymove white A4
+173 defend B2
+#? [1 (A2|C7|B1)]
+popgo
+
+# Although gnugo plays N16, the fact it doesn't see that the move
+# is also a defense for N13 causes owl misreads.
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 258
+trymove black T8
+trymove white P16
+174 defend N13
+#? [1 N16]*
+popgo
+popgo
+
+loadsgf games/reading39.sgf
+175 defend O3
+#? [1 (N1|N2)]
+
+# See also nngs3:1170
+loadsgf games/nngs/gnugo-3.3.9-nailer-200210192227.sgf 242
+trymove white B1
+176 attack B1
+#? [0]*
+popgo
+
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 126
+trymove black L4
+trymove white N3
+trymove black N2
+177 defend K4
+#? [1 N1]
+popgo
+popgo
+popgo
+
+loadsgf games/reading40.sgf
+178 attack C9
+#? [0]
+
+loadsgf games/nngs/halti-gnugo-3.3.17-200303162357.sgf 228
+179 attack P1
+#? [1 Q1]
+180 defend P1
+#? [2 Q3]
+
+# See also trevora:480. F5 doesn't work.
+loadsgf games/trevor/auto/a031.sgf 40
+181 defend E3
+#? [1 E4]*
+
+# A18 only attacks with bad ko (extremely bad since the whole semeai
+# is lost if white ignores the ko threat). A17 also attacks with bad
+# ko but here a lost ko means seki. A19 gives a good ko but losing it
+# costs the whole semeai.
+# The distinction between these results is too subtle for the tactical
+# reading code so for now we only check that it realizes that there is
+# no attack without ko.
+loadsgf games/reading41.sgf 118
+182 attack C19
+#? [(2|3) (A17|A19|A18)]
+183 defend C19
+#? [1 (A19|E11)]
+
+# Playing E11 immediately gives bad ko. A18 obviously is totally
+# ineffective. Necessary to start at A16.
+loadsgf games/reading41.sgf 130
+184 attack C19
+#? [2 A16]
+185 attack A19
+#? [2 A16]*
+186 defend C19
+#? [1 E11]
+187 defend A19
+#? [1 E11]
+
+loadsgf games/reading40.sgf
+188 defend B4
+#? [1 A2]
+
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310071202.sgf 194
+trymove black A14
+trymove white A15
+189 defend C19
+#? [1 A17]
+popgo
+popgo
+
+loadsgf games/reading42.sgf 62
+190 attack E16
+#? [1 F15]
+
+# A3 wins the semeai. This is very ugly since it requires backfilling
+# of a large number of superstring liberties. See also gifu03:310.
+loadsgf games/cgf2003/GnuGo-GoInt.sgf 237
+191 defend B6
+#? [1 A3]*
+
+loadsgf games/reading43.sgf
+192 attack D4
+#? [0]
+
+loadsgf games/reading44.sgf
+193 defend D3
+#? [1 F3]
+
+# See also strategy:13.
+loadsgf games/incident108b.sgf 292
+194 attack L16
+#? [0]*
+
+# See also semeai:58.
+loadsgf games/test4lose.sgf
+195 defend H6
+#? [1 J4]
+
+# Standard corner tesuji (sacrifice two stones at H8 and J8 later). /ab
+# Maybe F9 works, too?
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312130817.sgf 28
+196 attack E8
+#? [1 (H8|E9)]
+
+# See also blunder:30.
+loadsgf games/blunder23.sgf
+197 defend O8
+#? [0]
+
+# See also connection:113 and blunder:24.
+loadsgf games/blunder17.sgf
+trymove B P5
+trymove W L4
+198 attack L5
+#? [0]
+popgo
+popgo
+
+loadsgf games/reading45.sgf
+199 defend D2
+#? [0]
+
+# Ladder reading problem. See also kgs:290 and kgs:300
+# This is more or less a duplicate of reading:156.
+loadsgf games/kgs/yagr-czarny.sgf 17
+200 attack B4
+#? [1 B2]*
+
+# See also arend:29
+loadsgf games/arend/gnugo-gnugo7.sgf 24
+trymove W E17
+201 attack E17
+#? [1 G17]*
+popgo
+
+# See also trevorc:880,890
+loadsgf games/trevor/auto/c51.sgf 82
+trymove W E12
+202 attack E13
+#? [2 F13]*
+popgo
+
+loadsgf games/reading46.sgf
+203 attack H9
+#? [1 E9]
+204 defend H9
+#? [1 (C6|E9|G9)]
+
+loadsgf games/reading47.sgf
+205 attack G2
+#? [0]
+
+loadsgf games/reading47.sgf
+206 attack B3
+#? [0]
+
+# See also 9x9:250.
+loadsgf games/nngs/evand-gnugo-3.5.2gf1-200312161910.sgf 52
+207 attack A6
+#? [3 (B4|C4|C1)]*
+208 defend A6
+#? [1 (A2|C2|C1)]
+209 attack D4
+#? [3 (B4|C4)]*
+210 defend D4
+#? [1 (A2|C2|C1)]
+211 defend A3
+#? [3 (B4|C4|C1)]*
+212 attack A3
+#? [1 (A2|C2|C1)]
+213 defend B2
+#? [3 (B4|C4)]*
+214 attack B2
+#? [1 (A2|C2|C1)]
+215 defend A1
+#? [3 (B4|C4)]*
+216 attack A1
+#? [1 (A2|C2|C1)]
+
+# GNU Go 3.7.2 thinks white has an attack at D3.
+loadsgf games/kgs/maproom-gnugo3pt6.sgf 37
+217 attack C4
+#? [2 D4]*
+trymove W D3
+218 defend C4
+#? [1 B5]
+popgo
+
+# See also connection:119.
+loadsgf games/kgs/llk-GNU.sgf 150
+trymove W N10
+trymove B M10
+trymove W M9
+trymove B L10
+trymove W M11
+trymove B L14
+219 defend K12
+#? [1 M14]*
+popgo
+popgo
+popgo
+popgo
+popgo
+popgo
+
+# See also nando:33
+loadsgf games/nando/auto023.sgf 170
+trymove W H11
+trymove B K13
+trymove W K12
+220 attack K12
+#? [0]*
+popgo
+popgo
+popgo
+
+# See also olympiad2004:112
+loadsgf games/olympiad2004/19x19/int-gnu.sgf 96
+trymove white T13
+221 defend Q16
+#? [1 Q14]*
+popgo
+
+# See also ninestones:370
+loadsgf games/nngs/leftd-gnugo-3.3.16-200302072009.sgf 78
+trymove black T3
+trymove white S1
+trymove black R5
+222 defend S4
+#? [1 S5]
+popgo
+popgo
+popgo
+
+loadsgf games/9handicap.sgf 280
+223 attack O18
+#? [3 T19]
+
+# See also semeai:143-144.
+loadsgf games/semeai/semeai22.sgf 7
+224 attack A4
+#? [2 PASS]*
+225 defend A4
+#? [3 (F1|F3)]
+226 defend E3
+#? [2 PASS]*
+227 attack E3
+#? [3 (F1|F3)]
+
+# See also thrash:20.
+loadsgf games/cgos/879.sgf 68
+play black F4
+228 attack F6
+#? [1 (A9|A8|PASS)]*
+
+# See also 9x9:640.
+loadsgf games/cgos/25811.sgf 52
+229 attack E9
+#? [3 (A7|B9)]*
+230 defend E9
+#? [2 PASS]*
+
+# The send-two-return-one move at J1 is totally ineffective but
+# causes horizon effects.
+# See also 9x9:650.
+loadsgf games/cgos/14198.sgf 53
+231 attack G2
+#? [2 E1]*
+
+# See also semeai:147.
+loadsgf games/semeai/semeai6.sgf
+play white A15
+play black D13
+232 defend A12
+#? [1 (B15|C15|D15|E15)]*
+
+# See also gifu05:1200
+loadsgf games/gifu2005/mfg-gnugo.sgf 195
+233 attack C19
+#? [0]*
+
+loadsgf games/reading48.sgf
+234 attack C1
+#? [1 A1]
diff --git a/regression/regress.awk b/regression/regress.awk
new file mode 100644 (file)
index 0000000..458e84d
--- /dev/null
@@ -0,0 +1,137 @@
+#invoke with gnugo --mode gtp < reading.tst | awk -f regress.awk tst=reading.tst
+
+# store results of gnugo in array gtpout
+
+# store test numbers in array test to be able
+# to retrieve test results in same order as in gtp file
+
+BEGIN {
+  ntest = 0;
+  nexpect = 0;
+  passes = 0;
+  unexpected_pass = 0;
+  unexpected_fail = 0;
+  failures = 0;
+}
+
+/^[=?][0-9]+ /{
+  sub(/\r/, "");
+  sub(/^[=?]/, "");
+  num = $1;
+  sub(/^[0-9]+ */, "");
+  gtpout[num] = $0;
+  test[ntest] = num;
+  ntest++;
+}
+
+/^;/{
+  print
+}
+
+END {
+
+# store test results in tst file in array expect
+
+  while (getline < tst) {
+    if (match ($0, /^#\?/)) {
+      sub(/^#\? */, "");
+      expect[num] = $0;
+      nexpect++;
+    } else {
+      num = $1;
+    }
+  }
+
+  if (nexpect != ntest) {
+    if (ntest > 0) {
+      print "Possible crash!: expected " nexpect " results, got " ntest ". Last successful test was " test[ntest-1] ".";
+    } else {
+      print "Possible crash!: expected " nexpect " results, got " ntest ". Crash in first test.";
+    }
+  }
+
+# check results of gnugo --mode gtp
+
+  for (i=0; i<ntest; i++) {
+
+    num = test[i];
+    correct_prn = expect[num];
+    sub(/^\[/, "", correct_prn);
+    sub(/\][&*]*$/, "", correct_prn);
+
+    ignore = 0;
+    fail = 0;
+    negate = 0;
+    if (match(expect[num], /&$/)) {
+      ignore = 1;
+    }
+    if (match(expect[num], /\*$/)) {
+      fail = 1;
+    }
+    correct_re = correct_prn;
+    if (match(correct_re, /^!/)) {
+      negate = 1;
+      sub(/^!/, "", correct_re);
+    }
+    sub(/^/, "^", correct_re);
+    sub(/$/, "$", correct_re);
+
+    result = gtpout[num];
+    if (!ignore) {
+      match_result = match(result, correct_re);
+      if (negate)
+       match_result = !match_result;
+      if (match_result) {
+       passes++;
+       if (fail) {
+         unexpected_pass++;
+         if (verbose)
+           print num " PASSED";
+         else
+           print num " unexpected PASS!";
+         if (url)
+           print "   "url""tst":"num;
+
+       } else {
+         if (verbose) {
+           print num " passed";
+         }
+       }
+      } else {
+       failures++;
+       if (!fail) {
+         unexpected_fail++;
+         if (verbose)
+           print num " FAILED: Correct '" correct_prn "', got '" result "'";
+         else  
+           print num " unexpected FAIL: Correct '" correct_prn "', got '" result "'";
+          if (url)
+            print "   "url""tst":"num;
+       } else {
+         if (verbose) {
+           print num " failed: Correct '" correct_prn "', got '" result "'";
+         }
+       }
+      }
+    } else {
+      if (verbose) {
+        print num " " result;
+      }
+    }
+  }
+  if (verbose) {
+    total = passes + failures;
+    
+    if (unexpected_pass == 1)
+      pass_string = "pass";
+    else
+      pass_string = "passes";
+    
+    if (unexpected_fail == 1)
+      fail_string = "failure";
+    else
+      fail_string = "failures";
+    
+    print "Summary: " passes "/" total " passes. " unexpected_pass " unexpected " pass_string ", " unexpected_fail " unexpected " fail_string;
+  }
+}
diff --git a/regression/regress.cmd b/regression/regress.cmd
new file mode 100644 (file)
index 0000000..247780d
--- /dev/null
@@ -0,0 +1,43 @@
+@echo off
+setlocal
+rem A simplified .cmd port of regress.sh, using regress.awk.
+rem
+rem Usage: regress [gnugo.exe]
+rem
+rem Start in the gnugo/regress subdir, the same one where regress.awk 
+rem (and the original regress.sh) resides. You will need a working 
+rem awk.exe in your %PATH%.
+rem
+rem Use the command line to point to the gnugo.exe you want to test.
+rem If built with VStudio sln/vcproj files, use one of:
+rem    ..\interface\{debug,release,minsizerel,relwithdebinfo}\gnugo.exe
+rem If built with NMake/MSYS/MinGW makefiles, use:
+rem     ..\interface\gnugo.exe
+
+rem The 5 test batches, based on the main gnugo tests, regress/Makefile*
+rem XXX Need to track the main regress/Makefile for changes to these lists!
+set b1=reading owl ld_owl optics filllib atari_atari connection break_in blunder unconditional trevora nngs1 strategy 
+set b2=endgame heikki neurogo arb rosebud golife arion viking ego dniwog lazarus trevorb strategy2 
+set b3=nicklas1 nicklas2 nicklas3 nicklas4 nicklas5 manyfaces niki trevor tactics buzco nngs trevorc strategy3 
+set b4=capture connect global vie arend 13x13 semeai STS-RV_0 STS-RV_1 STS-RV_e STS-RV_Misc trevord strategy4 
+set b5=owl1 handtalk nngs2 nngs3 nngs4 strategy5 century2002 auto01 auto02 auto03 auto04 auto_handtalk safety ninestones tactics1 manyfaces1 gunnar arend2 nando thrash 13x13b joseki gifu03 seki 9x9 cgf2004 kgs olympiad2004 tiny gifu05 13x13c 
+
+rem Check for regress.awk, fail if not present.
+if not exist regress.awk echo ERROR: cannot find regress.awk. aborting...
+if not exist regress.awk goto done
+
+rem Optionally get gnugo.exe location from command line; fail if not found.
+if "%1"=="" set gnugo=..\interface\gnugo.exe
+if not "%1"=="" set gnugo=%1
+if not exist %gnugo% echo ERROR: cannot find gnugo.exe executable [%gnugo%]. aborting...
+if not exist %gnugo% goto done
+
+rem Finally, do the actual testing.
+for %%t in (%b1%) do %gnugo% --quiet --mode gtp < %%t.tst | awk -f regress.awk tst=%%t.tst
+for %%t in (%b2%) do %gnugo% --quiet --mode gtp < %%t.tst | awk -f regress.awk tst=%%t.tst
+for %%t in (%b3%) do %gnugo% --quiet --mode gtp < %%t.tst | awk -f regress.awk tst=%%t.tst
+for %%t in (%b4%) do %gnugo% --quiet --mode gtp < %%t.tst | awk -f regress.awk tst=%%t.tst
+for %%t in (%b5%) do %gnugo% --quiet --mode gtp < %%t.tst | awk -f regress.awk tst=%%t.tst
+
+:done
+
diff --git a/regression/regress.pike b/regression/regress.pike
new file mode 100755 (executable)
index 0000000..eeb0925
--- /dev/null
@@ -0,0 +1,580 @@
+#!/usr/bin/env pike
+
+static int debug = 0;
+static int verbose = 0;
+Thread.Queue testsuite_queue;
+
+/* General class to manage a high-score list (e.g. of slow tests, tests
+ * with many nodes, ..)
+ */
+class Highscorelist
+{
+  array(float) scores;
+  array(string) names;
+  int max;
+  
+  void create(int m)
+  {
+    max = m;
+    scores = ({});
+    names = ({});
+  }
+
+  void add_score(float score, string name)
+  {
+    int num = sizeof(scores);
+    if (num != sizeof(names)) {
+      write("This should not happen!!");
+      return;
+    }
+    if (num < max) {
+      scores += ({score});
+      names += ({name});
+      sort(scores, names);
+    }
+    else if (scores[0] < score) {
+      scores[0] = score;
+      names[0] = name;
+      sort(scores, names);
+    }
+    return;
+  }
+
+  void report(string s)
+  {
+    for (int i = 0; i < sizeof(scores); i++)
+      write(s, names[i], scores[i]);
+  }
+}
+
+Highscorelist slow_moves;
+int report_slow = 0;
+
+class Testsuite
+{
+  string name;
+  mapping(int:string) correct_results = ([]);
+  multiset expected_failures = (<>);
+  int reading_nodes;
+  int owl_nodes;
+  int connection_nodes;
+  float walltime;
+  float cputime;
+  float uncertainty;
+  Process.create_process engine;
+  int quit_has_been_sent;
+  
+  array(int) pass;
+  array(int) fail;
+  array(int) PASS;
+  array(int) FAIL;
+
+  Thread.Queue writing_finished;
+  Thread.Queue reading_finished;
+  Thread.Queue write_queue;
+  int timebase;
+  float last_time;
+
+  void create(string s)
+  {
+    name = s;
+    reading_nodes = 0;
+    owl_nodes = 0;
+    connection_nodes = 0;
+    uncertainty = 0.0;
+    walltime = 0.0;
+    pass = ({});
+    fail = ({});
+    PASS = ({});
+    FAIL = ({});
+  }
+
+  static void finish()
+  {
+    // Write nothing if no test from the file was run at all.
+    if (sizeof(pass) + sizeof(fail) + sizeof(PASS) + sizeof(FAIL) > 0)
+      write("%-37s %7.2f %9d %7d %8d\n", name, cputime, reading_nodes,
+           owl_nodes, connection_nodes);
+  }
+
+  static void program_reader(object f)
+  {
+    int test_number;
+    
+    if (debug)
+      werror("Waiting for writing to be finished.\n");
+    writing_finished->read();
+    if (debug)
+      werror("Finished waiting for writing to be finished.\n");
+    
+    while (1) {
+      string s = f->gets() - "\r";
+      float current_time = time(timebase);
+      if (!s)
+       break;
+      if (debug)
+       werror("Recv: " + s + "\n");
+      
+      int number;
+      string answer;
+      if (sscanf(s, "=%d %s", number, answer)) {
+       if (number < 10000 || number > 10005) {
+         test_number = (int) number;
+         string correct = correct_results[test_number];
+         if (!correct) {
+           correct = "correct result missing, check the test suite";
+           correct_results[test_number] = correct;
+         }
+         int negate = 0;
+         if (correct[0] == '!') {
+           correct = correct[1..];
+           negate = 1;
+         }
+         correct = "^" + correct + "$";
+         object re = Regexp(correct);
+         string result = (negate ^ re->match(answer)) ? "pass" : "fail";
+         
+         if (result == "pass" && expected_failures[test_number])       {
+           result = "PASS";
+         }
+         if (result == "fail" && !expected_failures[test_number]) {
+           result = "FAIL";
+         }
+         this_object()[result] += ({test_number});
+         walltime += (current_time - last_time);
+         if (report_slow)
+           slow_moves->add_score(current_time - last_time,
+                                 name + ":" + test_number);
+         
+         if (result == "PASS" || result == "FAIL" || verbose)
+           write("%-15s %s %s [%s]\n", name + ":" + test_number,
+                 result, answer, correct_results[test_number]);
+         last_time = current_time;
+       }
+       else if (number == 10000)
+         reading_nodes += (int) answer;
+       else if (number == 10001)
+         owl_nodes += (int) answer;
+       else if (number == 10002)
+         connection_nodes += (int) answer;
+       else if (number == 10003)
+         cputime = (float) answer;
+       else if (number == 10005)
+         uncertainty += (float) answer;
+       else if (number == 10004)
+         break;
+      }
+      else if (sscanf(s, "?%s", answer)) {
+       number = -1;
+       sscanf(answer, "%d", number);
+       write("%-15s ?%s\n", name + ":", answer);
+      }
+    }
+    if (debug)
+      werror("Reader closing down.\n");
+    finish();
+    f->close();
+    reading_finished->write("\n");
+  }
+
+  static void program_writer(object f)
+  {
+    while (1) {
+      string s = write_queue->read();
+      if (has_value(s, "quit"))
+       quit_has_been_sent = 1;
+      if (s == "")
+       break;
+      f->write(s);
+    }
+    f->close();
+    if (debug)
+      werror("Writer closed down\n");
+  }
+
+  static void program_monitor()
+  {
+    while (!quit_has_been_sent) {
+      sleep(1);
+      if (engine->status() != 0 && !quit_has_been_sent) {
+       write("engine crashed in test suite %s.\n", name);
+       exit(1);
+      }
+    }
+  }
+  
+  void send(string|void s)
+  {
+    if (!s) {
+      if (debug)
+       werror("Finishing sending.\n");
+    }
+    else {
+      if (debug)
+       werror("Sent: " + s + "\n");
+      write_queue->write(s + "\n");
+    }
+  }
+  
+  void run_testsuite(string suite_name, string command,
+                    array(string) engine_options,
+                    mapping(string:mixed) options,
+                    array(int)|void test_numbers)
+  {
+    array(string) program_start_array = ({command}) + engine_options;
+    
+    string testsuite = Stdio.read_file(suite_name);
+    if (!testsuite) {
+      werror("Couldn't find " + suite_name + "\n");
+      exit(1);
+    }
+    
+    if (options["valgrind"])
+      program_start_array = ({"valgrind"}) + program_start_array;
+    
+    if (options["check-unoccupied-answers"])
+      testsuite = modify_testsuite(testsuite);
+    
+    writing_finished = Thread.Queue();
+    reading_finished = Thread.Queue();
+    write_queue = Thread.Queue();
+    object f1 = Stdio.File();
+    object pipe1 = f1->pipe();
+    object f2 = Stdio.FILE();
+    object pipe2 = f2->pipe();
+    engine = Process.create_process(program_start_array,
+                                   (["stdin":pipe1, "stdout":pipe2]));
+    thread_create(program_reader, f2);
+    thread_create(program_writer, f1);
+    thread_create(program_monitor);
+    
+    int number;
+    string answer;
+    string expected;
+    
+    timebase = time();
+    last_time = time(timebase);
+    
+    correct_results = ([]);
+    expected_failures = (<>);
+    
+    if (test_numbers && sizeof(test_numbers) == 0)
+      test_numbers = 0;
+    
+    foreach (testsuite/"\n", string s) {
+      string command;
+      if (sscanf(s, "%d %s", number, command) == 2) {
+       command = (command / " ")[0];
+       if (number >= 10000 && number <= 10003)
+         continue;
+       if (test_numbers && !has_value(test_numbers, number))
+         continue;
+       if (sizeof(allowed_commands) > 0 && !allowed_commands[command])
+         continue;
+       if (correct_results[(int) number])
+         write("Repeated test number " + number + ".\n");
+       send("reset_reading_node_counter");
+       send("reset_owl_node_counter");
+       send("reset_connection_node_counter");
+       send(s);
+       if (sscanf(s, "%*sreg_genmove%*s") == 2)
+         send("10005 move_uncertainty");
+       send("10000 get_reading_node_counter");
+       send("10001 get_owl_node_counter");
+       send("10002 get_connection_node_counter");
+       send("10003 cputime");
+      }
+      else if (sscanf(s, "#? [%[^]]]%s", answer, expected)) {
+       correct_results[(int)number] = answer;
+       if (expected == "*")
+         expected_failures[(int)number] = 1;
+      }
+      else
+       send(s);
+    }
+    
+    if (debug)
+      werror("Signalling finish of writing\n");
+    writing_finished->write("\n");
+    send("10004 cputime");
+    reading_finished->read();
+    send("10004 quit");
+  }
+}
+
+array(Testsuite) testsuites = ({});
+multiset(string) allowed_commands = (<>);
+
+// Replace all tests in the testsuite with new tests checking whether
+// the given answers are unoccupied vertices.
+string modify_testsuite(string testsuite)
+{
+  string s = "";
+  int test_number = 0;
+  Regexp re = Regexp("[^A-T]([A-T][0-9]+)(.*)");
+  foreach (testsuite / "\n", string row) {
+    if ((int) row != 0)
+      test_number = (int) row;
+    else if (row[0..1] != "#?")
+      s += row + "\n";
+    else {
+      string coord;
+      int n = 11;
+      while (re->split(row)) {
+       [coord, row] = re->split(row);
+       s += sprintf("%d color %s\n", 100 * test_number + n, coord);
+       s += "#? [empty]\n";
+       n++;
+      }
+    }   
+  }
+  return s;
+}
+
+void final_report()
+{
+  float total_time = 0.0;
+  float total_cputime = 0.0;
+  float total_uncertainty = 0.0;
+  int reading_nodes = 0;
+  int owl_nodes = 0;
+  int connection_nodes = 0;
+  int number_unexpected_pass = 0;
+  int number_unexpected_fail = 0;
+
+  foreach (testsuites, Testsuite t) {
+    total_time       += t->walltime;
+    total_cputime    += t->cputime;
+    total_uncertainty += t->uncertainty;
+    reading_nodes    += t->reading_nodes;
+    owl_nodes        += t->owl_nodes;
+    connection_nodes += t->connection_nodes;
+    number_unexpected_pass += sizeof(t->PASS);
+    number_unexpected_fail += sizeof(t->FAIL);
+  }
+  write("Total nodes: %d %d %d\n", reading_nodes, owl_nodes,
+       connection_nodes);
+  write("Total time: %.2f (%.2f)\n", total_cputime, total_time);
+  write("Total uncertainty: %.2f\n", total_uncertainty);
+  if (number_unexpected_pass > 0)
+    write("%d PASS\n", number_unexpected_pass);
+  if (number_unexpected_fail > 0)
+    write("%d FAIL\n", number_unexpected_fail);
+  if (report_slow) {
+    write("Slowest moves:\n");
+    slow_moves->report("%s: %f seconds\n");  
+  }
+}
+
+string parse_tests(mapping(string:array(int)) partial_testsuites,
+                  string tests)
+{
+  string suite, numbers;
+  if (sscanf(tests, "%[^ :]:%s", suite, numbers) != 2) {
+    suite = tests;
+    numbers = "";
+  }
+
+  if (has_value(suite, " "))
+    return "";
+  
+  if (!has_suffix(suite, ".tst"))
+    suite += ".tst";
+
+  if (numbers != "") {
+    if (!partial_testsuites[suite])
+      partial_testsuites[suite] = ({});
+    else if (sizeof(partial_testsuites[suite]) == 0)
+      return suite;
+    
+    foreach (numbers / ",", string interval) {
+      int start, stop;
+      if (sscanf(interval, "%d-%d", start, stop) == 2)
+       for (int k = start; k <= stop; k++)
+         partial_testsuites[suite] |= ({k});
+      else
+       partial_testsuites[suite] |= ({(int) interval});
+    }
+  }
+  else
+    partial_testsuites[suite] = ({});
+  
+  return suite;
+}
+
+int main(int argc, array(string) argv)
+{
+  array(string) testsuites = ({});
+  mapping(string:array(int)) partial_testsuites = ([]);
+
+  array(array(mixed)) all_options;
+
+  all_options = ({ ({"help", Getopt.NO_ARG, ({"-h", "--help"})}),
+                  ({"verbose", Getopt.NO_ARG, ({"-v", "--verbose"})}),
+                  ({"valgrind", Getopt.NO_ARG, "--valgrind"}),
+                  ({"check-unoccupied-answers", Getopt.NO_ARG,
+                    "--check-unoccupied"}),
+                  ({"slow_moves", Getopt.HAS_ARG, ({"-s", "--slow-moves"})}),
+                  ({"engine", Getopt.HAS_ARG, ({"-e", "--engine"})}),
+                  ({"options", Getopt.HAS_ARG, ({"-o", "--options"})}),
+                  ({"file", Getopt.HAS_ARG, ({"-f", "--file"})}),
+                  ({"jobs", Getopt.HAS_ARG, ({"-j", "--jobs"})}),
+                  ({"limit-commands", Getopt.HAS_ARG, ({"-l", "--limit-commands"})})});
+
+  mapping(string:mixed) options = ([]);
+  string engine = "";
+  array(string) engine_options = ({});
+  int jobs = 1;
+  
+  foreach (Getopt.find_all_options(argv, all_options), array(mixed) option) {
+    [string name, mixed value] = option;
+    switch (name) {
+      case "help":
+       write(help_message, basename(argv[0]));
+       return 0;
+       break;
+      
+      case "valgrind":
+       options["valgrind"] = 1;
+       break;
+       
+      case "check-unoccupied-answers":
+       options["check-unoccupied-answers"] = 1;
+       break;
+       
+      case "verbose":
+       verbose = 1;
+       break;
+       
+      case "engine":
+       engine = value;
+       break;
+       
+      case "options":
+       engine_options += value / " ";
+       break;
+
+      case "slow_moves":
+        report_slow = 1;
+        slow_moves = Highscorelist((int) value);
+        break;
+       
+      case "file":
+       string testlist = Stdio.read_file(value);
+       if (!testlist) {
+         werror("Couldn't find %s\n", value);
+         continue;
+       }
+       foreach ((testlist / "\n") - ({""}), string tests)
+         testsuites |= ({parse_tests(partial_testsuites, tests)});
+       break;
+
+      case "jobs":
+       jobs = (int) value;
+       break;
+
+      case "limit-commands":
+       foreach (value / ",", string command)
+         allowed_commands[command] = 1;
+       break;
+    }
+  }
+
+  if (engine == "") {
+    engine = "../interface/gnugo";
+    engine_options |= "--quiet --mode gtp" / " ";
+  }
+
+  argv = Getopt.get_args(argv)[1..];
+  foreach (argv, string tests)
+    testsuites |= ({parse_tests(partial_testsuites, tests)});
+
+  testsuites -= ({""});
+  
+  if (sizeof(testsuites) == 0) {
+    string makefile = Stdio.read_file("Makefile.am");
+    foreach (makefile / "\n", string s) {
+      string filename;
+      if (sscanf(s, "%*sregress.sh $(srcdir) %s ", filename) == 2)
+       testsuites += ({filename});
+    }
+  }
+
+  if (jobs < 1)
+    jobs = 1;
+
+  testsuite_queue = Thread.Queue();
+  
+  for (int j = 0; j < jobs; j++)
+    thread_create(run_testsuites, engine, engine_options,
+                 options, partial_testsuites);
+  
+  foreach(testsuites, string testsuite)
+    testsuite_queue->write(testsuite);
+
+  for (int j = 0; j < jobs; j++)
+    testsuite_queue->write("");
+
+  while (testsuite_queue->size() > 0)
+    sleep(1);
+
+  final_report();
+}
+
+void run_testsuites(string engine, array(string) engine_options,
+                   mapping(string:mixed) options,
+                   mapping(string:array(int)) partial_testsuites)
+{
+  while (1) {
+    string suite_name = testsuite_queue->read();
+    if (suite_name == "")
+      break;
+    
+    Testsuite current_testsuite = Testsuite(suite_name - ".tst");
+    testsuites += ({current_testsuite});
+    
+    current_testsuite->run_testsuite(suite_name, engine, engine_options,
+                                    options, partial_testsuites[suite_name]);
+  }
+}
+
+string help_message =
+"Usage: %s [OPTIONS]... [TESTS]...\n"
+"\n"
+"Run all regressions or a selection of them.\n"
+"Options:\n"
+"  -h, --help                    Display this help and exit.\n"
+"  -v, --verbose                 Show also expected results.\n"
+"      --valgrind                Run regressions under valgrind (very slow).\n"
+"      --check-unoccupied        Do not run regressions. Instead check that\n"
+"                                the listed answers are not occupied.\n"
+"  -e, --engine=ENGINE           Engine to run regressions on. Default is\n"
+"                                ../interface/gnugo.\n"
+"  -o, --options=OPTIONS         Options passed to the engine.\n"
+"  -f, --file=FILE               File containing a list of tests to run.\n"
+"  -j, --jobs=JOBS               Number of testsuites being run in parallel.\n"
+"  -l, --limit-commands=COMMANDS Only run tests having certain GTP commands.\n"
+"\n"
+"Tests are listed on the command line in one of the following forms:\n"
+"reading           Run all tests in the testsuite reading.tst.\n"
+"reading:4         Run test number 4 in reading.tst.\n"
+"reading:4,17,30   Run tests with numbers 4, 7, and 30 in reading.tst\n"
+"reading:4-17      Run tests with numbers between 4 and 17 in reading.tst\n"
+"\n"
+"It is also allowed to include the suffix \".tst\" above and more complex\n"
+"lists like \"reading.tst:1-3,15,17,30-50,52\" are also understood.\n"
+"The format of files used with --file is the same, with one testsuite on\n"
+"each line.\n"
+"\n"
+"If no test suite is listed on the command line or read from file, then all\n"
+"regressions listed in Makefile.am will be run.\n"
+"\n"
+"The --limit-commands option takes a comma separated list of GTP commands,\n"
+"e.g. '--limit-commands=attack,defend' to only run tactical reading tests.\n";
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/regression/regress.pl b/regression/regress.pl
new file mode 100755 (executable)
index 0000000..4c7e010
--- /dev/null
@@ -0,0 +1,933 @@
+#!/usr/bin/perl
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007    #
+# and 2008 by the Free Software Foundation.                         #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3          #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Here is a perlscript regress.pl. Its purpose is to run
+# the regression tests that are currently implemented with
+# shells and awk scripts.
+#
+# Run with:
+#
+# regress.pl --help 
+#
+
+package REGRESS;
+
+use IPC::Open3;
+use IO::Handle;
+use Getopt::Long;
+use FileHandle;
+
+use FindBin;
+
+use strict;
+use warnings;
+
+use Carp;
+
+STDOUT->autoflush(1);
+
+my $helpstring = "
+
+Run with:
+
+regress.pl --goprog \'<path to program> --mode gtp [program options]\' \\
+           --testfile \'<path to gtp test file>\' \\
+           --all_batches  Ignores --testfile, gets test files from Makefile.in
+           --numbers \'regexp of test numbers the next test after which won\'t be run\'
+           [options]
+
+Possible options:
+
+  --verbose 0 (very quiet) --verbose 1 (to list moves) or --verbose 2 (to draw board)
+      [FIXME: verbose levels not well defined.]
+  --html 0 (to not generate html) or --html 1 (default - generate html file w/ results)
+
+";
+
+
+my %categories = 
+ ("JOSEKI_DATABASE", "",
+  "JOSEKI_PATTERN", "", 
+  "FUSEKI_CONCEPT", "",
+  "DYNAMIC_CONNECTION", "Dynamic Connection Reading",
+  "TACTICAL_READING", "",
+  "OWL_TUNING", "",
+  "PATTERN_TUNING", "",
+  "CONNECTION_TUNING", "",
+  "MOVE_VALUATION", "",
+  "ATARI_ATARI", "",
+  "SEMEAI_MODULE", "",
+  "KO_READING", ""
+ );
+
+my $trace_output="";
+my $cur_passed;
+my $result;
+my $correct_re;
+my $bang;
+my $top_moves;
+my $handicap_stones;
+my $sgfmove;
+my $vertex;
+my @vertices;
+my $first;
+my $second;
+my $resultb;
+my $resultw;
+my $scriptfile;
+my $pidt;
+my $pidg;
+my $testdir;
+my $goprog;
+my $verbose = 1;
+my $old_whole_gtp = "";
+my $html_whole_gtp = "";
+my $testfile;
+my $num;
+my $filepos;
+my $goprog_in ;                # stdin of computer player
+my $goprog_out;                # stdout of computer player
+my $goprog_err;                # stderr of computer player
+my $passes;
+my $unexpected_pass;
+my $failures;
+my $unexpected_fail;
+my $numbers = "";
+my $boardsize = 19;  #current boardsize
+my $testfile_out;
+my $all_batches;
+my $make_images;
+my $cputime;
+my $generate_sgf = 1;
+
+my $goprog_name = "unknown";
+my $goprog_version = "0";
+my $goprog_timestamp = 0;
+
+my $do_topmove = 0;
+my $one_gg_process = 0;
+
+my @failed_links;
+my @FAILED_links;
+
+my @counters = qw/connection_node owl_node reading_node trymove/;
+
+my %counters;
+
+my $next_cmd = "";
+my $prev_cmd = "";
+my $problem_set;
+my $wantshelp;
+
+GetOptions(
+           "goprog|g=s"         => \$goprog,
+           "verbose|v=i"        => \$verbose,
+           "numbers|n=s"       => \$numbers,
+           "all_batches|all-batches|a=i" => \$all_batches,
+           "make_images|m=i"    => \$make_images,
+           "problemset|ps|p=s"  => \$problem_set,
+           "help"               => \$wantshelp,
+           "sgf|sgf|s=i"        => \$generate_sgf,
+);
+
+if ($make_images) {
+  make_images();
+  exit;
+}
+
+my $s = (lc ($^O) eq 'mswin32') ? '\\' : '/';
+if (!$goprog) {
+  $goprog = "..${s}interface${s}gnugo";
+}
+
+if ($goprog !~ / /) {
+  $goprog .=  " --mode gtp --quiet -t -w -d0x101840 --showtime";  
+}
+
+die $helpstring unless defined $goprog;
+
+if ($wantshelp) {
+  print $helpstring;
+  exit;
+}
+  
+
+
+if (!-e "html") {
+  mkdir "html";
+}
+
+
+# if $numbers matches the current test number, then read it to mean:
+# "inhibit all gtp commands AFTER the matching number, until the next 
+# numbered test, then resume."
+if ($numbers) {
+  $numbers = "^($numbers)\$";
+}
+
+use File::stat;
+
+
+# create FileHandles
+$goprog_in  = new FileHandle;          # stdin of computer player
+$goprog_out = new FileHandle;          # stdout of computer player
+$goprog_err = new FileHandle;          # stdout of computer player
+print "Go program: $goprog\n" if $verbose > 1;
+$pidg = open3($goprog_in, $goprog_out, $goprog_err, $goprog)
+  or die "Couldn't launch GNU Go: $!";
+print "goprog pid: $pidg\n" if $verbose > 1;
+my ($goprog_exe) = split (" ", $goprog);
+-e $goprog_exe
+  or ($goprog_exe = "$goprog_exe.exe") && -e $goprog_exe 
+  or die "Couldn't locate go program: $goprog_exe";
+$goprog_timestamp = (stat $goprog_exe)->mtime;
+
+go_command("name");
+$_ = <$goprog_out>;
+if (/^=\s*(.*)/) {
+  ($goprog_name = $1) =~ s/\s*$//;
+}
+<$goprog_out>;
+go_command("version");
+$_ = <$goprog_out>;
+if (/^=\s*(.*)/) {
+  ($goprog_version = $1) =~ s/\s*$//;
+}
+<$goprog_out>;
+
+print "Name: " .  $goprog_name ." ". $goprog_version . "\n" if $verbose > 1;
+
+if ($one_gg_process) {
+  go_command("quit");
+  print "waiting\n" if $verbose > 2;
+  waitpid $pidg, 0;
+  print "done waiting\n" if $verbose > 2;
+}
+
+
+if ($problem_set) {
+  open(F, $problem_set) or confess "can't open problem set: $problem_set";
+  my %filehash;
+  while (<F>) {
+    next if ($_ =~ /^\s*(#.*)?$/);
+    last if ($_ =~ /DONE|STOP/);
+    my ($filename, $probnum) = $_ =~ /^([^:]*):(\d+)/;
+    if (!defined $filename) {
+      warn "Unexpected line: $_";
+      last;
+    }
+    $filename =~ s/(\.tst)$//;
+    push @{$filehash{$filename}}, $probnum;
+  }
+  close F;
+  open(F, $problem_set) or confess "can't open problem set: $problem_set";
+  while (<F>) {
+    next if ($_ =~ /^\s*(#.*)?$/);
+    my ($filename, $probnum) = $_ =~ /^(.*):(\d+)/;
+    last unless defined $filename;
+    $filename =~ s/(\.tst)$//;
+    if (exists ($filehash{$filename}) ){
+      regress_file ("$filename.tst", @{$filehash{$filename}});
+      delete $filehash{$filename};
+    }
+  }
+  close F;
+  
+  
+} else {
+  if ($all_batches) {
+    @ARGV = allTargets();
+  }
+  my $curtstfile = "";
+  my $file_count = 0;
+  while ($file_count <= $#ARGV) {
+  $curtstfile = $ARGV[$file_count];
+  #unlink "html/index.html";
+  unlink "html/$curtstfile/index.html";
+  print "regressing file $ARGV[$file_count]\n" if $verbose > 1;
+  unlink "html/$curtstfile/index.html";
+  regress_file ($ARGV[$file_count]);
+  $file_count++;
+  @failed_links = @FAILED_links = ();
+  };
+}
+
+if (!$one_gg_process) {
+  go_command("quit");
+  print "waiting\n" if $verbose > 1;
+  waitpid $pidg, 0;
+  print "done waiting\n" if $verbose > 1;
+}
+
+#readline(*STDIN);
+
+exit;
+
+
+my $g_curtestfile;
+
+sub regress_chunk {
+  my @lines = @_;
+}
+
+sub regress_file {
+  $testfile = shift;
+  my @problist = sort {$a<=>$b} @_;
+  if ($verbose) {
+    print "$testfile";
+    print ": ", join ("  ", @problist), "\n" if @problist;
+    print "\n";
+  }
+  ($g_curtestfile) = $testfile =~ /(.*)\.tst$/ or confess "Unparsable test file: $testfile";
+  
+  -e "html" or mkdir "html" or die "Couldn't create html";
+  -e "html/$testfile" or mkdir "html/$testfile" or die "Couldn't create html/$testfile";
+  
+  my $childpid;
+
+  unless ($one_gg_process) {
+    $goprog_in  = new FileHandle;              # stdin of computer player
+    $goprog_out = new FileHandle;              # stdout of computer player
+    $goprog_err = new FileHandle;              # stderr of computer player
+    $pidg = open3($goprog_in, $goprog_out, $goprog_err, $goprog);
+    print "goprog pid: $pidg\n" if $verbose > 1;
+    unless ($childpid = fork) {
+      #Child.
+      chdir "html/$testfile" ;
+      open (TRACER, ">tracer.ttt");
+      while (defined(my $t = <$goprog_err>)) {
+        last if $t =~ /^ALL DONE/;
+        print TRACER $t;
+        print "ERR: $t" if $verbose > 2;
+        if ($t =~ /^\s*FINISHED PROBLEM:\s*$/ or
+            $t =~ /^\s*SKIPPED PROBLEM:\s*$/) {
+          my $num = <$goprog_err>;
+          print TRACER $num;
+          $num += 0;
+          close TRACER or die "Couldn't close temp trace file";
+          print "closed trace file\n" if $verbose > 2; 
+          if ($t =~ /^\s*FINISHED PROBLEM:\s*$/) {
+            rename "tracer.ttt", "$num.trace"
+                or die "Couldn't rename tracer: $testfile, $num";
+          }
+          open (TRACER, ">tracer.ttt");
+        }
+      }
+      close TRACER;
+      exit;
+    }
+  }
+
+  foreach (@counters) {
+    go_command("reset_${_}_counter");
+    eat();
+  }
+  
+  #main bit.
+  $pidt = open ($testfile_out,"<$testfile") or confess "Can't open $testfile";
+  print "testfile pid: $pidt\n" if $verbose > 1;
+
+  my $negate;
+  my $ignore;
+  my $fail;
+  $passes=0;
+  $unexpected_pass=0;
+  $failures=0;
+  $unexpected_fail=0;
+  $result = "";
+  $next_cmd = "";
+  $num = 0;
+  $filepos = 0;
+  go_command("cputime");
+  $cputime = <$goprog_out>;
+  print "cputime: $cputime\n" if $verbose > 1;
+  ($cputime) = ($cputime =~ /((\d|\.)+)/);
+  <$goprog_out>;  
+  
+  my $skipping;
+  while (defined($next_cmd))
+  {
+    $filepos++;
+    my $force_read = 1;
+    while ($force_read) {
+      $prev_cmd = $next_cmd;
+      $next_cmd = <$testfile_out>;
+      $force_read = 0;
+      if (defined($next_cmd)) {
+        chop($next_cmd);
+        print "NEXT_CMD: '$next_cmd'\n" if ($verbose > 1);
+        if (($next_cmd =~ /^\s*#\?\s+\[(\!*)(.*)\]\s*(\*)*(\&)*\s*$/)) {
+          $bang = $1;
+          if ($1) { $negate = 1} else {$negate = 0};
+          $correct_re = $2;
+          if ($3) { $fail = 1} else { $fail = 0};
+          if ($4) {$ignore = 1} else {$ignore = 0};
+
+          $skipping = (@problist &&
+            eval {foreach my $i (@problist) { return 0 if $i == $num} return 1;} );
+
+          if ($skipping) {
+            go_command("echo_err SKIPPED PROBLEM:\n");
+          } else {
+            go_command("echo_err FINISHED PROBLEM:\n");
+          }
+          eat();  #ignore output!
+          go_command("echo_err $num\n");
+          eat();  #ignore output!
+
+          if ($skipping) {
+            print "$g_curtestfile:$num skipped.\n" if $verbose > 1;
+            tally_result ($num, "skipped", "&nbsp;", "&nbsp;");
+          } else {
+           print "TST:$negate - $correct_re - $fail - $ignore\n" if $verbose>1;
+           if (!$ignore) {
+             my $match_result = $result =~ /^$correct_re$/ ;
+             if ($negate) {
+               $match_result = ! $match_result;
+             }
+             if ($match_result) {
+               if ($fail) {
+                 tally_result ($num,"PASSED","$bang$correct_re","$result");
+               } else {
+                 tally_result ($num,"passed","$bang$correct_re","$result");
+               }
+             } else {
+               if (!$fail) {
+                 tally_result ($num,"FAILED","$bang$correct_re","$result");
+               } else {
+                 tally_result ($num,"failed","$bang$correct_re","$result");
+               }
+             }
+           }
+          }
+         $old_whole_gtp = $html_whole_gtp;
+         $html_whole_gtp = "";
+       } else {
+         if (!($next_cmd =~ /^\s*$/)) {
+           $html_whole_gtp .= "   " . html_encode($next_cmd) . "<BR>\n";
+         }
+       }
+       $next_cmd =~ s/^\s*$//;  $next_cmd =~ s/^#.*$//;
+       $force_read = $next_cmd eq ""
+      }
+    }
+    if (defined($next_cmd)) {
+      my ($this_number) = $next_cmd =~ /^([0-9]+)/;
+      $skipping = (defined($this_number) &&
+            (@problist &&
+             eval {foreach my $i (@problist) {return 0 if $i == $this_number} return 1;} ));
+      if ($skipping) {
+        #print "SKIPPING: $next_cmd ($this_number)\n";
+      } else {
+        #print "NOT SKIPPING: $next_cmd\n";
+       $top_moves = "";
+       if ($do_topmove) {
+         if ($next_cmd =~ /reg_genmove\s+([blackwhite])+/) {
+           $next_cmd =~ s/reg_genmove\s+([blackwhite]+)/top_moves_$1/;
+           $top_moves = 1;
+         }
+       }
+       if (defined($this_number) 
+           && $next_cmd =~ /attack|defend/
+           && $generate_sgf) {
+         go_command("start_sgftrace");
+         eat(); #ignore output
+       }
+       go_command($next_cmd); 
+       if ($top_moves) {
+         $top_moves = eat_one();
+         if ($top_moves) {
+           ($result, $_) = split(/ /, $top_moves, 2);
+         } else {
+           $result = "PASS";
+           $top_moves = "";
+         }
+         print "TopMoves:$top_moves\n" if $verbose > 1;
+       } else {
+         $result = eat_one();
+         if (!defined($result)) {$result="";}
+       }
+       print "RES: $result\n" if $verbose > 1;
+       if (defined($this_number) && $next_cmd =~ /attack|defend/) {
+         if ($generate_sgf) {
+           go_command("finish_sgftrace html$s$testfile$s$this_number.sgf");
+           eat(); #ignore output
+         } else {
+           unlink "html$s$testfile$s$this_number.sgf";
+         }
+       }
+      }
+      if (defined $this_number) {$num = $this_number;}
+    }
+  }
+  
+  my $pass_string;
+  my $fail_string;
+  if ($unexpected_pass == 1) {
+    $pass_string = "pass";
+  } else {
+    $pass_string = "passes";
+  }
+  if ($unexpected_fail == 1) {
+    $fail_string = "failure";
+  } else {
+    $fail_string = "failures";
+  }
+
+  print "Summary: $passes/" . ($passes + $failures) . 
+        " passes. $unexpected_pass unexpected $pass_string, "
+       . "$unexpected_fail unexpected $fail_string\n";
+
+  unless ($one_gg_process) {
+    go_command("echo_err ALL DONE");
+    print "waiting on child\n" if $verbose > 1;
+    waitpid $childpid, 0;
+    print "done waiting on child\n" if $verbose > 1;
+    go_command("quit");
+    print "waiting\n" if $verbose > 1;
+    waitpid $pidg, 0;
+    print "done waiting\n" if $verbose > 1;
+  }
+}
+
+sub tally_result {
+  (my $number, my $status, my $correct, my $incorrect) = @_;
+  my $showboard = $status ne "skipped";
+  $passes++ if $status eq "passed";
+  $unexpected_pass++ if $status eq "PASSED";
+  $failures++ if $status eq "failed";
+  $unexpected_fail++ if $status eq "FAILED";
+  
+  if (($verbose and $status ne "skipped") or
+      (!$verbose and ($status eq "PASSED" or $status eq "FAILED")) ) {
+    print "$g_curtestfile:$number: $status: correct: $correct  answer: $incorrect\n";
+  }
+  
+  $cur_passed = ($status =~ /pass/i);
+  if ($showboard) {
+    mkdir ("html/$testfile");# die quietly - probably already exists.
+    my $brd = new FileHandle;
+    open ($brd, "> html/$testfile/$num.xml") || die "ERROR: couldn't crate xml board: $!\n";
+    my $brdout = eat_board();
+    print $brd "<GOPROB filepos=$filepos number=$num file=\"$testfile\" status=\"$status\">\n";
+    print $brd qq@<ENGINE version="$goprog_version" name="goprog_name" timestamp="goprog_timestamp">\n@;
+    print $brd "<CORRECT>$correct</CORRECT>\n";
+    print $brd "<ANSWER>$incorrect</ANSWER>\n";
+    if ($html_whole_gtp !~ /^\s*loadsgf/m) {
+      $old_whole_gtp .= $html_whole_gtp;
+      $html_whole_gtp = $old_whole_gtp;
+    }
+    print $brd "<GTP_ALL>\n$html_whole_gtp\n</GTP_ALL>";
+    foreach my $listval ("DESCRIPTION", "CATEGORY", "SEVERITY") {
+      my $astxt;
+      $html_whole_gtp =~ /$listval=(.*?)<BR>/;
+      if (defined($1)) {$astxt = $1;} else {$astxt = "";};
+      print $brd "<$listval>$astxt</$listval>\n";
+    }
+    print $brd "<COUNTERS ";
+    foreach (@counters) {
+      go_command("get_${_}_counter");
+      my $counts = eat_one();
+      defined($counts) or confess "Missing count";
+      defined($counters{$_}) or confess "Missing counter";
+      my $countdelta = $counts - $counters{$_};
+      $counters{$_} = $counts;
+      print $brd qq@\n  $_="$countdelta"@;
+    }
+    print $brd ">\n";
+
+
+    go_command("cputime");
+    my $new_cputime = <$goprog_out>;
+    ($new_cputime) = ($new_cputime =~ /((\d|\.)+)/);
+    print "cputime: ".$new_cputime."\n" if $verbose > 1;
+    <$goprog_out>;  
+    print $brd "<TIME wall=0.0 CPU=" . sprintf("%.5f", $new_cputime - $cputime) .  ">\n";
+    $cputime = $new_cputime;
+
+    print $brd "<GTP_COMMAND>$prev_cmd</GTP_COMMAND>\n";
+    print $brd $brdout;
+    
+    print $brd "<TRACE_OUTPUT>$trace_output</TRACE_OUTPUT>\n";
+    $trace_output= "";
+    
+    print $brd "</GOPROB>\n";
+    close $brd;
+  }
+}
+
+sub html_encode {
+  my $r = shift;
+  $r =~ s/&/&amp;/g;
+  $r =~ s/</&lt;/g;
+  $r =~ s/>/&gt;/g;
+  return $r;
+}
+
+
+sub eat_board {
+  go_command("query_boardsize");
+  my $line = eat();
+  (undef, $boardsize) = split(' ', $line, 2);
+  $boardsize = $boardsize + 0;
+  my $linesleft = $boardsize + 2;
+
+  my $xboard = "";
+
+  my $cur_point = 0;
+  my $cur_color = 0;
+  my $cur_matcher_status = 0;
+  my $cur_dragon_status=0;
+  my $cur_owl_status=0;
+  my $cur_color_letter=0;
+  my %dragons;
+  my $white_letter = chr(ord('z')+1);
+  my $black_letter = chr(ord('A')-1);
+  my $iline = 1;
+  my $no_dragon_data = 0;
+  my %stones;
+
+  if ($prev_cmd =~ /reg_genmove/) {
+    #FIXME: There may be other commands that won't require dragon_data
+    #to be regenerated.  Better might be to provide a way to query the
+    #engine whether dragon_data is currently available w/out regenerating.
+    go_command("dragon_data\n");
+    while ($iline) {
+      $iline = $_ = <$goprog_out>;
+      if ($iline =~ /^\?(.*)/) {
+        $no_dragon_data = $1;
+        $iline = $_ = <$goprog_out>;
+        last;
+      }
+      $iline =~ s/\s*$//mg;
+      if ($iline =~ /^=?\s*([A-Z][0-9][0-9]?):\s*$/ || !$iline) {
+       if ($cur_point) {
+         if ($cur_color eq "white") {
+           $_ = $white_letter = chr(ord($white_letter)-1);
+           $cur_color_letter = "O";
+         } elsif ($cur_color eq "black"  || die "invalid color $cur_color") {
+           $_ = $black_letter = chr(ord($black_letter)+1);
+           $cur_color_letter = "X";
+         }
+         $dragons{$cur_point} = $_ . ";status=" . $cur_dragon_status . 
+                                     ";owl_status=" . $cur_owl_status . 
+                                     ";color_letter=" . $cur_color_letter.
+                                     ";";
+          $cur_color = 0;
+          $cur_matcher_status = 0;
+          $cur_dragon_status=0;
+          $cur_owl_status=0;
+          $cur_color_letter=0;
+       }
+       $cur_point = $1;
+      } elsif ($iline =~ /^color:?\s+([blackwhite]*)\s*$/) {
+        $cur_color = $1;
+      } elsif ($iline =~ /^matcher_status:?\s+(\S*)\s*$/) {
+        $cur_matcher_status = $1;
+      } elsif ($iline =~ /^status:?\s+(\S*)\s*$/) {
+        $cur_dragon_status = $1;
+      } elsif ($iline =~ /^owl_status:?\s+(\S*)\s*$/) {
+        $cur_owl_status = $1;
+      } else {
+        #we ignore lots of dragon data!
+      }
+    }
+  } else {
+    $no_dragon_data=1;
+    foreach $cur_color ("white", "black") {
+      $iline = 1;
+      go_command("worm_stones $cur_color");
+      if ($cur_color eq "white") {
+        $cur_color_letter = "O";
+      } elsif ($cur_color eq "black"  || die "invalid color $cur_color") {
+        $cur_color_letter = "X";
+      }
+      while ($iline) {
+        $iline = <$goprog_out>;
+        my $splitline = $iline;
+        $splitline =~ s/^[=]\s*//;
+        $splitline =~ s/\s*$//mg;
+        foreach (split (/\s+/,$splitline)) {
+          $stones{$_} =";color_letter=" . $cur_color_letter.
+                      ";";
+        }
+        $iline =~ s/\s*$//mg;
+      }
+    }
+  }
+  
+  if ($prev_cmd =~ /^[0-9]*\s*reg_genmove/) {
+    if (! ($next_cmd =~ /^#\?\s*\[(!)?\(?(.*)\)?\]\*?\s*$/)) {
+      print "BAD TEST: $next_cmd\n";
+    }
+    #$1 and $2 are just $bang and $correct_re, right?
+    #print "Genmove test:\n";
+    #print "  $1;$2\n";
+    foreach (split(/\|/,$2)) {
+      if ($1) {
+        $stones{$_} .= ";known_wrong;";
+      } else {
+        $stones{$_} .= ";known_right;";
+      }
+    }
+    if ($cur_passed) {
+      $stones{$result} .= ";try_right;";
+    } else {
+      $stones{$result} .= ";try_wrong;";
+    }
+  } else {
+    # Experimental - should work for reg_genmove too!
+    if (! ($next_cmd =~ /^#\?\s*\[(!)?\(?(.*)\)?\]\*?\s*$/)) {
+      print "BAD TEST: $next_cmd\n";
+    }  #see commend on this regex above.
+    my $known = $2;
+    #Here, look for something that looks like a move!
+    while ($known =~ s/([A-Z]\d\d?)//) {
+      if ($bang) {
+        $stones{$1} .= ";known_wrong;";
+      } else {
+        $stones{$1} .= ";known_right;";
+      }
+    }
+    my $try = $result;
+    while ($try =~ s/([A-Z]\d\d?)//) {
+      if ($cur_passed) {
+        $stones{$1} .= ";try_right;";
+      } else {
+        $stones{$1} .= ";try_wrong;";
+      }
+    }
+  }
+    
+  {
+    my $pc = $prev_cmd;
+    while ($pc =~ s/([A-Z]\d\d?)//) {
+      $stones{$1} .= ";question;";
+    }
+  }
+
+    
+
+  unless ($no_dragon_data) {   
+    #FIXME: This data is available via the strings line from dragon_data.
+    go_command("dragon_stones");
+    $iline = 1;
+    while ($iline) {
+      $iline = <$goprog_out>;
+      $iline =~ s/\s*$//mg;
+      $iline =~ s/^=?\s*//;
+      $iline = " " . $iline . " ";
+      foreach (keys(%dragons)) {
+        my $k = $_;
+        my $label = $dragons{$k};
+        if ($iline =~ (" ".$k." ")) {
+          $iline =~ s/^\s*//;   
+          $iline =~ s/\s*$//;
+          foreach (split(/ /,$iline)) {
+            $stones{$_} = $label;
+          }
+        }
+      }
+      $iline =~ s/\s*//mg;
+    }
+  }
+
+  my %tmarr;
+  if ($prev_cmd =~ /.*reg_genmove\s+([whiteblack]+)/) {
+    go_command ("top_moves");
+    my $top_moves = <$goprog_out>;
+    <$goprog_out>;
+    if ($top_moves) {
+      $top_moves =~ s/^=\s*//;
+      $top_moves =~ s/\s*$//mg;
+      print "TOP_MOVES:'$top_moves'\n" if $verbose > 1;
+      if ($top_moves =~ /^\s*(.*)\s*/) { #i.e. always!
+        my $t = $1;
+        %tmarr = split(/\s+/,$t);
+        foreach my $k (keys(%tmarr)) {
+          $stones{$k} .=  ";move_value=$tmarr{$k};";
+        }
+      }
+    }
+  }
+        
+  my $j;
+  my $i;
+
+  for ($j = $boardsize; $j > 0; $j--) {
+    my $jA = $j;
+    if ($j <= 9) {
+      $jA .= " ";
+    }
+    for ($i = 1; $i <= $boardsize; $i++) {
+      my $iA = ord('A') + $i - 1;
+      if ($iA >= ord('I')) { $iA++; }
+      $iA = chr($iA);
+      my $point = "";
+      if ($stones{$iA.$j}) {
+        $point .= qq/   coord="$iA$j"\n/;
+        my $status = $stones{$iA.$j};
+        if ($status =~ /(.).*;owl_status=([^;]*);/) {
+          $point .= qq/   owl_status="$2"\n/;
+        }
+        if ($status =~ /(.).*;status=([^;]*);/) {
+          $point .= qq/   dragon_letter="$1"\n/;
+          $point .= qq/   dragon_status="$2"\n/;
+        }
+        if ($status =~ /;color_letter=([^;]*);/) {
+          $point .= qq/   stone="/ . (($1 eq 'X') ? 'black' : 'white') . qq/"\n/;
+        }
+        if ($status =~ /;move_value=([^;]*);/) {
+          $point .= qq/   move_value="$1"\n/;
+        }
+        $point .= qq/   known="wrong"\n/ if ($status =~ /;known_wrong;/);
+        $point .= qq/   known="right"\n/ if ($status =~ /;known_right;/);
+        $point .= qq/   try="right"\n/   if ($status =~ /;try_right;/);
+        $point .= qq/   try="wrong"\n/   if ($status =~ /;try_wrong;/);
+        
+        $point .=  qq/   question="1"\n/  if ($status =~/;question;/);
+      }
+      if ($point) {
+        $xboard .= " <POINT\n" . $point . " ></POINT>\n";
+      }
+    }
+  }
+  
+  return "<BOARD size=$boardsize>\n" . $xboard . "</BOARD>\n";
+}
+
+
+sub eat() {
+  # ignore empty lines
+  my $line = "";
+  while ($line eq "") {
+    chop($line = <$goprog_out>) or confess "No response!";
+    $line =~ s/\s*$//smg;
+  }
+  <$goprog_out>;
+  return $line;
+}  
+
+
+sub eat_one {
+    my ($equals, $move) = split(' ', eat(), 2);
+    return $move;
+}
+
+sub go_command {
+  my $cmd = shift;
+  print $goprog_in "$cmd\n";
+  print "CMD:$cmd\n" if $verbose > 1;
+  foreach (@counters) {
+    if ($cmd =~ /reset_${_}_counter/) {
+      $counters{$_} = 0;
+    }
+  }
+}
+
+
+my %images;
+sub extract_images {
+  my $line = shift;
+  #i.e.: <TD><IMG HEIGHT=25 WIDTH=25 SRC="../images/B25x43_green.png"></TD>
+  if ($line =~ /SRC=.*images.(.*)\"><.TD>.*/) {
+    if ($verbose) {
+      print "  found: $1\n" unless ($images{$1});
+    }
+    $images{$1} = 1;
+  }
+}
+
+our $curdir;
+our $curfile;  
+our $CURDIR;
+sub extract_image_dir {
+  local $curdir = shift;
+  local $CURDIR;
+  opendir $CURDIR, $curdir;
+  while (local $curfile = readdir $CURDIR) {
+    $_ = "$curdir/$curfile";
+    #print -d."\n";
+    #print "X:".($curfile=~/^\.+$/)."\n";
+    if ((-d ) && !($curfile=~/^\.{1,2}$/)) {
+      print "diving into: $curdir/$curfile\n" if $verbose>2;
+      extract_image_dir ("$curdir/$curfile");
+    } elsif (($curfile =~ /\.html$/) && ($curdir =~ /d2/)) {
+      print "processing: $curdir/$curfile\n" if $verbose;
+      open IMGFILE, "<$curdir/$curfile" or die "Couldn't open: $curdir/$curfile" ;
+      while (<IMGFILE>) {
+        extract_images($_);
+      }
+      close IMGFILE;
+    } else {
+      #print "no match: $curdir/$curfile\n" if $verbose;
+    }
+  }
+  closedir CURDIR;
+}
+
+sub make_images {
+  print "Starting processing\n" if $verbose;
+  extract_image_dir (".") ;
+  print "Processed files, generated ".((scalar keys(%images))/2)
+         ." unique images:\n" if $verbose;
+  foreach (keys(%images)) {
+    parseFileName($_);
+  }
+  print "Done.\n" if $verbose;
+}
+
+
+sub allTargets {
+  open (MAKEFILE, "< Makefile.in");
+  my @targets = "";
+  while (<MAKEFILE>) {
+    if (s/^all_batches://) {
+      @targets = split;
+      last;
+    }
+  }
+  my $target_reg = "^" . join ("|", @targets) . ":" ;
+  close MAKEFILE;
+  
+  open  (MAKEFILE, "< Makefile.in");
+  my @files;
+  while (<MAKEFILE>) {
+    if ($_ =~ $target_reg) {
+      chop($_ = <MAKEFILE>);
+      while ($_) {
+        push @files, $_ =~ /\s+(\w+\.tst)/;
+        chop if defined($_ = <MAKEFILE>);
+      }
+    }
+  }
+  close MAKEFILE;
+  
+  return @files;
+}
diff --git a/regression/regress.plx b/regression/regress.plx
new file mode 100755 (executable)
index 0000000..fe1f2a7
--- /dev/null
@@ -0,0 +1,1128 @@
+#!/usr/bin/perl
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# This program is distributed with GNU Go, a Go program.            #
+#                                                                   #
+# Write gnugo@gnu.org or see http://www.gnu.org/software/gnugo/     #
+# for more information.                                             #
+#                                                                   #
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007    #
+# and 2008 by the Free Software Foundation.                         #
+#                                                                   #
+# This program is free software; you can redistribute it and/or     #
+# modify it under the terms of the GNU General Public License       #
+# as published by the Free Software Foundation - version 3          #
+# or (at your option) any later version.                            #
+#                                                                   #
+# This program is distributed in the hope that it will be           #
+# useful, but WITHOUT ANY WARRANTY; without even the implied        #
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
+# PURPOSE.  See the GNU General Public License in file COPYING      #
+# for more details.                                                 #
+#                                                                   #
+# You should have received a copy of the GNU General Public         #
+# License along with this program; if not, write to the Free        #
+# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
+# Boston, MA 02111, USA.                                            #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Here is a perlscript regress.plx. 
+#
+# It parses the XML files created by regress.pl and generates HTML.
+# It is designed to be run as a CGI script.
+
+
+
+#BEGIN {
+#  use CGI::Carp qw(carpout);
+#  my $errfile = "C:/temp/web.err";
+#  #open (WEBERR, ">$errfile") or die "Couldn't open $errfile.";
+#  carpout(STDOUT);
+#}
+#
+
+use strict;
+use warnings;
+
+use CGI qw/:standard/;
+use CGI::Carp 'fatalsToBrowser';
+
+use FindBin;
+use lib "$FindBin::Bin/../interface";
+
+use GoImage::Stone;
+
+use HTML::Entities ;#qw/encode_entity/;
+  
+
+#set $name to whatever this script is called in the URL.
+#eg, if you access it from http://example.com/regress/
+#then set $name = ""
+
+my $name = "regress.plx";
+
+my $debug=2;
+
+my %colors = ("ALIVE", "green",
+       "DEAD", "cyan",
+       "CRITICAL", "red",
+       "UNKNOWN", "yellow",
+       "UNCHECKED", "magenta");
+
+my $query = new CGI;
+my ($tstfile, $num, $sortby, $sgf, $reset, $trace, $bycat,
+     $unexpected, $slow, $special, $move, $small);
+
+($tstfile, $num) = ($query->query_string() =~ /keywords=(.*)%3A(.*)/);
+
+if (!$tstfile) {
+  $tstfile = $query->param("tstfile");
+  $num = $query->param("num");
+  $sortby = $query->param("sortby");
+  $sgf = $query->param("sgf");
+  $reset = $query->param("reset");
+  $trace = $query->param("trace");
+  $bycat = $query->param("bycat");
+  $unexpected = $query->param("unexpected");
+  $slow = $query->param("slow");
+  $special = $query->param("special");
+  $move = $query->param("move");
+  $small = $query->param("small");
+}
+
+sub sgfFile(%);
+
+
+#print "HTTP/1.0 200 OK\r\n";
+print "Content-type: " .
+        do {
+          my $plain = $trace;
+          if ($sgf) { "application/x-go-sgf" }
+          elsif ($plain) { "text/plain" }
+          else {"text/html"; }
+        } . "\r\n\r\n";
+
+if ($tstfile) {
+  $tstfile = $1 if $tstfile =~ /(.*)\.tst$/;
+}
+if ($tstfile && !($tstfile =~ /^[a-zA-Z0-9_]+$/)) {
+  print "bad test file: $tstfile\n";
+  exit;
+}
+if ($reset) {
+  unlink glob("html/*.html");# or die "couldn't delete html files: $!";
+  unlink glob("html/*/*.html");# or die "couldn't delete html/* files: $!"; 
+  unlink "html/one.perldata";# or die "couldn't delete data file";
+  print "Cleaned up!<HR>\n";
+}
+
+if ($trace) {
+  open (TRACER, "html/$tstfile.tst/$num.trace") or
+    do {print "Couldn't find trace file: $!";  exit;};
+  while (<TRACER>) {
+    print;
+  }
+  close TRACER;
+  exit;
+}
+
+
+
+
+my %points;
+
+unless ($tstfile) {
+#CASE 1 - main index
+  if (!-e "html/index.html") {
+    createIndex();
+  } else {
+    print STDERR "Cached!\n";
+  }
+  
+  if ($bycat) {
+    printbycategory();
+    exit;
+  }
+  
+  if ($unexpected) {
+    printunexpected();
+    exit;
+  }
+  
+  if ($slow) {
+    printslow();
+    exit;
+  }
+  
+  if ($special) {
+    printspecial();
+    exit;
+  }
+  
+  if (-z "html/index.html") {
+    print "Yikes - index missing - please reset!";
+    exit;
+  }
+  
+  open (TESTFILE, "html/index.html") or do {print "$! ".__LINE__; confess "$!"};
+  while (<TESTFILE>) {
+    print;
+  }
+  close TESTFILE;
+  exit;
+}
+
+my %fullHash;
+#use Data::Dumper;
+
+sub insinglequote {
+  my $s = shift;
+  $s =~ s@\\@\\\\@g;
+  $s =~ s@'@\\'@g;
+  return "'$s'";
+}
+
+sub FastDump {
+  my ($h) = @_;
+
+  open (FILE, ">html/one.perldata.new") or confess "can't open";
+  print  FILE "\$VAR1 = [\n {\n";
+  
+
+
+  #print FILE Dumper([\%h]) or confess "couldn't print";
+
+  foreach my $k1 (sort keys %{$h}) {
+    print FILE "  '$k1' =>\n   {\n";
+    foreach my $k2 (sort keys %{%{$h}->{$k1}}) {
+      print FILE "     '$k2' => " . insinglequote(%{$h}->{$k1}->{$k2}) . ",\n";
+    }
+    print FILE "   },\n";
+  }
+  
+  print FILE "  }\n ];";
+
+  close FILE or confess "can't close";
+}
+
+sub createIndex {
+  my %h;
+  foreach my $file (glob("html/*.tst/*.xml")) {
+    my ($tst, $prob) = $file =~ m@html.(.*).tst.(.*).xml@;
+    open (FILE, "$file");
+    local $/; undef($/);
+    my $content = <FILE>;
+    close FILE;
+    $h{"$tst:$prob"} = game_parse($content, 0);
+    delete $h{"$tst:$prob"}->{gtp_all};
+  }
+  
+  FastDump(\%h);
+  
+  #print "DONE!\n";
+  #return;  
+
+  #our $VAR1;
+  #do "html/one.perldata" or confess "can't do perldata";
+  #my %h = %{$VAR1->[0]};
+
+
+  open I, ">html/index.html";
+
+  print I qq@<HTML>
+ <HEAD>
+  <TITLE>Regression test summary - </TITLE>
+  <META NAME="ROBOTS" CONTENT="NOFOLLOW">
+ </HEAD>
+ <BODY>
+ <H3> Regression test summary - </H3>
+ Program: _CMDLINE_TBD_ <BR>
+ <A href="$name?bycat=1">View by category</A><BR>
+ <A href="$name?unexpected=1">View unexpected results</A><BR>
+ <TABLE border=1>
+ <TR><TD>file</TD><TD>passed</TD><TD>PASSED</TD><TD>failed</TD><TD>FAILED</TD>
+ </TR>@;
+  
+  my @pflist = ("passed", "PASSED", "failed", "FAILED");
+  my %totHash;
+  @totHash{@pflist} = (0,0,0,0);
+
+  sub byfilebynum {
+    my ($fileA,$numA) = $a =~ /(.*):(.*)/;
+    my ($fileB,$numB) = $b =~ /(.*):(.*)/;
+    $fileA cmp $fileB or $numA <=> $numB;
+  }    
+
+  my $curfile = "";
+  my %subTotHash;
+  foreach my $k1 (sort byfilebynum keys %h) { #$k1 = filename
+    if ($k1 !~ /^$curfile:/) {
+      if ($curfile ne "") {
+        #New file = print old totals
+        print I qq@<TR>\n <TD><A href="$name?tstfile=$curfile&sortby=result">$curfile</A></TD>\n@;
+        foreach my $k2 (@pflist) {
+          my $c = @{$subTotHash{$k2}};  #i.e. length of array.
+          $totHash{$k2} += $c;
+          if ($k2 !~ /passed/ and $c) {
+            print I " <TD>$c:<BR>\n";
+            foreach (sort {$a<=>$b} @{$subTotHash{$k2}}) {
+              print I qq@  <A href="$name?$curfile:$_">$_</A>\n@;
+            }
+            print I " </TD>\n";
+          } else {
+            print I " <TD>$c</TD>\n";
+          }
+        }
+        print I qq@</TR>@;
+      }
+      #prepare for next file.
+      ($curfile) = $k1 =~ /(.*):/;
+      @subTotHash{@pflist} = ([],[],[],[]);
+    }
+    push @{$subTotHash{$h{$k1}{status}}}, $h{$k1}{num};
+  }
+  
+      #direct copy from above - don't miss last time through - HACK!  
+        if ($curfile ne "") {
+        #New file = print old totals
+        print I qq@<TR>\n <TD><A href="$name?tstfile=$curfile&sortby=result">$curfile</A></TD>\n@;
+        foreach my $k2 (@pflist) {
+          my $c = @{$subTotHash{$k2}};  #i.e. length of array.
+          $totHash{$k2} += $c;
+          if ($k2 !~ /passed/ and $c) {
+            print I " <TD>$c:<BR>\n";
+            foreach (sort {$a<=>$b} @{$subTotHash{$k2}}) {
+              print I qq@  <A href="$name?$curfile:$_">$_</A>\n@;
+            }
+            print I " </TD>\n";
+          } else {
+            print I " <TD>$c</TD>\n";
+          }
+        }
+        print I qq@</TR>@;
+      }
+
+  
+  print I "<TR>\n <TD><B>Total</B></TD>\n";
+  foreach (@pflist) {
+    print I " <TD>$totHash{$_}</TD>\n";
+  }
+  print I "</TR>\n";
+  print I " </TABLE></BODY></HTML>\n";
+  close I;
+} 
+
+sub bypPfF {
+  pPfFtonum($a) <=> pPfFtonum($b);
+}
+
+sub pPfFtonum {
+  $_ = shift;
+  s/FAILED/4/;  s/failed/3/; s/PASSED/2/; s/passed/1/;
+  $_;
+}
+
+sub fptonum {
+  $_ = shift;
+  s/FAILED/1/;  s/failed/3/; s/PASSED/2/; s/passed/4/; s/<B>//; s@</B>@@;
+  $_;
+}
+my @counters = qw/connection_node owl_node reading_node trymove/;
+
+if ($move) {
+#CASE 2a - move detail - extract interesting info from trace file.
+  if (!$num) {
+    print "Must provide num if providing move.<BR>";
+    exit;
+  }
+  
+  print qq@<HTML>
+  <HEAD>
+  <TITLE>$tstfile:$num move $move</TITLE>
+  <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+  </HEAD><BODY>\n@;
+  
+  open (FILE, "html/$tstfile.tst/$num.trace") or die "couldn't open trace file $tstfile, $num: $!.";
+  #local $/; undef($/);
+  #my $content = <FILE>;
+  #close FILE;
+  
+  my $blank=1;
+  my $inpattern=0;
+  $move = uc($move);
+  print "<PRE>\n";
+  while (<FILE>) {
+    if (/^$move[^0-9]/ || 
+        /[^A-Za-z0-9]$move[^0-9]/ || 
+        $inpattern && /^\.\.\./) {
+      print encode_entities($_);
+      $blank=0;
+      $inpattern ||= /^pattern.*at $move/;
+    } else {
+      print "\n" unless $blank;
+      $blank++;
+      $inpattern=0;
+    }
+  }
+  print "</PRE></BODY></HTML>\n";
+  exit;
+}
+  
+
+if ($num) {
+#CASE 2 - problem detail.
+
+  if ($sgf && -e "html/$tstfile.tst/$num.sgf") {
+    open (SGFFILE, "html/$tstfile.tst/$num.sgf") or confess "couldn't open file";
+    while (<SGFFILE>) {
+      print;
+    }
+    close SGFFILE;
+    exit;
+  }
+
+  open (FILE, "html/$tstfile.tst/$num.xml") or die "couldn't open xml file\n";
+  local $/; undef($/);
+  my $content = <FILE>;
+  close FILE;
+  my %attribs = %{game_parse($content, 1)};
+
+  if ($sgf) {
+    foreach (sort keys %attribs) {
+    #  print "$_: $attribs{$_}\n";
+    }
+    sgfFile(%attribs);
+    exit;
+  }
+  
+  print qq@<HTML><HEAD>
+    <TITLE>$tstfile:$num details.</TITLE>
+    <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+    </HEAD>\n@;
+  print qq@<BODY><TABLE border=1>\n@;
+  print qq@
+ <TR>
+   <TD>number:</TD><TD>$attribs{"num"}</TD><TD>&nbsp;</TD>
+   <TD>cputime:</TD><TD>$attribs{"cputime"}</TD>
+ </TR><TR>
+   <TD>status:</TD><TD>$attribs{"status"}</TD><TD>&nbsp;</TD>
+   <TD>$counters[0]:</TD><TD>$attribs{"$counters[0]_counter"}</TD>
+ <TR>
+   <TD>correct:</TD><TD>$attribs{"correct"}</TD><TD>&nbsp;</TD>
+   <TD>$counters[1]:</TD><TD>$attribs{"$counters[1]_counter"}</TD>
+ <TR>
+   <TD>answer:</TD><TD>$attribs{"answer"}</TD><TD>&nbsp;</TD>
+    <TD>$counters[2]:</TD><TD>$attribs{"$counters[2]_counter"}</TD>
+ <TR>
+   <TD>gtp:</TD><TD>$attribs{"gtp_command"}</TD><TD>&nbsp;</TD>
+   <TD>$counters[3]:</TD><TD>$attribs{"$counters[3]_counter"}</TD>
+ </TR><TR><TD>category:</TD><TD>$attribs{"category"}</TD>
+ </TR><TR><TD>severity:</TD><TD>$attribs{"severity"}</TD>
+ </TR><TR><TD>description:</TD><TD>$attribs{"description"}</TD>
+ </TR>
+</TABLE>\n\n@;
+  print qq@<HR>\n\n@;
+  print qq@
+<TABLE border=0>
+<TR><TD><A href="$name?tstfile=$tstfile&num=$num&sgf=1">SGF File</A>
+</TD><TD>&nbsp;&nbsp;&nbsp;<A href="$name?tstfile=$tstfile&num=$num&trace=1" target=tracefile>Trace File</A>
+</TD></TR></TABLE>
+@;
+
+  print qq@<TABLE><TR><TD> dragon_status | owl_status\n@;
+
+  my $boardsize = $attribs{"boardsize"};  #need to add to export.
+
+  my $colorboard;
+
+  $colorboard .= "<TABLE border=0 cellpadding=0 cellspacing=0>\n"
+             . colorboard_letter_row($boardsize). "\n";
+    
+  for (my $j = $boardsize; $j > 0; $j--) {
+    my $jA = $j;
+    $jA .= " " if ($j <= 9);
+    $colorboard .= " <TR>\n  <TD align=center valign=center>&nbsp;$j&nbsp;</TD>\n";
+    for (my $i = 1; $i <= $boardsize; $i++) {
+      my $iA = ord('A') + $i - 1;
+      if ($iA >= ord('I')) { $iA++; }
+      $iA = chr($iA);  
+      my $coord = $iA.$j;
+      my $bw = pval($coord, "stone");
+      my $img_pix_size = 25;
+      my $dragonletter = pval($coord, "dragon_letter");
+      my $dragoncolor = $colors{pval($coord, "dragon_status")};
+      my $owlcolor = $colors{pval($coord, "owl_status")};
+      my $owlletter = $dragonletter;
+      my $alt = "";
+      
+      my ($markcolor, $known, $try) = ("", pval($coord, "known"), pval($coord, "try"));
+      $markcolor = "magenta" if ($known and $known eq "wrong");
+      $markcolor = "green"  if ($known and $known eq "right");
+      $markcolor = "cyan" if ($try and $try eq "right");
+      $markcolor = "red" if ($try and $try eq "wrong");
+      
+      my $question = pval($coord, "question");
+      if ($question) {
+        $dragonletter .= "*";
+        $owlletter = "";
+        $dragoncolor = "blue" unless $dragoncolor;
+      }
+      
+      my $score = pval($coord, "move_value");
+      if ($score) {
+        # FIXME: Should round this, not truncate it.
+        #     Also, should remove trailing "." if not necessary.
+        $dragonletter = substr($score, 0,3);
+        $dragoncolor = "blue";
+        $owlletter="";
+        $alt = "whack";
+      }
+
+      my $colorboard_imgsrc = createPngFile($bw, $img_pix_size, "", $dragonletter, $dragoncolor, $owlletter, $owlcolor, $markcolor);
+      $colorboard .= qq@  <TD><A href="$name?tstfile=$tstfile&num=$num&move=$coord" target=movewin>@ .
+                     qq@<IMG border=0 HEIGHT=$img_pix_size WIDTH=$img_pix_size @ . 
+                     qq@SRC="html/images/$colorboard_imgsrc"></A></TD>\n@;
+    }
+    $colorboard .= "  <TD align=center valign=center>&nbsp;$j&nbsp;</TD>\n </TR>\n";
+  }
+  $colorboard .= colorboard_letter_row($boardsize);
+  $colorboard .= "\n</TABLE>\n";
+
+  print $colorboard;
+  print qq@</TD><TD valign=top>
+<PRE>\n\n\n\n
+<FONT color=green>green=alive</FONT>
+<FONT color=cyan>cyan=dead</FONT>
+<FONT color=red>red=critical</FONT>
+<FONT color=yellow>yellow=unknown</FONT>
+<FONT color=magenta>magenta=unchecked</FONT>
+</PRE>
+</TD></TR>
+</TABLE>@;
+  my $gtpall = $attribs{gtp_all};
+  $gtpall  =~ s/<BR>//mg;
+  $gtpall  =~ s/\s+$//mg;
+  $gtpall  =~ m@loadsgf\s+ ((?:\w|[-+.\\/])+)  [ \t]* (\d*) @x
+    or $gtpall =~m/(.*?)/;  #Problems!!!!  
+  
+  my $cmdline = "gq -l $1 " . ($2 ? "-L $2 " : "");
+  if ($gtpall =~ m@ .* (owl_attack|owl_defend|dragon_status) \s* ([A-Z]\d{1,2}) \s* $ @x) {
+    $cmdline .= "--decide-dragon $2 -o x.sgf" ;
+  } elsif ($gtpall =~ m@ .* (reg_genmove\s+[whiteblack]*)  \s* $@x) {
+    $cmdline .= "-t -w -d0x101800";
+  } elsif ($gtpall =~ m@ .* (attack|defend) \s* ([A-Z]\d{1,2}) \s* $ @x) {
+    $cmdline .= "--decide-string $2 -o x.sgf";
+  } else {
+    $cmdline .= " <BR> (directive unrecognized)";
+  }
+  print qq@<HR>\n\n@;
+  print qq@<TABLE border=1>\n@;
+  print qq@ <TR><TD>CMD Line Hint:</TD><TD>$cmdline</TD></TR>\n@;
+  print qq@ <TR><TD>Full GTP:</TD><TD>$attribs{gtp_all}</TD></TR>\n</TABLE>\n@;
+  
+  print "\n\n</HTML>";
+ # print %attribs;
+  
+} else {
+  
+  if ($small) {
+    summaryDiagrams();
+  }
+#CASE 3 - test file summary.
+#  if (!-e "html/$tstfile.tst/index.html") {
+    summarizeTestFile();
+#  } else {
+#    print "Cached:<HR>";
+#  }
+#  open (TESTFILE, "html/$tstfile.tst/index.html") or (print "$! ".__LINE__, die);
+#  while (<TESTFILE>) {
+#    print;
+#  }
+#  close TESTFILE;
+}
+
+
+sub summaryDiagrams {
+  my $content;
+  foreach my $curfile (glob("html/$tstfile.tst/*.xml"))
+  {
+    %points = {};
+    $curfile =~ s/html.$tstfile.tst.(.*xml)/$1/;
+    local $/;
+    undef($/);
+    open(FILE, "html/$tstfile.tst/$curfile");
+    $content = <FILE>;
+    close FILE;
+
+    my %attribs = %{game_parse($content, 1)};
+
+    print qq@<HR><A href="$name?$tstfile:$attribs{num}">$tstfile:$attribs{num}</A>\n@;
+
+    my $boardsize = $attribs{"boardsize"};  #need to add to export.
+    my $colorboard;
+    $colorboard .= "<TABLE border=0 cellpadding=0 cellspacing=0>\n"
+             . "\n";
+
+  my $img_pix_size = 9;
+    
+  for (my $j = $boardsize; $j > 0; $j--) {
+    my $jA = $j;
+    $jA .= " " if ($j <= 9);
+    $colorboard .= "<TR>\n";
+    for (my $i = 1; $i <= $boardsize; $i++) {
+      my $iA = ord('A') + $i - 1;
+      if ($iA >= ord('I')) { $iA++; }
+      $iA = chr($iA);  
+      my $coord = $iA.$j;
+      my $bw = pval($coord, "stone");
+      my $alt = "";
+      
+      my $colorboard_imgsrc = createPngFile($bw, $img_pix_size, "", "","","","", "");
+      $colorboard .= qq@  <TD>@ .
+                     qq@<IMG border=0 HEIGHT=$img_pix_size WIDTH=$img_pix_size @ . 
+                     qq@SRC="html/images/$colorboard_imgsrc"></A></TD>\n@;
+    }
+    $colorboard .= "</TR>\n";
+  }
+  #$colorboard .= colorboard_letter_row($boardsize);
+  $colorboard .= "\n</TABLE>\n";  
+  
+  print $colorboard;
+  }
+
+  exit;
+}
+
+
+
+my %files;
+sub summarizeTestFile {
+
+  unless ($sortby) { $sortby = "filepos"; }
+  
+ # open (TF, "> html/$tstfile.tst/index.html")
+ #   or print "couldn't open for output; $!\n", die;
+ *TF = *STDOUT;
+  
+  print TF qq@<HTML><HEAD>
+        <TITLE>$tstfile regression results - _VERSION_</TITLE>
+        <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+      </HEAD>\n@;
+  print TF "<BODY>\n";
+  print TF "<H3>$tstfile regression results - _VERSION_</H3>\n";
+  print TF qq@<TABLE border=1>
+<tr>
+  <TH><A href="$name?tstfile=$tstfile&sortby=filepos">line</A></TH>
+  <TH><A href="$name?tstfile=$tstfile&sortby=num">number</A></TH>
+  <TH><A href="$name?tstfile=$tstfile&sortby=result">result</A></TH>
+  <TH>expected </TH>
+  <TH>got</TH>
+  <TH>gtp</TH>
+  <TH><A href="$name?tstfile=$tstfile&sortby=cputime">cputime</A></TH>
+  <TH><A href="$name?tstfile=$tstfile&sortby=owl_node">owl_node</A></TH>
+  <TH><A href="$name?tstfile=$tstfile&sortby=reading_node">reading_node</A></TH>
+  <TH><A href="$name?tstfile=$tstfile&sortby=msperowl">1000*time/owl_node</A></TH>
+</TR>\n@;
+
+  my @files = glob("html/$tstfile.tst/*.xml");
+  foreach my $curfile (@files) {
+    $curfile =~ s/html.$tstfile.tst.(.*xml)/$1/;
+    local $/;
+    undef($/);
+    open(FILE, "html/$tstfile.tst/$curfile");
+    my $content = <FILE>;
+    close FILE;
+    my $gtp_all = $1
+      if $content =~ m@<GTP_ALL>(.*?)</GTP_ALL>@s;
+    my $gtp = escapeHTML($1)
+      if $content =~ m@<GTP_COMMAND>(.*?)</GTP_COMMAND>@s;
+    my $result = $1 
+      if $content =~ m@<GOPROB.*?status="(.*?)"@s; 
+    my $num = $1
+      if $content =~ m@<GOPROB.*?number=(\d*)@s;
+    my $filepos = $1
+      if $content =~ m@<GOPROB.*?filepos=(\d*)@s;
+    my $expected = $1
+      if $content =~ m@<CORRECT>(.*?)</CORRECT>@s;
+    my $got = $1
+      if $content =~ m@<ANSWER>(.*?)</ANSWER>@s;
+    my $cputime = $1
+      if $content =~ m@<TIME.*?CPU=((\d|\.)*)@s;
+    my $owl_node = $1
+      if $content =~ m@<COUNTER[^>]*owl_node="?(\d+)@s;
+    my $reading_node = $1
+      if $content =~ m@<COUNTER[^>]*reading_node="?(\d+)@s;
+    $cputime =~ s/0*$//;
+    $files{$curfile} = {
+      gtp_all => $gtp_all,
+      gtp => $gtp,
+      filepos => $filepos,
+      num => $num,
+      expected => $expected,
+      got => $got,
+      result => $result,
+      cputime => $cputime,
+      owl_node => $owl_node,
+      reading_node => $reading_node,
+      msperowl => ($owl_node ? 1000*$cputime/ $owl_node : 0),
+    }
+  }
+  sub byfilepos {  $files{$a}{"filepos"} <=> $files{$b}{"filepos"};   }
+  sub bynum  {  $files{$a}{"num"} <=> $files{$b}{"num"};   }
+  sub byresult {
+    fptonum($files{$a}{"result"}) <=> fptonum($files{$b}{"result"})
+    or byfilepos();
+  }
+  sub bycputime {
+    $files{$b}{cputime} <=> $files{$a}{cputime}
+    or byfilepos();
+  }
+  sub byowl_node {
+    $files{$b}{owl_node} <=> $files{$a}{owl_node}
+    or byfilepos();
+  }
+
+  sub byreading_node {
+    $files{$b}{reading_node} <=> $files{$a}{reading_node}
+    or byfilepos();
+  }
+  sub bymsperowl  {
+    $files{$b}{msperowl} <=> $files{$a}{msperowl}
+    or byfilepos();
+  }
+  
+  sub filesby {
+    $_ = shift;
+    return byfilepos if /filepos/i;
+    return bynum if /num/i;
+    return byresult if /result/i;
+    return bycputime if /cputime/i;
+    return byowl_node if /owl_node/i || /owlnode/i;
+    return bymsperowl if /msperowl/i;
+    return byreading_node if /reading_node/i || /readingnode/i;
+    $files{$a}{$_} <=> $files{$b}{$_};   
+  }
+  
+  my %totals = (cputime=>0, owl_node=>0);
+  
+  foreach my $curfile (sort {filesby($sortby)} keys %files) {
+    my %h = %{$files{$curfile}};
+    my $numURL = qq@<A href="$name?$tstfile:$h{num}">$h{num}</A>@;
+    my $r = $h{result};
+    $r =~ s@^([A-Z]*)$@<B>$1</B>@;
+    print TF "<TR><TD>$h{filepos}</TD><TD>$numURL</TD><TD>$r</TD><TD>$h{expected}</TD>"
+        . "<TD>$h{got}</TD><TD>$h{gtp}</TD><TD>$h{cputime}</TD><TD>$h{owl_node}</TD>"
+        . "<TD>$h{reading_node}</TD>"
+        . "<TD>".sprintf("%.2f",$h{msperowl})."</TD></TR>\n";
+    $totals{cputime} += $h{cputime};
+    $totals{owl_node} += $h{owl_node};
+    $totals{reading_node} += $h{reading_node};
+  }
+  print TF "<TR><TD>Total</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD>"
+    . "<TD>&nbsp;</TD><TD>&nbsp;</TD><TD>$totals{cputime}</TD><TD>$totals{owl_node}</TD>"
+    . "<TD>$totals{reading_node}</TD>"
+    ." <TD>".sprintf("%.2f",1000*$totals{cputime}/($totals{owl_node}+.0001))."</TD></TR>\n";
+  print TF "</TABLE>";
+  #close TF;
+}
+
+
+
+sub pval {
+  my ($coord, $attrib) = @_;
+  if ($points{$coord}) {
+#    print "$coord $attrib<BR>\n";
+    if ($points{$coord} =~ m@$attrib="(.*?)"@) {
+     # if ($attrib eq 'stone') {
+ #       print "$attrib=$1<BR>\n";
+      #}
+      return $1;
+    } else {
+      return "";
+    }
+  } else {
+    return "";
+  }
+}
+
+
+
+sub game_parse {
+  my $content = shift;
+  my $details = shift;
+  my %attribs;
+  $attribs{"num"} = $1
+    if $content =~ m@<GOPROB.*?number=(\d*)@s;
+  $attribs{"file"} = $1
+    if $content =~ m@<GOPROB.*?file="(.*?)"@s;
+  $attribs{"status"} = $1
+    if $content =~ m@<GOPROB.*?status="(.*?)"@s; 
+  $attribs{"correct"} = $1
+    if $content =~ m@<CORRECT>(.*?)</CORRECT>@s;
+  $attribs{"answer"} = $1
+    if $content =~ m@<ANSWER>(.*?)</ANSWER>@s;
+  $attribs{"gtp_all"} = $1
+    if $content =~ m@<GTP_ALL>(.*?)</GTP_ALL>@s;
+  $attribs{"description"} = $1
+    if $content =~ m@<DESCRIPTION>(.*?)</DESCRIPTION>@s;
+  $attribs{"category"} = $1
+    if $content =~ m@<CATEGORY>(.*?)</CATEGORY>@s;
+  $attribs{"severity"} = $1
+    if $content =~ m@<SEVERITY>(.*?)</SEVERITY>@s;
+  $attribs{"gtp_command"} = $1
+    if $content =~ m@<GTP_COMMAND>(.*?)</GTP_COMMAND>@s;
+  $attribs{"cputime"} = $1
+    if $content =~ m@<TIME.*?CPU=((\d|\.)*)@s;
+  $attribs{"boardsize"} = $1
+    if $content =~ m@<BOARD[^>]*size=(\d+)@s;
+  foreach (@counters) {
+    $attribs{$_."_counter"} = $1
+      if $content =~ m@<COUNTER[^>]*$_="?(\d+)@s;
+  }
+  
+  return \%attribs  unless $details;
+  
+  $content =~ s@.*?<POINT@<POINT@s;
+  while ($content =~ s@<POINT(.*?)></POINT>@@s) {
+    my $pattr = $1;
+    if ($pattr =~ m@coord="(.*?)"@s) {
+      $points{$1} = $pattr;
+    } else {
+      print "<P>MISSING coord: " . encode($content) . "<P>" . 
+          encode($pattr);
+      die;
+    }
+  }
+  
+  return \%attribs;
+}
+    
+    
+
+sub colorboard_letter_row {
+  my $boardsize = shift;
+  my $ret = " <TR>\n  <TD>&nbsp;</TD>\n";
+  for (my $i = 1; $i <= $boardsize; $i++) {
+      my $iA = ord('A') + $i - 1;
+      if ($iA >= ord('I')) { $iA++; }
+      $iA = chr($iA);
+      $ret .= "  <TD align=center valign=center>$iA</TD>\n"; 
+  }
+  $ret .= "  <TD>&nbsp;</TD>\n </TR>";
+}
+
+
+sub sgfFile(%) {
+  my %attribs = shift;
+  my $boardsize = $attribs{"boardsize"};  #need to add to export.
+
+  my $ret="";
+  $ret .= "(;\nFF[4]GM[1]SZ[$boardsize]\nAP[regress.plx]\n";
+   
+  for (my $j = $boardsize; $j > 0; $j--) {
+    my $jA = $j;
+    $jA .= " " if ($j <= 9);
+    for (my $i = 1; $i <= $boardsize; $i++) {
+      my $iA = ord('A') + $i - 1;
+      if ($iA >= ord('I')) { $iA++; }
+      $iA = chr($iA);  
+      my $coord = $iA.$j;
+      my $bw = pval($coord, "stone");
+      
+      if ($bw eq "black") {
+        $ret .= "AB\[" . GTPtoSGF($coord, $boardsize) . "]";
+      } elsif ($bw eq "white") {
+        $ret .= "AW\[" . GTPtoSGF($coord, $boardsize) . "]";
+      }
+    }
+  }
+  $ret.=")";
+  
+  $ret =~ s/((A[BW]\[..\]){12})/$1\n/g;
+  
+  print $ret;
+}
+
+
+sub GTPtoSGF {
+  local $_ = shift;
+  my $boardsize = shift;
+  if (! /([A-Z])([0-9]{1,2})/) {
+    return ;
+  }
+  $_ = ord($1) - ord("A") + 1;
+  if ($_ > (ord("I") - ord("A") + 1)) { $_--; }
+  chr(ord("a") + $_ - 1) . chr(ord("a") + $boardsize - $2);
+}
+
+
+sub printslow {
+  our $VAR1;
+  do "html/one.perldata.new" or confess "can't do perldata";
+  my %h = %{$VAR1->[0]};
+  my $by_cputime = 
+    sub {
+      $h{$b}->{cputime} <=> $h{$a}->{cputime}
+      or $a cmp $b;
+    };
+  
+
+  print qq@<HTML>
+  <HEAD>
+    <TITLE>Slow results - GNU Go</TITLE>
+    <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+  </HEAD>\n@;
+  print "<BODY><H4>Slow results</H4>";
+  print "<TABLE border=1>";
+  print "<TR><TD><B>Problem</B></TD><TD><B>Status</B></TD><TD>CPU Time</TD></TR>\n";
+
+  my $i = 0;
+  foreach my $k (sort $by_cputime keys %h) {
+    $i++;
+    last if $i > 50;
+    print qq@<TR><TD><A href="$name?$k">$k</TD><TD>$h{$k}->{status}</TD>@;
+    print qq@    <TD>$h{$k}->{cputime}</TD></TR>@;
+    my ($p, $n) = $k =~ /(\w+):(\d+)/;
+    open (F, "html/$p.tst/$n.trace") or do {print "Missing trace file for $k<BR>"; next;};
+    my $first=1;
+    while (<F>) {
+      my $line = $_;
+      if ($line =~ /^owl_.*\d{6} nodes/) {
+        print qq@<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>@ if $first-- > 0;
+        print qq@$line<BR>@;
+      }
+    }
+    print qq@</TD></TR>@ if $first < 1;
+    close F;
+  }
+  print "</TABLE></BODY></HTML>\n";
+}
+
+sub printspecial {
+  our $VAR1;
+  do "html/one.perldata.new" or confess "can't do perldata";
+  my %h = %{$VAR1->[0]};
+
+  my (%special);
+  my $sfile = "special";
+
+    print qq@<HTML>
+         <HEAD><TITLE>Special results - GNU Go</TITLE>
+         <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+       </HEAD>\n@;
+    print "<BODY><H4>Special results</H4>";
+
+    print "<TABLE border=1>";
+    print "<TR><TD><B>Problem</B></TD><TD><B>Status</B></TD><TD>cputime</TD></TR>\n";
+
+  if (-e $sfile) {
+    open (BF, $sfile);
+    while (<BF>) {
+      if (/^((\w+):(\d+))/) {
+        print qq@<TR><TD><A href="$name?$1">$1</A></TD><TD>$h{$1}->{status}</TD>@ .
+              qq@<TD>$h{$1}->{cputime}</TD></TR>\n@;
+      }
+    }
+    close(BF);
+  }
+  print qq@</TABLE></BODY></HTML>@;
+}
+
+
+sub printunexpected{
+    my (%breakage);
+    if (-e 'BREAKAGE.local') {
+      open (BF, 'BREAKAGE.local');
+      while (<BF>) {
+        if (my ($bfile, $bpf) = $_ =~ /^(\w+:\d+)\s+(FAILED|PASSED)/i) {
+          $breakage{lc $bfile} = $bpf;
+        }
+      }
+      close(BF);
+    }
+
+
+    our $VAR1;
+    do "html/one.perldata.new" or confess "can't do perldata";
+    my %h = %{$VAR1->[0]};
+    my @fails;  my @ufails;      
+    my @passes; my @upasses;     
+
+
+    print qq@<HTML><HEAD>
+            <TITLE>Unexpected results - GNU Go</TITLE>
+            <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+          </HEAD>\n@;
+    print "<BODY><H4>Unexpected results</H4>";
+
+    sub bynamenumber {
+      my ($aname, $anumber) = $a =~ /(.*):(.*)/;
+      my ($bname, $bnumber) = $b =~ /(.*):(.*)/;
+      $aname cmp $bname or
+        $anumber <=> $bnumber or
+        $a cmp $b;
+    }
+
+    foreach my $k (sort bynamenumber keys %h) {
+      my $status = %{$h{$k}}->{status};
+      defined $status or do { warn "missing status for $k"; next;};
+      if ($status eq 'FAILED') {
+        unless (defined ($breakage{lc $k}) and $breakage{lc $k}eq 'FAILED') {
+          push @ufails, $k;
+        }
+      } elsif ($status eq 'PASSED') {
+        unless (defined ($breakage{lc $k}) and $breakage{lc $k} eq 'PASSED') {
+          push @upasses, $k;
+        }
+      } elsif ($status eq 'passed') {
+        if (defined ($breakage{lc $k})) {
+          push @passes, $k;
+        }
+      } elsif ($status eq 'failed') {
+        if (defined ($breakage{lc $k})) {
+          push @fails, $k;
+        }
+      }
+    }
+
+    print "<TABLE border=1>\n";
+    print qq@<TR><TD>FAILS</TD><TD>@.scalar(@ufails).qq@</TD></TR>\n@;
+    print qq@<TR><TD>fails</TD><TD>@.scalar(@fails).qq@</TD></TR>\n@;
+    print qq@<TR><TD>PASSES</TD><TD>@.scalar(@upasses).qq@</TD></TR>\n@;
+    print qq@<TR><TD>passes</TD><TD>@.scalar(@passes).qq@</TD></TR>\n@;
+    print qq@<TR><TD>pass : fail</TD><TD>@.
+              sprintf("%.2f : 1", ((@upasses + @passes) / (@ufails + @fails + .001))).
+              qq@</TD></TR>\n@;
+    print "</TABLE><BR>\n";
+
+    print "<TABLE border=1>";
+    print "<TR><TD><B>Problem</B></TD><TD><B>Status</B></TD></TR>\n";
+    foreach (@ufails) {
+      print qq@<TR><TD><A href="$name?$_">$_</A></TD><TD>FAILED</TD></TR>\n@;
+    }
+    foreach (@fails) {
+      print qq@<TR><TD><A href="$name?$_">$_</A></TD><TD>failed</TD></TR>\n@;
+    }
+    foreach (@upasses) {
+      print qq@<TR><TD><A href="$name?$_">$_</A></TD><TD>PASSED</TD></TR>\n@;
+    }
+    foreach (@passes) {
+      print qq@<TR><TD><A href="$name?$_">$_</A></TD><TD>passed</TD></TR>\n@;
+    }
+    print "</TABLE>\n";
+    print "</body></html>\n";
+    
+
+}
+
+
+
+sub printbycategory {
+
+    our $VAR1;
+    do "html/one.perldata.new" or confess "can't do perldata";
+    my %hash = %{$VAR1->[0]};
+    
+    my %fails;
+    
+    foreach my $k (keys %hash) {
+      my $status = $hash{$k}{status};
+      $fails{$k} = $hash{$k} if $status =~ /failed/i;
+    }
+    
+    my $by_cat = 
+    sub {
+      defined $fails{$a}{file}
+        or do {
+          print '$a:'."$a\n";
+          confess "missing file";
+        };
+      
+      my $ca = $fails{$a}{category};
+      my $cb = $fails{$b}{category};
+      defined $ca or $ca = 0;
+      defined $cb or $cb = 0;
+        
+      if ($ca ne "" and $cb eq "") { return -1; }
+      if ($ca eq "" and $cb ne "") { return 1; }
+      
+      $ca ne "" or $ca = $fails{$a}{file};
+      $cb ne "" or $cb = $fails{$b}{file};
+      
+      uc ($ca) cmp uc($cb) 
+      or
+        do {
+          my $sa = $fails{$a}{severity};
+          my $sb = $fails{$b}{severity};
+          #print '$sa <=> $sb :' . "$sa <=> $sb  ($ca, $cb)" , "\n"
+          #  if defined $sa and defined $sb and ($sa ne "") and ($sb ne "");
+          defined $sa or $sa = 5;
+          defined $sb or $sb = 5;
+          if ($sa eq "") {$sa = 5};
+          if ($sb eq "") {$sb = 5};
+          -($sa <=> $sb); 
+        }
+      or
+        do {
+          my $fa = $fails{$a}{file};
+          my $fb = $fails{$b}{file};
+          $fa cmp $fb;
+        }
+      or
+        do {
+          my $na = $fails{$a}{num};
+          my $nb = $fails{$b}{num};
+          $na <=> $nb;
+        }
+    };
+    
+    sub getcat(%) {
+      my %h = %{shift()};
+      $h{category} or $h{file};
+    }
+    sub getsev(%) {
+      my %h = %{shift()};
+      my $s = $h{severity};
+      defined $s or do {return 5};
+      $s ne "" or do {return 5};
+      no warnings qw/numeric/;
+      $s+0;
+    }
+    
+    print qq@<HTML><HEAD>
+       <TITLE>Failures by category - GNU Go</TITLE>
+       <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
+      </HEAD>\n@;
+    print "<BODY><H4>Failures by category</H4>";
+    print qq@<A href="$name?">main index</A>@;
+    
+    
+    print "<TABLE border=1>";
+    print "<TR><TD><B>Category</B></TD><TD><B>Severity</B></TD><TD><B>Problem</B></TD>\n";
+    my $cat = "";
+    my $sev = "";
+    foreach my $k (sort $by_cat keys %fails) {
+      if (uc(getcat($fails{$k})) ne $cat) {
+        $cat = uc(getcat($fails{$k}));
+        print "</TD></TR>\n";
+        print "<TR><TD>$cat</TD>\n";
+        $sev = "";
+      }
+      if (($sev eq "") or $sev != getsev($fails{$k})) {
+        print "</TD></TR>\n<TR><TD>&nbsp;</TD>" if ($sev ne "");
+        $sev = getsev($fails{$k});
+        print "<TD>$sev</TD><TD>\n";
+      }
+      print qq@<A href="$name?$k">$k</A>&nbsp&nbsp</A>\n@;
+    }
+    print "</TABLE>\n";
+    print "</body></html>\n";
+    
+}
diff --git a/regression/regress.sh b/regression/regress.sh
new file mode 100755 (executable)
index 0000000..4b7ab1d
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+# regress.sh SRCDIR TSTFILE [OPTIONS ...]
+#
+# Use ../interface/gnugo to run test TSTFILE in SRCDIR (first changing
+# directory to SRCDIR).  OPTIONS are passed directly to gnugo.
+
+if test ! "$GNUGO" ; then
+       GNUGO=`cd ../interface && pwd`/gnugo
+       if test ! -x "$GNUGO" ; then
+               echo ERROR: no such program: $GNUGO
+               exit 1
+       fi
+fi
+
+srcdir=$1
+tstfile=$2
+shift
+shift
+
+cd $srcdir
+$GNUGO --quiet "$@" --mode gtp < $tstfile \
+       | awk -f regress.awk tst=$tstfile url=$GNUGO_REGRESSION_URL
+
+# regress.sh ends here
diff --git a/regression/rosebud.tst b/regression/rosebud.tst
new file mode 100644 (file)
index 0000000..9ae8672
--- /dev/null
@@ -0,0 +1,3 @@
+loadsgf games/rosebud.sgf 10
+1 reg_genmove black
+#? [E16]
diff --git a/regression/safety.tst b/regression/safety.tst
new file mode 100644 (file)
index 0000000..29fbd4f
--- /dev/null
@@ -0,0 +1,34 @@
+# These are early game positions in which defense of some friendly dragon is
+# urgent.  The dragon is not owl critical but becoming surrounded. Other tests
+# of this type include
+# nngs:2000,2010,2020
+# century2002:50
+
+loadsgf games/nngs/gnugo-3.3.6-xtc-200208301619.sgf 16
+1 reg_genmove white
+#? [R7|S2]
+
+loadsgf games/nngs/gnugo-3.3.6-xtc-200208301619.sgf 20
+2 reg_genmove white
+#? [Q7|P6|R7|S1|S5|R6|O5]
+
+loadsgf games/cgf2002/gnu-har.sgf 19
+3 reg_genmove black
+#? [H15|H16|G14|F13|C17]
+
+loadsgf games/cgf2002/gnu-har.sgf 21
+4 reg_genmove black
+#? [G14|E13|F13|C17]
+
+loadsgf games/nngs/gnugo-3.1.27-GoFuN-200203080451.sgf 42
+5 reg_genmove white
+#? [K8|L9|L7]
+
+# K6 is probably best.
+loadsgf games/nngs/abcd-gnugo-3.3.8-200209202043.sgf 12
+6 reg_genmove black
+#? [K6|K7|J6|J7|H4|H3|L5]*
+
+loadsgf games/nngs/abcd-gnugo-3.3.8-200209202043.sgf 22
+7 reg_genmove black
+#? [L5|L6|K6|M5|M3|K7|K6]
diff --git a/regression/score.tst b/regression/score.tst
new file mode 100644 (file)
index 0000000..49fb79a
--- /dev/null
@@ -0,0 +1,122 @@
+# Unfinished
+#loadsgf games/scoring/score1.sgf
+#1 final_score
+##? [W\+141.5]
+
+loadsgf games/scoring/score2.sgf
+2 final_score
+#? [W\+100.5]
+
+loadsgf games/scoring/score3.sgf
+3 final_score
+#? [W\+32.5]
+
+loadsgf games/scoring/score4.sgf
+4 final_score
+#? [W\+22.5]
+
+loadsgf games/scoring/score5.sgf
+5 final_score
+#? [W\+59.5]
+
+loadsgf games/scoring/score6.sgf
+6 final_score
+#? [W\+36.5]
+
+loadsgf games/scoring/score7.sgf
+7 final_score
+#? [W\+16.5]
+
+loadsgf games/scoring/score8.sgf
+8 final_score
+#? [W\+4.5]
+
+loadsgf games/scoring/score9.sgf
+9 final_score
+#? [W\+97.5]
+
+loadsgf games/scoring/score10.sgf
+10 final_score
+#? [W\+104.5]
+
+# See also owl1:351
+loadsgf games/scoring/score11.sgf
+11 final_score
+#? [W\+132.5]*
+
+loadsgf games/scoring/score12.sgf
+12 final_score
+#? [W\+40.5]
+
+loadsgf games/scoring/score13.sgf
+13 final_score
+#? [W\+223.5]
+
+# See also owl1:352
+loadsgf games/scoring/score14.sgf
+14 final_score
+#? [W\+73.5]*
+
+loadsgf games/scoring/score15.sgf
+15 final_score
+#? [W\+45.5]*
+
+loadsgf games/scoring/score16.sgf
+16 final_score
+#? [W\+32.5]
+
+loadsgf games/scoring/score17.sgf
+17 final_score
+#? [W\+165.5]
+
+loadsgf games/scoring/score18.sgf
+18 final_score
+#? [W\+44.5]
+
+loadsgf games/scoring/score19.sgf
+19 final_score
+#? [B\+53.5]
+
+loadsgf games/scoring/score20.sgf
+20 final_score
+#? [B\+34.5]
+
+loadsgf games/scoring/score21.sgf
+21 final_score
+#? [B\+66.5]
+
+loadsgf games/scoring/score22.sgf
+22 final_score
+#? [B\+76.5]
+
+loadsgf games/scoring/score23.sgf
+23 final_score
+#? [B\+83.5]
+
+loadsgf games/scoring/score24.sgf
+24 final_score
+#? [B\+51.5]
+
+loadsgf games/scoring/score25.sgf
+25 final_score
+#? [B\+16.5]
+
+loadsgf games/scoring/score26.sgf
+26 final_score
+#? [B\+60.5]
+
+loadsgf games/scoring/score27.sgf
+27 final_score
+#? [W\+58.5]
+
+loadsgf games/scoring/score28.sgf
+28 final_score
+#? [B\+71.5]
+
+loadsgf games/scoring/score29.sgf
+29 final_score
+#? [W\+36.5]
+
+loadsgf games/scoring/score30.sgf
+30 final_score
+#? [W\+87.5]
diff --git a/regression/score2.tst b/regression/score2.tst
new file mode 100644 (file)
index 0000000..15eeb42
--- /dev/null
@@ -0,0 +1,126 @@
+loadsgf games/scoring/score31.sgf
+31 final_score
+#? [B\+90.5]
+
+loadsgf games/scoring/score32.sgf
+32 final_score
+#? [B\+75.5]
+
+loadsgf games/scoring/score33.sgf
+33 final_score
+#? [B\+33.5]
+
+loadsgf games/scoring/score34.sgf
+34 final_score
+#? [B\+122.5]
+
+loadsgf games/scoring/score35.sgf
+35 final_score
+#? [B\+94.5]
+
+loadsgf games/scoring/score36.sgf
+36 final_score
+#? [B\+48.5]
+
+loadsgf games/scoring/score37.sgf
+37 final_score
+#? [B\+3.5]
+
+# The lower left corner is unsettled.
+# loadsgf games/scoring/score38.sgf
+# 38 final_score
+# #? [B\+8.5]*
+
+# See also owl1:354.
+loadsgf games/scoring/score39.sgf
+39 final_score
+#? [B\+45.5]*
+
+loadsgf games/scoring/score40.sgf
+40 final_score
+#? [B\+83.5]
+
+loadsgf games/scoring/score41.sgf
+41 final_score
+#? [B\+37.5]
+
+loadsgf games/scoring/score42.sgf
+42 final_score
+#? [B\+145.5]
+
+# See also owl1:360-362.
+loadsgf games/scoring/score43.sgf
+43 final_score
+#? [B\+29.5]*
+
+# This is not a proper scoring problem at all, rather a full board
+# life and death problem.
+# loadsgf games/scoring/score44.sgf
+# 44 final_score
+# #? [B\+76.5]*
+
+loadsgf games/scoring/score45.sgf
+45 final_score
+#? [W\+34.5]
+
+loadsgf games/scoring/score46.sgf
+46 final_score
+#? [W\+40.5]
+
+loadsgf games/scoring/score47.sgf
+47 final_score
+#? [B\+64.5]
+
+loadsgf games/scoring/score48.sgf
+48 final_score
+#? [B\+61.5]
+
+loadsgf games/scoring/score49.sgf
+49 final_score
+#? [B\+27.5]
+
+loadsgf games/scoring/score50.sgf
+50 final_score
+#? [B\+14.5]*
+
+loadsgf games/scoring/score51.sgf
+51 final_score
+#? [B\+75.5]
+
+loadsgf games/scoring/score52.sgf
+52 final_score
+#? [B\+46.5]
+
+# See also owl1:359.
+loadsgf games/scoring/score53.sgf
+53 final_score
+#? [B\+95.5]*
+
+loadsgf games/scoring/score54.sgf
+54 final_score
+#? [B\+187.5]
+
+# See also owl1:358.
+loadsgf games/scoring/score55.sgf
+55 final_score
+#? [B\+145.5]*
+
+loadsgf games/scoring/score56.sgf
+56 final_score
+#? [B\+16.5]
+
+loadsgf games/scoring/score57.sgf
+57 final_score
+#? [B\+119.5]
+
+loadsgf games/scoring/score58.sgf
+58 final_score
+#? [B\+103.5]
+
+loadsgf games/nngs/gnugo-3.3.8-evand-200209090532.sgf
+59 final_score
+#? [W\+15.5]
+
+loadsgf games/nngs/silverado-gnugo-3.3.8-200209120723.sgf
+60 final_score
+#? [B\+19.5]*
diff --git a/regression/seki.tst b/regression/seki.tst
new file mode 100644 (file)
index 0000000..faa7a31
--- /dev/null
@@ -0,0 +1,678 @@
+# The theme of this test suite is how to play inside an already living
+# group to turn potential territory into a seki. A typical example
+# would be this corner group
+# 
+# |OOOOOO
+# |XXXXXO
+# |..a.XO
+# |....XO
+# +------
+# 
+# where white can make seki in sente by playing at 'a'. There are also
+# numerous test cases to check the followup moves to get a seki. In
+# many cases one or both players have the option to make ko for life
+# and death of the entire corner (whereby black would get territory
+# points if winning). Is is generally assumed in this test suite that
+# white tries to achieve ko while black tries to avoid it, since the
+# ko in most cases is favorable to white.
+
+loadsgf games/seki04.sgf
+1 reg_genmove white
+#? [B2|B1|A2]
+# B2 also secures life but leaves a much bigger ko threat behind.
+2 reg_genmove black
+#? [A2|B1]
+
+play white B2
+# Tenuki lets white make ko with A1
+3 reg_genmove black
+#? [B1|A2]
+
+play black B1
+4 reg_genmove white
+#? [A2]
+
+undo
+undo
+play white B1
+5 reg_genmove black
+#? [A2]
+6 reg_genmove white
+#? [A2]
+
+play black A2
+7 reg_genmove white
+#? [B2]*
+
+undo
+# White kills through bent four in the corner.
+play black B2
+8 reg_genmove white
+#? [A2]
+
+
+loadsgf games/seki05.sgf
+# C2 gives a sente seki, while B1 gives a gote seki. Other moves fail.
+101 reg_genmove white
+#? [C2]
+102 reg_genmove black
+#? [C2|C1|B2|B1]
+
+play white C2
+# Only B1 and A2 (oddly enough) avoids giving white a ko option.
+103 reg_genmove black
+#? [B1|A2]*
+
+play black B1
+104 reg_genmove white
+#? [B2]
+
+play white B2
+105 reg_genmove black
+#? [C1]
+
+play black C1
+106 reg_genmove white
+#? [A2]
+
+play white A2
+107 reg_genmove black
+#? [D1]
+
+undo
+undo
+play black A2
+108 reg_genmove white
+#? [C1]
+
+undo
+undo
+undo
+play black B2
+109 reg_genmove white
+#? [B1]
+
+undo
+play black C1
+110 reg_genmove white
+#? [B1]
+
+undo
+undo
+play white B1
+111 reg_genmove black
+#? [C2]*
+
+undo
+play white C1
+112 reg_genmove black
+#? [B1]*
+
+
+loadsgf games/seki06.sgf
+201 reg_genmove white
+#? [B2]
+202 reg_genmove black
+#? [B2]
+
+# Both A2 and B1 lead to seki. Strictly speaking A2 is a better move
+# since it leaves black the option to take sente and let white make a
+# thousand-year ko. For now we accept both.
+play white B2
+203 reg_genmove black
+#? [A2|B1]
+
+play black A2
+204 reg_genmove white
+#? [B1]
+
+# White gets a thousand-year ko if black plays tenuki.
+play white B1
+205 reg_genmove black
+#? [C1|C2]
+
+# A1 makes a clean seki with no ko aji.
+undo
+play white C1
+206 reg_genmove black
+#? [A1]
+
+undo
+undo
+play black B1
+207 reg_genmove white
+#? [A2]
+
+play white A2
+208 reg_genmove black
+#? [C2]
+209 reg_genmove white
+#? [A3]
+
+undo
+undo
+undo
+play white B1
+210 reg_genmove black
+#? [B2]
+
+
+loadsgf games/seki07.sgf
+301 reg_genmove white
+#? [B2]
+302 reg_genmove black
+#? [B2]
+
+play white B2
+303 reg_genmove black
+#? [A2|C1|C2]
+
+play black A2
+304 reg_genmove white
+#? [C1]
+
+# Black can start ko with B1 if desperate.
+play white C1
+305 reg_genmove black
+#? [C2]
+
+play black C2
+306 reg_genmove white
+#? [B1]
+
+# Now black can live with territory.
+undo
+undo
+play white B1
+307 reg_genmove black
+#? [C1]
+
+undo
+undo
+play black C1
+308 reg_genmove white
+#? [A2]
+
+# Tenuki is okay. What remains is a double-sided ko threat (0 points
+# double sente).
+play white A2
+309 reg_genmove black
+#? [B1|C2|C9]
+
+play black B1
+310 reg_genmove white
+#? [C2]
+
+undo
+play black C2
+311 reg_genmove white
+#? [B1]
+
+# A2 also makes seki, but costs a prisoner.
+undo
+undo
+undo
+play black C2
+312 reg_genmove white
+#? [B1|C1]
+
+play white B1
+313 reg_genmove black
+#? [C1|A2]
+
+play black C1
+314 reg_genmove white
+#? [A2]
+
+undo
+play black A2
+315 reg_genmove white
+#? [C1]
+
+undo
+undo
+play white C1
+316 reg_genmove black
+#? [A2]
+
+
+loadsgf games/seki08.sgf
+401 reg_genmove white
+#? [B1]
+# Most moves secure territory but C1 and C2 are most natural. We also
+# allow B1.
+402 reg_genmove black
+#? [C1|C2|B1]
+
+# C1 and C2 both secure seki in sente, but C1 is one prisoner better.
+# B2 leaves white the option to make ko.
+play white B1
+403 reg_genmove black
+#? [C1|C2]*
+
+play black C1
+404 reg_genmove white
+#? [A2|D1]
+
+play white A2
+405 reg_genmove black
+#? [C2]
+
+play black C2
+406 reg_genmove white
+#? [D1|E1]
+
+undo
+undo
+play white D1
+407 reg_genmove black
+#? [C2|E1]
+
+play black C2
+408 reg_genmove white
+#? [A2]
+
+undo
+play black E1
+409 reg_genmove white
+#? [A2]
+
+play white A2
+410 reg_genmove black
+#? [C2]
+
+undo
+undo
+undo
+undo
+
+# D1 and A2 also give seki but are one point worse.
+play black C2
+411 reg_genmove white
+#? [C1]
+
+# D1 and A2 are miai to get seki. Black can also opt for a difficult
+# ko by playing B2, but this is usually not a good idea. Tenuki
+# suffices for seki and leaves a big mutual ko threat.
+play white C1
+412 reg_genmove black
+#? [D1|A2|C9]
+
+play black D1
+413 reg_genmove white
+#? [A2]
+
+loadsgf games/seki09.sgf
+501 reg_genmove white
+#? [B1]*
+502 reg_genmove black
+#? [C1]*
+
+play white B1
+503 reg_genmove black
+#? [C1]
+
+play black C1
+504 reg_genmove white
+#? [A2]
+
+loadsgf games/seki10.sgf
+601 reg_genmove white
+#? [B1]
+602 reg_genmove black
+#? [C1|B1]
+
+# B2 gives a hopeless ko.
+play white B1
+603 reg_genmove black
+#? [C1]
+
+play black C1
+604 reg_genmove white
+#? [A2]
+
+
+loadsgf games/seki11.sgf
+701 reg_genmove white
+#? [C1]
+702 reg_genmove black
+#? [C1|B1|B2]
+
+play white C1
+703 reg_genmove black
+#? [B2]
+
+play black B2
+704 reg_genmove white
+#? [B1]
+
+
+loadsgf games/seki12.sgf
+801 reg_genmove white
+#? [B2]
+802 reg_genmove black
+#? [B2]
+
+# C2 is the best way to make seki since it leaves ko aji in black's
+# favor unless white accepts gote.
+play white B2
+803 reg_genmove black
+#? [C2]
+
+# B1 also makes seki but white definitely ends in gote.
+play black C2
+804 reg_genmove white
+#? [C1]
+
+# After A2 black has the option to start ko with B1, unless white
+# takes gote and fills at B1. Sooner or later that may be necessary.
+play white C1
+805 reg_genmove black
+#? [A2]
+
+undo
+play white B1
+# A2 is one point bigger than C1 regardless of scoring method.
+806 reg_genmove black
+#? [A2|C1]
+
+play black C1
+# A3 is one point bigger than A2 under japanese scoring and a half
+# point bigger under chinese scoring.
+807 reg_genmove white
+#? [A3|A2]
+
+undo
+undo
+undo
+
+# B1 and A2 give gote seki.
+play black C1
+808 reg_genmove white
+#? [C2]
+
+play white C2
+809 reg_genmove black
+#? [B1]
+
+# A2 is gote seki and may occasionally be better than allowing black
+# to initiate a ko.
+play black B1
+810 reg_genmove white
+#? [A3]
+
+# A1 secures seki, removing white's ko aji.
+play white A3
+811 reg_genmove black
+#? [A1]
+
+
+loadsgf games/seki13.sgf
+901 reg_genmove white
+#? [B2]
+902 reg_genmove black
+#? [B2]
+
+# Black probably have more moves to make seki in sente but C2 looks most
+# natural. C1 is also good enough. B1 suffices to make sente seki as well
+# but loses one point compared to C2 or C1.
+play white B2
+903 reg_genmove black
+#? [C2|C1]*
+
+play black C2
+904 reg_genmove white
+#? [B3]
+
+# B1 gives ko or seki in gote. Tenuki also leaves a seki but compared
+# to C1 the latter is 1 point double sente.
+play white B3
+905 reg_genmove black
+#? [C1]*
+
+play black C1
+906 reg_genmove white
+#? [B1]
+
+# Black can play tenuki and still have seki but since A3 is one point
+# double sente there is no reason to wait.
+play white B1
+907 reg_genmove black
+#? [A3]*
+
+play black A3
+908 reg_genmove white
+#? [A2]
+
+# 1 point double sente, just like 907.
+undo
+909 reg_genmove white
+#? [A3]*
+
+play white A3
+910 reg_genmove black
+#? [A1|A2]
+
+# One point to pick up the A1 stone under Japanese rules.
+play black A1
+play black C9
+911 reg_genmove white
+#? [A2]
+
+# After white C1 black can make ko with A2 or seki in gote with D1.
+undo
+undo
+undo
+undo
+undo
+play black B1
+912 reg_genmove white
+#? [C1]
+
+# White C1 was a mistake. Black makes life with territory at B3.
+undo
+undo
+play white C1
+913 reg_genmove black
+#? [B3]
+
+
+# Black should play B2. A2 and B1 leave an unnecessary ko threat.
+loadsgf games/seki14.sgf
+1001 reg_genmove white
+#? [B2]
+1002 reg_genmove black
+#? [B2]
+
+
+loadsgf games/seki15.sgf
+1101 reg_genmove white
+#? [D1]*
+1102 reg_genmove black
+#? [C1|C2|D2]*
+
+play white D1
+1103 reg_genmove black
+#? [E2]
+
+play black E2
+1104 reg_genmove white
+#? [B1]*
+
+play white B1
+1105 reg_genmove black
+#? [C2]
+
+play black C2
+1106 reg_genmove white
+#? [C1]
+
+
+loadsgf games/seki16.sgf
+1201 reg_genmove white
+#? [B2]
+1202 reg_genmove black
+#? [B2]
+
+# Black can make seki in sente with most moves but B1 and A2 lose one
+# point. Tenuki let's white kill with ko.
+play white B2
+1203 reg_genmove black
+#? [C2|B3|C1|A3]
+
+# B3, A2, and A1 fail to make seki.
+play black C2
+1204 reg_genmove white
+#? [B1|C1|A3]
+
+# A3, B3, and A2 all make seki, but B3 and A2 lose a point.
+play white C1
+1205 reg_genmove black
+#? [A3]*
+
+play black A3
+1206 reg_genmove white
+#? [B3|A2|B1]
+
+play white B3
+1207 reg_genmove black
+#? [A2]
+
+play black A2
+1208 reg_genmove white
+#? [B1]
+
+undo
+undo
+play white A2
+1209 reg_genmove black
+#? [B3]*
+
+play black B3
+1210 reg_genmove white
+#? [B1]
+
+# A3 gains a point compared to A2. B1 is two points worse.
+undo
+undo
+undo
+play black B3
+1211 reg_genmove white
+#? [A3]
+
+# A3 gains a point compared to B3. B1 is two points worse.
+undo
+play black A2
+1212 reg_genmove white
+#? [A3]
+
+play white A3
+1213 reg_genmove black
+#? [B3]
+
+play black B3
+1214 reg_genmove white
+#? [A1]
+
+undo
+undo
+undo
+undo
+
+# Tenuki leaves seki but loses a point.
+play white B1
+1215 reg_genmove black
+#? [C1|A3|B3|A2|C9]
+
+# B3 and A2 both fail.
+play black C1
+1216 reg_genmove white
+#? [A3]
+
+# A2 also gives seki but loses a point, as does tenuki.
+play white A3
+1217 reg_genmove black
+#? [B3]*
+
+undo
+undo
+play black A3
+1218 reg_genmove white
+#? [C1]
+
+# Tenuki is fine.
+play white C1
+1219 reg_genmove black
+#? [B3|A2|C9]
+
+undo
+undo
+play black B3
+1220 reg_genmove white
+#? [A2|A3]*
+
+undo
+play black A2
+1221 reg_genmove black
+#? [B3|A3]
+
+# B1 and B3 lose a point.
+undo
+undo
+play white A3
+1222 reg_genmove black
+#? [C1]*
+
+play black C1
+1223 reg_genmove white
+#? [B1]
+
+# Only A3 works. If black gets both C1 and A3, white can't do anything
+# with two stones (in addition to B2).
+undo
+undo
+undo
+play black C1
+1224 reg_genmove white
+#? [A3]
+
+play white A3
+1225 reg_genmove black
+#? [B1|C2|B3]
+
+play black B1
+1226 reg_genmove white
+#? [C2]
+
+play white C2
+1227 reg_genmove black
+#? [B3]*
+
+# C1 is one point better than C2 and A3.
+undo
+undo
+undo
+undo
+play black B1
+1228 reg_genmove white
+#? [C1]*
+
+loadsgf games/FSGCBot-dr.sgf 234
+2010 reg_genmove white
+#? [A19|B17]
+
+loadsgf games/seki_nakade1.sgf
+2020 dragon_status D9
+#? [alive]
+
+loadsgf games/seki_nakade2.sgf
+2030 dragon_status F9
+#? [critical H9 H9]*
+
+play white H9
+play white H7
+play white G7
+play white G9
+
+2050 dragon_status G8
+#? [alive]
diff --git a/regression/semeai.tst b/regression/semeai.tst
new file mode 100644 (file)
index 0000000..1e73128
--- /dev/null
@@ -0,0 +1,579 @@
+# Here is a list of other regressions which should afford
+# semeai tuning. The regressions were run with the version
+# of November 6, 2001 with three different versions of the
+# semeai module. The patch in question was semeai_1_16.5
+# which is now in the CVS.
+#
+#                   Standard  Experimental Patched
+#
+# Strategy 1            f         P          P
+# Strategy 37           p         F          F
+# Neurogo 11            p         F          F
+# Neurogo 12            p         F          F
+# Arb 104               p         F          F
+# Golife 1              f         P          P
+# Golife 2              f         P          P
+# Dniwog 5              f         P          f
+# Strategy2 66          p         F          F
+# Strategy2 72          f         P          P
+# Strategy2 73          F         p          F
+# Strategy2 93          f         P          P
+# Nicklas1 501          p         F          F
+# Nicklas1 1213         f         P          P
+# Nicklas1 1405         p         F          F
+# Nicklas1 1406         p         F          F
+# Nicklas2 904          p         p          F
+# Nicklas2 1407         f         P          f
+# Manyfaces 7           p         F          F
+# Buzco 6               p         F          p
+# Strategy3 110         f         P          P
+# Strategy3 113         p         F          p
+# Strategy3 124         f         P          f
+# Strategy3 126         p         F          F
+# Arend 30              p         F          F
+# Trevora 530           f         P          P
+# Strategy4 168         P         f          f
+# Strategy4 179         F         F          F (*)
+# Strategy4 199         p         F          F
+# Strategy4 200         p         F          F
+#
+# (*) All tests fail, but differently
+#
+# Here is a supplemental list of problems where a comment in the .tst
+# file indicates a semeai:
+# 
+# Strategy 44
+# Strategy2 72
+# Strategy2 80
+# Strategy2 86
+# Strategy3 109
+# Strategy3 110
+# Strategy3 124
+
+# Strategy3 128
+# Strategy3 129
+# Strategy3 139
+# Strategy3 145
+# Strategy3 146
+# Strategy4 156
+# Strategy4 163
+# Strategy4 168
+# Strategy4 185
+# Strategy4 206
+# Strategy5 275
+# Strategy5 276
+
+# Another list of problems which have turned up unexpected results
+# when modifying the semeai code:
+#
+# neurogo:14
+# strategy2:54
+# nngs:290
+# nngs:820
+# global:34
+# handtalk:20
+# tactics1:105
+
+# For any of the problems below, if PASS is a solution it is the best
+# solution. However the other solutions are acceptable.
+
+############## semeai tests #################
+#
+# After analyze_semeai [dragon1] [dragon2]
+# the results are returned in the form (result1) (result2).
+# These are the results of the defense of dragon1 and the attack
+# of dragon2 assuming that the dragon1 player moves first. Thus
+# a result 1 0 typically means seki, while a 1 1 result means a kill
+# and 0 0 means the semeai is lost. In addition to seki, 1 0 may mean
+# that both dragons gain independent life.
+
+loadsgf games/semeai/semeai6.sgf
+1 analyze_semeai C1 E1
+#? [1 0 (F1|F2|F3|F4|F5|PASS)]
+
+2 analyze_semeai E1 C1
+#? [1 0 (B5|B4|B3|PASS)]
+
+3 analyze_semeai L1 N1
+#? [1 0 (O5|O4|O3|P3|Q2|Q1|PASS)]
+
+4 analyze_semeai N1 L1
+#? [1 0 (H2|J3|K3|PASS)]
+
+5 analyze_semeai A14 A12
+#? [1 1 (A13|B13|C13|D13)]
+
+6 analyze_semeai A12 A14
+#? [1 1 (A15|B15|C15|D15|E15)]
+
+loadsgf games/semeai/semeai7.sgf
+7 analyze_semeai C1 E1
+#? [1 0 (F1|F2|F3|F4|F5|PASS)]
+
+8 analyze_semeai E1 C1
+#? [1 1 (B2|B3)]
+
+9 analyze_semeai L1 N1
+#? [1 0 (O5|O4|O3|P3|Q2|Q1)]
+
+10 analyze_semeai N1 L1
+#? [1 1 (H2|K3)]
+
+11 analyze_semeai A14 A12
+#? [1 1 (A13|B13|D13|PASS)]
+
+12 analyze_semeai A12 A14
+#? [0 0 PASS]
+
+loadsgf games/semeai/semeai8.sgf
+13 analyze_semeai C1 E1
+#? [0 0 PASS]
+
+14 analyze_semeai E1 C1
+#? [1 1 (B5|PASS)]
+
+15 analyze_semeai L1 N1
+#? [0 0 PASS]
+
+16 analyze_semeai N1 L1
+#? [1 1 (K5|PASS)]
+
+17 analyze_semeai A14 A12
+#? [0 0 PASS]
+
+18 analyze_semeai A12 A14
+#? [1 1 (A15|B15|D15|E15|PASS)]
+
+loadsgf games/semeai/semeai9.sgf
+
+19 analyze_semeai J1 L1
+#? [1 1 (M3|N3|O3|P3|Q1)]
+
+20 analyze_semeai L1 J1
+#? [1 1 (H1|H2|H3|H4|H5|H6|H7|H8)]
+
+21 analyze_semeai N19 O19
+#? [1 1 (T17|T19)]
+
+22 analyze_semeai O19 N19
+#? [1 1 (L16|L17|L18|M19)]
+
+loadsgf golois/Goemate990902-1.sgf
+
+23 analyze_semeai G12 G13
+#? [1 1 (F15|G15|H15|E13|F13|PASS)]
+
+24 analyze_semeai G13 G12
+#? [0 0 PASS]
+
+25 analyze_semeai S8 R8
+#? [1 1 S9]
+
+26 analyze_semeai R8 S8
+#? [1 1 S9]
+
+# If this semeai is treated as a strictly local
+# problem (ignoring the R8 dragon) then R7 can't live.
+# But the semeai code treats it as a local problem by
+# design!  So it's unclear what the correct answer
+# should be.  A similar remark holds with problem 28.
+
+27 analyze_semeai Q7 R7
+#? [1 1 S9]
+
+28 analyze_semeai R7 Q7
+#? [1 1 S9]
+
+# A6 gives an unfavorable ko while F10 gives seki.
+# Since there are no ko threats, and F10 is enough to win, it is preferred.
+loadsgf games/semeai/semeaiko1.sgf
+29 reg_genmove black
+#? [F10]*
+
+loadsgf games/strategy11.sgf 127
+30 analyze_semeai B3 G4
+#? [1 1 C1]
+
+loadsgf games/strategy11.sgf 127
+31 analyze_semeai G4 B3
+#? [1 1 C1]
+
+loadsgf games/nicklas/nicklas14.sgf 55
+32 analyze_semeai B8 D9
+#? [1 0 B6]*
+
+loadsgf games/nicklas/nicklas14.sgf 55
+33 analyze_semeai D9 B8
+#? [1 1 B7]
+
+# S18 produces a favorable ko. T18 makes seki.
+loadsgf games/bretz.sgf 130
+34 analyze_semeai N18 Q18
+#? [1 1 S18]
+
+# ab added (3.1.22)
+loadsgf games/mertin13x13/gnugo-goliath2.W+38.sgf 61
+35 analyze_semeai M13 M11
+#? [1 1 (PASS|N13|N10|H11)]
+
+# See also reading:166
+loadsgf games/nngs/Lazarus-gnugo-3.1.19-200201092246.sgf 66
+36 analyze_semeai S9 R11
+#? [1 1 R12]*
+
+loadsgf games/semeai/semeai10.sgf
+37 analyze_semeai B11 L7
+#? [1 1 B12]
+
+loadsgf games/semeai/semeai11.sgf
+38 analyze_semeai B9 B8
+#? [1 1 (PASS|B1|A9)]
+
+# See also global:3.
+loadsgf golois/Aya991113-13.sgf
+39 analyze_semeai R12 H9
+#? [2 2 H4]
+
+40 analyze_semeai H9 R12
+#? [1 1 (J4|H4)]
+
+loadsgf games/semeai/semeai9.sgf
+41 analyze_semeai A3 A5
+#? [1 1 (PASS|B3|A6|B6|C5|D4|E3|E2|E1)]
+42 analyze_semeai A5 A3
+#? [0 0 PASS]
+43 analyze_semeai A16 A12
+#? [1 1 (A15|A11|B11|C14|C13|D12|D11|D10|D9|B9|A9)]
+44 analyze_semeai A12 A16
+#? [1 1 (A17|B17|C16|D16|E15|E14|F13|F12|F11|F10|F9|F8|B9|A9)]
+
+loadsgf games/semeai/semeai12.sgf
+45 analyze_semeai C3 A9
+#? [0 0 PASS]
+
+loadsgf games/semeai/semeai9.sgf
+46 analyze_semeai Q12 S11
+#? [1 0 (PASS|R8|R9|T11|T9|R11|R10)]
+47 analyze_semeai S11 Q12
+#? [1 0 (PASS|T11|T9|R9|T10|R10|R11)]
+
+loadsgf games/nngs/gnugo-3.3.20-GoFuN-200306071813.sgf 234
+48 analyze_semeai E17 D17
+#? [1 0 (D8|F8|G12|G10)]
+
+
+# The opposite semeai is not very interesting (black clearly can kill white).
+loadsgf games/nngs/jypower-gnugo-3.3.17-200304150031.sgf 166
+50 analyze_semeai O7 L7
+#? [1 1 (J5|J6|K7|J4|G5|G6|H7)]
+
+# See reading:182,183 for comments.
+loadsgf games/reading41.sgf 118
+51 analyze_semeai C19 B16
+#? [1 0 (A19|E11)]
+52 analyze_semeai B16 C19
+#? [1 3 A17]*
+
+# See reading:184-187 for comments.
+loadsgf games/reading41.sgf 130
+53 analyze_semeai C19 B16
+#? [1 0 E11]
+54 analyze_semeai B16 C19
+#? [1 2 A16]
+
+#Test 55-60 for nakade moves during semeai
+loadsgf games/test3win.sgf
+55 analyze_semeai F4 F7
+#? [1 1 H6]
+
+loadsgf games/test3lose.sgf
+56 analyze_semeai F4 F7
+#? [0 0 PASS]
+
+loadsgf games/test4win.sgf
+57 analyze_semeai C5 H6
+#? [1 1 J4]
+
+# See also reading:195.
+loadsgf games/test4lose.sgf
+58 analyze_semeai F5 H6
+#? [0 0 PASS]
+
+loadsgf games/test5win.sgf
+59 analyze_semeai B7 E6
+#? [1 1 H5]
+
+loadsgf games/test5lose.sgf
+60 analyze_semeai C8 E6
+#? [0 0 PASS]
+
+# A15 is a certain seki. A17 gives a ko for life and death of both.
+# The ko is very indirect for white, but it's still a ko. B17
+# naturally dies right out.
+loadsgf games/nngs/tommmal-gnugo-3.4-200308200805.sgf 122
+61 analyze_semeai D19 B19
+#? [1 0 A15]
+
+# A17 kills cleanly with a bent four in the corner. A15 gives a bad
+# ko. See also tests 63-70.
+62 analyze_semeai B19 D19
+#? [1 1 A17]
+
+# Variations of bent four in the corner positions considered as semeai.
+loadsgf games/semeai/semeai13.sgf
+63 analyze_semeai D13 B13
+#? [0 0 PASS]
+64 analyze_semeai B13 D13
+#? [1 1 (PASS|A13|E13|E12|C11|C10|B9|A9)]
+65 analyze_semeai K13 M13
+#? [0 0 PASS]
+66 analyze_semeai M13 K13
+#? [1 1 (PASS|N13)]
+67 analyze_semeai A4 A2
+#? [0 0 PASS]
+68 analyze_semeai A2 A4
+#? [1 1 (PASS|A5|B5|C3|D3)]
+69 analyze_semeai M4 N3
+#? [0 0 PASS]
+70 analyze_semeai N3 M4
+#? [1 1 (PASS|L3)]
+
+# A basic seki with varying number of outer liberties.
+loadsgf games/semeai/semeai14.sgf
+71 analyze_semeai D13 B13
+#? [1 0 PASS]
+72 analyze_semeai B13 D13
+#? [1 0 PASS]
+73 analyze_semeai M13 N12
+#? [1 0 PASS]
+74 analyze_semeai N12 M13
+#? [1 0 (PASS|L13)]
+75 analyze_semeai J3 L2
+#? [1 0 PASS]
+76 analyze_semeai L2 J3
+#? [1 0 (PASS|N3|K2)]
+77 analyze_semeai A5 A3
+#? [1 0 PASS]
+78 analyze_semeai A3 A5
+#? [1 0 (PASS|A6|C6|C1)]
+79 analyze_semeai F9 F7
+#? [1 0 PASS]
+80 analyze_semeai F7 F9
+#? [1 0 (PASS|E9|E8|J9|H5)]
+
+loadsgf games/semeai/semeai15.sgf
+81 dragon_status H7
+#? [dead]
+82 dragon_status J7
+#? [alive]
+83 dragon_status J9
+#? [dead]
+84 dragon_status E13
+#? [dead]
+85 dragon_status A13
+#? [alive]
+86 dragon_status C11
+#? [critical A2 A2]
+
+loadsgf games/semeai/semeai16.sgf 222
+87 analyze_semeai N19 S18
+#? [1 1 (Q19|S19|T18|T16)]
+88 analyze_semeai S18 N19
+#? [2 0 T12]*
+89 reg_genmove black
+#? [Q19|S19|T18|T16]*
+
+loadsgf games/semeai/semeai16.sgf 224
+90 analyze_semeai N19 S18
+#? [1 3 (Q19|S19|T18|T16)]*
+91 analyze_semeai S18 N19
+#? [2 0 Q17]*
+92 reg_genmove black
+#? [Q19|S19|T18|T16]
+
+loadsgf games/semeai/semeai16.sgf 226
+93 analyze_semeai N19 S18
+#? [1 3 S19]*
+94 analyze_semeai S18 N19
+#? [1 1 S19]
+95 reg_genmove black
+#? [S19]
+
+loadsgf games/semeai/semeai16.sgf 230
+96 analyze_semeai N19 S18
+#? [1 0 S19]
+97 analyze_semeai S18 N19
+#? [1 1 S19]*
+98 reg_genmove black
+#? [S19]
+
+loadsgf games/nngs/beedee-gnugo-3.5.3-200401140035.sgf 280
+99 analyze_semeai R13 Q13
+#? [1 0 (L12|K9|M6|L7|S17)]
+100 analyze_semeai Q13 R13
+#? [1 1 (P10|Q11|S10|T11)]
+
+loadsgf games/semeai/semeai17.sgf 52
+101 analyze_semeai D9 C6
+#? [1 1 (D6|C7)]
+102 analyze_semeai C6 D9
+#? [1 1 (D6|C7)]
+103 analyze_semeai D9 E9
+#? [1 1 (D6|C7)]
+104 analyze_semeai E9 D9
+#? [1 1 (D6|C7)]
+105 analyze_semeai G8 E9
+#? [1 1 (D6|C7)]*
+106 analyze_semeai E9 G8
+#? [1 0 (D6|C7)]*
+
+# Doubtful whether C7 should be accepted even if it kills all white.
+107 reg_genmove black
+#? [D6|C7]*
+
+loadsgf games/semeai/semeai17.sgf 60
+108 analyze_semeai G8 H2
+#? [1 1 J2]*
+109 analyze_semeai H2 G8
+#? [1 1 E1]
+
+loadsgf games/semeai/semeai17.sgf 62
+110 analyze_semeai G8 H2
+#? [1 0 (PASS|F3|E1)]
+111 analyze_semeai H2 G8
+#? [1 0 (PASS|F3|E1)]
+
+loadsgf games/semeai/semeai17.sgf 64
+112 analyze_semeai G8 H2
+#? [1 0 PASS]
+113 analyze_semeai H2 G8
+#? [1 0 PASS]
+114 dragon_status G8
+#? [alive]
+115 dragon_status H2
+#? [alive]
+
+loadsgf games/kgs/yagr-nigiri.sgf 214
+116 analyze_semeai F19 F16
+#? [3 3 E16]*
+
+loadsgf games/semeai/semeai18.sgf
+117 analyze_semeai H3 H5
+#? [0 0 PASS]
+
+play white H2
+118 analyze_semeai H3 H5
+#? [1 0 (H1|G1)]
+
+# Black H1 doesn't work. White plays G1 and gets seki or ko.
+119 analyze_semeai H5 H3
+#? [1 1 G1]
+
+# A14 is strictly correct since C19 allows W an unfavorable ko.
+loadsgf games/semeai/semeai19.sgf
+120 analyze_semeai C18 C17
+#? [0 0 PASS]
+
+# There is a complication that B18 and C17 are not amalgamated.
+# If B plays first C19 gives a favorable ko; A15 allows seki.
+# The ko is very unfavorable for W so in 119 a 1 1 result is 
+# arguably correct.
+loadsgf games/semeai/semeai20.sgf
+121 analyze_semeai C17 C18
+#? [1 0]*
+122 analyze_semeai C18 C17
+#? [2 2 C19]*
+
+# There is also an amalgamation problem here.
+loadsgf games/semeai/semeai19.sgf 80
+123 analyze_semeai K18 N18
+#? [1 1 M18]*
+
+loadsgf games/verybad.sgf 104
+124 analyze_semeai Q16 Q17
+#? [1 1 P19]
+125 analyze_semeai Q17 Q16
+#? [3 3 T17]*
+
+loadsgf games/verybad.sgf 114
+126 analyze_semeai Q16 Q17
+#? [2 2 (P19|S17|T17)]
+127 analyze_semeai Q17 Q16
+#? [2 2 (O15|O14|R13)]
+
+# Take the ko last.
+128 restricted_genmove black T15 T17 S17 P19
+#? [!T15]*
+
+loadsgf games/verybad.sgf 118
+129 analyze_semeai Q16 Q17
+#? [3 3 (Q19|S17|T17)]
+
+loadsgf games/owl54.sgf
+130 analyze_semeai D3 G2
+#? [0 0 PASS]
+
+loadsgf games/kgs/GNU-minautore.sgf 80
+131 dragon_status P8
+#? [critical T8 (T8|T10|T11|T12)]
+
+# J8 leaves ko aji. (Admittedly a very bad ko for black but still a ko.)
+loadsgf games/CrazyStone1.sgf 50
+132 reg_genmove white
+#? [H9|J4]
+
+loadsgf games/CrazyStone1.sgf 56
+133 analyze_semeai D9 G3
+#? [1 2 H2]
+134 analyze_semeai G3 D9
+#? [1 1 H2]*
+
+# See also strategy3:146
+loadsgf games/incident209.sgf 259
+135 analyze_semeai R12 Q12
+#? [1 0 R11]
+
+# See also kgs:230
+loadsgf games/kgs/yagr-Kazik.sgf 149
+136 analyze_semeai K19 L19
+#? [0 1 (N16|O13|O12|O11)]*
+
+loadsgf games/semeai/semeai21.sgf
+137 analyze_semeai A5 A2
+#? [1 0 F1]*
+138 analyze_semeai A2 A5
+#? [1 1 (D1|F1|H1)]*
+
+# See also owl1:393,394.
+139 analyze_semeai F9 H9
+#? [1 1 G9]
+140 analyze_semeai H9 F9
+#? [1 1 (E9|G7)]
+
+loadsgf games/semeai/semeai22.sgf 1
+141 analyze_semeai A4 E3
+#? [2 2 (F1|F2|F3)]
+142 analyze_semeai E3 A4
+#? [2 2 (A1|A3)]*
+
+# White has no local move but can pass for a good ko.
+# See also reading:224-227.
+loadsgf games/semeai/semeai22.sgf 7
+143 analyze_semeai A4 E3
+#? [3 3 (F1|F3)]
+144 analyze_semeai E3 A4
+#? [2 2 PASS]
+
+# See also 9x9:640.
+loadsgf games/cgos/25811.sgf 52
+145 analyze_semeai E9 B8
+#? [2 2 PASS]*
+146 analyze_semeai B8 E9
+#? [3 3 (A7|B9)]*
+
+# Underlying amalgation problem, see reading:232.
+loadsgf games/semeai/semeai6.sgf
+play white A15
+play black D13
+147 analyze_semeai A12 A14
+#? [1 1 (B15|C15|D15|E15)]
diff --git a/regression/strategy.tst b/regression/strategy.tst
new file mode 100644 (file)
index 0000000..e9a1149
--- /dev/null
@@ -0,0 +1,319 @@
+loadsgf games/strategy1.sgf
+1 reg_genmove white
+#? [Q13]
+
+loadsgf games/strategy2.sgf 5
+2 reg_genmove black
+#? [!G2|D2]
+
+# # Current GNU Go would never play those moves. Removed.
+# loadsgf games/strategy2.sgf 9
+# 3 reg_genmove black
+# #? [!H1|H2]
+# 
+# loadsgf games/strategy2.sgf 11
+# 4 reg_genmove black
+# #? [!F1]
+
+loadsgf games/strategy3.sgf 14
+5 reg_genmove white
+#? [R17|P17]
+
+# incident 104
+# Probably requires a dynamic connection analysis to solve.
+loadsgf games/incident104.sgf 63
+6 reg_genmove white
+#? [E10]*
+
+# incident 106
+loadsgf games/incident104.sgf 215
+7 reg_genmove white
+#? [S19]
+
+# incident 107
+# tm - moved the test out to move 228; at 216, T17 is arguable bigger.
+loadsgf games/incident107.sgf 228
+8 reg_genmove black
+#? [N2|N1]*
+
+# incident 109
+loadsgf games/incident108b.sgf 172
+9 reg_genmove black
+#? [P15]
+
+# incident 110
+loadsgf games/incident108b.sgf 176
+10 reg_genmove black
+#? [Q7]
+
+#CATEGORY=BAD_PROBLEM
+#DESCRIPTION=Not clear enough.
+#SEVERITY=0
+# From STRATEGY:
+#    2.7.178 makes the move at P17 which is better than the game
+#    move at P18 but probably inferior to the recommended move at P15.
+#    It is not totally clear to me that the move at P15 is really
+#    best since the 3-3 point is still open. 
+# incident 111
+loadsgf games/incident108b.sgf 178
+11 reg_genmove black
+#? [P15]
+
+# incident 112
+# Suboptimal to make eye at L4.
+loadsgf games/incident108b.sgf 270
+12 reg_genmove black
+#? [N4]
+
+# incident 113
+# See also reading:194
+loadsgf games/incident108b.sgf 292
+13 reg_genmove black
+#? [N18]
+
+# incident 121
+# E9 is not necessarily the best move since upper left weak too.
+# But the game move at R7 is not urgent!
+loadsgf games/incident121.sgf 24
+14 reg_genmove black
+#? [E9]
+
+# incident 132
+loadsgf games/incident121.sgf 116
+16 reg_genmove black
+#? [H12]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=N11 may not be biggest, but should be found.
+#SEVERITY=2
+#    2.7.179: This can surely be fixed with the addition of a
+#    pattern. After N11, the strings at M12 and N10 cannot both be 
+#    saved. This is not necessarily the biggest move on the board but 
+#    at least this move should be found.
+# incident 165
+# H10 looks fine - tm
+loadsgf games/incident165.sgf 108
+17 reg_genmove black
+#? [N11|H10]
+
+
+# incident 166a
+# Original move was N3, which is pointless.
+# E5 is an overplay, see reading test 124.
+# F3 seems fine to protect the two cuts -arend
+# N11 may well be biggest but is already tested above.
+loadsgf games/incident165.sgf 142
+18 restricted_genmove black E4 E5 F3 N3
+#? [E4|F3]
+
+# # Current GNU Go would never consider passing here. Removed.
+# loadsgf games/strategy4.sgf
+# 19 reg_genmove black
+# #? [!PASS]
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=S13 is terrible - negative value.
+#SEVERITY=8
+#    2.7.179: Owl code finds Q11 but it remains undervalued at 17 points.
+# incident 290
+loadsgf games/incident290.sgf 30
+20 reg_genmove black
+#? [Q11]
+
+# incident 291
+loadsgf games/incident291.sgf 54
+21 reg_genmove black
+#? [S13]
+
+# incident 292
+loadsgf games/incident291.sgf 70
+22 reg_genmove black
+#? [K3]
+
+# incident 294
+loadsgf games/incident291.sgf 88
+23 reg_genmove black
+#? [!K5]
+
+# incident 295
+# endgame mistake
+loadsgf games/incident291.sgf 250
+24 reg_genmove black
+#? [F4]
+
+# Moved to filllib.tst
+# # incident 296
+# # liberty filling mistake
+# loadsgf games/incident291.sgf 274
+# 25 reg_genmove black
+# #? [PASS]
+
+loadsgf games/strategy5.sgf 12
+26 reg_genmove black
+#? [D3]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Blocking in the corner is better.
+#SEVERITY=3
+#    This test passed before 2.7.183, but for the wrong reason: 
+#    the move at C3 was allegedly an owl attack/defense point for 
+#    the dragon at D3, which of course it is not.
+#
+#    Thus this example should be regarded as having been already
+#    broken.
+#
+loadsgf games/strategy5.sgf 14
+27 reg_genmove black
+#? [C3]
+
+loadsgf games/strategy5.sgf 20
+28 restricted_genmove black G3 F2
+#? [G3]
+
+loadsgf games/strategy5.sgf 40
+29 reg_genmove black
+#? [R4]*
+
+loadsgf games/strategy5.sgf 44
+30 restricted_genmove black T7 S4
+#? [S4]
+
+# This is a problem with the semeai analyzer and revise_semeai().
+# But there is no semeai.
+loadsgf games/strategy6.sgf 274
+31 reg_genmove black
+#? [PASS]
+
+loadsgf games/strategy7.sgf 23
+32 reg_genmove black
+#? [A4]
+
+loadsgf games/strategy8.sgf 283
+33 reg_genmove white
+#? [O7]
+
+loadsgf games/nicklas/nicklas8.sgf 72
+34 reg_genmove black
+#? [E17]
+
+loadsgf games/nicklas/nicklas8.sgf 80
+35 restricted_genmove black B17 H17
+#? [H17]
+
+loadsgf games/nicklas/nicklas8.sgf 82
+36 restricted_genmove black H17 D18
+#? [H17]
+
+loadsgf games/nicklas/nicklas8.sgf 84
+37 restricted_genmove black A17 A18 C19 H17
+#? [H17]
+
+# The life code solves this mistake.
+loadsgf games/nicklas/nicklas8.sgf 86
+38 restricted_genmove black H17 B19
+#? [H17]
+
+loadsgf games/nicklas/nicklas8.sgf 96
+39 reg_genmove black
+#? [P16]
+
+
+#CATEGORY=STRATEGY
+#DESCRIPTION=L14 is not a terrible way to attack O13 group.
+#SEVERITY=2
+#Consider retiring this problem, or adding L14.  L14 is not terrible.
+#M11 is better than L4
+#    2.7.231: Broke again. M11 is overrated at 28 points. The
+#    large followup value is responsible.
+# I disagree. M11 makes territory while attacking. -arend
+loadsgf games/nicklas/nicklas8.sgf 98
+40 reg_genmove black
+#? [E5|M11]*
+
+
+#CATEGORY=STRATEGY
+#DESCRIPTION=N16 is better than M11.  Could be a tough attack, though.
+#SEVERITY=4
+#    2.7.179: After fixing strategy 40, the spurious defenses of D19
+#    will be removed. Now N16 will be the most valuable move. So 
+#    this should be fixed automatically when 40 is fixed.
+#
+#    2.7.180: this test passes.
+#
+#    2.7.220: N12 is found as an owl attack point for the S14 dragon.
+#    This attack will probably fail. More seriously, M16 is preferred
+#    to N16.
+#
+loadsgf games/nicklas/nicklas8.sgf 106
+41 reg_genmove black
+#? [N16]
+
+loadsgf games/strategy9.sgf 232
+42 reg_genmove black
+#? [C17]
+
+# A14 works but is inferior shape since it leaves more ko threats.
+loadsgf games/strategy10.sgf
+43 reg_genmove white
+#? [B13|B14|A14]
+
+#CATEGORY=STRATEGY
+#DESCRIPTION=L4 is awkward.
+#SEVERITY=2
+#    2.7.179: Whether or not the recommended move at G2 is found, the 
+#    move at A6 is egregiously bad. In this situation an owl critical 
+#    dragon adjoins an owl dead one. We need to revisit our policy for 
+#    such situations. The reading code thinks the worm at B4 can be 
+#    defended, so this is an owl lunch.
+#
+#    2.7.180: After revision of semeai.c, the move at A6 is no longer
+#    found. Now GNU plays at M16 on the top. Arguably stabilizing
+#    the bottom at G2 or (worse but still OK) at J2 is better but
+#    I would class this result as ACCEPTABLE.
+#
+#    3.1.9: Best move here is tough.  GNU Go correctly tries
+#    to stabilize G3 group.
+#
+# See also reading:158
+loadsgf games/strategy11.sgf 77
+44 reg_genmove black
+#? [G2]*
+
+# G17/G18 and C1/H1 are both huge.
+loadsgf games/strategy11.sgf 127
+45 reg_genmove black
+#? [G17|G18|C1|H1]
+
+loadsgf games/strategy11.sgf 245
+46 reg_genmove black
+#? [E1]
+
+loadsgf games/strategy12.sgf 9
+47 reg_genmove black
+#? [!N17]
+
+#CATEGORY=FUSEKI_STRATEGY
+#DESCRIPTION=B17 better than D17
+#SEVERITY=3
+loadsgf games/strategy12.sgf 19
+48 reg_genmove black
+#? [B17]*
+
+loadsgf games/strategy12.sgf 21
+# D16 is the strongest but these are acceptable
+49 reg_genmove black
+#? [C17|D16|B17]*
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=P9 is pointless compared to Q9.
+#SEVERITY=8
+# Q9 is clearly better than Q11 because it stops a black connection
+# along the edge.
+# So much better, that I removed Q11 option -trevor
+loadsgf games/strategy13.sgf
+50 reg_genmove white
+#? [Q9]*
diff --git a/regression/strategy2.tst b/regression/strategy2.tst
new file mode 100644 (file)
index 0000000..71783ba
--- /dev/null
@@ -0,0 +1,273 @@
+# numbering is continued from strategy.tst.
+
+loadsgf games/strategy14a.sgf
+# modification of move 17 in strategy14.sgf: Ladder works for W, urgent
+# move in lower left removed.
+51 reg_genmove white
+#? [P3]*
+
+loadsgf games/strategy14.sgf 33
+52 reg_genmove white
+#? [H5]*
+
+loadsgf games/strategy14.sgf 53
+53 reg_genmove white
+#? [S15]*
+
+loadsgf games/strategy14.sgf 81
+54 reg_genmove white
+#? [P6]
+
+loadsgf games/strategy14.sgf 125
+55 reg_genmove white
+#? [C12]*
+
+loadsgf games/strategy14.sgf 211
+56 restricted_genmove white C9 A7
+#? [A7]
+
+loadsgf games/strategy15.sgf 2
+57 reg_genmove black
+#? [!PASS]
+
+loadsgf games/strategy16.sgf 2
+58 reg_genmove black
+#? [!PASS]
+
+# incident 285
+# Seki mistake
+loadsgf games/incident278.sgf 322
+59 reg_genmove black
+#? [B1]
+
+# incident 257
+# This result appears to be wrong. B can get a ko by playing D10.
+loadsgf games/incident256.sgf 215
+60 reg_genmove black
+#? [H7]*
+
+# incident 259
+loadsgf games/incident258.sgf 251
+61 reg_genmove black
+#? [M2]
+
+# incident 169 (from the disastrous Indigo game)
+# D6 is unreasonable. Test it against an arbitrary reasonable move.
+loadsgf games/incident169.sgf 18
+62 restricted_genmove white D6 H3
+#? [H3]
+
+# incident 170 (from the disastrous Indigo game)
+# E6 is unreasonable. Test it against an arbitrary reasonable move.
+loadsgf games/incident169.sgf 32
+63 restricted_genmove white E6 L6
+#? [L6]
+
+# incident 171 (from the disastrous Indigo game)
+loadsgf games/incident169.sgf 60
+64 reg_genmove white
+#? [B13|C13|C12|E14|D14]
+
+# incident 173 (from the disastrous Indigo game)
+# M17 connects on the edge. L16 does too but allows black to get
+# somewhat stronger. L13 is not completely out of the question since
+# it successfully cuts black. It might be a little too early though.
+# Also see connection:23-25.
+loadsgf games/incident169.sgf 110
+65 reg_genmove white
+#? [M17]*
+
+# incident 174 (from the disastrous Indigo game)
+loadsgf games/incident169.sgf 132
+66 reg_genmove white
+#? [N11]*
+
+# incident 175 (from the disastrous Indigo game)
+loadsgf games/incident169.sgf 154
+67 reg_genmove white
+#? [F14]*
+
+# incident 177 (from the disastrous Indigo game)
+# D13 doesn't suffice to kill the whole black dragon because after
+# black F14, E13 and M16 are miai to make a second eye.
+loadsgf games/incident169.sgf 184
+68 reg_genmove white
+#? [F14]*
+
+# incident 183 (from the disastrous Indigo game)
+loadsgf games/incident169.sgf 300
+69 reg_genmove white
+#? [PASS]
+
+loadsgf games/strategy17.sgf
+# defense of K16 is urgent
+# however it may be difficult to save both K16 and M18 so if the 
+# moves listed are not too undervalued we may accept this result
+70 reg_genmove white
+#? [M15|J15|N16|J16]*
+
+# E6 is the only move.
+loadsgf games/strategy18.sgf
+71 reg_genmove black
+#? [E6]
+
+# Semeai problem.
+loadsgf games/strategy19.sgf 94
+72 reg_genmove white
+#? [A8]
+
+# I have added R17, as it seems to kill the huge black dragon --arend
+# added P15, because it also seems likely to kill the dragon,
+# and gnugo 3.3.18-pre3 finds it at level 12 --evand
+# Note: E7 doesn't work because of B:D9.
+loadsgf games/semeai2.sgf 116
+73 reg_genmove white
+#? [F7|R17|P15]*
+
+# I have added R17, as it seems to kill the huge black dragon --arend
+# added P15, because it also seems likely to kill the dragon,
+# and gnugo 3.3.18-pre3 finds it at level 12 --evand
+loadsgf games/semeai2.sgf 118
+74 reg_genmove white
+#? [F7|R17|P15]
+
+loadsgf games/semeai2.sgf 150
+# If Q11 is not undervalued F7 is acceptable (though not correct)
+75 reg_genmove white
+#? [Q11]*
+
+loadsgf games/semeai2.sgf 152
+# If Q11 is not undervalued F7 is acceptable (though not correct)
+76 reg_genmove white
+#? [Q11]*
+
+loadsgf games/strategy21.sgf 86
+77 restricted_genmove black N4 H3 G3 J2 H2 G2
+#? [H3]
+
+# Compare reading test 131.
+loadsgf games/strategy21.sgf 96
+78 reg_genmove black
+#? [H2]*
+
+loadsgf games/strategy14a.sgf
+# see test 51
+79 reg_genmove black
+#? [N3]
+
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=
+#SEVERITY=
+# This is essentially a semeai problem
+loadsgf games/strategy22.sgf
+80 reg_genmove white
+#? [P4|Q4|Q3|S8]
+
+# Looks to me like B12 is also effective, although much more
+# complicated. /gf
+loadsgf games/strategy23.sgf
+81 reg_genmove white
+#? [E13|D13]*
+
+loadsgf games/dragon1.sgf 206
+82 reg_genmove black
+#? [L5]
+
+loadsgf games/heikki/heikki01.sgf 17
+# P15 is a joseki, but GNU should at least see that P14 is urgent
+83 reg_genmove black
+#? [P14]
+
+loadsgf games/heikki/heikki01.sgf 35
+# J18 makes ko
+# But Q13 seems larger -arend
+84 reg_genmove black
+#? [Q13]*
+
+loadsgf games/strategy24.sgf
+85 reg_genmove white
+#? [O2]*
+
+# A very tricky semeai problem.
+# Maybe we should move this and other semeai problems to a separate
+# test suite.
+loadsgf games/semeai3.sgf 240
+86 reg_genmove black
+#? [J14]*
+
+# Moved to atari_atari.tst
+# # Atari_atari makes a mistake.
+# loadsgf games/atari_atari01.sgf 235
+# 87 reg_genmove black
+# #? [!N3]
+
+loadsgf games/strategy25.sgf 45
+88 reg_genmove black
+#? [B7]*
+
+loadsgf games/strategy25.sgf 55
+89 reg_genmove black
+#? [(D16|B7|G13)]
+
+# Connecting with ko at B14 looks best. Cutting at D17 might be
+# considered. B17 (game move) is inferior.
+loadsgf games/strategy25.sgf 61
+90 reg_genmove black
+#? [B14|D17]*
+
+# Connecting with ko at B14 is still best. The game move at B13 is
+# nothing but horrible. G13 would of course be superior if it killed
+# white, but this looks unlikely.
+# tm: Whether G13 kill or not, sealing white in is best.  G13 is fine.
+# tm added G13 (3.1.14)
+loadsgf games/strategy25.sgf 63
+91 reg_genmove black
+#? [B14|G13]
+
+loadsgf games/strategy25.sgf 67
+92 reg_genmove black
+#? [G13]
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=
+#SEVERITY=
+loadsgf games/strategy25.sgf 75
+93 reg_genmove black
+#? [D11]*
+
+# A2 is the best move to live in the corner. B3 and A4 also live but
+# the two B6 stones must then be sacrificed. C5 only lives with ko. B5
+# dies right out.
+loadsgf games/strategy25.sgf 119
+94 reg_genmove black
+#? [A2]
+
+# The game move at P13 is a suicidal blunder.
+loadsgf games/strategy25.sgf 249
+95 restricted_genmove black P13 O15
+#? [O15]
+
+loadsgf games/strategy26.sgf 195
+96 restricted_genmove black J5 O1
+#? [J5]
+
+loadsgf games/strategy26.sgf 209
+97 reg_genmove black
+#? [T8]
+
+# Under no circumstances play the snapback at Q1!
+loadsgf games/strategy26.sgf 237
+98 restricted_genmove black T6 Q1 S1 L5 N7
+#? [T6]
+
+# It's pointless to play L5 in order to tactically save Q2. We need to
+# classify the Q2 dragon as inessential.
+loadsgf games/strategy26.sgf 251
+99 reg_genmove black
+#? [M13]
+
+# See also owl:254.
+loadsgf games/strategy26.sgf 257
+100 reg_genmove black
+#? [M16]
diff --git a/regression/strategy3.tst b/regression/strategy3.tst
new file mode 100644 (file)
index 0000000..872d86e
--- /dev/null
@@ -0,0 +1,235 @@
+# numbering is continued from strategy2.tst.
+
+loadsgf games/strategy26.sgf 259
+101 reg_genmove black
+#? [M16]*
+
+# Playing N18 instead of O19 leaves the threat to make a point on the edge.
+loadsgf games/strategy26.sgf 265
+102 reg_genmove black
+#? [N18]
+
+# A15 and C15 both fail badly. C16 allows white to make seki.
+loadsgf games/strategy26.sgf 285
+103 reg_genmove black
+#? [B16]
+
+# Urgent response.
+loadsgf games/strategy27.sgf 12
+104 reg_genmove white
+#? [P4]
+
+loadsgf games/strategy27.sgf 62
+105 reg_genmove white
+#? [J2]
+
+loadsgf games/strategy27.sgf 152
+106 reg_genmove white
+#? [F10]
+
+loadsgf games/strategy27.sgf 190
+107 reg_genmove white
+#? [F1]
+
+loadsgf games/strategy27.sgf 208
+108 reg_genmove white
+#? [C15]
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=
+#SEVERITY=
+# Important semeai example.
+loadsgf games/strategy27.sgf 216
+109 reg_genmove white
+#? [A9|C7]*
+
+# Important semeai example.
+loadsgf games/strategy27.sgf 220
+110 reg_genmove white
+#? [A8]
+
+loadsgf games/me.sgf 44
+111 reg_genmove black
+#? [K3]
+
+loadsgf games/me.sgf 84
+112 reg_genmove black
+#? [M12]
+
+loadsgf games/me.sgf 150
+113 reg_genmove black
+#? [P1]
+
+loadsgf games/poka.sgf 42
+114 reg_genmove white
+#? [D7]
+
+loadsgf games/poka.sgf 52
+115 reg_genmove white
+#? [G2]
+
+# incident 281
+# M4 and N5 are okay. O5 is a bad mistake.
+loadsgf games/incident278.sgf 212
+116 reg_genmove black
+#? [M4|N5]*
+
+# incident 282
+loadsgf games/incident278.sgf 252
+117 reg_genmove black
+#? [M2]
+
+loadsgf games/incident240.sgf 65
+118 reg_genmove black
+#? [A8]
+
+# incident 241
+loadsgf games/incident240.sgf 69
+119 reg_genmove black
+#? [D9|J3]
+
+# incident 221
+loadsgf games/incident221.sgf 35
+120 reg_genmove black
+#? [C7]
+
+# incident 222
+loadsgf games/incident221.sgf 39
+121 reg_genmove black
+#? [C7]
+
+# incident 223
+# see also owl:178
+loadsgf games/incident223.sgf 228
+122 reg_genmove black
+#? [(R19|T18)]
+
+# incident 275
+loadsgf games/incident272.sgf 250
+123 reg_genmove black
+#? [P4]
+
+# incident 271
+# C5 seems to lead to seki. Semeai mistake.
+loadsgf games/incident269.sgf 276
+124 reg_genmove black
+#? [C5]*
+
+# incident 158
+loadsgf games/incident156.sgf 232
+125 reg_genmove black
+#? [K17|J17|K18|L18|K19|L19|M19|H16]
+
+# The move valuation must become aware of the distinction between
+# attack and defense with or without ko.
+loadsgf games/strategy29.sgf 138
+126 reg_genmove white
+#? [B19]
+
+# incident 74
+loadsgf games/incident74.sgf 236
+127 reg_genmove black
+#? [!(S5|T4|T7)]
+
+# Semeai problem.
+loadsgf games/strategy30.sgf 171
+128 reg_genmove black
+#? [O8]
+
+# Semeai problem.
+# tm - S12 also works ok.
+loadsgf games/strategy30.sgf 201
+129 reg_genmove black
+#? [Q9|S12]
+
+loadsgf games/strategy31.sgf 34
+130 reg_genmove white
+#? [!D17|C16]
+
+loadsgf games/strategy31.sgf 44
+131 reg_genmove white
+#? [!(B18|P17|Q17|R16|R15|R18|Q18|P18|S17|S16|S15|G17)]
+
+loadsgf games/strategy31.sgf 48
+132 reg_genmove white
+#? [!F4]
+
+# Locally D4 is the only move, but there may be bigger moves elsewhere.
+loadsgf games/strategy31.sgf 50
+133 restricted_genmove white D4 E4 E5
+#? [D4]
+
+# R10 is clearly superior to S10
+loadsgf games/strategy31.sgf 158
+134 restricted_genmove white S10 R10
+#? [R10]
+
+loadsgf games/strategy31.sgf 188
+135 reg_genmove white
+#? [M12|N13|M13]
+
+loadsgf games/strategy32.sgf 19
+136 reg_genmove black
+#? [E2]
+
+loadsgf games/mf1.sgf 29
+137 reg_genmove black
+#? [F5]*
+
+loadsgf games/manner.sgf 12
+138 reg_genmove white
+#? [!O16]
+
+# Urgent semeai move, worth more than 150 points.
+loadsgf games/strategy33.sgf 189
+139 reg_genmove black
+#? [M18]
+
+loadsgf games/owl26.sgf 138
+140 reg_genmove white
+#? [N5|M6]
+
+loadsgf games/strategy34.sgf 51
+141 reg_genmove black
+#? [C7]
+
+loadsgf games/strategy34.sgf 57
+142 reg_genmove black
+#? [F7]
+
+loadsgf games/strategy34.sgf 59
+143 reg_genmove black
+#? [F8]
+
+loadsgf games/strategy34.sgf 61
+144 reg_genmove black
+#? [F8]
+
+# Incident 209. Semeai mistake.
+loadsgf games/incident209.sgf 193
+145 reg_genmove white
+#? [S14|T14]
+
+# Incident 210. Semeai mistake. See also semeai:135
+loadsgf games/incident209.sgf 259
+146 reg_genmove white
+#? [R11]
+
+# G3 is necessary here.
+loadsgf games/strategy35.sgf 112
+147 reg_genmove white
+#? [G3|F3|G4]
+
+loadsgf games/strategy35.sgf 140
+148 reg_genmove white
+#? [!K16]
+
+loadsgf games/gwe.sgf 225
+# see also reading test 149
+149 reg_genmove white
+#? [!O1]
+
+# Owl reading mistake, eyespace related.
+loadsgf games/gwe.sgf 203
+150 reg_genmove white
+#? [Q1]
diff --git a/regression/strategy4.tst b/regression/strategy4.tst
new file mode 100644 (file)
index 0000000..ae04231
--- /dev/null
@@ -0,0 +1,355 @@
+# numbering is continued from strategy3.tst.
+
+loadsgf games/gwe.sgf 231
+# strictly speaking tenuki is possible here. Q1 is of course bad
+# tm - Indeed GNU Go has finally figured out that tenuki is best!
+# tm - yes, Q1 is bad.  T5 also wastes a point.
+# gf - However, policy is to restrain thrashing dragons, so T5 is correct.
+151 reg_genmove white
+#? [T5]
+
+loadsgf games/gwe.sgf 241
+152 reg_genmove white
+#? [S8]
+
+loadsgf games/strategy36.sgf
+153 reg_genmove black
+#? [Q9]*
+
+loadsgf games/strategy37.sgf
+154 reg_genmove white
+#? [E8]
+
+# Incident 190.
+loadsgf games/incident189.sgf 186
+155 reg_genmove black
+#? [D18]
+
+loadsgf games/ssstator.sgf 133
+156 reg_genmove black
+#? [B14|B16]
+
+# This problem is interesting. First there's a combination attack
+# at B16/B14/C18/B12. Second there's a combination breakin attack
+# G9+E9+F10 together with the cuts at B10,B12,B14.
+# The only moves defending against both combinations are B14, B13,
+# B12, A14, and A12.
+loadsgf games/ssstator.sgf 136
+157 reg_genmove white
+#? [B14|B13|B12|A14|A12]*
+
+# E16 is completely aimless and ineffective.
+loadsgf games/strategy38.sgf 51
+158 restricted_genmove black E16 R18
+#? [R18]
+
+loadsgf games/strategy38.sgf 117
+159 reg_genmove black
+#? [R9]*
+
+loadsgf games/strategy38.sgf 133
+160 reg_genmove black
+#? [K2|L2|L3]
+
+loadsgf games/strategy38.sgf 197
+161 reg_genmove black
+#? [E12]
+
+# First live then attack. This should probably be analyzed as a semeai.
+loadsgf games/strategy39.sgf 156
+162 reg_genmove white
+#? [O7|Q7|N7]
+
+# First live then attack. This should probably be analyzed as a semeai.
+# tm - P8, though not as clean, also kills all the B stones.
+loadsgf games/strategy39.sgf 158
+163 reg_genmove white
+#? [O7|P8]*
+
+#### N4 is clearly superior to O5.
+#### tm - N4 has it's weaknesses (at O5) too.  Both clearly kill.
+###    removing this problem.
+###loadsgf games/strategy39.sgf 172
+###164 reg_genmove white
+####? [!O5]
+###
+
+# K1 is out of the question. K3 is locally better and L6 might kill with ko.
+loadsgf games/strategy39.sgf 178
+165 reg_genmove white
+#? [K3|L6]
+
+loadsgf games/incident94.sgf 114
+166 reg_genmove white
+#? [D11]*
+
+# Tenuki instead of urgent edge joseki move.
+loadsgf games/strategy40.sgf 10
+167 reg_genmove black
+#? [D4]
+
+# Safety must come first. This is almost a whole-board semeai.
+loadsgf games/strategy40.sgf 30
+168 reg_genmove black
+#? [A3|A4]*
+
+# Both J7 and J9 rescue the threatened stones, but J7 is the proper
+# choice since it leaves a smaller ko threat behind. (That there's no
+# risk for ko in this position is irrelevant. There's still no reason
+# to choose J9 over J7.)
+loadsgf games/strategy41.sgf
+169 reg_genmove black
+#? [J7]
+
+# White can't play G19. Locally this move must be at G18.
+loadsgf games/strategy42.sgf 174
+170 restricted_genmove white G18 G19
+#? [G18]
+
+# T19 is out of the question. Locally T17 is better but the correct
+# move is A5.
+loadsgf games/strategy42.sgf 188
+171 reg_genmove white
+#? [A5]
+
+# It's correct to make a ko threat, but N9 is inefficient because it
+# doesn't utilize the full ko potential of the position. Locally M8 is
+# superior.
+loadsgf games/strategy42.sgf 214
+172 restricted_genmove white M8 N9
+#? [M8]*
+
+#CATEGORY=KO
+#DESCRIPTION=GNU Go lacks sufficient Ko understanding
+#SEVERITY=4
+# There's no way to win the ko by making atari from above. This move
+# must be at A9. This is a good example showing why only having the
+# difference between a ko where we make the first threat or not is
+# insufficient.
+loadsgf games/strategy42.sgf 218
+173 reg_genmove white
+#? [A9]
+
+# Always take the ko at least once.
+loadsgf games/strategy42.sgf 248
+174 reg_genmove white
+#? [S19]
+
+# This example shows that we need to find additional owl attack
+# points. Currently only K15 is found to owl attack N19, but clearly
+# the J14 move also does this, without sacrificing K13.
+loadsgf games/strategy43.sgf 271
+175 reg_genmove white
+#? [J14]
+
+# Best to capture with snapback.
+loadsgf games/strategy44.sgf
+176 reg_genmove black
+#? [D9]
+
+loadsgf games/xxlin.sgf 8
+177 reg_genmove black
+#? [E2]
+
+# E2 looks somewhat smaller but is still a good move. I think it
+# should be added. /gf
+loadsgf games/xxlin.sgf 16
+178 reg_genmove black
+#? [P4|P3|E2]
+
+#DESCRIPTION=Tenuki also seems OK here.
+#Added E2 (3.1.14) -trevor
+loadsgf games/xxlin.sgf 20
+179 reg_genmove black
+#? [P3|O2|P2|O4|E2]*
+
+loadsgf games/xxlin.sgf 30
+180 restricted_genmove black M7 Q8 R8 S8
+#? [Q8|R8]*
+
+loadsgf games/xxlin.sgf 38
+181 reg_genmove black
+#? [F3]*
+
+loadsgf games/xxlin.sgf 48
+182 reg_genmove black
+#? [E7|F8]*
+
+loadsgf games/xxlin.sgf 76
+183 reg_genmove black
+#? [P10|H9]
+
+loadsgf games/xxlin.sgf 106
+184 reg_genmove black
+#? [H13|F15|Q13]
+
+# We may want to move this to a dedicated seki or semeai test suite in
+# the future.
+loadsgf games/seki02.sgf
+185 reg_genmove black
+#? [E7]
+
+# O8 only move.
+loadsgf games/owl29.sgf 134
+186 reg_genmove white
+#? [O8]
+
+# B can play at C4 if we remember the tesuji B:C4 W:E4 B:B2.
+
+loadsgf games/pooo.sgf 16
+187 restricted_genmove black E4 C4 B3 B4 C1
+#? [C4|E4]*
+
+loadsgf games/pooo.sgf 24
+188 reg_genmove black
+#? [B6|C4]
+
+loadsgf games/pooo.sgf 50
+189 restricted_genmove black A14 C14 D14 E14 D15 E15 C19
+#? [E14]*
+
+loadsgf games/pooo.sgf 52
+190 reg_genmove black
+#? [D13]*
+
+loadsgf games/pooo.sgf 56
+191 reg_genmove black
+#? [C12]
+
+# A15 captures the white corner stones but does not have much
+# strategical value. The black stones are safe anyway. Thus A15 is
+# worth about 19 points. Other moves may well be larger.
+loadsgf games/pooo.sgf 74
+192 reg_genmove black
+#? [A15]*
+
+# (3.1.9) owl status of A11 is unchecked.
+
+loadsgf games/bretz.sgf 26
+193 reg_genmove black
+#? [F16]*
+
+loadsgf games/bretz.sgf 58
+194 reg_genmove black
+#? [A13]*
+
+loadsgf games/bretz.sgf 88
+195 restricted_genmove black S13 S14
+#? [S13]
+
+loadsgf games/bretz.sgf 100
+196 reg_genmove black
+#? [M17]*
+
+#Tenuki at S18 is not unthinkable. (3.1.14) -trevor
+loadsgf games/bretz.sgf 130
+197 reg_genmove black
+#? [K3|S18]
+
+#Tenuki at S18 is not unthinkable. (3.1.14) -trevor
+loadsgf games/bretz.sgf 148
+198 reg_genmove black
+#? [C10|S18]
+
+#Tenuki at S18 is not unthinkable. (3.1.14) -trevor
+loadsgf games/bretz.sgf 164
+199 reg_genmove black
+#? [N5|S18]
+
+#Tenuki at S18 is not unthinkable. (3.1.14) -trevor
+loadsgf games/bretz.sgf 212
+200 reg_genmove black
+#? [P6|P7|Q7|S18]*
+
+loadsgf games/juka1.sgf 8
+201 reg_genmove black
+#? [D5]
+
+loadsgf games/juka1.sgf 14
+202 reg_genmove black
+#? [B6]*
+
+loadsgf games/juka1.sgf 18
+203 reg_genmove black
+#? [D5]*
+
+loadsgf games/juka1.sgf 28
+204 reg_genmove black
+#? [B2]*
+
+loadsgf games/juka1.sgf 48
+205 restricted_genmove black O11 P11
+#? [P11]*
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=K6 does take K8 to no eyes, but...
+#SEVERITY=8
+#GNU Go misses that K10 (large B group) has way fewer liberties
+#than O9 group, hense missing importance of cutting off K8.
+loadsgf games/strategy45.sgf
+206 reg_genmove black
+#? [L8]*
+
+# T6 fails badly. Locally S9 looks best.
+loadsgf games/owl30.sgf 84
+207 restricted_genmove black R9 S9 T6
+#? [S9]*
+
+loadsgf games/lordofpi.sgf 36
+208 reg_genmove black
+#? [A5|A2|B1]
+
+# A4 allows W to make seki
+loadsgf games/lordofpi.sgf 46
+209 restricted_genmove black A1 A3 A4 C1 D3
+#? [A3]
+
+loadsgf games/lordofpi.sgf 52
+210 reg_genmove black
+#? [H7]
+
+loadsgf games/lordofpi.sgf 56
+211 reg_genmove black
+#? [H8]
+
+# Pattern LE14 gives an unreasonable value to H3.
+loadsgf games/owl31.sgf 28
+212 reg_genmove white
+#? [G2]
+
+loadsgf games/strategy46.sgf 172
+213 reg_genmove white
+#? [F1]
+
+loadsgf games/strategy46.sgf 174
+214 reg_genmove white
+#? [D2]
+
+# No longer interesting. Removed.
+# # CD103a incorrectly thinks E7 defends against a combination attack.
+# loadsgf games/owl33.sgf 200
+# 215 reg_genmove black
+# #? [!E7]
+
+# B6 is too slow at this time.
+loadsgf games/handtalk/handtalk1.sgf 45
+216 reg_genmove black
+#? [!B6]
+
+loadsgf games/handtalk/handtalk1.sgf 49
+217 reg_genmove black
+#? [!R9]
+
+# locally F12 is better. Similar problem at move 51
+loadsgf games/handtalk/handtalk1.sgf 55
+218 restricted_genmove black C14 E12 F12
+#? [F12]*
+
+# lots of good problems in this game
+loadsgf games/nngs/gnugo-3.1.30-morlvera-200204041921.sgf 154
+219 reg_genmove white
+#? [K9]*
+
+loadsgf games/nngs/gnugo-3.1.30-merlin-200204041428.sgf 189
+220 reg_genmove white
+#? [R6]
diff --git a/regression/strategy5.tst b/regression/strategy5.tst
new file mode 100644 (file)
index 0000000..f4d8fdc
--- /dev/null
@@ -0,0 +1,216 @@
+loadsgf games/wing-yuhiko-gnugo.sgf 12
+221 restricted_genmove black S4 Q7
+#? [S4]
+
+# This might be worth a J pattern.
+loadsgf games/wing-yuhiko-gnugo.sgf 30
+222 reg_genmove black
+#? [R14]*
+
+loadsgf games/wing-yuhiko-gnugo.sgf 46
+223 reg_genmove black
+#? [P16]
+
+#CATEGORY=STRATEGY
+loadsgf games/wing-yuhiko-gnugo.sgf 62
+224 reg_genmove black
+#? [N15]
+
+#CATEGORY=STRATEGY
+loadsgf games/wing-yuhiko-gnugo.sgf 86
+225 reg_genmove black
+#? [O12]
+
+#CATEGORY=CONNECTION
+loadsgf games/olympiad2002/game2-19-gnugo-goint-1-0.sgf 54
+226 reg_genmove white
+#? [F5]
+
+#CATEGORY=OWL
+# F1 was played in the game as an owl defense of E4.
+loadsgf games/olympiad2002/game2-19-gnugo-goint-1-0.sgf 66
+227 reg_genmove white
+#? [!F1]
+
+#CATEGORY=STRATEGY
+# Don't run away with an unimportant, weak stone.
+loadsgf games/olympiad2002/game2-19-gnugo-goint-1-0.sgf 90
+228 reg_genmove white
+#? [!N12]
+
+loadsgf games/olympiad2002/game1-19-go4-gnugo-1-0.sgf 41
+229 reg_genmove black
+#? [D7]
+
+loadsgf games/olympiad2002/game1-19-go4-gnugo-1-0.sgf 53
+230 reg_genmove black
+#? [H9]
+
+loadsgf games/olympiad2002/game1-19-go4-gnugo-1-0.sgf 107
+231 reg_genmove black
+#? [J2|J3]*
+
+# If tuning this position be sure GNU Go plays subsequent moves acceptably
+loadsgf games/olympiad2002/game1-19-goint-gnugo-1-0.sgf 17
+232 reg_genmove black
+#? [D11|E11]
+
+loadsgf games/olympiad2002/game1-19-goint-gnugo-1-0.sgf 23
+233 reg_genmove black
+#? [E13]*
+
+loadsgf games/olympiad2002/game1-19-goint-gnugo-1-0.sgf 29
+234 reg_genmove black
+#? [H14]
+
+loadsgf games/olympiad2002/game1-19-goint-gnugo-1-0.sgf 47
+235 reg_genmove black
+#? [G12|J13]
+
+loadsgf games/olympiad2002/game1-19-goint-gnugo-1-0.sgf 91
+236 reg_genmove black
+#? [R12]*
+
+# Not a valid problem
+# loadsgf games/nngs/gnugo-3.3.6-evand-200208290255.sgf 73
+# 272 reg_genmove white
+# #? [C7]*
+
+# Black has a combination attack which must be defended correctly against.
+# F8 and F7 both fail.
+loadsgf games/strategy47.sgf
+273 reg_genmove white
+#? [E8|E9|F9|E7|F6|E6|D7|C7]
+
+# Black has a combination attack which must be defended correctly against.
+# In particular L5 fails.
+loadsgf games/strategy48.sgf
+274 restricted_genmove white L5 M5 N5 M6
+#? [M6]*
+
+# Semeai problem. White can make seki, black can kill.
+loadsgf games/strategy49.sgf
+275 reg_genmove white
+#? [A18]
+276 reg_genmove black
+#? [A18]
+
+# R19 defends everything.
+loadsgf games/strategy50.sgf
+277 reg_genmove white
+#? [R19]
+
+loadsgf games/vaughn.sgf 44
+278 reg_genmove black
+#? [!J11]*
+
+# Really, anything is better than A18. (B13 and B12 are quite
+# ineffective too but can at least not be repeated...)
+loadsgf games/reading41.sgf 130
+279 restricted_genmove black A18 A16 B13 B12 E11
+#? [A16]
+
+loadsgf games/nngs/takeda-gnugo-3.3.23-200307302010.sgf 10
+280 reg_genmove black
+#? [P3]*
+
+loadsgf games/nngs/gnugo-3.3.23-viking4-200307312134.sgf 37
+281 reg_genmove white
+#? [E13]*
+
+#take the ko!
+loadsgf games/nngs/gnugo-3.3.23-viking4-200307312134.sgf 195
+282 reg_genmove white
+#? [O13]
+
+loadsgf games/nngs/gnugo-3.3.23-viking4-200307312134.sgf 235
+283 reg_genmove white
+#? [B9]
+
+loadsgf games/nngs/jypower-gnugo-3.3.22-200307050519.sgf 154
+284 reg_genmove black
+#? [R12|Q9]
+
+loadsgf games/nngs/jypower-gnugo-3.3.22-200307050519.sgf 162
+285 restricted_genmove black S10 O11 O10 Q11 N7
+#? [S10]
+
+loadsgf games/self_play/354-34-1.sgf 180
+286 reg_genmove white
+#? [K5]
+
+loadsgf games/self_play/354-34-3.sgf 194
+287 reg_genmove white
+#? [C2]*
+
+# By Andreas Braendle: 3.5.4 level 15 plays F4, and doesn't see the
+# value of a pincer.
+loadsgf games/ab1_fuseki.sgf 32
+288 reg_genmove black
+#? [R12|R11|Q12|Q11]*
+
+289 restricted_genmove black F4 M16
+#? [M16]
+
+# avoid bad exchange at E2
+loadsgf games/gg-040225.sgf 220
+290 reg_genmove black
+#? [S16|S17|T16]
+
+# P7 creates a shortage of liberties.
+loadsgf games/kisei28_g7.sgf 189
+291 restricted_genmove black P7 L9
+#? [L9]*
+
+loadsgf games/semeai/semeai19.sgf 42
+292 restricted_genmove black A15 F16 F17 S4 Q3
+#? [F16|F17]
+
+293 reg_genmove white
+#? [F17]*
+
+# Very important to separate black.
+loadsgf games/tso_igobot_2006-01-16.sgf 18
+294 restricted_genmove white O6 S6
+#? [S6]
+
+# Just play J2 directly.
+loadsgf games/CrazyStone1.sgf 34
+295 reg_genmove white
+#? [J2]*
+
+# Play the proper move.
+loadsgf games/CrazyStone2.sgf 17
+296 restricted_genmove black F9 G8
+#? [G8]
+
+# D9 is quite bad. (Not played in the game since it's the wrong player
+# but the move of choice for GNU Go 3.6 and 3.7.7.)
+loadsgf games/CrazyStone2.sgf 18
+297 restricted_genmove white D8 D9
+#? [D8]*
+
+# A5 is an overplay since it can't be defended without losing the
+# important eye in the upper left corner. (The list of accepted moves
+# is rather generous and can be
+loadsgf games/CrazyStone2.sgf 49
+298 reg_genmove black
+#? [D2|B7]
+
+# Can't play away any more liberties. Start picking the G8 stones off
+# the board immediately so that no more than the A7 stones need be
+# lost. (There's no time to attack from above.)
+loadsgf games/CrazyStone2.sgf 61
+299 reg_genmove black
+#? [H3]*
+
+# Still possible to save most of the stones.
+# See also connection:127.
+loadsgf games/CrazyStone2.sgf 77
+300 reg_genmove black
+#? [H3]*
+
+# B1 is the biggest way to defend the B7 dragon.
+loadsgf games/strategy51.sgf
+301 reg_genmove black
+#? [B1]
diff --git a/regression/tactics.tst b/regression/tactics.tst
new file mode 100644 (file)
index 0000000..a2bd2a8
--- /dev/null
@@ -0,0 +1,21 @@
+loadsgf games/tactics01.sgf
+1 reg_genmove black
+#? [C15|D15|B13|B11|B14]*
+
+loadsgf games/tactics02.sgf
+2 reg_genmove black
+#? [S11|S12]
+
+loadsgf games/tactics03.sgf
+3 reg_genmove black
+#? [M18]
+
+# This is in part an atari_atari problem. The best local move is K18
+# though J18 or G18 might be acceptable.
+loadsgf games/rosebud4.sgf 138
+4 reg_genmove white
+#? [K18]*
+
+loadsgf games/tactics04.sgf 206
+5 reg_genmove white
+#? [N16]
diff --git a/regression/tactics1.tst b/regression/tactics1.tst
new file mode 100644 (file)
index 0000000..2634e87
--- /dev/null
@@ -0,0 +1,70 @@
+# Apparently, T9 gets overvalued because the effect on S7 and T6 is
+# counted twice (territorially and strategically)
+loadsgf games/tactics05.sgf
+10 restricted_genmove white T9 T8 S9 S8
+#? [S8|S9]
+
+loadsgf games/tactics06.sgf
+20 owl_defend C19
+#? [1 A17]*
+
+# J1 is worth 6 points
+loadsgf games/seki03.sgf
+30 reg_genmove white
+#? [J1]*
+
+
+# attack_either and defend_both tests could go in a separate test suite,
+# once there is more of them
+
+loadsgf games/nngs/Lazarus-gnugo-3.1.34-200204280120.sgf 32
+trymove black D12
+trymove white C13
+trymove white C12
+trymove black C11
+101 attack_either C11 D12
+#? [1]
+popgo
+popgo
+popgo
+popgo
+
+# This is subtle. White N3 works as defense to L4.
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 126
+trymove black L4
+102 defend_both N7 K4
+#? [0]*
+popgo
+
+loadsgf games/nngs/Lazarus-gnugo-3.2-200205011927.sgf 86
+trymove black G4
+trymove white G3
+103 attack_either E5 G3
+#? [1]
+104 attack_either G3 E5
+#? [1]
+popgo
+popgo
+
+# C9 is errouneously thought to be an owl-attack against G13,
+# which could indicate a semeai reading problem. On the other
+# hand, since G13 is judged owl-defenseless, it seems to me
+# that C9 is strangely overvalued.
+loadsgf games/tactics07.sgf
+105 reg_genmove white
+#? [F7]
+
+loadsgf games/tactics08.sgf
+106 reg_genmove white
+#? [F8|F6]
+
+loadsgf games/edge_defense1.sgf
+107 reg_genmove white
+#? [B13|B14]
+
+# Obviously P7 is effective.
+loadsgf games/gifu2005/mfg-gnugo.sgf 204
+trymove white O6
+108 defend_both O9 P6
+#? [1]*
+popgo
diff --git a/regression/test.sh b/regression/test.sh
new file mode 100755 (executable)
index 0000000..95c1624
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+GNUGO=../interface/gnugo
+
+gtpfile=$1
+options=$2   # May be omitted
+options2=$3  # May be omitted  FIXME: Do multiple options nicer.
+
+$GNUGO --quiet $options $options2 --mode gtp <$gtpfile | egrep '^[=?][0-9]+' | cut -c 2-
diff --git a/regression/thrash.tst b/regression/thrash.tst
new file mode 100644 (file)
index 0000000..1e8613f
--- /dev/null
@@ -0,0 +1,146 @@
+loadsgf games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf 220
+1 reg_genmove black
+#? [Q7|Q6|O7|O6]
+
+loadsgf games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf 222
+2 reg_genmove black
+#? [Q7|Q6|O7|O5]
+
+loadsgf games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf 228
+3 reg_genmove black
+#? [O5|N5|N4]
+
+loadsgf games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf 230
+4 reg_genmove black
+#? [N4|O4|M4]*
+
+loadsgf games/nngs/Temnik-gnugo-3.3.15-200301161937.sgf 232
+5 reg_genmove black
+#? [M3|M2|N3|L4|M5|M4]*
+
+# Thrashing dragon in semeai (liberty count is close!)
+loadsgf games/nngs/uno-gnugo-3.3.16-200302050206.sgf 204
+6 reg_genmove black
+#? [T4|M5|O4|O2|P1]
+
+# D14 is way more solid than C13. Other moves are conceivable.
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf 78
+7 reg_genmove black
+#? [D14]
+
+# H10 effectively destroys white's eye shape and development
+# potential. The game move at N4 has almost no effect on the thrashing
+# dragon.
+loadsgf games/nngs/tommmal-gnugo-3.5.1-200310140825.sgf 140
+8 reg_genmove black
+#? [H10]
+
+# The N19 dragon should possibly be critical.
+loadsgf games/nngs/ccwills-gnugo-3.5.2-200312112026.sgf 95
+9 reg_genmove black
+#? [N12|N11]*
+
+# Don't let the dragon get out. It's in fact probably critical.
+loadsgf games/nngs/ccwills-gnugo-3.5.2-200312112026.sgf 125
+10 reg_genmove black
+#? [J15]
+
+# White can't be allowed to thrash in the corner. (Clearly critical dragon.)
+loadsgf games/nngs/ccwills-gnugo-3.5.2-200312112026.sgf 173
+11 reg_genmove black
+#? [S3]
+
+# H18 is too far to have any effect on the thrashing dragon.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 204
+12 reg_genmove white
+#? [K10]*
+
+# G10 is totally inappropriate. F10 is of course locally better but
+# the natural constraining move is P11.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 210
+13 reg_genmove white
+#? [P11]
+
+# N17 more constraining than L18.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 274
+14 reg_genmove white
+#? [N17]*
+
+# More valuable to connect P17 and O15.
+loadsgf games/nngs/gnugo-3.5.4-chpr-200403201748.sgf 278
+15 reg_genmove white
+#? [P16]*
+
+#restrain the dragon
+loadsgf games/nngs/gnugo-3.5.5-liza-200404251750.sgf 42
+16 reg_genmove white
+#? [B8|B9|B10|C8|C9]*
+
+# P19 as in the game is not so attractive. Better to first isolate 
+# the dragon completely. 
+loadsgf games/kgs/2004-04-10-Shun9137-GnuGoCVS.sgf 243
+17 reg_genmove black
+#? [L19|K19]*
+
+# GNU Go 3.7.9 tries an illegal, supposedly liberty filling, move at A1.
+loadsgf games/cgos/60311.sgf
+18 reg_genmove black
+#? [C4|A3|A5]
+
+# GNU Go 3.7.9 tries a simple ko violation at C9.
+loadsgf games/cgos/58273.sgf
+19 reg_genmove black
+#? [J9|F9]
+
+# Don't play send-two-return-one with F4, especially not when positional
+# superko is used.
+# See also reading:228.
+loadsgf games/cgos/879.sgf 68
+20 reg_genmove white
+#? [A9|A8|F2]
+
+# Don't play into ko needlessly with E1.
+loadsgf games/cgos/30527.sgf 71
+21 reg_genmove black
+#? [A3|D1|G9|C5|C6|D8|E7|F5|F4]
+
+# Don't play send-two-return-one with J9, especially not when positional
+# superko is used.
+loadsgf games/cgos/30527.sgf 73
+22 restricted_genmove black G9 J9
+#? [G9]
+
+# The ko at J6 is an irrelevant distration. Start with filling the
+# safe outer liberties.
+loadsgf games/cgos/994.sgf 76
+23 reg_genmove white
+#? [A5|D7]
+
+# Fill the outer ko at J7 first and there's nothing black can do.
+loadsgf games/cgos/994.sgf 78
+24 restricted_genmove white J1 J7
+#? [J7]*
+
+loadsgf games/cgos/13435.sgf 74
+25 reg_genmove white
+#? [A5|C7]
+
+loadsgf games/cgos/31446.sgf 88
+26 reg_genmove white
+#? [E1|A1]*
+
+# Fill a ko before taking another one.
+loadsgf games/cgos/37169.sgf 86
+27 reg_genmove white
+#? [J6]*
+loadsgf games/cgos/37169.sgf 88
+28 reg_genmove white
+#? [A2]*
+loadsgf games/cgos/37169.sgf 90
+29 reg_genmove white
+#? [D3]*
+
+loadsgf games/cgos/26449.sgf 47
+30 reg_genmove black
+#? [J4|J7]
+
diff --git a/regression/tiny.tst b/regression/tiny.tst
new file mode 100644 (file)
index 0000000..dc7e265
--- /dev/null
@@ -0,0 +1,106 @@
+# This test suite contains tests for boards of size 1x1, 2x2, 3x3, and 4x4.
+
+# No legal move on 1x1, so PASS is the only option.
+boardsize 1
+clear_board
+101 reg_genmove black
+#? [PASS]
+
+
+# Should play on the empty board. (?)
+loadsgf games/tiny/2x2.sgf 1
+201 reg_genmove black
+#? [A1|A2|B1|B2]
+
+# B2 urgent
+loadsgf games/tiny/2x2.sgf 2
+202 reg_genmove white
+#? [B2]
+
+# Black can make two eyes.
+203 reg_genmove black
+#? [B2]
+
+# Black can make two eyes.
+loadsgf games/tiny/2x2.sgf 3
+204 reg_genmove black
+#? [B2]
+
+
+# Taking the center point secures the whole board.
+loadsgf games/tiny/3x3a.sgf 1
+301 reg_genmove black
+#? [B2]
+
+loadsgf games/tiny/3x3a.sgf 3
+302 reg_genmove black
+#? [B1|B3|C2]
+
+loadsgf games/tiny/3x3a.sgf 5
+303 reg_genmove black
+#? [C2]
+
+loadsgf games/tiny/3x3b.sgf 2
+304 reg_genmove white
+#? [B2]*
+
+loadsgf games/tiny/3x3b.sgf 3
+305 reg_genmove black
+#? [B3|B1|C2]
+
+loadsgf games/tiny/3x3b.sgf 5
+306 reg_genmove black
+#? [C2]
+
+
+loadsgf games/tiny/4x4a.sgf 1
+401 reg_genmove black
+#? [B2|C2|B3|C3]
+
+loadsgf games/tiny/4x4a.sgf 2
+402 reg_genmove white
+#? [B2]*
+
+loadsgf games/tiny/4x4a.sgf 3
+403 reg_genmove black
+#? [B3|C2]
+
+loadsgf games/tiny/4x4a.sgf 4
+404 reg_genmove white
+#? [B3]
+
+loadsgf games/tiny/4x4a.sgf 5
+405 reg_genmove black
+#? [B1|B4|C1|C4]
+
+# C4 gives the same result under Chinese rules but is one point worse
+# under Japanese rules.
+loadsgf games/tiny/4x4a.sgf 6
+406 reg_genmove white
+#? [C1]
+
+# A3, B1, C4, and D2 all give jigo under Japanese rules. Under Chinese
+# rules the results are A3:B+2, B1:B+1, C4:jigo, D2:W+1.
+loadsgf games/tiny/4x4a.sgf 7
+407 reg_genmove black
+#? [A3]*
+
+# Under Chinese rules all of B1, D2, and C4 give B+2. Under Japanese
+# rules B1 and D2 give jigo while C4 gives B+1.
+loadsgf games/tiny/4x4a.sgf 8
+408 reg_genmove white
+#? [B1|D2]
+
+# A2, C4, and D2 all give jigo under Japanese rules. Under Chinese
+# rules A2 gives B+2, C4 gives jigo, and D2 gives W+1.  
+loadsgf games/tiny/4x4a.sgf 9
+409 reg_genmove black
+#? [A2]
+
+loadsgf games/tiny/4x4a.sgf 10
+410 reg_genmove white
+#? [D2]
+
+loadsgf games/tiny/4x4a.sgf 11
+411 reg_genmove black
+#? [D4]
diff --git a/regression/trevor.tst b/regression/trevor.tst
new file mode 100644 (file)
index 0000000..4f20fff
--- /dev/null
@@ -0,0 +1,682 @@
+#terrible connection mistake.
+loadsgf games/trevor/trevor_01.sgf 28
+1 reg_genmove white
+#? [G5]
+
+#probably a screwed up fuseki library!
+#CATEGORY=JOSEKI_DATABASE
+#DIFFICULTY=1
+loadsgf games/trevor/trevor_02.sgf
+2 reg_genmove white
+#? [!PASS]
+
+# underlying reading problem
+#Gunnar wrote:
+#
+#> ./gnugo --quiet -a -w -t -l ../regression/games/unsorted_03.sgf -L 29
+#> --decide-string E4 -o vars.sgf
+#> 
+#> giving the result
+#> 
+#> | E4 cannot be attacked (874 variations)
+#> 
+#> So here's the problem. Usually GNU Go is quite strong at tactical
+#> reading and it might be expected to read this position correctly.
+#> Closer analysis of the vars.sgf file shows that GNU Go is confused by
+#> a few meaningless stalling moves from white (like throwin at D5 and
+#> atari at F6) and the corner ko potential. This can probably be fixed,
+#> but it's not easy and it may involve complex tradeoffs between speed
+#> and accuracy.
+#
+#If you increase the level, it sees the attack but misses that
+#it is unconditional. It sees a ko in the corner after
+#
+#B:G4 W:F2 B:H2 W:H3 B:H4 W:H1 B:J3 etc.
+#
+#Dan
+#CATEGORY=TACTICAL_READING
+#DIFFICULTY=8
+#PREDECESSOR=reading.tst.154
+loadsgf games/trevor/trevor_03.sgf 28
+3 reg_genmove white
+#? [!E3]
+
+#simple edge block missed.
+loadsgf games/trevor/trevor_04.sgf 30
+4 reg_genmove white
+#? [G1]
+
+#E5 is the only move.  Is GNU Go playing somewhat randomly here?
+#Dan said:
+#Looking at unsorted test 5, a typical way to solve this would be
+#to add an edge Joseki pattern, such as this:
+#
+#Pattern EJ84
+#
+#......       Atari before connecting
+#..*...
+#X.XO..
+#.XO...
+#......
+#......
+#------
+#
+#:8,J
+#
+#One should also add a pattern or two for followup. A pattern
+#with type J is given a weight of 27 on a 19x19 board, which
+#means that it is played automatically unless there is something
+#really huge on the board.
+#
+#Unfortunately, this does not work. The problem is that the values of
+#J patterns are scaled. From shapes.c:
+#
+#  if (class & CLASS_J) {
+#    TRACE("...joseki standard move\n");
+#    add_expand_territory_move(ti, tj);
+#    TRACE("...expands territory\n");
+#    add_expand_moyo_move(ti, tj);
+#    TRACE("...expands moyo\n");
+#    set_minimum_move_value(ti, tj, 27 * board_size / 19.0);
+#    TRACE("... minimum move value %f\n", 27 * board_size / 19.0);
+#  }
+#CATEGORY=JOSEKI_DATABASE
+#DIFFICULTY=8
+loadsgf games/trevor/trevor_05.sgf 6
+5 reg_genmove white
+#? [E5]
+
+#locally B9 is terrible.  There are other big moves on the board.
+loadsgf games/trevor/trevor_06.sgf 22
+6 reg_genmove white
+#? [B7|C6|F5]
+
+#B5 is certainly better than C5 here.  This is a terrible
+#game for white, but it's hard to narrow down the obvious
+#blunders.
+#Per Dan:  This needs to be fixed. It is probably a
+#matter of owl tuning and may require some thought.
+#CATEGORY=OWL_TUNING
+#DIFFICULTY=6
+loadsgf games/trevor/trevor_07.sgf 32
+7 reg_genmove white
+#? [!C5]
+
+#Pattern missing here?  B8 is almost always better than B9.
+loadsgf games/trevor/trevor_08.sgf 24
+8 reg_genmove white
+#? [!B9]
+
+#E5 (or some defence of D4 worm) is necessary.
+#Dan: This should be solved by a reading connection
+#analyzer. Tristan Cazenave is working on such a project.
+#See also connection:21,22.
+#CATEGORY=CONNECTION
+loadsgf games/trevor/trevor_09.sgf
+9 reg_genmove white
+#? [E5]*
+
+#This is nearly trivial, it would seem!
+loadsgf games/trevor/trevor_10.sgf
+10 reg_genmove white
+#? [E6]
+
+#Yikes, gnugo can't play into here.  See also the next problem.
+loadsgf games/trevor/trevor_11.sgf
+11 reg_genmove white
+#? [!B2]*
+
+#J2 is terrible.  H1 leads at least to a Ko.
+loadsgf games/trevor/trevor_12.sgf
+12 reg_genmove black
+#? [H1]
+
+#E2 is obvious.
+loadsgf games/trevor/trevor_13.sgf
+13 reg_genmove black
+#? [E2]
+
+#Must protect double cut at C2 & E2
+loadsgf games/trevor/trevor_14.sgf
+14 reg_genmove white
+#? [!PASS]
+
+# Protecting at E7 is very necessary.
+# See also connection:117.
+loadsgf games/trevor/trevor_15.sgf 
+15 reg_genmove white
+#? [E7]
+
+# C1 looks best here. A7 very unorthodox, and at least worse for ko
+# threats. Since the lower left is the focus of the next test, this
+# test is restricted to the upper left corner.
+loadsgf games/trevor/trevor_16.sgf 53
+160 restricted_genmove black A7 A8 A9 B8 B9 C7 C8 C9 D8
+#? [B8|C8]*
+
+# Protecting lower left group better.
+loadsgf games/trevor/trevor_16.sgf 54
+161 restricted_genmove white B1 F9
+#? [B1]*
+
+# W can live here unconditionally.
+# A2 is inferior as black gets seki with B1. /ab
+loadsgf games/trevor/trevor_16.sgf 58
+162 reg_genmove white
+#? [B1]*
+
+# If Black B9, White can't connect at C7.
+loadsgf games/trevor/trevor_16.sgf 67
+163 reg_genmove black
+#? [B9]
+
+# Must connect dragons.
+# B6 should be valued much much lower than B5
+loadsgf games/trevor/trevor_17.sgf 22
+170 reg_genmove white
+#? [B5]
+
+# C8 is terrible.
+loadsgf games/trevor/trevor_17.sgf 28
+171 reg_genmove white
+#? [!C8]
+
+# Snapback!
+loadsgf games/trevor/trevor_18.sgf 32
+180 reg_genmove white
+#? [!A8]
+
+# Whoops, don't let go of the dragon's tail!
+loadsgf games/trevor/trevor_19.sgf 12
+190 reg_genmove white
+#? [B7]
+
+# W should connect his two dragons.
+loadsgf games/trevor/trevor_20.sgf 14
+200 reg_genmove white
+#? [D7|D4]
+
+# W can live on the right pretty easily (i.e. G8)
+loadsgf games/trevor/trevor_20.sgf
+201 reg_genmove white
+#? [!PASS]
+
+# W can live on the right pretty easily (i.e. G8)
+# Black really does pass here, but eval.sh reports a PASSED result. (?)
+loadsgf games/trevor/trevor_20.sgf
+202 reg_genmove black
+#? [!PASS]
+
+# Huge negative sacrifice at D8.
+loadsgf games/trevor/trevor_21.sgf 22
+210 reg_genmove white
+#? [!D8]
+
+# In this case, the knight's move connection looks best.
+# Black seems not to see the cut coming.
+loadsgf games/trevor/trevor_22.sgf 23
+220 reg_genmove black
+#? [E8]
+
+# F2 is not really sente, nor useful if it were!
+loadsgf games/trevor/trevor_23.sgf 27
+230 reg_genmove black
+#? [C2|B2|C4]
+
+
+# Connect the dragons!  One eye is not enough, anyway.
+# See also owl.tst 221
+loadsgf games/trevor/trevor_24.sgf 33
+240 reg_genmove black
+#? [E8|D8]
+
+
+# G2 is a gift to white.
+loadsgf games/trevor/trevor_25.sgf 31
+250 reg_genmove black
+#? [!G2]
+
+# G1 is another gift to white.
+loadsgf games/trevor/trevor_25.sgf 33
+251 reg_genmove black
+#? [!G1]
+
+
+# Should connect further back, at least, but of course
+# blocking at C1 is much bigger.
+# 3.1.8 reports:
+#  Move at C1 strategically or tactically unsafe
+#  Move at F9 strategically or tactically unsafe
+loadsgf games/trevor/trevor_26.sgf 33
+260 reg_genmove black
+#? [C1|F9]*
+
+#Here's the problem:
+#Top moves:
+#1. F9  16.22
+#2. A2  8.28
+#Checking safety of a black move at F9
+#Move at F9 would be a blunder.
+loadsgf games/trevor/trevor_26.sgf 39
+261 reg_genmove black
+#? [F9]
+
+loadsgf games/trevor/trevor_26.sgf 33
+trymove black C1
+trymove white C2
+trymove black F1
+262 defend C2
+#? [0]
+popgo
+popgo
+popgo
+
+
+
+# Ack, protect the cut!
+loadsgf games/trevor/trevor_27.sgf 35
+270 reg_genmove black
+#? [E6|D6]
+
+
+# D5 misses a big problem cut.
+loadsgf games/trevor/trevor_28.sgf 27
+280 reg_genmove black
+#? [D4]
+
+# F6 is much better and safer to boot than H6.
+# culprit seems to be pattern LE4 (matches H6) - min. value 12.
+# Perhaps need to replace H6 w/ F6?
+loadsgf games/trevor/trevor_28.sgf 36
+281 reg_genmove white
+#? [F6]
+
+
+
+# Yikes, short of liberties!
+loadsgf games/trevor/trevor_29.sgf 54
+290 reg_genmove white
+#? [!A9]
+
+
+# Black A7 is a serious threat.  Also, white should at least 
+# try to invade.
+loadsgf games/trevor/trevor_30.sgf
+300 reg_genmove white
+#? [!PASS]
+
+# Black A7 is a serious threat.  Also, white should at least 
+# try to invade.
+loadsgf games/trevor/trevor_30.sgf
+301 reg_genmove black
+#? [!PASS]
+
+#CATEGORY=TACTICAL_READING
+#DESCRIPTION=A7 remains a 7 point threat.
+#SEVERITY=6
+loadsgf games/trevor/trevor_30.sgf
+black G3
+302 reg_genmove white
+#? [!PASS]*
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=Black still dead after D1!
+#SEVERITY=10
+loadsgf games/trevor/trevor_31.sgf
+310 reg_genmove black
+#? [A8]
+
+
+loadsgf games/trevor/trevor_32.sgf
+320 reg_genmove black
+#? [J2|H3]
+
+#duplicate of trevor:340
+##loadsgf games/trevor/trevor_33.sgf
+##330 owl_defend L9
+###? [1 P9]*
+
+#CATEGORY=owl_tuning
+#DESCRIPTION=Very simple to threaten eye or run out here.
+#SEVERITY=10
+#SEE_ALSO=owl.tst@226
+loadsgf games/trevor/trevor_34.sgf
+340 owl_defend J10
+#? [1 P9]
+
+#CATEGORY=owl_tuning
+#DESCRIPTION=Very simple Ko missed here.
+#SEVERITY=10
+#SEE_ALSO=owl.tst#226
+loadsgf games/trevor/trevor_35.sgf
+350 owl_defend J10
+#? [(2|3) L8]
+
+#CATEGORY=
+#DESCRIPTION=
+#SEVERITY=
+loadsgf games/trevor/trevor_36.sgf
+360 owl_defend G8
+#? [(2|3) J9]*
+
+#CATEGORY=OWL_BUG
+#DESCRIPTION=Can safely connect out!
+#SEVERITY=10
+loadsgf games/trevor/trevor_37.sgf
+370 owl_defend C9
+#? [1 F8]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=E3 is certainly better locally
+#SEVERITY=2
+loadsgf games/trevor/trevor_38.sgf 22
+380 reg_genmove white
+#? [!E4]
+
+#CATEGORY=READING
+#DESCRIPTION=C6 is wrong way to protect the cut.  Loses one point.
+#SEVERITY=3
+# Added E8. /gf
+loadsgf games/trevor/trevor_38.sgf 39
+381 reg_genmove black
+#? [D7|C7|E8]
+
+#CATEGORY=KO_THREATS
+#DESCRIPTION=E9 is terrible for leaving Ko threats.
+#SEVERITY=1
+loadsgf games/trevor/trevor_38.sgf 41
+382 reg_genmove black
+#? [E8]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=White misses cut.
+#SEVERITY=10
+loadsgf games/trevor/trevor_39.sgf 38
+390 reg_genmove white
+#? [!PASS]
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=F8 is tough to find, but not too tough.
+#SEVERITY=3
+loadsgf games/trevor/trevor_40.sgf 1
+400 reg_genmove black
+#? [F8]
+
+#CATEGORY=
+#DESCRIPTION=White can live!
+#SEVERITY=4
+loadsgf games/trevor/trevor_40a.sgf 2
+401 reg_genmove white
+#? [F8]
+
+#CATEGORY=
+#DESCRIPTION=White can live!
+#SEVERITY=8
+loadsgf games/trevor/trevor_40.sgf 2
+402 reg_genmove white
+#? [!PASS]
+
+
+#CATEGORY=PATTERN_TUNING
+#DESCRIPTION=Black should block, not play B4.
+#SEVERITY=5
+loadsgf games/trevor/trevor_41.sgf 29
+410 reg_genmove black
+#? [D5|E5]*
+
+#CATEGORY=BLUNDER
+#DESCRIPTION=A3 leaves behind a double-atari.
+#SEVERITY=10
+loadsgf games/trevor/trevor_41.sgf 35
+411 reg_genmove black
+#? [!A3]
+
+#CATEGORY=TACTICAL_READING
+#DESCRIPTION=D4 worm is more important to save than B2.
+#SEVERITY=3
+loadsgf games/trevor/trevor_41.sgf 37
+412 reg_genmove black
+#? [C4]
+
+#CATEGORY=KO
+#DESCRIPTION=Terrible confusion on GNU Go's part here.
+#SEVERITY=10
+#Submitted by:softlife@8848.net (Cai Qiang)
+#Cai said: I made a play between GNU Go 3.0.0 and FunGo with 3 
+#  handicaps. Gnugo played quite well. And in the end it almost 
+#  killed a corner of FunGo, but it played a big blunder:-(. 
+#  Attachment is the SGF file.
+# gf Added A18 and A16 as acceptable moves. (3.3.16)
+loadsgf games/trevor/trevor_42.sgf 211
+420 reg_genmove black
+#? [G16|A18|A16]
+
+#CATEGORY=TACTICAL_READING
+#DESCRIPTION=Minus 1 point, attacking very dead stone.
+#SEVERITY=10
+loadsgf games/trevor/trevor_42.sgf 191
+421 reg_genmove black
+#? [!C2]
+
+
+#CATEGORY=owl_tuning
+#DESCRIPTION=Very simple problem.
+#SEVERITY=10
+loadsgf games/trevor/trevor_43.sgf
+430 owl_attack F4
+#? [1 G4]
+
+#CATEGORY=owl_tuning
+#DESCRIPTION=Simple double atari
+#SEVERITY=4
+#Note that owl_attack on E3 works, as these stones are treated
+#as separate dragons.  Strange.  Is this a valid test?
+#So, reg_genmove defends appropriately.
+loadsgf games/trevor/trevor_44.sgf
+440 owl_attack E6
+#? [1 (F4|F5|E4)]
+
+#CATEGORY=owl_tuning
+#DESCRIPTION=Double-threat to eye-space missed.
+#SEVERITY=10
+loadsgf games/trevor/trevor_45.sgf
+450 owl_attack E4
+#? [1 D4]
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=Missing simple cut pattern
+#SEVERITY=10
+#SEE_ALSO=owl:170
+loadsgf games/trevor/trevor_46.sgf
+460 owl_attack B14
+#? [1 E14]
+
+#SEE_ALSO trevor:460
+461 reg_genmove black
+#? [E14]
+
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=Yikes, major Ko misunderstanding.
+#SEVERITY=10
+#SEE_ALSO=owl:181
+loadsgf games/trevor/trevor_47.sgf
+470 owl_attack G9
+#? [(2|3) G6]
+
+#SEE_ALSO=trevor:470
+471 owl_attack A7
+#? [(2|3) A3]
+
+
+#CATEGORY=pattern_tuning
+#DESCRIPTION=Of course, B8 is inferior to C9
+#SEVERITY=3
+#Shouldn't the move valuator include counting of the eye spaces?
+loadsgf games/trevor/trevor_48.sgf
+480 reg_genmove black
+#? [C9]
+
+#CATEGORY=owl_tuning
+#DESCRIPTION=Does OWL really need to get this one right?
+#SEVERITY=3
+#SEE_ALSO=owl:191
+#Is it in OWL's charter to get this problem?  
+#attack gets it just fine, of course.
+481 owl_attack C8
+#? [1 B8]*
+
+
+#CATEGORY=TACTICAL_READING
+#DESCRIPTION=See problem this causes w/ owl in Pattern D805
+#SEVERITY=7
+loadsgf games/trevor/trevor_59.sgf
+590 attack A18
+#? [0]
+
+loadsgf games/trevor/trevor_60.sgf 2
+600 owl_attack E3
+#? [1 E2]*
+
+
+#CATEGORY=OWL
+#DESCRIPTION=OWL code misreads cut.
+#SEVERITY=10
+loadsgf games/trevor/trevor_63.sgf
+630 owl_attack G13
+#? [1 H13]
+
+#CATEGORY=OWL
+#DESCRIPTION=Perhaps a semeai problem???
+#SEVERITY=10
+#SEE_ALSO=niki:9
+loadsgf games/trevor/trevor_64.sgf
+640 owl_defend G11
+#? [1 (..+)]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=KO!
+#SEVERITY=6
+loadsgf games/trevor/trevor_65.sgf
+650 owl_attack G2
+#? [(2|3) E1]
+
+#CATEGORY=OWL_TUNING
+#DESCRIPTION=short of liberties
+#SEVERITY=6
+loadsgf games/trevor/trevor_66.sgf
+660 owl_attack G2
+#? [1 L1]
+
+loadsgf games/trevor/trevor_67.sgf
+670 attack G1
+#? [(2|3) F1]
+
+loadsgf games/trevor/trevor_67.sgf
+671 defend G1
+#? [1 (D1|C3|C1)]
+
+loadsgf games/trevor/trevor_68.sgf
+680 owl_attack H3
+#? [1 H1]
+
+loadsgf games/trevor/trevor_69.sgf
+690 owl_attack H2
+#? [1 G2]
+
+
+#CATEGORY=OWL_OPTICS
+#DESCRIPTION=Black plays on the incorrect marginal eye space.
+#SEVERITY=10
+loadsgf games/trevor/trevor_70.sgf
+700 owl_attack H1
+#? [1 (G5|J5|H5|G2)]
+
+#CATEGORY=OWL_ESCAPE
+#DESCRIPTION=black gets the killing move, creating a missed cutting point.
+#SEVERITY=9
+loadsgf games/trevor/trevor_71.sgf
+710 owl_attack H1
+#? [1 G5]*
+
+
+loadsgf games/trevor/trevor_73.sgf
+730 owl_attack M2
+#? [(2|3) H1]*
+
+
+loadsgf games/trevor/trevor_74.sgf
+740 owl_attack B4
+#? [1 A1]
+
+loadsgf games/trevor/trevor_75.sgf
+750 disconnect O9 O7
+#? [0]
+
+
+#CATEGORY=OWL_EYES
+#DESCRIPTION=Fixed by eye pattern 402
+#SEVERITY=10
+#Simplified from owl:111
+#Note the difficulty here, because the (only) correct vital point
+#is also matched by many patterns.
+loadsgf games/trevor/owl111a.sgf
+1001 owl_defend C6
+#? [1 (B8|K9)]
+
+
+#CATEGORY=OWL
+#DESCRIPTION=Escaping to no where.
+#SEVERITY=7
+#SEE_ALSO=global:16
+loadsgf golois/Goemate990903-6.sgf
+1010 owl_does_defend O13 O11 
+#? [0]
+
+#CATEGORY=OWL
+#DESCRIPTION=Why is this an owl_escape?
+#SEVERITY=8
+loadsgf games/trevor/auto/d32.sgf 240
+1020 owl_does_defend T13 S13
+#? [0]*
+
+
+loadsgf games/trevor/auto/d02.sgf 58
+1030 attack B14
+#? [0]
+
+loadsgf games/trevor/auto/c17.sgf 55
+1040 attack H13
+#? [(2|3) H12]*
+
+# gf B1 is also an effective attack.
+loadsgf games/trevor/auto/c30.sgf 62
+1050 owl_attack C3
+#? [1 (C2|B1)]
+
+
+loadsgf games/mertin13x13/katsunari-gnugo2.W+4.sgf 44
+1060 owl_does_defend J4 E4
+#? [1]
+
+
+loadsgf games/trevor/trevor_20.sgf  14  
+1070 owl_attack G5
+#? [0]
+
+
+loadsgf games/nngs/theDoor-gnugo-3.3.11-200211130142.sgf 72
+1100 reg_genmove black
+#? [D15]*
+
+#Bad pattern Shape55
+#Fixed with revised constraint:
+#   ;weak(a) && oplay_defend(*,B)
+loadsgf games/nngs/theDoor-gnugo-3.3.11-200211130142.sgf 208
+1110 reg_genmove black
+#? [O12]
+
diff --git a/regression/trevora.tst b/regression/trevora.tst
new file mode 100644 (file)
index 0000000..93906f9
--- /dev/null
@@ -0,0 +1,439 @@
+# The games a###.sgf are based on a set of 9x9 games btw:
+#   GNU Go 3.0.0  (black)
+#   GNU Go 3.1.14 (white)
+
+
+# games/trevor/auto/a001.sgf problems:
+
+#must not give up ponuki, no matter what!
+loadsgf games/trevor/auto/a001.sgf 8
+100 reg_genmove white
+#? [D6]
+
+
+
+
+# games/trevor/auto/a003.sgf problems:
+
+# OK, B8 is fine.  Followup is important.  See trevora:121
+#loadsgf games/trevor/auto/a003.sgf 28
+#120 reg_genmove white
+##? [E7|D8|E8]
+
+loadsgf games/trevor/auto/a003.sgf 30
+121 reg_genmove white
+#? [E8]
+
+
+
+# games/trevor/auto/a004.sgf problems:
+
+#Best not to give up this ponuki.
+loadsgf games/trevor/auto/a004.sgf 10
+130 reg_genmove white
+#? [F4]
+
+
+
+
+# games/trevor/auto/a005.sgf problems:
+
+#Must connect.
+loadsgf games/trevor/auto/a005.sgf 12
+140 reg_genmove white
+#? [G4]
+
+
+
+
+# games/trevor/auto/a006.sgf problems:
+
+#Must stay connected.
+loadsgf games/trevor/auto/a006.sgf 12
+150 reg_genmove white
+#? [F6]
+
+
+
+
+# games/trevor/auto/a007.sgf problems:
+
+
+#B9 kills.
+loadsgf games/trevor/auto/a007.sgf 25
+170 reg_genmove black
+#? [B9]
+
+
+
+
+# games/trevor/auto/a008.sgf problems:
+
+# No longer interesting, removed.
+# #Quite passive.
+# loadsgf games/trevor/auto/a008.sgf 10
+# 180 reg_genmove white
+# #? [!F3]
+
+
+
+
+# games/trevor/auto/a009.sgf problems:
+
+
+#Can't give up ponuki.
+loadsgf games/trevor/auto/a009.sgf 8
+200 reg_genmove white
+#? [E5]
+
+
+#Full point before ko!
+loadsgf games/trevor/auto/a009.sgf 66
+210 reg_genmove white
+#? [J8]
+
+
+
+
+# games/trevor/auto/a010.sgf problems:
+
+#B6 is an overplay.  E7 may be best.
+loadsgf games/trevor/auto/a010.sgf 10
+220 restricted_genmove white B6 C3 E7
+#? [C3|E7]
+
+
+
+
+# games/trevor/auto/a011.sgf problems:
+
+#F2 is bad overplay.
+loadsgf games/trevor/auto/a011.sgf 14
+230 reg_genmove white
+#? [G2]
+
+
+
+
+# games/trevor/auto/a013.sgf problems:
+
+#Locally, C3 is much better than B3.
+loadsgf games/trevor/auto/a013.sgf 20
+250 reg_genmove white
+#? [C3]
+
+
+
+
+# games/trevor/auto/a014.sgf problems:
+
+#Punish black's overplay.
+loadsgf games/trevor/auto/a014.sgf 16
+260 reg_genmove white
+#? [B4]*
+
+
+
+
+# games/trevor/auto/a015.sgf problems:
+
+#This double threat is probably bigger.
+#Also, don't hane if you don't plan to defend -there's some big problem 
+#here in the valuations.  The connection should be worth at least as much
+#as the original hane.
+loadsgf games/trevor/auto/a015.sgf 20
+270 reg_genmove white
+#? [C4]
+
+
+
+
+# games/trevor/auto/a016.sgf problems:
+
+# Neither move is good. Removed.
+# #Locally, E5 better than E4.
+# loadsgf games/trevor/auto/a016.sgf 18
+# 280 reg_genmove white
+# #? [!E4]
+
+
+
+
+# games/trevor/auto/a017.sgf problems:
+
+loadsgf games/trevor/auto/a017.sgf 20
+290 reg_genmove white
+#? [!C8]
+
+
+#B8 makes better eye space, at least one point better here, in reverse sente.
+loadsgf games/trevor/auto/a017.sgf 30
+300 reg_genmove white
+#? [B8]
+
+
+#E1 is not big enough sente.  D7 threatens whole white group.
+loadsgf games/trevor/auto/a017.sgf 34
+310 reg_genmove white
+#? [D7]*
+
+
+#Full point here!
+loadsgf games/trevor/auto/a017.sgf 56
+320 reg_genmove white
+#? [F9]
+
+
+
+
+# games/trevor/auto/a018.sgf problems:
+
+#Must defend H4 group.
+loadsgf games/trevor/auto/a018.sgf 14
+330 reg_genmove white
+#? [G5|H5]
+
+
+#In this shape, G5 is best, not J6.
+loadsgf games/trevor/auto/a018.sgf 18
+340 restricted_genmove white G5 J6
+#? [G5]
+
+
+
+
+# games/trevor/auto/a019.sgf problems:
+
+# H3 is no longer valued anywhere close to the top. Removed.
+# #H3 is terrible.
+# loadsgf games/trevor/auto/a019.sgf 6
+# 350 reg_genmove white
+# #? [!H3]
+
+
+
+
+# games/trevor/auto/a021.sgf problems:
+
+#Break through important
+# See also break_in:100.
+loadsgf games/trevor/auto/a021.sgf 16
+370 reg_genmove white
+#? [F6]*
+
+
+
+
+# games/trevor/auto/a022.sgf problems:
+
+loadsgf games/trevor/auto/a022.sgf 42
+380 reg_genmove white
+#? [G8|G7]
+
+
+
+
+# games/trevor/auto/a023.sgf problems:
+
+#A3 just looses points.
+loadsgf games/trevor/auto/a023.sgf 50
+390 reg_genmove white
+#? [A2]
+
+
+
+
+# games/trevor/auto/a024.sgf problems:
+
+#Must defend H5 worm.  G6 prob. best.
+loadsgf games/trevor/auto/a024.sgf 12
+400 reg_genmove white
+#? [G6|H7]
+
+
+
+
+# games/trevor/auto/a025.sgf problems:
+
+#Last chance to invade.
+loadsgf games/trevor/auto/a025.sgf 12
+410 reg_genmove white
+#? [C7|C6|D7]
+
+
+
+
+# games/trevor/auto/a026.sgf problems:
+
+#Once you've haned, you've gotta connect.  (Or you shouldn't have haned.)
+loadsgf games/trevor/auto/a026.sgf 16
+420 reg_genmove white
+#? [J5]
+
+
+
+
+# games/trevor/auto/a027.sgf problems:
+
+loadsgf games/trevor/auto/a027.sgf 40
+430 reg_genmove white
+#? [G4]
+
+
+
+
+
+# games/trevor/auto/a029.sgf problems:
+
+#Must defend G3 group.
+loadsgf games/trevor/auto/a029.sgf 14
+450 reg_genmove white
+#? [G2|G4]
+
+
+
+
+# games/trevor/auto/a030.sgf problems:
+
+#B4, B6 too passive. H8 prob. best.
+loadsgf games/trevor/auto/a030.sgf 22
+460 reg_genmove white
+#? [H8]
+
+
+
+
+# games/trevor/auto/a031.sgf problems:
+
+#For a ko threat, D3 is better.
+loadsgf games/trevor/auto/a031.sgf 28
+470 restricted_genmove white D3 E2
+#? [D3]
+
+
+#Sacrificing these two for the rest seems best.
+# See also reading:181.
+loadsgf games/trevor/auto/a031.sgf 40
+480 reg_genmove white
+#? [E4]
+
+
+
+
+# games/trevor/auto/a033.sgf problems:
+
+#Locally, D2 is best.
+loadsgf games/trevor/auto/a033.sgf 26
+500 reg_genmove white
+#? [D2|D1]
+
+
+
+
+# games/trevor/auto/a034.sgf problems:
+
+# Duplicate of trevora:150. /ab
+##Must connect groups.
+#loadsgf games/trevor/auto/a034.sgf 12
+#510 reg_genmove white
+##? [F4]*
+
+
+
+
+# games/trevor/auto/a035.sgf problems:
+
+#important tesuji
+loadsgf games/trevor/auto/a035.sgf 28
+520 reg_genmove white
+#? [B5]
+
+
+#Have to try.
+loadsgf games/trevor/auto/a035.sgf 42
+530 reg_genmove white
+#? [H4]
+
+#Excellent simple semeai problem.
+loadsgf games/trevor/auto/a035.sgf 42
+531 owl_does_defend H4 E6
+#? [1]*
+
+# A1 is a blunder, made more clear by filling F5.
+loadsgf games/trevor/auto/a035.sgf 50
+play white F5
+540 reg_genmove white
+#? [F2|G2|E3]*
+
+
+loadsgf games/trevor/auto/a035.sgf 51
+550 owl_attack D3
+#? [1 F2]
+
+
+
+
+# games/trevor/auto/a036.sgf problems:
+
+#D4 is huge.  Other moves possible.
+loadsgf games/trevor/auto/a036.sgf 6
+560 restricted_genmove white B4 D4
+#? [D4]
+
+
+#Breaking into black's area is required.
+loadsgf games/trevor/auto/a036.sgf 10
+570 restricted_genmove white B5 D4
+#? [D4]
+
+
+#E6 is bigger, and enough to win.
+loadsgf games/trevor/auto/a036.sgf 26
+580 reg_genmove white
+#? [E6]
+
+
+
+
+# games/trevor/auto/a037.sgf problems:
+
+#B4 almost always better in this shape.
+loadsgf games/trevor/auto/a037.sgf 12
+600 restricted_genmove white A5 B4
+#? [B4]
+
+
+
+
+# games/trevor/auto/a038.sgf problems:
+
+#Enough to win.
+loadsgf games/trevor/auto/a038.sgf 34
+610 reg_genmove white
+#? [D2|F2]
+
+
+
+
+# games/trevor/auto/a039.sgf problems:
+
+#Kill black corner first.
+loadsgf games/trevor/auto/a039.sgf 12
+620 reg_genmove white
+#? [H6]
+
+
+#H7 is just terrible.
+loadsgf games/trevor/auto/a039.sgf 18
+630 reg_genmove white
+#? [H6]
+
+
+
+
+# games/trevor/auto/a041.sgf problems:
+
+#C8 is an overplay.
+loadsgf games/trevor/auto/a041.sgf 12
+660 restricted_genmove white C8 D8
+#? [D8]
diff --git a/regression/trevorb.tst b/regression/trevorb.tst
new file mode 100644 (file)
index 0000000..ed1ce7a
--- /dev/null
@@ -0,0 +1,616 @@
+
+
+# games/trevor/auto/b01.sgf problems:
+
+loadsgf games/trevor/auto/b01.sgf 48
+100 reg_genmove white
+#? [B1]
+
+
+loadsgf games/trevor/auto/b01.sgf 56
+110 reg_genmove white
+#? [K7]
+
+
+
+
+# games/trevor/auto/b02.sgf problems:
+
+loadsgf games/trevor/auto/b02.sgf 42
+120 reg_genmove white
+#? [N2]
+
+
+# Urgent to live but seems impossible to get away without ko.
+loadsgf games/trevor/auto/b02.sgf 46
+130 reg_genmove white
+#? [M1|L1|L2|K2]
+
+
+loadsgf games/trevor/auto/b02.sgf 48
+140 reg_genmove white
+#? [L2|K2]
+
+
+
+
+# games/trevor/auto/b08.sgf problems:
+
+loadsgf games/trevor/auto/b08.sgf 16
+150 reg_genmove white
+#? [!N12]
+
+
+loadsgf games/trevor/auto/b08.sgf 32
+160 owl_attack M9
+#? [1 (N7|N8|N11)]
+
+
+loadsgf games/trevor/auto/b08.sgf 94
+170 reg_genmove white
+#? [N11]
+
+
+
+
+# games/trevor/auto/b09.sgf problems:
+
+loadsgf games/trevor/auto/b09.sgf 10
+180 reg_genmove white
+#? [L12]
+
+
+loadsgf games/trevor/auto/b09.sgf 82
+190 reg_genmove white
+#? [C13]*
+
+
+loadsgf games/trevor/auto/b09.sgf 86
+200 reg_genmove white
+#? [D12]*
+
+
+#CATEGORY=ATARI_ATARI
+loadsgf games/trevor/auto/b09.sgf 92
+210 reg_genmove white
+#? [K7]
+
+
+
+
+# games/trevor/auto/b13.sgf problems:
+
+#J3 locally better than G1
+loadsgf games/trevor/auto/b13.sgf 48
+220 restricted_genmove white J3 G1
+#? [J3]*
+
+
+loadsgf games/trevor/auto/b13.sgf 66
+230 reg_genmove white
+#? [L5]*
+
+
+loadsgf games/trevor/auto/b13.sgf 68
+240 restricted_genmove white K6 L5 L7
+#? [L5|L7]
+
+
+
+
+# games/trevor/auto/b16.sgf problems:
+
+loadsgf games/trevor/auto/b16.sgf 10
+250 reg_genmove white
+#? [C2]
+
+
+loadsgf games/trevor/auto/b16.sgf 74
+260 reg_genmove white
+#? [J4]
+
+
+loadsgf games/trevor/auto/b16.sgf 86
+270 reg_genmove white
+#? [G11]
+
+
+#B4 is a better ko threat than A4
+loadsgf games/trevor/auto/b16.sgf 96
+280 restricted_genmove white A4 B4 A3
+#? [B4]*
+
+
+
+
+# games/trevor/auto/b17.sgf problems:
+
+#Must try to fight the ko.
+#for example, C3, E10, E9
+loadsgf games/trevor/auto/b17.sgf 54
+290 restricted_genmove white E9 E10 E13
+#? [E9|E10]
+
+
+
+
+# games/trevor/auto/b20.sgf problems:
+
+loadsgf games/trevor/auto/b20.sgf 38
+300 reg_genmove white
+#? [F2]
+
+
+
+
+# games/trevor/auto/b23.sgf problems:
+
+loadsgf games/trevor/auto/b23.sgf 60
+310 restricted_genmove white D7 E6
+#? [E6]
+
+
+
+
+# games/trevor/auto/b24.sgf problems:
+
+loadsgf games/trevor/auto/b24.sgf 78
+320 restricted_genmove white B7 C8
+#? [C8]
+
+
+loadsgf games/trevor/auto/b24.sgf 91
+330 owl_defend J3
+#? [0]
+
+
+
+
+# games/trevor/auto/b25.sgf problems:
+
+loadsgf games/trevor/auto/b25.sgf 10
+340 reg_genmove white
+#? [M11]
+
+
+# # Retired. (Such blatant moves inside own territory do no longer occur.)
+# loadsgf games/trevor/auto/b25.sgf 70
+# 350 reg_genmove white
+# #? [!D8]
+
+
+loadsgf games/trevor/auto/b25.sgf 74
+360 reg_genmove white
+#? [K3]
+
+
+
+
+# games/trevor/auto/b27.sgf problems:
+
+#L7 locally better than N6
+#Other moves possible.
+loadsgf games/trevor/auto/b27.sgf 24
+370 restricted_genmove white N6 L7
+#? [L7]
+
+
+loadsgf games/trevor/auto/b27.sgf 72
+380 reg_genmove white
+#? [K4]
+
+
+loadsgf games/trevor/auto/b27.sgf 92
+390 reg_genmove white
+#? [G6]
+
+
+
+
+# games/trevor/auto/b28.sgf problems:
+
+loadsgf games/trevor/auto/b28.sgf 28
+400 reg_genmove white
+#? [D13]
+
+
+loadsgf games/trevor/auto/b28.sgf 44
+410 restricted_genmove white H12 J12
+#? [J12]*
+
+
+loadsgf games/trevor/auto/b28.sgf 64
+420 reg_genmove white
+#? [E2]
+
+# See also reading:169.
+loadsgf games/trevor/auto/b28.sgf 80
+430 reg_genmove black
+#? [F13]
+
+
+
+
+# games/trevor/auto/b29.sgf problems:
+
+loadsgf games/trevor/auto/b29.sgf 52
+440 reg_genmove white
+#? [E6]
+
+
+
+
+# games/trevor/auto/b30.sgf problems:
+
+loadsgf games/trevor/auto/b30.sgf 14
+450 reg_genmove white
+#? [!L6]
+
+
+loadsgf games/trevor/auto/b30.sgf 66
+460 reg_genmove white
+#? [K5]*
+
+
+loadsgf games/trevor/auto/b30.sgf 68
+470 reg_genmove white
+#? [L4|L5]
+
+
+loadsgf games/trevor/auto/b30.sgf 80
+480 reg_genmove white
+#? [M2]
+
+
+
+
+# games/trevor/auto/b32.sgf problems:
+
+loadsgf games/trevor/auto/b32.sgf 44
+490 restricted_genmove white D10 E10 F12 G12 F13
+#? [F12|F13]
+
+
+
+
+# games/trevor/auto/b33.sgf problems:
+
+# # Retired. (There are several similar problems.)
+# loadsgf games/trevor/auto/b33.sgf 32
+# 500 reg_genmove white
+# #? [!J11]
+
+
+
+
+# games/trevor/auto/b37.sgf problems:
+
+loadsgf games/trevor/auto/b37.sgf 26
+510 reg_genmove white
+#? [C6|B6]
+
+
+loadsgf games/trevor/auto/b37.sgf 30
+520 reg_genmove white
+#? [!A6]
+
+
+loadsgf games/trevor/auto/b37.sgf 38
+530 reg_genmove white
+#? [H5]
+
+
+
+
+# games/trevor/auto/b39.sgf problems:
+
+loadsgf games/trevor/auto/b39.sgf 20
+540 reg_genmove white
+#? [!J11]
+
+
+
+
+# games/trevor/auto/b40.sgf problems:
+
+loadsgf games/trevor/auto/b40.sgf 30
+550 restricted_genmove white D6 E6
+#? [E6]
+
+
+
+
+# games/trevor/auto/b42.sgf problems:
+
+#Main point is, !J8
+loadsgf games/trevor/auto/b42.sgf 42
+560 reg_genmove white
+#? [G7|F7|G2]
+
+
+
+
+# games/trevor/auto/b47.sgf problems:
+
+loadsgf games/trevor/auto/b47.sgf 92
+570 reg_genmove white
+#? [N9]
+
+
+
+
+# games/trevor/auto/b52.sgf problems:
+
+loadsgf games/trevor/auto/b52.sgf 14
+580 reg_genmove white
+#? [L12|J12]*
+
+
+loadsgf games/trevor/auto/b52.sgf 18
+590 reg_genmove white
+#? [H12|M9]*
+
+
+loadsgf games/trevor/auto/b52.sgf 42
+600 reg_genmove white
+#? [F2|F3]*
+
+
+loadsgf games/trevor/auto/b52.sgf 60
+610 reg_genmove white
+#? [D7]
+
+
+
+
+# games/trevor/auto/b56.sgf problems:
+
+loadsgf games/trevor/auto/b56.sgf 78
+620 reg_genmove white
+#? [K9]
+
+
+
+
+# games/trevor/auto/b58.sgf problems:
+
+# C5 is pointless, D12 meaningful (not important whether other moves
+# are bigger).
+loadsgf games/trevor/auto/b58.sgf 16
+630 restricted_genmove white C5 D12
+#? [D12]
+
+
+
+
+# games/trevor/auto/b60.sgf problems:
+
+loadsgf games/trevor/auto/b60.sgf 46
+640 reg_genmove white
+#? [!G5]
+
+
+loadsgf games/trevor/auto/b60.sgf 66
+650 reg_genmove white
+#? [J7]
+
+
+
+
+# games/trevor/auto/b62.sgf problems:
+
+loadsgf games/trevor/auto/b62.sgf 18
+660 reg_genmove white
+#? [D3]
+
+
+
+
+# games/trevor/auto/b64.sgf problems:
+
+#L5 locally better than N6
+# See also connection:88
+loadsgf games/trevor/auto/b64.sgf 44
+670 reg_genmove white
+#? [L5]
+
+
+
+
+# games/trevor/auto/b67.sgf problems:
+
+loadsgf games/trevor/auto/b67.sgf 54
+680 reg_genmove white
+#? [M5]
+
+
+loadsgf games/trevor/auto/b67.sgf 58
+690 reg_genmove white
+#? [M2|M3]
+
+
+loadsgf games/trevor/auto/b67.sgf 78
+700 reg_genmove white
+#? [C5|D3]
+
+
+
+
+# games/trevor/auto/b69.sgf problems:
+
+loadsgf games/trevor/auto/b69.sgf 110
+710 reg_genmove white
+#? [C6|L9]
+
+
+loadsgf games/trevor/auto/b69.sgf 112
+720 reg_genmove white
+#? [C6]
+
+
+
+
+# games/trevor/auto/b72.sgf problems:
+
+loadsgf games/trevor/auto/b72.sgf 30
+730 restricted_genmove white E12 F11
+#? [F11]
+
+
+loadsgf games/trevor/auto/b72.sgf 32
+740 reg_genmove white
+#? [!H10]
+
+
+loadsgf games/trevor/auto/b72.sgf 38
+750 restricted_genmove white D13 E10
+#? [D13]
+
+
+loadsgf games/trevor/auto/b72.sgf 40
+760 reg_genmove white
+#? [E11]
+
+
+loadsgf games/trevor/auto/b72.sgf 42
+770 reg_genmove white
+#? [E11]
+
+
+loadsgf games/trevor/auto/b72.sgf 52
+780 reg_genmove white
+#? [J9]
+
+
+loadsgf games/trevor/auto/b72.sgf 64
+790 restricted_genmove white K5 K6 H6
+#? [K6|K5]
+
+
+#Actually, L4 is probably best, though J4 leads to
+#  some complicated variations.  Either is fine for
+#  GNU Go.
+##loadsgf games/trevor/auto/b72.sgf 70
+##800 reg_genmove white
+###? [J4]*
+
+
+
+
+# games/trevor/auto/b73.sgf problems:
+
+# At least W can win this ko fight!
+loadsgf games/trevor/auto/b73.sgf 116
+810 reg_genmove white
+#? [L5]*
+
+
+
+
+# games/trevor/auto/b75.sgf problems:
+
+loadsgf games/trevor/auto/b75.sgf 14
+820 reg_genmove white
+#? [!F4]
+
+
+loadsgf games/trevor/auto/b75.sgf 30
+830 reg_genmove white
+#? [!H11]
+
+
+# See also reading:163
+loadsgf games/trevor/auto/b75.sgf 62
+840 reg_genmove white
+#? [D11]
+
+
+
+
+# games/trevor/auto/b76.sgf problems:
+
+loadsgf games/trevor/auto/b76.sgf 50
+850 restricted_genmove white B3 L10
+#? [L10]
+
+
+loadsgf games/trevor/auto/b76.sgf 58
+860 restricted_genmove white C2 D3
+#? [C2]
+
+
+loadsgf games/trevor/auto/b76.sgf 78
+870 reg_genmove white
+#? [K6]
+
+
+
+
+# games/trevor/auto/b80.sgf problems:
+
+loadsgf games/trevor/auto/b80.sgf 80
+880 reg_genmove white
+#? [A8]
+
+
+
+
+# games/trevor/auto/b83.sgf problems:
+
+loadsgf games/trevor/auto/b83.sgf 20
+890 reg_genmove white
+#? [!C12]
+
+
+loadsgf games/trevor/auto/b83.sgf 50
+900 reg_genmove white
+#? [F11]
+
+
+loadsgf games/trevor/auto/b83.sgf 64
+910 reg_genmove white
+#? [H11]
+
+# # Retired.
+# loadsgf games/trevor/auto/b83.sgf 92
+# 920 reg_genmove white
+# #? [!B11]
+
+# # Retired.
+# loadsgf games/trevor/auto/b83.sgf 94
+# 930 reg_genmove white
+# #? [!A12]
+
+
+
+
+# games/trevor/auto/b86.sgf problems:
+
+loadsgf games/trevor/auto/b86.sgf 70
+940 restricted_genmove white L10 M11
+#? [L10]
+
+
+loadsgf games/trevor/auto/b86.sgf 74
+950 reg_genmove white
+#? [M6]*
+
+
+
+
+# games/trevor/auto/b88.sgf problems:
+
+loadsgf games/trevor/auto/b88.sgf 26
+960 restricted_genmove white C3 D5
+#? [C3]
+
+
+
+
+# games/trevor/auto/b99.sgf problems:
+
+loadsgf games/trevor/auto/b99.sgf 74
+970 reg_genmove white
+#? [B7]
+
+
diff --git a/regression/trevorc.tst b/regression/trevorc.tst
new file mode 100644 (file)
index 0000000..418c625
--- /dev/null
@@ -0,0 +1,1023 @@
+
+
+# games/trevor/auto/c01.sgf problems:
+
+loadsgf games/trevor/auto/c01.sgf 42
+100 reg_genmove white
+#? [K7|J7|H8]
+
+
+loadsgf games/trevor/auto/c01.sgf 44
+110 restricted_genmove white B7 A10
+#? [A10]
+
+
+
+
+
+# games/trevor/auto/c08.sgf problems:
+
+loadsgf games/trevor/auto/c08.sgf 58
+130 reg_genmove white
+#? [H9]
+
+
+loadsgf games/trevor/auto/c08.sgf 60
+140 reg_genmove white
+#? [PASS]
+
+
+
+
+# games/trevor/auto/c09.sgf problems:
+
+loadsgf games/trevor/auto/c09.sgf 58
+150 reg_genmove white
+#? [F3]*
+
+
+loadsgf games/trevor/auto/c09.sgf 64
+160 reg_genmove white
+#? [K7]
+
+
+loadsgf games/trevor/auto/c09.sgf 82
+170 reg_genmove white
+#? [H5]
+
+
+loadsgf games/trevor/auto/c09.sgf 100
+180 reg_genmove white
+#? [K1]
+
+
+
+
+# games/trevor/auto/c11.sgf problems:
+
+#locally A6 is better than A5
+loadsgf games/trevor/auto/c11.sgf 36
+190 restricted_genmove white A5 A6
+#? [A6]
+
+
+loadsgf games/trevor/auto/c11.sgf 72
+200 reg_genmove white
+#? [A7]
+
+
+
+
+# games/trevor/auto/c12.sgf problems:
+
+loadsgf games/trevor/auto/c12.sgf 86
+210 reg_genmove white
+#? [!G3]
+
+
+
+
+# games/trevor/auto/c13.sgf problems:
+
+loadsgf games/trevor/auto/c13.sgf 32
+220 reg_genmove white
+#? [F10]*
+
+
+
+
+# games/trevor/auto/c14.sgf problems:
+
+loadsgf games/trevor/auto/c14.sgf 18
+230 reg_genmove white
+#? [K3|K2|J2|L4|M4|M5]
+
+
+loadsgf games/trevor/auto/c14.sgf 20
+240 reg_genmove white
+#? [K2]
+
+
+loadsgf games/trevor/auto/c14.sgf 22
+250 reg_genmove white
+#? [K2]*
+
+
+loadsgf games/trevor/auto/c14.sgf 28
+260 reg_genmove white
+#? [K1]*
+
+
+loadsgf games/trevor/auto/c14.sgf 34
+270 reg_genmove white
+#? [K1]
+
+
+loadsgf games/trevor/auto/c14.sgf 70
+280 restricted_genmove white N13 N10
+#? [N10]*
+
+
+
+
+# games/trevor/auto/c17.sgf problems:
+
+loadsgf games/trevor/auto/c17.sgf 42
+290 reg_genmove white
+#? [!H5]
+
+
+loadsgf games/trevor/auto/c17.sgf 50
+300 reg_genmove white
+#? [J2|J3|K2|J13|K13]
+
+
+loadsgf games/trevor/auto/c17.sgf 54
+310 reg_genmove white
+#? [H12]
+
+
+loadsgf games/trevor/auto/c17.sgf 108
+320 reg_genmove white
+#? [B2]*
+
+
+
+
+# games/trevor/auto/c18.sgf problems:
+
+loadsgf games/trevor/auto/c18.sgf 18
+330 reg_genmove white
+#? [!H10]
+
+
+loadsgf games/trevor/auto/c18.sgf 30
+340 reg_genmove white
+#? [M3|M4]
+
+
+loadsgf games/trevor/auto/c18.sgf 48
+350 reg_genmove white
+#? [E3]
+
+
+loadsgf games/trevor/auto/c18.sgf 68
+360 reg_genmove white
+#? [H11]
+
+
+loadsgf games/trevor/auto/c18.sgf 74
+370 reg_genmove white
+#? [F13|D1]
+
+
+loadsgf games/trevor/auto/c18.sgf 82
+380 reg_genmove white
+#? [F13]
+
+
+loadsgf games/trevor/auto/c18.sgf 102
+390 reg_genmove white
+#? [F7|F2]*
+
+
+
+
+# games/trevor/auto/c20.sgf problems:
+
+loadsgf games/trevor/auto/c20.sgf 30
+400 restricted_genmove white H11 J11
+#? [H11]
+
+
+loadsgf games/trevor/auto/c20.sgf 36
+410 restricted_genmove white H13 G12 G13 F12 F13
+#? [G12]*
+
+
+loadsgf games/trevor/auto/c20.sgf 58
+420 reg_genmove white
+#? [F10]
+
+
+loadsgf games/trevor/auto/c20.sgf 66
+430 reg_genmove white
+#? [H4]*
+
+
+
+
+# games/trevor/auto/c23.sgf problems:
+
+loadsgf games/trevor/auto/c23.sgf 60
+440 reg_genmove white
+#? [N5]
+
+
+# See also connection:126.
+loadsgf games/trevor/auto/c23.sgf 72
+450 reg_genmove white
+#? [K5]
+
+
+loadsgf games/trevor/auto/c23.sgf 92
+460 reg_genmove white
+#? [H8|K11]
+
+
+loadsgf games/trevor/auto/c23.sgf 96
+470 reg_genmove white
+#? [K11]
+
+
+
+
+# games/trevor/auto/c24.sgf problems:
+
+loadsgf games/trevor/auto/c24.sgf 24
+480 restricted_genmove white L11 H12
+#? [H12]
+
+
+loadsgf games/trevor/auto/c24.sgf 34
+490 reg_genmove white
+#? [!J10]
+
+
+# J2 looks bigger to me. /gf
+loadsgf games/trevor/auto/c24.sgf 62
+500 reg_genmove white
+#? [J2]*
+
+
+
+
+# games/trevor/auto/c25.sgf problems:
+
+loadsgf games/trevor/auto/c25.sgf 36
+510 reg_genmove white
+#? [!G1]
+
+
+
+
+# games/trevor/auto/c28.sgf problems:
+
+loadsgf games/trevor/auto/c28.sgf 10
+520 reg_genmove white
+#? [!C5]
+
+
+#Other move may be possible.
+loadsgf games/trevor/auto/c28.sgf 22
+530 reg_genmove white
+#? [J3]*
+
+
+loadsgf games/trevor/auto/c28.sgf 36
+540 reg_genmove white
+#? [!L9]
+
+
+
+
+# games/trevor/auto/c30.sgf problems:
+
+loadsgf games/trevor/auto/c30.sgf 62
+550 reg_genmove white
+#? [C2|E3]
+
+
+loadsgf games/trevor/auto/c30.sgf 80
+560 reg_genmove white
+#? [K2|M1]*
+
+
+loadsgf games/trevor/auto/c30.sgf 92
+570 restricted_genmove white N9 M10
+#? [M10]
+
+
+loadsgf games/trevor/auto/c30.sgf 98
+580 reg_genmove white
+#? [J5]
+
+
+
+
+# games/trevor/auto/c35.sgf problems:
+
+loadsgf games/trevor/auto/c35.sgf 26
+590 reg_genmove white
+#? [!G9]
+
+
+loadsgf games/trevor/auto/c35.sgf 32
+600 reg_genmove white
+#? [!E8]
+
+
+loadsgf games/trevor/auto/c35.sgf 62
+610 reg_genmove white
+#? [!N3]
+
+
+loadsgf games/trevor/auto/c35.sgf 88
+620 reg_genmove white
+#? [E1|F1]*
+
+
+loadsgf games/trevor/auto/c35.sgf 92
+630 reg_genmove white
+#? [G2|H2]
+
+
+loadsgf games/trevor/auto/c35.sgf 114
+640 reg_genmove white
+#? [G10]
+
+
+
+
+# games/trevor/auto/c36.sgf problems:
+
+loadsgf games/trevor/auto/c36.sgf 62
+650 reg_genmove white
+#? [K7]
+
+
+
+
+# games/trevor/auto/c38.sgf problems:
+
+loadsgf games/trevor/auto/c38.sgf 32
+660 restricted_genmove white N5 M4
+#? [M4]
+
+
+loadsgf games/trevor/auto/c38.sgf 44
+670 restricted_genmove white G1 G2
+#? [G1]
+
+
+# G13 and G10 are the only ko threats. Since the ko cannot be won passing is
+# also acceptable.
+loadsgf games/trevor/auto/c38.sgf 112
+680 reg_genmove white
+#? [G13|G10|PASS]
+
+
+
+
+# games/trevor/auto/c39.sgf problems:
+
+loadsgf games/trevor/auto/c39.sgf 58
+690 reg_genmove white
+#? [G8]
+
+
+loadsgf games/trevor/auto/c39.sgf 76
+700 reg_genmove white
+#? [F8]
+
+
+loadsgf games/trevor/auto/c39.sgf 106
+710 reg_genmove white
+#? [D5]
+
+
+
+
+# games/trevor/auto/c41.sgf problems:
+
+loadsgf games/trevor/auto/c41.sgf 42
+720 reg_genmove white
+#? [G5]*
+
+
+
+
+# games/trevor/auto/c42.sgf problems:
+
+loadsgf games/trevor/auto/c42.sgf 72
+730 reg_genmove white
+#? [E5]
+
+
+
+
+# games/trevor/auto/c43.sgf problems:
+
+loadsgf games/trevor/auto/c43.sgf 22
+740 reg_genmove white
+#? [!J3]
+
+
+# # This is a duplicate of 410.
+# loadsgf games/trevor/auto/c43.sgf 30
+# 750 reg_genmove white
+# #? [!H1]
+
+# # This is a near duplicate of 480.
+# loadsgf games/trevor/auto/c43.sgf 50
+# 760 reg_genmove white
+# #? [!L11]
+
+
+loadsgf games/trevor/auto/c43.sgf 56
+770 restricted_genmove white B6 A7
+#? [B6]
+
+
+
+
+# games/trevor/auto/c45.sgf problems:
+
+loadsgf games/trevor/auto/c45.sgf 14
+780 reg_genmove white
+#? [J12]*
+
+
+loadsgf games/trevor/auto/c45.sgf 58
+790 reg_genmove white
+#? [L8]
+
+
+loadsgf games/trevor/auto/c45.sgf 78
+800 reg_genmove white
+#? [F9]
+
+
+loadsgf games/trevor/auto/c45.sgf 88
+810 reg_genmove white
+#? [D7]
+
+
+
+
+# games/trevor/auto/c47.sgf problems:
+
+loadsgf games/trevor/auto/c47.sgf 58
+820 reg_genmove white
+#? [A6]*
+
+
+
+
+# games/trevor/auto/c51.sgf problems:
+
+loadsgf games/trevor/auto/c51.sgf 50
+830 reg_genmove white
+#? [!L5]
+
+
+loadsgf games/trevor/auto/c51.sgf 58
+840 reg_genmove white
+#? [E13|E12|F12]
+
+
+loadsgf games/trevor/auto/c51.sgf 62
+850 reg_genmove white
+#? [C12]*
+
+
+#CATEGORY=CONNECTION
+#DESCRIPTION=
+#SEVERITY=
+loadsgf games/trevor/auto/c51.sgf 74
+860 reg_genmove white
+#? [E3]
+
+
+loadsgf games/trevor/auto/c51.sgf 76
+870 reg_genmove white
+#? [E4|F5]
+
+# See also reading:202.
+loadsgf games/trevor/auto/c51.sgf 82
+880 reg_genmove white
+#? [J10]
+
+# See also reading:202.
+loadsgf games/trevor/auto/c51.sgf 84
+890 reg_genmove white
+#? [J10]
+
+
+
+
+# games/trevor/auto/c54.sgf problems:
+
+loadsgf games/trevor/auto/c54.sgf 28
+900 reg_genmove white
+#? [B12]*
+
+
+loadsgf games/trevor/auto/c54.sgf 56
+910 reg_genmove white
+#? [H13]
+
+
+loadsgf games/trevor/auto/c54.sgf 64
+920 reg_genmove white
+#? [F13]*
+
+
+loadsgf games/trevor/auto/c54.sgf 78
+930 reg_genmove white
+#? [K10]
+
+
+
+
+# games/trevor/auto/c55.sgf problems:
+
+loadsgf games/trevor/auto/c55.sgf 58
+940 reg_genmove white
+#? [G1]*
+
+
+loadsgf games/trevor/auto/c55.sgf 92
+950 reg_genmove white
+#? [F13]
+
+
+
+
+# games/trevor/auto/c59.sgf problems:
+
+loadsgf games/trevor/auto/c59.sgf 52
+960 reg_genmove white
+#? [!H6]
+
+
+loadsgf games/trevor/auto/c59.sgf 82
+970 reg_genmove white
+#? [J4]
+
+
+
+
+# games/trevor/auto/c60.sgf problems:
+
+loadsgf games/trevor/auto/c60.sgf 32
+980 reg_genmove white
+#? [!G7]
+
+
+loadsgf games/trevor/auto/c60.sgf 46
+990 restricted_genmove white B8 A8
+#? [A8]
+
+
+loadsgf games/trevor/auto/c60.sgf 64
+1000 reg_genmove white
+#? [N9|M11]
+
+
+
+
+# games/trevor/auto/c61.sgf problems:
+
+loadsgf games/trevor/auto/c61.sgf 24
+1010 reg_genmove white
+#? [G2|G3]*
+
+
+loadsgf games/trevor/auto/c61.sgf 26
+1020 reg_genmove white
+#? [G2|G3]
+
+
+loadsgf games/trevor/auto/c61.sgf 28
+1030 reg_genmove white
+#? [G3]
+
+
+loadsgf games/trevor/auto/c61.sgf 42
+1040 restricted_genmove white A8 C8
+#? [C8]*
+
+
+loadsgf games/trevor/auto/c61.sgf 88
+1050 reg_genmove white
+#? [K11|J10]*
+
+
+loadsgf games/trevor/auto/c61.sgf 92
+1060 reg_genmove white
+#? [K11]*
+
+
+
+
+# games/trevor/auto/c62.sgf problems:
+
+loadsgf games/trevor/auto/c62.sgf 14
+1070 reg_genmove white
+#? [M11]*
+
+
+loadsgf games/trevor/auto/c62.sgf 20
+1080 reg_genmove white
+#? [!L8|K10|K9]
+
+
+loadsgf games/trevor/auto/c62.sgf 48
+1090 reg_genmove white
+#? [!E1]
+
+
+loadsgf games/trevor/auto/c62.sgf 106
+1100 reg_genmove white
+#? [F11]
+
+
+loadsgf games/trevor/auto/c62.sgf 110
+1110 restricted_genmove white G7 G6 F7 E6
+#? [G6]
+
+
+loadsgf games/trevor/auto/c62.sgf 118
+1120 reg_genmove white
+#? [A3]
+
+loadsgf games/trevor/auto/c62.sgf 118
+1121 reg_genmove black
+#? [A3]
+
+
+loadsgf games/trevor/auto/c62.sgf 120
+1130 reg_genmove white
+#? [A3]
+
+
+loadsgf games/trevor/auto/c62.sgf 130
+1140 reg_genmove white
+#? [PASS]
+
+
+
+
+# games/trevor/auto/c63.sgf problems:
+
+loadsgf games/trevor/auto/c63.sgf 34
+1150 reg_genmove white
+#? [!C9]
+
+
+loadsgf games/trevor/auto/c63.sgf 36
+1160 reg_genmove white
+#? [!H10]
+
+
+loadsgf games/trevor/auto/c63.sgf 42
+1170 reg_genmove white
+#? [!M11]
+
+
+
+
+# games/trevor/auto/c67.sgf problems:
+
+loadsgf games/trevor/auto/c67.sgf 6
+1180 reg_genmove white
+#? [L10]
+
+
+loadsgf games/trevor/auto/c67.sgf 34
+1190 reg_genmove white
+#? [K2]*
+
+
+loadsgf games/trevor/auto/c67.sgf 42
+1200 reg_genmove white
+#? [!G6]
+
+
+
+
+# games/trevor/auto/c68.sgf problems:
+
+loadsgf games/trevor/auto/c68.sgf 44
+1210 reg_genmove white
+#? [E5]
+
+
+
+
+# games/trevor/auto/c69.sgf problems:
+
+loadsgf games/trevor/auto/c69.sgf 14
+1220 restricted_genmove white M9 M7
+#? [M7]
+
+
+
+
+# # games/trevor/auto/c70.sgf problems:
+# 
+# #DESCRIPTION=D2 was the move played - find the pattern & kill it.
+# # The pattern was Fuseki216 in fuseki13.db. /gf
+# loadsgf games/trevor/auto/c70.sgf 2
+# 1230 reg_genmove white
+# #? [FAILED]*
+
+
+
+loadsgf games/trevor/auto/c70.sgf 4
+1240 reg_genmove white
+#? [!E2]
+
+
+loadsgf games/trevor/auto/c70.sgf 16
+1250 reg_genmove white
+#? [!C2]
+
+
+# # Duplicate of 660.
+# loadsgf games/trevor/auto/c70.sgf 38
+# 1260 reg_genmove white
+# #? [!A6]
+
+
+loadsgf games/trevor/auto/c70.sgf 48
+1270 reg_genmove white
+#? [G13|A7]
+
+
+loadsgf games/trevor/auto/c70.sgf 58
+1280 reg_genmove white
+#? [G13|A7]
+
+
+
+
+# games/trevor/auto/c72.sgf problems:
+
+loadsgf games/trevor/auto/c72.sgf 18
+1290 reg_genmove white
+#? [!H3]
+
+
+loadsgf games/trevor/auto/c72.sgf 24
+1300 restricted_genmove white L5 M3
+#? [M3]
+
+
+loadsgf games/trevor/auto/c72.sgf 28
+1310 restricted_genmove white M3 N4 N3 M2
+#? [M3]
+
+
+loadsgf games/trevor/auto/c72.sgf 64
+1320 reg_genmove white
+#? [K6|E13]
+
+
+
+
+# games/trevor/auto/c73.sgf problems:
+
+# virtual duplicate of 1340 
+#loadsgf games/trevor/auto/c73.sgf 32
+#1330 reg_genmove white
+##? [C7]*
+
+
+loadsgf games/trevor/auto/c73.sgf 34
+1340 reg_genmove white
+#? [C7]*
+
+
+
+
+# games/trevor/auto/c76.sgf problems:
+
+loadsgf games/trevor/auto/c76.sgf 60
+1350 reg_genmove white
+#? [K6]
+
+
+loadsgf games/trevor/auto/c76.sgf 68
+1360 reg_genmove white
+#? [F12]
+
+
+
+
+# games/trevor/auto/c77.sgf problems:
+
+loadsgf games/trevor/auto/c77.sgf 36
+1370 reg_genmove white
+#? [B9]*
+
+
+
+
+# games/trevor/auto/c78.sgf problems:
+
+loadsgf games/trevor/auto/c78.sgf 26
+1380 reg_genmove white
+#? [!H3]
+
+
+loadsgf games/trevor/auto/c78.sgf 82
+1390 reg_genmove white
+#? [K9]
+
+
+loadsgf games/trevor/auto/c78.sgf 94
+1400 reg_genmove white
+#? [K10]
+
+
+loadsgf games/trevor/auto/c78.sgf 100
+1410 reg_genmove white
+#? [J4]*
+
+
+loadsgf games/trevor/auto/c78.sgf 102
+1420 reg_genmove white
+#? [J4]*
+
+
+
+
+# games/trevor/auto/c81.sgf problems:
+
+#Best to slide around G12 first.
+loadsgf games/trevor/auto/c81.sgf 32
+1430 reg_genmove white
+#? [!G1]
+
+
+loadsgf games/trevor/auto/c81.sgf 34
+1440 reg_genmove white
+#? [E12|F11]*
+
+
+
+
+# games/trevor/auto/c82.sgf problems:
+
+loadsgf games/trevor/auto/c82.sgf 58
+1450 reg_genmove white
+#? [!G3]
+
+
+loadsgf games/trevor/auto/c82.sgf 78
+1460 reg_genmove white
+#? [PASS]
+
+
+
+
+# games/trevor/auto/c83.sgf problems:
+
+loadsgf games/trevor/auto/c83.sgf 16
+1470 reg_genmove white
+#? [L10]
+
+
+loadsgf games/trevor/auto/c83.sgf 74
+1480 reg_genmove white
+#? [A8]*
+
+
+loadsgf games/trevor/auto/c83.sgf 76
+1490 reg_genmove white
+#? [J10]
+
+
+loadsgf games/trevor/auto/c83.sgf 80
+1500 reg_genmove white
+#? [N13]*
+
+
+loadsgf games/trevor/auto/c83.sgf 112
+1510 reg_genmove white
+#? [L5]
+
+
+#At least win this ko!
+loadsgf games/trevor/auto/c83.sgf 134
+1520 reg_genmove white
+#? [C11]
+
+
+
+
+# games/trevor/auto/c84.sgf problems:
+
+loadsgf games/trevor/auto/c84.sgf 50
+1530 reg_genmove white
+#? [A9]
+
+
+loadsgf games/trevor/auto/c84.sgf 62
+1540 reg_genmove white
+#? [M10]
+
+
+loadsgf games/trevor/auto/c84.sgf 66
+1550 reg_genmove white
+#? [L11]
+
+
+loadsgf games/trevor/auto/c84.sgf 94
+1560 reg_genmove white
+#? [H7|J6|J5]
+
+
+
+
+# games/trevor/auto/c86.sgf problems:
+
+loadsgf games/trevor/auto/c86.sgf 44
+1570 restricted_genmove white E1 E2 F2 F3
+#? [E2|F2|F3]
+
+
+
+
+# games/trevor/auto/c88.sgf problems:
+
+loadsgf games/trevor/auto/c88.sgf 72
+1580 reg_genmove white
+#? [C8]
+
+
+loadsgf games/trevor/auto/c88.sgf 80
+1590 reg_genmove white
+#? [F1]
+
+
+
+
+# games/trevor/auto/c90.sgf problems:
+
+loadsgf games/trevor/auto/c90.sgf 34
+1600 reg_genmove white
+#? [!N7]
+
+
+
+
+# games/trevor/auto/c91.sgf problems:
+
+loadsgf games/trevor/auto/c91.sgf 92
+1610 reg_genmove white
+#? [!D1]
+
+
+
+
+# games/trevor/auto/c93.sgf problems:
+
+loadsgf games/trevor/auto/c93.sgf 34
+1620 reg_genmove white
+#? [!E11]
+
+loadsgf games/trevor/auto/c93.sgf 35
+1621 attack E11
+#? [1 D11]
+
+
+
+# games/trevor/auto/c94.sgf problems:
+
+loadsgf games/trevor/auto/c94.sgf 14
+1630 reg_genmove white
+#? [!G2]
+
+
+loadsgf games/trevor/auto/c94.sgf 24
+1640 reg_genmove white
+#? [!K8]
+
+
+loadsgf games/trevor/auto/c94.sgf 28
+1650 reg_genmove white
+#? [F7]*
+
+
+
+
+# games/trevor/auto/c96.sgf problems:
+
+loadsgf games/trevor/auto/c96.sgf 26
+1660 reg_genmove white
+#? [L10]*
+
+
+loadsgf games/trevor/auto/c96.sgf 78
+1670 reg_genmove white
+#? [K6]
+
+
+loadsgf games/trevor/auto/c96.sgf 92
+1680 reg_genmove white
+#? [K13]
+
+
diff --git a/regression/trevord.tst b/regression/trevord.tst
new file mode 100644 (file)
index 0000000..c188cf3
--- /dev/null
@@ -0,0 +1,604 @@
+# games/trevor/auto/d01.sgf problems:
+
+#Extend along side bigger.  Probably C7
+loadsgf games/trevor/auto/d01.sgf 22
+100 reg_genmove white
+#? [!E10]
+
+
+#Other moves possible, !P6
+loadsgf games/trevor/auto/d01.sgf 28
+110 reg_genmove white
+#? [N16]*
+
+
+loadsgf games/trevor/auto/d01.sgf 36
+120 reg_genmove white
+#? [B9]
+
+
+loadsgf games/trevor/auto/d01.sgf 46
+130 reg_genmove white
+#? [!O9]
+
+
+# around L7|L8 looks right.
+loadsgf games/trevor/auto/d01.sgf 52
+140 reg_genmove white
+#? [!N15]
+
+
+loadsgf games/trevor/auto/d01.sgf 54
+150 reg_genmove white
+#? [!F9]
+
+
+loadsgf games/trevor/auto/d01.sgf 144
+160 reg_genmove white
+#? [N7]
+
+
+loadsgf games/trevor/auto/d01.sgf 148
+170 reg_genmove white
+#? [Q8]
+
+
+loadsgf games/trevor/auto/d01.sgf 154
+180 reg_genmove white
+#? [S9]
+
+
+loadsgf games/trevor/auto/d01.sgf 184
+190 reg_genmove white
+#? [T10]
+
+
+
+
+# games/trevor/auto/d02.sgf problems:
+
+# Other moves possible.  Time to reduce black, or play at the boundary, something like O11 or E6 are better than P10
+loadsgf games/trevor/auto/d02.sgf 52
+200 reg_genmove white
+#? [O11|E6]*
+
+
+loadsgf games/trevor/auto/d02.sgf 58
+210 reg_genmove white
+#? [!C15]
+
+
+#Other moves possible.
+loadsgf games/trevor/auto/d02.sgf 64
+220 reg_genmove white
+#? [M10|L10|K10|K9|J10|J9|L9]
+
+
+#Other moves possible.  !F2
+loadsgf games/trevor/auto/d02.sgf 68
+230 reg_genmove white
+#? [G6]*
+
+
+#Must reduce the moyo.
+loadsgf games/trevor/auto/d02.sgf 72
+240 reg_genmove white
+#? [!T17]
+
+
+#Other moves also possible.
+#N10|M9 are good shape moves.
+loadsgf games/trevor/auto/d02.sgf 78
+250 reg_genmove white
+#? [N10|M9]*
+
+
+loadsgf games/trevor/auto/d02.sgf 142
+260 reg_genmove white
+#? [Q2]
+
+
+loadsgf games/trevor/auto/d02.sgf 142
+white Q2
+261 defend P2
+#? [0]*
+
+
+#Set up big ko.
+loadsgf games/trevor/auto/d02.sgf 150
+270 reg_genmove white
+#? [G8]*
+
+
+loadsgf games/trevor/auto/d02.sgf 162
+280 reg_genmove white
+#? [!E13]
+
+
+
+
+# games/trevor/auto/d03.sgf problems:
+
+loadsgf games/trevor/auto/d03.sgf 36
+290 reg_genmove white
+#? [!Q8]*
+
+
+loadsgf games/trevor/auto/d03.sgf 86
+300 reg_genmove white
+#? [Q15]*
+
+
+loadsgf games/trevor/auto/d03.sgf 88
+310 reg_genmove white
+#? [S17]*
+
+
+loadsgf games/trevor/auto/d03.sgf 96
+320 reg_genmove white
+#? [B6]*
+
+
+loadsgf games/trevor/auto/d03.sgf 162
+330 reg_genmove white
+#? [D16]
+
+
+loadsgf games/trevor/auto/d03.sgf 176
+340 reg_genmove white
+#? [H10]
+
+
+loadsgf games/trevor/auto/d03.sgf 210
+350 reg_genmove white
+#? [F18]*
+
+
+
+
+# games/trevor/auto/d08.sgf problems:
+
+loadsgf games/trevor/auto/d08.sgf 48
+360 reg_genmove white
+#? [K3|K4]
+
+
+#K10 better than J9
+loadsgf games/trevor/auto/d08.sgf 66
+370 reg_genmove white
+#? [!J9]
+
+
+# L9 or close is better.
+loadsgf games/trevor/auto/d08.sgf 68
+380 reg_genmove white
+#? [!G15]
+
+
+# L10 or H12 required.
+loadsgf games/trevor/auto/d08.sgf 70
+390 reg_genmove white
+#? [!N9]
+
+
+loadsgf games/trevor/auto/d08.sgf 72
+400 reg_genmove white
+#? [H12|J12|J11|H11]*
+
+
+loadsgf games/trevor/auto/d08.sgf 114
+410 reg_genmove white
+#? [S7]
+
+
+loadsgf games/trevor/auto/d08.sgf 118
+420 reg_genmove white
+#? [S9]
+
+
+loadsgf games/trevor/auto/d08.sgf 150
+430 reg_genmove white
+#? [E19]*
+
+
+loadsgf games/trevor/auto/d08.sgf 206
+440 reg_genmove white
+#? [F10]
+
+
+loadsgf games/trevor/auto/d08.sgf 214
+450 reg_genmove white
+#? [G12|F13]*
+
+
+loadsgf games/trevor/auto/d08.sgf 232
+460 reg_genmove white
+#? [F19]
+
+
+loadsgf games/trevor/auto/d08.sgf 240
+470 reg_genmove white
+#? [J18]
+
+
+
+
+# games/trevor/auto/d12.sgf problems:
+
+loadsgf games/trevor/auto/d12.sgf 16
+480 reg_genmove white
+#? [S3|S5]*
+
+
+loadsgf games/trevor/auto/d12.sgf 40
+490 reg_genmove white
+#? [D5]
+
+
+loadsgf games/trevor/auto/d12.sgf 52
+500 reg_genmove white
+#? [E3]
+
+
+loadsgf games/trevor/auto/d12.sgf 66
+510 reg_genmove white
+#? [!C15]
+
+
+
+
+# games/trevor/auto/d24.sgf problems:
+
+loadsgf games/trevor/auto/d24.sgf 24
+520 reg_genmove white
+#? [D15]
+
+
+loadsgf games/trevor/auto/d24.sgf 52
+530 reg_genmove white
+#? [!F7]
+
+
+loadsgf games/trevor/auto/d24.sgf 66
+540 reg_genmove white
+#? [S8]*
+
+
+loadsgf games/trevor/auto/d24.sgf 80
+550 reg_genmove white
+#? [T8]*
+
+
+loadsgf games/trevor/auto/d24.sgf 98
+560 reg_genmove white
+#? [E18]*
+
+
+loadsgf games/trevor/auto/d24.sgf 174
+570 reg_genmove white
+#? [K9]
+
+
+loadsgf games/trevor/auto/d24.sgf 178
+580 reg_genmove white
+#? [R13]*
+
+
+loadsgf games/trevor/auto/d24.sgf 180
+590 reg_genmove white
+#? [!N14]
+
+
+#L14 is ko threat for both.
+loadsgf games/trevor/auto/d24.sgf 212
+600 reg_genmove white
+#? [L14]
+
+
+loadsgf games/trevor/auto/d24.sgf 216
+610 reg_genmove white
+#? [D2]
+
+
+#M11 loses points.
+loadsgf games/trevor/auto/d24.sgf 218
+620 reg_genmove white
+#? [!M11]
+
+
+loadsgf games/trevor/auto/d24.sgf 224
+630 reg_genmove white
+#? [E2]
+
+
+loadsgf games/trevor/auto/d24.sgf 242
+640 reg_genmove white
+#? [H2]
+
+
+
+
+# games/trevor/auto/d25.sgf problems:
+
+loadsgf games/trevor/auto/d25.sgf 114
+650 reg_genmove white
+#? [E9]*
+
+
+loadsgf games/trevor/auto/d25.sgf 176
+660 reg_genmove white
+#? [O11]*
+
+
+loadsgf games/trevor/auto/d25.sgf 178
+670 reg_genmove white
+#? [O11]
+
+
+
+
+# games/trevor/auto/d29.sgf problems:
+
+loadsgf games/trevor/auto/d29.sgf 182
+680 reg_genmove white
+#? [S16]*
+
+
+loadsgf games/trevor/auto/d29.sgf 187
+690 reg_genmove black
+#? [!PASS]
+
+
+loadsgf games/trevor/auto/d29.sgf 188
+700 reg_genmove white
+#? [!PASS]
+
+
+
+
+# games/trevor/auto/d32.sgf problems:
+
+loadsgf games/trevor/auto/d32.sgf 90
+710 reg_genmove white
+#? [M2|J4|L5]*
+
+
+loadsgf games/trevor/auto/d32.sgf 94
+720 reg_genmove white
+#? [!K4]
+
+
+loadsgf games/trevor/auto/d32.sgf 106
+730 reg_genmove white
+#? [H3]
+
+
+loadsgf games/trevor/auto/d32.sgf 130
+740 reg_genmove white
+#? [B15]
+
+
+loadsgf games/trevor/auto/d32.sgf 166
+750 reg_genmove white
+#? [Q10]
+
+
+loadsgf games/trevor/auto/d32.sgf 176
+760 reg_genmove white
+#? [H6]
+
+
+##Not a good problem.
+##loadsgf games/trevor/auto/d32.sgf 184
+##770 reg_genmove white
+###? [A12]*
+##
+
+loadsgf games/trevor/auto/d32.sgf 198
+780 reg_genmove white
+#? [B18]
+
+
+# See also owl1:390-392.
+loadsgf games/trevor/auto/d32.sgf 240
+790 reg_genmove white
+#? [P14]*
+
+
+loadsgf games/trevor/auto/d32.sgf 244
+800 reg_genmove white
+#? [Q9]*
+
+
+
+
+# games/trevor/auto/d33.sgf problems:
+
+#Other moves possible, but must defend F3 group.
+loadsgf games/trevor/auto/d33.sgf 36
+810 reg_genmove white
+#? [F2|H3]*
+
+
+loadsgf games/trevor/auto/d33.sgf 40
+820 reg_genmove white
+#? [T18]*
+
+
+loadsgf games/trevor/auto/d33.sgf 62
+830 reg_genmove white
+#? [!G6|E6]
+
+
+loadsgf games/trevor/auto/d33.sgf 186
+840 reg_genmove white
+#? [A5]
+
+
+loadsgf games/trevor/auto/d33.sgf 210
+850 reg_genmove white
+#? [O6]*
+
+
+
+
+# games/trevor/auto/d39.sgf problems:
+
+loadsgf games/trevor/auto/d39.sgf 24
+860 reg_genmove white
+#? [Q5]
+
+
+loadsgf games/trevor/auto/d39.sgf 26
+870 reg_genmove white
+#? [R6]
+
+
+loadsgf games/trevor/auto/d39.sgf 30
+880 reg_genmove white
+#? [R7]*
+
+
+#locally, E18 is better.
+loadsgf games/trevor/auto/d39.sgf 38
+890 reg_genmove white
+#? [!F18]
+
+
+#R7 or R2 are much better.
+loadsgf games/trevor/auto/d39.sgf 46
+900 reg_genmove white
+#? [!O2]
+
+
+loadsgf games/trevor/auto/d39.sgf 100
+910 reg_genmove white
+#? [!B1]
+
+
+loadsgf games/trevor/auto/d39.sgf 170
+920 reg_genmove white
+#? [G17]*
+
+
+loadsgf games/trevor/auto/d39.sgf 196
+930 reg_genmove white
+#? [!P19]
+
+
+loadsgf games/trevor/auto/d39.sgf 198
+940 reg_genmove white
+#? [!R19]
+
+
+loadsgf games/trevor/auto/d39.sgf 204
+950 reg_genmove white
+#? [R9]*
+
+
+loadsgf games/trevor/auto/d39.sgf 208
+960 reg_genmove white
+#? [J6]
+
+
+loadsgf games/trevor/auto/d39.sgf 210
+970 reg_genmove white
+#? [J9]
+
+
+loadsgf games/trevor/auto/d39.sgf 222
+980 reg_genmove white
+#? [M13]
+
+
+
+
+# games/trevor/auto/d40.sgf problems:
+
+loadsgf games/trevor/auto/d40.sgf 36
+990 reg_genmove white
+#? [!G6]
+
+
+loadsgf games/trevor/auto/d40.sgf 38
+1000 reg_genmove white
+#? [C5]*
+
+
+loadsgf games/trevor/auto/d40.sgf 166
+1010 reg_genmove white
+#? [C16]*
+
+
+loadsgf games/trevor/auto/d40.sgf 168
+1020 reg_genmove white
+#? [L11]*
+
+
+loadsgf games/trevor/auto/d40.sgf 172
+1030 reg_genmove white
+#? [C16]*
+
+
+
+
+# games/trevor/auto/d45.sgf problems:
+
+loadsgf games/trevor/auto/d45.sgf 66
+1040 reg_genmove white
+#? [!C4]
+
+
+
+
+# games/trevor/auto/d46.sgf problems:
+
+loadsgf games/trevor/auto/d46.sgf 132
+1050 reg_genmove white
+#? [!M12]
+
+
+loadsgf games/trevor/auto/d46.sgf 156
+1060 reg_genmove white
+#? [!H5]
+
+
+loadsgf games/trevor/auto/d46.sgf 228
+1070 reg_genmove white
+#? [R13]*
+
+
+
+
+# games/trevor/auto/d47.sgf problems:
+
+loadsgf games/trevor/auto/d47.sgf 22
+1080 reg_genmove white
+#? [!O16]
+
+
+loadsgf games/trevor/auto/d47.sgf 100
+1090 reg_genmove white
+#? [L7]
+
+
+
+
+# games/trevor/auto/d48.sgf problems:
+
+loadsgf games/trevor/auto/d48.sgf 80
+1100 reg_genmove white
+#? [N5]
+
+
+loadsgf games/trevor/auto/d48.sgf 150
+1110 reg_genmove white
+#? [O17]*
+
+
+#Mostly, !Q7
+loadsgf games/trevor/auto/d48.sgf 226
+1120 reg_genmove white
+#? [Q8]
+
+
diff --git a/regression/unconditional.tst b/regression/unconditional.tst
new file mode 100644 (file)
index 0000000..02401c6
--- /dev/null
@@ -0,0 +1,1381 @@
+# Test of unconditional status. The test files benson_safe1.sgf,
+# benson_safe2.sgf, benson_safe3.sgf, and benson_unsafe.sgf were
+# posted by Jean-Pierre Vesinet to the computer-go mailing list on
+# 2003-09-19. 
+
+loadsgf games/unconditional/benson_safe1.sgf
+1 unconditional_status B19
+#? [alive]
+2 unconditional_status G19
+#? [alive]
+3 unconditional_status M19
+#? [alive]
+4 unconditional_status R19
+#? [alive]
+5 unconditional_status T19
+#? [alive]
+6 unconditional_status A18
+#? [alive]
+7 unconditional_status E16
+#? [alive]
+8 unconditional_status N16
+#? [alive]
+9 unconditional_status E15
+#? [alive]
+10 unconditional_status K15
+#? [alive]
+11 unconditional_status S15
+#? [alive]
+12 unconditional_status O14
+#? [alive]
+13 unconditional_status D9
+#? [alive]
+14 unconditional_status S9
+#? [alive]
+15 unconditional_status H8
+#? [alive]
+16 unconditional_status R8
+#? [alive]
+17 unconditional_status E7
+#? [alive]
+18 unconditional_status P7
+#? [alive]
+19 unconditional_status O6
+#? [alive]
+20 unconditional_status N4
+#? [alive]
+21 unconditional_status S4
+#? [alive]
+22 unconditional_status P2
+#? [alive]
+23 unconditional_status R2
+#? [alive]
+24 unconditional_status T2
+#? [alive]
+25 unconditional_status A19
+#? [white_territory]
+26 unconditional_status D19
+#? [undecided]
+27 unconditional_status H19
+#? [white_territory]
+28 unconditional_status L19
+#? [white_territory]
+29 unconditional_status O19
+#? [white_territory]
+30 unconditional_status S19
+#? [white_territory]
+31 unconditional_status B18
+#? [white_territory]
+32 unconditional_status T18
+#? [white_territory]
+33 unconditional_status J15
+#? [white_territory]
+34 unconditional_status O15
+#? [white_territory]
+35 unconditional_status F14
+#? [black_territory]
+36 unconditional_status K14
+#? [white_territory]
+37 unconditional_status P14
+#? [white_territory]
+38 unconditional_status K14
+#? [white_territory]
+39 unconditional_status T14
+#? [white_territory]
+40 unconditional_status G13
+#? [black_territory]
+41 unconditional_status T12
+#? [white_territory]
+42 unconditional_status E8
+#? [undecided]
+43 unconditional_status G8
+#? [white_territory]
+44 unconditional_status S8
+#? [white_territory]
+45 unconditional_status R7
+#? [white_territory]
+46 unconditional_status F6
+#? [black_territory]
+47 unconditional_status P6
+#? [white_territory]
+48 unconditional_status S6
+#? [white_territory]
+49 unconditional_status E5
+#? [black_territory]
+50 unconditional_status O4
+#? [white_territory]
+51 unconditional_status C3
+#? [white_territory]
+52 unconditional_status T3
+#? [white_territory]
+53 unconditional_status O2
+#? [white_territory]
+54 unconditional_status S2
+#? [white_territory]
+55 unconditional_status N1
+#? [white_territory]
+56 unconditional_status T1
+#? [white_territory]
+
+loadsgf games/unconditional/benson_safe2.sgf
+101 unconditional_status D19
+#? [alive]
+102 unconditional_status F19
+#? [alive]
+103 unconditional_status J19
+#? [alive]
+104 unconditional_status L19
+#? [alive]
+105 unconditional_status N19
+#? [alive]
+106 unconditional_status A18
+#? [alive]
+107 unconditional_status E18
+#? [alive]
+108 unconditional_status O18
+#? [alive]
+109 unconditional_status A15
+#? [alive]
+110 unconditional_status G15
+#? [alive]
+111 unconditional_status S15
+#? [alive]
+112 unconditional_status B14
+#? [dead]
+113 unconditional_status H13
+#? [alive]
+114 unconditional_status K13
+#? [dead]
+115 unconditional_status A12
+#? [alive]
+116 unconditional_status D12
+#? [alive]
+117 unconditional_status R12
+#? [alive]
+118 unconditional_status Q11
+#? [alive]
+119 unconditional_status S9
+#? [alive]
+120 unconditional_status A8
+#? [alive]
+121 unconditional_status K7
+#? [alive]
+122 unconditional_status J6
+#? [alive]
+123 unconditional_status S6
+#? [alive]
+124 unconditional_status K3
+#? [alive]
+125 unconditional_status D2
+#? [dead]
+126 unconditional_status F2
+#? [alive]
+127 unconditional_status T2
+#? [dead]
+128 unconditional_status E1
+#? [alive]
+129 unconditional_status A19
+#? [black_territory]
+130 unconditional_status E19
+#? [black_territory]
+131 unconditional_status G19
+#? [black_territory]
+132 unconditional_status K19
+#? [undecided]
+133 unconditional_status M19
+#? [black_territory]
+134 unconditional_status O19
+#? [black_territory]
+135 unconditional_status D18
+#? [black_territory]
+136 unconditional_status F18
+#? [black_territory]
+137 unconditional_status N18
+#? [black_territory]
+138 unconditional_status O17
+#? [black_territory]
+139 unconditional_status A14
+#? [black_territory]
+140 unconditional_status H14
+#? [black_territory]
+141 unconditional_status T14
+#? [black_territory]
+142 unconditional_status J13
+#? [black_territory]
+143 unconditional_status C12
+#? [black_territory]
+144 unconditional_status S12
+#? [black_territory]
+145 unconditional_status A11
+#? [black_territory]
+146 unconditional_status R11
+#? [black_territory]
+147 unconditional_status S10
+#? [black_territory]
+148 unconditional_status T9
+#? [black_territory]
+149 unconditional_status A7
+#? [black_territory]
+150 unconditional_status K6
+#? [black_territory]
+151 unconditional_status M5
+#? [black_territory]
+152 unconditional_status T5
+#? [black_territory]
+153 unconditional_status A4
+#? [undecided]
+154 unconditional_status L3
+#? [black_territory]
+155 unconditional_status O3
+#? [black_territory]
+156 unconditional_status T3
+#? [black_territory]
+157 unconditional_status E2
+#? [black_territory]
+158 unconditional_status S2
+#? [black_territory]
+159 unconditional_status F1
+#? [black_territory]
+
+loadsgf games/unconditional/benson_safe3.sgf
+201 unconditional_status A19
+#? [alive]
+202 unconditional_status D16
+#? [alive]
+203 unconditional_status E15
+#? [alive]
+204 unconditional_status F14
+#? [alive]
+205 unconditional_status N14
+#? [alive]
+206 unconditional_status E13
+#? [alive]
+207 unconditional_status P13
+#? [alive]
+208 unconditional_status K11
+#? [alive]
+209 unconditional_status K10
+#? [alive]
+210 unconditional_status B18
+#? [undecided]
+211 unconditional_status F13
+#? [black_territory]
+212 unconditional_status O13
+#? [black_territory]
+213 unconditional_status G12
+#? [black_territory]
+214 unconditional_status N12
+#? [black_territory]
+215 unconditional_status J11
+#? [white_territory]
+216 unconditional_status L11
+#? [white_territory]
+217 unconditional_status J8
+#? [black_territory]
+218 unconditional_status L8
+#? [black_territory]
+219 unconditional_status K5
+#? [undecided]
+220 unconditional_status A1
+#? [black_territory]
+221 unconditional_status T1
+#? [black_territory]
+
+loadsgf games/unconditional/benson_unsafe.sgf
+301 unconditional_status A19
+#? [undecided]
+302 unconditional_status B19
+#? [undecided]
+303 unconditional_status G19
+#? [undecided]
+304 unconditional_status K19
+#? [undecided]
+305 unconditional_status N19
+#? [undecided]
+306 unconditional_status Q19
+#? [undecided]
+307 unconditional_status T19
+#? [undecided]
+308 unconditional_status A17
+#? [undecided]
+309 unconditional_status O17
+#? [undecided]
+310 unconditional_status N16
+#? [undecided]
+311 unconditional_status A15
+#? [undecided]
+312 unconditional_status F15
+#? [undecided]
+313 unconditional_status S15
+#? [undecided]
+314 unconditional_status G14
+#? [undecided]
+315 unconditional_status P14
+#? [undecided]
+316 unconditional_status R13
+#? [undecided]
+317 unconditional_status T13
+#? [undecided]
+318 unconditional_status A12
+#? [undecided]
+319 unconditional_status D12
+#? [undecided]
+320 unconditional_status M11
+#? [undecided]
+321 unconditional_status S11
+#? [undecided]
+322 unconditional_status N9
+#? [undecided]
+323 unconditional_status C8
+#? [undecided]
+324 unconditional_status D7
+#? [undecided]
+325 unconditional_status K7
+#? [undecided]
+326 unconditional_status E6
+#? [undecided]
+327 unconditional_status J6
+#? [undecided]
+328 unconditional_status S6
+#? [undecided]
+329 unconditional_status C3
+#? [undecided]
+330 unconditional_status K3
+#? [undecided]
+331 unconditional_status N3
+#? [undecided]
+332 unconditional_status P3
+#? [undecided]
+333 unconditional_status D2
+#? [undecided]
+334 unconditional_status F2
+#? [undecided]
+335 unconditional_status J2
+#? [undecided]
+336 unconditional_status E1
+#? [undecided]
+337 unconditional_status T1
+#? [undecided]
+338 unconditional_status D19
+#? [undecided]
+339 unconditional_status F19
+#? [undecided]
+340 unconditional_status H19
+#? [undecided]
+341 unconditional_status L19
+#? [undecided]
+342 unconditional_status O19
+#? [undecided]
+343 unconditional_status R19
+#? [undecided]
+344 unconditional_status A18
+#? [undecided]
+345 unconditional_status K18
+#? [undecided]
+346 unconditional_status T18
+#? [undecided]
+347 unconditional_status O16
+#? [undecided]
+348 unconditional_status A14
+#? [undecided]
+349 unconditional_status O14
+#? [undecided]
+350 unconditional_status T14
+#? [undecided]
+351 unconditional_status H13
+#? [undecided]
+352 unconditional_status S13
+#? [undecided]
+353 unconditional_status C12
+#? [undecided]
+354 unconditional_status A11
+#? [undecided]
+355 unconditional_status K11
+#? [undecided]
+356 unconditional_status T11
+#? [undecided]
+357 unconditional_status N10
+#? [undecided]
+358 unconditional_status O9
+#? [undecided]
+359 unconditional_status N7
+#? [undecided]
+360 unconditional_status D6
+#? [undecided]
+361 unconditional_status K6
+#? [undecided]
+362 unconditional_status M5
+#? [undecided]
+363 unconditional_status T5
+#? [undecided]
+364 unconditional_status L3
+#? [undecided]
+365 unconditional_status O3
+#? [undecided]
+366 unconditional_status T3
+#? [undecided]
+367 unconditional_status E2
+#? [undecided]
+368 unconditional_status K2
+#? [undecided]
+369 unconditional_status F1
+#? [undecided]
+370 unconditional_status L1
+#? [undecided]
+371 unconditional_status N1
+#? [undecided]
+
+loadsgf games/unconditional/unconditional1.sgf
+401 unconditional_status A19
+#? [black_territory]
+402 unconditional_status B19
+#? [dead]
+403 unconditional_status C19
+#? [alive]
+404 unconditional_status D19
+#? [black_territory]
+405 unconditional_status A18
+#? [alive]
+406 unconditional_status D17
+#? [black_territory]
+407 unconditional_status F16
+#? [undecided]
+408 unconditional_status A15
+#? [dead]
+409 unconditional_status A14
+#? [black_territory]
+410 unconditional_status C14
+#? [black_territory]
+411 unconditional_status C12
+#? [dead]
+412 unconditional_status F12
+#? [black_territory]
+413 unconditional_status D11
+#? [black_territory]
+414 unconditional_status P11
+#? [black_territory]
+415 unconditional_status C10
+#? [black_territory]
+416 unconditional_status D10
+#? [alive]
+417 unconditional_status E10
+#? [black_territory]
+418 unconditional_status L10
+#? [dead]
+419 unconditional_status D9
+#? [black_territory]
+420 unconditional_status M9
+#? [black_territory]
+421 unconditional_status B8
+#? [black_territory]
+422 unconditional_status M8
+#? [alive]
+423 unconditional_status P8
+#? [undecided]
+424 unconditional_status C7
+#? [black_territory]
+425 unconditional_status M6
+#? [black_territory]
+
+play white H6
+426 unconditional_status P8
+#? [black_territory]
+427 unconditional_status H6
+#? [dead]
+
+loadsgf games/unconditional/unconditional2.sgf
+501 unconditional_status D19
+#? [alive]
+502 unconditional_status E19
+#? [dead]
+503 unconditional_status L19
+#? [undecided]
+504 unconditional_status R19
+#? [dead]
+505 unconditional_status T19
+#? [alive]
+506 unconditional_status G18
+#? [alive]
+507 unconditional_status N18
+#? [undecided]
+508 unconditional_status Q14
+#? [dead]
+509 unconditional_status L13
+#? [undecided]
+510 unconditional_status S13
+#? [alive]
+511 unconditional_status M11
+#? [undecided]
+512 unconditional_status Q8
+#? [undecided]
+513 unconditional_status S7
+#? [undecided]
+514 unconditional_status L6
+#? [undecided]
+515 unconditional_status M4
+#? [undecided]
+516 unconditional_status S1
+#? [alive]
+517 unconditional_status A19
+#? [undecided]
+518 unconditional_status G19
+#? [black_territory]
+519 unconditional_status N19
+#? [undecided]
+520 unconditional_status S19
+#? [black_territory]
+521 unconditional_status F18
+#? [black_territory]
+522 unconditional_status H18
+#? [black_territory]
+523 unconditional_status M18
+#? [undecided]
+524 unconditional_status O17
+#? [undecided]
+525 unconditional_status T17
+#? [black_territory]
+526 unconditional_status G16
+#? [black_territory]
+527 unconditional_status J16
+#? [black_territory]
+528 unconditional_status N16
+#? [undecided]
+529 unconditional_status R16
+#? [black_territory]
+530 unconditional_status K14
+#? [black_territory]
+531 unconditional_status O13
+#? [undecided]
+532 unconditional_status R13
+#? [black_territory]
+533 unconditional_status T13
+#? [black_territory]
+534 unconditional_status M12
+#? [undecided]
+535 unconditional_status L11
+#? [undecided]
+536 unconditional_status N11
+#? [undecided]
+537 unconditional_status S11
+#? [black_territory]
+538 unconditional_status Q10
+#? [black_territory]
+539 unconditional_status M9
+#? [undecided]
+540 unconditional_status O8
+#? [undecided]
+541 unconditional_status J7
+#? [black_territory]
+542 unconditional_status R7
+#? [undecided]
+543 unconditional_status T7
+#? [undecided]
+544 unconditional_status O6
+#? [undecided]
+545 unconditional_status M5
+#? [undecided]
+546 unconditional_status L4
+#? [undecided]
+547 unconditional_status N3
+#? [undecided]
+548 unconditional_status K2
+#? [undecided]
+549 unconditional_status M2
+#? [undecided]
+550 unconditional_status Q2
+#? [black_territory]
+551 unconditional_status O1
+#? [undecided]
+
+loadsgf games/unconditional/unconditional3.sgf
+601 unconditional_status R19
+#? [undecided]
+602 unconditional_status S17
+#? [undecided]
+603 unconditional_status S18
+#? [undecided]
+604 unconditional_status R17
+#? [undecided]
+605 unconditional_status T17
+#? [undecided
+606 unconditional_status S15
+#? [undecided
+607 unconditional_status R12
+#? [undecided]
+608 unconditional_status Q10
+#? [undecided]
+609 unconditional_status S10
+#? [undecided]
+610 unconditional_status S11
+#? [undecided]
+611 unconditional_status R10
+#? [undecided]
+612 unconditional_status T10
+#? [undecided]
+613 unconditional_status S8
+#? [undecided]
+614 unconditional_status O3
+#? [dead]
+615 unconditional_status Q4
+#? [dead]
+616 unconditional_status S3
+#? [dead]
+617 unconditional_status Q2
+#? [alive]
+618 unconditional_status P2
+#? [black_territory]
+619 unconditional_status Q3
+#? [black_territory]
+620 unconditional_status Q1
+#? [black_territory]
+621 unconditional_status S2
+#? [black_territory]
+622 unconditional_status H4
+#? [undecided]
+623 unconditional_status G2
+#? [undecided]
+624 unconditional_status J2
+#? [undecided]
+625 unconditional_status H2
+#? [undecided]
+626 unconditional_status J3
+#? [undecided]
+627 unconditional_status J1
+#? [undecided]
+628 unconditional_status L2
+#? [undecided]
+629 unconditional_status A6
+#? [dead]
+630 unconditional_status C5
+#? [dead]
+631 unconditional_status A2
+#? [dead]
+632 unconditional_status B4
+#? [alive]
+633 unconditional_status B5
+#? [black_territory]
+634 unconditional_status A4
+#? [black_territory]
+635 unconditional_status C4
+#? [black_territory]
+636 unconditional_status B2
+#? [black_territory]
+637 unconditional_status A12
+#? [undecided]
+638 unconditional_status B13
+#? [undecided]
+639 unconditional_status C11
+#? [undecided]
+640 unconditional_status B11
+#? [undecided]
+641 unconditional_status B12
+#? [undecided]
+642 unconditional_status A11
+#? [undecided]
+643 unconditional_status C11
+#? [undecided]
+644 unconditional_status B9
+#? [undecided]
+645 unconditional_status E19
+#? [undecided]
+646 unconditional_status B17
+#? [undecided]
+647 unconditional_status A19
+#? [undecided]
+648 unconditional_status C18
+#? [undecided]
+649 unconditional_status B18
+#? [undecided]
+650 unconditional_status C19
+#? [undecided]
+651 unconditional_status C17
+#? [undecided]
+652 unconditional_status E18
+#? [undecided]
+653 unconditional_status M19
+#? [dead]
+654 unconditional_status N18
+#? [dead]
+655 unconditional_status J17
+#? [dead]
+656 unconditional_status H19
+#? [dead]
+657 unconditional_status K18
+#? [alive]
+658 unconditional_status J18
+#? [black_territory]
+659 unconditional_status K19
+#? [black_territory]
+660 unconditional_status K17
+#? [black_territory]
+661 unconditional_status M18
+#? [black_territory]
+662 unconditional_status L14
+#? [dead]
+663 unconditional_status O12
+#? [dead]
+664 unconditional_status L10
+#? [dead]
+665 unconditional_status K12
+#? [dead]
+666 unconditional_status M12
+#? [alive]
+667 unconditional_status M13
+#? [black_territory]
+668 unconditional_status L12
+#? [black_territory]
+669 unconditional_status N12
+#? [black_territory]
+670 unconditional_status M10
+#? [black_territory]
+
+loadsgf games/unconditional/unconditional4.sgf
+701 unconditional_status R19
+#? [undecided]
+702 unconditional_status S17
+#? [undecided]
+703 unconditional_status S18
+#? [undecided]
+704 unconditional_status R16
+#? [undecided]
+705 unconditional_status T17
+#? [undecided
+706 unconditional_status S15
+#? [undecided
+707 unconditional_status R12
+#? [dead]
+708 unconditional_status Q9
+#? [dead]
+709 unconditional_status S10
+#? [alive]
+710 unconditional_status S11
+#? [black_territory]
+711 unconditional_status R9
+#? [black_territory]
+712 unconditional_status T10
+#? [black_territory]
+713 unconditional_status S8
+#? [black_territory]
+714 unconditional_status O3
+#? [dead]
+715 unconditional_status Q4
+#? [dead]
+716 unconditional_status Q2
+#? [alive]
+717 unconditional_status P2
+#? [black_territory]
+718 unconditional_status Q3
+#? [black_territory]
+719 unconditional_status Q1
+#? [black_territory]
+720 unconditional_status S2
+#? [black_territory]
+721 unconditional_status H4
+#? [undecided]
+722 unconditional_status M2
+#? [undecided]
+723 unconditional_status J2
+#? [undecided]
+724 unconditional_status H2
+#? [undecided]
+725 unconditional_status J3
+#? [undecided]
+726 unconditional_status J1
+#? [undecided]
+727 unconditional_status L2
+#? [undecided]
+728 unconditional_status A6
+#? [dead]
+729 unconditional_status C5
+#? [dead]
+730 unconditional_status B4
+#? [alive]
+731 unconditional_status B5
+#? [black_territory]
+732 unconditional_status A4
+#? [black_territory]
+733 unconditional_status C4
+#? [black_territory]
+734 unconditional_status B2
+#? [black_territory]
+735 unconditional_status A12
+#? [undecided]
+736 unconditional_status A9
+#? [undecided]
+737 unconditional_status B11
+#? [undecided]
+738 unconditional_status B12
+#? [undecided]
+739 unconditional_status A11
+#? [undecided]
+740 unconditional_status C11
+#? [undecided]
+741 unconditional_status B9
+#? [undecided]
+742 unconditional_status E19
+#? [dead]
+743 unconditional_status A19
+#? [dead]
+744 unconditional_status C18
+#? [alive]
+745 unconditional_status B18
+#? [black_territory]
+746 unconditional_status C19
+#? [black_territory]
+747 unconditional_status D17
+#? [black_territory]
+748 unconditional_status E18
+#? [black_territory]
+749 unconditional_status H19
+#? [dead]
+750 unconditional_status M19
+#? [dead]
+751 unconditional_status J17
+#? [dead]
+752 unconditional_status K18
+#? [alive]
+753 unconditional_status J18
+#? [black_territory]
+754 unconditional_status K19
+#? [black_territory]
+755 unconditional_status L17
+#? [black_territory]
+756 unconditional_status M18
+#? [black_territory]
+757 unconditional_status L14
+#? [dead]
+758 unconditional_status O12
+#? [dead]
+759 unconditional_status K11
+#? [dead]
+760 unconditional_status M12
+#? [alive]
+761 unconditional_status M13
+#? [black_territory]
+762 unconditional_status L11
+#? [black_territory]
+763 unconditional_status N12
+#? [black_territory]
+764 unconditional_status M10
+#? [black_territory]
+
+loadsgf games/unconditional/unconditional5.sgf
+801 unconditional_status R19
+#? [undecided]
+802 unconditional_status S17
+#? [undecided]
+803 unconditional_status S18
+#? [undecided]
+804 unconditional_status R16
+#? [undecided]
+805 unconditional_status T17
+#? [undecided
+806 unconditional_status S15
+#? [undecided
+807 unconditional_status R12
+#? [dead]
+808 unconditional_status Q9
+#? [dead]
+809 unconditional_status S10
+#? [alive]
+810 unconditional_status S11
+#? [black_territory]
+811 unconditional_status R9
+#? [black_territory]
+812 unconditional_status T10
+#? [black_territory]
+813 unconditional_status S8
+#? [black_territory]
+814 unconditional_status O3
+#? [undecided]
+815 unconditional_status T2
+#? [undecided]
+816 unconditional_status Q2
+#? [undecided]
+817 unconditional_status P2
+#? [undecided]
+818 unconditional_status Q3
+#? [undecided]
+819 unconditional_status R1
+#? [undecided]
+820 unconditional_status S2
+#? [undecided]
+821 unconditional_status G3
+#? [dead]
+822 unconditional_status J4
+#? [dead]
+823 unconditional_status J2
+#? [alive]
+824 unconditional_status H2
+#? [black_territory]
+825 unconditional_status J3
+#? [black_territory]
+826 unconditional_status K1
+#? [black_territory]
+827 unconditional_status L2
+#? [black_territory]
+828 unconditional_status A6
+#? [dead]
+829 unconditional_status C5
+#? [dead]
+830 unconditional_status B4
+#? [alive]
+831 unconditional_status B5
+#? [black_territory]
+832 unconditional_status A3
+#? [black_territory]
+833 unconditional_status C4
+#? [black_territory]
+834 unconditional_status B2
+#? [black_territory]
+835 unconditional_status A13
+#? [dead]
+836 unconditional_status C12
+#? [dead]
+837 unconditional_status D11
+#? [dead]
+838 unconditional_status B11
+#? [alive]
+839 unconditional_status B12
+#? [black_territory]
+840 unconditional_status A10
+#? [black_territory]
+841 unconditional_status C11
+#? [black_territory]
+842 unconditional_status B9
+#? [black_territory]
+843 unconditional_status D19
+#? [dead]
+844 unconditional_status A19
+#? [dead]
+845 unconditional_status F18
+#? [dead]
+846 unconditional_status C18
+#? [alive]
+847 unconditional_status B18
+#? [black_territory]
+848 unconditional_status C19
+#? [black_territory]
+849 unconditional_status D17
+#? [black_territory]
+850 unconditional_status E18
+#? [black_territory]
+851 unconditional_status J19
+#? [dead]
+852 unconditional_status H18
+#? [dead]
+853 unconditional_status L19
+#? [dead]
+854 unconditional_status K18
+#? [alive]
+855 unconditional_status J18
+#? [black_territory]
+856 unconditional_status K19
+#? [black_territory]
+857 unconditional_status L17
+#? [black_territory]
+858 unconditional_status M18
+#? [black_territory]
+859 unconditional_status L14
+#? [undecided]
+860 unconditional_status N13
+#? [undecided]
+861 unconditional_status K11
+#? [undecided]
+862 unconditional_status M12
+#? [undecided]
+863 unconditional_status M13
+#? [undecided]
+864 unconditional_status L11
+#? [undecided]
+865 unconditional_status N12
+#? [undecided]
+866 unconditional_status M10
+#? [undecided]
+
+loadsgf games/unconditional/unconditional6.sgf
+901 unconditional_status S19
+#? [undecided]
+902 unconditional_status R18
+#? [undecided]
+903 unconditional_status R15
+#? [undecided]
+904 unconditional_status T15
+#? [undecided]
+905 unconditional_status S17
+#? [undecided]
+906 unconditional_status R19
+#? [undecided]
+907 unconditional_status Q18
+#? [undecided]
+908 unconditional_status T17
+#? [undecided]
+909 unconditional_status S15
+#? [undecided]
+910 unconditional_status T11
+#? [undecided]
+911 unconditional_status R8
+#? [undecided]
+912 unconditional_status T8
+#? [undecided]
+913 unconditional_status S10
+#? [undecided]
+914 unconditional_status R12
+#? [undecided]
+915 unconditional_status T10
+#? [undecided]
+916 unconditional_status S8
+#? [undecided]
+917 unconditional_status T2
+#? [dead]
+918 unconditional_status P1
+#? [dead]
+919 unconditional_status Q2
+#? [alive]
+920 unconditional_status Q4
+#? [black_territory]
+921 unconditional_status Q1
+#? [black_territory]
+922 unconditional_status H3
+#? [undecided]
+923 unconditional_status L3
+#? [undecided]
+924 unconditional_status H1
+#? [undecided]
+925 unconditional_status L1
+#? [undecided]
+926 unconditional_status J2
+#? [undecided]
+927 unconditional_status H4
+#? [undecided]
+928 unconditional_status G2
+#? [undecided]
+929 unconditional_status M3
+#? [undecided]
+930 unconditional_status J1
+#? [undecided]
+931 unconditional_status A5
+#? [dead]
+932 unconditional_status A2
+#? [dead]
+933 unconditional_status B4
+#? [alive]
+934 unconditional_status A6
+#? [black_territory]
+935 unconditional_status A4
+#? [black_territory]
+936 unconditional_status C12
+#? [undecided]
+937 unconditional_status A9
+#? [undecided]
+938 unconditional_status C9
+#? [undecided]
+939 unconditional_status B11
+#? [undecided]
+940 unconditional_status B13
+#? [undecided]
+941 unconditional_status C11
+#? [undecided]
+942 unconditional_status B9
+#? [undecided]
+943 unconditional_status A19
+#? [undecided]
+944 unconditional_status E19
+#? [undecided]
+945 unconditional_status E17
+#? [undecided]
+946 unconditional_status C18
+#? [undecided]
+947 unconditional_status B18
+#? [undecided]
+948 unconditional_status C19
+#? [undecided]
+949 unconditional_status F19
+#? [undecided]
+950 unconditional_status J19
+#? [dead]
+951 unconditional_status M19
+#? [dead]
+952 unconditional_status M17
+#? [dead]
+953 unconditional_status K18
+#? [alive]
+954 unconditional_status H19
+#? [black_territory]
+955 unconditional_status K19
+#? [black_territory]
+956 unconditional_status M18
+#? [black_territory]
+957 unconditional_status M12
+#? [alive]
+958 unconditional_status L14
+#? [black_territory]
+
+loadsgf games/unconditional/unconditional7.sgf
+1001 unconditional_status S19
+#? [undecided]
+1002 unconditional_status R15
+#? [undecided]
+1003 unconditional_status T15
+#? [undecided]
+1004 unconditional_status S17
+#? [undecided]
+1005 unconditional_status R19
+#? [undecided]
+1006 unconditional_status T17
+#? [undecided]
+1007 unconditional_status S15
+#? [undecided
+1008 unconditional_status T11
+#? [dead]
+1009 unconditional_status R8
+#? [dead]
+1010 unconditional_status T8
+#? [dead]
+1011 unconditional_status S10
+#? [alive]
+1012 unconditional_status R12
+#? [black_territory]
+1013 unconditional_status T10
+#? [black_territory]
+1014 unconditional_status S8
+#? [black_territory]
+1015 unconditional_status T2
+#? [dead]
+1016 unconditional_status P1
+#? [dead]
+1017 unconditional_status Q2
+#? [alive]
+1018 unconditional_status Q4
+#? [black_territory]
+1019 unconditional_status Q1
+#? [black_territory]
+1020 unconditional_status H3
+#? [undecided]
+1021 unconditional_status H1
+#? [undecided]
+1022 unconditional_status L1
+#? [undecided]
+1023 unconditional_status J2
+#? [undecided]
+1024 unconditional_status H4
+#? [undecided]
+1025 unconditional_status G3
+#? [undecided]
+1026 unconditional_status J1
+#? [undecided]
+1027 unconditional_status A5
+#? [dead]
+1028 unconditional_status C5
+#? [dead]
+1029 unconditional_status A2
+#? [dead]
+1030 unconditional_status B4
+#? [alive]
+1031 unconditional_status A6
+#? [black_territory]
+1032 unconditional_status D5
+#? [black_territory]
+1033 unconditional_status A4
+#? [black_territory]
+1034 unconditional_status A12
+#? [undecided]
+1035 unconditional_status C12
+#? [undecided]
+1036 unconditional_status B11
+#? [undecided]
+1037 unconditional_status A13
+#? [undecided]
+1038 unconditional_status D12
+#? [undecided]
+1039 unconditional_status A19
+#? [dead]
+1040 unconditional_status E19
+#? [dead]
+1041 unconditional_status E17
+#? [dead]
+1042 unconditional_status C18
+#? [alive]
+1043 unconditional_status C19
+#? [black_territory]
+1044 unconditional_status B18
+#? [black_territory]
+1045 unconditional_status E18
+#? [black_territory]
+1046 unconditional_status J19
+#? [dead]
+1047 unconditional_status M19
+#? [dead]
+1048 unconditional_status K18
+#? [alive]
+1049 unconditional_status H19
+#? [black_territory]
+1050 unconditional_status K19
+#? [black_territory]
+1051 unconditional_status L10
+#? [dead]
+1052 unconditional_status M12
+#? [alive]
+1053 unconditional_status L14
+#? [black_territory]
+
+loadsgf games/unconditional/unconditional8.sgf
+1101 unconditional_status S19
+#? [undecided]
+1102 unconditional_status R17
+#? [undecided]
+1103 unconditional_status T16
+#? [undecided]
+1104 unconditional_status R15
+#? [undecided]
+1105 unconditional_status S17
+#? [undecided]
+1106 unconditional_status R19
+#? [undecided]
+1107 unconditional_status Q17
+#? [undecided]
+1108 unconditional_status T17
+#? [undecided
+1109 unconditional_status S15
+#? [undecided
+1110 unconditional_status T11
+#? [dead]
+1111 unconditional_status R10
+#? [dead]
+1112 unconditional_status T9
+#? [dead]
+1113 unconditional_status R8
+#? [dead]
+1114 unconditional_status S10
+#? [alive]
+1115 unconditional_status R12
+#? [black_territory]
+1116 unconditional_status T10
+#? [black_territory]
+1117 unconditional_status Q9
+#? [black_territory]
+1118 unconditional_status S8
+#? [black_territory]
+1119 unconditional_status P3
+#? [undecided]
+1120 unconditional_status R3
+#? [undecided]
+1121 unconditional_status P1
+#? [undecided]
+1122 unconditional_status S1
+#? [undecided]
+1123 unconditional_status Q2
+#? [undecided]
+1124 unconditional_status P4
+#? [undecided]
+1125 unconditional_status O3
+#? [undecided]
+1126 unconditional_status S3
+#? [undecided]
+1127 unconditional_status R1
+#? [undecided]
+1128 unconditional_status H3
+#? [dead]
+1129 unconditional_status K3
+#? [dead]
+1130 unconditional_status H1
+#? [dead]
+1131 unconditional_status L1
+#? [dead]
+1132 unconditional_status J2
+#? [alive]
+1133 unconditional_status J4
+#? [black_territory]
+1134 unconditional_status G3
+#? [black_territory]
+1135 unconditional_status M3
+#? [black_territory]
+1136 unconditional_status K1
+#? [black_territory]
+1137 unconditional_status A5
+#? [dead]
+1138 unconditional_status C3
+#? [dead]
+1139 unconditional_status A2
+#? [dead]
+1140 unconditional_status B4
+#? [alive]
+1141 unconditional_status A6
+#? [black_territory]
+1142 unconditional_status A3
+#? [black_territory]
+1143 unconditional_status B2
+#? [black_territory]
+1144 unconditional_status A12
+#? [dead]
+1145 unconditional_status C10
+#? [dead]
+1146 unconditional_status A9
+#? [dead]
+1147 unconditional_status B11
+#? [alive]
+1148 unconditional_status A13
+#? [black_territory]
+1149 unconditional_status A10
+#? [black_territory]
+1150 unconditional_status B9
+#? [black_territory]
+1151 unconditional_status A19
+#? [dead]
+1152 unconditional_status D19
+#? [dead]
+1153 unconditional_status C17
+#? [dead]
+1154 unconditional_status E17
+#? [dead]
+1155 unconditional_status C18
+#? [alive]
+1156 unconditional_status C19
+#? [black_territory]
+1157 unconditional_status E19
+#? [black_territory]
+1158 unconditional_status A18
+#? [black_territory]
+1159 unconditional_status D17
+#? [black_territory]
+1160 unconditional_status L19
+#? [dead]
+1161 unconditional_status K17
+#? [dead]
+1162 unconditional_status M17
+#? [dead]
+1163 unconditional_status K18
+#? [alive]
+1164 unconditional_status J19
+#? [black_territory]
+1165 unconditional_status N19
+#? [black_territory]
+1166 unconditional_status L17
+#? [black_territory]
+1167 unconditional_status L12
+#? [undecided]
+1168 unconditional_status N11
+#? [undecided]
+1169 unconditional_status L10
+#? [undecided]
+1170 unconditional_status M12
+#? [undecided]
+1171 unconditional_status L14
+#? [undecided]
+1172 unconditional_status K12
+#? [undecided]
+1173 unconditional_status M10
+#? [undecided]
+
+boardsize 2
+clear_board
+play black A1
+play white B2
+1201 unconditional_status A1
+#? [undecided]
+1202 unconditional_status A2
+#? [undecided]
+1203 unconditional_status B1
+#? [undecided]
+1204 unconditional_status B2
+#? [undecided]
diff --git a/regression/vie.tst b/regression/vie.tst
new file mode 100644 (file)
index 0000000..32ae49f
--- /dev/null
@@ -0,0 +1,227 @@
+loadsgf golois/Aya991113-12.sgf
+1 owl_defend S14
+#? [1 T16]
+
+# This attack doesn't work without ko. Changed the correct result. /gf
+loadsgf golois/Aya991113-13.sgf
+2 owl_attack G5
+#? [2 H4]
+
+loadsgf golois/BiwakoFost97-1.sgf
+3 owl_attack G3
+#? [1 G2]
+
+loadsgf golois/BiwakoFost97-1.sgf
+4 owl_defend G3
+#? [1 G2]*
+
+loadsgf golois/BiwakoFost97-2.sgf
+5 owl_attack G3
+#? [1 G2]
+
+loadsgf golois/BiwakoFost97-2.sgf
+6 owl_defend G3
+#? [1 (G2|M1)]
+
+loadsgf golois/DeuxYeuxIndigoIng98.sgf
+7 owl_attack B16
+#? [1 B17]
+
+# S9 seems unlikely to be the only defense. /gf
+# GNU Go likes R7 but this leave W with Q8. R8 looks good. /db
+loadsgf golois/DeuxYeuxManyFacesIng98.sgf
+8 owl_defend R10
+#? [1 (R8|S9)]
+
+loadsgf golois/GoAheadMarseille97.sgf
+9 owl_defend O14
+#? [1 (P15|R14)]
+
+loadsgf golois/GoAheadMarseille97.sgf
+10 owl_attack R15
+#? [1 P15]
+
+loadsgf golois/Goemate990902-15.sgf
+11 owl_defend T8
+#? [1 T7]
+
+# R4 is alive as it stands. Changed the test to defend T11. /gf
+loadsgf golois/Goemate990902-15.sgf
+12 owl_defend T11
+#? [1 T7]
+
+loadsgf golois/Goemate990902-3.sgf
+13 owl_attack J8
+#? [1 J7]*
+
+loadsgf golois/Goemate990902-3.sgf
+14 owl_attack G6
+#? [1 G7]
+
+loadsgf golois/Goemate990903-12.sgf
+15 owl_attack B17
+#? [0]
+
+#CATEGORY=SEMEAI
+#DESCRIPTION=
+#SEVERITY=
+# This is more of a semeai. /gf
+loadsgf golois/Goemate990903-5.sgf
+16 owl_attack M4
+#? [0]
+
+
+# tm - running out at E6 looks fine.
+loadsgf golois/Goemate990910-1.sgf
+17 owl_defend D3
+#? [1 (E2|E6)]
+
+loadsgf golois/Goemate990911-2.sgf
+18 owl_attack E2
+#? [1 F2]
+
+# S8, T8, T9 and T7 all work. S9 and T10 do not.
+loadsgf golois/Goemate990911-3.sgf
+19 owl_attack R8
+#? [1 (S8|T8|T9|T7)]
+
+# B can tenuki. J8 and H9 are miai.
+loadsgf golois/Goemate991106-3.sgf
+20 owl_defend K8
+#? [1 (H9|J8|PASS)]
+
+loadsgf golois/Goemate991106-4.sgf
+21 owl_defend L13
+#? [1 M15]
+
+loadsgf golois/Goemate991113-5.sgf
+22 owl_attack Q17
+#? [1 T18]*
+
+loadsgf golois/GoMaster991113-4.sgf
+23 owl_defend C3
+#? [1 B2]
+
+loadsgf golois/GoMaster991113-4.sgf
+24 owl_attack B12
+#? [0]
+
+loadsgf golois/GoMaster991113-5.sgf
+25 owl_defend B12
+#? [1 B11]
+
+loadsgf golois/GoStar991114-2.sgf
+26 owl_attack M6
+#? [1 M5]
+
+loadsgf golois/Handtalk980820-4.sgf
+27 owl_defend G2
+#? [1 (H2|F3)]*
+
+loadsgf golois/Handtalk980820-5.sgf
+28 owl_attack N17
+#? [0]
+
+loadsgf golois/Handtalk980820-7.sgf
+29 owl_attack C17
+#? [0]
+
+loadsgf golois/Handtalk980822-4.sgf
+30 owl_attack P3
+#? [0]
+
+loadsgf golois/Handtalk980826-1.sgf
+31 owl_attack C2
+#? [0]
+
+loadsgf golois/Indigo20000718-2.sgf
+32 owl_defend F2
+#? [1 F1]
+
+loadsgf golois/Indigo991109-4.sgf
+33 owl_attack C3
+#? [1 B2]
+
+loadsgf golois/Indigo-Golois-991105-1.sgf
+34 owl_attack E17
+#? [0]
+
+loadsgf golois/Jimmy990621-1.sgf
+35 owl_defend S12
+#? [1 T11]
+
+loadsgf golois/MeilleurCoup0001.sgf
+36 owl_attack K12
+#? [1 M12]
+
+loadsgf golois/MeilleurCoup0002.sgf
+37 owl_defend D4
+#? [1 B6]
+
+# db added A4
+loadsgf golois/MeilleurCoup0003.sgf
+38 owl_defend B8
+#? [1 (B6|A4)]
+
+# D7 is one point smaller, but also lives.
+loadsgf golois/MeilleurCoup0004.sgf
+39 owl_defend B6
+#? [1 (C6|D7)]
+
+loadsgf golois/MeilleurCoup0005.sgf
+40 owl_defend D9
+#? [1 E8]
+
+loadsgf golois/MeilleurCoup0007.sgf
+41 owl_defend B6
+#? [1 B4]
+
+loadsgf golois/Neurogo97-1.sgf
+42 owl_defend H2
+#? [1 (J3|G4|J2)]
+
+loadsgf golois/Neurogo97-1.sgf
+43 owl_attack H2
+#? [1 J2]
+
+loadsgf golois/Vivre990630-2.sgf
+44 owl_attack R9
+#? [1 S10]
+
+loadsgf golois/Vivre990630-3.sgf
+45 owl_attack C3
+#? [0]
+
+loadsgf golois/Vivre990630-4.sgf
+46 owl_attack G18
+#? [0]
+
+loadsgf golois/Vivre990706-1.sgf
+47 owl_attack R17
+#? [0]
+
+loadsgf golois/Vivre990706-2.sgf
+48 owl_defend S17
+#? [1 R19]
+
+loadsgf golois/Vivre990706-3.sgf
+49 owl_attack R17
+#? [0]
+
+# ko after B:G14 W:H15 B:G15 W:K17 B:J17 W:L16 B:J19 W:K19 /db
+# However, B:H15 lives quite handily.
+loadsgf golois/Vivre990706-4.sgf
+50 owl_defend F16
+#? [1 H15]
+
+loadsgf golois/Vivre990706-5.sgf
+51 owl_attack G3
+#? [0]
+
+loadsgf golois/Vivre990706-5.sgf
+52 owl_attack R17
+#? [0]
+
+loadsgf golois/Vivre990710-1.sgf
+53 owl_attack S15
+#? [0]
diff --git a/regression/view.pike b/regression/view.pike
new file mode 100644 (file)
index 0000000..de61b53
--- /dev/null
@@ -0,0 +1,1995 @@
+#!/usr/bin/env pike
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This distributed with GNU Go, a go program.                      * 
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 and 2006       *
+ * by the Free Software Foundation.                                  *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3             *
+ * or (at your option) any later version.                            *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+// Defaults:
+// linux
+    string sgf_viewer_command = "quarry %s";                                 
+// windows (for example)
+//  string sgf_viewer_command = "c:\\programs\\winmgt\\winmgt %s";     
+
+class GtpResponse
+{
+    string status;
+    string text;
+    
+    void create(string|void _status, string|void _text)
+    {
+       status = _status;
+       text = _text;
+    }
+
+    int success()
+    {
+       return status == "=";
+    }
+
+    int failure()
+    {
+       return status == "?";
+    }
+}
+
+class SimpleGtp
+{
+    static object engine;
+    static function crash_callback = 0;
+    function trace_callback = 0;
+    
+    Stdio.File engine_in;
+    Stdio.FILE engine_out;
+    Stdio.FILE engine_err;
+
+    string command_line;
+    
+    int id_number = 1;
+    
+    // Send a command to the go engine.
+    GtpResponse send_command(string s)
+    {
+       s = id_number + " " + s + "\n";
+       id_number++;
+       engine_in->write(s);
+       int first_line = 1;
+       GtpResponse response = GtpResponse();
+       while (1)
+       {
+           string s = engine_out->gets();
+           if (!s)
+           {
+               // FIXME: This is probably not adequate.
+               if (crash_callback)
+                   crash_callback();
+               engine_in->close();
+               engine_out->close();
+               break;
+           }
+
+           s -= "\r";
+           
+           if (first_line)
+           {
+               if (s == "")
+                   continue;
+               response->status = s[0..0];
+               first_line = 0;
+               sscanf(s[1..], "%*d %s", response->text);
+           }
+           else
+           {
+               if (s == "")
+                   break;
+               response->text += "\n" + s;
+           }
+       }
+       return response;
+    }
+
+    // Tell the program to stop playing.
+    void quit()
+    {
+       crash_callback = 0;
+       send_command("quit");
+    }
+    
+    static void program_trace_reader()
+    {
+       while (1)
+       {
+           string s = engine_err->gets();
+           if (!s)
+               break;
+           s -= "\r";
+           if (trace_callback)
+               trace_callback(s);
+       }
+       
+       engine_err->close();
+    }
+    
+    void create(array(string) program_start_array,
+               function|void crash_callback_)
+    {
+       command_line = program_start_array * " ";
+       crash_callback = crash_callback_;
+       engine_in = Stdio.File();
+       engine_out = Stdio.FILE();
+       engine_err = Stdio.FILE();
+       engine = Process.create_process(program_start_array,
+                                       (["stdin":engine_in->pipe(),
+                                         "stdout":engine_out->pipe(),
+                                         "stderr":engine_err->pipe()]));
+       thread_create(program_trace_reader);
+    }
+}
+
+class Goban
+{
+    constant letters = "ABCDEFGHJKLMNOPQRSTUVWXYZ" / "";
+    int boardsize;
+    int gobansize;
+    int spacing;
+    int offset;
+    Image.Fonts.Font font;
+    Image.Fonts.Font small_font;
+    array(string) white_stones;
+    array(string) black_stones;
+
+    class Markup(string vertex, string symbol, string color)
+    {
+       void draw(Image.Image image)
+       {
+           vertex = upper_case(vertex);
+           if (vertex == "PASS")
+               return;
+           [int x, int y] = vertex_to_pixel_coord(vertex);
+           image->setcolor(@Image.Color(color)->rgb());
+           if (sscanf(symbol, "text:%s", string text) == 1)
+           {
+               Image.Image text_image = font->write(text);
+               if (text_image->xsize() >= 0.9*spacing)
+                   text_image = small_font->write(text);
+               int width = text_image->xsize();
+               int height = text_image->ysize();
+               image->paste(text_image * 0 + ({220, 150, 50}), x - width / 2,
+                            y - height / 2);
+               image->paste_alpha_color(text_image, x - width / 2,
+                                        y - height / 2);
+           }
+           else
+           {
+               switch (symbol)
+               {
+               case "circle":
+                   image->circle(x, y, spacing / 3, spacing / 3);
+                   break;
+               case "square":
+                   int delta = spacing / 4;
+                   image->line(x - delta, y - delta, x - delta, y + delta);
+                   image->line(x - delta, y + delta, x + delta, y + delta);
+                   image->line(x + delta, y + delta, x + delta, y - delta);
+                   image->line(x + delta, y - delta, x - delta, y - delta);
+                   break;
+               case "big_square":
+                   delta = spacing / 2 - 1;
+                   image->line(x - delta, y - delta, x - delta, y + delta);
+                   image->line(x - delta, y + delta, x + delta, y + delta);
+                   image->line(x + delta, y + delta, x + delta, y - delta);
+                   image->line(x + delta, y - delta, x - delta, y - delta);
+                   break;
+               case "triangle":
+                   delta = spacing / 2 - 1;
+                   image->line(x - delta, y + delta, x + delta, y + delta);
+                   image->line(x + delta, y + delta, x, y - delta);
+                   image->line(x, y - delta, x - delta, y + delta);
+                   break;
+               case "dot":
+                   draw_disc(image, x, y, spacing / 6);
+                   break;
+               case "small_dot":
+                   draw_disc(image, x, y, spacing / 9);
+                   break;
+               case "big_dot":
+                   draw_disc(image, x, y, spacing / 4);
+                   break;
+               case "stone":
+                   draw_disc(image, x, y, spacing / 2, 0.5);
+                   break;
+               default:
+                   werror("Unknown symbol: " + symbol + "\n");
+                   break;
+               }
+           }
+       }
+    }
+
+    array(Markup) markups;
+    
+    static void create(int boardsize_, int gobansize_)
+    {
+       boardsize = boardsize_;
+       gobansize = gobansize_;
+       spacing = (int) (gobansize / (boardsize + 1.5));
+       offset = (gobansize - spacing * (boardsize - 1)) / 2;
+       font = Image.Fonts.Font(font_filename, spacing / 2);
+       small_font = Image.Fonts.Font(font_filename, spacing / 3);
+       white_stones = ({});
+       black_stones = ({});
+
+       markups = ({});
+    }
+
+    void add_stones(string color, string|array(string) stones)
+    {
+       if (color == "WHITE")
+           white_stones |= Array.arrayify(stones);
+       else if (color == "BLACK")
+           black_stones |= Array.arrayify(stones);
+    }
+
+    int occupied(string vertex)
+    {
+       return (has_value(white_stones, vertex)
+               || has_value(black_stones, vertex));
+    }
+    
+    void add_symbol(string vertex, string name, string color)
+    {
+       markups += ({Markup(upper_case(vertex), name, color)});
+    }
+    
+    void add_text(string vertex, string text, string color)
+    {
+       markups += ({Markup(upper_case(vertex), "text:" + text, color)});
+    }
+
+    void clear_markup()
+    {
+       markups = ({});
+    }
+    
+    Image.Image draw_board()
+    {
+       Image.Image board = Image.Image(gobansize, gobansize);
+       board = board->clear(220, 150, 50);
+
+       draw_grid(board);
+       
+       draw_hoshi_marks(board);
+
+       draw_letters_and_numbers(board);
+
+       foreach (black_stones, string stone)
+           draw_stone(board, "BLACK", stone);
+       foreach (white_stones, string stone)
+           draw_stone(board, "WHITE", stone);
+
+       markups->draw(board);
+       
+       return board;
+    }
+
+    static void draw_grid(Image.Image board)
+    {
+       int start = offset;
+       int end = start + (boardsize - 1) * spacing;
+       for (int k = 0; k < boardsize; k++)
+       {
+           int kth = start + k * spacing;
+           board->setcolor(0, 0, 0);
+           board->line(start, kth, end, kth);
+           board->line(kth, start, kth, end);
+       }
+    }
+    
+    static void draw_hoshi_marks(Image.Image board)
+    {
+       int a = 2 + (boardsize >= 12);
+       int b = boardsize - a - 1;
+       int c = boardsize / 2;
+       
+       if ((boardsize % 2 == 0 && boardsize >= 8)
+           || (boardsize % 2 == 1 && boardsize >= 9))
+       {
+           draw_disc(board, offset + a * spacing,
+                     offset + a * spacing, 0.1 * spacing);
+           draw_disc(board, offset + a * spacing,
+                     offset + b * spacing, 0.1 * spacing);
+           draw_disc(board, offset + b * spacing,
+                     offset + a * spacing, 0.1 * spacing);
+           draw_disc(board, offset + b * spacing,
+                     offset + b * spacing, 0.1 * spacing);
+       }
+       
+       if (boardsize % 2 == 1 && boardsize >= 5)
+           draw_disc(board, offset + c * spacing,
+                     offset + c * spacing, 0.1 * spacing);
+       
+       if (boardsize % 2 == 1 && boardsize >= 13)
+       {
+           draw_disc(board, offset + a * spacing,
+                     offset + c * spacing, 0.1 * spacing);
+           draw_disc(board, offset + b * spacing,
+                     offset + c * spacing, 0.1 * spacing);
+           draw_disc(board, offset + c * spacing,
+                     offset + a * spacing, 0.1 * spacing);
+           draw_disc(board, offset + c * spacing,
+                     offset + b * spacing, 0.1 * spacing);
+       }
+       
+    }
+    
+    static void draw_letters_and_numbers(Image.Image board)
+    {
+       int start = offset;
+       int end = start + (boardsize - 1) * spacing;
+       for (int k = 0; k < boardsize; k++)
+       {
+           int kth = start + k * spacing;
+           Image.Image number = font->write((string) (boardsize - k));
+           int width = number->xsize();
+           int height = number->ysize();
+           board->paste_alpha_color(number,
+                                    (start - spacing / 2 - width) / 2 - 1,
+                                    kth - height / 2 + 1);
+           board->paste_alpha_color(number,
+                                    end + (start + spacing / 2 - width) / 2 + 1,
+                                    kth - height / 2 + 1);
+           Image.Image letter = font->write(letters[k]);
+           width = letter->xsize();
+           height = letter->ysize();
+           board->paste_alpha_color(letter,
+                                    kth - width / 2,
+                                    (start - spacing / 2 - height) / 2 - 1);
+           board->paste_alpha_color(letter,
+                                    kth - width / 2,
+                                    end + (start + spacing / 2 - height) / 2 + 1);
+       }
+    }
+
+    static void draw_stone(Image.Image board, string color, string vertex)
+    {
+       int start = offset;
+       int x, y;
+       [x, y] = vertex_to_xy(upper_case(vertex));
+       
+       if (color == "BLACK")
+           board->setcolor(0, 0, 0);
+       else if (color == "WHITE")
+           board->setcolor(255, 255, 255);
+       else
+           board->setcolor(128, 128, 128);
+       
+       float radius = (spacing + 1) / 2.0;
+       draw_disc(board, start + x * spacing, start + y * spacing, radius);
+       
+    }
+
+    array(int) vertex_to_xy(string vertex)
+    {
+       int x = search(letters, vertex[0..0]);
+       int y = boardsize - (int) vertex[1..];
+       return ({x, y});
+    }
+
+    string xy_to_vertex(int x, int y)
+    {
+       return letters[x] + (boardsize - y);
+    }
+
+    static array(int) vertex_to_pixel_coord(string vertex)
+    {
+       [int x, int y] = vertex_to_xy(vertex);
+       return ({offset + x * spacing, offset + y * spacing});
+    }
+
+    string pixel_coord_to_vertex(int|float pixel_x, int|float pixel_y)
+    {
+       int x = (int) floor((pixel_x - offset + spacing / 2.0) / spacing);
+       int y = (int) floor((pixel_y - offset + spacing / 2.0) / spacing);
+       if (x < 0 || x >= boardsize || y < 0 || y >= boardsize)
+           return "";
+       return sprintf("%s%d", letters[x], boardsize - y);
+    }
+    
+    static void draw_disc(Image.Image image, int|float x, int|float y,
+                         int|float r, float|void alpha)
+    {
+       int N = 20;
+       x = (float) x;
+       y = (float) y;
+       r = (float) r;
+       if (!alpha)
+           alpha = 1.0;
+       array(float) coords = ({});
+       for (int k = 0; k < N; k++)
+           coords += ({r + 0.5 + r * cos(2 * 3.14159265 * k / N),
+                       r + 0.5 + r * sin(2 * 3.14159265 * k / N)});
+       Image.Image disc = Image.Image((int) ceil(2*r), (int) ceil(2*r));
+       disc->setcolor(255, 255, 255);
+       disc->polyfill(coords);
+       image->paste_alpha_color(disc*alpha, (int) (x - 0.5 * disc->xsize()),
+                                (int) (y - 0.5 * disc->ysize()));
+    }
+}
+
+string font_filename = "";
+
+int main(int argc, array(string) argv)
+{
+    if (argc < 2) {
+       werror("Usage: %s TEST-FILE:TEST-NUMBER\n", basename(argv[0]));
+       return 1;
+    }
+
+    if (!find_font())
+       return 1;
+
+    SimpleGtp engine = SimpleGtp("../interface/gnugo --quiet --mode gtp -w -t -d0x101840" / " ");
+    if (!engine)
+    {
+       werror("Failed to start engine.");
+       return 1;
+    }
+
+    GTK.setup_gtk(argv);
+    Controller controller = Controller(engine, argv[1..]);
+
+    GTK.main();
+
+    return 0;
+}
+
+
+array(string) recursive_find_files(string dir, string suffix)
+{
+    array(string) found_files = ({});
+    if (!get_dir(dir))
+       return ({});
+    foreach (get_dir(dir), string filename)
+    {
+       string full_name = dir + "/" + filename;
+       if (Stdio.is_dir(full_name))
+           found_files += recursive_find_files(full_name, suffix);
+       else if (has_suffix(filename, suffix))
+           found_files += ({full_name});
+    }
+    return found_files;
+}
+
+int find_font()
+{
+    if (getenv("GNUGO_FONT"))
+    {
+       font_filename = getenv("GNUGO_FONT");
+       return 1;
+    }
+
+    // Search for fonts below /usr/share/fonts.
+    array(string) font_files = recursive_find_files("/usr/share/fonts",
+                                                   ".ttf");
+    if (sizeof(font_files) == 0)
+       font_files = recursive_find_files("/usr/share/fonts", ".pfb");
+
+    if (sizeof(font_files) == 0)
+    {
+       werror("No font found while searching below /usr/share/fonts.\n");
+       werror("Locate a font file with suffix .ttf (truetype) or .pfb (type1)\n");
+       werror("and point to it from the environment variable GNUGO_FONT.\n");
+       return 0;
+    }
+
+    // Compute the length of the filename proper, i.e. without the
+    // path to the file.
+    int fontlength(string s) {
+       return sizeof((s / "/")[-1]);
+    };
+    
+    // Choose the one with shortest name (arbitrary but may avoid e.g.
+    // italic fonts).
+    font_filename = font_files[0];
+    foreach (font_files[1..], string font_file)
+    {
+       if (fontlength(font_filename) > fontlength(font_file))
+           font_filename = font_file;
+       else if (fontlength(font_filename) == fontlength(font_file)
+                && has_value(lower_case(font_filename), "mono"))
+           font_filename = font_file;
+    }
+
+    return 1;
+}
+
+class RegressionViewer
+{
+    Goban goban;
+    SimpleGtp engine;
+    array(string) traces;
+
+    GTK.Widget goban_widget;
+    GTK.Widget data_widget;
+
+    GTK.ScrolledWindow scrolled_data_window;
+    GTK.Image gtk_image;
+    GDK.Image gdk_image;
+    GTK.Clist clist;
+
+    Controller parent; //Evil. Used for callbacks.
+
+    mapping(string:array(string)) worms = ([]);
+    mapping(string:array(string)) dragons = ([]);
+    int worms_initialized = 0;
+    int dragons_initialized = 0;
+
+    string name;
+    string result;
+    string testcase_command;
+    array(string) complete_test;
+
+    function on_board_click_callback;
+
+    static void create(SimpleGtp engine_,
+                      array(string) complete_test_, string testcase_command_,
+                      function callback, string name_,
+                      Controller parent_)
+    {
+       engine = engine_;
+       parent = parent_;
+       complete_test = complete_test_;
+        testcase_command = testcase_command_;
+       name = name_;
+
+       load_testcase();
+       werror("%s\n", send_command("showboard"));
+       int boardsize = (int) send_command("query_boardsize");
+       on_board_click_callback = callback;
+
+       setup_board(boardsize);
+
+       scrolled_data_window = GTK.ScrolledWindow();
+       scrolled_data_window->set_policy(GTK.POLICY_AUTOMATIC,
+                                        GTK.POLICY_AUTOMATIC);
+
+       clist = GTK.Clist(3);
+       scrolled_data_window->add(clist);
+       handle_testcase();
+    }
+
+    static void setup_board(int boardsize)
+    {
+       goban = Goban(boardsize, 600);
+       goban->add_stones("WHITE", send_command("list_stones white") / " ");
+       goban->add_stones("BLACK", send_command("list_stones black") / " ");
+       Image.Image im = goban->draw_board();
+
+       gdk_image = GDK.Image(0)->set(im);
+       gtk_image = GTK.Image(gdk_image);
+       goban_widget = GTK.EventBox()->add(gtk_image);
+       goban_widget->add_events(GDK.ButtonPressMask);
+       goban_widget->add_events(GDK.KeyPressMask);
+       goban_widget->signal_connect_new("button_press_event",
+                                        button_pressed_on_board);
+       goban_widget->signal_connect_new("key_press_event",
+                                        key_pressed_on_board);
+    }
+
+
+    void new_testcase(array(string) complete_test_, string testcase_command_)
+    {
+       werror("Loading new testcase.\n");
+        worms_initialized = 0;
+        dragons_initialized = 0;
+        result = "";
+        worms = ([]);
+        dragons = ([]);
+
+        complete_test = complete_test_;
+       testcase_command = testcase_command_;
+
+       load_testcase();
+       werror("%s\n", send_command("showboard"));
+       int boardsize = (int) send_command("query_boardsize");
+
+       werror("Loaded new testcase.\n");
+       goban = Goban(boardsize, 600);
+       goban->add_stones("WHITE", send_command("list_stones white") / " ");
+       goban->add_stones("BLACK", send_command("list_stones black") / " ");
+       redraw_board();
+    }
+
+
+    static void load_testcase()
+    {
+       foreach(complete_test, string testline) {
+           werror(testline + "\n");
+           if (!has_value("0123456789 #", testline[0..0]))
+               send_command(testline);
+        }
+    }
+
+    void handle_testcase()
+    {
+       traces = ({});
+       engine->trace_callback = collect_traces;
+        result = send_command(testcase_command);
+       redraw_board();
+       engine->trace_callback = 0;
+    }
+
+    static void collect_traces(string s)
+    {
+       traces += ({s});
+    }
+    
+    void get_dragons()
+    {
+        foreach (send_command("dragon_stones") / "\n", string dragon)
+            dragons[(dragon / " ")[0]] = dragon / " " - ({""});
+        dragons_initialized = 1;
+    }
+
+    static void get_worms()
+    {
+       foreach (send_command("worm_stones") / "\n", string worm)
+           worms[(worm / " ")[0]] = worm / " " - ({""});
+       worms_initialized = 1;
+    }
+       
+    
+    void add_markup(int mode)
+    {
+       goban->clear_markup();
+       if (mode <= 4) {
+           function add_suitable_markup = ({add_worms_and_dragons_markup,
+                                            add_move_generation_markup,
+                                            add_eyes_markup,
+                                            add_influence_markup,
+                                            add_reading_markup})[mode];
+           add_suitable_markup();
+           redraw_board();
+       }
+    }
+    
+    static void add_worms_and_dragons_markup()
+    {
+       mapping status_colors = (["alive":"green",
+                                 "critical":"yellow",
+                                 "dead":"red",
+                                 "unknown":"blue"]);
+       mapping safety_colors = (["alive":"green",
+                                 "critical":"yellow",
+                                 "dead":"red",
+                                 "tactically dead":"brown",
+                                 "alive in seki":"cyan",
+                                 "strongly alive":"blue",
+                                 "invincible":"purple",
+                                 "inessential":"orange"]);
+       
+       if (parent->dragon_status_button->get_active())
+       {
+            if (!dragons_initialized)
+                get_dragons();
+           foreach (dragons; string dragon; array(string) stones)
+           {
+               string status = get_worm_or_dragon_data("dragon", "status",
+                                                       dragon);
+               foreach (stones, string stone)
+                   goban->add_symbol(stone, "dot",
+                                     status_colors[status]);
+           }
+       }
+       else if (parent->dragon_safety_button->get_active())
+       {
+            if (!dragons_initialized)
+                get_dragons();
+           foreach (dragons; string dragon; array(string) stones)
+           {
+               string safety = get_worm_or_dragon_data("dragon", "safety",
+                                                       dragon);
+               foreach (stones, string stone)
+                   goban->add_symbol(stone, "dot",
+                                     safety_colors[safety]);
+           }
+       }
+       else if (parent->worm_status_button->get_active())
+       {
+            if (!worms_initialized)
+                get_worms();
+           foreach (worms; string worm; array(string) stones)
+           {
+               string attack = get_worm_or_dragon_data("worm", "attack_code",
+                                                       worm);
+               string defense = get_worm_or_dragon_data("worm",
+                                                        "defense_code", worm);
+               string status = "alive";
+               if (attack != "0")
+               {
+                   if (defense == "0")
+                       status = "dead";
+                   else
+                       status = "critical";
+               }
+               
+               foreach (stones, string stone)
+                   goban->add_symbol(stone, "dot",
+                                     status_colors[status]);
+           }
+       }
+    }
+    
+    static void add_move_generation_markup()
+    {
+       if ((parent->top_moves_button->get_active()
+            || parent->all_moves_button->get_active())
+           && (has_prefix(testcase_command, "reg_genmove")
+               || has_prefix(testcase_command, "restricted_genmove")))
+       {
+           string color = "green";
+           string answers = parent->expected_result;
+           if (answers[0..0] == "!") {
+               answers = answers[1..];
+               color = "red";
+           }
+           if (has_prefix(testcase_command, "restricted_genmove"))
+           {
+               foreach ((testcase_command / " ")[2..], string allowed_move)
+               {
+                   if (color == "green" ^ has_value(answers, allowed_move))
+                       goban->add_symbol(allowed_move, "triangle", "red");
+                   else
+                       goban->add_symbol(allowed_move, "triangle", "green");
+               }
+           }
+           else
+               foreach (answers / "|" - ({""}), string answer)
+                   goban->add_symbol(answer, "big_square", color);
+
+           
+           color = (testcase_command / " ")[1];
+           goban->add_symbol(result, "stone", color);
+       }
+
+       if (parent->top_moves_button->get_active())
+       {
+           array(string) top_moves = send_command("top_moves") / " ";
+           for (int k = 0; k < sizeof(top_moves) / 2; k++)
+               goban->add_text(top_moves[2 * k],
+                               top_moves[2 * k + 1], "blue");
+       }
+       else if (parent->all_moves_button->get_active())
+       {
+           array(string) all_moves = send_command("all_move_values") / "\n";
+           foreach (all_moves, string move_value)
+           {
+               sscanf(move_value, "%s%*[ ]%s", string vertex, string value);
+               goban->add_text(vertex, value, "blue");
+           }       
+       }
+       else if (parent->delta_territory_button->get_active()
+                && parent->delta_territory_move != "PASS")
+       {
+           goban->add_symbol(parent->delta_territory_move, "stone", "gray");
+           parent->delta_territory_button_text
+                       ->set_text("delta territory for "
+                                  + parent->delta_territory_move);
+           clist->clear();
+
+           int k;
+           for (k = sizeof(traces) - 1; k >= 0; k--)
+           {
+               if (sscanf(traces[k], "  " + parent->delta_territory_move
+                          + ": %*f - change in territory%*s") == 2
+                   && !has_value(traces[k], "cached"))
+                   break;
+           }
+           if (k >= 0)
+           {
+               clist->append(({traces[k], "", ""}));
+               for (k--; k >= 0; k--)
+               {
+                   if (sscanf(traces[k], "    %*s:   - %*s") < 2)
+                       break;
+
+                   clist->prepend(({traces[k], "", ""}));
+                   if (sscanf(traces[k],
+                              "    %*s:   - %s territory change %s ",
+                              string vertex, string value) == 3)
+                   {
+                       goban->add_text(vertex, value,
+                                       (float) value < 0.0 ? "red" : "blue");
+                   }
+               }
+           }
+           clist->columns_autosize();
+           parent->set_title(this_object(),
+                             ("Delta territory for "
+                              + parent->delta_territory_move));
+       }
+    }
+
+    static mapping(string:mapping(string:string)) eye_data = 0;
+    static mapping(string:string) half_eye_data = ([]);
+    static mapping(string:mapping(string:string)) eye_types = 0;
+    
+    static void add_eyes_markup()
+    {
+       if (!eye_data)
+       {
+           eye_data = (["white":([]), "black":([])]);
+           eye_types = (["white":([]), "black":([])]);
+           for (int y = 0; y < goban->boardsize; y++)
+           {
+               for (int x = 0; x < goban->boardsize; x++)
+               {
+                   string vertex = goban->xy_to_vertex(x, y);
+                   multiset(string) is_marginal = (<>);
+                   foreach (({"white", "black"}), string color)
+                   {
+                       string this_eye = send_command("eye_data " + color +
+                                                      " " + vertex);
+                       if (!Regexp("origin +PASS")->match(this_eye))
+                       {
+                           eye_data[color][vertex] = this_eye;
+                           if (Regexp("marginal +1")->match(this_eye))
+                               is_marginal[color] = 1;
+                       }
+                   }
+
+                   if (!eye_data["white"][vertex]
+                       && !eye_data["black"][vertex])
+                       continue;
+                   
+                   string half_eye = send_command("half_eye_data " + vertex);
+                   if (!Regexp("type +0")->match(half_eye))
+                       half_eye_data[vertex] = half_eye;
+
+                   foreach (({"white", "black"}), string color)
+                   {
+                       if (!eye_data[color][vertex])
+                           continue;
+                       if (is_marginal[color])
+                           eye_types[color][vertex] = "marginal";
+                       else if (Regexp("type +HALF_EYE")->match(half_eye))
+                           eye_types[color][vertex] = "half";
+                       else
+                           eye_types[color][vertex] = "proper";
+                   }
+               }
+           }
+       }
+
+       string color;
+       if (parent->white_eyes_button->get_active())
+           color = "white";
+       else
+           color = "black";
+
+       foreach (eye_types[color]; string vertex; string eye_type)
+       {
+           mapping (string:string) grayish = (["white" : "#c0c0c0",
+                                               "black" : "#404040"]);
+           if (eye_type == "proper")
+               goban->add_symbol(vertex, "big_dot", color);
+           else if (eye_type == "half")
+               goban->add_symbol(vertex, "big_dot", grayish[color]);
+           else
+               goban->add_symbol(vertex, "dot", grayish[color]);
+       }
+    }
+    
+    static void add_influence_markup()
+    {
+       string command;
+       string what_data;
+       if (parent->initial_w_influence_dragons_known_button->get_active())
+           command = "initial_influence white";
+       else if (parent->initial_b_influence_dragons_known_button->get_active())
+           command = "initial_influence black";
+       else if (parent->after_move_influence_button->get_active())
+       {
+           if (parent->move_influence_move == "PASS")
+               return;
+           command = sprintf("move_influence %s %s",
+                             parent->current_move_color,
+                             parent->move_influence_move);
+           goban->add_symbol(parent->move_influence_move, "stone", "gray");
+       }
+       else if (parent->followup_influence_button->get_active())
+       {
+           if (parent->move_influence_move == "PASS")
+               return;
+           command = sprintf("followup_influence %s %s",
+                             parent->current_move_color,
+                             parent->move_influence_move);
+           goban->add_symbol(parent->move_influence_move, "stone", "gray");
+       }
+
+       if (parent->influence_regions_button->get_active())
+           what_data = "influence_regions";
+       if (parent->territory_value_button->get_active())
+           what_data = "territory_value";
+       else if (parent->white_influence_button->get_active())
+           what_data = "white_influence";
+       else if (parent->black_influence_button->get_active())
+           what_data = "black_influence";
+       else if (parent->white_influence_button->get_active())
+           what_data = "white_influence";
+       else if (parent->black_influence_button->get_active())
+           what_data = "black_influence";
+       else if (parent->white_strength_button->get_active())
+           what_data = "white_strength";
+       else if (parent->black_strength_button->get_active())
+           what_data = "black_strength";
+       else if (parent->white_permeability_button->get_active())
+           what_data = "white_permeability";
+       else if (parent->black_permeability_button->get_active())
+           what_data = "black_permeability";
+       else if (parent->white_attenuation_button->get_active())
+           what_data = "white_attenuation";
+       else if (parent->black_attenuation_button->get_active())
+           what_data = "black_attenuation";
+       else if (parent->non_territory_button->get_active())
+           what_data = "non_territory";
+
+       string result = send_command(command + " " + what_data);
+       array(string) values = (replace(result, "\n", " ") / " ") - ({""});
+       int k = 0;
+       for (int y = 0; y < goban->boardsize; y++)
+       {
+           for (int x = 0; x < goban->boardsize; x++)
+           {
+               string vertex = goban->xy_to_vertex(x, y);
+               if (what_data == "influence_regions")
+               {
+                   int value = (int) values[k];
+                   mapping(int:string) sizes = ([3:"big_dot",
+                                                 2:"big_dot",
+                                                 1:"dot",
+                                                 -1:"dot",
+                                                 -2:"big_dot",
+                                                 -3:"big_dot"]);
+                   mapping(int:string) colors = ([3:"white",
+                                                  2:"#c0c0c0",
+                                                  1:"#c0c0c0",
+                                                  -1:"#404040",
+                                                  -2:"#404040",
+                                                  -3:"black"]);
+                   if (sizes[value])
+                       goban->add_symbol(vertex, sizes[value], colors[value]);
+               }
+               else if (has_value(what_data, "permeability"))
+               {
+                   if ((float) values[k] != 1.0)
+                       goban->add_text(vertex, values[k], "blue");
+               }
+               else if (what_data == "non_territory")
+               {
+                   if (!goban->occupied(vertex))
+                   {
+                       int value = (int) values[k];
+                       if (value == 1)
+                           goban->add_symbol(vertex, "dot", "black");
+                       else if (value == 2)
+                           goban->add_symbol(vertex, "dot", "white");
+                       else if (value == 0)
+                           goban->add_symbol(vertex, "dot", "gray");
+                   }
+               }
+               else if ((float) values[k] > 0.0)
+                   goban->add_text(vertex, values[k], "blue");
+               else if ((float) values[k] < 0.0)
+                   goban->add_text(vertex, values[k], "red");
+
+               k++;
+           }
+       }
+    }
+    
+    static void add_reading_markup()
+    {
+       if ((parent->connection_reading_button->get_active()
+            || parent->semeai_reading_button->get_active())
+           && parent->first_vertex != "")
+           goban->add_symbol(parent->first_vertex,
+                             "big_dot", "green");
+    }
+    
+    void redraw_board()
+    {
+       gdk_image->set(goban->draw_board());
+       gtk_image->queue_draw();
+    }
+
+    void show_worm_data(string vertex)
+    {
+       string worm_data = send_command("worm_data " + vertex);
+       clist->clear();
+       foreach ((worm_data / "\n")[1..], string data_item)
+       {
+           sscanf(data_item, "%s%*[ ]%s", string field, string value);
+           clist->append(({field, value, ""}));
+       }
+       clist->columns_autosize();
+       parent->set_title(this_object(), "Worm data for " + vertex);
+    }
+
+    void show_dragon_data(string vertex, int part)
+    {
+       string dragon_data = send_command("dragon_data " + vertex);
+       clist->clear();
+       
+       array(string) selected_data;
+       if (part == 1)
+           selected_data = (dragon_data / "\n")[1..20];
+       else
+           selected_data = (dragon_data / "\n")[21..];
+       
+       foreach (selected_data, string data_item)
+       {
+           sscanf(data_item, "%s%*[ ]%s", string field, string value);
+           clist->append(({field, value, ""}));
+       }
+       clist->columns_autosize();
+       parent->set_title(this_object(), "Dragon data for " + vertex);
+    }
+
+    void show_move_reasons(string vertex)
+    {
+       string move_reasons = send_command("move_reasons " + vertex);
+       clist->clear();
+
+       foreach ((move_reasons / "\n"), string move_reason)
+           clist->append(({move_reason, "", ""}));
+
+       int k;
+       for (k = sizeof(traces) - 1; k >= 0; k--)
+       {
+           if (sscanf(traces[k], "Move generation values "
+                      + vertex + " to %*s") == 1)
+               break;
+       }
+       if (k >= 0)
+       {
+           array(string) interesting_lines = ({traces[k]});
+           for (k--; k >= 0; k--)
+           {
+               if (sscanf(traces[k], "  " + vertex + ": %*s") == 1)
+                   interesting_lines += ({traces[k]});
+               else if (sscanf(traces[k], "    " + vertex + ": %*s") != 1)
+                   break;
+           }
+           clist->append(({"", "", ""}));
+           foreach (reverse(interesting_lines), string line)
+               clist->append(({line, "", ""}));
+       }
+
+       int first_pattern = 1;
+       int add_continuation_lines = 0;
+       foreach (traces, string line)
+       {
+           if (sscanf(line, "pattern %*s matched at " + vertex + "%s",
+                      string s) == 2
+               && s == "")
+           {
+               if (first_pattern)
+               {
+                   clist->append(({"", "", ""}));
+                   first_pattern = 0;
+               }
+               add_continuation_lines = 1;
+               clist->append(({line, "", ""}));
+           }
+           else if (has_prefix(line, "...") && add_continuation_lines)
+               clist->append(({line, "", ""}));
+           else
+               add_continuation_lines = 0;
+       }
+
+       /* Look for blunder devaluation */
+       foreach (traces, string line) 
+           if (has_prefix(line, "Move at " + vertex + " is"))
+               clist->append(({line, "", ""}));
+
+       clist->columns_autosize();
+       parent->set_title(this_object(), "Move reasons for " + vertex);
+    }
+    
+    void show_eye_data(string vertex)
+    {
+       clist->clear();
+
+       string color;
+       if (parent->white_eyes_button->get_active())
+           color = "white";
+       else
+           color = "black";
+
+       if (eye_data[color][vertex])
+       {
+           foreach (eye_data[color][vertex] / "\n", string data_item)
+           {
+               sscanf(data_item, "%s%*[ ]%s", string field, string value);
+               clist->append(({field, value, ""}));
+           }
+           if (half_eye_data[vertex])
+           {
+               clist->append(({"", "", ""}));
+               foreach (half_eye_data[vertex] / "\n", string data_item)
+               {
+                   sscanf(data_item, "%s%*[ ]%s", string field, string value);
+                   clist->append(({field, value, ""}));
+               }
+           }
+       }
+       
+       clist->columns_autosize();
+       parent->set_title(this_object(), color + " eye data for " + vertex);
+    }
+
+   
+    static void button_pressed_on_board(GDK.Event event)
+    {
+//     werror("Button: %O\n", (mapping) event);
+       string vertex = goban->pixel_coord_to_vertex(event->x, event->y);
+        on_board_click_callback(vertex);
+    }
+
+    static void key_pressed_on_board(GDK.Event event)
+    {
+//     werror("Key: %O\n", (mapping) event);
+       // First thing to find out is what the event object contains and
+       // how we can get the mouse position when the key was pressed.
+    }
+    
+    string send_command(string command)
+    {
+       string result;
+       result = engine->send_command(command)->text;
+       return result;
+    }
+
+    mapping(string:string) worm_and_dragon_cache = ([]);
+
+    static string get_worm_or_dragon_data(string worm_or_dragon, string field,
+                                         string vertex)
+    {
+       string command = worm_or_dragon + "_data " + vertex;
+       string data = worm_and_dragon_cache[command];
+       if (!data)
+       {
+           data = send_command(command);
+           worm_and_dragon_cache[command] = data;
+       }
+       
+       foreach (data / "\n", string row)
+           if (has_prefix(row, field))
+           {
+               sscanf(row, "%*s%*[ ]%s", string value);
+               return value;
+           }
+       
+       return "";
+    }
+
+    void do_reading(string reset_counter, string get_counter,
+                   string sgffilename, string sgf_viewer_cmd,
+                   string first_command, string second_command)
+    {
+       string result;
+       send_command("clear_cache");
+        if (sizeof(parent->viewers) > 1)
+            sgffilename += "." + replace(name, " ", "_");
+       if (sgffilename != "")
+           send_command("start_sgftrace");
+
+       send_command(reset_counter);
+       result = send_command(first_command);
+       clist->append(({first_command, result,
+                       "(" + send_command(get_counter) + " nodes)"}));
+       
+       if (result[0..0] != "0" && second_command != "")
+       {
+           send_command(reset_counter);
+           string result = send_command(second_command);
+           clist->append(({second_command, result,
+                           "(" + send_command(get_counter) + " nodes)"}));
+       }
+       if (sgffilename != "")
+           send_command("finish_sgftrace " + sgffilename);
+        if (sgf_viewer_cmd != "")
+            Process.create_process(sprintf(sgf_viewer_cmd, sgffilename)
+                                   / " ");
+       clist->columns_autosize();
+       parent->set_title(this_object(), "Reading result");
+     }
+}
+
+
+class Controller
+{
+    array(RegressionViewer) viewers = ({});
+    array(GTK.Widget) viewer_title_widgets = ({});
+
+    string current_move_color = "";
+    
+    GTK.Window main_window;
+    GTK.Notebook controller_notebook;
+    GTK.Notebook gobans_notebook;
+    GTK.Notebook data_notebook;
+    GTK.Notebook selector_notebook;
+
+    GTK.ScrolledWindow scrolled_testcase_text;
+    GTK.Label testcase_text;
+
+    GTK.RadioButton worm_data_button;
+    GTK.RadioButton dragon_data1_button;
+    GTK.RadioButton dragon_data2_button;
+    GTK.RadioButton worm_status_button;
+    GTK.RadioButton dragon_status_button;
+    GTK.RadioButton dragon_safety_button;
+    
+    GTK.RadioButton top_moves_button;
+    GTK.RadioButton all_moves_button;
+    GTK.RadioButton delta_territory_button;
+    GTK.Label delta_territory_button_text;
+    
+//    GTK.RadioButton initial_w_influence_dragons_unknown_button;
+//    GTK.RadioButton initial_b_influence_dragons_unknown_button;
+    GTK.RadioButton initial_w_influence_dragons_known_button;
+    GTK.RadioButton initial_b_influence_dragons_known_button;
+    GTK.RadioButton after_move_influence_button;
+    GTK.Label after_move_influence_button_text;
+    GTK.RadioButton followup_influence_button;
+    GTK.Label followup_influence_button_text;
+    GTK.RadioButton influence_regions_button;
+    GTK.RadioButton territory_value_button;
+    GTK.RadioButton white_influence_button;
+    GTK.RadioButton black_influence_button;
+    GTK.RadioButton white_strength_button;
+    GTK.RadioButton black_strength_button;
+    GTK.RadioButton white_permeability_button;
+    GTK.RadioButton black_permeability_button;
+    GTK.RadioButton white_attenuation_button;
+    GTK.RadioButton black_attenuation_button;
+    GTK.RadioButton non_territory_button;
+
+    GTK.RadioButton white_eyes_button;
+    GTK.RadioButton black_eyes_button;
+    
+    GTK.RadioButton tactical_reading_button, owl_reading_button,
+       owl_does_attack_button, owl_does_defend_button,
+       connection_reading_button, semeai_reading_button;
+    GTK.CheckButton sgf_traces_button, sgf_viewer_button;
+    GTK.Entry sgf_filename_entry, sgf_viewer_entry;
+    GTK.Table sgf_stuff;
+    GTK.Button new_testcase_button, new_engine_button;
+    GTK.Button next_testcase_button, prev_testcase_button;
+    GTK.Entry new_testcase_entry, engine_path_entry, engine_name_entry;
+    
+    string delta_territory_move = "PASS";
+    string move_influence_move = "PASS";
+    string first_vertex = "";
+
+    int testcase_index = 0;
+
+    array(string) testcases;
+    string testcase_name;
+    string testcase_command;
+    string result;
+    string expected_result;
+
+    // All lines from the test file shown at the top of the control window.
+    array(string) full_testcase;
+
+    // All lines from the test file which may be needed to load the
+    // testcase correctly.
+    array(string) complete_testcase;
+
+    static mixed nasty_signal_id;
+
+    static void create(SimpleGtp engine_, array(string) testcases_)
+    {
+       testcases = testcases_;
+       if (!excerpt_testcase(testcases[0], engine_))
+       {
+           werror("Failed to load testcase.\n");
+           exit(1);
+       }
+       testcase_name = testcases[0];
+
+       scrolled_testcase_text
+            = GTK.ScrolledWindow(GTK.Adjustment(), GTK.Adjustment())
+               ->set_policy(GTK.POLICY_AUTOMATIC, GTK.POLICY_AUTOMATIC)
+                ->set_usize(450, 100);
+        testcase_text = GTK.Label(full_testcase * "\n")
+                       ->set_justify(GTK.JUSTIFY_LEFT)
+                       ->set_alignment(0.0, 0.0);
+       scrolled_testcase_text->add(testcase_text);
+
+       main_window = GTK.Window(GTK.WindowToplevel);
+       controller_notebook = GTK.Notebook();
+       controller_notebook->set_tab_pos(GTK.POS_LEFT);
+
+       gobans_notebook   = (GTK.Notebook()
+                            ->set_show_tabs(0));
+       data_notebook     = (GTK.Notebook()
+                            ->set_show_tabs(0)
+                            ->set_show_border(0));
+       selector_notebook = (GTK.Notebook()
+                            ->set_tab_pos(GTK.POS_TOP));
+       selector_notebook->signal_connect_new("switch_page", change_engine);
+
+       GTK.Widget main_window_contents
+           = (GTK.Vbox(0, 0)
+              ->pack_start(GTK.Hbox(0, 24)
+                           ->pack_start(scrolled_testcase_text, 0, 0, 24)
+                           ->pack_start(GTK.Alignment(0.0, 0.5, 0.0, 0.0)
+                                        ->add(selector_notebook),
+                                        0, 0, 0),
+                           0, 0, 0)
+              ->add(GTK.Hbox(0, 2)
+                    ->add(GTK.Vbox(0, 6)
+                          ->pack_start(controller_notebook, 0, 0, 0)
+                          ->add(data_notebook))
+                    ->pack_start(GTK.Alignment(0.0, 0.0, 0.0, 0.0)
+                                 ->add(gobans_notebook),
+                                 0, 0, 0)));
+       main_window->add(main_window_contents);
+
+       main_window->set_title(testcases[0]);
+       main_window->signal_connect_new("destroy", quit);
+
+       if (has_prefix(testcase_command, "reg_genmove")
+           || has_prefix(testcase_command, "restricted_genmove"))
+       {
+           sscanf(testcase_command, "%*s %s", string color);
+           if (lower_case(color[0..0]) == "w")
+               current_move_color = "white";
+           else
+               current_move_color = "black";
+       }
+
+       worm_data_button = GTK.RadioButton("worm data");
+       dragon_data1_button = GTK.RadioButton("dragon data, part 1",
+                                             worm_data_button);
+       dragon_data2_button = GTK.RadioButton("dragon data, part 2",
+                                             worm_data_button);
+
+       worm_status_button = GTK.RadioButton("worm status");
+       dragon_status_button = GTK.RadioButton("dragon status",
+                                              worm_status_button);
+       dragon_safety_button = GTK.RadioButton("dragon safety",
+                                              worm_status_button);
+       worm_status_button->signal_connect_new("clicked",
+                                              markup_button_pressed);
+       dragon_status_button->signal_connect_new("clicked",
+                                                markup_button_pressed);
+       dragon_safety_button->signal_connect_new("clicked",
+                                                markup_button_pressed);
+
+       top_moves_button = GTK.RadioButton("top moves");
+       all_moves_button = GTK.RadioButton("all moves", top_moves_button);
+       delta_territory_button_text = GTK.Label("delta territory for PASS");
+       delta_territory_button_text->set_alignment(0.0, 0.0);
+       delta_territory_button = GTK.RadioButton(0, top_moves_button);
+       delta_territory_button->add(delta_territory_button_text);
+       top_moves_button->signal_connect_new("clicked", markup_button_pressed);
+       all_moves_button->signal_connect_new("clicked", markup_button_pressed);
+       delta_territory_button->signal_connect_new("clicked",
+                                                  markup_button_pressed);
+
+       white_eyes_button = GTK.RadioButton("white eyes");
+       black_eyes_button = GTK.RadioButton("black eyes", white_eyes_button);
+       white_eyes_button->signal_connect_new("clicked",
+                                             markup_button_pressed);
+       black_eyes_button->signal_connect_new("clicked",
+                                             markup_button_pressed);
+       
+//       initial_w_influence_dragons_unknown_button =
+//           GTK.RadioButton("white influence, dragons unknown");
+//       initial_b_influence_dragons_unknown_button =
+//           GTK.RadioButton("black influence, dragons unknown",
+//                           initial_w_influence_dragons_unknown_button);
+       initial_w_influence_dragons_known_button =
+           GTK.RadioButton("white influence, dragons known");
+       initial_b_influence_dragons_known_button =
+           GTK.RadioButton("black influence, dragons known",
+                           initial_w_influence_dragons_known_button);
+       after_move_influence_button_text =
+           GTK.Label("after move influence for PASS");
+       after_move_influence_button_text->set_alignment(0.0, 0.0);
+       after_move_influence_button =
+           GTK.RadioButton(0, initial_w_influence_dragons_known_button);
+       after_move_influence_button->add(after_move_influence_button_text);
+       followup_influence_button_text =
+           GTK.Label("followup influence for PASS");
+       followup_influence_button_text->set_alignment(0.0, 0.0);
+       followup_influence_button =
+           GTK.RadioButton(0, initial_w_influence_dragons_known_button);
+       followup_influence_button->add(followup_influence_button_text);
+       influence_regions_button = GTK.RadioButton("influence regions");
+       territory_value_button = GTK.RadioButton("territory value",
+                                                influence_regions_button);
+       white_influence_button = GTK.RadioButton("white influence",
+                                                influence_regions_button);
+       black_influence_button = GTK.RadioButton("black influence",
+                                                influence_regions_button);
+       white_strength_button = GTK.RadioButton("white strength",
+                                               influence_regions_button);
+       black_strength_button = GTK.RadioButton("black strength",
+                                               influence_regions_button);
+       white_permeability_button = GTK.RadioButton("white permeability",
+                                                   influence_regions_button);
+       black_permeability_button = GTK.RadioButton("black permeability",
+                                                   influence_regions_button);
+       white_attenuation_button = GTK.RadioButton("white attenuation",
+                                                  influence_regions_button);
+       black_attenuation_button = GTK.RadioButton("black attenuation",
+                                                  influence_regions_button);
+       non_territory_button = GTK.RadioButton("non-territory",
+                                              influence_regions_button);
+       ({initial_w_influence_dragons_known_button,
+         initial_b_influence_dragons_known_button,
+         after_move_influence_button,
+         followup_influence_button,
+         influence_regions_button,
+         territory_value_button,
+         white_influence_button,
+         black_influence_button,
+         white_strength_button,
+         black_strength_button,
+         white_permeability_button,
+         black_permeability_button,
+         white_attenuation_button,
+         black_attenuation_button,
+         non_territory_button})->signal_connect_new("clicked",
+                                                    markup_button_pressed);
+       
+       
+       tactical_reading_button = GTK.RadioButton("tactical reading");
+       owl_reading_button = GTK.RadioButton("owl reading",
+                                            tactical_reading_button);
+        owl_does_attack_button = GTK.RadioButton("owl_does_attack",
+                                                 tactical_reading_button);
+        owl_does_defend_button = GTK.RadioButton("owl_does_defend",
+                                                 tactical_reading_button);
+       connection_reading_button = GTK.RadioButton("connection reading",
+                                                   tactical_reading_button);
+       semeai_reading_button = GTK.RadioButton("semeai reading",
+                                               tactical_reading_button);
+       sgf_traces_button = (GTK.CheckButton("save sgf traces to")
+                            ->set_active(1));
+       sgf_filename_entry = GTK.Entry();
+       sgf_filename_entry->set_text("vars.sgf");
+       sgf_filename_entry->set_editable(1);
+
+       sgf_viewer_button = GTK.CheckButton("start sgf viewer as");
+        sgf_viewer_entry = GTK.Entry()->set_text(sgf_viewer_command)
+                           ->set_editable(1);
+        sgf_viewer_button->signal_connect("toggled", sgf_viewer_button_toggled);
+        sgf_traces_button->signal_connect("toggled", sgf_traces_button_toggled);
+        sgf_stuff = GTK.Table(2, 2, 0)
+                    ->attach_defaults(sgf_traces_button, 0, 1, 0, 1)
+                    ->attach_defaults(sgf_filename_entry, 1, 2, 0, 1)
+                    ->attach_defaults(sgf_viewer_button, 0, 1, 1, 2)
+                    ->attach_defaults(sgf_viewer_entry, 1, 2, 1, 2);
+
+       new_testcase_entry = GTK.Entry();
+        new_testcase_entry->set_text(testcases[0]);
+        new_testcase_entry->set_editable(1);
+        new_testcase_button = GTK.Button("Load new testcase");
+        new_testcase_button->signal_connect_new("clicked", new_testcase);
+       new_testcase_entry->signal_connect_new("activate", new_testcase);
+       if (sizeof(testcases)) {
+           prev_testcase_button = GTK.Button("Previous testcase");
+           prev_testcase_button->signal_connect_new("clicked", prev_testcase);
+           prev_testcase_button->set_sensitive(0);
+           next_testcase_button = GTK.Button("Next testcase");
+           next_testcase_button->signal_connect_new("clicked", next_testcase);
+       }
+       engine_path_entry = GTK.Entry();
+       engine_path_entry->set_text("../interface/gnugo");
+       engine_path_entry->set_editable(1);
+
+       engine_name_entry = GTK.Entry();
+       engine_name_entry->set_text("Engine 2");
+       engine_name_entry->set_editable(1);
+
+       engine_path_entry->signal_connect_new("activate", select_new_engine);
+       new_engine_button = GTK.Button("Start new engine");
+       new_engine_button->signal_connect_new("clicked", select_new_engine);
+
+       GTK.Widget worms_and_dragons_page
+           = (GTK.Vbox(0, 0)
+              ->pack_start(worm_data_button, 0, 0, 0)
+              ->pack_start(dragon_data1_button, 0, 0, 0)
+              ->pack_start(dragon_data2_button, 0, 0, 0)
+              ->pack_start(GTK.Label(""), 0, 0, 0)
+              ->pack_start(worm_status_button, 0, 0, 0)
+              ->pack_start(dragon_status_button, 0, 0, 0)
+              ->pack_start(dragon_safety_button, 0, 0, 0));
+       controller_notebook->append_page(worms_and_dragons_page,
+                                        GTK.Label("worms and dragons"));
+
+       GTK.Widget move_generation_page
+           = (GTK.Vbox(0, 0)
+              ->pack_start(top_moves_button, 0, 0, 0)
+              ->pack_start(all_moves_button, 0, 0, 0)
+              ->pack_start(delta_territory_button, 0, 0, 0));
+       controller_notebook->append_page(move_generation_page,
+                                        GTK.Label("move generation"));
+
+       GTK.Widget eyes_page = (GTK.Vbox(0, 0)
+                               ->pack_start(white_eyes_button, 0, 0, 0)
+                               ->pack_start(black_eyes_button, 0, 0, 0));
+       controller_notebook->append_page(eyes_page, GTK.Label("eyes"));
+
+       GTK.Widget influence_page
+           = (GTK.Vbox(0, 0)
+              ->pack_start(GTK.Vbox(0,0)
+//                         ->add(initial_w_influence_dragons_unknown_button)
+//                         ->add(initial_b_influence_dragons_unknown_button)
+                           ->add(initial_w_influence_dragons_known_button)
+                           ->add(initial_b_influence_dragons_known_button)
+                           ->add(after_move_influence_button)
+                           ->add(followup_influence_button), 0, 0, 0)
+              ->pack_start(GTK.Label(""), 0, 0, 0)
+              ->pack_start(GTK.Hbox(0,12)
+                           ->add(GTK.Vbox(0,0)
+                                 ->pack_start(influence_regions_button, 0, 0, 0)
+                                 ->pack_start(territory_value_button, 0, 0, 0)
+                                 ->pack_start(non_territory_button, 0, 0, 0)
+                                 ->pack_start(white_influence_button, 0, 0, 0)
+                                 ->pack_start(black_influence_button, 0, 0, 0))
+                           ->add(GTK.Vbox(0,0)
+                                 ->pack_start(white_strength_button, 0, 0, 0)
+                                 ->pack_start(black_strength_button, 0, 0, 0)
+                                 ->pack_start(white_permeability_button, 0, 0, 0)
+                                 ->pack_start(black_permeability_button, 0, 0, 0)
+                                 ->pack_start(white_attenuation_button, 0, 0, 0)
+                                 ->pack_start(black_attenuation_button, 0, 0, 0)),
+                           0, 0, 0));
+       controller_notebook->append_page(influence_page,
+                                        GTK.Label("influence"));
+
+       GTK.Widget reading_page
+           = (GTK.Vbox(0, 0)
+              ->pack_start(tactical_reading_button, 0, 0, 0)
+              ->pack_start(owl_reading_button, 0, 0, 0)
+              ->pack_start(owl_does_attack_button, 0, 0, 0)
+               ->pack_start(owl_does_defend_button, 0, 0, 0)
+              ->pack_start(connection_reading_button, 0, 0, 0)
+              ->pack_start(semeai_reading_button, 0, 0, 0)
+              ->pack_start(GTK.Label(""), 0, 0, 0)
+              ->pack_start(sgf_stuff, 0, 0, 0));
+       controller_notebook->append_page(reading_page, GTK.Label("reading"));
+
+       GTK.Widget engines_page
+           = (GTK.Vbox(0, 12)
+              ->pack_start(engine_path_entry, 0, 0, 0));
+       engines_page->pack_start(engine_name_entry, 0, 0, 0);
+       engines_page->pack_start(GTK.Alignment(1.0, 0.0, 0.0, 0.0)
+                                ->add(new_engine_button), 0, 0, 0)
+                    ->pack_start(new_testcase_entry, 0, 0, 0)
+                    ->pack_start(new_testcase_button, 0, 0, 0);
+       if  (sizeof(testcases) > 1) {
+           GTK.Widget next_prev
+               = (GTK.Hbox(0, 12)->pack_start(prev_testcase_button, 0, 0, 0)
+                                 ->pack_start(next_testcase_button, 0, 0, 0));
+           engines_page->pack_start(next_prev, 0, 0, 0);
+       }
+       controller_notebook->append_page(engines_page->set_border_width(12),
+                                        GTK.Label("engines"));
+
+       nasty_signal_id = controller_notebook->signal_connect_new("switch_page",
+                                                                 add_markup);
+
+       if (has_prefix(testcase_command, "reg_genmove")
+           || has_prefix(testcase_command, "restricted_genmove")) {
+           controller_notebook->show_all();
+           controller_notebook->set_page(1);
+       }
+
+       main_window->show_all();
+
+        add_regression_viewer(RegressionViewer(engine_,
+                                              complete_testcase,
+                                              testcase_command,
+                                              button_pressed_on_a_board,
+                                              "Default engine",
+                                              this_object()));
+       add_markup(controller_notebook->get_current_page());
+    }
+
+    static void select_new_engine()
+    {
+       string new_engine_path = engine_path_entry->get_text();
+       if (!Stdio.is_file(new_engine_path)) {
+           viewers->clist->clear();
+           viewers->clist->append(({"The engine path does not point to a file.\n", "", ""}));
+           return;
+       }
+       
+       SimpleGtp new_engine = SimpleGtp((new_engine_path + " --quiet --mode gtp -w -t -d0x101840") / " ");
+       if (!new_engine)
+           werror("Failed to start new engine.\n");
+       else {
+           add_regression_viewer(
+               RegressionViewer(new_engine, complete_testcase,
+                                testcase_command, button_pressed_on_a_board,
+                                engine_name_entry->get_text(),
+                                this_object()));
+       }
+
+       engine_name_entry->set_text(sprintf("Engine %d", sizeof(viewers) + 1));
+    }
+
+    static void add_regression_viewer(RegressionViewer viewer)
+    {
+       viewers += ({ viewer });
+       viewer->goban_widget->show_all();
+       gobans_notebook->append_page(viewer->goban_widget, 0);
+
+       GTK.Widget title_label = GTK.Label("");
+       viewer_title_widgets += ({ title_label });
+
+       GTK.Widget data_page = (GTK.Vbox(0, 2)
+                               ->pack_start(title_label, 0, 0, 0)
+                               ->add(viewer->scrolled_data_window)
+                               ->show_all());
+       data_notebook->append_page(data_page, 0);
+
+       selector_notebook
+           ->append_page((GTK.Alignment(0.0, 0.5, 0.0, 0.0)
+                          ->set_border_width(4)
+                          ->add(GTK.Label(viewer->engine->command_line))),
+                         GTK.Label(viewer->name));
+       selector_notebook->show_all();
+       selector_notebook->set_page(sizeof(viewers) - 1);
+    }
+
+    void set_title(RegressionViewer viewer, string title)
+    {
+       for (int k = 0; k < sizeof(viewers); k++) {
+           if (viewers[k] == viewer)
+               viewer_title_widgets[k]->set_text(title);
+       }
+    }
+
+    static void markup_button_pressed(mixed ... foo)
+    {
+       add_markup(controller_notebook->get_current_page());
+    }
+
+    static void add_markup(int mode)
+    {
+       viewers->add_markup(mode);
+    }
+
+    static void change_engine(int engine_index)
+    {
+       gobans_notebook->set_page(engine_index);
+       data_notebook->set_page(engine_index);
+    }
+    
+    void button_pressed_on_a_board(string vertex)
+    {
+       if (vertex == "")
+           return;
+
+       switch (controller_notebook->get_current_page()) {
+       case 0:
+           // Worms and dragons.
+           if (worm_data_button->get_active())
+               viewers->show_worm_data(vertex);
+           else if (dragon_data1_button->get_active())
+               viewers->show_dragon_data(vertex, 1);
+           else
+               viewers->show_dragon_data(vertex, 2);
+           break;
+
+       case 1:
+           // Move generation.
+           if (!delta_territory_button->get_active())
+               viewers->show_move_reasons(vertex);
+           else
+           {
+               delta_territory_move = vertex;
+               markup_button_pressed();
+           }
+           break;
+
+       case 2:
+           // Eyes.
+           viewers->show_eye_data(vertex);
+           break;
+
+       case 3:
+           // Influence.
+           if (after_move_influence_button->get_active()
+               || followup_influence_button->get_active())
+           {
+               move_influence_move = vertex;
+               after_move_influence_button_text
+                   ->set_text("after move influence for " + vertex);
+               followup_influence_button_text
+                   ->set_text("followup influence for " + vertex);
+               markup_button_pressed();
+           }
+           break;
+
+       case 4:
+           // Reading.
+           string sgffilename;
+           string sgf_viewer_cmd;
+           string reset_counter, get_counter;
+           
+            if (sgf_viewer_button->get_active()) {
+                sgffilename = sgf_filename_entry->get_text();
+                sgf_viewer_cmd = sgf_viewer_entry->get_text();
+            }
+           else if (sgf_traces_button->get_active()) {
+               sgffilename = sgf_filename_entry->get_text();
+                sgf_viewer_cmd = "";
+           }
+           else {
+               sgffilename = "";
+                sgf_viewer_cmd = "";
+           }
+
+           if (first_vertex == ""
+               || tactical_reading_button->get_active()
+               || owl_reading_button->get_active())
+               viewers->goban->clear_markup();
+               
+           viewers->goban->add_symbol(vertex, "big_dot", "green");
+           viewers->redraw_board();
+
+           viewers->clist->clear();
+
+           if (tactical_reading_button->get_active()
+               || owl_reading_button->get_active())
+           {
+               string prefix = "";
+               reset_counter = "reset_reading_node_counter";
+               get_counter = "get_reading_node_counter";
+               if (owl_reading_button->get_active())
+               {
+                   prefix = "owl_";
+                   reset_counter = "reset_owl_node_counter";
+                   get_counter = "get_owl_node_counter";
+               }
+               
+               viewers->do_reading(reset_counter, get_counter,
+                                   sgffilename, sgf_viewer_cmd,
+                                   prefix + "attack " + vertex,
+                                   prefix + "defend " + vertex);
+           }
+           else if (owl_does_attack_button->get_active()
+                     || owl_does_defend_button->get_active()
+                    || connection_reading_button->get_active()
+                    || semeai_reading_button->get_active())
+           {
+               if (first_vertex == "")
+               {
+                   first_vertex = vertex;
+               }
+               else if (first_vertex != vertex)
+               {
+                   string c1, c2;
+                   
+                    if (owl_does_attack_button->get_active()) {
+                        c1 = sprintf("owl_does_attack %s %s\n",
+                                     first_vertex, vertex);
+                        viewers->do_reading("reset_owl_node_counter",
+                                            "get_owl_node_counter",
+                                            sgffilename, sgf_viewer_cmd,
+                                            c1, "");
+                    }
+                    else if (owl_does_defend_button->get_active()) {
+                        c1 = sprintf("owl_does_defend %s %s\n",
+                                     first_vertex, vertex);
+                        viewers->do_reading("reset_owl_node_counter",
+                                            "get_owl_node_counter",
+                                            sgffilename, sgf_viewer_cmd,
+                                            c1, "");
+                    }
+                   else if (connection_reading_button->get_active())
+                   {
+                       c1 = sprintf("connect %s %s\n",
+                                   first_vertex,
+                                   vertex);
+                       c2 = "dis" + c1;
+                       viewers->do_reading("reset_connection_node_counter",
+                                           "get_connection_node_counter",
+                                           sgffilename, sgf_viewer_cmd,
+                                           c1, c2);
+                   }
+                   else
+                   {
+                       c1 = sprintf("analyze_semeai %s %s",
+                                    first_vertex, vertex);
+                       c2 = sprintf("analyze_semeai %s %s", vertex,
+                                    first_vertex);
+                       // FIXME: We should use a semeai node counter rather
+                       // than the owl node counter, except that it doesn't
+                       // exist yet.
+                       viewers->do_reading("reset_owl_node_counter",
+                                           "get_owl_node_counter",
+                                           sgffilename, sgf_viewer_cmd,
+                                           c1, c2);
+                   }
+                   first_vertex = "";
+               }
+           }
+           break;
+       }
+    }
+
+    static void this_new_testcase(string new_testcase)
+    {
+        werror("Trying to load new testcase %s.", new_testcase);
+        if (!excerpt_testcase(new_testcase, viewers[0]->engine))
+        {
+            werror("Failed to load testcase.\n");
+            return;
+        }
+        testcase_name = new_testcase;
+       main_window->set_title(testcase_name);
+       testcase_text->set_text(full_testcase * "\n");
+        viewers->new_testcase(complete_testcase, testcase_command);
+        viewers->handle_testcase();
+
+       if (has_prefix(testcase_command, "reg_genmove")
+           || has_prefix(testcase_command, "restricted_genmove")) {
+           controller_notebook->show_all();
+           controller_notebook->set_page(1);
+       }
+    }
+
+    static void new_testcase()
+    {
+        this_new_testcase(new_testcase_entry->get_text());
+    }
+
+    static void next_testcase()
+    {
+       if (testcase_index >= sizeof(testcases) - 1)
+           return;
+       testcase_index += 1;
+       prev_testcase_button->set_sensitive(1);
+       if (testcase_index == sizeof(testcases) - 1)
+           next_testcase_button->set_sensitive(0);
+       this_new_testcase(testcases[testcase_index]);
+    }
+
+    static void prev_testcase()
+    {
+       if (testcase_index == 0)
+           return;
+       testcase_index -= 1;
+       if (!testcases)
+           werror("Error handling list of test cases!\n");
+       next_testcase_button->set_sensitive(1);
+       if (testcase_index == 0)
+           prev_testcase_button->set_sensitive(0);
+       this_new_testcase(testcases[testcase_index]);
+    }
+
+
+    // The engine parameter is only needed to find out the color to
+    // move when an sgf file is given. Since there can be multiple
+    // viewers we shouldn't use this engine object for anything else
+    // though. Notice also that no viewer has been set up yet at the
+    // time of this call.
+    static int excerpt_testcase(string testcase, SimpleGtp engine)
+    {
+       string filename;
+       int number;
+       if (sscanf(testcase, "%s:%d", filename, number) < 2)
+           return 0;
+       
+       if (!has_suffix(filename, ".tst")
+           && !has_suffix(filename, ".sgf"))
+           filename += ".tst";
+       
+       string testfile = Stdio.read_file(filename);
+       if (!testfile)
+           return 0;
+
+       if (has_suffix(filename, ".sgf"))
+       {
+           // Only sgf file provided. Fake a testcase.
+           string s = "loadsgf " + filename + " " + number;
+           string color = engine->send_command(s)->text;
+           testcase_command = "reg_genmove " + color;
+           full_testcase = ({s, testcase_command});
+           complete_testcase = ({s, testcase_command});
+           expected_result = "";
+           return 1;
+       }
+       
+       full_testcase = ({});
+       complete_testcase = ({});
+       array(string) testlines = testfile / "\n";
+       for (int k = 0; k < sizeof(testlines); k++)
+       {
+           int this_number;
+           string testline = testlines[k];
+           if (testline[0..0] >= "a" && testline[0..0] <= "z") {
+               if (testline[0..6] != "loadsgf")
+                   complete_testcase += ({ testline });
+               else
+                   complete_testcase = ({ testline });
+           }
+           else if (sscanf(testline, "%d %s", this_number, testline) == 2
+               && this_number == number)
+           {
+               testcase_command = testline;
+               sscanf(testlines[k + 1], "#? [%s]", expected_result);
+               full_testcase += ({testlines[k]});
+               full_testcase += ({testlines[k + 1]});
+               return 1;
+           }
+
+           if (has_value("0123456789 ", testline[0..0]))
+               full_testcase = ({});
+           else
+               full_testcase += ({testline});
+       }
+       
+       return 0;
+    }
+
+    void sgf_traces_button_toggled()
+    {
+        if (!sgf_traces_button->get_active())
+            sgf_viewer_button->set_active(0);
+    }
+
+    void sgf_viewer_button_toggled()
+    {
+        if (sgf_viewer_button->get_active())
+            sgf_traces_button->set_active(1);
+    }
+    
+    void debug_callback(mixed ... args)
+    {
+       write("Debug callback:%O\n", args);
+    }
+
+    static void quit()
+    {
+       // Otherwise Pike errors occur.
+       controller_notebook->signal_disconnect(nasty_signal_id);
+       GTK.main_quit();
+    }
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/regression/viking.tst b/regression/viking.tst
new file mode 100644 (file)
index 0000000..bb3fe23
--- /dev/null
@@ -0,0 +1,66 @@
+# This test suite is based on games against the program Viking by
+# Magnus Persson.
+
+loadsgf games/viking1.sgf 15
+1 reg_genmove white 
+#? [O15]*
+
+loadsgf games/viking1.sgf 23
+2 reg_genmove white 
+#? [E2]
+
+loadsgf games/viking1.sgf 65
+3 reg_genmove white 
+#? [M15|B7]
+
+loadsgf games/viking1.sgf 135
+4 reg_genmove white 
+#? [B17|B18]*
+
+loadsgf games/viking1.sgf 187
+5 reg_genmove white 
+#? [S5]
+
+loadsgf games/viking1.sgf 189
+6 reg_genmove white 
+#? [B17|B18]
+
+# Locally S5 is the only move.
+loadsgf games/viking3.sgf 79
+7 restricted_genmove white T8 T7 S7 R7 T6 T5 S5 T4 T3 T2 T1 S1 
+#? [S5]
+
+# A1 is of course inferior to B3
+loadsgf games/viking3.sgf 93
+8 restricted_genmove white B3 A1
+#? [B3]
+
+# The position cries out for a move at J13.
+loadsgf games/viking3.sgf 103
+9 reg_genmove white
+#? [J13]
+
+# K15 leaves too many cutting points.
+loadsgf games/viking3.sgf 113
+10 reg_genmove white
+#? [K16]
+
+# G19 is a very odd move.
+loadsgf games/viking3.sgf 113
+11 restricted_genmove white G19 J17
+#? [J17]
+
+loadsgf games/viking3.sgf 137
+12 reg_genmove white
+#? [S14|S15]*
+
+# J9 is an overplay since it can be cut off.
+#CATEGORY=CONNECTION
+# J10 is not much better either, as black can cut J10/K11 off with M11.
+# This is a non-transitivity connection problem.
+# L10 looks best, but anything repairing the connection K11/N9 should
+# make us happy. /ab
+loadsgf games/viking3.sgf 213
+13 reg_genmove white
+#? [L10|L11|M11|N10|K7]*
+
diff --git a/sgf/CMakeLists.txt b/sgf/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b49846c
--- /dev/null
@@ -0,0 +1,22 @@
+INCLUDE_DIRECTORIES(${GNUGo_SOURCE_DIR}/utils)
+
+########### sgfgen program ###############
+
+SET(sgfgen_SRCS
+    sgfgen.c
+    )
+
+ADD_EXECUTABLE(sgfgen ${sgfgen_SRCS})
+
+TARGET_LINK_LIBRARIES(sgfgen)
+
+
+########### sgf library ###############
+
+SET(sgf_STAT_SRCS
+    sgf_utils.c
+    sgfnode.c
+    sgftree.c
+    )
+
+ADD_LIBRARY(sgf STATIC ${sgf_STAT_SRCS})
diff --git a/sgf/Makefile.am b/sgf/Makefile.am
new file mode 100644 (file)
index 0000000..33dcf14
--- /dev/null
@@ -0,0 +1,27 @@
+noinst_PROGRAMS = sgfgen
+
+sgfgen_SOURCES = sgfgen.c
+
+EXTRA_DIST = sgf_extras.def sgf_properties.def sgfgen.dsp sgf.dsp CMakeLists.txt
+
+noinst_HEADERS = \
+       sgftree.h\
+       sgf_properties.h
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+
+AM_CPPFLAGS = $(GNU_GO_WARNINGS) -I$(top_srcdir)/utils
+
+noinst_LIBRARIES = libsgf.a
+
+libsgf_a_SOURCES = \
+       sgf_utils.c \
+       sgfnode.c \
+       sgftree.c
+
+# To rebuild sgf_properties.h in case sgf_properties.def or sgf_extras.def 
+# is changed, 'make sgf_properties'. Normally this is not needed.
+sgf_properties:
+       cat $(srcdir)/sgf_properties.def $(srcdir)/sgf_extras.def |\
+               ./sgfgen > sgf_properties.h
diff --git a/sgf/Makefile.in b/sgf/Makefile.in
new file mode 100644 (file)
index 0000000..2868dcf
--- /dev/null
@@ -0,0 +1,427 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+noinst_PROGRAMS = sgfgen$(EXEEXT)
+subdir = sgf
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libsgf_a_AR = $(AR) $(ARFLAGS)
+libsgf_a_LIBADD =
+am_libsgf_a_OBJECTS = sgf_utils.$(OBJEXT) sgfnode.$(OBJEXT) \
+       sgftree.$(OBJEXT)
+libsgf_a_OBJECTS = $(am_libsgf_a_OBJECTS)
+PROGRAMS = $(noinst_PROGRAMS)
+am_sgfgen_OBJECTS = sgfgen.$(OBJEXT)
+sgfgen_OBJECTS = $(am_sgfgen_OBJECTS)
+sgfgen_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libsgf_a_SOURCES) $(sgfgen_SOURCES)
+DIST_SOURCES = $(libsgf_a_SOURCES) $(sgfgen_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+sgfgen_SOURCES = sgfgen.c
+EXTRA_DIST = sgf_extras.def sgf_properties.def sgfgen.dsp sgf.dsp CMakeLists.txt
+noinst_HEADERS = \
+       sgftree.h\
+       sgf_properties.h
+
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+AM_CPPFLAGS = $(GNU_GO_WARNINGS) -I$(top_srcdir)/utils
+noinst_LIBRARIES = libsgf.a
+libsgf_a_SOURCES = \
+       sgf_utils.c \
+       sgfnode.c \
+       sgftree.c
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  sgf/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  sgf/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libsgf.a: $(libsgf_a_OBJECTS) $(libsgf_a_DEPENDENCIES) 
+       -rm -f libsgf.a
+       $(libsgf_a_AR) libsgf.a $(libsgf_a_OBJECTS) $(libsgf_a_LIBADD)
+       $(RANLIB) libsgf.a
+
+clean-noinstPROGRAMS:
+       -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+sgfgen$(EXEEXT): $(sgfgen_OBJECTS) $(sgfgen_DEPENDENCIES) 
+       @rm -f sgfgen$(EXEEXT)
+       $(LINK) $(sgfgen_LDFLAGS) $(sgfgen_OBJECTS) $(sgfgen_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgf_utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgfgen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgfnode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgftree.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-exec install-exec-am \
+       install-info install-info-am install-man install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+
+# To rebuild sgf_properties.h in case sgf_properties.def or sgf_extras.def 
+# is changed, 'make sgf_properties'. Normally this is not needed.
+sgf_properties:
+       cat $(srcdir)/sgf_properties.def $(srcdir)/sgf_extras.def |\
+               ./sgfgen > sgf_properties.h
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/sgf/sgf.dsp b/sgf/sgf.dsp
new file mode 100644 (file)
index 0000000..443d2b5
--- /dev/null
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="sgf" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=sgf - Win32 Release\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "sgf.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "sgf.mak" CFG="sgf - Win32 Release"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "sgf - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "sgf - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "sgf - Win32 Release"\r
+\r
+# PROP Use_MFC 0\r
+# ADD CPP /GX /Zi /I ".." /I "..\interface" /I "..\engine" /I "..\utils" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "HAVE_CONFIG_H" /Fo"Release/" /Fd"Release/sgf" /FD /c\r
+# ADD BASE RSC /l 0x809\r
+# ADD RSC /l 0x809\r
+BSC32=bscmake.exe\r
+LIB32=link.exe -lib\r
+# ADD LIB32 /nologo /out:"Release\sgf.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "sgf - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "_DEBUG" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I ".." /I "..\engine" /I "..\interface" /I "../utils" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_DEBUG" /D "_CONSOLE" /D "HAVE_CONFIG_H" /FR /Fd"Debug/sgf" /FD /GZ /c\r
+# ADD BASE RSC /l 0x809 /d "NDEBUG" /d "_DEBUG"\r
+# ADD RSC /l 0x809 /d "NDEBUG" /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "sgf - Win32 Release"\r
+# Name "sgf - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\sgf\sgf_utils.c\r
+\r
+!IF  "$(CFG)" == "sgf - Win32 Release"\r
+\r
+# ADD CPP /W3\r
+\r
+!ELSEIF  "$(CFG)" == "sgf - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgfnode.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgftree.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\sgf_properties.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgf_utils.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\sgftree.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/sgf/sgf_extras.def b/sgf/sgf_extras.def
new file mode 100644 (file)
index 0000000..dfbf12a
--- /dev/null
@@ -0,0 +1,22 @@
+#
+# These are additions to the SGF spec- old commands and some others
+#
+
+#
+# outdated FF3 properties
+#
+BS
+WS
+ID
+RG
+SC
+
+#
+# some random ones used by CGoban
+#
+SY
+
+#
+# nonstandard SGF property used by GNU Go to mark illegal moves
+#
+IL
diff --git a/sgf/sgf_properties.def b/sgf/sgf_properties.def
new file mode 100644 (file)
index 0000000..06ea5da
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# This document was taken from the SGF Specfication. See:
+# http://www.red-bean.com/sgf/
+#
+# [SGF FF[4] - Smart Game Format]
+#
+# FF[4] property index
+#
+# This is an alphabetical index to all properties defined in FF[4].
+# New properties are marked with '*', changed properties are marked with '!'.
+#
+#ID   Description     property type    property value
+#---- --------------- ---------------  --------------------------------------
+AB   Add Black       setup            list of stone
+AE   Add Empty       setup            list of point
+AN   Annotation      game-info        simpletext
+*AP  Application     root             composed simpletext ':' simpletext
+*AR  Arrow           -                list of composed point ':' point
+*AS  Who adds stones - (LOA)          simpletext
+AW   Add White       setup            list of stone
+B    Black           move             move
+BL   Black time left move             real
+BM   Bad move        move             double
+BR   Black rank      game-info        simpletext
+BT   Black team      game-info        simpletext
+C    Comment         -                text
+*CA  Charset         root             simpletext
+CP   Copyright       game-info        simpletext
+CR   Circle          -                list of point
+*DD  Dim points      - (inherit)      elist of point
+DM   Even position   -                double
+DO   Doubtful        move             none
+!DT  Date            game-info        simpletext
+EV   Event           game-info        simpletext
+FF   Fileformat      root             number (range: 1-4)
+!FG  Figure          -                none | composed number ":" simpletext
+GB   Good for Black  -                double
+GC   Game comment    game-info        text
+GM   Game            root             number (range: 1-5,7-16)
+GN   Game name       game-info        simpletext
+GW   Good for White  -                double
+HA   Handicap        game-info (Go)   number
+HO   Hotspot         -                double
+*IP  Initial pos.    game-info (LOA)  simpletext
+IT   Interesting     move             none
+*IY  Invert Y-axis   game-info (LOA)  simpletext
+KM   Komi            game-info (Go)   real
+KO   Ko              move             none
+!LB  Label           -                list of composed point ':' simpletext
+*LN  Line            -                list of composed point ':' point
+MA   Mark            -                list of point
+MN   set move number move             number
+N    Nodename        -                simpletext
+OB   OtStones Black  move             number
+ON   Opening         game-info        text
+*OT  Overtime        game-info        simpletext
+OW   OtStones White  move             number
+PB   Player Black    game-info        simpletext
+PC   Place           game-info        simpletext
+PL   Player to play  setup            color
+*PM  Print move mode - (inherit)      number
+PW   Player White    game-info        simpletext
+!RE  Result          game-info        simpletext
+RO   Round           game-info        simpletext
+!RU  Rules           game-info        simpletext
+*SE  Markup          - (LOA)          point
+SL   Selected        -                list of point
+SO   Source          game-info        simpletext
+*SQ  Square          -                list of point
+*ST  Style           root             number (range: 0-3)
+*SU  Setup type      game-info (LOA)  simpletext
+!SZ  Size            root             (number | composed number ':' number)
+TB   Territory Black - (Go)           elist of point
+TE   Tesuji          move             double
+TM   Timelimit       game-info        real
+TR   Triangle        -                list of point
+TW   Territory White - (Go)           elist of point
+UC   Unclear pos     -                double
+US   User            game-info        simpletext
+V    Value           -                real
+*VW  View            - (inherit)      elist of point
+W    White           move             move
+WL   White time left move             real
+WR   White rank      game-info        simpletext
+WT   White team      game-info        simpletext
diff --git a/sgf/sgf_properties.h b/sgf/sgf_properties.h
new file mode 100644 (file)
index 0000000..e976e9f
--- /dev/null
@@ -0,0 +1,179 @@
+/* # */
+/* # This document was taken from the SGF Specfication. See: */
+/* # http://www.red-bean.com/sgf/ */
+/* # */
+/* # [SGF FF[4] - Smart Game Format] */
+/* # */
+/* # FF[4] property index */
+/* # */
+/* # This is an alphabetical index to all properties defined in FF[4]. */
+/* # New properties are marked with '*', changed properties are marked with '!'. */
+/* # */
+/* #ID   Description     property type    property value */
+/* #---- --------------- ---------------  -------------------------------------- */
+     /*  Add Black       setup            list of stone */
+#define SGFAB   16961
+     /*  Add Empty       setup            list of point */
+#define SGFAE   17729
+     /*  Annotation      game-info        simpletext */
+#define SGFAN   20033
+     /*  Application     root             composed simpletext ':' simpletext */
+#define SGFAP   20545
+     /*  Arrow           -                list of composed point ':' point */
+#define SGFAR   21057
+     /*  Who adds stones - (LOA)          simpletext */
+#define SGFAS   21313
+     /*  Add White       setup            list of stone */
+#define SGFAW   22337
+     /*  Black           move             move */
+#define SGFB     8258
+     /*  Black time left move             real */
+#define SGFBL   19522
+     /*  Bad move        move             double */
+#define SGFBM   19778
+     /*  Black rank      game-info        simpletext */
+#define SGFBR   21058
+     /*  Black team      game-info        simpletext */
+#define SGFBT   21570
+     /*  Comment         -                text */
+#define SGFC     8259
+     /*  Charset         root             simpletext */
+#define SGFCA   16707
+     /*  Copyright       game-info        simpletext */
+#define SGFCP   20547
+     /*  Circle          -                list of point */
+#define SGFCR   21059
+     /*  Dim points      - (inherit)      elist of point */
+#define SGFDD   17476
+     /*  Even position   -                double */
+#define SGFDM   19780
+     /*  Doubtful        move             none */
+#define SGFDO   20292
+     /*  Date            game-info        simpletext */
+#define SGFDT   21572
+     /*  Event           game-info        simpletext */
+#define SGFEV   22085
+     /*  Fileformat      root             number (range: 1-4) */
+#define SGFFF   17990
+     /*  Figure          -                none | composed number ":" simpletext */
+#define SGFFG   18246
+     /*  Good for Black  -                double */
+#define SGFGB   16967
+     /*  Game comment    game-info        text */
+#define SGFGC   17223
+     /*  Game            root             number (range: 1-5,7-16) */
+#define SGFGM   19783
+     /*  Game name       game-info        simpletext */
+#define SGFGN   20039
+     /*  Good for White  -                double */
+#define SGFGW   22343
+     /*  Handicap        game-info (Go)   number */
+#define SGFHA   16712
+     /*  Hotspot         -                double */
+#define SGFHO   20296
+     /*  Initial pos.    game-info (LOA)  simpletext */
+#define SGFIP   20553
+     /*  Interesting     move             none */
+#define SGFIT   21577
+     /*  Invert Y-axis   game-info (LOA)  simpletext */
+#define SGFIY   22857
+     /*  Komi            game-info (Go)   real */
+#define SGFKM   19787
+     /*  Ko              move             none */
+#define SGFKO   20299
+     /*  Label           -                list of composed point ':' simpletext */
+#define SGFLB   16972
+     /*  Line            -                list of composed point ':' point */
+#define SGFLN   20044
+     /*  Mark            -                list of point */
+#define SGFMA   16717
+     /*  set move number move             number */
+#define SGFMN   20045
+     /*  Nodename        -                simpletext */
+#define SGFN     8270
+     /*  OtStones Black  move             number */
+#define SGFOB   16975
+     /*  Opening         game-info        text */
+#define SGFON   20047
+     /*  Overtime        game-info        simpletext */
+#define SGFOT   21583
+     /*  OtStones White  move             number */
+#define SGFOW   22351
+     /*  Player Black    game-info        simpletext */
+#define SGFPB   16976
+     /*  Place           game-info        simpletext */
+#define SGFPC   17232
+     /*  Player to play  setup            color */
+#define SGFPL   19536
+     /*  Print move mode - (inherit)      number */
+#define SGFPM   19792
+     /*  Player White    game-info        simpletext */
+#define SGFPW   22352
+     /*  Result          game-info        simpletext */
+#define SGFRE   17746
+     /*  Round           game-info        simpletext */
+#define SGFRO   20306
+     /*  Rules           game-info        simpletext */
+#define SGFRU   21842
+     /*  Markup          - (LOA)          point */
+#define SGFSE   17747
+     /*  Selected        -                list of point */
+#define SGFSL   19539
+     /*  Source          game-info        simpletext */
+#define SGFSO   20307
+     /*  Square          -                list of point */
+#define SGFSQ   20819
+     /*  Style           root             number (range: 0-3) */
+#define SGFST   21587
+     /*  Setup type      game-info (LOA)  simpletext */
+#define SGFSU   21843
+     /*  Size            root             (number | composed number ':' number) */
+#define SGFSZ   23123
+     /*  Territory Black - (Go)           elist of point */
+#define SGFTB   16980
+     /*  Tesuji          move             double */
+#define SGFTE   17748
+     /*  Timelimit       game-info        real */
+#define SGFTM   19796
+     /*  Triangle        -                list of point */
+#define SGFTR   21076
+     /*  Territory White - (Go)           elist of point */
+#define SGFTW   22356
+     /*  Unclear pos     -                double */
+#define SGFUC   17237
+     /*  User            game-info        simpletext */
+#define SGFUS   21333
+     /*  Value           -                real */
+#define SGFV     8278
+     /*  View            - (inherit)      elist of point */
+#define SGFVW   22358
+     /*  White           move             move */
+#define SGFW     8279
+     /*  White time left move             real */
+#define SGFWL   19543
+     /*  White rank      game-info        simpletext */
+#define SGFWR   21079
+     /*  White team      game-info        simpletext */
+#define SGFWT   21591
+/* # */
+/* # These are additions to the SGF spec- old commands and some others */
+/* # */
+
+/* # */
+/* # outdated FF3 properties */
+/* # */
+#define SGFBS 21314
+#define SGFWS 21335
+#define SGFID 17481
+#define SGFRG 18258
+#define SGFSC 17235
+
+/* # */
+/* # some random ones used by CGoban */
+/* # */
+#define SGFSY 22867
+
+/* # */
+/* # nonstandard SGF property used by GNU Go to mark illegal moves */
+/* # */
+#define SGFIL 19529
diff --git a/sgf/sgf_utils.c b/sgf/sgf_utils.c
new file mode 100644 (file)
index 0000000..3ba29ca
--- /dev/null
@@ -0,0 +1,288 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - either version 3      *
+ * or (at your option) any later version.                            *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "sgftree.h"
+
+/* 
+ * Return the integer X move.
+ */
+
+int
+get_moveX(SGFProperty *property, int boardsize)
+{
+  int i;
+  if (strlen(property->value) < 2)
+    return -1;
+
+  i = toupper((int) property->value[1]) - 'A';
+  if (i >= boardsize)
+    return -1;
+
+  return i;
+}
+
+/* 
+ * Return the integer Y move.
+ */
+
+int
+get_moveY(SGFProperty *property, int boardsize)
+{
+  int j;
+  if (strlen(property->value) < 2)
+    return -1;
+
+  j = toupper((int) property->value[0]) - 'A';
+  if (j >= boardsize)
+    return -1;
+
+  return j;
+}
+
+
+/* Fills (*i, *j) from the property value, in GNU Go co-ords.
+ * Note that GNU Go uses different conventions from sgf for
+ * co-ordinates been called. 
+ *
+ * Returns 1 for a move, 0 for a pass.
+ */
+
+int
+get_moveXY(SGFProperty *property, int *i, int *j, int boardsize)
+{
+  *i = get_moveX(property, boardsize);
+  *j = get_moveY(property, boardsize);
+  
+  if (*i == -1 && *j == -1)
+    return 0;
+
+  return 1;
+}
+
+
+/* 
+ * Debugging function to print properties as they are traversed.
+ */
+
+int
+show_sgf_properties(SGFNode *node)
+{
+  SGFProperty *sgf_prop;
+  int propcount;
+
+  propcount = 0;
+
+  printf("P: ");
+  if (!node->props) {
+    printf("None\n");
+    return propcount;
+  }
+  else {
+    sgf_prop = node->props;
+    while (sgf_prop) {
+      printf("%c%c ", sgf_prop->name & 0x00FF, (sgf_prop->name & 0xFF00)>>8);
+      sgf_prop = sgf_prop->next;
+      propcount++;
+    }
+
+    printf("(%d) ", propcount);
+    if (node->next)
+      printf("n");
+    if (node->child)
+      printf("c");
+    printf("\n");
+  }
+
+  return propcount;
+}
+
+
+/*
+ * Recursively traverse each node showing all properties.
+ */
+
+int
+show_sgf_tree(SGFNode *node)
+{
+  int n = 0; /* number of nodes */
+  
+  n++;
+  show_sgf_properties(node);
+
+  /* must search depth first- siblings are equal! */
+  if (node->child)
+    n += show_sgf_tree(node->child);
+
+  if (node->next)
+    n += show_sgf_tree(node->next);
+  
+  return n;
+}
+
+
+/*
+ * Determine if a node has a mark property in it.
+ */
+
+int
+is_markup_node(SGFNode *node)
+{
+  SGFProperty *sgf_prop;
+  
+  /* If the node has no properties, there's nothing to do.
+     This should have been checked by the caller, but it can't hurt. */
+  if (!node->props)
+    return 0;
+
+  sgf_prop = node->props;
+  while (sgf_prop) {
+    switch (sgf_prop->name) {
+    case SGFCR: 
+    case SGFSQ: /* Square */
+    case SGFTR: /* Triangle */
+    case SGFMA: /* Mark */
+    case SGFBM: /* bad move */
+    case SGFDO: /* doubtful move */
+    case SGFIT: /* interesting move */
+    case SGFTE: /* good move */
+      return 1;
+      break;
+    default:
+      break;
+    }
+    sgf_prop = sgf_prop->next;
+  }
+
+  /* No markup property found. */
+  return 0;
+}
+
+
+/*
+ * Determine if the node has a move in it.
+ */
+
+int
+is_move_node(SGFNode *node)
+{
+  SGFProperty *sgf_prop;
+  
+  /* If the node has no properties, there's nothing to do.
+     This should have been checked by the caller, but it can't hurt. */
+  if (!node->props)
+    return 0;
+
+  sgf_prop = node->props;
+  while (sgf_prop) {
+    switch (sgf_prop->name) {
+    case SGFB: 
+    case SGFW: 
+      return 1;
+      break;
+    default:
+      break;
+    }
+    sgf_prop = sgf_prop->next;
+  }
+
+  return 0;
+}
+
+
+/*
+ * Determine if the node has a pass move in it.
+ */
+
+int
+is_pass_node(SGFNode *node, int boardsize)
+{
+  SGFProperty *sgf_prop;
+  int i, j;
+  
+  /* If the node has no properties, there's nothing to do.
+     This should have been checked by the caller, but it can't hurt. */
+  if (!node->props)
+    return 0;
+
+  sgf_prop = node->props;
+  while (sgf_prop) {
+    switch (sgf_prop->name) {
+    case SGFB: 
+    case SGFW: 
+      return !get_moveXY(sgf_prop, &i, &j, boardsize);
+      break;
+    default:
+      break;
+    }
+    sgf_prop = sgf_prop->next;
+  }
+
+  return 0;
+}
+
+
+/*
+ * Determine whose move is in the node.
+ */
+
+int
+find_move(SGFNode *node)
+{
+  SGFProperty *sgf_prop;
+  
+  /* If the node has no properties, there's nothing to do.
+     This should have been checked by the caller, but it can't hurt. */
+  if (!node->props)
+    return 0;
+
+  sgf_prop = node->props;
+  while (sgf_prop) {
+    switch (sgf_prop->name) {
+    case SGFB: 
+      return BLACK;
+      break;
+    case SGFW: 
+      return WHITE;
+      break;
+    default:
+      break;
+    }
+    sgf_prop = sgf_prop->next;
+  }
+
+  return EMPTY;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/sgf/sgfgen.c b/sgf/sgfgen.c
new file mode 100644 (file)
index 0000000..5bc1cc9
--- /dev/null
@@ -0,0 +1,99 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * A little program to convert the SGF Spec into something usable in a
+ * parser- basically, the two letters moved into a 'short'
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX_LINE 128
+
+static short str2short(char *str);
+
+/*
+ * combine two characters into a short.
+ */
+
+static short
+str2short(char *str)
+{
+  return (str[0] | str[1] << 8);
+}
+
+int 
+main(void)
+{
+  char instring[MAX_LINE];
+  char sgf_tag[MAX_LINE];
+  char comment[MAX_LINE];
+  int i;
+
+  while (fgets(instring, MAX_LINE, stdin)) {
+    i = strlen(instring) - 1;
+      
+    /* Remove trailing newline and spaces */
+    while (i >= 0 
+          && (instring[i] == ' ' || instring[i] == 10))
+      instring[i--] = 0;
+      
+    /* Blank lines stay blank lines */
+    if (strcmp(instring, "") == 0) {
+      fprintf(stdout, "\n");
+      continue;
+    }
+      
+    sscanf(instring, "%4s %75s", sgf_tag, comment);
+    strncpy(sgf_tag, instring, 4);
+    if (strlen(instring) > 4) 
+      strncpy(comment, instring+4, MAX_LINE-4);
+    else
+      strcpy(comment, "");
+
+    /* outdated and modified notations. */
+    /* just shift everything over */
+    if (sgf_tag[0] == '*' || sgf_tag[0] == '!') {
+      sgf_tag[0] = sgf_tag[1];
+      sgf_tag[1] = sgf_tag[2];
+      sgf_tag[2] = sgf_tag[3];
+    }
+      
+    /* If its not a real tag, just take it as a comment. */
+    if (sgf_tag[0] < 'A' || sgf_tag[0] > 'Z') {
+      fprintf(stdout, "/* %s */\n", instring);
+      continue;
+    }
+    else {
+      /* otherwise, write the tag and value to the file */
+      if (strlen(comment))
+       fprintf(stdout, "     /* %s */\n", comment);
+      fprintf(stdout, "#define SGF%s %5d\n", sgf_tag, str2short(sgf_tag));
+    }
+  }
+  
+  /* Needs 0 exit status or else make fails. */
+  return EXIT_SUCCESS;
+}
diff --git a/sgf/sgfgen.dsp b/sgf/sgfgen.dsp
new file mode 100644 (file)
index 0000000..670d6b8
--- /dev/null
@@ -0,0 +1,98 @@
+# Microsoft Developer Studio Project File - Name="sgfgen" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=sgfgen - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "sgfgen.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "sgfgen.mak" CFG="sgfgen - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "sgfgen - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "sgfgen - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "sgfgen - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I ".." /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /Fd"Release/sgfgen" /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+\r
+!ELSEIF  "$(CFG)" == "sgfgen - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I ".." /D "_DEBUG" /D "HAVE_CONFIG_H" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /Fd"Debug/sgfgen" /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "sgfgen - Win32 Release"\r
+# Name "sgfgen - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\sgfgen.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/sgf/sgfnode.c b/sgf/sgfnode.c
new file mode 100644 (file)
index 0000000..ec84da3
--- /dev/null
@@ -0,0 +1,1562 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*  Parts of this code were given to us by Tommy Thorn */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include "sgftree.h"
+#include "gg_utils.h"
+
+#define STRICT_SGF 's'
+#define LAX_SGF    'l'
+
+/* Set this to 1 if you want warnings for missing GM and FF properties. */
+#define VERBOSE_WARNINGS 0
+
+/* ================================================================ */
+/*                     Some utility functions.                      */
+/* ================================================================ */
+
+/*
+ * Utility: a checking, initializing malloc
+ */
+
+void *
+xalloc(unsigned int size)
+{
+  void *pt = malloc(size);
+
+  if (!pt) {
+    fprintf(stderr, "xalloc: Out of memory!\n");
+    exit(EXIT_FAILURE);
+  }
+
+  memset(pt, 0, (unsigned long) size);
+  return pt;
+}
+
+void *
+xrealloc(void *pt, unsigned int size)
+{
+  void *ptnew = realloc(pt, size);
+
+  if (!ptnew) {
+    fprintf(stderr, "xrealloc: Out of memory!\n");
+    exit(EXIT_FAILURE);
+  }
+  return ptnew;
+}
+
+
+/* ================================================================ */
+/*                           SGF Nodes                              */
+/* ================================================================ */
+
+
+/*
+ * Allocate memory for a new SGF node.
+ */
+
+SGFNode *
+sgfNewNode()
+{
+  SGFNode *newnode;
+  newnode = xalloc(sizeof(SGFNode));
+  newnode->next = NULL;
+  newnode->props = NULL;
+  newnode->parent = NULL;
+  newnode->child = NULL;
+  return newnode;
+}
+
+/*
+ * Recursively free an sgf node
+ */
+
+void
+sgfFreeNode(SGFNode *node)
+{
+  if (node == NULL)
+    return;
+  sgfFreeNode(node->next);
+  sgfFreeNode(node->child);
+  sgfFreeProperty(node->props);
+  free(node);
+}
+
+
+/*
+ * Add a generic text property to an SGF node.
+ */
+
+void
+sgfAddProperty(SGFNode *node, const char *name, const char *value)
+{
+  SGFProperty *prop = node->props;
+
+  if (prop)
+    while (prop->next)
+      prop = prop->next;
+
+  sgfMkProperty(name, value, node, prop);
+}
+
+
+/*
+ * Add an integer property to an SGF node.
+ */
+
+void
+sgfAddPropertyInt(SGFNode *node, const char *name, long val)
+{
+  char buffer[10];
+
+  gg_snprintf(buffer, 10, "%ld", val);
+  sgfAddProperty(node, name, buffer);
+}
+
+
+/*
+ * Add a float property to an SGF node.
+ */
+
+void
+sgfAddPropertyFloat(SGFNode *node, const char *name, float val)
+{
+  char buffer[10];
+
+  gg_snprintf(buffer, 10, "%3.1f", val);
+  sgfAddProperty(node, name, buffer);
+}
+
+
+/*
+ * Read a property as int from an SGF node.
+ */
+
+int
+sgfGetIntProperty(SGFNode *node, const char *name, int *value)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam) {
+      *value = atoi(prop->value);
+      return 1;
+    }
+
+  return 0;
+}
+
+
+/*
+ * Read a property as float from an SGF node.
+ */
+
+int
+sgfGetFloatProperty(SGFNode *node, const char *name, float *value)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam) {
+      *value = (float) atof(prop->value);
+      /* MS-C warns of loss of data (double to float) */
+      return 1;
+    }
+
+  return 0;
+}
+
+
+/*
+ * Read a property as text from an SGF node.
+ */
+
+int
+sgfGetCharProperty(SGFNode *node, const char *name, char **value)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam) {
+      *value = prop->value;
+      return 1;
+    }
+
+  return 0;
+}
+
+
+/*
+ * Is there a property of this type in the node?
+ */
+
+static int
+sgfHasProperty(SGFNode *node, const char *name)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam)
+      return 1;
+
+  return 0;
+}
+
+
+/*
+ * Overwrite a property from an SGF node with text or create a new
+ * one if it does not exist.
+ */
+
+void
+sgfOverwriteProperty(SGFNode *node, const char *name, const char *text)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam) {
+      prop->value = xrealloc(prop->value, strlen(text)+1);
+      strcpy(prop->value, text);
+      return;
+    }
+
+  sgfAddProperty(node, name, text);
+}
+
+
+/*
+ * Overwrite an int property in an SGF node with val or create a new 
+ * one if it does not exist.
+ */
+
+void
+sgfOverwritePropertyInt(SGFNode *node, const char *name, int val)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam) {
+      prop->value = xrealloc(prop->value, 12);
+      gg_snprintf(prop->value, 12, "%d", val);
+      return;
+   }
+
+  sgfAddPropertyInt(node, name, val);
+}
+
+
+/* 
+ * Overwrite a float property in the gametree with val or create
+ * a new one if it does not exist.
+ */
+
+void
+sgfOverwritePropertyFloat(SGFNode *node, const char *name, float val)
+{
+  SGFProperty *prop;
+  short nam = name[0] | name[1] << 8;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (prop->name == nam) {
+      prop->value = xrealloc(prop->value, 15);
+      gg_snprintf(prop->value, 15, "%3.1f", val);
+      return;
+    }
+
+  sgfAddPropertyFloat(node, name, val);
+}
+
+
+/*
+ * Goto previous node.
+ */
+
+SGFNode *
+sgfPrev(SGFNode *node)
+{
+  SGFNode *q;
+  SGFNode *prev;
+
+  if (!node->parent)
+    return NULL;
+
+  q = node->parent->child;
+  prev = NULL;
+  while (q && q != node) {
+    prev = q;
+    q = q->next;
+  }
+
+  return prev;
+}
+
+
+/*
+ * Goto root node.
+ */
+
+SGFNode *
+sgfRoot(SGFNode *node)
+{
+  while (node->parent)
+    node = node->parent;
+
+  return node;
+}
+
+
+/* ================================================================ */
+/*                         SGF Properties                           */
+/* ================================================================ */
+
+
+/*
+ * Make an SGF property.
+ */
+static SGFProperty *
+do_sgf_make_property(short sgf_name,  const char *value,
+                    SGFNode *node, SGFProperty *last)
+{
+  SGFProperty *prop;
+
+  prop = (SGFProperty *) xalloc(sizeof(SGFProperty));
+  prop->name = sgf_name;
+  prop->value = xalloc(strlen(value) + 1);
+  strcpy(prop->value, value);
+  prop->next = NULL;
+
+  if (last == NULL)
+    node->props = prop;
+  else
+    last->next = prop;
+
+  return prop;
+}
+
+
+/* Make an SGF property.  In case of a property with a range it
+ * expands it and makes several properties instead.
+ */
+SGFProperty *
+sgfMkProperty(const char *name, const  char *value,
+             SGFNode *node, SGFProperty *last)
+{
+  static const short properties_allowing_ranges[12] = {
+    /* Board setup properties. */
+    SGFAB, SGFAW, SGFAE,
+
+    /* Markup properties. */
+    SGFCR, SGFMA, SGFSQ, SGFTR, SGFDD, SGFSL,
+
+    /* Miscellaneous properties. */
+    SGFVW,
+
+    /* Go-specific properties. */
+    SGFTB, SGFTW
+  };
+
+  int k;
+  short sgf_name;
+
+  if (strlen(name) == 1)
+    sgf_name = name[0] | (short) (' ' << 8);
+  else
+    sgf_name = name[0] | name[1] << 8;
+
+  for (k = 0; k < 12; k++) {
+    if (properties_allowing_ranges[k] == sgf_name)
+      break;
+  }
+
+  if (k < 12
+      && strlen(value) == 5
+      && value[2] == ':') {
+    char x1 = value[0];
+    char y1 = value[1];
+    char x2 = value[3];
+    char y2 = value[4];
+    char new_value[] = "xy";
+
+    if (x1 <= x2 && y1 <= y2) {
+      for (new_value[0] = x1; new_value[0] <= x2; new_value[0]++) {
+       for (new_value[1] = y1; new_value[1] <= y2; new_value[1]++)
+         last = do_sgf_make_property(sgf_name, new_value, node, last);
+      }
+
+      return last;
+    }
+  }
+
+  /* Not a range property. */
+  return do_sgf_make_property(sgf_name, value, node, last);
+}
+
+
+/*
+ * Recursively free an SGF property.
+ *
+ */
+
+void
+sgfFreeProperty(SGFProperty *prop)
+{
+  if (prop == NULL)
+    return;
+  sgfFreeProperty(prop->next);
+  free(prop->value);
+  free(prop);
+}
+
+
+/* ================================================================ */
+/*                        High level functions                      */
+/* ================================================================ */
+
+
+/*
+ * Add a stone to the current or the given node.
+ * Return the node where the stone was added.
+ */
+
+SGFNode *
+sgfAddStone(SGFNode *node, int color, int movex, int movey)
+{
+  char move[3];
+
+  sprintf(move, "%c%c", movey + 'a', movex + 'a');
+  sgfAddProperty(node, (color == BLACK) ? "AB" : "AW", move);
+
+  return node;
+}
+
+
+/*
+ * Add a move to the gametree.
+ */
+
+SGFNode *
+sgfAddPlay(SGFNode *node, int who, int movex, int movey)
+{
+  char move[3];
+  SGFNode *new;
+  
+  /* a pass move? */
+  if (movex == -1 && movey == -1)
+    move[0] = 0;
+  else
+    sprintf(move, "%c%c", movey + 'a', movex + 'a');
+
+  if (node->child)
+    new = sgfStartVariantFirst(node->child);
+  else {
+    new = sgfNewNode();
+    node->child = new;
+    new->parent = node;
+  }
+  
+  sgfAddProperty(new, (who == BLACK) ? "B" : "W", move);
+
+  return new;
+}
+
+
+/*
+ * Add a move to the gametree. New variations are added after the old
+ * ones rather than before.
+ */
+
+SGFNode *
+sgfAddPlayLast(SGFNode *node, int who, int movex, int movey)
+{
+  char move[3];
+  SGFNode *new;
+
+  /* a pass move? */
+  if (movex == -1 && movey == -1)
+    move[0] = 0;
+  else
+    sprintf(move, "%c%c", movey + 'a', movex + 'a');
+
+  new = sgfAddChild(node);
+  sgfAddProperty(new, (who == BLACK) ? "B" : "W", move);
+
+  return new;
+}
+
+
+SGFNode *
+sgfCreateHeaderNode(int boardsize, float komi, int handicap)
+{
+    SGFNode *root = sgfNewNode();
+
+    sgfAddPropertyInt(root, "SZ", boardsize);
+    sgfAddPropertyFloat(root, "KM", komi);
+    sgfAddPropertyInt(root, "HA", handicap);
+
+    return root;
+}
+
+
+/*
+ * Add a comment to an SGF node.
+ */
+
+SGFNode *
+sgfAddComment(SGFNode *node, const char *comment)
+{
+  sgfAddProperty(node, "C ", comment);
+
+  return node;
+}
+
+
+/*
+ * Place text on the board at position (i, j).
+ */
+
+SGFNode *
+sgfBoardText(SGFNode *node, int i, int j, const char *text)
+{
+  void *str = xalloc(strlen(text) + 3);
+
+  sprintf(str, "%c%c:%s", j+'a', i+'a', text);
+  sgfAddProperty(node, "LB", str);
+  free(str);
+
+  return node;
+}
+
+
+/*
+ * Place a character on the board at position (i, j).
+ */
+
+SGFNode *
+sgfBoardChar(SGFNode *node, int i, int j, char c)
+{
+  char text[2] = "";
+
+  text[0] = c;
+  text[1] = 0;
+
+  return sgfBoardText(node, i, j, text);
+}
+
+
+/*
+ * Place a number on the board at position (i, j).
+ */
+
+SGFNode *
+sgfBoardNumber(SGFNode *node, int i, int j, int number)
+{
+  char text[10];
+
+  gg_snprintf(text, 10, "%c%c:%i", j+'a', i+'a', number);
+  sgfAddProperty(node, "LB", text);
+
+  return node;
+}
+
+
+/*
+ * Place a triangle mark on the board at position (i, j).
+ */
+
+SGFNode *
+sgfTriangle(SGFNode *node, int i, int j)
+{
+  char text[3];
+
+  gg_snprintf(text, 3, "%c%c", j+'a', i+'a');
+  sgfAddProperty(node, "TR", text);
+
+  return node;
+}
+
+
+/*
+ * Place a label on the board at position (i, j).
+ */
+
+SGFNode *
+sgfLabel(SGFNode *node, const char *label, int i, int j)
+{
+  /* allows 12 chars labels - more than enough */
+  char text[16];
+
+  gg_snprintf(text, 16, "%c%c:%s", j+'a', i+'a', label);
+  sgfAddProperty(node, "LB", text);
+
+  return node;
+}
+
+
+/*
+ * Place a numeric label on the board at position (i, j).
+ */
+
+SGFNode *
+sgfLabelInt(SGFNode *node, int num, int i, int j)
+{
+  char text[16];
+
+  gg_snprintf(text, 16, "%c%c:%d", j+'a', i+'a', num);
+  sgfAddProperty(node, "LB", text);
+
+  return node;
+}
+
+
+/*
+ * Place a circle mark on the board at position (i, j).
+ */
+
+SGFNode *
+sgfCircle(SGFNode *node, int i, int j)
+{
+  char text[3];
+
+  gg_snprintf(text, 3, "%c%c", j+'a', i+'a');
+  sgfAddProperty(node, "CR", text);
+
+  return node;
+}
+
+
+/*
+ * Place a square mark on the board at position (i, j).
+ */
+
+SGFNode *
+sgfSquare(SGFNode *node, int i, int j)
+{
+  return sgfMark(node, i, j);   /* cgoban 1.9.5 does not understand SQ */
+}
+
+
+/*
+ * Place a (square) mark on the board at position (i, j).
+ */
+
+SGFNode *
+sgfMark(SGFNode *node, int i, int j)
+{
+  char text[3];
+
+  gg_snprintf(text, 3, "%c%c", j+'a', i+'a');
+  sgfAddProperty(node, "MA", text);
+
+  return node;
+}
+
+
+/*
+ * Start a new variant. Returns a pointer to the new node.
+ */
+
+SGFNode *
+sgfStartVariant(SGFNode *node)
+{
+  assert(node);
+  assert(node->parent);
+
+  while (node->next)
+    node = node->next;
+  node->next = sgfNewNode();
+  node->next->parent = node->parent;
+
+  return node->next;
+}
+
+
+/*
+ * Start a new variant as first child. Returns a pointer to the new node.
+ */
+
+SGFNode *
+sgfStartVariantFirst(SGFNode *node)
+{
+  SGFNode *old_first_child = node;
+  SGFNode *new_first_child = sgfNewNode();
+
+  assert(node);
+  assert(node->parent);
+
+  new_first_child->next = old_first_child;
+  new_first_child->parent = old_first_child->parent;
+
+  new_first_child->parent->child = new_first_child;
+
+  return new_first_child;
+}
+
+
+/*
+ * If no child exists, add one. Otherwise add a sibling to the
+ * existing children. Returns a pointer to the new node.
+ */
+
+SGFNode *
+sgfAddChild(SGFNode *node)
+{
+  SGFNode *new_node = sgfNewNode();
+  assert(node);
+
+  new_node->parent = node;
+  
+  if (!node->child)
+    node->child = new_node;
+  else {
+    node = node->child;
+    while (node->next)
+      node = node->next;
+    node->next = new_node;
+  }
+
+  return new_node;
+}
+
+
+/*
+ * Write result of the game to the game tree.
+ */
+
+void
+sgfWriteResult(SGFNode *node, float score, int overwrite)
+{
+  char text[8];
+  char winner;
+  float s;
+  int dummy;
+
+  /* If not writing to the SGF file, skip everything and return now. */
+  if (!node)
+    return;
+
+  /* If not overwriting and there already is a result property, return. */
+  if (!overwrite)
+    if (sgfGetIntProperty(node, "RE", &dummy))
+      return;
+
+  if (score > 0.0) {
+    winner = 'W';
+    s = score;
+  }
+  else if (score < 0.0) {
+    winner = 'B';
+    s = -score;
+  }
+  else {
+    winner = '0';
+    s = 0;
+  }
+
+  if (winner == '0')
+    gg_snprintf(text, 8, "0");
+  else if (score < 1000.0 && score > -1000.0)
+    gg_snprintf(text, 8, "%c+%3.1f", winner, s);
+  else
+    gg_snprintf(text, 8, "%c+%c", winner, 'R');
+  sgfOverwriteProperty(node, "RE", text);
+}
+
+
+static void
+sgf_write_header_reduced(SGFNode *root, int overwrite)
+{
+  time_t curtime = time(NULL);
+  struct tm *loctime = localtime(&curtime);
+  char str[128];
+  int dummy;
+
+  gg_snprintf(str, 128, "%4.4i-%2.2i-%2.2i",
+             loctime->tm_year+1900, loctime->tm_mon+1, loctime->tm_mday);
+  if (overwrite || !sgfGetIntProperty(root, "DT", &dummy))
+    sgfOverwriteProperty(root, "DT", str);
+  if (overwrite || !sgfGetIntProperty(root, "AP", &dummy))
+    sgfOverwriteProperty(root, "AP", "GNU Go:"VERSION);
+  sgfOverwriteProperty(root, "FF", "4");
+}
+
+
+void
+sgf_write_header(SGFNode *root, int overwrite, int seed, float komi,
+                int handicap, int level, int rules)
+{
+  char str[128];
+  int dummy;
+
+  gg_snprintf(str, 128, "GNU Go %s Random Seed %d level %d", 
+             VERSION, seed, level);
+  if (overwrite || !sgfGetIntProperty(root, "GN", &dummy))
+    sgfOverwriteProperty(root, "GN", str);
+  if (overwrite || !sgfGetIntProperty(root, "RU", &dummy))
+    sgfOverwriteProperty(root, "RU", rules ? "Chinese" : "Japanese");
+  sgfOverwritePropertyFloat(root, "KM", komi);
+  sgfOverwritePropertyInt(root, "HA", handicap);
+
+  sgf_write_header_reduced(root, overwrite);
+}
+
+
+/* ================================================================ */
+/*                          Read SGF tree                           */
+/* ================================================================ */
+
+
+#define MAX_FILE_BUFFER 200000 /* buffer for reading SGF file. */
+
+/*
+ * SGF grammar:
+ *
+ * Collection = GameTree { GameTree }
+ * GameTree   = "(" Sequence { GameTree } ")"
+ * Sequence   = Node { Node }
+ * Node       = ";" { Property }
+ * Property   = PropIdent PropValue { PropValue }
+ * PropIdent  = UcLetter { UcLetter }
+ * PropValue  = "[" CValueType "]"
+ * CValueType = (ValueType | Compose)
+ * ValueType  = (None | Number | Real | Double | Color | SimpleText |
+ *               Text | Point  | Move | Stone)
+ *
+ * The above grammar has a number of simple properties which enables us
+ * to write a simpler parser:
+ *   1) There is never a need for backtracking
+ *   2) The only recursion is on gametree.
+ *   3) Tokens are only one character
+ * 
+ * We will use a global state to keep track of the remaining input
+ * and a global char variable, `lookahead' to hold the next token.  
+ * The function `nexttoken' skips whitespace and fills lookahead with 
+ * the new token.
+ */
+
+
+static void parse_error(const char *msg, int arg);
+static void nexttoken(void);
+static void match(int expected);
+
+
+static FILE *sgffile;
+
+
+#define sgf_getch() (getc(sgffile))
+
+
+static char *sgferr;
+#ifdef TEST_SGFPARSER
+static int sgferrarg;
+#endif
+static int sgferrpos;
+
+static int lookahead;
+
+
+/* ---------------------------------------------------------------- */
+/*                       Parsing primitives                         */
+/* ---------------------------------------------------------------- */
+
+
+static void
+parse_error(const char *msg, int arg)
+{
+  fprintf(stderr, msg, arg);
+  fprintf(stderr, "\n");
+  exit(EXIT_FAILURE);
+}
+
+
+static void
+nexttoken()
+{
+  do
+    lookahead = sgf_getch();
+  while (isspace(lookahead));
+}
+
+
+static void
+match(int expected)
+{
+  if (lookahead != expected)
+    parse_error("expected: %c", expected);
+  else
+    nexttoken();
+}
+
+/* ---------------------------------------------------------------- */
+/*                        The parser proper                         */
+/* ---------------------------------------------------------------- */
+
+
+static void
+propident(char *buffer, int size)
+{
+  if (lookahead == EOF || !isupper(lookahead)) 
+    parse_error("Expected an upper case letter.", 0);
+  
+  while (lookahead != EOF && isalpha(lookahead)) {
+    if (isupper(lookahead) && size > 1) {
+      *buffer++ = lookahead;
+      size--;
+    }
+    nexttoken();
+  }
+  *buffer = '\0';
+}
+
+
+static void
+propvalue(char *buffer, int size)
+{
+  char *p = buffer;
+
+  match('[');
+  while (lookahead != ']' && lookahead != EOF) {
+    if (lookahead == '\\') {
+      lookahead = sgf_getch();
+      /* Follow the FF4 definition of backslash */
+      if (lookahead == '\r') {
+       lookahead = sgf_getch();
+       if (lookahead == '\n') 
+         lookahead = sgf_getch();
+      }
+      else if (lookahead == '\n') {
+       lookahead = sgf_getch();
+       if (lookahead == '\r') 
+         lookahead = sgf_getch();
+      }
+    }
+    if (size > 1) {
+      *p++ = lookahead;
+      size--;
+    }
+    lookahead = sgf_getch();
+  }
+  match(']');
+  
+  /* Remove trailing whitespace. The double cast below is needed
+   * because "char" may be represented as a signed char, in which case
+   * characters between 128 and 255 would be negative and a direct
+   * cast to int would cause a negative value to be passed to isspace,
+   * possibly causing an assertion failure.
+   */
+  --p;
+  while (p > buffer && isspace((int) (unsigned char) *p))
+    --p;
+  *++p = '\0';
+}
+
+
+static SGFProperty *
+property(SGFNode *n, SGFProperty *last)
+{
+  char name[3];
+  char buffer[4000];
+
+  propident(name, sizeof(name));
+  do {
+    propvalue(buffer, sizeof(buffer));
+    last = sgfMkProperty(name, buffer, n, last);
+  } while (lookahead == '[');
+  return last;
+}
+
+
+static void
+node(SGFNode *n)
+{
+  SGFProperty *last = NULL;
+  match(';');
+  while (lookahead != EOF && isupper(lookahead))
+    last = property(n, last);
+}
+
+
+static SGFNode *
+sequence(SGFNode *n)
+{
+  node(n);
+  while (lookahead == ';') {
+    SGFNode *new = sgfNewNode();
+    new->parent = n;
+    n->child = new;
+    n = new;
+    node(n);
+  }
+  return n;
+}
+
+
+static void
+gametree(SGFNode **p, SGFNode *parent, int mode) 
+{
+  if (mode == STRICT_SGF)
+    match('(');
+  else
+    for (;;) {
+      if (lookahead == EOF) {
+       parse_error("Empty file?", 0);
+       break;
+      }
+      if (lookahead == '(') {
+       while (lookahead == '(')
+         nexttoken();
+       if (lookahead == ';')
+         break;
+      }
+      nexttoken();
+    }
+
+  /* The head is parsed */
+  {
+    SGFNode *head = sgfNewNode();
+    SGFNode *last;
+
+    head->parent = parent;
+    *p = head;
+
+    last = sequence(head);
+    p = &last->child;
+    while (lookahead == '(') {
+      gametree(p, last, STRICT_SGF);
+      p = &((*p)->next);
+    }
+    if (mode == STRICT_SGF)
+      match(')');
+  }
+}
+
+
+/*
+ * Fuseki readers
+ * Reads an SGF file for extract_fuseki in a compact way
+ */
+
+static void
+gametreefuseki(SGFNode **p, SGFNode *parent, int mode, 
+              int moves_per_game, int i)
+{
+  if (mode == STRICT_SGF)
+    match('(');
+  else
+    for (;;) {
+      if (lookahead == EOF) {
+       parse_error("Empty file?", 0);
+       break;
+      }
+      if (lookahead == '(') {
+       while (lookahead == '(')
+         nexttoken();
+       if (lookahead == ';')
+         break;
+      }
+      nexttoken();
+    }
+  
+  /* The head is parsed */
+  {
+
+    SGFNode *head = sgfNewNode();
+    SGFNode *last;
+    head->parent = parent;
+    *p = head;
+    
+    last = sequence(head);
+    p = &last->child;
+    while (lookahead == '(') {
+      if (last->props 
+         && (last->props->name == SGFB || last->props->name == SGFW))
+       i++;
+      /* break after number_of_moves moves in SGF file */
+      if (i >= moves_per_game) { 
+       last->child = NULL;
+       last->next = NULL;
+       break;
+      }
+      else {
+       gametreefuseki(p, last, mode, moves_per_game, i);
+       p = &((*p)->next);
+      }
+    }
+    if (mode == STRICT_SGF)
+      match(')');
+  }
+}
+
+SGFNode *
+readsgffilefuseki(const char *filename, int moves_per_game)
+{
+  SGFNode *root;
+  int tmpi = 0;
+
+  if (strcmp(filename, "-") == 0)
+    sgffile = stdin;
+  else
+    sgffile = fopen(filename, "r");
+
+  if (!sgffile)
+    return NULL;
+
+
+  nexttoken();
+  gametreefuseki(&root, NULL, LAX_SGF, moves_per_game, 0);
+
+  fclose(sgffile);
+
+  if (sgferr) {
+    fprintf(stderr, "Parse error: %s at position %d\n", sgferr, sgferrpos);
+    sgfFreeNode(root);
+    return NULL;
+  }
+
+  /* perform some simple checks on the file */
+  if (!sgfGetIntProperty(root, "GM", &tmpi)) {
+    if (VERBOSE_WARNINGS)
+      fprintf(stderr, "Couldn't find the game type (GM) attribute!\n");
+  }
+  else if (tmpi != 1) {
+    fprintf(stderr, "SGF file might be for game other than go: %d\n", tmpi);
+    fprintf(stderr, "Trying to load anyway.\n");
+  }
+
+  if (!sgfGetIntProperty(root, "FF", &tmpi)) {
+    if (VERBOSE_WARNINGS)
+      fprintf(stderr, "Can not determine SGF spec version (FF)!\n");
+  }
+  else if ((tmpi < 3 || tmpi > 4) && VERBOSE_WARNINGS)
+    fprintf(stderr, "Unsupported SGF spec version: %d\n", tmpi);
+
+  return root;
+}
+
+
+
+
+
+/*
+ * Wrapper around readsgf which reads from a file rather than a string.
+ * Returns NULL if file will not open, or some other parsing error.
+ * Filename "-" means read from stdin, and leave it open when done.
+ */
+
+SGFNode *
+readsgffile(const char *filename)
+{
+  SGFNode *root;
+  int tmpi = 0;
+
+  if (strcmp(filename, "-") == 0)
+    sgffile = stdin;
+  else
+    sgffile = fopen(filename, "r");
+
+  if (!sgffile)
+    return NULL;
+
+
+  nexttoken();
+  gametree(&root, NULL, LAX_SGF);
+
+  if (sgffile != stdin)
+    fclose(sgffile);
+
+  if (sgferr) {
+    fprintf(stderr, "Parse error: %s at position %d\n", sgferr, sgferrpos);
+    sgfFreeNode(root);
+    return NULL;
+  }
+
+  /* perform some simple checks on the file */
+  if (!sgfGetIntProperty(root, "GM", &tmpi)) {
+    if (VERBOSE_WARNINGS)
+      fprintf(stderr, "Couldn't find the game type (GM) attribute!\n");
+  }
+  else if (tmpi != 1) {
+    fprintf(stderr, "SGF file might be for game other than go: %d\n", tmpi);
+    fprintf(stderr, "Trying to load anyway.\n");
+  }
+
+  if (!sgfGetIntProperty(root, "FF", &tmpi)) {
+    if (VERBOSE_WARNINGS)
+      fprintf(stderr, "Can not determine SGF spec version (FF)!\n");
+  }
+  else if ((tmpi < 3 || tmpi > 4) && VERBOSE_WARNINGS)
+    fprintf(stderr, "Unsupported SGF spec version: %d\n", tmpi);
+
+  return root;
+}
+
+
+
+/* ================================================================ */
+/*                          Write SGF tree                          */
+/* ================================================================ */
+
+
+#define OPTION_STRICT_FF4 0
+
+static int sgf_column = 0;
+
+static void
+sgf_putc(int c, FILE *file)
+{
+  if (c == '\n' && sgf_column == 0)
+    return;
+
+  fputc(c, file);
+
+  if (c == '\n')
+    sgf_column = 0;
+  else
+    sgf_column++;
+
+  if (c == ']' && sgf_column > 60) {
+    fputc('\n', file);
+    sgf_column = 0;
+  }
+}
+
+static void
+sgf_puts(const char *s, FILE *file)
+{
+  for (; *s; s++) {
+    if (*s == '[' || *s == ']' || *s == '\\') {
+      fputc('\\', file);
+      sgf_column++;
+    }
+    fputc((int) *s, file);
+    sgf_column++;
+  }
+}
+
+/* Print all properties with the given name in a node to file and mark
+ * them as printed.
+ *
+ * If is_comment is 1, multiple properties are concatenated with a
+ * newline. I.e. we write
+ *
+ * C[comment1
+ * comment2]
+ *
+ * instead of
+ *
+ * C[comment1][comment2]
+ *
+ * Most other property types should be written in the latter style.
+ */
+
+static void
+sgf_print_name(FILE *file, short name)
+{
+  sgf_putc(name & 0xff, file);
+  if (name >> 8 != ' ')
+    sgf_putc(name >> 8, file);
+}
+
+static void
+sgf_print_property(FILE *file, SGFNode *node, short name, int is_comment)
+{
+  int n = 0;
+  SGFProperty *prop;
+
+  for (prop = node->props; prop; prop = prop->next) {
+    if (prop->name == name) {
+      prop->name |= 0x20;  /* Indicate already printed. */
+      if (n == 0) {
+       sgf_print_name(file, name);
+       sgf_putc('[', file);
+      }
+      else if (is_comment)
+       sgf_putc('\n', file);
+      else {
+       sgf_putc(']', file);
+       sgf_putc('[', file);
+      }
+      
+      sgf_puts(prop->value, file);
+      n++;
+    }
+  }
+
+  if (n > 0)
+    sgf_putc(']', file);
+
+  /* Add a newline after certain properties. */
+  if (name == SGFAB || name == SGFAW || name == SGFAE || (is_comment && n > 1))
+    sgf_putc('\n', file);
+}
+
+/*
+ * Print all remaining unprinted property values at node N to file.
+ */
+
+static void
+sgfPrintRemainingProperties(FILE *file, SGFNode *node)
+{
+  SGFProperty *prop;
+
+  for (prop = node->props; prop; prop = prop->next)
+    if (!(prop->name & 0x20))
+      sgf_print_property(file, node, prop->name, 0);
+}
+
+
+/*
+ * Print the property values of NAME at node N and mark it as printed. 
+ */
+
+static void
+sgfPrintCharProperty(FILE *file, SGFNode *node, const char *name)
+{
+  short nam = name[0] | name[1] << 8;
+  
+  sgf_print_property(file, node, nam, 0);
+}
+
+
+/*
+ * Print comments from Node node.
+ *
+ * NOTE: cgoban does not print "C[comment1][comment2]" and I don't know
+ *       what the sgfspec says.
+ */
+
+static void
+sgfPrintCommentProperty(FILE *file, SGFNode *node, const char *name)
+{
+  short nam = name[0] | name[1] << 8;
+  
+  sgf_print_property(file, node, nam, 1);
+}
+
+
+static void
+unparse_node(FILE *file, SGFNode *node)
+{
+  sgf_putc(';', file);
+  sgfPrintCharProperty(file, node, "B ");
+  sgfPrintCharProperty(file, node, "W ");
+  sgfPrintCommentProperty(file, node, "N ");
+  sgfPrintCommentProperty(file, node, "C ");
+  sgfPrintRemainingProperties(file, node);
+}
+
+
+static void
+unparse_root(FILE *file, SGFNode *node)
+{
+  sgf_putc(';', file);
+  
+  if (sgfHasProperty(node, "GM"))
+    sgfPrintCharProperty(file, node, "GM");
+  else {
+    fputs("GM[1]", file);
+    sgf_column += 5;
+  }
+  
+  sgfPrintCharProperty(file, node, "FF");
+  sgf_putc('\n', file);
+
+  sgfPrintCharProperty(file, node, "SZ");
+  sgf_putc('\n', file);
+  
+  sgfPrintCharProperty(file, node, "GN");
+  sgf_putc('\n', file);
+  
+  sgfPrintCharProperty(file, node, "DT");
+  sgf_putc('\n', file);
+  
+  sgfPrintCommentProperty(file, node, "PB");
+  sgfPrintCommentProperty(file, node, "BR");
+  sgf_putc('\n', file);
+  
+  sgfPrintCommentProperty(file, node, "PW");
+  sgfPrintCommentProperty(file, node, "WR");
+  sgf_putc('\n', file);
+  
+  sgfPrintCommentProperty(file, node, "N ");
+  sgfPrintCommentProperty(file, node, "C ");
+  sgfPrintRemainingProperties(file, node);
+
+  sgf_putc('\n', file);
+}
+
+
+/*
+ * p->child is the next move.
+ * p->next  is the next variation
+ */
+
+static void
+unparse_game(FILE *file, SGFNode *node, int root)
+{
+  if (!root)
+    sgf_putc('\n', file);
+  sgf_putc('(', file);
+  if (root)
+    unparse_root(file, node);
+  else
+    unparse_node(file, node);
+
+  node = node->child;
+  while (node != NULL && node->next == NULL) {
+    unparse_node(file, node);
+    node = node->child;
+  } 
+
+  while (node != NULL) {
+    unparse_game(file, node, 0);
+    node = node->next;
+  }
+  sgf_putc(')', file);
+  if (root)
+    sgf_putc('\n', file);
+}
+
+/* Printed properties are marked by adding the 0x20 bit to the
+ * property name (changing an upper case letter to lower case). This
+ * function removes this mark so that we can print the property next
+ * time too. It recurses to all properties in the linked list.
+ */
+static void
+restore_property(SGFProperty *prop)
+{
+  if (prop) {
+    restore_property(prop->next);
+    prop->name &= ~0x20;
+  }
+}
+
+/* When called with the tree root, recurses to all properties in the
+ * tree and removes all print marks.
+ */
+static void
+restore_node(SGFNode *node)
+{
+  if (node) {
+    restore_property(node->props);
+    restore_node(node->child);
+    restore_node(node->next);
+  }
+}
+
+
+/*
+ * Opens filename and writes the game stored in the sgf structure.
+ */
+
+int
+writesgf(SGFNode *root, const char *filename)
+{
+  FILE *outfile;
+
+  if (strcmp(filename, "-") == 0) 
+    outfile = stdout;
+  else
+    outfile = fopen(filename, "w");
+
+  if (!outfile) {
+    fprintf(stderr, "Can not open %s\n", filename);
+    return 0;
+  }
+
+  sgf_write_header_reduced(root, 0);
+
+  sgf_column = 0;
+  unparse_game(outfile, root, 1);
+  if (outfile != stdout)
+    fclose(outfile);
+  
+  /* Remove "printed" marks so that the tree can be written multiple
+   * times.
+   */
+  restore_node(root);
+  
+  return 1;
+}
+
+
+#ifdef TEST_SGFPARSER
+int
+main()
+{
+  static char buffer[25000];
+  static char output[25000];
+  SGFNode *game;
+
+  sgffile = stdin;
+
+  nexttoken();
+  gametree(&game, LAX_SGF);
+  if (sgferr) {
+    fprintf(stderr, "Parse error:");
+    fprintf(stderr, sgferr, sgferrarg);
+    fprintf(stderr, " at position %d\n", sgferrpos);
+  }
+  else {
+    unparse_game(stdin, game, 1);
+    write(1, output, outputp - output);
+  }
+}
+#endif
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/sgf/sgftree.c b/sgf/sgftree.c
new file mode 100644 (file)
index 0000000..67cc39a
--- /dev/null
@@ -0,0 +1,327 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <assert.h>
+
+#include "gg_utils.h"
+#include "sgftree.h"
+
+void
+sgftree_clear(SGFTree *tree)
+{
+  tree->root = NULL;
+  tree->lastnode = NULL;
+}
+
+int
+sgftree_readfile(SGFTree *tree, const char *infilename)
+{
+  SGFNode *savetree = tree->root;
+
+  tree->root = readsgffile(infilename);
+  if (tree->root == NULL) {
+    tree->root = savetree;
+    return 0;
+  }
+  
+  sgfFreeNode(savetree);
+  tree->lastnode = NULL;
+  return 1;
+}
+
+
+/* Go back one node in the tree. If lastnode is NULL, go to the last
+ * node (the one in main variant which has no children).
+ */
+
+int
+sgftreeBack(SGFTree *tree)
+{
+  if (tree->lastnode) {
+    if (tree->lastnode->parent)
+      tree->lastnode = tree->lastnode->parent;
+    else
+      return 0;
+  }
+  else
+    while (sgftreeForward(tree))
+      ;
+  
+  return 1;
+}
+
+
+/* Go forward one node in the tree. If lastnode is NULL, go to the
+ * tree root.
+ */
+
+int
+sgftreeForward(SGFTree *tree)
+{
+  if (tree->lastnode) {
+    if (tree->lastnode->child)
+      tree->lastnode = tree->lastnode->child;
+    else
+      return 0;
+  }
+  else
+    tree->lastnode = tree->root;
+  
+  return 1;
+}
+
+
+/* ================================================================ */
+/*                        High level functions                      */
+/* ================================================================ */
+
+/*
+ * Returns the node to modify. Use lastnode if available, otherwise
+ * follow the main variation to the current end of the game.
+ */
+
+SGFNode *
+sgftreeNodeCheck(SGFTree *tree)
+{
+  SGFNode *node = NULL;
+  assert(tree->root);
+
+  if (tree->lastnode)
+    node = tree->lastnode;
+  else {
+    node = tree->root;
+    while (node->child)
+      node = node->child;
+  }
+
+  return node;
+}
+
+
+/*
+ * Add a stone to the current or the given node.
+ * Return the node where the stone was added.
+ */
+
+void
+sgftreeAddStone(SGFTree *tree, int color, int movex, int movey)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  sgfAddStone(node, color, movex, movey);
+}
+
+
+/*
+ * Add a move to the gametree.
+ */
+
+void
+sgftreeAddPlay(SGFTree *tree, int color, int movex, int movey)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  tree->lastnode = sgfAddPlay(node, color, movex, movey);
+}
+
+
+/*
+ * Add a move to the gametree. New variations are added after the old
+ * ones rather than before.
+ */
+
+void
+sgftreeAddPlayLast(SGFTree *tree, int color, int movex, int movey)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  tree->lastnode = sgfAddPlayLast(node, color, movex, movey);
+}
+
+
+void
+sgftreeCreateHeaderNode(SGFTree *tree, int boardsize, float komi, int handicap)
+{
+  SGFNode *root = sgfNewNode();
+
+  sgfAddPropertyInt(root, "SZ", boardsize);
+  sgfAddPropertyFloat(root, "KM", komi);
+  sgfAddPropertyInt(root, "HA", handicap);
+  tree->root = root;
+  tree->lastnode = root;
+}
+
+
+/*
+ * Add a comment to a gametree.
+ */
+
+void
+sgftreeAddComment(SGFTree *tree, const char *comment)
+{
+  SGFNode *node;
+  assert(tree && tree->root);
+
+  node = sgftreeNodeCheck(tree);
+  sgfAddComment(node, comment);
+}
+
+
+/*
+ * Place text on the board at position (i, j).
+ */
+
+void
+sgftreeBoardText(SGFTree *tree, int i, int j, const char *text)
+{
+  SGFNode *node;
+  assert(tree->root);
+
+  node = sgftreeNodeCheck(tree);
+  sgfBoardText(node, i, j, text);
+}
+
+
+/*
+ * Place a character on the board at position (i, j).
+ */
+
+void
+sgftreeBoardChar(SGFTree *tree, int i, int j, char c)
+{
+  SGFNode *node;
+  assert(tree->root);
+
+  node = sgftreeNodeCheck(tree);
+  sgfBoardChar(node, i, j, c);
+}
+
+
+/*
+ * Place a number on the board at position (i, j).
+ */
+
+void
+sgftreeBoardNumber(SGFTree *tree, int i, int j, int number)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  sgfBoardNumber(node, i, j, number);
+}
+
+
+/*
+ * Place a circle mark on the board at position (i, j).
+ */
+
+void
+sgftreeTriangle(SGFTree *tree, int i, int j)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  sgfTriangle(node, i, j);
+}
+
+
+/*
+ * Place a circle mark on the board at position (i, j).
+ */
+
+void
+sgftreeCircle(SGFTree *tree, int i, int j)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  sgfCircle(node, i, j);
+}
+
+
+/*
+ * Place a square mark on the board at position (i, j).
+ */
+
+void
+sgftreeSquare(SGFTree *tree, int i, int j)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  sgfSquare(node, i, j);
+}
+
+
+/*
+ * Place a (square) mark on the board at position (i, j).
+ */
+
+void
+sgftreeMark(SGFTree *tree, int i, int j)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  sgfMark(node, i, j);
+}
+
+
+/*
+ * Start a new variant.
+ */
+
+void
+sgftreeStartVariant(SGFTree *tree)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  tree->lastnode = sgfStartVariant(node);
+}
+
+
+/*
+ * Start a new variant as first child.
+ */
+
+void
+sgftreeStartVariantFirst(SGFTree *tree)
+{
+  SGFNode *node = sgftreeNodeCheck(tree);
+  tree->lastnode = sgfStartVariantFirst(node);
+}
+
+
+/*
+ * Write result of the game to the game tree.
+ */
+
+void
+sgftreeWriteResult(SGFTree *tree, float score, int overwrite)
+{
+  assert(tree->root);
+
+  sgfWriteResult(tree->root, score, overwrite);
+}
+
+
+void
+sgftreeSetLastNode(SGFTree *tree, SGFNode *last_node)
+{
+  tree->lastnode = last_node;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
+
diff --git a/sgf/sgftree.h b/sgf/sgftree.h
new file mode 100644 (file)
index 0000000..dfeaf05
--- /dev/null
@@ -0,0 +1,179 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _SGFTREE_H_
+#define _SGFTREE_H_
+
+#include <stdio.h>
+
+#include "sgf_properties.h"
+
+
+#ifndef _BOARD_H_
+/*
+ * NOTE: These MUST coincide with the definitions for the engine that we
+ *       are using. In this case they are defined in engine/gnugo.h.
+ *
+ * The reason that we put them here within the #ifndef clause is because
+ * we want to decouple the GNU Go engine from SGF library, but we don't 
+ * want to redefine these symbols if we include this file into board.h.
+ */
+
+#define EMPTY 0
+#define WHITE 1
+#define BLACK 2
+#endif
+
+
+void *xalloc(unsigned int);
+
+/*
+ * A property of an SGF node.  An SGF node is described by a linked
+ * list of these.
+ */
+
+typedef struct SGFProperty_t {
+  struct SGFProperty_t *next;
+  short name;
+  char *value;
+} SGFProperty;
+
+    
+typedef struct SGFNode_t {
+  SGFProperty *props;
+  struct SGFNode_t *parent;
+  struct SGFNode_t *child;
+  struct SGFNode_t *next;
+} SGFNode;
+
+
+/* low level functions */
+SGFNode *sgfPrev(SGFNode *node);
+SGFNode *sgfRoot(SGFNode *node);
+SGFNode *sgfNewNode(void);
+void sgfFreeNode(SGFNode *node);
+
+int sgfGetIntProperty(SGFNode *node, const char *name, int *value);
+int sgfGetFloatProperty(SGFNode *node, const char *name, float *value);
+int sgfGetCharProperty(SGFNode *node, const char *name, char **value);
+void sgfAddProperty(SGFNode *node, const char *name, const char *value);
+void sgfAddPropertyInt(SGFNode *node, const char *name, long val);
+void sgfAddPropertyFloat(SGFNode *node, const char *name, float val);
+void sgfOverwriteProperty(SGFNode *node, const char *name, const char *text);
+void sgfOverwritePropertyFloat(SGFNode *node, const char *name, float val);
+void sgfOverwritePropertyInt(SGFNode *node, const char *name, int val);
+void *xrealloc(void *pt, unsigned int size);
+SGFProperty *sgfMkProperty(const char *name, const  char *value,
+                          SGFNode *node, SGFProperty *last);
+void sgfFreeProperty(SGFProperty *prop);
+
+SGFNode *sgfAddStone(SGFNode *node, int color, int movex, int movey);
+SGFNode *sgfAddPlay(SGFNode *node, int who, int movex, int movey);
+SGFNode *sgfAddPlayLast(SGFNode *node, int who, int movex, int movey);
+
+void sgfWriteResult(SGFNode *node, float score, int overwrite);
+void sgf_write_header(SGFNode *root, int overwrite, int seed, float komi,
+                     int handicap, int level, int rules);
+
+SGFNode *sgfLabel(SGFNode *node, const char *label, int i, int j);
+SGFNode *sgfLabelInt(SGFNode *node, int num, int i, int j);
+SGFNode *sgfCircle(SGFNode *node, int i, int j);
+SGFNode *sgfSquare(SGFNode *node, int i, int j);
+SGFNode *sgfTriangle(SGFNode *node, int i, int j);
+SGFNode *sgfMark(SGFNode *node, int i, int j);
+SGFNode *sgfAddComment(SGFNode *node, const char *comment);
+SGFNode *sgfBoardText(SGFNode *node, int i, int j, const char *text);
+SGFNode *sgfBoardChar(SGFNode *node, int i, int j, char c);
+SGFNode *sgfBoardNumber(SGFNode *node, int i, int j, int number);
+SGFNode *sgfStartVariant(SGFNode *node);
+SGFNode *sgfStartVariantFirst(SGFNode *node);
+SGFNode *sgfAddChild(SGFNode *node);
+
+SGFNode *sgfCreateHeaderNode(int boardsize, float komi, int handicap);
+
+/* Read SGF tree from file. */
+SGFNode *readsgffile(const char *filename);
+/* Specific solution for fuseki */
+SGFNode *readsgffilefuseki(const char *filename, int moves_per_game);
+
+/* Write SGF tree to a file. */
+int writesgf(SGFNode *root, const char *filename);
+
+
+/* ---------------------------------------------------------------- */
+/* ---                          SGFTree                         --- */
+/* ---------------------------------------------------------------- */
+
+
+typedef struct SGFTree_t {
+  SGFNode *root;
+  SGFNode *lastnode;
+} SGFTree;
+
+
+void sgftree_clear(SGFTree *tree);
+int sgftree_readfile(SGFTree *tree, const char *infilename);
+
+int sgftreeBack(SGFTree *tree);
+int sgftreeForward(SGFTree *tree);
+
+void sgftreeAddPlay(SGFTree *tree, int color, int movex, int movey);
+void sgftreeAddPlayLast(SGFTree *tree, int color, int movex, int movey);
+void sgftreeAddStone(SGFTree *tree, int color, int movex, int movey);
+void sgftreeWriteResult(SGFTree *tree, float score, int overwrite);
+SGFNode *sgftreeNodeCheck(SGFTree *tree);
+        
+void sgftreeCircle(SGFTree *tree, int i, int j);
+void sgftreeSquare(SGFTree *tree, int i, int j);
+void sgftreeTriangle(SGFTree *tree, int i, int j);
+void sgftreeMark(SGFTree *tree, int i, int j);
+void sgftreeAddComment(SGFTree *tree, const char *comment);
+void sgftreeBoardText(SGFTree *tree, int i, int j, const char *text);
+void sgftreeBoardChar(SGFTree *tree, int i, int j, char c);
+void sgftreeBoardNumber(SGFTree *tree, int i, int j, int number);
+void sgftreeStartVariant(SGFTree *tree);
+void sgftreeStartVariantFirst(SGFTree *tree);
+void sgftreeCreateHeaderNode(SGFTree *tree, int boardsize, float komi,
+                            int handicap);
+void sgftreeSetLastNode(SGFTree *tree, SGFNode *lastnode);
+
+
+/* ---------------------------------------------------------------- */
+/* ---                         Utilities                        --- */
+/* ---------------------------------------------------------------- */
+
+
+int get_moveX(SGFProperty *property, int boardsize);
+int get_moveY(SGFProperty *property, int boardsize);
+int get_moveXY(SGFProperty *property, int *i, int *j, int boardsize);
+
+int show_sgf_properties(SGFNode *node);
+int show_sgf_tree(SGFNode *node);
+int is_markup_node(SGFNode *node);
+int is_move_node(SGFNode *node);
+int is_pass_node(SGFNode *node, int boardsize);
+int find_move(SGFNode *node);
+
+
+#endif
+
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
new file mode 100644 (file)
index 0000000..06fae36
--- /dev/null
@@ -0,0 +1,9 @@
+SET(utils_STAT_SRCS
+    getopt.c
+    getopt1.c
+    random.c
+    gg_utils.c
+    winsocket.c
+    )
+
+ADD_LIBRARY(utils STATIC ${utils_STAT_SRCS})
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644 (file)
index 0000000..08568f2
--- /dev/null
@@ -0,0 +1,10 @@
+noinst_LIBRARIES = libutils.a
+
+EXTRA_DIST = utils.dsp CMakeLists.txt
+
+libutils_a_SOURCES = getopt.c getopt1.c random.c gg_utils.c winsocket.c
+
+noinst_HEADERS = gg-getopt.h random.h gg_utils.h winsocket.h
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644 (file)
index 0000000..cf8ffdc
--- /dev/null
@@ -0,0 +1,400 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = utils
+DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libutils_a_AR = $(AR) $(ARFLAGS)
+libutils_a_LIBADD =
+am_libutils_a_OBJECTS = getopt.$(OBJEXT) getopt1.$(OBJEXT) \
+       random.$(OBJEXT) gg_utils.$(OBJEXT) winsocket.$(OBJEXT)
+libutils_a_OBJECTS = $(am_libutils_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libutils_a_SOURCES)
+DIST_SOURCES = $(libutils_a_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DFA_ENABLED_FALSE = @DFA_ENABLED_FALSE@
+DFA_ENABLED_TRUE = @DFA_ENABLED_TRUE@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GCC_MAJOR_VERSION = @GCC_MAJOR_VERSION@
+GCC_MINOR_VERSION = @GCC_MINOR_VERSION@
+GCC_ONLY_FALSE = @GCC_ONLY_FALSE@
+GCC_ONLY_TRUE = @GCC_ONLY_TRUE@
+GNU_GO_WARNINGS = @GNU_GO_WARNINGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+glibconfig = @glibconfig@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_LIBRARIES = libutils.a
+EXTRA_DIST = utils.dsp CMakeLists.txt
+libutils_a_SOURCES = getopt.c getopt1.c random.c gg_utils.c winsocket.c
+noinst_HEADERS = gg-getopt.h random.h gg_utils.h winsocket.h
+
+# Remove these files here... they are created locally
+DISTCLEANFILES = *~
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  utils/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libutils.a: $(libutils_a_OBJECTS) $(libutils_a_DEPENDENCIES) 
+       -rm -f libutils.a
+       $(libutils_a_AR) libutils.a $(libutils_a_OBJECTS) $(libutils_a_LIBADD)
+       $(RANLIB) libutils.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gg_utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/winsocket.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/README b/utils/README
new file mode 100644 (file)
index 0000000..339028b
--- /dev/null
@@ -0,0 +1,11 @@
+The files getopt.h, getopt.c, getopt1.c are from glibc-2.1.2,
+
+The getopt functions are included because a lot of platforms do not have
+getopt functions for processing long options.  Some platforms (VC,MINGW32)
+don't have the getopt function that processes single letter options.
+
+getopt.h was renamed to gg-getopt.h to avoid conflicts with system provided
+getopt.h files.
+
+Function getopt was renamed gg_getopt to avoid conflicts with the system
+provided getopt function.
diff --git a/utils/getopt.c b/utils/getopt.c
new file mode 100644 (file)
index 0000000..e24e332
--- /dev/null
@@ -0,0 +1,1042 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to drepper@gnu.org
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
+       Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+\f
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+# ifndef const
+#  define const
+# endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+# include <gnu-versions.h>
+# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+/*#  define ELIDE_CODE*/
+# endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+# include <stdlib.h>
+# include <unistd.h>
+#endif /* GNU C library.  */
+
+#ifdef VMS
+# include <unixlib.h>
+# include <string.h>
+#endif
+
+#ifndef _
+/* This is for other GNU distributions with internationalized messages.
+   When compiling libc, the _ macro is predefined.  */
+# ifdef HAVE_LIBINTL_H
+#  include <libintl.h>
+#  define _(msgid)     gettext (msgid)
+# else
+#  define _(msgid)     (msgid)
+# endif
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "gg-getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *gg_optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int gg_optind = 1;
+
+/* Formerly, initialization of getopt depended on optind==0, which
+   causes problems with re-calling getopt as programs generally don't
+   know that. */
+
+int __getopt_initialized;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int gg_opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int gg_optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+# include <string.h>
+# define my_index      strchr
+#else
+
+#include <string.h>
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+       return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
+# if (!defined __STDC__ || !__STDC__) && !defined strlen
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
+# endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+\f
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+#ifdef _LIBC
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+
+static int nonoption_flags_max_len;
+static int nonoption_flags_len;
+
+static int original_argc;
+static char *const *original_argv;
+
+/* Make sure the environment variable bash 2.0 puts in the environment
+   is valid for the getopt call we must make sure that the ARGV passed
+   to getopt is that one passed to the process.  */
+static void
+__attribute__ ((unused))
+store_args_and_env (int argc, char *const *argv)
+{
+  /* XXX This is no good solution.  We should rather copy the args so
+     that we can compare them later.  But we must not use malloc(3).  */
+  original_argc = argc;
+  original_argv = argv;
+}
+# ifdef text_set_element
+text_set_element (__libc_subinit, store_args_and_env);
+# endif /* text_set_element */
+
+# define SWAP_FLAGS(ch1, ch2) \
+  if (nonoption_flags_len > 0)                                               \
+    {                                                                        \
+      char __tmp = __getopt_nonoption_flags[ch1];                            \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
+      __getopt_nonoption_flags[ch2] = __tmp;                                 \
+    }
+#else  /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+#if defined __STDC__ && __STDC__
+static void exchange (char **);
+#endif
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = gg_optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#ifdef _LIBC
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+        presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+       nonoption_flags_len = nonoption_flags_max_len = 0;
+      else
+       {
+         memset (__mempcpy (new_str, __getopt_nonoption_flags,
+                            nonoption_flags_max_len),
+                 '\0', top + 1 - nonoption_flags_max_len);
+         nonoption_flags_max_len = top + 1;
+         __getopt_nonoption_flags = new_str;
+       }
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+       {
+         /* Bottom segment is the short one.  */
+         int len = middle - bottom;
+         register int i;
+
+         /* Swap it with the top part of the top segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[top - (middle - bottom) + i];
+             argv[top - (middle - bottom) + i] = tem;
+             SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+           }
+         /* Exclude the moved bottom segment from further swapping.  */
+         top -= len;
+       }
+      else
+       {
+         /* Top segment is the short one.  */
+         int len = top - middle;
+         register int i;
+
+         /* Swap it with the bottom part of the bottom segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[middle + i];
+             argv[middle + i] = tem;
+             SWAP_FLAGS (bottom + i, middle + i);
+           }
+         /* Exclude the moved top segment from further swapping.  */
+         bottom += len;
+       }
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (gg_optind - last_nonopt);
+  last_nonopt = gg_optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+#if defined __STDC__ && __STDC__
+static const char *_getopt_initialize (int, char *const *, const char *);
+#endif
+static const char *
+_getopt_initialize (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  first_nonopt = last_nonopt = gg_optind;
+
+  nextchar = NULL;
+
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (posixly_correct != NULL)
+    ordering = REQUIRE_ORDER;
+  else
+    ordering = PERMUTE;
+
+#ifdef _LIBC
+  if (posixly_correct == NULL
+      && argc == original_argc && argv == original_argv)
+    {
+      if (nonoption_flags_max_len == 0)
+       {
+         if (__getopt_nonoption_flags == NULL
+             || __getopt_nonoption_flags[0] == '\0')
+           nonoption_flags_max_len = -1;
+         else
+           {
+             const char *orig_str = __getopt_nonoption_flags;
+             int len = nonoption_flags_max_len = strlen (orig_str);
+             if (nonoption_flags_max_len < argc)
+               nonoption_flags_max_len = argc;
+             __getopt_nonoption_flags =
+               (char *) malloc (nonoption_flags_max_len);
+             if (__getopt_nonoption_flags == NULL)
+               nonoption_flags_max_len = -1;
+             else
+               memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+                       '\0', nonoption_flags_max_len - len);
+           }
+       }
+      nonoption_flags_len = nonoption_flags_max_len;
+    }
+  else
+    nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct gg_option *longopts;
+     int *longind;
+     int long_only;
+{
+  gg_optarg = NULL;
+
+  if (gg_optind == 0 || !__getopt_initialized)
+    {
+      if (gg_optind == 0)
+       gg_optind = 1;  /* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring);
+      __getopt_initialized = 1;
+    }
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#ifdef _LIBC
+# define NONOPTION_P (argv[gg_optind][0] != '-' || argv[gg_optind][1] == '\0'        \
+                     || (gg_optind < nonoption_flags_len                             \
+                         && __getopt_nonoption_flags[gg_optind] == '1'))
+#else
+# define NONOPTION_P (argv[gg_optind][0] != '-' || argv[gg_optind][1] == '\0')
+#endif
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+        moved back by the user (who may also have changed the arguments).  */
+      if (last_nonopt > gg_optind)
+       last_nonopt = gg_optind;
+      if (first_nonopt > gg_optind)
+       first_nonopt = gg_optind;
+
+      if (ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (first_nonopt != last_nonopt && last_nonopt != gg_optind)
+           exchange ((char **) argv);
+         else if (last_nonopt != gg_optind)
+           first_nonopt = gg_optind;
+
+         /* Skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (gg_optind < argc && NONOPTION_P)
+           gg_optind++;
+         last_nonopt = gg_optind;
+       }
+
+      /* The special ARGV-element `--' means premature end of options.
+        Skip it like a null option,
+        then exchange with previous non-options as if it were an option,
+        then skip everything else like a non-option.  */
+
+      if (gg_optind != argc && !strcmp (argv[gg_optind], "--"))
+       {
+         gg_optind++;
+
+         if (first_nonopt != last_nonopt && last_nonopt != gg_optind)
+           exchange ((char **) argv);
+         else if (first_nonopt == last_nonopt)
+           first_nonopt = gg_optind;
+         last_nonopt = argc;
+
+         gg_optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+        and back over any non-options that we skipped and permuted.  */
+
+      if (gg_optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (first_nonopt != last_nonopt)
+           gg_optind = first_nonopt;
+         return -1;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+        either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+       {
+         if (ordering == REQUIRE_ORDER)
+           return -1;
+         gg_optarg = argv[gg_optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+        Skip the initial punctuation.  */
+
+      nextchar = (argv[gg_optind] + 1
+                 + (longopts != NULL && argv[gg_optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[gg_optind][1] == '-'
+         || (long_only && (argv[gg_optind][2] || !my_index (optstring, argv[gg_optind][1])))))
+    {
+      char *nameend;
+      const struct gg_option *p;
+      const struct gg_option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+       /* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+        or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+       if (!strncmp (p->name, nextchar, nameend - nextchar))
+         {
+           if ((unsigned int) (nameend - nextchar)
+               == (unsigned int) strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else
+             /* Second or later nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (gg_opterr)
+           fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+                    argv[0], argv[gg_optind]);
+         nextchar += strlen (nextchar);
+         gg_optind++;
+         gg_optopt = 0;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         gg_optind++;
+         if (*nameend)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               gg_optarg = nameend + 1;
+             else
+               {
+                 if (gg_opterr)
+                   {
+                     if (argv[gg_optind - 1][1] == '-')
+                       /* --option */
+                       fprintf (stderr,
+                                _("%s: option `--%s' doesn't allow an argument\n"),
+                                argv[0], pfound->name);
+                     else
+                       /* +option or -option */
+                       fprintf (stderr,
+                                _("%s: option `%c%s' doesn't allow an argument\n"),
+                                argv[0], argv[gg_optind - 1][0], pfound->name);
+                   }
+
+                 nextchar += strlen (nextchar);
+
+                 gg_optopt = pfound->val;
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (gg_optind < argc)
+               gg_optarg = argv[gg_optind++];
+             else
+               {
+                 if (gg_opterr)
+                   fprintf (stderr,
+                          _("%s: option `%s' requires an argument\n"),
+                          argv[0], argv[gg_optind - 1]);
+                 nextchar += strlen (nextchar);
+                 gg_optopt = pfound->val;
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         nextchar += strlen (nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+        or the option starts with '--' or is not a valid short
+        option, then it's an error.
+        Otherwise interpret it as a short option.  */
+      if (!long_only || argv[gg_optind][1] == '-'
+         || my_index (optstring, *nextchar) == NULL)
+       {
+         if (gg_opterr)
+           {
+             if (argv[gg_optind][1] == '-')
+               /* --option */
+               fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+                        argv[0], nextchar);
+             else
+               /* +option or -option */
+               fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+                        argv[0], argv[gg_optind][0], nextchar);
+           }
+         nextchar = (char *) "";
+         gg_optind++;
+         gg_optopt = 0;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++gg_optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (gg_opterr)
+         {
+           if (posixly_correct)
+             /* 1003.2 specifies the format of this message.  */
+             fprintf (stderr, _("%s: illegal option -- %c\n"),
+                      argv[0], c);
+           else
+             fprintf (stderr, _("%s: invalid option -- %c\n"),
+                      argv[0], c);
+         }
+       gg_optopt = c;
+       return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+       char *nameend;
+       const struct gg_option *p;
+       const struct gg_option *pfound = NULL;
+       int exact = 0;
+       int ambig = 0;
+       int indfound = 0;
+       int option_index;
+
+       /* This is an option that requires an argument.  */
+       if (*nextchar != '\0')
+         {
+           gg_optarg = nextchar;
+           /* If we end this ARGV-element by taking the rest as an arg,
+              we must advance to the next element now.  */
+           gg_optind++;
+         }
+       else if (gg_optind == argc)
+         {
+           if (gg_opterr)
+             {
+               /* 1003.2 specifies the format of this message.  */
+               fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+                        argv[0], c);
+             }
+           gg_optopt = c;
+           if (optstring[0] == ':')
+             c = ':';
+           else
+             c = '?';
+           return c;
+         }
+       else
+         /* We already incremented `optind' once;
+            increment it again when taking next ARGV-elt as argument.  */
+         gg_optarg = argv[gg_optind++];
+
+       /* optarg is now the argument, see if it's in the
+          table of longopts.  */
+
+       for (nextchar = nameend = gg_optarg; *nameend && *nameend != '='; nameend++)
+         /* Do nothing.  */ ;
+
+       /* Test all long options for either exact match
+          or abbreviated matches.  */
+       for (p = longopts, option_index = 0; p->name; p++, option_index++)
+         if (!strncmp (p->name, nextchar, nameend - nextchar))
+           {
+             if ((unsigned int) (nameend - nextchar) == strlen (p->name))
+               {
+                 /* Exact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+                 exact = 1;
+                 break;
+               }
+             else if (pfound == NULL)
+               {
+                 /* First nonexact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+               }
+             else
+               /* Second or later nonexact match found.  */
+               ambig = 1;
+           }
+       if (ambig && !exact)
+         {
+           if (gg_opterr)
+             fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+                      argv[0], argv[gg_optind]);
+           nextchar += strlen (nextchar);
+           gg_optind++;
+           return '?';
+         }
+       if (pfound != NULL)
+         {
+           option_index = indfound;
+           if (*nameend)
+             {
+               /* Don't test has_arg with >, because some C compilers don't
+                  allow it to be used on enums.  */
+               if (pfound->has_arg)
+                 gg_optarg = nameend + 1;
+               else
+                 {
+                   if (gg_opterr)
+                     fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"),
+                              argv[0], pfound->name);
+
+                   nextchar += strlen (nextchar);
+                   return '?';
+                 }
+             }
+           else if (pfound->has_arg == 1)
+             {
+               if (gg_optind < argc)
+                 gg_optarg = argv[gg_optind++];
+               else
+                 {
+                   if (gg_opterr)
+                     fprintf (stderr,
+                              _("%s: option `%s' requires an argument\n"),
+                              argv[0], argv[gg_optind - 1]);
+                   nextchar += strlen (nextchar);
+                   return optstring[0] == ':' ? ':' : '?';
+                 }
+             }
+           nextchar += strlen (nextchar);
+           if (longind != NULL)
+             *longind = option_index;
+           if (pfound->flag)
+             {
+               *(pfound->flag) = pfound->val;
+               return 0;
+             }
+           return pfound->val;
+         }
+         nextchar = NULL;
+         return 'W';   /* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*nextchar != '\0')
+             {
+               gg_optarg = nextchar;
+               gg_optind++;
+             }
+           else
+             gg_optarg = NULL;
+           nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*nextchar != '\0')
+             {
+               gg_optarg = nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               gg_optind++;
+             }
+           else if (gg_optind == argc)
+             {
+               if (gg_opterr)
+                 {
+                   /* 1003.2 specifies the format of this message.  */
+                   fprintf (stderr,
+                          _("%s: option requires an argument -- %c\n"),
+                          argv[0], c);
+                 }
+               gg_optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             gg_optarg = argv[gg_optind++];
+           nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+gg_getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct gg_option *) 0,
+                          (int *) 0,
+                          0);
+}
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = gg_optind ? gg_optind : 1;
+
+      c = gg_getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", gg_optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (gg_optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (gg_optind < argc)
+       printf ("%s ", argv[gg_optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/utils/getopt1.c b/utils/getopt1.c
new file mode 100644 (file)
index 0000000..6d59e78
--- /dev/null
@@ -0,0 +1,186 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
+     Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+\f
+
+
+#include "gg-getopt.h"
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+/*#define ELIDE_CODE*/
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+gg_getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct gg_option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct gg_option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = gg_optind ? gg_optind : 1;
+      int option_index = 0;
+      static struct gg_option long_options[] =
+      {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = gg_getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (gg_optarg)
+           printf (" with arg %s", gg_optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", gg_optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value `%s'\n", gg_optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (gg_optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (gg_optind < argc)
+       printf ("%s ", argv[gg_optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/utils/gg-getopt.h b/utils/gg-getopt.h
new file mode 100644 (file)
index 0000000..53f9fc9
--- /dev/null
@@ -0,0 +1,170 @@
+/* Declarations for getopt.
+   Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 3 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+
+#ifndef GG_GETOPT_H
+
+#ifndef __need_getopt
+# define GG_GETOPT_H 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *gg_optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int gg_optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int gg_opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int gg_optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct gg_option
+{
+# if defined __STDC__ && __STDC__
+  const char *name;
+# else
+  char *name;
+# endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+# define no_argument           0
+# define required_argument     1
+# define optional_argument     2
+#endif /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.
+
+   Return the option character from OPTS just read.  Return -1 when
+   there are no more options.  For unrecognized options, or options
+   missing arguments, `optopt' is set to the option letter, and '?' is
+   returned.
+
+   The OPTS string is a list of characters which are recognized option
+   letters, optionally followed by colons, specifying that that letter
+   takes an argument, to be placed in `optarg'.
+
+   If a letter in OPTS is followed by two colons, its argument is
+   optional.  This behavior is specific to the GNU `getopt'.
+
+   The argument `--' causes premature termination of argument
+   scanning, explicitly telling `getopt' that there are no more
+   options.
+
+   If OPTS begins with `--', then non-option arguments are treated as
+   arguments to the option '\0'.  This behavior is specific to the GNU
+   `getopt'.  */
+
+#if defined __STDC__ && __STDC__
+# ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int gg_getopt (int argc, char *const *argv, const char *shortopts);
+# else /* not __GNU_LIBRARY__ */
+extern int gg_getopt (int argc, char *const *argv, const char *shortopts);
+# endif /* __GNU_LIBRARY__ */
+
+# ifndef __need_getopt
+extern int gg_getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct gg_option *longopts, int *longind);
+extern int gg_getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct gg_option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct gg_option *longopts, int *longind,
+                            int long_only);
+# endif
+#else /* not __STDC__ */
+extern int gg_getopt ();
+# ifndef __need_getopt
+extern int gg_getopt_long ();
+extern int gg_getopt_long_only ();
+
+extern int _getopt_internal ();
+# endif
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations.  */
+#undef __need_getopt
+
+#endif /* getopt.h */
diff --git a/utils/gg_utils.c b/utils/gg_utils.c
new file mode 100644 (file)
index 0000000..347ea76
--- /dev/null
@@ -0,0 +1,557 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#include "gg_utils.h"
+#include "random.h"
+
+#ifdef HAVE_GLIB_H
+#include <glib.h>
+#endif
+
+/* Avoid compiler warnings with unused parameters */
+#define UNUSED(x)  (void)x
+
+/* Define TERMINFO or ANSI_COLOR to enable coloring of pieces.
+ * This is normally done in config.h.
+ */
+
+/* enabling color */
+
+/* linux console :
+ *  0=black
+ *  1=red
+ *  2=green
+ *  3=yellow/brown
+ *  4=blue
+ *  5=magenta
+ *  6=cyan
+ *  7=white
+ */
+
+#ifdef TERMINFO
+
+#ifdef _AIX
+#define _TPARM_COMPAT
+#endif
+
+#if HAVE_CURSES_H
+#include <curses.h>
+#elif HAVE_NCURSES_CURSES_H
+#include <ncurses/curses.h>
+#else
+#endif
+
+#if HAVE_TERM_H
+#include <term.h>
+#elif HAVE_NCURSES_TERM_H
+#include <ncurses/term.h>
+#else
+#endif
+
+
+/* terminfo attributes */
+static char *setaf;            /* terminfo string to set color */
+static char *op;               /* terminfo string to reset colors */
+
+static int init = 0;
+
+#endif /* TERMINFO */
+
+/* for gg_cputime */
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#elif defined(WIN32)
+#include <windows.h>
+#endif
+
+void
+gg_init_color()
+{
+#ifdef TERMINFO
+
+/* compiler is set to make string literals  const char *
+ * But system header files dont prototype things correctly.
+ * These are equivalent to a non-const string literals
+ */
+
+  static char setaf_literal[] = "setaf";
+  static char op_literal[] = "op";
+  static char empty_literal[] = "";
+
+  if (init)
+    return;
+  
+  init = 1;
+
+  setupterm(NULL, 2, NULL);
+  setaf = tigetstr(setaf_literal);
+  if (!setaf)
+    setaf = empty_literal;
+  op = tigetstr(op_literal);
+  if (!op)
+    op = empty_literal;
+#endif /* TERMINFO */
+}
+
+
+
+#ifdef WIN32
+#ifdef VC
+#include <crtdbg.h>
+
+verifyW32(BOOL b)
+{
+  if (!b) {
+    _ASSERTE(0 && "Win32 Error");
+    fprintf(stderr, "Win32 Err: %ld\n", GetLastError());
+  }
+}
+
+#else
+/* mingw32 lacks crtdbg.h and _ASSERTE */
+verifyW32(BOOL b)
+{
+  if (!b) {
+    fprintf(stderr, "Win32 Err: %ld\n", GetLastError());
+  }
+}
+
+#endif
+
+#endif
+
+void 
+write_color_char_no_space(int c, int x)
+{
+#ifdef TERMINFO
+
+  fprintf(stderr, "%s%c", tparm(setaf, c, 0, 0, 0, 0, 0, 0, 0, 0), x);
+  fputs(tparm(op, 0, 0, 0, 0, 0, 0, 0, 0, 0), stderr);
+
+#elif defined(ANSI_COLOR)
+
+  fprintf(stderr, "\033[%dm%c\033[0m", 30+c, x);
+
+#elif defined(WIN32)
+  
+  static HANDLE hStdErr = 0;
+  DWORD iCharsWritten;
+  BOOL succeed32;
+  CONSOLE_SCREEN_BUFFER_INFO bufInfo;
+  if (!hStdErr) {
+    hStdErr = GetStdHandle(STD_ERROR_HANDLE);
+    if (hStdErr == INVALID_HANDLE_VALUE) {
+      fprintf(stderr, "Unable to open stderr.\n");
+    }
+  }
+
+  /* Red & Blue are switched from what MS-Windows wants:
+   *   FOREGROUND_BLUE      0x0001 // text color contains blue.
+   *   FOREGROUND_GREEN     0x0002 // text color contains green.
+   *   FOREGROUND_RED       0x0004 // text color contains red
+   * This magic switches the bits back:
+   */
+  c = (c & 1) * 4 + (c & 2) + (c & 4) / 4;
+  c += FOREGROUND_INTENSITY;
+  succeed32 = GetConsoleScreenBufferInfo(hStdErr, &bufInfo);
+  if (!succeed32) {  /* Probably redirecting output, just give plain text. */
+    fprintf(stderr, "%c", x);
+    return;
+  }
+  verifyW32(SetConsoleTextAttribute(hStdErr, (WORD) c));
+  verifyW32(WriteConsole(hStdErr, &x, 1, &iCharsWritten, 0));
+  verifyW32(SetConsoleTextAttribute(hStdErr, bufInfo.wAttributes));
+
+#else
+
+  fprintf(stderr, "%c", x);
+
+#endif
+}
+
+void
+write_color_string(int c, const char *str)
+{
+  while (*str)
+    write_color_char_no_space(c, *str++);
+}
+
+void
+write_color_char(int c, int x)
+{
+  fprintf(stderr, " ");
+  write_color_char_no_space(c, x);
+}
+
+/*
+ * A wrapper around vsnprintf.
+ */
+
+void
+gg_vsnprintf(char *dest, unsigned long len, const char *fmt, va_list args)
+{
+    
+#ifdef HAVE_VSNPRINTF
+  vsnprintf(dest, len, fmt, args);
+#elif HAVE_G_VSNPRINTF
+  g_vsnprintf(dest, len, fmt, args);
+#elif HAVE__VSNPRINTF
+  _vsnprintf(dest, len, fmt, args);
+#else
+  UNUSED(len);
+  vsprintf(dest, fmt, args);
+#endif
+
+}
+
+void
+gg_snprintf(char *dest, unsigned long len, const char *fmt, ...)
+{
+  va_list args;
+  va_start(args, fmt);
+  gg_vsnprintf(dest, len, fmt, args);
+  va_end(args);
+}
+
+/* Get the time of day, calling gettimeofday from sys/time.h
+ * if available, otherwise substituting a workaround for portability.
+ */
+
+double
+gg_gettimeofday(void)
+{
+  struct timeval tv;
+#ifdef HAVE_GETTIMEOFDAY
+  gettimeofday(&tv, NULL);
+#else
+  tv.tv_sec  = time(NULL);
+  tv.tv_usec = 0;
+#endif
+  return tv.tv_sec + 1.e-6 * tv.tv_usec;
+}
+
+const char *
+gg_version(void)
+{
+  return VERSION;
+}
+
+/* return cputime used in secs */
+
+double
+gg_cputime(void)
+{
+#if HAVE_SYS_TIMES_H && HAVE_TIMES && HAVE_UNISTD_H
+    struct tms t;
+    times(&t);
+    return (t.tms_utime + t.tms_stime + t.tms_cutime + t.tms_cstime)
+            / ((double) sysconf(_SC_CLK_TCK));
+#elif defined(WIN32)
+    FILETIME creationTime, exitTime, kernelTime, userTime;
+    ULARGE_INTEGER uKernelTime, uUserTime, uElapsedTime;
+    GetProcessTimes(GetCurrentProcess(), &creationTime, &exitTime,
+                    &kernelTime, &userTime);
+    uKernelTime.LowPart = kernelTime.dwLowDateTime;
+    uKernelTime.HighPart = kernelTime.dwHighDateTime;
+    uUserTime.LowPart = userTime.dwLowDateTime;
+    uUserTime.HighPart = userTime.dwHighDateTime;
+    uElapsedTime.QuadPart = uKernelTime.QuadPart + uUserTime.QuadPart;
+    /*_ASSERTE(0 && "Debug Times");*/
+    /* convert from multiples of 100nanosecs to seconds: */
+    return (signed __int64)(uElapsedTime.QuadPart) * 1.e-7;
+#else
+    static int warned = 0;
+    if (!warned) {
+      fprintf(stderr, "CPU timing unavailable - returning wall time.");
+      warned = 1;
+    }
+    /* return wall clock seconds */
+    return gg_gettimeofday();
+#endif
+}
+
+/* Before we sort floating point values (or just compare them) we
+ * may need to normalize them. This may sound cryptic but is
+ * required to avoid an obscure platform dependency.
+ *
+ * The underlying problem is that most fractional decimal numbers
+ * can't be represented exactly in a floating point number with base
+ * two. The error may be small but it is there. When such numbers
+ * are added or subtracted, the errors accumulate and even if the
+ * result (counting exactly) should be a number which can be
+ * represented exactly, this cannot be assumed to be the case.
+ *
+ * To give an example of this, the computation 0.3 + 0.05 - 0.35 may
+ * sum to 0, a small negative value, or a small positive value.
+ * Moreover, which case we encounter depends on the number of
+ * mantissa bits in the floating point type used and the exact
+ * details of the floating point arithmetic on the platform.
+ *
+ * In the context of sorting, assume that two values both should be
+ * 0.35, but one has been computed as 0.3 + 0.05 and the other
+ * directly assigned 0.35. Then it depends on the platform whether
+ * they compare as equal or one of them is larger than the other.
+ *
+ * This code normalizes the values to avoid this problem. It is
+ * assumed that all values encountered are integer multiples of a.
+ */
+float
+gg_normalize_float(float x, float a)
+{
+  return a * ((int) (0.5 + x / a));
+}
+
+int
+gg_normalize_float2int(float x, float a)
+{
+  return ((int) (0.5 + x / a));
+}
+
+/* A sorting algorithm, call-compatible with the libc qsort() function.
+ *
+ * The reason to prefer this to standard qsort() is that quicksort is
+ * an unstable sorting algorithm, i.e. the relative ordering of
+ * elements with the same comparison value may change. Exactly how the
+ * ordering changes depends on implementation specific details like
+ * the strategy for choosing the pivot element. Thus a list with
+ * "equal" values may be sorted differently between platforms, which
+ * potentially can lead to significant differences in the move
+ * generation.
+ *
+ * This is an implementation of the combsort algorithm.
+ *
+ * Testing shows that it is faster than the GNU libc qsort() function
+ * on small data sets and within a factor of two slower for large
+ * random data sets. Its performance does not degenerate for common
+ * special cases (i.e. sorted or reversed data) but it seems to be
+ * susceptible to O(N^2) behavior for repetitive data with specific
+ * cycle lengths.
+ *
+ * Like qsort() this algorithm is unstable, but since the same
+ * implementation (this one) is used on all platforms, the reordering
+ * of equal elements will be consistent.
+ */
+void
+gg_sort(void *base, size_t nel, size_t width,
+       int (*cmp)(const void *, const void *))
+{
+  int gap = nel;
+  int swap_made;
+  char *end = (char *) base + width * (nel - 1);
+  do {
+    char *a, *b;
+    swap_made = 0;
+    gap = (10 * gap + 3) / 13;
+    for (a = base, b = a + gap * width; b <= end; a += width, b += width) {
+      if (cmp((void *) a, (void *) b) > 0) {
+       char *c = a;
+       char *d = b;
+       size_t size = width;
+       while (size-- > 0) {
+         char tmp = *c;
+         *c++ = *d;
+         *d++ = tmp;
+       }
+       swap_made = 1;
+      }
+    }
+  } while (gap > 1 || swap_made);
+}
+
+
+/* Linearly interpolate f(x) from the data given in interpolation_data. */
+float
+gg_interpolate(struct interpolation_data *f, float x)
+{
+  int i;
+  float ratio;
+  float diff;
+  if (x < f->range_lowerbound)
+    return f->values[0];
+  else if (x > f->range_upperbound)
+    return f->values[f->sections];
+  else {
+    ratio = ((float) f->sections) * (x - f->range_lowerbound)
+              / (f->range_upperbound - f->range_lowerbound);
+    i = (int) ratio;
+    diff = ratio - ((float) i);
+    if (0)
+      fprintf(stderr, "Floating point Ratio: %f, integer: %d, diff %f",
+             ratio, i, diff);
+    return ((1 - diff) * f->values[i] + diff * f->values[i+1]);
+  }
+}
+
+
+/* This is the simplest function that returns appr. a when a is small,
+ * and approximately b when a is large.
+ */
+float
+soft_cap(float a, float b)
+{
+  return ((a * b) / (a + b));
+}
+
+
+/* Reorientation of point (i, j) into (*ri, *rj) */
+void
+rotate(int i, int j, int *ri, int *rj, int bs, int rot)
+{
+  int bs1;
+  assert(bs > 0);
+  assert(ri != NULL && rj != NULL);
+  assert(rot >= 0 && rot < 8);
+  /* PASS case */
+  if (i == -1 && j == -1) {
+    *ri = i;
+    *rj = j;
+    return;
+  }
+
+  assert(i >= 0 && i < bs);
+  assert(j >= 0 && j < bs);
+
+  bs1 = bs - 1;
+  if (rot == 0) {
+    /* identity map */
+    *ri = i;
+    *rj = j;
+  }
+  else if (rot == 1) {
+    /* rotation over 90 degrees */
+    *ri = bs1 - j;
+    *rj = i;
+  }
+  else if (rot == 2) {
+    /* rotation over 180 degrees */
+    *ri = bs1 - i;
+    *rj = bs1 - j;
+  }
+  else if (rot == 3) {
+    /* rotation over 270 degrees */
+    *ri = j;
+    *rj = bs1 - i;
+  }
+  else if (rot == 4) {
+    /* flip along diagonal */
+    *ri = j;
+    *rj = i;
+  }
+  else if (rot == 5) {
+    /* flip */
+    *ri = bs1 - i;
+    *rj = j;
+  }
+  else if (rot == 6) {
+    /* flip along diagonal */
+    *ri = bs1 - j;
+    *rj = bs1 - i;
+  }
+  else if (rot == 7) {
+    /* flip */
+    *ri = i;
+    *rj = bs1 - j;
+  }
+}
+
+/* inverse reorientation of reorientation rot */
+void
+inv_rotate(int i, int j, int *ri, int *rj, int bs, int rot)
+{
+  /* every reorientation is it's own inverse except rotations
+     over 90 and 270 degrees */
+  if (rot == 1)
+    rotate(i, j, ri, rj, bs, 3);
+  else if (rot == 3)
+    rotate(i, j, ri, rj, bs, 1);
+  else
+    rotate(i, j, ri, rj, bs, rot);
+}
+
+
+/* Intermediate layer to random.c. gg_srand() should only be called via the
+ * functions below.
+ */
+/* Private variable remembering the random seed. */
+static unsigned int random_seed;
+
+unsigned int
+get_random_seed()
+{
+  return random_seed;
+}
+
+void
+set_random_seed(unsigned int seed)
+{
+  random_seed = seed;
+  gg_srand(seed);
+}
+
+/* Update the random seed. This should be called at the start of each
+ * new game.
+ * We reset the random seed before obtaining a new one, to make the
+ * next random seed depend deterministically on the old one.
+ */
+void
+update_random_seed(void)
+{
+  gg_srand(random_seed);
+  random_seed = gg_rand();
+  /* Since random seed 0 has a special interpretation when given as
+   * command line argument with the -r option, we make sure to avoid
+   * it.
+   */
+  if (random_seed == 0)
+    random_seed = 1;
+  gg_srand(random_seed);
+}
+
+
+/* Restart the pseudo-random sequence with the initialization given
+ * by the random seed. Should be called at each move.
+ */
+void
+reuse_random_seed()
+{
+  gg_srand(random_seed);
+}
+
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/utils/gg_utils.h b/utils/gg_utils.h
new file mode 100644 (file)
index 0000000..fcaf5b4
--- /dev/null
@@ -0,0 +1,104 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _GG_UTILS_H_
+#define _GG_UTILS_H_
+
+#include <stdarg.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#ifdef __MINGW32__
+#include <windows.h>
+#include <winsock.h>
+#include <io.h>
+#endif
+
+#ifdef HAVE_WINSOCK_IO_H
+#include <winsock.h>
+#include <io.h>
+#endif
+
+void gg_init_color(void);
+void write_color_char(int c, int x);
+void write_color_string(int c, const char *str);
+
+void gg_vsnprintf(char *dest, unsigned long len, const char *fmt,
+                 va_list args);
+void gg_snprintf(char *dest, unsigned long len, const char *fmt, ...);
+
+double gg_gettimeofday(void);
+double gg_cputime(void);
+
+float gg_normalize_float(float x, float a);
+int gg_normalize_float2int(float x, float a);
+void gg_sort(void *base, size_t nel, size_t width,
+            int (*compar)(const void *, const void *));
+
+#define MAX_INTERPOLATION_STEPS 20
+struct interpolation_data
+{
+  int sections;
+  float range_lowerbound;
+  float range_upperbound;
+  float values[MAX_INTERPOLATION_STEPS + 1];
+};
+
+float gg_interpolate(struct interpolation_data *f, float x);
+float soft_cap(float a, float b);
+
+const char *gg_version(void);
+
+/* prototypes for basic reorientation functions */
+
+void rotate(int i, int j, int *ri, int *rj, int bs, int rot);
+void inv_rotate(int i, int j, int *ri, int *rj, int bs, int rot);
+
+void update_random_seed(void);
+void set_random_seed(unsigned int seed);
+unsigned int get_random_seed(void);
+void reuse_random_seed(void);
+
+
+#endif /* _GG_UTILS_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/utils/random.c b/utils/random.c
new file mode 100644 (file)
index 0000000..4ce6988
--- /dev/null
@@ -0,0 +1,201 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <limits.h>
+#include <assert.h>
+
+#include "random.h"
+
+/* This is an implementation of the TGFSR (twisted generalized
+ * feedback shift register) random number generator TT800, which was
+ * published in:
+ *
+ * Matsumoto, M. and Kurita, Y.: Twisted GFSR generators II.
+ * ACM Transactions on Modeling and Computer Simulations,
+ * Vol 4, No. 3, July 1994, pp 254--266
+ *
+ * The generator produces a pseudo-random sequence of 32 bit integers
+ * with period 2^800 - 1 and is reported to have excellent
+ * equidistribution properties, as well as being fast.
+ */
+
+
+/* Algorithm parameters. */
+#define N 25
+static const int m = 7;
+static const int s = 7;
+static const int t = 15;
+static const unsigned int a = 0x8ebfd028U;
+static const unsigned int b = 0x2b5b2500U;
+static const unsigned int c = 0xdb8b0000U;
+
+
+/* Global state for the random number generator. */
+static unsigned int x[N];
+static int k;
+
+
+/* Set when properly seeded. */
+static int rand_initialized = 0;
+
+/* We use this to detect whether unsigned ints are bigger than 32
+ * bits. If they are we need to clear higher order bits, otherwise we
+ * can optimize by not doing the masking.
+ */
+#define BIG_UINT (UINT_MAX > 0xffffffffU)
+
+
+/* Iterate the TGFSR once to get a new state which can be used to
+ * produce another 25 random numbers.
+ */
+
+static void
+iterate_tgfsr(void)
+{
+  int i;
+  for (i = 0; i < N - m; i++)
+    x[i] = x[i + m]   ^  (x[i] >> 1)  ^  ((x[i] & 1) ? a : 0);
+  for (; i < N; i++)
+    x[i] = x[i + m - N] ^  (x[i] >> 1)  ^  ((x[i] & 1) ? a : 0);
+}
+
+
+/* Produce a random number from the next word of the internal state.
+ */
+
+static unsigned int
+next_rand(void)
+{
+  int y;
+  if (!rand_initialized) {
+    assert(rand_initialized); /* Abort. */
+    gg_srand(1);              /* Initialize silently if assertions disabled. */
+  }
+  if (++k == N) {
+    iterate_tgfsr();
+    k = 0;
+  }
+  y = x[k] ^ ((x[k] << s) & b);
+  y ^= ((y << t) & c);
+#if BIG_UINT
+  y &= 0xffffffffU;
+#endif
+  return y;
+}
+
+
+/* Seed the random number generator. The first word of the internal
+ * state is set by the (lower) 32 bits of seed. The remaining 24 words
+ * are generated from the first one by a linear congruential pseudo
+ * random generator.
+ *
+ * FIXME: The constants in this generator has not been checked, but
+ * since they only are used to produce a very short sequence, which in
+ * turn only is a seed to a stronger generator, it probably doesn't
+ * matter much.
+ */
+
+void
+gg_srand(unsigned int seed)
+{
+  int i;
+  for (i = 0; i < N; i++) {
+#if BIG_UINT
+    seed &= 0xffffffffU;
+#endif
+    x[i] = seed;
+    seed *= 1313;
+    seed += 88897;
+  }
+  k = N-1; /* Force an immediate iteration of the TGFSR. */
+  rand_initialized = 1;
+}
+
+
+/* Obtain one random integer value in the interval [0, 2^31-1].
+ */
+
+int
+gg_rand(void)
+{
+  return (int) (next_rand() & 0x7fffffff);
+}
+
+
+/* Obtain one random integer value in the interval [0, 2^32-1].
+ */
+
+unsigned int
+gg_urand(void)
+{
+  return next_rand();
+}
+
+
+/* Obtain one random floating point value in the half open interval
+ * [0.0, 1.0).
+ *
+ * If the value is converted to a floating point type with less than
+ * 32 bits mantissa (or if the double type should happen to be
+ * unusually short), the value 1.0 may be attained.
+ */
+
+double
+gg_drand(void)
+{
+  return next_rand() * 2.328306436538696e-10;
+}
+
+
+/* Retrieve the internal state of the random generator.
+ */
+
+void
+gg_get_rand_state(struct gg_rand_state *state)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    state->x[i] = x[i];
+  state->k = k;
+}
+
+
+/* Set the internal state of the random number generator.
+ */
+
+void
+gg_set_rand_state(struct gg_rand_state *state)
+{
+  int i;
+  for (i = 0; i < N; i++)
+    x[i] = state->x[i];
+  k = state->k;
+}
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/utils/random.h b/utils/random.h
new file mode 100644 (file)
index 0000000..b00cc9d
--- /dev/null
@@ -0,0 +1,87 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _RANDOM_H_
+#define _RANDOM_H_
+
+/* This random number generator produces 32 bit unsigned integers, no
+ * more, no less. Internally in the algorithm and for storing the
+ * state we need a type that is at least 32 bits wide. A longer type
+ * doesn't hurt but means a waste of bits.
+ *
+ * ISO C guarantees that an unsigned long always is at least 32 bits.
+ * It is not uncommon, however, that it is longer. An unsigned int is
+ * not guaranteed to be more than 16 bits wide, but on modern
+ * platforms we can be certain that this type too is 32 bits (or
+ * more). Also the GNU Coding Standards explicitly state that the
+ * possibility of ints shorter than 32 bits should be ignored.
+ *
+ * We could make a typedef here to choose exactly which type to use.
+ * In order to avoid various complications in the interface to the
+ * random number generator, however, we prefer to consistently use
+ * unsigned int internally and we assume this type to be at least 32
+ * bits wide.
+ */
+
+/* Internal state of the random number generator. */
+struct gg_rand_state {
+  unsigned int x[25];   /* Internal state. */
+  int k;                /* Word counter. */
+};
+
+/* Seed the random number generator. If an unsigned int is larger than
+ * 32 bits, only the 32 least significant bits are used for seeding.
+ */
+void gg_srand(unsigned int seed);
+
+/* Obtain one random integer value in the interval [0, 2^31-1]. */
+int gg_rand(void);
+
+/* Obtain one random integer value in the interval [0, 2^32-1]. */
+unsigned int gg_urand(void);
+
+/* Obtain one random floating point value in the half open interval
+ * [0.0, 1.0).
+ *
+ * If the value is converted to a floating point type with less than
+ * 32 bits mantissa (or if the double type should happen to be
+ * unusually short), the value 1.0 may be attained.
+ */
+double gg_drand(void);
+
+/* Retrieve the internal state of the random generator. */
+void gg_get_rand_state(struct gg_rand_state *state);
+
+/* Set the internal state of the random number generator. */
+void gg_set_rand_state(struct gg_rand_state *state);
+
+
+#endif /* _RANDOM_H_ */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/utils/utils.dsp b/utils/utils.dsp
new file mode 100644 (file)
index 0000000..65c2b9a
--- /dev/null
@@ -0,0 +1,159 @@
+# Microsoft Developer Studio Project File - Name="utils" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=utils - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "utils.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "utils.mak" CFG="utils - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "utils - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "utils - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "utils - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /GX /Zi /O2 /I "." /I ".." /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /Fd"Release/utils" /FD /c\r
+# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
+# ADD RSC /l 0x809 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "utils - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /W2 /Gm /GX /ZI /Od /I "." /I ".." /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FR /Fd"Debug/utils" /FD /GZ /c\r
+# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
+# ADD RSC /l 0x809 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "utils - Win32 Release"\r
+# Name "utils - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\config.vc\r
+\r
+!IF  "$(CFG)" == "utils - Win32 Release"\r
+\r
+# Begin Custom Build\r
+InputPath=..\config.vc\r
+\r
+"..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       copy ..\config.vc ..\config.h\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "utils - Win32 Debug"\r
+\r
+# Begin Custom Build\r
+InputPath=..\config.vc\r
+\r
+"..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       copy ..\config.vc ..\config.h\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\getopt.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\getopt1.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\gg_utils.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\random.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\winsocket.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=..\config.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gg-getopt.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\gg_utils.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\random.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\winsocket.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/utils/winsocket.c b/utils/winsocket.c
new file mode 100644 (file)
index 0000000..daf0a04
--- /dev/null
@@ -0,0 +1,237 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Workaround M$ Windows C library deficiency: it cannot handle
+ * sockets as stdio streams.  So we do this ourselves, more or less.
+ *
+ * Call winsocket_activate(...) with socket handle to use.  After this
+ * fake stream NULL will work over the socket, while other streams
+ * will (hopefully) keep working as usual.
+ */
+
+#define WINSOCKET_H_INTERNAL_INCLUSION
+
+#include "winsocket.h"
+
+
+#if USE_WINDOWS_SOCKET_CLUDGE
+
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <winsock.h>
+
+
+static int socket_handle      = 0;
+static int socket_end_of_file = 0;
+
+
+void
+winsocket_activate(int _socket_handle)
+{
+  assert(socket_handle == 0);
+  socket_handle = _socket_handle;
+}
+
+
+/* Miscellaneous functions. */
+
+void
+winsocket_setbuf(FILE *file, char *buffer)
+{
+  if (file != NULL)
+    setbuf(file, buffer);
+  else
+    assert(socket_handle != 0);
+}
+
+
+int
+winsocket_fflush(FILE *file)
+{
+  if (file != NULL)
+    return fflush(file);
+  else {
+    assert(socket_handle != 0);
+    return 0;
+  }
+}
+
+
+int
+winsocket_feof(FILE *file)
+{
+  if (file != NULL)
+    return feof(file);
+  else {
+    assert(socket_handle != 0);
+    return socket_end_of_file;
+  }
+}
+
+
+int
+winsocket_fclose(FILE *file)
+{
+  if (file != NULL)
+    return fclose(file);
+  else {
+    assert(socket_handle != 0);
+    return 0;
+  }
+}
+
+
+/* Input functions. */
+
+size_t
+winsocket_fread(void *buffer, size_t size, size_t num_items, FILE *file)
+{
+  if (file != NULL)
+    return fread(buffer, size, num_items, file);
+  else {
+    assert(socket_handle != 0);
+    if (recv(socket_handle, (char *) buffer, size * num_items, 0)
+       == size * num_items)
+      return num_items;
+    else {
+      socket_end_of_file = 1;
+      return EOF;
+    }
+  }
+}
+
+
+char *
+winsocket_fgets(char *buffer, int size, FILE *file)
+{
+  if (file != NULL)
+    return fgets(buffer, size, file);
+  else {
+    /* FIXME: Optimize if reading char-by-char is too slow. */
+    int stored_length;
+
+    for (stored_length = 0; stored_length < size - 1; stored_length) {
+      if (recv(socket_handle, buffer + stored_length, 1, 0) != 1) {
+       socket_end_of_file = 1;
+       break;
+      }
+
+      if (buffer[stored_length++] == '\n')
+       break;
+    }
+
+    if (stored_length == 0)
+      return NULL;
+
+    buffer[stored_length + 1] = 0;
+    return buffer;
+  }
+}
+
+
+/* Output functions. */
+
+size_t
+winsocket_fwrite(const void *buffer, size_t size, size_t num_items,
+                FILE *file)
+{
+  if (file != NULL)
+    return fwrite(buffer, size, num_items, file);
+  else {
+    assert(socket_handle != 0);
+    return ((send(socket_handle, (const char *) buffer, size * num_items, 0)
+            == size * num_items)
+           ? num_items : EOF);
+  }
+}
+
+
+int
+winsocket_fputc(int character, FILE *file)
+{
+  if (file != NULL)
+    return fputc(character, file);
+  else {
+    assert(socket_handle != 0);
+    return (send(socket_handle, (const char *) &character, 1, 0) == 1
+           ? character : EOF);
+  }
+}
+
+
+int
+winsocket_fputs(const char *string, FILE *file)
+{
+  if (file != NULL)
+    return fputs(string, file);
+  else {
+    int length = strlen(string);
+
+    assert(socket_handle != 0);
+    return send(socket_handle, string, length, 0) == length ? length : EOF;
+  }
+}
+
+
+int
+winsocket_fprintf(FILE *file, const char *format_string, ...)
+{
+  va_list arguments;
+  int result;
+
+  va_start(arguments, format_string);
+  result = winsocket_vfprintf(file, format_string, arguments);
+  va_end(arguments);
+
+  return result;
+}
+
+
+int
+winsocket_vfprintf(FILE *file, const char *format_string, va_list arguments)
+{
+  if (file != NULL)
+    return vfprintf(file, format_string, arguments);
+  else {
+    char buffer[0x1000];
+    int length = _vsnprintf(buffer, sizeof buffer, format_string, arguments);
+
+    assert(socket_handle != 0);
+    return send(socket_handle, buffer, length, 0) == length ? length : -1;
+  }
+}
+
+
+#endif /* USE_WINDOWS_SOCKET_CLUDGE */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/utils/winsocket.h b/utils/winsocket.h
new file mode 100644 (file)
index 0000000..7bba075
--- /dev/null
@@ -0,0 +1,105 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
+ * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
+ * http://www.gnu.org/software/gnugo/ for more information.          *
+ *                                                                   *
+ * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
+ * 2008 and 2009 by the Free Software Foundation.                    *
+ *                                                                   *
+ * This program is free software; you can redistribute it and/or     *
+ * modify it under the terms of the GNU General Public License as    *
+ * published by the Free Software Foundation - version 3 or          *
+ * (at your option) any later version.                               *
+ *                                                                   *
+ * This program is distributed in the hope that it will be useful,   *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
+ * GNU General Public License in file COPYING for more details.      *
+ *                                                                   *
+ * You should have received a copy of the GNU General Public         *
+ * License along with this program; if not, write to the Free        *
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
+ * Boston, MA 02111, USA.                                            *
+\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#ifndef GNU_GO_WINSOCKET_H
+#define GNU_GO_WINSOCKET_H
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#define USE_WINDOWS_SOCKET_CLUDGE              \
+  ((defined(_WIN32) || defined(_WIN32_WCE))    \
+   && defined(ENABLE_SOCKET_SUPPORT))
+
+
+#if USE_WINDOWS_SOCKET_CLUDGE
+
+
+#include <stdarg.h>
+#include <stdio.h>
+
+
+#ifndef WINSOCKET_H_INTERNAL_INCLUSION
+
+/* (sic.) Teh cludge. */
+
+/* At least in some versions of `stdio.h' on Windows, feof() is a
+ * macro, not a function.
+ */
+#ifdef feof
+#undef feof
+#endif
+
+#define setbuf         winsocket_setbuf
+#define fflush         winsocket_fflush
+#define feof           winsocket_feof
+#define fclose         winsocket_fclose
+
+#define fread          winsocket_fread
+#define fgets          winsocket_fgets
+
+#define fwrite         winsocket_fwrite
+#define fputc          winsocket_fputc
+#define fputs          winsocket_fputs
+#define fprintf                winsocket_fprintf
+#define vfprintf       winsocket_vfprintf
+
+#endif /* WINSOCKET_H_INTERNAL_INCLUSION */
+
+
+void           winsocket_activate(int _socket_handle);
+
+void           winsocket_setbuf(FILE *file, char *buffer);
+int            winsocket_fflush(FILE *file);
+int            winsocket_feof(FILE *file);
+int            winsocket_fclose(FILE *file);
+
+size_t         winsocket_fread(void *buffer,
+                               size_t size, size_t num_items, FILE *file);
+char *         winsocket_fgets(char *buffer, int size, FILE *file);
+
+size_t         winsocket_fwrite(const void *buffer,
+                                size_t size, size_t num_items, FILE *file);
+int            winsocket_fputc(int character, FILE *file);
+int            winsocket_fputs(const char *string, FILE *file);
+int            winsocket_fprintf(FILE *file, const char *format_string, ...);
+int            winsocket_vfprintf(FILE *file, const char *format_string,
+                                  va_list arguments);
+
+
+#endif /* USE_WINDOWS_SOCKET_CLUDGE */
+
+
+#endif /* GNU_GO_WINSOCKET_H */
+
+
+/*
+ * Local Variables:
+ * tab-width: 8
+ * c-basic-offset: 2
+ * End:
+ */